|
@@ -108,6 +108,51 @@ def _get_transfer_or_raise(
|
|
|
return obj
|
|
return obj
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+def _update_transfer_expected_status(
|
|
|
|
|
+ db: Session,
|
|
|
|
|
+ *,
|
|
|
|
|
+ transfer_id: str,
|
|
|
|
|
+ tenant_no: str,
|
|
|
|
|
+ expected_status: str,
|
|
|
|
|
+ values: Dict[Any, Any],
|
|
|
|
|
+ extra_conditions: Tuple[Any, ...] = (),
|
|
|
|
|
+ commit: bool = True,
|
|
|
|
|
+) -> BizPresignTransfer:
|
|
|
|
|
+ """以旧状态作为 CAS 条件更新,并返回事务内刷新后的稳定快照。"""
|
|
|
|
|
+ changed = (
|
|
|
|
|
+ db.query(BizPresignTransfer)
|
|
|
|
|
+ .filter(
|
|
|
|
|
+ BizPresignTransfer.id == transfer_id,
|
|
|
|
|
+ BizPresignTransfer.tenant_no == tenant_no,
|
|
|
|
|
+ BizPresignTransfer.del_flag == 0,
|
|
|
|
|
+ BizPresignTransfer.pay_status == expected_status,
|
|
|
|
|
+ *extra_conditions,
|
|
|
|
|
+ )
|
|
|
|
|
+ .update(values, synchronize_session=False)
|
|
|
|
|
+ )
|
|
|
|
|
+ if changed != 1:
|
|
|
|
|
+ raise ValueError("转账状态已变化,请刷新后重试")
|
|
|
|
|
+ obj = (
|
|
|
|
|
+ db.query(BizPresignTransfer)
|
|
|
|
|
+ .filter(
|
|
|
|
|
+ BizPresignTransfer.id == transfer_id,
|
|
|
|
|
+ BizPresignTransfer.tenant_no == tenant_no,
|
|
|
|
|
+ BizPresignTransfer.del_flag == 0,
|
|
|
|
|
+ )
|
|
|
|
|
+ .populate_existing()
|
|
|
|
|
+ .first()
|
|
|
|
|
+ )
|
|
|
|
|
+ if obj is None:
|
|
|
|
|
+ raise ValueError("意向金转账笔不存在")
|
|
|
|
|
+ db.flush()
|
|
|
|
|
+ if commit:
|
|
|
|
|
+ # 提交会 expire 会话内 ORM 对象;先分离,调用方序列化时只读取
|
|
|
|
|
+ # 本次事务内已刷新的标量快照,不会在提交后重新读取并发新状态。
|
|
|
|
|
+ db.expunge(obj)
|
|
|
|
|
+ db.commit()
|
|
|
|
|
+ return obj
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
def _transfer_to_dict(
|
|
def _transfer_to_dict(
|
|
|
db: Session, t: BizPresignTransfer, tenant_no: str
|
|
db: Session, t: BizPresignTransfer, tenant_no: str
|
|
|
) -> Dict[str, Any]:
|
|
) -> Dict[str, Any]:
|
|
@@ -613,45 +658,62 @@ def update_transfer_draft(
|
|
|
tenant_no: str,
|
|
tenant_no: str,
|
|
|
user_id: Optional[str],
|
|
user_id: Optional[str],
|
|
|
fields: Dict[str, Any],
|
|
fields: Dict[str, Any],
|
|
|
|
|
+ commit: bool = True,
|
|
|
) -> BizPresignTransfer:
|
|
) -> BizPresignTransfer:
|
|
|
t = _get_transfer_or_raise(db, transfer_id=transfer_id, tenant_no=tenant_no)
|
|
t = _get_transfer_or_raise(db, transfer_id=transfer_id, tenant_no=tenant_no)
|
|
|
if t.pay_status != "dfj":
|
|
if t.pay_status != "dfj":
|
|
|
raise ValueError("仅已缴费状态可编辑意向金转账笔")
|
|
raise ValueError("仅已缴费状态可编辑意向金转账笔")
|
|
|
|
|
+ values: Dict[Any, Any] = {
|
|
|
|
|
+ BizPresignTransfer.update_by: user_id,
|
|
|
|
|
+ BizPresignTransfer.update_time: _now(),
|
|
|
|
|
+ }
|
|
|
if "transfer_amount" in fields or "transferAmount" in fields:
|
|
if "transfer_amount" in fields or "transferAmount" in fields:
|
|
|
- t.transfer_amount = _dec(
|
|
|
|
|
|
|
+ values[BizPresignTransfer.transfer_amount] = _dec(
|
|
|
fields.get("transfer_amount", fields.get("transferAmount"))
|
|
fields.get("transfer_amount", fields.get("transferAmount"))
|
|
|
)
|
|
)
|
|
|
if "transfer_time" in fields or "transferTime" in fields:
|
|
if "transfer_time" in fields or "transferTime" in fields:
|
|
|
v = fields.get("transfer_time", fields.get("transferTime"))
|
|
v = fields.get("transfer_time", fields.get("transferTime"))
|
|
|
if v in (None, ""):
|
|
if v in (None, ""):
|
|
|
- t.transfer_time = None
|
|
|
|
|
|
|
+ values[BizPresignTransfer.transfer_time] = None
|
|
|
elif isinstance(v, datetime):
|
|
elif isinstance(v, datetime):
|
|
|
- t.transfer_time = v
|
|
|
|
|
|
|
+ values[BizPresignTransfer.transfer_time] = v
|
|
|
else:
|
|
else:
|
|
|
- t.transfer_time = parse_datetime(str(v))
|
|
|
|
|
|
|
+ parsed = parse_datetime(str(v))
|
|
|
|
|
+ if parsed is None:
|
|
|
|
|
+ raise ValueError("转账时间格式无效")
|
|
|
|
|
+ values[BizPresignTransfer.transfer_time] = parsed
|
|
|
if "transfer_type" in fields or "transferType" in fields:
|
|
if "transfer_type" in fields or "transferType" in fields:
|
|
|
- t.transfer_type = (
|
|
|
|
|
|
|
+ values[BizPresignTransfer.transfer_type] = (
|
|
|
str(fields.get("transfer_type", fields.get("transferType")) or "")
|
|
str(fields.get("transfer_type", fields.get("transferType")) or "")
|
|
|
).strip() or None
|
|
).strip() or None
|
|
|
if "transfer_attachments" in fields or "transferAttachments" in fields:
|
|
if "transfer_attachments" in fields or "transferAttachments" in fields:
|
|
|
- t.transfer_attachments = (
|
|
|
|
|
|
|
+ values[BizPresignTransfer.transfer_attachments] = (
|
|
|
str(
|
|
str(
|
|
|
fields.get("transfer_attachments", fields.get("transferAttachments"))
|
|
fields.get("transfer_attachments", fields.get("transferAttachments"))
|
|
|
or ""
|
|
or ""
|
|
|
)
|
|
)
|
|
|
).strip() or None
|
|
).strip() or None
|
|
|
if "remark" in fields:
|
|
if "remark" in fields:
|
|
|
- t.remark = (fields.get("remark") or "").strip() or None
|
|
|
|
|
- t.update_by = user_id
|
|
|
|
|
- t.update_time = _now()
|
|
|
|
|
- db.add(t)
|
|
|
|
|
- db.commit()
|
|
|
|
|
- db.refresh(t)
|
|
|
|
|
- return t
|
|
|
|
|
|
|
+ values[BizPresignTransfer.remark] = (
|
|
|
|
|
+ fields.get("remark") or ""
|
|
|
|
|
+ ).strip() or None
|
|
|
|
|
+ return _update_transfer_expected_status(
|
|
|
|
|
+ db,
|
|
|
|
|
+ transfer_id=transfer_id,
|
|
|
|
|
+ tenant_no=tenant_no,
|
|
|
|
|
+ expected_status="dfj",
|
|
|
|
|
+ values=values,
|
|
|
|
|
+ commit=commit,
|
|
|
|
|
+ )
|
|
|
|
|
|
|
|
|
|
|
|
|
def submit_receipt_finance(
|
|
def submit_receipt_finance(
|
|
|
- db: Session, *, transfer_id: str, tenant_no: str, user_id: Optional[str]
|
|
|
|
|
|
|
+ db: Session,
|
|
|
|
|
+ *,
|
|
|
|
|
+ transfer_id: str,
|
|
|
|
|
+ tenant_no: str,
|
|
|
|
|
+ user_id: Optional[str],
|
|
|
|
|
+ commit: bool = True,
|
|
|
) -> BizPresignTransfer:
|
|
) -> BizPresignTransfer:
|
|
|
t = _get_transfer_or_raise(db, transfer_id=transfer_id, tenant_no=tenant_no)
|
|
t = _get_transfer_or_raise(db, transfer_id=transfer_id, tenant_no=tenant_no)
|
|
|
if not can_submit_receipt(t.pay_status):
|
|
if not can_submit_receipt(t.pay_status):
|
|
@@ -660,29 +722,50 @@ def submit_receipt_finance(
|
|
|
raise ValueError("请选择转账方式")
|
|
raise ValueError("请选择转账方式")
|
|
|
if t.transfer_amount is None or Decimal(str(t.transfer_amount)) <= 0:
|
|
if t.transfer_amount is None or Decimal(str(t.transfer_amount)) <= 0:
|
|
|
raise ValueError("请填写转账金额")
|
|
raise ValueError("请填写转账金额")
|
|
|
- t.pay_status = "jfqrz"
|
|
|
|
|
- t.update_by = user_id
|
|
|
|
|
- t.update_time = _now()
|
|
|
|
|
- db.add(t)
|
|
|
|
|
- db.commit()
|
|
|
|
|
- db.refresh(t)
|
|
|
|
|
- return t
|
|
|
|
|
|
|
+ return _update_transfer_expected_status(
|
|
|
|
|
+ db,
|
|
|
|
|
+ transfer_id=transfer_id,
|
|
|
|
|
+ tenant_no=tenant_no,
|
|
|
|
|
+ expected_status="dfj",
|
|
|
|
|
+ values={
|
|
|
|
|
+ BizPresignTransfer.pay_status: "jfqrz",
|
|
|
|
|
+ BizPresignTransfer.update_by: user_id,
|
|
|
|
|
+ BizPresignTransfer.update_time: _now(),
|
|
|
|
|
+ },
|
|
|
|
|
+ extra_conditions=(
|
|
|
|
|
+ BizPresignTransfer.transfer_amount.isnot(None),
|
|
|
|
|
+ BizPresignTransfer.transfer_amount > 0,
|
|
|
|
|
+ BizPresignTransfer.transfer_type.isnot(None),
|
|
|
|
|
+ func.length(func.trim(BizPresignTransfer.transfer_type)) > 0,
|
|
|
|
|
+ ),
|
|
|
|
|
+ commit=commit,
|
|
|
|
|
+ )
|
|
|
|
|
|
|
|
|
|
|
|
|
def withdraw_receipt(
|
|
def withdraw_receipt(
|
|
|
- db: Session, *, transfer_id: str, tenant_no: str, user_id: Optional[str]
|
|
|
|
|
|
|
+ db: Session,
|
|
|
|
|
+ *,
|
|
|
|
|
+ transfer_id: str,
|
|
|
|
|
+ tenant_no: str,
|
|
|
|
|
+ user_id: Optional[str],
|
|
|
|
|
+ commit: bool = True,
|
|
|
) -> BizPresignTransfer:
|
|
) -> BizPresignTransfer:
|
|
|
t = _get_transfer_or_raise(db, transfer_id=transfer_id, tenant_no=tenant_no)
|
|
t = _get_transfer_or_raise(db, transfer_id=transfer_id, tenant_no=tenant_no)
|
|
|
if not can_withdraw_receipt(t.pay_status):
|
|
if not can_withdraw_receipt(t.pay_status):
|
|
|
raise ValueError("仅缴费确认中可撤回")
|
|
raise ValueError("仅缴费确认中可撤回")
|
|
|
- t.pay_status = "dfj"
|
|
|
|
|
# 故意不改 finance_remark / finance_confirm_attachments
|
|
# 故意不改 finance_remark / finance_confirm_attachments
|
|
|
- t.update_by = user_id
|
|
|
|
|
- t.update_time = _now()
|
|
|
|
|
- db.add(t)
|
|
|
|
|
- db.commit()
|
|
|
|
|
- db.refresh(t)
|
|
|
|
|
- return t
|
|
|
|
|
|
|
+ return _update_transfer_expected_status(
|
|
|
|
|
+ db,
|
|
|
|
|
+ transfer_id=transfer_id,
|
|
|
|
|
+ tenant_no=tenant_no,
|
|
|
|
|
+ expected_status="jfqrz",
|
|
|
|
|
+ values={
|
|
|
|
|
+ BizPresignTransfer.pay_status: "dfj",
|
|
|
|
|
+ BizPresignTransfer.update_by: user_id,
|
|
|
|
|
+ BizPresignTransfer.update_time: _now(),
|
|
|
|
|
+ },
|
|
|
|
|
+ commit=commit,
|
|
|
|
|
+ )
|
|
|
|
|
|
|
|
|
|
|
|
|
def confirm_receipt(
|
|
def confirm_receipt(
|
|
@@ -693,36 +776,57 @@ def confirm_receipt(
|
|
|
user_id: Optional[str],
|
|
user_id: Optional[str],
|
|
|
finance_confirm_attachments: Optional[str] = None,
|
|
finance_confirm_attachments: Optional[str] = None,
|
|
|
finance_remark: Optional[str] = None,
|
|
finance_remark: Optional[str] = None,
|
|
|
|
|
+ commit: bool = True,
|
|
|
) -> BizPresignTransfer:
|
|
) -> BizPresignTransfer:
|
|
|
t = _get_transfer_or_raise(db, transfer_id=transfer_id, tenant_no=tenant_no)
|
|
t = _get_transfer_or_raise(db, transfer_id=transfer_id, tenant_no=tenant_no)
|
|
|
if not can_confirm_receipt(t.pay_status):
|
|
if not can_confirm_receipt(t.pay_status):
|
|
|
raise ValueError("仅缴费确认中状态可确认收款")
|
|
raise ValueError("仅缴费确认中状态可确认收款")
|
|
|
- t.pay_status = "yjf"
|
|
|
|
|
|
|
+ values: Dict[Any, Any] = {
|
|
|
|
|
+ BizPresignTransfer.pay_status: "yjf",
|
|
|
|
|
+ BizPresignTransfer.update_by: user_id,
|
|
|
|
|
+ BizPresignTransfer.update_time: _now(),
|
|
|
|
|
+ }
|
|
|
if finance_confirm_attachments is not None:
|
|
if finance_confirm_attachments is not None:
|
|
|
- t.finance_confirm_attachments = (finance_confirm_attachments or "").strip() or None
|
|
|
|
|
|
|
+ values[BizPresignTransfer.finance_confirm_attachments] = (
|
|
|
|
|
+ finance_confirm_attachments or ""
|
|
|
|
|
+ ).strip() or None
|
|
|
if finance_remark is not None:
|
|
if finance_remark is not None:
|
|
|
- t.finance_remark = (finance_remark or "").strip() or None
|
|
|
|
|
- t.update_by = user_id
|
|
|
|
|
- t.update_time = _now()
|
|
|
|
|
- db.add(t)
|
|
|
|
|
- db.commit()
|
|
|
|
|
- db.refresh(t)
|
|
|
|
|
- return t
|
|
|
|
|
|
|
+ values[BizPresignTransfer.finance_remark] = (
|
|
|
|
|
+ finance_remark or ""
|
|
|
|
|
+ ).strip() or None
|
|
|
|
|
+ return _update_transfer_expected_status(
|
|
|
|
|
+ db,
|
|
|
|
|
+ transfer_id=transfer_id,
|
|
|
|
|
+ tenant_no=tenant_no,
|
|
|
|
|
+ expected_status="jfqrz",
|
|
|
|
|
+ values=values,
|
|
|
|
|
+ commit=commit,
|
|
|
|
|
+ )
|
|
|
|
|
|
|
|
|
|
|
|
|
def reject_receipt(
|
|
def reject_receipt(
|
|
|
- db: Session, *, transfer_id: str, tenant_no: str, user_id: Optional[str]
|
|
|
|
|
|
|
+ db: Session,
|
|
|
|
|
+ *,
|
|
|
|
|
+ transfer_id: str,
|
|
|
|
|
+ tenant_no: str,
|
|
|
|
|
+ user_id: Optional[str],
|
|
|
|
|
+ commit: bool = True,
|
|
|
) -> BizPresignTransfer:
|
|
) -> BizPresignTransfer:
|
|
|
t = _get_transfer_or_raise(db, transfer_id=transfer_id, tenant_no=tenant_no)
|
|
t = _get_transfer_or_raise(db, transfer_id=transfer_id, tenant_no=tenant_no)
|
|
|
if not can_confirm_receipt(t.pay_status):
|
|
if not can_confirm_receipt(t.pay_status):
|
|
|
raise ValueError("仅缴费确认中状态可退回")
|
|
raise ValueError("仅缴费确认中状态可退回")
|
|
|
- t.pay_status = "dfj"
|
|
|
|
|
- t.update_by = user_id
|
|
|
|
|
- t.update_time = _now()
|
|
|
|
|
- db.add(t)
|
|
|
|
|
- db.commit()
|
|
|
|
|
- db.refresh(t)
|
|
|
|
|
- return t
|
|
|
|
|
|
|
+ return _update_transfer_expected_status(
|
|
|
|
|
+ db,
|
|
|
|
|
+ transfer_id=transfer_id,
|
|
|
|
|
+ tenant_no=tenant_no,
|
|
|
|
|
+ expected_status="jfqrz",
|
|
|
|
|
+ values={
|
|
|
|
|
+ BizPresignTransfer.pay_status: "dfj",
|
|
|
|
|
+ BizPresignTransfer.update_by: user_id,
|
|
|
|
|
+ BizPresignTransfer.update_time: _now(),
|
|
|
|
|
+ },
|
|
|
|
|
+ commit=commit,
|
|
|
|
|
+ )
|
|
|
|
|
|
|
|
|
|
|
|
|
def list_presign_transfers_for_finance(
|
|
def list_presign_transfers_for_finance(
|