diff --git a/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/PMOApproveBP.java b/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/PMOApproveBP.java index 55cdd1d..1fc773f 100644 --- a/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/PMOApproveBP.java +++ b/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/PMOApproveBP.java @@ -1,9 +1,6 @@ package nc.bs.mmpac.pmo.pac0002.bp; -import nc.bs.mmpac.pmo.pac0002.bp.rule.AfterApproveRuleSyncMes; -import nc.bs.mmpac.pmo.pac0002.bp.rule.AfterApproveSyncEpicMesRule; -import nc.bs.mmpac.pmo.pac0002.bp.rule.AfterApprovingSynchronizeRuleRZ; -import nc.bs.mmpac.pmo.pac0002.bp.rule.AfterUnApproveSyncEpicMesRule; +import nc.bs.mmpac.pmo.pac0002.bp.rule.*; import nc.bs.mmpac.pmo.pac0002.pluginpoint.PMOPluginPoint; import nc.bs.mmpac.pmo.pac0002.rule.*; import nc.bs.mmpac.pmo.pac0002.rule.check.*; @@ -59,6 +56,9 @@ public class PMOApproveBP { // 审批后推送流程生产订单到艾普MES processer.addAfterRule(new AfterApproveSyncEpicMesRule()); + // 审批后推送流程生产订单到艾普MES + processer.addAfterRule(new AfterApproveSyncPLMRule()); + } public PMOAggVO[] approveCancel(PMOAggVO[] fullBills, PMOAggVO[] originBills) { 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 new file mode 100644 index 0000000..c52cad4 --- /dev/null +++ b/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/AfterApproveSyncPLMRule.java @@ -0,0 +1,258 @@ +package nc.bs.mmpac.pmo.pac0002.bp.rule; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.fasterxml.jackson.databind.ObjectMapper; +import nc.bs.dao.BaseDAO; +import nc.bs.dao.DAOException; +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.impl.pubapp.pattern.rule.IRule; +import nc.jdbc.framework.processor.MapProcessor; +import nc.uif.pub.exception.UifException; +import nc.vo.bd.defdoc.DefdocVO; +import nc.vo.cmp.util.StringUtils; +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.OrgVO; +import nc.vo.pub.BusinessException; +import nc.vo.pubapp.pattern.exception.ExceptionUtils; +import nc.vo.scmpub.util.ArrayUtil; +import nc.vo.util.CloneUtil; +import org.apache.http.client.config.CookieSpecs; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; +import org.apache.http.util.EntityUtils; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * BIP 绯荤粺灏嗙敓浜ц鍗曠被鍨嬩负鈥滃唴閰嶈鍗 鈥濈殑鐢熶骇璁㈠崟鎸夌収鐗╂枡缂栫爜+椤圭洰鍙峰悜PLM 浼犻掕璁′换鍔★紝 PLM 鏂规帴鏀跺悗鏍规嵁椤圭洰鍙凤紝涓庢垚濂椾骇鍝佽璁′换鍔℃寕杞藉埌鐩稿悓浣嶇疆銆 + */ +public class AfterApproveSyncPLMRule implements IRule { + + private static final String LOG_INFO_NAME = "dldzlog"; + + private static final Log logDl = Log.getInstance(LOG_INFO_NAME); + + private String plmBaseUrl = ""; + private String plmUser = ""; + private String token = ""; + private static final String tokenUrl = "/sipmweb/api/oauth"; + // 鐢熶骇璁㈠崟鎸夌収鐗╂枡缂栫爜+椤圭洰鍙峰悜PLM 浼犻掕璁′换鍔 + private String pmourl = "/sipmweb/api/bip/createProduct"; + + + private Map configParams; + @Override + public void process(PMOAggVO[] pmoAggVOS) { + if (ArrayUtil.isEmpty(pmoAggVOS)) { + return; + } + try { + configParams= getConfigParams("Dldz-config"); + PMOAggVO[] cloneOrderVOS = (PMOAggVO[]) CloneUtil.deepClone(pmoAggVOS); + // 妫鏌ュ苟绛涢夌敓浜ц鍗 + List filteredOrders = checkAndFilterBillSrcOrg(cloneOrderVOS); + if (filteredOrders.isEmpty()) { + return; + } + + // 鎺ㄩ佸埌閿愬埗绯荤粺 + pushToRZMOM(filteredOrders); + } catch (Exception e) { + logDl.error("鍚屾鐢熶骇璁㈠崟鍒癛Z绯荤粺澶辫触: " + e.getMessage()); + ExceptionUtils.wrappException(e); + } + } + + private void pushToRZMOM(List array) throws BusinessException, IOException { + List> resultList = new ArrayList<>(); + if (array == null || array.size() == 0) { + return; + } + + for (PMOAggVO vo : array) { + // 姣忎釜 PMOAggVO 瀵瑰簲涓涓 Map 瀵硅薄 + Map request = new HashMap<>(); + + // 鑾峰彇鐖 VO锛堝亣璁惧ぇ閮ㄥ垎瀛楁鍦 ParentVO 涓級 + PMOHeadVO parentVO = vo.getParentVO(); + // 鑾峰彇瀛 VO锛堝亣璁鹃儴鍒嗚嚜瀹氫箟瀛楁鍦 ChildVO 鎴栬〃浣 VO 涓級 + PMOItemVO[] childVO = vo.getChildrenVO(); // 鎴栧叾浠栧瓙 VO 濡 getBodyVO() + for (PMOItemVO itemVO : childVO) { + // 1. 浜у搧鍝佸彿 (cmaterialvid -> 鐗╂枡缂栫爜) + if (itemVO != null) { +// NO 浜у搧鍝佸彿 cmaterialvid 鐗╂枡缂栫爜 +// NAME 浜у搧鍚嶇О name 鐗╂枡鍚嶇О +// ASUSER34 椤圭洰鍚嶇О project_name 椤圭洰鍚嶇О +// ASUSER28 鐢熶骇璁″垝鍙 vsrccode 鏉ユ簮鍗曟嵁鍙 閿鍞鍗曞彿 +// AB012 鏁伴噺 nastnum 鏁伴噺 +// GSDM 鍏徃浠g爜 +// MATERIALSISSUEDATE 涓绘潗涓嬪彂鏃堕棿 vdef17 涓绘潗涓嬪彂鏃堕棿 +// MAINASSISTMATERIALSDATE 涓昏緟鏉愪笅鍙戞椂闂 vdef19 涓昏緟鏉愪笅鍙戞椂闂 +// ASSISTMATERIALSDATE 杈呮潗涓嬪彂鏃堕棿 vdef18 杈呮潗涓嬪彂鏃堕棿 +// DRAWINGPICKINGDATE 鍥剧焊涓嬪彂鏃堕棿 琛ㄤ綋鑷畾涔夐」 鍥剧焊涓嬪彂鏃堕棿 + HYPubBO hybo = new HYPubBO(); + Object no = hybo.findColValue("bd_material", "code", "pk_material = '"+itemVO.getCmaterialvid()+"' "); + + Object name = hybo.findColValue("bd_material", "name", "pk_material = '"+itemVO.getCmaterialvid()+"' "); + Object pk_project = hybo.findColValue("bd_project", "project_name", " pk_project = '" + itemVO.getCprojectid() + "' "); + + Object GSDM = hybo.findColValue("org_factory", "code", " pk_factory = '" + parentVO.getPk_org() + "' "); + + request.put("no",no); + + request.put("name",name); + + request.put("ASUSER34", pk_project); + + request.put("ASUSER28", itemVO.getVsrccode()); + request.put("AB012", itemVO.getNastnum()); + + request.put("GSDM", GSDM); + request.put("MATERIALSISSUEDATE", itemVO.getVdef17()); + request.put("MAINASSISTMATERIALSDATE", itemVO.getVdef18()); + request.put("ASSISTMATERIALSDATE", itemVO.getVdef19()); + request.put("DRAWINGPICKINGDATE", itemVO.getVdef20()); // 鏇挎崲涓哄疄闄呭瓧娈靛悕锛屽 getVdef20() + // 灏嗙粍瑁呭ソ鐨 Map 娣诲姞鍒扮粨鏋滃垪琛 + resultList.add(request); + } + + + } + // 鍒涘缓 Jackson 鏍稿績瀵硅薄 + ObjectMapper objectMapper = new ObjectMapper(); + + // 杞崲涓 JSON 鏁扮粍瀛楃涓诧紙鏈川鏄 JSONArray 鏍煎紡锛 + String jsonArrayStr = objectMapper.writeValueAsString(resultList); + // 鑾峰彇PLM鐨勫弬鏁 + Map configParams = getConfigParams("Dldz-config"); + if (configParams == null || configParams.isEmpty()) { + throw new BusinessException("鏈厤缃甈LM鍙傛暟"); + } + plmBaseUrl = configParams.get("plmBaseUrl"); + plmUser = configParams.get("plmUser"); + token = getToken(); + this.doPost(plmBaseUrl+pmourl,jsonArrayStr); + + } + + } + + private List checkAndFilterBillSrcOrg(PMOAggVO[] cloneOrderVOS) throws BusinessException, IOException { + List filteredOrders = new ArrayList(); + + for (PMOAggVO pmoAggVO : cloneOrderVOS) { + ; + String pkOrg = pmoAggVO.getParentVO().getPk_org(); + String orgCode = MyHelper.transferField(OrgVO.getDefaultTableName(), OrgVO.CODE, OrgVO.PK_ORG, pkOrg); + // 妫鏌ュ綋鍓嶇粍缁囨槸鍚︿负鐢靛姏鐢靛瓙 + if (MyHelper.checkIfDldzOrg(orgCode, configParams)) { + continue; + } + if(pmoAggVO.getParentVO().getVtrantypecode().equals("55A2-Cxx-08")){ + filteredOrders.add(pmoAggVO); + } + } + + + return filteredOrders; + } + public Map getConfigParams(String code) { + Map map = new HashMap<>(); + String strWhere = " pk_defdoclist in (select pk_defdoclist from bd_defdoclist where code='[code]' and dr=0 ) and dr=0"; + strWhere = strWhere.replace("[code]", code); + try { + DefdocVO[] defdocVOs = (DefdocVO[]) new HYSuperDMO().queryByWhereClause(DefdocVO.class, strWhere); + if (defdocVOs != null) { + for (DefdocVO defdocVO : defdocVOs) { + String value = StringUtils.isEmpty(defdocVO.getMemo()) ? defdocVO.getName() : defdocVO.getMemo(); + map.put(defdocVO.getCode().trim(), value); + } + } + } catch (DAOException e) { + logDl.error("Failed to get config parameters for code: " + code, e); + } + return map; + } + private String doPost(String requestUrl, String param) throws IOException { + PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(); + cm.setMaxTotal(500); + cm.setDefaultMaxPerRoute(50); + + RequestConfig globalConfig = RequestConfig.custom().setConnectionRequestTimeout(5000) // 杩炴帴姹犺幏鍙栬繛鎺ヨ秴鏃 + .setConnectTimeout(5000) // 杩炴帴寤虹珛瓒呮椂 + .setSocketTimeout(20000) // 绛夊緟鍝嶅簲瓒呮椂 + .setCookieSpec(CookieSpecs.IGNORE_COOKIES).build(); + + CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm) + .setDefaultRequestConfig(globalConfig).build(); + HttpPost post = new HttpPost(requestUrl); + post.setHeader("Content-Type", "application/json;charset=UTF-8"); + post.setEntity(new StringEntity(param, "utf-8")); + String responseString = httpClient.execute(post, response -> EntityUtils.toString(response.getEntity())); + return responseString; + + } + + + + + /** + * 鑾峰彇token + */ + private String getToken() throws IOException, BusinessException { + Map tokenMap = new HashMap<>(); + tokenMap.put("uname", plmUser); + tokenMap.put("f", "true"); + String tokenStr = doGet(plmBaseUrl + tokenUrl, tokenMap); + logDl.error("GetPlmFileUtil-getToken-tokenStr = " + tokenStr); + JSONObject jsonObject = JSONObject.parseObject(tokenStr); + String token = jsonObject.getString("errmsg"); + if (token == null || token.isEmpty()) { + throw new BusinessException("PLM閴存潈澶辫触"); + } + return token; + } + private String doGet(String requestUrl, Map paramMap) throws IOException { + PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(); + cm.setMaxTotal(5000); + cm.setDefaultMaxPerRoute(500); + + RequestConfig globalConfig = RequestConfig.custom().setConnectionRequestTimeout(50000) // 杩炴帴姹犺幏鍙栬繛鎺ヨ秴鏃 + .setConnectTimeout(50000) // 杩炴帴寤虹珛瓒呮椂 + .setSocketTimeout(200000) // 绛夊緟鍝嶅簲瓒呮椂 + .setCookieSpec(CookieSpecs.IGNORE_COOKIES).build(); + + CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm) + .setDefaultRequestConfig(globalConfig).build(); + StringBuilder param = new StringBuilder("?"); + if (paramMap != null) { + for (Map.Entry entry : paramMap.entrySet()) { + param.append(entry.getKey()); + param.append("="); + param.append(entry.getValue()); + param.append("&"); + } + param.deleteCharAt(param.length() - 1); + } + String url = requestUrl + param; + HttpGet get = new HttpGet(url); + String responseString = httpClient.execute(get, response -> EntityUtils.toString(response.getEntity())); + get.releaseConnection(); + return responseString; + } +}