From 6f97cb990004405a672d8eb3882e374b7201a0e3 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 18 Feb 2022 15:21:15 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E8=A3=85=E7=AE=B1=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E8=A1=A8=E5=A2=9E=E5=88=A0=E6=94=B9=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apps/mtm/migrations/0047_packitem.py | 37 +++++++++++++++++++ hb_server/apps/mtm/models.py | 13 +++++++ hb_server/apps/mtm/serializers.py | 16 +++++++- hb_server/apps/mtm/urls.py | 3 +- hb_server/apps/mtm/views.py | 23 +++++++++++- 5 files changed, 88 insertions(+), 4 deletions(-) create mode 100644 hb_server/apps/mtm/migrations/0047_packitem.py diff --git a/hb_server/apps/mtm/migrations/0047_packitem.py b/hb_server/apps/mtm/migrations/0047_packitem.py new file mode 100644 index 0000000..5338aee --- /dev/null +++ b/hb_server/apps/mtm/migrations/0047_packitem.py @@ -0,0 +1,37 @@ +# Generated by Django 3.2.9 on 2022-02-18 07:20 + +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', '0046_alter_recordform_type'), + ] + + operations = [ + migrations.CreateModel( + name='PackItem', + 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='删除标记')), + ('name', models.CharField(max_length=100, verbose_name='名称')), + ('specification', models.CharField(blank=True, max_length=100, null=True, verbose_name='型号')), + ('unit', models.CharField(max_length=10, verbose_name='单位')), + ('count', models.PositiveIntegerField(default=1, verbose_name='数量')), + ('sort', models.PositiveIntegerField(default=1, verbose_name='序号')), + ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='packitem_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')), + ('material', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mtm.material', verbose_name='关联成品')), + ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='packitem_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/hb_server/apps/mtm/models.py b/hb_server/apps/mtm/models.py index 9bb007f..cd9be3e 100644 --- a/hb_server/apps/mtm/models.py +++ b/hb_server/apps/mtm/models.py @@ -1,3 +1,4 @@ +from cv2 import meanStdDev from django.db import models from django.db.models.base import Model import django.utils.timezone as timezone @@ -49,6 +50,18 @@ class Material(CommonAModel): def __str__(self): return self.name +class PackItem(CommonAModel): + """ + 装箱项目 + """ + material = models.ForeignKey(Material, verbose_name='关联成品', + on_delete=models.CASCADE) + name = models.CharField('名称', max_length=100) + specification = models.CharField('型号', max_length=100, null=True, blank=True) + unit = models.CharField('单位', max_length=10) + count = models.PositiveIntegerField('数量', default=1) + sort = models.PositiveIntegerField('序号', default=1) + class Process(CommonAModel): """ 工序 diff --git a/hb_server/apps/mtm/serializers.py b/hb_server/apps/mtm/serializers.py index 7d97aa4..603ff5c 100644 --- a/hb_server/apps/mtm/serializers.py +++ b/hb_server/apps/mtm/serializers.py @@ -3,7 +3,7 @@ from rest_framework import serializers from rest_framework.exceptions import ParseError, ValidationError from utils.mixins import DynamicFieldsSerializerMixin -from .models import Material, Process, RecordForm, RecordFormField, Step, SubprodctionMaterial, TechDoc, UsedStep, SubProduction +from .models import Material, PackItem, Process, RecordForm, RecordFormField, Step, SubprodctionMaterial, TechDoc, UsedStep, SubProduction from apps.system.serializers import FileSimpleSerializer, OrganizationSimpleSerializer @@ -24,6 +24,20 @@ class MaterialDetailSerializer(serializers.ModelSerializer): objs = Process.objects.filter(subproduction_process__product=obj, subproduction_process__is_deleted=False, is_deleted=False).distinct().order_by('number') return ProcessSimpleSerializer(instance=objs, many=True).data +class PackItemSerializer(serializers.ModelSerializer): + class Meta: + model = PackItem + fields = '__all__' + +class PackItemCreateSerializer(serializers.ModelSerializer): + class Meta: + model = PackItem + fields = ['material', 'name', 'specification', 'unit', 'count', 'sort'] + +class PackItemUpdateSerializer(serializers.ModelSerializer): + class Meta: + model = PackItem + fields = ['count', 'sort'] class MaterialSimpleSerializer(serializers.ModelSerializer): class Meta: diff --git a/hb_server/apps/mtm/urls.py b/hb_server/apps/mtm/urls.py index 2010738..968f8d3 100644 --- a/hb_server/apps/mtm/urls.py +++ b/hb_server/apps/mtm/urls.py @@ -1,11 +1,12 @@ from django.db.models import base from rest_framework import urlpatterns -from apps.mtm.views import InputMaterialViewSet, MaterialViewSet, OtherMaterialViewSet, OutputMaterialViewSet, ProcessViewSet, RecordFormFieldViewSet, RecordFormViewSet, StepViewSet, SubProductionViewSet, TechDocViewSet, UsedStepViewSet +from apps.mtm.views import InputMaterialViewSet, MaterialViewSet, OtherMaterialViewSet, OutputMaterialViewSet, PackItemViewSet, ProcessViewSet, RecordFormFieldViewSet, RecordFormViewSet, StepViewSet, SubProductionViewSet, TechDocViewSet, UsedStepViewSet from django.urls import path, include from rest_framework.routers import DefaultRouter router = DefaultRouter() router.register('material', MaterialViewSet, basename='material') +router.register('packitem', PackItemViewSet, basename='packitem') router.register('process', ProcessViewSet, basename='process') router.register('step', StepViewSet, basename='step') router.register('subproducation', SubProductionViewSet, basename='subproducation') diff --git a/hb_server/apps/mtm/views.py b/hb_server/apps/mtm/views.py index 5a89d8b..5a3f3e0 100644 --- a/hb_server/apps/mtm/views.py +++ b/hb_server/apps/mtm/views.py @@ -3,8 +3,8 @@ from rest_framework.viewsets import ModelViewSet, GenericViewSet from rest_framework.mixins import CreateModelMixin, ListModelMixin, UpdateModelMixin, RetrieveModelMixin, DestroyModelMixin from apps.mtm.filters import MaterialFilterSet, TechDocFilterset -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, SubProductionCreateUpdateSerializer, SubProductionSerializer, SubprodctionMaterialListSerializer, TechDocCreateSerializer, TechDocListSerializer, TechDocUpdateSerializer, UsedStepCreateSerializer, UsedStepListSerializer, UsedStepUpdateSerializer +from apps.mtm.models import Material, PackItem, Process, RecordForm, RecordFormField, Step, SubprodctionMaterial, TechDoc, UsedStep, SubProduction +from apps.mtm.serializers import InputMaterialSerializer, InputMaterialUpdateSerializer, MaterialDetailSerializer, MaterialSerializer, MaterialSimpleSerializer, OtherMaterialSerializer, OutputMaterialSerializer, OutputMaterialUpdateSerializer, PackItemCreateSerializer, PackItemUpdateSerializer, ProcessSerializer, RecordFormCreateSerializer, RecordFormDetailSerializer, RecordFormFieldCreateSerializer, RecordFormFieldSerializer, RecordFormFieldUpdateSerializer, RecordFormSerializer, RecordFormUpdateSerializer, StepDetailSerializer, StepSerializer, SubProductionCreateUpdateSerializer, 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 @@ -31,6 +31,25 @@ class MaterialViewSet(PageOrNot, CreateUpdateModelAMixin, ModelViewSet): return MaterialDetailSerializer return MaterialSerializer +class PackItemViewSet(CreateUpdateModelAMixin, ModelViewSet): + """ + 装箱项目-增删改查 + """ + perms_map = {'get': '*', 'post': 'packitem_create', + 'put': 'packitem_update', 'delete': 'packitem_delete'} + queryset = PackItem.objects.all() + serializer_class = MaterialSerializer + search_fields = ['name', 'number'] + filterset_fields = ['material'] + ordering = ['sort'] + + def get_serializer_class(self): + if self.action == 'create': + return PackItemCreateSerializer + elif self.action == 'update': + return PackItemUpdateSerializer + return super().get_serializer_class() + class ProcessViewSet(PageOrNot, CreateUpdateModelAMixin, ModelViewSet): """ From d4f59b6d6e128fc3643bdd89193e89fa3e670feb Mon Sep 17 00:00:00 2001 From: shilixia <2309368887@qq.com> Date: Fri, 18 Feb 2022 15:28:54 +0800 Subject: [PATCH 2/6] ceshi --- hb_client/src/api/hrm.js | 9 + hb_client/src/api/pm.js | 16 + hb_client/src/views/personnel/attendance.vue | 111 +++- hb_client/src/views/pm/management.vue | 14 +- hb_client/src/views/pm/plan.vue | 547 +++++++++++-------- hb_client/src/views/pm/plandetails.vue | 14 +- 6 files changed, 464 insertions(+), 247 deletions(-) diff --git a/hb_client/src/api/hrm.js b/hb_client/src/api/hrm.js index beca22f..7157794 100644 --- a/hb_client/src/api/hrm.js +++ b/hb_client/src/api/hrm.js @@ -13,3 +13,12 @@ export function clockRecord(data) { data }) } +//员工离岗说明 +export function notWork(id, data) { + return request({ + url: `/hrm/employee/${id}/not_work_remark/`, + method: 'POST', + data + }) +} + diff --git a/hb_client/src/api/pm.js b/hb_client/src/api/pm.js index 3be5316..f78b62f 100644 --- a/hb_client/src/api/pm.js +++ b/hb_client/src/api/pm.js @@ -105,3 +105,19 @@ export function createConvert(data) { data }) } +//任务终止 +export function planstop(id) { + return request({ + url: `/pm/production_plan/${id}/stop/`, + method: 'put', + + }) +} +//任务启动,暂停 +export function plantoggle(id) { + return request({ + url: `/pm/production_plan/${id}/toggle/`, + method: 'put', + + }) +} \ No newline at end of file diff --git a/hb_client/src/views/personnel/attendance.vue b/hb_client/src/views/personnel/attendance.vue index 2bc5363..d76e1dd 100644 --- a/hb_client/src/views/personnel/attendance.vue +++ b/hb_client/src/views/personnel/attendance.vue @@ -28,21 +28,65 @@ 离岗 + + + + + + - + + /> + + + + + + + + + +
+ 取消 + 确认 +
+
+ +
@@ -55,7 +99,8 @@ 查询
- + + - + + + + + + + +
@@ -123,6 +181,7 @@ diff --git a/hb_client/src/views/pm/management.vue b/hb_client/src/views/pm/management.vue index d40fe31..5a2df27 100644 --- a/hb_client/src/views/pm/management.vue +++ b/hb_client/src/views/pm/management.vue @@ -132,12 +132,14 @@ export default { page_size: 20, }, state_:{ - 10:'制定中', - 20:'已下达', - 30:'已接受', - 40:'生产中', - 50:'已完成', - 60:'军检完成'}, + 10: "制定中", + 20: "已下达", + 30: "已接受", + 40: "生产中", + 50: "已完成", + 60: "军检完成", + 70: "暂停", + 80: "终止"}, listLoading: true, proList: [], diff --git a/hb_client/src/views/pm/plan.vue b/hb_client/src/views/pm/plan.vue index 3b75c6c..c104680 100644 --- a/hb_client/src/views/pm/plan.vue +++ b/hb_client/src/views/pm/plan.vue @@ -16,14 +16,14 @@ type="primary" icon="el-icon-search" @click="handleFilter" - >搜索 + >搜索 重置 + >重置 - + @@ -41,13 +41,17 @@ - + - + @@ -65,13 +69,15 @@ - + @@ -81,18 +87,34 @@ align="center" label="操作" fixed="right" - width="100px" + width="150px" > @@ -105,7 +127,12 @@ @pagination="getplanList" /> - + - + - + - + - + - + - + @@ -146,28 +181,27 @@ - + - @@ -190,17 +224,17 @@ label-position="right" :rules="rule1" > - - + - -
- 取消 + 取消 确认
- +
diff --git a/hb_client/src/views/pm/plandetails.vue b/hb_client/src/views/pm/plandetails.vue index 2988bab..4c4fb99 100644 --- a/hb_client/src/views/pm/plandetails.vue +++ b/hb_client/src/views/pm/plandetails.vue @@ -134,12 +134,14 @@ page_size: 20, }, state_: { - 10: '制定中', - 20: '已下达', - 30: '已接受', - 40: '生产中', - 50: '已完成', - 60: '军检完成' + 10: "制定中", + 20: "已下达", + 30: "已接受", + 40: "生产中", + 50: "已完成", + 60: "军检完成", + 70: "暂停", + 80: "终止", }, actstate_: { 6: "待复检", From 7585796b193f1bbabc0e92da31cc13b505cf111f Mon Sep 17 00:00:00 2001 From: shilixia <2309368887@qq.com> Date: Fri, 18 Feb 2022 15:32:33 +0800 Subject: [PATCH 3/6] xiugai --- hb_client/src/api/hrm.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/hb_client/src/api/hrm.js b/hb_client/src/api/hrm.js index 8a6b551..6a2a20c 100644 --- a/hb_client/src/api/hrm.js +++ b/hb_client/src/api/hrm.js @@ -13,7 +13,6 @@ export function clockRecord(data) { data }) } -<<<<<<< HEAD //员工离岗说明 export function notWork(id, data) { return request({ @@ -23,7 +22,6 @@ export function notWork(id, data) { }) } -======= export function getEmployee(data) { return request({ url: '/hrm/employee/', @@ -31,4 +29,3 @@ export function getEmployee(data) { data }) } ->>>>>>> 802cd214bef263b51b08f9299e5a7bd9ec93b8ef From f34d77e8ef03e429da4c0c7276c94be23e4dc432 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 18 Feb 2022 16:16:32 +0800 Subject: [PATCH 4/6] packitem bug --- hb_server/apps/mtm/views.py | 4 +- .../pm/migrations/0025_auto_20220218_1616.py | 45 +++++++++++++++++++ hb_server/apps/pm/models.py | 26 ++++++----- 3 files changed, 62 insertions(+), 13 deletions(-) create mode 100644 hb_server/apps/pm/migrations/0025_auto_20220218_1616.py diff --git a/hb_server/apps/mtm/views.py b/hb_server/apps/mtm/views.py index 5a3f3e0..4a02aa5 100644 --- a/hb_server/apps/mtm/views.py +++ b/hb_server/apps/mtm/views.py @@ -4,7 +4,7 @@ from rest_framework.mixins import CreateModelMixin, ListModelMixin, UpdateModelM from apps.mtm.filters import MaterialFilterSet, TechDocFilterset from apps.mtm.models import Material, PackItem, Process, RecordForm, RecordFormField, Step, SubprodctionMaterial, TechDoc, UsedStep, SubProduction -from apps.mtm.serializers import InputMaterialSerializer, InputMaterialUpdateSerializer, MaterialDetailSerializer, MaterialSerializer, MaterialSimpleSerializer, OtherMaterialSerializer, OutputMaterialSerializer, OutputMaterialUpdateSerializer, PackItemCreateSerializer, PackItemUpdateSerializer, ProcessSerializer, RecordFormCreateSerializer, RecordFormDetailSerializer, RecordFormFieldCreateSerializer, RecordFormFieldSerializer, RecordFormFieldUpdateSerializer, RecordFormSerializer, RecordFormUpdateSerializer, StepDetailSerializer, StepSerializer, SubProductionCreateUpdateSerializer, SubProductionSerializer, SubprodctionMaterialListSerializer, TechDocCreateSerializer, TechDocListSerializer, TechDocUpdateSerializer, UsedStepCreateSerializer, UsedStepListSerializer, UsedStepUpdateSerializer +from apps.mtm.serializers import InputMaterialSerializer, InputMaterialUpdateSerializer, MaterialDetailSerializer, MaterialSerializer, MaterialSimpleSerializer, OtherMaterialSerializer, OutputMaterialSerializer, OutputMaterialUpdateSerializer, PackItemCreateSerializer, PackItemSerializer, PackItemUpdateSerializer, ProcessSerializer, RecordFormCreateSerializer, RecordFormDetailSerializer, RecordFormFieldCreateSerializer, RecordFormFieldSerializer, RecordFormFieldUpdateSerializer, RecordFormSerializer, RecordFormUpdateSerializer, StepDetailSerializer, StepSerializer, SubProductionCreateUpdateSerializer, 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 @@ -38,7 +38,7 @@ class PackItemViewSet(CreateUpdateModelAMixin, ModelViewSet): perms_map = {'get': '*', 'post': 'packitem_create', 'put': 'packitem_update', 'delete': 'packitem_delete'} queryset = PackItem.objects.all() - serializer_class = MaterialSerializer + serializer_class = PackItemSerializer search_fields = ['name', 'number'] filterset_fields = ['material'] ordering = ['sort'] diff --git a/hb_server/apps/pm/migrations/0025_auto_20220218_1616.py b/hb_server/apps/pm/migrations/0025_auto_20220218_1616.py new file mode 100644 index 0000000..84dfbed --- /dev/null +++ b/hb_server/apps/pm/migrations/0025_auto_20220218_1616.py @@ -0,0 +1,45 @@ +# Generated by Django 3.2.9 on 2022-02-18 08:16 + +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', '0047_packitem'), + ('pm', '0024_auto_20220217_1524'), + ] + + operations = [ + migrations.AddField( + model_name='subproductionplan', + name='first_tester', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='首件检查员'), + ), + migrations.AddField( + model_name='subproductionplan', + name='is_first_testok', + field=models.BooleanField(default=True, verbose_name='首件是否合格'), + ), + migrations.CreateModel( + name='FirstItem', + 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='删除标记')), + ('field_value', models.JSONField(blank=True, null=True, verbose_name='录入值')), + ('is_hidden', models.BooleanField(default=False, verbose_name='是否隐藏')), + ('is_testok', models.BooleanField(blank=True, null=True, verbose_name='是否合格')), + ('form_field', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mtm.recordformfield', verbose_name='关联自定义表格字段')), + ('subproduction_plan', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='item_test_record', to='pm.subproductionplan', verbose_name='关联的子计划')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/hb_server/apps/pm/models.py b/hb_server/apps/pm/models.py index d15141a..f872e60 100644 --- a/hb_server/apps/pm/models.py +++ b/hb_server/apps/pm/models.py @@ -1,5 +1,5 @@ -from io import open_code -from apps.system.models import CommonAModel, Organization + +from apps.system.models import CommonAModel, Organization, User from django.db import models from django.contrib.auth.models import AbstractUser from django.db.models.base import Model @@ -92,19 +92,23 @@ class SubProductionPlan(CommonAModel): is_picked = models.BooleanField('是否已领料', default=False) # wproducts = models.JSONField('半成品表', default=list, blank=True) + is_first_testok = models.BooleanField('首件是否合格', default=True) + first_tester = models.ForeignKey(User, on_delete=models.CASCADE, + verbose_name="首件检查员", null=True, blank=True) + class Meta: verbose_name = '子生产计划' verbose_name_plural = verbose_name -# class FirstItem(BaseModel): -# """ -# 首件确认表记录条目 -# """ -# 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) -# subproduction_plan = models.ForeignKey(SubProductionPlan, verbose_name='关联的子计划', on_delete=models.CASCADE, related_name='item_test_record') +class FirstItem(BaseModel): + """ + 首件确认表记录条目 + """ + 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) + subproduction_plan = models.ForeignKey(SubProductionPlan, verbose_name='关联的子计划', on_delete=models.CASCADE, related_name='item_test_record') class SubProductionProgress(BaseModel): """ From ff386204b52acec76ec9411845d8cbdbe3a66144 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 18 Feb 2022 16:57:09 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E9=A6=96=E4=BB=B6?= =?UTF-8?q?=E6=A3=80=E6=9F=A5=E8=A1=A8first=5Ftest=5Finit=20part1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pm/migrations/0026_auto_20220218_1636.py | 65 +++++++++++++++++++ hb_server/apps/pm/models.py | 17 +++-- hb_server/apps/pm/serializers.py | 29 ++++++++- hb_server/apps/pm/views.py | 19 +++++- .../migrations/0005_user_last_check_time.py | 18 +++++ 5 files changed, 140 insertions(+), 8 deletions(-) create mode 100644 hb_server/apps/pm/migrations/0026_auto_20220218_1636.py create mode 100644 hb_server/apps/system/migrations/0005_user_last_check_time.py diff --git a/hb_server/apps/pm/migrations/0026_auto_20220218_1636.py b/hb_server/apps/pm/migrations/0026_auto_20220218_1636.py new file mode 100644 index 0000000..bde5e8c --- /dev/null +++ b/hb_server/apps/pm/migrations/0026_auto_20220218_1636.py @@ -0,0 +1,65 @@ +# Generated by Django 3.2.9 on 2022-02-18 08:36 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('mtm', '0047_packitem'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('pm', '0025_auto_20220218_1616'), + ] + + operations = [ + migrations.RemoveField( + model_name='subproductionplan', + name='first_tester', + ), + migrations.RemoveField( + model_name='subproductionplan', + name='is_first_testok', + ), + migrations.AddField( + model_name='subproductionplan', + name='first_sign_time', + field=models.DateTimeField(blank=True, null=True, verbose_name='首件签字时间'), + ), + migrations.AddField( + model_name='subproductionplan', + name='form', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='mtm.recordform', verbose_name='首件检查表'), + ), + migrations.AddField( + model_name='subproductionplan', + name='is_testok', + field=models.BooleanField(blank=True, null=True, verbose_name='首件是否合格'), + ), + migrations.AddField( + model_name='subproductionplan', + name='leader_1', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='first_leader_1', to=settings.AUTH_USER_MODEL, verbose_name='工序负责人'), + ), + migrations.AddField( + model_name='subproductionplan', + name='leader_2', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='first_leader_2', to=settings.AUTH_USER_MODEL, verbose_name='技术负责人'), + ), + migrations.AddField( + model_name='subproductionplan', + name='leader_3', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='first_leader_3', to=settings.AUTH_USER_MODEL, verbose_name='总检'), + ), + migrations.AddField( + model_name='subproductionplan', + name='remark', + field=models.CharField(blank=True, max_length=100, null=True, verbose_name='备注'), + ), + migrations.AddField( + model_name='subproductionplan', + name='tester', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='first_tester', to=settings.AUTH_USER_MODEL, verbose_name='首件检查员'), + ), + ] diff --git a/hb_server/apps/pm/models.py b/hb_server/apps/pm/models.py index f872e60..3b4607d 100644 --- a/hb_server/apps/pm/models.py +++ b/hb_server/apps/pm/models.py @@ -7,7 +7,7 @@ import django.utils.timezone as timezone from django.db.models.query import QuerySet from utils.model import SoftModel, BaseModel -from apps.mtm.models import Material, Process, RecordFormField, SubProduction, SubprodctionMaterial +from apps.mtm.models import Material, Process, RecordForm, RecordFormField, SubProduction, SubprodctionMaterial from apps.sam.models import Order class ProductionPlan(CommonAModel): @@ -92,9 +92,18 @@ class SubProductionPlan(CommonAModel): is_picked = models.BooleanField('是否已领料', default=False) # wproducts = models.JSONField('半成品表', default=list, blank=True) - is_first_testok = models.BooleanField('首件是否合格', default=True) - first_tester = models.ForeignKey(User, on_delete=models.CASCADE, - verbose_name="首件检查员", null=True, blank=True) + is_testok = models.BooleanField('首件是否合格', null=True, blank=True) + form = models.ForeignKey(RecordForm, verbose_name='首件检查表', on_delete=models.CASCADE, null=True, blank=True) + tester = models.ForeignKey(User, on_delete=models.CASCADE, + verbose_name="首件检查员", null=True, blank=True, related_name='first_tester') + leader_1 = models.ForeignKey(User, on_delete=models.CASCADE, + verbose_name="工序负责人", null=True, blank=True, related_name='first_leader_1') + leader_2 = models.ForeignKey(User, on_delete=models.CASCADE, + verbose_name="技术负责人", null=True, blank=True, related_name='first_leader_2') + leader_3 = models.ForeignKey(User, on_delete=models.CASCADE, + verbose_name="总检", null=True, blank=True, related_name='first_leader_3') + first_sign_time = models.DateTimeField('首件签字时间', null=True, blank=True) + remark = models.CharField('备注', max_length=100, null=True, blank=True) class Meta: verbose_name = '子生产计划' diff --git a/hb_server/apps/pm/serializers.py b/hb_server/apps/pm/serializers.py index a537ae9..d098511 100644 --- a/hb_server/apps/pm/serializers.py +++ b/hb_server/apps/pm/serializers.py @@ -1,8 +1,9 @@ +from apps.mtm.models import RecordForm from apps.pm.models import ProductionPlan, SubProductionPlan, SubProductionProgress from rest_framework import serializers from apps.sam.serializers import OrderSerializer, OrderSimpleSerializer -from apps.mtm.serializers import MaterialSimpleSerializer, ProcessSimpleSerializer, SubProductionSimpleSerializer -from apps.system.serializers import OrganizationSimpleSerializer +from apps.mtm.serializers import MaterialSimpleSerializer, ProcessSimpleSerializer, RecordFormSimpleSerializer, SubProductionSimpleSerializer +from apps.system.serializers import OrganizationSimpleSerializer, UserSimpleSerializer from utils.mixins import DynamicFieldsSerializerMixin @@ -74,4 +75,26 @@ class SubProductionProgressSerializer(serializers.ModelSerializer): subproduction_plan_ = SubproductionPlanSimpleSerializer(source='subproduction_plan', read_only=True) class Meta: model = SubProductionProgress - fields = '__all__' \ No newline at end of file + fields = '__all__' + + +class FirstTestInitSerializer(serializers.Serializer): + form = serializers.PrimaryKeyRelatedField(queryset=RecordForm.objects.all(), required=True) + +class FirstTestDetailSerializer(serializers.ModelSerializer): + tester_ = UserSimpleSerializer(source='tester', read_only=True) + leader_1_ = UserSimpleSerializer(source='leader_1', read_only=True) + leader_2_ = UserSimpleSerializer(source='leader_2', read_only=True) + leader_3_ = UserSimpleSerializer(source='leader_3', read_only=True) + form_ = RecordFormSimpleSerializer(source='form', read_only=True) + # record_data = TestRecordItemSerializer(source='item_test_record', read_only=True, many=True) + record_data = serializers.SerializerMethodField() + + class Meta: + model = SubProductionPlan + fields = ['id', 'form', 'form_', 'is_testok', 'remark', 'first_sign_time' + 'tester', 'tester_', 'leader_1', 'leader_1_', 'leader_2', + 'leader_2_', 'leader_3', 'leader_3_'] + + def get_record_data(self, obj): + return None \ No newline at end of file diff --git a/hb_server/apps/pm/views.py b/hb_server/apps/pm/views.py index 5df4d6f..e7bcfd2 100644 --- a/hb_server/apps/pm/views.py +++ b/hb_server/apps/pm/views.py @@ -10,7 +10,7 @@ from apps.inm.serializers import MaterialBatchSerializer from apps.mtm.models import Material, Step, SubProduction, SubprodctionMaterial from apps.pm.filters import PlanFilterSet, SubproductionProgressFilterSet from apps.system.mixins import CreateUpdateModelAMixin -from apps.pm.serializers import GenSubPlanSerializer, PickNeedSerializer, PlanDestorySerializer, ProductionPlanCreateFromOrderSerializer, ProductionPlanSerializer, ResourceCalListSerializer, ResourceCalSerializer, ResourceConvertListSerializer, ResourceConvertSerializer, SubProductionPlanListSerializer, SubProductionPlanUpdateSerializer, SubProductionProgressSerializer +from apps.pm.serializers import FirstTestInitSerializer, GenSubPlanSerializer, PickNeedSerializer, PlanDestorySerializer, ProductionPlanCreateFromOrderSerializer, ProductionPlanSerializer, ResourceCalListSerializer, ResourceCalSerializer, ResourceConvertListSerializer, ResourceConvertSerializer, SubProductionPlanListSerializer, SubProductionPlanUpdateSerializer, SubProductionProgressSerializer from rest_framework.mixins import CreateModelMixin, ListModelMixin, RetrieveModelMixin, UpdateModelMixin from apps.pm.models import ProductionPlan, SubProductionProgress, SubProductionPlan from rest_framework.viewsets import GenericViewSet, ModelViewSet @@ -229,6 +229,23 @@ class SubProductionPlanViewSet(CreateUpdateModelAMixin, ListModelMixin, UpdateMo have = MaterialBatchSerializer(instance=objs, many=True).data return Response({'need':need, 'have':have}) + @action(methods=['put'], detail=True, perms_map={'post':'first_test'}, serializer_class=FirstTestInitSerializer) + @transaction.atomic + def first_test_init(self, request, pk=None): + """ + 获取首件检查表 + """ + obj = self.get_object() + if obj.is_testok is None: + rdata = request.data + serializer = self.get_serializer(data=rdata) + serializer.is_valid(raise_exception=True) + form = serializer.validated_data.get('form') + + raise APIException('已经过首件确认') + + + class SubProductionProgressViewSet(ListModelMixin, GenericViewSet): """ 生产进度 diff --git a/hb_server/apps/system/migrations/0005_user_last_check_time.py b/hb_server/apps/system/migrations/0005_user_last_check_time.py new file mode 100644 index 0000000..284e91b --- /dev/null +++ b/hb_server/apps/system/migrations/0005_user_last_check_time.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.9 on 2022-01-25 08:51 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('system', '0004_user_is_atwork'), + ] + + operations = [ + migrations.AddField( + model_name='user', + name='last_check_time', + field=models.DateTimeField(blank=True, null=True, verbose_name='打卡时间'), + ), + ] From 7a1df98575462d51bed80a740602df8b1b372f55 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 18 Feb 2022 17:02:11 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E5=90=8C=E6=AD=A5=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../migrations/0005_user_last_check_time.py | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 hb_server/apps/system/migrations/0005_user_last_check_time.py diff --git a/hb_server/apps/system/migrations/0005_user_last_check_time.py b/hb_server/apps/system/migrations/0005_user_last_check_time.py deleted file mode 100644 index 284e91b..0000000 --- a/hb_server/apps/system/migrations/0005_user_last_check_time.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.9 on 2022-01-25 08:51 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('system', '0004_user_is_atwork'), - ] - - operations = [ - migrations.AddField( - model_name='user', - name='last_check_time', - field=models.DateTimeField(blank=True, null=True, verbose_name='打卡时间'), - ), - ]