From 77775b9f3d7179f251ce85421fb9a21d106f1446 Mon Sep 17 00:00:00 2001
From: yaowanxin <3588231647@qq.com>
Date: 星期二, 06 一月 2026 17:56:35 +0800
Subject: [PATCH] 协同办公-发货审批页面,开发接口。优化添加发货信息接口,勾连发货审批。优化销售产品查询接口,多表联查数据。添加发货车牌号、发货日期、审批状态、返回数据。

---
 src/main/java/com/ruoyi/sales/service/ShipmentApprovalService.java            |   13 +
 src/main/resources/mapper/sales/SalesLedgerMapper.xml                         |    2 
 src/main/java/com/ruoyi/approve/vo/ApproveProcessVO.java                      |   31 ++
 src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java                    |   25 ++
 src/main/java/com/ruoyi/sales/service/impl/ShipmentApprovalServiceImpl.java   |   32 ++
 src/main/java/com/ruoyi/sales/pojo/SalesLedger.java                           |    4 
 src/main/java/com/ruoyi/sales/pojo/ShippingInfo.java                          |    6 
 src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java      |   77 +++++++
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java |    8 
 src/main/resources/mapper/sales/SalesLedgerProductMapper.xml                  |   25 ++
 src/main/java/com/ruoyi/sales/mapper/ShipmentApprovalMapper.java              |   16 +
 src/main/java/com/ruoyi/sales/mapper/SalesLedgerProductMapper.java            |    4 
 src/main/java/com/ruoyi/sales/pojo/ShipmentApproval.java                      |  352 ++++++++++++++++++++++++++++++++
 src/main/java/com/ruoyi/sales/controller/ShippingInfoController.java          |   35 +++
 src/main/resources/mapper/sales/ShipmentApprovalMapper.xml                    |   24 ++
 15 files changed, 641 insertions(+), 13 deletions(-)

diff --git a/src/main/java/com/ruoyi/approve/vo/ApproveProcessVO.java b/src/main/java/com/ruoyi/approve/vo/ApproveProcessVO.java
index 1fb353e..5ad4419 100644
--- a/src/main/java/com/ruoyi/approve/vo/ApproveProcessVO.java
+++ b/src/main/java/com/ruoyi/approve/vo/ApproveProcessVO.java
@@ -1,6 +1,8 @@
 package com.ruoyi.approve.vo;
 
+import com.ruoyi.framework.aspectj.lang.annotation.Excel;
 import com.ruoyi.sales.pojo.CommonFile;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import javax.validation.constraints.NotBlank;
@@ -8,22 +10,37 @@
 
 @Data
 public class ApproveProcessVO {
-
+    /**
+     * 涓存椂鏂囦欢id鍒楄〃
+     */
     private List<String> tempFileIds;
-
+    /**
+     * 瀹℃壒娴佺▼id
+     */
     private Long id;
 
-
+    private String approveId;
+    /**
+     * 瀹℃壒閮ㄩ棬id
+     */
     private Long approveDeptId;
-
+    /**
+     * 瀹℃壒鏃堕棿
+     */
     private String approveTime;
-
+    /**
+     * 鐢宠浜篿d
+     */
     // 鐢宠浜�
     private Long approveUser;
-
+    /**
+     * 瀹℃壒浜篿d鍒楄〃
+     */
     // 瀹℃壒浜�
     private String approveUserIds;
-
+    /**
+     * 瀹℃壒鐞嗙敱
+     */
     private String approveReason;
 
     /**
diff --git a/src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java b/src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java
new file mode 100644
index 0000000..047cb37
--- /dev/null
+++ b/src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java
@@ -0,0 +1,77 @@
+package com.ruoyi.sales.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.sales.mapper.ShipmentApprovalMapper;
+import com.ruoyi.sales.mapper.ShippingInfoMapper;
+import com.ruoyi.sales.pojo.SalesLedgerProduct;
+import com.ruoyi.sales.pojo.ShipmentApproval;
+import com.ruoyi.sales.pojo.ShippingInfo;
+import com.ruoyi.sales.service.ISalesLedgerProductService;
+import com.ruoyi.sales.service.ShipmentApprovalService;
+import com.ruoyi.sales.service.ShippingInfoService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+@RestController
+@RequestMapping("/shipmentApproval")
+@Api(tags = "鍙戣揣瀹℃壒绠$悊")
+public class ShipmentApprovalController extends BaseController {
+
+    @Autowired
+    private ShipmentApprovalService shipmentApprovalService;
+    @Autowired
+    private ShipmentApprovalMapper shipmentApprovalMapper;
+
+    @Autowired
+    private ISalesLedgerProductService salesLedgerProductService;
+
+    @GetMapping("/listPage")
+    @ApiOperation("鍙戣揣瀹℃壒鍒楄〃")
+    public AjaxResult listPage(Page page, ShipmentApproval req) {
+        IPage<ShipmentApproval> listPage = shipmentApprovalService.listPage(page,req);
+        return AjaxResult.success(listPage);
+    }
+
+    @PostMapping("/update")
+    @ApiOperation("鍙戣揣瀹℃壒,鏇存柊鍙戣揣瀹℃壒鐘舵��")
+    @Transactional(rollbackFor = Exception.class)
+    public AjaxResult update(@RequestBody ShipmentApproval req) {
+        ShipmentApproval shipmentApproval = shipmentApprovalMapper.selectById(req.getId());
+        if (shipmentApproval == null) {
+            return AjaxResult.error("鍙戣揣瀹℃壒涓嶅瓨鍦�");
+        }
+
+        shipmentApproval.setApproveStatus(req.getApproveStatus());
+        boolean update = shipmentApprovalService.updateById(shipmentApproval);
+        if(update){
+            SalesLedgerProduct salesLedgerProduct = salesLedgerProductService.getById(shipmentApproval.getSalesLedgerProductId());
+            salesLedgerProduct.setApproveStatus(req.getApproveStatus());
+            salesLedgerProductService.updateById(salesLedgerProduct);
+        }
+        return update ? AjaxResult.success() : AjaxResult.error();
+    }
+
+
+    /**
+     * 瀵煎嚭鍙戣揣淇℃伅绠$悊
+     */
+    @PostMapping("/export")
+    @ApiOperation("瀵煎嚭鍙戣揣瀹℃壒")
+    public void export(HttpServletResponse response) {
+        List<ShipmentApproval> list = shipmentApprovalService.list(null);
+        ExcelUtil<ShipmentApproval> util = new ExcelUtil<ShipmentApproval>(ShipmentApproval.class);
+        util.exportExcel(response, list, "鍙戣揣瀹℃壒");
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/sales/controller/ShippingInfoController.java b/src/main/java/com/ruoyi/sales/controller/ShippingInfoController.java
index 56b3e15..077e80a 100644
--- a/src/main/java/com/ruoyi/sales/controller/ShippingInfoController.java
+++ b/src/main/java/com/ruoyi/sales/controller/ShippingInfoController.java
@@ -1,5 +1,6 @@
 package com.ruoyi.sales.controller;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.common.utils.poi.ExcelUtil;
@@ -7,13 +8,19 @@
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
 import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.sales.mapper.ShipmentApprovalMapper;
 import com.ruoyi.sales.mapper.ShippingInfoMapper;
 import com.ruoyi.sales.pojo.SalesLedger;
+import com.ruoyi.sales.pojo.SalesLedgerProduct;
+import com.ruoyi.sales.pojo.ShipmentApproval;
 import com.ruoyi.sales.pojo.ShippingInfo;
+import com.ruoyi.sales.service.ISalesLedgerProductService;
+import com.ruoyi.sales.service.ISalesLedgerService;
 import com.ruoyi.sales.service.ShippingInfoService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
@@ -30,6 +37,10 @@
 
     @Autowired
     private ShippingInfoService shippingInfoService;
+    @Autowired
+    private ShipmentApprovalMapper shipmentApprovalMapper;
+    @Autowired
+    private ISalesLedgerProductService salesLedgerProductService;
 
 
     @GetMapping("/listPage")
@@ -41,8 +52,32 @@
 
     @PostMapping("/add")
     @ApiOperation("娣诲姞鍙戣揣淇℃伅")
+    @Transactional(rollbackFor = Exception.class)
     public AjaxResult add(@RequestBody ShippingInfo req) {
         boolean save = shippingInfoService.save(req);
+        if(save){
+            LambdaQueryWrapper<ShippingInfo> wrapper = new LambdaQueryWrapper<>();
+            wrapper.eq(ShippingInfo::getSalesLedgerId, req.getSalesLedgerId());
+            wrapper.eq(ShippingInfo::getSalesLedgerProductId, req.getSalesLedgerProductId());
+            ShippingInfo shippingInfo = shippingInfoService.getOne(wrapper);
+            if(shippingInfo == null){
+                return AjaxResult.error("鍙戣揣淇℃伅涓嶅瓨鍦�");
+            }
+            ShipmentApproval shipmentApproval = new ShipmentApproval();
+            shipmentApproval.setSalesLedgerId(req.getSalesLedgerId());
+            shipmentApproval.setSalesLedgerProductId(req.getSalesLedgerProductId());
+            shipmentApproval.setApproveUserId(req.getApproverId());
+            shipmentApproval.setApproveStatus(2);
+            shipmentApproval.setShippingInfoId(shippingInfo.getId());
+            shipmentApprovalMapper.insert(shipmentApproval);
+
+            SalesLedgerProduct salesLedgerProduct = salesLedgerProductService.getById(req.getSalesLedgerProductId());
+            if(salesLedgerProduct != null){
+                salesLedgerProduct.setApproveStatus(2);
+                salesLedgerProductService.updateById(salesLedgerProduct);
+            }
+
+        }
         return save ? AjaxResult.success() : AjaxResult.error();
     }
 
diff --git a/src/main/java/com/ruoyi/sales/mapper/SalesLedgerProductMapper.java b/src/main/java/com/ruoyi/sales/mapper/SalesLedgerProductMapper.java
index 69b2b7b..0ccce79 100644
--- a/src/main/java/com/ruoyi/sales/mapper/SalesLedgerProductMapper.java
+++ b/src/main/java/com/ruoyi/sales/mapper/SalesLedgerProductMapper.java
@@ -2,6 +2,9 @@
 
 import com.ruoyi.common.config.MyBaseMapper;
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * 浜у搧淇℃伅Mapper鎺ュ彛
@@ -10,4 +13,5 @@
  * @date 2025-05-08
  */
 public interface SalesLedgerProductMapper extends MyBaseMapper<SalesLedgerProduct> {
+    List<SalesLedgerProduct> selectSalesLedgerProductList(@Param("salesLedgerProduct") SalesLedgerProduct salesLedgerProduct);
 }
diff --git a/src/main/java/com/ruoyi/sales/mapper/ShipmentApprovalMapper.java b/src/main/java/com/ruoyi/sales/mapper/ShipmentApprovalMapper.java
new file mode 100644
index 0000000..c3bf397
--- /dev/null
+++ b/src/main/java/com/ruoyi/sales/mapper/ShipmentApprovalMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.sales.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.sales.pojo.ShipmentApproval;
+import com.ruoyi.sales.pojo.ShippingInfo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+
+public interface ShipmentApprovalMapper extends BaseMapper<ShipmentApproval> {
+    IPage<ShipmentApproval> listPage(Page page,@Param("req") ShipmentApproval req);
+
+}
diff --git a/src/main/java/com/ruoyi/sales/pojo/SalesLedger.java b/src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
index 4ffdb03..f0b699d 100644
--- a/src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
+++ b/src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
@@ -125,5 +125,9 @@
 
     @ApiModelProperty(value = "浠樻鏂瑰紡")
     private String paymentMethod;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "鐢熶骇鐘舵��")
+    private String productionStatus = "鏈紑濮�";
 }
 
diff --git a/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java b/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
index a135fa3..d51e7c0 100644
--- a/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
+++ b/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
@@ -11,6 +11,7 @@
 
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
+import java.util.Date;
 
 /**
  * 浜у搧淇℃伅瀵硅薄 sales_ledger_product
@@ -177,4 +178,28 @@
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @Excel(name = "鐧昏鏃ユ湡", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime registerDate;
+    /**
+     * 鍙戣揣杞︾墝鍙�
+     */
+    @Excel(name = "鍙戣揣杞︾墝鍙�")
+    @TableField(exist = false)
+    private String shippingCarNumber;
+
+    /**
+     * 鍙戣揣鏃ユ湡
+     */
+    @Excel(name = "鍙戣揣鏃ユ湡", width = 30, dateFormat = "yyyy-MM-dd")
+    @TableField(exist = false)
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date shippingDate;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "鐢熶骇鐘舵��")
+    private String productionStatus = "鏈紑濮�";
+    /**
+     * 鍙戣揣瀹℃壒鐘舵��
+     */
+//    @TableField(exist = false)
+    @ApiModelProperty(value = "瀹℃壒鐘舵��")
+    private Integer approveStatus;
 }
diff --git a/src/main/java/com/ruoyi/sales/pojo/ShipmentApproval.java b/src/main/java/com/ruoyi/sales/pojo/ShipmentApproval.java
new file mode 100644
index 0000000..41a0d34
--- /dev/null
+++ b/src/main/java/com/ruoyi/sales/pojo/ShipmentApproval.java
@@ -0,0 +1,352 @@
+package com.ruoyi.sales.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.framework.aspectj.lang.annotation.Excel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.List;
+
+@Data
+@TableName("shipment_approval")
+public class ShipmentApproval {
+    @TableId(type = IdType.AUTO)
+    private Long id;
+    @ApiModelProperty(value = "鍙戣揣淇℃伅id")
+    private Long shippingInfoId;
+    @ApiModelProperty(value = "閿�鍞彴璐d")
+    private Long salesLedgerId;
+    @ApiModelProperty(value = "閿�鍞姤浠蜂骇鍝佽〃id")
+    private Long salesLedgerProductId;
+     @ApiModelProperty(value = "鐢宠閮ㄩ棬id")
+    private Long approveDeptId;
+
+    @ApiModelProperty(value = "鐢宠閮ㄩ棬鍚嶇О")
+    @Excel(name = "鐢宠閮ㄩ棬")
+    private String approveDeptName;
+     @ApiModelProperty(value = "瀹℃壒鐢ㄦ埛id")
+    private Integer approveUserId;
+    @ApiModelProperty(value = "瀹℃壒鐢ㄦ埛鍚嶇О")
+    @Excel(name = "瀹℃壒鐢ㄦ埛")
+    private String approveUserNames;
+
+    /**
+     * 瀹℃壒鐘舵��
+     */
+    @ApiModelProperty(value = "瀹℃壒鐘舵�侊細0鏈嚭搴�,1宸插嚭搴�,2寰呭鏍�,3瀹℃牳瀹屾垚,4瀹℃牳澶辫触")
+    @Excel(name = "瀹℃壒鐘舵��", readConverterExp = "0=鏈嚭搴�,1=宸插嚭搴�,2=寰呭鏍�,3=瀹℃牳瀹屾垚,4=瀹℃牳澶辫触")
+    private Integer approveStatus;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty(value = "淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty(value = "鍒涘缓鐢ㄦ埛")
+    @TableField(fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Integer createUser;
+
+    @ApiModelProperty(value = "淇敼鐢ㄦ埛")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @ApiModelProperty(value = "绉熸埛ID")
+    @TableField(fill = FieldFill.INSERT)
+    private Long tenantId;
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "鍙戣揣鏃ユ湡", width = 30, dateFormat = "yyyy-MM-dd")
+    @TableField(exist = false)
+    private Date shippingDate;
+
+    @Excel(name = "鍙戣揣杞︾墝鍙�")
+    @TableField(exist = false)
+    private String shippingCarNumber;
+
+    /**
+     * 棰勮鏁伴噺
+     */
+
+    @TableField(exist = false)
+    private BigDecimal warnNum;
+
+    /**
+     * 浜у搧澶х被
+     */
+    @Excel(name = "浜у搧澶х被")
+    @TableField(exist = false)
+    private String productCategory;
+
+    /**
+     * 瑙勬牸鍨嬪彿
+     */
+    @Excel(name = "瑙勬牸鍨嬪彿")
+    @TableField(exist = false)
+    private String specificationModel;
+
+    /**
+     * 鍗曚綅
+     */
+    @Excel(name = "鍗曚綅")
+    @TableField(exist = false)
+    private String unit;
+
+    /**
+     * 鏁伴噺
+     */
+    @Excel(name = "鏁伴噺")
+    @TableField(exist = false)
+    private BigDecimal quantity;
+    @Excel(name = "鏈�浣庡簱瀛樻暟閲�")
+    @TableField(exist = false)
+    private BigDecimal minStock;
+    /**
+     * 绋庣巼
+     */
+    @Excel(name = "绋庣巼")
+    @TableField(exist = false)
+    private BigDecimal taxRate;
+
+    /**
+     * 鍚◣鍗曚环
+     */
+    @Excel(name = "鍚◣鍗曚环")
+    @TableField(exist = false)
+    private BigDecimal taxInclusiveUnitPrice;
+
+    /**
+     * 鍚◣鎬讳环
+     */
+    @Excel(name = "鍚◣鎬讳环")
+    @TableField(exist = false)
+    private BigDecimal taxInclusiveTotalPrice;
+
+    /**
+     * 涓嶅惈绋庢�讳环
+     */
+    @Excel(name = "涓嶅惈绋庢�讳环")
+    @TableField(exist = false)
+    private BigDecimal taxExclusiveTotalPrice;
+
+    /**
+     * 鍙戠エ绫诲瀷
+     */
+
+    @TableField(exist = false)
+    private String invoiceType;
+
+    /**
+     * 鍙拌处绫诲瀷 1.閿�鍞� 2锛岄噰璐�
+     */
+    @TableField(exist = false)
+    private Integer type;
+
+    /**
+     * 鏈鏉ョエ鏁�
+     */
+    @TableField(exist = false)
+    private BigDecimal ticketsNum;
+
+    /**
+     * 鏈鏉ョエ閲戦(鍏�)
+     */
+    @TableField(exist = false)
+    private BigDecimal ticketsAmount;
+
+    /**
+     * 鏈潵绁ㄦ暟
+     */
+    @TableField(exist = false)
+    private BigDecimal futureTickets;
+
+    /**
+     * 鏈潵绁ㄩ噾棰�(鍏�)
+     */
+    @TableField(exist = false)
+    private BigDecimal futureTicketsAmount;
+
+    @ApiModelProperty(value = "寮�绁ㄦ暟")
+    @TableField(exist = false)
+    private BigDecimal invoiceNum;
+
+    @ApiModelProperty(value = "鏈紑绁ㄦ暟")
+    @TableField(exist = false)
+    private BigDecimal noInvoiceNum;
+
+    @ApiModelProperty(value = "寮�绁ㄩ噾棰�")
+    @TableField(exist = false)
+    private BigDecimal invoiceAmount;
+
+    @ApiModelProperty(value = "鏈紑绁ㄩ噾棰�")
+    @TableField(exist = false)
+    private BigDecimal noInvoiceAmount;
+
+    @ApiModelProperty(value = "鏈寮�绁ㄦ暟")
+    @TableField(exist = false)
+    private BigDecimal currentInvoiceNum;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "鏈寮�绁ㄩ噾棰�")
+    private BigDecimal currentInvoiceAmount;
+
+    /**
+     *  浜у搧id
+     */
+    @TableField(exist = false)
+    private Long productId;
+
+    /**
+     * 浜у搧瑙勬牸id
+     */
+    @TableField(exist = false)
+    private Long productModelId;
+
+    @ApiModelProperty(value = "鍒濆鏈紑绁ㄦ暟")
+    @TableField(exist = false)
+    private BigDecimal originalNoInvoiceNum;
+
+    @ApiModelProperty(value = "涓存椂鏈紑绁ㄦ暟")
+    @TableField(exist = false)
+    private BigDecimal tempNoInvoiceNum;
+
+    @ApiModelProperty(value = "涓存椂鏈紑绁ㄩ噾棰�")
+    @TableField(exist = false)
+    private BigDecimal tempnoInvoiceAmount;
+
+    @ApiModelProperty(value = "涓存椂鏈潵绁ㄦ暟")
+    @TableField(exist = false)
+    private BigDecimal tempFutureTickets;
+
+    @ApiModelProperty(value = "涓存椂鏈潵绁ㄩ噾棰�")
+    @TableField(exist = false)
+    private BigDecimal tempFutureTicketsAmount;
+
+    @ApiModelProperty("鐧昏浜�")
+    @TableField(exist = false)
+    private String register;
+
+    @ApiModelProperty("鐧昏鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "鐧昏鏃ユ湡", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    @TableField(exist = false)
+    private LocalDateTime registerDate;
+    /**
+     * 閿�鍞悎鍚屽彿
+     */
+    @Excel(name = "閿�鍞悎鍚屽彿")
+    @TableField(exist = false)
+    private String salesContractNo;
+
+    /**
+     * 瀹㈡埛鍚堝悓鍙�
+     */
+    @Excel(name = "瀹㈡埛鍚堝悓鍙�")
+    @TableField(exist = false)
+    private String customerContractNo;
+
+
+    /**
+     * 椤圭洰鍚嶇О
+     */
+    @Excel(name = "椤圭洰鍚嶇О")
+    @TableField(exist = false)
+    private String projectName;
+
+    /**
+     * 褰曞叆鏃ユ湡
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @TableField(exist = false)
+    private Date entryDate;
+
+    /**
+     * 涓氬姟鍛�
+     */
+    @Excel(name = "涓氬姟鍛�")
+    @TableField(exist = false)
+    private String salesman;
+
+    @TableField(exist = false)
+    private Long customerId;
+
+    /**
+     * 瀹㈡埛鍚嶇О
+     */
+    @Excel(name = "瀹㈡埛鍚嶇О")
+    @TableField(exist = false)
+    private String customerName;
+
+    /**
+     * 褰曞叆浜�
+     */
+    @TableField(exist = false)
+    private String entryPerson;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "褰曞叆浜�")
+    @Excel(name = "褰曞叆浜�")
+    private String entryPersonName;
+
+    /**
+     * 澶囨敞
+     */
+    @Excel(name = "澶囨敞")
+    @TableField(exist = false)
+    private String remarks;
+
+    /**
+     * 闄勪欢鏉愭枡锛屽瓨鍌ㄦ枃浠跺悕绛夌浉鍏充俊鎭�
+     */
+    @TableField(exist = false)
+    private String attachmentMaterials;
+
+
+    /**
+     * 鍚堝悓閲戦锛堜骇鍝佸惈绋庢�讳环锛�
+     */
+    @Excel(name = "鍚堝悓閲戦")
+    @TableField(exist = false)
+    private BigDecimal contractAmount;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "鏈紑绁ㄩ噾棰�(鍏�)")
+    @Excel(name = "鏈紑绁ㄩ噾棰�")
+    private BigDecimal noInvoiceAmountTotal = BigDecimal.ZERO;
+
+    @ApiModelProperty(value = "绛捐鏃ユ湡")
+    @TableField(exist = false)
+    private LocalDate executionDate;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "宸插紑绁ㄩ噾棰�(鍏�)")
+    @Excel(name = "宸插紑绁ㄩ噾棰�")
+    private BigDecimal invoiceTotal = BigDecimal.ZERO;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "鍥炴閲戦")
+    private BigDecimal receiptPaymentAmountTotal = BigDecimal.ZERO;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "寰呭洖娆鹃噾棰�")
+    private BigDecimal noReceiptAmount = BigDecimal.ZERO;
+
+    @ApiModelProperty(value = "浠樻鏂瑰紡")
+    @TableField(exist = false)
+    private String paymentMethod;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "鐢熶骇鐘舵��")
+    private String productionStatus = "鏈紑濮�";
+}
diff --git a/src/main/java/com/ruoyi/sales/pojo/ShippingInfo.java b/src/main/java/com/ruoyi/sales/pojo/ShippingInfo.java
index 3f80dc0..fce7148 100644
--- a/src/main/java/com/ruoyi/sales/pojo/ShippingInfo.java
+++ b/src/main/java/com/ruoyi/sales/pojo/ShippingInfo.java
@@ -23,7 +23,8 @@
 
     @ApiModelProperty(value = "閿�鍞彴璐d")
     private Long salesLedgerId;
-
+    @ApiModelProperty(value = "閿�鍞姤浠蜂骇鍝佽〃id")
+    private Long salesLedgerProductId;
     @TableField(exist = false)
     @ApiModelProperty(value = "閿�鍞悎鍚屽彿")
     @Excel(name = "閿�鍞悎鍚屽彿")
@@ -64,5 +65,8 @@
     @ApiModelProperty(value = "绉熸埛ID")
     @TableField(fill = FieldFill.INSERT)
     private Long tenantId;
+    @ApiModelProperty(value = "瀹℃壒浜篿d")
+    @TableField(exist = false)
+    private Integer approverId;
 
 }
diff --git a/src/main/java/com/ruoyi/sales/service/ShipmentApprovalService.java b/src/main/java/com/ruoyi/sales/service/ShipmentApprovalService.java
new file mode 100644
index 0000000..6af2c00
--- /dev/null
+++ b/src/main/java/com/ruoyi/sales/service/ShipmentApprovalService.java
@@ -0,0 +1,13 @@
+package com.ruoyi.sales.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.sales.pojo.ShipmentApproval;
+import com.ruoyi.sales.pojo.ShippingInfo;
+
+
+public interface ShipmentApprovalService extends IService<ShipmentApproval>{
+    IPage<ShipmentApproval> listPage(Page page, ShipmentApproval req);
+
+}
diff --git a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
index 2a288e4..ba02f28 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -52,10 +52,10 @@
 
     @Override
     public List<SalesLedgerProduct> selectSalesLedgerProductList(SalesLedgerProduct salesLedgerProduct) {
-        LambdaQueryWrapper<SalesLedgerProduct> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(SalesLedgerProduct::getSalesLedgerId, salesLedgerProduct.getSalesLedgerId())
-                .eq(SalesLedgerProduct::getType, salesLedgerProduct.getType());
-        List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList(queryWrapper);
+//        LambdaQueryWrapper<SalesLedgerProduct> queryWrapper = new LambdaQueryWrapper<>();
+//        queryWrapper.eq(SalesLedgerProduct::getSalesLedgerId, salesLedgerProduct.getSalesLedgerId())
+//                .eq(SalesLedgerProduct::getType, salesLedgerProduct.getType());
+        List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectSalesLedgerProductList(salesLedgerProduct);
         if(!CollectionUtils.isEmpty(salesLedgerProducts)){
             InvoiceRegistrationProductDto invoiceRegistrationProductDto = new InvoiceRegistrationProductDto();
             invoiceRegistrationProductDto.setSalesLedgerId(salesLedgerProduct.getSalesLedgerId().intValue());
diff --git a/src/main/java/com/ruoyi/sales/service/impl/ShipmentApprovalServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/ShipmentApprovalServiceImpl.java
new file mode 100644
index 0000000..0df4c34
--- /dev/null
+++ b/src/main/java/com/ruoyi/sales/service/impl/ShipmentApprovalServiceImpl.java
@@ -0,0 +1,32 @@
+package com.ruoyi.sales.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.sales.mapper.ShipmentApprovalMapper;
+import com.ruoyi.sales.mapper.ShippingInfoMapper;
+import com.ruoyi.sales.pojo.ShipmentApproval;
+import com.ruoyi.sales.pojo.ShippingInfo;
+import com.ruoyi.sales.service.ShipmentApprovalService;
+import com.ruoyi.sales.service.ShippingInfoService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author :yys
+ * @date : 2025/10/22 9:33
+ */
+@Service
+@Slf4j
+public class ShipmentApprovalServiceImpl extends ServiceImpl<ShipmentApprovalMapper, ShipmentApproval> implements ShipmentApprovalService {
+
+    @Autowired
+    private ShipmentApprovalMapper shipmentApprovalMapper;
+
+    @Override
+    public IPage<ShipmentApproval> listPage(Page page, ShipmentApproval req) {
+        IPage<ShipmentApproval> listPage = shipmentApprovalMapper.listPage(page, req);
+        return listPage;
+    }
+}
diff --git a/src/main/resources/mapper/sales/SalesLedgerMapper.xml b/src/main/resources/mapper/sales/SalesLedgerMapper.xml
index a73b2ae..5d83bb1 100644
--- a/src/main/resources/mapper/sales/SalesLedgerMapper.xml
+++ b/src/main/resources/mapper/sales/SalesLedgerMapper.xml
@@ -82,6 +82,6 @@
                 AND  T1.entry_date &lt;= DATE_FORMAT(#{salesLedgerDto.entryDateEnd},'%Y-%m-%d')
             </if>
         </where>
-        order by entry_date desc
+    order by T1.entry_date desc
     </select>
 </mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml b/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
new file mode 100644
index 0000000..ec8d8d4
--- /dev/null
+++ b/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.sales.mapper.SalesLedgerProductMapper">
+
+    <select id="selectSalesLedgerProductList" resultType="com.ruoyi.sales.pojo.SalesLedgerProduct">
+        SELECT
+        T1.*,
+        t3.shipping_car_number,
+        t3.shipping_date
+        FROM
+        sales_ledger_product T1
+        left join shipping_info t3 on T1.id = t3.sales_ledger_id
+        <where>
+            1=1
+            <if test="salesLedgerProduct.salesLedgerId != null and salesLedgerProduct.salesLedgerId != '' ">
+                AND  T1.sales_ledger_id = #{salesLedgerProduct.salesLedgerId}
+            </if>
+            <if test="salesLedgerProduct.type != null and salesLedgerProduct.type != '' ">
+                AND  T1.type = #{salesLedgerProduct.type}
+            </if>
+        </where>
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/sales/ShipmentApprovalMapper.xml b/src/main/resources/mapper/sales/ShipmentApprovalMapper.xml
new file mode 100644
index 0000000..8b9792e
--- /dev/null
+++ b/src/main/resources/mapper/sales/ShipmentApprovalMapper.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.sales.mapper.ShipmentApprovalMapper">
+
+    <select id="listPage" resultType="com.ruoyi.sales.pojo.ShipmentApproval">
+        SELECT *,
+        si.shipping_car_number,
+        T2.nick_name AS entry_person_name
+        FROM shipment_approval sa
+                 LEFT JOIN shipping_info si ON sa.shipping_info_id = si.id
+                 LEFT JOIN sales_ledger sl ON sa.sales_ledger_id = sl.id
+                 LEFT JOIN sales_ledger_product slp ON sa.sales_ledger_product_id = slp.id
+                 LEFT JOIN sys_user T2 ON sl.entry_person = T2.user_id
+        <where>
+            1=1
+            <if test="req.approveStatus != null and req.approveStatus != '' ">
+                AND  sa.approve_status = #{req.approveStatus}
+            </if>
+            <if test="req.salesContractNo != null and req.salesContractNo != '' ">
+                AND  sl.sales_contract_no LIKE CONCAT('%',#{req.salesContractNo},'%')
+            </if>
+        </where>
+    </select>
+</mapper>
\ No newline at end of file

--
Gitblit v1.9.3