gagreg
This commit is contained in:
5
.gitignore
vendored
Normal file
5
.gitignore
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
.idea
|
||||||
|
.git
|
||||||
|
.log
|
||||||
|
.venv
|
||||||
|
__pycache__
|
||||||
0
User/__init__.py
Normal file
0
User/__init__.py
Normal file
3
User/admin.py
Normal file
3
User/admin.py
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
from django.contrib import admin
|
||||||
|
|
||||||
|
# Register your models here.
|
||||||
6
User/apps.py
Normal file
6
User/apps.py
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
from django.apps import AppConfig
|
||||||
|
|
||||||
|
|
||||||
|
class UserConfig(AppConfig):
|
||||||
|
default_auto_field = 'django.db.models.BigAutoField'
|
||||||
|
name = 'User'
|
||||||
37
User/migrations/0001_initial.py
Normal file
37
User/migrations/0001_initial.py
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
# Generated by Django 4.2.25 on 2025-12-06 16:21
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
initial = True
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='User',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('username', models.CharField(max_length=100, unique=True)),
|
||||||
|
('account', models.CharField(max_length=100)),
|
||||||
|
('password', models.CharField(max_length=100)),
|
||||||
|
('ethnicity', models.CharField(max_length=100)),
|
||||||
|
('card', models.CharField(max_length=100)),
|
||||||
|
('mobilePhone', models.CharField(max_length=100)),
|
||||||
|
('department', models.CharField(max_length=100)),
|
||||||
|
('position', models.CharField(max_length=100)),
|
||||||
|
('team', models.CharField(max_length=100)),
|
||||||
|
('Dateofjoining', models.DateField()),
|
||||||
|
('Confirmationtime', models.DateField()),
|
||||||
|
('Practicingcertificatetime', models.DateField()),
|
||||||
|
('Dateofdeparture', models.DateField()),
|
||||||
|
('AcademicResume', models.TextField()),
|
||||||
|
('academic', models.TextField()),
|
||||||
|
('contract', models.TextField()),
|
||||||
|
('ApplicationForm', models.TextField()),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
||||||
32
User/migrations/0002_approval_user_salary.py
Normal file
32
User/migrations/0002_approval_user_salary.py
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
# Generated by Django 4.2.25 on 2025-12-07 06:10
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('User', '0001_initial'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Approval',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('title', models.CharField(max_length=100)),
|
||||||
|
('content', models.TextField()),
|
||||||
|
('times', models.DateField()),
|
||||||
|
('completeTiem', models.DateField()),
|
||||||
|
('personincharge', models.CharField(max_length=100)),
|
||||||
|
('state', models.CharField(max_length=100)),
|
||||||
|
('type', models.CharField(max_length=100)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='user',
|
||||||
|
name='salary',
|
||||||
|
field=models.CharField(default='', max_length=100),
|
||||||
|
preserve_default=False,
|
||||||
|
),
|
||||||
|
]
|
||||||
19
User/migrations/0003_user_state.py
Normal file
19
User/migrations/0003_user_state.py
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
# Generated by Django 4.2.25 on 2025-12-07 06:34
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('User', '0002_approval_user_salary'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='user',
|
||||||
|
name='state',
|
||||||
|
field=models.CharField(default='', max_length=100),
|
||||||
|
preserve_default=False,
|
||||||
|
),
|
||||||
|
]
|
||||||
28
User/migrations/0004_alter_user_confirmationtime_and_more.py
Normal file
28
User/migrations/0004_alter_user_confirmationtime_and_more.py
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
# Generated by Django 4.2.25 on 2025-12-07 07:03
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('User', '0003_user_state'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='user',
|
||||||
|
name='Confirmationtime',
|
||||||
|
field=models.DateField(blank=True, default=None, null=True),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='user',
|
||||||
|
name='Dateofdeparture',
|
||||||
|
field=models.DateField(blank=True, default=None, null=True),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='user',
|
||||||
|
name='Practicingcertificatetime',
|
||||||
|
field=models.DateField(blank=True, default=None, null=True),
|
||||||
|
),
|
||||||
|
]
|
||||||
19
User/migrations/0005_user_token.py
Normal file
19
User/migrations/0005_user_token.py
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
# Generated by Django 4.2.25 on 2025-12-07 12:57
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('User', '0004_alter_user_confirmationtime_and_more'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='user',
|
||||||
|
name='token',
|
||||||
|
field=models.CharField(default='', max_length=100),
|
||||||
|
preserve_default=False,
|
||||||
|
),
|
||||||
|
]
|
||||||
18
User/migrations/0006_alter_user_salary.py
Normal file
18
User/migrations/0006_alter_user_salary.py
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
# Generated by Django 4.2.25 on 2025-12-07 15:53
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('User', '0005_user_token'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='user',
|
||||||
|
name='salary',
|
||||||
|
field=models.CharField(blank=True, default=None, max_length=100, null=True),
|
||||||
|
),
|
||||||
|
]
|
||||||
18
User/migrations/0007_alter_user_token.py
Normal file
18
User/migrations/0007_alter_user_token.py
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
# Generated by Django 4.2.25 on 2025-12-08 14:19
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('User', '0006_alter_user_salary'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='user',
|
||||||
|
name='token',
|
||||||
|
field=models.TextField(),
|
||||||
|
),
|
||||||
|
]
|
||||||
20
User/migrations/0008_department.py
Normal file
20
User/migrations/0008_department.py
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
# Generated by Django 4.2.25 on 2025-12-08 16:07
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('User', '0007_alter_user_token'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Department',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('username', models.CharField(max_length=100)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
||||||
18
User/migrations/0009_alter_approval_completetiem.py
Normal file
18
User/migrations/0009_alter_approval_completetiem.py
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
# Generated by Django 4.2.25 on 2025-12-08 17:45
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('User', '0008_department'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='approval',
|
||||||
|
name='completeTiem',
|
||||||
|
field=models.DateField(blank=True, default=None, null=True),
|
||||||
|
),
|
||||||
|
]
|
||||||
19
User/migrations/0010_approval_user_id.py
Normal file
19
User/migrations/0010_approval_user_id.py
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
# Generated by Django 4.2.25 on 2025-12-09 16:13
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('User', '0009_alter_approval_completetiem'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='approval',
|
||||||
|
name='user_id',
|
||||||
|
field=models.CharField(default='', max_length=100),
|
||||||
|
preserve_default=False,
|
||||||
|
),
|
||||||
|
]
|
||||||
26
User/migrations/0011_user_role_alter_user_department.py
Normal file
26
User/migrations/0011_user_role_alter_user_department.py
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
# Generated by Django 4.2.25 on 2025-12-22 02:40
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('business', '0020_role'),
|
||||||
|
('User', '0010_approval_user_id'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='user',
|
||||||
|
name='role',
|
||||||
|
field=models.ForeignKey(default='', on_delete=django.db.models.deletion.CASCADE, to='business.role'),
|
||||||
|
preserve_default=False,
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='user',
|
||||||
|
name='department',
|
||||||
|
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='User.department'),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -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'),
|
||||||
|
),
|
||||||
|
]
|
||||||
0
User/migrations/__init__.py
Normal file
0
User/migrations/__init__.py
Normal file
40
User/models.py
Normal file
40
User/models.py
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
from django.db import models
|
||||||
|
from business.models import role
|
||||||
|
|
||||||
|
# Create your models here.
|
||||||
|
class Department(models.Model):
|
||||||
|
username = models.CharField(max_length=100) # 部门名称
|
||||||
|
class User(models.Model):
|
||||||
|
role = models.ManyToManyField(role)
|
||||||
|
department =models.ManyToManyField(Department) # 归属部门
|
||||||
|
username = models.CharField(max_length=100, unique=True) # 姓名
|
||||||
|
account = models.CharField(max_length=100) # 账号
|
||||||
|
password = models.CharField(max_length=100) # 密码
|
||||||
|
ethnicity = models.CharField(max_length=100) # 名族
|
||||||
|
card = models.CharField(max_length=100) # 身份证
|
||||||
|
mobilePhone = models.CharField(max_length=100) # 手机号
|
||||||
|
position = models.CharField(max_length=100) # 岗位
|
||||||
|
team = models.CharField(max_length=100) # 所属团队
|
||||||
|
Dateofjoining = models.DateField() # 入职时间
|
||||||
|
Confirmationtime = models.DateField(null=True, blank=True, default=None) # 转正时间
|
||||||
|
Practicingcertificatetime = models.DateField(null=True, blank=True, default=None) # 执业证时间
|
||||||
|
Dateofdeparture = models.DateField(null=True, blank=True, default=None) # 离职时间
|
||||||
|
AcademicResume = models.TextField() # 学业简历
|
||||||
|
academic = models.TextField() # 学历
|
||||||
|
contract = models.TextField() # 合同
|
||||||
|
ApplicationForm = models.TextField() # 入职申请表
|
||||||
|
salary = models.CharField(max_length=100,null=True, blank=True, default=None) # 工资
|
||||||
|
state = models.CharField(max_length=100) # 状态
|
||||||
|
token = models.TextField()
|
||||||
|
|
||||||
|
class Approval(models.Model):
|
||||||
|
title = models.CharField(max_length=100)
|
||||||
|
content = models.TextField() # 内容
|
||||||
|
times = models.DateField() # 提交时间
|
||||||
|
completeTiem = models.DateField(null=True, blank=True, default=None) # 完成时间
|
||||||
|
personincharge = models.CharField(max_length=100) # 负责人
|
||||||
|
state = models.CharField(max_length=100) # 状态
|
||||||
|
type = models.CharField(max_length=100) # 类别
|
||||||
|
user_id = models.CharField(max_length=100) # 事件id
|
||||||
|
|
||||||
|
|
||||||
3
User/tests.py
Normal file
3
User/tests.py
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
from django.test import TestCase
|
||||||
|
|
||||||
|
# Create your tests here.
|
||||||
16
User/urls.py
Normal file
16
User/urls.py
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
from django.urls import path
|
||||||
|
from .views import CreateUserView,LoginView,EditorialStaffView,PersonnelDetailsView,DepartmentView,PersonnelListView,AddDepartment,DeleteDepartment,Personlist,roxyExhibition,approvalProcessing,personneldisplay
|
||||||
|
urlpatterns = [
|
||||||
|
path('create-user',CreateUserView.as_view(),name='create-user'),
|
||||||
|
path('login',LoginView.as_view(),name='login'),
|
||||||
|
path('editorial-staff',EditorialStaffView.as_view(),name='editorial-staff'),
|
||||||
|
path('get_info',PersonnelDetailsView.as_view(),name='personnel-details'),
|
||||||
|
path('department',DepartmentView.as_view(),name='department'),
|
||||||
|
path('personnel-list',PersonnelListView.as_view(),name='personnel-list'),
|
||||||
|
path('add_department',AddDepartment.as_view(),name='add_department'),
|
||||||
|
path('delete_department',DeleteDepartment.as_view(),name='delete_department'),
|
||||||
|
path('personlist',Personlist.as_view(),name='Personlist'),
|
||||||
|
path('roxyexhibition',roxyExhibition.as_view(),name='roxyExhibition'),
|
||||||
|
path('approval_processing',approvalProcessing.as_view(),name='approval_processing'),
|
||||||
|
path('personneldisplay',personneldisplay.as_view(),name='personneldisplay'),
|
||||||
|
]
|
||||||
564
User/views.py
Normal file
564
User/views.py
Normal file
@@ -0,0 +1,564 @@
|
|||||||
|
from django.contrib.auth.models import Permission
|
||||||
|
from rest_framework.views import APIView
|
||||||
|
from rest_framework.response import Response
|
||||||
|
from rest_framework import status
|
||||||
|
import json
|
||||||
|
import ast
|
||||||
|
from .models import User,Approval,Department
|
||||||
|
from business.models import permission
|
||||||
|
from finance.models import Income,Accounts,Payment,Reimbursement,BonusChange
|
||||||
|
from finance.models import Invoice
|
||||||
|
from business.models import ProjectRegistration,Case,SealApplication
|
||||||
|
import datetime
|
||||||
|
from utility.utility import flies
|
||||||
|
from django.contrib.sessions.backends.db import SessionStore
|
||||||
|
from django.db.models import Count, Q
|
||||||
|
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
|
||||||
|
from collections import defaultdict
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class CreateUserView(APIView):
|
||||||
|
def post(self, request, *args, **kwargs):
|
||||||
|
"""人事管理-人员添加"""
|
||||||
|
role = request.data.get('role')
|
||||||
|
username = request.data.get('username') # 姓名
|
||||||
|
account = request.data.get('account') # 账号
|
||||||
|
password = request.data.get('password') # 密码
|
||||||
|
nation = request.data.get('nation') # 民族
|
||||||
|
IdCard = request.data.get('IdCard') #身份证
|
||||||
|
department = request.data.get('department') # 归属部门
|
||||||
|
mobilePhone = request.data.get('mobilePhone') # 手机号
|
||||||
|
position = request.data.get('position') # 岗位
|
||||||
|
team = request.data.get('team') # 所属团队
|
||||||
|
Dateofjoining = request.data.get('Dateofjoining') # 入职时间
|
||||||
|
Confirmationtime = request.data.get('Confirmationtime') # 转正时间
|
||||||
|
Practicingcertificatetime = request.data.get('Practicingcertificatetime') # 执业证时间
|
||||||
|
AcademicResume = request.FILES.getlist('AcademicResume') # 学业简历
|
||||||
|
academic = request.data.get('academic') # 学历
|
||||||
|
contract = request.FILES.getlist('contract') # 合同
|
||||||
|
ApplicationForm =request.FILES.getlist('ApplicationForm') # 入职申请表
|
||||||
|
salary = request.data.get('salary') # 工资标准
|
||||||
|
if not all([username, account, password, IdCard, department, position,nation,mobilePhone,team,Dateofjoining,academic,contract]):
|
||||||
|
return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
AcademicResume_url = flies(AcademicResume)
|
||||||
|
ApplicationForm_url = flies(ApplicationForm )
|
||||||
|
contract_url = flies(contract)
|
||||||
|
|
||||||
|
Dateofjoining = datetime.datetime.strptime(Dateofjoining, "%Y-%m-%d")
|
||||||
|
if Confirmationtime:
|
||||||
|
Confirmationtime = datetime.datetime.strptime(Confirmationtime, "%Y-%m-%d")
|
||||||
|
else:
|
||||||
|
Confirmationtime = None
|
||||||
|
if Practicingcertificatetime:
|
||||||
|
Practicingcertificatetime = datetime.datetime.strptime(Practicingcertificatetime, "%Y-%m-%d")
|
||||||
|
else:
|
||||||
|
Practicingcertificatetime = None
|
||||||
|
role_list = ast.literal_eval(role)
|
||||||
|
department_id = ast.literal_eval(department)
|
||||||
|
user = User.objects.create(
|
||||||
|
username=username,
|
||||||
|
account=account,
|
||||||
|
password=password,
|
||||||
|
ethnicity=nation,
|
||||||
|
card=IdCard,
|
||||||
|
mobilePhone=mobilePhone,
|
||||||
|
position=position,
|
||||||
|
team=team,
|
||||||
|
Dateofjoining=Dateofjoining,
|
||||||
|
Confirmationtime=Confirmationtime,
|
||||||
|
Practicingcertificatetime=Practicingcertificatetime,
|
||||||
|
AcademicResume=json.dumps(AcademicResume_url),
|
||||||
|
academic=academic,
|
||||||
|
contract=json.dumps(contract_url),
|
||||||
|
ApplicationForm=json.dumps(ApplicationForm_url),
|
||||||
|
state="待登记",
|
||||||
|
salary=salary
|
||||||
|
)
|
||||||
|
user.role.add(*role_list)
|
||||||
|
user.department.add(*department_id)
|
||||||
|
return Response({'message': '添加人员成功', 'code': 0}, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
|
class EditorialStaffView(APIView):
|
||||||
|
def post(self, request, *args, **kwargs):
|
||||||
|
"""修改人员信息"""
|
||||||
|
id = request.data.get('id')
|
||||||
|
username = request.data.get('username') # 姓名
|
||||||
|
account = request.data.get('account') # 账号
|
||||||
|
password = request.data.get('password') # 密码
|
||||||
|
nation = request.data.get('nation') # 民族
|
||||||
|
IdCard = request.data.get('IdCard') # 身份证
|
||||||
|
department = request.data.get('department') # 归属部门
|
||||||
|
mobilePhone = request.data.get('mobilePhone') # 手机号
|
||||||
|
position = request.data.get('position') # 岗位
|
||||||
|
team = request.data.get('team') # 所属团队
|
||||||
|
Dateofjoining = request.data.get('Dateofjoining') # 入职时间
|
||||||
|
Confirmationtime = request.data.get('Confirmationtime') # 转正时间
|
||||||
|
Practicingcertificatetime = request.data.get('Practicingcertificatetime') # 执业证时间
|
||||||
|
AcademicResume = request.FILES.getlist('AcademicResume') # 学业简历
|
||||||
|
academic = request.data.get('academic') # 学历
|
||||||
|
contract = request.FILES.getlist('contract') # 合同
|
||||||
|
ApplicationForm = request.FILES.getlist('ApplicationForm') # 入职申请表
|
||||||
|
salary = request.data.get('salary') # 工资标准
|
||||||
|
print([username, account, password, IdCard, department, position, nation, mobilePhone, team, Dateofjoining,
|
||||||
|
academic])
|
||||||
|
if not all([username, account, password, IdCard, department, position, nation, mobilePhone, team, Dateofjoining,
|
||||||
|
academic]):
|
||||||
|
|
||||||
|
return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
user = User.objects.get(id=id)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if AcademicResume:
|
||||||
|
AcademicResume_url = flies(AcademicResume)
|
||||||
|
user.AcademicResume = json.dumps(AcademicResume_url)
|
||||||
|
if ApplicationForm:
|
||||||
|
ApplicationForm_url = flies(ApplicationForm)
|
||||||
|
user.ApplicationForm = json.dumps(ApplicationForm_url)
|
||||||
|
if contract:
|
||||||
|
contract_url = flies(contract)
|
||||||
|
user.contract = json.dumps(contract_url)
|
||||||
|
def parse_date_str(date_str):
|
||||||
|
if date_str and date_str != "0000-00-00":
|
||||||
|
return datetime.datetime.strptime(date_str, "%Y-%m-%d").strftime('%Y-%m-%d')
|
||||||
|
return "" # 设置默认日期
|
||||||
|
|
||||||
|
Dateofjoining = parse_date_str(Dateofjoining)
|
||||||
|
Confirmationtime = parse_date_str(Confirmationtime)
|
||||||
|
Practicingcertificatetime = parse_date_str(Practicingcertificatetime)
|
||||||
|
|
||||||
|
user.Confirmationtime = Confirmationtime
|
||||||
|
user.Practicingcertificatetime = Practicingcertificatetime
|
||||||
|
user.Dateofjoining = Dateofjoining
|
||||||
|
|
||||||
|
user.username = username
|
||||||
|
user.account = account
|
||||||
|
user.password = password
|
||||||
|
user.ethnicity = nation
|
||||||
|
user.card = IdCard
|
||||||
|
user.department = department
|
||||||
|
user.mobilePhone = mobilePhone
|
||||||
|
user.position = position
|
||||||
|
user.team = team
|
||||||
|
user.academic = academic
|
||||||
|
user.salary = salary
|
||||||
|
user.save()
|
||||||
|
return Response({'message': '修改成功', 'code': 0}, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
|
class LoginView(APIView):
|
||||||
|
"""
|
||||||
|
登录页面
|
||||||
|
"""
|
||||||
|
|
||||||
|
def post(self, request):
|
||||||
|
token = request.META.get('token')
|
||||||
|
username = request.data.get('username')
|
||||||
|
password = request.data.get('password')
|
||||||
|
if not all([username, password]):
|
||||||
|
return Response({'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
try:
|
||||||
|
user = User.objects.get(account=username)
|
||||||
|
|
||||||
|
if user.state != '在职':
|
||||||
|
return Response({'me' 'ssage': '你的账号已经封存。', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
# 比较密码
|
||||||
|
if user.password == password or user.token == token:
|
||||||
|
# if '123456' == password or user.token == token:
|
||||||
|
# 更新 encryption 字段到数据库
|
||||||
|
user.token = token
|
||||||
|
user.save()
|
||||||
|
|
||||||
|
# 创建会话
|
||||||
|
session = SessionStore()
|
||||||
|
session.create()
|
||||||
|
session['user_id'] = user.id
|
||||||
|
session.save()
|
||||||
|
# 置 sessionid 到响应的 cookie 中
|
||||||
|
response = Response({
|
||||||
|
'id': user.id,
|
||||||
|
'message': '登录成功',
|
||||||
|
'code': 0
|
||||||
|
}, status=status.HTTP_200_OK)
|
||||||
|
response.set_cookie(key='sessionid', value=session.session_key, httponly=True)
|
||||||
|
|
||||||
|
return response
|
||||||
|
else:
|
||||||
|
return Response({'message': '密码错误', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
except User.DoesNotExist:
|
||||||
|
return Response({'status': 'error', 'message': '用户不存在', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
class PersonnelDetailsView(APIView):
|
||||||
|
"""展示人员信息"""
|
||||||
|
def post(self, request, *args, **kwargs):
|
||||||
|
token = request.META.get('token')
|
||||||
|
user = User.objects.prefetch_related('role', 'department').get(token=token)
|
||||||
|
permissionId = list(user.role.values("permissionId"))
|
||||||
|
permission_ids = [item['permissionId'] for item in permissionId]
|
||||||
|
permission_ids = [i for s in permission_ids for i in ast.literal_eval(s)]
|
||||||
|
permissions = permission.objects.filter(id__in=permission_ids)
|
||||||
|
permission_data = []
|
||||||
|
for per in permissions:
|
||||||
|
permission_data.append({
|
||||||
|
'id': per.id,
|
||||||
|
'permission_name': per.permission_name,
|
||||||
|
"permission_logo": per.permission_logo,
|
||||||
|
"parent": per.parent,
|
||||||
|
})
|
||||||
|
|
||||||
|
data = {
|
||||||
|
'id': user.id,
|
||||||
|
'username': user.username,
|
||||||
|
'account': user.account,
|
||||||
|
"ethnicity": user.ethnicity,
|
||||||
|
"card": user.card,
|
||||||
|
"mobilePhone": user.mobilePhone,
|
||||||
|
"position": user.position,
|
||||||
|
"team": user.team,
|
||||||
|
"Dateofjoining": user.Dateofjoining,
|
||||||
|
"Confirmationtime": user.Confirmationtime,
|
||||||
|
'Practicingcertificatetime': user.Practicingcertificatetime,
|
||||||
|
"Dateofdeparture": user.Dateofdeparture,
|
||||||
|
"AcademicResume": user.AcademicResume,
|
||||||
|
"academic": user.academic,
|
||||||
|
"contract": user.contract,
|
||||||
|
"ApplicationForm": user.ApplicationForm,
|
||||||
|
"state": user.state,
|
||||||
|
# 角色数据
|
||||||
|
"role": list(user.role.values('id', 'RoleName',"permissionId")), # 假设Role模型有name字段
|
||||||
|
# 如果需要部门数据
|
||||||
|
"department": list(user.department.values('id', 'username')),
|
||||||
|
"permission_data": permission_data,
|
||||||
|
}
|
||||||
|
return Response({'message': '详细人员信息展示成功', "data":data, 'code': 0}, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
|
class DepartmentView(APIView):
|
||||||
|
def post(self, request, *args, **kwargs):
|
||||||
|
"""部门列表"""
|
||||||
|
name = request.data.get('name')
|
||||||
|
Q_obj = Q()
|
||||||
|
if name:
|
||||||
|
Q_obj &=Q(username__icontains=name)
|
||||||
|
deps = Department.objects.filter(Q_obj)
|
||||||
|
data = []
|
||||||
|
for dep in deps:
|
||||||
|
data.append({
|
||||||
|
'id': dep.id,
|
||||||
|
'name': dep.username,
|
||||||
|
})
|
||||||
|
|
||||||
|
return Response({'message': '展示成功', "data":data, 'code': 0}, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
|
|
||||||
|
class PersonnelListView(APIView):
|
||||||
|
def post(self, request, *args, **kwargs):
|
||||||
|
"""
|
||||||
|
人员列表
|
||||||
|
:param request:
|
||||||
|
:param args:
|
||||||
|
:param kwargs:
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
page = request.data.get('page')
|
||||||
|
per_page = request.data.get('per_page')
|
||||||
|
username = request.data.get('username')
|
||||||
|
department = request.data.get('department')
|
||||||
|
|
||||||
|
if not all([page, per_page]):
|
||||||
|
return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
Q_obj = Q()
|
||||||
|
if username:
|
||||||
|
Q_obj &= Q(username__icontains=username)
|
||||||
|
if department:
|
||||||
|
Q_obj &= Q(department__username__icontains=department)
|
||||||
|
users = User.objects.prefetch_related('department').filter(Q_obj)
|
||||||
|
total = len(users)
|
||||||
|
|
||||||
|
paginator = Paginator(users, per_page)
|
||||||
|
try:
|
||||||
|
user_agents_page = paginator.page(page)
|
||||||
|
|
||||||
|
except PageNotAnInteger:
|
||||||
|
user_agents_page = paginator.page(1)
|
||||||
|
except EmptyPage:
|
||||||
|
user_agents_page = paginator.page(paginator.num_pages)
|
||||||
|
data = []
|
||||||
|
for info in user_agents_page.object_list:
|
||||||
|
data.append({
|
||||||
|
'id': info.id,
|
||||||
|
"username": info.username, # 姓名
|
||||||
|
"account": info.account, # 账号
|
||||||
|
"nation": info.ethnicity, # 名族
|
||||||
|
"IdCard": info.card, # 身份证
|
||||||
|
"mobilePhone": info.mobilePhone, # 手机号
|
||||||
|
"department": list(info.department.values('id', 'username')),
|
||||||
|
"position": info.position, # 岗位
|
||||||
|
"team": info.team, # 所属团队
|
||||||
|
"Dateofjoining": info.Dateofjoining, # 入职时间
|
||||||
|
"Confirmationtime": info.Confirmationtime, # # 转正时间
|
||||||
|
'Practicingcertificatetime': info.Practicingcertificatetime,# 执业证时间
|
||||||
|
"Dateofdeparture": info.Dateofdeparture, # 离职时间
|
||||||
|
"AcademicResume": info.AcademicResume, # 学业简历
|
||||||
|
"academic": info.academic, # 学历信息
|
||||||
|
"contract": info.contract, # 合同
|
||||||
|
"ApplicationForm": info.ApplicationForm,# 入职申请表
|
||||||
|
"salary": info.salary, # 工资
|
||||||
|
"state": info.state, # 状态
|
||||||
|
})
|
||||||
|
return Response({'message': '查看成功', "total":total,'data': data, 'code': 0}, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
|
class AddDepartment(APIView):
|
||||||
|
def post(self, request, *args, **kwargs):
|
||||||
|
name = request.data.get('name')
|
||||||
|
if not all([name]):
|
||||||
|
return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
dep = Department.objects.filter(username=name).first()
|
||||||
|
if dep:
|
||||||
|
return Response({'message': '添加失败,部门存在', 'code': 0}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
|
Department.objects.create(username=name)
|
||||||
|
return Response({'message': '添加部门成功', 'code': 0}, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
|
class DeleteDepartment(APIView):
|
||||||
|
def post(self, request, *args, **kwargs):
|
||||||
|
id = request.data.get('id')
|
||||||
|
if not all([id]):
|
||||||
|
return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
dep = Department.objects.get(id=id)
|
||||||
|
department = User.objects.filter(department=dep.username)
|
||||||
|
if department:
|
||||||
|
return Response({'status': 'error', 'message': '删除失败,该部门还存在,请及时转移', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
Department.objects.filter(id=id).delete()
|
||||||
|
return Response({'message': '删除成功', 'code': 0}, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
|
class Personlist(APIView):
|
||||||
|
def post(self, request, *args, **kwargs):
|
||||||
|
users = Department.objects.all()
|
||||||
|
page = request.data.get('page')
|
||||||
|
per_page = request.data.get('per_page')
|
||||||
|
total = len(users)
|
||||||
|
|
||||||
|
paginator = Paginator(users, per_page)
|
||||||
|
try:
|
||||||
|
user_agents_page = paginator.page(page)
|
||||||
|
|
||||||
|
except PageNotAnInteger:
|
||||||
|
user_agents_page = paginator.page(1)
|
||||||
|
except EmptyPage:
|
||||||
|
user_agents_page = paginator.page(paginator.num_pages)
|
||||||
|
department_dict = []
|
||||||
|
for user in user_agents_page.object_list:
|
||||||
|
department_dict.append({
|
||||||
|
'id': user.id,
|
||||||
|
"username": user.username,
|
||||||
|
# "position": user.position,
|
||||||
|
# "state": user.state,
|
||||||
|
})
|
||||||
|
return Response({'message': '展示成功',"total":total,'data':department_dict, 'code': 0}, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
|
|
||||||
|
class roxyExhibition(APIView):
|
||||||
|
def post(self, request, *args, **kwargs):
|
||||||
|
"""
|
||||||
|
代办展示
|
||||||
|
:param request:
|
||||||
|
:param args:
|
||||||
|
:param kwargs:
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
page = request.data.get('page')
|
||||||
|
per_page = request.data.get('per_page')
|
||||||
|
token = request.META.get('token')
|
||||||
|
|
||||||
|
if not all([page, per_page]):
|
||||||
|
return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
user = User.objects.get(token=token)
|
||||||
|
approvals = Approval.objects.filter(
|
||||||
|
state="审核中",
|
||||||
|
personincharge__in=[user.username, user.department]
|
||||||
|
)
|
||||||
|
total = len(approvals)
|
||||||
|
|
||||||
|
paginator = Paginator(approvals, per_page)
|
||||||
|
try:
|
||||||
|
user_agents_page = paginator.page(page)
|
||||||
|
|
||||||
|
except PageNotAnInteger:
|
||||||
|
user_agents_page = paginator.page(1)
|
||||||
|
except EmptyPage:
|
||||||
|
user_agents_page = paginator.page(paginator.num_pages)
|
||||||
|
data = []
|
||||||
|
for info in user_agents_page.object_list:
|
||||||
|
itme = {
|
||||||
|
'id': info.id,
|
||||||
|
"title": info.title,
|
||||||
|
"content": info.content,
|
||||||
|
"times": info.times,
|
||||||
|
"completeTiem": info.completeTiem,
|
||||||
|
"personincharge": info.personincharge,
|
||||||
|
"state": info.state,
|
||||||
|
"type": info.type,
|
||||||
|
}
|
||||||
|
data.append(itme)
|
||||||
|
return Response({'message': '展示成功',"total":total,'data':data, 'code': 0}, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
|
class approvalProcessing(APIView):
|
||||||
|
def post(self, request, *args, **kwargs):
|
||||||
|
"""
|
||||||
|
消除代办
|
||||||
|
:param request:
|
||||||
|
:param args:
|
||||||
|
:param kwargs:
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
state = request.data.get('state')
|
||||||
|
type = request.data.get('type')
|
||||||
|
id = request.data.get('id')
|
||||||
|
|
||||||
|
if not all([state, type,id]):
|
||||||
|
return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
approval = Approval.objects.get(id=id)
|
||||||
|
if type == "入职财务登记":
|
||||||
|
user = User.objects.get(id=approval.user_id)
|
||||||
|
if state == "已通过":
|
||||||
|
approval.state="已通过"
|
||||||
|
user.state = "在职"
|
||||||
|
else:
|
||||||
|
approval.state="未通过"
|
||||||
|
user.state = "异常"
|
||||||
|
approval.save(update_fields=['state'])
|
||||||
|
user.save(update_fields=['state'])
|
||||||
|
|
||||||
|
if type == "开票":
|
||||||
|
user = Invoice.objects.get(id=approval.user_id)
|
||||||
|
if state == "已通过":
|
||||||
|
approval.state = "已通过"
|
||||||
|
user.state = "已通过"
|
||||||
|
else:
|
||||||
|
approval.state = "未通过"
|
||||||
|
user.state = "异常"
|
||||||
|
approval.save(update_fields=['state'])
|
||||||
|
user.save(update_fields=['state'])
|
||||||
|
|
||||||
|
if type == "收入确认":
|
||||||
|
approval = Approval.objects.get(id=id)
|
||||||
|
user = Income.objects.get(id=approval.user_id)
|
||||||
|
if state == "已通过":
|
||||||
|
approval.state = "已通过"
|
||||||
|
user.state = "已通过"
|
||||||
|
else:
|
||||||
|
approval.state = "未通过"
|
||||||
|
user.state = "未通过"
|
||||||
|
approval.save(update_fields=['state'])
|
||||||
|
user.save(update_fields=['state'])
|
||||||
|
if type == "调账申请":
|
||||||
|
approval = Approval.objects.get(id=id)
|
||||||
|
user = Accounts.objects.get(id=approval.user_id)
|
||||||
|
if state == "已通过":
|
||||||
|
approval.state = "已通过"
|
||||||
|
user.state = "已通过"
|
||||||
|
else:
|
||||||
|
approval.state = "未通过"
|
||||||
|
user.state = "未通过"
|
||||||
|
approval.save(update_fields=['state'])
|
||||||
|
user.save(update_fields=['state'])
|
||||||
|
|
||||||
|
if type == "付款申请":
|
||||||
|
approval = Approval.objects.get(id=id)
|
||||||
|
user = Payment.objects.get(id=approval.user_id)
|
||||||
|
if state == "已通过":
|
||||||
|
approval.state = "已通过"
|
||||||
|
user.state = "已通过"
|
||||||
|
else:
|
||||||
|
approval.state = "未通过"
|
||||||
|
user.state = "未通过"
|
||||||
|
approval.save(update_fields=['state'])
|
||||||
|
user.save(update_fields=['state'])
|
||||||
|
|
||||||
|
if type == "报销申请":
|
||||||
|
approval = Approval.objects.get(id=id)
|
||||||
|
user = Reimbursement.objects.get(id=approval.user_id)
|
||||||
|
if state == "已通过":
|
||||||
|
approval.state = "已通过"
|
||||||
|
user.state = "已通过"
|
||||||
|
else:
|
||||||
|
approval.state = "未通过"
|
||||||
|
user.state = "未通过"
|
||||||
|
approval.save(update_fields=['state'])
|
||||||
|
user.save(update_fields=['state'])
|
||||||
|
|
||||||
|
if type == "工资/奖金变更":
|
||||||
|
approval = Approval.objects.get(id=id)
|
||||||
|
user = BonusChange.objects.get(id=approval.user_id)
|
||||||
|
if state == "已通过":
|
||||||
|
approval.state = "已通过"
|
||||||
|
user.state = "已通过"
|
||||||
|
else:
|
||||||
|
approval.state = "未通过"
|
||||||
|
user.state = "未通过"
|
||||||
|
approval.save(update_fields=['state'])
|
||||||
|
user.save(update_fields=['state'])
|
||||||
|
|
||||||
|
if type == "立项登记":
|
||||||
|
approval = Approval.objects.get(id=id)
|
||||||
|
user = ProjectRegistration.objects.get(id=approval.user_id)
|
||||||
|
if state == "已通过":
|
||||||
|
approval.state = "已通过"
|
||||||
|
user.state = "已通过"
|
||||||
|
else:
|
||||||
|
approval.state = "未通过"
|
||||||
|
user.state = "未通过"
|
||||||
|
approval.save(update_fields=['state'])
|
||||||
|
user.save(update_fields=['state'])
|
||||||
|
|
||||||
|
if type == "案件管理":
|
||||||
|
approval = Approval.objects.get(id=id)
|
||||||
|
user = Case.objects.get(id=approval.user_id)
|
||||||
|
if state == "已通过":
|
||||||
|
approval.state = "已通过"
|
||||||
|
user.state = "已通过"
|
||||||
|
else:
|
||||||
|
approval.state = "未通过"
|
||||||
|
user.state = "未通过"
|
||||||
|
approval.save(update_fields=['state'])
|
||||||
|
user.save(update_fields=['state'])
|
||||||
|
|
||||||
|
if type == "申请用印":
|
||||||
|
approval = Approval.objects.get(id=id)
|
||||||
|
user = SealApplication.objects.get(id=approval.user_id)
|
||||||
|
if state == "已通过":
|
||||||
|
approval.state = "已通过"
|
||||||
|
user.state = "已通过"
|
||||||
|
else:
|
||||||
|
approval.state = "未通过"
|
||||||
|
user.state = "未通过"
|
||||||
|
approval.save(update_fields=['state'])
|
||||||
|
user.save(update_fields=['state'])
|
||||||
|
return Response({'message': '处理成功','code': 0}, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
|
class personneldisplay(APIView):
|
||||||
|
def get(self, request, *args, **kwargs):
|
||||||
|
"""
|
||||||
|
人员列表
|
||||||
|
:param request:
|
||||||
|
:param args:
|
||||||
|
:param kwargs:
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
users = User.objects.all()
|
||||||
|
data = []
|
||||||
|
for user in users:
|
||||||
|
itme = {
|
||||||
|
'id': user.id,
|
||||||
|
"username": user.username,
|
||||||
|
'position': user.position,
|
||||||
|
}
|
||||||
|
data.append(itme)
|
||||||
|
return Response({'message': '展示成功',"data":data,'code': 0}, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
|
|
||||||
0
business/__init__.py
Normal file
0
business/__init__.py
Normal file
3
business/admin.py
Normal file
3
business/admin.py
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
from django.contrib import admin
|
||||||
|
|
||||||
|
# Register your models here.
|
||||||
6
business/apps.py
Normal file
6
business/apps.py
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
from django.apps import AppConfig
|
||||||
|
|
||||||
|
|
||||||
|
class BusinessConfig(AppConfig):
|
||||||
|
default_auto_field = 'django.db.models.BigAutoField'
|
||||||
|
name = 'business'
|
||||||
28
business/migrations/0001_initial.py
Normal file
28
business/migrations/0001_initial.py
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
# Generated by Django 4.2.25 on 2025-12-13 08:03
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
initial = True
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='PreFiling',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('times', models.CharField(max_length=100)),
|
||||||
|
('client_username', models.CharField(max_length=100)),
|
||||||
|
('client_card', models.CharField(max_length=100)),
|
||||||
|
('party_username', models.CharField(max_length=100)),
|
||||||
|
('party_card', models.CharField(max_length=100)),
|
||||||
|
('description', models.TextField()),
|
||||||
|
('Undertaker', models.CharField(max_length=100)),
|
||||||
|
('submit', models.CharField(max_length=100)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
||||||
28
business/migrations/0002_projectregistration.py
Normal file
28
business/migrations/0002_projectregistration.py
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
# Generated by Django 4.2.25 on 2025-12-13 11:12
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('business', '0001_initial'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='ProjectRegistration',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('type', models.CharField(max_length=100)),
|
||||||
|
('ContractNo', models.CharField(max_length=100)),
|
||||||
|
('times', models.CharField(max_length=100)),
|
||||||
|
('client_info', models.CharField(max_length=100)),
|
||||||
|
('party_info', models.CharField(max_length=100)),
|
||||||
|
('description', models.TextField()),
|
||||||
|
('responsiblefor', models.CharField(max_length=100)),
|
||||||
|
('charge', models.CharField(max_length=100)),
|
||||||
|
('contract', models.CharField(max_length=100)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -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',
|
||||||
|
),
|
||||||
|
]
|
||||||
19
business/migrations/0004_projectregistration_state.py
Normal file
19
business/migrations/0004_projectregistration_state.py
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
# Generated by Django 4.2.25 on 2025-12-16 05:04
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('business', '0003_remove_prefiling_client_card_and_more'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='projectregistration',
|
||||||
|
name='state',
|
||||||
|
field=models.CharField(default='', max_length=100),
|
||||||
|
preserve_default=False,
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -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(),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -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,
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -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,
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -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',
|
||||||
|
),
|
||||||
|
]
|
||||||
46
business/migrations/0009_invoice_caselog_case.py
Normal file
46
business/migrations/0009_invoice_caselog_case.py
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
# Generated by Django 4.2.25 on 2025-12-17 02:53
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('business', '0008_remove_bid_type2_remove_projectregistration_type2'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Invoice',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('amount', models.CharField(max_length=100)),
|
||||||
|
('file', models.TextField()),
|
||||||
|
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='business.prefiling')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Caselog',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('content', models.TextField()),
|
||||||
|
('times', models.CharField(max_length=100)),
|
||||||
|
('username', models.CharField(max_length=100)),
|
||||||
|
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='business.prefiling')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Case',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('times', models.CharField(max_length=100)),
|
||||||
|
('AgencyContract', models.TextField()),
|
||||||
|
('Contractreturn', models.TextField()),
|
||||||
|
('Closingapplication', models.TextField()),
|
||||||
|
('ChangeRequest', models.CharField(max_length=100)),
|
||||||
|
('paymentcollection', models.CharField(max_length=100)),
|
||||||
|
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='business.prefiling')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
||||||
19
business/migrations/0010_caselog_file.py
Normal file
19
business/migrations/0010_caselog_file.py
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
# Generated by Django 4.2.25 on 2025-12-17 02:54
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('business', '0009_invoice_caselog_case'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='caselog',
|
||||||
|
name='file',
|
||||||
|
field=models.TextField(default=''),
|
||||||
|
preserve_default=False,
|
||||||
|
),
|
||||||
|
]
|
||||||
19
business/migrations/0011_case_state.py
Normal file
19
business/migrations/0011_case_state.py
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
# Generated by Django 4.2.25 on 2025-12-17 06:01
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('business', '0010_caselog_file'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='case',
|
||||||
|
name='state',
|
||||||
|
field=models.CharField(default='', max_length=100),
|
||||||
|
preserve_default=False,
|
||||||
|
),
|
||||||
|
]
|
||||||
27
business/migrations/0012_sealapplication.py
Normal file
27
business/migrations/0012_sealapplication.py
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
# Generated by Django 4.2.25 on 2025-12-17 09:16
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('business', '0011_case_state'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='SealApplication',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('Printingpurpose', models.CharField(max_length=100)),
|
||||||
|
('CaseNumber', models.CharField(max_length=100)),
|
||||||
|
('Reason', models.TextField()),
|
||||||
|
('seal_number', models.CharField(max_length=100)),
|
||||||
|
('seal_type', models.CharField(max_length=100)),
|
||||||
|
('file', models.TextField()),
|
||||||
|
('times', models.CharField(max_length=100)),
|
||||||
|
('state', models.CharField(max_length=100)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
||||||
19
business/migrations/0013_sealapplication_username.py
Normal file
19
business/migrations/0013_sealapplication_username.py
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
# Generated by Django 4.2.25 on 2025-12-18 01:47
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('business', '0012_sealapplication'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='sealapplication',
|
||||||
|
name='username',
|
||||||
|
field=models.CharField(default='', max_length=100),
|
||||||
|
preserve_default=False,
|
||||||
|
),
|
||||||
|
]
|
||||||
25
business/migrations/0014_warehousing.py
Normal file
25
business/migrations/0014_warehousing.py
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
# Generated by Django 4.2.25 on 2025-12-18 03:30
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('business', '0013_sealapplication_username'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Warehousing',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('unit', models.CharField(max_length=100)),
|
||||||
|
('mark', models.CharField(max_length=100)),
|
||||||
|
('lawyer', models.CharField(max_length=100)),
|
||||||
|
('deadline', models.CharField(max_length=100)),
|
||||||
|
('contract', models.TextField()),
|
||||||
|
('times', models.CharField(max_length=100)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
||||||
23
business/migrations/0015_registerplatform.py
Normal file
23
business/migrations/0015_registerplatform.py
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
# Generated by Django 4.2.25 on 2025-12-19 03:31
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('business', '0014_warehousing'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='RegisterPlatform',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('platform', models.CharField(max_length=100)),
|
||||||
|
('number', models.CharField(max_length=100)),
|
||||||
|
('password', models.CharField(max_length=100)),
|
||||||
|
('username', models.CharField(max_length=100)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
||||||
25
business/migrations/0016_announcement.py
Normal file
25
business/migrations/0016_announcement.py
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
# Generated by Django 4.2.25 on 2025-12-19 05:29
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('business', '0015_registerplatform'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Announcement',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('title', models.CharField(max_length=100)),
|
||||||
|
('content', models.TextField()),
|
||||||
|
('times', models.CharField(max_length=100)),
|
||||||
|
('file', models.TextField()),
|
||||||
|
('username', models.CharField(max_length=100)),
|
||||||
|
('state', models.CharField(max_length=100)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
||||||
21
business/migrations/0017_lawyerflie.py
Normal file
21
business/migrations/0017_lawyerflie.py
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
# Generated by Django 4.2.25 on 2025-12-19 07:00
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('business', '0016_announcement'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='LawyerFlie',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('remark', models.CharField(max_length=200)),
|
||||||
|
('file', models.TextField()),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
||||||
19
business/migrations/0018_lawyerflie_times.py
Normal file
19
business/migrations/0018_lawyerflie_times.py
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
# Generated by Django 4.2.25 on 2025-12-19 07:02
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('business', '0017_lawyerflie'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='lawyerflie',
|
||||||
|
name='times',
|
||||||
|
field=models.CharField(default='', max_length=100),
|
||||||
|
preserve_default=False,
|
||||||
|
),
|
||||||
|
]
|
||||||
24
business/migrations/0019_schedule.py
Normal file
24
business/migrations/0019_schedule.py
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
# Generated by Django 4.2.25 on 2025-12-20 05:23
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('business', '0018_lawyerflie_times'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Schedule',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('title', models.CharField(max_length=100)),
|
||||||
|
('tiems', models.CharField(max_length=100)),
|
||||||
|
('end_time', models.CharField(max_length=100)),
|
||||||
|
('remark', models.CharField(max_length=200)),
|
||||||
|
('state', models.CharField(max_length=100)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
||||||
21
business/migrations/0020_role.py
Normal file
21
business/migrations/0020_role.py
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
# Generated by Django 4.2.25 on 2025-12-22 02:40
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('business', '0019_schedule'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='role',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('RoleName', models.CharField(max_length=100)),
|
||||||
|
('permissionId', models.CharField(max_length=100)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
||||||
19
business/migrations/0021_lawyerflie_title.py
Normal file
19
business/migrations/0021_lawyerflie_title.py
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
# Generated by Django 4.2.25 on 2025-12-22 03:30
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('business', '0020_role'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='lawyerflie',
|
||||||
|
name='title',
|
||||||
|
field=models.CharField(default='', max_length=100),
|
||||||
|
preserve_default=False,
|
||||||
|
),
|
||||||
|
]
|
||||||
21
business/migrations/0022_permission.py
Normal file
21
business/migrations/0022_permission.py
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
# Generated by Django 4.2.25 on 2025-12-22 05:48
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('business', '0021_lawyerflie_title'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='permission',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('permission_name', models.CharField(max_length=100)),
|
||||||
|
('permission_logo', models.CharField(max_length=100)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
||||||
19
business/migrations/0023_permission_parent.py
Normal file
19
business/migrations/0023_permission_parent.py
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
# Generated by Django 4.2.25 on 2025-12-22 09:07
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('business', '0022_permission'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='permission',
|
||||||
|
name='parent',
|
||||||
|
field=models.CharField(default='', max_length=100),
|
||||||
|
preserve_default=False,
|
||||||
|
),
|
||||||
|
]
|
||||||
19
business/migrations/0024_role_remark.py
Normal file
19
business/migrations/0024_role_remark.py
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
# Generated by Django 4.2.25 on 2025-12-23 06:45
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('business', '0023_permission_parent'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='role',
|
||||||
|
name='remark',
|
||||||
|
field=models.CharField(default='', max_length=200),
|
||||||
|
preserve_default=False,
|
||||||
|
),
|
||||||
|
]
|
||||||
0
business/migrations/__init__.py
Normal file
0
business/migrations/__init__.py
Normal file
115
business/models.py
Normal file
115
business/models.py
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
from django.db import models
|
||||||
|
|
||||||
|
# Create your models here.
|
||||||
|
class PreFiling(models.Model):
|
||||||
|
times = models.CharField(max_length=100) # 预立案时间
|
||||||
|
client_username = models.CharField(max_length=100) # 委托人信息 自然人姓名/法人名称
|
||||||
|
party_username = models.CharField(max_length=100) # 相对方信息 自然人姓名/法人名称
|
||||||
|
description = models.TextField() # 描述
|
||||||
|
Undertaker = models.CharField(max_length=100) # 承办人员
|
||||||
|
submit = models.CharField(max_length=100) # 谁提交的
|
||||||
|
|
||||||
|
|
||||||
|
class ProjectRegistration(models.Model):
|
||||||
|
user = models.ForeignKey(PreFiling, on_delete=models.CASCADE)
|
||||||
|
type = models.CharField(max_length=100) # 项目类型
|
||||||
|
ContractNo = models.CharField(max_length=100) # 合同编号
|
||||||
|
times = models.CharField(max_length=100) # 立项日期时间
|
||||||
|
responsiblefor = models.CharField(max_length=100) # 负责人
|
||||||
|
charge = models.CharField(max_length=100) # 收费情况
|
||||||
|
contract = models.CharField(max_length=100) # 合同
|
||||||
|
state = models.CharField(max_length=100) # 状态
|
||||||
|
|
||||||
|
|
||||||
|
class Bid(models.Model):
|
||||||
|
user = models.ForeignKey(PreFiling, on_delete=models.CASCADE)
|
||||||
|
BiddingUnit = models.TextField() # 招标单位 名称、统一社会信用代码/身份证号码
|
||||||
|
ProjectName = models.CharField(max_length=100) # 项目名称
|
||||||
|
times = models.CharField(max_length=100) # 申请日期
|
||||||
|
BiddingAnnouncement = models.CharField(max_length=100) # 上传招标公告
|
||||||
|
state = models.CharField(max_length=100) # 状态
|
||||||
|
|
||||||
|
|
||||||
|
class Case(models.Model):
|
||||||
|
user = models.ForeignKey(PreFiling, on_delete=models.CASCADE)
|
||||||
|
times = models.CharField(max_length=100) # 立案时间
|
||||||
|
AgencyContract = models.TextField() # 代理合同
|
||||||
|
Contractreturn = models.TextField() # 合同返还
|
||||||
|
Closingapplication = models.TextField() # 结案申请
|
||||||
|
ChangeRequest = models.CharField(max_length=100) # 变更申请
|
||||||
|
paymentcollection = models.CharField(max_length=100) # 已收款
|
||||||
|
state = models.CharField(max_length=100) # 状态
|
||||||
|
|
||||||
|
class Invoice(models.Model):
|
||||||
|
user = models.ForeignKey(PreFiling, on_delete=models.CASCADE)
|
||||||
|
amount = models.CharField(max_length=100) # 金额
|
||||||
|
file = models.TextField() # 发票图片或PDF
|
||||||
|
|
||||||
|
class Caselog(models.Model):
|
||||||
|
user = models.ForeignKey(PreFiling, on_delete=models.CASCADE)
|
||||||
|
content = models.TextField()
|
||||||
|
times = models.CharField(max_length=100) # 时间
|
||||||
|
username = models.CharField(max_length=100) # 提交人
|
||||||
|
file = models.TextField() # 文件
|
||||||
|
|
||||||
|
class SealApplication(models.Model):
|
||||||
|
Printingpurpose = models.CharField(max_length=100) # 用印用途
|
||||||
|
CaseNumber = models.CharField(max_length=100) # 案件编号
|
||||||
|
Reason = models.TextField() # 用印事由
|
||||||
|
seal_number = models.CharField(max_length=100) # 盖章份数
|
||||||
|
seal_type = models.CharField(max_length=100) # 盖着类型
|
||||||
|
file = models.TextField() # 上传用印文件
|
||||||
|
times = models.CharField(max_length=100) # 日期
|
||||||
|
state = models.CharField(max_length=100) # 状态
|
||||||
|
username = models.CharField(max_length=100) # 提交人
|
||||||
|
|
||||||
|
|
||||||
|
class Warehousing(models.Model):
|
||||||
|
unit = models.CharField(max_length=100) # 单位
|
||||||
|
mark = models.CharField(max_length=100) # 入库标的
|
||||||
|
lawyer = models.CharField(max_length=100) # 主办律师
|
||||||
|
deadline = models.CharField(max_length=100) # 入库期限
|
||||||
|
contract = models.TextField() # 入库合同
|
||||||
|
times = models.CharField(max_length=100) # 日期
|
||||||
|
|
||||||
|
class RegisterPlatform(models.Model):
|
||||||
|
platform = models.CharField(max_length=100) # 注册平台
|
||||||
|
number = models.CharField(max_length=100) # 注册号码
|
||||||
|
password = models.CharField(max_length=100) # 密码
|
||||||
|
username = models.CharField(max_length=100) # 注册人员
|
||||||
|
|
||||||
|
class Announcement(models.Model):
|
||||||
|
title = models.CharField(max_length=100) # 标题
|
||||||
|
content = models.TextField() # 内容
|
||||||
|
times = models.CharField(max_length=100) # 提交时间
|
||||||
|
file = models.TextField() # 文件
|
||||||
|
username = models.CharField(max_length=100) # 提交人
|
||||||
|
state = models.CharField(max_length=100) # 状态
|
||||||
|
|
||||||
|
|
||||||
|
class LawyerFlie(models.Model):
|
||||||
|
title = models.CharField(max_length=100) # 标题
|
||||||
|
remark = models.CharField(max_length=200)
|
||||||
|
file = models.TextField() # 文件
|
||||||
|
times = models.CharField(max_length=100)
|
||||||
|
|
||||||
|
|
||||||
|
class Schedule(models.Model):
|
||||||
|
title = models.CharField(max_length=100) # 标题
|
||||||
|
tiems = models.CharField(max_length=100)
|
||||||
|
end_time = models.CharField(max_length=100)
|
||||||
|
remark = models.CharField(max_length=200) # 备注
|
||||||
|
state = models.CharField(max_length=100)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class role(models.Model):
|
||||||
|
RoleName = models.CharField(max_length=100) # 角色名称
|
||||||
|
permissionId = models.CharField(max_length=100) # 权限
|
||||||
|
remark = models.CharField(max_length=200) # 备注
|
||||||
|
|
||||||
|
|
||||||
|
class permission(models.Model):
|
||||||
|
permission_name = models.CharField(max_length=100) # 权限名称
|
||||||
|
permission_logo = models.CharField(max_length=100) # 权限标识
|
||||||
|
parent = models.CharField(max_length=100) # 父级
|
||||||
3
business/tests.py
Normal file
3
business/tests.py
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
from django.test import TestCase
|
||||||
|
|
||||||
|
# Create your tests here.
|
||||||
52
business/urls.py
Normal file
52
business/urls.py
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
from django.urls import path
|
||||||
|
|
||||||
|
from .models import Schedule
|
||||||
|
from .views import registration,registrationDetail,Project,Projectquerytype,ProjectDetail,EditProject,BidRegistration,BidDetail,registrationList,caseManagement,caseManagementDetail,Uploadinvoice,InvoiceDetail,Log,LogDetail,accumulate,preFilingLinkedCases,Application,ApplicationDetail,WarehousingRegistration,WarehousingDetail,PlatformRegistration,PlatformDetail,EditPlatformDetail,DeletePlatformDetail,bulletin,BulletinDetail,EditBulletin,deleteBulletin,Lawyersdocuments,LawyersdocumentsDetail,LwaDetail,CreateSchedule,DeleteSchedule,ScheduleDetail,handleSchedule,AddRermission,DisplayRermission,DeleteRermission,EditRermission,addRole,DeleteRole,EditRole,displayRole,modifypermissions
|
||||||
|
urlpatterns = [
|
||||||
|
|
||||||
|
path('register',registration.as_view(),name='register'),
|
||||||
|
path('registerdetail',registrationDetail.as_view(),name='registerdetail'),
|
||||||
|
path('project',Project.as_view(),name='project'),
|
||||||
|
path('projectquerytype',Projectquerytype.as_view(),name='projectquerytype'),
|
||||||
|
path('projectdetail',ProjectDetail.as_view(),name='projectdetail'),
|
||||||
|
path('editproject',EditProject.as_view(),name='editproject'),
|
||||||
|
path('bid',BidRegistration.as_view(),name='bid'),
|
||||||
|
path('biddetail',BidDetail.as_view(),name='biddetail'),
|
||||||
|
path('registrationlist',registrationList.as_view(),name='registrationlist'),
|
||||||
|
path('casemanagement',caseManagement.as_view(),name='casemanagement'),
|
||||||
|
path('casemanagementdetail',caseManagementDetail.as_view(),name='casemanagementdetail'),
|
||||||
|
path('uploadinvoice',Uploadinvoice.as_view(),name='uploadinvoice'),
|
||||||
|
path('invoicedetail',InvoiceDetail.as_view(),name='invoicedetail'),
|
||||||
|
path('log',Log.as_view(),name='log'),
|
||||||
|
path('logdetail',LogDetail.as_view(),name='logdetail'),
|
||||||
|
path('accumulate',accumulate.as_view(),name='accumulate'),
|
||||||
|
path('preFilingLinkedCases',preFilingLinkedCases.as_view(),name='preFilingLinkedCases'),
|
||||||
|
path('application',Application.as_view(),name='application'),
|
||||||
|
path('applicationdetail',ApplicationDetail.as_view(),name='applicationdetail'),
|
||||||
|
path('warehousing',WarehousingRegistration.as_view(),name='WarehousingRegistration'),
|
||||||
|
path('warehousingdetail',WarehousingDetail.as_view(),name='warehousingdetail'),
|
||||||
|
path('PlatformRegistration',PlatformRegistration.as_view(),name='PlatformRegistration'),
|
||||||
|
path('PlatformDetail',PlatformDetail.as_view(),name='PlatformDetail'),
|
||||||
|
path('editPlatform',EditPlatformDetail.as_view(),name='editPlatform'),
|
||||||
|
path('deletePlatform',DeletePlatformDetail.as_view(),name='deletePlatform'),
|
||||||
|
path('bulletin',bulletin.as_view(),name='bulletin'),
|
||||||
|
path('bulletindetail',BulletinDetail.as_view(),name='bulletindetail'),
|
||||||
|
path('editBulletin',EditBulletin.as_view(),name='EditBulletin'),
|
||||||
|
path('deleteBulletin',deleteBulletin.as_view(),name='deleteBulletin'),
|
||||||
|
path('Lawyerflie',Lawyersdocuments.as_view(),name='LawyerFlie'),
|
||||||
|
path('lawdisplay',LawyersdocumentsDetail.as_view(),name='lawdetail'),
|
||||||
|
path('LwaDetail',LwaDetail.as_view(),name='LwaDetail'),
|
||||||
|
path('schedule',CreateSchedule.as_view(),name='schedule'),
|
||||||
|
path('scheduledetail',DeleteSchedule.as_view(),name='scheduledetail'),
|
||||||
|
path('ScheduleDetail',ScheduleDetail.as_view(),name='ScheduleDetail'),
|
||||||
|
path('handleSchedule',handleSchedule.as_view(),name='handleSchedule'),
|
||||||
|
path('addRermission',AddRermission.as_view(),name='addRermission'),
|
||||||
|
path('displayRermission',DisplayRermission.as_view(),name='displayRermission'),
|
||||||
|
path('deleteRermission',DeleteRermission.as_view(),name='deleteRermission'),
|
||||||
|
path('editRermission',EditRermission.as_view(),name='editRermission'),
|
||||||
|
path('addRole',addRole.as_view(),name='addRole'),
|
||||||
|
path('DeleteRole',DeleteRole.as_view(),name='DeleteRole'),
|
||||||
|
path('EditRole',EditRole.as_view(),name='EditRole'),
|
||||||
|
path('displayRole',displayRole.as_view(),name='displayRole'),
|
||||||
|
path('modifypermissions',modifypermissions.as_view(),name="modifypermissions")
|
||||||
|
]
|
||||||
1339
business/views.py
Normal file
1339
business/views.py
Normal file
File diff suppressed because it is too large
Load Diff
0
finance/__init__.py
Normal file
0
finance/__init__.py
Normal file
3
finance/admin.py
Normal file
3
finance/admin.py
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
from django.contrib import admin
|
||||||
|
|
||||||
|
# Register your models here.
|
||||||
6
finance/apps.py
Normal file
6
finance/apps.py
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
from django.apps import AppConfig
|
||||||
|
|
||||||
|
|
||||||
|
class FinanceConfig(AppConfig):
|
||||||
|
default_auto_field = 'django.db.models.BigAutoField'
|
||||||
|
name = 'finance'
|
||||||
30
finance/migrations/0001_initial.py
Normal file
30
finance/migrations/0001_initial.py
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
# Generated by Django 4.2.25 on 2025-12-09 16:43
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
initial = True
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Invoice',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('ContractNo', models.TextField()),
|
||||||
|
('personincharge', models.CharField(max_length=100)),
|
||||||
|
('amount', models.CharField(max_length=100)),
|
||||||
|
('type', models.CharField(max_length=100)),
|
||||||
|
('unit', models.CharField(max_length=100)),
|
||||||
|
('number', models.CharField(max_length=100)),
|
||||||
|
('address_telephone', models.CharField(max_length=100)),
|
||||||
|
('bank', models.CharField(max_length=100)),
|
||||||
|
('state', models.CharField(max_length=100)),
|
||||||
|
('username', models.CharField(max_length=100)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
||||||
19
finance/migrations/0002_invoice_times.py
Normal file
19
finance/migrations/0002_invoice_times.py
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
# Generated by Django 4.2.25 on 2025-12-09 17:43
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('finance', '0001_initial'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='invoice',
|
||||||
|
name='times',
|
||||||
|
field=models.TextField(default=''),
|
||||||
|
preserve_default=False,
|
||||||
|
),
|
||||||
|
]
|
||||||
26
finance/migrations/0003_income.py
Normal file
26
finance/migrations/0003_income.py
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
# Generated by Django 4.2.25 on 2025-12-11 05:46
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('finance', '0002_invoice_times'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Income',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('times', models.CharField(max_length=100)),
|
||||||
|
('ContractNo', models.CharField(max_length=100)),
|
||||||
|
('CustomerID', models.CharField(max_length=100)),
|
||||||
|
('amount', models.CharField(max_length=100)),
|
||||||
|
('allocate', models.CharField(max_length=100)),
|
||||||
|
('submit', models.CharField(max_length=100)),
|
||||||
|
('submit_tiem', models.CharField(max_length=100)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
||||||
19
finance/migrations/0004_income_state.py
Normal file
19
finance/migrations/0004_income_state.py
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
# Generated by Django 4.2.25 on 2025-12-11 06:18
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('finance', '0003_income'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='income',
|
||||||
|
name='state',
|
||||||
|
field=models.CharField(default='', max_length=100),
|
||||||
|
preserve_default=False,
|
||||||
|
),
|
||||||
|
]
|
||||||
27
finance/migrations/0005_accounts.py
Normal file
27
finance/migrations/0005_accounts.py
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
# Generated by Django 4.2.25 on 2025-12-11 06:38
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('finance', '0004_income_state'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Accounts',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('times', models.CharField(max_length=100)),
|
||||||
|
('ContractNo', models.CharField(max_length=100)),
|
||||||
|
('CustomerID', models.CharField(max_length=100)),
|
||||||
|
('amount', models.CharField(max_length=100)),
|
||||||
|
('situation', models.TextField()),
|
||||||
|
('submit', models.CharField(max_length=100)),
|
||||||
|
('submit_tiem', models.CharField(max_length=100)),
|
||||||
|
('state', models.CharField(max_length=100)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
||||||
28
finance/migrations/0006_payment.py
Normal file
28
finance/migrations/0006_payment.py
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
# Generated by Django 4.2.25 on 2025-12-11 08:56
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('finance', '0005_accounts'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Payment',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('reason', models.TextField()),
|
||||||
|
('amount', models.CharField(max_length=100)),
|
||||||
|
('times', models.CharField(max_length=100)),
|
||||||
|
('payee', models.CharField(max_length=100)),
|
||||||
|
('bankcard', models.CharField(max_length=100)),
|
||||||
|
('BankName', models.CharField(max_length=100)),
|
||||||
|
('applicant', models.CharField(max_length=100)),
|
||||||
|
('submit_tiem', models.CharField(max_length=100)),
|
||||||
|
('state', models.CharField(max_length=100)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
||||||
26
finance/migrations/0007_reimbursement.py
Normal file
26
finance/migrations/0007_reimbursement.py
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
# Generated by Django 4.2.25 on 2025-12-11 09:31
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('finance', '0006_payment'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Reimbursement',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('person', models.CharField(max_length=100)),
|
||||||
|
('times', models.CharField(max_length=100)),
|
||||||
|
('reason', models.TextField()),
|
||||||
|
('amount', models.CharField(max_length=100)),
|
||||||
|
('FeeDescription', models.TextField()),
|
||||||
|
('submit_tiem', models.CharField(max_length=100)),
|
||||||
|
('state', models.CharField(max_length=100)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
||||||
23
finance/migrations/0008_bonuschange.py
Normal file
23
finance/migrations/0008_bonuschange.py
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
# Generated by Django 4.2.25 on 2025-12-12 08:19
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('finance', '0007_reimbursement'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='BonusChange',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('username', models.CharField(max_length=100)),
|
||||||
|
('type', models.CharField(max_length=100)),
|
||||||
|
('Instructions', models.TextField()),
|
||||||
|
('times', models.CharField(max_length=100)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
||||||
19
finance/migrations/0009_bonuschange_state.py
Normal file
19
finance/migrations/0009_bonuschange_state.py
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
# Generated by Django 4.2.25 on 2025-12-12 08:30
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('finance', '0008_bonuschange'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='bonuschange',
|
||||||
|
name='state',
|
||||||
|
field=models.CharField(default='', max_length=100),
|
||||||
|
preserve_default=False,
|
||||||
|
),
|
||||||
|
]
|
||||||
0
finance/migrations/__init__.py
Normal file
0
finance/migrations/__init__.py
Normal file
65
finance/models.py
Normal file
65
finance/models.py
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
from django.db import models
|
||||||
|
|
||||||
|
# Create your models here.
|
||||||
|
class Invoice(models.Model):
|
||||||
|
ContractNo = models.TextField() # 合同号
|
||||||
|
personincharge = models.CharField(max_length=100) # 负责人
|
||||||
|
amount =models.CharField(max_length=100) # 开票金额
|
||||||
|
type = models.CharField(max_length=100) # 开票类型
|
||||||
|
unit = models.CharField(max_length=100) # 开票单位全称
|
||||||
|
number = models.CharField(max_length=100) # 纳税人识别号
|
||||||
|
address_telephone = models.CharField(max_length=100) # 地址/电话
|
||||||
|
bank = models.CharField(max_length=100) # 银行卡
|
||||||
|
state = models.CharField(max_length=100) # 状态
|
||||||
|
username = models.CharField(max_length=100) # 谁提交的
|
||||||
|
times = models.TextField() # 提交时间
|
||||||
|
|
||||||
|
|
||||||
|
class Income(models.Model):
|
||||||
|
times = models.CharField(max_length=100) # 收款日期
|
||||||
|
ContractNo = models.CharField(max_length=100) # 合同号
|
||||||
|
CustomerID = models.CharField(max_length=100) # 客户名称
|
||||||
|
amount = models.CharField(max_length=100) # 收款金额
|
||||||
|
allocate = models.CharField(max_length=100) # 收入分配
|
||||||
|
submit = models.CharField(max_length=100) # 谁提交的
|
||||||
|
submit_tiem = models.CharField(max_length=100) # 提交时间
|
||||||
|
state = models.CharField(max_length=100) # 状态
|
||||||
|
|
||||||
|
|
||||||
|
class Accounts(models.Model):
|
||||||
|
times = models.CharField(max_length=100) # 收款日期
|
||||||
|
ContractNo = models.CharField(max_length=100) # 合同号
|
||||||
|
CustomerID = models.CharField(max_length=100) # 客户名称
|
||||||
|
amount = models.CharField(max_length=100) # 收款金额
|
||||||
|
situation = models.TextField() # 情况
|
||||||
|
submit = models.CharField(max_length=100) # 谁提交的
|
||||||
|
submit_tiem = models.CharField(max_length=100) # 提交时间
|
||||||
|
state = models.CharField(max_length=100) # 状态
|
||||||
|
|
||||||
|
|
||||||
|
class Payment(models.Model):
|
||||||
|
reason = models.TextField() # 付款理由
|
||||||
|
amount = models.CharField(max_length=100) # 付款金额
|
||||||
|
times = models.CharField(max_length=100) # 付款日期
|
||||||
|
payee = models.CharField(max_length=100) # 收款人
|
||||||
|
bankcard = models.CharField(max_length=100) # 银行卡
|
||||||
|
BankName = models.CharField(max_length=100) # 开户行
|
||||||
|
applicant = models.CharField(max_length=100) # 申请人
|
||||||
|
submit_tiem = models.CharField(max_length=100) # 提交时间
|
||||||
|
state = models.CharField(max_length=100) # 状态
|
||||||
|
|
||||||
|
class Reimbursement(models.Model):
|
||||||
|
person = models.CharField(max_length=100) # 报销人
|
||||||
|
times = models.CharField(max_length=100) # 报销日期
|
||||||
|
reason = models.TextField() # 报销理由
|
||||||
|
amount = models.CharField(max_length=100) # 报销金额
|
||||||
|
FeeDescription = models.TextField() # 费用说明
|
||||||
|
submit_tiem = models.CharField(max_length=100) # 提交时间
|
||||||
|
state = models.CharField(max_length=100) # 状态
|
||||||
|
|
||||||
|
class BonusChange(models.Model):
|
||||||
|
username = models.CharField(max_length=100)
|
||||||
|
type = models.CharField(max_length=100)
|
||||||
|
Instructions = models.TextField() # 调整说明
|
||||||
|
times = models.CharField(max_length=100) # 时间
|
||||||
|
state = models.CharField(max_length=100) # 状态
|
||||||
3
finance/tests.py
Normal file
3
finance/tests.py
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
from django.test import TestCase
|
||||||
|
|
||||||
|
# Create your tests here.
|
||||||
18
finance/urls.py
Normal file
18
finance/urls.py
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
from .views import UserRegister,issueAnInvoice,issueAnInvoiceDetail,confirm,loan,PaymentRequest,reimbursement,confirmdisplay,loandisplay,PaymentDisplay,reimbursementdetail,Change,ChangeDetail
|
||||||
|
from django.urls import path
|
||||||
|
|
||||||
|
urlpatterns = [
|
||||||
|
path("user-register", UserRegister.as_view(), name="user-register/"),
|
||||||
|
path("issue-invoice", issueAnInvoice.as_view(), name="issue-invoice/"),
|
||||||
|
path('issue-Detail', issueAnInvoiceDetail.as_view(), name="issue-Detail/"),
|
||||||
|
path('confirm', confirm.as_view(), name="confirm/"),
|
||||||
|
path('loan', loan.as_view(), name="loan/"),
|
||||||
|
path('payment-request', PaymentRequest.as_view(), name="payment-request/"),
|
||||||
|
path('reimbursement',reimbursement.as_view(), name="reimbursement/"),
|
||||||
|
path('confirmdisplay', confirmdisplay.as_view(), name="confirmdisplay/"),
|
||||||
|
path('loandisplay', loandisplay.as_view(), name="loandisplay/"),
|
||||||
|
path('PaymentDisplay', PaymentDisplay.as_view(), name="PaymentDisplay/"),
|
||||||
|
path('reidetail',reimbursementdetail.as_view(), name="reimbursementdetail/"),
|
||||||
|
path('change',Change.as_view(), name="Change/"),
|
||||||
|
path('ChangeDetail', ChangeDetail.as_view(), name="ChangeDetail/"),
|
||||||
|
]
|
||||||
569
finance/views.py
Normal file
569
finance/views.py
Normal file
@@ -0,0 +1,569 @@
|
|||||||
|
from rest_framework.views import APIView
|
||||||
|
from rest_framework.response import Response
|
||||||
|
from rest_framework import status
|
||||||
|
import json
|
||||||
|
import ast
|
||||||
|
from User.models import User,Approval
|
||||||
|
import datetime
|
||||||
|
from .models import Invoice,Income,Accounts,Payment,Reimbursement,BonusChange
|
||||||
|
from utility.utility import flies
|
||||||
|
from django.contrib.sessions.backends.db import SessionStore
|
||||||
|
from django.db.models import Count, Q
|
||||||
|
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
|
||||||
|
|
||||||
|
class UserRegister(APIView):
|
||||||
|
def post(self, request, *args, **kwargs):
|
||||||
|
"""
|
||||||
|
财务登记
|
||||||
|
:param request:
|
||||||
|
:param args:
|
||||||
|
:param kwargs:
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
username = request.data.get('username')
|
||||||
|
card = request.data.get('card')
|
||||||
|
Dateofjoining = request.data.get('Dateofjoining')
|
||||||
|
position = request.data.get('position')
|
||||||
|
salary = request.data.get('salary')
|
||||||
|
personincharge = request.data.get('personincharge')
|
||||||
|
if not all([username, card, Dateofjoining, position, salary]):
|
||||||
|
return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
Dateofjoinings = datetime.datetime.strptime(Dateofjoining, "%Y-%m-%d")
|
||||||
|
user = User.objects.get(username=username)
|
||||||
|
user.card = card
|
||||||
|
user.salary = salary
|
||||||
|
user.username = username
|
||||||
|
user.Dateofjoining = Dateofjoinings
|
||||||
|
user.position = position
|
||||||
|
user.state="待确认"
|
||||||
|
|
||||||
|
today = datetime.datetime.now()
|
||||||
|
formatted_date = today.strftime("%Y-%m-%d")
|
||||||
|
Approval.objects.create(
|
||||||
|
title=username+"入职财务登记",
|
||||||
|
content=username+"在"+Dateofjoining+"办理入职,身份证:"+card+",岗位:"+position+"薪资:"+salary,
|
||||||
|
times=formatted_date,
|
||||||
|
personincharge=personincharge,
|
||||||
|
state='审核中',
|
||||||
|
type="入职财务登记",
|
||||||
|
user_id=user.id
|
||||||
|
)
|
||||||
|
|
||||||
|
user.save(update_fields=['card', 'salary', 'username', 'Dateofjoining', 'position'])
|
||||||
|
return Response({'message': '登记成功', 'code': 0}, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
|
|
||||||
|
class issueAnInvoice(APIView):
|
||||||
|
def post(self, request, *args, **kwargs):
|
||||||
|
"""
|
||||||
|
财务开票
|
||||||
|
:param request:
|
||||||
|
:param args:
|
||||||
|
:param kwargs:
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
token = request.META.get('token')
|
||||||
|
ContractNo = request.data.get('ContractNo')
|
||||||
|
personincharge = request.data.get('personincharge')
|
||||||
|
amount = request.data.get('amount')
|
||||||
|
type = request.data.get('type')
|
||||||
|
unit = request.data.get('unit')
|
||||||
|
number = request.data.get('number')
|
||||||
|
address_telephone = request.data.get('address_telephone')
|
||||||
|
bank = request.data.get('bank')
|
||||||
|
username = request.data.get('username')
|
||||||
|
|
||||||
|
if not all([token, ContractNo, personincharge, amount, type, unit, number, address_telephone, bank,username]):
|
||||||
|
return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
today = datetime.datetime.now()
|
||||||
|
formatted_date = today.strftime("%Y-%m-%d")
|
||||||
|
invoice = Invoice.objects.create(
|
||||||
|
ContractNo=ContractNo,
|
||||||
|
personincharge=personincharge,
|
||||||
|
amount=amount,
|
||||||
|
type=type,
|
||||||
|
unit=unit,
|
||||||
|
number=number,
|
||||||
|
address_telephone=address_telephone,
|
||||||
|
bank=bank,
|
||||||
|
state="审核中",
|
||||||
|
username=username,
|
||||||
|
times=formatted_date,
|
||||||
|
)
|
||||||
|
Approval.objects.create(
|
||||||
|
title=username+"申请开票",
|
||||||
|
content="在"+formatted_date+"的时候审核开发票",
|
||||||
|
times=formatted_date,
|
||||||
|
personincharge=personincharge,
|
||||||
|
state="审核中",
|
||||||
|
type="开票",
|
||||||
|
user_id = invoice.id
|
||||||
|
)
|
||||||
|
return Response({'message': '提交成功', 'code': 0}, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
|
|
||||||
|
class issueAnInvoiceDetail(APIView):
|
||||||
|
def post(self, request, *args, **kwargs):
|
||||||
|
"""
|
||||||
|
开票记录详情
|
||||||
|
"""
|
||||||
|
page = request.data.get('page')
|
||||||
|
per_page = request.data.get('per_page')
|
||||||
|
times = request.data.get('times')
|
||||||
|
end_time = request.data.get('end_time')
|
||||||
|
unit = request.data.get('unit')
|
||||||
|
if not all([page, per_page]):
|
||||||
|
return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
Q_obj = Q()
|
||||||
|
if times and end_time:
|
||||||
|
Q_obj &= Q(times__gte=times) & Q(times__lte=end_time)
|
||||||
|
if unit:
|
||||||
|
Q_obj &= Q(unit__icontains=unit)
|
||||||
|
|
||||||
|
invos = Invoice.objects.filter(Q_obj)
|
||||||
|
total = len(invos)
|
||||||
|
|
||||||
|
paginator = Paginator(invos, per_page)
|
||||||
|
try:
|
||||||
|
user_agents_page = paginator.page(page)
|
||||||
|
|
||||||
|
except PageNotAnInteger:
|
||||||
|
user_agents_page = paginator.page(1)
|
||||||
|
except EmptyPage:
|
||||||
|
user_agents_page = paginator.page(paginator.num_pages)
|
||||||
|
data = []
|
||||||
|
for info in user_agents_page.object_list:
|
||||||
|
itme = {
|
||||||
|
'id': info.id,
|
||||||
|
"ContractNo": info.ContractNo,
|
||||||
|
"personincharge": info.personincharge,
|
||||||
|
"amount": info.amount,
|
||||||
|
"type": info.type,
|
||||||
|
"unit": info.unit,
|
||||||
|
"number": info.number,
|
||||||
|
"address_telephone": info.address_telephone,
|
||||||
|
"bank": info.bank,
|
||||||
|
"state": info.state,
|
||||||
|
"username": info.username,
|
||||||
|
"times": info.times,
|
||||||
|
}
|
||||||
|
data.append(itme)
|
||||||
|
return Response({'message': '展示成功',"total":total,'data':data, 'code': 0}, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
|
|
||||||
|
class confirm(APIView):
|
||||||
|
def post(self, request, *args, **kwargs):
|
||||||
|
"""
|
||||||
|
收入确认
|
||||||
|
:param request:
|
||||||
|
:param args:
|
||||||
|
:param kwargs:
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
times = request.data.get('times')
|
||||||
|
ContractNo = request.data.get('ContractNo')
|
||||||
|
CustomerID = request.data.get('CustomerID')
|
||||||
|
amount = request.data.get('amount')
|
||||||
|
allocate = request.data.get('allocate')
|
||||||
|
token = request.META.get('token')
|
||||||
|
personincharge = request.data.get('personincharge')
|
||||||
|
user = User.objects.get(token=token)
|
||||||
|
if not all([times, ContractNo, CustomerID, amount, allocate]):
|
||||||
|
return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
from datetime import datetime
|
||||||
|
now = datetime.now()
|
||||||
|
|
||||||
|
# 格式化日期为字符串,格式为 YYYY-MM-DD
|
||||||
|
date_string = now.strftime("%Y-%m-%d")
|
||||||
|
income = Income.objects.create(
|
||||||
|
times=times,
|
||||||
|
ContractNo=ContractNo,
|
||||||
|
CustomerID=CustomerID,
|
||||||
|
amount=amount,
|
||||||
|
allocate=allocate,
|
||||||
|
submit=user.username,
|
||||||
|
submit_tiem=date_string,
|
||||||
|
state="审核中"
|
||||||
|
)
|
||||||
|
|
||||||
|
Approval.objects.create(
|
||||||
|
title=user.username + "提交收入确认",
|
||||||
|
content=user.username + "在" + times + "提交了收入确认,合同编号:" + ContractNo + ",客户名称:" + CustomerID + "收入金额:" + amount,
|
||||||
|
times=date_string,
|
||||||
|
personincharge=personincharge,
|
||||||
|
state='审核中',
|
||||||
|
type="收入确认",
|
||||||
|
user_id=income.id
|
||||||
|
)
|
||||||
|
return Response({'message': '插入成功' ,'code': 0}, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
|
class confirmdisplay(APIView):
|
||||||
|
def post(self, request, *args, **kwargs):
|
||||||
|
"""
|
||||||
|
收入确认展示
|
||||||
|
"""
|
||||||
|
page = request.data.get('page')
|
||||||
|
per_page = request.data.get('per_page')
|
||||||
|
times = request.data.get('times')
|
||||||
|
end_time = request.data.get('end_time')
|
||||||
|
CustomerID = request.data.get('CustomerID')
|
||||||
|
if not all([page, per_page]):
|
||||||
|
return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
Q_obj = Q()
|
||||||
|
if times and end_time:
|
||||||
|
Q_obj &= Q(times__gte=times) & Q(times__lte=end_time)
|
||||||
|
if CustomerID:
|
||||||
|
Q_obj &= Q(CustomerID__icontains=CustomerID)
|
||||||
|
income = Income.objects.filter(Q_obj)
|
||||||
|
total = len(income)
|
||||||
|
|
||||||
|
paginator = Paginator(income, per_page)
|
||||||
|
try:
|
||||||
|
user_agents_page = paginator.page(page)
|
||||||
|
|
||||||
|
except PageNotAnInteger:
|
||||||
|
user_agents_page = paginator.page(1)
|
||||||
|
except EmptyPage:
|
||||||
|
user_agents_page = paginator.page(paginator.num_pages)
|
||||||
|
data = []
|
||||||
|
for info in user_agents_page.object_list:
|
||||||
|
itme = {
|
||||||
|
'id': info.id,
|
||||||
|
"times": info.times,
|
||||||
|
"ContractNo": info.ContractNo,
|
||||||
|
"CustomerID": info.CustomerID,
|
||||||
|
"amount": info.amount,
|
||||||
|
"allocate": info.allocate,
|
||||||
|
"state": info.state,
|
||||||
|
}
|
||||||
|
data.append(itme)
|
||||||
|
return Response({'message': '展示成功', "total": total, 'data': data, 'code': 0}, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
|
|
||||||
|
class loan(APIView):
|
||||||
|
def post(self, request, *args, **kwargs):
|
||||||
|
"""
|
||||||
|
调账申请
|
||||||
|
:param request:
|
||||||
|
:param args:
|
||||||
|
:param kwargs:
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
times = request.data.get('times')
|
||||||
|
ContractNo = request.data.get('ContractNo')
|
||||||
|
CustomerID = request.data.get('CustomerID')
|
||||||
|
amount = request.data.get('amount')
|
||||||
|
situation = request.data.get('situation')
|
||||||
|
personincharge = request.data.get('personincharge')
|
||||||
|
token = request.META.get('token')
|
||||||
|
if not all([times, ContractNo, amount, situation,CustomerID,personincharge]):
|
||||||
|
return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
from datetime import datetime
|
||||||
|
now = datetime.now()
|
||||||
|
|
||||||
|
# 格式化日期为字符串,格式为 YYYY-MM-DD
|
||||||
|
date_string = now.strftime("%Y-%m-%d")
|
||||||
|
user = User.objects.get(token=token)
|
||||||
|
|
||||||
|
acc = Accounts.objects.create(
|
||||||
|
times=times,
|
||||||
|
ContractNo=ContractNo,
|
||||||
|
CustomerID=CustomerID,
|
||||||
|
amount=amount,
|
||||||
|
situation=situation,
|
||||||
|
submit=user.username,
|
||||||
|
submit_tiem=date_string,
|
||||||
|
state="审核中"
|
||||||
|
)
|
||||||
|
Approval.objects.create(
|
||||||
|
title=user.username + "提交调账申请",
|
||||||
|
content=user.username + "在" + times + "提交了调账申请,合同编号:" + ContractNo + ",客户名称:" + CustomerID + "收入金额:" + amount,
|
||||||
|
times=date_string,
|
||||||
|
personincharge=personincharge,
|
||||||
|
state='审核中',
|
||||||
|
type="调账申请",
|
||||||
|
user_id=acc.id
|
||||||
|
)
|
||||||
|
return Response({'message': '插入成功' ,'code': 0}, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
|
class loandisplay(APIView):
|
||||||
|
def post(self, request, *args, **kwargs):
|
||||||
|
page = request.data.get('page')
|
||||||
|
per_page = request.data.get('per_page')
|
||||||
|
times = request.data.get('times')
|
||||||
|
end_time = request.data.get('end_time')
|
||||||
|
CustomerID = request.data.get('CustomerID')
|
||||||
|
if not all([page, per_page]):
|
||||||
|
return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
Q_obj = Q()
|
||||||
|
if times and end_time:
|
||||||
|
Q_obj &= Q(times__gte=times) & Q(times__lte=end_time)
|
||||||
|
if CustomerID:
|
||||||
|
Q_obj &= Q(CustomerID__icontains=CustomerID)
|
||||||
|
acc = Accounts.objects.filter(Q_obj)
|
||||||
|
total = len(acc)
|
||||||
|
|
||||||
|
paginator = Paginator(acc, per_page)
|
||||||
|
try:
|
||||||
|
user_agents_page = paginator.page(page)
|
||||||
|
|
||||||
|
except PageNotAnInteger:
|
||||||
|
user_agents_page = paginator.page(1)
|
||||||
|
except EmptyPage:
|
||||||
|
user_agents_page = paginator.page(paginator.num_pages)
|
||||||
|
data = []
|
||||||
|
for info in user_agents_page.object_list:
|
||||||
|
itme = {
|
||||||
|
'id': info.id,
|
||||||
|
"times": info.times,
|
||||||
|
"ContractNo": info.ContractNo,
|
||||||
|
"CustomerID": info.CustomerID,
|
||||||
|
"amount": info.amount,
|
||||||
|
"situation": info.situation,
|
||||||
|
"state": info.state,
|
||||||
|
}
|
||||||
|
data.append(itme)
|
||||||
|
return Response({'message': '展示成功', "total": total, 'data': data, 'code': 0}, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
|
|
||||||
|
class PaymentRequest(APIView):
|
||||||
|
def post(self, request, *args, **kwargs):
|
||||||
|
"""
|
||||||
|
付款申请
|
||||||
|
:param request:
|
||||||
|
:param args:
|
||||||
|
:param kwargs:
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
reason = request.data.get('reason')
|
||||||
|
amount = request.data.get('amount')
|
||||||
|
times = request.data.get('times')
|
||||||
|
payee = request.data.get('payee')
|
||||||
|
bankcard = request.data.get('bankcard')
|
||||||
|
BankName = request.data.get('BankName')
|
||||||
|
applicant= request.data.get('applicant')
|
||||||
|
personincharge = request.data.get('personincharge')
|
||||||
|
|
||||||
|
if not all([times, payee, bankcard, BankName, personincharge,reason,amount]):
|
||||||
|
return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
from datetime import datetime
|
||||||
|
now = datetime.now()
|
||||||
|
|
||||||
|
# 格式化日期为字符串,格式为 YYYY-MM-DD
|
||||||
|
date_string = now.strftime("%Y-%m-%d")
|
||||||
|
pay = Payment.objects.create(
|
||||||
|
reason=reason,
|
||||||
|
amount=amount,
|
||||||
|
times=times,
|
||||||
|
payee=payee,
|
||||||
|
bankcard=bankcard,
|
||||||
|
BankName=BankName,
|
||||||
|
applicant=applicant,
|
||||||
|
submit_tiem=date_string,
|
||||||
|
state="审核中"
|
||||||
|
)
|
||||||
|
Approval.objects.create(
|
||||||
|
title=applicant + "提交付款申请",
|
||||||
|
content=applicant + "在" + times + "提交了付款申请,付款理由:" + reason + ",付款金额:" + amount + ",付款日期:" + times+",收款人:"+payee+",银行卡:"+bankcard+",开户行:"+BankName,
|
||||||
|
times=date_string,
|
||||||
|
personincharge=personincharge,
|
||||||
|
state='审核中',
|
||||||
|
type="付款申请",
|
||||||
|
user_id=pay.id
|
||||||
|
)
|
||||||
|
return Response({'message': '插入成功' ,'code': 0}, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
|
class PaymentDisplay(APIView):
|
||||||
|
def post(self, request, *args, **kwargs):
|
||||||
|
page = request.data.get('page')
|
||||||
|
per_page = request.data.get('per_page')
|
||||||
|
times = request.data.get('times')
|
||||||
|
end_time = request.data.get('end_time')
|
||||||
|
payee = request.data.get('payee')
|
||||||
|
if not all([page, per_page]):
|
||||||
|
return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
Q_obj = Q()
|
||||||
|
if times and end_time:
|
||||||
|
Q_obj &= Q(times__gte=times) & Q(times__lte=end_time)
|
||||||
|
if payee:
|
||||||
|
Q_obj &= Q(payee__icontains=payee)
|
||||||
|
pay = Payment.objects.filter(Q_obj)
|
||||||
|
total = len(pay)
|
||||||
|
|
||||||
|
paginator = Paginator(pay, per_page)
|
||||||
|
try:
|
||||||
|
user_agents_page = paginator.page(page)
|
||||||
|
|
||||||
|
except PageNotAnInteger:
|
||||||
|
user_agents_page = paginator.page(1)
|
||||||
|
except EmptyPage:
|
||||||
|
user_agents_page = paginator.page(paginator.num_pages)
|
||||||
|
data = []
|
||||||
|
for info in user_agents_page.object_list:
|
||||||
|
itme = {
|
||||||
|
'id': info.id,
|
||||||
|
"times": info.times,
|
||||||
|
"payee": info.payee,
|
||||||
|
"reason": info.reason,
|
||||||
|
"amount": info.amount,
|
||||||
|
"bankcard": info.bankcard,
|
||||||
|
"BankName": info.BankName,
|
||||||
|
"applicant": info.applicant,
|
||||||
|
"state": info.state,
|
||||||
|
}
|
||||||
|
data.append(itme)
|
||||||
|
return Response({'message': '展示成功', "total": total, 'data': data, 'code': 0}, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
|
|
||||||
|
class reimbursement(APIView):
|
||||||
|
def post(self, request, *args, **kwargs):
|
||||||
|
"""
|
||||||
|
报销
|
||||||
|
:param request:
|
||||||
|
:param args:
|
||||||
|
:param kwargs:
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
person = request.data.get('person')
|
||||||
|
times = request.data.get('times')
|
||||||
|
reason = request.data.get('reason')
|
||||||
|
amount = request.data.get('amount')
|
||||||
|
FeeDescription = request.data.get('FeeDescription')
|
||||||
|
personincharge = request.data.get('personincharge')
|
||||||
|
if not all([person,times, reason, amount, FeeDescription, personincharge]):
|
||||||
|
return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
from datetime import datetime
|
||||||
|
now = datetime.now()
|
||||||
|
reim = Reimbursement.objects.create(
|
||||||
|
person=person,
|
||||||
|
times=times,
|
||||||
|
reason=reason,
|
||||||
|
amount=amount,
|
||||||
|
FeeDescription=FeeDescription,
|
||||||
|
submit_tiem=now.strftime("%Y-%m-%d"),
|
||||||
|
state="审核中"
|
||||||
|
)
|
||||||
|
Approval.objects.create(
|
||||||
|
title=person + "报销申请",
|
||||||
|
content=person + "在" + times + "提交了报销申请,报销理由:" + reason + ",付款金额:" + amount + ",付款日期:" + times + ",费用说明:" + FeeDescription,
|
||||||
|
times=times,
|
||||||
|
personincharge=personincharge,
|
||||||
|
state='审核中',
|
||||||
|
type="报销申请",
|
||||||
|
user_id=reim.id
|
||||||
|
)
|
||||||
|
return Response({'message': '插入成功', 'code': 0}, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
|
class reimbursementdetail(APIView):
|
||||||
|
def post(self, request, *args, **kwargs):
|
||||||
|
page = request.data.get('page')
|
||||||
|
per_page = request.data.get('per_page')
|
||||||
|
times = request.data.get('times')
|
||||||
|
end_time = request.data.get('end_time')
|
||||||
|
person = request.data.get('person')
|
||||||
|
if not all([page, per_page]):
|
||||||
|
return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
Q_obj = Q()
|
||||||
|
if times and end_time:
|
||||||
|
Q_obj &= Q(times__gte=times) & Q(times__lte=end_time)
|
||||||
|
if person:
|
||||||
|
Q_obj &= Q(person__icontains=person)
|
||||||
|
rei = Reimbursement.objects.filter(Q_obj)
|
||||||
|
total = len(rei)
|
||||||
|
|
||||||
|
paginator = Paginator(rei, per_page)
|
||||||
|
try:
|
||||||
|
user_agents_page = paginator.page(page)
|
||||||
|
|
||||||
|
except PageNotAnInteger:
|
||||||
|
user_agents_page = paginator.page(1)
|
||||||
|
except EmptyPage:
|
||||||
|
user_agents_page = paginator.page(paginator.num_pages)
|
||||||
|
data = []
|
||||||
|
for info in user_agents_page.object_list:
|
||||||
|
itme = {
|
||||||
|
"id": info.id,
|
||||||
|
"times": info.times,
|
||||||
|
"person": info.person,
|
||||||
|
"reason": info.reason,
|
||||||
|
"amount": info.amount,
|
||||||
|
"FeeDescription": info.FeeDescription,
|
||||||
|
"state": info.state,
|
||||||
|
}
|
||||||
|
data.append(itme)
|
||||||
|
return Response({'message': '展示成功', "total": total, 'data': data, 'code': 0}, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
|
|
||||||
|
class Change(APIView):
|
||||||
|
def post(self, request, *args, **kwargs):
|
||||||
|
"""
|
||||||
|
工资/奖金变更
|
||||||
|
:param request:
|
||||||
|
:param args:
|
||||||
|
:param kwargs:
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
username = request.data.get('username')
|
||||||
|
type = request.data.get('type')
|
||||||
|
Instructions = request.data.get('Instructions')
|
||||||
|
personincharge = request.data.get('personincharge')
|
||||||
|
|
||||||
|
if not all([username, type, Instructions]):
|
||||||
|
return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
from datetime import datetime
|
||||||
|
now = datetime.now()
|
||||||
|
bonus = BonusChange.objects.create(
|
||||||
|
username=username,
|
||||||
|
type=type,
|
||||||
|
Instructions=Instructions,
|
||||||
|
times=now.strftime("%Y-%m-%d"),
|
||||||
|
state="审核中"
|
||||||
|
)
|
||||||
|
Approval.objects.create(
|
||||||
|
title=username + "工资/奖金变更",
|
||||||
|
content=username + "在" + now.strftime('%Y-%m-%d"') + "提交了工资/奖金变更,类型:" + type + ",调整说明:" + Instructions,
|
||||||
|
times=now.strftime("%Y-%m-%d"),
|
||||||
|
personincharge=personincharge,
|
||||||
|
state='审核中',
|
||||||
|
type="工资/奖金变更",
|
||||||
|
user_id=bonus.id
|
||||||
|
)
|
||||||
|
return Response({'message': '插入成功', 'code': 0}, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
|
class ChangeDetail(APIView):
|
||||||
|
def post(self, request, *args, **kwargs):
|
||||||
|
page = request.data.get('page')
|
||||||
|
per_page = request.data.get('per_page')
|
||||||
|
times = request.data.get('times')
|
||||||
|
end_time = request.data.get('end_time')
|
||||||
|
username = request.data.get('username')
|
||||||
|
if not all([page, per_page]):
|
||||||
|
return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
Q_obj = Q()
|
||||||
|
if times and end_time:
|
||||||
|
Q_obj &= Q(times__gte=times) & Q(times__lte=end_time)
|
||||||
|
if username:
|
||||||
|
Q_obj &= Q(username__icontains=username)
|
||||||
|
bon = BonusChange.objects.filter(Q_obj)
|
||||||
|
total = len(bon)
|
||||||
|
|
||||||
|
paginator = Paginator(bon, per_page)
|
||||||
|
try:
|
||||||
|
user_agents_page = paginator.page(page)
|
||||||
|
|
||||||
|
except PageNotAnInteger:
|
||||||
|
user_agents_page = paginator.page(1)
|
||||||
|
except EmptyPage:
|
||||||
|
user_agents_page = paginator.page(paginator.num_pages)
|
||||||
|
data = []
|
||||||
|
for info in user_agents_page.object_list:
|
||||||
|
itme = {
|
||||||
|
"id": info.id,
|
||||||
|
"times": info.times,
|
||||||
|
"type": info.type,
|
||||||
|
"Instructions": info.Instructions,
|
||||||
|
"username": info.username,
|
||||||
|
}
|
||||||
|
data.append(itme)
|
||||||
|
return Response({'message': '展示成功', "total": total, 'data': data, 'code': 0}, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
2
jyls_django/__init__.py
Normal file
2
jyls_django/__init__.py
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
import pymysql
|
||||||
|
pymysql.install_as_MySQLdb()
|
||||||
16
jyls_django/asgi.py
Normal file
16
jyls_django/asgi.py
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
"""
|
||||||
|
ASGI config for jyls_django project.
|
||||||
|
|
||||||
|
It exposes the ASGI callable as a module-level variable named ``application``.
|
||||||
|
|
||||||
|
For more information on this file, see
|
||||||
|
https://docs.djangoproject.com/en/4.2/howto/deployment/asgi/
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
from django.core.asgi import get_asgi_application
|
||||||
|
|
||||||
|
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'jyls_django.settings')
|
||||||
|
|
||||||
|
application = get_asgi_application()
|
||||||
34
jyls_django/middleware.py
Normal file
34
jyls_django/middleware.py
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
from django.http import HttpResponse, JsonResponse
|
||||||
|
from django.utils.deprecation import MiddlewareMixin
|
||||||
|
|
||||||
|
from rest_framework import status
|
||||||
|
from User.models import User
|
||||||
|
cnt = 0
|
||||||
|
class JWTAuthenticationMiddleware(MiddlewareMixin):
|
||||||
|
def process_request(self, request):
|
||||||
|
if request.method == 'OPTIONS':
|
||||||
|
return None
|
||||||
|
token = request.META.get('HTTP_AUTHORIZATION')
|
||||||
|
request.META['token'] = token
|
||||||
|
|
||||||
|
|
||||||
|
if request.path == '/user/login':
|
||||||
|
return None
|
||||||
|
try:
|
||||||
|
|
||||||
|
if not token:
|
||||||
|
return JsonResponse(
|
||||||
|
{'status': 401,'message':"token为空"},
|
||||||
|
status=401,
|
||||||
|
content_type='application/json',
|
||||||
|
headers={'Access-Control-Allow-Origin': '*'}
|
||||||
|
)
|
||||||
|
User.objects.get(token=token)
|
||||||
|
except User.DoesNotExist:
|
||||||
|
return JsonResponse(
|
||||||
|
{'status': 401,'message':"token异常"},
|
||||||
|
status=401,
|
||||||
|
content_type='application/json',
|
||||||
|
headers={'Access-Control-Allow-Origin': '*'}
|
||||||
|
)
|
||||||
|
return None
|
||||||
153
jyls_django/settings.py
Normal file
153
jyls_django/settings.py
Normal file
@@ -0,0 +1,153 @@
|
|||||||
|
"""
|
||||||
|
Django settings for jyls_django project.
|
||||||
|
|
||||||
|
Generated by 'django-admin startproject' using Django 4.2.25.
|
||||||
|
|
||||||
|
For more information on this file, see
|
||||||
|
https://docs.djangoproject.com/en/4.2/topics/settings/
|
||||||
|
|
||||||
|
For the full list of settings and their values, see
|
||||||
|
https://docs.djangoproject.com/en/4.2/ref/settings/
|
||||||
|
"""
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
# Build paths inside the project like this: BASE_DIR / 'subdir'.
|
||||||
|
BASE_DIR = Path(__file__).resolve().parent.parent
|
||||||
|
|
||||||
|
|
||||||
|
# Quick-start development settings - unsuitable for production
|
||||||
|
# See https://docs.djangoproject.com/en/4.2/howto/deployment/checklist/
|
||||||
|
|
||||||
|
# SECURITY WARNING: keep the secret key used in production secret!
|
||||||
|
SECRET_KEY = 'django-insecure-kml=6w!m*93*8sok7k_6-7937*_6c45(_jf)%a884ruxk9gtq4'
|
||||||
|
|
||||||
|
# SECURITY WARNING: don't run with debug turned on in production!
|
||||||
|
DEBUG = True
|
||||||
|
|
||||||
|
ALLOWED_HOSTS = ['*']
|
||||||
|
|
||||||
|
|
||||||
|
# Application definition
|
||||||
|
|
||||||
|
INSTALLED_APPS = [
|
||||||
|
'django.contrib.admin',
|
||||||
|
'django.contrib.auth',
|
||||||
|
'django.contrib.contenttypes',
|
||||||
|
'django.contrib.sessions',
|
||||||
|
'django.contrib.messages',
|
||||||
|
'django.contrib.staticfiles',
|
||||||
|
'User',
|
||||||
|
"finance",
|
||||||
|
"business",
|
||||||
|
]
|
||||||
|
|
||||||
|
MIDDLEWARE = [
|
||||||
|
'django.middleware.security.SecurityMiddleware',
|
||||||
|
'django.contrib.sessions.middleware.SessionMiddleware',
|
||||||
|
'django.middleware.common.CommonMiddleware',
|
||||||
|
# 'django.middleware.csrf.CsrfViewMiddleware',
|
||||||
|
"jyls_django.middleware.JWTAuthenticationMiddleware",
|
||||||
|
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
||||||
|
'django.contrib.messages.middleware.MessageMiddleware',
|
||||||
|
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
||||||
|
]
|
||||||
|
|
||||||
|
ROOT_URLCONF = 'jyls_django.urls'
|
||||||
|
|
||||||
|
TEMPLATES = [
|
||||||
|
{
|
||||||
|
'BACKEND': 'django.template.backends.django.DjangoTemplates',
|
||||||
|
'APP_DIRS': True,
|
||||||
|
'OPTIONS': {
|
||||||
|
'context_processors': [
|
||||||
|
'django.template.context_processors.debug',
|
||||||
|
'django.template.context_processors.request',
|
||||||
|
'django.contrib.auth.context_processors.auth',
|
||||||
|
'django.contrib.messages.context_processors.messages',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
WSGI_APPLICATION = 'jyls_django.wsgi.application'
|
||||||
|
|
||||||
|
|
||||||
|
# Database
|
||||||
|
# https://docs.djangoproject.com/en/4.2/ref/settings/#databases
|
||||||
|
|
||||||
|
DATABASES = {
|
||||||
|
'default': {
|
||||||
|
'ENGINE': 'django.db.backends.mysql',
|
||||||
|
'NAME': 'jzls',
|
||||||
|
'USER': 'jzls',
|
||||||
|
'PASSWORD': 'Ls123456',
|
||||||
|
'HOST': '47.108.113.7',
|
||||||
|
'PORT': '3306',
|
||||||
|
'OPTIONS': {
|
||||||
|
'charset': 'utf8',
|
||||||
|
},
|
||||||
|
'POOL_OPTIONS': {
|
||||||
|
'POOL_SIZE': 5, # 连接池的初始大小
|
||||||
|
'MAX_OVERFLOW': 10, # 连接池允许的最大额外连接数
|
||||||
|
'RECYCLE': 3600, # 连接的最大存活时间(秒),超过该时间连接将被回收
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Password validation
|
||||||
|
# https://docs.djangoproject.com/en/4.2/ref/settings/#auth-password-validators
|
||||||
|
|
||||||
|
AUTH_PASSWORD_VALIDATORS = [
|
||||||
|
{
|
||||||
|
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
# Internationalization
|
||||||
|
# https://docs.djangoproject.com/en/4.2/topics/i18n/
|
||||||
|
|
||||||
|
LANGUAGE_CODE = 'en-us'
|
||||||
|
|
||||||
|
TIME_ZONE = 'UTC'
|
||||||
|
|
||||||
|
USE_I18N = True
|
||||||
|
|
||||||
|
USE_TZ = True
|
||||||
|
|
||||||
|
|
||||||
|
# Static files (CSS, JavaScript, Images)
|
||||||
|
# https://docs.djangoproject.com/en/4.2/howto/static-files/
|
||||||
|
|
||||||
|
STATIC_URL = 'static/'
|
||||||
|
|
||||||
|
# Default primary key field type
|
||||||
|
# https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field
|
||||||
|
|
||||||
|
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
|
||||||
|
# 七牛云存储
|
||||||
|
QINIU_ACCESS_KEY = 'CB8j8D9voknWUVendxZi4h-LERDfD0XU3IXtSeEu'
|
||||||
|
QINIU_SECRET_KEY = 'I3uaom2fiWMBNZQpOIQCdi0N7x1V13hNJBfSmO0C' # 待修改
|
||||||
|
QINIU_BUCKET_NAME = 'shuju9'
|
||||||
|
QINIU_DOMAIN = 'lyamcn.com'
|
||||||
|
# 使用七牛云作为默认文件存储后端
|
||||||
|
DEFAULT_FILE_STORAGE = 'qiniu_storage.storage.QiniuStorage'
|
||||||
|
|
||||||
|
QINIU_STORAGE_OPTIONS = {
|
||||||
|
'access_key': QINIU_ACCESS_KEY,
|
||||||
|
'secret_key': QINIU_SECRET_KEY,
|
||||||
|
'bucket_name': QINIU_BUCKET_NAME,
|
||||||
|
'bucket_domain': QINIU_DOMAIN,
|
||||||
|
}
|
||||||
25
jyls_django/urls.py
Normal file
25
jyls_django/urls.py
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
"""
|
||||||
|
URL configuration for jyls_django project.
|
||||||
|
|
||||||
|
The `urlpatterns` list routes URLs to views. For more information please see:
|
||||||
|
https://docs.djangoproject.com/en/4.2/topics/http/urls/
|
||||||
|
Examples:
|
||||||
|
Function views
|
||||||
|
1. Add an import: from my_app import views
|
||||||
|
2. Add a URL to urlpatterns: path('', views.home, name='home')
|
||||||
|
Class-based views
|
||||||
|
1. Add an import: from other_app.views import Home
|
||||||
|
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
|
||||||
|
Including another URLconf
|
||||||
|
1. Import the include() function: from django.urls import include, path
|
||||||
|
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
|
||||||
|
"""
|
||||||
|
from django.urls import path, include
|
||||||
|
|
||||||
|
from django.urls import path, include
|
||||||
|
|
||||||
|
urlpatterns = [
|
||||||
|
path('user/',include("User.urls")),
|
||||||
|
path("finance/",include("finance.urls")),
|
||||||
|
path('business/', include("business.urls")),
|
||||||
|
]
|
||||||
16
jyls_django/wsgi.py
Normal file
16
jyls_django/wsgi.py
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
"""
|
||||||
|
WSGI config for jyls_django project.
|
||||||
|
|
||||||
|
It exposes the WSGI callable as a module-level variable named ``application``.
|
||||||
|
|
||||||
|
For more information on this file, see
|
||||||
|
https://docs.djangoproject.com/en/4.2/howto/deployment/wsgi/
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
from django.core.wsgi import get_wsgi_application
|
||||||
|
|
||||||
|
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'jyls_django.settings')
|
||||||
|
|
||||||
|
application = get_wsgi_application()
|
||||||
22
manage.py
Normal file
22
manage.py
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
"""Django's command-line utility for administrative tasks."""
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
"""Run administrative tasks."""
|
||||||
|
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'jyls_django.settings')
|
||||||
|
try:
|
||||||
|
from django.core.management import execute_from_command_line
|
||||||
|
except ImportError as exc:
|
||||||
|
raise ImportError(
|
||||||
|
"Couldn't import Django. Are you sure it's installed and "
|
||||||
|
"available on your PYTHONPATH environment variable? Did you "
|
||||||
|
"forget to activate a virtual environment?"
|
||||||
|
) from exc
|
||||||
|
execute_from_command_line(sys.argv)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
BIN
requirements.txt
Normal file
BIN
requirements.txt
Normal file
Binary file not shown.
74
utility/utility.py
Normal file
74
utility/utility.py
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
import oss2
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
import os
|
||||||
|
import uuid
|
||||||
|
def flies(file):
|
||||||
|
file_urls = []
|
||||||
|
for file_url in file:
|
||||||
|
url = upload_file(file_url)
|
||||||
|
print(url)
|
||||||
|
file_urls.append(url)
|
||||||
|
return file_urls
|
||||||
|
|
||||||
|
def upload_file(file_path):
|
||||||
|
local_file_path = f'temp/{file_path.name}'
|
||||||
|
try:
|
||||||
|
os.makedirs(os.path.dirname(local_file_path), exist_ok=True)
|
||||||
|
with open(local_file_path, 'wb+') as destination:
|
||||||
|
for chunk in file_path.chunks():
|
||||||
|
destination.write(chunk)
|
||||||
|
endpoint = 'https://oss-cn-beijing.aliyuncs.com'
|
||||||
|
access_key_id = "LTAI5tRMxrM95Pi8JEEmqRcg"
|
||||||
|
access_key_secret = "8vueGCsRVeFyQMcAA7sysO7LSnuJDG"
|
||||||
|
|
||||||
|
if not access_key_id or not access_key_secret:
|
||||||
|
print('❌ 错误: 未找到有效的 OSS 访问密钥,请检查环境变量。')
|
||||||
|
return None
|
||||||
|
|
||||||
|
# 生成唯一 Bucket 名称
|
||||||
|
bucket_name = f'oss-bucket-yj'
|
||||||
|
print(f"创建 Bucket: {bucket_name}")
|
||||||
|
|
||||||
|
# 初始化 Bucket 对象
|
||||||
|
auth = oss2.Auth(access_key_id, access_key_secret)
|
||||||
|
bucket = oss2.Bucket(auth, endpoint, bucket_name)
|
||||||
|
|
||||||
|
try:
|
||||||
|
# 1. 创建 Bucket
|
||||||
|
bucket.create_bucket(oss2.models.BUCKET_ACL_PUBLIC_READ) # 设置 Bucket 为公共读权限
|
||||||
|
print(f'✅ 成功创建 Bucket: {bucket_name}')
|
||||||
|
except oss2.exceptions.BucketAlreadyExists:
|
||||||
|
print(f'⚠️ Bucket {bucket_name} 已经存在')
|
||||||
|
print('提示:请使用不同的 Bucket 名称或使用现有 Bucket')
|
||||||
|
except oss2.exceptions.OssError as e:
|
||||||
|
print(f'❌ OSS 错误: {e}')
|
||||||
|
print(f' 错误码: {e.code}')
|
||||||
|
print(f' 请求 ID: {e.request_id}')
|
||||||
|
return None
|
||||||
|
|
||||||
|
# 2. 验证本地文件是否存在
|
||||||
|
if not Path(local_file_path).exists():
|
||||||
|
print(f'❌ 文件错误: 本地文件 {local_file_path} 不存在')
|
||||||
|
return None
|
||||||
|
|
||||||
|
file_name = os.path.basename(local_file_path)
|
||||||
|
oss_object_name = uuid.uuid4().hex[:12] + file_name
|
||||||
|
result = bucket.put_object_from_file(oss_object_name, local_file_path)
|
||||||
|
|
||||||
|
if result.status == 200:
|
||||||
|
|
||||||
|
# 生成长期可访问的 URL
|
||||||
|
public_url = f'https://{bucket_name}.{endpoint.replace("https://", "")}/{oss_object_name}'
|
||||||
|
return public_url
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
except Exception as e:
|
||||||
|
print(e)
|
||||||
|
finally:
|
||||||
|
try:
|
||||||
|
# 清理临时文件
|
||||||
|
if os.path.exists(local_file_path):
|
||||||
|
os.remove(local_file_path)
|
||||||
|
except Exception as e:
|
||||||
|
pass
|
||||||
Reference in New Issue
Block a user