Merge remote-tracking branch 'origin/main'

This commit is contained in:
lihao 2025-09-17 10:50:34 +08:00
commit 149d810332
9 changed files with 323 additions and 6 deletions

View File

@ -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";
}
}

View File

@ -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);

View File

@ -0,0 +1,74 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<actions>
<action>
<name>mmpac.issue.issuepickmquery</name>
<label>生产领料备料计划查询</label>
<clazz>nccloud.web.mmpac.issue.action.IssuePickmQueryAction</clazz>
</action>
<action>
<name>mmpac.issue.issuereqpickmquery</name>
<label>生产领料备料申请查询</label>
<clazz>nccloud.web.mmpac.issue.action.IssueReqPickmQueryAction</clazz>
</action>
<action>
<name>mmpac.issue.queryIssueObtainStockAccountNum</name>
<label>生产领料获取库存量</label>
<clazz>nccloud.web.mmpac.issue.action.IssueObtainStockAccountNumAction</clazz>
</action>
<action>
<name>mmpac.issue.issueDestIssueAction</name>
<label>生产领料领料</label>
<clazz>nccloud.web.mmpac.issue.action.IssueDestIssueAction</clazz>
</action>
<action>
<name>mmpac.issue.issueReserveMaterialAction</name>
<label>生产领料备料</label>
<clazz>nccloud.web.mmpac.issue.action.IssueReserveMaterialAction</clazz>
</action>
<action>
<name>mmpac.issue.issueQueryFromPickm</name>
<label>生产领料来源备料计划跳转</label>
<clazz>nccloud.web.mmpac.issue.action.IssueQueryFromPickmAction</clazz>
</action>
<action>
<name>mmpac.issue.isseQueryFromReqPickm</name>
<label>生产领料来源备料申请跳转</label>
<clazz>nccloud.web.mmpac.issue.action.IssueQueryFromReqPickmAction</clazz>
</action>
<action>
<name>mmpac.issue.isseQueryFromPutPlan</name>
<label>生产领料来源投放计划跳转</label>
<clazz>nccloud.web.mmpac.issue.action.IssueQueryFromPutPlanAction</clazz>
</action>
<action>
<name>mmpac.issue.isseQueryFromDispatchlist</name>
<label>生产领料来源工序派工单跳转</label>
<clazz>nccloud.web.mmpac.issue.action.IssueQueryFromDispatchlistAction</clazz>
</action>
<action>
<name>mmpac.issue.issueQueryFromDirectTrans</name>
<label>生产领料来源备料计划直接备料跳转</label>
<clazz>nccloud.web.mmpac.issue.action.IssueQueryFromDirectTrans</clazz>
</action>
<action>
<name>mmpac.issue.issueDirectTransQuery</name>
<label>生产领料直接备料查询</label>
<clazz>nccloud.web.mmpac.issue.action.IssueDirectTransQueryAction</clazz>
</action>
<action>
<name>mmpac.issue.issueDirectTransAction</name>
<label>生产领料直接备料处理</label>
<clazz>nccloud.web.mmpac.issue.action.IssueDirectTransAction</clazz>
</action>
<action>
<name>mmpac.issue.issueQueryFromPutPlanDirectTrans</name>
<label>生产领料来源投放计划直接备料跳转</label>
<clazz>nccloud.web.mmpac.issue.action.IssueQueryFromPutPlanDirectTrans</clazz>
</action>
<action>
<name>mmpac.issue.checkIsNccNative</name>
<label>生产领料下游单据按钮查看是否为云原生环境</label>
<clazz>nccloud.web.mmpac.issue.action.IssueCheckIsNccNative</clazz>
</action>
</actions>

View File

@ -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<PMOAggVO> billcoderule = new ReturnBillCodeRule("55A2", "vbillcode", "pk_group", "pk_org");
processer.addAfterRule(billcoderule);
processer.addAfterRule(new WithUpdatePickmRule());
processer.addAfterRule(new AfterDelSyncEpicMesRule());
}
}

View File

@ -165,7 +165,7 @@ public class AfterApproveSyncPLMRule implements IRule<PMOAggVO> {
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);
}

View File

@ -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<PMOAggVO> {
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<String, String> configParams;
private Map<String, String> 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<PMOAggVO> 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<PMOAggVO> checkAndFilterBillSrcOrg(PMOAggVO[] pmoAggVOS) throws BusinessException {
List<PMOAggVO> 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;
}
}

View File

@ -339,7 +339,7 @@ public class SyncEpicMesUtil {
if (jsonArray.isEmpty()) {
return null;
}
obj.put("releaseNo", jsonArray.toString());
obj.put("releaseNo", jsonArray);
return obj;
}

View File

@ -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<AggReqPickmVO> 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<String> 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;
}
}
}

View File

@ -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;