优化案件模块

This commit is contained in:
27942
2026-01-16 15:09:49 +08:00
parent 3fc2aebe21
commit 47e5e72444
3 changed files with 289 additions and 17 deletions

View File

@@ -1009,6 +1009,37 @@ class roxyExhibition(APIView):
settlement_salary = salary_match.group(1)
itme["settlement_salary"] = settlement_salary
# 如果是立项登记类型,检索冲突信息并添加到返回字段
if info.type == "立项登记":
try:
from business.views import search_related_records
from business.models import ProjectRegistration
project_id = int(info.user_id)
project = ProjectRegistration.objects.filter(id=project_id, is_deleted=False).first()
if project and project.client_info and project.party_info:
# 检索冲突记录
conflict_records = search_related_records(
project.client_info,
project.party_info,
exclude_project_id=project_id
)
# 添加三个冲突字段
itme["prefiling_conflicts"] = conflict_records.get('prefiling_conflicts', [])
itme["project_conflicts"] = conflict_records.get('project_conflicts', [])
itme["bid_conflicts"] = conflict_records.get('bid_conflicts', [])
else:
# 如果没有找到项目或缺少信息,返回空数组
itme["prefiling_conflicts"] = []
itme["project_conflicts"] = []
itme["bid_conflicts"] = []
except (ValueError, TypeError, AttributeError, ImportError):
# 如果解析失败,返回空数组
itme["prefiling_conflicts"] = []
itme["project_conflicts"] = []
itme["bid_conflicts"] = []
data.append(itme)
return Response({'message': '展示成功', "total": total, 'data': data, 'code': 0}, status=status.HTTP_200_OK)

View File

@@ -60,12 +60,21 @@ def search_related_records(client_info, party_info, exclude_project_id=None):
exclude_project_id: 要排除的立项ID可选用于排除当前正在创建的记录
Returns:
str: 检索到的冲突记录信息,用于添加到待办内容中
dict: 包含三个表的冲突记录信息
{
'prefiling_conflicts': [...], # 预立案冲突记录列表
'project_conflicts': [...], # 立项冲突记录列表
'bid_conflicts': [...] # 投标冲突记录列表
}
"""
related_info_parts = []
result = {
'prefiling_conflicts': [],
'project_conflicts': [],
'bid_conflicts': []
}
if not client_info and not party_info:
return ""
return result
# 从client_info和party_info中提取姓名/名称(简单提取,假设第一个逗号前的部分或整个字符串)
# 这里使用包含匹配icontains来查找
@@ -93,8 +102,7 @@ def search_related_records(client_info, party_info, exclude_project_id=None):
)
prefiling_list = list(prefiling_records[:10].values('id', 'times', 'client_username', 'party_username', 'description'))
if prefiling_list:
related_info_parts.append(f"预立案冲突:{len(prefiling_list)}ID{','.join([str(r['id']) for r in prefiling_list[:5]])}{'...' if len(prefiling_list) > 5 else ''}")
result['prefiling_conflicts'] = prefiling_list
# 检索立项表(排除当前正在创建的记录)- 只查找委托人和相对方都匹配的记录(冲突数据)
if client_info and party_info:
@@ -110,8 +118,7 @@ def search_related_records(client_info, party_info, exclude_project_id=None):
# 获取项目列表最多10条
project_list = list(project_records[:10].values('id', 'ContractNo', 'times', 'type', 'client_info', 'party_info'))
if project_list:
related_info_parts.append(f"立项冲突:{len(project_list)}条(合同编号:{','.join([r['ContractNo'] for r in project_list[:3]])}{'...' if len(project_list) > 3 else ''}")
result['project_conflicts'] = project_list
# 检索投标表 - 投标表没有明确的委托人和相对方字段所以如果BiddingUnit同时包含委托人和相对方信息则视为冲突
if client_name and party_name:
@@ -122,8 +129,7 @@ def search_related_records(client_info, party_info, exclude_project_id=None):
)
bid_list = list(bid_records[:10].values('id', 'ProjectName', 'times', 'BiddingUnit'))
if bid_list:
related_info_parts.append(f"投标冲突:{len(bid_list)}条(项目:{','.join([r['ProjectName'][:20] if r['ProjectName'] else '' for r in bid_list[:3]])}{'...' if len(bid_list) > 3 else ''}")
result['bid_conflicts'] = bid_list
elif (client_info or client_name) and (party_info or party_name):
# 如果提供了完整的client_info和party_info也在BiddingUnit中查找
bid_records = Bid.objects.filter(is_deleted=False)
@@ -136,14 +142,9 @@ def search_related_records(client_info, party_info, exclude_project_id=None):
)
bid_list = list(bid_records[:10].values('id', 'ProjectName', 'times', 'BiddingUnit'))
if bid_list:
related_info_parts.append(f"投标冲突:{len(bid_list)}条(项目:{','.join([r['ProjectName'][:20] if r['ProjectName'] else '' for r in bid_list[:3]])}{'...' if len(bid_list) > 3 else ''}")
result['bid_conflicts'] = bid_list
# 组合返回
if related_info_parts:
return ";冲突记录:" + "".join(related_info_parts)
return ""
return result
def get_change_approvers():
@@ -504,7 +505,18 @@ class Project(APIView):
# 检索相关记录(预立案、投标、立项)
related_records_info = search_related_records(client_info, party_info, exclude_project_id=pro.id)
content = f"{responsiblefor_dict.get('responsible_person')}{times}办理立项登记,项目类型:{project_type},合同编号:{ContractNo}{responsible_desc},收费情况:{charge}{related_records_info}"
# 构建冲突信息文本用于content字段保持向后兼容
conflict_parts = []
if related_records_info['prefiling_conflicts']:
conflict_parts.append(f"预立案冲突:{len(related_records_info['prefiling_conflicts'])}ID{','.join([str(r['id']) for r in related_records_info['prefiling_conflicts'][:5]])}{'...' if len(related_records_info['prefiling_conflicts']) > 5 else ''}")
if related_records_info['project_conflicts']:
conflict_parts.append(f"立项冲突:{len(related_records_info['project_conflicts'])}条(合同编号:{','.join([r['ContractNo'] for r in related_records_info['project_conflicts'][:3]])}{'...' if len(related_records_info['project_conflicts']) > 3 else ''}")
if related_records_info['bid_conflicts']:
conflict_parts.append(f"投标冲突:{len(related_records_info['bid_conflicts'])}条(项目:{','.join([r['ProjectName'][:20] if r['ProjectName'] else '' for r in related_records_info['bid_conflicts'][:3]])}{'...' if len(related_records_info['bid_conflicts']) > 3 else ''}")
conflict_text = ";冲突记录:" + "".join(conflict_parts) if conflict_parts else ""
content = f"{responsiblefor_dict.get('responsible_person')}{times}办理立项登记,项目类型:{project_type},合同编号:{ContractNo}{responsible_desc},收费情况:{charge}{conflict_text}"
approval, approvers_order_json, needs_approval = create_approval_with_team_logic(
team_name=team_name,

229
待办接口文档.md Normal file
View File

@@ -0,0 +1,229 @@
# 待办接口文档
## 1. 待办分页查询接口
**接口地址:** `POST /User/roxyexhibition`
**接口描述:** 分页查询当前用户的待办审批记录列表。该接口会根据用户的部门和角色自动筛选出需要当前用户审批或查看的待办事项。支持显示多种类型的审批记录,包括案件管理、立项登记、投标登记、收入确认、付款申请、报销申请、申请用印、入职财务登记、离职财务登记、待办等。
**请求头:**
```
Content-Type: application/json
token: {用户token}
```
**请求参数:**
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| page | Integer | 是 | 页码从1开始 |
| per_page | Integer | 是 | 每页数量 |
**请求示例:**
```json
{
"page": 1,
"per_page": 10
}
```
**响应参数说明:**
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| message | String | 是 | 响应消息,成功时为"展示成功" |
| code | Integer | 是 | 响应代码0表示成功1表示失败 |
| total | Integer | 是 | 符合条件的待办记录总数 |
| data | Array | 是 | 待办记录列表,每个元素包含以下字段 |
**data 数组中每个对象的字段说明:**
| 字段名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| id | Integer | 是 | 审批记录ID |
| title | String | 是 | 审批标题 |
| content | String | 是 | 审批内容详情包含完整的业务信息描述。对于案件管理类型会自动添加委托人姓名和相对方姓名对于立项登记类型如果存在冲突记录会在content中包含冲突信息 |
| times | String | 是 | 提交时间格式YYYY-MM-DD |
| completeTiem | String | 否 | 完成时间格式YYYY-MM-DD。如果审批未完成则为null |
| personincharge | String | 是 | 负责人/审批部门标识。规则纯数字字符串表示部门ID该部门下所有人员都能看到审批非纯数字字符串表示审批员用户名只有该审批员能看到审批"财务"或财务部门ID表示财务部门只有财务部人员能看到 |
| state | String | 是 | 审批状态。可能的值:"审核中"(待审核)、"已抄送财务"(已通过部门审核,等待财务审核)、"已通过"(审批已完成)、"未通过"(审批被拒绝) |
| type | String | 是 | 审批类型。可能的值:案件管理、立案登记、投标登记、收入确认、付款申请、报销申请、申请用印、入职财务登记、离职财务登记、待办、调账申请、工资/奖金变更、案件变更等 |
| settlement_salary | String | 否 | 离职工资仅当type为"离职财务登记"时存在。从content中解析出的结算工资金额如果未填写则为null |
| prefiling_conflicts | Array | 否 | 预立案冲突记录列表仅当type为"立项登记"时存在。包含与当前立项的委托人和相对方都匹配的预立案记录每个元素包含字段id预立案ID、times预立案时间、client_username委托人、party_username相对方、description描述。如果没有冲突则为空数组[] |
| project_conflicts | Array | 否 | 立项冲突记录列表仅当type为"立项登记"时存在。包含与当前立项的委托人和相对方都匹配的其他立项记录每个元素包含字段id立项ID、ContractNo合同编号、times立项日期、type项目类型、client_info委托人信息、party_info相对方信息。如果没有冲突则为空数组[] |
| bid_conflicts | Array | 否 | 投标冲突记录列表仅当type为"立项登记"时存在。包含招标单位同时包含当前立项的委托人和相对方信息的投标记录每个元素包含字段id投标ID、ProjectName项目名称、times申请日期、BiddingUnit招标单位。如果没有冲突则为空数组[] |
**响应示例:**
```json
{
"message": "展示成功",
"total": 25,
"code": 0,
"data": [
{
"id": 1,
"title": "张三立项登记",
"content": "张三在2024-01-15办理立项登记项目类型诉讼代理合同编号HT-2024-100负责人张三主办律师李四收费情况50000元冲突记录预立案冲突2条ID10,15立项冲突1条合同编号HT-2024-001投标冲突1条项目XX项目",
"times": "2024-01-15",
"completeTiem": null,
"personincharge": "王五",
"state": "审核中",
"type": "立项登记",
"prefiling_conflicts": [
{
"id": 10,
"times": "2024-01-10",
"client_username": "张三",
"party_username": "李四",
"description": "合同纠纷预立案"
},
{
"id": 15,
"times": "2024-01-12",
"client_username": "张三",
"party_username": "李四",
"description": "诉讼代理预立案"
}
],
"project_conflicts": [
{
"id": 5,
"ContractNo": "HT-2024-001",
"times": "2024-01-08",
"type": "诉讼代理",
"client_info": "张三身份证号110101199001011234",
"party_info": "李四身份证号110101199002022345"
}
],
"bid_conflicts": [
{
"id": 3,
"ProjectName": "XX公司法律服务项目",
"times": "2024-01-05",
"BiddingUnit": "XX公司统一社会信用代码91110000123456789X张三李四"
}
]
},
{
"id": 2,
"title": "案件管理信息提交(委托人:张三 vs 相对方:李四)",
"content": "2024-01-14提交了一份案件信息合同编号HT-2024-001项目类型诉讼代理 - 委托人:张三,相对方:李四",
"times": "2024-01-14",
"completeTiem": null,
"personincharge": "1",
"state": "审核中",
"type": "案件管理"
},
{
"id": 3,
"title": "李四离职财务登记",
"content": "李四在2024-01-13提交离职财务登记结算工资8000元",
"times": "2024-01-13",
"completeTiem": "2024-01-14",
"personincharge": "财务",
"state": "已通过",
"type": "离职财务登记",
"settlement_salary": "8000"
}
]
}
```
**错误响应:**
```json
{
"status": "error",
"message": "缺少参数",
"code": 1
}
```
**接口说明:**
1. **权限控制**
- 接口会根据当前登录用户的token自动识别用户身份
- 只能查看到分配给当前用户或其所在部门的审批记录
- 财务部门人员可以查看到所有状态为"已抄送财务"的审批记录
2. **自动筛选逻辑**
- 部门匹配如果用户的personincharge字段是纯数字部门ID则显示该部门的所有审批
- 个人匹配如果personincharge字段是用户名则只显示分配给该用户的审批
- 财务匹配:财务部门人员可以看到所有已抄送财务的审批记录
- 多人团队审核时只有当前审核人personincharge等于当前用户名才能看到审核记录
3. **状态筛选**
- 只返回状态为"审核中"或"已抄送财务"的审批记录
- 已完成的审批("已通过"、"未通过")不会在此接口返回
4. **软删除过滤**
- 自动过滤掉关联的业务记录已被软删除的审批记录
- 支持的过滤类型:案件管理、案件变更、投标登记、立项登记、收入确认、调账申请、付款申请、报销申请、工资/奖金变更、申请用印、入职财务登记、离职财务登记、待办等
5. **特殊处理**
- **案件管理类型**会自动在title中添加委托人姓名和相对方姓名格式为"案件管理信息提交委托人XXX vs 相对方XXX"
- **立项登记类型**如果存在冲突记录委托人和相对方都匹配的其他记录会在content中包含冲突信息格式为"冲突记录预立案冲突X条ID...立项冲突Y条合同编号...投标冲突Z条项目..."
- **离职财务登记类型**会从content中解析出结算工资金额单独返回settlement_salary字段
6. **排序规则**
- 按审批记录ID倒序排列最新的在前面
---
## 2. 待办审批处理接口
**接口地址:** `POST /User/approval_processing`
**接口描述:** 处理待办审批记录,支持通过或拒绝审批。
**请求头:**
```
Content-Type: application/json
token: {用户token}
```
**请求参数:**
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| id | Integer | 是 | 审批记录ID |
| state | String | 是 | 审批状态,"已通过"或"未通过" |
| settlement_salary | String | 否 | 离职工资仅当type为"离职财务登记"时需要,可选,审批人可以填写) |
**请求示例:**
```json
{
"id": 1,
"state": "已通过"
}
```
**响应示例:**
```json
{
"message": "处理成功",
"code": 0
}
```
**错误响应:**
```json
{
"status": "error",
"message": "审批记录不存在或已被删除",
"code": 1
}
```
**接口说明:**
1. **审批流程**
- 如果是多人团队审核,按顺序流转,当前审核人通过后自动流转到下一个审核人
- 最后一个审核人通过后,自动抄送财务部门
- 财务部门审核通过后,审批完成
2. **状态更新**
- 审批通过:状态变为"已通过",关联的业务记录状态也会相应更新
- 审批拒绝:状态变为"未通过",审批流程终止
3. **特殊处理**
- 对于"离职财务登记"类型如果提供了settlement_salary参数会自动更新审批记录的content字段添加结算工资信息