From 87a0884953a8435c2662dc3dcd8164afa2f88460 Mon Sep 17 00:00:00 2001 From: liuwenxin <1009266660@qq.com> Date: Wed, 28 Oct 2026 11:43:13 +0800 Subject: [PATCH] =?UTF-8?q?docs(tplus):=20=E6=9B=B4=E6=96=B0=E5=AE=A2?= =?UTF-8?q?=E6=88=B7=E5=8F=A3=E5=BE=84=E6=96=87=E6=A1=A3=E4=B8=8E=E5=BC=80?= =?UTF-8?q?=E5=8F=91=E8=AE=A1=E5=88=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 +- docs/T+字段映射草案_v0.1_2026-10-20.md | 289 ------------------ ...接数据需求清单_v1.6_2026-10-20.xlsx | Bin 35402 -> 0 bytes ...接数据需求清单_v1.7_2026-10-20.xlsx | Bin 37775 -> 0 bytes docs/T+数据表说明文档.doc | Bin 0 -> 1016832 bytes ...26-10-12-M1-系统设置与参数体系.md | 2 +- .../plans/2026-10-12-剩余开发计划.md | 4 +- ...26-10-13-M2-基础数据与业务数据.md | 2 +- docs/备份恢复手册.md | 101 ------ docs/待澄清问题清单_2026-10-15(1).xlsx | Bin 0 -> 16156 bytes docs/待确认事项清单_2026-10-28_v2.xlsx | Bin 0 -> 18280 bytes docs/待答复催办清单_2026-10-19.md | 95 ------ docs/部署硬件需求.txt | 241 --------------- docs/项目阶段报告_2026-10-20.md | 80 ----- tasks/archive/2026-10-27-tplus-sync-plan.md | 65 ++++ tasks/archive/2026-10-27-tplus-sync-todo.md | 52 ++++ tasks/plan.md | 56 ++++ tasks/todo.md | 38 +++ 18 files changed, 218 insertions(+), 811 deletions(-) delete mode 100644 docs/T+字段映射草案_v0.1_2026-10-20.md delete mode 100644 docs/T+对接数据需求清单_v1.6_2026-10-20.xlsx delete mode 100644 docs/T+对接数据需求清单_v1.7_2026-10-20.xlsx create mode 100644 docs/T+数据表说明文档.doc delete mode 100644 docs/备份恢复手册.md create mode 100644 docs/待澄清问题清单_2026-10-15(1).xlsx create mode 100644 docs/待确认事项清单_2026-10-28_v2.xlsx delete mode 100644 docs/待答复催办清单_2026-10-19.md delete mode 100644 docs/部署硬件需求.txt delete mode 100644 docs/项目阶段报告_2026-10-20.md create mode 100644 tasks/archive/2026-10-27-tplus-sync-plan.md create mode 100644 tasks/archive/2026-10-27-tplus-sync-todo.md create mode 100644 tasks/plan.md create mode 100644 tasks/todo.md diff --git a/.gitignore b/.gitignore index 56c0217..5b2642d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ # AI辅助目录(整个目录忽略) -ai-aux/ +.ai/ # 依赖 node_modules/ @@ -65,6 +65,8 @@ CLAUDE.md backend/uploads/ # 数据库备份导出目录(⑨ 备份脚本产物) db/backups/ +# 客户发来的原始账套备份压缩包。 +/db/*.zip # 外部参考资料(2026-10-20):T+12.3 数据字典压缩包与解压目录不入版本库 docs/**/*.rar diff --git a/docs/T+字段映射草案_v0.1_2026-10-20.md b/docs/T+字段映射草案_v0.1_2026-10-20.md deleted file mode 100644 index 7b041a6..0000000 --- a/docs/T+字段映射草案_v0.1_2026-10-20.md +++ /dev/null @@ -1,289 +0,0 @@ -# T+ 12.3 字段映射草案(v0.1,2026-10-20) - -> 本文仅记录字段级事实与页面索引,不复制厂商文档正文。 -> 基线:`docs/T+对接数据需求清单_v1.4_2026-10-19.xlsx`(75 项)+ v1.3 IT 18 项 + 《T+12.3数据字典》。 - -## 0. 结论摘要 - -- 覆盖:清单 **75/75** 项均已给出 T+ 侧候选字段与系统目标列; -- 状态分布:候选待确认 42 / 字典明确 23 / 未检出 9 / 需 IT 1; -- 数据字典无法让 IT 18 项中的任何一项完全闭环;但 9 项可改写为「候选字段选择题」,6 项部分可答,2 项纯 IT,1 项转业务。 -- 收敛后:**13 项 IT 待确认 + 1 组业务裁决**(见第 12 节)。 -- 关键缺口:人员工号/入职日期/试用期无字段、客户 status 缺失、回款 payment_method/confirm_status 待补、明细行无显式行号、无源端更新时间与负向事件模型。 - -## 1. 编制说明与证据等级 - -| 标记 | 含义 | -| --- | --- | -| `D` | 字典明确 | -| `D?` | 候选待确认 | -| `IT` | 需 IT | -| `B` | 需业务 | -| `S` | 系统自维护 | -| `N` | 未检出 | - -- `D` 仅用于字段存在、类型明确且语义直接匹配的项;涉及「取哪个字段 / 业务口径」一律标 `D?` 或 `IT`。 -- 字典来源为 T+ 12.3 SchemaDoc;同一字段可能标注 `T+12.1/12.2/12.3` 版本,映射按 12.3 可用为准。 - -## 2. 公共字段与同步元数据 - -| 序号 | 数据项 | T+ 表.字段(字典) | T+ 类型/长度 | 枚举/取值 | 系统目标表.字段 | 转换/清洗规则 | 必要性 | 确认状态 | 来源/字典页 | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 1 | T+ 原始单据号 / 档案编码 | 各表 code(人员/存货/客户/订单/出库/收付款单均有) | nvarchar(30~64) | — | personnel/products/customers/businesses/shipments/receipts.source_no | TRIM;作废重开是否换号待 IT(#4) | 必须 | D? | AA_Person.code、AA_Inventory.code、AA_Partner.code、SA_SaleOrder.code、SA_SaleDelivery.code、ARAP_ReceivePayment.code | -| 2 | T+ 系统内部标识 | 各表 id(整型主键) | int(4) | — | 六表 t_plus_id | int → 字符串存储;辅助对账/改名追溯 | 建议 | D | 各表 id(主键) | - -系统侧六张主表已预留 `source_no / t_plus_id / sync_batch_no / synced_at`;`source_no` 当前为普通索引,IT 确认幂等键后升级唯一约束。 - -## 3. 人员档案 - -人员主档;隶属关系需经部门树/部门负责人推断,T+ 无直属上级字段。 - -| 序号 | 数据项 | T+ 表.字段(字典) | T+ 类型/长度 | 枚举/取值 | 系统目标表.字段 | 转换/清洗规则 | 必要性 | 确认状态 | 来源/字典页 | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 1 | 人员唯一编码(工号)★ | AA_Person.code | nvarchar(32) | — | personnel.source_no(建议补 personnel_code) | TRIM;编码优先、姓名辅助核对;是否即工号待 IT(#19) | 必须 | D? | AA_Person.code(编号) | -| 2 | 姓名 | AA_Person.name | nvarchar(200) | — | personnel.personnel_name | TRIM;仅辅助核对,不作唯一键 | 必须 | D | AA_Person.name(名称) | -| 3 | 在职状态 | AA_Person.disabled | tinyint(1) | 0 启用 / 1 停用(候选) | personnel.status(1 在职 / 0 离职) | disabled=1 → 0;无离职日期字段,离职时间需 IT 确认 | 必须 | D? | AA_Person.disabled(停用) | -| 4 | 是否试用期 | 未检出 | — | — | personnel.is_probation | T+ 人员档案无试用期字段;系统内人工维护或按入职日期规则推导 | 必须 | N | AA_Person 全表检索无 probation/试用 字段 | -| 5 | 入职日期 | 未检出(仅 madeDate 制单日期、birthday 出生日期) | — | — | personnel.hire_date | T+ 无入职日期字段;确认是否有自定义项承载,否则人工维护 | 必须 | N | AA_Person 全表检索无 hire/entry/入职 字段 | -| 6 | 联系电话 | AA_Person.mobilePhoneNo / officePhoneNo | nvarchar(20) / nvarchar(100) | — | personnel.phone | 优先 mobilePhoneNo,空则 officePhoneNo;日志脱敏 | 建议 | D | AA_Person.mobilePhoneNo(手机)、officePhoneNo(办公电话) | -| 7 | 业务员 ↔ 营销经理隶属关系 | AA_Person.iddepartment → AA_Department.idparent / iddirector | int(4) | — | personnel.manager_id | T+ 人员档案无直属上级字段;可经部门树/部门负责人推断,规则待确认;否则系统人工指定 | 必须 | D? | AA_Person.iddepartment(部门id);AA_Department.idparent(上级id)、iddirector(部门负责人) | -| 8 | 人员负责区域 / 产品辐射范围 | 未检出(可用 priuserdefnvc* 自定义项承载,需 IT 确认) | — | — | personnel_regions.region_name | 无专门字段则系统内人工维护 | 建议 | N | AA_Person 无区域/辐射范围字段 | -| 9 | 银行账户名 / 账号 / 开户行 | 未检出(AA_Partner 有银行账号字段,人员档案无) | — | — | 暂不落库 | 一期不采集;如后续代发工资再扩展 | 可选 | N | AA_Person 无银行账户字段 | - -## 4. 产品档案 - -产品主档不含库存量与售价,数量取现存量表、价格取价目表/订单明细。 - -| 序号 | 数据项 | T+ 表.字段(字典) | T+ 类型/长度 | 枚举/取值 | 系统目标表.字段 | 转换/清洗规则 | 必要性 | 确认状态 | 来源/字典页 | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 1 | 产品名称 | AA_Inventory.name | nvarchar(200) | — | products.product_name | TRIM;与规格型号组成系统组合唯一键 | 必须 | D | AA_Inventory.name(名称) | -| 2 | 规格型号 | AA_Inventory.specification | nvarchar(200) | — | products.spec_model | 空值归一为空串 | 必须 | D | AA_Inventory.specification(规格型号) | -| 3 | 计量单位 | AA_Inventory.idunit → 计量单位表 | int(4) | — | products.unit | 按 idunit join 单位表取名称;单位表名待索引确认 | 建议 | D? | AA_Inventory.idunit(计量单位id)、idunitgroup | -| 4 | 数量 | ST_CurrentStock.baseQuantity(现存量) | decimal(13) | — | products.stock_quantity | 按存货+仓库汇总;语义(现存量/在途/累计销量)待 IT(#12) | 必须 | D? | ST_CurrentStock.baseQuantity(主计量数量);AA_Inventory 无库存量字段 | -| 5 | 销售单价 | AA_InventoryPrice(零售价/批发价)、AA_InventoryUnitPrice.retailPrice;订单明细实际成交价 | decimal(13~17) / nvarchar(1000) 公式 | — | products.sale_price | 产品档案参考价取价目表;绩效以订单/发货明细实际单价为准 | 必须 | D? | AA_InventoryPrice、AA_InventoryUnitPrice;AA_Inventory 无销售单价字段 | -| 6 | 产品分类(类目) | AA_Inventory.idinventoryclass → AA_InventoryClass.name | int(4) | — | products.product_category | T+ 分类仅辅助判定市政水利/轨交;系统分类人工维护不覆盖 | 必须 | D? | AA_Inventory.idinventoryclass(存货分类id)、AA_InventoryClass.name | -| 7 | 计量单位换算关系(如存在) | AA_Inventory_MultiUnit / AA_InventoryUnitPrice.rateOfExchange | decimal(13) | — | 暂不实现(系统单单位存储) | 如业务有多单位换算需求,另行设计 | 可选 | D? | AA_Inventory_MultiUnit、AA_InventoryUnitPrice.rateOfExchange(换算率) | - -## 5. 业务单据(销售订单) - -成本额在订单明细仅有最新成本,出库明细才有成本金额;销售额需按数量×单价计算。 - -| 序号 | 数据项 | T+ 表.字段(字典) | T+ 类型/长度 | 枚举/取值 | 系统目标表.字段 | 转换/清洗规则 | 必要性 | 确认状态 | 来源/字典页 | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 1 | 订单单号 | SA_SaleOrder.code | nvarchar(30) | — | businesses.source_no | TRIM;不得写入内部 business_no | 必须 | D | SA_SaleOrder.code(编号) | -| 2 | 业务(订单)日期 | SA_SaleOrder.voucherdate | datetime(8) | — | businesses.business_date | 截断为 DATE | 必须 | D | SA_SaleOrder.voucherdate(单据日期) | -| 3 | 客户标识 | SA_SaleOrder.idcustomer → AA_Partner.code | int(4) | — | businesses.customer_id | 按客户编码解析;回退公司名称+负责人 | 必须 | D? | SA_SaleOrder.idcustomer(客户id)、idsettlecustomer(结算客户id) | -| 4 | 负责营销人员 | SA_SaleOrder.idclerk → AA_Person.code | int(4) | — | businesses.owner_personnel_id | 按人员编码解析;新插入写 T+ 负责人、更新是否覆盖人工归属待裁决 | 必须 | D? | SA_SaleOrder.idclerk(业务员id) | -| 5 | 协助营销人员 | 未检出独立协助人字段 | — | — | businesses.assistant_personnel_id | 业务已回馈 T+ 合同只挂单一负责人;协助人系统内记录 | 建议 | N | SA_SaleOrder 无 assist/协助 字段 | -| 6 | 特殊业务标记 | SA_SaleOrder.idbusinesstype → 业务类型表 | int(4) | 业务类型枚举待字典/IT 提供 | businesses.is_special | 业务类型是否等同特殊业务待确认;无则人工标记 | 必须 | D? | SA_SaleOrder.idbusinesstype(业务类型id) | -| 7 | 明细行 · 产品名称 + 规格 | SA_SaleOrder_b.idinventory → AA_Inventory.name/specification | int(4) | — | business_items.product_name / spec_model | 冗余固化名称与规格;未建档产品允许自由录入 | 必须 | D | SA_SaleOrder_b.idinventory(存货id) | -| 8 | 明细行 · 数量 | SA_SaleOrder_b.quantity | decimal(13) | — | business_items.quantity | 主计量数量;需 >0 校验 | 必须 | D | SA_SaleOrder_b.quantity(数量)、baseQuantity(主计量数量) | -| 9 | 明细行 · 销售单价 | SA_SaleOrder_b.price / taxPrice | decimal(13) | — | business_items.sale_price | price 为不含税单价、taxPrice 为含税单价;取哪个待确认 | 必须 | D? | SA_SaleOrder_b.price(单价)、taxPrice(含税单价) | -| 10 | 明细行 · 销售额 | SA_SaleOrder_b 无「销售额」字段;由数量×单价计算,或 taxAmount−tax | decimal(13) | — | business_items.sale_amount | 系统按数量×单价固化;T+ 用于对账 | 必须 | D? | SA_SaleOrder_b.quantity、price、taxAmount、tax | -| 11 | 明细行 · 成本额 ★ | SA_SaleOrder_b.LatestCost(最新成本);SA_SaleDelivery_b.costPrice/costAmount | decimal(13) | — | business_items.cost_amount | 取订单最新成本还是出库成本、成本类型/时点待 IT(#1) | 必须 | D? | SA_SaleOrder_b.LatestCost;SA_SaleDelivery_b.costPrice/costAmount/CostPriceGetType | -| 12 | 项目 / 工程编号或名称(如存在) | SA_SaleOrder.idproject → 项目表 | int(4) | — | 建议预留 project_code(当前不落库) | 按项目查询与报表归集;是否建列待业务 | 可选 | D? | SA_SaleOrder.idproject(项目id)、SA_SaleOrder_b.idproject | -| 13 | 服务类 / 维修类及其他收入单据(如存在) | 未检索到服务/维修类独立单据表 | — | — | 暂人工录入 | 业务规则未定前不纳入自动同步 | 可选 | N | SA_* 表索引未发现服务/维修类主表 | - -## 6. 发货单据(销售出库/发货) - -发货日期有四个候选字段;运费未在发货单据检出。 - -| 序号 | 数据项 | T+ 表.字段(字典) | T+ 类型/长度 | 枚举/取值 | 系统目标表.字段 | 转换/清洗规则 | 必要性 | 确认状态 | 来源/字典页 | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 1 | 发货单号 | SA_SaleDelivery.code | nvarchar(30) | — | shipments.source_no | TRIM;不得写入内部 shipment_no | 必须 | D | SA_SaleDelivery.code(编号) | -| 2 | 发货日期 ★ | SA_SaleDelivery.voucherdate / SendDate / deliveryDate / auditeddate | datetime(8) | — | shipments.ship_date | 四个日期候选:单据日期/送货日期(T+12.3)/交货日期/审核日期;取哪个待 IT(#2) | 必须 | D? | SA_SaleDelivery.voucherdate、SendDate、deliveryDate、auditeddate | -| 3 | 关联订单号 | SA_SaleDelivery.SourceVoucherCode / idsourcevouchertype;明细 saleOrderCode/saleOrderId | nvarchar(50) / int(4) | — | shipments.business_id | 按订单号解析;主关联路径待 IT(#5) | 必须 | D? | SA_SaleDelivery.SourceVoucherCode、SA_SaleDelivery_b.saleOrderCode/saleOrderId/saleOrderDetailId | -| 4 | 运费金额 | 未检出运费字段(明细有 origExpenseAmount 费用分摊金额) | decimal(13) | — | shipments.freight_amount | T+ 运费可能在费用单/其他单据,需 IT 确认;系统暂人工 | 必须 | N | SA_SaleDelivery/SA_SaleDelivery_b 无 freight/运费字段 | -| 5 | 发货总金额 | SA_SaleDelivery.amount / taxAmount | decimal(13) | — | shipments.total_amount | 系统按明细汇总,不直写;T+ 金额用于对账 | 必须 | D | SA_SaleDelivery.amount(金额)、taxAmount(含税金额) | -| 6 | 明细行 · 产品/规格/数量/单价/行金额 | SA_SaleDelivery_b.idinventory / quantity / price / taxPrice / taxAmount | decimal(13) | — | shipment_items.product_name/spec_model/quantity/sale_price/amount | 行金额由系统按数量×单价固化;T+ 用于对账 | 必须 | D | SA_SaleDelivery_b.quantity、price、taxPrice、taxAmount | -| 7 | 发货单状态 | SA_SaleDelivery.voucherState / isCancel / auditeddate | int(4) / tinyint(1) | 单据状态枚举待 IT 提供 | 不落库(v1.4 统一) | 仅推已生效单据;状态随行供同步校验 | 必须 | D | SA_SaleDelivery.voucherState(单据状态)、isCancel(状态) | -| 8 | 承运商 / 物流单号 | SA_SaleDelivery.deliveryMode(运输方式 id) | int(4) | 运输方式枚举表待确认 | 暂不落库 | 承运商/物流单号无独立字段;如需建列再扩展 | 可选 | D? | SA_SaleDelivery.deliveryMode(运输方式) | - -## 7. 回款单据(收款/核销) - -到账日期无银行到账日字段;收款方式取结算方式表;确认/核销状态字段存在但枚举待 IT。 - -| 序号 | 数据项 | T+ 表.字段(字典) | T+ 类型/长度 | 枚举/取值 | 系统目标表.字段 | 转换/清洗规则 | 必要性 | 确认状态 | 来源/字典页 | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 1 | 回款单号 | ARAP_ReceivePayment.code | nvarchar(30) | — | receipts.source_no | TRIM;不得写入内部 receipt_batch_no | 必须 | D | ARAP_ReceivePayment.code(编号) | -| 2 | 到账日期 ★ | ARAP_ReceivePayment.voucherDate / auditedDate / createdTime | datetime(8) | — | receipts.receipt_date | 无银行到账日字段;取单据日期/审核日期/创建时间哪个待 IT(#3) | 必须 | D? | ARAP_ReceivePayment.voucherDate、auditedDate、createdTime | -| 3 | 回款金额 | ARAP_ReceivePayment.amount(本币)/ origAmount(原币) | decimal(13) | — | receipts.amount | 取本币金额;一期禁负数,红字规则待 #8 | 必须 | D | ARAP_ReceivePayment.amount、origAmount | -| 4 | 关联订单号 | ARAP_ReceivePayment.SaleOrderCode/SaleOrderID;明细 saleordercode/saleorderid/sourceordercode | nvarchar(50) / int(4) | — | receipts.business_id | 回款↔订单按订单号解析;回款↔发货批次系统人工指定 | 必须 | D? | ARAP_ReceivePayment.SaleOrderCode/SaleOrderID;ARAP_ReceivePayment_b.saleordercode/sourceordercode | -| 5 | 收款方式 | ARAP_ReceivePayment.IdSettleStyle → AA_SettleStyle.code/name | int(4) | 结算方式枚举表(AA_SettleStyle:code/name/停用) | receipts.payment_method(待补列) | 枚举映射;完整枚举清单需 IT 提供 | 必须 | D? | ARAP_ReceivePayment.IdSettleStyle;AA_SettleStyle | -| 6 | 以物抵顶物说明 | 收款方式(以物抵顶枚举值)+ ARAP_ReceivePayment.memo | int(4) / nvarchar(200) | 以物抵顶对应结算方式代码待 IT 提供 | receipts.is_barter / remark | 按结算方式识别;抵顶物说明暂入备注 | 建议 | D? | ARAP_ReceivePayment.IdSettleStyle、memo | -| 7 | 回款确认 / 核销状态 | ARAP_ReceivePayment.cancelState / voucherstate / auditedDate | int(4) / datetime(8) | 核销/单据状态枚举待 IT 提供 | receipts.confirm_status(待补列) | 字段存在;哪个可作为人工确认依据待 IT(#16) | 必须 | D? | ARAP_ReceivePayment.cancelState(核销状态)、voucherstate(单据状态) | -| 8 | 银行流水号 / 回单参考号 | 未检出银行流水号/回单号字段(MultiSettle.documentCode 为票据号) | — | — | 建议预留 bank_serial_no | 需 IT 确认是否有对应字段 | 建议 | N | ARAP_ReceivePayment/ARAP_ReceivePayment_MultiSettle 仅票据号 | -| 9 | 票据信息(票号 / 到期日 / 贴现说明) | ARAP_ReceivePayment_MultiSettle.documentCode / amount / idsettlestyle | nvarchar(30) / decimal(13) | 票据类型枚举待 IT | 系统暂以备注承载 | 无票据到期日字段;承兑到期核销信息需 IT 确认 | 建议 | D? | ARAP_ReceivePayment_MultiSettle.documentCode(票据号) | -| 10 | 币种 / 汇率(如存在外币业务) | ARAP_ReceivePayment.idcurrency / exchangeRate | int(4) / decimal(13) | 币种表待索引 | 一期不落库(人民币记账) | 如存在外币业务再扩展 | 可选 | D | ARAP_ReceivePayment.idcurrency、exchangeRate | - -## 8. 客户档案 - -采用往来单位表 AA_Partner;客户编码/停用字段存在,status 列需系统补。 - -| 序号 | 数据项 | T+ 表.字段(字典) | T+ 类型/长度 | 枚举/取值 | 系统目标表.字段 | 转换/清洗规则 | 必要性 | 确认状态 | 来源/字典页 | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 1 | 公司名称 | AA_Partner.name | nvarchar(200) | — | customers.company_name | TRIM;与负责人组成系统唯一键 | 必须 | D | AA_Partner.name(名称) | -| 2 | 负责人姓名 | AA_Partner.Contact(联系人)/ representative(法人代表) | nvarchar(50) | — | customers.owner_name | 「负责人」对应 Contact 还是 representative 待 IT/业务确认 | 必须 | D? | AA_Partner.Contact、representative | -| 3 | 客户编码 / 状态 / 启用停用时间 | AA_Partner.code / disabled / madeDate / updated | nvarchar(32) / tinyint(1) | disabled 0 启用 / 1 停用(候选) | customers.source_no / status(待补列) | 启停时间无独立列,可用 updated 近似(需 IT 确认) | 必须 | D? | AA_Partner.code、disabled、madeDate、updated | -| 4 | 联系人 / 电话 / 地址 / 行业 | AA_Partner.Contact / TelephoneNo / MobilePhone / CustomerAddress / iddistrict | nvarchar(30~200) | — | customers.contact_person / contact_phone / address / industry | 行业无直接字段;地区按 iddistrict 关联 | 可选 | D? | AA_Partner.Contact、TelephoneNo、MobilePhone、CustomerAddress、iddistrict | -| 5 | 开票信息(税号 / 开票名称 / 开票地址电话) | AA_Partner.taxRegcode / name / CustomerAddress | nvarchar(50~200) | — | 系统暂仅供展示,不落库 | 税号存在;开票地址电话需 IT 确认字段 | 可选 | D? | AA_Partner.taxRegcode(纳税号)、CustomerAddress | - -## 9. 同步完整性与补充字段 - -时间戳与负向字段部分存在;无统一事件表、无明细行号、无手续费字段。 - -| 序号 | 数据项 | T+ 表.字段(字典) | T+ 类型/长度 | 枚举/取值 | 系统目标表.字段 | 转换/清洗规则 | 必要性 | 确认状态 | 来源/字典页 | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 1 | 数据最后更新时间 / 单据创建时间 / 修改时间 | 各表 createdTime/createdtime、updated、madeDate、auditedDate、ts | datetime(8) / timestamp(8) | — | 建议新增 source_created_at / source_updated_at(当前无) | 本地 update_time 不可作为源端水位;增量水位字段待 IT(#9) | 必须 | D? | 各表 updated/createdTime;ts(分布时间戳) | -| 2 | 变更类型 / 单据事件:新增、修改、删除、作废、红冲、退货、冲销 | 各表 isCancel(状态)、isCounteractDelivery(冲抵销货)、returnQuntity(退货数量) | int(4) / tinyint(1) / decimal(13) | 状态/事件枚举待 IT 提供 | 建议事件表(当前无) | 无统一变更事件表;负向事实需事件模型,规则待 #8 | 必须 | D? | SA_SaleOrder.isCancel、SA_SaleDelivery.isCounteractDelivery、SA_SaleDelivery_b.returnQuntity | -| 3 | 单据状态 / 财务审核状态 / 状态变更时间 | voucherState / auditedDate / auditor / auditorid | int(4) / datetime(8) / nvarchar(50) | 单据状态枚举待 IT | 不落库(仅同步校验) | 仅推已生效单据;状态随行校验 | 必须 | D | SA_SaleOrder/SA_SaleDelivery/ARAP_ReceivePayment 的 voucherState、auditedDate | -| 4 | 明细行行号 / 行状态 / 行级变更事件 | 明细表主键 ID、code(明细编号);无显式行号字段 | int(4) / nvarchar(30) | — | 建议补 source_line_no / source_item_id | 确认 code 是否即行号;否则用 T+ 明细 ID 作行级幂等键(待 IT) | 必须 | D? | SA_SaleOrder_b.id/code、SA_SaleDelivery_b.ID/code、ARAP_ReceivePayment_b.id/detailCode | -| 5 | 税率 / 税额 / 价税合计 / 折扣或折让 | 明细表 taxRate、tax、taxAmount、origTaxAmount、discount、discountRate、discountAmount | decimal(13) | — | 待业务 #20 答复后决定是否建列 | 字段齐全;金额是否含税、折扣关联方式待业务 | 必须 | D? | SA_SaleOrder_b/SA_SaleDelivery_b 税额与折扣字段 | -| 6 | 发货客户 / 收货人 / 收货地址 / 联系电话 | SA_SaleDelivery.idcustomer / address / contactPhone / idSendPerson / idConsignor | int(4) / nvarchar(100~200) | — | 建议预留(当前无列) | 用于核对发货对象与代发情形 | 必须 | D | SA_SaleDelivery.idcustomer、address、contactPhone、idSendPerson、idConsignor | -| 7 | 发货业务员 / 发货组织 / 仓库 | SA_SaleDelivery.idclerk / iddepartment / idwarehouse | int(4) | — | 建议预留(当前无列) | 识别代发、调拨与多组织差异 | 必须 | D | SA_SaleDelivery.idclerk、iddepartment、idwarehouse | -| 8 | 发货退回 / 红字发货 / 退回数量 / 退回金额 / 原发货单关联 | SA_SaleDelivery.isCounteractDelivery、_b.returnQuntity/returnQuntity2/backSentQuantity、sourceVoucher* | tinyint(1) / decimal(13) / nvarchar(50) | 冲抵/退货枚举待 IT | 待业务 #21 答复后决定是否建列 | 原单关联字段存在;是否冲减绩效待业务 | 必须 | D? | SA_SaleDelivery.isCounteractDelivery、SA_SaleDelivery_b.returnQuntity、backSentQuantity | -| 9 | 收款客户 / 经手人 / 财务审核状态 | ARAP_ReceivePayment.idpartner / idHandler / auditor / voucherstate | int(4) / nvarchar(50) / int(4) | — | 建议预留(当前无列) | 核对实际付款主体与经办责任 | 必须 | D | ARAP_ReceivePayment.idpartner、idHandler、auditor、voucherstate | -| 10 | 收款分配明细 / 分配金额 / 未分配金额 / 分配对象 | ARAP_ReceivePayment_b(源单/订单/金额/未结算)、ARAP_StrikeBalance(核销) | decimal(13) / int(4) | — | 人工指定发货批次的辅助参考 | 分配关系仅参考;系统仍人工指定(对照表 #18) | 必须 | D? | ARAP_ReceivePayment_b.saleordercode/amount/origNoSettleAmount;ARAP_StrikeBalance | -| 11 | 预收款 / 保证金 / 代收款 / 折让 / 抵扣 | ARAP_ReceivePayment.paymentAmount/origPaymentAmount(预收/预付)、overPayment(超收转预收)、allowances(折让) | decimal(13) | — | 待业务 #22 答复后决定是否建列 | 字段存在;是否计入绩效回款待业务 | 必须 | D? | ARAP_ReceivePayment.paymentAmount、overPayment、allowances | -| 12 | 手续费 / 交易费用 / 收款净额 | 未检出手续费/交易费用字段 | — | — | 待业务 #23 答复后决定 | 需 IT 确认手续费是否在其他单据/字段 | 必须 | N | ARAP_ReceivePayment 无 fee/charge 字段 | -| 13 | 红字收款 / 收款作废 / 收款退回 / 冲销及原单关联 | ARAP_ReceivePayment.voucherstate / isReceiveFlag;ARAP_StrikeBalance 冲销 | int(4) / tinyint(1) | 作废/红字状态枚举待 IT | 待业务 #24 答复后决定 | 无红字收款专用字段;负向事实需事件模型 | 必须 | D? | ARAP_ReceivePayment.voucherstate、isReceiveFlag;ARAP_StrikeBalance | -| 14 | 客户编码 / 客户状态 / 启用停用时间 | AA_Partner.code / disabled | nvarchar(32) / tinyint(1) | disabled 0 启用 / 1 停用 | customers.source_no / status(待补列) | 同六-3;客户编码唯一性待 IT | 必须 | D | AA_Partner.code、disabled | -| 15 | 客户分类 / 渠道 / 区域 / 所属组织 | AA_Partner.idpartnerclass / customerType / iddistrict / idMarketingOrgan | int(4) | 分类/客商类型枚举待 IT | customers.customer_type(不覆盖);渠道无列 | 系统客户分类人工维护;渠道/区域作备考 | 必须 | D? | AA_Partner.idpartnerclass、customerType、iddistrict、idMarketingOrgan | -| 16 | 客户名称变更 / 编码停用合并前后的对应关系 | AA_Partner.code(终身不变)+ updated;无变更历史表(待确认) | nvarchar(32) | — | 靠 source_no 追溯同一主体 | 改名/换负责人/合并靠 code 串同一主体;变更历史需 IT 确认 | 必须 | D? | AA_Partner.code、updated、HasEverChanged | -| 17 | 人员部门 / 岗位 / 调岗时间 / 离职和组织变更时间 | AA_Person.iddepartment / position / updated;调岗历史表待确认 | int(4) / datetime(8) | — | 不落库(备考/排查) | 字段部分存在;调岗/离职时间需 IT 确认 | 必须 | D? | AA_Person.iddepartment、position、updated | -| 18 | 产品编码 / 产品状态 / 启用停用时间 | AA_Inventory.code / disabled / madeDate | nvarchar(32) / tinyint(1) | disabled 0 启用 / 1 停用 | products.source_no / status | 稳定匹配;停用后历史明细仍可回溯 | 必须 | D | AA_Inventory.code、disabled、MadeRecordDate | -| 19 | 字典和枚举取值范围 / 编码与名称对照说明 | 枚举表:AA_SettleStyle、业务类型表、状态字典(需随数据导出) | — | 枚举字典随数据提供 | 同步映射表 | 不能只给代码;需编码与名称对照 | 必须 | D? | AA_SettleStyle、AA_BusinessType 等枚举表 | -| 20 | 对账汇总信息 / 数据记录数 / 数量合计 / 金额合计 / 抽取时间 | 由 IT 提供抽取汇总(接口/视图层) | — | — | 同步日志/对账表 | 记录明细条数、金额合计、抽取时间 | 必须 | IT | 字典不提供;需对接方式确定 | -| 21 | 单据历史版本 / 修改留痕(如 T+ 提供) | 未检索到统一单据历史版本表(待 IT 确认) | — | — | 系统同步快照可比对 | 无此数据不阻塞 | 可选 | D? | 表索引未见 history 类表 | - -## 10. 跨表关联与键 - -| 关系 | T+ 字段(字典) | 系统目标 | 状态 | -| --- | --- | --- | --- | -| 人员唯一键 | AA_Person.code | personnel.source_no(建议补 personnel_code) | D? | -| 客户唯一键 | AA_Partner.code;名称+联系人 | customers.source_no;company_name+owner_name | D? | -| 订单→发货 | SA_SaleDelivery.SourceVoucherCode / _b.saleOrderCode/saleOrderId | shipments.business_id | D? | -| 订单/发货→回款 | ARAP_ReceivePayment.SaleOrderCode/SaleOrderID;_b.saleordercode | receipts.business_id | D? | -| 回款→发货批次 | 系统人工指定(对照表 #18) | receipts.shipment_id | S | -| 明细行幂等 | 明细表 ID/code;无显式行号 | 建议补 source_line_no | D? | - -## 11. 枚举与状态 - -| 枚举 | T+ 来源 | 备注 | -| --- | --- | --- | -| 收款/结算方式 | AA_SettleStyle(code/name/disabled) | 完整枚举需随数据导出 | -| 单据状态 | 各单据 voucherState / isCancel | 仅同步校验,不落库 | -| 核销状态 | ARAP_ReceivePayment.cancelState | 含义待 IT | -| 业务类型 | SA_SaleOrder.idbusinesstype → 业务类型表 | 是否等同特殊业务待确认 | -| 产品分类 | AA_InventoryClass | 仅辅助系统分类人工维护 | - -## 12. 系统侧目标表缺口 - -| 缺口 | 说明 | 建议 | -| --- | --- | --- | -| `personnel.personnel_code` | T+ 工号/编码是否即 `source_no` 未定 | 若不等则补唯一列 | -| `customers.status` / 启停时间 | T+ 有 disabled,系统无列 | 补 status 与停用时间 | -| `receipts.payment_method` / `confirm_status` | T+ 有结算方式与核销状态 | 补两列并接枚举 | -| `source_created_at` / `source_updated_at` | 本地 update_time 不可作源端水位 | 补列或建 staging 表 | -| `source_line_no` / `source_item_id` | 明细表无行号 | 补列支持行级幂等 | -| 负向事件模型 | 无删除/作废/红冲/退货事件表 | 设计事件表或冲销单 | -| `sync_log` / 失败明细表 | 完全缺失 | 同步模块前置 | -| T+ 配置项 | `.env` 有 `T_PLUS_*`,`Settings` 未定义 | 补配置字段与校验 | - -## 13. IT 待确认事项收敛(18 → 13 + 1 组业务) - -| 新# | 原# | 事项 | 字典证据 | 字典可答 | 仍需确认 | 优先级 | -| --- | --- | --- | --- | --- | --- | --- | -| 1 | 1 | 成本额字段与成本口径 | SA_SaleOrder_b.LatestCost;SA_SaleDelivery_b.costPrice/costAmount/CostPriceGetType;AA_Inventory.invSCost/latestCost/avagCost | 字段存在性、类型精度、挂在订单还是出库单 | 请确认绩效成本取哪个字段(订单最新成本 / 出库成本 / 其他),取数时点与精度 | 高(阻塞核算) | -| 2 | 2+3 | 发货日与到账日口径 | 发货:SA_SaleDelivery.voucherdate/SendDate/deliveryDate/auditeddate;到账:ARAP_ReceivePayment.voucherDate/auditedDate/createdTime | 各日期字段存在性与类型 | 请分别确认发货日、到账日取哪个字段;签收日/银行到账日能否从 T+ 获取 | 高 | -| 3 | 4 | 幂等键与作废重开 | 各表 code + id 主键;SA_SaleOrder.ismodifiedcode、HasEverChanged | 编码字段与主键关系 | 各单据 code 是否唯一终身不变;作废重开是否换号;建议以 code 作 source_no | 高 | -| 4 | 5 | 三单关联与核销路径 | SA_SaleDelivery.SourceVoucherCode/idsourcevouchertype;SA_SaleDelivery_b.saleOrderCode/saleOrderId;ARAP_ReceivePayment.SaleOrderCode/SaleOrderID;ARAP_ReceivePayment_b;ARAP_StrikeBalance | 关联字段与核销表存在性 | 请确认订单→发货→回款的主关联路径(按单号还是 ID),以及分批发货/部分核销如何取 | 高 | -| 5 | 6 | 人员编码/工号与经理隶属 | AA_Person.code/name/iddepartment/isSalesman;AA_Department.idparent/iddirector | 编码/部门/负责人字段存在;无直属上级字段 | AA_Person.code 是否即工号;业务员→营销经理隶属在 T+ 如何维护(部门负责人?自定义项?) | 高 | -| 6 | 7 | 对接方式与安全 | 字典不涉及 | 无 | REST/视图/中间表/文件;只读账号与凭据、接口文档、样例数据 | 高 | -| 7 | 8 | 负数/红字/退货/冲销规则 | SA_SaleDelivery.isCounteractDelivery;SA_SaleDelivery_b.returnQuntity/backSentQuantity;ARAP_ReceivePayment.voucherstate;ARAP_StrikeBalance | 负向字段/单据形式存在性 | 负向单据的实际使用形式、原单关联字段、是否推送;绩效影响转业务 | 高 | -| 8 | 9 | 存量起始与增量水位 | 各表 updated/createdTime/madeDate/auditedDate/ts | 时间戳字段存在性 | 存量起始日期;增量用哪个时间戳(updated? ts?);时区 | 中 | -| 9 | 10+v1.4#18 | 客户主数据匹配与变更 | AA_Partner.code/name/Contact/representative/disabled/updated | 编码/名称/负责人/停用字段 | 客户唯一键;改名/换负责人/合并如何映射同一主体;负责人取 Contact 还是 representative | 中 | -| 10 | 11+16 | 收款方式与确认/核销枚举 | ARAP_ReceivePayment.IdSettleStyle;AA_SettleStyle.code/name;ARAP_ReceivePayment.cancelState/voucherstate | 枚举表与状态字段存在性 | 收款方式完整枚举与以物抵顶对应代码;核销/确认状态枚举含义及可否作为人工确认依据 | 高 | -| 11 | 12+13 | 产品数量语义与发货单价 | ST_CurrentStock.baseQuantity;AA_InventoryPrice/AA_InventoryUnitPrice;SA_SaleDelivery_b.price/taxPrice | 数量/价格字段存在性 | 产品「数量」取现存量/在途/累计销量;发货单价取订单价还是发货时价、含税与否 | 中 | -| 12 | 14+17 | 低频字段存在性:特殊业务标记/市场拓展计划 | SA_SaleOrder.idbusinesstype;AA_Person 自定义项;未检出市场拓展计划表 | 字段/表存在性 | 特殊业务是否有可识别字段;市场拓展计划 T+ 是否有表可提供;无则人工维护 | 低 | -| 13 | 15 | 同步窗口 | 字典不涉及 | 无 | 每周同步时间点,避开结账/备份;失败重试策略 | 低 | -| B1 | 18 | 业务裁决 5 项 | 税额/折扣/退货/预收/手续费字段已定位(待答复后决定是否建列) | 字段存在性 | 含税口径、退货红字冲减、预收/保证金/代收、手续费净额、负绩效表述 | 业务裁决 | - -### 原 18 项对照 - -| 原# | 事项 | 原优先级 | 收敛去向 | -| --- | --- | --- | --- | -| 1 | 成本额取数口径 | 高(阻塞核算) | 1 | -| 2 | 发货日期口径 | 高 | 2 | -| 3 | 到账日期口径 | 高 | 2 | -| 4 | 幂等唯一键 | 高 | 3 | -| 5 | 三单关联键 | 高 | 4 | -| 6 | 人员匹配键与经理隶属(v1.2 更新) | 高 | 5 | -| 7 | 对接方式与安全 | 高 | 6 | -| 8 | 负数 / 红字 / 退货 / 冲销处理规则 | 高 | 7 | -| 9 | 存量范围与增量口径 | 中 | 8 | -| 10 | 客户档案匹配与唯一键 | 中 | 9 | -| 11 | 收款方式枚举 | 中 | 10 | -| 12 | 产品「数量」语义 | 中 | 11 | -| 13 | 发货单价口径 | 中 | 11 | -| 14 | 特殊业务标记 | 低 | 12 | -| 15 | 同步窗口 | 低 | 13 | -| 16 | 回款确认 / 核销状态 | 高 | 10 | -| 17 | 市场拓展计划数据 | 低 | 12 | -| 18 | 口径裁决 5 项(移交业务方) | 业务裁决 | B1 | - -## 14. 待确认清单 - -**IT(13 项)**:见第 13 节新# 1–13。 - -**业务(1 组)**:含税口径、退货红字冲减、预收/保证金/代收、手续费净额、负绩效表述(原 #18 / 待澄清 #20–#24)。 - -**系统侧(不阻塞 IT)**:补 `personnel_code`、`customers.status`、`receipts.payment_method/confirm_status`、`source_updated_at`、`source_line_no`、`sync_log` 与 T+ 配置项。 - -## 15. 验证记录 - -- 解包:1,457 个 HTML、`.hhc/.hhk` 齐全、零字节 0; -- 全量解析:1,457 页、938 个 Table 类型页、**931 张表、21,019 个字段、0 失败页**; -- 编码:逐页检测,GB18030(无替换字符); -- 抽样核验:六类主表结构一致(6 列字段表),关键字段逐项比对通过; -- 输入 SHA-256:`3e8cd3146e22bdebe8bacda56b5dafbbd8be744c4279d7b2bbf3d7ecdc7e2726`; - -## 附录 A:六类主表索引 - -| 类别 | T+ 表 | 字典页 GUID | -| --- | --- | --- | -| 人员 | AA_Person | `fcd00c17-6778-4c6a-90ae-3f0dbaf2c102` | -| 产品 | AA_Inventory | `93b57dfa-4ca4-411d-a883-6d26c8e01787` | -| 客户 | AA_Partner | `871e93dd-c2cf-4bd2-af91-cbeb5951ac5e` | -| 业务 | SA_SaleOrder | `9a51f8a9-658a-4f7c-9372-8af2257511ee` | -| 发货 | SA_SaleDelivery | `bef98b52-c9f0-4d80-8e62-8968cced5b52` | -| 回款 | ARAP_ReceivePayment | `709de6e4-3b3d-4cf8-b5ed-5f657d42599a` | - -## 附录 B:75 项覆盖矩阵 - -| 节 | 项数 | 已映射 | -| --- | --- | --- | -| 公共要求 | 2 | 2 | -| 人员 | 9 | 9 | -| 产品 | 7 | 7 | -| 业务 | 13 | 13 | -| 发货 | 8 | 8 | -| 回款 | 10 | 10 | -| 客户 | 5 | 5 | -| 同步完整性 | 21 | 21 | - -## 附录 C:失败页 - -无(`failures.csv` 为空)。 - -## 附录 D:复现方法 - -```text -1. C:/Windows/hh.exe -decompile -2. py -3.14 -I 03_extract_fields.py --extracted --out -3. py -3.14 -I 08_build_md.py --out --target -``` - ---- - -*本文档由数据字典解析与人工核验生成,字段候选未经 IT 确认前不得视为同步契约。* diff --git a/docs/T+对接数据需求清单_v1.6_2026-10-20.xlsx b/docs/T+对接数据需求清单_v1.6_2026-10-20.xlsx deleted file mode 100644 index d4419feab0c085b48437837ae724078784dcbcd4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35402 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 diff --git a/docs/T+对接数据需求清单_v1.7_2026-10-20.xlsx b/docs/T+对接数据需求清单_v1.7_2026-10-20.xlsx deleted file mode 100644 index 106ed5c650d171d4fa89b56d8e3d6fe2dac2162e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37775 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 TLS+B|Xb7KlLc*Vo{dx5tV}%i* diff --git a/docs/T+数据表说明文档.doc b/docs/T+数据表说明文档.doc new file mode 100644 index 0000000000000000000000000000000000000000..f2aa580501b07f24efcaa6e7dd6e69182b0066f0 GIT binary patch literal 1016832 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 literal 0 HcmV?d00001 diff --git a/docs/superpowers/plans/2026-10-12-M1-系统设置与参数体系.md b/docs/superpowers/plans/2026-10-12-M1-系统设置与参数体系.md index 70715c5..34bca94 100644 --- a/docs/superpowers/plans/2026-10-12-M1-系统设置与参数体系.md +++ b/docs/superpowers/plans/2026-10-12-M1-系统设置与参数体系.md @@ -265,4 +265,4 @@ def start_payment_ok(received, revenue, ratio) -> bool 1. 按 T1–T8 的验证节点逐任务执行(见第二章各任务);T8 后全量回归 + e2e; 2. 验收标准 6 条逐条核对(见第四章); -3. 与 `ai-aux/AI_CONTEXT.md` 需求裁决节交叉核对口径无冲突。 +3. 与 `.ai/AI_CONTEXT.md` 需求裁决节交叉核对口径无冲突。 diff --git a/docs/superpowers/plans/2026-10-12-剩余开发计划.md b/docs/superpowers/plans/2026-10-12-剩余开发计划.md index 0a70f09..15b6f0e 100644 --- a/docs/superpowers/plans/2026-10-12-剩余开发计划.md +++ b/docs/superpowers/plans/2026-10-12-剩余开发计划.md @@ -8,7 +8,7 @@ **技术栈:** 后端 Python 3.12 + FastAPI + SQLAlchemy 2.0(同步)+ MySQL 8.0 + Redis 7;前端 Vue 3.5 + TS 5.9 + Vite 8 + Element Plus 2.14 + Pinia 4。 -**规格:** `ai-aux/AI_CONTEXT.md`「需求裁决」节(权威口径);`docs/问题与解决方案对照表_v2.xlsx`(28 项裁决);`docs/2026.9.8修改方案.docx`(公式与生效日期)。需规(`docs/衍水绩效管理系统功能需规.docx`)中 4 类作废条款不再引用:26 天示例、含运费公式、协助 25%、经理个人户 8‰。 +**规格:** `.ai/AI_CONTEXT.md`「需求裁决」节(权威口径);`docs/问题与解决方案对照表_v2.xlsx`(28 项裁决);`docs/2026.9.8修改方案.docx`(公式与生效日期)。需规(`docs/衍水绩效管理系统功能需规.docx`)中 4 类作废条款不再引用:26 天示例、含运费公式、协助 25%、经理个人户 8‰。 ## 全局约束 @@ -759,7 +759,7 @@ git commit -m "test(system): 参数体系模块用例与测试记录" ## 验证方式 -1. 计划内容与 `ai-aux/AI_CONTEXT.md` 需求裁决节逐条核对(口径无冲突、无遗漏作废条款); +1. 计划内容与 `.ai/AI_CONTEXT.md` 需求裁决节逐条核对(口径无冲突、无遗漏作废条款); 2. 计划中的命令与项目现有命令体系一致(uv / pnpm / docker compose); 3. 首块每个任务有独立可测交付物;测试要点符合「模块整体完成时统一编写」约定(纯函数与 core 级随实现即时测); 4. 执行阶段验证:T1 后 `test_schema_sync.py` 通过;T2/T3 后纯单元全绿;T5 后冒烟链路完整;T8 后全量后端用例与 e2e 全绿(以 `backend/tests/README.md` 最新运行记录为准)。 diff --git a/docs/superpowers/plans/2026-10-13-M2-基础数据与业务数据.md b/docs/superpowers/plans/2026-10-13-M2-基础数据与业务数据.md index 9434353..ad3102e 100644 --- a/docs/superpowers/plans/2026-10-13-M2-基础数据与业务数据.md +++ b/docs/superpowers/plans/2026-10-13-M2-基础数据与业务数据.md @@ -92,7 +92,7 @@ - T1/T6:`uv run pytest tests/integration/test_schema_sync.py tests/unit/test_models.py -q` 全绿(双轨零漂移是硬关口)。 - T5/T11:模块集成用例统一编写并执行;T11 后 `uv run pytest -q` 全量回归。 - T12–T14:`pnpm type-check && pnpm build`。 -- T15:后端全量 pytest + 前端构建 + 两个 e2e 脚本全过;`ai-aux/AI_CONTEXT.md` 历史任务摘要由主会话收尾时更新。 +- T15:后端全量 pytest + 前端构建 + 两个 e2e 脚本全过;`.ai/AI_CONTEXT.md` 历史任务摘要由主会话收尾时更新。 ## 风险与开放问题(默认处理,不阻塞开工) diff --git a/docs/备份恢复手册.md b/docs/备份恢复手册.md deleted file mode 100644 index 0b51780..0000000 --- a/docs/备份恢复手册.md +++ /dev/null @@ -1,101 +0,0 @@ -# 备份恢复手册(⑨ 备份恢复与运维检查) - -> 用户强调「这个备份恢复很重要」。**备份不演练 = 没有备份**——本手册的一页纸目标:任何运维/开发拿到都能完成「备份 → 恢复到临时库核对 → 删临时库」全链路。 - -## 一、备份(每日一次,建议凌晨低峰) - -```bash -# 项目根目录执行 -bash scripts/backup_full.sh -``` - -- 产物:`db/backups/payroll_YYYYMMDD_HHMMSS.sql.gz`(gzip 压缩) -- 保留策略:自动清理 30 天前的旧备份 -- 凭据:从 `docker/.env` 读取(不入脚本、不入版本库) - -**Windows 定时任务**(任务计划程序 / `schtasks`): - -```cmd -:: 每日 02:30 备份(经 Git Bash) -schtasks /create /tn "ys-payroll-backup" /tr "\"C:\Program Files\Git\bin\bash.exe\" -lc \"bash scripts/backup_full.sh\"" /sc daily /st 02:30 /ru SYSTEM -``` - -## 二、恢复演练(备份后顺手跑一次,验证备份真能用) - -```bash -bash scripts/restore_drill.sh # 恢复到临时库 + 行数核对,临时库默认保留 -bash scripts/restore_drill.sh --drop-exec # 核对通过后再加此参数删除临时库 -``` - -- **绝不直接覆盖生产库**——演练恢复到独立临时库 `payroll_drill_<时间戳>` -- 行数对比覆盖 16 张关键表(users/roles/param_*/business*/personnel/products/customers/shipments*/receipts/approval_*/system_settings) -- 全部 ✓ 即备份可恢复;出现 ✗ 时临时库保留供排查 - -## 二·五、增量备份(澄清 #19 答复:每日全量 + 有更新时增量补充) - -全量之间的数据变更由 **binlog 归档**覆盖(MySQL 8 默认开启 binlog,ROW 格式、服务端保留 30 天): - -```bash -bash scripts/backup_incremental.sh -``` - -- 产物:`db/backups/binlog.NNNNNN.gz`(原始 binlog 文件逐个压缩) -- **有更新时才产出**:状态文件 `db/backups/.incremental_state` 记录上次归档到的文件,无新变更时直接退出 -- 只归档「已写完」的 binlog(正在写的最后一个留到下次收取) -- 保留策略同全量:自动清理 30 天前的增量包 - -**配套**:`backup_full.sh` 每次全量会同时产出位点文件 `payroll_*.sql.gz.pos`(binlog 文件名 + 位点),标记「该全量覆盖到此」——恢复重放从位点之后开始。 - -**恢复顺序**(真出事时):最新全量 → 依次 `gunzip` 其后的增量包 → 用 `mysqlbinlog` 重放(镜像内无此客户端,宿主机或临时容器执行): - -```bash -# 解出增量包后重放(示例:从全量位点之后开始) -gunzip -c db/backups/binlog.000003.gz > /tmp/binlog.000003 -mysqlbinlog --start-position=<全量位点> /tmp/binlog.000003 | \ - docker exec -i ys-mysql-dev sh -c 'mysql -uroot -p"$MYSQL_ROOT_PASSWORD" payroll' -``` - -**建议定时**:增量与全量同节奏(每日 02:30 全量后接一次增量;变更频繁的日子可在中午加跑一次): - -```cmd -schtasks /create /tn "ys-payroll-backup-incr" /tr "\"C:\Program Files\Git\bin\bash.exe\" -lc \"bash scripts/backup_incremental.sh\"" /sc daily /st 02:50 /ru SYSTEM -``` - -## 三、生产恢复(真出事了,七步) - -> ⚠️ 生产恢复是**高危操作**:先把容器停了再恢复,避免写冲突。下面假设恢复到**全新空数据卷**(最干净路径)。 - -1. **停容器保卷**:`docker compose -f docker/docker-compose.dev.yml down` -2. **删旧卷(谨慎!确认要全量重来才执行)**:`docker volume rm ys-payroll_mysql-dev-data` - - 若只想恢复到某个时间点**且不丢其它数据**,改用「恢复到临时库 → mysqldump 单表导出 → 手工回灌」的细粒度路径,勿整体覆盖。 -3. **起空库**:`docker compose -f docker/docker-compose.dev.yml up -d`(首启自动跑 `db/init/init-dev.sql` 建表 + 种子) -4. **选一份备份**:`ls -t db/backups/payroll_*.sql.gz | head` -5. **导入该备份**: - ```bash - gunzip -c db/backups/payroll_XXXXXXXX_XXXXXX.sql.gz | \ - docker exec -i ys-mysql-dev sh -c 'mysql -uroot -p"$MYSQL_ROOT_PASSWORD" payroll' - ``` -6. **核对行数**:再跑一次 `bash scripts/restore_drill.sh`(此时源库=刚恢复的库,应全 ✓) -7. **重启后端**:`cd backend && uv run uvicorn app.main:app --reload --port 8000`,登录抽查几个页面确认数据回来 - -## 四、运维健康检查(每日一次) - -```bash -bash scripts/health_check.sh -``` - -六项检查:容器健康 ×2 / 磁盘水位(80% 阈值)/ 备份新鲜度(24h 内)/ Redis 探活 / 24h 登录失败次数(暴力破解预警)。任一项 WARN/FAIL 时退出码非零,方便监控采集。 - -**Windows 定时**: - -```cmd -:: 每日 08:50 检查(上班前出报告) -schtasks /create /tn "ys-payroll-health" /tr "\"C:\Program Files\Git\bin\bash.exe\" -lc \"bash scripts/health_check.sh >> db/backups/health.log 2>&1\"" /sc daily /st 08:50 /ru SYSTEM -``` - -## 五、注意事项 - -- 备份含**全部业务数据与参数种子**,属敏感文件——`db/backups/` 已加入 `.gitignore`,**不要**把它提交到版本库 -- 恢复演练产生的 `payroll_drill_*` 库会占磁盘,核对完及时 `--drop-exec` 清理 -- 备份脚本与恢复脚本都只依赖 Docker(无需宿主机装 MySQL 客户端) -- 增量重放的 `mysqlbinlog` 是唯一需要宿主机(或临时容器)具备的客户端——官方 mysql:8.0 镜像内不含;重放前务必确认 binlog 序号连续(中间断号说明有未归档文件,先跑一次增量归档) diff --git a/docs/待澄清问题清单_2026-10-15(1).xlsx b/docs/待澄清问题清单_2026-10-15(1).xlsx new file mode 100644 index 0000000000000000000000000000000000000000..dd2e2c856782fdb6bef332731f3a8230ea7ee0e4 GIT binary patch literal 16156 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

UF5C+eM=c`Gu587p^wEO>TJTf3=? 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 literal 0 HcmV?d00001 diff --git a/docs/待答复催办清单_2026-10-19.md b/docs/待答复催办清单_2026-10-19.md deleted file mode 100644 index 36d9028..0000000 --- a/docs/待答复催办清单_2026-10-19.md +++ /dev/null @@ -1,95 +0,0 @@ -# 待答复事项催办清单(2026-10-19) - -> **用途**:对外跟催材料,分三块可直接拆分发送——一、业务方;二、IT/T+ 侧;三、报表口径补充确认(本轮新增)。 -> **基线**:《待澄清问题清单_2026-10-15(1)(2).xlsx》(业务 24 项,2026-10-16 已答复 19 项,其中部分答复 3 项;#1–#3/#20 仍空白)、《T+对接数据需求清单》v1.3「待IT确认事项」18 项 + v1.4(2026-10-19 勘误)、《问题与解决方案对照表_v2》(28 项已裁决口径)。 -> **原则**:已答复项不重复询问;未答复项按清单内「建议默认」执行中,答复后以答复为准并回填文档。 - -## 一、业务方(建议回复期限:____) - -### A. 仍未答复 —— 阻塞对应模块开工(4 项) - -| # | 问题(原文口径) | 当前执行默认 | 阻塞 | -| --- | --- | --- | --- | -| 1 | 二次分配的分配标的是什么——绩效工资金额、折算毛利润额,还是销售额(业绩额)? | 方案录入已交付;**分摊已按开发侧暂定口径实现**(非业务答复,答复后校准) | ④ 分摊计算 | -| 2 | 分配比例合计不足 100% 时,剩余部分归属谁? | 余额归合同负责营销人员(仅展示不落库) | ④ 分摊计算 | -| 3 | 二次分配与已作废的「协助 25% 分成」是什么关系? | 独立新机制;协助仍仅记录不核算 | ④ 分摊 | -| 20 | 含税口径:销售/成本/毛利润/运费各项是否含税?价税合计与折扣折让如何处理? | 按不含税口径实现中 | ④ 核算口径终验、⑥ 同步建列(是否建税率/税额列) | - -> 说明:#1–#3 未答复期间,二次分配方案可正常录入与审批;开发侧已按暂定口径把分摊拆行计入绩效(参与人份额×比例、负责人余额),**标的与余额归属仍待业务答复,答复后可能调整**;#20 影响历史算出的绩效是否需要按含税口径重算,越早答复返工面越小。 - -### B. 已有答复但需补具体值 / 勾选(4 项) - -| # | 事项 | 需补充 | -| --- | --- | --- | -| 12 | 经理个人户业绩是否计入其 12.5% 团队基数 | 答复为「做参数可调」,**请给出初始值**:计入 / 不计入(系统已实现为开关参数,当前默认不计入) | -| 14 | 「第 1 天 10‰」实现口径 | 请勾选:**A 仅首日覆盖**(推荐,保「360 天 = 6‰」锚点)或 B 整体平移(破坏锚点)。系统当前按 A 实现(首日 10‰、其余按公式 10 − 天数 × 4/360) | -| 4 | 二次分配方案修改窗口与权限 | 答复「暂定允许修改,走调整单」——请定:首次月结前可改(留痕)?月结后只读、仅走调整单?谁有权改(管理员 / 营销后勤)? | -| 6 | 营销后勤/财务/领导三类角色的账号归属、可见菜单、可操作点 | 答复「先预设角色,需与客户确认」——请给权限清单(三类角色各能看什么、能操作什么)。系统已按最小授权运行:后勤=提交录入,财务=复核+导出,领导=审核只读,营销后勤暂不可见审批列表 | - -### C. 请确认两处勘误(已按勘误实施,需业务回执存档)(2 项) - -| 项 | 原表述 | 现行勘误(v1.4) | -| --- | --- | --- | -| 人员识别 | 「负责营销人员以姓名为唯一识别」 | 改为「以人员编码(工号)为唯一识别、姓名辅助核对」——原表述与「编码为业绩归属唯一锚点(防重名错钱)」矛盾,疑笔误,请确认 | -| 回款↔发货批次 | 「由 T+ 收款分配关系指定,人工辅助」 | 改为「**系统人工指定**(对照表 #18 定稿),T+ 收款分配关系仅作辅助」——主次相反疑漏改,请确认 | - -### D. 2026-10-20 新增:需业务定口径(2 项) - -> 随「审批单内容快照 + 二次分配方案版本化」收口带出,开发侧已按现行默认实现,答复后按答复调整。 - -| # | 事项 | 当前默认(开发侧已实现) | 需确认 | -| --- | --- | --- | --- | -| 25 | **业务硬删除时,方案版本历史是否保留?** | 随业务一并删除(与既有「终态审批单随业务删除一并清理」规则一致)——业务被删后,方案参与人与比例的版本痕迹也不复存在 | 是否需要保留(如留归档表/只留审批单快照),还是维持一并删除 | -| 26 | **离职的历史参与人重新加入方案,是否允许?** | 按新参与人处理:曾参与过但当前不在生效方案里的人,若已离职,重新加入会被「离职人员禁入」拦截 | 是否应放行(把「历史参与过」视为豁免),还是维持按现任职校验 | - -### 已按默认执行、无需回复的项(供核阅) - -\#7 月结审批链默认开启、#8 人工确认回款可手动关闭、#9 调整单同链且跨月需授权、#10 风险预警参数化、#11 待办范围(待审批+同步失败+回款未指定批次)、#13 支付环节 5 默认值、#15 一期仅 FULL 模式、#17 参数查看放开/修改限管理员、#18 企业户 2‰ 回溯、#21 退货当期冲减已结算走调整单、#22 预收/保证金/代收款暂不计入、#23 按到账金额、#24 负绩效照算不归零。 - -## 二、IT / T+ 侧(建议回复期限:____) - -> **2026-10-20 更新**:已用 T+12.3 数据字典完成字段级核对(1,457 页 / 931 张表 / 21,019 个字段),下列问题由 18 项收敛为 **13 项 IT 待确认 + 1 组业务裁决**,每项附字典候选字段。字段级证据与来源页见《T+字段映射草案_v0.1_2026-10-20.md》,完整清单见《T+对接数据需求清单_v1.5_2026-10-20.xlsx》。 - -### A. 待确认(按优先级) - -| 新# | 原# | 事项 | 字典候选(已定位) | 仍需答复 | -| --- | --- | --- | --- | --- | -| 1 | 1 | 成本额字段与成本口径 | SA_SaleOrder_b.LatestCost;SA_SaleDelivery_b.costPrice/costAmount/CostPriceGetType | 取订单最新成本还是出库成本;取数时点与精度 | -| 2 | 2+3 | 发货日与到账日口径 | 发货:voucherdate/SendDate/deliveryDate/auditeddate;到账:voucherDate/auditedDate/createdTime | 分别取哪个字段;签收日/银行到账日能否提供 | -| 3 | 4 | 幂等键与作废重开 | 各表 code + id 主键 | code 是否终身唯一;作废重开是否换号 | -| 4 | 5 | 三单关联与核销路径 | SA_SaleDelivery.SourceVoucherCode、_b.saleOrderCode/saleOrderId;ARAP_ReceivePayment.SaleOrderCode/SaleOrderID;ARAP_StrikeBalance | 主关联路径;分批发货/部分核销如何取 | -| 5 | 6 | 人员编码/工号与经理隶属 | AA_Person.code/name/iddepartment;AA_Department.idparent/iddirector(无直属上级字段) | code 是否即工号;业务员→经理隶属如何维护 | -| 6 | 7 | 对接方式与安全 | 字典不涉及 | REST/视图/中间表/文件;只读账号、接口文档、样例数据 | -| 7 | 8 | 负数/红字/退货/冲销规则 | isCounteractDelivery、returnQuntity/backSentQuantity、voucherstate、ARAP_StrikeBalance | 实际使用形式、原单关联、是否推送 | -| 8 | 9 | 存量起始与增量水位 | updated/createdTime/madeDate/auditedDate/ts | 存量起始日;增量用哪个时间戳;时区 | -| 9 | 10+v1.4#18 | 客户主数据匹配与变更 | AA_Partner.code/name/Contact/representative/disabled/updated | 唯一键;改名/换负责人/合并;负责人取 Contact 还是 representative | -| 10 | 11+16 | 收款方式与确认/核销枚举 | AA_SettleStyle;ARAP_ReceivePayment.IdSettleStyle/cancelState/voucherstate | 完整枚举与以物抵顶代码;核销状态含义与人工确认依据 | -| 11 | 12+13 | 产品数量语义与发货单价 | ST_CurrentStock.baseQuantity;AA_InventoryPrice/AA_InventoryUnitPrice;SA_SaleDelivery_b.price/taxPrice | 数量取现存量/在途/累计销量;发货单价口径与含税 | -| 12 | 14+17 | 低频字段存在性:特殊业务标记/市场拓展计划 | SA_SaleOrder.idbusinesstype;AA_Person 自定义项;未检出市场拓展计划表 | 有无可识别字段/表;无则人工维护 | -| 13 | 15 | 同步窗口 | 字典不涉及 | 每周时间点,避结账/备份;失败重试策略 | - -### B. 口径裁决(1 组,转业务方) - -含税口径、退货红字冲减、预收/保证金/代收、手续费净额、负绩效表述(原 #18,对应《待澄清问题清单》#20–#24)。 - -### C. 已由字典补齐、仅需确认可用性 - -1. **人员编码**:字典已定位 `AA_Person.code`,请确认是否即工号;若为自动内部编码,请指明工号字段。 -2. **客户档案**:字典已定位 `AA_Partner` 主表(编码/名称/联系人/停用/地区等),请确认可提供。 -3. **映射列**:v1.5 清单已回填「T+ 表.字段 / 类型 / 枚举 / 系统目标列」,请按实际环境核对并修正。 - -## 三、报表口径补充确认(2026-10-19 新增,随本轮开发一并排) - -> 报表统计模块(需规 2.4 / FR-029~FR-032)开工在即,以下三项请确认;未答复按「建议默认」实现,后续可调。 - -| # | 事项 | 建议默认(将按此实现) | -| --- | --- | --- | -| R1 | 部门绩效汇总表的「部门」口径 | 部门 = 经理团队(经理 + 其直属业务员),按人员档案的隶属关系展开;离职人员历史业绩留在原团队;经理的 5% 全公司部分单独一列 | -| R2 | 回款统计的「回款天数区间」档位 | ≤0 天(先款后货)|1-30|31-60|61-90|91-180|181-360|361 以上|无回款天数,共 8 档;未命中区间显示 0 | -| R3 | 导出/打印模板要素 | 公司信息页眉(名称+logo)、报表标题、筛选条件、导出时间与导出人、模板版本号、财务复核栏、领导签字栏、日期栏 | - -另:报表查看权限(FR-029 参与者含「营销后勤(授权范围内)」)——请随第一部分 B-6 权限清单一并明确营销后勤是否需要查看报表、可见哪些列。 - ---- - -**发送建议**:第一部分发业务方(含 C 两项勘误确认);第二部分发 IT/T+(v1.4 附表一并);第三部分随开发进度与业务方顺带确认。 diff --git a/docs/部署硬件需求.txt b/docs/部署硬件需求.txt deleted file mode 100644 index b28e5fb..0000000 --- a/docs/部署硬件需求.txt +++ /dev/null @@ -1,241 +0,0 @@ -衍水集团营销人员工资管理系统 -部署硬件需求说明 -================================================================ -版本:v1.0 -日期:2026-10-21 -适用:内部系统部署(数十人并发,无公网访问) -依据:仓库实际运行架构(docker/docker-compose.dev.yml、backend/pyproject.toml、 - backend/app/core/db.py、docs/备份恢复手册.md、ai-aux/AI_CONTEXT.md) - - -================================================================ -一、结论摘要(先看这一节) -================================================================ - -推荐配置:2 核 CPU / 8 GB 内存 / 100 GB SSD(Linux 单机) -最低配置:2 核 CPU / 4 GB 内存 / 100 GB SSD -演示配置:1 核 CPU / 2 GB 内存 / 40 GB SSD(仅限试用,不适合正式使用) - -一句话:内部系统的瓶颈不在 CPU,而在「内存余量」和「磁盘容量」。 - 内存从 4 GB 升到 8 GB 的成本极低,却能一次性消除以后所有内存不足的排查; - 磁盘不要按当前数据量买,要按「备份 + 恢复演练」的双倍空间买。 - - -================================================================ -二、负载前提(为什么是这个配置) -================================================================ - -以下事实全部来自本仓库,不是通用模板: - -1) 内部系统、数十人并发 - 出处:ai-aux/AI_CONTEXT.md:101「并发极低(内部系统数十人)」 - 含义:CPU 核心数不是瓶颈,2 核足以支撑全部并发请求。 - -2) 全栈同步架构 + 单 worker,重活走线程池 - 出处:CLAUDE.md(分层约定)、backend/app/core/db.py:29 - 含义:一个请求占用一个线程;绩效批量核算、Excel 导出会短暂吃满一个核, - 因此要留出至少 1 个空闲核给后端,避免请求排队。 - -3) MySQL 8.0 + Redis 7 双容器,Redis 开启 AOF - 出处:docker/docker-compose.dev.yml:11、:44 - 含义:MySQL 是内存消耗大户(默认配置下性能很差,必须调参); - Redis 只存验证码、Token 黑名单、登录失败计数,用量极小(<50 MB)。 - -4) 备份策略:每日全量 gz + binlog 增量,各自保留 30 天 - 出处:docs/备份恢复手册.md:11 - 含义:磁盘需按「业务数据 + 索引 + 30 天 binlog + 30 份全量备份」计算。 - -5) 恢复演练需恢复到独立临时库 payroll_drill_* - 出处:docs/备份恢复手册.md:45 - 含义:演练瞬间需要约「2 倍数据库体积」的可用空间。 - 这是最容易被低估的一项,磁盘卡着下限买会在第一次演练时爆盘。 - -6) 报表导出用 openpyxl 全量载入内存 - 出处:backend/app/services/report_export.py:18 - 含义:导出大报表时后端进程内存峰值会翻倍,必须在内存预算里留余量。 - - -================================================================ -三、正式生产推荐配置(内部系统,数十人) -================================================================ - -项目 规格 说明 ----------------------------------------------------------------- -CPU 2 核(推荐 4 核) 2 核给容器与 MySQL, - 1 核给 uvicorn(workers=2 上限), - 1 核余量给系统与备份任务。 - -内存 8 GB(最低 4 GB) 8 GB 才有余量承受 - 「导出 + 核算 + 备份」同时发生。 - -磁盘 100 GB SSD(推荐 200 GB) 必须是 SSD。HDD 上 MySQL 的 - ON UPDATE CURRENT_TIMESTAMP - 高频写入会明显拖慢。 - -网络 内网千兆 无需公网 IP、域名、SSL 证书、CDN。 - -操作系统 Linux 推荐 Ubuntu 22.04 LTS / Rocky 9。 - (Ubuntu 22.04 / Rocky 9) 备份、恢复、巡检脚本全部是 .sh - (scripts/ 目录),Linux 为原生路径。 - 若必须用 Windows Server,需 2022 + - WSL2 或 Git Bash 运行脚本。 - - -================================================================ -四、内存分配明细(8 GB 的具体切法) -================================================================ - -组件 建议占用 关键设置与说明 ----------------------------------------------------------------- -MySQL 8.0 3.5 GB innodb_buffer_pool_size = 2G - ★ 默认仅 128 MB,不调会大量走磁盘, - MySQL 会成为整机最慢的一环。 - -后端 uvicorn 1.5 GB workers = 2 - 报表导出时单 worker 峰值可达 600 MB ~ 1 GB - (openpyxl 全量载入内存)。 - -Redis 7 256 MB maxmemory 256mb - 实际用量 < 50 MB,设置上限只为兜底防失控。 - -Nginx + 系统 1 GB 静态资源(前端 dist)+ 反向代理 /api。 - -余量 1.75 GB mysqldump 备份进程、binlog 压缩、系统缓存。 - ----------------------------------------------------------------- -4 GB 内存版(最低配置)的分配: - MySQL 1.5~2 GB(innodb_buffer_pool_size = 1G) - 后端 0.8~1 GB - Redis 128 MB(maxmemory 128mb) - Docker + Nginx + 系统 0.6 GB - 余量 ~0.6 GB - ★ 这是「刚好够用」,一旦「导出报表」与「每日备份」撞在同一时刻, - OOM Killer 会优先杀 MySQL。这就是推荐 8 GB 的原因。 - - -================================================================ -五、磁盘空间算式(100 GB 的来历) -================================================================ - -项目 估算占用 ----------------------------------------------------------------- -业务数据(数十人,5 年) ≈ 1 GB -索引 + binlog 30 天(ROW 格式) ≈ 5 GB -全量备份 30 份(gz,约数据量 20%) ≈ 6 GB -恢复演练临时库(峰值 = 2 倍数据量) ≈ 2 GB -系统 + Docker 镜像 + 应用日志 ≈ 25 GB ----------------------------------------------------------------- -合计 ≈ 39 GB - -结论:100 GB 可支撑 2~3 年不需扩容。 - 按 docs/备份恢复手册.md:87 的 80% 磁盘水位告警,100 GB 有充足缓冲。 - - -================================================================ -六、内部部署必须调整的四项(现有配置存在隐患) -================================================================ - -1) 数据库端口必须收敛,不能监听所有网卡 - 现状:docker/docker-compose.dev.yml:27 为 "3306:3306", - :48 为 "6379:6379",等价于绑定 0.0.0.0。 - 风险:内网任何一台办公电脑都能直连 MySQL 试 root 密码。 - 改法(二选一): - A. 只允许宿主机访问 - ports: - - "127.0.0.1:3306:3306" - - "127.0.0.1:6379:6379" - B. 后端与数据库在同一 compose 网络内时,直接删掉这两行 ports, - 容器之间通过服务名互访,宿主机只暴露 80/443。 - -2) 前端必须构建成静态文件 + Nginx 反向代理 - 禁止把 vite dev 服务器当正式环境用: - 开发服务器会暴露全部源码,且不提供任何访问控制。 - 正式做法:pnpm build 产出 frontend/dist,由 Nginx 托管, - /api 反向代理到后端 8000 端口。 - -3) 备份必须异地留一份 - 内部系统最常见的「数据全丢」场景就是单机故障。 - 在 scripts/backup_full.sh 之后追加一步 rsync 到 NAS 或公司文件服务器。 - -4) 提前预留反向代理层 - 不接公网就不需要 WAF / CDN / SSL。 - 但如果公司后续有统一域名单点登录(SSO)规划, - Nginx 反代层要提前留好,避免到时大改架构。 - - -================================================================ -七、三档速查表 -================================================================ - -场景 CPU 内存 磁盘 备注 --------------------------------------------------------------------------------- -试用 / 演示(< 5 人) 1 核 2 GB 40 GB SSD 仅跑小数据量; - 导出大报表会 OOM - -正式内部(数十人) 2 核 4 GB(建议 8 GB)100 GB SSD 推荐方案 -【推荐】 - -内部 + 冗余 4 核 ×2 8 GB ×2 200 GB SSD ×2 含从库与监控; -(从库 + 监控) 工资系统若需 - 审计级可靠性 - 值得投入 --------------------------------------------------------------------------------- - - -================================================================ -八、可选加速项(非必须) -================================================================ - -1) 图表库已本地化 - ECharts 静态文件已放在 docs/design/echarts.min.js, - 前端自托管即可,不依赖外网 CDN,符合「内网加载不可靠」的既定决策。 - -2) 日志盘分离 - 若开启审计日志长期留存,把 backend/logs/ 挂载到独立磁盘, - 避免日志写满系统盘导致 MySQL 无法写入。 - -3) 备份异地化 - 本机备份 + 定时 rsync 到 NAS 或对象存储,构成「本地 + 异地」两份。 - - -================================================================ -九、生产环境仍需完成的事项(本文件之外) -================================================================ - -1) 生成 docker/docker-compose.prod.yml: - - 端口收敛到 127.0.0.1 - - MySQL innodb_buffer_pool_size 等参数调优 - - 容器 mem_limit / cpus 资源限制 - - Nginx 反向代理静态前端 + /api - -2) 后端启动参数由开发模式改为生产模式: - - 去掉 --reload(生产环境必须去掉) - - 设置 workers=2 - -3) backend/.env 中 APP_SECRET_KEY 必须换成强随机值, - MYSQL_PASSWORD / REDIS_PASSWORD 两处(docker/.env 与 backend/.env)保持一致。 - -4) 首次部署执行 alembic upgrade head,并创建管理员账号: - uv run python -m app.cli create-admin --username admin - -5) 配置每日定时任务:全量备份 + 增量归档(见 docs/备份恢复手册.md) - - -================================================================ -十、附:数据来源索引 -================================================================ - -ai-aux/AI_CONTEXT.md:101 并发规模判断(数十人) -docker/docker-compose.dev.yml:11 MySQL 8.0 容器 -docker/docker-compose.dev.yml:27 MySQL 端口映射(需收敛) -docker/docker-compose.dev.yml:44 Redis 7 容器与 AOF -docker/docker-compose.dev.yml:48 Redis 端口映射(需收敛) -backend/app/core/db.py:29 同步引擎与连接池配置 -backend/app/services/report_export.py:18 报表导出(内存峰值来源) -docs/备份恢复手册.md:11 备份策略 -docs/备份恢复手册.md:45 恢复演练临时库 -docs/备份恢复手册.md:87 磁盘水位 80% 告警阈值 -scripts/ 备份 / 恢复 / 巡检脚本(.sh) - -================================================================ -(文件结束) diff --git a/docs/项目阶段报告_2026-10-20.md b/docs/项目阶段报告_2026-10-20.md deleted file mode 100644 index 2575ba0..0000000 --- a/docs/项目阶段报告_2026-10-20.md +++ /dev/null @@ -1,80 +0,0 @@ -# 衍水集团营销人员工资管理系统项目阶段报告 - -- **报告日期**:2026-10-20 -- **报告范围**:M4 ⑤ 报表统计、⑧ 工作台完成情况与 M4 收尾结论 -- **项目分支**:`feat/m3-increments`(已合并 `main`,merge commit `3611474`) -- **阶段结论**:除 ⑥ T+ 数据同步受外部答复阻塞外,十大功能块全部交付;后端全量 **862 用例通过**,报表、工作台、核算月结三条 e2e 链路实跑通过。 - -## 一、3P 阶段摘要 - -### Progress(进展) - -M4 两块(⑤ 报表统计、⑧ 工作台)已完成并通过 code-review 修复。报表侧交付个人绩效明细、部门汇总、业务统计、回款统计四张报表、Excel 签字导出与独立打印视图;工作台侧交付经营总览、待办事项、风险预警、最近动态四区块,待办与预警实时派生并参数化。本阶段同时完成 M4 修复批次的提交、全量回归与 e2e 实跑,开发计划 3.3 答复状态已回填。 - -### Plans(计划) - -下一步优先解析 T+12.3 数据字典,形成六类单据字段映射草案并自答 IT 清单中可自答部分;~~其次补齐 code-review 遗留的方案版本承载与审批单快照~~(已于 2026-10-20 完成,V11);需规 V2.2 修订与对照表回填择期进行。 - -### Problems(问题) - -⑥ T+ 数据同步仍受 IT 18 项答复阻塞,同步失败类待办/预警暂以「模块未启用」显式降级。业务方仍有 #1–#3 二次分摊、#20 含税口径、#4/#6/#12 补值与两处勘误待确认;审批角色权限细目未给出,当前按 `role_code` 粗粒度运行。需规仍含已作废条款,对外引用需注明以对照表/计划第三章为准。 - -## 二、阶段定位与完成度 - -| 维度 | 当前状态 | 说明 | -| --- | --- | --- | -| 项目阶段 | 开发收尾期 | M1–M3 与 M4 ⑤⑧ 已交付,仅 ⑥ 待外部输入 | -| 整体完成度 | 90% | 十大功能块交付;⑥ 按 0% 计入 | -| 交付主线 | M4 报表统计 + 工作台 | 前后端闭环,已合并 main | -| 质量状态 | 全绿 | 后端 862 passed(11:32);e2e role_home 4/4、report 12/12、calc_settlement 8/8 | -| 主要风险 | 外部对接与口径变更 | T+ 映射未定;含税口径未答复可能触发历史绩效重算 | - -## 三、已完成成果 - -### 1. 报表统计(M4 ⑤) - -- 四表接口 `/api/v1/reports/*`:个人绩效明细、部门绩效汇总、业务统计、回款区间统计。 -- 部门归属按 `personnel.manager_id` 实时上溯;回款区间 8 档(≤0 / 1-30 / 31-60 / 61-90 / 91-180 / 181-360 / 361+ / 无天数)。 -- 全公司 5% 按「有聚合行经理各计一次」计算,并与月结 `total_payable` 对拍;对账块单列聚合行舍入差。 -- Excel 签字导出(openpyxl + StreamingResponse,ASCII 文件名)与独立打印视图(五块结构、每页表头、签字栏)。 -- 权限 `admin/finance/leader` 前后端双层。 - -### 2. 工作台(M4 ⑧) - -- 单端点 `/api/v1/dashboard` 一次返回四区块:经营总览、待办事项、风险预警、最近动态。 -- 待办与预警**实时派生**(不落表、不引调度器);待办按角色过滤;逾期预警排除已终止业务。 -- 预警阈值参数化:`warning.enabled`、`warning.receipt.overdue.days=90`、`warning.approval.timeout.days=3`(V10,参数注册表 22 项)。 -- 前端 `/dashboard` 四区块 + ECharts 5.6 按需引入(SVG,显式思源黑体,规避 Windows 默认雅黑)。 -- 普通用户落地页统一由 `router/access.ts` 解析(工作台 → 业务数据 → 回款),修复无限重定向。 - -### 3. 质量与收尾 - -- 后端全量 `uv run pytest -q` → **862 passed(11:32)**;`pnpm type-check` 与 `pnpm build` 通过。 -- e2e 实跑:`role_home_flow` 4/4、`report_flow` 12/12、`calc_settlement_flow` 8/8;`report_flow` 回款统计改为按本次业务编号下钻断言,脚本可重复运行。 -- 运行后核对:月结审批开关恢复为 1,无 `e2e_role_*` 残留账号。 -- 开发计划 3.3.1 与《待确认事项汇总》已按 24 项答复分组回填(13 默认 / 4 按答复 / 3 部分 / 4 开放)。 - -## 四、当前进行中工作 - -无。M4 代码与文档已提交并合并 `main`(`3611474`)。 - -## 五、下一步计划 - -1. **T+ 同步前置**:解析 `docs/T_12.3数据字典/`,产出人员/产品/业务/发货/回款/客户六类字段映射草案,自答 IT 18 项中可从数据字典确认的部分。 -2. ~~**code-review 遗留 2 项**:方案生效版本承载、审批单内容快照(orders 加方案 JSON 快照列 + 前端详情展示)。~~ ✅ 已完成(2026-10-20,V11 迁移):方案行版本化 + 审批单版本号/内容快照 + 前端展示。 -3. **需规 V2.2**:修订 26 天示例、含运费公式、协助 25% 等过时条款,回填 2026-10-15 补充需求;对照表 v2 收编 24 项答复。 -4. **清理类**:5 处超长函数、散参数 DTO、`useDropdownOptions` 余两页、前端菜单图标。 -5. **待外部输入**:业务方催办、审批权限清单、IT 18 项答复。 - -## 六、风险与应对 - -| 风险 | 影响 | 应对 | -| --- | --- | --- | -| IT 答复持续缺失 | ⑥ 无法开工,同步类待办/预警无法真实展示 | 先做数据字典映射草案;催办清单已含高优 9 项与三缺口 | -| 含税口径(#20)改变 | 历史绩效可能需要重算 | 当前按不含税实现;答复后评估重算范围并授权留痕 | -| 二次分摊口径(#1–#3)改变 | 已生成台账/月结可能需要调整 | 暂定口径已标注;变更走口径调整,重算需授权留痕 | -| 需规含作废条款 | 对外交付物误导 | 引用以对照表/计划第三章为准;V2.2 修订前排期 | - -## 七、报告结论 - -M4 报表统计与工作台已完成交付并合并 `main`,系统除 ⑥ T+ 数据同步外具备完整业务闭环。质量证据充分(全量测试与三条 e2e 链路),剩余工作以外部输入与审计性技术债为主,可按计划推进。 diff --git a/tasks/archive/2026-10-27-tplus-sync-plan.md b/tasks/archive/2026-10-27-tplus-sync-plan.md new file mode 100644 index 0000000..ec16112 --- /dev/null +++ b/tasks/archive/2026-10-27-tplus-sync-plan.md @@ -0,0 +1,65 @@ +# 下一阶段开发计划:T+ 关联核验与同步管理 + +日期:2026-10-27。用户已选择“关联核验与同步管理”,并授权按计划实施。 + +## 本轮目标与当前证据 + +已有 933,203 条九类源数据快照,两轮去重通过;同步仍只有命令行入口。管理员需要查看批次、进度和异常,并能发起读取、关联核验和失败重试。 + +本轮补齐这条管理流程,同时用真实只读账套确认枚举和关联覆盖。工资业务表写入、退货计提、成本/日期口径及时间增量继续等待业务确认;不把本轮完成解释为整个项目已可交付。 + +## 设计决定 + +- 沿用 FastAPI、同步 SQLAlchemy、MySQL、Vue 3 和现有样式;不引入队列依赖。 +- HTTP 只创建持久化 QUEUED 任务并立即返回;独立 CLI worker 处理长任务,避免请求等待大量数据读取,也避免依赖进程内 BackgroundTasks。 +- 同一账套的读取和核验由 MySQL 连接级命名锁串行执行;CLI 直接读取与 worker 共用锁。进程中断留下的 RUNNING 记录只有在取得锁、确认无执行者后才可判失败并恢复。 +- 新批次记录实体范围、重复条数、来源重试批次、请求幂等键、请求人和核验结果。历史缺失元数据保持未知,不从名称/金额猜测。 +- 关联核验从 SM_VoucherType/eap_EnumItem 读取类型和状态,按单据类型关联收款明细与销货单、销售订单;不按客户名称或金额拼接,不自动分摊回款。 +- 只存系统字典、结构和数量汇总,不向页面返回 staging 的原始 payload、源连接参数或原始异常 SQL。 +- 连接默认关闭。可显式指定 D 盘的本地只读连接文件,不把凭据复制进项目配置或 HTTP 请求。 +- SQL Server 2008 R2(10.50.x)仍是交付目标;源查询保持旧版语法,2022 PoC 不能通过同版本验收。Docker 磁盘镜像位置保持不变。 + +## 接口合同 + +统一前缀 `/api/v1/system/tplus`,全部要求管理员,响应沿用 `{code,message,data}`;业务字段用蛇形,分页用 `pageNum/pageSize` 与 `list/total/pageNum/pageSize`。 + +| 接口 | 用途 | +|---|---| +| GET `/overview` | 配置可用性、任务数量、累计新增快照、最近关联核验概要;不查询源库 | +| GET `/batches` | 批次分页,按状态/任务类型筛选,按 id 倒序 | +| GET `/batches/{batch_no}` | 批次详情,含执行范围、重试关系和已脱敏核验结果 | +| GET `/batches/{batch_no}/errors` | 本批异常分页,可按实体筛选;不返回原始 payload | +| POST `/batches` | 创建 READ 或 AUDIT 任务;READ 指定白名单实体,AUDIT 不接受实体范围 | +| POST `/batches/{batch_no}/retry` | 仅重试 FAILED/PARTIAL;创建新批次并保留原批次,无法确定范围的历史记录需重新选择范围 | + +创建/重试请求携带 UUID `request_key`。数据库唯一约束原子保护;同键同意图返回原批次,同键不同意图返回 400。重试锁定父批次;同请求键复用已有任务,不同请求键遇到已有 QUEUED/RUNNING 重试时返回明确的 400,防止重复排队且不混淆幂等意图。 + +任务状态为 `QUEUED/RUNNING/SUCCEEDED/PARTIAL/FAILED`。成功/失败计数只反映原始读取,不伪造业务导入成功。重试依靠全量快照去重,时间水位保持禁用。 + +CLI 提供 `tplus-worker --once/--watch`,可处理读取和核验;原 `tplus-stage` 保持可用。worker 无任务时退出或等待;配置缺失、源连接失败、字段不符均写入任务失败记录。 + +## 实施任务与依赖 + +1. 核验查询与报告:固化系统枚举、收款方向、带类型的销货/订单关联和歧义统计;真实只读库执行,产出映射 v0.3 和客户确认单。 +2. 元数据迁移:新增批次范围/幂等键/重试关系/核验结果等字段;Alembic、V15 SQL、初始化脚本及模型同步,旧记录可读。 +3. 执行协调:实现队列创建、幂等与重试;共用命名锁、worker 和中断恢复,不修改工资业务表。 +4. 管理查询服务:批次/异常分页、详情和汇总,只返回受控字段;列表不加载核验结果大字段。 +5. 管理 API:管理员认证、请求校验、统一响应、创建/重试审计、源配置关闭时的可操作错误。 +6. 同步管理页面:接入实际接口,展示批次/异常/核验结果;支持选择读取范围、排队、失败重试和刷新,管理员菜单与后端权限一致。 +7. 真实流程验收:用只读副本做一次关联核验和小范围人员重读;浏览器验证筛选、详情、空态、重试、权限及响应式。 +8. 回归与交接:隔离数据库/Redis 验证迁移、服务/API;前端类型检查与构建,更新模块文档、上下文和本清单。 + +详细验收和执行状态记录在 `tasks/todo.md`。每个任务先完成定点测试,再进入依赖它的任务;本轮不自动提交、推送或部署。 + +## 验收与保留门槛 + +- 真实字典和关联数量有可重跑 SQL、源版本与时间证据;遇到多订单、无类型或金额分摊规则未定时明确保留待确认。 +- 相同请求不重复创建任务,同账套不并发执行;失败重试保留原记录并不重复写入相同快照。 +- 管理员可以完成“排队 → worker 执行 → 查看结果/异常 → 重试”流程,非管理员后端 403、前端无菜单。 +- 页面不显示凭据、原始个人信息、SQL 异常或误导性的“业务导入完成”;配置关闭、空态、加载和失败状态可见。 +- 测试只使用隔离的 MySQL/Redis;运行时核验只读 T+ 副本,业务数据表不接入写入。 +- 真正的 2008 R2 环境安装仍缺合法 Windows/SQL Server 安装介质;该项作为后续交付前置,不伪造完成。 + +## 项目后续路线 + +完成本轮后,依据客户确认的成本、日期、人员/客户/产品分类、单据有效范围和回款分摊规则,再实施业务表导入。取得合法介质后安装 D 盘虚拟机并执行完整 2008 R2 验收;随后才启用真实增量、每周任务和部署交付。 diff --git a/tasks/archive/2026-10-27-tplus-sync-todo.md b/tasks/archive/2026-10-27-tplus-sync-todo.md new file mode 100644 index 0000000..c926f02 --- /dev/null +++ b/tasks/archive/2026-10-27-tplus-sync-todo.md @@ -0,0 +1,52 @@ +# T+ 关联核验与同步管理任务清单 + +所有任务依照 `tasks/plan.md`。本轮已完成;真正 2008 R2 验收与客户业务确认保留为下一阶段门槛。 + +## 1. 真实枚举与关联核验 +- [x] 固化 SQL Server 2008 R2 语法的只读核验查询,按单据类型区分销货、费用、期初应收和收入。 +- [x] 对收款行 → 销货单/明细 → 订单进行覆盖、悬空和歧义计数,不按名称/金额拼接。 +- [x] 真实副本执行并生成映射 v0.3、客户确认单;仅记录系统字典和汇总。 +- 验证:源查询实跑,报告无凭据或客户个人信息。依赖:无。预计 3–5 文件。 + +## 2. 批次元数据迁移 +- [x] 记录实体范围、跳过数量、幂等键、父批次、请求人和核验结果,旧批次可读。 +- [x] 同步 Alembic、V15、初始化脚本和模型;空库迁移及旧库升级通过。 +- 验证:模型与 DDL 测试、隔离库迁移。依赖:无。预计 5 文件。 + +## 3. 队列、串行执行与重试 +- [x] READ/AUDIT 任务持久化排队;同键同意图复用,同键异意图拒绝。 +- [x] 共用命名锁防并发,worker 支持 once/watch,原 CLI 入口保持可用。 +- [x] 锁定父批次防重复重试;中断记录仅在无执行者时恢复,异常不泄漏源参数。 +- 验证:先失败测试再实现;真实隔离 MySQL 并发与 worker 定点核验。依赖:1、2。分服务/CLI 两批实施。 + +## 检查点 A +- [x] 核验、迁移与执行服务定点通过;工资业务表写入仍关闭。 + +## 4. 管理查询与接口 +- [x] 分页查询批次、详情和异常,列表不加载核验 JSON/原始 payload。 +- [x] 管理员接口与创建/重试审计完成,参数校验和源配置关闭行为明确。 +- [x] 汇总能区分暂存完成与 2008 R2/业务口径待确认。 +- 验证:隔离 API 测试覆盖 401/403/400/404、分页、幂等和重试。依赖:3。分查询层、API 两批实施。 + +## 5. 同步管理页面 +- [x] 管理员菜单、概况、批次表、异常详情和关联结果接入实际 API。 +- [x] 创建读取/核验、失败重试、刷新与筛选可用;状态均为业务中文。 +- [x] 空态、加载、异常、配置关闭、权限与小屏布局可验证。 +- 验证:Vue 类型检查、生产构建、真实浏览器。依赖:4。分 API/路由、页面两批实施。 + +## 检查点 B +- [x] “排队 → 执行 → 查看 → 重试”完整流程有实际运行证据。 + +## 6. 完整验证与文档 +- [x] 真实副本关联核验与人员重读通过,重复快照不新增;非管理员被拒绝。 +- [x] 定点及必要回归、迁移、Ruff、类型检查、构建和浏览器检查通过。 +- [x] 模块 README、字段确认材料、AI_CONTEXT、PROJECT_PROGRESS 和本清单更新。 +- [x] 完成逐项验收;未完成的 2008 R2 环境和业务确认明确列为交付前置,不计入本轮已完成项。 +- 依赖:1–5。 + +## 验收证据(2026-10-27) + +- 单元 602 项,管理/并发/结构定点 18 项,Ruff、类型检查、构建通过;完整回归中的环境覆盖影响已独立复验。 +- D 盘 reports/management_verification_2026-10-27.json:人员去重、关联检查、六类业务表行数不变。 +- ai-aux/preview/tplus/verification.json:浏览器真实流程与四档宽度;模拟状态另见 state-verification.json。 +- V15 隔离库回滚/升级通过;head=e5f607a8b9c0。运行步骤、映射和客户确认材料均已更新。 diff --git a/tasks/plan.md b/tasks/plan.md new file mode 100644 index 0000000..95bead2 --- /dev/null +++ b/tasks/plan.md @@ -0,0 +1,56 @@ +# 下一阶段开发计划:T+ 数据导入与同版本验收 + +日期:2026-10-28。基于关联核验与同步管理轮次完成后的实际情况制定;上一轮计划与任务清单已归档至 `tasks/archive/2026-10-27-tplus-sync-*.md`。 + +## 当前实际状况 + +- 同步管理已完成:批次/异常/重试/锁/页面验收通过;staging 累计 933,203 行,六类工资业务表尚未接入写入。 +- 口径进展:澄清清单 24 项答复基本到齐;对照表 v2 已裁决经理个人户(#7)、协助 25%(#6/#15)、信息员(#9)、企业户 3‰(#20)等冲突。9.8 方案中蓝色字体标注的原方案算法作废,毛利润率按不含运费口径执行。 +- 仍未确认:含税取数、预收/保证金/代收、二次分配三项、三级角色职权,连同 T+ 口径 13 项与环境接入 5 项,已整理于 `docs/待确认事项清单_2026-10-28_v2.xlsx`(L1–L7)。 +- 经理个人户:微信沟通确定按 9.8 方案执行、不计个人户部分,客户群确认中;系统参数已预留,确认后调整参数即可,无需开发。 +- 环境差距:合法 Windows 与 SQL Server 2008 R2 安装介质未到位,D 盘虚拟机仅有外壳;当前分支约 65 个文件未提交。 + +## 目标与顺序 + +先收口工程,再并行推进同版本环境验收与客户口径确认;口径闭环后实施 staging 到工资业务表的导入,最后交付托管与部署。 + +### P0 工程收口(无外部依赖,立即执行) + +1. 将本轮 T+ 同步管理成果按迁移、后端服务、前端页面、文档拆分为规范提交;合入前本地构建与测试通过。 + +### 轨道 A:同版本验收环境(外部依赖:安装介质) + +- A1 先行细化 `docs/SQLServer2008R2测试环境.md`:装机步骤、恢复步骤,以及驱动、只读权限、六类查询、中文/日期/金额、断连超时、重复同步的验收清单。 +- A2 取得合法介质后,在 `D:\work\app\tplus-vm` 完成系统与数据库安装。 +- A3 恢复原始备份并执行完整验收,产出报告,关闭同版本兼容 PENDING 状态。 + +### 轨道 B:业务口径确认(外部依赖:客户填写) + +- B1 发送 v2 清单:客户填「客户确认单-精简版」,IT/服务商填材料项;L1(含税取数)、L2(预收等)与确认单 #1/#3/#6 一并答复,避免重复提问。 +- B2 跟进客户群对经理个人户的反馈,回填 L6。 +- B3 答复回收后更新字段映射文档与暂定口径记录:二次分配三项(L3–L5)追认、三级角色职权(L7)在页面验收时核对。 + +### 轨道 C:T+ 数据导入开发(依赖轨道 B 闭环;设计可先行) + +- C1 先行起草「staging → 业务表写入」设计:表映射、金额精度(金额用 Decimal、比例和日斜率用 Fraction)、幂等与重算授权留痕、人工字段保护(回款/发货批次由系统人工指定,业务归属变更不回溯历史)、事务边界;明确标注等待确认的差异点,口径闭环后评审定稿。 +- C2 主数据导入(人员、客户、产品):依赖 #9、#10、#11。 +- C3 订单 → 发货 → 回款导入:依赖 #1–#8、#13(成本、日期、分摊、核销、初始化)。 +- C4 负向事件处理(退货、红冲、负绩效):依赖 #8;口径已定为负绩效照公式出数、不归零。 +- C5 增量变更发现:依赖 #13;收付款表无 `updated` 字段,需验证 rowversion 与删除/作废的发现方式,在此之前时间水位保持禁用。 + +### 轨道 D:交付收尾(依赖 A3 与轨道 C 完成) + +- D1 `tplus-worker` 服务托管(Windows 服务方案)。 +- D2 每周同步任务编排与失败告警。 +- D3 客户内网独立部署与最终验收。 + +## 验收与保留门槛 + +- 未确认项不进入正式核算;确认单未闭环前不实施业务表写入。 +- 导入保护人工字段;每笔回款只核算一次;重算须授权并留痕。 +- 2008 R2 验收未完成前,2022 恢复副本的结果不作为同版本兼容证据。 +- 每个任务先完成定点测试再进入依赖任务;回归使用隔离的 MySQL/Redis。 + +## 项目后续路线 + +轨道 C 完成、A3 通过后进入轨道 D;部署验收通过即转入运维期(每周同步、参数调整走系统设置与版本管理)。 diff --git a/tasks/todo.md b/tasks/todo.md new file mode 100644 index 0000000..e4844e0 --- /dev/null +++ b/tasks/todo.md @@ -0,0 +1,38 @@ +# T+ 数据导入与同版本验收任务清单 + +依照 `tasks/plan.md`(2026-10-28)。上一轮清单已归档至 `tasks/archive/2026-10-27-tplus-sync-todo.md`。 + +## P0 工程收口 +- [ ] 拆分提交本轮 T+ 同步管理成果(迁移、后端、前端、文档);提交前 Ruff、单元测试、前端类型检查与构建通过。 +依赖:无。 + +## 轨道 A:同版本验收环境 +- [ ] A1 细化 2008 R2 测试环境与验收手册(无介质可先做)。 +- [ ] A2 取得合法介质并完成虚拟机安装。 +- [ ] A3 恢复原始备份并执行完整验收,产出报告。 +依赖:A2 等介质到位;A3 依赖 A2。 + +## 轨道 B:业务口径确认 +- [ ] B1 发送 `docs/待确认事项清单_2026-10-28_v2.xlsx` 并跟进填写。 +- [ ] B2 回填经理个人户客户群反馈结果(L6)。 +- [ ] B3 答复回收后更新映射与暂定口径记录。 +依赖:无;B1 立即可发。 + +## 轨道 C:T+ 数据导入开发 +- [ ] C1 起草 staging → 业务表写入设计,标注等待确认的差异点。 +- [ ] C2 主数据导入实现与测试。 +- [ ] C3 订单/发货/回款导入实现与测试。 +- [ ] C4 负向事件处理实现与测试。 +- [ ] C5 增量变更发现方案与验证。 +依赖:C1 无前置,可先行;C2–C5 依赖轨道 B 闭环与 C1 评审。 + +## 轨道 D:交付收尾 +- [ ] D1 worker 服务托管。 +- [ ] D2 每周同步任务与失败告警。 +- [ ] D3 客户内网部署验收。 +依赖:A3 与轨道 C 完成。 + +## 检查点 +- [ ] 检查点 A:口径确认全部闭环(确认单 13 项 + 材料 5 项 + L1–L7)。 +- [ ] 检查点 B:主数据导入通过,业务表首次写入可回滚。 +- [ ] 检查点 C:全量导入与 2008 R2 验收通过,进入轨道 D。