Files
Mutual_Fund/repositories/biz_work_order.py
T

52 lines
1.8 KiB
Python

"""biz_work_order 工单仓储:查工单 + 流转条件更新(防并发,不 commit)。"""
from __future__ import annotations
from sqlalchemy import select, update
from model.biz_work_order import BizWorkOrder
from repositories.base import BaseRepository
class BizWorkOrderRepo(BaseRepository):
model = BizWorkOrder
async def get_by_work_order_no(self, work_order_no: str) -> BizWorkOrder | None:
return await self.db.scalar(
select(BizWorkOrder).where(BizWorkOrder.work_order_no == work_order_no)
)
async def list_with_filter(
self,
*,
handler_id: int | None = None,
status: str | None = None,
customer_id: int | None = None,
) -> list[BizWorkOrder]:
stmt = select(BizWorkOrder)
if handler_id is not None:
stmt = stmt.where(BizWorkOrder.handler_id == handler_id)
if status is not None:
stmt = stmt.where(BizWorkOrder.status == status)
if customer_id is not None:
stmt = stmt.where(BizWorkOrder.customer_id == customer_id)
stmt = stmt.order_by(BizWorkOrder.id.desc())
return list((await self.db.scalars(stmt)).all())
async def conditional_transition(
self, work_order_id: int, *, from_status: str, to_status: str, **fields
) -> bool:
"""工单流转:条件更新 WHERE id=? AND status=from_status。
不 commit,由 service 层事务统一提交;rowcount==0 表示状态已变(并发冲突),
返回 False 供上层提示,避免跳步流转。
"""
result = await self.db.execute(
update(BizWorkOrder)
.where(
BizWorkOrder.id == work_order_id,
BizWorkOrder.status == from_status,
)
.values(status=to_status, **fields)
)
return result.rowcount > 0