diff --git a/uapbd/src/private/nc/bs/bd/pfxx/plugin/MaterialPlanPfxxPlugin.java b/uapbd/src/private/nc/bs/bd/pfxx/plugin/MaterialPlanPfxxPlugin.java new file mode 100644 index 00000000..7140b829 --- /dev/null +++ b/uapbd/src/private/nc/bs/bd/pfxx/plugin/MaterialPlanPfxxPlugin.java @@ -0,0 +1,297 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package nc.bs.bd.pfxx.plugin; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.serializer.SerializerFeature; +import nc.bs.dao.BaseDAO; +import nc.bs.dao.DAOException; +import nc.bs.framework.common.NCLocator; +import nc.bs.logging.Log; +import nc.bs.pfxx.ISwapContext; +import nc.bs.pfxx.plugin.AbstractPfxxPlugin; +import nc.bs.trade.business.HYPubBO; +import nc.bs.trade.business.HYSuperDMO; +import nc.bs.uapbd.util.MyHelper; +import nc.bs.uapbd.util.ThirdPartyPostRequestUtil; +import nc.itf.bd.material.assign.IMaterialAssignService; +import nc.itf.bd.material.plan.IMaterialPlanQueryService; +import nc.itf.bd.material.plan.IMaterialPlanService; +import nc.jdbc.framework.processor.MapProcessor; +import nc.pubitf.uapbd.IMaterialPubService; +import nc.util.mmf.framework.base.MMValueCheck; +import nc.vo.bd.defdoc.DefdocVO; +import nc.vo.bd.errorlog.ErrLogReturnValue; +import nc.vo.bd.material.MaterialVO; +import nc.vo.bd.material.plan.MaterialPlanVO; +import nc.vo.bd.material.stock.MaterialReplVO; +import nc.vo.bd.material.stock.MaterialStockVO; +import nc.vo.pfxx.auxiliary.AggxsysregisterVO; +import nc.vo.pfxx.util.PfxxPluginUtils; +import nc.vo.pub.BusinessException; + +import java.util.*; +import java.util.stream.Stream; + +public class MaterialPlanPfxxPlugin extends AbstractPfxxPlugin { + IMaterialPlanQueryService materialplanqueryservice = null; + IMaterialPlanService materialplanservice = null; + IMaterialAssignService assignservice = null; + + private static final String LOG_INFO_NAME = "qyMesLog"; + private static final Log logger = Log.getInstance(LOG_INFO_NAME); + private static final String reqUrl = "/IF_QyErpApi.ashx?action=addwlxx"; + private Map configParams; + + public MaterialPlanPfxxPlugin() { + } + + protected Object processBill(Object vo, ISwapContext swapContext, AggxsysregisterVO aggvo) throws BusinessException { + MaterialPlanVO planvo = (MaterialPlanVO) vo; + MaterialPlanVO[] pvos = this.getMaterialPlanQueryService().queryMaterialPlanVOs(new String[]{planvo.getPk_org()}, planvo.getPk_material()); + if (pvos != null && pvos.length != 0) { + planvo = this.updateMaterialPlan(pvos, planvo); + } else { + planvo = this.insertMaterialPlan(planvo); + PfxxPluginUtils.addDocIDVsPKContrast(swapContext.getBilltype(), swapContext.getDocID(), planvo.getPrimaryKey()); + } + + return planvo.getPrimaryKey(); + } + + private MaterialPlanVO insertMaterialPlan(MaterialPlanVO planvo) throws BusinessException { + ErrLogReturnValue value = this.getService().assignByPks(new String[]{planvo.getPk_material()}, new String[]{planvo.getPk_org()}, true); + MaterialPlanVO[] pvos = this.getMaterialPlanQueryService().queryMaterialPlanVOs(new String[]{planvo.getPk_org()}, planvo.getPk_material()); + if (pvos != null && pvos.length > 0) { + planvo = this.updateMaterialPlan(pvos, planvo); + } + + return planvo; + } + + private MaterialPlanVO updateMaterialPlan(MaterialPlanVO[] pvos, MaterialPlanVO planvo) throws BusinessException { + List list = new ArrayList(); + MaterialPlanVO vo = pvos[0]; + String[] attrs = planvo.getAttributeNames(); + + for (String attr : attrs) { + if (planvo.getAttributeValue(attr) != null && !"materialrepl".equals(attr)) { + vo.setAttributeValue(attr, planvo.getAttributeValue(attr)); + } + } + + if (vo.getMaterialrepl() != null && vo.getMaterialrepl().length > 0) { + for (MaterialReplVO replvo : vo.getMaterialrepl()) { + replvo.setStatus(3); + list.add(replvo); + } + } + + if (planvo.getMaterialrepl() != null && planvo.getMaterialrepl().length > 0) { + for (MaterialReplVO replvo : planvo.getMaterialrepl()) { + replvo.setStatus(2); + list.add(replvo); + } + } + + vo.setMaterialrepl((MaterialReplVO[]) list.toArray(new MaterialReplVO[0])); + vo = this.getMaterialPlanService().updateMaterialPlanVO(vo); + syncQMS(vo); + return vo; + } + + private IMaterialPlanQueryService getMaterialPlanQueryService() { + if (this.materialplanqueryservice == null) { + this.materialplanqueryservice = (IMaterialPlanQueryService) NCLocator.getInstance().lookup(IMaterialPlanQueryService.class); + } + + return this.materialplanqueryservice; + } + + private IMaterialPlanService getMaterialPlanService() { + if (this.materialplanservice == null) { + this.materialplanservice = (IMaterialPlanService) NCLocator.getInstance().lookup(IMaterialPlanService.class); + } + + return this.materialplanservice; + } + + private IMaterialAssignService getService() { + if (this.assignservice == null) { + this.assignservice = (IMaterialAssignService) NCLocator.getInstance().lookup(IMaterialAssignService.class); + } + + return this.assignservice; + } + + private void syncQMS(MaterialPlanVO planVO) throws BusinessException { + // 修改物料计划信息的接口执行之后同步修改启源物料 + configParams = MyHelper.getConfigParams("jm-config", null); + buildSyncData(planVO); + } + + /** + * 构建同步数据 + */ + private void buildSyncData(MaterialPlanVO planVO) throws BusinessException { + String pkMaterial = planVO.getPk_material(); + String pkOrg = planVO.getPk_org(); + HYPubBO hyPub = new HYPubBO(); + MaterialVO vo = (MaterialVO) hyPub.queryByPrimaryKey(MaterialVO.class, pkMaterial); + // 判断物料的业务单元是否是精密公司,不是则跳过 + Integer num = MyHelper.checkIfOrg(configParams, pkMaterial, "jmOrg"); + if (num <= 0) { + return; + } + // 字段值翻译 + // String pk_marbasclass = vo.getPk_marbasclass(); + // String mrlTypeName = MyHelper.getStrValByCondition(MarBasClassVO.getDefaultTableName(), MarBasClassVO.NAME, + // "pk_marbasclass = '" + pk_marbasclass + "'"); + // 计量单位 + Map unitMap = getGoodsInfo(pkMaterial); + // 启源物料编码 + Map planMap = queryMaterialPlanInfoByPks(new String[]{pkMaterial}, pkOrg, + new String[]{MaterialPlanVO.DEF2}); + // 计划信息自定义项2(原系统编码)BIP传启源物料档案的物料编码,BIP中物料编码传启源自定义字段“BIP物料编码” + String qyCode = ""; + if (MMValueCheck.isNotEmpty(planMap) && + MMValueCheck.isNotEmpty(planMap.get(pkMaterial))) { + qyCode = planMap.get(pkMaterial).getDef2(); + } else { + qyCode = vo.getCode(); + } + // 1=未启用;2=已启用;3=已停用; + Integer enablestate = vo.getEnablestate(); + String statusCode = (3 == enablestate) ? "1" : "0"; + Map stockMap = MyHelper.getMapValByCondition(MaterialStockVO.getDefaultTableName(), "def3,def4,martype", + MaterialStockVO.PK_MATERIAL + " = '" + pkMaterial + "' and pk_org = '" + pkOrg + "'"); + // 制造件传启源 + if (!"MR".equals(stockMap.get("martype"))) { + return; + } + // 物料标志和产品分类字段在库存信息页签中,分配物料的时候没有默认值,需要在此处设置 + // 物料标志 + String wlbz = "产品"; + String wlbzId = stockMap.get("def3") + ""; + String defName = getDefName("zdy-jmzz001", wlbzId); + if (MMValueCheck.isNotEmpty(defName)) { + wlbz = defName; + } + // 产品分类 + String cpfl = "内配铸造件成品"; + String cpflId = stockMap.get("def4") + ""; + String defName1 = getDefName("zdy-jmzz002", cpflId); + if (MMValueCheck.isNotEmpty(defName1)) { + cpfl = defName1; + } + // 组装数据 + JSONObject singleObj = new JSONObject(); + // 批次编号,用于唯一标识当前传输的物料数据批次,便于追溯和批量处理 + long cts = System.currentTimeMillis(); + singleObj.put("batchid", cts); + JSONObject contentObj = new JSONObject(); + contentObj.put("meswlbh", qyCode); // 启源物料编码 + contentObj.put("bipwlbh", vo.getCode()); // BIP物料编码 + contentObj.put("wlmc", vo.getName()); // 物料名称 + contentObj.put("wlxhgg", vo.getMaterialtype() + vo.getMaterialspec()); // 物料型号规格 + contentObj.put("wlfl", ""); // 物料分类 + contentObj.put("cpfl", cpfl); // 产品分类 + contentObj.put("wlbz", wlbz); // 物料标志 + contentObj.put("sjjldw", unitMap.get("unitname")); // 设计计量单位 + contentObj.put("cgjldw", unitMap.get("deputy_unitname")); // 采购计量单位 + contentObj.put("zhxs", unitMap.getOrDefault("convertRate", "1.00")); // 转换系数 + contentObj.put("flag_fq", statusCode); // 1/0 传递1代表物料废弃 + contentObj.put("bz", vo.getMemo()); // 备注信息 + JSONArray contentArr = new JSONArray(); + contentArr.add(contentObj); + singleObj.put("Content", contentArr); + pushData(singleObj); + } + + /** + * 推送同步数据 + */ + private void pushData(JSONObject param) throws BusinessException { + // String jsonString = param.toJSONString(); + // 转json字符串的时候保留null值 + String jsonStr = JSON.toJSONString(param, + SerializerFeature.WriteMapNullValue, + SerializerFeature.WriteNullStringAsEmpty + ); + logger.error("QMS-Material-param = " + jsonStr); + // NCCForUAPLogger.debug("QMS-Material-param = " + jsonStr); + String baseUrl = configParams.get("qmsBaseUrl"); + String requestUrl = baseUrl + reqUrl; + logger.error("QMS-Material-url = " + requestUrl); + String result = ThirdPartyPostRequestUtil.sendPostRequest(requestUrl, jsonStr); + JSONObject resultObj = JSONObject.parseObject(result); + logger.error("QMS-Material-res = " + result); + + if (!"true".equals(resultObj.getString("success"))) { + logger.error("QMS-Material-error,result[" + resultObj.toJSONString() + "]"); + throw new BusinessException("QMS-Material-error:" + resultObj.getString("message")); + } + } + + private Map getGoodsInfo(String pkMaterial) throws BusinessException { + String sql = " select a.pk_measdoc, c.name unitname, b.pk_measdoc deputyUnit, d.name deputy_unitname, nvl(b.measrate, '1/1') measrate " + + "from bd_material a " + + "left join bd_materialconvert b on a.pk_material = b.pk_material " + + "left join bd_measdoc c on a.pk_measdoc = c.pk_measdoc " + + "left join bd_measdoc d on b.pk_measdoc = d.pk_measdoc " + + "where a.pk_material = '" + pkMaterial + "' "; + Map map = (Map) new BaseDAO().executeQuery(sql, new MapProcessor()); + map.put("convertRate", MyHelper.transferSpecialField(map.get("measrate") + "")); + return map; + } + + private boolean checkIfOrg(String code, Map configParams) throws BusinessException { + String targetCode = configParams.get("jmOrg"); + if (targetCode == null || nc.vo.am.common.util.StringUtils.isEmpty(targetCode)) { + throw new BusinessException("未配置组织参数"); + } + String[] orgItem = targetCode.split(","); + for (String orgCode : orgItem) { + if (!orgCode.isEmpty() && orgCode.equals(code)) { + return false; + } + } + return true; + } + + public Map queryMaterialPlanInfoByPks(String[] pks, String pk_stockorg, + String[] fields) throws BusinessException { + Map map = null; + List vids = Stream.of(pks).filter(Objects::nonNull).distinct().toList(); + if (vids.isEmpty()) { + map = new HashMap<>(); + } else { + map = NCLocator.getInstance().lookup(IMaterialPubService.class) + .queryMaterialPlanInfoByPks(vids.toArray(new String[0]), pk_stockorg, fields); + } + + return map; + } + + /** + * 获取自定义项信息 + */ + private String getDefName(String code, String pk_defdoc) { + String res = ""; + String strWhere = " pk_defdoclist in (select pk_defdoclist from bd_defdoclist where code='" + code + "' and dr=0 ) and dr = 0 and pk_defdoc = '" + pk_defdoc + "'"; + try { + DefdocVO[] defdocVOs = (DefdocVO[]) new HYSuperDMO().queryByWhereClause(DefdocVO.class, strWhere); + if (defdocVOs != null && defdocVOs.length > 0) { + res = defdocVOs[0].getName().trim(); + } + } catch (DAOException e) { + logger.error("gyMes-SaleOrder-error,getDefName[" + e.getMessage() + "]"); + } + return res; + } +} diff --git a/uapbd/src/private/nccloud/api/uapbd/material/listener/MaterialToJmQmsListener.java b/uapbd/src/private/nccloud/api/uapbd/material/listener/MaterialToJmQmsListener.java index af64e4b8..49354287 100644 --- a/uapbd/src/private/nccloud/api/uapbd/material/listener/MaterialToJmQmsListener.java +++ b/uapbd/src/private/nccloud/api/uapbd/material/listener/MaterialToJmQmsListener.java @@ -72,8 +72,8 @@ public class MaterialToJmQmsListener implements IBusinessListener { List list = new ArrayList<>(); // 计划信息修改 MaterialPlanVO[] planVOS = ArrayClassConvertUtil.convert(objs, MaterialPlanVO.class); - for (MaterialPlanVO stockVO : planVOS) { - String pkMaterial = stockVO.getPk_material(); + for (MaterialPlanVO planVO : planVOS) { + String pkMaterial = planVO.getPk_material(); if (MMValueCheck.isEmpty(pkMaterial)) { continue; } @@ -140,6 +140,8 @@ public class MaterialToJmQmsListener implements IBusinessListener { if (MMValueCheck.isNotEmpty(planMap) && MMValueCheck.isNotEmpty(planMap.get(pkMaterial))) { qyCode = planMap.get(pkMaterial).getDef2(); + } else { + qyCode = vo.getCode(); } // 1=未启用;2=已启用;3=已停用; Integer enablestate = vo.getEnablestate(); @@ -172,9 +174,6 @@ public class MaterialToJmQmsListener implements IBusinessListener { singleObj.put("batchid", cts); JSONObject contentObj = new JSONObject(); // 计划信息自定义项2(原系统编码)BIP传启源物料档案的物料编码,BIP中物料编码传启源自定义字段“BIP物料编码” - if (MMValueCheck.isEmpty(qyCode)) { - qyCode = vo.getCode(); - } contentObj.put("meswlbh", qyCode); // 启源物料编码 contentObj.put("bipwlbh", vo.getCode()); // BIP物料编码 contentObj.put("wlmc", vo.getName()); // 物料名称