From d1fac30e634e33edd29e3440de1f91da84c150c1 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期五, 05 六月 2026 15:38:39 +0800
Subject: [PATCH] feat(account): 新增付款状态管理功能并优化生产任务查询

---
 src/main/java/com/ruoyi/account/pojo/purchase/AccountPaymentApplication.java                 |   18 
 src/main/java/com/ruoyi/account/bean/dto/purchase/AccountPaymentApplicationDto.java          |    5 
 src/main/java/com/ruoyi/account/service/impl/purchase/AccountPurchasePaymentServiceImpl.java |   72 +++
 src/main/java/com/ruoyi/production/controller/ProductionOperationTaskController.java         |    8 
 docs/付款申请已付款状态功能文档.md                                                                        |  227 ++++++++++
 docs/销售台账现在生产字段同步文档.md                                                                       |  263 ++++++++++++
 docs/付款申请付款状态功能文档.md                                                                         |  327 +++++++++++++++
 docs/ProductionOperationTask前端联调文档.md                                                        |  200 +++++++++
 src/main/java/com/ruoyi/production/service/impl/ProductionOperationTaskServiceImpl.java      |    4 
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java                |   22 +
 src/main/resources/mapper/production/ProductionOperationTaskMapper.xml                       |   73 +-
 src/main/resources/mapper/account/purchase/AccountPaymentApplicationMapper.xml               |    7 
 src/main/java/com/ruoyi/production/pojo/ProductionPlan.java                                  |   12 
 src/main/java/com/ruoyi/account/bean/vo/purchase/AccountPaymentApplicationVo.java            |    5 
 src/main/java/com/ruoyi/production/mapper/ProductionOperationTaskMapper.java                 |    2 
 15 files changed, 1,200 insertions(+), 45 deletions(-)

diff --git "a/docs/ProductionOperationTask\345\211\215\347\253\257\350\201\224\350\260\203\346\226\207\346\241\243.md" "b/docs/ProductionOperationTask\345\211\215\347\253\257\350\201\224\350\260\203\346\226\207\346\241\243.md"
new file mode 100644
index 0000000..c820495
--- /dev/null
+++ "b/docs/ProductionOperationTask\345\211\215\347\253\257\350\201\224\350\260\203\346\226\207\346\241\243.md"
@@ -0,0 +1,200 @@
+# ProductionOperationTask 鍓嶇鑱旇皟鏂囨。
+
+## 涓�銆佸彉鏇存杩�
+
+`ProductionOperationTaskController` 妯″潡鍋氫簡浠ヤ笅璋冩暣锛�
+
+1. `/page` 鍒嗛〉鎺ュ彛鏀逛负**鎸夌敓浜ц鍗曞彿鍒嗙粍**锛屽伐搴忚仛鍚堣繑鍥�
+2. 鏌ヨ鏉′欢绠�鍖栦负浠呮敮鎸� `npsNo`锛堣鍗曞彿妯$硦鎼滅储锛�
+3. 鏂板 `/byOrder/{orderId}` 鎺ュ彛锛屾牴鎹敓浜ц鍗� ID 鏌ヨ锛�**鐩存帴澶嶇敤浜� `list` 鏂规硶**
+
+## 浜屻�乴ist 澶嶇敤璇存槑
+
+**涓嶈兘鐩存帴澶嶇敤鍘熸潵鐨� `list`**銆傚師鏉ョ殑 `list` 鍙煡 `production_operation_task` 鍗曡〃锛屾病鏈� JOIN 鍏宠仈琛紝缂哄皯 `productName`銆乣model`銆乣unit`銆乣operationName` 绛夊瓧娈点�傚凡灏� `list` 鏀逛负璋冪敤涓� `page` 鐩稿悓鐨勫垎缁勬煡璇� SQL锛堜粎鍘绘帀浜嗗垎椤靛寘瑁癸級锛岀幇鍦� `/list` 鍜� `/byOrder/{orderId}` 鍏辩敤鍚屼竴濂楁煡璇㈤�昏緫銆�
+
+---
+
+## 涓夈�佹帴鍙h鎯�
+
+### 1. 鍒嗛〉鏌ヨ锛堝凡鏀归�狅級
+
+```
+GET /productionOperationTask/page
+```
+
+**璇锋眰鍙傛暟锛�**
+
+| 鍙傛暟 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|------|------|------|------|
+| current | int | 鍚� | 褰撳墠椤碉紝榛樿 1 |
+| size | int | 鍚� | 姣忛〉鏉℃暟锛岄粯璁� 10 |
+| npsNo | string | 鍚� | 璁㈠崟鍙凤紝妯$硦鎼滅储 |
+
+> 娉ㄦ剰锛氬師鏈夌殑 `id`銆乣productionOrderId`銆乣productionOrderRoutingOperationId`銆乣status`銆乣isProduction`銆乣workOrderNo` 鏌ヨ鏉′欢宸茬Щ闄わ紝涓嶅啀鐢熸晥銆�
+
+**璇锋眰绀轰緥锛�**
+```
+GET /productionOperationTask/page?current=1&size=10&npsNo=NPS2026
+```
+
+**鍝嶅簲缁撴瀯锛�**
+```json
+{
+  "code": 200,
+  "data": {
+    "records": [
+      {
+        "productionOrderId": 1001,
+        "npsNo": "NPS202606001",
+        "endOrder": false,
+        "productName": "鏌愭煇浜у搧",
+        "model": "XL-2026",
+        "unit": "涓�",
+        "operationName": "鍒囧壊,鐒婃帴,鎵撶(",
+        "productionTaskCount": 3,
+        "planQuantity": 100,
+        "completeQuantity": 80,
+        "goodQuantity": 80,
+        "scrapQty": 5,
+        "completionStatus": 80.00,
+        "type": 1,
+        "workOrderType": "姝e父",
+        "workOrderNo": "WO202606001,WO202606002,WO202606003",
+        "planStartTime": "2026-06-01",
+        "planEndTime": "2026-06-15",
+        "actualStartTime": "2026-06-02",
+        "actualEndTime": "2026-06-14",
+        "status": 4,
+        "userNames": "寮犱笁,鏉庡洓"
+      }
+    ],
+    "total": 50,
+    "current": 1,
+    "size": 10
+  }
+}
+```
+
+---
+
+### 2. 鏍规嵁鐢熶骇璁㈠崟ID鏌ヨ锛堟柊澧烇級
+
+```
+GET /productionOperationTask/byOrder/{orderId}
+```
+
+**璺緞鍙傛暟锛�**
+
+| 鍙傛暟 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|------|------|------|------|
+| orderId | Long | 鏄� | 鐢熶骇璁㈠崟 ID锛坧roduction_order 琛ㄤ富閿級 |
+
+**璇锋眰绀轰緥锛�**
+```
+GET /productionOperationTask/byOrder/1001
+```
+
+**鍝嶅簲缁撴瀯锛�** 涓� `/page` 鐨� `records` 鍗曢」涓�鑷达紝澶栧眰涓烘暟缁勶紙閫氬父 0-1 鏉★級銆�
+```json
+{
+  "code": 200,
+  "data": [
+    {
+      "productionOrderId": 1001,
+      "npsNo": "NPS202606001",
+      "endOrder": false,
+      "productName": "鏌愭煇浜у搧",
+      "model": "XL-2026",
+      "unit": "涓�",
+      "operationName": "鍒囧壊,鐒婃帴,鎵撶(",
+      "productionTaskCount": 3,
+      "planQuantity": 100,
+      "completeQuantity": 80,
+      "goodQuantity": 80,
+      "scrapQty": 5,
+      "completionStatus": 80.00,
+      "type": 1,
+      "workOrderType": "姝e父",
+      "workOrderNo": "WO202606001,WO202606002,WO202606003",
+      "planStartTime": "2026-06-01",
+      "planEndTime": "2026-06-15",
+      "actualStartTime": "2026-06-02",
+      "actualEndTime": "2026-06-14",
+      "status": 4,
+      "userNames": "寮犱笁,鏉庡洓"
+    }
+  ]
+}
+```
+
+---
+
+### 3. 宸ュ崟鍒楄〃锛堝悓姝ユ敼閫狅級
+
+```
+GET /productionOperationTask/list
+```
+
+**璇锋眰鍙傛暟锛�**
+
+| 鍙傛暟 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|------|------|------|------|
+| npsNo | string | 鍚� | 璁㈠崟鍙凤紝妯$硦鎼滅储 |
+| productionOrderId | Long | 鍚� | 鐢熶骇璁㈠崟 ID锛岀簿纭尮閰� |
+
+**璇锋眰绀轰緥锛�**
+```
+GET /productionOperationTask/list?npsNo=NPS2026
+GET /productionOperationTask/list?productionOrderId=1001
+```
+
+**鍝嶅簲缁撴瀯锛�** 鍚� `/byOrder/{orderId}`锛岃繑鍥炴暟缁勩��
+
+---
+
+## 鍥涖�佸搷搴斿瓧娈佃鏄�
+
+| 瀛楁 | 绫诲瀷 | 璇存槑 |
+|------|------|------|
+| productionOrderId | Long | 鐢熶骇璁㈠崟 ID |
+| npsNo | string | 璁㈠崟鍙� |
+| endOrder | boolean | 鏄惁缁撳崟 |
+| productName | string | 浜у搧鍚嶇О |
+| model | string | 瑙勬牸鍨嬪彿 |
+| unit | string | 鍗曚綅 |
+| operationName | string | 宸ュ簭鍚嶇О锛屽涓敤閫楀彿鎷兼帴锛屾寜 drag_sort 鎺掑簭 |
+| productionTaskCount | Long | 璇ヨ鍗曚笅鐨勭敓浜т换鍔℃暟 |
+| planQuantity | BigDecimal | 璁″垝鏁伴噺锛堝悇浠诲姟姹囨�伙級 |
+| completeQuantity | BigDecimal | 瀹屾垚鏁伴噺锛堝悇浠诲姟姹囨�伙級 |
+| goodQuantity | BigDecimal | 鑹搧鏁伴噺锛堢瓑浜� completeQuantity 姹囨�伙級 |
+| scrapQty | BigDecimal | 鎶ュ簾鏁伴噺锛堝悇浠诲姟姹囨�伙級 |
+| completionStatus | BigDecimal | 瀹屾垚杩涘害鐧惧垎姣旓紝濡� 80.00 |
+| type | Integer | 宸ュ簭绫诲瀷锛�0=璁℃椂锛�1=璁′欢 |
+| workOrderType | string | 宸ュ崟绫诲瀷锛�"姝e父" / "杩斿伐杩斾慨"锛堜换涓�浠诲姟涓鸿繑宸ュ垯鏄剧ず杩斿伐杩斾慨锛� |
+| workOrderNo | string | 宸ュ崟缂栧彿锛屽涓敤閫楀彿鎷兼帴 |
+| planStartTime | LocalDate | 鏈�鏃╄鍒掑紑濮嬫椂闂� |
+| planEndTime | LocalDate | 鏈�鏅氳鍒掔粨鏉熸椂闂� |
+| actualStartTime | LocalDate | 鏈�鏃╁疄闄呭紑濮嬫椂闂� |
+| actualEndTime | LocalDate | 鏈�鏅氬疄闄呯粨鏉熸椂闂� |
+| status | Integer | 鐘舵�侊紝鍙栨渶澶у�硷細1=寰呯‘璁�, 2=寰呯敓浜�, 3=鐢熶骇涓�, 4=宸茬敓浜� |
+| userNames | string | 鎶ュ伐浜哄憳鍚嶇О锛屽涓�楀彿鍒嗛殧 |
+
+---
+
+## 浜斻�佷笌鏃ф帴鍙g殑鏍稿績宸紓
+
+| 宸紓鐐� | 鏃� page | 鏂� page |
+|--------|---------|---------|
+| 鏁版嵁缁撴瀯 | 姣忚涓�鏉′换鍔� | 姣忚涓�涓敓浜ц鍗曪紙浠诲姟鑱氬悎锛� |
+| operationName | 鍗曚釜宸ュ簭鍚� | 閫楀彿鎷兼帴鐨勫伐搴忓悕鍒楄〃 |
+| 鏌ヨ鏉′欢 | 7 涓繃婊ゅ瓧娈� | 浠� npsNo |
+| planQuantity | 鍗曚换鍔¤鍒掓暟 | 璇ヨ鍗曟墍鏈変换鍔¤鍒掓暟姹囨�� |
+
+---
+
+## 鍏�佸墠绔仈璋冭鐐�
+
+1. `/page` 鍘熸潵姣忚涓�涓伐搴忎换鍔★紝鐜板湪鏄瘡琛屼竴涓鍗曪紝琛ㄦ牸鍒楀畾涔夐渶瑕佺浉搴旇皟鏁�
+2. 濡傛灉闇�瑕佸睍绀鸿鍗曚笅鐨勫伐搴忔槑缁嗭紝鍙粨鍚� `/getOperation` 鎺ュ彛锛堣鎺ュ彛鎸夊伐搴忓垎缁勶紝鏀寔 `productionOrderId` 杩囨护锛�
+3. `/byOrder/{orderId}` 杩斿洖鏁扮粍锛屽彇绗竴涓厓绱犲嵆鍙紙鎴栧垽绌哄鐞嗭級
+4. `operationName` 瀛楁鐜板湪鍙兘鍖呭惈澶氫釜宸ュ簭鍚嶏紙閫楀彿鎷兼帴锛夛紝娉ㄦ剰鍓嶇灞曠ず澶勭悊锛堝鎹㈣鎴栨爣绛惧睍绀猴級
diff --git "a/docs/\344\273\230\346\254\276\347\224\263\350\257\267\344\273\230\346\254\276\347\212\266\346\200\201\345\212\237\350\203\275\346\226\207\346\241\243.md" "b/docs/\344\273\230\346\254\276\347\224\263\350\257\267\344\273\230\346\254\276\347\212\266\346\200\201\345\212\237\350\203\275\346\226\207\346\241\243.md"
new file mode 100644
index 0000000..2150bcf
--- /dev/null
+++ "b/docs/\344\273\230\346\254\276\347\224\263\350\257\267\344\273\230\346\254\276\347\212\266\346\200\201\345\212\237\350\203\275\346\226\207\346\241\243.md"
@@ -0,0 +1,327 @@
+# 浠樻鐢宠"浠樻鐘舵��"鍔熻兘鏂囨。
+
+## 涓�銆侀渶姹傝儗鏅�
+
+浠樻鐢宠锛圓ccountPaymentApplication锛夐渶瑕佹敮鎸佸娆′粯娆撅紝鏂板鐙珛鐨�"浠樻鐘舵��"瀛楁锛屼笌鍘熸湁鐨�"瀹℃牳鐘舵��"鍖哄垎銆�
+
+**鍘熸湁瀹℃牳鐘舵�侊紙status锛�**锛�
+- 0锛氬緟瀹℃牳
+- 1锛氬鏍搁�氳繃
+- 2锛氬鏍镐笉閫氳繃
+
+**鏂板浠樻鐘舵�侊紙payment_status锛�**锛�
+- 0锛氭湭浠樻
+- 1锛氶儴鍒嗕粯娆�
+- 2锛氬凡浠樻
+
+---
+
+## 浜屻�佹暟鎹簱鍙樻洿锛圫QL锛�
+
+```sql
+-- =====================================================
+-- 1. 浠樻鐢宠琛ㄦ柊澧炰粯娆剧姸鎬佸瓧娈�
+-- =====================================================
+ALTER TABLE `account_payment_application`
+ADD COLUMN `payment_status` INT DEFAULT 0 COMMENT '浠樻鐘舵��:0鏈粯娆� 1閮ㄥ垎浠樻 2宸蹭粯娆�' AFTER `status`;
+
+-- =====================================================
+-- 2. 鍒濆鍖栧巻鍙叉暟鎹殑浠樻鐘舵��
+-- =====================================================
+-- 鏍规嵁宸插瓨鍦ㄧ殑浠樻鍗曡绠椾粯娆剧姸鎬�
+UPDATE account_payment_application apa
+SET apa.payment_status = (
+    CASE
+        WHEN apa.payment_amount IS NULL OR apa.payment_amount = 0 THEN 0
+        ELSE (
+            SELECT CASE
+                WHEN IFNULL(SUM(app.payment_amount), 0) = 0 THEN 0
+                WHEN IFNULL(SUM(app.payment_amount), 0) < apa.payment_amount THEN 1
+                ELSE 2
+            END
+            FROM account_purchase_payment app
+            WHERE app.account_payment_application_id = apa.id
+        )
+    END
+);
+
+-- =====================================================
+-- 3. 瀛楁璇存槑
+-- =====================================================
+-- account_payment_application 琛ㄦ柊澧炲瓧娈碉細
+--   payment_status - 浠樻鐘舵�侊紙鏂板锛�
+--     0 = 鏈粯娆撅紙榛樿鍊硷紝鏃犱粯娆惧崟鎴栫疮璁′粯娆鹃噾棰濅负0锛�
+--     1 = 閮ㄥ垎浠樻锛堢疮璁′粯娆鹃噾棰� < 鐢宠閲戦锛�
+--     2 = 宸蹭粯娆撅紙绱浠樻閲戦 >= 鐢宠閲戦锛�
+--
+-- 鍘熸湁瀛楁淇濇寔涓嶅彉锛�
+--   status - 瀹℃牳鐘舵��
+--     0 = 寰呭鏍�
+--     1 = 瀹℃牳閫氳繃
+--     2 = 瀹℃牳涓嶉�氳繃
+```
+
+---
+
+## 涓夈�佸悗绔敼鍔ㄧ偣
+
+### 3.1 瀹炰綋绫讳慨鏀�
+
+**AccountPaymentApplication.java**
+```java
+/**
+ * 瀹℃牳鐘舵��:0寰呭鏍� 1瀹℃牳閫氳繃 2瀹℃牳涓嶉�氳繃
+ */
+@ApiModelProperty("瀹℃牳鐘舵��:0寰呭鏍� 1瀹℃牳閫氳繃 2瀹℃牳涓嶉�氳繃")
+@Excel(name = "瀹℃牳鐘舵��", readConverterExp = "0=寰呭鏍�,1=瀹℃牳閫氳繃,2=瀹℃牳涓嶉�氳繃")
+private Integer status;
+
+/**
+ * 浠樻鐘舵��:0鏈粯娆� 1閮ㄥ垎浠樻 2宸蹭粯娆�
+ */
+@ApiModelProperty("浠樻鐘舵��:0鏈粯娆� 1閮ㄥ垎浠樻 2宸蹭粯娆�")
+@Excel(name = "浠樻鐘舵��", readConverterExp = "0=鏈粯娆�,1=閮ㄥ垎浠樻,2=宸蹭粯娆�")
+private Integer paymentStatus;
+
+/**
+ * 宸蹭粯娆鹃噾棰濓紙闈炴寔涔呭寲锛屾煡璇㈡椂璁$畻锛�
+ */
+@ApiModelProperty("宸蹭粯娆鹃噾棰�")
+@TableField(exist = false)
+private BigDecimal paidAmount;
+```
+
+### 3.2 浠樻鍗曟柊澧為�昏緫
+
+**鏂板浠樻鍗曟椂鑷姩鏇存柊浠樻鐘舵�侊細**
+
+```java
+private void updatePaymentStatus(AccountPaymentApplication application, BigDecimal paidAmount) {
+    BigDecimal applyAmount = application.getPaymentAmount();
+    int newPaymentStatus;
+    if (paidAmount.compareTo(BigDecimal.ZERO) == 0) {
+        newPaymentStatus = 0; // 鏈粯娆�
+    } else if (paidAmount.compareTo(applyAmount) < 0) {
+        newPaymentStatus = 1; // 閮ㄥ垎浠樻
+    } else {
+        newPaymentStatus = 2; // 宸蹭粯娆�
+    }
+    application.setPaymentStatus(newPaymentStatus);
+    accountPaymentApplicationMapper.updateById(application);
+}
+```
+
+### 3.3 浠樻鍗曞垹闄ら�昏緫
+
+**鍒犻櫎浠樻鍗曟椂鑷姩鏇存柊浠樻鐘舵�侊細**
+
+鍒犻櫎浠樻鍗曞悗锛岄噸鏂拌绠楀墿浣欎粯娆鹃噾棰濓紝鏇存柊浠樻鐘舵�侊紙鍙兘浠�"宸蹭粯娆�"鍙樹负"閮ㄥ垎浠樻"鎴�"鏈粯娆�"锛夈��
+
+---
+
+## 鍥涖�佷笟鍔℃祦绋嬪浘
+
+```
+鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹�                       浠樻鐢宠娴佺▼                               鈹�
+鈹溾攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹�                                                                 鈹�
+鈹�   鏂板浠樻鐢宠                                                   鈹�
+鈹�   status=0(寰呭鏍�), payment_status=0(鏈粯娆�)                     鈹�
+鈹�         鈹�                                                       鈹�
+鈹�         鈻�                                                       鈹�
+鈹�   鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�                                               鈹�
+鈹�   鈹�   瀹℃牳鎿嶄綔   鈹�                                               鈹�
+鈹�   鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�                                               鈹�
+鈹�         鈹�                                                       鈹�
+鈹�    鈹屸攢鈹�鈹�鈹�鈹粹攢鈹�鈹�鈹�鈹�                                                  鈹�
+鈹� 閫氳繃       涓嶉�氳繃                                                鈹�
+鈹�    鈹�         鈹�                                                  鈹�
+鈹�    鈻�         鈻�                                                  鈹�
+鈹� status=1   status=2                                             鈹�
+鈹� payment_   payment_                                              鈹�
+鈹� status=0   status=0                                              鈹�
+鈹� (瀹℃牳閫氳繃) (瀹℃牳涓嶉�氳繃)                                          鈹�
+鈹�    鈹�                                                            鈹�
+鈹�    鈹� 涓嶉�氳繃锛氫笉鑳戒粯娆�                                            鈹�
+鈹�    鈻�                                                            鈹�
+鈹�   鍙互鏂板浠樻鍗�                                                 鈹�
+鈹�    鈹�                                                            鈹�
+鈹�    鈻�                                                            鈹�
+鈹�   鏂板浠樻鍗�1                                                    鈹�
+鈹�   绱浠樻 < 鐢宠閲戦                                            鈹�
+鈹�   payment_status=1(閮ㄥ垎浠樻)                                     鈹�
+鈹�    鈹�                                                            鈹�
+鈹�    鈻�                                                            鈹�
+鈹�   鏂板浠樻鍗�2                                                    鈹�
+鈹�   绱浠樻 = 鐢宠閲戦                                            鈹�
+鈹�   payment_status=2(宸蹭粯娆�)                                       鈹�
+鈹�                                                                 鈹�
+鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+```
+
+---
+
+## 浜斻�佺姸鎬佸鐓ц〃
+
+### 5.1 瀹℃牳鐘舵�� vs 浠樻鐘舵��
+
+| 瀹℃牳鐘舵��(status) | 璇存槑 | 浠樻鐘舵��(payment_status) | 璇存槑 |
+|------------------|------|--------------------------|------|
+| 0 | 寰呭鏍� | 0 | 鏈粯娆� |
+| 1 | 瀹℃牳閫氳繃 | 1 | 閮ㄥ垎浠樻 |
+| 2 | 瀹℃牳涓嶉�氳繃 | 2 | 宸蹭粯娆� |
+
+**涓や釜鐘舵�佺嫭绔嬪瓨鍦紝浜掍笉褰卞搷锛�**
+- 瀹℃牳閫氳繃(status=1)鍚庢墠鑳戒粯娆�
+- 浠樻鐘舵�佹牴鎹疮璁′粯娆鹃噾棰濊嚜鍔ㄨ绠�
+
+### 5.2 鐘舵�佺粍鍚堝満鏅�
+
+| status | payment_status | 鍦烘櫙璇存槑 |
+|--------|----------------|----------|
+| 0 | 0 | 鏂板浠樻鐢宠锛岀瓑寰呭鏍� |
+| 1 | 0 | 瀹℃牳閫氳繃锛屼絾灏氭湭浠樻 |
+| 1 | 1 | 瀹℃牳閫氳繃锛屽凡閮ㄥ垎浠樻 |
+| 1 | 2 | 瀹℃牳閫氳繃锛屽凡鍏ㄩ浠樻 |
+| 2 | 0 | 瀹℃牳涓嶉�氳繃锛屼笉鑳戒粯娆� |
+
+---
+
+## 鍏�佸墠绔敼鍔ㄧ偣
+
+### 6.1 浠樻鐢宠鍒楄〃椤甸潰
+
+**鏂板鍒楀睍绀猴細**
+
+| 瀛楁 | 鍒楀悕 | 璇存槑 |
+|------|------|------|
+| status | 瀹℃牳鐘舵�� | 0寰呭鏍�/1瀹℃牳閫氳繃/2瀹℃牳涓嶉�氳繃 |
+| payment_status | 浠樻鐘舵�侊紙鏂板锛� | 0鏈粯娆�/1閮ㄥ垎浠樻/2宸蹭粯娆� |
+| paidAmount | 宸蹭粯娆鹃噾棰濓紙鏂板锛� | 绱宸蹭粯娆鹃噾棰濓紙鏌ヨ鏃惰绠楋級 |
+| paymentAmount | 鐢宠閲戦 | 浠樻鐢宠鎬婚噾棰� |
+
+**鐘舵�佹爣绛鹃鑹插缓璁細**
+
+| 浠樻鐘舵�� | 鐘舵�佸悕绉� | 鏍囩棰滆壊 |
+|----------|----------|----------|
+| 0 | 鏈粯娆� | warning锛堟鑹诧級 |
+| 1 | 鍒嗕粯娆� | primary锛堣摑鑹诧級 |
+| 2 | 宸蹭粯娆� | success锛堢豢鑹诧級 |
+
+### 6.2 浠樻鐢宠鍒楄〃绛涢��
+
+**绛涢�夋潯浠舵柊澧烇細**
+```
+瀹℃牳鐘舵�侊細鍏ㄩ儴 / 寰呭鏍� / 瀹℃牳閫氳繃 / 瀹℃牳涓嶉�氳繃
+浠樻鐘舵�侊細鍏ㄩ儴 / 鏈粯娆� / 閮ㄥ垎浠樻 / 宸蹭粯娆撅紙鏂板锛�
+```
+
+### 6.3 浠樻鐢宠璇︽儏/鏂板椤甸潰
+
+鏃犻渶鏀瑰姩锛屼粯娆剧姸鎬佷负鑷姩璁$畻锛屼笉鍙墜鍔ㄧ紪杈戙��
+
+### 6.4 鏂板浠樻鍗曢〉闈�
+
+**灞曠ず淇℃伅寤鸿锛�**
+
+| 淇℃伅椤� | 璇存槑 |
+|--------|------|
+| 浠樻鐢宠鍗曞彿 | 鍏宠仈鐨勪粯娆剧敵璇� |
+| 鐢宠閲戦 | paymentAmount |
+| 宸蹭粯娆鹃噾棰� | paidAmount锛堢疮璁★級 |
+| 鍓╀綑鍙粯娆鹃噾棰� | paymentAmount - paidAmount |
+| 鏈浠樻閲戦 | 鐢ㄦ埛杈撳叆 |
+
+**鏍¢獙鎻愮ず锛�**
+- 浠樻鐢宠鏈鏍搁�氳繃锛�"浠樻鐢宠鏈鏍搁�氳繃锛屼笉鑳戒粯娆�"
+- 瓒呴浠樻锛�"绱浠樻閲戦涓嶈兘瓒呰繃鐢宠閲戦"
+
+---
+
+## 涓冦�丄PI鎺ュ彛
+
+### 7.1 鐜版湁鎺ュ彛锛堟棤闇�淇敼锛�
+
+| 鎺ュ彛 | 鏂规硶 | 璇存槑 |
+|------|------|------|
+| /accountPaymentApplication/listPageAccountPaymentApplication | GET | 鍒嗛〉鏌ヨ浠樻鐢宠 |
+| /accountPaymentApplication/addAccountPaymentApplication | POST | 鏂板浠樻鐢宠 |
+| /accountPaymentApplication/updateAccountPaymentApplication | PUT | 淇敼浠樻鐢宠 |
+| /accountPaymentApplication/auditAccountPaymentApplication | PUT | 瀹℃牳浠樻鐢宠 |
+| /accountPaymentApplication/deleteAccountPaymentApplication | DELETE | 鍒犻櫎浠樻鐢宠 |
+| /accountPaymentApplication/exportAccountPaymentApplication | POST | 瀵煎嚭浠樻鐢宠 |
+
+### 7.2 浠樻鍗曟帴鍙o紙閫昏緫宸叉洿鏂帮級
+
+| 鎺ュ彛 | 鏂规硶 | 璇存槑 |
+|------|------|------|
+| /accountPurchasePayment/addAccountPurchasePayment | POST | 鏂板浠樻鍗曪紙鑷姩鏇存柊payment_status锛� |
+| /accountPurchasePayment/deleteAccountPurchasePayment | DELETE | 鍒犻櫎浠樻鍗曪紙鑷姩鏇存柊payment_status锛� |
+
+---
+
+## 鍏�丮apper鏌ヨ淇敼寤鸿
+
+**AccountPaymentApplicationMapper.xml** 闇�瑕佸湪鏌ヨ鍒楄〃鏃跺鍔犲凡浠樻閲戦鐨勮绠楋細
+
+```xml
+<select id="listPageAccountPaymentApplication" resultType="...">
+    SELECT 
+        apa.*,
+        -- 璁$畻宸蹭粯娆鹃噾棰�
+        IFNULL((
+            SELECT SUM(app.payment_amount)
+            FROM account_purchase_payment app
+            WHERE app.account_payment_application_id = apa.id
+        ), 0) AS paid_amount
+    FROM account_payment_application apa
+    ...
+</select>
+```
+
+---
+
+## 涔濄�佹敞鎰忎簨椤�
+
+1. **浠樻鐘舵�佽嚜鍔ㄦ洿鏂帮細** 鏂板/鍒犻櫎浠樻鍗曟椂鑷姩璁$畻锛屼笉鍙墜鍔ㄤ慨鏀�
+
+2. **鐘舵�佹祦杞鍒欙細**
+   - 鏈粯娆�(0) 鈫� 閮ㄥ垎浠樻(1)锛氶娆℃柊澧炰粯娆惧崟
+   - 閮ㄥ垎浠樻(1) 鈫� 宸蹭粯娆�(2)锛氱疮璁′粯娆鹃噾棰� >= 鐢宠閲戦
+   - 宸蹭粯娆�(2) 鈫� 閮ㄥ垎浠樻(1)锛氬垹闄や粯娆惧崟鍚庡墿浣欓噾棰� < 鐢宠閲戦
+   - 閮ㄥ垎浠樻(1) 鈫� 鏈粯娆�(0)锛氬垹闄ゆ墍鏈変粯娆惧崟
+
+3. **浠樻鍓嶆彁鏉′欢锛�** 浠樻鐢宠蹇呴』瀹℃牳閫氳繃(status=1)鎵嶈兘鏂板浠樻鍗�
+
+4. **鍘嗗彶鏁版嵁杩佺Щ锛�** 鏂板瀛楁鍚庨渶鎵ц鍒濆鍖朣QL璁$畻鍘嗗彶鏁版嵁鐨勪粯娆剧姸鎬�
+
+---
+
+## 鍗併�佹祴璇曠敤渚�
+
+### 10.1 澶氭浠樻娴佺▼
+
+| 姝ラ | 鎿嶄綔 | 棰勬湡缁撴灉 |
+|------|------|----------|
+| 1 | 鏂板浠樻鐢宠锛岄噾棰�10000鍏� | status=0, payment_status=0 |
+| 2 | 瀹℃牳閫氳繃 | status=1, payment_status=0 |
+| 3 | 鏂板浠樻鍗曪紝閲戦3000鍏� | payment_status=1(閮ㄥ垎浠樻), paidAmount=3000 |
+| 4 | 鏂板浠樻鍗曪紝閲戦5000鍏� | payment_status=1(閮ㄥ垎浠樻), paidAmount=8000 |
+| 5 | 鏂板浠樻鍗曪紝閲戦2000鍏� | payment_status=2(宸蹭粯娆�), paidAmount=10000 |
+
+### 10.2 鍒犻櫎浠樻鍗�
+
+| 姝ラ | 鎿嶄綔 | 棰勬湡缁撴灉 |
+|------|------|----------|
+| 1 | 褰撳墠鐘舵�侊細payment_status=2, paidAmount=10000 | - |
+| 2 | 鍒犻櫎鏈�鍚庝竴绗斾粯娆惧崟锛�2000鍏冿級 | payment_status=1, paidAmount=8000 |
+| 3 | 鍒犻櫎鎵�鏈変粯娆惧崟 | payment_status=0, paidAmount=0 |
+
+### 10.3 寮傚父鍦烘櫙
+
+| 鍦烘櫙 | 鎿嶄綔 | 棰勬湡缁撴灉 |
+|------|------|----------|
+| 鏈鏍镐粯娆� | status=0鏃舵柊澧炰粯娆惧崟 | 鎻愮ず"浠樻鐢宠鏈鏍搁�氳繃锛屼笉鑳戒粯娆�" |
+| 瀹℃牳涓嶉�氳繃 | status=2鏃舵柊澧炰粯娆惧崟 | 鎻愮ず"浠樻鐢宠鏈鏍搁�氳繃锛屼笉鑳戒粯娆�" |
+| 瓒呴浠樻 | 鐢宠10000锛屽凡浠�9000锛屽啀浠�2000 | 鎻愮ず"绱浠樻閲戦涓嶈兘瓒呰繃鐢宠閲戦" |
\ No newline at end of file
diff --git "a/docs/\344\273\230\346\254\276\347\224\263\350\257\267\345\267\262\344\273\230\346\254\276\347\212\266\346\200\201\345\212\237\350\203\275\346\226\207\346\241\243.md" "b/docs/\344\273\230\346\254\276\347\224\263\350\257\267\345\267\262\344\273\230\346\254\276\347\212\266\346\200\201\345\212\237\350\203\275\346\226\207\346\241\243.md"
new file mode 100644
index 0000000..ff7748b
--- /dev/null
+++ "b/docs/\344\273\230\346\254\276\347\224\263\350\257\267\345\267\262\344\273\230\346\254\276\347\212\266\346\200\201\345\212\237\350\203\275\346\226\207\346\241\243.md"
@@ -0,0 +1,227 @@
+# 浠樻鐢宠"宸蹭粯娆�"鐘舵�佸姛鑳芥枃妗�
+
+## 涓�銆侀渶姹傝儗鏅�
+
+浠樻鐢宠锛圓ccountPaymentApplication锛夊師鏈夌姸鎬侊細
+- 0锛氬緟瀹℃牳
+- 1锛氬鏍搁�氳繃
+- 2锛氬鏍镐笉閫氳繃
+
+鏂板鐘舵�侊細
+- **3锛氬凡浠樻**
+
+褰撲粯娆剧敵璇峰叧鑱旂殑浠樻鍗曠疮璁′粯娆鹃噾棰濈瓑浜庣敵璇烽噾棰濇椂锛岃嚜鍔ㄥ皢浠樻鐢宠鐘舵�佹洿鏂颁负"宸蹭粯娆�"銆�
+
+---
+
+## 浜屻�佹暟鎹簱鍙樻洿锛圫QL锛�
+
+```sql
+-- 鏃犻渶淇敼琛ㄧ粨鏋勶紝status瀛楁涓篒nteger绫诲瀷锛屽彲鐩存帴鏀寔鏂扮姸鎬佸��
+-- 鐘舵�佽鏄庯細
+-- 0 = 寰呭鏍�
+-- 1 = 瀹℃牳閫氳繃
+-- 2 = 瀹℃牳涓嶉�氳繃
+-- 3 = 宸蹭粯娆撅紙鏂板锛�
+```
+
+---
+
+## 涓夈�佸悗绔敼鍔ㄧ偣
+
+### 3.1 瀹炰綋绫讳慨鏀�
+
+**AccountPaymentApplication.java**
+```java
+/**
+ * 瀹℃牳鐘舵��:0寰呭鏍� 1瀹℃牳閫氳繃 2瀹℃牳涓嶉�氳繃 3宸蹭粯娆�
+ */
+@ApiModelProperty("瀹℃牳鐘舵��:0寰呭鏍� 1瀹℃牳閫氳繃 2瀹℃牳涓嶉�氳繃 3宸蹭粯娆�")
+@Excel(name = "瀹℃牳鐘舵��", readConverterExp = "0=寰呭鏍�,1=瀹℃牳閫氳繃,2=瀹℃牳涓嶉�氳繃,3=宸蹭粯娆�")
+private Integer status;
+```
+
+### 3.2 浠樻鍗曟柊澧為�昏緫锛圓ccountPurchasePaymentServiceImpl锛�
+
+**鏂板浠樻鍗曟椂鐨勪笟鍔¢�昏緫锛�**
+
+1. 鏍¢獙浠樻鐢宠鏄惁瀛樺湪
+2. 鏍¢獙浠樻鐢宠鐘舵�佸繀椤讳负"瀹℃牳閫氳繃"锛坰tatus=1锛�
+3. 鏍¢獙绱浠樻閲戦涓嶈兘瓒呰繃鐢宠閲戦
+4. 淇濆瓨浠樻鍗�
+5. **鏂板**锛氬鏋滅疮璁′粯娆鹃噾棰濈瓑浜庣敵璇烽噾棰濓紝鑷姩鏇存柊浠樻鐢宠鐘舵�佷负"宸蹭粯娆�"锛坰tatus=3锛�
+
+```java
+// 濡傛灉绱浠樻閲戦绛変簬鐢宠閲戦锛屾洿鏂颁粯娆剧敵璇风姸鎬佷负宸蹭粯娆�
+if (result && accountPaymentApplication.getPaymentAmount().compareTo(newTotal) == 0) {
+    accountPaymentApplication.setStatus(3); // 宸蹭粯娆�
+    accountPaymentApplicationMapper.updateById(accountPaymentApplication);
+}
+```
+
+### 3.3 浠樻鍗曞垹闄ら�昏緫
+
+**鍒犻櫎浠樻鍗曟椂鐨勪笟鍔¢�昏緫锛�**
+
+1. 鏍¢獙浠樻鍗曟槸鍚﹀凡鐢熸垚瀵硅处鍗曪紝濡傛湁鍒欎笉鑳藉垹闄�
+2. 鍒犻櫎浠樻鍗�
+3. **鏂板**锛氬鏋滀粯娆剧敵璇峰師鐘舵�佷负"宸蹭粯娆�"锛坰tatus=3锛夛紝鍒犻櫎鍚庡墿浣欎粯娆鹃噾棰濆皬浜庣敵璇烽噾棰濓紝鍒欐仮澶嶇姸鎬佷负"瀹℃牳閫氳繃"锛坰tatus=1锛�
+
+---
+
+## 鍥涖�佷笟鍔℃祦绋嬪浘
+
+```
+鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹�                       浠樻鐢宠娴佺▼                               鈹�
+鈹溾攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹�                                                                 鈹�
+鈹�   鏂板浠樻鐢宠 鈹�鈹�鈻� status=0(寰呭鏍�)                              鈹�
+鈹�         鈹�                                                       鈹�
+鈹�         鈻�                                                       鈹�
+鈹�   鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�                                               鈹�
+鈹�   鈹�   瀹℃牳鎿嶄綔   鈹�                                               鈹�
+鈹�   鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�                                               鈹�
+鈹�         鈹�                                                       鈹�
+鈹�    鈹屸攢鈹�鈹�鈹�鈹粹攢鈹�鈹�鈹�鈹�                                                  鈹�
+鈹�    鈻�         鈻�                                                  鈹�
+鈹� 閫氳繃       涓嶉�氳繃                                                鈹�
+鈹�    鈹�         鈹�                                                  鈹�
+鈹�    鈻�         鈻�                                                  鈹�
+鈹� status=1   status=2                                             鈹�
+鈹� (瀹℃牳閫氳繃) (瀹℃牳涓嶉�氳繃)                                          鈹�
+鈹�    鈹�                                                            鈹�
+鈹�    鈻�                                                            鈹�
+鈹�   鍙互鏂板浠樻鍗�                                                 鈹�
+鈹�    鈹�                                                            鈹�
+鈹�    鈻�                                                            鈹�
+鈹�   鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�                      鈹�
+鈹�   鈹� 绱浠樻閲戦 = 鐢宠閲戦锛�             鈹�                      鈹�
+鈹�   鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�                      鈹�
+鈹�         鈹�                                                       鈹�
+鈹�    鈹屸攢鈹�鈹�鈹�鈹粹攢鈹�鈹�鈹�鈹�                                                  鈹�
+鈹�   鏄�         鍚�                                                  鈹�
+鈹�    鈹�         鈹�                                                  鈹�
+鈹�    鈻�         鈹�                                                  鈹�
+鈹� status=3     鈹�                                                  鈹�
+鈹� (宸蹭粯娆�)     鈹�                                                  鈹�
+鈹�             鈹�                                                   鈹�
+鈹�             鈻�                                                   鈹�
+鈹�        缁х画绛夊緟浠樻                                              鈹�
+鈹�                                                                 鈹�
+鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+```
+
+---
+
+## 浜斻�佸墠绔敼鍔ㄧ偣
+
+### 5.1 浠樻鐢宠鍒楄〃椤甸潰
+
+**鐘舵�佸垪灞曠ず璋冩暣锛�**
+
+| 鐘舵�佸�� | 鐘舵�佸悕绉� | 鏍囩棰滆壊锛堝缓璁級 |
+|--------|----------|------------------|
+| 0 | 寰呭鏍� | warning锛堟鑹诧級 |
+| 1 | 瀹℃牳閫氳繃 | success锛堢豢鑹诧級 |
+| 2 | 瀹℃牳涓嶉�氳繃 | danger锛堢孩鑹诧級 |
+| 3 | 宸蹭粯娆� | info锛堣摑鑹诧級鎴� primary |
+
+**瀛楀吀閰嶇疆锛坰ys_dict_data琛級锛�**
+```sql
+-- 濡傛灉绯荤粺鏈夊瓧鍏搁厤缃紝闇�瑕佹坊鍔犳柊鐘舵��
+INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, update_by, update_time, remark)
+VALUES (4, '宸蹭粯娆�', '3', 'payment_application_status', '', 'primary', 'N', '0', 'admin', NOW(), '', NULL, '浠樻鐢宠宸蹭粯娆剧姸鎬�');
+```
+
+### 5.2 浠樻鐢宠璇︽儏椤甸潰
+
+**鐘舵�佸睍绀猴細** 闇�瑕佹敮鎸佹樉绀�"宸蹭粯娆�"鐘舵��
+
+### 5.3 鏂板浠樻鍗曢〉闈�
+
+**鍓嶇疆鏉′欢鏍¢獙鎻愮ず锛�**
+- 濡傛灉浠樻鐢宠鐘舵�佷笉鏄�"瀹℃牳閫氳繃"锛屾彁绀猴細"浠樻鐢宠鏈鏍搁�氳繃锛屼笉鑳戒粯娆�"
+- 濡傛灉绱浠樻閲戦瓒呰繃鐢宠閲戦锛屾彁绀猴細"绱浠樻閲戦涓嶈兘瓒呰繃鐢宠閲戦"
+
+**灞曠ず淇℃伅寤鸿锛�**
+- 鏄剧ず浠樻鐢宠閲戦
+- 鏄剧ず宸蹭粯娆鹃噾棰濓紙绱锛�
+- 鏄剧ず鍓╀綑鍙粯娆鹃噾棰�
+
+### 5.4 浠樻鐢宠鍒楄〃绛涢��
+
+**鐘舵�佺瓫閫変笅鎷夋锛�**
+```
+鍏ㄩ儴
+寰呭鏍�
+瀹℃牳閫氳繃
+瀹℃牳涓嶉�氳繃
+宸蹭粯娆撅紙鏂板锛�
+```
+
+---
+
+## 鍏�丄PI鎺ュ彛
+
+### 6.1 鐜版湁鎺ュ彛锛堟棤闇�淇敼锛�
+
+| 鎺ュ彛 | 鏂规硶 | 璇存槑 |
+|------|------|------|
+| /accountPaymentApplication/listPageAccountPaymentApplication | GET | 鍒嗛〉鏌ヨ浠樻鐢宠鍒楄〃 |
+| /accountPaymentApplication/addAccountPaymentApplication | POST | 鏂板浠樻鐢宠 |
+| /accountPaymentApplication/updateAccountPaymentApplication | PUT | 淇敼浠樻鐢宠 |
+| /accountPaymentApplication/auditAccountPaymentApplication | PUT | 瀹℃牳浠樻鐢宠 |
+| /accountPaymentApplication/deleteAccountPaymentApplication | DELETE | 鍒犻櫎浠樻鐢宠 |
+| /accountPaymentApplication/exportAccountPaymentApplication | POST | 瀵煎嚭浠樻鐢宠 |
+
+### 6.2 浠樻鍗曟帴鍙o紙閫昏緫宸叉洿鏂帮級
+
+| 鎺ュ彛 | 鏂规硶 | 璇存槑 |
+|------|------|------|
+| /accountPurchasePayment/addAccountPurchasePayment | POST | 鏂板浠樻鍗曪紙鑷姩鏇存柊浠樻鐢宠鐘舵�侊級 |
+| /accountPurchasePayment/deleteAccountPurchasePayment | DELETE | 鍒犻櫎浠樻鍗曪紙鑷姩鎭㈠浠樻鐢宠鐘舵�侊級 |
+
+---
+
+## 涓冦�佹敞鎰忎簨椤�
+
+1. **鐘舵�佹祦杞鍒欙細**
+   - 寰呭鏍�(0) 鈫� 瀹℃牳閫氳繃(1) 鎴� 瀹℃牳涓嶉�氳繃(2)
+   - 瀹℃牳閫氳繃(1) 鈫� 宸蹭粯娆�(3)锛堣嚜鍔紝褰撶疮璁′粯娆鹃噾棰濈瓑浜庣敵璇烽噾棰濓級
+   - 宸蹭粯娆�(3) 鈫� 瀹℃牳閫氳繃(1)锛堣嚜鍔紝褰撳垹闄や粯娆惧崟鍚庡墿浣欓噾棰濆皬浜庣敵璇烽噾棰濓級
+
+2. **鍒犻櫎浠樻鐢宠鏃讹細**
+   - 濡傛灉鐘舵�佷负"宸蹭粯娆�"锛岄渶瑕佸厛鍒犻櫎鍏宠仈鐨勪粯娆惧崟
+   - 宸茬敓鎴愬璐﹀崟鐨勪粯娆惧崟涓嶈兘鍒犻櫎锛屽洜姝ゅ凡浠樻鐘舵�侀�氬父涓嶈兘鐩存帴鍒犻櫎浠樻鐢宠
+
+3. **閲戦璁$畻锛�**
+   - 绱浠樻閲戦 = 鎵�鏈夊叧鑱斾粯娆惧崟鐨刾aymentAmount涔嬪拰
+   - 褰撶疮璁′粯娆鹃噾棰� >= 鐢宠閲戦鏃讹紝鐘舵�佸彉涓�"宸蹭粯娆�"
+
+---
+
+## 鍏�佹祴璇曠敤渚�
+
+### 8.1 姝e父浠樻娴佺▼
+
+| 姝ラ | 鎿嶄綔 | 棰勬湡缁撴灉 |
+|------|------|----------|
+| 1 | 鏂板浠樻鐢宠锛岄噾棰�10000 | status=0锛堝緟瀹℃牳锛� |
+| 2 | 瀹℃牳閫氳繃 | status=1锛堝鏍搁�氳繃锛� |
+| 3 | 鏂板浠樻鍗曪紝閲戦6000 | status=1锛堝鏍搁�氳繃锛夛紝绱浠樻6000 |
+| 4 | 鏂板浠樻鍗曪紝閲戦4000 | status=3锛堝凡浠樻锛夛紝绱浠樻10000 |
+
+### 8.2 鍒嗘壒浠樻鍚庡垹闄�
+
+| 姝ラ | 鎿嶄綔 | 棰勬湡缁撴灉 |
+|------|------|----------|
+| 1 | 宸蹭粯娆剧敵璇凤紝绱浠樻10000 | status=3锛堝凡浠樻锛� |
+| 2 | 鍒犻櫎鍏朵腑涓�绗斾粯娆惧崟锛�6000锛� | status=1锛堝鏍搁�氳繃锛夛紝绱浠樻4000 |
+
+### 8.3 寮傚父鍦烘櫙
+
+| 鍦烘櫙 | 鎿嶄綔 | 棰勬湡缁撴灉 |
+|------|------|----------|
+| 鏈鏍哥洿鎺ヤ粯娆� | status=0鏃舵柊澧炰粯娆惧崟 | 鎻愮ず"浠樻鐢宠鏈鏍搁�氳繃锛屼笉鑳戒粯娆�" |
+| 瓒呴浠樻 | 鐢宠10000锛岀疮璁″凡浠�9000锛屽啀浠�2000 | 鎻愮ず"绱浠樻閲戦涓嶈兘瓒呰繃鐢宠閲戦" |
diff --git "a/docs/\351\224\200\345\224\256\345\217\260\350\264\246\347\216\260\345\234\250\347\224\237\344\272\247\345\255\227\346\256\265\345\220\214\346\255\245\346\226\207\346\241\243.md" "b/docs/\351\224\200\345\224\256\345\217\260\350\264\246\347\216\260\345\234\250\347\224\237\344\272\247\345\255\227\346\256\265\345\220\214\346\255\245\346\226\207\346\241\243.md"
new file mode 100644
index 0000000..636e3c0
--- /dev/null
+++ "b/docs/\351\224\200\345\224\256\345\217\260\350\264\246\347\216\260\345\234\250\347\224\237\344\272\247\345\255\227\346\256\265\345\220\214\346\255\245\346\226\207\346\241\243.md"
@@ -0,0 +1,263 @@
+# 閿�鍞彴璐�"鐜板湪鐢熶骇"瀛楁鍚屾浼樺寲鏂囨。
+
+## 涓�銆侀渶姹傝儗鏅�
+
+鏂板閿�鍞彴璐︽椂锛屽鏋滃嬀閫�"鐜板湪鐢熶骇"锛岄渶瑕佸皢浠ヤ笅瀛楁鍚屾鍒颁富鐢熶骇璁″垝鍜岀敓浜ц鍗曪細
+1. **鍗曚綅**锛氫粠浜у搧瑙勬牸鍚屾
+2. **浜у搧鏁伴噺**锛氫綔涓轰富璁″垝鎵�闇�鏁伴噺
+3. **鎬绘暟**鍜�**姣忎欢鏁伴噺**锛氬悓姝ュ埌鐢熶骇渚э紝鐢ㄤ簬鍏ュ簱鏃惰绠楀疄闄呭叆搴撻噺
+
+### 涓氬姟瑙勫垯
+- **涓昏鍒掓墍闇�鏁伴噺** = 浜у搧鏁伴噺锛坬uantity锛夛紝涓嶆槸鎬绘暟
+- **鐢熶骇鍏ュ簱鏁伴噺** = 鎶ュ伐鏁伴噺 脳 姣忎欢鏁伴噺锛坰ingleQuantity锛�
+
+---
+
+## 浜屻�佹暟鎹簱鍙樻洿锛圫QL锛�
+
+```sql
+-- =====================================================
+-- 1. 涓荤敓浜ц鍒掕〃鏂板瀛楁
+-- =====================================================
+ALTER TABLE `production_plan`
+ADD COLUMN `unit` VARCHAR(50) NULL COMMENT '鍗曚綅' AFTER `product_model_id`,
+ADD COLUMN `quantity` DECIMAL(24,6) NULL COMMENT '浜у搧鏁伴噺' AFTER `unit`,
+ADD COLUMN `single_quantity` DECIMAL(24,6) NULL COMMENT '姣忎欢鏁伴噺' AFTER `quantity`,
+ADD COLUMN `total_quantity` DECIMAL(24,6) NULL COMMENT '鎬绘暟' AFTER `single_quantity`;
+
+-- =====================================================
+-- 2. 鐢熶骇璁㈠崟琛ㄦ柊澧炲瓧娈�
+-- =====================================================
+ALTER TABLE `production_order`
+ADD COLUMN `unit` VARCHAR(50) NULL COMMENT '鍗曚綅' AFTER `product_model_id`,
+ADD COLUMN `single_quantity` DECIMAL(24,6) NULL COMMENT '姣忎欢鏁伴噺' AFTER `quantity`,
+ADD COLUMN `total_quantity` DECIMAL(24,6) NULL COMMENT '鎬绘暟' AFTER `single_quantity`;
+
+-- =====================================================
+-- 3. 鍘嗗彶鏁版嵁杩佺Щ锛堝彲閫夛紝浠庝骇鍝佽鏍艰〃鍥炲~鍗曚綅锛�
+-- =====================================================
+-- 鏇存柊涓荤敓浜ц鍒掔殑鍗曚綅
+UPDATE production_plan pp
+LEFT JOIN product_model pm ON pp.product_model_id = pm.id
+SET pp.unit = pm.unit
+WHERE pp.unit IS NULL;
+
+-- 鏇存柊鐢熶骇璁㈠崟鐨勫崟浣�
+UPDATE production_order po
+LEFT JOIN product_model pm ON po.product_model_id = pm.id
+SET po.unit = pm.unit
+WHERE po.unit IS NULL;
+
+-- =====================================================
+-- 4. 瀛楁璇存槑
+-- =====================================================
+-- production_plan 琛ㄥ瓧娈碉細
+--   qty_required    - 闇�姹傛暟閲忥紙鍘熸湁瀛楁锛屾敼涓哄瓨鍌ㄤ骇鍝佹暟閲� quantity锛�
+--   unit            - 鍗曚綅锛堟柊澧烇級
+--   quantity        - 浜у搧鏁伴噺锛堟柊澧烇級
+--   single_quantity - 姣忎欢鏁伴噺锛堟柊澧烇級
+--   total_quantity  - 鎬绘暟锛堟柊澧烇級
+--
+-- production_order 琛ㄥ瓧娈碉細
+--   quantity        - 闇�姹傛暟閲忥紙鍘熸湁瀛楁锛屼繚鎸佷笉鍙橈級
+--   unit            - 鍗曚綅锛堟柊澧烇級
+--   single_quantity - 姣忎欢鏁伴噺锛堟柊澧烇級
+--   total_quantity  - 鎬绘暟锛堟柊澧烇級
+```
+
+---
+
+## 涓夈�佸悗绔敼鍔ㄧ偣
+
+### 3.1 瀹炰綋绫讳慨鏀�
+
+#### ProductionPlan.java锛堜富鐢熶骇璁″垝锛�
+鏂板瀛楁锛�
+```java
+@Schema(description = "鍗曚綅")
+private String unit;
+
+@Schema(description = "浜у搧鏁伴噺")
+private BigDecimal quantity;
+
+@Schema(description = "姣忎欢鏁伴噺")
+private BigDecimal singleQuantity;
+
+@Schema(description = "鎬绘暟")
+private BigDecimal totalQuantity;
+```
+
+#### ProductionOrder.java锛堢敓浜ц鍗曪級
+鏂板瀛楁锛�
+```java
+@Schema(description = "鍗曚綅")
+private String unit;
+
+@Schema(description = "姣忎欢鏁伴噺")
+private BigDecimal singleQuantity;
+
+@Schema(description = "鎬绘暟")
+private BigDecimal totalQuantity;
+```
+
+### 3.2 SalesLedgerProductServiceImpl.addProductionData() 鏂规硶淇敼
+
+**淇敼鍓�**锛�
+```java
+productionPlan.setQtyRequired(normalizeTotalQuantity(
+        salesLedgerProduct.getTotalQuantity(),
+        salesLedgerProduct.getQuantity(),
+        salesLedgerProduct.getSingleQuantity()
+)); // 闇�姹傛暟閲� = 鎬绘暟
+```
+
+**淇敼鍚�**锛�
+```java
+// 鏌ヨ浜у搧瑙勬牸鑾峰彇鍗曚綅
+ProductModel productModel = productModelMapper.selectById(salesLedgerProduct.getProductModelId());
+
+productionPlan.setQtyRequired(salesLedgerProduct.getQuantity()); // 闇�姹傛暟閲� = 浜у搧鏁伴噺
+productionPlan.setUnit(productModel != null ? productModel.getUnit() : null); // 鍗曚綅
+productionPlan.setQuantity(salesLedgerProduct.getQuantity()); // 浜у搧鏁伴噺
+productionPlan.setSingleQuantity(normalizeSingleQuantity(salesLedgerProduct.getSingleQuantity())); // 姣忎欢鏁伴噺
+productionPlan.setTotalQuantity(normalizeTotalQuantity(
+        salesLedgerProduct.getTotalQuantity(),
+        salesLedgerProduct.getQuantity(),
+        salesLedgerProduct.getSingleQuantity()
+)); // 鎬绘暟
+```
+
+### 3.3 鐢熶骇璁″垝涓嬪彂鍒扮敓浜ц鍗曟椂鍚屾瀛楁
+
+鍦� `ProductionPlanServiceImpl.combine()` 鏂规硶涓紝鍚堝苟涓嬪彂鐢熶骇璁㈠崟鏃讹紝闇�瑕佸悓姝ヤ互涓嬪瓧娈碉細
+- unit锛堝崟浣嶏級
+- singleQuantity锛堟瘡浠舵暟閲忥級
+- totalQuantity锛堟�绘暟锛�
+
+### 3.4 鐢熶骇鍏ュ簱鏁伴噺璁$畻淇敼
+
+**淇敼浣嶇疆**锛歚ProductionProductMainServiceImpl.addProductMainByProductionTask()` 鏂规硶
+
+**淇敼閫昏緫**锛�
+```java
+// 鑾峰彇鐢熶骇璁㈠崟鍏宠仈鐨勬瘡浠舵暟閲�
+ProductionOrder productionOrder = productionOrderMapper.selectById(productionOperationTask.getProductionOrderId());
+BigDecimal singleQuantity = productionOrder.getSingleQuantity();
+if (singleQuantity == null || singleQuantity.compareTo(BigDecimal.ZERO) <= 0) {
+    singleQuantity = BigDecimal.ONE;
+}
+
+// 鍏ュ簱鏁伴噺 = 鎶ュ伐鏁伴噺 脳 姣忎欢鏁伴噺
+BigDecimal stockInQuantity = productQty.multiply(singleQuantity);
+
+// 鍏ュ簱璁板綍
+StockInventoryDto stockInventoryDto = new StockInventoryDto();
+stockInventoryDto.setQualitity(stockInQuantity); // 浣跨敤璁$畻鍚庣殑鍏ュ簱鏁伴噺
+```
+
+---
+
+## 鍥涖�佸墠绔敼鍔ㄧ偣
+
+### 4.1 閿�鍞彴璐︽柊澧�/缂栬緫椤甸潰
+
+鏃犻渶淇敼锛�"鐜板湪鐢熶骇"寮�鍏冲凡瀛樺湪锛屽悗绔嚜鍔ㄥ悓姝ユ暟鎹埌鐢熶骇璁″垝銆�
+
+### 4.2 涓荤敓浜ц鍒掑垪琛ㄩ〉闈�
+
+鏂板灞曠ず鍒楋細
+| 瀛楁 | 鍒楀悕 | 璇存槑 |
+|------|------|------|
+| unit | 鍗曚綅 | 浠庝骇鍝佽鏍煎悓姝� |
+| quantity | 浜у搧鏁伴噺 | 鍘� qtyRequired 鏀瑰悕鎴栨柊澧炲睍绀� |
+| singleQuantity | 姣忎欢鏁伴噺 | 鏂板灞曠ず |
+| totalQuantity | 鎬绘暟 | 鏂板灞曠ず |
+
+### 4.3 鐢熶骇璁㈠崟鍒楄〃椤甸潰
+
+鏂板灞曠ず鍒楋細
+| 瀛楁 | 鍒楀悕 | 璇存槑 |
+|------|------|------|
+| unit | 鍗曚綅 | 浠庣敓浜ц鍒掑悓姝� |
+| singleQuantity | 姣忎欢鏁伴噺 | 鏂板灞曠ず |
+| totalQuantity | 鎬绘暟 | 鏂板灞曠ず |
+
+### 4.4 鐢熶骇鍏ュ簱/鎶ュ伐椤甸潰
+
+**灞曠ず璋冩暣**锛�
+- 鎶ュ伐鏁伴噺锛氱敤鎴疯緭鍏ョ殑浜у搧鏁伴噺
+- 瀹為檯鍏ュ簱鏁伴噺锛氳嚜鍔ㄨ绠� = 鎶ュ伐鏁伴噺 脳 姣忎欢鏁伴噺
+
+**鍓嶇璁$畻灞曠ず绀轰緥**锛�
+```javascript
+// 鎶ュ伐琛ㄥ崟
+const reportForm = {
+  quantity: 0,        // 鎶ュ伐鏁伴噺锛堜骇鍝佹暟閲忥級
+  singleQuantity: 1,  // 姣忎欢鏁伴噺锛堜粠鐢熶骇璁㈠崟甯﹀嚭锛屽彧璇伙級
+  actualQuantity: 0   // 瀹為檯鍏ュ簱鏁伴噺 = quantity 脳 singleQuantity
+};
+
+// 璁$畻瀹為檯鍏ュ簱鏁伴噺
+const calcActualQuantity = () => {
+  const qty = reportForm.quantity || 0;
+  const single = reportForm.singleQuantity || 1;
+  reportForm.actualQuantity = qty * single;
+};
+```
+
+---
+
+## 浜斻�佹暟鎹祦杞浘
+
+```
+鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹�                        閿�鍞彴璐︿骇鍝�                              鈹�
+鈹�  SalesLedgerProduct                                             鈹�
+鈹�  鈹溾攢 quantity (浜у搧鏁伴噺) 鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�                     鈹�
+鈹�  鈹溾攢 singleQuantity (姣忎欢鏁伴噺) 鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹尖攢鈹�鈹�鈹�                 鈹�
+鈹�  鈹溾攢 totalQuantity (鎬绘暟) 鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹尖攢鈹�鈹�鈹尖攢鈹�鈹�鈹�             鈹�
+鈹�  鈹溾攢 unit (鍗曚綅锛屾潵鑷猵roduct_model) 鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹尖攢鈹�鈹�鈹尖攢鈹�鈹�鈹尖攢鈹�鈹�鈹�         鈹�
+鈹�  鈹斺攢 isProduction = true 鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�   鈹�   鈹�   鈹�         鈹�
+鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�   鈹�   鈹�   鈹�     鈹�
+                                                     鈹�   鈹�   鈹�     鈹�
+                                                     鈻�   鈻�   鈻�     鈹�
+鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹�                        涓荤敓浜ц鍒�                                鈹�
+鈹�  ProductionPlan                                                 鈹�
+鈹�  鈹溾攢 qtyRequired (闇�姹傛暟閲�) = quantity (浜у搧鏁伴噺)                 鈹�
+鈹�  鈹溾攢 quantity (浜у搧鏁伴噺) 鈼勨攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹� 鈹�
+鈹�  鈹溾攢 singleQuantity (姣忎欢鏁伴噺) 鈼勨攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹愨攤 鈹�
+鈹�  鈹溾攢 totalQuantity (鎬绘暟) 鈼勨攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹愨攤鈹� 鈹�
+鈹�  鈹斺攢 unit (鍗曚綅) 鈼勨攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹愨攤鈹傗攤 鈹�
+鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹樷攤鈹傗攤 鈹�
+                                                               鈹傗攤鈹� 鈹�
+                          涓嬪彂鍒扮敓浜ц鍗�                         鈹傗攤鈹� 鈹�
+                                                               鈻尖柤鈻� 鈹�
+鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹�                        鐢熶骇璁㈠崟                                  鈹�
+鈹�  ProductionOrder                                               鈹�
+鈹�  鈹溾攢 quantity (闇�姹傛暟閲�)                                         鈹�
+鈹�  鈹溾攢 singleQuantity (姣忎欢鏁伴噺)                                   鈹�
+鈹�  鈹溾攢 totalQuantity (鎬绘暟)                                        鈹�
+鈹�  鈹斺攢 unit (鍗曚綅)                                                 鈹�
+鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+                               鈹�
+                               鈻�
+鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹�                        鐢熶骇鎶ュ伐                                  鈹�
+鈹�  ProductionProductMain                                         鈹�
+鈹�  鈹溾攢 鎶ュ伐鏁伴噺 (quantity)                                         鈹�
+鈹�  鈹斺攢 瀹為檯鍏ュ簱鏁伴噺 = 鎶ュ伐鏁伴噺 脳 姣忎欢鏁伴噺                           鈹�
+鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+```
+
+---
+
+## 鍏�佹敞鎰忎簨椤�
+
+1. **鍘嗗彶鏁版嵁鍏煎**锛氬巻鍙叉暟鎹� `singleQuantity` 榛樿涓� 1锛屽叆搴撴暟閲忚绠椾笉鍙楀奖鍝�
+2. **瀛楁浼樺厛绾�**锛�
+   - 涓昏鍒掓墍闇�鏁伴噺 `qtyRequired` 鏀逛负瀛樺偍浜у搧鏁伴噺 `quantity`
+   - 鎬绘暟 `totalQuantity` = quantity 脳 singleQuantity锛堝啑浣欏瓨鍌紝渚夸簬鏌ヨ灞曠ず锛�
+3. **鍗曚綅鏉ユ簮**锛氬崟浣嶄粠 `product_model` 琛ㄥ悓姝ワ紝閿�鍞彴璐﹀瓙琛ㄦ湰韬笉瀛樺偍鍗曚綅
+4. **缂栬緫鍚屾**锛氶攢鍞彴璐︿骇鍝佺紪杈戞椂锛屼細鍒犻櫎鏃х敓浜ц鍒掑苟閲嶆柊鍒涘缓锛堝鏋滄湭涓嬪彂锛�
diff --git a/src/main/java/com/ruoyi/account/bean/dto/purchase/AccountPaymentApplicationDto.java b/src/main/java/com/ruoyi/account/bean/dto/purchase/AccountPaymentApplicationDto.java
index dfe0562..76c907a 100644
--- a/src/main/java/com/ruoyi/account/bean/dto/purchase/AccountPaymentApplicationDto.java
+++ b/src/main/java/com/ruoyi/account/bean/dto/purchase/AccountPaymentApplicationDto.java
@@ -17,9 +17,12 @@
     @Schema(description = "鐢宠鍗曞彿")
     private String invoiceApplicationNo;
 
-    @Schema(description = "瀹℃牳鐘舵��:0寰呭鏍�1瀹℃牳閫氳繃2瀹℃牳涓嶉�氳繃")
+    @Schema(description = "瀹℃牳鐘舵��:0寰呭鏍� 1瀹℃牳閫氳繃 2瀹℃牳涓嶉�氳繃")
     private Integer status;
 
+    @Schema(description = "浠樻鐘舵��:0鏈粯娆� 1閮ㄥ垎浠樻 2宸蹭粯娆�")
+    private Integer paymentStatus;
+
     @Schema(description = "寮�濮嬫棩鏈�")
     @JsonFormat(pattern = "yyyy-MM-dd")
     @DateTimeFormat(pattern = "yyyy-MM-dd")
diff --git a/src/main/java/com/ruoyi/account/bean/vo/purchase/AccountPaymentApplicationVo.java b/src/main/java/com/ruoyi/account/bean/vo/purchase/AccountPaymentApplicationVo.java
index 26cae0e..bb121a8 100644
--- a/src/main/java/com/ruoyi/account/bean/vo/purchase/AccountPaymentApplicationVo.java
+++ b/src/main/java/com/ruoyi/account/bean/vo/purchase/AccountPaymentApplicationVo.java
@@ -6,6 +6,8 @@
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
+import java.math.BigDecimal;
+
 @Data
 @Schema(name = "AccountPaymentApplicationVo", description = "璐㈠姟绠$悊--浠樻鐢宠鍙拌处(杩斿洖)")
 @ExcelIgnoreUnannotated
@@ -19,5 +21,8 @@
     @Excel(name = "鍏ュ簱鍗曞彿")
     private String inboundBatches;
 
+    @Schema(description = "宸蹭粯娆鹃噾棰�")
+    @Excel(name = "宸蹭粯娆鹃噾棰�")
+    private BigDecimal paidAmount;
 
 }
diff --git a/src/main/java/com/ruoyi/account/pojo/purchase/AccountPaymentApplication.java b/src/main/java/com/ruoyi/account/pojo/purchase/AccountPaymentApplication.java
index 9a01df7..6b0c20c 100644
--- a/src/main/java/com/ruoyi/account/pojo/purchase/AccountPaymentApplication.java
+++ b/src/main/java/com/ruoyi/account/pojo/purchase/AccountPaymentApplication.java
@@ -126,13 +126,27 @@
     private String remark;
 
     /**
-     * 瀹℃牳鐘舵��:0寰呭鏍�1瀹℃牳閫氳繃2瀹℃牳涓嶉�氳繃
+     * 瀹℃牳鐘舵��:0寰呭鏍� 1瀹℃牳閫氳繃 2瀹℃牳涓嶉�氳繃
      */
-    @ApiModelProperty("瀹℃牳鐘舵��:0寰呭鏍�1瀹℃牳閫氳繃2瀹℃牳涓嶉�氳繃")
+    @ApiModelProperty("瀹℃牳鐘舵��:0寰呭鏍� 1瀹℃牳閫氳繃 2瀹℃牳涓嶉�氳繃")
     @Excel(name = "瀹℃牳鐘舵��",readConverterExp = "0=寰呭鏍�,1=瀹℃牳閫氳繃,2=瀹℃牳涓嶉�氳繃")
     private Integer status;
 
     /**
+     * 浠樻鐘舵��:0鏈粯娆� 1閮ㄥ垎浠樻 2宸蹭粯娆�
+     */
+    @ApiModelProperty("浠樻鐘舵��:0鏈粯娆� 1閮ㄥ垎浠樻 2宸蹭粯娆�")
+    @Excel(name = "浠樻鐘舵��",readConverterExp = "0=鏈粯娆�,1=閮ㄥ垎浠樻,2=宸蹭粯娆�")
+    private Integer paymentStatus;
+
+    /**
+     * 宸蹭粯娆鹃噾棰�
+     */
+    @ApiModelProperty("宸蹭粯娆鹃噾棰�")
+    @TableField(exist = false)
+    private BigDecimal paidAmount;
+
+    /**
      * 浠樻閲戦
      */
     @ApiModelProperty("浠樻閲戦")
diff --git a/src/main/java/com/ruoyi/account/service/impl/purchase/AccountPurchasePaymentServiceImpl.java b/src/main/java/com/ruoyi/account/service/impl/purchase/AccountPurchasePaymentServiceImpl.java
index b9953a0..7d0740d 100644
--- a/src/main/java/com/ruoyi/account/service/impl/purchase/AccountPurchasePaymentServiceImpl.java
+++ b/src/main/java/com/ruoyi/account/service/impl/purchase/AccountPurchasePaymentServiceImpl.java
@@ -54,14 +54,31 @@
         if (StringUtils.isEmpty(accountPurchasePayment.getPaymentNumber())) {
             accountPurchasePayment.setPaymentNumber(genAccountPurchasePaymentNo());
         }
-        //鏍¢獙绱浠樻閲戦涓嶈兘瓒呰繃鐢宠閲戦
+        //鏍¢獙浠樻鐢宠鏄惁瀛樺湪涓斿鏍搁�氳繃
         AccountPaymentApplication accountPaymentApplication = accountPaymentApplicationMapper.selectById(accountPurchasePayment.getAccountPaymentApplicationId());
-        List<AccountPurchasePayment> accountPurchasePayments = accountPurchasePaymentMapper.selectList(Wrappers.<AccountPurchasePayment>lambdaQuery().eq(AccountPurchasePayment::getAccountPaymentApplicationId, accountPurchasePayment.getAccountPaymentApplicationId()));
-        BigDecimal totalPaymentAmount = accountPurchasePayments.stream().map(AccountPurchasePayment::getPaymentAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
-        if (accountPaymentApplication.getPaymentAmount().compareTo(totalPaymentAmount) < 0) {
+        if (accountPaymentApplication == null) {
+            throw new ServiceException("浠樻鐢宠涓嶅瓨鍦�");
+        }
+        if (accountPaymentApplication.getStatus() == null || accountPaymentApplication.getStatus() != 1) {
+            throw new ServiceException("浠樻鐢宠鏈鏍搁�氳繃锛屼笉鑳戒粯娆�");
+        }
+        //鏍¢獙绱浠樻閲戦涓嶈兘瓒呰繃鐢宠閲戦
+        List<AccountPurchasePayment> accountPurchasePayments = accountPurchasePaymentMapper.selectList(
+                Wrappers.<AccountPurchasePayment>lambdaQuery()
+                        .eq(AccountPurchasePayment::getAccountPaymentApplicationId, accountPurchasePayment.getAccountPaymentApplicationId()));
+        BigDecimal totalPaymentAmount = accountPurchasePayments.stream()
+                .map(AccountPurchasePayment::getPaymentAmount)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+        BigDecimal newTotal = totalPaymentAmount.add(accountPurchasePayment.getPaymentAmount());
+        if (newTotal.compareTo(accountPaymentApplication.getPaymentAmount()) > 0) {
             throw new ServiceException("绱浠樻閲戦涓嶈兘瓒呰繃鐢宠閲戦");
         }
-        return save(accountPurchasePayment);
+        boolean result = save(accountPurchasePayment);
+        // 鏇存柊浠樻鐢宠鐨勪粯娆剧姸鎬�
+        if (result) {
+            updatePaymentStatus(accountPaymentApplication, newTotal);
+        }
+        return result;
     }
 
     @Override
@@ -73,6 +90,9 @@
 
     @Override
     public boolean deleteAccountPurchasePayment(List<Long> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return false;
+        }
         //濡傛灉璇ヤ粯娆惧崟宸茬粡鐢熸垚瀵硅处鍗曞垯鏃犳硶鍒犻櫎
         List<AccountPurchasePayment> accountPurchasePayments = accountPurchasePaymentMapper.selectByIds(ids);
         List<String> strings = accountPurchasePayments.stream().map(AccountPurchasePayment::getPaymentNumber).toList();
@@ -81,7 +101,47 @@
         if (CollectionUtils.isNotEmpty(accountStatementDetails)){
             throw new ServiceException("璇ヤ粯娆惧崟宸茬粡鐢熸垚瀵硅处鍗曪紝鏃犳硶鍒犻櫎");
         }
-        return removeByIds(ids);
+        boolean result = removeByIds(ids);
+        // 鍒犻櫎鎴愬姛鍚庯紝鏇存柊浠樻鐢宠鐨勪粯娆剧姸鎬�
+        if (result) {
+            for (AccountPurchasePayment payment : accountPurchasePayments) {
+                if (payment.getAccountPaymentApplicationId() != null) {
+                    AccountPaymentApplication application = accountPaymentApplicationMapper.selectById(payment.getAccountPaymentApplicationId());
+                    if (application != null) {
+                        // 璁$畻鍓╀綑浠樻閲戦
+                        List<AccountPurchasePayment> remainingPayments = accountPurchasePaymentMapper.selectList(
+                                Wrappers.<AccountPurchasePayment>lambdaQuery()
+                                        .eq(AccountPurchasePayment::getAccountPaymentApplicationId, application.getId()));
+                        BigDecimal remainingAmount = remainingPayments.stream()
+                                .map(AccountPurchasePayment::getPaymentAmount)
+                                .reduce(BigDecimal.ZERO, BigDecimal::add);
+                        updatePaymentStatus(application, remainingAmount);
+                    }
+                }
+            }
+        }
+        return result;
+    }
+
+    /**
+     * 鏇存柊浠樻鐢宠鐨勪粯娆剧姸鎬�
+     * @param application 浠樻鐢宠
+     * @param paidAmount 宸蹭粯娆鹃噾棰�
+     */
+    private void updatePaymentStatus(AccountPaymentApplication application, BigDecimal paidAmount) {
+        BigDecimal applyAmount = application.getPaymentAmount();
+        int newPaymentStatus;
+        if (paidAmount.compareTo(BigDecimal.ZERO) == 0) {
+            newPaymentStatus = 0; // 鏈粯娆�
+        } else if (paidAmount.compareTo(applyAmount) < 0) {
+            newPaymentStatus = 1; // 閮ㄥ垎浠樻
+        } else {
+            newPaymentStatus = 2; // 宸蹭粯娆�
+        }
+        if (application.getPaymentStatus() == null || application.getPaymentStatus() != newPaymentStatus) {
+            application.setPaymentStatus(newPaymentStatus);
+            accountPaymentApplicationMapper.updateById(application);
+        }
     }
 
     private String genAccountPurchasePaymentNo() {
diff --git a/src/main/java/com/ruoyi/production/controller/ProductionOperationTaskController.java b/src/main/java/com/ruoyi/production/controller/ProductionOperationTaskController.java
index 56ed8c2..cb90420 100644
--- a/src/main/java/com/ruoyi/production/controller/ProductionOperationTaskController.java
+++ b/src/main/java/com/ruoyi/production/controller/ProductionOperationTaskController.java
@@ -76,6 +76,14 @@
         productionOperationTaskService.down(response, dto);
     }
 
+    @GetMapping("/byOrder/{orderId}")
+    @Operation(summary = "鏍规嵁鐢熶骇璁㈠崟ID鏌ヨ鍒嗙粍鏁版嵁")
+    public R<List<ProductionOperationTaskVo>> byOrder(@PathVariable Long orderId) {
+        ProductionOperationTaskDto dto = new ProductionOperationTaskDto();
+        dto.setProductionOrderId(orderId);
+        return R.ok(productionOperationTaskService.listProductionOperationTask(dto));
+    }
+
     @GetMapping("/getOperation")
     @Operation(summary = "宸ュ簭璇︽儏鏌ヨ")
     public R<List<ProductionOperationTaskVo>> getOperation(ProductionOperationTaskDto dto) {
diff --git a/src/main/java/com/ruoyi/production/mapper/ProductionOperationTaskMapper.java b/src/main/java/com/ruoyi/production/mapper/ProductionOperationTaskMapper.java
index a09dd6f..dcd4a90 100644
--- a/src/main/java/com/ruoyi/production/mapper/ProductionOperationTaskMapper.java
+++ b/src/main/java/com/ruoyi/production/mapper/ProductionOperationTaskMapper.java
@@ -43,4 +43,6 @@
     ProductionOperationTaskDto getProductWorkOrderFlowCard(@Param("id") Long id);
 
     List<ProductionOperationTaskVo> getOperation(@Param("c") ProductionOperationTaskDto dto);
+
+    List<ProductionOperationTaskVo> listGroupedProductionOperationTask(@Param("c") ProductionOperationTaskDto dto);
 }
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductionPlan.java b/src/main/java/com/ruoyi/production/pojo/ProductionPlan.java
index 86b5f4d..d1975df 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductionPlan.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductionPlan.java
@@ -68,6 +68,18 @@
     @Schema(description = "浜у搧鍨嬪彿id")
     private Long productModelId;
 
+    @Schema(description = "鍗曚綅")
+    private String unit;
+
+    @Schema(description = "浜у搧鏁伴噺")
+    private BigDecimal quantity;
+
+    @Schema(description = "姣忎欢鏁伴噺")
+    private BigDecimal singleQuantity;
+
+    @Schema(description = "鎬绘暟")
+    private BigDecimal totalQuantity;
+
     @Schema(description = "闇�姹傛暟閲�")
     private BigDecimal qtyRequired;
 
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionOperationTaskServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionOperationTaskServiceImpl.java
index bd6f2df..de822d1 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionOperationTaskServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionOperationTaskServiceImpl.java
@@ -71,8 +71,8 @@
 
     @Override
     public List<ProductionOperationTaskVo> listProductionOperationTask(ProductionOperationTaskDto dto) {
-        // 鏌ヨ宸ュ簭浠诲姟鍒楄〃
-        List<ProductionOperationTaskVo> result = BeanUtil.copyToList(this.list(buildQueryWrapper(dto)), ProductionOperationTaskVo.class);
+        // 鎸夌敓浜ц鍗曞垎缁勬煡璇㈠伐搴忎换鍔″垪琛�
+        List<ProductionOperationTaskVo> result = baseMapper.listGroupedProductionOperationTask(dto);
         fillOperationTypes(result);
         fillUserNames(result);
         return result;
diff --git a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
index 6addf3c..4dc8bab 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -4,6 +4,8 @@
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.basic.mapper.ProductModelMapper;
+import com.ruoyi.basic.pojo.ProductModel;
 import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.procurementrecord.utils.StockUtils;
 import com.ruoyi.production.mapper.*;
@@ -86,6 +88,8 @@
     private StockUtils stockUtils;
     @Autowired
     private StockInventoryMapper stockInventoryMapper;
+    @Autowired
+    private ProductModelMapper productModelMapper;
 
     @Override
     public SalesLedgerProduct selectSalesLedgerProductById(Long id) {
@@ -225,12 +229,28 @@
             return;
         }
         SalesLedger salesLedger = salesLedgerMapper.selectById(salesLedgerProduct.getSalesLedgerId());
+        // 鑾峰彇鍗曚綅锛氫紭鍏堜娇鐢ㄥ墠绔紶鍏ョ殑unit锛屽惁鍒欎粠浜у搧瑙勬牸鑾峰彇
+        String unit = salesLedgerProduct.getUnit();
+        if (unit == null || unit.isEmpty()) {
+            ProductModel productModel = productModelMapper.selectById(salesLedgerProduct.getProductModelId());
+            unit = productModel != null ? productModel.getUnit() : null;
+        }
+
         ProductionPlan productionPlan = new ProductionPlan();
         productionPlan.setSalesLedgerId(salesLedgerProduct.getSalesLedgerId());
         productionPlan.setSalesLedgerProductId(salesLedgerProduct.getId());
         productionPlan.setMpsNo(generateNextPlanNo(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"))));
         productionPlan.setProductModelId(salesLedgerProduct.getProductModelId());
-        productionPlan.setQtyRequired(normalizeTotalQuantity(
+        // 闇�姹傛暟閲� = 浜у搧鏁伴噺锛堜笉鏄�绘暟锛�
+        productionPlan.setQtyRequired(salesLedgerProduct.getQuantity());
+        // 鍚屾鍗曚綅
+        productionPlan.setUnit(unit);
+        // 鍚屾浜у搧鏁伴噺
+        productionPlan.setQuantity(salesLedgerProduct.getQuantity());
+        // 鍚屾姣忎欢鏁伴噺
+        productionPlan.setSingleQuantity(normalizeSingleQuantity(salesLedgerProduct.getSingleQuantity()));
+        // 鍚屾鎬绘暟
+        productionPlan.setTotalQuantity(normalizeTotalQuantity(
                 salesLedgerProduct.getTotalQuantity(),
                 salesLedgerProduct.getQuantity(),
                 salesLedgerProduct.getSingleQuantity()
diff --git a/src/main/resources/mapper/account/purchase/AccountPaymentApplicationMapper.xml b/src/main/resources/mapper/account/purchase/AccountPaymentApplicationMapper.xml
index 8f180a4..f7a6936 100644
--- a/src/main/resources/mapper/account/purchase/AccountPaymentApplicationMapper.xml
+++ b/src/main/resources/mapper/account/purchase/AccountPaymentApplicationMapper.xml
@@ -18,6 +18,7 @@
         <result column="apply_date" property="applyDate" />
         <result column="remark" property="remark" />
         <result column="status" property="status" />
+        <result column="payment_status" property="paymentStatus" />
         <result column="payment_amount" property="paymentAmount" />
     </resultMap>
      <select
@@ -25,7 +26,8 @@
          resultType="com.ruoyi.account.bean.vo.purchase.AccountPaymentApplicationVo">
         select * from (select apa.*,
                sm.supplier_name,
-               GROUP_CONCAT(sir.inbound_batches SEPARATOR ',') AS inboundBatches
+               GROUP_CONCAT(sir.inbound_batches SEPARATOR ',') AS inboundBatches,
+               IFNULL((SELECT SUM(app.payment_amount) FROM account_purchase_payment app WHERE app.account_payment_application_id = apa.id), 0) AS paidAmount
         from account_payment_application apa
         left join supplier_manage sm on apa.supplier_id = sm.id
         left join stock_in_record sir on FIND_IN_SET(sir.id, apa.stock_in_record_ids) > 0
@@ -40,6 +42,9 @@
              <if test="req.status != null">
                  AND A.status = #{req.status}
             </if>
+            <if test="req.paymentStatus != null">
+                 AND A.payment_status = #{req.paymentStatus}
+            </if>
             <if test="req.startDate != null and req.endDate != null">
                 AND A.apply_date BETWEEN #{req.startDate} AND #{req.endDate}
             </if>
diff --git a/src/main/resources/mapper/production/ProductionOperationTaskMapper.xml b/src/main/resources/mapper/production/ProductionOperationTaskMapper.xml
index 5ecf0e9..bcaf4f1 100644
--- a/src/main/resources/mapper/production/ProductionOperationTaskMapper.xml
+++ b/src/main/resources/mapper/production/ProductionOperationTaskMapper.xml
@@ -21,21 +21,29 @@
         <result column="dept_id" property="deptId" />
     </resultMap>
 
-    <select id="pageProductionOperationTask" resultType="com.ruoyi.production.bean.vo.ProductionOperationTaskVo">
-        select pot.*,
-               po.nps_no as npsNo,
-               po.is_end_order as endOrder,
-               p.product_name as productName,
-               pm.model as model,
-               pm.unit as unit,
-               poro.operation_name as operationName,
-               poro.type as type,
-               IFNULL(scrapStat.scrapQty, 0) AS scrapQty,
-        ROUND(IFNULL(pot.complete_quantity, 0) / NULLIF(pot.plan_quantity, 0) * 100, 2) AS completionStatus,
-        CASE
-            WHEN pot.work_order_no LIKE 'FG%' THEN '杩斿伐杩斾慨'
-            ELSE '姝e父'
-            END AS work_order_type
+    <sql id="groupedProductionOperationTaskSelect">
+        select po.id                   as productionOrderId,
+               po.nps_no               as npsNo,
+               po.is_end_order         as endOrder,
+               p.product_name          as productName,
+               pm.model                as model,
+               pm.unit                 as unit,
+               group_concat(distinct poro.operation_name order by poro.drag_sort, poro.operation_name separator ',') as operationName,
+               count(distinct pot.id)  as productionTaskCount,
+               sum(ifnull(pot.plan_quantity, 0))     as planQuantity,
+               sum(ifnull(pot.complete_quantity, 0)) as completeQuantity,
+               sum(ifnull(pot.complete_quantity, 0)) as goodQuantity,
+               sum(ifnull(scrapStat.scrapQty, 0))    as scrapQty,
+               round(sum(ifnull(pot.complete_quantity, 0)) / nullif(sum(ifnull(pot.plan_quantity, 0)), 0) * 100, 2) as completionStatus,
+               max(poro.type)          as type,
+               case when sum(case when pot.work_order_no like 'FG%' then 1 else 0 end) > 0
+                   then '杩斿伐杩斾慨' else '姝e父' end as workOrderType,
+               group_concat(distinct pot.work_order_no order by pot.work_order_no separator ',') as workOrderNo,
+               min(pot.plan_start_time)   as planStartTime,
+               max(pot.plan_end_time)     as planEndTime,
+               min(pot.actual_start_time) as actualStartTime,
+               max(pot.actual_end_time)   as actualEndTime,
+               max(pot.status)            as status
         from production_operation_task pot
                  left join production_order po on pot.production_order_id = po.id
                  left join production_order_routing_operation poro on pot.production_order_routing_operation_id = poro.id
@@ -48,30 +56,31 @@
                      left join production_product_output ppo on ppo.production_product_main_id = ppm.id
             group by ppm.production_operation_task_id
         ) scrapStat on scrapStat.taskId = pot.id
+    </sql>
+
+    <sql id="groupedProductionOperationTaskWhere">
         <where>
-            <if test="c != null and c.id != null">
-                and pot.id = #{c.id}
-            </if>
-            <if test="c != null and c.npsNo != null">
+            <if test="c != null and c.npsNo != null and c.npsNo != ''">
                 and po.nps_no like concat('%', #{c.npsNo}, '%')
             </if>
             <if test="c != null and c.productionOrderId != null">
                 and pot.production_order_id = #{c.productionOrderId}
             </if>
-            <if test="c != null and c.productionOrderRoutingOperationId != null">
-                and pot.production_order_routing_operation_id = #{c.productionOrderRoutingOperationId}
-            </if>
-            <if test="c != null and c.status != null">
-                and pot.status = #{c.status}
-            </if>
-            <if test="c != null and c.isProduction != null">
-                and poro.is_production = #{c.isProduction}
-            </if>
-            <if test="c != null and c.workOrderNo != null and c.workOrderNo != ''">
-                and pot.work_order_no like concat('%', #{c.workOrderNo}, '%')
-            </if>
         </where>
-        order by pot.id desc
+    </sql>
+
+    <select id="pageProductionOperationTask" resultType="com.ruoyi.production.bean.vo.ProductionOperationTaskVo">
+        <include refid="groupedProductionOperationTaskSelect"/>
+        <include refid="groupedProductionOperationTaskWhere"/>
+        group by po.id
+        order by po.id desc
+    </select>
+
+    <select id="listGroupedProductionOperationTask" resultType="com.ruoyi.production.bean.vo.ProductionOperationTaskVo">
+        <include refid="groupedProductionOperationTaskSelect"/>
+        <include refid="groupedProductionOperationTaskWhere"/>
+        group by po.id, po.nps_no, po.is_end_order, p.product_name, pm.model, pm.unit
+        order by po.id desc
     </select>
 
     <select id="selectTaskStatisticsByDate" resultType="com.ruoyi.home.dto.ProductionTaskStatisticsDto">

--
Gitblit v1.9.3