From 387c8973d6cff81c776be973c834272a3912e51a Mon Sep 17 00:00:00 2001 From: dxc Date: Fri, 6 Feb 2026 14:30:14 +0800 Subject: [PATCH] =?UTF-8?q?=E7=9B=98=E5=BA=93=E7=9B=B2=E7=9B=98=E4=BB=A5?= =?UTF-8?q?=E5=8F=8A=E5=AF=BC=E5=87=BAexcel=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- inventory-backend/app/api/v1/inbound/stock.py | 49 +- .../app/models/inbound/stocktake.py | 5 +- inventory-web/package.json | 3 +- .../src/views/stock/stocktake/index.vue | 724 ++++++++++-------- 4 files changed, 456 insertions(+), 325 deletions(-) diff --git a/inventory-backend/app/api/v1/inbound/stock.py b/inventory-backend/app/api/v1/inbound/stock.py index a1141ff..777b2c0 100644 --- a/inventory-backend/app/api/v1/inbound/stock.py +++ b/inventory-backend/app/api/v1/inbound/stock.py @@ -1,8 +1,11 @@ from flask import Blueprint, jsonify, request from app.extensions import db +# ★★★ 修复点:必须引入 datetime,否则下方更新时间时会报错 500 ★★★ +from datetime import datetime + # 导入模型 from app.models.inbound.buy import StockBuy -from app.models.inbound.stocktake import StocktakeDraft # 新增 +from app.models.inbound.stocktake import StocktakeDraft # 尝试导入半成品和成品 try: @@ -23,10 +26,10 @@ bp = Blueprint('stock_ops', __name__) @bp.route('/all', methods=['GET']) def get_all_stock(): """ - 获取所有库存 > 0 的物品(无论状态是 在库 还是 部分出库) + 获取所有库存 > 0 的物品 """ try: - # 1. 采购件 (核心修改:只看库存数量 > 0) + # 1. 采购件 materials = [] if StockBuy: materials = StockBuy.query.filter(StockBuy.stock_quantity > 0).all() @@ -57,7 +60,7 @@ def get_all_stock(): return jsonify({"message": f"查询库存失败: {str(e)}"}), 500 -# --- 草稿箱接口 (断点续传) --- +# --- 草稿箱接口 --- @bp.route('/draft/list', methods=['GET']) def get_drafts(): @@ -69,24 +72,36 @@ def get_drafts(): @bp.route('/draft/add', methods=['POST']) def add_draft(): - """扫码同步""" - data = request.json - user_id = data.get('user_id', 'admin') - uuid = data.get('uuid') + """扫码同步 (支持更新数量)""" + try: + data = request.json + user_id = data.get('user_id', 'admin') + uuid = data.get('uuid') + quantity = data.get('quantity', 1) + + # 查找是否已存在 + draft = StocktakeDraft.query.filter_by(user_id=user_id, uuid=uuid).first() + + if draft: + # 如果已存在,更新数量和时间 + draft.quantity = quantity + # ★ 修复点:这里需要 datetime 对象 + draft.scan_time = datetime.now() + else: + # 如果不存在,创建新的 + draft = StocktakeDraft(user_id=user_id, uuid=uuid, quantity=quantity) + db.session.add(draft) - # 避免重复插入 - exists = StocktakeDraft.query.filter_by(user_id=user_id, uuid=uuid).first() - if not exists: - draft = StocktakeDraft(user_id=user_id, uuid=uuid) - db.session.add(draft) db.session.commit() - - return jsonify({"message": "Saved"}), 200 + return jsonify({"message": "Saved"}), 200 + except Exception as e: + print(f"Add Draft Error: {e}") + return jsonify({"message": str(e)}), 500 @bp.route('/draft/clear', methods=['POST']) def clear_draft(): - """清空进度 (开始新盘点或结束后)""" + """清空进度""" data = request.json user_id = data.get('user_id', 'admin') @@ -95,7 +110,7 @@ def clear_draft(): return jsonify({"message": "Cleared"}), 200 -# --- 打印接口 (保持不变) --- +# --- 打印接口 --- @bp.route('/print/selection', methods=['POST']) def print_selection(): diff --git a/inventory-backend/app/models/inbound/stocktake.py b/inventory-backend/app/models/inbound/stocktake.py index 8433f5e..a81e0d4 100644 --- a/inventory-backend/app/models/inbound/stocktake.py +++ b/inventory-backend/app/models/inbound/stocktake.py @@ -2,12 +2,13 @@ from app.extensions import db from datetime import datetime class StocktakeDraft(db.Model): - """盘点草稿表""" __tablename__ = 'stocktake_draft' id = db.Column(db.Integer, primary_key=True) user_id = db.Column(db.String(100), default='admin') uuid = db.Column(db.String(100)) + # ★ 新增 quantity 字段 + quantity = db.Column(db.Numeric(19, 4), default=1) scan_time = db.Column(db.DateTime, default=datetime.now) def to_dict(self): @@ -15,5 +16,7 @@ class StocktakeDraft(db.Model): 'id': self.id, 'user_id': self.user_id, 'uuid': self.uuid, + # ★ 返回 quantity + 'quantity': float(self.quantity or 1), 'scan_time': self.scan_time.strftime('%Y-%m-%d %H:%M:%S') } \ No newline at end of file diff --git a/inventory-web/package.json b/inventory-web/package.json index 6004a42..ab74280 100644 --- a/inventory-web/package.json +++ b/inventory-web/package.json @@ -18,7 +18,8 @@ "pinia": "^3.0.4", "sass": "^1.97.3", "vue": "^3.5.24", - "vue-router": "^4.6.4" + "vue-router": "^4.6.4", + "xlsx": "^0.18.5" }, "devDependencies": { "@types/node": "^24.10.1", diff --git a/inventory-web/src/views/stock/stocktake/index.vue b/inventory-web/src/views/stock/stocktake/index.vue index 64e29e1..6d656fb 100644 --- a/inventory-web/src/views/stock/stocktake/index.vue +++ b/inventory-web/src/views/stock/stocktake/index.vue @@ -3,12 +3,14 @@
- -

库存盘点系统

-

请确保已连接扫描枪或摄像头

+
+ +
+

库存盲盘系统

+

单件自动确认,多件弹窗录入

- + 开始新盘点 @@ -17,18 +19,17 @@ type="warning" plain size="large" - class="w-100" + class="action-btn-full" @click="resumeSession" :loading="btnLoading" > - 继续上次盘点 -
(云端已存: {{ serverDraftCount }} 项)
+ 继续上次盘点 ({{ serverDraftCount }}项)
- 数据实时同步至服务器,防止意外丢失 + 数据实时同步,支持断点续传
@@ -37,52 +38,49 @@
-
+
-
请将条码对准取景框
+
扫描条码
-
- -

正在查看清单列表
摄像头已暂停

- 点击返回继续扫描 +
+ +

操作中...
点击返回扫描

{{ stats.total }}
-
总数
+
总品项
{{ stats.scanned }}
已盘
-
-
{{ stats.missing }}
-
差异
-
-
- +
+
{{ stats.total - stats.scanned }}
+
未盘
+
- 查看清单 + 盘点明细 @@ -91,113 +89,155 @@ -

打印机 IP: 192.168.9.205

- -
- - - - - - - - - - - - - - - - - - - -
-
- -
-
- 盘点时间: - {{ new Date().toLocaleTimeString() }} +
+
+
+ 名称: + {{ currentItem.name }} +
+
+ 规格: + {{ currentItem.standard || '-' }} +
+
+ SKU: + {{ currentItem.sku }} +
+
+ 批号: + {{ currentItem.batch_no || '-' }} +
+ + {{ currentItem.scanned ? '修改实盘数' : '录入实盘数' }} + +
+ +

单位: {{ currentItem.unit || '个' }}

+
+
+ + + + +
+ + +
+ + + + + + + + + + + + + + + + +
+ + +
+
+ + +
+
截止时间:{{ new Date().toLocaleString() }}
-
-
{{ stats.total }}
-
总数
-
-
-
{{ stats.scanned }}
-
实盘
-
-
-
{{ stats.missing }}
-
丢失
-
+
{{ stats.total }}
总数
+
{{ stats.scanned }}
已盘
+
{{ stats.total - stats.scanned }}
未盘
-
差异物品 (丢失清单)
- +
差异/未盘预览
+ - + + + + @@ -207,57 +247,65 @@