← 产品方案 车单主线 单据确认方式 业务流审计 门店原型

字段与控件口径 · 下拉还是填写

要回答的问题只有一个:同一个字段,什么时候给下拉、什么时候让人打字? 这不是审美问题。同一个值,一个人填「保险理赔」、一个人填「保险」、第三个人填「走保险」, 到了月底统计就变成三行,分账也对不上。凡是会进统计、进分账、进门禁判断的值,一律不许自由填。 反过来,车牌、地址、客户原话这些没法定枚举的,硬做成下拉只会逼人乱选。下面七条规则把这条线划清楚, 后面是全站 25 个原型页、146 个输入控件的逐个判定,以及这一轮改掉的地方和怎么防回归。

1七种控件,按什么判

每一条的判据都是「这个值后面被谁用」,不是「它看起来像不像选项」。
A · 下拉(字典)
判据:值要参与筛选 / 统计 / 分账 / 门禁判断
落地方式:结算方式、进店方式、客户来源、服务类别、延期原因、班组、岗位、卡种、工位类型、到账方式、差异原因、退款原因。
选项不许写在页面里,统一来自设置页字典;字典只能停用不能删(老单据还要显示它)。
实在枚举不完的,末尾留「其他」,选了必须填说明——不留「其他」就会逼人挑一个错的。
B · 日期 / 时间控件
判据:值是日期或时刻
用 date / datetime-local / time,不许用文本框写「2026-11-09 18:00」。
理由很硬:文本日期在手机上要切输入法、打横杠,十个人能打出六种格式;而且没法自动判「预约日期不能选昨天」「交车时间不能早于进厂时间」。
营业时间要拆成开始 / 结束两个 time,否则算不出「现在是否营业中」。
C · 数字
判据:值要参与计算(算钱、算工时、算里程)
用 number + inputmode。金额 step="0.01",工时 step="0.1",里程与数量 step="1"。
文本框存金额,用户能把「1,200」打成「1。200」,后端收到就是 0。数字控件自带范围校验,还能顺手拦「交车里程小于进厂里程」。
D · 格式化文本(不是数字)
判据:值是数字串,但会丢前导零 / 带固定位数
手机号、身份证、车牌、VIN、银行卡、保单号。这些必须用 text,不能用 number——number 会把 0755 开头的固话吃掉前导 0,把 18 位身份证变成科学计数法。
正确做法:text + inputmode="numeric" + maxlength + 失焦校验 + 明确的错误文案(「身份证应为 18 位,当前 17 位」)。
E · 单选(radio)
判据:2–5 个选项,且选择会切换下面出现哪些字段
结算方式(自费 / 保险 / 三包 / 挂账)就是典型:选了保险才出保险公司、保单号、报案号。选项少又要一眼看全,用 radio 比下拉快一次点击。
超过 6 个、或需要按分组找,才退回下拉。
F · 多选(checkbox 组)
判据:一个字段要同时成立几个值
服务类别(事故 + 保养同时做)、随车物品、通知渠道。
禁止用 <select multiple>:电脑上要按住 Ctrl 点,手机上根本没法多选,而且选中的项只显示一条,用户看不出自己选了几个。改成一行 checkbox,选了几个一眼可见。
G · 只读展示
判据:这个值不是这一页能改的
进厂里程、「当前值」、审批人、成本与毛利(顾问看不到)、身份证后 6 位。
做成输入框但设成 readonly 是最糟的:用户会以为能改,点了没反应就以为坏了。要么做成纯文本(.ro),要么明确写「只读 · 谁在哪改」。
还有一条不出现在这七种里,但最常被搞反:默认值。 车间报工里「能否按期完工」原来默认「不能,要延期」——技师点开日报,系统先替他选了「延期」,于是每天的日报都带着一条假的延期记录,延期统计彻底失效。 现在默认「能,按计划」,延期才需要特意去选,且每开一张工单都重置回「能」,不把上一张的选择顺下来。 规则:默认值等于大多数情况下的真实答案,异常值必须由人主动选。

2改前 vs 改后:七种控件里三种原来是零

口径先给结论,再给账。下面是同一套清点脚本在改动前后各跑一次的结果——不是估算。

改之前

131输入控件总数
106text 文本框
12radio 单选
11checkbox 复选框
0date 日期控件
0tel 电话控件
0number 数字控件
41标签说要用、控件没用对
10文本框里写死日期
1原生 <select multiple>

106 个文本框里,至少 41 处的标签已经写明了它要什么(「金额」「手机号」「预约日期」「到期」), 控件却还是 text。单位是对的,控件是错的——这种错不会报错,只在用户填错和月底对不上账的时候显形。 日期一个都没有,意味着手机上填日期要切键盘、自己敲 `2026-11-08`,敲成 `2026/11/8` 就比不了大小。

改之后(同一脚本、同 25 个页面)

146输入控件总数
54text 文本框
25number 数字控件
25checkbox 复选框
16radio 单选
13date 日期控件
5tel 电话控件
4datetime-local 日期时间
2time 时间控件
0标签说要用、控件没用对
0文本框里写死日期
0原生 <select multiple>

剩下的 54 个 text 不是漏改:车牌、VIN、身份证、地址、客户原话、备注这些本来就该自由填, 硬套下拉只会逼人乱选(见 §1 的 B/C/D/E 类)。数量从 131 涨到 146 是因为这轮补了几个原来没有的字段 (预约工位、采购紧急程度、预收金额与用途等),不是老字段翻倍。

3改过的字段:逐条对照

只列有争议或已经改过的字段。源数据是 store/*.html 与两端手机页的实际控件,「原控件」列记的是改之前的样子,行号也是改之前的位置。四张表的「应为」列现在全部已落地——清点脚本复查为 0 处不符。

日期类:改前 7 处全错,全站 0 个日期控件 → 现在 12 个 date + 4 个 datetime-local + 2 个 time

字段位置原控件应为为什么
预约日期booking:150text · 2026-11-08date · 最早今天能选到过去,排班表就会多出一行过去的预约
预约时间段booking:151select · 固定 4 项select · 由「预约间隔」生成设置里能改 30/60 分钟,下拉却写死 4 个整点时段,改设置不生效
预交车时间reception:257text · 2026-11-09 18:00datetime-local要在车间卡片上算「还剩多久到期」,文本没法算
生效日期(提成)performance:144text · 2026-11-15date提成规则按生效日切版本,日期错了会算错整月工资
生效日期(定价)pricing:205text · 2027-01-01date同一批价格按生效日区分版本,影响所有在途单
入职日期 / 证书到期staff:285, 402textdate证书到期要提前 30 天提醒,文本比不了大小
到账日期finance · 登记回款text · 2026-11-08date账期按到账日算,写错一天账期就错一天
营业时间settings:104text · 08:30 – 20:00time × 2(起 / 止)一整串文本没法判断「现在是否营业」,也没法跨零点

电话与格式串:数字串不能用 number → 现在 5 处 tel

字段位置原控件应为为什么
手机号(5 处)booking:141 · reception:211 · delivery:268 · staff:283 · settings:253texttel + inputmode=numeric + maxlength=11手机弹出数字键盘,不用切输入法;顺手限制位数
门店电话 / 服务热线settings:255texttel(允许横杠)0755 开头,用 number 会吃掉前导 0
车牌booking:143 · reception:216texttext + 失焦校验格式是「省简称 + 字母 + 5 位」,没法全枚举,但能校验
身份证号delivery:269text + maxlength保留(已对)18 位,必须是 text;这处已经做对了,留作范例
VINreception:218text · 仅 placeholdertext + maxlength=17 + 失焦校验17 位车架号,写错一位就查不到厂家记录

数字类:金额与工时全用文本框 → 现在 23 处 number(带 step)

字段位置原控件应为为什么
定损金额delivery:236textnumber step=0.01要和报价 3,800 算差额,文本框进来的是字符串
交车里程delivery:272text · 38420number + ≥ 进厂里程进厂 32,680 是只读值,交车填小了说明填错
进厂里程reception:219text · 32680number + ≥ 上次记录上次 32,100,填 3,268 少一位就查不出保养周期
实际工时 / 计划工时workshop:301, 337text · 5.5number step=0.1工时直接进计件工资,格式错就少发钱
会员消费 / 回款 / 退款金额member:186 · finance ×2textnumber step=0.01要算余额和欠款,字符串算不了
申请数量 / 委外金额inventory:228 · workshop:541textnumber采购数量进库存,委外金额进成本

下拉用错的:把内部口径暴露给了用户 → 全部收口

字段位置原来的问题改成
客户类别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 项(自然进店/老客户/…)两件事要分开叫:预约渠道(怎么约的)与 客户来源(生意谁带来的);后者决定佣金

全量清单复查又抓出 9 处:看着能填,其实填了会出事

这 9 处不是「像不像下拉」的问题,是填错的代价:填错一个车单号、填错一个人名,钱就挂不到该挂的地方。
字段位置原来是改成不改为会怎样
关联车单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 组(与开单页同一个控件)同一个字段两个页面两种控件,一处勾、一处写,对账时对不上

4全量清单:187 个字段,逐个定死

规则说清了还要落到每一个字段上。下面是全部 13 个表单型页面的 .field 逐个判定——没有「视情况而定」,每个字段都指向 A–G 里的一条。
怎么读这张表:「现在的控件」是页面上实际的写法(括号里是 maxlength / step / inputmode); 「按口径应为」是它该落到的规则类。两列一致说明这个字段已经对了;不一致才是要改的。 本表生成于这一轮改完之后,187 行里没有一行不一致——如果哪天有人把日期改回文本框,重新生成就会显形。
字段现在的控件按口径应为为什么是这条
hq-app.html
驳回原因(会留痕并通知申请人)文本框E 单选/自由填驳回某家的申请,理由必须具体到「哪一项不达标」
驳回原因文本框E 单选/自由填要写清具体理由,选不出来
处置动作下拉A 下拉平台对门店的处置只有几档
跟进人下拉A 下拉只列总部运营
reception-module-prototype.html
手机号电话(maxlength=11, inputmode=numeric)D teltel + 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 tel11 位手机号
身份证号文本框(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 tel400 号带横杠,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 teltel + 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 单选/自由填说明性文字
这张表最有用的不是「已经全对」,是它把「看起来该下拉、其实必须让人填」的字段挑出来了。 比如「结算口径」——按面计价 ¥260/面、按件计价 ¥80/件、包干价,每家外协厂谈法都不同, 做成字典第一年就得加二十个选项,第二年没人记得哪个是对的;做成自由填,店长写给财务看的话也看得懂。 反过来「紧急程度」只有三档、要进审批排序,就必须下拉——它错了,店长批单的顺序就错了。

5业务次序审计:14 条,全部已改

控件对不对是一层;字段出现的先后顺序对不对是另一层。下面这些问题不是样式问题,是「按这个顺序填,人会填错或者填不下去」。S-01~S-11 是逐页走查出来的,S-12~S-14 是这次做全量清单时顺着「填错了会怎样」又挖出来的。

S-01 新建预约没有工位,但系统按工位判冲突 P0 已改

排班表上写着「14:00 冲突 ×2」、点开提示「两台抢钣金 2 号工位」、保存成功又弹「11-08 09:00 · 举升机 1」—— 这三句话都建立在「预约占了一个工位」上。可是新建预约的表单里根本没有工位这一项。 结果是:保存时系统凭空指派一个工位,冲突检测变成了事后才知道的事。

改法:表单加「工位」下拉,选项只列该时段空闲的,并在选完时段后刷新;不选就保存时提示「本时段还有 3 个空位,要占哪个」。排班表的冲突提示才有依据。

S-02 预约渠道和客户来源混成一件事 P1 已改

预约页的「来源」是电话 / 微信 / 小程序 / 到店 / 合作单位——这是客户怎么约的。 接车单的「客户来源」是自然进店 / 老客户 / 老客转介绍 / 分销员推荐 / 平台导流 / 保险推送 / 合作单位 / 同行转介——这是生意谁带来的,决定佣金和平台费。 两个字段都叫「来源」,值域只重叠一部分。客服在预约页选了「微信」,接车时还得再选一次客户来源,而且不知道这两次是不是同一件事。

改法:预约页那一项改名为「预约渠道」,值域保持 5 项;接车单那项保持「客户来源」8 项。两者互不替代,也不联动——约的方式不等于生意的来源。

S-03 接车开单先收钱,但没说清这钱是什么钱 P1 已改

开单第 3 步「结算方式」下面有一个勾选项「先收排障预收款 500 元」,默认勾着。 客户车刚进门、还没检测、还不知道修什么,就先收 500。这在维修行业是常规做法(排障费), 但页面上没写「这 500 是排障费,不是维修费,退不退、怎么退」。客户问起来,顾问答不上来。 更糟的是它挂在「结算方式」那张卡里——看起来像「选了保险理赔就必须收 500」。

改法:把它从结算方式卡里拆出来,自己一张卡「预收款(选填 · 可以先不收)」: 勾选后展开金额 / 用途 / 收款方式三个字段,下面一段话直接回答客户会问的问题—— 「这 500 是排障检测费的预收,不是定金也不是维修款;认可报价后全额抵扣维修款;不修了、或实际检测费不足 500,余额原额原路退回,要客户在退款单上签收。不收也行。」 不勾就整块收起。开单时间线里也从「已收排障预收 500」改成「预收 500.00(排障检测费,可抵可退)」或「未收预收款」。

S-04 交车门禁在右栏,填门禁条件的人在左栏 P1 已改

交车结算改成两栏之后,右栏是「还差什么才能放车」,左栏是「交车单」——取车人姓名、电话、身份证、与车主关系都在左栏填。 收银员看到右栏红着「取车人四要素没填」,得自己滚到左栏去找那四个框。改了布局反而把「判断」和「填」分开了。

改法:门禁每一行右侧加一个按钮,按钮文字按这道门禁的实际动作命名: 「去填」(跳到取车人姓名并聚焦)/「去签收」(缺哪个四要素就跳到哪个框)/「去收款」/「去拍照」/「回填定损」(滚到定损卡并聚焦定损金额)/「去确认」(打开结算签字二选一)。 没过的行是实心按钮,已过的行降级成虚线「查看」,点了只高亮那一块,不误导人去重复操作。 门禁不只是读状态,要能带着人去办那件事。

S-05 会员卡扣款顺序写着「可在设置里改」,设置里没有 P0 已改

会员卡页明明白白写着:「这条是规则不是硬编码,店长可在设置里改成『先扣本金』」。 去设置页找——没有这一项。文档承诺了一个不存在的开关,这比不做更糟:店长会一直找,最后以为系统坏了。

改法:设置页「营业与结算」组里补「会员卡扣款顺序」(先扣赠送 / 先扣本金),并注明「改完只影响之后的消费,已扣的不回溯」。

S-06 回款登记可以填得比应收还多 P1 已改

财务「登记回款」弹窗里,金额是可编辑的输入框,预填这笔应收的金额。但没有显示「本次回款后还剩多少」,也没有拦「填超了」。 客户多打了一笔、或者财务手滑多按一个 0,应收台账就变成负数,之后所有对账都从这个负数开始算。

改法:输入框下面实时显示「应收 2,500.00 · 本次 2,500.00 · 回款后 0.00」;填超时提示「超出应收部分将记为预收,确认吗」——不禁止,但要让人知道自己在做一件少见的事。

S-07 库存采购申请少了「急不急」 P2 已改

「该补的货」列表已经按「影响在修车」排了序(后保险杠总成 0 件,卡着粤B·12345 停工), 点「生成采购申请」弹出的表单只有数量和供应商。排序用的那个「急」的信息,到了申请单里就丢了。 店长批的时候看不出哪张申请是卡着车的。

改法:申请单加「紧急程度」(急 · 有车等着 / 正常 · 本周内到货 / 缓 · 做库存)与「关联车单」。 关联车单不是填空,是下拉,只列「在修且等这个件」的车单,另有一项「不关联(做库存)」。 选「急」却不挂车 → 提交被拦,弹窗不关、已填内容不丢,提示「先去车间找到这台车,再从下拉里选它」—— 因为「急」的定义就是有车在等,没有车的急件是给自己排队。

S-08 交车页「定损单号」出现两次 P1 已改

左栏「保险定损与差额」有一个 claimNo;「改结算方式」弹窗里又有一个没有 id 的「定损单号」输入框。 后者改了,前者不会变——同一个事实有两个输入口,必然对不上。

改法:弹窗里那个删掉,改成只读显示当前定损单号 + 一句「要改去左栏定损卡改」。

S-09 结算方式有三个入口 P2 已收口

开单时选一次(默认值)、交车页顶部「变更」一次、「改结算方式」弹窗又一次。 开单那次是默认值可以理解,但交车页两个入口是重复的。

改法:保留顶部「变更」作为唯一入口,弹窗由它打开;中间「这笔钱谁出」那四格(保险 3,200 / 自费 600 / 挂账 0 / 三包 0)只显示、不能点—— 原来它们带 cursor:pointer,看起来像能选,点下去什么也不会发生。下方直接写明「这四格只是显示谁出钱,要改点右上角改结算方式,改完这四格和门禁一起重算」。 开单时选的那次保留,但标成「只是默认值,后面随时可改」,别让人以为一次定死。

S-10 调价范围选了「指定服务分类」,没有地方选分类 P1 已改

价格执行通知单里「调价范围」是下拉:全部门店 / 仅本站 / 指定服务分类。 选第三项,页面上不会出现任何选分类的地方——这个下拉没有 onchange。选了等于没选。

改法:选「指定服务分类」时下面出现分类多选;选「仅本站」时显示当前门店名做确认。

S-11 车间报工的默认值是「不能按期完工」 P1 已改

「能否按期完工」下拉的第一项是「不能,要延期」。技师点开生产日报,系统先替他选好了延期。 大多数人不会去改默认值——于是每天的日报都带着一条假的延期记录,延期统计彻底失效。

改法:默认「能,按计划」;选「不能」才展开延期原因(联动现在是对的,只是默认值反了)。 另外补一条:每开一张新工单都要重置回「能,按计划」——上一张选了延期,不能顺着带到下一张, 否则技师一天填十张单,第二张起全是延期。

S-12 十二个弹窗全是「先关窗、再校验」 P1 已改

点「提交」→ 弹窗立刻关闭 → 然后才校验收款金额填没填。没填的话,弹窗已经没了, 刚填的数量、供应商、备注全丢,只剩一条 toast 说「金额要填」。用户得从头再点一遍。 这是次序错了:应该是「校验不过 → 不关窗」。

改法:全站 12 个弹窗统一成 if (okFn() !== false) closeM(...): 校验函数返回 false 就留在窗里,已填内容一个不丢,只在窗口上方弹一条说明。

S-13 委外单让人把车牌填两遍 P2 已改

「车单号」和「车牌」是两个独立文本框,都预填了值、都能改。可一台车只可能有一个车牌, 两个框各填一次,只要有一边手滑,这张委外单就挂到了别的车上——回厂验收时谁也说不清该验哪台。

改法:车单号改成下拉(只列在修车单),车牌跟着车单号自动带出并转成只读; 下拉的选项文字里就带车牌,选的时候一眼能确认。

S-14 老客户再来「办卡」,余额会被清零 P1 已改

「办卡 / 充值」的客户栏是一个预填了人名的文本框,底下一句「办卡后余额 5,300.00」。 老客户卡里还有 3,900 本金 + 200 赠送,再充 5,000 应当是 9,400;按这个页面走,变成 5,300。 同一个按钮对老客户是「续充」、对新客户是「开卡」,页面没区分这两件事。

改法:客户改成下拉(只列已建档客户),选项上标清「已有卡」还是「无卡,本次新办」; 选老客户时提示「续充:新本金与赠送金叠加到原余额,卡号不变」,选新客户时提示「生成新卡号」。

6已经改了什么,怎么验

规范写在纸上不算数,必须有一条能变红的检查。这一轮把「标签含某类词、控件就必须是对应类型」做成了静态检查。
检查规则放在哪
日期类必须是日期控件标签含「日期 / 时间 / 到期 / 生效 / 入职」→ 必须 date 或 datetime-local 或 timegate.mjs 检查 I
电话必须是 tel标签含「手机 / 电话 / 热线」→ 必须 type="tel"gate.mjs 检查 I
算钱的必须是 number标签含「金额 / 工时 / 数量 / 里程」→ 必须 type="number" 且带 stepgate.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
为什么用静态检查而不是靠人记:这七条规则里有五条是可以从 HTML 直接判出来的。 写进规范没人看,写成断言每次跑 node gate.mjs 就会红。 新加一个字段,标签写了「生效日期」却给了 text 框,门禁立刻失败并指出是哪一页哪一行。

控件对了还不够,得真的能用

静态检查只看「标签和控件对不对得上」。这一轮另外写了 32 条打开页面点一遍的断言(verify-ctl.mjs),专测改成下拉/数字之后的行为有没有跟着改。
页面点一遍验的是什么
绩效 · 提成规则点「调整」时把表格里的 5.0% 回填成 5(去掉单位才能塞进数字框);换成「按单固定金额」后 step 变 0.01、max 清空;保存后表格里显示回 80.00
接车 · 开单取消勾「进店先收预收款」,金额与用途整块收起;再勾回来又出现;随车物品是两个页面同一套勾选组
交车 · 改结算方式打开时单选回填为当前方式;改成「单位挂账」后门禁里真的多出「对账签收单已盖章回传」那一行
车间 · 开委外单车单号是下拉;换一张车单,车牌跟着变(车牌不能单独填);预计回厂是日期控件
库存 · 采购申请关联车单下拉里带出「在修且等这个件」的车;选「急」却不选车 → 弹窗不关、提交不生效,只弹一条说明
会员 · 办卡客户是下拉;选老客户提示「续充、余额叠加」,选新客户提示「生成新卡号」
设置 · 字典排序是 number
顺带修掉一个通用毛病:全站 12 个弹窗原本都是「点确认 → 先关窗 → 再校验」,校验不通过时窗已经关了、刚填的东西全没了。 现在改成校验返回 false 就不关窗,只在窗口上弹一条说明——这条对所有端都一样。

改过的页面

E1 预约加「工位」下拉(只列空闲);预约日期改日期控件;「来源」改名「预约渠道」;手机号改 tel E1 接车开单服务类别改 checkbox 组;客户类别去掉系数、改业务名;预交车时间改日期时间;里程改 number E1 交车结算定损金额与交车里程改 number;删掉重复的定损单号;门禁加「去填」直达 E1 财务回款金额改 number 并实时显示「回款后余额」;到账日期改日期控件 E1 车间报工默认值改「能,按计划」;实际工时改 number;计划完工改日期时间;委外单的车单号改下拉、车牌改自动带出、预计回厂改日期 E1 设置补「会员卡扣款顺序」开关;营业时间拆成起止两个时间控件;电话改 tel;字典排序改数字 E1 绩效提成方式选项补全;新值改数字并按方式换单位(12% / 80.00 元);生效日期改日期控件 E1 定价调价范围选「指定服务分类」时出现分类多选;生效日期改日期控件 E1 员工手机号改 tel;入职日期与证书到期改日期控件 E1 会员卡客户改下拉(老客户标「续充」,不再清零原余额);消费金额改 number;页面里「可在设置改」的承诺已经在设置页补上 E1 库存采购申请加「紧急程度」与「关联车单」(下拉只列在修等件的车单,选急不挂车就拦);申请数量改 number E3 车主端救援与预约的日期、时段、电话类型对齐同一套规则

7还没定的两件事

这两条按 A 先做了,做完才发现两种做法都有站得住的理由——现在页面上的样子是 A,你不点头就不动。