生产操作提交
This commit is contained in:
parent
1b7190a4b6
commit
9588562390
|
@ -75,6 +75,11 @@ class FIFODetailViewSet(ListModelMixin, DestroyModelMixin, GenericViewSet):
|
||||||
ordering_fields = ['create_time']
|
ordering_fields = ['create_time']
|
||||||
ordering = ['-create_time']
|
ordering = ['-create_time']
|
||||||
|
|
||||||
|
def perform_destroy(self, instance):
|
||||||
|
if instance.fifo.is_audited:
|
||||||
|
raise APIException('该出入库记录已通过审核, 无法删除')
|
||||||
|
return super().perform_destroy(instance)
|
||||||
|
|
||||||
class FIFOViewSet(ListModelMixin, GenericViewSet):
|
class FIFOViewSet(ListModelMixin, GenericViewSet):
|
||||||
"""
|
"""
|
||||||
出入库记录
|
出入库记录
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
from django.db.models.enums import Choices
|
||||||
|
from apps.mtm.models import RecordForm, RecordFormField
|
||||||
from apps.system.models import CommonAModel, File
|
from apps.system.models import CommonAModel, File
|
||||||
|
from utils.model import BaseModel
|
||||||
# Create your models here.
|
# Create your models here.
|
||||||
class Standard(CommonAModel):
|
class Standard(CommonAModel):
|
||||||
"""
|
"""
|
||||||
|
@ -49,4 +52,17 @@ class TestRecord(CommonAModel):
|
||||||
record_data = models.JSONField('记录数据', default=dict, blank=True)
|
record_data = models.JSONField('记录数据', default=dict, blank=True)
|
||||||
is_testok = models.BooleanField('是否合格', default=True)
|
is_testok = models.BooleanField('是否合格', default=True)
|
||||||
fifo_detail = models.ForeignKey('inm.fifodetail', verbose_name='关联的出入库批次', on_delete=models.CASCADE, null=True, blank=True)
|
fifo_detail = models.ForeignKey('inm.fifodetail', verbose_name='关联的出入库批次', on_delete=models.CASCADE, null=True, blank=True)
|
||||||
|
|
||||||
|
|
||||||
|
class TestRecordDetail(BaseModel):
|
||||||
|
"""
|
||||||
|
记录表格字段值
|
||||||
|
"""
|
||||||
|
form_field = models.ForeignKey(RecordFormField, verbose_name='关联字段', on_delete=models.CASCADE, db_constraint=False)
|
||||||
|
field_name = models.CharField('字段名', max_length=50)
|
||||||
|
field_key = models.CharField('字段标识', max_length=50)
|
||||||
|
field_type = models.IntegerField('字段类型', choices=RecordForm.type_choices)
|
||||||
|
field_value = models.JSONField('录入值', default=dict, blank=True)
|
||||||
|
need_judge = models.BooleanField('是否需要判定', default=False)
|
||||||
|
is_testok = models.BooleanField('是否合格', default=True)
|
||||||
|
test_record = models.ForeignKey(TestRecord, verbose_name='关联的检测记录', on_delete=models.CASCADE)
|
|
@ -0,0 +1,114 @@
|
||||||
|
# Generated by Django 3.2.6 on 2021-11-08 01:01
|
||||||
|
|
||||||
|
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', '0028_auto_20211102_1707'),
|
||||||
|
('wpm', '0004_auto_20211104_0914'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='WProductAction',
|
||||||
|
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='删除标记')),
|
||||||
|
('wproducts', models.JSONField(blank=True, default=list, verbose_name='关联产品ID列表')),
|
||||||
|
('remark', models.CharField(blank=True, max_length=200, null=True, verbose_name='操作备注')),
|
||||||
|
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='wproductaction_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
|
||||||
|
('m_state', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='mtm.material', verbose_name='操作时的物料状态')),
|
||||||
|
('p_state', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='mtm.step', verbose_name='操作步骤')),
|
||||||
|
('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='wproductaction_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'abstract': False,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='WProductMaterial',
|
||||||
|
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='删除标记')),
|
||||||
|
('type', models.IntegerField(choices=[(1, '消耗'), (2, '产出')], default=0, verbose_name='类型')),
|
||||||
|
('count', models.IntegerField(verbose_name='消耗或产出数量')),
|
||||||
|
('material', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='mtm.material', verbose_name='可能产出的副产品')),
|
||||||
|
('wmaterial', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='wpm.wmaterial', verbose_name='关联的车间物料')),
|
||||||
|
('wproduct_action', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='wpm.wproductaction', verbose_name='关联的生产操作')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'abstract': False,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='WProductRecordDetail',
|
||||||
|
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_name', models.CharField(max_length=50, verbose_name='字段名')),
|
||||||
|
('field_key', models.CharField(max_length=50, verbose_name='字段标识')),
|
||||||
|
('field_type', models.IntegerField(choices=[(1, '生产记录'), (2, '检验记录')], verbose_name='字段类型')),
|
||||||
|
('field_value', models.JSONField(blank=True, default=dict, verbose_name='录入值')),
|
||||||
|
('sort', models.IntegerField(default=1, verbose_name='排序号')),
|
||||||
|
('form_field', models.ForeignKey(db_constraint=False, on_delete=django.db.models.deletion.CASCADE, to='mtm.recordformfield', verbose_name='关联字段')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'abstract': False,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
migrations.DeleteModel(
|
||||||
|
name='WProductFlow',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='wproductrecord',
|
||||||
|
name='data',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='wproductrecord',
|
||||||
|
name='record_form',
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='wproduct',
|
||||||
|
name='is_executed',
|
||||||
|
field=models.BooleanField(default=False, verbose_name='子工序是否已执行'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='wproductrecord',
|
||||||
|
name='form',
|
||||||
|
field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='mtm.recordform', verbose_name='所用的生产记录表格'),
|
||||||
|
preserve_default=False,
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='wproduct',
|
||||||
|
name='act_state',
|
||||||
|
field=models.IntegerField(choices=[(1, '生产中'), (2, '待检测'), (3, '已合格')], default=0, verbose_name='进行状态'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='wproduct',
|
||||||
|
name='parent',
|
||||||
|
field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.CASCADE, to='wpm.wproduct', verbose_name='上一级'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='wproductrecorddetail',
|
||||||
|
name='wproduct_record',
|
||||||
|
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='wpm.wproductrecord', verbose_name='关联的生产记录'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='wproductrecord',
|
||||||
|
name='wproduct_action',
|
||||||
|
field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='wpm.wproductaction', verbose_name='关联的生产操作'),
|
||||||
|
preserve_default=False,
|
||||||
|
),
|
||||||
|
]
|
|
@ -6,7 +6,7 @@ from apps.pm.models import ProductionPlan, SubProductionPlan
|
||||||
from apps.system.models import CommonAModel, CommonBModel, Organization, User, Dict, File
|
from apps.system.models import CommonAModel, CommonBModel, Organization, User, Dict, File
|
||||||
from utils.model import SoftModel, BaseModel
|
from utils.model import SoftModel, BaseModel
|
||||||
from simple_history.models import HistoricalRecords
|
from simple_history.models import HistoricalRecords
|
||||||
from apps.mtm.models import Material, Process, Step, RecordForm
|
from apps.mtm.models import Material, Process, RecordFormField, Step, RecordForm
|
||||||
|
|
||||||
class WMaterial(BaseModel):
|
class WMaterial(BaseModel):
|
||||||
"""
|
"""
|
||||||
|
@ -44,7 +44,7 @@ class WProductAction(CommonAModel):
|
||||||
生产操作
|
生产操作
|
||||||
"""
|
"""
|
||||||
wproducts = models.JSONField('关联产品ID列表', default=list, blank=True)
|
wproducts = models.JSONField('关联产品ID列表', default=list, blank=True)
|
||||||
m_state = models.ForeignKey(Material, verbose_name='操作时的物料状态', on_delete=models.CASCADE)
|
m_state = models.ForeignKey(Material, verbose_name='操作时的物料状态', on_delete=models.CASCADE, null=True, blank=True)
|
||||||
p_state = models.ForeignKey(Step, verbose_name='操作步骤', on_delete=models.CASCADE, null=True, blank=True)
|
p_state = models.ForeignKey(Step, verbose_name='操作步骤', on_delete=models.CASCADE, null=True, blank=True)
|
||||||
remark = models.CharField('操作备注', max_length=200, null=True, blank=True)
|
remark = models.CharField('操作备注', max_length=200, null=True, blank=True)
|
||||||
|
|
||||||
|
@ -58,7 +58,8 @@ class WProductMaterial(BaseModel):
|
||||||
)
|
)
|
||||||
type = models.IntegerField('类型', default=0, choices=type_choices)
|
type = models.IntegerField('类型', default=0, choices=type_choices)
|
||||||
wproduct_action = models.ForeignKey(WProductAction, verbose_name='关联的生产操作', on_delete=models.CASCADE)
|
wproduct_action = models.ForeignKey(WProductAction, verbose_name='关联的生产操作', on_delete=models.CASCADE)
|
||||||
material = models.ForeignKey(Material, verbose_name='关联的物料', on_delete=models.CASCADE)
|
wmaterial = models.ForeignKey(WMaterial, verbose_name='关联的车间物料', on_delete=models.CASCADE, null=True, blank=True)
|
||||||
|
material = models.ForeignKey(Material, verbose_name='可能产出的副产品', on_delete=models.CASCADE, null=True, blank=True)
|
||||||
count = models.IntegerField('消耗或产出数量')
|
count = models.IntegerField('消耗或产出数量')
|
||||||
|
|
||||||
class WProductRecord(CommonAModel):
|
class WProductRecord(CommonAModel):
|
||||||
|
@ -66,5 +67,18 @@ class WProductRecord(CommonAModel):
|
||||||
记录表格
|
记录表格
|
||||||
"""
|
"""
|
||||||
form = models.ForeignKey(RecordForm, verbose_name='所用的生产记录表格', on_delete=models.CASCADE)
|
form = models.ForeignKey(RecordForm, verbose_name='所用的生产记录表格', on_delete=models.CASCADE)
|
||||||
record_data = models.JSONField('记录的数据', default=dict, blank=True)
|
|
||||||
wproduct_action = models.ForeignKey(WProductAction, verbose_name='关联的生产操作', on_delete=models.CASCADE)
|
wproduct_action = models.ForeignKey(WProductAction, verbose_name='关联的生产操作', on_delete=models.CASCADE)
|
||||||
|
|
||||||
|
|
||||||
|
class WProductRecordDetail(BaseModel):
|
||||||
|
"""
|
||||||
|
记录表格字段值
|
||||||
|
"""
|
||||||
|
form_field = models.ForeignKey(RecordFormField, verbose_name='关联字段', on_delete=models.CASCADE, db_constraint=False)
|
||||||
|
field_name = models.CharField('字段名', max_length=50)
|
||||||
|
field_key = models.CharField('字段标识', max_length=50)
|
||||||
|
field_type = models.IntegerField('字段类型', choices=RecordForm.type_choices)
|
||||||
|
field_value = models.JSONField('录入值', default=dict, blank=True)
|
||||||
|
sort = models.IntegerField('排序号', default=1)
|
||||||
|
wproduct_record = models.ForeignKey(WProductRecord, verbose_name='关联的生产记录', on_delete=models.CASCADE)
|
||||||
|
|
||||||
|
|
|
@ -2,13 +2,13 @@ from rest_framework import serializers
|
||||||
from rest_framework.serializers import ModelSerializer
|
from rest_framework.serializers import ModelSerializer
|
||||||
from apps.inm.models import FIFO, FIFODetail, MaterialBatch, WareHouse
|
from apps.inm.models import FIFO, FIFODetail, MaterialBatch, WareHouse
|
||||||
from apps.inm.signals import update_inm
|
from apps.inm.signals import update_inm
|
||||||
from apps.mtm.models import Material, Step
|
from apps.mtm.models import Material, RecordForm, Step
|
||||||
from apps.mtm.serializers import MaterialSimpleSerializer
|
from apps.mtm.serializers import MaterialSimpleSerializer
|
||||||
|
|
||||||
from apps.pm.models import SubProductionPlan, SubProductionProgress
|
from apps.pm.models import SubProductionPlan, SubProductionProgress
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
|
|
||||||
from apps.wpm.models import WMaterial, WProduct
|
from apps.wpm.models import WMaterial, WProduct, WProductRecord
|
||||||
|
|
||||||
class PickDetailSerializer(serializers.Serializer):
|
class PickDetailSerializer(serializers.Serializer):
|
||||||
material = serializers.PrimaryKeyRelatedField(queryset=Material.objects.all(), label="物料ID")
|
material = serializers.PrimaryKeyRelatedField(queryset=Material.objects.all(), label="物料ID")
|
||||||
|
@ -81,8 +81,41 @@ class WMaterialListSerializer(serializers.ModelSerializer):
|
||||||
fields = '__all__'
|
fields = '__all__'
|
||||||
|
|
||||||
|
|
||||||
class DoFormInitSerializer(serializers.Serializer):
|
class WActionInitSerializer(serializers.Serializer):
|
||||||
step = serializers.PrimaryKeyRelatedField(queryset=Step.objects.all(), label="子工序ID")
|
step = serializers.PrimaryKeyRelatedField(queryset=Step.objects.all(), label="子工序ID")
|
||||||
subproduction_plan = serializers.PrimaryKeyRelatedField(queryset=SubProductionPlan.objects.all(), label="子计划ID", required=False)
|
subproduction_plan = serializers.PrimaryKeyRelatedField(queryset=SubProductionPlan.objects.all(), label="子计划ID")
|
||||||
wproducts = serializers.ListField(child=
|
wproducts = serializers.ListField(child=
|
||||||
serializers.PrimaryKeyRelatedField(queryset=WProduct.objects.all()), label="半成品ID列表", required=False)
|
serializers.PrimaryKeyRelatedField(queryset=WProduct.objects.all()), label="半成品ID列表", required=False)
|
||||||
|
|
||||||
|
class DoInputSerializer(serializers.Serializer):
|
||||||
|
id = serializers.PrimaryKeyRelatedField(queryset=WMaterial.objects.all(), label='车间物料ID')
|
||||||
|
count_input = serializers.IntegerField(min_value=0, label='消耗数量')
|
||||||
|
|
||||||
|
class DoOutputSerializer(serializers.Serializer):
|
||||||
|
material = serializers.PrimaryKeyRelatedField(queryset=Material.objects.all(), label='物料ID')
|
||||||
|
count_output = serializers.IntegerField(min_value=0, label='产出数量')
|
||||||
|
|
||||||
|
class WProductRecordDetailSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = WProductRecord
|
||||||
|
fields = ['form_field', 'field_value']
|
||||||
|
|
||||||
|
class WProductRecordSerializer(serializers.ModelSerializer):
|
||||||
|
record_data = WProductRecordDetailSerializer(many=True)
|
||||||
|
class Meta:
|
||||||
|
model = WProductRecord
|
||||||
|
fields = ['form', 'record_data']
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class WActionSubmitSerializer(serializers.Serializer):
|
||||||
|
step = serializers.PrimaryKeyRelatedField(queryset=Step.objects.all(), label="子工序ID")
|
||||||
|
subproduction_plan = serializers.PrimaryKeyRelatedField(queryset=SubProductionPlan.objects.all(), label="子计划ID")
|
||||||
|
wproducts = serializers.ListField(child=
|
||||||
|
serializers.PrimaryKeyRelatedField(queryset=WProduct.objects.all()), label="半成品ID列表", required=False)
|
||||||
|
input = DoInputSerializer(many=True, required=False)
|
||||||
|
output = DoOutputSerializer(many=True, required=False)
|
||||||
|
forms = WProductRecordSerializer(many=True, required=False)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -3,13 +3,14 @@ from rest_framework import urlpatterns
|
||||||
from django.urls import path, include
|
from django.urls import path, include
|
||||||
from rest_framework.routers import DefaultRouter
|
from rest_framework.routers import DefaultRouter
|
||||||
|
|
||||||
from apps.wpm.views import DoFormInit, WMaterialViewSet, WPlanViewSet
|
from apps.wpm.views import DoFormInit, DoFormSubmit, WMaterialViewSet, WPlanViewSet
|
||||||
|
|
||||||
router = DefaultRouter()
|
router = DefaultRouter()
|
||||||
router.register('wmaterial', WMaterialViewSet, basename='wmaterial')
|
router.register('wmaterial', WMaterialViewSet, basename='wmaterial')
|
||||||
router.register('subplan', WPlanViewSet, basename='wplan')
|
router.register('subplan', WPlanViewSet, basename='wplan')
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('do/init/', DoFormInit.as_view()),
|
path('do/init/', DoFormInit.as_view()),
|
||||||
|
path('do/submit/', DoFormSubmit.as_view()),
|
||||||
path('', include(router.urls)),
|
path('', include(router.urls)),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
|
@ -1,19 +1,20 @@
|
||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
from rest_framework.generics import CreateAPIView, GenericAPIView
|
from rest_framework.generics import CreateAPIView, GenericAPIView
|
||||||
from rest_framework.mixins import ListModelMixin
|
from rest_framework.mixins import ListModelMixin
|
||||||
|
from rest_framework.utils import serializer_helpers
|
||||||
from rest_framework.utils.field_mapping import get_relation_kwargs
|
from rest_framework.utils.field_mapping import get_relation_kwargs
|
||||||
from rest_framework.views import APIView
|
from rest_framework.views import APIView
|
||||||
from rest_framework.viewsets import GenericViewSet, ModelViewSet
|
from rest_framework.viewsets import GenericViewSet, ModelViewSet
|
||||||
from apps.mtm.models import RecordForm
|
from apps.mtm.models import Material, RecordForm, Step
|
||||||
from apps.mtm.serializers import RecordFormDetailSerializer
|
from apps.mtm.serializers import RecordFormDetailSerializer
|
||||||
from apps.pm.models import SubProductionPlan, SubProductionProgress
|
from apps.pm.models import SubProductionPlan, SubProductionProgress
|
||||||
from apps.pm.serializers import SubProductionPlanListSerializer, SubProductionPlanUpdateSerializer
|
from apps.pm.serializers import SubProductionPlanListSerializer, SubProductionPlanUpdateSerializer
|
||||||
|
|
||||||
from apps.system.mixins import CreateUpdateModelAMixin, OptimizationMixin
|
from apps.system.mixins import CreateUpdateModelAMixin, OptimizationMixin
|
||||||
from rest_framework.decorators import action
|
from rest_framework.decorators import action
|
||||||
from apps.wpm.models import WMaterial
|
from apps.wpm.models import WMaterial, WProduct, WProductAction, WProductMaterial, WProductRecord, WProductRecordDetail
|
||||||
|
|
||||||
from apps.wpm.serializers import DoFormInitSerializer, PickSerializer, WMaterialListSerializer
|
from apps.wpm.serializers import PickSerializer, WActionInitSerializer, WActionSubmitSerializer, WMaterialListSerializer
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
# Create your views here.
|
# Create your views here.
|
||||||
class WPlanViewSet(ListModelMixin, GenericViewSet):
|
class WPlanViewSet(ListModelMixin, GenericViewSet):
|
||||||
|
@ -49,29 +50,42 @@ class WMaterialViewSet(CreateUpdateModelAMixin, ListModelMixin, GenericViewSet):
|
||||||
serializer.save()
|
serializer.save()
|
||||||
return Response()
|
return Response()
|
||||||
|
|
||||||
class DoFormInit(APIView):
|
class DoFormInit(CreateAPIView, GenericAPIView):
|
||||||
perms_map={'*':'*'}
|
perms_map={'*':'*'}
|
||||||
|
serializer_class=WActionInitSerializer
|
||||||
def post(self, request, format=None):
|
def post(self, request, format=None):
|
||||||
"""
|
"""
|
||||||
调用操作表单
|
调用操作表单
|
||||||
"""
|
"""
|
||||||
serializer = DoFormInitSerializer(data=request.data)
|
data = request.data
|
||||||
|
serializer = WActionInitSerializer(data=data)
|
||||||
serializer.is_valid(raise_exception=True)
|
serializer.is_valid(raise_exception=True)
|
||||||
vdata = serializer.validated_data
|
vdata = serializer.validated_data
|
||||||
ret = {}
|
ret = {}
|
||||||
|
ret['step'] = data['step']
|
||||||
|
ret['subproduction_plan'] = data['subproduction_plan']
|
||||||
|
if 'wproducts' in data and data['wproducts']:
|
||||||
|
ret['wproducts'] = data['wproducts']
|
||||||
|
else:
|
||||||
|
ret['wproducts'] = []
|
||||||
# 调出该子计划现有物料
|
# 调出该子计划现有物料
|
||||||
ret['input'] = list(WMaterial.objects.filter(subproduction_plan=vdata['subproduction_plan'])\
|
ret['input'] = list(WMaterial.objects.filter(subproduction_plan=vdata['subproduction_plan'])\
|
||||||
.values('material', 'material__name', 'count'))
|
.values('id', 'material', 'material__name', 'count', 'material__number', 'batch'))
|
||||||
for i in ret['input']:
|
for i in ret['input']:
|
||||||
i['count_input'] = 0
|
i['count_input'] = 0
|
||||||
# 需要输出的物料
|
# 需要输出的物料
|
||||||
# 如果传入半成品列表就不需要
|
# 如果传入半成品列表就不需要
|
||||||
if not 'wproducts' in vdata:
|
if ret['wproducts']:
|
||||||
ret['output'] = list(SubProductionProgress.objects.filter(subproduction_plan=vdata['subproduction_plan'], type=2)\
|
# 排除wproduct列表
|
||||||
.values('material', 'material__name'))
|
# mids = WProduct.objects.filter(pk__in=data['wproducts']).values_list('m_state', flat=True)
|
||||||
for i in ret['output']:
|
o_objs = SubProductionProgress.objects.filter(
|
||||||
i['count_output']=0
|
subproduction_plan=vdata['subproduction_plan'], type=2).exclude(is_main=True)
|
||||||
|
else:
|
||||||
|
o_objs = SubProductionProgress.objects.filter(
|
||||||
|
subproduction_plan=vdata['subproduction_plan'], type=2)
|
||||||
|
ret['output'] = list(o_objs.values('material', 'material__name', 'material__number'))
|
||||||
|
for i in ret['output']:
|
||||||
|
i['count_output']=0
|
||||||
ret['forms'] = []
|
ret['forms'] = []
|
||||||
forms = RecordForm.objects.filter(step=vdata['step'], type=1)
|
forms = RecordForm.objects.filter(step=vdata['step'], type=1)
|
||||||
if forms.exists():
|
if forms.exists():
|
||||||
|
@ -79,8 +93,92 @@ class DoFormInit(APIView):
|
||||||
return Response(ret)
|
return Response(ret)
|
||||||
|
|
||||||
|
|
||||||
class DoFormSubmit(APIView):
|
class DoFormSubmit(CreateAPIView, GenericAPIView):
|
||||||
|
perms_map={'*':'*'}
|
||||||
|
serializer_class = WActionSubmitSerializer
|
||||||
def post(self, request, format=None):
|
def post(self, request, format=None):
|
||||||
"""
|
"""
|
||||||
提交操作表单
|
提交操作表单
|
||||||
"""
|
"""
|
||||||
|
data = request.data
|
||||||
|
serializer = WActionInitSerializer(data=data)
|
||||||
|
serializer.is_valid(raise_exception=True)
|
||||||
|
vdata = serializer.validated_data #校验之后的数据
|
||||||
|
# 创建一个生产操作记录
|
||||||
|
action_obj = WProductAction()
|
||||||
|
action_obj.p_state = vdata['step']
|
||||||
|
if 'wproducts' in data and data['wproducts']:
|
||||||
|
action_obj.wproducts = data['wproducts']
|
||||||
|
action_obj.m_state = vdata[0].m_state
|
||||||
|
action_obj.remark = data['remark'] # 操作备注
|
||||||
|
action_obj.create_by = request.user
|
||||||
|
action_obj.save()
|
||||||
|
|
||||||
|
# 保存物料消耗
|
||||||
|
for i in vdata['input']:
|
||||||
|
if i['count_input']: #如果有消耗
|
||||||
|
i_wmat = i['id']
|
||||||
|
WProductMaterial.objects.create(type=1, wproduct_action=action_obj,
|
||||||
|
wmaterial= i_wmat, count=i['count_input'])
|
||||||
|
# 更新车间物料
|
||||||
|
i_wmat.count = i_wmat.count- i['count_input']
|
||||||
|
i_wmat.save()
|
||||||
|
# 更新子计划物料消耗情况
|
||||||
|
sp = SubProductionProgress.objects.get(subproduction_plan=i_wmat.subproduction_plan,
|
||||||
|
material=i_wmat.material)
|
||||||
|
sp.count_real = sp.count_real + i['count_input']
|
||||||
|
sp.save()
|
||||||
|
|
||||||
|
# 物料产出
|
||||||
|
if 'output' in data and data['output']:
|
||||||
|
for i in vdata['output']: # 已经序列化好的数据
|
||||||
|
ma = i['material']
|
||||||
|
if ma.is_main:
|
||||||
|
# 计划开始, 第一步切割创建动态产品
|
||||||
|
wpr = dict(m_state=ma, p_state=vdata['step'],
|
||||||
|
act_state=1, is_executed=True, remark='',
|
||||||
|
subproduction_plan=vdata['subproduction_plan'],
|
||||||
|
production_plan=vdata['subproduction_plan'].production_plan)
|
||||||
|
for x in range(i['count_output']):
|
||||||
|
WProduct.objects.create(**wpr)
|
||||||
|
else:
|
||||||
|
# 更新操作消耗物料表
|
||||||
|
WProductMaterial.objects.create(type=2, wproduct_action=action_obj,
|
||||||
|
material= ma, count=i['count_output'])
|
||||||
|
# 更新车间物料表
|
||||||
|
ins, _ = WMaterial.objects.get_or_create(subproduction_plan=vdata['subproduction_plan'],
|
||||||
|
material=ma)
|
||||||
|
ins.count = ins.count + i['count_output']
|
||||||
|
ins.save()
|
||||||
|
# 更新子计划进度表
|
||||||
|
sp = SubProductionProgress.objects.get(subproduction_plan=vdata['subproduction_plan'],
|
||||||
|
material=ma)
|
||||||
|
sp.count_real = sp.count_real + i['count_input']
|
||||||
|
sp.save()
|
||||||
|
|
||||||
|
# 更新主产出
|
||||||
|
if 'wproducts' in data and data['wproducts']:
|
||||||
|
wproducts = WProduct.objects.filter(pk__in=data['wproducts'])
|
||||||
|
wproducts.update(p_state=vdata['step'], is_executed=True)
|
||||||
|
|
||||||
|
# 保存自定义表单结果
|
||||||
|
for i in vdata['forms']:
|
||||||
|
wr = WProductRecord()
|
||||||
|
wr.form = i['form']
|
||||||
|
wr.create_by = request.user
|
||||||
|
wr.wproduct_action = action_obj
|
||||||
|
wr.save()
|
||||||
|
wrds = []
|
||||||
|
for m in i['record_data']: # 保存记录详情
|
||||||
|
form_field = m['form_field']
|
||||||
|
m['field_name'] = form_field.field_name
|
||||||
|
m['field_key'] = form_field.field_key
|
||||||
|
m['field_type'] = form_field.field_type
|
||||||
|
m['field_value'] = form_field.field_value
|
||||||
|
m['sort'] = form_field.sort
|
||||||
|
m['wproduct_record'] = wr
|
||||||
|
wrds.append(WProductRecordDetail(**m))
|
||||||
|
WProductRecordDetail.objects.bulk_create(wrds)
|
||||||
|
return Response()
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue