120 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			120 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Python
		
	
	
	
| from apps.qm.models import FtestWork
 | |
| from apps.wpm.models import WMaterial
 | |
| from apps.system.models import User
 | |
| from rest_framework.exceptions import ParseError
 | |
| from django.utils import timezone
 | |
| from apps.wf.models import Ticket
 | |
| from apps.qm.models import NotOkOption
 | |
| from apps.utils.thread import MyThread
 | |
| from apps.wpm.services_2 import get_alldata_with_batch_and_store
 | |
| 
 | |
| def ftestwork_submit_validate(ins: FtestWork):
 | |
|     wm:WMaterial = ins.wm
 | |
|     if ins.need_update_wm:
 | |
|         if wm.state == WMaterial.WM_TEST:
 | |
|             xcount = wm.count - ins.count
 | |
|             if xcount < 0:
 | |
|                 raise ParseError("超过待检数量")
 | |
|         else:
 | |
|             xcount = wm.count - ins.count_notok
 | |
|             if xcount < 0:
 | |
|                 raise ParseError("不合格数不可大于批次数量")
 | |
| 
 | |
| 
 | |
| def ftestwork_submit(ins:FtestWork, user: User):
 | |
|     wm:WMaterial = ins.wm
 | |
|     if ins.need_update_wm:
 | |
|         if wm.state == WMaterial.WM_TEST:
 | |
|             # 更新对应的车间库存
 | |
|             wm.count = wm.count - ins.count
 | |
|             if wm.count >= 0:
 | |
|                 # 已检测的数量
 | |
|                 wm.count_xtest = wm.count_xtest + ins.count
 | |
|                 wm.save()
 | |
|             else:
 | |
|                 raise ParseError("超过待检数量")
 | |
|             # 寻找count_notok_json中的b类不合格不进行处理
 | |
|             count_notok_json = ins.count_notok_json
 | |
|             need_move_count = 0
 | |
|             for k, v in count_notok_json.items():
 | |
|                 if v > 0:
 | |
|                     notok_sign = k.replace('count_n_', '')
 | |
|                     if NotOkOption.get_extra_info(notok_sign)['cate'] == 'ok_b':  # b类不合格在后续处理
 | |
|                         need_move_count = need_move_count + v
 | |
|             count_ok = ins.count_ok - need_move_count
 | |
|             if count_ok > 0:
 | |
|                 wm, new_create = WMaterial.objects.get_or_create(
 | |
|                     material=wm.material,
 | |
|                     batch=wm.batch,
 | |
|                     mgroup=wm.mgroup,
 | |
|                     belong_dept=wm.belong_dept,
 | |
|                     state=WMaterial.WM_OK,
 | |
|                     notok_sign=None,
 | |
|                     defaults={
 | |
|                         'count': count_ok,
 | |
|                     }
 | |
|                 )
 | |
|                 if not new_create:
 | |
|                     wm.count = wm.count + count_ok
 | |
|                     wm.save()
 | |
|         else: # 如果直接对工段库存检验 , 则直接扣减不合格数
 | |
|             wm.count = wm.count - ins.count_notok
 | |
|             if wm.count >= 0:
 | |
|                 wm.save()
 | |
|             else:
 | |
|                 raise ParseError("不合格数不可大于批次数量")
 | |
|         
 | |
|         # 生成不合格的
 | |
|         count_notok_json = ins.count_notok_json
 | |
|         for k, v in count_notok_json.items():
 | |
|             if v > 0:
 | |
|                 notok_sign = k.replace('count_n_', '')
 | |
|                 astate = WMaterial.WM_NOTOK
 | |
|                 if NotOkOption.get_extra_info(notok_sign)['cate'] == 'ok_b':
 | |
|                     astate = WMaterial.WM_OK
 | |
|                 wm_n, new_create = WMaterial.objects.get_or_create(
 | |
|                     material=wm.material,
 | |
|                     batch=wm.batch,
 | |
|                     mgroup=wm.mgroup,
 | |
|                     belong_dept=wm.belong_dept,
 | |
|                     notok_sign=notok_sign,
 | |
|                     state=astate,
 | |
|                     defaults={
 | |
|                         'count': v,
 | |
|                         'material': wm.material,
 | |
|                         'batch': wm.batch,
 | |
|                         'mgroup': wm.mgroup,
 | |
|                         'belong_dept': wm.belong_dept,
 | |
|                         'notok_sign': notok_sign,
 | |
|                         'state': astate,
 | |
|                     }
 | |
|                 )
 | |
|                 if not new_create:
 | |
|                     wm_n.count = wm_n.count + v
 | |
|                     wm_n.save()
 | |
|     ins.submit_user = user
 | |
|     ins.submit_time = timezone.now()
 | |
|     ins.save()
 | |
| 
 | |
| def bind_ftestwork(ticket: Ticket, transition, new_ticket_data: dict):
 | |
|     ins = FtestWork.objects.get(id=new_ticket_data['t_id'])
 | |
|     if ins.submit_time is not None:
 | |
|         raise ParseError('该检验工作不可提交审批')
 | |
|     ftestwork_submit_validate(ins)
 | |
|     ticket_data = ticket.ticket_data
 | |
|     ticket_data.update({
 | |
|         't_model': 'ftestwork',
 | |
|         't_id': ins.id,
 | |
|     })
 | |
|     ticket.ticket_data = ticket_data
 | |
|     ticket.create_by = ins.create_by
 | |
|     ticket.save()
 | |
|     if ins.ticket is None:
 | |
|         ins.ticket = ticket
 | |
|         ins.save()
 | |
| 
 | |
| def ftestwork_audit_end(ticket: Ticket):
 | |
|     ins = FtestWork.objects.get(id=ticket.ticket_data['t_id'])
 | |
|     ftestwork_submit(ins, ticket.create_by)
 | |
|     if ins.batch:
 | |
|         MyThread(target=get_alldata_with_batch_and_store, args=(ins.batch,)).start() |