上一篇文章发布时(89 篇),威盾 FDE 的定位是「防水建材公司的前线作战台」:工程项目、合同回款、现场巡检、客户经销商、产品知识库、AI 盾盾——25 个模块,主线是「报价 → 合同 → 回款 → 对账 → 催收」和「巡检 → 整改 → 复查」两条业务线。
这个定位有个天然的截断:它管交付,不管交付之前和之后的事。材料是买来的还是自己产的?成本从哪来、到哪去?客户下了单谁发货?这一整段,系统是缺席的。
而这一个月(对应用户视角里「Codex 连续两天爆肝 + 前后数轮迭代」),这条断层被补上了。现在的 README 第一行写着:
公司主体也正式更名为「四川省威盾匠心建设有限公司」——系统跟着客户的工商抬头走,从名字开始对齐。
新链条长这样:
原来的两条老主线没有丢,而是被接进了更大的网络:报价可以直接转销售订单;工地领料直接扣库存、挂项目成本;采购到货自动入库并按批次记成本,供应商对账和应付账龄自动算。三件事(生产、买卖、施工)终于共用同一套库存和同一套成本口径。
这是本次升级里最硬的一块。生产这条线以前是完全不在系统里的——客户工厂里产一桶防水涂料,料耗多少、人工多少、制造费用摊多少,全在老师的脑子里和 Excel 里。
先录 BOM(物料清单):一桶「W8 外墙防水涂料」由哪几种原料各多少组成,版本化管理,改配方留痕。建生产工单时选配方,系统自动按计划产量展开用料需求,不用人工算。
这里做了一个刻意的设计:报工与入库分开。领料扣的是原料库存(真实发生才算),报工记的是工时和完工进度(人说了算),完工入库增的是成品库存。两个动作不强制捆绑——现实中「报了工但还没入库」「先入库后补报工」都存在,系统不假装它们总是一起发生。
工单完工时,单位成本 = 材料(实际领料,无领料时退回 BOM 标准成本)+ 人工 + 制造费用。人工和制造费率按「车间优先、全局兜底」取用——不同车间人工费率不一样,没单独设置的车间用全局默认值。报工累计的工时参与分摊,成本算完回写工单和成品入库单。
实拍截图里的真实数据:MO-00001 工单产 50 桶 W8 外墙防水涂料,材料 ¥1,982.29 + 人工 ¥2,880.00 + 制造费用 ¥1,610.00 = 总成本 ¥6,472.29,单位成本 ¥129.45/桶。这个数会一路跟着成品走进库存、走进销售发货、走进项目成本——毛利率不再靠拍脑袋。
库存是生产、销售、施工三方的共同底座,所以单独做厚了:
截图里的演示数据:5 个仓、18 条出入库流水,库存余额按「仓库 × 物料 × 批次」逐行挂着单价和到期日——这是能直接对实物的账,不是装饰性表格。
采购线之前只有一张「采购台账」,这次升级成了完整的供应链:
几个值得说的细节:
以前智能报价生成报价单之后,故事就停在「客户签了合同」。现在:
发货直接扣成品库存——卖出去的每一桶都从账上走,库存数字不会撒谎。物流单号和签收回执挂回订单,客户问「我的货到哪了」,系统里有答案。
质量检验覆盖三道关:来料检(供应商的货进门先验)、过程检(生产中间环节抽查)、成品检(出厂前最后一道)。支持留样管理——涂料行业有留样要求,样品到期自动提醒。
设备管理做了状态机:设备台账 → 点检(发现异常自动生成维修单)→ 维修中 → 维保完工自动恢复在用。反应釜坏了不用在群里喊师傅,系统自己把单派出去。
这块是给工地上的 FDE 用的。手机端三合一:
手机拍一张,自动打上项目名、时间、定位水印——工地照片最怕「说不清是哪天拍的哪个部位」,水印一步解决。选部位和结果,一步生成巡检单并挂照片。
扫材料码直接工程领用,自动扣库存、自动记到项目。以前工地领料靠纸条,月底对账全靠猜。
我的项目 / 待整改 / 最近巡检,早上打开一眼知道今天干什么。
工地信号差是常态,所以做了离线队列:拍照巡检和扫码领料先存本机队列,联网自动补传。服务端用 client_ref 幂等去重——同一台手机重复补传三次,也只会建一张单、扣一次库存。这个细节是「能不能真用」和「演示时能跑」的分水岭。
前面 37 个模块是给干活的人用的,第 38 个是给老板的。经营驾驶舱一屏四件事:
实拍截图里的数据:经营总额 ¥6,080,500、应收余额 ¥3,726,500(红色警示)、在手现金 ¥13,330,000、毛利 17.5%——全是系统里真实流转出来的数,不是摆拍。
系统越大,最贵的成本越不是开发,而是录入。所以这次同步加了两条「进料口」:
四个场景——回款流水 / 现场巡检 / 材料报价 / ERP 出库单。银行流水、Excel 片段、微信里甩过来的一串数字、工程师随口说的现场描述,粘进来就自动解析匹配成结构化草稿,人工确认后一键入账。零依赖实现,24 项测试。
「数据入口」页新增「数据同步(ERP / CRM)」:客户、项目、合同、回款、成本、供应商、班组、出勤、工资九类数据一键或定时同步进系统,每次同步留运行审计(状态 / 条数 / 耗时 / 触发方式 / 错误)。支持进程内定时(FDE_SYNC_INTERVAL_MIN)和外部 cron(npm run sync:run)两种节奏。
功能堆到 38 个模块,再不补底座迟早出事。这轮专门做了几件「看不见但救命」的工程:
npm run route:index):239 条路由 / 65 个模块,覆盖 server.js + 独立路由模块,带行号与服务反查——38 个模块的系统再也不能「凭记忆找代码」;npm run archive 生成干净源码包(61.47 MB / 388 文件,SHA256 校验),F 盘 + E 盘各一份,解包后 360 项测试全通过;npm run demo:seed / demo:clear,五套幂等脚本(成本 / 库存 / 制造 / 采购 / 通讯录),带「演示数据」标记可整清;左侧导航 38 个功能模块一个不落,外加登录页,共 39 张,全部 3840×2160。数据来自 demo:seed 演示种子(备注带「演示数据」标记),浏览器仅缩放无压缩直出。
38 个模块之后,系统最大的风险不再是「功能不够」,而是用不起来。所以下阶段的主线已经明确:
两个月前它是 10 个模块的「防水交付工具」,一个月前是 25 个模块的「前线作战台」,现在是 38 个模块的「生产·库存·销售·施工一体化」。下一个版本见。