"""合同班结果:ContractOutcome → 表 4 行 + 表 3 状态。""" from __future__ import annotations from dataclasses import dataclass from repo import PurchaseContractRow KIND_OK = "ok" KIND_DILIGENCE = "diligence" KIND_FAIL = "fail" STAMP = "合同班" PROCESS_RESULT_MAX = 1000 FAIL_REASON_MAX = 500 @dataclass(frozen=True) class ContractOutcome: kind: str contract_no: str | None reason: str | None @dataclass(frozen=True) class GroupSave: fids: list[int] process_status: int process_result: str table4_rows: list[dict] def clip(text: str, max_len: int) -> str: text = (text or "").strip() if len(text) <= max_len: return text return text[: max_len - 1] + "…" def build_save(rows: list[PurchaseContractRow], outcome: ContractOutcome) -> GroupSave: kind = outcome.kind number = (outcome.contract_no or "").strip() or None if kind == KIND_OK and number: process_status = 1 process_result = "合同已提交" contract_status = 1 fail_reason = None contract_no = number elif kind == KIND_DILIGENCE: process_status = 2 process_result = clip("客户未尽调", PROCESS_RESULT_MAX) contract_status = 3 fail_reason = "客户未尽调" contract_no = None else: reason = outcome.reason or "合同录入失败" if kind == KIND_OK and not number: reason = "submit 模式未读取到真实合同编号" process_status = 2 process_result = clip(reason, PROCESS_RESULT_MAX) contract_status = 3 fail_reason = clip(reason, FAIL_REASON_MAX) contract_no = None seen: dict[int, PurchaseContractRow] = {} for row in rows: seen.setdefault(row.oms_id, row) table4 = [ { "oms_id": row.oms_id, "action_code": 1, "contract_status": contract_status, "contract_fail_reason": fail_reason, "contract_no": contract_no, "agreement_status": None, "agreement_fail_reason": None, "agreement_id": None, "agreement_dtl_id": None, "push_status": 0, "org_code": row.org_code, "create_user_id": 0, "create_user_name": STAMP, "update_user_id": 0, "update_user_name": STAMP, } for row in seen.values() ] return GroupSave( fids=[row.fid for row in rows], process_status=process_status, process_result=process_result, table4_rows=table4, )