verify-scoring-contract.mjs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435
  1. import { readFileSync } from 'node:fs'
  2. import { resolve } from 'node:path'
  3. const root = resolve(new URL('..', import.meta.url).pathname)
  4. const myResult = readFileSync(resolve(root, 'src/views/scoring/MyResultView.vue'), 'utf8')
  5. const scoringEdit = readFileSync(resolve(root, 'src/views/scoring/ScoringEditView.vue'), 'utf8')
  6. const failures = []
  7. function reject(pattern, message) {
  8. if (pattern.test(myResult) || pattern.test(scoringEdit)) failures.push(message)
  9. }
  10. function requireIn(file, pattern, message) {
  11. if (!pattern.test(file)) failures.push(message)
  12. }
  13. reject(/满分\s*60[\s\S]{0,80}OKR|OKR[\s\S]{0,80}满分\s*60/, 'OKR 自评/终评必须是 40 分制,不能显示满分 60')
  14. reject(/满分\s*40[\s\S]{0,80}工作成果|工作成果[\s\S]{0,80}满分\s*40/, '工作成果必须是 60 分制,不能显示满分 40')
  15. reject(/×\s*0\.[46](?!\d)/, '结果展示不能使用二次加权系数 ×0.6 或 ×0.4(排除动画时长 0.4s 等合法值)')
  16. reject(/\*\s*60\s*\*\s*10/, 'OKR 计算不能乘以 60')
  17. reject(/OKR\(40%\)|工作成果\(60%\)/, '评分预览应写分值制,不应写成百分比加权')
  18. requireIn(myResult, /OKR 得分 = 平均[\s\S]*× 40[\s\S]*\/ 40/, 'MyResultView 自评 OKR 小计应展示 ×40 与 /40')
  19. requireIn(myResult, /工作成果得分 =[\s\S]*\/ 60/, 'MyResultView 自评工作成果小计应展示 /60')
  20. requireIn(scoringEdit, /OKR 得分 = 平均[\s\S]*× 40[\s\S]*\/ 40/, 'ScoringEditView 终评 OKR 小计应展示 ×40 与 /40')
  21. requireIn(scoringEdit, /工作成果得分 =[\s\S]*\/ 60/, 'ScoringEditView 终评工作成果小计应展示 /60')
  22. if (failures.length) {
  23. console.error('评分契约检查失败:')
  24. failures.forEach(item => console.error(`- ${item}`))
  25. process.exit(1)
  26. }
  27. console.log('评分契约检查通过')