plm文件获取调整

This commit is contained in:
mzr 2025-09-16 08:43:25 +08:00
parent 84ad04810b
commit 63fb6936a2
1 changed files with 65 additions and 25 deletions

View File

@ -33,7 +33,7 @@ import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream; import java.util.zip.ZipOutputStream;
/** /**
* 获取物料PLM文件同时下载SIPM1和SIPM2 * 获取物料PLM文件
* *
* @author mzr * @author mzr
* @date 2025/8/4 * @date 2025/8/4
@ -47,7 +47,7 @@ public class MaterialPlmDownloadAction implements ICommonAction {
private static final String tokenUrl = "/sipmweb/api/oauth"; private static final String tokenUrl = "/sipmweb/api/oauth";
// 根据物料编码获取零部件ID // 根据物料编码获取零部件ID
private String materialIdUrl = "/sipmweb/api/{rid}/search/{t}"; private String materialIdUrl = "/sipmweb/api/{rid}/search/{t}";
// 根据零部件ID获取档ID及信息 // 根据零部件ID获取档ID及信息
private String materialFileIdUrl = "/sipmweb/api/{rid}/relation/{t}/{id}/data"; private String materialFileIdUrl = "/sipmweb/api/{rid}/relation/{t}/{id}/data";
// 下载文件 // 下载文件
private String downlownUrl = "/sipmweb/web/download"; private String downlownUrl = "/sipmweb/web/download";
@ -102,6 +102,10 @@ public class MaterialPlmDownloadAction implements ICommonAction {
/** /**
* 处理多个文件并打包同时包含SIPM1和SIPM2 * 处理多个文件并打包同时包含SIPM1和SIPM2
*
* @param materialCodeArr 物料编码数组
* @return 打包后的zip文件WebFile对象
* @throws Exception 异常
*/ */
private WebFile processMultipleFiles(String[] materialCodeArr) throws Exception { private WebFile processMultipleFiles(String[] materialCodeArr) throws Exception {
// 在内存中的 ZIP 输出流 // 在内存中的 ZIP 输出流
@ -127,23 +131,31 @@ public class MaterialPlmDownloadAction implements ICommonAction {
zipStream.close(); zipStream.close();
} }
// 如果没有任何文件成功处理
if (successCount == 0) { if (successCount == 0) {
throw new BusinessException("没有有效的文件可以打包"); throw new BusinessException("没有有效的文件可以打包");
} }
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss"); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
String zipName = "图纸文档打包_" + sdf.format(new Date()); String zipName = "图纸文档打包_" + sdf.format(new Date());
// 创建 WebFile 对象用于 ZIP 文件
InputStream ins = new ByteArrayInputStream(zipOut.toByteArray()); InputStream ins = new ByteArrayInputStream(zipOut.toByteArray());
return new WebFile(zipName + ".zip", ins); return new WebFile(zipName + ".zip", ins);
} }
/** /**
* 将单个物料的单个类型文件SIPM1/SIPM2添加到ZIP流中 * 将单个物料文件添加到ZIP流中
*
* @param materialCode 物料编码
* @param index 索引
* @param zipStream ZIP输出流
* @return boolean 是否成功处理
* @throws Exception 异常
*/ */
private boolean processSingleMaterialToZip(String materialCode, int index, String fileType, ZipOutputStream zipStream) throws Exception { private boolean processSingleMaterialToZip(String materialCode, int index, String fileType, ZipOutputStream zipStream) throws Exception {
String materialId = getMaterialId(materialCode); String materialId = getMaterialId(materialCode);
if (StringUtils.isEmpty(materialId)) { if (StringUtils.isEmpty(materialId)) {
logger.warn("物料编码 " + materialCode + " 未查询到PLM物料ID"); logger.error("物料编码 " + materialCode + " 未查询到PLM物料ID");
return false; return false;
} }
@ -153,14 +165,14 @@ public class MaterialPlmDownloadAction implements ICommonAction {
String list = fileJson.getString("list"); String list = fileJson.getString("list");
JSONArray jsonArray = JSONObject.parseArray(list); JSONArray jsonArray = JSONObject.parseArray(list);
if (jsonArray == null || jsonArray.isEmpty()) { if (jsonArray == null || jsonArray.isEmpty()) {
logger.warn("物料编码 " + materialCode + " 未查询到" + fileType + "类型文件"); logger.error("物料编码 " + materialCode + " 未查询到" + fileType + "类型文件");
return false; return false;
} }
JSONObject plmFileJson = jsonArray.getJSONObject(0); JSONObject plmFileJson = jsonArray.getJSONObject(0);
String objId = plmFileJson.getString("objId"); String objId = plmFileJson.getString("objId");
if (objId == null || objId.isEmpty()) { if (objId == null || objId.isEmpty()) {
logger.warn("物料编码 " + materialCode + "" + fileType + "文件ID为空"); logger.error("物料编码 " + materialCode + "" + fileType + "文件ID为空");
return false; return false;
} }
@ -168,12 +180,12 @@ public class MaterialPlmDownloadAction implements ICommonAction {
String suffix = plmFileJson.getString("suffix"); String suffix = plmFileJson.getString("suffix");
byte[] fileBytes = downloadPlmFileByType(objId, fileType); byte[] fileBytes = downloadPlmFileByType(objId, fileType);
if (fileBytes.length == 0) { if (fileBytes.length == 0) {
logger.warn("物料编码 " + materialCode + "" + fileType + "文件字节流为空"); logger.error("物料编码 " + materialCode + "" + fileType + "文件字节流为空");
return false; return false;
} }
// 生成带类型标识的文件名避免重复 // 生成带类型标识的文件名避免重复
String fname = name + "_" + materialCode + "_" + fileType + "_" + index + "." + suffix; String fname = name + "_" + materialCode + "_" + getTypeName(fileType) + "_" + index + "." + suffix;
zipStream.putNextEntry(new ZipEntry(fname)); zipStream.putNextEntry(new ZipEntry(fname));
zipStream.write(fileBytes); zipStream.write(fileBytes);
zipStream.closeEntry(); zipStream.closeEntry();
@ -202,11 +214,12 @@ public class MaterialPlmDownloadAction implements ICommonAction {
private String getMaterialId(String materialCode) throws IOException, BusinessException { private String getMaterialId(String materialCode) throws IOException, BusinessException {
String fileUrl = plmBaseUrl + materialIdUrl; String fileUrl = plmBaseUrl + materialIdUrl;
fileUrl = fileUrl.replace("{rid}", token); fileUrl = fileUrl.replace("{rid}", token);
// 对象表名 MPART零部件
fileUrl = fileUrl.replace("{t}", "MPART"); fileUrl = fileUrl.replace("{t}", "MPART");
Map<String, String> map = new HashMap<>(); Map<String, String> map = new HashMap<>();
map.put("key", materialCode); map.put("key", materialCode);// 搜索关键字
map.put("start", "0"); map.put("start", "0");// 偏移量
map.put("size", "10"); map.put("size", "10");// 数量
String result = doGet(fileUrl, map); String result = doGet(fileUrl, map);
logger.error("GetPlmFileUtil-getMaterialId-result = " + result); logger.error("GetPlmFileUtil-getMaterialId-result = " + result);
JSONObject jsonObject = JSONObject.parseObject(result); JSONObject jsonObject = JSONObject.parseObject(result);
@ -216,7 +229,11 @@ public class MaterialPlmDownloadAction implements ICommonAction {
return ""; return "";
} }
JSONObject listJson = jsonArray.getJSONObject(0); JSONObject listJson = jsonArray.getJSONObject(0);
return listJson.getString("objId"); String objId = listJson.getString("objId");
if (objId == null || objId.isEmpty()) {
return "";
}
return objId;
} }
/** /**
@ -228,24 +245,24 @@ public class MaterialPlmDownloadAction implements ICommonAction {
fileUrl = fileUrl.replace("{t}", "MPART"); fileUrl = fileUrl.replace("{t}", "MPART");
fileUrl = fileUrl.replace("{id}", materialId); fileUrl = fileUrl.replace("{id}", materialId);
Map<String, String> map = new HashMap<>(); Map<String, String> map = new HashMap<>();
map.put("re", "MPART_" + fileType); // 动态生成关系ID map.put("re", "MPART_" + fileType); // 关系ID
map.put("start", "0"); map.put("start", "0");// 偏移量
map.put("item", fileType); // 动态传入文件类型 map.put("item", fileType); // 关联对象表名
String result = doGet(fileUrl, map); String result = doGet(fileUrl, map);
logger.error("GetPlmFileUtil-getFileId-" + fileType + "-result = " + result); logger.error("GetPlmFileUtil-getFileId-" + fileType + "-result = " + result);
return result; return result;
} }
/** /**
* 通用方法根据类型下载文件合并原doDownloadPlmFile和doDownloadPlmFile2 * 调用PLM的下载文件接口
*/ */
private byte[] downloadPlmFileByType(String fileId, String fileType) throws IOException { private byte[] downloadPlmFileByType(String fileId, String fileType) throws IOException {
String fileUrl = plmBaseUrl + downlownUrl; String fileUrl = plmBaseUrl + downlownUrl;
Map<String, String> map = new HashMap<>(); Map<String, String> map = new HashMap<>();
map.put("rid", token); map.put("rid", token);
map.put("id", fileId); map.put("id", fileId);// 对象id
map.put("t", fileType); // 动态传入文件类型 map.put("t", fileType);// 对象表名
map.put("type", "D"); map.put("type", "D");// 文件类别BD,DD是文件本身的文件BD是PDF图
return getFileFromPlm(fileUrl, map); return getFileFromPlm(fileUrl, map);
} }
@ -272,9 +289,9 @@ public class MaterialPlmDownloadAction implements ICommonAction {
cm.setMaxTotal(5000); cm.setMaxTotal(5000);
cm.setDefaultMaxPerRoute(500); cm.setDefaultMaxPerRoute(500);
RequestConfig globalConfig = RequestConfig.custom().setConnectionRequestTimeout(50000) RequestConfig globalConfig = RequestConfig.custom().setConnectionRequestTimeout(50000) // 连接池获取连接超时
.setConnectTimeout(50000) .setConnectTimeout(50000) // 连接建立超时
.setSocketTimeout(200000) .setSocketTimeout(200000) // 等待响应超时
.setCookieSpec(CookieSpecs.IGNORE_COOKIES).build(); .setCookieSpec(CookieSpecs.IGNORE_COOKIES).build();
CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm) CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm)
@ -286,14 +303,20 @@ public class MaterialPlmDownloadAction implements ICommonAction {
return responseString; return responseString;
} }
/**
* 调用第三方文件接口并接收文件流
*
* @param requestUrl 文件接口URL
* @return 文件流
*/
private byte[] getFileFromPlm(String requestUrl, Map<String, String> paramMap) throws IOException { private byte[] getFileFromPlm(String requestUrl, Map<String, String> paramMap) throws IOException {
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(); PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
cm.setMaxTotal(5000); cm.setMaxTotal(5000);
cm.setDefaultMaxPerRoute(500); cm.setDefaultMaxPerRoute(500);
RequestConfig globalConfig = RequestConfig.custom().setConnectionRequestTimeout(50000) RequestConfig globalConfig = RequestConfig.custom().setConnectionRequestTimeout(50000) // 连接池获取连接超时
.setConnectTimeout(50000) .setConnectTimeout(50000) // 连接建立超时
.setSocketTimeout(200000) .setSocketTimeout(200000) // 等待响应超时
.setCookieSpec(CookieSpecs.IGNORE_COOKIES).build(); .setCookieSpec(CookieSpecs.IGNORE_COOKIES).build();
CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm) CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm)
@ -305,6 +328,13 @@ public class MaterialPlmDownloadAction implements ICommonAction {
return responseString; return responseString;
} }
/**
* 构建带参数的URL
*
* @param baseUrl 基础URL
* @param paramMap 参数Map
* @return 完整URL
*/
private String buildUrlWithParams(String baseUrl, Map<String, String> paramMap) { private String buildUrlWithParams(String baseUrl, Map<String, String> paramMap) {
StringBuilder param = new StringBuilder("?"); StringBuilder param = new StringBuilder("?");
if (paramMap != null && !paramMap.isEmpty()) { if (paramMap != null && !paramMap.isEmpty()) {
@ -318,4 +348,14 @@ public class MaterialPlmDownloadAction implements ICommonAction {
} }
return baseUrl + param; return baseUrl + param;
} }
private String getTypeName(String fileType) {
// SIPM2是文件SIPM1是图纸
if ("SIPM1".equals(fileType)) {
return "图纸";
} else if ("SIPM2".equals(fileType)) {
return "文件";
}
return fileType;
}
} }