From 74e8d88a660039522dd620cd9e72ed1d19d72ddd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BD=98=E8=8D=A3=E6=99=9F?= <9691125+pan-rongsheng@user.noreply.gitee.com> Date: Fri, 27 Feb 2026 16:36:37 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9D=A5=E6=96=99=E5=8A=A0=E5=B7=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...iginalMaterialProcessingDetailService.java | 1 + ...alMaterialProcessingDetailServiceImpl.java | 61 ++++++++++++++ ...inalMaterialProcessingServiceImplImpl.java | 84 +++++++++++++++++-- 3 files changed, 140 insertions(+), 6 deletions(-) diff --git a/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/service/originalmaterialprocessing/OriginalMaterialProcessingDetailService.java b/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/service/originalmaterialprocessing/OriginalMaterialProcessingDetailService.java index bea8da76..26ff53ae 100644 --- a/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/service/originalmaterialprocessing/OriginalMaterialProcessingDetailService.java +++ b/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/service/originalmaterialprocessing/OriginalMaterialProcessingDetailService.java @@ -102,4 +102,5 @@ public interface OriginalMaterialProcessingDetailService { */ List queryOriginalMaterialProcessingDetailListByOrderId(Long orderId); + void updateOriginalMaterialProcessingDetailList(List originalMaterialProcessingDetailSaveReqVOS); } \ No newline at end of file diff --git a/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/service/originalmaterialprocessing/OriginalMaterialProcessingDetailServiceImpl.java b/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/service/originalmaterialprocessing/OriginalMaterialProcessingDetailServiceImpl.java index 1b2a5335..ccc7db62 100644 --- a/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/service/originalmaterialprocessing/OriginalMaterialProcessingDetailServiceImpl.java +++ b/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/service/originalmaterialprocessing/OriginalMaterialProcessingDetailServiceImpl.java @@ -1,6 +1,8 @@ package com.zt.plat.module.contractorder.service.originalmaterialprocessing; import cn.hutool.core.collection.CollUtil; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; import com.zt.plat.framework.common.pojo.CommonResult; import com.zt.plat.module.base.api.materialinfomation.MaterialInfomationApi; import com.zt.plat.module.base.api.materialinfomation.dto.MaterialInfomationPageReqDTO; @@ -12,7 +14,9 @@ import com.zt.plat.module.contractorder.controller.admin.originalmaterialprocess import com.zt.plat.module.contractorder.controller.admin.originalmaterialprocessing.vo.OriginalMaterialProcessingDetailSaveReqVO; import com.zt.plat.module.contractorder.dal.dataobject.entrustorder.EntrustOrderDetailDO; import com.zt.plat.module.contractorder.dal.dataobject.originalmaterialprocessing.OriginalMaterialProcessingDetailDO; +import com.zt.plat.module.contractorder.dal.dataobject.salesorder.SalesOrderDetailDO; import com.zt.plat.module.contractorder.dal.mysql.originalmaterialprocessing.OriginalMaterialProcessingDetailMapper; +import com.zt.plat.module.contractorder.enums.ErpConstants; import com.zt.plat.module.erp.service.erp.ErpOrderService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -136,6 +140,63 @@ public class OriginalMaterialProcessingDetailServiceImpl implements OriginalMate return originalMaterialProcessingDetailMapper.selectList(OriginalMaterialProcessingDetailDO::getOrderId, orderId); } + @Override + public void updateOriginalMaterialProcessingDetailList(List originalMaterialProcessingDetailSaveReqVOS) { + List beanList = BeanUtils.toBean(originalMaterialProcessingDetailSaveReqVOS, OriginalMaterialProcessingDetailDO.class); + beanList.forEach(this::setElemInfo); + + beanList.forEach(item -> { + String priceConditionDetail = item.getPriceConditionDetail(); + // 空值校验,避免空指针异常 + if (priceConditionDetail == null || priceConditionDetail.isEmpty()) { + return; + } + + // 2. 解析外层JSON数组(原嵌套数组) + List outerJsonArrays = JSONArray.parseArray(priceConditionDetail, JSONArray.class); + if (item.getId() != null && !outerJsonArrays.isEmpty()) { + // 核心修改:定义一维集合,收集所有扁平后的元素 + List flatProcessedElements = new ArrayList<>(); + + // 遍历外层数组,扁平化所有内层元素 + for (JSONArray innerJsonArray : outerJsonArrays) { + if (innerJsonArray == null || innerJsonArray.isEmpty()) { + continue; + } + // 遍历当前内层数组的每个元素,做flag处理 + for (int innerIdx = 0; innerIdx < innerJsonArray.size(); innerIdx++) { + String originalJsonStr = innerJsonArray.getString(innerIdx); + if (originalJsonStr == null || originalJsonStr.isEmpty()) { + continue; + } + JSONObject jsonObject = JSONObject.parseObject(originalJsonStr); + String flag = jsonObject.getString("flag"); + + // 根据flag处理:D删除,I改U,其他保留 + if (ErpConstants.SALES_DOCUMENT_REQUEST_FLAG_D.equals(flag)) { + continue; // D直接跳过(删除) + } else if (ErpConstants.SALES_DOCUMENT_REQUEST_FLAG_I.equals(flag)) { + jsonObject.put("flag", ErpConstants.SALES_DOCUMENT_REQUEST_FLAG_U); + flatProcessedElements.add(jsonObject); // 加入一维集合 + } else { + flatProcessedElements.add(jsonObject); // 其他flag直接加入 + } + } + } + + // 3. 把扁平后的一维集合转为JSON数组,直接作为最终结果 + JSONArray finalOneDimensionalArray = JSONArray.parseArray(JSONArray.toJSONString(flatProcessedElements)); + // 4. 重新设置处理后的JSON字符串(此时就是[{},{}]格式) + item.setPriceConditionDetail(finalOneDimensionalArray.toString()); + } else { + // 无外层数组/无ID时,保持原空值(避免写入空数组[],可根据业务调整) + item.setPriceConditionDetail(priceConditionDetail); + } + }); + // 6. 批量插入/更新 + originalMaterialProcessingDetailMapper.insertOrUpdate(beanList); + } + @Override public List getOriginalMaterialProcessingDetailListByOrderId(Long orderId) { return BeanUtils.toBean(originalMaterialProcessingDetailMapper.selectList(OriginalMaterialProcessingDetailDO::getOrderId, orderId), OriginalMaterialProcessingDetailRespVO.class); diff --git a/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/service/originalmaterialprocessing/OriginalMaterialProcessingServiceImplImpl.java b/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/service/originalmaterialprocessing/OriginalMaterialProcessingServiceImplImpl.java index c589c886..0115b4f5 100644 --- a/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/service/originalmaterialprocessing/OriginalMaterialProcessingServiceImplImpl.java +++ b/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/service/originalmaterialprocessing/OriginalMaterialProcessingServiceImplImpl.java @@ -16,18 +16,18 @@ import com.zt.plat.module.base.api.materialinfomation.MaterialInfomationApi; import com.zt.plat.module.base.api.materialinfomation.dto.MaterialInfomationPageReqDTO; import com.zt.plat.module.base.api.materialinfomation.dto.MaterialInfomationRespDTO; import com.zt.plat.module.contractorder.api.vo.contract.ContractRespVO; -import com.zt.plat.module.contractorder.controller.admin.originalmaterialprocessing.vo.OriginalMaterialProcessingDetailRespVO; -import com.zt.plat.module.contractorder.controller.admin.originalmaterialprocessing.vo.OriginalMaterialProcessingPageReqVO; -import com.zt.plat.module.contractorder.controller.admin.originalmaterialprocessing.vo.OriginalMaterialProcessingRespVO; -import com.zt.plat.module.contractorder.controller.admin.originalmaterialprocessing.vo.OriginalMaterialProcessingSaveReqVO; +import com.zt.plat.module.contractorder.controller.admin.originalmaterialprocessing.vo.*; import com.zt.plat.module.contractorder.controller.admin.purchaseorder.vo.DownOrUpOrderReqVO; import com.zt.plat.module.contractorder.controller.admin.purchaseorder.vo.DownOrUpOrderRespVO; import com.zt.plat.module.contractorder.controller.admin.purchaseorder.vo.LinkOrderReqVO; import com.zt.plat.module.contractorder.controller.admin.purchaseorder.vo.PurchaseOrderRespVO; +import com.zt.plat.module.contractorder.controller.admin.salesorder.vo.SalesOrderDetailRespVO; +import com.zt.plat.module.contractorder.controller.admin.salesorder.vo.SalesOrderDetailSaveReqVO; import com.zt.plat.module.contractorder.dal.dataobject.contract.SystemRelativityDO; import com.zt.plat.module.contractorder.dal.dataobject.entrustorder.EntrustOrderOrderDO; import com.zt.plat.module.contractorder.dal.dataobject.originalmaterialprocessing.OriginalMaterialProcessingDO; import com.zt.plat.module.contractorder.dal.dataobject.originalmaterialprocessing.OriginalMaterialProcessingDetailDO; +import com.zt.plat.module.contractorder.dal.dataobject.salesorder.SalesOrderDO; import com.zt.plat.module.contractorder.dal.mysql.contract.SystemRelativityMapper; import com.zt.plat.module.contractorder.dal.mysql.originalmaterialprocessing.OriginalMaterialProcessingMapper; import com.zt.plat.module.contractorder.enums.OrderTypeEnum; @@ -430,8 +430,77 @@ public class OriginalMaterialProcessingServiceImplImpl implements OriginalMateri build091ReqData(originalMaterialProcessingDO, originalMaterialProcessingDetailDOS, erpSalesOrderSaveReqVO); //提交091 String result = erpOrderService.submitOrderToErp091(erpSalesOrderSaveReqVO); - log.info("提交订单结果:{}", result); + log.info("ERP返回结果:{}", result); + OriginalMaterialProcessingDO upVo = new OriginalMaterialProcessingDO(); + upVo.setId(originalMaterialProcessingDO.getId()); + JSONObject rootObj = JSONObject.parseObject(result); + String flag = rootObj.getString("flag"); + if (result != null && !result.trim().isEmpty()&&"S".equals(flag)) { + try { + // ========== FastJSON2 核心解析 ========== + // 3. 解析E_RESP + String eRespStr = rootObj.getString("E_RESP"); + String salesdocument = null; + if (eRespStr != null && !eRespStr.trim().isEmpty()) { + JSONObject eRespObj = JSONObject.parseObject(eRespStr); + // 提取销售单号并去除空格 + salesdocument = eRespObj.getString("SALESDOCUMENT"); + if (salesdocument != null) { + salesdocument = salesdocument.trim(); + } + } + upVo.setOrderSAPNumber(salesdocument); + + String resStr = rootObj.getString("resStr"); + List msgList = null; + if (resStr != null && !resStr.trim().isEmpty()) { + JSONArray msgArray = JSONArray.parseArray(resStr); + msgList = msgArray.stream().map(item -> (JSONObject) item).toList(); + } + + // 5. 业务成功/失败判断 + if (salesdocument != null && !salesdocument.isEmpty()) { + // 成功:更新为FIND状态 + upVo.setErpStatus(OrderStatusEnum.FIND.getCode()); + upVo.setCause("ERP订单提交成功,SAP单号:" + salesdocument); + //价格条件flag变更为U + updateConditionFlag(originalMaterialProcessingDetailDOS); + } else { + // 失败:拼接详细原因 + StringBuilder failMsg = new StringBuilder("ERP订单提交失败:"); + failMsg.append("flag=").append(flag).append(",SAP单号=").append(salesdocument).append(";"); + + if (msgList != null && !msgList.isEmpty()) { + for (JSONObject msg : msgList) { + String type = msg.getString("TYPE"); + String message = msg.getString("MESSAGE"); + String number = msg.getString("NUMBER"); + failMsg.append("[").append(type).append("]").append(number).append(":").append(message).append("; "); + } + } else { + failMsg.append("无具体返回消息"); + } + upVo.setErpStatus(OrderStatusEnum.RLBK.getCode()); + upVo.setCause(failMsg.toString()); + } + } catch (Exception e) { + // 捕获所有解析异常,保证流程不中断 + log.error("FastJSON2解析ERP返回结果失败", e); + upVo.setErpStatus(OrderStatusEnum.RLBK.getCode()); + upVo.setCause("解析ERP返回结果失败:" + e.getMessage()); + } + } else { + upVo.setErpStatus(OrderStatusEnum.RLBK.getCode()); + upVo.setCause(rootObj.toString().isBlank()?"ERP返回结果为空":rootObj.toString()); + } + // 执行数据库更新 + originalMaterialProcessingMapper.updateById(upVo); } + private void updateConditionFlag(List originalMaterialProcessingDetailList){ + log.info("更新明细的价格条件操作类型为U,ID:【{}】", originalMaterialProcessingDetailList.stream().map(OriginalMaterialProcessingDetailDO::getId).toList()); + originalMaterialProcessingDetailService.updateOriginalMaterialProcessingDetailList(BeanUtils.toBean(originalMaterialProcessingDetailList, OriginalMaterialProcessingDetailSaveReqVO.class)); + } + private void build091ReqData(OriginalMaterialProcessingDO salesOrder, List originalMaterialProcessingDetailDOS, ErpSalesOrderSaveReqVO erpSalesOrderSaveReqVO) { erpSalesOrderSaveReqVO.setOrderNo(salesOrder.getSystemOrderNumber()); @@ -461,7 +530,8 @@ public class OriginalMaterialProcessingServiceImplImpl implements OriginalMateri originalMaterialProcessingDetailDOS.forEach(detail -> { ErpSalesOrderSaveReqVO.Item item = new ErpSalesOrderSaveReqVO.Item(); item.setItem_categ(String.valueOf(detail.getLineNumber())); - item.setMaterial(completePrefix(getMtrlZhongtongCode(detail.getMaterialNumber()))); + String mtrlZhongtongCode = getMtrlZhongtongCode(detail.getMaterialNumber()); + item.setMaterial(mtrlZhongtongCode.isEmpty()?null:completePrefix(mtrlZhongtongCode)); item.setPlant(detail.getSendFactoryNumber()); item.setStore_loc(detail.getSendWarehouseNumber()); item.setSales_unit(detail.getUnit()); @@ -471,6 +541,7 @@ public class OriginalMaterialProcessingServiceImplImpl implements OriginalMateri item.setItem_categ(detail.getProjectCategory()); item.setShip_point(detail.getShippingPlace()); // 装运地点 item.setAcct_assgt(detail.getMetalAcctasscatGroup());//todo 物料科目分配组 + item.setItm_number(Math.toIntExact(detail.getLineNumber())); items.add(item); //conds @@ -489,6 +560,7 @@ public class OriginalMaterialProcessingServiceImplImpl implements OriginalMateri } }); erpSalesOrderSaveReqVO.setConds(conds); + erpSalesOrderSaveReqVO.setItems(items); } @Override