feat: asm assetlogcreate
This commit is contained in:
parent
00f2918d17
commit
79e957bd83
|
|
@ -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='保管人'),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -32,6 +32,7 @@ class AssetLog(CommonADModel):
|
||||||
"""
|
"""
|
||||||
type = models.CharField("流水类型", max_length=50, help_text="入库/出库")
|
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)
|
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)
|
start_date = models.DateField("启用日期", null=True, blank=True)
|
||||||
items = models.JSONField(verbose_name='资产明细', default=list, null=True, blank=True)
|
items = models.JSONField(verbose_name='资产明细', default=list, null=True, blank=True)
|
||||||
ticket = models.OneToOneField('wf.ticket', verbose_name='关联工单',
|
ticket = models.OneToOneField('wf.ticket', verbose_name='关联工单',
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,9 @@
|
||||||
from apps.asm.models import Asset, AssetLog, AssetCate
|
from apps.asm.models import Asset, AssetLog, AssetCate
|
||||||
from apps.utils.serializers import CustomModelSerializer
|
from apps.utils.serializers import CustomModelSerializer
|
||||||
from apps.utils.constants import EXCLUDE_FIELDS_DEPT, EXCLUDE_FIELDS
|
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 AssetCateSerializer(CustomModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
|
|
@ -15,9 +17,39 @@ class AssetSerializer(CustomModelSerializer):
|
||||||
fields = '__all__'
|
fields = '__all__'
|
||||||
read_only_fields = EXCLUDE_FIELDS
|
read_only_fields = EXCLUDE_FIELDS
|
||||||
|
|
||||||
|
class AssetCreateSerializer(CustomModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = Asset
|
||||||
|
fields = '__all__'
|
||||||
|
read_only_fields = EXCLUDE_FIELDS
|
||||||
|
|
||||||
|
|
||||||
class AssetLogSerializer(CustomModelSerializer):
|
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:
|
class Meta:
|
||||||
model = AssetLog
|
model = AssetLog
|
||||||
fields = '__all__'
|
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
|
||||||
|
|
@ -2,9 +2,9 @@ from apps.wf.mixins import TicketMixin
|
||||||
from apps.utils.viewsets import CustomModelViewSet
|
from apps.utils.viewsets import CustomModelViewSet
|
||||||
from apps.asm.models import Asset, AssetLog, AssetCate
|
from apps.asm.models import Asset, AssetLog, AssetCate
|
||||||
from rest_framework.exceptions import ParseError
|
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.wf.models import Ticket
|
||||||
|
from apps.pum.models import Supplier
|
||||||
|
|
||||||
class AssetCateViewSet(CustomModelViewSet):
|
class AssetCateViewSet(CustomModelViewSet):
|
||||||
"""
|
"""
|
||||||
|
|
@ -37,7 +37,28 @@ class AssetLogViewSet(TicketMixin, CustomModelViewSet):
|
||||||
"""
|
"""
|
||||||
queryset = AssetLog.objects.all()
|
queryset = AssetLog.objects.all()
|
||||||
serializer_class = AssetLogSerializer
|
serializer_class = AssetLogSerializer
|
||||||
search_fields = ['assetlog']
|
create_serializer_class = AssetLogCreateSerializer
|
||||||
workflow_key = 'wf_assetlog'
|
|
||||||
|
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}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue