双角色铁模型:称重员=操作秤(无码无组);工人=被计工(发码有组)。两类角色不得同名;每笔称重记录同时写入两个字段。码不作废可复用;删除为软删除(数据库保留)。

工人 码库存 = 剩余/已生成 · 点击查看码包

姓名组别码库存今日计工累计工资操作

称重员 停用后无法登录任何云秤

姓名手机号角色状态操作

工人码申领记录 付费→生成;邮寄:接单→制作→发货

时间工人数量方式金额状态运单号操作
/* ============================================================ v4.8 · 失败可见化 原写法.catch(function(){ return 默认值 }) 会把网络失败吞成空数据, 用户以为「今天没数据」,实际是没网(v1.47.1 同类事故)。 现改为:记录失败项 → 页面顶部显示红色提示条 + 重试入口。 ============================================================ */ window.__failed = {}; function __guard(name, url, def) { return function () { return PROD.get(url).catch(function (e) { window.__failed[name] = (e && e.message) ? e.message : '请求失败'; return def; }); }; } function __renderFailed(barId) { var bar = document.getElementById(barId); if (!bar) return; var names = window.__FAIL_NAMES || {}; var keys = Object.keys(window.__failed); if (!keys.length) { bar.innerHTML = ''; return; } var esc = function (s) { return String(s == null ? '' : s).replace(/[&<>"]/g, function (c) { return { '&': '&', '<': '<', '>': '>', '"': '"' }[c]; }); }; bar.innerHTML = '
⚠ 以下数据加载失败,页面数值不完整:' + keys.map(function (k) { return (names[k] || k) + '(' + esc(window.__failed[k]) + ')'; }).join('、') + '
'; } window.__FAIL_NAMES = {"groups": "组别", "workers": "工人", "operators": "称重员", "today": "今日计工", "wages": "工人工资", "qr": "码单"};