供应商门户的报价与对账:外部账号权限隔离与 ERP 回写设计

「AI 低代码一分钟」系列 第 08 篇|阅读约 7 分钟

摘要:图纸和报价单在工作群里传,最贵的不是价格谈不下来,是出错以后查不到过程。给供应商开门户,注册、报价、预约送货、在线对账四件事在线做完,数据由供应商自己填。本文给出行级隔离的权限设计、账号生命周期与供应商档案联动、对账差异的三类成因与对应字段口径。

一、群聊和邮件传图纸,事后查不到

采购协同里最贵的不是价格谈不下来,是出了错以后查不到过程。

图纸按版本发,群里的文件会被旧版本顶掉,供应商按三个月前那张图纸生产,来料才发现不对。报价单散在邮件里,比价时要一家一家翻。送货靠电话约,仓库不知道该收多少,到货高峰就堵在门口。月底对账,一张张核对送货单和发票,采购员的活变成了录入和核数。

采购员每天还要花不少时间,把外面发来的数据手工录进 ERP。

二、门户给供应商做哪几件事

门户功能 供应商做什么 企业内部看到 数据去哪
注册与资质 提交营业执照、资质证照 资质有效期、缺件提醒 供应商档案
报价 在询价单里填报价 多家报价可直接比 定标结果回写
预约送货 按订单约时间、打印标签 到货计划 收货确认后回写
在线对账 核对对账单、发起请款 差异一目了然 请款数据回写 ERP

四件事的共同点是数据由供应商自己填。采购员不再替外面的人录单,录错的账也不用两头找责任。

三、隔离粒度:只能按供应商主键切

门户最容易踩的坑是权限。每家供应商只看得到自己的订单和对账单,比价结果、别家的报价、内部成本,一律不可见。这一步要做在功能上线之前,不能先开放再收权。
#mermaid-svg-m4rlR5R1enyHYaTq{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-m4rlR5R1enyHYaTq .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-m4rlR5R1enyHYaTq .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-m4rlR5R1enyHYaTq .error-icon{fill:#552222;}#mermaid-svg-m4rlR5R1enyHYaTq .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-m4rlR5R1enyHYaTq .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-m4rlR5R1enyHYaTq .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-m4rlR5R1enyHYaTq .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-m4rlR5R1enyHYaTq .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-m4rlR5R1enyHYaTq .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-m4rlR5R1enyHYaTq .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-m4rlR5R1enyHYaTq .marker{fill:#333333;stroke:#333333;}#mermaid-svg-m4rlR5R1enyHYaTq .marker.cross{stroke:#333333;}#mermaid-svg-m4rlR5R1enyHYaTq svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-m4rlR5R1enyHYaTq p{margin:0;}#mermaid-svg-m4rlR5R1enyHYaTq .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-m4rlR5R1enyHYaTq .cluster-label text{fill:#333;}#mermaid-svg-m4rlR5R1enyHYaTq .cluster-label span{color:#333;}#mermaid-svg-m4rlR5R1enyHYaTq .cluster-label span p{background-color:transparent;}#mermaid-svg-m4rlR5R1enyHYaTq .label text,#mermaid-svg-m4rlR5R1enyHYaTq span{fill:#333;color:#333;}#mermaid-svg-m4rlR5R1enyHYaTq .node rect,#mermaid-svg-m4rlR5R1enyHYaTq .node circle,#mermaid-svg-m4rlR5R1enyHYaTq .node ellipse,#mermaid-svg-m4rlR5R1enyHYaTq .node polygon,#mermaid-svg-m4rlR5R1enyHYaTq .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-m4rlR5R1enyHYaTq .rough-node .label text,#mermaid-svg-m4rlR5R1enyHYaTq .node .label text,#mermaid-svg-m4rlR5R1enyHYaTq .image-shape .label,#mermaid-svg-m4rlR5R1enyHYaTq .icon-shape .label{text-anchor:middle;}#mermaid-svg-m4rlR5R1enyHYaTq .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-m4rlR5R1enyHYaTq .rough-node .label,#mermaid-svg-m4rlR5R1enyHYaTq .node .label,#mermaid-svg-m4rlR5R1enyHYaTq .image-shape .label,#mermaid-svg-m4rlR5R1enyHYaTq .icon-shape .label{text-align:center;}#mermaid-svg-m4rlR5R1enyHYaTq .node.clickable{cursor:pointer;}#mermaid-svg-m4rlR5R1enyHYaTq .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-m4rlR5R1enyHYaTq .arrowheadPath{fill:#333333;}#mermaid-svg-m4rlR5R1enyHYaTq .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-m4rlR5R1enyHYaTq .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-m4rlR5R1enyHYaTq .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-m4rlR5R1enyHYaTq .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-m4rlR5R1enyHYaTq .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-m4rlR5R1enyHYaTq .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-m4rlR5R1enyHYaTq .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-m4rlR5R1enyHYaTq .cluster text{fill:#333;}#mermaid-svg-m4rlR5R1enyHYaTq .cluster span{color:#333;}#mermaid-svg-m4rlR5R1enyHYaTq 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-m4rlR5R1enyHYaTq .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-m4rlR5R1enyHYaTq rect.text{fill:none;stroke-width:0;}#mermaid-svg-m4rlR5R1enyHYaTq .icon-shape,#mermaid-svg-m4rlR5R1enyHYaTq .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-m4rlR5R1enyHYaTq .icon-shape p,#mermaid-svg-m4rlR5R1enyHYaTq .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-m4rlR5R1enyHYaTq .icon-shape .label rect,#mermaid-svg-m4rlR5R1enyHYaTq .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-m4rlR5R1enyHYaTq .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-m4rlR5R1enyHYaTq .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-m4rlR5R1enyHYaTq :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 列表 / 详情 / 导出全部带
任一入口未带
供应商账号

supplier_id = 2087
查询是否带 supplier_id 约束
只返回本商数据
越权风险,禁止发布
比价结果、他家报价、内部成本列

在元数据层就不返回

两个实现细节。列表、详情、导出三个入口都要带 supplier_id 约束,只在列表页加过滤等于没加;敏感列不给前端返回,隐藏列和不下发列的差别,是出过一次事故才知道的。

sql 复制代码
CREATE TABLE rfq_quote (
  quote_id        BIGINT PRIMARY KEY,
  rfq_id          BIGINT       NOT NULL,
  supplier_id     BIGINT       NOT NULL,   -- 行级隔离键
  material_code   VARCHAR(64)  NOT NULL,   -- 以 ERP 主数据为准,不可自造
  price_excl_tax  DECIMAL(18,4),
  tax_rate        DECIMAL(5,2),
  price_incl_tax  DECIMAL(18,4),
  freight_by      VARCHAR(8),              -- SELLER / BUYER
  valid_until     DATE         NOT NULL,
  drawing_version VARCHAR(32)  NOT NULL,   -- 锁定报价所依据的图纸版本
  status          VARCHAR(16)  NOT NULL,
  UNIQUE (rfq_id, supplier_id, material_code)
);

drawing_version 是必填项。让供应商在报价时就写明按哪一版图纸报价,来料不符时能立刻定位是谁的哪一次理解错了,这比事后翻群记录有效。

四、账号停用要挂在供应商档案上

供应商侧的账号也不必走内网。外部人员多、没有内网账号,正是门户这种形式适合的场景。

账号还有一件事要提前定:停用。供应商换了对接人,或者合作结束,门户账号要能在当天关掉。这类账号多半归采购员自己维护,人一多就忘记收,是外部数据泄露最常见的一条路。更稳妥的做法是把账号状态和供应商档案挂钩,档案一冻结,门户登录跟着停。

sql 复制代码
CREATE VIEW v_external_account AS
SELECT a.account_id, a.supplier_id, a.last_login_at,
       CASE WHEN s.archive_status IN ('FROZEN', 'TERMINATED')
            THEN 'DISABLED' ELSE 'ENABLED' END AS effective_status
FROM   portal_account a
JOIN   supplier_archive s ON s.supplier_id = a.supplier_id;

用视图而不是任务脚本去批量禁用。脚本一停就失效,档案状态和登录权限之间的约束必须一直在。

五、确认后的数据要回写 ERP

门户里确认完的报价、收货、请款数据,通过得帆的 Dolphin Integration 集成平台回写 ERP,不用再手工录。接口的字段和编码规则要在上线前和 ERP 侧对齐,尤其是物料编码、订单号、供应商代码这几个主键,对不上就会形成一批挂账。

六、月底对不上账,原因集中在这三类

成因 现象 处理方式
单据停在半路上 货到了、签收了,系统里收货确认没人点,对账单少一条 把确认收货做成供应商可见的状态,缺这一步就亮出来
价格版本不一致 合同价调整了,门户里还挂着旧价,两边各按各的算 对账单从合同或订单取价,不给手工输入
口径没定死 含税与否、税率取什么时点、折让算在哪一期 三项在报价阶段就固定在单子上

第一类最常见,也最好治。第二类靠取数规则解决:凡是能由系统从合同算出来的字段,一律不给输入框。第三类靠前置,月底再吵已经晚了。

七、一家汽轮机企业的采购协同

我们给一家汽轮机企业做采购协同,也是这个思路。供应商资质、采购和外协合同、报价和请款进门户,再和生产管理系统打通。

资质到期前有人被提醒,报价和合同留在系统里可比可查,请款走到哪个环节双方都看得见,这几件事不再依赖某个采购员的个人记忆。

八、四条判断标准

外部人员多;没有内网账号;来往频繁;数据要回写。占两条就适合做门户。

动手之前先定一件事:门户里哪些字段算数。以报价为例,含税与否、运费谁承担、报价有效期,这三项口径不统一,多家供应商的报价摆在一起也没法比。把这页口径写成一页纸发给供应商,比先上功能更有效。

上线检查清单

  • 列表、详情、导出三个入口都带 supplier_id 约束,做过跨账号越权测试
  • 比价结果、他家报价、内部成本列在接口层不下发
  • 报价必填含税口径、运费承担方、有效期、图纸版本
  • 对账单金额从合同或订单取数,无手工输入入口
  • 账号有效状态由供应商档案推导,冻结当日不可登录
  • 主键字段(物料编码、订单号、供应商代码)已与 ERP 侧逐条对齐
  • 写回接口有幂等键与失败重试记录,可查挂账清单
  • 上线前把口径一页纸发给在用供应商并留确认记录

说明:本文作者供职于得帆智能,文中提到的 Dolphin Code、Dolphin Integration 等产品为本公司产品。内容根据项目实施经验整理,仅作行业交流,不构成采购建议;文中表结构与 SQL 均为示意。

相关推荐
Wonopop12 天前
AWS Budgets 预算告警与卡片拒付,为什么不能共用一个“超支“状态?附对账模型与反例测试
云计算·aws·支付系统·对账·mpchat
优德普ERP数字化2 个月前
联轴器装配参数自适应怎么落地:从SRM批次数据到工艺复核
srm·mes·制造业ai·联轴器装配·工艺参数·优德普ai+srm
王六米。2 个月前
本地 AI Agent 如何设计可恢复的文件操作任务:从权限隔离、操作日志到失败回滚,给出工程化排查和验收方法
失败回滚·权限隔离·操作日志·本地ai agent·文件操作可恢复
jonyleek2 个月前
制造业审批提效实践:用JVS流程引擎3分钟配置可热发布的审批流(附界面操作步骤)
低代码·流程引擎·零代码开发·erp集成·jvs·制造业it·审批自动化
Lalolander3 个月前
金蝶 ERP 项目延期交付怎么办?ERP 拖期原因与补救方案
大数据·制造·金蝶erp·erp集成·半导体行业数字化转型·金众诚科技
Token观测者4 个月前
Agent 上生产的最后一公里:权限、发布、回滚和版本治理
ai安全·大模型落地·aiagent·权限隔离
ZGi.ai5 个月前
多租户AI平台设计:权限隔离、数据隔离与计费隔离工程实现
人工智能·数据隔离·ai平台·权限隔离·计费系统
ZGi.ai5 个月前
政务AI平台建设:统一接入、权限隔离与数据合规工程实践
人工智能·私有化部署·政务·数据合规·统一接入·政务ai·权限隔离
spencer_tseng9 个月前
ERP CRM SCM MES PLM SRM WMS OMS HRMS
wms·crm·srm·erp·mes·plm·scm