92 lines
2.5 KiB
Python
92 lines
2.5 KiB
Python
"""合同班结果: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,
|
||
)
|