33860a93
“wangming”
feat: 新增合同管理系统功能
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
|
# 库存使用审批流程 - 前端调用说明
## 📋 目录
- [业务流程概述](#业务流程概述)
- [接口列表](#接口列表)
- [完整流程示例](#完整流程示例)
- [接口详细说明](#接口详细说明)
- [注意事项](#注意事项)
## 🔄 业务流程概述
库存使用审批流程包含以下步骤:
1. **创建使用记录并提交审批** - 批量创建库存使用记录,同时创建申请记录并提交审批
2. **查询申请记录** - 根据批次ID查询申请记录,查看审批状态
3. **审批申请** - 审批人(财务老师或库管)审批申请(通过/不通过)
4. **标记已领取** - 审批通过后,标记申请已领取
5. **查询批次信息** - 查询批次详细信息,包括使用记录和申请记录
6. **门店领取统计** - 按月份统计每个门店的领取总金额
## 📡 接口列表
| 接口 | 方法 | 路径 | 说明 |
|------|------|------|------|
| 批量创建使用记录 | POST | `/api/Extend/LqInventoryUsage/BatchCreate` | 创建使用记录并提交审批(审批人ID和申请门店ID必填) |
| 查询申请记录 | GET | `/api/Extend/LqInventoryUsage/GetApplicationByBatchId` | 根据批次ID查询申请记录 |
| 审批申请 | POST | `/api/Extend/LqInventoryUsage/Approve/{applicationId}` | 审批申请(通过/不通过) |
| 标记已领取 | PUT | `/api/Extend/LqInventoryUsage/MarkReceived/{applicationId}` | 标记申请已领取 |
| 查询批次信息 | GET | `/api/Extend/LqInventoryUsage/GetBatchInfo` | 查询批次详细信息 |
| 门店领取统计 | POST | `/api/Extend/LqInventoryUsage/GetStoreReceiveStatistics` | 按月份统计门店领取总金额 |
## 🚀 完整流程示例
### 步骤1:创建使用记录并提交审批
**接口:** `POST /api/Extend/LqInventoryUsage/BatchCreate`
**请求示例:**
```javascript
const response = await request({
url: '/api/Extend/LqInventoryUsage/BatchCreate',
method: 'POST',
data: {
approverId: '13110190690', // 审批人ID(财务老师或库管,必填)
applicationStoreId: '1649328471923847168', // 申请门店ID(必填)
remarks: '测试审批流程', // 备注(可选)
usageItems: [
{
productId: '763978766132184325', // 产品ID(必填)
storeId: '1649328471923847168', // 门店ID(必填)
usageTime: '2025-01-09T10:00:00', // 使用时间(必填)
usageQuantity: 10, // 使用数量(必填,必须大于0)
relatedConsumeId: '' // 关联消耗ID(可选)
},
{
productId: '763979169120912645',
storeId: '1649328471923847168',
usageTime: '2025-01-09T10:00:00',
usageQuantity: 20,
relatedConsumeId: ''
}
]
}
});
// 响应示例
// {
// "code": 200,
// "msg": "操作成功",
// "data": {
// "batchId": "768041985045955845", // 批次ID,后续查询需要使用
// "successCount": 2,
// "failCount": 0,
// "successIds": ["768041987361211653", "768041987361211654"],
// "failItems": []
// }
// }
```
**说明:**
- 系统会自动计算单价(从产品表获取)和合计金额(单价×数量)
- 创建使用记录后会自动创建申请记录,状态为"审批中"
- 保存返回的 `batchId`,后续查询需要使用
### 步骤2:查询申请记录(可选)
**接口:** `GET /api/Extend/LqInventoryUsage/GetApplicationByBatchId`
**请求示例:**
```javascript
const response = await request({
url: '/api/Extend/LqInventoryUsage/GetApplicationByBatchId',
method: 'GET',
params: {
batchId: '768041985045955845' // 批次ID
}
});
// 响应示例
// {
// "code": 200,
// "msg": "操作成功",
// "data": {
// "success": true,
// "data": {
// "id": "768041987952608518", // 申请ID
// "usageBatchId": "768041985045955845",
// "applicationUserId": "admin",
// "applicationUserName": "管理员",
// "applicationStoreId": "1649328471923847168",
// "applicationTime": 1765280681000,
// "approvalStatus": "审批中", // 审批状态:待审批/审批中/已通过/未通过
// "isReceived": 0, // 是否已领取:0-未领取,1-已领取
// "receiveTime": null,
// "receiveUser": null,
// "remarks": "测试审批流程",
// "approvalRecords": [] // 审批记录列表
// }
// }
// }
// 注意:如果是旧数据(没有申请记录),返回:
// {
// "code": 200,
// "data": {
// "success": false,
// "message": "该批次没有对应的申请记录",
// "data": null
// }
// }
```
### 步骤3:审批申请
**接口:** `POST /api/Extend/LqInventoryUsage/Approve/{applicationId}`
**请求示例(通过):**
```javascript
const response = await request({
url: '/api/Extend/LqInventoryUsage/Approve/768041987952608518',
method: 'POST',
params: {
result: '通过', // 审批结果:通过/不通过
opinion: '同意申请' // 审批意见(可选)
}
});
// 响应示例
// {
// "code": 200,
// "msg": "操作成功",
// "data": null
// }
```
**请求示例(不通过):**
```javascript
const response = await request({
url: '/api/Extend/LqInventoryUsage/Approve/768041987952608518',
method: 'POST',
params: {
result: '不通过',
opinion: '库存不足,暂不批准'
}
});
```
**说明:**
- 只有状态为"审批中"的申请才能进行审批操作
- 审批通过后,状态变为"已通过"
- 审批不通过后,状态变为"未通过"
### 步骤4:标记已领取(审批通过后)
**接口:** `PUT /api/Extend/LqInventoryUsage/MarkReceived/{applicationId}`
**请求示例:**
```javascript
const response = await request({
url: '/api/Extend/LqInventoryUsage/MarkReceived/768041987952608518',
method: 'PUT'
});
// 响应示例
// {
// "code": 200,
// "msg": "操作成功",
// "data": null
// }
```
**说明:**
- 只有审批状态为"已通过"的申请才能标记为已领取
- 标记后会记录领取时间和领取人
### 步骤5:查询批次信息
**接口:** `GET /api/Extend/LqInventoryUsage/GetBatchInfo`
**请求示例:**
```javascript
const response = await request({
url: '/api/Extend/LqInventoryUsage/GetBatchInfo',
method: 'GET',
params: {
batchId: '768041985045955845' // 批次ID
}
});
// 响应示例
// {
// "code": 200,
// "msg": "操作成功",
// "data": {
// "batchId": "768041985045955845",
// "createTime": 1765280681000,
// "createUser": "admin",
// "createUserName": "管理员",
// "totalCount": 2,
// "effectiveCount": 2,
// "ineffectiveCount": 0,
// "totalUsageQuantity": 30,
// "totalUsageAmount": 220.00, // 总使用金额
// "usageRecords": [
// {
// "id": "768041987361211653",
// "productId": "763978766132184325",
// "productName": "卸妆油",
// "productPrice": 10.00,
// "storeId": "1649328471923847168",
// "storeName": "绿纤总部",
// "usageTime": 1736388000000,
// "usageQuantity": 10,
// "usageTotalValue": 100.00 // 该条记录的总金额
// },
// // ... 更多记录
// ],
// "applicationInfo": { // 申请记录信息(如果是旧数据,此字段为null)
// "id": "768041987952608518",
// "applicationUserId": "admin",
// "applicationUserName": "管理员",
// "applicationStoreId": "1649328471923847168",
// "applicationTime": 1765280681000,
// "approvalStatus": "已通过",
// "isReceived": 1,
// "receiveTime": 1765280756000,
// "receiveUser": "admin",
// "remarks": "测试审批流程"
// }
// }
// }
```
**说明:**
- 兼容旧数据:如果该批次没有申请记录(旧数据),`applicationInfo` 字段为 `null`
- 包含该批次的所有使用记录详情
- 包含申请记录信息(如果有)
### 步骤6:门店领取统计(可选)
**接口:** `POST /api/Extend/LqInventoryUsage/GetStoreReceiveStatistics`
**请求示例:**
```javascript
const response = await request({
url: '/api/Extend/LqInventoryUsage/GetStoreReceiveStatistics',
method: 'POST',
data: {
year: 2025, // 统计年份(必填)
month: 11, // 统计月份(必填,1-12)
storeId: '' // 门店ID(可选,不传则统计所有门店)
}
});
// 响应示例
// {
// "code": 200,
// "msg": "操作成功",
// "data": {
// "success": true,
// "data": [
// {
// "storeId": "1649328471923847168",
// "storeName": "绿纤总部",
// "applicationCount": 5, // 申请数量
// "totalAmount": 1500.00 // 领取总金额
// },
// // ... 更多门店
// ],
// "total": 10,
// "message": "查询成功,共10个门店"
// }
// }
```
**说明:**
- 只统计审批通过且已领取的申请
- 按门店分组统计
- 按总金额降序排列
## 📝 接口详细说明
### 1. 批量创建使用记录
**必填参数:**
- `approverId`: 审批人ID(财务老师或库管)
- `applicationStoreId`: 申请门店ID
- `usageItems`: 使用记录列表(至少一条)
- `productId`: 产品ID
- `storeId`: 门店ID
- `usageTime`: 使用时间
- `usageQuantity`: 使用数量(必须大于0)
**可选参数:**
- `batchId`: 批次ID(不传则自动生成)
- `remarks`: 备注
**自动计算:**
- `unitPrice`: 单价(从产品表获取)
- `totalAmount`: 合计金额(单价×数量)
### 2. 查询申请记录
**参数:**
- `batchId`: 批次ID(必填)
**返回说明:**
- 如果存在申请记录:返回完整的申请信息
- 如果不存在申请记录(旧数据):返回 `success=false`,`data=null`
### 3. 审批申请
**参数:**
- `applicationId`: 申请ID(路径参数)
- `result`: 审批结果(查询参数,必填,值:通过/不通过)
- `opinion`: 审批意见(查询参数,可选)
**状态要求:**
- 只有状态为"审批中"的申请才能进行审批操作
### 4. 标记已领取
**参数:**
- `applicationId`: 申请ID(路径参数)
**状态要求:**
- 只有审批状态为"已通过"的申请才能标记为已领取
### 5. 查询批次信息
**参数:**
- `batchId`: 批次ID(必填)
**兼容性:**
- 兼容旧数据:如果该批次没有申请记录,`applicationInfo` 字段为 `null`
### 6. 门店领取统计
**参数:**
- `year`: 统计年份(必填,范围:2020-2100)
- `month`: 统计月份(必填,范围:1-12)
- `storeId`: 门店ID(可选)
## ⚠️ 注意事项
1. **审批人ID和申请门店ID必填**
- 创建使用记录时,`approverId` 和 `applicationStoreId` 必须传入
- 系统会自动创建申请记录并提交审批
2. **兼容旧数据**
- 查询申请记录时,如果该批次没有申请记录(旧数据),会返回 `success=false`
- 查询批次信息时,如果该批次没有申请记录,`applicationInfo` 字段为 `null`
- 前端需要兼容这两种情况
3. **审批流程**
- 申请创建后,状态为"审批中"
- 只有"审批中"状态的申请才能进行审批操作
- 审批通过后,状态变为"已通过"
- 审批不通过后,状态变为"未通过"
4. **标记已领取**
- 只有"已通过"状态的申请才能标记为已领取
- 标记后会记录领取时间和领取人
5. **单价和合计金额**
- 系统会自动计算单价(从产品表获取)和合计金额(单价×数量)
- 前端无需手动计算
6. **URL编码**
- 审批接口的参数如果包含中文,需要进行URL编码
- 例如:`result=通过` 需要编码为 `result=%E9%80%9A%E8%BF%87`
## 🔍 状态说明
### 审批状态(approvalStatus)
- `待审批`: 申请已创建,等待提交审批
- `审批中`: 申请已提交,等待审批
- `已通过`: 审批通过
- `未通过`: 审批不通过
- `已退回`: 申请被退回
### 领取状态(isReceived)
- `0`: 未领取
- `1`: 已领取
## 📊 数据流程
```
创建使用记录 → 创建申请记录(审批中) → 审批申请 → 标记已领取
↓ ↓ ↓ ↓
批次ID 申请ID 审批记录 领取记录
```
## 🎯 前端页面建议
1. **创建使用记录页面**
- 表单包含:产品选择、门店选择、使用时间、使用数量
- 必须选择审批人(财务老师或库管)
- 必须选择申请门店
- 提交后显示批次ID
2. **申请列表页面**
- 显示所有申请记录
- 显示审批状态、是否已领取
- 支持筛选:审批状态、是否已领取、门店等
3. **审批页面**
- 显示申请详情
- 显示使用记录列表
- 审批操作:通过/不通过,可填写审批意见
4. **批次详情页面**
- 显示批次基本信息
- 显示使用记录列表(包含单价和合计金额)
- 显示申请记录信息(如果有)
- 兼容旧数据(没有申请记录的情况)
5. **统计页面**
- 选择年份和月份
- 显示每个门店的领取统计
- 显示总金额、申请数量等
|