commit b891d2369bd73fc5d0a3a3958f2b5ad3123a5e20 Author: Administrator Date: Wed Dec 24 13:51:20 2025 +0800 gagreg diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1322cb7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.idea +.git +.log +.venv +__pycache__ \ No newline at end of file diff --git a/User/__init__.py b/User/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/User/admin.py b/User/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/User/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/User/apps.py b/User/apps.py new file mode 100644 index 0000000..9edbb3f --- /dev/null +++ b/User/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class UserConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'User' diff --git a/User/migrations/0001_initial.py b/User/migrations/0001_initial.py new file mode 100644 index 0000000..8a077bd --- /dev/null +++ b/User/migrations/0001_initial.py @@ -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()), + ], + ), + ] diff --git a/User/migrations/0002_approval_user_salary.py b/User/migrations/0002_approval_user_salary.py new file mode 100644 index 0000000..774ef50 --- /dev/null +++ b/User/migrations/0002_approval_user_salary.py @@ -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, + ), + ] diff --git a/User/migrations/0003_user_state.py b/User/migrations/0003_user_state.py new file mode 100644 index 0000000..233f974 --- /dev/null +++ b/User/migrations/0003_user_state.py @@ -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, + ), + ] diff --git a/User/migrations/0004_alter_user_confirmationtime_and_more.py b/User/migrations/0004_alter_user_confirmationtime_and_more.py new file mode 100644 index 0000000..5c1ab17 --- /dev/null +++ b/User/migrations/0004_alter_user_confirmationtime_and_more.py @@ -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), + ), + ] diff --git a/User/migrations/0005_user_token.py b/User/migrations/0005_user_token.py new file mode 100644 index 0000000..5640f03 --- /dev/null +++ b/User/migrations/0005_user_token.py @@ -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, + ), + ] diff --git a/User/migrations/0006_alter_user_salary.py b/User/migrations/0006_alter_user_salary.py new file mode 100644 index 0000000..c4e6bd0 --- /dev/null +++ b/User/migrations/0006_alter_user_salary.py @@ -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), + ), + ] diff --git a/User/migrations/0007_alter_user_token.py b/User/migrations/0007_alter_user_token.py new file mode 100644 index 0000000..e9d70b8 --- /dev/null +++ b/User/migrations/0007_alter_user_token.py @@ -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(), + ), + ] diff --git a/User/migrations/0008_department.py b/User/migrations/0008_department.py new file mode 100644 index 0000000..eafe778 --- /dev/null +++ b/User/migrations/0008_department.py @@ -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)), + ], + ), + ] diff --git a/User/migrations/0009_alter_approval_completetiem.py b/User/migrations/0009_alter_approval_completetiem.py new file mode 100644 index 0000000..e49b9d0 --- /dev/null +++ b/User/migrations/0009_alter_approval_completetiem.py @@ -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), + ), + ] diff --git a/User/migrations/0010_approval_user_id.py b/User/migrations/0010_approval_user_id.py new file mode 100644 index 0000000..27a4d34 --- /dev/null +++ b/User/migrations/0010_approval_user_id.py @@ -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, + ), + ] diff --git a/User/migrations/0011_user_role_alter_user_department.py b/User/migrations/0011_user_role_alter_user_department.py new file mode 100644 index 0000000..f4bd1b1 --- /dev/null +++ b/User/migrations/0011_user_role_alter_user_department.py @@ -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'), + ), + ] diff --git a/User/migrations/0012_remove_user_department_remove_user_role_and_more.py b/User/migrations/0012_remove_user_department_remove_user_role_and_more.py new file mode 100644 index 0000000..8c0a822 --- /dev/null +++ b/User/migrations/0012_remove_user_department_remove_user_role_and_more.py @@ -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'), + ), + ] diff --git a/User/migrations/__init__.py b/User/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/User/models.py b/User/models.py new file mode 100644 index 0000000..3786064 --- /dev/null +++ b/User/models.py @@ -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 + + diff --git a/User/tests.py b/User/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/User/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/User/urls.py b/User/urls.py new file mode 100644 index 0000000..9d8f20d --- /dev/null +++ b/User/urls.py @@ -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'), +] \ No newline at end of file diff --git a/User/views.py b/User/views.py new file mode 100644 index 0000000..4863325 --- /dev/null +++ b/User/views.py @@ -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) + + diff --git a/business/__init__.py b/business/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/business/admin.py b/business/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/business/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/business/apps.py b/business/apps.py new file mode 100644 index 0000000..675aaf6 --- /dev/null +++ b/business/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class BusinessConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'business' diff --git a/business/migrations/0001_initial.py b/business/migrations/0001_initial.py new file mode 100644 index 0000000..9d132c1 --- /dev/null +++ b/business/migrations/0001_initial.py @@ -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)), + ], + ), + ] diff --git a/business/migrations/0002_projectregistration.py b/business/migrations/0002_projectregistration.py new file mode 100644 index 0000000..327b217 --- /dev/null +++ b/business/migrations/0002_projectregistration.py @@ -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)), + ], + ), + ] diff --git a/business/migrations/0003_remove_prefiling_client_card_and_more.py b/business/migrations/0003_remove_prefiling_client_card_and_more.py new file mode 100644 index 0000000..55e5632 --- /dev/null +++ b/business/migrations/0003_remove_prefiling_client_card_and_more.py @@ -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', + ), + ] diff --git a/business/migrations/0004_projectregistration_state.py b/business/migrations/0004_projectregistration_state.py new file mode 100644 index 0000000..3fc4eee --- /dev/null +++ b/business/migrations/0004_projectregistration_state.py @@ -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, + ), + ] diff --git a/business/migrations/0005_bid_alter_projectregistration_client_info_and_more.py b/business/migrations/0005_bid_alter_projectregistration_client_info_and_more.py new file mode 100644 index 0000000..09f1a3c --- /dev/null +++ b/business/migrations/0005_bid_alter_projectregistration_client_info_and_more.py @@ -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(), + ), + ] diff --git a/business/migrations/0006_bid_user_projectregistration_user.py b/business/migrations/0006_bid_user_projectregistration_user.py new file mode 100644 index 0000000..f1cb64d --- /dev/null +++ b/business/migrations/0006_bid_user_projectregistration_user.py @@ -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, + ), + ] diff --git a/business/migrations/0007_remove_projectregistration_client_info_and_more.py b/business/migrations/0007_remove_projectregistration_client_info_and_more.py new file mode 100644 index 0000000..b1cfca9 --- /dev/null +++ b/business/migrations/0007_remove_projectregistration_client_info_and_more.py @@ -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, + ), + ] diff --git a/business/migrations/0008_remove_bid_type2_remove_projectregistration_type2.py b/business/migrations/0008_remove_bid_type2_remove_projectregistration_type2.py new file mode 100644 index 0000000..5df7a2d --- /dev/null +++ b/business/migrations/0008_remove_bid_type2_remove_projectregistration_type2.py @@ -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', + ), + ] diff --git a/business/migrations/0009_invoice_caselog_case.py b/business/migrations/0009_invoice_caselog_case.py new file mode 100644 index 0000000..b2f7f4d --- /dev/null +++ b/business/migrations/0009_invoice_caselog_case.py @@ -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')), + ], + ), + ] diff --git a/business/migrations/0010_caselog_file.py b/business/migrations/0010_caselog_file.py new file mode 100644 index 0000000..65b5253 --- /dev/null +++ b/business/migrations/0010_caselog_file.py @@ -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, + ), + ] diff --git a/business/migrations/0011_case_state.py b/business/migrations/0011_case_state.py new file mode 100644 index 0000000..1db82b5 --- /dev/null +++ b/business/migrations/0011_case_state.py @@ -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, + ), + ] diff --git a/business/migrations/0012_sealapplication.py b/business/migrations/0012_sealapplication.py new file mode 100644 index 0000000..c9b5daa --- /dev/null +++ b/business/migrations/0012_sealapplication.py @@ -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)), + ], + ), + ] diff --git a/business/migrations/0013_sealapplication_username.py b/business/migrations/0013_sealapplication_username.py new file mode 100644 index 0000000..ae2b37e --- /dev/null +++ b/business/migrations/0013_sealapplication_username.py @@ -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, + ), + ] diff --git a/business/migrations/0014_warehousing.py b/business/migrations/0014_warehousing.py new file mode 100644 index 0000000..27fe71a --- /dev/null +++ b/business/migrations/0014_warehousing.py @@ -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)), + ], + ), + ] diff --git a/business/migrations/0015_registerplatform.py b/business/migrations/0015_registerplatform.py new file mode 100644 index 0000000..8c82bc2 --- /dev/null +++ b/business/migrations/0015_registerplatform.py @@ -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)), + ], + ), + ] diff --git a/business/migrations/0016_announcement.py b/business/migrations/0016_announcement.py new file mode 100644 index 0000000..9c7cdca --- /dev/null +++ b/business/migrations/0016_announcement.py @@ -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)), + ], + ), + ] diff --git a/business/migrations/0017_lawyerflie.py b/business/migrations/0017_lawyerflie.py new file mode 100644 index 0000000..07613ac --- /dev/null +++ b/business/migrations/0017_lawyerflie.py @@ -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()), + ], + ), + ] diff --git a/business/migrations/0018_lawyerflie_times.py b/business/migrations/0018_lawyerflie_times.py new file mode 100644 index 0000000..0c115f4 --- /dev/null +++ b/business/migrations/0018_lawyerflie_times.py @@ -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, + ), + ] diff --git a/business/migrations/0019_schedule.py b/business/migrations/0019_schedule.py new file mode 100644 index 0000000..929911d --- /dev/null +++ b/business/migrations/0019_schedule.py @@ -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)), + ], + ), + ] diff --git a/business/migrations/0020_role.py b/business/migrations/0020_role.py new file mode 100644 index 0000000..42c9761 --- /dev/null +++ b/business/migrations/0020_role.py @@ -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)), + ], + ), + ] diff --git a/business/migrations/0021_lawyerflie_title.py b/business/migrations/0021_lawyerflie_title.py new file mode 100644 index 0000000..1f01057 --- /dev/null +++ b/business/migrations/0021_lawyerflie_title.py @@ -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, + ), + ] diff --git a/business/migrations/0022_permission.py b/business/migrations/0022_permission.py new file mode 100644 index 0000000..5a91993 --- /dev/null +++ b/business/migrations/0022_permission.py @@ -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)), + ], + ), + ] diff --git a/business/migrations/0023_permission_parent.py b/business/migrations/0023_permission_parent.py new file mode 100644 index 0000000..67c1e0c --- /dev/null +++ b/business/migrations/0023_permission_parent.py @@ -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, + ), + ] diff --git a/business/migrations/0024_role_remark.py b/business/migrations/0024_role_remark.py new file mode 100644 index 0000000..a385b48 --- /dev/null +++ b/business/migrations/0024_role_remark.py @@ -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, + ), + ] diff --git a/business/migrations/__init__.py b/business/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/business/models.py b/business/models.py new file mode 100644 index 0000000..d18f59d --- /dev/null +++ b/business/models.py @@ -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) # 父级 diff --git a/business/tests.py b/business/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/business/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/business/urls.py b/business/urls.py new file mode 100644 index 0000000..9b273d4 --- /dev/null +++ b/business/urls.py @@ -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") +] \ No newline at end of file diff --git a/business/views.py b/business/views.py new file mode 100644 index 0000000..b7419a6 --- /dev/null +++ b/business/views.py @@ -0,0 +1,1339 @@ +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 +from .models import PreFiling,ProjectRegistration,Bid,Case,Invoice,Caselog,SealApplication,Warehousing,RegisterPlatform,Announcement,LawyerFlie,Schedule,permission,role +from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger +from utility.utility import flies +from datetime import datetime + + +from django.db.models import Count, Q + +class registration(APIView): + def post(self,request,*args,**kwargs): + """ + 预立案登记 + :param request: + :param args: + :param kwargs: + :return: + """ + token = request.META.get('token') + times = request.data.get('times') + client_username = request.data.get('client_username') + party_username = request.data.get('party_username') + description = request.data.get('description') + Undertaker = request.data.get('Undertaker') + user = User.objects.get(token=token).username + if not all([times,description,Undertaker]): + return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) + + PreFiling.objects.create( + times=times, + client_username=client_username, + party_username=party_username, + description=description, + Undertaker=Undertaker, + submit=user + ) + return Response({'message': '登记成功', 'code': 0}, status=status.HTTP_200_OK) + +class registrationList(APIView): + def post(self,request,*args,**kwargs): + """ + 预立案登记列表接口 + :param request: + :param args: + :param kwargs: + :return: + """ + project_registration_ids = ProjectRegistration.objects.values_list('user_id', flat=True) + + + bid_ids = Bid.objects.values_list('user_id', flat=True) + associated_ids = project_registration_ids.union(bid_ids) + prefiling_without_association = PreFiling.objects.exclude(id__in=associated_ids) + data = [] + for prefiling in prefiling_without_association: + data.append({ + "id": prefiling.id, + "client_username": prefiling.client_username, + "party_username": prefiling.party_username, + }) + return Response({'message': '展示成功','data':data, 'code': 0}, status=status.HTTP_200_OK) + + +class registrationDetail(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') + times = request.data.get('times') + end_time = request.data.get('end_time') + Undertaker = request.data.get('Undertaker') + 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 Undertaker: + Q_obj &= Q(Undertaker__icontains=Undertaker) + + pre = PreFiling.objects.filter(Q_obj) + total = len(pre) + + paginator = Paginator(pre, 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, + 'times': info.times, + "client_username": info.client_username, + "party_username": info.party_username, + "description": info.description, + "Undertaker": info.Undertaker, + }) + + return Response({'message': '展示成功',"total":total,'data':data, 'code': 0}, status=status.HTTP_200_OK) + +class Project(APIView): + def post(self,request,*args,**kwargs): + """ + 立项登记 + :param request: + :param args: + :param kwargs: + :return: + """ + type = request.data.get('type') + ContractNo = request.data.get('ContractNo') + times = request.data.get('times') + responsiblefor = request.data.get('responsiblefor') + charge = request.data.get('charge') + contract = request.FILES.getlist('contract') + personincharge = request.data.get('personincharge') + + id = request.data.get('user_id') + import datetime + + if contract: + contract = flies(contract) + + pro = ProjectRegistration.objects.create( + type=type, + ContractNo=ContractNo, + times=times, + responsiblefor=responsiblefor, + charge=charge, + contract=json.dumps(contract), + state="审核中", + user_id=id, + + ) + + today = datetime.datetime.now() + formatted_date = today.strftime("%Y-%m-%d") + Approval.objects.create( + title=responsiblefor + "立项登记", + content=responsiblefor + "在" + times + "办理立项登记,项目类型:" + type + ",合同编号:" + ContractNo + "描述:"+",负责人:"+responsiblefor+",收费情况:"+charge, + times=formatted_date, + personincharge=personincharge, + state='审核中', + type="立项登记", + user_id=pro.id + ) + return Response({'message': '登记成功', 'code': 0}, status=status.HTTP_200_OK) + + +class Projectquerytype(APIView): + def post(self,request,*args,**kwargs): + """ + 立项登记类型查询 + :param request: + :param args: + :param kwargs: + :return: + """ + # 获取当前年份 + current_year = datetime.now().year + + # 今年的开始时间 + start_of_year = datetime(current_year, 1, 1) + + # 今年的结束时间 + end_of_year = datetime(current_year, 12, 31) + + # 格式化结果 + start_of_year_str = start_of_year.strftime("%Y-%m-%d") + end_of_year_str = end_of_year.strftime("%Y-%m-%d") + type = request.data.get('type') + count = ProjectRegistration.objects.filter(type=type,times__gte=start_of_year_str,times__lte=end_of_year_str).count() + data = { + "count": count + } + return Response({'message': '查询成功',"data":data, 'code': 0}, status=status.HTTP_200_OK) + + +class ProjectDetail(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') + times = request.data.get('times') + end_time = request.data.get('end_time') + client_username = request.data.get('client_username') + party_username = request.data.get('party_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 client_username: + pre = PreFiling.objects.filter(client_username__icontains=client_username) + pre_id = pre.values_list('id', flat=True) + Q_obj &= Q(user_id__in=pre_id) + if party_username: + pre = PreFiling.objects.filter(party_username__icontains=party_username) + pre_id = pre.values_list('id', flat=True) + Q_obj &= Q(user_id__in=pre_id) + + + pre = ProjectRegistration.objects.filter(Q_obj) + total = len(pre) + + paginator = Paginator(pre, 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: + pre = PreFiling.objects.get(id=info.user_id) + data.append({ + "id": info.id, + 'times': info.times, + "type": info.type, + "ContractNo": info.ContractNo, + "responsiblefor": info.responsiblefor, + "charge": info.charge, + "contract": info.contract, + "state": info.state, + "user_id": info.user_id, + "client_username": pre.client_username, + "party_username": pre.party_username, + "description": pre.description, + }) + + return Response({'message': '展示成功', "total": total, 'data': data, 'code': 0}, status=status.HTTP_200_OK) + +class EditProject(APIView): + def post(self,request,*args,**kwargs): + """ + 编辑立案登记 + :param request: + :param args: + :param kwargs: + :return: + """ + id = request.data.get('id') + type = request.data.get('type') + ContractNo = request.data.get('ContractNo') + times = request.data.get('times') + responsiblefor = request.data.get('responsiblefor') + charge = request.data.get('charge') + contract = request.FILES.getlist('contract') + personincharge = request.data.get('personincharge') + + pro = ProjectRegistration.objects.get(id=id) + import datetime + if contract: + contract = flies(contract) + pro.contract = json.dumps(contract) + pro.save(update_fields=['contract']) + pro.times = times + pro.type = type + + pro.responsiblefor = responsiblefor + pro.charge = charge + + pro.state ="审核中" + pro.save(update_fields=['ContractNo', 'times', 'type', 'responsiblefor', 'charge', 'state',"type2"]) + + today = datetime.datetime.now() + formatted_date = today.strftime("%Y-%m-%d") + Approval.objects.create( + title=responsiblefor + "立项登记重新编辑", + content=responsiblefor + "在" + times + "办理立项登记,项目类型:" + type + ",合同编号:" + ContractNo + "描述:"+ ",负责人:" + responsiblefor + ",收费情况:" + charge, + times=formatted_date, + personincharge=personincharge, + state='审核中', + type="立项登记", + user_id=pro.id + ) + + return Response({'message': '编辑成功', 'code': 0}, status=status.HTTP_200_OK) + +class BidRegistration(APIView): + def post(self,request,*args,**kwargs): + """ + 投标登记 + :param request: + :param args: + :param kwargs: + :return: + """ + BiddingUnit = request.data.get('BiddingUnit') + ProjectName = request.data.get('ProjectName') + times = request.data.get('times') + BiddingAnnouncement = request.FILES.getlist('BiddingAnnouncement') + personincharge = request.data.get('personincharge') + id = request.data.get('user_id') + if not all([BiddingUnit, ProjectName, times, personincharge,id]): + return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) + import datetime + bib = Bid.objects.create( + BiddingUnit=BiddingUnit, + ProjectName=ProjectName, + times=times, + BiddingAnnouncement=json.dumps(flies(BiddingAnnouncement)), + state="审核中", + user_id=id, + + ) + + today = datetime.datetime.now() + formatted_date = today.strftime("%Y-%m-%d") + Approval.objects.create( + title=ProjectName + "投标登记", + content="项目名称:"+ProjectName+",申请日期:"+times, + times=formatted_date, + personincharge=personincharge, + state='审核中', + type="投标登记", + user_id=bib.id + ) + return Response({'message': '登记成功', 'code': 0}, status=status.HTTP_200_OK) + +class BidDetail(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') + client_username = request.data.get('client_username') + party_username = request.data.get('party_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 client_username: + pre = PreFiling.objects.filter(client_username__icontains=client_username) + pre_id = pre.values_list('id', flat=True) + Q_obj &= Q(user_id__in=pre_id) + if party_username: + pre = PreFiling.objects.filter(party_username__icontains=party_username) + pre_id = pre.values_list('id', flat=True) + Q_obj &= Q(user_id__in=pre_id) + + + pre = Bid.objects.filter(Q_obj) + total = len(pre) + + paginator = Paginator(pre, 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: + pre = PreFiling.objects.get(id=info.user_id) + data.append({ + "id": info.id, + 'times': info.times, + "BiddingUnit": info.BiddingUnit, + "ProjectName": info.ProjectName, + "BiddingAnnouncement": info.BiddingAnnouncement, + "state": info.state, + "client_username": pre.client_username, + "party_username": pre.party_username, + "description": pre.description, + }) + + return Response({'message': '展示成功', "total": total, 'data': data, 'code': 0}, status=status.HTTP_200_OK) + + + +class caseManagement(APIView): + def post(self,request,*args,**kwargs): + """ + 案件管理版块 + :param request: + :param args: + :param kwargs: + :return: + """ + id = request.data.get('user_id') + times = request.data.get('times') + AgencyContract = request.FILES.getlist('AgencyContract') + Contractreturn = request.FILES.getlist('Contractreturn') + Closingapplication = request.FILES.getlist('Closingapplication') + ChangeRequest = request.data.get('ChangeRequest') + paymentcollection = request.data.get('paymentcollection') + + personincharge = request.data.get('personincharge') + + case = Case.objects.filter(user_id=id).first() + if not case: + case_id = Case.objects.create( + user_id=id, + times=times, + AgencyContract=json.dumps(flies(AgencyContract)), + Contractreturn=json.dumps(flies(Contractreturn)), + Closingapplication=json.dumps(flies(Closingapplication)), + ChangeRequest=ChangeRequest, + paymentcollection=paymentcollection, + state="审核中" + ) + + Approval.objects.create( + title="案件管理信息提交", + content=times+"提交了一份案件信息,请审核", + times=times, + personincharge=personincharge, + state='审核中', + type="案件管理", + user_id=case_id.id + ) + + else: + if times: + case.times = times + case.save(update_fields=['times']) + + if AgencyContract: + case.AgencyContract = json.dumps(flies(AgencyContract)) + case.save(update_fields=['AgencyContract']) + + if Contractreturn: + case.Contractreturn = json.dumps(flies(Contractreturn)) + case.save(update_fields=['Contractreturn']) + + if Closingapplication: + case.Closingapplication = json.dumps(flies(Closingapplication)) + case.save(update_fields=['Closingapplication']) + + if ChangeRequest: + case.ChangeRequest = ChangeRequest + case.state = "审核中" + Approval.objects.create( + title="案件管理信息提交", + content=times + "提交了一份案件信息,更改了变更申请", + times=times, + personincharge=personincharge, + state='审核中', + type="案件管理", + user_id=case.id + ) + case.save(update_fields=['ChangeRequest',"state"]) + if paymentcollection: + case.paymentcollection = paymentcollection + case.save(update_fields=['paymentcollection']) + + return Response({'message': '编辑成功', 'code': 0}, status=status.HTTP_200_OK) + +class caseManagementDetail(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') + times = request.data.get('times') + end_time = request.data.get('end_time') + type = request.data.get('type') + 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 type: + por_id = ProjectRegistration.objects.filter(type=type).values_list('user_id', flat=True) + Q_obj &= Q(user_id__in=por_id) + + # if client_username: + # pre = PreFiling.objects.filter(client_username__icontains=client_username) + # pre_id = pre.values_list('id', flat=True) + # Q_obj &= Q(user_id__in=pre_id) + # if party_username: + # pre = PreFiling.objects.filter(party_username__icontains=party_username) + # pre_id = pre.values_list('id', flat=True) + # Q_obj &= Q(user_id__in=pre_id) + + + pre = Case.objects.filter(Q_obj) + total = len(pre) + + paginator = Paginator(pre, 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: + pre = PreFiling.objects.get(id=info.user_id) + pro = ProjectRegistration.objects.get(user_id=info.user_id) + data.append({ + "id": info.id, + "ContractNo": pro.ContractNo, # 合同编号 + "type_pro": pro.type, # 项目类型 + "client_username": pre.client_username, # 委托人信息 + "party_username": pre.party_username, # 相对方信息 + "description": pre.description, # 项目简述 + "responsiblefor": pro.responsiblefor, # 负责人 + "charge": pro.charge, + 'times': info.times, + "AgencyContract": info.AgencyContract, + "Contractreturn": info.Contractreturn, + "Closingapplication": info.Closingapplication, + "ChangeRequest": info.ChangeRequest, + "paymentcollection": info.paymentcollection, + "state": info.state, + "user_id": info.user_id, + }) + + return Response({'message': '展示成功', "total": total, 'data': data, 'code': 0}, status=status.HTTP_200_OK) + +class Uploadinvoice(APIView): + def post(self,request,*args,**kwargs): + """案件管理发票""" + id = request.data.get('user_id') + amount = request.data.get('amount') + file = request.FILES.getlist('file') + if not id: + return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) + + Invoice.objects.create( + amount=amount, + file=json.dumps(flies(file)), + user_id=id, + ) + return Response({'message': '上传成功', 'code': 0}, status=status.HTTP_200_OK) + +class InvoiceDetail(APIView): + def post(self,request,*args,**kwargs): + """ + 发票展示 + :param request: + :param args: + :param kwargs: + :return: + """ + id = request.data.get('id') + if not id: + return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) + + invoices = Invoice.objects.filter(user_id=id) + data = [] + for invoice in invoices: + data.append({ + "id": invoice.id, + "amount": invoice.amount, + "file": invoice.file, + }) + return Response({'message': '展示成功', 'data': data, 'code': 0}, status=status.HTTP_200_OK) + +class Log(APIView): + def post(self,request,*args,**kwargs): + """ + 案件日志 + """ + token = request.META.get('token') + id = request.data.get('user_id') + content = request.data.get('content') + file = request.FILES.getlist('file') + + if not all([id,content]): + return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) + user = User.objects.get(token=token) + now = datetime.now() + date_str = now.strftime('%Y-%m-%d') + Caselog.objects.create( + user_id=id, + content=content, + file=json.dumps(flies(file)), + times = date_str, + username = user.username, + ) + return Response({'message': '添加成功', 'code': 0}, status=status.HTTP_200_OK) + +class LogDetail(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') + if not all([page, per_page]): + return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) + + pre = Caselog.objects.all() + total = len(pre) + + paginator = Paginator(pre, 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, + "content": info.content, # 合同编号 + "times": info.times, # 项目类型 + "username": info.username, + "file": info.file, + }) + + return Response({'message': '展示成功', "total": total, 'data': data, 'code': 0}, status=status.HTTP_200_OK) + +class accumulate(APIView): + def post(self,request,*args,**kwargs): + """ + 累加 + :param request: + :param args: + :param kwargs: + :return: + """ + user_id = request.data.get('user_id') + paymentcollection = request.data.get('paymentcollection') + case = Case.objects.get(user_id=user_id) + if case.paymentcollection == "": + number = 0 + else: + number = float(case.paymentcollection) + case.paymentcollection = float(number+float(paymentcollection)) + case.save(update_fields=['paymentcollection']) + + return Response({'message': '成功', 'code': 0}, status=status.HTTP_200_OK) + + +class preFilingLinkedCases(APIView): + def post(self,request,*args,**kwargs): + """ + 预立案关联立案列表接口 + :param request: + :param args: + :param kwargs: + :return: + """ + proa = ProjectRegistration.objects.all() + data = [] + for prefiling in proa: + pre = PreFiling.objects.get(id=prefiling.user_id) + data.append({ + "id": prefiling.user_id, + "client_username": pre.client_username, + "party_username": pre.party_username, + }) + return Response({'message': '展示成功', 'data': data, 'code': 0}, status=status.HTTP_200_OK) + +class Application(APIView): + def post(self,request,*args,**kwargs): + """ + 申请用印 + :param request: + :param args: + :param kwargs: + :return: + """ + token = request.META.get('token') + Printingpurpose = request.data.get('Printingpurpose') + CaseNumber = request.data.get('CaseNumber') + Reason = request.data.get('Reason') + seal_number = request.data.get('seal_number') + seal_type = request.data.get('seal_type') + file = request.FILES.getlist('file') + personincharge = request.data.get('personincharge') + + if not all([Printingpurpose,Reason,seal_number,seal_type,file,personincharge]): + return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) + now = datetime.now() + date_str = now.strftime('%Y-%m-%d') + user = User.objects.get(token=token) + sea = SealApplication.objects.create( + Printingpurpose=Printingpurpose, + CaseNumber=CaseNumber, + Reason=Reason, + seal_number=seal_number, + seal_type=seal_type, + file=json.dumps(flies(file)), + times=date_str, + state="审核中", + username=user.username, + ) + + Approval.objects.create( + title=user.username + "申请用印", + content=user.username + "在" + date_str + "申请用印,用印事由:" + Reason + ",盖章份数:" + seal_number + "盖着类型:" + seal_type, + times=date_str, + personincharge=personincharge, + state='审核中', + type="申请用印", + user_id=sea.id + ) + return Response({'message': '添加成功', 'code': 0}, status=status.HTTP_200_OK) + +class ApplicationDetail(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') + times = request.data.get('times') + end_time = request.data.get('end_time') + seal_type = request.data.get('seal_type') + 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 seal_type: + Q_obj &= Q(seal_type=seal_type) + + seas = SealApplication.objects.filter(Q_obj) + total = len(seas) + + paginator = Paginator(seas, 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, + "Printingpurpose": info.Printingpurpose, + "CaseNumber": info.CaseNumber, + "Reason": info.Reason, + "seal_number": info.seal_number, + "seal_type": info.seal_type, + "file": info.file, + 'times': info.times, + "state": info.state, + "username": info.username, + }) + + return Response({'message': '展示成功', "total": total, 'data': data, 'code': 0}, status=status.HTTP_200_OK) + +class WarehousingRegistration(APIView): + def post(self,request,*args,**kwargs): + """ + 入库登记 + :param request: + :param args: + :param kwargs: + :return: + """ + unit = request.data.get('unit') + mark = request.data.get('mark') + lawyer = request.data.get('lawyer') + deadline = request.data.get('deadline') + contract = request.FILES.getlist('contract') + + if not all([unit, mark, lawyer, deadline, contract]): + return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) + now = datetime.now() + date_str = now.strftime('%Y-%m-%d') + Warehousing.objects.create( + unit=unit, + mark=mark, + lawyer=lawyer, + deadline=deadline, + contract=json.dumps(flies(contract)), + times=date_str, + ) + return Response({'message': '添加成功', 'code': 0}, status=status.HTTP_200_OK) + +class WarehousingDetail(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') + 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) + + seas = Warehousing.objects.filter(Q_obj) + total = len(seas) + + paginator = Paginator(seas, 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, + "unit": info.unit, + "mark": info.mark, + "lawyer": info.lawyer, + "deadline": info.deadline, + "contract": info.contract, + "times": info.times, + }) + + return Response({'message': '展示成功', "total": total, 'data': data, 'code': 0}, status=status.HTTP_200_OK) + +class PlatformRegistration(APIView): + def post(self,request,*args,**kwargs): + """ + 注册平台登记 + :param request: + :param args: + :param kwargs: + :return: + """ + platform = request.data.get('platform') + number = request.data.get('number') + password = request.data.get('password') + username = request.data.get('username') + + if not all([platform, number, password, username]): + return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) + RegisterPlatform.objects.create( + platform=platform, + number=number, + password=password, + username=username, + ) + return Response({'message': '添加成功', 'code': 0}, status=status.HTTP_200_OK) + +class PlatformDetail(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') + seas = RegisterPlatform.objects.all() + total = len(seas) + + paginator = Paginator(seas, 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, + "platform": info.platform, + "number": info.number, + "password": info.password, + "username": info.username, + }) + + return Response({'message': '展示成功', "total": total, 'data': data, 'code': 0}, status=status.HTTP_200_OK) + +class EditPlatformDetail(APIView): + def post(self,request,*args,**kwargs): + """ + 注册平台登记编辑 + :param request: + :param args: + :param kwargs: + :return: + """ + ID = request.data.get('id') + platform = request.data.get('platform') + number = request.data.get('number') + password = request.data.get('password') + username = request.data.get('username') + + if not all([platform, number, password, username,ID]): + return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) + reg = RegisterPlatform.objects.get(id=ID) + reg.platform = platform + reg.number = number + reg.password = password + reg.username = username + reg.save(update_fields=['platform', 'number', 'password', 'username']) + return Response({'message': '修改成功', 'code': 0}, status=status.HTTP_200_OK) + +class DeletePlatformDetail(APIView): + def post(self,request,*args,**kwargs): + """ + 删除注册平台登记 + :param request: + :param args: + :param kwargs: + :return: + """ + ID = request.data.get('id') + RegisterPlatform.objects.get(id=ID).delete() + return Response({'message': '删除成功', 'code': 0}, status=status.HTTP_200_OK) + +class bulletin(APIView): + def post(self,request,*args,**kwargs): + """ + 公告 + :param request: + :param args: + :param kwargs: + :return: + """ + title = request.data.get('title') + content = request.data.get('content') + file = request.FILES.getlist('file') + state = request.data.get('state') + token = request.META.get('token') + + if not all([title, content]): + return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) + now = datetime.now() + date_str = now.strftime('%Y-%m-%d') + bol = 0 + if state == "置顶": + bol = 1 + + user = User.objects.get(token=token).username + Announcement.objects.create( + title=title, + content=content, + file=json.dumps(flies(file)), + username=user, + times=date_str, + state=bol + ) + return Response({'message': '添加成功', 'code': 0}, status=status.HTTP_200_OK) + +class BulletinDetail(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') + seas = Announcement.objects.all().order_by('-state', '-times') + total = len(seas) + + paginator = Paginator(seas, 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, + "title": info.title, + "content": info.content, + "times": info.times, + "file": info.file, + "username": info.username, + "state": info.state, + }) + + return Response({'message': '展示成功', "total": total, 'data': data, 'code': 0}, status=status.HTTP_200_OK) + +class EditBulletin(APIView): + def post(self, request, *args, **kwargs): + """ + 编辑公告 + :param request: + :param args: + :param kwargs: + :return: + """ + ID = request.data.get('id') + title = request.data.get('title') + content = request.data.get('content') + file = request.FILES.getlist('file') + state = request.data.get('state') + token = request.META.get('HTTP_AUTHORIZATION') + + if not all([title, content, ID]): + return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) + + now = datetime.now() + date_str = now.strftime('%Y-%m-%d') + ann = Announcement.objects.get(id=ID) + + if state: + bol = 0 + if state == "置顶": + bol = 1 + ann.state = bol + ann.save(update_fields=['state']) + + user = User.objects.get(token=token).username + if title: + ann.title = title # 去掉多余的逗号 + ann.save(update_fields=['title']) + if content: + ann.content = content # 去掉多余的逗号 + ann.save(update_fields=['content']) + if file: + ann.file = json.dumps([f.name for f in file]) # 假设你想保存文件名列表 + ann.save(update_fields=['file']) + + ann.username = user # 去掉多余的逗号 + ann.times = date_str # 去掉多余的逗号 + + ann.save(update_fields=['username', 'times']) + return Response({'message': '添加成功', 'code': 0}, status=status.HTTP_200_OK) + +class deleteBulletin(APIView): + def post(self,request,*args,**kwargs): + ID = request.data.get('id') + Announcement.objects.get(id=ID).delete() + return Response({'message': '删除成功', 'code': 0}, status=status.HTTP_200_OK) + + +class Lawyersdocuments(APIView): + def post(self,request,*args,**kwargs): + title = request.data.get('title') + file = request.FILES.getlist('file') + remark = request.data.get('remark') + + if not all([title, file]): + return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) + now = datetime.now() + date_str = now.strftime('%Y-%m-%d') + LawyerFlie.objects.create( + title=title, + remark=remark, + file=json.dumps(flies(file)), + times=date_str, + ) + return Response({'message': '文件上传成功', 'code': 0}, status=status.HTTP_200_OK) + +class LawyersdocumentsDetail(APIView): + def post(self,request,*args,**kwargs): + law = LawyerFlie.objects.all().order_by('-times') + total = law.count() + data = [] + for info in law: + data.append({ + "id": info.id, + "title": info.title, + "remark": info.remark, + "file": info.file, + "times": info.times, + }) + + return Response({'message': '展示成功', "total": total, 'data': data, 'code': 0}, status=status.HTTP_200_OK) + + +class LwaDetail(APIView): + def post(self,request,*args,**kwargs): + id = request.data.get('id') + LawyerFlie.objects.get(id=id).delete() + return Response({'message': '删除成功', 'code': 0}, status=status.HTTP_200_OK) + +class CreateSchedule(APIView): + def post(self,request,*args,**kwargs): + """ + 日常创建 + :param request: + :param args: + :param kwargs: + :return: + """ + title = request.data.get('title') + tiems = request.data.get('tiems') + end_time = request.data.get('end_time') + remark = request.data.get('remark') + + if not all([title, tiems, end_time]): + return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) + Schedule.objects.create( + title=title, + tiems=tiems, + end_time=end_time, + remark=remark, + state="未完成" + ) + return Response({'message': '添加成功', 'code': 0}, status=status.HTTP_200_OK) + +class DeleteSchedule(APIView): + def post(self,request,*args,**kwargs): + id = request.data.get('id') + Schedule.objects.get(id=id).delete() + return Response({'message': '删除成功', 'code': 0}, status=status.HTTP_200_OK) + + +class ScheduleDetail(APIView): + def post(self,request,*args,**kwargs): + """ + 日程展示 + :param request: + :param args: + :param kwargs: + :return: + """ + sches = Schedule.objects.filter(state="未完成") + page = request.data.get('page') + per_page = request.data.get('per_page') + total = len(sches) + + paginator = Paginator(sches, 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, + "title": info.title, + "tiems": info.tiems, + "end_time": info.end_time, + "remark": info.remark, + 'state': info.state, + }) + return Response({'message': '展示成功', "total": total, 'data': data, 'code': 0}, status=status.HTTP_200_OK) + +class handleSchedule(APIView): + def post(self,request,*args,**kwargs): + id = request.data.get('id') + state = request.data.get('state') + if not all([id, state]): + return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) + sc = Schedule.objects.get(id=id) + sc.state=state + sc.save(update_fields=['state']) + return Response({'message': '修改成功', 'code': 0}, status=status.HTTP_200_OK) + +class AddRermission(APIView): + """ + 添加权限 + """ + def post(self,request,*args,**kwargs): + permission_name = request.data.get('permission_name') + permission_logo = request.data.get('permission_logo') + parent = request.data.get('parent') + if not all([permission_name,permission_logo,parent]): + return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) + permission.objects.create( + permission_name=permission_name, + permission_logo=permission_logo, + parent=parent, + ) + return Response({'message': '添加成功', 'code': 0}, status=status.HTTP_200_OK) + +class DisplayRermission(APIView): + def post(self,request,*args,**kwargs): + permissions = permission.objects.all() + + # 先将数据转换为字典格式 + data = [] + permission_dict = {} + + for per in permissions: + item = { + "id": str(per.id), + "permission_name": per.permission_name, + "permission_logo": per.permission_logo, + "parent": str(per.parent), + "children": [] + } + data.append(item) + permission_dict[str(per.id)] = item + + # 构建树形结构 + tree = [] + for item in data: + parent_id = item["parent"] + + # 如果parent是0或者不存在,说明是根节点 + if parent_id == "0" or parent_id not in permission_dict: + tree.append(item) + else: + # 找到父节点并添加到children中 + parent_node = permission_dict.get(parent_id) + if parent_node: + parent_node["children"].append(item) + + return Response({ + 'message': '展示成功', + "data": tree, + 'code': 0 + }, status=status.HTTP_200_OK) +class DeleteRermission(APIView): + def post(self,request,*args,**kwargs): + ID = request.data.get('id') + permission.objects.get(id=ID).delete() + return Response({'message': '删除成功', 'code': 0}, status=status.HTTP_200_OK) + +class EditRermission(APIView): + def post(self,request,*args,**kwargs): + id = request.data.get('id') + permission_name = request.data.get('permission_name') + permission_logo = request.data.get('permission_logo') + parent = request.data.get('parent') + per = permission.objects.get(id=id) + if permission_name: + per.permission_name = permission_name + per.save(update_fields=['permission_name']) + if permission_logo: + per.permission_logo = permission_logo + per.save(update_fields=['permission_logo']) + if parent: + per.parent = parent + per.save(update_fields=['parent']) + return Response({'message': '修改成功', 'code': 0}, status=status.HTTP_200_OK) + +class addRole(APIView): + def post(self,request,*args,**kwargs): + RoleName = request.data.get('RoleName') + remark = request.data.get('remark') + if not all([RoleName]): + return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) + + role.objects.create(RoleName=RoleName,remark=remark) + return Response({'message': '添加成功', 'code': 0}, status=status.HTTP_200_OK) + +class DeleteRole(APIView): + def post(self,request,*args,**kwargs): + id = request.data.get('id') + role.objects.get(id=id).delete() + return Response({'message': '删除成功', 'code': 0}, status=status.HTTP_200_OK) + + +class EditRole(APIView): + def post(self,request,*args,**kwargs): + id = request.data.get('id') + RoleName = request.data.get('RoleName') + remark = request.data.get('remark') + if not all([id]): + return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) + + ro = role.objects.get(id=id) + if RoleName: + ro.RoleName = RoleName + ro.save(update_fields=['RoleName']) + if remark: + ro.remark = remark + ro.save(update_fields=['remark']) + return Response({'message': '编辑成功', 'code': 0}, status=status.HTTP_200_OK) + +class displayRole(APIView): + def post(self,request,*args,**kwargs): + RoleName = request.data.get('RoleName') + obj = Q() + if RoleName: + obj = Q(RoleName__icontains=RoleName) + roles = role.objects.filter(obj) + data = [] + for ro in roles: + data.append({ + "id": str(ro.id), + "role_name": ro.RoleName, + "remark": ro.remark, + }) + return Response({'message': '展示成功','data' :data,'code': 0}, status=status.HTTP_200_OK) + +class modifypermissions(APIView): + def post(self,request,*args,**kwargs): + id = request.data.get('id') + permissionId = request.data.get('permissionId') + if not all([id,permissionId]): + return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) + permissionId = ast.literal_eval(permissionId) + ro = role.objects.get(id=id) + ro.permissionId = permissionId + ro.save(update_fields=['permissionId']) + + return Response({'message': '权限修改成功', 'code': 0}, status=status.HTTP_200_OK) + diff --git a/finance/__init__.py b/finance/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/finance/admin.py b/finance/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/finance/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/finance/apps.py b/finance/apps.py new file mode 100644 index 0000000..53023d8 --- /dev/null +++ b/finance/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class FinanceConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'finance' diff --git a/finance/migrations/0001_initial.py b/finance/migrations/0001_initial.py new file mode 100644 index 0000000..bd9fb2a --- /dev/null +++ b/finance/migrations/0001_initial.py @@ -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)), + ], + ), + ] diff --git a/finance/migrations/0002_invoice_times.py b/finance/migrations/0002_invoice_times.py new file mode 100644 index 0000000..f7a5052 --- /dev/null +++ b/finance/migrations/0002_invoice_times.py @@ -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, + ), + ] diff --git a/finance/migrations/0003_income.py b/finance/migrations/0003_income.py new file mode 100644 index 0000000..fa9518b --- /dev/null +++ b/finance/migrations/0003_income.py @@ -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)), + ], + ), + ] diff --git a/finance/migrations/0004_income_state.py b/finance/migrations/0004_income_state.py new file mode 100644 index 0000000..eb687fb --- /dev/null +++ b/finance/migrations/0004_income_state.py @@ -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, + ), + ] diff --git a/finance/migrations/0005_accounts.py b/finance/migrations/0005_accounts.py new file mode 100644 index 0000000..f3cd162 --- /dev/null +++ b/finance/migrations/0005_accounts.py @@ -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)), + ], + ), + ] diff --git a/finance/migrations/0006_payment.py b/finance/migrations/0006_payment.py new file mode 100644 index 0000000..11fcc37 --- /dev/null +++ b/finance/migrations/0006_payment.py @@ -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)), + ], + ), + ] diff --git a/finance/migrations/0007_reimbursement.py b/finance/migrations/0007_reimbursement.py new file mode 100644 index 0000000..2fbc50a --- /dev/null +++ b/finance/migrations/0007_reimbursement.py @@ -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)), + ], + ), + ] diff --git a/finance/migrations/0008_bonuschange.py b/finance/migrations/0008_bonuschange.py new file mode 100644 index 0000000..6d2e736 --- /dev/null +++ b/finance/migrations/0008_bonuschange.py @@ -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)), + ], + ), + ] diff --git a/finance/migrations/0009_bonuschange_state.py b/finance/migrations/0009_bonuschange_state.py new file mode 100644 index 0000000..f1d40b7 --- /dev/null +++ b/finance/migrations/0009_bonuschange_state.py @@ -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, + ), + ] diff --git a/finance/migrations/__init__.py b/finance/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/finance/models.py b/finance/models.py new file mode 100644 index 0000000..60e0a4d --- /dev/null +++ b/finance/models.py @@ -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) # 状态 diff --git a/finance/tests.py b/finance/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/finance/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/finance/urls.py b/finance/urls.py new file mode 100644 index 0000000..3e5d8df --- /dev/null +++ b/finance/urls.py @@ -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/"), +] \ No newline at end of file diff --git a/finance/views.py b/finance/views.py new file mode 100644 index 0000000..ca5087f --- /dev/null +++ b/finance/views.py @@ -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) + diff --git a/jyls_django/__init__.py b/jyls_django/__init__.py new file mode 100644 index 0000000..c45523b --- /dev/null +++ b/jyls_django/__init__.py @@ -0,0 +1,2 @@ +import pymysql +pymysql.install_as_MySQLdb() \ No newline at end of file diff --git a/jyls_django/asgi.py b/jyls_django/asgi.py new file mode 100644 index 0000000..727766a --- /dev/null +++ b/jyls_django/asgi.py @@ -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() diff --git a/jyls_django/middleware.py b/jyls_django/middleware.py new file mode 100644 index 0000000..45558fc --- /dev/null +++ b/jyls_django/middleware.py @@ -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 diff --git a/jyls_django/settings.py b/jyls_django/settings.py new file mode 100644 index 0000000..5246815 --- /dev/null +++ b/jyls_django/settings.py @@ -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, +} \ No newline at end of file diff --git a/jyls_django/urls.py b/jyls_django/urls.py new file mode 100644 index 0000000..7c620d1 --- /dev/null +++ b/jyls_django/urls.py @@ -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")), +] diff --git a/jyls_django/wsgi.py b/jyls_django/wsgi.py new file mode 100644 index 0000000..4fef68e --- /dev/null +++ b/jyls_django/wsgi.py @@ -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() diff --git a/manage.py b/manage.py new file mode 100644 index 0000000..3a5b39b --- /dev/null +++ b/manage.py @@ -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() diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..ecf40d5 Binary files /dev/null and b/requirements.txt differ diff --git a/utility/utility.py b/utility/utility.py new file mode 100644 index 0000000..e476a8f --- /dev/null +++ b/utility/utility.py @@ -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 \ No newline at end of file