From ba8b258ee7a923b26738077b11953e662a1b975f Mon Sep 17 00:00:00 2001 From: zty Date: Wed, 10 Sep 2025 14:26:23 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20ofm=20=E8=BD=A6=E8=BE=86=E5=AE=A1?= =?UTF-8?q?=E6=89=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/ofm/models.py | 45 ++++++++++++++++------------------------- apps/ofm/serializers.py | 15 +++++++------- apps/ofm/services.py | 19 +++++++++++++---- apps/ofm/urls.py | 6 +++--- apps/ofm/views.py | 44 +++++++++++----------------------------- 5 files changed, 55 insertions(+), 74 deletions(-) diff --git a/apps/ofm/models.py b/apps/ofm/models.py index 46301b82..7ca1249c 100644 --- a/apps/ofm/models.py +++ b/apps/ofm/models.py @@ -58,39 +58,28 @@ class LendingSeal(CommonBDModel): return_date = models.DateField('拟归还日期', blank=True, null=True) actual_return_date = models.DateField('实际归还日期', blank=True, null=True) reason = models.CharField('借用理由', max_length=100, blank=True, null=True) - # submit_user = models.ForeignKey( - # User, verbose_name='提交人', on_delete=models.CASCADE, null=True, blank=True, related_name='seal_submit_user') ticket = models.ForeignKey('wf.ticket', verbose_name='关联工单', on_delete=models.SET_NULL, related_name='seal_ticket', null=True, blank=True, db_constraint=False) note = models.TextField('备注', null=True, blank=True) -# class Vehicle(CommonADModel): -# """TN: 用车申请""" - -# submit_user = models.ForeignKey( -# User, verbose_name='用车人', on_delete=models.CASCADE, null=True, blank=True, related_name='vehicle_submit_user') -# approval_user = models.ForeignKey( -# User, verbose_name='审批人', on_delete=models.CASCADE, null=True, blank=True, related_name='vehicle_approval_user' -# ) -# start_time = models.DateTimeField('出车时间') -# end_time = models.DateTimeField('还车时间') -# location = models.CharField('出发地点', null=True, blank=True, max_length=100) -# destination = models.CharField('到达地点', null=True, blank=True, max_length=100) -# start_km = models.PositiveIntegerField('出发公里数') -# end_km = models.PositiveIntegerField('归还公里数') -# actual_km = models.PositiveIntegerField('实际行驶公里数', editable=False) -# is_city = models.BooleanField('是否市内用车', default=True) -# reason = models.CharField('用车事由', max_length=100) -# ticket = models.ForeignKey('wf.ticket', verbose_name='关联工单', -# on_delete=models.SET_NULL, related_name='vehicle_ticket', null=True, blank=True, db_constraint=False) -# state = models.PositiveIntegerField( -# '状态', choices=MTASK_STATES, default=MTASK_CREATED, help_text=str(MTASK_STATES)) - -# def save(self, *args, **kwargs): -# if self.end_km and self.start_km: -# self.actual_km = self.end_km - self.start_km -# return super().save(*args, **kwargs) +class Vehicle(CommonADModel): + """TN: 用车申请""" + start_time = models.DateField('出车时间', blank=True, null=True) + end_time = models.DateField('还车时间', blank=True, null=True) + location = models.CharField('出发地点', null=True, blank=True, max_length=100) + destination = models.CharField('到达地点', null=True, blank=True, max_length=100) + start_km = models.PositiveIntegerField('出发公里数') + end_km = models.PositiveIntegerField('归还公里数') + actual_km = models.PositiveIntegerField('实际行驶公里数', editable=False) + is_city = models.BooleanField('是否市内用车', default=True) + reason = models.CharField('用车事由', max_length=100) + ticket = models.ForeignKey('wf.ticket', verbose_name='关联工单', + on_delete=models.SET_NULL, related_name='vehicle_ticket', null=True, blank=True, db_constraint=False) + def save(self, *args, **kwargs): + if self.end_km and self.start_km: + self.actual_km = self.end_km - self.start_km + return super().save(*args, **kwargs) # class FileRecord(CommonBDModel): diff --git a/apps/ofm/serializers.py b/apps/ofm/serializers.py index 2211539b..86744656 100644 --- a/apps/ofm/serializers.py +++ b/apps/ofm/serializers.py @@ -1,5 +1,5 @@ -from .models import (Mroom, MroomBooking, MroomSlot, LendingSeal) -# Vehicle, Publicity, +from .models import (Mroom, MroomBooking, MroomSlot, LendingSeal, Vehicle) +# , Publicity, # FileRecord, BorrowRecord, Publicity, PatentInfo, PaperOfm, Platform, Project, PatentRecord, PaperRecord, ProjectApproval, ProjectInfo) from apps.utils.serializers import CustomModelSerializer from rest_framework import serializers @@ -80,17 +80,18 @@ class MroomSlotSerializer(CustomModelSerializer): class LendingSealSerializer(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 = LendingSeal fields = '__all__' read_only_fields = EXCLUDE_FIELDS -# class VehicleSerializer(CustomModelSerializer): -# class Meta: -# model = Vehicle -# fields = '__all__' -# read_only_fields = EXCLUDE_FIELDS + ['actual_km'] +class VehicleSerializer(CustomModelSerializer): + class Meta: + model = Vehicle + fields = '__all__' + read_only_fields = EXCLUDE_FIELDS + ['actual_km'] # class FileRecordSerializer(CustomModelSerializer): diff --git a/apps/ofm/services.py b/apps/ofm/services.py index 87b941bc..7b8838a2 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 +from apps.ofm.models import LendingSeal, Vehicle from rest_framework.exceptions import ParseError @@ -13,9 +13,6 @@ def seal_submit_validate(ins: LendingSeal): def bind_lendingseal(ticket: Ticket, transition, new_ticket_data: dict): ins = LendingSeal.objects.get(id=new_ticket_data['t_id']) - # if ins.submit_time is not None: - # raise ParseError('该印章申请不可提交审批') - # seal_submit_validate(ins) ticket_data = ticket.ticket_data ticket_data.update({ 't_model': 'LendingSeal', @@ -28,3 +25,17 @@ def bind_lendingseal(ticket: Ticket, transition, new_ticket_data: dict): ins.ticket = ticket ins.save() +def bind_vehicle(ticket: Ticket, transition, new_ticket_data: dict): + ins = Vehicle.objects.get(id=new_ticket_data['t_id']) + ticket_data = ticket.ticket_data + ticket_data.update({ + 't_model': 'Vehicle', + '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() + diff --git a/apps/ofm/urls.py b/apps/ofm/urls.py index 69c410ce..48d403a9 100644 --- a/apps/ofm/urls.py +++ b/apps/ofm/urls.py @@ -1,7 +1,7 @@ from django.urls import path, include from rest_framework.routers import DefaultRouter -from apps.ofm.views import (MroomViewSet, MroomBookingViewSet, MroomSlotViewSet,LendingSealViewSet) - # , VehicleViewSet, FilerecordViewSet, SealModelViewSet, +from apps.ofm.views import (MroomViewSet, MroomBookingViewSet, MroomSlotViewSet,LendingSealViewSet, VehicleViewSet) + # , , FilerecordViewSet, SealModelViewSet, # FileborrowViewSet, PublicityViewSet, PatentInfoViewSet, PaperViewSet, PlatformViewSet, # ProjectViewSet, PatentRecordViewSet, PaperRecordViewSet, ProjectApprovalViewSet, ProjectInfoViewSet) @@ -14,7 +14,7 @@ router.register('mroombooking', MroomBookingViewSet, basename='mroombooking') 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('vehicle', VehicleViewSet, basename='vehicle') # router.register('filerecord', FilerecordViewSet, basename='filerecord') # router.register('fileborrow', FileborrowViewSet, basename='fileborrow') # router.register('publicity', PublicityViewSet, basename='publicity') diff --git a/apps/ofm/views.py b/apps/ofm/views.py index fd9a0e67..99377a0e 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 +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) +from .serializers import (MroomSerializer, MroomBookingSerializer, MroomSlotSerializer, LendingSealSerializer, VehicleSerializer) # ,SealSerializer, # LendingSealSerializer, FileRecordSerializer, BorrowRecordSerializer, PublicitySerializer, # PatentInfoSerializer, PaperSerializer, PlatformSerializer, ProjectSerializer, ProjectMemberSerializer, PaperRecordSerializer, ProjectApprovalSerializer, ProjectInfoSerializer) @@ -102,27 +102,6 @@ class MroomSlotViewSet(CustomListModelMixin, CustomGenericViewSet): filterset_fields = ["mroom", "mdate", "booking"] -# class SealModelViewSet(CustomModelViewSet): -# """list: 印章列表 - -# 印章列表 -# """ -# queryset = Seal.objects.all() -# serializer_class = SealSerializer -# filterset_fields = ["name"] -# ordering = ["name"] - - -# class SealManageViewSet(CustomModelViewSet): -# """list: 印章管理 - -# 印章管理 -# """ -# queryset = SealManage.objects.all() -# serializer_class = SealManageSerializer -# filterset_fields = ["seal"] - - class LendingSealViewSet(CustomModelViewSet): """list: 印章外出 @@ -134,17 +113,18 @@ class LendingSealViewSet(CustomModelViewSet): serializer_class = LendingSealSerializer filterset_class = SealFilter ordering = ["create_time"] + data_filter = True -# class VehicleViewSet(CustomModelViewSet): -# """list: 车辆 +class VehicleViewSet(CustomModelViewSet): + """list: 车辆 -# 车辆 -# """ -# queryset = Vehicle.objects.all() -# serializer_class = VehicleSerializer -# filterset_fields = ["submit_user"] -# ordering = ["create_time"] + 车辆 + """ + queryset = Vehicle.objects.all() + serializer_class = VehicleSerializer + filterset_fields = ["submit_user"] + ordering = ["create_time"] # class FilerecordViewSet(CustomModelViewSet):