From b2abf0128a10142887539d4b6ff1610f1a1fd360 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 6 Aug 2024 12:21:08 +0800 Subject: [PATCH 1/7] =?UTF-8?q?feat:=20pum=20sam=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=A3=80=E7=B4=A2=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/pum/views.py | 2 +- .../migrations/0008_alter_orderitem_order.py | 19 +++++++++++++++++++ apps/sam/models.py | 2 +- apps/sam/views.py | 3 ++- 4 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 apps/sam/migrations/0008_alter_orderitem_order.py diff --git a/apps/pum/views.py b/apps/pum/views.py index aaed4d24..fc07a65f 100644 --- a/apps/pum/views.py +++ b/apps/pum/views.py @@ -98,7 +98,7 @@ class PuOrderViewSet(CustomModelViewSet): queryset = PuOrder.objects.all() serializer_class = PuOrderSerializer filterset_class = PuOrderFilter - search_fields = ['number', 'supplier__name'] + search_fields = ['number', 'supplier__name', 'item_puorder__material__name', 'item_puorder__material__specification', 'item_puorder__material__model'] select_related_fields = ['create_by', 'update_by', 'supplier'] @transaction.atomic diff --git a/apps/sam/migrations/0008_alter_orderitem_order.py b/apps/sam/migrations/0008_alter_orderitem_order.py new file mode 100644 index 00000000..c69380f3 --- /dev/null +++ b/apps/sam/migrations/0008_alter_orderitem_order.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.12 on 2024-08-06 04:18 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('sam', '0007_alter_orderitem_material'), + ] + + operations = [ + migrations.AlterField( + model_name='orderitem', + name='order', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='item_order', to='sam.order', verbose_name='关联订单'), + ), + ] diff --git a/apps/sam/models.py b/apps/sam/models.py index 5b6f6fe1..0a7920fb 100644 --- a/apps/sam/models.py +++ b/apps/sam/models.py @@ -80,7 +80,7 @@ class OrderItem(BaseModel): 订单明细 """ order = models.ForeignKey( - Order, verbose_name='关联订单', on_delete=models.CASCADE) + Order, verbose_name='关联订单', on_delete=models.CASCADE, related_name='item_order') material = models.ForeignKey( Material, verbose_name='所需产品', on_delete=models.CASCADE, related_name='orderitem_material') count = models.PositiveIntegerField('所需数量', default=1) diff --git a/apps/sam/views.py b/apps/sam/views.py index 5744f0f1..07658ecd 100644 --- a/apps/sam/views.py +++ b/apps/sam/views.py @@ -57,7 +57,8 @@ class OrderViewSet(CustomModelViewSet): queryset = Order.objects.all() serializer_class = OrderSerializer select_related_fields = ['contract', 'customer'] - search_fields = ['number'] + search_fields = ['number', 'contract__name', 'contract__number', 'customer__name', 'orderitem_order__material__name', + 'orderitem_order__material__specification', 'orderitem_order__material__model'] filterset_fields = { "contract": ["exact"], "customer": ["exact"], From b8dceb03a32778409c90ec67261bf95f7ca2bec3 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 7 Aug 2024 09:46:17 +0800 Subject: [PATCH 2/7] =?UTF-8?q?feat:=20qm=E6=B7=BB=E5=8A=A0=E5=AD=97?= =?UTF-8?q?=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/qm/migrations/0016_auto_20240807_0945.py | 58 +++++++++++++++++++ apps/qm/models.py | 25 +++++--- apps/qm/serializers.py | 4 +- apps/qm/views.py | 1 + 4 files changed, 77 insertions(+), 11 deletions(-) create mode 100644 apps/qm/migrations/0016_auto_20240807_0945.py diff --git a/apps/qm/migrations/0016_auto_20240807_0945.py b/apps/qm/migrations/0016_auto_20240807_0945.py new file mode 100644 index 00000000..d5511a71 --- /dev/null +++ b/apps/qm/migrations/0016_auto_20240807_0945.py @@ -0,0 +1,58 @@ +# Generated by Django 3.2.12 on 2024-08-07 01:45 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('qm', '0015_ftestwork_count_ok'), + ] + + operations = [ + migrations.AddField( + model_name='ftestitem', + name='check_val_json', + field=models.JSONField(blank=True, null=True, verbose_name='专检测量值'), + ), + migrations.AddField( + model_name='ftestitem', + name='test_val_json', + field=models.JSONField(blank=True, null=True, verbose_name='测量值'), + ), + migrations.AddField( + model_name='ftestwork', + name='count_notok', + field=models.IntegerField(default=0, verbose_name='不合格数量'), + ), + migrations.AddField( + model_name='ftestwork', + name='type', + field=models.CharField(choices=[('first', '首件检验'), ('prod', '成品检验')], default='prod', max_length=20, verbose_name='检验类型'), + ), + migrations.AddField( + model_name='testitem', + name='choices', + field=models.JSONField(blank=True, default=list, verbose_name='选项'), + ), + migrations.AddField( + model_name='testitem', + name='field_type', + field=models.CharField(choices=[('input-number', '数字输入'), ('input-text', '文本输入'), ('select', '单选'), ('selects', '多选')], default='float', max_length=20, verbose_name='字段类型'), + ), + migrations.AddField( + model_name='testitem', + name='mcate_tags', + field=models.JSONField(blank=True, default=list, verbose_name='物料系列标签'), + ), + migrations.AlterField( + model_name='ftestitem', + name='test_val', + field=models.FloatField(blank=True, null=True, verbose_name='测量值'), + ), + migrations.AlterField( + model_name='testitem', + name='tags', + field=models.JSONField(blank=True, default=list, verbose_name='检测类型'), + ), + ] diff --git a/apps/qm/models.py b/apps/qm/models.py index a9db0077..7338e5d3 100644 --- a/apps/qm/models.py +++ b/apps/qm/models.py @@ -5,21 +5,28 @@ from apps.mtm.models import Material, Mgroup, Team from apps.wpm.models import SfLog +FTEST_TYPE_CHOICES = ( + ('first', '首件检验'), + ('prod', '成品检验') +) class TestItem(CommonAModel): """ - 检验项目 + 检测项目 """ name = models.CharField('名称', max_length=100) + field_type = models.CharField('字段类型', max_length=20, default='float', choices=( + ('input-number', '数字输入'), ('input-text', '文本输入'), ('select', '单选'), ('selects', '多选') + )) number = models.CharField('编号', max_length=20, default='', blank=True) - tags = models.JSONField('标签', default=list, blank=True) + choices = models.JSONField('选项', default=list, blank=True) + tags = models.JSONField('检测类型', default=list, blank=True) + mcate_tags = models.JSONField('物料系列标签', default=list, blank=True) sort = models.PositiveSmallIntegerField('排序', default=1) description = models.TextField('描述', default='') class Meta: ordering = ['sort', '-create_time'] -# Create your models here. - class QuaStat(CommonBDModel): """ @@ -41,6 +48,7 @@ class FtestWork(CommonBDModel): """ 检验工作 """ + type = models.CharField('检验类型', max_length=20, choices=FTEST_TYPE_CHOICES, default='prod') test_date = models.DateField('检验日期') material = models.ForeignKey( Material, verbose_name='产品', on_delete=models.CASCADE) @@ -48,16 +56,13 @@ class FtestWork(CommonBDModel): count = models.IntegerField('总数量') count_sampling = models.IntegerField('抽检数量', default=0) count_ok = models.IntegerField('合格数量', default=0) + count_notok = models.IntegerField('不合格数量', default=0) class Ftest(CommonBDModel): """ 检验记录 """ - FTEST_TYPE_CHOICES = ( - ('first', '首件检验'), - ('prod', '成品检验') - ) type = models.CharField('检验类型', max_length=20, choices=FTEST_TYPE_CHOICES) test_date = models.DateField('检验日期') test_numer = models.CharField('检测编号', max_length=20, default='') @@ -85,8 +90,10 @@ class FtestItem(BaseModel): Ftest, verbose_name='关联检验', on_delete=models.CASCADE) testitem = models.ForeignKey( TestItem, verbose_name='质检项目', on_delete=models.CASCADE) - test_val = models.FloatField('测量值', default=0, blank=True) + test_val = models.FloatField('测量值', null=True, blank=True) check_val = models.FloatField('专检测量值', null=True, blank=True) + test_val_json = models.JSONField('测量值', null=True, blank=True) + check_val_json = models.JSONField('专检测量值', null=True, blank=True) class Ptest(CommonAModel): diff --git a/apps/qm/serializers.py b/apps/qm/serializers.py index 0c0446b7..f173d952 100644 --- a/apps/qm/serializers.py +++ b/apps/qm/serializers.py @@ -97,9 +97,9 @@ class FtestSerializer(CustomModelSerializer): read_only_fields = EXCLUDE_FIELDS def validate(self, attrs): - ftest_work = attrs.get('ftest_work', None) + ftest_work: FtestWork = attrs.get('ftest_work', None) if ftest_work: - attrs['type'] = 'prod' # 带检验工作的标记为成品检验 + attrs['type'] = ftest_work.type return attrs def create(self, validated_data): diff --git a/apps/qm/views.py b/apps/qm/views.py index 6b976d86..a5c22119 100644 --- a/apps/qm/views.py +++ b/apps/qm/views.py @@ -25,6 +25,7 @@ class TestItemViewSet(CustomModelViewSet): queryset = TestItem.objects.all() serializer_class = TestItemSerializer filterset_class = TestItemFilter + search_fields = ['tags', 'name', 'number'] ordering = ['id'] From 239f01a4cad56b5429e8e389d3300b915dec055e Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 7 Aug 2024 10:01:22 +0800 Subject: [PATCH 3/7] =?UTF-8?q?feat:=20qm=E6=B7=BB=E5=8A=A0=E5=AD=97?= =?UTF-8?q?=E6=AE=B52?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...16_auto_20240807_0945.py => 0016_auto_20240807_0958.py} | 7 ++++++- apps/qm/models.py | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) rename apps/qm/migrations/{0016_auto_20240807_0945.py => 0016_auto_20240807_0958.py} (88%) diff --git a/apps/qm/migrations/0016_auto_20240807_0945.py b/apps/qm/migrations/0016_auto_20240807_0958.py similarity index 88% rename from apps/qm/migrations/0016_auto_20240807_0945.py rename to apps/qm/migrations/0016_auto_20240807_0958.py index d5511a71..beca675e 100644 --- a/apps/qm/migrations/0016_auto_20240807_0945.py +++ b/apps/qm/migrations/0016_auto_20240807_0958.py @@ -1,4 +1,4 @@ -# Generated by Django 3.2.12 on 2024-08-07 01:45 +# Generated by Django 3.2.12 on 2024-08-07 01:58 from django.db import migrations, models @@ -30,6 +30,11 @@ class Migration(migrations.Migration): name='type', field=models.CharField(choices=[('first', '首件检验'), ('prod', '成品检验')], default='prod', max_length=20, verbose_name='检验类型'), ), + migrations.AddField( + model_name='ftestwork', + name='type2', + field=models.PositiveSmallIntegerField(choices=[(10, '抽检'), (20, '全检')], default=10, verbose_name='检验类型2'), + ), migrations.AddField( model_name='testitem', name='choices', diff --git a/apps/qm/models.py b/apps/qm/models.py index 7338e5d3..be5e71bb 100644 --- a/apps/qm/models.py +++ b/apps/qm/models.py @@ -49,6 +49,7 @@ class FtestWork(CommonBDModel): 检验工作 """ type = models.CharField('检验类型', max_length=20, choices=FTEST_TYPE_CHOICES, default='prod') + type2 = models.PositiveSmallIntegerField('检验类型2', choices=((10, '抽检'), (20, '全检')), default=10) test_date = models.DateField('检验日期') material = models.ForeignKey( Material, verbose_name='产品', on_delete=models.CASCADE) From ab9b1b7f277c39973ae0ba1d70323a9c4f45ea26 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 7 Aug 2024 10:18:11 +0800 Subject: [PATCH 4/7] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0testitem=E7=AD=9B?= =?UTF-8?q?=E9=80=89=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/qm/admin.py | 2 +- apps/qm/filters.py | 8 +++----- apps/qm/migrations/0016_auto_20240807_0958.py | 2 +- apps/qm/models.py | 2 +- apps/qm/views.py | 2 +- 5 files changed, 7 insertions(+), 9 deletions(-) diff --git a/apps/qm/admin.py b/apps/qm/admin.py index 6cefc524..8c477c1f 100644 --- a/apps/qm/admin.py +++ b/apps/qm/admin.py @@ -6,4 +6,4 @@ from apps.qm.models import TestItem @admin.register(TestItem) class TestItemAdmin(admin.ModelAdmin): date_hierarchy = 'create_time' - list_display = ('id', 'name', 'tags') + list_display = ('id', 'name', 'tags', 'mcate_tags', 'field_type', 'choices') diff --git a/apps/qm/filters.py b/apps/qm/filters.py index e8913875..1c485f0e 100644 --- a/apps/qm/filters.py +++ b/apps/qm/filters.py @@ -16,11 +16,9 @@ class QuaStatFilter(filters.FilterSet): class TestItemFilter(filters.FilterSet): - tag = filters.CharFilter(method='filter_tag') + tags__contains = filters.CharFilter(field_name='tags', lookup_expr='contains') + mcate_tags__contains = filters.CharFilter(field_name='mcate_tags', lookup_expr='contains') class Meta: model = TestItem - fields = ['tag'] - - def filter_tag(self, queryset, name, value): - return queryset.filter(tags__contains=value) + fields = ['tags__contains', 'mcate_tags__contains'] diff --git a/apps/qm/migrations/0016_auto_20240807_0958.py b/apps/qm/migrations/0016_auto_20240807_0958.py index beca675e..627e1ecf 100644 --- a/apps/qm/migrations/0016_auto_20240807_0958.py +++ b/apps/qm/migrations/0016_auto_20240807_0958.py @@ -43,7 +43,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name='testitem', name='field_type', - field=models.CharField(choices=[('input-number', '数字输入'), ('input-text', '文本输入'), ('select', '单选'), ('selects', '多选')], default='float', max_length=20, verbose_name='字段类型'), + field=models.CharField(choices=[('input-number', '数字输入'), ('input-text', '文本输入'), ('select', '单选'), ('selects', '多选')], default='input-number', max_length=20, verbose_name='字段类型'), ), migrations.AddField( model_name='testitem', diff --git a/apps/qm/models.py b/apps/qm/models.py index be5e71bb..f7753457 100644 --- a/apps/qm/models.py +++ b/apps/qm/models.py @@ -14,7 +14,7 @@ class TestItem(CommonAModel): 检测项目 """ name = models.CharField('名称', max_length=100) - field_type = models.CharField('字段类型', max_length=20, default='float', choices=( + field_type = models.CharField('字段类型', max_length=20, default='input-number', choices=( ('input-number', '数字输入'), ('input-text', '文本输入'), ('select', '单选'), ('selects', '多选') )) number = models.CharField('编号', max_length=20, default='', blank=True) diff --git a/apps/qm/views.py b/apps/qm/views.py index a5c22119..4066d554 100644 --- a/apps/qm/views.py +++ b/apps/qm/views.py @@ -25,7 +25,7 @@ class TestItemViewSet(CustomModelViewSet): queryset = TestItem.objects.all() serializer_class = TestItemSerializer filterset_class = TestItemFilter - search_fields = ['tags', 'name', 'number'] + search_fields = ['tags', 'name', 'number', 'mcate_tags'] ordering = ['id'] From 9136f7e87f1ebd3f1c737e1b26c500b7a230986c Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 7 Aug 2024 10:54:00 +0800 Subject: [PATCH 5/7] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0material=20cate?= =?UTF-8?q?=20=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/mtm/views.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/mtm/views.py b/apps/mtm/views.py index 14fbd5ae..18a6df84 100644 --- a/apps/mtm/views.py +++ b/apps/mtm/views.py @@ -69,7 +69,11 @@ class MaterialViewSet(CustomModelViewSet): 'week_esitimate_consume', None) obj.save() return Response() - + + @action(methods=['get'], detail=False, serializer_class=Serializer, perms_map={'get': '*'}) + def cates(self, request, *args, **kwargs): + res = Material.objects.exclude(cate='').exclude(cate=None).values_list('cate', flat=True).distinct() + return Response(set(res)) class ShiftViewSet(ListModelMixin, CustomGenericViewSet): """ From fe61081ec75403c1a8ff4588c88dd75b414d0582 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 7 Aug 2024 11:07:48 +0800 Subject: [PATCH 6/7] =?UTF-8?q?feat:=20ftestworkcreateupdate=20=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E6=9B=B4=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/qm/serializers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/qm/serializers.py b/apps/qm/serializers.py index f173d952..9d2d490e 100644 --- a/apps/qm/serializers.py +++ b/apps/qm/serializers.py @@ -61,7 +61,7 @@ class QuaStatUpdateSerializer(CustomModelSerializer): class FtestWorkCreateUpdateSerializer(CustomModelSerializer): class Meta: model = FtestWork - fields = ['id', 'test_date', 'material', 'batch', 'count', 'count_sampling', 'count_ok'] + fields = ['id', 'test_date', 'material', 'batch', 'count', 'count_sampling', 'count_ok', 'count_notok'] class FtestWorkSerializer(CustomModelSerializer): material_name = serializers.StringRelatedField( From 1418141a678912d9d1062b8ddf06f20ffb00b123 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 7 Aug 2024 15:25:48 +0800 Subject: [PATCH 7/7] =?UTF-8?q?feat:=20ftestwork=E8=BF=94=E5=9B=9Ematerial?= =?UTF-8?q?=5Fcate?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/qm/serializers.py | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/qm/serializers.py b/apps/qm/serializers.py index 9d2d490e..ebf69783 100644 --- a/apps/qm/serializers.py +++ b/apps/qm/serializers.py @@ -66,6 +66,7 @@ class FtestWorkCreateUpdateSerializer(CustomModelSerializer): class FtestWorkSerializer(CustomModelSerializer): material_name = serializers.StringRelatedField( source='material', read_only=True) + material_cate = serializers.CharField(source='material.cate', read_only=True) class Meta: model = FtestWork