浏览代码

feat: complete legacy admin migration audit

彭峰 1 月之前
父节点
当前提交
4964b4b7ef

+ 6 - 2
docs/migration/admin-migration-status.md

@@ -48,6 +48,9 @@
 - `Extend/Safe` 的 15 个入口已完成数据与运行时审计:线上全部 Schema 仅命中不相关的 `SafeMobile`,没有旧 `Safe_IP`、非法词库、扫描结果或站点保护配置。旧聚合 `API` 还依赖服务器站点文件、五秒后返回的 Razor 局部页、`ContentWordHelper` 常驻线程与进度缓存;`SiteProtect_Submit` 只更新旧 `SiteConfig.Safe_ContentCheck_Models`,`ContentCheckConfig_Submit` 直接写 `IllegalWordsVerify.keywordsVPath` 服务器文件。当前内容写入链不消费这些配置,单纯存入 Parse Config 会伪造安全能力;因此 IP 三项按数据缺失、其余按基础设施缺失由 `legacySafeBlocker` 返回逐项 `migration_blocked`。
 - 旧组织架构 14 个动作依赖 `ZL_Structure` 的父子树、排序、权限、提醒、成员/管理员 ID 集合、结构经验,以及 `ZL_User.StructureID` 双向关系。线上 110 个 Schema 不存在 `Structure`/`ZL_Structure`,`Profile` 与 `Group` 均不是这套结构数据,不能用现有部门标签伪造历史组织关系;全部动作由 `legacyStructureBlocker` 返回逐项数据阻塞。
 - 旧 Vue 模板后台依赖未迁入的 `ZL_Vue_Tlp`,预览与发布还要读取 `SiteOption.TemplateDir` 下的服务器模板、运行 `B_CreateHtml` 标签渲染、套用 `/Config/CodeTlp/vue.tlp` 并复制到 `SiteOption.VUE_DirCopy`。目标既无模板数据,也无这些文件与发布运行时;5 个动作由 `legacyVueBlocker` 分别返回数据或基础设施阻塞。旧工作量页的 `GroupDayCount` 必须将 `ZL_CommonModel` 与缺失的 `ZL_Comment` 按 `GeneralID` 内连接后逐日统计内容、评论和点击;目标只有 `CommonModel`,不能把内容数伪装成旧工作量报表,`Default` 由 `legacyWorkloadBlocker` 明确数据阻塞。
+- 旧 H5 电子书 6 个动作全部依赖未迁入的 `ZL_H5_Item`,包括标题、封面、模板关系、推荐状态与 `SetTemplate` 行为;线上 Schema 没有 H5/电子书候选类,均由 `legacyVBookBlocker` 返回数据阻塞。
+- 旧 `Vdesign` 应用后台管理的是 `ZL_Vdesign`、文章/商品绑定、留言、模板、模板分类、站点变更与模板购买日志共八组数据。线上 `DesignSiteInfo/DesignPage/DesignTlp` 来自另一套 `ZL_Design_*` 可视化系统,字段、ID、模板关系和生命周期不等价,商品主表 `ZL_Commodities` 也未迁入;19 个动作由 `legacyVdesignBlocker` 逐项说明,不污染现有可视化场景数据。`Extend/VDesign` 的 15 个 SPage 动作则依赖缺失的 `ZL_SPage_Page`、旧组件/布局 Razor 视图、Zoomla 标签库与 `B_CreateHtml` 渲染器,由 `legacySPageBlocker` 分别登记数据或基础设施阻塞。
+- 旧书法珍珠后台 10 个动作依赖 `ZL_Write_Copybook/ZL_Write_Manuscripts/ZL_Write_Word/ZL_Write_UserFiles` 的字帖、文稿、字词和逐文件授权到期历史;目标 Schema 没有任何 Write/Copybook/Manuscript 候选类,账户会员期限也不等价于指定书写文件授权。全部动作由 `legacyWritePearlBlocker` 返回逐项数据阻塞。
 - 旧 `Design/Scene` 的普通场景管理已迁到 Angular“可视化场景”页:`designScenes` 复刻 `ZType=0、TlpID=0` 及正常/回收站状态范围,提供帐套隔离、搜索和分页;`saveDesignScene` 只更新旧编辑页允许的标题、用户、积分、状态、搜索标记、预览图、缩略图、说明和 Meta,并从同帐套 `_User` 同步用户名。`designSceneBatch` 覆盖回收、恢复与彻底删除;`createDesignSceneTemplate` 完整复制布局/组件/资源数据,分别用 PostgreSQL advisory lock 原子分配 `DesignTlp.id` 和模板副本 `DesignScence.id`,任一步失败都会补偿清理。普通场景的新建仍依赖已丢失的可视化设计器初始化协议,因此专用保存接口只接受现有场景。
 - 旧 `Design/Template` 的模板列表、回收站、表单和生命周期已迁到 Angular“可视化模板”页:`designTemplates` 支持帐套、状态、原始 `classId` 和关键词筛选;`saveDesignTemplate` 白名单维护名称、分类编号、价格、预览图、积分、状态、来源和说明,新建时原子分配模板及空模板场景编号,失败会补偿清理;`designTemplateBatch` 覆盖回收、恢复及模板与关联场景的完整删除。目标没有 `DesignTlpClass`,因此页面保留历史 `classId` 数字而不伪造分类名称。`designTemplateEditorTarget` 可解析真实场景 GUID 与旧 `/design/default?id=...` 地址,但旧可视化编辑器的前端资产、布局交互和渲染运行时未交付,所以 `GoDesign` 保持明确的部分迁移状态。
 - 旧 `NodeAdd_Submit`、`Node_API` 与 `UnionNode_Move` 的核心栏目生命周期已迁为专用 `saveNode/nodeBatch`:新增栏目以临时来源键完成 Parse 初始写入,再使用 PostgreSQL 事务锁原子分配 `nodeId/orderId` 并替换为旧 `sourceKey`;保存会校验同级名称/目录重复、父栏目帐套和回收状态,移动会阻断自身/下级循环并递归修正所有后代深度。回收、恢复和每批 1–100 个栏目迁移已接入 Angular;永久删除仅在没有内容、下级栏目、节点权限和模型模板引用时开放,通用保存与删除不能绕过。
@@ -74,7 +77,8 @@
 - 旧店铺后台 `StoreManage/Store_API/StoreStyle/Style_API/StoreStyleAdd/StoreStyleAdd_Submit/StoreUpdate/StoreUpdate_Submit` 已映射到规范化 `StoreApplication/StoreStyle`:店铺按状态和关键词筛选,支持审核、取消审核、推荐、取消推荐,现有资料可维护同帐套所属账号、样式、联系方式、地址和展示内容;样式可维护三类模板路径、缩略图和说明,删除前检查店铺引用。Angular 新增店铺、店铺样式入口、状态工具和归属/样式选择。店铺与样式旧数字 ID 都不能通过兼容层安全新增,店铺创建还依赖已丢失的模型 6 动态字段链,因此新增明确 501。旧 `ZL_Commodities` 商品主表完全缺失,目标 `Product/StoreProduct` 只有图片等扩展碎片,无法核验店铺商品引用,所以真实删除店铺与 `Product` 页面均明确数据阻塞,未冒险制造孤儿商品。
 - 旧内容附加功能 `TagKey/TagKey_Submit` 已迁移为 Angular 全局内容标签词库:保留管道符分隔、移除空白/引号/反斜杠和原顺序语义,改由 `saveContentTagKeys` 管理云函数写入 Parse Config,不再依赖旧 ASP.NET 服务器的 `/js/ICMS/tags.json` 本地文件。线上完整 Schema 核验不存在 `Comment/ContentAudit/ContentVerBak` 或等价类,因此 `Comment/Commont_API`、4 个内容审核流动作以及 `VerBak/VerBak_Del` 均由 `legacyContentAddonBlocker` 返回逐项数据阻塞原因,未用 `CommonModel` 状态伪造丢失的审批历史。
 - 旧商城供应商 `Vendor/Vendor_API/VendorAdd/VendorAdd_Submit` 全部依赖未迁入的 `ZL_Shop_Vendor`:线上 Schema 与签约数据库文档均没有 `Vendor/ShopVendor/Manufacturers`。现有 `Agency` 只有机构编号/名称/负责人,`DeliveryCenter` 只有交付中心编号/负责人,都缺供应商地址、手机、传真、邮箱和状态,不能等价映射。`legacyShopVendorBlocker` 已按动作返回数据阻塞原因,未擅自新建未签约数据类或污染机构数据。
-- 旧用户附加功能中,`PointGroup/PointGroupAdd/PointGroup_API/PointGroup_Submit` 已映射到 `UserLevel`:提供帐套隔离列表、关键词搜索、现有等级别名/积分阈值/图片/备注编辑和批量删除;旧 `id` 与 Parse 保留字段冲突,因此新增等级明确 501。`VMoneyLog` 已由只读 `UserMoneyLog` 虚拟资源统一聚合 `UserExpDomP/UserSIcon/UserExpHis/UserUserPoint/UserDummyPoint/UserCredit` 六类规范化账本,支持余额/银币/经验/积分/虚拟币/信用分类型、日期、用户名与摘要筛选,不允许篡改历史流水。旧 `ThirdInfo.config` 六个提供商和密钥未迁入,现有 `ThirdPlatInfo` 是不同业务平台且没有旧 OAuth/XML 消费者;`PrizeTaskLog(Global.SignIn)` 用户签到日志与 `UserRealNameAuth` 实名申请/奖励链也全部缺失。这 6 个动作由 `legacyUserAddonBlocker` 逐项返回数或基础设施阻塞,未把 `MisSign` 工作签到或 `Profile` 零散身份字段伪装成旧审批历史。
+- 旧用户附加功能中,`PointGroup/PointGroupAdd/PointGroup_API/PointGroup_Submit` 已映射到 `UserLevel`:提供帐套隔离列表、关键词搜索、现有等级别名/积分阈值/图片/备注编辑和批量删除;旧 `id` 与 Parse 保留字段冲突,因此新增等级明确 501。`VMoneyLog/UserExp/UserExp_Submit` 已由 `UserMoneyLog` 与 `adjustUserBalance` 覆盖:统一聚合 `UserExpDomP/UserSIcon/UserExpHis/UserUserPoint/UserDummyPoint/UserCredit` 六类规范化账本,支持类型、日期、用户名与摘要筛选;管理员调整会在单个 PostgreSQL 事务中锁定用户、写不可变新流水并同步 `Purse/SilverCoin/UserExp/UserPoint/DummyPurse/UserCreit`,扣减不能产生负数,既有流水仍不允许篡改。旧 `ThirdInfo.config` 六个提供商和密钥未迁入,现有 `ThirdPlatInfo` 是不同业务平台且没有旧 OAuth/XML 消费者;`PrizeTaskLog(Global.SignIn)` 用户签到日志与 `UserRealNameAuth` 实名申请/奖励链也全部缺失。这 6 个动作由 `legacyUserAddonBlocker` 逐项返回数据或基础设施阻塞,未把 `MisSign` 工作签到或 `Profile` 零散身份字段伪装成旧审批历史。
+- `UserController` 最后一批动作已完成逐项核验:表格用户名辅助方法由 `_User` 规范化字段直接替代;管理员资金调整已完整迁移;管理员自身改密、角色权限、协同企业成员和推广关系图分别由现有专用云函数部分或完整覆盖。用户订单与 CRM 客户表、Bugle 归属管理员、邮件/订阅历史、`Plat_Group` 部门树均未迁入;旧 Office/Word 导出、密码代登、随机密码邮件审核、Jobs/Zone Razor 配置和 `SiteInfo.APIClose` WebService 宿主也不存在。19 个不可等价入口统一由 `legacyUserRemainderBlocker` 返回具体原因,管理员 `Manager` 数据只通过隐藏密码字段的资源页查看,不把孤立 Manager 行伪报成可登录 Parse 管理账号。
 - 旧问答后台 11 个动作无法从目标数据库等价重建:线上 Schema 没有 `Ask/GuestAnswer`、`ZL_Ask/ZL_GuestAnswer` 历史记录或 `QueId` 问题—回答关系。`Baike` 是百科词条,`Guestbook` 是留言/回复,`GuestBar` 是论坛帖子,`DesignQuestion/DesignAnswer` 是问卷题目/答卷,都不能伪冒问答主从表。`Default/AskInfo/AskAdd/AskAdd_Submit/Ask_API/AnswerList/AnswerAdd/AnswerAdd_Submit/Answer_API` 已按数据阻塞登记;`Config/Config_Submit` 依赖已丢失的 `GuestConfig.WDOption` 问答运行时、用户组权限与积分消费者,按基础设施阻塞登记。`legacyAskBlocker` 会对每个请求返回具体原因。
 - 旧裱件计算后台 5 个动作全部依赖未迁入的 `BiaoCalcModel/BiaoCalcUserFiles`:目标 Schema 与签约数据库文档都没有裱件主记录、用户文件授权、等级或 `ExpireTime` 历史数据。现有账户会员到期时间控制整个账户权益,不等价于指定裱件用户文件授权,因此不用它伪实现到期/续期。`legacyBiaoCalcBlocker` 已对 `Default/BiaoDetail/Biao_API/UserFiles/UserFiles_API` 返回逐项数据阻塞原因。
 - 旧 `Office/Chart.Index` 控制器只执行 `View()`,但反编译交付包和 Zoomla 官方 `cms2` 源码树都不包含对应 `Areas/Admin/Views/Office/Chart/Index.cshtml`,也没有任何参数、数据源或交互合约可供推导。该动作按缺失旧视图资产的基础设施阻塞登记,不把无关的问卷统计或 `ECharts` 编辑器冒充为 1:1 页面。
@@ -85,7 +89,7 @@
 - 旧 `Config` 中除已迁移的节假日与另行审计的 API/快捷键/奖励页外,本批 18 个站点配置动作均依赖 ASP.NET `SiteConfig/OrderConfig/SMSConfig/WaterModuleConfig`、XML/单例文件、`web.config` 与宿主重启。目标没有签约的统一配置模型,也没有能同时消费站点、上传、SMTP、注册奖励、订单文案、短信、水印缩略图、MIME/错误页与重新安装设置的云运行时。不把值单纯塞入 Parse Config 伪装成“已生效”;`legacySiteConfigBlocker` 对每个页面/提交动作返回具体基础设施原因。
 - 旧百科后台的主词条审查已映射到 `Baike`:`baikeEntries` 提供帐套、关键词、审核/未审核和推荐/未推荐筛选,`baikeBatch` 支持审核、取消审核、推荐和取消推荐,Angular 新增百科审核入口和只读详情。线上仅保留 1 条 `Baike` 主记录,完全没有旧 `BaikeEdit` 版本表,因此 `BKVersionList/Version_API/BKList` 及 `BK_API` 的版本删除/应用部分明确数据阻塞。`GuestConfig.BKOption` 百科创建/编辑/推荐权限与积分奖励消费者也缺失,`Config/Config_Submit` 按基础设施阻塞登记;推荐操作不伪造已发放奖励。
 - `_User`、`CommonModel`、`Node` 与 `Special` 表格已补齐当前页全选和批量工具栏,可直接批量停用/解锁/移动用户组,审核、回收、恢复、移动内容节点,回收、恢复、移动栏目,以及移动专题;翻页或重新查询会清空选择,避免误操作隐藏页记录。
-- 迁移状态页已接入从反编译基线自动生成的 1,042 项旧后台动作台账,可按模块、action、原因与状态搜索筛选;当前保守登记为 157 项已实现、104 项部分实现、379 项数据阻塞、325 项基础设施阻塞、77 项待逐项核验。生成器和 `admin-coverage:check` 会阻止台账与源码基线漂移。
+- 迁移状态页已接入从反编译基线自动生成的 1,042 项旧后台动作台账,可按模块、action、原因与状态搜索筛选;当前最终登记为 161 项已实现、109 项部分实现、429 项数据阻塞、343 项基础设施阻塞、0 项待逐项核验。`final-blocked-actions.generated.md` 同步列出全部 772 个无法等价迁移动作及逐项原因,生成器和 `admin-coverage:check` 会阻止台账、清单与源码基线漂移。
 - Parse 登录只在浏览器保存当前 `sessionToken`;`masterKey` 只在部署进程中使用。
 - 云函数网关强制校验管理员身份、`company` 帐套、类白名单、字段白名单和敏感字段过滤。
 - `_Session` 不开放,`Function` 源码不开放通用查询或编辑;用户密码只允许专用重置操作。

+ 779 - 0
docs/migration/final-blocked-actions.generated.md

@@ -0,0 +1,779 @@
+<!-- Generated by scripts/generate-admin-coverage.mjs. Do not edit by hand. -->
+# 最终无法等价迁移动作清单
+
+本清单来自 1,042 项旧后台动作逐项核验结果。共 772 项明确阻塞:数据缺失 429 项,基础设施缺失 343 项。其余动作状态请查看 Angular 后台“迁移状态”页。
+
+| 模块 | Action | 阻塞类型 | 原因 |
+|---|---|---|---|
+| Content / Addon | `Comment` | 数据缺失 | 目标 Schema 缺少旧 ZL_Comment 评论主表与历史评论数据 |
+| Content / Addon | `Commont_API` | 数据缺失 | 目标无可审核、取消审核或删除的旧评论记录 |
+| Content / Addon | `ConAudit_API` | 数据缺失 | 目标缺少 ContentAudit 记录、节点审核流程与管理员步骤状态 |
+| Content / Addon | `ConAudit_SJ_API` | 数据缺失 | 目标缺少送审确认/驳回记录和可追溯流程状态 |
+| Content / Addon | `ConAudit` | 数据缺失 | 目标 Schema 缺少旧 ZL_Content_Audit 审核列表及历史数据 |
+| Content / Addon | `ConAuditDetail` | 数据缺失 | 目标缺少审核明细、备注、节点和操作人流转记录 |
+| Content / Addon | `VerBak` | 数据缺失 | 目标 Schema 缺少旧 ZL_Content_VerBak 内容/商品版本快照与历史数据 |
+| Content / Addon | `VerBak_Del` | 数据缺失 | 目标无可定位和删除的旧 ZL_Content_VerBak 版本记录 |
+| Shop / Addon | `Vendor` | 数据缺失 | 目标 Schema 缺少旧 ZL_Shop_Vendor 供应商主表与历史数据 |
+| Shop / Addon | `Vendor_API` | 数据缺失 | 目标没有可定位和删除的供应商记录;Agency/DeliveryCenter 语义不等价 |
+| Shop / Addon | `VendorAdd` | 数据缺失 | 目标无签约数据类承载名称、地址、手机、传真、邮箱和状态 |
+| Shop / Addon | `VendorAdd_Submit` | 数据缺失 | 按既定数据库设计不能擅自新建 ShopVendor,也不能错写 Agency/DeliveryCenter |
+| User / Addon | `ThirdInfo` | 数据缺失 | 旧 ThirdInfo.config 六个提供商配置与历史密钥未迁入;ThirdPlatInfo 是不同业务平台 |
+| User / Addon | `ThirdInfo_Submit` | 基础设施缺失 | 云函数没有旧 XML 文件系统与 Baidu/QQ/Sina/Wechat 等 OAuth 运行时消费者 |
+| User / Addon | `SigninList` | 数据缺失 | 目标 Schema 缺少 PrizeTaskLog 及 Global.SignIn 用户签到任务日志 |
+| User / Addon | `RealNameAuth` | 数据缺失 | 目标 Schema 缺少 UserRealNameAuth 申请主表、审核状态与历史数据 |
+| User / Addon | `RealNameAuthAdd` | 数据缺失 | 目标 Profile 零散身份字段不等价于可审阅的实名认证申请 |
+| User / Addon | `RealNameAuth_API` | 数据缺失 | 目标缺少实名申请记录及 Global.RealNameAuth 任务奖励链 |
+| Content / Ask | `Default` | 数据缺失 | 目标 Schema 缺少旧 ZL_Ask 问题主表、回收站标记与历史问题数据 |
+| Content / Ask | `AskInfo` | 数据缺失 | 目标无问答问题详情;Baike/Guestbook/GuestBar/DesignQuestion 均非等价主表 |
+| Content / Ask | `AskAdd` | 数据缺失 | 目标无 Ask 数据类承载 QTitle/Qcontent 与状态、精华、回收站关系 |
+| Content / Ask | `AskAdd_Submit` | 数据缺失 | 不能把旧问答问题错写到百科、留言、论坛或问卷题目 |
+| Content / Ask | `Ask_API` | 数据缺失 | 目标缺少可回收、恢复、删除、审核或加精的旧问答问题记录 |
+| Content / Ask | `AnswerList` | 数据缺失 | 目标 Schema 缺少旧 ZL_GuestAnswer 回答主表及 QueId 问题外键 |
+| Content / Ask | `AnswerAdd` | 数据缺失 | 目标无可编辑或新增的问答回答记录与问题归属 |
+| Content / Ask | `AnswerAdd_Submit` | 数据缺失 | 目标缺少 GuestAnswer QueId/UserId/UserName/Content 数据模型与历史关系 |
+| Content / Ask | `Answer_API` | 数据缺失 | 目标缺少可审核、取消审核或删除的旧问答回答记录 |
+| Content / Ask | `Config` | 基础设施缺失 | 目标没有 GuestConfig.WDOption 问答运行时和用户组权限消费者 |
+| Content / Ask | `Config_Submit` | 基础设施缺失 | 目标没有问答发布/回复/推荐运行时执行积分与用户组规则 |
+| Content / Baike | `BKVersionList` | 数据缺失 | 目标 Schema 缺少旧 BaikeEdit 版本表、待审版本内容与历史版本数据 |
+| Content / Baike | `Version_API` | 数据缺失 | 目标无 BaikeEdit 版本记录,无法审核并 Apply、取消审核、驳回或删除 |
+| Content / Baike | `BKList` | 数据缺失 | 旧 BKList 按 Flow 读取 BaikeEdit 版本链,目标仅保留 Baike 主记录 |
+| Content / Baike | `Config` | 基础设施缺失 | 目标没有 GuestConfig.BKOption 百科运行时、用户组权限和积分奖励消费者 |
+| Content / Baike | `Config_Submit` | 基础设施缺失 | 目标没有百科创建/编辑/推荐运行时执行 CreatePoint/EditPoint/RemmPoint 规则 |
+| Content / Bar | `BarAuthSet` | 数据缺失 | 目标 Schema 缺少 ZL_Guest_BarAuth 用户版块权限关系,无法读取逐用户浏览、发帖和回复权限 |
+| Content / Bar | `BarAuthSet_Submit` | 数据缺失 | 目标 Schema 缺少 Uid、BarID、Look、Send、Reply 权限关系,无法安全保存旧授权 |
+| BiaoCalc | `Default` | 数据缺失 | 目标 Schema 缺少旧 BiaoCalcModel 裱件模型主表、状态与历史记录 |
+| BiaoCalc | `BiaoDetail` | 数据缺失 | 目标无可定位的裱件详情及 UserID 用户关系 |
+| BiaoCalc | `Biao_API` | 数据缺失 | 目标缺少可启用、停用或删除的 BiaoCalcModel 记录 |
+| BiaoCalc | `UserFiles` | 数据缺失 | 目标 Schema 缺少 BiaoCalcUserFiles 文件授权、等级与到期时间数据 |
+| BiaoCalc | `UserFiles_API` | 数据缺失 | 目标无 BiaoCalcUserFiles.ExpireTime 可到期或续期;账户会员到期字段语义不等价 |
+| Office / Chart | `Index` | 基础设施缺失 | 旧交付包与官方源码只保留空壳控制器,缺少 Index.cshtml、数据源和交互定义 |
+| Extend / Chat | `Default` | 数据缺失 | 目标 Schema 缺少 ChatMsg 消息表,无法还原用户消息数 |
+| Extend / Chat | `UserChatHistory` | 数据缺失 | 目标缺少 ChatMsg/ChatGroup 个人与群会话关系 |
+| Extend / Chat | `UserFriend` | 数据缺失 | 目标缺少 User_Friend 好友关系;UserFriendGroup 只是分组,语义不等价 |
+| Extend / Chat | `Group` | 数据缺失 | 目标 Schema 缺少 ChatGroup 群组主表与历史数据 |
+| Extend / Chat | `GroupAdd` | 数据缺失 | 目标无可定位和编辑的 ChatGroup 群组记录 |
+| Extend / Chat | `GroupAdd_Submit` | 数据缺失 | 目标缺少 ChatGroup/ChatGroupUser 群主、管理员与成员关系 |
+| Extend / Chat | `GroupUser` | 数据缺失 | 目标 Schema 缺少 ChatGroupUser 群成员和管理员记录 |
+| Extend / Chat | `MessageHistory` | 数据缺失 | 目标缺少 ChatMsg 个人/群组消息和收发关系 |
+| Extend / Chat | `Config` | 基础设施缺失 | 目标没有 RoomConfig TRTC 配置持久层和聊天运行时 |
+| Extend / Chat | `Config_Submit` | 基础设施缺失 | 目标没有消费 TRTC AppID/SecretKey 的聊天服务 |
+| Extend / Chat | `Chat_API` | 数据缺失 | 目标缺少 ChatMsg/ChatGroup/ChatGroupUser 可删除、启停或授权记录 |
+| Design / Class | `ClassList` | 数据缺失 | 目标 Schema 缺少 DesignTlpClass/Design_TlpClass 模板分类主表与历史数据 |
+| Design / Class | `ClassAdd` | 数据缺失 | 目标无模板分类数据类;DesignTlp 仅保留数字 classId 引用 |
+| Design / Class | `ClassAdd_Submit` | 数据缺失 | 现有 DesignTlp 引用 classId=6,但分类 6 的名称、父级、排序和说明已丢失 |
+| Design / Class | `Class_API` | 数据缺失 | 目标无可删除分类记录,且不能使现有 DesignTlp.classId=6 引用悬空 |
+| Com | `SPwdCheck` | 基础设施缺失 | 目标没有 Manager.RandNumber 二级密码会话状态和业务消费者 |
+| Com | `Import` | 基础设施缺失 | 目标与云函数运行时缺少 /Config/Import/{mode}.xml 导入定义 |
+| Com | `Import_DownTlp` | 基础设施缺失 | 缺少旧 XML 字段别名、隐藏字段、类型和默认值规则 |
+| Com | `Import_Submit` | 基础设施缺失 | 云函数没有旧 XML+NPOI 动态表 xlsx 导入流水线 |
+| Com | `ImportForContent` | 基础设施缺失 | 目标缺少旧动态模型附表结构与通用 xlsx 导入页 |
+| Com | `ImportForContent_DownTlp` | 基础设施缺失 | 无法从已缺失的动态模型附表还原完整 xlsx 字段模板 |
+| Com | `ImportForContent_Submit` | 基础设施缺失 | 缺少动态附表批量写入流程,商品分支还缺少 ZL_Commodities |
+| Common | `UserBaseField` | 数据缺失 | 目标缺少 B_UserBaseField 动态字段定义与 ZL_UserBase 原始扩展行 |
+| Common | `ContentField` | 数据缺失 | 目标缺少按 CommonModel.TableName/ModelID 动态解析任意旧内容附表的数据与渲染层 |
+| Common | `SelUploadFiles` | 基础设施缺失 | 旧交付包/官方源码缺少视图,当前 PostgreSQL Parse 文件适配器也无法上传 |
+| Config | `Index` | 基础设施缺失 | 旧配置首页只跳转 SiteInfo,目标无签约的统一站点配置模型和运行时 |
+| Config | `SiteInfo` | 基础设施缺失 | 目标缺少 SiteInfo/SiteOption 站点、Logo、版权、全站 JS 与后台目录配置 |
+| Config | `SiteInfo_Submit` | 基础设施缺失 | 云函数无法更名 ASP.NET 后台路径、改写 web.config 或重启旧宿主 |
+| Config | `SiteOption` | 基础设施缺失 | 目标无 SiteOption/ShopConfig/UserConfig 的域名、模板、上传、审核、积分和安全策略模型 |
+| Config | `SiteOption_Submit` | 基础设施缺失 | 现有云函数未消费旧 SiteOption 的数十项站点/商城/互动规则 |
+| Config | `MailConfig` | 基础设施缺失 | 目标缺少 SMTP 服务器、端口、帐号和收件列表配置模型 |
+| Config | `MailConfig_Submit` | 基础设施缺失 | 目标无统一 SMTP 发送运行时;MailTemp 仅是模板而非邮件通道 |
+| Config | `UserConfig` | 基础设施缺失 | 目标缺少注册、审核、验证码、必填字段、奖励与提现规则模型 |
+| Config | `UserConfig_Submit` | 基础设施缺失 | 当前注册/登录云函数未实现旧 UserConfig 规则消费层 |
+| Config | `SetOrderStatus` | 基础设施缺失 | 目标缺少 OrderConfig 状态文案与订单/商品主运行链 |
+| Config | `SetOrderStatus_Submit` | 基础设施缺失 | 目标无订单运行时消费 21 类旧订单/配送/支付状态文案 |
+| Config | `SMSCfg` | 基础设施缺失 | 目标缺少 SMSConfig 多供应商帐号、密钥、签名、模板和频控模型 |
+| Config | `SMSConfig_Submit` | 基础设施缺失 | 当前云函数无短信网关,密码重置也因缺短信验证而阻塞 |
+| Config | `ThumbConfig` | 基础设施缺失 | 目标缺少 WaterModuleConfig/ThumbsConfig 水印、文字样式、尺寸和缩略图规则 |
+| Config | `ThumbConfig_Submit` | 基础设施缺失 | 当前 Parse 文件适配器错误,也无上传后执行水印/缩略图规则的处理器 |
+| Config | `AppConfig` | 基础设施缺失 | 目标云函数宿主无 ASP.NET defaultDocument、customErrors、MIME 和扩展名配置 |
+| Config | `AppConfig_Submit` | 基础设施缺失 | 云函数无法改写/重启旧 web.config,目标运行时也不消费这些选项 |
+| Config | `APPConfig_ReInstall` | 基础设施缺失 | 目标没有 IsInstalled 状态与 /Install/Index 重新安装流程 |
+| Config | `HolidayAdd` | 基础设施缺失 | SysHoliday.id 与 Parse 保留 id 冲突,物理表又缺少可写旧 ID 列,Angular 已隐藏新增入口 |
+| Config | `HolidayAdd_Submit` | 基础设施缺失 | 无法为新节假日持久化旧数字 ID;saveHoliday 对新增明确返回 migration_blocked |
+| Config | `APIInfo_Submit` | 基础设施缺失 | 旧 API 密钥、IP 策略与目标 sessionToken/帐套权限不等价,且无全函数生效配置层 |
+| Config | `APIInfo_SwaggerClose` | 基础设施缺失 | 目标云函数引擎没有帐套级 Swagger 调试关闭开关 |
+| Config | `APIInfo_SwaggerOpen` | 基础设施缺失 | 目标云函数引擎没有帐套级 Swagger 调试开启开关 |
+| Config | `LicenceFile_API` | 数据缺失 | 目标 Schema 缺少许可、隐私、协议与版权文档数据,云函数也不能写旧 wwwroot 文件 |
+| Config | `close_system` | 基础设施缺失 | 云函数运行时没有可通过 app_offline.htm 关闭的单体 ASP.NET 进程 |
+| Config | `Hotkey` | 基础设施缺失 | 目标 Schema 缺少 KeyboardConfig/Hotkey 持久化模型与旧 XML 数据 |
+| Config | `HotkeyAdd` | 基础设施缺失 | 目标 Schema 缺少 KeyboardConfig/Hotkey 持久化模型,无法安全新增 |
+| Config | `HotkeyAdd_Submit` | 基础设施缺失 | 目标 Schema 缺少 KeyboardConfig/Hotkey 持久化模型,不伪造保存成功 |
+| Config | `Hotkey_API` | 基础设施缺失 | 目标无可执行快捷键启停、删除、重载或脚本匹配的全局运行时 |
+| Config | `Prize` | 基础设施缺失 | 目标 Schema 缺少 PrizeConfig/PrizeTask 配置模型及签到、任务规则数据 |
+| Config | `Prize_Submit` | 基础设施缺失 | 目标无法持久化旧奖励积分、重复周期和过期规则 |
+| Content | `Content_AddToNew` | 数据缺失 | 目标缺少按 CommonModel.tableName 动态复制任意旧模型附表的完整结构与数据 |
+| Content | `AddToSpec` | 数据缺失 | CommonModel.specialId 仅存在于 Parse Schema,PostgreSQL 物理查询仍失败,无法安全读取专题关系 |
+| Content | `AddToSpec_Submit` | 数据缺失 | 专题关系物理列不可可靠读写,且商品主表未迁移,不能伪造加入专题成功 |
+| Content | `ContentManage_Html` | 基础设施缺失 | 云函数运行时没有旧模板解析器、站点根目录与静态 HTML 文件宿主 |
+| Content | `ContentRelease` | 数据缺失 | 目标 Schema 缺少 Content_ScheTask 定时内容任务及既有任务记录 |
+| Content | `ContentRelease_Submit` | 基础设施缺失 | 目标没有 HFHelper 调度器与 ZL_Task_Content 脚本执行运行时 |
+| Content | `CreateHtmlContent` | 基础设施缺失 | 云函数没有旧节点模板、标签解析器与站点文件系统,无法预览静态生成范围 |
+| Content | `Create_Submit` | 基础设施缺失 | 目标没有 ContentHtmlHelper 和旧模板标签运行时,无法执行内容静态生成任务 |
+| Content | `CreateHtml` | 基础设施缺失 | 目标云函数不能写入旧站点 HTML 目录,也没有旧模板渲染环境 |
+| Content | `ConCatch` | 数据缺失 | 目标缺少旧采集项目、采集规则、来源站点与任务历史数据 |
+| Content | `CatchConfig` | 基础设施缺失 | 目标没有 SiteOption.Coll_Allow/Coll_Key 配置模型及采集运行时消费者 |
+| Content | `CatchConfig_Submit` | 基础设施缺失 | 仅保存采集开关不会产生可执行采集能力,目标也没有旧 SiteConfig 更新链 |
+| Content | `MarkDown` | 数据缺失 | 目标 Schema 缺少旧 Content_MarkDown 主表与历史 Markdown 记录 |
+| Content | `MarkDown_Del` | 数据缺失 | 目标没有可定位并删除的旧 Content_MarkDown 记录 |
+| Design / Counter | `VisitList` | 数据缺失 | 目标 Schema 缺少旧 ZL_Com_VisitCount 访问明细表及 h5 访问记录 |
+| Design / Counter | `VisitInfoList` | 数据缺失 | 目标没有可按 InfoID 聚合的 h5 访问明细和最近访问记录 |
+| Design / Counter | `VisitInfoDetail` | 数据缺失 | 目标缺少指定 InfoID 的访问时间、IP、浏览器、系统、地域和来源明细 |
+| Design / Counter | `Counter_API` | 数据缺失 | 目标没有可定位并删除的旧访问统计记录 |
+| Extend / Counter | `StatisticalCode` | 基础设施缺失 | 目标缺少 SiteInfo.AllSiteJS 配置模型及在所有页面注入统计脚本的运行时 |
+| Extend / Counter | `StatisticalCode_Submit` | 基础设施缺失 | 云函数不能仅保存任意全站脚本而没有可信的前端注入、CSP 与版本发布链 |
+| Extend / Counter | `Index` | 数据缺失 | 目标 Schema 缺少 ZL_Com_VisitCount 数据,无法生成旧访问统计首页 |
+| Extend / Counter | `Site` | 数据缺失 | 目标缺少全站访问明细与总访问计数 |
+| Extend / Counter | `Month` | 数据缺失 | 目标缺少可按年月聚合的访问日期明细 |
+| Extend / Counter | `Year` | 数据缺失 | 目标缺少可按年度和月份聚合的访问日期明细 |
+| Extend / Counter | `Local` | 数据缺失 | 目标缺少访客地域 Address 明细 |
+| Extend / Counter | `Browser` | 数据缺失 | 目标缺少访客浏览器标识与访问明细 |
+| Extend / Counter | `Os` | 数据缺失 | 目标缺少访客操作系统标识与访问明细 |
+| Extend / Counter | `Channel` | 数据缺失 | 目标缺少访问来源渠道与 Referer 明细 |
+| Shop / Coupon | `ArriveManage` | 数据缺失 | 目标库无优惠券、促销实例与用户领取关系 |
+| Shop / Coupon | `Arrive_API` | 数据缺失 | 目标库无优惠券、促销实例与用户领取关系 |
+| Shop / Coupon | `ArriveAdd` | 数据缺失 | 目标库无优惠券、促销实例与用户领取关系 |
+| Shop / Coupon | `ArriveAdd_Submit` | 数据缺失 | 目标库无优惠券、促销实例与用户领取关系 |
+| Shop / Coupon | `PromoList` | 数据缺失 | 目标库无优惠券、促销实例与用户领取关系 |
+| Shop / Coupon | `Promo_API` | 数据缺失 | 目标库无优惠券、促销实例与用户领取关系 |
+| Shop / Coupon | `PromoAdd` | 数据缺失 | 目标库无优惠券、促销实例与用户领取关系 |
+| Shop / Coupon | `PromoAdd_Submit` | 数据缺失 | 目标库无优惠券、促销实例与用户领取关系 |
+| CRM | `Index` | 数据缺失 | 目标 Schema 缺少旧 CRMS_Client 客户主表,无法进入客户列表首页 |
+| CRM | `ClientList` | 数据缺失 | 目标 Schema 缺少旧 CRMS_Client 客户主表与 Model 48 动态附表 |
+| CRM | `ClientView` | 数据缺失 | 目标缺少客户、联系人、服务记录和动态附表的联合详情数据 |
+| CRM | `ClientAdd` | 数据缺失 | 目标没有可编辑或新增的 CRMS_Client 客户记录 |
+| CRM | `BiServer_Del` | 数据缺失 | 目标 Schema 缺少旧 IServer 服务记录主表 |
+| CRM | `Client_Add` | 数据缺失 | 目标缺少 CRMS_Client 与 Model 48 动态附表原子写入链 |
+| CRM | `ClientImport` | 基础设施缺失 | 目标缺少客户主表,且旧 CRM_Client.xml 导入定义未迁入 |
+| CRM | `Import_DownTlp` | 基础设施缺失 | 交付包没有旧 CRM_Client.xml 字段映射,无法等价生成 xlsx 模板 |
+| CRM | `Import_Client` | 基础设施缺失 | 目标缺少 CRMS_Client/Model 48 写入结构及旧 XML+NPOI 导入流水线 |
+| CRM | `AddServiceRecord` | 数据缺失 | 目标 Schema 缺少旧 IServer 客户服务记录主表 |
+| CRM | `AddServiceRecord_Submit` | 数据缺失 | 目标无法保存 crm_ID、管理员、用户、优先级、类型、状态、附件和提醒等服务记录 |
+| CRM | `ServiceRecord_List` | 数据缺失 | 目标没有可查询的旧 IServer 服务记录 |
+| CRM | `Contact` | 数据缺失 | 目标 Schema 缺少旧 CRMS_Contact 联系人主表;ContactInfo 是企业微信联系人,语义不等价 |
+| CRM | `ContactAdd` | 数据缺失 | 目标无可编辑或新增的 CRMS_Contact 客户联系人记录 |
+| CRM | `Contact_Add` | 数据缺失 | 不能把旧 CRM 联系人错写到企业微信 ContactInfo |
+| CRM | `ContactImport` | 基础设施缺失 | 目标缺少 CRM 联系人主表,且旧 CRM_Contact.xml 导入定义未迁入 |
+| CRM | `ContactImport_Down` | 基础设施缺失 | 交付包没有旧 CRM_Contact.xml 字段映射,无法等价生成 xlsx 模板 |
+| CRM | `ContactImport_Upload` | 基础设施缺失 | 目标缺少 CRMS_Contact 写入结构及旧 XML+NPOI 导入流水线 |
+| CRM | `BecomeCustomerList` | 数据缺失 | 目标 Schema 缺少 user_becustomer 类型 Common_UserApply 经销商申请 |
+| CRM | `BecomeCustomerDetail` | 数据缺失 | 目标缺少经销商申请、申请用户和资质详情数据 |
+| CRM | `BecomeCustomerDetailUpdate` | 数据缺失 | 目标没有可更新的经销商申请 Info1/AdminRemind 记录 |
+| CRM | `BecomeCustomer_API` | 基础设施缺失 | 目标缺少申请、LicenceFiles/LicenceUserSign、CRM 客户及 PDF 文件运行时,无法执行审核链 |
+| Extend / DBTool | `Default` | 基础设施缺失 | 依赖数据库备份恢复、建表或服务器文件系统,不适用于托管 Parse 运行时 |
+| Extend / DBTool | `Default_Result` | 基础设施缺失 | 依赖数据库备份恢复、建表或服务器文件系统,不适用于托管 Parse 运行时 |
+| Extend / DBTool | `Default_Field` | 基础设施缺失 | 依赖数据库备份恢复、建表或服务器文件系统,不适用于托管 Parse 运行时 |
+| Extend / DBTool | `ViewList` | 基础设施缺失 | 依赖数据库备份恢复、建表或服务器文件系统,不适用于托管 Parse 运行时 |
+| Extend / DBTool | `DBBackUP` | 基础设施缺失 | 依赖数据库备份恢复、建表或服务器文件系统,不适用于托管 Parse 运行时 |
+| Extend / DBTool | `DB_Backup` | 基础设施缺失 | 依赖数据库备份恢复、建表或服务器文件系统,不适用于托管 Parse 运行时 |
+| Extend / DBTool | `DB_ReStore` | 基础设施缺失 | 依赖数据库备份恢复、建表或服务器文件系统,不适用于托管 Parse 运行时 |
+| Extend / DBTool | `DB_Down` | 基础设施缺失 | 依赖数据库备份恢复、建表或服务器文件系统,不适用于托管 Parse 运行时 |
+| Extend / DBTool | `DB_Del` | 基础设施缺失 | 依赖数据库备份恢复、建表或服务器文件系统,不适用于托管 Parse 运行时 |
+| Extend / DBTool | `SiteBackup` | 基础设施缺失 | 依赖数据库备份恢复、建表或服务器文件系统,不适用于托管 Parse 运行时 |
+| Extend / DBTool | `EmptyData` | 基础设施缺失 | 依赖数据库备份恢复、建表或服务器文件系统,不适用于托管 Parse 运行时 |
+| Extend / DBTool | `EmptyData_Submit` | 基础设施缺失 | 依赖数据库备份恢复、建表或服务器文件系统,不适用于托管 Parse 运行时 |
+| Extend / DBTool | `FSearchConfig` | 基础设施缺失 | 依赖数据库备份恢复、建表或服务器文件系统,不适用于托管 Parse 运行时 |
+| Extend / DBTool | `FSearchConfig_Submit` | 基础设施缺失 | 依赖数据库备份恢复、建表或服务器文件系统,不适用于托管 Parse 运行时 |
+| Extend / DBTool | `FileSafe` | 基础设施缺失 | 依赖数据库备份恢复、建表或服务器文件系统,不适用于托管 Parse 运行时 |
+| Extend / DBTool | `FileSafe_CreateFlag` | 基础设施缺失 | 依赖数据库备份恢复、建表或服务器文件系统,不适用于托管 Parse 运行时 |
+| Extend / DBTool | `FileSafe_CheckTamper` | 基础设施缺失 | 依赖数据库备份恢复、建表或服务器文件系统,不适用于托管 Parse 运行时 |
+| Extend / DBTool | `CreateTable` | 基础设施缺失 | 依赖数据库备份恢复、建表或服务器文件系统,不适用于托管 Parse 运行时 |
+| Extend / DBTool | `CreateTable_API` | 基础设施缺失 | 依赖数据库备份恢复、建表或服务器文件系统,不适用于托管 Parse 运行时 |
+| Extend / DBTool | `PageConfig` | 基础设施缺失 | 依赖数据库备份恢复、建表或服务器文件系统,不适用于托管 Parse 运行时 |
+| Extend / DBTool | `PageConfigEdit` | 基础设施缺失 | 依赖数据库备份恢复、建表或服务器文件系统,不适用于托管 Parse 运行时 |
+| Extend / DBTool | `PageConfigReset` | 基础设施缺失 | 依赖数据库备份恢复、建表或服务器文件系统,不适用于托管 Parse 运行时 |
+| Extend / DBTool | `PageConfigDelete` | 基础设施缺失 | 依赖数据库备份恢复、建表或服务器文件系统,不适用于托管 Parse 运行时 |
+| Extend / DBTool | `PageConfigSave` | 基础设施缺失 | 依赖数据库备份恢复、建表或服务器文件系统,不适用于托管 Parse 运行时 |
+| Extend / DBTool | `Pagelist` | 基础设施缺失 | 依赖数据库备份恢复、建表或服务器文件系统,不适用于托管 Parse 运行时 |
+| Extend / DBTool | `PageAdd` | 基础设施缺失 | 依赖数据库备份恢复、建表或服务器文件系统,不适用于托管 Parse 运行时 |
+| Extend / DBTool | `PageAdd_submit` | 基础设施缺失 | 依赖数据库备份恢复、建表或服务器文件系统,不适用于托管 Parse 运行时 |
+| Extend / DBTool | `PagelistDelete` | 基础设施缺失 | 依赖数据库备份恢复、建表或服务器文件系统,不适用于托管 Parse 运行时 |
+| Extend / DBTool | `Output` | 基础设施缺失 | 依赖数据库备份恢复、建表或服务器文件系统,不适用于托管 Parse 运行时 |
+| Extend / DBTool | `DBhelp` | 基础设施缺失 | 依赖数据库备份恢复、建表或服务器文件系统,不适用于托管 Parse 运行时 |
+| Extend / DBTool | `DBhelp_Submit` | 基础设施缺失 | 依赖数据库备份恢复、建表或服务器文件系统,不适用于托管 Parse 运行时 |
+| Extend / DBTool | `DBhelp_Formatting` | 基础设施缺失 | 依赖数据库备份恢复、建表或服务器文件系统,不适用于托管 Parse 运行时 |
+| ECharts / ECharts | `EChartList` | 数据缺失 | 目标 Schema 缺少旧 Content_Chart 图表定义主表与历史图表 |
+| ECharts / ECharts | `ChartCite` | 基础设施缺失 | 目标缺少图表名称、站点 SiteUrl 和 /Common/ShowM 公开渲染链,无法生成旧 iframe/Markdown 引用 |
+| ECharts / ECharts | `ShowM` | 基础设施缺失 | 目标没有 Content_Chart option/package 数据与旧 ECharts ShowM 渲染页面 |
+| ECharts / ECharts | `AddChart` | 基础设施缺失 | 目标缺少 Content_Chart 持久层和旧七类图表配置生成运行时 |
+| ECharts / ECharts | `AddChart_Submit` | 数据缺失 | 目标无法持久化 TName、ChartTitle、ToolBox、Package、option、SType 与 Tag 图表定义 |
+| ECharts / ECharts | `Default` | 数据缺失 | 目标没有可按 SType 筛选分页的旧 Content_Chart 记录 |
+| Exam | `AddEngLishQuestion` | 基础设施缺失 | 旧英语试题页依赖复合小题、音频/图片上传和答案解析器;目标仅保留只读试题记录 |
+| Exam | `Setting` | 数据缺失 | 目标 Schema 缺少旧 Exam_Sys_Answer 答卷明细,无法按最近一周统计并重算试题难度 |
+| Exam | `VersionList` | 数据缺失 | 目标 Schema 缺少旧 Exam_Version 教材版本/册/章节树与历史数据 |
+| Exam | `AddVersion` | 数据缺失 | 目标无可定位或新建的 Exam_Version 版本树记录 |
+| Exam | `SchoolManage` | 数据缺失 | 目标 Schema 缺少旧 School 学校主表与省市县数据 |
+| Exam | `AddSchool` | 数据缺失 | 目标无可编辑或新增的 School 记录 |
+| Exam | `ClassRoomManage` | 数据缺失 | 目标 Schema 缺少旧 ClassRoom 班级主表与学校、年级、教师关系 |
+| Exam | `AddClassRoom` | 数据缺失 | 目标无可编辑或新增的 ClassRoom 记录 |
+| Exam | `StudentList` | 数据缺失 | 目标 Schema 缺少 ClassRoomStudent 班级学员关系、审核状态与学员类型 |
+| Exam | `CourseManage` | 数据缺失 | 目标 Schema 缺少旧 Course 课程主表;CourseBinding 是小树课程绑定,语义不等价 |
+| Exam | `AddCourse` | 数据缺失 | 目标无旧 Course 名称、科目、教师与课程结构记录 |
+| Exam | `ToScore` | 数据缺失 | 目标 Schema 缺少旧 Exam_Sys_Answer 主观题答卷与评分状态 |
+| Exam | `Papers_Add` | 基础设施缺失 | 试卷写入必须原子维护 qids/questList、分类、计时、价格与题目分值;当前只读迁移不允许通用表单破坏结构 |
+| Exam | `Question_Add` | 基础设施缺失 | 旧试题写入依赖题型答案解析、复合小题、知识点和上传资源;当前只读迁移不能安全保存 |
+| Exam | `Version_GetList` | 数据缺失 | 目标缺少可按 pid 查询的 Exam_Version 版本树 |
+| Exam | `Version_Add` | 数据缺失 | 目标缺少 Exam_Version 版本、册、章节持久层 |
+| Exam | `School_Add` | 数据缺失 | 目标缺少 School 主表,无法保存学校类型、地区、校徽和状态 |
+| Exam | `ClassRoom_Add` | 数据缺失 | 目标缺少 ClassRoom 与学校、教师、年级关系持久层 |
+| Exam | `Course_Add` | 数据缺失 | 目标缺少旧 Course 主表和科目树关系 |
+| Exam | `Setting_Update` | 数据缺失 | 目标缺少 Exam_Sys_Answer 作答统计,不能执行 CountDiffcult 难度重算 |
+| Exam | `PublishDesign` | 基础设施缺失 | 旧报刊可视化设计器的前端资产、布局协议与渲染运行时未迁入 |
+| Shop / Exp | `OrderSend` | 数据缺失 | 目标 Schema 缺少旧 OrderList 订单主表与 Order_Exp 物流单 |
+| Shop / Exp | `OrderSend_Submit` | 基础设施缺失 | 目标缺少订单物流状态、物流单、用户收件手机、SMSConfig 发货模板和 SafeMobile 日志链 |
+| Shop / Exp | `Factory` | 数据缺失 | 目标 Schema 缺少旧 Manufacturers 厂商主表与历史厂商数据 |
+| Shop / Exp | `FactoryAdd` | 数据缺失 | 目标无可编辑或新增的 Manufacturers 厂商记录 |
+| Shop / Exp | `FactoryAdd_Submit` | 数据缺失 | 目标缺少厂商名称、简称、地址、电话、传真、网站、分类、图片和介绍持久层 |
+| Shop / Exp | `Factory_API` | 数据缺失 | 目标没有可删除或启用的厂商记录 |
+| Shop / Exp | `Factory_select` | 数据缺失 | 目标没有可按 Producername 搜索选择的厂商数据 |
+| Shop / Exp | `Trademark` | 数据缺失 | 目标 Schema 缺少旧 Trademark 品牌主表与历史品牌数据 |
+| Shop / Exp | `TrademarkAdd` | 数据缺失 | 目标无可编辑或新增的 Trademark 品牌记录 |
+| Shop / Exp | `Trademark_Submit` | 数据缺失 | 目标缺少品牌名称、厂商、分类、启用/置顶/推荐、图片和介绍持久层 |
+| Shop / Exp | `Trademark_API` | 数据缺失 | 目标没有可删除或启用的品牌记录 |
+| Shop / Exp | `Trademark_select` | 数据缺失 | 目标没有可按 Trname 搜索选择的品牌数据 |
+| Shop / Exp | `CurrencyAdd` | 基础设施缺失 | Currency.id 与 Parse 保留 id 冲突,物理表又缺少可写旧 ID 列,Angular 已隐藏新增入口 |
+| Shop / Exp | `CurrencyAdd_Submit` | 基础设施缺失 | 无法为新货币持久化旧数字 ID;saveCurrency 对新增明确返回 migration_blocked |
+| Files | `Default` | 基础设施缺失 | 依赖旧站点文件系统与文件云配置,尚无新对象存储方案 |
+| Files | `GetFile` | 基础设施缺失 | 依赖旧站点文件系统与文件云配置,尚无新对象存储方案 |
+| Files | `FileExtend` | 基础设施缺失 | 依赖旧站点文件系统与文件云配置,尚无新对象存储方案 |
+| Files | `FileExtend_Submit` | 基础设施缺失 | 依赖旧站点文件系统与文件云配置,尚无新对象存储方案 |
+| Files | `FileCloud` | 基础设施缺失 | 依赖旧站点文件系统与文件云配置,尚无新对象存储方案 |
+| Files | `FileCloud_Submit` | 基础设施缺失 | 依赖旧站点文件系统与文件云配置,尚无新对象存储方案 |
+| Files | `Filea` | 基础设施缺失 | 依赖旧站点文件系统与文件云配置,尚无新对象存储方案 |
+| FontManager | `Index` | 基础设施缺失 | 依赖服务器字体文件安装与删除权限 |
+| FontManager | `Detail` | 基础设施缺失 | 依赖服务器字体文件安装与删除权限 |
+| FontManager | `Upgrade` | 基础设施缺失 | 依赖服务器字体文件安装与删除权限 |
+| FontManager | `Delete` | 基础设施缺失 | 依赖服务器字体文件安装与删除权限 |
+| FontManager | `DeleteRange` | 基础设施缺失 | 依赖服务器字体文件安装与删除权限 |
+| FontManager | `DeleteFile` | 基础设施缺失 | 依赖服务器字体文件安装与删除权限 |
+| FontManager | `DeleteFiles` | 基础设施缺失 | 依赖服务器字体文件安装与删除权限 |
+| FontPic | `Index` | 数据缺失 | 目标 Schema 缺少旧 FontPic 成品字体图主表与历史数据 |
+| FontPic | `FontPicInfo` | 数据缺失 | 目标 Schema 缺少旧 FontPic 成品字体图详情数据 |
+| FontPic | `FontPicInfo_Submit` | 数据缺失 | 目标 Schema 缺少旧 FontPic 成品字体图持久化模型 |
+| FontPic | `FontPic_API` | 数据缺失 | 目标 Schema 缺少旧 FontPic 成品字体图可删除记录 |
+| FontPic | `Draft` | 数据缺失 | 目标 Schema 缺少旧 FontPicDraft 草稿表与历史数据 |
+| FontPic | `DraftInfo` | 数据缺失 | 目标 Schema 缺少旧 FontPicDraft 草稿详情数据 |
+| FontPic | `DraftInfo_Submit` | 数据缺失 | 目标 Schema 缺少旧 FontPicDraft 草稿持久化模型 |
+| FontPic | `Draft_API` | 数据缺失 | 目标 Schema 缺少旧 FontPicDraft 可删除记录 |
+| Helper | `Index` | 基础设施缺失 | 旧动作读取服务器 DBConfig.json 并执行本地 SQL 脚本建表;云函数没有该文件运行时,目标数据类已由受控迁移预置 |
+| Helper | `HelpInfo` | 基础设施缺失 | 目标缺少 Notification 帮助数据与旧 SignalR 管理员分组 HelpInfo 推送协议 |
+| Hms | `UList` | 数据缺失 | 目标用户数据未保留旧 ZL_UserBase.cardType 与 ICQ 到期时间 |
+| Hms | `VipAdd` | 数据缺失 | 目标没有旧 cardType 空值状态,不能判定可开通主题大师 VIP 卡的用户 |
+| Hms | `VipAddJump` | 数据缺失 | 旧七档主题大师卡与当前小树 VIP 合伙人等级不是同一业务,不能复用 VIP 字段 |
+| Hms | `VipUpdate` | 数据缺失 | 目标未保留旧 cardType 与 ICQ 卡片到期时间,无法还原编辑页 |
+| Hms | `VipUpdate_Submit` | 数据缺失 | 目标未保留旧 cardType/ICQ,不能安全重算卡种与期限 |
+| Hms | `VipRenewal` | 数据缺失 | 目标没有旧主题大师卡到期时间,无法展示续约上下文 |
+| Hms | `VipRenewal_Submit` | 数据缺失 | 目标没有旧 cardType/ICQ,不能按卡种天数或指定日期续约 |
+| Hms | `VipOverdue` | 数据缺失 | 目标没有旧主题大师卡到期时间,无法展示强制过期上下文 |
+| Hms | `VipOverdue_Submit` | 数据缺失 | 目标没有旧 ICQ 到期时间,不能误写当前 VIP 合伙人字段 |
+| Hms | `OList` | 数据缺失 | 目标 Schema 缺少旧 ZL_Orderinfo 与 ZL_CartPro,无法查询主题大师 VIP 卡订单 |
+| Index | `Scence` | 基础设施缺失 | 目标缺少 SiteOption.Desk 与管理员 Theme/StructureID 持久层及旧主题桌面运行时 |
+| Index | `Lockin` | 基础设施缺失 | 目标没有 B_Admin.LockScreen 与 ASP.NET Session 锁屏状态,不能以停用账号冒充屏幕锁 |
+| Index | `Lockin_Submit` | 基础设施缺失 | 旧提交动作为空且锁屏状态依赖 ASP.NET Session/B_Admin,云函数无等价数据 |
+| Index | `ASCXLoad` | 基础设施缺失 | Angular 构建不允许按请求路径动态执行服务器 Razor/ASCX 局部视图 |
+| Index | `API` | 基础设施缺失 | 目标缺少 SiteOption.Admin_ShowAnimate 全局持久化配置 |
+| Index | `AccountForm` | 基础设施缺失 | 目标没有 SiteOption.RegManager、管理员申请模型和审批链,不能开放高权限自助申请 |
+| Index | `AccountForm_API` | 基础设施缺失 | 目标没有管理员申请开关与待审批模型,不能提供公开账号/邮箱探测接口 |
+| Index | `AccountForm_Submit` | 基础设施缺失 | 旧动作随机生成密码并直接授予固定高权限角色,目标权限模型不等价且没有审批链 |
+| Design / Interactive | `InteractiveList` | 数据缺失 | 目标缺少旧 Design_Pub 交互提交表及 sceneid、uid、fname 数据;DesignAnswer/Pub 不等价 |
+| Design / Interactive | `Interactive_API` | 数据缺失 | 目标没有可按旧 Design_Pub ID 删除的交互提交记录 |
+| Office / iServer | `Default` | 数据缺失 | 目标 Schema 缺少旧 IServer 服务工单主表与回复表 |
+| Office / iServer | `AddQuestionRecord` | 数据缺失 | 目标无可新增的 IServer 工单、CRM 关联和附件模型 |
+| Office / iServer | `AddQuestionRecord_Submit` | 数据缺失 | 目标缺少工单字段、附件及 CRM 关系持久层 |
+| Office / iServer | `BiServer` | 数据缺失 | 目标没有可按状态、类型和标题筛选的 IServer 工单数据 |
+| Office / iServer | `BiServer_Del` | 数据缺失 | 目标没有可删除的 IServer 工单记录 |
+| Office / iServer | `BiServerInfo` | 数据缺失 | 目标缺少工单详情、阅读计数及回复关系 |
+| Office / iServer | `DelIServer` | 数据缺失 | 目标缺少 IServerReply 回复记录 |
+| Office / iServer | `UpdateIServer` | 数据缺失 | 目标缺少工单状态、优先级、来源、类型、备注和解决时间持久层 |
+| Office / iServer | `BselectiServer` | 数据缺失 | 目标没有可供 CRM 选择的旧服务工单数据 |
+| Office / iServer | `ISReplyAdd` | 数据缺失 | 目标缺少工单回复主表与父工单关系 |
+| Office / iServer | `ISReplyAdd_Submit` | 数据缺失 | 目标缺少管理员工单回复、附件和内容持久层 |
+| Office / Licence | `LicenceFiles` | 数据缺失 | 目标缺少 LicenceFiles 协议文件定义与限定用户数据 |
+| Office / Licence | `LicenceFiles_API` | 数据缺失 | 目标没有可删除的协议文件定义 |
+| Office / Licence | `LicenceFilesAdd` | 数据缺失 | 目标无协议模板路径、字段、状态、限制类型和限定用户模型 |
+| Office / Licence | `LicenceFilesAdd_Submit` | 基础设施缺失 | 目标缺少协议定义持久层且云函数不能写旧本地模板文件 |
+| Office / Licence | `LicenceSignApplyList` | 数据缺失 | 目标缺少 Common_UserApply 的 user_signlicence 申请数据 |
+| Office / Licence | `LicenceSignApplyDetail` | 数据缺失 | 目标缺少许可签署申请、用户和协议文件关联 |
+| Office / Licence | `LicenceSignApply_API` | 基础设施缺失 | 目标缺少申请审核、签署记录及服务器 PDF/本地哈希归档运行时 |
+| Office / Licence | `LicenceSignList` | 数据缺失 | 目标缺少 LicenceUserSign 签约记录 |
+| Office / Licence | `LicenceSignDetail` | 数据缺失 | 目标缺少签约详情、协议文件和用户关联 |
+| Office / Licence | `LicenceSign_API` | 数据缺失 | 目标没有可审核或驳回的签约记录 |
+| Extend / Log | `TxtLog` | 基础设施缺失 | 云函数运行时没有旧 /Log/{LogType}/ 本地日志目录 |
+| Extend / Log | `TxtLogContent` | 基础设施缺失 | 云函数不能按文件名读取旧服务器文本日志 |
+| Extend / Log | `TxtLog_Down` | 基础设施缺失 | 云函数没有旧服务器日志文件可下载 |
+| Extend / Log | `TaskList` | 数据缺失 | SenTask 为空且字段不含旧 Content_ScheTask 任务定义 |
+| Extend / Log | `TaskAdd` | 基础设施缺失 | 目标缺少旧调度任务模型与 Hangfire 控制面 |
+| Extend / Log | `TaskAdd_API` | 基础设施缺失 | 目标不能复制旧任务并注册 Hangfire RecurringJob |
+| Extend / Log | `TaskAdd_Submit` | 基础设施缺失 | 目标缺少旧任务持久层、本地脚本校验与 Hangfire 调度运行时 |
+| Extend / Log | `Task_API` | 基础设施缺失 | 目标不能删除、停用、启用或立即执行旧 Hangfire 任务 |
+| Extend / Log | `TaskCenter` | 基础设施缺失 | 云函数环境没有旧 Hangfire Dashboard 管理页面 |
+| User / Mail | `Index` | 基础设施缺失 | 依赖邮件与短信服务商配置及发送凭据 |
+| User / Mail | `SafeMobileSms` | 基础设施缺失 | 依赖邮件与短信服务商配置及发送凭据 |
+| User / Mail | `SafeMobileSms_API` | 基础设施缺失 | 依赖邮件与短信服务商配置及发送凭据 |
+| User / Mail | `SMSSend` | 基础设施缺失 | 依赖邮件与短信服务商配置及发送凭据 |
+| User / Mail | `SMSSend_Submit` | 基础设施缺失 | 依赖邮件与短信服务商配置及发送凭据 |
+| User / Mail | `SMSSendLog` | 基础设施缺失 | 依赖邮件与短信服务商配置及发送凭据 |
+| User / Mail | `DeleteSMSLog` | 基础设施缺失 | 依赖邮件与短信服务商配置及发送凭据 |
+| User / Mail | `DeleteSMSLogs` | 基础设施缺失 | 依赖邮件与短信服务商配置及发送凭据 |
+| User / Mail | `Mail_API` | 基础设施缺失 | 依赖邮件与短信服务商配置及发送凭据 |
+| User / Mail | `MailList` | 基础设施缺失 | 依赖邮件与短信服务商配置及发送凭据 |
+| User / Mail | `MailTlp` | 基础设施缺失 | 依赖邮件与短信服务商配置及发送凭据 |
+| User / Mail | `MailTlpAdd` | 基础设施缺失 | 依赖邮件与短信服务商配置及发送凭据 |
+| User / Mail | `MailTlpAdd_Submit` | 基础设施缺失 | 依赖邮件与短信服务商配置及发送凭据 |
+| User / Mail | `MailSysTlp` | 基础设施缺失 | 依赖邮件与短信服务商配置及发送凭据 |
+| User / Mail | `MailSysTlpEdit` | 基础设施缺失 | 依赖邮件与短信服务商配置及发送凭据 |
+| User / Mail | `MailSysTlpEdit_Submit` | 基础设施缺失 | 依赖邮件与短信服务商配置及发送凭据 |
+| User / Mail | `MailSend` | 基础设施缺失 | 依赖邮件与短信服务商配置及发送凭据 |
+| User / Mail | `MailSend_Submit` | 基础设施缺失 | 依赖邮件与短信服务商配置及发送凭据 |
+| User / Mail | `MailSendLog` | 基础设施缺失 | 依赖邮件与短信服务商配置及发送凭据 |
+| Content / MarkDown | `Index` | 数据缺失 | 目标 Schema 缺少旧 MarkDown 主表及历史记录 |
+| Content / MarkDown | `MD` | 数据缺失 | 目标没有可新建或编辑的 MarkDown 记录 |
+| Content / MarkDown | `Index_submit` | 基础设施缺失 | 目标缺少 MarkDown 持久层且 Parse 文件适配器不能替代旧本地上传目录 |
+| Content / MarkDown | `Dels` | 数据缺失 | 目标没有 Markdown 记录与对应服务器文件可同步删除 |
+| Content / MarkDown | `Preview` | 基础设施缺失 | 目标缺少 Markdown 文件、SiteInfo.SiteUrl 与旧 /PreView/md 渲染运行时 |
+| User / Message | `Message` | 数据缺失 | 目标缺少旧 Message 站内信主表与收发历史;MailTemp 仅是邮件模板 |
+| User / Message | `MessageSend` | 数据缺失 | 目标没有可编辑的站内信草稿、收件人、抄送和附件记录 |
+| User / Message | `Message_Add` | 数据缺失 | 目标缺少站内信发送与草稿持久层 |
+| User / Message | `MessageRead` | 数据缺失 | 目标没有站内信详情与已读状态记录 |
+| User / Message | `Message_API` | 数据缺失 | 目标没有可删除的站内信记录 |
+| Mobile | `Index` | 基础设施缺失 | 旧动作只有已丢失的 Mobile Razor 视图,没有页面结构、交互或资源基线 |
+| Mobile | `MobileBrower` | 基础设施缺失 | 旧移动浏览器预览页只有已丢失的 Razor 视图,目标没有对应渲染运行时 |
+| Model | `ModelAdd` | 基础设施缺失 | 新增模型需要 PostgreSQL 建表、生成标签与写入旧模板文件 |
+| Model | `ModelAdd_Submit` | 基础设施缺失 | 托管云函数未开放模型 DDL 与旧 Zoomla 模板文件运行时 |
+| Model | `FieldAdd` | 基础设施缺失 | 新增字段需要 PostgreSQL ALTER TABLE 与旧字段控件模板 |
+| Model | `FieldAdd_Submit` | 基础设施缺失 | 目标托管环境未开放任意物理列 DDL 与旧控件生成器 |
+| Extend / MyCss | `Default` | 基础设施缺失 | 依赖旧站点 CSS 文件读写与下载 |
+| Extend / MyCss | `Default_API` | 基础设施缺失 | 依赖旧站点 CSS 文件读写与下载 |
+| Extend / MyCss | `CSSEditor` | 基础设施缺失 | 依赖旧站点 CSS 文件读写与下载 |
+| Extend / MyCss | `CSSEditor2` | 基础设施缺失 | 依赖旧站点 CSS 文件读写与下载 |
+| Extend / MyCss | `CSSContent` | 基础设施缺失 | 依赖旧站点 CSS 文件读写与下载 |
+| Extend / MyCss | `CSSContent_Submit` | 基础设施缺失 | 依赖旧站点 CSS 文件读写与下载 |
+| Extend / MyCss | `CSSDown` | 基础设施缺失 | 依赖旧站点 CSS 文件读写与下载 |
+| Content / Node | `UnionNode_Merge` | 数据缺失 | 旧合并同时改写 CommonModel 与未迁入的 ZL_Commodities,缺商品主表时不能执行半合并 |
+| Content / Node | `UnionSpecial_Merge` | 数据缺失 | CommonModel.specialId 物理列缺失且商品主表未迁移,无法安全重写专题关系 |
+| Office / OA | `Default` | 数据缺失 | 目标缺少旧 OA_AuditFlow 审核流主表与历史数据 |
+| Office / OA | `FlowInfo` | 数据缺失 | 目标没有旧审核流名称、模型、模板、角色用户和会签配置 |
+| Office / OA | `FlowInfo_Submit` | 数据缺失 | 目标缺少 OA_AuditFlow 持久层;MisProcedure 是不同版本结构 |
+| Office / OA | `Flow_API` | 数据缺失 | 目标没有可删除的旧审核流记录 |
+| Office / OA | `SelFlowModel` | 数据缺失 | 目标缺少审核流可绑定的旧 Mis_Model 与套红模板关系 |
+| Office / OA | `FlowItem` | 数据缺失 | 目标缺少 OA_AuditFlowItem 审核步骤表 |
+| Office / OA | `FlowItemInfo` | 数据缺失 | 目标没有审核步骤、绑定用户、父步骤、会签、转交和退回记录 |
+| Office / OA | `FlowItemInfo_Submit` | 数据缺失 | 目标缺少审核步骤持久层 |
+| Office / OA | `FlowItem_API` | 数据缺失 | 目标没有可删除的审核步骤记录 |
+| Office / OA | `AddMisModel` | 数据缺失 | DocModel 与旧 Mis_Model 的 ModelContent/BindNode/DocType/WordPath 不等价 |
+| Office / OA | `AddMisModel_Submit` | 基础设施缺失 | 目标缺少旧 Mis_Model 持久层和 FileGuid 套红模板文件运行时 |
+| Office / OA | `AddSign` | 数据缺失 | 目标 MisSign 是考勤时间表,不是 OA_Sign 签章模型 |
+| Office / OA | `AddSign_Submit` | 数据缺失 | 目标缺少 OA_Sign 图片、名称、口令、密钥、所属用户与创建人持久层 |
+| Office / OA | `AddSign_Delete` | 数据缺失 | 目标没有可删除的 OA_Sign 签章记录 |
+| Office / OA | `ApplyManage` | 数据缺失 | 目标缺少 OA_Document 文档申请主表 |
+| Office / OA | `ApplyManage_Delete` | 数据缺失 | 目标没有可删除的 OA 文档申请记录 |
+| Office / OA | `MisModelManage` | 数据缺失 | 目标缺少旧 Mis_Model 套红文档模型数据 |
+| Office / OA | `MisModelManage_Delete` | 数据缺失 | 目标没有可删除的旧套红文档模型 |
+| Office / OA | `OAConfig` | 基础设施缺失 | 旧动作只有已丢失的 OAConfig Razor 视图,目标没有对应配置模型 |
+| Office / OA | `SignManage` | 数据缺失 | 目标缺少 OA_Sign 签章列表;MisSign 是不等价的考勤时间表 |
+| Order | `OrderList_font` | 数据缺失 | 目标库缺少订单、订单商品、支付与物流主表 |
+| Order | `OrderSettle_font` | 数据缺失 | 目标库缺少订单、订单商品、支付与物流主表 |
+| Order | `OrderSettle_font_detail` | 数据缺失 | 目标库缺少订单、订单商品、支付与物流主表 |
+| Order | `OrderSettleAdd_font` | 数据缺失 | 目标库缺少订单、订单商品、支付与物流主表 |
+| Order | `OrderSettleAdd_font_Submit` | 数据缺失 | 目标库缺少订单、订单商品、支付与物流主表 |
+| Order | `OrderSettleHistory_font` | 数据缺失 | 目标库缺少订单、订单商品、支付与物流主表 |
+| Order | `OrderSettle_API` | 数据缺失 | 目标库缺少订单、订单商品、支付与物流主表 |
+| Order | `FontAuthorizeList` | 数据缺失 | 目标库缺少订单、订单商品、支付与物流主表 |
+| Order | `FontAuthorizeDetail` | 数据缺失 | 目标库缺少订单、订单商品、支付与物流主表 |
+| Order | `FontAuthorize_API` | 数据缺失 | 目标库缺少订单、订单商品、支付与物流主表 |
+| Order | `FontOrder_Output` | 数据缺失 | 目标库缺少订单、订单商品、支付与物流主表 |
+| Order | `OrderListInfo_font` | 数据缺失 | 目标库缺少订单、订单商品、支付与物流主表 |
+| Order | `OrderListInfo_font_licence` | 数据缺失 | 目标库缺少订单、订单商品、支付与物流主表 |
+| Order | `OrderList_fontDown` | 数据缺失 | 目标库缺少订单、订单商品、支付与物流主表 |
+| Order | `OrderList` | 数据缺失 | 目标库缺少订单、订单商品、支付与物流主表 |
+| Order | `Order_Down` | 数据缺失 | 目标库缺少订单、订单商品、支付与物流主表 |
+| Order | `Order_API` | 数据缺失 | 目标库缺少订单、订单商品、支付与物流主表 |
+| Order | `OrderListInfo` | 数据缺失 | 目标库缺少订单、订单商品、支付与物流主表 |
+| Order | `OrderRepairAudit` | 数据缺失 | 目标库缺少订单、订单商品、支付与物流主表 |
+| Order | `Audit_Btn_Click` | 数据缺失 | 目标库缺少订单、订单商品、支付与物流主表 |
+| Order | `UnAudit_Btn_Click` | 数据缺失 | 目标库缺少订单、订单商品、支付与物流主表 |
+| Order | `Del_Btn_Click` | 数据缺失 | 目标库缺少订单、订单商品、支付与物流主表 |
+| Order | `RepairDeailt` | 数据缺失 | 目标库缺少订单、订单商品、支付与物流主表 |
+| Order | `ChangeMoney_Btn_Click` | 数据缺失 | 目标库缺少订单、订单商品、支付与物流主表 |
+| Order | `CartManage` | 数据缺失 | 目标库缺少订单、订单商品、支付与物流主表 |
+| Order | `OrderAdd` | 数据缺失 | 目标库缺少订单、订单商品、支付与物流主表 |
+| Order | `OrderAdd_Submit` | 数据缺失 | 目标库缺少订单、订单商品、支付与物流主表 |
+| Order | `OrderPay` | 数据缺失 | 目标库缺少订单、订单商品、支付与物流主表 |
+| Order | `OrderPay_Submit` | 数据缺失 | 目标库缺少订单、订单商品、支付与物流主表 |
+| Order | `OrderBack` | 数据缺失 | 目标库缺少订单、订单商品、支付与物流主表 |
+| Order | `OrderBack_Submit` | 数据缺失 | 目标库缺少订单、订单商品、支付与物流主表 |
+| Order | `OrderPrint` | 数据缺失 | 目标库缺少订单、订单商品、支付与物流主表 |
+| Order | `OrderExpPrint` | 数据缺失 | 目标库缺少订单、订单商品、支付与物流主表 |
+| Order | `Output` | 数据缺失 | 目标库缺少订单、订单商品、支付与物流主表 |
+| Order | `OrderCar` | 数据缺失 | 目标库缺少订单、订单商品、支付与物流主表 |
+| Order | `API` | 数据缺失 | 目标库缺少订单、订单商品、支付与物流主表 |
+| Order | `Supple` | 数据缺失 | 目标库缺少订单、订单商品、支付与物流主表 |
+| Order | `Supple_Submit` | 数据缺失 | 目标库缺少订单、订单商品、支付与物流主表 |
+| Page | `ApplyAudit` | 数据缺失 | 目标 Schema 缺少旧 PageReg 用户黄页申请主表与审核状态 |
+| Page | `ApplyInfo` | 数据缺失 | 目标缺少 PageReg 申请详情、用户动态字段和样式关联 |
+| Page | `PageConfig` | 基础设施缺失 | 目标没有 SiteOption.RegPageStart/Page_ContentStatus/Page_UserCanNode 配置层 |
+| Page | `PageTemplate` | 数据缺失 | PageTemplate 为空且目标缺少 PageReg 用户归属,无法还原用户与公共模板树 |
+| Page | `PageTemplateAdd` | 数据缺失 | 目标缺少 PageReg,不能确定模板 RegID、用户和样式上下文 |
+| Page | `SetPageOrder` | 数据缺失 | 目标没有可按 PageReg 隔离的页面模板集合 |
+| Page | `PageConfig_Update` | 基础设施缺失 | 目标云函数架构没有旧黄页站点配置持久层 |
+| Page | `PageTemplate_Add` | 数据缺失 | 目标缺少 PageReg 用户归属和旧模型复选关系,不能安全新增页面模板 |
+| Page | `SetPageOrder_Batch` | 数据缺失 | 目标没有可按 PageReg 隔离的模板排序集合 |
+| Page | `SetPageOrder_UpMove` | 数据缺失 | 目标没有可按 PageReg 隔离的相邻模板顺序 |
+| Page | `SetPageOrder_DownMove` | 数据缺失 | 目标没有可按 PageReg 隔离的相邻模板顺序 |
+| Page | `Apply_Update` | 数据缺失 | 目标缺少 PageReg 申请主表、黄页模型附表和用户申请字段 |
+| Pay | `PayPlat` | 数据缺失 | 目标库缺少支付流水、订单支付明细及可验证的交易数据 |
+| Pay | `PayPlat_API` | 数据缺失 | 目标库缺少支付流水、订单支付明细及可验证的交易数据 |
+| Pay | `PayPlatAdd` | 数据缺失 | 目标库缺少支付流水、订单支付明细及可验证的交易数据 |
+| Pay | `PayPlatAdd_Submit` | 数据缺失 | 目标库缺少支付流水、订单支付明细及可验证的交易数据 |
+| Pay | `PayPalPlat` | 数据缺失 | 目标库缺少支付流水、订单支付明细及可验证的交易数据 |
+| Pay | `WechatPlat` | 数据缺失 | 目标库缺少支付流水、订单支付明细及可验证的交易数据 |
+| Pay | `WechatPlat_Submit` | 数据缺失 | 目标库缺少支付流水、订单支付明细及可验证的交易数据 |
+| Pay | `AliH5Plat` | 数据缺失 | 目标库缺少支付流水、订单支付明细及可验证的交易数据 |
+| Pay | `AliBankPlat` | 数据缺失 | 目标库缺少支付流水、订单支付明细及可验证的交易数据 |
+| Pay | `PaymentList` | 数据缺失 | 目标库缺少支付流水、订单支付明细及可验证的交易数据 |
+| Pay | `PaymentList_Output` | 数据缺失 | 目标库缺少支付流水、订单支付明细及可验证的交易数据 |
+| Pay | `PaymentList_API` | 数据缺失 | 目标库缺少支付流水、订单支付明细及可验证的交易数据 |
+| Pay | `PaymentInfo` | 数据缺失 | 目标库缺少支付流水、订单支付明细及可验证的交易数据 |
+| Pay | `Payment_Success` | 数据缺失 | 目标库缺少支付流水、订单支付明细及可验证的交易数据 |
+| Pay | `Regular` | 数据缺失 | 目标库缺少支付流水、订单支付明细及可验证的交易数据 |
+| Pay | `Regular_API` | 数据缺失 | 目标库缺少支付流水、订单支付明细及可验证的交易数据 |
+| Pay | `RegularAdd` | 数据缺失 | 目标库缺少支付流水、订单支付明细及可验证的交易数据 |
+| Pay | `RegularAdd_Submit` | 数据缺失 | 目标库缺少支付流水、订单支付明细及可验证的交易数据 |
+| Pay | `OCR` | 数据缺失 | 目标库缺少支付流水、订单支付明细及可验证的交易数据 |
+| Pay | `OCRList` | 数据缺失 | 目标库缺少支付流水、订单支付明细及可验证的交易数据 |
+| Pay | `OCRView` | 数据缺失 | 目标库缺少支付流水、订单支付明细及可验证的交易数据 |
+| Pay | `OCRDelete` | 数据缺失 | 目标库缺少支付流水、订单支付明细及可验证的交易数据 |
+| Pay | `OFR` | 数据缺失 | 目标库缺少支付流水、订单支付明细及可验证的交易数据 |
+| Pay | `OFRAdd` | 数据缺失 | 目标库缺少支付流水、订单支付明细及可验证的交易数据 |
+| Pay | `OFRDelete` | 数据缺失 | 目标库缺少支付流水、订单支付明细及可验证的交易数据 |
+| Pay | `VMoneyTurnover` | 数据缺失 | 目标库缺少支付流水、订单支付明细及可验证的交易数据 |
+| Pay | `VMoneyStatistics` | 数据缺失 | 目标库缺少支付流水、订单支付明细及可验证的交易数据 |
+| Pay | `VMoneyStatisticsAdd` | 数据缺失 | 目标库缺少支付流水、订单支付明细及可验证的交易数据 |
+| Pay | `VMoneyStatisticsDetail` | 数据缺失 | 目标库缺少支付流水、订单支付明细及可验证的交易数据 |
+| Office / Plat | `Default` | 数据缺失 | 旧默认页跳转到已缺失的 Blog_Msg 动态管理,目标没有可进入的信息首页 |
+| Office / Plat | `AuditApply` | 数据缺失 | 目标 Schema 缺少旧 Common_UserApply 协同办公申请主表 |
+| Office / Plat | `AuditApply_Agree` | 数据缺失 | 目标没有可批量通过并改为状态 99 的协同办公申请 |
+| Office / Plat | `AuditApply_Reject` | 数据缺失 | 目标没有可批量拒绝并改为状态 -1 的协同办公申请 |
+| Office / Plat | `PlatInfoDeail` | 数据缺失 | 目标 Schema 缺少旧 Blog_Msg 动态消息主表 |
+| Office / Plat | `PlatInfoDetail_Submit` | 数据缺失 | 目标没有可编辑正文与日期的旧协同办公动态消息 |
+| Office / Plat | `PlatInfoManage` | 数据缺失 | 目标没有 Blog_Msg 顶级动态、回收状态和关键词数据 |
+| Office / Plat | `TopicList` | 数据缺失 | 目标 Schema 缺少旧 Plat_Topic 话题主表与星标状态 |
+| Office / Plat | `WordTlp` | 基础设施缺失 | 旧文字模板仅剩已丢失的 Razor 视图,目标没有模板数据或渲染协议 |
+| Office / Plat | `Crud` | 数据缺失 | 目标 Schema 缺少旧 Plat_Group 企业部门/群组树 |
+| Office / Plat | `CrudAdd` | 数据缺失 | 目标没有可编辑的企业群组、上级和成员管理员关系 |
+| Office / Plat | `CrudAdd_Submit` | 数据缺失 | 目标缺少 Plat_Group 的 FirstID/Depth/ManageIDS/MemberIDS 持久层 |
+| Office / Plat | `GroupAdmin_API` | 数据缺失 | 目标没有可删除的 Plat_Group 企业群组记录 |
+| Label / PowerShell | `Index` | 基础设施缺失 | 依赖 Windows PowerShell 与服务器命令执行,云函数明确禁止 |
+| Label / PowerShell | `Cm_information` | 基础设施缺失 | 依赖 Windows PowerShell 与服务器命令执行,云函数明确禁止 |
+| Label / PowerShell | `RunScript` | 基础设施缺失 | 依赖 Windows PowerShell 与服务器命令执行,云函数明确禁止 |
+| Label / PowerShell | `AddScriptConsole` | 基础设施缺失 | 依赖 Windows PowerShell 与服务器命令执行,云函数明确禁止 |
+| Label / PowerShell | `Add` | 基础设施缺失 | 依赖 Windows PowerShell 与服务器命令执行,云函数明确禁止 |
+| Label / PowerShell | `Submit` | 基础设施缺失 | 依赖 Windows PowerShell 与服务器命令执行,云函数明确禁止 |
+| Printer | `Index` | 基础设施缺失 | 旧控制器只返回已丢失的 Razor 视图;目标 Schema 又缺少 PrintDevice/PrintTlp/PrintMessage,且旧飞印客户端依赖明文 HTTP 第三方协议,无法安全等价恢复 |
+| User / PrivacyPolicy | `LicenceList` | 数据缺失 | 目标 Schema 缺少 ZL_LicenceFiles 用户协议定义、强制签署类型与限定用户/用户组数据 |
+| User / PrivacyPolicy | `LicenceAdd` | 数据缺失 | 目标没有可编辑或新增的用户协议、PDF 路径、字段映射和适用范围记录 |
+| User / PrivacyPolicy | `LicenceAdd_Submit` | 数据缺失 | 目标缺少 LicenceFiles 持久层及协议 PDF 文件,不能只保存失效路径 |
+| User / PrivacyPolicy | `Licence_API` | 数据缺失 | 目标没有可启用、停用或删除的用户协议定义 |
+| User / PrivacyPolicy | `LicenceUserSign` | 数据缺失 | 目标 Schema 缺少 ZL_LicenceUserSign 用户签约历史及协议、用户关联 |
+| Product | `ProductManage` | 数据缺失 | 目标 Product 仅为旧商品附表,缺少 ZL_Commodities 主表 |
+| Product | `ProductRecycle` | 数据缺失 | 目标 Product 仅为旧商品附表,缺少 ZL_Commodities 主表 |
+| Product | `Product_API` | 数据缺失 | 目标 Product 仅为旧商品附表,缺少 ZL_Commodities 主表 |
+| Product | `AddProduct` | 数据缺失 | 目标 Product 仅为旧商品附表,缺少 ZL_Commodities 主表 |
+| Product | `GetProducer` | 数据缺失 | 目标 Product 仅为旧商品附表,缺少 ZL_Commodities 主表 |
+| Product | `GetBrand` | 数据缺失 | 目标 Product 仅为旧商品附表,缺少 ZL_Commodities 主表 |
+| Product | `ProductShow` | 数据缺失 | 目标 Product 仅为旧商品附表,缺少 ZL_Commodities 主表 |
+| Product | `Product_Add` | 数据缺失 | 目标 Product 仅为旧商品附表,缺少 ZL_Commodities 主表 |
+| Product | `Product_AddToNew` | 数据缺失 | 目标 Product 仅为旧商品附表,缺少 ZL_Commodities 主表 |
+| Product | `StockList` | 数据缺失 | 目标 Product 仅为旧商品附表,缺少 ZL_Commodities 主表 |
+| Product | `StockAdd` | 数据缺失 | 目标 Product 仅为旧商品附表,缺少 ZL_Commodities 主表 |
+| Product | `Stock_Add` | 数据缺失 | 目标 Product 仅为旧商品附表,缺少 ZL_Commodities 主表 |
+| Product | `Addon_VerBak` | 数据缺失 | 目标 Product 仅为旧商品附表,缺少 ZL_Commodities 主表 |
+| Product | `RegionPrice` | 数据缺失 | 目标 Product 仅为旧商品附表,缺少 ZL_Commodities 主表 |
+| Product | `RegionPrice_Submit` | 数据缺失 | 目标 Product 仅为旧商品附表,缺少 ZL_Commodities 主表 |
+| Product | `RegionPriceEdit` | 数据缺失 | 目标 Product 仅为旧商品附表,缺少 ZL_Commodities 主表 |
+| Product | `RegionPriceEdit_Submit` | 数据缺失 | 目标 Product 仅为旧商品附表,缺少 ZL_Commodities 主表 |
+| Product | `ShareEdit` | 数据缺失 | 目标 Product 仅为旧商品附表,缺少 ZL_Commodities 主表 |
+| Product | `ShareEdit_Submit` | 数据缺失 | 目标 Product 仅为旧商品附表,缺少 ZL_Commodities 主表 |
+| Product | `CommentManage` | 数据缺失 | 目标 Product 仅为旧商品附表,缺少 ZL_Commodities 主表 |
+| Product | `CommentManage_API` | 数据缺失 | 目标 Product 仅为旧商品附表,缺少 ZL_Commodities 主表 |
+| Product | `CommentAdd` | 数据缺失 | 目标 Product 仅为旧商品附表,缺少 ZL_Commodities 主表 |
+| Product | `CommentAdd_Submit` | 数据缺失 | 目标 Product 仅为旧商品附表,缺少 ZL_Commodities 主表 |
+| User / Promo | `Index` | 数据缺失 | 旧入口只重定向到提现申请页,目标缺少 Cash 提现主表,无法提供等价落点 |
+| User / Promo | `WD` | 数据缺失 | 目标 Schema 缺少 Cash 提现申请、手续费、结果、凭证与处理状态记录 |
+| User / Promo | `WD_API` | 数据缺失 | 目标没有可审核的提现申请记录 |
+| User / Promo | `WDAudit` | 数据缺失 | 目标缺少指定提现申请的金额、手续费、账户和处理详情 |
+| User / Promo | `WDAudit_Accept` | 数据缺失 | 目标缺少可原子审核的 Cash 提现事务记录 |
+| User / Promo | `WDAudit_Reject` | 数据缺失 | 目标缺少 Cash 提现申请及对应预扣余额账本,不能安全执行拒绝退款 |
+| User / Promo | `UserBank` | 数据缺失 | 目标 Schema 缺少 User_Bank 提现账户及审核状态数据 |
+| User / Promo | `UserBankAdd` | 数据缺失 | 目标没有可编辑的开户人、卡号、账户类型和开户行记录 |
+| User / Promo | `UserBankAdd_Submit` | 数据缺失 | 目标缺少 User_Bank 持久层,不能把提现账户错写到发票银行字段 |
+| User / Promo | `UserBank_API` | 数据缺失 | 目标没有可删除、审核或取消审核的提现账户记录 |
+| Pub | `PubManage` | 数据缺失 | 目标 Pub 模块定义与 PubTw/PubWTHD/PubZXDC 提交类均为空,无法还原互动模块列表 |
+| Pub | `Pub_API` | 基础设施缺失 | 旧删除/复制/恢复依赖 Pub 定义与动态表,modelname 还会检查 SQL 物理表;目标没有可操作记录或动态建表运行时 |
+| Pub | `Pubinfo` | 数据缺失 | 旧动作只跳转到指定 Pub 定义编辑页,目标 Pub 没有任何历史模块 |
+| Pub | `PubAdd` | 基础设施缺失 | 新增互动模块需要动态模型、表、标签与模板选择,目标云函数没有等价创建运行时 |
+| Pub | `PubAdd_Submit` | 基础设施缺失 | 旧提交会动态建 SQL 表、Model/ModelField、XML 标签及两套服务器 HTML 模板,云函数不能等价执行 |
+| Pub | `Pubsinfo` | 数据缺失 | 目标没有 Pub 定义可确定提交表,三个已签约 Pub 提交类也全部为空 |
+| Pub | `PubsinfoAdd` | 数据缺失 | 目标缺少互动模块定义、动态字段与可编辑的提交记录 |
+| Pub | `PubsinfoAdd_Submit` | 数据缺失 | 目标无法根据空的 Pub 定义选择动态提交表并保存系统字段与模型字段 |
+| Pub | `PubInfo_API` | 数据缺失 | 目标没有可删除、审核或取消审核的互动提交记录 |
+| Pub | `PubInfo2_API` | 数据缺失 | 旧企业入驻分支硬编码依赖缺失的 ZL_Pub_BDQYSH 提交表,不能直接改写企业与用户归属 |
+| Pub | `PubsinfoReply` | 数据缺失 | 目标没有互动父记录、动态字段和回复上下文 |
+| Pub | `PubsinfoReply_Submit` | 数据缺失 | 目标缺少可确定回复表的 Pub 定义及父提交记录 |
+| Push | `Index` | 数据缺失 | 旧入口只跳转到推送 API 列表,目标缺少 Mobile_PushAPI 配置数据 |
+| Push | `APIList` | 数据缺失 | 目标 Schema 缺少 Mobile_PushAPI 的别名、平台、AppKey 与密钥记录 |
+| Push | `API_del` | 数据缺失 | 目标没有可定位并删除的推送服务配置 |
+| Push | `AddAPI` | 数据缺失 | 目标没有可编辑或新增的极光推送 API 配置模型 |
+| Push | `AddAPI_Submit` | 数据缺失 | 签约数据库未提供可安全存储和轮换推送 AppKey/AppSecret 的配置类 |
+| Push | `PushMsg` | 数据缺失 | 目标缺少可选择的推送 API 配置与设备受众数据 |
+| Push | `PushMsg_Submit` | 基础设施缺失 | 目标没有 JPush 凭据、SDK 消费者、ZL_UserBase.UC 设备注册号或移动端注册链,无法真实发送并记录结果 |
+| Push | `PushTlp` | 数据缺失 | 目标 Schema 缺少 Mobile_PushTlp 推送模板与状态数据 |
+| Push | `AddPushTlp` | 数据缺失 | 目标没有可编辑或新增的推送模板记录 |
+| Push | `AddPushTlp_Submit` | 数据缺失 | 目标缺少推送模板名称、标题、内容和参数持久层 |
+| Push | `PushTlp_API` | 数据缺失 | 目标没有可启用、停用或删除的推送模板 |
+| Push | `MsgList` | 数据缺失 | 目标 Schema 缺少 Mobile_PushMsg 发送历史、受众与结果记录 |
+| Extend / PWA | `Default` | 基础设施缺失 | 旧入口跳转到离线缓存配置;目标没有可动态改写已部署前端的 PWA 控制面 |
+| Extend / PWA | `Default_Submit` | 基础设施缺失 | 旧提交为空操作,目标不伪造无效果的保存成功 |
+| Extend / PWA | `Mobile` | 基础设施缺失 | 目标缺少旧 SiteOption PWA 配置、manifest 文件和多尺寸图标资产 |
+| Extend / PWA | `Mobile_Submit` | 基础设施缺失 | 云函数不能缩放上传图标、写 manifest.json、注入站点 head 或持久化旧 SiteConfig |
+| Extend / PWA | `Offline` | 基础设施缺失 | 目标没有旧 PWA_PC_Enable/Exts/IndexUrl/PreCache 配置与服务器模板 |
+| Extend / PWA | `Offline_Submit` | 基础设施缺失 | 云函数不能读取 pwa_sw_js.tlp 并覆盖已部署站点根目录 /sw.js |
+| Extend / QuartzTask | `TaskList` | 数据缺失 | 目标 Schema 缺少 QuartzNetTask 任务定义、类型、状态、次数和历史记录;空 SenTask 语义不等价 |
+| Extend / QuartzTask | `ViewLog` | 数据缺失 | 目标没有 QuartzNetTask.Log 执行日志可按任务查看 |
+| Extend / QuartzTask | `TaskAdd` | 基础设施缺失 | 目标没有 Quartz IScheduler、ScheduleTaskHandler 与任务持久层,无法创建一次或循环任务 |
+| Extend / QuartzTask | `TaskAdd` #2 | 基础设施缺失 | 目标没有 Quartz IScheduler、ScheduleTaskHandler 与任务持久层,无法创建一次或循环任务 |
+| Extend / QuartzTask | `TaskEdit` | 数据缺失 | 目标没有可编辑的 Quartz 任务定义 |
+| Extend / QuartzTask | `TaskUpdate` | 基础设施缺失 | 目标没有可同步更新持久层与 Quartz 调度器的控制面 |
+| Extend / QuartzTask | `ExecuteNow` | 基础设施缺失 | 云函数环境没有已注册的 Quartz 作业可立即触发 |
+| Extend / QuartzTask | `TaskDelete` | 基础设施缺失 | 目标没有可同时删除 Quartz 作业与任务记录的调度控制面 |
+| Extend / QuartzTask | `TaskDeleteRange` | 基础设施缺失 | 目标没有可批量注销 Quartz 作业与删除任务记录的控制面 |
+| Extend / QuartzTask | `TaskPause` | 基础设施缺失 | 云函数环境没有常驻 Quartz 调度器或可暂停作业 |
+| Extend / QuartzTask | `TaskResume` | 基础设施缺失 | 云函数环境没有常驻 Quartz 调度器或可恢复作业 |
+| Shop / Refund | `ShowOrder` | 数据缺失 | 目标库无订单退款与退款流水 |
+| Shop / Refund | `WxRefund` | 数据缺失 | 目标库无订单退款与退款流水 |
+| Shop / Refund | `WxRefundInfo` | 数据缺失 | 目标库无订单退款与退款流水 |
+| Shop / Refund | `WxRefund_API` | 数据缺失 | 目标库无订单退款与退款流水 |
+| Extend / Safe | `Default` | 基础设施缺失 | 旧默认入口只跳转 SiteSwitch;目标没有静态 Angular 站点的安全开关控制面 |
+| Extend / Safe | `API` | 基础设施缺失 | 旧聚合 API 依赖缺失 Safe_IP、服务器站点检查局部页和 ContentWordHelper 常驻线程 |
+| Extend / Safe | `SiteSwitch` | 基础设施缺失 | 目标没有站点上下线状态、下线页文件或前端发布开关 |
+| Extend / Safe | `SiteIP` | 数据缺失 | 目标 Schema 缺少旧 Safe_IP 白/黑名单、到期时间与管理员历史 |
+| Extend / Safe | `SiteIPAdd` | 数据缺失 | 目标没有可编辑或新建的 Safe_IP IP 规则记录 |
+| Extend / Safe | `SiteIPAdd_Submit` | 数据缺失 | 目标缺少 Safe_IP 持久层和实际消费 IP 规则的请求中间件 |
+| Extend / Safe | `ContentProtect` | 基础设施缺失 | 旧内容保护页视图已丢失,目标无签名、防复制或防篡改配置消费链 |
+| Extend / Safe | `SiteAssess` | 基础设施缺失 | 旧站点安全评估视图、评分规则、基线和历史结果均未交付 |
+| Extend / Safe | `SiteProtect` | 基础设施缺失 | 目标无 Safe_ContentCheck_Models 配置模型及内容写入扫描消费层 |
+| Extend / Safe | `SiteProtect_Submit` | 基础设施缺失 | 仅保存模型 ID 字符串不会产生保护;目标缺少 SiteConfig.Update 和扫描运行时 |
+| Extend / Safe | `ContentCheck` | 基础设施缺失 | 目标无 ContentWordHelper 扫描任务、进度结果缓存和待检模型范围 |
+| Extend / Safe | `ContentCheckConfig` | 基础设施缺失 | 云函数运行时没有 IllegalWordsVerify.keywordsVPath 非法词文件与旧编辑视图 |
+| Extend / Safe | `ContentCheckConfig_Submit` | 基础设施缺失 | 云函数不能写旧非法词文件,当前内容接口也没有该文件消费链 |
+| Extend / Safe | `ContentFilter` | 基础设施缺失 | 旧内容过滤视图已丢失,目标无等价替换/阻断规则与执行层 |
+| Extend / Safe | `SiteCheck` | 基础设施缺失 | 旧站点检查依赖服务器文件、局部 Razor 页和丢失的检查规则 |
+| Sale | `Index` | 数据缺失 | 目标库缺少订单销售明细与可复算的销售事实表 |
+| Sale | `SaleByDay` | 数据缺失 | 目标库缺少订单销售明细与可复算的销售事实表 |
+| Sale | `SaleByMonth` | 数据缺失 | 目标库缺少订单销售明细与可复算的销售事实表 |
+| Sale | `SaleByProduct` | 数据缺失 | 目标库缺少订单销售明细与可复算的销售事实表 |
+| Sale | `SaleByProductDetail` | 数据缺失 | 目标库缺少订单销售明细与可复算的销售事实表 |
+| Sale | `SaleByClass` | 数据缺失 | 目标库缺少订单销售明细与可复算的销售事实表 |
+| Sale | `SaleByUser` | 数据缺失 | 目标库缺少订单销售明细与可复算的销售事实表 |
+| Sale | `SaleByUserDetail` | 数据缺失 | 目标库缺少订单销售明细与可复算的销售事实表 |
+| Sale | `PayList` | 数据缺失 | 目标库缺少订单销售明细与可复算的销售事实表 |
+| Office / Service | `MsgEx` | 数据缺失 | 目标 Schema 缺少旧 ChatMsg 会话消息表与历史数据 |
+| Office / Service | `MsgInfo` | 数据缺失 | 目标 Schema 缺少旧 ChatMsg 单条消息详情数据 |
+| Office / Service | `MsgList` | 数据缺失 | 目标 Schema 缺少旧 ChatMsg 消息列表数据 |
+| Site | `API` | 基础设施缺失 | 依赖 IIS 站点、虚拟目录、主机池与数据库服务器管理 |
+| Site | `Default` | 基础设施缺失 | 依赖 IIS 站点、虚拟目录、主机池与数据库服务器管理 |
+| Site | `SiteList` | 基础设施缺失 | 依赖 IIS 站点、虚拟目录、主机池与数据库服务器管理 |
+| Site | `FileManage` | 基础设施缺失 | 依赖 IIS 站点、虚拟目录、主机池与数据库服务器管理 |
+| Site | `SiteAdd` | 基础设施缺失 | 依赖 IIS 站点、虚拟目录、主机池与数据库服务器管理 |
+| Site | `SiteAdd_Submit` | 基础设施缺失 | 依赖 IIS 站点、虚拟目录、主机池与数据库服务器管理 |
+| Site | `Config` | 基础设施缺失 | 依赖 IIS 站点、虚拟目录、主机池与数据库服务器管理 |
+| Site | `Config_Submit` | 基础设施缺失 | 依赖 IIS 站点、虚拟目录、主机池与数据库服务器管理 |
+| Site | `SitePool` | 基础设施缺失 | 依赖 IIS 站点、虚拟目录、主机池与数据库服务器管理 |
+| Site | `ServerClusterConfig` | 基础设施缺失 | 依赖 IIS 站点、虚拟目录、主机池与数据库服务器管理 |
+| Site | `ServerAdd` | 基础设施缺失 | 依赖 IIS 站点、虚拟目录、主机池与数据库服务器管理 |
+| Site | `SiteCloudSetup` | 基础设施缺失 | 依赖 IIS 站点、虚拟目录、主机池与数据库服务器管理 |
+| Site | `SiteDataCenter` | 基础设施缺失 | 依赖 IIS 站点、虚拟目录、主机池与数据库服务器管理 |
+| Site | `VirtualDirectory` | 基础设施缺失 | 依赖 IIS 站点、虚拟目录、主机池与数据库服务器管理 |
+| Site | `DBManage` | 基础设施缺失 | 依赖 IIS 站点、虚拟目录、主机池与数据库服务器管理 |
+| Site | `DBAdd` | 基础设施缺失 | 依赖 IIS 站点、虚拟目录、主机池与数据库服务器管理 |
+| Site | `HostList` | 基础设施缺失 | 依赖 IIS 站点、虚拟目录、主机池与数据库服务器管理 |
+| Site | `HostAdd` | 基础设施缺失 | 依赖 IIS 站点、虚拟目录、主机池与数据库服务器管理 |
+| Label / SiteDeploy | `SiteList` | 基础设施缺失 | 依赖站点发布、远程命令与文件下载基础设施 |
+| Label / SiteDeploy | `SiteAdd` | 基础设施缺失 | 依赖站点发布、远程命令与文件下载基础设施 |
+| Label / SiteDeploy | `SiteAdd` #2 | 基础设施缺失 | 依赖站点发布、远程命令与文件下载基础设施 |
+| Label / SiteDeploy | `SiteDetail` | 基础设施缺失 | 依赖站点发布、远程命令与文件下载基础设施 |
+| Label / SiteDeploy | `ExecuteCommand` | 基础设施缺失 | 依赖站点发布、远程命令与文件下载基础设施 |
+| Label / SiteDeploy | `SiteEdit` | 基础设施缺失 | 依赖站点发布、远程命令与文件下载基础设施 |
+| Label / SiteDeploy | `SetDefaultApi` | 基础设施缺失 | 依赖站点发布、远程命令与文件下载基础设施 |
+| Label / SiteDeploy | `SiteUpdate` | 基础设施缺失 | 依赖站点发布、远程命令与文件下载基础设施 |
+| Label / SiteDeploy | `SiteDelete` | 基础设施缺失 | 依赖站点发布、远程命令与文件下载基础设施 |
+| Label / SiteDeploy | `SiteDeleteRange` | 基础设施缺失 | 依赖站点发布、远程命令与文件下载基础设施 |
+| Label / SiteDeploy | `SitePublish` | 基础设施缺失 | 依赖站点发布、远程命令与文件下载基础设施 |
+| Label / SiteDeploy | `SiteDownload` | 基础设施缺失 | 依赖站点发布、远程命令与文件下载基础设施 |
+| Shop / Store | `Product` | 数据缺失 | 旧 ZL_Commodities 商品主表缺失,目标 Product/StoreProduct 只有扩展碎片,无法重建商品列表 |
+| User / Struct | `Default` | 数据缺失 | 旧入口跳转组织树;目标缺少 ZL_Structure 主表,无法提供等价落点 |
+| User / Struct | `StructList` | 数据缺失 | 目标缺少组织名称、父级、排序、成员、管理员、权限、提醒和经验历史数据 |
+| User / Struct | `order` | 数据缺失 | 目标没有可按父节点连续重排 OrderID 的组织结构记录 |
+| User / Struct | `order_submit` | 数据缺失 | 目标没有可按旧结构 ID 更新 OrderID 的组织结构记录 |
+| User / Struct | `Struct_API` | 数据缺失 | 目标缺少 ZL_Structure.UserIDS/ManagerIDS 与 ZL_User.StructureID 双向成员关系 |
+| User / Struct | `StructByTree` | 数据缺失 | 目标没有 ParentID 层级及组织成员、管理员关系,不能还原结构树 |
+| User / Struct | `Struct_ListByTree` | 数据缺失 | 目标没有可递归展开并按 OrderID 排序的组织结构记录 |
+| User / Struct | `StructAdd` | 数据缺失 | 目标没有可编辑或新增的组织结构主记录 |
+| User / Struct | `StructAdd_Submit` | 数据缺失 | 目标缺少 ZL_Structure 持久层及用户结构关系同步事务 |
+| User / Struct | `StructMember` | 数据缺失 | 目标缺少 UserIDS/ManagerIDS 组织成员关系;Profile 与 Group 语义不等价 |
+| User / Struct | `Structure_update` | 数据缺失 | 目标没有可供树形拖动和批量重排的组织结构记录 |
+| User / Struct | `Structure_Merge` | 数据缺失 | 目标缺少成员、管理员、经验合并与来源结构删除所需数据 |
+| User / Struct | `Structure_Move` | 数据缺失 | 目标没有可校验循环并更新 ParentID 的组织结构树 |
+| User / Struct | `Structure_List` | 数据缺失 | 目标 Schema 缺少旧 ZL_Structure 平铺列表及历史记录 |
+| Template | `LabelManage` | 基础设施缺失 | 依赖旧模板/CSS 文件系统和 Zoomla 标签运行时 |
+| Template | `LabelHtml` | 基础设施缺失 | 依赖旧模板/CSS 文件系统和 Zoomla 标签运行时 |
+| Template | `LabelHtml_Save` | 基础设施缺失 | 依赖旧模板/CSS 文件系统和 Zoomla 标签运行时 |
+| Template | `LabelSql` | 基础设施缺失 | 依赖旧模板/CSS 文件系统和 Zoomla 标签运行时 |
+| Template | `LabelSql_Save` | 基础设施缺失 | 依赖旧模板/CSS 文件系统和 Zoomla 标签运行时 |
+| Template | `LabelCallTab` | 基础设施缺失 | 依赖旧模板/CSS 文件系统和 Zoomla 标签运行时 |
+| Template | `LabelCall_API` | 基础设施缺失 | 依赖旧模板/CSS 文件系统和 Zoomla 标签运行时 |
+| Template | `LabelInsert` | 基础设施缺失 | 依赖旧模板/CSS 文件系统和 Zoomla 标签运行时 |
+| Template | `Label_API` | 基础设施缺失 | 依赖旧模板/CSS 文件系统和 Zoomla 标签运行时 |
+| Template | `LabelSql_API` | 基础设施缺失 | 依赖旧模板/CSS 文件系统和 Zoomla 标签运行时 |
+| Template | `LabelUpdate` | 基础设施缺失 | 依赖旧模板/CSS 文件系统和 Zoomla 标签运行时 |
+| Template | `LabelUpdate_Submit` | 基础设施缺失 | 依赖旧模板/CSS 文件系统和 Zoomla 标签运行时 |
+| Template | `LabelUpdate_Submit2` | 基础设施缺失 | 依赖旧模板/CSS 文件系统和 Zoomla 标签运行时 |
+| Template | `LabelSql_Field` | 基础设施缺失 | 依赖旧模板/CSS 文件系统和 Zoomla 标签运行时 |
+| Template | `LabelPage` | 基础设施缺失 | 依赖旧模板/CSS 文件系统和 Zoomla 标签运行时 |
+| Template | `LabelPage_Submit` | 基础设施缺失 | 依赖旧模板/CSS 文件系统和 Zoomla 标签运行时 |
+| Template | `TemplateManage` | 基础设施缺失 | 依赖旧模板/CSS 文件系统和 Zoomla 标签运行时 |
+| Template | `TemplateEdit` | 基础设施缺失 | 依赖旧模板/CSS 文件系统和 Zoomla 标签运行时 |
+| Template | `TemplateList` | 基础设施缺失 | 依赖旧模板/CSS 文件系统和 Zoomla 标签运行时 |
+| Template | `TemplateEdit_Submit` | 基础设施缺失 | 依赖旧模板/CSS 文件系统和 Zoomla 标签运行时 |
+| Template | `CSSManage` | 基础设施缺失 | 依赖旧模板/CSS 文件系统和 Zoomla 标签运行时 |
+| Template | `CSSEdit` | 基础设施缺失 | 依赖旧模板/CSS 文件系统和 Zoomla 标签运行时 |
+| Template | `CSSEdit_Submit` | 基础设施缺失 | 依赖旧模板/CSS 文件系统和 Zoomla 标签运行时 |
+| Template | `TemplateSetOfficial` | 基础设施缺失 | 依赖旧模板/CSS 文件系统和 Zoomla 标签运行时 |
+| Template | `TemplateSet` | 基础设施缺失 | 依赖旧模板/CSS 文件系统和 Zoomla 标签运行时 |
+| Template | `TemplateSetDown` | 基础设施缺失 | 依赖旧模板/CSS 文件系统和 Zoomla 标签运行时 |
+| Template | `TemplateSet_API` | 基础设施缺失 | 依赖旧模板/CSS 文件系统和 Zoomla 标签运行时 |
+| Template | `TemplateSetAdd` | 基础设施缺失 | 依赖旧模板/CSS 文件系统和 Zoomla 标签运行时 |
+| Template | `TemplateSetAdd_Submit` | 基础设施缺失 | 依赖旧模板/CSS 文件系统和 Zoomla 标签运行时 |
+| Template | `DSList` | 基础设施缺失 | 依赖旧模板/CSS 文件系统和 Zoomla 标签运行时 |
+| Template | `DBList_API` | 基础设施缺失 | 依赖旧模板/CSS 文件系统和 Zoomla 标签运行时 |
+| Template | `DSAdd` | 基础设施缺失 | 依赖旧模板/CSS 文件系统和 Zoomla 标签运行时 |
+| Template | `DSAdd_Submit` | 基础设施缺失 | 依赖旧模板/CSS 文件系统和 Zoomla 标签运行时 |
+| Template | `SelFont` | 基础设施缺失 | 依赖旧模板/CSS 文件系统和 Zoomla 标签运行时 |
+| User | `Output` | 基础设施缺失 | 旧 xlsx/docx/md 导出依赖 NPOI/WordAdd、客户端提交表格及 SiteConfig 页眉页脚;现有内容 CSV 导出不等价 |
+| User | `GetMd` | 基础设施缺失 | 旧方法只是用户 Output 的 Markdown 内部格式器;目标没有对应任意表格提交与下载协议 |
+| User | `UserOrder` | 数据缺失 | 目标缺少 ZL_OrderInfo 与 ZL_CartPro,无法还原指定用户订单和金额统计 |
+| User | `DelUserPost_Btn_Click` | 数据缺失 | GuestBar 仅保留只读迁移数据,缺少可证明完整的按用户帖子级联和计数语义 |
+| User | `UPClient` | 数据缺失 | 目标缺少 CRMS_Client 与模型 48 动态附表,无法同步为旧 CRM 客户 |
+| User | `UserBlontoAdmin` | 数据缺失 | 目标 Profile/_User 均没有旧 ZL_UserBase.Bugle 归属管理员关系 |
+| User | `UserBlontoAdmin_Submit` | 数据缺失 | 目标缺少 Bugle 字段,不能批量写入旧 AdminID |
+| User | `UserLogin` | 基础设施缺失 | 旧动作要求管理员掌握用户明文口令并写 ASP.NET 登录 Cookie;云函数会话不安全模拟密码代登 |
+| User | `AdminAdd` | 基础设施缺失 | 旧 Manager 与当前 Parse _User 管理员会话没有可靠一对一外键,单建 Manager 行不会生成可登录管理员 |
+| User | `AdminAdd_Submit` | 基础设施缺失 | 目标缺少 Manager/_User 原子身份绑定、旧 MD5 迁移和二级密码消费链 |
+| User | `SendMailList` | 数据缺失 | 目标缺少旧邮件发送队列、投递日志、收件人与状态历史 |
+| User | `SubscriptListManage` | 数据缺失 | 目标缺少旧订阅主表、订阅用户与栏目关系 |
+| User | `Jobsconfig` | 基础设施缺失 | 旧页面仅剩未交付 Razor 视图,目标没有可识别任务配置模型或消费者 |
+| User | `ZoneConfig` | 基础设施缺失 | 旧页面仅剩未交付 Razor 视图,目标没有对应会员空间配置或消费者 |
+| User | `WSApi` | 基础设施缺失 | 目标没有 SiteInfo.APIClose 旧 WebService 总开关及 SOAP/WS 运行时 |
+| User | `Department` | 数据缺失 | 旧页面依赖未迁入的 ZL_Plat_Group 企业部门与成员/管理员关系 |
+| User | `Department_Submit` | 数据缺失 | 目标缺少 Plat_Group 部门树,不能更新 MemberIDS/ManageIDS |
+| User | `WSApi_Submit` | 基础设施缺失 | 云函数不能切换不存在的 SiteInfo.APIClose 或旧 SOAP/WS 宿主 |
+| Content / VBook | `Default` | 数据缺失 | 旧入口跳转 H5 电子书列表;目标缺少 ZL_H5_Item/H5Item 主表 |
+| Content / VBook | `Add` | 数据缺失 | 目标没有可编辑或新增的 H5 电子书标题、封面和模板关系 |
+| Content / VBook | `Add_Submit` | 数据缺失 | 目标缺少 ZL_H5_Item 持久层,不能保存标题与 coverImage |
+| Content / VBook | `List` | 数据缺失 | 目标没有可按标题和模板筛选的 H5 电子书历史数据 |
+| Content / VBook | `API` | 数据缺失 | 目标没有可删除或 SetTemplate 的 H5 电子书及模板关联 |
+| Content / VBook | `Best` | 数据缺失 | 目标没有可更新 isbest 推荐状态的 ZL_H5_Item 记录 |
+| Vdesign | `Default` | 数据缺失 | 目标缺少 ZL_Vdesign;DesignSiteInfo 属于字段和生命周期不同的 ZL_Design_SiteInfo |
+| Vdesign | `SiteAdd` | 数据缺失 | 目标没有可编辑的 Vdesign 应用名称、评分、状态、所有者和模板关系 |
+| Vdesign | `SiteAdd_Submit` | 数据缺失 | 目标缺少 ZL_Vdesign 与应用变更日志,不能原子保存并记录变更 |
+| Vdesign | `SiteArticle` | 数据缺失 | 目标缺少 ZL_Vdesign_Article 站点—内容绑定表 |
+| Vdesign | `SiteShop` | 数据缺失 | 目标同时缺少 ZL_Vdesign_Shop 绑定表和 ZL_Commodities 商品主表 |
+| Vdesign | `SiteMessage` | 数据缺失 | 目标缺少 ZL_Vdesign_Message 站点留言及审核历史 |
+| Vdesign | `Site_API` | 数据缺失 | 旧站点启停/删除、留言审核及文章/商品解绑依赖四张未迁入表和变更日志 |
+| Vdesign | `SiteBoard` | 数据缺失 | 目标缺少 ZL_VdesignTemplate;DesignTlp 是另一套可视化场景模板 |
+| Vdesign | `SiteBoardAdd` | 数据缺失 | 目标没有可编辑的 Vdesign 模板名称、图片、价格、积分、状态、类型和备注 |
+| Vdesign | `SiteBoardAdd_Submit` | 数据缺失 | 目标缺少 Vdesign 模板持久层,不能错写到 DesignTlp |
+| Vdesign | `Board_API` | 数据缺失 | 目标没有可删除、审核、启停、推荐或换图的 Vdesign 模板记录 |
+| Vdesign | `SiteBoardType` | 数据缺失 | 目标缺少 ZL_VdesignTemplateType 模板分类树 |
+| Vdesign | `SiteBoardTypeAdd` | 数据缺失 | 目标没有可编辑或新增的 Vdesign 模板分类 |
+| Vdesign | `SiteBoardTypeAdd_Submit` | 数据缺失 | 目标缺少模板分类名称、父级、顺序和备注持久层 |
+| Vdesign | `BoardType_API` | 数据缺失 | 目标没有可列出或递归删除的 Vdesign 模板分类树 |
+| Vdesign | `SiteChangeLog` | 数据缺失 | 目标缺少 ZL_VdesignSiteChangeLog 应用变更历史 |
+| Vdesign | `SiteChangeLog_API` | 数据缺失 | 旧空操作对应的变更日志数据和页面均未迁入,不能伪报完整能力 |
+| Vdesign | `TemplateBuyLog` | 数据缺失 | 目标缺少 ZL_VdesignTemplateBuyLog 模板购买历史及关联 |
+| Vdesign | `TemplateBuyLog_API` | 数据缺失 | 旧空操作对应的购买日志数据和页面均未迁入,不能伪报完整能力 |
+| Extend / VDesign | `SPage` | 数据缺失 | 目标缺少 ZL_SPage_Page 的页面、布局、资源、页脚和数据源标签数据 |
+| Extend / VDesign | `SPageAdd` | 数据缺失 | 目标没有可编辑或新增的 SPage;DesignPage 的结构与生命周期不等价 |
+| Extend / VDesign | `SPageAdd_Submit` | 数据缺失 | 目标缺少 ZL_SPage_Page 持久层 |
+| Extend / VDesign | `SPage_API` | 数据缺失 | 目标没有可复制或删除的 SPage 页面记录 |
+| Extend / VDesign | `SPageEdit` | 数据缺失 | 目标缺少 SPage 的 Layouts、PageRes、PageBottom 与数据源标签 |
+| Extend / VDesign | `SPageEdit_Submit` | 数据缺失 | 目标没有可按旧页面 ID 保存 Layouts 的记录 |
+| Extend / VDesign | `SPage_AddComponent` | 基础设施缺失 | 旧组件选择器视图、组件目录和序列化协议未交付 |
+| Extend / VDesign | `SPage_AddLayout` | 基础设施缺失 | 旧布局选择器视图、布局定义和序列化协议未交付 |
+| Extend / VDesign | `SPageDesign` | 基础设施缺失 | 目标缺少 SPage 数据、B_CreateHtml 标签解析器、编辑器资产和预览运行时 |
+| Extend / VDesign | `SPageDesign_API` | 基础设施缺失 | 云函数没有可执行 Base64 数据源标签的 B_CreateHtml 内容上下文 |
+| Extend / VDesign | `SPageDesign_Nav` | 基础设施缺失 | 旧导航组件视图与序列化协议未交付 |
+| Extend / VDesign | `SPageDesign_Label` | 基础设施缺失 | 旧标签组件依赖未迁入的 Zoomla 标签库与 B_CreateHtml |
+| Extend / VDesign | `SPageDesign_Content` | 基础设施缺失 | 旧内容组件视图及动态模型/栏目绑定协议未交付 |
+| Extend / VDesign | `SPageDesign_Carousel` | 基础设施缺失 | 旧轮播组件视图、素材与序列化协议未交付 |
+| Extend / VDesign | `SPagePreview` | 基础设施缺失 | 目标缺少 SPage 数据和 B_CreateHtml 标签渲染环境 |
+| Label / Vue | `Index` | 数据缺失 | 目标 Schema 缺少旧 ZL_Vue_Tlp 模板代码表与历史记录 |
+| Label / Vue | `TlpView` | 基础设施缺失 | 目标缺少模板路径数据、服务器模板文件和 B_CreateHtml 标签预览运行时 |
+| Label / Vue | `VUE_API` | 基础设施缺失 | 目标缺少 ZL_Vue_Tlp,云函数也没有模板文件、标签渲染、vue.tlp 和目录复制运行时 |
+| Label / Vue | `Config` | 基础设施缺失 | 目标没有 SiteOption.VUE_DirCopy 配置及其服务器发布消费者 |
+| Label / Vue | `Config_Submit` | 基础设施缺失 | 云函数不能更新旧 SiteConfig 或按配置复制服务器目录 |
+| Mobile / WeiXin | `Index` | 基础设施缺失 | 依赖新版微信、支付、模板消息和服务通知凭据 |
+| Mobile / WeiXin | `WXAPPManage` | 基础设施缺失 | 依赖新版微信、支付、模板消息和服务通知凭据 |
+| Mobile / WeiXin | `WXAPP_API` | 基础设施缺失 | 依赖新版微信、支付、模板消息和服务通知凭据 |
+| Mobile / WeiXin | `WxConfig` | 基础设施缺失 | 依赖新版微信、支付、模板消息和服务通知凭据 |
+| Mobile / WeiXin | `WXConfig_Submit` | 基础设施缺失 | 依赖新版微信、支付、模板消息和服务通知凭据 |
+| Mobile / WeiXin | `WelPage` | 基础设施缺失 | 依赖新版微信、支付、模板消息和服务通知凭据 |
+| Mobile / WeiXin | `WelPage_Submit` | 基础设施缺失 | 依赖新版微信、支付、模板消息和服务通知凭据 |
+| Mobile / WeiXin | `WxPayConfig` | 基础设施缺失 | 依赖新版微信、支付、模板消息和服务通知凭据 |
+| Mobile / WeiXin | `WxPayConfig_Submit` | 基础设施缺失 | 依赖新版微信、支付、模板消息和服务通知凭据 |
+| Mobile / WeiXin | `WxUserList` | 基础设施缺失 | 依赖新版微信、支付、模板消息和服务通知凭据 |
+| Mobile / WeiXin | `WXUser_API` | 基础设施缺失 | 依赖新版微信、支付、模板消息和服务通知凭据 |
+| Mobile / WeiXin | `EditWxMenu` | 基础设施缺失 | 依赖新版微信、支付、模板消息和服务通知凭据 |
+| Mobile / WeiXin | `PayLog` | 基础设施缺失 | 依赖新版微信、支付、模板消息和服务通知凭据 |
+| Mobile / WeiXin | `API` | 基础设施缺失 | 依赖新版微信、支付、模板消息和服务通知凭据 |
+| Mobile / WeiXin | `MsgTlp` | 基础设施缺失 | 依赖新版微信、支付、模板消息和服务通知凭据 |
+| Mobile / WeiXin | `MsgTlpAdd` | 基础设施缺失 | 依赖新版微信、支付、模板消息和服务通知凭据 |
+| Mobile / WeiXin | `MsgTlpAdd_Submit` | 基础设施缺失 | 依赖新版微信、支付、模板消息和服务通知凭据 |
+| Mobile / WeiXin | `MsgMultiAdd` | 基础设施缺失 | 依赖新版微信、支付、模板消息和服务通知凭据 |
+| Mobile / WeiXin | `MsgMultiAdd_Submit` | 基础设施缺失 | 依赖新版微信、支付、模板消息和服务通知凭据 |
+| Mobile / WeiXin | `MsgSend` | 基础设施缺失 | 依赖新版微信、支付、模板消息和服务通知凭据 |
+| Mobile / WeiXin | `MsgSend_Submit` | 基础设施缺失 | 依赖新版微信、支付、模板消息和服务通知凭据 |
+| Mobile / WeiXin | `MsgPreView` | 基础设施缺失 | 依赖新版微信、支付、模板消息和服务通知凭据 |
+| Mobile / WeiXin | `ReplyList` | 基础设施缺失 | 依赖新版微信、支付、模板消息和服务通知凭据 |
+| Mobile / WeiXin | `Reply_API` | 基础设施缺失 | 依赖新版微信、支付、模板消息和服务通知凭据 |
+| Mobile / WeiXin | `ReplyAdd` | 基础设施缺失 | 依赖新版微信、支付、模板消息和服务通知凭据 |
+| Mobile / WeiXin | `ReplyAdd_Submit` | 基础设施缺失 | 依赖新版微信、支付、模板消息和服务通知凭据 |
+| Mobile / WeiXin | `Config` | 基础设施缺失 | 依赖新版微信、支付、模板消息和服务通知凭据 |
+| Mobile / WeiXin | `Config_Submit` | 基础设施缺失 | 依赖新版微信、支付、模板消息和服务通知凭据 |
+| Mobile / WeiXin | `RedPackCfg` | 基础设施缺失 | 依赖新版微信、支付、模板消息和服务通知凭据 |
+| Mobile / WeiXin | `RedPackCfgAdd` | 基础设施缺失 | 依赖新版微信、支付、模板消息和服务通知凭据 |
+| Mobile / WeiXin | `RedPackCfgAdd_Submit` | 基础设施缺失 | 依赖新版微信、支付、模板消息和服务通知凭据 |
+| Mobile / WeiXin | `RedPackCfg_API` | 基础设施缺失 | 依赖新版微信、支付、模板消息和服务通知凭据 |
+| Mobile / WeiXin | `RedPackLog_Detail` | 基础设施缺失 | 依赖新版微信、支付、模板消息和服务通知凭据 |
+| Mobile / WeiXin | `RedPackLog_API` | 基础设施缺失 | 依赖新版微信、支付、模板消息和服务通知凭据 |
+| Mobile / WeiXin | `Popularize` | 基础设施缺失 | 依赖新版微信、支付、模板消息和服务通知凭据 |
+| Mobile / WeiXin | `Popularize_Submit` | 基础设施缺失 | 依赖新版微信、支付、模板消息和服务通知凭据 |
+| Mobile / WeiXin | `MiniprogramCode` | 基础设施缺失 | 依赖新版微信、支付、模板消息和服务通知凭据 |
+| Mobile / WeiXin | `MiniprogramCode_Submit` | 基础设施缺失 | 依赖新版微信、支付、模板消息和服务通知凭据 |
+| Mobile / WeiXin | `ServiceNotice` | 基础设施缺失 | 依赖新版微信、支付、模板消息和服务通知凭据 |
+| Mobile / WeiXin | `ServiceNoticeSendLog` | 基础设施缺失 | 依赖新版微信、支付、模板消息和服务通知凭据 |
+| Mobile / WeiXin | `ServiceNoticeSendAgian` | 基础设施缺失 | 依赖新版微信、支付、模板消息和服务通知凭据 |
+| Mobile / WeiXin | `ServiceNoticeSend` | 基础设施缺失 | 依赖新版微信、支付、模板消息和服务通知凭据 |
+| Mobile / WeiXin | `ServiceNoticeSend_Submit` | 基础设施缺失 | 依赖新版微信、支付、模板消息和服务通知凭据 |
+| Workload | `Default` | 数据缺失 | 旧逐日工作量统计必须内连接 ZL_Comment;目标仅有 CommonModel,缺少评论主表与 GeneralID 关系 |
+| WritePearl | `Default` | 数据缺失 | 目标缺少 ZL_Write_Copybook 字帖主表及历史数据 |
+| WritePearl | `CopybookAdd` | 数据缺失 | 目标没有可编辑的旧字帖记录 |
+| WritePearl | `CopybookAdd_Submit` | 数据缺失 | 目标缺少字帖名称、内容和备注持久层 |
+| WritePearl | `Copybook_API` | 数据缺失 | 目标没有可删除、启用或停用的字帖记录 |
+| WritePearl | `Manuscripts` | 数据缺失 | 目标缺少 ZL_Write_Manuscripts 文稿主表及状态历史 |
+| WritePearl | `ManuscriptsAdd` | 数据缺失 | 目标没有可编辑的旧文稿记录 |
+| WritePearl | `ManuscriptsAdd_Submit` | 数据缺失 | 目标缺少文稿名称和备注持久层 |
+| WritePearl | `Manuscripts_API` | 数据缺失 | 目标缺少文稿与 ZL_Write_Word 字词子表,不能级联删除或启停 |
+| WritePearl | `UserFiles` | 数据缺失 | 目标缺少 ZL_Write_UserFiles 用户书写文件授权、等级与到期历史 |
+| WritePearl | `UserFiles_API` | 数据缺失 | 目标没有可到期或续期的书写文件授权;账户会员期限语义不等价 |

文件差异内容过多而无法显示
+ 1 - 0
scripts/deploy-admin-functions.mjs


+ 90 - 2
scripts/generate-admin-coverage.mjs

@@ -6,6 +6,7 @@ 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 blockedOutputPath = resolve(root, 'docs/migration/final-blocked-actions.generated.md');
 const checkOnly = process.argv.includes('--check');
 
 const explicit = new Map([
@@ -24,7 +25,34 @@ const explicit = new Map([
   ['User/UserInfo', ['partial', '已提供动态详情、资料编辑、状态、分组和密码重置']],
   ['User/UserInfo_Submit', ['partial', '已覆盖安全字段更新;旧 UserBase 全字段仍待专用映射']],
   ['User/User_API', ['partial', '已覆盖锁定、解锁、移动分组;标注、归属管理员和手机归属地尚未迁移']],
-  ['User/UserExp', ['partial', '现有账本可查询,管理员余额变更表单与事务规则尚未补齐']],
+  ['User/UserExp', ['implemented', 'UserMoneyLog 聚合六类规范化账本,支持类型、用户、日期筛选和只读详情;Angular 页面已提供管理员资金调整入口']],
+  ['User/Output', ['blocked-infrastructure', '旧 xlsx/docx/md 导出依赖 NPOI/WordAdd、客户端提交表格及 SiteConfig 页眉页脚;现有内容 CSV 导出不等价']],
+  ['User/dthelp', ['implemented', '该内部表格助手仅把旧用户 ID 转为用户名;当前 _User 资源直接返回已规范化 username,无需二次 SQL 回填']],
+  ['User/user', ['implemented', '旧内部用户名查找已由帐套隔离的 _User 资源与用户详情返回 username 替代']],
+  ['User/GetMd', ['blocked-infrastructure', '旧方法只是用户 Output 的 Markdown 内部格式器;目标没有对应任意表格提交与下载协议']],
+  ['User/UserOrder', ['blocked-data', '目标缺少 ZL_OrderInfo 与 ZL_CartPro,无法还原指定用户订单和金额统计']],
+  ['User/DelUserPost_Btn_Click', ['blocked-data', 'GuestBar 仅保留只读迁移数据,缺少可证明完整的按用户帖子级联和计数语义']],
+  ['User/UPClient', ['blocked-data', '目标缺少 CRMS_Client 与模型 48 动态附表,无法同步为旧 CRM 客户']],
+  ['User/UserInfo_PlatSubmit', ['partial', 'PlatComp 与 legacyUserPlat 已支持企业成员加入、移动和移出;用户详情中的岗位、姓名、手机专用编辑尚未单独复刻']],
+  ['User/UserBlontoAdmin', ['blocked-data', '目标 Profile/_User 均没有旧 ZL_UserBase.Bugle 归属管理员关系']],
+  ['User/UserBlontoAdmin_Submit', ['blocked-data', '目标缺少 Bugle 字段,不能批量写入旧 AdminID']],
+  ['User/UserLogin', ['blocked-infrastructure', '旧动作要求管理员掌握用户明文口令并写 ASP.NET 登录 Cookie;云函数会话不安全模拟密码代登']],
+  ['User/UserExp_Submit', ['implemented', 'adjustUserBalance 以单个 PostgreSQL 事务锁定用户、写对应六类账本并更新旧余额字段,扣减禁止负数;Angular 资金流水页提供调整表单']],
+  ['User/AdminManage', ['partial', 'Manager 已可从全部数据类安全分页、搜索和查看,密码与二级密码被隐藏;专用筛选布局未完全复刻']],
+  ['User/AdminAdd', ['blocked-infrastructure', '旧 Manager 与当前 Parse _User 管理员会话没有可靠一对一外键,单建 Manager 行不会生成可登录管理员']],
+  ['User/AdminAdd_Submit', ['blocked-infrastructure', '目标缺少 Manager/_User 原子身份绑定、旧 MD5 迁移和二级密码消费链']],
+  ['User/AdminSuperEdit_Submit', ['partial', 'changeOwnPassword 已覆盖超级管理员安全改密、撤销会话和强制重登;旧 RandNumber、默认页及角色表单未复刻']],
+  ['User/Admin_API', ['partial', '_User 批量停用/解锁与会话撤销已实现;Manager 同步删除及旧随机密码邮件审核链明确阻塞']],
+  ['User/PermissionInfo', ['partial', '系统角色页已展示并维护 12 个 ARoleAuth 权限域;旧只读 Razor 权限说明布局未交付']],
+  ['User/SendMailList', ['blocked-data', '目标缺少旧邮件发送队列、投递日志、收件人与状态历史']],
+  ['User/SubscriptListManage', ['blocked-data', '目标缺少旧订阅主表、订阅用户与栏目关系']],
+  ['User/Jobsconfig', ['blocked-infrastructure', '旧页面仅剩未交付 Razor 视图,目标没有可识别任务配置模型或消费者']],
+  ['User/ZoneConfig', ['blocked-infrastructure', '旧页面仅剩未交付 Razor 视图,目标没有对应会员空间配置或消费者']],
+  ['User/WSApi', ['blocked-infrastructure', '目标没有 SiteInfo.APIClose 旧 WebService 总开关及 SOAP/WS 运行时']],
+  ['User/Department', ['blocked-data', '旧页面依赖未迁入的 ZL_Plat_Group 企业部门与成员/管理员关系']],
+  ['User/Department_Submit', ['blocked-data', '目标缺少 Plat_Group 部门树,不能更新 MemberIDS/ManageIDS']],
+  ['User/WSApi_Submit', ['blocked-infrastructure', '云函数不能切换不存在的 SiteInfo.APIClose 或旧 SOAP/WS 宿主']],
+  ['User/UserGraph', ['partial', 'UserPromotion 已还原帐套用户、邀请人和直属推广人数;旧树图交互布局尚未复刻']],
   ['Content/ContentManage', ['partial', '已提供帐套内容列表、搜索、分页、审核和批量操作']],
   ['Content/EditContent', ['partial', '可编辑安全主表字段;模型附表专用表单尚未全部生成']],
   ['Content/Content_Update', ['partial', '可更新安全主表字段;模型附表更新仅覆盖已迁移学习模型']],
@@ -355,6 +383,56 @@ const explicit = new Map([
   ['Label / Vue/Config', ['blocked-infrastructure', '目标没有 SiteOption.VUE_DirCopy 配置及其服务器发布消费者']],
   ['Label / Vue/Config_Submit', ['blocked-infrastructure', '云函数不能更新旧 SiteConfig 或按配置复制服务器目录']],
   ['Workload/Default', ['blocked-data', '旧逐日工作量统计必须内连接 ZL_Comment;目标仅有 CommonModel,缺少评论主表与 GeneralID 关系']],
+  ['Content / VBook/Default', ['blocked-data', '旧入口跳转 H5 电子书列表;目标缺少 ZL_H5_Item/H5Item 主表']],
+  ['Content / VBook/Add', ['blocked-data', '目标没有可编辑或新增的 H5 电子书标题、封面和模板关系']],
+  ['Content / VBook/Add_Submit', ['blocked-data', '目标缺少 ZL_H5_Item 持久层,不能保存标题与 coverImage']],
+  ['Content / VBook/List', ['blocked-data', '目标没有可按标题和模板筛选的 H5 电子书历史数据']],
+  ['Content / VBook/API', ['blocked-data', '目标没有可删除或 SetTemplate 的 H5 电子书及模板关联']],
+  ['Content / VBook/Best', ['blocked-data', '目标没有可更新 isbest 推荐状态的 ZL_H5_Item 记录']],
+  ['Vdesign/Default', ['blocked-data', '目标缺少 ZL_Vdesign;DesignSiteInfo 属于字段和生命周期不同的 ZL_Design_SiteInfo']],
+  ['Vdesign/SiteAdd', ['blocked-data', '目标没有可编辑的 Vdesign 应用名称、评分、状态、所有者和模板关系']],
+  ['Vdesign/SiteAdd_Submit', ['blocked-data', '目标缺少 ZL_Vdesign 与应用变更日志,不能原子保存并记录变更']],
+  ['Vdesign/SiteArticle', ['blocked-data', '目标缺少 ZL_Vdesign_Article 站点—内容绑定表']],
+  ['Vdesign/SiteShop', ['blocked-data', '目标同时缺少 ZL_Vdesign_Shop 绑定表和 ZL_Commodities 商品主表']],
+  ['Vdesign/SiteMessage', ['blocked-data', '目标缺少 ZL_Vdesign_Message 站点留言及审核历史']],
+  ['Vdesign/Site_API', ['blocked-data', '旧站点启停/删除、留言审核及文章/商品解绑依赖四张未迁入表和变更日志']],
+  ['Vdesign/SiteBoard', ['blocked-data', '目标缺少 ZL_VdesignTemplate;DesignTlp 是另一套可视化场景模板']],
+  ['Vdesign/SiteBoardAdd', ['blocked-data', '目标没有可编辑的 Vdesign 模板名称、图片、价格、积分、状态、类型和备注']],
+  ['Vdesign/SiteBoardAdd_Submit', ['blocked-data', '目标缺少 Vdesign 模板持久层,不能错写到 DesignTlp']],
+  ['Vdesign/Board_API', ['blocked-data', '目标没有可删除、审核、启停、推荐或换图的 Vdesign 模板记录']],
+  ['Vdesign/SiteBoardType', ['blocked-data', '目标缺少 ZL_VdesignTemplateType 模板分类树']],
+  ['Vdesign/SiteBoardTypeAdd', ['blocked-data', '目标没有可编辑或新增的 Vdesign 模板分类']],
+  ['Vdesign/SiteBoardTypeAdd_Submit', ['blocked-data', '目标缺少模板分类名称、父级、顺序和备注持久层']],
+  ['Vdesign/BoardType_API', ['blocked-data', '目标没有可列出或递归删除的 Vdesign 模板分类树']],
+  ['Vdesign/SiteChangeLog', ['blocked-data', '目标缺少 ZL_VdesignSiteChangeLog 应用变更历史']],
+  ['Vdesign/SiteChangeLog_API', ['blocked-data', '旧空操作对应的变更日志数据和页面均未迁入,不能伪报完整能力']],
+  ['Vdesign/TemplateBuyLog', ['blocked-data', '目标缺少 ZL_VdesignTemplateBuyLog 模板购买历史及关联']],
+  ['Vdesign/TemplateBuyLog_API', ['blocked-data', '旧空操作对应的购买日志数据和页面均未迁入,不能伪报完整能力']],
+  ['Extend / VDesign/SPage', ['blocked-data', '目标缺少 ZL_SPage_Page 的页面、布局、资源、页脚和数据源标签数据']],
+  ['Extend / VDesign/SPageAdd', ['blocked-data', '目标没有可编辑或新增的 SPage;DesignPage 的结构与生命周期不等价']],
+  ['Extend / VDesign/SPageAdd_Submit', ['blocked-data', '目标缺少 ZL_SPage_Page 持久层']],
+  ['Extend / VDesign/SPage_API', ['blocked-data', '目标没有可复制或删除的 SPage 页面记录']],
+  ['Extend / VDesign/SPageEdit', ['blocked-data', '目标缺少 SPage 的 Layouts、PageRes、PageBottom 与数据源标签']],
+  ['Extend / VDesign/SPageEdit_Submit', ['blocked-data', '目标没有可按旧页面 ID 保存 Layouts 的记录']],
+  ['Extend / VDesign/SPage_AddComponent', ['blocked-infrastructure', '旧组件选择器视图、组件目录和序列化协议未交付']],
+  ['Extend / VDesign/SPage_AddLayout', ['blocked-infrastructure', '旧布局选择器视图、布局定义和序列化协议未交付']],
+  ['Extend / VDesign/SPageDesign', ['blocked-infrastructure', '目标缺少 SPage 数据、B_CreateHtml 标签解析器、编辑器资产和预览运行时']],
+  ['Extend / VDesign/SPageDesign_API', ['blocked-infrastructure', '云函数没有可执行 Base64 数据源标签的 B_CreateHtml 内容上下文']],
+  ['Extend / VDesign/SPageDesign_Nav', ['blocked-infrastructure', '旧导航组件视图与序列化协议未交付']],
+  ['Extend / VDesign/SPageDesign_Label', ['blocked-infrastructure', '旧标签组件依赖未迁入的 Zoomla 标签库与 B_CreateHtml']],
+  ['Extend / VDesign/SPageDesign_Content', ['blocked-infrastructure', '旧内容组件视图及动态模型/栏目绑定协议未交付']],
+  ['Extend / VDesign/SPageDesign_Carousel', ['blocked-infrastructure', '旧轮播组件视图、素材与序列化协议未交付']],
+  ['Extend / VDesign/SPagePreview', ['blocked-infrastructure', '目标缺少 SPage 数据和 B_CreateHtml 标签渲染环境']],
+  ['WritePearl/Default', ['blocked-data', '目标缺少 ZL_Write_Copybook 字帖主表及历史数据']],
+  ['WritePearl/CopybookAdd', ['blocked-data', '目标没有可编辑的旧字帖记录']],
+  ['WritePearl/CopybookAdd_Submit', ['blocked-data', '目标缺少字帖名称、内容和备注持久层']],
+  ['WritePearl/Copybook_API', ['blocked-data', '目标没有可删除、启用或停用的字帖记录']],
+  ['WritePearl/Manuscripts', ['blocked-data', '目标缺少 ZL_Write_Manuscripts 文稿主表及状态历史']],
+  ['WritePearl/ManuscriptsAdd', ['blocked-data', '目标没有可编辑的旧文稿记录']],
+  ['WritePearl/ManuscriptsAdd_Submit', ['blocked-data', '目标缺少文稿名称和备注持久层']],
+  ['WritePearl/Manuscripts_API', ['blocked-data', '目标缺少文稿与 ZL_Write_Word 字词子表,不能级联删除或启停']],
+  ['WritePearl/UserFiles', ['blocked-data', '目标缺少 ZL_Write_UserFiles 用户书写文件授权、等级与到期历史']],
+  ['WritePearl/UserFiles_API', ['blocked-data', '目标没有可到期或续期的书写文件授权;账户会员期限语义不等价']],
   ['Extend / Safe/Default', ['blocked-infrastructure', '旧默认入口只跳转 SiteSwitch;目标没有静态 Angular 站点的安全开关控制面']],
   ['Extend / Safe/API', ['blocked-infrastructure', '旧聚合 API 依赖缺失 Safe_IP、服务器站点检查局部页和 ContentWordHelper 常驻线程']],
   ['Extend / Safe/SiteSwitch', ['blocked-infrastructure', '目标没有站点上下线状态、下线页文件或前端发布开关']],
@@ -728,12 +806,22 @@ const generated = `// Generated by scripts/generate-admin-coverage.mjs. Do not e
   `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`;
+const blockedEntries = entries.filter((entry) => entry.status === 'blocked-data' || entry.status === 'blocked-infrastructure');
+const blockedCounts = blockedEntries.reduce((counts, entry) => ({ ...counts, [entry.status]: (counts[entry.status] || 0) + 1 }), {});
+const escapeCell = (value) => String(value).replace(/\|/g, '\\|').replace(/\r?\n/g, '<br>');
+const blockedGenerated = `<!-- Generated by scripts/generate-admin-coverage.mjs. Do not edit by hand. -->\n# 最终无法等价迁移动作清单\n\n` +
+  `本清单来自 1,042 项旧后台动作逐项核验结果。共 ${blockedEntries.length} 项明确阻塞:数据缺失 ${blockedCounts['blocked-data'] || 0} 项,基础设施缺失 ${blockedCounts['blocked-infrastructure'] || 0} 项。其余动作状态请查看 Angular 后台“迁移状态”页。\n\n` +
+  `| 模块 | Action | 阻塞类型 | 原因 |\n|---|---|---|---|\n` +
+  blockedEntries.map((entry) => `| ${escapeCell(entry.module)} | \`${escapeCell(entry.action)}\`${entry.occurrence > 1 ? ` #${entry.occurrence}` : ''} | ${entry.status === 'blocked-data' ? '数据缺失' : '基础设施缺失'} | ${escapeCell(entry.reason)} |`).join('\n') + '\n';
 
 if (checkOnly) {
   const current = readFileSync(outputPath, 'utf8');
   if (current !== generated) throw new Error('后台迁移覆盖台账已过期,请运行 npm run admin-coverage:generate');
+  const blockedCurrent = readFileSync(blockedOutputPath, 'utf8');
+  if (blockedCurrent !== blockedGenerated) 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.`);
+  writeFileSync(blockedOutputPath, blockedGenerated);
+  console.log(`Generated ${outputPath}: ${entries.length} actions; ${blockedOutputPath}: ${blockedEntries.length} blockers.`);
 }

+ 14 - 2
scripts/smoke-admin-functions.mjs

@@ -133,6 +133,7 @@ let temporaryPageStyleId = '';
 let temporaryPlatformCompanyId = '';
 let temporaryPlatformMemberId = '';
 const temporaryLessonIds = [];
+const temporaryBalanceLogs = [];
 try {
   const sample = await jsonRequest(`${PARSE_URL}/classes/Company?limit=1&keys=objectId`, {}, true);
   const companyId = sample.results?.[0]?.objectId;
@@ -389,7 +390,9 @@ try {
   const userLevelCreateBlocked = await callFunctionError('xiaoshu/admin/gateway', login.sessionToken, { operation: 'saveUserLevel', className: 'UserLevel', fields: {} }, 501); if (!String(userLevelCreateBlocked.message).includes('UserLevel.id')) throw new Error('积分等级新增未返回旧 ID 阻塞原因'); userLevelRestore = { objectId: sampleUserLevel.objectId, fields: { alias: sampleUserLevel.alias, pointRate: Number(sampleUserLevel.pointRate || 0), image: sampleUserLevel.image, remark: sampleUserLevel.remark } }; const levelProbeRemark = `${String(sampleUserLevel.remark || '')} [angular-smoke]`.trim(); const savedUserLevel = await callFunction('xiaoshu/admin/gateway', login.sessionToken, { operation: 'saveUserLevel', className: 'UserLevel', objectId: sampleUserLevel.objectId, fields: { ...sampleUserLevel, pointRate: Number(sampleUserLevel.pointRate || 0), remark: levelProbeRemark } }); if (savedUserLevel.remark !== levelProbeRemark || Number(savedUserLevel.id) !== Number(sampleUserLevel.id)) throw new Error('积分等级专用编辑失败'); await jsonRequest(`${PARSE_URL}/classes/UserLevel/${userLevelRestore.objectId}`, { method: 'PUT', body: JSON.stringify(userLevelRestore.fields) }, true); userLevelRestore = null;
   const directUserLevel = await jsonRequest(`${PARSE_URL}/classes/UserLevel`, { method: 'POST', body: JSON.stringify({ alias: '__user_level_delete_smoke__', pointRate: 999999, image: '', remark: 'temporary', sourceKey: `smoke-user-level-${Date.now()}`, company }) }, true); temporaryUserLevelId = directUserLevel.objectId; const readDirectUserLevel = await jsonRequest(`${PARSE_URL}/classes/UserLevel/${temporaryUserLevelId}`, {}, true); if (readDirectUserLevel.id != null) throw new Error('积分等级省略 id 的创建探测意外生成了旧编号'); const deletedUserLevel = await callFunction('xiaoshu/admin/gateway', login.sessionToken, { operation: 'userLevelBatch', className: 'UserLevel', action: 'delete', objectIds: [temporaryUserLevelId] }); if (deletedUserLevel.updated !== 1) throw new Error('积分等级批量删除失败'); temporaryUserLevelId = '';
   const userMoneySchema = await callFunction('xiaoshu/admin/gateway', login.sessionToken, { operation: 'schema', className: 'UserMoneyLog' }); if (userMoneySchema.writable !== false || userMoneySchema.creatable !== false || userMoneySchema.fields?.some((field) => field.writable)) throw new Error('资金积分流水虚拟 Schema 应全部只读'); const moneyPage = await callFunction('xiaoshu/admin/gateway', login.sessionToken, { operation: 'userMoneyLogs', className: 'UserMoneyLog', type: 1, page: 1, pageSize: 20, search: '', startDate: '', endDate: '' }); const sampleMoneyLog = moneyPage.results?.[0]; if (moneyPage.total < 1 || !String(sampleMoneyLog?.objectId || '').startsWith('UserExpDomP:') || sampleMoneyLog.moneyTypeLabel !== '余额') throw new Error('余额流水规范化聚合异常'); const moneyDetail = await callFunction('xiaoshu/admin/gateway', login.sessionToken, { operation: 'getUserMoneyLog', className: 'UserMoneyLog', objectId: sampleMoneyLog.objectId }); if (moneyDetail.objectId !== sampleMoneyLog.objectId || moneyDetail.recordObjectId !== sampleMoneyLog.recordObjectId) throw new Error('资金流水详情读取异常'); const moneyDate = String(sampleMoneyLog.hisTime?.iso || sampleMoneyLog.hisTime || '').slice(0,10); const filteredMoney = await callFunction('xiaoshu/admin/gateway', login.sessionToken, { operation: 'userMoneyLogs', className: 'UserMoneyLog', type: 1, page: 1, pageSize: 20, search: String(sampleMoneyLog.userId || ''), startDate: moneyDate, endDate: moneyDate }); if (filteredMoney.total < 1) throw new Error('资金流水用户/日期筛选失败'); for (const type of [2,3,4,5,6]) { const ledger = await callFunction('xiaoshu/admin/gateway', login.sessionToken, { operation: 'userMoneyLogs', className: 'UserMoneyLog', type, page: 1, pageSize: 1, search: '', startDate: '', endDate: '' }); if (ledger.className !== 'UserMoneyLog') throw new Error(`资金流水类型 ${type} 未正确路由`); }
+  const balanceAdded = await callFunction('xiaoshu/admin/gateway', login.sessionToken, { operation: 'adjustUserBalance', userId: memberLegacyId, type: 4, amount: 1.25, direction: 'add', detail: '冒烟调整后回滚' }); temporaryBalanceLogs.push({ className: balanceAdded.ledgerClass, objectId: balanceAdded.recordObjectId }); if (Number(balanceAdded.score) !== 1.25 || Number(balanceAdded.balanceAfter) !== Number(balanceAdded.scoreBefore) + 1.25) throw new Error('管理员增加用户积分事务异常'); const balanceDeducted = await callFunction('xiaoshu/admin/gateway', login.sessionToken, { operation: 'adjustUserBalance', userId: memberLegacyId, type: 4, amount: 1.25, direction: 'deduct', detail: '冒烟调整回滚' }); temporaryBalanceLogs.push({ className: balanceDeducted.ledgerClass, objectId: balanceDeducted.recordObjectId }); if (Number(balanceDeducted.score) !== -1.25 || Number(balanceDeducted.balanceAfter) !== Number(balanceAdded.scoreBefore)) throw new Error('管理员扣减用户积分或余额恢复异常');
   for (const action of ['ThirdInfo','ThirdInfo_Submit','SigninList','RealNameAuth','RealNameAuthAdd','RealNameAuth_API']) { const blocked = await callFunctionError('xiaoshu/admin/gateway', login.sessionToken, { operation: 'legacyUserAddonBlocker', action }, 501); if (!String(blocked.message).startsWith('migration_blocked:')) throw new Error(`旧用户附加动作 ${action} 未返回明确阻塞原因`); }
+  for (const action of ['Output','GetMd','UserOrder','DelUserPost_Btn_Click','UPClient','UserBlontoAdmin','UserBlontoAdmin_Submit','UserLogin','AdminAdd','AdminAdd_Submit','Admin_API','SendMailList','SubscriptListManage','Jobsconfig','ZoneConfig','WSApi','Department','Department_Submit','WSApi_Submit']) { const blocked = await callFunctionError('xiaoshu/admin/gateway', login.sessionToken, { operation: 'legacyUserRemainderBlocker', action }, 501); if (!String(blocked.message).startsWith('migration_blocked:')) throw new Error(`旧用户剩余动作 ${action} 未返回明确阻塞原因`); }
   for (const action of ['Default','AskInfo','AskAdd','AskAdd_Submit','Ask_API','AnswerList','AnswerAdd','AnswerAdd_Submit','Answer_API','Config','Config_Submit']) { const blocked = await callFunctionError('xiaoshu/admin/gateway', login.sessionToken, { operation: 'legacyAskBlocker', action }, 501); if (!String(blocked.message).startsWith('migration_blocked:')) throw new Error(`旧问答动作 ${action} 未返回明确阻塞原因`); }
   for (const action of ['Default','BiaoDetail','Biao_API','UserFiles','UserFiles_API']) { const blocked = await callFunctionError('xiaoshu/admin/gateway', login.sessionToken, { operation: 'legacyBiaoCalcBlocker', action }, 501); if (!String(blocked.message).startsWith('migration_blocked:')) throw new Error(`旧裱件计算动作 ${action} 未返回明确阻塞原因`); }
   const officeChartBlocked = await callFunctionError('xiaoshu/admin/gateway', login.sessionToken, { operation: 'legacyOfficeChartBlocker', action: 'Index' }, 501); if (!String(officeChartBlocked.message).includes('Index.cshtml')) throw new Error('旧 Office 图表页未返回缺失视图阻塞原因');
@@ -753,6 +756,10 @@ try {
   for (const action of ['Default','StructList','order','order_submit','Struct_API','StructByTree','Struct_ListByTree','StructAdd','StructAdd_Submit','StructMember','Structure_update','Structure_Merge','Structure_Move','Structure_List']) { const blocked = await callFunctionError('xiaoshu/admin/gateway', login.sessionToken, { operation: 'legacyStructureBlocker', action }, 501); if (!String(blocked.message).includes('migration_blocked')) throw new Error(`旧组织架构动作 ${action} 未返回明确迁移阻塞`); }
   for (const action of ['Index','TlpView','VUE_API','Config','Config_Submit']) { const blocked = await callFunctionError('xiaoshu/admin/gateway', login.sessionToken, { operation: 'legacyVueBlocker', action }, 501); if (!String(blocked.message).includes('migration_blocked')) throw new Error(`旧 Vue 模板动作 ${action} 未返回明确迁移阻塞`); }
   for (const action of ['Default']) { const blocked = await callFunctionError('xiaoshu/admin/gateway', login.sessionToken, { operation: 'legacyWorkloadBlocker', action }, 501); if (!String(blocked.message).includes('migration_blocked')) throw new Error(`旧工作量统计动作 ${action} 未返回明确迁移阻塞`); }
+  for (const action of ['Default','Add','Add_Submit','List','API','Best']) { const blocked = await callFunctionError('xiaoshu/admin/gateway', login.sessionToken, { operation: 'legacyVBookBlocker', action }, 501); if (!String(blocked.message).includes('migration_blocked')) throw new Error(`旧 H5 电子书动作 ${action} 未返回明确迁移阻塞`); }
+  for (const action of ['Default','SiteAdd','SiteAdd_Submit','SiteArticle','SiteShop','SiteMessage','Site_API','SiteBoard','SiteBoardAdd','SiteBoardAdd_Submit','Board_API','SiteBoardType','SiteBoardTypeAdd','SiteBoardTypeAdd_Submit','BoardType_API','SiteChangeLog','SiteChangeLog_API','TemplateBuyLog','TemplateBuyLog_API']) { const blocked = await callFunctionError('xiaoshu/admin/gateway', login.sessionToken, { operation: 'legacyVdesignBlocker', action }, 501); if (!String(blocked.message).includes('migration_blocked')) throw new Error(`旧 Vdesign 动作 ${action} 未返回明确迁移阻塞`); }
+  for (const action of ['SPage','SPageAdd','SPageAdd_Submit','SPage_API','SPageEdit','SPageEdit_Submit','SPage_AddComponent','SPage_AddLayout','SPageDesign','SPageDesign_API','SPageDesign_Nav','SPageDesign_Label','SPageDesign_Content','SPageDesign_Carousel','SPagePreview']) { const blocked = await callFunctionError('xiaoshu/admin/gateway', login.sessionToken, { operation: 'legacySPageBlocker', action }, 501); if (!String(blocked.message).includes('migration_blocked')) throw new Error(`旧 SPage 动作 ${action} 未返回明确迁移阻塞`); }
+  for (const action of ['Default','CopybookAdd','CopybookAdd_Submit','Copybook_API','Manuscripts','ManuscriptsAdd','ManuscriptsAdd_Submit','Manuscripts_API','UserFiles','UserFiles_API']) { const blocked = await callFunctionError('xiaoshu/admin/gateway', login.sessionToken, { operation: 'legacyWritePearlBlocker', action }, 501); if (!String(blocked.message).includes('migration_blocked')) throw new Error(`旧书法珍珠动作 ${action} 未返回明确迁移阻塞`); }
   for (const action of ['TxtLog','TxtLogContent','TxtLog_Down','TaskList','TaskAdd','TaskAdd_API','TaskAdd_Submit','Task_API','TaskCenter']) {
     const blocked = await callFunctionError('xiaoshu/admin/gateway', login.sessionToken, { operation: 'legacyLogBlocker', action }, 501); if (!String(blocked.message).includes('migration_blocked')) throw new Error(`旧日志任务动作 ${action} 未返回明确迁移阻塞`);
   }
@@ -916,7 +923,8 @@ try {
   const purseHistory = await callLegacyFunction(memberLogin.sessionToken, { action: 'user_point_list', uid: memberLegacyId, stype: 1, cpage: 1, psize: 10 });
   if (purseHistory.page?.itemCount !== 1 || Number(purseHistory.result?.[0]?.score) !== -1 || !purseHistory.result?.[0]?.ExpHisID || purseHistory.result?.[0]?.Detail === undefined || purseHistory.addon?.purseFeeRuleUnavailable !== true) throw new Error(`余额账本读取异常:${JSON.stringify(purseHistory)}`);
   const couponHistory = await callLegacyFunction(memberLogin.sessionToken, { action: 'user_point_list', uid: memberLegacyId, stype: 4, cpage: 1, psize: 10 });
-  if (couponHistory.page?.itemCount !== 1 || Number(couponHistory.result?.[0]?.score) !== -0.5 || !couponHistory.result?.[0]?.HisTime) throw new Error(`点券账本读取异常:${JSON.stringify(couponHistory)}`);
+  const couponOrderEntry = couponHistory.result?.find((entry) => entry.sourceKey === `cloud:e_order_update:${temporaryAppointmentId}:point`);
+  if (couponHistory.page?.itemCount < 1 || Number(couponOrderEntry?.score) !== -0.5 || !couponOrderEntry?.HisTime) throw new Error(`点券账本读取异常:${JSON.stringify(couponHistory)}`);
   await callLegacyFunction(memberLogin.sessionToken, { action: 'user_point_list', uid: memberLegacyId, stype: 7 }, 400);
   await callLegacyFunction(coachLogin.sessionToken, { action: 'e_order_update_v2', uid: coachLegacyId, status: 20, content: orderContent }, 403);
   await callLegacyFunction(memberLogin.sessionToken, { action: 'e_order_update_v2', uid: memberLegacyId, status: 20, content: orderContent });
@@ -953,7 +961,7 @@ try {
   const revokedPayload = await revokedResponse.json().catch(() => ({}));
   if (revokedResponse.status !== 401 || !String(revokedPayload.message || revokedPayload.error || '').toLowerCase().includes('sessiontoken')) throw new Error(`已退出管理员会话仍可使用: ${revokedResponse.status}`);
 
-  console.log('Cloud smoke passed: admin auth/logout/tenant/account lifecycle/group sync/node/special/guest-category/bar/exam-class/exam-point/knowledge/exam-teacher/dictionary/grade-dictionary/currency/holiday/search-navigation/advertising/font-shapes/design-scenes/design-templates/surveys/customer-service/stores/content-tags/shop-vendor-blockers/user-level/money-ledgers/user-addon-blockers/ask-blockers/biao-calc-blockers/office-chart-blocker/chat-blockers/design-class-blockers/structure-blockers/vue-blockers/workload-blocker/com-blockers/common-blockers/site-config-blockers/baike/api-catalog/config-blockers/model/guestbook lifecycle/content workflow/CRUD reads, CMS projections, normalized learning joins, app action coverage, public content, session scope, explicit blocked APIs.');
+  console.log('Cloud smoke passed: admin auth/logout/tenant/account lifecycle/group sync/node/special/guest-category/bar/exam-class/exam-point/knowledge/exam-teacher/dictionary/grade-dictionary/currency/holiday/search-navigation/advertising/font-shapes/design-scenes/design-templates/surveys/customer-service/stores/content-tags/shop-vendor-blockers/user-level/money-ledgers/balance-adjustment/user-blockers/user-addon-blockers/ask-blockers/biao-calc-blockers/office-chart-blocker/chat-blockers/design-class-blockers/structure-blockers/vue-blockers/workload/vbook/vdesign/spage/write-pearl blockers/com-blockers/common-blockers/site-config-blockers/baike/api-catalog/config-blockers/model/guestbook lifecycle/content workflow/CRUD reads, CMS projections, normalized learning joins, app action coverage, public content, session scope, 1,042-action coverage with zero pending items.');
 } finally {
   if (adZoneRestore) await jsonRequest(`${PARSE_URL}/classes/AdZone/${adZoneRestore.objectId}`, { method: 'PUT', body: JSON.stringify({ remind: adZoneRestore.remind, zstatus: adZoneRestore.zstatus }) }, true).catch((error) => { console.error(`广告位冒烟数据恢复失败:${error.message}`); process.exitCode = 1; });
   if (adInfoRestore) await jsonRequest(`${PARSE_URL}/classes/AdInfo/${adInfoRestore.objectId}`, { method: 'PUT', body: JSON.stringify({ remind: adInfoRestore.remind, zstatus: adInfoRestore.zstatus }) }, true).catch((error) => { console.error(`广告内容冒烟数据恢复失败:${error.message}`); process.exitCode = 1; });
@@ -1126,6 +1134,10 @@ try {
       process.exitCode = 1;
     });
   }
+  for (const item of temporaryBalanceLogs) if (item.className && item.objectId) await jsonRequest(`${PARSE_URL}/classes/${item.className}/${item.objectId}`, { method: 'DELETE' }, true).catch((error) => {
+    console.error(`临时资金调整流水清理失败:${error.message}`);
+    process.exitCode = 1;
+  });
   if (memberId) {
     await jsonRequest(`${PARSE_URL}/users/${memberId}`, { method: 'DELETE' }, true).catch((error) => {
       console.error(`临时普通用户清理失败:${error.message}`);

+ 8 - 0
src/app/admin/legacy-admin-coverage.generated.spec.ts

@@ -155,5 +155,13 @@ describe('legacy admin coverage inventory', () => {
     expect(byKey.get('Order/OrderList')?.status).toBe('blocked-data');
     expect(byKey.get('Label / PowerShell/RunScript')?.status).toBe('blocked-infrastructure');
     expect(byKey.get('Exam/Papers_System_Manage')?.status).toBe('partial');
+    expect(byKey.get('User/UserExp_Submit')?.status).toBe('implemented');
+    expect(byKey.get('User/UserOrder')?.status).toBe('blocked-data');
+    expect(byKey.get('User/WSApi_Submit')?.status).toBe('blocked-infrastructure');
+    expect(byKey.get('Content / VBook/List')?.status).toBe('blocked-data');
+    expect(byKey.get('Vdesign/Site_API')?.status).toBe('blocked-data');
+    expect(byKey.get('Extend / VDesign/SPageDesign')?.status).toBe('blocked-infrastructure');
+    expect(byKey.get('WritePearl/UserFiles_API')?.status).toBe('blocked-data');
+    expect(LEGACY_ADMIN_COVERAGE.some((entry) => entry.status === 'pending')).toBeFalse();
   });
 });

+ 156 - 156
src/app/admin/legacy-admin-coverage.generated.ts

@@ -6348,29 +6348,29 @@ export const LEGACY_ADMIN_COVERAGE: readonly LegacyAdminCoverageEntry[] = [
     "module": "User",
     "action": "Output",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-infrastructure",
+    "reason": "旧 xlsx/docx/md 导出依赖 NPOI/WordAdd、客户端提交表格及 SiteConfig 页眉页脚;现有内容 CSV 导出不等价"
   },
   {
     "module": "User",
     "action": "dthelp",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "implemented",
+    "reason": "该内部表格助手仅把旧用户 ID 转为用户名;当前 _User 资源直接返回已规范化 username,无需二次 SQL 回填"
   },
   {
     "module": "User",
     "action": "user",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "implemented",
+    "reason": "旧内部用户名查找已由帐套隔离的 _User 资源与用户详情返回 username 替代"
   },
   {
     "module": "User",
     "action": "GetMd",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-infrastructure",
+    "reason": "旧方法只是用户 Output 的 Markdown 内部格式器;目标没有对应任意表格提交与下载协议"
   },
   {
     "module": "User",
@@ -6397,22 +6397,22 @@ export const LEGACY_ADMIN_COVERAGE: readonly LegacyAdminCoverageEntry[] = [
     "module": "User",
     "action": "UserOrder",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "目标缺少 ZL_OrderInfo 与 ZL_CartPro,无法还原指定用户订单和金额统计"
   },
   {
     "module": "User",
     "action": "DelUserPost_Btn_Click",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "GuestBar 仅保留只读迁移数据,缺少可证明完整的按用户帖子级联和计数语义"
   },
   {
     "module": "User",
     "action": "UPClient",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "目标缺少 CRMS_Client 与模型 48 动态附表,无法同步为旧 CRM 客户"
   },
   {
     "module": "User",
@@ -6425,22 +6425,22 @@ export const LEGACY_ADMIN_COVERAGE: readonly LegacyAdminCoverageEntry[] = [
     "module": "User",
     "action": "UserInfo_PlatSubmit",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "partial",
+    "reason": "PlatComp 与 legacyUserPlat 已支持企业成员加入、移动和移出;用户详情中的岗位、姓名、手机专用编辑尚未单独复刻"
   },
   {
     "module": "User",
     "action": "UserBlontoAdmin",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "目标 Profile/_User 均没有旧 ZL_UserBase.Bugle 归属管理员关系"
   },
   {
     "module": "User",
     "action": "UserBlontoAdmin_Submit",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "目标缺少 Bugle 字段,不能批量写入旧 AdminID"
   },
   {
     "module": "User",
@@ -6453,57 +6453,57 @@ export const LEGACY_ADMIN_COVERAGE: readonly LegacyAdminCoverageEntry[] = [
     "module": "User",
     "action": "UserLogin",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-infrastructure",
+    "reason": "旧动作要求管理员掌握用户明文口令并写 ASP.NET 登录 Cookie;云函数会话不安全模拟密码代登"
   },
   {
     "module": "User",
     "action": "UserExp",
     "occurrence": 1,
-    "status": "partial",
-    "reason": "现有账本可查询,管理员余额变更表单与事务规则尚未补齐"
+    "status": "implemented",
+    "reason": "UserMoneyLog 聚合六类规范化账本,支持类型、用户、日期筛选和只读详情;Angular 页面已提供管理员资金调整入口"
   },
   {
     "module": "User",
     "action": "UserExp_Submit",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "implemented",
+    "reason": "adjustUserBalance 以单个 PostgreSQL 事务锁定用户、写对应六类账本并更新旧余额字段,扣减禁止负数;Angular 资金流水页提供调整表单"
   },
   {
     "module": "User",
     "action": "AdminManage",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "partial",
+    "reason": "Manager 已可从全部数据类安全分页、搜索和查看,密码与二级密码被隐藏;专用筛选布局未完全复刻"
   },
   {
     "module": "User",
     "action": "AdminAdd",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-infrastructure",
+    "reason": "旧 Manager 与当前 Parse _User 管理员会话没有可靠一对一外键,单建 Manager 行不会生成可登录管理员"
   },
   {
     "module": "User",
     "action": "AdminAdd_Submit",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-infrastructure",
+    "reason": "目标缺少 Manager/_User 原子身份绑定、旧 MD5 迁移和二级密码消费链"
   },
   {
     "module": "User",
     "action": "AdminSuperEdit_Submit",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "partial",
+    "reason": "changeOwnPassword 已覆盖超级管理员安全改密、撤销会话和强制重登;旧 RandNumber、默认页及角色表单未复刻"
   },
   {
     "module": "User",
     "action": "Admin_API",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "partial",
+    "reason": "_User 批量停用/解锁与会话撤销已实现;Manager 同步删除及旧随机密码邮件审核链明确阻塞"
   },
   {
     "module": "User",
@@ -6537,351 +6537,351 @@ export const LEGACY_ADMIN_COVERAGE: readonly LegacyAdminCoverageEntry[] = [
     "module": "User",
     "action": "PermissionInfo",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "partial",
+    "reason": "系统角色页已展示并维护 12 个 ARoleAuth 权限域;旧只读 Razor 权限说明布局未交付"
   },
   {
     "module": "User",
     "action": "SendMailList",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "目标缺少旧邮件发送队列、投递日志、收件人与状态历史"
   },
   {
     "module": "User",
     "action": "SubscriptListManage",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "目标缺少旧订阅主表、订阅用户与栏目关系"
   },
   {
     "module": "User",
     "action": "Jobsconfig",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-infrastructure",
+    "reason": "旧页面仅剩未交付 Razor 视图,目标没有可识别任务配置模型或消费者"
   },
   {
     "module": "User",
     "action": "ZoneConfig",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-infrastructure",
+    "reason": "旧页面仅剩未交付 Razor 视图,目标没有对应会员空间配置或消费者"
   },
   {
     "module": "User",
     "action": "WSApi",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-infrastructure",
+    "reason": "目标没有 SiteInfo.APIClose 旧 WebService 总开关及 SOAP/WS 运行时"
   },
   {
     "module": "User",
     "action": "Department",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "旧页面依赖未迁入的 ZL_Plat_Group 企业部门与成员/管理员关系"
   },
   {
     "module": "User",
     "action": "Department_Submit",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "目标缺少 Plat_Group 部门树,不能更新 MemberIDS/ManageIDS"
   },
   {
     "module": "User",
     "action": "WSApi_Submit",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-infrastructure",
+    "reason": "云函数不能切换不存在的 SiteInfo.APIClose 或旧 SOAP/WS 宿主"
   },
   {
     "module": "User",
     "action": "UserGraph",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "partial",
+    "reason": "UserPromotion 已还原帐套用户、邀请人和直属推广人数;旧树图交互布局尚未复刻"
   },
   {
     "module": "Content / VBook",
     "action": "Default",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "旧入口跳转 H5 电子书列表;目标缺少 ZL_H5_Item/H5Item 主表"
   },
   {
     "module": "Content / VBook",
     "action": "Add",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "目标没有可编辑或新增的 H5 电子书标题、封面和模板关系"
   },
   {
     "module": "Content / VBook",
     "action": "Add_Submit",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "目标缺少 ZL_H5_Item 持久层,不能保存标题与 coverImage"
   },
   {
     "module": "Content / VBook",
     "action": "List",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "目标没有可按标题和模板筛选的 H5 电子书历史数据"
   },
   {
     "module": "Content / VBook",
     "action": "API",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "目标没有可删除或 SetTemplate 的 H5 电子书及模板关联"
   },
   {
     "module": "Content / VBook",
     "action": "Best",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "目标没有可更新 isbest 推荐状态的 ZL_H5_Item 记录"
   },
   {
     "module": "Vdesign",
     "action": "Default",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "目标缺少 ZL_Vdesign;DesignSiteInfo 属于字段和生命周期不同的 ZL_Design_SiteInfo"
   },
   {
     "module": "Vdesign",
     "action": "SiteAdd",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "目标没有可编辑的 Vdesign 应用名称、评分、状态、所有者和模板关系"
   },
   {
     "module": "Vdesign",
     "action": "SiteAdd_Submit",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "目标缺少 ZL_Vdesign 与应用变更日志,不能原子保存并记录变更"
   },
   {
     "module": "Vdesign",
     "action": "SiteArticle",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "目标缺少 ZL_Vdesign_Article 站点—内容绑定表"
   },
   {
     "module": "Vdesign",
     "action": "SiteShop",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "目标同时缺少 ZL_Vdesign_Shop 绑定表和 ZL_Commodities 商品主表"
   },
   {
     "module": "Vdesign",
     "action": "SiteMessage",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "目标缺少 ZL_Vdesign_Message 站点留言及审核历史"
   },
   {
     "module": "Vdesign",
     "action": "Site_API",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "旧站点启停/删除、留言审核及文章/商品解绑依赖四张未迁入表和变更日志"
   },
   {
     "module": "Vdesign",
     "action": "SiteBoard",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "目标缺少 ZL_VdesignTemplate;DesignTlp 是另一套可视化场景模板"
   },
   {
     "module": "Vdesign",
     "action": "SiteBoardAdd",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "目标没有可编辑的 Vdesign 模板名称、图片、价格、积分、状态、类型和备注"
   },
   {
     "module": "Vdesign",
     "action": "SiteBoardAdd_Submit",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "目标缺少 Vdesign 模板持久层,不能错写到 DesignTlp"
   },
   {
     "module": "Vdesign",
     "action": "Board_API",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "目标没有可删除、审核、启停、推荐或换图的 Vdesign 模板记录"
   },
   {
     "module": "Vdesign",
     "action": "SiteBoardType",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "目标缺少 ZL_VdesignTemplateType 模板分类树"
   },
   {
     "module": "Vdesign",
     "action": "SiteBoardTypeAdd",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "目标没有可编辑或新增的 Vdesign 模板分类"
   },
   {
     "module": "Vdesign",
     "action": "SiteBoardTypeAdd_Submit",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "目标缺少模板分类名称、父级、顺序和备注持久层"
   },
   {
     "module": "Vdesign",
     "action": "BoardType_API",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "目标没有可列出或递归删除的 Vdesign 模板分类树"
   },
   {
     "module": "Vdesign",
     "action": "SiteChangeLog",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "目标缺少 ZL_VdesignSiteChangeLog 应用变更历史"
   },
   {
     "module": "Vdesign",
     "action": "SiteChangeLog_API",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "旧空操作对应的变更日志数据和页面均未迁入,不能伪报完整能力"
   },
   {
     "module": "Vdesign",
     "action": "TemplateBuyLog",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "目标缺少 ZL_VdesignTemplateBuyLog 模板购买历史及关联"
   },
   {
     "module": "Vdesign",
     "action": "TemplateBuyLog_API",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "旧空操作对应的购买日志数据和页面均未迁入,不能伪报完整能力"
   },
   {
     "module": "Extend / VDesign",
     "action": "SPage",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "目标缺少 ZL_SPage_Page 的页面、布局、资源、页脚和数据源标签数据"
   },
   {
     "module": "Extend / VDesign",
     "action": "SPageAdd",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "目标没有可编辑或新增的 SPage;DesignPage 的结构与生命周期不等价"
   },
   {
     "module": "Extend / VDesign",
     "action": "SPageAdd_Submit",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "目标缺少 ZL_SPage_Page 持久层"
   },
   {
     "module": "Extend / VDesign",
     "action": "SPage_API",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "目标没有可复制或删除的 SPage 页面记录"
   },
   {
     "module": "Extend / VDesign",
     "action": "SPageEdit",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "目标缺少 SPage 的 Layouts、PageRes、PageBottom 与数据源标签"
   },
   {
     "module": "Extend / VDesign",
     "action": "SPageEdit_Submit",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "目标没有可按旧页面 ID 保存 Layouts 的记录"
   },
   {
     "module": "Extend / VDesign",
     "action": "SPage_AddComponent",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-infrastructure",
+    "reason": "旧组件选择器视图、组件目录和序列化协议未交付"
   },
   {
     "module": "Extend / VDesign",
     "action": "SPage_AddLayout",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-infrastructure",
+    "reason": "旧布局选择器视图、布局定义和序列化协议未交付"
   },
   {
     "module": "Extend / VDesign",
     "action": "SPageDesign",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-infrastructure",
+    "reason": "目标缺少 SPage 数据、B_CreateHtml 标签解析器、编辑器资产和预览运行时"
   },
   {
     "module": "Extend / VDesign",
     "action": "SPageDesign_API",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-infrastructure",
+    "reason": "云函数没有可执行 Base64 数据源标签的 B_CreateHtml 内容上下文"
   },
   {
     "module": "Extend / VDesign",
     "action": "SPageDesign_Nav",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-infrastructure",
+    "reason": "旧导航组件视图与序列化协议未交付"
   },
   {
     "module": "Extend / VDesign",
     "action": "SPageDesign_Label",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-infrastructure",
+    "reason": "旧标签组件依赖未迁入的 Zoomla 标签库与 B_CreateHtml"
   },
   {
     "module": "Extend / VDesign",
     "action": "SPageDesign_Content",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-infrastructure",
+    "reason": "旧内容组件视图及动态模型/栏目绑定协议未交付"
   },
   {
     "module": "Extend / VDesign",
     "action": "SPageDesign_Carousel",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-infrastructure",
+    "reason": "旧轮播组件视图、素材与序列化协议未交付"
   },
   {
     "module": "Extend / VDesign",
     "action": "SPagePreview",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-infrastructure",
+    "reason": "目标缺少 SPage 数据和 B_CreateHtml 标签渲染环境"
   },
   {
     "module": "Label / Vue",
@@ -7230,70 +7230,70 @@ export const LEGACY_ADMIN_COVERAGE: readonly LegacyAdminCoverageEntry[] = [
     "module": "WritePearl",
     "action": "Default",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "目标缺少 ZL_Write_Copybook 字帖主表及历史数据"
   },
   {
     "module": "WritePearl",
     "action": "CopybookAdd",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "目标没有可编辑的旧字帖记录"
   },
   {
     "module": "WritePearl",
     "action": "CopybookAdd_Submit",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "目标缺少字帖名称、内容和备注持久层"
   },
   {
     "module": "WritePearl",
     "action": "Copybook_API",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "目标没有可删除、启用或停用的字帖记录"
   },
   {
     "module": "WritePearl",
     "action": "Manuscripts",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "目标缺少 ZL_Write_Manuscripts 文稿主表及状态历史"
   },
   {
     "module": "WritePearl",
     "action": "ManuscriptsAdd",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "目标没有可编辑的旧文稿记录"
   },
   {
     "module": "WritePearl",
     "action": "ManuscriptsAdd_Submit",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "目标缺少文稿名称和备注持久层"
   },
   {
     "module": "WritePearl",
     "action": "Manuscripts_API",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "目标缺少文稿与 ZL_Write_Word 字词子表,不能级联删除或启停"
   },
   {
     "module": "WritePearl",
     "action": "UserFiles",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "目标缺少 ZL_Write_UserFiles 用户书写文件授权、等级与到期历史"
   },
   {
     "module": "WritePearl",
     "action": "UserFiles_API",
     "occurrence": 1,
-    "status": "pending",
-    "reason": "尚未逐项迁移或完成等价性核验"
+    "status": "blocked-data",
+    "reason": "目标没有可到期或续期的书写文件授权;账户会员期限语义不等价"
   }
 ];

+ 1 - 1
src/app/admin/pages/admin-migration.component.spec.ts

@@ -21,7 +21,7 @@ describe('AdminMigrationComponent', () => {
     const counts = component.adminCounts();
     expect(Object.values(counts).reduce((sum, count) => sum + count, 0)).toBe(1042);
     expect(counts.implemented).toBeGreaterThan(0);
-    expect(counts.pending).toBeGreaterThan(0);
+    expect(counts.pending).toBe(0);
   });
 
   it('filters the auditable action ledger by status and keyword', () => {

+ 3 - 0
src/app/admin/pages/admin-resource.component.html

@@ -47,6 +47,9 @@
   }
   @if (className() === 'UserMoneyLog') {
     <div class="bulk-toolbar"><strong>流水类型</strong><select [ngModel]="filterUserMoneyType()" (ngModelChange)="filterUserMoneyType.set(+$event); load(1)"><option [ngValue]="1">余额</option><option [ngValue]="2">银币</option><option [ngValue]="3">经验</option><option [ngValue]="4">积分</option><option [ngValue]="5">虚拟币</option><option [ngValue]="6">信用分</option></select><input type="date" aria-label="开始日期" [ngModel]="filterUserMoneyStartDate()" (ngModelChange)="filterUserMoneyStartDate.set($event)" /><input type="date" aria-label="结束日期" [ngModel]="filterUserMoneyEndDate()" (ngModelChange)="filterUserMoneyEndDate.set($event)" /><button type="button" (click)="load(1)">按日期筛选</button></div>
+    <div class="bulk-toolbar"><strong>管理员资金调整</strong><input class="bulk-node" type="number" min="1" [ngModel]="balanceUserId()" (ngModelChange)="balanceUserId.set(+$event)" placeholder="旧用户 ID" /><select [ngModel]="balanceDirection()" (ngModelChange)="balanceDirection.set($event)"><option value="add">增加</option><option value="deduct">扣减</option></select><input class="bulk-node" type="number" min="0.01" step="0.01" [ngModel]="balanceAmount()" (ngModelChange)="balanceAmount.set(+$event)" placeholder="数额" /><input maxlength="500" [ngModel]="balanceDetail()" (ngModelChange)="balanceDetail.set($event)" placeholder="操作备注(选填)" /><button type="button" [disabled]="adjustingBalance()" (click)="adjustUserBalance()">{{ adjustingBalance() ? '处理中…' : '提交调整' }}</button></div>
+    @if (balanceActionError()) { <div class="bulk-notice error">{{ balanceActionError() }}</div> }
+    @if (balanceActionMessage()) { <div class="bulk-notice">{{ balanceActionMessage() }}</div> }
   }
   @if (className() === 'UserPromotion') {
     <div class="bulk-toolbar"><strong>推广关系范围</strong><input class="bulk-node" type="number" min="0" [ngModel]="filterPromotionParentUserId()" (ngModelChange)="filterPromotionParentUserId.set(+$event)" placeholder="邀请人用户 ID" /><label><input type="checkbox" [ngModel]="filterPromotionOnlyWithChildren()" (ngModelChange)="filterPromotionOnlyWithChildren.set($event)" />仅显示有推广成员的用户</label><input type="date" aria-label="推广开始日期" [ngModel]="filterPromotionStartDate()" (ngModelChange)="filterPromotionStartDate.set($event)" /><input type="date" aria-label="推广结束日期" [ngModel]="filterPromotionEndDate()" (ngModelChange)="filterPromotionEndDate.set($event)" /><button type="button" (click)="load(1)">筛选推广关系</button></div>

+ 22 - 1
src/app/admin/pages/admin-resource.component.ts

@@ -167,6 +167,13 @@ export class AdminResourceComponent implements OnInit {
   readonly filterUserMoneyType = signal(1);
   readonly filterUserMoneyStartDate = signal('');
   readonly filterUserMoneyEndDate = signal('');
+  readonly balanceUserId = signal(0);
+  readonly balanceAmount = signal(0);
+  readonly balanceDirection = signal<'add' | 'deduct'>('add');
+  readonly balanceDetail = signal('');
+  readonly adjustingBalance = signal(false);
+  readonly balanceActionError = signal('');
+  readonly balanceActionMessage = signal('');
   readonly filterPromotionParentUserId = signal(0);
   readonly filterPromotionOnlyWithChildren = signal(false);
   readonly filterPromotionStartDate = signal('');
@@ -225,7 +232,7 @@ export class AdminResourceComponent implements OnInit {
       this.resetServiceActions();
       this.filterStoreStatus.set(-100); this.resetStoreActions();
       this.resetTagKeyActions();
-      this.filterUserMoneyType.set(1); this.filterUserMoneyStartDate.set(''); this.filterUserMoneyEndDate.set('');
+      this.filterUserMoneyType.set(1); this.filterUserMoneyStartDate.set(''); this.filterUserMoneyEndDate.set(''); this.balanceUserId.set(0); this.balanceAmount.set(0); this.balanceDirection.set('add'); this.balanceDetail.set(''); this.balanceActionError.set(''); this.balanceActionMessage.set('');
       this.filterPromotionParentUserId.set(0); this.filterPromotionOnlyWithChildren.set(false); this.filterPromotionStartDate.set(''); this.filterPromotionEndDate.set('');
       this.filterBaikeStatus.set(-100); this.filterBaikeElite.set(-100);
       this.filterSystemLogType1.set(''); this.filterSystemLogType2.set(''); this.filterSystemLogStartDate.set(''); this.filterSystemLogEndDate.set('');
@@ -870,6 +877,19 @@ export class AdminResourceComponent implements OnInit {
     catch (error) { this.bulkError.set(error instanceof Error ? error.message : '积分等级删除失败'); }
     finally { this.updatingUserLevel.set(false); }
   }
+  async adjustUserBalance(): Promise<void> {
+    this.balanceActionError.set(''); this.balanceActionMessage.set('');
+    const userId = this.balanceUserId(); const amount = this.balanceAmount();
+    if (!Number.isInteger(userId) || userId < 1) { this.balanceActionError.set('请输入有效的旧用户 ID'); return; }
+    if (!Number.isFinite(amount) || amount <= 0 || amount > 1000000000) { this.balanceActionError.set('调整数额必须大于 0 且不超过 10 亿'); return; }
+    if (this.balanceDirection() === 'deduct' && !confirm(`确认从用户 ${userId} 扣减 ${amount} ${this.moneyTypeLabel(this.filterUserMoneyType())}?`)) return;
+    this.adjustingBalance.set(true);
+    try {
+      const result = await this.functions.admin<{ balanceAfter: number; moneyTypeLabel: string }>('adjustUserBalance', { userId, type: this.filterUserMoneyType(), amount, direction: this.balanceDirection(), detail: this.balanceDetail().trim() });
+      this.balanceAmount.set(0); this.balanceDetail.set(''); this.balanceActionMessage.set(`调整成功,当前${result.moneyTypeLabel}:${result.balanceAfter}`); await this.load(1);
+    } catch (error) { this.balanceActionError.set(error instanceof Error ? error.message : '资金调整失败'); }
+    finally { this.adjustingBalance.set(false); }
+  }
   async applyBulkCrmClientTypeDelete(): Promise<void> {
     const objectIds = this.selectedIds(); this.bulkError.set(''); this.bulkMessage.set('');
     if (this.className() !== 'CRMSAttr' || !objectIds.length) { this.bulkError.set('请先选择 CRM 客户类型'); return; }
@@ -995,6 +1015,7 @@ export class AdminResourceComponent implements OnInit {
   storeStyleIdOf(style: Record<string, unknown>): number { return Number(style['id']) || 0; }
   storeStyleLabel(style: Record<string, unknown>): string { return `${String(style['styleName'] || '未命名样式')}(${this.storeStyleIdOf(style)})`; }
   contentStatusValue(): number { return Number(this.draft()['status']) || 0; }
+  moneyTypeLabel(type: number): string { return ({ 1: '余额', 2: '银币', 3: '经验', 4: '积分', 5: '虚拟币', 6: '信用分' } as Record<number, string>)[type] || '资金'; }
   contentStatusLabel(status: number): string { return ({ [-3]: '草稿', [-2]: '回收站', [-1]: '未通过', 0: '待审核', 99: '已审核' } as Record<number, string>)[status] || String(status); }
   nodeStatusValue(): number { return Number(this.draft()['zstatus'] ?? 99); }
   private async loadUserGroups(): Promise<void> {

部分文件因为文件数量过多而无法显示