Compare commits
2 Commits
c2d2407262
...
89ddd188b6
| Author | SHA1 | Date | |
|---|---|---|---|
| 89ddd188b6 | |||
| 3c908eb895 |
@@ -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())
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -183,72 +183,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());
|
||||
@@ -267,12 +256,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());
|
||||
@@ -283,9 +272,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());
|
||||
@@ -303,18 +293,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 配送状态失败");
|
||||
}
|
||||
}
|
||||
@@ -331,7 +319,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);
|
||||
|
||||
Reference in New Issue
Block a user