diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/info/service/impl/PdmBiContainerinfoServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/info/service/impl/PdmBiContainerinfoServiceImpl.java index 62f8f24ce..6fb9f2f4e 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/info/service/impl/PdmBiContainerinfoServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/info/service/impl/PdmBiContainerinfoServiceImpl.java @@ -95,7 +95,7 @@ public class PdmBiContainerinfoServiceImpl extends ServiceImpl= 3) { + // 清理特殊字符:移除 Φ 和 mm + result[0] = cleanSizeValue(parts[0]); // Φ152.4mm → 152.4 + result[1] = cleanSizeValue(parts[1]); // 1100mm → 1100 + result[2] = cleanSizeValue(parts[2]); // 15/20mm → 15/20 + } + + } catch (Exception e) { + log.warn("解析尺寸信息失败: {}", sizeInfo, e); + } + return result; + } + + /** + * 清理尺寸值中的特殊字符 + * @param value 原始值,如 Φ152.4mm、1100mm、15/20mm + * @return 清理后的纯数值,如 152.4、1100、15/20 + */ + public static String cleanSizeValue(String value) { + if (ObjectUtil.isEmpty(value)) { + return "0"; + } + + // 移除 Φ、mm 等特殊字符,保留数字、小数点、斜杠 + return value.trim() + .replace("Φ", "") + .replace("mm", "") + .replace("MM", "") + .replace("''", "") + .trim(); + } + /** + * 从 FRP 管型号中提取长度(mm) + * @param frpModel FRP管型号描述,如 FRP管\玻璃纤维+环氧树脂\Φ152.4mm*1100mm*15/20mm\ + * @return 长度字符串,如 "1100" + */ + public static String extractFRPLength(String frpModel) { + if (ObjectUtil.isEmpty(frpModel)) { + return "0"; + } + + try { + String[] sizeParams = parseFRPSizeInfo(frpModel); + return sizeParams[1]; // 返回长度 + } catch (Exception e) { + log.warn("提取FRP管长度失败: {}", frpModel, e); + return "0"; + } + } + + /** + * 从 FRP 管型号中提取壁厚 + * @param frpModel FRP管型号描述,如 FRP管\玻璃纤维+环氧树脂\Φ152.4mm*1100mm*15/20mm\ + * @return 壁厚字符串,单壁厚如 "15",双壁厚如 "15/20" + */ + public static String extractFRPWallThickness(String frpModel) { + if (ObjectUtil.isEmpty(frpModel)) { + return "0"; + } + + try { + String[] sizeParams = parseFRPSizeInfo(frpModel); + return sizeParams[2]; // 返回壁厚 + } catch (Exception e) { + log.warn("提取FRP管壁厚失败: {}", frpModel, e); + return "0"; + } + } + + /** + * 从 FRP 管型号中提取外径(mm) + * @param frpModel FRP管型号描述,如 FRP管\玻璃纤维+环氧树脂\Φ152.4mm*1100mm*15/20mm\ + * @return 外径字符串,如 "152.4" + */ + public static String extractFRPTubeSizeOrag(String frpModel) { + if (ObjectUtil.isEmpty(frpModel)) { + return "0"; + } + + try { + String[] sizeParams = parseFRPSizeInfo(frpModel); + return sizeParams[0]; + } catch (Exception e) { + log.warn("提取FRP管外径失败: {}", frpModel, e); + return "0"; + } + } + + /** + * 从 FRP 管型号中提取外径(mm) + * @param tubeModel FRP管型号描述,如 FRP管\玻璃纤维+环氧树脂\Φ152.4mm*1100mm*15/20mm\ + * @return 外径字符串,如 "152.4 / 25.4 = 6" + */ + public static String extractFRPTubeSizeTrans(String tubeModel) { + if (ObjectUtil.isEmpty(tubeModel)) { + return ""; + } + try { + // 清理末尾反斜杠 + String cleanStr = tubeModel.trim().replaceAll("\\\\+$", ""); + String[] parts = cleanStr.split("\\\\"); + + if (parts.length >= 3) { + // 解析尺寸信息:[外径, 长度, 壁厚] + String sizeInfo = parts[2]; + String[] sizeParams = parseFRPSizeInfo(sizeInfo); + // 外径mm,如 "152.4" + String externalDiameter = sizeParams[0]; + // 将毫米转换为英寸 + if (ObjectUtil.isNotEmpty(externalDiameter) && !"0".equals(externalDiameter)) { + double diameterMm = Double.parseDouble(externalDiameter); + double diameterInch = diameterMm / 25.4; + // 保留整数或一位小数 + return String.valueOf(NumberUtil.round(diameterInch, 1).doubleValue()); + } + } + } catch (Exception e) { + log.warn("提取纸管尺寸失败: {}", tubeModel, e); + } + return ""; + } + + + // ================================================== + //==================== 纸管解析方法 =================== + //=================================================== + /** + * 从纸管型号中提取尺寸(英寸) + * @param paperTubeModel 纸管型号描述,如 平包树脂管\3''\500mm*15mm\ + * @return 英寸数值字符串,如 "3" + */ + public static String extractPaperTubeSize(String paperTubeModel) { + if (ObjectUtil.isEmpty(paperTubeModel)) { + return "0"; + } + + try { + // 清理末尾反斜杠 + String cleanStr = paperTubeModel.trim().replaceAll("\\\\+$", ""); + String[] parts = cleanStr.split("\\\\"); + + if (parts.length >= 2) { + // 第二部分是尺寸:3'' + String sizePart = parts[1]; + // 移除 '' 符号 + String cleaned =cleanSizeValue(sizePart); + double num = Double.parseDouble(cleaned); + // 四舍五入取整数 + long rounded = Math.round(num); + return rounded + ".0"; + } + } catch (Exception e) { + log.warn("提取纸管尺寸失败: {}", paperTubeModel, e); + } + + return "0"; + } + + /** + * 从纸管型号中提取长度和壁厚 + * @param paperTubeModel 纸管型号描述,如 平包树脂管\3''\500mm*15mm\ + * @return String数组 [长度, 壁厚],如 ["500", "15"] + */ + public static String[] extractPaperTubeSpecs(String paperTubeModel) { + String[] result = new String[]{"0", "0"}; + + if (ObjectUtil.isEmpty(paperTubeModel)) { + return result; + } + + try { + // 清理末尾反斜杠 + String cleanStr = paperTubeModel.trim().replaceAll("\\\\+$", ""); + String[] parts = cleanStr.split("\\\\"); + + if (parts.length >= 3) { + // 第三部分是规格:500mm*15mm + String specPart = parts[2]; + String[] specs = specPart.split("\\*"); + + if (specs.length >= 2) { + result[0] = cleanSizeValue(specs[0]); // 长度:500 + result[1] = cleanSizeValue(specs[1]); // 壁厚:15 + } else if (specs.length == 1) { + result[0] = cleanSizeValue(specs[0]); // 只有长度 + } + } + } catch (Exception e) { + log.warn("提取纸管规格失败: {}", paperTubeModel, e); + } + + return result; + } + + // ================================================== + //==================== 木箱解析方法 =================== + //=================================================== + /** + * 从木箱型号中提取关键信息 + * @param woodenBoxModel 木箱型号描述,如 铜箔木箱\1100/1/6\1148mm*636mm*690mm\非熏蒸\U60 + * @return String数组 [数量/层数/其他],如 ["1100", "1", "6"] + */ + public static String[] parseMxBoxDetailInfo(String woodenBoxModel) { + String[] result = new String[]{"0", "0", "0"}; + + if (ObjectUtil.isEmpty(woodenBoxModel)) { + return result; + } + + try { + // 清理末尾反斜杠 + String cleanStr = woodenBoxModel.trim().replaceAll("\\\\+$", ""); + String[] parts = cleanStr.split("\\\\"); + + if (parts.length >= 2) { + // 第二部分是关键信息:1100/1/6 + String keyInfo = parts[1]; + // 按 / 分割 + String[] infoParts = keyInfo.split("/"); + + if (infoParts.length >= 3) { + result[0] = infoParts[0].trim(); // 1100 + result[1] = infoParts[1].trim(); // 1 + result[2] = infoParts[2].trim(); // 6 + } else if (infoParts.length == 2) { + result[0] = infoParts[0].trim(); + result[1] = infoParts[1].trim(); + result[2] = ""; + } else if (infoParts.length == 1) { + result[0] = infoParts[0].trim(); + result[1] = ""; + result[2] = ""; + } + } + } catch (Exception e) { + log.warn("解析木箱信息失败: {}", woodenBoxModel, e); + } + return result; + } + + + } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/util/SlitterTaskUtil.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/util/SlitterTaskUtil.java index 47788fcae..eb8adf5d2 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/util/SlitterTaskUtil.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/util/SlitterTaskUtil.java @@ -52,6 +52,19 @@ public class SlitterTaskUtil { return getComposePaperTubeInformation(tubeDescription, plan.getPaper_tube_or_FRP()); } + /** + * 获取组成信息 + * @param tubeDescription 纸管信息 + * @param paperOrFrp 材质(1纸管,2FRP管) + * @return 长*外径*内径*壁厚*重量*薄壁厚*阶梯长度*材质(1纸管,2FRP管) + */ + public static String getComposePaperTubeInformationOld(String tubeDescription, String paperOrFrp) { + if (ObjectUtil.isEmpty(tubeDescription)) { + return ""; + } + return getComposePaperTubeInformationOld(tubeDescription) + "*" + paperOrFrp; + } + /** * 获取组成信息 * @param tubeDescription 纸管信息 @@ -74,6 +87,109 @@ public class SlitterTaskUtil { if (ObjectUtil.isEmpty(tubeDescription)) { return ""; } + try { + tubeDescription = tubeDescription.trim().replaceAll("\\\\+$", ""); + // 解析描述数组 + String[] tubeArray = tubeDescription.split("\\\\"); + if (tubeArray.length < 3) { + log.warn("管件描述格式错误: {}", tubeDescription); + return ""; + } + String length = "0"; + double externalDiameter = 0; + double internalDiameter= 0; + String th ; // 主壁厚 + String th2 ; // 薄壁厚 + String jtLen = "0";; + // 区分是纸管还是FRP管 + if(tubeDescription.contains("FRP管")){ + // 获取尺寸信息部分(第3段) + String sizeInfo = tubeArray[2]; + //解析尺寸:[外径, 长度, 壁厚] + String[] sizeParams = MdmDescriptionParseUtils.parseFRPSizeInfo(sizeInfo); + // 152.4 + String externalDiameterStr = sizeParams[0]; + // 1100 + length = sizeParams[1]; + // 15/20 或 15 + String wallThickness = sizeParams[2]; // 15/20 或 15 + + // //是否为阶梯 + boolean flag = wallThickness.contains("/"); + if (ObjectUtil.isEmpty(wallThickness) || "0".equals(wallThickness)) { + th = "15"; + th2 = "0"; + } else if (flag) { + // 双壁厚格式:15/20 → th2=15(薄), th=20(厚) + String[] thicknessArray = wallThickness.split("/"); + th2 = thicknessArray[0].trim(); // 15 + th = thicknessArray[1].trim(); // 20 + } else { + // 单壁厚格式:15 → th=15, th2=0 + th = wallThickness.trim(); + th2 = "0"; + } + // 计算外径和内径 + double diaOrg = ObjectUtil.isNotEmpty(externalDiameterStr) && !"0".equals(externalDiameterStr) + ? Double.parseDouble(externalDiameterStr) : 0; + double wallTh = Double.parseDouble(th); + + // 判断阶梯长度 + if (flag) { + switch (length) { + case "1400": + case "1700": + jtLen = "75"; + break; + case "1500": + case "1600": + jtLen = "150"; + break; + } + } + // 计算外径和内径 + externalDiameter = diaOrg + (wallTh * 2); + internalDiameter = diaOrg; + }else{ + // 定义尺寸与长度 + String diaStr =MdmDescriptionParseUtils.extractPaperTubeSize(tubeDescription); + double dia = Double.parseDouble(diaStr); + + // 假设壁厚默认值为15,如果描述数组长度为4,则重新赋值 + String[] strings = MdmDescriptionParseUtils.extractPaperTubeSpecs(tubeDescription); + length = strings[0]; + th = strings[1]; + th2 = "0"; + // 计算外径和内径 + externalDiameter = dia * 25.4 + Double.parseDouble(th) * 2; + internalDiameter = dia * 25.4; + } + + //构建结果:长*外径*内径*壁厚*重量*薄壁厚*阶梯长度 + StringBuilder sb = new StringBuilder(); + sb.append(length).append("*"); + sb.append(NumberUtil.round(externalDiameter, 1).doubleValue()).append("*"); + sb.append(NumberUtil.round(internalDiameter, 1).doubleValue()).append("*"); + sb.append(th).append("*"); + sb.append(0).append("*"); + sb.append(th2).append("*"); + sb.append(jtLen); + return sb.toString(); + }catch (Exception e){ + log.error("解析纸管描述异常: {}", tubeDescription, e); + return ""; + } + } + + /** + * 获取组成信息 + * @param tubeDescription 纸管信息 + * @return 长*外径*内径*壁厚*重量*薄壁厚*阶梯长度 + */ + public static String getComposePaperTubeInformationOld(String tubeDescription) { + if (ObjectUtil.isEmpty(tubeDescription)) { + return ""; + } boolean flag = tubeDescription.contains("阶梯"); tubeDescription = tubeDescription.replaceAll("\\|[\\u4e00-\\u9fa5]+$", ""); // 解析描述数组 @@ -134,96 +250,19 @@ public class SlitterTaskUtil { } public static void main(String[] args) { - String a = "玻璃纤维及其制品|FRP管|6英寸|15-25|1700|阶梯"; - String b = "FRP管\\玻璃纤维+环氧树脂\\Φ152.4mm*1700mm*15/25mm\\"; -// System.out.println(getComposePaperTubeInformation("玻璃纤维及其制品|FRP管|6英寸|15|1100", "1")); - System.out.println(test(b)); - System.out.println(getComposePaperTubeInformation(a)); + System.out.println("【测试1】单壁厚:"); + System.out.println("old: "+getComposePaperTubeInformationOld("纸制筒管|纸管|3.15英寸|1500", "1")); + System.out.println("new: "+getComposePaperTubeInformation("平包树脂管\\3.15''\\1500mm*15mm\\", "1")); + System.out.println("【测试2】阶梯1:"); + System.out.println("old: "+getComposePaperTubeInformationOld("玻璃纤维及其制品|FRP管|6英寸|15-20|1100|阶梯", "1")); + System.out.println("new: "+getComposePaperTubeInformation("FRP管\\玻璃纤维+环氧树脂\\Φ152.4mm*1100mm*15/20mm\\", "1")); +// System.out.println(isNumeric(",3000")); +// System.out.println(isNumeric("3000")); +// System.out.println(isNumeric("3000.32")); +// System.out.println(isNumeric("-3000.32")); +// boolean b = checkComplete("1", "2", null); } - - /** - * 适配新格式:FRP管\玻璃纤维+环氧树脂\P152.4mm*1700mm*15/20mm\ - */ - public static String test(String tubeDescription) { - if (ObjectUtil.isEmpty(tubeDescription)) { - return ""; - } - - // 1. 按 \ 分割 - String[] parts = tubeDescription.split("\\\\"); // 反斜杠需要转义 - if (parts.length < 3) { - return ""; - } - - // 2. 拿到规格段:P152.4mm*1700mm*15/20mm - String spec = parts[2]; - // 去掉 P 和所有 mm 单位 - spec = spec.replace("Φ", "").replace("mm", ""); - // 按 * 分割 → [152.4, 1700, 15/20] - String[] specArr = spec.split("\\*"); - if (specArr.length < 3) { - return ""; - } - - // 3. 提取核心参数 - String internalDiaStr = specArr[0]; // 内径 152.4 - String lengthStr = specArr[1]; // 长度 1700 - String thicknessStr = specArr[2]; // 壁厚 15/20 - - // 解析壁厚(15/25 → th=25, th2=15,和旧格式保持一致) - String th = "15"; - String th2 = "0"; - if (thicknessStr.contains("/")) { - String[] thArr = thicknessStr.split("/"); - if (thArr.length >= 2) { - th2 = thArr[0]; // 薄壁厚 - th = thArr[1]; // 主壁厚 - } - } else { - th = thicknessStr; - } - - // 5. 计算外径 = 内径 + 壁厚*2 - double internalDiameter = Double.parseDouble(internalDiaStr); - double externalDiameter = internalDiameter + Double.parseDouble(th) * 2; - - // 6. 阶梯长度(根据长度判断) - String jtLen = "0"; - switch (lengthStr) { - case "1400": - case "1700": - jtLen = "75"; - break; - case "1500": - case "1600": - jtLen = "150"; - break; - default: - jtLen = "0"; - break; - } - - // 7. 拼接输出(保持原来的输出格式不变) - // 格式:长度*外径*内径*壁厚*重量*薄壁厚*阶梯长度 - StringBuilder sb = new StringBuilder(); - sb.append(lengthStr); // 长度 - sb.append("*"); - sb.append(NumberUtil.round(externalDiameter, 1).doubleValue()); // 外径 - sb.append("*"); - sb.append(internalDiameter); // 内径 - sb.append("*"); - sb.append(th); // 壁厚 - sb.append("*"); - sb.append(0); // 重量 - sb.append("*"); - sb.append(th2); // 阶梯壁厚 - sb.append("*"); - sb.append(jtLen); // 阶梯长度 - - return sb.toString(); - } - /** * 设置所需的套管纸管信息 * @param param 任务参数 @@ -232,23 +271,24 @@ public class SlitterTaskUtil { public static void putNeedPaperSpec(JSONObject param, List needPlans) { log.info("正在设置所需的套管纸管信息..."); // 纸制筒管|纸管|6英寸|1300 or 纸制筒管|纸管|3英寸|12|650 + // todo 88549333 因为新物料描述 纸管和 frp管的尺寸位置不一致,所以之前的取数组第三位的写法就存在问题,现修改为根据不同的类型分别获取。 2026年05月19日 21:26 for (PdmBiSlittingproductionplan plan : needPlans) { if (SlitterConstant.SLITTER_SUB_VOLUME_LEFT.equals(plan.getLeft_or_right())) { if (SlitterConstant.SLITTER_TYPE_PAPER.equals(plan.getPaper_tube_or_FRP())) { param.put("left", plan.getPaper_tube_material()); - param.put("leftSize", plan.getPaper_tube_model().split("\\|")[2].charAt(0)); + param.put("leftSize", MdmDescriptionParseUtils.extractPaperTubeSize(plan.getPaper_tube_model())); } else { param.put("left", plan.getFRP_material()); - param.put("leftSize", plan.getFRP_model().split("\\|")[2].charAt(0)); + param.put("leftSize",MdmDescriptionParseUtils.extractFRPTubeSizeTrans(plan.getFRP_model())); } param.put("leftSpec", SlitterTaskUtil.getPaperTubeInformation(plan)); } else { if (SlitterConstant.SLITTER_TYPE_PAPER.equals(plan.getPaper_tube_or_FRP())) { param.put("right", plan.getPaper_tube_material()); - param.put("rightSize", plan.getPaper_tube_model().split("\\|")[2].charAt(0)); + param.put("rightSize", MdmDescriptionParseUtils.extractPaperTubeSize(plan.getPaper_tube_model())); } else { param.put("right", plan.getFRP_material()); - param.put("rightSize", plan.getFRP_model().split("\\|")[2].charAt(0)); + param.put("rightSize", MdmDescriptionParseUtils.extractFRPTubeSizeTrans(plan.getFRP_model())); } param.put("rightSpec", SlitterTaskUtil.getPaperTubeInformation(plan)); } @@ -261,23 +301,24 @@ public class SlitterTaskUtil { * @param oldPlans 老的分切计划 */ public static void putCurrentPaperSpec(JSONObject param, List oldPlans) { + // todo 88549333 因为新物料描述 纸管和 frp管的尺寸位置不一致,所以之前的取数组第三位的写法就存在问题,现修改为根据不同的类型分别获取。 2026年05月19日 21:26 for (PdmBiSlittingproductionplan plan : oldPlans) { if (SlitterConstant.SLITTER_SUB_VOLUME_LEFT.equals(plan.getLeft_or_right())) { if (SlitterConstant.SLITTER_TYPE_PAPER.equals(plan.getPaper_tube_or_FRP())) { param.put("currentLeft", plan.getPaper_tube_material()); - param.put("currentLeftSize", plan.getPaper_tube_model().split("\\|")[2].charAt(0)); + param.put("currentLeftSize", MdmDescriptionParseUtils.extractPaperTubeSize(plan.getPaper_tube_model())); } else { param.put("currentLeft", plan.getFRP_material()); - param.put("currentLeftSize", plan.getFRP_model().split("\\|")[2].charAt(0)); + param.put("currentLeftSize", MdmDescriptionParseUtils.extractFRPTubeSizeTrans(plan.getFRP_model())); } param.put("currentLeftSpec", SlitterTaskUtil.getPaperTubeInformation(plan)); } else { if (SlitterConstant.SLITTER_TYPE_PAPER.equals(plan.getPaper_tube_or_FRP())) { param.put("currentRight", plan.getPaper_tube_material()); - param.put("currentRightSize", plan.getPaper_tube_model().split("\\|")[2].charAt(0)); + param.put("currentRightSize", MdmDescriptionParseUtils.extractPaperTubeSize(plan.getPaper_tube_model())); } else { param.put("currentRight", plan.getFRP_material()); - param.put("currentRightSize", plan.getFRP_model().split("\\|")[2].charAt(0)); + param.put("currentRightSize", MdmDescriptionParseUtils.extractFRPTubeSizeTrans(plan.getFRP_model())); } param.put("currentRightSpec", SlitterTaskUtil.getPaperTubeInformation(plan)); } @@ -371,14 +412,15 @@ public class SlitterTaskUtil { int index = getIndex(material_codes, materialCode); qtys[index] += qty; } else { + // todo 88549333 这个地方的判断也有问题,新物料没有4开头的,所以不采用编码是不是4 开头判断 而是采用,描述中是否有frp管字样 2026年05月19日 22:01 material_codes[i] = vehicle.getMaterial_code(); - String spec = getComposePaperTubeInformation(vehicle.getMaterial_name(), vehicle.getMaterial_code().startsWith("4") ? "1" : "2"); + String spec = getComposePaperTubeInformation(vehicle.getMaterial_name(), vehicle.getMaterial_name().contains("FRP") ? "2" : "1"); material_specs[i] = spec; qtys[i] = qty; } //新规格数据处理 int row_num = Integer.parseInt(vehicle.getRow_num()); - String spec = getComposePaperTubeInformation(vehicle.getMaterial_name(), vehicle.getMaterial_code().startsWith("4") ? "1" : "2"); + String spec = getComposePaperTubeInformation(vehicle.getMaterial_name(), vehicle.getMaterial_name().contains("FRP") ? "2" : "1"); material_codes1[row_num-1] = materialCode; material_specs1[row_num-1] = spec; qtys1[row_num-1] = qty; @@ -436,15 +478,19 @@ public class SlitterTaskUtil { * @return / */ public static String getPaperLength(PdmBiSlittingproductionplan plan) { -// String s = "玻璃纤维及其制品|FRP管|6英寸|15|1700"; +// String s = "玻璃纤维及其制品|FRP管|6英寸|15-20|1100|阶梯"; + // todo 88549333 因为新物料描述 纸管和 frp管的尺寸位置不一致,所以之前的取数组第三位的写法就存在问题,现修改为根据不同的类型分别获取。 2026年05月19日 20:26 String paperStr = ""; + String length = ""; if (plan.getPaper_tube_or_FRP().equals(SlitterConstant.SLITTER_TYPE_PAPER)) { paperStr = plan.getPaper_tube_model(); + String spec [] = MdmDescriptionParseUtils.extractPaperTubeSpecs(paperStr); + length = spec[0]; } else { paperStr = plan.getFRP_model(); + length = MdmDescriptionParseUtils.extractFRPLength(paperStr); } - String[] split = paperStr.replaceAll("\\|[\\u4e00-\\u9fa5]+$", "").split("\\|"); - return split[split.length - 1]; + return length; } /** @@ -465,17 +511,24 @@ public class SlitterTaskUtil { /** * 获取纸管长度 - * @param plan 分切计划 + * @param name 描述 * @return / */ public static String getPaperLengthByCode(String name) { // String name = "玻璃纤维及其制品|FRP管|6英寸|15|1700"; - String[] split = name.replaceAll("\\|[\\u4e00-\\u9fa5]+$", "").split("\\|"); - return split[split.length - 1]; + // todo 88549333 因为新物料描述 纸管和 frp管的尺寸位置不一致,所以之前的取数组第三位的写法就存在问题,现修改为根据不同的类型分别获取。 2026年05月19日 21:26 + String length = ""; + if(name.contains("FRP管")){ + length = MdmDescriptionParseUtils.extractFRPLength( name); + }else{ + String spec [] = MdmDescriptionParseUtils.extractPaperTubeSpecs(name); + length = spec[0]; + } + return length; } /** * 获取纸管长度 - * @param plan 分切计划 + * @param name 描述 * @return / */ public static Integer getPaperLengthByCodeInt(String name) { @@ -484,14 +537,17 @@ public class SlitterTaskUtil { } public static String getPaperSize(PdmBiSlittingproductionplan plan) { // String s = "玻璃纤维及其制品|FRP管|6英寸|15|1700"; - String paperStr = ""; + // todo 88549333 因为新物料描述 纸管和 frp管的尺寸位置不一致,所以之前的取数组第三位的写法就存在问题,现修改为根据不同的类型分别获取。 2026年05月19日 21:26 + String paperStr ; + String cc; if (plan.getPaper_tube_or_FRP().equals(SlitterConstant.SLITTER_TYPE_PAPER)) { paperStr = plan.getPaper_tube_model(); + cc = MdmDescriptionParseUtils.extractPaperTubeSize(paperStr); } else { paperStr = plan.getFRP_model(); + cc = MdmDescriptionParseUtils.extractFRPTubeSizeTrans(paperStr); } - String[] split = paperStr.replaceAll("\\|[\\u4e00-\\u9fa5]+$", "").split("\\|"); - return split[2].replaceAll("英寸",""); + return cc; } public static Integer getPaperLengthInt(PdmBiSlittingproductionplan plan) { diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/impl/StIvtIostorinvdtlServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/impl/StIvtIostorinvdtlServiceImpl.java index 0ce9ddbf6..fe2886af7 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/impl/StIvtIostorinvdtlServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/impl/StIvtIostorinvdtlServiceImpl.java @@ -125,8 +125,8 @@ public class StIvtIostorinvdtlServiceImpl extends ServiceImpl getRequestHeaders(HttpServletRequest request) { + Map headers = new HashMap<>(); + headers.put("Content-Type", request.getContentType()); + headers.put("User-Agent", request.getHeader("User-Agent")); + return headers; + } + + private String buildRequestParams(Method method, Object[] args) { + try { + if (args == null || args.length == 0) { + return "{}"; + } + return JSONUtil.toJsonStr(args); + } catch (Exception e) { + return "参数序列化失败"; + } + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/system/controller/sysapi/SysApiLogController.java b/lms/nladmin-system/src/main/java/org/nl/system/controller/sysapi/SysApiLogController.java new file mode 100644 index 000000000..c696c25bf --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/system/controller/sysapi/SysApiLogController.java @@ -0,0 +1,150 @@ +package org.nl.system.controller.sysapi; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.common.domain.query.PageQuery; +import org.nl.modules.logging.annotation.Log; +import org.nl.modules.wql.util.SpringContextHolder; +import org.nl.system.service.param.impl.SysParamServiceImpl; +import org.nl.system.service.sysapi.entity.SysApiLog; +import org.nl.system.service.sysapi.entity.SysApiLogHistory; +import org.nl.system.service.sysapi.entity.dto.ApiLogQuery; +import org.nl.system.service.sysapi.service.ISysApiLogHistoryService; +import org.nl.system.service.sysapi.service.ISysApiLogService; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author ManMan.Yang + * @version V1.1 + * @date 2026/5/14 + * @description 外部系统接口日志控制器 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/sysApiLog") +@Slf4j +public class SysApiLogController { + + private final ISysApiLogService apiLogService; + + private final ISysApiLogHistoryService apiLogHistoryService; + + /** + * 分页查询接口日志列表 + */ + @GetMapping + @Log("查询接口日志列表") + public ResponseEntity> query(ApiLogQuery query) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + + if (query.getDirection() != null) { + wrapper.eq(SysApiLog::getDirection, query.getDirection()); + } + + if (query.getSystemFlag() != null && !query.getSystemFlag().isEmpty()) { + wrapper.eq(SysApiLog::getSystemFlag, query.getSystemFlag()); + } + + if (query.getBizCode() != null && !query.getBizCode().isEmpty()) { + wrapper.eq(SysApiLog::getBizCode, query.getBizCode()); + } + + if (query.getTraceId() != null && !query.getTraceId().isEmpty()) { + wrapper.eq(SysApiLog::getTraceId, query.getTraceId()); + } + + if (query.getApiUrl() != null && !query.getApiUrl().isEmpty()) { + wrapper.like(SysApiLog::getApiUrl, query.getApiUrl()); + } + + if (query.getStatus() != null && !query.getStatus().isEmpty()) { + wrapper.eq(SysApiLog::getStatus, query.getStatus()); + } + + if (query.getBeginTime() != null && !query.getBeginTime().isEmpty()) { + wrapper.ge(SysApiLog::getCreateTime, query.getBeginTime()); + } + + if (query.getEndTime() != null && !query.getEndTime().isEmpty()) { + wrapper.le(SysApiLog::getCreateTime, query.getEndTime()); + } + + if (query.getKeyword() != null && !query.getKeyword().isEmpty()) { + wrapper.and(w -> w.like(SysApiLog::getBizDesc, query.getKeyword()) + .or().like(SysApiLog::getApiDesc, query.getKeyword()) + .or().like(SysApiLog::getRequestParams, query.getKeyword()) + .or().like(SysApiLog::getResponseBody, query.getKeyword())); + } + + wrapper.orderByDesc(SysApiLog::getCreateTime); + + Page page = new Page<>(query.getPage()+1, query.getSize()); + IPage result = apiLogService.page(page, wrapper); + + Map response = new HashMap<>(); + response.put("content", result.getRecords()); + response.put("totalElements", result.getTotal()); + response.put("totalPages", result.getPages()); + response.put("size", result.getSize()); + response.put("number", result.getCurrent()); + + return new ResponseEntity<>(response, HttpStatus.OK); + } + + /** + * 根据ID查询日志详情 + */ + @GetMapping("/{id}") + @Log("查询接口日志详情") + public ResponseEntity findById(@PathVariable String id) { + SysApiLog apiLog = apiLogService.getById(id); + return new ResponseEntity<>(apiLog, HttpStatus.OK); + } + + /** + * 获取业务类型列表(根据系统标识) + */ + @GetMapping("/bizCodeList") + @Log("获取业务类型列表") + public ResponseEntity>> getBizCodeList(@RequestParam String systemFlag, @RequestParam String direction) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SysApiLog::getSystemFlag, systemFlag) + .eq(SysApiLog::getDirection, direction) + .select(SysApiLog::getBizCode, SysApiLog::getBizDesc) + .groupBy(SysApiLog::getBizCode, SysApiLog::getBizDesc) + .orderByAsc(SysApiLog::getBizCode); + + List list = apiLogService.list(wrapper); + + List> result = list.stream() + .map(log -> { + Map map = new HashMap<>(); + map.put("bizCode", log.getBizCode()); + map.put("bizDesc", log.getBizCode() + " - " +log.getBizDesc()); + return map; + }) + .collect(Collectors.toList()); + + return new ResponseEntity<>(result, HttpStatus.OK); + } + + /** + * 日志归档 + */ + @PostMapping("/archive") + @Log("接口日志归档") + @Transactional(rollbackFor = Exception.class) + public ResponseEntity archiveLogs() { + return apiLogService.archiveLogs(); + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/system/service/quartz/config/JobRunner.java b/lms/nladmin-system/src/main/java/org/nl/system/service/quartz/config/JobRunner.java index c18855cac..5e9e76306 100644 --- a/lms/nladmin-system/src/main/java/org/nl/system/service/quartz/config/JobRunner.java +++ b/lms/nladmin-system/src/main/java/org/nl/system/service/quartz/config/JobRunner.java @@ -39,17 +39,17 @@ public class JobRunner implements ApplicationRunner { System.out.println("本机ip:"+localIp); log.info("--------------------注入定时任务---------------------"); - List quartzJobs = quartzJobService.findByIsPauseIsFalse(); - quartzJobs.forEach(job -> { - if (judgmentIp(job.getJob_ip())) { - log.info("定时任务:{}, 执行ip: {}, 定时任务开启", job.getJob_name(), localIp); - System.out.println("定时任务: " + job.getJob_name() + ", 执行ip: " + localIp + ", 定时任务开启"); - quartzManage.addJob(job); - } else { - log.info("定时任务 {} 未开启, 本机ip{} 与 调度ip{} 不同", job.getJob_name(), localIp, job.getJob_ip()); - System.out.println("定时任务 " + job.getJob_name() + " 未开启, 本机ip: " + localIp + " 与 调度ip: " + job.getJob_ip() + " 不同"); - } - }); +// List quartzJobs = quartzJobService.findByIsPauseIsFalse(); +// quartzJobs.forEach(job -> { +// if (judgmentIp(job.getJob_ip())) { +// log.info("定时任务:{}, 执行ip: {}, 定时任务开启", job.getJob_name(), localIp); +// System.out.println("定时任务: " + job.getJob_name() + ", 执行ip: " + localIp + ", 定时任务开启"); +// quartzManage.addJob(job); +// } else { +// log.info("定时任务 {} 未开启, 本机ip{} 与 调度ip{} 不同", job.getJob_name(), localIp, job.getJob_ip()); +// System.out.println("定时任务 " + job.getJob_name() + " 未开启, 本机ip: " + localIp + " 与 调度ip: " + job.getJob_ip() + " 不同"); +// } +// }); log.info("--------------------定时任务注入完成---------------------"); } diff --git a/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/entity/SysApiLog.java b/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/entity/SysApiLog.java new file mode 100644 index 000000000..a3018d871 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/entity/SysApiLog.java @@ -0,0 +1,85 @@ +package org.nl.system.service.sysapi.entity; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +import lombok.Data; + +/** + * @author ManMan.Yang + * @version V1.1 + * @date 2026/5/14 + * @description TODO + */ +@Data +@EqualsAndHashCode(callSuper = false) +@NoArgsConstructor +@TableName("sys_api_log") +@Accessors(chain = true) +public class SysApiLog implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId("log_id") + private String logId; + + @TableField("direction") + private Integer direction; + + @TableField("system_flag") + private String systemFlag; + + @TableField("biz_code") + private String bizCode; + + @TableField("biz_desc") + private String bizDesc; + + @TableField("api_url") + private String apiUrl; + + @TableField("api_desc") + private String apiDesc; + + @TableField("trace_id") + private String traceId; + + @TableField("request_method") + private String requestMethod; + + @TableField("request_ip") + private String requestIp; + + @TableField("request_headers") + private String requestHeaders; + + @TableField("request_params") + private String requestParams; + + @TableField("response_body") + private String responseBody; + + @TableField("response_status") + private Integer responseStatus; + + @TableField("cost_time") + private Long costTime; + + @TableField("status") + private String status; + + @TableField("error_msg") + private String errorMsg; + + @TableField("operator") + private String operator; + + @TableField("create_time") + private String createTime; +} diff --git a/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/entity/SysApiLogHistory.java b/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/entity/SysApiLogHistory.java new file mode 100644 index 000000000..191fc0dbd --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/entity/SysApiLogHistory.java @@ -0,0 +1,94 @@ +package org.nl.system.service.sysapi.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; +import org.springframework.beans.BeanUtils; + +import java.io.Serializable; + +/** + * 接口日志对象 sys_api_log_history + * + * @author ruoyi + * @date 2026-05-26 + */ + +@Data +@EqualsAndHashCode(callSuper = false) +@NoArgsConstructor +@Accessors(chain = true) +@TableName("sys_api_log_history") +public class SysApiLogHistory implements Serializable +{ + private static final long serialVersionUID = 1L; + + @TableId("log_id") + private String logId; + + @TableField("direction") + private Integer direction; + + @TableField("system_flag") + private String systemFlag; + + @TableField("biz_code") + private String bizCode; + + @TableField("biz_desc") + private String bizDesc; + + @TableField("api_url") + private String apiUrl; + + @TableField("api_desc") + private String apiDesc; + + @TableField("trace_id") + private String traceId; + + @TableField("request_method") + private String requestMethod; + + @TableField("request_ip") + private String requestIp; + + @TableField("request_headers") + private String requestHeaders; + + @TableField("request_params") + private String requestParams; + + @TableField("response_body") + private String responseBody; + + @TableField("response_status") + private Integer responseStatus; + + @TableField("cost_time") + private Long costTime; + + @TableField("status") + private String status; + + @TableField("error_msg") + private String errorMsg; + + @TableField("operator") + private String operator; + + @TableField("create_time") + private String createTime; + + //copy method + public static SysApiLogHistory adapter(SysApiLog sysApiLog){ + SysApiLogHistory sysApiLogHistory = new SysApiLogHistory(); + BeanUtils.copyProperties(sysApiLog,sysApiLogHistory); + return sysApiLogHistory; + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/entity/dto/ApiLogQuery.java b/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/entity/dto/ApiLogQuery.java new file mode 100644 index 000000000..2716887fc --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/entity/dto/ApiLogQuery.java @@ -0,0 +1,34 @@ +package org.nl.system.service.sysapi.entity.dto; +import lombok.Data; +import org.nl.common.domain.query.PageQuery; + +/** + * @author ManMan.Yang + * @version V1.1 + * @date 2026/5/14 + * @description 外部系统接口查询实体Vo类 + */ + +@Data +public class ApiLogQuery extends PageQuery { + + private Integer direction; + + private String systemFlag; + + private String bizCode; + + private String traceId; + + private String apiUrl; + + private String status; + + private String beginTime; + + private String endTime; + + private String keyword; + + +} diff --git a/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/mapper/SysApiLogHistoryMapper.java b/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/mapper/SysApiLogHistoryMapper.java new file mode 100644 index 000000000..8e083ae08 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/mapper/SysApiLogHistoryMapper.java @@ -0,0 +1,61 @@ +package org.nl.system.service.sysapi.mapper; + +import java.util.List; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.nl.system.service.sysapi.entity.SysApiLogHistory; + +/** + * 接口日志Mapper接口 + * + * @author ruoyi + * @date 2026-05-26 + */ +public interface SysApiLogHistoryMapper extends BaseMapper { + /** + * 查询接口日志 + * + * @param logId 接口日志主键 + * @return 接口日志 + */ + public SysApiLogHistory selectSysApiLogHistoryByLogId(String logId); + + /** + * 查询接口日志列表 + * + * @param sysApiLogHistory 接口日志 + * @return 接口日志集合 + */ + public List selectSysApiLogHistoryList(SysApiLogHistory sysApiLogHistory); + + /** + * 新增接口日志 + * + * @param sysApiLogHistory 接口日志 + * @return 结果 + */ + public int insertSysApiLogHistory(SysApiLogHistory sysApiLogHistory); + + /** + * 修改接口日志 + * + * @param sysApiLogHistory 接口日志 + * @return 结果 + */ + public int updateSysApiLogHistory(SysApiLogHistory sysApiLogHistory); + + /** + * 删除接口日志 + * + * @param logId 接口日志主键 + * @return 结果 + */ + public int deleteSysApiLogHistoryByLogId(String logId); + + /** + * 批量删除接口日志 + * + * @param logIds 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteSysApiLogHistoryByLogIds(String[] logIds); +} diff --git a/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/mapper/SysApiLogMapper.java b/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/mapper/SysApiLogMapper.java new file mode 100644 index 000000000..55519d5bf --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/mapper/SysApiLogMapper.java @@ -0,0 +1,16 @@ +package org.nl.system.service.sysapi.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.nl.system.service.sysapi.entity.SysApiLog; + +/** + * @author ManMan.Yang + * @version V1.1 + * @date 2026/5/14 + * @description TODO + */ + + +@Mapper +public interface SysApiLogMapper extends BaseMapper { +} diff --git a/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/service/ISysApiLogHistoryService.java b/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/service/ISysApiLogHistoryService.java new file mode 100644 index 000000000..1057b0823 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/service/ISysApiLogHistoryService.java @@ -0,0 +1,61 @@ +package org.nl.system.service.sysapi.service; + +import java.util.List; +import com.baomidou.mybatisplus.extension.service.IService; +import org.nl.system.service.sysapi.entity.SysApiLogHistory; + +/** + * 接口日志Service接口 + * + * @author ruoyi + * @date 2026-05-26 + */ +public interface ISysApiLogHistoryService extends IService { + /** + * 查询接口日志 + * + * @param logId 接口日志主键 + * @return 接口日志 + */ + public SysApiLogHistory selectSysApiLogHistoryByLogId(String logId); + + /** + * 查询接口日志列表 + * + * @param sysApiLogHistory 接口日志 + * @return 接口日志集合 + */ + public List selectSysApiLogHistoryList(SysApiLogHistory sysApiLogHistory); + + /** + * 新增接口日志 + * + * @param sysApiLogHistory 接口日志 + * @return 结果 + */ + public int insertSysApiLogHistory(SysApiLogHistory sysApiLogHistory); + + /** + * 修改接口日志 + * + * @param sysApiLogHistory 接口日志 + * @return 结果 + */ + public int updateSysApiLogHistory(SysApiLogHistory sysApiLogHistory); + + /** + * 批量删除接口日志 + * + * @param logIds 需要删除的接口日志主键集合 + * @return 结果 + */ + public int deleteSysApiLogHistoryByLogIds(String[] logIds); + + /** + * 删除接口日志信息 + * + * @param logId 接口日志主键 + * @return 结果 + */ + public int deleteSysApiLogHistoryByLogId(String logId); +} diff --git a/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/service/ISysApiLogService.java b/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/service/ISysApiLogService.java new file mode 100644 index 000000000..c8dbc5a02 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/service/ISysApiLogService.java @@ -0,0 +1,21 @@ +package org.nl.system.service.sysapi.service; +import com.baomidou.mybatisplus.extension.service.IService; +import org.apache.poi.ss.formula.functions.T; +import org.nl.system.service.sysapi.entity.SysApiLog; +import org.springframework.http.ResponseEntity; +import org.springframework.scheduling.annotation.Async; + +/** + * @author ManMan.Yang + * @version V1.1 + * @date 2026/5/14 + * @description TODO + */ + +public interface ISysApiLogService extends IService { + + @Async("apiLogExecutor") + void saveAsync(SysApiLog apiLog); + + ResponseEntity archiveLogs(); +} diff --git a/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/service/OutboundApiLogger.java b/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/service/OutboundApiLogger.java new file mode 100644 index 000000000..d59889738 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/service/OutboundApiLogger.java @@ -0,0 +1,71 @@ +package org.nl.system.service.sysapi.service; +import cn.hutool.core.date.DateUtil; +import cn.hutool.json.JSONUtil; +import lombok.extern.slf4j.Slf4j; +import org.nl.common.utils.IdUtil; +import org.nl.system.service.sysapi.entity.SysApiLog; +import org.slf4j.MDC; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * @author ManMan.Yang + * @version V1.1 + * @date 2026/5/14 + * @description 外部系统外出接口出口日志记录Logger + */ + + +@Component +@Slf4j +public class OutboundApiLogger { + + private static ISysApiLogService apiLogService; + + @Autowired + public void setApiLogService(ISysApiLogService service) { + OutboundApiLogger.apiLogService = service; + } + + public static void log(String systemFlag, String bizCode, String bizDesc, + String apiUrl, String requestMethod, String requestParams, + String responseBody, Integer responseStatus, Long costTime, + String status, String errorMsg) { + try { + SysApiLog logEntity = new SysApiLog(); + logEntity.setLogId(IdUtil.getStringId()); + logEntity.setDirection(0); + logEntity.setSystemFlag(systemFlag); + logEntity.setBizCode(bizCode); + logEntity.setBizDesc(bizDesc); + logEntity.setTraceId(MDC.get("traceId")); + logEntity.setApiUrl(apiUrl); + logEntity.setRequestMethod(requestMethod); + logEntity.setRequestParams(requestParams); + logEntity.setResponseBody(responseBody); + logEntity.setResponseStatus(responseStatus); + logEntity.setCostTime(costTime); + logEntity.setStatus(status); + logEntity.setErrorMsg(errorMsg); + logEntity.setCreateTime(DateUtil.now()); + + apiLogService.saveAsync(logEntity); + } catch (Exception e) { + log.error("记录出站接口日志失败", e); + } + } + + public static void logSuccess(String systemFlag, String bizType, String bizDesc, + String apiUrl, String requestMethod, String requestParams, + String responseBody, Integer responseStatus, Long costTime) { + log(systemFlag, bizType, bizDesc, apiUrl, requestMethod, requestParams, + responseBody, responseStatus, costTime, "SUCCESS", null); + } + + public static void logFail(String systemFlag, String bizType, String bizDesc, + String apiUrl, String requestMethod, String requestParams, + String errorMsg, Long costTime) { + log(systemFlag, bizType, bizDesc, apiUrl, requestMethod, requestParams, + null, null, costTime, "FAIL", errorMsg); + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/service/SysApiLogHistoryServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/service/SysApiLogHistoryServiceImpl.java new file mode 100644 index 000000000..0f591c6e3 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/service/SysApiLogHistoryServiceImpl.java @@ -0,0 +1,88 @@ +package org.nl.system.service.sysapi.service; + +import com.alibaba.fastjson2.util.DateUtils; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import java.util.List; + +import org.nl.system.service.sysapi.entity.SysApiLogHistory; +import org.nl.system.service.sysapi.mapper.SysApiLogHistoryMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 接口日志Service业务层处理 + * + * @author ruoyi + * @date 2026-05-26 + */ +@Service +public class SysApiLogHistoryServiceImpl extends ServiceImpl implements ISysApiLogHistoryService { + @Autowired + private SysApiLogHistoryMapper sysApiLogHistoryMapper; + + /** + * 查询接口日志 + * + * @param logId 接口日志主键 + * @return 接口日志 + */ + @Override + public SysApiLogHistory selectSysApiLogHistoryByLogId(String logId) { + return sysApiLogHistoryMapper.selectSysApiLogHistoryByLogId(logId); + } + + /** + * 查询接口日志列表 + * + * @param sysApiLogHistory 接口日志 + * @return 接口日志 + */ + @Override + public List selectSysApiLogHistoryList(SysApiLogHistory sysApiLogHistory) { + return sysApiLogHistoryMapper.selectSysApiLogHistoryList(sysApiLogHistory); + } + + /** + * 新增接口日志 + * + * @param sysApiLogHistory 接口日志 + * @return 结果 + */ + @Override + public int insertSysApiLogHistory(SysApiLogHistory sysApiLogHistory) { + return sysApiLogHistoryMapper.insertSysApiLogHistory(sysApiLogHistory); + } + + /** + * 修改接口日志 + * + * @param sysApiLogHistory 接口日志 + * @return 结果 + */ + @Override + public int updateSysApiLogHistory(SysApiLogHistory sysApiLogHistory) { + return sysApiLogHistoryMapper.updateSysApiLogHistory(sysApiLogHistory); + } + + /** + * 批量删除接口日志 + * + * @param logIds 需要删除的接口日志主键 + * @return 结果 + */ + @Override + public int deleteSysApiLogHistoryByLogIds(String[] logIds) { + return sysApiLogHistoryMapper.deleteSysApiLogHistoryByLogIds(logIds); + } + + /** + * 删除接口日志信息 + * + * @param logId 接口日志主键 + * @return 结果 + */ + @Override + public int deleteSysApiLogHistoryByLogId(String logId) { + return sysApiLogHistoryMapper.deleteSysApiLogHistoryByLogId(logId); + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/service/SysApiLogServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/service/SysApiLogServiceImpl.java new file mode 100644 index 000000000..d1349d89e --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/service/SysApiLogServiceImpl.java @@ -0,0 +1,94 @@ +package org.nl.system.service.sysapi.service; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.ss.formula.functions.T; +import org.nl.common.utils.IdUtil; +import org.nl.modules.wql.util.SpringContextHolder; +import org.nl.system.service.param.impl.SysParamServiceImpl; +import org.nl.system.service.sysapi.entity.SysApiLog; +import org.nl.system.service.sysapi.entity.SysApiLogHistory; +import org.nl.system.service.sysapi.mapper.SysApiLogHistoryMapper; +import org.nl.system.service.sysapi.mapper.SysApiLogMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author ManMan.Yang + * @version V1.1 + * @date 2026/5/14 + * @description TODO + */ + + +@Service +@Slf4j +public class SysApiLogServiceImpl extends ServiceImpl implements ISysApiLogService { + + @Autowired + private ISysApiLogHistoryService sysApiLogHistoryService; + + @Override + @Async("apiLogExecutor") + public void saveAsync(SysApiLog apiLog) { + try { + if (apiLog.getLogId() == null) { + apiLog.setLogId(IdUtil.getStringId()); + } + if (apiLog.getCreateTime() == null) { + apiLog.setCreateTime(DateUtil.now()); + } + this.save(apiLog); + } catch (Exception e) { + log.error("保存接口日志失败, logId: {}", apiLog.getLogId(), e); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public ResponseEntity archiveLogs() { + try { + // 获取系统配置的日志保留天数 + String days = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("sys_api_keep_days").getValue(); + if(StrUtil.isEmpty( days)){ + days = "60"; + } + int keepDays = Integer.parseInt(days); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.lt(SysApiLog::getCreateTime, + java.time.LocalDateTime.now().minusDays(keepDays).toString().replace('T', ' ')); + List oldLogs = this.list(wrapper); + if (!oldLogs.isEmpty()) { + log.info("开始归档接口日志,共 {} 条数据", oldLogs.size()); + /* + * 88549333 接口日志归档,防止数据量过大对插入和查询造成性能损耗 + * 1. 批量保存到历史表 sys_api_log_history + * 2. 删除旧数据 + */ + // 1. 备份到历史表 sys_api_log_history + List historyList = oldLogs.stream().map(SysApiLogHistory::adapter).collect(Collectors.toList()); + boolean saveSuccess = sysApiLogHistoryService.saveBatch(historyList); + if (saveSuccess) { + this.remove(wrapper); + log.info("接口日志归档完成,已迁移并删除 {} 条旧数据", oldLogs.size()); + } else { + log.error("接口日志归档失败,保存历史数据失败"); + throw new RuntimeException("保存历史数据失败"); + } + } + return new ResponseEntity<>(HttpStatus.OK); + } catch (Exception e) { + log.error("接口日志归档失败", e); + throw new RuntimeException("日志归档失败: " + e.getMessage()); + } + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/impl/TransportationbaseServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/impl/TransportationbaseServiceImpl.java index f8d30a038..baf09b548 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/impl/TransportationbaseServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/impl/TransportationbaseServiceImpl.java @@ -49,7 +49,7 @@ public class TransportationbaseServiceImpl implements TransportationbaseService if (ObjectUtil.isNotEmpty(cust_name)) { map.put("cust_name", "%" + cust_name + "%"); } - JSONObject json = WQL.getWO("QMD_CS_TRANSPORAIONL").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "update_time ASC"); + JSONObject json = WQL.getWO("QMD_CS_TRANSPORAIONL").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "create_time DESC ,update_time ASC"); return json; } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/mdcs.xls b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/mdcs.xls index 24fd3ca1e..ffbb5b358 100644 Binary files a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/mdcs.xls and b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/mdcs.xls differ diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/mdme.xls b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/mdme.xls index 645595266..d569cbcd7 100644 Binary files a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/mdme.xls and b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/mdme.xls differ diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/st/wql/stivt.xls b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/st/wql/stivt.xls index bf82ee931..951c2255e 100644 Binary files a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/st/wql/stivt.xls and b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/st/wql/stivt.xls differ diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java index ec0aa3239..c5ee599db 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java @@ -3,6 +3,7 @@ package org.nl.wms.ext.acs.service.impl; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DateUtil; import org.nl.b_lms.sch.point.dao.mapper.BstIvtPackageinfoivtMapper; +import org.nl.b_lms.sch.tasks.slitter.util.MdmDescriptionParseUtils; import org.nl.b_lms.storage_manage.database.service.dao.mapper.BstIvtBoxinfoMapper; import org.nl.common.utils.IdUtil; import cn.hutool.core.util.NumberUtil; @@ -1190,13 +1191,16 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { JSONObject plan_jo = WQLObject.getWQLObject("pdm_bi_slittingproductionplan").query("container_name = '" + resq_jo.getString("container_name1") + "'").uniqueResult(0); String paper_tube_or_FRP = plan_jo.getString("paper_tube_or_frp"); String paper_name; + String need_size; + // todo 88549333 因为新物料描述 纸管和 frp管的尺寸位置不一致,所以之前的取数组第三位的写法就存在问题,现修改为根据不同的类型分别获取。 2026年05月19日 18:55 if ("1".equals(paper_tube_or_FRP)) { paper_name = plan_jo.getString("paper_tube_description"); + need_size = MdmDescriptionParseUtils.extractPaperTubeSize(paper_name); } else { paper_name = plan_jo.getString("frp_description"); + need_size = MdmDescriptionParseUtils.extractFRPTubeSizeTrans(paper_name); } // mark: 分切计划规格拆分数据 - String need_size = String.valueOf(paper_name.split("\\|")[2].charAt(0)); JSONObject cut_jo = WQLObject.getWQLObject("st_ivt_cutpointivt").query("ext_code = '" + plan_jo.getString("resource_name") + "'").uniqueResult(0); //获取分切机维护的气涨轴代数 String need_generation = cut_jo.getString("qzz_generation"); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/crm/rest/CrmToLmsController.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/crm/rest/CrmToLmsController.java index c8d01773f..25ea223f4 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/crm/rest/CrmToLmsController.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/crm/rest/CrmToLmsController.java @@ -4,6 +4,7 @@ import cn.dev33.satoken.annotation.SaIgnore; import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.nl.modules.logging.annotation.ApiLog; import org.nl.modules.logging.annotation.Log; import org.nl.wms.ext.crm.service.CrmToLmsService; import org.springframework.http.HttpStatus; @@ -22,16 +23,24 @@ public class CrmToLmsController { private final CrmToLmsService crmToLmsService; @PostMapping("/getCustomerInfo") - @Log("CRM给LMS推送客户信息") - +// @Log("CRM给LMS推送客户信息") + @ApiLog( + bizCode = "/crm/getCustomerInfo", + bizDesc = "CRM给LMS推送客户信息", + systemFlag = "crm" + ) @SaIgnore public ResponseEntity momRollFoilWeighing(@RequestBody JSONObject jo) { return new ResponseEntity<>(crmToLmsService.getCustomerInfo(jo), HttpStatus.OK); } @PostMapping("/getCPIvtInfo") - @Log("CRM获取LMS成品库存信息") - +// @Log("CRM获取LMS成品库存信息") + @ApiLog( + bizCode = "/crm/getCPIvtInfo", + bizDesc = "CRM获取LMS成品库存信息", + systemFlag = "crm" + ) @SaIgnore public ResponseEntity getCPIvtInfo(@RequestBody JSONObject jo) { return new ResponseEntity<>(crmToLmsService.getCPIvtInfo(jo), HttpStatus.OK); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mdm/entity/CommonResponseDto.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mdm/entity/CommonResponseDto.java new file mode 100644 index 000000000..5ab7119fa --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mdm/entity/CommonResponseDto.java @@ -0,0 +1,34 @@ +package org.nl.wms.ext.mdm.entity; + + +import lombok.Data; + +import java.util.List; + +/** + * @Author Eric.Yang + * @Version V1.1 + * @Date 2025/5/29 + * @Description 处理状态统一返回消息类 + */ +@Data +public class CommonResponseDto { + //状态 + private String status; + //描述 + private String message; + //处理结果集合 + private List responseData; + + /** + 统一返回消息类 构造 + */ + public static CommonResponseDto adapter(String status,String message,List responseData) { + CommonResponseDto commonResponseDto = new CommonResponseDto(); + commonResponseDto.setStatus(status); + commonResponseDto.setMessage(message); + commonResponseDto.setResponseData(responseData); + return commonResponseDto; + } +} + diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mdm/entity/ResponseItemsData.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mdm/entity/ResponseItemsData.java new file mode 100644 index 000000000..c09d6b02c --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mdm/entity/ResponseItemsData.java @@ -0,0 +1,31 @@ +package org.nl.wms.ext.mdm.entity; + + +import lombok.Data; + +@Data +public class ResponseItemsData { + //主数据唯一主键 + private Long mdId; + //主数据编码 + private String mdCode; + //主数据描述 + private String mdDescription; + //处理状态 + private String status; + //处理状态描述 + private String message; + + /** + 统一构造方法 + */ + public static ResponseItemsData adapter(Long mdId,String mdCode,String mdDescription,String status,String message){ + ResponseItemsData responseItemsData = new ResponseItemsData(); + responseItemsData.setMdId(mdId); + responseItemsData.setMdCode(mdCode); + responseItemsData.setMdDescription(mdDescription); + responseItemsData.setStatus(status); + responseItemsData.setMessage(message); + return responseItemsData; + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mdm/entity/StatusEnum.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mdm/entity/StatusEnum.java new file mode 100644 index 000000000..c378c054a --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mdm/entity/StatusEnum.java @@ -0,0 +1,26 @@ +package org.nl.wms.ext.mdm.entity; + + +/** + * @Author Eric.Yang + * @Version V1.1 + * @Date 2025/6/10 + * @Description 接口状态统一码 + */ +public enum StatusEnum { + ACCEPT_SUCCESS("S", "分发成功"), + ACCEPT_FAIL("E", "分发失败"); + + private String code; + private String message; + StatusEnum(String code, String message) { + this.code = code; + this.message = message; + } + public String getCode() { + return code; + } + public String getMessage() { + return message; + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mdm/rest/MdmToLmsController.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mdm/rest/MdmToLmsController.java new file mode 100644 index 000000000..cf1430f21 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mdm/rest/MdmToLmsController.java @@ -0,0 +1,82 @@ +package org.nl.wms.ext.mdm.rest; + + +import cn.dev33.satoken.annotation.SaIgnore; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.collection.CollectionUtil; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.b_lms.sch.tasks.slitter.util.MdmDescriptionParseUtils; +import org.nl.b_lms.sch.tasks.slitter.util.SlitterTaskUtil; +import org.nl.modules.logging.annotation.ApiLog; +import org.nl.modules.logging.annotation.Log; +import org.nl.wms.ext.mdm.entity.CommonResponseDto; +import org.nl.wms.ext.mdm.entity.ResponseItemsData; +import org.nl.wms.ext.mdm.service.MdmToLmsService; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import javax.annotation.Resource; +import java.util.List; + +/** + * @author Eric.Yang + * @version V1.1 + * @Date 2025/5/29 + * @Description MDM主数据平台与LMS接口 + */ + +@RestController +@RequestMapping("/api/mdm") +@Slf4j +@SaIgnore +public class MdmToLmsController { + + @Resource + private MdmToLmsService mdmToLmsService; + + @PostMapping("/transCustomerInfo") + @ApiLog( + bizCode = "/mdm/transCustomerInfo", + bizDesc = "MDM给LMS推送客户信息", + systemFlag = "mdm" + ) + @SaIgnore + public CommonResponseDto transCustomerInfo(@RequestBody JSONObject jsonData){ + return mdmToLmsService.transCustomerInfo(jsonData); + } + + + @PostMapping("/transSupplierInfo") + @ApiLog( + bizCode = "/mdm/transSupplierInfo", + bizDesc = "MDM给LMS推送供应商信息", + systemFlag = "mdm" + ) + @SaIgnore + public CommonResponseDto transSupplierInfo(@RequestBody JSONObject jsonData){ + return mdmToLmsService.transSupplierInfo(jsonData); + } + + @PostMapping("/transMaterialInfo") + @ApiLog( + bizCode = "/mdm/transMaterialInfo", + bizDesc = "MDM给LMS推送物料主数据信息", + systemFlag = "mdm" + ) + @SaIgnore + public CommonResponseDto transMaterialInfo(@RequestBody JSONObject jsonData){ + return mdmToLmsService.transMaterialInfo(jsonData); + } + + @PostMapping("/transMaterialTest") + @SaIgnore + public void transMaterialTest(@RequestBody JSONObject jsonData){ + String materialName = jsonData.get("material_name") + ""; + String composePaperTubeInformation = SlitterTaskUtil.getComposePaperTubeInformation(materialName); + log.info("composePaperTubeInformation:{}",composePaperTubeInformation); + } + +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mdm/service/MdmToLmsService.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mdm/service/MdmToLmsService.java new file mode 100644 index 000000000..a1babf2f7 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mdm/service/MdmToLmsService.java @@ -0,0 +1,23 @@ +package org.nl.wms.ext.mdm.service; + + +import com.alibaba.fastjson.JSONObject; +import org.nl.wms.ext.mdm.entity.CommonResponseDto; + +import java.util.List; + +public interface MdmToLmsService { + + /** + * MDM客户接口 + */ + CommonResponseDto transCustomerInfo(JSONObject jsonData); + /** + * MDM供应商接口 + */ + CommonResponseDto transSupplierInfo(JSONObject jsonData); + /** + * MDM物料主数据接口 + */ + CommonResponseDto transMaterialInfo(JSONObject jsonData); +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mdm/service/impl/MdmToLmsServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mdm/service/impl/MdmToLmsServiceImpl.java new file mode 100644 index 000000000..8d6d073aa --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mdm/service/impl/MdmToLmsServiceImpl.java @@ -0,0 +1,297 @@ +package org.nl.wms.ext.mdm.service.impl; + + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.compress.utils.Lists; +import org.nl.common.utils.IdUtil; +import org.nl.common.utils.SecurityUtils; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.wms.ext.mdm.entity.CommonResponseDto; +import org.nl.wms.ext.mdm.entity.ResponseItemsData; +import org.nl.wms.ext.mdm.entity.StatusEnum; +import org.nl.wms.ext.mdm.service.MdmToLmsService; +import org.springframework.stereotype.Service; +import java.util.List; + +/** + * @Author Eric.Yang + * @Version V1.1 + * @Date 2025/5/29 + * @Description MDM数据对接接口业务实现类 + */ +@Service +@Slf4j +public class MdmToLmsServiceImpl implements MdmToLmsService { + + /** + * @Description: MDM客户主数据接口 + * @Author Eric.Yang + * @Date: 2025/6/3 9:12 + **/ + @Override + public CommonResponseDto transCustomerInfo(JSONObject jsonData) { + log.info("MDM客户主数据业务请求参数为:{}", jsonData); + CommonResponseDto commonResponseDto = new CommonResponseDto(); + if(CollectionUtil.isEmpty(jsonData)){ + commonResponseDto.setStatus("E"); + commonResponseDto.setMessage("MDM传输数据为空!"); + return commonResponseDto; + } + List responseItemsData = Lists.newArrayList(); + JSONArray customers = jsonData.getJSONArray("customer"); + if(CollectionUtil.isNotEmpty(customers)){ + for (int i = 0; i < customers.size(); i++) { + JSONObject json = customers.getJSONObject(i); + //主编码主键 + long mdId = IdUtil.getLongId(); + //客户编号 + String mdCode = json.getString("mdCode"); + //主数据描述 + String mdDescription = json.getString("mdDescription"); + try { + //客户名称 + String customerName = json.getString("customerName"); + //核心字段判断 + if (StrUtil.isEmpty(mdCode) || StrUtil.isEmpty(customerName)) { + throw new BadRequestException("MDM->客户编码或名称不能为空!"); + } + //客户简称 + String abbreviation = json.getString("abbreviation"); + //客户状态 01合格 02冻结 03禁用 04黑名单 + String customerStatus = json.getString("customerStatus"); + JSONArray salesOrgs = json.getJSONArray("salesOrg"); + if (CollectionUtil.isEmpty(salesOrgs)) { + throw new BadRequestException("MDM->客户数据核心字段数据为空,缺失字段:[salesOrgs]!"); + } + JSONObject salesOrg = salesOrgs.getJSONObject(0); + JSONArray salesList = salesOrg.getJSONArray("sales"); + if (CollectionUtil.isEmpty(salesList)) { + throw new BadRequestException("MDM->客户数据核心字段数据为空,缺失字段:[sales]!"); + } + JSONObject sales = salesList.getJSONObject(0); + JSONArray parList = sales.getJSONArray("par"); + if (CollectionUtil.isEmpty(parList)) { + throw new BadRequestException("MDM->客户数据核心字段数据为空,缺失字段:[par]!"); + } + JSONObject par = parList.getJSONObject(0); + //业务员工号 + String empSupplier = par.getString("empSupplier"); + //业务员名称 + String empSupplierDesc = par.getString("empSupplierDesc"); + String sales_owner = StrUtil.join("|",empSupplier,empSupplierDesc); + //插入客户表 + String currentUserId = SecurityUtils.getCurrentUserId(); + String now = DateUtil.now(); + JSONObject customer_jo = WQLObject.getWQLObject("md_cs_customerbase").query("cust_code = '" + mdCode + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(customer_jo)) { + customer_jo = new JSONObject(); + customer_jo.put("cust_id", mdId); + customer_jo.put("cust_code", mdCode); + customer_jo.put("cust_name", customerName); + customer_jo.put("cust_simple_name", abbreviation); + customer_jo.put("mdm_status", customerStatus); + customer_jo.put("sales_owner", sales_owner); + customer_jo.put("create_id", currentUserId); + customer_jo.put("create_name", "mdm_user"); + customer_jo.put("create_time", now); + WQLObject.getWQLObject("md_cs_customerbase").insert(customer_jo); + ResponseItemsData itemsData = ResponseItemsData.adapter(mdId, mdCode, mdDescription, StatusEnum.ACCEPT_SUCCESS.getCode(), StatusEnum.ACCEPT_SUCCESS.getMessage()); + responseItemsData.add(itemsData); + } else { + customer_jo.put("cust_name", customerName); + customer_jo.put("cust_simple_name", abbreviation); + customer_jo.put("sales_owner", sales_owner); + customer_jo.put("update_optid", currentUserId); + customer_jo.put("update_optname", "mdm_user"); + customer_jo.put("mdm_status", customerStatus); + customer_jo.put("update_time", now); + WQLObject.getWQLObject("md_cs_customerbase").update(customer_jo); + ResponseItemsData itemsData = ResponseItemsData.adapter(mdId, mdCode, mdDescription, StatusEnum.ACCEPT_SUCCESS.getCode(), StatusEnum.ACCEPT_SUCCESS.getMessage()); + responseItemsData.add(itemsData); + } + }catch (Exception e) { + String message = e.getMessage(); + ResponseItemsData itemsData = ResponseItemsData.adapter(mdId, mdCode, mdDescription, StatusEnum.ACCEPT_FAIL.getCode(),message.contains("MDM")?message:StatusEnum.ACCEPT_FAIL.getMessage()); + responseItemsData.add(itemsData); + log.error("MDM客户数据接口业务实现类处理数据异常", e); + } + } + } + commonResponseDto.setStatus(StatusEnum.ACCEPT_SUCCESS.getCode()); + commonResponseDto.setMessage(StatusEnum.ACCEPT_SUCCESS.getMessage()); + commonResponseDto.setResponseData(responseItemsData); + return commonResponseDto; + } + + + /** + * @Description: MDM供应商主数据接口 + * @Author Eric.Yang + * @Date: 2025/6/5 9:12 + **/ + @Override + public CommonResponseDto transSupplierInfo(JSONObject jsonData) { + log.info("MDM供应商主数据请求参数为:{}", jsonData); + CommonResponseDto commonResponseDto = new CommonResponseDto(); + if(CollectionUtil.isEmpty(jsonData)){ + commonResponseDto.setStatus("E"); + commonResponseDto.setMessage("MDM传输数据为空!"); + return commonResponseDto; + } + List responseItemsData = Lists.newArrayList(); + JSONArray supplier = jsonData.getJSONArray("supplier"); + if(CollectionUtil.isNotEmpty(supplier)){ + for (int i = 0; i < supplier.size(); i++) { + JSONObject json = supplier.getJSONObject(i); + //主编码主键 + long mdId = IdUtil.getLongId(); + //客户编号 + String mdCode = json.getString("mdCode"); + //主数据描述 + String mdDescription = json.getString("mdDescription"); + try { + //供应商名称 + String supplierName = json.getString("supplierName"); + //供应商简称 + String abbreviation = json.getString("abbreviation"); + //股份供应商状态 01合格 02潜在 03不合作 04黑名单 + String gfSupplierStatus = json.getString("gfSupplierStatus"); + //插入客户表 + String currentUserId = SecurityUtils.getCurrentUserId(); + String now = DateUtil.now(); + //核心字段判断 + if (StrUtil.isEmpty(mdCode) || StrUtil.isEmpty(supplierName)) { + throw new BadRequestException("MDM->供应商编码或名称不能为空!"); + } + JSONObject supplier_jo = WQLObject.getWQLObject("md_cs_transportationbase").query("cust_code = '" + mdCode + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(supplier_jo)) { + supplier_jo = new JSONObject(); + supplier_jo.put("cust_id", mdId); + supplier_jo.put("cust_code", mdCode); + supplier_jo.put("cust_name", supplierName); + supplier_jo.put("cust_simple_name", abbreviation); + supplier_jo.put("mdm_status", gfSupplierStatus); + supplier_jo.put("create_id", currentUserId); + supplier_jo.put("create_name", "mdm_user"); + supplier_jo.put("create_time", now); + WQLObject.getWQLObject("md_cs_transportationbase").insert(supplier_jo); + ResponseItemsData itemsData = ResponseItemsData.adapter(mdId, mdCode, mdDescription, StatusEnum.ACCEPT_SUCCESS.getCode(), StatusEnum.ACCEPT_SUCCESS.getMessage()); + responseItemsData.add(itemsData); + } else { + supplier_jo.put("cust_name", supplierName); + supplier_jo.put("cust_simple_name", abbreviation); + supplier_jo.put("update_optid", currentUserId); + supplier_jo.put("update_optname", "mdm_user"); + supplier_jo.put("mdm_status", gfSupplierStatus); + supplier_jo.put("update_time", now); + WQLObject.getWQLObject("md_cs_transportationbase").update(supplier_jo); + ResponseItemsData itemsData = ResponseItemsData.adapter(mdId, mdCode, mdDescription, StatusEnum.ACCEPT_SUCCESS.getCode(), StatusEnum.ACCEPT_SUCCESS.getMessage()); + responseItemsData.add(itemsData); + } + }catch (Exception e) { + //获取抛出异常的信息 + String message = e.getMessage(); + ResponseItemsData itemsData = ResponseItemsData.adapter(mdId, mdCode, mdDescription, StatusEnum.ACCEPT_FAIL.getCode(),message.contains("MDM")?message:StatusEnum.ACCEPT_FAIL.getMessage()); + responseItemsData.add(itemsData); + log.error("MDM供应商数据接口数据异常", e); + } + } + } + commonResponseDto.setStatus(StatusEnum.ACCEPT_SUCCESS.getCode()); + commonResponseDto.setMessage(StatusEnum.ACCEPT_SUCCESS.getMessage()); + commonResponseDto.setResponseData(responseItemsData); + return commonResponseDto; + } + + /** + * @Description: MDM物料主数据接口 + * @Author Eric.Yang + * @Date: 2025/6/3 9:12 + **/ + @Override + public CommonResponseDto transMaterialInfo(JSONObject jsonData) { + log.info("MDM物料主数据请求参数为:{}", jsonData); + CommonResponseDto commonResponseDto = new CommonResponseDto(); + if(CollectionUtil.isEmpty(jsonData)){ + commonResponseDto.setStatus("E"); + commonResponseDto.setMessage("MDM传输数据为空!"); + return commonResponseDto; + } + List responseItemsData = Lists.newArrayList(); + JSONArray materiels = jsonData.getJSONArray("materiels"); + if(CollectionUtil.isNotEmpty(materiels)){ + for (int i = 0; i < materiels.size(); i++) { + JSONObject json = materiels.getJSONObject(i); + //主编码主键 + long mdId = IdUtil.getLongId(); + //物料编码 + String mdCode = json.getString("mdCode"); + //物料名称 + String mdDescription = json.getString("mdDescription"); + try { + //计量单位 + String meins = json.getString("meins"); + //跨工厂的物料状态 Y有效 D冻结 N无效 + String mstae = json.getString("mstae"); + //插入客户表 + String currentUserId = SecurityUtils.getCurrentUserId(); + String now = DateUtil.now(); + if (StrUtil.isEmpty(mdCode) || StrUtil.isEmpty(mdDescription)) { + throw new BadRequestException("MDM->物料编码或名称不能为空!"); + } + JSONObject material_jo = WQLObject.getWQLObject("md_me_materialbase").query("material_code = '" + mdCode + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(material_jo)) { + JSONObject unit = WQLObject.getWQLObject("md_pb_measureunit").query("unit_code = '" + meins + "' and is_delete ='0'").uniqueResult(0); + if (ObjectUtil.isEmpty(unit)) { + throw new BadRequestException("MDM->未查询到相关计量单位,请进行维护!"); + } + material_jo = new JSONObject(); + material_jo.put("material_id", mdId); + material_jo.put("material_code", mdCode); + material_jo.put("material_name", mdDescription); + material_jo.put("base_unit_id", unit.getString("measure_unit_id")); + material_jo.put("mdm_status", mstae); + material_jo.put("is_used", "1"); + material_jo.put("create_id", currentUserId); + material_jo.put("create_name", "mdm_user"); + material_jo.put("create_time", now); + WQLObject.getWQLObject("md_me_materialbase").insert(material_jo); + ResponseItemsData itemsData = ResponseItemsData.adapter(mdId, mdCode, mdDescription, StatusEnum.ACCEPT_SUCCESS.getCode(), StatusEnum.ACCEPT_SUCCESS.getMessage()); + responseItemsData.add(itemsData); + } else { + JSONObject unit = WQLObject.getWQLObject("md_pb_measureunit").query("unit_code = '" + meins + "' and is_delete ='0'").uniqueResult(0); + if (ObjectUtil.isEmpty(unit)) { + throw new BadRequestException("MDM->未查询到相关计量单位,请进行维护!"); + } + material_jo.put("material_name", mdDescription); + material_jo.put("base_unit_id", unit.getString("measure_unit_id")); + material_jo.put("mdm_status", mstae); + material_jo.put("update_optid", currentUserId); + material_jo.put("update_optname", "mdm_user"); + material_jo.put("update_time", now); + WQLObject.getWQLObject("md_me_materialbase").update(material_jo); + ResponseItemsData itemsData = ResponseItemsData.adapter(mdId, mdCode, mdDescription, StatusEnum.ACCEPT_SUCCESS.getCode(), StatusEnum.ACCEPT_SUCCESS.getMessage()); + responseItemsData.add(itemsData); + } + }catch (Exception e) { + //获取抛出异常的信息 + String message = e.getMessage(); + ResponseItemsData itemsData = ResponseItemsData.adapter(mdId, mdCode, mdDescription, StatusEnum.ACCEPT_FAIL.getCode(),message.contains("MDM")?message:StatusEnum.ACCEPT_FAIL.getMessage()); + responseItemsData.add(itemsData); + log.error("MDM物料主数据接口数据异常", e); + } + } + } + commonResponseDto.setStatus(StatusEnum.ACCEPT_SUCCESS.getCode()); + commonResponseDto.setMessage(StatusEnum.ACCEPT_SUCCESS.getMessage()); + commonResponseDto.setResponseData(responseItemsData); + return commonResponseDto; + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/LmsToMesServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/LmsToMesServiceImpl.java index 124d255c6..cbd404097 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/LmsToMesServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/LmsToMesServiceImpl.java @@ -1,6 +1,7 @@ package org.nl.wms.ext.mes.service.impl; import cn.hutool.core.date.DateUtil; +import cn.hutool.json.JSONUtil; import org.nl.common.utils.IdUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; @@ -24,6 +25,7 @@ import org.nl.modules.wql.WQL; import org.nl.modules.wql.core.bean.WQLObject; import org.nl.modules.wql.util.SpringContextHolder; import org.nl.system.service.param.impl.SysParamServiceImpl; +import org.nl.system.service.sysapi.service.OutboundApiLogger; import org.nl.wms.ext.mes.service.LmsToMesService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; @@ -61,7 +63,7 @@ public class LmsToMesServiceImpl implements LmsToMesService { @Override public JSONObject momRollFoilWeighing(JSONObject param) { log.info("momRollFoilWeighing接口输入参数为:-------------------" + param); - + long startTime = System.currentTimeMillis(); JSONObject result = new JSONObject(); if (StrUtil.equals("0", is_connect_mes)) { result.put("status", HttpStatus.OK.value()); @@ -94,8 +96,16 @@ public class LmsToMesServiceImpl implements LmsToMesService { } catch (Exception e) { + // 记录失败日志 + OutboundApiLogger.logFail("mes", "/sap/center/lms/004", "LMS的PDA操作AGV下卷,AGV称重完成后AGV称重信息发送MES", + url, "POST", JSONUtil.toJsonStr(param), e.getMessage(), + System.currentTimeMillis() - startTime); throw new BadRequestException("MES提示错误:" + e.getMessage()); } + // 记录成功日志 + OutboundApiLogger.logSuccess("sap", "/sap/center/lms/004", "LMS的PDA操作AGV下卷,AGV称重完成后AGV称重信息发送MES", + url, "POST", JSONUtil.toJsonStr(param), result.toString(), 200, + System.currentTimeMillis() - startTime); return result; } @@ -135,7 +145,7 @@ public class LmsToMesServiceImpl implements LmsToMesService { result.put("data", new JSONObject()); return result; } - + long startTime = System.currentTimeMillis(); String url = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("MES_URL").getValue(); String api = "CamstarApi/MomRollBakeInBound"; url = url + api; @@ -152,8 +162,16 @@ public class LmsToMesServiceImpl implements LmsToMesService { throw new BadRequestException(result.getString("RTMSG")); } } catch (Exception e) { + // 记录失败日志 + OutboundApiLogger.logFail("mes", "/CamstarApi/MomRollBakeInBound", "智能桁架将母卷调进烘箱完成,智能物流发送MES", + url, "POST", JSONUtil.toJsonStr(param), e.getMessage(), + System.currentTimeMillis() - startTime); throw new BadRequestException("MES提示错误:" + e.getMessage()); } + // 记录成功日志 + OutboundApiLogger.logSuccess("mes", "/CamstarApi/MomRollBakeInBound", "智能桁架将母卷调进烘箱完成,智能物流发送MES", + url, "POST", JSONUtil.toJsonStr(param), result.toString(), 200, + System.currentTimeMillis() - startTime); return result; } @@ -194,7 +212,7 @@ public class LmsToMesServiceImpl implements LmsToMesService { return result; } - + long startTime = System.currentTimeMillis(); String UserName = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("MES_USERNAME").getValue(); String Password = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("MES_PASSWORD").getValue(); param.put("UserName", UserName); @@ -216,8 +234,15 @@ public class LmsToMesServiceImpl implements LmsToMesService { throw new BadRequestException(result.getString("RTMSG")); } } catch (Exception e) { + // 记录失败日志 + OutboundApiLogger.logFail("mes", "/CamstarApi/MomRollBakeOutBound", "母卷出烘箱信息智能物流传MES", + url, "POST", JSONUtil.toJsonStr(param), e.getMessage(), + System.currentTimeMillis() - startTime); throw new BadRequestException("MES提示错误:" + e.getMessage()); } + OutboundApiLogger.logSuccess("mes", "/CamstarApi/MomRollBakeOutBound", "母卷出烘箱信息智能物流传MES", + url, "POST", JSONUtil.toJsonStr(param), result.toString(), 200, + System.currentTimeMillis() - startTime); return result; } @@ -449,7 +474,7 @@ public class LmsToMesServiceImpl implements LmsToMesService { result.put("data", new JSONObject()); return result; } - + long startTime = System.currentTimeMillis(); JSONObject jo = new JSONObject(); jo.put("iPackageBoxSN", PackageBoxSN); jo.put("iSpec", "FGPRODUCT"); @@ -482,8 +507,16 @@ public class LmsToMesServiceImpl implements LmsToMesService { } catch (Exception e) { + // 记录失败日志 + OutboundApiLogger.logFail("mes", "/CamstarApi/ChildRollFGInboundComplete", "入库完成,LMS回传MES,MES成品入库Move Out", + url, "POST", JSONUtil.toJsonStr(param), e.getMessage(), + System.currentTimeMillis() - startTime); throw new BadRequestException("MES提示错误:" + e.getMessage()); } + // 记录成功日志 + OutboundApiLogger.logSuccess("mes", "/CamstarApi/ChildRollFGInboundComplete", "入库完成,LMS回传MES,MES成品入库Move Out", + url, "POST", JSONUtil.toJsonStr(param), result.toString(), 200, + System.currentTimeMillis() - startTime); return result; } @@ -505,7 +538,7 @@ public class LmsToMesServiceImpl implements LmsToMesService { result.put("data", new JSONObject()); return result; } - + long startTime = System.currentTimeMillis(); String url = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("MES_URL").getValue(); String api = "CamstarApi/ChildRollFGOutboundComplete"; url = url + api; @@ -525,8 +558,16 @@ public class LmsToMesServiceImpl implements LmsToMesService { } catch (Exception e) { + // 记录失败日志 + OutboundApiLogger.logFail("mes", "/CamstarApi/ChildRollFGOutboundComplete", "发货完成,LMS同步MES子卷及包装箱状态,MES更新信息", + url, "POST", JSONUtil.toJsonStr(param), e.getMessage(), + System.currentTimeMillis() - startTime); throw new BadRequestException("MES提示错误:" + e.getMessage()); } + // 记录成功日志 + OutboundApiLogger.logSuccess("mes", "/CamstarApi/ChildRollFGOutboundComplete", "发货完成,LMS同步MES子卷及包装箱状态,MES更新信息", + url, "POST", JSONUtil.toJsonStr(param), result.toString(), 200, + System.currentTimeMillis() - startTime); return result; } @@ -547,7 +588,7 @@ public class LmsToMesServiceImpl implements LmsToMesService { result.put("data", new JSONObject()); return result; } - + long startTime = System.currentTimeMillis(); String url = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("MES_URL").getValue(); String api = "CamstarApi/LMSUnPackage"; url = url + api; @@ -573,8 +614,16 @@ public class LmsToMesServiceImpl implements LmsToMesService { } catch (Exception e) { + // 记录失败日志 + OutboundApiLogger.logFail("mes", "/CamstarApi/LMSUnPackage", "拆箱出库:回传mes箱号、子卷号", + url, "POST", JSONUtil.toJsonStr(param), e.getMessage(), + System.currentTimeMillis() - startTime); throw new BadRequestException("MES提示错误:" + e.getMessage()); } + // 记录成功日志 + OutboundApiLogger.logSuccess("mes", "/CamstarApi/LMSUnPackage", "拆箱出库:回传mes箱号、子卷号", + url, "POST", JSONUtil.toJsonStr(param), result.toString(), 200, + System.currentTimeMillis() - startTime); return result; } @@ -595,7 +644,7 @@ public class LmsToMesServiceImpl implements LmsToMesService { result.put("data", new JSONObject()); return result; } - + long startTime = System.currentTimeMillis(); String url = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("MES_URL").getValue(); String api = "CamstarApi/LMSPackage"; url = url + api; @@ -621,8 +670,16 @@ public class LmsToMesServiceImpl implements LmsToMesService { } catch (Exception e) { + // 记录失败日志 + OutboundApiLogger.logFail("mes", "/CamstarApi/LMSPackage", "拆箱入库:回传mes箱号、子卷号", + url, "POST", JSONUtil.toJsonStr(param), e.getMessage(), + System.currentTimeMillis() - startTime); throw new BadRequestException("MES提示错误:" + e.getMessage()); } + // 记录成功日志 + OutboundApiLogger.logSuccess("mes", "/CamstarApi/LMSPackage", "拆箱入库:回传mes箱号、子卷号", + url, "POST", JSONUtil.toJsonStr(param), result.toString(), 200, + System.currentTimeMillis() - startTime); return result; } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/sap/rest/LmsToSapController.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/sap/rest/LmsToSapController.java index bdb06a0f4..62fa4db27 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/sap/rest/LmsToSapController.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/sap/rest/LmsToSapController.java @@ -22,7 +22,6 @@ public class LmsToSapController { @PostMapping("/returnDelivery") @Log("LMS回传SAP交货单") - public ResponseEntity returnDelivery(@RequestBody JSONObject jo) { return new ResponseEntity<>(LmsToSapService.returnDelivery(jo), HttpStatus.OK); } @@ -41,4 +40,11 @@ public class LmsToSapController { return new ResponseEntity<>(LmsToSapService.returnOutDtl(jo), HttpStatus.OK); } + @PostMapping("/returnScrapDtl") + @Log("LMS成品报废明细回传") + + public ResponseEntity returnScrapDtl(@RequestBody JSONObject jo) { + return new ResponseEntity<>(LmsToSapService.returnScrapDtl(jo), HttpStatus.OK); + } + } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/sap/service/LmsToSapService.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/sap/service/LmsToSapService.java index f0724e07b..b4abf1cb8 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/sap/service/LmsToSapService.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/sap/service/LmsToSapService.java @@ -52,4 +52,21 @@ public interface LmsToSapService { * KALAB 重量 */ JSONObject returnOutDtl(JSONObject jo); + + /* + WERKS 工厂 + MATNR 物料编码 + LGORT 库存地点 + CHARG SAP批次 + BDMNG 数量 + ZCJZ 返检修改差异重量 + ZGHZL 返检修改后重量 + VRKME 单位 + Z1 MES批次 + VBELN 销售订单 + POSNR 销售订单行 + ZYDYY 移动原因 + ZLYXT 来源系统 + */ + JSONObject returnScrapDtl(JSONObject jo); } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/sap/service/impl/LmsToSapServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/sap/service/impl/LmsToSapServiceImpl.java index 0a937176c..a2571636e 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/sap/service/impl/LmsToSapServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/sap/service/impl/LmsToSapServiceImpl.java @@ -2,6 +2,7 @@ package org.nl.wms.ext.sap.service.impl; import cn.hutool.core.util.StrUtil; import cn.hutool.http.HttpRequest; +import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; @@ -9,6 +10,7 @@ import lombok.extern.slf4j.Slf4j; import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.wql.util.SpringContextHolder; import org.nl.system.service.param.impl.SysParamServiceImpl; +import org.nl.system.service.sysapi.service.OutboundApiLogger; import org.nl.wms.ext.sap.service.LmsToSapService; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; @@ -38,7 +40,7 @@ public class LmsToSapServiceImpl implements LmsToSapService { * */ { log.info("returnDelivery接口输入参数为:-------------------" + jo.toString()); - + long startTime = System.currentTimeMillis(); JSONObject result = new JSONObject(); String isConnect = "1"; if (StrUtil.equals("0", isConnect)) { @@ -52,7 +54,7 @@ public class LmsToSapServiceImpl implements LmsToSapService { String token = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("SAP_TOKEN").getValue(); String sap_client = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("SAP_CLIENT").getValue(); String api = ""; - url = url + "/sap/center/wms/004"; + url = url + "/sap/center/lms/004"; try { String resultMsg = HttpRequest.post(url).header("TOKEN", token) .header("sap-client", sap_client) @@ -68,8 +70,16 @@ public class LmsToSapServiceImpl implements LmsToSapService { } } catch (Exception e) { + // 记录失败日志 + OutboundApiLogger.logFail("sap", "/sap/center/lms/004", "LMS回传SAP交货单", + url, "POST", JSONUtil.toJsonStr(jo), e.getMessage(), + System.currentTimeMillis() - startTime); throw new BadRequestException("SAP提示错误:" + e.getMessage()); } + // 记录成功日志 + OutboundApiLogger.logSuccess("sap", "/sap/center/lms/004", "LMS回传SAP交货单", + url, "POST", JSONUtil.toJsonStr(jo), result.toString(), 200, + System.currentTimeMillis() - startTime); return result; } } @@ -100,7 +110,7 @@ public class LmsToSapServiceImpl implements LmsToSapService { * */ { log.info("returnMoveDtl接口输入参数为:-------------------" + jo.toString()); - + long startTime = System.currentTimeMillis(); JSONObject result = new JSONObject(); String isConnect = "1"; if (StrUtil.equals("0", isConnect)) { @@ -113,7 +123,7 @@ public class LmsToSapServiceImpl implements LmsToSapService { String url = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("SAP_URL").getValue(); String token = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("SAP_TOKEN").getValue(); String sap_client = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("SAP_CLIENT").getValue(); - String api = "/sap/center/wms/005"; + String api = "/sap/center/lms/005"; url = url + api; try { String resultMsg = HttpRequest.post(url).header("TOKEN", token) @@ -129,8 +139,15 @@ public class LmsToSapServiceImpl implements LmsToSapService { } } catch (Exception e) { + // 记录失败日志 + OutboundApiLogger.logFail("sap", "/sap/center/lms/005", "LMS移库接口回传", + url, "POST", JSONUtil.toJsonStr(jo), e.getMessage(), + System.currentTimeMillis() - startTime); throw new BadRequestException("SAP提示错误:" + e.getMessage()); } + OutboundApiLogger.logSuccess("sap", "/sap/center/lms/005", "LMS移库接口回传", + url, "POST", JSONUtil.toJsonStr(jo), result.toString(), 200, + System.currentTimeMillis() - startTime); return result; } } @@ -139,7 +156,7 @@ public class LmsToSapServiceImpl implements LmsToSapService { public JSONObject returnOutDtl(JSONObject jo) { { log.info("returnOutDtl接口输入参数为:-------------------" + jo.toString()); - + long startTime = System.currentTimeMillis(); JSONObject result = new JSONObject(); String isConnect = "1"; if (StrUtil.equals("0", isConnect)) { @@ -154,7 +171,7 @@ public class LmsToSapServiceImpl implements LmsToSapService { String url = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("SAP_URL").getValue(); String token = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("SAP_TOKEN").getValue(); String sap_client = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("SAP_CLIENT").getValue(); - String api = "/sap/center/wms/007"; + String api = "/sap/center/lms/007"; url = url + api; try { String resultMsg = HttpRequest.post(url).header("TOKEN", token) @@ -170,8 +187,65 @@ public class LmsToSapServiceImpl implements LmsToSapService { } } catch (Exception e) { + // 记录失败日志 + OutboundApiLogger.logFail("sap", "/sap/center/lms/007", "LMS调拨出库接口回传", + url, "POST", JSONUtil.toJsonStr(jo), e.getMessage(), + System.currentTimeMillis() - startTime); throw new BadRequestException("SAP提示错误:" + e.getMessage()); } + // 记录成功日志 + OutboundApiLogger.logSuccess("sap", "/sap/center/lms/007", "LMS调拨出库接口回传", + url, "POST", JSONUtil.toJsonStr(jo), result.toString(), 200, + System.currentTimeMillis() - startTime); + return result; + } + } + + @Override + public JSONObject returnScrapDtl(JSONObject jo) { + { + log.info("returnScrapDtl接口输入参数为:-------------------" + jo.toString()); + long startTime = System.currentTimeMillis(); + JSONObject result = new JSONObject(); + String isConnect = "1"; + if (StrUtil.equals("0", isConnect)) { + result.put("status", HttpStatus.OK.value()); + result.put("message", "下发成功,但未连接MES!"); + result.put("data", new JSONObject()); + return result; + } + + JSONArray list = new JSONArray(); + + String url = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("SAP_URL").getValue(); + String token = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("SAP_TOKEN").getValue(); + String sap_client = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("SAP_CLIENT").getValue(); + String api = "/sap/center/lms/001"; + url = url + api; + try { + String resultMsg = HttpRequest.post(url).header("TOKEN", token) + .header("sap-client", sap_client) + .body(String.valueOf(jo)) + .execute().body(); + result = JSONObject.parseObject(resultMsg); + log.info("returnScrapDtl接口输出参数为:-------------------" + result.toString()); + + String type = result.getString("TYPE"); + if (StrUtil.equals(type, "E")) { + throw new BadRequestException(result.getString("MESSAGE")); + } + + } catch (Exception e) { + // 记录失败日志 + OutboundApiLogger.logFail("sap", "/sap/center/lms/001", "LMS成品报废明细回传", + url, "POST", JSONUtil.toJsonStr(jo), e.getMessage(), + System.currentTimeMillis() - startTime); + throw new BadRequestException("SAP提示错误:" + e.getMessage()); + } + // 记录成功日志 + OutboundApiLogger.logSuccess("sap", "/sap/center/lms/001", "LMS成品报废明细回传", + url, "POST", JSONUtil.toJsonStr(jo), result.toString(), 200, + System.currentTimeMillis() - startTime); return result; } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/sap/service/impl/SapToLmsServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/sap/service/impl/SapToLmsServiceImpl.java index 1bc9ac53e..d6d71af4b 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/sap/service/impl/SapToLmsServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/sap/service/impl/SapToLmsServiceImpl.java @@ -383,11 +383,12 @@ public class SapToLmsServiceImpl implements SapToLmsService { JSONObject json = item.getJSONObject(i); lfart = json.getString("LFART"); JSONObject jsonDtl = new JSONObject(); - if (StrUtil.equals(lfart, "ZLF") || StrUtil.equals(lfart, "ZJS")) { + if (StrUtil.equals(lfart, "ZLF1") || StrUtil.equals(lfart, "ZLF3") || StrUtil.equals(lfart, "ZLF9") || StrUtil.equals(lfart, "ZJS")) { // 生成出库单 + String billType = getBillTypeByLfart(lfart); jsonMst.put("io_type", "1"); - jsonMst.put("buss_type", "1001"); - jsonMst.put("bill_type", "1001"); + jsonMst.put("buss_type", billType); + jsonMst.put("bill_type", billType); jsonMst.put("source_id", json.getLongValue("VBELN")); jsonMst.put("source_name", "交货单"); jsonMst.put("receiver", json.getString("CONSIGNEE")); // 收货人 @@ -416,7 +417,7 @@ public class SapToLmsServiceImpl implements SapToLmsService { jsonDtl.put("width", json.getString("HL02")); // 幅宽 tableData.add(jsonDtl); } - if (StrUtil.equals(lfart, "ZLR")) { + if (StrUtil.equals(lfart, "ZLR") || StrUtil.equals(lfart, "ZLR1") || StrUtil.equals(lfart, "ZLR2")) { /*jsonMst.put("remark",json.getString("LGORT"));//库位*/ HashMap map = new HashMap(); //更新包装关系 @@ -502,8 +503,13 @@ public class SapToLmsServiceImpl implements SapToLmsService { box_rows.add(map); } } - // 发货出库 - if (StrUtil.equals(lfart, "ZLF")) { + /* + 发货分配逻辑 + * ZLF9 免费发货单-有价格 + * ZLF3 免费发货单 + * ZLF1 标准发货单 + * */ + if (StrUtil.equals(lfart, "ZLF1") || StrUtil.equals(lfart, "ZLF3") || StrUtil.equals(lfart, "ZLF9")) { jsonMst.put("tableData", tableData); // 调用出库新增并分配 String iostorinv_id = checkOutBillService.insertDtl2(jsonMst); @@ -520,11 +526,15 @@ public class SapToLmsServiceImpl implements SapToLmsService { JSONObject jsonObject = new JSONObject(); jsonObject.put("iostorinv_id", iostorinv_id); } - // 退货入库 - if (StrUtil.equals(lfart, "ZLR")) { + /* + 退货入库 - 1 销售退货单 + 退货入库 - 3 免费退货单 + */ + if (StrUtil.equals(lfart, "ZLR1") || StrUtil.equals(lfart, "ZLR2")) { jsonMst.put("tableData", box_rows); //创建退货入库单 - jsonMst.put("bill_type", "0002"); + String billType = getBillTypeByLfart(lfart); + jsonMst.put("bill_type", billType); jsonMst.put("biz_date", DateUtil.now()); jsonMst.put("bill_status", "10"); rawAssistIStorService.insertDtl(jsonMst); @@ -547,6 +557,48 @@ public class SapToLmsServiceImpl implements SapToLmsService { return result; } + /** + * @description: 根据Sap LFART获取单据类型 + * @author ManMan + * @date: 2026/4/9 14:08 + * 发货(字典值:ST_INV_OUT_TYPE) + * ZLF 1001 发货出库 (旧) + * ZLF1 1013 标准发货 (新) + * ZLF3 1014 无票发货 (新) + * ZLF9 1015 有票发货 (新) + * 退货入库(字典值:ST_INV_IN_TYPE) + * ZLR 0002 退货入库 (旧) + * ZLR1 0013 标准退货 (新) + * ZLR3 0014 免费退货 (新) + **/ + public String getBillTypeByLfart(String code){ + String billType = ""; + switch (code){ + case "ZLF1": + billType = "1013"; + break; + case "ZLF3": + billType = "1014"; + break; + case "ZLF9": + billType = "1015"; + break; + case "ZLR1": + billType = "0013"; + break; + case "ZLR2": + billType = "0014"; + break; + default: + if(code.contains("ZLR")){ + billType = "0002"; + } + if (code.contains("ZLF")){ + billType = "1001"; + } + } + return billType; + } @Override public JSONObject getReturnDeliveryInfo(JSONObject jo) { diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/service/impl/ProductInstorServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/service/impl/ProductInstorServiceImpl.java index 0e546b988..0498387e4 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/service/impl/ProductInstorServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/service/impl/ProductInstorServiceImpl.java @@ -182,8 +182,8 @@ public class ProductInstorServiceImpl implements ProductInstorService { //查询仓库 JSONObject stor = new JSONObject(); - if ("BC01".equals(sub_jo.getString("ext_code"))) { - stor = WQLObject.getWQLObject("st_ivt_bsrealstorattr").query("is_delete = '0' AND is_used = '1' AND is_productstore = '0' AND stor_code = 'BC01'").uniqueResult(0); + if ("F002".equals(sub_jo.getString("ext_code"))) { + stor = WQLObject.getWQLObject("st_ivt_bsrealstorattr").query("is_delete = '0' AND is_used = '1' AND is_productstore = '0' AND stor_code = 'F002'").uniqueResult(0); } else { stor = WQLObject.getWQLObject("st_ivt_bsrealstorattr").query("is_delete = '0' AND is_used = '1' AND is_productstore = '1'").uniqueResult(0); } @@ -206,7 +206,7 @@ public class ProductInstorServiceImpl implements ProductInstorService { //判断是否虚拟 if (!"1".equals(is_virtual)) { - if ("BC01".equals(sub_jo.getString("ext_code"))) { + if ("F002".equals(sub_jo.getString("ext_code"))) { throw new BadRequestException("二期仓库木箱,请进行虚拟入库!"); } @@ -388,7 +388,7 @@ public class ProductInstorServiceImpl implements ProductInstorService { // 木箱实称重重量 double real_weight = sub_jo.getDoubleValue("real_weight"); - if (ObjectUtil.isNotEmpty(sub_jo.getString("real_weight")) && "AC01".equals(sub_jo.getString("ext_code"))) { + if (ObjectUtil.isNotEmpty(sub_jo.getString("real_weight")) && "F001".equals(sub_jo.getString("ext_code"))) { // 判断木箱毛重是否超标 if (NumberUtil.sub(box_weight, weight_sys) <= real_weight && NumberUtil.add(box_weight, weight_sys) >= real_weight) { } else { @@ -413,7 +413,7 @@ public class ProductInstorServiceImpl implements ProductInstorService { String task_id = IdUtil.getLongId() + ""; //直接分配虚拟区货位,并确认 - if ("BC01".equals(sub_jo.getString("ext_code"))) { + if ("F002".equals(sub_jo.getString("ext_code"))) { JSONObject jsonObject = WQLObject.getWQLObject("st_ivt_sectattr").query("sect_id = '" + whereJson.getString("sect_id") + "'") .uniqueResult(0); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/wql/PDA_PRODUVTIONOUT.wql b/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/wql/PDA_PRODUVTIONOUT.wql index f66d3abf4..e3ebe180c 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/wql/PDA_PRODUVTIONOUT.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/wql/PDA_PRODUVTIONOUT.wql @@ -145,7 +145,7 @@ mst.is_delete = '0' AND mst.io_type = '1' AND point.point_type = '8' - AND mst.stor_code = 'BC01' + AND mst.stor_code = 'F002' OPTION 输入.box_no <> "" point.vehicle_code LIKE 输入.box_no @@ -315,4 +315,4 @@ ENDSELECT ENDQUERY - ENDIF \ No newline at end of file + ENDIF diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/AutoQueryEnum.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/AutoQueryEnum.java index f9c71f53d..40cdebb92 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/AutoQueryEnum.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/AutoQueryEnum.java @@ -4,9 +4,9 @@ package org.nl.wms.sch; * 仓库枚举 */ public enum AutoQueryEnum { - AC01("01", "兰州一期仓库", "1582991156504039424"), - BC01("02", "兰州二期仓库", "1582991156504039455"), - WK01("03", "东莞仓库", "1597073830499717120"); + F001("01", "铜箔一期成品库", "1582991156504039424"), + F002("02", "铜箔二期成品库", "1582991156504039455"), + F037("03", "东莞仓库", "1597073830499717120"); private String name; private String code; diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AutoCallEmptyVehicle.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AutoCallEmptyVehicle.java index de4d8caeb..a864a4846 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AutoCallEmptyVehicle.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AutoCallEmptyVehicle.java @@ -14,6 +14,7 @@ import org.nl.b_lms.sch.point.dao.StIvtShaftivt; import org.nl.b_lms.sch.point.service.IstIvtShaftivtService; import org.nl.b_lms.sch.task.dao.SchBaseTask; import org.nl.b_lms.sch.task.service.IschBaseTaskService; +import org.nl.b_lms.sch.tasks.slitter.util.MdmDescriptionParseUtils; import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.wql.WQL; import org.nl.modules.wql.core.bean.WQLObject; @@ -562,17 +563,20 @@ public class AutoCallEmptyVehicle { .getString("pcsn") + "'").uniqueResult(0); String paper_tube_or_FRP = plan_jo.getString("paper_tube_or_frp"); String paper_name; + String need_size; + //todo 88549333 因为新物料描述 纸管和 frp管的尺寸位置不一致,所以之前的取数组第三位的写法就存在问题,现修改为根据不同的类型分别获取。 2026年05月19日 18:55 if ("1".equals(paper_tube_or_FRP)) { paper_name = plan_jo.getString("paper_tube_description"); + need_size = MdmDescriptionParseUtils.extractPaperTubeSize(paper_name); } else { paper_name = plan_jo.getString("frp_description"); + need_size = MdmDescriptionParseUtils.extractFRPTubeSizeTrans(paper_name); } if (StrUtil.isEmpty(paper_name)) { //todo:提醒分切计划存在问题无法进行套轴 return; } - - String need_size = String.valueOf(paper_name.split("\\|")[2].charAt(0)); + //获取尺寸 改到上面处理 JSONObject cut_jo = WQLObject.getWQLObject("st_ivt_cutpointivt") .query("ext_code = '" + plan_jo.getString("resource_name") + "'") .uniqueResult(0); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AutoQueryProudDayData.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AutoQueryProudDayData.java index 40ae3747b..ea6ca6a77 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AutoQueryProudDayData.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AutoQueryProudDayData.java @@ -711,34 +711,34 @@ public class AutoQueryProudDayData { // 兰州一期仓(除BC) List collect = dataList.stream() - .filter(row -> row.getString("stor_id").equals(AutoQueryEnum.AC01.getId())) + .filter(row -> row.getString("stor_id").equals(AutoQueryEnum.F001.getId())) .filter(row -> !custBandC.contains(row.getString("customer_name"))) .collect(Collectors.toList()); result.put("Customerqty1", NumberUtil.round(collect.stream().map(row -> row.getDoubleValue("num")).reduce(Double::sum).orElse(0.00).toString(), 2) + ""); // 兰州二期仓(除BC) List collect2 = dataList.stream() - .filter(row -> row.getString("stor_id").equals(AutoQueryEnum.BC01.getId())) + .filter(row -> row.getString("stor_id").equals(AutoQueryEnum.F002.getId())) .filter(row -> !custBandC.contains(row.getString("customer_name"))) .collect(Collectors.toList()); result.put("Customerqty2", NumberUtil.round(collect2.stream().map(row -> row.getDoubleValue("num")).reduce(Double::sum).orElse(0.00).toString(), 2) + ""); // 东莞仓 List collect3 = dataList.stream() - .filter(row -> row.getString("stor_id").equals(AutoQueryEnum.WK01.getId())) + .filter(row -> row.getString("stor_id").equals(AutoQueryEnum.F037.getId())) .collect(Collectors.toList()); result.put("Customerqty3", NumberUtil.round(collect3.stream().map(row -> row.getDoubleValue("num")).reduce(Double::sum).orElse(0.00).toString(), 2) + ""); // 兰州一期仓(B) List collect4 = dataList.stream() - .filter(row -> row.getString("stor_id").equals(AutoQueryEnum.AC01.getId())) + .filter(row -> row.getString("stor_id").equals(AutoQueryEnum.F001.getId())) .filter(row -> custB.contains(row.getString("customer_name"))) .collect(Collectors.toList()); result.put("Customerqty4", NumberUtil.round(collect4.stream().map(row -> row.getDoubleValue("num")).reduce(Double::sum).orElse(0.00).toString(), 2) + ""); // 兰州一期仓(C) List collect5 = dataList.stream() - .filter(row -> row.getString("stor_id").equals(AutoQueryEnum.AC01.getId())) + .filter(row -> row.getString("stor_id").equals(AutoQueryEnum.F001.getId())) .filter(row -> custC.contains(row.getString("customer_name"))) .collect(Collectors.toList()); result.put("Customerqty5", NumberUtil.round(collect5.stream().map(row -> row.getDoubleValue("num")).reduce(Double::sum).orElse(0.00).toString(), 2) + ""); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AutoQueryUpload.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AutoQueryUpload.java index e9aa53b4f..b4b0b3967 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AutoQueryUpload.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AutoQueryUpload.java @@ -34,7 +34,7 @@ public class AutoQueryUpload { if (tryLock){ //查询已经处于分配中、分配完但还未回传给MES的销售出库单 WQLObject wo = WQLObject.getWQLObject("st_ivt_iostorinv"); - JSONArray send_rows = wo.query("bill_type = '1001' AND bill_status IN ( '30', '40' ) AND stor_code = 'AC01' AND upload_mes = '0' AND is_delete = '0'").getResultJSONArray(0); + JSONArray send_rows = wo.query("bill_type = '1001' AND bill_status IN ( '30', '40' ) AND stor_code = 'F001' AND upload_mes = '0' AND is_delete = '0'").getResultJSONArray(0); this.sendInfo(send_rows); } }finally { diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/PaperTubeTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/PaperTubeTask.java index a0ce4a23c..9de7774a1 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/PaperTubeTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/PaperTubeTask.java @@ -1,6 +1,7 @@ package org.nl.wms.sch.tasks; import cn.hutool.core.date.DateUtil; +import org.nl.b_lms.sch.tasks.slitter.util.MdmDescriptionParseUtils; import org.nl.common.utils.IdUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; @@ -102,10 +103,14 @@ public class PaperTubeTask extends AbstractAcsTask { JSONObject plan_jo = WQLObject.getWQLObject("pdm_bi_slittingproductionplan").query("container_name = '" + req_param.getString("container_name1") + "' AND is_delete = '0'").uniqueResult(0); String paper_tube_or_FRP = plan_jo.getString("paper_tube_or_frp"); String paper_name; + String need_size; + // todo 88549333 因为新物料描述 纸管和 frp管的尺寸位置不一致,所以之前的取数组第三位的写法就存在问题,现修改为根据不同的类型分别获取。 2026年05月05日 19:10 if ("1".equals(paper_tube_or_FRP)) { paper_name = plan_jo.getString("paper_tube_description"); + need_size = MdmDescriptionParseUtils.extractPaperTubeSize(paper_name); } else { paper_name = plan_jo.getString("frp_description"); + need_size = MdmDescriptionParseUtils.extractFRPTubeSizeTrans(paper_name); } if (StrUtil.isEmpty(paper_name)) { @@ -114,7 +119,7 @@ public class PaperTubeTask extends AbstractAcsTask { } // mark: 此处为对分切计划的纸管规格进行拆解取值 - String need_size = String.valueOf(paper_name.split("\\|")[2].charAt(0)); + //解析值的操作在上方 JSONObject cut_jo = WQLObject.getWQLObject("st_ivt_cutpointivt").query("ext_code = '" + plan_jo.getString("resource_name") + "'").uniqueResult(0); //获取分切机维护的气涨轴代数 diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/impl/OutChargeServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/impl/OutChargeServiceImpl.java index a2c41d654..169258532 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/impl/OutChargeServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/impl/OutChargeServiceImpl.java @@ -211,7 +211,7 @@ public class OutChargeServiceImpl implements OutChargeService { //将包装关系中对应的记录状态改为包装 HashMap map = new HashMap<>(); map.put("status", "1"); - if (StrUtil.equals(mst_jo.getString("bill_type"), "1001")) { + if (StrUtil.equals(mst_jo.getString("bill_type"), "1001") || StrUtil.equals(mst_jo.getString("bill_type"), "1013") || StrUtil.equals(mst_jo.getString("bill_type"), "1014") || StrUtil.equals(mst_jo.getString("bill_type"), "1015")) { WQLObject.getWQLObject("PDM_BI_SubPackageRelation").update(map, "package_box_SN = '" + dis_row.getString("box_no") + "' AND status = '3'"); } else { WQLObject.getWQLObject("PDM_BI_SubPackageRelation").update(map, "package_box_SN = '" + dis_row.getString("box_no") + "'"); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/wql/QST_IVT_INCHARGE.wql b/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/wql/QST_IVT_INCHARGE.wql index e7224a4cb..967a329a3 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/wql/QST_IVT_INCHARGE.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/wql/QST_IVT_INCHARGE.wql @@ -71,7 +71,7 @@ AND ios.io_type = '0' AND ios.bill_status = '99' AND ios.is_writeoff = '0' - AND ios.bill_type = '0002' + AND ios.bill_type in ('0002','0013','0014') and ios.stor_id in 输入.in_stor_id OPTION 输入.bill_code <> "" ios.bill_code like 输入.bill_code @@ -125,7 +125,7 @@ AND ios.io_type = '0' AND ios.bill_status = '99' AND ios.is_writeoff = '0' - AND ios.bill_type = '0002' + AND ios.bill_type in ('0002','0013','0014') and ios.stor_id in 输入.in_stor_id OPTION 输入.bill_code <> "" ios.bill_code like 输入.bill_code diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/wql/QST_IVT_RAWASSISTISTOR.wql b/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/wql/QST_IVT_RAWASSISTISTOR.wql index 30df8d0a7..4c764b4cf 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/wql/QST_IVT_RAWASSISTISTOR.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/wql/QST_IVT_RAWASSISTISTOR.wql @@ -977,7 +977,7 @@ AND ios.bill_status = '99' AND - ios.bill_type in ('1001','1009') + ios.bill_type in ('1001','1009','1013','1014','1015') AND ios.stor_id in 输入.in_stor_id OPTION 输入.bill_code <> "" diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/service/impl/ProductScrapServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/service/impl/ProductScrapServiceImpl.java index c3321550d..c92384a68 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/service/impl/ProductScrapServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/service/impl/ProductScrapServiceImpl.java @@ -108,6 +108,7 @@ public class ProductScrapServiceImpl implements ProductScrapService { mst_jo.put("biz_date", DateUtil.today()); mst_jo.put("stor_id", MapUtil.getStr(map, "stor_id")); mst_jo.put("stor_code", MapUtil.getStr(map, "stor_code")); + mst_jo.put("scrap_type", MapUtil.getStr(map, "scrap_type")); mst_jo.put("stor_name", MapUtil.getStr(map, "stor_name")); mst_jo.put("bill_status", "10"); mst_jo.put("input_optid", currentUserId + ""); @@ -215,6 +216,10 @@ public class ProductScrapServiceImpl implements ProductScrapService { WQLObject ivt = WQLObject.getWQLObject("st_ivt_structivt"); try { + String scrap_type = whereJson.getString("scrap_type"); + if(StrUtil.isEmpty(scrap_type)){ + scrap_type = "1002"; + } // 查询所有明细 JSONArray dtlArr = dtl.query("scrap_id = '" + whereJson.getString("scrap_id") + "'").getResultJSONArray(0); @@ -253,8 +258,8 @@ public class ProductScrapServiceImpl implements ProductScrapService { jsonOutMst.put("create_mode", "03"); jsonOutMst.put("biz_date", DateUtil.now()); jsonOutMst.put("io_type", "1"); - jsonOutMst.put("buss_type", "1002"); - jsonOutMst.put("bill_type", "1002"); + jsonOutMst.put("buss_type", scrap_type); + jsonOutMst.put("bill_type", scrap_type); jsonOutMst.put("source_name", "成品报废审核单"); JSONArray tableData = new JSONArray(); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/wql/QST_IVT_PRODUCTSCRAP.wql b/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/wql/QST_IVT_PRODUCTSCRAP.wql index 9eaa2da3c..e2ccfa8ae 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/wql/QST_IVT_PRODUCTSCRAP.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/wql/QST_IVT_PRODUCTSCRAP.wql @@ -127,4 +127,4 @@ code = 'FAIL_SOURCE' ENDSELECT ENDQUERY - ENDIF \ No newline at end of file + ENDIF diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/service/impl/CheckOutBillServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/service/impl/CheckOutBillServiceImpl.java index f6f00230e..9b407ddf2 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/service/impl/CheckOutBillServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/service/impl/CheckOutBillServiceImpl.java @@ -1209,8 +1209,9 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { // 更新主表 JSONObject jsonMst = mstTab.query("iostorinv_id = '" + whereJson.getString("iostorinv_id") + "'").uniqueResult(0); - jsonMst.put("is_overdue", whereJson.getString("is_overdue")); - mstTab.update(jsonMst); + HashMap map = new HashMap<>(); + map.put("is_overdue", whereJson.getString("is_overdue")); + mstTab.update(map, "iostorinv_id = '" + whereJson.getString("iostorinv_id") + "'"); // 计算超期数量 List disList = disTab.query("iostorinvdtl_id = '" + whereJson.getString("iostorinvdtl_id") + "' AND is_overdue = '1'") @@ -1220,6 +1221,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { .map(row -> row.getDoubleValue("plan_qty")) .reduce(Double::sum).orElse(0.00); + jsonMst.put("is_overdue", whereJson.getString("is_overdue")); JSONObject result = new JSONObject(); result.put("overdue_qyt", overdue_qyt); result.put("mst", jsonMst); @@ -1262,7 +1264,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { } // 根据交货单找到主单据 - JSONObject jsonMst = WQL.getWO("QST_IVT_CHECKOUTBILL").addParam("flag","22").addParam("vbeln",vbeln).process().uniqueResult(0); + JSONObject jsonMst = WQL.getWO("QST_IVT_CHECKOUTBILL").addParam("flag", "22").addParam("vbeln", vbeln).process().uniqueResult(0); if (ObjectUtil.isEmpty(jsonMst)) { continue; } @@ -3247,12 +3249,12 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { JSONArray structArr = WQLObject.getWQLObject("ST_IVT_StructAttr").query("block_num = '" + jsonRow.getString("block_num") + "' and row_num = '" + jsonRow.getString("row_num") + "' and is_used = '1' and is_delete = '0' and lock_type not in ('1','6','3')").getResultJSONArray(0); if (ObjectUtil.isNotEmpty(structArr)) { - throw new BadRequestException("有仓位被其他业务锁定,仓位编码为【"+structArr.getJSONObject(0).getString("struct_code")+"】,对应单据号为【" + structArr.getJSONObject(0).getString("inv_code") + "】,请稍后在试!"); + throw new BadRequestException("有仓位被其他业务锁定,仓位编码为【" + structArr.getJSONObject(0).getString("struct_code") + "】,对应单据号为【" + structArr.getJSONObject(0).getString("inv_code") + "】,请稍后在试!"); } } } // 1.判断此条分配明细的 ‘仓位’在此主表下的分配明细是否有相同的 ‘仓位’ - List structSet = iStIvtIostorinvdisService.getDisStructSet(whereJson.getString("iostorinv_id"),whereJson.getString("iostorinvdtl_id")); + List structSet = iStIvtIostorinvdisService.getDisStructSet(whereJson.getString("iostorinv_id"), whereJson.getString("iostorinvdtl_id")); //同区同排排序:10302-04-01 //口口回口回口口口1 //口口回回口口口口2 @@ -5658,7 +5660,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { jsonDtl.put("BWART", "311"); jsonDtl.put("MENGE", json.getDoubleValue("real_qty")); jsonDtl.put("MEINS", json.getString("qty_unit_name")); - jsonDtl.put("WERKS", "2460"); + jsonDtl.put("WERKS", "2461"); JSONObject jsonSect = sectTab.query("sect_id = '" + json.getString("sect_id") + "'").uniqueResult(0); if (ObjectUtil.isNotEmpty(jsonSect)) { diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/wql/QST_IVT_CHECKOUTBILL.wql b/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/wql/QST_IVT_CHECKOUTBILL.wql index 88f1027f4..bb715c8ec 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/wql/QST_IVT_CHECKOUTBILL.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/wql/QST_IVT_CHECKOUTBILL.wql @@ -1042,7 +1042,8 @@ mater.material_code, unit.unit_name AS qty_unit_name, attr.storagevehicle_code AS box_no, - sub.sap_pcsn + sub.sap_pcsn, + sub.sale_order_name source_bill_code FROM ST_IVT_StructIvt ivt LEFT JOIN md_me_materialbase mater ON mater.material_id = ivt.material_id diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/returns/service/impl/InAndOutRetrunServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/returns/service/impl/InAndOutRetrunServiceImpl.java index 15d400b8e..7370ab455 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/returns/service/impl/InAndOutRetrunServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/returns/service/impl/InAndOutRetrunServiceImpl.java @@ -191,6 +191,7 @@ public class InAndOutRetrunServiceImpl implements InAndOutReturnService { JSONObject stor_jo = WQLObject.getWQLObject("ST_IVT_BSRealStorAttr").query("stor_id = '" + stor_id + "'").uniqueResult(0); String lgort = stor_jo.getString("ext_id"); String is_productstore = stor_jo.getString("is_productstore"); + //生产入库 if (StrUtil.equals(bill_type, "0001") || StrUtil.equals(bill_type, "0007")) { @@ -421,68 +422,69 @@ public class InAndOutRetrunServiceImpl implements InAndOutReturnService { } // 报废出库:回传mes - if (StrUtil.equals(bill_type, "1007") || StrUtil.equals(bill_type, "1008") || StrUtil.equals(bill_type, "1010") || StrUtil.equals(bill_type, "1002")) { +// if (StrUtil.equals(bill_type, "1007") || StrUtil.equals(bill_type, "1008") || StrUtil.equals(bill_type, "1010") || StrUtil.equals(bill_type, "1002")) { +// +// JSONArray disArr = WQL.getWO("QST_IVT_INANDOUTRETRUN").addParam("flag", "3").addParam("iostorinv_id", jo_mst.getString("iostorinv_id")).process().getResultJSONArray(0); +// +// String box_no_in = disArr.toJavaList(JSONObject.class).stream() +// .map(row -> row.getString("box_no")) +// .collect(Collectors.joining("','")); +// +// // 所有子卷 +// List disList = WQLObject.getWQLObject("st_ivt_iostorinvdis").query("box_no in ('" + box_no_in + "') and iostorinv_id = '" + jo_mst.getString("iostorinv_id") + "'").getResultJSONArray(0).toJavaList(JSONObject.class); +// +// // 查询仓库 +// JSONObject jsonStor = WQLObject.getWQLObject("st_ivt_bsrealstorattr") +// .query("stor_code = '" + jo_mst.getString("stor_code") + "'").uniqueResult(0); +// +// for (int j = 0; j < disArr.size(); j++) { +// JSONObject param = new JSONObject(); +// JSONArray item = new JSONArray(); +// +// JSONObject json = disArr.getJSONObject(j); +// +// JSONObject jsonDtl = new JSONObject(); +// JSONArray details = new JSONArray(); +// +// jsonDtl.put("PackageBoxSN", json.getString("box_no")); +// jsonDtl.put("Status", "1"); +// +// List collect = disList.stream() +// .filter(row -> row.getString("box_no").equals(json.getString("box_no"))) +// .collect(Collectors.toList()); +// +// for (int k = 0; k < collect.size(); k++) { +// JSONObject jsonObject = collect.get(k); +// +// JSONObject jsonObject1 = new JSONObject(); +// jsonObject1.put("ContainerName", jsonObject.getString("pcsn")); +// jsonObject1.put("NetWeight",NumberUtil.toStr(jsonObject.getDoubleValue("plan_qty"))); +// details.add(jsonObject1); +// } +// jsonDtl.put("Details", details); +// item.add(jsonDtl); +// +// param.put("Items", item); +// +// // 仓库编码 +// param.put("WareHouse", jsonStor.getString("ext_id")); +// SpringContextHolder.getBean(LmsToMesServiceImpl.class).ChildScrapUpdate(param); +// +// // 更新分配回传成功 +// JSONObject jsonUpdate = new JSONObject(); +// jsonUpdate.put("is_upload", "1"); +// +// WQLObject.getWQLObject("st_ivt_iostorinvdis") +// .update(jsonUpdate,"iostorinv_id = '"+jo_mst.getString("iostorinv_id")+"' and box_no = '"+json.getString("box_no")+"'"); +// } +// +// jo_mst.put("upload_mes", "1"); +// jo_mst.put("is_upload", "1"); +// jo_mst.put("upload_optid", SecurityUtils.getCurrentUserId()); +// jo_mst.put("upload_time", DateUtil.now()); +// WQLObject.getWQLObject("ST_IVT_IOStorInv").update(jo_mst); +// } - JSONArray disArr = WQL.getWO("QST_IVT_INANDOUTRETRUN").addParam("flag", "3").addParam("iostorinv_id", jo_mst.getString("iostorinv_id")).process().getResultJSONArray(0); - - String box_no_in = disArr.toJavaList(JSONObject.class).stream() - .map(row -> row.getString("box_no")) - .collect(Collectors.joining("','")); - - // 所有子卷 - List disList = WQLObject.getWQLObject("st_ivt_iostorinvdis").query("box_no in ('" + box_no_in + "') and iostorinv_id = '" + jo_mst.getString("iostorinv_id") + "'").getResultJSONArray(0).toJavaList(JSONObject.class); - - // 查询仓库 - JSONObject jsonStor = WQLObject.getWQLObject("st_ivt_bsrealstorattr") - .query("stor_code = '" + jo_mst.getString("stor_code") + "'").uniqueResult(0); - - for (int j = 0; j < disArr.size(); j++) { - JSONObject param = new JSONObject(); - JSONArray item = new JSONArray(); - - JSONObject json = disArr.getJSONObject(j); - - JSONObject jsonDtl = new JSONObject(); - JSONArray details = new JSONArray(); - - jsonDtl.put("PackageBoxSN", json.getString("box_no")); - jsonDtl.put("Status", "1"); - - List collect = disList.stream() - .filter(row -> row.getString("box_no").equals(json.getString("box_no"))) - .collect(Collectors.toList()); - - for (int k = 0; k < collect.size(); k++) { - JSONObject jsonObject = collect.get(k); - - JSONObject jsonObject1 = new JSONObject(); - jsonObject1.put("ContainerName", jsonObject.getString("pcsn")); - jsonObject1.put("NetWeight",NumberUtil.toStr(jsonObject.getDoubleValue("plan_qty"))); - details.add(jsonObject1); - } - jsonDtl.put("Details", details); - item.add(jsonDtl); - - param.put("Items", item); - - // 仓库编码 - param.put("WareHouse", jsonStor.getString("ext_id")); - SpringContextHolder.getBean(LmsToMesServiceImpl.class).ChildScrapUpdate(param); - - // 更新分配回传成功 - JSONObject jsonUpdate = new JSONObject(); - jsonUpdate.put("is_upload", "1"); - - WQLObject.getWQLObject("st_ivt_iostorinvdis") - .update(jsonUpdate,"iostorinv_id = '"+jo_mst.getString("iostorinv_id")+"' and box_no = '"+json.getString("box_no")+"'"); - } - - jo_mst.put("upload_mes", "1"); - jo_mst.put("is_upload", "1"); - jo_mst.put("upload_optid", SecurityUtils.getCurrentUserId()); - jo_mst.put("upload_time", DateUtil.now()); - WQLObject.getWQLObject("ST_IVT_IOStorInv").update(jo_mst); - } /*// 改切出库 if (StrUtil.equals(bill_type, "1003")) { @@ -527,6 +529,10 @@ public class InAndOutRetrunServiceImpl implements InAndOutReturnService { WQLObject subTab = WQLObject.getWQLObject("pdm_bi_subpackagerelationrecord"); // 子卷包装关系表 WQLObject subTab2 = WQLObject.getWQLObject("pdm_bi_subpackagerelation"); + // 成品报废审核主表 + WQLObject scrapTab = WQLObject.getWQLObject("st_ivt_productscrapmst"); + //成品报废审核明细表 + WQLObject scrapDtlTab = WQLObject.getWQLObject("st_ivt_productscrapdtl"); JSONArray rows = whereJson.getJSONArray("rows"); for (int i = 0; i < rows.size(); i++) { @@ -538,9 +544,8 @@ public class InAndOutRetrunServiceImpl implements InAndOutReturnService { JSONObject stor_jo = WQLObject.getWQLObject("ST_IVT_BSRealStorAttr").query("stor_id = '" + stor_id + "'").uniqueResult(0); String lgort = stor_jo.getString("ext_id"); String is_productstore = stor_jo.getString("is_productstore"); - //退货入库 - if (StrUtil.equals(bill_type, "0002")) { - // 1.回传sap + //退货入库 1.回传sap + if (StrUtil.equals(bill_type, "0002") || StrUtil.equals(bill_type, "0013") || StrUtil.equals(bill_type, "0014")) { JSONArray paramSapMstArr = new JSONArray(); JSONObject paramSapMst = new JSONObject(); @@ -678,7 +683,7 @@ public class InAndOutRetrunServiceImpl implements InAndOutReturnService { } // 销售出库 - if (StrUtil.equals(bill_type, "1001") || StrUtil.equals(bill_type, "1011")) { + if (StrUtil.equals(bill_type, "1001") || StrUtil.equals(bill_type, "1011") || StrUtil.equals(bill_type, "1013") || StrUtil.equals(bill_type, "1014") || StrUtil.equals(bill_type, "1015")) { // 1.回传sap JSONArray paramSapMstArr = new JSONArray(); @@ -783,7 +788,7 @@ public class InAndOutRetrunServiceImpl implements InAndOutReturnService { paramDis.put("ZZWLHD", jsonSub.getString("thickness")); paramDis.put("CHARG", jsonSub.getString("sap_pcsn")); paramDis.put("KALAB", NumberUtil.round(jsonDis.getDoubleValue("plan_qty"), 3)); - paramDis.put("WERKS", "2460"); + paramDis.put("WERKS", "2461"); paramSapMstArr.add(paramDis); } param.put("ITEM", paramSapMstArr); @@ -834,7 +839,7 @@ public class InAndOutRetrunServiceImpl implements InAndOutReturnService { jsonDtl.put("BWART", "311"); jsonDtl.put("MENGE", json.getDoubleValue("real_qty")); jsonDtl.put("MEINS", json.getString("qty_unit_name")); - jsonDtl.put("WERKS", "2460"); + jsonDtl.put("WERKS", "2461"); JSONObject jsonSect = sectTab.query("sect_id = '" + json.getString("sect_id") + "'").uniqueResult(0); if (ObjectUtil.isNotEmpty(jsonSect)) { @@ -942,6 +947,72 @@ public class InAndOutRetrunServiceImpl implements InAndOutReturnService { } } + + // 报废出库 + // 2026年05月08日 新改需求修改。 + // 修改内容 1: 报废出库以前回传MES,现不回传MES,直接回传SAP + // 修改内容2: 调整报废出库的类型 bill_type 其中 1002 为 其他报废,进行保留,适配历史数据 + // 其他报废类型: 传SAP业务类型字段: 2003:成品库整卷报废 2004:成品库超期报废 2005:成品库退货报废 + if (StrUtil.equals(bill_type, "2003") || StrUtil.equals(bill_type, "2004") || StrUtil.equals(bill_type, "2005") || StrUtil.equals(bill_type, "1002")) { + JSONObject paramSapScrapMst = new JSONObject(); + JSONArray paramSapScrapDtlArr = new JSONArray(); + JSONArray dtlArr = wo_dtl.query("iostorinv_id = '" + jo_mst.getString("iostorinv_id") + "'").getResultJSONArray(0); + for (int k = 0; k < dtlArr.size(); k++) { + JSONObject json = dtlArr.getJSONObject(k); + JSONObject jsonMater = materTab.query("material_id = '" + json.getString("material_id") + "'").uniqueResult(0); + + // 明细 + JSONObject jsonDtl = new JSONObject(); + jsonDtl.put("WERKS", "2461"); + jsonDtl.put("MATNR", jsonMater.getString("material_code")); + + //获取分配表相关信息 + JSONArray disArr = wo_dis.query("iostorinvdtl_id = '" + json.getString("iostorinvdtl_id") + "'").getResultJSONArray(0); + for (int j = 0; j < disArr.size(); j++) { + JSONObject json2 = disArr.getJSONObject(j); + JSONObject jsonSect = sectTab.query("sect_id = '" + json2.getString("sect_id") + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(jsonSect)) { + jsonDtl.put("LGORT", lgort); // 明細储存地点 + } + JSONObject jsonSub = subTab.query("container_name = '" + json2.getString("pcsn") + "' AND package_box_sn = '" + json2.getString("box_no") + "' AND bill_id = '" + json2.getString("iostorinv_id") + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(jsonSub)) { + jsonDtl.put("CHARG", jsonSub.getString("sap_pcsn")); // sap批次 + } + } + // 数量 + jsonDtl.put("BDMNG", json.getString("assign_qty")); + // 返检修改差异重量 + jsonDtl.put("ZCJZ", json.getString("assign_qty")); + // 返检修改后重量 + jsonDtl.put("ZGHZL", "0"); + // 单位 + jsonDtl.put("VRKME", json.getString("qty_unit_name")); + // MES批次 + jsonDtl.put("Z1", json.getString("pcsn")); + + String sourceBillCode = json.getString("source_bill_code"); + String[] billCode = sourceBillCode.split("-"); + if(billCode.length == 2){ + //销售订单 + jsonDtl.put("VBELN", billCode[0]); + //销售订单行 + jsonDtl.put("POSNR", billCode[1]); + } + //移动原因 + jsonDtl.put("ZYDYY", bill_type); + //来源系统 + jsonDtl.put("ZLYXT", "lms"); + paramSapScrapDtlArr.add(jsonDtl); + } + paramSapScrapMst.put("IT_ITEM", paramSapScrapDtlArr); + // 调用接口回传 + SpringContextHolder.getBean(LmsToSapServiceImpl.class).returnScrapDtl(paramSapScrapMst); + jo_mst.put("upload_sap", "1"); + jo_mst.put("is_upload", "1"); + jo_mst.put("upload_optid", SecurityUtils.getCurrentUserId()); + jo_mst.put("upload_time", DateUtil.now()); + WQLObject.getWQLObject("ST_IVT_IOStorInv").update(jo_mst); + } } } } @@ -1152,7 +1223,7 @@ public class InAndOutRetrunServiceImpl implements InAndOutReturnService { paramDis.put("ZZWLHD", jsonSub.getString("thickness")); paramDis.put("CHARG", jsonSub.getString("sap_pcsn")); paramDis.put("KALAB", NumberUtil.round(jsonDis.getDoubleValue("plan_qty"), 3)); - paramDis.put("WERKS", "2460"); + paramDis.put("WERKS", "2461"); paramSapMstArr.add(paramDis); } param.put("ITEM", paramSapMstArr); @@ -1308,7 +1379,7 @@ public class InAndOutRetrunServiceImpl implements InAndOutReturnService { } // 销售出库 - if (StrUtil.equals(bill_type, "1001") || StrUtil.equals(bill_type, "1011") ) { + if (StrUtil.equals(bill_type, "1001") || StrUtil.equals(bill_type, "1011") || StrUtil.equals(bill_type, "1013") || StrUtil.equals(bill_type, "1014") || StrUtil.equals(bill_type, "1015")) { // 1.回传sap JSONArray paramSapMstArr = new JSONArray(); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/stat/service/impl/InBillQueryServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/stat/service/impl/InBillQueryServiceImpl.java index bbc9a88a1..69a26452b 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/stat/service/impl/InBillQueryServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/stat/service/impl/InBillQueryServiceImpl.java @@ -10,6 +10,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.nl.b_lms.sch.tasks.slitter.util.MdmDescriptionParseUtils; import org.nl.common.utils.SecurityUtils; import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.common.utils.FileUtil; @@ -300,9 +301,11 @@ public class InBillQueryServiceImpl implements InBillQueryService { mp.put("实际尺寸(mm)(实际幅宽)", json.getString("width")); String box_name = json.getString("box_name"); if (StrUtil.isNotEmpty(box_name)) { - String[] s = box_name.split("木箱"); - String s1 = s[1]; - String[] split = s1.split("\\|"); + // todo 88549333 箱号规格解析 2026年5月20日16:05:45 +// String[] s = box_name.split("木箱"); +// String s1 = s[1]; +// String[] split = s1.split("\\|"); + String[] split = MdmDescriptionParseUtils.parseMxBoxDetailInfo(box_name); mp.put("木箱规格/尺寸", split[1] + "*" + split[2]); } else { mp.put("木箱规格/尺寸", ""); @@ -480,9 +483,12 @@ public class InBillQueryServiceImpl implements InBillQueryService { mp.put("客户要求幅宽", json.getString("width_standard")); String box_name = json.getString("box_name"); if (StrUtil.isNotEmpty(box_name)) { - String[] s = box_name.split("木箱"); - String s1 = s[1]; - String[] split = s1.split("\\|"); + // todo 88549333 箱号规格解析 2026年5月20日16:05:45 +// String[] s = box_name.split("木箱"); +// String s1 = s[1]; +// String[] split = s1.split("\\|"); +// mp.put("木箱规格/尺寸", split[1] + "*" + split[2]); + String[] split = MdmDescriptionParseUtils.parseMxBoxDetailInfo(box_name); mp.put("木箱规格/尺寸", split[1] + "*" + split[2]); } else { mp.put("木箱规格/尺寸", ""); @@ -545,5 +551,4 @@ public class InBillQueryServiceImpl implements InBillQueryService { } FileUtil.downloadExcel(list, response); } - } diff --git a/lms/nladmin-system/src/main/resources/config/application-dev.yml b/lms/nladmin-system/src/main/resources/config/application-dev.yml index 564da1c16..93b23cb0f 100644 --- a/lms/nladmin-system/src/main/resources/config/application-dev.yml +++ b/lms/nladmin-system/src/main/resources/config/application-dev.yml @@ -43,9 +43,9 @@ spring: reset-enable: false filters: DruidFilter,stat - url: jdbc:mysql://localhost:3306/lms_xc?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true&allowPublicKeyRetrieval=true + url: jdbc:mysql://10.1.3.88:3306/lms?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true&allowPublicKeyRetrieval=true username: root - password: root + password: NLABC&hl123 slave: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver @@ -84,9 +84,9 @@ spring: reset-enable: false filters: DruidFilter,stat - url: jdbc:mysql://127.0.0.1:3306/lms_xc?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true&allowPublicKeyRetrieval=true + url: jdbc:mysql://10.1.3.88:3306/lms?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true&allowPublicKeyRetrieval=true username: root - password: root + password: NLABC&hl123 rules: readwrite-splitting: data-sources: diff --git a/lms/nladmin-system/src/main/resources/logback-spring.xml b/lms/nladmin-system/src/main/resources/logback-spring.xml index 2c520ee34..6995a1ab5 100644 --- a/lms/nladmin-system/src/main/resources/logback-spring.xml +++ b/lms/nladmin-system/src/main/resources/logback-spring.xml @@ -25,7 +25,7 @@ https://juejin.cn/post/6844903775631572999 - + true diff --git a/lms/nladmin-ui/public/config.js b/lms/nladmin-ui/public/config.js index a4c28810e..484ae58e7 100644 --- a/lms/nladmin-ui/public/config.js +++ b/lms/nladmin-ui/public/config.js @@ -1,6 +1,6 @@ window.g = { dev: { - VUE_APP_BASE_API: 'http://localhost:8081' + VUE_APP_BASE_API: 'http://localhost:8013' }, prod: { VUE_APP_BASE_API: 'http://localhost:8081' diff --git a/lms/nladmin-ui/src/api/monitor/sysapilog.js b/lms/nladmin-ui/src/api/monitor/sysapilog.js new file mode 100644 index 000000000..488724b6a --- /dev/null +++ b/lms/nladmin-ui/src/api/monitor/sysapilog.js @@ -0,0 +1,17 @@ +import request from '@/utils/request' + +export function getBizCodeList(systemFlag, direction) { + return request({ + url: 'api/sysApiLog/bizCodeList', + method: 'get', + params: { systemFlag, direction } + }) +} + +export function archiveLogs() { + return request({ + url: 'api/sysApiLog/archive', + method: 'post' + }) +} +export default { getBizCodeList, archiveLogs } diff --git a/lms/nladmin-ui/src/views/login.vue b/lms/nladmin-ui/src/views/login.vue index 7b3de2254..34adec290 100644 --- a/lms/nladmin-ui/src/views/login.vue +++ b/lms/nladmin-ui/src/views/login.vue @@ -1,9 +1,9 @@