Merge remote-tracking branch 'origin/main'
This commit is contained in:
commit
0ad96d210e
|
@ -10,6 +10,7 @@ import nc.jdbc.framework.processor.ColumnProcessor;
|
|||
import nc.pubitf.para.SysInitQuery;
|
||||
import nc.util.mmf.busi.service.PFPubService;
|
||||
import nc.util.mmf.framework.base.MMValueCheck;
|
||||
import nc.vo.bc.pmpub.project.ProjectHeadVO;
|
||||
import nc.vo.bd.stordoc.StordocVO;
|
||||
import nc.vo.fi.pub.SqlUtils;
|
||||
import nc.vo.ic.m4a.entity.GeneralInBodyVO;
|
||||
|
@ -154,19 +155,20 @@ public class PickmToGeneralInAction implements ICommonAction {
|
|||
head.setCtrantypeid(pk_billtypeid);
|
||||
head.setVtrantypecode(typeCode);
|
||||
head.setCwarehouseid(warehouseId);
|
||||
/*GeneralInBodyVO[] bodys = inVO.getBodys();
|
||||
GeneralInBodyVO[] bodys = inVO.getBodys();
|
||||
if (bodys != null) {
|
||||
for (GeneralInBodyVO body : bodys) {
|
||||
String cpickmId=body.getCunitid();
|
||||
String csourcebillhid = body.getCsourcebillhid();
|
||||
IPickmQueryService service = ServiceLocator.find(IPickmQueryService.class);
|
||||
AggPickmVO[] vos = service.queryBillsByPks(new String[]{cpickmId});
|
||||
if (vos != null && vos.length > 0) {
|
||||
HYPubBO hybo = new HYPubBO();
|
||||
Object cmaterialvidDef261 = hybo.findColValue("bd_material", "def26", "pk_material = '"+vos[0].getParentVO().getCmaterialvid()+"' ");
|
||||
body.setVnotebody((String) cmaterialvidDef261);
|
||||
}
|
||||
AggPickmVO[] vos = service.queryBillsByPks(new String[]{csourcebillhid});
|
||||
if (vos != null && vos.length > 0) {
|
||||
HYPubBO hybo = new HYPubBO();
|
||||
String cprojectid = vos[0].getParentVO().getCprojectid();
|
||||
String projectName = (String) hybo.findColValue(ProjectHeadVO.getDefaultTableName(), ProjectHeadVO.PROJECT_NAME, "pk_project = '" + cprojectid + "' ");
|
||||
body.setVnotebody(projectName);
|
||||
}
|
||||
}
|
||||
}*/
|
||||
}
|
||||
}
|
||||
return inVOS;
|
||||
}
|
||||
|
|
|
@ -5,14 +5,11 @@ import nc.bs.framework.common.NCLocator;
|
|||
import nc.bs.logging.Log;
|
||||
import nc.bs.mmpac.pmo.pac0002.bp.rule.util.SyncEpicMesUtil;
|
||||
import nc.impl.pubapp.pattern.rule.IRule;
|
||||
import nc.itf.gl.pub.IFreevaluePub;
|
||||
import nc.itf.mmpac.pmo.pac0002.IPMOMaintainService;
|
||||
import nc.itf.mmpac.pmo.pac0002.IPMOQueryService;
|
||||
import nc.util.mmf.framework.base.MMValueCheck;
|
||||
import nc.vo.mmpac.pickm.entity.AggPickmVO;
|
||||
import nc.vo.mmpac.pmo.pac0002.entity.PMOAggVO;
|
||||
import nc.vo.pub.BusinessException;
|
||||
import nccloud.framework.service.ServiceLocator;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
|
|
@ -7,10 +7,12 @@ import nc.bs.logging.Log;
|
|||
import nc.bs.trade.business.HYSuperDMO;
|
||||
import nc.vo.bd.defdoc.DefdocVO;
|
||||
import nc.vo.cmp.util.StringUtils;
|
||||
import nc.vo.ml.NCLangRes4VoTransl;
|
||||
import nc.vo.pub.BusinessException;
|
||||
import nccloud.baseapp.core.log.NCCForUAPLogger;
|
||||
import nccloud.baseapp.core.log.NCCForPrintLogger;
|
||||
import nccloud.framework.core.exception.ExceptionUtils;
|
||||
import nccloud.framework.core.io.WebFile;
|
||||
import nccloud.framework.core.io.WebFileDisposition;
|
||||
import nccloud.framework.web.action.itf.ICommonAction;
|
||||
import nccloud.framework.web.container.IRequest;
|
||||
import org.apache.http.client.config.CookieSpecs;
|
||||
|
@ -20,13 +22,10 @@ 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 org.owasp.esapi.ESAPI;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.*;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Arrays;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
@ -58,17 +57,31 @@ public class MaterialPlmDownloadAction implements ICommonAction {
|
|||
WebFile files = null;
|
||||
try {
|
||||
Map<String, String[]> params_1 = request.readParameters();
|
||||
String[] materialCodeArr = params_1.get("materialCode"); // 获取所有 pk
|
||||
String[] materialCodeArr = params_1.get("materialCode"); // 获取所有物料编码
|
||||
if (materialCodeArr == null || materialCodeArr.length == 0) {
|
||||
ExceptionUtils.wrapBusinessException("物料编码不能为空");
|
||||
}
|
||||
NCCForUAPLogger.debug("MaterialPlmDownloadAction-pk = " + Arrays.toString(materialCodeArr));
|
||||
// NCCForUAPLogger.debug("MaterialPlmDownloadAction-pk = " + Arrays.toString(materialCodeArr));
|
||||
// String materialCode = "101092250323,101092250321,101092250322";
|
||||
// String[] materialCodeArr = materialCode.split(",", -1);
|
||||
files = this.getPlmFiles(materialCodeArr);
|
||||
} catch (Exception e) {
|
||||
logger.error("MaterialPlmDownloadAction-exp:" + e.getMessage());
|
||||
ExceptionUtils.wrapException(e);
|
||||
} catch (Exception ex) {
|
||||
logger.error("MaterialPlmDownloadAction-exp:" + ex.getMessage());
|
||||
// 将异常转换为WebFile的形式返回,以便前端展示报错
|
||||
NCCForPrintLogger.error(ex);
|
||||
Throwable e = org.apache.commons.lang3.exception.ExceptionUtils.getRootCause(ex);
|
||||
String mess = ESAPI.encoder().encodeForHTML(NCLangRes4VoTransl.getNCLangRes().getStrByID("1501003_0", "01501003-0121")) + ESAPI.encoder().encodeForHTML(e.getMessage());
|
||||
if (e.getMessage() == null || "".equals(e.getMessage())) {
|
||||
StringWriter sw = new StringWriter();
|
||||
e.printStackTrace(new PrintWriter(sw, true));
|
||||
mess = ESAPI.encoder().encodeForHTML(NCLangRes4VoTransl.getNCLangRes().getStrByID("1501003_0", "01501003-0122")) + ESAPI.encoder().encodeForHTML(sw.toString());
|
||||
mess = "<span style= \"color:red \">" + mess + "</span>";
|
||||
}
|
||||
|
||||
InputStream in = new ByteArrayInputStream(mess.getBytes());
|
||||
WebFile errorFile = new WebFile("print_error.html", in);
|
||||
errorFile.setDisposition(WebFileDisposition.Inline);
|
||||
files = errorFile;
|
||||
}
|
||||
return files;
|
||||
}
|
||||
|
@ -88,55 +101,116 @@ public class MaterialPlmDownloadAction implements ICommonAction {
|
|||
token = getToken();
|
||||
if (materialCodeArr.length == 1) {
|
||||
String materialCode = materialCodeArr[0];
|
||||
JSONObject plmFileJson = this.getPlmFile(materialCode);
|
||||
String materialId = getMaterialId(materialCode);
|
||||
if (StringUtils.isEmpty(materialId)) {
|
||||
throw new BusinessException("物料编码:" + materialCode + ",获取PLM物料id失败,请检查PLM是否存在对应的物料");
|
||||
}
|
||||
String fileRes = this.getFileId(materialId);
|
||||
JSONObject fileJson = JSONObject.parseObject(fileRes);
|
||||
String list = fileJson.getString("list");
|
||||
JSONArray jsonArray = JSONObject.parseArray(list);
|
||||
if (jsonArray == null || jsonArray.isEmpty()) {
|
||||
throw new BusinessException("物料编码:" + materialCode + ",获取PLM物料的文件信息失败");
|
||||
}
|
||||
JSONObject plmFileJson = jsonArray.getJSONObject(0);
|
||||
String objId = plmFileJson.getString("objId");
|
||||
if (objId == null || objId.isEmpty()) {
|
||||
throw new BusinessException("物料编码:" + materialCode + ",获取PLM物料的文件信息失败");
|
||||
}
|
||||
String fname = plmFileJson.getString("fname");
|
||||
|
||||
byte[] fileBytes = this.doDownloadPlmFile(objId);
|
||||
if (fileBytes.length == 0) {
|
||||
throw new BusinessException("未查询到PLM的文件");
|
||||
throw new BusinessException("物料编码:" + materialCode + ",未查询到PLM文件");
|
||||
}
|
||||
InputStream ins = new ByteArrayInputStream(fileBytes);
|
||||
file = new WebFile(fname, ins);
|
||||
} else {
|
||||
// 多个物料合并成zip文件输出文件流
|
||||
// 创建内存中的 ZIP 输出流
|
||||
ByteArrayOutputStream zipOut = new ByteArrayOutputStream();
|
||||
ZipOutputStream zipStream = new ZipOutputStream(zipOut);
|
||||
try {
|
||||
for (int i = 0; i < materialCodeArr.length; i++) {
|
||||
String materialCode = materialCodeArr[i];
|
||||
JSONObject plmFileJson = this.getPlmFile(materialCode);
|
||||
String objId = plmFileJson.getString("objId");
|
||||
// String fname = plmFileJson.getString("fname"); // 二维图档.pdf
|
||||
String name = plmFileJson.getString("name");
|
||||
String suffix = plmFileJson.getString("suffix");
|
||||
byte[] fileBytes = this.doDownloadPlmFile(objId);
|
||||
if (fileBytes.length == 0) {
|
||||
continue;
|
||||
}
|
||||
String fname = name + "_" + materialCode + "_" + i + "." + suffix;
|
||||
zipStream.putNextEntry(new ZipEntry(fname));
|
||||
zipStream.write(fileBytes);
|
||||
zipStream.closeEntry();
|
||||
}
|
||||
zipStream.finish();
|
||||
} finally {
|
||||
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);
|
||||
file = processMultipleFiles(materialCodeArr);
|
||||
}
|
||||
|
||||
return file;
|
||||
}
|
||||
|
||||
public JSONObject getPlmFile(String materialCode) throws Exception {
|
||||
/**
|
||||
* 处理多个文件并打包
|
||||
*
|
||||
* @param materialCodeArr 物料编码数组
|
||||
* @return 打包后的zip文件WebFile对象
|
||||
* @throws Exception 异常
|
||||
*/
|
||||
private WebFile processMultipleFiles(String[] materialCodeArr) throws Exception {
|
||||
// 在内存中的 ZIP 输出流
|
||||
ByteArrayOutputStream zipOut = new ByteArrayOutputStream();
|
||||
ZipOutputStream zipStream = new ZipOutputStream(zipOut);
|
||||
int successCount = 0; // 成功处理的文件数
|
||||
try {
|
||||
for (int i = 0; i < materialCodeArr.length; i++) {
|
||||
String materialCode = materialCodeArr[i];
|
||||
try {
|
||||
boolean success = processSingleMaterialToZip(materialCode, i, zipStream);
|
||||
if (success) {
|
||||
successCount++;
|
||||
}
|
||||
} catch (BusinessException e) {
|
||||
logger.error("处理物料编码 " + materialCode + " 时出现异常: " + e.getMessage());
|
||||
// 继续处理下一个
|
||||
}
|
||||
}
|
||||
zipStream.finish();
|
||||
} finally {
|
||||
zipStream.close();
|
||||
}
|
||||
|
||||
// 如果没有任何文件成功处理
|
||||
if (successCount == 0) {
|
||||
throw new BusinessException("没有有效的文件可以打包");
|
||||
}
|
||||
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
|
||||
String zipName = "图纸文档打包_" + sdf.format(new Date());
|
||||
// 创建 WebFile 对象用于 ZIP 文件
|
||||
InputStream ins = new ByteArrayInputStream(zipOut.toByteArray());
|
||||
return new WebFile(zipName + ".zip", ins);
|
||||
}
|
||||
|
||||
/**
|
||||
* 将单个物料文件添加到ZIP流中
|
||||
*
|
||||
* @param materialCode 物料编码
|
||||
* @param index 索引
|
||||
* @param zipStream ZIP输出流
|
||||
* @return boolean 是否成功处理
|
||||
* @throws Exception 异常
|
||||
*/
|
||||
private boolean processSingleMaterialToZip(String materialCode, int index, ZipOutputStream zipStream) throws Exception {
|
||||
String materialId = getMaterialId(materialCode);
|
||||
return getFileId(materialId);
|
||||
if (StringUtils.isEmpty(materialId)) {
|
||||
return false;
|
||||
}
|
||||
String fileRes = this.getFileId(materialId);
|
||||
JSONObject fileJson = JSONObject.parseObject(fileRes);
|
||||
String list = fileJson.getString("list");
|
||||
JSONArray jsonArray = JSONObject.parseArray(list);
|
||||
if (jsonArray == null || jsonArray.isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
JSONObject plmFileJson = jsonArray.getJSONObject(0);
|
||||
String objId = plmFileJson.getString("objId");
|
||||
if (objId == null || objId.isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
String name = plmFileJson.getString("name");
|
||||
String suffix = plmFileJson.getString("suffix");
|
||||
byte[] fileBytes = this.doDownloadPlmFile(objId);
|
||||
if (fileBytes.length == 0) {
|
||||
return false;
|
||||
}
|
||||
String fname = name + "_" + materialCode + "_" + index + "." + suffix;
|
||||
zipStream.putNextEntry(new ZipEntry(fname));
|
||||
zipStream.write(fileBytes);
|
||||
zipStream.closeEntry();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
@ -148,7 +222,7 @@ public class MaterialPlmDownloadAction implements ICommonAction {
|
|||
tokenMap.put("uname", plmUser);
|
||||
tokenMap.put("f", "true");
|
||||
String tokenStr = doGet(plmBaseUrl + tokenUrl, tokenMap);
|
||||
logger.error("GetPlmFileUtil-getToken-tokenStr = " + tokenStr);
|
||||
// logger.error("GetPlmFileUtil-getToken-tokenStr = " + tokenStr);
|
||||
JSONObject jsonObject = JSONObject.parseObject(tokenStr);
|
||||
String token = jsonObject.getString("errmsg");
|
||||
if (token == null || token.isEmpty()) {
|
||||
|
@ -175,12 +249,12 @@ public class MaterialPlmDownloadAction implements ICommonAction {
|
|||
String list = jsonObject.getString("list");
|
||||
JSONArray jsonArray = JSONObject.parseArray(list);
|
||||
if (jsonArray == null || jsonArray.isEmpty()) {
|
||||
throw new BusinessException("获取PLM物料id失败");
|
||||
return "";
|
||||
}
|
||||
JSONObject listJson = jsonArray.getJSONObject(0);
|
||||
String objId = listJson.getString("objId");
|
||||
if (objId == null || objId.isEmpty()) {
|
||||
throw new BusinessException("获取PLM物料id失败");
|
||||
return "";
|
||||
}
|
||||
return objId;
|
||||
}
|
||||
|
@ -188,7 +262,7 @@ public class MaterialPlmDownloadAction implements ICommonAction {
|
|||
/**
|
||||
* 根据零部件ID获取文件ID
|
||||
*/
|
||||
private JSONObject getFileId(String materialId) throws IOException, BusinessException {
|
||||
private String getFileId(String materialId) throws IOException, BusinessException {
|
||||
String fileUrl = plmBaseUrl + materialFileIdUrl;
|
||||
fileUrl = fileUrl.replace("{rid}", token);
|
||||
// 对象表名 MPART(零部件)
|
||||
|
@ -201,18 +275,7 @@ public class MaterialPlmDownloadAction implements ICommonAction {
|
|||
map.put("item", "SIPM1");// 关联对象表名
|
||||
String result = doGet(fileUrl, map);
|
||||
logger.error("GetPlmFileUtil-getFileId-result = " + result);
|
||||
JSONObject jsonObject = JSONObject.parseObject(result);
|
||||
String list = jsonObject.getString("list");
|
||||
JSONArray jsonArray = JSONObject.parseArray(list);
|
||||
if (jsonArray == null || jsonArray.isEmpty()) {
|
||||
throw new BusinessException("获取PLM物料的文件信息失败");
|
||||
}
|
||||
JSONObject listJson = jsonArray.getJSONObject(0);
|
||||
String objId = listJson.getString("objId");
|
||||
if (objId == null || objId.isEmpty()) {
|
||||
throw new BusinessException("获取PLM物料的文件信息失败");
|
||||
}
|
||||
return listJson;
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -259,17 +322,7 @@ public class MaterialPlmDownloadAction implements ICommonAction {
|
|||
|
||||
CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm)
|
||||
.setDefaultRequestConfig(globalConfig).build();
|
||||
StringBuilder param = new StringBuilder("?");
|
||||
if (paramMap != null) {
|
||||
for (Map.Entry<String, String> entry : paramMap.entrySet()) {
|
||||
param.append(entry.getKey());
|
||||
param.append("=");
|
||||
param.append(entry.getValue());
|
||||
param.append("&");
|
||||
}
|
||||
param.deleteCharAt(param.length() - 1);
|
||||
}
|
||||
String url = requestUrl + param;
|
||||
String url = buildUrlWithParams(requestUrl, paramMap);
|
||||
HttpGet get = new HttpGet(url);
|
||||
String responseString = httpClient.execute(get, response -> EntityUtils.toString(response.getEntity()));
|
||||
get.releaseConnection();
|
||||
|
@ -294,8 +347,23 @@ public class MaterialPlmDownloadAction implements ICommonAction {
|
|||
|
||||
CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm)
|
||||
.setDefaultRequestConfig(globalConfig).build();
|
||||
String url = buildUrlWithParams(requestUrl, paramMap);
|
||||
HttpGet get = new HttpGet(url);
|
||||
byte[] responseString = httpClient.execute(get, response -> EntityUtils.toByteArray(response.getEntity()));
|
||||
get.releaseConnection();
|
||||
return responseString;
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建带参数的URL
|
||||
*
|
||||
* @param baseUrl 基础URL
|
||||
* @param paramMap 参数Map
|
||||
* @return 完整URL
|
||||
*/
|
||||
private String buildUrlWithParams(String baseUrl, Map<String, String> paramMap) {
|
||||
StringBuilder param = new StringBuilder("?");
|
||||
if (paramMap != null) {
|
||||
if (paramMap != null && !paramMap.isEmpty()) {
|
||||
for (Map.Entry<String, String> entry : paramMap.entrySet()) {
|
||||
param.append(entry.getKey());
|
||||
param.append("=");
|
||||
|
@ -304,10 +372,7 @@ public class MaterialPlmDownloadAction implements ICommonAction {
|
|||
}
|
||||
param.deleteCharAt(param.length() - 1);
|
||||
}
|
||||
String url = requestUrl + param;
|
||||
HttpGet get = new HttpGet(url);
|
||||
byte[] responseString = httpClient.execute(get, response -> EntityUtils.toByteArray(response.getEntity()));
|
||||
get.releaseConnection();
|
||||
return responseString;
|
||||
return baseUrl + param;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue