This commit is contained in:
2026-03-31 01:00:22 +08:00
parent 5cd8a21f24
commit dccd9bd81d
4 changed files with 24 additions and 2 deletions
+13 -2
View File
@@ -10,7 +10,7 @@
""" """
from fastapi import APIRouter, Depends, Query, HTTPException from fastapi import APIRouter, Depends, Query, HTTPException
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import select from sqlalchemy import select, func
from typing import Optional, List from typing import Optional, List
from database.database import get_db_session from database.database import get_db_session
@@ -48,7 +48,9 @@ def _build_purchase_order_response(order: PurchaseOrder, supplier_name: str) ->
total_amount=order.total_amount, total_amount=order.total_amount,
paid_amount=order.paid_amount, paid_amount=order.paid_amount,
remark=order.remark, remark=order.remark,
created_at=order.created_at created_at=order.created_at,
received_date=order.received_date,
paid_date=order.paid_date
) )
@@ -91,6 +93,8 @@ async def _build_purchase_order_detail(
paid_amount=order.paid_amount, paid_amount=order.paid_amount,
remark=order.remark, remark=order.remark,
created_at=order.created_at, created_at=order.created_at,
received_date=order.received_date,
paid_date=order.paid_date,
items=[ items=[
PurchaseOrderItemResponse( PurchaseOrderItemResponse(
id=item.id, id=item.id,
@@ -307,7 +311,13 @@ async def update_purchase_order_status(
if order.status == "received" and new_status != "paid": if order.status == "received" and new_status != "paid":
raise HTTPException(status_code=400, detail="已收货的采购订单只能标记为已付款") raise HTTPException(status_code=400, detail="已收货的采购订单只能标记为已付款")
# 更新状态和对应时间
order.status = new_status order.status = new_status
if new_status == "received":
order.received_date = func.now()
elif new_status == "paid":
order.paid_date = func.now()
await db_session.commit() await db_session.commit()
await db_session.refresh(order) await db_session.refresh(order)
@@ -397,6 +407,7 @@ async def receive_purchase_order(
any_received = any((item.received_quantity or 0) > 0 for item in item_map.values()) any_received = any((item.received_quantity or 0) > 0 for item in item_map.values())
if all_received: if all_received:
order.status = "received" order.status = "received"
order.received_date = func.now()
elif any_received: elif any_received:
order.status = "partial_received" order.status = "partial_received"
@@ -28,6 +28,8 @@ class PurchaseOrderResponse(BaseModel):
paid_amount: float paid_amount: float
remark: Optional[str] remark: Optional[str]
created_at: datetime created_at: datetime
received_date: Optional[datetime]
paid_date: Optional[datetime]
class Config: class Config:
from_attributes = True from_attributes = True
+3
View File
@@ -712,6 +712,9 @@ class PurchaseOrder(Base):
operator_id = Column(Integer, ForeignKey("users.id"), nullable=True) operator_id = Column(Integer, ForeignKey("users.id"), nullable=True)
created_at = Column(DateTime, default=func.now()) created_at = Column(DateTime, default=func.now())
updated_at = Column(DateTime, default=func.now(), onupdate=func.now()) updated_at = Column(DateTime, default=func.now(), onupdate=func.now())
# 状态变更时间
received_date = Column(DateTime, nullable=True) # 已收货时间
paid_date = Column(DateTime, nullable=True) # 已付款时间
supplier = relationship("Supplier", back_populates="purchase_orders") supplier = relationship("Supplier", back_populates="purchase_orders")
items = relationship("PurchaseOrderItem", back_populates="order", cascade="all, delete-orphan") items = relationship("PurchaseOrderItem", back_populates="order", cascade="all, delete-orphan")
+6
View File
@@ -3222,7 +3222,10 @@ const InventoryView = {
<th>采购单</th> <th>采购单</th>
<th>供应商</th> <th>供应商</th>
<th>状态</th> <th>状态</th>
<th>订单创建</th>
<th>预计到货</th> <th>预计到货</th>
<th>实际到货</th>
<th>实际付款</th>
<th>总金额</th> <th>总金额</th>
<th>已付款</th> <th>已付款</th>
<th>操作</th> <th>操作</th>
@@ -3233,7 +3236,10 @@ const InventoryView = {
<td>{{ order.order_no }}</td> <td>{{ order.order_no }}</td>
<td>{{ order.supplier_name }}</td> <td>{{ order.supplier_name }}</td>
<td>{{ getPurchaseOrderStatusLabel(order.status) }}</td> <td>{{ getPurchaseOrderStatusLabel(order.status) }}</td>
<td>{{ order.created_at ? formatDateTime(order.created_at) : '-' }}</td>
<td>{{ order.expected_date ? formatDate(order.expected_date) : '-' }}</td> <td>{{ order.expected_date ? formatDate(order.expected_date) : '-' }}</td>
<td>{{ order.received_date ? formatDateTime(order.received_date) : '-' }}</td>
<td>{{ order.paid_date ? formatDateTime(order.paid_date) : '-' }}</td>
<td>{{ formatCurrency(order.total_amount || 0) }}</td> <td>{{ formatCurrency(order.total_amount || 0) }}</td>
<td>{{ formatCurrency(order.paid_amount || 0) }}</td> <td>{{ formatCurrency(order.paid_amount || 0) }}</td>
<td> <td>