优化案件模块

This commit is contained in:
27942
2026-01-20 14:23:44 +08:00
parent 2629303e7f
commit fad9d7b595
3 changed files with 422 additions and 19 deletions

View File

@@ -592,9 +592,10 @@ def process_approval_flow(approval, business_record, current_approver, state,
approval.content = approval.content + ",已抄送财务部"
approval.save(update_fields=['state', 'personincharge', 'content'])
if business_record and hasattr(business_record, 'state'):
business_record.state = "待财务处理"
business_record.save(update_fields=['state'])
if business_record and hasattr(business_record, 'state'):
# 抄送财务时就已经审核通过,财务只是查看
business_record.state = "已通过"
business_record.save(update_fields=['state'])
return False, None
# 有审核人列表(多人团队),按顺序流转
@@ -636,10 +637,11 @@ def process_approval_flow(approval, business_record, current_approver, state,
approval.save(update_fields=['state', 'personincharge', 'content'])
if business_record and hasattr(business_record, 'state'):
business_record.state = "待财务处理"
# 抄送财务时就已经审核通过,财务只是查看
business_record.state = "已通过"
business_record.save(update_fields=['state'])
logger.info(f"process_approval_flow: 已抄送财务部personincharge=%s, state=已抄送财务", approval.personincharge)
logger.info(f"process_approval_flow: 已抄送财务部personincharge=%s, state=已抄送财务,业务记录状态=已通过", approval.personincharge)
return False, None
@@ -756,9 +758,9 @@ def create_approval_with_team_logic(team_name, approvers, title, content, approv
user_id=str(user_id)
)
# 更新业务记录状态
# 更新业务记录状态:抄送财务时就已经审核通过,财务只是查看
if business_record:
business_record.state = "待财务处理"
business_record.state = "已通过"
business_record.save(update_fields=['state'])
return approval, None, False
@@ -837,9 +839,9 @@ def create_approval_with_team_logic(team_name, approvers, title, content, approv
user_id=str(user_id)
)
# 更新业务记录状态
# 更新业务记录状态:抄送财务时就已经审核通过,财务只是查看
if business_record:
business_record.state = "待财务处理"
business_record.state = "已通过"
business_record.save(update_fields=['state'])
return approval, None, False

View File

@@ -1160,16 +1160,17 @@ class approvalProcessing(APIView):
# 检查当前是否已经是财务审核
if is_finance_personincharge(approval.personincharge) and approval.state == "已抄送财务":
# 财务部审核逻辑:财务部只需要一个人审核完即可完成
if state == "已通过":
approval.state = "通过"
income.state = "已通过"
else:
# 财务部只是查看,不需要审核,状态已经是"已通过"
# 如果财务标记为未通过,则更新状态
if state == "通过":
approval.state = "未通过"
income.state = "未通过"
income.save(update_fields=['state'])
approval.save(update_fields=['state'])
return Response({'message': '处理成功', 'code': 0}, status=status.HTTP_200_OK)
income.save(update_fields=['state'])
approval.save(update_fields=['state'])
return Response({'message': '处理成功', 'code': 0}, status=status.HTTP_200_OK)
else:
# 财务查看通过,状态保持"已通过"(已经是"已通过"
return Response({'message': '处理成功', 'code': 0}, status=status.HTTP_200_OK)
# 负责人填写收入分配
allocate = request.data.get('allocate') # 收入分配(负责人必须填写)
@@ -1185,7 +1186,8 @@ class approvalProcessing(APIView):
# 更新收入分配
income.allocate = allocate
income.state = "待财务处理" # 更新状态为待财务处理
# 负责人填写收入分配后,抄送财务时就已经审核通过,财务只是查看
income.state = "已通过"
# 更新审批内容,添加分配信息
if "收入分配:待负责人指定" in approval.content:
@@ -1199,7 +1201,7 @@ class approvalProcessing(APIView):
from User.utils import get_finance_personincharge_value
finance_personincharge = get_finance_personincharge_value()
# 更新审批记录,抄送给财务
# 更新审批记录,抄送给财务(状态已经是"已通过"
approval.personincharge = finance_personincharge
approval.state = "已抄送财务"
approval.content = approval.content + ",已抄送财务部"

399
收入确认接口文档.md Normal file
View File

@@ -0,0 +1,399 @@
# 收入确认接口文档
## 目录
1. [新增收入确认](#1-新增收入确认)
2. [收入确认列表](#2-收入确认列表)
3. [编辑收入确认](#3-编辑收入确认)
4. [删除收入确认](#4-删除收入确认)
5. [获取审核人列表](#5-获取审核人列表)
---
## 1. 新增收入确认
**接口地址:** `POST /finance/confirm`
**接口描述:** 创建收入确认记录支持通过案件ID或合同号关联案件自动同步案件信息并创建审核待办。
### 请求参数
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| token | String | 是 | 用户认证token请求头 |
| times | String | 是 | 收款日期格式YYYY-MM-DD |
| amount | String | 是 | 收款金额 |
| case_id | Integer | 否 | 案件管理IDCase表与project_id、ContractNo三选一 |
| project_id | Integer | 否 | 立项登记IDProjectRegistration表与case_id、ContractNo三选一 |
| ContractNo | String | 否 | 合同号与case_id、project_id三选一 |
| CustomerID | String | 否 | 客户名称如果通过案件ID或合同号找到案件则自动同步 |
| allocate | String | 否 | 收入分配(财务提交时不填写,由负责人填写,默认:"待负责人指定" |
| approvers | Array/String | 否 | 审核人列表(多人团队时需要)<br/>- 推荐格式用户ID数组`[1, 2, 3]``["1", "2", "3"]`<br/>- 兼容格式:用户名数组,如 `["张三", "李四"]`<br/>- 字符串格式:逗号分隔,如 `"1,2,3"``"张三,李四"` |
| personincharge | String | 否 | 兼容旧接口会自动转换为approvers |
### 请求示例
```json
{
"case_id": 123,
"times": "2024-01-15",
"amount": "10000",
"allocate": "待负责人指定"
}
```
```json
{
"project_id": 456,
"times": "2024-01-15",
"amount": "10000"
}
```
```json
{
"ContractNo": "HT2024001",
"times": "2024-01-15",
"amount": "10000",
"approvers": [1, 2, 3]
}
```
### 返回数据
**成功响应:**
```json
{
"message": "提交成功",
"code": 0,
"data": {
"id": 1,
"ContractNo": "HT2024001",
"CustomerID": "某某公司",
"responsible_person": "张三",
"state": "审核中",
"approval_id": 10,
"needs_approval": true
}
}
```
**失败响应:**
```json
{
"status": "error",
"message": "缺少必填参数: times(收款日期), amount(收款金额)",
"code": 1
}
```
### 字段说明
- **case_id / project_id / ContractNo**三选一优先级case_id > project_id > ContractNo
- **自动同步字段**如果通过案件ID或合同号找到案件会自动同步
- `ContractNo`:合同号
- `CustomerID`:客户名称
- `responsible_person`:负责人信息
- **审核流程**
- 个人团队:直接抄送财务,状态为"已通过"(财务只是查看)
- 团队类型:需要审核人审核,状态为"审核中"
- 如果传入了`approvers`,使用传入的审核人
- 如果没有传入,使用团队配置的审核人
- **重要**:抄送财务时状态已经是"已通过",财务只是查看,不需要再次审核
---
## 2. 收入确认列表
**接口地址:** `POST /finance/confirmdisplay`
**接口描述:** 分页查询收入确认列表,支持按时间范围、客户名称筛选。权限控制:律师只能看自己的数据,管委会和财务部能查看所有。
### 请求参数
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| token | String | 是 | 用户认证token请求头 |
| page | Integer | 是 | 页码从1开始 |
| per_page | Integer | 是 | 每页数量 |
| times | String | 否 | 开始日期格式YYYY-MM-DD |
| end_time | String | 否 | 结束日期格式YYYY-MM-DD |
| CustomerID | String | 否 | 客户名称(模糊搜索) |
### 请求示例
```json
{
"page": 1,
"per_page": 10,
"times": "2024-01-01",
"end_time": "2024-01-31",
"CustomerID": "某某公司"
}
```
### 返回数据
**成功响应:**
```json
{
"message": "展示成功",
"total": 50,
"code": 0,
"data": [
{
"id": 1,
"times": "2024-01-15",
"ContractNo": "HT2024001",
"CustomerID": "某某公司",
"amount": "10000",
"allocate": "待负责人指定",
"state": "审核中",
"submit": "张三",
"submit_tiem": "2024-01-15"
}
]
}
```
### 字段说明
- **权限控制**
- 管委会角色、财务部角色、财务部部门:可以查看所有数据
- 其他用户:只能查看自己提交的数据(`submit`字段等于当前用户名)
- **state状态值**
- `"审核中"`:正在审核中
- `"待负责人填写分配"`:待负责人填写收入分配
- `"已通过"`:审核通过(抄送财务时就已经是"已通过",财务只是查看)
- `"未通过"`:审核未通过
---
## 3. 编辑收入确认
**接口地址:** `POST /finance/editIncome`
**接口描述:** 编辑收入确认记录,只能修改部分字段。
### 请求参数
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| token | String | 是 | 用户认证token请求头 |
| id | Integer | 是 | 收入确认记录ID |
| times | String | 否 | 收款日期格式YYYY-MM-DD |
| ContractNo | String | 否 | 合同号 |
| CustomerID | String | 否 | 客户名称 |
| amount | String | 否 | 收款金额 |
| allocate | String | 否 | 收入分配 |
### 请求示例
```json
{
"id": 1,
"times": "2024-01-20",
"amount": "15000",
"allocate": "50%分配给A50%分配给B"
}
```
### 返回数据
**成功响应:**
```json
{
"message": "编辑成功",
"code": 0
}
```
**失败响应:**
```json
{
"status": "error",
"message": "缺少参数id",
"code": 1
}
```
---
## 4. 删除收入确认
**接口地址:** `POST /finance/deleteIncome`
**接口描述:** 软删除收入确认记录。
### 请求参数
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| token | String | 是 | 用户认证token请求头 |
| id | Integer | 是 | 收入确认记录ID |
### 请求示例
```json
{
"id": 1
}
```
### 返回数据
**成功响应:**
```json
{
"message": "删除成功",
"code": 0
}
```
**失败响应:**
```json
{
"status": "error",
"message": "收入确认不存在",
"code": 1
}
```
---
## 5. 获取审核人列表
**接口地址:** `POST /finance/approvers-list-for-income-confirm`
**接口描述:** 获取收入确认时可选的审核人列表,返回所有未删除的用户列表,格式简洁,适合下拉选择。
### 请求参数
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| token | String | 是 | 用户认证token请求头 |
| username | String | 否 | 用户名搜索(模糊匹配) |
### 请求示例
```json
{
"username": "张"
}
```
### 返回数据
**成功响应:**
```json
{
"message": "获取审核人列表成功",
"code": 0,
"total": 20,
"data": [
{
"id": 1,
"username": "张三",
"account": "zhangsan",
"position": "律师"
},
{
"id": 2,
"username": "李四",
"account": "lisi",
"position": "律师"
}
]
}
```
### 字段说明
- 自动排除admin用户超级管理员
- 按用户名排序
- 支持用户名模糊搜索
---
## 数据模型
### Income 模型字段
| 字段名 | 类型 | 说明 |
|--------|------|------|
| id | Integer | 主键ID |
| times | String | 收款日期 |
| ContractNo | String | 合同号 |
| CustomerID | String | 客户名称 |
| amount | String | 收款金额 |
| allocate | String | 收入分配 |
| submit | String | 提交人用户名 |
| submit_tiem | String | 提交时间 |
| state | String | 状态(审核中/待财务处理/待负责人填写分配/已通过/未通过) |
| approvers_order | Text | 审核人顺序JSON格式`["张三","李四","王五"]` |
| is_deleted | Boolean | 软删除标记 |
---
## 审核流程说明
### 审核状态流转
1. **提交阶段**
- 个人团队:状态为`"已通过"`,直接抄送财务(财务只是查看)
- 团队类型:状态为`"审核中"`,创建待办事项
2. **审核阶段**
- 审核人依次审核(按`approvers_order`顺序)
- 如果审核未通过,状态变为`"未通过"`
- 如果所有审核人通过,状态变为`"待负责人填写分配"`
3. **负责人填写分配**
- 负责人填写`allocate`字段(收入分配)
- 状态变为`"已通过"`,抄送财务(财务只是查看,不需要再次审核)
4. **财务查看**
- 抄送财务时状态已经是`"已通过"`,财务只是查看
- 如果财务发现问题,可以标记为`"未通过"`,状态变为`"未通过"`
### 金额统计规则
- 在案件分页接口中,收入确认金额只统计`state="已通过"`的记录
- 只有审核通过的收入确认才会计入案件的收入确认金额统计
---
## 错误码说明
| 错误码 | 说明 |
|--------|------|
| 0 | 成功 |
| 1 | 失败具体错误信息在message字段中 |
---
## 注意事项
1. **案件关联**
- 优先使用`case_id`案件管理ID
- 其次使用`project_id`立项登记ID
- 最后使用`ContractNo`(合同号)
- 如果通过案件ID或合同号找到案件会自动同步合同号、客户名称、负责人信息
2. **审核人参数**
- 推荐使用用户ID数组格式`[1, 2, 3]`
- 兼容用户名数组格式:`["张三", "李四"]`
- 如果未传入审核人且团队类型为团队,会使用团队配置的审核人
3. **权限控制**
- 收入确认列表接口有权限控制
- 管委会、财务部可以查看所有数据
- 其他用户只能查看自己提交的数据
4. **软删除**
- 删除操作是软删除,只更新`is_deleted`字段
- 已删除的记录不会在列表中显示
- 已删除的记录不会计入金额统计