From d8a43be504a3f3954ddab734daf933eecb32ca5c Mon Sep 17 00:00:00 2001 From: "han\\hanst" Date: Wed, 29 Oct 2025 15:25:20 +0800 Subject: [PATCH] =?UTF-8?q?=E9=94=80=E5=94=AE=E9=80=80=E8=B4=A7=E6=8A=A5?= =?UTF-8?q?=E5=BA=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/SalesReturnController.java | 27 +++++ .../entity/SalesReturnScrapDto.java | 84 ++++++++++++++++ .../service/SalesReturnService.java | 7 ++ .../service/impl/SalesReturnServiceImpl.java | 99 +++++++++++++++++++ 4 files changed, 217 insertions(+) create mode 100644 src/main/java/com/gaotao/modules/salesreturn/entity/SalesReturnScrapDto.java diff --git a/src/main/java/com/gaotao/modules/salesreturn/controller/SalesReturnController.java b/src/main/java/com/gaotao/modules/salesreturn/controller/SalesReturnController.java index 1c8b74f..f60def2 100644 --- a/src/main/java/com/gaotao/modules/salesreturn/controller/SalesReturnController.java +++ b/src/main/java/com/gaotao/modules/salesreturn/controller/SalesReturnController.java @@ -2,6 +2,7 @@ package com.gaotao.modules.salesreturn.controller; import com.gaotao.common.utils.R; import com.gaotao.modules.salesreturn.entity.SalesReturnDto; +import com.gaotao.modules.salesreturn.entity.SalesReturnScrapDto; import com.gaotao.modules.salesreturn.service.SalesReturnService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -84,4 +85,30 @@ public class SalesReturnController { return R.error("入库失败: " + e.getMessage()); } } + + /** + * @Author System + * @Description 销售退货报废(调用IFS RMAScrapPart API) + * @Date 2025/01/29 + * @Param [dto] 销售退货报废DTO + * @return com.gaotao.common.utils.R + **/ + @PostMapping("/processRmaScrap") + public R processRmaScrap(@RequestBody SalesReturnScrapDto dto) { + try { + log.info("销售退货报废: RMA号={}, 行号={}, 物料={}, 数量={}, 报废原因={}", + dto.getRmaNo(), dto.getRmaLineNo(), dto.getPartNo(), + dto.getScrapQty(), dto.getRejectReason()); + + salesReturnService.processRmaScrap(dto); + + log.info("报废成功: RMA号={}, 物料={}", dto.getRmaNo(), dto.getPartNo()); + + return R.ok("报废成功"); + + } catch (Exception e) { + log.error("销售退货报废失败: " + e.getMessage(), e); + return R.error("报废失败: " + e.getMessage()); + } + } } diff --git a/src/main/java/com/gaotao/modules/salesreturn/entity/SalesReturnScrapDto.java b/src/main/java/com/gaotao/modules/salesreturn/entity/SalesReturnScrapDto.java new file mode 100644 index 0000000..857a703 --- /dev/null +++ b/src/main/java/com/gaotao/modules/salesreturn/entity/SalesReturnScrapDto.java @@ -0,0 +1,84 @@ +package com.gaotao.modules.salesreturn.entity; + +import lombok.Data; +import java.math.BigDecimal; + +/** + * 销售退货报废DTO + * + *

功能说明:用于销售退货报废接口数据传输

+ * + *

业务规则:

+ * + * + * @author System + * @since 2025-01-29 + */ +@Data +public class SalesReturnScrapDto { + /** + * 站点编码 + */ + private String site; + + /** + * RMA号 + */ + private String rmaNo; + + /** + * RMA行号 + */ + private Integer rmaLineNo; + + /** + * 物料编码 + */ + private String partNo; + + /** + * 报废数量 + */ + private BigDecimal scrapQty; + + /** + * 批次号 + */ + private String batchNo; + + /** + * 配置ID(通常为*) + */ + private String configurationId; + + /** + * 条件代码 + */ + private String conditionCode; + + /** + * 序列号(通常为*) + */ + private String serialNo; + + /** + * 工程变更级别(通常为1) + */ + private String engChgLevel; + + /** + * WDR(通常为*) + */ + private String wdr; + + /** + * 报废原因代码(必填) + */ + private String rejectReason; +} + diff --git a/src/main/java/com/gaotao/modules/salesreturn/service/SalesReturnService.java b/src/main/java/com/gaotao/modules/salesreturn/service/SalesReturnService.java index 2242fc8..bb1bc69 100644 --- a/src/main/java/com/gaotao/modules/salesreturn/service/SalesReturnService.java +++ b/src/main/java/com/gaotao/modules/salesreturn/service/SalesReturnService.java @@ -1,6 +1,7 @@ package com.gaotao.modules.salesreturn.service; import com.gaotao.modules.salesreturn.entity.SalesReturnDto; +import com.gaotao.modules.salesreturn.entity.SalesReturnScrapDto; import java.util.List; import java.util.Map; @@ -16,4 +17,10 @@ public interface SalesReturnService { * @return Map包含transNo和unitIds列表 */ Map processRmaInbound(SalesReturnDto dto); + + /** + * 销售退货报废(调用IFS RMAScrapPart API) + * @param dto 销售退货报废DTO + */ + void processRmaScrap(SalesReturnScrapDto dto); } diff --git a/src/main/java/com/gaotao/modules/salesreturn/service/impl/SalesReturnServiceImpl.java b/src/main/java/com/gaotao/modules/salesreturn/service/impl/SalesReturnServiceImpl.java index a9ba9ed..02ebcb1 100644 --- a/src/main/java/com/gaotao/modules/salesreturn/service/impl/SalesReturnServiceImpl.java +++ b/src/main/java/com/gaotao/modules/salesreturn/service/impl/SalesReturnServiceImpl.java @@ -9,6 +9,7 @@ import com.gaotao.modules.handlingunit.entity.HandlingUnit; import com.gaotao.modules.handlingunit.service.HandlingUnitIdGeneratorService; import com.gaotao.modules.handlingunit.service.HandlingUnitService; import com.gaotao.modules.salesreturn.entity.SalesReturnDto; +import com.gaotao.modules.salesreturn.entity.SalesReturnScrapDto; import com.gaotao.modules.salesreturn.service.SalesReturnService; import com.gaotao.modules.trans.entity.TransDetail; import com.gaotao.modules.trans.entity.TransHeader; @@ -411,4 +412,102 @@ public class SalesReturnServiceImpl implements SalesReturnService { throw new XJException("IFS同步异常: " + e.getMessage()); } } + + /** + * @Author System + * @Description 销售退货报废 - 调用IFS RMAScrapPart API + * @Date 2025/01/29 + * @Param [dto] 销售退货报废DTO + **/ + @Override + @Transactional(rollbackFor = Exception.class) + public void processRmaScrap(SalesReturnScrapDto dto) { + log.info("=== 开始销售退货报废 ==="); + log.info("RMA号: {}, 行号: {}, 物料: {}, 数量: {}, 报废原因: {}", + dto.getRmaNo(), dto.getRmaLineNo(), dto.getPartNo(), + dto.getScrapQty(), dto.getRejectReason()); + + try { + // 1. 参数校验 + if (dto.getScrapQty() == null || dto.getScrapQty().compareTo(BigDecimal.ZERO) <= 0) { + throw new XJException("报废数量必须大于0"); + } + + if (dto.getRejectReason() == null || dto.getRejectReason().trim().isEmpty()) { + throw new XJException("请选择报废原因"); + } + + // 2. 调用IFS RMAScrapPart接口 + syncScrapToIfs(dto); + + log.info("=== 销售退货报废完成 === RMA号: {}, 物料: {}, 数量: {}", + dto.getRmaNo(), dto.getPartNo(), dto.getScrapQty()); + + } catch (XJException e) { + log.error("=== 销售退货报废失败 === 错误: {}", e.getMessage()); + throw e; + } catch (Exception e) { + log.error("=== 销售退货报废异常 === ", e); + throw new XJException("销售退货报废失败: " + e.getMessage()); + } + } + + /** + * 同步报废信息到IFS - 调用RMAScrapPart API + */ + private void syncScrapToIfs(SalesReturnScrapDto dto) { + try { + log.info("开始同步到IFS: RMA={}, 物料={}, 数量={}", + dto.getRmaNo(), dto.getPartNo(), dto.getScrapQty()); + + // 构建IFS请求参数 + Map params = new HashMap<>(); + params.put("ifsDBName", ifsDBName); + params.put("domainUserID", getCurrentDomainUserID()); + params.put("ifsSiteID", dto.getSite()); + params.put("ifsRMANo", dto.getRmaNo()); + params.put("ifsRmaLineNo", dto.getRmaLineNo() != null ? dto.getRmaLineNo().toString() : "1"); + params.put("ifsPartNo", dto.getPartNo()); + params.put("ifsConfigurationID", dto.getConfigurationId() != null ? dto.getConfigurationId() : "*"); + params.put("ifsQytToScrap", dto.getScrapQty().doubleValue()); + params.put("ifsConditionCode", dto.getConditionCode()); + params.put("ifsLotBatchNo", dto.getBatchNo()); + params.put("ifsSerialNo", dto.getSerialNo() != null ? dto.getSerialNo() : "*"); + params.put("ifsEngChgLevel", dto.getEngChgLevel() != null ? dto.getEngChgLevel() : "1"); + params.put("ifsWDR", dto.getWdr() != null ? dto.getWdr() : "*"); + params.put("ifsRejectReason", dto.getRejectReason()); + + ObjectMapper objectMapper = new ObjectMapper(); + String jsonBody = objectMapper.writeValueAsString(params); + + log.info("IFS请求参数: {}", jsonBody); + + // 调用IFS API + String ifsResponse = com.gaotao.common.utils.HttpUtils.doPost( + ifsUrl + "RMAScrapPart", + jsonBody, + null + ); + + log.info("IFS响应: {}", ifsResponse); + + // 检查返回结果 + if ("IFSUpdated".equals(ifsResponse) || "\"IFSUpdated\"".equals(ifsResponse)) { + log.info("IFS报废同步成功: RMA={}, 物料={}", dto.getRmaNo(), dto.getPartNo()); + } else { + log.error("IFS报废同步失败: RMA={}, 物料={}, 响应={}", + dto.getRmaNo(), dto.getPartNo(), ifsResponse); + // 提取Oracle错误信息 + String errorMessage = com.gaotao.common.utils.IfsErrorMessageUtils.extractOracleErrorMessage(ifsResponse); + throw new XJException("IFS报废同步失败: " + errorMessage); + } + + } catch (XJException e) { + throw e; + } catch (Exception e) { + log.error("IFS报废同步异常: RMA={}, 物料={}, 错误={}", + dto.getRmaNo(), dto.getPartNo(), e.getMessage()); + throw new XJException("IFS报废同步异常: " + e.getMessage()); + } + } }