diff --git a/business/views.py b/business/views.py index 989a5eb..78c45a8 100644 --- a/business/views.py +++ b/business/views.py @@ -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_username(JSON)中提取第一个人员,转为 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): """ 解析人员信息字符串,支持多种格式: