From 1fdbd0faf924697d735a7a1cb3499e5f0e572f22 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期四, 07 五月 2026 16:02:56 +0800
Subject: [PATCH] docs(api): 更新采购多文件分析确认接口传参类型约束文档
---
src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java | 6 -
doc/20260507_采购多文件分析确认接口传参类型约束.md | 166 +++++++++++++++++++++++++++++++++++++++++
src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java | 10 +-
src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java | 5
4 files changed, 175 insertions(+), 12 deletions(-)
diff --git "a/doc/20260507_\351\207\207\350\264\255\345\244\232\346\226\207\344\273\266\345\210\206\346\236\220\347\241\256\350\256\244\346\216\245\345\217\243\344\274\240\345\217\202\347\261\273\345\236\213\347\272\246\346\235\237.md" "b/doc/20260507_\351\207\207\350\264\255\345\244\232\346\226\207\344\273\266\345\210\206\346\236\220\347\241\256\350\256\244\346\216\245\345\217\243\344\274\240\345\217\202\347\261\273\345\236\213\347\272\246\346\235\237.md"
new file mode 100644
index 0000000..69535e7
--- /dev/null
+++ "b/doc/20260507_\351\207\207\350\264\255\345\244\232\346\226\207\344\273\266\345\210\206\346\236\220\347\241\256\350\256\244\346\216\245\345\217\243\344\274\240\345\217\202\347\261\273\345\236\213\347\272\246\346\235\237.md"
@@ -0,0 +1,166 @@
+# 閲囪喘澶氭枃浠跺垎鏋愮‘璁ゆ帴鍙d紶鍙傜被鍨嬬害鏉燂紙`purchase_ledger`锛�
+
+## 1. 閫傜敤鎺ュ彛
+
+- `POST /purchase-ai/analyze-files/confirm`
+- `businessType = purchase_ledger`
+
+> 鏈枃鐢ㄤ簬绾︽潫鍓嶇鎻愪氦鍒扮‘璁ゆ帴鍙g殑 `payload` 绫诲瀷锛岄伩鍏� `Cannot deserialize ...` 杩欑被鍙嶅簭鍒楀寲寮傚父銆�
+
+## 2. 椤跺眰璇锋眰浣�
+
+```json
+{
+ "businessType": "purchase_ledger",
+ "payload": {
+ "purchaseLedgers": []
+ }
+}
+```
+
+## 3. payload 缁撴瀯
+
+鎺ㄨ崘缁熶竴浣跨敤鎵归噺缁撴瀯锛堝嵆浣垮彧鏈� 1 鏉★級锛�
+
+```json
+{
+ "purchaseLedgers": [
+ {
+ "purchaseContractNumber": "CG-2026-001",
+ "supplierId": 10001,
+ "entryDate": "2026-05-07",
+ "type": 2,
+ "approvalStatus": 1,
+ "productData": [
+ {
+ "productCategory": "閽㈡潗",
+ "specificationModel": "Q235-A",
+ "unit": "鍚�",
+ "quantity": 10,
+ "taxInclusiveUnitPrice": 1200,
+ "taxInclusiveTotalPrice": 12000,
+ "taxRate": 13,
+ "type": 2
+ }
+ ]
+ }
+ ]
+}
+```
+
+鍚庣涔熷吋瀹光�滃崟鏉$洿浼犫�濓紙`payload` 鐩存帴鏄竴鏉� `PurchaseLedgerDto`锛夛紝浣嗕笉寤鸿鏂板墠绔户缁娇鐢ㄣ��
+
+## 4. Java 绫诲瀷鍒� JSON 绫诲瀷鏄犲皠瑙勫垯
+
+- `Long` / `Integer`锛氫紶 **number**锛堟暣鏁帮級锛屼笉瑕佷紶 `"pending"`銆乣"1绾�"` 杩欑被瀛楃涓层��
+- `BigDecimal`锛氫紶 **number**锛堝彲灏忔暟锛夛紝涓嶈浼犲甫閫楀彿銆佸崟浣嶇殑瀛楃涓诧紙濡� `"12,000鍏�"`锛夈��
+- `Date`锛氫紶 **string**锛屾牸寮忓浐瀹� `yyyy-MM-dd`銆�
+- `Boolean`锛氫紶 `true/false`锛屼笉瑕佷紶 `"true"`銆乣"鏄�"`銆�
+- `List<T>`锛氫紶鏁扮粍 `[]`銆�
+
+## 5. `PurchaseLedgerDto` 瀛楁绫诲瀷绾︽潫锛堢‘璁ゆ帴鍙e彲璇嗗埆瀛楁锛�
+
+| 瀛楁 | Java 绫诲瀷 | JSON 绫诲瀷 | 璇存槑 |
+| --- | --- | --- | --- |
+| entryDateStart | String | string | 鏌ヨ鍖洪棿寮�濮嬫棩鏈燂紙`yyyy-MM-dd`锛� |
+| entryDateEnd | String | string | 鏌ヨ鍖洪棿缁撴潫鏃ユ湡锛坄yyyy-MM-dd`锛� |
+| id | Long | number(integer) | 鍙拌处ID |
+| purchaseContractNumber | String | string | **蹇呭~**锛堜富涓氬姟鍗曞彿锛� |
+| supplierId | Long | number(integer) | `supplierId` 涓� `supplierName` 浜岄�変竴蹇呭~ |
+| supplierName | String | string | `supplierId` 涓� `supplierName` 浜岄�変竴蹇呭~ |
+| recorderId | Long | number(integer) | 褰曞叆浜篒D |
+| recorderName | String | string | 褰曞叆浜哄悕绉� |
+| salesContractNo | String | string | 閿�鍞悎鍚屽彿 |
+| salesContractNoId | Long | number(integer) | 閿�鍞悎鍚孖D |
+| projectName | String | string | 椤圭洰鍚嶇О |
+| entryDate | Date | string(`yyyy-MM-dd`) | 褰曞叆鏃ユ湡锛涚己鐪佹椂鍚庣浼氳ˉ褰撳ぉ |
+| executionDate | Date | string(`yyyy-MM-dd`) | 绛捐鏃ユ湡 |
+| remarks | String | string | 澶囨敞 |
+| attachmentMaterials | String | string | 闄勪欢璇存槑/璺緞 |
+| createdAt | Date | string(`yyyy-MM-dd`) | 鍒涘缓鏃ユ湡 |
+| updatedAt | Date | string(`yyyy-MM-dd`) | 鏇存柊鏃ユ湡 |
+| salesLedgerId | Long | number(integer) | 閿�鍞彴璐D |
+| hasChildren | Boolean | boolean | 鏄惁鏈夊瓙椤� |
+| Type | Integer | number(integer) | 鍘嗗彶瀛楁锛堜笉鎺ㄨ崘鏂板墠绔娇鐢級 |
+| productData | List<SalesLedgerProduct> | array | 浜у搧鏄庣粏锛岃涓嬭妭 |
+| tempFileIds | List<String> | array[string] | 涓存椂鏂囦欢ID鍒楄〃 |
+| SalesLedgerFiles | List<CommonFile> | array[object] | 鍘嗗彶鍏煎瀛楁 |
+| phoneNumber | String | string | 涓氬姟鍛樻墜鏈哄彿 |
+| businessPersonId | Long | number(integer) | 涓氬姟鍛業D |
+| productId | Long | number(integer) | 浜у搧ID |
+| productModelId | Long | number(integer) | 浜у搧瑙勬牸ID |
+| invoiceNumber | String | string | 鍙戠エ鍙� |
+| invoiceAmount | BigDecimal | number | 鍙戠エ閲戦 |
+| ticketRegistrationId | Long | number(integer) | 鏉ョエ鐧昏ID |
+| contractAmount | BigDecimal | number | 鍚堝悓閲戦 |
+| receiptPaymentAmount | BigDecimal | number | 鏉ョエ閲戦 |
+| unReceiptPaymentAmount | BigDecimal | number | 鏈潵绁ㄩ噾棰� |
+| type | Integer | number(integer) | 鍙拌处绫诲瀷锛岄噰璐浐瀹� `2`锛堢己鐪佹椂鍚庣琛� `2`锛� |
+| paymentMethod | String | string | 浠樻鏂瑰紡 |
+| approvalStatus | Integer | number(integer) | 瀹℃壒鐘舵�侊紝**涓ョ浼犲瓧绗︿覆**锛堝 `"pending"`锛� |
+| templateName | String | string | 妯℃澘鍚嶇О |
+
+### 瀹℃壒鐘舵�佸缓璁�硷紙`approvalStatus`锛�
+
+寤鸿鎸夋暟瀛椾紶鍊硷細
+
+- `1`锛氬緟瀹℃牳
+- `2`锛氬鏍镐腑
+- `3`锛氬鏍搁�氳繃
+- `4`锛氬鏍告嫆缁�/澶辫触
+- `5`锛氭ā鏉挎暟鎹紙鍘嗗彶瀹氫箟锛�
+
+## 6. `productData`锛坄SalesLedgerProduct`锛夊缓璁瓧娈靛強绫诲瀷
+
+| 瀛楁 | Java 绫诲瀷 | JSON 绫诲瀷 | 璇存槑 |
+| --- | --- | --- | --- |
+| productCategory | String | string | **蹇呭~**锛屼骇鍝佸ぇ绫�/鍚嶇О |
+| specificationModel | String | string | **蹇呭~**锛岃鏍煎瀷鍙� |
+| unit | String | string | **蹇呭~**锛屽崟浣� |
+| quantity | BigDecimal | number | **蹇呭~**锛屾暟閲� |
+| taxRate | BigDecimal | number | 绋庣巼锛堝 `13`锛� |
+| taxInclusiveUnitPrice | BigDecimal | number | **蹇呭~**锛屽惈绋庡崟浠� |
+| taxInclusiveTotalPrice | BigDecimal | number | **蹇呭~**锛屽惈绋庢�讳环 |
+| taxExclusiveTotalPrice | BigDecimal | number | 涓嶅惈绋庢�讳环锛堝彲涓嶄紶锛屽悗绔彲鎺ㄥ锛� |
+| invoiceType | String | string | 鍙戠エ绫诲瀷 |
+| productId | Long | number(integer) | 浜у搧ID |
+| productModelId | Long | number(integer) | 浜у搧鍨嬪彿ID |
+| isChecked | Boolean | boolean | 鏄惁璐ㄦ |
+| type | Integer | number(integer) | 閲囪喘浜у搧鍥哄畾 `2`锛堝缓璁紶 `2`锛� |
+
+## 7. 蹇呭~涓庡悗绔粯璁よ涓�
+
+- 鍙拌处涓昏〃蹇呭~锛歚purchaseContractNumber`锛屼互鍙� `supplierId` / `supplierName` 浜岄�変竴銆�
+- 浜у搧鏄庣粏鑻ヤ紶浜� `productData`锛屽垯姣忔潯浜у搧蹇呭~锛歚productCategory`銆乣specificationModel`銆乣unit`銆乣quantity`銆乣taxInclusiveUnitPrice`銆乣taxInclusiveTotalPrice`銆�
+- `entryDate` 涓虹┖鏃讹紝鍚庣琛ュ綋澶╂棩鏈熴��
+- `type` 涓虹┖鏃讹紝鍚庣琛� `2`銆�
+
+## 8. 鍓嶇楂橀閿欒绀轰緥
+
+閿欒锛堜細瑙﹀彂鍙嶅簭鍒楀寲寮傚父锛夛細
+
+```json
+{
+ "approvalStatus": "pending",
+ "type": "閲囪喘",
+ "supplierId": "渚涘簲鍟咥"
+}
+```
+
+姝g‘锛�
+
+```json
+{
+ "approvalStatus": 1,
+ "type": 2,
+ "supplierId": 10001
+}
+```
+
+## 9. 鎻愪氦鍓嶈嚜妫�娓呭崟
+
+1. 鎵�鏈� `Long/Integer/BigDecimal` 瀛楁閮戒负鏁板瓧锛屼笉鏄笟鍔¤瘝瀛楃涓层��
+2. 鎵�鏈夋棩鏈熷瓧娈甸兘鏄� `yyyy-MM-dd`銆�
+3. `approvalStatus` 浠呬紶鏁板瓧鐘舵�佺爜銆�
+4. `supplierId` 涓� `supplierName` 鑷冲皯鏈変竴涓湁鏁堝�笺��
+5. `productData` 涓繀濉垪榻愬叏涓斾负姝g‘绫诲瀷銆�
diff --git a/src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java b/src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java
index 2140949..b27019e 100644
--- a/src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java
+++ b/src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java
@@ -80,11 +80,9 @@
.map(ApproveProcessConfigNodeVo::getApproverId)
.filter(Objects::nonNull)
.collect(Collectors.toList());
- if (list.isEmpty()) {
- throw new RuntimeException("娴佺▼涓嶅瓨鍦�");
- }
+ // 鏃犲鏍镐汉閫昏緫娣诲姞
if (CollectionUtils.isEmpty(nodeIds)) {
- autoPassPurchaseApproveIfNoApprover(approveProcessVO);
+ autoPassPurchaseApproveIfNoApprover(approveProcessVO); // 閲囪喘鍗曟棤瀹℃牳浜洪�昏緫
return;
}
List<SysUser> sysUsers = sysUserMapper.selectUserByIds(nodeIds);
diff --git a/src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java b/src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java
index c6b1406..455dc9b 100644
--- a/src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java
+++ b/src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java
@@ -48,11 +48,11 @@
*/
@Excel(name = "渚涘簲鍟嗗悕绉�")
private String supplierName;
- /**
- * 鏄惁鐧藉悕鍗�
- */
- @Excel(name = "鏄惁鐧藉悕鍗�")
- private Integer isWhite;
+// /**
+// * 鏄惁鐧藉悕鍗�
+// */
+// @Excel(name = "鏄惁鐧藉悕鍗�")
+// private Integer isWhite;
/**
* 褰曞叆浜哄鍚峣d
diff --git a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
index c4a48cd..91fb7b9 100644
--- a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -132,6 +132,8 @@
@Transactional(rollbackFor = Exception.class)
public int addOrEditPurchase(PurchaseLedgerDto purchaseLedgerDto) throws Exception {
PurchaseLedger purchaseLedger = new PurchaseLedger();
+ // DTO杞珽ntity
+ BeanUtils.copyProperties(purchaseLedgerDto, purchaseLedger);
SalesLedger salesLedger = salesLedgerMapper.selectById(purchaseLedgerDto.getSalesLedgerId());
//褰曞叆浜�
SysUser sysUser = userMapper.selectUserById(purchaseLedgerDto.getRecorderId());
@@ -146,9 +148,6 @@
SupplierManage supplierManage = supplierManageMapper.selectById(purchaseLedgerDto.getSupplierId());
- // DTO杞珽ntity
-
- BeanUtils.copyProperties(purchaseLedgerDto, purchaseLedger);
LoginUser loginUser = SecurityUtils.getLoginUser();
if (ObjectUtils.isNotEmpty(loginUser) && null != loginUser.getTenantId()) {
purchaseLedger.setTenantId(loginUser.getTenantId());
--
Gitblit v1.9.3