Browse Source

销售退货报废

master
han\hanst 3 months ago
parent
commit
d8a43be504
  1. 27
      src/main/java/com/gaotao/modules/salesreturn/controller/SalesReturnController.java
  2. 84
      src/main/java/com/gaotao/modules/salesreturn/entity/SalesReturnScrapDto.java
  3. 7
      src/main/java/com/gaotao/modules/salesreturn/service/SalesReturnService.java
  4. 99
      src/main/java/com/gaotao/modules/salesreturn/service/impl/SalesReturnServiceImpl.java

27
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());
}
}
}

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

7
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<String, Object> processRmaInbound(SalesReturnDto dto);
/**
* 销售退货报废调用IFS RMAScrapPart API
* @param dto 销售退货报废DTO
*/
void processRmaScrap(SalesReturnScrapDto dto);
}

99
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<String, Object> 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());
}
}
}
Loading…
Cancel
Save