diff --git a/business/views.py b/business/views.py index 3ed3b99..e804b0d 100644 --- a/business/views.py +++ b/business/views.py @@ -49,6 +49,110 @@ def get_team_name_from_responsiblefor(responsiblefor): return None +def search_related_records(client_info, party_info, exclude_project_id=None): + """ + 根据委托人和相对方信息检索预立案、投标、立项三个表的相关记录 + + Args: + client_info: 委托人身份信息(字符串) + party_info: 相对方身份信息(字符串) + exclude_project_id: 要排除的立项ID(可选,用于排除当前正在创建的记录) + + Returns: + str: 检索到的相关记录信息,用于添加到待办内容中 + """ + related_info_parts = [] + + if not client_info and not party_info: + return "" + + # 从client_info和party_info中提取姓名/名称(简单提取,假设第一个逗号前的部分或整个字符串) + # 这里使用包含匹配(icontains)来查找 + client_name = client_info.strip() if client_info else "" + party_name = party_info.strip() if party_info else "" + + # 提取可能的姓名(取逗号、空格、换行符前的部分,或整个字符串的前50个字符) + if client_name: + # 尝试提取姓名(去除身份证号、统一社会信用代码等) + client_match = re.match(r'^[^,,\n\r\t\d]{1,50}', client_name) + if client_match: + client_name = client_match.group(0).strip() + + if party_name: + party_match = re.match(r'^[^,,\n\r\t\d]{1,50}', party_name) + if party_match: + party_name = party_match.group(0).strip() + + # 检索预立案表 + if client_name or party_name: + prefiling_records = PreFiling.objects.filter(is_deleted=False) + if client_name: + prefiling_records = prefiling_records.filter( + Q(client_username__icontains=client_name) | + Q(party_username__icontains=client_name) + ) + if party_name: + prefiling_records = prefiling_records.filter( + Q(client_username__icontains=party_name) | + Q(party_username__icontains=party_name) + ) + + 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 ''})") + + # 检索立项表(排除当前正在创建的记录) + if client_info or party_info: + project_records = ProjectRegistration.objects.filter(is_deleted=False) + if exclude_project_id: + project_records = project_records.exclude(id=exclude_project_id) + if client_info: + project_records = project_records.filter( + Q(client_info__icontains=client_info[:50]) | + Q(party_info__icontains=client_info[:50]) + ) + if party_info: + project_records = project_records.filter( + Q(client_info__icontains=party_info[:50]) | + Q(party_info__icontains=party_info[:50]) + ) + + # 获取项目列表(最多10条) + project_list = list(project_records[:10].values('id', 'ContractNo', 'times', 'type')) + 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 ''})") + + # 检索投标表 + if client_name or party_name or client_info or party_info: + bid_records = Bid.objects.filter(is_deleted=False) + search_terms = [] + if client_name: + search_terms.append(client_name) + if party_name: + search_terms.append(party_name) + if client_info and len(client_info) > 0: + search_terms.append(client_info[:50]) + if party_info and len(party_info) > 0: + search_terms.append(party_info[:50]) + + if search_terms: + bid_q = Q() + for term in search_terms[:2]: # 只使用前两个搜索词 + bid_q |= Q(BiddingUnit__icontains=term) | Q(ProjectName__icontains=term) + + if bid_q: + bid_records = bid_records.filter(bid_q) + 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 ''})") + + # 组合返回 + if related_info_parts: + return ";相关记录:" + ";".join(related_info_parts) + + return "" + + def get_change_approvers(): """获取变更审批人(管委会或行政部)""" try: @@ -404,7 +508,10 @@ class Project(APIView): if responsiblefor_dict.get('case_manager_lawyer'): responsible_desc += f",案管律师:{responsiblefor_dict.get('case_manager_lawyer')}" - content = f"{responsiblefor_dict.get('responsible_person')}在{times}办理立项登记,项目类型:{project_type},合同编号:{ContractNo},{responsible_desc},收费情况:{charge}" + # 检索相关记录(预立案、投标、立项) + 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}" approval, approvers_order_json, needs_approval = create_approval_with_team_logic( team_name=team_name,