| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419 |
- #!/usr/bin/env node
- import { readFileSync, writeFileSync } from 'node:fs';
- import { resolve } from 'node:path';
- const root = resolve(import.meta.dirname, '..');
- const sourcePath = resolve(root, 'docs/migration/legacy-admin-inventory.generated.md');
- const outputPath = resolve(root, 'src/app/admin/legacy-admin-coverage.generated.ts');
- const checkOnly = process.argv.includes('--check');
- const explicit = new Map([
- ['User/GroupManage', ['implemented', '已由 Group 资源页与专用帐套组生命周期替代']],
- ['User/Group_API', ['implemented', '已覆盖帐套组列表与带引用保护的删除']],
- ['User/GroupAdd', ['implemented', '已由动态组表单与专用 saveGroup 替代']],
- ['User/GroupAdd_Submit', ['implemented', '已覆盖原子编号、父组校验与保存']],
- ['Content/ContentManage_Status', ['implemented', '已由 contentBatch 状态操作替代']],
- ['Content/ContentManage_Del', ['implemented', '已由 contentBatch 回收站操作替代']],
- ['Content/ContentMove', ['implemented', '已由内容详情与批量节点移动控件替代']],
- ['Content/ContentMove_Submit', ['implemented', '已由 contentBatch 帐套节点校验与移动替代']],
- ['Content/IHtmlToString', ['implemented', '已由 cms.content-normalizer 替代']],
- ['User/UserManage', ['partial', '已提供帐套用户列表、搜索、分页和批量操作;旧多条件筛选与导出仍待补齐']],
- ['User/UserAdd', ['partial', '已提供安全普通用户开户;旧扩展资料字段尚未全部复刻']],
- ['User/UserAdd_Submit', ['partial', '已覆盖开户、旧用户 ID 与默认账户初始化']],
- ['User/UserInfo', ['partial', '已提供动态详情、资料编辑、状态、分组和密码重置']],
- ['User/UserInfo_Submit', ['partial', '已覆盖安全字段更新;旧 UserBase 全字段仍待专用映射']],
- ['User/User_API', ['partial', '已覆盖锁定、解锁、移动分组;标注、归属管理员和手机归属地尚未迁移']],
- ['User/UserExp', ['partial', '现有账本可查询,管理员余额变更表单与事务规则尚未补齐']],
- ['Content/ContentManage', ['partial', '已提供帐套内容列表、搜索、分页、审核和批量操作']],
- ['Content/EditContent', ['partial', '可编辑安全主表字段;模型附表专用表单尚未全部生成']],
- ['Content/Content_Update', ['partial', '可更新安全主表字段;模型附表更新仅覆盖已迁移学习模型']],
- ['Content/ContentRecycle', ['partial', '可回收和恢复内容;独立回收站筛选页尚未提供']],
- ['Content/ContentManage_API', ['partial', '已覆盖恢复;永久删除、清空、专题移除和排序交换尚未迁移']],
- ['Content/GetMDFile', ['implemented', '旧动作固定返回空字符串,已由 legacyContentUtility 原样兼容为空内容']],
- ['Content/AddContent', ['partial', '现有 content_add 可为已规范化的六类学习模型生成主表与附表;任意旧动态模型表单仍缺失']],
- ['Content/ShowContent', ['partial', '已提供 CommonModel 详情与已规范化模型查询;旧评论、任意动态附表、前后篇及静态页预览未恢复']],
- ['Content/Content_Add', ['partial', '已由 content_add 原子创建已签约模型的 CommonModel 与规范化附表;未迁移模型会明确拒绝']],
- ['Content/Content_AddToNew', ['blocked-data', '目标缺少按 CommonModel.tableName 动态复制任意旧模型附表的完整结构与数据']],
- ['Content/Content_Draft', ['partial', 'content_add 支持把已规范化模型以 status=-3 写为草稿;任意旧动态模型仍不可创建']],
- ['Content/Content_API', ['implemented', '已由 legacyContentUtility duplicate-title 帐套隔离、大小写不敏感地检查重复标题']],
- ['Content/AddToSpec', ['blocked-data', 'CommonModel.specialId 仅存在于 Parse Schema,PostgreSQL 物理查询仍失败,无法安全读取专题关系']],
- ['Content/AddToSpec_Submit', ['blocked-data', '专题关系物理列不可可靠读写,且商品主表未迁移,不能伪造加入专题成功']],
- ['Content/ContentManage_Html', ['blocked-infrastructure', '云函数运行时没有旧模板解析器、站点根目录与静态 HTML 文件宿主']],
- ['Content/ContentManage_ToExcel', ['partial', '已由帐套隔离导出云函数与 Angular CSV 下载覆盖八个旧导出列;文件格式由 xlsx 降级为安全 CSV']],
- ['Content/ContentManage_Refresh', ['implemented', '已由 contentBatch refresh 批量同步刷新 createTime 与 upDateTime']],
- ['Content/ContentRelease', ['blocked-data', '目标 Schema 缺少 Content_ScheTask 定时内容任务及既有任务记录']],
- ['Content/ContentRelease_Submit', ['blocked-infrastructure', '目标没有 HFHelper 调度器与 ZL_Task_Content 脚本执行运行时']],
- ['Content/CreateHtmlContent', ['blocked-infrastructure', '云函数没有旧节点模板、标签解析器与站点文件系统,无法预览静态生成范围']],
- ['Content/Create_Submit', ['blocked-infrastructure', '目标没有 ContentHtmlHelper 和旧模板标签运行时,无法执行内容静态生成任务']],
- ['Content/CreateHtml', ['blocked-infrastructure', '目标云函数不能写入旧站点 HTML 目录,也没有旧模板渲染环境']],
- ['Content/ConCatch', ['blocked-data', '目标缺少旧采集项目、采集规则、来源站点与任务历史数据']],
- ['Content/CatchConfig', ['blocked-infrastructure', '目标没有 SiteOption.Coll_Allow/Coll_Key 配置模型及采集运行时消费者']],
- ['Content/CatchConfig_Submit', ['blocked-infrastructure', '仅保存采集开关不会产生可执行采集能力,目标也没有旧 SiteConfig 更新链']],
- ['Content/MarkDown', ['blocked-data', '目标 Schema 缺少旧 Content_MarkDown 主表与历史 Markdown 记录']],
- ['Content/MarkDown_Del', ['blocked-data', '目标没有可定位并删除的旧 Content_MarkDown 记录']],
- ['Design / Counter/VisitList', ['blocked-data', '目标 Schema 缺少旧 ZL_Com_VisitCount 访问明细表及 h5 访问记录']],
- ['Design / Counter/VisitInfoList', ['blocked-data', '目标没有可按 InfoID 聚合的 h5 访问明细和最近访问记录']],
- ['Design / Counter/VisitInfoDetail', ['blocked-data', '目标缺少指定 InfoID 的访问时间、IP、浏览器、系统、地域和来源明细']],
- ['Design / Counter/Counter_API', ['blocked-data', '目标没有可定位并删除的旧访问统计记录']],
- ['Extend / Counter/StatisticalCode', ['blocked-infrastructure', '目标缺少 SiteInfo.AllSiteJS 配置模型及在所有页面注入统计脚本的运行时']],
- ['Extend / Counter/StatisticalCode_Submit', ['blocked-infrastructure', '云函数不能仅保存任意全站脚本而没有可信的前端注入、CSP 与版本发布链']],
- ['Extend / Counter/Index', ['blocked-data', '目标 Schema 缺少 ZL_Com_VisitCount 数据,无法生成旧访问统计首页']],
- ['Extend / Counter/Site', ['blocked-data', '目标缺少全站访问明细与总访问计数']],
- ['Extend / Counter/Month', ['blocked-data', '目标缺少可按年月聚合的访问日期明细']],
- ['Extend / Counter/Year', ['blocked-data', '目标缺少可按年度和月份聚合的访问日期明细']],
- ['Extend / Counter/Local', ['blocked-data', '目标缺少访客地域 Address 明细']],
- ['Extend / Counter/Browser', ['blocked-data', '目标缺少访客浏览器标识与访问明细']],
- ['Extend / Counter/Os', ['blocked-data', '目标缺少访客操作系统标识与访问明细']],
- ['Extend / Counter/Channel', ['blocked-data', '目标缺少访问来源渠道与 Referer 明细']],
- ['CRM/Index', ['blocked-data', '目标 Schema 缺少旧 CRMS_Client 客户主表,无法进入客户列表首页']],
- ['CRM/ClientListDiag', ['partial', '现有用户资源页可按账号搜索并选择用户;旧 GroupID/UserID 多条件弹窗布局未逐项复刻']],
- ['CRM/ClientList', ['blocked-data', '目标 Schema 缺少旧 CRMS_Client 客户主表与 Model 48 动态附表']],
- ['CRM/ClientView', ['blocked-data', '目标缺少客户、联系人、服务记录和动态附表的联合详情数据']],
- ['CRM/ClientAdd', ['blocked-data', '目标没有可编辑或新增的 CRMS_Client 客户记录']],
- ['CRM/BiServer_Del', ['blocked-data', '目标 Schema 缺少旧 IServer 服务记录主表']],
- ['CRM/Client_Add', ['blocked-data', '目标缺少 CRMS_Client 与 Model 48 动态附表原子写入链']],
- ['CRM/ClientImport', ['blocked-infrastructure', '目标缺少客户主表,且旧 CRM_Client.xml 导入定义未迁入']],
- ['CRM/Import_DownTlp', ['blocked-infrastructure', '交付包没有旧 CRM_Client.xml 字段映射,无法等价生成 xlsx 模板']],
- ['CRM/Import_Client', ['blocked-infrastructure', '目标缺少 CRMS_Client/Model 48 写入结构及旧 XML+NPOI 导入流水线']],
- ['CRM/AddServiceRecord', ['blocked-data', '目标 Schema 缺少旧 IServer 客户服务记录主表']],
- ['CRM/AddServiceRecord_Submit', ['blocked-data', '目标无法保存 crm_ID、管理员、用户、优先级、类型、状态、附件和提醒等服务记录']],
- ['CRM/ServiceRecord_List', ['blocked-data', '目标没有可查询的旧 IServer 服务记录']],
- ['CRM/CType', ['implemented', '已由 crmClientTypes 提供帐套隔离、仅 ztype=ctype、名称搜索与分页列表']],
- ['CRM/CTypeAdd', ['implemented', '已由 Angular CRM 客户类型新建/编辑抽屉替代']],
- ['CRM/CType_Add', ['implemented', '已由 saveCrmClientType 覆盖名称防重、白名单保存和原子旧编号分配']],
- ['CRM/CType_Del', ['implemented', '已由 crmClientTypeBatch 覆盖每批 1–100 条帐套隔离删除']],
- ['CRM/Contact', ['blocked-data', '目标 Schema 缺少旧 CRMS_Contact 联系人主表;ContactInfo 是企业微信联系人,语义不等价']],
- ['CRM/ContactAdd', ['blocked-data', '目标无可编辑或新增的 CRMS_Contact 客户联系人记录']],
- ['CRM/Contact_Add', ['blocked-data', '不能把旧 CRM 联系人错写到企业微信 ContactInfo']],
- ['CRM/ContactImport', ['blocked-infrastructure', '目标缺少 CRM 联系人主表,且旧 CRM_Contact.xml 导入定义未迁入']],
- ['CRM/ContactImport_Down', ['blocked-infrastructure', '交付包没有旧 CRM_Contact.xml 字段映射,无法等价生成 xlsx 模板']],
- ['CRM/ContactImport_Upload', ['blocked-infrastructure', '目标缺少 CRMS_Contact 写入结构及旧 XML+NPOI 导入流水线']],
- ['CRM/BecomeCustomerList', ['blocked-data', '目标 Schema 缺少 user_becustomer 类型 Common_UserApply 经销商申请']],
- ['CRM/BecomeCustomerDetail', ['blocked-data', '目标缺少经销商申请、申请用户和资质详情数据']],
- ['CRM/BecomeCustomerDetailUpdate', ['blocked-data', '目标没有可更新的经销商申请 Info1/AdminRemind 记录']],
- ['CRM/BecomeCustomer_API', ['blocked-infrastructure', '目标缺少申请、LicenceFiles/LicenceUserSign、CRM 客户及 PDF 文件运行时,无法执行审核链']],
- ['ECharts / ECharts/EChartList', ['blocked-data', '目标 Schema 缺少旧 Content_Chart 图表定义主表与历史图表']],
- ['ECharts / ECharts/ChartCite', ['blocked-infrastructure', '目标缺少图表名称、站点 SiteUrl 和 /Common/ShowM 公开渲染链,无法生成旧 iframe/Markdown 引用']],
- ['ECharts / ECharts/ShowM', ['blocked-infrastructure', '目标没有 Content_Chart option/package 数据与旧 ECharts ShowM 渲染页面']],
- ['ECharts / ECharts/AddChart', ['blocked-infrastructure', '目标缺少 Content_Chart 持久层和旧七类图表配置生成运行时']],
- ['ECharts / ECharts/AddChart_Submit', ['blocked-data', '目标无法持久化 TName、ChartTitle、ToolBox、Package、option、SType 与 Tag 图表定义']],
- ['ECharts / ECharts/Default', ['blocked-data', '目标没有可按 SType 筛选分页的旧 Content_Chart 记录']],
- ['Content / Node/NodeManage', ['implemented', '已由 Node 资源列表、分页与专用结构操作替代']],
- ['Content / Node/NodeSearch', ['implemented', '已覆盖按栏目名称搜索并保持帐套隔离']],
- ['Content / Node/NodeAdd', ['implemented', '已由 Node 动态表单与父节点结构控件替代']],
- ['Content / Node/NodeAdd_Submit', ['implemented', '已覆盖原子栏目编号、同级防重、父节点与层级校验']],
- ['Content / Node/UnionNode_Move', ['implemented', '已由 nodeBatch 批量移动与递归深度同步替代']],
- ['Content / Node/NodeRecycle', ['partial', '已覆盖回收和恢复;独立回收站筛选页尚未提供']],
- ['Content / Node/SPageAdd', ['partial', '节点类型与外链字段可编辑;旧单页专用布局尚未逐字段复刻']],
- ['Content / Node/OutLinkAdd', ['partial', '节点类型与 URL 字段可编辑;旧外链专用布局尚未逐字段复刻']],
- ['Content / Node/Node_API', ['partial', '已覆盖回收、恢复与安全永久删除;清空全部节点被明确禁止']],
- ['Content / Node/BatchNode', ['partial', '已提供栏目批量回收、恢复和结构迁移']],
- ['Content / Node/BatchNode_Submit', ['partial', '已覆盖结构批处理;旧批量模板、权限与计费字段仍待专用实现']],
- ['Content / Node/UnionNode', ['partial', '已提供栏目批量迁移;栏目合并仍待实现']],
- ['Content / Node/Special_API', ['partial', '已覆盖删除引用保护与保存时名称/目录校验;旧独立校验响应未保留']],
- ['Content / Node/Special', ['implemented', '已由 Special 资源列表、搜索与分页替代']],
- ['Content / Node/SpecialAdd', ['implemented', '已由专题动态表单与父专题结构控件替代']],
- ['Content / Node/SpecialAdd_Save', ['implemented', '已覆盖原子专题编号、全帐套防重、父专题与循环校验']],
- ['Content / Node/UnionSpecial', ['partial', '已提供专题批量迁移;关系合并因目标数据缺失被显式阻塞']],
- ['Content / Node/UnionSpecial_Move', ['implemented', '已由 specialBatch 帐套隔离批量移动替代']],
- ['Content / Node/UnionSpecial_Merge', ['blocked-data', 'CommonModel.specialId 物理列缺失且商品主表未迁移,无法安全重写专题关系']],
- ['Model/Index', ['partial', '已由全部数据类与 Model/ModelField 资源页替代;旧模型类型入口布局未逐项复刻']],
- ['Model/ModelManage', ['implemented', '已提供帐套模型列表、搜索、分页与安全元数据编辑']],
- ['Model/ModelAdd', ['blocked-infrastructure', '新增模型需要 PostgreSQL 建表、生成标签与写入旧模板文件']],
- ['Model/ModelAdd_Submit', ['blocked-infrastructure', '托管云函数未开放模型 DDL 与旧 Zoomla 模板文件运行时']],
- ['Model/Model_API', ['partial', '已覆盖安全模板/展示元数据更新;复制和删除模型因 DDL 被阻塞']],
- ['Model/ModelData', ['partial', '规范化目标类可从资源页管理;任意旧附表名到 Parse 类的映射尚未完整恢复']],
- ['Model/Field', ['implemented', '已提供模型字段列表、搜索、分页与安全展示元数据编辑']],
- ['Model/Order_Submit', ['partial', '已提供同模型字段批量排序云函数;专用拖拽界面尚未复刻']],
- ['Model/FieldAdd', ['blocked-infrastructure', '新增字段需要 PostgreSQL ALTER TABLE 与旧字段控件模板']],
- ['Model/FieldAdd_Submit', ['blocked-infrastructure', '目标托管环境未开放任意物理列 DDL 与旧控件生成器']],
- ['Model/Field_API', ['partial', '已覆盖字段顺序更新;字段删除因历史数据与物理列 DDL 被阻塞']],
- ['Content / Guest/Default', ['implemented', '已由 Guestbook 资源页与后台导航替代']],
- ['Content / Guest/MsgList', ['implemented', '已提供帐套留言列表、标题搜索、分页与批量审核工作流']],
- ['Content / Guest/ReplyGuest', ['implemented', '已由留言详情中的管理员回复面板替代']],
- ['Content / Guest/EBtnSubmit', ['implemented', '已由 guestbookReply 原子分配回复 GID 并继承分类/父留言关系']],
- ['Content / Guest/MsgShow', ['implemented', '已由留言详情抽屉替代']],
- ['Content / Guest/MsgShow_Submit', ['implemented', '已由 saveGuestbook 白名单正文编辑替代']],
- ['Content / Guest/Msg_API', ['implemented', '已覆盖审核、取消审核、回收、恢复与带回复引用保护的永久删除']],
- ['Content / Guest/CateList', ['implemented', '已由 Guestcate 资源列表、搜索和分类结构抽屉替代']],
- ['Content / Guest/CateAdd', ['implemented', '已由留言分类专用表单替代']],
- ['Content / Guest/CateAdd_Submit', ['implemented', '已覆盖原子 cateid、留言类型锁定与名称防重']],
- ['Content / Guest/Cate_API', ['implemented', '已覆盖下级分类、留言与帖子引用保护的删除']],
- ['Content / Bar/Default', ['implemented', '已由 Guestcate 贴吧类型列表入口替代']],
- ['Content / Bar/CateList', ['implemented', '已提供贴吧分类列表、搜索、分页与父子结构编辑']],
- ['Content / Bar/CateAdd', ['partial', '已提供贴吧分类表单;旧版发帖频率文件配置尚未迁移']],
- ['Content / Bar/CateAdd_Submit', ['partial', '已覆盖原子编号、防重、父子循环和分类元数据;文件配置尚缺']],
- ['Content / Bar/Cate_API', ['partial', '已覆盖删除引用保护及推荐/取消推荐;清空版块帖子尚未开放']],
- ['Content / Bar/BarAuthSet', ['blocked-data', '目标 Schema 缺少 ZL_Guest_BarAuth 用户版块权限关系,无法读取逐用户浏览、发帖和回复权限']],
- ['Content / Bar/BarAuthSet_Submit', ['blocked-data', '目标 Schema 缺少 Uid、BarID、Look、Send、Reply 权限关系,无法安全保存旧授权']],
- ['Content / Bar/TieList', ['implemented', '已提供帐套帖子列表、标题搜索、分页与批量工作流']],
- ['Content / Bar/TieDetail', ['implemented', '已由只读帖子详情抽屉和专用工作流面板替代']],
- ['Content / Bar/TieMove', ['implemented', '已由 barBatch 目标贴吧分类校验与移动替代']],
- ['Content / Bar/Tie_API', ['partial', '已覆盖审核、回收恢复、置顶/沉底、精华和移动;勋章关系未迁移']],
- ['Exam/Question_Class_Manage', ['partial', '已提供帐套分类列表、搜索和父分类编号;旧展开树布局尚未逐像素复刻']],
- ['Exam/AddQuestion_Class', ['implemented', '已由 ExamClass 专用结构表单替代']],
- ['Exam/Question_Class_GetChild', ['implemented', '已由 examClassChildren 帐套隔离子分类接口替代']],
- ['Exam/Question_Class_Add', ['implemented', '已由 saveExamClass 原子编号、防重、父级与循环校验替代']],
- ['Exam/ExamPointManage', ['implemented', '已提供帐套考点列表、搜索、分页和父子结构字段']],
- ['Exam/AddExamPoint', ['implemented', '已由 ExamPoint 专用考点结构表单替代']],
- ['Exam/ExamPoint_Add', ['implemented', '已由 saveExamPoint 原子编号、防重、父级与循环校验替代']],
- ['Exam/KnowledgeManage', ['partial', '已提供帐套知识点列表、搜索和父级/科目结构字段;旧展开树布局尚未逐像素复刻']],
- ['Exam/AddKnowledge', ['implemented', '已由 QuestionsKnowledge 专用知识点结构表单替代']],
- ['Exam/Knowledge_Add', ['implemented', '已由 saveKnowledge 原子编号、科目防重、父级与循环校验替代']],
- ['Exam/Knowledge_GetChild', ['implemented', '已由 knowledgeChildren 帐套及科目隔离子级接口替代']],
- ['Exam/ExTeacherManage', ['implemented', '已提供帐套考试教师列表、搜索、分页与删除']],
- ['Exam/AddExTeacher', ['implemented', '已由 ExTeacher 专用教师资料表单替代']],
- ['Exam/Teacher_Add', ['implemented', '已由 saveExamTeacher 原子编号和任教分类归属校验替代']],
- ['Dict/DicCateList', ['implemented', '已提供帐套字典分类列表、搜索、分页及启用状态管理']],
- ['Dict/DictCate_API', ['implemented', '已由字典分类专用保存、批量启停和带字典项引用保护的删除替代']],
- ['Dict/DicCateSel', ['implemented', '已由 dictionaryCategories 帐套隔离分类选择接口和 Angular 下拉控件替代']],
- ['Dict/DicItemList', ['implemented', '已提供帐套字典项列表、搜索、分页和所属分类选择']],
- ['Dict/DicItem_API', ['implemented', '已由字典项专用保存、分类归属校验、批量启停和删除替代']],
- ['Dict/GradeCateManage', ['implemented', '已提供多级字典分类列表、搜索、分页和引用保护删除']],
- ['Dict/GCateAdd', ['implemented', '已由 GradeCate 专用分类表单与层级别名输入替代']],
- ['Dict/GCateAdd_Submit', ['implemented', '已由 saveGradeCategory 编号、防重和层级别名校验替代']],
- ['Dict/GCate_API', ['implemented', '已由 gradeBatch 带选项引用保护的批量删除替代']],
- ['Dict/GradeOption', ['implemented', '已由按分类和父选项筛选的 gradeOptions 列表替代']],
- ['Dict/GOptionAdd', ['implemented', '已由 Grade 专用分类、父级选项表单替代']],
- ['Dict/GOptionAdd_Submit', ['implemented', '已由 saveGradeOption 自动层级、同级防重和父级归属校验替代']],
- ['Dict/GOption_API', ['implemented', '已由 gradeBatch 带下级引用保护的批量删除替代']],
- ['Shop / Exp/Currency', ['implemented', '已提供帐套货币列表、搜索、分页与批量删除']],
- ['Shop / Exp/CurrencyAdd', ['blocked-infrastructure', 'Currency.id 与 Parse 保留 id 冲突,物理表又缺少可写旧 ID 列,Angular 已隐藏新增入口']],
- ['Shop / Exp/CurrencyAdd_Submit', ['blocked-infrastructure', '无法为新货币持久化旧数字 ID;saveCurrency 对新增明确返回 migration_blocked']],
- ['Shop / Exp/Currency_API', ['implemented', '已由 currencyBatch 帐套隔离批量删除替代']],
- ['Config/Holiday', ['implemented', '已提供帐套节假日列表、搜索、分页、编辑与批量删除']],
- ['Config/Holiday_API', ['implemented', '已由 saveHoliday 白名单更新和 holidayBatch 帐套隔离删除替代']],
- ['Config/HolidayAdd', ['blocked-infrastructure', 'SysHoliday.id 与 Parse 保留 id 冲突,物理表又缺少可写旧 ID 列,Angular 已隐藏新增入口']],
- ['Config/HolidayAdd_Submit', ['blocked-infrastructure', '无法为新节假日持久化旧数字 ID;saveHoliday 对新增明确返回 migration_blocked']],
- ['Config/SearchFunc', ['implemented', '已提供管理后台/用户中心类型、启用状态、推荐状态筛选及排序分页']],
- ['Config/SearchFunc_API', ['partial', '已覆盖启停、推荐、取消推荐、排序与删除;设为全局后台起始页缺少 SiteConfig 持久层']],
- ['Config/SearchFuncAdd', ['partial', '已由 Search 专用现有入口编辑抽屉替代;新增因旧 id 不可持久化而阻塞']],
- ['Config/SearchFuncAdd_Submit', ['partial', '已由 saveSearchNavigation 白名单更新替代;新增明确返回 migration_blocked']],
- ['Config/APIInfo', ['partial', '已由实时 Function 元数据目录替代旧 WXAPP.cshtml 注释解析;旧密钥与访问开关无等价执行层']],
- ['Config/APIInfo_Submit', ['blocked-infrastructure', '旧 API 密钥、IP 策略与目标 sessionToken/帐套权限不等价,且无全函数生效配置层']],
- ['Config/APIInfo_SwaggerClose', ['blocked-infrastructure', '目标云函数引擎没有帐套级 Swagger 调试关闭开关']],
- ['Config/APIInfo_SwaggerOpen', ['blocked-infrastructure', '目标云函数引擎没有帐套级 Swagger 调试开启开关']],
- ['Config/ReadFile', ['implemented', '已由 apiCatalog 安全读取 Function 名称、路径、描述、参数和响应类型,不暴露源码']],
- ['Config/LicenceFile_API', ['blocked-data', '目标 Schema 缺少许可、隐私、协议与版权文档数据,云函数也不能写旧 wwwroot 文件']],
- ['Config/FontIcon', ['implemented', '已由 Angular Lucide 完整图标选择器、搜索、分页和点击复制替代']],
- ['Config/close_system', ['blocked-infrastructure', '云函数运行时没有可通过 app_offline.htm 关闭的单体 ASP.NET 进程']],
- ['Config/Hotkey', ['blocked-infrastructure', '目标 Schema 缺少 KeyboardConfig/Hotkey 持久化模型与旧 XML 数据']],
- ['Config/HotkeyAdd', ['blocked-infrastructure', '目标 Schema 缺少 KeyboardConfig/Hotkey 持久化模型,无法安全新增']],
- ['Config/HotkeyAdd_Submit', ['blocked-infrastructure', '目标 Schema 缺少 KeyboardConfig/Hotkey 持久化模型,不伪造保存成功']],
- ['Config/Hotkey_API', ['blocked-infrastructure', '目标无可执行快捷键启停、删除、重载或脚本匹配的全局运行时']],
- ['Config/Prize', ['blocked-infrastructure', '目标 Schema 缺少 PrizeConfig/PrizeTask 配置模型及签到、任务规则数据']],
- ['Config/Prize_Submit', ['blocked-infrastructure', '目标无法持久化旧奖励积分、重复周期和过期规则']],
- ['Extend / AD/Default', ['implemented', '已由 Angular 广告位导航进入专用列表']],
- ['Extend / AD/ZoneManage', ['implemented', '已由 adZones 帐套隔离列表、名称搜索、类型与启停筛选替代']],
- ['Extend / AD/Zone_API', ['implemented', '已由 adZoneBatch 覆盖每批 1–100 条启用、停用与引用保护删除']],
- ['Extend / AD/ZoneAdd', ['partial', '现有广告位编辑页已迁移;新增因旧 id 与 Parse 保留字段冲突而明确阻塞']],
- ['Extend / AD/ZoneAdd_Submit', ['partial', '现有广告位由 saveAdZone 白名单更新;无旧编号的新增明确返回 migration_blocked']],
- ['Extend / AD/InfoManage', ['implemented', '已由 adInfos 按帐套、广告位、审核状态和关键词分页筛选']],
- ['Extend / AD/Info_API', ['implemented', '已由 adInfoBatch 覆盖审核、取消审核和批量删除']],
- ['Extend / AD/InfoAdd', ['partial', '现有广告编辑和广告位选择已迁移;新增因旧 id 不可持久化而阻塞']],
- ['Extend / AD/InfoAdd_Submit', ['partial', '现有广告由 saveAdInfo 校验广告位、时间、权重和内容后更新;新增明确阻塞']],
- ['Extend / AD/ADPreView', ['partial', '已提供当前生效广告预览;旧 HTML 只显示源码而不执行脚本,避免管理端 XSS']],
- ['Content / Addon/Comment', ['blocked-data', '目标 Schema 缺少旧 ZL_Comment 评论主表与历史评论数据']],
- ['Content / Addon/Commont_API', ['blocked-data', '目标无可审核、取消审核或删除的旧评论记录']],
- ['Content / Addon/ConAudit_API', ['blocked-data', '目标缺少 ContentAudit 记录、节点审核流程与管理员步骤状态']],
- ['Content / Addon/ConAudit_SJ_API', ['blocked-data', '目标缺少送审确认/驳回记录和可追溯流程状态']],
- ['Content / Addon/ConAudit', ['blocked-data', '目标 Schema 缺少旧 ZL_Content_Audit 审核列表及历史数据']],
- ['Content / Addon/ConAuditDetail', ['blocked-data', '目标缺少审核明细、备注、节点和操作人流转记录']],
- ['Content / Addon/TagKey', ['implemented', '已由 Angular 全局标签词库编辑页替代旧 tags.json 文件页']],
- ['Content / Addon/TagKey_Submit', ['implemented', '已由 saveContentTagKeys 清理标签并持久化到 Parse Config']],
- ['Content / Addon/VerBak', ['blocked-data', '目标 Schema 缺少旧 ZL_Content_VerBak 内容/商品版本快照与历史数据']],
- ['Content / Addon/VerBak_Del', ['blocked-data', '目标无可定位和删除的旧 ZL_Content_VerBak 版本记录']],
- ['Shop / Addon/Vendor', ['blocked-data', '目标 Schema 缺少旧 ZL_Shop_Vendor 供应商主表与历史数据']],
- ['Shop / Addon/Vendor_API', ['blocked-data', '目标没有可定位和删除的供应商记录;Agency/DeliveryCenter 语义不等价']],
- ['Shop / Addon/VendorAdd', ['blocked-data', '目标无签约数据类承载名称、地址、手机、传真、邮箱和状态']],
- ['Shop / Addon/VendorAdd_Submit', ['blocked-data', '按既定数据库设计不能擅自新建 ShopVendor,也不能错写 Agency/DeliveryCenter']],
- ['User / Addon/PointGroup', ['implemented', '已由 userLevels 帐套隔离、关键词与排序分页列表替代']],
- ['User / Addon/PointGroupAdd', ['partial', '现有积分等级编辑页已迁移;新增因旧 id 与 Parse 保留字段冲突而阻塞']],
- ['User / Addon/PointGroup_API', ['implemented', '已由 userLevelBatch 覆盖每批 1–100 条帐套隔离删除']],
- ['User / Addon/PointGroup_Submit', ['partial', '现有等级由 saveUserLevel 白名单更新别名、积分阈值、图片和备注;新增明确阻塞']],
- ['User / Addon/VMoneyLog', ['implemented', '已由 userMoneyLogs 聚合六类规范化账本,保留类型、日期、关键词与用户名筛选']],
- ['User / Addon/ThirdInfo', ['blocked-data', '旧 ThirdInfo.config 六个提供商配置与历史密钥未迁入;ThirdPlatInfo 是不同业务平台']],
- ['User / Addon/ThirdInfo_Submit', ['blocked-infrastructure', '云函数没有旧 XML 文件系统与 Baidu/QQ/Sina/Wechat 等 OAuth 运行时消费者']],
- ['User / Addon/SigninList', ['blocked-data', '目标 Schema 缺少 PrizeTaskLog 及 Global.SignIn 用户签到任务日志']],
- ['User / Addon/RealNameAuth', ['blocked-data', '目标 Schema 缺少 UserRealNameAuth 申请主表、审核状态与历史数据']],
- ['User / Addon/RealNameAuthAdd', ['blocked-data', '目标 Profile 零散身份字段不等价于可审阅的实名认证申请']],
- ['User / Addon/RealNameAuth_API', ['blocked-data', '目标缺少实名申请记录及 Global.RealNameAuth 任务奖励链']],
- ['Content / Ask/Default', ['blocked-data', '目标 Schema 缺少旧 ZL_Ask 问题主表、回收站标记与历史问题数据']],
- ['Content / Ask/AskInfo', ['blocked-data', '目标无问答问题详情;Baike/Guestbook/GuestBar/DesignQuestion 均非等价主表']],
- ['Content / Ask/AskAdd', ['blocked-data', '目标无 Ask 数据类承载 QTitle/Qcontent 与状态、精华、回收站关系']],
- ['Content / Ask/AskAdd_Submit', ['blocked-data', '不能把旧问答问题错写到百科、留言、论坛或问卷题目']],
- ['Content / Ask/Ask_API', ['blocked-data', '目标缺少可回收、恢复、删除、审核或加精的旧问答问题记录']],
- ['Content / Ask/AnswerList', ['blocked-data', '目标 Schema 缺少旧 ZL_GuestAnswer 回答主表及 QueId 问题外键']],
- ['Content / Ask/AnswerAdd', ['blocked-data', '目标无可编辑或新增的问答回答记录与问题归属']],
- ['Content / Ask/AnswerAdd_Submit', ['blocked-data', '目标缺少 GuestAnswer QueId/UserId/UserName/Content 数据模型与历史关系']],
- ['Content / Ask/Answer_API', ['blocked-data', '目标缺少可审核、取消审核或删除的旧问答回答记录']],
- ['Content / Ask/Config', ['blocked-infrastructure', '目标没有 GuestConfig.WDOption 问答运行时和用户组权限消费者']],
- ['Content / Ask/Config_Submit', ['blocked-infrastructure', '目标没有问答发布/回复/推荐运行时执行积分与用户组规则']],
- ['BiaoCalc/Default', ['blocked-data', '目标 Schema 缺少旧 BiaoCalcModel 裱件模型主表、状态与历史记录']],
- ['BiaoCalc/BiaoDetail', ['blocked-data', '目标无可定位的裱件详情及 UserID 用户关系']],
- ['BiaoCalc/Biao_API', ['blocked-data', '目标缺少可启用、停用或删除的 BiaoCalcModel 记录']],
- ['BiaoCalc/UserFiles', ['blocked-data', '目标 Schema 缺少 BiaoCalcUserFiles 文件授权、等级与到期时间数据']],
- ['BiaoCalc/UserFiles_API', ['blocked-data', '目标无 BiaoCalcUserFiles.ExpireTime 可到期或续期;账户会员到期字段语义不等价']],
- ['Office / Chart/Index', ['blocked-infrastructure', '旧交付包与官方源码只保留空壳控制器,缺少 Index.cshtml、数据源和交互定义']],
- ['Extend / Chat/Default', ['blocked-data', '目标 Schema 缺少 ChatMsg 消息表,无法还原用户消息数']],
- ['Extend / Chat/UserChatHistory', ['blocked-data', '目标缺少 ChatMsg/ChatGroup 个人与群会话关系']],
- ['Extend / Chat/UserFriend', ['blocked-data', '目标缺少 User_Friend 好友关系;UserFriendGroup 只是分组,语义不等价']],
- ['Extend / Chat/Group', ['blocked-data', '目标 Schema 缺少 ChatGroup 群组主表与历史数据']],
- ['Extend / Chat/GroupAdd', ['blocked-data', '目标无可定位和编辑的 ChatGroup 群组记录']],
- ['Extend / Chat/GroupAdd_Submit', ['blocked-data', '目标缺少 ChatGroup/ChatGroupUser 群主、管理员与成员关系']],
- ['Extend / Chat/GroupUser', ['blocked-data', '目标 Schema 缺少 ChatGroupUser 群成员和管理员记录']],
- ['Extend / Chat/MessageHistory', ['blocked-data', '目标缺少 ChatMsg 个人/群组消息和收发关系']],
- ['Extend / Chat/Config', ['blocked-infrastructure', '目标没有 RoomConfig TRTC 配置持久层和聊天运行时']],
- ['Extend / Chat/Config_Submit', ['blocked-infrastructure', '目标没有消费 TRTC AppID/SecretKey 的聊天服务']],
- ['Extend / Chat/Chat_API', ['blocked-data', '目标缺少 ChatMsg/ChatGroup/ChatGroupUser 可删除、启停或授权记录']],
- ['Design / Class/ClassList', ['blocked-data', '目标 Schema 缺少 DesignTlpClass/Design_TlpClass 模板分类主表与历史数据']],
- ['Design / Class/ClassAdd', ['blocked-data', '目标无模板分类数据类;DesignTlp 仅保留数字 classId 引用']],
- ['Design / Class/ClassAdd_Submit', ['blocked-data', '现有 DesignTlp 引用 classId=6,但分类 6 的名称、父级、排序和说明已丢失']],
- ['Design / Class/Class_API', ['blocked-data', '目标无可删除分类记录,且不能使现有 DesignTlp.classId=6 引用悬空']],
- ['Com/Logout', ['implemented', '已由 Angular 退出入口调用管理云函数销毁当前 Parse _Session 后清除本地会话']],
- ['Com/SPwdCheck', ['blocked-infrastructure', '目标没有 Manager.RandNumber 二级密码会话状态和业务消费者']],
- ['Com/BootLayout', ['implemented', '已迁移为 Angular Bootstrap 栅格生成器,保留框架、列数、断点、预设、预览和复制 HTML']],
- ['Com/Import', ['blocked-infrastructure', '目标与云函数运行时缺少 /Config/Import/{mode}.xml 导入定义']],
- ['Com/Import_DownTlp', ['blocked-infrastructure', '缺少旧 XML 字段别名、隐藏字段、类型和默认值规则']],
- ['Com/Import_Submit', ['blocked-infrastructure', '云函数没有旧 XML+NPOI 动态表 xlsx 导入流水线']],
- ['Com/ImportForContent', ['blocked-infrastructure', '目标缺少旧动态模型附表结构与通用 xlsx 导入页']],
- ['Com/ImportForContent_DownTlp', ['blocked-infrastructure', '无法从已缺失的动态模型附表还原完整 xlsx 字段模板']],
- ['Com/ImportForContent_Submit', ['blocked-infrastructure', '缺少动态附表批量写入流程,商品分支还缺少 ZL_Commodities']],
- ['Com/Sort', ['partial', '模型字段顺序已由 modelFieldOrder 迁移;内容、商品、栏目和贴吧分类的旧统一排序页尚未完整迁移']],
- ['Com/Sort_API', ['partial', 'modelFieldOrder 已覆盖 ModelField 白名单帐套排序;其余 4 类旧表名分支未提供等价云函数']],
- ['Common/UserBaseField', ['blocked-data', '目标缺少 B_UserBaseField 动态字段定义与 ZL_UserBase 原始扩展行']],
- ['Common/ContentField', ['blocked-data', '目标缺少按 CommonModel.TableName/ModelID 动态解析任意旧内容附表的数据与渲染层']],
- ['Common/SelUploadFiles', ['blocked-infrastructure', '旧交付包/官方源码缺少视图,当前 PostgreSQL Parse 文件适配器也无法上传']],
- ['Config/Index', ['blocked-infrastructure', '旧配置首页只跳转 SiteInfo,目标无签约的统一站点配置模型和运行时']],
- ['Config/SiteInfo', ['blocked-infrastructure', '目标缺少 SiteInfo/SiteOption 站点、Logo、版权、全站 JS 与后台目录配置']],
- ['Config/SiteInfo_Submit', ['blocked-infrastructure', '云函数无法更名 ASP.NET 后台路径、改写 web.config 或重启旧宿主']],
- ['Config/SiteOption', ['blocked-infrastructure', '目标无 SiteOption/ShopConfig/UserConfig 的域名、模板、上传、审核、积分和安全策略模型']],
- ['Config/SiteOption_Submit', ['blocked-infrastructure', '现有云函数未消费旧 SiteOption 的数十项站点/商城/互动规则']],
- ['Config/MailConfig', ['blocked-infrastructure', '目标缺少 SMTP 服务器、端口、帐号和收件列表配置模型']],
- ['Config/MailConfig_Submit', ['blocked-infrastructure', '目标无统一 SMTP 发送运行时;MailTemp 仅是模板而非邮件通道']],
- ['Config/UserConfig', ['blocked-infrastructure', '目标缺少注册、审核、验证码、必填字段、奖励与提现规则模型']],
- ['Config/UserConfig_Submit', ['blocked-infrastructure', '当前注册/登录云函数未实现旧 UserConfig 规则消费层']],
- ['Config/SetOrderStatus', ['blocked-infrastructure', '目标缺少 OrderConfig 状态文案与订单/商品主运行链']],
- ['Config/SetOrderStatus_Submit', ['blocked-infrastructure', '目标无订单运行时消费 21 类旧订单/配送/支付状态文案']],
- ['Config/SMSCfg', ['blocked-infrastructure', '目标缺少 SMSConfig 多供应商帐号、密钥、签名、模板和频控模型']],
- ['Config/SMSConfig_Submit', ['blocked-infrastructure', '当前云函数无短信网关,密码重置也因缺短信验证而阻塞']],
- ['Config/ThumbConfig', ['blocked-infrastructure', '目标缺少 WaterModuleConfig/ThumbsConfig 水印、文字样式、尺寸和缩略图规则']],
- ['Config/ThumbConfig_Submit', ['blocked-infrastructure', '当前 Parse 文件适配器错误,也无上传后执行水印/缩略图规则的处理器']],
- ['Config/AppConfig', ['blocked-infrastructure', '目标云函数宿主无 ASP.NET defaultDocument、customErrors、MIME 和扩展名配置']],
- ['Config/AppConfig_Submit', ['blocked-infrastructure', '云函数无法改写/重启旧 web.config,目标运行时也不消费这些选项']],
- ['Config/APPConfig_ReInstall', ['blocked-infrastructure', '目标没有 IsInstalled 状态与 /Install/Index 重新安装流程']],
- ['Content / Baike/Default', ['partial', '已由 Angular 百科审核入口替代;旧默认跳转的 BaikeEdit 版本列表因数据缺失而阻塞']],
- ['Content / Baike/BKVersionList', ['blocked-data', '目标 Schema 缺少旧 BaikeEdit 版本表、待审版本内容与历史版本数据']],
- ['Content / Baike/Version_API', ['blocked-data', '目标无 BaikeEdit 版本记录,无法审核并 Apply、取消审核、驳回或删除']],
- ['Content / Baike/BKList', ['blocked-data', '旧 BKList 按 Flow 读取 BaikeEdit 版本链,目标仅保留 Baike 主记录']],
- ['Content / Baike/BK_API', ['partial', '已由 baikeBatch 覆盖主词条审核、取消审核、推荐和取消推荐;版本删除/应用与奖励链缺失']],
- ['Content / Baike/Config', ['blocked-infrastructure', '目标没有 GuestConfig.BKOption 百科运行时、用户组权限和积分奖励消费者']],
- ['Content / Baike/Config_Submit', ['blocked-infrastructure', '目标没有百科创建/编辑/推荐运行时执行 CreatePoint/EditPoint/RemmPoint 规则']],
- ['Content / Baike/BkCheck', ['implemented', '已由 baikeEntries 按帐套、关键词、审核与推荐状态分页审查主词条']],
- ['FontPic/Index', ['blocked-data', '目标 Schema 缺少旧 FontPic 成品字体图主表与历史数据']],
- ['FontPic/FontPicInfo', ['blocked-data', '目标 Schema 缺少旧 FontPic 成品字体图详情数据']],
- ['FontPic/FontPicInfo_Submit', ['blocked-data', '目标 Schema 缺少旧 FontPic 成品字体图持久化模型']],
- ['FontPic/FontPic_API', ['blocked-data', '目标 Schema 缺少旧 FontPic 成品字体图可删除记录']],
- ['FontPic/Shape', ['implemented', '已由 fontShapes 按帐套、分类和关键词分页筛选图形素材']],
- ['FontPic/ShapeInfo', ['partial', '现有图形素材编辑、分类选择和安全预览已迁移;新增因旧 id 不可持久化而阻塞']],
- ['FontPic/ShapeInfo_Submit', ['partial', '现有素材由 saveFontShape 更新元数据;新增受旧 id 阻塞,图片替换受 Parse 文件适配器错误阻塞']],
- ['FontPic/Shape_API', ['implemented', '已由 fontShapeBatch 覆盖每批 1–100 条帐套隔离删除']],
- ['FontPic/ShapeType', ['implemented', '已由 fontShapeTypes 帐套隔离分类列表替代']],
- ['FontPic/ShapeTypeInfo', ['partial', '现有图形分类编辑已迁移;新增因旧 id 不可持久化而阻塞']],
- ['FontPic/ShapeTypeInfo_Submit', ['partial', '现有分类由 saveFontShapeType 白名单更新;新增明确返回 migration_blocked']],
- ['FontPic/ShapeType_API', ['implemented', '已覆盖分类列表和引用保护删除']],
- ['FontPic/Draft', ['blocked-data', '目标 Schema 缺少旧 FontPicDraft 草稿表与历史数据']],
- ['FontPic/DraftInfo', ['blocked-data', '目标 Schema 缺少旧 FontPicDraft 草稿详情数据']],
- ['FontPic/DraftInfo_Submit', ['blocked-data', '目标 Schema 缺少旧 FontPicDraft 草稿持久化模型']],
- ['FontPic/Draft_API', ['blocked-data', '目标 Schema 缺少旧 FontPicDraft 可删除记录']],
- ['Extend / Survey/SurveyManage', ['implemented', '已由 surveys 按帐套、状态和关键词分页读取旧 DesignAsk 问卷']],
- ['Extend / Survey/Survey_API', ['implemented', '已由 surveyBatch 覆盖问卷启停/删除及答卷嵌入明细删除']],
- ['Extend / Survey/SurveyAdd', ['partial', '现有问卷编辑页已迁移;新增因旧 id 无法持久化而明确阻塞']],
- ['Extend / Survey/SurveyAdd_Submit', ['partial', '现有问卷由 saveSurvey 校验时间、状态和访问设置后更新;新增明确阻塞']],
- ['Extend / Survey/SurveyItemList', ['implemented', '已由 surveyQuestions 校验问卷归属后按排序分页读取题目']],
- ['Extend / Survey/SurveyItemAdd', ['partial', '现有题目编辑页已迁移;新增因旧 id 无法持久化而明确阻塞']],
- ['Extend / Survey/SurveyItemAdd_Submit', ['partial', '现有题目由 saveSurveyQuestion 校验题型、选项和扩展 JSON 后更新;新增明确阻塞']],
- ['Extend / Survey/SurveyItem_API', ['implemented', '已由 surveyBatch 覆盖题目删除和按选择顺序重排']],
- ['Extend / Survey/SurveyResultChart', ['implemented', '已由 surveyResultChart 从旧 answer JSON 安全聚合选项计数并报告不可解析答卷']],
- ['Extend / Survey/SurveyResultList', ['implemented', '已由 surveyResults 提供帐套与问卷隔离的答卷分页和只读详情']],
- ['Office / Service/Default', ['implemented', '已由 Angular 客服席位导航替代旧重定向']],
- ['Office / Service/Seat', ['implemented', '已由 serviceSeats 帐套隔离、关键词和排序分页列表替代']],
- ['Office / Service/SeatAdd', ['partial', '客服席位新建/编辑页已迁移;旧固定密码自动开户行为因安全原因不迁移']],
- ['Office / Service/SeatAdd_Submit', ['partial', 'saveServiceSeat 可绑定现有同帐套账号并原子生成席位 ID;缺失账号时明确阻塞弱密码开户']],
- ['Office / Service/CodeAdd', ['partial', '现有 useType=12 欢迎语编辑页已迁移;新增受 Temp.id 保留字段冲突阻塞']],
- ['Office / Service/CodeAdd_Submit', ['partial', '现有欢迎语由 saveServiceCode 白名单更新名称、HTML 内容和主题;新增明确阻塞']],
- ['Office / Service/Seat_API', ['partial', 'serviceBatch 已覆盖席位和欢迎语删除;chat_del 因 ChatMsg 数据类缺失而阻塞']],
- ['Office / Service/CodeList', ['implemented', '已由 serviceCodes 仅按 useType=12 帐套隔离读取客服欢迎语']],
- ['Office / Service/MsgEx', ['blocked-data', '目标 Schema 缺少旧 ChatMsg 会话消息表与历史数据']],
- ['Office / Service/MsgInfo', ['blocked-data', '目标 Schema 缺少旧 ChatMsg 单条消息详情数据']],
- ['Office / Service/MsgList', ['blocked-data', '目标 Schema 缺少旧 ChatMsg 消息列表数据']],
- ['Shop / Store/StoreManage', ['implemented', '已由 storeApplications 按帐套、审核状态和关键词分页读取店铺']],
- ['Shop / Store/Store_API', ['partial', 'storeBatch 已覆盖审核、取消审核、推荐和取消推荐;因商品主表缺失而阻止真实删除店铺']],
- ['Shop / Store/StoreStyle', ['implemented', '已由 storeStyles 帐套隔离分页和关键词检索替代']],
- ['Shop / Store/Style_API', ['implemented', '已由 storeBatch 覆盖带店铺引用保护的样式删除']],
- ['Shop / Store/StoreStyleAdd', ['partial', '现有店铺样式编辑页已迁移;新增因旧 id 无法持久化而阻塞']],
- ['Shop / Store/StoreStyleAdd_Submit', ['partial', '现有样式由 saveStoreStyle 白名单更新模板路径、缩略图与说明;新增明确阻塞']],
- ['Shop / Store/StoreUpdate', ['partial', '现有店铺资料、所属账号和样式编辑页已迁移;旧模型 6 创建链缺失']],
- ['Shop / Store/StoreUpdate_Submit', ['partial', '现有店铺由 saveStoreApplication 校验同帐套用户和样式后更新;新增明确阻塞']],
- ['Shop / Store/Product', ['blocked-data', '旧 ZL_Commodities 商品主表缺失,目标 Product/StoreProduct 只有扩展碎片,无法重建商品列表']],
- ]);
- const blockedDataModules = new Map([
- ['Order', '目标库缺少订单、订单商品、支付与物流主表'],
- ['Pay', '目标库缺少支付流水、订单支付明细及可验证的交易数据'],
- ['Sale', '目标库缺少订单销售明细与可复算的销售事实表'],
- ['Shop / Coupon', '目标库无优惠券、促销实例与用户领取关系'],
- ['Shop / Refund', '目标库无订单退款与退款流水'],
- ['Product', '目标 Product 仅为旧商品附表,缺少 ZL_Commodities 主表'],
- ]);
- const blockedInfrastructureModules = new Map([
- ['Extend / DBTool', '依赖数据库备份恢复、建表或服务器文件系统,不适用于托管 Parse 运行时'],
- ['Files', '依赖旧站点文件系统与文件云配置,尚无新对象存储方案'],
- ['FontManager', '依赖服务器字体文件安装与删除权限'],
- ['Label / PowerShell', '依赖 Windows PowerShell 与服务器命令执行,云函数明确禁止'],
- ['Label / SiteDeploy', '依赖站点发布、远程命令与文件下载基础设施'],
- ['Site', '依赖 IIS 站点、虚拟目录、主机池与数据库服务器管理'],
- ['Template', '依赖旧模板/CSS 文件系统和 Zoomla 标签运行时'],
- ['Extend / MyCss', '依赖旧站点 CSS 文件读写与下载'],
- ['Mobile / WeiXin', '依赖新版微信、支付、模板消息和服务通知凭据'],
- ['User / Mail', '依赖邮件与短信服务商配置及发送凭据'],
- ]);
- const markdown = readFileSync(sourcePath, 'utf8');
- const entries = [];
- const occurrences = new Map();
- for (const line of markdown.split(/\r?\n/)) {
- const match = line.match(/^\| ([^|]+) \| (\d+) \| (.+) \|$/);
- if (!match || match[1].trim() === '模块 / 控制器') continue;
- const moduleName = match[1].trim();
- const actions = [...match[3].matchAll(/`([^`]+)`/g)].map((item) => item[1]);
- if (actions.length !== Number(match[2])) throw new Error(`${moduleName}: 动作数量不一致`);
- for (const action of actions) {
- const key = `${moduleName}/${action}`;
- const occurrence = (occurrences.get(key) || 0) + 1;
- occurrences.set(key, occurrence);
- let status = 'pending';
- let reason = '尚未逐项迁移或完成等价性核验';
- if (explicit.has(key)) [status, reason] = explicit.get(key);
- else if (blockedDataModules.has(moduleName)) { status = 'blocked-data'; reason = blockedDataModules.get(moduleName); }
- else if (blockedInfrastructureModules.has(moduleName)) { status = 'blocked-infrastructure'; reason = blockedInfrastructureModules.get(moduleName); }
- entries.push({ module: moduleName, action, occurrence, status, reason });
- }
- }
- if (entries.length !== 1042) throw new Error(`预期 1042 个后台动作,实际 ${entries.length}`);
- const generated = `// Generated by scripts/generate-admin-coverage.mjs. Do not edit by hand.\n` +
- `export type LegacyAdminCoverageStatus = 'implemented' | 'partial' | 'blocked-data' | 'blocked-infrastructure' | 'pending';\n` +
- `export interface LegacyAdminCoverageEntry { module: string; action: string; occurrence: number; status: LegacyAdminCoverageStatus; reason: string; }\n` +
- `export const LEGACY_ADMIN_COVERAGE: readonly LegacyAdminCoverageEntry[] = ${JSON.stringify(entries, null, 2)};\n`;
- if (checkOnly) {
- const current = readFileSync(outputPath, 'utf8');
- if (current !== generated) throw new Error('后台迁移覆盖台账已过期,请运行 npm run admin-coverage:generate');
- console.log(`Admin coverage is current: ${entries.length} actions.`);
- } else {
- writeFileSync(outputPath, generated);
- console.log(`Generated ${outputPath}: ${entries.length} actions.`);
- }
|