diff --git a/mmpac/src/public/nccloud/openapi/mmpac/wr/WrResource.java b/mmpac/src/public/nccloud/openapi/mmpac/wr/WrResource.java index e291e10..7e640e9 100644 --- a/mmpac/src/public/nccloud/openapi/mmpac/wr/WrResource.java +++ b/mmpac/src/public/nccloud/openapi/mmpac/wr/WrResource.java @@ -1,18 +1,18 @@ package nccloud.openapi.mmpac.wr; + import nc.bs.dao.BaseDAO; +import nc.bs.framework.common.InvocationInfoProxy; import nc.bs.framework.common.NCLocator; import nc.bs.logging.Log; 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.MMCollectionUtil; import nc.util.mmf.framework.base.MMNumberUtil; import nc.util.mmf.framework.base.MMValueCheck; -import nc.vo.mmpac.wr.entity.AggWrVO; -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.entity.*; import nc.vo.mmpac.wr.enumeration.WrBillStatusEnum; import nc.vo.pub.BusinessException; import nc.vo.pub.VOStatus; @@ -31,14 +31,7 @@ import javax.ws.rs.Consumes; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; -import java.util.ArrayList; -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; +import java.util.*; @Path("mmpac/wr") public class WrResource extends AbstractNCCRestResource { @@ -312,6 +305,9 @@ public class WrResource extends AbstractNCCRestResource { Map bodyInfo = (Map) paramMap.get(BODYTABLE); itemInfos.add(bodyInfo); } + + // 预处理数据:处理仓库转换和MES相关字段 + preProcessMesData(headInfo, itemInfos, baseDAO); AggWrVO vo = new AggWrVO(); WrVO head = new WrVO(); head.setPk_group(AppContext.getInstance().getPkGroup()); @@ -577,9 +573,169 @@ public class WrResource extends AbstractNCCRestResource { } server.delete(deleteVos.toArray(new AggWrVO[0])); return ResultMessageUtil.toJSON(new String[0], "生产报告删除成功"); - } catch (Exception e) { - return ResultMessageUtil.exceptionToJSON(e); + } catch (Exception e) { return ResultMessageUtil.exceptionToJSON(e); } } + /** + * 预处理数据:包含仓库转换和MES相关字段处理 + * @param headInfo 表头信息 + * @param itemInfos 表体信息列表 + * @param baseDAO 数据库操作对象 + * @throws BusinessException 处理失败时抛出异常 + */ + private void preProcessMesData(Map headInfo, List> itemInfos, BaseDAO baseDAO) + throws BusinessException { + // 处理表体信息中的数据转换 + for (Map itemMap : itemInfos) { + // 处理MES相关字段自动赋值 + processMESFields(itemMap, baseDAO); + + // 处理质量信息中的仓库转换 + if (itemMap.containsKey(QUALITYTABLE)) { + List> qualityInfos = (List>) 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 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 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> qualityInfos, BaseDAO baseDAO) + throws BusinessException { + if (qualityInfos == null || qualityInfos.isEmpty()) { + return; + } + + for (Map 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()); + } + } }