const assert = require('node:assert/strict'); const fs = require('node:fs'); const path = require('node:path'); const root = path.resolve(__dirname, '..'); const salesModule = fs.readFileSync(path.join(root, 'prototype-src/modules/09-sales.html'), 'utf8'); const appJs = fs.readFileSync(path.join(root, 'prototype-src/app.js'), 'utf8'); const salesDataBlock = appJs.slice(appJs.indexOf('const salesCommissionData='), appJs.indexOf('const sysTenantData')); function assertInOrder(source, labels, message) { let previous = -1; labels.forEach((label) => { const position = source.indexOf(label, previous + 1); assert.ok(position > previous, `${message}: 缺少或顺序错误 “${label}”`); previous = position; }); } assertInOrder( salesModule, ['综合提成率', '固定提成(元)', '溢价提成(元)', '垫款利息(元)', '提成金额(元)'], '销售提成列表表头' ); ['fixedCommission', 'premiumCommission', 'advanceInterest'].forEach((field) => { assert.ok(new RegExp(`${field}:-?\\d`).test(salesDataBlock), `销售人员示例数据缺少 ${field}`); }); const advanceInterestValues = [...salesDataBlock.matchAll(/advanceInterest:(-?\d+)/g)].map((match) => Number(match[1])); assert.equal(advanceInterestValues.length, 5, '销售人员垫款利息示例数据数量不正确'); assert.ok(advanceInterestValues.every((value) => value < 0), '垫款利息必须全部为负值'); assert.ok( appJs.includes("return (value<0?'-':'')+'¥'+Math.abs(value).toLocaleString"), '负数金额必须显示为 -¥金额' ); const salesOrderCount = (salesDataBlock.match(/{no:'SO/g) || []).length; assert.equal((salesDataBlock.match(/floorPrice:\d/g) || []).length, salesOrderCount, '并非每条订单都有 floorPrice'); assert.equal((salesDataBlock.match(/settlementStatus:/g) || []).length, salesOrderCount, '并非每条订单都有独立结算状态'); assert.ok(/settlementStatus:'未结算'/.test(salesDataBlock), '订单示例数据缺少未结算状态'); assert.ok(/settlementStatus:'已结算'/.test(salesDataBlock), '订单示例数据缺少已结算状态'); assert.ok(/comm:fixedCommission\+premiumCommission\+advanceInterest/.test(appJs), '提成金额没有按三类提成求和'); assert.ok(/calculatedComm:total\*rate\/100/.test(appJs), '原订单比例提成结果没有保留给明细使用'); assert.ok(appJs.includes('scMoney(c.calculatedComm)'), '明细汇总没有继续使用原订单比例提成口径'); ['c.fixedCommission', 'c.premiumCommission', 'c.advanceInterest'].forEach((field) => { assert.ok(appJs.includes(field), `列表没有渲染 ${field}`); }); assert.ok(/colspan="12"[^>]*>暂无匹配数据/.test(appJs), '列表空态列数不是 12'); assertInOrder( appJs, ['收款时间', '状态', '客户名称'], '订单提成明细状态表头' ); assertInOrder( appJs, ['单价(元/kg)', '销售底价(元/kg)', '件数'], '订单提成明细销售底价表头' ); assert.ok(/o\.floorPrice\.toFixed\(2\)/.test(appJs), '订单提成明细没有渲染销售底价'); assert.ok(/o\.settlementStatus/.test(appJs), '订单提成明细没有渲染独立结算状态'); assert.ok(appJs.includes("o.settlementStatus==='已结算'?'tag-green':'tag-orange'"), '结算状态没有使用约定标签颜色'); assert.ok(/colspan="10"[^>]*>合计/.test(appJs), '明细合计行列数不是 10'); assert.ok(/overflow-x:auto/.test(appJs), '13 列明细表缺少横向滚动容器'); console.log('销售提成字段验证通过');