优化案件模块
This commit is contained in:
@@ -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)
|
||||
|
||||
|
||||
@@ -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
229
待办接口文档.md
Normal 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条(ID:10,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字段,添加结算工资信息
|
||||
Reference in New Issue
Block a user