创建配送任务接口逻辑修改

This commit is contained in:
2026-02-04 16:48:09 +08:00
parent f7b773d3f3
commit 3c908eb895
4 changed files with 61 additions and 64 deletions

View File

@@ -25,9 +25,8 @@ public class DeliveryOrder extends BaseEntity {
@Excel(name = "配送单据号")
private String orderNo;
/** rk_info主键ID */
// @Excel(name = "rk_info主键ID")
private Long rkInfoId;
/** rk_record主键ID */
private Long rkRecordId;
/** 制单人用户ID */
// @Excel(name = "制单人ID")
@@ -44,9 +43,8 @@ public class DeliveryOrder extends BaseEntity {
@Excel(name = "存在问题描述")
private String receiveProblem;
/** 出库单据号 */
// @Excel(name = "出库单据号")
private String billNoCk;
/** 单据号(对应 rk_record.bill_no */
private String billNo;
/** 项目描述 */
// @Excel(name = "项目描述")
@@ -196,8 +194,12 @@ public class DeliveryOrder extends BaseEntity {
public String getOrderNo() { return orderNo; }
public void setOrderNo(String orderNo) { this.orderNo = orderNo; }
public Long getRkInfoId() { return rkInfoId; }
public void setRkInfoId(Long rkInfoId) { this.rkInfoId = rkInfoId; }
public Long getRkRecordId() {
return rkRecordId;
}
public void setRkRecordId(Long rkRecordId) {
this.rkRecordId = rkRecordId;
}
public String getMakerUserName() {
return makerUserName;
@@ -219,8 +221,12 @@ public class DeliveryOrder extends BaseEntity {
public String getReceiveProblem() { return receiveProblem; }
public void setReceiveProblem(String receiveProblem) { this.receiveProblem = receiveProblem; }
public String getBillNoCk() { return billNoCk; }
public void setBillNoCk(String billNoCk) { this.billNoCk = billNoCk; }
public String getBillNo() {
return billNo;
}
public void setBillNo(String billNo) {
this.billNo = billNo;
}
public String getXmMs() { return xmMs; }
public void setXmMs(String xmMs) { this.xmMs = xmMs; }
@@ -334,12 +340,12 @@ public class DeliveryOrder extends BaseEntity {
return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
.append("id", getId())
.append("orderNo", getOrderNo())
.append("rkInfoId", getRkInfoId())
.append("rkRecordId", getRkRecordId())
.append("makerId", getMakerId())
.append("makerUserName", getMakerUserName())
.append("receiveStatus", getReceiveStatus()) // *** 类型已是 Integer ***
.append("receiveProblem", getReceiveProblem())
.append("billNoCk", getBillNoCk())
.append("billNo", getBillNo())
.append("xmMs", getXmMs())
.append("xmNo", getXmNo())
.append("wlNo", getWlNo())

View File

@@ -7,14 +7,17 @@ import java.math.BigDecimal;
@Data
public class DeliveryOrderLineDTO {
/**
* 对应智慧实物系统 rk_info 表的主键 ID
* detailList 里的 id 就是这个值
*/
private Long rkInfoId;
/** 出库单据号 */
private String billNoCk;
/**
* 对应智慧实物系统 rk_record 表主键 ID
*/
private Long rkRecordId;
/**
* 单据号(以 rk_record.bill_no 为准)
* 说明:出库生成配送单时,所有行必须属于同一 billNo
*/
private String billNo;
/** 项目描述 */
private String xmMs;

View File

@@ -154,7 +154,7 @@ public class DeliveryAttachmentServiceImpl implements IDeliveryAttachmentService
// ====== 从配送单中拿到所有 rk_info_id 列表(允许为空:手工配送单场景) ======
List<Long> rkInfoIdList = existList.stream()
.map(DeliveryOrder::getRkInfoId)
.map(DeliveryOrder::getRkRecordId)
.filter(Objects::nonNull)
.distinct()
.collect(Collectors.toList());

View File

@@ -182,72 +182,61 @@ public class DeliveryOrderServiceImpl implements IDeliveryOrderService
public String createOrder(DeliveryOrderCreateDTO dto) {
// ========== 0. 参数校验 ==========
if (dto == null || dto.getItems() == null || dto.getItems().isEmpty()) {
throw new ServiceException("物料明细不能为空");
}
// 取第一条 billNoCk,判断是“手动创建”还是“出库单生成
String billNoCk = dto.getItems().get(0).getBillNoCk();
boolean fromWms = StringUtils.isNotBlank(billNoCk); // true = 出库单生成false = 手动创建
// 取第一条 billNo判断是否来自 WMS有 billNo = 出库单生成
String billNo = dto.getItems().get(0).getBillNo();
boolean fromWms = StringUtils.isNotBlank(billNo);
// 收集 rk_info 主键 id用于出库单生成场景回写 WMS
List<Long> rkInfoIds = dto.getItems().stream()
.map(DeliveryOrderLineDTO::getRkInfoId)
// 收集 rk_record 主键 id用于回写 WMS
List<Long> rkRecordIds = dto.getItems().stream()
.map(DeliveryOrderLineDTO::getRkRecordId)
.filter(Objects::nonNull)
.distinct()
.collect(Collectors.toList());
// 出库单生成场景必须有 rkInfoId
if (fromWms && rkInfoIds.isEmpty()) {
throw new ServiceException("明细行缺少 rk_info 主键 id无法回写配送状态");
// 出库单生成场景必须有 rkRecordId
if (fromWms && rkRecordIds.isEmpty()) {
throw new ServiceException("明细行缺少 rk_record 主键 id无法回写配送状态");
}
// ========== 1. 生成配送单号 ==========
String orderNo = StringUtils.isBlank(dto.getOrderNo())
? "DO" + DateUtils.dateTimeNow("yyyyMMddHHmmssSSS")
: dto.getOrderNo().trim();
Date now = DateUtils.getNowDate();
String username = SecurityUtils.getUsername();
Long currentUserId = null;
Long currentUserId;
try {
currentUserId = SecurityUtils.getUserId();
} catch (Exception e) {
log.warn("获取当前登录用户ID失败:{}", e.getMessage());
throw new ServiceException("无法获取当前登录用户ID,请重新登录后重试");
}
// 制单人用户ID优先用前端传的 makerId没有则回退到当前登录用户
Long makerId = dto.getMakerId();
if (makerId == null) {
if (currentUserId == null) {
throw new ServiceException("无法确定制单人用户ID请重新登录后重试");
}
makerId = currentUserId;
}
Long makerId = dto.getMakerId() != null ? dto.getMakerId() : currentUserId;
List<DeliveryOrder> rows = new ArrayList<>();
// ========== 2. 遍历每一条物料明细,组装行记录 ==========
// ========== 2. 组装行记录 ==========
for (DeliveryOrderLineDTO it : dto.getItems()) {
// ===== 出库单生成场景下的两个判断(手动创建时跳过) =====
// ===== WMS 生成场景校验 =====
if (fromWms) {
// 限制同一出库单
if (!billNoCk.equals(it.getBillNoCk())) {
throw new ServiceException("当前接口暂不支持多张出库单合并配送,请确保所有明细 billNoCk 相同");
if (!billNo.equals(it.getBillNo())) {
throw new ServiceException("当前接口暂不支持多张单据合并配送,请确保所有明细 billNo 相同");
}
if (it.getRkInfoId() == null) {
throw new ServiceException("明细行缺少 rk_info 主键 id");
if (it.getRkRecordId() == null) {
throw new ServiceException("明细行缺少 rk_record 主键 id");
}
}
DeliveryOrder row = new DeliveryOrder();
// 2.1 公共头部字段(整单一致)
// 2.1 头部字段(整单一致)
row.setOrderNo(orderNo);
row.setOriginName(dto.getOriginName());
row.setOriginLng(dto.getOriginLng());
@@ -266,12 +255,12 @@ public class DeliveryOrderServiceImpl implements IDeliveryOrderService
row.setDeliveryTon(dto.getDeliveryTon());
row.setGoodsSize(dto.getGoodsSize());
// 制单人用户ID
row.setMakerId(makerId);
// 配送状态:前端不传默认 1已接单 / 待起运
// 配送状态:不传默认“2=已接单”保持你原来创建即回写2的行为
String orderStatus = StringUtils.isBlank(dto.getOrderStatus())
? "1" : dto.getOrderStatus().trim();
? "2"
: dto.getOrderStatus().trim();
row.setOrderStatus(orderStatus);
row.setVehicleTypeId(dto.getVehicleTypeId());
@@ -282,9 +271,10 @@ public class DeliveryOrderServiceImpl implements IDeliveryOrderService
row.setTotalKm(dto.getTotalKm());
row.setRemark(dto.getRemark());
// 2.2 明细字段
row.setRkInfoId(it.getRkInfoId()); // 关联 rk_info 主键ID手动单可以为空
row.setBillNoCk(it.getBillNoCk());
// 2.2 明细字段(关键改造点)
row.setRkRecordId(it.getRkRecordId()); // ✅ 改:关联 rk_record.id
row.setBillNo(it.getBillNo()); // ✅ 改:单据号 billNo不再 billNoCk
row.setXmMs(it.getXmMs());
row.setXmNo(it.getXmNo());
row.setWlNo(it.getWlNo());
@@ -302,18 +292,16 @@ public class DeliveryOrderServiceImpl implements IDeliveryOrderService
rows.add(row);
}
// ========== 3. 批量落库 ==========
// ========== 3. 落库 ==========
if (!rows.isEmpty()) {
deliveryOrderMapper.batchInsert(rows);
}
// ========== 4. 回写 WMS出库单生成场景,手动创建不回写、不远程调用 ==========
// ========== 4. 回写 WMS WMS 生成场景 ==========
if (fromWms) {
boolean ok = updateWmsIsDeliveryByIds(rkInfoIds, 2);
// 你最新语义0不需要1需要2已接单3配送中4完成
boolean ok = updateWmsIsDeliveryByIds(rkRecordIds, 2);
if (!ok) {
// 回写失败,整单回滚,避免脏数据
throw new ServiceException("已生成配送单,但回写 WMS 配送状态失败");
}
}
@@ -330,7 +318,7 @@ public class DeliveryOrderServiceImpl implements IDeliveryOrderService
*/
private boolean updateWmsIsDeliveryByIds(List<Long> rkInfoIds, int isDelivery) {
String url = wisdomBaseUrl + "/wisdom/stock/updateDeliveryStatus";
String url = wisdomBaseUrl + "/wisdom/record/updateDeliveryStatus";
Map<String, Object> map = new HashMap<>();
map.put("ids", rkInfoIds);