From ad1d0680b116b75f089899634ba1774f8cdeb443 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 13 Aug 2024 15:06:07 +0800 Subject: [PATCH 1/7] =?UTF-8?q?feat:=20mlogbupdate=20=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wpm/serializers.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/apps/wpm/serializers.py b/apps/wpm/serializers.py index 089fff16..faee3cfb 100644 --- a/apps/wpm/serializers.py +++ b/apps/wpm/serializers.py @@ -417,9 +417,20 @@ class MlogbInUpdateSerializer(CustomModelSerializer): class MlogbOutUpdateSerializer(CustomModelSerializer): class Meta: model = Mlogb - fields = ['id', 'batch', 'count_real', 'count_ok', 'count_notok', - 'count_n_hs', 'count_n_qp', 'count_n_swen', 'count_n_bb', - 'count_n_wm', 'count_n_md', 'count_n_xh'] + fields = "__all__" + read_only_fields = EXCLUDE_FIELDS_BASE + ['mlog', 'mtask', 'wm_in', 'material_in', 'material_out', 'count_use', 'count_break'] + + def validate(self, attrs): + count_notok = 0 + for i in attrs: + if 'count_n_' in i: + count_notok = count_notok + attrs[i] + attrs['count_notok'] = count_notok + if attrs['count_real'] >= attrs['count_ok'] + attrs['count_notok']: + pass + else: + raise ValidationError('生产数量不能小于合格数量') + return attrs class MlogRevertSerializer(serializers.Serializer): change_reason = serializers.CharField(label='撤回原因') From cc5dcc9685b1d30d076aaca60c82bcd99045981a Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 13 Aug 2024 16:29:59 +0800 Subject: [PATCH 2/7] fix: gen_material_out bug --- apps/mtm/serializers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/mtm/serializers.py b/apps/mtm/serializers.py index 608756ab..e63b3bab 100644 --- a/apps/mtm/serializers.py +++ b/apps/mtm/serializers.py @@ -207,7 +207,7 @@ class RouteSerializer(CustomModelSerializer): 'specification': material.specification, 'model': material.model, 'type': Material.MA_TYPE_HALFGOOD, - 'cate': Material.cate, + 'cate': material.cate, 'create_by': self.request.user, 'update_by': self.request.user, }) From 3bb3834c04c5cb125d11c8205307f614e91a894b Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 13 Aug 2024 17:11:22 +0800 Subject: [PATCH 3/7] fix: miolist pu_order_number --- apps/inm/serializers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/inm/serializers.py b/apps/inm/serializers.py index 1ea7604e..760fe0b0 100644 --- a/apps/inm/serializers.py +++ b/apps/inm/serializers.py @@ -72,7 +72,7 @@ class MIOListSerializer(CustomModelSerializer): source='customer.name', read_only=True) order_number = serializers.CharField(source='order.number', read_only=True) pu_order_number = serializers.CharField( - source='pu_order.name', read_only=True) + source='pu_order.number', read_only=True) class Meta: model = MIO From 27c60ff9735fc6fef1d040813005821544027a57 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 13 Aug 2024 17:28:39 +0800 Subject: [PATCH 4/7] =?UTF-8?q?feat:=20mio=20pur=20test=20=E6=94=AF?= =?UTF-8?q?=E6=8C=81count=5Fsampling=E8=87=AA=E5=A1=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/inm/serializers.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/apps/inm/serializers.py b/apps/inm/serializers.py index 760fe0b0..3d97cacc 100644 --- a/apps/inm/serializers.py +++ b/apps/inm/serializers.py @@ -284,14 +284,17 @@ class MIOItemPurInTestSerializer(CustomModelSerializer): class Meta: model = MIOItem fields = ['id', 'test_date', 'test_user', - 'count_bag', 'weight_kgs', 'is_testok', 'test_note'] + 'count_bag', 'count_sampling' 'weight_kgs', 'is_testok', 'test_note'] extra_kwargs = { 'test_date': {'required': True}, 'test_user': {'required': True} } def validate(self, attrs): - weight_kgs = attrs['weight_kgs'] - attrs['weight_kgs'] = [float(i) for i in weight_kgs] - attrs['count_sampling'] = len(attrs['weight_kgs']) + if 'count_sampling' in attrs and attrs['count_sampling']: + pass + else: + weight_kgs = attrs['weight_kgs'] + attrs['weight_kgs'] = [float(i) for i in weight_kgs] + attrs['count_sampling'] = len(attrs['weight_kgs']) return super().validate(attrs) From a9acf6d1877093038fc375753e83b257ee80593c Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 14 Aug 2024 17:42:27 +0800 Subject: [PATCH 5/7] =?UTF-8?q?feat:=20=E7=89=A9=E6=96=99=E5=AF=BC?= =?UTF-8?q?=E5=85=A5=E6=A8=A1=E6=9D=BF=E5=A2=9E=E5=8A=A0=E7=BC=96=E5=8F=B7?= =?UTF-8?q?=E5=88=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/mtm/services.py | 27 +++++++++++++++------------ media/default/template/material.xlsx | Bin 9748 -> 9780 bytes 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/apps/mtm/services.py b/apps/mtm/services.py index 424f326e..3813a6ad 100644 --- a/apps/mtm/services.py +++ b/apps/mtm/services.py @@ -63,26 +63,29 @@ def daoru_material(path: str): from apps.utils.snowflake import idWorker from openpyxl import load_workbook wb = load_workbook(path) - sheet = wb.get_sheet_by_name('物料') + sheet = wb['物料'] process_l = Process.objects.all() process_d = {p.name: p for p in process_l} i = 3 - while sheet[f'a{i}'].value is not None: - type_str = sheet[f'a{i}'].value.replace(' ', '') + if sheet['a2'].value != '物料编号': + raise ParseError('列错误导入失败') + while sheet[f'b{i}'].value is not None: + type_str = sheet[f'b{i}'].value.replace(' ', '') try: type = type_dict[type_str] - name = sheet[f'b{i}'].value.replace(' ', '') - specification = sheet[f'c{i}'].value.replace( + number = sheet[f'a{i}'].value.replace(' ', '') + name = sheet[f'c{i}'].value.replace(' ', '') + specification = sheet[f'd{i}'].value.replace( '×', '*').replace(' ', '') - model = sheet[f'd{i}'].value.replace(' ', '') - unit = sheet[f'e{i}'].value.replace(' ', '') - count_safe = sheet[f'g{i}'].value - unit_price = sheet[f'h{i}'].value + model = sheet[f'e{i}'].value.replace(' ', '') + unit = sheet[f'f{i}'].value.replace(' ', '') + count_safe = sheet[f'h{i}'].value + unit_price = sheet[f'i{i}'].value except Exception as e: raise ParseError(f'{i}行物料信息错误: {str(e)}') if type in [20, 30]: try: - process = process_d[sheet[f'f{i}'].value.replace(' ', '')] + process = process_d[sheet[f'g{i}'].value.replace(' ', '')] except Exception as e: raise ParseError(f'{i}行物料信息错误: {str(e)}') try: @@ -91,7 +94,7 @@ def daoru_material(path: str): if type in [20, 30]: filters['process'] = process default = {'type': type, 'name': name, 'specification': specification, - 'model': model, 'unit': unit, 'number': f'm{type}_{ranstr(6)}', 'id': idWorker.get_id(), + 'model': model, 'unit': unit, 'number': number if number else f'm{type}_{ranstr(6)}', 'id': idWorker.get_id(), 'count_safe': count_safe, 'unit_price': unit_price} material, is_created = Material.objects.get_or_create( **filters, defaults=default) @@ -101,7 +104,7 @@ def daoru_material(path: str): except Exception as e: raise ParseError(f'{i}行物料有误, 导入失败--{e}') i = i + 1 - print(type, name, specification, model, unit, '导入成功') + print(number, type, name, specification, model, unit, '导入成功') def mgroup_run_change(mgroup: Mgroup, new_run: bool, last_timex: datetime): diff --git a/media/default/template/material.xlsx b/media/default/template/material.xlsx index 19a678a33739900ffdc7e4ec7e9b5b4d8f640c1d..db0a83ff482c965703913cfb8c8b03832155e0ce 100644 GIT binary patch delta 3285 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 delta 3258 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 Date: Wed, 14 Aug 2024 18:07:12 +0800 Subject: [PATCH 6/7] =?UTF-8?q?feat:=20ftestwork=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=A3=80=E9=AA=8C=E4=BA=BA=E5=8F=8A=E4=B8=8D=E5=90=88=E6=A0=BC?= =?UTF-8?q?=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/qm/migrations/0020_auto_20240814_1756.py | 31 +++++++++++++++++++ apps/qm/models.py | 14 ++++++--- apps/qm/serializers.py | 6 +++- 3 files changed, 46 insertions(+), 5 deletions(-) create mode 100644 apps/qm/migrations/0020_auto_20240814_1756.py diff --git a/apps/qm/migrations/0020_auto_20240814_1756.py b/apps/qm/migrations/0020_auto_20240814_1756.py new file mode 100644 index 00000000..d0cfd32b --- /dev/null +++ b/apps/qm/migrations/0020_auto_20240814_1756.py @@ -0,0 +1,31 @@ +# Generated by Django 3.2.12 on 2024-08-14 09:56 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('qm', '0019_alter_ftestwork_batch'), + ] + + operations = [ + migrations.AddField( + model_name='ftestwork', + name='test_user', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ftestwork_test_user', to=settings.AUTH_USER_MODEL, verbose_name='操作人'), + ), + migrations.AlterField( + model_name='ftest', + name='type', + field=models.CharField(choices=[('first', '首件检验'), ('process', '过程检验'), ('prod', '成品检验')], max_length=20, verbose_name='检验类型'), + ), + migrations.AlterField( + model_name='ftestwork', + name='type', + field=models.CharField(choices=[('first', '首件检验'), ('process', '过程检验'), ('prod', '成品检验')], default='prod', max_length=20, verbose_name='检验类型'), + ), + ] diff --git a/apps/qm/models.py b/apps/qm/models.py index 7c016672..55437375 100644 --- a/apps/qm/models.py +++ b/apps/qm/models.py @@ -47,15 +47,19 @@ class NotOkOption(models.TextChoices): hqnjyd = "hqnjyd", _("黑圈内径圆度") hqwj = "hqwj", _("黑圈外径") hqwjyd = "hqwjyd", _("黑圈外径圆度") - wj = "wj", _("外径") - yd = "yd", _("圆度") - txd = "txd", _("同心度") - hd = "hd", _("厚度") + wj = "wj", _("外径不良") + yd = "yd", _("圆度不良") + txd = "txd", _("同心度不良") + hd = "hd", _("厚度不良") + z = "z", _("脏") + zhg = "zhg", _("准合格") + yz = "yz", _("圆准") qt = "qt", _("其它") FTEST_TYPE_CHOICES = ( ('first', '首件检验'), + ('process', '过程检验'), ('prod', '成品检验') ) class TestItem(CommonAModel): @@ -113,6 +117,8 @@ class FtestWork(CommonBDModel): count_ok = models.IntegerField('合格数量', default=0) count_notok = models.IntegerField('不合格数量', default=0) count_notok_json = models.JSONField('不合格项数量统计', default=dict, null=False, blank=True) + test_user = models.ForeignKey( + User, verbose_name='操作人', on_delete=models.CASCADE, related_name='ftestwork_test_user', null=True, blank=True) submit_time = models.DateTimeField('提交时间', null=True, blank=True) submit_user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='提交人', null=True, blank=True) diff --git a/apps/qm/serializers.py b/apps/qm/serializers.py index 4dfa3bff..7f0c39a3 100644 --- a/apps/qm/serializers.py +++ b/apps/qm/serializers.py @@ -62,7 +62,8 @@ class QuaStatUpdateSerializer(CustomModelSerializer): class FtestWorkCreateUpdateSerializer(CustomModelSerializer): class Meta: model = FtestWork - fields = ['id', 'wm', 'type', 'type2', 'test_date', 'count', 'count_sampling', 'count_ok', 'count_notok', 'count_notok_json'] + fields = ['id', 'wm', 'type', 'type2', 'test_date', 'count', 'count_sampling', 'count_ok', 'count_notok', 'count_notok_json', 'test_user'] + extra_kwargs = {'test_user': {'required': True}, 'type': {'required': True}} def validate(self, attrs): type2 = attrs.get('type2', 20) @@ -126,7 +127,10 @@ class FtestSerializer(CustomModelSerializer): def validate(self, attrs): ftest_work: FtestWork = attrs.get('ftest_work', None) if ftest_work: + test_user = attrs.get('test_user', None) attrs['type'] = ftest_work.type + if test_user is None: + attrs['test_user'] = ftest_work.test_user return attrs def create(self, validated_data): From 42769e3abe257923663724b324ec4c291b852a19 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 14 Aug 2024 18:17:31 +0800 Subject: [PATCH 7/7] fix: mioitempurin bug --- apps/inm/serializers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/inm/serializers.py b/apps/inm/serializers.py index 3d97cacc..9f497659 100644 --- a/apps/inm/serializers.py +++ b/apps/inm/serializers.py @@ -284,7 +284,7 @@ class MIOItemPurInTestSerializer(CustomModelSerializer): class Meta: model = MIOItem fields = ['id', 'test_date', 'test_user', - 'count_bag', 'count_sampling' 'weight_kgs', 'is_testok', 'test_note'] + 'count_bag', 'count_sampling', 'weight_kgs', 'is_testok', 'test_note'] extra_kwargs = { 'test_date': {'required': True}, 'test_user': {'required': True}