diff --git a/User/views.py b/User/views.py index c485d45..a8f736a 100644 --- a/User/views.py +++ b/User/views.py @@ -1409,6 +1409,57 @@ class roxyExhibition(APIView): itme["project_conflicts"] = [] itme["bid_conflicts"] = [] + # 如果是投标登记类型,检索冲突信息并添加到返回字段(与立项相同逻辑) + if info.type == "投标登记": + try: + from business.views import conflict_search + bid_id = int(info.user_id) + bid = Bid.objects.filter(id=bid_id, is_deleted=False).first() + if bid and bid.BiddingUnit: + conflict_result = conflict_search(bidding_unit=bid.BiddingUnit, exclude_bid_id=bid_id) + def parse_json_fields_bid(records): + """将记录中的 JSON 字符串字段解析为列表,与立项展示逻辑一致""" + processed = [] + for record in records: + new_record = dict(record) + if 'client_info' in new_record and new_record['client_info']: + try: + if isinstance(new_record['client_info'], str): + parsed = json.loads(new_record['client_info']) + if isinstance(parsed, list): + new_record['client_info'] = parsed + except (json.JSONDecodeError, TypeError, ValueError): + pass + if 'party_info' in new_record and new_record['party_info']: + try: + if isinstance(new_record['party_info'], str): + parsed = json.loads(new_record['party_info']) + if isinstance(parsed, list): + new_record['party_info'] = parsed + except (json.JSONDecodeError, TypeError, ValueError): + pass + if 'BiddingUnit' in new_record and new_record['BiddingUnit']: + try: + if isinstance(new_record['BiddingUnit'], str): + parsed = json.loads(new_record['BiddingUnit']) + if isinstance(parsed, list): + new_record['BiddingUnit'] = parsed + except (json.JSONDecodeError, TypeError, ValueError): + pass + processed.append(new_record) + return processed + itme["prefiling_conflicts"] = parse_json_fields_bid(conflict_result.get('prefiling_conflicts', [])) + itme["project_conflicts"] = parse_json_fields_bid(conflict_result.get('project_conflicts', [])) + itme["bid_conflicts"] = parse_json_fields_bid(conflict_result.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) diff --git a/business/views.py b/business/views.py index e09954c..146cc2d 100644 --- a/business/views.py +++ b/business/views.py @@ -1116,10 +1116,21 @@ class BidRegistration(APIView): today = datetime.datetime.now() formatted_date = today.strftime("%Y-%m-%d") + # 利益冲突检索(与立项相同逻辑):比对预立案、立项、投标三张表 + conflict_result = conflict_search(bidding_unit=BiddingUnit, exclude_bid_id=bib.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 "" + # 使用统一的审核流程函数 from User.utils import create_approval_with_team_logic - content = f"项目名称:{ProjectName},申请日期:{times}" + content = f"项目名称:{ProjectName},申请日期:{times},招标单位:{BiddingUnit}{conflict_text}" approval, approvers_order_json, needs_approval = create_approval_with_team_logic( team_name=team_name,