更新记录

1.0.0(2026-11-07)

首个版本:四项实绩统一折成 0–100 分——质量分 = 批合格率 × 100,交期分 = 交期达成率 × 100,价格分 = 100 − (报价指数 − 100) × 2 并截断到 0–100,配合分 = 配合度(0–10) × 10。加权总分 = Σ(分项 × 权重) ÷ Σ(有权重的项),默认权重 40/25/20/15,可只填要改的那几项,其余按默认补齐后归一;缺数据的项不参与计算并重新归一权重,同时输出缺项数与「这次是拿哪几项算的」。等级四档 A ≥90 / B ≥80 / C ≥70 / D <70,比较留 1e-9 余量,避免「手算 90 分、浮点算成 89.999…、判成 B」。两道封顶按制度走:重大质量事故 ≥1 次封顶 C,没有来料质量数据封顶 B,原始等级与封顶原因分别输出。排名按总分降序、同分比质量分,带上月等级给出升 / 降 / 持平 / 新导入。敏感度:四项权重各 +10 个百分点、其余按比例缩到 90 重算,等级会翻的全部列出来(不止一项时用顿号连起来),且用同一套封顶规则判,不会一改权重就把封顶绕过去。台账 供应商,来料批次,判退批次,订单行,逾期行,报价指数,配合度[,事故次数,上月等级],逗号/制表符/分号/竖线都认,表头与 # 注释跳过,列数不足 7 的行丢掉。五类输入问题分别报错并点出供应商名,批量里有一条坏记录整批不放行。导出考评表 14 列 CSV,UTF-8 带 BOM,缺数据留空。UTS→Kotlin 编译通过(index.kt 1220 行、classes.dex 50664 字节),141 项回归测试全部通过;真机未执行(adb devices 为空,测试机不在线),市场截图为 H5 渲染并标注示例数据。


平台兼容性

uni-app

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
× √ × × √ × √ × ×
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
× × × × × × × × × × × ×

供应商月度考评与处置

给采购与品质:这家供应商这个月该评几级、要不要加严检验、要不要限单。

考评表用 Excel 也能拉,问题在两件事:缺数据的供应商怎么算(新导入的只有报价和配合分,硬补 0 就永远评不上),以及这个等级稳不稳(权重从 40 改成 50,会不会就有几家翻级)。本插件把这两件事做成一步。

怎么算

环节 做法
分项得分 质量分 = 批合格率 × 100;交期分 = 交期达成率 × 100;价格分 = 100 − (报价指数 − 100) × 2,落在 0–100;配合分 = 配合度(0–10) × 10
加权总分 Σ(分项得分 × 权重) ÷ Σ(有权重的项);某一项没有数据就不参与,权重按剩余项重新归一
等级 ≥90 A、≥80 B、≥70 C、<70 D(四条是经验分档,不是标准条文)
封顶 重大质量事故 ≥1 次 → 最高 C;没有来料质量数据 → 最高 B
处置 A 优先下单可申请放宽检验;B 正常下单;C 加严检验加约谈;D 限单并启动备选供应商
敏感度 四项权重各 +10 个百分点(其余按比例缩到 90),重算等级,会翻级的标出来

报价指数是「本厂报价 ÷ 市场均价 × 100」:100 表示持平,120 表示贵两成,84 表示便宜一成六。

它回答什么

  • 这个月七家供应商谁上 A、谁掉 D,处置动作分别是什么;
  • 苏州新元只有报价与合作两项数据,为什么不能直接评 A;
  • 中山铝业分数本来够 B,为什么等级是 C;
  • 东莞立邦 89.25 分卡在 B,把质量权重提到 50 就是 90.0 分 A 级——这个等级能不能拿去谈条件;
  • 考评表导出来开会用,缺数据的格子为什么是空的不是 0。

用法

import { vendorEvaluate, vendorOne, vendorParseText, vendorExport, vendorVersion } from '@/uni_modules/szhzy-vendor-score'

const r = vendorEvaluate({
  vendors: [
    { name: '华辉光电', lots: 120, rejects: 3, orders: 80, lates: 4, priceIndex: 103, coop: 8.5, incidents: 0, prevGrade: 'B' },
    { name: '苏州新元电子', lots: 0, rejects: 0, orders: 0, lates: 0, priceIndex: 95, coop: 8 },
    { name: '深圳恒力五金', lots: 80, rejects: 22, orders: 50, lates: 25, priceIndex: 84, coop: 3, prevGrade: 'C' }
  ],
  // 权重可以只填要改的那几项,其余按默认补齐
  weights: { quality: 50 }
})
// r.count / r.avgTotal / r.countA..D / r.unstable / r.hint
// r.weights: 归一后的权重
// r.vendors[i]: { rank, name, total, grade, rawGrade, delta, action, flags, missing, scores, wQuality.. }

单个供应商:

const one = vendorOne({ vendors: [{ name: '东莞立邦电源', lots: 96, rejects: 6, orders: 60, lates: 9, priceIndex: 96, coop: 7 }] })
// one.vendor.total 89.25 / one.vendor.grade B / one.vendor.action

台账

供应商,来料批次,判退批次,订单行,逾期行,报价指数,配合度,事故次数,上月等级
华辉光电,120,3,80,4,103,8.5,0,B
惠州宏泰线材,150,1,90,2,101,9,0,A
佛山盛通包材,40,2,30,3,88,5
  • 前七列必填,第八列事故次数、第九列上月等级可选;
  • 逗号、制表符、分号、竖线都认;表头与 # 注释跳过;列数不足 7 的行丢掉(宁可少算一家,不凭空补一家)。

导出

考评表 14 列:排名、供应商、批合格率、交期达成率、报价指数、价格分、配合度、配合分、总分、等级、较上月、缺项数、处置、备注。UTF-8 带 BOM,缺数据的格子留空(不补 0),默认写应用外部私有目录,不需要存储权限。

输入校验

判退批次多于来料批次、逾期行数多于订单行数、报价指数超出 20–400、配合度超过 10、事故次数为负,五种情况分别报错并点出供应商名;批量里有一条坏记录,整批不放行。

验证状态

  • 纯逻辑测试见 docs/vendor-score/测试记录.md,覆盖四项换算式手算、缺项归一、90/80/70 边界、两条封顶、排名与升降、敏感度手算、台账解析、CSV 导出。
  • UTS → Kotlin 编译:compiled successfully,产物行数与字节数见测试记录。
  • 真机未执行:当晚 adb devices 为空,测试机不在线,真机运行与真机截图都没做;市场截图为 H5 渲染,页面已标示例数据。

购买前必读

  • 批合格率用的是判退批次(整批退),不是「不良品率」;如果你们按不良数算,请换算成批口径再填,两者不能混。
  • 配合度是人工打分,占了 15 分权重。它在算法里就是主观的,别把它包装成客观指标。
  • 敏感度只做「单项 +10」的一次扰动,不是全局稳健性分析;它回答的是「会不会因为权重就翻级」,不是「哪一种权重最正确」。
  • 等级阈值 90 / 80 / 70 是经验分档,封顶规则(事故封 C、缺数据封 B)是管理制度的建议值,都可以在自己的流程里改。
  • 只支持 Android,iOS / 鸿蒙不支持;uni-app Vue3。

隐私、权限声明

1. 本插件需要申请的系统权限列表:

无系统权限。读取调用方用系统文件选择器交过来的文件(路径或 content:// 授权),写出走应用外部私有目录。

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集、不上传任何数据,不访问网络,不写日志。供应商实绩与权重只在内存中计算;导出的 CSV 由调用方决定是否落盘,默认写应用外部私有目录。

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

无

暂无用户评论。