/** * 离职人员素材部门托管 * * 把已归档(离职)账号名下的素材,交由各自所属部门接管。 * * 托管只改变"谁负责维护":userId 与 authorName 保持不变, * 首页素材卡片显示的作者仍然是本人——素材是谁做的,永远记在谁名下。 * * 默认预演,不写任何数据。加 --apply 才实际执行。 * * 用法: * npx tsx scripts/custody-archived-user-materials.ts # 预演 * npx tsx scripts/custody-archived-user-materials.ts --apply # 实际执行 */ import { PrismaClient } from '@prisma/client' import { custodyMaterialsOfArchivedUsers } from '../lib/material-transfer' const prisma = new PrismaClient() async function main() { const apply = process.argv.includes('--apply') console.log('\n离职人员素材部门托管') console.log('模式:' + (apply ? '⚠️ 实际执行' : '预演,不写入')) const result = await custodyMaterialsOfArchivedUsers({ dryRun: !apply }) console.log('\n===== 汇总 =====') console.log(' 涉及离职账号 ' + result.accounts + ' 个') console.log(' 待托管素材 ' + result.totalMaterials + ' 条') if (apply) console.log(' 已完成托管 ' + result.custodied + ' 条') if (result.details.length > 0) { console.log('\n===== 明细(按素材数排序)=====') console.log(' 离职账号 接管部门 素材数') console.log(' ' + '-'.repeat(52)) result.details .sort((a, b) => b.count - a.count) .forEach((d) => { console.log( ' ' + d.username.padEnd(18) + (d.department ?? '未知').padEnd(20) + String(d.count).padStart(6) ) }) } if (result.skipped.length > 0) { console.log('\n===== 无法自动托管(需人工指定部门)=====') result.skipped .sort((a, b) => b.count - a.count) .forEach((s) => { console.log(' ' + s.username.padEnd(18) + String(s.count).padStart(5) + ' 条 ← ' + s.reason) }) } if (!apply) { console.log('\n(预演结束,未写入任何数据。加 --apply 实际执行)') } await prisma.$disconnect() } main().catch(async (e) => { console.error('\n执行失败:', e) await prisma.$disconnect() process.exitCode = 1 })