From 1fa86988f1362a22c9e7a9f28983e15a0986635b Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 2 Nov 2021 09:49:08 +0800 Subject: [PATCH 01/10] =?UTF-8?q?=E7=89=A9=E6=96=99=E6=89=B9=E6=AC=A1?= =?UTF-8?q?=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_client/.env.development | 4 +-- .../inm/migrations/0008_auto_20211102_0935.py | 25 ++++++++++++++++++ hb_server/apps/inm/models.py | 2 +- hb_server/apps/inm/serializers.py | 7 ++--- hb_server/apps/pum/models.py | 1 - .../wpm/migrations/0003_auto_20211102_0935.py | 26 +++++++++++++++++++ hb_server/apps/wpm/views.py | 7 ++++- 7 files changed, 64 insertions(+), 8 deletions(-) create mode 100644 hb_server/apps/inm/migrations/0008_auto_20211102_0935.py create mode 100644 hb_server/apps/wpm/migrations/0003_auto_20211102_0935.py diff --git a/hb_client/.env.development b/hb_client/.env.development index 003a43c..ef83e12 100644 --- a/hb_client/.env.development +++ b/hb_client/.env.development @@ -2,8 +2,8 @@ ENV = 'development' # base api -#VUE_APP_BASE_API = 'http://127.0.0.1:8000/api' -VUE_APP_BASE_API = 'http://47.95.0.242:2222/api' +VUE_APP_BASE_API = 'http://127.0.0.1:8000/api' +#VUE_APP_BASE_API = 'http://47.95.0.242:2222/api' # vue-cli uses the VUE_CLI_BABEL_TRANSPILE_MODULES environment variable, diff --git a/hb_server/apps/inm/migrations/0008_auto_20211102_0935.py b/hb_server/apps/inm/migrations/0008_auto_20211102_0935.py new file mode 100644 index 0000000..2349543 --- /dev/null +++ b/hb_server/apps/inm/migrations/0008_auto_20211102_0935.py @@ -0,0 +1,25 @@ +# Generated by Django 3.2.6 on 2021-11-02 01:35 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('wpm', '0002_auto_20211029_1336'), + ('inm', '0007_auto_20211028_1331'), + ] + + operations = [ + migrations.AddField( + model_name='iproduct', + name='wproduct', + field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.CASCADE, to='wpm.wproduct', verbose_name='关联的动态产品'), + ), + migrations.AlterField( + model_name='materialbatch', + name='batch', + field=models.CharField(blank=True, max_length=100, null=True, verbose_name='批次号'), + ), + ] diff --git a/hb_server/apps/inm/models.py b/hb_server/apps/inm/models.py index 9a2ac61..9259409 100644 --- a/hb_server/apps/inm/models.py +++ b/hb_server/apps/inm/models.py @@ -41,7 +41,7 @@ class MaterialBatch(BaseModel): material = models.ForeignKey(Material, on_delete=models.CASCADE, verbose_name='物料信息') warehouse = models.ForeignKey(WareHouse, on_delete=models.CASCADE, verbose_name='所在仓库') count = models.IntegerField('存量', default=0) - batch = models.CharField('批次号', max_length=100, null=True, blank=True, unique=True) + batch = models.CharField('批次号', max_length=100, null=True, blank=True) expiration_date = models.DateField('有效期', null=True, blank=True) class Meta: verbose_name = '库存表' diff --git a/hb_server/apps/inm/serializers.py b/hb_server/apps/inm/serializers.py index 191a2dd..0087fae 100644 --- a/hb_server/apps/inm/serializers.py +++ b/hb_server/apps/inm/serializers.py @@ -83,9 +83,10 @@ class FIFOInPurSerializer(serializers.ModelSerializer): for i in details: # 校验批次 try: - obj = MaterialBatch.objects.get(batch=i['batch']) - if obj.warehouse != validated_data['warehouse']: - raise serializers.ValidationError('批次号{}在其他仓库已存在'.format(i['batch'])) + if i['batch']: + obj = MaterialBatch.objects.get(batch=i['batch'], material=i['material']) + if obj.warehouse != validated_data['warehouse']: + raise serializers.ValidationError('批次号{}在其他仓库已存在'.format(i['batch'])) except: pass diff --git a/hb_server/apps/pum/models.py b/hb_server/apps/pum/models.py index a705f8a..bf5d5a7 100644 --- a/hb_server/apps/pum/models.py +++ b/hb_server/apps/pum/models.py @@ -18,7 +18,6 @@ class Vendor(CommonAModel): contact_phone = models.CharField('联系电话', max_length=11, unique=True) address = models.CharField('地址', max_length=200, null=True, blank=True) description = models.CharField('描述', max_length=200, blank=True, null=True) - material = models.CharField('供应的物料', max_length=200, blank=True, null=True) class Meta: verbose_name = '供应商信息' verbose_name_plural = verbose_name diff --git a/hb_server/apps/wpm/migrations/0003_auto_20211102_0935.py b/hb_server/apps/wpm/migrations/0003_auto_20211102_0935.py new file mode 100644 index 0000000..fcf3bed --- /dev/null +++ b/hb_server/apps/wpm/migrations/0003_auto_20211102_0935.py @@ -0,0 +1,26 @@ +# Generated by Django 3.2.6 on 2021-11-02 01:35 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('pm', '0009_auto_20211029_1017'), + ('wpm', '0002_auto_20211029_1336'), + ] + + operations = [ + migrations.AddField( + model_name='wproduct', + name='production_plan', + field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='pm.productionplan', verbose_name='关联主生产计划'), + preserve_default=False, + ), + migrations.AlterField( + model_name='wproduct', + name='subproduction_plan', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pm.subproductionplan', verbose_name='当前子生产计划'), + ), + ] diff --git a/hb_server/apps/wpm/views.py b/hb_server/apps/wpm/views.py index 0630101..ead3278 100644 --- a/hb_server/apps/wpm/views.py +++ b/hb_server/apps/wpm/views.py @@ -31,4 +31,9 @@ class WMaterialViewSet(CreateUpdateModelAMixin, ListModelMixin, GenericViewSet): serializer= PickSerializer(data=request.data, context={'request': request}) serializer.is_valid(raise_exception=True) serializer.save() - return Response() \ No newline at end of file + return Response() + +class DoFormInit(CreateAPIView): + """ + + """ \ No newline at end of file From 1bec31257eed1271d7768ae0b0af63adff360bc8 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 2 Nov 2021 11:11:22 +0800 Subject: [PATCH 02/10] =?UTF-8?q?=E5=85=A5=E5=BA=93=E5=87=BA=E5=BA=93?= =?UTF-8?q?=E5=AE=A1=E6=A0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/inm/models.py | 2 ++ hb_server/apps/inm/signals.py | 58 +++++++++++++++++++---------------- hb_server/apps/inm/views.py | 16 ++++++++++ hb_server/apps/qm/models.py | 7 ++++- 4 files changed, 55 insertions(+), 28 deletions(-) diff --git a/hb_server/apps/inm/models.py b/hb_server/apps/inm/models.py index 9259409..da90701 100644 --- a/hb_server/apps/inm/models.py +++ b/hb_server/apps/inm/models.py @@ -60,6 +60,7 @@ class FIFO(CommonAModel): (4, '生产入库') ) type = models.IntegerField('出入库类型', default=1) + is_audited = models.BooleanField('是否审核', default=False) warehouse = models.ForeignKey(WareHouse, on_delete=models.CASCADE, verbose_name='仓库') operator = models.ForeignKey(User, verbose_name='操作人', on_delete=models.CASCADE) subproduction_plan = models.ForeignKey(SubProductionPlan, verbose_name='关联子生产计划', on_delete=models.DO_NOTHING, null=True, blank=True) @@ -71,6 +72,7 @@ class FIFODetail(BaseModel): """ 出入库详细记录 """ + is_tested = models.BooleanField('是否检测', default=False) material = models.ForeignKey(Material, verbose_name='物料类型', on_delete=models.CASCADE) count = models.IntegerField('数量', default=0) batch = models.CharField('批次号', max_length=100, null=True, blank=True) diff --git a/hb_server/apps/inm/signals.py b/hb_server/apps/inm/signals.py index 339e5e9..6e93f0f 100644 --- a/hb_server/apps/inm/signals.py +++ b/hb_server/apps/inm/signals.py @@ -1,35 +1,39 @@ from django.db.models.signals import post_save from django.dispatch import receiver -from apps.inm.models import FIFODetail, Inventory, MaterialBatch +from apps.inm.models import Inventory, MaterialBatch, FIFO, FIFODetail -@receiver(post_save, sender=FIFODetail) -def update_by_fifodetail(sender, instance, created, **kwargs): - if created: - fifo = instance.fifo - material = instance.material - warehouse = fifo.warehouse - if fifo.type in [3]: # 采购入库 +def update_inm(instance:FIFO, type:int): + """ + 更新库存(正反) + """ + if instance.is_audited: + warehouse = instance.warehouse + if instance.type in [3]: # 采购入库 # 更新相关表 - o1, _ = Inventory.objects.get_or_create(material=material, warehouse=warehouse, \ - defaults={'material':material, 'warehouse':warehouse, 'count':0}) - o1.count = o1.count + instance.count - o1.save() - o2, _ = MaterialBatch.objects.get_or_create(material=material, warehouse=warehouse, batch=instance.batch,\ - defaults={'material':material, 'warehouse':warehouse, 'count':0, 'batch':instance.batch}) - o2.count = o2.count + instance.count - o2.save() - material.count = material.count + instance.count - material.save() - elif fifo.type in [1]: # 生产领料 + for i in FIFODetail.objects.filter(fifo=instance): + material = i.material + o1, _ = Inventory.objects.get_or_create(material=material, warehouse=warehouse, \ + defaults={'material':material, 'warehouse':warehouse, 'count':0}) + o1.count = o1.count + i.count + o1.save() + o2, _ = MaterialBatch.objects.get_or_create(material=material, warehouse=warehouse, batch=i.batch,\ + defaults={'material':material, 'warehouse':warehouse, 'count':0, 'batch':i.batch}) + o2.count = o2.count + i.count + o2.save() + material.count = material.count + i.count + material.save() + elif instance.type in [1]: # 生产领料 # 更新相关表 - o1 = Inventory.objects.get(material=material, warehouse=warehouse) - o1.count = o1.count - instance.count - o1.save() - o2 = MaterialBatch.objects.get(material=material, warehouse=warehouse, batch=instance.batch) - o2.count = o2.count - instance.count - o2.save() - material.count = material.count - instance.count - material.save() + for i in FIFODetail.objects.filter(fifo=instance): + material = i.material + o1 = Inventory.objects.get(material=material, warehouse=warehouse) + o1.count = o1.count - i.count + o1.save() + o2 = MaterialBatch.objects.get(material=material, warehouse=warehouse, batch=i.batch) + o2.count = o2.count - i.count + o2.save() + material.count = material.count - i.count + material.save() diff --git a/hb_server/apps/inm/views.py b/hb_server/apps/inm/views.py index 927e0ee..e26fb60 100644 --- a/hb_server/apps/inm/views.py +++ b/hb_server/apps/inm/views.py @@ -1,11 +1,13 @@ from django.shortcuts import render from rest_framework import serializers +from rest_framework.exceptions import APIException from rest_framework.mixins import ListModelMixin, RetrieveModelMixin from rest_framework.viewsets import GenericViewSet, ModelViewSet from apps.inm.filters import MbFilterSet from apps.inm.models import FIFO, FIFODetail, MaterialBatch, WareHouse,Inventory from apps.inm.serializers import FIFODetailSerializer, FIFOInPurSerializer, FIFOListSerializer, MaterialBatchQuerySerializer, MaterialBatchSerializer, WareHouseSerializer, WareHouseCreateUpdateSerializer,InventorySerializer +from apps.inm.signals import update_inm from apps.system.mixins import CreateUpdateModelAMixin, OptimizationMixin from rest_framework.decorators import action from rest_framework.response import Response @@ -96,4 +98,18 @@ class FIFOViewSet(ListModelMixin, GenericViewSet): serializer.is_valid(raise_exception=True) serializer.save(create_by=request.user) return Response() + + @action(methods=['post'], detail=True, perms_map={'post':'*'}, serializer_class=serializers.Serializer) + def audit(self, request, pk=None): + """ + 审核通过 + """ + obj = self.get_object() + for i in FIFODetail.objects.filter(fifo=obj): + if not i.is_tested: + raise APIException('未检验通过, 不可审核') + obj.is_audited = True + obj.save() + update_inm(obj) # 更新库存 + return Response() \ No newline at end of file diff --git a/hb_server/apps/qm/models.py b/hb_server/apps/qm/models.py index 4e667cd..f8e3e86 100644 --- a/hb_server/apps/qm/models.py +++ b/hb_server/apps/qm/models.py @@ -38,4 +38,9 @@ class AnalysisItem(CommonAModel): rules =models.JSONField('判定规则', default=list) class Meta: - verbose_name = '检验分析项' \ No newline at end of file + verbose_name = '检验分析项' + +class TestRecord(CommonAModel): + """ + 检验记录 + """ \ No newline at end of file From 0f38d31883513300396eec4a049dd5ce719c6a6c Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 2 Nov 2021 15:51:22 +0800 Subject: [PATCH 03/10] =?UTF-8?q?=E5=85=A5=E5=8E=82=E6=A3=80=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../inm/migrations/0009_auto_20211102_1113.py | 23 ++++++++ hb_server/apps/inm/models.py | 3 +- hb_server/apps/inm/signals.py | 55 +++++++++---------- hb_server/apps/inm/views.py | 9 ++- hb_server/apps/mtm/models.py | 3 +- hb_server/apps/mtm/serializers.py | 25 +++++++++ hb_server/apps/mtm/views.py | 6 +- hb_server/apps/qm/models.py | 8 ++- hb_server/apps/qm/serializers.py | 42 +++++++++++++- hb_server/apps/qm/urls.py | 3 +- hb_server/apps/qm/views.py | 30 +++++++++- hb_server/apps/wpm/serializers.py | 7 ++- hb_server/utils/viewset.py | 6 ++ 13 files changed, 180 insertions(+), 40 deletions(-) create mode 100644 hb_server/apps/inm/migrations/0009_auto_20211102_1113.py create mode 100644 hb_server/utils/viewset.py diff --git a/hb_server/apps/inm/migrations/0009_auto_20211102_1113.py b/hb_server/apps/inm/migrations/0009_auto_20211102_1113.py new file mode 100644 index 0000000..cb6e575 --- /dev/null +++ b/hb_server/apps/inm/migrations/0009_auto_20211102_1113.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.6 on 2021-11-02 03:13 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('inm', '0008_auto_20211102_0935'), + ] + + operations = [ + migrations.AddField( + model_name='fifo', + name='is_audited', + field=models.BooleanField(default=False, verbose_name='是否审核'), + ), + migrations.AddField( + model_name='fifodetail', + name='is_tested', + field=models.BooleanField(default=False, verbose_name='是否检测'), + ), + ] diff --git a/hb_server/apps/inm/models.py b/hb_server/apps/inm/models.py index da90701..eefa002 100644 --- a/hb_server/apps/inm/models.py +++ b/hb_server/apps/inm/models.py @@ -72,7 +72,8 @@ class FIFODetail(BaseModel): """ 出入库详细记录 """ - is_tested = models.BooleanField('是否检测', default=False) + is_tested = models.BooleanField('是否已检测', default=False) + is_testok = models.BooleanField('是否检测合格', default=False) material = models.ForeignKey(Material, verbose_name='物料类型', on_delete=models.CASCADE) count = models.IntegerField('数量', default=0) batch = models.CharField('批次号', max_length=100, null=True, blank=True) diff --git a/hb_server/apps/inm/signals.py b/hb_server/apps/inm/signals.py index 6e93f0f..800621a 100644 --- a/hb_server/apps/inm/signals.py +++ b/hb_server/apps/inm/signals.py @@ -8,32 +8,31 @@ def update_inm(instance:FIFO, type:int): """ 更新库存(正反) """ - if instance.is_audited: - warehouse = instance.warehouse - if instance.type in [3]: # 采购入库 - # 更新相关表 - for i in FIFODetail.objects.filter(fifo=instance): - material = i.material - o1, _ = Inventory.objects.get_or_create(material=material, warehouse=warehouse, \ - defaults={'material':material, 'warehouse':warehouse, 'count':0}) - o1.count = o1.count + i.count - o1.save() - o2, _ = MaterialBatch.objects.get_or_create(material=material, warehouse=warehouse, batch=i.batch,\ - defaults={'material':material, 'warehouse':warehouse, 'count':0, 'batch':i.batch}) - o2.count = o2.count + i.count - o2.save() - material.count = material.count + i.count - material.save() - elif instance.type in [1]: # 生产领料 - # 更新相关表 - for i in FIFODetail.objects.filter(fifo=instance): - material = i.material - o1 = Inventory.objects.get(material=material, warehouse=warehouse) - o1.count = o1.count - i.count - o1.save() - o2 = MaterialBatch.objects.get(material=material, warehouse=warehouse, batch=i.batch) - o2.count = o2.count - i.count - o2.save() - material.count = material.count - i.count - material.save() + warehouse = instance.warehouse + if instance.type in [3]: # 采购入库 + # 更新相关表 + for i in FIFODetail.objects.filter(fifo=instance): + material = i.material + o1, _ = Inventory.objects.get_or_create(material=material, warehouse=warehouse, \ + defaults={'material':material, 'warehouse':warehouse, 'count':0}) + o1.count = o1.count + i.count + o1.save() + o2, _ = MaterialBatch.objects.get_or_create(material=material, warehouse=warehouse, batch=i.batch,\ + defaults={'material':material, 'warehouse':warehouse, 'count':0, 'batch':i.batch}) + o2.count = o2.count + i.count + o2.save() + material.count = material.count + i.count + material.save() + elif instance.type in [1]: # 生产领料 + # 更新相关表 + for i in FIFODetail.objects.filter(fifo=instance): + material = i.material + o1 = Inventory.objects.get(material=material, warehouse=warehouse) + o1.count = o1.count - i.count + o1.save() + o2 = MaterialBatch.objects.get(material=material, warehouse=warehouse, batch=i.batch) + o2.count = o2.count - i.count + o2.save() + material.count = material.count - i.count + material.save() diff --git a/hb_server/apps/inm/views.py b/hb_server/apps/inm/views.py index e26fb60..0fd15d8 100644 --- a/hb_server/apps/inm/views.py +++ b/hb_server/apps/inm/views.py @@ -74,7 +74,7 @@ class FIFODetailViewSet(ListModelMixin, GenericViewSet): search_fields = [] ordering_fields = ['create_time'] ordering = ['-create_time'] - + class FIFOViewSet(ListModelMixin, GenericViewSet): """ 出入库记录 @@ -82,7 +82,10 @@ class FIFOViewSet(ListModelMixin, GenericViewSet): perms_map = {'*': '*'} queryset = FIFO.objects.select_related('warehouse', 'operator') serializer_class = FIFOListSerializer - filterset_fields = ['warehouse', 'type'] + filterset_fields = '__all__' + ordering_fields = '__all__' + search_fields = ['warehouse__name', 'warehouse__number'] + ordering = ['-pk'] def get_serializer_class(self): if self.action == 'list': @@ -106,7 +109,7 @@ class FIFOViewSet(ListModelMixin, GenericViewSet): """ obj = self.get_object() for i in FIFODetail.objects.filter(fifo=obj): - if not i.is_tested: + if not i.is_testok: raise APIException('未检验通过, 不可审核') obj.is_audited = True obj.save() diff --git a/hb_server/apps/mtm/models.py b/hb_server/apps/mtm/models.py index 2a23ec3..a86784b 100644 --- a/hb_server/apps/mtm/models.py +++ b/hb_server/apps/mtm/models.py @@ -88,6 +88,7 @@ class RecordForm(CommonAModel): type = models.IntegerField('表格类型', choices=type_choices, default=1) step = models.ForeignKey(Step, verbose_name='关联子工序', on_delete=models.CASCADE, null=True, blank=True) material = models.ForeignKey(Material, verbose_name='关联物料', on_delete=models.CASCADE, null=True, blank=True) + class Meta: verbose_name = '记录表格' verbose_name_plural = verbose_name @@ -130,7 +131,7 @@ class RecordFormField(CommonAModel): field_choice = models.JSONField('radio、checkbox、select的选项', default=dict, blank=True, null=True, help_text='radio,checkbox,select,multiselect类型可供选择的选项,格式为json如:{"1":"中国", "2":"美国"},注意数字也需要引号') sort = models.IntegerField('排序号', default=1) - need_judge = models.BooleanField('需要判定', default=False) + need_judge = models.BooleanField('需要判定项目', default=False) high_limit = models.FloatField('上限值', null=True, blank=True) high_rule = models.IntegerField('上限规则', choices=high_rule_choices, null=True, blank=True) low_limit = models.FloatField('下限值', null=True, blank=True) diff --git a/hb_server/apps/mtm/serializers.py b/hb_server/apps/mtm/serializers.py index f0e6deb..21b549b 100644 --- a/hb_server/apps/mtm/serializers.py +++ b/hb_server/apps/mtm/serializers.py @@ -151,6 +151,11 @@ class UsedStepListSerializer(serializers.ModelSerializer): queryset = queryset.select_related('step') return queryset +class RecordFormSimpleSerializer(serializers.ModelSerializer): + + class Meta: + model = RecordForm + fields = ['id', 'name'] class RecordFormSerializer(serializers.ModelSerializer): step_ = StepSimpleSerializer(source='step', read_only=True) material_ = MaterialSimpleSerializer(source='material', read_only=True) @@ -182,6 +187,26 @@ class RecordFormFieldSerializer(serializers.ModelSerializer): model = RecordFormField fields = '__all__' +class RecordFormDetailSerializer(serializers.ModelSerializer): + step_ = StepSimpleSerializer(source='step', read_only=True) + material_ = MaterialSimpleSerializer(source='material', read_only=True) + form_fields = serializers.SerializerMethodField() + + class Meta: + model = RecordForm + fields = '__all__' + + @staticmethod + def setup_eager_loading(queryset): + """ Perform necessary eager loading of data. """ + queryset = queryset.select_related('step', 'material') + return queryset + + def get_form_fields(self, obj): + serializer = RecordFormFieldSerializer(instance=RecordFormField.objects.filter(form=obj, is_deleted=False), many=True) + return serializer.data + + class RecordFormFieldCreateSerializer(serializers.ModelSerializer): class Meta: model = RecordFormField diff --git a/hb_server/apps/mtm/views.py b/hb_server/apps/mtm/views.py index 64e62f2..3dd563c 100644 --- a/hb_server/apps/mtm/views.py +++ b/hb_server/apps/mtm/views.py @@ -3,7 +3,7 @@ from rest_framework.viewsets import ModelViewSet, GenericViewSet from rest_framework.mixins import CreateModelMixin, ListModelMixin, UpdateModelMixin, RetrieveModelMixin, DestroyModelMixin from apps.mtm.models import Material, Process, RecordForm, RecordFormField, Step, SubplanMaterial, TechDoc, UsedStep, SubProduction -from apps.mtm.serializers import InputMaterialSerializer, InputMaterialUpdateSerializer, MaterialDetailSerializer, MaterialSerializer, MaterialSimpleSerializer, OtherMaterialSerializer, OutputMaterialSerializer, OutputMaterialUpdateSerializer, ProcessSerializer, RecordFormCreateSerializer, RecordFormFieldCreateSerializer, RecordFormFieldSerializer, RecordFormFieldUpdateSerializer, RecordFormSerializer, RecordFormUpdateSerializer, StepDetailSerializer, StepSerializer, SubProductionSerializer, SubplanMaterialListSerializer, TechDocCreateSerializer, TechDocListSerializer, TechDocUpdateSerializer, UsedStepCreateSerializer, UsedStepListSerializer, UsedStepUpdateSerializer +from apps.mtm.serializers import InputMaterialSerializer, InputMaterialUpdateSerializer, MaterialDetailSerializer, MaterialSerializer, MaterialSimpleSerializer, OtherMaterialSerializer, OutputMaterialSerializer, OutputMaterialUpdateSerializer, ProcessSerializer, RecordFormCreateSerializer, RecordFormDetailSerializer, RecordFormFieldCreateSerializer, RecordFormFieldSerializer, RecordFormFieldUpdateSerializer, RecordFormSerializer, RecordFormUpdateSerializer, StepDetailSerializer, StepSerializer, SubProductionSerializer, SubplanMaterialListSerializer, TechDocCreateSerializer, TechDocListSerializer, TechDocUpdateSerializer, UsedStepCreateSerializer, UsedStepListSerializer, UsedStepUpdateSerializer from apps.system.mixins import CreateUpdateModelAMixin, OptimizationMixin from rest_framework.decorators import action from rest_framework.response import Response @@ -159,6 +159,8 @@ class RecordFormViewSet(OptimizationMixin, CreateUpdateModelAMixin, ModelViewSet return RecordFormCreateSerializer elif self.action == 'update': return RecordFormUpdateSerializer + elif self.action == 'retrieve': + return RecordFormDetailSerializer return RecordFormSerializer @action(methods=['get'], detail=True, perms_map={'get':'*'}, pagination_class=None, serializer_class=RecordFormFieldSerializer) @@ -170,6 +172,8 @@ class RecordFormViewSet(OptimizationMixin, CreateUpdateModelAMixin, ModelViewSet serializer = self.serializer_class(instance=RecordFormField.objects.filter(form=instance, is_deleted=False), many=True) return Response(serializer.data) + + class RecordFormFieldViewSet(OptimizationMixin, CreateUpdateModelAMixin, ModelViewSet): """ diff --git a/hb_server/apps/qm/models.py b/hb_server/apps/qm/models.py index f8e3e86..062f5c9 100644 --- a/hb_server/apps/qm/models.py +++ b/hb_server/apps/qm/models.py @@ -43,4 +43,10 @@ class AnalysisItem(CommonAModel): class TestRecord(CommonAModel): """ 检验记录 - """ \ No newline at end of file + """ + + form = models.ForeignKey('mtm.recordform', verbose_name='所用表格', on_delete=models.CASCADE) + record_data = models.JSONField('记录数据', default=dict, blank=True) + is_testok = models.BooleanField('是否合格', default=True) + fifo_detail = models.ForeignKey('inm.fifodetail', verbose_name='关联的出入库批次', on_delete=models.CASCADE, null=True, blank=True) + \ No newline at end of file diff --git a/hb_server/apps/qm/serializers.py b/hb_server/apps/qm/serializers.py index a656332..51d5cb7 100644 --- a/hb_server/apps/qm/serializers.py +++ b/hb_server/apps/qm/serializers.py @@ -1,6 +1,8 @@ from rest_framework import serializers +from apps.mtm.models import RecordForm, RecordFormField +from apps.mtm.serializers import RecordFormFieldSerializer, RecordFormSimpleSerializer from apps.system.serializers import FileSimpleSerializer -from .models import Standard, TestItem +from .models import Standard, TestItem, TestRecord class StandardCreateUpdateSerializer(serializers.ModelSerializer): class Meta: @@ -31,3 +33,41 @@ class TestItemSerializer(serializers.ModelSerializer): class AnalysisItemSerializer(serializers.ModelSerializer): pass + + +class TestRecordCreateSerializer(serializers.ModelSerializer): + class Meta: + model = TestRecord + fields = ['form', 'record_data', 'is_testok', 'fifo_detail'] + + def create(self, validated_data): + if 'is_testok' not in validated_data: + raise serializers.ValidationError('未填写检测结论') + return super().create(validated_data) + +class TestRecordListSerializer(serializers.ModelSerializer): + class Meta: + model = TestRecord + fields = '__all__' + + +class TestRecordDetailSerializer(serializers.ModelSerializer): + form_ = RecordFormSimpleSerializer(source='form', read_only=True) + record_data_ = serializers.SerializerMethodField() + class Meta: + model = TestRecord + fields = '__all__' + + @staticmethod + def setup_eager_loading(queryset): + queryset = queryset.select_related('form','fifo_detail') + return queryset + + def get_record_data_(self, obj): + record_data = obj.record_data + all_fields = RecordFormField.objects.filter(form=obj.form, is_deletd=False).order_by('sort') + all_fields_l = RecordFormFieldSerializer(instance=all_fields, many=True).data + for i in all_fields_l: + key = i['field_key'] + i['field_value'] = record_data.get(key, None) + return all_fields_l \ No newline at end of file diff --git a/hb_server/apps/qm/urls.py b/hb_server/apps/qm/urls.py index 070d39b..913ca82 100644 --- a/hb_server/apps/qm/urls.py +++ b/hb_server/apps/qm/urls.py @@ -1,4 +1,4 @@ -from apps.qm.views import StandardViewSet, TestItemViewSet +from apps.qm.views import StandardViewSet, TestItemViewSet, TestRecordViewSet from django.db.models import base from rest_framework import urlpatterns from django.urls import path, include @@ -7,6 +7,7 @@ from rest_framework.routers import DefaultRouter router = DefaultRouter() router.register('standard', StandardViewSet, basename='standard') router.register('testitem', TestItemViewSet, basename='testitem') +router.register('testrecord', TestRecordViewSet, basename='testrecord') urlpatterns = [ path('', include(router.urls)), ] diff --git a/hb_server/apps/qm/views.py b/hb_server/apps/qm/views.py index da02e97..41133f5 100644 --- a/hb_server/apps/qm/views.py +++ b/hb_server/apps/qm/views.py @@ -1,5 +1,5 @@ -from apps.qm.serializers import StandardCreateUpdateSerializer, StandardSerializer, TestItemCreateUpdateSerializer, TestItemSerializer -from apps.qm.models import Standard, TestItem +from apps.qm.serializers import StandardCreateUpdateSerializer, StandardSerializer, TestItemCreateUpdateSerializer, TestItemSerializer, TestRecordCreateSerializer, TestRecordDetailSerializer, TestRecordListSerializer +from apps.qm.models import Standard, TestItem, TestRecord from django.shortcuts import render from rest_framework.viewsets import ModelViewSet from apps.system.mixins import CreateUpdateModelAMixin @@ -37,3 +37,29 @@ class TestItemViewSet(CreateUpdateModelAMixin, ModelViewSet): if self.action in ['create', 'update']: return TestItemCreateUpdateSerializer return TestItemSerializer + +class TestRecordViewSet(ModelViewSet): + """ + 检测记录 + """ + perms_map = {'*': '*'} + queryset = TestRecord.objects.select_related('fifo_detail', 'form').all() + serializer_class = TestRecordListSerializer + ordering = ['-id'] + + def get_serializer_class(self): + if self.action == 'create': + return TestRecordCreateSerializer + elif self.action == 'list': + return TestRecordListSerializer + elif self.action == 'retrieve': + return TestRecordDetailSerializer + return super().get_serializer_class() + + def perform_create(self, serializer): + obj = serializer.save(create_by = self.request.user) + # 如果检测合格 + if obj.fifo_detail: + obj.fifo_detail.is_testok = True if obj.is_testok else False + obj.fifo_detail.is_tested = True + obj.fifo_detail.save() \ No newline at end of file diff --git a/hb_server/apps/wpm/serializers.py b/hb_server/apps/wpm/serializers.py index 7b74167..300fa62 100644 --- a/hb_server/apps/wpm/serializers.py +++ b/hb_server/apps/wpm/serializers.py @@ -1,6 +1,7 @@ from rest_framework import serializers from rest_framework.serializers import ModelSerializer from apps.inm.models import FIFO, FIFODetail, MaterialBatch, WareHouse +from apps.inm.signals import update_inm from apps.mtm.models import Material from apps.mtm.serializers import MaterialSimpleSerializer @@ -53,12 +54,16 @@ class PickSerializer(serializers.Serializer): }) wm.count = wm.count + i['pick_count'] wm.save() - # 更新子计划进度 + # 更新子计划物料情况 spp = SubProductionProgress.objects.get(material=i['material'], subproduction_plan=sp, type=1) spp.count_real = spp.count_real + i['pick_count'] spp.save() sp.is_picked=True sp.save() + # 更新库存 + fifo.is_audited = True + fifo.save() + update_inm(fifo) return fifo class WMaterialListSerializer(serializers.ModelSerializer): diff --git a/hb_server/utils/viewset.py b/hb_server/utils/viewset.py new file mode 100644 index 0000000..e4c4c84 --- /dev/null +++ b/hb_server/utils/viewset.py @@ -0,0 +1,6 @@ +from rest_framework.viewsets import GenericViewSet + +class MyGenericViewSet(GenericViewSet): + filterset_fields = '__all__' + ordering_fields = '__all__' + ordering = ['-pk'] \ No newline at end of file From 6383f374224c32e65b8642eb6f990163457be86e Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 2 Nov 2021 16:24:08 +0800 Subject: [PATCH 04/10] =?UTF-8?q?=E9=A2=86=E6=96=99=E6=8E=A5=E5=8F=A3bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/wpm/serializers.py | 2 +- hb_server/apps/wpm/views.py | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/hb_server/apps/wpm/serializers.py b/hb_server/apps/wpm/serializers.py index 300fa62..e9c9bb3 100644 --- a/hb_server/apps/wpm/serializers.py +++ b/hb_server/apps/wpm/serializers.py @@ -38,7 +38,7 @@ class PickSerializer(serializers.Serializer): validated_data['operator'] = operator validated_data['type'] = 1 validated_data['inout_date'] = timezone.now() - fifo = FIFO.objects.create(validated_data) + fifo = FIFO.objects.create(**validated_data) for i in picks: # 更新出库详情 i['fifo'] = fifo diff --git a/hb_server/apps/wpm/views.py b/hb_server/apps/wpm/views.py index ead3278..8a3dc4e 100644 --- a/hb_server/apps/wpm/views.py +++ b/hb_server/apps/wpm/views.py @@ -35,5 +35,6 @@ class WMaterialViewSet(CreateUpdateModelAMixin, ListModelMixin, GenericViewSet): class DoFormInit(CreateAPIView): """ - - """ \ No newline at end of file + 生产操作表单创建 + """ + perms_map={'*':'*'} \ No newline at end of file From 5d21ebd3fc00d3682cafb858dc59c83d112a53b0 Mon Sep 17 00:00:00 2001 From: shijing Date: Tue, 2 Nov 2021 16:26:30 +0800 Subject: [PATCH 05/10] timerClose --- hb_client/src/layout/index.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hb_client/src/layout/index.vue b/hb_client/src/layout/index.vue index 2993021..a0d3695 100644 --- a/hb_client/src/layout/index.vue +++ b/hb_client/src/layout/index.vue @@ -67,13 +67,13 @@ export default { if (hasToken) { this.$store.dispatch("user/getCount", {}); } - this.timer = window.setInterval(() => { + /*this.timer = window.setInterval(() => { setTimeout(() => { if (hasToken) { this.$store.dispatch("user/getCount", {}); } },0) - },5000) + },5000)*/ }, methods: { handleClickOutside() { From b47c69f0de4270beec4536c9376b2b2d416a7e3c Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 2 Nov 2021 16:29:13 +0800 Subject: [PATCH 06/10] =?UTF-8?q?=E9=A2=86=E6=96=99=E6=8E=A5=E5=8F=A3bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/wpm/serializers.py | 1 + 1 file changed, 1 insertion(+) diff --git a/hb_server/apps/wpm/serializers.py b/hb_server/apps/wpm/serializers.py index e9c9bb3..1e38cf4 100644 --- a/hb_server/apps/wpm/serializers.py +++ b/hb_server/apps/wpm/serializers.py @@ -42,6 +42,7 @@ class PickSerializer(serializers.Serializer): for i in picks: # 更新出库详情 i['fifo'] = fifo + i['count'] = i.pop('pick_count') FIFODetail.objects.create(**i) # 更新车间物料 wm = WMaterial.objects.get_or_create(material=i['material'], batch=i['batch'], \ From f8676bc6ada60cad901a1363f16203098791228c Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 2 Nov 2021 16:50:20 +0800 Subject: [PATCH 07/10] =?UTF-8?q?=E6=B8=85=E7=90=86=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../inm/migrations/0010_auto_20211102_1631.py | 23 ++++++++++++ hb_server/apps/inm/signals.py | 2 +- .../0027_alter_recordformfield_need_judge.py | 18 +++++++++ .../migrations/0003_remove_vendor_material.py | 17 +++++++++ .../apps/qm/migrations/0003_testrecord.py | 37 +++++++++++++++++++ hb_server/apps/wpm/serializers.py | 12 +++--- 6 files changed, 102 insertions(+), 7 deletions(-) create mode 100644 hb_server/apps/inm/migrations/0010_auto_20211102_1631.py create mode 100644 hb_server/apps/mtm/migrations/0027_alter_recordformfield_need_judge.py create mode 100644 hb_server/apps/pum/migrations/0003_remove_vendor_material.py create mode 100644 hb_server/apps/qm/migrations/0003_testrecord.py diff --git a/hb_server/apps/inm/migrations/0010_auto_20211102_1631.py b/hb_server/apps/inm/migrations/0010_auto_20211102_1631.py new file mode 100644 index 0000000..8770060 --- /dev/null +++ b/hb_server/apps/inm/migrations/0010_auto_20211102_1631.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.6 on 2021-11-02 08:31 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('inm', '0009_auto_20211102_1113'), + ] + + operations = [ + migrations.AddField( + model_name='fifodetail', + name='is_testok', + field=models.BooleanField(default=False, verbose_name='是否检测合格'), + ), + migrations.AlterField( + model_name='fifodetail', + name='is_tested', + field=models.BooleanField(default=False, verbose_name='是否已检测'), + ), + ] diff --git a/hb_server/apps/inm/signals.py b/hb_server/apps/inm/signals.py index 800621a..c4b74ee 100644 --- a/hb_server/apps/inm/signals.py +++ b/hb_server/apps/inm/signals.py @@ -4,7 +4,7 @@ from django.dispatch import receiver from apps.inm.models import Inventory, MaterialBatch, FIFO, FIFODetail -def update_inm(instance:FIFO, type:int): +def update_inm(instance:FIFO, type:int=1): """ 更新库存(正反) """ diff --git a/hb_server/apps/mtm/migrations/0027_alter_recordformfield_need_judge.py b/hb_server/apps/mtm/migrations/0027_alter_recordformfield_need_judge.py new file mode 100644 index 0000000..6346040 --- /dev/null +++ b/hb_server/apps/mtm/migrations/0027_alter_recordformfield_need_judge.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.6 on 2021-11-02 08:31 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('mtm', '0026_auto_20211101_1522'), + ] + + operations = [ + migrations.AlterField( + model_name='recordformfield', + name='need_judge', + field=models.BooleanField(default=False, verbose_name='需要判定项目'), + ), + ] diff --git a/hb_server/apps/pum/migrations/0003_remove_vendor_material.py b/hb_server/apps/pum/migrations/0003_remove_vendor_material.py new file mode 100644 index 0000000..ed1ff59 --- /dev/null +++ b/hb_server/apps/pum/migrations/0003_remove_vendor_material.py @@ -0,0 +1,17 @@ +# Generated by Django 3.2.6 on 2021-11-02 08:31 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('pum', '0002_vendor_material'), + ] + + operations = [ + migrations.RemoveField( + model_name='vendor', + name='material', + ), + ] diff --git a/hb_server/apps/qm/migrations/0003_testrecord.py b/hb_server/apps/qm/migrations/0003_testrecord.py new file mode 100644 index 0000000..4e644a8 --- /dev/null +++ b/hb_server/apps/qm/migrations/0003_testrecord.py @@ -0,0 +1,37 @@ +# Generated by Django 3.2.6 on 2021-11-02 08:31 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('inm', '0010_auto_20211102_1631'), + ('mtm', '0027_alter_recordformfield_need_judge'), + ('qm', '0002_alter_analysisitem_rules'), + ] + + operations = [ + migrations.CreateModel( + name='TestRecord', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')), + ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')), + ('record_data', models.JSONField(blank=True, default=dict, verbose_name='记录数据')), + ('is_testok', models.BooleanField(default=True, verbose_name='是否合格')), + ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='testrecord_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')), + ('fifo_detail', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='inm.fifodetail', verbose_name='关联的出入库批次')), + ('form', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mtm.recordform', verbose_name='所用表格')), + ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='testrecord_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/hb_server/apps/wpm/serializers.py b/hb_server/apps/wpm/serializers.py index 1e38cf4..0b897c9 100644 --- a/hb_server/apps/wpm/serializers.py +++ b/hb_server/apps/wpm/serializers.py @@ -45,19 +45,19 @@ class PickSerializer(serializers.Serializer): i['count'] = i.pop('pick_count') FIFODetail.objects.create(**i) # 更新车间物料 - wm = WMaterial.objects.get_or_create(material=i['material'], batch=i['batch'], \ - process=validated_data['process'],defaults={ + wm, _ = WMaterial.objects.get_or_create(material=i['material'], batch=i['batch'], \ + process=sp.process,defaults={ 'material':i['material'], 'batch':i['batch'], - 'process':validated_data['process'], - 'workshop':validated_data['workshop'], + 'process':sp.process, + 'workshop':sp.workshop, 'count':0 }) - wm.count = wm.count + i['pick_count'] + wm.count = wm.count + i['count'] wm.save() # 更新子计划物料情况 spp = SubProductionProgress.objects.get(material=i['material'], subproduction_plan=sp, type=1) - spp.count_real = spp.count_real + i['pick_count'] + spp.count_real = spp.count_real + i['count'] spp.save() sp.is_picked=True sp.save() From c49bb54868c58cce76c1273e3be8ff6b7ebb9623 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 2 Nov 2021 17:08:36 +0800 Subject: [PATCH 08/10] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=A1=A8=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mtm/migrations/0028_auto_20211102_1707.py | 40 +++++++++++++++++++ hb_server/apps/mtm/models.py | 4 +- hb_server/apps/mtm/serializers.py | 24 +++++------ hb_server/apps/mtm/views.py | 16 ++++---- hb_server/apps/pm/views.py | 4 +- 5 files changed, 64 insertions(+), 24 deletions(-) create mode 100644 hb_server/apps/mtm/migrations/0028_auto_20211102_1707.py diff --git a/hb_server/apps/mtm/migrations/0028_auto_20211102_1707.py b/hb_server/apps/mtm/migrations/0028_auto_20211102_1707.py new file mode 100644 index 0000000..b20ad14 --- /dev/null +++ b/hb_server/apps/mtm/migrations/0028_auto_20211102_1707.py @@ -0,0 +1,40 @@ +# Generated by Django 3.2.6 on 2021-11-02 09:07 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('mtm', '0027_alter_recordformfield_need_judge'), + ] + + operations = [ + migrations.CreateModel( + name='SubprodctionMaterial', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')), + ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')), + ('is_main', models.BooleanField(default=False, verbose_name='是否主产出')), + ('count', models.FloatField(default=0, verbose_name='消耗量/产出量')), + ('type', models.IntegerField(default=1, verbose_name='物料应用类型')), + ('sort', models.IntegerField(default=1, verbose_name='排序号')), + ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='subprodctionmaterial_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')), + ('material', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='subplan_material', to='mtm.material', verbose_name='物料')), + ('subproduction', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mtm.subproduction', verbose_name='关联生产分解')), + ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='subprodctionmaterial_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')), + ], + options={ + 'abstract': False, + }, + ), + migrations.DeleteModel( + name='SubplanMaterial', + ), + ] diff --git a/hb_server/apps/mtm/models.py b/hb_server/apps/mtm/models.py index a86784b..ce615ac 100644 --- a/hb_server/apps/mtm/models.py +++ b/hb_server/apps/mtm/models.py @@ -160,7 +160,7 @@ class SubProduction(CommonAModel): verbose_name = '产品生产工序' verbose_name_plural = verbose_name -class SubplanMaterial(CommonAModel): +class SubprodctionMaterial(CommonAModel): """ 输入/输出物料/工具工装 """ @@ -171,7 +171,7 @@ class SubplanMaterial(CommonAModel): ) material = models.ForeignKey(Material, verbose_name='物料', on_delete=models.CASCADE, related_name='subplan_material') is_main = models.BooleanField('是否主产出', default=False) # 以该产品完成度计算进度 - count = models.FloatField('消耗量/产出量', default=1) + count = models.FloatField('消耗量/产出量', default=0) subproduction = models.ForeignKey(SubProduction, verbose_name='关联生产分解', on_delete=models.CASCADE) type = models.IntegerField('物料应用类型', default=1) sort = models.IntegerField('排序号', default=1) diff --git a/hb_server/apps/mtm/serializers.py b/hb_server/apps/mtm/serializers.py index 21b549b..49f4b87 100644 --- a/hb_server/apps/mtm/serializers.py +++ b/hb_server/apps/mtm/serializers.py @@ -1,7 +1,7 @@ from apps.em.serializers import EquipmentSimpleSerializer from rest_framework import serializers from rest_framework.exceptions import ParseError, ValidationError -from .models import Material, Process, RecordForm, RecordFormField, Step, SubplanMaterial, TechDoc, UsedStep, SubProduction +from .models import Material, Process, RecordForm, RecordFormField, Step, SubprodctionMaterial, TechDoc, UsedStep, SubProduction from apps.system.serializers import FileSimpleSerializer, OrganizationSimpleSerializer @@ -69,53 +69,53 @@ class SubProductionSerializer(serializers.ModelSerializer): class OtherMaterialSerializer(serializers.ModelSerializer): class Meta: - model = SubplanMaterial + model = SubprodctionMaterial fields = ['sort', 'material', 'subproduction'] def create(self, validated_data): - if SubplanMaterial.objects.filter(material=validated_data['material'], subproduction=validated_data['subproduction'], is_deleted=False, type=3).exists(): + if SubprodctionMaterial.objects.filter(material=validated_data['material'], subproduction=validated_data['subproduction'], is_deleted=False, type=3).exists(): raise ValidationError('该物料已存在') validated_data['type']=3 return super().create(validated_data) -class SubplanMaterialListSerializer(serializers.ModelSerializer): +class SubprodctionMaterialListSerializer(serializers.ModelSerializer): material_ = MaterialSimpleSerializer(source='material', read_only=True) class Meta: - model = SubplanMaterial + model = SubprodctionMaterial fields = '__all__' class InputMaterialSerializer(serializers.ModelSerializer): class Meta: - model = SubplanMaterial + model = SubprodctionMaterial fields = ['count', 'sort', 'material', 'subproduction'] def create(self, validated_data): - if SubplanMaterial.objects.filter(material=validated_data['material'], subproduction=validated_data['subproduction'], is_deleted=False, type=1).exists(): + if SubprodctionMaterial.objects.filter(material=validated_data['material'], subproduction=validated_data['subproduction'], is_deleted=False, type=1).exists(): raise ValidationError('该物料已存在') validated_data['type']=1 return super().create(validated_data) class InputMaterialUpdateSerializer(serializers.ModelSerializer): class Meta: - model = SubplanMaterial + model = SubprodctionMaterial fields = ['count', 'sort'] class OutputMaterialSerializer(serializers.ModelSerializer): class Meta: - model = SubplanMaterial + model = SubprodctionMaterial fields = ['count', 'sort', 'material', 'subproduction', 'is_main'] def create(self, validated_data): - if SubplanMaterial.objects.filter(subproduction=validated_data['subproduction'], is_deleted=False, is_main=True, type=2).exists(): + if SubprodctionMaterial.objects.filter(subproduction=validated_data['subproduction'], is_deleted=False, is_main=True, type=2).exists(): raise ValidationError('主产出只能有1个') - if SubplanMaterial.objects.filter(material=validated_data['material'], subproduction=validated_data['subproduction'], is_deleted=False, type=2).exists(): + if SubprodctionMaterial.objects.filter(material=validated_data['material'], subproduction=validated_data['subproduction'], is_deleted=False, type=2).exists(): raise ValidationError('该物料已存在') validated_data['type']=2 return super().create(validated_data) class OutputMaterialUpdateSerializer(serializers.ModelSerializer): class Meta: - model = SubplanMaterial + model = SubprodctionMaterial fields = ['count', 'sort', 'is_main'] diff --git a/hb_server/apps/mtm/views.py b/hb_server/apps/mtm/views.py index 3dd563c..f657bde 100644 --- a/hb_server/apps/mtm/views.py +++ b/hb_server/apps/mtm/views.py @@ -2,8 +2,8 @@ from django.shortcuts import render from rest_framework.viewsets import ModelViewSet, GenericViewSet from rest_framework.mixins import CreateModelMixin, ListModelMixin, UpdateModelMixin, RetrieveModelMixin, DestroyModelMixin -from apps.mtm.models import Material, Process, RecordForm, RecordFormField, Step, SubplanMaterial, TechDoc, UsedStep, SubProduction -from apps.mtm.serializers import InputMaterialSerializer, InputMaterialUpdateSerializer, MaterialDetailSerializer, MaterialSerializer, MaterialSimpleSerializer, OtherMaterialSerializer, OutputMaterialSerializer, OutputMaterialUpdateSerializer, ProcessSerializer, RecordFormCreateSerializer, RecordFormDetailSerializer, RecordFormFieldCreateSerializer, RecordFormFieldSerializer, RecordFormFieldUpdateSerializer, RecordFormSerializer, RecordFormUpdateSerializer, StepDetailSerializer, StepSerializer, SubProductionSerializer, SubplanMaterialListSerializer, TechDocCreateSerializer, TechDocListSerializer, TechDocUpdateSerializer, UsedStepCreateSerializer, UsedStepListSerializer, UsedStepUpdateSerializer +from apps.mtm.models import Material, Process, RecordForm, RecordFormField, Step, SubprodctionMaterial, TechDoc, UsedStep, SubProduction +from apps.mtm.serializers import InputMaterialSerializer, InputMaterialUpdateSerializer, MaterialDetailSerializer, MaterialSerializer, MaterialSimpleSerializer, OtherMaterialSerializer, OutputMaterialSerializer, OutputMaterialUpdateSerializer, ProcessSerializer, RecordFormCreateSerializer, RecordFormDetailSerializer, RecordFormFieldCreateSerializer, RecordFormFieldSerializer, RecordFormFieldUpdateSerializer, RecordFormSerializer, RecordFormUpdateSerializer, StepDetailSerializer, StepSerializer, SubProductionSerializer, SubprodctionMaterialListSerializer, TechDocCreateSerializer, TechDocListSerializer, TechDocUpdateSerializer, UsedStepCreateSerializer, UsedStepListSerializer, UsedStepUpdateSerializer from apps.system.mixins import CreateUpdateModelAMixin, OptimizationMixin from rest_framework.decorators import action from rest_framework.response import Response @@ -85,14 +85,14 @@ class InputMaterialViewSet(CreateUpdateModelAMixin, ModelViewSet): 输入物料-增删改查 """ perms_map = {'*':'*'} - queryset = SubplanMaterial.objects.select_related('material').filter(type=1) + queryset = SubprodctionMaterial.objects.select_related('material').filter(type=1) serializer_class = InputMaterialSerializer filterset_fields = ['subproduction'] ordering = ['sort', '-create_time'] def get_serializer_class(self): if self.action == 'list': - return SubplanMaterialListSerializer + return SubprodctionMaterialListSerializer elif self.action == 'update': return InputMaterialUpdateSerializer return InputMaterialSerializer @@ -102,14 +102,14 @@ class OutputMaterialViewSet(CreateUpdateModelAMixin, ModelViewSet): 输出物料-增删改查 """ perms_map = {'*':'*'} - queryset = SubplanMaterial.objects.select_related('material').filter(type=2) + queryset = SubprodctionMaterial.objects.select_related('material').filter(type=2) serializer_class = OutputMaterialSerializer filterset_fields = ['subproduction'] ordering = ['sort', '-create_time'] def get_serializer_class(self): if self.action == 'list': - return SubplanMaterialListSerializer + return SubprodctionMaterialListSerializer elif self.action == 'update': return OutputMaterialUpdateSerializer return OutputMaterialSerializer @@ -119,14 +119,14 @@ class OtherMaterialViewSet(CreateUpdateModelAMixin, ListModelMixin, DestroyModel 其他物料-增删改查 """ perms_map = {'*':'*'} - queryset = SubplanMaterial.objects.select_related('material').filter(type=3) + queryset = SubprodctionMaterial.objects.select_related('material').filter(type=3) serializer_class = OutputMaterialSerializer filterset_fields = ['subproduction'] ordering = ['sort', '-create_time'] def get_serializer_class(self): if self.action == 'list': - return SubplanMaterialListSerializer + return SubprodctionMaterialListSerializer return OtherMaterialSerializer class UsedStepViewSet(OptimizationMixin, CreateModelMixin, DestroyModelMixin, ListModelMixin, UpdateModelMixin, GenericViewSet): diff --git a/hb_server/apps/pm/views.py b/hb_server/apps/pm/views.py index 2e649ba..9fc474d 100644 --- a/hb_server/apps/pm/views.py +++ b/hb_server/apps/pm/views.py @@ -5,7 +5,7 @@ from apps.em.models import Equipment from apps.em.serializers import EquipmentSerializer from apps.inm.models import MaterialBatch from apps.inm.serializers import MaterialBatchSerializer -from apps.mtm.models import Step, SubProduction, UsedStep +from apps.mtm.models import Step, SubProduction, SubprodctionMaterial, UsedStep from apps.system.mixins import CreateUpdateModelAMixin from apps.pm.serializers import GenSubPlanSerializer, PickNeedSerializer, PlanDestorySerializer, ProductionPlanCreateFromOrderSerializer, ProductionPlanSerializer, ResourceCalListSerializer, ResourceCalSerializer, SubProductionPlanListSerializer, SubProductionPlanUpdateSerializer, SubProductionProgressSerializer from rest_framework.mixins import CreateModelMixin, ListModelMixin, UpdateModelMixin @@ -87,7 +87,7 @@ class ProductionPlanViewSet(CreateUpdateModelAMixin, ListModelMixin, CreateModel start_date=production_plan.start_date, end_date=production_plan.end_date, workshop=i.process.workshop, process=i.process, create_by=request.user, steps = list(steps)) - for m in SubProduction.objects.filter(subproduction=i, is_deleted=False).order_by('sort'): + for m in SubprodctionMaterial.objects.filter(subproduction=i, is_deleted=False).order_by('sort'): SubProductionProgress.objects.create(material=m.material, type=m.type, count=m.count*production_plan.count, subproduction_plan=instance) production_plan.is_planed=True production_plan.save() From b47b2017de99d407f0f359419889c9c20c8ca41e Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 3 Nov 2021 08:19:51 +0800 Subject: [PATCH 09/10] =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_client/src/styles/index.scss | 2 +- hb_client/src/views/em/detection.vue | 4 +- hb_client/src/views/em/equipment.vue | 4 +- hb_client/src/views/em/record.vue | 4 +- hb_client/src/views/inm/fifo.vue | 6 +- hb_client/src/views/inm/fifodetail.vue | 2 +- hb_client/src/views/inm/inventory.vue | 2 +- hb_client/src/views/inm/materialbatch.vue | 2 +- hb_client/src/views/inm/warehouse.vue | 4 +- hb_client/src/views/monitor/service.vue | 391 ++++++------------- hb_client/src/views/mtm/material.vue | 4 +- hb_client/src/views/mtm/process.vue | 4 +- hb_client/src/views/mtm/stepdo.vue | 2 +- hb_client/src/views/procurement/vendor.vue | 4 +- hb_client/src/views/qm/standard.vue | 4 +- hb_client/src/views/qm/testitem.vue | 4 +- hb_client/src/views/sam/contract.vue | 4 +- hb_client/src/views/sam/customer.vue | 4 +- hb_client/src/views/sam/order.vue | 4 +- hb_client/src/views/sam/review.vue | 4 +- hb_client/src/views/system/dict.vue | 4 +- hb_client/src/views/system/file.vue | 2 +- hb_client/src/views/system/organization.vue | 2 +- hb_client/src/views/system/perm.vue | 2 +- hb_client/src/views/system/position.vue | 2 +- hb_client/src/views/system/role.vue | 2 +- hb_client/src/views/system/task.vue | 2 +- hb_client/src/views/workflow/customfield.vue | 4 +- hb_client/src/views/workflow/index.vue | 4 +- hb_client/src/views/workflow/state.vue | 6 +- hb_client/src/views/workflow/ticket.vue | 2 +- hb_client/src/views/workflow/transitions.vue | 4 +- hb_client/src/views/wpm/testitem.vue | 4 +- hb_server/apps/mtm/views.py | 1 + hb_server/apps/pm/views.py | 5 +- 35 files changed, 188 insertions(+), 317 deletions(-) diff --git a/hb_client/src/styles/index.scss b/hb_client/src/styles/index.scss index 13042e0..73e86dd 100644 --- a/hb_client/src/styles/index.scss +++ b/hb_client/src/styles/index.scss @@ -62,7 +62,7 @@ div:focus { // main-container global css .app-container { - padding: 10px; + padding: 2px; } .el-table--medium td,   .el-table--medium th { diff --git a/hb_client/src/views/em/detection.vue b/hb_client/src/views/em/detection.vue index 89d54b0..4238688 100644 --- a/hb_client/src/views/em/detection.vue +++ b/hb_client/src/views/em/detection.vue @@ -24,13 +24,13 @@ >重置 -
+
新增设备
- + 重置
-
+
新增设备
- + 重置
-
+
新增校准或检定
- +
- -
+ +
新增物料 @@ -153,7 +153,7 @@
- + + diff --git a/hb_client/src/views/inm/fifodetail.vue b/hb_client/src/views/inm/fifodetail.vue index 3f1a7aa..ba70e95 100644 --- a/hb_client/src/views/inm/fifodetail.vue +++ b/hb_client/src/views/inm/fifodetail.vue @@ -25,7 +25,7 @@ >
- +
- + - + 重置 -
+
新增仓库
- +
+ + + +
+ CPU +
+ + + + {{ cpuData.count }} + + + + {{ cpuData.lcount }} + + + + {{ cpuData.percent }}% + + +
+
+ + +
+ 内存 +
+ + + + {{ memoryData.total }}GB + + + + {{ memoryData.used }}GB + + + + {{ memoryData.percent }}% + + +
+
+ + +
+ 硬盘 +
+ + + + {{ diskData.total }}GB + + + + {{ diskData.used }}GB + + + + {{ diskData.percent }}% + + +
+
+
-
- - - - -
- CPU -
- - - 属性 - - - 值 - - - - - 逻辑核心数 - - - {{cpuData.count}} - - - - - 物理核心数 - - - {{cpuData.lcount}} - - - - - 当前使用率 - - - {{cpuData.percent}}% - - -
-
- - -
- 内存 -
- - - 属性 - - - 值 - - - - - 使用率 - - - {{memoryData.percent}}% - - - - - 总内存 - - - {{memoryData.total}} - - - - - 已用内存 - - - {{memoryData.used}} - - -
-
- - -
- 硬盘 -
- - - 属性 - - - 值 - - - - - 已用百分比 - - - {{diskData.percent}}% - - - - - 总大小 - - - {{diskData.total}} - - - - - 已用大小 - - - {{diskData.used}} - - -
-
-
-
- - +
日志列表
@@ -141,45 +83,33 @@ type="primary" icon="el-icon-search" @click="handleFilter" - >搜索 + >搜索 重置 + >重置
- - - - - + + + - +
@@ -188,121 +118,60 @@ - + getServerList() { + getServerList().then((response) => { + if (response.data) { + this.cpuData = response.data.cpu; + this.diskData = response.data.disk; + this.memoryData = response.data.memory; + } + }); + }, + handleClick(row) { + this.dialogVisible = true; + getLog(row.name).then((response) => { + if (response.data) { + this.logdec = response.data.replace(/\n/gm, "
"); + } + }); + }, + }, +}; + \ No newline at end of file diff --git a/hb_client/src/views/mtm/material.vue b/hb_client/src/views/mtm/material.vue index 9eb99f4..b781fc5 100644 --- a/hb_client/src/views/mtm/material.vue +++ b/hb_client/src/views/mtm/material.vue @@ -24,13 +24,13 @@ >重置
-
+
新增物料
- + -
+
新增工序
- + - + 新增 重置
-
+
新增供应商
- + 重置
-
+
新增标准
- + 重置
-
+
新增项目
- + 重置
-
+
新增客户
- + 重置
-
+
新增客户
- + 重置
-
+
新增订单
- + 重置
-
+
新增客户
- + @@ -52,7 +52,7 @@ v-show="listQuery.type" v-loading="listLoading" :data="dictList" - style="width: 100%;margin-top:10px;" + style="width: 100%;margin-top: 2px;" highlight-current-row row-key="id" height="100" diff --git a/hb_client/src/views/system/file.vue b/hb_client/src/views/system/file.vue index b9c70a8..02307b3 100644 --- a/hb_client/src/views/system/file.vue +++ b/hb_client/src/views/system/file.vue @@ -41,7 +41,7 @@ -
+
新增
- + 重置
-
+
新增
- +
-
+
新增
- + 添加修改 - + 搜索
-
+
新增
diff --git a/hb_client/src/views/workflow/transitions.vue b/hb_client/src/views/workflow/transitions.vue index 341fa2b..d0827f6 100644 --- a/hb_client/src/views/workflow/transitions.vue +++ b/hb_client/src/views/workflow/transitions.vue @@ -2,13 +2,13 @@
-
+
新增
- + 重置
-
+
新增项目
- + Date: Wed, 3 Nov 2021 08:49:32 +0800 Subject: [PATCH 10/10] wmateriallist --- hb_server/apps/wpm/serializers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hb_server/apps/wpm/serializers.py b/hb_server/apps/wpm/serializers.py index 0b897c9..bec720e 100644 --- a/hb_server/apps/wpm/serializers.py +++ b/hb_server/apps/wpm/serializers.py @@ -73,5 +73,5 @@ class WMaterialListSerializer(serializers.ModelSerializer): """ material_ = MaterialSimpleSerializer(source='material', read_only=True) class Meta: - model = Material + model = WMaterial fields = '__all__' \ No newline at end of file