# 产品原字段还原与选填实施记录 ## 正式发布:2026-10-14 原16字段已生效 用户已授权正式服务器一起处理并部署,版本20261014-product-original-r1。产品表实际29列,其中bank_logo31条均为空;现恢复为原16字段,15个扩展列移除,仍使用的匹配配置保留在原文本字段,expectation/quota恢复说明。31产品及状态保持,6旧日期边界解除并递增版本;其余28业务表和历史报告保持。17配套文件已上线,入口与worker恢复,小程序由用户发行。 本地613项迁移/产品回归与14项发布工具边界通过,正式131项源码/依赖摘要、产品内容/版本和其他业务表一致性、HTTPS与回退预检通过;没有真实模型调用、合成业务导入或提交。完整旧表、源码和私密备份留存于/root/airz-product-original-20261014及D:/AAdesk/202609/airz-backups/production-release/airz-product-original-20261014。恢复必须保护后续数据并使用本轮回执,不能整库覆盖。下方未部署、未转换、仅编辑解除日期为历史记录。 ## 后续调整:移除管理端生效与失效日期 2026-10-13:按用户要求删除新增/编辑页的生效日期、失效日期输入,产品开放状态通过上架/下架控制。保存及发布预检由控制器统一显式设置两日期为NULL,防止旧日期隐藏后继续生效,也不接受客户端补传日期恢复自动到期。旧产品下一次编辑保存时解除限制;本轮不批量改写旧数据,不删除内部兼容字段,不重算历史冻结报告。旧规则保护、版本冲突与16/28字段兼容保持。 622项本地检查通过:565项纯内存编辑/发布/存储/匹配回归,新16/旧28字段实际事务保存各12项,Chrome桌面与窄屏交互33项;覆盖旧过期/未来日期解除、预检与保存一致、手动上下架、补传日期覆盖及旧窗口拒绝。截图:[移除日期后的基本信息](D:/AAdesk/202609/airz-backups/product-remove-dates-20261013/admin-no-dates-desktop.png)。修改前备份、测试日志、源码摘要及清理回执保存在D:/AAdesk/202609/airz-backups/product-remove-dates-20261013。未部署、正式库访问、模型调用或提交;下方日期选填描述为历史记录。 ## 后续调整:地区、用途统一到条件列表 2026-10-13:按用户最新要求移除独立“地区与用途”,经“添加条件”选择或手输入名称;已有地区/用途在条件列表回显,删除后更新对应配置。已知名称仍使用固定规则;自定义名称、比较方式、文字要求、对象及说明保存到原other内的可选manualConditions,不增加表列或融资项。自定义条件按对象提示待核实、不自动满足、不计软评分、不进入推荐排名;原硬条件不符仍不推荐。旧冻结报告不重算。 本轮1013项检查通过:管理端实际选择/手输/多选回显/保存/删除/重复及空行拦截/旧规则保护与重建42项,纯自定义29项、实际假模型任务和已保存报告12项,现有编辑/发布/匹配/评分/规则/选填/存储及16/28字段兼容715项,历史报告/PDF215项。桌面1280×900、窄屏390×844页面及交互通过,无应用控制台错误/警告。PHP/JS语法和差异空白检查单独记录;失败或重复运行不累计,不与下方前轮2120项相加。 源码及页面证据:D:/AAdesk/202609/airz-backups/product-condition-input-20261013;[空条件界面](D:/AAdesk/202609/airz-backups/product-condition-input-20261013/admin-empty-desktop.png)、[已添加条件](D:/AAdesk/202609/airz-backups/product-condition-input-20261013/admin-conditions-desktop.png)。仅本地修改后端/管理端,未部署、迁移正式库、提交或调用真实模型。两仓既有改动保留;资源清理见cleanup.json。 2026-10-13,用户明确选择“表字段尽量恢复原版,匹配配置存入原有文本字段”。本节取代前轮范围待选状态,下方保留日期选填阶段历史。 用户已选择恢复16个原字段名,匹配参数、可选日期和内部版本收纳到原other文本配置;expectation/quota恢复为额度/期限说明。管理端仅产品名称、适用对象为基本必填(新建默认企业),机构/类型/来源/额度/期限/利率/日期等可空,填写后仍校验;资料不足显示待核实,不进入推荐排名。保留InnoDB事务、varchar(100)产品名与状态默认草稿,旧冻结报告不重算。 本轮只在专用本机合成MySQL/Redis/HTTP/H5环境验证,不读取正式.env、不访问正式库、不调用真实模型、未部署/提交/推送。正式产品表仍未迁移;发布应配套后端与管理端,不能只覆盖原三个文件。小程序仍由用户发行,真机、正式数据预检和用户验收尚未完成。 ## 存储和管理端 新库产品表使用全部16个原字段名;ProductStorage包装额外参数到other的product-storage-v1 JSON,同时保留other原文或原型评分配置,condition/grade/information/recommendation/deprecated原文保持。旧28字段表兼容读取/保存;切换前独立列优先,切换后读配置。金额仍为元十进制字符串,管理端数值以万元录入;原额度/期限说明不推算数值。未提供的上下限不生成规则,单边值显示最低/最高。 生效空值不限制开始日期,失效空值不自动到期;明确填写的格式、顺序、未来/过期逻辑保持。地区/来源待核实时允许保存上架展示,但结果为unknown、rank为空;仅原准入说明不能当作结构化条件已满足。基础分80可配置、满足软条件加减分且限制0—100、硬条件不符不推荐保持。融资28项不扩展,产品原文AI分析不恢复。 模型保存统一事务/行锁、合并局部更新、递增内部版本和表单冲突检测。迁移工具默认只读,显式目标/私密配置;超长、损坏、未知列、目标不符均拒绝,stage逐字段核对后双表切换并保留原表,不直接DROP列。仅合成2条产品完成真实转换和回撤演练,正式库全量预检未执行。完整指令见[迁移说明](D:/AAdesk/202609/airz/database/product-original-migration.md)。 ## 验证 本轮2120项检查通过:纯转换/发布/编辑/规则/评分、16与28字段实际模型及目录、评估提交/重评/助手/匹配接口、历史报告/PDF、迁移拒绝与回撤、UTS及实际页面;管理端15项、小程序受控H5 8项,1280×900和390×844无应用控制台错误。微信29页编译成功。失败和重复运行不累计,前轮582/980项不另加。 证据根:D:/AAdesk/202609/airz-backups/product-original-storage-20261013,verification.json绑定源码摘要,migration-qa.json记录11项演练,admin-qa.json/mobile-qa.json与截图记录页面验证。合成迁移保留before原表与精确回撤SQL;工具不能自动暂停写入,生产转换须另按目标、备份和维护窗口授权。 - 纯逻辑:40存储、122发布、232编辑、151旧匹配、20展示、7选填、64硬规则。 - 真实存储:新16/旧28字段各31,目录46,发布模型22,匹配接口238(101 HTTP)、提交514(158 HTTP/5假调用)、重评58、助手165、报告持久化75、历史/PDF215、任务19、展示持久化17。 - 其他:UTS19、迁移11、管理端15、受控H5 8;PHP/JS语法、差异空白检查及微信编译单独记录,不计入2120。 浏览器技能不在当前工具目录,使用已有Playwright/Chrome,不安装依赖。管理端实测最少录入→保存→上架→恢复说明→回显→旧窗口拒绝→下架/再上架;H5业务API全部拦截,用真实规则输出的合成DTO,验证未提供/待核实、空日期、文字说明和单边范围。截图证据:[管理端额度与期限](D:/AAdesk/202609/airz-backups/product-original-storage-20261013/admin-quota-desktop.png)、[小程序选填展示](D:/AAdesk/202609/airz-backups/product-original-storage-20261013/product-original-mobile.png)。 源码修改前备份及SHA保存在before目录,两仓既有未提交改动保留。测试库及回撤表/证据保留,所属服务清理情况以cleanup.json为准;不得重跑setup.py/prepare-qa.py创建或覆盖环境,不得把默认.env用于测试。 --- ## 前轮历史:原字段核对与日期选填 2026-10-13:用户提供原始 `fa_product`,要求尽可能恢复原字段,并减少生效、失效日期等录入要求。本轮先核对两种表结构,完成日期选填的共同改动;物理表还原范围已通过异步问题征询,尚未收到选择。没有执行DDL、生产写入或部署。 ## 表结构核对与建议 原表有16个字段;当前有28个字段。原 `expectation`(额度)与 `quota`(期限)被结构化额度和期限取代,额外存在金额上限、期限上限、年化利率、年龄、经营月数、地区、准入规则、生效/失效日期及资料版本字段。这些字段涉及 Product 模型保存、发布编译、公共目录SQL、冻结匹配快照和当前可用性查询,不能仅删除列或覆盖CREATE TABLE。 若选择尽量恢复物理字段,建议恢复全部16个原字段名,把机器匹配参数、地区、准入规则、可选日期和内部版本收纳到原 `other` 的版本化JSON配置,由服务端适配器解码为原有内部接口。额度/期限的原文使用 `expectation`/`quota` 保存,明确数值参数保留在配置中;不从任意说明文字猜测金额。评分、资料和理由模板沿用现有配置,并保留原说明。对TEXT容量、旧JSON格式、金额精度和模板引用分别校验,不截断数据。 建议保留两处与原DDL不同的技术设置:InnoDB继续提供事务、行锁和批量失败回滚;产品名称保留varchar(100),避免已经允许保存的长名称被截断。名称收缩到20字必须先核对已有数据。内部版本移入配置以后仍要保留并发保存检测,不让运营手工维护。 另一种选择是只简化管理端而保留28个物理字段。它无需数据迁移、读写适配或切换产品表,功能验证范围更小;数据库字段多并不意味着每个字段都必须由运营填写。 完整物理还原的必要步骤是:显式配置只读预检 → 产品完整备份 → 在新表转换每条产品并核对额度、条件、说明和版本 → 验证新旧保存/匹配与旧报告一致 → 在停止写入的窗口切换并保留旧表以供定向回撤。历史评估快照不重算,不运行早期要求空业务表的 `database/migrate.py`,不直接DROP新增列。此路径尚未实现或执行,不能当作可直接上线的迁移脚本。 ## 本轮已实施:有效期选填 - 生效日期空值:不限制开始日期;失效日期空值:不设自动到期。 - 保存时空字符串转为SQL NULL;发布预检与编译接受缺失、NULL或空字符串。 - 填写的日期仍须有效,两日期均存在时仍检查先后顺序;已到期产品仍不能发布,未来生效产品仍不进入当前目录。 - 公共目录、评估冻结目录和匹配记录可用性同步接受可空边界;下架产品仍不可用。 - 管理端说明选填语义;小程序分别显示“未设置有效期”“有效至…”“…起生效”或完整起止日期,不显示空的“至”。 其他字段的必填规则尚未放宽:保存草稿要求产品名称及表单对象/配置格式有效;上架仍要求产品类型、机构、数值额度/期限/利率、已确认地区及规则来源。日期选填不代表这些字段已全部改为选填。下一步应根据表结构选择统一简化,保留真实条件和来源状态,不编造日期、利率或核验记录。 ## 验证与证据 发布155项、编辑234项、旧匹配151项、UTS显示18项、实际隔离MySQL模型/目录/匹配24项,共582项通过;7个PHP文件语法与差异空白检查通过。实际SQL覆盖四种空/非空日期组合、未来生效、过期、下架和事务回滚,原有合成产品逐行保持。微信29页编译结果见仓库外 `mp-dates.log`。 本轮修改前源码备份、SHA256与测试日志存于 `D:/AAdesk/202609/airz-backups/product-original-20261013`。测试使用前轮专用合成MySQL目录和新的本机端口、独立ROOT/ENV_PREFIX,不读取正式.env、不调用模型。测试进程已停止,端口释放;不改变正式或其他本机服务。本轮没有提交、推送、生产数据迁移或小程序发行。