This commit is contained in:
Administrator
2025-12-24 13:51:20 +08:00
commit b891d2369b
79 changed files with 4244 additions and 0 deletions

5
.gitignore vendored Normal file
View File

@@ -0,0 +1,5 @@
.idea
.git
.log
.venv
__pycache__

0
User/__init__.py Normal file
View File

3
User/admin.py Normal file
View File

@@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

6
User/apps.py Normal file
View File

@@ -0,0 +1,6 @@
from django.apps import AppConfig
class UserConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'User'

View File

@@ -0,0 +1,37 @@
# Generated by Django 4.2.25 on 2025-12-06 16:21
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='User',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('username', models.CharField(max_length=100, unique=True)),
('account', models.CharField(max_length=100)),
('password', models.CharField(max_length=100)),
('ethnicity', models.CharField(max_length=100)),
('card', models.CharField(max_length=100)),
('mobilePhone', models.CharField(max_length=100)),
('department', models.CharField(max_length=100)),
('position', models.CharField(max_length=100)),
('team', models.CharField(max_length=100)),
('Dateofjoining', models.DateField()),
('Confirmationtime', models.DateField()),
('Practicingcertificatetime', models.DateField()),
('Dateofdeparture', models.DateField()),
('AcademicResume', models.TextField()),
('academic', models.TextField()),
('contract', models.TextField()),
('ApplicationForm', models.TextField()),
],
),
]

View File

@@ -0,0 +1,32 @@
# Generated by Django 4.2.25 on 2025-12-07 06:10
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('User', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='Approval',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=100)),
('content', models.TextField()),
('times', models.DateField()),
('completeTiem', models.DateField()),
('personincharge', models.CharField(max_length=100)),
('state', models.CharField(max_length=100)),
('type', models.CharField(max_length=100)),
],
),
migrations.AddField(
model_name='user',
name='salary',
field=models.CharField(default='', max_length=100),
preserve_default=False,
),
]

View File

@@ -0,0 +1,19 @@
# Generated by Django 4.2.25 on 2025-12-07 06:34
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('User', '0002_approval_user_salary'),
]
operations = [
migrations.AddField(
model_name='user',
name='state',
field=models.CharField(default='', max_length=100),
preserve_default=False,
),
]

View File

@@ -0,0 +1,28 @@
# Generated by Django 4.2.25 on 2025-12-07 07:03
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('User', '0003_user_state'),
]
operations = [
migrations.AlterField(
model_name='user',
name='Confirmationtime',
field=models.DateField(blank=True, default=None, null=True),
),
migrations.AlterField(
model_name='user',
name='Dateofdeparture',
field=models.DateField(blank=True, default=None, null=True),
),
migrations.AlterField(
model_name='user',
name='Practicingcertificatetime',
field=models.DateField(blank=True, default=None, null=True),
),
]

View File

@@ -0,0 +1,19 @@
# Generated by Django 4.2.25 on 2025-12-07 12:57
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('User', '0004_alter_user_confirmationtime_and_more'),
]
operations = [
migrations.AddField(
model_name='user',
name='token',
field=models.CharField(default='', max_length=100),
preserve_default=False,
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.25 on 2025-12-07 15:53
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('User', '0005_user_token'),
]
operations = [
migrations.AlterField(
model_name='user',
name='salary',
field=models.CharField(blank=True, default=None, max_length=100, null=True),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.25 on 2025-12-08 14:19
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('User', '0006_alter_user_salary'),
]
operations = [
migrations.AlterField(
model_name='user',
name='token',
field=models.TextField(),
),
]

View File

@@ -0,0 +1,20 @@
# Generated by Django 4.2.25 on 2025-12-08 16:07
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('User', '0007_alter_user_token'),
]
operations = [
migrations.CreateModel(
name='Department',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('username', models.CharField(max_length=100)),
],
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.25 on 2025-12-08 17:45
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('User', '0008_department'),
]
operations = [
migrations.AlterField(
model_name='approval',
name='completeTiem',
field=models.DateField(blank=True, default=None, null=True),
),
]

View File

@@ -0,0 +1,19 @@
# Generated by Django 4.2.25 on 2025-12-09 16:13
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('User', '0009_alter_approval_completetiem'),
]
operations = [
migrations.AddField(
model_name='approval',
name='user_id',
field=models.CharField(default='', max_length=100),
preserve_default=False,
),
]

View File

@@ -0,0 +1,26 @@
# Generated by Django 4.2.25 on 2025-12-22 02:40
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('business', '0020_role'),
('User', '0010_approval_user_id'),
]
operations = [
migrations.AddField(
model_name='user',
name='role',
field=models.ForeignKey(default='', on_delete=django.db.models.deletion.CASCADE, to='business.role'),
preserve_default=False,
),
migrations.AlterField(
model_name='user',
name='department',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='User.department'),
),
]

View File

@@ -0,0 +1,32 @@
# Generated by Django 4.2.25 on 2025-12-23 03:07
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('business', '0023_permission_parent'),
('User', '0011_user_role_alter_user_department'),
]
operations = [
migrations.RemoveField(
model_name='user',
name='department',
),
migrations.RemoveField(
model_name='user',
name='role',
),
migrations.AddField(
model_name='user',
name='department',
field=models.ManyToManyField(to='User.department'),
),
migrations.AddField(
model_name='user',
name='role',
field=models.ManyToManyField(to='business.role'),
),
]

View File

40
User/models.py Normal file
View File

@@ -0,0 +1,40 @@
from django.db import models
from business.models import role
# Create your models here.
class Department(models.Model):
username = models.CharField(max_length=100) # 部门名称
class User(models.Model):
role = models.ManyToManyField(role)
department =models.ManyToManyField(Department) # 归属部门
username = models.CharField(max_length=100, unique=True) # 姓名
account = models.CharField(max_length=100) # 账号
password = models.CharField(max_length=100) # 密码
ethnicity = models.CharField(max_length=100) # 名族
card = models.CharField(max_length=100) # 身份证
mobilePhone = models.CharField(max_length=100) # 手机号
position = models.CharField(max_length=100) # 岗位
team = models.CharField(max_length=100) # 所属团队
Dateofjoining = models.DateField() # 入职时间
Confirmationtime = models.DateField(null=True, blank=True, default=None) # 转正时间
Practicingcertificatetime = models.DateField(null=True, blank=True, default=None) # 执业证时间
Dateofdeparture = models.DateField(null=True, blank=True, default=None) # 离职时间
AcademicResume = models.TextField() # 学业简历
academic = models.TextField() # 学历
contract = models.TextField() # 合同
ApplicationForm = models.TextField() # 入职申请表
salary = models.CharField(max_length=100,null=True, blank=True, default=None) # 工资
state = models.CharField(max_length=100) # 状态
token = models.TextField()
class Approval(models.Model):
title = models.CharField(max_length=100)
content = models.TextField() # 内容
times = models.DateField() # 提交时间
completeTiem = models.DateField(null=True, blank=True, default=None) # 完成时间
personincharge = models.CharField(max_length=100) # 负责人
state = models.CharField(max_length=100) # 状态
type = models.CharField(max_length=100) # 类别
user_id = models.CharField(max_length=100) # 事件id

3
User/tests.py Normal file
View File

@@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

16
User/urls.py Normal file
View File

@@ -0,0 +1,16 @@
from django.urls import path
from .views import CreateUserView,LoginView,EditorialStaffView,PersonnelDetailsView,DepartmentView,PersonnelListView,AddDepartment,DeleteDepartment,Personlist,roxyExhibition,approvalProcessing,personneldisplay
urlpatterns = [
path('create-user',CreateUserView.as_view(),name='create-user'),
path('login',LoginView.as_view(),name='login'),
path('editorial-staff',EditorialStaffView.as_view(),name='editorial-staff'),
path('get_info',PersonnelDetailsView.as_view(),name='personnel-details'),
path('department',DepartmentView.as_view(),name='department'),
path('personnel-list',PersonnelListView.as_view(),name='personnel-list'),
path('add_department',AddDepartment.as_view(),name='add_department'),
path('delete_department',DeleteDepartment.as_view(),name='delete_department'),
path('personlist',Personlist.as_view(),name='Personlist'),
path('roxyexhibition',roxyExhibition.as_view(),name='roxyExhibition'),
path('approval_processing',approvalProcessing.as_view(),name='approval_processing'),
path('personneldisplay',personneldisplay.as_view(),name='personneldisplay'),
]

564
User/views.py Normal file
View File

@@ -0,0 +1,564 @@
from django.contrib.auth.models import Permission
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
import json
import ast
from .models import User,Approval,Department
from business.models import permission
from finance.models import Income,Accounts,Payment,Reimbursement,BonusChange
from finance.models import Invoice
from business.models import ProjectRegistration,Case,SealApplication
import datetime
from utility.utility import flies
from django.contrib.sessions.backends.db import SessionStore
from django.db.models import Count, Q
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from collections import defaultdict
class CreateUserView(APIView):
def post(self, request, *args, **kwargs):
"""人事管理-人员添加"""
role = request.data.get('role')
username = request.data.get('username') # 姓名
account = request.data.get('account') # 账号
password = request.data.get('password') # 密码
nation = request.data.get('nation') # 民族
IdCard = request.data.get('IdCard') #身份证
department = request.data.get('department') # 归属部门
mobilePhone = request.data.get('mobilePhone') # 手机号
position = request.data.get('position') # 岗位
team = request.data.get('team') # 所属团队
Dateofjoining = request.data.get('Dateofjoining') # 入职时间
Confirmationtime = request.data.get('Confirmationtime') # 转正时间
Practicingcertificatetime = request.data.get('Practicingcertificatetime') # 执业证时间
AcademicResume = request.FILES.getlist('AcademicResume') # 学业简历
academic = request.data.get('academic') # 学历
contract = request.FILES.getlist('contract') # 合同
ApplicationForm =request.FILES.getlist('ApplicationForm') # 入职申请表
salary = request.data.get('salary') # 工资标准
if not all([username, account, password, IdCard, department, position,nation,mobilePhone,team,Dateofjoining,academic,contract]):
return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
AcademicResume_url = flies(AcademicResume)
ApplicationForm_url = flies(ApplicationForm )
contract_url = flies(contract)
Dateofjoining = datetime.datetime.strptime(Dateofjoining, "%Y-%m-%d")
if Confirmationtime:
Confirmationtime = datetime.datetime.strptime(Confirmationtime, "%Y-%m-%d")
else:
Confirmationtime = None
if Practicingcertificatetime:
Practicingcertificatetime = datetime.datetime.strptime(Practicingcertificatetime, "%Y-%m-%d")
else:
Practicingcertificatetime = None
role_list = ast.literal_eval(role)
department_id = ast.literal_eval(department)
user = User.objects.create(
username=username,
account=account,
password=password,
ethnicity=nation,
card=IdCard,
mobilePhone=mobilePhone,
position=position,
team=team,
Dateofjoining=Dateofjoining,
Confirmationtime=Confirmationtime,
Practicingcertificatetime=Practicingcertificatetime,
AcademicResume=json.dumps(AcademicResume_url),
academic=academic,
contract=json.dumps(contract_url),
ApplicationForm=json.dumps(ApplicationForm_url),
state="待登记",
salary=salary
)
user.role.add(*role_list)
user.department.add(*department_id)
return Response({'message': '添加人员成功', 'code': 0}, status=status.HTTP_200_OK)
class EditorialStaffView(APIView):
def post(self, request, *args, **kwargs):
"""修改人员信息"""
id = request.data.get('id')
username = request.data.get('username') # 姓名
account = request.data.get('account') # 账号
password = request.data.get('password') # 密码
nation = request.data.get('nation') # 民族
IdCard = request.data.get('IdCard') # 身份证
department = request.data.get('department') # 归属部门
mobilePhone = request.data.get('mobilePhone') # 手机号
position = request.data.get('position') # 岗位
team = request.data.get('team') # 所属团队
Dateofjoining = request.data.get('Dateofjoining') # 入职时间
Confirmationtime = request.data.get('Confirmationtime') # 转正时间
Practicingcertificatetime = request.data.get('Practicingcertificatetime') # 执业证时间
AcademicResume = request.FILES.getlist('AcademicResume') # 学业简历
academic = request.data.get('academic') # 学历
contract = request.FILES.getlist('contract') # 合同
ApplicationForm = request.FILES.getlist('ApplicationForm') # 入职申请表
salary = request.data.get('salary') # 工资标准
print([username, account, password, IdCard, department, position, nation, mobilePhone, team, Dateofjoining,
academic])
if not all([username, account, password, IdCard, department, position, nation, mobilePhone, team, Dateofjoining,
academic]):
return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
user = User.objects.get(id=id)
if AcademicResume:
AcademicResume_url = flies(AcademicResume)
user.AcademicResume = json.dumps(AcademicResume_url)
if ApplicationForm:
ApplicationForm_url = flies(ApplicationForm)
user.ApplicationForm = json.dumps(ApplicationForm_url)
if contract:
contract_url = flies(contract)
user.contract = json.dumps(contract_url)
def parse_date_str(date_str):
if date_str and date_str != "0000-00-00":
return datetime.datetime.strptime(date_str, "%Y-%m-%d").strftime('%Y-%m-%d')
return "" # 设置默认日期
Dateofjoining = parse_date_str(Dateofjoining)
Confirmationtime = parse_date_str(Confirmationtime)
Practicingcertificatetime = parse_date_str(Practicingcertificatetime)
user.Confirmationtime = Confirmationtime
user.Practicingcertificatetime = Practicingcertificatetime
user.Dateofjoining = Dateofjoining
user.username = username
user.account = account
user.password = password
user.ethnicity = nation
user.card = IdCard
user.department = department
user.mobilePhone = mobilePhone
user.position = position
user.team = team
user.academic = academic
user.salary = salary
user.save()
return Response({'message': '修改成功', 'code': 0}, status=status.HTTP_200_OK)
class LoginView(APIView):
"""
登录页面
"""
def post(self, request):
token = request.META.get('token')
username = request.data.get('username')
password = request.data.get('password')
if not all([username, password]):
return Response({'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
try:
user = User.objects.get(account=username)
if user.state != '在职':
return Response({'me' 'ssage': '你的账号已经封存。', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
# 比较密码
if user.password == password or user.token == token:
# if '123456' == password or user.token == token:
# 更新 encryption 字段到数据库
user.token = token
user.save()
# 创建会话
session = SessionStore()
session.create()
session['user_id'] = user.id
session.save()
# 置 sessionid 到响应的 cookie 中
response = Response({
'id': user.id,
'message': '登录成功',
'code': 0
}, status=status.HTTP_200_OK)
response.set_cookie(key='sessionid', value=session.session_key, httponly=True)
return response
else:
return Response({'message': '密码错误', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
except User.DoesNotExist:
return Response({'status': 'error', 'message': '用户不存在', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
class PersonnelDetailsView(APIView):
"""展示人员信息"""
def post(self, request, *args, **kwargs):
token = request.META.get('token')
user = User.objects.prefetch_related('role', 'department').get(token=token)
permissionId = list(user.role.values("permissionId"))
permission_ids = [item['permissionId'] for item in permissionId]
permission_ids = [i for s in permission_ids for i in ast.literal_eval(s)]
permissions = permission.objects.filter(id__in=permission_ids)
permission_data = []
for per in permissions:
permission_data.append({
'id': per.id,
'permission_name': per.permission_name,
"permission_logo": per.permission_logo,
"parent": per.parent,
})
data = {
'id': user.id,
'username': user.username,
'account': user.account,
"ethnicity": user.ethnicity,
"card": user.card,
"mobilePhone": user.mobilePhone,
"position": user.position,
"team": user.team,
"Dateofjoining": user.Dateofjoining,
"Confirmationtime": user.Confirmationtime,
'Practicingcertificatetime': user.Practicingcertificatetime,
"Dateofdeparture": user.Dateofdeparture,
"AcademicResume": user.AcademicResume,
"academic": user.academic,
"contract": user.contract,
"ApplicationForm": user.ApplicationForm,
"state": user.state,
# 角色数据
"role": list(user.role.values('id', 'RoleName',"permissionId")), # 假设Role模型有name字段
# 如果需要部门数据
"department": list(user.department.values('id', 'username')),
"permission_data": permission_data,
}
return Response({'message': '详细人员信息展示成功', "data":data, 'code': 0}, status=status.HTTP_200_OK)
class DepartmentView(APIView):
def post(self, request, *args, **kwargs):
"""部门列表"""
name = request.data.get('name')
Q_obj = Q()
if name:
Q_obj &=Q(username__icontains=name)
deps = Department.objects.filter(Q_obj)
data = []
for dep in deps:
data.append({
'id': dep.id,
'name': dep.username,
})
return Response({'message': '展示成功', "data":data, 'code': 0}, status=status.HTTP_200_OK)
class PersonnelListView(APIView):
def post(self, request, *args, **kwargs):
"""
人员列表
:param request:
:param args:
:param kwargs:
:return:
"""
page = request.data.get('page')
per_page = request.data.get('per_page')
username = request.data.get('username')
department = request.data.get('department')
if not all([page, per_page]):
return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
Q_obj = Q()
if username:
Q_obj &= Q(username__icontains=username)
if department:
Q_obj &= Q(department__username__icontains=department)
users = User.objects.prefetch_related('department').filter(Q_obj)
total = len(users)
paginator = Paginator(users, per_page)
try:
user_agents_page = paginator.page(page)
except PageNotAnInteger:
user_agents_page = paginator.page(1)
except EmptyPage:
user_agents_page = paginator.page(paginator.num_pages)
data = []
for info in user_agents_page.object_list:
data.append({
'id': info.id,
"username": info.username, # 姓名
"account": info.account, # 账号
"nation": info.ethnicity, # 名族
"IdCard": info.card, # 身份证
"mobilePhone": info.mobilePhone, # 手机号
"department": list(info.department.values('id', 'username')),
"position": info.position, # 岗位
"team": info.team, # 所属团队
"Dateofjoining": info.Dateofjoining, # 入职时间
"Confirmationtime": info.Confirmationtime, # # 转正时间
'Practicingcertificatetime': info.Practicingcertificatetime,# 执业证时间
"Dateofdeparture": info.Dateofdeparture, # 离职时间
"AcademicResume": info.AcademicResume, # 学业简历
"academic": info.academic, # 学历信息
"contract": info.contract, # 合同
"ApplicationForm": info.ApplicationForm,# 入职申请表
"salary": info.salary, # 工资
"state": info.state, # 状态
})
return Response({'message': '查看成功', "total":total,'data': data, 'code': 0}, status=status.HTTP_200_OK)
class AddDepartment(APIView):
def post(self, request, *args, **kwargs):
name = request.data.get('name')
if not all([name]):
return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
dep = Department.objects.filter(username=name).first()
if dep:
return Response({'message': '添加失败,部门存在', 'code': 0}, status=status.HTTP_400_BAD_REQUEST)
Department.objects.create(username=name)
return Response({'message': '添加部门成功', 'code': 0}, status=status.HTTP_200_OK)
class DeleteDepartment(APIView):
def post(self, request, *args, **kwargs):
id = request.data.get('id')
if not all([id]):
return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
dep = Department.objects.get(id=id)
department = User.objects.filter(department=dep.username)
if department:
return Response({'status': 'error', 'message': '删除失败,该部门还存在,请及时转移', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
Department.objects.filter(id=id).delete()
return Response({'message': '删除成功', 'code': 0}, status=status.HTTP_200_OK)
class Personlist(APIView):
def post(self, request, *args, **kwargs):
users = Department.objects.all()
page = request.data.get('page')
per_page = request.data.get('per_page')
total = len(users)
paginator = Paginator(users, per_page)
try:
user_agents_page = paginator.page(page)
except PageNotAnInteger:
user_agents_page = paginator.page(1)
except EmptyPage:
user_agents_page = paginator.page(paginator.num_pages)
department_dict = []
for user in user_agents_page.object_list:
department_dict.append({
'id': user.id,
"username": user.username,
# "position": user.position,
# "state": user.state,
})
return Response({'message': '展示成功',"total":total,'data':department_dict, 'code': 0}, status=status.HTTP_200_OK)
class roxyExhibition(APIView):
def post(self, request, *args, **kwargs):
"""
代办展示
:param request:
:param args:
:param kwargs:
:return:
"""
page = request.data.get('page')
per_page = request.data.get('per_page')
token = request.META.get('token')
if not all([page, per_page]):
return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
user = User.objects.get(token=token)
approvals = Approval.objects.filter(
state="审核中",
personincharge__in=[user.username, user.department]
)
total = len(approvals)
paginator = Paginator(approvals, per_page)
try:
user_agents_page = paginator.page(page)
except PageNotAnInteger:
user_agents_page = paginator.page(1)
except EmptyPage:
user_agents_page = paginator.page(paginator.num_pages)
data = []
for info in user_agents_page.object_list:
itme = {
'id': info.id,
"title": info.title,
"content": info.content,
"times": info.times,
"completeTiem": info.completeTiem,
"personincharge": info.personincharge,
"state": info.state,
"type": info.type,
}
data.append(itme)
return Response({'message': '展示成功',"total":total,'data':data, 'code': 0}, status=status.HTTP_200_OK)
class approvalProcessing(APIView):
def post(self, request, *args, **kwargs):
"""
消除代办
:param request:
:param args:
:param kwargs:
:return:
"""
state = request.data.get('state')
type = request.data.get('type')
id = request.data.get('id')
if not all([state, type,id]):
return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
approval = Approval.objects.get(id=id)
if type == "入职财务登记":
user = User.objects.get(id=approval.user_id)
if state == "已通过":
approval.state="已通过"
user.state = "在职"
else:
approval.state="未通过"
user.state = "异常"
approval.save(update_fields=['state'])
user.save(update_fields=['state'])
if type == "开票":
user = Invoice.objects.get(id=approval.user_id)
if state == "已通过":
approval.state = "已通过"
user.state = "已通过"
else:
approval.state = "未通过"
user.state = "异常"
approval.save(update_fields=['state'])
user.save(update_fields=['state'])
if type == "收入确认":
approval = Approval.objects.get(id=id)
user = Income.objects.get(id=approval.user_id)
if state == "已通过":
approval.state = "已通过"
user.state = "已通过"
else:
approval.state = "未通过"
user.state = "未通过"
approval.save(update_fields=['state'])
user.save(update_fields=['state'])
if type == "调账申请":
approval = Approval.objects.get(id=id)
user = Accounts.objects.get(id=approval.user_id)
if state == "已通过":
approval.state = "已通过"
user.state = "已通过"
else:
approval.state = "未通过"
user.state = "未通过"
approval.save(update_fields=['state'])
user.save(update_fields=['state'])
if type == "付款申请":
approval = Approval.objects.get(id=id)
user = Payment.objects.get(id=approval.user_id)
if state == "已通过":
approval.state = "已通过"
user.state = "已通过"
else:
approval.state = "未通过"
user.state = "未通过"
approval.save(update_fields=['state'])
user.save(update_fields=['state'])
if type == "报销申请":
approval = Approval.objects.get(id=id)
user = Reimbursement.objects.get(id=approval.user_id)
if state == "已通过":
approval.state = "已通过"
user.state = "已通过"
else:
approval.state = "未通过"
user.state = "未通过"
approval.save(update_fields=['state'])
user.save(update_fields=['state'])
if type == "工资/奖金变更":
approval = Approval.objects.get(id=id)
user = BonusChange.objects.get(id=approval.user_id)
if state == "已通过":
approval.state = "已通过"
user.state = "已通过"
else:
approval.state = "未通过"
user.state = "未通过"
approval.save(update_fields=['state'])
user.save(update_fields=['state'])
if type == "立项登记":
approval = Approval.objects.get(id=id)
user = ProjectRegistration.objects.get(id=approval.user_id)
if state == "已通过":
approval.state = "已通过"
user.state = "已通过"
else:
approval.state = "未通过"
user.state = "未通过"
approval.save(update_fields=['state'])
user.save(update_fields=['state'])
if type == "案件管理":
approval = Approval.objects.get(id=id)
user = Case.objects.get(id=approval.user_id)
if state == "已通过":
approval.state = "已通过"
user.state = "已通过"
else:
approval.state = "未通过"
user.state = "未通过"
approval.save(update_fields=['state'])
user.save(update_fields=['state'])
if type == "申请用印":
approval = Approval.objects.get(id=id)
user = SealApplication.objects.get(id=approval.user_id)
if state == "已通过":
approval.state = "已通过"
user.state = "已通过"
else:
approval.state = "未通过"
user.state = "未通过"
approval.save(update_fields=['state'])
user.save(update_fields=['state'])
return Response({'message': '处理成功','code': 0}, status=status.HTTP_200_OK)
class personneldisplay(APIView):
def get(self, request, *args, **kwargs):
"""
人员列表
:param request:
:param args:
:param kwargs:
:return:
"""
users = User.objects.all()
data = []
for user in users:
itme = {
'id': user.id,
"username": user.username,
'position': user.position,
}
data.append(itme)
return Response({'message': '展示成功',"data":data,'code': 0}, status=status.HTTP_200_OK)

0
business/__init__.py Normal file
View File

3
business/admin.py Normal file
View File

@@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

6
business/apps.py Normal file
View File

@@ -0,0 +1,6 @@
from django.apps import AppConfig
class BusinessConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'business'

View File

@@ -0,0 +1,28 @@
# Generated by Django 4.2.25 on 2025-12-13 08:03
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='PreFiling',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('times', models.CharField(max_length=100)),
('client_username', models.CharField(max_length=100)),
('client_card', models.CharField(max_length=100)),
('party_username', models.CharField(max_length=100)),
('party_card', models.CharField(max_length=100)),
('description', models.TextField()),
('Undertaker', models.CharField(max_length=100)),
('submit', models.CharField(max_length=100)),
],
),
]

View File

@@ -0,0 +1,28 @@
# Generated by Django 4.2.25 on 2025-12-13 11:12
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('business', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='ProjectRegistration',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('type', models.CharField(max_length=100)),
('ContractNo', models.CharField(max_length=100)),
('times', models.CharField(max_length=100)),
('client_info', models.CharField(max_length=100)),
('party_info', models.CharField(max_length=100)),
('description', models.TextField()),
('responsiblefor', models.CharField(max_length=100)),
('charge', models.CharField(max_length=100)),
('contract', models.CharField(max_length=100)),
],
),
]

View File

@@ -0,0 +1,21 @@
# Generated by Django 4.2.25 on 2025-12-15 03:39
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('business', '0002_projectregistration'),
]
operations = [
migrations.RemoveField(
model_name='prefiling',
name='client_card',
),
migrations.RemoveField(
model_name='prefiling',
name='party_card',
),
]

View File

@@ -0,0 +1,19 @@
# Generated by Django 4.2.25 on 2025-12-16 05:04
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('business', '0003_remove_prefiling_client_card_and_more'),
]
operations = [
migrations.AddField(
model_name='projectregistration',
name='state',
field=models.CharField(default='', max_length=100),
preserve_default=False,
),
]

View File

@@ -0,0 +1,34 @@
# Generated by Django 4.2.25 on 2025-12-16 05:40
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('business', '0004_projectregistration_state'),
]
operations = [
migrations.CreateModel(
name='Bid',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('BiddingUnit', models.TextField()),
('ProjectName', models.CharField(max_length=100)),
('times', models.CharField(max_length=100)),
('BiddingAnnouncement', models.CharField(max_length=100)),
('state', models.CharField(max_length=100)),
],
),
migrations.AlterField(
model_name='projectregistration',
name='client_info',
field=models.TextField(),
),
migrations.AlterField(
model_name='projectregistration',
name='party_info',
field=models.TextField(),
),
]

View File

@@ -0,0 +1,26 @@
# Generated by Django 4.2.25 on 2025-12-16 06:01
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('business', '0005_bid_alter_projectregistration_client_info_and_more'),
]
operations = [
migrations.AddField(
model_name='bid',
name='user',
field=models.ForeignKey(default='', on_delete=django.db.models.deletion.CASCADE, to='business.prefiling'),
preserve_default=False,
),
migrations.AddField(
model_name='projectregistration',
name='user',
field=models.ForeignKey(default='', on_delete=django.db.models.deletion.CASCADE, to='business.prefiling'),
preserve_default=False,
),
]

View File

@@ -0,0 +1,37 @@
# Generated by Django 4.2.25 on 2025-12-16 06:26
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('business', '0006_bid_user_projectregistration_user'),
]
operations = [
migrations.RemoveField(
model_name='projectregistration',
name='client_info',
),
migrations.RemoveField(
model_name='projectregistration',
name='description',
),
migrations.RemoveField(
model_name='projectregistration',
name='party_info',
),
migrations.AddField(
model_name='bid',
name='type2',
field=models.CharField(default='', max_length=100),
preserve_default=False,
),
migrations.AddField(
model_name='projectregistration',
name='type2',
field=models.CharField(default='', max_length=100),
preserve_default=False,
),
]

View File

@@ -0,0 +1,21 @@
# Generated by Django 4.2.25 on 2025-12-16 09:29
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('business', '0007_remove_projectregistration_client_info_and_more'),
]
operations = [
migrations.RemoveField(
model_name='bid',
name='type2',
),
migrations.RemoveField(
model_name='projectregistration',
name='type2',
),
]

View File

@@ -0,0 +1,46 @@
# Generated by Django 4.2.25 on 2025-12-17 02:53
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('business', '0008_remove_bid_type2_remove_projectregistration_type2'),
]
operations = [
migrations.CreateModel(
name='Invoice',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('amount', models.CharField(max_length=100)),
('file', models.TextField()),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='business.prefiling')),
],
),
migrations.CreateModel(
name='Caselog',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('content', models.TextField()),
('times', models.CharField(max_length=100)),
('username', models.CharField(max_length=100)),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='business.prefiling')),
],
),
migrations.CreateModel(
name='Case',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('times', models.CharField(max_length=100)),
('AgencyContract', models.TextField()),
('Contractreturn', models.TextField()),
('Closingapplication', models.TextField()),
('ChangeRequest', models.CharField(max_length=100)),
('paymentcollection', models.CharField(max_length=100)),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='business.prefiling')),
],
),
]

View File

@@ -0,0 +1,19 @@
# Generated by Django 4.2.25 on 2025-12-17 02:54
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('business', '0009_invoice_caselog_case'),
]
operations = [
migrations.AddField(
model_name='caselog',
name='file',
field=models.TextField(default=''),
preserve_default=False,
),
]

View File

@@ -0,0 +1,19 @@
# Generated by Django 4.2.25 on 2025-12-17 06:01
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('business', '0010_caselog_file'),
]
operations = [
migrations.AddField(
model_name='case',
name='state',
field=models.CharField(default='', max_length=100),
preserve_default=False,
),
]

View File

@@ -0,0 +1,27 @@
# Generated by Django 4.2.25 on 2025-12-17 09:16
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('business', '0011_case_state'),
]
operations = [
migrations.CreateModel(
name='SealApplication',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('Printingpurpose', models.CharField(max_length=100)),
('CaseNumber', models.CharField(max_length=100)),
('Reason', models.TextField()),
('seal_number', models.CharField(max_length=100)),
('seal_type', models.CharField(max_length=100)),
('file', models.TextField()),
('times', models.CharField(max_length=100)),
('state', models.CharField(max_length=100)),
],
),
]

View File

@@ -0,0 +1,19 @@
# Generated by Django 4.2.25 on 2025-12-18 01:47
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('business', '0012_sealapplication'),
]
operations = [
migrations.AddField(
model_name='sealapplication',
name='username',
field=models.CharField(default='', max_length=100),
preserve_default=False,
),
]

View File

@@ -0,0 +1,25 @@
# Generated by Django 4.2.25 on 2025-12-18 03:30
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('business', '0013_sealapplication_username'),
]
operations = [
migrations.CreateModel(
name='Warehousing',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('unit', models.CharField(max_length=100)),
('mark', models.CharField(max_length=100)),
('lawyer', models.CharField(max_length=100)),
('deadline', models.CharField(max_length=100)),
('contract', models.TextField()),
('times', models.CharField(max_length=100)),
],
),
]

View File

@@ -0,0 +1,23 @@
# Generated by Django 4.2.25 on 2025-12-19 03:31
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('business', '0014_warehousing'),
]
operations = [
migrations.CreateModel(
name='RegisterPlatform',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('platform', models.CharField(max_length=100)),
('number', models.CharField(max_length=100)),
('password', models.CharField(max_length=100)),
('username', models.CharField(max_length=100)),
],
),
]

View File

@@ -0,0 +1,25 @@
# Generated by Django 4.2.25 on 2025-12-19 05:29
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('business', '0015_registerplatform'),
]
operations = [
migrations.CreateModel(
name='Announcement',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=100)),
('content', models.TextField()),
('times', models.CharField(max_length=100)),
('file', models.TextField()),
('username', models.CharField(max_length=100)),
('state', models.CharField(max_length=100)),
],
),
]

View File

@@ -0,0 +1,21 @@
# Generated by Django 4.2.25 on 2025-12-19 07:00
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('business', '0016_announcement'),
]
operations = [
migrations.CreateModel(
name='LawyerFlie',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('remark', models.CharField(max_length=200)),
('file', models.TextField()),
],
),
]

View File

@@ -0,0 +1,19 @@
# Generated by Django 4.2.25 on 2025-12-19 07:02
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('business', '0017_lawyerflie'),
]
operations = [
migrations.AddField(
model_name='lawyerflie',
name='times',
field=models.CharField(default='', max_length=100),
preserve_default=False,
),
]

View File

@@ -0,0 +1,24 @@
# Generated by Django 4.2.25 on 2025-12-20 05:23
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('business', '0018_lawyerflie_times'),
]
operations = [
migrations.CreateModel(
name='Schedule',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=100)),
('tiems', models.CharField(max_length=100)),
('end_time', models.CharField(max_length=100)),
('remark', models.CharField(max_length=200)),
('state', models.CharField(max_length=100)),
],
),
]

View File

@@ -0,0 +1,21 @@
# Generated by Django 4.2.25 on 2025-12-22 02:40
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('business', '0019_schedule'),
]
operations = [
migrations.CreateModel(
name='role',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('RoleName', models.CharField(max_length=100)),
('permissionId', models.CharField(max_length=100)),
],
),
]

View File

@@ -0,0 +1,19 @@
# Generated by Django 4.2.25 on 2025-12-22 03:30
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('business', '0020_role'),
]
operations = [
migrations.AddField(
model_name='lawyerflie',
name='title',
field=models.CharField(default='', max_length=100),
preserve_default=False,
),
]

View File

@@ -0,0 +1,21 @@
# Generated by Django 4.2.25 on 2025-12-22 05:48
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('business', '0021_lawyerflie_title'),
]
operations = [
migrations.CreateModel(
name='permission',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('permission_name', models.CharField(max_length=100)),
('permission_logo', models.CharField(max_length=100)),
],
),
]

View File

@@ -0,0 +1,19 @@
# Generated by Django 4.2.25 on 2025-12-22 09:07
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('business', '0022_permission'),
]
operations = [
migrations.AddField(
model_name='permission',
name='parent',
field=models.CharField(default='', max_length=100),
preserve_default=False,
),
]

View File

@@ -0,0 +1,19 @@
# Generated by Django 4.2.25 on 2025-12-23 06:45
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('business', '0023_permission_parent'),
]
operations = [
migrations.AddField(
model_name='role',
name='remark',
field=models.CharField(default='', max_length=200),
preserve_default=False,
),
]

View File

115
business/models.py Normal file
View File

@@ -0,0 +1,115 @@
from django.db import models
# Create your models here.
class PreFiling(models.Model):
times = models.CharField(max_length=100) # 预立案时间
client_username = models.CharField(max_length=100) # 委托人信息 自然人姓名/法人名称
party_username = models.CharField(max_length=100) # 相对方信息 自然人姓名/法人名称
description = models.TextField() # 描述
Undertaker = models.CharField(max_length=100) # 承办人员
submit = models.CharField(max_length=100) # 谁提交的
class ProjectRegistration(models.Model):
user = models.ForeignKey(PreFiling, on_delete=models.CASCADE)
type = models.CharField(max_length=100) # 项目类型
ContractNo = models.CharField(max_length=100) # 合同编号
times = models.CharField(max_length=100) # 立项日期时间
responsiblefor = models.CharField(max_length=100) # 负责人
charge = models.CharField(max_length=100) # 收费情况
contract = models.CharField(max_length=100) # 合同
state = models.CharField(max_length=100) # 状态
class Bid(models.Model):
user = models.ForeignKey(PreFiling, on_delete=models.CASCADE)
BiddingUnit = models.TextField() # 招标单位 名称、统一社会信用代码/身份证号码
ProjectName = models.CharField(max_length=100) # 项目名称
times = models.CharField(max_length=100) # 申请日期
BiddingAnnouncement = models.CharField(max_length=100) # 上传招标公告
state = models.CharField(max_length=100) # 状态
class Case(models.Model):
user = models.ForeignKey(PreFiling, on_delete=models.CASCADE)
times = models.CharField(max_length=100) # 立案时间
AgencyContract = models.TextField() # 代理合同
Contractreturn = models.TextField() # 合同返还
Closingapplication = models.TextField() # 结案申请
ChangeRequest = models.CharField(max_length=100) # 变更申请
paymentcollection = models.CharField(max_length=100) # 已收款
state = models.CharField(max_length=100) # 状态
class Invoice(models.Model):
user = models.ForeignKey(PreFiling, on_delete=models.CASCADE)
amount = models.CharField(max_length=100) # 金额
file = models.TextField() # 发票图片或PDF
class Caselog(models.Model):
user = models.ForeignKey(PreFiling, on_delete=models.CASCADE)
content = models.TextField()
times = models.CharField(max_length=100) # 时间
username = models.CharField(max_length=100) # 提交人
file = models.TextField() # 文件
class SealApplication(models.Model):
Printingpurpose = models.CharField(max_length=100) # 用印用途
CaseNumber = models.CharField(max_length=100) # 案件编号
Reason = models.TextField() # 用印事由
seal_number = models.CharField(max_length=100) # 盖章份数
seal_type = models.CharField(max_length=100) # 盖着类型
file = models.TextField() # 上传用印文件
times = models.CharField(max_length=100) # 日期
state = models.CharField(max_length=100) # 状态
username = models.CharField(max_length=100) # 提交人
class Warehousing(models.Model):
unit = models.CharField(max_length=100) # 单位
mark = models.CharField(max_length=100) # 入库标的
lawyer = models.CharField(max_length=100) # 主办律师
deadline = models.CharField(max_length=100) # 入库期限
contract = models.TextField() # 入库合同
times = models.CharField(max_length=100) # 日期
class RegisterPlatform(models.Model):
platform = models.CharField(max_length=100) # 注册平台
number = models.CharField(max_length=100) # 注册号码
password = models.CharField(max_length=100) # 密码
username = models.CharField(max_length=100) # 注册人员
class Announcement(models.Model):
title = models.CharField(max_length=100) # 标题
content = models.TextField() # 内容
times = models.CharField(max_length=100) # 提交时间
file = models.TextField() # 文件
username = models.CharField(max_length=100) # 提交人
state = models.CharField(max_length=100) # 状态
class LawyerFlie(models.Model):
title = models.CharField(max_length=100) # 标题
remark = models.CharField(max_length=200)
file = models.TextField() # 文件
times = models.CharField(max_length=100)
class Schedule(models.Model):
title = models.CharField(max_length=100) # 标题
tiems = models.CharField(max_length=100)
end_time = models.CharField(max_length=100)
remark = models.CharField(max_length=200) # 备注
state = models.CharField(max_length=100)
class role(models.Model):
RoleName = models.CharField(max_length=100) # 角色名称
permissionId = models.CharField(max_length=100) # 权限
remark = models.CharField(max_length=200) # 备注
class permission(models.Model):
permission_name = models.CharField(max_length=100) # 权限名称
permission_logo = models.CharField(max_length=100) # 权限标识
parent = models.CharField(max_length=100) # 父级

3
business/tests.py Normal file
View File

@@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

52
business/urls.py Normal file
View File

@@ -0,0 +1,52 @@
from django.urls import path
from .models import Schedule
from .views import registration,registrationDetail,Project,Projectquerytype,ProjectDetail,EditProject,BidRegistration,BidDetail,registrationList,caseManagement,caseManagementDetail,Uploadinvoice,InvoiceDetail,Log,LogDetail,accumulate,preFilingLinkedCases,Application,ApplicationDetail,WarehousingRegistration,WarehousingDetail,PlatformRegistration,PlatformDetail,EditPlatformDetail,DeletePlatformDetail,bulletin,BulletinDetail,EditBulletin,deleteBulletin,Lawyersdocuments,LawyersdocumentsDetail,LwaDetail,CreateSchedule,DeleteSchedule,ScheduleDetail,handleSchedule,AddRermission,DisplayRermission,DeleteRermission,EditRermission,addRole,DeleteRole,EditRole,displayRole,modifypermissions
urlpatterns = [
path('register',registration.as_view(),name='register'),
path('registerdetail',registrationDetail.as_view(),name='registerdetail'),
path('project',Project.as_view(),name='project'),
path('projectquerytype',Projectquerytype.as_view(),name='projectquerytype'),
path('projectdetail',ProjectDetail.as_view(),name='projectdetail'),
path('editproject',EditProject.as_view(),name='editproject'),
path('bid',BidRegistration.as_view(),name='bid'),
path('biddetail',BidDetail.as_view(),name='biddetail'),
path('registrationlist',registrationList.as_view(),name='registrationlist'),
path('casemanagement',caseManagement.as_view(),name='casemanagement'),
path('casemanagementdetail',caseManagementDetail.as_view(),name='casemanagementdetail'),
path('uploadinvoice',Uploadinvoice.as_view(),name='uploadinvoice'),
path('invoicedetail',InvoiceDetail.as_view(),name='invoicedetail'),
path('log',Log.as_view(),name='log'),
path('logdetail',LogDetail.as_view(),name='logdetail'),
path('accumulate',accumulate.as_view(),name='accumulate'),
path('preFilingLinkedCases',preFilingLinkedCases.as_view(),name='preFilingLinkedCases'),
path('application',Application.as_view(),name='application'),
path('applicationdetail',ApplicationDetail.as_view(),name='applicationdetail'),
path('warehousing',WarehousingRegistration.as_view(),name='WarehousingRegistration'),
path('warehousingdetail',WarehousingDetail.as_view(),name='warehousingdetail'),
path('PlatformRegistration',PlatformRegistration.as_view(),name='PlatformRegistration'),
path('PlatformDetail',PlatformDetail.as_view(),name='PlatformDetail'),
path('editPlatform',EditPlatformDetail.as_view(),name='editPlatform'),
path('deletePlatform',DeletePlatformDetail.as_view(),name='deletePlatform'),
path('bulletin',bulletin.as_view(),name='bulletin'),
path('bulletindetail',BulletinDetail.as_view(),name='bulletindetail'),
path('editBulletin',EditBulletin.as_view(),name='EditBulletin'),
path('deleteBulletin',deleteBulletin.as_view(),name='deleteBulletin'),
path('Lawyerflie',Lawyersdocuments.as_view(),name='LawyerFlie'),
path('lawdisplay',LawyersdocumentsDetail.as_view(),name='lawdetail'),
path('LwaDetail',LwaDetail.as_view(),name='LwaDetail'),
path('schedule',CreateSchedule.as_view(),name='schedule'),
path('scheduledetail',DeleteSchedule.as_view(),name='scheduledetail'),
path('ScheduleDetail',ScheduleDetail.as_view(),name='ScheduleDetail'),
path('handleSchedule',handleSchedule.as_view(),name='handleSchedule'),
path('addRermission',AddRermission.as_view(),name='addRermission'),
path('displayRermission',DisplayRermission.as_view(),name='displayRermission'),
path('deleteRermission',DeleteRermission.as_view(),name='deleteRermission'),
path('editRermission',EditRermission.as_view(),name='editRermission'),
path('addRole',addRole.as_view(),name='addRole'),
path('DeleteRole',DeleteRole.as_view(),name='DeleteRole'),
path('EditRole',EditRole.as_view(),name='EditRole'),
path('displayRole',displayRole.as_view(),name='displayRole'),
path('modifypermissions',modifypermissions.as_view(),name="modifypermissions")
]

1339
business/views.py Normal file

File diff suppressed because it is too large Load Diff

0
finance/__init__.py Normal file
View File

3
finance/admin.py Normal file
View File

@@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

6
finance/apps.py Normal file
View File

@@ -0,0 +1,6 @@
from django.apps import AppConfig
class FinanceConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'finance'

View File

@@ -0,0 +1,30 @@
# Generated by Django 4.2.25 on 2025-12-09 16:43
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Invoice',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('ContractNo', models.TextField()),
('personincharge', models.CharField(max_length=100)),
('amount', models.CharField(max_length=100)),
('type', models.CharField(max_length=100)),
('unit', models.CharField(max_length=100)),
('number', models.CharField(max_length=100)),
('address_telephone', models.CharField(max_length=100)),
('bank', models.CharField(max_length=100)),
('state', models.CharField(max_length=100)),
('username', models.CharField(max_length=100)),
],
),
]

View File

@@ -0,0 +1,19 @@
# Generated by Django 4.2.25 on 2025-12-09 17:43
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('finance', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='invoice',
name='times',
field=models.TextField(default=''),
preserve_default=False,
),
]

View File

@@ -0,0 +1,26 @@
# Generated by Django 4.2.25 on 2025-12-11 05:46
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('finance', '0002_invoice_times'),
]
operations = [
migrations.CreateModel(
name='Income',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('times', models.CharField(max_length=100)),
('ContractNo', models.CharField(max_length=100)),
('CustomerID', models.CharField(max_length=100)),
('amount', models.CharField(max_length=100)),
('allocate', models.CharField(max_length=100)),
('submit', models.CharField(max_length=100)),
('submit_tiem', models.CharField(max_length=100)),
],
),
]

View File

@@ -0,0 +1,19 @@
# Generated by Django 4.2.25 on 2025-12-11 06:18
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('finance', '0003_income'),
]
operations = [
migrations.AddField(
model_name='income',
name='state',
field=models.CharField(default='', max_length=100),
preserve_default=False,
),
]

View File

@@ -0,0 +1,27 @@
# Generated by Django 4.2.25 on 2025-12-11 06:38
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('finance', '0004_income_state'),
]
operations = [
migrations.CreateModel(
name='Accounts',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('times', models.CharField(max_length=100)),
('ContractNo', models.CharField(max_length=100)),
('CustomerID', models.CharField(max_length=100)),
('amount', models.CharField(max_length=100)),
('situation', models.TextField()),
('submit', models.CharField(max_length=100)),
('submit_tiem', models.CharField(max_length=100)),
('state', models.CharField(max_length=100)),
],
),
]

View File

@@ -0,0 +1,28 @@
# Generated by Django 4.2.25 on 2025-12-11 08:56
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('finance', '0005_accounts'),
]
operations = [
migrations.CreateModel(
name='Payment',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('reason', models.TextField()),
('amount', models.CharField(max_length=100)),
('times', models.CharField(max_length=100)),
('payee', models.CharField(max_length=100)),
('bankcard', models.CharField(max_length=100)),
('BankName', models.CharField(max_length=100)),
('applicant', models.CharField(max_length=100)),
('submit_tiem', models.CharField(max_length=100)),
('state', models.CharField(max_length=100)),
],
),
]

View File

@@ -0,0 +1,26 @@
# Generated by Django 4.2.25 on 2025-12-11 09:31
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('finance', '0006_payment'),
]
operations = [
migrations.CreateModel(
name='Reimbursement',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('person', models.CharField(max_length=100)),
('times', models.CharField(max_length=100)),
('reason', models.TextField()),
('amount', models.CharField(max_length=100)),
('FeeDescription', models.TextField()),
('submit_tiem', models.CharField(max_length=100)),
('state', models.CharField(max_length=100)),
],
),
]

View File

@@ -0,0 +1,23 @@
# Generated by Django 4.2.25 on 2025-12-12 08:19
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('finance', '0007_reimbursement'),
]
operations = [
migrations.CreateModel(
name='BonusChange',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('username', models.CharField(max_length=100)),
('type', models.CharField(max_length=100)),
('Instructions', models.TextField()),
('times', models.CharField(max_length=100)),
],
),
]

View File

@@ -0,0 +1,19 @@
# Generated by Django 4.2.25 on 2025-12-12 08:30
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('finance', '0008_bonuschange'),
]
operations = [
migrations.AddField(
model_name='bonuschange',
name='state',
field=models.CharField(default='', max_length=100),
preserve_default=False,
),
]

View File

65
finance/models.py Normal file
View File

@@ -0,0 +1,65 @@
from django.db import models
# Create your models here.
class Invoice(models.Model):
ContractNo = models.TextField() # 合同号
personincharge = models.CharField(max_length=100) # 负责人
amount =models.CharField(max_length=100) # 开票金额
type = models.CharField(max_length=100) # 开票类型
unit = models.CharField(max_length=100) # 开票单位全称
number = models.CharField(max_length=100) # 纳税人识别号
address_telephone = models.CharField(max_length=100) # 地址/电话
bank = models.CharField(max_length=100) # 银行卡
state = models.CharField(max_length=100) # 状态
username = models.CharField(max_length=100) # 谁提交的
times = models.TextField() # 提交时间
class Income(models.Model):
times = models.CharField(max_length=100) # 收款日期
ContractNo = models.CharField(max_length=100) # 合同号
CustomerID = models.CharField(max_length=100) # 客户名称
amount = models.CharField(max_length=100) # 收款金额
allocate = models.CharField(max_length=100) # 收入分配
submit = models.CharField(max_length=100) # 谁提交的
submit_tiem = models.CharField(max_length=100) # 提交时间
state = models.CharField(max_length=100) # 状态
class Accounts(models.Model):
times = models.CharField(max_length=100) # 收款日期
ContractNo = models.CharField(max_length=100) # 合同号
CustomerID = models.CharField(max_length=100) # 客户名称
amount = models.CharField(max_length=100) # 收款金额
situation = models.TextField() # 情况
submit = models.CharField(max_length=100) # 谁提交的
submit_tiem = models.CharField(max_length=100) # 提交时间
state = models.CharField(max_length=100) # 状态
class Payment(models.Model):
reason = models.TextField() # 付款理由
amount = models.CharField(max_length=100) # 付款金额
times = models.CharField(max_length=100) # 付款日期
payee = models.CharField(max_length=100) # 收款人
bankcard = models.CharField(max_length=100) # 银行卡
BankName = models.CharField(max_length=100) # 开户行
applicant = models.CharField(max_length=100) # 申请人
submit_tiem = models.CharField(max_length=100) # 提交时间
state = models.CharField(max_length=100) # 状态
class Reimbursement(models.Model):
person = models.CharField(max_length=100) # 报销人
times = models.CharField(max_length=100) # 报销日期
reason = models.TextField() # 报销理由
amount = models.CharField(max_length=100) # 报销金额
FeeDescription = models.TextField() # 费用说明
submit_tiem = models.CharField(max_length=100) # 提交时间
state = models.CharField(max_length=100) # 状态
class BonusChange(models.Model):
username = models.CharField(max_length=100)
type = models.CharField(max_length=100)
Instructions = models.TextField() # 调整说明
times = models.CharField(max_length=100) # 时间
state = models.CharField(max_length=100) # 状态

3
finance/tests.py Normal file
View File

@@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

18
finance/urls.py Normal file
View File

@@ -0,0 +1,18 @@
from .views import UserRegister,issueAnInvoice,issueAnInvoiceDetail,confirm,loan,PaymentRequest,reimbursement,confirmdisplay,loandisplay,PaymentDisplay,reimbursementdetail,Change,ChangeDetail
from django.urls import path
urlpatterns = [
path("user-register", UserRegister.as_view(), name="user-register/"),
path("issue-invoice", issueAnInvoice.as_view(), name="issue-invoice/"),
path('issue-Detail', issueAnInvoiceDetail.as_view(), name="issue-Detail/"),
path('confirm', confirm.as_view(), name="confirm/"),
path('loan', loan.as_view(), name="loan/"),
path('payment-request', PaymentRequest.as_view(), name="payment-request/"),
path('reimbursement',reimbursement.as_view(), name="reimbursement/"),
path('confirmdisplay', confirmdisplay.as_view(), name="confirmdisplay/"),
path('loandisplay', loandisplay.as_view(), name="loandisplay/"),
path('PaymentDisplay', PaymentDisplay.as_view(), name="PaymentDisplay/"),
path('reidetail',reimbursementdetail.as_view(), name="reimbursementdetail/"),
path('change',Change.as_view(), name="Change/"),
path('ChangeDetail', ChangeDetail.as_view(), name="ChangeDetail/"),
]

569
finance/views.py Normal file
View File

@@ -0,0 +1,569 @@
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
import json
import ast
from User.models import User,Approval
import datetime
from .models import Invoice,Income,Accounts,Payment,Reimbursement,BonusChange
from utility.utility import flies
from django.contrib.sessions.backends.db import SessionStore
from django.db.models import Count, Q
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
class UserRegister(APIView):
def post(self, request, *args, **kwargs):
"""
财务登记
:param request:
:param args:
:param kwargs:
:return:
"""
username = request.data.get('username')
card = request.data.get('card')
Dateofjoining = request.data.get('Dateofjoining')
position = request.data.get('position')
salary = request.data.get('salary')
personincharge = request.data.get('personincharge')
if not all([username, card, Dateofjoining, position, salary]):
return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
Dateofjoinings = datetime.datetime.strptime(Dateofjoining, "%Y-%m-%d")
user = User.objects.get(username=username)
user.card = card
user.salary = salary
user.username = username
user.Dateofjoining = Dateofjoinings
user.position = position
user.state="待确认"
today = datetime.datetime.now()
formatted_date = today.strftime("%Y-%m-%d")
Approval.objects.create(
title=username+"入职财务登记",
content=username+""+Dateofjoining+"办理入职,身份证:"+card+",岗位:"+position+"薪资:"+salary,
times=formatted_date,
personincharge=personincharge,
state='审核中',
type="入职财务登记",
user_id=user.id
)
user.save(update_fields=['card', 'salary', 'username', 'Dateofjoining', 'position'])
return Response({'message': '登记成功', 'code': 0}, status=status.HTTP_200_OK)
class issueAnInvoice(APIView):
def post(self, request, *args, **kwargs):
"""
财务开票
:param request:
:param args:
:param kwargs:
:return:
"""
token = request.META.get('token')
ContractNo = request.data.get('ContractNo')
personincharge = request.data.get('personincharge')
amount = request.data.get('amount')
type = request.data.get('type')
unit = request.data.get('unit')
number = request.data.get('number')
address_telephone = request.data.get('address_telephone')
bank = request.data.get('bank')
username = request.data.get('username')
if not all([token, ContractNo, personincharge, amount, type, unit, number, address_telephone, bank,username]):
return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
today = datetime.datetime.now()
formatted_date = today.strftime("%Y-%m-%d")
invoice = Invoice.objects.create(
ContractNo=ContractNo,
personincharge=personincharge,
amount=amount,
type=type,
unit=unit,
number=number,
address_telephone=address_telephone,
bank=bank,
state="审核中",
username=username,
times=formatted_date,
)
Approval.objects.create(
title=username+"申请开票",
content=""+formatted_date+"的时候审核开发票",
times=formatted_date,
personincharge=personincharge,
state="审核中",
type="开票",
user_id = invoice.id
)
return Response({'message': '提交成功', 'code': 0}, status=status.HTTP_200_OK)
class issueAnInvoiceDetail(APIView):
def post(self, request, *args, **kwargs):
"""
开票记录详情
"""
page = request.data.get('page')
per_page = request.data.get('per_page')
times = request.data.get('times')
end_time = request.data.get('end_time')
unit = request.data.get('unit')
if not all([page, per_page]):
return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
Q_obj = Q()
if times and end_time:
Q_obj &= Q(times__gte=times) & Q(times__lte=end_time)
if unit:
Q_obj &= Q(unit__icontains=unit)
invos = Invoice.objects.filter(Q_obj)
total = len(invos)
paginator = Paginator(invos, per_page)
try:
user_agents_page = paginator.page(page)
except PageNotAnInteger:
user_agents_page = paginator.page(1)
except EmptyPage:
user_agents_page = paginator.page(paginator.num_pages)
data = []
for info in user_agents_page.object_list:
itme = {
'id': info.id,
"ContractNo": info.ContractNo,
"personincharge": info.personincharge,
"amount": info.amount,
"type": info.type,
"unit": info.unit,
"number": info.number,
"address_telephone": info.address_telephone,
"bank": info.bank,
"state": info.state,
"username": info.username,
"times": info.times,
}
data.append(itme)
return Response({'message': '展示成功',"total":total,'data':data, 'code': 0}, status=status.HTTP_200_OK)
class confirm(APIView):
def post(self, request, *args, **kwargs):
"""
收入确认
:param request:
:param args:
:param kwargs:
:return:
"""
times = request.data.get('times')
ContractNo = request.data.get('ContractNo')
CustomerID = request.data.get('CustomerID')
amount = request.data.get('amount')
allocate = request.data.get('allocate')
token = request.META.get('token')
personincharge = request.data.get('personincharge')
user = User.objects.get(token=token)
if not all([times, ContractNo, CustomerID, amount, allocate]):
return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
from datetime import datetime
now = datetime.now()
# 格式化日期为字符串,格式为 YYYY-MM-DD
date_string = now.strftime("%Y-%m-%d")
income = Income.objects.create(
times=times,
ContractNo=ContractNo,
CustomerID=CustomerID,
amount=amount,
allocate=allocate,
submit=user.username,
submit_tiem=date_string,
state="审核中"
)
Approval.objects.create(
title=user.username + "提交收入确认",
content=user.username + "" + times + "提交了收入确认,合同编号:" + ContractNo + ",客户名称:" + CustomerID + "收入金额:" + amount,
times=date_string,
personincharge=personincharge,
state='审核中',
type="收入确认",
user_id=income.id
)
return Response({'message': '插入成功' ,'code': 0}, status=status.HTTP_200_OK)
class confirmdisplay(APIView):
def post(self, request, *args, **kwargs):
"""
收入确认展示
"""
page = request.data.get('page')
per_page = request.data.get('per_page')
times = request.data.get('times')
end_time = request.data.get('end_time')
CustomerID = request.data.get('CustomerID')
if not all([page, per_page]):
return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
Q_obj = Q()
if times and end_time:
Q_obj &= Q(times__gte=times) & Q(times__lte=end_time)
if CustomerID:
Q_obj &= Q(CustomerID__icontains=CustomerID)
income = Income.objects.filter(Q_obj)
total = len(income)
paginator = Paginator(income, per_page)
try:
user_agents_page = paginator.page(page)
except PageNotAnInteger:
user_agents_page = paginator.page(1)
except EmptyPage:
user_agents_page = paginator.page(paginator.num_pages)
data = []
for info in user_agents_page.object_list:
itme = {
'id': info.id,
"times": info.times,
"ContractNo": info.ContractNo,
"CustomerID": info.CustomerID,
"amount": info.amount,
"allocate": info.allocate,
"state": info.state,
}
data.append(itme)
return Response({'message': '展示成功', "total": total, 'data': data, 'code': 0}, status=status.HTTP_200_OK)
class loan(APIView):
def post(self, request, *args, **kwargs):
"""
调账申请
:param request:
:param args:
:param kwargs:
:return:
"""
times = request.data.get('times')
ContractNo = request.data.get('ContractNo')
CustomerID = request.data.get('CustomerID')
amount = request.data.get('amount')
situation = request.data.get('situation')
personincharge = request.data.get('personincharge')
token = request.META.get('token')
if not all([times, ContractNo, amount, situation,CustomerID,personincharge]):
return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
from datetime import datetime
now = datetime.now()
# 格式化日期为字符串,格式为 YYYY-MM-DD
date_string = now.strftime("%Y-%m-%d")
user = User.objects.get(token=token)
acc = Accounts.objects.create(
times=times,
ContractNo=ContractNo,
CustomerID=CustomerID,
amount=amount,
situation=situation,
submit=user.username,
submit_tiem=date_string,
state="审核中"
)
Approval.objects.create(
title=user.username + "提交调账申请",
content=user.username + "" + times + "提交了调账申请,合同编号:" + ContractNo + ",客户名称:" + CustomerID + "收入金额:" + amount,
times=date_string,
personincharge=personincharge,
state='审核中',
type="调账申请",
user_id=acc.id
)
return Response({'message': '插入成功' ,'code': 0}, status=status.HTTP_200_OK)
class loandisplay(APIView):
def post(self, request, *args, **kwargs):
page = request.data.get('page')
per_page = request.data.get('per_page')
times = request.data.get('times')
end_time = request.data.get('end_time')
CustomerID = request.data.get('CustomerID')
if not all([page, per_page]):
return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
Q_obj = Q()
if times and end_time:
Q_obj &= Q(times__gte=times) & Q(times__lte=end_time)
if CustomerID:
Q_obj &= Q(CustomerID__icontains=CustomerID)
acc = Accounts.objects.filter(Q_obj)
total = len(acc)
paginator = Paginator(acc, per_page)
try:
user_agents_page = paginator.page(page)
except PageNotAnInteger:
user_agents_page = paginator.page(1)
except EmptyPage:
user_agents_page = paginator.page(paginator.num_pages)
data = []
for info in user_agents_page.object_list:
itme = {
'id': info.id,
"times": info.times,
"ContractNo": info.ContractNo,
"CustomerID": info.CustomerID,
"amount": info.amount,
"situation": info.situation,
"state": info.state,
}
data.append(itme)
return Response({'message': '展示成功', "total": total, 'data': data, 'code': 0}, status=status.HTTP_200_OK)
class PaymentRequest(APIView):
def post(self, request, *args, **kwargs):
"""
付款申请
:param request:
:param args:
:param kwargs:
:return:
"""
reason = request.data.get('reason')
amount = request.data.get('amount')
times = request.data.get('times')
payee = request.data.get('payee')
bankcard = request.data.get('bankcard')
BankName = request.data.get('BankName')
applicant= request.data.get('applicant')
personincharge = request.data.get('personincharge')
if not all([times, payee, bankcard, BankName, personincharge,reason,amount]):
return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
from datetime import datetime
now = datetime.now()
# 格式化日期为字符串,格式为 YYYY-MM-DD
date_string = now.strftime("%Y-%m-%d")
pay = Payment.objects.create(
reason=reason,
amount=amount,
times=times,
payee=payee,
bankcard=bankcard,
BankName=BankName,
applicant=applicant,
submit_tiem=date_string,
state="审核中"
)
Approval.objects.create(
title=applicant + "提交付款申请",
content=applicant + "" + times + "提交了付款申请,付款理由:" + reason + ",付款金额:" + amount + ",付款日期:" + times+",收款人:"+payee+",银行卡:"+bankcard+",开户行:"+BankName,
times=date_string,
personincharge=personincharge,
state='审核中',
type="付款申请",
user_id=pay.id
)
return Response({'message': '插入成功' ,'code': 0}, status=status.HTTP_200_OK)
class PaymentDisplay(APIView):
def post(self, request, *args, **kwargs):
page = request.data.get('page')
per_page = request.data.get('per_page')
times = request.data.get('times')
end_time = request.data.get('end_time')
payee = request.data.get('payee')
if not all([page, per_page]):
return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
Q_obj = Q()
if times and end_time:
Q_obj &= Q(times__gte=times) & Q(times__lte=end_time)
if payee:
Q_obj &= Q(payee__icontains=payee)
pay = Payment.objects.filter(Q_obj)
total = len(pay)
paginator = Paginator(pay, per_page)
try:
user_agents_page = paginator.page(page)
except PageNotAnInteger:
user_agents_page = paginator.page(1)
except EmptyPage:
user_agents_page = paginator.page(paginator.num_pages)
data = []
for info in user_agents_page.object_list:
itme = {
'id': info.id,
"times": info.times,
"payee": info.payee,
"reason": info.reason,
"amount": info.amount,
"bankcard": info.bankcard,
"BankName": info.BankName,
"applicant": info.applicant,
"state": info.state,
}
data.append(itme)
return Response({'message': '展示成功', "total": total, 'data': data, 'code': 0}, status=status.HTTP_200_OK)
class reimbursement(APIView):
def post(self, request, *args, **kwargs):
"""
报销
:param request:
:param args:
:param kwargs:
:return:
"""
person = request.data.get('person')
times = request.data.get('times')
reason = request.data.get('reason')
amount = request.data.get('amount')
FeeDescription = request.data.get('FeeDescription')
personincharge = request.data.get('personincharge')
if not all([person,times, reason, amount, FeeDescription, personincharge]):
return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
from datetime import datetime
now = datetime.now()
reim = Reimbursement.objects.create(
person=person,
times=times,
reason=reason,
amount=amount,
FeeDescription=FeeDescription,
submit_tiem=now.strftime("%Y-%m-%d"),
state="审核中"
)
Approval.objects.create(
title=person + "报销申请",
content=person + "" + times + "提交了报销申请,报销理由:" + reason + ",付款金额:" + amount + ",付款日期:" + times + ",费用说明:" + FeeDescription,
times=times,
personincharge=personincharge,
state='审核中',
type="报销申请",
user_id=reim.id
)
return Response({'message': '插入成功', 'code': 0}, status=status.HTTP_200_OK)
class reimbursementdetail(APIView):
def post(self, request, *args, **kwargs):
page = request.data.get('page')
per_page = request.data.get('per_page')
times = request.data.get('times')
end_time = request.data.get('end_time')
person = request.data.get('person')
if not all([page, per_page]):
return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
Q_obj = Q()
if times and end_time:
Q_obj &= Q(times__gte=times) & Q(times__lte=end_time)
if person:
Q_obj &= Q(person__icontains=person)
rei = Reimbursement.objects.filter(Q_obj)
total = len(rei)
paginator = Paginator(rei, per_page)
try:
user_agents_page = paginator.page(page)
except PageNotAnInteger:
user_agents_page = paginator.page(1)
except EmptyPage:
user_agents_page = paginator.page(paginator.num_pages)
data = []
for info in user_agents_page.object_list:
itme = {
"id": info.id,
"times": info.times,
"person": info.person,
"reason": info.reason,
"amount": info.amount,
"FeeDescription": info.FeeDescription,
"state": info.state,
}
data.append(itme)
return Response({'message': '展示成功', "total": total, 'data': data, 'code': 0}, status=status.HTTP_200_OK)
class Change(APIView):
def post(self, request, *args, **kwargs):
"""
工资/奖金变更
:param request:
:param args:
:param kwargs:
:return:
"""
username = request.data.get('username')
type = request.data.get('type')
Instructions = request.data.get('Instructions')
personincharge = request.data.get('personincharge')
if not all([username, type, Instructions]):
return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
from datetime import datetime
now = datetime.now()
bonus = BonusChange.objects.create(
username=username,
type=type,
Instructions=Instructions,
times=now.strftime("%Y-%m-%d"),
state="审核中"
)
Approval.objects.create(
title=username + "工资/奖金变更",
content=username + "" + now.strftime('%Y-%m-%d"') + "提交了工资/奖金变更,类型:" + type + ",调整说明:" + Instructions,
times=now.strftime("%Y-%m-%d"),
personincharge=personincharge,
state='审核中',
type="工资/奖金变更",
user_id=bonus.id
)
return Response({'message': '插入成功', 'code': 0}, status=status.HTTP_200_OK)
class ChangeDetail(APIView):
def post(self, request, *args, **kwargs):
page = request.data.get('page')
per_page = request.data.get('per_page')
times = request.data.get('times')
end_time = request.data.get('end_time')
username = request.data.get('username')
if not all([page, per_page]):
return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
Q_obj = Q()
if times and end_time:
Q_obj &= Q(times__gte=times) & Q(times__lte=end_time)
if username:
Q_obj &= Q(username__icontains=username)
bon = BonusChange.objects.filter(Q_obj)
total = len(bon)
paginator = Paginator(bon, per_page)
try:
user_agents_page = paginator.page(page)
except PageNotAnInteger:
user_agents_page = paginator.page(1)
except EmptyPage:
user_agents_page = paginator.page(paginator.num_pages)
data = []
for info in user_agents_page.object_list:
itme = {
"id": info.id,
"times": info.times,
"type": info.type,
"Instructions": info.Instructions,
"username": info.username,
}
data.append(itme)
return Response({'message': '展示成功', "total": total, 'data': data, 'code': 0}, status=status.HTTP_200_OK)

2
jyls_django/__init__.py Normal file
View File

@@ -0,0 +1,2 @@
import pymysql
pymysql.install_as_MySQLdb()

16
jyls_django/asgi.py Normal file
View File

@@ -0,0 +1,16 @@
"""
ASGI config for jyls_django project.
It exposes the ASGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/4.2/howto/deployment/asgi/
"""
import os
from django.core.asgi import get_asgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'jyls_django.settings')
application = get_asgi_application()

34
jyls_django/middleware.py Normal file
View File

@@ -0,0 +1,34 @@
from django.http import HttpResponse, JsonResponse
from django.utils.deprecation import MiddlewareMixin
from rest_framework import status
from User.models import User
cnt = 0
class JWTAuthenticationMiddleware(MiddlewareMixin):
def process_request(self, request):
if request.method == 'OPTIONS':
return None
token = request.META.get('HTTP_AUTHORIZATION')
request.META['token'] = token
if request.path == '/user/login':
return None
try:
if not token:
return JsonResponse(
{'status': 401,'message':"token为空"},
status=401,
content_type='application/json',
headers={'Access-Control-Allow-Origin': '*'}
)
User.objects.get(token=token)
except User.DoesNotExist:
return JsonResponse(
{'status': 401,'message':"token异常"},
status=401,
content_type='application/json',
headers={'Access-Control-Allow-Origin': '*'}
)
return None

153
jyls_django/settings.py Normal file
View File

@@ -0,0 +1,153 @@
"""
Django settings for jyls_django project.
Generated by 'django-admin startproject' using Django 4.2.25.
For more information on this file, see
https://docs.djangoproject.com/en/4.2/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/4.2/ref/settings/
"""
from pathlib import Path
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/4.2/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'django-insecure-kml=6w!m*93*8sok7k_6-7937*_6c45(_jf)%a884ruxk9gtq4'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = ['*']
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'User',
"finance",
"business",
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
"jyls_django.middleware.JWTAuthenticationMiddleware",
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'jyls_django.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'jyls_django.wsgi.application'
# Database
# https://docs.djangoproject.com/en/4.2/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'jzls',
'USER': 'jzls',
'PASSWORD': 'Ls123456',
'HOST': '47.108.113.7',
'PORT': '3306',
'OPTIONS': {
'charset': 'utf8',
},
'POOL_OPTIONS': {
'POOL_SIZE': 5, # 连接池的初始大小
'MAX_OVERFLOW': 10, # 连接池允许的最大额外连接数
'RECYCLE': 3600, # 连接的最大存活时间(秒),超过该时间连接将被回收
}
}
}
# Password validation
# https://docs.djangoproject.com/en/4.2/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/4.2/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/4.2/howto/static-files/
STATIC_URL = 'static/'
# Default primary key field type
# https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
# 七牛云存储
QINIU_ACCESS_KEY = 'CB8j8D9voknWUVendxZi4h-LERDfD0XU3IXtSeEu'
QINIU_SECRET_KEY = 'I3uaom2fiWMBNZQpOIQCdi0N7x1V13hNJBfSmO0C' # 待修改
QINIU_BUCKET_NAME = 'shuju9'
QINIU_DOMAIN = 'lyamcn.com'
# 使用七牛云作为默认文件存储后端
DEFAULT_FILE_STORAGE = 'qiniu_storage.storage.QiniuStorage'
QINIU_STORAGE_OPTIONS = {
'access_key': QINIU_ACCESS_KEY,
'secret_key': QINIU_SECRET_KEY,
'bucket_name': QINIU_BUCKET_NAME,
'bucket_domain': QINIU_DOMAIN,
}

25
jyls_django/urls.py Normal file
View File

@@ -0,0 +1,25 @@
"""
URL configuration for jyls_django project.
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/4.2/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.urls import path, include
from django.urls import path, include
urlpatterns = [
path('user/',include("User.urls")),
path("finance/",include("finance.urls")),
path('business/', include("business.urls")),
]

16
jyls_django/wsgi.py Normal file
View File

@@ -0,0 +1,16 @@
"""
WSGI config for jyls_django project.
It exposes the WSGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/4.2/howto/deployment/wsgi/
"""
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'jyls_django.settings')
application = get_wsgi_application()

22
manage.py Normal file
View File

@@ -0,0 +1,22 @@
#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys
def main():
"""Run administrative tasks."""
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'jyls_django.settings')
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
) from exc
execute_from_command_line(sys.argv)
if __name__ == '__main__':
main()

BIN
requirements.txt Normal file

Binary file not shown.

74
utility/utility.py Normal file
View File

@@ -0,0 +1,74 @@
import oss2
from pathlib import Path
import os
import uuid
def flies(file):
file_urls = []
for file_url in file:
url = upload_file(file_url)
print(url)
file_urls.append(url)
return file_urls
def upload_file(file_path):
local_file_path = f'temp/{file_path.name}'
try:
os.makedirs(os.path.dirname(local_file_path), exist_ok=True)
with open(local_file_path, 'wb+') as destination:
for chunk in file_path.chunks():
destination.write(chunk)
endpoint = 'https://oss-cn-beijing.aliyuncs.com'
access_key_id = "LTAI5tRMxrM95Pi8JEEmqRcg"
access_key_secret = "8vueGCsRVeFyQMcAA7sysO7LSnuJDG"
if not access_key_id or not access_key_secret:
print('❌ 错误: 未找到有效的 OSS 访问密钥,请检查环境变量。')
return None
# 生成唯一 Bucket 名称
bucket_name = f'oss-bucket-yj'
print(f"创建 Bucket: {bucket_name}")
# 初始化 Bucket 对象
auth = oss2.Auth(access_key_id, access_key_secret)
bucket = oss2.Bucket(auth, endpoint, bucket_name)
try:
# 1. 创建 Bucket
bucket.create_bucket(oss2.models.BUCKET_ACL_PUBLIC_READ) # 设置 Bucket 为公共读权限
print(f'✅ 成功创建 Bucket: {bucket_name}')
except oss2.exceptions.BucketAlreadyExists:
print(f'⚠️ Bucket {bucket_name} 已经存在')
print('提示:请使用不同的 Bucket 名称或使用现有 Bucket')
except oss2.exceptions.OssError as e:
print(f'❌ OSS 错误: {e}')
print(f' 错误码: {e.code}')
print(f' 请求 ID: {e.request_id}')
return None
# 2. 验证本地文件是否存在
if not Path(local_file_path).exists():
print(f'❌ 文件错误: 本地文件 {local_file_path} 不存在')
return None
file_name = os.path.basename(local_file_path)
oss_object_name = uuid.uuid4().hex[:12] + file_name
result = bucket.put_object_from_file(oss_object_name, local_file_path)
if result.status == 200:
# 生成长期可访问的 URL
public_url = f'https://{bucket_name}.{endpoint.replace("https://", "")}/{oss_object_name}'
return public_url
else:
return None
except Exception as e:
print(e)
finally:
try:
# 清理临时文件
if os.path.exists(local_file_path):
os.remove(local_file_path)
except Exception as e:
pass