feat(inventory): 添加退料入库质检功能

- 集成QMS服务用于质检申请推送
- 在退料入库流程中添加质检状态字段和验证逻辑
- 实现质检状态过滤和业务规则校验
- 新增质检申请接口和推送质检方法
- 更新退料入库项目实体添加质检状态属性
This commit is contained in:
曹鹏飞 2026-06-26 10:44:05 +08:00
parent ffb052e79c
commit f8329b7c4e
3 changed files with 75 additions and 2 deletions

View File

@ -11,6 +11,7 @@ import com.nflg.wms.admin.pojo.request.NoScanningRequest;
import com.nflg.wms.admin.repository.InMaterialScanRecordRespository; import com.nflg.wms.admin.repository.InMaterialScanRecordRespository;
import com.nflg.wms.admin.service.BasdeSerialNumberControllerService; import com.nflg.wms.admin.service.BasdeSerialNumberControllerService;
import com.nflg.wms.admin.service.NoScanningBaseControllerService; import com.nflg.wms.admin.service.NoScanningBaseControllerService;
import com.nflg.wms.admin.service.QmsService;
import com.nflg.wms.admin.service.SapService; import com.nflg.wms.admin.service.SapService;
import com.nflg.wms.admin.util.*; import com.nflg.wms.admin.util.*;
import com.nflg.wms.common.constant.BarCodeProcessStage; import com.nflg.wms.common.constant.BarCodeProcessStage;
@ -96,6 +97,9 @@ public class InCostCenterBackController extends BaseController {
@Resource @Resource
private NoScanningBaseControllerService noScanningBaseControllerService; private NoScanningBaseControllerService noScanningBaseControllerService;
@Resource
private QmsService qmsService;
/** /**
* 查询SAP领料订单数据 * 查询SAP领料订单数据
*/ */
@ -128,8 +132,10 @@ public class InCostCenterBackController extends BaseController {
inCostcenterBackService.save(order); inCostcenterBackService.save(order);
items.forEach(item -> { items.forEach(item -> {
WmsInCostcenterBackItem data = Convert.convert(WmsInCostcenterBackItem.class, item); WmsInCostcenterBackItem data = Convert.convert(WmsInCostcenterBackItem.class, item);
data.setId(IdUtil.getSnowflakeNextId());
data.setLeft(data.getNum()); data.setLeft(data.getNum());
data.setOrderId(order.getId()); data.setOrderId(order.getId());
pushInspection(data);
inCostcenterBackItemService.save(data); inCostcenterBackItemService.save(data);
}); });
}); });
@ -185,7 +191,7 @@ public class InCostCenterBackController extends BaseController {
.setRsnum(order.getRsnum()) .setRsnum(order.getRsnum())
.setFactoryNo(order.getWerks()) .setFactoryNo(order.getWerks())
.setItems(datas.stream() .setItems(datas.stream()
.filter(item -> item.getLeft().compareTo(BigDecimal.ZERO) > 0) .filter(item -> item.getInspectionStatus() == 1 && item.getLeft().compareTo(BigDecimal.ZERO) > 0)
.map(item -> { .map(item -> {
OutProduceItemVO vo = new OutProduceItemVO() OutProduceItemVO vo = new OutProduceItemVO()
.setId(item.getId()) .setId(item.getId())
@ -221,7 +227,7 @@ public class InCostCenterBackController extends BaseController {
List<WmsInCostcenterBackItem> items = inCostcenterBackItemService.lambdaQuery() List<WmsInCostcenterBackItem> items = inCostcenterBackItemService.lambdaQuery()
.eq(WmsInCostcenterBackItem::getOrderId, order.getId()) .eq(WmsInCostcenterBackItem::getOrderId, order.getId())
.list(); .list();
items.removeIf(item -> item.getLeft().compareTo(BigDecimal.ZERO) <= 0); items.removeIf(item -> item.getInspectionStatus() != 1 && item.getLeft().compareTo(BigDecimal.ZERO) <= 0);
return ApiResult.success( return ApiResult.success(
items.stream() items.stream()
.map(item -> new NoScanItemVO() .map(item -> new NoScanItemVO()
@ -280,6 +286,8 @@ public class InCostCenterBackController extends BaseController {
VUtil.trueThrowBusinessError(Objects.isNull(item)).throwMessage("订单项无效:" + ri.getOrderItemId()); VUtil.trueThrowBusinessError(Objects.isNull(item)).throwMessage("订单项无效:" + ri.getOrderItemId());
VUtil.trueThrowBusinessError(item.getLeft().compareTo(BigDecimal.ZERO) <= 0) VUtil.trueThrowBusinessError(item.getLeft().compareTo(BigDecimal.ZERO) <= 0)
.throwMessage("物料" + item.getMatnr() + "已全部入库"); .throwMessage("物料" + item.getMatnr() + "已全部入库");
VUtil.trueThrowBusinessError(item.getInspectionStatus() != 1)
.throwMessage("物料" + item.getMatnr() + "质检未通过");
BigDecimal num = ri.getDatas().stream() BigDecimal num = ri.getDatas().stream()
.map(NoScanningItemDataRequest::getNum) .map(NoScanningItemDataRequest::getNum)
.reduce(BigDecimal.ZERO, BigDecimal::add); .reduce(BigDecimal.ZERO, BigDecimal::add);
@ -376,6 +384,8 @@ public class InCostCenterBackController extends BaseController {
.findFirst() .findFirst()
.orElse(null); .orElse(null);
VUtil.trueThrowBusinessError(Objects.isNull(item)).throwMessage("订单项无效:" + it.getItemId()); VUtil.trueThrowBusinessError(Objects.isNull(item)).throwMessage("订单项无效:" + it.getItemId());
VUtil.trueThrowBusinessError(item.getInspectionStatus() != 1)
.throwMessage("物料" + item.getMatnr() + "质检未通过");
WmsInCostcenterBackTicketItem ti = new WmsInCostcenterBackTicketItem() WmsInCostcenterBackTicketItem ti = new WmsInCostcenterBackTicketItem()
.setId(IdUtil.getSnowflakeNextId()) .setId(IdUtil.getSnowflakeNextId())
.setTicketId(ticket.getId()) .setTicketId(ticket.getId())
@ -649,4 +659,34 @@ public class InCostCenterBackController extends BaseController {
headers.setContentLength(zipBytes.length); headers.setContentLength(zipBytes.length);
return new ResponseEntity<>(zipBytes, headers, HttpStatus.OK); return new ResponseEntity<>(zipBytes, headers, HttpStatus.OK);
} }
/**
* 推送质检申请
* @param itemId 订单项id
*/
@PostMapping("pushInspection")
public ApiResult<Void> pushInspection(@RequestBody Long itemId) {
WmsInCostcenterBackItem item = inCostcenterBackItemService.getById(itemId);
VUtil.trueThrowBusinessError(Objects.isNull(item)).throwMessage("订单项不存在");
VUtil.trueThrowBusinessError(item.getInspectionStatus() != 3).throwMessage("请勿重复推送");
pushInspection(item);
inCostcenterBackItemService.updateById(item);
return ApiResult.success();
}
private void pushInspection(WmsInCostcenterBackItem item) {
if (qmsService.pushBackInspection(
List.of(
new ExternalReturnInspectionApplyQO()
.setRequestNo(String.valueOf(item.getId()))
.setMaterialNo(item.getMatnr())
.setInspectionQty(item.getNum().intValue())
.setReturnType((short) 1)
)
)) {
item.setInspectionStatus(0);
} else {
item.setInspectionStatus(3);
}
}
} }

View File

@ -78,6 +78,9 @@ public class QmsService {
@Value("${qms.pdi.apply.url}") @Value("${qms.pdi.apply.url}")
private String pdiApplyUrl; private String pdiApplyUrl;
@Value("${qms.back.apply.url}")
private String backApplyUrl;
/** /**
* 推送IQC来料检验申请到QMS * 推送IQC来料检验申请到QMS
*/ */
@ -333,4 +336,29 @@ public class QmsService {
Objects.isNull(response.getBody()) || response.getBody().getCode() != 200 Objects.isNull(response.getBody()) || response.getBody().getCode() != 200
).throwMessage("推送PDI检验申请到QMS失败" + response.getBody().getMessage()); ).throwMessage("推送PDI检验申请到QMS失败" + response.getBody().getMessage());
} }
/**
* 推送退料入库检验申请
*/
public boolean pushBackInspection(List<ExternalReturnInspectionApplyQO> items) {
log.info("推送退料入库检验申请到QMS{}", JSONUtil.toJsonStr(items));
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<List<ExternalReturnInspectionApplyQO>> requestEntity = new HttpEntity<>(items, headers);
try {
ResponseEntity<ApiResult<Void>> response = restTemplate.exchange(
qmsHost + backApplyUrl,
HttpMethod.POST,
requestEntity,
new ParameterizedTypeReference<ApiResult<Void>>() {
}
);
log.info("推送退料入库检验申请到QMS结果{},{}", response.getStatusCode().value(), JSONUtil.toJsonStr(response.getBody()));
return response.getBody() != null && response.getBody().getCode() == 200;
} catch (Exception ex) {
log.error("推送退料入库检验申请到QMS失败",ex);
return false;
}
}
} }

View File

@ -90,4 +90,9 @@ public class WmsInCostcenterBackItem implements Serializable {
* 预留/相关需求的项目编号 * 预留/相关需求的项目编号
*/ */
private String rspos; private String rspos;
/**
* 质检状态0待质检1质检通过2质检未通过3推送失败
*/
private Integer inspectionStatus;
} }