From 0f7d73f4cf67ae7b4f47f68e5f23da38ae223a50 Mon Sep 17 00:00:00 2001
From: huminmin <mac@MacBook-Pro.local>
Date: 星期二, 12 五月 2026 11:04:50 +0800
Subject: [PATCH] Merge branch 'dev_New_pro' of http://114.132.189.42:9002/r/product-inventory-management-after into dev_西宁_青铝绿行

---
 src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java               |    4 
 src/main/java/com/ruoyi/stock/controller/StockUninventoryController.java                  |   12 
 src/main/java/com/ruoyi/account/service/AccountPurchaseService.java                       |   27 +
 src/main/java/com/ruoyi/stock/mapper/StockOutRecordMapper.java                            |    3 
 src/main/java/com/ruoyi/purchase/mapper/PurchaseReturnOrdersMapper.java                   |    4 
 src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskJob.java                    |   10 
 src/main/java/com/ruoyi/stock/pojo/StockOutRecord.java                                    |    2 
 src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java                           |   27 
 src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java                  |    6 
 src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java                   |   27 
 src/main/resources/mapper/sales/SalesLedgerProductMapper.xml                              |   39 +
 src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskJob.java                       |   13 
 src/main/java/com/ruoyi/common/enums/StockOutQualifiedRecordTypeEnum.java                 |    1 
 src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java                 |    3 
 src/main/resources/mapper/procurementrecord/ReturnManagementMapper.xml                    |   28 +
 src/main/resources/mapper/stock/StockOutRecordMapper.xml                                  |   29 +
 src/main/java/com/ruoyi/account/bean/vo/SalesOutboundVo.java                              |   52 ++
 src/main/java/com/ruoyi/account/controller/AccountSalesController.java                    |   68 +++
 src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java                 |   14 
 src/main/java/com/ruoyi/procurementrecord/mapper/ReturnManagementMapper.java              |    4 
 src/main/resources/mapper/account/SalesRefundAmountOrderMapper.xml                        |    8 
 src/main/resources/mapper/stock/StockInRecordMapper.xml                                   |   34 +
 src/main/java/com/ruoyi/device/pojo/MaintenanceTask.java                                  |    3 
 src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java                  |   17 
 src/main/java/com/ruoyi/account/bean/dto/PurchaseReturnDto.java                           |   26 +
 src/main/java/com/ruoyi/procurementrecord/service/impl/ReturnManagementServiceImpl.java   |    3 
 src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java           |    5 
 src/main/java/com/ruoyi/projectManagement/service/impl/handle/InfoStageHandleService.java |    2 
 src/main/java/com/ruoyi/sales/mapper/ShippingInfoMapper.java                              |    3 
 src/main/java/com/ruoyi/account/service/impl/AccountSalesServiceImpl.java                 |   58 ++
 src/main/java/com/ruoyi/account/service/AccountSalesService.java                          |   28 +
 src/main/java/com/ruoyi/account/bean/vo/PurchaseInboundVo.java                            |   48 ++
 src/main/java/com/ruoyi/account/bean/vo/SalesReturnVo.java                                |   48 ++
 src/main/java/com/ruoyi/account/controller/AccounPurchaseController.java                  |   68 +++
 src/main/resources/mapper/purchase/PurchaseReturnOrdersMapper.xml                         |   25 +
 src/main/java/com/ruoyi/account/bean/dto/PurchaseInboundDto.java                          |   26 +
 src/main/java/com/ruoyi/stock/mapper/StockInRecordMapper.java                             |    4 
 src/main/java/com/ruoyi/projectManagement/service/impl/PlanServiceImpl.java               |    2 
 src/main/java/com/ruoyi/account/bean/dto/SalesOutboundDto.java                            |   26 +
 src/main/resources/mapper/procurementrecord/ReturnSaleProductMapper.xml                   |    8 
 src/main/java/com/ruoyi/common/enums/StockInQualifiedRecordTypeEnum.java                  |   10 
 src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java     |    9 
 src/main/resources/mapper/stock/StockInventoryMapper.xml                                  |   26 
 src/main/java/com/ruoyi/account/service/impl/AccountPurchaseServiceImpl.java              |   59 ++
 src/main/java/com/ruoyi/account/bean/vo/PurchaseReturnVo.java                             |   48 ++
 src/main/resources/mapper/sales/ShippingInfoMapper.xml                                    |    3 
 /dev/null                                                                                 |   34 -
 src/main/java/com/ruoyi/account/bean/dto/SalesReturnDto.java                              |   26 +
 doc/20260511_设备保养定时任务设备项目字段前端联调说明.md                                                      |  111 +++++
 src/main/java/com/ruoyi/basic/utils/FileUtil.java                                         |    5 
 src/main/java/com/ruoyi/basic/enums/RecordTypeEnum.java                                   |    4 
 51 files changed, 1,007 insertions(+), 143 deletions(-)

diff --git "a/doc/20260511_\350\256\276\345\244\207\344\277\235\345\205\273\345\256\232\346\227\266\344\273\273\345\212\241\350\256\276\345\244\207\351\241\271\347\233\256\345\255\227\346\256\265\345\211\215\347\253\257\350\201\224\350\260\203\350\257\264\346\230\216.md" "b/doc/20260511_\350\256\276\345\244\207\344\277\235\345\205\273\345\256\232\346\227\266\344\273\273\345\212\241\350\256\276\345\244\207\351\241\271\347\233\256\345\255\227\346\256\265\345\211\215\347\253\257\350\201\224\350\260\203\350\257\264\346\230\216.md"
new file mode 100644
index 0000000..e35f0f9
--- /dev/null
+++ "b/doc/20260511_\350\256\276\345\244\207\344\277\235\345\205\273\345\256\232\346\227\266\344\273\273\345\212\241\350\256\276\345\244\207\351\241\271\347\233\256\345\255\227\346\256\265\345\211\215\347\253\257\350\201\224\350\260\203\350\257\264\346\230\216.md"
@@ -0,0 +1,111 @@
+# 璁惧淇濆吇瀹氭椂浠诲姟璁惧椤圭洰瀛楁鍓嶇鑱旇皟璇存槑
+
+> 鏇存柊鏃堕棿锛�2026-05-11  
+> 閫傜敤鑼冨洿锛氳澶囦繚鍏诲畾鏃朵换鍔★紙`maintenance_task`锛変笌璁惧淇濆吇璁板綍锛坄device_maintenance`锛�
+
+## 1. 鍙樻洿姒傝堪
+
+鏈鍚庣鍙樻洿锛�
+
+1. `MaintenanceTask` 鏂板瀛楁 `machineryCategory`锛堣澶囬」鐩級銆�
+2. 瀹氭椂浠诲姟鎵ц鐢熸垚璁惧淇濆吇璁板綍鏃讹紝浼氭妸 `MaintenanceTask.machineryCategory` 鍚屾鍐欏叆 `DeviceMaintenance.machineryCategory`銆�
+
+瀵瑰簲浠g爜浣嶇疆锛�
+
+- `src/main/java/com/ruoyi/device/pojo/MaintenanceTask.java`
+- `src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskJob.java`
+
+## 2. 鏁版嵁搴撳彉鏇�
+
+闇�瑕佸厛鎵ц鏁版嵁搴撳彉鏇达紙鍚﹀垯鏂板/鏌ヨ璇ュ瓧娈典細寮傚父锛夛細
+
+```sql
+ALTER TABLE `maintenance_task`
+  ADD COLUMN `machinery_category` VARCHAR(100) NULL COMMENT '璁惧椤圭洰' AFTER `device_model`;
+```
+
+## 3. 瀛楁绾﹀畾
+
+| 瀛楁 | 鍚箟 | 绫诲瀷 | 寤鸿 |
+| --- | --- | --- | --- |
+| machineryCategory | 璁惧椤圭洰 | string | 鍓嶇鏂板/缂栬緫瀹氭椂浠诲姟鏃朵紶鍊� |
+
+璇存槑锛�
+
+- 鍚庣褰撳墠鏈璇ュ瓧娈靛仛寮哄埗闈炵┖鏍¢獙锛屼絾涓氬姟涓婂缓璁墠绔綔涓哄繀濉鐞嗐��
+- 鍘嗗彶 `maintenance_task` 鏃ф暟鎹嫢璇ュ瓧娈典负绌猴紝鍒欏熀浜庢棫浠诲姟鐢熸垚鐨勪繚鍏昏褰曚篃浼氫负绌恒��
+
+## 4. 鎺ュ彛鑱旇皟
+
+### 4.1 鏂板瀹氭椂浠诲姟
+
+```http
+POST /deviceMaintenanceTask/add
+Content-Type: application/json
+```
+
+璇锋眰绀轰緥锛�
+
+```json
+{
+  "taskName": "绌哄帇鏈篈-鍛ㄤ繚鍏�",
+  "taskId": 1001,
+  "deviceModel": "GA75",
+  "machineryCategory": "鍔ㄥ姏璁惧",
+  "frequencyType": "WEEKLY",
+  "frequencyDetail": "MON,09:00",
+  "registrantId": 1,
+  "registrationDate": "2026-05-11",
+  "remarks": "鑱旇皟鏍蜂緥"
+}
+```
+
+### 4.2 淇敼瀹氭椂浠诲姟
+
+```http
+POST /deviceMaintenanceTask/update
+Content-Type: application/json
+```
+
+璇锋眰绀轰緥锛堝惈 `id`锛夛細
+
+```json
+{
+  "id": 12,
+  "machineryCategory": "鍔ㄥ姏璁惧"
+}
+```
+
+### 4.3 瀹氭椂浠诲姟鍒楄〃
+
+```http
+GET /deviceMaintenanceTask/listPage?pageNum=1&pageSize=10
+```
+
+杩斿洖璁板綍涓細鍖呭惈 `machineryCategory` 瀛楁銆�
+
+### 4.4 璁惧淇濆吇璁板綍鍒楄〃/璇︽儏
+
+```http
+GET /device/maintenance/page?pageNum=1&pageSize=10
+GET /device/maintenance/{id}
+```
+
+杩斿洖涓� `machineryCategory` 鏉ユ簮浜� `device_maintenance.machinery_category`銆�  
+瀵逛簬鈥滅敱瀹氭椂浠诲姟鑷姩鐢熸垚鈥濈殑璁板綍锛岃鍊间細缁ф壙鐢熸垚鏃跺搴斾换鍔$殑 `machineryCategory`銆�
+
+## 5. 鍓嶇鏀归�犵偣
+
+1. 瀹氭椂浠诲姟鏂板/缂栬緫琛ㄥ崟澧炲姞鈥滆澶囬」鐩紙machineryCategory锛夆�濊緭鍏ラ」銆�
+2. 鎻愪氦 `/deviceMaintenanceTask/add`銆乣/deviceMaintenanceTask/update` 鏃舵惡甯� `machineryCategory`銆�
+3. 瀹氭椂浠诲姟鍒楄〃澧炲姞鈥滆澶囬」鐩�濆垪锛堝椤甸潰鏈夎鍒楄〃锛夈��
+4. 璁惧淇濆吇璁板綍鍒楄〃/璇︽儏澧炲姞鈥滆澶囬」鐩�濆睍绀猴紝绌哄�兼樉绀� `--`銆�
+
+## 6. 鑱旇皟楠屾敹娓呭崟
+
+1. 鏂板涓�涓甫 `machineryCategory` 鐨勫畾鏃朵换鍔★紝淇濆瓨鎴愬姛銆�
+2. 鏌ヨ `/deviceMaintenanceTask/listPage`锛岀‘璁よ浠诲姟杩斿洖 `machineryCategory`銆�
+3. 绛夊緟涓�娆″畾鏃惰Е鍙戯紙鎴栧皢棰戠巼璋冨埌涓磋繎鏃堕棿锛夛紝鐢熸垚淇濆吇璁板綍銆�
+4. 鏌ヨ `/device/maintenance/page` 鎴栬鎯呮帴鍙o紝纭鏂拌褰曠殑 `machineryCategory` 涓庝换鍔′竴鑷淬��
+5. 淇敼浠诲姟 `machineryCategory` 鍚庡啀娆¤Е鍙戯紝纭鈥滄柊鐢熸垚璁板綍鈥濅娇鐢ㄦ柊鍊硷紙鍘嗗彶璁板綍涓嶅洖鍐欙級銆�
+
diff --git a/src/main/java/com/ruoyi/account/bean/dto/PurchaseInboundDto.java b/src/main/java/com/ruoyi/account/bean/dto/PurchaseInboundDto.java
new file mode 100644
index 0000000..6ca07a4
--- /dev/null
+++ b/src/main/java/com/ruoyi/account/bean/dto/PurchaseInboundDto.java
@@ -0,0 +1,26 @@
+package com.ruoyi.account.bean.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@Schema(name = "PurchaseInboundDto", description = "璐㈠姟绠$悊--閲囪喘鍏ュ簱鍙拌处(浼犲弬)")
+public class PurchaseInboundDto {
+
+    @Schema(description = "鍏ュ簱鍗曞彿")
+    private String inboundBatches;
+
+    @Schema(description = "渚涘簲鍟�")
+    private String supplierName;
+
+    @Schema(description = "寮�濮嬫棩鏈�")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date startDate;
+
+    @Schema(description = "缁撴潫鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date endDate;
+}
diff --git a/src/main/java/com/ruoyi/account/bean/dto/PurchaseReturnDto.java b/src/main/java/com/ruoyi/account/bean/dto/PurchaseReturnDto.java
new file mode 100644
index 0000000..d521422
--- /dev/null
+++ b/src/main/java/com/ruoyi/account/bean/dto/PurchaseReturnDto.java
@@ -0,0 +1,26 @@
+package com.ruoyi.account.bean.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@Schema(name = "PurchaseReturnDto", description = "璐㈠姟绠$悊--閲囪喘閫�璐у彴璐�(浼犲弬)")
+public class PurchaseReturnDto {
+
+    @Schema(description = "閫�璐у崟鍙�")
+    private String returnNo;
+
+    @Schema(description = "渚涘簲鍟�")
+    private String supplierName;
+
+    @Schema(description = "寮�濮嬫棩鏈�")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date startDate;
+
+    @Schema(description = "缁撴潫鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date endDate;
+}
diff --git a/src/main/java/com/ruoyi/account/bean/dto/SalesOutboundDto.java b/src/main/java/com/ruoyi/account/bean/dto/SalesOutboundDto.java
new file mode 100644
index 0000000..a30e035
--- /dev/null
+++ b/src/main/java/com/ruoyi/account/bean/dto/SalesOutboundDto.java
@@ -0,0 +1,26 @@
+package com.ruoyi.account.bean.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@Schema(name = "SalesOutboundDto", description = "璐㈠姟绠$悊--閿�鍞嚭搴撳彴璐�(浼犲弬)")
+public class SalesOutboundDto {
+
+    @Schema(description = "鍑哄簱鍗曞彿")
+    private String outboundBatches;
+
+    @Schema(description = "瀹㈡埛鍚嶇О")
+    private String customerName;
+
+    @Schema(description = "寮�濮嬫棩鏈�")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date startDate;
+
+    @Schema(description = "缁撴潫鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date endDate;
+}
diff --git a/src/main/java/com/ruoyi/account/bean/dto/SalesReturnDto.java b/src/main/java/com/ruoyi/account/bean/dto/SalesReturnDto.java
new file mode 100644
index 0000000..d635408
--- /dev/null
+++ b/src/main/java/com/ruoyi/account/bean/dto/SalesReturnDto.java
@@ -0,0 +1,26 @@
+package com.ruoyi.account.bean.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@Schema(name = "SalesReturnDto", description = "璐㈠姟绠$悊--閿�鍞��璐у彴璐�(浼犲弬)")
+public class SalesReturnDto {
+
+    @Schema(description = "閫�璐у崟鍙�")
+    private String returnNo;
+
+    @Schema(description = "瀹㈡埛鍚嶇О")
+    private String customerName;
+
+    @Schema(description = "寮�濮嬫棩鏈�")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date startDate;
+
+    @Schema(description = "缁撴潫鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date endDate;
+}
diff --git a/src/main/java/com/ruoyi/account/bean/vo/PurchaseInboundVo.java b/src/main/java/com/ruoyi/account/bean/vo/PurchaseInboundVo.java
new file mode 100644
index 0000000..934502a
--- /dev/null
+++ b/src/main/java/com/ruoyi/account/bean/vo/PurchaseInboundVo.java
@@ -0,0 +1,48 @@
+package com.ruoyi.account.bean.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.framework.aspectj.lang.annotation.Excel;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@Schema(name = "PurchaseInboundVo", description = "璐㈠姟绠$悊--閲囪喘鍏ュ簱鍙拌处(杩斿洖)")
+@ExcelIgnoreUnannotated
+public class PurchaseInboundVo {
+
+    @Schema(description = "鍏ュ簱鍗昳d")
+    private Long id;
+
+    @Schema(description = "鍏ュ簱鍗曞彿")
+    @Excel(name = "鍏ュ簱鍗曞彿")
+    private String inboundBatches;
+
+    @Schema(description = "渚涘簲鍟�")
+    @Excel(name = "渚涘簲鍟�")
+    private String supplierName;
+
+    @Schema(description = "鍏ュ簱鏃ユ湡")
+    @Excel(name = "鍏ュ簱鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date InboundDate;
+
+    @Schema(description = "浜у搧鍚嶇О")
+    @Excel(name = "浜у搧鍚嶇О")
+    private String productName;
+
+    @Schema(description = "浜у搧瑙勬牸")
+    @Excel(name = "浜у搧瑙勬牸")
+    private String  specificationModel;
+
+    @Schema(description = "閲戦")
+    @Excel(name = "閲戦")
+    private BigDecimal InboundAmount;
+
+    @Schema(description = "閲囪喘璁㈠崟鍙�")
+    @Excel(name = "閲囪喘璁㈠崟鍙�")
+    private String purchaseContractNumber;
+}
diff --git a/src/main/java/com/ruoyi/account/bean/vo/PurchaseReturnVo.java b/src/main/java/com/ruoyi/account/bean/vo/PurchaseReturnVo.java
new file mode 100644
index 0000000..e912993
--- /dev/null
+++ b/src/main/java/com/ruoyi/account/bean/vo/PurchaseReturnVo.java
@@ -0,0 +1,48 @@
+package com.ruoyi.account.bean.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.framework.aspectj.lang.annotation.Excel;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Data
+@Schema(name = "PurchaseReturnVo", description = "璐㈠姟绠$悊--閲囪喘閫�璐у彴璐�(杩斿洖)")
+@ExcelIgnoreUnannotated
+public class PurchaseReturnVo {
+
+    @Schema(description = "閫�璐у崟id")
+    private Long id;
+
+    @Excel(name = "閫�璐у崟鍙�")
+    @Schema(description = "閫�璐у崟鍙�")
+    private String returnNo;
+
+    @Schema(description = "渚涘簲鍟�")
+    @Excel(name = "渚涘簲鍟�")
+    private String supplierName;
+
+    @Schema(description = "鍏宠仈鍏ュ簱鍗曞彿")
+    @Excel(name = "鍏宠仈鍏ュ簱鍗曞彿")
+    private String inboundBatches;
+
+    @Schema(description = "閫�璐ф棩鏈�")
+    @Excel(name = "閫�璐ф棩鏈�")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime preparedAt;
+
+    @Schema(description = "閫�娆炬�婚")
+    @Excel(name = "閫�娆炬�婚")
+    private BigDecimal totalAmount;
+
+    @Schema(description = "閫�璐ф柟寮�")
+    @Excel(name = "閫�璐ф柟寮�")
+    private String returnType;
+
+    @Schema(description = "閲囪喘璁㈠崟鍙�")
+    @Excel(name = "閲囪喘璁㈠崟鍙�")
+    private String purchaseContractNumber;
+}
diff --git a/src/main/java/com/ruoyi/account/bean/vo/SalesOutboundVo.java b/src/main/java/com/ruoyi/account/bean/vo/SalesOutboundVo.java
new file mode 100644
index 0000000..5ccdb5b
--- /dev/null
+++ b/src/main/java/com/ruoyi/account/bean/vo/SalesOutboundVo.java
@@ -0,0 +1,52 @@
+package com.ruoyi.account.bean.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.framework.aspectj.lang.annotation.Excel;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@Schema(name = "SalesOutboundVo", description = "璐㈠姟绠$悊--閿�鍞嚭搴撳彴璐�(杩斿洖)")
+@ExcelIgnoreUnannotated
+public class SalesOutboundVo {
+
+    @Schema(description = "鍑哄簱鍗昳d")
+    private Long id;
+
+    @Schema(description = "鍑哄簱鍗曞彿")
+    @Excel(name = "鍑哄簱鍗曞彿")
+    private String outboundBatches;
+
+    @Schema(description = "瀹㈡埛鍚嶇О")
+    @Excel(name = "瀹㈡埛鍚嶇О")
+    private String customerName;
+
+    @Schema(description = "鍑哄簱鏃ユ湡")
+    @Excel(name = "鍑哄簱鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date shippingDate;
+
+    @Schema(description = "浜у搧鍚嶇О")
+    @Excel(name = "浜у搧鍚嶇О")
+    private String productName;
+
+    @Schema(description = "浜у搧瑙勬牸")
+    @Excel(name = "浜у搧瑙勬牸")
+    private String  specificationModel;
+
+    @Schema(description = "閲戦")
+    @Excel(name = "閲戦")
+    private BigDecimal outboundAmount;
+
+    @Schema(description = "鍙戣揣缂栧彿")
+    @Excel(name = "鍙戣揣缂栧彿")
+    private String shippingNo;
+
+    @Schema(description = "閿�鍞鍗曞彿")
+    @Excel(name = "閿�鍞鍗曞彿")
+    private String salesContractNo;
+}
diff --git a/src/main/java/com/ruoyi/account/bean/vo/SalesReturnVo.java b/src/main/java/com/ruoyi/account/bean/vo/SalesReturnVo.java
new file mode 100644
index 0000000..c425737
--- /dev/null
+++ b/src/main/java/com/ruoyi/account/bean/vo/SalesReturnVo.java
@@ -0,0 +1,48 @@
+package com.ruoyi.account.bean.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.framework.aspectj.lang.annotation.Excel;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Data
+@Schema(name = "SalesReturnVo", description = "璐㈠姟绠$悊--閿�鍞��璐у彴璐�(杩斿洖)")
+@ExcelIgnoreUnannotated
+public class SalesReturnVo {
+
+    @Schema(description = "閫�璐у崟id")
+    private Long id;
+
+    @Excel(name = "閫�璐у崟鍙�")
+    @Schema(description = "閫�璐у崟鍙�")
+    private String returnNo;
+
+    @Schema(description = "瀹㈡埛鍚嶇О")
+    @Excel(name = "瀹㈡埛鍚嶇О")
+    private String customerName;
+
+    @Schema(description = "鍏宠仈鍙戣揣鍗曞彿")
+    @Excel(name = "鍏宠仈鍙戣揣鍗曞彿")
+    private String shippingNo;
+
+    @Schema(description = "閫�璐ф棩鏈�")
+    @Excel(name = "閫�璐ф棩鏈�")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime makeTime;
+
+    @Schema(description = "閫�娆炬�婚")
+    @Excel(name = "閫�娆炬�婚")
+    private BigDecimal refundAmount;
+
+    @Schema(description = "閫�璐у師鍥�")
+    @Excel(name = "閫�璐у師鍥�")
+    private String returnReason;
+
+    @Schema(description = "閿�鍞鍗曞彿")
+    @Excel(name = "閿�鍞鍗曞彿")
+    private String salesContractNo;
+}
diff --git a/src/main/java/com/ruoyi/account/controller/AccounPurchaseController.java b/src/main/java/com/ruoyi/account/controller/AccounPurchaseController.java
new file mode 100644
index 0000000..d1993ea
--- /dev/null
+++ b/src/main/java/com/ruoyi/account/controller/AccounPurchaseController.java
@@ -0,0 +1,68 @@
+package com.ruoyi.account.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.account.bean.dto.PurchaseInboundDto;
+import com.ruoyi.account.bean.dto.PurchaseReturnDto;
+import com.ruoyi.account.bean.vo.PurchaseInboundVo;
+import com.ruoyi.account.bean.vo.PurchaseReturnVo;
+import com.ruoyi.account.service.AccountPurchaseService;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
+import com.ruoyi.framework.web.domain.R;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 璐㈠姟绠$悊鐨勯噰璐儴鍒� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-05-07 04:45:30
+ */
+@RestController
+@RequestMapping("/accountPurchase")
+@RequiredArgsConstructor
+@Tag(name = "璐㈠姟绠$悊鐨勯噰璐儴鍒�")
+public class AccounPurchaseController {
+
+    private final AccountPurchaseService accountPurchaseService;
+
+    @GetMapping("/listPageAccountPurchase")
+    @Log(title = "閲囪喘鍏ュ簱鍙拌处", businessType = BusinessType.OTHER)
+    @Operation(summary = "璐㈠姟绠$悊--閲囪喘鍏ュ簱鍙拌处")
+    public R<IPage<PurchaseInboundVo>> listPageAccountPurchase(Page page, PurchaseInboundDto purchaseInboundDto) {
+        IPage<PurchaseInboundVo> listPage = accountPurchaseService.listPageAccountPurchase(page,purchaseInboundDto);
+        return R.ok(listPage);
+    }
+
+    @PostMapping("/exportAccountPurchaseInbound")
+    @Operation(summary = "瀵煎嚭閲囪喘鍏ュ簱鏂囦欢")
+    @Log(title = "瀵煎嚭閲囪喘鍏ュ簱鏂囦欢", businessType = BusinessType.EXPORT)
+    public void exportAccountPurchaseInbound(HttpServletResponse response, PurchaseInboundDto purchaseInboundDto) {
+        accountPurchaseService.exportAccountPurchaseInbound(response,purchaseInboundDto);
+    }
+
+    @GetMapping("/listPageAccountPurchaseReturn")
+    @Log(title = "閲囪喘閫�璐у彴璐�", businessType = BusinessType.OTHER)
+    @Operation(summary = "璐㈠姟绠$悊--閲囪喘閫�璐у彴璐�")
+    public R<IPage<PurchaseReturnVo>> listPageAccountPurchaseReturn(Page page, PurchaseReturnDto purchaseReturnDto) {
+        IPage<PurchaseReturnVo> listPage = accountPurchaseService.listPageAccountPurchaseReturn(page,purchaseReturnDto);
+        return R.ok(listPage);
+    }
+
+    @PostMapping("/exportAccountPurchaseReturn")
+    @Operation(summary = "瀵煎嚭閲囪喘閫�璐ф枃浠�")
+    @Log(title = "瀵煎嚭閲囪喘閫�璐ф枃浠�", businessType = BusinessType.EXPORT)
+    public void exportAccountPurchaseReturn(HttpServletResponse response,PurchaseReturnDto purchaseReturnDto) {
+        accountPurchaseService.exportAccountPurchaseReturn(response,purchaseReturnDto);
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/account/controller/AccountSalesController.java b/src/main/java/com/ruoyi/account/controller/AccountSalesController.java
new file mode 100644
index 0000000..bca90db
--- /dev/null
+++ b/src/main/java/com/ruoyi/account/controller/AccountSalesController.java
@@ -0,0 +1,68 @@
+package com.ruoyi.account.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.account.bean.dto.SalesOutboundDto;
+import com.ruoyi.account.bean.dto.SalesReturnDto;
+import com.ruoyi.account.bean.vo.SalesOutboundVo;
+import com.ruoyi.account.bean.vo.SalesReturnVo;
+import com.ruoyi.account.service.AccountSalesService;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
+import com.ruoyi.framework.web.domain.R;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 璐㈠姟绠$悊鐨勯攢鍞儴鍒� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-05-07 04:45:30
+ */
+@RestController
+@RequestMapping("/accountSales")
+@RequiredArgsConstructor
+@Tag(name = "璐㈠姟绠$悊鐨勯攢鍞儴鍒�")
+public class AccountSalesController {
+
+    private final AccountSalesService accountSalesService;
+
+    @GetMapping("/listPageAccountSales")
+    @Log(title = "閿�鍞嚭搴撳彴璐�", businessType = BusinessType.OTHER)
+    @Operation(summary = "璐㈠姟绠$悊--閿�鍞嚭搴撳彴璐�")
+    public R<IPage<SalesOutboundVo>> listPageAccountSales(Page page, SalesOutboundDto salesOutboundDto) {
+        IPage<SalesOutboundVo> listPage = accountSalesService.listPageAccountSales(page,salesOutboundDto);
+        return R.ok(listPage);
+    }
+
+    @PostMapping("/exportAccountSalesOutbound")
+    @Operation(summary = "瀵煎嚭閿�鍞嚭搴撴枃浠�")
+    @Log(title = "瀵煎嚭閿�鍞嚭搴撴枃浠�", businessType = BusinessType.EXPORT)
+    public void exportAccountSalesOutbound(HttpServletResponse response,SalesOutboundDto salesOutboundDto) {
+        accountSalesService.exportAccountSalesOutbound(response,salesOutboundDto);
+    }
+
+    @GetMapping("/listPageAccountSalesReturn")
+    @Log(title = "閿�鍞��璐у彴璐�", businessType = BusinessType.OTHER)
+    @Operation(summary = "璐㈠姟绠$悊--閿�鍞��璐у彴璐�")
+    public R<IPage<SalesReturnVo>> listPageAccountSalesReturn(Page page, SalesReturnDto salesReturnDto) {
+        IPage<SalesReturnVo> listPage = accountSalesService.listPageAccountSalesReturn(page,salesReturnDto);
+        return R.ok(listPage);
+    }
+
+    @PostMapping("/exportAccountSalesReturn")
+    @Operation(summary = "瀵煎嚭閿�鍞��璐ф枃浠�")
+    @Log(title = "瀵煎嚭閿�鍞��璐ф枃浠�", businessType = BusinessType.EXPORT)
+    public void exportAccountSalesReturn(HttpServletResponse response,SalesReturnDto salesReturnDto) {
+        accountSalesService.exportAccountSalesReturn(response,salesReturnDto);
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/account/service/AccountPurchaseService.java b/src/main/java/com/ruoyi/account/service/AccountPurchaseService.java
new file mode 100644
index 0000000..386f921
--- /dev/null
+++ b/src/main/java/com/ruoyi/account/service/AccountPurchaseService.java
@@ -0,0 +1,27 @@
+package com.ruoyi.account.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.account.bean.dto.PurchaseInboundDto;
+import com.ruoyi.account.bean.dto.PurchaseReturnDto;
+import com.ruoyi.account.bean.vo.PurchaseInboundVo;
+import com.ruoyi.account.bean.vo.PurchaseReturnVo;
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 璐㈠姟绠$悊鐨勯攢鍞儴鍒� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-05-07 04:45:30
+ */
+public interface AccountPurchaseService {
+    IPage<PurchaseInboundVo> listPageAccountPurchase(Page page, PurchaseInboundDto purchaseInboundDto);
+
+    void exportAccountPurchaseInbound(HttpServletResponse response, PurchaseInboundDto purchaseInboundDto);
+
+    IPage<PurchaseReturnVo> listPageAccountPurchaseReturn(Page page, PurchaseReturnDto purchaseReturnDto);
+
+    void exportAccountPurchaseReturn(HttpServletResponse response, PurchaseReturnDto purchaseReturnDto);
+}
diff --git a/src/main/java/com/ruoyi/account/service/AccountSalesService.java b/src/main/java/com/ruoyi/account/service/AccountSalesService.java
new file mode 100644
index 0000000..7db5416
--- /dev/null
+++ b/src/main/java/com/ruoyi/account/service/AccountSalesService.java
@@ -0,0 +1,28 @@
+package com.ruoyi.account.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.account.bean.dto.SalesOutboundDto;
+import com.ruoyi.account.bean.dto.SalesReturnDto;
+import com.ruoyi.account.bean.vo.SalesOutboundVo;
+import com.ruoyi.account.bean.vo.SalesReturnVo;
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 璐㈠姟绠$悊鐨勯攢鍞儴鍒� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-05-07 04:45:30
+ */
+public interface AccountSalesService  {
+
+    IPage<SalesOutboundVo> listPageAccountSales(Page page, SalesOutboundDto salesOutboundDto);
+
+    void exportAccountSalesOutbound(HttpServletResponse response, SalesOutboundDto salesOutboundDto);
+
+    IPage<SalesReturnVo> listPageAccountSalesReturn(Page page, SalesReturnDto salesReturnDto);
+
+    void exportAccountSalesReturn(HttpServletResponse response, SalesReturnDto salesReturnDto);
+}
diff --git a/src/main/java/com/ruoyi/account/service/impl/AccountPurchaseServiceImpl.java b/src/main/java/com/ruoyi/account/service/impl/AccountPurchaseServiceImpl.java
new file mode 100644
index 0000000..747f6cf
--- /dev/null
+++ b/src/main/java/com/ruoyi/account/service/impl/AccountPurchaseServiceImpl.java
@@ -0,0 +1,59 @@
+package com.ruoyi.account.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.account.bean.dto.PurchaseInboundDto;
+import com.ruoyi.account.bean.dto.PurchaseReturnDto;
+import com.ruoyi.account.bean.vo.PurchaseInboundVo;
+import com.ruoyi.account.bean.vo.PurchaseReturnVo;
+import com.ruoyi.account.service.AccountPurchaseService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.purchase.mapper.PurchaseReturnOrdersMapper;
+import com.ruoyi.stock.mapper.StockInRecordMapper;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 璐㈠姟绠$悊鐨勯攢鍞儴鍒� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-05-07 04:45:30
+ */
+@Service
+@RequiredArgsConstructor
+public class AccountPurchaseServiceImpl implements AccountPurchaseService {
+
+    private final StockInRecordMapper stockInRecordMapper;
+
+    private final PurchaseReturnOrdersMapper purchaseReturnOrdersMapper;
+
+
+    @Override
+    public IPage<PurchaseInboundVo> listPageAccountPurchase(Page page, PurchaseInboundDto purchaseInboundDto) {
+        return stockInRecordMapper.listPageAccountPurchase(page,purchaseInboundDto);
+    }
+
+    @Override
+    public void exportAccountPurchaseInbound(HttpServletResponse response, PurchaseInboundDto purchaseInboundDto) {
+        List<PurchaseInboundVo> list = stockInRecordMapper.listPageAccountPurchase(new Page(1,-1),purchaseInboundDto).getRecords();
+        ExcelUtil<PurchaseInboundVo> util = new ExcelUtil<>(PurchaseInboundVo.class);
+        util.exportExcel(response, list , "閲囪喘鍏ュ簱");
+    }
+
+    @Override
+    public IPage<PurchaseReturnVo> listPageAccountPurchaseReturn(Page page, PurchaseReturnDto purchaseReturnDto) {
+        return purchaseReturnOrdersMapper.listPageAccountPurchaseReturn(page,purchaseReturnDto);
+    }
+
+    @Override
+    public void exportAccountPurchaseReturn(HttpServletResponse response, PurchaseReturnDto purchaseReturnDto) {
+        List<PurchaseReturnVo> list = purchaseReturnOrdersMapper.listPageAccountPurchaseReturn(new Page(1,-1),purchaseReturnDto).getRecords();
+        ExcelUtil<PurchaseReturnVo> util = new ExcelUtil<>(PurchaseReturnVo.class);
+        util.exportExcel(response, list , "閲囪喘閫�璐�");
+    }
+}
diff --git a/src/main/java/com/ruoyi/account/service/impl/AccountSalesServiceImpl.java b/src/main/java/com/ruoyi/account/service/impl/AccountSalesServiceImpl.java
new file mode 100644
index 0000000..ddf4a57
--- /dev/null
+++ b/src/main/java/com/ruoyi/account/service/impl/AccountSalesServiceImpl.java
@@ -0,0 +1,58 @@
+package com.ruoyi.account.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.account.bean.dto.SalesOutboundDto;
+import com.ruoyi.account.bean.dto.SalesReturnDto;
+import com.ruoyi.account.bean.vo.SalesOutboundVo;
+import com.ruoyi.account.bean.vo.SalesReturnVo;
+import com.ruoyi.account.service.AccountSalesService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.procurementrecord.mapper.ReturnManagementMapper;
+import com.ruoyi.stock.mapper.StockOutRecordMapper;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 璐㈠姟绠$悊鐨勯攢鍞儴鍒� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-05-07 04:45:30
+ */
+@Service
+@RequiredArgsConstructor
+public class AccountSalesServiceImpl  implements AccountSalesService {
+
+    private final StockOutRecordMapper stockOutRecordMapper;
+
+    private final ReturnManagementMapper returnManagementMapper;
+
+    @Override
+    public IPage<SalesOutboundVo> listPageAccountSales(Page page, SalesOutboundDto salesOutboundDto) {
+        return stockOutRecordMapper.listPageAccountSales(page,salesOutboundDto);
+    }
+
+    @Override
+    public void exportAccountSalesOutbound(HttpServletResponse response, SalesOutboundDto salesOutboundDto) {
+        List<SalesOutboundVo> list = stockOutRecordMapper.listPageAccountSales(new Page(1,-1),salesOutboundDto).getRecords();
+        ExcelUtil<SalesOutboundVo> util = new ExcelUtil<>(SalesOutboundVo.class);
+        util.exportExcel(response, list , "閿�鍞嚭搴�");
+    }
+
+    @Override
+    public IPage<SalesReturnVo> listPageAccountSalesReturn(Page page, SalesReturnDto salesReturnDto) {
+        return returnManagementMapper.listPageAccountSalesReturn(page,salesReturnDto);
+    }
+
+    @Override
+    public void exportAccountSalesReturn(HttpServletResponse response, SalesReturnDto salesReturnDto) {
+        List<SalesReturnVo> list = returnManagementMapper.listPageAccountSalesReturn(new Page(1,-1),salesReturnDto).getRecords();
+        ExcelUtil<SalesReturnVo> util = new ExcelUtil<>(SalesReturnVo.class);
+        util.exportExcel(response, list , "閿�鍞��璐�");
+    }
+}
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 2c5fda3..34e1aed 100644
--- a/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
+++ b/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
@@ -15,6 +15,7 @@
 import com.ruoyi.basic.utils.FileUtil;
 import com.ruoyi.common.enums.FileNameType;
 import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
+import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.device.mapper.DeviceRepairMapper;
 import com.ruoyi.procurementrecord.utils.StockUtils;
@@ -31,14 +32,8 @@
 import com.ruoyi.quality.pojo.QualityInspectParam;
 import com.ruoyi.quality.pojo.QualityTestStandard;
 import com.ruoyi.quality.pojo.QualityTestStandardParam;
-import com.ruoyi.sales.mapper.CommonFileMapper;
-import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
-import com.ruoyi.sales.mapper.SalesQuotationMapper;
-import com.ruoyi.sales.mapper.ShippingInfoMapper;
-import com.ruoyi.sales.pojo.CommonFile;
-import com.ruoyi.sales.pojo.SalesLedgerProduct;
-import com.ruoyi.sales.pojo.SalesQuotation;
-import com.ruoyi.sales.pojo.ShippingInfo;
+import com.ruoyi.sales.mapper.*;
+import com.ruoyi.sales.pojo.*;
 import com.ruoyi.sales.service.impl.CommonFileServiceImpl;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
@@ -64,6 +59,7 @@
     private final PurchaseLedgerMapper purchaseLedgerMapper;
     private final SalesQuotationMapper salesQuotationMapper;
     private final ShippingInfoMapper shippingInfoMapper;
+    private final ShippingProductDetailMapper shippingProductDetailMapper;
     private final CommonFileServiceImpl commonFileService;
     private final StockUtils stockUtils;
     private final SalesLedgerProductMapper salesLedgerProductMapper;
@@ -183,7 +179,7 @@
                             addQualityInspect(purchaseLedger, salesLedgerProduct);
                         } else {
                             //鐩存帴鍏ュ簱
-                            stockUtils.addStockWithBatchNo(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockInQualifiedRecordTypeEnum.PURCHASE_STOCK_IN.getCode(), purchaseLedger.getId(),purchaseLedger.getPurchaseContractNumber()+"-"+salesLedgerProduct.getId());
+                            stockUtils.addStockWithBatchNo(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockInQualifiedRecordTypeEnum.PURCHASE_STOCK_IN.getCode(), purchaseLedger.getId(), purchaseLedger.getPurchaseContractNumber() + "-" + salesLedgerProduct.getId());
                         }
                     }
                 } else if (status.equals(3)) {
@@ -220,6 +216,8 @@
             if (shippingInfo != null) {
                 if (status.equals(2)) {
                     shippingInfo.setStatus("瀹℃牳閫氳繃");
+                    //鏇存敼鍑哄簱瀹℃牳鐘舵�侊紙寰呯‘璁ゆ敼鎴愬緟瀹℃牳锛�
+                    stockUtils.shipmentStatus(StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), shippingInfo.getId());
                 } else if (status.equals(3)) {
                     shippingInfo.setStatus("瀹℃牳鎷掔粷");
                 } else if (status.equals(1)) {
@@ -227,7 +225,6 @@
                 }
                 shippingInfoMapper.updateById(shippingInfo);
             }
-            //搴撳瓨鎵e噺
 
         }
         fileUtil.saveStorageAttachment(ApplicationTypeEnum.FILE, RecordTypeEnum.APPROVE_NODE, approveNode.getId(), approveNode.getStorageBlobDTOS());
diff --git a/src/main/java/com/ruoyi/basic/enums/RecordTypeEnum.java b/src/main/java/com/ruoyi/basic/enums/RecordTypeEnum.java
index d7d0649..9c63efb 100644
--- a/src/main/java/com/ruoyi/basic/enums/RecordTypeEnum.java
+++ b/src/main/java/com/ruoyi/basic/enums/RecordTypeEnum.java
@@ -132,10 +132,6 @@
     INBOUND_MANAGEMENT("inbound_management"),
     // Office Supplies
     OFFICE_SUPPLIES("office_supplies"),
-    // OA
-    OA_PROJECT_PHASE_TASK("oa_project_phase_task"),
-    OA_PROJECT("oa_project"),
-    OA_PROJECT_PHASE("oa_project_phase"),
     // Measuring Instrument Ledger
     SPARE_PARTS("spare_parts"),
     MEASURING_INSTRUMENT_LEDGER_RECORD("measuring_instrument_ledger_record"),
diff --git a/src/main/java/com/ruoyi/basic/utils/FileUtil.java b/src/main/java/com/ruoyi/basic/utils/FileUtil.java
index c57468a..4d54fab 100644
--- a/src/main/java/com/ruoyi/basic/utils/FileUtil.java
+++ b/src/main/java/com/ruoyi/basic/utils/FileUtil.java
@@ -98,8 +98,11 @@
         }
 
         // 鍒犻櫎鏃ч檮浠朵俊鎭�
-        if (application == null) {
+        if (application == null || application.trim().isEmpty()) {
             for (StorageBlobDTO storageBlobDTO : storageBlobDTOS) {
+                if (storageBlobDTO.getApplication() == null || storageBlobDTO.getApplication().trim().isEmpty()) {
+                    throw new RuntimeException("鏂囦欢鐢ㄩ�斾笉鑳戒负绌�");
+                }
                 deleteStorageAttachmentsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum.getByType(storageBlobDTO.getApplication()), recordType, recordId);
             }
         } else {
diff --git a/src/main/java/com/ruoyi/common/enums/StockInQualifiedRecordTypeEnum.java b/src/main/java/com/ruoyi/common/enums/StockInQualifiedRecordTypeEnum.java
index 01c4d7e..7c149bc 100644
--- a/src/main/java/com/ruoyi/common/enums/StockInQualifiedRecordTypeEnum.java
+++ b/src/main/java/com/ruoyi/common/enums/StockInQualifiedRecordTypeEnum.java
@@ -2,29 +2,23 @@
 
 import lombok.Getter;
 
-
+//鍏ュ簱鏋氫妇
 @Getter
 public enum StockInQualifiedRecordTypeEnum implements BaseEnum<String> {
 
 
     CUSTOMIZATION_STOCK_IN("0", "鍚堟牸鑷畾涔夊叆搴�"),
-    CUSTOMIZATION_STOCK_OUT("1", "鍚堟牸鑷畾涔夊嚭搴�"),
     PRODUCTION_REPORT_STOCK_IN("2", "鐢熶骇鎶ュ伐-鍏ュ簱"),
-    PRODUCTION_REPORT_STOCK_OUT("3", "鐢熶骇鎶ュ伐-鍑哄簱"),
     DEFECTIVE_SCRAP("4", "涓嶅悎鏍煎鐞�-鎶ュ簾"),
     PRODUCTION_SCRAP("5", "鐢熶骇鎶ュ伐-鎶ュ簾"),
     QUALITYINSPECT_STOCK_IN("6", "璐ㄦ-鍚堟牸鍏ュ簱"),
     PURCHASE_STOCK_IN("7", "閲囪喘-鍏ュ簱"),
-    SALE_STOCK_OUT("8", "閿�鍞�-鍑哄簱"),
     CUSTOMIZATION_UNSTOCK_IN("9", "涓嶅悎鏍艰嚜瀹氫箟鍏ュ簱"),
-    CUSTOMIZATION_UNSTOCK_OUT("10", "涓嶅悎鏍艰嚜瀹氫箟鍑哄簱"),
+    CUSTOMIZATION_UNSTOCK_OUT("10", "閲囪喘-璐ㄦ-鍚堟牸鍏ュ簱"),
     DEFECTIVE_PASS("11", "涓嶅悎鏍�-璁╂鏀捐"),
-    QUALITYINSPECT_UNSTOCK_IN("12", "璐ㄦ-涓嶅悎鏍煎叆搴�"),
-    SALE_SHIP_STOCK_OUT("13", "閿�鍞�-鍙戣揣鍑哄簱"),
     RETURN_HE_IN("14", "閿�鍞��璐�-鍚堟牸鍏ュ簱"),
     RETURN_UNSTOCK_IN("15", "閿�鍞��璐�-涓嶅悎鏍煎叆搴�"),
     PICK_RETURN_IN("20", "棰嗘枡閫�鏂�-鍚堟牸鍏ュ簱"),
-    PURCHASE_RETURN_STOCK_OUT("21", "閲囪喘閫�璐�"),
     FEED_RETURN_IN("22", "鐢熶骇閫�鏂�-鍚堟牸鍏ュ簱");
 
 
diff --git a/src/main/java/com/ruoyi/common/enums/StockInUnQualifiedRecordTypeEnum.java b/src/main/java/com/ruoyi/common/enums/StockInUnQualifiedRecordTypeEnum.java
deleted file mode 100644
index a03e6bd..0000000
--- a/src/main/java/com/ruoyi/common/enums/StockInUnQualifiedRecordTypeEnum.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.ruoyi.common.enums;
-
-import lombok.Getter;
-
-
-@Getter
-public enum StockInUnQualifiedRecordTypeEnum implements BaseEnum<String> {
-
-
-    DEFECTIVE_SCRAP("4", "涓嶅悎鏍煎鐞�-鎶ュ簾"),
-    PRODUCTION_SCRAP("5", "鐢熶骇鎶ュ伐-鎶ュ簾"),
-    CUSTOMIZATION_UNSTOCK_IN("9", "涓嶅悎鏍艰嚜瀹氫箟鍏ュ簱"),
-    QUALITYINSPECT_UNSTOCK_IN("12", "璐ㄦ-涓嶅悎鏍煎叆搴�"),
-    RETURN_UNSTOCK_IN("15", "閿�鍞��璐�-涓嶅悎鏍煎叆搴�");
-
-
-    private final String code;
-    private final String value;
-
-    StockInUnQualifiedRecordTypeEnum(String code, String value) {
-        this.code = code;
-        this.value = value;
-    }
-
-}
diff --git a/src/main/java/com/ruoyi/common/enums/StockOutQualifiedRecordTypeEnum.java b/src/main/java/com/ruoyi/common/enums/StockOutQualifiedRecordTypeEnum.java
index 4fe1f6e..ccc6d78 100644
--- a/src/main/java/com/ruoyi/common/enums/StockOutQualifiedRecordTypeEnum.java
+++ b/src/main/java/com/ruoyi/common/enums/StockOutQualifiedRecordTypeEnum.java
@@ -9,6 +9,7 @@
     PRODUCTION_REPORT_STOCK_OUT("3", "鐢熶骇鎶ュ伐-鍑哄簱"),
     SALE_STOCK_OUT("8", "閿�鍞�-鍑哄簱"),
     PURCHASE_RETURN_STOCK_OUT("9", "閲囪喘閫�璐�"),
+    CUSTOMIZATION_UNSTOCK_OUT("10", "涓嶅悎鏍艰嚜瀹氫箟鍑哄簱"),
     SALE_SHIP_STOCK_OUT("13", "閿�鍞�-鍙戣揣鍑哄簱"),
     PICK_STOCK_OUT("14", "鐢熶骇棰嗘枡鍑哄簱"),
     FEED_STOCK_OUT("15", "鐢熶骇琛ユ枡鍑哄簱");
diff --git a/src/main/java/com/ruoyi/common/enums/StockOutUnQualifiedRecordTypeEnum.java b/src/main/java/com/ruoyi/common/enums/StockOutUnQualifiedRecordTypeEnum.java
deleted file mode 100644
index 2ee40bd..0000000
--- a/src/main/java/com/ruoyi/common/enums/StockOutUnQualifiedRecordTypeEnum.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.ruoyi.common.enums;
-
-import lombok.Getter;
-
-
-@Getter
-public enum StockOutUnQualifiedRecordTypeEnum implements BaseEnum<String> {
-
-
-    CUSTOMIZATION_UNSTOCK_OUT("10", "涓嶅悎鏍艰嚜瀹氫箟鍑哄簱");
-
-
-    private final String code;
-    private final String value;
-
-    StockOutUnQualifiedRecordTypeEnum(String code, String value) {
-        this.code = code;
-        this.value = value;
-    }
-
-}
diff --git a/src/main/java/com/ruoyi/device/pojo/MaintenanceTask.java b/src/main/java/com/ruoyi/device/pojo/MaintenanceTask.java
index 0edfc7b..2e35584 100644
--- a/src/main/java/com/ruoyi/device/pojo/MaintenanceTask.java
+++ b/src/main/java/com/ruoyi/device/pojo/MaintenanceTask.java
@@ -28,6 +28,9 @@
     @Schema(description = "瑙勬牸鍨嬪彿")
     private String deviceModel;
 
+    @Schema(description = "璁惧椤圭洰")
+    private String machineryCategory;
+
     /**
      * 涓婚敭ID
      */
diff --git a/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskJob.java b/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskJob.java
index b9deb2d..09d5d77 100644
--- a/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskJob.java
+++ b/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskJob.java
@@ -4,6 +4,7 @@
 import com.ruoyi.device.pojo.MaintenanceTask;
 import lombok.RequiredArgsConstructor;
 import org.quartz.*;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Component;
@@ -18,14 +19,15 @@
 import java.util.Set;
 
 @Component
-@DisallowConcurrentExecution // 绂佹骞跺彂鎵ц鍚屼竴涓狫ob
-@RequiredArgsConstructor
+@DisallowConcurrentExecution
 public class MaintenanceTaskJob implements Job, Serializable {
-    private static final long serialVersionUID = 1L; // 蹇呴』瀹氫箟搴忓垪鍖朓D
+    private static final long serialVersionUID = 1L;
 
-    private final DeviceMaintenanceServiceImpl deviceMaintenanceService;
+    @Autowired
+    private DeviceMaintenanceServiceImpl deviceMaintenanceService;
 
-    private final JdbcTemplate jdbcTemplate;
+    @Autowired
+    private JdbcTemplate jdbcTemplate;
 
     @Override
     public void execute(JobExecutionContext context) throws JobExecutionException {
@@ -96,6 +98,7 @@
         inspectionTask.setTenantId(timingTask.getTenantId());
         inspectionTask.setStatus(0);
         inspectionTask.setDeviceModel(timingTask.getDeviceModel());
+        inspectionTask.setMachineryCategory(timingTask.getMachineryCategory());
         inspectionTask.setCreateUser(Integer.parseInt(timingTask.getRegistrantId().toString()));
         inspectionTask.setUpdateTime(LocalDateTime.now());
         inspectionTask.setCreateTime(LocalDateTime.now());
diff --git a/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskJob.java b/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskJob.java
index 389eda9..d9c5f69 100644
--- a/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskJob.java
+++ b/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskJob.java
@@ -5,6 +5,7 @@
 import com.ruoyi.inspectiontask.pojo.TimingTask;
 import lombok.RequiredArgsConstructor;
 import org.quartz.*;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Component;
@@ -20,12 +21,13 @@
 
 @Component
 @DisallowConcurrentExecution // 绂佹骞跺彂鎵ц鍚屼竴涓狫ob
-@RequiredArgsConstructor
 public class TimingTaskJob implements Job, Serializable {
     private static final long serialVersionUID = 1L; // 蹇呴』瀹氫箟搴忓垪鍖朓D
 
-    private final InspectionTaskMapper inspectionTaskMapper;
-    private final JdbcTemplate jdbcTemplate;
+    @Autowired
+    private InspectionTaskMapper inspectionTaskMapper;
+    @Autowired
+    private JdbcTemplate jdbcTemplate;
 
     @Override
     public void execute(JobExecutionContext context) throws JobExecutionException {
@@ -46,7 +48,7 @@
             if (timingTask == null) {
                 throw new JobExecutionException("鎵句笉鍒板畾鏃朵换鍔�: " + taskId);
             }
-            
+
 //            if (!timingTask.isActive()) {
 //                throw new JobExecutionException("瀹氭椂浠诲姟宸茬鐢�: " + taskId);
 //            }
diff --git a/src/main/java/com/ruoyi/oA/controller/OaProjectController.java b/src/main/java/com/ruoyi/oA/controller/OaProjectController.java
deleted file mode 100644
index b7ecc7a..0000000
--- a/src/main/java/com/ruoyi/oA/controller/OaProjectController.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package com.ruoyi.oA.controller;
-
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ruoyi.framework.web.domain.AjaxResult;
-import com.ruoyi.oA.dto.OaProjectDto;
-import com.ruoyi.oA.pojo.OaProject;
-import com.ruoyi.oA.service.OaProjectService;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import io.swagger.v3.oas.annotations.Operation;
-import jakarta.servlet.http.HttpServletResponse;
-import lombok.AllArgsConstructor;
-import org.apache.commons.collections4.CollectionUtils;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.HashMap;
-import java.util.List;
-
-@Tag(name = "oA椤圭洰绠$悊")
-@RestController
-@AllArgsConstructor
-@RequestMapping("/oA/project")
-public class OaProjectController {
-    private final OaProjectService oaProjectService;
-
-    @Operation(summary = "鑾峰彇椤圭洰鍒楄〃")
-    @GetMapping("/listPage")
-    public AjaxResult listPage(Page page, OaProjectDto oaProjectDto) {
-        IPage<OaProjectDto> listPage = oaProjectService.listPage(page, oaProjectDto);
-        return AjaxResult.success(listPage);
-    }
-    @Operation(summary = "鑾峰彇椤圭洰鍒楄〃璇︽儏")
-    @GetMapping("/getList")
-    public AjaxResult getList(Page page, OaProjectDto oaProjectDto) {
-        IPage<OaProjectDto> listPage = oaProjectService.listPage(page, oaProjectDto);
-        HashMap<Object, Object> Map = new HashMap<>();
-        listPage.getRecords().forEach(item -> {
-            Map.put(item.getProjectId(), item);
-        });
-        return AjaxResult.success(Map);
-    }
-    @Operation(summary = "澧炴坊椤圭洰")
-    @PostMapping("/add")
-    public AjaxResult add(@RequestBody OaProject oaProject) {
-        boolean save = oaProjectService.save(oaProject);
-        return AjaxResult.success(save);
-    }
-    @Operation(summary = "鍒犻櫎椤圭洰")
-    @DeleteMapping("/delete/{id}")
-    public AjaxResult delete(@PathVariable Long id) {
-        boolean remove = oaProjectService.deleteById(id);
-        return AjaxResult.success(remove);
-    }
-    @Operation(summary = "鏇存柊椤圭洰")
-    @PostMapping("/update")
-    public AjaxResult update(@RequestBody OaProject oaProject) {
-        boolean update = oaProjectService.updateById(oaProject);
-        return AjaxResult.success(update);
-    }
-//    @Operation(summary = "鏍规嵁ID鑾峰彇椤圭洰璇︽儏")
-//    @GetMapping("/getById")
-//    public AjaxResult getById(Long id) {
-//        OaProject oaProject = oaProjectService.getById(id);
-//        return AjaxResult.success(oaProject);
-//    }
-    @Operation(summary = "瀵煎嚭鎵�閫夐」鐩�")
-    @PostMapping("/export/{ids}")
-    public void export(HttpServletResponse response, @PathVariable("ids") List<Long> ids) {
-        if (CollectionUtils.isEmpty(ids)) {
-            throw new IllegalArgumentException("瀵煎嚭椤圭洰鍒楄〃涓嶈兘涓虹┖");
-        }
-        oaProjectService.export(response, ids);
-    }
-
-}
diff --git a/src/main/java/com/ruoyi/oA/controller/OaProjectPhaseController.java b/src/main/java/com/ruoyi/oA/controller/OaProjectPhaseController.java
deleted file mode 100644
index a4a05bb..0000000
--- a/src/main/java/com/ruoyi/oA/controller/OaProjectPhaseController.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package com.ruoyi.oA.controller;
-
-import com.ruoyi.framework.web.domain.AjaxResult;
-import com.ruoyi.oA.pojo.OaProjectPhase;
-import com.ruoyi.oA.service.OaProjectPhaseService;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import io.swagger.v3.oas.annotations.Operation;
-import lombok.AllArgsConstructor;
-import org.springframework.web.bind.annotation.*;
-
-@Tag(name = "oA椤圭洰闃舵绠$悊")
-@RestController
-@RequestMapping("/oA/projectPhase")
-@AllArgsConstructor
-public class OaProjectPhaseController {
-    private final OaProjectPhaseService oaProjectPhaseService;
-
-    @Operation(summary = "鏂板椤圭洰闃舵")
-    @PostMapping("/add")
-    public AjaxResult add(@RequestBody OaProjectPhase oaProjectPhase) {
-        return AjaxResult.success(oaProjectPhaseService.save(oaProjectPhase));
-    }
-
-    @Operation(summary = "鍒犻櫎椤圭洰闃舵")
-    @DeleteMapping("/delete/{phaseId}")
-    public AjaxResult delete(@PathVariable Integer phaseId) {
-        return AjaxResult.success(oaProjectPhaseService.deleteById(phaseId));
-    }
-
-    @Operation(summary = "鏇存柊椤圭洰闃舵")
-    @PostMapping("/update")
-    public AjaxResult update(@RequestBody OaProjectPhase oaProjectPhase) {
-        return AjaxResult.success(oaProjectPhaseService.updateById(oaProjectPhase));
-    }
-
-    @Operation(summary = "鏍规嵁椤圭洰id鏌ヨ椤圭洰闃舵鍒楄〃")
-    @GetMapping("/listByProjectId/{projectId}")
-    public AjaxResult listByProjectId(@PathVariable Integer projectId) {
-        return AjaxResult.success(oaProjectPhaseService.listByProjectId(projectId));
-    }
-}
diff --git a/src/main/java/com/ruoyi/oA/controller/OaProjectPhaseTaskController.java b/src/main/java/com/ruoyi/oA/controller/OaProjectPhaseTaskController.java
deleted file mode 100644
index 91a846e..0000000
--- a/src/main/java/com/ruoyi/oA/controller/OaProjectPhaseTaskController.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package com.ruoyi.oA.controller;
-
-import com.ruoyi.framework.web.domain.AjaxResult;
-import com.ruoyi.oA.pojo.OaProjectPhaseTask;
-import com.ruoyi.oA.service.OaProjectPhaseTaskService;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import io.swagger.v3.oas.annotations.Operation;
-import lombok.AllArgsConstructor;
-import org.springframework.web.bind.annotation.*;
-
-@Tag(name = "oA椤圭洰闃舵浠诲姟绠$悊")
-@RestController
-@RequestMapping("/oA/projectPhaseTask")
-@AllArgsConstructor
-public class OaProjectPhaseTaskController {
-    private final OaProjectPhaseTaskService oaProjectPhaseTaskService;
-
-    @Operation(summary = "鏂板椤圭洰闃舵浠诲姟")
-    @PostMapping("/add")
-    public AjaxResult add(@RequestBody OaProjectPhaseTask oaProjectPhaseTask) {
-        return AjaxResult.success(oaProjectPhaseTaskService.save(oaProjectPhaseTask));
-    }
-
-    @Operation(summary = "鏍规嵁椤圭洰闃舵id鏌ヨ椤圭洰闃舵浠诲姟鍒楄〃")
-    @GetMapping("/listByPhaseId/{phaseId}")
-    public AjaxResult listByPhaseId(@PathVariable Integer phaseId) {
-        return AjaxResult.success(oaProjectPhaseTaskService.listByPhaseId(phaseId));
-    }
-
-    @Operation(summary = "鍒犻櫎椤圭洰闃舵浠诲姟")
-    @DeleteMapping("/delete/{taskId}")
-    public AjaxResult delete(@PathVariable Integer taskId) {
-        return AjaxResult.success(oaProjectPhaseTaskService.removeById(taskId));
-    }
-
-    @Operation(summary = "鏇存柊椤圭洰闃舵浠诲姟")
-    @PostMapping("/update")
-    public AjaxResult update(@RequestBody OaProjectPhaseTask oaProjectPhaseTask) {
-        return AjaxResult.success(oaProjectPhaseTaskService.updateById(oaProjectPhaseTask));
-    }
-}
diff --git a/src/main/java/com/ruoyi/oA/dto/OaProjectDto.java b/src/main/java/com/ruoyi/oA/dto/OaProjectDto.java
deleted file mode 100644
index 0f90faf..0000000
--- a/src/main/java/com/ruoyi/oA/dto/OaProjectDto.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.ruoyi.oA.dto;
-
-import com.ruoyi.framework.aspectj.lang.annotation.Excel;
-import com.ruoyi.oA.pojo.OaProject;
-import com.ruoyi.oA.pojo.OaProjectPhase;
-import com.ruoyi.oA.pojo.OaProjectPhaseTask;
-import lombok.Data;
-
-import java.util.List;
-
-@Data
-public class OaProjectDto extends OaProject {
-    /**
-     * 璐熻矗浜哄悕绉�
-     */
-    @Excel(name = "璐熻矗浜哄悕绉�")
-    private String managerName;
-    /**
-     * 椤圭洰闃舵鍒楄〃
-     */
-    private List<OaProjectPhaseDto> oaProjectPhasesDto;
-//    /**
-//     * 椤圭洰闃舵浠诲姟鍒楄〃
-//     */
-//    private List<OaProjectPhaseTask> oaProjectPhaseTasks;
-}
diff --git a/src/main/java/com/ruoyi/oA/dto/OaProjectPhaseDto.java b/src/main/java/com/ruoyi/oA/dto/OaProjectPhaseDto.java
deleted file mode 100644
index 4ef163e..0000000
--- a/src/main/java/com/ruoyi/oA/dto/OaProjectPhaseDto.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.ruoyi.oA.dto;
-
-import com.ruoyi.oA.pojo.OaProjectPhase;
-import com.ruoyi.oA.pojo.OaProjectPhaseTask;
-import lombok.Data;
-
-import java.util.List;
-
-@Data
-public class OaProjectPhaseDto extends OaProjectPhase {
-    private List<OaProjectPhaseTask> oaProjectPhaseTasks;
-}
diff --git a/src/main/java/com/ruoyi/oA/mapper/OaProjectMapper.java b/src/main/java/com/ruoyi/oA/mapper/OaProjectMapper.java
deleted file mode 100644
index 2114cef..0000000
--- a/src/main/java/com/ruoyi/oA/mapper/OaProjectMapper.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package com.ruoyi.oA.mapper;
-
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ruoyi.oA.dto.OaProjectDto;
-import com.ruoyi.oA.pojo.OaProject;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import org.apache.ibatis.annotations.Param;
-
-import java.util.List;
-
-/**
-* @author ywx
-* @description 閽堝琛ㄣ�恛a_project(OA绯荤粺-椤圭洰浠诲姟鍗忓悓-椤圭洰琛�)銆戠殑鏁版嵁搴撴搷浣淢apper
-* @createDate 2025-09-24 09:18:46
-* @Entity com.ruoyi.oA.pojo.OaProject
-*/
-public interface OaProjectMapper extends BaseMapper<OaProject> {
-
-    IPage<OaProjectDto> listPage(Page page,@Param("req") OaProjectDto oaProjectDto);
-
-    List<OaProjectDto> selectByIds(List<Long> ids);
-}
-
-
-
-
diff --git a/src/main/java/com/ruoyi/oA/mapper/OaProjectPhaseMapper.java b/src/main/java/com/ruoyi/oA/mapper/OaProjectPhaseMapper.java
deleted file mode 100644
index 41f6ab0..0000000
--- a/src/main/java/com/ruoyi/oA/mapper/OaProjectPhaseMapper.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.ruoyi.oA.mapper;
-
-import com.ruoyi.oA.pojo.OaProjectPhase;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-
-/**
-* @author ywx
-* @description 閽堝琛ㄣ�恛a_project_phase(OA绯荤粺-椤圭洰闃舵琛�)銆戠殑鏁版嵁搴撴搷浣淢apper
-* @createDate 2025-09-24 09:18:46
-* @Entity com.ruoyi.oA.pojo.OaProjectPhase
-*/
-public interface OaProjectPhaseMapper extends BaseMapper<OaProjectPhase> {
-
-}
-
-
-
-
diff --git a/src/main/java/com/ruoyi/oA/mapper/OaProjectPhaseTaskMapper.java b/src/main/java/com/ruoyi/oA/mapper/OaProjectPhaseTaskMapper.java
deleted file mode 100644
index b357c76..0000000
--- a/src/main/java/com/ruoyi/oA/mapper/OaProjectPhaseTaskMapper.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.ruoyi.oA.mapper;
-
-import com.ruoyi.oA.pojo.OaProjectPhaseTask;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-
-/**
-* @author ywx
-* @description 閽堝琛ㄣ�恛a_project_phase_task(OA绯荤粺-椤圭洰闃舵-浠诲姟琛�)銆戠殑鏁版嵁搴撴搷浣淢apper
-* @createDate 2025-09-24 09:18:46
-* @Entity com.ruoyi.oA.pojo.OaProjectPhaseTask
-*/
-public interface OaProjectPhaseTaskMapper extends BaseMapper<OaProjectPhaseTask> {
-
-}
-
-
-
-
diff --git a/src/main/java/com/ruoyi/oA/pojo/OaProject.java b/src/main/java/com/ruoyi/oA/pojo/OaProject.java
deleted file mode 100644
index 4a5af5b..0000000
--- a/src/main/java/com/ruoyi/oA/pojo/OaProject.java
+++ /dev/null
@@ -1,110 +0,0 @@
-package com.ruoyi.oA.pojo;
-
-import com.baomidou.mybatisplus.annotation.*;
-
-import java.io.Serializable;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.util.Date;
-
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.ruoyi.framework.aspectj.lang.annotation.Excel;
-import lombok.Data;
-import org.springframework.format.annotation.DateTimeFormat;
-
-/**
- * OA绯荤粺-椤圭洰浠诲姟鍗忓悓-椤圭洰琛�
- * @TableName oa_project
- */
-@TableName(value ="oa_project")
-@Data
-public class OaProject implements Serializable {
-    /**
-     * 
-     */
-    @TableId(type = IdType.AUTO)
-    private Integer projectId;
-
-    /**
-     * 椤圭洰鍚嶇О
-     */
-    @Excel(name = "椤圭洰鍚嶇О")
-    private String projectName;
-
-    /**
-     * 椤圭洰鎻忚堪
-     */
-    @Excel(name = "椤圭洰鎻忚堪")
-    private String description;
-
-    /**
-     * 寮�濮嬫椂闂�
-     */
-    @Excel(name = "寮�濮嬫椂闂�")
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    @DateTimeFormat(pattern = "yyyy-MM-dd")
-    private LocalDate startDate;
-
-    /**
-     * 缁撴潫鏃堕棿
-     */
-    @Excel(name = "缁撴潫鏃堕棿")
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    @DateTimeFormat(pattern = "yyyy-MM-dd")
-    private LocalDate endDate;
-
-    /**
-     * 鐘舵��
-     */
-    @Excel(name = "鐘舵��")
-    private String status;
-
-    /**
-     * 瀹屾垚搴�
-     */
-    @Excel(name = "瀹屾垚搴�")
-    private Integer completionRate;
-
-    /**
-     * 璐熻矗浜篿d
-     */
-    private Long managerId;
-
-    /**
-     * 鍒涘缓鐢ㄦ埛
-     */
-    @TableField(fill = FieldFill.INSERT)
-    private Integer createUser;
-
-    /**
-     * 鍒涘缓鏃堕棿
-     */
-    @TableField(fill = FieldFill.INSERT)
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    private LocalDateTime createTime;
-
-    /**
-     * 淇敼鐢ㄦ埛
-     */
-    @TableField(fill = FieldFill.INSERT_UPDATE)
-    private Integer updateUser;
-
-    /**
-     * 淇敼鏃堕棿
-     */
-    @TableField(fill = FieldFill.INSERT_UPDATE)
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    private LocalDateTime updateTime;
-
-    /**
-     * 绉熸埛ID
-     */
-    @TableField(fill = FieldFill.INSERT)
-    private Long tenantId;
-
-
-    @TableField(fill = FieldFill.INSERT)
-    private Long deptId;
-}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/oA/pojo/OaProjectPhase.java b/src/main/java/com/ruoyi/oA/pojo/OaProjectPhase.java
deleted file mode 100644
index b26bb9d..0000000
--- a/src/main/java/com/ruoyi/oA/pojo/OaProjectPhase.java
+++ /dev/null
@@ -1,95 +0,0 @@
-package com.ruoyi.oA.pojo;
-
-
-import com.baomidou.mybatisplus.annotation.*;
-
-import java.io.Serializable;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.util.Date;
-
-
-import com.fasterxml.jackson.annotation.JsonFormat;
-import lombok.Data;
-import org.springframework.format.annotation.DateTimeFormat;
-
-/**
- * OA绯荤粺-椤圭洰闃舵琛�
- * @TableName oa_project_phase
- */
-@TableName(value ="oa_project_phase")
-@Data
-public class OaProjectPhase implements Serializable {
-    /**
-     * 
-     */
-    @TableId(type = IdType.AUTO)
-    private Integer phaseId;
-
-    /**
-     * 椤圭洰闃舵鍚嶇О
-     */
-    private String phaseName;
-
-    /**
-     * oa_project琛╥d
-     */
-    private Integer oaProjectId;
-
-    /**
-     * 寮�濮嬫椂闂�
-     */
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    @DateTimeFormat(pattern = "yyyy-MM-dd")
-    private LocalDate startDate;
-
-    /**
-     * 缁撴潫鏃堕棿
-     */
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    @DateTimeFormat(pattern = "yyyy-MM-dd")
-    private LocalDate endDate;
-
-    /**
-     * 鐘舵��
-     */
-    private String status;
-
-    /**
-     * 鍒涘缓鐢ㄦ埛
-     */
-    @TableField(fill = FieldFill.INSERT)
-    private Integer createUser;
-
-    /**
-     * 鍒涘缓鏃堕棿
-     */
-    @TableField(fill = FieldFill.INSERT)
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    private LocalDateTime createTime;
-
-    /**
-     * 淇敼鐢ㄦ埛
-     */
-    @TableField(fill = FieldFill.INSERT_UPDATE)
-    private Integer updateUser;
-
-    /**
-     * 淇敼鏃堕棿
-     */
-    @TableField(fill = FieldFill.INSERT_UPDATE)
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    private LocalDateTime updateTime;
-
-    /**
-     * 绉熸埛ID
-     */
-    @TableField(fill = FieldFill.INSERT)
-    private Long tenantId;
-
-
-    @TableField(fill = FieldFill.INSERT)
-    private Long deptId;
-}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/oA/pojo/OaProjectPhaseTask.java b/src/main/java/com/ruoyi/oA/pojo/OaProjectPhaseTask.java
deleted file mode 100644
index 1b81069..0000000
--- a/src/main/java/com/ruoyi/oA/pojo/OaProjectPhaseTask.java
+++ /dev/null
@@ -1,120 +0,0 @@
-package com.ruoyi.oA.pojo;
-
-import com.baomidou.mybatisplus.annotation.*;
-
-import java.io.Serializable;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.util.Date;
-
-import com.fasterxml.jackson.annotation.JsonFormat;
-import lombok.Data;
-import org.springframework.format.annotation.DateTimeFormat;
-
-/**
- * OA绯荤粺-椤圭洰闃舵-浠诲姟琛�
- * @TableName oa_project_phase_task
- */
-@TableName(value ="oa_project_phase_task")
-@Data
-public class OaProjectPhaseTask implements Serializable {
-    /**
-     * 
-     */
-    @TableId(type = IdType.AUTO)
-    private Integer taskId;
-
-    /**
-     * 椤圭洰闃舵浠诲姟鍚嶇О
-     */
-    private String taskName;
-
-    /**
-     * oa_project_phase琛╥d
-     */
-    private Integer phaseId;
-
-    /**
-     * 寮�濮嬫椂闂�
-     */
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    @DateTimeFormat(pattern = "yyyy-MM-dd")
-    private LocalDate startDate;
-
-    /**
-     * 缁撴潫鏃堕棿
-     */
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    @DateTimeFormat(pattern = "yyyy-MM-dd")
-    private LocalDate endDate;
-
-    /**
-     * 鐩爣浠诲姟瀹屾垚鏃ユ湡
-     */
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    @DateTimeFormat(pattern = "yyyy-MM-dd")
-    private LocalDate targetDate;
-
-    /**
-     * 鐩爣鍊�
-     */
-    private Integer targetValue;
-
-    /**
-     * 褰撳墠鍊�
-     */
-    private Integer currentValue;
-
-    /**
-     * 鍗曚綅
-     */
-    private String unit;
-
-    /**
-     * 鐘舵��
-     */
-    private String status;
-
-    /**
-     * 瀹屾垚搴�
-     */
-    private Integer completionRate;
-
-    /**
-     * 鍒涘缓鐢ㄦ埛
-     */
-    @TableField(fill = FieldFill.INSERT)
-    private Integer createUser;
-
-    /**
-     * 鍒涘缓鏃堕棿
-     */
-    @TableField(fill = FieldFill.INSERT)
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    private LocalDateTime createTime;
-
-    /**
-     * 淇敼鐢ㄦ埛
-     */
-    @TableField(fill = FieldFill.INSERT_UPDATE)
-    private Integer updateUser;
-
-    /**
-     * 淇敼鏃堕棿
-     */
-    @TableField(fill = FieldFill.INSERT_UPDATE)
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    private LocalDateTime updateTime;
-
-    /**
-     * 绉熸埛ID
-     */
-    @TableField(fill = FieldFill.INSERT)
-    private Long tenantId;
-
-
-    @TableField(fill = FieldFill.INSERT)
-    private Long deptId;
-}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/oA/service/OaProjectPhaseService.java b/src/main/java/com/ruoyi/oA/service/OaProjectPhaseService.java
deleted file mode 100644
index 7914080..0000000
--- a/src/main/java/com/ruoyi/oA/service/OaProjectPhaseService.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.ruoyi.oA.service;
-
-import com.ruoyi.oA.dto.OaProjectPhaseDto;
-import com.ruoyi.oA.pojo.OaProjectPhase;
-import com.baomidou.mybatisplus.extension.service.IService;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-
-import java.util.List;
-
-/**
-* @author ywx
-* @description 閽堝琛ㄣ�恛a_project_phase(OA绯荤粺-椤圭洰闃舵琛�)銆戠殑鏁版嵁搴撴搷浣淪ervice
-* @createDate 2025-09-24 09:18:46
-*/
-public interface OaProjectPhaseService extends IService<OaProjectPhase> {
-
-    List<OaProjectPhaseDto> listByProjectId(Integer oaProjectId);
-
-    boolean deleteById(Integer phaseId);
-}
diff --git a/src/main/java/com/ruoyi/oA/service/OaProjectPhaseTaskService.java b/src/main/java/com/ruoyi/oA/service/OaProjectPhaseTaskService.java
deleted file mode 100644
index 225d12e..0000000
--- a/src/main/java/com/ruoyi/oA/service/OaProjectPhaseTaskService.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.ruoyi.oA.service;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ruoyi.oA.pojo.OaProjectPhaseTask;
-import com.baomidou.mybatisplus.extension.service.IService;
-
-import java.util.List;
-
-/**
-* @author ywx
-* @description 閽堝琛ㄣ�恛a_project_phase_task(OA绯荤粺-椤圭洰闃舵-浠诲姟琛�)銆戠殑鏁版嵁搴撴搷浣淪ervice
-* @createDate 2025-09-24 09:18:46
-*/
-public interface OaProjectPhaseTaskService extends IService<OaProjectPhaseTask> {
-
-    List<OaProjectPhaseTask> listByPhaseId(Integer phaseId);
-}
diff --git a/src/main/java/com/ruoyi/oA/service/OaProjectService.java b/src/main/java/com/ruoyi/oA/service/OaProjectService.java
deleted file mode 100644
index 9f8e474..0000000
--- a/src/main/java/com/ruoyi/oA/service/OaProjectService.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.ruoyi.oA.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.oA.dto.OaProjectDto;
-import com.ruoyi.oA.pojo.OaProject;
-import jakarta.servlet.http.HttpServletResponse;
-
-import java.util.List;
-
-/**
-* @author ywx
-* @description 閽堝琛ㄣ�恛a_project(OA绯荤粺-椤圭洰浠诲姟鍗忓悓-椤圭洰琛�)銆戠殑鏁版嵁搴撴搷浣淪ervice
-* @createDate 2025-09-24 09:18:46
-*/
-public interface OaProjectService extends IService<OaProject> {
-
-    IPage<OaProjectDto> listPage(Page page, OaProjectDto oaProjectDto);
-
-    void export(HttpServletResponse response, List<Long> ids);
-
-    boolean deleteById(Long id);
-}
diff --git a/src/main/java/com/ruoyi/oA/service/impl/OaProjectPhaseServiceImpl.java b/src/main/java/com/ruoyi/oA/service/impl/OaProjectPhaseServiceImpl.java
deleted file mode 100644
index 640ec42..0000000
--- a/src/main/java/com/ruoyi/oA/service/impl/OaProjectPhaseServiceImpl.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package com.ruoyi.oA.service.impl;
-
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.ruoyi.common.utils.bean.BeanUtils;
-import com.ruoyi.oA.dto.OaProjectPhaseDto;
-import com.ruoyi.oA.mapper.OaProjectPhaseMapper;
-import com.ruoyi.oA.pojo.OaProjectPhase;
-import com.ruoyi.oA.pojo.OaProjectPhaseTask;
-import com.ruoyi.oA.service.OaProjectPhaseService;
-import com.ruoyi.oA.service.OaProjectPhaseTaskService;
-import lombok.RequiredArgsConstructor;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
-* @author ywx
-* @description 閽堝琛ㄣ�恛a_project_phase(OA绯荤粺-椤圭洰闃舵琛�)銆戠殑鏁版嵁搴撴搷浣淪ervice瀹炵幇
-* @createDate 2025-09-24 09:18:46
-*/
-@Service
-@RequiredArgsConstructor
-@Transactional(rollbackFor = Exception.class)
-public class OaProjectPhaseServiceImpl extends ServiceImpl<OaProjectPhaseMapper, OaProjectPhase>
-    implements OaProjectPhaseService{
-    private final OaProjectPhaseMapper oaProjectPhaseMapper;
-    private final OaProjectPhaseTaskService oaProjectPhaseTaskService;
-
-    @Override
-    public List<OaProjectPhaseDto> listByProjectId(Integer oaProjectId) {
-        List<OaProjectPhase> oaProjectPhases = oaProjectPhaseMapper.selectList(new LambdaQueryWrapper<OaProjectPhase>()
-                .eq(OaProjectPhase::getOaProjectId, oaProjectId));
-        List<OaProjectPhaseDto> collect = oaProjectPhases.stream().map(oaProjectPhase -> {
-            OaProjectPhaseDto oaProjectPhaseDto = new OaProjectPhaseDto();
-            BeanUtils.copyProperties(oaProjectPhase, oaProjectPhaseDto);
-//            List<OaProjectPhaseTask> oaProjectPhaseTasks = oaProjectPhaseTaskService.listByPhaseId(oaProjectPhaseDto.getPhaseId());
-            oaProjectPhaseDto.setOaProjectPhaseTasks(oaProjectPhaseTaskService.listByPhaseId(oaProjectPhaseDto.getPhaseId()));
-            return oaProjectPhaseDto;
-        }).collect(Collectors.toList());
-        return collect;
-    }
-
-    @Override
-    public boolean deleteById(Integer phaseId) {
-        // 鍏堝垹闄ら」鐩樁娈典笅鐨勪换鍔�
-        oaProjectPhaseTaskService.remove(new LambdaQueryWrapper<OaProjectPhaseTask>()
-                .eq(OaProjectPhaseTask::getPhaseId, phaseId));
-        return oaProjectPhaseMapper.deleteById(phaseId) > 0;
-    }
-}
-
-
-
-
diff --git a/src/main/java/com/ruoyi/oA/service/impl/OaProjectPhaseTaskServiceImpl.java b/src/main/java/com/ruoyi/oA/service/impl/OaProjectPhaseTaskServiceImpl.java
deleted file mode 100644
index 625e8d8..0000000
--- a/src/main/java/com/ruoyi/oA/service/impl/OaProjectPhaseTaskServiceImpl.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.ruoyi.oA.service.impl;
-
-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.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.ruoyi.oA.pojo.OaProjectPhaseTask;
-import com.ruoyi.oA.service.OaProjectPhaseTaskService;
-import com.ruoyi.oA.mapper.OaProjectPhaseTaskMapper;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-
-/**
-* @author ywx
-* @description 閽堝琛ㄣ�恛a_project_phase_task(OA绯荤粺-椤圭洰闃舵-浠诲姟琛�)銆戠殑鏁版嵁搴撴搷浣淪ervice瀹炵幇
-* @createDate 2025-09-24 09:18:46
-*/
-@Service
-public class OaProjectPhaseTaskServiceImpl extends ServiceImpl<OaProjectPhaseTaskMapper, OaProjectPhaseTask>
-    implements OaProjectPhaseTaskService{
-
-
-    @Override
-    public List<OaProjectPhaseTask> listByPhaseId(Integer phaseId) {
-        return baseMapper.selectList(new LambdaQueryWrapper<OaProjectPhaseTask>()
-                .eq(OaProjectPhaseTask::getPhaseId, phaseId));
-    }
-}
-
-
-
-
diff --git a/src/main/java/com/ruoyi/oA/service/impl/OaProjectServiceImpl.java b/src/main/java/com/ruoyi/oA/service/impl/OaProjectServiceImpl.java
deleted file mode 100644
index afe125a..0000000
--- a/src/main/java/com/ruoyi/oA/service/impl/OaProjectServiceImpl.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package com.ruoyi.oA.service.impl;
-
-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.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.ruoyi.common.utils.poi.ExcelUtil;
-import com.ruoyi.oA.dto.OaProjectDto;
-import com.ruoyi.oA.mapper.OaProjectMapper;
-import com.ruoyi.oA.pojo.OaProject;
-import com.ruoyi.oA.pojo.OaProjectPhase;
-import com.ruoyi.oA.service.OaProjectPhaseService;
-import com.ruoyi.oA.service.OaProjectService;
-import jakarta.servlet.http.HttpServletResponse;
-import lombok.RequiredArgsConstructor;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.util.List;
-
-/**
-* @author ywx
-* @description 閽堝琛ㄣ�恛a_project(OA绯荤粺-椤圭洰浠诲姟鍗忓悓-椤圭洰琛�)銆戠殑鏁版嵁搴撴搷浣淪ervice瀹炵幇
-* @createDate 2025-09-24 09:18:45
-*/
-@Service
-@Transactional(rollbackFor = Exception.class)
-@RequiredArgsConstructor
-public class OaProjectServiceImpl extends ServiceImpl<OaProjectMapper, OaProject>
-    implements OaProjectService{
-    private final OaProjectMapper oaProjectMapper;
-    private final OaProjectPhaseService oaProjectPhaseService;
-
-    @Override
-    public IPage<OaProjectDto> listPage(Page page, OaProjectDto oaProjectDto) {
-        IPage<OaProjectDto> iPage = oaProjectMapper.listPage(page, oaProjectDto);
-        // 椤圭洰闃舵鍒楄〃
-        for (OaProjectDto projectDto : iPage.getRecords()) {
-            projectDto.setOaProjectPhasesDto(oaProjectPhaseService.listByProjectId(projectDto.getProjectId()));
-        }
-        return iPage;
-    }
-
-    @Override
-    public void export(HttpServletResponse response, List<Long> ids) {
-        List<OaProjectDto> list = oaProjectMapper.selectByIds(ids);
-        ExcelUtil<OaProjectDto> util = new ExcelUtil<OaProjectDto>(OaProjectDto.class);
-        util.exportExcel(response, list , "椤圭洰鏁版嵁");
-    }
-
-    @Override
-    public boolean deleteById(Long id) {
-        // 鍏堝垹闄ら」鐩笅鐨勯樁娈�
-        List<OaProjectPhase> oaProjectPhases = oaProjectPhaseService.list(new LambdaQueryWrapper<OaProjectPhase>()
-                .eq(OaProjectPhase::getOaProjectId, id));
-        if (!oaProjectPhases.isEmpty()) {
-            oaProjectPhases.forEach(oaProjectPhase -> {
-                oaProjectPhaseService.deleteById(oaProjectPhase.getPhaseId());
-            });
-        }
-        return oaProjectMapper.deleteById(id) > 0;
-    }
-}
-
-
-
-
diff --git a/src/main/java/com/ruoyi/procurementrecord/mapper/ReturnManagementMapper.java b/src/main/java/com/ruoyi/procurementrecord/mapper/ReturnManagementMapper.java
index 4392109..5c6504b 100644
--- a/src/main/java/com/ruoyi/procurementrecord/mapper/ReturnManagementMapper.java
+++ b/src/main/java/com/ruoyi/procurementrecord/mapper/ReturnManagementMapper.java
@@ -3,6 +3,8 @@
 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.account.bean.dto.SalesReturnDto;
+import com.ruoyi.account.bean.vo.SalesReturnVo;
 import com.ruoyi.procurementrecord.dto.ReturnManagementDto;
 import com.ruoyi.procurementrecord.pojo.ReturnManagement;
 import org.apache.ibatis.annotations.Param;
@@ -22,4 +24,6 @@
     IPage<ReturnManagementDto> listPage(Page page, @Param("req") ReturnManagementDto returnManagement);
 
     ReturnManagementDto getReturnManagementDtoById(Long id);
+
+    IPage<SalesReturnVo> listPageAccountSalesReturn(Page page, @Param("req") SalesReturnDto salesReturnDto);
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/service/impl/ReturnManagementServiceImpl.java b/src/main/java/com/ruoyi/procurementrecord/service/impl/ReturnManagementServiceImpl.java
index b22d63d..e34ca05 100644
--- a/src/main/java/com/ruoyi/procurementrecord/service/impl/ReturnManagementServiceImpl.java
+++ b/src/main/java/com/ruoyi/procurementrecord/service/impl/ReturnManagementServiceImpl.java
@@ -8,7 +8,6 @@
 import com.ruoyi.account.pojo.AccountExpense;
 import com.ruoyi.account.service.SalesRefundAmountOrderService;
 import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
-import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum;
 import com.ruoyi.common.utils.OrderUtils;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.procurementrecord.dto.ReturnManagementDto;
@@ -119,7 +118,7 @@
             // 鏄惁鏈夎川閲忛棶棰�
             if (returnSaleProduct.getIsQuality() == 1) {
                 // 鏈夎川閲忛棶棰橈紝鍏ヤ笉鍚堟牸搴�
-                stockUtils.addUnStock(returnSaleProduct.getProductModelId(),returnSaleProduct.getNum(), StockInUnQualifiedRecordTypeEnum.RETURN_UNSTOCK_IN.getCode(),returnSaleProduct.getId());
+                stockUtils.addUnStock(returnSaleProduct.getProductModelId(),returnSaleProduct.getNum(), StockInQualifiedRecordTypeEnum.RETURN_UNSTOCK_IN.getCode(),returnSaleProduct.getId());
             }else{
                 // 鏃犺川閲忛棶棰橈紝鍏ュ悎鏍煎簱
                 stockUtils.addStock(returnSaleProduct.getProductModelId(),returnSaleProduct.getNum(), StockInQualifiedRecordTypeEnum.RETURN_HE_IN.getCode(),returnSaleProduct.getId());
diff --git a/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java b/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
index 5356500..1434db6 100644
--- a/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
+++ b/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
@@ -1,5 +1,6 @@
 package com.ruoyi.procurementrecord.utils;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.ruoyi.procurementrecord.mapper.ProcurementRecordMapper;
@@ -66,8 +67,6 @@
 
     /**
      * 鍚堟牸鍏ュ簱
-     * @param productModelId
-     * @param quantity
      * @param recordType
      * @param recordId
      */
@@ -105,15 +104,6 @@
      * @param recordType
      * @param recordId
      */
-    public void substractStock(Long productModelId, BigDecimal quantity, String recordType, Long recordId) {
-        StockInventoryDto stockInventoryDto = new StockInventoryDto();
-        stockInventoryDto.setRecordId(recordId);
-        stockInventoryDto.setRecordType(String.valueOf(recordType));
-        stockInventoryDto.setQualitity(quantity);
-        stockInventoryDto.setProductModelId(productModelId);
-        stockInventoryService.subtractStockInventory(stockInventoryDto);
-    }
-
     public void substractStock(Long productModelId, BigDecimal quantity, String recordType, Long recordId, String batchNo) {
         StockInventoryDto stockInventoryDto = new StockInventoryDto();
         stockInventoryDto.setRecordId(recordId);
@@ -121,7 +111,20 @@
         stockInventoryDto.setQualitity(quantity);
         stockInventoryDto.setProductModelId(productModelId);
         stockInventoryDto.setBatchNo(batchNo);
-        stockInventoryService.subtractStockInventory(stockInventoryDto);
+        stockInventoryService.addStockOutRecordOnly(stockInventoryDto);
+    }
+
+    /**
+     * 鍙戣揣瀹℃壒鐘舵�佹洿鏀�
+     * @param recordType
+     * @param recordId
+     */
+    public void shipmentStatus(String recordType, Long recordId) {
+        LambdaQueryWrapper<StockOutRecord> queryWrapper = new LambdaQueryWrapper<StockOutRecord>().eq(StockOutRecord::getRecordType, recordType)
+                .eq(StockOutRecord::getRecordId, recordId);
+        StockOutRecord stockOutRecord = stockOutRecordService.getOne(queryWrapper);
+        stockOutRecord.setApprovalStatus(0);
+        stockOutRecordService.updateById(stockOutRecord);
     }
 
     //涓嶅悎鏍煎簱瀛樺垹闄�
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
index 808e75d..20f4bfc 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -12,7 +12,6 @@
 import com.ruoyi.basic.pojo.Product;
 import com.ruoyi.basic.pojo.ProductModel;
 import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
-import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum;
 import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.bean.BeanUtils;
@@ -391,8 +390,6 @@
             }
             ProductionAccount productionAccount = new ProductionAccount();
             productionAccount.setProductionProductMainId(productionProductMain.getId());
-//            productionAccount.setSalesLedgerId(productionOrder.getSalesLedgerId());
-//            productionAccount.setSalesLedgerProductId(productionOrder.getSalesLedgerProductId() == null ? null : productionOrder.getSalesLedgerProductId().longValue());
             productionAccount.setSchedulingUserId(user == null ? null : user.getUserId());
             productionAccount.setSchedulingUserName(user == null ? dto.getUserName() : user.getNickName());
             productionAccount.setFinishedNum(productQty);
@@ -401,10 +398,6 @@
             productionAccount.setSchedulingDate(LocalDateTime.now());
             productionAccountMapper.insert(productionAccount);
         }
-//        if (defaultDecimal(dto.getScrapQty()).compareTo(BigDecimal.ZERO) > 0) {
-//            stockUtils.addUnStock(productModel.getId(), dto.getScrapQty(),
-//                    StockInUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode(), productionProductMain.getId());
-//        }
         return true;
     }
 
@@ -605,7 +598,7 @@
         productionOrderRoutingOperationParamMapper.delete(
                 Wrappers.<ProductionOrderRoutingOperationParam>lambdaQuery()
                         .eq(ProductionOrderRoutingOperationParam::getProductionProductMainId, productionProductMain.getId()));
-        stockUtils.deleteStockInRecord(productionProductMain.getId(), StockInUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode());
+        stockUtils.deleteStockInRecord(productionProductMain.getId(), StockInQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode());
         stockUtils.deleteStockInRecord(productionProductMain.getId(), StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode());
         stockUtils.deleteStockOutRecord(productionProductMain.getId(), StockOutQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode());
         productionProductMainMapper.deleteById(productionProductMain.getId());
diff --git a/src/main/java/com/ruoyi/projectManagement/service/impl/PlanServiceImpl.java b/src/main/java/com/ruoyi/projectManagement/service/impl/PlanServiceImpl.java
index e05ce2e..fc40f40 100644
--- a/src/main/java/com/ruoyi/projectManagement/service/impl/PlanServiceImpl.java
+++ b/src/main/java/com/ruoyi/projectManagement/service/impl/PlanServiceImpl.java
@@ -54,7 +54,7 @@
     public void savePlan(SavePlanVo savePlanVo) {
         Plan plan = BeanUtil.copyProperties(savePlanVo, Plan.class);
         // 闄勪欢澶勭悊
-        fileUtil.saveStorageAttachmentByRecordTypeAndRecordId("", RecordTypeEnum.PLAN, savePlanVo.getId(), savePlanVo.getStorageBlobDTOs());
+        fileUtil.saveStorageAttachmentByRecordTypeAndRecordId(null, RecordTypeEnum.PLAN, savePlanVo.getId(), savePlanVo.getStorageBlobDTOs());
         if (savePlanVo.getId() == null) {
             planMapper.insert(plan);
         } else {
diff --git a/src/main/java/com/ruoyi/projectManagement/service/impl/handle/InfoStageHandleService.java b/src/main/java/com/ruoyi/projectManagement/service/impl/handle/InfoStageHandleService.java
index 2025777..06f207d 100644
--- a/src/main/java/com/ruoyi/projectManagement/service/impl/handle/InfoStageHandleService.java
+++ b/src/main/java/com/ruoyi/projectManagement/service/impl/handle/InfoStageHandleService.java
@@ -52,7 +52,7 @@
         String attachmentIds = StrUtil.join(",", Optional.ofNullable(saveInfoStageVo.getAttachmentIds()).orElse(Collections.emptyList()));
         infoStage.setAttachment(attachmentIds);
 
-        fileUtil.saveStorageAttachmentByRecordTypeAndRecordId("", RecordTypeEnum.INFO_STAGE, infoStage.getProjectManagementInfoId(), saveInfoStageVo.getStorageBlobDTOs());
+        fileUtil.saveStorageAttachmentByRecordTypeAndRecordId(null, RecordTypeEnum.INFO_STAGE, infoStage.getProjectManagementInfoId(), saveInfoStageVo.getStorageBlobDTOs());
 
         if (infoStage.getId() == null) {
             infoStageMapper.insert(infoStage);
diff --git a/src/main/java/com/ruoyi/purchase/mapper/PurchaseReturnOrdersMapper.java b/src/main/java/com/ruoyi/purchase/mapper/PurchaseReturnOrdersMapper.java
index c6f55b7..f3a5fdf 100644
--- a/src/main/java/com/ruoyi/purchase/mapper/PurchaseReturnOrdersMapper.java
+++ b/src/main/java/com/ruoyi/purchase/mapper/PurchaseReturnOrdersMapper.java
@@ -2,6 +2,8 @@
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.account.bean.dto.PurchaseReturnDto;
+import com.ruoyi.account.bean.vo.PurchaseReturnVo;
 import com.ruoyi.purchase.dto.PurchaseReturnOrderDto;
 import com.ruoyi.purchase.pojo.PurchaseReturnOrders;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
@@ -23,4 +25,6 @@
     IPage<PurchaseReturnOrderHasAllInfoDto> listPage(Page page, @Param("params") PurchaseReturnOrderDto purchaseReturnOrder);
 
     PurchaseReturnOrderHasAllInfoDto getPurchaseReturnOrderHasAllInfoById(@Param("id") @NotNull Long id);
+
+    IPage<PurchaseReturnVo> listPageAccountPurchaseReturn(Page page, @Param("req") PurchaseReturnDto purchaseReturnDto);
 }
diff --git a/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java b/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
index 8c53500..86eb0ab 100644
--- a/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
+++ b/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
@@ -103,7 +103,11 @@
             // stockUtils.addStock(qualityInspect.getProductModelId(), qualityInspect.getQuantity(), StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode(), qualityInspect.getId());
             //浠呮坊鍔犲叆搴撹褰�
             StockInventoryDto stockInventoryDto = new StockInventoryDto();
+            //濡傛灉鏄噰璐川妫�鍚堟牸鍏ュ簱閫夌敤CUSTOMIZATION_UNSTOCK_OUT,鍏朵綑鍚堟牸鍏ュ簱閫夌敤QUALITYINSPECT_STOCK_IN
             stockInventoryDto.setRecordType(String.valueOf(StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode()));
+            if (ObjectUtils.isNotEmpty(qualityInspect.getPurchaseLedgerId())){
+                stockInventoryDto.setRecordType(String.valueOf(StockInQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_OUT.getCode()));
+            }
             stockInventoryDto.setRecordId(qualityInspect.getId());
             stockInventoryDto.setProductModelId(qualityInspect.getProductModelId());
             stockInventoryDto.setQualitity(qualityInspect.getQuantity());
diff --git a/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java b/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java
index 0296ef4..c82886e 100644
--- a/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java
+++ b/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java
@@ -6,7 +6,6 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
-import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.bean.BeanUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
@@ -82,7 +81,7 @@
                     break;
                 case "鎶ュ簾":
                     stockUtils.addUnStock(qualityInspect.getProductModelId(), unqualified.getQuantity(),
-                            StockInUnQualifiedRecordTypeEnum.DEFECTIVE_SCRAP.getCode(), unqualified.getId());
+                            StockInQualifiedRecordTypeEnum.DEFECTIVE_SCRAP.getCode(), unqualified.getId());
                     break;
                 case "璁╂鏀捐":
                     stockUtils.addStock(qualityInspect.getProductModelId(), unqualified.getQuantity(),
@@ -96,7 +95,7 @@
             switch (qualityUnqualified.getDealResult()) {
                 case "鎶ュ簾":
                     stockUtils.addUnStock(modelId, unqualified.getQuantity(),
-                            StockInUnQualifiedRecordTypeEnum.DEFECTIVE_SCRAP.getCode(), unqualified.getId());
+                            StockInQualifiedRecordTypeEnum.DEFECTIVE_SCRAP.getCode(), unqualified.getId());
                     break;
                 case "璁╂鏀捐":
                     stockUtils.addStock(modelId, unqualified.getQuantity(),
diff --git a/src/main/java/com/ruoyi/sales/mapper/ShippingInfoMapper.java b/src/main/java/com/ruoyi/sales/mapper/ShippingInfoMapper.java
index 5c7a5bf..7f3c701 100644
--- a/src/main/java/com/ruoyi/sales/mapper/ShippingInfoMapper.java
+++ b/src/main/java/com/ruoyi/sales/mapper/ShippingInfoMapper.java
@@ -6,7 +6,6 @@
 import com.ruoyi.sales.dto.SalesLedgerProductDto;
 import com.ruoyi.sales.dto.ShippingInfoDto;
 import com.ruoyi.sales.pojo.ShippingInfo;
-import com.ruoyi.sales.pojo.ShippingProductDetail;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -23,6 +22,4 @@
     List<SalesLedgerProductDto> getReturnManagementDtoById(@Param("shippingId")Long shippingId);
 
     List<ShippingInfo> getShippingInfoByCustomerName(String customerName);
-
-    List<ShippingProductDetail> getDateil(Long id);
 }
diff --git a/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
index ba17fe9..5f8788d 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
@@ -55,7 +55,7 @@
     @Override
     public IPage<ShippingInfoDto> listPage(Page page, ShippingInfo req) {
         IPage<ShippingInfoDto> listPage = shippingInfoMapper.listPage(page, req);
-        listPage.getRecords().forEach(item ->{
+        listPage.getRecords().forEach(item -> {
             item.setStorageBlobVOs(fileUtil.getStorageBlobVOsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum.IMAGE, RecordTypeEnum.SHIPPING_INFO, item.getId()));
         });
         return listPage;
@@ -68,7 +68,7 @@
             throw new RuntimeException("鍙戣揣淇℃伅涓嶅瓨鍦�");
         }
         //鎵e噺搴撳瓨
-        if(!"宸插彂璐�".equals(byId.getStatus())){
+        if (!"宸插彂璐�".equals(byId.getStatus())) {
             List<ShippingProductDetail> shippingProductDetails = shippingProductDetailMapper.selectList(new LambdaQueryWrapper<ShippingProductDetail>().eq(ShippingProductDetail::getShippingInfoId, req.getId()));
             if (CollectionUtils.isEmpty(shippingProductDetails)) {
                 throw new RuntimeException("鍙戣揣淇℃伅涓嶅瓨鍦�");
@@ -85,28 +85,28 @@
         boolean update = this.updateById(byId);
         // 淇濆瓨鏂囦欢
         fileUtil.saveStorageAttachment(ApplicationTypeEnum.IMAGE, RecordTypeEnum.SHIPPING_INFO, req.getId(), req.getStorageBlobDTOs());
-        return update ;
+        return update;
     }
 
     @Override
     public boolean delete(List<Long> ids) {
         List<ShippingInfo> shippingInfos = shippingInfoMapper.selectList(new LambdaQueryWrapper<ShippingInfo>()
                 .in(ShippingInfo::getId, ids));
-        if(CollectionUtils.isEmpty(shippingInfos)) return false;
+        if (CollectionUtils.isEmpty(shippingInfos)) return false;
         // 鍒犻櫎闄勪欢
         commonFileService.deleteByBusinessIds(ids, FileNameType.SHIP.getValue());
         // 鎵e凡鍙戣揣搴撳瓨
         for (ShippingInfo shippingInfo : shippingInfos) {
-            if("宸插彂璐�".equals(shippingInfo.getStatus())) {
+            if ("宸插彂璐�".equals(shippingInfo.getStatus())) {
                 stockUtils.deleteStockOutRecord(shippingInfo.getId(), StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode());
             }
         }
         // 鍒犻櫎鍙戣揣瀹℃壒
-        if(CollectionUtils.isNotEmpty(shippingInfos)){
-            for (ShippingInfo shippingInfo : shippingInfos){
+        if (CollectionUtils.isNotEmpty(shippingInfos)) {
+            for (ShippingInfo shippingInfo : shippingInfos) {
                 List<ApproveProcess> one = approveProcessService.list(new LambdaQueryWrapper<ApproveProcess>()
                         .like(ApproveProcess::getApproveReason, shippingInfo.getShippingNo()));
-                if(one != null){
+                if (one != null) {
                     List<Long> list = one.stream().map(ApproveProcess::getId).toList();
                     approveProcessService.delByIds(list);
                 }
@@ -120,7 +120,7 @@
 
     @Override
     public List<SalesLedgerProductDto> getReturnManagementDtoById(Long shippingId) {
-        return shippingInfoMapper.getReturnManagementDtoById(shippingId );
+        return shippingInfoMapper.getReturnManagementDtoById(shippingId);
 
     }
 
@@ -131,9 +131,14 @@
 
     @Override
     public boolean add(ShippingInfoDto req) {
-        this.save( req);
+        this.save(req);
         req.getBatchNoDetailList().forEach(item -> item.setShippingInfoId(req.getId()));
         shippingProductDetailMapper.insert(req.getBatchNoDetailList());
+        for (ShippingProductDetail shippingProductDetail : req.getBatchNoDetailList()) {
+            stockUtils.substractStock(shippingProductDetail.getProductModelId(), shippingProductDetail.getQuantity(), StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), req.getId(), shippingProductDetail.getBatchNo());
+        }
+        // 淇濆瓨鏂囦欢
+        fileUtil.saveStorageAttachment(ApplicationTypeEnum.IMAGE, RecordTypeEnum.SHIPPING_INFO, req.getId(), req.getStorageBlobDTOs());
         return true;
     }
 
@@ -147,7 +152,7 @@
         ShippingApproveDto shippingApproveDto = new ShippingApproveDto();
         ShippingInfo shippingInfo = new ShippingInfo();
         shippingInfo.setShippingNo(shippingNo);
-        shippingApproveDto.setShippingInfo(shippingInfoMapper.listPage(new Page(1, -1),shippingInfo).getRecords().get(0));
+        shippingApproveDto.setShippingInfo(shippingInfoMapper.listPage(new Page(1, -1), shippingInfo).getRecords().get(0));
         List<ShippingProductDetailDto> dateilByShippingNo = shippingProductDetailMapper.getDateilByShippingNo(shippingNo);
         shippingApproveDto.setShippingProductDetailDtoList(dateilByShippingNo);
         return shippingApproveDto;
diff --git a/src/main/java/com/ruoyi/stock/controller/StockUninventoryController.java b/src/main/java/com/ruoyi/stock/controller/StockUninventoryController.java
index 477a68d..3a002e0 100644
--- a/src/main/java/com/ruoyi/stock/controller/StockUninventoryController.java
+++ b/src/main/java/com/ruoyi/stock/controller/StockUninventoryController.java
@@ -2,8 +2,8 @@
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum;
-import com.ruoyi.common.enums.StockOutUnQualifiedRecordTypeEnum;
+import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
+import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
 import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.stock.dto.StockInventoryDto;
 import com.ruoyi.stock.dto.StockUninventoryDto;
@@ -37,7 +37,7 @@
     @PostMapping("/addstockUninventory")
     @Operation(summary = "鏂板搴撳瓨")
     public R addstockUninventory(@RequestBody StockUninventoryDto stockUninventoryDto) {
-        stockUninventoryDto.setRecordType(String.valueOf(StockInUnQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_IN.getCode()));
+        stockUninventoryDto.setRecordType(String.valueOf(StockInQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_IN.getCode()));
         stockUninventoryDto.setRecordId(0L);
         return R.ok(stockUninventoryService.addStockUninventory(stockUninventoryDto));
     }
@@ -46,7 +46,7 @@
     @PostMapping("/subtractstockUninventory")
     @Operation(summary = "鎵e噺搴撳瓨")
     public R subtractstockUninventory(@RequestBody StockUninventoryDto stockUninventoryDto) {
-        stockUninventoryDto.setRecordType(String.valueOf(StockOutUnQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_OUT.getCode()));
+        stockUninventoryDto.setRecordType(String.valueOf(StockOutQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_OUT.getCode()));
         stockUninventoryDto.setRecordId(0L);
         return R.ok(stockUninventoryService.subtractStockUninventory(stockUninventoryDto));
     }
@@ -54,7 +54,7 @@
     @PostMapping("/addStockInRecordOnly")
     @Operation(summary = "鏂板鍏ュ簱璁板綍锛堜粎鍒涘缓璁板綍锛屼笉璋冩暣搴撳瓨锛�")
     public R addStockInRecordOnly(@RequestBody StockUninventoryDto stockUninventoryDto) {
-        stockUninventoryDto.setRecordType(String.valueOf(StockInUnQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_IN.getCode()));
+        stockUninventoryDto.setRecordType(String.valueOf(StockInQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_IN.getCode()));
         stockUninventoryDto.setRecordId(0L);
         return R.ok(stockUninventoryService.addStockInRecordOnly(stockUninventoryDto));
     }
@@ -62,7 +62,7 @@
     @PostMapping("/addStockOutRecordOnly")
     @Operation(summary = "鏂板鍑哄簱璁板綍锛堜粎鍒涘缓璁板綍锛屼笉璋冩暣搴撳瓨锛�")
     public R addStockOutRecordOnly(@RequestBody StockUninventoryDto stockUninventoryDto) {
-        stockUninventoryDto.setRecordType(String.valueOf(StockOutUnQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_OUT.getCode()));
+        stockUninventoryDto.setRecordType(String.valueOf(StockOutQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_OUT.getCode()));
         stockUninventoryDto.setRecordId(0L);
         return R.ok(stockUninventoryService.addStockOutRecordOnly(stockUninventoryDto));
     }
diff --git a/src/main/java/com/ruoyi/stock/mapper/StockInRecordMapper.java b/src/main/java/com/ruoyi/stock/mapper/StockInRecordMapper.java
index afc30ae..4dd64c7 100644
--- a/src/main/java/com/ruoyi/stock/mapper/StockInRecordMapper.java
+++ b/src/main/java/com/ruoyi/stock/mapper/StockInRecordMapper.java
@@ -3,6 +3,8 @@
 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.account.bean.dto.PurchaseInboundDto;
+import com.ruoyi.account.bean.vo.PurchaseInboundVo;
 import com.ruoyi.stock.dto.StockInRecordDto;
 import com.ruoyi.stock.execl.StockInRecordExportData;
 import com.ruoyi.stock.pojo.StockInRecord;
@@ -14,4 +16,6 @@
     IPage<StockInRecordDto> listPage(Page page, @Param("params") StockInRecordDto stockInRecordDto);
 
     List<StockInRecordExportData> listStockInRecordExportData(@Param("params") StockInRecordDto stockInRecordDto);
+
+    IPage<PurchaseInboundVo> listPageAccountPurchase(Page page, @Param("req") PurchaseInboundDto purchaseInboundDto);
 }
diff --git a/src/main/java/com/ruoyi/stock/mapper/StockOutRecordMapper.java b/src/main/java/com/ruoyi/stock/mapper/StockOutRecordMapper.java
index d180ef9..eb05e8c 100644
--- a/src/main/java/com/ruoyi/stock/mapper/StockOutRecordMapper.java
+++ b/src/main/java/com/ruoyi/stock/mapper/StockOutRecordMapper.java
@@ -3,6 +3,8 @@
 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.account.bean.dto.SalesOutboundDto;
+import com.ruoyi.account.bean.vo.SalesOutboundVo;
 import com.ruoyi.stock.dto.StockOutRecordDto;
 import com.ruoyi.stock.execl.StockOutRecordExportData;
 import com.ruoyi.stock.pojo.StockOutRecord;
@@ -25,4 +27,5 @@
 
     List<StockOutRecordExportData> listStockOutRecordExportData(@Param("params") StockOutRecordDto stockOutRecordDto);
 
+    IPage<SalesOutboundVo> listPageAccountSales(Page page, @Param("req") SalesOutboundDto salesOutboundDto);
 }
diff --git a/src/main/java/com/ruoyi/stock/pojo/StockOutRecord.java b/src/main/java/com/ruoyi/stock/pojo/StockOutRecord.java
index 20ea4a2..1fd2893 100644
--- a/src/main/java/com/ruoyi/stock/pojo/StockOutRecord.java
+++ b/src/main/java/com/ruoyi/stock/pojo/StockOutRecord.java
@@ -75,7 +75,7 @@
     @Schema(description = "绫诲瀷  0鍚堟牸鍏ュ簱 1涓嶅悎鏍煎叆搴�")
     private String type;
 
-    @Schema(description = "瀹℃壒鐘舵��  0-寰呭鎵� 1-閫氳繃 2-椹冲洖", implementation = ReviewStatusEnum.class)
+    @Schema(description = "瀹℃壒鐘舵��  0-寰呭鎵� 1-閫氳繃 2-椹冲洖 3-閿�鍞嚭搴撳緟纭", implementation = ReviewStatusEnum.class)
     private Integer approvalStatus;
 
     @TableField(fill = FieldFill.INSERT)
diff --git a/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java b/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
index f84a9d8..ab34aa8 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
@@ -5,8 +5,8 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.enums.ReviewStatusEnum;
+import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
 import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
-import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum;
 import com.ruoyi.common.exception.base.BaseException;
 import com.ruoyi.common.utils.EnumUtil;
 import com.ruoyi.common.utils.OrderUtils;
@@ -24,12 +24,12 @@
 import com.ruoyi.stock.pojo.StockInventory;
 import com.ruoyi.stock.pojo.StockUninventory;
 import com.ruoyi.stock.service.StockInRecordService;
+import jakarta.servlet.http.HttpServletResponse;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
-import jakarta.servlet.http.HttpServletResponse;
 import java.util.List;
 
 @Service
@@ -123,7 +123,7 @@
             if (stockInRecordExportData.getType().equals("0")) {
                 stockInRecordExportData.setRecordType(EnumUtil.fromCode(StockOutQualifiedRecordTypeEnum.class, Integer.parseInt(stockInRecordExportData.getRecordType())).getValue());
             }else {
-                stockInRecordExportData.setRecordType(EnumUtil.fromCode(StockInUnQualifiedRecordTypeEnum.class, Integer.parseInt(stockInRecordExportData.getRecordType())).getValue());
+                stockInRecordExportData.setRecordType(EnumUtil.fromCode(StockInQualifiedRecordTypeEnum.class, Integer.parseInt(stockInRecordExportData.getRecordType())).getValue());
             }
         }
         ExcelUtil<StockInRecordExportData> util = new ExcelUtil<>(StockInRecordExportData.class);
diff --git a/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java b/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
index d712518..3808916 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
@@ -10,7 +10,6 @@
 import com.ruoyi.basic.mapper.ProductModelMapper;
 import com.ruoyi.basic.pojo.ProductModel;
 import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
-import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
@@ -345,7 +344,7 @@
                     if (dto.getUnQualifiedQuantity() != null && dto.getUnQualifiedQuantity().compareTo(BigDecimal.ZERO) > 0) {
                         StockUninventoryDto stockUninventoryDto = new StockUninventoryDto();
                         stockUninventoryDto.setRecordId(0L);
-                        stockUninventoryDto.setRecordType(StockInUnQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_IN.getCode());
+                        stockUninventoryDto.setRecordType(StockInQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_IN.getCode());
                         stockUninventoryDto.setQualitity(dto.getUnQualifiedQuantity());
                         stockUninventoryDto.setRemark(dto.getRemark());
 
diff --git a/src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java b/src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java
index cead7fc..9a6bd9b 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java
@@ -5,8 +5,8 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.enums.ReviewStatusEnum;
+import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
 import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
-import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum;
 import com.ruoyi.common.exception.base.BaseException;
 import com.ruoyi.common.utils.EnumUtil;
 import com.ruoyi.common.utils.OrderUtils;
@@ -20,19 +20,16 @@
 import com.ruoyi.stock.mapper.StockInventoryMapper;
 import com.ruoyi.stock.mapper.StockOutRecordMapper;
 import com.ruoyi.stock.mapper.StockUninventoryMapper;
-import com.ruoyi.stock.pojo.StockInRecord;
 import com.ruoyi.stock.pojo.StockInventory;
 import com.ruoyi.stock.pojo.StockOutRecord;
 import com.ruoyi.stock.pojo.StockUninventory;
 import com.ruoyi.stock.service.StockOutRecordService;
-import lombok.AllArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
 import lombok.RequiredArgsConstructor;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
-import jakarta.servlet.http.HttpServletResponse;
 import java.util.List;
 
 /**
@@ -59,8 +56,9 @@
     public int add(StockOutRecordDto stockOutRecordDto) {
         String no = OrderUtils.countTodayByCreateTime(stockOutRecordMapper, "CK","outbound_batches");
         stockOutRecordDto.setOutboundBatches(no);
-        StockInRecord stockInRecord = new StockInRecord();
-        BeanUtils.copyProperties(stockOutRecordDto, stockInRecord);
+        if (StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode().equals(stockOutRecordDto.getRecordType())){
+            stockOutRecordDto.setApprovalStatus(3);
+        }
         return stockOutRecordMapper.insert(stockOutRecordDto);
     }
 
@@ -129,7 +127,7 @@
             if (stockInRecordExportData.getType().equals("0")) {
                 stockInRecordExportData.setRecordType(EnumUtil.fromCode(StockOutQualifiedRecordTypeEnum.class, Integer.parseInt(stockInRecordExportData.getRecordType())).getValue());
             }else {
-                stockInRecordExportData.setRecordType(EnumUtil.fromCode(StockInUnQualifiedRecordTypeEnum.class, Integer.parseInt(stockInRecordExportData.getRecordType())).getValue());
+                stockInRecordExportData.setRecordType(EnumUtil.fromCode(StockInQualifiedRecordTypeEnum.class, Integer.parseInt(stockInRecordExportData.getRecordType())).getValue());
             }
         }
         ExcelUtil<StockOutRecordExportData> util = new ExcelUtil<>(StockOutRecordExportData.class);
diff --git a/src/main/resources/mapper/account/SalesRefundAmountOrderMapper.xml b/src/main/resources/mapper/account/SalesRefundAmountOrderMapper.xml
index 05617b1..a41c8c1 100644
--- a/src/main/resources/mapper/account/SalesRefundAmountOrderMapper.xml
+++ b/src/main/resources/mapper/account/SalesRefundAmountOrderMapper.xml
@@ -18,9 +18,9 @@
     <select id="pageSalesRefundAmountOrderDto" resultType="com.ruoyi.account.bean.dto.SalesRefundAmountOrderDto">
         select sl.sales_contract_no,
         sl.customer_contract_no,
-        slp.specification_model,
-        slp.product_category as product_name,
-        slp.unit,
+        pm.model as specification_model,
+        p.product_name ,
+        pm.unit,
         sl.customer_name,
         rm.return_no as return_management_no,
         srao.*
@@ -28,6 +28,8 @@
         left join return_management rm on srao.return_management_id = rm.id
         left join return_sale_product rs on rm.id = rs.return_management_id
         left join sales_ledger_product slp on rs.return_sales_ledger_product_id = slp.id
+        left join product_model pm on slp.product_model_id = pm.id
+            left join product p on pm.product_id = p.id
         left join sales_ledger sl on slp.sales_ledger_id = sl.id
         <where>
             <if test="ew.salesContractNo != null and ew.salesContractNo !=''">
diff --git a/src/main/resources/mapper/oA/OaProjectMapper.xml b/src/main/resources/mapper/oA/OaProjectMapper.xml
deleted file mode 100644
index c245a39..0000000
--- a/src/main/resources/mapper/oA/OaProjectMapper.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?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.oA.mapper.OaProjectMapper">
-
-
-    <select id="listPage" resultType="com.ruoyi.oA.dto.OaProjectDto">
-        select op.*,su.nick_name as managerName from oa_project op
-        LEFT JOIN sys_user su ON op.manager_id=su.user_id
-        <where>
-        1=1
-            <if test="req.projectName != null and req.projectName != ''">
-                and op.project_name like concat('%',#{req.projectName},'%')
-            </if>
-            <if test="req.managerName != null and req.managerName != ''">
-                and su.nick_name like concat('%',#{req.managerName},'%')
-            </if>
-            <if test="req.status != null and req.status != ''">
-                and op.status = #{req.status}
-            </if>
-        </where>
-    </select>
-    <select id="selectByIds" resultType="com.ruoyi.oA.dto.OaProjectDto">
-        select op.*,su.nick_name as managerName from oa_project op
-        LEFT JOIN sys_user su ON op.manager_id=su.user_id
-        where op.project_id in
-        <foreach collection="ids" item="id" open="(" close=")" separator=",">
-            #{id}
-        </foreach>
-    </select>
-</mapper>
diff --git a/src/main/resources/mapper/oA/OaProjectPhaseMapper.xml b/src/main/resources/mapper/oA/OaProjectPhaseMapper.xml
deleted file mode 100644
index 2f52fe9..0000000
--- a/src/main/resources/mapper/oA/OaProjectPhaseMapper.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?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.oA.mapper.OaProjectPhaseMapper">
-
-    <resultMap id="BaseResultMap" type="com.ruoyi.oA.pojo.OaProjectPhase">
-            <id property="phaseId" column="phase_id" jdbcType="INTEGER"/>
-            <result property="phaseName" column="phase_name" jdbcType="VARCHAR"/>
-            <result property="oaProjectId" column="oa_project_id" jdbcType="INTEGER"/>
-            <result property="startDate" column="start_date" jdbcType="TIMESTAMP"/>
-            <result property="endDate" column="end_date" jdbcType="TIMESTAMP"/>
-            <result property="status" column="status" jdbcType="VARCHAR"/>
-            <result property="createUser" column="create_user" jdbcType="BIGINT"/>
-            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
-            <result property="updateUser" column="update_user" jdbcType="BIGINT"/>
-            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
-            <result property="tenantId" column="tenant_id" jdbcType="BIGINT"/>
-    </resultMap>
-
-    <sql id="Base_Column_List">
-        phase_id,phase_name,oa_project_id,
-        start_date,end_date,status,
-        create_user,create_time,update_user,
-        update_time,tenant_id
-    </sql>
-</mapper>
diff --git a/src/main/resources/mapper/oA/OaProjectPhaseTaskMapper.xml b/src/main/resources/mapper/oA/OaProjectPhaseTaskMapper.xml
deleted file mode 100644
index cc029d9..0000000
--- a/src/main/resources/mapper/oA/OaProjectPhaseTaskMapper.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?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.oA.mapper.OaProjectPhaseTaskMapper">
-
-    <resultMap id="BaseResultMap" type="com.ruoyi.oA.pojo.OaProjectPhaseTask">
-            <id property="taskId" column="task_id" jdbcType="INTEGER"/>
-            <result property="taskName" column="task_name" jdbcType="VARCHAR"/>
-            <result property="phaseId" column="phase_id" jdbcType="INTEGER"/>
-            <result property="startDate" column="start_date" jdbcType="TIMESTAMP"/>
-            <result property="endDate" column="end_date" jdbcType="TIMESTAMP"/>
-            <result property="targetDate" column="target_date" jdbcType="TIMESTAMP"/>
-            <result property="targetValue" column="target_value" jdbcType="INTEGER"/>
-            <result property="currentValue" column="current_value" jdbcType="INTEGER"/>
-            <result property="unit" column="unit" jdbcType="VARCHAR"/>
-            <result property="status" column="status" jdbcType="VARCHAR"/>
-            <result property="completionRate" column="completion_rate" jdbcType="INTEGER"/>
-            <result property="createUser" column="create_user" jdbcType="BIGINT"/>
-            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
-            <result property="updateUser" column="update_user" jdbcType="BIGINT"/>
-            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
-            <result property="tenantId" column="tenant_id" jdbcType="BIGINT"/>
-    </resultMap>
-
-    <sql id="Base_Column_List">
-        task_id,task_name,phase_id,
-        start_date,end_date,target_date,
-        target_value,current_value,unit,
-        status,completion_rate,create_user,
-        create_time,update_user,update_time,
-        tenant_id
-    </sql>
-</mapper>
diff --git a/src/main/resources/mapper/procurementrecord/ReturnManagementMapper.xml b/src/main/resources/mapper/procurementrecord/ReturnManagementMapper.xml
index 1b84282..a06b4f0 100644
--- a/src/main/resources/mapper/procurementrecord/ReturnManagementMapper.xml
+++ b/src/main/resources/mapper/procurementrecord/ReturnManagementMapper.xml
@@ -53,4 +53,30 @@
                  left join sales_ledger sl on si.sales_ledger_id = sl.id
         where rm.id = #{id}
     </select>
-</mapper>
\ No newline at end of file
+    <select id="listPageBySalesReturn" resultType="com.ruoyi.account.bean.vo.SalesReturnVo">
+         select rm.id,
+                rm.return_no,
+                c.customer_name,
+                si.shipping_no,
+                rm.make_time,
+                rm.refund_amount,
+                rm.return_reason,
+                rm.make_time,
+                sl.sales_contract_no
+        from return_management rm
+                 left join shipping_info si on rm.shipping_id = si.id
+                 left join customer c on rm.customer_id = c.id
+                 left join sales_ledger sl on si.sales_ledger_id = sl.id
+        where rm.status=1
+            <if test="req.returnNo != null and req.returnNo != ''">
+                and rm.return_no like concat('%',#{req.returnNo},'%')
+            </if>
+            <if test="req.customerName != null and req.customerName != ''">
+                and c.customer_name like concat('%',#{req.customerName},'%')
+            </if>
+            <if test="req.startDate != null and req.endDate != null">
+                AND DATE_FORMAT(rm.make_time, '%Y-%m-%d') BETWEEN #{startDate} AND #{endDate}
+            </if>
+         order by rm.id DESC
+    </select>
+</mapper>
diff --git a/src/main/resources/mapper/procurementrecord/ReturnSaleProductMapper.xml b/src/main/resources/mapper/procurementrecord/ReturnSaleProductMapper.xml
index 55cba43..52345e3 100644
--- a/src/main/resources/mapper/procurementrecord/ReturnSaleProductMapper.xml
+++ b/src/main/resources/mapper/procurementrecord/ReturnSaleProductMapper.xml
@@ -11,9 +11,9 @@
         <result column="status" property="status" />
     </resultMap>
     <select id="listReturnSaleProductDto" resultType="com.ruoyi.procurementrecord.dto.ReturnSaleProductDto">
-        SELECT slp.product_category                                         as product_name,
-               slp.specification_model                                      as model,
-               slp.unit                                      as unit,
+        SELECT p.product_name                                         as product_name,
+               pm.model                                     as model,
+               pm.unit                                      as unit,
                rsp.*,
                GREATEST(slp.quantity - COALESCE(rs.total_return_num, 0), 0) AS un_quantity,
                COALESCE(rs.total_return_num, 0)                             AS total_return_num
@@ -21,6 +21,8 @@
                  LEFT JOIN return_management rm ON rm.id = rsp.return_management_id
                  LEFT JOIN shipping_info si ON si.id = rm.shipping_id
                  LEFT JOIN sales_ledger_product slp ON si.sales_ledger_product_id = slp.id and slp.type = 1
+                left join product_model pm on slp.product_model_id = pm.id
+                  LEFT JOIN product p on pm.product_id = p.id
                  LEFT JOIN (SELECT return_sales_ledger_product_id,
 
                                    SUM(num) AS total_return_num
diff --git a/src/main/resources/mapper/purchase/PurchaseReturnOrdersMapper.xml b/src/main/resources/mapper/purchase/PurchaseReturnOrdersMapper.xml
index 77435ad..dca2c47 100644
--- a/src/main/resources/mapper/purchase/PurchaseReturnOrdersMapper.xml
+++ b/src/main/resources/mapper/purchase/PurchaseReturnOrdersMapper.xml
@@ -53,4 +53,29 @@
         <include refid="getPurchaseReturnOrderHasAllInfoFormAndColumn"/>
         where pro.id = #{id}
     </select>
+    <select id="listPageAccountPurchaseReturn"
+            resultType="com.ruoyi.account.bean.vo.PurchaseReturnVo">
+         select pro.id,
+                pro.no returnNo,
+                sm.supplier_name,
+
+                pro.prepared_at,
+                pro.total_amount,
+                CASE pro.return_type WHEN 0 THEN '閫�璐ч��娆�' WHEN 1 THEN '鎷掓敹' END AS returnType,
+                pl.purchase_contract_number
+        from purchase_return_orders pro
+                 left join supplier_manage sm on pro.supplier_id = sm.id
+                 left join purchase_ledger pl on pro.purchase_ledger_id = pl.id
+        where rm.status=1
+            <if test="req.returnNo != null and req.returnNo != ''">
+                and pro.no like concat('%',#{req.returnNo},'%')
+            </if>
+            <if test="req.supplierName != null and req.supplierName != ''">
+                and sm.supplier_name like concat('%',#{req.supplierName},'%')
+            </if>
+            <if test="req.startDate != null and req.endDate != null">
+                AND DATE_FORMAT(pro.prepared_at, '%Y-%m-%d') BETWEEN #{startDate} AND #{endDate}
+            </if>
+         order by pro.id DESC
+    </select>
 </mapper>
diff --git a/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml b/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
index 49689a1..f3fa32d 100644
--- a/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
+++ b/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
@@ -6,7 +6,42 @@
 
     <select id="selectSalesLedgerProductList" resultType="com.ruoyi.sales.pojo.SalesLedgerProduct">
         SELECT
-        T1.*,
+        T1.id,
+        T1.sales_ledger_id,
+        T1.warn_num,
+        T1.speculative_trading_name,
+        T1.quantity,
+        T1.min_stock,
+        T1.tax_rate,
+        T1.tax_inclusive_unit_price,
+        T1.tax_inclusive_total_price,
+        T1.tax_exclusive_total_price,
+        T1.invoice_type,
+        T1.type,
+        T1.tickets_num,
+        T1.tickets_amount,
+        T1.future_tickets,
+        T1.future_tickets_amount,
+        T1.invoice_num,
+        T1.no_invoice_num,
+        T1.invoice_amount,
+        T1.no_invoice_amount,
+        T1.product_id,
+        T1.product_model_id,
+        T1.register,
+        T1.register_date,
+        T1.approve_status,
+        T1.pending_invoice_total,
+        T1.invoice_total,
+        T1.pending_tickets_total,
+        T1.tickets_total,
+        T1.is_checked,
+        T1.is_production,
+        T1.create_user,
+        T1.dept_id,
+        p.product_name as product_category,
+        pm.model as specification_model,
+        pm.unit as unit,
         CASE
         WHEN (IFNULL(t2.qualitity, 0) - IFNULL(t2.locked_quantity, 0)) >0 THEN 1
         ELSE 0
@@ -29,6 +64,8 @@
         LEFT JOIN shipping_product_detail spd ON si.id = spd.shipping_info_id
         GROUP BY sales_ledger_product_id
         ) t3 ON t3.sales_ledger_product_id = T1.id
+        left join product_model pm ON T1.product_model_id = pm.id
+        left join product p ON pm.product_id = p.id
         <where>
             <if test="salesLedgerProduct.salesLedgerId != null">
                 AND T1.sales_ledger_id = #{salesLedgerProduct.salesLedgerId}
diff --git a/src/main/resources/mapper/sales/ShippingInfoMapper.xml b/src/main/resources/mapper/sales/ShippingInfoMapper.xml
index 048bb23..ee384ed 100644
--- a/src/main/resources/mapper/sales/ShippingInfoMapper.xml
+++ b/src/main/resources/mapper/sales/ShippingInfoMapper.xml
@@ -19,7 +19,8 @@
         s.update_user,
         s.tenant_id,
         sl.sales_contract_no,
-        slp.specification_model,
+        pm.model as specification_model,
+        pm.unit,
         p.product_name,
         sl.customer_name
         FROM shipping_info s
diff --git a/src/main/resources/mapper/stock/StockInRecordMapper.xml b/src/main/resources/mapper/stock/StockInRecordMapper.xml
index 62f1d19..05f8c89 100644
--- a/src/main/resources/mapper/stock/StockInRecordMapper.xml
+++ b/src/main/resources/mapper/stock/StockInRecordMapper.xml
@@ -70,4 +70,38 @@
         </where>
         order by sir.id desc
     </select>
+    <select id="listPageAccountPurchase" resultType="com.ruoyi.account.bean.vo.PurchaseInboundVo">
+        SELECT
+            sir.id,
+            sir.inbound_batches,
+            pl.supplier_name,
+            DATE(sir.create_time) AS inboundDate,
+            p.product_name,
+            pm.model as specification_model,
+            sor.stock_in_num * slp.tax_inclusive_unit_price AS InboundAmount,
+            pl.purchase_contract_number
+            FROM stock_in_record sir
+            -- 10 绫诲瀷鎵嶅叧鑱旇川妫�琛�
+            LEFT JOIN quality_inspect qi ON sir.record_type = 10 AND sir.record_id = qi.id
+            -- 鍔ㄦ�佸叧鑱旈噰璐紙鑷姩閫傞厤 7 鍜� 10锛�
+            LEFT JOIN purchase_ledger pl
+            ON pl.id = IF(sir.record_type = 7, sir.record_id, qi.purchase_ledger_id)
+            -- 浜у搧鍏宠仈涓嶅姩
+            LEFT JOIN sales_ledger_product slp ON slp.type = 2 AND pl.id = slp.product_id
+            LEFT JOIN product_model pm ON slp.product_model_id = pm.id
+            LEFT JOIN product p ON pm.product_id = p.id
+            -- 鏉′欢
+        WHERE sir.approval_status = 1
+        AND sir.record_type IN ('7','10')
+        <if test="req.inboundBatches != null and req.inboundBatches != ''">
+            AND sir.inbound_batches LIKE CONCAT('%',#{req.inboundBatches},'%')
+        </if>
+        <if test="req.supplierName != null and req.supplierName != ''">
+            AND pl.supplier_name LIKE CONCAT('%',#{req.supplierName},'%')
+        </if>
+        <if test="req.startDate != null and req.endDate != null">
+            AND DATE(sir.create_time) BETWEEN #{startDate} AND #{endDate}
+        </if>
+        order by sir.id DESC
+    </select>
 </mapper>
diff --git a/src/main/resources/mapper/stock/StockInventoryMapper.xml b/src/main/resources/mapper/stock/StockInventoryMapper.xml
index 60fc90e..9612933 100644
--- a/src/main/resources/mapper/stock/StockInventoryMapper.xml
+++ b/src/main/resources/mapper/stock/StockInventoryMapper.xml
@@ -436,7 +436,7 @@
         WHERE sor.product_model_id = #{productModelId}
           AND (sor.batch_no = #{batchNo} OR (#{batchNo} IS NULL AND sor.batch_no IS NULL))
           AND sor.type = #{type}
-          AND sor.approval_status = 0
+          AND sor.approval_status IN (0, 3)
     </select>
 
     <select id="listSelectableBatchNoByProductModelIds" resultType="com.ruoyi.stock.pojo.StockInventory">
@@ -453,12 +453,24 @@
         order by si.product_model_id, si.batch_no
     </select>
     <select id="getByModelId" resultType="com.ruoyi.stock.pojo.StockInventory">
-        select spd.id, spd.batch_no, spd.locked_quantity, (spd.qualitity - IFNULL(sd.qualitity, 0)) as qualitity
-        from stock_inventory spd
-                 left join (select stock_inventory_id, sum(quantity) as qualitity
-                            from shipping_product_detail
-                            group by stock_inventory_id) as sd on sd.stock_inventory_id = spd.id
-        where product_model_id = #{productModelId}
+        select si.id, si.batch_no, si.locked_quantity, (si.qualitity - IFNULL(sd.qualitity, 0)) as qualitity
+        from stock_inventory si
+                 left join (
+                    select spd.stock_inventory_id, sum(spd.quantity) as qualitity
+                    from shipping_product_detail spd
+                    where exists (
+                        select 1
+                        from stock_out_record sor
+                        where sor.record_id = spd.shipping_info_id
+                          and sor.record_type = '13'
+                          and sor.type = '0'
+                          and sor.approval_status in (0, 3)
+                          and sor.product_model_id = spd.product_model_id
+                          and (sor.batch_no = spd.batch_no or (sor.batch_no is null and spd.batch_no is null))
+                    )
+                    group by spd.stock_inventory_id
+                 ) as sd on sd.stock_inventory_id = si.id
+        where si.product_model_id = #{productModelId}
     </select>
 
 </mapper>
diff --git a/src/main/resources/mapper/stock/StockOutRecordMapper.xml b/src/main/resources/mapper/stock/StockOutRecordMapper.xml
index 8615294..9e32e21 100644
--- a/src/main/resources/mapper/stock/StockOutRecordMapper.xml
+++ b/src/main/resources/mapper/stock/StockOutRecordMapper.xml
@@ -86,4 +86,33 @@
         order by sor.id desc
     </select>
 
+    <select id="listPageAccountSales" resultType="com.ruoyi.account.bean.vo.SalesOutboundVo">
+    SELECT
+        sor.id,
+        sor.outbound_batches,
+        sl.customer_name,
+        s.shipping_date,
+        p.product_name,
+        pm.model as specification_model,
+        sor.stock_out_num * slp.tax_inclusive_unit_price as outboundAmount,
+        s.shipping_no,
+        sl.sales_contract_no
+        FROM stock_out_record sor
+        left join shipping_info s on sor.record_id = s.id
+        LEFT JOIN sales_ledger sl ON s.sales_ledger_id = sl.id
+        LEFT JOIN sales_ledger_product slp ON s.sales_ledger_product_id = slp.id and slp.type = 1
+        left join product_model pm on slp.product_model_id = pm.id
+        left join product p on pm.product_id = p.id
+        WHERE s.status='宸插彂璐�' and sor.record_type='13'
+        <if test="req.outboundBatches != null and req.outboundBatches != ''">
+            AND sor.outbound_batches LIKE CONCAT('%',#{req.outboundBatches},'%')
+        </if>
+        <if test="req.customerName != null and req.customerName != ''">
+            AND sl.customer_name LIKE CONCAT('%',#{req.customerName},'%')
+        </if>
+        <if test="req.startDate != null and req.endDate != null">
+            AND s.shipping_date BETWEEN #{startDate} AND #{endDate}
+        </if>
+        order by sor.id DESC
+    </select>
 </mapper>

--
Gitblit v1.9.3