更新日志

改了什么,
一条条记在这里。

已经上线的直接写;还没上线的会标明「尚未上线」。 目前共 794 条
同一条更新可能同时属于多个模块,因此各模块条数相加会大于总数。

人事考勤

老板

小程序在排班等页面切换门店后页面不刷新,已修;会计摘要不再露英文事件码

  • 小程序「排班」页(以及同样放在标题栏里切换门店的其他分页页):点「切换」换到另一家店后,页头店名和下面的内容原来都不动,要退出再进才变。现在换店后页头马上变成新门店,各分页按新门店重新读数据。
  • 网页会计分录:「摘要」一列不再以英文事件码(如 member_topup)开头,只留单号;新增事件名「会员余额提现」。导出的 CSV 仍是原始摘要,方便和账套逐行对。

排班打卡财务/日结/流水

老板

请假、报销确认带提交人,排班标请假/临时班,扫码点单终端不能指派给员工

  • 请假确认单带提交人姓名(没有姓名用手机号),不再写「(未知提交人)」;报销类别用报销自己的中文,金额补到两位小数。
  • 排班「我的」:已批准的假盖住的那天写「请假」(本来有班就写班次加「· 请假」);今天没排班但有没下班的卡写「临时班」。请假表单今天已打上班卡时给出橙色提醒,不挡提交。
  • 看不到收款也看不到报表的人,加菜抽屉写「本单已 —」,不再写「¥0.00」。服务员首页大按钮写「实时桌况」。
  • 「扫码点单终端」角色不能指派给员工(服务器拒绝);指派真岗位后会撤掉同店的「待分配岗位」;名字含「扫码点单」的账号放到员工账号页最下面,停用要先确认。

排班打卡报销员工账号与权限

老板尚未上线

今日班次:没交的班标出哪天开的、开了几天,并可代为交班

  • 排班 › 今日班次上,不是今天开的班会写「开班 8/26 13:16 · 已 29 天 · 没交班 · 现金没点过」;以前只印时分,看起来像今天下午开的。
  • 有代理交班权限的人,在这里就能代为交班;没有权限的人会看到说明,不是一个按了会失败的按钮。

开班交班排班打卡

老板尚未上线

排班、应收、应付、提现审核:没有资料时,日期和筛选不再跟着消失

  • 排班页选到没人排班的日子时,切换日期的周列会一起消失,人被困在那一天;今天没排班就看不到这周任何一天。现在周列一直都在,并标明选的是哪天。
  • 应收、应付、提现审核三页的预设筛选没有资料时,切到「全部」的按钮也会消失;现在筛选一直都在。

排班打卡财务/日结/流水

店长

月度出勤把「还没到的班」记成旷班——演示店 14 个班全标旷工,其中 10 个在未来

  • 用受限账号打开「人事 → 排班 → 月度出勤」,第一眼看到的是:演示店长 排班 14 · 准时 0 · 迟到 0 · 早退 0 · 旷班 14。
  • 点开明细才发现,当天是 9 月 22 日,而那 14 个班排到 9 月 27 日 ⇒ 其中 10 个在未来,包括「今晚 18:00 的班」。系统把一个还没发生的班,写成了这个人旷工。
  • ⚠️ 这比一般的「读不到当成 0」严重一级:旷班不是一个空值,它是对一个有名有姓的员工的指控,而且它会进工资(没来=不给钱)。老板看到「旷班 14」会去找这个人谈。
  • 根因是判定函数里完全没有时间判断:只要找不到对应的打卡记录,就无条件算旷班。⇒ 这对任何店都成立,不是演示数据的问题——只要这个月里有还没到的班就会发生,而「这个月剩下的班」本来就永远是未来的。
  • 判准用「班结束了没有」而不是「班开始了没有」:一个 10:00–18:00 的班,中午十二点他可能还没打卡但人在路上,这时候说旷班一样是假的。只有班都结束了还没有任何打卡,才谈得上没来。
  • ⚠️ 下一个人:跨夜班必须看排班的结束时刻,不是看日期。22:00–06:00 的班日期是「昨天」,用日期判会让它在第二天早上六点前都被误判成旷班。已经有测试钉住这一格(凌晨三点 ⇒ 未开始)。
  • 现在多一栏「未开始」,不标红色——它不是坏消息,只是还没发生。标红会让老板去找一个没做错事的人。

排班打卡

店长

班表上那句解释只在「读不到名册」时出现,而 65% 的情况走的是另一条路

  • 上一轮补的那句解释挂在「名册读取失败」上。但名册读得到、而这个排班对象不在名册上时,格子照样只显示编号,而那句解释不出现——看到的跟修之前一模一样。
  • 查了生产库:排班表未删 150 行、不同的排班对象 34 个。其中账号表里找得到的只有 13 个,查无此人的 21 个,账号存在但已停用的 1 个 ⇒ 22 / 34 = 65% 走的是没有解释的那条路。
  • 根因不是业务状态,是孤儿数据:排班行上的员工字段是一个裸 UUID,不是外键 ⇒ 删掉账号不会连带清掉排班行,也没有任何约束会出声。前端把它渲染成「这个员工怎么了」,而真相是「这一行指向一个不存在的人」。
  • 现在两句话分开,而且互斥:读不到名册(店长自己解决得了——去要权限)/有 N 个排班对象不在名册上(店长解决不了,那是数据的事)。两句话的行动不同,所以不能合并成「你没有权限」。
  • ⚠️ 文案刻意不讲时间。第一版想写「这几个人的班还排在这一周」,查了之后是假的:那些行的日期全部落在一个月前,排在今天及以后的 0 行(对照:非孤儿且排在今天及以后的有 52 行,证明那个 0 是真的 0)。而且这一页可以往回翻,我们不知道用户站在哪一周。
  • ⚠️ 下一个人:数的是不同的人,不是格子数。一个人排七天是十四格,报「14 个排班对象」会让店长去找十四个不存在的人。
  • 🟡 那 34 行孤儿数据没有清,它横跨 11 个门店 / 2 个租户。稽核性质的历史排班该不该留是产品决定,这里只负责把它量出来。

排班打卡员工账号与权限

人事

周排班上的「员工 0730170f」现在会说清楚为什么没有名字

  • 整页 14 格都显示一串十六进位,店长看下周班表看不出是谁。
  • 现在分四种说法:看不到姓名(没有员工名册权限)/ 姓名还没读到 / 不在本店名册上 / 没填姓名。
  • 「不在本店名册上」这一种以前完全看不出来——它的意思是这个人离职了或调去别店,而他的班还排在这一周。

排班打卡

店长

班表上一个人被排满七天、每天十三个半小时,而这页一个字都没说

  • 用受限账号真的打开「人事 → 排班」,看到的是同一个人被排满周一到周日,每天两班:10:00–18:00 加 18:00–23:30,等于每天 13.5 小时、一周 94.5 小时。整页没有任何提示。
  • 排班是少数「按下去之前就算得出后果」的画面——打卡记录是事后的,班表是事前的。事后的页面再准,也救不回一个已经排错的月份。
  • 现在会按人给出提示:连排七天没有休息日(《劳动法》第三十八条)、单日超过 11 小时(第四十一条:加班每日一般 1 小时、特殊 3 小时)、整周超过 44 小时(第三十六条)。
  • ⚠️ 只提示、不拦,措辞一律「请确认」不写「违法」。两个理由都是实的:综合计算工时制和不定时工时制是合法的(餐饮很常见,要人社局审批),拦下去就是拦一个合法经营;而且这个判断看不到请假、调休、代班、以及这个人在别的门店的班。
  • ⚠️ 下一个人:这里最贵的坑是跨夜班。酒吧常见 20:00–02:00,结束时间比开始时间小,直接相减会得到负数,负数加进周总时数会让一个排了 90 小时的人算出 60 几小时——提示消失,而画面上一切正常。已按加 24 小时处理并校准过。
  • ⚠️ 版面是一个人一行,不是一条提示一行。演示店只有一个员工所以看起来还好,但八个人的店会变成二十四行橙字堆在格子上面,没有人会读完。提示的单位是人,因为店长的动作是「去调某个人的班」。

排班打卡

店长

班表上十四格全写「员工 0730170f」,而那个人的姓名后台里存得好好的

  • 用受限账号打开周排班,整张表十四格印的都是「员工 0730170f」。查了后台:那个人的姓名是存着的,而且全库 615 个账号里,姓名为空的有 0 个。
  • 所以这串编号从来不是「姓名没填」——它百分之百是「名册没读到」。写法上一个 ?? 把三种完全不同的情况折成同一串字:名册读不到、名册里没这个人、这个人没填姓名。
  • 为什么一直没人发现:员工名册要的是「用户管理」权限,而这一页的门槛是「排班查看」权限。两个不同的码,所以店长进得来、名册读不到。用全权限账号走查永远看不到这一格。
  • 最麻烦的一格:正确的那句解释本来就写好了,就在同一个文件里——但它在「新增排班」表单内,而表单只对有编辑权限的人显示。⇒ 只读的人看得到症状、看不到解释。
  • 而他唯一看得到的权限说明是「安排/调整需要排班管理权限」,讲的是另一个权限。⇒ 这比没有说明更糟:它会把人指到错的方向。
  • 现在把解释放到格子上方(只读也看得到),并且明写这是两个不同的权限。另外「找到了但姓名为空」改成一句不一样的话——今天走不到,但哪天真的出现,它不可以再混进「读不到」那一堆里。

排班打卡员工账号与权限

人事

月度出勤:同一次打卡被拿去对同一天每条排班各算一次——工时翻倍、整班没来被记成「早退」

  • 走查排班页的月度出勤时,把这家店唯一有排班的那个人的原始资料逐条拉出来看:排班十四次、准时零次、迟到两次、早退十三次、旷班零次;而累计实际工时是三千六百分钟,真实只有六天乘以三百等於一千八百分钟。
  • 最刺眼的一条:同一天排了早班十点到十八点、晚班十八点到二十三点半,而当天只打过一次卡、十点到十五点。早班判早退一百八十分钟是对的;晚班却算出「迟到负四百八十分钟」——也就是提前八小时到——而且被标成早退。整个晚班根本没来,系统记成早退,於是旷班那一栏一直是零。
  • 机制是配对的键错了:配对用的是「人加日期」,而真实的轴是「人加日期加班次时段」。於是同一天的每一条排班都拿到同一笔打卡记录。这支函式自己的说明写着它存在的理由就是「才追得到排了班但没来」——而分早晚班正是它追不到的那种没来,因为另一个班的打卡让配对成功了。
  • 第二个后果是钱:同一段三百分钟被累加两次,而累计实际工时正是月度工资估算的「实际工时」来源,工资是实际工时乘以时薪。也就是说工资会算成两倍。现在之所以没人被多发,只是因为时薪普遍没设——那是运气不是保护。分早晚班在餐饮是常态(峰谷排班),不是边角案例。
  • 改了两条,两条都属於无可争议那一类:打卡时段跟这条排班零重叠就是旷班不是早退,人不在场就是不在场;同一笔打卡的工时只能算一次,你不可能把同一段五小时上两次班。迟到早退的判定照算不受影响——那条排班确实被这次打卡覆盖到了一部分。
  • 刻意没碰的那个决定:实际工时现在仍然是「打卡时长」而不是「排班覆盖时长」。做满全天的人,早班拿到全部工时、晚班拿到零(已计过)。改成按重叠分摊会更好看,但那会把排班以外的加班时数丢掉,而那个数字要拿去估工资、於是变成少算。工时口径是产品决定不是技术决定,已另行点名,这里不擅自改。
  • 前端另修一条不同的事:那四栏加起来不等於排班数。一个班次可以同时迟到又早退,而表头把排班数摆在四个计数前面,读起来就像一个划分;实测零加二加十三加零等於十五,而排班数是十四。三个数字都对,只有「它们该加得起来」这个隐含关系是错的,而那个关系只存在於版面顺序里,型别测试契约都碰不到它。只在真的对不上时才出现一行说明,并且两个数字都印出来。
  • 要注意这两条是两件事:後端修完之後这家店会变成十四、零、一、七、七,四栏合计仍然是十五,因为九月二十号晚班那条还是既迟到又早退。所以前端那一行不是後端的补丁,後端修完它照样该在。
  • 验证:新增一支八个案例加一个负控的单元测试,不开框架不连资料库、笔电上就跑得动,用语法树从真正的那个档案挖出受测函式,函式改名或删掉会直接失败。破坏验证裸跑过:把两条规则都注回旧行为,退出码一、恰好两条转红,而且红出来的正是实测值;还原後退出码零。负控独立证明旧算法对晚班会得到负四百八十,跟正式机实测一致。
  • 一个自己踩的坑值得记:第一次跑破坏验证时管线尾巴接了截断指令,退出码读到的是截断指令的零,而输出里明明写着失败。重跑裸的才拿到一。管线最後一段决定退出码。
  • 前端型别检查与两支静态闸门皆零。尚未部署。

排班打卡

老板

排班不用回到电脑前

  • 新增排班页:谁哪天上什么班,在手机上排完
  • 交班留言补上管理者能按的动作——看到问题当场处理,不是只能看着
  • 能不能排班看的是权限,不是职位;店长不在,有权限的人一样排得了

排班打卡

老板

批假之前先看那天还有几个人在

  • 请假审批卡带上「当天在班几人」;这个数后端一直算好了,只是前端没捡起来

排班打卡

这是人事考勤的全部更新。 回按时间看全部。

这份日志从 2026 年 7 月记起,更早的没有逐条列。想看它现在都会什么,回全部功能,或者进演示店自己点一点。