备料计划api类同步代码-张明&李正
This commit is contained in:
		
							parent
							
								
									e9a6d413a8
								
							
						
					
					
						commit
						2c12487d2a
					
				|  | @ -0,0 +1,5 @@ | |||
| <?xml version="1.0" encoding='gb2312'?> | ||||
| <module> | ||||
| <rest> | ||||
| 	<resource classname="nccloud.openapi.mmpac.pickm.PickmResouce"  exinfo="流程备料计划增删改查接口"/> | ||||
| </rest> | ||||
|  | @ -0,0 +1,585 @@ | |||
| package nc.impl.mmpac.pickm; | ||||
| 
 | ||||
| import java.util.*; | ||||
| 
 | ||||
| import com.alibaba.fastjson.JSONArray; | ||||
| import com.alibaba.fastjson.JSONObject; | ||||
| import nc.bs.dao.BaseDAO; | ||||
| import nc.bs.framework.common.NCLocator; | ||||
| import nc.bs.logging.Log; | ||||
| import nc.bs.mmpac.pickm.bp.PickmApproveBP; | ||||
| import nc.bs.mmpac.pickm.bp.PickmDeleteBP; | ||||
| import nc.bs.mmpac.pickm.bp.PickmFinishBP; | ||||
| import nc.bs.mmpac.pickm.bp.PickmInsertBP; | ||||
| import nc.bs.mmpac.pickm.bp.PickmUnApproveBP; | ||||
| import nc.bs.mmpac.pickm.bp.PickmUnFinishBP; | ||||
| import nc.bs.mmpac.pickm.bp.PickmUpdateBP; | ||||
| import nc.bs.uapbd.util.ThirdPartyPostRequestUtil; | ||||
| import nc.impl.pubapp.pattern.data.vo.VOQuery; | ||||
| import nc.itf.bd.material.baseinfo.IMaterialBaseInfoQueryService; | ||||
| import nc.itf.mmpac.pickm.IPickmMaintainService; | ||||
| import nc.itf.mmpac.pickm.IPickmTransTypeService; | ||||
| import nc.jdbc.framework.processor.ColumnProcessor; | ||||
| import nc.pubitf.para.SysInitQuery; | ||||
| import nc.util.mmf.framework.base.MMValueCheck; | ||||
| import nc.vo.bc.pmpub.project.ProjectHeadVO; | ||||
| import nc.vo.bd.material.MaterialVO; | ||||
| import nc.vo.cmp.util.StringUtils; | ||||
| import nc.vo.mmpac.pickm.entity.AggPickmVO; | ||||
| import nc.vo.mmpac.pickm.entity.PickmHeadVO; | ||||
| import nc.vo.mmpac.pickm.entity.PickmItemVO; | ||||
| import nc.vo.mmpac.pickm.entity.PickmTransTypeVO; | ||||
| import nc.vo.mmpac.pmo.pac0002.entity.PMOItemVO; | ||||
| import nc.vo.org.OrgVO; | ||||
| import nc.vo.pub.BusinessException; | ||||
| import nc.vo.pub.ISuperVO; | ||||
| import nc.vo.pub.IVOMeta; | ||||
| import nc.vo.pub.VOStatus; | ||||
| import nc.vo.pub.lang.UFBoolean; | ||||
| import nc.vo.pub.lang.UFDate; | ||||
| import nc.vo.pub.lang.UFDouble; | ||||
| import nc.vo.pubapp.pattern.exception.ExceptionUtils; | ||||
| import nc.vo.pubapp.pattern.model.entity.bill.AbstractBill; | ||||
| import nc.vo.pubapp.pattern.model.meta.entity.bill.IBillMeta; | ||||
| import nc.vo.pubapp.pattern.model.transfer.bill.ClientBillCombinServer; | ||||
| import nc.vo.pubapp.pattern.pub.SqlBuilder; | ||||
| import nc.vo.scmpub.util.ArrayUtil; | ||||
| import nc.vo.scmpub.util.CollectionUtils; | ||||
| import nc.vo.util.CloneUtil; | ||||
| import nccloud.pubitf.mmpub.commit.service.IBatchRunScriptService; | ||||
| import nccloud.pubitf.riart.pflow.CloudPFlowContext; | ||||
| 
 | ||||
| /** | ||||
|  * 备料计划操作实现类 | ||||
|  */ | ||||
| public class PickmMaintainServiceImpl implements IPickmMaintainService { | ||||
|     private static Log log = Log.getInstance("rzmomlog"); | ||||
| 
 | ||||
|     private static BaseDAO dao = new BaseDAO(); | ||||
|     /** | ||||
|      * 备料计划审核,分别有流程和离散重写 | ||||
|      */ | ||||
|     @Override | ||||
|     public AggPickmVO[] auditPickm(AggPickmVO[] vos) throws BusinessException { | ||||
|         // 审批操作 | ||||
|         PickmApproveBP auditbp = new PickmApproveBP(); | ||||
|         return auditbp.batchApprovePickm(vos); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 删除备料计划 | ||||
|      */ | ||||
|     @Override | ||||
|     public void delete(AggPickmVO[] vos) throws BusinessException { | ||||
|         try { | ||||
|             // 删除操作 | ||||
|             PickmDeleteBP deleteBP = new PickmDeleteBP(); | ||||
|             deleteBP.delete(vos, false); | ||||
|         } catch (Exception e) { | ||||
|             ExceptionUtils.marsh(e); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 备料计划完成,分别有流程离散重写 | ||||
|      */ | ||||
|     @Override | ||||
|     public AggPickmVO[] finishPickm(AggPickmVO[] vos) throws BusinessException { | ||||
|         // 完成操作 | ||||
|         PickmFinishBP finishbp = new PickmFinishBP(); | ||||
|         return finishbp.finish(vos); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 新增备料计划 | ||||
|      */ | ||||
|     @Override | ||||
|     public AggPickmVO[] insert(AggPickmVO[] vos) throws BusinessException { | ||||
|         // vos = | ||||
|         // NCLocator.getInstance().lookup(IPickmMaintainService.class).insert_RequiresNew(vos); | ||||
|         // // 根据交易类型进行保存即审核规则 | ||||
|         // IRule<AggPickmVO> pickmAutoApproveRule = new PickmAutoApproveAfterSaveRule(); | ||||
|         // pickmAutoApproveRule.process(vos); | ||||
|         try { | ||||
|             PickmInsertBP bp = new PickmInsertBP(); | ||||
|             return bp.insert(vos); | ||||
|         } catch (Exception e) { | ||||
|             ExceptionUtils.marsh(e); | ||||
|         } | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 备料计划弃审,分别由流程离散重写 | ||||
|      */ | ||||
|     @Override | ||||
|     public AggPickmVO[] unAuditPickm(AggPickmVO[] vos) throws BusinessException { | ||||
|         // 审批操作 | ||||
|         PickmUnApproveBP auditbp = new PickmUnApproveBP(); | ||||
|         return auditbp.batchUnApprovePickm(vos); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 备料计划取消完成,分别有流程离散备料计划重写 | ||||
|      */ | ||||
|     @Override | ||||
|     public AggPickmVO[] unfinishPickm(AggPickmVO[] vos) throws BusinessException { | ||||
|         // 取消完成操作 | ||||
|         PickmUnFinishBP finishbp = new PickmUnFinishBP(); | ||||
|         return finishbp.unfinish(vos); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 修改备料计划 | ||||
|      */ | ||||
|     @Override | ||||
|     public AggPickmVO[] update(AggPickmVO[] vos) throws BusinessException { | ||||
|         try { | ||||
|             // 更新操作 | ||||
|             PickmUpdateBP bp = new PickmUpdateBP(); | ||||
|             vos = bp.update(vos, false, false); | ||||
|         } catch (Exception e) { | ||||
|             ExceptionUtils.marsh(e); | ||||
|         } | ||||
|         return vos; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 修改备料计划,同时更新预留 | ||||
|      */ | ||||
|     @Override | ||||
|     public AggPickmVO[] updateForYL(AggPickmVO[] vos) throws BusinessException { | ||||
|         try { | ||||
|             // 更新操作 | ||||
|             PickmUpdateBP bp = new PickmUpdateBP(true); | ||||
|             vos = bp.update(vos, true, false); | ||||
|         } catch (Exception e) { | ||||
|             ExceptionUtils.marsh(e); | ||||
|         } | ||||
|         return vos; | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public AggPickmVO[] updateForYLForNcc(AggPickmVO[] vos) throws BusinessException { | ||||
|         try { | ||||
|             // 更新操作 | ||||
|             PickmUpdateBP bp = new PickmUpdateBP(true); | ||||
|             vos = bp.update(vos, true, false); | ||||
|         } catch (Exception e) { | ||||
|             ExceptionUtils.marsh(e); | ||||
|         } | ||||
|         return vos; | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public AggPickmVO[] saveAndCommitPickm(AggPickmVO[] vos, UFBoolean isUpdate, UFBoolean isUpdateForYL) | ||||
|             throws BusinessException { | ||||
|         ClientBillCombinServer<AbstractBill> utils = new ClientBillCombinServer<AbstractBill>(); | ||||
|         PickmUpdateBP updateBP = new PickmUpdateBP(true); | ||||
|         Object[] objects = null; | ||||
|         if (MMValueCheck.isTrue(isUpdate)) { | ||||
|             if (MMValueCheck.isTrue(isUpdateForYL)) { | ||||
|                 objects = updateBP.update(vos, true, false); | ||||
|             } else { | ||||
|                 objects = updateBP.update(vos, false, false); | ||||
|             } | ||||
|         } else { | ||||
|             PickmInsertBP insertBP = new PickmInsertBP(); | ||||
|             objects = insertBP.insert(vos); | ||||
|         } | ||||
|         this.filterDeleteBodyData(vos); | ||||
|         utils.combine(vos, (AbstractBill[]) objects); | ||||
| 
 | ||||
|         UFBoolean autoAuditFlag = this.getBSaveToAuditByTransTypeID(vos[0].getParentVO().getVbusitypeid()); | ||||
|         if (MMValueCheck.isNotEmpty(vos)) { | ||||
|             if (autoAuditFlag.booleanValue()) {// 非保存即审核时执行提交 | ||||
|                 return vos; | ||||
|             } | ||||
|             // 执行提交 | ||||
|             CloudPFlowContext context = new CloudPFlowContext(); | ||||
|             context.setBillType("55A3"); | ||||
|             context.setActionName("SAVE"); | ||||
|             context.setBillVos(vos); | ||||
|             IBatchRunScriptService service = NCLocator.getInstance().lookup(IBatchRunScriptService.class); | ||||
|             Object[] obj = service.run(context, AggPickmVO.class); | ||||
|             this.filterDeleteBodyData(vos); | ||||
|             utils.combine(vos, (AbstractBill[]) obj); | ||||
|             return vos; | ||||
|         } | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public AggPickmVO[] pushRZMes(AggPickmVO[] vos) throws BusinessException { | ||||
|         if (ArrayUtil.isEmpty(vos)) { | ||||
|             return null; | ||||
|         } | ||||
|         try { | ||||
|             AggPickmVO[] cloneOrderVOS = (AggPickmVO[]) CloneUtil.deepClone(vos); | ||||
|             // 检查并筛选领料组织 | ||||
|             List<AggPickmVO> newAggPickmVOS = checkAndFilterBillSrcOrg(cloneOrderVOS); | ||||
|             if (newAggPickmVOS.isEmpty()) { | ||||
|                 return vos; | ||||
|             } | ||||
|             Boolean is55A2OR30=checkSrcBillType(newAggPickmVOS); | ||||
|             if(is55A2OR30){ | ||||
|                 //来源生产订单 | ||||
|                 pushToRZMOMBy55A2(newAggPickmVOS.toArray(new AggPickmVO[0])); | ||||
|             }else{ | ||||
|                 //来源委外订单 | ||||
|                 pushToRZMOMBy61(newAggPickmVOS.toArray(new AggPickmVO[0])); | ||||
|             } | ||||
|         } catch (Exception e) { | ||||
|             ExceptionUtils.wrappException(e); | ||||
|         } | ||||
|         return vos; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 过滤删除的行 TODO | ||||
|      * | ||||
|      * @param uiBillArrays | ||||
|      * | ||||
|      */ | ||||
|     private void filterDeleteBodyData(AbstractBill[] uiBillArrays) { | ||||
|         for (AbstractBill bill : uiBillArrays) { | ||||
|             // change by zhangshqb 改为支持一主多子的聚合VO | ||||
|             IBillMeta metaData = bill.getMetaData(); | ||||
|             IVOMeta[] children = metaData.getChildren(); | ||||
|             for (IVOMeta ivoMeta : children) { | ||||
|                 List<ISuperVO> normal = new ArrayList<ISuperVO>(); | ||||
|                 ISuperVO[] childs = bill.getChildren(ivoMeta); | ||||
|                 if (childs != null && childs.length > 0) { | ||||
|                     for (ISuperVO child : childs) { | ||||
|                         if (child.getStatus() != VOStatus.DELETED) { | ||||
|                             normal.add(child); | ||||
|                         } | ||||
|                     } | ||||
|                     bill.setChildren(ivoMeta, CollectionUtils.listToArray(normal)); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     private UFBoolean getBSaveToAuditByTransTypeID(String vbusitypeid) { | ||||
| 
 | ||||
|         IPickmTransTypeService service = NCLocator.getInstance().lookup(IPickmTransTypeService.class); | ||||
|         try { | ||||
|             PickmTransTypeVO typevo = service.queryTransTypeVO(vbusitypeid); | ||||
|             if (MMValueCheck.isEmpty(typevo)) { | ||||
|                 return UFBoolean.FALSE; | ||||
|             } | ||||
|             return typevo.getBautoaduitaftersave() == null ? UFBoolean.FALSE : typevo.getBautoaduitaftersave(); | ||||
| 
 | ||||
|         } catch (BusinessException e) { | ||||
|             ExceptionUtils.wrappException(e); | ||||
|         } | ||||
|         return UFBoolean.FALSE; | ||||
|     } | ||||
| 
 | ||||
|     private Boolean checkSrcBillType(List<AggPickmVO> newAggPickmVOS) throws BusinessException { | ||||
|         UFBoolean is61=UFBoolean.FALSE; | ||||
|         UFBoolean is55A2OR30=UFBoolean.FALSE; | ||||
|         for (AggPickmVO aggPickmVO : newAggPickmVOS) { | ||||
|             String vfirstbilltype = aggPickmVO.getParentVO().getVfirstbilltype(); | ||||
|             if("61".equals(vfirstbilltype)){ | ||||
|                 is61=UFBoolean.TRUE; | ||||
|             }else if("55A2".equals(vfirstbilltype)){ | ||||
|                 is55A2OR30=UFBoolean.TRUE; | ||||
|             }else if("30".equals(vfirstbilltype)){ | ||||
|                 is55A2OR30=UFBoolean.TRUE; | ||||
|             } | ||||
|         } | ||||
|         if(is55A2OR30.booleanValue()&&is61.booleanValue()){ | ||||
|             throw new BusinessException("备料计划推送锐制失败,原因:不允许源头单据类型为生产订单和委外订单的单据同时审批"); | ||||
|         } | ||||
|         return is55A2OR30.booleanValue(); | ||||
|     } | ||||
|     private void buildSyncDataBy55A2(PickmHeadVO head, PickmItemVO[] bodys, JSONArray details) throws BusinessException { | ||||
|         Integer fsourcetype = head.getFsourcetype(); | ||||
|         if(fsourcetype!=0){ | ||||
|             return; | ||||
|         } | ||||
|         //2025年8月12日08点55分--新增生产订单项目字段信息 | ||||
|         String csourcebillrowid = head.getCsourcebillrowid(); | ||||
|         PMOItemVO[] srcBVOs = new VOQuery<PMOItemVO>(PMOItemVO.class).query(new String[]{csourcebillrowid}); | ||||
|         ProjectHeadVO[] cprojectVOs=null; | ||||
|         if(srcBVOs!=null&&srcBVOs.length>0){ | ||||
|             String cprojectid = srcBVOs[0].getCprojectid(); | ||||
|             if(!StringUtils.isEmpty(cprojectid)){ | ||||
|                 cprojectVOs= new VOQuery<ProjectHeadVO>(ProjectHeadVO.class).query(new String[]{cprojectid}); | ||||
|             } | ||||
|         } | ||||
|         //end | ||||
|         for (PickmItemVO body : bodys) { | ||||
|             JSONObject singleObj = new JSONObject(); | ||||
|             String vsourcebillcode = head.getVsourcebillcode(); | ||||
|             String wlbm_wbid =body.getCbmaterialvid(); | ||||
|             String scgx_wbid =head.getVstdprocid(); | ||||
|             //wbid	varchar (200)	第三方系统主键id | ||||
|             singleObj.put("wbid", head.getCpickmid()+"_"+body.getCpickm_bid()); // 第三方系统主键id | ||||
|             //operate	int	操作状态	必填	1新增/修改、2删除(删除时只需上传wbid) | ||||
|             singleObj.put("operate", "1"); | ||||
|             //wbzbid	varchar (200)	第三方系统分组id | ||||
|             singleObj.put("wbzbid", head.getCpickmid()); | ||||
| 
 | ||||
|             //wbqjpx	varchar(2000)	全局排序	必填	BOM表物料行号 | ||||
|             singleObj.put("wbqjpx", body.getVrowno()); | ||||
| 
 | ||||
|             //scjh_wbid	varchar(100)	第三方系统生产计划ID	必填	生产计划号外部ID,一般ERP系统的生产订单号。 | ||||
|             singleObj.put("scjh_wbid", head.getCsourcebillid()); | ||||
| 
 | ||||
| 
 | ||||
|             //jhxh	numeric(5)	计划序号	-生产订单行号 | ||||
|             singleObj.put("jhxh", head.getVsourcebillrowno()); | ||||
| 
 | ||||
|             singleObj.put("wlbm_wbid", wlbm_wbid); // 第三方系统材料id | ||||
| 
 | ||||
|             //bomlx	int	BOM类型	必填	默认=0,即传入生产BOM(1为包装BOM)。 | ||||
|             singleObj.put("bomlx", 0); | ||||
|             if(body.getNunituseastnum()==null ){ | ||||
|                 singleObj.put("dwyl", UFDouble.ZERO_DBL.getDouble()); // 单位用量nunituseastnum | ||||
|                 singleObj.put("djyl", UFDouble.ZERO_DBL.getDouble()); // 单据用量nunituseastnum | ||||
|             }else{ | ||||
|                 singleObj.put("dwyl", body.getNunituseastnum().getDouble()); // 单位用量nunituseastnum | ||||
|                 singleObj.put("djyl", body.getNunituseastnum().getDouble()); // 单据用量nunituseastnum | ||||
|             } | ||||
| 
 | ||||
|             singleObj.put("clyl", body.getNplanoutastnum().getDouble()); // 材料用量 | ||||
| 
 | ||||
| //            String rccode = transferCodeByPk(RcVO.getDefaultTableName(), RcVO.VRCCODE, RcVO.CRCID, head.getVstdprocid()); | ||||
|             singleObj.put("scgx_wbid", body.getVbdef11()); | ||||
| //            singleObj.put("scgx_wbid", rccode); // 第三方系统使用工序id | ||||
| 
 | ||||
|             //sdbj	int	锁定标记	必填	默认1:正常业务ERP审核后,传输至锐制MOM | ||||
|             singleObj.put("sdbj", 1); | ||||
|             //shbj	int	审核标记	必填	默认1:正常业务ERP审核后,传输至锐制MOM | ||||
|             singleObj.put("shbj", 1); | ||||
| 
 | ||||
|             //jylxbm -- | ||||
|             singleObj.put("jylxbm", head.getVbusitype()); | ||||
| 
 | ||||
|             //2025年8月12日08点55分--新增生产订单项目字段信息    start | ||||
|             if(cprojectVOs!=null && cprojectVOs.length>0){ | ||||
|                 singleObj.put("wlzdycs06", cprojectVOs[0].getProject_code()); | ||||
|                 singleObj.put("wlzdycs11", cprojectVOs[0].getProject_name()); | ||||
|             } | ||||
|             //2025年8月12日08点55分--新增生产订单项目字段信息 end | ||||
| 
 | ||||
|             //2025年9月1日15点14分--新增需用日期字段 -start | ||||
|             UFDate drequiredate = body.getDrequiredate(); | ||||
|             singleObj.put("wlzdycs19", drequiredate==null?null:drequiredate.toStdString()); | ||||
|             //2025年9月1日15点14分--新增需用日期字段 -end | ||||
| 
 | ||||
|             details.add(singleObj); | ||||
| 
 | ||||
|         } | ||||
|     } | ||||
|     private void buildSyncDataBy61(PickmHeadVO head, PickmItemVO[] bodys, JSONArray details) throws BusinessException { | ||||
|         Integer fsourcetype = head.getFsourcetype(); | ||||
|         if(fsourcetype!=1){ | ||||
|             return; | ||||
|         } | ||||
|         for (PickmItemVO body : bodys) { | ||||
|             JSONObject singleObj = new JSONObject(); | ||||
|             String vsourcebillcode = head.getVsourcebillcode(); | ||||
|             String wlbm_wbid =body.getCbmaterialvid(); | ||||
| 
 | ||||
|             String scgx_wbid =head.getVstdprocid(); | ||||
|             //wbid	varchar (200)	第三方系统主键id | ||||
|             singleObj.put("wbid", head.getCpickmid()+"_"+body.getCpickm_bid()); // 第三方系统主键id | ||||
|             //wbzbid	varchar (200)	第三方系统分组id | ||||
|             singleObj.put("wbpid", head.getCpickmid()); | ||||
|             //operate	int	操作状态	必填	1新增/修改、2删除(删除时只需上传wbid) | ||||
|             singleObj.put("operate", "1"); | ||||
|             //djly	varchar(20)	来源单据	必填	取值read_djlyb中编号 | ||||
|             //领料通知默认1011 | ||||
|             singleObj.put("djly", "1011"); | ||||
| 
 | ||||
|             //_id	varchar(50)	单据id	必填	后台该单据类型的唯一ID | ||||
|             singleObj.put("djbh_id", head.getCpickmid()); | ||||
| 
 | ||||
|             //djbh	varchar(100)	单据编号	必填	前台单据编号 | ||||
|             singleObj.put("djbh", head.getVbillcode()); | ||||
| 
 | ||||
|             //djxh	numeric(5)	单据序号	必填	前台单据序号 | ||||
|             singleObj.put("djxh", body.getVrowno()); | ||||
| 
 | ||||
|             //djrq	datetime	单据日期	必填 | ||||
|             singleObj.put("djrq", head.getDmakedate().toString()); | ||||
| 
 | ||||
|             //wlbm_wbid	varchar(100)	第三方系统物料名称id	必填	物料编码的后台ID | ||||
|             singleObj.put("wlbm_wbid", wlbm_wbid); | ||||
| 
 | ||||
|             //djsl	numeric(18,3)	单据数量	必填 | ||||
|             UFDouble djsl = body.getNplanoutastnum() == null ? UFDouble.ZERO_DBL : body.getNplanoutastnum(); | ||||
|             singleObj.put("djsl", djsl.getDouble()); | ||||
| 
 | ||||
|             //sddd	varchar(510)送达地点	必填	传仓库名称,要求上位ERP仓库名称不重复。 | ||||
| //            singleObj.put("sddd", transferCodeByPk(StordocVO.getDefaultTableName(), StordocVO.NAME, StordocVO.PK_STORDOC, body.getCoutstockid())); | ||||
| 
 | ||||
|             //ckbh_wbid	varchar(100)	第三方系统仓库id	必填	储区根据仓库默认,同仓库多储区时,两者必填; | ||||
| //            singleObj.put("ckbh_wbid",body.getCoutstockid()); | ||||
| 
 | ||||
|             //qfbj	int	签发标记	必填	默认1;上位系统审核传至MOM	1 | ||||
|             singleObj.put("qfbj", 1); | ||||
| 
 | ||||
|             //cght_wbid	varchar(100)	第三方系统合同id	必填	委外订单主键ID | ||||
|             singleObj.put("cght_wbid",head.getCfirstbillid()); | ||||
|             //htbh	varchar(100)	合同号	 	委外订单单据号 | ||||
|             singleObj.put("htbh",head.getVfirstbillcode()); | ||||
| 
 | ||||
|             //htxh	numeric(5)	合同序号	 	 委外订单单据序号 | ||||
|             singleObj.put("htxh",head.getVfirstbillrowno()); | ||||
| 
 | ||||
|             //cght_wbid	varchar(100)	第三方系统合同id	必填 | ||||
| //            singleObj.put("cght_wbid", transferCodeByPk("bd_defdoc", DefdocVO.CODE, DefdocVO.PK_DEFDOC, body.getVbdef5())); | ||||
|             details.add(singleObj); | ||||
| 
 | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     private List<AggPickmVO> checkAndFilterBillSrcOrg(AggPickmVO[] aggPickmVOS) throws BusinessException { | ||||
|         List<AggPickmVO> aggvoList = new ArrayList<>(); | ||||
|         List<AggPickmVO> finalList = new ArrayList<>(); | ||||
| 
 | ||||
|         for (AggPickmVO aggvo : aggPickmVOS) { | ||||
|             String pkOrg = aggvo.getParentVO().getPk_org(); | ||||
|             String orgCode = transferCodeByPk(OrgVO.getDefaultTableName(), OrgVO.CODE, OrgVO.PK_ORG, pkOrg); | ||||
|             //过滤上游不是生产订单和委外订单的备料计划 | ||||
|             String vfirstbilltype = aggvo.getParentVO().getVfirstbilltype(); | ||||
|             String vdef20 = aggvo.getParentVO().getVdef20(); | ||||
|             if(vdef20==null||"N".equals(vdef20)){ | ||||
|                 if ("C022".equals(orgCode)&& 1 == aggvo.getParentVO().getFbillstatus()&&aggvo.getChildrenVO()!=null && aggvo.getChildrenVO().length > 0) { | ||||
|                     if("61".equals(vfirstbilltype)||"55A2".equals(vfirstbilltype)||"30".equals(vfirstbilltype)){ | ||||
|                         //2025年7月2日10点33分--新增不传--表体物料编码前三位为103时不传 | ||||
|                         //获取表体物料信息 | ||||
|                         aggvoList.add(aggvo); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|         } | ||||
|         //再次筛选 | ||||
|         //2025年7月2日10点33分--新增不传--表体物料编码前三位为103时不传 | ||||
|         //获取表体物料信息 | ||||
|         if(aggvoList.isEmpty()){ | ||||
|             return aggvoList; | ||||
|         } | ||||
|         Set<String> materialpks=new HashSet<>(); | ||||
|         for (AggPickmVO aggvo : aggvoList) { | ||||
|             PickmItemVO[] items = (PickmItemVO[]) aggvo.getChildren(PickmItemVO.class); | ||||
|             for (PickmItemVO item : items) { | ||||
|                 String cbmaterialvid = item.getCbmaterialvid(); | ||||
|                 materialpks.add(cbmaterialvid); | ||||
|             } | ||||
|         } | ||||
|         if(materialpks.isEmpty()){ | ||||
|             return aggvoList; | ||||
|         } | ||||
|         //根据物料id查询物料信息 | ||||
|         MaterialVO[] vos = NCLocator.getInstance().lookup(IMaterialBaseInfoQueryService.class).queryDataByPks(materialpks.toArray(new String[0])); | ||||
|         //组装Map | ||||
|         Map<String, String> materialMap = new HashMap<>(); | ||||
|         if(vos==null || vos.length<1){ | ||||
|             throw new BusinessException("Failed to query material info , please check !!!"); | ||||
|         } | ||||
|         for (MaterialVO vo : vos) { | ||||
|             String cmaterialvid = vo.getPk_material(); | ||||
|             String cmaterialcode =vo.getCode(); | ||||
|             materialMap.put(cmaterialvid, cmaterialcode); | ||||
|         } | ||||
|         //筛选行数据 | ||||
|         for (AggPickmVO aggvo : aggvoList) { | ||||
|             List<PickmItemVO> newItems = new ArrayList<>(); | ||||
|             PickmItemVO[] items = (PickmItemVO[]) aggvo.getChildren(PickmItemVO.class); | ||||
|             for (PickmItemVO item : items) { | ||||
|                 String cmaterialvid = item.getCbmaterialvid(); | ||||
|                 if (materialMap.containsKey(cmaterialvid)) { | ||||
|                     String materialCode = materialMap.get(cmaterialvid); | ||||
|                     if(!materialCode.startsWith("103")){ | ||||
|                         newItems.add(item); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             if (!newItems.isEmpty()) { | ||||
|                 aggvo.setChildren(PickmItemVO.class,newItems.toArray(new PickmItemVO[0])); | ||||
|                 finalList.add(aggvo); | ||||
|             } | ||||
|         } | ||||
|         return finalList; | ||||
|     } | ||||
| 
 | ||||
|     private void pushToRZMOMBy55A2(AggPickmVO[] aggPickmVOS) throws BusinessException { | ||||
|         String rzwmsip = SysInitQuery.getParaString("GLOBLE00000000000000", "RZWMSIP"); | ||||
|         JSONObject jsonObject = new JSONObject(); | ||||
|         JSONObject dataIn = new JSONObject(); | ||||
|         JSONObject dataIn2 = new JSONObject(); | ||||
|         JSONArray details = new JSONArray(); | ||||
|         jsonObject.put("dataflow", "用友BIP→RZMOMv6"); | ||||
|         jsonObject.put("actionCode", "scbomb"); | ||||
| 
 | ||||
|         for (AggPickmVO aggPickmVO : aggPickmVOS) { | ||||
|             PickmHeadVO head = aggPickmVO.getParentVO(); | ||||
|             PickmItemVO[] bodys = (PickmItemVO[]) aggPickmVO.getChildrenVO(); | ||||
|             buildSyncDataBy55A2(head, bodys, details); | ||||
|         } | ||||
|         dataIn2.put("Details", details); | ||||
|         dataIn.put("Data", dataIn2); | ||||
|         jsonObject.put("data", dataIn); | ||||
|         log.error("生产BOW推送锐制请求报文:" + jsonObject.toJSONString()); | ||||
|         String result = ThirdPartyPostRequestUtil.sendPostRequest(rzwmsip, jsonObject.toJSONString()); | ||||
|         JSONObject resultObj = JSONObject.parseObject(result); | ||||
|         if (resultObj == null || !"true".equals(resultObj.getString("success"))) { | ||||
|             String errorMsg = resultObj == null ? "接口返回为空" : resultObj.getString("msg"); | ||||
|             throw new BusinessException("RZ同步失败,原因:" + errorMsg); | ||||
|         }else{ | ||||
|             log.error("RZMOM同步成功,返回参数【"+resultObj.toJSONString()+"】"); | ||||
|         } | ||||
|     } | ||||
|     private void pushToRZMOMBy61(AggPickmVO[] aggPickmVOS) throws BusinessException { | ||||
|         String rzwmsip = SysInitQuery.getParaString("GLOBLE00000000000000", "RZWMSIP"); | ||||
|         JSONObject jsonObject = new JSONObject(); | ||||
|         JSONObject dataIn = new JSONObject(); | ||||
|         JSONObject dataIn2 = new JSONObject(); | ||||
|         JSONArray details = new JSONArray(); | ||||
|         jsonObject.put("dataflow", "用友BIP→RZMOMv6"); | ||||
|         jsonObject.put("actionCode", "wwfhtzdb"); | ||||
| 
 | ||||
|         for (AggPickmVO aggPickmVO : aggPickmVOS) { | ||||
|             PickmHeadVO head = aggPickmVO.getParentVO(); | ||||
|             PickmItemVO[] bodys = (PickmItemVO[]) aggPickmVO.getChildrenVO(); | ||||
|             buildSyncDataBy61(head, bodys, details); | ||||
|         } | ||||
|         dataIn2.put("Details", details); | ||||
|         dataIn.put("Data", dataIn2); | ||||
|         jsonObject.put("data", dataIn); | ||||
|         log.error("生产BOW推送锐制请求报文:" + jsonObject.toJSONString()); | ||||
|         String result = ThirdPartyPostRequestUtil.sendPostRequest(rzwmsip, jsonObject.toJSONString()); | ||||
|         JSONObject resultObj = JSONObject.parseObject(result); | ||||
|         if (resultObj == null || !"true".equals(resultObj.getString("success"))) { | ||||
|             String errorMsg = resultObj == null ? "接口返回为空" : resultObj.getString("msg"); | ||||
|             throw new BusinessException("RZ同步失败,原因:" + errorMsg); | ||||
|         }else{ | ||||
|             log.error("RZMOM同步成功,返回参数【"+resultObj.toJSONString()+"】"); | ||||
|         } | ||||
|     } | ||||
|     private String transferCodeByPk(String tableName, String selectField, String pkField, String pk) throws BusinessException { | ||||
|         if (StringUtils.isEmpty(pk)) { | ||||
|             return null; | ||||
|         } | ||||
|         SqlBuilder sqlBuilder = new SqlBuilder(); | ||||
|         sqlBuilder.append(" select " + selectField); | ||||
|         sqlBuilder.append(" from " + tableName); | ||||
|         sqlBuilder.append(" where "); | ||||
|         sqlBuilder.append(pkField, pk); | ||||
|         Object o = dao.executeQuery(sqlBuilder.toString(), new ColumnProcessor()); | ||||
|         if (o == null) { | ||||
|             throw new BusinessException("未查询到编码信息,sql【" + sqlBuilder + "】"); | ||||
|         } | ||||
|         return o.toString(); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
|  | @ -0,0 +1,103 @@ | |||
| package nc.itf.mmpac.pickm; | ||||
| 
 | ||||
| import nc.vo.mmpac.pickm.entity.AggPickmVO; | ||||
| import nc.vo.pub.BusinessException; | ||||
| import nc.vo.pub.lang.UFBoolean; | ||||
| 
 | ||||
| /** | ||||
|  * 标准单据业务操作接口,增删改查 | ||||
|  * | ||||
|  * @since 6.0 | ||||
|  * @version 2010-12-16 下午04:36:00 | ||||
|  * @author | ||||
|  */ | ||||
| public interface IPickmMaintainService { | ||||
| 
 | ||||
|     /** | ||||
|      * 删除备料计划单据 | ||||
|      * | ||||
|      * @param AggPickmVO | ||||
|      * @throws BusinessException | ||||
|      */ | ||||
|     void delete(AggPickmVO[] vos) throws BusinessException; | ||||
| 
 | ||||
|     /** | ||||
|      * 新增备料计划单据 | ||||
|      * | ||||
|      * @param AggPickmVO | ||||
|      * @return AggPickmVO | ||||
|      * @throws BusinessException | ||||
|      */ | ||||
|     AggPickmVO[] insert(AggPickmVO[] vos) throws BusinessException; | ||||
| 
 | ||||
|     /** | ||||
|      * 更新备料计划单据 | ||||
|      * | ||||
|      * @param AggPickmVO | ||||
|      * @return AggPickmVO | ||||
|      * @throws BusinessException | ||||
|      */ | ||||
|     AggPickmVO[] update(AggPickmVO[] vos) throws BusinessException; | ||||
| 
 | ||||
|     /** | ||||
|      * 为预留更新单据 | ||||
|      * | ||||
|      * @param AggPickmVO | ||||
|      * @return AggPickmVO | ||||
|      * @throws BusinessException | ||||
|      */ | ||||
|     AggPickmVO[] updateForYL(AggPickmVO[] vos) throws BusinessException; | ||||
|     AggPickmVO[] updateForYLForNcc(AggPickmVO[] vos) throws BusinessException; | ||||
| 
 | ||||
|     /** | ||||
|      * 备料计划审核 | ||||
|      * | ||||
|      * @param AggPickmVO | ||||
|      * @return AggPickmVO | ||||
|      * @throws BusinessException | ||||
|      */ | ||||
|     AggPickmVO[] auditPickm(AggPickmVO[] vos) throws BusinessException; | ||||
| 
 | ||||
|     /** | ||||
|      * 备料计划取消审核 | ||||
|      * | ||||
|      * @param AggPickmVO | ||||
|      * @return AggPickmVO | ||||
|      * @throws BusinessException | ||||
|      */ | ||||
|     AggPickmVO[] unAuditPickm(AggPickmVO[] vos) throws BusinessException; | ||||
| 
 | ||||
|     /** | ||||
|      * 备料计划完成 | ||||
|      * | ||||
|      * @param AggPickmVO | ||||
|      * @return AggPickmVO | ||||
|      * @throws BusinessException | ||||
|      */ | ||||
|     AggPickmVO[] finishPickm(AggPickmVO[] vos) throws BusinessException; | ||||
| 
 | ||||
|     /** | ||||
|      * 备料计划取消完成 | ||||
|      * | ||||
|      * @param AggPickmVO | ||||
|      * @return AggPickmVO | ||||
|      * @throws BusinessException | ||||
|      */ | ||||
|     AggPickmVO[] unfinishPickm(AggPickmVO[] vos) throws BusinessException; | ||||
|     /** | ||||
|      * 备料计划保存提交 | ||||
|      * | ||||
|      * @param AggPickmVO | ||||
|      * @return AggPickmVO | ||||
|      * @throws BusinessException | ||||
|      */ | ||||
|     AggPickmVO[] saveAndCommitPickm(AggPickmVO[] vos,UFBoolean isUpdate,UFBoolean isUpdateForYL) throws BusinessException; | ||||
| 
 | ||||
|     /** | ||||
|      * 推送RZMES | ||||
|      * @param vos | ||||
|      * @return | ||||
|      * @throws BusinessException | ||||
|      */ | ||||
|     AggPickmVO[] pushRZMes(AggPickmVO[] vos) throws BusinessException; | ||||
| } | ||||
|  | @ -0,0 +1,702 @@ | |||
| package nccloud.openapi.mmpac.pickm; | ||||
| 
 | ||||
| import java.util.*; | ||||
| import javax.ws.rs.Consumes; | ||||
| import javax.ws.rs.POST; | ||||
| import javax.ws.rs.Path; | ||||
| import javax.ws.rs.Produces; | ||||
| 
 | ||||
| import nc.bs.dao.BaseDAO; | ||||
| import nc.bs.framework.common.NCLocator; | ||||
| import nc.bs.logging.Log; | ||||
| import nc.bs.scmpub.query.SCMBillQuery; | ||||
| import nc.itf.mmpac.pickm.IPickmMaintainService; | ||||
| import nc.jdbc.framework.processor.BeanListProcessor; | ||||
| import nc.jdbc.framework.processor.ColumnProcessor; | ||||
| import nc.jdbc.framework.processor.MapListProcessor; | ||||
| import nc.util.mmf.framework.base.MMCollectionUtil; | ||||
| import nc.vo.bd.bom.bom0202.entity.AggBomVO; | ||||
| import nc.vo.bd.bom.bom0202.entity.BomItemVO; | ||||
| import nc.vo.bd.bom.bom0202.entity.BomVO; | ||||
| import nc.vo.bd.material.MaterialVO; | ||||
| import nc.vo.bd.material.measdoc.MeasdocVO; | ||||
| import nc.vo.bd.psn.PsndocVO; | ||||
| import nc.vo.mmpac.pickm.entity.AggPickmVO; | ||||
| import nc.vo.mmpac.pickm.entity.PickmHeadVO; | ||||
| import nc.vo.mmpac.pickm.entity.PickmItemVO; | ||||
| import nc.vo.mmpac.pmo.pac0002.entity.PMOHeadVO; | ||||
| import nc.vo.mmpac.pmo.pac0002.entity.PMOItemVO; | ||||
| import nc.vo.org.GroupVO; | ||||
| import nc.vo.org.OrgVO; | ||||
| import nc.vo.org.StockOrgVO; | ||||
| import nc.vo.pub.*; | ||||
| import nc.vo.pub.lang.UFBoolean; | ||||
| import nc.vo.pubapp.AppContext; | ||||
| import nc.vo.pubapp.pattern.pub.SqlBuilder; | ||||
| import nc.vo.vorg.StockOrgVersionVO; | ||||
| import nc.ws.opm.pub.utils.result.APIErrCodeEnum; | ||||
| import nccloud.api.rest.utils.ResultMessageUtil; | ||||
| 
 | ||||
| import nccloud.ws.rest.resource.AbstractNCCRestResource; | ||||
| import org.json.JSONString; | ||||
| 
 | ||||
| @Path("mmpac/pickm") | ||||
| public class PickmResouce extends AbstractNCCRestResource { | ||||
|     private static String HEADTABLE = "mm_pickm"; | ||||
|     private static String BODYTABLE = "mm_pickm_b"; | ||||
|     private static final BaseDAO BASE_DAO = new BaseDAO(); | ||||
|     private static final Log logger = Log.getInstance("pmoresouceLogger"); | ||||
| 
 | ||||
|     private static Map<String, String> entityNameToClassName = new HashMap(); | ||||
| 
 | ||||
|     public PickmResouce() { | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     /** | ||||
|      * 备料计划 新增修改删除三个接口 openapi , 提供给mes, | ||||
|      * 备料计划是审批后的, 传递的是流程生产订单明细行主键, | ||||
|      * 操作的是流程备料计划的明细行,新增修改删除是针对于明细行来说的 | ||||
|      * 根据流程生产订单明细行的主键 可以查询到流程备料计划的AggVO,然后操作他的明细 | ||||
|      */ | ||||
|     @POST | ||||
|     @Path("save") | ||||
|     @Consumes({"application/json"}) | ||||
|     @Produces({"application/json"}) | ||||
|     public JSONString save(Map<String, Object> paramMap) { | ||||
|         logger.debug("开始进行备料计划明细行的新增操作"); | ||||
|         // 如果没有传递data属性 | ||||
|         if (!paramMap.containsKey("data")) { | ||||
|             return ResultMessageUtil.exceptionToJSON("传入数据异常,参数要包含data", APIErrCodeEnum.BUSINESSEXCCODE.getCode()); | ||||
|         } | ||||
|         try { | ||||
|             List<Map<String, Object>> batchData = (List) paramMap.get("data"); | ||||
|             IPickmMaintainService serv = (IPickmMaintainService) NCLocator.getInstance().lookup(IPickmMaintainService.class); | ||||
|             // 如果没有数据 | ||||
|             if (MMCollectionUtil.isEmpty(batchData)) { | ||||
|                 logger.info("传入数据异常,参数要包含data"); | ||||
|                 return ResultMessageUtil.exceptionToJSON("传入数据异常,参数要包含data", APIErrCodeEnum.BUSINESSEXCCODE.getCode()); | ||||
|             } | ||||
|             List<AggPickmVO> resAggVOS = new ArrayList<>(); | ||||
|             // 批量处理每一个主子表对象 | ||||
|             for (Map<String, Object> singleData : batchData) { | ||||
|                 if (!singleData.containsKey("pk_pmo")) { | ||||
|                     logger.info("传入数据异常,参数要包含pk_pmo"); | ||||
|                     return ResultMessageUtil.exceptionToJSON("传入数据异常,参数要包含pk_pmo", APIErrCodeEnum.BUSINESSEXCCODE.getCode()); | ||||
|                 } | ||||
|                 String pk_pmo = (String) singleData.get("pk_pmo"); | ||||
|                 // 查询表头 | ||||
|                 String searchHeadSql = "SELECT * FROM mm_pickm WHERE nvl(dr,0) = 0 AND vsourcemocode = '" + pk_pmo + "'"; | ||||
|                 List<Map<String, Object>> pickmHeadRows = (List<Map<String, Object>>) BASE_DAO.executeQuery(searchHeadSql, new MapListProcessor()); | ||||
|                 if (pickmHeadRows == null) { | ||||
|                     logger.info("根据pk_pmo查询的流程备料计划不存在"); | ||||
|                     return ResultMessageUtil.exceptionToJSON("根据pk_pmo查询的流程备料计划不存在", APIErrCodeEnum.BUSINESSEXCCODE.getCode()); | ||||
|                 } | ||||
|                 PickmHeadVO pickmHeadVO = transferToPickmHeadVO(pickmHeadRows.get(0), VOStatus.UPDATED); | ||||
|                 if (!singleData.containsKey("mm_pickm_b")) { | ||||
|                     logger.info("传入数据异常,参数要包含mm_pickm_b"); | ||||
|                     return ResultMessageUtil.exceptionToJSON("传入数据异常,参数要包含mm_pickm_b", APIErrCodeEnum.BUSINESSEXCCODE.getCode()); | ||||
|                 } | ||||
|                 List<Map<String, Object>> batchPickms = (List<Map<String, Object>>) singleData.get("mm_pickm_b"); | ||||
| 
 | ||||
|                 // 循环请求体中每一个备料计划明细 | ||||
|                 List<PickmItemVO> finalPickmItemVOS = null; | ||||
|                 for (Map<String, Object> singlePickm : batchPickms) { | ||||
|                     // 需要将singleData中的每一个code转为主键重新存储 | ||||
|                     Map<String, Object> newMap = transferSingleDataCodeToPk(singlePickm); | ||||
|                     PickmItemVO pickmItemVO = transferToPickmItemVO(newMap, VOStatus.NEW); | ||||
|                     // 查询表体 | ||||
|                     String searchBodySql = "SELECT * FROM mm_pickm_b WHERE nvl(dr,0) = 0 AND cpickmid = '" + pickmHeadVO.getCpickmid() + "'"; | ||||
|                     List<PickmItemVO> existingPickmItemVOS = (List<PickmItemVO>) BASE_DAO.executeQuery(searchBodySql, new BeanListProcessor(PickmItemVO.class)); | ||||
|                     if (existingPickmItemVOS == null) { | ||||
|                         logger.info("根据pk_pmo查询的流程备料计划明细不存在"); | ||||
|                         return ResultMessageUtil.exceptionToJSON("根据pk_pmo查询的流程备料计划明细不存在", APIErrCodeEnum.BUSINESSEXCCODE.getCode()); | ||||
|                     } | ||||
|                     // 如果已存在的不为空 | ||||
|                     finalPickmItemVOS = new ArrayList<>(existingPickmItemVOS); | ||||
|                     // 如果新增加的不为空 | ||||
|                     finalPickmItemVOS.add(pickmItemVO); | ||||
|                 } | ||||
|                 if (finalPickmItemVOS == null) { | ||||
|                     logger.info("数据异常 处理后备料计划明细为空"); | ||||
|                     return ResultMessageUtil.exceptionToJSON("数据异常 处理后备料计划明细为空", APIErrCodeEnum.BUSINESSEXCCODE.getCode()); | ||||
|                 } | ||||
|                 // 转换为AggVO | ||||
|                 PickmItemVO[] array = (PickmItemVO[]) finalPickmItemVOS.toArray(new PickmItemVO[0]); | ||||
|                 AggPickmVO aggPickmVO = new AggPickmVO(); | ||||
|                 aggPickmVO.setParent(pickmHeadVO); | ||||
|                 aggPickmVO.setChildren(PickmItemVO.class, array); | ||||
|                 aggPickmVO.getParentVO().setStatus(VOStatus.UPDATED); | ||||
|                 this.setDefaultValue(aggPickmVO); | ||||
|                 resAggVOS.add(aggPickmVO); | ||||
|             } | ||||
|             // 更新 | ||||
|             AggPickmVO[] updatedAggVOS = (AggPickmVO[]) resAggVOS.toArray(new AggPickmVO[0]); | ||||
|             AggPickmVO[] insertBills = serv.update(updatedAggVOS); | ||||
|             logger.info("备料计划明细行新增成功"); | ||||
|             return ResultMessageUtil.toJSON(insertBills, "备料计划明细行新增成功"); | ||||
|         } catch (Exception e) { | ||||
|             logger.error("备料计划明细行新增异常", e); | ||||
|             return ResultMessageUtil.exceptionToJSON(e); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     @POST | ||||
|     @Path("update") | ||||
|     @Consumes({"application/json"}) | ||||
|     @Produces({"application/json"}) | ||||
|     public JSONString update(Map<String, Object> paramMap) { | ||||
|         logger.debug("开始进行备料计划明细行的修改操作"); | ||||
|         // 如果没有传递data属性 | ||||
|         if (!paramMap.containsKey("data")) { | ||||
|             return ResultMessageUtil.exceptionToJSON("传入数据异常,参数要包含data", APIErrCodeEnum.BUSINESSEXCCODE.getCode()); | ||||
|         } | ||||
|         try { | ||||
|             List<Map<String, Object>> batchData = (List) paramMap.get("data"); | ||||
|             IPickmMaintainService serv = (IPickmMaintainService) NCLocator.getInstance().lookup(IPickmMaintainService.class); | ||||
|             // 如果没有数据 | ||||
|             if (MMCollectionUtil.isEmpty(batchData)) { | ||||
|                 logger.info("传入数据异常,参数要包含data"); | ||||
|                 return ResultMessageUtil.exceptionToJSON("传入数据异常,参数要包含data", APIErrCodeEnum.BUSINESSEXCCODE.getCode()); | ||||
|             } | ||||
|             List<AggPickmVO> resAggVOS = new ArrayList<>(); | ||||
|             // 批量处理每一个主子表对象 | ||||
|             for (Map<String, Object> singleData : batchData) { | ||||
|                 if (!singleData.containsKey("pk_pmo")) { | ||||
|                     logger.info("传入数据异常,参数要包含pk_pmo"); | ||||
|                     return ResultMessageUtil.exceptionToJSON("传入数据异常,参数要包含pk_pmo", APIErrCodeEnum.BUSINESSEXCCODE.getCode()); | ||||
|                 } | ||||
|                 // 根据流程生产订单明细 | ||||
|                 String pk_pmo = (String) singleData.get("pk_pmo"); | ||||
|                 PMOItemVO pmoItemVO = (PMOItemVO) BASE_DAO.retrieveByPK(PMOItemVO.class, pk_pmo); | ||||
|                 if (pmoItemVO == null) { | ||||
|                     logger.info("根据pk_pmo查询的流程生产订单明细行不存在"); | ||||
|                     return ResultMessageUtil.exceptionToJSON("根据pk_pmo查询的流程生产订单明细行不存在", APIErrCodeEnum.BUSINESSEXCCODE.getCode()); | ||||
|                 } | ||||
|                 List<PickmHeadVO> pickmHeadVOS = (List<PickmHeadVO>) BASE_DAO.retrieveByClause(PickmHeadVO.class, PickmHeadVO.VSOURCEMOROWID + " = '" + pk_pmo + "'"); | ||||
|                 if (pickmHeadVOS == null || pickmHeadVOS.isEmpty()) { | ||||
|                     logger.info("根据流程生产订单明细主键查询备料计划失败"); | ||||
|                     return ResultMessageUtil.exceptionToJSON("根据流程生产订单明细主键查询备料计划失败", APIErrCodeEnum.BUSINESSEXCCODE.getCode()); | ||||
|                 } | ||||
|                 PickmHeadVO pickmHeadVO = pickmHeadVOS.get(0); | ||||
|                 if (!singleData.containsKey("mm_pickm_b")) { | ||||
|                     logger.info("传入数据异常,参数要包含mm_pickm_b"); | ||||
|                     return ResultMessageUtil.exceptionToJSON("传入数据异常,参数要包含mm_pickm_b", APIErrCodeEnum.BUSINESSEXCCODE.getCode()); | ||||
|                 } | ||||
| 
 | ||||
|                 // 拿到每一个明细 进行修改 | ||||
|                 List<Map<String, Object>> batchPickms = (List<Map<String, Object>>) singleData.get("mm_pickm_b"); | ||||
| 
 | ||||
|                 // 先将物料编码相同的明细进行分组 | ||||
|                 Map<String, List<Map<String, Object>>> materialGroups = new HashMap<>(); | ||||
|                 for (Map<String, Object> singlePicm : batchPickms) { | ||||
|                     String cbmaterialvid = (String) singlePicm.get("cbmaterialvid"); | ||||
|                     if (cbmaterialvid == null) { | ||||
|                         return ResultMessageUtil.exceptionToJSON("传入数据异常,流程备料计划明细行中参数要包含cbmaterialvid", APIErrCodeEnum.BUSINESSEXCCODE.getCode()); | ||||
|                     } | ||||
|                     materialGroups.computeIfAbsent(cbmaterialvid, k -> new ArrayList<>()).add(singlePicm); | ||||
|                 } | ||||
| 
 | ||||
|                 // 查询该备料计划下的所有明细 | ||||
|                 String searchBodySql = "SELECT * FROM mm_pickm_b WHERE nvl(dr,0) = 0 AND cpickmid = '" + pickmHeadVO.getCpickmid() + "'"; | ||||
|                 List<PickmItemVO> existingPickmItemVOS = (List<PickmItemVO>) BASE_DAO.executeQuery(searchBodySql, new BeanListProcessor(PickmItemVO.class)); | ||||
|                 if (existingPickmItemVOS == null || existingPickmItemVOS.isEmpty()) { | ||||
|                     logger.info("根据备料计划主键查询的流程备料计划明细不存在"); | ||||
|                     return ResultMessageUtil.exceptionToJSON("根据备料计划主键查询的流程备料计划明细不存在", APIErrCodeEnum.BUSINESSEXCCODE.getCode()); | ||||
|                 } | ||||
| 
 | ||||
|                 List<PickmItemVO> finalPickmItemVOS = new ArrayList<>(); | ||||
| 
 | ||||
|                 // 处理每个物料组 | ||||
|                 for (Map.Entry<String, List<Map<String, Object>>> entry : materialGroups.entrySet()) { | ||||
|                     String materialCode = entry.getKey(); | ||||
|                     List<Map<String, Object>> materialItems = entry.getValue(); | ||||
| 
 | ||||
|                     // 将物料编码转换为主键 | ||||
|                     String materialPk = transferPkByCode(MaterialVO.getDefaultTableName(), MaterialVO.PK_MATERIAL, MaterialVO.CODE, materialCode); | ||||
| 
 | ||||
|                     // 查询该物料对应的所有备料计划明细 | ||||
|                     List<PickmItemVO> materialPickmItems = new ArrayList<>(); | ||||
|                     for (PickmItemVO item : existingPickmItemVOS) { | ||||
|                         if (materialPk.equals(item.getCbmaterialvid())) { | ||||
|                             materialPickmItems.add(item); | ||||
|                         } | ||||
|                     } | ||||
| 
 | ||||
|                     if (materialPickmItems.isEmpty()) { | ||||
|                         logger.info("未找到物料编码 " + materialCode + " 对应的备料计划明细"); | ||||
|                         return ResultMessageUtil.exceptionToJSON("未找到物料编码 " + materialCode + " 对应的备料计划明细", APIErrCodeEnum.BUSINESSEXCCODE.getCode()); | ||||
|                     } | ||||
| 
 | ||||
|                     // 判断是否有重复物料(同一物料编码但isvirtual不同) | ||||
|                     if (materialItems.size() == 1) { | ||||
|                         // 无重复,直接更新 | ||||
|                         Map<String, Object> singlePicm = materialItems.get(0); | ||||
|                         Map<String, Object> newSinglePicm = transferSingleDataCodeToPk(singlePicm); | ||||
|                         PickmItemVO pickmItemVO = transferToPickmItemVO(newSinglePicm, VOStatus.UPDATED); | ||||
| 
 | ||||
|                         // 直接取第一个匹配的明细进行更新 | ||||
|                         PickmItemVO existingPickmItemVO = materialPickmItems.get(0); | ||||
|                         for (String attributeName : pickmItemVO.getAttributeNames()) { | ||||
|                             if (pickmItemVO.getAttributeValue(attributeName) != null) { | ||||
|                                 existingPickmItemVO.setAttributeValue(attributeName, pickmItemVO.getAttributeValue(attributeName)); | ||||
|                             } | ||||
|                         } | ||||
|                         finalPickmItemVOS.add(existingPickmItemVO); | ||||
| 
 | ||||
|                     } else if (materialItems.size() == 2) { | ||||
|                         // 有重复,需要通过BOM逻辑进行匹配 | ||||
|                         // 先查询BOM信息 | ||||
|                         String bomSql = "cbmaterialvid = '" + pmoItemVO.getCmaterialvid() + "' and vbbomversionnumber = '" + pmoItemVO.getVbomversion() + "'"; | ||||
|                         BomVO bomHeadVO = (BomVO) BASE_DAO.retrieveByClause(BomVO.class, bomSql); | ||||
|                         if (bomHeadVO == null) { | ||||
|                             logger.info("未找到对应的BOM信息"); | ||||
|                             return ResultMessageUtil.exceptionToJSON("未找到对应的BOM信息", APIErrCodeEnum.BUSINESSEXCCODE.getCode()); | ||||
|                         } | ||||
| 
 | ||||
|                         String bombSql = BomVO.CBOMID + " = '" + bomHeadVO.getCbomid() + "'"; | ||||
|                         List<BomItemVO> bomItemVOS = (List<BomItemVO>) BASE_DAO.retrieveByClause(BomItemVO.class, bombSql); | ||||
| 
 | ||||
|                         // 分离实项和虚项 | ||||
|                         Map<String, Object> realItem = null; | ||||
|                         Map<String, Object> virtualItem = null; | ||||
| 
 | ||||
|                         for (Map<String, Object> item : materialItems) { | ||||
|                             String isVirtual = (String) item.get("isvirtual"); | ||||
|                             if (isVirtual == null || (!isVirtual.equals("Y") && !isVirtual.equals("N"))) { | ||||
|                                 return ResultMessageUtil.exceptionToJSON("isvirtual参数错误,必须为Y或者N", APIErrCodeEnum.BUSINESSEXCCODE.getCode()); | ||||
|                             } | ||||
| 
 | ||||
|                             if ("N".equals(isVirtual)) { | ||||
|                                 realItem = item; | ||||
|                             } else { | ||||
|                                 virtualItem = item; | ||||
|                             } | ||||
|                         } | ||||
| 
 | ||||
|                         if (realItem == null || virtualItem == null) { | ||||
|                             return ResultMessageUtil.exceptionToJSON("重复物料组中必须包含一个实项(isvirtual=N)和一个虚项(isvirtual=Y)", APIErrCodeEnum.BUSINESSEXCCODE.getCode()); | ||||
|                         } | ||||
| 
 | ||||
|                         // 处理实项 - 通过BOM查找对应的备料计划明细 | ||||
|                         Map<String, Object> newRealItem = transferSingleDataCodeToPk(realItem); | ||||
|                         PickmItemVO realPickmItemVO = transferToPickmItemVO(newRealItem, VOStatus.UPDATED); | ||||
| 
 | ||||
|                         PickmItemVO realExistingItem = null; | ||||
| 
 | ||||
|                         // 先检查BOM表头 | ||||
|                         String hcmaterialvid = bomHeadVO.getHcmaterialvid(); | ||||
|                         UFBoolean hisvirtual = bomHeadVO.getHisvirtual(); | ||||
|                         if (hcmaterialvid != null && hisvirtual != null && | ||||
|                                 hcmaterialvid.equals(realPickmItemVO.getCbmaterialvid()) && !hisvirtual.booleanValue()) { | ||||
|                             for (PickmItemVO item : materialPickmItems) { | ||||
|                                 if (bomHeadVO.getCbomid().equals(item.getCbombid())) { | ||||
|                                     realExistingItem = item; | ||||
|                                     break; | ||||
|                                 } | ||||
|                             } | ||||
|                         } | ||||
| 
 | ||||
|                         // 如果表头没找到,查找BOM明细 | ||||
|                         if (realExistingItem == null) { | ||||
|                             for (BomItemVO bomItemVO : bomItemVOS) { | ||||
|                                 if (bomItemVO != null) { | ||||
|                                     String cmaterialvid = bomItemVO.getCmaterialvid(); | ||||
|                                     UFBoolean bisvirtual = bomItemVO.getBisvirtual(); | ||||
|                                     if (cmaterialvid != null && bisvirtual != null && | ||||
|                                             cmaterialvid.equals(realPickmItemVO.getCbmaterialvid()) && !bisvirtual.booleanValue()) { | ||||
|                                         for (PickmItemVO item : materialPickmItems) { | ||||
|                                             if (bomItemVO.getCbom_bid().equals(item.getCbombid())) { | ||||
|                                                 realExistingItem = item; | ||||
|                                                 break; | ||||
|                                             } | ||||
|                                         } | ||||
|                                         if (realExistingItem != null) break; | ||||
|                                     } | ||||
|                                 } | ||||
|                             } | ||||
|                         } | ||||
| 
 | ||||
|                         if (realExistingItem == null) { | ||||
|                             logger.error("未找到实项对应的备料计划明细"); | ||||
|                             return ResultMessageUtil.exceptionToJSON("未找到实项对应的备料计划明细", APIErrCodeEnum.BUSINESSEXCCODE.getCode()); | ||||
|                         } | ||||
| 
 | ||||
|                         // 更新实项 | ||||
|                         for (String attributeName : realPickmItemVO.getAttributeNames()) { | ||||
|                             if (realPickmItemVO.getAttributeValue(attributeName) != null) { | ||||
|                                 realExistingItem.setAttributeValue(attributeName, realPickmItemVO.getAttributeValue(attributeName)); | ||||
|                             } | ||||
|                         } | ||||
|                         finalPickmItemVOS.add(realExistingItem); | ||||
| 
 | ||||
|                         // 处理虚项 - 排除法找到另一个明细 | ||||
|                         PickmItemVO virtualExistingItem = null; | ||||
|                         for (PickmItemVO item : materialPickmItems) { | ||||
|                             if (!item.equals(realExistingItem)) { | ||||
|                                 virtualExistingItem = item; | ||||
|                                 break; | ||||
|                             } | ||||
|                         } | ||||
| 
 | ||||
|                         if (virtualExistingItem == null) { | ||||
|                             logger.error("未找到虚项对应的备料计划明细"); | ||||
|                             return ResultMessageUtil.exceptionToJSON("未找到虚项对应的备料计划明细", APIErrCodeEnum.BUSINESSEXCCODE.getCode()); | ||||
|                         } | ||||
| 
 | ||||
|                         // 更新虚项 | ||||
|                         Map<String, Object> newVirtualItem = transferSingleDataCodeToPk(virtualItem); | ||||
|                         PickmItemVO virtualPickmItemVO = transferToPickmItemVO(newVirtualItem, VOStatus.UPDATED); | ||||
| 
 | ||||
|                         for (String attributeName : virtualPickmItemVO.getAttributeNames()) { | ||||
|                             if (virtualPickmItemVO.getAttributeValue(attributeName) != null) { | ||||
|                                 virtualExistingItem.setAttributeValue(attributeName, virtualPickmItemVO.getAttributeValue(attributeName)); | ||||
|                             } | ||||
|                         } | ||||
|                         finalPickmItemVOS.add(virtualExistingItem); | ||||
| 
 | ||||
|                     } else { | ||||
|                         return ResultMessageUtil.exceptionToJSON("同一物料编码最多只能有2个明细(一个实项一个虚项)", APIErrCodeEnum.BUSINESSEXCCODE.getCode()); | ||||
|                     } | ||||
|                 } | ||||
| 
 | ||||
|                 PickmItemVO[] array = finalPickmItemVOS.toArray(new PickmItemVO[0]); | ||||
|                 AggPickmVO aggPickmVO = new AggPickmVO(); | ||||
|                 aggPickmVO.setParent(pickmHeadVO); | ||||
|                 aggPickmVO.setChildren(PickmItemVO.class, array); | ||||
|                 aggPickmVO.getParentVO().setStatus(VOStatus.UPDATED); | ||||
|                 this.setDefaultValue(aggPickmVO); | ||||
|                 resAggVOS.add(aggPickmVO); | ||||
|             } | ||||
|             // 更新 | ||||
|             AggPickmVO[] updatedAggVOS = resAggVOS.toArray(new AggPickmVO[0]); | ||||
|             AggPickmVO[] updateBills = serv.update(updatedAggVOS); | ||||
|             logger.info("备料计划明细行修改成功"); | ||||
|             return ResultMessageUtil.toJSON(updateBills, "备料计划明细行修改成功"); | ||||
|         } catch (Exception e) { | ||||
|             logger.error("备料计划明细行修改异常", e); | ||||
|             return ResultMessageUtil.exceptionToJSON(e); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     @POST | ||||
|     @Path("delete") | ||||
|     @Consumes({"application/json"}) | ||||
|     @Produces({"application/json"}) | ||||
|     public JSONString delete(Map<String, Object> paramMap) { | ||||
|         logger.debug("开始进行备料计划明细行的删除操作"); | ||||
|         // 如果没有传递data属性 | ||||
|         if (!paramMap.containsKey("data")) { | ||||
|             return ResultMessageUtil.exceptionToJSON("传入数据异常,参数要包含data", APIErrCodeEnum.BUSINESSEXCCODE.getCode()); | ||||
|         } | ||||
| 
 | ||||
|         try { | ||||
|             List<Map<String, Object>> paramList = (List) paramMap.get("data"); | ||||
|             if (MMCollectionUtil.isEmpty(paramList)) { | ||||
|                 return ResultMessageUtil.exceptionToJSON("传入数据异常,参数要包含data", APIErrCodeEnum.BUSINESSEXCCODE.getCode()); | ||||
|             } | ||||
| 
 | ||||
|             IPickmMaintainService serv = (IPickmMaintainService) NCLocator.getInstance().lookup(IPickmMaintainService.class); | ||||
|             List<AggPickmVO> resultAggVOList = new ArrayList<>(); | ||||
| 
 | ||||
|             // 按pk_pmo分组处理 | ||||
|             Map<String, List<Map<String, Object>>> pmoGroups = new HashMap<>(); | ||||
|             for (Map<String, Object> map : paramList) { | ||||
|                 String pk_pmo = (String) map.get("pk_pmo"); | ||||
|                 if (pk_pmo == null) { | ||||
|                     return ResultMessageUtil.exceptionToJSON("传入数据异常,参数要包含pk_pmo", APIErrCodeEnum.BUSINESSEXCCODE.getCode()); | ||||
|                 } | ||||
|                 pmoGroups.computeIfAbsent(pk_pmo, k -> new ArrayList<>()).add(map); | ||||
|             } | ||||
| 
 | ||||
|             for (Map.Entry<String, List<Map<String, Object>>> pmoEntry : pmoGroups.entrySet()) { | ||||
|                 String pk_pmo = pmoEntry.getKey(); | ||||
|                 List<Map<String, Object>> pmoItems = pmoEntry.getValue(); | ||||
| 
 | ||||
|                 // 根据流程生产订单明细查询PMO信息 | ||||
|                 PMOItemVO pmoItemVO = (PMOItemVO) BASE_DAO.retrieveByPK(PMOItemVO.class, pk_pmo); | ||||
|                 if (pmoItemVO == null) { | ||||
|                     logger.info("根据pk_pmo查询的流程生产订单明细行不存在"); | ||||
|                     return ResultMessageUtil.exceptionToJSON("根据pk_pmo查询的流程生产订单明细行不存在", APIErrCodeEnum.BUSINESSEXCCODE.getCode()); | ||||
|                 } | ||||
| 
 | ||||
|                 // 根据流程生产订单明细主键查询备料计划 | ||||
|                 List<PickmHeadVO> pickmHeadVOS = (List<PickmHeadVO>) BASE_DAO.retrieveByClause(PickmHeadVO.class, PickmHeadVO.VSOURCEMOID + " = '" + pmoItemVO.getCmoid() + "'"); | ||||
|                 if (pickmHeadVOS == null || pickmHeadVOS.isEmpty()) { | ||||
|                     logger.info("根据流程生产订单明细主键查询备料计划失败"); | ||||
|                     return ResultMessageUtil.exceptionToJSON("根据流程生产订单明细主键查询备料计划失败", APIErrCodeEnum.BUSINESSEXCCODE.getCode()); | ||||
|                 } | ||||
|                 PickmHeadVO pickmHeadVO = pickmHeadVOS.get(0); | ||||
| 
 | ||||
|                 // 获取当前head对应所有子项 | ||||
|                 String searchBodySql = "SELECT * FROM mm_pickm_b WHERE nvl(dr,0) = 0 AND CPICKMID = '" + pickmHeadVO.getCpickmid() + "'"; | ||||
|                 List<PickmItemVO> existingPickmItemVOS = (List<PickmItemVO>) BASE_DAO.executeQuery(searchBodySql, new BeanListProcessor(PickmItemVO.class)); | ||||
|                 if (existingPickmItemVOS == null || existingPickmItemVOS.isEmpty()) { | ||||
|                     return ResultMessageUtil.exceptionToJSON("未找到对应的备料计划明细,pk_pmo: " + pk_pmo, APIErrCodeEnum.BUSINESSEXCCODE.getCode()); | ||||
|                 } | ||||
| 
 | ||||
|                 // 收集所有materials并按物料编码分组 | ||||
|                 Map<String, List<Map<String, Object>>> materialGroups = new HashMap<>(); | ||||
|                 for (Map<String, Object> pmoItem : pmoItems) { | ||||
|                     List<Map<String, Object>> materials = (List<Map<String, Object>>) pmoItem.get("materials"); | ||||
|                     if (MMCollectionUtil.isEmpty(materials)) { | ||||
|                         return ResultMessageUtil.exceptionToJSON("传入数据异常,参数要包含materials", APIErrCodeEnum.BUSINESSEXCCODE.getCode()); | ||||
|                     } | ||||
| 
 | ||||
|                     for (Map<String, Object> material : materials) { | ||||
|                         String cbmaterialvid = (String) material.get("cbmaterialvid"); | ||||
|                         String isvirtual = (String) material.get("isvirtual"); | ||||
|                         if (cbmaterialvid == null || isvirtual == null) { | ||||
|                             return ResultMessageUtil.exceptionToJSON("传入数据异常,material要包含cbmaterialvid和isvirtual", APIErrCodeEnum.BUSINESSEXCCODE.getCode()); | ||||
|                         } | ||||
|                         materialGroups.computeIfAbsent(cbmaterialvid, k -> new ArrayList<>()).add(material); | ||||
|                     } | ||||
|                 } | ||||
| 
 | ||||
|                 // 处理每个物料组 | ||||
|                 for (Map.Entry<String, List<Map<String, Object>>> materialEntry : materialGroups.entrySet()) { | ||||
|                     String materialCode = materialEntry.getKey(); | ||||
|                     List<Map<String, Object>> materialItems = materialEntry.getValue(); | ||||
| 
 | ||||
|                     // 将物料编码转换为主键 | ||||
|                     String materialPk = transferPkByCode(MaterialVO.getDefaultTableName(), MaterialVO.PK_MATERIAL, MaterialVO.CODE, materialCode); | ||||
| 
 | ||||
|                     // 查询该物料对应的所有备料计划明细 | ||||
|                     List<PickmItemVO> materialPickmItems = new ArrayList<>(); | ||||
|                     for (PickmItemVO item : existingPickmItemVOS) { | ||||
|                         if (materialPk.equals(item.getCbmaterialvid())) { | ||||
|                             materialPickmItems.add(item); | ||||
|                         } | ||||
|                     } | ||||
| 
 | ||||
|                     if (materialPickmItems.isEmpty()) { | ||||
|                         logger.info("未找到物料编码 " + materialCode + " 对应的备料计划明细"); | ||||
|                         return ResultMessageUtil.exceptionToJSON("未找到物料编码 " + materialCode + " 对应的备料计划明细", APIErrCodeEnum.BUSINESSEXCCODE.getCode()); | ||||
|                     } | ||||
| 
 | ||||
|                     // 判断删除逻辑 | ||||
|                     if (materialItems.size() == 1) { | ||||
|                         // 删除单个物料明细 | ||||
|                         Map<String, Object> material = materialItems.get(0); | ||||
|                         String isvirtual = (String) material.get("isvirtual"); | ||||
| 
 | ||||
|                         if (materialPickmItems.size() == 1) { | ||||
|                             // 只有一个明细,直接删除 | ||||
|                             materialPickmItems.get(0).setStatus(VOStatus.DELETED); | ||||
|                         } else if (materialPickmItems.size() == 2) { | ||||
|                             // 有两个明细,根据isvirtual判断删除哪个 | ||||
|                             if ("N".equals(isvirtual)) { | ||||
|                                 // 删除实项,通过BOM逻辑查找 | ||||
|                                 PickmItemVO realItem = findRealItemByBOM(materialPickmItems, pmoItemVO, materialPk); | ||||
|                                 if (realItem != null) { | ||||
|                                     realItem.setStatus(VOStatus.DELETED); | ||||
|                                 } else { | ||||
|                                     return ResultMessageUtil.exceptionToJSON("未找到对应的实项备料计划明细", APIErrCodeEnum.BUSINESSEXCCODE.getCode()); | ||||
|                                 } | ||||
|                             } else if ("Y".equals(isvirtual)) { | ||||
|                                 // 删除虚项,通过排除法查找 | ||||
|                                 PickmItemVO realItem = findRealItemByBOM(materialPickmItems, pmoItemVO, materialPk); | ||||
|                                 PickmItemVO virtualItem = null; | ||||
|                                 for (PickmItemVO item : materialPickmItems) { | ||||
|                                     if (!item.equals(realItem)) { | ||||
|                                         virtualItem = item; | ||||
|                                         break; | ||||
|                                     } | ||||
|                                 } | ||||
|                                 if (virtualItem != null) { | ||||
|                                     virtualItem.setStatus(VOStatus.DELETED); | ||||
|                                 } else { | ||||
|                                     return ResultMessageUtil.exceptionToJSON("未找到对应的虚项备料计划明细", APIErrCodeEnum.BUSINESSEXCCODE.getCode()); | ||||
|                                 } | ||||
|                             } | ||||
|                         } | ||||
|                     } else if (materialItems.size() == 2) { | ||||
|                         // 删除两个明细,验证必须包含一个实项和一个虚项 | ||||
|                         boolean hasReal = false; | ||||
|                         boolean hasVirtual = false; | ||||
|                         for (Map<String, Object> material : materialItems) { | ||||
|                             String isvirtual = (String) material.get("isvirtual"); | ||||
|                             if ("N".equals(isvirtual)) { | ||||
|                                 hasReal = true; | ||||
|                             } else if ("Y".equals(isvirtual)) { | ||||
|                                 hasVirtual = true; | ||||
|                             } | ||||
|                         } | ||||
| 
 | ||||
|                         if (!hasReal || !hasVirtual) { | ||||
|                             return ResultMessageUtil.exceptionToJSON("删除重复物料组必须包含一个实项(isvirtual=N)和一个虚项(isvirtual=Y)", APIErrCodeEnum.BUSINESSEXCCODE.getCode()); | ||||
|                         } | ||||
| 
 | ||||
|                         // 删除该物料的所有明细 | ||||
|                         for (PickmItemVO item : materialPickmItems) { | ||||
|                             item.setStatus(VOStatus.DELETED); | ||||
|                         } | ||||
|                     } else { | ||||
|                         return ResultMessageUtil.exceptionToJSON("同一物料编码的删除项数量不能超过2个", APIErrCodeEnum.BUSINESSEXCCODE.getCode()); | ||||
|                     } | ||||
|                 } | ||||
| 
 | ||||
|                 // 设置未删除的明细状态为更新 | ||||
|                 for (PickmItemVO item : existingPickmItemVOS) { | ||||
|                     if (item.getStatus() != VOStatus.DELETED) { | ||||
|                         item.setStatus(VOStatus.UPDATED); | ||||
|                     } | ||||
|                 } | ||||
| 
 | ||||
|                 PickmItemVO[] array = existingPickmItemVOS.toArray(new PickmItemVO[0]); | ||||
|                 AggPickmVO aggPickmVO = new AggPickmVO(); | ||||
|                 aggPickmVO.setParent(pickmHeadVO); | ||||
|                 aggPickmVO.getParentVO().setStatus(VOStatus.UPDATED); | ||||
|                 aggPickmVO.setChildren(PickmItemVO.class, array); | ||||
|                 this.setDefaultValue(aggPickmVO); | ||||
|                 resultAggVOList.add(aggPickmVO); | ||||
|             } | ||||
| 
 | ||||
|             if (!resultAggVOList.isEmpty()) { | ||||
|                 serv.update(resultAggVOList.toArray(new AggPickmVO[0])); | ||||
|             } | ||||
|             logger.info("备料计划明细行删除成功"); | ||||
|             return ResultMessageUtil.toJSON(new String[0], "备料计划明细行删除成功"); | ||||
|         } catch (Exception e) { | ||||
|             logger.error("备料计划明细行删除异常", e); | ||||
|             return ResultMessageUtil.exceptionToJSON(e); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 通过BOM逻辑查找实项(isvirtual=N对应的明细) | ||||
|      */ | ||||
|     private PickmItemVO findRealItemByBOM(List<PickmItemVO> materialPickmItems, PMOItemVO pmoItemVO, String materialPk) throws BusinessException { | ||||
|         try { | ||||
|             // 查询BOM信息 | ||||
|             String bomSql = "cbmaterialvid = '" + pmoItemVO.getCmaterialvid() + "' and vbbomversionnumber = '" + pmoItemVO.getVbomversion() + "'"; | ||||
|             BomVO bomHeadVO = (BomVO) BASE_DAO.retrieveByClause(BomVO.class, bomSql); | ||||
|             if (bomHeadVO == null) { | ||||
|                 return null; | ||||
|             } | ||||
| 
 | ||||
|             String bombSql = BomVO.CBOMID + " = '" + bomHeadVO.getCbomid() + "'"; | ||||
|             List<BomItemVO> bomItemVOS = (List<BomItemVO>) BASE_DAO.retrieveByClause(BomItemVO.class, bombSql); | ||||
| 
 | ||||
|             // 先检查BOM表头 | ||||
|             String hcmaterialvid = bomHeadVO.getHcmaterialvid(); | ||||
|             UFBoolean hisvirtual = bomHeadVO.getHisvirtual(); | ||||
|             if (hcmaterialvid != null && hisvirtual != null && | ||||
|                     hcmaterialvid.equals(materialPk) && !hisvirtual.booleanValue()) { | ||||
|                 for (PickmItemVO item : materialPickmItems) { | ||||
|                     if (bomHeadVO.getCbomid().equals(item.getCbombid())) { | ||||
|                         return item; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             // 如果表头没找到,查找BOM明细 | ||||
|             for (BomItemVO bomItemVO : bomItemVOS) { | ||||
|                 if (bomItemVO != null) { | ||||
|                     String cmaterialvid = bomItemVO.getCmaterialvid(); | ||||
|                     UFBoolean bisvirtual = bomItemVO.getBisvirtual(); | ||||
|                     if (cmaterialvid != null && bisvirtual != null && | ||||
|                             cmaterialvid.equals(materialPk) && !bisvirtual.booleanValue()) { | ||||
|                         for (PickmItemVO item : materialPickmItems) { | ||||
|                             if (bomItemVO.getCbom_bid().equals(item.getCbombid())) { | ||||
|                                 return item; | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             return null; | ||||
|         } catch (Exception e) { | ||||
|             logger.error("查找实项明细异常", e); | ||||
|             return null; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 将请求参数转换为PickmHeadVO | ||||
|      */ | ||||
|     public static PickmHeadVO transferToPickmHeadVO(Map<String, Object> row, Integer type) throws BusinessException { | ||||
|         if (row == null) { | ||||
|             throw new BusinessException("根据pk_pmo未查询出相关流程备料计划"); | ||||
|         } | ||||
|         PickmHeadVO pickmHeadVO = new PickmHeadVO(); | ||||
|         pickmHeadVO.setPk_group(AppContext.getInstance().getPkGroup()); | ||||
|         pickmHeadVO.setStatus(type); | ||||
|         for (String key : row.keySet()) { | ||||
|             pickmHeadVO.setAttributeValue(key, row.get(key)); | ||||
|         } | ||||
|         return pickmHeadVO; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 将请求参数mm_pickm_b数组中的每一个个体转换为PickmItemVO个体 | ||||
|      */ | ||||
|     public static PickmItemVO transferToPickmItemVO(Map<String, Object> pickmBody, Integer type) throws BusinessException { | ||||
|         PickmItemVO body = new PickmItemVO(); | ||||
|         for (String key : pickmBody.keySet()) { | ||||
|             body.setAttributeValue(key, pickmBody.get(key)); | ||||
|         } | ||||
|         body.setStatus(type); | ||||
|         return body; | ||||
|     } | ||||
| 
 | ||||
|     private void setDefaultValue(AggPickmVO vo) { | ||||
|         String pk = vo.getParentVO().getCpickmid(); | ||||
| 
 | ||||
|         for (PickmItemVO item : (PickmItemVO[]) vo.getChildrenVO()) { | ||||
|             if (2 == item.getStatus()) { | ||||
|                 item.setCpickmid(pk); | ||||
|                 item.setCpickm_bid((String) null); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 根据编码查询主键 | ||||
|      */ | ||||
|     private String transferPkByCode(String tableName, String selectField, String codeField, String code) throws BusinessException { | ||||
|         if (code == null || code.trim().isEmpty()) { | ||||
|             return null; | ||||
|         } | ||||
|         SqlBuilder sqlBuilder = new SqlBuilder(); | ||||
|         sqlBuilder.append(" select " + selectField); | ||||
|         sqlBuilder.append(" from " + tableName); | ||||
|         sqlBuilder.append(" where "); | ||||
|         sqlBuilder.append(codeField, code); | ||||
|         Object o = BASE_DAO.executeQuery(sqlBuilder.toString(), new ColumnProcessor()); | ||||
|         if (o == null) { | ||||
|             throw new BusinessException("未查询到主键信息,sql【" + sqlBuilder + "】"); | ||||
|         } | ||||
|         return o.toString(); | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     // transferSingleDataCodeToPk | ||||
|     private Map<String, Object> transferSingleDataCodeToPk(Map<String, Object> singleData) throws BusinessException { | ||||
|         // 1. 创建新 Map,复制原始数据(浅拷贝) | ||||
|         Map<String, Object> newData = new HashMap<>(singleData); | ||||
|         // 2. 只修改需要的字段(其他字段保持不变) | ||||
|         String org_code = transferPkByCode(OrgVO.getDefaultTableName(), OrgVO.PK_ORG, OrgVO.CODE, (String) singleData.get("pk_org")); | ||||
|         newData.put("pk_org", org_code); // 修改新 Map,不影响原 Map | ||||
|         String group_code = transferPkByCode(GroupVO.getDefaultTableName(), GroupVO.PK_GROUP, GroupVO.CODE, (String) singleData.get("pk_group")); | ||||
|         newData.put("pk_group", group_code); | ||||
|         String csupplyorgvidcode = transferPkByCode(StockOrgVersionVO.getDefaultTableName(), StockOrgVersionVO.PK_VID, StockOrgVersionVO.CODE, (String) singleData.get("csupplyorgvid")); | ||||
|         newData.put("csupplyorgvid", csupplyorgvidcode); | ||||
|         String cbmaterialvidcode = transferPkByCode(MaterialVO.getDefaultTableName(), MaterialVO.PK_MATERIAL, MaterialVO.CODE, (String) singleData.get("cbmaterialvid")); | ||||
|         newData.put("cbmaterialvid", cbmaterialvidcode); | ||||
|         String cdeliverorgvidcode = transferPkByCode(StockOrgVersionVO.getDefaultTableName(), StockOrgVersionVO.PK_VID, StockOrgVersionVO.CODE, (String) singleData.get("cdeliverorgvid")); | ||||
|         newData.put("cdeliverorgvid", cdeliverorgvidcode); | ||||
|         String cdeliverorgidcode = transferPkByCode(StockOrgVO.getDefaultTableName(), StockOrgVO.PK_STOCKORG, StockOrgVO.CODE, (String) singleData.get("cdeliverorgid")); | ||||
|         newData.put("cdeliverorgid", cdeliverorgidcode); | ||||
|         String cbunitidcode = transferPkByCode(MeasdocVO.getDefaultTableName(), MeasdocVO.PK_MEASDOC, MeasdocVO.CODE, (String) singleData.get("cbunitid")); | ||||
|         newData.put("cbunitid", cbunitidcode); | ||||
|         return newData; | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     public String getModule() { | ||||
|         return "mmpac"; | ||||
|     } | ||||
| } | ||||
		Loading…
	
		Reference in New Issue