diff --git a/mmpac/src/client/nccloud/web/mmpac/issue/action/IssuePrintAction.java b/mmpac/src/client/nccloud/web/mmpac/issue/action/IssuePrintAction.java new file mode 100644 index 0000000..50b6830 --- /dev/null +++ b/mmpac/src/client/nccloud/web/mmpac/issue/action/IssuePrintAction.java @@ -0,0 +1,18 @@ +package nccloud.web.mmpac.issue.action; + +import nccloud.web.platform.print.AbstractPrintAction; + +/** + * 生产领料-备料计划列表打印 + */ +public class IssuePrintAction extends AbstractPrintAction { + @Override + public String getPrintServiceModule() { + return "mmpac"; + } + + @Override + public String getPrintServiceName() { + return "nccloud.pubimpl.mmpac.issue.service.IssuePickmPrintOperator"; + } +} diff --git a/mmpac/src/client/nccloud/web/mmpac/pmo/action/PmoToPlmAction.java b/mmpac/src/client/nccloud/web/mmpac/pmo/action/PmoToPlmAction.java index 2427292..21c1d95 100644 --- a/mmpac/src/client/nccloud/web/mmpac/pmo/action/PmoToPlmAction.java +++ b/mmpac/src/client/nccloud/web/mmpac/pmo/action/PmoToPlmAction.java @@ -173,7 +173,7 @@ public class PmoToPlmAction implements ICommonAction { throw new BusinessException(result.get("msg") + ""); } else { // 调整PLM传输状态 - String updateSql = "update mm_mo set vdef13 = '是' where cpmohid = '[cpmohid]'"; + String updateSql = "update mm_mo set vdef13 = 'Y' where cpmohid = '[cpmohid]'"; updateSql = updateSql.replace("[cpmohid]", parentVO.getPrimaryKey()); getDao().executeUpdate(updateSql); resultList.add(result); diff --git a/mmpac/src/client/yyconfig/modules/mmpac/issue/config/action/action.xml b/mmpac/src/client/yyconfig/modules/mmpac/issue/config/action/action.xml new file mode 100644 index 0000000..8c800c8 --- /dev/null +++ b/mmpac/src/client/yyconfig/modules/mmpac/issue/config/action/action.xml @@ -0,0 +1,74 @@ + + + + mmpac.issue.issuepickmquery + + nccloud.web.mmpac.issue.action.IssuePickmQueryAction + + + mmpac.issue.issuereqpickmquery + + nccloud.web.mmpac.issue.action.IssueReqPickmQueryAction + + + mmpac.issue.queryIssueObtainStockAccountNum + + nccloud.web.mmpac.issue.action.IssueObtainStockAccountNumAction + + + mmpac.issue.issueDestIssueAction + + nccloud.web.mmpac.issue.action.IssueDestIssueAction + + + mmpac.issue.issueReserveMaterialAction + + nccloud.web.mmpac.issue.action.IssueReserveMaterialAction + + + mmpac.issue.issueQueryFromPickm + + nccloud.web.mmpac.issue.action.IssueQueryFromPickmAction + + + mmpac.issue.isseQueryFromReqPickm + + nccloud.web.mmpac.issue.action.IssueQueryFromReqPickmAction + + + mmpac.issue.isseQueryFromPutPlan + + nccloud.web.mmpac.issue.action.IssueQueryFromPutPlanAction + + + mmpac.issue.isseQueryFromDispatchlist + + nccloud.web.mmpac.issue.action.IssueQueryFromDispatchlistAction + + + mmpac.issue.issueQueryFromDirectTrans + + nccloud.web.mmpac.issue.action.IssueQueryFromDirectTrans + + + mmpac.issue.issueDirectTransQuery + + nccloud.web.mmpac.issue.action.IssueDirectTransQueryAction + + + mmpac.issue.issueDirectTransAction + + nccloud.web.mmpac.issue.action.IssueDirectTransAction + + + mmpac.issue.issueQueryFromPutPlanDirectTrans + + nccloud.web.mmpac.issue.action.IssueQueryFromPutPlanDirectTrans + + + mmpac.issue.checkIsNccNative + + nccloud.web.mmpac.issue.action.IssueCheckIsNccNative + + + \ No newline at end of file diff --git a/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/PMODeleteBP.java b/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/PMODeleteBP.java index 6dfe476..44a5472 100644 --- a/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/PMODeleteBP.java +++ b/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/PMODeleteBP.java @@ -5,6 +5,7 @@ package nc.bs.mmpac.pmo.pac0002.bp; +import nc.bs.mmpac.pmo.pac0002.bp.rule.AfterDelSyncEpicMesRule; import nc.bs.mmpac.pmo.pac0002.bp.rule.WithUpdatePickmRule; import nc.bs.mmpac.pmo.pac0002.pluginpoint.PMOPluginPoint; import nc.bs.mmpac.pmo.pac0002.rule.PMOATPUpdateWithParaRule; @@ -98,5 +99,6 @@ public class PMODeleteBP { IRule billcoderule = new ReturnBillCodeRule("55A2", "vbillcode", "pk_group", "pk_org"); processer.addAfterRule(billcoderule); processer.addAfterRule(new WithUpdatePickmRule()); + processer.addAfterRule(new AfterDelSyncEpicMesRule()); } } diff --git a/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/AfterApproveSyncPLMRule.java b/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/AfterApproveSyncPLMRule.java index a81b93f..ce225d9 100644 --- a/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/AfterApproveSyncPLMRule.java +++ b/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/AfterApproveSyncPLMRule.java @@ -165,7 +165,7 @@ public class AfterApproveSyncPLMRule implements IRule { throw new BusinessException(result.get("msg").toString()); } else { // 璋冩暣PLM浼犺緭鐘舵 - String updateSql = "update mm_mo set vdef13 = '鏄' where cpmohid = '[cpmohid]'"; + String updateSql = "update mm_mo set vdef13 = 'Y' where cpmohid = '[cpmohid]'"; updateSql = updateSql.replace("[cpmohid]", parentVO.getPrimaryKey()); getDao().executeUpdate(updateSql); } diff --git a/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/AfterDelSyncEpicMesRule.java b/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/AfterDelSyncEpicMesRule.java new file mode 100644 index 0000000..105459e --- /dev/null +++ b/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/AfterDelSyncEpicMesRule.java @@ -0,0 +1,158 @@ +package nc.bs.mmpac.pmo.pac0002.bp.rule; + + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.serializer.SerializerFeature; +import nc.bs.logging.Log; +import nc.bs.uapbd.util.MyHelper; +import nc.bs.uapbd.util.ThirdPartyPostRequestUtil; +import nc.impl.pubapp.pattern.rule.IRule; +import nc.util.mmf.framework.base.MMArrayUtil; +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.org.DeptVO; +import nc.vo.org.OrgVO; +import nc.vo.pub.BusinessException; +import nc.vo.pubapp.pattern.exception.ExceptionUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 流程生产订单删除后同步艾普MES + * + * @author mzr + * @date 2025/9/16 + */ +public class AfterDelSyncEpicMesRule implements IRule { + + private static final String LOG_INFO_NAME = "dldzlog"; + + private static final Log logDl = Log.getInstance(LOG_INFO_NAME); + private static final String pmoUrl = "/prj-v5-web/ext/api/workOrder"; + private Map configParams; + private Map deptParams; + + @Override + public void process(PMOAggVO[] pmoAggVOS) { + if (MMArrayUtil.isEmpty(pmoAggVOS)) { + return; + } + try { + configParams = MyHelper.getConfigParams("Dldz-config", null); + if (configParams.isEmpty()) { + // throw new BusinessException("电力电子的艾普MES接口缺少配置"); + logDl.error("电力电子的艾普MES接口缺少配置"); + return; + } + deptParams = MyHelper.getConfigParams("Dldz-dept", null); + if (deptParams.isEmpty()) { + // throw new BusinessException("电力电子的艾普MES接口缺少部门编码映射配置"); + logDl.error("电力电子的艾普MES接口缺少部门编码映射配置"); + return; + } + String deptRange = String.join(",", deptParams.keySet()); + configParams.put("deptRange", deptRange); + List filteredOrders = checkAndFilterBillSrcOrg(pmoAggVOS); + if (filteredOrders.isEmpty()) { + // logDl.error("没有符合条件的生产订单需要同步到艾普MES系统。"); + return; + } + // logDl.info("开始同步生产订单到艾普MES系统,符合条件的订单数量: " + filteredOrders.size()); + JSONArray jsonArray = new JSONArray(); + // 推送到艾普MES系统 + for (PMOAggVO aggVO : filteredOrders) { + buildSyncData(aggVO, jsonArray); + } + if (!jsonArray.isEmpty()) { + JSONObject data = new JSONObject(); + data.put("workOrders", jsonArray); + pushData(pmoUrl, data); + } + } catch (Exception e) { + logDl.error("删除同步生产订单到艾普MES系统失败: " + e.getMessage(), e); + ExceptionUtils.wrappException(e); + } + } + + + /** + * 组装数据-流程生产订单+备料计划 + */ + private void buildSyncData(PMOAggVO aggVO, JSONArray orderArr) throws BusinessException { + PMOHeadVO headVo = aggVO.getParentVO(); + // 组织 + String pkOrg = headVo.getPk_org(); + String orgCode = MyHelper.transferField(OrgVO.getDefaultTableName(), OrgVO.CODE, OrgVO.PK_ORG, pkOrg); + // 组装数据 + JSONObject orderParam = new JSONObject(); + orderParam.put("type", "D"); // 删除标识 + orderParam.put("companyCode", orgCode);// 公司编码 + orderParam.put("workOrderCode", headVo.getVbillcode());// 工单号 + orderArr.add(orderParam); + } + + + /** + * 调用MES的生产工单接口推送ERP的流程生产订单和备料计划或推送出厂编号 + * + * @param param 请求体 + * @throws BusinessException 如果发生非特定可忽略的错误 + */ + private void pushData(String reqUrl, Object param) throws BusinessException { + String responseString = null; + try { + // 转json字符串的时候保留null值 + String jsonStr = JSON.toJSONString(param, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullStringAsEmpty); + logDl.error("EpicMes-PMO-del-param = " + jsonStr); + String baseUrl = configParams.get("epicMesUrl"); + String requestUrl = baseUrl + reqUrl; + logDl.error(" EpicMes-PMO-del-url = " + requestUrl); + responseString = ThirdPartyPostRequestUtil.sendPostRequest(requestUrl, jsonStr); + logDl.error(" EpicMes-PMO-del-res = " + responseString); + + JSONObject resultObj = JSONObject.parseObject(responseString); + if (!"1".equals(resultObj.getString("flag"))) { + logDl.error("EpicMes-PMO-del-error,result[" + resultObj.toJSONString() + "]"); + throw new BusinessException("艾普MES返回错误信息:" + resultObj.getString("msg")); + } + } catch (Exception e) { + logDl.error(" 调用MES或处理响应时发生错误。原始响应: " + responseString + " 错误: " + e.getMessage(), e); + throw new BusinessException("调用艾普MES或处理响应时发生错误:" + e.getMessage(), e); + } + } + + + /** + * 检查并筛选需要同步的单据 + */ + private List checkAndFilterBillSrcOrg(PMOAggVO[] pmoAggVOS) throws BusinessException { + List aggvoList = new ArrayList<>(); + for (PMOAggVO aggVo : pmoAggVOS) { + String pkOrg = aggVo.getParentVO().getPk_org(); + String orgCode = MyHelper.transferField(OrgVO.getDefaultTableName(), OrgVO.CODE, OrgVO.PK_ORG, pkOrg); + // 检查当前组织是否为电力电子 + if (MyHelper.checkIfDldzOrg(orgCode, configParams)) { + continue; + } + // 按照部门筛选生产订单,只传消弧车间、电容车间、成套车间(部门是配置项) + PMOItemVO childrenVO = aggVo.getChildrenVO()[0]; + String cdeptid = childrenVO.getCdeptid(); + String deptCode = MyHelper.transferField(DeptVO.getDefaultTableName(), DeptVO.CODE, DeptVO.PK_DEPT, cdeptid); + // 如果部门不在范围内则跳过本次循环 + String deptRange = configParams.get("deptRange"); + if (deptCode == null || !deptRange.contains(deptCode)) { + continue; + } + aggvoList.add(aggVo); + } + + return aggvoList; + } + + +} diff --git a/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/util/SyncEpicMesUtil.java b/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/util/SyncEpicMesUtil.java index 50b7426..ee79efd 100644 --- a/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/util/SyncEpicMesUtil.java +++ b/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/util/SyncEpicMesUtil.java @@ -339,7 +339,7 @@ public class SyncEpicMesUtil { if (jsonArray.isEmpty()) { return null; } - obj.put("releaseNo", jsonArray.toString()); + obj.put("releaseNo", jsonArray); return obj; } diff --git a/mmpac/src/private/nccloud/pubimpl/mmpac/issue/service/IssuePickmPrintOperator.java b/mmpac/src/private/nccloud/pubimpl/mmpac/issue/service/IssuePickmPrintOperator.java new file mode 100644 index 0000000..5daf0d0 --- /dev/null +++ b/mmpac/src/private/nccloud/pubimpl/mmpac/issue/service/IssuePickmPrintOperator.java @@ -0,0 +1,52 @@ +package nccloud.pubimpl.mmpac.issue.service; + +import nc.impl.pubapp.pattern.data.bill.BillQuery; +import nc.vo.mmpac.reqpickm.consts.ReqPickmLangConsts; +import nc.vo.mmpac.reqpickm.entity.AggReqPickmVO; +import nc.vo.mmpac.reqpickm.entity.ReqPickmItemVO; +import nc.vo.mmpac.reqpickm.entity.ReqPickmSumVO; +import nc.vo.mmpub.util.BillBodySortUtils; +import nc.vo.pubapp.pattern.exception.ExceptionUtils; +import nccloud.pubitf.mmpub.pub.print.BaseMetaPrintService; + +import java.util.ArrayList; +import java.util.List; + +/** + * 生产领料-备料计划列表打印服务类 + */ +public class IssuePickmPrintOperator extends BaseMetaPrintService { + @Override + public Object[] getDatas(String[] ids) { + BillQuery query = new BillQuery(AggReqPickmVO.class); + String[] uniqueIds = this.removeDuplicates(ids); + AggReqPickmVO[] vos = query.query(uniqueIds); + if (null == vos || vos.length == 0) { + ExceptionUtils.wrappBusinessException(ReqPickmLangConsts.getEdit_msg()); + } + + BillBodySortUtils.sort(vos, "vrowno", ReqPickmItemVO.class); + BillBodySortUtils.sort(vos, "vrowno", ReqPickmSumVO.class); + return vos; + } + + private String[] removeDuplicates(String[] ids) { + if (null == ids) { + return new String[0]; + } else if (ids.length <= 1) { + return ids; + } else { + List uniqueIdList = new ArrayList(); + + for (int i = 0; i < ids.length; ++i) { + String id = ids[i]; + if (!uniqueIdList.contains(id)) { + uniqueIdList.add(id); + } + } + + String[] uniqueIds = (String[]) uniqueIdList.toArray(new String[0]); + return uniqueIds; + } + } +} 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 4a361de..94432cc 100644 --- a/uapbd/src/private/nccloud/api/uapbd/material/listener/MaterialToEpicMesListener.java +++ b/uapbd/src/private/nccloud/api/uapbd/material/listener/MaterialToEpicMesListener.java @@ -13,10 +13,12 @@ import nc.bs.logging.Log; import nc.bs.trade.business.HYPubBO; import nc.bs.uapbd.util.MyHelper; import nc.bs.uapbd.util.ThirdPartyPostRequestUtil; +import nc.jdbc.framework.processor.ColumnProcessor; import nc.jdbc.framework.processor.MapProcessor; import nc.vo.bd.material.MaterialVO; import nc.vo.bd.material.marbasclass.MarBasClassVO; import nc.vo.bd.material.stock.MaterialStockVO; +import nc.vo.fi.pub.SqlUtils; import nc.vo.org.OrgVO; import nc.vo.pub.BusinessException; @@ -183,11 +185,22 @@ public class MaterialToEpicMesListener implements IBusinessListener { } private String getGoodsType(String pkMaterial) throws BusinessException { + String targetCode = configParams.get("dldzOrg"); + String[] orgItem = targetCode.split(","); + String inStr = SqlUtils.getInStr("b.code", orgItem, Boolean.TRUE); // 物料-库存信息-物料类型 DR=分销补货;FR=工厂补货;MR=制造件;PR=采购件;OT=委外件;ET=其他 - // mes物料类型 制造1 其它0 + // mes物料类型 制造1 其它0(ERP多个组织中如果有一个是制造件就传1) String mesType = "0"; - String martype = MyHelper.transferField(MaterialStockVO.getDefaultTableName(), MaterialStockVO.MARTYPE, MaterialStockVO.PK_MATERIAL, pkMaterial); - if ("MR".equals(martype)) { + // String martype = MyHelper.transferField(MaterialStockVO.getDefaultTableName(), MaterialStockVO.MARTYPE, MaterialStockVO.PK_MATERIAL, pkMaterial); + String countSql = "SELECT count(1)" + + " FROM bd_materialstock a" + + " LEFT JOIN org_stockorg b ON a.pk_org = b.pk_stockorg" + + " WHERE a.dr = 0 AND a.martype = 'MR' " + + " AND a.pk_material = '[pkMaterial]'" + + " AND " + inStr; + countSql = countSql.replace("[pkMaterial]", pkMaterial); + Integer num = (Integer) new BaseDAO().executeQuery(countSql, new ColumnProcessor()); + if (num > 0) { mesType = "1"; } return mesType;