领料更新,操作表单更新
This commit is contained in:
parent
2d624a1be1
commit
a78a10c3fa
|
@ -2,7 +2,7 @@ from django.db import models
|
||||||
from django.db.models.base import Model
|
from django.db.models.base import Model
|
||||||
import django.utils.timezone as timezone
|
import django.utils.timezone as timezone
|
||||||
from django.db.models.query import QuerySet
|
from django.db.models.query import QuerySet
|
||||||
from apps.system.models import CommonAModel, CommonBModel, Organization, User, Dict, File
|
from apps.system.models import CommonADModel, 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.system.models import Organization
|
from apps.system.models import Organization
|
||||||
|
@ -178,7 +178,7 @@ class SubProduction(CommonAModel):
|
||||||
verbose_name = '产品生产工序'
|
verbose_name = '产品生产工序'
|
||||||
verbose_name_plural = verbose_name
|
verbose_name_plural = verbose_name
|
||||||
|
|
||||||
class SubprodctionMaterial(CommonAModel):
|
class SubprodctionMaterial(CommonADModel):
|
||||||
"""
|
"""
|
||||||
输入/输出物料/工具工装
|
输入/输出物料/工具工装
|
||||||
"""
|
"""
|
||||||
|
@ -198,20 +198,20 @@ class SubprodctionMaterial(CommonAModel):
|
||||||
sort = models.IntegerField('排序号', default=1)
|
sort = models.IntegerField('排序号', default=1)
|
||||||
|
|
||||||
|
|
||||||
class UsedStep(CommonAModel):
|
class UsedStep(CommonADModel):
|
||||||
"""
|
"""
|
||||||
涉及的生产子工序
|
涉及的生产子工序
|
||||||
"""
|
"""
|
||||||
step = models.ForeignKey(Step, verbose_name='子工序', on_delete=models.CASCADE, related_name='usedstep')
|
step = models.ForeignKey(Step, verbose_name='子工序', on_delete=models.CASCADE, related_name='usedstep')
|
||||||
remark = models.TextField('生产备注', null=True, blank=True)
|
remark = models.TextField('生产备注', null=True, blank=True)
|
||||||
subproduction = models.ForeignKey(SubProduction, verbose_name='关联生产分解', on_delete=models.CASCADE)
|
subproduction = models.ForeignKey(SubProduction, verbose_name='关联生产分解', on_delete=models.CASCADE, related_name='usedstep_subproduction')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = '产品生产子工序'
|
verbose_name = '产品生产子工序'
|
||||||
verbose_name_plural = verbose_name
|
verbose_name_plural = verbose_name
|
||||||
|
|
||||||
|
|
||||||
class TechDoc(CommonAModel):
|
class TechDoc(CommonADModel):
|
||||||
"""
|
"""
|
||||||
技术文件
|
技术文件
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -159,7 +159,7 @@ class SubProductionPlanViewSet(CreateUpdateModelAMixin, ListModelMixin, UpdateMo
|
||||||
serializer = SubProductionProgressSerializer(instance=instance, many=True)
|
serializer = SubProductionProgressSerializer(instance=instance, many=True)
|
||||||
return Response(serializer.data)
|
return Response(serializer.data)
|
||||||
|
|
||||||
@action(methods=['post'], detail=True, perms_map={'post':'*'}, serializer_class=PickNeedSerializer)
|
@action(methods=['post'], detail=True, perms_map={'post':'*'}, serializer_class=serializers.Serializer)
|
||||||
def pick_need(self, request, pk=None):
|
def pick_need(self, request, pk=None):
|
||||||
"""
|
"""
|
||||||
领料需求清单/库存数
|
领料需求清单/库存数
|
||||||
|
|
|
@ -177,6 +177,18 @@ class CommonAModel(SoftModel):
|
||||||
class Meta:
|
class Meta:
|
||||||
abstract = True
|
abstract = True
|
||||||
|
|
||||||
|
class CommonADModel(BaseModel):
|
||||||
|
"""
|
||||||
|
业务用基本表A,包含create_by, update_by字段, 硬删除
|
||||||
|
"""
|
||||||
|
create_by = models.ForeignKey(
|
||||||
|
User, null=True, blank=True, on_delete=models.SET_NULL, verbose_name='创建人', related_name= '%(class)s_create_by')
|
||||||
|
update_by = models.ForeignKey(
|
||||||
|
User, null=True, blank=True, on_delete=models.SET_NULL, verbose_name='最后编辑人', related_name= '%(class)s_update_by')
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
abstract = True
|
||||||
|
|
||||||
class CommonBModel(SoftModel):
|
class CommonBModel(SoftModel):
|
||||||
"""
|
"""
|
||||||
业务用基本表B,包含create_by, update_by, belong_dept字段
|
业务用基本表B,包含create_by, update_by, belong_dept字段
|
||||||
|
@ -191,6 +203,19 @@ class CommonBModel(SoftModel):
|
||||||
class Meta:
|
class Meta:
|
||||||
abstract = True
|
abstract = True
|
||||||
|
|
||||||
|
class CommonBDModel(BaseModel):
|
||||||
|
"""
|
||||||
|
业务用基本表B,包含create_by, update_by, belong_dept字段, 硬删除
|
||||||
|
"""
|
||||||
|
create_by = models.ForeignKey(
|
||||||
|
User, null=True, blank=True, on_delete=models.SET_NULL, verbose_name='创建人', related_name = '%(class)s_create_by')
|
||||||
|
update_by = models.ForeignKey(
|
||||||
|
User, null=True, blank=True, on_delete=models.SET_NULL, verbose_name='最后编辑人', related_name = '%(class)s_update_by')
|
||||||
|
belong_dept = models.ForeignKey(
|
||||||
|
Organization, null=True, blank=True, on_delete=models.SET_NULL, verbose_name='所属部门', related_name= '%(class)s_belong_dept')
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
abstract = True
|
||||||
|
|
||||||
class File(CommonAModel):
|
class File(CommonAModel):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -113,17 +113,17 @@ class OperationListSerializer(serializers.ModelSerializer):
|
||||||
|
|
||||||
class OperationInitSerializer(serializers.Serializer):
|
class OperationInitSerializer(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")
|
# subproduction_plan = serializers.PrimaryKeyRelatedField(queryset=SubProductionPlan.objects.all(), label="子计划ID", required=False)
|
||||||
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)
|
||||||
|
|
||||||
def validate(self, data):
|
def validate(self, data):
|
||||||
subproduction_plan = data['subproduction_plan']
|
# subproduction_plan = data['subproduction_plan']
|
||||||
step = data['step']
|
step = data['step']
|
||||||
|
|
||||||
stepIds=[i['id'] for i in subproduction_plan.steps]
|
# stepIds=[i['id'] for i in subproduction_plan.steps]
|
||||||
if step.id not in stepIds:
|
# if step.id not in stepIds:
|
||||||
raise exceptions.ValidationError('请选择正确的子工序操作')
|
# raise exceptions.ValidationError('请选择正确的子工序操作')
|
||||||
|
|
||||||
if 'wproducts' in data and data['wproducts']:
|
if 'wproducts' in data and data['wproducts']:
|
||||||
if step.type == Step.STEP_TYPE_DIV:
|
if step.type == Step.STEP_TYPE_DIV:
|
||||||
|
@ -131,8 +131,8 @@ class OperationInitSerializer(serializers.Serializer):
|
||||||
for i in data['wproducts']:
|
for i in data['wproducts']:
|
||||||
if i.is_executed:
|
if i.is_executed:
|
||||||
raise exceptions.ValidationError('不可进行操作')
|
raise exceptions.ValidationError('不可进行操作')
|
||||||
if i.subproduction_plan != subproduction_plan:
|
# if i.subproduction_plan != subproduction_plan:
|
||||||
raise exceptions.ValidationError('半成品所属子计划不一致')
|
# raise exceptions.ValidationError('半成品所属子计划不一致')
|
||||||
if i.p_state != step:
|
if i.p_state != step:
|
||||||
raise exceptions.ValidationError('半成品所属子工序不一致')
|
raise exceptions.ValidationError('半成品所属子工序不一致')
|
||||||
else:
|
else:
|
||||||
|
@ -146,6 +146,7 @@ class DoInputSerializer(serializers.Serializer):
|
||||||
count_input = serializers.IntegerField(min_value=0, label='消耗数量')
|
count_input = serializers.IntegerField(min_value=0, label='消耗数量')
|
||||||
|
|
||||||
class DoOutputSerializer(serializers.Serializer):
|
class DoOutputSerializer(serializers.Serializer):
|
||||||
|
subproduction_plan = serializers.PrimaryKeyRelatedField(queryset=SubProductionPlan.objects.all(), label="子计划ID", required=False)
|
||||||
material = serializers.PrimaryKeyRelatedField(queryset=Material.objects.all(), label='物料ID')
|
material = serializers.PrimaryKeyRelatedField(queryset=Material.objects.all(), label='物料ID')
|
||||||
count_output = serializers.IntegerField(min_value=0, label='产出数量')
|
count_output = serializers.IntegerField(min_value=0, label='产出数量')
|
||||||
|
|
||||||
|
@ -164,7 +165,7 @@ class OperationRecordSerializer(serializers.ModelSerializer):
|
||||||
|
|
||||||
class OperationSubmitSerializer(serializers.Serializer):
|
class OperationSubmitSerializer(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")
|
# subproduction_plan = serializers.PrimaryKeyRelatedField(queryset=SubProductionPlan.objects.all(), label="子计划ID", required=False)
|
||||||
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)
|
||||||
input = DoInputSerializer(many=True, required=False)
|
input = DoInputSerializer(many=True, required=False)
|
||||||
|
|
|
@ -151,26 +151,33 @@ class DoFormInit(CreateAPIView, GenericAPIView):
|
||||||
ret = {}
|
ret = {}
|
||||||
ret_0 = {}
|
ret_0 = {}
|
||||||
ret_0['step'] = data['step']
|
ret_0['step'] = data['step']
|
||||||
ret_0['subproduction_plan'] = data['subproduction_plan']
|
splans =[]
|
||||||
|
ret_0['input'] = []
|
||||||
|
# ret_0['subproduction_plan'] = data['subproduction_plan']
|
||||||
if 'wproducts' in data and data['wproducts']:
|
if 'wproducts' in data and data['wproducts']:
|
||||||
ret_0['wproducts'] = data['wproducts']
|
ret_0['wproducts'] = data['wproducts']
|
||||||
|
splans = WProduct.objects.filter(id__in=data['wproducts']).values('subproduction_plan', flat=True)
|
||||||
|
# 调出所属子计划现有物料
|
||||||
|
ret_0['input'] = WMaterialListSerializer(instance=WMaterial.objects.filter(subproduction_plan__in=splans), many=True)
|
||||||
else:
|
else:
|
||||||
ret_0['wproducts'] = []
|
ret_0['wproducts'] = []
|
||||||
# 调出该子计划现有物料
|
|
||||||
ret_0['input'] = list(WMaterial.objects.filter(subproduction_plan=vdata['subproduction_plan'])\
|
|
||||||
.values('id', 'material', 'material__name', 'count', 'material__number', 'batch'))
|
|
||||||
for i in ret_0['input']:
|
for i in ret_0['input']:
|
||||||
i['count_input'] = 0
|
i['count_input'] = 0
|
||||||
# 需要输出的物料
|
# 需要输出的物料
|
||||||
if ret_0['wproducts']:
|
if ret_0['wproducts']:
|
||||||
# 排除主要产物, 因为已经放到半成品里了, 由半成品进行处理, 夹层可能需要特殊处理
|
# 排除主要产物, 因为已经放到半成品里了, 由半成品进行处理, 夹层可能需要特殊处理
|
||||||
o_objs = SubProductionProgress.objects.filter(
|
o_objs = SubProductionProgress.objects.filter(
|
||||||
subproduction_plan=vdata['subproduction_plan'], type=SubprodctionMaterial.SUB_MA_TYPE_OUT).exclude(is_main=True)
|
subproduction_plan__in=splans, type=SubprodctionMaterial.SUB_MA_TYPE_OUT).exclude(is_main=True)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
|
# 此时显示所有子计划的情况
|
||||||
|
splans = SubProductionPlan.objects.filter(is_deleted=False,
|
||||||
|
subproduction__usedstep_subproduction__step=vdata['step'], state=3)
|
||||||
o_objs = SubProductionProgress.objects.filter(
|
o_objs = SubProductionProgress.objects.filter(
|
||||||
subproduction_plan=vdata['subproduction_plan'], type=SubprodctionMaterial.SUB_MA_TYPE_OUT)
|
subproduction_plan__in=splans, type=SubprodctionMaterial.SUB_MA_TYPE_OUT)
|
||||||
ret_0['output'] = list(o_objs.values('material', 'material__name', 'material__number'))
|
ret_0['output'] = list(o_objs.values('subproduction_plan', 'material', 'material__name', 'material__number'))
|
||||||
for i in ret_0['output']:
|
for i in ret_0['output']:
|
||||||
i['count_output']=0
|
i['count_output']=0
|
||||||
ret['forms'] = []
|
ret['forms'] = []
|
||||||
|
@ -227,16 +234,16 @@ class DoFormSubmit(CreateAPIView, GenericAPIView):
|
||||||
if 'output' in data and data['output']:
|
if 'output' in data and data['output']:
|
||||||
for i in vdata['output']: # 已经序列化好的数据
|
for i in vdata['output']: # 已经序列化好的数据
|
||||||
ma = i['material']
|
ma = i['material']
|
||||||
if vdata['subproduction_plan'].main_product == ma: # 如果是该计划主产物
|
if i['subproduction_plan'].main_product == ma: # 如果是该计划主产物
|
||||||
# 如果是切割
|
# 如果是切割
|
||||||
# 获取下一步子工序
|
# 获取下一步子工序
|
||||||
if vdata['step'].type == Step.STEP_TYPE_DIV:
|
if vdata['step'].type == Step.STEP_TYPE_DIV:
|
||||||
stepIds = [i['id'] for i in vdata['subproduction_plan'].steps]
|
stepIds = [i['id'] for i in i['subproduction_plan'].steps]
|
||||||
pindex = stepIds.index(vdata['step'].id)
|
pindex = stepIds.index(vdata['step'].id)
|
||||||
wpr = dict(m_state=ma, p_state=Step.objects.get(pk=stepIds[pindex+1]),
|
wpr = dict(m_state=ma, p_state=Step.objects.get(pk=stepIds[pindex+1]),
|
||||||
act_state=WProduct.WPR_ACT_STATE_DOING, is_executed=False, remark='',
|
act_state=WProduct.WPR_ACT_STATE_DOING, is_executed=False, remark='',
|
||||||
subproduction_plan=vdata['subproduction_plan'],
|
subproduction_plan=i['subproduction_plan'],
|
||||||
production_plan=vdata['subproduction_plan'].production_plan)
|
production_plan=i['subproduction_plan'].production_plan)
|
||||||
for x in range(i['count_output']):
|
for x in range(i['count_output']):
|
||||||
WProduct.objects.create(**wpr)
|
WProduct.objects.create(**wpr)
|
||||||
else:
|
else:
|
||||||
|
@ -244,18 +251,20 @@ class DoFormSubmit(CreateAPIView, GenericAPIView):
|
||||||
OperationMaterial.objects.create(type=2, operation=action_obj,
|
OperationMaterial.objects.create(type=2, operation=action_obj,
|
||||||
material= ma, count=i['count_output'])
|
material= ma, count=i['count_output'])
|
||||||
# 更新车间物料表
|
# 更新车间物料表
|
||||||
ins, _ = WMaterial.objects.get_or_create(subproduction_plan=vdata['subproduction_plan'],
|
ins, _ = WMaterial.objects.get_or_create(subproduction_plan=i['subproduction_plan'],
|
||||||
material=ma)
|
material=ma)
|
||||||
ins.count = ins.count + i['count_output']
|
ins.count = ins.count + i['count_output']
|
||||||
ins.save()
|
ins.save()
|
||||||
# 更新子计划进度表
|
# 更新子计划进度表
|
||||||
sp = SubProductionProgress.objects.get(subproduction_plan=vdata['subproduction_plan'],
|
sp = SubProductionProgress.objects.get(subproduction_plan=i['subproduction_plan'],
|
||||||
material=ma)
|
material=ma)
|
||||||
sp.count_real = sp.count_real + i['count_input']
|
sp.count_real = sp.count_real + i['count_input']
|
||||||
sp.save()
|
sp.save()
|
||||||
|
|
||||||
# 更新动态产品表
|
# 更新动态产品表
|
||||||
if 'wproducts' in data and data['wproducts']:
|
if 'wproducts' in vdata and data['wproducts']:
|
||||||
|
for i in data['wproducts']:
|
||||||
|
pass
|
||||||
wproducts = WProduct.objects.filter(pk__in=data['wproducts'])
|
wproducts = WProduct.objects.filter(pk__in=data['wproducts'])
|
||||||
# 获取下一步子工序
|
# 获取下一步子工序
|
||||||
stepIds = [i['id'] for i in vdata['subproduction_plan'].steps]
|
stepIds = [i['id'] for i in vdata['subproduction_plan'].steps]
|
||||||
|
|
Loading…
Reference in New Issue