feat: P0-2 订单BOM计算单+Excel导出(openpyxl)
This commit is contained in:
@@ -75,6 +75,50 @@ async def order_detail(order_id: int, user: CurrentUser, db: DbSession):
|
||||
return ok(data=data)
|
||||
|
||||
|
||||
@router.get("/{order_id}/bom")
|
||||
async def order_bom(order_id: int, user: CurrentUser, db: DbSession):
|
||||
"""订单 BOM 计算单(对齐 calcbomOrder):型材下料清单 + 玻璃/五金汇总。"""
|
||||
try:
|
||||
order = await OrderService(db).get_detail(user, order_id)
|
||||
except KeyError as e:
|
||||
return fail(str(e))
|
||||
if not order.drawing_data:
|
||||
return fail("该订单没有图纸数据")
|
||||
from huamenchuang.core.drawing import parse_drawing
|
||||
from huamenchuang.services.quote_service import bom as build_bom
|
||||
try:
|
||||
data = build_bom(parse_drawing(order.drawing_data))
|
||||
except Exception:
|
||||
return fail("图纸数据解析失败")
|
||||
return ok(data={**data, "order_no": order.order_no}, message="BOM 生成成功")
|
||||
|
||||
|
||||
@router.get("/{order_id}/export")
|
||||
async def export_order(order_id: int, user: CurrentUser, db: DbSession):
|
||||
"""订单导出 Excel(对齐 orders/export:信息 + BOM 下料清单)。"""
|
||||
from fastapi.responses import Response
|
||||
try:
|
||||
order = await OrderService(db).get_detail(user, order_id)
|
||||
except KeyError as e:
|
||||
return fail(str(e))
|
||||
if not order.drawing_data:
|
||||
return fail("该订单没有图纸数据")
|
||||
from huamenchuang.core.drawing import parse_drawing
|
||||
from huamenchuang.services.excel_service import order_workbook
|
||||
from huamenchuang.services.quote_service import bom as build_bom
|
||||
try:
|
||||
sheet = build_bom(parse_drawing(order.drawing_data))
|
||||
except Exception:
|
||||
return fail("图纸数据解析失败")
|
||||
content = order_workbook(_to_out(order), sheet)
|
||||
filename = f"order_{order.order_no}.xlsx"
|
||||
return Response(
|
||||
content,
|
||||
media_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
||||
headers={"Content-Disposition": f"attachment; filename={filename}"},
|
||||
)
|
||||
|
||||
|
||||
@router.put("/{order_id}")
|
||||
async def update_order(order_id: int, body: OrderUpdate, user: CurrentUser, db: DbSession):
|
||||
"""更新订单基础字段;action=change_status 时执行状态迁移。"""
|
||||
|
||||
Reference in New Issue
Block a user