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
+ *
+ *
功能说明:用于销售退货报废接口数据传输
+ *
+ * 业务规则:
+ *
+ * - 不需要创建HU
+ * - 不需要出入库操作
+ * - 必须选择报废原因
+ * - 调用IFS RMAScrapPart接口
+ *
+ *
+ * @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());
+ }
+ }
}