ord_settlement.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. """客户/供应商结算单 CRUD(含 UPDATE 写历史表)"""
  2. from __future__ import annotations
  3. from datetime import datetime
  4. from typing import Any, Dict, List, Optional, Tuple
  5. from sqlalchemy.orm import Session
  6. from app.crud.base import CRUDBase
  7. from app.models.models import (
  8. BizOrder,
  9. OrdClientSettlement,
  10. OrdClientSettlementHis,
  11. OrdClientSettlementItem,
  12. OrdClientSettlementItemHis,
  13. OrdSupplierSettlement,
  14. OrdSupplierSettlementHis,
  15. OrdSupplierSettlementItem,
  16. OrdSupplierSettlementItemHis,
  17. )
  18. class OrdClientSettlementCRUD(CRUDBase[OrdClientSettlement]):
  19. def _snapshot_main(self, row: OrdClientSettlement) -> Dict[str, Any]:
  20. return {
  21. "id": row.id,
  22. "settlement_no": row.settlement_no,
  23. "client_id": row.client_id,
  24. "client_name": row.client_name,
  25. "order_count": row.order_count,
  26. "total_amount": row.total_amount,
  27. "voucher_urls": row.voucher_urls,
  28. "remark": row.remark,
  29. "settlement_at": row.settlement_at,
  30. "status": row.status,
  31. "create_at": row.create_at,
  32. "create_by": row.create_by,
  33. "create_name": row.create_name,
  34. "update_at": row.update_at,
  35. "update_by": row.update_by,
  36. }
  37. def get_multi_with_filters(
  38. self,
  39. db: Session,
  40. *,
  41. client_id: Optional[str] = None,
  42. settlement_no: Optional[str] = None,
  43. start_date: Optional[datetime] = None,
  44. end_date: Optional[datetime] = None,
  45. region_id: Optional[str] = None,
  46. skip: int = 0,
  47. limit: int = 10,
  48. ) -> Tuple[List[OrdClientSettlement], int]:
  49. q = db.query(OrdClientSettlement).filter(OrdClientSettlement.is_del == 0)
  50. if client_id:
  51. q = q.filter(OrdClientSettlement.client_id == client_id)
  52. if settlement_no:
  53. q = q.filter(OrdClientSettlement.settlement_no.like(f"%{settlement_no}%"))
  54. if start_date:
  55. q = q.filter(OrdClientSettlement.settlement_at >= start_date)
  56. if end_date:
  57. q = q.filter(OrdClientSettlement.settlement_at <= end_date)
  58. if region_id:
  59. sub = (
  60. db.query(OrdClientSettlementItem.settlement_id)
  61. .join(BizOrder, BizOrder.id == OrdClientSettlementItem.order_id)
  62. .filter(
  63. OrdClientSettlementItem.is_del == 0,
  64. BizOrder.is_del == 0,
  65. BizOrder.region_id == region_id,
  66. )
  67. .distinct()
  68. )
  69. q = q.filter(OrdClientSettlement.id.in_(sub))
  70. total = q.count()
  71. rows = q.order_by(OrdClientSettlement.settlement_at.desc()).offset(skip).limit(limit).all()
  72. return rows, total
  73. def get_with_items(
  74. self, db: Session, settlement_id: str
  75. ) -> Tuple[Optional[OrdClientSettlement], List[OrdClientSettlementItem]]:
  76. main = self.get(db, settlement_id)
  77. if not main or main.is_del == 1:
  78. return None, []
  79. items = (
  80. db.query(OrdClientSettlementItem)
  81. .filter(
  82. OrdClientSettlementItem.settlement_id == settlement_id,
  83. OrdClientSettlementItem.is_del == 0,
  84. )
  85. .order_by(OrdClientSettlementItem.create_at.asc())
  86. .all()
  87. )
  88. return main, items
  89. def belongs_to_region(self, db: Session, settlement_id: str, region_id: str) -> bool:
  90. if not region_id:
  91. return True
  92. return (
  93. db.query(OrdClientSettlementItem.id)
  94. .join(BizOrder, BizOrder.id == OrdClientSettlementItem.order_id)
  95. .filter(
  96. OrdClientSettlementItem.settlement_id == settlement_id,
  97. OrdClientSettlementItem.is_del == 0,
  98. BizOrder.is_del == 0,
  99. BizOrder.region_id == region_id,
  100. )
  101. .first()
  102. is not None
  103. )
  104. def update_with_history(
  105. self,
  106. db: Session,
  107. settlement_id: str,
  108. obj_in: dict,
  109. updater: Optional[dict] = None,
  110. ) -> Optional[OrdClientSettlement]:
  111. original = self.get(db, settlement_id)
  112. if not original or original.is_del == 1:
  113. return None
  114. his = OrdClientSettlementHis(**self._snapshot_main(original))
  115. db.add(his)
  116. return self.update(db, settlement_id, obj_in, updater)
  117. class OrdClientSettlementItemCRUD(CRUDBase[OrdClientSettlementItem]):
  118. def _snapshot_item(self, row: OrdClientSettlementItem) -> Dict[str, Any]:
  119. return {
  120. "id": row.id,
  121. "settlement_id": row.settlement_id,
  122. "order_id": row.order_id,
  123. "order_no": row.order_no,
  124. "client_id": row.client_id,
  125. "order_amount": row.order_amount,
  126. "create_at": row.create_at,
  127. "create_by": row.create_by,
  128. "create_name": row.create_name,
  129. "update_at": row.update_at,
  130. "update_by": row.update_by,
  131. }
  132. def update_with_history(
  133. self,
  134. db: Session,
  135. item_id: str,
  136. obj_in: dict,
  137. updater: Optional[dict] = None,
  138. ) -> Optional[OrdClientSettlementItem]:
  139. original = self.get(db, item_id)
  140. if not original or original.is_del == 1:
  141. return None
  142. his = OrdClientSettlementItemHis(**self._snapshot_item(original))
  143. db.add(his)
  144. return self.update(db, item_id, obj_in, updater)
  145. def soft_delete_with_history(self, db: Session, item_id: str, updater: Optional[dict] = None) -> bool:
  146. original = self.get(db, item_id)
  147. if not original or original.is_del == 1:
  148. return False
  149. his = OrdClientSettlementItemHis(**self._snapshot_item(original))
  150. db.add(his)
  151. return self.update(db, item_id, {"is_del": 1}, updater) is not None
  152. class OrdSupplierSettlementCRUD(CRUDBase[OrdSupplierSettlement]):
  153. def _snapshot_main(self, row: OrdSupplierSettlement) -> Dict[str, Any]:
  154. return {
  155. "id": row.id,
  156. "settlement_no": row.settlement_no,
  157. "supplier_id": row.supplier_id,
  158. "supplier_name": row.supplier_name,
  159. "order_count": row.order_count,
  160. "total_amount": row.total_amount,
  161. "voucher_urls": row.voucher_urls,
  162. "remark": row.remark,
  163. "settlement_at": row.settlement_at,
  164. "status": row.status,
  165. "create_at": row.create_at,
  166. "create_by": row.create_by,
  167. "create_name": row.create_name,
  168. "update_at": row.update_at,
  169. "update_by": row.update_by,
  170. }
  171. def get_multi_with_filters(
  172. self,
  173. db: Session,
  174. *,
  175. supplier_id: Optional[str] = None,
  176. settlement_no: Optional[str] = None,
  177. start_date: Optional[datetime] = None,
  178. end_date: Optional[datetime] = None,
  179. region_id: Optional[str] = None,
  180. skip: int = 0,
  181. limit: int = 10,
  182. ) -> Tuple[List[OrdSupplierSettlement], int]:
  183. q = db.query(OrdSupplierSettlement).filter(OrdSupplierSettlement.is_del == 0)
  184. if supplier_id:
  185. q = q.filter(OrdSupplierSettlement.supplier_id == supplier_id)
  186. if settlement_no:
  187. q = q.filter(OrdSupplierSettlement.settlement_no.like(f"%{settlement_no}%"))
  188. if start_date:
  189. q = q.filter(OrdSupplierSettlement.settlement_at >= start_date)
  190. if end_date:
  191. q = q.filter(OrdSupplierSettlement.settlement_at <= end_date)
  192. if region_id:
  193. sub = (
  194. db.query(OrdSupplierSettlementItem.settlement_id)
  195. .join(BizOrder, BizOrder.id == OrdSupplierSettlementItem.order_id)
  196. .filter(
  197. OrdSupplierSettlementItem.is_del == 0,
  198. BizOrder.is_del == 0,
  199. BizOrder.region_id == region_id,
  200. )
  201. .distinct()
  202. )
  203. q = q.filter(OrdSupplierSettlement.id.in_(sub))
  204. total = q.count()
  205. rows = q.order_by(OrdSupplierSettlement.settlement_at.desc()).offset(skip).limit(limit).all()
  206. return rows, total
  207. def get_with_items(
  208. self, db: Session, settlement_id: str
  209. ) -> Tuple[Optional[OrdSupplierSettlement], List[OrdSupplierSettlementItem]]:
  210. main = self.get(db, settlement_id)
  211. if not main or main.is_del == 1:
  212. return None, []
  213. items = (
  214. db.query(OrdSupplierSettlementItem)
  215. .filter(
  216. OrdSupplierSettlementItem.settlement_id == settlement_id,
  217. OrdSupplierSettlementItem.is_del == 0,
  218. )
  219. .order_by(OrdSupplierSettlementItem.create_at.asc())
  220. .all()
  221. )
  222. return main, items
  223. def belongs_to_region(self, db: Session, settlement_id: str, region_id: str) -> bool:
  224. if not region_id:
  225. return True
  226. return (
  227. db.query(OrdSupplierSettlementItem.id)
  228. .join(BizOrder, BizOrder.id == OrdSupplierSettlementItem.order_id)
  229. .filter(
  230. OrdSupplierSettlementItem.settlement_id == settlement_id,
  231. OrdSupplierSettlementItem.is_del == 0,
  232. BizOrder.is_del == 0,
  233. BizOrder.region_id == region_id,
  234. )
  235. .first()
  236. is not None
  237. )
  238. def update_with_history(
  239. self,
  240. db: Session,
  241. settlement_id: str,
  242. obj_in: dict,
  243. updater: Optional[dict] = None,
  244. ) -> Optional[OrdSupplierSettlement]:
  245. original = self.get(db, settlement_id)
  246. if not original or original.is_del == 1:
  247. return None
  248. his = OrdSupplierSettlementHis(**self._snapshot_main(original))
  249. db.add(his)
  250. return self.update(db, settlement_id, obj_in, updater)
  251. class OrdSupplierSettlementItemCRUD(CRUDBase[OrdSupplierSettlementItem]):
  252. def _snapshot_item(self, row: OrdSupplierSettlementItem) -> Dict[str, Any]:
  253. return {
  254. "id": row.id,
  255. "settlement_id": row.settlement_id,
  256. "order_id": row.order_id,
  257. "order_no": row.order_no,
  258. "supplier_id": row.supplier_id,
  259. "order_amount": row.order_amount,
  260. "create_at": row.create_at,
  261. "create_by": row.create_by,
  262. "create_name": row.create_name,
  263. "update_at": row.update_at,
  264. "update_by": row.update_by,
  265. }
  266. def update_with_history(
  267. self,
  268. db: Session,
  269. item_id: str,
  270. obj_in: dict,
  271. updater: Optional[dict] = None,
  272. ) -> Optional[OrdSupplierSettlementItem]:
  273. original = self.get(db, item_id)
  274. if not original or original.is_del == 1:
  275. return None
  276. his = OrdSupplierSettlementItemHis(**self._snapshot_item(original))
  277. db.add(his)
  278. return self.update(db, item_id, obj_in, updater)
  279. def soft_delete_with_history(self, db: Session, item_id: str, updater: Optional[dict] = None) -> bool:
  280. original = self.get(db, item_id)
  281. if not original or original.is_del == 1:
  282. return False
  283. his = OrdSupplierSettlementItemHis(**self._snapshot_item(original))
  284. db.add(his)
  285. return self.update(db, item_id, {"is_del": 1}, updater) is not None
  286. ord_client_settlement_crud = OrdClientSettlementCRUD(OrdClientSettlement)
  287. ord_client_settlement_item_crud = OrdClientSettlementItemCRUD(OrdClientSettlementItem)
  288. ord_supplier_settlement_crud = OrdSupplierSettlementCRUD(OrdSupplierSettlement)
  289. ord_supplier_settlement_item_crud = OrdSupplierSettlementItemCRUD(OrdSupplierSettlementItem)