From fcac1d1d78bee73ea2aa979948f1ad30aebbedde Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 13 Jan 2022 09:33:07 +0800 Subject: [PATCH 01/13] =?UTF-8?q?=E5=90=8C=E6=AD=A5=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/hrm/models.py | 2 -- .../inm/migrations/0025_auto_20220113_0932.py | 25 ++++++++++++++ hb_server/apps/inm/views.py | 2 +- .../wpm/migrations/0046_auto_20220113_0932.py | 34 +++++++++++++++++++ hb_server/apps/wpm/models.py | 1 + 5 files changed, 61 insertions(+), 3 deletions(-) create mode 100644 hb_server/apps/inm/migrations/0025_auto_20220113_0932.py create mode 100644 hb_server/apps/wpm/migrations/0046_auto_20220113_0932.py diff --git a/hb_server/apps/hrm/models.py b/hb_server/apps/hrm/models.py index 1176416..5e95b7f 100644 --- a/hb_server/apps/hrm/models.py +++ b/hb_server/apps/hrm/models.py @@ -35,5 +35,3 @@ class Employee(CommonAModel): def __str__(self): return self.name - - diff --git a/hb_server/apps/inm/migrations/0025_auto_20220113_0932.py b/hb_server/apps/inm/migrations/0025_auto_20220113_0932.py new file mode 100644 index 0000000..f006c1a --- /dev/null +++ b/hb_server/apps/inm/migrations/0025_auto_20220113_0932.py @@ -0,0 +1,25 @@ +# Generated by Django 3.2.9 on 2022-01-13 01:32 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('inm', '0024_auto_20211227_0948'), + ] + + operations = [ + migrations.RemoveField( + model_name='iproduct', + name='is_mtested', + ), + migrations.RemoveField( + model_name='iproduct', + name='is_mtestok', + ), + migrations.RemoveField( + model_name='iproduct', + name='remark_mtest', + ), + ] diff --git a/hb_server/apps/inm/views.py b/hb_server/apps/inm/views.py index 3fc15d8..a8c6f04 100644 --- a/hb_server/apps/inm/views.py +++ b/hb_server/apps/inm/views.py @@ -166,7 +166,7 @@ class IProductViewSet(ListModelMixin, GenericViewSet): 半成品库存表 """ perms_map = {'*': '*'} - queryset = IProduct.objects.select_related('material', 'warehouse', 'wproduct__subproduction_plan__production_plan__order').filter(is_saled=False) + queryset = IProduct.objects.select_related('material', 'warehouse', 'wproduct__subproduction_plan__production_plan__order') serializer_class = IProductListSerializer filterset_class = IProductFilterSet search_fields = [] diff --git a/hb_server/apps/wpm/migrations/0046_auto_20220113_0932.py b/hb_server/apps/wpm/migrations/0046_auto_20220113_0932.py new file mode 100644 index 0000000..bed69e1 --- /dev/null +++ b/hb_server/apps/wpm/migrations/0046_auto_20220113_0932.py @@ -0,0 +1,34 @@ +# Generated by Django 3.2.9 on 2022-01-13 01:32 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('wpm', '0045_auto_20220107_0917'), + ] + + operations = [ + migrations.AddField( + model_name='wproduct', + name='last_test_result', + field=models.BooleanField(blank=True, null=True, verbose_name='最后一次检验结果'), + ), + migrations.AlterField( + model_name='operationmaterial', + name='operation', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='om_operation', to='wpm.operation', verbose_name='关联的生产操作'), + ), + migrations.AlterField( + model_name='wproduct', + name='child', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='wproduct_child', to='wpm.wproduct'), + ), + migrations.AlterField( + model_name='wproductflow', + name='child', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='wproduct_child', to='wpm.wproductflow'), + ), + ] diff --git a/hb_server/apps/wpm/models.py b/hb_server/apps/wpm/models.py index 9ccf298..ef7e71a 100644 --- a/hb_server/apps/wpm/models.py +++ b/hb_server/apps/wpm/models.py @@ -107,6 +107,7 @@ class WProduct(CommonAModel): is_mtested = models.BooleanField('是否军检', default=False) is_mtestok = models.BooleanField('是否军检合格', null=True, blank=True) remark_mtest = models.TextField('军检备注', null=True, blank=True) + last_test_result = models.BooleanField('最后一次检验结果', null=True, blank=True) @property def last_process_test(self): From 630edfc785123f3f34982a935383d713f21043a0 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 13 Jan 2022 09:37:01 +0800 Subject: [PATCH 02/13] last_test_result --- .../0047_wproductflow_last_test_result.py | 18 ++++++++++++++++++ hb_server/apps/wpm/models.py | 1 + hb_server/apps/wpm/services.py | 1 + 3 files changed, 20 insertions(+) create mode 100644 hb_server/apps/wpm/migrations/0047_wproductflow_last_test_result.py diff --git a/hb_server/apps/wpm/migrations/0047_wproductflow_last_test_result.py b/hb_server/apps/wpm/migrations/0047_wproductflow_last_test_result.py new file mode 100644 index 0000000..7be0622 --- /dev/null +++ b/hb_server/apps/wpm/migrations/0047_wproductflow_last_test_result.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.9 on 2022-01-13 01:36 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('wpm', '0046_auto_20220113_0932'), + ] + + operations = [ + migrations.AddField( + model_name='wproductflow', + name='last_test_result', + field=models.BooleanField(blank=True, null=True, verbose_name='最后一次检验结果'), + ), + ] diff --git a/hb_server/apps/wpm/models.py b/hb_server/apps/wpm/models.py index ef7e71a..a525ae8 100644 --- a/hb_server/apps/wpm/models.py +++ b/hb_server/apps/wpm/models.py @@ -163,6 +163,7 @@ class WproductFlow(CommonAModel): is_mtested = models.BooleanField('是否军检', default=False) is_mtestok = models.BooleanField('是否军检合格', null=True, blank=True) remark_mtest = models.TextField('军检备注', null=True, blank=True) + last_test_result = models.BooleanField('最后一次检验结果', null=True, blank=True) is_lastlog = models.BooleanField('是否该子计划下的最后一条日志', default=True) change_str = models.CharField('变动描述', default='', max_length=1000) diff --git a/hb_server/apps/wpm/services.py b/hb_server/apps/wpm/services.py index 91e9438..641be72 100644 --- a/hb_server/apps/wpm/services.py +++ b/hb_server/apps/wpm/services.py @@ -94,6 +94,7 @@ class WpmServies(object): wproduct.update_by = user wproduct.update_time = timezone.now() wproduct.test = None + wproduct.last_test_result = is_testok wproduct.save() # 添加日志 cls.add_wproduct_flow_log(wproduct, 'test_ok' if is_testok else 'test_notok') From 5efd8fe32a1e05dd5e63210f9e217ebbbd304b41 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 13 Jan 2022 13:18:12 +0800 Subject: [PATCH 03/13] =?UTF-8?q?operationrecord=E5=A2=9E=E5=8A=A0wproduct?= =?UTF-8?q?=E7=AD=9B=E9=80=89=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/develop/urls.py | 5 +++-- hb_server/apps/develop/views.py | 15 +++++++++++++++ hb_server/apps/wpm/filters.py | 15 +++++++++++++-- hb_server/apps/wpm/views.py | 4 ++-- 4 files changed, 33 insertions(+), 6 deletions(-) diff --git a/hb_server/apps/develop/urls.py b/hb_server/apps/develop/urls.py index 250f0c3..8f6e395 100644 --- a/hb_server/apps/develop/urls.py +++ b/hb_server/apps/develop/urls.py @@ -2,10 +2,11 @@ from django.db.models import base from rest_framework import urlpatterns from django.urls import path, include from rest_framework.routers import DefaultRouter -from apps.develop.views import CleanDataView, UpdateCuttingView +from apps.develop.views import CleanDataView, UpdateCuttingView, UpdateLastTestResult urlpatterns = [ path('cleandata/', CleanDataView.as_view()), - path('update_cutting/', UpdateCuttingView.as_view()) + path('update_cutting/', UpdateCuttingView.as_view()), + path('update_last_result/', UpdateLastTestResult.as_view()) ] diff --git a/hb_server/apps/develop/views.py b/hb_server/apps/develop/views.py index a36a550..7ca4ca8 100644 --- a/hb_server/apps/develop/views.py +++ b/hb_server/apps/develop/views.py @@ -47,3 +47,18 @@ class UpdateCuttingView(APIView): WproductFlow.objects.filter(wproduct=i).update(coperation=op) WpmServies.update_cutting_list_with_operation(op) return Response() + +from apps.qm.models import TestRecord +class UpdateLastTestResult(APIView): + permission_classes = [IsAdminUser] + @transaction.atomic + def post(self, request, format=None): + """ + 更新最后一次检验结果 + """ + for i in WProduct.objects.all(): + tr = TestRecord.objects.filter(wproduct=i, is_submited=True).order_by('-id').first() + if tr: + i.last_test_result = tr.is_testok + i.save() + return Response() diff --git a/hb_server/apps/wpm/filters.py b/hb_server/apps/wpm/filters.py index 7719d7b..e47fec7 100644 --- a/hb_server/apps/wpm/filters.py +++ b/hb_server/apps/wpm/filters.py @@ -2,7 +2,7 @@ from django_filters import rest_framework as filters from apps.mtm.models import Material, Step from apps.wpm.services import WpmServies -from .models import Operation, OperationMaterial, WMaterial, WProduct +from .models import Operation, OperationMaterial, OperationRecord, WMaterial, WProduct class WMaterialFilterSet(filters.FilterSet): @@ -39,4 +39,15 @@ class CuttingFilterSet(filters.FilterSet): production_plan = filters.NumberFilter(field_name='subproduction_plan__production_plan') class Meta: model = OperationMaterial - fields = ['operation', 'subproduction_plan', 'material'] \ No newline at end of file + fields = ['operation', 'subproduction_plan', 'material'] + + +class OperationRecordFilterSet(filters.FilterSet): + wproduct = filters.NumberFilter(method='filter_wproduct') + class Meta: + model = OperationRecord + fields = ['operation', 'form'] + + def filter_wproduct(self, queryset, name, value): + queryset = queryset.filter(operation__ow_operation__wproduct__id=value) + return queryset \ No newline at end of file diff --git a/hb_server/apps/wpm/views.py b/hb_server/apps/wpm/views.py index ce5eb9c..217b4fa 100644 --- a/hb_server/apps/wpm/views.py +++ b/hb_server/apps/wpm/views.py @@ -19,7 +19,7 @@ from apps.system.mixins import CreateUpdateModelAMixin, OptimizationMixin from rest_framework.decorators import action from apps.wf.models import Workflow from apps.wf.serializers import WorkflowSimpleSerializer -from apps.wpm.filters import CuttingFilterSet, WMaterialFilterSet, WProductFilterSet +from apps.wpm.filters import CuttingFilterSet, OperationRecordFilterSet, WMaterialFilterSet, WProductFilterSet from apps.wpm.models import OperationEquip, OperationWproduct, Pick, PickWproduct, WMaterial, WProduct, Operation, OperationMaterial, OperationRecord, OperationRecordItem, WprouctTicket from apps.wpm.serializers import CuttingListSerializer, OperationEquipListSerializer, OperationEquipUpdateSerializer, OperationMaterialCreate1ListSerailizer, OperationMaterialCreate1Serailizer, OperationMaterialCreate2ListSerailizer, OperationMaterialCreate2Serailizer, OperationMaterialCreate3Serializer, OperationMaterialListSerializer, OperationRecordDetailSerializer, OperationRecordListSerializer, OperationRecordSubmitSerializer, OperationUpdateSerializer, OperationWproductListSerializer, OperationCreateSerializer, OperationDetailSerializer, OperationListSerializer, PickHalfSerializer, PickHalfsSerializer, PickSerializer, OperationInitSerializer, OperationSubmitSerializer, ScrapSerializer, WMaterialListSerializer, WProductCardSerializer, WProductDetailSerializer, WProductListSerializer, WplanPutInSerializer, WpmTestFormInitSerializer, WpmTestRecordCreateSerializer, WproductMtestSerializer, WproductPutInSerializer, WproductPutInsSerializer, WproductTicketListSerializer @@ -781,7 +781,7 @@ class OperationRecordViewSet(ListModelMixin, DestroyModelMixin, UpdateModelMixin perms_map={'*':'*'} queryset = OperationRecord.objects.select_related('operation', 'form').all() serializer_class = OperationRecordListSerializer - filterset_fields = ['operation', 'form'] + filterset_class = OperationRecordFilterSet ordering_fields = ['id'] ordering = ['-id'] From c29eb242aea540d08f44e0653e2dbfe2b28cfb5e Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 13 Jan 2022 13:30:17 +0800 Subject: [PATCH 04/13] =?UTF-8?q?=E7=89=A9=E6=96=99=E6=89=B9=E6=AC=A1?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0tag=20expired=E6=9F=A5=E8=AF=A2=E6=9D=A1?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/inm/filters.py | 7 +++++++ hb_server/apps/mns/__init__.py | 0 hb_server/apps/mns/admin.py | 3 --- hb_server/apps/mns/apps.py | 7 ------- hb_server/apps/mns/migrations/__init__.py | 0 hb_server/apps/mns/models.py | 6 ------ hb_server/apps/mns/tests.py | 3 --- hb_server/apps/mns/views.py | 3 --- hb_server/apps/wpm/views.py | 2 ++ 9 files changed, 9 insertions(+), 22 deletions(-) delete mode 100644 hb_server/apps/mns/__init__.py delete mode 100644 hb_server/apps/mns/admin.py delete mode 100644 hb_server/apps/mns/apps.py delete mode 100644 hb_server/apps/mns/migrations/__init__.py delete mode 100644 hb_server/apps/mns/models.py delete mode 100644 hb_server/apps/mns/tests.py delete mode 100644 hb_server/apps/mns/views.py diff --git a/hb_server/apps/inm/filters.py b/hb_server/apps/inm/filters.py index cd03941..c6beb53 100644 --- a/hb_server/apps/inm/filters.py +++ b/hb_server/apps/inm/filters.py @@ -2,11 +2,18 @@ from django_filters import rest_framework as filters from apps.mtm.models import Material from .models import IProduct, MaterialBatch +from django.utils import timezone class MbFilterSet(filters.FilterSet): material = filters.ModelMultipleChoiceFilter(field_name="material", queryset=Material.objects.all()) + tag = filters.CharFilter(method="filter_tag") class Meta: model = MaterialBatch fields = ['material', 'warehouse'] + + def filter_tag(self, queryset, name, value): + if value == 'expired': + queryset = queryset.exclude(expiration_date=None).filter(expiration_date__lte = timezone.now()) + return queryset class IProductFilterSet(filters.FilterSet): diff --git a/hb_server/apps/mns/__init__.py b/hb_server/apps/mns/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/hb_server/apps/mns/admin.py b/hb_server/apps/mns/admin.py deleted file mode 100644 index 8c38f3f..0000000 --- a/hb_server/apps/mns/admin.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.contrib import admin - -# Register your models here. diff --git a/hb_server/apps/mns/apps.py b/hb_server/apps/mns/apps.py deleted file mode 100644 index 66dd6da..0000000 --- a/hb_server/apps/mns/apps.py +++ /dev/null @@ -1,7 +0,0 @@ -from django.apps import AppConfig - - -class MnsConfig(AppConfig): - default_auto_field = 'django.db.models.BigAutoField' - name = 'apps.mns' - verbose_name = '消息通知系统' diff --git a/hb_server/apps/mns/migrations/__init__.py b/hb_server/apps/mns/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/hb_server/apps/mns/models.py b/hb_server/apps/mns/models.py deleted file mode 100644 index f214cad..0000000 --- a/hb_server/apps/mns/models.py +++ /dev/null @@ -1,6 +0,0 @@ -from django.db import models -from utils.model import BaseModel -# Create your models here. - -class Notify(BaseModel) -pass \ No newline at end of file diff --git a/hb_server/apps/mns/tests.py b/hb_server/apps/mns/tests.py deleted file mode 100644 index 7ce503c..0000000 --- a/hb_server/apps/mns/tests.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.test import TestCase - -# Create your tests here. diff --git a/hb_server/apps/mns/views.py b/hb_server/apps/mns/views.py deleted file mode 100644 index 91ea44a..0000000 --- a/hb_server/apps/mns/views.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.shortcuts import render - -# Create your views here. diff --git a/hb_server/apps/wpm/views.py b/hb_server/apps/wpm/views.py index 217b4fa..f3aa832 100644 --- a/hb_server/apps/wpm/views.py +++ b/hb_server/apps/wpm/views.py @@ -620,6 +620,8 @@ class OperationViewSet(ListModelMixin, RetrieveModelMixin, CreateModelMixin, Upd pass else: raise exceptions.APIException('消耗与产出不一致') + # 实际消耗物料校验 + # 检查自定义表单填写 if OperationRecord.objects.filter(operation=op, is_filled=False).exists(): raise exceptions.APIException('存在自定义表单未填写') From 002bd82e1ab8ad22dfb0087423365114e14f7a71 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 13 Jan 2022 13:49:06 +0800 Subject: [PATCH 05/13] =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E6=9D=A1=E4=BB=B6bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/pm/filters.py | 2 +- hb_server/apps/sam/filters.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/hb_server/apps/pm/filters.py b/hb_server/apps/pm/filters.py index f1c928c..551a6ee 100644 --- a/hb_server/apps/pm/filters.py +++ b/hb_server/apps/pm/filters.py @@ -7,7 +7,7 @@ from apps.wpm.services import WpmServies class PlanFilterSet(filters.FilterSet): create_time_start = filters.DateFilter(field_name="create_time", lookup_expr='gte') - create_time_end = filters.NumberFilter(field_name="create_time", lookup_expr='lte') + create_time_end = filters.DateFilter(field_name="create_time", lookup_expr='lte') tag = filters.CharFilter(method='filter_tag') class Meta: model = ProductionPlan diff --git a/hb_server/apps/sam/filters.py b/hb_server/apps/sam/filters.py index d061985..3087bbb 100644 --- a/hb_server/apps/sam/filters.py +++ b/hb_server/apps/sam/filters.py @@ -5,7 +5,7 @@ from apps.sam.models import Order class OrderFilterSet(filters.FilterSet): create_time_start = filters.DateFilter(field_name="create_time", lookup_expr='gte') - create_time_end = filters.NumberFilter(field_name="create_time", lookup_expr='lte') + create_time_end = filters.DateFilter(field_name="create_time", lookup_expr='lte') class Meta: model = Order fields = ['product', 'contract', 'customer', 'create_time_start', 'create_time_end'] @@ -13,6 +13,6 @@ class OrderFilterSet(filters.FilterSet): class ContractFilterSet(filters.FilterSet): create_time_start = filters.DateFilter(field_name="create_time", lookup_expr='gte') - create_time_end = filters.NumberFilter(field_name="create_time", lookup_expr='lte') + create_time_end = filters.DateFilter(field_name="create_time", lookup_expr='lte') class Meta: fields = ['customer', 'create_time_start', 'create_time_end'] \ No newline at end of file From 2c852c3598cc3ca7cf3d81cfaa7ba7f52691c31e Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 13 Jan 2022 14:07:04 +0800 Subject: [PATCH 06/13] =?UTF-8?q?contract=20amount=20invoice=E5=88=9B?= =?UTF-8?q?=E5=BB=BA=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/hrm/models.py | 1 + hb_server/apps/sam/serializers.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/hb_server/apps/hrm/models.py b/hb_server/apps/hrm/models.py index 5e95b7f..47d1dc2 100644 --- a/hb_server/apps/hrm/models.py +++ b/hb_server/apps/hrm/models.py @@ -35,3 +35,4 @@ class Employee(CommonAModel): def __str__(self): return self.name + diff --git a/hb_server/apps/sam/serializers.py b/hb_server/apps/sam/serializers.py index 5c7afac..db2117e 100644 --- a/hb_server/apps/sam/serializers.py +++ b/hb_server/apps/sam/serializers.py @@ -38,7 +38,7 @@ class ContractSimpleSerializer(serializers.ModelSerializer): class ContractCreateUpdateSerializer(serializers.ModelSerializer): class Meta: model = Contract - fields = ['name', 'number', 'amount', 'customer', 'sign_date', 'description'] + fields = ['name', 'number', 'amount', 'customer', 'sign_date', 'description', 'invoice'] class OrderCreateUpdateSerializer(serializers.ModelSerializer): From 45808debfe3b90260edf243f8716badfc83c5730 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 13 Jan 2022 14:54:29 +0800 Subject: [PATCH 07/13] record form field sort --- hb_server/apps/mtm/views.py | 2 +- hb_server/apps/wpm/serializers.py | 11 ++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/hb_server/apps/mtm/views.py b/hb_server/apps/mtm/views.py index b7be795..04f3caa 100644 --- a/hb_server/apps/mtm/views.py +++ b/hb_server/apps/mtm/views.py @@ -186,7 +186,7 @@ class RecordFormFieldViewSet(OptimizationMixin, CreateUpdateModelAMixin, ModelVi queryset = RecordFormField.objects.all() filterset_fields = ['field_type', 'form'] search_fields = ['field_name', 'field_key'] - ordering = 'id' + ordering = 'sort' ordering_fields = ['sort', 'id'] def get_serializer_class(self): diff --git a/hb_server/apps/wpm/serializers.py b/hb_server/apps/wpm/serializers.py index 92048bd..01846d5 100644 --- a/hb_server/apps/wpm/serializers.py +++ b/hb_server/apps/wpm/serializers.py @@ -244,15 +244,20 @@ class OperationDetailSerializer(serializers.ModelSerializer): class OperationListSerializer(serializers.ModelSerializer): create_by_ = UserSimpleSerializer(source='create_by', read_only=True) step_ = StepSimpleSerializer(source='step', read_only=True) - wproduct_ = serializers.SerializerMethodField() + # wproduct_ = serializers.SerializerMethodField() + count_work = serializers.SerializerMethodField() equip_ = serializers.SerializerMethodField() record_ = serializers.SerializerMethodField() class Meta: model = Operation fields = '__all__' - def get_wproduct_(self, obj): - return WProduct.objects.filter(ow_wproduct__operation=obj).values('id', 'number') + # def get_wproduct_(self, obj): + # return WProduct.objects.filter(ow_wproduct__operation=obj).values('id', 'number') + + def get_count_work(self, obj): + count_work = 0 + return count_work def get_equip_(self, obj): return EquipmentSimpleSerializer(instance=Equipment.objects.filter(oe_equip__operation=obj), many=True).data From eac13fec8f1aa8f5d2576c208d5217fbc7a9b2fb Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 13 Jan 2022 15:33:28 +0800 Subject: [PATCH 08/13] =?UTF-8?q?=E6=93=8D=E4=BD=9C=E5=8D=8A=E6=88=90?= =?UTF-8?q?=E5=93=81=E5=A2=9E=E5=8A=A0=E6=91=86=E6=94=BE=E4=BD=8D=E7=BD=AE?= =?UTF-8?q?=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/wpm/models.py | 1 + hb_server/apps/wpm/serializers.py | 4 ++++ hb_server/apps/wpm/views.py | 11 ++++++++--- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/hb_server/apps/wpm/models.py b/hb_server/apps/wpm/models.py index a525ae8..fd3fe4a 100644 --- a/hb_server/apps/wpm/models.py +++ b/hb_server/apps/wpm/models.py @@ -211,6 +211,7 @@ class OperationWproduct(BaseModel): material = models.ForeignKey(Material, verbose_name='操作时的物料状态', on_delete=models.CASCADE) subproduction_plan = models.ForeignKey(SubProductionPlan, verbose_name='当前子生产计划', on_delete=models.CASCADE, related_name='ow_subplan') ng_sign = models.PositiveSmallIntegerField('当时的不合格标记', choices= WProduct.ng_choices, null=True, blank=True) + place = models.CharField('摆放位置', null=True, blank=True) class Meta: unique_together = ( ('operation','wproduct') diff --git a/hb_server/apps/wpm/serializers.py b/hb_server/apps/wpm/serializers.py index 01846d5..8d5c9fe 100644 --- a/hb_server/apps/wpm/serializers.py +++ b/hb_server/apps/wpm/serializers.py @@ -365,6 +365,10 @@ class OperationWproductListSerializer(serializers.ModelSerializer): model = OperationWproduct fields = '__all__' +class OperationWproductUpdateSerializer(serializers.ModelSerializer): + class Meta: + model = OperationWproduct + fields = ['place'] class OperationSubmitSerializer(serializers.Serializer): step = serializers.PrimaryKeyRelatedField(queryset=Step.objects.all(), label="子工序ID") diff --git a/hb_server/apps/wpm/views.py b/hb_server/apps/wpm/views.py index f3aa832..87310eb 100644 --- a/hb_server/apps/wpm/views.py +++ b/hb_server/apps/wpm/views.py @@ -22,7 +22,7 @@ from apps.wf.serializers import WorkflowSimpleSerializer from apps.wpm.filters import CuttingFilterSet, OperationRecordFilterSet, WMaterialFilterSet, WProductFilterSet from apps.wpm.models import OperationEquip, OperationWproduct, Pick, PickWproduct, WMaterial, WProduct, Operation, OperationMaterial, OperationRecord, OperationRecordItem, WprouctTicket -from apps.wpm.serializers import CuttingListSerializer, OperationEquipListSerializer, OperationEquipUpdateSerializer, OperationMaterialCreate1ListSerailizer, OperationMaterialCreate1Serailizer, OperationMaterialCreate2ListSerailizer, OperationMaterialCreate2Serailizer, OperationMaterialCreate3Serializer, OperationMaterialListSerializer, OperationRecordDetailSerializer, OperationRecordListSerializer, OperationRecordSubmitSerializer, OperationUpdateSerializer, OperationWproductListSerializer, OperationCreateSerializer, OperationDetailSerializer, OperationListSerializer, PickHalfSerializer, PickHalfsSerializer, PickSerializer, OperationInitSerializer, OperationSubmitSerializer, ScrapSerializer, WMaterialListSerializer, WProductCardSerializer, WProductDetailSerializer, WProductListSerializer, WplanPutInSerializer, WpmTestFormInitSerializer, WpmTestRecordCreateSerializer, WproductMtestSerializer, WproductPutInSerializer, WproductPutInsSerializer, WproductTicketListSerializer +from apps.wpm.serializers import CuttingListSerializer, OperationEquipListSerializer, OperationEquipUpdateSerializer, OperationMaterialCreate1ListSerailizer, OperationMaterialCreate1Serailizer, OperationMaterialCreate2ListSerailizer, OperationMaterialCreate2Serailizer, OperationMaterialCreate3Serializer, OperationMaterialListSerializer, OperationRecordDetailSerializer, OperationRecordListSerializer, OperationRecordSubmitSerializer, OperationUpdateSerializer, OperationWproductListSerializer, OperationCreateSerializer, OperationDetailSerializer, OperationListSerializer, OperationWproductUpdateSerializer, PickHalfSerializer, PickHalfsSerializer, PickSerializer, OperationInitSerializer, OperationSubmitSerializer, ScrapSerializer, WMaterialListSerializer, WProductCardSerializer, WProductDetailSerializer, WProductListSerializer, WplanPutInSerializer, WpmTestFormInitSerializer, WpmTestRecordCreateSerializer, WproductMtestSerializer, WproductPutInSerializer, WproductPutInsSerializer, WproductTicketListSerializer from rest_framework.response import Response from django.db import transaction from rest_framework import exceptions, serializers @@ -621,7 +621,7 @@ class OperationViewSet(ListModelMixin, RetrieveModelMixin, CreateModelMixin, Upd else: raise exceptions.APIException('消耗与产出不一致') # 实际消耗物料校验 - + # 检查自定义表单填写 if OperationRecord.objects.filter(operation=op, is_filled=False).exists(): raise exceptions.APIException('存在自定义表单未填写') @@ -724,7 +724,7 @@ class OperationViewSet(ListModelMixin, RetrieveModelMixin, CreateModelMixin, Upd -class OperationWproductViewSet(ListModelMixin, DestroyModelMixin, GenericViewSet): +class OperationWproductViewSet(ListModelMixin, DestroyModelMixin, UpdateModelMixin, GenericViewSet): """ 操作使用的半成品 """ @@ -735,6 +735,11 @@ class OperationWproductViewSet(ListModelMixin, DestroyModelMixin, GenericViewSet ordering_fields = ['id'] ordering = ['-id'] + def get_serializer_class(self): + if self.action == 'update': + return OperationWproductUpdateSerializer + return super().get_serializer_class() + @transaction.atomic() def destroy(self, request, *args, **kwargs): instance = self.get_object() From bae9d3be2fa613140d9e49a5338ea46220f31d2b Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 13 Jan 2022 15:35:41 +0800 Subject: [PATCH 09/13] =?UTF-8?q?=E5=90=8C=E6=AD=A5=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../migrations/0048_operationwproduct_place.py | 18 ++++++++++++++++++ hb_server/apps/wpm/models.py | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 hb_server/apps/wpm/migrations/0048_operationwproduct_place.py diff --git a/hb_server/apps/wpm/migrations/0048_operationwproduct_place.py b/hb_server/apps/wpm/migrations/0048_operationwproduct_place.py new file mode 100644 index 0000000..6fab08b --- /dev/null +++ b/hb_server/apps/wpm/migrations/0048_operationwproduct_place.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.9 on 2022-01-13 07:35 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('wpm', '0047_wproductflow_last_test_result'), + ] + + operations = [ + migrations.AddField( + model_name='operationwproduct', + name='place', + field=models.CharField(blank=True, max_length=200, null=True, verbose_name='摆放位置'), + ), + ] diff --git a/hb_server/apps/wpm/models.py b/hb_server/apps/wpm/models.py index fd3fe4a..4ecb946 100644 --- a/hb_server/apps/wpm/models.py +++ b/hb_server/apps/wpm/models.py @@ -211,7 +211,7 @@ class OperationWproduct(BaseModel): material = models.ForeignKey(Material, verbose_name='操作时的物料状态', on_delete=models.CASCADE) subproduction_plan = models.ForeignKey(SubProductionPlan, verbose_name='当前子生产计划', on_delete=models.CASCADE, related_name='ow_subplan') ng_sign = models.PositiveSmallIntegerField('当时的不合格标记', choices= WProduct.ng_choices, null=True, blank=True) - place = models.CharField('摆放位置', null=True, blank=True) + place = models.CharField('摆放位置', null=True, blank=True, max_length=200) class Meta: unique_together = ( ('operation','wproduct') From b4e5937b289189e16ef7bc5486f64dcdd78c07a1 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 13 Jan 2022 16:00:20 +0800 Subject: [PATCH 10/13] =?UTF-8?q?=E6=B6=88=E8=80=97=E4=B8=8E=E4=BA=A7?= =?UTF-8?q?=E5=87=BA=E6=A0=A1=E9=AA=8C=20=E4=B8=BB=E8=A6=81=E6=98=AF?= =?UTF-8?q?=E5=86=B7=E5=8A=A0=E5=B7=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/inm/models.py | 4 ++-- hb_server/apps/inm/views.py | 14 ++++++++++---- hb_server/apps/wpm/serializers.py | 6 ++++++ hb_server/apps/wpm/views.py | 2 +- 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/hb_server/apps/inm/models.py b/hb_server/apps/inm/models.py index c03940c..363c0db 100644 --- a/hb_server/apps/inm/models.py +++ b/hb_server/apps/inm/models.py @@ -2,7 +2,7 @@ from django.db import models from django.db.models.base import Model import django.utils.timezone as timezone from django.db.models.query import QuerySet -from apps.system.models import CommonAModel, CommonBModel, Organization, User, Dict, File +from apps.system.models import CommonADModel, CommonAModel, CommonBModel, Organization, User, Dict, File from utils.model import SoftModel, BaseModel from simple_history.models import HistoricalRecords from apps.mtm.models import Material @@ -50,7 +50,7 @@ class MaterialBatch(BaseModel): -class FIFO(CommonAModel): +class FIFO(CommonADModel): """ 出入库记录 """ diff --git a/hb_server/apps/inm/views.py b/hb_server/apps/inm/views.py index a8c6f04..e91d156 100644 --- a/hb_server/apps/inm/views.py +++ b/hb_server/apps/inm/views.py @@ -115,7 +115,7 @@ class FIFOItemViewSet(ListModelMixin, DestroyModelMixin, GenericViewSet): obj.fifo_item.save() return Response() -class FIFOViewSet(ListModelMixin, GenericViewSet): +class FIFOViewSet(ListModelMixin, DestroyModelMixin, GenericViewSet): """ 出入库记录 """ @@ -131,6 +131,12 @@ class FIFOViewSet(ListModelMixin, GenericViewSet): if self.action == 'list': return FIFOListSerializer return super().get_serializer_class() + + def destroy(self, request, *args, **kwargs): + obj = self.get_object() + if obj.is_submited: + raise exceptions.APIException('该记录已审核,不可删除') + return super().destroy(request, *args, **kwargs) @action(methods=['post'], detail=False, perms_map={'post':'*'}, serializer_class=FIFOInPurSerializer) def in_pur(self, request, pk=None): @@ -148,9 +154,9 @@ class FIFOViewSet(ListModelMixin, GenericViewSet): 审核通过 """ obj = self.get_object() - # for i in FIFOItem.objects.filter(fifo=obj): - # if not i.is_testok: - # raise APIException('未检验通过, 不可审核') + for i in FIFOItem.objects.filter(fifo=obj): + if not i.is_testok: + raise APIException('未检验通过, 不可审核') if obj.is_audited: raise APIException('该入库记录已审核通过') with transaction.atomic(): diff --git a/hb_server/apps/wpm/serializers.py b/hb_server/apps/wpm/serializers.py index 8d5c9fe..b8c4ad5 100644 --- a/hb_server/apps/wpm/serializers.py +++ b/hb_server/apps/wpm/serializers.py @@ -256,7 +256,13 @@ class OperationListSerializer(serializers.ModelSerializer): # return WProduct.objects.filter(ow_wproduct__operation=obj).values('id', 'number') def get_count_work(self, obj): + from django.db.models.aggregates import Sum count_work = 0 + if obj.step.type == Step.STEP_TYPE_NOM: + count_work = OperationWproduct.objects.filter(operation=obj).count() + else: + count_work = OperationMaterial.objects.filter(operation=obj).annotate(count_work=Sum('count')) + print(count_work) return count_work def get_equip_(self, obj): diff --git a/hb_server/apps/wpm/views.py b/hb_server/apps/wpm/views.py index 87310eb..30accd4 100644 --- a/hb_server/apps/wpm/views.py +++ b/hb_server/apps/wpm/views.py @@ -616,7 +616,7 @@ class OperationViewSet(ListModelMixin, RetrieveModelMixin, CreateModelMixin, Upd omos = OperationMaterial.objects.filter(operation=op, type=SubprodctionMaterial.SUB_MA_TYPE_OUT) sps_omo_l = omos.filter(use_scrap=False).values_list('subproduction_plan', flat=True) - if set(list(sps_omi_l)) == set(list(sps_omo_l)) or op.step.type == Step.STEP_TYPE_COMB: + if set(list(sps_omi_l)) == set(list(sps_omo_l)) and op.step.type == Step.STEP_TYPE_DIV: pass else: raise exceptions.APIException('消耗与产出不一致') From 95f444ce833af3c3ddf1fc004425728c94664e1d Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 13 Jan 2022 16:03:32 +0800 Subject: [PATCH 11/13] count_work bug --- hb_server/apps/wpm/serializers.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/hb_server/apps/wpm/serializers.py b/hb_server/apps/wpm/serializers.py index b8c4ad5..c78f4bc 100644 --- a/hb_server/apps/wpm/serializers.py +++ b/hb_server/apps/wpm/serializers.py @@ -261,8 +261,7 @@ class OperationListSerializer(serializers.ModelSerializer): if obj.step.type == Step.STEP_TYPE_NOM: count_work = OperationWproduct.objects.filter(operation=obj).count() else: - count_work = OperationMaterial.objects.filter(operation=obj).annotate(count_work=Sum('count')) - print(count_work) + count_work = 0 return count_work def get_equip_(self, obj): From 8a162fbe58c89f69a1df0a29f8e0b8289571b802 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 13 Jan 2022 16:06:22 +0800 Subject: [PATCH 12/13] =?UTF-8?q?=E6=B6=88=E8=80=97=E4=BA=A7=E5=87=BA?= =?UTF-8?q?=E6=A0=A1=E9=AA=8Cbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/wpm/serializers.py | 3 ++- hb_server/apps/wpm/views.py | 4 +--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/hb_server/apps/wpm/serializers.py b/hb_server/apps/wpm/serializers.py index c78f4bc..b8c4ad5 100644 --- a/hb_server/apps/wpm/serializers.py +++ b/hb_server/apps/wpm/serializers.py @@ -261,7 +261,8 @@ class OperationListSerializer(serializers.ModelSerializer): if obj.step.type == Step.STEP_TYPE_NOM: count_work = OperationWproduct.objects.filter(operation=obj).count() else: - count_work = 0 + count_work = OperationMaterial.objects.filter(operation=obj).annotate(count_work=Sum('count')) + print(count_work) return count_work def get_equip_(self, obj): diff --git a/hb_server/apps/wpm/views.py b/hb_server/apps/wpm/views.py index 30accd4..36f424b 100644 --- a/hb_server/apps/wpm/views.py +++ b/hb_server/apps/wpm/views.py @@ -616,9 +616,7 @@ class OperationViewSet(ListModelMixin, RetrieveModelMixin, CreateModelMixin, Upd omos = OperationMaterial.objects.filter(operation=op, type=SubprodctionMaterial.SUB_MA_TYPE_OUT) sps_omo_l = omos.filter(use_scrap=False).values_list('subproduction_plan', flat=True) - if set(list(sps_omi_l)) == set(list(sps_omo_l)) and op.step.type == Step.STEP_TYPE_DIV: - pass - else: + if not (set(list(sps_omi_l)) == set(list(sps_omo_l)) and op.step.type == Step.STEP_TYPE_DIV): raise exceptions.APIException('消耗与产出不一致') # 实际消耗物料校验 From a6591c341c788219bdb51f89b8dcf4e2a44fa0cb Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 13 Jan 2022 16:08:11 +0800 Subject: [PATCH 13/13] =?UTF-8?q?operation=20list=20count=5Fwork=20?= =?UTF-8?q?=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/wpm/serializers.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/hb_server/apps/wpm/serializers.py b/hb_server/apps/wpm/serializers.py index b8c4ad5..bf90ce3 100644 --- a/hb_server/apps/wpm/serializers.py +++ b/hb_server/apps/wpm/serializers.py @@ -261,8 +261,7 @@ class OperationListSerializer(serializers.ModelSerializer): if obj.step.type == Step.STEP_TYPE_NOM: count_work = OperationWproduct.objects.filter(operation=obj).count() else: - count_work = OperationMaterial.objects.filter(operation=obj).annotate(count_work=Sum('count')) - print(count_work) + count_work = OperationMaterial.objects.filter(operation=obj).aggregate(count_work=Sum('count'))['count_work'] return count_work def get_equip_(self, obj):