优化合同编号

This commit is contained in:
27942
2026-02-06 02:26:29 +08:00
parent b3e6235c20
commit 3ad5a16297

View File

@@ -4434,51 +4434,57 @@ def conflict_search(client_info=None, party_info=None, undertaker=None, bidding_
if pf.party_username:
pf_party_names = [pf.party_username.strip()]
# 冲突规则:当前委托人只与历史「委托人」匹配,当前相对方只与历史「相对方」匹配
# 委托人姓名匹配
# 冲突规则:精准匹配。当前委托人只与历史「委托人」匹配,当前相对方只与历史「相对方」匹配
_client_names_set = {cn.strip() for cn in client_names}
_client_ids_set = {c.strip() for c in client_id_numbers}
_party_names_set = {pn.strip() for pn in party_names}
_party_ids_set = {p.strip() for p in party_id_numbers}
# 委托人姓名精准匹配
if client_names and pf_client_names:
for pf_c in pf_client_names:
if any(pf_c in cn for cn in client_names):
if pf_c.strip() in _client_names_set:
is_match = True
match_reason.append(f"委托人姓名匹配:{pf_c}")
break
if not is_match and client_originals:
_originals_set = {co.strip() for co in client_originals}
for pf_c in pf_client_names:
if any(pf_c in co for co in client_originals):
if pf_c.strip() in _originals_set:
is_match = True
match_reason.append(f"委托人信息匹配:{pf_c}")
break
# 委托人身份证号匹配
# 委托人身份证号精准匹配
if client_id_numbers and pf_client_ids:
for pf_cid in pf_client_ids:
if any(cid in pf_cid or pf_cid in cid for cid in client_id_numbers):
if pf_cid.strip() in _client_ids_set:
is_match = True
match_reason.append("委托人身份证号匹配")
break
# 相对方姓名匹配
# 相对方姓名精准匹配
if party_names and pf_party_names:
for pf_p in pf_party_names:
if any(pf_p in pn for pn in party_names):
if pf_p.strip() in _party_names_set:
is_match = True
match_reason.append(f"相对方姓名匹配:{pf_p}")
break
if not any("相对方" in r for r in match_reason) and party_originals:
_party_originals_set = {po.strip() for po in party_originals}
for pf_p in pf_party_names:
if any(pf_p in po for po in party_originals):
if pf_p.strip() in _party_originals_set:
is_match = True
match_reason.append(f"相对方信息匹配:{pf_p}")
break
# 相对方身份证号匹配
# 相对方身份证号精准匹配
if party_id_numbers and pf_party_ids:
for pf_pid in pf_party_ids:
if any(pid in pf_pid or pf_pid in pid for pid in party_id_numbers):
if pf_pid.strip() in _party_ids_set:
is_match = True
match_reason.append("相对方身份证号匹配")
break
# 检查承办人员匹配
# 承办人员精准匹配
if undertaker and pf.Undertaker:
if undertaker in pf.Undertaker or pf.Undertaker in undertaker:
if undertaker.strip() == pf.Undertaker.strip():
is_match = True
match_reason.append(f"承办人员匹配:{pf.Undertaker}")
@@ -4503,47 +4509,52 @@ def conflict_search(client_info=None, party_info=None, undertaker=None, bidding_
project_records = ProjectRegistration.objects.filter(project_q)
project_list = []
_client_names_set = {cn.strip() for cn in client_names}
_client_ids_set = {c.strip() for c in client_id_numbers}
_party_names_set = {pn.strip() for pn in party_names}
_party_ids_set = {p.strip() for p in party_id_numbers}
for pro in project_records[:50]:
is_match = False
match_reason = []
# 冲突规则:当前委托人只与历史「委托人」匹配,当前相对方只与历史「相对方」匹配
# 冲突规则:精准匹配。从立项记录的 client_info/party_info 解析出姓名、身份证号再比对
if (client_names or client_id_numbers) and pro.client_info:
if client_names and any(cn in pro.client_info for cn in client_names):
pro_client_names, pro_client_ids, _ = _extract_all_person_info(pro.client_info)
pro_cn_set = {n.strip() for n in pro_client_names}
pro_cid_set = {i.strip() for i in pro_client_ids}
if client_names and (pro_cn_set & _client_names_set):
is_match = True
match_reason.append("委托人姓名匹配")
elif client_originals and any(co in pro.client_info for co in client_originals):
is_match = True
match_reason.append("委托人信息匹配")
elif client_id_numbers and any(cid in pro.client_info for cid in client_id_numbers):
elif client_id_numbers and (pro_cid_set & _client_ids_set):
is_match = True
match_reason.append("委托人身份证号匹配")
if (party_names or party_id_numbers) and pro.party_info:
if party_names and any(pn in pro.party_info for pn in party_names):
pro_party_names, pro_party_ids, _ = _extract_all_person_info(pro.party_info)
pro_pn_set = {n.strip() for n in pro_party_names}
pro_pid_set = {i.strip() for i in pro_party_ids}
if party_names and (pro_pn_set & _party_names_set):
is_match = True
match_reason.append("相对方姓名匹配")
elif party_originals and any(po in pro.party_info for po in party_originals):
is_match = True
match_reason.append("相对方信息匹配")
elif party_id_numbers and any(pid in pro.party_info for pid in party_id_numbers):
elif party_id_numbers and (pro_pid_set & _party_ids_set):
is_match = True
match_reason.append("相对方身份证号匹配")
# 检查负责人匹配
# 负责人精准匹配(与承办人字段完全一致才算匹配)
if undertaker and pro.responsiblefor:
try:
responsiblefor_data = json.loads(pro.responsiblefor) if isinstance(pro.responsiblefor, str) else pro.responsiblefor
if isinstance(responsiblefor_data, dict):
responsible_person = responsiblefor_data.get('responsible_person', '')
main_lawyer = responsiblefor_data.get('main_lawyer', '')
assistant_lawyer = responsiblefor_data.get('assistant_lawyer', '')
case_manager_lawyer = responsiblefor_data.get('case_manager_lawyer', '')
if undertaker in str(responsible_person) or undertaker in str(main_lawyer) or \
undertaker in str(assistant_lawyer) or undertaker in str(case_manager_lawyer):
responsible_person = (responsiblefor_data.get('responsible_person') or '').strip()
main_lawyer = (responsiblefor_data.get('main_lawyer') or '').strip()
assistant_lawyer = (responsiblefor_data.get('assistant_lawyer') or '').strip()
case_manager_lawyer = (responsiblefor_data.get('case_manager_lawyer') or '').strip()
ut = undertaker.strip()
if ut == responsible_person or ut == main_lawyer or ut == assistant_lawyer or ut == case_manager_lawyer:
is_match = True
match_reason.append("负责人匹配")
except (json.JSONDecodeError, TypeError):
if undertaker in pro.responsiblefor:
if undertaker.strip() == (pro.responsiblefor or '').strip():
is_match = True
match_reason.append("负责人匹配")
@@ -4573,32 +4584,32 @@ def conflict_search(client_info=None, party_info=None, undertaker=None, bidding_
for bid in bid_records[:50]:
is_match = False
match_reason = []
# 检查招标单位匹配
# 招标单位解析出名称、身份证/统一代码,用于精准匹配
bid_names, bid_ids, _ = _extract_all_person_info(bid.BiddingUnit) if bid.BiddingUnit else ([], [], [])
bid_names_set = {n.strip() for n in bid_names}
bid_ids_set = {i.strip() for i in bid_ids}
# 招标单位精准匹配:查询的招标单位与记录中的名称或证件号完全一致
if bidding_unit and bid.BiddingUnit:
if bidding_unit in bid.BiddingUnit or bid.BiddingUnit in bidding_unit:
ut = bidding_unit.strip()
if ut in bid_names_set or ut in bid_ids_set:
is_match = True
match_reason.append("招标单位匹配")
# 检查委托人/相对方是否在招标单位
# 委托人/相对方招标单位精准匹配(姓名或身份证号完全一致)
if (client_names or client_id_numbers) and bid.BiddingUnit:
if client_names and any(cn in bid.BiddingUnit for cn in client_names):
if client_names and (bid_names_set & _client_names_set):
is_match = True
match_reason.append("委托人姓名在招标单位中")
elif client_originals and any(co in bid.BiddingUnit for co in client_originals):
is_match = True
match_reason.append("委托人信息在招标单位中")
elif client_id_numbers and any(cid in bid.BiddingUnit for cid in client_id_numbers):
elif client_id_numbers and (bid_ids_set & _client_ids_set):
is_match = True
match_reason.append("委托人身份证号在招标单位中")
if (party_names or party_id_numbers) and bid.BiddingUnit:
if party_names and any(pn in bid.BiddingUnit for pn in party_names):
if party_names and (bid_names_set & _party_names_set):
is_match = True
match_reason.append("相对方姓名在招标单位中")
elif party_originals and any(po in bid.BiddingUnit for po in party_originals):
is_match = True
match_reason.append("相对方信息在招标单位中")
elif party_id_numbers and any(pid in bid.BiddingUnit for pid in party_id_numbers):
elif party_id_numbers and (bid_ids_set & _party_ids_set):
is_match = True
match_reason.append("相对方身份证号在招标单位中")