feat: asm assetlogcreate

This commit is contained in:
caoqianming 2025-12-24 16:30:36 +08:00
parent 00f2918d17
commit 79e957bd83
4 changed files with 81 additions and 6 deletions

View File

@ -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='保管人'),
),
]

View File

@ -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='关联工单',

View File

@ -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
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

View File

@ -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}