feat: P0-2 订单BOM计算单+Excel导出(openpyxl)

This commit is contained in:
HHY
2026-09-25 03:09:21 -07:00
parent 8c2bb5e12d
commit d5e3cdbede
10 changed files with 247 additions and 1 deletions
+44
View File
@@ -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 时执行状态迁移。"""