From 66f419cbc3a7ba97dc786813297e3d3b9e6da901 Mon Sep 17 00:00:00 2001 From: mzr Date: Tue, 28 Oct 2025 18:15:28 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E7=94=9F=E4=BA=A7=E6=8A=A5=E5=91=8A?= =?UTF-8?q?=E4=BF=9D=E5=AD=98=E6=A0=A1=E9=AA=8C=E9=BD=90=E5=A5=97=E6=A3=80?= =?UTF-8?q?=E6=9F=A5-=E6=AD=A3=E5=BC=8F=E7=8E=AF=E5=A2=83=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nccloud/openapi/mmpac/wr/WrResource.java | 51 ++++++++++++++++++- 1 file changed, 49 insertions(+), 2 deletions(-) diff --git a/mmpac/src/public/nccloud/openapi/mmpac/wr/WrResource.java b/mmpac/src/public/nccloud/openapi/mmpac/wr/WrResource.java index 0dae270d..e451b0f1 100644 --- a/mmpac/src/public/nccloud/openapi/mmpac/wr/WrResource.java +++ b/mmpac/src/public/nccloud/openapi/mmpac/wr/WrResource.java @@ -1,22 +1,25 @@ package nccloud.openapi.mmpac.wr; - import nc.bs.dao.BaseDAO; import nc.bs.framework.common.InvocationInfoProxy; import nc.bs.framework.common.NCLocator; import nc.bs.logging.Log; import nc.bs.uif2.validation.ValidationFailure; +import nc.itf.mmpac.wr.IWrBusinessService; import nc.jdbc.framework.SQLParameter; import nc.jdbc.framework.processor.ColumnProcessor; import nc.util.mmf.framework.base.MMArrayUtil; import nc.util.mmf.framework.base.MMCollectionUtil; import nc.util.mmf.framework.base.MMNumberUtil; import nc.util.mmf.framework.base.MMValueCheck; +import nc.vo.bd.bom.bom0202.enumeration.OutputTypeEnum; +import nc.vo.mmpac.wr.consts.WrptLangConst; import nc.vo.mmpac.wr.entity.*; import nc.vo.mmpac.wr.enumeration.WrBillStatusEnum; import nc.vo.pub.BusinessException; import nc.vo.pub.VOStatus; import nc.vo.pub.billtype.BilltypeVO; +import nc.vo.pub.lang.UFBoolean; import nc.vo.pub.lang.UFDate; import nc.vo.pubapp.AppContext; import nc.vo.pubapp.pattern.exception.ExceptionUtils; @@ -24,6 +27,7 @@ import nc.ws.opm.pub.utils.result.APIErrCodeEnum; import nccloud.api.mmpac.wr.IAPIWrMaintain; import nccloud.api.rest.utils.NCCRestUtils; import nccloud.api.rest.utils.ResultMessageUtil; +import nccloud.framework.service.ServiceLocator; import nccloud.openapi.scmpub.pub.TransferCodeToPKTool; import nccloud.ws.rest.resource.AbstractNCCRestResource; import org.json.JSONString; @@ -379,7 +383,50 @@ public class WrResource extends AbstractNCCRestResource { aggWrVO.getParentVO().setVtrantypeid(collection.get(0).getPk_billtypeid()); aggWrVO.getParentVO().setDbilldate(new UFDate()); } - AggWrVO[] aggvos = server.newsave(voList.toArray(new AggWrVO[0])); + + /* + * edit by xc 2025-10-22 + * 齐套检查前置 从产品入库 前置 完工报告 + * 考虑标品接口扩展性 表头增加校验参数 isdonecheck:Y/N + */ + AggWrVO[] wrVOS = voList.toArray(new AggWrVO[0]); + if (headInfo.containsKey("isdonecheck") && "Y".equals(headInfo.get("isdonecheck").toString())) { + IWrBusinessService service = (IWrBusinessService) ServiceLocator.find(IWrBusinessService.class); + AggWrVO[] resultvos = service.setCheck(wrVOS); + if (!MMValueCheck.isEmpty(resultvos)) { + StringBuilder errorMessagesSB = new StringBuilder(); + + for (AggWrVO aggWrVO : resultvos) { + if (!WrBillStatusEnum.FREEDOM.equalsValue(aggWrVO.getParentVO().getFbillstatus())) { + StringBuilder notThroughSB = new StringBuilder(); + String billCode = aggWrVO.getParentVO().getVbillcode(); + WrItemVO[] itemVOs = (WrItemVO[]) aggWrVO.getChildren(WrItemVO.class); + if (!MMValueCheck.isEmpty(itemVOs)) { + for (WrItemVO itemVO : itemVOs) { + if (!MMValueCheck.isEmpty(itemVO.getCbmoid()) && OutputTypeEnum.MAIN_PRODUCT.equalsValue(itemVO.getFbproducttype()) && !UFBoolean.TRUE.equals(itemVO.getBbsetmark())) { + notThroughSB.append(itemVO.getVbrowno()); + notThroughSB.append(","); + } + } + if (!MMValueCheck.isEmpty(notThroughSB)) { + notThroughSB.setLength(notThroughSB.length() - 1); + String message = WrptLangConst.getSetCheckError_Msg(new String[]{billCode, notThroughSB.toString()}); + errorMessagesSB.append(message); + errorMessagesSB.append("\n"); + } + } + } + } + if (!MMValueCheck.isEmpty(errorMessagesSB)) { + ExceptionUtils.wrappBusinessException(errorMessagesSB.toString()); + } + } + } + /* + * end 齐套检查 + * edit by xc 2025-10-22 + */ + AggWrVO[] aggvos = server.newsave(wrVOS); boolean successFlag = true; StringBuilder errMsg = new StringBuilder(); if (MMArrayUtil.isNotEmpty(aggvos)) { From e71aaf151123e4391a22474482d2bc89673c5e61 Mon Sep 17 00:00:00 2001 From: mzr Date: Tue, 28 Oct 2025 19:41:38 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E7=89=A9=E6=96=99=E6=8E=A8=E8=89=BE?= =?UTF-8?q?=E6=99=AEMES=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mes/epic/MaterialToEpicMesPlugin.java | 13 +++ .../listener/MaterialToEpicMesListener.java | 95 ++++++++++++++++++- 2 files changed, 104 insertions(+), 4 deletions(-) diff --git a/uapbd/src/private/nc/bs/uapbd/task/mes/epic/MaterialToEpicMesPlugin.java b/uapbd/src/private/nc/bs/uapbd/task/mes/epic/MaterialToEpicMesPlugin.java index 9549604a..eafa81f3 100644 --- a/uapbd/src/private/nc/bs/uapbd/task/mes/epic/MaterialToEpicMesPlugin.java +++ b/uapbd/src/private/nc/bs/uapbd/task/mes/epic/MaterialToEpicMesPlugin.java @@ -182,6 +182,19 @@ public class MaterialToEpicMesPlugin implements IBackgroundWorkPlugin { if (num > 0) { mesType = "1"; } + // 判断物料是否是虚拟件,只要有一个组织是就赋值0 + String countSql1 = "SELECT count(1)" + + " FROM bd_materialplan a" + + " LEFT JOIN org_orgs b ON a.pk_org = b.pk_org" + + " WHERE a.dr = 0 AND a.isvirtual = 'Y' " + + " AND a.pk_material = '[pkMaterial]'" + + " AND b.isbusinessunit = 'Y'" + + " AND " + inStr; + countSql1 = countSql1.replace("[pkMaterial]", pkMaterial); + Integer num1 = (Integer) new BaseDAO().executeQuery(countSql1, new ColumnProcessor()); + if (num1 > 0) { + mesType = "0"; + } return mesType; } diff --git a/uapbd/src/private/nccloud/api/uapbd/material/listener/MaterialToEpicMesListener.java b/uapbd/src/private/nccloud/api/uapbd/material/listener/MaterialToEpicMesListener.java index 1698e424..91d93c44 100644 --- a/uapbd/src/private/nccloud/api/uapbd/material/listener/MaterialToEpicMesListener.java +++ b/uapbd/src/private/nccloud/api/uapbd/material/listener/MaterialToEpicMesListener.java @@ -17,6 +17,9 @@ import nc.jdbc.framework.processor.ColumnProcessor; import nc.jdbc.framework.processor.MapProcessor; import nc.util.mmf.framework.base.MMValueCheck; import nc.vo.bd.material.MaterialVO; +import nc.vo.bd.material.plan.MaterialPlanVO; +import nc.vo.bd.material.prod.MaterialProdVO; +import nc.vo.bd.material.stock.MaterialStockVO; import nc.vo.fi.pub.SqlUtils; import nc.vo.org.OrgVO; import nc.vo.pub.BusinessException; @@ -55,12 +58,34 @@ public class MaterialToEpicMesListener implements IBusinessListener { try { if ("1002".equals(eventType) || "1004".equals(eventType) || "1061".equals(eventType) || "1071".equals(eventType) || "1069".equals(eventType)) { - useVOs = ArrayClassConvertUtil.convert(objs, MaterialVO.class); configParams = MyHelper.getConfigParams("Dldz-config", null); if (configParams.isEmpty()) { throw new BusinessException("电力电子的艾普MES接口缺少配置"); } - buildSyncData(useVOs, eventType); + List list = new ArrayList<>(); + if (objs instanceof MaterialVO[]) { + // 基本信息修改后/停用启用 + useVOs = ArrayClassConvertUtil.convert(objs, MaterialVO.class); + for (MaterialVO materialVO : useVOs) { + String pkMaterial = materialVO.getPk_material(); + // 如果修改基本信息,判断物料所属组织中是否存在电力电子,不存在则跳过 + Integer num = MyHelper.checkIfOrg(configParams, pkMaterial, "dldzOrg"); + if (num <= 0) { + continue; + } + list.add(materialVO); + } + } else if (objs instanceof MaterialStockVO[]) { + // 库存信息修改 + processMaterialChange(objs, list); + } else if (objs instanceof MaterialPlanVO[]) { + // 计划信息修改 + processMaterialChange(objs, list); + } + if (!list.isEmpty()) { + useVOs = list.toArray(new MaterialVO[0]); + buildSyncData(useVOs, eventType); + } } else if ("1009".equals(eventType)) { // 物料可见性范围-分配后 1009 configParams = MyHelper.getConfigParams("Dldz-config", null); @@ -110,10 +135,10 @@ public class MaterialToEpicMesListener implements IBusinessListener { // 判断物料的业务单元是否是电力电子公司,不是则跳过 String pkOrg = vo.getPk_org(); String orgCode = MyHelper.transferField(OrgVO.getDefaultTableName(), OrgVO.CODE, OrgVO.PK_ORG, pkOrg); - Integer num = MyHelper.checkIfOrg(configParams, pkMaterial, "dldzOrg"); + /*Integer num = MyHelper.checkIfOrg(configParams, pkMaterial, "dldzOrg"); if (!"1009".equals(eventType) && (num <= 0)) { continue; - } + }*/ // 字段值翻译 // String pk_marbasclass = vo.getPk_marbasclass(); // String mrlTypeCOde = MyHelper.transferField(MarBasClassVO.getDefaultTableName(), MarBasClassVO.CODE, MarBasClassVO.PK_MARBASCLASS, pk_marbasclass); @@ -169,6 +194,55 @@ public class MaterialToEpicMesListener implements IBusinessListener { } } + /** + * 处理物料VO的通用方法 + */ + private void processMaterialChange(Object[] objs, List list) throws BusinessException { + HYPubBO hyPub = new HYPubBO(); + for (Object newVO : objs) { + String pk_material = getPkMaterialFromVO(newVO); + if (MMValueCheck.isEmpty(pk_material)) { + continue; + } + String pkOrg = getPkOrgFromVO(newVO); + String orgCode = MyHelper.transferField(OrgVO.getDefaultTableName(), OrgVO.CODE, OrgVO.PK_ORG, pkOrg); + // 判断各个页签修改信息是否属于电力电子 + if (MMValueCheck.isNotEmpty(pkOrg) && MyHelper.checkIfDldzOrg(orgCode, configParams)) { + continue; + } + MaterialVO materialVO = (MaterialVO) hyPub.queryByPrimaryKey(MaterialVO.class, pk_material); + list.add(materialVO); + } + } + + /** + * 从不同类型的VO中获取pk_material + */ + private String getPkMaterialFromVO(Object vo) { + if (vo instanceof MaterialStockVO newVo) { + return newVo.getPk_material(); + } else if (vo instanceof MaterialPlanVO newVo) { + return newVo.getPk_material(); + } else if (vo instanceof MaterialProdVO) { + return ((MaterialProdVO) vo).getPk_material(); + } + return null; + } + + /** + * 从不同类型的VO中获取pk_org + */ + private String getPkOrgFromVO(Object vo) { + if (vo instanceof MaterialStockVO) { + return ((MaterialStockVO) vo).getPk_org(); + } else if (vo instanceof MaterialPlanVO) { + return ((MaterialPlanVO) vo).getPk_org(); + } else if (vo instanceof MaterialProdVO) { + return ((MaterialProdVO) vo).getPk_org(); + } + return null; + } + private String getType(String eventType) { // 类型(I:新增 U:修改 D:删除) Map map = new HashMap<>(); @@ -212,6 +286,19 @@ public class MaterialToEpicMesListener implements IBusinessListener { if (num > 0) { mesType = "1"; } + // 判断物料是否是虚拟件,只要有一个组织是就赋值0 + String countSql1 = "SELECT count(1)" + + " FROM bd_materialplan a" + + " LEFT JOIN org_orgs b ON a.pk_org = b.pk_org" + + " WHERE a.dr = 0 AND a.isvirtual = 'Y' " + + " AND a.pk_material = '[pkMaterial]'" + + " AND b.isbusinessunit = 'Y'" + + " AND " + inStr; + countSql1 = countSql1.replace("[pkMaterial]", pkMaterial); + Integer num1 = (Integer) new BaseDAO().executeQuery(countSql1, new ColumnProcessor()); + if (num1 > 0) { + mesType = "0"; + } return mesType; } From 7c09815b561552ca798c06f45ae0c072a495663d Mon Sep 17 00:00:00 2001 From: mzr Date: Tue, 28 Oct 2025 20:00:12 +0800 Subject: [PATCH 3/6] =?UTF-8?q?fix(ic):=E4=BF=AE=E5=A4=8D=E5=90=AF?= =?UTF-8?q?=E6=BA=90=E9=A2=86=E6=96=99=E6=8E=A5=E5=8F=A3=E7=A9=BA=E6=8C=87?= =?UTF-8?q?=E9=92=88=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/impl/ic/m4d/APIMaterialOutMaintainImpl.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 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 085873a4..c49b393c 100644 --- a/ic/src/private/nccloud/api/impl/ic/m4d/APIMaterialOutMaintainImpl.java +++ b/ic/src/private/nccloud/api/impl/ic/m4d/APIMaterialOutMaintainImpl.java @@ -495,8 +495,11 @@ public class APIMaterialOutMaintainImpl implements IAPIMaterialOutMaintain { for (AggPickmVO newPickmVO : newPickmVOS) { PickmItemVO[] pickmItemVOS = (PickmItemVO[]) newPickmVO.getChildren(PickmItemVO.class); for (PickmItemVO pickmItemVO : pickmItemVOS) { - Double nbsetpartsnum = pickmItemVO.getNbsetpartsnum().toDouble(); - sum += nbsetpartsnum; + UFDouble nbsetpartsnum1 = pickmItemVO.getNbsetpartsnum(); + if (nbsetpartsnum1 != null) { + Double nbsetpartsnum = nbsetpartsnum1.toDouble(); + sum += nbsetpartsnum; + } } } } From 8180857112fc2930747acbebea1f825c0c77728b Mon Sep 17 00:00:00 2001 From: mzr Date: Wed, 29 Oct 2025 13:50:33 +0800 Subject: [PATCH 4/6] =?UTF-8?q?feat(ic):=20=E7=B2=BE=E5=AF=86-=E6=9D=90?= =?UTF-8?q?=E6=96=99=E5=87=BA=E5=BA=93=E6=96=B0=E5=A2=9E--=E6=89=B9?= =?UTF-8?q?=E6=AC=A1=E5=8F=B7=E8=B5=8B=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../private/nc/bs/ic/m4d/insert/InsertBP.java | 1 + .../insert/rule/MaterialOutBatchCodeRule.java | 129 ++++++++++++++++++ 2 files changed, 130 insertions(+) create mode 100644 ic/src/private/nc/bs/ic/m4d/insert/rule/MaterialOutBatchCodeRule.java diff --git a/ic/src/private/nc/bs/ic/m4d/insert/InsertBP.java b/ic/src/private/nc/bs/ic/m4d/insert/InsertBP.java index 0d037b81..30d4ae25 100644 --- a/ic/src/private/nc/bs/ic/m4d/insert/InsertBP.java +++ b/ic/src/private/nc/bs/ic/m4d/insert/InsertBP.java @@ -108,6 +108,7 @@ public class InsertBP implements IInsertBP, //2025年6月13日09点38分 -- 物料档案基本页签启用项目辅助属性+库存组织未启用项目,采购入库单保存时(包含接口导入)清除行项目,材料出库单保存时(包含接口导入)清除行项目 processor.addBeforeRule(new MaterialOutProjectRule()); + processor.addBeforeRule(new MaterialOutBatchCodeRule()); } @Override diff --git a/ic/src/private/nc/bs/ic/m4d/insert/rule/MaterialOutBatchCodeRule.java b/ic/src/private/nc/bs/ic/m4d/insert/rule/MaterialOutBatchCodeRule.java new file mode 100644 index 00000000..fd5ae8d5 --- /dev/null +++ b/ic/src/private/nc/bs/ic/m4d/insert/rule/MaterialOutBatchCodeRule.java @@ -0,0 +1,129 @@ +package nc.bs.ic.m4d.insert.rule; + +import nc.bs.framework.common.InvocationInfoProxy; +import nc.bs.framework.common.NCLocator; +import nc.bs.ic.pub.base.ICRule; +import nc.bs.logging.Log; +import nc.bs.trade.business.HYPubBO; +import nc.bs.uapbd.util.MyHelper; +import nc.itf.mmpac.pickm.IPickmQueryService; +import nc.itf.uap.IUAPQueryBS; +import nc.util.mmf.framework.base.MMValueCheck; +import nc.vo.bd.material.MaterialVO; +import nc.vo.ic.m4d.entity.MaterialOutBodyVO; +import nc.vo.ic.m4d.entity.MaterialOutHeadVO; +import nc.vo.ic.m4d.entity.MaterialOutVO; +import nc.vo.mmpac.pickm.entity.AggPickmVO; +import nc.vo.mmpac.pickm.entity.PickmHeadVO; +import nc.vo.org.StockOrgVO; +import nc.vo.pub.BusinessException; +import nc.vo.pubapp.pattern.exception.ExceptionUtils; +import nc.vo.pubapp.pattern.pub.SqlBuilder; +import nc.vo.scmf.ic.mbatchcode.BatchcodeVO; +import nccloud.baseapp.core.log.NCCForUAPLogger; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +/** + * 精密-材料出库新增--批次号赋值 + * + * @author mzr + * @date 2025/10/26 + */ +public class MaterialOutBatchCodeRule extends ICRule { + private static final String LOG_INFO_NAME = "jmqylog"; + private static final Log logger = Log.getInstance(LOG_INFO_NAME); + private Map configParams; + private IUAPQueryBS queryBS = null; + + public final IUAPQueryBS getQueryBS() { + if (null == queryBS) { + queryBS = NCLocator.getInstance().lookup(IUAPQueryBS.class); + } + return queryBS; + } + + @Override + public void process(MaterialOutVO[] vos) { + if (MMValueCheck.isEmpty(vos)) { + return; + } + try { + configParams = MyHelper.getConfigParams("jm-config", null); + if (configParams.isEmpty()) { + throw new BusinessException("精密的启源接口缺少配置"); + } + String configMaterialCode = configParams.get("noItemCode"); + if (configMaterialCode == null || configMaterialCode.isEmpty()) { + return; + } + HYPubBO hyPub = new HYPubBO(); + for (MaterialOutVO vo : vos) { + MaterialOutHeadVO headVO = vo.getHead(); + MaterialOutBodyVO[] bodys = vo.getBodys(); + String pk_org = (String) headVO.getAttributeValue("pk_org"); + String vtrantypecode = headVO.getVtrantypecode(); + String orgCode = MyHelper.transferField(StockOrgVO.getDefaultTableName(), StockOrgVO.CODE, StockOrgVO.PK_STOCKORG, pk_org); + if ("C038".equals(orgCode)) { + if ("4D-Cxx-58".equals(vtrantypecode)) { + IPickmQueryService service = NCLocator.getInstance().lookup(IPickmQueryService.class); + // 批次号赋值 + for (MaterialOutBodyVO body : bodys) { + // 备料计划表头主键 + String cpickmhid = body.getCpickmhid(); + String cmaterialvid = body.getCmaterialvid(); + String condition = "pk_material = '" + cmaterialvid + "'"; + String materialCode = hyPub.findColValue(MaterialVO.getDefaultTableName(), MaterialVO.CODE, condition) + ""; + if (!configMaterialCode.equals(materialCode)) { + continue; + } + if (MMValueCheck.isNotEmpty(cpickmhid)) { + AggPickmVO aggVO = service.querySingleBillByPk(cpickmhid); + if (aggVO == null) { + continue; + } + PickmHeadVO pickmHeadVO = aggVO.getParentVO(); + // 来源生产订单明细 + String vsourcemorowid = pickmHeadVO.getVsourcemorowid(); + NCCForUAPLogger.debug("来源生产订单明细:" + vsourcemorowid); + if (vsourcemorowid != null && !vsourcemorowid.isEmpty()) { + body.setVbatchcode(vsourcemorowid);// 批次号 + Map batchMap = getBatchCodeVO(cmaterialvid, vsourcemorowid); + String pkBatchcode = batchMap.get(vsourcemorowid); + body.setPk_batchcode(pkBatchcode);// 批次档案id + } + } + + } + } + } + } + } catch (BusinessException e) { + logger.error("MaterialOutBatchCodeRule-exp:" + e.getMessage(), e); + ExceptionUtils.wrappException(e); + } + } + + public Map getBatchCodeVO(String cbmaterialvid, String vbatchcode) + throws BusinessException { + Map resMap = new HashMap<>(); + SqlBuilder sb = new SqlBuilder(); + sb.append("pk_group", InvocationInfoProxy.getInstance().getGroupId()); + sb.append(" and "); + sb.append("nvl(dr,0)", 0); + sb.append(" and "); + sb.append("cmaterialvid", cbmaterialvid); + sb.append(" and "); + sb.append("vbatchcode", vbatchcode); + Collection vos = this.getQueryBS().retrieveByClause(BatchcodeVO.class, sb.toString()); + for (BatchcodeVO vo : vos) { + String pk_batchcode = vo.getPk_batchcode(); + String vbatchcode1 = vo.getVbatchcode(); + resMap.put(vbatchcode1, pk_batchcode); + } + return resMap; + } + +} From 40e84612379bcb1f191c860e593d338423f3d1be Mon Sep 17 00:00:00 2001 From: mzr Date: Wed, 29 Oct 2025 13:52:18 +0800 Subject: [PATCH 5/6] =?UTF-8?q?feat(ic):=20=E7=B2=BE=E5=AF=86-=E5=90=AF?= =?UTF-8?q?=E6=BA=90=E9=A2=86=E6=96=99-=E5=8D=95=E6=8D=AE=E6=97=A5?= =?UTF-8?q?=E6=9C=9F=E8=B5=8B=E5=80=BC=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rule/before/MaterialOutBillDateRule.java | 48 +++++++++++++------ 1 file changed, 34 insertions(+), 14 deletions(-) diff --git a/ic/src/public/nc/bs/ic/general/rule/before/MaterialOutBillDateRule.java b/ic/src/public/nc/bs/ic/general/rule/before/MaterialOutBillDateRule.java index 33cf221c..2f191c6f 100644 --- a/ic/src/public/nc/bs/ic/general/rule/before/MaterialOutBillDateRule.java +++ b/ic/src/public/nc/bs/ic/general/rule/before/MaterialOutBillDateRule.java @@ -1,8 +1,10 @@ package nc.bs.ic.general.rule.before; import nc.bs.ic.pub.base.ICRule; +import nc.bs.logging.Log; import nc.bs.uapbd.util.MyHelper; import nc.util.mmf.framework.base.MMValueCheck; +import nc.vo.ic.general.define.ICBillBodyVO; import nc.vo.ic.general.define.ICBillHeadVO; import nc.vo.ic.general.define.ICBillVO; import nc.vo.ic.m4d.entity.MaterialOutVO; @@ -11,6 +13,8 @@ import nc.vo.pub.BusinessException; import nc.vo.pub.lang.UFDate; import nc.vo.pubapp.pattern.exception.ExceptionUtils; +import java.util.Map; + /** * 精密-材料出库新增-单据日期赋值-启源领料 * @@ -18,40 +22,56 @@ import nc.vo.pubapp.pattern.exception.ExceptionUtils; * @date 2025/10/26 */ public class MaterialOutBillDateRule extends ICRule { + private static final String LOG_INFO_NAME = "jmqylog"; + private static final Log logger = Log.getInstance(LOG_INFO_NAME); + private Map configParams; + @Override public void process(E[] vos) { if (MMValueCheck.isEmpty(vos)) { return; } try { + configParams = MyHelper.getConfigParams("jm-config", null); + if (configParams.isEmpty()) { + throw new BusinessException("精密的启源接口缺少配置"); + } + String outBillDate = configParams.get("outBillDate"); for (ICBillVO vo : vos) { if (vo instanceof MaterialOutVO) { ICBillHeadVO headVO = vo.getParentVO(); + ICBillBodyVO[] bodys = vo.getBodys(); String pk_org = (String) headVO.getAttributeValue("pk_org"); String orgCode = MyHelper.transferField(StockOrgVO.getDefaultTableName(), StockOrgVO.CODE, StockOrgVO.PK_STOCKORG, pk_org); // 启源领料id String vdef9 = headVO.getVdef9(); - if ("C038".equals(orgCode) && MMValueCheck.isNotEmpty(vdef9)) { - // 启源传入的单据,单据日期增加校验 - UFDate dbilldate = headVO.getDbilldate(); - // 设置单据日期, 如果单据日期小于2025-11-02,则单据日期设置为2025-11-02 - UFDate ufDate = new UFDate("2025-11-02"); - if (dbilldate != null) { - int i = dbilldate.compareTo(ufDate); - if (i < 0) { - headVO.setDbilldate(ufDate); + if ("C038".equals(orgCode)) { + if (MMValueCheck.isNotEmpty(vdef9)) { + if (MMValueCheck.isEmpty(outBillDate) || "N".equals(outBillDate)) { + continue; } - } else { - UFDate nowDate = new UFDate(); - int i = nowDate.compareTo(ufDate); - if (i < 0) { - headVO.setDbilldate(ufDate); + // 启源传入的单据,单据日期增加校验 + UFDate dbilldate = headVO.getDbilldate(); + // 设置单据日期, 如果单据日期小于2025-11-02,则单据日期设置为2025-11-02 + UFDate ufDate = new UFDate(outBillDate); + if (dbilldate != null) { + int i = dbilldate.compareTo(ufDate); + if (i < 0) { + headVO.setDbilldate(ufDate); + } + } else { + UFDate nowDate = new UFDate(); + int i = nowDate.compareTo(ufDate); + if (i < 0) { + headVO.setDbilldate(ufDate); + } } } } } } } catch (BusinessException e) { + logger.error("MaterialOutBillDateRule-exp:" + e.getMessage(), e); ExceptionUtils.wrappException(e); } } From 59c48a011c539b9479a557f6922d83b3fc1b2204 Mon Sep 17 00:00:00 2001 From: mzr Date: Wed, 29 Oct 2025 15:17:34 +0800 Subject: [PATCH 6/6] =?UTF-8?q?WMS=E6=8F=92=E4=BB=B6=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WmsSyncAfterDeleteGeneralInListener.java | 42 +++++++++++++ .../CancelMaterialOutWmsPlugin.java | 23 +++++++ .../ml/c003/WmsSyncQcReportListener.java | 12 ++++ .../MaterialInAfterDeleteWmsPlugin.java | 20 ++++++ .../MaterialInAfterSaveWmsPlugin.java | 61 +++++++++++++++++++ .../MaterialOutAfterSaveWmsPlugin.java | 20 ++++++ .../wmssync/ml/WmsSyncMaterialListener.java | 18 ++++++ 7 files changed, 196 insertions(+) create mode 100644 ic/src/private/nccloud/wmssync/ml/m4a/WmsSyncAfterDeleteGeneralInListener.java create mode 100644 ic/src/public/nccloud/resources/ic/ic/materialout/CancelMaterialOutWmsPlugin.java create mode 100644 qc/src/private/nccloud/wmssync/ml/c003/WmsSyncQcReportListener.java create mode 100644 uapbd/src/public/nccloud/resources/ic/ic/materialin/MaterialInAfterDeleteWmsPlugin.java create mode 100644 uapbd/src/public/nccloud/resources/ic/ic/materialin/MaterialInAfterSaveWmsPlugin.java create mode 100644 uapbd/src/public/nccloud/resources/ic/ic/materialout/MaterialOutAfterSaveWmsPlugin.java create mode 100644 uapbd/src/public/nccloud/wmssync/ml/WmsSyncMaterialListener.java diff --git a/ic/src/private/nccloud/wmssync/ml/m4a/WmsSyncAfterDeleteGeneralInListener.java b/ic/src/private/nccloud/wmssync/ml/m4a/WmsSyncAfterDeleteGeneralInListener.java new file mode 100644 index 00000000..caf82aa7 --- /dev/null +++ b/ic/src/private/nccloud/wmssync/ml/m4a/WmsSyncAfterDeleteGeneralInListener.java @@ -0,0 +1,42 @@ +package nccloud.wmssync.ml.m4a; + +import nc.bs.businessevent.IBusinessEvent; +import nc.bs.businessevent.IBusinessListener; +import nc.bs.framework.common.NCLocator; +import nc.bs.ic.general.businessevent.ICGeneralCommonEvent; +import nc.bs.logging.Log; +import nc.vo.ic.m4a.entity.GeneralInHeadVO; +import nc.vo.ic.m4a.entity.GeneralInVO; +import nc.vo.org.StockOrgVO; +import nc.vo.pub.BusinessException; +import nccloud.api.uapbd.wms.utils.IWmsSyncUtils; + +import java.util.HashMap; +import java.util.Map; + +/** + * 其他入库单删除后同步WMS + * 支持的交易类型: + * - 4A-Cxx-14: 形态转换入库 -> XTRK + * - 4A-Cxx-13: 其他入库 -> QTRK + * - 4A-Cxx-12: 盘盈入库 -> ADJ + */ +public class WmsSyncAfterDeleteGeneralInListener implements IBusinessListener { + + /** + * 支持取消同步的交易类型编码映射 + * key: ERP交易类型编码, value: WMS交易类型 + */ + private static final Map SUPPORTED_TRAN_TYPES = new HashMap<>(); + + static { + SUPPORTED_TRAN_TYPES.put("4A-06", "XTRK"); // 形态转换入库 + SUPPORTED_TRAN_TYPES.put("4A-01", "QTRK"); // 其他入库 + SUPPORTED_TRAN_TYPES.put("4A-03", "ADJ"); // 盘盈入库 + } + + @Override + public void doAction(IBusinessEvent iBusinessEvent) throws BusinessException { + } + +} diff --git a/ic/src/public/nccloud/resources/ic/ic/materialout/CancelMaterialOutWmsPlugin.java b/ic/src/public/nccloud/resources/ic/ic/materialout/CancelMaterialOutWmsPlugin.java new file mode 100644 index 00000000..e6e98e6b --- /dev/null +++ b/ic/src/public/nccloud/resources/ic/ic/materialout/CancelMaterialOutWmsPlugin.java @@ -0,0 +1,23 @@ +package nccloud.resources.ic.ic.materialout; + +import nc.bs.businessevent.IBusinessEvent; +import nc.bs.businessevent.IBusinessListener; +import nc.bs.logging.Log; +import nc.vo.pub.BusinessException; +import nccloud.api.uapbd.wms.utils.WmsSyncUtils; + +// 取消材料出库单据同步到FLUX WMS +public class CancelMaterialOutWmsPlugin implements IBusinessListener { + + private static final Log log = Log.getInstance("wmslog"); + private final WmsSyncUtils wmsSyncUtils = new WmsSyncUtils(); + + @Override + public void doAction(IBusinessEvent iBusinessEvent) throws BusinessException { + try { + } catch (Exception e) { + log.error("CancelMaterialOutWmsPlugin - 处理异常: " + e.getMessage(), e); + throw new BusinessException("取消材料出库单同步时报错,报错信息:" + e.getMessage()); + } + } +} diff --git a/qc/src/private/nccloud/wmssync/ml/c003/WmsSyncQcReportListener.java b/qc/src/private/nccloud/wmssync/ml/c003/WmsSyncQcReportListener.java new file mode 100644 index 00000000..c4a2984b --- /dev/null +++ b/qc/src/private/nccloud/wmssync/ml/c003/WmsSyncQcReportListener.java @@ -0,0 +1,12 @@ +package nccloud.wmssync.ml.c003; + +import nc.bs.businessevent.IBusinessEvent; +import nc.bs.businessevent.IBusinessListener; +import nc.vo.pub.BusinessException; + +public class WmsSyncQcReportListener implements IBusinessListener { + @Override + public void doAction(IBusinessEvent iBusinessEvent) throws BusinessException { + + } +} diff --git a/uapbd/src/public/nccloud/resources/ic/ic/materialin/MaterialInAfterDeleteWmsPlugin.java b/uapbd/src/public/nccloud/resources/ic/ic/materialin/MaterialInAfterDeleteWmsPlugin.java new file mode 100644 index 00000000..95346a41 --- /dev/null +++ b/uapbd/src/public/nccloud/resources/ic/ic/materialin/MaterialInAfterDeleteWmsPlugin.java @@ -0,0 +1,20 @@ +package nccloud.resources.ic.ic.materialin; + +import nc.bs.businessevent.IBusinessEvent; +import nc.bs.businessevent.IBusinessListener; +import nc.bs.logging.Log; +import nc.vo.pub.BusinessException; +import nccloud.api.uapbd.wms.utils.WmsSyncUtils; + +/** + * 生产退料单删除后同步WMS + */ +public class MaterialInAfterDeleteWmsPlugin implements IBusinessListener { + + private static final Log log = Log.getInstance("wmslog"); + private final WmsSyncUtils wmsSyncUtils = new WmsSyncUtils(); + + @Override + public void doAction(IBusinessEvent iBusinessEvent) throws BusinessException { + } +} diff --git a/uapbd/src/public/nccloud/resources/ic/ic/materialin/MaterialInAfterSaveWmsPlugin.java b/uapbd/src/public/nccloud/resources/ic/ic/materialin/MaterialInAfterSaveWmsPlugin.java new file mode 100644 index 00000000..71950409 --- /dev/null +++ b/uapbd/src/public/nccloud/resources/ic/ic/materialin/MaterialInAfterSaveWmsPlugin.java @@ -0,0 +1,61 @@ +package nccloud.resources.ic.ic.materialin; + +import nc.bs.businessevent.BdUpdateEvent; +import nc.bs.businessevent.BusinessEvent; +import nc.bs.businessevent.IBusinessEvent; +import nc.bs.businessevent.IBusinessListener; +import nc.bs.ic.general.businessevent.ICGeneralCommonEvent; +import nc.bs.logging.Log; +import nc.vo.ic.m4d.entity.MaterialOutVO; +import nc.vo.pub.BusinessException; +import nccloud.api.uapbd.wms.utils.WmsSyncUtils; + +// 材料入库保存后同步到FLUX WMS +public class MaterialInAfterSaveWmsPlugin implements IBusinessListener { + + private static final Log log = Log.getInstance("wmslog"); + private final WmsSyncUtils wmsSyncUtils = new WmsSyncUtils(); + + @Override + public void doAction(IBusinessEvent iBusinessEvent) throws BusinessException { + try { + log.info("MaterialInAfterSaveWmsPlugin - 开始处理生产退料入库WMS同步"); + // 获取单据数据 + MaterialOutVO[] materialOutVOs = getMaterialOutVOs(iBusinessEvent); + } catch (Exception e) { + log.error("MaterialInAfterSaveWmsPlugin - 处理异常: " + e.getMessage(), e); + throw new BusinessException("材料入库单同步时报错,报错信息:" + e.getMessage()); + } + } + + /** + * 从业务事件中获取生产退料入库数据 + */ + private MaterialOutVO[] getMaterialOutVOs(IBusinessEvent event) throws BusinessException { + Object object = null; + + // 根据不同的事件类型获取单据数据 + if (event instanceof BusinessEvent businessEvent) { + object = businessEvent.getObject(); + } else if (event instanceof BdUpdateEvent updateEvent) { + object = updateEvent.getNewObject(); + } else if (event instanceof ICGeneralCommonEvent commonEvent) { + object = commonEvent.getOldObjs(); + } else { + log.warn("MaterialInAfterSaveWmsPlugin - 未支持的事件类型: " + event.getClass().getName()); + return null; + } + + if (object == null) { + return null; + } + + // 转换为MaterialOutVO数组 + if (object.getClass().isArray()) { + return (MaterialOutVO[]) object; + } else { + return new MaterialOutVO[]{(MaterialOutVO) object}; + } + } + +} diff --git a/uapbd/src/public/nccloud/resources/ic/ic/materialout/MaterialOutAfterSaveWmsPlugin.java b/uapbd/src/public/nccloud/resources/ic/ic/materialout/MaterialOutAfterSaveWmsPlugin.java new file mode 100644 index 00000000..03353134 --- /dev/null +++ b/uapbd/src/public/nccloud/resources/ic/ic/materialout/MaterialOutAfterSaveWmsPlugin.java @@ -0,0 +1,20 @@ +package nccloud.resources.ic.ic.materialout; + +import nc.bs.businessevent.IBusinessEvent; +import nc.bs.businessevent.IBusinessListener; +import nc.bs.logging.Log; +import nc.vo.pub.BusinessException; +import nccloud.api.uapbd.wms.utils.WmsSyncUtils; + +// 材料出库保存后同步到FLUX WMS +public class MaterialOutAfterSaveWmsPlugin implements IBusinessListener { + + private static final Log log = Log.getInstance("wmslog"); + private final WmsSyncUtils wmsSyncUtils = new WmsSyncUtils(); + + @Override + public void doAction(IBusinessEvent iBusinessEvent) throws BusinessException { + + } + +} diff --git a/uapbd/src/public/nccloud/wmssync/ml/WmsSyncMaterialListener.java b/uapbd/src/public/nccloud/wmssync/ml/WmsSyncMaterialListener.java new file mode 100644 index 00000000..a22e994c --- /dev/null +++ b/uapbd/src/public/nccloud/wmssync/ml/WmsSyncMaterialListener.java @@ -0,0 +1,18 @@ +package nccloud.wmssync.ml; + +import nc.bs.businessevent.IBusinessEvent; +import nc.bs.businessevent.IBusinessListener; +import nc.vo.pub.BusinessException; + +/** + * 物料同步富勒WMS + */ +public class WmsSyncMaterialListener implements IBusinessListener { + + @Override + public void doAction(IBusinessEvent iBusinessEvent) throws BusinessException { + + } + +} +