要回答的问题只有一个:同一个字段,什么时候给下拉、什么时候让人打字? 这不是审美问题。同一个值,一个人填「保险理赔」、一个人填「保险」、第三个人填「走保险」, 到了月底统计就变成三行,分账也对不上。凡是会进统计、进分账、进门禁判断的值,一律不许自由填。 反过来,车牌、地址、客户原话这些没法定枚举的,硬做成下拉只会逼人乱选。下面七条规则把这条线划清楚, 后面是全站 25 个原型页、146 个输入控件的逐个判定,以及这一轮改掉的地方和怎么防回归。
date / datetime-local / time,不许用文本框写「2026-11-09 18:00」。time,否则算不出「现在是否营业中」。number + inputmode。金额 step="0.01",工时 step="0.1",里程与数量 step="1"。number 会把 0755 开头的固话吃掉前导 0,把 18 位身份证变成科学计数法。text + inputmode="numeric" + maxlength + 失焦校验 + 明确的错误文案(「身份证应为 18 位,当前 17 位」)。<select multiple>:电脑上要按住 Ctrl 点,手机上根本没法多选,而且选中的项只显示一条,用户看不出自己选了几个。改成一行 checkbox,选了几个一眼可见。.ro),要么明确写「只读 · 谁在哪改」。106 个文本框里,至少 41 处的标签已经写明了它要什么(「金额」「手机号」「预约日期」「到期」), 控件却还是 text。单位是对的,控件是错的——这种错不会报错,只在用户填错和月底对不上账的时候显形。 日期一个都没有,意味着手机上填日期要切键盘、自己敲 `2026-11-08`,敲成 `2026/11/8` 就比不了大小。
剩下的 54 个 text 不是漏改:车牌、VIN、身份证、地址、客户原话、备注这些本来就该自由填, 硬套下拉只会逼人乱选(见 §1 的 B/C/D/E 类)。数量从 131 涨到 146 是因为这轮补了几个原来没有的字段 (预约工位、采购紧急程度、预收金额与用途等),不是老字段翻倍。
store/*.html 与两端手机页的实际控件,「原控件」列记的是改之前的样子,行号也是改之前的位置。四张表的「应为」列现在全部已落地——清点脚本复查为 0 处不符。| 字段 | 位置 | 原控件 | 应为 | 为什么 |
|---|---|---|---|---|
| 预约日期 | booking:150 | text · 2026-11-08 | date · 最早今天 | 能选到过去,排班表就会多出一行过去的预约 |
| 预约时间段 | booking:151 | select · 固定 4 项 | select · 由「预约间隔」生成 | 设置里能改 30/60 分钟,下拉却写死 4 个整点时段,改设置不生效 |
| 预交车时间 | reception:257 | text · 2026-11-09 18:00 | datetime-local | 要在车间卡片上算「还剩多久到期」,文本没法算 |
| 生效日期(提成) | performance:144 | text · 2026-11-15 | date | 提成规则按生效日切版本,日期错了会算错整月工资 |
| 生效日期(定价) | pricing:205 | text · 2027-01-01 | date | 同一批价格按生效日区分版本,影响所有在途单 |
| 入职日期 / 证书到期 | staff:285, 402 | text | date | 证书到期要提前 30 天提醒,文本比不了大小 |
| 到账日期 | finance · 登记回款 | text · 2026-11-08 | date | 账期按到账日算,写错一天账期就错一天 |
| 营业时间 | settings:104 | text · 08:30 – 20:00 | time × 2(起 / 止) | 一整串文本没法判断「现在是否营业」,也没法跨零点 |
| 字段 | 位置 | 原控件 | 应为 | 为什么 |
|---|---|---|---|---|
| 手机号(5 处) | booking:141 · reception:211 · delivery:268 · staff:283 · settings:253 | text | tel + inputmode=numeric + maxlength=11 | 手机弹出数字键盘,不用切输入法;顺手限制位数 |
| 门店电话 / 服务热线 | settings:255 | text | tel(允许横杠) | 0755 开头,用 number 会吃掉前导 0 |
| 车牌 | booking:143 · reception:216 | text | text + 失焦校验 | 格式是「省简称 + 字母 + 5 位」,没法全枚举,但能校验 |
| 身份证号 | delivery:269 | text + maxlength | 保留(已对) | 18 位,必须是 text;这处已经做对了,留作范例 |
| VIN | reception:218 | text · 仅 placeholder | text + maxlength=17 + 失焦校验 | 17 位车架号,写错一位就查不到厂家记录 |
| 字段 | 位置 | 原控件 | 应为 | 为什么 |
|---|---|---|---|---|
| 定损金额 | delivery:236 | text | number step=0.01 | 要和报价 3,800 算差额,文本框进来的是字符串 |
| 交车里程 | delivery:272 | text · 38420 | number + ≥ 进厂里程 | 进厂 32,680 是只读值,交车填小了说明填错 |
| 进厂里程 | reception:219 | text · 32680 | number + ≥ 上次记录 | 上次 32,100,填 3,268 少一位就查不出保养周期 |
| 实际工时 / 计划工时 | workshop:301, 337 | text · 5.5 | number step=0.1 | 工时直接进计件工资,格式错就少发钱 |
| 会员消费 / 回款 / 退款金额 | member:186 · finance ×2 | text | number step=0.01 | 要算余额和欠款,字符串算不了 |
| 申请数量 / 委外金额 | inventory:228 · workshop:541 | text | number | 采购数量进库存,委外金额进成本 |
| 字段 | 位置 | 原来的问题 | 改成 |
|---|---|---|---|
| 客户类别 | reception:215 | 选项写「C 端 1.9 / B 端 1.4 / 加盟 1.2 / 直营 1.0」 | 「个人客户 / 企业车队 / 加盟店 / 直营店」;系数只在定价页出现 |
| 服务类别 | reception:252 | <select multiple size="4"> 原生多选 | checkbox 组,选了几个一眼可见 |
| 品牌车型 | reception:217 | 下拉里只有 1 个选项,选不了 | 品牌 → 车系 → 年款三级,或允许先填后建档 |
| 油量 / 电量 | reception:220 | 只有 1/4、1/2、3/4、满,没有空 | 加油车给 E/F,电车给百分比;补「空 / 0%」 |
| 提成方式 | performance:142 | 选项文字「固定 / 单」被截断 | 「固定金额 / 单」 |
| 技师(派工) | workshop:333 | 负荷写进选项文字「刘洋(在修 1 台)」 | 选项只写名字,负荷显示在右侧一列 |
| 预约来源 vs 客户来源 | booking:147 · reception:245 | 一个 5 项(电话/微信/小程序/到店/合作单位),一个 8 项(自然进店/老客户/…) | 两件事要分开叫:预约渠道(怎么约的)与 客户来源(生意谁带来的);后者决定佣金 |
| 字段 | 位置 | 原来是 | 改成 | 不改为会怎样 |
|---|---|---|---|---|
| 关联车单 | inventory · 采购申请 | 文本框,占位写「没有就留空」 | 下拉,只列在修且等这个件的车单 + 「不关联(做库存)」 | 手打一个不存在的车单号,件到了没人认领,车继续停工 |
| 紧急程度 ↔ 关联车单 | inventory · 采购申请 | 两个字段各填各的 | 选「急」却不挂车 → 提交被拦,并说明该去哪找车 | 「急」和「做库存」自相矛盾,审批人看不出到底谁在等 |
| 车单号(委外) | workshop · 开委外单 | 文本框,预填一个号 | 下拉,只列在修车单;车牌跟着自动带出并转只读 | 车单号和车牌各填一次,两边对不上时谁也不知道信哪个 |
| 预计回厂 | workshop · 开委外单 | 文本框 value="11-11" | date | 「11-11」没有年份,跨年就错;也没法判逾期 |
| 客户(办卡) | member · 办卡/充值 | 文本框预填「陈国强 · 139****6621」 | 下拉只列已建档客户,老客户标「续充」、新客户标「新办」 | 手打名字会打出一张挂在错人名下的卡;老客户再办卡还会把余额清零 |
| 新的结算方式 | delivery · 改结算方式 | 下拉 4 项 | radio 4 项,打开时回填当前值 | 只有 4 项、且选择会切换下面出现哪些字段——radio 少一次点击,且不用「展开才知道有哪几类」 |
| 新值(提成) | performance · 提成规则 | 文本框 value="12",单位靠 hint 说 | number;比例 max=100 step=0.1,金额 step=0.01;表格里带单位显示(5.0% / 80.00) | 填「12%」或「12元」都能存进去;表格里只显示「12」,过两个月没人知道是 12% 还是 12 元 |
| 排序 | settings · 新增字典项 | 文本框 value="99" | number step=1 min=0 | 排序是整数序号,填「第五」或「5.5」下拉顺序就乱 |
| 随车物品 | reception · 修改客户与车辆 | 文本框 value="备胎、工具" | checkbox 组(与开单页同一个控件) | 同一个字段两个页面两种控件,一处勾、一处写,对账时对不上 |
.field 逐个判定——没有「视情况而定」,每个字段都指向 A–G 里的一条。| 字段 | 现在的控件 | 按口径应为 | 为什么是这条 |
|---|---|---|---|
| hq-app.html | |||
| 驳回原因(会留痕并通知申请人) | 文本框 | E 单选/自由填 | 驳回某家的申请,理由必须具体到「哪一项不达标」 |
| 驳回原因 | 文本框 | E 单选/自由填 | 要写清具体理由,选不出来 |
| 处置动作 | 下拉 | A 下拉 | 平台对门店的处置只有几档 |
| 跟进人 | 下拉 | A 下拉 | 只列总部运营 |
| reception-module-prototype.html | |||
| 手机号 | 电话(maxlength=11, inputmode=numeric) | D tel | tel + inputmode=numeric + maxlength=11 |
| 客户姓名 | 文本框 | E 单选/自由填 | 人名,自由填 |
| 客户类别 | 下拉 | A 下拉 | 业务名(个人 / 企业 / 加盟 / 直营),系数只在定价页 |
| 车牌号 | 文本框(maxlength=8) | D 格式化文本 | 省简称 + 字母 + 5 位,text + maxlength=8 + 失焦校验 |
| 品牌车型 | 下拉 | A 下拉 | 品牌 → 车系 → 年款三级联动 |
| VIN | 文本框(maxlength=17, inputmode=text) | D 格式化文本 | 数字串会丢前导零或变科学计数法 |
| 里程(km) | 数字(step=1, inputmode=numeric) | C 数字 | step=1,且 ≥ 上次记录 |
| 油量 / 电量 | 下拉 | A 下拉 | 油车 E/1/4/1/2/3/4/F,电车给百分比 |
| 随车物品 | 勾选 | F 多选 | 随车物品要能同时成立几样 |
| 进店方式 | 下拉 | A 下拉 | 决定佣金与介绍奖励口径 |
| 客户来源 | 下拉 | A 下拉 | 8 项,生意谁带来的,决定佣金 |
| 服务类别 | 勾选 | F 多选 | 一个字段同时成立几个值 |
| 预交车时间 | 日期时间 | B 日期时间 | datetime-local,车间要算「还剩多久」 |
| 客户原话描述 | 文本框 | E 单选/自由填 | 车主原话必须逐字记,套模板就失真了 |
| 保险公司 | 下拉 | A 下拉 | 客户档案里的承保公司 |
| 保单号 | 文本框 | D 格式化文本 | 保单号带字母与前导零,text + 失焦校验 |
| 报案号 / 定损单号 | 文本框 | D 格式化文本 | 单号可后补,格式由保险公司定 |
| 预收金额 | 数字(step=0.01, inputmode=decimal) | C 数字 | 抵扣依据,step=0.01 |
| 用途 | 下拉 | A 下拉 | 预收款用途决定台账科目 |
| 收款方式 | 下拉 | A 下拉 | 来自收款方式字典 |
| 故障类型 | 只读展示 | G 只读 | 这一页改不了:从上一级单据带出来的回显 |
| 位置 | 只读展示 | G 只读 | 这一页改不了:从上一级单据带出来的回显 |
| 押金(排障预收) | 只读展示 | G 只读 | 这一页改不了:从上一级单据带出来的回显 |
| 救援车组 | 只读展示 | G 只读 | 这一页改不了:从上一级单据带出来的回显 |
| 到场照片 | 只读展示 | G 只读 | 这一页改不了:从上一级单据带出来的回显 |
| 完结方式 | 只读展示 | G 只读 | 这一页改不了:从上一级单据带出来的回显 |
| 车主描述 | 只读展示 | G 只读 | 这一页改不了:从上一级单据带出来的回显 |
| 进店方式 | 只读展示 | G 只读 | 这一页改不了:从上一级单据带出来的回显 |
| 客户来源 | 只读展示 | G 只读 | 这一页改不了:从上一级单据带出来的回显 |
| 付款方式 | 下拉 | A 下拉 | 来自收款方式字典 |
| 客户放弃原因 | 下拉 | A 下拉 | 统计流失原因 |
| 备注 | 文本框 | E 单选/自由填 | 自由文字,选填 |
| 新的结算方式 | 单选 | E 单选/自由填 | 自由文字,或 2–5 项需要看全 |
| 对方单位 | 下拉 | A 下拉 | 保险公司 / 挂账单位来自客户档案,不在页面写死 |
| 保单号 / 合同号 | 文本框 | D 格式化文本 | 格式化文本 |
| 金额 | 数字(step=0.01, inputmode=decimal) | C 数字 | 预收款金额,进台账 |
| 用途 | 下拉 | A 下拉 | 预收款用途决定台账科目 |
| 支付方式 | 下拉 | A 下拉 | 来自收款方式字典 |
| 备注 | 文本框 | E 单选/自由填 | 自由文字,选填 |
| 退款金额 | 数字(step=0.01, inputmode=decimal) | C 数字 | 不能超过预收原额 |
| 退给谁 | 只读展示 | G 只读 | 这一页改不了:从上一级单据带出来的回显 |
| 转到哪台车 | 下拉 | A 下拉 | 只能转给同客户名下的在修车单 |
| 转出金额 | 数字(step=0.01, inputmode=decimal) | C 数字 | 不超过未抵扣余额 |
| 里程(km) | 数字(step=1, inputmode=numeric) | C 数字 | step=1,且 ≥ 上次记录 |
| 油量 / 电量 | 下拉 | A 下拉 | 油车 E/1/4/1/2/3/4/F,电车给百分比 |
| 随车物品 | 勾选 | F 多选 | 随车物品要能同时成立几样 |
| 项目 | 文本框 | D 格式化文本 | 增项名称应从服务项目字典选,本行是原型里的示意 |
| 金额(元) | 数字(step=0.01, inputmode=decimal) | C 数字 | 增项 / 减项的金额 |
| 原因 | 文本框 | E 单选/自由填 | 增项原因要能写清「客户不修了」这种具体情况 |
| 客户确认方式 | 单选 | E 单选/自由填 | 自由文字,或 2–5 项需要看全 |
| 减掉的项目 | 下拉 | A 下拉 | 只能从这张单已有的项目里减 |
| 金额(元) | 数字(step=0.01, inputmode=decimal) | C 数字 | 增项 / 减项的金额 |
| 原因 | 文本框 | E 单选/自由填 | 增项原因要能写清「客户不修了」这种具体情况 |
| 押金金额 | 只读展示 | G 只读 | 这一页改不了:从上一级单据带出来的回显 |
| 收款方式 | 下拉 | A 下拉 | 来自收款方式字典 |
| 救援车组 | 下拉 | A 下拉 | 只能派当班的车组 |
| store/booking.html | |||
| 手机号 | 电话(maxlength=11, inputmode=numeric) | D tel | 老客户自动带出档案 |
| 客户姓名 | 文本框 | E 单选/自由填 | 人名 |
| 车牌 | 文本框(maxlength=8) | D 格式化文本 | text + maxlength=8,新车可不填 |
| 服务类别 | 下拉 | A 下拉 | 进服务统计 |
| 预约渠道 | 下拉 | A 下拉 | 5 项:电话 / 微信 / 小程序 / 到店 / 合作单位 |
| 预约日期 | 日期 | B 日期时间 | 不能选昨天 |
| 时间段 | 下拉 | A 下拉 | 由「预约间隔」设置生成 |
| 工位 | 下拉 | A 下拉 | 只列该日期该时段空着的位子 |
| 技术要求 / 客户原话 | 文本框 | E 单选/自由填 | 车主原话,自由填 |
| 改到几点 | 下拉 | A 下拉 | 只列该工位该日空着的时段 |
| 工位 | 下拉 | A 下拉 | 只列该日期该时段空着的位子 |
| store/delivery.html | |||
| 保险公司定损金额 | 数字(step=0.01, inputmode=decimal) | C 数字 | 要和报价算差额 |
| 定损单号 | 文本框 | D 格式化文本 | 保险公司给的号,格式不定 |
| 定损结论 | 下拉 | A 下拉 | 按报价 / 低于报价 / 拒赔,三选一,决定差额怎么算 |
| 取车人姓名 | 文本框 | E 单选/自由填 | 与身份证一致 |
| 取车人电话 | 电话(maxlength=11, inputmode=numeric) | D tel | 11 位手机号 |
| 身份证号 | 文本框(maxlength=18) | D 格式化文本 | 18 位,存完即打码,只显示后 6 位 |
| 与车主关系 | 下拉 | A 下拉 | 决定要不要授权书 |
| 交车里程 | 数字(step=1, inputmode=numeric) | C 数字 | 要 ≥ 进厂里程 |
| 进厂里程 | 只读展示 | G 只读 | 这一页改不了:从上一级单据带出来的回显 |
| 新的结算方式 | 单选 | E 单选/自由填 | 四类 + 其他,选了才出对应字段 |
| 保险公司 | 下拉 | A 下拉 | 承保公司字典 |
| 定损单号 | 只读展示 | G 只读 | 这一页改不了:从上一级单据带出来的回显 |
| store/finance.html | |||
| 发给「' + b.who + '」的奖励形式 | 下拉 | A 下拉 | 进筛选 / 统计 / 分账 / 门禁,必须字典 |
| 本次回款金额 | 数字(step=0.01, inputmode=decimal) | C 数字 | 要算回款后余额,且不许超收 |
| 到账方式 | 下拉 | A 下拉 | 进分账,必须字典 |
| 到账日期 | 日期 | B 日期时间 | 账期按到账日算 |
| 这次怎么催 | 下拉 | A 下拉 | 催收动作要留痕并统计 |
| 退还金额 | 数字(step=0.01, inputmode=decimal) | C 数字 | 不能超过已收金额 |
| 退款方式 | 下拉 | A 下拉 | 同上 |
| 原因 | 下拉 | A 下拉 | 退款原因要进统计 |
| store/inventory.html | |||
| 申请数量 | 数字(step=1, inputmode=numeric) | C 数字 | 进库存 |
| 紧急程度 | 下拉 | A 下拉 | 决定审批优先级,三档 |
| 关联车单 | 下拉 | A 下拉 | 只能从「在修且等这个件」的车单里选 |
| 建议供应商 | 下拉 | A 下拉 | 配件档案里的常供商 |
| 期望到货日期 | 日期 | B 日期时间 | 卡着车单的要算「最晚哪天必须到」 |
| store/member.html | |||
| 客户 | 下拉 | A 下拉 | 老客户从档案选;新客户先建档 |
| 卡种 | 下拉 | A 下拉 | 卡种决定赠送比例 |
| 收款方式 | 下拉 | A 下拉 | 收款方式字典 |
| 本次消费金额 | 数字(step=0.01, inputmode=decimal) | C 数字 | 要算扣款顺序与余额 |
| store/performance.html | |||
| 适用范围 | 文本框(只读) | G 只读 | 从上一级带下来 |
| 提成方式 | 下拉 | A 下拉 | 按产值 / 按单固定 / 按工时固定 |
| 新值 | 数字(step=0.01, inputmode=decimal) | C 数字 | 按比例是百分比、按金额是元,随提成方式变 |
| 生效日期 | 日期 | B 日期时间 | 提成规则按生效日切版本,错了算错整月工资 |
| store/pricing.html | |||
| 调价范围 | 下拉 | A 下拉 | 全部门店 / 仅本站 / 指定服务分类 |
| 生效日期 | 日期 | B 日期时间 | 按生效日切版本 |
| 审批人 | 只读展示 | G 只读 | 这一页改不了:从上一级单据带出来的回显 |
| 选哪些服务分类 | 勾选 | F 多选 | 一个字段同时成立几个值 |
| store/settings.html | |||
| 营业时间 | 时间 | B 日期时间 | 起止两个 time,才能判「现在是否营业」 |
| 预约间隔 | 下拉 | A 下拉 | 30 / 60 分钟,决定时段下拉 |
| 会员卡扣款顺序 | 下拉 | A 下拉 | 先扣赠送 / 先扣本金 |
| 默认结算方式 | 下拉 | A 下拉 | 开单的默认值 |
| 金额单位 | 只读展示 | G 只读 | 这一页改不了:从上一级单据带出来的回显 |
| 门店名称 | 文本框 | E 单选/自由填 | 名称 |
| 门店电话 | 电话 | D tel | 固话带区号与前导 0 |
| 地址 | 文本框 | E 单选/自由填 | 没有可枚举的结构 |
| 服务热线(印在单上) | 文本框 | D tel | 400 号带横杠,tel 不吃短横线 |
| 统一社会信用代码 | 只读展示 | G 只读 | 这一页改不了:从上一级单据带出来的回显 |
| 名称 | 文本框 | E 单选/自由填 | 字典项名称 |
| 编码 | 文本框 | D 格式化文本 | 字典编码,字母数字混合 |
| 字典 | 下拉 | A 下拉 | 在十几个字典间切换 |
| 排序 | 数字(step=1, inputmode=numeric) | C 数字 | 整数序号,决定下拉里的顺序 |
| 用在哪 | 文本框 | E 单选/自由填 | 说明性文字 |
| 新增检查项 | 文本框 | E 单选/自由填 | 新检查项名称 |
| 显示门店 logo | 下拉 | A 下拉 | 打印模板选项 |
| 客户签字栏 | 下拉 | A 下拉 | 打印模板选项 |
| 凭证 | 只读展示 | G 只读 | 这一页改不了:从上一级单据带出来的回显 |
| 联系人 | 文本框 | E 单选/自由填 | 门店联系人姓名 |
| store/staff.html | |||
| 姓名 | 文本框 | E 单选/自由填 | 人名 |
| 工号 | 文本框 | D 格式化文本 | 带字母与前导零 |
| 岗位 | 下拉 | A 下拉 | 进权限与提成统计 |
| 班组 | 下拉 | A 下拉 | 进排班与提成统计 |
| 手机号 | 电话(maxlength=11) | D tel | tel + maxlength=11 |
| 入职日期 | 日期 | B 日期时间 | 要算工龄 |
| 能承接的工种 | 只读展示 | G 只读 | 这一页改不了:从上一级单据带出来的回显 |
| 证书到期日 | 日期 | B 日期时间 | 提前 30 天提醒 |
| 导出范围 | 下拉 | A 下拉 | 时间范围枚举 |
| 包含字段 | 下拉 | A 下拉 | 导出模板 |
| 新证号 | 文本框 | D 格式化文本 | 证书编号 |
| 新到期日 | 日期 | B 日期时间 | 续证时新填 |
| 证件照片 | 文本框 | D 格式化文本 | 上传控件(原型里以文本框示意路径) |
| 工位类型 | 下拉 | A 下拉 | 决定能停什么车 |
| 归属班组 | 下拉 | A 下拉 | 同上 |
| 名称(留空自动编号) | 文本框 | E 单选/自由填 | 班组名,留空自动编号 |
| 来源 | 下拉 | A 下拉 | 自建 / 连锁调入,决定能否跨店派工 |
| 姓名 | 文本框 | E 单选/自由填 | 人名 |
| 工种 | 下拉 | A 下拉 | 进排班与计件统计 |
| 班组 | 下拉 | A 下拉 | 进排班与提成统计 |
| 能独立上工吗 | 下拉 | A 下拉 | 决定能不能单独派工 |
| 外协厂名称 | 文本框 | E 单选/自由填 | 厂商名 |
| 能接的活 | 下拉 | A 下拉 | 工序字典 |
| 结算口径 | 文本框 | E 单选/自由填 | 按面计价 / 按件计价,各家谈法不同,写清原话 |
| store/workshop.html | |||
| 今日完成 | 文本框 | E 单选/自由填 | 技师写今天做了什么,一段话 |
| 实际工时 | 数字(step=0.1, inputmode=decimal) | C 数字 | 同上 |
| 能否按期完工 | 下拉 | A 下拉 | 只有两档;关键在默认值 |
| 延期原因 | 下拉 | A 下拉 | 延期统计的唯一来源 |
| 要派的车 | 下拉 | A 下拉 | 只列本班组可派的单 |
| 班组 | 下拉 | A 下拉 | 排班与提成 |
| 技师 | 下拉 | A 下拉 | 只列本组的人 |
| 计划工时 | 数字(step=0.1, inputmode=decimal) | C 数字 | 进工时统计与计件工资 |
| 计划完工 | 日期时间 | B 日期时间 | datetime-local,要算「还剩多久到期」 |
| 驳回对象 | 只读展示 | G 只读 | 这一页改不了:从上一级单据带出来的回显 |
| 驳回原因 | 文本域 | E 单选/自由填 | 要能写清「照片不清,重拍」这种具体情况 |
| 车单号 | 下拉 | A 下拉 | 只能挑一张已经在修的车单,手填会挂不上账 |
| 车牌 | 只读展示 | G 只读 | 这一页改不了:从上一级单据带出来的回显 |
| 外协厂 | 下拉 | A 下拉 | 外协厂档案 |
| 委外内容 | 下拉 | A 下拉 | 工序字典 |
| 委外金额 | 数字(step=0.01, inputmode=decimal) | C 数字 | 进成本 |
| 预计回厂 | 日期 | B 日期时间 | 日期(本行是原型里的占位,正式应给 date) |
| supplier-app.html | |||
| 承诺到货时间(门店和总部都看得到) | 日期时间 | B 日期时间 | 门店排产要用 |
| 备注 | 文本框(已标 data-spec=text) | E 单选/自由填 | 自由填,已标 data-spec |
| 缺货配件 | 只读展示 | G 只读 | 这一页改不了:从上一级单据带出来的回显 |
| 缺货数量 | 数字(step=1, inputmode=numeric) | C 数字 | 只填数字,单位跟配件档案走 |
| 预计到货日 | 日期 | B 日期时间 | 门店与总部都要看到 |
| 新承诺交期 | 日期时间 | B 日期时间 | 承诺值,逾期会亮红 |
| 逾期原因 | 下拉 | A 下拉 | 进供应商考核 |
| 物流公司 | 下拉 | A 下拉 | 物流商字典 |
| 运单号 | 文本框(maxlength=32) | D 格式化文本 | 运单号带字母 |
| 新供货价 | 数字(step=0.01, inputmode=decimal) | C 数字 | 要算毛利 |
| 调价原因 | 文本框(已标 data-spec=text) | E 单选/自由填 | 自由填,已标 data-spec |
| 预计到货日 | 日期 | B 日期时间 | 门店与总部都要看到 |
| 到货数量 | 数字(step=1, inputmode=numeric) | C 数字 | 进库存 |
| 差异原因 | 下拉 | A 下拉 | 进对账差异统计 |
| 发票号码 | 文本框 | D 格式化文本 | 发票号带字母 |
| 变更项 | 下拉 | A 下拉 | 能改的字段是有限几个 |
| 变更后 | 文本框 | E 单选/自由填 | 新值 |
| 变更原因 / 附件说明 | 文本框 | E 单选/自由填 | 说明性文字 |
排班表上写着「14:00 冲突 ×2」、点开提示「两台抢钣金 2 号工位」、保存成功又弹「11-08 09:00 · 举升机 1」—— 这三句话都建立在「预约占了一个工位」上。可是新建预约的表单里根本没有工位这一项。 结果是:保存时系统凭空指派一个工位,冲突检测变成了事后才知道的事。
预约页的「来源」是电话 / 微信 / 小程序 / 到店 / 合作单位——这是客户怎么约的。 接车单的「客户来源」是自然进店 / 老客户 / 老客转介绍 / 分销员推荐 / 平台导流 / 保险推送 / 合作单位 / 同行转介——这是生意谁带来的,决定佣金和平台费。 两个字段都叫「来源」,值域只重叠一部分。客服在预约页选了「微信」,接车时还得再选一次客户来源,而且不知道这两次是不是同一件事。
开单第 3 步「结算方式」下面有一个勾选项「先收排障预收款 500 元」,默认勾着。 客户车刚进门、还没检测、还不知道修什么,就先收 500。这在维修行业是常规做法(排障费), 但页面上没写「这 500 是排障费,不是维修费,退不退、怎么退」。客户问起来,顾问答不上来。 更糟的是它挂在「结算方式」那张卡里——看起来像「选了保险理赔就必须收 500」。
交车结算改成两栏之后,右栏是「还差什么才能放车」,左栏是「交车单」——取车人姓名、电话、身份证、与车主关系都在左栏填。 收银员看到右栏红着「取车人四要素没填」,得自己滚到左栏去找那四个框。改了布局反而把「判断」和「填」分开了。
会员卡页明明白白写着:「这条是规则不是硬编码,店长可在设置里改成『先扣本金』」。 去设置页找——没有这一项。文档承诺了一个不存在的开关,这比不做更糟:店长会一直找,最后以为系统坏了。
财务「登记回款」弹窗里,金额是可编辑的输入框,预填这笔应收的金额。但没有显示「本次回款后还剩多少」,也没有拦「填超了」。 客户多打了一笔、或者财务手滑多按一个 0,应收台账就变成负数,之后所有对账都从这个负数开始算。
「该补的货」列表已经按「影响在修车」排了序(后保险杠总成 0 件,卡着粤B·12345 停工), 点「生成采购申请」弹出的表单只有数量和供应商。排序用的那个「急」的信息,到了申请单里就丢了。 店长批的时候看不出哪张申请是卡着车的。
左栏「保险定损与差额」有一个 claimNo;「改结算方式」弹窗里又有一个没有 id 的「定损单号」输入框。
后者改了,前者不会变——同一个事实有两个输入口,必然对不上。
开单时选一次(默认值)、交车页顶部「变更」一次、「改结算方式」弹窗又一次。 开单那次是默认值可以理解,但交车页两个入口是重复的。
cursor:pointer,看起来像能选,点下去什么也不会发生。下方直接写明「这四格只是显示谁出钱,要改点右上角改结算方式,改完这四格和门禁一起重算」。
开单时选的那次保留,但标成「只是默认值,后面随时可改」,别让人以为一次定死。价格执行通知单里「调价范围」是下拉:全部门店 / 仅本站 / 指定服务分类。 选第三项,页面上不会出现任何选分类的地方——这个下拉没有 onchange。选了等于没选。
「能否按期完工」下拉的第一项是「不能,要延期」。技师点开生产日报,系统先替他选好了延期。 大多数人不会去改默认值——于是每天的日报都带着一条假的延期记录,延期统计彻底失效。
点「提交」→ 弹窗立刻关闭 → 然后才校验收款金额填没填。没填的话,弹窗已经没了, 刚填的数量、供应商、备注全丢,只剩一条 toast 说「金额要填」。用户得从头再点一遍。 这是次序错了:应该是「校验不过 → 不关窗」。
if (okFn() !== false) closeM(...):
校验函数返回 false 就留在窗里,已填内容一个不丢,只在窗口上方弹一条说明。「车单号」和「车牌」是两个独立文本框,都预填了值、都能改。可一台车只可能有一个车牌, 两个框各填一次,只要有一边手滑,这张委外单就挂到了别的车上——回厂验收时谁也说不清该验哪台。
「办卡 / 充值」的客户栏是一个预填了人名的文本框,底下一句「办卡后余额 5,300.00」。 老客户卡里还有 3,900 本金 + 200 赠送,再充 5,000 应当是 9,400;按这个页面走,变成 5,300。 同一个按钮对老客户是「续充」、对新客户是「开卡」,页面没区分这两件事。
| 检查 | 规则 | 放在哪 |
|---|---|---|
| 日期类必须是日期控件 | 标签含「日期 / 时间 / 到期 / 生效 / 入职」→ 必须 date 或 datetime-local 或 time | gate.mjs 检查 I |
| 电话必须是 tel | 标签含「手机 / 电话 / 热线」→ 必须 type="tel" | gate.mjs 检查 I |
| 算钱的必须是 number | 标签含「金额 / 工时 / 数量 / 里程」→ 必须 type="number" 且带 step | gate.mjs 检查 I |
| 禁止原生多选 | 全站不许出现 <select multiple> | gate.mjs 检查 J |
| 每个控件都有标签 | .field 里的输入控件必须有 <label>;没有标签的控件在手机上读屏就是「编辑框」 | gate.mjs 检查 J |
| 日期控件不许被文本冒充 | 值形如 2026-11-08 / 2026-11-09 18:00 的 value 不许出现在 text 框里 | gate.mjs 检查 I |
node gate.mjs 就会红。
新加一个字段,标签写了「生效日期」却给了 text 框,门禁立刻失败并指出是哪一页哪一行。
verify-ctl.mjs),专测改成下拉/数字之后的行为有没有跟着改。| 页面 | 点一遍验的是什么 |
|---|---|
| 绩效 · 提成规则 | 点「调整」时把表格里的 5.0% 回填成 5(去掉单位才能塞进数字框);换成「按单固定金额」后 step 变 0.01、max 清空;保存后表格里显示回 80.00 |
| 接车 · 开单 | 取消勾「进店先收预收款」,金额与用途整块收起;再勾回来又出现;随车物品是两个页面同一套勾选组 |
| 交车 · 改结算方式 | 打开时单选回填为当前方式;改成「单位挂账」后门禁里真的多出「对账签收单已盖章回传」那一行 |
| 车间 · 开委外单 | 车单号是下拉;换一张车单,车牌跟着变(车牌不能单独填);预计回厂是日期控件 |
| 库存 · 采购申请 | 关联车单下拉里带出「在修且等这个件」的车;选「急」却不选车 → 弹窗不关、提交不生效,只弹一条说明 |
| 会员 · 办卡 | 客户是下拉;选老客户提示「续充、余额叠加」,选新客户提示「生成新卡号」 |
| 设置 · 字典 | 排序是 number |