import assert from 'node:assert/strict' import { formatProgressPersonLines, type ProgressPersonInput } from '../src/utils/oa-progress-person-lines' function run() { // 会签部分完成 const andPartial: ProgressPersonInput[] = [ { nickName: '甲', status: 'approved', commentText: '同意', timestamp: '2026-07-23 10:01:00' }, { nickName: '乙', status: 'approved', commentText: '无异议', timestamp: '2026-07-23 10:20:00' }, { nickName: '丙', status: 'pending', commentText: '', timestamp: '' } ] const andLines = formatProgressPersonLines(andPartial) assert.deepEqual( andLines.map((x) => x.text), [ '甲 同意 2026-07-23 10:01:00', '乙 无异议 2026-07-23 10:20:00', '丙 待处理' ] ) assert.equal(andLines[0].tone, 'ok') assert.equal(andLines[2].tone, 'pending') // 或签一人已批:操作人 + 免处理仍列出 const orDone: ProgressPersonInput[] = [ { nickName: '甲', status: 'approved', commentText: '同意,材料齐全', timestamp: '2026-07-23 10:05:00' }, { nickName: '乙', status: 'done', commentText: '', timestamp: '2026-07-23 10:00:00' }, { nickName: '丙', status: 'done', commentText: '', timestamp: '' } ] const orLines = formatProgressPersonLines(orDone) assert.deepEqual( orLines.map((x) => x.text), ['甲 同意,材料齐全 2026-07-23 10:05:00', '乙 无需处理', '丙 无需处理'] ) assert.equal(orLines[0].tone, 'ok') assert.equal(orLines[1].tone, 'mute') assert.equal(orLines[2].tone, 'mute') // 已同意但无意见 → 状态文案兜底 const emptyComment = formatProgressPersonLines([ { nickName: '甲', status: 'approved', commentText: '', timestamp: '2026-07-23 10:05:00' } ]) assert.equal(emptyComment[0].text, '甲 已同意 2026-07-23 10:05:00') // 拒绝 const rejected = formatProgressPersonLines([ { nickName: '甲', status: 'rejected', commentText: '不同意', timestamp: '2026-07-23 11:00:00' }, { nickName: '乙', status: 'done' } ]) assert.equal(rejected[0].text, '甲 不同意 2026-07-23 11:00:00') assert.equal(rejected[0].tone, 'danger') assert.equal(rejected[1].text, '乙 无需处理') // 转交 const xfer: ProgressPersonInput[] = [ { nickName: '李四', status: 'transferred', commentText: '', timestamp: '2026-07-23 10:05:00', transferToUserName: '赵六' }, { nickName: '赵六', status: 'pending', commentText: '', timestamp: '' } ] const xferLines = formatProgressPersonLines(xfer) assert.deepEqual( xferLines.map((x) => x.text), ['李四 转交给赵六 2026-07-23 10:05:00', '赵六 待处理'] ) assert.equal(xferLines[0].tone, 'mute') const xferComment: ProgressPersonInput[] = [ { nickName: '李四', status: 'transferred', commentText: '出差代批', timestamp: '2026-07-23 10:05:00', transferToUserName: '赵六' } ] assert.equal( formatProgressPersonLines(xferComment)[0].text, '李四 转交给赵六 出差代批 2026-07-23 10:05:00' ) // 转交目标缺失时回退「已转交」 assert.equal( formatProgressPersonLines([ { nickName: '李四', status: 'transferred', commentText: '', timestamp: '2026-07-23 10:05:00' } ])[0].text, '李四 已转交 2026-07-23 10:05:00' ) // 转交目标缺失但有说明:仍用说明 assert.equal( formatProgressPersonLines([ { nickName: '胡圆凯', status: 'transferred', commentText: '123123', timestamp: '2026-07-23 17:35:12' } ])[0].text, '胡圆凯 123123 2026-07-23 17:35:12' ) // 空 people assert.deepEqual(formatProgressPersonLines([]), []) assert.deepEqual(formatProgressPersonLines(undefined), []) console.log('oa-progress-person-lines: all assertions passed') } run()