From 79e957bd83bac5bbb3345dfa1d3a385d1cadf7a2 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 24 Dec 2025 16:30:36 +0800 Subject: [PATCH] feat: asm assetlogcreate --- apps/asm/migrations/0002_assetlog_keeper.py | 21 ++++++++++++ apps/asm/models.py | 1 + apps/asm/serializers.py | 36 +++++++++++++++++++-- apps/asm/views.py | 29 ++++++++++++++--- 4 files changed, 81 insertions(+), 6 deletions(-) create mode 100644 apps/asm/migrations/0002_assetlog_keeper.py diff --git a/apps/asm/migrations/0002_assetlog_keeper.py b/apps/asm/migrations/0002_assetlog_keeper.py new file mode 100644 index 00000000..53faad32 --- /dev/null +++ b/apps/asm/migrations/0002_assetlog_keeper.py @@ -0,0 +1,21 @@ +# Generated by Django 3.2.12 on 2025-12-24 06:53 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('asm', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='assetlog', + name='keeper', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='保管人'), + ), + ] diff --git a/apps/asm/models.py b/apps/asm/models.py index 7073df42..e6b0c264 100644 --- a/apps/asm/models.py +++ b/apps/asm/models.py @@ -32,6 +32,7 @@ class AssetLog(CommonADModel): """ type = models.CharField("流水类型", max_length=50, help_text="入库/出库") keep_dept = models.ForeignKey('system.dept', verbose_name='保管部门', on_delete=models.SET_NULL, null=True, blank=True) + keeper = models.ForeignKey('system.user', verbose_name='保管人', on_delete=models.SET_NULL, null=True, blank=True) start_date = models.DateField("启用日期", null=True, blank=True) items = models.JSONField(verbose_name='资产明细', default=list, null=True, blank=True) ticket = models.OneToOneField('wf.ticket', verbose_name='关联工单', diff --git a/apps/asm/serializers.py b/apps/asm/serializers.py index 30eebe8e..f6fa70b1 100644 --- a/apps/asm/serializers.py +++ b/apps/asm/serializers.py @@ -1,7 +1,9 @@ from apps.asm.models import Asset, AssetLog, AssetCate from apps.utils.serializers import CustomModelSerializer from apps.utils.constants import EXCLUDE_FIELDS_DEPT, EXCLUDE_FIELDS - +from rest_framework import serializers +from apps.system.models import User +from apps.wf.serializers import TicketSimpleSerializer class AssetCateSerializer(CustomModelSerializer): class Meta: @@ -15,9 +17,39 @@ class AssetSerializer(CustomModelSerializer): fields = '__all__' read_only_fields = EXCLUDE_FIELDS +class AssetCreateSerializer(CustomModelSerializer): + class Meta: + model = Asset + fields = '__all__' + read_only_fields = EXCLUDE_FIELDS + class AssetLogSerializer(CustomModelSerializer): + keeper_name = serializers.CharField(source="keeper.name", read_only=True) + keep_dept_name = serializers.CharField(source="keep_dept.name", read_only=True) + ticket_ = TicketSimpleSerializer(source="ticket", read_only=True) class Meta: model = AssetLog fields = '__all__' - read_only_fields = EXCLUDE_FIELDS_DEPT \ No newline at end of file + read_only_fields = EXCLUDE_FIELDS_DEPT + +class AssetLogCreateSerializer(CustomModelSerializer): + class Meta: + model = AssetLog + fields = ["keep_dept", "start_date", "items", "keeper", "type"] + extra_kwargs = {"start_date": {"required": True}, "keep_dept": {"required": True}} + + def to_internal_value(self, data): + for item in data.get("items", []): + if item.get("keeper", None) is None: + item["keeper"] = data.get("keeper", None) + if item.get("keep_dept", None) is None: + item["keep_dept"] = data["keep_dept"] + if item.get("start_date", None) is None: + item["start_date"] = data["start_date"] + item["state"] = "在用" + return super().to_internal_value(data) + + def validate_items(self, value): + AssetCreateSerializer(data=value, many=True).is_valid(raise_exception=True) + return value \ No newline at end of file diff --git a/apps/asm/views.py b/apps/asm/views.py index 366c9ec7..75ff3454 100644 --- a/apps/asm/views.py +++ b/apps/asm/views.py @@ -2,9 +2,9 @@ from apps.wf.mixins import TicketMixin from apps.utils.viewsets import CustomModelViewSet from apps.asm.models import Asset, AssetLog, AssetCate from rest_framework.exceptions import ParseError -from apps.asm.serializers import AssetSerializer, AssetLogSerializer, AssetCateSerializer +from apps.asm.serializers import AssetSerializer, AssetLogSerializer, AssetCateSerializer, AssetLogCreateSerializer from apps.wf.models import Ticket - +from apps.pum.models import Supplier class AssetCateViewSet(CustomModelViewSet): """ @@ -37,7 +37,28 @@ class AssetLogViewSet(TicketMixin, CustomModelViewSet): """ queryset = AssetLog.objects.all() serializer_class = AssetLogSerializer - search_fields = ['assetlog'] - workflow_key = 'wf_assetlog' + create_serializer_class = AssetLogCreateSerializer + + def add_info_for_list(self, data): + supplierIds = [] + cateIds = [] + for dataitem in data: + supplierIds.extend([item["supplier"] for item in dataitem["items"]]) + cateIds.extend([item["cate"] for item in dataitem["items"]]) + supplier_dict = dict(Supplier.objects.filter(id__in=supplierIds).values_list("id", "name")) + assetcate_dict = dict(AssetCate.objects.filter(id__in=cateIds).values_list("id", "name")) + for dataitem in data: + for item in dataitem["items"]: + item["supplier_name"] = supplier_dict.get(item["supplier"], None) + item["cate_name"] = assetcate_dict.get(item["cate"], None) + return data + + def get_workflow_key(self, instance:AssetLog): + if instance.type == "入库": + return "wf_assetlogin" + raise ParseError("不支持的流程类型") + + def gen_other_ticket_data(self, instance:AssetLog): + return {"keep_dept_name": instance.keep_dept.name}