📢
今日入库:{{ stats.today_stock_in || 0 }} 件◆ 今日出库:{{ stats.today_stock_out || 0 }} 件◆ 今日归还:{{ stats.today_returned || 0 }} 件◆ 今日维修:{{ stats.today_repair || 0 }} 件◆ 今日报废:{{ stats.today_scrap || 0 }} 件 今日入库:{{ stats.today_stock_in || 0 }} 件◆ 今日出库:{{ stats.today_stock_out || 0 }} 件◆ 今日归还:{{ stats.today_returned || 0 }} 件◆ 今日维修:{{ stats.today_repair || 0 }} 件◆ 今日报废:{{ stats.today_scrap || 0 }} 件
🏭
{{ stats.total_warehouses || 0 }}
仓库总数量
💰
¥{{ formatNumber(stats.total_value || 0) }}
库存总价值
📦
{{ stats.total_quantity || 0 }}
库存总数量
🏢
¥{{ formatNumber(stats.asset_value || 0) }}
固定资产价值
🖨️
{{ stats.asset_count || 0 }}
固定资产数量
⚠️
{{ stats.low_stock || 0 }}
库存预警
部门资产排行

暂无部门数据

高周转物资统计

暂无高周转物资

库存预警列表

暂无库存预警

{{ item.name }}
{{ item.brand_model || '-' }} | {{ item.category || '-' }}
{{ item.quantity }} {{ item.unit }}
阈值: {{ item.min_quantity }}
有效期预警

暂无有效期预警

{{ item.name }}
{{ item.item_code }} | {{ item.warehouse_name || '-' }}
{{ item.expiry_date }}
{{ item.warning_type === 'expired' ? '已过期' : '即将过期' }}
最近操作日志

暂无操作记录

{{ log.type === 'in' ? '入库' : (log.type === 'return' ? '归还' : '出库') }} {{ log.item_name }} {{ log.quantity }}{{ log.unit }}
{{ log.operator_name }} · {{ log.created_at }} → {{ log.recipient }}
查询 重置 批量操作 导出Excel

当前二维码

暂无二维码
重新生成二维码

根据物资编码重新生成

上传
拍照
{{ stockOutItem?.item_code }} {{ stockOutItem?.name }} {{ stockOutItem?.quantity }} {{ stockOutItem?.unit }} {{ stockOutItem?.location || '-' }}
固定资产入库数量固定为1
上传图片
拍照
确认入库并生成二维码
暂无二维码

批次码: {{ stockInResult.batch_code }}

共入库 {{ stockInResultItems.length }} 件固定资产
{{ stockInResult.name }} {{ stockInResult.control_type }} {{ stockInResult.in_type || '采购入库' }} {{ stockInResult.brand_model || '-' }} {{ stockInResult.control_type === '固定资产' ? (stockInResultItems ? stockInResultItems.length : 1) : stockInResult.quantity }} {{ stockInResult.unit }} {{ stockInResult.price ? '¥' + parseFloat(stockInResult.price).toFixed(2) : '-' }} {{ stockInResult.expiry_date || '-' }} {{ stockInResult.created_at }}
继续入库
开始扫码 停止扫码
或手动输入编码

输入关键词搜索物资

{{ currentItem.control_type === '固定资产' ? '资产码: ' + currentItem.asset_code : '批次码: ' + currentItem.batch_code }}

{{ currentItem.name }} {{ currentItem.in_type || '采购入库' }} {{ currentItem.brand_model || '-' }} {{ currentItem.category || '-' }} {{ getStatusText(currentItem) }} {{ currentItem.quantity }} {{ currentItem.unit }} {{ currentItem.price ? '¥' + parseFloat(currentItem.price).toFixed(2) : '-' }} {{ currentItem.expiry_date || '-' }} {{ getWarehouseName(currentItem.warehouse_id) || '' }}{{ currentItem.location ? (currentItem.warehouse_id ? ' - ' : '') + currentItem.location : '-' }} {{ currentItem.operator_name || '-' }} {{ currentItem.created_at }} {{ currentItem.remark || '-' }} 确认出库
扫描资产码 停止扫描
或手动输入
{{ returnItem.item_code }} {{ returnItem.name }} {{ returnItem.category || '-' }} {{ returnItem.status || '在库' }} {{ returnItem.current_holder || '-' }} 确认归还
, {{ locating ? '定位中...' : '获取经纬度' }}

💡 新创建的用户默认为已启用 + 已审核状态,可直接登录使用。初始密码建议不少于6位。

💡 修改信息后点击保存即可生效,用户名不可修改。

{{ group }}
{{ perm.name }}
提示:坐标点每行一个「经度,纬度」(如 108.36,22.81),一条线路至少 2 个点,多个点按顺序连线。
提示:为仓库设置经纬度后,大屏 GIS 地图上即显示仓库标记(正常绿色 / 预警红色)。
保存地图参数 重新加载
{{ whForm.name }}
测试连接 强制刷新该条码缓存 {{ barcodeTestMsg }}
📊 调用量统计(计费参考)
单价(元/次) 刷新
{{ barcodeStatsError }}
{{ barcodeStats ? barcodeStats.total_calls : '—' }}
累计计费调用(次)
{{ barcodeStats ? barcodeStats.cache_hits : '—' }}
缓存命中(免费 · 省调用)
{{ (barcodeStats && barcodeStats.today) ? barcodeStats.today.calls : '—' }}
今日计费调用(次)
{{ estBarcodeCost() }}
预估费用(按单价)
最近调用:{{ (barcodeStats && barcodeStats.last_call_at) || '暂无' }}(条码 {{ barcodeStats.last_barcode }}) | 失败:{{ barcodeStats ? barcodeStats.failed_calls : 0 }} 次 | 首次调用:{{ (barcodeStats && barcodeStats.first_call_at) || '暂无' }}
口径说明:只有真正请求到上游接口才计费;命中缓存(重复扫同一商品,永久有效)不计费。日统计保留最近 120 天,计数自本功能上线起累计。
接口名称商品条码 / 商品条形码查询(中国物品编码中心数据)
接口能力支持 69 开头的 EAN-8 / EAN-13 商品条码在线查询,返回产品名称、生产企业、规格参数等
调用地址https://jisutxmcx.market.alicloudapi.com/barcode2/query
请求方式ANY(GET / POST 均可)
返回类型JSON
AppKey205041902
AppSecretN3zF****************iyz(密钥已脱敏,完整值仅保存在服务端)
AppCode86402a****************65aa(密钥已脱敏,完整值仅保存在服务端)
服务端代理./api/barcode.php密钥存于服务端,前端不接触
缓存策略本地永久缓存(api/barcode_cache/)。仓库反复采购同一批物资很常见,永久缓存可最大化节省计费调用;如需让某条码重新查询,用下方「强制刷新该条码缓存」。
⚠️ 实现方案与安全说明
  1. 按接口文档从前端直连会踩两个坑:浏览器跨域(CORS)被拦;而且 AppCode 写死在 JS 里等于公开泄露。
  2. 因此做成服务端代理:新建 api/barcode.php,AppCode 只存在服务器,前端调我们自己的接口。顺带加了 本地永久缓存(仓库重复采购同一商品很常见),重复扫同一个商品不再消耗接口调用次数。
  3. 本页面仅展示脱敏后的配置。由于后台接口目前没有鉴权,密钥不提供在线查看 / 编辑;如需更换请联系维护人员修改 api/barcode.php。
📷 扫码识别规则(移动端入库)
  • 扫到 69 开头的 EAN-8 / EAN-13 条码后自动填充:
  • 物资名称 ← 商品名(如「雀巢金牌东南亚风味白咖啡即溶咖啡饮品」)
  • 品牌型号 ← 品牌 + 规格(如「雀巢咖啡 115克(5条×23克)」)
  • 备注 ← 追加条码号与生产企业(如「商品条码:6917878036526;生产企业:雀巢(中国)有限公司」),方便后续追溯
  • 扫码器已显式支持 EAN_13 / EAN_8 / UPC_A / UPC_E / CODE_128 / CODE_39 / ITF,同时保留原来的物资二维码识别——扫到非条码的编码会自动回退到原有内部物资查询,不影响老流程。
  • 离开入库页会自动关闭摄像头。
📱 使用位置(移动端)
  • mobile.html#stockIn(入库页):「物资名称」右侧的 📷 条码 按钮
  • mobile.html#scanIn(扫码入库页):直接扫描,或在输入框手动输入条码
查询 重置 导出
{{ auditOpDetail.id }} {{ auditOpDetail.real_name || auditOpDetail.username }} {{ auditOpDetail.username }} {{ auditOpDetail.department || '-' }} {{ auditOpDetail.operation_time }} {{ auditOpDetail.ip_address }} {{ auditOpDetail.terminal_type }} {{ auditOpDetail.module }} {{ auditOpDetail.action_type }} {{ auditOpDetail.result === 'success' ? '成功' : '失败' }} {{ auditOpDetail.target_type || '-' }} {{ auditOpDetail.target_id || '-' }} {{ auditOpDetail.target_name || '-' }} {{ auditOpDetail.action_desc || '-' }}
{{ JSON.stringify(auditOpDetail.before_data_json, null, 2) }}
-
{{ JSON.stringify(auditOpDetail.after_data_json, null, 2) }}
-
{{ auditOpDetail.error_msg || '-' }} {{ auditOpDetail.remark || '-' }}
查询 重置 导出
{{ auditSysDetail.id }} {{ auditSysDetail.log_type }} {{ auditSysDetail.log_time }} {{ auditSysDetail.log_level }} {{ auditSysDetail.username || '-' }} {{ auditSysDetail.real_name || '-' }} {{ auditSysDetail.ip_address || '-' }} {{ auditSysDetail.run_status }} {{ auditSysDetail.request_url || '-' }} {{ auditSysDetail.request_method || '-' }} {{ auditSysDetail.response_code || '-' }} {{ auditSysDetail.response_time ? auditSysDetail.response_time + 'ms' : '-' }} {{ auditSysDetail.log_content || '-' }}
{{ JSON.stringify(auditSysDetail.request_params_json, null, 2) }}
-
{{ JSON.stringify(auditSysDetail.error_detail_json, null, 2) }}
-
📊
{{ auditStats.today_operation_count || 0 }}
今日操作总量
❌
{{ auditStats.today_failed_count || 0 }}
今日失败操作
✅
{{ auditStats.today_login_success || 0 }}
今日成功登录
🔐
{{ auditStats.today_login_failed || 0 }}
今日登录失败
⚠️
{{ auditStats.today_sensitive_count || 0 }}
今日敏感操作
👥
{{ auditStats.online_user_count || 0 }}
在线用户数
操作趋势图(最近7天)
各模块操作统计
敏感操作统计
用户操作排行
生成报表 重置
{{ auditReportData.summary.total_count }} {{ auditReportData.summary.success_count }} {{ auditReportData.summary.failed_count }} {{ auditReportData.summary.success_rate }}%
开始扫码 停止扫码
或手动输入编码
{{ scanInItem.brand_model || '-' }} {{ scanInItem.category || '-' }} {{ scanInItem.control_type }} {{ scanInItem.unit || '-' }} {{ scanInItem.price ? '¥' + parseFloat(scanInItem.price).toFixed(2) : '-' }} {{ scanInItem.location || '-' }}
保存修改 修改密码
开始扫码 停止扫码
或手动输入编码
{{ lifeItem.item_code }} {{ lifeItem.brand_model || '-' }} {{ lifeItem.category || '-' }} ¥{{ lifeItem.price ? Number(lifeItem.price).toFixed(2) : '-' }} {{ lifeItem.quantity }} {{ lifeItem.unit || '' }} {{ lifeItem.warehouse_name || '-' }}({{ lifeItem.warehouse_department || '-' }}) {{ lifeItem.batch_code || '-' }} {{ lifeItem.asset_code || '-' }}
{{ r.type === 'in' ? '入库' : (r.type === 'out' ? '出库' : '归还') }} 数量 {{ r.quantity }} {{ r.unit || '' }}
操作人:{{ r.operator_name || '-' }} 领取人:{{ r.recipient }} 归还人:{{ r.returner }}
备注:{{ r.remark }}
仓库:{{ r.warehouse_name }}
重新扫码 关闭