From ccbe2b280f6aff559d2b1ca56ea1b1a44687b7f7 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 10 Dec 2021 13:43:10 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E8=A1=A8=E5=8D=95=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=8C=96=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/mtm/serializers.py | 2 +- hb_server/apps/wpm/views.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/hb_server/apps/mtm/serializers.py b/hb_server/apps/mtm/serializers.py index f00b95d..8e5eb53 100644 --- a/hb_server/apps/mtm/serializers.py +++ b/hb_server/apps/mtm/serializers.py @@ -208,7 +208,7 @@ class RecordFormDetailSerializer(serializers.ModelSerializer): return queryset def get_form_fields(self, obj): - serializer = RecordFormFieldSerializer(instance=RecordFormField.objects.filter(form=obj, is_deleted=False), many=True) + serializer = RecordFormFieldSerializer(instance=RecordFormField.objects.filter(form=obj, is_deleted=False).order_by('sort'), many=True) data = serializer.data if obj.type == RecordForm.RF_TYPE_TEST: for i in data: diff --git a/hb_server/apps/wpm/views.py b/hb_server/apps/wpm/views.py index b34415f..b14872d 100644 --- a/hb_server/apps/wpm/views.py +++ b/hb_server/apps/wpm/views.py @@ -208,7 +208,7 @@ class WProductViewSet(ListModelMixin, GenericViewSet): for i in origin_test['record_data_']: o_dict[i['field_key']] = i['field_value'] for i in data['form_fields']: - i['origin_value'] = o_dict[i['field_key']] + i['origin_value'] = o_dict[i['field_key']] if i['field_key'] in o_dict else None else: raise exceptions.APIException('原工序检验记录不存在') else: From 30c330eb0c4f6be4588eb6e1be3878f04615622c Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 10 Dec 2021 14:00:33 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E6=8C=87=E5=AF=BC?= =?UTF-8?q?=E4=B9=A6=E6=9F=A5=E8=AF=A2=E5=8E=BB=E9=87=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/mtm/filters.py | 8 ++++---- hb_server/apps/qm/views.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/hb_server/apps/mtm/filters.py b/hb_server/apps/mtm/filters.py index 6f6b28b..ca4c2dd 100644 --- a/hb_server/apps/mtm/filters.py +++ b/hb_server/apps/mtm/filters.py @@ -5,11 +5,11 @@ from apps.mtm.models import TechDoc class TechDocFilterset(filters.FilterSet): - # operation = filters.NumberFilter(method='filter_operation') - operation = filters.CharFilter(field_name="subproduction__subplan_subprod__ow_subplan__operation") + operation = filters.NumberFilter(method='filter_operation') + # operation = filters.CharFilter(field_name="subproduction__subplan_subprod__ow_subplan__operation") class Meta: model = TechDoc fields = ['subproduction', 'operation'] - # def filter_operation(self, queryset, name, value): - # return queryset.filter(subproduction__subplan_subprod__ow_subplan__operation=value) + def filter_operation(self, queryset, name, value): + return queryset.filter(subproduction__subplan_subprod__ow_subplan__operation=value).distinct() diff --git a/hb_server/apps/qm/views.py b/hb_server/apps/qm/views.py index beee64d..8b3b80e 100644 --- a/hb_server/apps/qm/views.py +++ b/hb_server/apps/qm/views.py @@ -50,7 +50,7 @@ class TestRecordViewSet(ListModelMixin, RetrieveModelMixin, GenericViewSet): perms_map = {'*': '*'} queryset = TestRecord.objects.select_related('fifo_item', 'form').all() serializer_class = TestRecordListSerializer - filterset_fields = ['wproduct', 'material', 'step', 'subproduction_plan', 'fifo_item', 'origin_test'] + filterset_fields = ['wproduct', 'material', 'step', 'subproduction_plan', 'fifo_item', 'origin_test', 'type'] ordering = ['-id'] def get_serializer_class(self): From 24307e27f54d90363b3236488ffe604e0bedbc6a Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 10 Dec 2021 14:16:24 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E5=A4=8D=E6=A3=80=E6=8F=90=E4=BE=9B?= =?UTF-8?q?=E5=8E=9F=E6=A3=80=E6=B5=8B=E8=AE=B0=E5=BD=95ID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/wpm/serializers.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/hb_server/apps/wpm/serializers.py b/hb_server/apps/wpm/serializers.py index cb687e8..154c2d5 100644 --- a/hb_server/apps/wpm/serializers.py +++ b/hb_server/apps/wpm/serializers.py @@ -288,10 +288,18 @@ class WpmTestRecordCreateSerializer(serializers.ModelSerializer): record_data = WpmTestRecordItemCreateSerializer(many=True) wproduct = serializers.PrimaryKeyRelatedField(queryset=WProduct.objects.all(), required=True) is_testok = serializers.BooleanField(required=False) - class Meta: model = TestRecord - fields = ['form', 'record_data', 'is_testok', 'wproduct'] + fields = ['form', 'record_data', 'is_testok', 'wproduct', 'origin_test'] + + def validate(self, attrs): + wproduct = attrs['wproduct'] + if wproduct.act_state == WProduct.WPR_ACT_STATE_TORETEST: + if 'origin_test' in attrs and attrs['origin_test']: + pass + else: + raise exceptions.APIException('复检需提供原检测记录ID') + return super().validate(attrs) class WpmTestFormInitSerializer(serializers.Serializer): wproduct = serializers.PrimaryKeyRelatedField(queryset=WProduct.objects.all(), required=True) From a5a11303e07e964684f80f3ee2a96a689b51fca6 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Mon, 13 Dec 2021 09:06:52 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E5=A4=8D=E6=A3=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/qm/models.py | 2 +- hb_server/apps/wf/models.py | 1 + hb_server/apps/wpm/models.py | 7 +++++++ hb_server/apps/wpm/serializers.py | 11 +++++++++-- hb_server/apps/wpm/views.py | 8 +++++--- 5 files changed, 23 insertions(+), 6 deletions(-) diff --git a/hb_server/apps/qm/models.py b/hb_server/apps/qm/models.py index 8c1b121..735c34e 100644 --- a/hb_server/apps/qm/models.py +++ b/hb_server/apps/qm/models.py @@ -64,7 +64,7 @@ class TestRecord(CommonAModel): is_testok = models.BooleanField('是否合格', default=True) is_testok_robot = models.BooleanField('自动判定的是否合格', default=True) number = models.CharField('产品编号', null=True, blank=True, max_length=50) - wproduct = models.ForeignKey('wpm.wproduct', verbose_name='关联的动态产品', on_delete=models.CASCADE, null=True, blank=True) + wproduct = models.ForeignKey('wpm.wproduct', verbose_name='关联的动态产品', on_delete=models.CASCADE, null=True, blank=True, related_name='test_wproduct') material = models.ForeignKey('mtm.material', verbose_name='关联的物料状态', on_delete=models.CASCADE, null=True, blank=True) step = models.ForeignKey('mtm.step', verbose_name='关联的工序步骤', on_delete=models.CASCADE, null=True, blank=True) subproduction_plan = models.ForeignKey('pm.subproductionplan', verbose_name='关联的生产子计划', on_delete=models.CASCADE, null=True, blank=True) diff --git a/hb_server/apps/wf/models.py b/hb_server/apps/wf/models.py index 4d06ca1..ba8c745 100644 --- a/hb_server/apps/wf/models.py +++ b/hb_server/apps/wf/models.py @@ -13,6 +13,7 @@ class Workflow(CommonAModel): 工作流 """ name = models.CharField('名称', max_length=50) + key = models.CharField('工作流标识', unique=True, max_length=20) sn_prefix = models.CharField('流水号前缀', max_length=50, default='hb') description = models.CharField('描述', max_length=200) view_permission_check = models.BooleanField('查看权限校验', default=True, help_text='开启后,只允许工单的关联人(创建人、曾经的处理人)有权限查看工单') diff --git a/hb_server/apps/wpm/models.py b/hb_server/apps/wpm/models.py index 391b591..182ffe8 100644 --- a/hb_server/apps/wpm/models.py +++ b/hb_server/apps/wpm/models.py @@ -5,6 +5,7 @@ import django.utils.timezone as timezone from django.db.models.query import QuerySet from apps.inm.models import FIFO, WareHouse from apps.pm.models import ProductionPlan, SubProductionPlan, SubProductionProgress +from apps.qm.models import TestRecord from apps.system.models import CommonADModel, CommonAModel, CommonBModel, Organization, User, Dict, File from utils.model import SoftModel, BaseModel from simple_history.models import HistoricalRecords @@ -56,6 +57,12 @@ class WProduct(CommonAModel): operation = models.ForeignKey('wpm.operation', verbose_name='关联操作', on_delete=models.SET_NULL, null=True, blank=True, related_name='wp_operation') + @property + def last_process_test(self): + """ + 最后的工序自检 + """ + return self.test_wproduct.filter(type=TestRecord.TEST_PROCESS).order_by('-id').first() class WprouctTicket(CommonAModel): """ 玻璃审批工单 diff --git a/hb_server/apps/wpm/serializers.py b/hb_server/apps/wpm/serializers.py index 154c2d5..74b9ba7 100644 --- a/hb_server/apps/wpm/serializers.py +++ b/hb_server/apps/wpm/serializers.py @@ -290,7 +290,7 @@ class WpmTestRecordCreateSerializer(serializers.ModelSerializer): is_testok = serializers.BooleanField(required=False) class Meta: model = TestRecord - fields = ['form', 'record_data', 'is_testok', 'wproduct', 'origin_test'] + fields = ['form', 'record_data', 'is_testok', 'wproduct'] def validate(self, attrs): wproduct = attrs['wproduct'] @@ -303,8 +303,15 @@ class WpmTestRecordCreateSerializer(serializers.ModelSerializer): class WpmTestFormInitSerializer(serializers.Serializer): wproduct = serializers.PrimaryKeyRelatedField(queryset=WProduct.objects.all(), required=True) - form = serializers.PrimaryKeyRelatedField(queryset=RecordForm.objects.all(), required=True) + form = serializers.PrimaryKeyRelatedField(queryset=RecordForm.objects.all(), required=False) + def validate(self, attrs): + wproduct = attrs['wproduct'] + form = attrs.get('form', None) + if wproduct.act_state != WProduct.WPR_ACT_STATE_TORETEST: + if not form: + raise exceptions.APIException('请指定检查表') + return super().validate(attrs) class WplanPutInSerializer(serializers.Serializer): warehouse = serializers.PrimaryKeyRelatedField(queryset=WareHouse.objects.all(), label="仓库ID") diff --git a/hb_server/apps/wpm/views.py b/hb_server/apps/wpm/views.py index b14872d..89d6698 100644 --- a/hb_server/apps/wpm/views.py +++ b/hb_server/apps/wpm/views.py @@ -193,16 +193,16 @@ class WProductViewSet(ListModelMixin, GenericViewSet): serializer.is_valid(raise_exception=True) vdata = serializer.validated_data wproduct = vdata['wproduct'] - form = vdata['form'] + form = vdata.get('form', None) # 如果是复检记录, 需要带入原数据 if wproduct.act_state == WProduct.WPR_ACT_STATE_TORETEST: # 查找最近一条检验记录 - trs = TestRecord.objects.filter(wproduct=wproduct, type=TestRecord.TEST_PROCESS).order_by('-id').first() + trs = wproduct.last_process_test if trs: origin_test = TestRecordDetailSerializer(instance=trs).data - data = RecordFormDetailSerializer(instance=form).data + data = RecordFormDetailSerializer(instance=trs.form).data data['origin_test'] = origin_test o_dict = {} for i in origin_test['record_data_']: @@ -261,6 +261,8 @@ class WProductViewSet(ListModelMixin, GenericViewSet): if obj.is_testok: if wproduct.act_state == WProduct.WPR_ACT_STATE_TORETEST: # 复检 + obj.origin_test = wproduct.last_process_test + obj.save() wproduct.act_state = WProduct.WPR_ACT_STATE_DOWAIT elif wproduct.act_state == WProduct.WPR_ACT_STATE_TOTEST and wproduct.material.type == Material.MA_TYPE_GOOD: # 成品检验 wproduct.act_state = WProduct.WPR_ACT_STATE_TOFINALTEST From ac135b13860aef1af250512098ab3b6f19be96f6 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Mon, 13 Dec 2021 09:14:56 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E5=A4=8D=E6=A3=80=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/wpm/serializers.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/hb_server/apps/wpm/serializers.py b/hb_server/apps/wpm/serializers.py index 74b9ba7..ca3da1d 100644 --- a/hb_server/apps/wpm/serializers.py +++ b/hb_server/apps/wpm/serializers.py @@ -291,15 +291,6 @@ class WpmTestRecordCreateSerializer(serializers.ModelSerializer): class Meta: model = TestRecord fields = ['form', 'record_data', 'is_testok', 'wproduct'] - - def validate(self, attrs): - wproduct = attrs['wproduct'] - if wproduct.act_state == WProduct.WPR_ACT_STATE_TORETEST: - if 'origin_test' in attrs and attrs['origin_test']: - pass - else: - raise exceptions.APIException('复检需提供原检测记录ID') - return super().validate(attrs) class WpmTestFormInitSerializer(serializers.Serializer): wproduct = serializers.PrimaryKeyRelatedField(queryset=WProduct.objects.all(), required=True) From 30dbc5a6cdb83bdfc8db97ad0d48bbf4bd7cbe89 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Mon, 13 Dec 2021 10:19:24 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E6=A3=80=E6=B5=8B=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E4=BF=9D=E5=AD=98bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/pm/views.py | 2 -- hb_server/apps/sam/serializers.py | 5 +++++ hb_server/apps/srm/__init__.py | 0 hb_server/apps/srm/admin.py | 3 +++ hb_server/apps/srm/apps.py | 6 ++++++ hb_server/apps/srm/migrations/__init__.py | 0 hb_server/apps/srm/models.py | 3 +++ hb_server/apps/srm/tests.py | 3 +++ hb_server/apps/srm/views.py | 8 ++++++++ hb_server/apps/wpm/views.py | 2 -- hb_server/server/settings.py | 3 ++- 11 files changed, 30 insertions(+), 5 deletions(-) create mode 100644 hb_server/apps/srm/__init__.py create mode 100644 hb_server/apps/srm/admin.py create mode 100644 hb_server/apps/srm/apps.py create mode 100644 hb_server/apps/srm/migrations/__init__.py create mode 100644 hb_server/apps/srm/models.py create mode 100644 hb_server/apps/srm/tests.py create mode 100644 hb_server/apps/srm/views.py diff --git a/hb_server/apps/pm/views.py b/hb_server/apps/pm/views.py index 4ad9519..3ed71f8 100644 --- a/hb_server/apps/pm/views.py +++ b/hb_server/apps/pm/views.py @@ -238,5 +238,3 @@ class ResourceViewSet(GenericViewSet): equips = Equipment.objects.filter(step_equips__in=steps, is_deleted=False).distinct() serializer = EquipmentSerializer(instance=equips, many=True) return Response(serializer.data) - - diff --git a/hb_server/apps/sam/serializers.py b/hb_server/apps/sam/serializers.py index 058db28..5c7afac 100644 --- a/hb_server/apps/sam/serializers.py +++ b/hb_server/apps/sam/serializers.py @@ -7,6 +7,7 @@ from apps.inm.serializers import IProductListSerializer from .models import Contract, Customer, Order, Sale, SaleProduct from apps.mtm.serializers import MaterialSimpleSerializer +from utils.tools import ranstr class CustomerSerializer(serializers.ModelSerializer): class Meta: @@ -44,6 +45,10 @@ class OrderCreateUpdateSerializer(serializers.ModelSerializer): class Meta: model = Order fields = ['number', 'customer', 'contract', 'product', 'count', 'delivery_date'] + + def create(self, validated_data): + validated_data['number'] = 'DD' + ranstr(7) + return super().create(validated_data) class OrderSerializer(serializers.ModelSerializer): contract_ = ContractSimpleSerializer(source='contract', read_only=True) diff --git a/hb_server/apps/srm/__init__.py b/hb_server/apps/srm/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/hb_server/apps/srm/admin.py b/hb_server/apps/srm/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/hb_server/apps/srm/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/hb_server/apps/srm/apps.py b/hb_server/apps/srm/apps.py new file mode 100644 index 0000000..99faf62 --- /dev/null +++ b/hb_server/apps/srm/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class SrmConfig(AppConfig): + name = 'apps.srm' + verbose_name = '统计报表' diff --git a/hb_server/apps/srm/migrations/__init__.py b/hb_server/apps/srm/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/hb_server/apps/srm/models.py b/hb_server/apps/srm/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/hb_server/apps/srm/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/hb_server/apps/srm/tests.py b/hb_server/apps/srm/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/hb_server/apps/srm/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/hb_server/apps/srm/views.py b/hb_server/apps/srm/views.py new file mode 100644 index 0000000..59607d6 --- /dev/null +++ b/hb_server/apps/srm/views.py @@ -0,0 +1,8 @@ +from django.shortcuts import render +from rest_framework.generics import ListAPIView +# Create your views here. + +class GanttOrder(ListAPIView): + """ + 订单-计划-子计划甘特图 + """ \ No newline at end of file diff --git a/hb_server/apps/wpm/views.py b/hb_server/apps/wpm/views.py index 89d6698..4317deb 100644 --- a/hb_server/apps/wpm/views.py +++ b/hb_server/apps/wpm/views.py @@ -249,7 +249,6 @@ class WProductViewSet(ListModelMixin, GenericViewSet): m['field_name'] = form_field.field_name m['field_key'] = form_field.field_key m['field_type'] = form_field.field_type - m['field_value'] = m['field_value'] m['sort'] = form_field.sort m['need_judge'] = form_field.need_judge m['is_testok'] = m['is_testok'] if 'is_testok' in m else None @@ -662,7 +661,6 @@ class OperationRecordViewSet(ListModelMixin, DestroyModelMixin, GenericViewSet): m['field_name'] = form_field.field_name m['field_key'] = form_field.field_key m['field_type'] = form_field.field_type - m['field_value'] = m['field_value'] m['sort'] = form_field.sort m['operation_record'] = opr wrds.append(OperationRecordItem(**m)) diff --git a/hb_server/server/settings.py b/hb_server/server/settings.py index f2e54e5..7338007 100644 --- a/hb_server/server/settings.py +++ b/hb_server/server/settings.py @@ -57,7 +57,8 @@ INSTALLED_APPS = [ 'apps.sam', 'apps.qm', 'apps.pm', - 'apps.wpm' + 'apps.wpm', + 'apps.srm' ] MIDDLEWARE = [