「AI 低代码一分钟」系列 第 01 篇|阅读约 6 分钟
摘要:工装夹具台账、人员技能矩阵、交接班日志,这三类表在很多工厂还放在 Excel 里。一旦要多部门同时维护、要留改动记录、要和系统对账,就该考虑迁成应用。本文给出四个判定信号、一张台账上线后的最小表结构、字段级权限矩阵的画法、五步迁移顺序和并行对账的上线清单。
一、毛病不出在填表,出在表传出去之后
一张台账在自己电脑上打开的时候没有任何问题。发给第二个人,麻烦才开始。
交接班日志早班填完发给班长,班长汇总后报生产部,生产部改了某几个数再回传。三个月过去,谁手上那份是准的说不清。想查去年十月的一条记录,得去翻某个已经离职的员工留下的压缩包。
Excel 承担不了的这几件事,可以逐条翻译成系统能力:
| 需要做的事 | Excel 里的实际状态 | 业务上付出的代价 | 对应的系统能力 |
|---|---|---|---|
| 几个部门同时维护一张表 | 各存副本,用文件名区分版本 | 汇总时以哪一份为准要反复对 | 单一数据源 + 并发写控制 |
| 数据留下来做月度、年度分析 | 老版本被覆盖,只留最新一行 | 趋势分析没有底料 | 按期间归档,不覆盖历史行 |
| 不同的人只看自己那几行 | 只能限制整个文件 | 该限的没限住,该保密的泄露 | 行级 + 列级权限 |
| 在车间用手机随时填随时查 | 只能回办公室开电脑 | 现场记录延后半天到一天 | 移动端表单 |
| 追查改动 | 没有改动人、时间和原值 | 出了差错无法定责 | 变更审计流水 |
二、四个信号,占两条就值得动手
第一个信号,要好几个部门一起维护。一张表跨了两个以上部门,就一定有合并动作,有合并就有版本问题。
第二个,数据要留下来做月度和年度分析。要看趋势的数据经不起覆盖,覆盖一次就少一个月份。
第三个,不同的人只能看自己那几行,比如班组长只看本班。文件形式下能限的只有整个文件,行级权限做不到。
第四个,要在车间用手机随时填、随时查。手机填报这件事 Excel 本身不支持。
四条里第一条和第四条最难绕开。命中的条数多了,投入产出算得清。反过来,如果一张表从头到尾只有一个人在填,填完打印签字归档,那就继续用 Excel。
text
命中信号数 = 多部门共同维护 + 需要历史趋势 + 需要行级权限 + 需要移动端填报
命中数 >= 2 排期迁移
命中数 == 1 先定字段和责任人,暂不建系统
命中数 == 0 继续用 Excel
三、搬上线以后长什么样
一家市属水务集团把 21 个责任单位的投资项目搬到了线上。从这几个数字能看出这类系统的样子:27 张表单负责采集,20 份重点报表负责输出,已经汇总 1856 条填报信息。
录入口在 21 个责任单位自己手上,集团不用再等下面交表;表单和报表分开,报表从填报数据里跑出来,不是月底一格一格拼出来的;1856 条记录留在系统里,月度分析和年度分析就有了底料。
四、一张台账上线后的最小表结构(示意)
字段名按贵司规范替换,这里只表达切分思路:台账定义、数据行、变更流水分开,不要把改动历史塞在主表里。
sql
-- 1. 台账定义:列的元数据由平台维护,一张台账对应一份列定义
CREATE TABLE ledger (
ledger_id BIGINT PRIMARY KEY,
ledger_name VARCHAR(128) NOT NULL,
owner_role VARCHAR(64) NOT NULL, -- 台账责任人角色,必填
version INT NOT NULL DEFAULT 1
);
-- 2. 数据行:按期间归档,历史行不覆盖
CREATE TABLE ledger_record (
record_id BIGINT PRIMARY KEY,
ledger_id BIGINT NOT NULL,
biz_period CHAR(7) NOT NULL, -- 归属月份,如 2026-10
dept_code VARCHAR(64) NOT NULL, -- 行级权限按这一列切
row_data JSON NOT NULL, -- 台账各列,按列定义做必填与格式校验
row_status VARCHAR(16) NOT NULL, -- DRAFT / SUBMITTED / APPROVED
created_by VARCHAR(64) NOT NULL,
updated_at DATETIME NOT NULL,
UNIQUE (ledger_id, biz_period, dept_code)
);
-- 3. 变更流水:追查改动靠这张表
CREATE TABLE change_log (
log_id BIGINT PRIMARY KEY,
record_id BIGINT NOT NULL,
field_name VARCHAR(64) NOT NULL,
old_value VARCHAR(256),
new_value VARCHAR(256),
changed_by VARCHAR(64) NOT NULL,
changed_at DATETIME NOT NULL
);
UNIQUE (ledger_id, biz_period, dept_code) 这一行是关键。它把 Excel 里"同一张表同一个月份只有一份有效数据"这条口头约定变成数据库约束,重复填报在入口就被挡住。
五、权限矩阵先画再配
列级权限最容易漏的是成本类字段。下面这版可以直接拿去和现有的组织对照。
| 角色 | 可见行 | 可填 | 可改 | 可导出 | 特殊限制 |
|---|---|---|---|---|---|
| 班组长 | 本班 | 是 | 仅当日 | 否 | 看不到其他班次 |
| 车间主任 | 本车间 | 否 | 是 | 是 | 改动全部留痕 |
| 设备部 | 全部 | 是(设备列) | 仅设备列 | 是 | 成本列不可见 |
| 成本会计 | 全部 | 是(成本列) | 仅成本列 | 是 | 导出走审批 |
三条配置原则:新表单默认只发给创建人所在部门;导出按角色开关,默认关;权限变更本身也要进 change_log。
六、从一张表到一个系统要过哪几道
别指望一次把所有台账都搬完。顺的做法是按下面这个顺序走。
#mermaid-svg-KYvfX2EAVnXUbr0u{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-KYvfX2EAVnXUbr0u .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-KYvfX2EAVnXUbr0u .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-KYvfX2EAVnXUbr0u .error-icon{fill:#552222;}#mermaid-svg-KYvfX2EAVnXUbr0u .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-KYvfX2EAVnXUbr0u .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-KYvfX2EAVnXUbr0u .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-KYvfX2EAVnXUbr0u .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-KYvfX2EAVnXUbr0u .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-KYvfX2EAVnXUbr0u .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-KYvfX2EAVnXUbr0u .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-KYvfX2EAVnXUbr0u .marker{fill:#333333;stroke:#333333;}#mermaid-svg-KYvfX2EAVnXUbr0u .marker.cross{stroke:#333333;}#mermaid-svg-KYvfX2EAVnXUbr0u svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-KYvfX2EAVnXUbr0u p{margin:0;}#mermaid-svg-KYvfX2EAVnXUbr0u .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-KYvfX2EAVnXUbr0u .cluster-label text{fill:#333;}#mermaid-svg-KYvfX2EAVnXUbr0u .cluster-label span{color:#333;}#mermaid-svg-KYvfX2EAVnXUbr0u .cluster-label span p{background-color:transparent;}#mermaid-svg-KYvfX2EAVnXUbr0u .label text,#mermaid-svg-KYvfX2EAVnXUbr0u span{fill:#333;color:#333;}#mermaid-svg-KYvfX2EAVnXUbr0u .node rect,#mermaid-svg-KYvfX2EAVnXUbr0u .node circle,#mermaid-svg-KYvfX2EAVnXUbr0u .node ellipse,#mermaid-svg-KYvfX2EAVnXUbr0u .node polygon,#mermaid-svg-KYvfX2EAVnXUbr0u .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-KYvfX2EAVnXUbr0u .rough-node .label text,#mermaid-svg-KYvfX2EAVnXUbr0u .node .label text,#mermaid-svg-KYvfX2EAVnXUbr0u .image-shape .label,#mermaid-svg-KYvfX2EAVnXUbr0u .icon-shape .label{text-anchor:middle;}#mermaid-svg-KYvfX2EAVnXUbr0u .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-KYvfX2EAVnXUbr0u .rough-node .label,#mermaid-svg-KYvfX2EAVnXUbr0u .node .label,#mermaid-svg-KYvfX2EAVnXUbr0u .image-shape .label,#mermaid-svg-KYvfX2EAVnXUbr0u .icon-shape .label{text-align:center;}#mermaid-svg-KYvfX2EAVnXUbr0u .node.clickable{cursor:pointer;}#mermaid-svg-KYvfX2EAVnXUbr0u .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-KYvfX2EAVnXUbr0u .arrowheadPath{fill:#333333;}#mermaid-svg-KYvfX2EAVnXUbr0u .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-KYvfX2EAVnXUbr0u .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-KYvfX2EAVnXUbr0u .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-KYvfX2EAVnXUbr0u .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-KYvfX2EAVnXUbr0u .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-KYvfX2EAVnXUbr0u .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-KYvfX2EAVnXUbr0u .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-KYvfX2EAVnXUbr0u .cluster text{fill:#333;}#mermaid-svg-KYvfX2EAVnXUbr0u .cluster span{color:#333;}#mermaid-svg-KYvfX2EAVnXUbr0u div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-KYvfX2EAVnXUbr0u .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-KYvfX2EAVnXUbr0u rect.text{fill:none;stroke-width:0;}#mermaid-svg-KYvfX2EAVnXUbr0u .icon-shape,#mermaid-svg-KYvfX2EAVnXUbr0u .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-KYvfX2EAVnXUbr0u .icon-shape p,#mermaid-svg-KYvfX2EAVnXUbr0u .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-KYvfX2EAVnXUbr0u .icon-shape .label rect,#mermaid-svg-KYvfX2EAVnXUbr0u .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-KYvfX2EAVnXUbr0u .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-KYvfX2EAVnXUbr0u .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-KYvfX2EAVnXUbr0u :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 差异为 0
对不上
挑表
最疼的那张
定字段
必填 / 格式 / 可改角色
定权限
切到行和列
并行跑一个自然月
月底两边对数
复制第二张
沿用第一套配置思路
- 挑表。挑最疼的那张:填表部门最多、出报表最急、手机填报需求最迫切的那张。
- 定字段。表头原样搬过去,同时标清楚哪些必填、哪些要校验格式、哪些只有某个角色能改。
- 定权限。按角色切到行和列,谁能看、谁能填、谁能改、谁能导出,逐条对到现有的组织上。
- 并行跑一个自然月。月底拿新系统的报表和人工合并的报表对一次数,两边一致再停旧表。
- 复制第二张。字段和权限沿用第一套配置思路,成本比第一张低不少。
七、平台承担的部分
表单、字段校验、行级与列级权限、移动端填报、报表汇总、改动留痕,这几件事 Dolphin Code 低代码平台都能配出来,业务部门自己也能搭。得帆服务 2100 多家大型企业客户,落地 2400 多个项目,里面相当一部分就是这种把一张表变成一套应用的活。
上线检查清单
- 这张表当前的在用部门数和文件版本数已数清楚,命中的信号写进了需求
- 表头逐列标注必填、格式校验、可改角色
- 行级权限按组织落到部门列,抽查一个班组长账号只看得到本班
- 同一台账同月重复提交会被唯一约束拒绝
- 导出权限按角色开关,默认关闭
- 测试环境与正式环境分离,测试环境不导入真实成本数据
- 并行一个自然月,新旧报表差异为 0 才停旧表
- 任选一条记录,能从变更流水还原谁在何时把什么改成了什么
说明:本文作者供职于得帆智能,文中提到的 Dolphin Code 等产品为本公司产品。内容根据项目实施经验整理,仅作行业交流,不构成采购建议;文中表结构与代码均为示意,实际字段以各平台元数据规范为准。