diff --git a/inventory-backend/app/api/v1/inbound/stock.py b/inventory-backend/app/api/v1/inbound/stock.py index 4978234..272acf1 100644 --- a/inventory-backend/app/api/v1/inbound/stock.py +++ b/inventory-backend/app/api/v1/inbound/stock.py @@ -14,6 +14,17 @@ from app.models.inbound.stocktake import StocktakeDraft from app.models.transaction import TransBorrow from app.models.base import MaterialBase +# 尝试导入半成品和成品 +try: + from app.models.inbound.semi import StockSemi +except ImportError: + StockSemi = None + +try: + from app.models.inbound.product import StockProduct +except ImportError: + StockProduct = None + def _normalize_user_id(user_id): """规范化 user_id,确保是有效字符串""" @@ -356,17 +367,22 @@ def adjust_stock(): """ data = request.json draft_id = data.get('draft_id') + stock_id = data.get('stock_id') # 备用参数:通过 stock_id 查找草稿 operator_name = data.get('operator_name', 'System') remark = data.get('remark', '') - if not draft_id: - return jsonify({"message": "draft_id 不能为空"}), 400 + if not draft_id and not stock_id: + return jsonify({"message": "draft_id 或 stock_id 不能同时为空"}), 400 try: - # 1. 获取草稿记录 - draft = StocktakeDraft.query.get(draft_id) + # 1. 获取草稿记录(优先用 draft_id,否则用 stock_id) + draft = StocktakeDraft.query.get(draft_id) if draft_id else None + if not draft and stock_id: + # 尝试通过 stock_id 查找未处理的草稿 + draft = StocktakeDraft.query.filter_by(stock_id=stock_id).first() + if not draft: - return jsonify({"message": "草稿记录不存在"}), 404 + return jsonify({"message": f"平账失败:找不到对应的盘点草稿记录(draft_id={draft_id}, stock_id={stock_id})"}), 404 # 2. 获取库存记录 if not draft.stock_id or not draft.source_table: diff --git a/inventory-web/src/views/stock/stocktake/index.vue b/inventory-web/src/views/stock/stocktake/index.vue index 5c1144f..fc17ded 100644 --- a/inventory-web/src/views/stock/stocktake/index.vue +++ b/inventory-web/src/views/stock/stocktake/index.vue @@ -448,10 +448,15 @@ const api = { params: {} }), // ★ 新增: 单条库存调整 - adjustStock: (draftId: number, remark: string) => request({ + adjustStock: (draftId: number, stockId: number, remark: string) => request({ url: '/v1/inbound/stock/adjust', method: 'post', - data: { draft_id: draftId, operator_name: currentUser, remark: remark } + data: { + draft_id: draftId, + stock_id: stockId, // 备用参数 + operator_name: currentUser, + remark: remark + } }), // ★ 保留清除功能(用于兼容性) clearDraft: () => request({ @@ -755,9 +760,12 @@ const exportToExcel = async () => { const res: any = await request({ url: '/v1/inbound/stock/export-stocktake', method: 'get', - responseType: 'blob' as any // 核心:接收二进制文件流 + responseType: 'blob' as any, // 核心:接收二进制文件流 + headers: { + 'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' + } }); - + // 触发静默下载 const blob = new Blob([res], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }); const url = window.URL.createObjectURL(blob); @@ -886,7 +894,7 @@ const handleAdjust = async (row: any) => { const remark = `盘点差异调整 - ${row.diff_qty > 0 ? '盘盈入库' : '盘亏出库'}` - const res: any = await api.adjustStock(row.id, remark) + const res: any = await api.adjustStock(row.id, row.stock_id, remark) ElMessage.success(res.message || '调整成功')