From 3e1a087258e09e4f03113b955acce0bc87181edf Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 26 Mar 2026 22:07:25 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20WMaterialViewSet=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=89=8B=E5=8A=A8=E5=88=9B=E5=BB=BA=E5=92=8C=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - WMaterial 新增 is_manual 字段标记手动创建的库存 - WMaterialViewSet 添加 create 接口,创建时自动设置 is_manual=True - WMaterialViewSet 添加 destroy 接口,仅允许删除手动创建的记录 Co-Authored-By: Claude Sonnet 4.6 --- .../0128_add_is_manual_to_wmaterial.py | 18 ++++++++++++++++++ apps/wpm/models.py | 1 + apps/wpm/views.py | 17 ++++++++++++++--- 3 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 apps/wpm/migrations/0128_add_is_manual_to_wmaterial.py diff --git a/apps/wpm/migrations/0128_add_is_manual_to_wmaterial.py b/apps/wpm/migrations/0128_add_is_manual_to_wmaterial.py new file mode 100644 index 00000000..c2838810 --- /dev/null +++ b/apps/wpm/migrations/0128_add_is_manual_to_wmaterial.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.27 on 2026-03-26 08:56 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('wpm', '0127_handoverb_oinfo_json_alter_attlog_create_by_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='wmaterial', + name='is_manual', + field=models.BooleanField(default=False, verbose_name='手动创建'), + ), + ] diff --git a/apps/wpm/models.py b/apps/wpm/models.py index 48977fde..ad38dbed 100644 --- a/apps/wpm/models.py +++ b/apps/wpm/models.py @@ -126,6 +126,7 @@ class WMaterial(CommonBDModel): batch_ofrom = models.TextField('原料批次号', null=True, blank=True) material_ofrom = models.ForeignKey(Material, verbose_name='原料物料', on_delete=models.SET_NULL, null=True, blank=True, related_name='wm_mofrom') number_from = models.TextField("来源于个号", null=True, blank=True) + is_manual = models.BooleanField('手动创建', default=False) @property def belong_dept_or_mgroup_id(self): diff --git a/apps/wpm/views.py b/apps/wpm/views.py index 4e19926d..19c3b24b 100644 --- a/apps/wpm/views.py +++ b/apps/wpm/views.py @@ -11,7 +11,8 @@ from apps.system.models import User from apps.mtm.models import Material, Process, Route, Mgroup, RoutePack, RouteMat from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet -from apps.utils.mixins import CustomListModelMixin, BulkCreateModelMixin, ComplexQueryMixin, BulkDestroyModelMixin, BulkUpdateModelMixin +from rest_framework.mixins import DestroyModelMixin +from apps.utils.mixins import CustomListModelMixin, CustomCreateModelMixin, BulkCreateModelMixin, ComplexQueryMixin, BulkDestroyModelMixin, BulkUpdateModelMixin from .filters import StLogFilter, SfLogFilter, WMaterialFilter, MlogFilter, HandoverFilter, MlogbFilter, BatchStFilter, MlogbwFilter from .models import SfLog, SfLogExp, StLog, WMaterial, Mlog, Handover, Mlogb, Mlogbw, AttLog, OtherLog, Fmlog, BatchSt, MlogbDefect, MlogUser, BatchLog, Handoverb @@ -160,14 +161,16 @@ class SfLogExpViewSet(CustomListModelMixin, BulkUpdateModelMixin, CustomGenericV filterset_fields = ["sflog", "stlog"] -class WMaterialViewSet(CustomListModelMixin, CustomGenericViewSet): +class WMaterialViewSet(CustomCreateModelMixin, DestroyModelMixin, CustomListModelMixin, CustomGenericViewSet): """ list: 车间库存 + create: 手动创建车间库存 + destroy: 删除手动创建的车间库存 车间库存 """ - perms_map = {"get": "*"} + perms_map = {"get": "*", "post": "wmaterial.create", "delete": "wmaterial.delete"} queryset = WMaterial.objects.filter(count__gt=0) serializer_class = WMaterialSerializer select_related_fields = ["material", "belong_dept", "material__process", "supplier"] @@ -186,6 +189,14 @@ class WMaterialViewSet(CustomListModelMixin, CustomGenericViewSet): return queryset return queryset.exclude(state=WMaterial.WM_SCRAP) + def perform_create(self, serializer): + serializer.save(create_by=self.request.user, belong_dept=self.request.user.dept, is_manual=True) + + def perform_destroy(self, instance): + if not instance.is_manual: + raise ParseError('只能删除手动创建的车间库存') + instance.delete() + @action(methods=["post"], detail=False, perms_map={"post": "*"}, serializer_class=DeptBatchSerializer) def batchs(self, request): """获取车间的批次号(废弃)