From 6ba97b3e3fb7ebf15f859d33b53e06af6bc00427 Mon Sep 17 00:00:00 2001 From: "zangch@mesnac.com" Date: Thu, 11 Dec 2025 09:17:40 +0800 Subject: [PATCH] =?UTF-8?q?feat(wms):=20=E6=96=B0=E5=A2=9E=E5=8F=91?= =?UTF-8?q?=E8=B4=A7=E5=8D=95=E5=8F=8A=E5=8F=91=E8=B4=A7=E5=8D=95=E6=98=8E?= =?UTF-8?q?=E7=BB=86=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 创建发货单服务接口IWmsShippingBillService,定义查询、新增、修改、删除、提交流程等方法 - 创建发货单明细服务接口IWmsShippingDetailsService,定义对应的增删查改接口 - 定义发货单实体类WmsShippingBill,包含各类发货相关字段及明细列表 - 定义发货单业务对象WmsShippingBillBo,支持校验和流程变量扩展 - 新增发货单控制器WmsShippingBillController,提供发货单的增删改查和流程提交接口 - 新增发货单MyBatis Mapper接口及XML实现,支持分页、自定义查询、批量操作和逻辑删除 - 完成发货单相关SQL映射文件,支持复杂联表查询获取合同SAP订单号信息 - 实现分页列表、导出Excel、权限校验、日志记录和防重复提交功能 --- .../controller/WmsShippingBillController.java | 128 ++++++ .../WmsShippingDetailsController.java | 117 +++++ .../dromara/wms/domain/WmsShippingBill.java | 235 ++++++++++ .../wms/domain/WmsShippingDetails.java | 131 ++++++ .../wms/domain/bo/WmsShippingBillBo.java | 259 ++++++++++++ .../wms/domain/bo/WmsShippingDetailsBo.java | 121 ++++++ .../wms/domain/vo/WmsShippingBillVo.java | 285 +++++++++++++ .../wms/domain/vo/WmsShippingDetailsVo.java | 152 +++++++ .../wms/mapper/WmsShippingBillMapper.java | 128 ++++++ .../wms/mapper/WmsShippingDetailsMapper.java | 114 +++++ .../wms/service/IWmsShippingBillService.java | 76 ++++ .../service/IWmsShippingDetailsService.java | 68 +++ .../impl/WmsShippingBillServiceImpl.java | 339 +++++++++++++++ .../impl/WmsShippingDetailsServiceImpl.java | 148 +++++++ .../mapper/wms/WmsShippingBillMapper.xml | 400 ++++++++++++++++++ .../mapper/wms/WmsShippingDetailsMapper.xml | 262 ++++++++++++ 16 files changed, 2963 insertions(+) create mode 100644 ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/controller/WmsShippingBillController.java create mode 100644 ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/controller/WmsShippingDetailsController.java create mode 100644 ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/domain/WmsShippingBill.java create mode 100644 ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/domain/WmsShippingDetails.java create mode 100644 ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/domain/bo/WmsShippingBillBo.java create mode 100644 ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/domain/bo/WmsShippingDetailsBo.java create mode 100644 ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/domain/vo/WmsShippingBillVo.java create mode 100644 ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/domain/vo/WmsShippingDetailsVo.java create mode 100644 ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/mapper/WmsShippingBillMapper.java create mode 100644 ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/mapper/WmsShippingDetailsMapper.java create mode 100644 ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/service/IWmsShippingBillService.java create mode 100644 ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/service/IWmsShippingDetailsService.java create mode 100644 ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/service/impl/WmsShippingBillServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/service/impl/WmsShippingDetailsServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-wms/src/main/resources/mapper/wms/WmsShippingBillMapper.xml create mode 100644 ruoyi-modules/ruoyi-wms/src/main/resources/mapper/wms/WmsShippingDetailsMapper.xml diff --git a/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/controller/WmsShippingBillController.java b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/controller/WmsShippingBillController.java new file mode 100644 index 00000000..cd01df9a --- /dev/null +++ b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/controller/WmsShippingBillController.java @@ -0,0 +1,128 @@ +package org.dromara.wms.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; +import org.dromara.wms.domain.bo.WmsShippingBillBo; +import org.dromara.wms.domain.vo.WmsShippingBillVo; +import org.dromara.wms.service.IWmsShippingBillService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 发货单 + * 前端访问路由地址为:/wms/wmsShippingBill + * + * @author Yinq + * @date 2025-12-08 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/wmsShippingBill") +public class WmsShippingBillController extends BaseController { + + private final IWmsShippingBillService wmsShippingBillService; + + /** + * 查询发货单列表 + */ + @SaCheckPermission("wms:wmsShippingBill:list") + @GetMapping("/list") + public TableDataInfo list(WmsShippingBillBo bo, PageQuery pageQuery) { + return wmsShippingBillService.queryPageList(bo, pageQuery); + } + + /** + * 导出发货单列表 + */ + @SaCheckPermission("wms:wmsShippingBill:export") + @Log(title = "发货单", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(WmsShippingBillBo bo, HttpServletResponse response) { + List list = wmsShippingBillService.queryList(bo); + ExcelUtil.exportExcel(list, "发货单", WmsShippingBillVo.class, response); + } + + /** + * 获取发货单详细信息 + * + * @param shippingBillId 主键 + */ + @SaCheckPermission("wms:wmsShippingBill:query") + @GetMapping("/{shippingBillId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable("shippingBillId") Long shippingBillId) { + return R.ok(wmsShippingBillService.queryById(shippingBillId)); + } + + /** + * 新增发货单 + */ + @SaCheckPermission("wms:wmsShippingBill:add") + @Log(title = "发货单", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody WmsShippingBillBo bo) { + return toAjax(wmsShippingBillService.insertByBo(bo)); + } + + /** + * 修改发货单 + */ + @SaCheckPermission("wms:wmsShippingBill:edit") + @Log(title = "发货单", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody WmsShippingBillBo bo) { + return toAjax(wmsShippingBillService.updateByBo(bo)); + } + + /** + * 删除发货单 + * + * @param shippingBillIds 主键串 + */ + @SaCheckPermission("wms:wmsShippingBill:remove") + @Log(title = "发货单", businessType = BusinessType.DELETE) + @DeleteMapping("/{shippingBillIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable("shippingBillIds") Long[] shippingBillIds) { + return toAjax(wmsShippingBillService.deleteWithValidByIds(List.of(shippingBillIds), true)); + } + + /** + * 下拉框查询发货单列表 + */ + @GetMapping("/getWmsShippingBillList") + public R> getWmsShippingBillList(WmsShippingBillBo bo) { + List list = wmsShippingBillService.queryList(bo); + return R.ok(list); + } + + /** + * 提交发货单并发起审批流程 + */ + @SaCheckPermission("wms:wmsShippingBill:edit") + @Log(title = "发货单", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PostMapping("/shippingBillSubmitAndFlowStart") + public R shippingBillSubmitAndFlowStart(@RequestBody WmsShippingBillBo bo) { + return R.ok(wmsShippingBillService.shippingBillSubmitAndFlowStart(bo)); + } + +} diff --git a/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/controller/WmsShippingDetailsController.java b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/controller/WmsShippingDetailsController.java new file mode 100644 index 00000000..1bdaf5d2 --- /dev/null +++ b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/controller/WmsShippingDetailsController.java @@ -0,0 +1,117 @@ +package org.dromara.wms.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; +import org.dromara.wms.domain.bo.WmsShippingDetailsBo; +import org.dromara.wms.domain.vo.WmsShippingDetailsVo; +import org.dromara.wms.service.IWmsShippingDetailsService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 发货单明细 + * 前端访问路由地址为:/wms/wmsShippingDetails + * + * @author Yinq + * @date 2025-12-08 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/wmsShippingDetails") +public class WmsShippingDetailsController extends BaseController { + + private final IWmsShippingDetailsService wmsShippingDetailsService; + + /** + * 查询发货单明细列表 + */ + @SaCheckPermission("wms:wmsShippingDetails:list") + @GetMapping("/list") + public TableDataInfo list(WmsShippingDetailsBo bo, PageQuery pageQuery) { + return wmsShippingDetailsService.queryPageList(bo, pageQuery); + } + + /** + * 导出发货单明细列表 + */ + @SaCheckPermission("wms:wmsShippingDetails:export") + @Log(title = "发货单明细", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(WmsShippingDetailsBo bo, HttpServletResponse response) { + List list = wmsShippingDetailsService.queryList(bo); + ExcelUtil.exportExcel(list, "发货单明细", WmsShippingDetailsVo.class, response); + } + + /** + * 获取发货单明细详细信息 + * + * @param shippingDetailsId 主键 + */ + @SaCheckPermission("wms:wmsShippingDetails:query") + @GetMapping("/{shippingDetailsId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable("shippingDetailsId") Long shippingDetailsId) { + return R.ok(wmsShippingDetailsService.queryById(shippingDetailsId)); + } + + /** + * 新增发货单明细 + */ + @SaCheckPermission("wms:wmsShippingDetails:add") + @Log(title = "发货单明细", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody WmsShippingDetailsBo bo) { + return toAjax(wmsShippingDetailsService.insertByBo(bo)); + } + + /** + * 修改发货单明细 + */ + @SaCheckPermission("wms:wmsShippingDetails:edit") + @Log(title = "发货单明细", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody WmsShippingDetailsBo bo) { + return toAjax(wmsShippingDetailsService.updateByBo(bo)); + } + + /** + * 删除发货单明细 + * + * @param shippingDetailsIds 主键串 + */ + @SaCheckPermission("wms:wmsShippingDetails:remove") + @Log(title = "发货单明细", businessType = BusinessType.DELETE) + @DeleteMapping("/{shippingDetailsIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable("shippingDetailsIds") Long[] shippingDetailsIds) { + return toAjax(wmsShippingDetailsService.deleteWithValidByIds(List.of(shippingDetailsIds), true)); + } + + /** + * 下拉框查询发货单明细列表 + */ + @GetMapping("/getWmsShippingDetailsList") + public R> getWmsShippingDetailsList(WmsShippingDetailsBo bo) { + List list = wmsShippingDetailsService.queryList(bo); + return R.ok(list); + } + +} diff --git a/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/domain/WmsShippingBill.java b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/domain/WmsShippingBill.java new file mode 100644 index 00000000..6f33d85b --- /dev/null +++ b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/domain/WmsShippingBill.java @@ -0,0 +1,235 @@ +package org.dromara.wms.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.tenant.core.TenantEntity; + +import java.io.Serial; +import java.util.Date; +import java.util.List; + +/** + * 发货单对象 wms_shipping_bill + * + * @author Yinq + * @date 2025-12-08 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("wms_shipping_bill") +public class WmsShippingBill extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 发货单ID + */ + @TableId(value = "shipping_bill_id", type = IdType.ASSIGN_ID) + private Long shippingBillId; + + /** + * 发货单号 + */ + private String shippingCode; + + /** + * 发货单类型 + */ + private String shippingType; + + /** + * 发货方式:1公司仓库发货 2供应商代发货 + */ + private String shippingMode; + + /** + * 绑定类型:1项目 2合同 + */ + private String bindType; + + /** + * 项目ID + */ + private Long projectId; + + /** + * 项目编号(冗余,方便导出) + */ + private String projectCode; + + /** + * 项目名称(冗余,方便导出) + */ + private String projectName; + + /** + * 客户ID(逻辑外键) + */ + private Long customerId; + + /** + * 客户名称(冗余,方便导出) + */ + private String customerName; + + /** + * 收货地址 + */ + private String shippingAddress; + + /** + * 关联单号 + */ + private String inventoryAmount; + + /** + * 来源单据类型(如PO采购订单、SO销售订单、PR项目采购申请等) + */ + private String sourceBillType; + + /** + * 来源单据ID(逻辑外键,不建物理外键) + */ + private Long sourceBillId; + + /** + * 来源单据编号 + */ + private String sourceBillCode; + + /** + * 合同ID(逻辑外键) + */ + private Long contractId; + + /** + * 合同编号(冗余,方便导出) + */ + private String contractCode; + + /** + * 合同名称(冗余,方便导出) + */ + private String contractName; + + /** + * SAP订单号(来源合同表,不入库) + */ + @TableField(exist = false) + private String orderContractCode; + + /** + * 供应商 + */ + private String supplier; + + /** + * 供应商ID(逻辑外键) + */ + private Long supplierId; + + /** + * 联系人 + */ + private String contactUser; + + /** + * 联系电话 + */ + private String contactNumber; + + /** + * 收货联系人 + */ + private String receiverName; + + /** + * 收货联系电话 + */ + private String receiverPhone; + + /** + * 物流公司 + */ + private String logisticsCompany; + + /** + * 运单号 + */ + private String trackingNo; + + /** + * 物流联系电话 + */ + private String logisticsPhone; + + /** + * 发货说明 + */ + private String directions; + + /** + * 计划到货时间(冗余,用于未按时发货台账) + */ + private Date planArrivalTime; + + /** + * 实际发货时间 + */ + private Date shippingTime; + + /** + * 客户收货时间 + */ + private Date receivedTime; + + /** + * 业务完成时间(如SAP投料 / 内部流程完成) + */ + private Date completedTime; + + /** + * 发货单状态(1暂存 2审批中 3完成) + */ + private String outStockBillStatus; + + /** + * 流程状态 + */ + private String flowStatus; + + /** + * 发货状态,字典shipping_status:1待发货 2已发货 3已收货 4已完成 + */ + private String shippingStatus; + + /** + * 仓库ID(预留) + */ + private Long warehouseId; + + /** + * 仓库名称(冗余,方便导出) + */ + private String warehouseName; + + /** + * 备注 + */ + private String remark; + + /** + * 删除标志(0代表存在 1代表删除) + */ + @TableLogic + private String delFlag; + + /** + * 发货单明细列表(主子表关联,不存在于数据库) + */ + @TableField(exist = false) + private List detailsList; + +} diff --git a/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/domain/WmsShippingDetails.java b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/domain/WmsShippingDetails.java new file mode 100644 index 00000000..12100b51 --- /dev/null +++ b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/domain/WmsShippingDetails.java @@ -0,0 +1,131 @@ +package org.dromara.wms.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.tenant.core.TenantEntity; + +import java.io.Serial; +import java.math.BigDecimal; + +/** + * 发货单明细对象 wms_shipping_details + * + * @author Yinq + * @date 2025-12-08 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("wms_shipping_details") +public class WmsShippingDetails extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 发货单明细ID + */ + @TableId(value = "shipping_details_id", type = IdType.AUTO) + private Long shippingDetailsId; + + /** + * 发货单ID(逻辑外键) + */ + private Long shippingBillId; + + /** + * 物料来源类型:1-ERP物料(base_material_info) 2-WMS物料(仓储物料) 3-手工录入 + */ + private String materialSourceType; + + /** + * ERP物料ID(base_material_info.material_id) + */ + private Long erpMaterialId; + + /** + * WMS物料ID(仓储物料表ID,预留) + */ + private Long wmsMaterialId; + + /** + * 来源明细类型:如CONTRACT_DETAIL、PURCHASE_DETAIL等 + */ + private String sourceDetailType; + + /** + * 来源明细ID + */ + private Long sourceDetailId; + + /** + * 仓库ID + */ + private Long warehouseId; + + /** + * 物料ID + */ + private Long materielId; + + /** + * 物料编码(冗余,方便导出) + */ + private String materialCode; + + /** + * 物料名称(冗余,方便导出) + */ + private String materialName; + + /** + * 物料规格 + */ + private String materielSpecification; + + /** + * 批次号 + */ + private String batchNumber; + + /** + * 单价 + */ + private BigDecimal unitPrice; + + /** + * 发货数量 + */ + private BigDecimal shippingStockAmount; + + /** + * 单位ID + */ + private Long unitId; + + /** + * 计量单位名称(冗余,方便导出) + */ + private String unitName; + + /** + * 总价 + */ + private BigDecimal totalPrice; + + /** + * 备注 + */ + private String remark; + + /** + * 删除标志(0代表存在 1代表删除) + */ + @TableLogic + private String delFlag; + + +} diff --git a/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/domain/bo/WmsShippingBillBo.java b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/domain/bo/WmsShippingBillBo.java new file mode 100644 index 00000000..7c39b2ac --- /dev/null +++ b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/domain/bo/WmsShippingBillBo.java @@ -0,0 +1,259 @@ +package org.dromara.wms.domain.bo; + +import cn.hutool.core.util.ObjectUtil; +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.wms.domain.WmsShippingBill; +import org.dromara.wms.domain.WmsShippingDetails; +import org.dromara.workflow.api.domain.RemoteFlowInstanceBizExt; + +import java.util.*; + +/** + * 发货单业务对象 wms_shipping_bill + * + * @author Yinq + * @date 2025-12-08 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = WmsShippingBill.class, reverseConvertGenerate = false) +public class WmsShippingBillBo extends BaseEntity { + + /** + * 发货单ID + */ + @NotNull(message = "发货单ID不能为空", groups = { EditGroup.class }) + private Long shippingBillId; + + /** + * 发货单号 + */ + private String shippingCode; + + /** + * 发货单类型 + */ + private String shippingType; + + /** + * 发货方式:1公司仓库发货 2供应商代发货 + */ + private String shippingMode; + + /** + * 绑定类型:1项目 2合同 + */ + private String bindType; + + /** + * 项目ID + */ + private Long projectId; + + /** + * 项目编号(冗余,方便导出) + */ + private String projectCode; + + /** + * 项目名称(冗余,方便导出) + */ + private String projectName; + + /** + * 客户ID(逻辑外键) + */ + private Long customerId; + + /** + * 客户名称(冗余,方便导出) + */ + private String customerName; + + /** + * 收货地址 + */ + private String shippingAddress; + + /** + * 关联单号 + */ + private String inventoryAmount; + + /** + * 来源单据类型(如PO采购订单、SO销售订单、PR项目采购申请等) + */ + private String sourceBillType; + + /** + * 来源单据ID(逻辑外键,不建物理外键) + */ + private Long sourceBillId; + + /** + * 来源单据编号 + */ + private String sourceBillCode; + + /** + * 合同ID(逻辑外键) + */ + private Long contractId; + + /** + * 合同编号(冗余,方便导出) + */ + private String contractCode; + + /** + * 合同名称(冗余,方便导出) + */ + private String contractName; + + /** + * SAP订单号(来源合同表,不入库) + */ + private String orderContractCode; + + /** + * 供应商 + */ + private String supplier; + + /** + * 供应商ID(逻辑外键) + */ + private Long supplierId; + + /** + * 联系人 + */ + private String contactUser; + + /** + * 联系电话 + */ + private String contactNumber; + + /** + * 收货联系人 + */ + private String receiverName; + + /** + * 收货联系电话 + */ + private String receiverPhone; + + /** + * 物流公司 + */ + private String logisticsCompany; + + /** + * 运单号 + */ + private String trackingNo; + + /** + * 物流联系电话 + */ + private String logisticsPhone; + + /** + * 发货说明 + */ + private String directions; + + /** + * 计划到货时间(冗余,用于未按时发货台账) + */ + private Date planArrivalTime; + + /** + * 实际发货时间 + */ + private Date shippingTime; + + /** + * 客户收货时间 + */ + private Date receivedTime; + + /** + * 业务完成时间(如SAP投料 / 内部流程完成) + */ + private Date completedTime; + + /** + * 发货单状态(1暂存 2审批中 3完成) + */ + private String outStockBillStatus; + + /** + * 流程状态 + */ + private String flowStatus; + + /** + * 发货状态,字典shipping_status:1待发货 2已发货 3已收货 4已完成 + */ + private String shippingStatus; + + /** + * 仓库ID(预留) + */ + private Long warehouseId; + + /** + * 仓库名称(冗余,方便导出) + */ + private String warehouseName; + + /** + * 备注 + */ + private String remark; + + /** + * 发货单明细列表(主子表提交用) + */ + private List detailsList; + + /** + * 流程编码(后端发起流程用) + */ + private String flowCode; + + /** + * 流程变量,前端会提交一个元素{'entity': {业务详情数据对象}} + */ + private Map variables; + + /** + * 流程业务扩展信息 + */ + private RemoteFlowInstanceBizExt bizExt; + + public Map getVariables() { + if (variables == null) { + return new HashMap<>(16); + } + variables.entrySet().removeIf(entry -> Objects.isNull(entry.getValue())); + return variables; + } + + public RemoteFlowInstanceBizExt getBizExt() { + if (ObjectUtil.isNull(bizExt)) { + bizExt = new RemoteFlowInstanceBizExt(); + } + return bizExt; + } + + +} diff --git a/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/domain/bo/WmsShippingDetailsBo.java b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/domain/bo/WmsShippingDetailsBo.java new file mode 100644 index 00000000..0f6a396b --- /dev/null +++ b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/domain/bo/WmsShippingDetailsBo.java @@ -0,0 +1,121 @@ +package org.dromara.wms.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.wms.domain.WmsShippingDetails; + +import java.math.BigDecimal; + +/** + * 发货单明细业务对象 wms_shipping_details + * + * @author Yinq + * @date 2025-12-08 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = WmsShippingDetails.class, reverseConvertGenerate = false) +public class WmsShippingDetailsBo extends BaseEntity { + + /** + * 发货单明细ID + */ + @NotNull(message = "发货单明细ID不能为空", groups = { EditGroup.class }) + private Long shippingDetailsId; + + /** + * 发货单ID(逻辑外键) + */ + private Long shippingBillId; + + /** + * 物料来源类型:1-ERP物料(base_material_info) 2-WMS物料(仓储物料) 3-手工录入 + */ + private String materialSourceType; + + /** + * ERP物料ID(base_material_info.material_id) + */ + private Long erpMaterialId; + + /** + * WMS物料ID(仓储物料表ID,预留) + */ + private Long wmsMaterialId; + + /** + * 来源明细类型:如CONTRACT_DETAIL、PURCHASE_DETAIL等 + */ + private String sourceDetailType; + + /** + * 来源明细ID + */ + private Long sourceDetailId; + + /** + * 仓库ID + */ + private Long warehouseId; + + /** + * 物料ID + */ + private Long materielId; + + /** + * 物料编码(冗余,方便导出) + */ + private String materialCode; + + /** + * 物料名称(冗余,方便导出) + */ + private String materialName; + + /** + * 物料规格 + */ + private String materielSpecification; + + /** + * 批次号 + */ + private String batchNumber; + + /** + * 单价 + */ + private BigDecimal unitPrice; + + /** + * 发货数量 + */ + private BigDecimal shippingStockAmount; + + /** + * 单位ID + */ + private Long unitId; + + /** + * 计量单位名称(冗余,方便导出) + */ + private String unitName; + + /** + * 总价 + */ + private BigDecimal totalPrice; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/domain/vo/WmsShippingBillVo.java b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/domain/vo/WmsShippingBillVo.java new file mode 100644 index 00000000..fef9eb94 --- /dev/null +++ b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/domain/vo/WmsShippingBillVo.java @@ -0,0 +1,285 @@ +package org.dromara.wms.domain.vo; + +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.wms.domain.WmsShippingBill; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + + + +/** + * 发货单视图对象 wms_shipping_bill + * + * @author Yinq + * @date 2025-12-08 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = WmsShippingBill.class) +public class WmsShippingBillVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 发货单ID + */ + @ExcelProperty(value = "发货单ID") + private Long shippingBillId; + + /** + * 发货单号 + */ + @ExcelProperty(value = "发货单号") + private String shippingCode; + + /** + * 发货单类型 + */ + @ExcelProperty(value = "发货单类型") + private String shippingType; + + /** + * 发货方式:1公司仓库发货 2供应商代发货 + */ + @ExcelProperty(value = "发货方式:1公司仓库发货 2供应商代发货") + private String shippingMode; + + /** + * 绑定类型:1项目 2合同 + */ + @ExcelProperty(value = "绑定类型:1项目 2合同") + private String bindType; + + /** + * 项目ID + */ + @ExcelProperty(value = "项目ID") + private Long projectId; + + /** + * 项目编号(冗余,方便导出) + */ + @ExcelProperty(value = "项目编号", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "冗=余,方便导出") + private String projectCode; + + /** + * 项目名称(冗余,方便导出) + */ + @ExcelProperty(value = "项目名称", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "冗=余,方便导出") + private String projectName; + + /** + * 客户ID(逻辑外键) + */ + @ExcelProperty(value = "客户ID", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "逻=辑外键") + private Long customerId; + + /** + * 客户名称(冗余,方便导出) + */ + @ExcelProperty(value = "客户名称", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "冗=余,方便导出") + private String customerName; + + /** + * 收货地址 + */ + @ExcelProperty(value = "收货地址") + private String shippingAddress; + + /** + * 关联单号 + */ + @ExcelProperty(value = "关联单号") + private String inventoryAmount; + + /** + * 来源单据类型(如PO采购订单、SO销售订单、PR项目采购申请等) + */ + @ExcelProperty(value = "来源单据类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "如=PO采购订单、SO销售订单、PR项目采购申请等") + private String sourceBillType; + + /** + * 来源单据ID(逻辑外键,不建物理外键) + */ + @ExcelProperty(value = "来源单据ID", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "逻=辑外键,不建物理外键") + private Long sourceBillId; + + /** + * 来源单据编号 + */ + @ExcelProperty(value = "来源单据编号") + private String sourceBillCode; + + /** + * 合同ID(逻辑外键) + */ + @ExcelProperty(value = "合同ID", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "逻=辑外键") + private Long contractId; + + /** + * 合同编号(冗余,方便导出) + */ + @ExcelProperty(value = "合同编号", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "冗=余,方便导出") + private String contractCode; + + /** + * 合同名称(冗余,方便导出) + */ + @ExcelProperty(value = "合同名称", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "冗=余,方便导出") + private String contractName; + + /** + * SAP订单号(来源合同表,不入库) + */ + @ExcelProperty(value = "SAP订单号") + private String orderContractCode; + + /** + * 供应商 + */ + @ExcelProperty(value = "供应商") + private String supplier; + + /** + * 供应商ID(逻辑外键) + */ + @ExcelProperty(value = "供应商ID", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "逻=辑外键") + private Long supplierId; + + /** + * 联系人 + */ + @ExcelProperty(value = "联系人") + private String contactUser; + + /** + * 联系电话 + */ + @ExcelProperty(value = "联系电话") + private String contactNumber; + + /** + * 收货联系人 + */ + @ExcelProperty(value = "收货联系人") + private String receiverName; + + /** + * 收货联系电话 + */ + @ExcelProperty(value = "收货联系电话") + private String receiverPhone; + + /** + * 物流公司 + */ + @ExcelProperty(value = "物流公司") + private String logisticsCompany; + + /** + * 运单号 + */ + @ExcelProperty(value = "运单号") + private String trackingNo; + + /** + * 物流联系电话 + */ + @ExcelProperty(value = "物流联系电话") + private String logisticsPhone; + + /** + * 发货说明 + */ + @ExcelProperty(value = "发货说明") + private String directions; + + /** + * 计划到货时间(冗余,用于未按时发货台账) + */ + @ExcelProperty(value = "计划到货时间", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "冗=余,用于未按时发货台账") + private Date planArrivalTime; + + /** + * 实际发货时间 + */ + @ExcelProperty(value = "实际发货时间") + private Date shippingTime; + + /** + * 客户收货时间 + */ + @ExcelProperty(value = "客户收货时间") + private Date receivedTime; + + /** + * 业务完成时间(如SAP投料 / 内部流程完成) + */ + @ExcelProperty(value = "业务完成时间", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "如=SAP投料,/=,内=部流程完成") + private Date completedTime; + + /** + * 发货单状态(1暂存 2审批中 3完成) + */ + @ExcelProperty(value = "发货单状态(1暂存 2审批中 3完成)") + private String outStockBillStatus; + + /** + * 流程状态 + */ + @ExcelProperty(value = "流程状态") + private String flowStatus; + + /** + * 发货状态,字典shipping_status:1待发货 2已发货 3已收货 4已完成 + */ + @ExcelProperty(value = "发货状态,字典shipping_status:1待发货 2已发货 3已收货 4已完成") + private String shippingStatus; + + /** + * 仓库ID(预留) + */ + @ExcelProperty(value = "仓库ID", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "预=留") + private Long warehouseId; + + /** + * 仓库名称(冗余,方便导出) + */ + @ExcelProperty(value = "仓库名称", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "冗=余,方便导出") + private String warehouseName; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 发货单明细列表 + */ + private List itemsVo; + +} diff --git a/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/domain/vo/WmsShippingDetailsVo.java b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/domain/vo/WmsShippingDetailsVo.java new file mode 100644 index 00000000..75a0b255 --- /dev/null +++ b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/domain/vo/WmsShippingDetailsVo.java @@ -0,0 +1,152 @@ +package org.dromara.wms.domain.vo; + +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.wms.domain.WmsShippingDetails; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + + + +/** + * 发货单明细视图对象 wms_shipping_details + * + * @author Yinq + * @date 2025-12-08 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = WmsShippingDetails.class) +public class WmsShippingDetailsVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 发货单明细ID + */ + @ExcelProperty(value = "发货单明细ID") + private Long shippingDetailsId; + + /** + * 发货单ID(逻辑外键) + */ + @ExcelProperty(value = "发货单ID", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "逻=辑外键") + private Long shippingBillId; + + /** + * 物料来源类型:1-ERP物料(base_material_info) 2-WMS物料(仓储物料) 3-手工录入 + */ + @ExcelProperty(value = "物料来源类型:1-ERP物料(base_material_info) 2-WMS物料(仓储物料) 3-手工录入") + private String materialSourceType; + + /** + * ERP物料ID(base_material_info.material_id) + */ + @ExcelProperty(value = "ERP物料ID", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "b=ase_material_info.material_id") + private Long erpMaterialId; + + /** + * WMS物料ID(仓储物料表ID,预留) + */ + @ExcelProperty(value = "WMS物料ID", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "仓=储物料表ID,预留") + private Long wmsMaterialId; + + /** + * 来源明细类型:如CONTRACT_DETAIL、PURCHASE_DETAIL等 + */ + @ExcelProperty(value = "来源明细类型:如CONTRACT_DETAIL、PURCHASE_DETAIL等") + private String sourceDetailType; + + /** + * 来源明细ID + */ + @ExcelProperty(value = "来源明细ID") + private Long sourceDetailId; + + /** + * 仓库ID + */ + @ExcelProperty(value = "仓库ID") + private Long warehouseId; + + /** + * 物料ID + */ + @ExcelProperty(value = "物料ID") + private Long materielId; + + /** + * 物料编码(冗余,方便导出) + */ + @ExcelProperty(value = "物料编码", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "冗=余,方便导出") + private String materialCode; + + /** + * 物料名称(冗余,方便导出) + */ + @ExcelProperty(value = "物料名称", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "冗=余,方便导出") + private String materialName; + + /** + * 物料规格 + */ + @ExcelProperty(value = "物料规格") + private String materielSpecification; + + /** + * 批次号 + */ + @ExcelProperty(value = "批次号") + private String batchNumber; + + /** + * 单价 + */ + @ExcelProperty(value = "单价") + private BigDecimal unitPrice; + + /** + * 发货数量 + */ + @ExcelProperty(value = "发货数量") + private BigDecimal shippingStockAmount; + + /** + * 单位ID + */ + @ExcelProperty(value = "单位ID") + private Long unitId; + + /** + * 计量单位名称(冗余,方便导出) + */ + @ExcelProperty(value = "计量单位名称", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "冗=余,方便导出") + private String unitName; + + /** + * 总价 + */ + @ExcelProperty(value = "总价") + private BigDecimal totalPrice; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/mapper/WmsShippingBillMapper.java b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/mapper/WmsShippingBillMapper.java new file mode 100644 index 00000000..c3ea07bc --- /dev/null +++ b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/mapper/WmsShippingBillMapper.java @@ -0,0 +1,128 @@ +package org.dromara.wms.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import org.apache.ibatis.annotations.Param; +import org.dromara.common.mybatis.annotation.DataColumn; +import org.dromara.common.mybatis.annotation.DataPermission; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.wms.domain.WmsShippingBill; +import org.dromara.wms.domain.vo.WmsShippingBillVo; + +import java.util.Collection; +import java.util.List; + +/** + * 发货单Mapper接口 + * + * @author Yinq + * @date 2025-12-08 + */ +public interface WmsShippingBillMapper extends BaseMapperPlus { + + /** + * 查询发货单列表 + * + * @param page 分页 + * @param queryWrapper 条件 + * @return 发货单集合 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "t.create_dept"), + @DataColumn(key = "userName", value = "t.create_by") + }) + Page selectCustomWmsShippingBillVoList(@Param("page") Page page, @Param(Constants.WRAPPER) MPJLambdaWrapper queryWrapper); + + /** + * 查询发货单列表 + * + * @param queryWrapper 条件 + * @return 发货单集合 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "t.create_dept"), + @DataColumn(key = "userName", value = "t.create_by") + }) + List selectCustomWmsShippingBillVoList(@Param(Constants.WRAPPER) MPJLambdaWrapper queryWrapper); + + /** + * 根据ID查询发货单详情 + * + * @param shippingBillId 主键ID + * @return 发货单对象 + */ + WmsShippingBillVo selectCustomWmsShippingBillVoById(@Param("shippingBillId") Long shippingBillId); + + /** + * 根据ID列表批量查询发货单 + * + * @param ids ID集合 + * @return 发货单集合 + */ + List selectCustomWmsShippingBillVoByIds(@Param("ids") Collection ids); + + /** + * 统计发货单记录数 + * + * @param queryWrapper 查询条件 + * @return 记录总数 + */ + Long countCustomWmsShippingBill(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 分页查询发货单(自定义条件) + * + * @param page 分页对象 + * @param queryWrapper 查询条件 + * @return 分页结果 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "t.create_dept"), + @DataColumn(key = "userName", value = "t.create_by") + }) + Page selectCustomWmsShippingBillVoPage(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 批量插入发货单 + * + * @param list 发货单对象集合 + * @return 影响行数 + */ + int batchInsertWmsShippingBill(@Param("list") List list); + + /** + * 批量更新发货单 + * + * @param list 发货单对象集合 + * @return 影响行数 + */ + int batchUpdateWmsShippingBill(@Param("list") List list); + + /** + * 根据自定义条件删除发货单 + * + * @param queryWrapper 删除条件 + * @return 影响行数 + */ + int deleteCustomWmsShippingBill(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 根据ID列表批量删除发货单 + * + * @param ids ID集合 + * @return 影响行数 + */ + int deleteCustomWmsShippingBillByIds(@Param("ids") Collection ids); + + /** + * 检查发货单是否存在 + * + * @param queryWrapper 查询条件 + * @return 是否存在 + */ + Boolean existsWmsShippingBill(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + +} diff --git a/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/mapper/WmsShippingDetailsMapper.java b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/mapper/WmsShippingDetailsMapper.java new file mode 100644 index 00000000..6959a676 --- /dev/null +++ b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/mapper/WmsShippingDetailsMapper.java @@ -0,0 +1,114 @@ +package org.dromara.wms.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import org.apache.ibatis.annotations.Param; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.wms.domain.WmsShippingDetails; +import org.dromara.wms.domain.vo.WmsShippingDetailsVo; + +import java.util.Collection; +import java.util.List; + +/** + * 发货单明细Mapper接口 + * + * @author Yinq + * @date 2025-12-08 + */ +public interface WmsShippingDetailsMapper extends BaseMapperPlus { + + /** + * 查询发货单明细列表 + * + * @param page 分页 + * @param queryWrapper 条件 + * @return 发货单明细集合 + */ + public Page selectCustomWmsShippingDetailsVoList(@Param("page") Page page, @Param(Constants.WRAPPER) MPJLambdaWrapper queryWrapper); + + /** + * 查询发货单明细列表 + * + * @param queryWrapper 条件 + * @return 发货单明细集合 + */ + public List selectCustomWmsShippingDetailsVoList(@Param(Constants.WRAPPER) MPJLambdaWrapper queryWrapper); + + /** + * 根据ID查询发货单明细详情 + * + * @param shippingDetailsId 主键ID + * @return 发货单明细对象 + */ + WmsShippingDetailsVo selectCustomWmsShippingDetailsVoById(@Param("shippingDetailsId") Long shippingDetailsId); + + /** + * 根据ID列表批量查询发货单明细 + * + * @param ids ID集合 + * @return 发货单明细集合 + */ + List selectCustomWmsShippingDetailsVoByIds(@Param("ids") Collection ids); + + /** + * 统计发货单明细记录数 + * + * @param queryWrapper 查询条件 + * @return 记录总数 + */ + Long countCustomWmsShippingDetails(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 分页查询发货单明细(自定义条件) + * + * @param page 分页对象 + * @param queryWrapper 查询条件 + * @return 分页结果 + */ + Page selectCustomWmsShippingDetailsVoPage(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 批量插入发货单明细 + * + * @param list 发货单明细对象集合 + * @return 影响行数 + */ + int batchInsertWmsShippingDetails(@Param("list") List list); + + /** + * 批量更新发货单明细 + * + * @param list 发货单明细对象集合 + * @return 影响行数 + */ + int batchUpdateWmsShippingDetails(@Param("list") List list); + + /** + * 根据自定义条件删除发货单明细 + * + * @param queryWrapper 删除条件 + * @return 影响行数 + */ + int deleteCustomWmsShippingDetails(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 根据ID列表批量删除发货单明细 + * + * @param ids ID集合 + * @return 影响行数 + */ + int deleteCustomWmsShippingDetailsByIds(@Param("ids") Collection ids); + + /** + * 检查发货单明细是否存在 + * + * @param queryWrapper 查询条件 + * @return 是否存在 + */ + Boolean existsWmsShippingDetails(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + +} diff --git a/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/service/IWmsShippingBillService.java b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/service/IWmsShippingBillService.java new file mode 100644 index 00000000..b087a551 --- /dev/null +++ b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/service/IWmsShippingBillService.java @@ -0,0 +1,76 @@ +package org.dromara.wms.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.wms.domain.bo.WmsShippingBillBo; +import org.dromara.wms.domain.vo.WmsShippingBillVo; + +import java.util.Collection; +import java.util.List; + +/** + * 发货单Service接口 + * + * @author Yinq + * @date 2025-12-08 + */ +public interface IWmsShippingBillService { + + /** + * 查询发货单 + * + * @param shippingBillId 主键 + * @return 发货单 + */ + WmsShippingBillVo queryById(Long shippingBillId); + + /** + * 分页查询发货单列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 发货单分页列表 + */ + TableDataInfo queryPageList(WmsShippingBillBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的发货单列表 + * + * @param bo 查询条件 + * @return 发货单列表 + */ + List queryList(WmsShippingBillBo bo); + + /** + * 新增发货单 + * + * @param bo 发货单 + * @return 是否新增成功 + */ + Boolean insertByBo(WmsShippingBillBo bo); + + /** + * 修改发货单 + * + * @param bo 发货单 + * @return 是否修改成功 + */ + Boolean updateByBo(WmsShippingBillBo bo); + + /** + * 校验并批量删除发货单信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 提交发货单并发起流程 + * + * @param bo 发货单 + * @return 发货单VO + */ + WmsShippingBillVo shippingBillSubmitAndFlowStart(WmsShippingBillBo bo); +} diff --git a/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/service/IWmsShippingDetailsService.java b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/service/IWmsShippingDetailsService.java new file mode 100644 index 00000000..290023bd --- /dev/null +++ b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/service/IWmsShippingDetailsService.java @@ -0,0 +1,68 @@ +package org.dromara.wms.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.wms.domain.bo.WmsShippingDetailsBo; +import org.dromara.wms.domain.vo.WmsShippingDetailsVo; + +import java.util.Collection; +import java.util.List; + +/** + * 发货单明细Service接口 + * + * @author Yinq + * @date 2025-12-08 + */ +public interface IWmsShippingDetailsService { + + /** + * 查询发货单明细 + * + * @param shippingDetailsId 主键 + * @return 发货单明细 + */ + WmsShippingDetailsVo queryById(Long shippingDetailsId); + + /** + * 分页查询发货单明细列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 发货单明细分页列表 + */ + TableDataInfo queryPageList(WmsShippingDetailsBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的发货单明细列表 + * + * @param bo 查询条件 + * @return 发货单明细列表 + */ + List queryList(WmsShippingDetailsBo bo); + + /** + * 新增发货单明细 + * + * @param bo 发货单明细 + * @return 是否新增成功 + */ + Boolean insertByBo(WmsShippingDetailsBo bo); + + /** + * 修改发货单明细 + * + * @param bo 发货单明细 + * @return 是否修改成功 + */ + Boolean updateByBo(WmsShippingDetailsBo bo); + + /** + * 校验并批量删除发货单明细信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/service/impl/WmsShippingBillServiceImpl.java b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/service/impl/WmsShippingBillServiceImpl.java new file mode 100644 index 00000000..55b244cd --- /dev/null +++ b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/service/impl/WmsShippingBillServiceImpl.java @@ -0,0 +1,339 @@ +package org.dromara.wms.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.map.MapUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yulichang.toolkit.JoinWrappers; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.enums.BusinessStatusEnum; +import org.dromara.common.core.enums.OAStatusEnum; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.wms.domain.WmsShippingBill; +import org.dromara.wms.domain.WmsShippingDetails; +import org.dromara.wms.domain.bo.WmsShippingBillBo; +import org.dromara.wms.domain.vo.WmsShippingBillVo; +import org.dromara.wms.domain.vo.WmsShippingDetailsVo; +import org.dromara.wms.mapper.WmsShippingBillMapper; +import org.dromara.wms.mapper.WmsShippingDetailsMapper; +import org.dromara.wms.service.IWmsShippingBillService; +import org.dromara.workflow.api.RemoteWorkflowService; +import org.dromara.workflow.api.domain.RemoteStartProcess; +import org.dromara.workflow.api.event.ProcessEvent; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 发货单Service业务层处理 + * + * @author Yinq + * @date 2025-12-08 + */ +@RequiredArgsConstructor +@Service +@Slf4j +public class WmsShippingBillServiceImpl implements IWmsShippingBillService { + + private final WmsShippingBillMapper baseMapper; + private final WmsShippingDetailsMapper detailsMapper; + + @DubboReference(timeout = 30000) + private RemoteWorkflowService remoteWorkflowService; + + /** + * 查询发货单(包含明细列表) + * + * @param shippingBillId 主键 + * @return 发货单 + */ + @Override + public WmsShippingBillVo queryById(Long shippingBillId) { + // 使用 Mapper.xml 中自定义 SQL(联查合同表)获取发货单及 SAP 订单号 + WmsShippingBillVo vo = baseMapper.selectCustomWmsShippingBillVoById(shippingBillId); + if (vo != null) { + // 查询当前发货单下的明细列表 + LambdaQueryWrapper detailsLqw = Wrappers.lambdaQuery() + .eq(WmsShippingDetails::getDelFlag, "0") + .eq(WmsShippingDetails::getShippingBillId, shippingBillId); + List detailsVoList = detailsMapper.selectVoList(detailsLqw); + vo.setItemsVo(detailsVoList); + } + return vo; + } + + /** + * 分页查询发货单列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 发货单分页列表 + */ + @Override + public TableDataInfo queryPageList(WmsShippingBillBo bo, PageQuery pageQuery) { + MPJLambdaWrapper lqw = buildQueryWrapper(bo); + // 使用 Mapper.xml 中分页自定义 SQL 接口(selectCustomWmsShippingBillVoPage),联查合同表获取 SAP 订单号 + Page page = baseMapper.selectCustomWmsShippingBillVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(page); + } + + /** + * 查询符合条件的发货单列表 + * + * @param bo 查询条件 + * @return 发货单列表 + */ + @Override + public List queryList(WmsShippingBillBo bo) { + MPJLambdaWrapper lqw = buildQueryWrapper(bo); + // 使用 Mapper.xml 中自定义 SQL(联查合同表获取 SAP 订单号) + return baseMapper.selectCustomWmsShippingBillVoList(lqw); + } + + private MPJLambdaWrapper buildQueryWrapper(WmsShippingBillBo bo) { + Map params = bo.getParams(); + MPJLambdaWrapper lqw = JoinWrappers.lambda(WmsShippingBill.class) + .selectAll(WmsShippingBill.class) + .eq(WmsShippingBill::getDelFlag, "0") + .eq(StringUtils.isNotBlank(bo.getShippingCode()), WmsShippingBill::getShippingCode, bo.getShippingCode()) + .eq(StringUtils.isNotBlank(bo.getShippingType()), WmsShippingBill::getShippingType, bo.getShippingType()) + .eq(StringUtils.isNotBlank(bo.getShippingMode()), WmsShippingBill::getShippingMode, bo.getShippingMode()) + .eq(StringUtils.isNotBlank(bo.getBindType()), WmsShippingBill::getBindType, bo.getBindType()) + .eq(bo.getProjectId() != null, WmsShippingBill::getProjectId, bo.getProjectId()) + .eq(StringUtils.isNotBlank(bo.getProjectCode()), WmsShippingBill::getProjectCode, bo.getProjectCode()) + .like(StringUtils.isNotBlank(bo.getProjectName()), WmsShippingBill::getProjectName, bo.getProjectName()) + .eq(bo.getCustomerId() != null, WmsShippingBill::getCustomerId, bo.getCustomerId()) + .like(StringUtils.isNotBlank(bo.getCustomerName()), WmsShippingBill::getCustomerName, bo.getCustomerName()) + .eq(StringUtils.isNotBlank(bo.getShippingAddress()), WmsShippingBill::getShippingAddress, bo.getShippingAddress()) + .eq(StringUtils.isNotBlank(bo.getInventoryAmount()), WmsShippingBill::getInventoryAmount, bo.getInventoryAmount()) + .eq(StringUtils.isNotBlank(bo.getSourceBillType()), WmsShippingBill::getSourceBillType, bo.getSourceBillType()) + .eq(bo.getSourceBillId() != null, WmsShippingBill::getSourceBillId, bo.getSourceBillId()) + .eq(StringUtils.isNotBlank(bo.getSourceBillCode()), WmsShippingBill::getSourceBillCode, bo.getSourceBillCode()) + .eq(bo.getContractId() != null, WmsShippingBill::getContractId, bo.getContractId()) + .eq(StringUtils.isNotBlank(bo.getContractCode()), WmsShippingBill::getContractCode, bo.getContractCode()) + .like(StringUtils.isNotBlank(bo.getContractName()), WmsShippingBill::getContractName, bo.getContractName()) + .eq(StringUtils.isNotBlank(bo.getSupplier()), WmsShippingBill::getSupplier, bo.getSupplier()) + .eq(bo.getSupplierId() != null, WmsShippingBill::getSupplierId, bo.getSupplierId()) + .eq(StringUtils.isNotBlank(bo.getContactUser()), WmsShippingBill::getContactUser, bo.getContactUser()) + .eq(StringUtils.isNotBlank(bo.getContactNumber()), WmsShippingBill::getContactNumber, bo.getContactNumber()) + .like(StringUtils.isNotBlank(bo.getReceiverName()), WmsShippingBill::getReceiverName, bo.getReceiverName()) + .eq(StringUtils.isNotBlank(bo.getReceiverPhone()), WmsShippingBill::getReceiverPhone, bo.getReceiverPhone()) + .eq(StringUtils.isNotBlank(bo.getLogisticsCompany()), WmsShippingBill::getLogisticsCompany, bo.getLogisticsCompany()) + .eq(StringUtils.isNotBlank(bo.getTrackingNo()), WmsShippingBill::getTrackingNo, bo.getTrackingNo()) + .eq(StringUtils.isNotBlank(bo.getLogisticsPhone()), WmsShippingBill::getLogisticsPhone, bo.getLogisticsPhone()) + .eq(StringUtils.isNotBlank(bo.getDirections()), WmsShippingBill::getDirections, bo.getDirections()) + .eq(bo.getPlanArrivalTime() != null, WmsShippingBill::getPlanArrivalTime, bo.getPlanArrivalTime()) + .eq(bo.getShippingTime() != null, WmsShippingBill::getShippingTime, bo.getShippingTime()) + .eq(bo.getReceivedTime() != null, WmsShippingBill::getReceivedTime, bo.getReceivedTime()) + .eq(bo.getCompletedTime() != null, WmsShippingBill::getCompletedTime, bo.getCompletedTime()) + .eq(StringUtils.isNotBlank(bo.getOutStockBillStatus()), WmsShippingBill::getOutStockBillStatus, bo.getOutStockBillStatus()) + .eq(StringUtils.isNotBlank(bo.getFlowStatus()), WmsShippingBill::getFlowStatus, bo.getFlowStatus()) + .eq(StringUtils.isNotBlank(bo.getShippingStatus()), WmsShippingBill::getShippingStatus, bo.getShippingStatus()) + .eq(bo.getWarehouseId() != null, WmsShippingBill::getWarehouseId, bo.getWarehouseId()) + .like(StringUtils.isNotBlank(bo.getWarehouseName()), WmsShippingBill::getWarehouseName, bo.getWarehouseName()) +; + return lqw; + } + + /** + * 新增发货单(包含明细列表) + * + * @param bo 发货单 + * @return 是否新增成功 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean insertByBo(WmsShippingBillBo bo) { + WmsShippingBill add = MapstructUtils.convert(bo, WmsShippingBill.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setShippingBillId(add.getShippingBillId()); + // 同步保存明细列表 + List detailsList = bo.getDetailsList(); + if (CollUtil.isNotEmpty(detailsList)) { + for (WmsShippingDetails detail : detailsList) { + detail.setShippingBillId(add.getShippingBillId()); + } + detailsMapper.insertBatch(detailsList); + } + } + return flag; + } + + /** + * 修改发货单(包含明细列表的增删改) + * + * @param bo 发货单 + * @return 是否修改成功 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean updateByBo(WmsShippingBillBo bo) { + WmsShippingBill update = MapstructUtils.convert(bo, WmsShippingBill.class); + validEntityBeforeSave(update); + boolean flag = baseMapper.updateById(update) > 0; + + // 处理明细列表的增删改 + List detailsList = bo.getDetailsList(); + Long shippingBillId = bo.getShippingBillId(); + + if (detailsList != null) { + // 1. 获取前端提交的明细ID集合 + List submittedIds = detailsList.stream() + .filter(d -> d.getShippingDetailsId() != null) + .map(WmsShippingDetails::getShippingDetailsId) + .collect(Collectors.toList()); + + // 2. 删除前端未提交的旧明细(即数据库中存在但前端不再提交的记录) + if (CollUtil.isNotEmpty(submittedIds)) { + detailsMapper.delete(Wrappers.lambdaUpdate() + .eq(WmsShippingDetails::getShippingBillId, shippingBillId) + .notIn(WmsShippingDetails::getShippingDetailsId, submittedIds)); + } else { + // 如果前端提交的明细都没有ID(全为新增),则删除该发货单下所有旧明细 + detailsMapper.delete(Wrappers.lambdaUpdate() + .eq(WmsShippingDetails::getShippingBillId, shippingBillId)); + } + + // 3. 新增或更新明细 + for (WmsShippingDetails detail : detailsList) { + detail.setShippingBillId(shippingBillId); + if (detail.getShippingDetailsId() != null) { + detailsMapper.updateById(detail); + } else { + detailsMapper.insert(detail); + } + } + } + return flag; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(WmsShippingBill entity) { + // 发货单号唯一性校验(新增时校验) + if (entity.getShippingBillId() == null && StringUtils.isNotBlank(entity.getShippingCode())) { + Long count = baseMapper.selectCount(Wrappers.lambdaQuery() + .eq(WmsShippingBill::getShippingCode, entity.getShippingCode()) + .eq(WmsShippingBill::getDelFlag, "0")); + if (count > 0) { + throw new ServiceException("发货单号【" + entity.getShippingCode() + "】已存在"); + } + } + // 必须绑定项目或合同 + if (entity.getProjectId() == null && entity.getContractId() == null) { + throw new ServiceException("发货单必须绑定项目或合同"); + } + } + + /** + * 校验并批量删除发货单信息(同时删除明细) + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + //TODO 做一些业务上的校验,判断是否需要校验 + } + // 先删除子表明细 + detailsMapper.delete(Wrappers.lambdaUpdate() + .in(WmsShippingDetails::getShippingBillId, ids)); + // 再删除主表 + return baseMapper.deleteByIds(ids) > 0; + } + + /** + * 提交发货单并发起流程 + * + * @param bo 发货单 + * @return 发货单VO + */ + @Override + @Transactional(rollbackFor = Exception.class) + public WmsShippingBillVo shippingBillSubmitAndFlowStart(WmsShippingBillBo bo) { + WmsShippingBill add = MapstructUtils.convert(bo, WmsShippingBill.class); + validEntityBeforeSave(add); + if (StringUtils.isNull(bo.getShippingBillId())) { + this.insertByBo(bo); + } else { + this.updateByBo(bo); + } + // 后端发起需要忽略权限 + bo.getVariables().put("ignore", true); + RemoteStartProcess startProcess = new RemoteStartProcess(); + startProcess.setBusinessId(bo.getShippingBillId().toString()); + startProcess.setFlowCode(bo.getFlowCode()); + startProcess.setVariables(bo.getVariables()); + startProcess.setBizExt(bo.getBizExt()); + bo.getBizExt().setBusinessId(startProcess.getBusinessId()); + boolean flagOne = remoteWorkflowService.startCompleteTask(startProcess); + if (!flagOne) { + throw new ServiceException("流程发起异常"); + } + return MapstructUtils.convert(add, WmsShippingBillVo.class); + } + + /** + * 发货单流程监听(草稿、撤销、退回、作废、终止、已完成等) + * 监听发货单流程编码为 WMSSP 的流程事件 + * + * @param processEvent 流程事件参数 + */ + @EventListener(condition = "#processEvent.flowCode == 'WMSSP'") + public void processHandler(ProcessEvent processEvent) { + TenantHelper.dynamic(processEvent.getTenantId(), () -> { + log.info("发货单流程事件: {}", processEvent.toString()); + WmsShippingBill shippingBill = baseMapper.selectById(Convert.toLong(processEvent.getBusinessId())); + if (shippingBill == null) { + log.warn("发货单不存在,businessId: {}", processEvent.getBusinessId()); + return; + } + // 更新流程状态 + shippingBill.setFlowStatus(processEvent.getStatus()); + Map params = processEvent.getParams(); + if (MapUtil.isNotEmpty(params)) { + // 可获取办理人等信息 + String handler = Convert.toStr(params.get("handler")); + } + // 根据流程状态更新业务状态 + if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.WAITING.getStatus())) { + // 审批中 + shippingBill.setOutStockBillStatus(OAStatusEnum.APPROVING.getStatus()); + } else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.FINISH.getStatus())) { + // 审批完成 → 业务状态变为可用/待发货 + shippingBill.setOutStockBillStatus(OAStatusEnum.COMPLETED.getStatus()); + } else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.INVALID.getStatus()) + || Objects.equals(processEvent.getStatus(), BusinessStatusEnum.TERMINATION.getStatus())) { + // 作废或终止 → 业务状态变为作废 + shippingBill.setOutStockBillStatus(OAStatusEnum.INVALID.getStatus()); + } else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.BACK.getStatus()) + || Objects.equals(processEvent.getStatus(), BusinessStatusEnum.CANCEL.getStatus())) { + // 退回或撤销 → 业务状态变为草稿 + shippingBill.setOutStockBillStatus(OAStatusEnum.DRAFT.getStatus()); + } + baseMapper.updateById(shippingBill); + }); + } +} diff --git a/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/service/impl/WmsShippingDetailsServiceImpl.java b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/service/impl/WmsShippingDetailsServiceImpl.java new file mode 100644 index 00000000..985dda74 --- /dev/null +++ b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/service/impl/WmsShippingDetailsServiceImpl.java @@ -0,0 +1,148 @@ +package org.dromara.wms.service.impl; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yulichang.toolkit.JoinWrappers; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.wms.domain.WmsShippingDetails; +import org.dromara.wms.domain.bo.WmsShippingDetailsBo; +import org.dromara.wms.domain.vo.WmsShippingDetailsVo; +import org.dromara.wms.mapper.WmsShippingDetailsMapper; +import org.dromara.wms.service.IWmsShippingDetailsService; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 发货单明细Service业务层处理 + * + * @author Yinq + * @date 2025-12-08 + */ +@RequiredArgsConstructor +@Service +public class WmsShippingDetailsServiceImpl implements IWmsShippingDetailsService { + + private final WmsShippingDetailsMapper baseMapper; + + /** + * 查询发货单明细 + * + * @param shippingDetailsId 主键 + * @return 发货单明细 + */ + @Override + public WmsShippingDetailsVo queryById(Long shippingDetailsId){ + return baseMapper.selectVoById(shippingDetailsId); + } + + /** + * 分页查询发货单明细列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 发货单明细分页列表 + */ + @Override + public TableDataInfo queryPageList(WmsShippingDetailsBo bo, PageQuery pageQuery) { + MPJLambdaWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的发货单明细列表 + * + * @param bo 查询条件 + * @return 发货单明细列表 + */ + @Override + public List queryList(WmsShippingDetailsBo bo) { + MPJLambdaWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private MPJLambdaWrapper buildQueryWrapper(WmsShippingDetailsBo bo) { + Map params = bo.getParams(); + MPJLambdaWrapper lqw = JoinWrappers.lambda(WmsShippingDetails.class) + .selectAll(WmsShippingDetails.class) + .eq(WmsShippingDetails::getDelFlag, "0") + .eq(bo.getShippingBillId() != null, WmsShippingDetails::getShippingBillId, bo.getShippingBillId()) + .eq(StringUtils.isNotBlank(bo.getMaterialSourceType()), WmsShippingDetails::getMaterialSourceType, bo.getMaterialSourceType()) + .eq(bo.getErpMaterialId() != null, WmsShippingDetails::getErpMaterialId, bo.getErpMaterialId()) + .eq(bo.getWmsMaterialId() != null, WmsShippingDetails::getWmsMaterialId, bo.getWmsMaterialId()) + .eq(StringUtils.isNotBlank(bo.getSourceDetailType()), WmsShippingDetails::getSourceDetailType, bo.getSourceDetailType()) + .eq(bo.getSourceDetailId() != null, WmsShippingDetails::getSourceDetailId, bo.getSourceDetailId()) + .eq(bo.getWarehouseId() != null, WmsShippingDetails::getWarehouseId, bo.getWarehouseId()) + .eq(bo.getMaterielId() != null, WmsShippingDetails::getMaterielId, bo.getMaterielId()) + .eq(StringUtils.isNotBlank(bo.getMaterialCode()), WmsShippingDetails::getMaterialCode, bo.getMaterialCode()) + .like(StringUtils.isNotBlank(bo.getMaterialName()), WmsShippingDetails::getMaterialName, bo.getMaterialName()) + .eq(StringUtils.isNotBlank(bo.getMaterielSpecification()), WmsShippingDetails::getMaterielSpecification, bo.getMaterielSpecification()) + .eq(StringUtils.isNotBlank(bo.getBatchNumber()), WmsShippingDetails::getBatchNumber, bo.getBatchNumber()) + .eq(bo.getUnitPrice() != null, WmsShippingDetails::getUnitPrice, bo.getUnitPrice()) + .eq(bo.getShippingStockAmount() != null, WmsShippingDetails::getShippingStockAmount, bo.getShippingStockAmount()) + .eq(bo.getUnitId() != null, WmsShippingDetails::getUnitId, bo.getUnitId()) + .like(StringUtils.isNotBlank(bo.getUnitName()), WmsShippingDetails::getUnitName, bo.getUnitName()) + .eq(bo.getTotalPrice() != null, WmsShippingDetails::getTotalPrice, bo.getTotalPrice()) +; + return lqw; + } + + /** + * 新增发货单明细 + * + * @param bo 发货单明细 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(WmsShippingDetailsBo bo) { + WmsShippingDetails add = MapstructUtils.convert(bo, WmsShippingDetails.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setShippingDetailsId(add.getShippingDetailsId()); + } + return flag; + } + + /** + * 修改发货单明细 + * + * @param bo 发货单明细 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(WmsShippingDetailsBo bo) { + WmsShippingDetails update = MapstructUtils.convert(bo, WmsShippingDetails.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(WmsShippingDetails entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除发货单明细信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-wms/src/main/resources/mapper/wms/WmsShippingBillMapper.xml b/ruoyi-modules/ruoyi-wms/src/main/resources/mapper/wms/WmsShippingBillMapper.xml new file mode 100644 index 00000000..68879c81 --- /dev/null +++ b/ruoyi-modules/ruoyi-wms/src/main/resources/mapper/wms/WmsShippingBillMapper.xml @@ -0,0 +1,400 @@ + + + + + + + + + + + + + + + + + + + + + + + insert into wms_shipping_bill( + tenant_id, + + shipping_code, + + shipping_type, + + shipping_mode, + + bind_type, + + project_id, + + project_code, + + project_name, + + customer_id, + + customer_name, + + shipping_address, + + inventory_amount, + + source_bill_type, + + source_bill_id, + + source_bill_code, + + contract_id, + + contract_code, + + contract_name, + + supplier, + + supplier_id, + + contact_user, + + contact_number, + + receiver_name, + + receiver_phone, + + logistics_company, + + tracking_no, + + logistics_phone, + + directions, + + plan_arrival_time, + + shipping_time, + + received_time, + + completed_time, + + out_stock_bill_status, + + flow_status, + + shipping_status, + + warehouse_id, + + warehouse_name, + + remark, + + del_flag, + + create_dept, + + create_by, + + create_time, + + update_by, + + update_time + + ) + values + + ( + #{item.tenantId}, + + #{item.shippingCode}, + + #{item.shippingType}, + + #{item.shippingMode}, + + #{item.bindType}, + + #{item.projectId}, + + #{item.projectCode}, + + #{item.projectName}, + + #{item.customerId}, + + #{item.customerName}, + + #{item.shippingAddress}, + + #{item.inventoryAmount}, + + #{item.sourceBillType}, + + #{item.sourceBillId}, + + #{item.sourceBillCode}, + + #{item.contractId}, + + #{item.contractCode}, + + #{item.contractName}, + + #{item.supplier}, + + #{item.supplierId}, + + #{item.contactUser}, + + #{item.contactNumber}, + + #{item.receiverName}, + + #{item.receiverPhone}, + + #{item.logisticsCompany}, + + #{item.trackingNo}, + + #{item.logisticsPhone}, + + #{item.directions}, + + #{item.planArrivalTime}, + + #{item.shippingTime}, + + #{item.receivedTime}, + + #{item.completedTime}, + + #{item.outStockBillStatus}, + + #{item.flowStatus}, + + #{item.shippingStatus}, + + #{item.warehouseId}, + + #{item.warehouseName}, + + #{item.remark}, + + #{item.delFlag}, + + #{item.createDept}, + + #{item.createBy}, + + #{item.createTime}, + + #{item.updateBy}, + + #{item.updateTime} + + ) + + + + + + + update wms_shipping_bill t + + + t.tenant_id = #{item.tenantId}, + + + t.shipping_code = #{item.shippingCode}, + + + t.shipping_type = #{item.shippingType}, + + + t.shipping_mode = #{item.shippingMode}, + + + t.bind_type = #{item.bindType}, + + + t.project_id = #{item.projectId}, + + + t.project_code = #{item.projectCode}, + + + t.project_name = #{item.projectName}, + + + t.customer_id = #{item.customerId}, + + + t.customer_name = #{item.customerName}, + + + t.shipping_address = #{item.shippingAddress}, + + + t.inventory_amount = #{item.inventoryAmount}, + + + t.source_bill_type = #{item.sourceBillType}, + + + t.source_bill_id = #{item.sourceBillId}, + + + t.source_bill_code = #{item.sourceBillCode}, + + + t.contract_id = #{item.contractId}, + + + t.contract_code = #{item.contractCode}, + + + t.contract_name = #{item.contractName}, + + + t.supplier = #{item.supplier}, + + + t.supplier_id = #{item.supplierId}, + + + t.contact_user = #{item.contactUser}, + + + t.contact_number = #{item.contactNumber}, + + + t.receiver_name = #{item.receiverName}, + + + t.receiver_phone = #{item.receiverPhone}, + + + t.logistics_company = #{item.logisticsCompany}, + + + t.tracking_no = #{item.trackingNo}, + + + t.logistics_phone = #{item.logisticsPhone}, + + + t.directions = #{item.directions}, + + + t.plan_arrival_time = #{item.planArrivalTime}, + + + t.shipping_time = #{item.shippingTime}, + + + t.received_time = #{item.receivedTime}, + + + t.completed_time = #{item.completedTime}, + + + t.out_stock_bill_status = #{item.outStockBillStatus}, + + + t.flow_status = #{item.flowStatus}, + + + t.shipping_status = #{item.shippingStatus}, + + + t.warehouse_id = #{item.warehouseId}, + + + t.warehouse_name = #{item.warehouseName}, + + + t.remark = #{item.remark}, + + + t.del_flag = #{item.delFlag}, + + + t.create_dept = #{item.createDept}, + + + t.create_by = #{item.createBy}, + + + t.create_time = #{item.createTime}, + + + t.update_by = #{item.updateBy}, + + + t.update_time = #{item.updateTime} + + + where t.shipping_bill_id = #{item.shippingBillId} + + + + + + delete from wms_shipping_bill t + ${ew.getCustomSqlSegment} + + + + + delete from wms_shipping_bill t + where t.shipping_bill_id in + + #{id} + + + + + + + + diff --git a/ruoyi-modules/ruoyi-wms/src/main/resources/mapper/wms/WmsShippingDetailsMapper.xml b/ruoyi-modules/ruoyi-wms/src/main/resources/mapper/wms/WmsShippingDetailsMapper.xml new file mode 100644 index 00000000..f766a73d --- /dev/null +++ b/ruoyi-modules/ruoyi-wms/src/main/resources/mapper/wms/WmsShippingDetailsMapper.xml @@ -0,0 +1,262 @@ + + + + + + + + + + + + + + + + + + + + + + + insert into wms_shipping_details( + tenant_id, + + shipping_bill_id, + + material_source_type, + + erp_material_id, + + wms_material_id, + + source_detail_type, + + source_detail_id, + + warehouse_id, + + materiel_id, + + material_code, + + material_name, + + materiel_specification, + + batch_number, + + unit_price, + + shipping_stock_amount, + + unit_id, + + unit_name, + + total_price, + + remark, + + del_flag, + + create_dept, + + create_by, + + create_time, + + update_by, + + update_time + + ) + values + + ( + #{item.tenantId}, + + #{item.shippingBillId}, + + #{item.materialSourceType}, + + #{item.erpMaterialId}, + + #{item.wmsMaterialId}, + + #{item.sourceDetailType}, + + #{item.sourceDetailId}, + + #{item.warehouseId}, + + #{item.materielId}, + + #{item.materialCode}, + + #{item.materialName}, + + #{item.materielSpecification}, + + #{item.batchNumber}, + + #{item.unitPrice}, + + #{item.shippingStockAmount}, + + #{item.unitId}, + + #{item.unitName}, + + #{item.totalPrice}, + + #{item.remark}, + + #{item.delFlag}, + + #{item.createDept}, + + #{item.createBy}, + + #{item.createTime}, + + #{item.updateBy}, + + #{item.updateTime} + + ) + + + + + + + update wms_shipping_details t + + + t.tenant_id = #{item.tenantId}, + + + t.shipping_bill_id = #{item.shippingBillId}, + + + t.material_source_type = #{item.materialSourceType}, + + + t.erp_material_id = #{item.erpMaterialId}, + + + t.wms_material_id = #{item.wmsMaterialId}, + + + t.source_detail_type = #{item.sourceDetailType}, + + + t.source_detail_id = #{item.sourceDetailId}, + + + t.warehouse_id = #{item.warehouseId}, + + + t.materiel_id = #{item.materielId}, + + + t.material_code = #{item.materialCode}, + + + t.material_name = #{item.materialName}, + + + t.materiel_specification = #{item.materielSpecification}, + + + t.batch_number = #{item.batchNumber}, + + + t.unit_price = #{item.unitPrice}, + + + t.shipping_stock_amount = #{item.shippingStockAmount}, + + + t.unit_id = #{item.unitId}, + + + t.unit_name = #{item.unitName}, + + + t.total_price = #{item.totalPrice}, + + + t.remark = #{item.remark}, + + + t.del_flag = #{item.delFlag}, + + + t.create_dept = #{item.createDept}, + + + t.create_by = #{item.createBy}, + + + t.create_time = #{item.createTime}, + + + t.update_by = #{item.updateBy}, + + + t.update_time = #{item.updateTime} + + + where t.shipping_details_id = #{item.shippingDetailsId} + + + + + + delete from wms_shipping_details t + ${ew.getCustomSqlSegment} + + + + + delete from wms_shipping_details t + where t.shipping_details_id in + + #{id} + + + + + + + +