package com.vincent.rsf.server.manager.service.impl;
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.vincent.rsf.framework.common.R;
|
import com.vincent.rsf.server.api.controller.erp.params.InOutResultReportParam;
|
import com.vincent.rsf.server.manager.entity.AsnOrderLog;
|
import com.vincent.rsf.server.manager.entity.CloudWmsNotifyLog;
|
import com.vincent.rsf.server.manager.service.AsnOrderLogService;
|
import com.vincent.rsf.server.manager.service.CloudWmsFeedbackResendService;
|
import com.vincent.rsf.server.manager.service.CloudWmsNotifyLogService;
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.commons.lang3.StringUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
|
import java.util.*;
|
|
/**
|
* 从历史云仓上报记录中取「最新一条」按明细维度去重后,复制请求体写入待发送队列。
|
*/
|
@Slf4j
|
@Service
|
public class CloudWmsFeedbackResendServiceImpl implements CloudWmsFeedbackResendService {
|
|
private static final int MAX_SCAN = 500;
|
|
@Autowired
|
private AsnOrderLogService asnOrderLogService;
|
@Autowired
|
private CloudWmsNotifyLogService cloudWmsNotifyLogService;
|
@Autowired
|
private ObjectMapper objectMapper;
|
|
@Override
|
public R resendInOutFeedbackByAsnOrderLogId(Long asnOrderLogId) {
|
if (asnOrderLogId == null) {
|
return R.error("参数不能为空");
|
}
|
AsnOrderLog orderLog = asnOrderLogService.getById(asnOrderLogId);
|
if (orderLog == null) {
|
return R.error("历史单据不存在");
|
}
|
String code = orderLog.getCode();
|
if (StringUtils.isBlank(code)) {
|
return R.error("单据号为空,无法重发");
|
}
|
String reportType = cloudWmsNotifyLogService.getReportTypeInOutResult();
|
LambdaQueryWrapper<CloudWmsNotifyLog> qw = new LambdaQueryWrapper<CloudWmsNotifyLog>()
|
.eq(CloudWmsNotifyLog::getReportType, reportType)
|
.and(w -> w.like(CloudWmsNotifyLog::getRequestBody, "\"orderNo\":\"" + code + "\"")
|
.or()
|
.like(CloudWmsNotifyLog::getBizRef, "orderNo=" + code))
|
.orderByDesc(CloudWmsNotifyLog::getId)
|
.last("LIMIT " + MAX_SCAN);
|
List<CloudWmsNotifyLog> candidates = cloudWmsNotifyLogService.list(qw);
|
Map<String, CloudWmsNotifyLog> latestByLine = new LinkedHashMap<>();
|
for (CloudWmsNotifyLog row : candidates) {
|
if (StringUtils.isBlank(row.getRequestBody())) {
|
continue;
|
}
|
InOutResultReportParam p;
|
try {
|
p = objectMapper.readValue(row.getRequestBody(), InOutResultReportParam.class);
|
} catch (Exception e) {
|
continue;
|
}
|
if (p == null || !code.equals(p.getOrderNo())) {
|
continue;
|
}
|
if (!matchOrderType(orderLog.getType(), p.getInbound())) {
|
continue;
|
}
|
String sig = lineSignature(p);
|
latestByLine.putIfAbsent(sig, row);
|
}
|
if (latestByLine.isEmpty()) {
|
return R.error("未找到该单号对应的云仓入出库上报记录,无法重发");
|
}
|
Date now = new Date();
|
int n = 0;
|
for (CloudWmsNotifyLog src : latestByLine.values()) {
|
CloudWmsNotifyLog copy = new CloudWmsNotifyLog()
|
.setReportType(reportType)
|
.setRequestBody(src.getRequestBody())
|
.setNotifyStatus(cloudWmsNotifyLogService.getNotifyStatusPending())
|
.setRetryCount(0)
|
.setBizRef("manualResend,asnOrderLogId=" + asnOrderLogId + ",fromNotifyLogId=" + src.getId() + ",orderNo=" + code)
|
.setCreateTime(now)
|
.setUpdateTime(now);
|
cloudWmsNotifyLogService.fillFromConfig(copy);
|
if (cloudWmsNotifyLogService.save(copy)) {
|
n++;
|
}
|
}
|
return R.ok("已加入云仓重发队列 " + n + " 条,将由定时任务发送").add(n);
|
}
|
|
private static boolean matchOrderType(String asnType, Boolean inbound) {
|
if (StringUtils.isBlank(asnType)) {
|
return true;
|
}
|
boolean wantIn = "in".equalsIgnoreCase(asnType.trim());
|
if (inbound == null) {
|
return true;
|
}
|
return wantIn == inbound;
|
}
|
|
private static String lineSignature(InOutResultReportParam p) {
|
return String.join("|",
|
String.valueOf(p.getOrderNo()),
|
String.valueOf(p.getLineId()),
|
String.valueOf(p.getMatNr()),
|
String.valueOf(p.getLocId()),
|
String.valueOf(p.getWareHouseId()),
|
String.valueOf(p.getInbound()),
|
String.valueOf(p.getQty()),
|
String.valueOf(p.getBatch()));
|
}
|
}
|