|  |  | @ -8,6 +8,7 @@ import cn.estsh.i3plus.ext.mes.pcn.apiservice.dao.IMesProdRuleSortCfgDao; | 
			
		
	
		
		
			
				
					
					|  |  |  | import cn.estsh.i3plus.ext.mes.pcn.apiservice.dao.IMesProductionRecordDao; |  |  |  | import cn.estsh.i3plus.ext.mes.pcn.apiservice.dao.IMesProductionRecordDao; | 
			
		
	
		
		
			
				
					
					|  |  |  | import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException; |  |  |  | import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException; | 
			
		
	
		
		
			
				
					
					|  |  |  | import cn.estsh.i3plus.ext.mes.pcn.pojo.constant.MesCommonConstant; |  |  |  | import cn.estsh.i3plus.ext.mes.pcn.pojo.constant.MesCommonConstant; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesWorkOrderExtModel; | 
			
		
	
		
		
			
				
					
					|  |  |  | import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesWorkOrderSortReportModel; |  |  |  | import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesWorkOrderSortReportModel; | 
			
		
	
		
		
			
				
					
					|  |  |  | import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; |  |  |  | import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; | 
			
		
	
		
		
			
				
					
					|  |  |  | import cn.estsh.i3plus.mes.pcn.api.iservice.busi.ISyncFuncService; |  |  |  | import cn.estsh.i3plus.mes.pcn.api.iservice.busi.ISyncFuncService; | 
			
		
	
	
		
		
			
				
					|  |  | @ -1043,14 +1044,14 @@ public class MesWorkOrderService implements IMesWorkOrderService { | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     @Override |  |  |  |     @Override | 
			
		
	
		
		
			
				
					
					|  |  |  |     public void doProductReport(MesWorkOrder mesWorkOrder, String userName) { |  |  |  |     public void doProductReport(MesWorkOrderExtModel mesWorkOrder, String userName) { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |         DdlPackBean packBean = DdlPackBean.getDdlPackBean(mesWorkOrder.getOrganizeCode()); |  |  |  |         DdlPackBean packBean = DdlPackBean.getDdlPackBean(mesWorkOrder.getOrganizeCode()); | 
			
		
	
		
		
			
				
					
					|  |  |  |         DdlPreparedPack.getNumEqualPack(mesWorkOrder.getId(),"id",packBean); |  |  |  |         DdlPreparedPack.getNumEqualPack(mesWorkOrder.getId(),"id",packBean); | 
			
		
	
		
		
			
				
					
					|  |  |  |         MesWorkOrder mesWorkOrderDb = mesWorkOrderRDao.getByProperty(packBean); |  |  |  |         MesWorkOrder mesWorkOrderDb = mesWorkOrderRDao.getByProperty(packBean); | 
			
		
	
		
		
			
				
					
					|  |  |  |         if (Objects.isNull(mesWorkOrderDb)) { |  |  |  |         if (Objects.isNull(mesWorkOrderDb)) { | 
			
		
	
		
		
			
				
					
					|  |  |  |             MesPcnException.throwMesBusiException("工单id为【%s】工单信息不存在", mesWorkOrder.getId()); |  |  |  |             MesPcnException.throwMesBusiException("工单id为【%s】工单信息不存在", mesWorkOrder.getId()); | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         mesWorkOrderDb.setDescription(mesWorkOrder.getDescription()); |  |  |  | 
 | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |         //查询物料信息
 |  |  |  |         //查询物料信息
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         MesPart mesPart = iMesPartService.getMesPartByPartNo(mesWorkOrderDb.getPartNo(), mesWorkOrderDb.getOrganizeCode()); |  |  |  |         MesPart mesPart = iMesPartService.getMesPartByPartNo(mesWorkOrderDb.getPartNo(), mesWorkOrderDb.getOrganizeCode()); | 
			
		
	
		
		
			
				
					
					|  |  |  |         //查询产线信息
 |  |  |  |         //查询产线信息
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -1076,29 +1077,38 @@ public class MesWorkOrderService implements IMesWorkOrderService { | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         //物料+生产版本获取bom信息
 |  |  |  |         //物料+生产版本获取bom信息
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         List<MesBom> mesBoms = findBomList(mesPart.getOrganizeCode(), mesPart, bomVersion); |  |  |  |         List<MesBom> mesBoms = findBomList(mesPart.getOrganizeCode(), mesPart, bomVersion); | 
			
		
	
		
		
			
				
					
					|  |  |  |         mesWorkOrderDb.setReportedQty(MathOperation.add(mesWorkOrder.getNum(), mesWorkOrderDb.getReportedQty())); |  |  |  | 
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         //更新工单状态
 |  |  |  |         //汇报数量与未完成数量的修改 先给入参对象赋值, 下面没有报错的情况下再赋给工单DB对象
 | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         mesWorkOrder.setReportedQty(MathOperation.add(mesWorkOrder.getNum(), mesWorkOrderDb.getReportedQty())); | 
			
		
	
		
		
			
				
					
					|  |  |  |         double unCompleteQty = MathOperation.sub(mesWorkOrderDb.getQty(), mesWorkOrderDb.getReportedQty()); |  |  |  |         double unCompleteQty = MathOperation.sub(mesWorkOrderDb.getQty(), mesWorkOrderDb.getReportedQty()); | 
			
		
	
		
		
			
				
					
					|  |  |  |         mesWorkOrderDb.setUnCompleteQty(unCompleteQty > 0 ? unCompleteQty : 0); |  |  |  |         mesWorkOrder.setUnCompleteQty(unCompleteQty > 0 ? unCompleteQty : 0); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         if (mesWorkOrderDb.getReportedQty() > mesWorkOrderDb.getQty()) { |  |  |  | 
 | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         //更新工单状态
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         if (mesWorkOrder.getReportedQty() > mesWorkOrderDb.getQty()) { | 
			
		
	
		
		
			
				
					
					|  |  |  |             // 以下则是超工单逻辑
 |  |  |  |             // 以下则是超工单逻辑
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             // 如果产线中没有配置超工单,则直接阻断
 |  |  |  |             // 如果产线中没有配置超工单,则直接阻断
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             if (!Objects.equals(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(), mesWorkCenter.getIsCheckOrderQty())) { |  |  |  |             if (!Objects.equals(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(), mesWorkCenter.getIsCheckOrderQty())) { | 
			
		
	
		
		
			
				
					
					|  |  |  |                 MesPcnException.throwMesBusiException("请检查工单数量,工单号[%s],工单数量[%s]报工数量[%s],且未配置超工单!", mesWorkOrder.getWorkOrderNo(), mesWorkOrder.getQty(), mesWorkOrder.getReportedQty()); |  |  |  |                 MesPcnException.throwMesBusiException("请检查工单数量,工单号[%s],工单数量[%s]报工数量[%s],且未配置超工单!", mesWorkOrderDb.getWorkOrderNo(), mesWorkOrderDb.getQty(), mesWorkOrderDb.getReportedQty()); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |             } |  |  |  |             } | 
			
		
	
		
		
			
				
					
					|  |  |  |             // 如果配置了超工单,且比例已经超过了配置的超工单比例,也需要阻断
 |  |  |  |             // 如果配置了超工单,且比例已经超过了配置的超工单比例,也需要阻断
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             double rate = MathOperation.div((mesWorkOrderDb.getReportedQty() - mesWorkOrderDb.getQty()), mesWorkOrderDb.getQty()); |  |  |  |             double rate = MathOperation.div((mesWorkOrder.getReportedQty() - mesWorkOrderDb.getQty()), mesWorkOrderDb.getQty()); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |             if (rate > MathOperation.div(mesWorkCenter.getOrderRate(), 100)) { |  |  |  |             if (rate > MathOperation.div(mesWorkCenter.getOrderRate(), 100)) { | 
			
		
	
		
		
			
				
					
					|  |  |  |                 MesPcnException.throwMesBusiException("请检查工单数量,工单号[%s],工单数量[%s]报工数量[%s],配置了超工单,但超过了比例[%s]!", mesWorkOrder.getWorkOrderNo(), mesWorkOrder.getQty(), mesWorkOrder.getReportedQty(), mesWorkCenter.getOrderRate()); |  |  |  |                 MesPcnException.throwMesBusiException("请检查工单数量,工单号[%s],工单数量[%s]报工数量[%s],配置了超工单,但超过了比例[%s]!", mesWorkOrderDb.getWorkOrderNo(), mesWorkOrderDb.getQty(), mesWorkOrderDb.getReportedQty(), mesWorkCenter.getOrderRate()); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |             } |  |  |  |             } | 
			
		
	
		
		
			
				
					
					|  |  |  |             mesWorkOrder.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.COMPLETE.getValue()); |  |  |  |             mesWorkOrderDb.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.COMPLETE.getValue()); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         } else if (Objects.equals(mesWorkOrderDb.getReportedQty(), mesWorkOrderDb.getQty())) { |  |  |  |         } else if (Objects.equals(mesWorkOrder.getReportedQty(), mesWorkOrderDb.getQty())) { | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |             mesWorkOrderDb.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.COMPLETE.getValue()); |  |  |  |             mesWorkOrderDb.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.COMPLETE.getValue()); | 
			
		
	
		
		
			
				
					
					|  |  |  |         } else { |  |  |  |         } else { | 
			
		
	
		
		
			
				
					
					|  |  |  |             mesWorkOrderDb.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.PROCESS.getValue()); |  |  |  |             mesWorkOrderDb.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.PROCESS.getValue()); | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         mesWorkOrderDb.setCompleteQty(mesWorkOrderDb.getReportedQty()); |  |  |  | 
 | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         mesWorkOrderDb.setDescription(mesWorkOrder.getDescription()); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         mesWorkOrderDb.setReportedQty(mesWorkOrder.getReportedQty()); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         mesWorkOrderDb.setUnCompleteQty(mesWorkOrder.getUnCompleteQty()); | 
			
		
	
		
		
			
				
					
					|  |  |  |         mesWorkOrderDb.setRemark(mesWorkOrder.getRemark()); |  |  |  |         mesWorkOrderDb.setRemark(mesWorkOrder.getRemark()); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         mesWorkOrderDb.setCompleteQty(mesWorkOrderDb.getReportedQty()); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         String sn = getReportSn(mesWorkOrder.getOrganizeCode(), userName, mesPart); |  |  |  |         String sn = getReportSn(mesWorkOrder.getOrganizeCode(), userName, mesPart); | 
			
		
	
		
		
			
				
					
					|  |  |  |         //更新工单
 |  |  |  |         //更新工单
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         updateMesWorkOrder(mesWorkOrderDb, userName, MesExtEnumUtil.WORK_ORDER_LOG_TYPE.REPORT, mesWorkOrder.getNum()); |  |  |  |         updateMesWorkOrder(mesWorkOrderDb, userName, MesExtEnumUtil.WORK_ORDER_LOG_TYPE.REPORT, mesWorkOrder.getNum()); | 
			
		
	
	
		
		
			
				
					|  |  | @ -1111,7 +1121,7 @@ public class MesWorkOrderService implements IMesWorkOrderService { | 
			
		
	
		
		
			
				
					
					|  |  |  |             List<MesProductOffLine> mesProductOffLineList = new ArrayList<>(); |  |  |  |             List<MesProductOffLine> mesProductOffLineList = new ArrayList<>(); | 
			
		
	
		
		
			
				
					
					|  |  |  |             String nowTime = StringUtil.isEmpty(mesWorkOrder.getDescription()) ? TimeTool.getNowTime(true) : mesWorkOrder.getDescription(); |  |  |  |             String nowTime = StringUtil.isEmpty(mesWorkOrder.getDescription()) ? TimeTool.getNowTime(true) : mesWorkOrder.getDescription(); | 
			
		
	
		
		
			
				
					
					|  |  |  |             for (MesBom mesBom : mesBoms) { |  |  |  |             for (MesBom mesBom : mesBoms) { | 
			
		
	
		
		
			
				
					
					|  |  |  |                 mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrder, mesProductVersion, sn, mesBom, nowTime,mesBoms.size())); |  |  |  |                 mesProductOffLineList.add(creatMesProductOffLine(userName, mesWorkOrder, mesProductVersion, sn, mesBom, nowTime, mesBoms.size())); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |             } |  |  |  |             } | 
			
		
	
		
		
			
				
					
					|  |  |  |             mesProductOffLineRDao.saveAll(mesProductOffLineList); |  |  |  |             mesProductOffLineRDao.saveAll(mesProductOffLineList); | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
	
		
		
			
				
					|  |  | @ -1138,7 +1148,7 @@ public class MesWorkOrderService implements IMesWorkOrderService { | 
			
		
	
		
		
			
				
					
					|  |  |  |             List<MesProductOffLine> mesProductOffLineList = new ArrayList<>(); |  |  |  |             List<MesProductOffLine> mesProductOffLineList = new ArrayList<>(); | 
			
		
	
		
		
			
				
					
					|  |  |  |             String nowTime = TimeTool.getNowTime(true); |  |  |  |             String nowTime = TimeTool.getNowTime(true); | 
			
		
	
		
		
			
				
					
					|  |  |  |             for (MesBom mesBom : mesBomList) { |  |  |  |             for (MesBom mesBom : mesBomList) { | 
			
		
	
		
		
			
				
					
					|  |  |  |                 mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrder, mesProductVersion, sn, mesBom, nowTime, mesBomList.size())); |  |  |  |                 mesProductOffLineList.add(creatMesProductOffLine(userName, mesWorkOrder, mesProductVersion, sn, mesBom, nowTime, mesBomList.size())); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |             } |  |  |  |             } | 
			
		
	
		
		
			
				
					
					|  |  |  |             mesProductOffLineRDao.saveAll(mesProductOffLineList); |  |  |  |             mesProductOffLineRDao.saveAll(mesProductOffLineList); | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
	
		
		
			
				
					|  |  | @ -1390,7 +1400,7 @@ public class MesWorkOrderService implements IMesWorkOrderService { | 
			
		
	
		
		
			
				
					
					|  |  |  |         return syncFuncService.syncSerialNo(new GenSerialNoModel(MesCommonConstant.REPORT_SN).partSnParam(part.getPartSnParam()).organizeCode(organizeCode),userName, organizeCode, 1).getResultList().iterator().next().toString(); |  |  |  |         return syncFuncService.syncSerialNo(new GenSerialNoModel(MesCommonConstant.REPORT_SN).partSnParam(part.getPartSnParam()).organizeCode(organizeCode),userName, organizeCode, 1).getResultList().iterator().next().toString(); | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     private MesProductOffLine creatMesProductOffLine(MesWorkOrder mesWorkOrder, MesProductVersion mesProductVersion, |  |  |  |     private MesProductOffLine creatMesProductOffLine(String userName, MesWorkOrder mesWorkOrder, MesProductVersion mesProductVersion, | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                                                      String sn, MesBom mesBom, String nowTime,Integer bomTotalSize) { |  |  |  |                                                      String sn, MesBom mesBom, String nowTime,Integer bomTotalSize) { | 
			
		
	
		
		
			
				
					
					|  |  |  |         MesProductOffLine newMesProductOffLine; |  |  |  |         MesProductOffLine newMesProductOffLine; | 
			
		
	
		
		
			
				
					
					|  |  |  |         newMesProductOffLine = new MesProductOffLine(); |  |  |  |         newMesProductOffLine = new MesProductOffLine(); | 
			
		
	
	
		
		
			
				
					|  |  | @ -1417,7 +1427,7 @@ public class MesWorkOrderService implements IMesWorkOrderService { | 
			
		
	
		
		
			
				
					
					|  |  |  |         newMesProductOffLine.setDescription(nowTime); |  |  |  |         newMesProductOffLine.setDescription(nowTime); | 
			
		
	
		
		
			
				
					
					|  |  |  |         newMesProductOffLine.setBomTotalSize(bomTotalSize); |  |  |  |         newMesProductOffLine.setBomTotalSize(bomTotalSize); | 
			
		
	
		
		
			
				
					
					|  |  |  |         newMesProductOffLine.setBomCode(mesBom.getBomCode()); |  |  |  |         newMesProductOffLine.setBomCode(mesBom.getBomCode()); | 
			
		
	
		
		
			
				
					
					|  |  |  |         ConvertBean.serviceModelInitialize(newMesProductOffLine, mesWorkOrder.getCreateUser()); |  |  |  |         ConvertBean.serviceModelInitialize(newMesProductOffLine, userName); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |         return newMesProductOffLine; |  |  |  |         return newMesProductOffLine; | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | 
 |