diff --git a/hb_client/src/api/hrm.js b/hb_client/src/api/hrm.js index e3378a4..6a2a20c 100644 --- a/hb_client/src/api/hrm.js +++ b/hb_client/src/api/hrm.js @@ -13,6 +13,15 @@ export function clockRecord(data) { data }) } +//员工离岗说明 +export function notWork(id, data) { + return request({ + url: `/hrm/employee/${id}/not_work_remark/`, + method: 'POST', + data + }) +} + export function getEmployee(data) { return request({ url: '/hrm/employee/', 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 @@ 离岗 + + {{ scope.row.not_work_remark }} + {{ scope.row.dept_.name }} + + + + 离岗说明 + + - + + /> + + + + + + + + + + + 取消 + 确认 + + + + @@ -55,7 +99,8 @@ 查询 - + + - + + + + + + + {{ data.day.split('-').slice(1).join('-') }} {{dealMyDate(data.day)}} + + + + + @@ -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 7900b38..b434ba8 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" - >搜索 + >搜索 重置 + >重置 - + {{ scope.row.number }} @@ -41,13 +41,17 @@ {{ scope.row.order_.number }} - {{ scope.row.order_.contract_.number }} + {{ + scope.row.order_.contract_.number + }} {{ scope.row.product_.name }} - {{ scope.row.product_.specification }} + {{ + scope.row.product_.specification + }} {{ scope.row.product_.unit }} @@ -65,13 +69,15 @@ {{ scope.row.end_date }} - {{ scope.row.order_.delivery_date }} + {{ + scope.row.order_.delivery_date + }} - 否 - 是 + 否 + 是 @@ -81,18 +87,34 @@ align="center" label="操作" fixed="right" - width="100px" + width="150px" > - 查看子计划 + 暂停 - 生成子计划 + 启用 + + 终止 + + 查看子计划 + + 生成子计划 @@ -105,7 +127,12 @@ @pagination="getplanList" /> - + {{ scope.row.product_.name }} - {{ scope.row.product_.specification }} + {{ + scope.row.product_.specification + }} {{ scope.row.count }} @@ -180,17 +209,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: "待复检", 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..4a02aa5 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, 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 @@ -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 = PackItemSerializer + 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): """ 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/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 d15141a..3b4607d 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 @@ -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,19 +92,32 @@ class SubProductionPlan(CommonAModel): is_picked = models.BooleanField('是否已领料', default=False) # wproducts = models.JSONField('半成品表', default=list, 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 = '子生产计划' 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): """ 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): """ 生产进度
+ {{ data.day.split('-').slice(1).join('-') }} {{dealMyDate(data.day)}} +