From 19c7e7aad1f1cfdc7a4d15d977c8eb04072edbad Mon Sep 17 00:00:00 2001 From: zty Date: Thu, 11 Sep 2025 14:43:04 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20ofm=20=E5=A2=9E=E5=8A=A0=E6=A1=A3?= =?UTF-8?q?=E6=A1=88=E5=8F=B0=E8=B4=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ofm/migrations/0007_auto_20250911_1441.py | 67 +++++++++++++++++++ apps/ofm/models.py | 37 +++++----- apps/ofm/serializers.py | 46 +++++-------- apps/ofm/services.py | 16 ++++- apps/ofm/urls.py | 10 +-- apps/ofm/views.py | 40 +++++------ 6 files changed, 143 insertions(+), 73 deletions(-) create mode 100644 apps/ofm/migrations/0007_auto_20250911_1441.py diff --git a/apps/ofm/migrations/0007_auto_20250911_1441.py b/apps/ofm/migrations/0007_auto_20250911_1441.py new file mode 100644 index 00000000..74ed9b1c --- /dev/null +++ b/apps/ofm/migrations/0007_auto_20250911_1441.py @@ -0,0 +1,67 @@ +# Generated by Django 3.2.12 on 2025-09-11 06:41 + +from django.conf import settings +import django.core.validators +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('system', '0006_auto_20241213_1249'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('ofm', '0006_vehicle_belong_dept'), + ] + + operations = [ + migrations.AlterField( + model_name='lendingseal', + name='seal', + field=models.JSONField(default=list, help_text='[公章,法人章,财务章,合同章,业务章,其他章]', verbose_name='印章信息'), + ), + migrations.CreateModel( + name='FileRecord', + fields=[ + ('id', models.CharField(editable=False, help_text='主键ID', max_length=20, primary_key=True, serialize=False, verbose_name='主键ID')), + ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')), + ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')), + ('name', models.CharField(max_length=100, verbose_name='资料名称')), + ('number', models.CharField(blank=True, max_length=50, null=True, verbose_name='档案编号')), + ('counts', models.CharField(blank=True, max_length=10, null=True, verbose_name='文件份数')), + ('location', models.CharField(blank=True, max_length=100, null=True, verbose_name='存放位置')), + ('contacts', models.CharField(blank=True, max_length=50, null=True, validators=[django.core.validators.RegexValidator('^1[3456789]\\d{9}$', '手机号码格式不正确')], verbose_name='存档人电话')), + ('reciver', models.CharField(blank=True, max_length=50, null=True, verbose_name='接收人(综合办)')), + ('remark', models.TextField(blank=True, max_length=200, null=True, verbose_name='备注')), + ('belong_dept', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='filerecord_belong_dept', to='system.dept', verbose_name='所属部门')), + ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='filerecord_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')), + ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='filerecord_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='BorrowRecord', + fields=[ + ('id', models.CharField(editable=False, help_text='主键ID', max_length=20, primary_key=True, serialize=False, verbose_name='主键ID')), + ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')), + ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')), + ('borrow_date', models.DateField(blank=True, null=True, verbose_name='借阅日期')), + ('return_date', models.DateField(blank=True, null=True, verbose_name='归还日期')), + ('contacts', models.CharField(blank=True, max_length=50, null=True, validators=[django.core.validators.RegexValidator('^1[3456789]\\d{9}$', '手机号码格式不正确')], verbose_name='借阅人电话')), + ('remark', models.JSONField(default=list, help_text=['借阅', '复印', '查阅'], verbose_name='用途')), + ('belong_dept', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='borrowrecord_belong_dept', to='system.dept', verbose_name='所属部门')), + ('borrow_file', models.ManyToManyField(related_name='borrow_records', to='ofm.FileRecord')), + ('borrow_user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='borrow_user', to=settings.AUTH_USER_MODEL)), + ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='borrowrecord_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')), + ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='borrowrecord_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/apps/ofm/models.py b/apps/ofm/models.py index 383babf4..5230970a 100644 --- a/apps/ofm/models.py +++ b/apps/ofm/models.py @@ -48,7 +48,7 @@ class MroomSlot(BaseModel): class LendingSeal(CommonBDModel): """TN: 印章外出用印信息""" - seal = models.JSONField('印章信息',default=list ,help_text='{"seal_name": "印章名称"}') + seal = models.JSONField('印章信息',default=list ,help_text='[公章,法人章,财务章,合同章,业务章,其他章]') filename = models.TextField('文件名称') file = models.TextField('文件内容') file_count = models.PositiveIntegerField('用印份数') @@ -83,26 +83,25 @@ class Vehicle(CommonBDModel): return super().save(*args, **kwargs) -# class FileRecord(CommonBDModel): -# """TN: 档案台账""" -# name = models.CharField('资料名称', max_length=100) -# number = models.CharField('档案编号', max_length=50) -# files = models.CharField('文件份数', max_length=10) -# location = models.CharField('存放位置', max_length=100) -# contacts = models.CharField('存档人电话', max_length=50) -# location = models.CharField('存档位置', max_length=100) -# reciver = models.CharField('接收人(综合办)', max_length=50) -# remark = models.CharField('备注', max_length=100) +class FileRecord(CommonBDModel): + """TN: 档案台账""" + name = models.CharField('资料名称', max_length=100) + number = models.CharField('档案编号', max_length=50, null=True, blank=True) + counts = models.CharField('文件份数', max_length=10, null=True, blank=True) + location = models.CharField('存放位置', max_length=100, null=True, blank=True) + contacts = models.CharField('存档人电话', max_length=50, validators=[phone_validator], blank=True, null=True) + reciver = models.CharField('接收人(综合办)', max_length=50, null=True, blank=True) + remark = models.TextField('备注', max_length=200, null=True, blank=True) -# class BorrowRecord(CommonBDModel): -# """TN: 借阅、复印、查阅记录""" -# files = models.ManyToManyField(FileRecord, related_name="borrow_records") -# borrow_user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="borrow_user") -# borrow_date = models.DateField('借阅日期') -# return_date = models.DateField('归还日期') -# contacts = models.CharField('借阅人电话', max_length=50, validators=[phone_validator], null=True, blank=True) -# remark = models.CharField('用途', max_length=100) +class BorrowRecord(CommonBDModel): + """TN: 借阅、复印、查阅记录""" + borrow_file = models.ManyToManyField(FileRecord, related_name="borrow_records") + borrow_user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="borrow_user") + borrow_date = models.DateField('借阅日期', null=True, blank=True) + return_date = models.DateField('归还日期', null=True, blank=True) + contacts = models.CharField('借阅人电话', max_length=50, validators=[phone_validator], null=True, blank=True) + remark = models.JSONField('用途', default=list, help_text=['借阅', '复印', '查阅']) # class Publicity(CommonBDModel): diff --git a/apps/ofm/serializers.py b/apps/ofm/serializers.py index 96ab200d..bca706bf 100644 --- a/apps/ofm/serializers.py +++ b/apps/ofm/serializers.py @@ -1,6 +1,6 @@ -from .models import (Mroom, MroomBooking, MroomSlot, LendingSeal, Vehicle) +from .models import (Mroom, MroomBooking, MroomSlot, LendingSeal, Vehicle, FileRecord, BorrowRecord ) # , Publicity, -# FileRecord, BorrowRecord, Publicity, PatentInfo, PaperOfm, Platform, Project, PatentRecord, PaperRecord, ProjectApproval, ProjectInfo) +# Publicity, PatentInfo, PaperOfm, Platform, Project, PatentRecord, PaperRecord, ProjectApproval, ProjectInfo) from apps.utils.serializers import CustomModelSerializer from rest_framework import serializers from django.db import transaction @@ -62,20 +62,6 @@ class MroomSlotSerializer(CustomModelSerializer): class Meta: model = MroomSlot fields = '__all__' - - -# class SealSerializer(CustomModelSerializer): -# class Meta: -# model = Seal -# fields = '__all__' - - -# class SealManageSerializer(CustomModelSerializer): -# seal_name = serializers.CharField(source='seal.name', read_only=True) -# class Meta: -# model = SealManage -# fields = '__all__' -# read_only_fields = EXCLUDE_FIELDS class LendingSealSerializer(CustomModelSerializer): @@ -96,20 +82,24 @@ class VehicleSerializer(CustomModelSerializer): read_only_fields = EXCLUDE_FIELDS + ['actual_km'] -# class FileRecordSerializer(CustomModelSerializer): -# class Meta: -# model = FileRecord -# fields = '__all__' -# read_only_fields = EXCLUDE_FIELDS +class FileRecordSerializer(CustomModelSerializer): + create_by_name = serializers.CharField(source='create_by.name', read_only=True) + belong_dept_name = serializers.CharField(source='belong_dept.name', read_only=True) + class Meta: + model = FileRecord + fields = '__all__' + read_only_fields = EXCLUDE_FIELDS -# class BorrowRecordSerializer(CustomModelSerializer): -# files = serializers.PrimaryKeyRelatedField(queryset=FileRecord.objects.all(), many=True, write_only=True, label="借阅文件") -# file_detail = FileRecordSerializer(source='file', many=True, read_only=True, label="借阅文件详情") -# class Meta: -# model = BorrowRecord -# fields = '__all__' -# read_only_fields = EXCLUDE_FIELDS +class BorrowRecordSerializer(CustomModelSerializer): + create_by_name = serializers.CharField(source='create_by.name', read_only=True) + belong_dept_name = serializers.CharField(source='belong_dept.name', read_only=True) + files = serializers.PrimaryKeyRelatedField(queryset=FileRecord.objects.all(), many=True, write_only=True, label="借阅文件") + file_detail = FileRecordSerializer(source='borrow_file', many=True, read_only=True, label="借阅文件详情") + class Meta: + model = BorrowRecord + fields = '__all__' + read_only_fields = EXCLUDE_FIELDS # class PublicitySerializer(CustomModelSerializer): diff --git a/apps/ofm/services.py b/apps/ofm/services.py index 7b8838a2..02d0281c 100644 --- a/apps/ofm/services.py +++ b/apps/ofm/services.py @@ -1,7 +1,7 @@ from apps.wf.models import Ticket # TicketFlow, Transition, Workflow, CustomField, State, -from apps.ofm.models import LendingSeal, Vehicle +from apps.ofm.models import LendingSeal, Vehicle, BorrowRecord from rest_framework.exceptions import ParseError @@ -39,3 +39,17 @@ def bind_vehicle(ticket: Ticket, transition, new_ticket_data: dict): ins.ticket = ticket ins.save() + +def bind_file(ticket: Ticket, transition, new_ticket_data: dict): + ins = BorrowRecord.objects.get(id=new_ticket_data['t_id']) + ticket_data = ticket.ticket_data + ticket_data.update({ + 't_model': 'BorrowRecord', + 't_id': ins.id, + }) + ticket.ticket_data = ticket_data + ticket.create_by = ins.create_by + ticket.save() + if ins.ticket is None: + ins.ticket = ticket + ins.save() \ No newline at end of file diff --git a/apps/ofm/urls.py b/apps/ofm/urls.py index 48d403a9..38c1b273 100644 --- a/apps/ofm/urls.py +++ b/apps/ofm/urls.py @@ -1,8 +1,8 @@ from django.urls import path, include from rest_framework.routers import DefaultRouter -from apps.ofm.views import (MroomViewSet, MroomBookingViewSet, MroomSlotViewSet,LendingSealViewSet, VehicleViewSet) - # , , FilerecordViewSet, SealModelViewSet, - # FileborrowViewSet, PublicityViewSet, PatentInfoViewSet, PaperViewSet, PlatformViewSet, +from apps.ofm.views import (MroomViewSet, MroomBookingViewSet, MroomSlotViewSet,LendingSealViewSet, VehicleViewSet, FilerecordViewSet, FileborrowViewSet) + # SealModelViewSet, + # , PublicityViewSet, PatentInfoViewSet, PaperViewSet, PlatformViewSet, # ProjectViewSet, PatentRecordViewSet, PaperRecordViewSet, ProjectApprovalViewSet, ProjectInfoViewSet) API_BASE_URL = 'api/ofm/' @@ -15,8 +15,8 @@ router.register('mroomslot', MroomSlotViewSet, basename='mroomslot') # router.register('sealmanage', SealManageViewSet, basename='sealmanage') router.register('lendingseal', LendingSealViewSet, basename='lendingseal') router.register('vehicle', VehicleViewSet, basename='vehicle') -# router.register('filerecord', FilerecordViewSet, basename='filerecord') -# router.register('fileborrow', FileborrowViewSet, basename='fileborrow') +router.register('filerecord', FilerecordViewSet, basename='filerecord') +router.register('fileborrow', FileborrowViewSet, basename='fileborrow') # router.register('publicity', PublicityViewSet, basename='publicity') # router.register('patentinfo', PatentInfoViewSet, basename='patentinfo') diff --git a/apps/ofm/views.py b/apps/ofm/views.py index 29b8d057..a03e0734 100644 --- a/apps/ofm/views.py +++ b/apps/ofm/views.py @@ -1,9 +1,9 @@ from django.shortcuts import render from apps.utils.viewsets import CustomModelViewSet, CustomGenericViewSet -from .models import Mroom, MroomBooking, MroomSlot, LendingSeal, Vehicle - # , FileRecord, Seal - # BorrowRecord, Publicity, PatentInfo, PaperOfm, Platform, Project, PatentRecord, PaperRecord, ProjectApproval, ProjectInfo) -from .serializers import (MroomSerializer, MroomBookingSerializer, MroomSlotSerializer, LendingSealSerializer, VehicleSerializer) +from .models import Mroom, MroomBooking, MroomSlot, LendingSeal, Vehicle, FileRecord, BorrowRecord + # Seal + # Publicity, PatentInfo, PaperOfm, Platform, Project, PatentRecord, PaperRecord, ProjectApproval, ProjectInfo) +from .serializers import (MroomSerializer, MroomBookingSerializer, MroomSlotSerializer, LendingSealSerializer, VehicleSerializer, FileRecordSerializer, BorrowRecordSerializer) # ,SealSerializer, # LendingSealSerializer, FileRecordSerializer, BorrowRecordSerializer, PublicitySerializer, # PatentInfoSerializer, PaperSerializer, PlatformSerializer, ProjectSerializer, ProjectMemberSerializer, PaperRecordSerializer, ProjectApprovalSerializer, ProjectInfoSerializer) @@ -126,26 +126,26 @@ class VehicleViewSet(CustomModelViewSet): ordering = ["create_time"] -# class FilerecordViewSet(CustomModelViewSet): -# """list: 文件 +class FilerecordViewSet(CustomModelViewSet): + """list: 文件 -# 文件 -# """ -# queryset = FileRecord.objects.all() -# serializer_class = FileRecordSerializer -# filterset_fields = ["submit_user", "name", "number"] -# ordering = ["create_time", "number", "name"] + 文件 + """ + queryset = FileRecord.objects.all() + serializer_class = FileRecordSerializer + filterset_fields = [ "name", "number"] + ordering = ["create_time", "number", "name"] -# class FileborrowViewSet(CustomModelViewSet): -# """list: 文件借阅 +class FileborrowViewSet(CustomModelViewSet): + """list: 文件借阅 -# 文件借阅 -# """ -# queryset = BorrowRecord.objects.all() -# serializer_class = BorrowRecordSerializer -# filterset_fields = ["files", "borrow_user"] -# ordering = ["create_time"] + 文件借阅 + """ + queryset = BorrowRecord.objects.all() + serializer_class = BorrowRecordSerializer + filterset_fields = ["borrow_file", "borrow_user"] + ordering = ["create_time"] # class PublicityViewSet(CustomModelViewSet):