diff --git a/ic/src/private/nccloud/api/impl/ic/m4d/APIMaterialOutMaintainImpl.java b/ic/src/private/nccloud/api/impl/ic/m4d/APIMaterialOutMaintainImpl.java index 000d3f4..d489b34 100644 --- a/ic/src/private/nccloud/api/impl/ic/m4d/APIMaterialOutMaintainImpl.java +++ b/ic/src/private/nccloud/api/impl/ic/m4d/APIMaterialOutMaintainImpl.java @@ -1,20 +1,15 @@ package nccloud.api.impl.ic.m4d; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.apache.commons.lang3.ArrayUtils; -import org.apache.commons.lang3.StringUtils; +import nc.bs.dao.BaseDAO; import nc.bs.framework.common.NCLocator; import nc.bs.scmpub.query.SCMBillQuery; import nc.itf.scmpub.reference.uap.pf.PfServiceScmUtil; +import nc.jdbc.framework.processor.ColumnProcessor; +import nc.jdbc.framework.processor.MapListProcessor; import nc.pubimpl.ic.api.maintain.BillMaintainTool; import nc.pubitf.ic.m4d.api.IMaterialOutMaintainAPI; +import nc.vo.bd.material.MaterialVO; import nc.vo.ic.general.define.ICBillFlag; import nc.vo.ic.general.define.ICBillHeadVO; import nc.vo.ic.general.util.ICLocationUtil; @@ -25,6 +20,7 @@ import nc.vo.ic.m4d.entity.MaterialOutVO; import nc.vo.ic.pub.define.ICPubMetaNameConst; import nc.vo.pub.BusinessException; import nc.vo.pub.VOStatus; +import nc.vo.pubapp.pattern.pub.SqlBuilder; import nc.vo.scmpub.check.billvalidate.BillVOsCheckRule; import nc.vo.scmpub.res.billtype.ICBillType; import nccloud.api.ic.m4d.IAPIMaterialOutMaintain; @@ -35,6 +31,10 @@ import nccloud.api.impl.ic.pub.check.CheckProhibitUpdateFields; import nccloud.openapi.ic.util.ICAPILocationVOUtils; import nccloud.openapi.scmpub.pub.TransferCodeToPKTool; import nccloud.openapi.scmpub.pub.TransferMapToVOTool; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; + +import java.util.*; /** * @@ -47,6 +47,8 @@ import nccloud.openapi.scmpub.pub.TransferMapToVOTool; public class APIMaterialOutMaintainImpl implements IAPIMaterialOutMaintain{ + private static final BaseDAO DAO = new BaseDAO(); + @Override public MaterialOutVO[] save(List> paramList) throws BusinessException { // MapList转聚合VOList @@ -64,6 +66,12 @@ public class APIMaterialOutMaintainImpl implements IAPIMaterialOutMaintain{ aggVOList = TransferCodeToPKTool.transferAggVO(aggVOList); // 翻译货位 ICAPILocationVOUtils.translate(vos); + + boolean isSpecialCase = checkSpecialCondition(paramList); + // 如果判定成功,处理金思维的材料出库,将来源的相关数据补充上 + if (isSpecialCase) { + processPickingPlanSpecialLogic(vos); + } //其他数据填充 new MaterialOutSaveFillValue().setDefaultValue(vos); @@ -269,4 +277,135 @@ public class APIMaterialOutMaintainImpl implements IAPIMaterialOutMaintain{ return materialOut.insertBills(vos); } + /** + * 检查是否满足特殊条件:C034组织 + */ + private boolean checkSpecialCondition(List> materialOutVOS) throws BusinessException { + + List aggVOList = + TransferMapToVOTool.transferMapToAggVO(materialOutVOS, MaterialOutVO.class); + MaterialOutVO[] vos = + aggVOList.toArray(new MaterialOutVO[aggVOList.size()]); + + if(Objects.isNull(materialOutVOS)){ + return false; + } + for (MaterialOutVO materialOutVO : vos) { + MaterialOutHeadVO head = materialOutVO.getHead(); + // 提取组织 + String pkOrg = head.getPk_org(); + // 翻译成code +// String orgCode = transferCodeByPk(StockOrgVO.getDefaultTableName(), StockOrgVO.CODE, StockOrgVO.PK_ORG, pkOrg); + // 这是未翻译的,传进来的原始数据转换的,所以直接比较 + if("C034".equals(pkOrg)){ + return true; + } + } + return false; + } + + /** + * 处理备料计划特殊逻辑 + */ + private void processPickingPlanSpecialLogic(MaterialOutVO[] vos) throws BusinessException { + + for (MaterialOutVO vo : vos) { + MaterialOutBodyVO[] bodyVOs = vo.getBodys(); + if (bodyVOs != null) { + for (MaterialOutBodyVO bodyVO : bodyVOs) { + // 获取物料编码 + String materialCode = transferCodeByPk(MaterialVO.getDefaultTableName(), MaterialVO.CODE, MaterialVO.PK_MATERIAL, bodyVO.getCmaterialvid()); + if (StringUtils.isEmpty(materialCode)|| StringUtils.isEmpty(bodyVO.getCsourcebillbid())) { + continue; + } + // 基于mmpickmview视图查询备料计划相关数据 + String sql = buildPickingPlanQuery(materialCode,bodyVO.getCsourcebillbid()); + + try { + List> pickingPlanData = (List>) DAO.executeQuery(sql, new MapListProcessor()); + + // 不唯一或者找不到,这样是有问题,抛出 + if(pickingPlanData==null || pickingPlanData.isEmpty()){ + throw new BusinessException("根据生产订单明细主键和物料编码去查询bip的中间视图mmpickmview找不到数据,无法进行材料出库的上游主键赋值,请检查数据,报错SQL:"+sql); + } + + if(pickingPlanData.size()!=1){ + throw new BusinessException("根据生产订单明细主键和物料编码去查询bip的中间视图mmpickmview不唯一,无法进行材料出库的上游主键赋值,请检查数据,报错SQL:"+sql); + } + + if (pickingPlanData != null && !pickingPlanData.isEmpty()) { + // 处理查询到的备料计划数据 + processPickingPlanData(bodyVO, pickingPlanData); + } + + } catch (Exception e) { + throw new BusinessException("查询备料计划数据失败: " + e.getMessage(), e); + } + } + } + } + } + + /** + * 构建备料计划查询SQL(基于mmpickmview视图) + */ + private String buildPickingPlanQuery(String materialCode,String cpmohid) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT "); + sql.append(" CODE,"); // 物料编码 + sql.append(" PK_BILLTYPECODE,"); // 备料计划交易类型编码 + sql.append(" CPICKMID,"); // 备料计划主键 + sql.append(" CMOID,"); // 流程生产订单行主 + sql.append(" CPMOHID,"); // 流程生产订单主键 + sql.append(" VROWNO,"); // 备料计划明细行号 + sql.append(" CPICKM_BID "); // 备料计划明细主键 + sql.append("FROM MMPICKMVIEW "); + sql.append("WHERE CODE = '").append(materialCode).append("' AND ") + .append("cmoid ='").append(cpmohid).append("'"); + return sql.toString(); + } + + /** + * 处理备料计划数据 + */ + private void processPickingPlanData(MaterialOutBodyVO bodyVO, List> pickingPlanData) { + if (pickingPlanData == null || pickingPlanData.isEmpty()) { + return; + } + + Map firstRow = pickingPlanData.get(0); + + // 设置备料计划相关字段 + if (firstRow.get("cpickmid") != null) { + bodyVO.setCsourcebillhid(firstRow.get("cpickmid").toString()); // 来源单据ID + } + + if (firstRow.get("cpickm_bid") != null) { + bodyVO.setCsourcebillbid(firstRow.get("cpickm_bid").toString()); // 来源单据行ID + } + + if (firstRow.get("pk_billtypecode") != null) { + bodyVO.setCsourcetranstype(firstRow.get("pk_billtypecode").toString()); // 交易类型编码 + } + bodyVO.setCsourcetype("55A3"); + } + + /** + * 根据主键查询编码 + */ + private String transferCodeByPk(String tableName, String selectField, String pkField, String pk) throws BusinessException { + if (nc.vo.cmp.util.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(); + } }