feat: WMaterialViewSet 添加手动来料创建和删除接口
- 新增 WMaterialCreateSerializer,validate 中自动推导 belong_dept - ViewSet 使用 create_serializer_class,perform_create 设置 is_manual=True - 删除校验逻辑移至模型 delete 方法,校验 is_manual 及关联记录(mlogb/handoverb/ftestwork/mioitem) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
61f70d4907
commit
320822019a
|
|
@ -128,6 +128,20 @@ class WMaterial(CommonBDModel):
|
||||||
number_from = models.TextField("来源于个号", null=True, blank=True)
|
number_from = models.TextField("来源于个号", null=True, blank=True)
|
||||||
is_manual = models.BooleanField('手动创建', default=False)
|
is_manual = models.BooleanField('手动创建', default=False)
|
||||||
|
|
||||||
|
def delete(self, *args, **kwargs):
|
||||||
|
if not self.is_manual:
|
||||||
|
raise ParseError('只能删除手动创建的车间库存')
|
||||||
|
checks = [
|
||||||
|
(self.mlogb_set.exists, '存在关联的生产明细'),
|
||||||
|
(self.handoverb_wm.exists, '存在关联的交接明细'),
|
||||||
|
(self.ftestwork_set.exists, '存在关联的检验记录'),
|
||||||
|
(self.wm_mioitem.exists, '存在关联的出入库明细'),
|
||||||
|
]
|
||||||
|
for check, msg in checks:
|
||||||
|
if check():
|
||||||
|
raise ParseError(msg)
|
||||||
|
super().delete(*args, **kwargs)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def belong_dept_or_mgroup_id(self):
|
def belong_dept_or_mgroup_id(self):
|
||||||
return self.mgroup.id if self.mgroup else self.belong_dept.id
|
return self.mgroup.id if self.mgroup else self.belong_dept.id
|
||||||
|
|
|
||||||
|
|
@ -207,6 +207,16 @@ class WMaterialSerializer(CustomModelSerializer):
|
||||||
ret['count_canhandover'] = str(Decimal(ret['count']) - Decimal(ret['count_handovering']))
|
ret['count_canhandover'] = str(Decimal(ret['count']) - Decimal(ret['count_handovering']))
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
class WMaterialCreateSerializer(CustomModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = WMaterial
|
||||||
|
fields = ['material', 'count', 'batch', 'mgroup']
|
||||||
|
|
||||||
|
def validate(self, attrs):
|
||||||
|
attrs['belong_dept'] = attrs['mgroup'].belong_dept
|
||||||
|
return attrs
|
||||||
|
|
||||||
|
|
||||||
class MlogbDefectSerializer(CustomModelSerializer):
|
class MlogbDefectSerializer(CustomModelSerializer):
|
||||||
defect_name = serializers.CharField(source="defect.name", read_only=True)
|
defect_name = serializers.CharField(source="defect.name", read_only=True)
|
||||||
defect_okcate = serializers.CharField(source="defect.okcate", read_only=True)
|
defect_okcate = serializers.CharField(source="defect.okcate", read_only=True)
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@ from .serializers import (
|
||||||
SfLogSerializer,
|
SfLogSerializer,
|
||||||
StLogSerializer,
|
StLogSerializer,
|
||||||
WMaterialSerializer,
|
WMaterialSerializer,
|
||||||
|
WMaterialCreateSerializer,
|
||||||
MlogRevertSerializer,
|
MlogRevertSerializer,
|
||||||
MlogSerializer,
|
MlogSerializer,
|
||||||
MlogRelatedSerializer,
|
MlogRelatedSerializer,
|
||||||
|
|
@ -173,6 +174,7 @@ class WMaterialViewSet(CustomCreateModelMixin, DestroyModelMixin, CustomListMode
|
||||||
perms_map = {"get": "*", "post": "wmaterial.create", "delete": "wmaterial.delete"}
|
perms_map = {"get": "*", "post": "wmaterial.create", "delete": "wmaterial.delete"}
|
||||||
queryset = WMaterial.objects.filter(count__gt=0)
|
queryset = WMaterial.objects.filter(count__gt=0)
|
||||||
serializer_class = WMaterialSerializer
|
serializer_class = WMaterialSerializer
|
||||||
|
create_serializer_class = WMaterialCreateSerializer
|
||||||
select_related_fields = ["material", "belong_dept", "material__process", "supplier"]
|
select_related_fields = ["material", "belong_dept", "material__process", "supplier"]
|
||||||
search_fields = ["material__name", "material__specification", "batch", "material__model", "defect__name", "notok_sign"]
|
search_fields = ["material__name", "material__specification", "batch", "material__model", "defect__name", "notok_sign"]
|
||||||
filterset_class = WMaterialFilter
|
filterset_class = WMaterialFilter
|
||||||
|
|
@ -190,11 +192,9 @@ class WMaterialViewSet(CustomCreateModelMixin, DestroyModelMixin, CustomListMode
|
||||||
return queryset.exclude(state=WMaterial.WM_SCRAP)
|
return queryset.exclude(state=WMaterial.WM_SCRAP)
|
||||||
|
|
||||||
def perform_create(self, serializer):
|
def perform_create(self, serializer):
|
||||||
serializer.save(create_by=self.request.user, belong_dept=self.request.user.dept, is_manual=True)
|
serializer.save(create_by=self.request.user, is_manual=True)
|
||||||
|
|
||||||
def perform_destroy(self, instance):
|
def perform_destroy(self, instance):
|
||||||
if not instance.is_manual:
|
|
||||||
raise ParseError('只能删除手动创建的车间库存')
|
|
||||||
instance.delete()
|
instance.delete()
|
||||||
|
|
||||||
@action(methods=["post"], detail=False, perms_map={"post": "*"}, serializer_class=DeptBatchSerializer)
|
@action(methods=["post"], detail=False, perms_map={"post": "*"}, serializer_class=DeptBatchSerializer)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue