diff --git a/apps/ofm/migrations/0004_vehicle.py b/apps/ofm/migrations/0004_vehicle.py new file mode 100644 index 00000000..b43108a0 --- /dev/null +++ b/apps/ofm/migrations/0004_vehicle.py @@ -0,0 +1,42 @@ +# Generated by Django 3.2.12 on 2025-09-10 06:26 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('wf', '0002_alter_state_filter_dept'), + ('ofm', '0003_remove_lendingseal_submit_user'), + ] + + operations = [ + migrations.CreateModel( + name='Vehicle', + 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='删除标记')), + ('start_time', models.DateField(blank=True, null=True, verbose_name='出车时间')), + ('end_time', models.DateField(blank=True, null=True, verbose_name='还车时间')), + ('location', models.CharField(blank=True, max_length=100, null=True, verbose_name='出发地点')), + ('destination', models.CharField(blank=True, max_length=100, null=True, verbose_name='到达地点')), + ('start_km', models.PositiveIntegerField(verbose_name='出发公里数')), + ('end_km', models.PositiveIntegerField(verbose_name='归还公里数')), + ('actual_km', models.PositiveIntegerField(editable=False, verbose_name='实际行驶公里数')), + ('is_city', models.BooleanField(default=True, verbose_name='是否市内用车')), + ('reason', models.CharField(max_length=100, verbose_name='用车事由')), + ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='vehicle_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')), + ('ticket', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='vehicle_ticket', to='wf.ticket', verbose_name='关联工单')), + ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='vehicle_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/apps/ofm/migrations/0005_vehicle_via.py b/apps/ofm/migrations/0005_vehicle_via.py new file mode 100644 index 00000000..b180edb0 --- /dev/null +++ b/apps/ofm/migrations/0005_vehicle_via.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.12 on 2025-09-10 06:35 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ofm', '0004_vehicle'), + ] + + operations = [ + migrations.AddField( + model_name='vehicle', + name='via', + field=models.CharField(blank=True, max_length=100, null=True, verbose_name='途经地点'), + ), + ] diff --git a/apps/ofm/models.py b/apps/ofm/models.py index 46301b82..9f647d1e 100644 --- a/apps/ofm/models.py +++ b/apps/ofm/models.py @@ -58,39 +58,29 @@ 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) + via = 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..29b8d057 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,17 @@ 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 + ordering = ["create_time"] # class FilerecordViewSet(CustomModelViewSet):