This commit is contained in:
caoqianming 2025-09-10 14:49:35 +08:00
commit 27416dfeaa
7 changed files with 115 additions and 74 deletions

View File

@ -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,
},
),
]

View File

@ -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='途经地点'),
),
]

View File

@ -58,39 +58,29 @@ class LendingSeal(CommonBDModel):
return_date = models.DateField('拟归还日期', blank=True, null=True) return_date = models.DateField('拟归还日期', blank=True, null=True)
actual_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) 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='关联工单', ticket = models.ForeignKey('wf.ticket', verbose_name='关联工单',
on_delete=models.SET_NULL, related_name='seal_ticket', null=True, blank=True, db_constraint=False) on_delete=models.SET_NULL, related_name='seal_ticket', null=True, blank=True, db_constraint=False)
note = models.TextField('备注', null=True, blank=True) note = models.TextField('备注', null=True, blank=True)
# class Vehicle(CommonADModel): class Vehicle(CommonADModel):
# """TN: 用车申请""" """TN: 用车申请"""
start_time = models.DateField('出车时间', blank=True, null=True)
# submit_user = models.ForeignKey( end_time = models.DateField('还车时间', blank=True, null=True)
# User, verbose_name='用车人', on_delete=models.CASCADE, null=True, blank=True, related_name='vehicle_submit_user') location = models.CharField('出发地点', null=True, blank=True, max_length=100)
# approval_user = models.ForeignKey( via = models.CharField('途经地点', null=True, blank=True, max_length=100)
# User, verbose_name='审批人', on_delete=models.CASCADE, null=True, blank=True, related_name='vehicle_approval_user' destination = models.CharField('到达地点', null=True, blank=True, max_length=100)
# ) start_km = models.PositiveIntegerField('出发公里数')
# start_time = models.DateTimeField('出车时间') end_km = models.PositiveIntegerField('归还公里数')
# end_time = models.DateTimeField('还车时间') actual_km = models.PositiveIntegerField('实际行驶公里数', editable=False)
# location = models.CharField('出发地点', null=True, blank=True, max_length=100) is_city = models.BooleanField('是否市内用车', default=True)
# destination = models.CharField('到达地点', null=True, blank=True, max_length=100) reason = models.CharField('用车事由', max_length=100)
# start_km = models.PositiveIntegerField('出发公里数') ticket = models.ForeignKey('wf.ticket', verbose_name='关联工单',
# end_km = models.PositiveIntegerField('归还公里数') on_delete=models.SET_NULL, related_name='vehicle_ticket', null=True, blank=True, db_constraint=False)
# actual_km = models.PositiveIntegerField('实际行驶公里数', editable=False) def save(self, *args, **kwargs):
# is_city = models.BooleanField('是否市内用车', default=True) if self.end_km and self.start_km:
# reason = models.CharField('用车事由', max_length=100) self.actual_km = self.end_km - self.start_km
# ticket = models.ForeignKey('wf.ticket', verbose_name='关联工单', return super().save(*args, **kwargs)
# 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 FileRecord(CommonBDModel): # class FileRecord(CommonBDModel):

View File

@ -1,5 +1,5 @@
from .models import (Mroom, MroomBooking, MroomSlot, LendingSeal) from .models import (Mroom, MroomBooking, MroomSlot, LendingSeal, Vehicle)
# Vehicle, Publicity, # , Publicity,
# FileRecord, BorrowRecord, Publicity, PatentInfo, PaperOfm, Platform, Project, PatentRecord, PaperRecord, ProjectApproval, ProjectInfo) # FileRecord, BorrowRecord, Publicity, PatentInfo, PaperOfm, Platform, Project, PatentRecord, PaperRecord, ProjectApproval, ProjectInfo)
from apps.utils.serializers import CustomModelSerializer from apps.utils.serializers import CustomModelSerializer
from rest_framework import serializers from rest_framework import serializers
@ -80,17 +80,18 @@ class MroomSlotSerializer(CustomModelSerializer):
class LendingSealSerializer(CustomModelSerializer): class LendingSealSerializer(CustomModelSerializer):
create_by_name = serializers.CharField(source='create_by.name', read_only=True) 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: class Meta:
model = LendingSeal model = LendingSeal
fields = '__all__' fields = '__all__'
read_only_fields = EXCLUDE_FIELDS read_only_fields = EXCLUDE_FIELDS
# class VehicleSerializer(CustomModelSerializer): class VehicleSerializer(CustomModelSerializer):
# class Meta: class Meta:
# model = Vehicle model = Vehicle
# fields = '__all__' fields = '__all__'
# read_only_fields = EXCLUDE_FIELDS + ['actual_km'] read_only_fields = EXCLUDE_FIELDS + ['actual_km']
# class FileRecordSerializer(CustomModelSerializer): # class FileRecordSerializer(CustomModelSerializer):

View File

@ -1,7 +1,7 @@
from apps.wf.models import Ticket from apps.wf.models import Ticket
# TicketFlow, Transition, Workflow, CustomField, State, # TicketFlow, Transition, Workflow, CustomField, State,
from apps.ofm.models import LendingSeal from apps.ofm.models import LendingSeal, Vehicle
from rest_framework.exceptions import ParseError 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): def bind_lendingseal(ticket: Ticket, transition, new_ticket_data: dict):
ins = LendingSeal.objects.get(id=new_ticket_data['t_id']) 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 = ticket.ticket_data
ticket_data.update({ ticket_data.update({
't_model': 'LendingSeal', 't_model': 'LendingSeal',
@ -28,3 +25,17 @@ def bind_lendingseal(ticket: Ticket, transition, new_ticket_data: dict):
ins.ticket = ticket ins.ticket = ticket
ins.save() 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()

View File

@ -1,7 +1,7 @@
from django.urls import path, include from django.urls import path, include
from rest_framework.routers import DefaultRouter from rest_framework.routers import DefaultRouter
from apps.ofm.views import (MroomViewSet, MroomBookingViewSet, MroomSlotViewSet,LendingSealViewSet) from apps.ofm.views import (MroomViewSet, MroomBookingViewSet, MroomSlotViewSet,LendingSealViewSet, VehicleViewSet)
# , VehicleViewSet, FilerecordViewSet, SealModelViewSet, # , , FilerecordViewSet, SealModelViewSet,
# FileborrowViewSet, PublicityViewSet, PatentInfoViewSet, PaperViewSet, PlatformViewSet, # FileborrowViewSet, PublicityViewSet, PatentInfoViewSet, PaperViewSet, PlatformViewSet,
# ProjectViewSet, PatentRecordViewSet, PaperRecordViewSet, ProjectApprovalViewSet, ProjectInfoViewSet) # ProjectViewSet, PatentRecordViewSet, PaperRecordViewSet, ProjectApprovalViewSet, ProjectInfoViewSet)
@ -14,7 +14,7 @@ router.register('mroombooking', MroomBookingViewSet, basename='mroombooking')
router.register('mroomslot', MroomSlotViewSet, basename='mroomslot') router.register('mroomslot', MroomSlotViewSet, basename='mroomslot')
# router.register('sealmanage', SealManageViewSet, basename='sealmanage') # router.register('sealmanage', SealManageViewSet, basename='sealmanage')
router.register('lendingseal', LendingSealViewSet, basename='lendingseal') 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('filerecord', FilerecordViewSet, basename='filerecord')
# router.register('fileborrow', FileborrowViewSet, basename='fileborrow') # router.register('fileborrow', FileborrowViewSet, basename='fileborrow')
# router.register('publicity', PublicityViewSet, basename='publicity') # router.register('publicity', PublicityViewSet, basename='publicity')

View File

@ -1,9 +1,9 @@
from django.shortcuts import render from django.shortcuts import render
from apps.utils.viewsets import CustomModelViewSet, CustomGenericViewSet from apps.utils.viewsets import CustomModelViewSet, CustomGenericViewSet
from .models import Mroom, MroomBooking, MroomSlot, LendingSeal from .models import Mroom, MroomBooking, MroomSlot, LendingSeal, Vehicle
# Vehicle, FileRecord, Seal # , FileRecord, Seal
# BorrowRecord, Publicity, PatentInfo, PaperOfm, Platform, Project, PatentRecord, PaperRecord, ProjectApproval, ProjectInfo) # 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, # ,SealSerializer,
# LendingSealSerializer, FileRecordSerializer, BorrowRecordSerializer, PublicitySerializer, # LendingSealSerializer, FileRecordSerializer, BorrowRecordSerializer, PublicitySerializer,
# PatentInfoSerializer, PaperSerializer, PlatformSerializer, ProjectSerializer, ProjectMemberSerializer, PaperRecordSerializer, ProjectApprovalSerializer, ProjectInfoSerializer) # PatentInfoSerializer, PaperSerializer, PlatformSerializer, ProjectSerializer, ProjectMemberSerializer, PaperRecordSerializer, ProjectApprovalSerializer, ProjectInfoSerializer)
@ -102,27 +102,6 @@ class MroomSlotViewSet(CustomListModelMixin, CustomGenericViewSet):
filterset_fields = ["mroom", "mdate", "booking"] 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): class LendingSealViewSet(CustomModelViewSet):
"""list: 印章外出 """list: 印章外出
@ -134,17 +113,17 @@ class LendingSealViewSet(CustomModelViewSet):
serializer_class = LendingSealSerializer serializer_class = LendingSealSerializer
filterset_class = SealFilter filterset_class = SealFilter
ordering = ["create_time"] ordering = ["create_time"]
data_filter = True
# class VehicleViewSet(CustomModelViewSet): class VehicleViewSet(CustomModelViewSet):
# """list: 车辆 """list: 车辆
# 车辆 车辆
# """ """
# queryset = Vehicle.objects.all() queryset = Vehicle.objects.all()
# serializer_class = VehicleSerializer serializer_class = VehicleSerializer
# filterset_fields = ["submit_user"] ordering = ["create_time"]
# ordering = ["create_time"]
# class FilerecordViewSet(CustomModelViewSet): # class FilerecordViewSet(CustomModelViewSet):