From ed8ee4e68d73bac9e9e5d70aff85e3986ffa599c Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 11 Oct 2024 13:36:53 +0800 Subject: [PATCH 01/10] =?UTF-8?q?feat:=20materialbatch=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0supplier=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../migrations/0020_materialbatch_supplier.py | 20 +++++++++++++++++++ apps/inm/models.py | 2 ++ apps/inm/serializers.py | 4 ++++ apps/inm/services.py | 2 +- apps/inm/views.py | 2 +- 5 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 apps/inm/migrations/0020_materialbatch_supplier.py diff --git a/apps/inm/migrations/0020_materialbatch_supplier.py b/apps/inm/migrations/0020_materialbatch_supplier.py new file mode 100644 index 00000000..0ebaa8d9 --- /dev/null +++ b/apps/inm/migrations/0020_materialbatch_supplier.py @@ -0,0 +1,20 @@ +# Generated by Django 3.2.12 on 2024-10-11 04:38 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('pum', '0008_auto_20240731_1829'), + ('inm', '0019_mio_mgroup'), + ] + + operations = [ + migrations.AddField( + model_name='materialbatch', + name='supplier', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='pum.supplier', verbose_name='供应商'), + ), + ] diff --git a/apps/inm/models.py b/apps/inm/models.py index c14b6afc..e0ac4ba3 100644 --- a/apps/inm/models.py +++ b/apps/inm/models.py @@ -28,6 +28,8 @@ class MaterialBatch(BaseModel): count = models.DecimalField('存量', max_digits=12, decimal_places=3, default=0) production_dept = models.ForeignKey('system.dept', verbose_name='生产车间', on_delete=models.CASCADE, null=True, blank=True) expiration_date = models.DateField('有效期', null=True, blank=True) + supplier = models.ForeignKey( + Supplier, verbose_name='供应商', on_delete=models.SET_NULL, null=True, blank=True) class Meta: unique_together = ('material', 'batch', 'warehouse') diff --git a/apps/inm/serializers.py b/apps/inm/serializers.py index 866c337b..b4d6f957 100644 --- a/apps/inm/serializers.py +++ b/apps/inm/serializers.py @@ -33,6 +33,8 @@ class MaterialBatchSerializer(CustomModelSerializer): source='warehouse.name', read_only=True) material_name = serializers.StringRelatedField( source='material', read_only=True) + supplier_name = serializers.StringRelatedField( + source='supplier', read_only=True) material_ = MaterialSerializer(source='material', read_only=True) class Meta: @@ -49,6 +51,8 @@ class MaterialBatchDetailSerializer(CustomModelSerializer): material_ = MaterialSerializer(source='material', read_only=True) assemb = MaterialBatchAListSerializer( source='a_mb', read_only=True, many=True) + supplier_name = serializers.StringRelatedField( + source='supplier', read_only=True) class Meta: model = MaterialBatch diff --git a/apps/inm/services.py b/apps/inm/services.py index 78c5e672..e561f58f 100644 --- a/apps/inm/services.py +++ b/apps/inm/services.py @@ -90,7 +90,7 @@ class InmService: material=material, warehouse=warehouse, batch=i.batch, - defaults={"material": material, "warehouse": warehouse, "count": 0, "batch": i.batch} + defaults={"count": 0, "supplier": i.mio.supplier} ) if in_or_out == 1: mb.count = mb.count + getattr(i, field) diff --git a/apps/inm/views.py b/apps/inm/views.py index 5e879f1c..4c6cdbc8 100644 --- a/apps/inm/views.py +++ b/apps/inm/views.py @@ -48,7 +48,7 @@ class MaterialBatchViewSet(ListModelMixin, CustomGenericViewSet): queryset = MaterialBatch.objects.filter(count__gt=0) serializer_class = MaterialBatchSerializer retrieve_serializer_class = MaterialBatchDetailSerializer - select_related_fields = ['warehouse', 'material'] + select_related_fields = ['warehouse', 'material', 'supplier'] filterset_class = MaterialBatchFilter search_fields = ['material__name', 'material__number', 'material__model', 'material__specification', 'batch'] From c524d1b9a53598b22929b2cbaf1a9db5411e7eda Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 11 Oct 2024 15:26:48 +0800 Subject: [PATCH 02/10] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E6=9D=A1?= =?UTF-8?q?=E7=A0=81=E4=BA=8C=E7=BB=B4=E7=A0=81=E7=AE=A1=E7=90=86=E7=9A=84?= =?UTF-8?q?app?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/cm/__init__.py | 0 apps/cm/admin.py | 3 +++ apps/cm/apps.py | 6 +++++ apps/cm/migrations/0001_initial.py | 36 ++++++++++++++++++++++++++++++ apps/cm/migrations/__init__.py | 0 apps/cm/models.py | 13 +++++++++++ apps/cm/serializers.py | 20 +++++++++++++++++ apps/cm/tests.py | 3 +++ apps/cm/urls.py | 12 ++++++++++ apps/cm/views.py | 33 +++++++++++++++++++++++++++ server/settings.py | 3 ++- server/urls.py | 1 + 12 files changed, 129 insertions(+), 1 deletion(-) create mode 100644 apps/cm/__init__.py create mode 100644 apps/cm/admin.py create mode 100644 apps/cm/apps.py create mode 100644 apps/cm/migrations/0001_initial.py create mode 100644 apps/cm/migrations/__init__.py create mode 100644 apps/cm/models.py create mode 100644 apps/cm/serializers.py create mode 100644 apps/cm/tests.py create mode 100644 apps/cm/urls.py create mode 100644 apps/cm/views.py diff --git a/apps/cm/__init__.py b/apps/cm/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/cm/admin.py b/apps/cm/admin.py new file mode 100644 index 00000000..8c38f3f3 --- /dev/null +++ b/apps/cm/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/apps/cm/apps.py b/apps/cm/apps.py new file mode 100644 index 00000000..c6213e16 --- /dev/null +++ b/apps/cm/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class CmConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'apps.cm' diff --git a/apps/cm/migrations/0001_initial.py b/apps/cm/migrations/0001_initial.py new file mode 100644 index 00000000..9e932c92 --- /dev/null +++ b/apps/cm/migrations/0001_initial.py @@ -0,0 +1,36 @@ +# Generated by Django 3.2.12 on 2024-10-11 07:17 + +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('pum', '0008_auto_20240731_1829'), + ('mtm', '0042_auto_20241010_1140'), + ] + + operations = [ + migrations.CreateModel( + name='LableMat', + fields=[ + ('id', models.CharField(editable=False, help_text='主键ID', max_length=20, primary_key=True, serialize=False, verbose_name='主键ID')), + ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')), + ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')), + ('state', models.PositiveSmallIntegerField(choices=[(10, '合格'), (20, '不合格'), (30, '返修'), (40, '检验'), (50, '报废')], default=10, verbose_name='状态')), + ('batch', models.CharField(max_length=100, verbose_name='批次号')), + ('notok_sign', models.CharField(blank=True, max_length=10, null=True, verbose_name='不合格标记')), + ('material', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mtm.material')), + ('material_origin', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='lm_mo', to='mtm.material', verbose_name='原始物料')), + ('supplier', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='pum.supplier', verbose_name='外协供应商')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/apps/cm/migrations/__init__.py b/apps/cm/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/cm/models.py b/apps/cm/models.py new file mode 100644 index 00000000..4f77be02 --- /dev/null +++ b/apps/cm/models.py @@ -0,0 +1,13 @@ +from django.db import models +from apps.utils.models import BaseModel +from apps.mtm.models import Material +from apps.pum.models import Supplier +# Create your models here. + +class LableMat(BaseModel): + state = models.PositiveSmallIntegerField('状态', default=10, choices=((10, '合格'), (20, '不合格'), (30, '返修'), (40, '检验'), (50, '报废'))) + material = models.ForeignKey(Material, on_delete=models.CASCADE) + batch = models.CharField('批次号', max_length=100) + supplier = models.ForeignKey(Supplier, verbose_name='外协供应商', on_delete=models.SET_NULL, null=True, blank=True) + notok_sign = models.CharField('不合格标记', max_length=10, null=True, blank=True) + material_origin = models.ForeignKey(Material, verbose_name='原始物料', on_delete=models.SET_NULL, null=True, blank=True, related_name='lm_mo') \ No newline at end of file diff --git a/apps/cm/serializers.py b/apps/cm/serializers.py new file mode 100644 index 00000000..0c467670 --- /dev/null +++ b/apps/cm/serializers.py @@ -0,0 +1,20 @@ +from rest_framework import serializers +from .models import LableMat +from apps.qm.models import NotOkOption + + +class TidSerializer(serializers.Serializer): + tid = serializers.CharField(label='表ID') + + +class LabelMatSerializer(serializers.ModelSerializer): + material_name = serializers.StringRelatedField(source='material', read_only=True) + material_origin_name = serializers.StringRelatedField(source='material_origin', read_only=True) + supplier_name = serializers.CharField(source='supplier.name', read_only=True) + notok_sign_name = serializers.SerializerMethodField() + class Meta: + model = LableMat + fields = '__all__' + + def get_notok_sign_name(self, obj): + return getattr(NotOkOption, obj.notok_sign, NotOkOption.qt).label if obj.notok_sign else None \ No newline at end of file diff --git a/apps/cm/tests.py b/apps/cm/tests.py new file mode 100644 index 00000000..7ce503c2 --- /dev/null +++ b/apps/cm/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/apps/cm/urls.py b/apps/cm/urls.py new file mode 100644 index 00000000..652b90c8 --- /dev/null +++ b/apps/cm/urls.py @@ -0,0 +1,12 @@ +from django.urls import path, include +from rest_framework.routers import DefaultRouter +from apps.cm.views import LableMatViewSet + +API_BASE_URL = 'api/cm/' +HTML_BASE_URL = 'cm/' + +router = DefaultRouter() +router.register('labelmat', LableMatViewSet, basename='labelmat') +urlpatterns = [ + path(API_BASE_URL, include(router.urls)), +] \ No newline at end of file diff --git a/apps/cm/views.py b/apps/cm/views.py new file mode 100644 index 00000000..ead69c7e --- /dev/null +++ b/apps/cm/views.py @@ -0,0 +1,33 @@ +from django.shortcuts import render +from apps.cm.models import LableMat +from rest_framework.decorators import action +from apps.cm.serializers import TidSerializer +from apps.inm.models import MaterialBatch +from rest_framework.exceptions import ParseError +from rest_framework.response import Response +from apps.utils.viewsets import CustomGenericViewSet +# Create your views here. + +class LableMatViewSet(CustomGenericViewSet): + perms_map = {"post": "*"} + @action(methods=['post'], detail=False, serializer_class=TidSerializer) + def get_from_mb(self, request, pk=None): + """ + 从仓库明细获取物料标签 + + 从仓库明细获取物料标签 + """ + tid = request.data.get('tid') + try: + mb = MaterialBatch.objects.get(id=tid) + except MaterialBatch.DoesNotExist: + raise ParseError('仓库明细不存在') + obj, _ = LableMat.objects.get_or_create( + state=10, + material=mb.material, + batch=mb.batch, + defaults={ + "supplier": mb.supplier + } + ) + return Response({"label": f"mat-{obj.id}"}) \ No newline at end of file diff --git a/server/settings.py b/server/settings.py index d6701e6a..0874cbaf 100755 --- a/server/settings.py +++ b/server/settings.py @@ -78,7 +78,8 @@ INSTALLED_APPS = [ 'apps.pm', 'apps.enp', 'apps.edu', - 'apps.dpm' + 'apps.dpm', + 'apps.cm' ] MIDDLEWARE = [ diff --git a/server/urls.py b/server/urls.py index 2ef416a7..e1e58a59 100755 --- a/server/urls.py +++ b/server/urls.py @@ -68,6 +68,7 @@ urlpatterns = [ path('', include('apps.enp.urls')), path('', include('apps.edu.urls')), path('', include('apps.dpm.urls')), + path('', include('apps.cm.urls')), # 前端页面入口 path('', TemplateView.as_view(template_name="index.html")), From 107818301f7f5954a9dab38a415d43fd73c1c42b Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 11 Oct 2024 15:28:07 +0800 Subject: [PATCH 03/10] =?UTF-8?q?feat:=20=E6=94=B9=E5=8F=98=E6=9D=A1?= =?UTF-8?q?=E7=A0=81=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/cm/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/cm/views.py b/apps/cm/views.py index ead69c7e..81020f77 100644 --- a/apps/cm/views.py +++ b/apps/cm/views.py @@ -30,4 +30,4 @@ class LableMatViewSet(CustomGenericViewSet): "supplier": mb.supplier } ) - return Response({"label": f"mat-{obj.id}"}) \ No newline at end of file + return Response({"label": f"mat:{obj.id}"}) \ No newline at end of file From 419dbf3560f098be1cfb195267dc77b9d9fbdb3f Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 11 Oct 2024 15:34:10 +0800 Subject: [PATCH 04/10] =?UTF-8?q?feat:=20=E8=8E=B7=E5=8F=96=E7=89=A9?= =?UTF-8?q?=E6=96=99=E6=A0=87=E7=AD=BE=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/cm/views.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/apps/cm/views.py b/apps/cm/views.py index 81020f77..807768d9 100644 --- a/apps/cm/views.py +++ b/apps/cm/views.py @@ -1,7 +1,7 @@ from django.shortcuts import render from apps.cm.models import LableMat from rest_framework.decorators import action -from apps.cm.serializers import TidSerializer +from apps.cm.serializers import TidSerializer, LabelMatSerializer from apps.inm.models import MaterialBatch from rest_framework.exceptions import ParseError from rest_framework.response import Response @@ -30,4 +30,13 @@ class LableMatViewSet(CustomGenericViewSet): "supplier": mb.supplier } ) - return Response({"label": f"mat:{obj.id}"}) \ No newline at end of file + return Response({"label": f"mat:{obj.id}"}) + + def info(self, request, pk=None): + """ + 获取物料标签信息 + + 获取物料标签信息 + """ + obj = self.get_object() + return Response(LabelMatSerializer(obj).data) \ No newline at end of file From 52a7d415182ffa4b1bfc0133acfd79b4db766233 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 11 Oct 2024 15:38:28 +0800 Subject: [PATCH 05/10] =?UTF-8?q?feat:=20=E8=8E=B7=E5=8F=96=E6=A0=87?= =?UTF-8?q?=E7=AD=BE=E6=98=8E=E7=BB=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/cm/views.py | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/apps/cm/views.py b/apps/cm/views.py index 807768d9..ca8a28a9 100644 --- a/apps/cm/views.py +++ b/apps/cm/views.py @@ -5,11 +5,13 @@ from apps.cm.serializers import TidSerializer, LabelMatSerializer from apps.inm.models import MaterialBatch from rest_framework.exceptions import ParseError from rest_framework.response import Response -from apps.utils.viewsets import CustomGenericViewSet +from apps.utils.viewsets import CustomGenericViewSet, RetrieveModelMixin # Create your views here. -class LableMatViewSet(CustomGenericViewSet): - perms_map = {"post": "*"} +class LableMatViewSet(RetrieveModelMixin, CustomGenericViewSet): + perms_map = {"post": "*", "get": "*"} + serializer_class = LabelMatSerializer + @action(methods=['post'], detail=False, serializer_class=TidSerializer) def get_from_mb(self, request, pk=None): """ @@ -30,13 +32,4 @@ class LableMatViewSet(CustomGenericViewSet): "supplier": mb.supplier } ) - return Response({"label": f"mat:{obj.id}"}) - - def info(self, request, pk=None): - """ - 获取物料标签信息 - - 获取物料标签信息 - """ - obj = self.get_object() - return Response(LabelMatSerializer(obj).data) \ No newline at end of file + return Response({"label": f"mat:{obj.id}"}) \ No newline at end of file From ef28e1ba478519542d474c666057ca3dff9d323a Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 11 Oct 2024 15:39:04 +0800 Subject: [PATCH 06/10] =?UTF-8?q?feat:=20=E8=8E=B7=E5=8F=96=E6=A0=87?= =?UTF-8?q?=E7=AD=BE=E6=98=8E=E7=BB=862?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/cm/views.py | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/cm/views.py b/apps/cm/views.py index ca8a28a9..25f5db29 100644 --- a/apps/cm/views.py +++ b/apps/cm/views.py @@ -11,6 +11,7 @@ from apps.utils.viewsets import CustomGenericViewSet, RetrieveModelMixin class LableMatViewSet(RetrieveModelMixin, CustomGenericViewSet): perms_map = {"post": "*", "get": "*"} serializer_class = LabelMatSerializer + queryset = LableMat.objects.all() @action(methods=['post'], detail=False, serializer_class=TidSerializer) def get_from_mb(self, request, pk=None): From 0157daa0ab4a57c8563de07352568cc9b05571af Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 11 Oct 2024 15:41:55 +0800 Subject: [PATCH 07/10] =?UTF-8?q?feat:=20=E8=8E=B7=E5=8F=96=E6=A0=87?= =?UTF-8?q?=E7=AD=BE=E6=98=8E=E7=BB=863?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/cm/views.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/cm/views.py b/apps/cm/views.py index 25f5db29..2ed04daa 100644 --- a/apps/cm/views.py +++ b/apps/cm/views.py @@ -5,13 +5,14 @@ from apps.cm.serializers import TidSerializer, LabelMatSerializer from apps.inm.models import MaterialBatch from rest_framework.exceptions import ParseError from rest_framework.response import Response -from apps.utils.viewsets import CustomGenericViewSet, RetrieveModelMixin +from apps.utils.viewsets import CustomGenericViewSet, RetrieveModelMixin, CustomListModelMixin # Create your views here. -class LableMatViewSet(RetrieveModelMixin, CustomGenericViewSet): +class LableMatViewSet(CustomListModelMixin, RetrieveModelMixin, CustomGenericViewSet): perms_map = {"post": "*", "get": "*"} serializer_class = LabelMatSerializer queryset = LableMat.objects.all() + select_related_fields = ["material", "material_origin", "supplier"] @action(methods=['post'], detail=False, serializer_class=TidSerializer) def get_from_mb(self, request, pk=None): From ebf3bbe257b15d05b25c9ed1684728077755a3ce Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 11 Oct 2024 15:54:19 +0800 Subject: [PATCH 08/10] =?UTF-8?q?feat:=20get=5Ffrom=5Fmb=20=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E6=9B=B4=E5=A4=9A=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/cm/views.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/cm/views.py b/apps/cm/views.py index 2ed04daa..4c980a7a 100644 --- a/apps/cm/views.py +++ b/apps/cm/views.py @@ -34,4 +34,6 @@ class LableMatViewSet(CustomListModelMixin, RetrieveModelMixin, CustomGenericVie "supplier": mb.supplier } ) - return Response({"label": f"mat:{obj.id}"}) \ No newline at end of file + rdata = LabelMatSerializer(obj).data + rdata["code_label"] = f"mat:{obj.id}" + return Response(rdata) \ No newline at end of file From af751f5a9d13ce87a9246f0da79abd9e3f3fa4ec Mon Sep 17 00:00:00 2001 From: caoqianming Date: Mon, 14 Oct 2024 09:09:25 +0800 Subject: [PATCH 09/10] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E4=BB=8E?= =?UTF-8?q?=E8=BD=A6=E9=97=B4=E5=BA=93=E5=AD=98=E6=98=8E=E7=BB=86=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E7=89=A9=E6=96=99=E6=A0=87=E7=AD=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/cm/views.py | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/apps/cm/views.py b/apps/cm/views.py index 4c980a7a..0c3952ca 100644 --- a/apps/cm/views.py +++ b/apps/cm/views.py @@ -1,9 +1,9 @@ -from django.shortcuts import render from apps.cm.models import LableMat from rest_framework.decorators import action from apps.cm.serializers import TidSerializer, LabelMatSerializer from apps.inm.models import MaterialBatch -from rest_framework.exceptions import ParseError +from apps.wpm.models import WMaterial +from rest_framework.exceptions import ParseError, NotFound from rest_framework.response import Response from apps.utils.viewsets import CustomGenericViewSet, RetrieveModelMixin, CustomListModelMixin # Create your views here. @@ -25,7 +25,7 @@ class LableMatViewSet(CustomListModelMixin, RetrieveModelMixin, CustomGenericVie try: mb = MaterialBatch.objects.get(id=tid) except MaterialBatch.DoesNotExist: - raise ParseError('仓库明细不存在') + raise NotFound('仓库明细不存在') obj, _ = LableMat.objects.get_or_create( state=10, material=mb.material, @@ -36,4 +36,26 @@ class LableMatViewSet(CustomListModelMixin, RetrieveModelMixin, CustomGenericVie ) rdata = LabelMatSerializer(obj).data rdata["code_label"] = f"mat:{obj.id}" + return Response(rdata) + + @action(methods=['post'], detail=False, serializer_class=TidSerializer) + def get_from_wm(self, request, pk=None): + """ + 从车间库存明细获取物料标签 + + 从车间库存明细获取物料标签 + """ + tid = request.data.get('tid') + try: + wm = WMaterial.objects.get(id=tid) + except WMaterial.DoesNotExist: + raise NotFound('车间库存不存在') + obj, _ = LableMat.objects.get_or_create( + state=wm.state, + material=wm.material, + batch=wm.batch, + notok_sign=wm.notok_sign, + material_origin=wm.material_origin) + rdata = LabelMatSerializer(obj).data + rdata["code_label"] = f"mat:{obj.id}" return Response(rdata) \ No newline at end of file From 3d7a9fb481ab2d3930832a67fd63a43d272329c2 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Mon, 14 Oct 2024 13:20:36 +0800 Subject: [PATCH 10/10] =?UTF-8?q?feat:=20labelmat=20=E8=BF=94=E5=9B=9Estat?= =?UTF-8?q?e=5Fname?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/cm/serializers.py | 7 ++++++- apps/wpm/models.py | 7 +++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/apps/cm/serializers.py b/apps/cm/serializers.py index 0c467670..66f59ea8 100644 --- a/apps/cm/serializers.py +++ b/apps/cm/serializers.py @@ -1,6 +1,7 @@ from rest_framework import serializers from .models import LableMat from apps.qm.models import NotOkOption +from apps.wpm.models import WmStateOption class TidSerializer(serializers.Serializer): @@ -12,9 +13,13 @@ class LabelMatSerializer(serializers.ModelSerializer): material_origin_name = serializers.StringRelatedField(source='material_origin', read_only=True) supplier_name = serializers.CharField(source='supplier.name', read_only=True) notok_sign_name = serializers.SerializerMethodField() + state_name = serializers.SerializerMethodField() class Meta: model = LableMat fields = '__all__' def get_notok_sign_name(self, obj): - return getattr(NotOkOption, obj.notok_sign, NotOkOption.qt).label if obj.notok_sign else None \ No newline at end of file + return getattr(NotOkOption, obj.notok_sign, NotOkOption.qt).label if obj.notok_sign else None + + def get_state_name(self, obj): + return getattr(WmStateOption, str(obj.state), WmStateOption.OK).label if obj.state else None \ No newline at end of file diff --git a/apps/wpm/models.py b/apps/wpm/models.py index 4a02cddf..f5bf9c5b 100644 --- a/apps/wpm/models.py +++ b/apps/wpm/models.py @@ -9,6 +9,7 @@ from apps.system.models import Dept from datetime import timedelta from apps.pum.models import Supplier from django.db.models import Sum +from django.utils.translation import gettext_lazy as _ # Create your models here. @@ -86,6 +87,12 @@ class SfLogExp(CommonADModel): class Meta: unique_together = ('sflog', 'stlog') +class WmStateOption(models.IntegerChoices): + OK = 10, _("合格") + NOTOK = 20, _("不合格") + REPAIR = 30, _("返修") + TEST = 40, _("检验") + SCRAP = 50, _("报废") class WMaterial(CommonBDModel): """ belong_dept是所在车间