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;