From 759062e3a20c7e717e930a48678694e6869ba59d Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 16 Dec 2021 09:46:24 +0800 Subject: [PATCH 01/23] =?UTF-8?q?=E8=BD=A6=E9=97=B4=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89=E8=A1=A8=E5=8D=95=E7=9A=84=E5=8F=AF?= =?UTF-8?q?update?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../inm/migrations/0023_auto_20211216_0945.py | 23 ++++++++++++ .../qm/migrations/0020_auto_20211216_0945.py | 37 +++++++++++++++++++ hb_server/apps/qm/models.py | 3 -- hb_server/apps/qm/serializers.py | 3 ++ .../wpm/migrations/0033_auto_20211216_0945.py | 29 +++++++++++++++ hb_server/apps/wpm/models.py | 4 -- hb_server/apps/wpm/views.py | 30 +++++++-------- 7 files changed, 107 insertions(+), 22 deletions(-) create mode 100644 hb_server/apps/inm/migrations/0023_auto_20211216_0945.py create mode 100644 hb_server/apps/qm/migrations/0020_auto_20211216_0945.py create mode 100644 hb_server/apps/wpm/migrations/0033_auto_20211216_0945.py diff --git a/hb_server/apps/inm/migrations/0023_auto_20211216_0945.py b/hb_server/apps/inm/migrations/0023_auto_20211216_0945.py new file mode 100644 index 0000000..a13408a --- /dev/null +++ b/hb_server/apps/inm/migrations/0023_auto_20211216_0945.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.9 on 2021-12-16 01:45 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('inm', '0022_auto_20211208_1408'), + ] + + operations = [ + migrations.AlterField( + model_name='fifoitem', + name='is_tested', + field=models.BooleanField(default=False, verbose_name='是否已检验'), + ), + migrations.AlterField( + model_name='fifoitem', + name='is_testok', + field=models.BooleanField(default=False, verbose_name='是否检验合格'), + ), + ] diff --git a/hb_server/apps/qm/migrations/0020_auto_20211216_0945.py b/hb_server/apps/qm/migrations/0020_auto_20211216_0945.py new file mode 100644 index 0000000..2610e7d --- /dev/null +++ b/hb_server/apps/qm/migrations/0020_auto_20211216_0945.py @@ -0,0 +1,37 @@ +# Generated by Django 3.2.9 on 2021-12-16 01:45 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('mtm', '0042_alter_recordformfield_field_type'), + ('qm', '0019_auto_20211214_1504'), + ] + + operations = [ + migrations.RemoveField( + model_name='testrecorditem', + name='field_key', + ), + migrations.RemoveField( + model_name='testrecorditem', + name='field_name', + ), + migrations.RemoveField( + model_name='testrecorditem', + name='field_type', + ), + migrations.AlterField( + model_name='testrecorditem', + name='form_field', + field=models.ForeignKey(db_constraint=False, on_delete=django.db.models.deletion.CASCADE, to='mtm.recordformfield', verbose_name='关联自定义表格字段'), + ), + migrations.AlterField( + model_name='testrecorditem', + name='test_record', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='item_test_record', to='qm.testrecord', verbose_name='关联的检验记录'), + ), + ] diff --git a/hb_server/apps/qm/models.py b/hb_server/apps/qm/models.py index ed7e582..6e82b8e 100644 --- a/hb_server/apps/qm/models.py +++ b/hb_server/apps/qm/models.py @@ -79,9 +79,6 @@ class TestRecordItem(BaseModel): 记录表格字段值 """ form_field = models.ForeignKey(RecordFormField, verbose_name='关联自定义表格字段', on_delete=models.CASCADE, db_constraint=False) - field_name = models.CharField('字段名', max_length=50) - field_key = models.CharField('字段标识', max_length=50) - field_type = models.CharField('字段类型', choices=RecordForm.type_choices, max_length=50) field_value = models.JSONField('录入值', default=dict, blank=True) is_hidden = models.BooleanField('是否隐藏', default=False) is_testok = models.BooleanField('是否合格', null=True, blank=True) diff --git a/hb_server/apps/qm/serializers.py b/hb_server/apps/qm/serializers.py index f329d3a..6785b0c 100644 --- a/hb_server/apps/qm/serializers.py +++ b/hb_server/apps/qm/serializers.py @@ -48,6 +48,9 @@ class TestRecordItemUpdateSerializer(serializers.ModelSerializer): class TestRecordItemSerializer(serializers.ModelSerializer): + field_key = serializers.CharField(source='form_field.field_key', read_only=True) + field_name = serializers.CharField(source='form_field.field_name', read_only=True) + field_type = serializers.CharField(source='form_field.field_type', read_only=True) need_judge = serializers.BooleanField(source='form_field.need_judge', read_only=True) rule_expression = serializers.JSONField(source='form_field.rule_expression', read_only=True) display_expression = serializers.JSONField(source='form_field.display_expression', read_only=True) diff --git a/hb_server/apps/wpm/migrations/0033_auto_20211216_0945.py b/hb_server/apps/wpm/migrations/0033_auto_20211216_0945.py new file mode 100644 index 0000000..6ec8a77 --- /dev/null +++ b/hb_server/apps/wpm/migrations/0033_auto_20211216_0945.py @@ -0,0 +1,29 @@ +# Generated by Django 3.2.9 on 2021-12-16 01:45 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('wpm', '0032_auto_20211214_1245'), + ] + + operations = [ + migrations.RemoveField( + model_name='operationrecorditem', + name='field_key', + ), + migrations.RemoveField( + model_name='operationrecorditem', + name='field_name', + ), + migrations.RemoveField( + model_name='operationrecorditem', + name='field_type', + ), + migrations.RemoveField( + model_name='operationrecorditem', + name='sort', + ), + ] diff --git a/hb_server/apps/wpm/models.py b/hb_server/apps/wpm/models.py index 5cdd3c7..0e49d4b 100644 --- a/hb_server/apps/wpm/models.py +++ b/hb_server/apps/wpm/models.py @@ -188,11 +188,7 @@ class OperationRecordItem(BaseModel): 记录表格字段值 """ form_field = models.ForeignKey(RecordFormField, verbose_name='关联字段', on_delete=models.CASCADE, db_constraint=False) - field_name = models.CharField('字段名', max_length=50) - field_key = models.CharField('字段标识', max_length=50) - field_type = models.CharField('字段类型', choices=RecordForm.type_choices, max_length=50) field_value = models.JSONField('录入值', default=dict, blank=True) - sort = models.IntegerField('排序号', default=1) operation_record = models.ForeignKey(OperationRecord, verbose_name='关联的生产记录', on_delete=models.CASCADE) class OperationEquip(BaseModel): diff --git a/hb_server/apps/wpm/views.py b/hb_server/apps/wpm/views.py index d426947..98f51ad 100644 --- a/hb_server/apps/wpm/views.py +++ b/hb_server/apps/wpm/views.py @@ -251,10 +251,6 @@ class WProductViewSet(ListModelMixin, GenericViewSet): obj = serializer.save(**savedict) tris = [] for m in record_data: # 保存记录详情 - form_field = m['form_field'] - m['field_name'] = form_field.field_name - m['field_key'] = form_field.field_key - m['field_type'] = form_field.field_type m['is_testok'] = m['is_testok'] if 'is_testok' in m else None m['is_hidden'] = m['is_hidden'] if 'is_hidden' in m else None m['test_record'] = obj @@ -532,7 +528,7 @@ class OperationViewSet(ListModelMixin, RetrieveModelMixin, CreateModelMixin, Upd WProduct.objects.create(**wpr) elif step.type == Step.STEP_TYPE_COMB: oms_w = OperationMaterial.objects.filter(operation=op, type=SubprodctionMaterial.SUB_MA_TYPE_OUT, - subproduction_progress__ismain=True) + subproduction_progress__is_main=True) if len(oms_w) == 1: oms_w = oms_w[0] # 校验单片数量是否正确, 暂时未写 @@ -655,17 +651,21 @@ class OperationRecordViewSet(ListModelMixin, DestroyModelMixin, UpdateModelMixin opr = self.get_object() if opr.operation.is_submited: raise exceptions.APIException('操作已提交不可修改') - wrds = [] - for m in vdata['record_data']: # 保存记录详情 + + # 已存在信息 + items = OperationRecordItem.objects.filter(operation=opr, is_deleted=False) + for m in vdata['record_data']: # 保存或创建记录详情 form_field = m['form_field'] - m['form_field'] = form_field - m['field_name'] = form_field.field_name - m['field_key'] = form_field.field_key - m['field_type'] = form_field.field_type - m['sort'] = form_field.sort - m['operation_record'] = opr - wrds.append(OperationRecordItem(**m)) - OperationRecordItem.objects.bulk_create(wrds) + for i in items: + if i.form_field == form_field: + # 更新操作 + i.field_value = m['field_value'] + i.save() + else: + OperationRecordItem.objects.create( + form_field=form_field, + field_value=m['field_value'], + operation_record=opr) opr.is_filled = True opr.save() return Response() From 2062ee7b75d146c5ec88c2be2f910132594cdbf6 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 16 Dec 2021 10:19:50 +0800 Subject: [PATCH 02/23] =?UTF-8?q?testrecord=20update=E6=8E=A5=E5=8F=A3?= 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/qm/serializers.py | 33 ++++++++----- hb_server/apps/wpm/views.py | 79 ++++++++------------------------ 3 files changed, 40 insertions(+), 74 deletions(-) diff --git a/hb_server/apps/qm/models.py b/hb_server/apps/qm/models.py index 6e82b8e..7f0f558 100644 --- a/hb_server/apps/qm/models.py +++ b/hb_server/apps/qm/models.py @@ -62,7 +62,6 @@ class TestRecord(CommonADModel): form = models.ForeignKey('mtm.recordform', verbose_name='所用表格', on_delete=models.CASCADE) type = models.PositiveSmallIntegerField(choices=type_choice, default=TEST_PROCESS) 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, related_name='test_wproduct') material = models.ForeignKey('mtm.material', verbose_name='关联的物料状态', on_delete=models.CASCADE, null=True, blank=True) @@ -82,5 +81,4 @@ class TestRecordItem(BaseModel): field_value = models.JSONField('录入值', default=dict, blank=True) is_hidden = models.BooleanField('是否隐藏', default=False) is_testok = models.BooleanField('是否合格', null=True, blank=True) - is_testok_robot = models.BooleanField('自动判定的是否合格', null=True, blank=True) test_record = models.ForeignKey(TestRecord, verbose_name='关联的检验记录', on_delete=models.CASCADE, related_name='item_test_record') \ No newline at end of file diff --git a/hb_server/apps/qm/serializers.py b/hb_server/apps/qm/serializers.py index 6785b0c..ef73911 100644 --- a/hb_server/apps/qm/serializers.py +++ b/hb_server/apps/qm/serializers.py @@ -109,10 +109,9 @@ class TestRecordDetailSerializer(serializers.ModelSerializer): return super().to_representation(instance) class TestRecordItemUpdatexSerializer(serializers.Serializer): - id = serializers.PrimaryKeyRelatedField(queryset=TestRecordItem.objects.all()) - field_value = serializers.JSONField(allow_null=True, required=False) - is_testok = serializers.BooleanField(allow_null=True, required=False) - is_hidden = serializers.BooleanField(default=False) + class Meta: + model = TestRecordItem + fields = ['form_field', 'field_value', 'is_hidden', 'is_testok'] class TestRecordUpdateSerializer(serializers.ModelSerializer): record_data = TestRecordItemUpdatexSerializer(many=True, write_only=True) @@ -124,11 +123,23 @@ class TestRecordUpdateSerializer(serializers.ModelSerializer): record_data = validated_data.pop('record_data') for attr, value in validated_data.items(): setattr(instance, attr, value) - instance.save() - for i in record_data: - tri = i['id'] - tri.field_value = i['field_value'] - tri.is_testok = i['is_testok'] - tri.is_hidden = i['is_hidden'] - tri.save() + instance.save(self.context['request'].user) + # 更新items + items = TestRecordItem.objects.filter(test_record=instance, is_deleted=False) + for m in record_data: # 保存或创建记录详情 + form_field = m['form_field'] + for i in items: + if i.form_field == form_field: + # 更新操作 + i.field_value = m['field_value'] + i.is_testok = m['is_testok'] + i.is_hidden = m['is_hidden'] + i.save() + else: + TestRecordItem.objects.create( + form_field=form_field, + field_value=m['field_value'], + is_testok = m['is_testok'], + is_hidden = m['is_hidden'], + test_record=instance) return instance diff --git a/hb_server/apps/wpm/views.py b/hb_server/apps/wpm/views.py index 98f51ad..94c0bda 100644 --- a/hb_server/apps/wpm/views.py +++ b/hb_server/apps/wpm/views.py @@ -188,7 +188,7 @@ class WProductViewSet(ListModelMixin, GenericViewSet): @action(methods=['post'], detail=False, perms_map={'post':'*'}, serializer_class=WpmTestFormInitSerializer) def test_init(self, request, pk=None): """ - 检验表单初始化 + 检验记录创建及初始化 """ serializer = WpmTestFormInitSerializer(data=request.data) serializer.is_valid(raise_exception=True) @@ -198,74 +198,31 @@ class WProductViewSet(ListModelMixin, GenericViewSet): if wproduct.test: raise exceptions.APIException('存在进行中检验') - data = RecordFormDetailSerializer(instance=form).data - data['origin_test'] = None - data['form'] = form.id - # 如果是复检, 需要带入原数据 - if wproduct.act_state == WProduct.WPR_ACT_STATE_TORETEST: - # 查找最近一条检验记录 - trs = wproduct.last_process_test - if trs: - origin_test = TestRecordDetailSerializer(instance=trs).data - data['origin_test_'] = origin_test - data['origin_test'] = origin_test.get('id', None) - o_dict = {} - 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']] if i['field_key'] in o_dict else None - i['is_hidden'] = o_dict[i['is_hidden']] if i['is_hidden'] in o_dict else False - else: - raise exceptions.APIException('原工序检验记录不存在') - - # 后续加入系统自带数据 - return Response(data) - - @action(methods=['post'], detail=False, perms_map={'post':'*'}, serializer_class=WpmTestRecordCreateSerializer) - @transaction.atomic - def test(self, request, pk=None): - """ - 检验记录提交 - """ - serializer = WpmTestRecordCreateSerializer(data=request.data) - serializer.is_valid(raise_exception=True) - vdata = serializer.validated_data - record_data = vdata.pop('record_data') - wproduct = vdata['wproduct'] + # 根据情况创建一条检验记录 if wproduct.act_state not in [WProduct.WPR_ACT_STATE_TOTEST, WProduct.WPR_ACT_STATE_TORETEST, WProduct.WPR_ACT_STATE_TOFINALTEST, WProduct.WPR_ACT_STATE_TOCOMBTEST]: raise exceptions.APIException('该产品当前状态不可检验') - if 'is_testok' not in vdata: - raise exceptions.APIException('未填写检验结论') - - savedict = dict(create_by = self.request.user, - material=wproduct.material, number=wproduct.number, subproduction_plan=wproduct.subproduction_plan, step=wproduct.step) + + savedict = dict( + create_by = self.request.user, + material=wproduct.material, + number=wproduct.number, + subproduction_plan=wproduct.subproduction_plan, + step=wproduct.step, + form=form) if wproduct.act_state == WProduct.WPR_ACT_STATE_TORETEST: - if not vdata['origin_test']: - raise exceptions.APIException('自检记录不存在') + # 查找最近一条检验记录 + trs = wproduct.last_process_test + savedict['origin_test'] = trs + if not trs: + raise exceptions.APIException('原工序检验记录不存在') savedict['type'] = TestRecord.TEST_PROCESS_RE elif wproduct.act_state == WProduct.WPR_ACT_STATE_TOFINALTEST: savedict['type'] = TestRecord.TEST_FINAL elif wproduct.act_state == WProduct.WPR_ACT_STATE_TOCOMBTEST: savedict['type'] = TestRecord.TEST_COMB - obj = serializer.save(**savedict) - tris = [] - for m in record_data: # 保存记录详情 - m['is_testok'] = m['is_testok'] if 'is_testok' in m else None - m['is_hidden'] = m['is_hidden'] if 'is_hidden' in m else None - m['test_record'] = obj - tris.append(TestRecordItem(**m)) - TestRecordItem.objects.bulk_create(tris) - - # 如果提交检验 - if obj.is_submited: - WpmServies.update_wproduct_by_test(obj, request.user) - else: - # 保存当前检验 - wproduct.test = obj - wproduct.update_by = request.user - wproduct.save() - return Response() + tr = TestRecord.objects.create(**savedict) + return Response(TestRecordDetailSerializer(instance=tr).data) @action(methods=['post'], detail=False, perms_map={'post':'*'}, serializer_class=WproductPutInsSerializer) @transaction.atomic @@ -551,7 +508,7 @@ class OperationViewSet(ListModelMixin, RetrieveModelMixin, CreateModelMixin, Upd wps = WProduct.objects.filter(ow_wproduct__operation = op) wps.update(is_hidden=True, child=wproduct, update_by=request.user, update_time=timezone.now()) else: - raise exceptions.APIException('产出物料错误') + raise exceptions.APIException('产出物料未填写或填写错误') op.is_submited = True op.save() return Response() From 221f987334992d4ae6b1c4dc4e18e938402ab007 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 16 Dec 2021 10:20:47 +0800 Subject: [PATCH 03/23] =?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 --- .../qm/migrations/0021_auto_20211216_1020.py | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 hb_server/apps/qm/migrations/0021_auto_20211216_1020.py diff --git a/hb_server/apps/qm/migrations/0021_auto_20211216_1020.py b/hb_server/apps/qm/migrations/0021_auto_20211216_1020.py new file mode 100644 index 0000000..e8868a6 --- /dev/null +++ b/hb_server/apps/qm/migrations/0021_auto_20211216_1020.py @@ -0,0 +1,21 @@ +# Generated by Django 3.2.9 on 2021-12-16 02:20 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('qm', '0020_auto_20211216_0945'), + ] + + operations = [ + migrations.RemoveField( + model_name='testrecord', + name='is_testok_robot', + ), + migrations.RemoveField( + model_name='testrecorditem', + name='is_testok_robot', + ), + ] From 67c480730c73420525934587aae8182431c98be2 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 16 Dec 2021 10:30:30 +0800 Subject: [PATCH 04/23] testrecorditemupdatex serializer --- hb_server/apps/qm/serializers.py | 2 +- hb_server/apps/wpm/views.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/hb_server/apps/qm/serializers.py b/hb_server/apps/qm/serializers.py index ef73911..72e7450 100644 --- a/hb_server/apps/qm/serializers.py +++ b/hb_server/apps/qm/serializers.py @@ -108,7 +108,7 @@ class TestRecordDetailSerializer(serializers.ModelSerializer): i['origin_value'] = o_dict[i['field_key']] if i['field_key'] in o_dict else None return super().to_representation(instance) -class TestRecordItemUpdatexSerializer(serializers.Serializer): +class TestRecordItemUpdatexSerializer(serializers.ModelSerializer): class Meta: model = TestRecordItem fields = ['form_field', 'field_value', 'is_hidden', 'is_testok'] diff --git a/hb_server/apps/wpm/views.py b/hb_server/apps/wpm/views.py index 94c0bda..395470c 100644 --- a/hb_server/apps/wpm/views.py +++ b/hb_server/apps/wpm/views.py @@ -624,6 +624,7 @@ class OperationRecordViewSet(ListModelMixin, DestroyModelMixin, UpdateModelMixin field_value=m['field_value'], operation_record=opr) opr.is_filled = True + opr.update_by = request.user opr.save() return Response() From 973dc769cb93784d3996c46f75d4b28ecdc941a4 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 16 Dec 2021 10:48:08 +0800 Subject: [PATCH 05/23] =?UTF-8?q?=E6=A3=80=E9=AA=8C=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E5=88=9B=E5=BB=BA=E6=97=B6=E5=88=9B=E5=BB=BAitem?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/wpm/views.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/hb_server/apps/wpm/views.py b/hb_server/apps/wpm/views.py index 395470c..4aa5bfb 100644 --- a/hb_server/apps/wpm/views.py +++ b/hb_server/apps/wpm/views.py @@ -222,6 +222,13 @@ class WProductViewSet(ListModelMixin, GenericViewSet): elif wproduct.act_state == WProduct.WPR_ACT_STATE_TOCOMBTEST: savedict['type'] = TestRecord.TEST_COMB tr = TestRecord.objects.create(**savedict) + # 创建检验条目 + for i in RecordFormField.objects.filter(form=form, is_deleted=False): + tri = TestRecordItem() + tri.test_record = tr + tri.form_field = i + tri.is_hidden = i.is_hidden + tri.save() return Response(TestRecordDetailSerializer(instance=tr).data) @action(methods=['post'], detail=False, perms_map={'post':'*'}, serializer_class=WproductPutInsSerializer) From 8c1c0fe2cfa62029569c37fa499d853136fb10b6 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 16 Dec 2021 10:56:21 +0800 Subject: [PATCH 06/23] =?UTF-8?q?operation=20record=20=E6=8F=90=E4=BA=A4bu?= =?UTF-8?q?g?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/wpm/views.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/hb_server/apps/wpm/views.py b/hb_server/apps/wpm/views.py index 4aa5bfb..2a7b02d 100644 --- a/hb_server/apps/wpm/views.py +++ b/hb_server/apps/wpm/views.py @@ -408,6 +408,13 @@ class OperationViewSet(ListModelMixin, RetrieveModelMixin, CreateModelMixin, Upd opr.operation = op opr.form = i opr.is_filled = False + opri_list = [] + for m in RecordFormField.objects.filter(form=i, is_deleted=False): + opri_dict = {} + opri_dict['form_field'] = m + opri_dict['operation_record'] = opr + opri_list.append(OperationRecordItem(**opri_dict)) + OperationRecordItem.objects.bulk_create(opri_list) opr.save() # 查询需要使用的生产设备 for i in step.equipments.all(): @@ -617,7 +624,7 @@ class OperationRecordViewSet(ListModelMixin, DestroyModelMixin, UpdateModelMixin raise exceptions.APIException('操作已提交不可修改') # 已存在信息 - items = OperationRecordItem.objects.filter(operation=opr, is_deleted=False) + items = OperationRecordItem.objects.filter(operation_record=opr, is_deleted=False) for m in vdata['record_data']: # 保存或创建记录详情 form_field = m['form_field'] for i in items: From 275b84d20e27e1967adbc67a20cdc68e7b1c5ce0 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 16 Dec 2021 11:19:44 +0800 Subject: [PATCH 07/23] operation record update --- hb_server/apps/qm/serializers.py | 35 +++++++++++------------------- hb_server/apps/wpm/models.py | 4 ++-- hb_server/apps/wpm/serializers.py | 34 +++++++++++++++++++++++------ hb_server/apps/wpm/views.py | 36 +++++-------------------------- 4 files changed, 46 insertions(+), 63 deletions(-) diff --git a/hb_server/apps/qm/serializers.py b/hb_server/apps/qm/serializers.py index 72e7450..6785b0c 100644 --- a/hb_server/apps/qm/serializers.py +++ b/hb_server/apps/qm/serializers.py @@ -108,10 +108,11 @@ class TestRecordDetailSerializer(serializers.ModelSerializer): i['origin_value'] = o_dict[i['field_key']] if i['field_key'] in o_dict else None return super().to_representation(instance) -class TestRecordItemUpdatexSerializer(serializers.ModelSerializer): - class Meta: - model = TestRecordItem - fields = ['form_field', 'field_value', 'is_hidden', 'is_testok'] +class TestRecordItemUpdatexSerializer(serializers.Serializer): + id = serializers.PrimaryKeyRelatedField(queryset=TestRecordItem.objects.all()) + field_value = serializers.JSONField(allow_null=True, required=False) + is_testok = serializers.BooleanField(allow_null=True, required=False) + is_hidden = serializers.BooleanField(default=False) class TestRecordUpdateSerializer(serializers.ModelSerializer): record_data = TestRecordItemUpdatexSerializer(many=True, write_only=True) @@ -123,23 +124,11 @@ class TestRecordUpdateSerializer(serializers.ModelSerializer): record_data = validated_data.pop('record_data') for attr, value in validated_data.items(): setattr(instance, attr, value) - instance.save(self.context['request'].user) - # 更新items - items = TestRecordItem.objects.filter(test_record=instance, is_deleted=False) - for m in record_data: # 保存或创建记录详情 - form_field = m['form_field'] - for i in items: - if i.form_field == form_field: - # 更新操作 - i.field_value = m['field_value'] - i.is_testok = m['is_testok'] - i.is_hidden = m['is_hidden'] - i.save() - else: - TestRecordItem.objects.create( - form_field=form_field, - field_value=m['field_value'], - is_testok = m['is_testok'], - is_hidden = m['is_hidden'], - test_record=instance) + instance.save() + for i in record_data: + tri = i['id'] + tri.field_value = i['field_value'] + tri.is_testok = i['is_testok'] + tri.is_hidden = i['is_hidden'] + tri.save() return instance diff --git a/hb_server/apps/wpm/models.py b/hb_server/apps/wpm/models.py index 0e49d4b..3679faa 100644 --- a/hb_server/apps/wpm/models.py +++ b/hb_server/apps/wpm/models.py @@ -187,9 +187,9 @@ class OperationRecordItem(BaseModel): """ 记录表格字段值 """ - form_field = models.ForeignKey(RecordFormField, verbose_name='关联字段', on_delete=models.CASCADE, db_constraint=False) + form_field = models.ForeignKey(RecordFormField, verbose_name='关联字段', on_delete=models.CASCADE, related_name='ori_form_field') field_value = models.JSONField('录入值', default=dict, blank=True) - operation_record = models.ForeignKey(OperationRecord, verbose_name='关联的生产记录', on_delete=models.CASCADE) + operation_record = models.ForeignKey(OperationRecord, verbose_name='关联的生产记录', on_delete=models.CASCADE, related_name='item_operation_record') class OperationEquip(BaseModel): operation = models.ForeignKey(Operation, verbose_name='关联操作', on_delete=models.CASCADE, related_name='oe_operation') diff --git a/hb_server/apps/wpm/serializers.py b/hb_server/apps/wpm/serializers.py index 3cab8b8..ea38496 100644 --- a/hb_server/apps/wpm/serializers.py +++ b/hb_server/apps/wpm/serializers.py @@ -244,19 +244,18 @@ class DoOutputSerializer(serializers.Serializer): material = serializers.PrimaryKeyRelatedField(queryset=Material.objects.all(), label='物料ID') count_output = serializers.IntegerField(min_value=0, label='产出数量') -class OperationRecordItemSerializer(serializers.ModelSerializer): - class Meta: - model = OperationRecordItem - fields = ['form_field', 'field_value'] +class OperationRecordItemUpdateSerializer(serializers.Serializer): + id = serializers.PrimaryKeyRelatedField(queryset=OperationRecordItem.objects.all()) + field_value = serializers.JSONField(allow_null=True, required=False) class OperationRecordSubmitSerializer(serializers.ModelSerializer): - record_data = OperationRecordItemSerializer(many=True) + record_data = OperationRecordItemUpdateSerializer(many=True) class Meta: model = OperationRecord fields = ['record_data'] class OperationRecordSerializer(serializers.ModelSerializer): - record_data = OperationRecordItemSerializer(many=True) + record_data = OperationRecordItemUpdateSerializer(many=True) class Meta: model = OperationRecord fields = ['form', 'record_data'] @@ -392,4 +391,25 @@ class OperationMaterialCreate3Serializer(serializers.ModelSerializer): validated_data['type'] = SubprodctionMaterial.SUB_MA_TYPE_TOOL return super().create(validated_data) - \ No newline at end of file + +class OperationRecordItemSerializer(serializers.ModelSerializer): + field_key = serializers.CharField(source='form_field.field_key', read_only=True) + field_name = serializers.CharField(source='form_field.field_name', read_only=True) + field_type = serializers.CharField(source='form_field.field_type', read_only=True) + is_hidden = serializers.BooleanField(source='form_field.is_hidden', read_only=True) + help_text = serializers.CharField(source='form_field.help_text', read_only=True) + sort = serializers.IntegerField(source='form_field.sort', read_only=True) + class Meta: + model = OperationRecordItem + fields = '__all__' + +class OperationRecordDetailSerializer(serializers.ModelSerializer): + form_ = RecordFormSimpleSerializer(source='form', read_only=True) + record_data = serializers.SerializerMethodField() + create_by_ = UserSimpleSerializer(source='create_by', read_only=True) + class Meta: + model = OperationRecord + fields = '__all__' + + def get_record_data(self, obj): + return OperationRecordItemSerializer(instance=obj.item_operation_record.order_by('form_field__sort'), many=True).data \ No newline at end of file diff --git a/hb_server/apps/wpm/views.py b/hb_server/apps/wpm/views.py index 2a7b02d..f64bd30 100644 --- a/hb_server/apps/wpm/views.py +++ b/hb_server/apps/wpm/views.py @@ -408,13 +408,8 @@ class OperationViewSet(ListModelMixin, RetrieveModelMixin, CreateModelMixin, Upd opr.operation = op opr.form = i opr.is_filled = False - opri_list = [] for m in RecordFormField.objects.filter(form=i, is_deleted=False): - opri_dict = {} - opri_dict['form_field'] = m - opri_dict['operation_record'] = opr - opri_list.append(OperationRecordItem(**opri_dict)) - OperationRecordItem.objects.bulk_create(opri_list) + OperationRecordItem.objects.create(operation_record=opr, form_field=m) opr.save() # 查询需要使用的生产设备 for i in step.equipments.all(): @@ -604,16 +599,6 @@ class OperationRecordViewSet(ListModelMixin, DestroyModelMixin, UpdateModelMixin instance.delete() return Response() - @action(methods=['get'], detail=True, perms_map={'get':'*'}) - def init(self, request, pk=None): - ''' - 表格初始化 - ''' - obj = self.get_object() - data = RecordFormDetailSerializer(instance=obj.form).data - # 后续加入系统带入数据 - return Response(data) - def update(self, request, *args, **kwargs): serializer = OperationRecordSubmitSerializer(data=request.data) @@ -622,21 +607,10 @@ class OperationRecordViewSet(ListModelMixin, DestroyModelMixin, UpdateModelMixin opr = self.get_object() if opr.operation.is_submited: raise exceptions.APIException('操作已提交不可修改') - - # 已存在信息 - items = OperationRecordItem.objects.filter(operation_record=opr, is_deleted=False) - for m in vdata['record_data']: # 保存或创建记录详情 - form_field = m['form_field'] - for i in items: - if i.form_field == form_field: - # 更新操作 - i.field_value = m['field_value'] - i.save() - else: - OperationRecordItem.objects.create( - form_field=form_field, - field_value=m['field_value'], - operation_record=opr) + for i in vdata['record_data']: + ori = i['id'] + ori.field_value = i['field_value'] + ori.save() opr.is_filled = True opr.update_by = request.user opr.save() From 6c5b4eea6ec5d31a747507899827d062312d6cc9 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 16 Dec 2021 11:24:24 +0800 Subject: [PATCH 08/23] operation create bug --- hb_server/apps/wpm/views.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/hb_server/apps/wpm/views.py b/hb_server/apps/wpm/views.py index f64bd30..bceb6e9 100644 --- a/hb_server/apps/wpm/views.py +++ b/hb_server/apps/wpm/views.py @@ -20,7 +20,7 @@ from apps.wf.models import Workflow from apps.wpm.filters import WMaterialFilterSet from apps.wpm.models import OperationEquip, OperationWproduct, Pick, PickWproduct, WMaterial, WProduct, Operation, OperationMaterial, OperationRecord, OperationRecordItem -from apps.wpm.serializers import OperationEquipListSerializer, OperationEquipUpdateSerializer, OperationMaterialCreate1ListSerailizer, OperationMaterialCreate1Serailizer, OperationMaterialCreate2ListSerailizer, OperationMaterialCreate2Serailizer, OperationMaterialCreate3Serializer, OperationMaterialListSerializer, OperationRecordListSerializer, OperationRecordSubmitSerializer, OperationUpdateSerializer, OperationWproductListSerializer, OperationCreateSerializer, OperationDetailSerializer, OperationListSerializer, PickHalfSerializer, PickHalfsSerializer, PickSerializer, OperationInitSerializer, OperationSubmitSerializer, WMaterialListSerializer, WProductListSerializer, WplanPutInSerializer, WpmTestFormInitSerializer, WpmTestRecordCreateSerializer, WproductPutInSerializer, WproductPutInsSerializer +from apps.wpm.serializers import OperationEquipListSerializer, OperationEquipUpdateSerializer, OperationMaterialCreate1ListSerailizer, OperationMaterialCreate1Serailizer, OperationMaterialCreate2ListSerailizer, OperationMaterialCreate2Serailizer, OperationMaterialCreate3Serializer, OperationMaterialListSerializer, OperationRecordDetailSerializer, OperationRecordListSerializer, OperationRecordSubmitSerializer, OperationUpdateSerializer, OperationWproductListSerializer, OperationCreateSerializer, OperationDetailSerializer, OperationListSerializer, PickHalfSerializer, PickHalfsSerializer, PickSerializer, OperationInitSerializer, OperationSubmitSerializer, WMaterialListSerializer, WProductListSerializer, WplanPutInSerializer, WpmTestFormInitSerializer, WpmTestRecordCreateSerializer, WproductPutInSerializer, WproductPutInsSerializer from rest_framework.response import Response from django.db import transaction from rest_framework import exceptions, serializers @@ -408,9 +408,14 @@ class OperationViewSet(ListModelMixin, RetrieveModelMixin, CreateModelMixin, Upd opr.operation = op opr.form = i opr.is_filled = False - for m in RecordFormField.objects.filter(form=i, is_deleted=False): - OperationRecordItem.objects.create(operation_record=opr, form_field=m) opr.save() + opri_list = [] + for m in RecordFormField.objects.filter(form=i, is_deleted=False): + opri_dict = {} + opri_dict['operation_record'] = opr + opri_dict['form_field'] = m + opri_list.append(OperationRecordItem(**opri_dict)) + OperationRecordItem.objects.bulk_create(opri_list) # 查询需要使用的生产设备 for i in step.equipments.all(): ope = OperationEquip() @@ -576,7 +581,7 @@ class OperationEquipViewSet(ListModelMixin, DestroyModelMixin, UpdateModelMixin, instance.delete() return Response() -class OperationRecordViewSet(ListModelMixin, DestroyModelMixin, UpdateModelMixin, GenericViewSet): +class OperationRecordViewSet(ListModelMixin, DestroyModelMixin, UpdateModelMixin, RetrieveModelMixin, GenericViewSet): """ 操作使用的自定义表格 """ @@ -590,6 +595,8 @@ class OperationRecordViewSet(ListModelMixin, DestroyModelMixin, UpdateModelMixin def get_serializer_class(self): if self.action == 'update': return OperationRecordSubmitSerializer + elif self.action == 'retrieve': + return OperationRecordDetailSerializer return super().get_serializer_class() @transaction.atomic() def destroy(self, request, *args, **kwargs): From 1d8cdb4c5cbeebdd901ca030504be6ca13c784bf Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 16 Dec 2021 13:02:40 +0800 Subject: [PATCH 09/23] test_int bug --- .../wpm/migrations/0034_auto_20211216_1127.py | 25 +++++++++++++++++++ hb_server/apps/wpm/views.py | 1 + 2 files changed, 26 insertions(+) create mode 100644 hb_server/apps/wpm/migrations/0034_auto_20211216_1127.py diff --git a/hb_server/apps/wpm/migrations/0034_auto_20211216_1127.py b/hb_server/apps/wpm/migrations/0034_auto_20211216_1127.py new file mode 100644 index 0000000..efbe55f --- /dev/null +++ b/hb_server/apps/wpm/migrations/0034_auto_20211216_1127.py @@ -0,0 +1,25 @@ +# Generated by Django 3.2.9 on 2021-12-16 03:27 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('mtm', '0042_alter_recordformfield_field_type'), + ('wpm', '0033_auto_20211216_0945'), + ] + + operations = [ + migrations.AlterField( + model_name='operationrecorditem', + name='form_field', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='ori_form_field', to='mtm.recordformfield', verbose_name='关联字段'), + ), + migrations.AlterField( + model_name='operationrecorditem', + name='operation_record', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='item_operation_record', to='wpm.operationrecord', verbose_name='关联的生产记录'), + ), + ] diff --git a/hb_server/apps/wpm/views.py b/hb_server/apps/wpm/views.py index bceb6e9..4587b9c 100644 --- a/hb_server/apps/wpm/views.py +++ b/hb_server/apps/wpm/views.py @@ -205,6 +205,7 @@ class WProductViewSet(ListModelMixin, GenericViewSet): savedict = dict( create_by = self.request.user, + wproduct=wproduct, material=wproduct.material, number=wproduct.number, subproduction_plan=wproduct.subproduction_plan, From 424fa529f0ddbaa6370434d14ded493122e369b1 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 16 Dec 2021 13:15:37 +0800 Subject: [PATCH 10/23] test init bug --- hb_server/apps/wpm/views.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/hb_server/apps/wpm/views.py b/hb_server/apps/wpm/views.py index 4587b9c..78a95ab 100644 --- a/hb_server/apps/wpm/views.py +++ b/hb_server/apps/wpm/views.py @@ -223,6 +223,8 @@ class WProductViewSet(ListModelMixin, GenericViewSet): elif wproduct.act_state == WProduct.WPR_ACT_STATE_TOCOMBTEST: savedict['type'] = TestRecord.TEST_COMB tr = TestRecord.objects.create(**savedict) + wproduct.test = tr + wproduct.save() # 创建检验条目 for i in RecordFormField.objects.filter(form=form, is_deleted=False): tri = TestRecordItem() From 8a255c02dc82b1c3477bb9a9a59e78c820fe2afc Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 16 Dec 2021 14:01:44 +0800 Subject: [PATCH 11/23] =?UTF-8?q?operation=20record=20item=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E4=B8=BA=E7=A9=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qm/migrations/0022_auto_20211216_1401.py | 25 +++++++++++++++++++ hb_server/apps/qm/models.py | 4 +-- ...5_alter_operationrecorditem_field_value.py | 18 +++++++++++++ hb_server/apps/wpm/models.py | 2 +- 4 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 hb_server/apps/qm/migrations/0022_auto_20211216_1401.py create mode 100644 hb_server/apps/wpm/migrations/0035_alter_operationrecorditem_field_value.py diff --git a/hb_server/apps/qm/migrations/0022_auto_20211216_1401.py b/hb_server/apps/qm/migrations/0022_auto_20211216_1401.py new file mode 100644 index 0000000..b39573b --- /dev/null +++ b/hb_server/apps/qm/migrations/0022_auto_20211216_1401.py @@ -0,0 +1,25 @@ +# Generated by Django 3.2.9 on 2021-12-16 06:01 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('mtm', '0042_alter_recordformfield_field_type'), + ('qm', '0021_auto_20211216_1020'), + ] + + operations = [ + migrations.AlterField( + model_name='testrecorditem', + name='field_value', + field=models.JSONField(blank=True, null=True, verbose_name='录入值'), + ), + migrations.AlterField( + model_name='testrecorditem', + name='form_field', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mtm.recordformfield', verbose_name='关联自定义表格字段'), + ), + ] diff --git a/hb_server/apps/qm/models.py b/hb_server/apps/qm/models.py index 7f0f558..e892071 100644 --- a/hb_server/apps/qm/models.py +++ b/hb_server/apps/qm/models.py @@ -77,8 +77,8 @@ class TestRecordItem(BaseModel): """ 记录表格字段值 """ - form_field = models.ForeignKey(RecordFormField, verbose_name='关联自定义表格字段', on_delete=models.CASCADE, db_constraint=False) - field_value = models.JSONField('录入值', default=dict, blank=True) + form_field = models.ForeignKey(RecordFormField, verbose_name='关联自定义表格字段', on_delete=models.CASCADE) + field_value = models.JSONField('录入值', null=True, blank=True) is_hidden = models.BooleanField('是否隐藏', default=False) is_testok = models.BooleanField('是否合格', null=True, blank=True) test_record = models.ForeignKey(TestRecord, verbose_name='关联的检验记录', on_delete=models.CASCADE, related_name='item_test_record') \ No newline at end of file diff --git a/hb_server/apps/wpm/migrations/0035_alter_operationrecorditem_field_value.py b/hb_server/apps/wpm/migrations/0035_alter_operationrecorditem_field_value.py new file mode 100644 index 0000000..59097bb --- /dev/null +++ b/hb_server/apps/wpm/migrations/0035_alter_operationrecorditem_field_value.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.9 on 2021-12-16 06:01 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('wpm', '0034_auto_20211216_1127'), + ] + + operations = [ + migrations.AlterField( + model_name='operationrecorditem', + name='field_value', + field=models.JSONField(blank=True, null=True, verbose_name='录入值'), + ), + ] diff --git a/hb_server/apps/wpm/models.py b/hb_server/apps/wpm/models.py index 3679faa..15b7a3f 100644 --- a/hb_server/apps/wpm/models.py +++ b/hb_server/apps/wpm/models.py @@ -188,7 +188,7 @@ class OperationRecordItem(BaseModel): 记录表格字段值 """ form_field = models.ForeignKey(RecordFormField, verbose_name='关联字段', on_delete=models.CASCADE, related_name='ori_form_field') - field_value = models.JSONField('录入值', default=dict, blank=True) + field_value = models.JSONField('录入值', null=True, blank=True) operation_record = models.ForeignKey(OperationRecord, verbose_name='关联的生产记录', on_delete=models.CASCADE, related_name='item_operation_record') class OperationEquip(BaseModel): From 9d4a75497dc44710d6612b9d9abde0f4eaf13981 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 16 Dec 2021 14:25:31 +0800 Subject: [PATCH 12/23] =?UTF-8?q?=E6=A0=A1=E9=AA=8C=E6=9C=AA=E5=A1=AB?= =?UTF-8?q?=E5=86=99=E9=A1=B9=E7=9B=AE=20bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/qm/views.py | 2 +- hb_server/apps/wf/models.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/hb_server/apps/qm/views.py b/hb_server/apps/qm/views.py index 32d0334..2a11f72 100644 --- a/hb_server/apps/qm/views.py +++ b/hb_server/apps/qm/views.py @@ -84,7 +84,7 @@ class TestRecordViewSet(ListModelMixin, UpdateModelMixin, RetrieveModelMixin, De obj = self.get_object() # 校验是否有未填项目 if obj.type != TestRecord.TEST_PROCESS_RE: - if TestRecordItem.objects.filter(field_value__isnull=True, is_hidden=False).exists(): + if TestRecordItem.objects.filter(field_value__isnull=True, is_hidden=False, test_record=obj).exists(): raise exceptions.APIException('存在未填写项目') with transaction.atomic(): WpmServies.update_wproduct_by_test(obj, request.user) diff --git a/hb_server/apps/wf/models.py b/hb_server/apps/wf/models.py index 5d6625d..f343e2d 100644 --- a/hb_server/apps/wf/models.py +++ b/hb_server/apps/wf/models.py @@ -15,7 +15,7 @@ class Workflow(CommonAModel): name = models.CharField('名称', max_length=50) key = models.CharField('工作流标识', unique=True, max_length=20, null=True, blank=True) sn_prefix = models.CharField('流水号前缀', max_length=50, default='hb') - description = models.CharField('描述', max_length=200) + description = models.CharField('描述', max_length=200, null=True, blank=True) view_permission_check = models.BooleanField('查看权限校验', default=True, help_text='开启后,只允许工单的关联人(创建人、曾经的处理人)有权限查看工单') limit_expression = models.JSONField('限制表达式', default=dict, blank=True, help_text='限制周期({"period":24} 24小时), 限制次数({"count":1}在限制周期内只允许提交1次), 限制级别({"level":1} 针对(1单个用户 2全局)限制周期限制次数,默认特定用户);允许特定人员提交({"allow_persons":"zhangsan,lisi"}只允许张三提交工单,{"allow_depts":"1,2"}只允许部门id为1和2的用户提交工单,{"allow_roles":"1,2"}只允许角色id为1和2的用户提交工单)') display_form_str = models.JSONField('展现表单字段', default=list, blank=True, help_text='默认"[]",用于用户只有对应工单查看权限时显示哪些字段,field_key的list的json,如["days","sn"],内置特殊字段participant_info.participant_name:当前处理人信息(部门名称、角色名称),state.state_name:当前状态的状态名,workflow.workflow_name:工作流名称') From 465d3cc6e9d5f84f571f317520c05c06c02be7b3 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 16 Dec 2021 15:09:45 +0800 Subject: [PATCH 13/23] testrecord detail bug --- hb_server/apps/qm/serializers.py | 2 +- hb_server/apps/wf/models.py | 2 +- hb_server/apps/wf/serializers.py | 2 +- hb_server/apps/wf/services.py | 7 +++++++ hb_server/apps/wf/views.py | 19 ++++++++++++++----- 5 files changed, 24 insertions(+), 8 deletions(-) diff --git a/hb_server/apps/qm/serializers.py b/hb_server/apps/qm/serializers.py index 6785b0c..d453937 100644 --- a/hb_server/apps/qm/serializers.py +++ b/hb_server/apps/qm/serializers.py @@ -100,7 +100,7 @@ class TestRecordDetailSerializer(serializers.ModelSerializer): def to_representation(self, instance): ret = super().to_representation(instance) if instance.origin_test and instance.type == TestRecord.TEST_PROCESS_RE: - origin_test = ret['origin_test'] + origin_test = ret['origin_test_'] o_dict = {} for i in origin_test['record_data']: o_dict[i['field_key']] = i['field_value'] diff --git a/hb_server/apps/wf/models.py b/hb_server/apps/wf/models.py index f343e2d..7b2e280 100644 --- a/hb_server/apps/wf/models.py +++ b/hb_server/apps/wf/models.py @@ -197,7 +197,7 @@ class Ticket(CommonBModel): ('worked', '我处理的'), ('cc', '抄送我的') ) - title = models.CharField('标题', max_length=500, blank=True, default='', help_text="工单标题") + title = models.CharField('标题', max_length=500, null=True, blank=True, help_text="工单标题") workflow = models.ForeignKey(Workflow, on_delete=models.CASCADE, verbose_name='关联工作流') sn = models.CharField('流水号', max_length=25, help_text="工单的流水号") state = models.ForeignKey(State, on_delete=models.CASCADE, verbose_name='当前状态', related_name='ticket_state') diff --git a/hb_server/apps/wf/serializers.py b/hb_server/apps/wf/serializers.py index e79f121..ae3bf88 100644 --- a/hb_server/apps/wf/serializers.py +++ b/hb_server/apps/wf/serializers.py @@ -49,7 +49,7 @@ class TicketSimpleSerializer(serializers.ModelSerializer): fields = '__all__' class TicketCreateSerializer(serializers.ModelSerializer): - transition = serializers.IntegerField(label='流转ID') + transition = serializers.PrimaryKeyRelatedField(queryset=Transition.objects.all(), write_only=True) class Meta: model=Ticket fields=['title','workflow', 'ticket_data', 'transition'] diff --git a/hb_server/apps/wf/services.py b/hb_server/apps/wf/services.py index badfc5e..46ef6b8 100644 --- a/hb_server/apps/wf/services.py +++ b/hb_server/apps/wf/services.py @@ -54,6 +54,13 @@ class WfService(object): """ return CustomField.objects.filter(is_deleted=False, workflow=workflow).order_by('sort') + @staticmethod + def get_workflow_custom_fields_list(workflow:Workflow): + """ + 获取工单字段key List + """ + return CustomField.objects.filter(is_deleted=False, workflow=workflow).order_by('sort').values_list('field_key', flat=True) + @classmethod def get_ticket_transitions(cls, ticket:Ticket): """ diff --git a/hb_server/apps/wf/views.py b/hb_server/apps/wf/views.py index 592e422..22da7aa 100644 --- a/hb_server/apps/wf/views.py +++ b/hb_server/apps/wf/views.py @@ -137,14 +137,23 @@ class TicketViewSet(OptimizationMixin, CreateUpdateCustomMixin, CreateModelMixin rdata = request.data serializer = self.get_serializer(data=rdata) serializer.is_valid(raise_exception=True) - start_state = WfService.get_workflow_start_state(rdata['workflow']) - transition = Transition.objects.get(pk=rdata['transition']) - ticket_data = rdata['ticket_data'] + vdata = serializer.validated_data #校验之后的数据 + start_state = WfService.get_workflow_start_state(vdata['workflow']) + field_key_list = WfService.get_workflow_custom_fields_list(vdata['workflow']) + transition = vdata['transition'] + ticket_data = vdata['ticket_data'] + #校验必填项 if transition.field_require_check: - for key, value in start_state.state_fields.items(): #校验必填项 + for key, value in start_state.state_fields.items(): if value == State.STATE_FIELD_REQUIRED: if key not in ticket_data or not ticket_data[key]: raise APIException('字段{}必填'.format(key)) + save_ticket_data = {} + # 只保存必填项以及可选项 + for key, vlaue in ticket_data: + if key in field_key_list and key in start_state.state_fields and start_state.state_fields[key] in [ + State.STATE_FIELD_REQUIRED, State.STATE_FIELD_OPTIONAL]: + save_ticket_data[key] = value ticket = serializer.save(state=start_state, create_by=request.user, act_state=Ticket.TICKET_ACT_STATE_DRAFT, belong_dept=request.user.dept) # 先创建出来 next_state = WfService.get_next_state_by_transition_and_ticket_info(ticket=ticket, transition=transition) @@ -159,7 +168,7 @@ class TicketViewSet(OptimizationMixin, CreateUpdateCustomMixin, CreateModelMixin act_state = Ticket.TICKET_ACT_STATE_DRAFT else: act_state = Ticket.TICKET_ACT_STATE_ONGOING - title = rdata.get('title', '') + title = vdata['title'] title_template = ticket.workflow.title_template if title_template: all_ticket_data = {**rdata, **rdata['ticket_data']} From 1f0fb5251362714a3042cac8c1c0bf79727abee7 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 16 Dec 2021 15:28:32 +0800 Subject: [PATCH 14/23] =?UTF-8?q?=E5=B7=A5=E4=BD=9C=E6=B5=81=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/wf/models.py | 4 ++-- hb_server/apps/wf/views.py | 14 ++++++++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/hb_server/apps/wf/models.py b/hb_server/apps/wf/models.py index 7b2e280..cdc4780 100644 --- a/hb_server/apps/wf/models.py +++ b/hb_server/apps/wf/models.py @@ -68,7 +68,7 @@ class State(CommonAModel): STATE_FIELD_READONLY= 1 # 字段只读 STATE_FIELD_REQUIRED = 2 # 字段必填 STATE_FIELD_OPTIONAL = 3 # 字段可选 - + STATE_FIELD_HIDDEN = 4 # 字段隐藏 state_filter_choices=( (0, '无'), (1, '和工单同属一及上级部门'), @@ -83,7 +83,7 @@ class State(CommonAModel): enable_retreat = models.BooleanField('允许撤回', default=False, help_text='开启后允许工单创建人在此状态直接撤回工单到初始状态') participant_type = models.IntegerField('参与者类型', choices=state_participanttype_choices, default=1, blank=True, help_text='0.无处理人,1.个人,2.多人,3.部门,4.角色,5.变量(支持工单创建人,创建人的leader),6.脚本,7.工单的字段内容(如表单中的"测试负责人",需要为用户名或者逗号隔开的多个用户名),8.父工单的字段内容。 初始状态请选择类型5,参与人填create_by') participant = models.JSONField('参与者', default=list, blank=True, help_text='可以为空(无处理人的情况,如结束状态)、userid、userid列表\部门id\角色id\变量(create_by,create_by_tl)\脚本记录的id等,包含子工作流的需要设置处理人为loonrobot') - state_fields = models.JSONField('表单字段', default=dict, help_text='json格式字典存储,包括读写属性1:只读,2:必填,3:可选. 示例:{"create_time":1,"title":2, "sn":1}, 内置特殊字段participant_info.participant_name:当前处理人信息(部门名称、角色名称),state.state_name:当前状态的状态名,workflow.workflow_name:工作流名称') # json格式存储,包括读写属性1:只读,2:必填,3:可选,4:不显示, 字典的字典 + state_fields = models.JSONField('表单字段', default=dict, help_text='json格式字典存储,包括读写属性1:只读,2:必填,3:可选, 4:隐藏 示例:{"create_time":1,"title":2, "sn":1}, 内置特殊字段participant_info.participant_name:当前处理人信息(部门名称、角色名称),state.state_name:当前状态的状态名,workflow.workflow_name:工作流名称') # json格式存储,包括读写属性1:只读,2:必填,3:可选,4:不显示, 字典的字典 distribute_type = models.IntegerField('分配方式', default=1, choices=state_distribute_choices, help_text='1.主动接单(如果当前处理人实际为多人的时候,需要先接单才能处理) 2.直接处理(即使当前处理人实际为多人,也可以直接处理) 3.随机分配(如果实际为多人,则系统会随机分配给其中一个人) 4.全部处理(要求所有参与人都要处理一遍,才能进入下一步)') filter_policy = models.IntegerField('参与人过滤策略', default=0, choices=state_filter_choices) participant_cc = models.JSONField('抄送给', default=list, blank=True, help_text='抄送给(userid列表)') diff --git a/hb_server/apps/wf/views.py b/hb_server/apps/wf/views.py index 22da7aa..b06d384 100644 --- a/hb_server/apps/wf/views.py +++ b/hb_server/apps/wf/views.py @@ -77,6 +77,11 @@ class WorkflowViewSet(CreateUpdateModelAMixin, ModelViewSet): ret['workflow'] = pk ret['transitions'] = TransitionSerializer(instance=transitions, many=True).data field_list = CustomFieldSerializer(instance=WfService.get_workflow_custom_fields(wf), many=True).data + for i in field_list: + if i['field_key'] in start_state.state_fields: + i['field_attribute'] = start_state.state_fields[i['field_key']] + else: + i['field_attribute'] = State.STATE_FIELD_READONLY ret['field_list'] = field_list return Response(ret) @@ -150,11 +155,16 @@ class TicketViewSet(OptimizationMixin, CreateUpdateCustomMixin, CreateModelMixin raise APIException('字段{}必填'.format(key)) save_ticket_data = {} # 只保存必填项以及可选项 - for key, vlaue in ticket_data: + for key, value in ticket_data.items(): if key in field_key_list and key in start_state.state_fields and start_state.state_fields[key] in [ State.STATE_FIELD_REQUIRED, State.STATE_FIELD_OPTIONAL]: save_ticket_data[key] = value - ticket = serializer.save(state=start_state, create_by=request.user, act_state=Ticket.TICKET_ACT_STATE_DRAFT, belong_dept=request.user.dept) # 先创建出来 + + ticket = serializer.save(state=start_state, + create_by=request.user, + act_state=Ticket.TICKET_ACT_STATE_DRAFT, + belong_dept=request.user.dept, + ticket_data=save_ticket_data) # 先创建出来 next_state = WfService.get_next_state_by_transition_and_ticket_info(ticket=ticket, transition=transition) participant_info = WfService.get_ticket_state_participant_info(state=next_state, ticket=ticket, ticket_data=ticket.ticket_data) From 67d74bcf3eaf8b90d134b0baf54987fde839e8d6 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 16 Dec 2021 15:55:39 +0800 Subject: [PATCH 15/23] =?UTF-8?q?=E6=A3=80=E9=AA=8C=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E6=8F=90=E4=BA=A4bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/qm/views.py | 2 ++ hb_server/apps/wf/services.py | 2 +- hb_server/apps/wf/views.py | 6 ++++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/hb_server/apps/qm/views.py b/hb_server/apps/qm/views.py index 2a11f72..717cd5b 100644 --- a/hb_server/apps/qm/views.py +++ b/hb_server/apps/qm/views.py @@ -87,6 +87,8 @@ class TestRecordViewSet(ListModelMixin, UpdateModelMixin, RetrieveModelMixin, De if TestRecordItem.objects.filter(field_value__isnull=True, is_hidden=False, test_record=obj).exists(): raise exceptions.APIException('存在未填写项目') with transaction.atomic(): + obj.is_submited=True + obj.save() WpmServies.update_wproduct_by_test(obj, request.user) return Response() diff --git a/hb_server/apps/wf/services.py b/hb_server/apps/wf/services.py index 46ef6b8..17d9c63 100644 --- a/hb_server/apps/wf/services.py +++ b/hb_server/apps/wf/services.py @@ -59,7 +59,7 @@ class WfService(object): """ 获取工单字段key List """ - return CustomField.objects.filter(is_deleted=False, workflow=workflow).order_by('sort').values_list('field_key', flat=True) + return list(CustomField.objects.filter(is_deleted=False, workflow=workflow).order_by('sort').values_list('field_key', flat=True)) @classmethod def get_ticket_transitions(cls, ticket:Ticket): diff --git a/hb_server/apps/wf/views.py b/hb_server/apps/wf/views.py index b06d384..8ad571d 100644 --- a/hb_server/apps/wf/views.py +++ b/hb_server/apps/wf/views.py @@ -147,6 +147,7 @@ class TicketViewSet(OptimizationMixin, CreateUpdateCustomMixin, CreateModelMixin field_key_list = WfService.get_workflow_custom_fields_list(vdata['workflow']) transition = vdata['transition'] ticket_data = vdata['ticket_data'] + #校验必填项 if transition.field_require_check: for key, value in start_state.state_fields.items(): @@ -156,9 +157,14 @@ class TicketViewSet(OptimizationMixin, CreateUpdateCustomMixin, CreateModelMixin save_ticket_data = {} # 只保存必填项以及可选项 for key, value in ticket_data.items(): + if key in start_state.state_fields: + print(start_state.state_fields[key]) + if start_state.state_fields[key] in [State.STATE_FIELD_REQUIRED, State.STATE_FIELD_OPTIONAL]: + print(key, True) if key in field_key_list and key in start_state.state_fields and start_state.state_fields[key] in [ State.STATE_FIELD_REQUIRED, State.STATE_FIELD_OPTIONAL]: save_ticket_data[key] = value + print('1') ticket = serializer.save(state=start_state, create_by=request.user, From 7a9d18c5bea246ef8f1079dcadd0df304a2f6e54 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 16 Dec 2021 16:11:18 +0800 Subject: [PATCH 16/23] =?UTF-8?q?=E5=8F=AA=E6=9B=B4=E6=96=B0=E5=BF=85?= =?UTF-8?q?=E5=A1=AB=E5=92=8C=E5=8F=AF=E9=80=89=E7=9A=84=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/wf/views.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/hb_server/apps/wf/views.py b/hb_server/apps/wf/views.py index 8ad571d..4fa8a11 100644 --- a/hb_server/apps/wf/views.py +++ b/hb_server/apps/wf/views.py @@ -157,14 +157,9 @@ class TicketViewSet(OptimizationMixin, CreateUpdateCustomMixin, CreateModelMixin save_ticket_data = {} # 只保存必填项以及可选项 for key, value in ticket_data.items(): - if key in start_state.state_fields: - print(start_state.state_fields[key]) - if start_state.state_fields[key] in [State.STATE_FIELD_REQUIRED, State.STATE_FIELD_OPTIONAL]: - print(key, True) if key in field_key_list and key in start_state.state_fields and start_state.state_fields[key] in [ State.STATE_FIELD_REQUIRED, State.STATE_FIELD_OPTIONAL]: save_ticket_data[key] = value - print('1') ticket = serializer.save(state=start_state, create_by=request.user, @@ -237,6 +232,7 @@ class TicketViewSet(OptimizationMixin, CreateUpdateCustomMixin, CreateModelMixin raise APIException('工单不存在') data = request.data result = WfService.ticket_handle_permission_check(ticket, request.user) + field_key_list = WfService.get_workflow_custom_fields_list(ticket.workflow) source_state = ticket.state source_ticket_data = ticket.ticket_data if result.get('permission') is False: @@ -249,6 +245,7 @@ class TicketViewSet(OptimizationMixin, CreateUpdateCustomMixin, CreateModelMixin if value == State.STATE_FIELD_REQUIRED: if key not in ticket_data or not ticket_data[key]: raise APIException('字段{}必填'.format(key)) + destination_state = WfService.get_next_state_by_transition_and_ticket_info(ticket, transition, ticket_data, request) multi_all_person = ticket.multi_all_person if multi_all_person: @@ -290,7 +287,7 @@ class TicketViewSet(OptimizationMixin, CreateUpdateCustomMixin, CreateModelMixin ticket.act_state = Ticket.TICKET_ACT_STATE_BACK # 只更新必填和可选的字段 - for key, value in ticket.state.state_fields.items(): + for key, value in source_state.state_fields.items(): if value in (State.STATE_FIELD_REQUIRED, State.STATE_FIELD_OPTIONAL): source_ticket_data[key] = ticket_data[key] ticket.ticket_data = source_ticket_data From f6e14a49905f6bd5bd56b60892ee2080088944b6 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 16 Dec 2021 16:19:35 +0800 Subject: [PATCH 17/23] =?UTF-8?q?=E5=8F=AA=E6=9B=B4=E6=96=B0=E5=BF=85?= =?UTF-8?q?=E5=A1=AB=E5=92=8C=E5=8F=AF=E9=80=89=E7=9A=84=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/wf/views.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/hb_server/apps/wf/views.py b/hb_server/apps/wf/views.py index 4fa8a11..d9c586b 100644 --- a/hb_server/apps/wf/views.py +++ b/hb_server/apps/wf/views.py @@ -144,22 +144,19 @@ class TicketViewSet(OptimizationMixin, CreateUpdateCustomMixin, CreateModelMixin serializer.is_valid(raise_exception=True) vdata = serializer.validated_data #校验之后的数据 start_state = WfService.get_workflow_start_state(vdata['workflow']) - field_key_list = WfService.get_workflow_custom_fields_list(vdata['workflow']) transition = vdata['transition'] ticket_data = vdata['ticket_data'] + save_ticket_data = {} #校验必填项 if transition.field_require_check: for key, value in start_state.state_fields.items(): if value == State.STATE_FIELD_REQUIRED: if key not in ticket_data or not ticket_data[key]: raise APIException('字段{}必填'.format(key)) - save_ticket_data = {} - # 只保存必填项以及可选项 - for key, value in ticket_data.items(): - if key in field_key_list and key in start_state.state_fields and start_state.state_fields[key] in [ - State.STATE_FIELD_REQUIRED, State.STATE_FIELD_OPTIONAL]: - save_ticket_data[key] = value + save_ticket_data[key] = ticket_data[key] + elif value == State.STATE_FIELD_OPTIONAL: + save_ticket_data[key] = ticket_data[key] ticket = serializer.save(state=start_state, create_by=request.user, @@ -232,7 +229,6 @@ class TicketViewSet(OptimizationMixin, CreateUpdateCustomMixin, CreateModelMixin raise APIException('工单不存在') data = request.data result = WfService.ticket_handle_permission_check(ticket, request.user) - field_key_list = WfService.get_workflow_custom_fields_list(ticket.workflow) source_state = ticket.state source_ticket_data = ticket.ticket_data if result.get('permission') is False: From 1fad4b40ac7d06537be0d3efa73cb38c7105f8a1 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 16 Dec 2021 16:24:59 +0800 Subject: [PATCH 18/23] =?UTF-8?q?ori=20tri=E5=A2=9E=E5=8A=A0field=5Fchoice?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/qm/serializers.py | 1 + hb_server/apps/wpm/serializers.py | 1 + 2 files changed, 2 insertions(+) diff --git a/hb_server/apps/qm/serializers.py b/hb_server/apps/qm/serializers.py index d453937..e3340d6 100644 --- a/hb_server/apps/qm/serializers.py +++ b/hb_server/apps/qm/serializers.py @@ -52,6 +52,7 @@ class TestRecordItemSerializer(serializers.ModelSerializer): field_name = serializers.CharField(source='form_field.field_name', read_only=True) field_type = serializers.CharField(source='form_field.field_type', read_only=True) need_judge = serializers.BooleanField(source='form_field.need_judge', read_only=True) + field_choice = serializers.JSONField(source='form_field.fied_choice', read_only=True) rule_expression = serializers.JSONField(source='form_field.rule_expression', read_only=True) display_expression = serializers.JSONField(source='form_field.display_expression', read_only=True) is_hidden = serializers.BooleanField(source='form_field.is_hidden', read_only=True) diff --git a/hb_server/apps/wpm/serializers.py b/hb_server/apps/wpm/serializers.py index ea38496..c587359 100644 --- a/hb_server/apps/wpm/serializers.py +++ b/hb_server/apps/wpm/serializers.py @@ -396,6 +396,7 @@ class OperationRecordItemSerializer(serializers.ModelSerializer): field_key = serializers.CharField(source='form_field.field_key', read_only=True) field_name = serializers.CharField(source='form_field.field_name', read_only=True) field_type = serializers.CharField(source='form_field.field_type', read_only=True) + field_choice = serializers.JSONField(source='form_field.fied_choice', read_only=True) is_hidden = serializers.BooleanField(source='form_field.is_hidden', read_only=True) help_text = serializers.CharField(source='form_field.help_text', read_only=True) sort = serializers.IntegerField(source='form_field.sort', read_only=True) From c9f21d763c25dc7bbfd51e9efeb24ba24a2db381 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 16 Dec 2021 16:26:07 +0800 Subject: [PATCH 19/23] =?UTF-8?q?=E4=BF=AE=E6=94=B9bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/qm/serializers.py | 2 +- hb_server/apps/wpm/serializers.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/hb_server/apps/qm/serializers.py b/hb_server/apps/qm/serializers.py index e3340d6..b47a784 100644 --- a/hb_server/apps/qm/serializers.py +++ b/hb_server/apps/qm/serializers.py @@ -52,7 +52,7 @@ class TestRecordItemSerializer(serializers.ModelSerializer): field_name = serializers.CharField(source='form_field.field_name', read_only=True) field_type = serializers.CharField(source='form_field.field_type', read_only=True) need_judge = serializers.BooleanField(source='form_field.need_judge', read_only=True) - field_choice = serializers.JSONField(source='form_field.fied_choice', read_only=True) + field_choice = serializers.JSONField(source='form_field.field_choice', read_only=True) rule_expression = serializers.JSONField(source='form_field.rule_expression', read_only=True) display_expression = serializers.JSONField(source='form_field.display_expression', read_only=True) is_hidden = serializers.BooleanField(source='form_field.is_hidden', read_only=True) diff --git a/hb_server/apps/wpm/serializers.py b/hb_server/apps/wpm/serializers.py index c587359..dfc3102 100644 --- a/hb_server/apps/wpm/serializers.py +++ b/hb_server/apps/wpm/serializers.py @@ -396,7 +396,7 @@ class OperationRecordItemSerializer(serializers.ModelSerializer): field_key = serializers.CharField(source='form_field.field_key', read_only=True) field_name = serializers.CharField(source='form_field.field_name', read_only=True) field_type = serializers.CharField(source='form_field.field_type', read_only=True) - field_choice = serializers.JSONField(source='form_field.fied_choice', read_only=True) + field_choice = serializers.JSONField(source='form_field.field_choice', read_only=True) is_hidden = serializers.BooleanField(source='form_field.is_hidden', read_only=True) help_text = serializers.CharField(source='form_field.help_text', read_only=True) sort = serializers.IntegerField(source='form_field.sort', read_only=True) From e129f7e30651ebd25a0567bf37ad3dcb683a52a9 Mon Sep 17 00:00:00 2001 From: shilixia <2309368887@qq.com> Date: Thu, 16 Dec 2021 16:28:11 +0800 Subject: [PATCH 20/23] xiugai --- hb_client/src/api/sam.js | 6 + hb_client/src/router/index.js | 22 +++- hb_client/src/views/em/detection.vue | 7 +- hb_client/src/views/em/equipment.vue | 5 +- hb_client/src/views/em/record.vue | 6 +- hb_client/src/views/inm/fifo.vue | 10 +- hb_client/src/views/inm/fifodetail.vue | 1 + hb_client/src/views/inm/inventory.vue | 5 +- hb_client/src/views/inm/materialbatch.vue | 8 +- hb_client/src/views/inm/product.vue | 8 +- hb_client/src/views/inm/warehouse.vue | 10 +- hb_client/src/views/inm/wproduct.vue | 8 +- hb_client/src/views/mtm/material.vue | 6 +- hb_client/src/views/mtm/materialDetail.vue | 1 + hb_client/src/views/mtm/materialdo.vue | 1 + hb_client/src/views/mtm/process.vue | 1 + hb_client/src/views/mtm/productprocess.vue | 24 ++-- hb_client/src/views/mtm/step.vue | 4 + hb_client/src/views/pm/plan.vue | 16 ++- hb_client/src/views/pm/resources.vue | 6 +- hb_client/src/views/pm/work.vue | 4 +- hb_client/src/views/qm/product.vue | 6 +- hb_client/src/views/sam/contract.vue | 25 +++- hb_client/src/views/sam/contractdetail.vue | 129 +++++++++++++++++++++ hb_client/src/views/sam/customer.vue | 5 +- hb_client/src/views/sam/order.vue | 21 +++- hb_client/src/views/sam/orderdetail.vue | 127 ++++++++++++++++++++ hb_client/src/views/sam/review.vue | 6 +- hb_client/src/views/sam/sales.vue | 10 +- hb_client/src/views/wpm/need.vue | 3 +- hb_client/src/views/wpm/operation.vue | 4 +- hb_client/src/views/wpm/operationdo.vue | 3 + hb_client/src/views/wpm/worktask.vue | 4 +- 33 files changed, 430 insertions(+), 72 deletions(-) create mode 100644 hb_client/src/views/sam/contractdetail.vue create mode 100644 hb_client/src/views/sam/orderdetail.vue diff --git a/hb_client/src/api/sam.js b/hb_client/src/api/sam.js index 037a628..540441f 100644 --- a/hb_client/src/api/sam.js +++ b/hb_client/src/api/sam.js @@ -36,6 +36,12 @@ export function getContractList(query) { params: query }) } +export function getContract(id) { + return request({ + url: `/sam/contract/${id}/`, + method: 'get' + }) +} export function createContract(data) { return request({ url: '/sam/contract/', diff --git a/hb_client/src/router/index.js b/hb_client/src/router/index.js index 321c51f..f5f751f 100644 --- a/hb_client/src/router/index.js +++ b/hb_client/src/router/index.js @@ -276,13 +276,21 @@ export const asyncRoutes = [ path: 'customer', name: 'customer', component: () => import('@/views/sam/customer'), - meta: { title: '客户信息', icon: 'example', perms: ['index_manage'] } + meta: { title: '客户管理', icon: 'example', perms: ['index_manage'] } }, { path: 'contract', name: 'contract', component: () => import('@/views/sam/contract'), - meta: { title: '合同信息', icon: 'example', perms: ['index_manage'] } + meta: { title: '合同管理', icon: 'example', perms: ['index_manage'] } + } + , + { + path: 'contractdetail/:id', + name: 'contractdetail', + component: () => import('@/views/sam/contractdetail'), + meta: { title: '合同详情', perms: ['vendor_manage'] }, + hidden: true } , @@ -290,9 +298,17 @@ export const asyncRoutes = [ path: 'order', name: 'order', component: () => import('@/views/sam/order'), - meta: { title: '订单信息', icon: 'example', perms: ['index_manage'] } + meta: { title: '订单管理', icon: 'example', perms: ['index_manage'] } } + , + { + path: 'orderdetail/:id', + name: 'orderdetail', + component: () => import('@/views/sam/orderdetail'), + meta: { title: '订单详情', perms: ['vendor_manage'] }, + hidden: true + }, { path: 'sales', name: 'sales', diff --git a/hb_client/src/views/em/detection.vue b/hb_client/src/views/em/detection.vue index 2f5461f..4091991 100644 --- a/hb_client/src/views/em/detection.vue +++ b/hb_client/src/views/em/detection.vue @@ -29,7 +29,7 @@ - + @@ -104,6 +104,7 @@ 编辑 diff --git a/hb_client/src/views/em/equipment.vue b/hb_client/src/views/em/equipment.vue index 6346164..2138828 100644 --- a/hb_client/src/views/em/equipment.vue +++ b/hb_client/src/views/em/equipment.vue @@ -29,7 +29,7 @@ - + @@ -113,6 +113,7 @@ 编辑 diff --git a/hb_client/src/views/em/record.vue b/hb_client/src/views/em/record.vue index bf1999e..afc20ef 100644 --- a/hb_client/src/views/em/record.vue +++ b/hb_client/src/views/em/record.vue @@ -29,7 +29,7 @@ - + @@ -72,6 +73,7 @@ 编辑 diff --git a/hb_client/src/views/inm/fifo.vue b/hb_client/src/views/inm/fifo.vue index b0e0a92..1225521 100644 --- a/hb_client/src/views/inm/fifo.vue +++ b/hb_client/src/views/inm/fifo.vue @@ -28,7 +28,7 @@ > - + @@ -70,11 +70,13 @@