| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- """采集协议单 — 协议级退费登记 CRUD(不改转账笔 pay_status)"""
- from __future__ import annotations
- from datetime import datetime
- from typing import Any, Dict, List, Optional
- from sqlalchemy.orm import Session
- from app.core.utils import generate_uuid, parse_datetime
- from app.crud.collection_protocol import urls_to_attachment_list
- from app.models.models import BizProtocolRefundRecord
- from app.services.protocol_refund_record import validate_refund_amount
- def _now() -> datetime:
- return datetime.now()
- def _record_to_dict(
- db: Session, r: BizProtocolRefundRecord, tenant_no: str
- ) -> Dict[str, Any]:
- return {
- "id": r.id,
- "collectionProtocolId": r.collection_protocol_id,
- "refundAmount": float(r.refund_amount) if r.refund_amount is not None else None,
- "refundTime": r.refund_time.strftime("%Y-%m-%d %H:%M:%S") if r.refund_time else "",
- "refundRemark": r.refund_remark or "",
- "refundAttachments": r.refund_attachments or "",
- "refundAttachmentFiles": urls_to_attachment_list(
- r.refund_attachments, db, tenant_no
- ),
- "workflowInstanceId": r.workflow_instance_id or "",
- "remark": r.remark or "",
- "createTime": r.create_time.strftime("%Y-%m-%d %H:%M:%S") if r.create_time else "",
- "updateTime": r.update_time.strftime("%Y-%m-%d %H:%M:%S") if r.update_time else "",
- }
- def list_refund_records(
- db: Session, *, collection_protocol_id: str, tenant_no: str
- ) -> List[Dict[str, Any]]:
- rows = (
- db.query(BizProtocolRefundRecord)
- .filter(
- BizProtocolRefundRecord.collection_protocol_id == collection_protocol_id,
- BizProtocolRefundRecord.tenant_no == tenant_no,
- BizProtocolRefundRecord.del_flag == 0,
- )
- .order_by(BizProtocolRefundRecord.create_time.desc())
- .all()
- )
- return [_record_to_dict(db, r, tenant_no) for r in rows]
- def create_refund_record(
- db: Session,
- *,
- collection_protocol_id: str,
- tenant_no: str,
- user_id: Optional[str],
- refund_amount: Any,
- refund_time: Any = None,
- refund_remark: Optional[str] = None,
- refund_attachments: Optional[str] = None,
- workflow_instance_id: Optional[str] = None,
- remark: Optional[str] = None,
- ) -> BizProtocolRefundRecord:
- amt = validate_refund_amount(refund_amount)
- now = _now()
- rt = None
- if refund_time not in (None, ""):
- rt = (
- refund_time
- if isinstance(refund_time, datetime)
- else parse_datetime(str(refund_time))
- )
- obj = BizProtocolRefundRecord(
- id=generate_uuid(),
- collection_protocol_id=collection_protocol_id,
- refund_amount=amt,
- refund_time=rt or now,
- refund_remark=(refund_remark or "").strip() or None,
- refund_attachments=(refund_attachments or "").strip() or None,
- workflow_instance_id=(workflow_instance_id or "").strip() or None,
- tenant_no=tenant_no,
- order_num=0,
- remark=(remark or "").strip() or None,
- create_by=user_id,
- create_dept_id="",
- create_time=now,
- update_by=user_id,
- update_time=now,
- del_flag=0,
- )
- db.add(obj)
- db.commit()
- db.refresh(obj)
- return obj
- def update_refund_record(
- db: Session,
- *,
- record_id: str,
- tenant_no: str,
- user_id: Optional[str],
- refund_amount: Any = None,
- refund_time: Any = None,
- refund_remark: Optional[str] = None,
- refund_attachments: Optional[str] = None,
- workflow_instance_id: Optional[str] = None,
- remark: Optional[str] = None,
- fields_set: Optional[set] = None,
- ) -> BizProtocolRefundRecord:
- obj = (
- db.query(BizProtocolRefundRecord)
- .filter(
- BizProtocolRefundRecord.id == record_id,
- BizProtocolRefundRecord.tenant_no == tenant_no,
- BizProtocolRefundRecord.del_flag == 0,
- )
- .first()
- )
- if not obj:
- raise ValueError("退费登记不存在")
- fs = fields_set or {
- "refund_amount",
- "refund_time",
- "refund_remark",
- "refund_attachments",
- "workflow_instance_id",
- "remark",
- }
- if "refund_amount" in fs and refund_amount is not None:
- obj.refund_amount = validate_refund_amount(refund_amount)
- if "refund_time" in fs:
- if refund_time in (None, ""):
- obj.refund_time = None
- elif isinstance(refund_time, datetime):
- obj.refund_time = refund_time
- else:
- obj.refund_time = parse_datetime(str(refund_time))
- if "refund_remark" in fs:
- obj.refund_remark = (refund_remark or "").strip() or None
- if "refund_attachments" in fs:
- obj.refund_attachments = (refund_attachments or "").strip() or None
- if "workflow_instance_id" in fs:
- obj.workflow_instance_id = (workflow_instance_id or "").strip() or None
- if "remark" in fs:
- obj.remark = (remark or "").strip() or None
- obj.update_by = user_id
- obj.update_time = _now()
- db.add(obj)
- db.commit()
- db.refresh(obj)
- return obj
- def soft_delete_refund_record(
- db: Session,
- *,
- record_id: str,
- tenant_no: str,
- user_id: Optional[str],
- ) -> None:
- obj = (
- db.query(BizProtocolRefundRecord)
- .filter(
- BizProtocolRefundRecord.id == record_id,
- BizProtocolRefundRecord.tenant_no == tenant_no,
- BizProtocolRefundRecord.del_flag == 0,
- )
- .first()
- )
- if not obj:
- raise ValueError("退费登记不存在")
- obj.del_flag = 1
- obj.update_by = user_id
- obj.update_time = _now()
- db.add(obj)
- db.commit()
|