优化利益检索

This commit is contained in:
27942
2026-02-06 01:40:03 +08:00
parent 52be5caa7f
commit a1a65b8725

View File

@@ -382,6 +382,21 @@ class registration(APIView):
submit=user
)
# 利益冲突检索:比对预立案、立项、投标三张表
client_info_str = _prefiling_person_to_info(prefiling.client_username)
party_info_str = _prefiling_person_to_info(prefiling.party_username)
conflict_result = conflict_search(
client_info=client_info_str,
party_info=party_info_str,
undertaker=Undertaker,
exclude_prefiling_id=prefiling.id
)
total_conflicts = (
len(conflict_result['prefiling_conflicts'])
+ len(conflict_result['project_conflicts'])
+ len(conflict_result['bid_conflicts'])
)
# 记录操作日志
new_data = {
'id': prefiling.id,
@@ -401,7 +416,19 @@ class registration(APIView):
remark=f'新增预立案登记:委托人 {prefiling.client_username},相对方 {prefiling.party_username}'
)
return Response({'message': '登记成功', 'code': 0}, status=status.HTTP_200_OK)
return Response({
'message': '登记成功',
'code': 0,
'conflict_result': {
'total_conflicts': total_conflicts,
'prefiling_conflicts_count': len(conflict_result['prefiling_conflicts']),
'project_conflicts_count': len(conflict_result['project_conflicts']),
'bid_conflicts_count': len(conflict_result['bid_conflicts']),
'prefiling_conflicts': conflict_result['prefiling_conflicts'],
'project_conflicts': conflict_result['project_conflicts'],
'bid_conflicts': conflict_result['bid_conflicts'],
}
}, status=status.HTTP_200_OK)
class registrationList(APIView):
@@ -516,7 +543,34 @@ class EditRegistration(APIView):
pre.Undertaker = Undertaker
pre.save(update_fields=['Undertaker'])
return Response({'message': '编辑成功', 'code': 0}, status=status.HTTP_200_OK)
# 利益冲突检索:比对预立案、立项、投标三张表
client_info_str = _prefiling_person_to_info(pre.client_username)
party_info_str = _prefiling_person_to_info(pre.party_username)
conflict_result = conflict_search(
client_info=client_info_str,
party_info=party_info_str,
undertaker=pre.Undertaker,
exclude_prefiling_id=pre.id
)
total_conflicts = (
len(conflict_result['prefiling_conflicts'])
+ len(conflict_result['project_conflicts'])
+ len(conflict_result['bid_conflicts'])
)
return Response({
'message': '编辑成功',
'code': 0,
'conflict_result': {
'total_conflicts': total_conflicts,
'prefiling_conflicts_count': len(conflict_result['prefiling_conflicts']),
'project_conflicts_count': len(conflict_result['project_conflicts']),
'bid_conflicts_count': len(conflict_result['bid_conflicts']),
'prefiling_conflicts': conflict_result['prefiling_conflicts'],
'project_conflicts': conflict_result['project_conflicts'],
'bid_conflicts': conflict_result['bid_conflicts'],
}
}, status=status.HTTP_200_OK)
class Project(APIView):
@@ -1065,8 +1119,22 @@ class EditProject(APIView):
from User.utils import create_approval_with_team_logic
team_name = get_team_name_from_responsiblefor(responsiblefor_dict if responsiblefor else original_responsiblefor)
# 利益冲突检索(与创建立项一致)
related_records_info = conflict_search(
client_info=pro.client_info,
party_info=pro.party_info,
exclude_project_id=pro.id
)
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.get('ProjectName') or '')[:20] 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 = current_responsiblefor + "" + (
times or original_times) + "办理立项登记,项目类型:" + original_type + ",合同编号:" + original_ContractNo + "描述:" + ",承办人:" + responsible_desc + ",收费情况:" + (charge or original_charge) + ",申请人:" + applicant_name
times or original_times) + "办理立项登记,项目类型:" + original_type + ",合同编号:" + original_ContractNo + "描述:" + ",承办人:" + responsible_desc + ",收费情况:" + (charge or original_charge) + ",申请人:" + applicant_name + conflict_text
approval, approvers_order_json, needs_approval = create_approval_with_team_logic(
team_name=team_name,
approvers=approvers,
@@ -1351,7 +1419,17 @@ class EditBid(APIView):
team_name = None
from User.utils import create_approval_with_team_logic
applicant_name = edit_user.username if edit_user else ""
content_edit = f"项目名称:{bid.ProjectName},申请日期:{times or bid.times},申请人:{applicant_name}"
# 利益冲突检索(与创建投标一致,按招标单位)
conflict_result = conflict_search(bidding_unit=bid.BiddingUnit, exclude_bid_id=bid.id)
conflict_parts = []
if conflict_result['prefiling_conflicts']:
conflict_parts.append(f"预立案冲突:{len(conflict_result['prefiling_conflicts'])}ID{','.join([str(r['id']) for r in conflict_result['prefiling_conflicts'][:5]])}{'...' if len(conflict_result['prefiling_conflicts']) > 5 else ''}")
if conflict_result['project_conflicts']:
conflict_parts.append(f"立项冲突:{len(conflict_result['project_conflicts'])}条(合同编号:{','.join([r['ContractNo'] for r in conflict_result['project_conflicts'][:3]])}{'...' if len(conflict_result['project_conflicts']) > 3 else ''}")
if conflict_result['bid_conflicts']:
conflict_parts.append(f"投标冲突:{len(conflict_result['bid_conflicts'])}条(项目:{','.join([(r.get('ProjectName') or '')[:20] for r in conflict_result['bid_conflicts'][:3]])}{'...' if len(conflict_result['bid_conflicts']) > 3 else ''}")
conflict_text = ";冲突记录:" + "".join(conflict_parts) if conflict_parts else ""
content_edit = f"项目名称:{bid.ProjectName},申请日期:{times or bid.times},申请人:{applicant_name}{conflict_text}"
approval, approvers_order_json, needs_approval = create_approval_with_team_logic(
team_name=team_name,
approvers=approvers,
@@ -4124,6 +4202,29 @@ class CaseChangeRequestDetail(APIView):
}, status=status.HTTP_200_OK)
def _prefiling_person_to_info(person_json):
"""从预立案的 client_username/party_usernameJSON中提取第一个人员转为 conflict_search 可用的字符串。"""
if not person_json:
return None
try:
data = json.loads(person_json) if isinstance(person_json, str) else person_json
if isinstance(data, list) and len(data) > 0:
item = data[0]
if isinstance(item, dict):
name = (item.get('name') or item.get('name_original') or '').strip()
id_num = (item.get('idNumber') or item.get('id_number') or '').strip()
if name:
return f"{name},身份证:{id_num}" if id_num else name
elif isinstance(data, dict):
name = (data.get('name') or data.get('name_original') or '').strip()
id_num = (data.get('idNumber') or data.get('id_number') or '').strip()
if name:
return f"{name},身份证:{id_num}" if id_num else name
except (json.JSONDecodeError, TypeError, AttributeError):
pass
return None
def parse_person_info(person_str):
"""
解析人员信息字符串,支持多种格式: