From 976c693b6dc088194dae5c30c89516e4ce3501ca Mon Sep 17 00:00:00 2001 From: mzr Date: Fri, 1 Aug 2025 18:06:57 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E8=8E=B7=E5=8F=96PLM=E5=9B=BE=E7=BA=B8?= =?UTF-8?q?=E7=9A=84=E5=B7=A5=E5=85=B7=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nc/bs/uapbd/util/GetPlmFileUtil.java | 192 ++++++++++++++++++ 1 file changed, 192 insertions(+) create mode 100644 uapbd/src/public/nc/bs/uapbd/util/GetPlmFileUtil.java diff --git a/uapbd/src/public/nc/bs/uapbd/util/GetPlmFileUtil.java b/uapbd/src/public/nc/bs/uapbd/util/GetPlmFileUtil.java new file mode 100644 index 0000000..bc6787b --- /dev/null +++ b/uapbd/src/public/nc/bs/uapbd/util/GetPlmFileUtil.java @@ -0,0 +1,192 @@ +package nc.bs.uapbd.util; + +import com.alibaba.fastjson.JSONObject; +import nc.bs.dao.DAOException; +import nc.bs.logging.Log; +import nc.bs.logging.Logger; +import nc.bs.trade.business.HYSuperDMO; +import nc.vo.bd.defdoc.DefdocVO; +import nc.vo.cmp.util.StringUtils; +import nc.vo.pub.BusinessException; +import nccloud.framework.core.io.WebFile; +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.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.HashMap; +import java.util.Map; + +/** + * 获取PLM图纸的工具类 + * + * @author mzr + * @date 2025/8/1 + */ +public class GetPlmFileUtil { + private static final String LOG_INFO_NAME = "dldzlog"; + private static final Log logger = Log.getInstance(LOG_INFO_NAME); + private String plmBaseUrl = ""; + private String plmUser = ""; + private static final String tokenUrl = "/sipmweb/api/oauth"; + // 根据物料编码获取零部件ID + private String materialIdUrl = "/sipmweb/api/{rid}/search/{t}?key={key}&start={start}&size={size}"; + // 根据零部件ID获取二维图档ID及信息 + private String materialFileIdUrl = "/sipmweb/api/{rid}/relation/{t}/{id}/data?re={re}&start={start}&item={item}"; + // 下载文件 + private String downlownUrl = "/sipmweb/web/download?rid={rid}&id={id}&t={t}&type={type}"; + + public WebFile getPlmFile(String materialCode) { + try { + // 获取PLM的参数 + Map configParams = getConfigParams("Dldz-config"); + if (configParams == null || configParams.isEmpty()) { + throw new BusinessException("未配置PLM参数"); + } + plmBaseUrl = configParams.get("plmBaseUrl"); + plmUser = configParams.get("plmUser"); + // 获取token + String token = getToken(); + String materialId = getMaterialId(token, materialCode); + String fileId = getFileId(token, materialId); + downloadFile(token, fileId); + } catch (BusinessException | IOException e) { + logger.error("GetPlmFileUtil-getFile-exp:" + e.getMessage()); + throw new RuntimeException(e); + } + WebFile file = null; + return file; + } + + + /** + * 获取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); + logger.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; + } + + /** + * 根据物料编码获取零部件ID + */ + private String getMaterialId(String token, String materialCode) throws IOException, BusinessException { + String fileUrl = plmBaseUrl + materialIdUrl; + fileUrl = fileUrl.replace("{rid}", token); + // 对象表名 MPART(零部件) + fileUrl = fileUrl.replace("{t}", "MPART"); + Map map = new HashMap<>(); + map.put("key", materialCode);// 搜索关键字 + map.put("start", "0");// 偏移量 + map.put("size", "10");// 数量 + String result = doGet(fileUrl, map); + logger.error("GetPlmFileUtil-getMaterialId-result = " + result); + JSONObject jsonObject = JSONObject.parseObject(result); + String objId = jsonObject.getString("objId"); + if (objId == null || objId.isEmpty()) { + throw new BusinessException("获取PLM物料id失败"); + } + return objId; + } + + /** + * 根据零部件ID获取文件ID + */ + private String getFileId(String token, String materialId) throws IOException, BusinessException { + String fileUrl = plmBaseUrl + materialFileIdUrl; + fileUrl = fileUrl.replace("{rid}", token); + // 对象表名 MPART(零部件) + fileUrl = fileUrl.replace("{t}", "MPART"); + // 对象id + fileUrl = fileUrl.replace("{id}", materialId); + Map map = new HashMap<>(); + map.put("re", "MPART_SIPM1");// 关系ID 二维图档:MPART_SIPM1 + map.put("start", "0");// 偏移量 + map.put("item", "SIPM1");// 关联对象表名 + String result = doGet(fileUrl, map); + logger.error("GetPlmFileUtil-getFileId-result = " + result); + JSONObject jsonObject = JSONObject.parseObject(result); + String objId = jsonObject.getString("objId"); + if (objId == null || objId.isEmpty()) { + throw new BusinessException("获取PLM物料的文件id失败"); + } + return objId; + } + + /** + * 调用PLM的下载文件接口 + */ + private String downloadFile(String token, String fileId) throws IOException, BusinessException { + String fileUrl = plmBaseUrl + downlownUrl; + Map map = new HashMap<>(); + map.put("rid", token); + map.put("id", fileId);// 对象id + map.put("t", "SIPM1");// 对象表名 + map.put("type", "D");// 文件类别(BD,D)(D是文件本身的文件,BD是PDF图) + String result = doGet(fileUrl, map); + logger.error("GetPlmFileUtil-getFileId-result = " + result); + + return result; + } + + 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) { + Logger.error("getConfigParams-exp:" + e.getMessage()); + } + return map; + } + + + 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; + } +} From 865f7d0a7bdde7446e9a55b971a70141f812f436 Mon Sep 17 00:00:00 2001 From: mzr <1562242162@qq.com> Date: Sat, 2 Aug 2025 13:12:50 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E8=8E=B7=E5=8F=96PLM=E5=9B=BE=E7=BA=B8?= =?UTF-8?q?=E7=9A=84=E5=B7=A5=E5=85=B7=E7=B1=BB-v0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nc/bs/uapbd/util/GetPlmFileUtil.java | 156 +++++++++++++++--- 1 file changed, 129 insertions(+), 27 deletions(-) diff --git a/uapbd/src/public/nc/bs/uapbd/util/GetPlmFileUtil.java b/uapbd/src/public/nc/bs/uapbd/util/GetPlmFileUtil.java index bc6787b..53be1cc 100644 --- a/uapbd/src/public/nc/bs/uapbd/util/GetPlmFileUtil.java +++ b/uapbd/src/public/nc/bs/uapbd/util/GetPlmFileUtil.java @@ -17,9 +17,18 @@ import org.apache.http.impl.client.HttpClients; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.apache.http.util.EntityUtils; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.text.SimpleDateFormat; +import java.util.Base64; +import java.util.Date; import java.util.HashMap; import java.util.Map; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; /** * 获取PLM图纸的工具类 @@ -32,6 +41,7 @@ public class GetPlmFileUtil { private static final Log logger = Log.getInstance(LOG_INFO_NAME); private String plmBaseUrl = ""; private String plmUser = ""; + private String token = ""; private static final String tokenUrl = "/sipmweb/api/oauth"; // 根据物料编码获取零部件ID private String materialIdUrl = "/sipmweb/api/{rid}/search/{t}?key={key}&start={start}&size={size}"; @@ -40,28 +50,57 @@ public class GetPlmFileUtil { // 下载文件 private String downlownUrl = "/sipmweb/web/download?rid={rid}&id={id}&t={t}&type={type}"; - public WebFile getPlmFile(String materialCode) { - try { - // 获取PLM的参数 - Map configParams = getConfigParams("Dldz-config"); - if (configParams == null || configParams.isEmpty()) { - throw new BusinessException("未配置PLM参数"); - } - plmBaseUrl = configParams.get("plmBaseUrl"); - plmUser = configParams.get("plmUser"); - // 获取token - String token = getToken(); - String materialId = getMaterialId(token, materialCode); - String fileId = getFileId(token, materialId); - downloadFile(token, fileId); - } catch (BusinessException | IOException e) { - logger.error("GetPlmFileUtil-getFile-exp:" + e.getMessage()); - throw new RuntimeException(e); - } + public WebFile getPlmFiles(String[] materialCodeArr) throws BusinessException, IOException { WebFile file = null; + if (materialCodeArr == null || materialCodeArr.length == 0) { + return file; + } + // 获取PLM的参数 + Map configParams = getConfigParams("Dldz-config"); + if (configParams == null || configParams.isEmpty()) { + throw new BusinessException("未配置PLM参数"); + } + plmBaseUrl = configParams.get("plmBaseUrl"); + plmUser = configParams.get("plmUser"); + token = getToken(); + if (materialCodeArr.length == 1) { + String materialCode = materialCodeArr[0]; + JSONObject plmFileJson = this.getPlmFile(materialCode); + String objId = plmFileJson.getString("objId"); + String fname = plmFileJson.getString("fname"); + InputStream ins = this.doDownloadPlmFile(objId); + file = new WebFile(fname, ins); + } else { + // 创建内存中的 ZIP 输出流 + ByteArrayOutputStream zipOut = new ByteArrayOutputStream(); + ZipOutputStream zipStream = new ZipOutputStream(zipOut); + for (String materialCode : materialCodeArr) { + JSONObject plmFileJson = this.getPlmFile(materialCode); + String objId = plmFileJson.getString("objId"); + String fname = plmFileJson.getString("fname"); + InputStream ins = this.doDownloadPlmFile(objId); + byte[] bytes = parseFileStream(ins); + zipStream.putNextEntry(new ZipEntry(fname)); + zipStream.write(bytes); + zipStream.closeEntry(); + } + zipStream.finish(); + zipStream.close(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss"); + String zipName = "物料图纸下载_" + sdf.format(new Date()); + // 构造 WebFile 返回 ZIP 文件 + InputStream ins = new ByteArrayInputStream(zipOut.toByteArray()); + file = new WebFile(zipName + ".zip", ins); + } + return file; } + public JSONObject getPlmFile(String materialCode) throws BusinessException, IOException { + String materialId = getMaterialId(materialCode); + return getFileId(materialId); + } + /** * 获取token @@ -83,7 +122,7 @@ public class GetPlmFileUtil { /** * 根据物料编码获取零部件ID */ - private String getMaterialId(String token, String materialCode) throws IOException, BusinessException { + private String getMaterialId(String materialCode) throws IOException, BusinessException { String fileUrl = plmBaseUrl + materialIdUrl; fileUrl = fileUrl.replace("{rid}", token); // 对象表名 MPART(零部件) @@ -105,7 +144,7 @@ public class GetPlmFileUtil { /** * 根据零部件ID获取文件ID */ - private String getFileId(String token, String materialId) throws IOException, BusinessException { + private JSONObject getFileId(String materialId) throws IOException, BusinessException { String fileUrl = plmBaseUrl + materialFileIdUrl; fileUrl = fileUrl.replace("{rid}", token); // 对象表名 MPART(零部件) @@ -121,25 +160,22 @@ public class GetPlmFileUtil { JSONObject jsonObject = JSONObject.parseObject(result); String objId = jsonObject.getString("objId"); if (objId == null || objId.isEmpty()) { - throw new BusinessException("获取PLM物料的文件id失败"); + throw new BusinessException("获取PLM物料的文件信息失败"); } - return objId; + return jsonObject; } /** * 调用PLM的下载文件接口 */ - private String downloadFile(String token, String fileId) throws IOException, BusinessException { + private InputStream doDownloadPlmFile(String fileId) throws IOException, BusinessException { String fileUrl = plmBaseUrl + downlownUrl; Map map = new HashMap<>(); map.put("rid", token); map.put("id", fileId);// 对象id map.put("t", "SIPM1");// 对象表名 map.put("type", "D");// 文件类别(BD,D)(D是文件本身的文件,BD是PDF图) - String result = doGet(fileUrl, map); - logger.error("GetPlmFileUtil-getFileId-result = " + result); - - return result; + return getFileFromPlm(fileUrl, map); } public Map getConfigParams(String code) { @@ -189,4 +225,70 @@ public class GetPlmFileUtil { get.releaseConnection(); return responseString; } + + /** + * 调用第三方文件接口并接收文件流 + * + * @param requestUrl 文件接口URL + * @return 文件流 + */ + private InputStream getFileFromPlm(String requestUrl, Map paramMap) 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(); + 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 httpGet = new HttpGet(url); + + // 执行请求并返回文件流 + return httpClient.execute(httpGet, response -> { + // 检查响应状态 + int statusCode = response.getStatusLine().getStatusCode(); + if (statusCode >= 200 && statusCode < 300) { + return response.getEntity().getContent(); + } else { + throw new IOException("HTTP request failed with status code: " + statusCode); + } + }); + } + + /** + * 解析文件流 + * + * @param inputStream 文件流 + * @return 解析结果 + */ + private byte[] parseFileStream(InputStream inputStream) throws IOException { + ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + int nRead; + byte[] data = new byte[1024]; + while ((nRead = inputStream.read(data, 0, data.length)) != -1) { + buffer.write(data, 0, nRead); + } + byte[] byteArray = buffer.toByteArray(); + buffer.close(); + return byteArray; + } + } From b210ccafd08b76d9d23d011ed7278fd3acb2c80a Mon Sep 17 00:00:00 2001 From: mzr <1562242162@qq.com> Date: Sun, 3 Aug 2025 09:57:47 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E5=90=88=E5=B9=B6=E5=85=B6=E5=AE=83git?= =?UTF-8?q?=E4=BB=93=E5=BA=93=E7=9A=84SaleOrderResource=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../openapi/so/m30/SaleOrderResource.java | 228 +++++++++++++++--- 1 file changed, 194 insertions(+), 34 deletions(-) diff --git a/so/src/public/nccloud/openapi/so/m30/SaleOrderResource.java b/so/src/public/nccloud/openapi/so/m30/SaleOrderResource.java index b93e24b..1f894dd 100644 --- a/so/src/public/nccloud/openapi/so/m30/SaleOrderResource.java +++ b/so/src/public/nccloud/openapi/so/m30/SaleOrderResource.java @@ -13,8 +13,10 @@ import nc.jdbc.framework.processor.MapProcessor; import nc.vo.bd.defdoc.DefdocVO; import nc.vo.pim.project.ProjectHeadVO; import nc.vo.pub.BusinessException; +import nc.vo.pub.lang.UFBoolean; import nc.vo.pub.lang.UFDateTime; import nc.vo.pubapp.AppContext; +import nc.vo.pubapp.pattern.pub.SqlBuilder; import nc.vo.so.m30.entity.SaleOrderBVO; import nc.vo.so.m30.entity.SaleOrderHVO; import nc.vo.so.m30.entity.SaleOrderVO; @@ -110,19 +112,43 @@ public class SaleOrderResource extends NCCPubRestResource { headdata.put("ccustomervid", headdata.get("ccustomerid")); String pk_group = AppContext.getInstance().getPkGroup(); headdata.put("pk_group", pk_group); + //add by hanwl 20250729 部分组织,表体结算财务组织和应收组织需要取销售业务委托关系 + //add by hanwl 20250729 根据销售组织编码去视图V_SALEORG_RELATIONS查询数据,如果有数据, + // 则取数据中的结算组织,应收组织,否则取销售组织 start + String org_code = headdata.get("pk_org_v")+""; + Map relMap = this.getSaleorgRelations(org_code); + String settleorg_code = org_code;//初始化结算组织编码为销售组织编码 + String arorg_code = org_code;//初始化应收组织编码为销售组织编码 + if(relMap!=null){ + String tempsettleorg_code = relMap.get("settleorg_code"); + if(StringUtils.isNotBlank(tempsettleorg_code)){ + settleorg_code = tempsettleorg_code; + } + String temparorg_code = relMap.get("arorg_code"); + if(StringUtils.isNotBlank(temparorg_code)){ + arorg_code = temparorg_code; + } + + } + //add by hanwl 20250729 根据销售组织编码去视图V_SALEORG_RELATIONS查询数据,如果有数据, + // 则取数据中的结算组织,应收组织,否则取销售组织 end List bodyArr = (List) map.get(BODYTABLE); for (Object body : bodyArr) { Map bodydata = (Map) body; bodydata.put("pk_group", pk_group); - bodydata.put("cprojectid", headdata.get("vdef6")); +// bodydata.put("cprojectid", headdata.get("vdef6")); // bodydata.put("ctrafficorgvid", headdata.get("pk_org_v")); bodydata.put("csendstockorgvid", headdata.get("pk_org_v")); // bodydata.put("csendstordocid", headdata.get("pk_org_v")); bodydata.put("csendstockorgid", headdata.get("pk_org_v")); - bodydata.put("carorgid", headdata.get("pk_org_v")); - bodydata.put("carorgvid", headdata.get("pk_org_v")); - bodydata.put("csettleorgid", headdata.get("pk_org_v")); - bodydata.put("csettleorgvid", headdata.get("pk_org_v")); +// bodydata.put("carorgid", headdata.get("pk_org_v")); +// bodydata.put("carorgvid", headdata.get("pk_org_v")); + bodydata.put("carorgid", arorg_code); + bodydata.put("carorgvid", arorg_code); +// bodydata.put("csettleorgid", headdata.get("pk_org_v")); +// bodydata.put("csettleorgvid", headdata.get("pk_org_v")); + bodydata.put("csettleorgid", settleorg_code); + bodydata.put("csettleorgvid", settleorg_code); bodydata.put("ctaxcountryid", "CN"); bodydata.put("crececountryid", "CN"); bodydata.put("csendcountryid", "CN"); @@ -135,21 +161,46 @@ public class SaleOrderResource extends NCCPubRestResource { SaleOrderVO[] salevos = OpenAPIParaUtil.changeVO(paramList, HEADTABLE, BODYTABLE); log.error("销售订单根据自定义项创建档案开始-----------------------"); List defdocVOS = genDef(salevos); - - for (Map map : paramList) { - BaseDAO baseDAO = new BaseDAO(); - Map headdata = (Map) map.get(HEADTABLE); - List bodyArr = (List) map.get(BODYTABLE); - for (Object body : bodyArr) { - Map bodydata = (Map) body; - String sql = " select pk_project from bd_project where project_code='" + headdata.get("vdef6") + "' and nvl(dr,0)=0 "; - String o_pk_project = (String) baseDAO.executeQuery(sql, new ColumnProcessor()); - bodydata.put("cprojectid", o_pk_project); - } - } - + List projectList = genProject(salevos); // 参数形式转换为vo并翻译 List vosList = TransferMapToVOTool.transferMapToAggVO(paramList, SaleOrderVO.class); + //根据返回的projectList先行翻译 + if(projectList!=null && projectList.size()>0){ + Map code_projectMap = new HashMap<>(); + for(ProjectHeadVO projectHeadVO : projectList){ + String code = projectHeadVO.getProject_code(); + String pkProject = projectHeadVO.getPk_project(); + log.error("销售订单保存接口:项目编号【"+code+"】,项目主键【"+pkProject+"】"); + if(code_projectMap.containsKey(code)){ + + }else{ + code_projectMap.put(code, projectHeadVO); + } + } + //翻译 + for(SaleOrderVO saleOrderVO : vosList) { + SaleOrderHVO parentVO = saleOrderVO.getParentVO(); + SaleOrderBVO[] childrenVOs = saleOrderVO.getChildrenVO(); + String vdef22 = parentVO.getVdef22(); + if(vdef22!=null && vdef22.trim().length()>0){ + ProjectHeadVO projectHeadVO = code_projectMap.get(vdef22); + if(projectHeadVO!=null){ + parentVO.setVdef22(projectHeadVO.getPk_project()); + parentVO.setVdef23(projectHeadVO.getProject_name()); + } + } + for(SaleOrderBVO bvo:childrenVOs){ + String cprojectid = bvo.getCprojectid(); + if(cprojectid!=null && cprojectid.trim().length()>0){ + ProjectHeadVO projectHeadVO = code_projectMap.get(cprojectid); + if(projectHeadVO!=null){ + bvo.setCprojectid(projectHeadVO.getPk_project()); + bvo.setVbdef10(projectHeadVO.getProject_name()); + } + } + } + } + } //根据返回的defdocVOS先行翻译 if(defdocVOS!=null && defdocVOS.size()>0){ Map> deflist_map = new HashMap<>(); @@ -245,7 +296,7 @@ public class SaleOrderResource extends NCCPubRestResource { } } - private List genDef(SaleOrderVO[] salevos) throws BusinessException { + private List genProject(SaleOrderVO[] salevos) throws BusinessException { BaseDAO baseDAO = new BaseDAO(); List allDefDoc = new ArrayList(); ArrayList arrhth = new ArrayList(); @@ -259,17 +310,82 @@ public class SaleOrderResource extends NCCPubRestResource { } String o = (String) map.get("pk_org"); - String cprocode = salevos[0].getChildrenVO()[0].getCprojectid(); - String cproname = salevos[0].getChildrenVO()[0].getVbdef10(); - if (!BFPubTools.getString_TrimAsNull(cprocode).equals("")) { - sql = " select pk_project from bd_project where project_code='" + cprocode + "' and pk_duty_org='" + o + "' and nvl(dr,0)=0 "; - String o_pk_project = (String) baseDAO.executeQuery(sql, new ColumnProcessor()); - if (o_pk_project == null) { - // 新增项目档案 - createPro(cprocode, cproname, map); + //遍历明细去重 + List result=new ArrayList<>(); + for(SaleOrderVO saleOrderVO:salevos){ + Map code_name =new HashMap<>(); + //上级项目名称 + String vdef23 = saleOrderVO.getParentVO().getVdef23(); + //上级项目编码 + String vdef22 = saleOrderVO.getParentVO().getVdef22(); + if(vdef23 !=null &&vdef23.trim().length()>0&&vdef22 !=null &&vdef22.trim().length()>0){ + code_name.put(vdef22,vdef23); + } + SaleOrderBVO[] childrenVO = saleOrderVO.getChildrenVO(); + for(SaleOrderBVO saleOrderBVO:childrenVO){ + String cprojectid = saleOrderBVO.getCprojectid(); + String vbdef10 = saleOrderBVO.getVbdef10(); + if(cprojectid ==null ||cprojectid.trim().length()==0||vbdef10 ==null ||vbdef10.trim().length()==0){ + continue; + }else { + if(code_name.containsKey(cprojectid)){ + //存在编码相同的行,比较名称---不同则报错 + if(!code_name.get(cprojectid).equals(vbdef10)){ + throw new BusinessException("销售订单,项目编码相同但是名称不同,请检查!!!"); + } + }else{ + code_name.put(cprojectid,vbdef10); + } + } + } + UFBoolean is_hth = UFBoolean.FALSE; + ProjectHeadVO headDOCVO=null; + //查询是否重复 + if(!code_name.isEmpty()){ + SqlBuilder projectSql=new SqlBuilder(); + projectSql.append(" project_code",code_name.keySet().toArray(new String[0])); + projectSql.append(" and pk_duty_org",o); + projectSql.append(" and nvl(dr,0)=0 "); + List projectHeadVOList = (List) dao.retrieveByClause(ProjectHeadVO.class, projectSql.toString()); + if (projectHeadVOList != null && projectHeadVOList.size() > 0) { + for(ProjectHeadVO projectHeadVO:projectHeadVOList){ + result.add(projectHeadVO); + String projectCode = projectHeadVO.getProject_code(); + if(projectCode.equals(vdef22)){ + is_hth=UFBoolean.TRUE; + headDOCVO=projectHeadVO; + } + if (code_name.containsKey(projectCode)) { + code_name.remove(projectCode); + } + } + if(code_name!=null && code_name.size()>0){ + //存在需要新增的档案明细 + createPro(code_name, is_hth, headDOCVO, vdef22, vdef23, map,result); + } + }else{ + //存在需要新增的档案明细 + createPro(code_name, is_hth, headDOCVO, vdef22, vdef23, map,result); + } } - } + } + return result; + } + + private List genDef(SaleOrderVO[] salevos) throws BusinessException { + BaseDAO baseDAO = new BaseDAO(); + List allDefDoc = new ArrayList(); + ArrayList arrhth = new ArrayList(); + ArrayList arrxmh = new ArrayList(); + ArrayList arrxsddh = new ArrayList(); + String sql = " select pk_org,pk_vid from org_orgs where org_orgs.code='" + salevos[0].getParentVO().getPk_org() + "' and nvl(dr,0)=0 and isbusinessunit='Y' "; + + Map map = (Map) baseDAO.executeQuery(sql, new MapProcessor()); + if (map == null) { + throw new BusinessException("采购组织档案未查到"); + } + String o = (String) map.get("pk_org"); for (int i = 0; i < salevos.length; i++) { String vdef6 = BFPubTools.getString_TrimAsNull(salevos[i].getParentVO().getVdef6()); if (vdef6 != "" && !arrhth.contains(vdef6)) { @@ -346,13 +462,46 @@ public class SaleOrderResource extends NCCPubRestResource { return allDefDoc; } - private void createPro(String cprocode, String cproname, Map map) throws BusinessException { + private void createPro(Map code_name, UFBoolean is_hth, ProjectHeadVO headDOCVO, String vdef22, String vdef23, Map map,List new_list) throws BusinessException { + //code_name里全是需要新增的明细项目 + Set strings = code_name.keySet(); + if(is_hth.booleanValue()==true){ + //表头项目已经存在,无需创建父项目 + for (String code : strings) { + ProjectHeadVO hvo = new ProjectHeadVO(); + hvo.setProject_code(code); + hvo.setProject_name(code_name.get(code)); + hvo.setPk_parentpro(headDOCVO.getPk_project()); + fillheadVOValue(hvo,map); + ProjectHeadVO projectHeadVO = NCLocator.getInstance().lookup(IProject.class).insertProject(hvo); + new_list.add(projectHeadVO); + } + }else{ + //表头项目不存在,需要创建父项目 + ProjectHeadVO headProjectVO = new ProjectHeadVO(); + headProjectVO.setProject_code(vdef22); + headProjectVO.setProject_name(vdef23); + fillheadVOValue(headProjectVO,map); + ProjectHeadVO projectHeadVO = NCLocator.getInstance().lookup(IProject.class).insertProject(headProjectVO); + new_list.add(projectHeadVO); + code_name.remove(vdef22); + if(code_name!=null&& code_name.size()>0){ + for (String code : strings) { + ProjectHeadVO hvo = new ProjectHeadVO(); + hvo.setProject_code(code); + hvo.setProject_name(code_name.get(code)); + hvo.setPk_parentpro(projectHeadVO.getPk_project()); + fillheadVOValue(hvo,map); + ProjectHeadVO itemprojectHeadVO = NCLocator.getInstance().lookup(IProject.class).insertProject(hvo); + new_list.add(itemprojectHeadVO); + } + } + } + } + + private void fillheadVOValue(ProjectHeadVO hvo, Map map) { String pk_org = (String) map.get("pk_org"); String pk_org_v = (String) map.get("pk_vid"); - - ProjectHeadVO hvo = new ProjectHeadVO(); - hvo.setProject_code(cprocode); - hvo.setProject_name(cproname); hvo.setPk_org(pk_org); hvo.setPk_org_v(pk_org_v); @@ -366,7 +515,6 @@ public class SaleOrderResource extends NCCPubRestResource { hvo.setPk_eps("1001A110000000004K64"); hvo.setPk_duty_dept_v(pk_org_v); hvo.setEnablestate(2); - NCLocator.getInstance().lookup(IProject.class).insertProject(hvo); } private DefdocVO[] createDefVO(List newhth, String defdoclistcode, String pk_org) throws BusinessException { @@ -419,6 +567,18 @@ public class SaleOrderResource extends NCCPubRestResource { } + /** + * 根据销售组织代码获取销售组织关系信息 + * @param saleorg 销售组织代码 + * @return 返回包含结算组织代码和应收组织代码的Map集合,key为settleorg_code和arorg_code + * @throws BusinessException 业务异常 + */ + private Map getSaleorgRelations(String saleorg) throws BusinessException{ + String sql = "select settleorg_code,arorg_code from V_SALEORG_RELATIONS where saleorg_code='"+saleorg+"'"; + Map map = (Map) getDao().executeQuery(sql, new MapProcessor()); + return map; + } + @POST @Path("update") @Consumes({"application/json"}) From 782db385d8076f404ea6b669dcf93d2d5f276187 Mon Sep 17 00:00:00 2001 From: mzr <1562242162@qq.com> Date: Mon, 4 Aug 2025 08:19:31 +0800 Subject: [PATCH 4/5] =?UTF-8?q?refactor(uapbd):=20=E9=87=8D=E6=9E=84=20Get?= =?UTF-8?q?PlmFileUtil=20=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 绉婚櫎浜嗘湭浣跨敤鐨勫鍏ヨ鍙 - 鏂板浜嗛潤鎬佺殑 HttpClient 瀹炰緥锛屾彁楂樹簡鎬ц兘 -浼樺寲浜嗗涓墿鏂欐枃浠朵笅杞藉苟鍚堝苟鎴 zip 鏂囦欢鐨勯昏緫 - 娣诲姞浜嗚祫婧愬叧闂殑寮傚父澶勭悊锛岄伩鍏嶄簡璧勬簮娉勯湶 - 浼樺寲浜嗛敊璇棩蹇楃殑杈撳嚭锛屾彁楂樹簡閿欒淇℃伅鐨勫彲璇绘 --- .../nc/bs/uapbd/util/GetPlmFileUtil.java | 93 ++++++++++--------- 1 file changed, 49 insertions(+), 44 deletions(-) diff --git a/uapbd/src/public/nc/bs/uapbd/util/GetPlmFileUtil.java b/uapbd/src/public/nc/bs/uapbd/util/GetPlmFileUtil.java index 53be1cc..43f2a63 100644 --- a/uapbd/src/public/nc/bs/uapbd/util/GetPlmFileUtil.java +++ b/uapbd/src/public/nc/bs/uapbd/util/GetPlmFileUtil.java @@ -3,7 +3,6 @@ package nc.bs.uapbd.util; import com.alibaba.fastjson.JSONObject; import nc.bs.dao.DAOException; import nc.bs.logging.Log; -import nc.bs.logging.Logger; import nc.bs.trade.business.HYSuperDMO; import nc.vo.bd.defdoc.DefdocVO; import nc.vo.cmp.util.StringUtils; @@ -21,9 +20,7 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; -import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; -import java.util.Base64; import java.util.Date; import java.util.HashMap; import java.util.Map; @@ -49,8 +46,28 @@ public class GetPlmFileUtil { private String materialFileIdUrl = "/sipmweb/api/{rid}/relation/{t}/{id}/data?re={re}&start={start}&item={item}"; // 下载文件 private String downlownUrl = "/sipmweb/web/download?rid={rid}&id={id}&t={t}&type={type}"; + // http请求 + private static final PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(); + private static final CloseableHttpClient httpClient; - public WebFile getPlmFiles(String[] materialCodeArr) throws BusinessException, IOException { + static { + connectionManager.setMaxTotal(5000); + connectionManager.setDefaultMaxPerRoute(500); + + RequestConfig globalConfig = RequestConfig.custom() + .setConnectionRequestTimeout(50000) + .setConnectTimeout(50000) + .setSocketTimeout(200000) + .setCookieSpec(CookieSpecs.IGNORE_COOKIES) + .build(); + + httpClient = HttpClients.custom() + .setConnectionManager(connectionManager) + .setDefaultRequestConfig(globalConfig) + .build(); + } + + public WebFile getPlmFiles(String[] materialCodeArr) throws Exception { WebFile file = null; if (materialCodeArr == null || materialCodeArr.length == 0) { return file; @@ -71,21 +88,35 @@ public class GetPlmFileUtil { InputStream ins = this.doDownloadPlmFile(objId); file = new WebFile(fname, ins); } else { + // 多个物料合并成zip文件输出文件流 // 创建内存中的 ZIP 输出流 ByteArrayOutputStream zipOut = new ByteArrayOutputStream(); ZipOutputStream zipStream = new ZipOutputStream(zipOut); - for (String materialCode : materialCodeArr) { - JSONObject plmFileJson = this.getPlmFile(materialCode); - String objId = plmFileJson.getString("objId"); - String fname = plmFileJson.getString("fname"); - InputStream ins = this.doDownloadPlmFile(objId); - byte[] bytes = parseFileStream(ins); - zipStream.putNextEntry(new ZipEntry(fname)); - zipStream.write(bytes); - zipStream.closeEntry(); + try { + for (String materialCode : materialCodeArr) { + JSONObject plmFileJson = this.getPlmFile(materialCode); + String objId = plmFileJson.getString("objId"); + String fname = plmFileJson.getString("fname"); + InputStream ins = this.doDownloadPlmFile(objId); + try { + byte[] bytes = parseFileStream(ins); + zipStream.putNextEntry(new ZipEntry(fname)); + zipStream.write(bytes); + zipStream.closeEntry(); + } finally { + if (ins != null) { + try { + ins.close(); + } catch (IOException e) { + logger.error("Failed to close input stream: " + e.getMessage()); + } + } + } + } + zipStream.finish(); + } finally { + zipStream.close(); } - zipStream.finish(); - zipStream.close(); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss"); String zipName = "物料图纸下载_" + sdf.format(new Date()); // 构造 WebFile 返回 ZIP 文件 @@ -96,7 +127,7 @@ public class GetPlmFileUtil { return file; } - public JSONObject getPlmFile(String materialCode) throws BusinessException, IOException { + public JSONObject getPlmFile(String materialCode) throws Exception { String materialId = getMaterialId(materialCode); return getFileId(materialId); } @@ -168,7 +199,7 @@ public class GetPlmFileUtil { /** * 调用PLM的下载文件接口 */ - private InputStream doDownloadPlmFile(String fileId) throws IOException, BusinessException { + private InputStream doDownloadPlmFile(String fileId) throws IOException { String fileUrl = plmBaseUrl + downlownUrl; Map map = new HashMap<>(); map.put("rid", token); @@ -191,24 +222,13 @@ public class GetPlmFileUtil { } } } catch (DAOException e) { - Logger.error("getConfigParams-exp:" + e.getMessage()); + logger.error("Failed to get config parameters for code: " + code, e); } return map; } 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()) { @@ -233,21 +253,6 @@ public class GetPlmFileUtil { * @return 文件流 */ private InputStream getFileFromPlm(String requestUrl, Map paramMap) 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(); StringBuilder param = new StringBuilder("?"); if (paramMap != null) { for (Map.Entry entry : paramMap.entrySet()) { From 5d3f9729f46354ab0a6179ec905aefb64bd1c9b7 Mon Sep 17 00:00:00 2001 From: mzr Date: Mon, 4 Aug 2025 10:32:24 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E6=B5=81=E7=A8=8B=E7=94=9F=E4=BA=A7?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E5=AE=A1=E6=89=B9=E5=90=8E=E6=8E=A8=E9=80=81?= =?UTF-8?q?=E8=89=BE=E6=99=AEMES=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../private/nc/bs/mmpac/pmo/pac0002/bp/PMOApproveBP.java | 4 ++-- .../mmpac/pmo/pac0002/bp/rule/util/SyncEpicMesUtil.java | 8 ++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) 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 8a66ab4..55cdd1d 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,6 +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; @@ -55,7 +55,7 @@ public class PMOApproveBP { // 审批后推送到锐制系统 processer.addAfterRule(new AfterApprovingSynchronizeRuleRZ(true)); // 审批后推送流程生产订单到MES -// processer.addAfterRule(new AfterApproveRuleSyncMes()); + processer.addAfterRule(new AfterApproveRuleSyncMes()); // 审批后推送流程生产订单到艾普MES processer.addAfterRule(new AfterApproveSyncEpicMesRule()); 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 c63a948..7f4e0fa 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 @@ -53,11 +53,15 @@ public class SyncEpicMesUtil { auditCode = flag; configParams = MyHelper.getConfigParams("Dldz-config", null); if (configParams.isEmpty()) { - throw new BusinessException("电力电子的艾普MES接口缺少配置"); + // throw new BusinessException("电力电子的艾普MES接口缺少配置"); + logDl.error("电力电子的艾普MES接口缺少配置"); + return; } deptParams = MyHelper.getConfigParams("Dldz-dept", null); if (deptParams.isEmpty()) { - throw new BusinessException("电力电子的艾普MES接口缺少部门编码映射配置"); + // throw new BusinessException("电力电子的艾普MES接口缺少部门编码映射配置"); + logDl.error("电力电子的艾普MES接口缺少部门编码映射配置"); + return; } String deptRange = String.join(",", deptParams.keySet()); configParams.put("deptRange", deptRange);