# Matrix: REV-004 第一批次真实迁移映射矩阵细化版 v1 ## 1. 目标 本矩阵用于把第一批次迁移对象细化到“可以直接指导脚本设计”的程度。 第一批次范围限定为: - `AT_CHARGES` - `AT_CHARGE_DETAILS` - `CT_ACCOUNTS` 本版重点不是覆盖旧表所有字段,而是先锁定: - 主键与核心业务标识 - 核心业务字段 - 关键状态字段 - 必要关系字段 - 映射落库要求 ## 2. 第一批次总原则 - 账单主明细和账户对象属于在线主模型优先承接范围。 - 旧主键和旧业务标识必须进入映射层,不允许只保留新主键。 - 当前不能稳定落入主表的旧字段,先进入映射层或历史只读层,不强行污染主对象。 - 第一批次试迁后必须能回答:原账单是谁、原账户是谁、新对象是谁、金额和状态是否一致。 ## 3. 表级落位总览 | 旧表 | 目标主对象 | 目标映射对象 | 当前 backend 证据 | 当前结论 | | --- | --- | --- | --- | --- | | `AT_CHARGES` | `biz_charge` | `legacy_charge_mapping` | `ChargeDO.java` | 可直接作为第一批次主对象 | | `AT_CHARGE_DETAILS` | `biz_charge_detail` | `legacy_charge_detail_mapping` | `ChargeDetailDO.java` | 可直接作为第一批次明细对象 | | `CT_ACCOUNTS` | `biz_account` | `legacy_account_mapping` | `AccountDO.java` | 可直接作为第一批次账户对象 | ## 4. `AT_CHARGES -> biz_charge` 细化映射 ### 4.1 主键与标识 | 旧字段 | 新字段/位置 | 策略 | 备注 | | --- | --- | --- | --- | | `FeeId` | `biz_charge.id` | 直接承接或保留旧值映射 | 是否复用旧主键需由迁移脚本策略决定,但映射表必须保留 | | `FeeId` | `legacy_charge_mapping.legacyId` | 必填 | 新旧账单主线标识 | | 原账单号(如存在) | `legacy_charge_mapping.legacyBizNo` | 必填 | 若旧表无独立账单号,可用 `FeeId` 兼任 | | 新账单号(如生成) | `legacy_charge_mapping.targetBizNo` | 选填 | 若新系统仅用主键,可暂为空 | ### 4.2 核心业务字段 | 旧字段 | 新字段 | 策略 | 备注 | | --- | --- | --- | --- | | `RecordId` | `recordId` | 直接映射 | 抄表记录引用 | | `BillMonth` | `billMonth` | 直接映射 | 核心账期字段 | | `OrgId` | `deptId` | 转换映射 | 旧站点字段名与新部门字段名不同 | | `BookId` | `bookId` | 直接映射 | 册本引用 | | `BookSortIndex` | `bookSortIndex` | 直接映射 | 册内顺序 | | `CustId` | `custId` | 直接映射 | 客户主键 | | `CustCode` | `custCode` | 直接映射 | 客户编号 | | `CustName` | `custName` | 直接映射 | 客户名称 | | `CustAddress` | `custAddress` | 直接映射 | 客户地址 | | `Populine` | `population` | 字段改名映射 | 旧字段拼写与新字段不同 | | `PayMethod` | `payMethod` | 直接/枚举转换 | 需核对枚举值是否一致 | | `LastReading` | `lastReading` | 类型转换映射 | 旧 `int` 到新 `BigDecimal` | | `LastChildReading` | `lastChildReading` | 类型转换映射 | 同上 | | `LastReadWater` | `lastReadWater` | 类型转换映射 | 同上 | | `LastReadDate` | `lastReadDate` | 直接映射 | 时间字段 | | `LastReadStateId` | `lastReadStateId` | 直接映射 | 状态引用 | | `Reading` | `reading` | 类型转换映射 | 旧 `int` 到新 `BigDecimal` | | `ChildReading` | `childReading` | 类型转换映射 | 同上 | | `ReadWater` | `readWater` | 类型转换映射 | 同上 | | `ReadDate` | `readDate` | 直接映射 | 时间字段 | | `ReadStateId` | `readStateId` | 直接映射 | 状态引用 | | `ReadTimes` | `readTimes` | 直接映射 | 抄次 | | `MeterReaderId` | `meterReaderId` | 直接映射 | 抄表员 | | `PriceListId` | `adjustmentSnapCode` 或扩展映射 | 暂按转换映射 | 旧调价号是 `int`,新对象用 `String adjustmentSnapCode` | | `PriceCode` | `priceTemplateCode` | 转换映射 | 旧用水性质编码映射到新价格模板编码 | | `TotalWater` | `totalWater` | 类型转换映射 | 旧 `int` 到新 `BigDecimal` | | `ReplaceWater` | `replaceWater` | 类型转换映射 | 同上 | | `BillWater` | `billWater` | 类型转换映射 | 同上 | | `BillAmount` | `billAmount` | 直接映射 | 金额核心字段 | | `ExtendedAmount` | `extendedAmount` | 直接映射 | 应收金额核心字段 | | `LastChange` | `lastChange` | 直接映射 | 零头字段 | | `Change` | `change` | 直接映射 | 零头字段 | | `BillerId` | `billerId` | 直接映射 | 开账人 | | `BillDate` | `billDate` | 直接映射 | 开账时间 | | `LateFeeBeginDate` | `lateFeeBeginDate` | 直接映射 | 滞纳金起算日 | | `LateFee` | `lateFee` | 直接映射 | 核心金额字段 | | `CashierId` | `cashierId` | 直接映射 | 收费员 | | `PayDate` | `payDate` | 直接映射 | 收费时间 | | `CheckoutDate` | `checkoutDate` | 直接映射 | 结账时间 | | `ChargeMethod` | `chargeMethod` | 直接/枚举转换 | 需核对枚举 | | `ChargeWay` | `chargeWay` | 直接/枚举转换 | 需核对枚举 | ### 4.3 状态与结果字段 | 旧字段 | 新字段/位置 | 策略 | 备注 | | --- | --- | --- | --- | | `PayState` | `biz_charge.payState` | 状态转换 | 必须按状态矩阵归并 | | `FeeState` | `biz_charge.feeState` 或 `legacyState` | 状态转换 + 保留旧值 | 若新字段无法完整表达,保留旧值 | | `InvoiceState` | `biz_charge.invoiceState` + 发票映射层 | 状态转换 | 需与发票主对象一致 | | `InvoiceError` | `biz_charge.invoiceError` | 直接映射 | 开票失败原因 | | `PrintState` | `biz_charge.printState` | 直接映射 | 打印状态 | | `PrintTimes` | `biz_charge.printTimes` | 直接映射 | 打印次数 | | `LockNum` | `biz_charge.lockNum` | 直接映射 | 锁定编号 | | `LockoutEndTime` | `biz_charge.lockoutEndTime` | 直接映射 | 锁定时间 | ### 4.4 关系和追溯字段 | 旧字段 | 新字段/位置 | 策略 | 备注 | | --- | --- | --- | --- | | `AdjustType` | `biz_charge.adjustType` + `tracePayload.adjustType` | 直接映射 + 追溯保留 | 当前新对象已有该字段 | | `ContrastFeeId` | `biz_charge.contrastFeeId` + `legacy_charge_mapping.relatedFeeId` | 直接映射 + 映射保留 | 调整前后关系 | | `ParentFeeId` | `legacy_charge_mapping.sourceFeeId` | 追溯保留 | 新 `ChargeDO` 未见同名字段,必须进映射层 | | `InvoiceCode` | `biz_charge.invoiceCode` | 直接映射 | 发票代码 | | `InvoiceDate` | `biz_charge.invoiceDate` | 直接映射 | 开票日期 | | `InvoiceNumber` | `biz_charge.invoiceNumber` | 直接映射 | 发票号码 | | `RefundWater` | `biz_charge.refundWater` + `tracePayload.refundWater` | 直接映射 + 追溯保留 | 当前新对象已有该字段 | ### 4.5 第一批次对 `AT_CHARGES` 的直接建议 - `AT_CHARGES` 可直接作为第一批次最优先迁移主表。 - 需要额外设计: - `PriceListId -> adjustmentSnapCode` - `PriceCode -> priceTemplateCode` - `ParentFeeId` 的映射层保留 - `PayState / FeeState / InvoiceState` 的状态归并规则 ## 5. `AT_CHARGE_DETAILS -> biz_charge_detail` 细化映射 ### 5.1 主键与关系 | 旧字段 | 新字段/位置 | 策略 | 备注 | | --- | --- | --- | --- | | 明细主键 `Id` | `biz_charge_detail.id` | 直接承接或映射保留 | 视脚本主键策略决定 | | `FeeId` | `biz_charge_detail.feeId` | 直接映射 | 必须保持主明细关系 | | 明细主键 | `legacy_charge_detail_mapping.legacyId` | 必填 | 保留旧明细主键 | ### 5.2 核心业务字段 | 旧字段 | 新字段 | 策略 | 备注 | | --- | --- | --- | --- | | `PriceListId` | `adjustmentSnapCode` | 转换映射 | 与主账一致,需要调价号转换 | | `PriceCode` | `priceTemplateCode` | 转换映射 | 与主账一致 | | `PriceDetailId` | `costAdjustmentId` 或扩展字段 | `tbd` | 需进一步确认新字段语义是否等价 | | `PriceItemId` | `costComponentCode` | 转换映射 | 旧费用组成 ID 到新费用组成编码 | | `CalcMode` | `calcMode` | 直接映射 | 计费方式 | | `LevelType` | `levelType` | 直接映射 | 阶梯模式 | | `LevelIndex` | `levelIndex` | 直接映射 | 阶梯级别 | | `StartMonth` | `startMonth` | 直接映射 | 开始月份 | | `EndMonth` | `endMonth` | 直接映射 | 结束月份 | | `StartWater` | `startWater` | 类型转换映射 | 旧 `int` 到新 `BigDecimal` | | `EndWater` | `endWater` | 类型转换映射 | 同上 | | `SettleMethod` | `settleMethod` | 直接映射 | 分摊方式 | | `SettleValues` | `settleValues` | 类型转换映射 | 旧 `float` 到新 `BigDecimal` | | `Price` | `price` | 直接映射 | 单价 | | `Water` | `water` | 类型转换映射 | 应收水量 | | `DiscountWater` | `discountWater` | 类型转换映射 | 优惠水量 | | `WaterNum` | `waterNum` | 直接映射 | 水量系数 | | `Money` | `money` | 直接映射 | 明细金额 | | `State` | `state` | 状态转换 | 明细状态需核对枚举 | | `IsPreferential` | `isPreferential` | 直接映射 | 是否优惠 | | `BasicNumber` | `basicNumber` | 直接映射 | 基数 | | `InvoicedState` | `invoicedState` | 状态转换 | 开票状态 | | `DiscountMoney` | `discountMoney` | 直接映射 | 优惠金额 | | `OriginalMoney` | `originalMoney` | 直接映射 | 优惠前金额 | | `IsWaterOver` | `isWaterOver` | 直接映射 | 是否超计划 | | `ItemInvoiceError` | `itemInvoiceError` | 直接映射 | 明细开票错误 | | `ItemInvoiceState` | `itemInvoiceState` | 直接映射 | 明细开票状态 | | `ItemInvoiceType` | `itemInvoiceType` | 直接映射 | 明细开票类型 | ### 5.3 第一批次对 `AT_CHARGE_DETAILS` 的直接建议 - 明细对象整体与 `ChargeDetailDO` 对应度较高,可以直接进入第一批次。 - 主要需要额外确认的点: - `PriceDetailId -> costAdjustmentId` 是否语义等价 - `PriceItemId -> costComponentCode` 的编码转换规则 ## 6. `CT_ACCOUNTS -> biz_account` 细化映射 ### 6.1 主键与关系 | 旧字段 | 新字段/位置 | 策略 | 备注 | | --- | --- | --- | --- | | `AccountId` | `biz_account.id` | 直接承接或映射保留 | 是否复用旧主键由脚本策略决定 | | `AccountId` | `legacy_account_mapping.legacyId` | 必填 | 账户迁移主线 | | 原账户编号 | `legacy_account_mapping.legacyBizNo` | 选填 | 若旧系统无独立业务账户号,可用主键兼任 | | `CustId` | `biz_account.custId` | 直接映射 | 账户与客户关系核心字段 | ### 6.2 核心业务字段 | 旧字段 | 新字段 | 策略 | 备注 | | --- | --- | --- | --- | | `Deposit` | `deposit` | 直接映射 | 预存余额 | | `UnCheckMoney` | `uncheckMoney` | 直接映射 | 未到账金额 | | `Overdraft` | `overdraft` | 直接映射 | 透支额度 | | `AccountState` | `status` | 状态转换 | 旧账户状态需与新 `status` 枚举核对 | ### 6.3 第一批次对 `CT_ACCOUNTS` 的直接建议 - `CT_ACCOUNTS` 与 `AccountDO` 的字段匹配度较高,可以直接进入第一批次。 - 关键点不在字段缺失,而在于: - `AccountState -> status` 的枚举值核对 - 账户与客户主数据的一致性校验 ## 7. 第一批次试迁时必须同步落库的映射对象 建议至少同时生成以下映射记录: | 映射对象 | 作用 | | --- | --- | | `legacy_charge_mapping` | 保留旧账单到新账单关系 | | `legacy_charge_detail_mapping` | 保留旧账单明细到新明细关系 | | `legacy_account_mapping` | 保留旧账户到新账户关系 | 每条映射记录最少包括: - `legacyTable` - `legacyId` - `legacyBizNo` - `targetDomain` - `targetId` - `targetBizNo` - `migrationBatchNo` - `mappingStatus` ## 8. 第一批次最小脚本出口条件 在进入实际试迁脚本开发前,第一批次至少应满足: - `AT_CHARGES` 字段映射规则已稳定 - `AT_CHARGE_DETAILS` 字段映射规则已稳定 - `CT_ACCOUNTS` 字段映射规则已稳定 - 三类主对象的状态映射规则已确认 - 三类主对象的标识映射结构已确认 ## 9. 当前仍待补的小项 本版之后,第一批次还建议继续补两项: 1. `PriceListId / PriceCode / PriceItemId` 的编码转换字典 2. `PayState / FeeState / AccountState` 的枚举值对照表