From 93cee1552c6b6087e3449bfa6b299b5a314720c2 Mon Sep 17 00:00:00 2001 From: mzr Date: Fri, 19 Sep 2025 16:18:38 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E5=AF=BC=E5=85=A5=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E7=94=9F=E4=BA=A7=E8=AE=A2=E5=8D=95-=E5=BA=8F=E5=88=97?= =?UTF-8?q?=E5=8F=B7-=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pluginpoint/PmoSerialNoImportProcess.java | 51 ++++++++++++++++--- 1 file changed, 44 insertions(+), 7 deletions(-) diff --git a/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/pluginpoint/PmoSerialNoImportProcess.java b/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/pluginpoint/PmoSerialNoImportProcess.java index eef786a8..6501c5b0 100644 --- a/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/pluginpoint/PmoSerialNoImportProcess.java +++ b/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/pluginpoint/PmoSerialNoImportProcess.java @@ -7,22 +7,32 @@ package nc.bs.mmpac.pmo.pac0002.pluginpoint; import nc.bs.dao.BaseDAO; import nc.bs.framework.common.InvocationInfoProxy; +import nc.bs.framework.common.NCLocator; +import nc.bs.mmpac.pmo.pac0002.bp.util.PMOBPUtil; import nc.bs.trade.business.HYPubBO; import nc.impl.pubapp.pattern.data.bill.BillQuery; import nc.jdbc.framework.processor.MapProcessor; +import nc.pubitf.sn.doc.ISnService; +import nc.pubitf.sn.doc.param.SnDocParam; import nc.vo.ml.NCLangRes4VoTransl; import nc.vo.mmpac.pmo.pac0002.entity.PMOAggVO; +import nc.vo.mmpac.pmo.pac0002.entity.PMOHeadVO; import nc.vo.mmpac.pmo.pac0002.entity.PMOItemVO; import nc.vo.mmpac.pmo.pac0002.entity.PMOSerialNoVO; +import nc.vo.mmpac.pmo.parameter.PMOMaterlKey; import nc.vo.pub.BusinessException; import nc.vo.pub.VOStatus; import nc.vo.pub.lang.UFDouble; import nc.vo.pubapp.pattern.exception.ExceptionUtils; +import nc.vo.pubapp.pattern.pub.MathTool; import nccloud.baseapp.core.log.NCCForUAPLogger; import nccloud.bs.excel.IXChangeContext; import nccloud.bs.excel.plugin.AbstractImportProceeWithContext; +import java.util.ArrayList; +import java.util.List; import java.util.Map; +import java.util.Set; /** * 导入流程生产订单-序列号 @@ -46,13 +56,16 @@ public class PmoSerialNoImportProcess extends AbstractImportProceeWithContext { String cpmohid = pmoSerialNoVO.getVsndef1();// 订单号 String vsncode = pmoSerialNoVO.getVsncode();// 序列号 UFDouble nsnastnum = pmoSerialNoVO.getNsnastnum();// 数量 + if (!MathTool.equals(nsnastnum, UFDouble.ONE_DBL)) { + throw new BusinessException("数量应该等于1,请检查数据,单号:" + cpmohid + ",行号:" + cmoid); + } // 查询生产订单的主键 String selSql = " SELECT a.cpmohid,b.cmoid" + " FROM mm_mo b" + " LEFT JOIN mm_pmo a ON a.cpmohid = b.cpmohid" + // " LEFT JOIN org_factory c ON c.pk_factory = b.pk_org " + - " WHERE" + - " a.vbillcode = '[cpmohid]'" + + " WHERE b.dr = 0" + + " AND a.vbillcode = '[cpmohid]'" + " AND b.vrowno = '[cmoid]'" + " AND b.pk_org = '[pk_org]'"; selSql = selSql.replace("[cpmohid]", cpmohid); @@ -69,6 +82,15 @@ public class PmoSerialNoImportProcess extends AbstractImportProceeWithContext { BillQuery query = new BillQuery(PMOAggVO.class); PMOAggVO[] vos = query.query(new String[]{cpmohid1}); for (PMOAggVO pmoAggVO : vos) { + PMOHeadVO headVO = pmoAggVO.getParentVO(); + // 交易类型编码 + String vtrantypecode = headVO.getVtrantypecode(); + Set billTypeCodes = Set.of( + "55A2-Cxx-01", "55A2-Cxx-18" + ); + if (!billTypeCodes.contains(vtrantypecode)) { + throw new BusinessException("订单类型不符合要求,请检查数据,单号:" + cpmohid + ",行号:" + cmoid); + } PMOItemVO[] pmoItemVOS = pmoAggVO.getChildrenVO(); for (PMOItemVO pmoItemVO : pmoItemVOS) { if (cmoid1.equals(pmoItemVO.getCmoid())) { @@ -77,14 +99,14 @@ public class PmoSerialNoImportProcess extends AbstractImportProceeWithContext { pmoSerialNoVO1.setPk_group(pmoItemVO.getPk_group()); pmoSerialNoVO1.setPk_org(pmoItemVO.getPk_org()); pmoSerialNoVO1.setPk_org_v(pmoItemVO.getPk_org_v()); + pmoSerialNoVO1.setCsnunitid(pmoItemVO.getCunitid());// 主单位 + pmoSerialNoVO1.setCsnastunitid(pmoItemVO.getCastunitid());// 单位 pmoSerialNoVO1.setVsncode(vsncode); pmoSerialNoVO1.setNsnnum(nsnastnum); pmoSerialNoVO1.setNsnastnum(nsnastnum); - // pmoItemVO.setStatus(VOStatus.UPDATED); pmoSerialNoVO1.setStatus(VOStatus.NEW); pmoSerialNoVO1.setDr(0); - this.doAddSave(pmoSerialNoVO1); - // pmoItemVO.setSerialnos(new PMOSerialNoVO[]{pmoSerialNoVO1}); + this.doAddSave(pmoSerialNoVO1, headVO, pmoItemVO); } } } @@ -93,15 +115,30 @@ public class PmoSerialNoImportProcess extends AbstractImportProceeWithContext { } } - private void doAddSave(PMOSerialNoVO vo) { + private void doAddSave(PMOSerialNoVO vo, PMOHeadVO headvo, PMOItemVO itemvo) { try { HYPubBO hy = new HYPubBO(); + // 之前序列号全部设置为删除状态 + // int num = dao.executeUpdate("update mm_pmo_serialno set dr = 1 where cmoid = '" + itemvo.getCmoid() + "'"); + // NCCForUAPLogger.debug("PmoSerialNoImportProcess-num = " + num); String insert = hy.insert(vo); - NCCForUAPLogger.debug(insert); + NCCForUAPLogger.debug("PmoSerialNoImportProcess-insert = " + insert); + if (insert != null && !insert.isEmpty()) { + PMOSerialNoVO pmoSerialNoVO = (PMOSerialNoVO) hy.queryByPrimaryKey(PMOSerialNoVO.class, insert); + // 新增序列号档案 + List saveParams = new ArrayList<>(); + this.construcParams(saveParams, headvo, itemvo, pmoSerialNoVO, null); + ISnService service = NCLocator.getInstance().lookup(ISnService.class); + service.saveSerialnos(saveParams.toArray(new SnDocParam[0])); + } // NCLocator.getInstance().lookup(IPMOMaintainService.class).insert(resvo); } catch (BusinessException e) { ExceptionUtils.wrappException(e); } + } + private void construcParams(List params, PMOHeadVO headvo, PMOItemVO itemvo, PMOSerialNoVO snvo, Map snUint) { + SnDocParam docParam = PMOBPUtil.getSnDocParam(headvo, itemvo, snvo, snUint); + params.add(docParam); } } From e58437144f99ef3be0cc974eba37cab7bb14511f Mon Sep 17 00:00:00 2001 From: mzr Date: Sat, 20 Sep 2025 15:48:42 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E7=B2=BE=E5=AF=86=E7=89=A9=E6=96=99?= =?UTF-8?q?=E6=8E=A8=E5=90=AF=E6=BA=90-=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../listener/MaterialToJmQmsListener.java | 56 +++++++++++++------ 1 file changed, 38 insertions(+), 18 deletions(-) diff --git a/uapbd/src/private/nccloud/api/uapbd/material/listener/MaterialToJmQmsListener.java b/uapbd/src/private/nccloud/api/uapbd/material/listener/MaterialToJmQmsListener.java index 9d888cb1..165638a9 100644 --- a/uapbd/src/private/nccloud/api/uapbd/material/listener/MaterialToJmQmsListener.java +++ b/uapbd/src/private/nccloud/api/uapbd/material/listener/MaterialToJmQmsListener.java @@ -10,22 +10,24 @@ import nc.bs.businessevent.IBusinessEvent; import nc.bs.businessevent.IBusinessListener; import nc.bs.businessevent.bd.BDCommonEvent; import nc.bs.dao.BaseDAO; +import nc.bs.dao.DAOException; import nc.bs.framework.common.NCLocator; import nc.bs.logging.Log; import nc.bs.trade.business.HYPubBO; +import nc.bs.trade.business.HYSuperDMO; import nc.bs.uapbd.util.MyHelper; import nc.bs.uapbd.util.ThirdPartyPostRequestUtil; import nc.jdbc.framework.processor.MapProcessor; import nc.pubitf.uapbd.IMaterialPubService; import nc.util.mmf.framework.base.MMValueCheck; +import nc.vo.bd.defdoc.DefdocVO; import nc.vo.bd.material.MaterialVO; -import nc.vo.bd.material.marbasclass.MarBasClassVO; import nc.vo.bd.material.plan.MaterialPlanVO; +import nc.vo.bd.material.stock.MaterialStockVO; import nc.vo.org.OrgVO; import nc.vo.pub.BusinessException; import java.util.*; -import java.util.stream.Collectors; import java.util.stream.Stream; /** @@ -47,14 +49,7 @@ public class MaterialToJmQmsListener implements IBusinessListener { Object[] objs = e.getObjs(); // EventType是事件编码 1002-新增后 1004-修改后 1071-状态由停用变为启用后 1069-状态由启用变为停用后 - if ("1004".equals(eventType)) { - MaterialVO[] useVOs = ArrayClassConvertUtil.convert(objs, MaterialVO.class); - configParams = MyHelper.getConfigParams("jm-config", null); - if (configParams.isEmpty()) { - throw new BusinessException("精密的QMS接口缺少配置"); - } - buildSyncData(useVOs, eventType); - } else if ("1071".equals(eventType) || "1069".equals(eventType)) { + if ("1004".equals(eventType) || "1071".equals(eventType) || "1069".equals(eventType)) { MaterialVO[] useVOs = ArrayClassConvertUtil.convert(objs, MaterialVO.class); configParams = MyHelper.getConfigParams("jm-config", null); if (configParams.isEmpty()) { @@ -96,16 +91,18 @@ public class MaterialToJmQmsListener implements IBusinessListener { for (MaterialVO vo : useVOs) { // 判断物料的业务单元是否是精密公司,不是则跳过 String pkOrg = vo.getPk_org(); + String pkMaterial = vo.getPk_material(); String orgCode = MyHelper.transferField(OrgVO.getDefaultTableName(), OrgVO.CODE, OrgVO.PK_ORG, pkOrg); - if (!"1009".equals(eventType) && checkIfOrg(orgCode, configParams)) { + String pkOrg1 = MyHelper.transferField(OrgVO.getDefaultTableName(), OrgVO.PK_ORG, OrgVO.CODE, "C038"); + Integer num = MyHelper.checkIfOrg(configParams, pkMaterial, "jmOrg"); + if (!"1009".equals(eventType) && ((num <= 0))) { continue; } // 字段值翻译 - String pk_marbasclass = vo.getPk_marbasclass(); - String mrlTypeName = MyHelper.getStrValByCondition(MarBasClassVO.getDefaultTableName(), MarBasClassVO.NAME, - "pk_marbasclass = '" + pk_marbasclass + "'"); + // String pk_marbasclass = vo.getPk_marbasclass(); + // String mrlTypeName = MyHelper.getStrValByCondition(MarBasClassVO.getDefaultTableName(), MarBasClassVO.NAME, + // "pk_marbasclass = '" + pk_marbasclass + "'"); // 计量单位 - String pkMaterial = vo.getPk_material(); Map unitMap = getGoodsInfo(pkMaterial); Map planMap = queryMaterialPlanInfoByPks(new String[]{pkMaterial}, pkOrg, new String[]{MaterialPlanVO.DEF2}); @@ -117,6 +114,10 @@ public class MaterialToJmQmsListener implements IBusinessListener { // 1=未启用;2=已启用;3=已停用; Integer enablestate = vo.getEnablestate(); String statusCode = (3 == enablestate) ? "1" : "0"; + // 物料标志 + String wlbzId = MyHelper.getStrValByCondition(MaterialStockVO.getDefaultTableName(), MaterialStockVO.DEF3, + MaterialStockVO.PK_MATERIAL + " = '" + pkMaterial + "' and pk_org = '" + pkOrg1 + "'"); + String wlbz = getDefName("zdy-jmzz001", wlbzId); // 组装数据 JSONObject singleObj = new JSONObject(); // 批次编号,用于唯一标识当前传输的物料数据批次,便于追溯和批量处理 @@ -128,7 +129,8 @@ public class MaterialToJmQmsListener implements IBusinessListener { contentObj.put("bipwlbh", vo.getCode()); // BIP物料编码 contentObj.put("wlmc", vo.getName()); // 物料名称 contentObj.put("wlxhgg", vo.getMaterialtype() + vo.getMaterialspec()); // 物料型号规格 - contentObj.put("wlfl", mrlTypeName); // 物料分类 + contentObj.put("wlfl", ""); // 物料分类 + contentObj.put("wlbz", wlbz); // 物料标志 contentObj.put("sjjldw", unitMap.get("unitname")); // 设计计量单位 contentObj.put("cgjldw", unitMap.get("deputy_unitname")); // 采购计量单位 contentObj.put("zhxs", unitMap.getOrDefault("convertRate", "1.00")); // 转换系数 @@ -211,8 +213,8 @@ public class MaterialToJmQmsListener implements IBusinessListener { return true; } - public static Map queryMaterialPlanInfoByPks(String[] pks, String pk_stockorg, - String[] fields) throws BusinessException { + public Map queryMaterialPlanInfoByPks(String[] pks, String pk_stockorg, + String[] fields) throws BusinessException { Map map = null; List vids = Stream.of(pks).filter(Objects::nonNull).distinct().toList(); if (vids.isEmpty()) { @@ -225,4 +227,22 @@ public class MaterialToJmQmsListener implements IBusinessListener { return map; } + /** + * 获取自定义项信息 + */ + private String getDefName(String code, String pk_defdoc) { + String res = ""; + String strWhere = " pk_defdoclist in (select pk_defdoclist from bd_defdoclist where code='" + code + "' and dr=0 ) and dr = 0 and pk_defdoc = '" + pk_defdoc + "'"; + try { + DefdocVO[] defdocVOs = (DefdocVO[]) new HYSuperDMO().queryByWhereClause(DefdocVO.class, strWhere); + if (defdocVOs != null && defdocVOs.length > 0) { + res = defdocVOs[0].getName().trim(); + } + } catch (DAOException e) { + logger.error("gyMes-SaleOrder-error,getDefName[" + e.getMessage() + "]"); + } + return res; + + } + } From f0d96b92c4d39a4aad74e0bda6079cc5f4c23b3c Mon Sep 17 00:00:00 2001 From: mzr Date: Sat, 20 Sep 2025 18:16:14 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E7=B2=BE=E5=AF=86-=E5=90=AF=E6=BA=90-?= =?UTF-8?q?=E9=A2=86=E6=96=99=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ic/m4d/APIMaterialOutMaintainImpl.java | 119 +++++++++++++++++- .../api/ic/m4d/IAPIMaterialOutMaintain.java | 4 + .../openapi/ic/m4d/MaterialOutResource.java | 25 +++- 3 files changed, 141 insertions(+), 7 deletions(-) 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 9efbc015..b81b6ea7 100644 --- a/ic/src/private/nccloud/api/impl/ic/m4d/APIMaterialOutMaintainImpl.java +++ b/ic/src/private/nccloud/api/impl/ic/m4d/APIMaterialOutMaintainImpl.java @@ -1,13 +1,21 @@ package nccloud.api.impl.ic.m4d; +import com.alibaba.fastjson.JSONObject; +import nc.bs.dao.BaseDAO; +import nc.bs.dao.DAOException; import nc.bs.framework.common.NCLocator; import nc.bs.logging.Log; import nc.bs.scmpub.query.SCMBillQuery; import nc.itf.ic.m4d.IMaterialOutMaintain; +import nc.itf.mmpac.pickm.IPickmQueryService; import nc.itf.scmpub.reference.uap.pf.PfServiceScmUtil; +import nc.itf.uap.pf.busiflow.PfButtonClickContext; +import nc.jdbc.framework.processor.ColumnListProcessor; import nc.pubimpl.ic.api.maintain.BillMaintainTool; import nc.pubitf.ic.m4d.api.IMaterialOutMaintainAPI; +import nc.util.mmf.busi.service.PFPubService; +import nc.util.mmf.framework.base.MMValueCheck; import nc.vo.ic.general.define.ICBillFlag; import nc.vo.ic.general.define.ICBillHeadVO; import nc.vo.ic.general.util.ICLocationUtil; @@ -16,8 +24,12 @@ import nc.vo.ic.m4d.entity.MaterialOutBodyVO; import nc.vo.ic.m4d.entity.MaterialOutHeadVO; import nc.vo.ic.m4d.entity.MaterialOutVO; import nc.vo.ic.pub.define.ICPubMetaNameConst; +import nc.vo.mmpac.pickm.entity.AggPickmVO; +import nc.vo.mmpac.pickm.entity.PickmItemVO; import nc.vo.pub.BusinessException; +import nc.vo.pub.ISuperVO; import nc.vo.pub.VOStatus; +import nc.vo.pub.lang.UFDouble; import nc.vo.scmpub.check.billvalidate.BillVOsCheckRule; import nc.vo.scmpub.res.billtype.ICBillType; import nc.vo.scmpub.util.ArrayUtil; @@ -27,6 +39,7 @@ import nccloud.api.impl.ic.m4d.fill.MaterialOutSaveFillValue; import nccloud.api.impl.ic.m4d.fill.MaterialOutUpdateFillValue; import nccloud.api.impl.ic.pub.check.CheckProhibitUpdateFields; import nccloud.api.uapbd.wms.utils.IWmsSyncUtils; +import nccloud.baseapp.core.log.NCCForUAPLogger; import nccloud.openapi.ic.util.ICAPILocationVOUtils; import nccloud.openapi.scmpub.pub.TransferCodeToPKTool; import nccloud.openapi.scmpub.pub.TransferMapToVOTool; @@ -43,8 +56,15 @@ import java.util.*; */ public class APIMaterialOutMaintainImpl implements IAPIMaterialOutMaintain { + private BaseDAO baseDAO = null; + + private BaseDAO getDao() { + if (this.baseDAO == null) { + this.baseDAO = new BaseDAO(); + } + return this.baseDAO; + } - // private static final BaseDAO DAO = new BaseDAO(); private static final Log log = Log.getInstance("wmslog"); // private static final IHttpPostOtherSys HTTP_POST_OTHER_SYS = NCLocator.getInstance().lookup(IHttpPostOtherSys.class); @@ -71,7 +91,7 @@ public class APIMaterialOutMaintainImpl implements IAPIMaterialOutMaintain { // if (isSpecialCase) { // processPickingPlanSpecialLogic(vos); // } - //其他数据填充 + // 其他数据填充 new MaterialOutSaveFillValue().setDefaultValue(vos); IMaterialOutMaintainAPI materialOut = NCLocator.getInstance().lookup(IMaterialOutMaintainAPI.class); @@ -103,7 +123,7 @@ public class APIMaterialOutMaintainImpl implements IAPIMaterialOutMaintain { // if (isSpecialCase) { // processPickingPlanSpecialLogic(vos); // } - //其他数据填充 + // 其他数据填充 new MaterialOutSaveFillValue().setDefaultValue(vos); IMaterialOutMaintainAPI materialOut = NCLocator.getInstance().lookup(IMaterialOutMaintainAPI.class); @@ -227,7 +247,7 @@ public class APIMaterialOutMaintainImpl implements IAPIMaterialOutMaintain { roigBvo.setAttributeValue(battr, newBvo.getAttributeValue(battr)); bfields.add(battr); } - //设置货位序列号孙表,把原来的孙表删除,修改的货位置为新增 + // 设置货位序列号孙表,把原来的孙表删除,修改的货位置为新增 if (null != newBvo.getLocationVOs()) { List allloc = new ArrayList(); if (null != deleteLoc && null != deleteLoc.get(roigBvo.getCgeneralbid())) { @@ -244,7 +264,7 @@ public class APIMaterialOutMaintainImpl implements IAPIMaterialOutMaintain { } // 翻译货位 ICAPILocationVOUtils.translate(materialOutVOs); - //其他数据填充 + // 其他数据填充 new MaterialOutUpdateFillValue().setDefaultValue(materialOutVOs, bfields); } } @@ -337,6 +357,95 @@ public class APIMaterialOutMaintainImpl implements IAPIMaterialOutMaintain { return materialOut.insertBills(vos); } + @Override + public JSONObject destIssue(Map paramMap) throws BusinessException { + // 启源领料 + /* + 1、传入数据基本非空校验 + 2、根据传入的生产订单主键获取流程备料计划 + 3、调用单据转换规则,备料计划VO转为材料出库VO + 4、处理材料出库VO部分字段的赋值(行数量 = 本次领料套数(启源传入)*单位主用量(备料计划)) + 5、调用材料出库的保存方法 + */ + List mids; + try { + String sql = "SELECT cpickmid from mm_pickm WHERE dr = 0 AND fbillstatus = 1 AND csourcebillid = '[csourcebillid]'"; + sql = sql.replace("[csourcebillid]", paramMap.get("cpmohid").toString()); + mids = (List) getDao().executeQuery(sql, new ColumnListProcessor()); + } catch (DAOException e) { + throw new BusinessException(e); + } + if (MMValueCheck.isEmpty(mids)) { + throw new BusinessException("没有关联审核通过的流程备料计划,无法领料!"); + } + String[] cpickmids = mids.toArray(new String[0]); + IPickmQueryService queryService = NCLocator.getInstance().lookup(IPickmQueryService.class); + AggPickmVO[] pickmVOS = queryService.queryBillsByPks(cpickmids); + if (MMValueCheck.isEmpty(pickmVOS)) { + throw new BusinessException("没有关联审核通过的流程备料计划,无法领料!"); + } + List newVos = new ArrayList<>(); + for (AggPickmVO vo : pickmVOS) { + if (vo.getChildrenVO() == null || vo.getChildrenVO().length == 0) { + continue; + } + newVos.add(vo); + } + if (MMValueCheck.isEmpty(newVos)) { + throw new BusinessException("关联的流程备料计划都没有明细行,无法领料!"); + } + Map pickmItemVOMap = new HashMap<>(); + for (AggPickmVO pickmVO : pickmVOS) { + PickmItemVO[] pickmItemVOS = (PickmItemVO[]) pickmVO.getChildren(PickmItemVO.class); + for (PickmItemVO pickmItemVO : pickmItemVOS) { + pickmItemVOMap.put(pickmItemVO.getCpickm_bid(), pickmItemVO); + } + } + // 调用单据转换规则转换出材料出库的VO + MaterialOutVO[] vos = (MaterialOutVO[]) PFPubService.runChangeData("55A3", ICBillType.MaterialOut.getCode(), + newVos.toArray(new AggPickmVO[0]), null, PfButtonClickContext.ClassifyByItfdef); + // 设置行号 + setMaterialOutRowNum(vos); + UFDouble num = new UFDouble(paramMap.get("num").toString()); + for (MaterialOutVO vo : vos) { + // 处理行数量,行数量 = 本次领料套数(启源传入)*单位主用量(备料计划) + MaterialOutBodyVO[] bodys = vo.getBodys(); + for (MaterialOutBodyVO body : bodys) { + UFDouble num1 = num; + // 查询上游备料计划的单位主用量 + String csourcebillbid = body.getCsourcebillbid(); + PickmItemVO pickmItemVO = pickmItemVOMap.get(csourcebillbid); + if (pickmItemVO != null) { + num1 = num.multiply(pickmItemVO.getNunitusenum()); + } + // nshouldnum 应发主数量 nshouldassistnum 应发数量 + // NCCForUAPLogger.debug("nshouldnum = " + body.getNshouldnum().toString()); + // NCCForUAPLogger.debug("nshouldassistnum = " + body.getNshouldassistnum().toString()); + body.setNshouldnum(num1); + body.setNshouldassistnum(num1); + } + } + IMaterialOutMaintainAPI materialOut = NCLocator.getInstance().lookup(IMaterialOutMaintainAPI.class); + MaterialOutVO[] outVOS = materialOut.insertBills(vos); + // 查询备料计划行上的成套套数 nbsetpartsnum + List numList = new ArrayList<>(); + AggPickmVO[] newPickmVOS = queryService.queryBillsByPks(cpickmids); + for (AggPickmVO newPickmVO : newPickmVOS) { + PickmItemVO[] pickmItemVOS = (PickmItemVO[]) newPickmVO.getChildren(PickmItemVO.class); + for (PickmItemVO pickmItemVO : pickmItemVOS) { + JSONObject numJson = new JSONObject(); + String nbsetpartsnum = pickmItemVO.getNbsetpartsnum().toString(); + numJson.put("nbsetpartsnum", nbsetpartsnum); + numJson.put("cbmaterialvid", pickmItemVO.getCbmaterialvid()); + numList.add(numJson); + } + } + JSONObject result = new JSONObject(); + result.put("outVOS", outVOS); + result.put("numList", numList); + return result; + } + /** * 检查是否满足特殊条件:需要同步的组织 diff --git a/ic/src/public/nccloud/api/ic/m4d/IAPIMaterialOutMaintain.java b/ic/src/public/nccloud/api/ic/m4d/IAPIMaterialOutMaintain.java index e340f164..9209e975 100644 --- a/ic/src/public/nccloud/api/ic/m4d/IAPIMaterialOutMaintain.java +++ b/ic/src/public/nccloud/api/ic/m4d/IAPIMaterialOutMaintain.java @@ -7,6 +7,8 @@ package nccloud.api.ic.m4d; import java.util.List; import java.util.Map; + +import com.alibaba.fastjson.JSONObject; import nc.vo.ic.m4d.entity.MaterialOutVO; import nc.vo.pub.BusinessException; @@ -24,4 +26,6 @@ public interface IAPIMaterialOutMaintain { MaterialOutVO[] saveByRef(List> var1) throws BusinessException; MaterialOutVO[] batchsave(List> var1) throws BusinessException; + + JSONObject destIssue(Map paramMap) throws BusinessException; } diff --git a/ic/src/public/nccloud/openapi/ic/m4d/MaterialOutResource.java b/ic/src/public/nccloud/openapi/ic/m4d/MaterialOutResource.java index ae5588fb..92f77b3f 100644 --- a/ic/src/public/nccloud/openapi/ic/m4d/MaterialOutResource.java +++ b/ic/src/public/nccloud/openapi/ic/m4d/MaterialOutResource.java @@ -1,5 +1,6 @@ package nccloud.openapi.ic.m4d; +import com.alibaba.fastjson.JSONObject; import nc.bs.framework.common.NCLocator; import nc.bs.logging.Log; import nc.bs.scmpub.query.SCMBillQuery; @@ -184,15 +185,16 @@ public class MaterialOutResource extends NCCPubRestResource { return ResultMessageUtil.exceptionToJSON(e); } } + @POST @Path("operation/delete") @Consumes({"application/json"}) @Produces({"application/json"}) public JSONString delete(Map param) { - Object[] paramArray = ((ArrayList)param.get("cgeneralhid")).toArray(); + Object[] paramArray = ((ArrayList) param.get("cgeneralhid")).toArray(); String[] paramStrings = new String[paramArray.length]; - for(int i = 0; i < paramArray.length; ++i) { + for (int i = 0; i < paramArray.length; ++i) { paramStrings[i] = paramArray[i].toString(); } @@ -342,6 +344,25 @@ public class MaterialOutResource extends NCCPubRestResource { } } + @POST + @Path("saveByQyMes") + @Consumes("application/json") + @Produces("application/json") + public JSONString saveByQyMes(Map paramMap) { + try { + if (!paramMap.containsKey("num") || !paramMap.containsKey("cpmohid")) { + return ResultMessageUtil.exceptionToJSON("传入数据异常,参数要包含流程生产订单信息和领料数量信息", APIErrCodeEnum.BUSINESSEXCCODE.getCode()); + } + IAPIMaterialOutMaintain materialOut = + NCLocator.getInstance().lookup(IAPIMaterialOutMaintain.class); + JSONObject result = materialOut.destIssue(paramMap); + return ResultMessageUtil.toJSON(result, nc.vo.ml.NCLangRes4VoTransl.getNCLangRes() + .getStrByID("4008027_0", "04008027-0472")/* @res "材料出库单保存成功" */); + } catch (Exception e) { + return ResultMessageUtil.exceptionToJSON(e); + } + } + @Override public String getModule() { // TODO Auto-generated method stub From 6cc2585572277dd2b2bba60d99031306cbdc3af8 Mon Sep 17 00:00:00 2001 From: mzr Date: Sat, 20 Sep 2025 18:25:08 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E7=B2=BE=E5=AF=86-=E5=90=AF=E6=BA=90-?= =?UTF-8?q?=E6=B5=81=E7=A8=8B=E7=94=9F=E4=BA=A7=E8=AE=A2=E5=8D=95=E6=8E=A8?= =?UTF-8?q?=E9=80=81=E5=A2=9E=E5=8A=A0=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bs/mmpac/pmo/pac0002/bp/rule/AfterPmoSyncJmQMSRule.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/AfterPmoSyncJmQMSRule.java b/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/AfterPmoSyncJmQMSRule.java index 426ef0af..1376b83e 100644 --- a/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/AfterPmoSyncJmQMSRule.java +++ b/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/AfterPmoSyncJmQMSRule.java @@ -77,6 +77,7 @@ public class AfterPmoSyncJmQMSRule implements IRule { String billmakerName = (String) baseDAO.executeQuery(sql, new ColumnProcessor()); singleObj.put("batchid", System.currentTimeMillis()); + singleObj.put("bipzyid", pmoHeadVO.getCpmohid());// BIP订单主键 singleObj.put("scdh", pmoHeadVO.getVbillcode()); singleObj.put("xdrq", pmoHeadVO.getDbilldate().toString()); singleObj.put("jhy", billmakerName); @@ -98,12 +99,14 @@ public class AfterPmoSyncJmQMSRule implements IRule { Integer fitemstatus = item.getFitemstatus(); JSONObject itemObj = new JSONObject(); + itemObj.put("bipqdid", item.getCmoid());// BIP行id itemObj.put("sgdh", projectCode);// 施工单号-BIP项目编码 itemObj.put("xshth", item.getVfirstcode());// 销售合同号-BIP源头单据号 itemObj.put("htqdxh", item.getVfirstrowno());// 合同清单序号-BIP源头单据行号 itemObj.put("wlbh", mrlmap.get("code"));// 产品编号 itemObj.put("wlmc", mrlmap.get("name"));// 产品名称 - itemObj.put("wlxhgg", mrlmap.get("materialspec") + (String) mrlmap.get("materialtype"));// 产品型号规格 + String wlxhgg = MyHelper.skipNull(mrlmap.get("materialspec")) + MyHelper.skipNull(mrlmap.get("materialtype")); + itemObj.put("wlxhgg", wlxhgg);// 产品型号规格 itemObj.put("jhsl", item.getNastnum().toString());// 计划数量,该产品的生产计划数量 UFDateTime tplanendtime = item.getTplanendtime(); String tplanendtimeStr = ""; From 84207f18d922f74f501b01c232996cf6d5f52379 Mon Sep 17 00:00:00 2001 From: mzr Date: Sun, 21 Sep 2025 09:15:19 +0800 Subject: [PATCH 5/6] =?UTF-8?q?feat(uapbd):=20=E6=B7=BB=E5=8A=A0skipNull?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E6=96=B9=E6=B3=95=E6=96=B0=E5=A2=9EskipNull?= =?UTF-8?q?=E9=9D=99=E6=80=81=E6=96=B9=E6=B3=95=E7=94=A8=E4=BA=8E=E5=A4=84?= =?UTF-8?q?=E7=90=86=E7=A9=BA=E5=80=BC=E6=83=85=E5=86=B5=EF=BC=8C=E5=BD=93?= =?UTF-8?q?=E4=BC=A0=E5=85=A5=E5=AF=B9=E8=B1=A1=E4=B8=BAnull=E6=88=96?= =?UTF-8?q?=E7=A9=BA=E5=AD=97=E7=AC=A6=E4=B8=B2=E6=97=B6=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E7=A9=BA=E5=AD=97=E7=AC=A6=E4=B8=B2=EF=BC=8C=20=E5=90=A6?= =?UTF-8?q?=E5=88=99=E8=BF=94=E5=9B=9E=E5=8E=BB=E9=99=A4=E9=A6=96=E5=B0=BE?= =?UTF-8?q?=E7=A9=BA=E6=A0=BC=E7=9A=84=E5=AD=97=E7=AC=A6=E4=B8=B2=E5=80=BC?= =?UTF-8?q?=E3=80=82=E8=AF=A5=E6=96=B9=E6=B3=95=E5=8F=AF=E6=9C=89=E6=95=88?= =?UTF-8?q?=E9=81=BF=E5=85=8D=E7=A9=BA=E6=8C=87=E9=92=88=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E5=92=8C=E6=97=A0=E6=95=88=E7=A9=BA=E6=A0=BC=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- uapbd/src/public/nc/bs/uapbd/util/MyHelper.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/uapbd/src/public/nc/bs/uapbd/util/MyHelper.java b/uapbd/src/public/nc/bs/uapbd/util/MyHelper.java index 05fd0b67..689c2a05 100644 --- a/uapbd/src/public/nc/bs/uapbd/util/MyHelper.java +++ b/uapbd/src/public/nc/bs/uapbd/util/MyHelper.java @@ -184,4 +184,12 @@ public class MyHelper { // NCCForUAPLogger.debug(countSql); return (Integer) dao.executeQuery(countSql, new ColumnProcessor()); } + + public static String skipNull(Object value) { + if ((value == null) || (value.toString().trim().length() == 0)) { + return ""; + } + return value.toString().trim(); + } + } From 99213dbf9350c46f83935386852985c8d649b570 Mon Sep 17 00:00:00 2001 From: mzr Date: Sun, 21 Sep 2025 09:18:51 +0800 Subject: [PATCH 6/6] =?UTF-8?q?BOM=E6=9B=BF=E4=BB=A3=E6=96=99=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E5=A2=9E=E5=8A=A0=E4=BF=AE=E6=94=B9=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=EF=BC=9Abcanreplace=E3=80=81freplacetype=E3=80=81bisdisplace?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nccloud/openapi/mmbd/bom/BomResource.java | 38 ++++++++++++------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/uapbd/src/public/nccloud/openapi/mmbd/bom/BomResource.java b/uapbd/src/public/nccloud/openapi/mmbd/bom/BomResource.java index 647102a7..4c21bc94 100644 --- a/uapbd/src/public/nccloud/openapi/mmbd/bom/BomResource.java +++ b/uapbd/src/public/nccloud/openapi/mmbd/bom/BomResource.java @@ -13,7 +13,6 @@ import nc.itf.bd.bom.bom0202.IBomBillQueryService; import nc.jdbc.framework.generator.IdGenerator; import nc.mmbd.utils.factoryparam.MMBDFactoryParameter; import nc.uif.pub.exception.UifException; -import nc.util.mmf.framework.base.MMArrayUtil; import nc.util.mmf.framework.base.MMStringUtil; import nc.util.mmf.framework.base.MMValueCheck; import nc.vo.bd.bom.bom0202.entity.AggBomVO; @@ -24,6 +23,7 @@ import nc.vo.pub.BusinessException; import nc.vo.pub.VOStatus; import nc.vo.pub.lang.UFBoolean; import nc.vo.pub.lang.UFDouble; +import nc.ws.opm.pub.utils.result.APIErrCodeEnum; import nccloud.api.mmbd.bom.IAPIBomBusinessService; import nccloud.api.rest.utils.ResultMessageUtil; import nccloud.framework.core.exception.ExceptionUtils; @@ -96,7 +96,7 @@ public class BomResource extends AbstractNCCRestResource { if (MMValueCheck.isEmpty(paramList)) { return ResultMessageUtil.exceptionToJSON("传入数据异常,参数要包含表头信息和表体信息", "1"); } else { - IAPIBomBusinessService service = (IAPIBomBusinessService)NCLocator.getInstance().lookup(IAPIBomBusinessService.class); + IAPIBomBusinessService service = (IAPIBomBusinessService) NCLocator.getInstance().lookup(IAPIBomBusinessService.class); JSONString result = service.update(paramList); return result; } @@ -110,7 +110,7 @@ public class BomResource extends AbstractNCCRestResource { if (MMValueCheck.isEmpty(paramMap)) { return ResultMessageUtil.exceptionToJSON("传入数据异常,未传入查询条件", "1"); } else { - IAPIBomBusinessService service = (IAPIBomBusinessService)NCLocator.getInstance().lookup(IAPIBomBusinessService.class); + IAPIBomBusinessService service = (IAPIBomBusinessService) NCLocator.getInstance().lookup(IAPIBomBusinessService.class); JSONString result = service.query(paramMap); return result; } @@ -124,9 +124,7 @@ public class BomResource extends AbstractNCCRestResource { if (MMValueCheck.isEmpty(paramMap)) { return ResultMessageUtil.exceptionToJSON("传入数据异常,未传入更新数据", "1"); } else { - try{ - - + try { IAPIBomBusinessService service = (IAPIBomBusinessService) NCLocator.getInstance().lookup(IAPIBomBusinessService.class); IBomBillQueryService qry = (IBomBillQueryService) NCLocator.getInstance().lookup(IBomBillQueryService.class); IBomBillMaintainService bomBillMaintainService = (IBomBillMaintainService) NCLocator.getInstance().lookup(IBomBillMaintainService.class); @@ -136,10 +134,15 @@ public class BomResource extends AbstractNCCRestResource { String cbomid = (String) param.get("cbomid"); String targetCbomReplaceId = (String) param.get("cbom_replaceid"); // 目标替代ID String targetCbomBid = (String) param.get("cbombid"); // 目标物料项ID + String freplacetype = param.get("freplacetype") + ""; // 替代类型 // 校验必要参数 if (MMValueCheck.isEmpty(cbomid) || MMValueCheck.isEmpty(targetCbomBid)) { - ExceptionUtils.wrapBusinessException("cbomid和cbombid为必传参数"); + return ResultMessageUtil.exceptionToJSON("cbomid和cbombid为必传参数", APIErrCodeEnum.BUSINESSEXCCODE.getCode()); + } + + if (MMValueCheck.isEmpty(freplacetype) || !Arrays.asList("1", "2").contains(freplacetype)) { + return ResultMessageUtil.exceptionToJSON("传入替代类型为空或者值范围错误", APIErrCodeEnum.BUSINESSEXCCODE.getCode()); } // 查询BOM数据 @@ -157,6 +160,11 @@ public class BomResource extends AbstractNCCRestResource { for (BomItemVO bomItemVO : bomItemVOS) { // 匹配目标物料项 if (targetCbomBid.equals(bomItemVO.getCbom_bid())) { + bomItemVO.setStatus(VOStatus.UPDATED); + // bcanreplace 可替代 + bomItemVO.setBcanreplace(UFBoolean.TRUE); + // freplacetype 替代类型 1=全部替代;2=部分替代; + bomItemVO.setFreplacetype(Integer.valueOf(freplacetype)); BomReplVO[] replVOS = bomItemVO.getRepl(); List replList = MMValueCheck.isEmpty(replVOS) ? new ArrayList<>() @@ -216,27 +224,27 @@ public class BomResource extends AbstractNCCRestResource { bomReplVOS.addAll(Arrays.asList(result)); } } - List> bomReplVOList = new ArrayList<>(); + List> bomReplVOList = new ArrayList<>(); HYPubBO hybo = new HYPubBO(); for (Map param : paramMap) { String cbomid = (String) param.get("cbomid"); String targetCbomReplaceId = (String) param.get("cbom_replaceid"); // 目标替代ID String targetCbomBid = (String) param.get("cbombid"); // 目标物料项ID - if(!MMStringUtil.isEmpty(targetCbomReplaceId)){ + if (!MMStringUtil.isEmpty(targetCbomReplaceId)) { bomReplVOList.add(param); continue; - }else{ + } else { if (param.containsKey("creplmaterialvid")) { - String mrlCode= (String) param.get("creplmaterialvid"); - String mrlid=(String) hybo.findColValue("bd_material","pk_material"," code = '" + mrlCode + "' "); + String mrlCode = (String) param.get("creplmaterialvid"); + String mrlid = (String) hybo.findColValue("bd_material", "pk_material", " code = '" + mrlCode + "' "); for (AggBomVO aggBomVO : bomReplVOS) { for (BomItemVO bomItemVO : aggBomVO.getChildrenVO()) { if (targetCbomBid.equals(bomItemVO.getCbom_bid())) { for (BomReplVO replVO : bomItemVO.getRepl()) { - if(replVO.getCreplmaterialvid().equals(mrlid)){ - param.put("cbom_replaceid",replVO.getCbom_replaceid()); + if (replVO.getCreplmaterialvid().equals(mrlid)) { + param.put("cbom_replaceid", replVO.getCbom_replaceid()); bomReplVOList.add(param); continue; } @@ -261,6 +269,8 @@ public class BomResource extends AbstractNCCRestResource { // 提取属性设置为工具方法,减少冗余 private void setReplVOProperties(BomReplVO replVO, Map param) throws UifException { + // bisdisplace 取代 + replVO.setBisdisplace(UFBoolean.TRUE); HYPubBO hybo = new HYPubBO(); // if (param.containsKey("pk_group")) { // replVO.setPk_group((String) param.get("pk_group"));