创建配送任务接口逻辑修改
This commit is contained in:
@@ -25,9 +25,8 @@ public class DeliveryOrder extends BaseEntity {
|
|||||||
@Excel(name = "配送单据号")
|
@Excel(name = "配送单据号")
|
||||||
private String orderNo;
|
private String orderNo;
|
||||||
|
|
||||||
/** rk_info主键ID */
|
/** rk_record主键ID */
|
||||||
// @Excel(name = "rk_info主键ID")
|
private Long rkRecordId;
|
||||||
private Long rkInfoId;
|
|
||||||
|
|
||||||
/** 制单人用户ID */
|
/** 制单人用户ID */
|
||||||
// @Excel(name = "制单人ID")
|
// @Excel(name = "制单人ID")
|
||||||
@@ -44,9 +43,8 @@ public class DeliveryOrder extends BaseEntity {
|
|||||||
@Excel(name = "存在问题描述")
|
@Excel(name = "存在问题描述")
|
||||||
private String receiveProblem;
|
private String receiveProblem;
|
||||||
|
|
||||||
/** 出库单据号 */
|
/** 单据号(对应 rk_record.bill_no) */
|
||||||
// @Excel(name = "出库单据号")
|
private String billNo;
|
||||||
private String billNoCk;
|
|
||||||
|
|
||||||
/** 项目描述 */
|
/** 项目描述 */
|
||||||
// @Excel(name = "项目描述")
|
// @Excel(name = "项目描述")
|
||||||
@@ -196,8 +194,12 @@ public class DeliveryOrder extends BaseEntity {
|
|||||||
public String getOrderNo() { return orderNo; }
|
public String getOrderNo() { return orderNo; }
|
||||||
public void setOrderNo(String orderNo) { this.orderNo = orderNo; }
|
public void setOrderNo(String orderNo) { this.orderNo = orderNo; }
|
||||||
|
|
||||||
public Long getRkInfoId() { return rkInfoId; }
|
public Long getRkRecordId() {
|
||||||
public void setRkInfoId(Long rkInfoId) { this.rkInfoId = rkInfoId; }
|
return rkRecordId;
|
||||||
|
}
|
||||||
|
public void setRkRecordId(Long rkRecordId) {
|
||||||
|
this.rkRecordId = rkRecordId;
|
||||||
|
}
|
||||||
|
|
||||||
public String getMakerUserName() {
|
public String getMakerUserName() {
|
||||||
return makerUserName;
|
return makerUserName;
|
||||||
@@ -219,8 +221,12 @@ public class DeliveryOrder extends BaseEntity {
|
|||||||
public String getReceiveProblem() { return receiveProblem; }
|
public String getReceiveProblem() { return receiveProblem; }
|
||||||
public void setReceiveProblem(String receiveProblem) { this.receiveProblem = receiveProblem; }
|
public void setReceiveProblem(String receiveProblem) { this.receiveProblem = receiveProblem; }
|
||||||
|
|
||||||
public String getBillNoCk() { return billNoCk; }
|
public String getBillNo() {
|
||||||
public void setBillNoCk(String billNoCk) { this.billNoCk = billNoCk; }
|
return billNo;
|
||||||
|
}
|
||||||
|
public void setBillNo(String billNo) {
|
||||||
|
this.billNo = billNo;
|
||||||
|
}
|
||||||
|
|
||||||
public String getXmMs() { return xmMs; }
|
public String getXmMs() { return xmMs; }
|
||||||
public void setXmMs(String xmMs) { this.xmMs = 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)
|
return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
|
||||||
.append("id", getId())
|
.append("id", getId())
|
||||||
.append("orderNo", getOrderNo())
|
.append("orderNo", getOrderNo())
|
||||||
.append("rkInfoId", getRkInfoId())
|
.append("rkRecordId", getRkRecordId())
|
||||||
.append("makerId", getMakerId())
|
.append("makerId", getMakerId())
|
||||||
.append("makerUserName", getMakerUserName())
|
.append("makerUserName", getMakerUserName())
|
||||||
.append("receiveStatus", getReceiveStatus()) // *** 类型已是 Integer ***
|
.append("receiveStatus", getReceiveStatus()) // *** 类型已是 Integer ***
|
||||||
.append("receiveProblem", getReceiveProblem())
|
.append("receiveProblem", getReceiveProblem())
|
||||||
.append("billNoCk", getBillNoCk())
|
.append("billNo", getBillNo())
|
||||||
.append("xmMs", getXmMs())
|
.append("xmMs", getXmMs())
|
||||||
.append("xmNo", getXmNo())
|
.append("xmNo", getXmNo())
|
||||||
.append("wlNo", getWlNo())
|
.append("wlNo", getWlNo())
|
||||||
|
|||||||
@@ -7,14 +7,17 @@ import java.math.BigDecimal;
|
|||||||
@Data
|
@Data
|
||||||
public class DeliveryOrderLineDTO {
|
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;
|
private String xmMs;
|
||||||
|
|||||||
@@ -154,7 +154,7 @@ public class DeliveryAttachmentServiceImpl implements IDeliveryAttachmentService
|
|||||||
|
|
||||||
// ====== 从配送单中拿到所有 rk_info_id 列表(允许为空:手工配送单场景) ======
|
// ====== 从配送单中拿到所有 rk_info_id 列表(允许为空:手工配送单场景) ======
|
||||||
List<Long> rkInfoIdList = existList.stream()
|
List<Long> rkInfoIdList = existList.stream()
|
||||||
.map(DeliveryOrder::getRkInfoId)
|
.map(DeliveryOrder::getRkRecordId)
|
||||||
.filter(Objects::nonNull)
|
.filter(Objects::nonNull)
|
||||||
.distinct()
|
.distinct()
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
|
|||||||
@@ -182,72 +182,61 @@ public class DeliveryOrderServiceImpl implements IDeliveryOrderService
|
|||||||
public String createOrder(DeliveryOrderCreateDTO dto) {
|
public String createOrder(DeliveryOrderCreateDTO dto) {
|
||||||
|
|
||||||
// ========== 0. 参数校验 ==========
|
// ========== 0. 参数校验 ==========
|
||||||
|
|
||||||
if (dto == null || dto.getItems() == null || dto.getItems().isEmpty()) {
|
if (dto == null || dto.getItems() == null || dto.getItems().isEmpty()) {
|
||||||
throw new ServiceException("物料明细不能为空");
|
throw new ServiceException("物料明细不能为空");
|
||||||
}
|
}
|
||||||
|
|
||||||
// 取第一条 billNoCk,判断是“手动创建”还是“出库单生成”
|
// 取第一条 billNo,判断是否来自 WMS(有 billNo = 出库单生成)
|
||||||
String billNoCk = dto.getItems().get(0).getBillNoCk();
|
String billNo = dto.getItems().get(0).getBillNo();
|
||||||
boolean fromWms = StringUtils.isNotBlank(billNoCk); // true = 出库单生成;false = 手动创建
|
boolean fromWms = StringUtils.isNotBlank(billNo);
|
||||||
|
|
||||||
// 收集 rk_info 主键 id(仅用于出库单生成场景回写 WMS)
|
// 收集 rk_record 主键 id(用于回写 WMS)
|
||||||
List<Long> rkInfoIds = dto.getItems().stream()
|
List<Long> rkRecordIds = dto.getItems().stream()
|
||||||
.map(DeliveryOrderLineDTO::getRkInfoId)
|
.map(DeliveryOrderLineDTO::getRkRecordId)
|
||||||
.filter(Objects::nonNull)
|
.filter(Objects::nonNull)
|
||||||
.distinct()
|
.distinct()
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
// 出库单生成场景必须有 rkInfoId
|
// 出库单生成场景必须有 rkRecordId
|
||||||
if (fromWms && rkInfoIds.isEmpty()) {
|
if (fromWms && rkRecordIds.isEmpty()) {
|
||||||
throw new ServiceException("明细行缺少 rk_info 主键 id,无法回写配送状态");
|
throw new ServiceException("明细行缺少 rk_record 主键 id,无法回写配送状态");
|
||||||
}
|
}
|
||||||
|
|
||||||
// ========== 1. 生成配送单号 ==========
|
// ========== 1. 生成配送单号 ==========
|
||||||
|
|
||||||
String orderNo = StringUtils.isBlank(dto.getOrderNo())
|
String orderNo = StringUtils.isBlank(dto.getOrderNo())
|
||||||
? "DO" + DateUtils.dateTimeNow("yyyyMMddHHmmssSSS")
|
? "DO" + DateUtils.dateTimeNow("yyyyMMddHHmmssSSS")
|
||||||
: dto.getOrderNo().trim();
|
: dto.getOrderNo().trim();
|
||||||
|
|
||||||
Date now = DateUtils.getNowDate();
|
Date now = DateUtils.getNowDate();
|
||||||
String username = SecurityUtils.getUsername();
|
String username = SecurityUtils.getUsername();
|
||||||
Long currentUserId = null;
|
|
||||||
|
Long currentUserId;
|
||||||
try {
|
try {
|
||||||
currentUserId = SecurityUtils.getUserId();
|
currentUserId = SecurityUtils.getUserId();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.warn("获取当前登录用户ID失败:{}", e.getMessage());
|
throw new ServiceException("无法获取当前登录用户ID,请重新登录后重试");
|
||||||
}
|
}
|
||||||
|
|
||||||
// 制单人用户ID:优先用前端传的 makerId,没有则回退到当前登录用户
|
Long makerId = dto.getMakerId() != null ? dto.getMakerId() : currentUserId;
|
||||||
Long makerId = dto.getMakerId();
|
|
||||||
if (makerId == null) {
|
|
||||||
if (currentUserId == null) {
|
|
||||||
throw new ServiceException("无法确定制单人用户ID,请重新登录后重试");
|
|
||||||
}
|
|
||||||
makerId = currentUserId;
|
|
||||||
}
|
|
||||||
|
|
||||||
List<DeliveryOrder> rows = new ArrayList<>();
|
List<DeliveryOrder> rows = new ArrayList<>();
|
||||||
|
|
||||||
// ========== 2. 遍历每一条物料明细,组装行记录 ==========
|
// ========== 2. 组装行记录 ==========
|
||||||
|
|
||||||
for (DeliveryOrderLineDTO it : dto.getItems()) {
|
for (DeliveryOrderLineDTO it : dto.getItems()) {
|
||||||
|
|
||||||
// ===== 出库单生成场景下的两个判断(手动创建时跳过) =====
|
// ===== WMS 生成场景校验 =====
|
||||||
if (fromWms) {
|
if (fromWms) {
|
||||||
// 限制同一出库单
|
if (!billNo.equals(it.getBillNo())) {
|
||||||
if (!billNoCk.equals(it.getBillNoCk())) {
|
throw new ServiceException("当前接口暂不支持多张单据合并配送,请确保所有明细 billNo 相同");
|
||||||
throw new ServiceException("当前接口暂不支持多张出库单合并配送,请确保所有明细 billNoCk 相同");
|
|
||||||
}
|
}
|
||||||
|
if (it.getRkRecordId() == null) {
|
||||||
if (it.getRkInfoId() == null) {
|
throw new ServiceException("明细行缺少 rk_record 主键 id");
|
||||||
throw new ServiceException("明细行缺少 rk_info 主键 id");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DeliveryOrder row = new DeliveryOrder();
|
DeliveryOrder row = new DeliveryOrder();
|
||||||
|
|
||||||
// 2.1 公共头部字段(整单一致)
|
// 2.1 头部字段(整单一致)
|
||||||
row.setOrderNo(orderNo);
|
row.setOrderNo(orderNo);
|
||||||
row.setOriginName(dto.getOriginName());
|
row.setOriginName(dto.getOriginName());
|
||||||
row.setOriginLng(dto.getOriginLng());
|
row.setOriginLng(dto.getOriginLng());
|
||||||
@@ -266,12 +255,12 @@ public class DeliveryOrderServiceImpl implements IDeliveryOrderService
|
|||||||
row.setDeliveryTon(dto.getDeliveryTon());
|
row.setDeliveryTon(dto.getDeliveryTon());
|
||||||
row.setGoodsSize(dto.getGoodsSize());
|
row.setGoodsSize(dto.getGoodsSize());
|
||||||
|
|
||||||
// 制单人用户ID
|
|
||||||
row.setMakerId(makerId);
|
row.setMakerId(makerId);
|
||||||
|
|
||||||
// 配送状态:前端不传时默认 1(已接单 / 待起运)
|
// 配送单状态:不传则默认“2=已接单”(保持你原来创建即回写2的行为)
|
||||||
String orderStatus = StringUtils.isBlank(dto.getOrderStatus())
|
String orderStatus = StringUtils.isBlank(dto.getOrderStatus())
|
||||||
? "1" : dto.getOrderStatus().trim();
|
? "2"
|
||||||
|
: dto.getOrderStatus().trim();
|
||||||
row.setOrderStatus(orderStatus);
|
row.setOrderStatus(orderStatus);
|
||||||
|
|
||||||
row.setVehicleTypeId(dto.getVehicleTypeId());
|
row.setVehicleTypeId(dto.getVehicleTypeId());
|
||||||
@@ -282,9 +271,10 @@ public class DeliveryOrderServiceImpl implements IDeliveryOrderService
|
|||||||
row.setTotalKm(dto.getTotalKm());
|
row.setTotalKm(dto.getTotalKm());
|
||||||
row.setRemark(dto.getRemark());
|
row.setRemark(dto.getRemark());
|
||||||
|
|
||||||
// 2.2 明细字段
|
// 2.2 明细字段(关键改造点)
|
||||||
row.setRkInfoId(it.getRkInfoId()); // 关联 rk_info 主键ID(手动单可以为空)
|
row.setRkRecordId(it.getRkRecordId()); // ✅ 改:关联 rk_record.id
|
||||||
row.setBillNoCk(it.getBillNoCk());
|
row.setBillNo(it.getBillNo()); // ✅ 改:单据号 billNo(不再 billNoCk)
|
||||||
|
|
||||||
row.setXmMs(it.getXmMs());
|
row.setXmMs(it.getXmMs());
|
||||||
row.setXmNo(it.getXmNo());
|
row.setXmNo(it.getXmNo());
|
||||||
row.setWlNo(it.getWlNo());
|
row.setWlNo(it.getWlNo());
|
||||||
@@ -302,18 +292,16 @@ public class DeliveryOrderServiceImpl implements IDeliveryOrderService
|
|||||||
rows.add(row);
|
rows.add(row);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ========== 3. 批量落库 ==========
|
// ========== 3. 落库 ==========
|
||||||
|
|
||||||
if (!rows.isEmpty()) {
|
if (!rows.isEmpty()) {
|
||||||
deliveryOrderMapper.batchInsert(rows);
|
deliveryOrderMapper.batchInsert(rows);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ========== 4. 回写 WMS(仅出库单生成场景,手动创建不回写、不远程调用) ==========
|
// ========== 4. 回写 WMS(仅 WMS 生成场景) ==========
|
||||||
|
|
||||||
if (fromWms) {
|
if (fromWms) {
|
||||||
boolean ok = updateWmsIsDeliveryByIds(rkInfoIds, 2);
|
// 你最新语义:0不需要,1需要,2已接单,3配送中,4完成
|
||||||
|
boolean ok = updateWmsIsDeliveryByIds(rkRecordIds, 2);
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
// 回写失败,整单回滚,避免脏数据
|
|
||||||
throw new ServiceException("已生成配送单,但回写 WMS 配送状态失败");
|
throw new ServiceException("已生成配送单,但回写 WMS 配送状态失败");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -330,7 +318,7 @@ public class DeliveryOrderServiceImpl implements IDeliveryOrderService
|
|||||||
*/
|
*/
|
||||||
private boolean updateWmsIsDeliveryByIds(List<Long> rkInfoIds, int isDelivery) {
|
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<String, Object> map = new HashMap<>();
|
||||||
map.put("ids", rkInfoIds);
|
map.put("ids", rkInfoIds);
|
||||||
|
|||||||
Reference in New Issue
Block a user