门店自用的单机经营管理系统,覆盖:收支记账与账户余额、会员充值与消费、
万家云网费 / 商超数据同步与经营分析、员工打卡与排班、员工资料与工资、
往来对账与财务报表等。数据保存在门店本机(「数据备份」可随时导出),
支持手机端(PWA)访问与多门店切换。
当前版本:构建
📜 更新日志(新 → 旧)
构建 20260921zk20 · 前台交接班只给前台岗位
按你说的「前台交接班只有前台的工作人员需要」收了口:
① 打卡页:水吧 / 保洁的人不再看到「📋 交接班记录」这个入口;存过书签、直接在地址栏加 ?tab=handover 也进不去,会停在打卡页并提示一句「交接班记录只由前台岗位填写,你不用交班」。前台岗位的人一切照旧。
② 交班人 / 接班人两个下拉只列前台岗位的人,选不到水吧 / 保洁。
③ 怎么算前台(一处判定,全站同一个口径):人员档案里岗位写了「水吧 / 保洁 / 厨房 / 后勤 / 库管」⇒ 不是前台;写了「前台 / 收银 / 店长 / 值班经理」⇒ 一定是前台;岗位没写的,就看排班表里允许他排的班次 —— 只要有一个不是水吧 / 保洁班次,就算前台。刚入职还没排过班的人先按前台算,宁可多给一个人看到,也不能让新来的前台打不开表。
④ 没绑定手机(前台收银机那种公用设备)不知道是谁 ⇒ 照常放开,不会拦。
⑤ 后台兜底:水吧 / 保洁的人就算绕开界面直接发请求,也存不进来(会被拒),避免有人把前台的表填乱。
实际名单核对过:章玲、黄曼琳(水吧)和廖正专、杨忠辉(保洁)不会再出现在交接班里,前台 6 人 + 管理 3 人照常。以后谁要交班,在排班表里给他排一个前台班次就行。
构建 20260921zk19 · 交接完成时间默认此刻 + 长期跟进改成第 8 项勾选
按你的要求改了两处:
① 交接完成时间不再空着:打开交接班表就默认填当前时间(旁边有「现在」按钮,开了一会儿再提交就点一下改成此刻);补录以前的日期时,默认填那个班次的收班时刻(通宵、晚班这种跨夜的自动算到第二天)。真没填也不会丢,后端按提交时刻记 —— 兑现输入框上那句「留空 = 提交时刻」。顺手修了时间格式:以前带个 T(2026-10-26T16:50),现在统一成2026-10-26 16:50。以前提交过的记录也不再显示「—」,用当时的提交时刻顶上,列表和详情同一个口径。
② 「长期跟进」搬进班次情况检查,成了第 8 项:原来的自由文本框(美抖平台扫码买券、好评、短视频拍摄)拆成 美团好评 / 抖音好评 / 扫码 / 短视频 四项各自勾选,勾上之后出现数量框(这一班做了几次),可以逐项填。四步都勾齐才算这一项做完 —— 没勾齐就算有问题,和检查异常、盘点不符一样标红、一样要勾「已解决」才转绿,列表的「检查异常」列会写清楚是哪几项没勾。以前提交的老记录没有这一项,不会被倒过来判红。
构建 20260921zk18 · 有问题的班次标红 + 「是否解决」勾选变绿
按你的要求:① 「🕒 交接班考勤」里这一班有异常就整行标红(浅红底 + 左侧红条);② 表格最后新增一列「是否解决」,核实处理完勾上,这一行立刻转绿,勾选框旁的「待处理」变成「已解决」;③ 什么算「有问题」统一了三类:7 项班次检查里有非正常选项、商品盘点「不符」、账目差额不为 0 —— 页面不自己猜,和后端同一个判断;④ 没问题的行不染色、也不给勾选框(显示 —),因为本来就没有「解决」可勾,全染色反而看不出该处理哪条;⑤ 勾选框只改这个结论不改交接班内容:金额、检查项、盘点、交班人仍只能由当班人在打卡页重新提交,后台不能替你改账;⑥ 每次勾选都留痕(谁、什么时候、哪个 IP),明细里能看到异常处理状态和具体问题清单;⑦ 前台之后又改了这张表、导致问题变了,之前打的勾会自动回到「待处理」—— 不让旧的结论冒充新的确认。
构建 20260921zk17 · 交接班「详情」改成就地展开
按你的要求,交接班考勤里的明细不再另开窗口:① 点「详情 ▾」直接在这条记录的正下方展开整张表(班次检查 7 项 / 商品盘点 6 类 / 待办 / 营收对账 / 问题说明),再点一次同一个按钮就收拢,按钮文案在「详情 ▾ / 收起 ▴」之间切换;② 同时只展开一条 —— 点另一条会把上一条自动收起,避免表格被拉得老长、也避免开好几份叠在一起看不出是哪个;③ 顺手省掉了重复请求:原来每点一次详情都要重新拉一遍整月列表,现在只用记录 id 取那一份明细;④ 行内明细里不放「← 返回列表」按钮(本来就没有列表可退);⑤ 「📋 交接班记录表」那个汇总弹窗保持原样 —— 它是列表视图,本来就该独立看。
构建 20260921zk16 · 「交接班考勤」显示员工实际填写的记录
你说「昨天有员工交接班了却没有记录」,查下来是这个原因:工作台「🕒 交接班考勤」读的表,和员工填的表不是同一份。员工在打卡页填的交接班表存进 handover.json(昨天已经有 3 张:周林林早班、闵婕中班、成紫涵通宵班),而这个板块读的是 attendance.json —— 那是早先手工登记 / Excel 导入用的,两个门店一直以来都是空的,所以永远显示 0 条。
① 现在这个板块直接读同一份数据,员工在 /punch 填完,这里立刻能看到;② 进入板块默认就是当前月份,月份下拉里列出所有有记录的月份,没有记录的月份会明确写「这个月还没有」并指路到打卡页;③ 表头沿用你熟悉的那几列(日期 / 班次 / 交班人 / 接班人 / 交接时间 / 网费现金 / 商超现金 / 实收现金 / 备用金 / 差额 / 备注),点「详情」能看整张表(只读,后台改不了,改了就没人认账);④ 同一天按班次真实先后排(通宵 01:00 → 早 09:00 → 中 13:00 → 晚 17:00),不再按中文名的编码顺序乱跳;⑤ 去掉了「+ 登记交接班 / 导入考勤表 / 模板示例」三个入口 —— 它们写的是那张永远空的旧表,留着只会继续误导。
构建 20260921zk15 · 交接班表先隐藏「班长工作检查表」
按你的要求,先把交接班记录表里的班长部分收起来:① 打卡页交接班表不再显示「11 项班长工作检查」,下面签字区的「班长签字 / 完成时间」也一起收起来(没有 11 项可勾,单留一个班长签字没意义);② 段号改成自动编号,收起后是连续的 1~6,不会跳号;③ 只是不显示,数据一点没动 —— 每张表里的 11 项仍然照常保存,以后要放出来改一个开关就行,历史记录不受影响;④ 提交从来不会因为班长项没勾而拦你(只拦「哪个分类没填实盘」「填了差额却没写原因」),所以现在照样一次提交成功。工作台的明细页同步隐藏了这一段。
构建 20260921zk14 · 打卡页加上「前台交接班记录表」
把店里那张纸质《前台交接班记录表》搬进打卡页:① 打卡页 /punch 顶部加了「⏱ 打卡 / 📋 交接班记录」两个 Tab,也可以在链接后面加 ?tab=handover 直接打开交接班表(前台可以存成书签,交班时少点一步);② 表的内容和纸质版一一对应 —— 4 个班次(早 09:00-17:00 / 中 13:00-21:00 / 晚 17:00-01:00 / 通宵 01:00-09:00)、7 项班次情况检查(每项二选一 + 情况说明)、6 类商品盘点(口粮·槟榔·饮料·零食·百货·外设)、3 项待办、营收对账(网费现金 / 商超现金 / 收款合计 / 备用金 / 账目差额)、11 项班长工作检查、问题说明与班长签字;③ 会自动算的都不用手算:「系统库存」留空时按「期初 − 本班销售」推,「差异损耗 = 系统 − 实盘」,正数是少了、负数是盘多了,旁边直接标「相符 / 不符」;「实际收款合计」留空时自动等于网费现金 + 商超现金;④ 提交要过本人的 4 位打卡 PIN(和打卡同一套),**交班人以 PIN 验证过的名字为准**,改前端传别人的名字无效;⑤ 一个班一张表:同一天同一班重复提交是覆盖更新并留改动痕迹,不会堆出两张半成品;⑥ 工作台「员工打卡」里新增「📋 交接班记录」,按月看列表和明细(检查异常、盘点不符、班长完成几项一眼可见),后台只读 —— 要改得让当班人自己在打卡页重交;⑦ 免登录的打卡页只能看今天和昨天,往期记录必须登录工作台才看得到。
构建 20260921zk13 · 补齐历史:云端还留着的 3 个月,一次全拉回来
上一版保证了「不覆盖」,这一版补上「拉得到」:① 找到真正的原因 —— 「导入」的默认区间一直是「本月 1 号 ~ 今天」,**已经过去的月份永远不会被拉取**,等云端 3 个月窗口滑过去就永久丢失(达摩店 2026-07-22~08-31 共 41 天、14227 单就是这么缺的;实测云端最早正好卡在 2026-07-22);② 网费页、商超页各新增「⏪ 补齐历史」按钮:从今天往前按整月分段回填,每段导入后立即合并落盘,中途断了已补的不会丢、再点一次即可续;商超把「订单 + 销售汇总」绑在同一段时间里补(商品×日矩阵只能在导入时生成,漏一月就永久补不回);③ 默认区间改成增量口径(本地最后一天 ~ 今天),以后每天同步既快又不会漏月;④ 老文件缺「商品×日」矩阵时会自动从本地最早日重建,不再只拉近 3 个月;⑤ 补齐过程只回统计数字、不回上万条明细,页面不会被拖死;⑥ 「近 3 / 6 / 12 月」按钮按你选的月份走,语义不变。
构建 20260921zk12 · 3 个月以前的云端数据,任何同步都不再覆盖
按你的要求把「云端只留 3 个月、更早的必须留在本地」变成硬规则:① 新增**历史保护区**(早于「今天 − 92 天」):这段日期的网费订单、商超订单、销售汇总商品×日格、交班记录,**即使落在本次云端返回的窗口之内**、云端没给,也一律保留 —— 以前只要云端把窗口报大一点,窗口内的老数据就会被当成「云端已删除」清掉;② 修掉一个更隐蔽的坑:以前导入时代码是「读不出旧文件就当空数据」,一旦旧文件正被别的线程写/读到半截(12MB 的商超订单很容易撞上),合并就变成「拿空数据合并」⇒ 本地几年历史被云端那 3 个月整份覆盖。现在**读不出就中止导入**并提示重试,绝不覆盖;③ 销售汇总若某次没取到商品明细矩阵,保留原有矩阵而不是整份覆盖;④ 上机分析在算不出增量起点时改为「按窗口合并」,旧格式重建前先把旧文件另存为 .legacy_* 副本;⑤ 网费/商超页面会如实显示「其中 N 天已过云端保留期(本地存档,不会被同步覆盖)」。
构建 20260921zk11 · 打卡链接自动归一化 + 二维码直达打卡页
修两处由「外部访问地址」配置方式不当就会踩到的坑:① 用户常把整页地址直接粘进「🌍 外部访问地址」(如 http://公网IP/punch?shop=damo),而拼接打卡接口时还会再补一段 /punch,会得到 .../punch?shop=damo/punch 这种畸形地址 —— 现在统一做归一化(剥掉查询串与结尾的 /punch,但保留反代子路径前缀),管理员在工作台里点打卡也不会再打错地址;② 手机端接入页的「🏠 店内局域网」「🌍 公网地址」两张码,改为直接出**员工打卡页**完整地址(…/punch?shop=达摩店)而不是工作台首页,扫了就是打卡页;③「IP与端口」页的填写提示写清楚:只填到端口(http://公网IP 或 http://公网IP:8765),不要粘整个打卡页地址。
构建 20260921zk9 · 员工手机打卡放开闸门(拍完照也能直接打卡)
修「手机拍完到店照还是提示『请到前台收银机打卡』」—— 根因是前台打卡机 IP 白名单(station_ips)把打卡动作绑死在收银机 IP 上,而员工手机经公网地址 / 路由器端口转发到达服务器时,来源 IP 已被 NAT 改写、永远不在白名单内,于是 can_punch 判定为假、手机只能拍到店照、打卡被 403。现在:① 只要「🌍 外部访问地址」已配置(即开启了员工手机打卡),打卡闸门直接放行,手机端显示完整打卡界面、in/out 写入不再被拦;② 真实鉴权仍交给员工 PIN(/api/punch/do 照常校验),链接泄露也不会被冒用;③ 清空外部访问地址即恢复「只允许前台收银机打卡」的严格模式。员工手机连店内 WiFi 或用流量都能正常打卡。
构建 20260921zk8 · 内网/外网地址分设 + 修「IP与端口」页打不开
① 修掉一个真 bug:点「⚙ → IP与端口」整页没反应 —— 根因是 renderServe 在 const 声明 hostVal / portVal 之前就访问它们(暂时性死区 ReferenceError),函数整体崩溃、页面空白。现已把赋值挪到声明之后。② 把「内网地址」和「外网地址」拆成两个独立可配置字段:新增「🏠 内网访问地址」(店内局域网地址,同网段设备用,一般自动检测无需改)与保留「🌍 外部访问地址」(路由器公网地址 + 端口转发,员工手机打卡用),两者分开保存、互不覆盖。③ 打卡二维码/链接地址优先级改为「外部地址 → 内网地址 → 当前域名」,员工手机连店内 WiFi 或用流量都优先走外部地址。④ 手机端接入页拆成三张独立卡片:🏠 店内局域网 / 🌍 公网地址(手机打卡)/ 🔗 外网通道,分别出码、分别复制,不再混在一张卡里。
构建 20260921zk7 · 手机打卡走公网地址(员工手机连店内 WiFi 或用流量都能打开打卡页)
解决「员工手机连店内 WiFi 时,用内网 IP 打不开打卡页」的问题(路由器做了端口转发、用公网 IP 能打开,但二维码/链接里带的是内网 IP,WiFi 段路由不通)。① 服务设置新增「🌍 外部访问地址」输入框(填路由器公网地址 + 端口,例如 http://公网IP:8765):打卡二维码与链接优先用它,空则回落内网地址。② 手机端接入页「🏠 店内局域网」卡在有外部地址时改为「🌐 公网地址(店内/店外通用)」并改用该地址出码。③ 外部地址保存采用合并式落盘,且与 host/port 互不覆盖;只改外部地址无需重启服务。④ 前台机白名单(station_ips)已覆盖店内 WiFi 网段(192.168.110.0/24)与收银机网段(192.168.124.0/24),手机经路由器转发到达前台机时仍判定为「店内设备」可正常打卡,店外直连公网则按白名单拦截。
构建 20260921zk6 · 排班表默认当前月 + 员工打卡页优化(工具条分组 / 月份前后翻 / 明细筛选 / 勾选不再整页重画)
① 修掉一个真 bug:点「📅 排班表」按钮时,工具条的点击回调把浏览器 MouseEvent 当「预设月份」传进了排班表 ⇒ 月份变成一串无效值 ⇒ 排班表整张空白却不报错。现在工具条不再透传事件对象,排班表也只对 YYYY-MM 形状的月份买单;默认月份 = 当前月,且跟随打卡页选中的月份一起走。② 工具条从「10 个按钮一字排开」改成四组(📝 记录 / 📅 排班 / 📱 打卡 / 📤 同步),每组带小标签,找按钮不用再从头扫一遍。③ 月份切换加了「◀ 上月 / 下月 ▶」和「回到本月」快捷 —— 翻历史不用每次展开下拉。④ 打卡明细新增「员工」下拉与「只看异常」勾选,并显示「当前显示 N / 总数」,另有「清除筛选」一键还原;被筛掉的行会同步从批量选择的集合里摘掉,不会误删看不见的记录。⑤ 勾选记录不再整页重画:以前勾一下就重新拉一次整月数据并重建整页,人多时明显卡顿,现在只更新「批量删除」按钮与全选框。
构建 20260921zk5 · 财务总览打磨(图表实例收口 + 空态提示 + KPI 卡统一)
① 图表实例收口:以前每渲染一次(切日期区间、刷新数据)都会在画布上新建一个图表实例、旧实例从不销毁,反复切换会越堆越多、页面越来越卡;现在统一走一个收口函数,重建前先销毁旧实例。② 图表空态:区间内没有收入 / 支出 / 月度数据时,面板给出「本期没有收入记录」这类居中提示,不再留一片空白看不出是没数据还是没画出来。③「本期记录」表在无记录时显示空态行,记录超过 20 条时标题注明「显示最近 20 条」。④ 排版收口:KPI 卡片网格去掉内联列宽覆盖、统一用全局自适应令牌;「本期分红」卡原来是一堆内联样式、和旁边四张卡观感不一致,现在改用同一套 CSS 类(顶部分红条 + 分红色数字),五张卡完全对齐。
构建 20260921zk4 · 优化工作台(排班表默认不显示员工 + 精简导航重复入口)
① 排班表默认不显示任何员工:打开后表格只显示日期 × 班次结构,员工名字不出现;顶部新增「👥 选择 / 全选 / 清空」的「查看员工」筛选,勾谁才显示谁(避免一打开就满屏名字;未勾选的人即使排了班也不会显示)。② 默认月份 = 当前月份。③ 精简导航重复入口:把「收入明细 / 支出明细」并入「全部明细」(它已带「仅收入 / 仅支出」类型筛选),票据的「进项 / 销项 / 项目」并入「票据总览」并在其顶部加「全部 / 进项 / 销项 / 项目」快捷筛选 —— 零功能损失,侧栏入口由 41 个精简到 36 个,更整洁。
构建 20260921zk3 · 修「有时候打开数据全空」:并发写把数据文件写坏 + 前端不再静默清空
修「工作台有时候打开后数据全是空的」 —— 根因是**并发写把数据文件写成了空文件或半截文件**:① 会话校验原来**每收到一个请求**都会把 24 小时有效期续期一次、并整份重写 auth.json(93KB),而重写是先截断文件再慢慢写 —— 前端首屏会并发发 7 个接口,只要有一个线程正卡在写入窗口,别的线程读到的就是空文件或半截内容,解析失败变成 HTTP 500,前端又把错误当成「没有数据」,于是页面金额全 0、图表全空,看起来像账目丢了(实际账本一直好好的)。② 会话改为**只在剩余有效期不足 12 小时才续期**(最多每 12 小时写一次,不再每请求写一次)。③ 所有 JSON 落盘统一改成**原子写**:先写同目录唯一临时文件、fsync 落盘再整体替换,同一文件加进程内写锁 —— 票据、工资、交接班、认证、门店、界面偏好、服务配置全部改造(这些原先都是直接覆盖,一并发就互相截断)。④ 读取统一改成**容错读**:Windows 下以「允许别人同时替换」的共享方式打开 + 短暂重试;仍失败会把坏文件另存 .corrupt_<时间> 留证据,并**自动从 backups 恢复**,绝不再拿空结构盖掉真实数据(交接班原实现读到坏文件就直接用空默认值覆盖)。⑤ 前端拿到结构不对的响应**不再静默清空** —— 保留已有数据,顶部弹出「数据没能加载出来」提示条并给出重试按钮。⑥ 备份动作全部加容错:备份失败只记一行日志,绝不让「保存」因为备份失败而报错。
构建 20260921zk2 · 排班表改成「日期 × 班次」矩阵 + 离职员工不显示
排班表改成「日期 × 班次」矩阵 —— ① 排班表从「先选一个员工 → 该员工月历」改成**全员矩阵**:行 = 日期(几号 + 星期X)、列 = 各个班次(表头带 HH:MM-HH:MM)+ 末尾「当日休息」,格子里直接是**人名**(一格可多人),跟店里贴墙那张表一样。② 框选改成**行 × 列矩形**:按住鼠标从某天某班拖到另一天另一班,松手弹出在职员工名单,勾谁谁上这些格(框到多个班次列时,一个人一天只排进最左那一列 —— 一天一个班);取消勾选就把人挪到「当日休息」,不会凭空消失。③ 名单底部「清空这些格」只清单独安排(周期 / 每日固定推算出来的不动)。④ 已离职的员工**不进名单、也不显示在表格里**(打卡名单本来就已经滤掉离职,这里连老排班数据里的残留条目也不渲染)。⑤ 工具条按钮跟着改名:「🗑 清空本月单独安排」;「🔄 按周期铺满」里新增员工下拉(矩阵视图下没有「当前员工」);「📋 复制上月」改成复制所有人。
构建 20260921zk · 排班三件套改页内展开 + 修浮层「看不清楚」
排班三件套改成页内展开 + 修浮层「看不清楚」 —— ① 「📅 排班表 / 🕐 班次模板 / 🔁 排班周期」不再弹小窗:点按钮直接在「🕒 员工打卡」卡片**下面**展开(再点同一个按钮、或点面板右上角「收起 ▴」即收起;换按钮就换内容),改完抬头就能看到上面的月度汇总;拖选时鼠标拖出面板也不会丢(监听改绑 document,并统一登记、收起/重渲染时解绑)。② 修掉「拖动框选后浮层看不清」:浮层底色原先写的是 background: var(--bg-primary),而本主题**没有**定义这个变量(只有 --panel / --card / --card-alt / --bg-secondary),浏览器把整条声明当无效丢掉 ⇒ 浮层没有底色,文字直接叠在月历格子上;并且它用 position:absolute + scrollY 定位,面板内部一滚动就飘到别的格子上。现在改为实心 var(--panel) + 投影 + position:fixed(靠近窗口底部自动向上翻转,班次多时浮层内部滚动)。③ 月历格子放大:日号与班次都 13px、单元格最小高 60px,班次允许换行(「早班/中班/插班/通宵」不再被压成一行省略号)。④ 工具条下面那三行长说明(打卡地址 / 出勤天数口径 / 排班概览)整块去掉 —— 用户明确说「这个不需要显示」;打卡地址仍在「🔗 打卡页链接」的二维码里。
构建 20260921zj · 排班表改成「先选员工 + 拖动框选」+ 员工资料四列可改
排班表从「一整张全员大表」改成「先选员工、再看这个人的月历」——上面一个员工下拉(带 ◀ ▶ 换人,记住上次排的是谁),下面只显示这个人的当月日历(7 列、周一起算,今天带蓝框);按住鼠标拖过几天松手弹班次选择,**跨周也能一次选一段连续日期**(3 号拖到 10 号 = 那 8 天一起改),点单格照旧只改一天。① 单员工视图下「🔄 按周期铺满 / 📋 复制上月 / 🗑 清除本人整月」都只作用于当前这位员工 ——清除整月由「整店清空」改成「清除本人」,不再有误清全店的风险(Excel 导入导出仍是全员矩阵)。② 📇 人员档案的「员工信息」表格里直接可改 **入职日期 / 职位 / 部门 / 状态** 四列(以前藏在展开行里),改完点该行 √ 保存;状态改「离职」后自动从打卡名单与排班表里消失。③ **修掉一个真 bug**:保存「🕐 班次模板」时 op=shifts 的合并参数漏了 cycles / cycle_assign,normalize 会把它们兜成空 —— 于是「改一次班次模板」就把整店手建的排班周期静默清空了(zh 起就存在,本轮按「先建周期、再改模板」复现并修掉)。
构建 20260921zi · 排班拖选 + 关于 / 帮助
① 排班表月视图新增拖动框选批量选班:按住鼠标拖过一片格子(跨行跨列都行),松手弹出班次选择,整片一次设好,几十格不用再一格一点;单格点选照旧可用。② 右上角 ⚙ 菜单新增「关于 / 帮助」:关于 = 工作台介绍 + 完整更新日志;帮助 = 面向员工的使用说明(怎么打卡、怎么看排班、常见问题)。③ 登录页页脚精简为一行版本号,历史更新日志全部挪进「关于」。
构建 20260921zh · 企业微信式排班(N 天循环周期 + 月表格视图 + Excel 导入导出)
企业微信式排班(N 天循环周期 + 月表格视图 + Excel 导入导出)—— 员工会换班,原来的「每天固定」表达不了「上三休一 / 做五休二」这种按规律循环的排班。① punch.json 的 shifts 新增 cycles{周期名:{days:[班次…], anchor:起始日}} 与 cycle_assign{姓名:周期名},生效优先级扩为「当天单独安排 schedule > N 天循环周期 cycles(按起始日取模)> 每日固定 assign > 未排班(不受时段限制)」,老的 assign 一点没动、老门店升级当天行为完全不变;② 工作台班次区拆成三个入口:「🕐 班次模板」(原有)+ 「🔁 排班周期」(建/改名/改循环天数/改起始日/删除 + 逐人选择套用哪个周期,最多 8 套、每套 1~31 天)+「📅 排班表」;③ 排班表改成企业微信那种月视图表格(行 = 员工、列 = 当月每一天,表头带星期),点格子直接选「跟随周期 / 休 / 某个班次」,几十格先进草稿、点「保存整月」才一次提交,另有换班、按周期刷整月、复制上月、清除整月;④ Excel 导入导出闭环:导出 / 模板 / 导入三处列头完全一致(姓名 · 部门 · MM-DD 周X),导出只写「单独安排过的固定安排」、空格 = 跟随周期,导入时空格 = 不动(要清空须显式写「跟随周期」)⇒「导出 → 改几格 → 导入」严格幂等,不会把整月覆盖误清掉;清洗规则集中在 punch_schedule.py 的纯函数里,前端预览直接调后端 dry_run=true,不在前端另写一套校验;⑤ 安全退化方向固定 —— 周期 / 单日里认不出的班次名一律按「休」处理,绝不退化成「未排班」(未排班 = 全天随便打,比休假危险得多);起始日期不合法 ⇒ 整套周期作废(没有「第 0 天」就没法算循环落点),绝不静默生效;⑥ 跨语言一致性:Python 的 % 对负数天然返回正余数,JS 的 % 返回负值 ⇒ 前端必须手写 ((off % len) + len) % len,否则历史日期算出 undefined、整格空白(已用静态断言钉死)
构建 20260921zg · 按日排班 / 换班 / 休息日
按日排班 / 换班 / 休息日 —— 员工会换班,原来的「周期排班」表达不了「今天谁上哪个班」。① punch.json 的 shifts 新增 schedule{日期:{姓名:[班次…]}},生效优先级为「当天单独安排 > 周期 assign > 未排班(不受时段限制)」,班次实例逐日各按当天的安排生成(跨天夜班也正确);② 工作台新增「📅 按日排班 / 换班」:选日期逐人指定班次或标「休」,一键两人互换当天班次(只写这一天,周期不动),可复制到明天 / 清除当天 / 前后翻天;③ 标「休」的那天打卡照常放行(临时来上班也能打)但不判迟到早退,且下班卡不会把「休」回填成前后日的真实班次;④ 换班与改动写 shift_log(留最近 200 条,含操作人、时间与改动前后值)
构建 20260921zf · 前台打卡机 + 到店照
前台打卡机 + 到店照 —— 打卡必须在前台收银机上完成,照片由员工自己的手机拍。① 打卡规则新增「前台打卡机 IP 白名单」(rules.station_ips,支持单 IP 与 CIDR,最多 20 条,留空 = 不限制,老门店升级后行为完全不变);名单非空时只有名单内的机器能提交上下班卡,其他设备打卡一律 403 not_station 并提示「请到前台收银机打卡」(action=verify 不拦 —— 它不写数据,拦了员工连自己班次都看不到)。② 员工手机端不再出现任何打卡按钮:点自己名字只拍「到店照」、上传到 punch_pending/<YYYYMMDD>/,页面提示去前台打卡;拍照走 <input type=file capture> 调系统相机 —— http://192.168.x.x 不是安全上下文,getUserMedia 根本调不起来,这是手机上唯一能用的拍法。③ 前台机打卡时自动取该员工当天最新一张到店照挂到这条卡上(photo_src=arrive,优先于本机摄像头),补打昨天的下班卡不会拿今天的照片当证据。④ 工作台「⚙ 打卡规则」里可编辑白名单并有「加入本机 IP」按钮,打卡明细照片列标注「到店照」;到店照暂存 7 天自动清理,挂到卡上的副本按照片保留天数清理。
构建 20260921ze · 云端历史合并
云端历史合并 —— 万家云 / 万家云商超后台对交易类数据只保留约 3 个月,同步时不再覆盖更早的数据。① 网费、商超订单、销售汇总、进货/出库/报损单据、网费交班、商超交班 六个导入端点全部由「整份覆盖」改为「合并式落盘」:本次拉取窗口之内以云端为准(云端改金额、作废单据才能生效),窗口之外保留本地历史—— 云端一过保留期就再也拉不回来,本地是唯一副本。② 销售汇总的合并落在「商品×日」矩阵上(按天取并集,窗口外的格子原样保留),合并后重算 items / range,保证 KPI 与商品排行同一口径;升级后第一次导入会自动把起点前移到本地最早一天,避免那几天永久失去商品明细(矩阵只能在导入时由明细生成)。③ 单据合并后 summary 从合并结果重算,不把两次 summary 相加(初始化 9999 占位单会被算两遍);进货单 / 明细 /出库 / 报损分别按 order_id / detail_id 取并集。④ 会员同步保留「本次窗口内没出现」的老会员:原实现从窗口订单重建 members,4 个月前才来过、近 3 个月没来的人会整行消失(连等级/余额档案一起丢,云端 4000 人、本地越同步越少),补回来的行标 stale_since。⑤「同步到收支」默认只写最近一次导入窗口(合并后 daily 已是全量,照旧全量同步会把整年流水一次性灌进收支),要补历史需显式传 start/end 或 all=1。⑥ 页面如实标注:网费页 / 商超页 / 经营分析显示「本地已累积 N 天(云端仅 3 个月,更早为本地保存)」,导入成功显示本次新增天数;只有日汇总、没有商品明细的极老数据单列 legacy_days / legacy_net,不混进 KPI、也不假装有明细。⑦ 流水明细上限 60000 条(约 30MB)保护:超出按最老日期裁剪,并在提示与 history.trimmed 里写明裁掉多少条,绝不静默丢数据;按日聚合永久保留。
构建 20260921zd · 经营分析时间段筛选
万家云商超经营分析时间段筛选:今天 / 近 7 天 / 近 30 天 / 本月 / 上月 / 近 3 月 / 全部 + 自定义起止,销售类指标与进货额、报损额按区间重算(库存 / 商品档案仍为当前时点,门店对比为各自导入区间)· 导入新增「商品×日」矩阵支撑任意区间,老数据需点一次「刷新销售汇总」重建(页面会如实提示)· 区间内无数据 / 日期格式非法 / 起止写反都有明确处理
构建 20260921zc · 员工资料 + 台账导入导出
员工资料导出/导入(按姓名合并:同名更新、新名追加、空单元格不覆盖、不删现有档案;身份证 18 位 / 手机 11 位校验,不合规的行跳过并报行号)+ 游戏活动网费赠送台账导出/导入(导入只登记台账、不真发网费、不重复记账;按记录ID 与「会员+日期+成就+金额」双重去重;导出列与导入模板逐列一致,导出→改→导入闭环)
构建 20260921zb · 打卡防代打与排班
打卡防代打与排班:班次时间窗(排了班只能在自己时段内打卡、支持跨天夜班)+ 员工手机绑定(一人一机,绑定后只显示他自己) + 打卡拍照留证(默认能拍就拍、拍不到照常打卡;照片只给管理端看,按天数自动清理) · 迟到早退改为按各人自己的班次判定 · 工作台新增「班次管理 / 打卡绑定」与照片查看
构建 20260921za · 员工打卡 + 列宽拖拽
员工打卡(员工免登录自助打卡 + 出勤天数同步工资表 · 出勤天数按「上下班配对才算 1 天」 · 表格列宽可拖拽:拖表头右侧左右拖动即可调整列宽 · 双击手柄整表恢复自适应 · 按板块记忆宽度)
构建 20260921y · 凭证更正
凭证更正重打包,修正密码电竞商超登录密码
构建 20260921x · 电竞馆财务能力全量补全(大版本)
电竞馆财务能力全量补全:新增 6 组导航 12 个板块 —— 📒往来对账 / 🏗️固定资产 / 📄利润表 / 💵现金流量表 / ⚖️资产负债表 / 🎯保本点分析 / 🪑单机坪效 / 🥤交叉销售 / 📉会员流失预警 / 🔧机器故障 / 🏆赛事活动 / 🧾税务归集 · 登录倒装:先输手机号+密码,验证通过后才列出有权限的门店再自选 · 账户互转回归为收入/支出类别:转出记支出、转入记收入 · 实际存款余额 = 期初余额 + 收入 − 支出 − 分红 · 期初余额在「设置 → 账户管理」里填 · 会员分析时间段筛选 · 未知区域按机器回填 · 日线趋势 · 会员分析不在页面同步万家云 · 上机分析增量更新 · 会员身份证 · 区域机位数与单台收入 · 万家云对接加固 · 多门店并发隔离 · 真实统计区间 · 分页截断告警 · 单据口径互证 · 原子写省 37.6% 体积 · 腾讯云控制台风格 · 左侧竖导航 · 布局随分辨率自适应 · 商超资料整合 · 经营分析毛利 · 固定域名免费 HTTPS · 常驻运行 · 悬停下拉不丢手 · 查询结果导出 Excel · 会员当月充值分级筛选 · 会员上机分析