From 277b5047d00a3e9094bafd5ecb078976fbf6a92d Mon Sep 17 00:00:00 2001
From: yaowanxin <3588231647@qq.com>
Date: 星期四, 08 一月 2026 18:59:04 +0800
Subject: [PATCH] 华玺砂浆转移-采购代码、发货和发货审核、报修和报修审核、采购模板,查询采购模板接口、财务管理的存货核算数据接口、财务管理的固定资产核算获取台账接口、采购审批,接口、客户分类字段、采购台账字段,实现采购异常记录的添加接口、黑名单,添加资质管理字段,可上传资质文件-至军泰伟业

---
 src/main/java/com/ruoyi/basic/pojo/Customer.java                                               |    4 
 src/main/java/com/ruoyi/purchase/service/IPurchaseLedgerService.java                           |    2 
 src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java                   |   52 ++
 src/main/java/com/ruoyi/device/dto/DeviceRepairDto.java                                        |    5 
 src/main/java/com/ruoyi/procurementrecord/controller/ProcurementExceptionRecordController.java |   46 ++
 src/main/resources/mapper/purchase/PurchaseLedgerMapper.xml                                    |   12 
 src/main/java/com/ruoyi/basic/service/impl/CustomerServiceImpl.java                            |    4 
 src/main/resources/mapper/sales/SalesLedgerProductMapper.xml                                   |   25 +
 src/main/resources/mapper/measuringinstrumentledger/SparePartsMapper.xml                       |    7 
 src/main/resources/mapper/basic/SupplierManageFileMapper.xml                                   |    9 
 src/main/resources/mapper/sales/ShipmentApprovalMapper.xml                                     |   24 +
 src/main/java/com/ruoyi/device/controller/DeviceRepairController.java                          |   62 ++
 src/main/java/com/ruoyi/device/pojo/DeviceRepair.java                                          |   15 
 src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java                       |   17 
 src/main/java/com/ruoyi/basic/mapper/SupplierManageFileMapper.java                             |   15 
 src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java                |    1 
 src/main/java/com/ruoyi/sales/mapper/ShipmentApprovalMapper.java                               |   16 
 src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml                        |    3 
 src/main/java/com/ruoyi/sales/mapper/SalesLedgerProductMapper.java                             |    4 
 src/main/java/com/ruoyi/procurementrecord/dto/ProcurementAddDto.java                           |    1 
 src/main/resources/mapper/procurementrecord/ProcurementExceptionRecordMapper.xml               |    5 
 src/main/resources/mapper/sales/SalesLedgerMapper.xml                                          |    5 
 src/main/resources/mapper/basic/SupplierManageMapper.xml                                       |    8 
 src/main/resources/mapper/purchase/ProductRecordMapper.xml                                     |    4 
 src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java                                     |   25 +
 src/main/java/com/ruoyi/sales/pojo/SalesLedger.java                                            |    4 
 src/main/java/com/ruoyi/basic/controller/SupplierManageFileController.java                     |   63 ++
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java                  |   23 
 src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java          |    6 
 src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java                      |   44 +
 src/main/java/com/ruoyi/procurementrecord/dto/InventoryInformationDto.java                     |   28 +
 src/main/java/com/ruoyi/sales/controller/ShippingInfoController.java                           |   37 +
 src/main/java/com/ruoyi/purchase/pojo/PurchaseLedger.java                                      |    8 
 src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java                    |   16 
 src/main/java/com/ruoyi/approve/pojo/ApproveProcess.java                                       |    9 
 src/main/java/com/ruoyi/sales/service/ShipmentApprovalService.java                             |   13 
 src/main/java/com/ruoyi/basic/service/impl/SupplierManageFileServiceImpl.java                  |   23 +
 src/main/java/com/ruoyi/approve/vo/ApproveProcessVO.java                                       |   39 +
 src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java                                    |   12 
 src/main/java/com/ruoyi/basic/pojo/SupplierManage.java                                         |    3 
 src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java       |   62 ++
 src/main/java/com/ruoyi/sales/service/impl/ShipmentApprovalServiceImpl.java                    |   32 +
 src/main/java/com/ruoyi/sales/pojo/ShippingInfo.java                                           |    6 
 src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java                       |   77 +++
 src/main/resources/mapper/quality/QualityInspectMapper.xml                                     |    8 
 src/main/java/com/ruoyi/basic/service/SupplierManageFileService.java                           |   12 
 src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementExceptionRecordMapper.java         |    9 
 src/main/resources/mapper/device/DeviceRepairMapper.xml                                        |    2 
 src/main/java/com/ruoyi/basic/pojo/SupplierManageFile.java                                     |   60 ++
 src/main/java/com/ruoyi/sales/pojo/ShipmentApproval.java                                       |  352 ++++++++++++++++
 50 files changed, 1,250 insertions(+), 69 deletions(-)

diff --git a/src/main/java/com/ruoyi/approve/pojo/ApproveProcess.java b/src/main/java/com/ruoyi/approve/pojo/ApproveProcess.java
index 6fefc5d..64177e8 100644
--- a/src/main/java/com/ruoyi/approve/pojo/ApproveProcess.java
+++ b/src/main/java/com/ruoyi/approve/pojo/ApproveProcess.java
@@ -157,7 +157,14 @@
      * 鍒涘缓鏃堕棿
      */
     private LocalDateTime createTime;
-
+    /**
+     * 璁惧鎶ヤ慨id
+     */
+    private Long deviceRepairId;
+    /**
+     * 鎶ヤ慨閲戦
+     */
+    private BigDecimal maintenancePrice;
     private static final long serialVersionUID = 1L;
 
 
diff --git a/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java b/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
index 899d5c8..f5919de 100644
--- a/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
+++ b/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
@@ -10,6 +10,8 @@
 import com.ruoyi.approve.service.IApproveNodeService;
 import com.ruoyi.common.enums.FileNameType;
 import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.device.mapper.DeviceRepairMapper;
+import com.ruoyi.device.pojo.DeviceRepair;
 import com.ruoyi.other.service.impl.TempFileServiceImpl;
 import com.ruoyi.project.system.domain.SysUser;
 import com.ruoyi.project.system.mapper.SysUserMapper;
@@ -43,6 +45,9 @@
 
     @Autowired
     private CommonFileMapper fileMapper;
+    @Autowired
+    private DeviceRepairMapper deviceRepairMapper;
+
 
 
     public ApproveProcess getApproveById(String id) {
@@ -135,11 +140,21 @@
             approveProcess.setApproveUserCurrentId(approveNode1.getApproveNodeUserId());
             approveProcess.setApproveUserCurrentName(approveNode1.getApproveNodeUser());
         }
-        if (approveProcess.getApproveStatus() != 1){
+        if(approveProcess.getApproveStatus().equals(2) || approveProcess.getApproveStatus().equals(3) || approveProcess.getApproveStatus().equals(4)){
             approveProcess.setApproveOverTime(new Date());
         }
         approveProcessMapper.updateById(approveProcess);
 
+        DeviceRepair deviceRepair = deviceRepairMapper.selectById(approveProcess.getDeviceRepairId());
+        if(deviceRepair == null) throw new RuntimeException("璁惧鎶ヤ慨涓嶅瓨鍦�");
+        if(approveProcess.getApproveStatus().equals(2)){
+            // 鍚屾剰
+            deviceRepair.setStatus(1);
+        }else if(approveProcess.getApproveStatus().equals(3)){
+            // 鎷掔粷
+            deviceRepair.setStatus(2);
+        }
+        deviceRepairMapper.updateById(deviceRepair);
         // 缁戝畾闄勪欢
         if(!CollectionUtils.isEmpty(approveNode.getTempFileIds()) && approveNode.getApproveNodeStatus() == 1){
             tempFileService.migrateTempFilesToFormal(approveNode.getId(), approveNode.getTempFileIds(), FileNameType.ApproveNode.getValue());
diff --git a/src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java b/src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java
index 58e188c..404d594 100644
--- a/src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java
+++ b/src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java
@@ -74,16 +74,14 @@
         if(CollectionUtils.isEmpty(sysUsers)) throw new RuntimeException("瀹℃牳鐢ㄦ埛涓嶅瓨鍦�");
         if(sysDept == null) throw new RuntimeException("閮ㄩ棬涓嶅瓨鍦�");
         if(sysUser == null) throw new RuntimeException("鐢宠浜轰笉瀛樺湪");
-//        String today = LocalDate.now().format(DATE_FORMAT);
-        String approve_process = OrderUtils.countTodayByCreateTime(approveProcessMapper, "");
-//        Long approveId = dailyRedisCounter.incrementAndGetByDb();
-//        String formattedCount = String.format("%03d", approveId);
+        String today = LocalDate.now().format(DATE_FORMAT);
+        Long approveId = dailyRedisCounter.incrementAndGetByDb();
+        String formattedCount = String.format("%03d", approveId);
         //娴佺▼ ID
-//        String approveID = today + formattedCount;
+        String approveID = today + formattedCount;
         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
         ApproveProcess approveProcess = new ApproveProcess();
-        BeanUtils.copyProperties(approveProcessVO, approveProcess);
-        approveProcess.setApproveId(approve_process);
+        approveProcess.setApproveId(approveID);
         approveProcess.setApproveUser(approveProcessVO.getApproveUser());
         approveProcess.setApproveUserName(sysUser.getNickName());
         approveProcess.setApproveDeptId(approveProcessVO.getApproveDeptId());
@@ -91,6 +89,8 @@
         approveProcess.setApproveUserNames(sysUsers.stream().map(SysUser::getNickName).collect(Collectors.joining(",")));
         approveProcess.setApproveTime(StringUtils.isEmpty(approveProcessVO.getApproveTime()) ? null : dateFormat.parse(approveProcessVO.getApproveTime()));
         approveProcess.setApproveReason(approveProcessVO.getApproveReason());
+        approveProcess.setDeviceRepairId(approveProcessVO.getDeviceRepairId());
+        approveProcess.setMaintenancePrice(approveProcessVO.getMaintenancePrice());
         approveProcess.setApproveOverTime(null);
         approveProcess.setApproveStatus(0);
         approveProcess.setApproveDelete(0);
@@ -113,7 +113,7 @@
         }
         save(approveProcess);
         //鍒濆鍖栧鎵硅妭鐐�
-        approveNodeService.initApproveNodes(approveProcessVO.getApproveUserIds(),approve_process,approveProcessVO.getApproveDeptId());
+        approveNodeService.initApproveNodes(approveProcessVO.getApproveUserIds(),approveID,approveProcessVO.getApproveDeptId());
         // 闄勪欢缁戝畾
         tempFileService.migrateTempFilesToFormal(approveProcess.getId(), approveProcessVO.getTempFileIds(), FileNameType.ApproveProcess.getValue());
     }
diff --git a/src/main/java/com/ruoyi/approve/vo/ApproveProcessVO.java b/src/main/java/com/ruoyi/approve/vo/ApproveProcessVO.java
index e9fb7f2..bf8edae 100644
--- a/src/main/java/com/ruoyi/approve/vo/ApproveProcessVO.java
+++ b/src/main/java/com/ruoyi/approve/vo/ApproveProcessVO.java
@@ -14,24 +14,37 @@
 
 @Data
 public class ApproveProcessVO {
-
+    /**
+     * 涓存椂鏂囦欢id鍒楄〃
+     */
     private List<String> tempFileIds;
-
+    /**
+     * 瀹℃壒娴佺▼id
+     */
     private Long id;
 
-
+    private String approveId;
+    /**
+     * 瀹℃壒閮ㄩ棬id
+     */
     private Long approveDeptId;
-
-    private String approveDeptName;
-
+    /**
+     * 瀹℃壒鏃堕棿
+     */
     private String approveTime;
-
+    /**
+     * 鐢宠浜篿d
+     */
     // 鐢宠浜�
     private Long approveUser;
-
+    /**
+     * 瀹℃壒浜篿d鍒楄〃
+     */
     // 瀹℃壒浜�
     private String approveUserIds;
-
+    /**
+     * 瀹℃壒鐞嗙敱
+     */
     private String approveReason;
 
     @Excel(name = "寮�濮嬫椂闂�", dateFormat = "yyyy-MM-dd",width = 30)
@@ -54,4 +67,12 @@
      * 瀹℃壒绫诲瀷
      */
     private Integer approveType;
+     /**
+     * 璁惧鎶ヤ慨id
+     */
+    private Long deviceRepairId;
+     /**
+     * 鎶ヤ慨閲戦
+     */
+    private BigDecimal maintenancePrice;
 }
diff --git a/src/main/java/com/ruoyi/basic/controller/SupplierManageFileController.java b/src/main/java/com/ruoyi/basic/controller/SupplierManageFileController.java
new file mode 100644
index 0000000..ff54830
--- /dev/null
+++ b/src/main/java/com/ruoyi/basic/controller/SupplierManageFileController.java
@@ -0,0 +1,63 @@
+package com.ruoyi.basic.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.basic.pojo.SupplierManageFile;
+import com.ruoyi.basic.service.SupplierManageFileService;
+import com.ruoyi.framework.web.domain.AjaxResult;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * 渚涘簲鍟嗛檮浠�
+ */
+@RestController
+@RequestMapping("/basic/supplierManageFile")
+public class SupplierManageFileController {
+
+
+    @Resource
+    private SupplierManageFileService supplierManageFileService;
+
+
+    /**
+     * 鏂板
+     * @param supplierManageFile
+     * @return
+     */
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody SupplierManageFile supplierManageFile) {
+        return AjaxResult.success(supplierManageFileService.save(supplierManageFile));
+    }
+
+    /**
+     * 鍒犻櫎
+     * @param ids
+     * @return
+     */
+    @DeleteMapping("/del")
+    public AjaxResult delSupplierManageFile(@RequestBody List<Integer> ids) {
+        if(CollectionUtils.isEmpty(ids)){
+            return AjaxResult.error("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
+        }
+        //鍒犻櫎妫�楠岄檮浠�
+        return AjaxResult.success(supplierManageFileService.removeBatchByIds(ids));
+    }
+
+    /**
+     *鍒嗛〉鏌ヨ
+     * @param page
+     * @param supplierManageFile
+     * @return
+     */
+    @GetMapping("/listPage")
+    public AjaxResult supplierManageFileListPage(Page page, SupplierManageFile supplierManageFile) {
+        return AjaxResult.success(supplierManageFileService.supplierManageFileListPage(page, supplierManageFile));
+    }
+
+
+
+
+}
diff --git a/src/main/java/com/ruoyi/basic/mapper/SupplierManageFileMapper.java b/src/main/java/com/ruoyi/basic/mapper/SupplierManageFileMapper.java
new file mode 100644
index 0000000..a3acd20
--- /dev/null
+++ b/src/main/java/com/ruoyi/basic/mapper/SupplierManageFileMapper.java
@@ -0,0 +1,15 @@
+package com.ruoyi.basic.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.basic.pojo.SupplierManageFile;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+@Mapper
+public interface SupplierManageFileMapper extends BaseMapper<SupplierManageFile> {
+
+
+    IPage<SupplierManageFile> supplierManageFileListPage(Page page, @Param("supplierManageFile") SupplierManageFile supplierManageFile);
+}
diff --git a/src/main/java/com/ruoyi/basic/pojo/Customer.java b/src/main/java/com/ruoyi/basic/pojo/Customer.java
index d68b918..511e691 100644
--- a/src/main/java/com/ruoyi/basic/pojo/Customer.java
+++ b/src/main/java/com/ruoyi/basic/pojo/Customer.java
@@ -31,6 +31,10 @@
      */
     @Excel(name = "瀹㈡埛鍚嶇О")
     private String customerName;
+    /** 瀹㈡埛鍒嗙被锛氶浂鍞鎴凤紝杩涢攢鍟嗗鎴� */
+
+    @Excel(name = "瀹㈡埛鍒嗙被")
+    private String customerType;
 
     /**
      * 绾崇◣浜鸿瘑鍒彿
diff --git a/src/main/java/com/ruoyi/basic/pojo/SupplierManage.java b/src/main/java/com/ruoyi/basic/pojo/SupplierManage.java
index 142a6f2..a18a47b 100644
--- a/src/main/java/com/ruoyi/basic/pojo/SupplierManage.java
+++ b/src/main/java/com/ruoyi/basic/pojo/SupplierManage.java
@@ -56,6 +56,9 @@
     @JsonFormat(pattern = "yyyy-MM-dd")
 //    @Excel(name = "缁存姢鏃堕棿", width = 30, dateFormat = "yyyy-MM-dd")
     private LocalDate maintainTime;
+    @Excel(name = "鏄惁鐧藉悕鍗�")
+    @ApiModelProperty(value = "鏄惁鐧藉悕鍗曪紙0鏄� 1鍚︼級")
+    private Integer isWhite;
 
     @ApiModelProperty(value = "鍒涘缓鏃堕棿")
     @TableField(fill = FieldFill.INSERT)
diff --git a/src/main/java/com/ruoyi/basic/pojo/SupplierManageFile.java b/src/main/java/com/ruoyi/basic/pojo/SupplierManageFile.java
new file mode 100644
index 0000000..31914fa
--- /dev/null
+++ b/src/main/java/com/ruoyi/basic/pojo/SupplierManageFile.java
@@ -0,0 +1,60 @@
+package com.ruoyi.basic.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 渚涘簲鍟嗙鐞�--闄勪欢
+ * supplier_manage_file
+ */
+@TableName(value = "supplier_manage_file")
+@Data
+public class SupplierManageFile implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 搴忓彿
+     */
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty(value = "鏂囦欢鍚嶇О")
+    private String name;
+
+    @ApiModelProperty(value = "鏂囦欢璺緞")
+    private String url;
+
+    @ApiModelProperty(value = "鏂囦欢澶у皬")
+    private int fileSize;
+
+    @ApiModelProperty(value = "渚涘簲鍟咺D")
+    @NotBlank(message = "渚涘簲鍟唅d涓嶈兘涓虹┖!")
+    private Long supplierId;
+
+    @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)
+    private Integer createUser;
+
+    @ApiModelProperty(value = "淇敼鐢ㄦ埛")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @ApiModelProperty(value = "绉熸埛ID")
+    @TableField(fill = FieldFill.INSERT)
+    private Long tenantId;
+
+
+}
diff --git a/src/main/java/com/ruoyi/basic/service/SupplierManageFileService.java b/src/main/java/com/ruoyi/basic/service/SupplierManageFileService.java
new file mode 100644
index 0000000..2cea459
--- /dev/null
+++ b/src/main/java/com/ruoyi/basic/service/SupplierManageFileService.java
@@ -0,0 +1,12 @@
+package com.ruoyi.basic.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.basic.pojo.SupplierManageFile;
+
+public interface SupplierManageFileService extends IService<SupplierManageFile> {
+
+
+    IPage<SupplierManageFile> supplierManageFileListPage(Page page, SupplierManageFile supplierManageFile);
+}
diff --git a/src/main/java/com/ruoyi/basic/service/impl/CustomerServiceImpl.java b/src/main/java/com/ruoyi/basic/service/impl/CustomerServiceImpl.java
index 899e21f..f24a2d2 100644
--- a/src/main/java/com/ruoyi/basic/service/impl/CustomerServiceImpl.java
+++ b/src/main/java/com/ruoyi/basic/service/impl/CustomerServiceImpl.java
@@ -74,9 +74,13 @@
         // 2. 鏋勫缓鏌ヨ鏉′欢锛堝寮虹┖鍊煎畨鍏級
         LambdaQueryWrapper<Customer> queryWrapper = new LambdaQueryWrapper<>();
         String customerName = customer.getCustomerName();
+        String customerType = customer.getCustomerType();
         if (StringUtils.isNotBlank(customerName)) {
             queryWrapper.like(Customer::getCustomerName, customerName);
         }
+        if (StringUtils.isNotBlank(customerType)) {
+            queryWrapper.like(Customer::getCustomerType, customerType);
+        }
 
         // 3. 鎵ц鍒嗛〉鏌ヨ锛堜繚鐣欏垎椤靛厓鏁版嵁锛�
         IPage<Customer> customerPage = customerMapper.selectPage(page, queryWrapper);
diff --git a/src/main/java/com/ruoyi/basic/service/impl/SupplierManageFileServiceImpl.java b/src/main/java/com/ruoyi/basic/service/impl/SupplierManageFileServiceImpl.java
new file mode 100644
index 0000000..93fe71d
--- /dev/null
+++ b/src/main/java/com/ruoyi/basic/service/impl/SupplierManageFileServiceImpl.java
@@ -0,0 +1,23 @@
+package com.ruoyi.basic.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.basic.mapper.SupplierManageFileMapper;
+import com.ruoyi.basic.pojo.SupplierManageFile;
+import com.ruoyi.basic.service.SupplierManageFileService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+@AllArgsConstructor
+@Service
+public class SupplierManageFileServiceImpl extends ServiceImpl<SupplierManageFileMapper, SupplierManageFile> implements SupplierManageFileService {
+
+    private SupplierManageFileMapper supplierManageFileMapper;
+
+    @Override
+    public IPage<SupplierManageFile> supplierManageFileListPage(Page page, SupplierManageFile supplierManageFile) {
+        return supplierManageFileMapper.supplierManageFileListPage(page, supplierManageFile);
+    }
+}
diff --git a/src/main/java/com/ruoyi/device/controller/DeviceRepairController.java b/src/main/java/com/ruoyi/device/controller/DeviceRepairController.java
index 4606c83..130e5df 100644
--- a/src/main/java/com/ruoyi/device/controller/DeviceRepairController.java
+++ b/src/main/java/com/ruoyi/device/controller/DeviceRepairController.java
@@ -1,21 +1,33 @@
 package com.ruoyi.device.controller;
 
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.approve.pojo.ApproveProcess;
+import com.ruoyi.approve.service.IApproveProcessService;
+import com.ruoyi.approve.vo.ApproveProcessVO;
+import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.device.dto.DeviceRepairDto;
 import com.ruoyi.device.pojo.DeviceLedger;
 import com.ruoyi.device.pojo.DeviceRepair;
 import com.ruoyi.device.service.IDeviceLedgerService;
 import com.ruoyi.device.service.IDeviceRepairService;
+import com.ruoyi.framework.security.LoginUser;
 import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.project.system.domain.SysDept;
+import com.ruoyi.project.system.domain.SysUser;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiModelProperty;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.ObjectUtils;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
-import java.util.ArrayList;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.Arrays;
+import java.util.List;
 
 @Api(tags = "璁惧鎶ヤ慨绠$悊")
 @RequestMapping("/device/repair")
@@ -27,6 +39,8 @@
 
     @Autowired
     private IDeviceLedgerService deviceLedgerService;
+    @Autowired
+    private IApproveProcessService approveProcessService;
 
     @ApiModelProperty("璁惧鎶ヤ慨鍒楄〃")
     @GetMapping("/page")
@@ -35,9 +49,40 @@
     }
 
     @PostMapping()
+    @Transactional(rollbackFor = Exception.class)
     @ApiModelProperty("娣诲姞璁惧鎶ヤ慨")
-    public AjaxResult add( @RequestBody DeviceRepair deviceRepair) {
-        return deviceRepairService.saveDeviceRepair(deviceRepair);
+    public AjaxResult add( @RequestBody DeviceRepair deviceRepair) throws Exception {
+        deviceRepairService.saveDeviceRepair(deviceRepair);
+        ApproveProcessVO approveProcessVO = new ApproveProcessVO();
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        SysUser user = loginUser.getUser();
+        // 鑾峰彇褰撳墠鐧诲綍鍏徃
+        Long tenantId = loginUser.getTenantId();
+        if(null != tenantId){
+            LambdaQueryWrapper<DeviceRepair> QueryWrapper = new LambdaQueryWrapper<>();
+            QueryWrapper.eq(DeviceRepair::getDeviceLedgerId,deviceRepair.getDeviceLedgerId())
+                    .eq(DeviceRepair::getRemark,deviceRepair.getRemark())
+                    .eq(DeviceRepair::getDeviceName,deviceRepair.getDeviceName())
+                    .eq(DeviceRepair::getApproverId,deviceRepair.getApproverId())
+                    .eq(DeviceRepair::getRepairTime,deviceRepair.getRepairTime());
+            DeviceRepair one = deviceRepairService.getOne(QueryWrapper);
+            if(ObjectUtils.isEmpty(one)){
+                return AjaxResult.error("璁惧鎶ヤ慨涓嶅瓨鍦�");
+            }
+            //鑾峰彇褰撳墠鐧诲綍閮ㄩ棬id
+            approveProcessVO.setApproveDeptId(tenantId);
+            //鑾峰彇褰撳墠鐧诲綍鐢ㄦ埛id
+            approveProcessVO.setApproveUser(loginUser.getUserId());
+            //鑾峰彇褰撳墠鏃堕棿
+            approveProcessVO.setApproveTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+            approveProcessVO.setApproveType(4);
+            approveProcessVO.setApproveUserIds(deviceRepair.getApproverId().toString());
+            approveProcessVO.setApproveReason(deviceRepair.getRemark());
+            approveProcessVO.setDeviceRepairId(one.getId());
+            approveProcessVO.setMaintenancePrice(deviceRepair.getMaintenancePrice());
+            approveProcessService.addApprove(approveProcessVO);
+        }
+        return AjaxResult.success();
     }
 
     @ApiModelProperty("鏍规嵁id鏌ヨ璁惧鎶ヤ慨")
@@ -62,6 +107,17 @@
     @DeleteMapping("/{ids}")
     @ApiModelProperty("鍒犻櫎璁惧鎶ヤ慨")
     public AjaxResult delete(@PathVariable("ids") Long[] ids) {
+        LambdaQueryWrapper<ApproveProcess> QueryWrapper = new LambdaQueryWrapper<>();
+        QueryWrapper.in(ApproveProcess::getDeviceRepairId,ids);
+        List<ApproveProcess> approveProcessList = approveProcessService.list(QueryWrapper);
+        if(!approveProcessList.isEmpty()){
+            approveProcessList.forEach(approveProcess -> {
+                if (approveProcess.getApproveStatus() != 0){
+                    //鎶涘嚭寮傚父
+                    throw new RuntimeException("鏈夋鍦ㄥ鐞嗕腑鐨勫鎵规祦绋嬶紝涓嶈兘鍒犻櫎");
+                }
+            });
+        }
         boolean b = deviceRepairService.removeBatchByIds(Arrays.asList(ids));
         if (!b) {
             return AjaxResult.error("鍒犻櫎澶辫触");
diff --git a/src/main/java/com/ruoyi/device/dto/DeviceRepairDto.java b/src/main/java/com/ruoyi/device/dto/DeviceRepairDto.java
index 92cfe8c..45cf329 100644
--- a/src/main/java/com/ruoyi/device/dto/DeviceRepairDto.java
+++ b/src/main/java/com/ruoyi/device/dto/DeviceRepairDto.java
@@ -3,6 +3,7 @@
 
 import com.baomidou.mybatisplus.annotation.FieldFill;
 import com.baomidou.mybatisplus.annotation.TableField;
+import com.ruoyi.framework.aspectj.lang.annotation.Excel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
@@ -68,7 +69,7 @@
     @ApiModelProperty("绉熸埛id")
     @TableField(fill = FieldFill.INSERT)
     private Long tenantId;
-
-
+    @ApiModelProperty("缁翠慨浠锋牸")
+    private String maintenancePrice;
 }
 
diff --git a/src/main/java/com/ruoyi/device/pojo/DeviceRepair.java b/src/main/java/com/ruoyi/device/pojo/DeviceRepair.java
index 7ecb5f5..8b4dbbc 100644
--- a/src/main/java/com/ruoyi/device/pojo/DeviceRepair.java
+++ b/src/main/java/com/ruoyi/device/pojo/DeviceRepair.java
@@ -4,10 +4,9 @@
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonFormat;
-import io.swagger.annotations.Api;
+import com.ruoyi.framework.aspectj.lang.annotation.Excel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
-import nonapi.io.github.classgraph.json.Id;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import java.math.BigDecimal;
@@ -24,9 +23,9 @@
 
     @ApiModelProperty("璁惧鍙拌处id")
     private Long deviceLedgerId;
-
+    @ApiModelProperty("璁惧鍚嶇О")
     private String deviceName;
-
+    @ApiModelProperty("璁惧鍨嬪彿")
     private String deviceModel;
 
     @ApiModelProperty("鎶ヤ慨鏃堕棿")
@@ -49,7 +48,7 @@
     @ApiModelProperty("缁翠慨缁撴灉")
     private String maintenanceResult;
 
-    @ApiModelProperty("鐘舵�� 0 寰呯淮淇� 1瀹岀粨 2 澶辫触")
+    @ApiModelProperty("鐘舵��:0瀹℃牳涓�,1瀹℃牳閫氳繃,2瀹℃牳澶辫触,3缁翠慨涓�,4缁翠慨閫氳繃,5缁翠慨澶辫触")
     private Integer status;
 
     @ApiModelProperty("鍒涘缓鏃堕棿")
@@ -75,6 +74,8 @@
     @ApiModelProperty("绉熸埛id")
     @TableField(fill = FieldFill.INSERT)
     private Long tenantId;
-
-
+    @ApiModelProperty("缁翠慨浠锋牸")
+    private BigDecimal maintenancePrice;
+    @ApiModelProperty("瀹℃壒浜篿d")
+    private Integer approverId;
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementExceptionRecordController.java b/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementExceptionRecordController.java
new file mode 100644
index 0000000..d9bc6fc
--- /dev/null
+++ b/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementExceptionRecordController.java
@@ -0,0 +1,46 @@
+package com.ruoyi.procurementrecord.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+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.procurementrecord.dto.*;
+import com.ruoyi.procurementrecord.mapper.ProcurementExceptionRecordMapper;
+import com.ruoyi.procurementrecord.pojo.ProcurementExceptionRecord;
+import com.ruoyi.procurementrecord.service.ProcurementRecordService;
+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;
+
+/**
+ * @author :yys
+ * @date : 2025/7/7 14:32
+ */
+@RestController
+@Api(tags = "閲囪喘寮傚父璁板綍")
+@RequestMapping("/procurementExceptionRecord")
+public class ProcurementExceptionRecordController extends BaseController {
+
+
+    @Autowired
+    private ProcurementExceptionRecordMapper procurementExceptionRecordMapper;
+
+    @PostMapping("/add")
+    @Transactional
+    public AjaxResult add(@RequestBody ProcurementExceptionRecord procurementExceptionRecord) {
+        return AjaxResult.success(procurementExceptionRecordMapper.insert(procurementExceptionRecord));
+    }
+
+    @PostMapping("/update")
+    @Transactional
+    public AjaxResult updatePro(@RequestBody ProcurementExceptionRecord procurementExceptionRecord) {
+        return AjaxResult.success(procurementExceptionRecordMapper.updateById(procurementExceptionRecord));
+    }
+}
diff --git a/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java b/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java
index 7ea2430..1795c15 100644
--- a/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java
+++ b/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java
@@ -119,7 +119,11 @@
         IPage<ProcurementPageDto> result = procurementRecordService.listPage(page, procurementDto);
         return AjaxResult.success(result);
     }
-
+    @GetMapping("/listReport")
+    @ApiOperation(value = "鏌ヨ搴撳瓨鍥捐〃鏁版嵁")
+    public AjaxResult listReport() {
+        return AjaxResult.success(procurementRecordService.getReportList());
+    }
     @GetMapping("/listPageByProduction")
     @Log(title = "鐢熶骇鍏ュ簱-鍏ュ簱绠$悊-鍏ュ簱鏌ヨ", businessType = BusinessType.OTHER)
     @ApiOperation(value = "鍏ュ簱鏌ヨ")
diff --git a/src/main/java/com/ruoyi/procurementrecord/dto/InventoryInformationDto.java b/src/main/java/com/ruoyi/procurementrecord/dto/InventoryInformationDto.java
new file mode 100644
index 0000000..2396b29
--- /dev/null
+++ b/src/main/java/com/ruoyi/procurementrecord/dto/InventoryInformationDto.java
@@ -0,0 +1,28 @@
+package com.ruoyi.procurementrecord.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 瀛樿揣鏍哥畻淇℃伅Dto-璧勪骇鎶ヨ〃
+ */
+@Data
+public class InventoryInformationDto {
+    /**
+     * 鎬诲簱瀛樻暟閲�
+     */
+    private Integer totalInventoryCount;
+    /**
+     * 鎬诲簱瀛橀噾棰�
+     */
+    private BigDecimal totalInventoryValue;
+    /**
+     * 搴撳瓨鍙樺姩鏁伴噺
+     */
+    private Integer inventoryChangeCount;
+    /**
+     * 搴撳瓨鍙樺姩閲戦
+     */
+    private BigDecimal inventoryChangeValue;
+}
diff --git a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementAddDto.java b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementAddDto.java
index d3f35a1..98ea4eb 100644
--- a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementAddDto.java
+++ b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementAddDto.java
@@ -21,5 +21,6 @@
     private Integer type;
 
     private String typeName;
+    private Integer purchaseLedgerId;
 
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementExceptionRecordMapper.java b/src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementExceptionRecordMapper.java
new file mode 100644
index 0000000..31dd4dc
--- /dev/null
+++ b/src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementExceptionRecordMapper.java
@@ -0,0 +1,9 @@
+package com.ruoyi.procurementrecord.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.procurementrecord.pojo.ProcurementExceptionRecord;
+
+
+public interface ProcurementExceptionRecordMapper extends BaseMapper<ProcurementExceptionRecord> {
+
+}
diff --git a/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java b/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java
index 1b699ef..8e68c64 100644
--- a/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java
+++ b/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java
@@ -57,4 +57,5 @@
     int updateManagementByCustom(ProcurementManagementUpdateDto procurementDto);
 
     BigDecimal getProcurementAmount(Long salesProductId);
+    InventoryInformationDto getReportList();
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
index fdd9c7c..3820823 100644
--- a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
@@ -416,6 +416,68 @@
     }
 
     @Override
+    public InventoryInformationDto getReportList() {
+        InventoryInformationDto inventoryInformationDto = new InventoryInformationDto();
+        IPage<ProcurementPageDto> procurementPageDtoIPage = this.listPage(new Page<>(1, -1), new ProcurementPageDto());
+        if(CollectionUtils.isEmpty(procurementPageDtoIPage.getRecords())){
+            return inventoryInformationDto;
+        }
+        // 璁$畻鎬诲簱瀛樻暟閲�
+        inventoryInformationDto.setTotalInventoryCount(procurementPageDtoIPage.getRecords().stream()
+                .map(ProcurementPageDto::getInboundNum0)
+                .reduce(BigDecimal.ZERO, BigDecimal::add)
+                .intValue());
+        // 璁$畻鎬诲簱瀛橀噾棰�-ProcurementPageDto閲屾瘡涓璞$殑inboundNum0鍊煎拰taxInclusiveUnitPrice鐨勪箻绉紝涔嬪悗鐩稿姞寰楀埌鎬诲簱瀛橀噾棰�
+        BigDecimal totalInventoryValue = procurementPageDtoIPage.getRecords().stream()
+                // 杩囨护绌哄璞★紝閬垮厤NPE
+                .filter(Objects::nonNull)
+                // 澶勭悊姣忎釜瀵硅薄鐨勭┖鍊硷細null杞负0
+                .map(dto -> {
+                    // 鍏ュ簱鏁伴噺锛歯ull 鈫� 0
+                    BigDecimal inboundNum0 = Optional.ofNullable(dto.getInboundNum0()).orElse(BigDecimal.ZERO);
+                    // 鍚◣鍗曚环锛歯ull 鈫� 0
+                    BigDecimal taxInclusiveUnitPrice = Optional.ofNullable(dto.getTaxInclusiveUnitPrice()).orElse(BigDecimal.ZERO);
+                    // 璁$畻鍗曚釜瀵硅薄鐨勫簱瀛橀噾棰濓細鏁伴噺 脳 鍚◣鍗曚环
+                    return inboundNum0.multiply(taxInclusiveUnitPrice);
+                })
+                // 鎵�鏈夊崟涓噾棰濇眰鍜岋紝鍒濆鍊间负0
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+        // 璁剧疆鎬诲簱瀛橀噾棰�
+        inventoryInformationDto.setTotalInventoryValue(totalInventoryValue);
+        // 璁$畻搴撳瓨鍙樺姩鏁伴噺-ProcurementPageDto閲屾瘡涓璞$殑inboundNum鍊煎拰inboundNum0鍊肩殑宸�硷紝涔嬪悗鐩稿姞寰楀埌搴撳瓨鍙樺姩鏁伴噺
+        inventoryInformationDto.setInventoryChangeCount(procurementPageDtoIPage.getRecords().stream()
+                // 杩囨护绌哄璞★紝閬垮厤NPE
+                .filter(Objects::nonNull)
+                // 澶勭悊姣忎釜瀵硅薄鐨勭┖鍊硷細null杞负0
+                .map(dto -> {
+                    // 鍏ュ簱鏁伴噺锛歯ull 鈫� 0
+                    BigDecimal inboundNum = Optional.ofNullable(dto.getInboundNum()).orElse(BigDecimal.ZERO);
+                    // 寰呭嚭搴撴暟閲忥細null 鈫� 0
+                    BigDecimal inboundNum0 = Optional.ofNullable(dto.getInboundNum0()).orElse(BigDecimal.ZERO);
+                    // 璁$畻鍗曚釜瀵硅薄鐨勫簱瀛樺彉鍔ㄦ暟閲忥細鏁伴噺 - 寰呭嚭搴撴暟閲�
+                    return inboundNum.subtract(inboundNum0);
+                })
+                // 鎵�鏈夊崟涓彉鍔ㄦ暟閲忔眰鍜岋紝鍒濆鍊间负0
+                .reduce(BigDecimal.ZERO, BigDecimal::add)
+                .intValue());
+        // 璁$畻搴撳瓨鍙樺姩閲戦ProcurementPageDto閲屾瘡涓璞$殑taxInclusiveTotalPrice鍊肩殑鍜�
+        BigDecimal inventoryChangeValue = procurementPageDtoIPage.getRecords().stream()
+                // 杩囨护绌哄璞★紝閬垮厤NPE
+                .filter(Objects::nonNull)
+                // 澶勭悊姣忎釜瀵硅薄鐨勭┖鍊硷細null杞负0
+                .map(dto -> {
+                    // 鍚◣鎬讳环锛歯ull 鈫� 0
+                    BigDecimal taxInclusiveTotalPrice = Optional.ofNullable(dto.getTaxInclusiveTotalPrice()).orElse(BigDecimal.ZERO);
+                    // 璁$畻鍗曚釜瀵硅薄鐨勫叆搴撳簱瀛橀噾棰濓細鍚◣鎬讳环
+                    return taxInclusiveTotalPrice;
+                })
+                // 鎵�鏈夊崟涓彉鍔ㄩ噾棰濇眰鍜岋紝鍒濆鍊间负0
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+        // 璁剧疆搴撳瓨鍙樺姩閲戦
+        inventoryInformationDto.setInventoryChangeValue(inventoryChangeValue.subtract(totalInventoryValue));
+        return inventoryInformationDto;
+    }
+    @Override
     public IPage<ProcurementPageDto> listPageByProduction(Page page, ProcurementPageDto procurementDto) {
         IPage<ProcurementPageDto> procurementPageDtoIPage = procurementRecordMapper.listPageByProduction(page, procurementDto);
         List<ProcurementPageDto> procurementPageDtos = procurementPageDtoIPage.getRecords();
diff --git a/src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java b/src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java
index fca4277..3e120d1 100644
--- a/src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java
+++ b/src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java
@@ -1,5 +1,6 @@
 package com.ruoyi.purchase.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;
@@ -11,6 +12,8 @@
 import com.ruoyi.purchase.dto.PurchaseLedgerDto;
 import com.ruoyi.purchase.pojo.PurchaseLedger;
 import com.ruoyi.purchase.service.IPurchaseLedgerService;
+import com.ruoyi.sales.pojo.SalesLedgerProduct;
+import com.ruoyi.sales.service.ISalesLedgerProductService;
 import com.ruoyi.sales.service.ISalesLedgerService;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
@@ -19,6 +22,7 @@
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 閲囪喘鍙拌处Controller
@@ -33,6 +37,7 @@
     private IPurchaseLedgerService purchaseLedgerService;
 
     private ISalesLedgerService salesLedgerService;
+    private ISalesLedgerProductService salesLedgerProductService;
 
     /**
      * 鏌ヨ閲囪喘鍙拌处鍒楄〃
@@ -77,7 +82,41 @@
     public AjaxResult addOrEditPurchase(@RequestBody PurchaseLedgerDto purchaseLedgerDto) throws IOException {
         return toAjax(purchaseLedgerService.addOrEditPurchase(purchaseLedgerDto));
     }
+    /**
+     * 鏂板閲囪喘妯℃澘
+     */
+    @PostMapping("/addPurchaseTemplate")
+    public AjaxResult addPurchaseTemplate(@RequestBody PurchaseLedgerDto purchaseLedgerDto) throws IOException {
+        return toAjax(purchaseLedgerService.addPurchaseTemplate(purchaseLedgerDto));
+    }
+    /**
+     * 鏌ヨ閲囪喘妯℃澘
+     */
+    @GetMapping("/getPurchaseTemplateList")
+    public AjaxResult getPurchaseTemplateList() {
+        PurchaseLedgerDto purchaseLedgerDto = new PurchaseLedgerDto();
+        purchaseLedgerDto.setApprovalStatus(3);
+        IPage<PurchaseLedgerDto> purchaseLedgerDtoIPage = purchaseLedgerService.selectPurchaseLedgerListPage(new Page(1, -1), purchaseLedgerDto);
+        List<PurchaseLedgerDto> purchaseLedgers = purchaseLedgerDtoIPage.getRecords();
 
+        purchaseLedgers.forEach(purchaseLedgerDto1 -> {
+            LambdaQueryWrapper<SalesLedgerProduct> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.eq(SalesLedgerProduct::getSalesLedgerId, purchaseLedgerDto1.getId())
+                    .eq(SalesLedgerProduct::getType, 2);
+            List<SalesLedgerProduct> list = salesLedgerProductService.list(queryWrapper);
+            if (!list.isEmpty()) {
+                purchaseLedgerDto1.setProductData(list);
+            }
+        });
+        return AjaxResult.success(purchaseLedgers);
+    }
+    /**
+     * 淇敼閲囪喘鍙拌处瀹℃壒鐘舵��
+     */
+    @PostMapping("/updateApprovalStatus")
+    public AjaxResult addOrEditPurchase(@RequestBody PurchaseLedger purchaseLedger){
+        return toAjax(purchaseLedgerService.updateById(purchaseLedger));
+    }
     /**
      * 鏌ヨ閲囪喘鍙拌处鍜屼骇鍝佺埗瀛愬垪琛�
      */
@@ -149,7 +188,10 @@
      */
     @GetMapping("/listPage")
     public AjaxResult listPage(Page page, PurchaseLedgerDto purchaseLedger) {
-         return AjaxResult.success(purchaseLedgerService.selectPurchaseLedgerListPage(page ,purchaseLedger));
+        IPage<PurchaseLedgerDto> purchaseLedgerDtoIPage = purchaseLedgerService.selectPurchaseLedgerListPage(page ,purchaseLedger);
+        //杩囨护鎺塧pprovalStatus=3鐨勮褰�
+        purchaseLedgerDtoIPage.getRecords().removeIf(purchaseLedgerDto -> purchaseLedgerDto.getApprovalStatus() == 3);
+         return AjaxResult.success(purchaseLedgerDtoIPage);
     }
 
     @ApiOperation("鐢熸垚閲囪喘搴忓垪鍙�")
diff --git a/src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java b/src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java
index 7d1e9e5..4808080 100644
--- a/src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java
+++ b/src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java
@@ -40,6 +40,11 @@
      */
     @Excel(name = "渚涘簲鍟嗗悕绉�")
     private String supplierName;
+     /**
+     * 鏄惁鐧藉悕鍗�
+     */
+    @Excel(name = "鏄惁鐧藉悕鍗�")
+    private Integer isWhite;
 
     /**
      * 褰曞叆浜哄鍚峣d
@@ -180,5 +185,10 @@
 
     @ApiModelProperty(value = "浠樻鏂瑰紡")
     private String paymentMethod;
-
+    @ApiModelProperty("瀹℃壒鐘舵��")
+    private Integer approvalStatus;
+    @ApiModelProperty(value = "妯℃澘鍚嶇О")
+    private String templateName;
+    @ApiModelProperty(value = "瀹℃壒浜篿d")
+    private Integer approverId;
 }
diff --git a/src/main/java/com/ruoyi/purchase/pojo/PurchaseLedger.java b/src/main/java/com/ruoyi/purchase/pojo/PurchaseLedger.java
index 7b7ad72..838976d 100644
--- a/src/main/java/com/ruoyi/purchase/pojo/PurchaseLedger.java
+++ b/src/main/java/com/ruoyi/purchase/pojo/PurchaseLedger.java
@@ -148,10 +148,14 @@
     @TableField(exist = false)
     private Integer type;
 
-
-
     @ApiModelProperty(value = "浠樻鏂瑰紡")
     private String paymentMethod;
+    @ApiModelProperty("瀹℃壒鐘舵��")
+    private Integer approvalStatus;
 
+    @ApiModelProperty(value = "妯℃澘鍚嶇О")
+    private String templateName;
+    @ApiModelProperty(value = "瀹℃壒浜篿d")
+    private Integer approverId;
 
 }
diff --git a/src/main/java/com/ruoyi/purchase/service/IPurchaseLedgerService.java b/src/main/java/com/ruoyi/purchase/service/IPurchaseLedgerService.java
index 3979810..c0eb379 100644
--- a/src/main/java/com/ruoyi/purchase/service/IPurchaseLedgerService.java
+++ b/src/main/java/com/ruoyi/purchase/service/IPurchaseLedgerService.java
@@ -39,4 +39,6 @@
     List<InvoiceRegistrationProduct> getProductBySalesNo(Long id);
 
     String getPurchaseNo();
+
+    int addPurchaseTemplate(PurchaseLedgerDto purchaseLedgerDto) throws IOException;
 }
diff --git a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
index bc9f375..7453caf 100644
--- a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -122,7 +122,49 @@
         }
         return purchaseLedgerMapper.selectList(queryWrapper);
     }
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int addPurchaseTemplate(PurchaseLedgerDto purchaseLedgerDto)throws IOException {
+        //褰曞叆浜�
+        SysUser sysUser = userMapper.selectUserById(purchaseLedgerDto.getRecorderId());
 
+        SupplierManage supplierManage = supplierManageMapper.selectById(purchaseLedgerDto.getSupplierId());
+        PurchaseLedger purchaseLedger = new PurchaseLedger();
+//        BeanUtils.copyProperties(purchaseLedger,purchaseLedgerDto);
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        if(ObjectUtils.isNotEmpty(loginUser) && null != loginUser.getTenantId()) {
+            purchaseLedger.setTenantId(loginUser.getTenantId());
+        }
+        purchaseLedger.setPaymentMethod(purchaseLedgerDto.getPaymentMethod());
+        purchaseLedger.setRecorderId(purchaseLedgerDto.getRecorderId());
+        purchaseLedger.setSupplierId(purchaseLedgerDto.getSupplierId());
+        purchaseLedger.setTemplateName(purchaseLedgerDto.getTemplateName());
+//        purchaseLedger.setSalesLedgerPId(purchaseLedgerDto.getSalesLedgerId());
+        purchaseLedger.setApprovalStatus(3);
+        purchaseLedger.setSupplierName(supplierManage.getSupplierName());
+        purchaseLedger.setRecorderName(sysUser.getNickName());
+        purchaseLedger.setPhoneNumber(sysUser.getPhonenumber());
+        purchaseLedger.setPurchaseContractNumber(UUID.randomUUID().toString().replaceAll("-", ""));
+        purchaseLedger.setEntryDate(Date.from(LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toInstant()));
+        int insert = purchaseLedgerMapper.insert(purchaseLedger);
+
+        LambdaQueryWrapper<PurchaseLedger> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(PurchaseLedger::getSupplierName, purchaseLedger.getSupplierName())
+                .eq(PurchaseLedger::getPurchaseContractNumber, purchaseLedger.getPurchaseContractNumber())
+                .eq(PurchaseLedger::getApprovalStatus,3);
+        PurchaseLedger purchaseLedger1 = purchaseLedgerMapper.selectOne(queryWrapper);
+
+        if(ObjectUtils.isNotEmpty(purchaseLedgerDto.getProductData())) {
+            // 4. 澶勭悊瀛愯〃鏁版嵁
+            List<SalesLedgerProduct> salesLedgerProductList = purchaseLedgerDto.getProductData();
+            salesLedgerProductList.forEach(salesLedgerProduct -> {
+                salesLedgerProduct.setSalesLedgerId(purchaseLedger1.getId());
+                salesLedgerProduct.setType(2);
+            });
+            salesLedgerProductList.forEach(salesLedgerProductMapper::insert);
+        }
+        return insert;
+    }
     @Override
     @Transactional(rollbackFor = Exception.class)
     public int addOrEditPurchase(PurchaseLedgerDto purchaseLedgerDto) throws IOException {
@@ -169,7 +211,7 @@
             PurchaseLedger purchaseLedgerDB = purchaseLedgerMapper.selectById(purchaseLedger.getId());
             List<AccountExpense> accountExpenseDBs = accountExpenseService.getByInvoiceNumberList(purchaseLedger.getPurchaseContractNumber());
             if (!CollectionUtils.isEmpty(accountExpenseDBs)) {
-                accountExpenseDBs.forEach(accountExpenseDB -> {
+                accountExpenseDBs.forEach(accountExpenseDB ->{
                     accountExpenseDB.setExpenseDate(purchaseLedgerDB.getEntryDate());
                     accountExpenseDB.setExpenseType("0");
                     accountExpenseDB.setSupplierName(purchaseLedgerDB.getSupplierName());
@@ -383,7 +425,7 @@
     @Override
     public int deletePurchaseLedgerByIds(Long[] ids) {
         if (ids == null || ids.length == 0) {
-            throw new BaseException("璇烽�変腑鑷冲皯涓�鏉℃暟鎹�");
+           throw new BaseException("璇烽�変腑鑷冲皯涓�鏉℃暟鎹�");
         }
         // 鎵归噺鍒犻櫎鍏宠仈鐨勯噰璐彴璐︿骇鍝�
         LambdaQueryWrapper<SalesLedgerProduct> queryWrapper = new LambdaQueryWrapper<>();
@@ -392,11 +434,11 @@
         salesLedgerProductMapper.delete(queryWrapper);
         // 鎵归噺鍒犻櫎鍏宠仈鐨勯噰璐彴璐︾殑鏉ョエ鐧昏
         LambdaQueryWrapper<TicketRegistration> ticketRegistrationLambdaQueryWrapper = new LambdaQueryWrapper<>();
-        ticketRegistrationLambdaQueryWrapper.in(TicketRegistration::getPurchaseLedgerId, ids);
+        ticketRegistrationLambdaQueryWrapper.in(TicketRegistration::getSalesLedgerId,ids);
         ticketRegistrationMapper.delete(ticketRegistrationLambdaQueryWrapper);
         // 鎵归噺鍒犻櫎鍏宠仈鐨勯噰璐彴璐︾殑鏉ョエ鐧昏璁板綍
         LambdaQueryWrapper<ProductRecord> productRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
-        productRecordLambdaQueryWrapper.in(ProductRecord::getPurchaseLedgerId, ids);
+        productRecordLambdaQueryWrapper.in(ProductRecord::getPurchaseLedgerId,ids);
         productRecordMapper.delete(productRecordLambdaQueryWrapper);
         // 鎵归噺鍒犻櫎浠樻鐧昏
         LambdaQueryWrapper<PaymentRegistration> paymentRegistrationLambdaQueryWrapper = new LambdaQueryWrapper<>();
@@ -439,7 +481,7 @@
         // 3.鏌ヨ涓婁紶鏂囦欢
         LambdaQueryWrapper<CommonFile> salesLedgerFileWrapper = new LambdaQueryWrapper<>();
         salesLedgerFileWrapper.eq(CommonFile::getCommonId, purchaseLedger.getId())
-                .eq(CommonFile::getType, FileNameType.PURCHASE.getValue());
+                .eq(CommonFile::getType,FileNameType.PURCHASE.getValue());
         List<CommonFile> salesLedgerFiles = commonFileMapper.selectList(salesLedgerFileWrapper);
 
         // 4. 杞崲 DTO
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..c498b93 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,20 @@
 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.apache.commons.collections4.CollectionUtils;
 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 +38,10 @@
 
     @Autowired
     private ShippingInfoService shippingInfoService;
+    @Autowired
+    private ShipmentApprovalMapper shipmentApprovalMapper;
+    @Autowired
+    private ISalesLedgerProductService salesLedgerProductService;
 
 
     @GetMapping("/listPage")
@@ -41,8 +53,33 @@
 
     @PostMapping("/add")
     @ApiOperation("娣诲姞鍙戣揣淇℃伅")
+    @Transactional(rollbackFor = Exception.class)
     public AjaxResult add(@RequestBody ShippingInfo req) {
+        LambdaQueryWrapper<ShippingInfo> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(ShippingInfo::getSalesLedgerId, req.getSalesLedgerId());
+        wrapper.eq(ShippingInfo::getSalesLedgerProductId, req.getSalesLedgerProductId());
+        List<ShippingInfo> list = shippingInfoService.list(wrapper);
+        if(!CollectionUtils.isEmpty(list)){
+            return AjaxResult.error("鍙戣揣淇℃伅宸插瓨鍦�");
+        }
         boolean save = shippingInfoService.save(req);
+        if(save){
+            ShippingInfo shippingInfo = shippingInfoService.getOne(wrapper);
+            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 35b7488..955f4da 100644
--- a/src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
+++ b/src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
@@ -140,5 +140,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 8eacb60..f35b916 100644
--- a/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
+++ b/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
@@ -12,6 +12,7 @@
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
+import java.util.Date;
 
 /**
  * 浜у搧淇℃伅瀵硅薄 sales_ledger_product
@@ -184,4 +185,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 515bee2..1dafbe4 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -12,10 +12,12 @@
 import com.ruoyi.sales.mapper.InvoiceRegistrationProductMapper;
 import com.ruoyi.sales.mapper.SalesLedgerMapper;
 import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
+import com.ruoyi.sales.pojo.InvoiceRegistrationProduct;
 import com.ruoyi.sales.pojo.SalesLedger;
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
 import com.ruoyi.sales.service.ISalesLedgerProductService;
 import lombok.AllArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
@@ -24,10 +26,7 @@
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Objects;
-import java.util.Set;
+import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -66,11 +65,11 @@
 
     @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);
-        if (!CollectionUtils.isEmpty(salesLedgerProducts)) {
+//        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());
             List<InvoiceRegistrationProductDto> invoiceRegistrationProductDtoList = invoiceRegistrationProductMapper.invoiceRegistrationProductList(invoiceRegistrationProductDto);
@@ -80,8 +79,8 @@
                     BigDecimal invoiceNum = BigDecimal.ZERO;
                     BigDecimal invoiceAmount = BigDecimal.ZERO;
                     for (InvoiceRegistrationProductDto registrationProductDto : invoiceRegistrationProductDtoList) {
-                        if (ledgerProduct.getId().intValue() == registrationProductDto.getSalesLedgerProductId()) {
-                            invoiceNum = invoiceNum.add(registrationProductDto.getInvoiceNum());
+                        if(ledgerProduct.getId().intValue() == registrationProductDto.getSalesLedgerProductId()){
+                            invoiceNum =  invoiceNum.add(registrationProductDto.getInvoiceNum());
                             invoiceAmount = invoiceAmount.add(registrationProductDto.getInvoiceAmount());
                         }
                     }
@@ -104,7 +103,7 @@
         // 1. 鍏堟煡璇㈣鍒犻櫎鐨勫瓙琛ㄨ褰曪紝鑾峰彇瀵瑰簲鐨� salesLedgerId
         List<SalesLedgerProduct> deletedProducts = salesLedgerProductMapper.selectBatchIds(Arrays.asList(ids));
         if (deletedProducts.isEmpty()) {
-            return 0;
+            return 0; // 娌℃湁鍙垹闄ょ殑鏁版嵁
         }
 
         // 鍙兘灞炰簬澶氫釜涓昏〃
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/basic/SupplierManageFileMapper.xml b/src/main/resources/mapper/basic/SupplierManageFileMapper.xml
new file mode 100644
index 0000000..265c9a4
--- /dev/null
+++ b/src/main/resources/mapper/basic/SupplierManageFileMapper.xml
@@ -0,0 +1,9 @@
+<?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.basic.mapper.SupplierManageFileMapper">
+    <select id="supplierManageFileListPage" resultType="com.ruoyi.basic.pojo.SupplierManageFile">
+        select *
+        from supplier_manage_file
+        where supplier_id = #{supplierManageFile.supplierId}
+    </select>
+</mapper>
diff --git a/src/main/resources/mapper/basic/SupplierManageMapper.xml b/src/main/resources/mapper/basic/SupplierManageMapper.xml
index 9e65903..ba7fac3 100644
--- a/src/main/resources/mapper/basic/SupplierManageMapper.xml
+++ b/src/main/resources/mapper/basic/SupplierManageMapper.xml
@@ -22,12 +22,16 @@
         T1.update_time,
         T1.update_user,
         T1.tenant_id,
+        T1.is_white,
         T2.nick_name AS maintainUserName
         FROM supplier_manage T1
         LEFT JOIN sys_user T2 ON T1.maintain_user_id = T2.user_id
         <where>
             <if test="supplierManageDto.supplierName != null and supplierManageDto.supplierName != '' ">
                 AND T1.supplier_name LIKE CONCAT('%',#{supplierManageDto.supplierName},'%')
+            </if>
+            <if test="supplierManageDto.isWhite != null">
+                AND T1.is_white = #{supplierManageDto.isWhite}
             </if>
         </where>
     </select>
@@ -50,6 +54,7 @@
         T1.update_time,
         T1.update_user,
         T1.tenant_id,
+        T1.is_white,
         T2.nick_name AS maintainUserName
         FROM supplier_manage T1
         LEFT JOIN sys_user T2 ON T1.maintain_user_id = T2.user_id
@@ -57,6 +62,9 @@
             <if test="supplierManageDto.supplierName != null and supplierManageDto.supplierName != '' ">
                 AND T1.supplier_name LIKE CONCAT('%',#{supplierManageDto.supplierName},'%')
             </if>
+            <if test="supplierManageDto.isWhite != null">
+                AND T1.is_white = #{supplierManageDto.isWhite}
+            </if>
         </where>
     </select>
 
diff --git a/src/main/resources/mapper/device/DeviceRepairMapper.xml b/src/main/resources/mapper/device/DeviceRepairMapper.xml
index d093980..8969d0c 100644
--- a/src/main/resources/mapper/device/DeviceRepairMapper.xml
+++ b/src/main/resources/mapper/device/DeviceRepairMapper.xml
@@ -14,6 +14,7 @@
                 dr.maintenance_name,
                 dr.maintenance_time,
                 dr.maintenance_result,
+                dr.maintenance_price,
                 dr.status,
                 dr.create_time,
                 dr.update_time,
@@ -59,6 +60,7 @@
                dr.maintenance_name,
                dr.maintenance_time,
                dr.maintenance_result,
+               dr.maintenance_price,
                dr.status,
                dr.create_time,
                dr.update_time,
diff --git a/src/main/resources/mapper/measuringinstrumentledger/SparePartsMapper.xml b/src/main/resources/mapper/measuringinstrumentledger/SparePartsMapper.xml
index 2968e9a..611d51e 100644
--- a/src/main/resources/mapper/measuringinstrumentledger/SparePartsMapper.xml
+++ b/src/main/resources/mapper/measuringinstrumentledger/SparePartsMapper.xml
@@ -2,11 +2,12 @@
         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.ruoyi.measuringinstrumentledger.mapper.SparePartsMapper">
     <select id="listPage" resultType="com.ruoyi.measuringinstrumentledger.dto.SparePartsDto">
-        select sp.*,sp1.name as parentName from spare_parts sp
+        select sp.*,sp1.name as parentName
+        from spare_parts sp
         left join spare_parts sp1 on sp1.id = sp.parent_id
         <where>
-            <if test="spareParts.name != null">
-                and name like concat('%',#{spareParts.name},'%')
+            <if test="spareParts.name != null and spareParts.name != ''">
+                and sp.name like concat('%',#{spareParts.name},'%')
             </if>
         </where>
     </select>
diff --git a/src/main/resources/mapper/procurementrecord/ProcurementExceptionRecordMapper.xml b/src/main/resources/mapper/procurementrecord/ProcurementExceptionRecordMapper.xml
new file mode 100644
index 0000000..3363ce7
--- /dev/null
+++ b/src/main/resources/mapper/procurementrecord/ProcurementExceptionRecordMapper.xml
@@ -0,0 +1,5 @@
+<?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.procurementrecord.mapper.ProcurementExceptionRecordMapper">
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml b/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
index 6119edd..cffeca8 100644
--- a/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
+++ b/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
@@ -137,6 +137,7 @@
         sum(t1.total_price) as totalPrice,
         sum(t1.inbound_num) as inboundNum,
         sum(t1.inbound_num) as inboundNum0,
+        t1.inbound_num as totalInboundNum,
         t1.create_time,
         t1.update_time,
         t1.create_by,
@@ -171,7 +172,7 @@
                 and t1.create_time &lt;= #{req.endDate}
             </if>
         </where>
-        group by t2.product_category,t2.specification_model,t1.unit_price
+        group by t3.supplier_name,t2.product_category,t2.specification_model,t1.unit_price
         order by t1.create_time desc
     </select>
     <select id="listCopy" resultType="com.ruoyi.procurementrecord.dto.ProcurementPageDtoCopy">
diff --git a/src/main/resources/mapper/purchase/ProductRecordMapper.xml b/src/main/resources/mapper/purchase/ProductRecordMapper.xml
index 5c338d7..2c0cba4 100644
--- a/src/main/resources/mapper/purchase/ProductRecordMapper.xml
+++ b/src/main/resources/mapper/purchase/ProductRecordMapper.xml
@@ -28,10 +28,10 @@
         left join product_model pm on pm.id = pr.product_model_id
         WHERE type = 2
         <if test="c.salesContractNo != null and c.salesContractNo != ''">
-            and sl.sales_contract_no = #{c.salesContractNo}
+            and sl.sales_contract_no like concat('%',#{c.salesContractNo},'%')
         </if>
         <if test="c.supplierName != null and c.supplierName != ''">
-            and pl.supplier_name = #{c.supplierName}
+            and pl.supplier_name like concat('%',#{c.supplierName},'%')
         </if>
         <if test="c.createdAtStart != null and c.createdAtStart != ''">
             and pr.created_at &gt;= date_format(#{c.createdAtStart},'%Y-%m-%d hh:mm:ss')
diff --git a/src/main/resources/mapper/purchase/PurchaseLedgerMapper.xml b/src/main/resources/mapper/purchase/PurchaseLedgerMapper.xml
index 9368d70..b513ac1 100644
--- a/src/main/resources/mapper/purchase/PurchaseLedgerMapper.xml
+++ b/src/main/resources/mapper/purchase/PurchaseLedgerMapper.xml
@@ -14,21 +14,30 @@
         pl.id,
         pl.purchase_contract_number ,
         pl.sales_contract_no,
+        pl.supplier_id,
         pl.supplier_name,
         pl.project_name,
         pl.contract_amount,
         sum(pr.tickets_amount)as receipt_payment_amount,
         pl.contract_amount-sum(pr.tickets_amount) AS unReceipt_payment_amount,
         pl.entry_date,
-        pl.execution_date,
+        pl.recorder_id,
         pl.recorder_name,
+        pl.template_name,
+        pl.approver_id,
+        sm.is_white,
+        pl.approval_status,
         pl.payment_method
         from purchase_ledger pl
         left join product_record pr on pl.id = pr.purchase_ledger_id
+        left join supplier_manage sm on pl.supplier_id = sm.id
         <where>
             1 = 1
             <if test="c.purchaseContractNumber != null and c.purchaseContractNumber != ''">
                and pl.purchase_contract_number like concat('%',#{c.purchaseContractNumber},'%')
+            </if>
+            <if test="c.approvalStatus != null and c.approvalStatus != ''">
+                and pl.approval_status = #{c.approvalStatus}
             </if>
             <if test="c.supplierName != null and c.supplierName != ''">
                 and pl.supplier_name like concat('%',#{c.supplierName},'%')
@@ -51,6 +60,7 @@
         pl.recorder_name,
         pl.contract_amount
         order by pl.entry_date desc
+
     </select>
     <select id="getPaymentRegistrationDtoById" resultType="com.ruoyi.purchase.dto.PaymentRegistrationDto">
         SELECT
diff --git a/src/main/resources/mapper/quality/QualityInspectMapper.xml b/src/main/resources/mapper/quality/QualityInspectMapper.xml
index dc3048e..4e8a057 100644
--- a/src/main/resources/mapper/quality/QualityInspectMapper.xml
+++ b/src/main/resources/mapper/quality/QualityInspectMapper.xml
@@ -8,16 +8,16 @@
         where
         inspect_type=#{qualityInspect.inspectType}
         <if test="qualityInspect.supplier != null and qualityInspect.supplier != '' ">
-            AND supplier = #{qualityInspect.supplier}
+            AND supplier like concat('%',#{qualityInspect.supplier},'%')
         </if>
         <if test="qualityInspect.customer != null and qualityInspect.customer != '' ">
-            AND customer = #{qualityInspect.customer}
+            AND customer like concat('%',#{qualityInspect.customer},'%')
         </if>
         <if test="qualityInspect.process != null and qualityInspect.process != '' ">
-            AND process = #{qualityInspect.process}
+            AND process like concat('%',#{qualityInspect.process},'%')
         </if>
         <if test="qualityInspect.productName != null and qualityInspect.productName != '' ">
-            AND product_name = #{qualityInspect.productName}
+            AND product_name like concat('%',#{qualityInspect.productName},'%')
         </if>
         <if test="qualityInspect.entryDateStart != null and qualityInspect.entryDateStart != '' ">
             AND check_time &gt;= DATE_FORMAT(#{qualityInspect.entryDateStart},'%Y-%m-%d')
diff --git a/src/main/resources/mapper/sales/SalesLedgerMapper.xml b/src/main/resources/mapper/sales/SalesLedgerMapper.xml
index a4949aa..5d83bb1 100644
--- a/src/main/resources/mapper/sales/SalesLedgerMapper.xml
+++ b/src/main/resources/mapper/sales/SalesLedgerMapper.xml
@@ -58,13 +58,10 @@
         T1.contract_amount,
         T1.execution_date,
         T2.nick_name AS entry_person_name,
-        T1.payment_method,
-        t3.shipping_car_number,
-        t3.shipping_date
+        T1.payment_method
         FROM
         sales_ledger T1
         LEFT JOIN sys_user T2 ON T1.entry_person = T2.user_id
-        left join shipping_info t3 on T1.id = t3.sales_ledger_id
         <where>
             <if test="salesLedgerDto.customerName != null and salesLedgerDto.customerName != '' ">
                 AND  T1.customer_name LIKE CONCAT('%',#{salesLedgerDto.customerName},'%')
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