同步李正代码

This commit is contained in:
lihao 2025-12-02 13:58:08 +08:00
parent 06ba782f15
commit 7bb1fa3ace
1 changed files with 481 additions and 139 deletions

View File

@ -1,35 +1,27 @@
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package nc.bs.mmpac.pmo.pac0002.bp.util;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import nc.bs.dao.BaseDAO;
import nc.bs.dao.DAOException;
import nc.bs.framework.common.InvocationInfoProxy;
import nc.bs.framework.common.NCLocator;
import nc.bs.logging.Log;
import nc.bs.logging.Logger;
import nc.bs.mmpac.pmo.pac0002.bp.query.PMOHeadVOQueryBP;
import nc.bs.mmpac.pmo.pac0002.bp.query.PMOItemVOQueryBP;
import nc.bs.mmpac.pmo.pac0002.bp.service.PMOBPService;
import nc.bs.pubapp.AppBsContext;
import nc.bs.trade.business.HYPubBO;
import nc.impl.pubapp.bd.userdef.UserDefSaveRule;
import nc.itf.arap.goldentax.SysParaInitQuery;
import nc.itf.bd.material.baseinfo.IMaterialBaseInfoQueryService;
import nc.itf.uap.rbac.IUserManageQuery_C;
import nc.jdbc.framework.generator.SequenceGenerator;
import nc.jdbc.framework.processor.ColumnListProcessor;
import nc.jdbc.framework.processor.ColumnProcessor;
import nc.mmbd.utils.factoryparam.OTDimensionSetUtil;
import nc.pub.billcode.itf.IBillcodeManage;
import nc.pubitf.initgroup.InitGroupQuery;
import nc.pubitf.para.SysInitQuery;
import nc.pubitf.sn.doc.param.ISnPkandCodeParam;
import nc.pubitf.sn.doc.param.SnDocParam;
import nc.pubitf.sn.doc.param.SnResult;
@ -37,34 +29,24 @@ import nc.pubitf.uapbd.IMaterialPubService_C;
import nc.util.mmf.busi.measure.MeasureHelper;
import nc.util.mmf.busi.service.MaterialPubService;
import nc.util.mmf.busi.service.OrgUnitPubService;
import nc.util.mmf.framework.base.MMArrayUtil;
import nc.util.mmf.framework.base.MMCollectionUtil;
import nc.util.mmf.framework.base.MMMapUtil;
import nc.util.mmf.framework.base.MMNumberUtil;
import nc.util.mmf.framework.base.MMValueCheck;
import nc.util.mmf.framework.base.*;
import nc.util.mmf.framework.db.MMSqlBuilder;
import nc.vo.bd.bom.bom0202.entity.BomVO;
import nc.vo.bd.material.MaterialVO;
import nc.vo.bd.material.prod.MaterialProdVO;
import nc.vo.bd.material.stock.MaterialStockVO;
import nc.vo.bd.vermatch.enumeration.MfgTypeEnum;
import nc.vo.bd.vermatch.param.ppac.PpacMaterialParamVO;
import nc.vo.cmp.util.StringUtils;
import nc.vo.mmbd.pub.TraceDimensionParaVO;
import nc.vo.mmpac.pickm.param.MOSubItemParam;
import nc.vo.mmpac.pickm.param.MoChangeParam;
import nc.vo.mmpac.pmo.pac0002.entity.PMOAggVO;
import nc.vo.mmpac.pmo.pac0002.entity.PMOHeadVO;
import nc.vo.mmpac.pmo.pac0002.entity.PMOItemMeasureParam;
import nc.vo.mmpac.pmo.pac0002.entity.PMOItemVO;
import nc.vo.mmpac.pmo.pac0002.entity.PMOMaterialRelationVO;
import nc.vo.mmpac.pmo.pac0002.entity.PMOMaterialViewVO;
import nc.vo.mmpac.pmo.pac0002.entity.PMOPlanOutputVO;
import nc.vo.mmpac.pmo.pac0002.entity.PMOProcedureVO;
import nc.vo.mmpac.pmo.pac0002.entity.PMOSerialNoVO;
import nc.vo.mmpac.pmo.pac0002.entity.PMOTaskDetailVO;
import nc.vo.mmpac.pmo.pac0002.entity.*;
import nc.vo.mmpac.pmo.pac0002.enumeration.PMOFBillstatusEnum;
import nc.vo.mmpac.pmo.pac0002.util.PMOFillTransTypeUtil;
import nc.vo.mmpac.pmo.parameter.PMOMaterlKey;
import nc.vo.mmpac.pmo.parameter.PMORewriteParaVO;
import nc.vo.org.OrgVO;
import nc.vo.pub.BusinessException;
import nc.vo.pub.CircularlyAccessibleValueObject;
import nc.vo.pub.SuperVO;
@ -74,10 +56,18 @@ import nc.vo.pub.lang.UFDouble;
import nc.vo.pubapp.AppContext;
import nc.vo.pubapp.pattern.exception.ExceptionUtils;
import nc.vo.pubapp.pattern.pub.MapList;
import nc.vo.pubapp.pattern.pub.SqlBuilder;
import nc.vo.so.m30.entity.SaleOrderBVO;
import nc.vo.so.m30.entity.SaleOrderHVO;
import nccloud.pubift.commen.itf.utils.IHttpPostOtherSys;
import java.util.*;
public class PMOBPUtil {
public PMOBPUtil() {
}
private static final String LOG_INFO_NAME = "OALOG";
private static final Log log = Log.getInstance(LOG_INFO_NAME);
public static Map<String, UFBoolean> queryMaterProcManaged(PMOAggVO[] vos) {
Map<String, Set<String>> marvids = new HashMap();
@ -728,6 +718,9 @@ public class PMOBPUtil {
for (PMOAggVO aggvo : aggvos) {
String pk_org = aggvo.getParentVO().getPk_org();
//2025年10月17日17点44分--添加全局参数过滤组织
String orgCode = transferCodeByPk("org_factory","code","pk_factory",pk_org);
boolean isCludeOrg = checkIfIncludeOrg_dev(orgCode);
orgMapList.put(pk_org, aggvo);
PMOItemVO[] items = aggvo.getChildrenVO();
Map<String, UFDouble> waterRateMap = PMOBPCalUtil.getWasterrate(aggvo);
@ -740,7 +733,18 @@ public class PMOBPUtil {
item.setNmmnum(item.getNnum());
UFDouble wastrate = (UFDouble) waterRateMap.get(item.getCmaterialvid());
UFDouble nNum = item.getNmmnum().div((new UFDouble(1)).sub(wastrate));
if(isCludeOrg){
//2025年10月15日15点38分--带出编辑态的生产订单的计划投入数量向上取整--自定义项27赋值做初版值不可修改
//投入=产出=vdef27=数量
UFDouble upWardRoundNumber = MMNumberUtil.toUpWardRoundNumber(nNum);
item.setAttributeValue("vdef27",upWardRoundNumber);
item.setNplanputnum(upWardRoundNumber);
item.setNmmnum(upWardRoundNumber);
item.setNnum(upWardRoundNumber);
//2025年10月15日15点38分--带出编辑态的生产订单的计划投入数量向上取整--自定义项27赋值做初版值不可修改
}else{
item.setNplanputnum(nNum);
}
item.setNrwxis(wastrate);
itemList.add(item);
}
@ -806,7 +810,39 @@ public class PMOBPUtil {
Set<String> marSet = marMapList.keySet();
String[] marPlanFields = new String[]{"prevahead", "endahead", "fixedahead", "aheadbatch", "aheadcoff", "planprop"};
String[] marProdFields = new String[]{"pk_prodeptdoc", "pk_propsndoc"};
Map<String, PMOMaterialRelationVO> infoMap = PMOBPService.getIPMOQueryService().queryMaterialRelationArray(marMapList, marPlanFields, marProdFields, orgid, ((PMOAggVO)orgMapList.get(orgid).get(0)).getParentVO().getPk_group());
// 2025年7月17日 毛磊
// 检查是否使用自定义BOM选择逻辑
boolean useCustomBomLogic = false;
try {
IHttpPostOtherSys httpPostOtherSys = NCLocator.getInstance().lookup(IHttpPostOtherSys.class);
if (httpPostOtherSys != null) {
// 获取组织编码
String orgCode = transferCodeByPk(OrgVO.getDefaultTableName(), OrgVO.CODE, OrgVO.PK_ORG, orgid);
if (httpPostOtherSys.checkIfIncludeOrg(orgCode) &&
!httpPostOtherSys.checkIfExcludeUser()) {
useCustomBomLogic = true;
}
}
} catch (Exception e) {
Logger.error("检查自定义BOM逻辑条件时发生异常", e);
}
Map<String, PMOMaterialRelationVO> infoMap = null;
if (useCustomBomLogic) {
log.info("开始使用自定义BOM选择逻辑组织ID: " + orgid);
// 先获取标品逻辑的infoMap作为基础
infoMap = PMOBPService.getIPMOQueryService().queryMaterialRelationArray(marMapList, marPlanFields, marProdFields, orgid, ((PMOAggVO) orgMapList.get(orgid).get(0)).getParentVO().getPk_group());
log.info("标品逻辑获取到BOM信息数量: " + (infoMap != null ? infoMap.size() : 0));
// 然后尝试替换能找到销售订单匹配BOM的元素
replaceWithCustomBomInfo(marMapList, infoMap, orgid);
} else {
log.info("使用标品BOM选择逻辑组织ID: " + orgid);
// 使用标品逻辑
infoMap = PMOBPService.getIPMOQueryService().queryMaterialRelationArray(marMapList, marPlanFields, marProdFields, orgid, ((PMOAggVO) orgMapList.get(orgid).get(0)).getParentVO().getPk_group());
log.info("标品逻辑获取到BOM信息数量: " + (infoMap != null ? infoMap.size() : 0));
}
if (!MMMapUtil.isEmpty(infoMap)) {
for (String key : marSet) {
PMOItemVO[] hvos = (PMOItemVO[]) marMapList.get(key).toArray(new PMOItemVO[0]);
@ -861,8 +897,8 @@ public class PMOBPUtil {
// // if(itemVO.getVsrctype().equals("30")){
// // xbitemList.add(itemVO);
// // }
// if(checkMaterial(itemVO.getCmaterialvid(),itemVO.getPk_org()) && (null==itemVO.getVbatchcode() || itemVO.getVbatchcode().equals(""))){
// // xbitemList.add(itemVO);
// if(checkMaterial(itemVO.getCmaterialvid(),itemVO.getPk_org())){
// xbitemList.add(itemVO);
// }
// }
// }
@ -891,14 +927,12 @@ public class PMOBPUtil {
// }
}
return aggvos;
} catch (BusinessException e) {
ExceptionUtils.marsh(e);
return null;
}
}
private boolean checkMaterial(String cmaterialid,String org) throws BusinessException {
// 根据物料档案库存信息页签批次管理字段判断是否生成批次号只有勾选批次管理的物料才生成生产批次号
@ -909,7 +943,7 @@ public class PMOBPUtil {
try {
list = (List<MaterialStockVO>) new BaseDAO().retrieveByClause(MaterialStockVO.class, whereSql);
} catch (DAOException e) {
e.printStackTrace();
throw new BusinessException(e.getMessage());
}
if(!list.isEmpty()){
for (MaterialStockVO materialStockVO:list){
@ -923,7 +957,19 @@ public class PMOBPUtil {
return false;
}
public boolean checkIfIncludeOrg_dev(String code) throws BusinessException {
String targetCode = SysInitQuery.getParaString("GLOBLE00000000000000", "SM_MMFeipin");
if (StringUtils.isEmpty(targetCode)) {
throw new BusinessException("未配置组织参数,请前往 [业务参数设置-全局] 配置SM_MMFeipin 参数");
}
String[] orgItem = targetCode.split(";");
for (String orgCode : orgItem) {
if (!orgCode.isEmpty() && orgCode.equals(code)) {
return true;
}
}
return false;
}
public Map<String, MaterialStockVO> getInwarehouseid(String[] cmaterialvids, String pk_org) {
Map<String, MaterialStockVO> stockMap = new HashMap();
if (MMArrayUtil.isEmpty(cmaterialvids)) {
@ -980,4 +1026,300 @@ public class PMOBPUtil {
return stockMap;
}
}
/**
* 替换能找到销售订单匹配BOM的元素
*
* @param marMapList 物料映射列表
* @param infoMap 标品逻辑获取的BOM信息映射
* @param orgid 组织ID
*/
private void replaceWithCustomBomInfo(MapList<String, PMOItemVO> marMapList,
Map<String, PMOMaterialRelationVO> infoMap,
String orgid) throws BusinessException {
try {
log.info("开始提取销售订单信息进行BOM替换组织ID: " + orgid);
// 首先获取生产订单中的销售订单信息
Map<String, String> salesOrderInfoMap = extractSalesOrderInfo(marMapList);
log.info("提取到销售订单信息数量: " + salesOrderInfoMap.size());
if (!MMMapUtil.isEmpty(salesOrderInfoMap)) {
// 根据销售订单信息查询匹配的BOM版本
Map<String, BomVO> bomMap = queryBomBySalesOrder(salesOrderInfoMap, orgid);
log.info("根据销售订单信息查询到BOM数量: " + bomMap.size());
if (!MMMapUtil.isEmpty(bomMap)) {
int replacedCount = 0;
Set<String> marSet = marMapList.keySet();
for (String key : marSet) {
PMOItemVO[] hvos = marMapList.get(key).toArray(new PMOItemVO[0]);
if (!MMArrayUtil.isEmpty(hvos)) {
for (PMOItemVO hvo : hvos) {
String orderInfo = salesOrderInfoMap.get(hvo.getCmaterialid());
if (MMValueCheck.isNotEmpty(orderInfo)) {
BomVO bomVO = bomMap.get(orderInfo);
if (bomVO != null) {
// 找到匹配的BOM替换infoMap中对应的BOM信息
String mapKey = key + hvo.getCmoid();
PMOMaterialRelationVO relationVO = infoMap.get(mapKey);
if (relationVO != null) {
log.info("替换BOM信息物料ID: " + hvo.getCmaterialid() +
", 原BOM版本ID: " + relationVO.getCbomversionid() +
", 新BOM版本ID: " + bomVO.getCbomid() +
", 销售订单信息: " + orderInfo);
relationVO.setCbomversionid(bomVO.getCbomid());
relationVO.setVbomversion(bomVO.getHversion());
replacedCount++;
} else {
log.warn("未找到对应的PMOMaterialRelationVOmapKey: " + mapKey);
}
} else {
log.info("未找到匹配的BOM保持原有BOM信息物料ID: " + hvo.getCmaterialid() +
", 销售订单信息: " + orderInfo);
}
}
}
}
}
log.info("BOM信息替换完成总替换数量: " + replacedCount);
} else {
log.info("未查询到自定义BOM信息保持标品逻辑结果");
}
} else {
log.info("未提取到销售订单信息,保持标品逻辑结果");
}
} catch (Exception e) {
log.error("替换自定义BOM信息时发生异常", e);
throw new BusinessException(e);
}
}
/**
* 从生产订单项中提取销售订单信息
*
* @param marMapList 物料映射列表
* @return 物料ID->销售订单信息的映射
*/
private Map<String, String> extractSalesOrderInfo(MapList<String, PMOItemVO> marMapList) throws BusinessException {
Map<String, String> salesOrderInfoMap = new HashMap<>();
try {
Set<String> marSet = marMapList.keySet();
log.info("开始提取销售订单信息,物料种类数量: " + marSet.size());
int totalItems = 0;
int salesOrderItems = 0;
for (String key : marSet) {
PMOItemVO[] hvos = (PMOItemVO[]) marMapList.get(key).toArray(new PMOItemVO[0]);
if (!MMArrayUtil.isEmpty(hvos)) {
for (PMOItemVO hvo : hvos) {
totalItems++;
log.debug("检查生产订单项物料ID: " + hvo.getCmaterialid() +
", vsrctype: " + hvo.getVsrctype() +
", vsrcbid: " + hvo.getVsrcbid());
// 判断是否来自销售订单vsrctype等于"30"
if ("30".equals(hvo.getVsrctype()) && MMValueCheck.isNotEmpty(hvo.getVsrcbid())) {
salesOrderItems++;
log.info("发现来自销售订单的生产订单项物料ID: " + hvo.getCmaterialid() +
", vsrcbid: " + hvo.getVsrcbid());
// 通过销售订单明细行ID获取销售订单信息
String salesOrderInfo = getSalesOrderInfoByBid(hvo.getVsrcbid());
if (MMValueCheck.isNotEmpty(salesOrderInfo)) {
salesOrderInfoMap.put(hvo.getCmaterialid(), salesOrderInfo);
log.info("成功获取销售订单信息物料ID: " + hvo.getCmaterialid() +
", 销售订单信息: " + salesOrderInfo);
} else {
log.warn("未能获取销售订单信息物料ID: " + hvo.getCmaterialid() +
", vsrcbid: " + hvo.getVsrcbid());
}
}
}
}
}
log.info("销售订单信息提取完成,总生产订单项数: " + totalItems +
", 来自销售订单的项数: " + salesOrderItems +
", 成功提取销售订单信息的项数: " + salesOrderInfoMap.size());
} catch (Exception e) {
log.error("提取销售订单信息时发生异常", e);
throw new BusinessException(e);
}
return salesOrderInfoMap;
}
/**
* 根据销售订单明细行ID获取销售订单信息
*
* @param vsrcbid 销售订单明细行ID
* @return 销售订单号|销售订单行号
*/
private String getSalesOrderInfoByBid(String vsrcbid) throws BusinessException {
try {
log.debug("查询销售订单信息vsrcbid: " + vsrcbid);
BaseDAO dao = new BaseDAO();
// 直接通过主键查询销售订单明细
SaleOrderBVO saleOrderBVO = (SaleOrderBVO) dao.retrieveByPK(SaleOrderBVO.class, vsrcbid);
// 2025年7月25日刘成非定制不走替换逻辑
boolean isCustomer = "Y".equals(saleOrderBVO.getVbdef18());
if (!isCustomer) {
log.info("非定制不走替换逻辑表体id" + saleOrderBVO.getCmaterialid() + ", vbdef18:" + saleOrderBVO.getVbdef18());
return null;
}
if (saleOrderBVO != null) {
log.debug("成功查询到销售订单明细,销售订单主键: " + saleOrderBVO.getCsaleorderid());
// 查询主单
SaleOrderHVO saleOrderHVO = (SaleOrderHVO) dao.retrieveByPK(SaleOrderHVO.class, saleOrderBVO.getCsaleorderid());
if (saleOrderHVO != null) {
String orderCode = saleOrderHVO.getVbillcode(); // 销售订单号
String rowNo = saleOrderBVO.getCrowno(); // 销售订单行号
String vbdef16 = saleOrderBVO.getVbdef16();// BOM配置完成时间
String vdef12 = saleOrderHVO.getVdef12(); // 是否传MES
log.debug("对应销售订单的自定义项12“是否传MES”为" + vdef12);
if ("Y".equals(vdef12)) {
if (Objects.isNull(vbdef16)) {
throw new BusinessException("对应销售订单的BOM配置完成时间不能为空");
}
if (vbdef16.isEmpty()) {
throw new BusinessException("对应销售订单的BOM配置完成时间不能为空");
}
} else {
return null;
}
log.debug("销售订单信息查询结果,订单号: " + orderCode + ", 行号: " + rowNo);
if (MMValueCheck.isNotEmpty(orderCode) && MMValueCheck.isNotEmpty(rowNo)) {
String result = orderCode + "|" + rowNo;
log.info("成功获取销售订单信息vsrcbid: " + vsrcbid + ", 结果: " + result);
return result;
} else {
log.warn("销售订单号或行号为空vsrcbid: " + vsrcbid +
", orderCode: " + orderCode + ", rowNo: " + rowNo);
}
} else {
log.warn("未找到销售订单主表记录,销售订单主键: " + saleOrderBVO.getCsaleorderid());
}
} else {
log.warn("未找到销售订单明细记录vsrcbid: " + vsrcbid);
}
} catch (Exception e) {
log.error("根据销售订单明细行ID获取销售订单信息时发生异常vsrcbid: " + vsrcbid, e);
throw new BusinessException(e);
}
return null;
}
/**
* 根据销售订单信息查询匹配的BOM版本
*
* @param salesOrderInfoMap 销售订单信息映射
* @param orgid 组织ID
* @return 订单信息->BOM的映射
*/
private Map<String, BomVO> queryBomBySalesOrder(Map<String, String> salesOrderInfoMap, String orgid) throws BusinessException {
Map<String, BomVO> bomMap = new HashMap<>();
try {
log.info("开始根据销售订单信息查询BOM组织ID: " + orgid + ", 销售订单信息数量: " + salesOrderInfoMap.size());
BaseDAO dao = new BaseDAO();
int foundCount = 0;
for (Map.Entry<String, String> entry : salesOrderInfoMap.entrySet()) {
String materialid = entry.getKey();
String orderInfo = entry.getValue();
String[] orderParts = orderInfo.split("\\|");
if (orderParts.length == 2) {
String orderCode = orderParts[0];
String orderRowNo = orderParts[1];
log.debug("查询BOM销售订单号: " + orderCode + ", 行号: " + orderRowNo + ", 物料ID: " + materialid);
// 使用retrieveByClause查询BOM表匹配hvdef2和hvdef3字段
String whereClause = "pk_org = '" + orgid + "' AND dr = 0" +
" AND hcmaterialid = '" + materialid + "'" +
" AND hvdef2 = '" + orderCode + "'" +
" AND hvdef3 = '" + orderRowNo + "'";
log.debug("BOM查询条件: " + whereClause);
@SuppressWarnings("unchecked")
List<BomVO> bomList = (List<BomVO>) dao.retrieveByClause(BomVO.class, whereClause);
if (MMCollectionUtil.isNotEmpty(bomList)) {
if (bomList.size() > 1) {
throw new BusinessException("根据销售订单信息找到多个BOM版本请检查BOM数据。销售订单号: " + orderCode + ", 行号: " + orderRowNo + ", 物料ID: " + materialid + ", BOM版本数量: " + bomList.size());
}
// 取第一条记录
BomVO bomVO = bomList.get(0);
bomMap.put(orderInfo, bomVO);
foundCount++;
log.info("找到匹配的BOM销售订单信息: " + orderInfo +
", BOM版本ID: " + bomVO.getCbomid() +
", BOM版本: " + bomVO.getHversion() +
", 物料ID: " + materialid);
} else {
log.info("未找到匹配的BOM销售订单信息: " + orderInfo + ", 物料ID: " + materialid);
}
} else {
log.warn("销售订单信息格式错误orderInfo: " + orderInfo + ", 物料ID: " + materialid);
}
}
log.info("BOM查询完成总查询数量: " + salesOrderInfoMap.size() + ", 找到BOM数量: " + foundCount);
} catch (Exception e) {
log.error("根据销售订单信息查询BOM时发生异常", e);
if (e instanceof BusinessException) {
throw (BusinessException) e;
}
}
return bomMap;
}
/**
* 根据主键查询编码
*
* @param tableName 表名
* @param selectField 查询字段
* @param pkField 主键字段
* @param pk 主键值
* @return 编码
* @throws BusinessException
*/
private String transferCodeByPk(String tableName, String selectField, String pkField, String pk) throws BusinessException {
if (StringUtils.isEmpty(pk)) {
return null;
}
BaseDAO dao = new BaseDAO();
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();
}
}