feat(oms,wms):出库/运输单据增加线路车次字段,线路管理支持车次清单维护

1. OMS四张表(business_document_order/execute_order/
   reservation_stock_out_order/execution_stock_out_order)加
   LINE_CODE/LINE_NAME/SHUTTLE_NO三列,entity/DO/DTO/PO同步加字段,
   出库两链路Mapper XML补列与resultMap。
   线路编码/名称冗余存line_management的route_code/route_name
   (两库不互通无法join);SHUTTLE_NO为字符串(如4或31-4),
   前端拼"编码-车次"显示(31-4车次);不复用route(存tms_route.id)
   和train_no(入库链路占用)。
   下发链路(预约单->执行单,业务单->执行单)同名拷贝自动透传。
2. WMS line_management加SHUTTLE_JSON列(车次序号JSON数组),
   四层加字段+XML;DTO加反序列化器兼容前端传数组,
   PO加序列化器返回原样输出数组。
3. LineManagementImpl.update组织/仓库名称空串兜底,
   修复编辑线路后组织名称被刷成空串、列表查不到的问题。
4. 新增建表脚本sql/20260820_oms_outbound_transport_add_line_shuttle.sql(达梦语法)。
This commit is contained in:
rcx
2026-08-21 15:28:50 +08:00
parent 22f2b66ffa
commit 000092952f
27 changed files with 324 additions and 2 deletions
@@ -813,4 +813,16 @@ public class BusinessDocumentOrder extends BaseVOEntity{
@ApiModelProperty("车次")
private Integer trainNo;
@ApiModelProperty("线路编码(取自WMS线路管理)")
@Excel(name = "线路编码")
private String lineCode;
@ApiModelProperty("线路名称(冗余存储)")
@Excel(name = "线路名称")
private String lineName;
@ApiModelProperty("车次")
@Excel(name = "车次")
private String shuttleNo;
}
@@ -850,4 +850,16 @@ public class BusinessDocumentOrderPO extends BaseVOEntity{
@ApiModelProperty("车次")
private Integer trainNo;
@ApiModelProperty("线路编码(取自WMS线路管理)")
@Excel(name = "线路编码")
private String lineCode;
@ApiModelProperty("线路名称(冗余存储)")
@Excel(name = "线路名称")
private String lineName;
@ApiModelProperty("车次")
@Excel(name = "车次")
private String shuttleNo;
}
@@ -886,4 +886,13 @@ public class BusinessDocumentOrderDO extends BaseVOEntity{
@ApiModelProperty("车次")
private Integer trainNo;
@ApiModelProperty("线路编码(取自WMS线路管理)")
private String lineCode;
@ApiModelProperty("线路名称(冗余存储)")
private String lineName;
@ApiModelProperty("车次")
private String shuttleNo;
}
@@ -158,4 +158,16 @@ public class ExecuteOrder extends BaseVOEntity{
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date invoiceDate;
@ApiModelProperty("线路编码(取自WMS线路管理)")
@Excel(name = "线路编码")
private String lineCode;
@ApiModelProperty("线路名称(冗余存储)")
@Excel(name = "线路名称")
private String lineName;
@ApiModelProperty("车次")
@Excel(name = "车次")
private String shuttleNo;
}
@@ -244,4 +244,16 @@ public class ExecuteOrderPO extends BaseVOEntity{
@ApiModelProperty("车次")
private Integer trainNo;
@ApiModelProperty("线路编码(取自WMS线路管理)")
@Excel(name = "线路编码")
private String lineCode;
@ApiModelProperty("线路名称(冗余存储)")
@Excel(name = "线路名称")
private String lineName;
@ApiModelProperty("车次")
@Excel(name = "车次")
private String shuttleNo;
}
@@ -182,4 +182,13 @@ public class ExecuteOrderDO extends BaseVOEntity{
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date documentEndTime;
@ApiModelProperty("线路编码(取自WMS线路管理)")
private String lineCode;
@ApiModelProperty("线路名称(冗余存储)")
private String lineName;
@ApiModelProperty("车次")
private String shuttleNo;
}
@@ -492,4 +492,16 @@ public class ExecutionStockOutOrder extends BaseVOEntity {
@Excel(name = "车次")
private Integer trainNo;
@ApiModelProperty("线路编码(取自WMS线路管理)")
@Excel(name = "线路编码")
private String lineCode;
@ApiModelProperty("线路名称(冗余存储)")
@Excel(name = "线路名称")
private String lineName;
@ApiModelProperty("车次")
@Excel(name = "车次")
private String shuttleNo;
}
@@ -504,4 +504,16 @@ public class ExecutionStockOutOrderPO extends BaseVOEntity {
@Excel(name = "车次")
private Integer trainNo;
private String khdm;
@ApiModelProperty("线路编码(取自WMS线路管理)")
@Excel(name = "线路编码")
private String lineCode;
@ApiModelProperty("线路名称(冗余存储)")
@Excel(name = "线路名称")
private String lineName;
@ApiModelProperty("车次")
@Excel(name = "车次")
private String shuttleNo;
}
@@ -567,4 +567,13 @@ public class ExecutionStockOutOrderDO extends BaseVOEntity {
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTimeTo;
private String xfStatus;
@ApiModelProperty("线路编码(取自WMS线路管理)")
private String lineCode;
@ApiModelProperty("线路名称(冗余存储)")
private String lineName;
@ApiModelProperty("车次")
private String shuttleNo;
}
@@ -555,4 +555,13 @@ public class ExecutionStockOutOrderDTO extends ExecutionStockOutOrderBaseDTO {
private String outboundDateEnd;
private String xfStatus;
@ApiModelProperty("线路编码(取自WMS线路管理)")
private String lineCode;
@ApiModelProperty("线路名称(冗余存储)")
private String lineName;
@ApiModelProperty("车次")
private String shuttleNo;
}
@@ -491,5 +491,16 @@ public class ReservationStockOutOrder extends BaseVOEntity {
@ApiModelProperty("车次")
@Excel(name = "车次")
private Integer trainNo;
@ApiModelProperty("线路编码(取自WMS线路管理)")
@Excel(name = "线路编码")
private String lineCode;
@ApiModelProperty("线路名称(冗余存储)")
@Excel(name = "线路名称")
private String lineName;
@ApiModelProperty("车次")
@Excel(name = "车次")
private String shuttleNo;
}
@@ -513,4 +513,17 @@ public class ReservationStockOutOrderPO extends BaseVOEntity {
@Excel(name = "车次")
private Integer trainNo;
private String khdm;
@ApiModelProperty("线路编码(取自WMS线路管理)")
@Excel(name = "线路编码")
private String lineCode;
@ApiModelProperty("线路名称(冗余存储)")
@Excel(name = "线路名称")
private String lineName;
@ApiModelProperty("车次")
@Excel(name = "车次")
private String shuttleNo;
}
@@ -569,4 +569,14 @@ public class ReservationStockOutOrderDO extends BaseVOEntity {
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTimeTo;
private String xfStatus;
@ApiModelProperty("线路编码(取自WMS线路管理)")
private String lineCode;
@ApiModelProperty("线路名称(冗余存储)")
private String lineName;
@ApiModelProperty("车次")
private String shuttleNo;
}
@@ -558,4 +558,14 @@ public class ReservationStockOutOrderDTO extends ReservationStockOutOrderBaseDTO
private String outboundDateEnd;
private String xfStatus;
@ApiModelProperty("线路编码(取自WMS线路管理)")
private String lineCode;
@ApiModelProperty("线路名称(冗余存储)")
private String lineName;
@ApiModelProperty("车次")
private String shuttleNo;
}
@@ -902,4 +902,13 @@ public class BusinessDocumentOrderDTO extends BaseVOEntity{
@ApiModelProperty("车次")
private Integer trainNo;
@ApiModelProperty("线路编码(取自WMS线路管理)")
private String lineCode;
@ApiModelProperty("线路名称(冗余存储)")
private String lineName;
@ApiModelProperty("车次")
private String shuttleNo;
}
@@ -172,4 +172,13 @@ public class ExecuteOrderDTO extends BaseVOEntity{
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date documentEndTime;
@ApiModelProperty("线路编码(取自WMS线路管理)")
private String lineCode;
@ApiModelProperty("线路名称(冗余存储)")
private String lineName;
@ApiModelProperty("车次")
private String shuttleNo;
}
@@ -109,6 +109,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="trainNo" column="TRAIN_NO" />
<result property="amount" column="AMOUNT" />
<result property="businessOutOrderNumber" column="BUSINESS_OUT_ORDER_NUMBER" />
<result property="lineCode" column="LINE_CODE" />
<result property="lineName" column="LINE_NAME" />
<result property="shuttleNo" column="SHUTTLE_NO" />
</resultMap>
@@ -127,7 +130,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
a.CUSTOMS_INSPECTION_FLAG,a.NEED_DECLARE_FLAG,a.NEED_TRANSPORT_FLAG,a.picture_app,a.reservation_audit_time,a.reservation_audit_name
,a.reservation_audit_id,a.issue_name,a.issue_id,a.issue_time,a.issue_status,a.tms_order_number,
a.DIRECTOR_NAME ,a.DIRECTOR_PHONE,a.DIRECTOR_ID,a.RESERVATION_ORDER_SOURCE,a.OUTBOUND_TIME,a.RETURN_QUANTITY,a.DELIVERY_NAME,a.CUSTOMER_NUMBER,a.INVOICE_NUMBER,a.RETURN_ORDER_NUMBER,a.TOTAL_AMOUNT,
a.ROUTE,a.PUSH_TIME,a.PUSH_STATUS,a.PUSH_BY,a.PUSH_BY_NAME
a.ROUTE,a.PUSH_TIME,a.PUSH_STATUS,a.PUSH_BY,a.PUSH_BY_NAME,a.LINE_CODE,a.LINE_NAME,a.SHUTTLE_NO
</sql>
@@ -109,6 +109,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="trainNo" column="TRAIN_NO" />
<result property="amount" column="AMOUNT" />
<result property="executionOutOrderNumber" column="EXECUTION_OUT_ORDER_NUMBER" />
<result property="lineCode" column="LINE_CODE" />
<result property="lineName" column="LINE_NAME" />
<result property="shuttleNo" column="SHUTTLE_NO" />
</resultMap>
@@ -127,7 +130,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
a.CUSTOMS_INSPECTION_FLAG,a.NEED_DECLARE_FLAG,a.NEED_TRANSPORT_FLAG,a.picture_app,a.reservation_audit_time,a.reservation_audit_name
,a.reservation_audit_id,a.issue_name,a.issue_id,a.issue_time,a.issue_status,a.tms_order_number,
a.DIRECTOR_NAME ,a.DIRECTOR_PHONE,a.DIRECTOR_ID,a.RESERVATION_ORDER_SOURCE,a.OUTBOUND_TIME,a.RETURN_QUANTITY,a.DELIVERY_NAME,a.CUSTOMER_NUMBER,a.INVOICE_NUMBER,a.RETURN_ORDER_NUMBER,a.TOTAL_AMOUNT,
a.ROUTE,a.PUSH_TIME,a.PUSH_STATUS,a.PUSH_BY,a.PUSH_BY_NAME,a.execution_out_order_number
a.ROUTE,a.PUSH_TIME,a.PUSH_STATUS,a.PUSH_BY,a.PUSH_BY_NAME,a.execution_out_order_number,a.LINE_CODE,a.LINE_NAME,a.SHUTTLE_NO
</sql>
@@ -62,6 +62,12 @@ public class LineManagement extends BaseVOEntity{
@ApiModelProperty("客户Json数据")
private String customerJson;
/**
* 车次清单
*/
@ApiModelProperty("车次Json数据(车次序号数组,如[1,2,4,6],OMS单据车次下拉数据源)")
private String shuttleJson;
@ApiModelProperty("注册地址")
private String register;
}
@@ -14,6 +14,7 @@ import com.mhd.wms.domain.lineManagement.repository.mapper.LineManagementMapper;
import com.mhd.wms.domain.lineManagement.repository.po.LineManagementPO;
import com.mhd.wms.domain.lineManagement.repository.todo.LineManagementCustomer;
import com.mhd.wms.domain.lineManagement.repository.todo.LineManagementDO;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -93,6 +94,14 @@ public class LineManagementImpl extends ServiceImpl<LineManagementMapper, LineMa
LineManagement lineManagement = new LineManagement();
BeanUtils.copyProperties(lineManagementDO,lineManagement);
LineManagement lineManagementDB = this.getById(lineManagement.getId());
//组织/仓库名称空串兜底:编辑表单未回传name(传空串)时保留库里原值,
//防止ORGANIZATION_NAME被刷成空串后,列表按组织名称过滤查不到该线路
if (StringUtils.isBlank(lineManagement.getOrganizationName())) {
lineManagement.setOrganizationName(lineManagementDB.getOrganizationName());
}
if (StringUtils.isBlank(lineManagement.getWarehouseName())) {
lineManagement.setWarehouseName(lineManagementDB.getWarehouseName());
}
//删除用户
List<LineManagementCustomer> lineManagementCustomers =
JSONObject.parseArray(lineManagementDB.getCustomerJson(), LineManagementCustomer.class);
@@ -2,6 +2,7 @@ package com.mhd.wms.domain.lineManagement.repository.po;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.mhd.common.core.annotation.Excel;
import com.mhd.common.core.web.domain.BaseVOEntity;
import io.swagger.annotations.ApiModelProperty;
@@ -56,6 +57,13 @@ public class LineManagementPO extends BaseVOEntity{
@ApiModelProperty("客户Json数据")
private String customerJson;
/**
* 车次清单
*/
@ApiModelProperty("车次清单Json数组,如[\"1\",\"2\",\"4\"],OMS单据车次下拉数据源")
@JsonSerialize(using = ShuttleJsonSerializer.class)
private String shuttleJson;
@ApiModelProperty("注册地址")
private String register;
@@ -0,0 +1,31 @@
package com.mhd.wms.domain.lineManagement.repository.po;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
/**
* 车次清单序列化器库里存的 JSON 文本( ["1","2","3","4"])原样输出为 JSON 数组,
* 前端无需再 JSON.parse;空值输出 null,非法 JSON 兜底按普通字符串输出
*/
public class ShuttleJsonSerializer extends JsonSerializer<String> {
private static final ObjectMapper MAPPER = new ObjectMapper();
@Override
public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
if (value == null || value.isEmpty()) {
gen.writeNull();
return;
}
try {
MAPPER.readTree(value);
gen.writeRawValue(value);
} catch (Exception e) {
gen.writeString(value);
}
}
}
@@ -56,6 +56,12 @@ public class LineManagementDO extends BaseVOEntity{
@ApiModelProperty("客户Json数据")
private String customerJson;
/**
* 车次清单
*/
@ApiModelProperty("车次Json数据(车次序号数组,如[1,2,4,6],OMS单据车次下拉数据源)")
private String shuttleJson;
@ApiModelProperty("注册地址")
private String register;
}
@@ -3,6 +3,7 @@ package com.mhd.wms.interfaces.dto.LineManagement;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.mhd.common.core.annotation.Excel;
import com.mhd.common.core.web.domain.BaseVOEntity;
import io.swagger.annotations.ApiModelProperty;
@@ -62,6 +63,13 @@ public class LineManagementDTO extends BaseVOEntity{
@ApiModelProperty("客户Json数据")
private String customerJson;
/**
* 车次清单
*/
@ApiModelProperty("车次清单Json数组,如[\"1\",\"2\",\"4\"],OMS单据车次下拉数据源")
@JsonDeserialize(using = ShuttleJsonDeserializer.class)
private String shuttleJson;
@ApiModelProperty("注册地址")
private String register;
}
@@ -0,0 +1,24 @@
package com.mhd.wms.interfaces.dto.LineManagement;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonNode;
import java.io.IOException;
/**
* 车次清单反序列化器前端传 JSON 数组( ["1","2","3","4"]) JSON 文本字符串均可,
* 统一转成 JSON 文本存入 String 字段落库(形如 ["1","2","3","4"])
*/
public class ShuttleJsonDeserializer extends JsonDeserializer<String> {
@Override
public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
JsonNode node = p.readValueAsTree();
if (node == null || node.isNull()) {
return null;
}
return node.toString();
}
}
@@ -15,6 +15,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="routeCode" column="route_code" />
<result property="routeName" column="route_name" />
<result property="customerJson" column="customer_json" />
<result property="shuttleJson" column="shuttle_json" />
<result property="register" column="register" />
<!-- 继承自BaseVOEntity的字段 -->
<result property="createTime" column="create_time" />
@@ -38,6 +39,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
a.route_code,
a.route_name,
a.customer_json,
a.shuttle_json,
a.create_by,
a.create_by_name,
a.create_time,
@@ -0,0 +1,52 @@
-- =====================================================================
-- 出库/运输单据增加"线路+车次"字段 —— 4 张表加列 + 线路管理加车次清单
-- 日期: 2026-08-20
-- 数据库: 达梦(DM), 兼容 Oracle 语法, 表名/字段名统一大写
-- 背景:
-- 需求:
-- 出库业务单、出库执行单、运输业务单、运输执行单 的列表/新增/编辑/详情增加字段"线路"和"车次";
-- (出库预约/出库预约单经确认不需要,未加列)
-- WMS-基础数据-线路管理 页面增加"车次"维护。
-- 线路取自 line_management(ROUTE_CODE/ROUTE_NAME, 如 31 / 31线路),
-- 车次为下拉选择(选项=所选线路在 SHUTTLE_JSON 里维护的车次序号清单),
-- 前端拼接显示 "线路编码-序号车次"(如 31-4车次)。
-- 设计说明:
-- LINE_CODE 线路编码, 冗余存 line_management.route_code
-- LINE_NAME 线路名称, 冗余存储(OMS 与 WMS 两库不互通, 列表无法 join)
-- SHUTTLE_NO 车次, 字符串(用户输入内容不确定,序号或完整值均可,如4或31-4)
-- SHUTTLE_JSON 线路管理的车次序号清单(JSON数组, 如 [1,2,4,6]), 车次下拉数据源
-- 不复用已有 ROUTE 列(存的是 tms_route.id) 和 TRAIN_NO 列(老车次,
-- 入库链路 deliveryHeader.trainNumber 与 OMS->WMS 推送在用), 语义不同, 避免污染。
-- 关联代码: mhd_oms 四条链路 entity/DO/DTO/PO 已同步加 lineCode/lineName/shuttleNo
-- (reservationStockOutOrder/executionStockOutOrder/
-- businessDocumentOrder/executeOrder);
-- mhd_wms lineManagement 四层已加 shuttleJson。
-- 下发链路(预约单->执行单, 业务单->执行单)为 copyProperties 同名拷贝, 自动透传。
-- 最下面的是 wms 模块数据库
-- =====================================================================
ALTER TABLE RESERVATION_STOCK_OUT_ORDER ADD (LINE_CODE VARCHAR2(50), LINE_NAME VARCHAR2(100), SHUTTLE_NO VARCHAR2(50));
ALTER TABLE EXECUTION_STOCK_OUT_ORDER ADD (LINE_CODE VARCHAR2(50), LINE_NAME VARCHAR2(100), SHUTTLE_NO VARCHAR2(50));
ALTER TABLE BUSINESS_DOCUMENT_ORDER ADD (LINE_CODE VARCHAR2(50), LINE_NAME VARCHAR2(100), SHUTTLE_NO VARCHAR2(50));
ALTER TABLE EXECUTE_ORDER ADD (LINE_CODE VARCHAR2(50), LINE_NAME VARCHAR2(100), SHUTTLE_NO VARCHAR2(50));
COMMENT ON COLUMN RESERVATION_STOCK_OUT_ORDER.LINE_CODE IS '线路编码(取自WMS线路管理line_management.route_code)';
COMMENT ON COLUMN RESERVATION_STOCK_OUT_ORDER.LINE_NAME IS '线路名称(冗余存储)';
COMMENT ON COLUMN RESERVATION_STOCK_OUT_ORDER.SHUTTLE_NO IS '车次(字符串,可存序号或完整值,如4或31-4)';
COMMENT ON COLUMN EXECUTION_STOCK_OUT_ORDER.LINE_CODE IS '线路编码(取自WMS线路管理line_management.route_code)';
COMMENT ON COLUMN EXECUTION_STOCK_OUT_ORDER.LINE_NAME IS '线路名称(冗余存储)';
COMMENT ON COLUMN EXECUTION_STOCK_OUT_ORDER.SHUTTLE_NO IS '车次(字符串,可存序号或完整值,如4或31-4)';
COMMENT ON COLUMN BUSINESS_DOCUMENT_ORDER.LINE_CODE IS '线路编码(取自WMS线路管理line_management.route_code)';
COMMENT ON COLUMN BUSINESS_DOCUMENT_ORDER.LINE_NAME IS '线路名称(冗余存储)';
COMMENT ON COLUMN BUSINESS_DOCUMENT_ORDER.SHUTTLE_NO IS '车次(字符串,可存序号或完整值,如4或31-4)';
COMMENT ON COLUMN EXECUTE_ORDER.LINE_CODE IS '线路编码(取自WMS线路管理line_management.route_code)';
COMMENT ON COLUMN EXECUTE_ORDER.LINE_NAME IS '线路名称(冗余存储)';
COMMENT ON COLUMN EXECUTE_ORDER.SHUTTLE_NO IS '车次(字符串,可存序号或完整值,如4或31-4)';
-- ---------------- 线路管理增加车次清单 ----------------
-- WMS-基础数据-线路管理 页面增加"车次"字段: 每条线路维护车次序号清单,
-- OMS 出库/运输单据的车次下拉按线路查此清单
-- (如 31线路 SHUTTLE_JSON=[1,2,4,6] -> 下拉选项 31-1车次/31-2车次/31-4车次/31-6车次)
ALTER TABLE LINE_MANAGEMENT ADD (SHUTTLE_JSON VARCHAR2(1000));
COMMENT ON COLUMN LINE_MANAGEMENT.SHUTTLE_JSON IS '车次序号清单JSON数组,如[1,2,4,6],OMS单据车次下拉数据源';