feat(wms): 新增发货计划、发货单主表及明细表功能模块

- 新增发货计划实体类、业务对象、控制器、服务接口及实现
- 新增发货单主表实体类、业务对象、控制器、服务接口及实现
- 新增发货单明细表实体类、业务对象、控制器、服务接口及实现
- 配置相关Mapper接口与XML映射文件
- 实现基础的增删改查及分页查询功能
- 支持Excel导出功能
- 添加基础数据校验与日志记录
This commit is contained in:
2025-11-25 15:44:19 +08:00
parent 5d4eac555a
commit 97680263f1
24 changed files with 1696 additions and 0 deletions

View File

@@ -0,0 +1,47 @@
package com.klp.domain;
import com.baomidou.mybatisplus.annotation.*;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
/**
* 发货计划对象 wms_delivery_plan
*
* @author klp
* @date 2025-11-25
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("wms_delivery_plan")
public class WmsDeliveryPlan extends BaseEntity {
private static final long serialVersionUID=1L;
/**
* 计划唯一ID
*/
@TableId(value = "plan_id")
private Long planId;
/**
* 发货计划名称格式YYYY-MM-DD-序号如2025-11-25-001
*/
private String planName;
/**
* 计划日期
*/
private Date planDate;
/**
* 备注
*/
private String remark;
/**
* 删除标志0=正常1=已删除)
*/
@TableLogic
private Integer delFlag;
}

View File

@@ -0,0 +1,87 @@
package com.klp.domain;
import com.baomidou.mybatisplus.annotation.*;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
/**
* 发货单主对象 wms_delivery_waybill
*
* @author klp
* @date 2025-11-25
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("wms_delivery_waybill")
public class WmsDeliveryWaybill extends BaseEntity {
private static final long serialVersionUID=1L;
/**
* 发货单唯一ID
*/
@TableId(value = "waybill_id")
private Long waybillId;
/**
* 发货单编号格式WB-YYYYMMDD-XXXX如WB-20251125-0001
*/
private String waybillNo;
/**
* 发货单名称
*/
private String waybillName;
/**
* 关联发货计划ID
*/
private Long planId;
/**
* 车牌(支持新能源车牌)
*/
private String licensePlate;
/**
* 收货单位
*/
private String consigneeUnit;
/**
* 发货单位
*/
private String senderUnit;
/**
* 发货时间
*/
private Date deliveryTime;
/**
* 磅房
*/
private String weighbridge;
/**
* 销售
*/
private String salesPerson;
/**
* 负责人(司机/跟单员)
*/
private String principal;
/**
* 负责人电话(手机号/固话)
*/
private String principalPhone;
/**
* 完成状态0=待发货1=已发货2=已完成3=取消)
*/
private Long status;
/**
* 备注
*/
private String remark;
/**
* 删除标志0=正常1=已删除)
*/
@TableLogic
private Integer delFlag;
}

View File

@@ -0,0 +1,90 @@
package com.klp.domain;
import com.baomidou.mybatisplus.annotation.*;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
/**
* 发货单明细对象 wms_delivery_waybill_detail
*
* @author klp
* @date 2025-11-25
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("wms_delivery_waybill_detail")
public class WmsDeliveryWaybillDetail extends BaseEntity {
private static final long serialVersionUID=1L;
/**
* 明细唯一ID
*/
@TableId(value = "detail_id")
private Long detailId;
/**
* 关联发货单主表ID
*/
private Long waybillId;
/**
* 关联钢卷表ID钢卷基础信息在钢卷表中
*/
private Long coilId;
/**
* 品名(如:冷硬钢卷、冷轧钢卷)
*/
private String productName;
/**
* 切边(净边/毛边)
*/
private String edgeType;
/**
* 包装(裸包/简包1/精包2等
*/
private String packaging;
/**
* 结算方式(卷重/磅重)
*/
private String settlementType;
/**
* 原料厂家
*/
private String rawMaterialFactory;
/**
* 卷号
*/
private String coilNo;
/**
* 规格
*/
private String specification;
/**
* 材质
*/
private String material;
/**
* 数量(件)
*/
private Long quantity;
/**
* 重量kg
*/
private BigDecimal weight;
/**
* 单价
*/
private BigDecimal unitPrice;
/**
* 备注
*/
private String remark;
/**
* 删除标志0=正常1=已删除)
*/
@TableLogic
private Integer delFlag;
}

View File

@@ -0,0 +1,43 @@
package com.klp.domain.bo;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.*;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
/**
* 发货计划业务对象 wms_delivery_plan
*
* @author klp
* @date 2025-11-25
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class WmsDeliveryPlanBo extends BaseEntity {
/**
* 计划唯一ID
*/
private Long planId;
/**
* 发货计划名称格式YYYY-MM-DD-序号如2025-11-25-001
*/
private String planName;
/**
* 计划日期
*/
private Date planDate;
/**
* 备注
*/
private String remark;
}

View File

@@ -0,0 +1,109 @@
package com.klp.domain.bo;
import com.klp.common.core.domain.BaseEntity;
import com.klp.common.core.validate.AddGroup;
import com.klp.common.core.validate.EditGroup;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.*;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
/**
* 发货单主业务对象 wms_delivery_waybill
*
* @author klp
* @date 2025-11-25
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class WmsDeliveryWaybillBo extends BaseEntity {
/**
* 发货单唯一ID
*/
@NotNull(message = "发货单唯一ID不能为空", groups = { EditGroup.class })
private Long waybillId;
/**
* 发货单编号格式WB-YYYYMMDD-XXXX如WB-20251125-0001
*/
@NotBlank(message = "发货单编号格式WB-YYYYMMDD-XXXX如WB-20251125-0001不能为空", groups = { AddGroup.class, EditGroup.class })
private String waybillNo;
/**
* 发货单名称
*/
@NotBlank(message = "发货单名称不能为空", groups = { AddGroup.class, EditGroup.class })
private String waybillName;
/**
* 关联发货计划ID
*/
@NotNull(message = "关联发货计划ID不能为空", groups = { AddGroup.class, EditGroup.class })
private Long planId;
/**
* 车牌(支持新能源车牌)
*/
@NotBlank(message = "车牌(支持新能源车牌)不能为空", groups = { AddGroup.class, EditGroup.class })
private String licensePlate;
/**
* 收货单位
*/
@NotBlank(message = "收货单位不能为空", groups = { AddGroup.class, EditGroup.class })
private String consigneeUnit;
/**
* 发货单位
*/
@NotBlank(message = "发货单位不能为空", groups = { AddGroup.class, EditGroup.class })
private String senderUnit;
/**
* 发货时间
*/
@NotNull(message = "发货时间不能为空", groups = { AddGroup.class, EditGroup.class })
private Date deliveryTime;
/**
* 磅房
*/
@NotBlank(message = "磅房不能为空", groups = { AddGroup.class, EditGroup.class })
private String weighbridge;
/**
* 销售
*/
@NotBlank(message = "销售不能为空", groups = { AddGroup.class, EditGroup.class })
private String salesPerson;
/**
* 负责人(司机/跟单员)
*/
@NotBlank(message = "负责人(司机/跟单员)不能为空", groups = { AddGroup.class, EditGroup.class })
private String principal;
/**
* 负责人电话(手机号/固话)
*/
@NotBlank(message = "负责人电话(手机号/固话)不能为空", groups = { AddGroup.class, EditGroup.class })
private String principalPhone;
/**
* 完成状态0=待发货1=已发货2=已完成3=取消)
*/
@NotNull(message = "完成状态0=待发货1=已发货2=已完成3=取消)不能为空", groups = { AddGroup.class, EditGroup.class })
private Long status;
/**
* 备注
*/
@NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
private String remark;
}

View File

@@ -0,0 +1,114 @@
package com.klp.domain.bo;
import com.klp.common.core.domain.BaseEntity;
import com.klp.common.core.validate.AddGroup;
import com.klp.common.core.validate.EditGroup;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.*;
import java.math.BigDecimal;
/**
* 发货单明细业务对象 wms_delivery_waybill_detail
*
* @author klp
* @date 2025-11-25
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class WmsDeliveryWaybillDetailBo extends BaseEntity {
/**
* 明细唯一ID
*/
@NotNull(message = "明细唯一ID不能为空", groups = { EditGroup.class })
private Long detailId;
/**
* 关联发货单主表ID
*/
@NotNull(message = "关联发货单主表ID不能为空", groups = { AddGroup.class, EditGroup.class })
private Long waybillId;
/**
* 关联钢卷表ID钢卷基础信息在钢卷表中
*/
@NotNull(message = "关联钢卷表ID钢卷基础信息在钢卷表中不能为空", groups = { AddGroup.class, EditGroup.class })
private Long coilId;
/**
* 品名(如:冷硬钢卷、冷轧钢卷)
*/
@NotBlank(message = "品名(如:冷硬钢卷、冷轧钢卷)不能为空", groups = { AddGroup.class, EditGroup.class })
private String productName;
/**
* 切边(净边/毛边)
*/
@NotBlank(message = "切边(净边/毛边)不能为空", groups = { AddGroup.class, EditGroup.class })
private String edgeType;
/**
* 包装(裸包/简包1/精包2等
*/
@NotBlank(message = "包装(裸包/简包1/精包2等不能为空", groups = { AddGroup.class, EditGroup.class })
private String packaging;
/**
* 结算方式(卷重/磅重)
*/
@NotBlank(message = "结算方式(卷重/磅重)不能为空", groups = { AddGroup.class, EditGroup.class })
private String settlementType;
/**
* 原料厂家
*/
@NotBlank(message = "原料厂家不能为空", groups = { AddGroup.class, EditGroup.class })
private String rawMaterialFactory;
/**
* 卷号
*/
@NotBlank(message = "卷号不能为空", groups = { AddGroup.class, EditGroup.class })
private String coilNo;
/**
* 规格
*/
@NotBlank(message = "规格不能为空", groups = { AddGroup.class, EditGroup.class })
private String specification;
/**
* 材质
*/
@NotBlank(message = "材质不能为空", groups = { AddGroup.class, EditGroup.class })
private String material;
/**
* 数量(件)
*/
@NotNull(message = "数量(件)不能为空", groups = { AddGroup.class, EditGroup.class })
private Long quantity;
/**
* 重量kg
*/
@NotNull(message = "重量kg不能为空", groups = { AddGroup.class, EditGroup.class })
private BigDecimal weight;
/**
* 单价
*/
@NotNull(message = "单价不能为空", groups = { AddGroup.class, EditGroup.class })
private BigDecimal unitPrice;
/**
* 备注
*/
@NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
private String remark;
}

View File

@@ -0,0 +1,50 @@
package com.klp.domain.vo;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.klp.common.annotation.ExcelDictFormat;
import com.klp.common.convert.ExcelDictConvert;
import lombok.Data;
/**
* 发货计划视图对象 wms_delivery_plan
*
* @author klp
* @date 2025-11-25
*/
@Data
@ExcelIgnoreUnannotated
public class WmsDeliveryPlanVo {
private static final long serialVersionUID = 1L;
/**
* 计划唯一ID
*/
@ExcelProperty(value = "计划唯一ID")
private Long planId;
/**
* 发货计划名称格式YYYY-MM-DD-序号如2025-11-25-001
*/
@ExcelProperty(value = "发货计划名称", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "格=式YYYY-MM-DD-序号如2025-11-25-001")
private String planName;
/**
* 计划日期
*/
@ExcelProperty(value = "计划日期")
private Date planDate;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
}

View File

@@ -0,0 +1,121 @@
package com.klp.domain.vo;
import java.math.BigDecimal;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.klp.common.annotation.ExcelDictFormat;
import com.klp.common.convert.ExcelDictConvert;
import lombok.Data;
/**
* 发货单明细视图对象 wms_delivery_waybill_detail
*
* @author klp
* @date 2025-11-25
*/
@Data
@ExcelIgnoreUnannotated
public class WmsDeliveryWaybillDetailVo {
private static final long serialVersionUID = 1L;
/**
* 明细唯一ID
*/
@ExcelProperty(value = "明细唯一ID")
private Long detailId;
/**
* 关联发货单主表ID
*/
@ExcelProperty(value = "关联发货单主表ID")
private Long waybillId;
/**
* 关联钢卷表ID钢卷基础信息在钢卷表中
*/
@ExcelProperty(value = "关联钢卷表ID", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "钢=卷基础信息在钢卷表中")
private Long coilId;
/**
* 品名(如:冷硬钢卷、冷轧钢卷)
*/
@ExcelProperty(value = "品名", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "如=:冷硬钢卷、冷轧钢卷")
private String productName;
/**
* 切边(净边/毛边)
*/
@ExcelProperty(value = "切边", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "净=边/毛边")
private String edgeType;
/**
* 包装(裸包/简包1/精包2等
*/
@ExcelProperty(value = "包装", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "裸=包/简包1/精包2等")
private String packaging;
/**
* 结算方式(卷重/磅重)
*/
@ExcelProperty(value = "结算方式", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "卷=重/磅重")
private String settlementType;
/**
* 原料厂家
*/
@ExcelProperty(value = "原料厂家")
private String rawMaterialFactory;
/**
* 卷号
*/
@ExcelProperty(value = "卷号")
private String coilNo;
/**
* 规格
*/
@ExcelProperty(value = "规格")
private String specification;
/**
* 材质
*/
@ExcelProperty(value = "材质")
private String material;
/**
* 数量(件)
*/
@ExcelProperty(value = "数量", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "件=")
private Long quantity;
/**
* 重量kg
*/
@ExcelProperty(value = "重量", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "k=g")
private BigDecimal weight;
/**
* 单价
*/
@ExcelProperty(value = "单价")
private BigDecimal unitPrice;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
}

View File

@@ -0,0 +1,114 @@
package com.klp.domain.vo;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.klp.common.annotation.ExcelDictFormat;
import com.klp.common.convert.ExcelDictConvert;
import lombok.Data;
/**
* 发货单主视图对象 wms_delivery_waybill
*
* @author klp
* @date 2025-11-25
*/
@Data
@ExcelIgnoreUnannotated
public class WmsDeliveryWaybillVo {
private static final long serialVersionUID = 1L;
/**
* 发货单唯一ID
*/
@ExcelProperty(value = "发货单唯一ID")
private Long waybillId;
/**
* 发货单编号格式WB-YYYYMMDD-XXXX如WB-20251125-0001
*/
@ExcelProperty(value = "发货单编号", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "格=式WB-YYYYMMDD-XXXX如WB-20251125-0001")
private String waybillNo;
/**
* 发货单名称
*/
@ExcelProperty(value = "发货单名称")
private String waybillName;
/**
* 关联发货计划ID
*/
@ExcelProperty(value = "关联发货计划ID")
private Long planId;
/**
* 车牌(支持新能源车牌)
*/
@ExcelProperty(value = "车牌", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "支=持新能源车牌")
private String licensePlate;
/**
* 收货单位
*/
@ExcelProperty(value = "收货单位")
private String consigneeUnit;
/**
* 发货单位
*/
@ExcelProperty(value = "发货单位")
private String senderUnit;
/**
* 发货时间
*/
@ExcelProperty(value = "发货时间")
private Date deliveryTime;
/**
* 磅房
*/
@ExcelProperty(value = "磅房")
private String weighbridge;
/**
* 销售
*/
@ExcelProperty(value = "销售")
private String salesPerson;
/**
* 负责人(司机/跟单员)
*/
@ExcelProperty(value = "负责人", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "司=机/跟单员")
private String principal;
/**
* 负责人电话(手机号/固话)
*/
@ExcelProperty(value = "负责人电话", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "手=机号/固话")
private String principalPhone;
/**
* 完成状态0=待发货1=已发货2=已完成3=取消)
*/
@ExcelProperty(value = "完成状态", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "0==待发货1=已发货2=已完成3=取消")
private Long status;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
}