mmpac生产报告: 增加 MES 数据处理功能

- 新增 preProcessMesData 方法预处理 MES 数据
- 实现 processMESFields 方法自动赋值 MES 相关字段
- 添加 processWarehouseConversion 方法处理仓库转换逻辑
-优化 convertWarehouseCodeToPk 方法查询仓库主键
This commit is contained in:
maolei 2025-06-06 11:13:04 +08:00
parent c112da9a0f
commit 941dec1543
1 changed files with 171 additions and 15 deletions

View File

@ -1,18 +1,18 @@
package nccloud.openapi.mmpac.wr; package nccloud.openapi.mmpac.wr;
import nc.bs.dao.BaseDAO; import nc.bs.dao.BaseDAO;
import nc.bs.framework.common.InvocationInfoProxy;
import nc.bs.framework.common.NCLocator; import nc.bs.framework.common.NCLocator;
import nc.bs.logging.Log; import nc.bs.logging.Log;
import nc.bs.uif2.validation.ValidationFailure; import nc.bs.uif2.validation.ValidationFailure;
import nc.jdbc.framework.SQLParameter;
import nc.jdbc.framework.processor.ColumnProcessor;
import nc.util.mmf.framework.base.MMArrayUtil; import nc.util.mmf.framework.base.MMArrayUtil;
import nc.util.mmf.framework.base.MMCollectionUtil; import nc.util.mmf.framework.base.MMCollectionUtil;
import nc.util.mmf.framework.base.MMNumberUtil; import nc.util.mmf.framework.base.MMNumberUtil;
import nc.util.mmf.framework.base.MMValueCheck; import nc.util.mmf.framework.base.MMValueCheck;
import nc.vo.mmpac.wr.entity.AggWrVO; import nc.vo.mmpac.wr.entity.*;
import nc.vo.mmpac.wr.entity.WrItemVO;
import nc.vo.mmpac.wr.entity.WrQualityVO;
import nc.vo.mmpac.wr.entity.WrSerialNoVO;
import nc.vo.mmpac.wr.entity.WrVO;
import nc.vo.mmpac.wr.enumeration.WrBillStatusEnum; import nc.vo.mmpac.wr.enumeration.WrBillStatusEnum;
import nc.vo.pub.BusinessException; import nc.vo.pub.BusinessException;
import nc.vo.pub.VOStatus; import nc.vo.pub.VOStatus;
@ -31,14 +31,7 @@ import javax.ws.rs.Consumes;
import javax.ws.rs.POST; import javax.ws.rs.POST;
import javax.ws.rs.Path; import javax.ws.rs.Path;
import javax.ws.rs.Produces; import javax.ws.rs.Produces;
import java.util.ArrayList; import java.util.*;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
@Path("mmpac/wr") @Path("mmpac/wr")
public class WrResource extends AbstractNCCRestResource { public class WrResource extends AbstractNCCRestResource {
@ -312,6 +305,9 @@ public class WrResource extends AbstractNCCRestResource {
Map<String, Object> bodyInfo = (Map<String, Object>) paramMap.get(BODYTABLE); Map<String, Object> bodyInfo = (Map<String, Object>) paramMap.get(BODYTABLE);
itemInfos.add(bodyInfo); itemInfos.add(bodyInfo);
} }
// 预处理数据处理仓库转换和MES相关字段
preProcessMesData(headInfo, itemInfos, baseDAO);
AggWrVO vo = new AggWrVO(); AggWrVO vo = new AggWrVO();
WrVO head = new WrVO(); WrVO head = new WrVO();
head.setPk_group(AppContext.getInstance().getPkGroup()); head.setPk_group(AppContext.getInstance().getPkGroup());
@ -577,9 +573,169 @@ public class WrResource extends AbstractNCCRestResource {
} }
server.delete(deleteVos.toArray(new AggWrVO[0])); server.delete(deleteVos.toArray(new AggWrVO[0]));
return ResultMessageUtil.toJSON(new String[0], "Éú²ú±¨¸æÉ¾³ý³É¹¦"); return ResultMessageUtil.toJSON(new String[0], "Éú²ú±¨¸æÉ¾³ý³É¹¦");
} catch (Exception e) { } catch (Exception e) { return ResultMessageUtil.exceptionToJSON(e);
return ResultMessageUtil.exceptionToJSON(e);
} }
} }
/**
* 预处理数据包含仓库转换和MES相关字段处理
* @param headInfo 表头信息
* @param itemInfos 表体信息列表
* @param baseDAO 数据库操作对象
* @throws BusinessException 处理失败时抛出异常
*/
private void preProcessMesData(Map<String, Object> headInfo, List<Map<String, Object>> itemInfos, BaseDAO baseDAO)
throws BusinessException {
// 处理表体信息中的数据转换
for (Map<String, Object> itemMap : itemInfos) {
// 处理MES相关字段自动赋值
processMESFields(itemMap, baseDAO);
// 处理质量信息中的仓库转换
if (itemMap.containsKey(QUALITYTABLE)) {
List<Map<String, Object>> qualityInfos = (List<Map<String, Object>>) itemMap.get(QUALITYTABLE);
processWarehouseConversion(qualityInfos, baseDAO);
}
}
}
/**
* 处理MES相关字段自动赋值
* 如果用户code是MES那么将cbmoid保持和vbsrcid一致cbmobid保持和vbsrcrowid一致
* 增加vbmobillcode单据号通过cbmoid查询流程生产订单表的vbillcode
* @param itemMap 表体信息
* @param baseDAO 数据库操作对象
* @throws BusinessException 查询失败时抛出异常
*/
private void processMESFields(Map<String, Object> itemMap, BaseDAO baseDAO) throws BusinessException {
// 检查是否需要处理MES字段
// 这里可以通过上下文用户信息或其他标识来判断
// 暂时通过检查是否存在特定字段来判断是MES用户
boolean isMESUser = isMESUser(itemMap);
if (!isMESUser) {
return;
}
try {
// 设置cbmoid保持和vbsrcid一致
if (itemMap.containsKey("vbsrcid") && MMValueCheck.isNotEmpty(itemMap.get("vbsrcid"))) {
itemMap.put("cbmoid", itemMap.get("vbsrcid"));
}
// 设置cbmobid保持和vbsrcrowid一致
if (itemMap.containsKey("vbsrcrowid") && MMValueCheck.isNotEmpty(itemMap.get("vbsrcrowid"))) {
itemMap.put("cbmobid", itemMap.get("vbsrcrowid"));
}
// 通过cbmoid查询流程生产订单表的vbillcode
if (itemMap.containsKey("cbmoid") && MMValueCheck.isNotEmpty(itemMap.get("cbmoid"))) {
String cbmoid = String.valueOf(itemMap.get("cbmoid"));
String sql = "SELECT vbillcode FROM mm_pmo WHERE cpmohid = ? AND dr = 0";
SQLParameter param = new SQLParameter();
param.addParam(cbmoid);
String vbillcode = (String) baseDAO.executeQuery(sql, param, new ColumnProcessor());
if (MMValueCheck.isEmpty(vbillcode)) {
throw new BusinessException("通过流程生产订单主键【" + cbmoid + "】查询不到对应的单据号,请检查数据");
}
itemMap.put("vbmobillcode", vbillcode);
}
} catch (Exception e) {
if (e instanceof BusinessException) {
throw e;
}
throw new BusinessException("处理MES字段失败" + e.getMessage());
}
}
/**
* 判断是否为MES用户
* 通过获取线程上下文中的用户编码来判断是否为MES用户
* @param itemMap 表体信息保留参数以保持方法签名一致性
* @return 是否为MES用户
*/
private boolean isMESUser(Map<String, Object> itemMap) {
try {
// 获取当前线程上下文中的用户编码
String userCode = InvocationInfoProxy.getInstance().getUserCode();
// 判断用户编码是否为MES
return "MES".equals(userCode);
} catch (Exception e) {
// 如果获取用户编码失败记录日志并返回false
Log.getInstance("mm-mes").error("获取用户编码失败:" + e.getMessage(), e);
return false;
}
}
/**
* 处理仓库转换将原有的仓库转换逻辑包装成独立函数
* @param qualityInfos 质量信息列表
* @param baseDAO 数据库操作对象
* @throws BusinessException 转换失败时抛出异常
*/
private void processWarehouseConversion(List<Map<String, Object>> qualityInfos, BaseDAO baseDAO)
throws BusinessException {
if (qualityInfos == null || qualityInfos.isEmpty()) {
return;
}
for (Map<String, Object> qualityInfo : qualityInfos) {
if (qualityInfo.containsKey("cgwarehouseid") && MMValueCheck.isNotEmpty(qualityInfo.get("cgwarehouseid"))) {
String warehouseValue = String.valueOf(qualityInfo.get("cgwarehouseid"));
String warehousePk = convertWarehouseCodeToPk(warehouseValue, baseDAO);
qualityInfo.put("cgwarehouseid", warehousePk);
}
}
}
/**
* 转换仓库编码为主键
* 首先假设传入值是主键如果查询不到再假设是编码进行查询
* @param warehouseValue 仓库值可能是主键或编码
* @param baseDAO 数据库操作对象
* @return 仓库主键
* @throws BusinessException 如果仓库不存在
*/
private String convertWarehouseCodeToPk(String warehouseValue, BaseDAO baseDAO) throws BusinessException {
if (MMValueCheck.isEmpty(warehouseValue)) {
return warehouseValue;
}
try {
// 首先假设是主键直接查询
String sql = "SELECT pk_stordoc FROM bd_stordoc WHERE pk_stordoc = ? AND dr = 0";
SQLParameter param = new SQLParameter();
param.addParam(warehouseValue);
String result = (String) baseDAO.executeQuery(sql, param, new ColumnProcessor());
if (MMValueCheck.isNotEmpty(result)) {
// 主键查询成功直接返回
return warehouseValue;
}
// 主键查询失败假设是编码查询
sql = "SELECT pk_stordoc FROM bd_stordoc WHERE code = ? AND dr = 0";
param = new SQLParameter();
param.addParam(warehouseValue);
result = (String) baseDAO.executeQuery(sql, param, new ColumnProcessor());
if (MMValueCheck.isNotEmpty(result)) {
// 编码查询成功返回主键
return result;
}
// 都查询不到抛出异常
throw new BusinessException("仓库【" + warehouseValue + "】不存在,请检查仓库编码或主键");
} catch (Exception e) {
if (e instanceof BusinessException) {
throw e;
}
throw new BusinessException("查询仓库信息失败:" + e.getMessage());
}
}
} }