add_wproduct_flow_log

This commit is contained in:
caoqianming 2021-12-30 09:32:47 +08:00
parent ba2e583b26
commit 2e5771dc6f
6 changed files with 127 additions and 79 deletions

View File

@ -15,6 +15,7 @@ class PmService:
qs_list = list(qs) qs_list = list(qs)
for i in qs_list: for i in qs_list:
ret[i['process__number']] = { ret[i['process__number']] = {
'process':i['process'],
'count':i['count'], 'count':i['count'],
'count_real':i['count_real'], 'count_real':i['count_real'],
'count_ok':i['count_ok'], 'count_ok':i['count_ok'],

View File

@ -0,0 +1,18 @@
# Generated by Django 3.2.9 on 2021-12-30 01:31
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('wpm', '0040_alter_wproductflow_number'),
]
operations = [
migrations.AddField(
model_name='wproductflow',
name='change_str',
field=models.CharField(default='', max_length=1000, verbose_name='变动描述'),
),
]

View File

@ -148,7 +148,9 @@ class WproductFlow(CommonAModel):
on_delete=models.SET_NULL, null=True, blank=True) on_delete=models.SET_NULL, null=True, blank=True)
ticket = models.ForeignKey('wf.ticket', verbose_name='当前工单', ticket = models.ForeignKey('wf.ticket', verbose_name='当前工单',
on_delete=models.SET_NULL, null=True, blank=True) on_delete=models.SET_NULL, null=True, blank=True)
is_lastlog = models.BooleanField('是否该子计划下的最后一条日志', default=True) is_lastlog = models.BooleanField('是否该子计划下的最后一条日志', default=True)
change_str = models.CharField('变动描述', default='', max_length=1000)
class Pick(CommonADModel): class Pick(CommonADModel):

View File

@ -131,3 +131,18 @@ class WpmServies(object):
if count_mtestok >= plan.count: if count_mtestok >= plan.count:
plan.state = ProductionPlan.PLAN_MTEST_DONE plan.state = ProductionPlan.PLAN_MTEST_DONE
plan.save() plan.save()
@classmethod
def add_wproduct_flow_log(cls, instance:WProduct, change_str:str=''):
"""
创建产品变动日志
"""
# update_fields = kwargs['update_fields']
WproductFlow.objects.filter(wproduct=instance, subproduction_plan=instance.subproduction_plan).update(is_lastlog=False)
ins = WproductFlow()
ins.wproduct = instance
for f in WproductFlow._meta.fields:
if f.name not in ['id', 'wproduct', 'is_lastlog']:
setattr(ins, f.name, getattr(instance, f.name, None))
ins.change_str = change_str
ins.save()

View File

@ -34,7 +34,7 @@ def handleTicket(sender, instance, created, **kwargs):
# 工单绑定半成品 # 工单绑定半成品
wproduct.ticket = instance wproduct.ticket = instance
wproduct.save() wproduct.save()
WpmServies.add_wproduct_flow_log(wproduct, 'ticket_create')
# 检验员 # 检验员
if not ticket_data.get('tester', None): if not ticket_data.get('tester', None):
ticket_data['tester'] = test_record.create_by.id ticket_data['tester'] = test_record.create_by.id
@ -69,6 +69,7 @@ def handleTicket(sender, instance, created, **kwargs):
wp.ticket = None # 解除当前工单 wp.ticket = None # 解除当前工单
wp.act_state = WProduct.WPR_ACT_STATE_DOWAIT wp.act_state = WProduct.WPR_ACT_STATE_DOWAIT
wp.save() wp.save()
WpmServies.add_wproduct_flow_log(wp, 'ticket_finish')
# 更新子计划合格进度 # 更新子计划合格进度
WpmServies.update_subproduction_progress_main(sp=sp) WpmServies.update_subproduction_progress_main(sp=sp)
@ -81,19 +82,5 @@ def handleTicket(sender, instance, created, **kwargs):
wt.save() wt.save()
wp.ticket = None # 解除当前工单 wp.ticket = None # 解除当前工单
wp.save() wp.save()
WpmServies.add_wproduct_flow_log(wp, 'ticket_finish')
@receiver(post_save, sender=WProduct)
def update_wproduct_log(sender, instance, created, **kwargs):
"""
创建产品变动日志
"""
# update_fields = kwargs['update_fields']
WproductFlow.objects.filter(wproduct=instance, subproduction_plan=instance.subproduction_plan).update(is_lastlog=False)
ins = WproductFlow()
ins.wproduct = instance
for f in WproductFlow._meta.fields:
if f.name not in ['id', 'create_time', 'update_time', 'wproduct', 'is_lastlog']:
setattr(ins, f.name, getattr(instance, f.name, None))
ins.save()

View File

@ -81,13 +81,23 @@ class WPlanViewSet(ListModelMixin, GenericViewSet):
wps.update(step=first_step, wps.update(step=first_step,
act_state=WProduct.WPR_ACT_STATE_TORETEST, is_hidden=False, warehouse=None, act_state=WProduct.WPR_ACT_STATE_TORETEST, is_hidden=False, warehouse=None,
subproduction_plan=sp, update_by=request.user, update_time=timezone.now()) subproduction_plan=sp, update_by=request.user, update_time=timezone.now())
for i in wps:
for m in i['wproducts']:
m.step = first_step
m.act_state = WProduct.WPR_ACT_STATE_TORETEST
m.is_hidden = False
m.warehouse = None
m.subproduction_plan = sp
m.update_by = request.user
m.update_time = timezone.now()
m.save()
WpmServies.add_wproduct_flow_log(instance=m, change_str='pick_half')
pw = PickWproduct() pw = PickWproduct()
pw.pick =pick pw.pick =pick
pw.wproduct = i pw.wproduct = m
pw.number = i.number pw.number = m.number
pw.material = i.material pw.material = m.material
pw.subproduction_plan = i.suproduction_plan pw.subproduction_plan = m.suproduction_plan
pw.save() pw.save()
sp.is_picked = True sp.is_picked = True
sp.save() sp.save()
@ -95,63 +105,63 @@ class WPlanViewSet(ListModelMixin, GenericViewSet):
return Response() return Response()
@action(methods=['post'], detail=True, perms_map={'post':'*'}, serializer_class=WplanPutInSerializer) # @action(methods=['post'], detail=True, perms_map={'post':'*'}, serializer_class=WplanPutInSerializer)
@transaction.atomic # @transaction.atomic
def putin(self, request, pk=None): # def putin(self, request, pk=None):
""" # """
半成品入库 # 半成品入库
""" # """
serializer= WplanPutInSerializer(data=request.data) # serializer= WplanPutInSerializer(data=request.data)
serializer.is_valid(raise_exception=True) # serializer.is_valid(raise_exception=True)
vdata = serializer.validated_data # vdata = serializer.validated_data
subplan = self.get_object() # subplan = self.get_object()
material = subplan.product # material = subplan.product
batch = subplan.number # batch = subplan.number
warehouse = vdata['warehouse'] # warehouse = vdata['warehouse']
wproducts = WProduct.objects.filter(subproduction_plan=subplan, # wproducts = WProduct.objects.filter(subproduction_plan=subplan,
act_state=WProduct.WPR_ACT_STATE_OK, material=material, is_deleted=False) # act_state=WProduct.WPR_ACT_STATE_OK, material=material, is_deleted=False)
if wproducts.exists(): # if wproducts.exists():
# 创建入库记录 # # 创建入库记录
remark = vdata.get('remark', '') # remark = vdata.get('remark', '')
fifo = FIFO.objects.create(type=FIFO.FIFO_TYPE_DO_IN, # fifo = FIFO.objects.create(type=FIFO.FIFO_TYPE_DO_IN,
is_audited=True, auditor=request.user, inout_date=timezone.now(), create_by=request.user, remark=remark) # is_audited=True, auditor=request.user, inout_date=timezone.now(), create_by=request.user, remark=remark)
# 创建入库明细 # # 创建入库明细
fifoitem = FIFOItem() # fifoitem = FIFOItem()
fifoitem.is_tested = True # fifoitem.is_tested = True
fifoitem.is_testok = True # fifoitem.is_testok = True
fifoitem.warehouse = warehouse # fifoitem.warehouse = warehouse
fifoitem.material = material # fifoitem.material = material
fifoitem.count = wproducts.count() # fifoitem.count = wproducts.count()
fifoitem.batch = batch # fifoitem.batch = batch
fifoitem.fifo = fifo # fifoitem.fifo = fifo
fifoitem.subproduction_plan = subplan # fifoitem.subproduction_plan = subplan
fifoitem.save() # fifoitem.save()
# 创建入库明细半成品 # # 创建入库明细半成品
ips = [] # ips = []
for i in wproducts: # for i in wproducts:
ip = {} # ip = {}
ip['fifoitem'] = fifoitem # ip['fifoitem'] = fifoitem
ip['wproduct'] = i # ip['wproduct'] = i
ip['number'] = i.number # ip['number'] = i.number
ip['material'] = material # ip['material'] = material
ips.append(FIFOItemProduct(**ip)) # ips.append(FIFOItemProduct(**ip))
FIFOItemProduct.objects.bulk_create(ips) # FIFOItemProduct.objects.bulk_create(ips)
# 创建IProduct # # 创建IProduct
ips2 = [] # ips2 = []
for i in wproducts: # for i in wproducts:
ip = {} # ip = {}
ip['warehouse'] = warehouse # ip['warehouse'] = warehouse
ip['batch'] = batch # ip['batch'] = batch
ip['wproduct'] = i # ip['wproduct'] = i
ip['number'] = i.number # ip['number'] = i.number
ip['material'] = material # ip['material'] = material
ips2.append(IProduct(**ip)) # ips2.append(IProduct(**ip))
IProduct.objects.bulk_create(ips2) # IProduct.objects.bulk_create(ips2)
# 更新库存并修改半成品进行状态 # # 更新库存并修改半成品进行状态
update_inm(fifo) # update_inm(fifo)
wproducts.update(act_sate=WProduct.WPR_ACT_STATE_INM, warehouse=warehouse, update_by=request.user, update_time=timezone.now()) # wproducts.update(act_sate=WProduct.WPR_ACT_STATE_INM, warehouse=warehouse, update_by=request.user, update_time=timezone.now())
return Response() # return Response()
class WMaterialViewSet(CreateUpdateModelAMixin, ListModelMixin, GenericViewSet): class WMaterialViewSet(CreateUpdateModelAMixin, ListModelMixin, GenericViewSet):
@ -232,10 +242,12 @@ class WProductViewSet(ListModelMixin, GenericViewSet):
elif wproduct.act_state == WProduct.WPR_ACT_STATE_TOCOMBTEST: elif wproduct.act_state == WProduct.WPR_ACT_STATE_TOCOMBTEST:
savedict['type'] = TestRecord.TEST_COMB savedict['type'] = TestRecord.TEST_COMB
tr = TestRecord.objects.create(**savedict) tr = TestRecord.objects.create(**savedict)
# 更新wproduct
wproduct.test = tr wproduct.test = tr
wproduct.update_by = request.user wproduct.update_by = request.user
wproduct.update_time = timezone.now() wproduct.update_time = timezone.now()
wproduct.save() wproduct.save()
WpmServies.add_wproduct_flow_log(wproduct, 'test_init')
# 创建检验条目 # 创建检验条目
for i in RecordFormField.objects.filter(form=form, is_deleted=False): for i in RecordFormField.objects.filter(form=form, is_deleted=False):
tri = TestRecordItem() tri = TestRecordItem()
@ -298,6 +310,7 @@ class WProductViewSet(ListModelMixin, GenericViewSet):
i.update_by = request.user i.update_by = request.user
i.update_time = timezone.now() i.update_time = timezone.now()
i.save() i.save()
WpmServies.add_wproduct_flow_log(i, 'putins')
return Response() return Response()
@action(methods=['post'], detail=True, perms_map={'post':'*'}, serializer_class=WproductPutInSerializer) @action(methods=['post'], detail=True, perms_map={'post':'*'}, serializer_class=WproductPutInSerializer)
@ -345,6 +358,7 @@ class WProductViewSet(ListModelMixin, GenericViewSet):
wproduct.act_state=WProduct.WPR_ACT_STATE_INM wproduct.act_state=WProduct.WPR_ACT_STATE_INM
wproduct.warehouse=warehouse wproduct.warehouse=warehouse
wproduct.save() wproduct.save()
WpmServies.add_wproduct_flow_log(wproduct, 'putin')
return Response() return Response()
@action(methods=['post'], detail=True, perms_map={'post':'*'}, serializer_class=ScrapSerializer) @action(methods=['post'], detail=True, perms_map={'post':'*'}, serializer_class=ScrapSerializer)
@ -370,6 +384,7 @@ class WProductViewSet(ListModelMixin, GenericViewSet):
obj.update_by = request.user obj.update_by = request.user
obj.update_time = timezone.now() obj.update_time = timezone.now()
obj.save() obj.save()
WpmServies.add_wproduct_flow_log(obj, 'scrap')
return Response() return Response()
# @action(methods=['get'], detail=False, perms_map={'get':'*'}) # @action(methods=['get'], detail=False, perms_map={'get':'*'})
@ -445,7 +460,11 @@ class OperationViewSet(ListModelMixin, RetrieveModelMixin, CreateModelMixin, Upd
if instance.is_submited: if instance.is_submited:
raise exceptions.APIException('该操作已提交') raise exceptions.APIException('该操作已提交')
# 恢复半成品可操作 # 恢复半成品可操作
instance.wp_operation.all().update(act_state=WProduct.WPR_ACT_STATE_DOWAIT) for i in instance.wp_operation.all():
i.act_state = WProduct.WPR_ACT_STATE_DOWAIT
i.update_by = request.user
i.save()
WpmServies.add_wproduct_flow_log(i, 'operation_delete')
self.perform_destroy(instance) self.perform_destroy(instance)
return Response(status=status.HTTP_204_NO_CONTENT) return Response(status=status.HTTP_204_NO_CONTENT)
@ -465,9 +484,13 @@ class OperationViewSet(ListModelMixin, RetrieveModelMixin, CreateModelMixin, Upd
# 创建操作所用半成品关联记录 # 创建操作所用半成品关联记录
if 'wproducts' in vdata: if 'wproducts' in vdata:
owps = [] owps = []
WProduct.objects.filter(pk__in=[x.id for x in vdata['wproducts']]).update(operation=op, act_state=WProduct.WPR_ACT_STATE_DOING)
splans = WpmServies.get_subplans_queryset_from_wproducts(vdata['wproducts']) splans = WpmServies.get_subplans_queryset_from_wproducts(vdata['wproducts'])
for wpd in vdata['wproducts']: for wpd in vdata['wproducts']:
wpd.operation= op
wpd.act_state = WProduct.WPR_ACT_STATE_DOING
wpd.update_by = request.user
wpd.save()
WpmServies.add_wproduct_flow_log(wpd, 'operation_create')
owp = {} owp = {}
owp['operation'] = op owp['operation'] = op
owp['wproduct'] = wpd owp['wproduct'] = wpd
@ -565,6 +588,7 @@ class OperationViewSet(ListModelMixin, RetrieveModelMixin, CreateModelMixin, Upd
wp.operation = None wp.operation = None
wp.update_by = request.user wp.update_by = request.user
wp.save() wp.save()
WpmServies.add_wproduct_flow_log(wp, 'operation_submit')
elif step.type == Step.STEP_TYPE_DIV: elif step.type == Step.STEP_TYPE_DIV:
# 更新物料产出情况 # 更新物料产出情况
for i in OperationMaterial.objects.filter(operation=op, type=SubprodctionMaterial.SUB_MA_TYPE_OUT): for i in OperationMaterial.objects.filter(operation=op, type=SubprodctionMaterial.SUB_MA_TYPE_OUT):
@ -595,6 +619,7 @@ class OperationViewSet(ListModelMixin, RetrieveModelMixin, CreateModelMixin, Upd
WpmServies.update_subproduction_progress_main(sp=oms_w.subproduction_plan) WpmServies.update_subproduction_progress_main(sp=oms_w.subproduction_plan)
wproduct.create_by = request.user wproduct.create_by = request.user
wproduct.save() wproduct.save()
WpmServies.add_wproduct_flow_log(wproduct, 'operation_submit')
# 隐藏原半成品 # 隐藏原半成品
wps = WProduct.objects.filter(ow_wproduct__operation = op) wps = WProduct.objects.filter(ow_wproduct__operation = op)
wps.update(is_hidden=True, child=wproduct, update_by=request.user, update_time=timezone.now()) wps.update(is_hidden=True, child=wproduct, update_by=request.user, update_time=timezone.now())