|
@@ -4,6 +4,100 @@
|
|
|
|
|
|
|
|
---
|
|
---
|
|
|
|
|
|
|
|
|
|
+## v1.0.1855 (2026-10-30)
|
|
|
|
|
+
|
|
|
|
|
+### Bug 修复
|
|
|
|
|
+- 修复 childId→memberId 规范化引入的重复定义
|
|
|
|
|
+- Dashboard 热力图「高」标签补样式 + 键盘可达性收口(tabindex/aria/space 激活)
|
|
|
|
|
+- 今日成长打卡判定优先业务日期,修复 iOS 上 createdAt 带毫秒 ISO 解析失败导致打卡不显示
|
|
|
|
|
+
|
|
|
|
|
+### 其他
|
|
|
|
|
+- 改为标准 @Data + @TableField("child_id") + @JsonProperty("childId") 单一字段
|
|
|
|
|
+- - CouponController: exchange 方法 memberId 重复声明(Object 与 Long 冲突),
|
|
|
|
|
+- 临时变量改名 memberIdObj
|
|
|
|
|
+-
|
|
|
|
|
+- - cf_direct/indirect_sales_tier 门槛×100 + 档位名 新秀/小成/中富/大成/至富(迁移431)
|
|
|
|
|
+- - calcOrderPpoints 重写:单商品 实付-成本×数量;多商品按行单价×数量占比分摊实付再减行成本(负毛利记0);非商品沿用服务费率
|
|
|
|
|
+- - createMultiItem 落库 order_items 明细行(结算按行分摊前提)
|
|
|
|
|
+- - Product.purchasePrice 类型 BigDecimal→Integer(分)
|
|
|
|
|
+- - ProductEdit.vue 增加成本价(元)输入(落库转分)
|
|
|
|
|
+- - ProductDTO 输出 purchasePrice
|
|
|
|
|
+-
|
|
|
|
|
+- 访问任意路径均返回白标 404,原 DOM 型 e2e 在远程 32 条全部超时失败。
|
|
|
|
|
+- 改为断言 /api/* 响应码与数据结构,不依赖前端。
|
|
|
|
|
+- - tests/playwright.config.api.js: 独立配置(无 globalSetup、独立 outputDir、
|
|
|
|
|
+- testMatch 仅匹配 e2e/api/**、用例超时 180s)
|
|
|
|
|
+- - tests/e2e/helpers/api.js: registerRole(direct-register 自注册,不依赖种子库)、
|
|
|
|
|
+- apiPost(60s 超时 + 非 JSON 响应回退 HTTP 码)、不回显任何敏感信息
|
|
|
|
|
+- - tests/e2e/api/*: 冒烟 4 例 + 家庭成员 13 例 + 能量 10 例 + 联系人 6 例 + 文章 7 例
|
|
|
|
|
+- - tests/defects/DEFECTS-api-remote-findings.md: CFC-EN-001(energy/grant 500)、
|
|
|
|
|
+- CFC-FM-001(member/update nickname 不生效)、CFC-ENV-001(远程无 SPA)、
|
|
|
|
|
+- CFC-ENV-002(member/add 冷启动 16s)
|
|
|
|
|
+- - 被真实缺陷阻塞的用例用 test.fixme 标记并配套特征化用例锁定缺陷行为
|
|
|
|
|
+- - .gitignore: 忽略 Playwright 失败诊断产物,保留 .last-run.json 入库
|
|
|
|
|
+-
|
|
|
|
|
+- 数据库列名保持不变,未写迁移,零库变更
|
|
|
|
|
+- - 全量同步 Service/Controller/Mapper/Task/DTO/测试中的 getChildId/setChildId 调用点
|
|
|
|
|
+- - 加 @JsonProperty("childId") 保留 JSON 契约:接口出参键名仍为 childId,前端无需改动
|
|
|
|
|
+- - PointsLogVO:删除与 memberId 同值的重复 childId 字段,改为 memberId + getChildId() 别名
|
|
|
|
|
+- getter,JSON 同时输出 childId 与 memberId(管理端表格 prop="childId" 依赖)
|
|
|
|
|
+- - ActivityFeedbackMapper.xml:result property="childId" -> "memberId"(column 仍为 child_id)
|
|
|
|
|
+- - 日志占位符 childId={} 同步改为 memberId={},避免日志文案与实际变量名不符
|
|
|
|
|
+- - 保留不动:数据库列 child_id、接口请求键 "childId"/"childIds"、MyBatis @Param("childId")
|
|
|
|
|
+- - 与前次 ChildBadge -> MemberBadge 规范保持一致,仅代码层,不动库表
|
|
|
|
|
+-
|
|
|
|
|
+- 而后端 Jackson 输出的 createdAt 形如 2026-10-30T13:13:32.000+08:00(带毫秒+时区偏移),
|
|
|
|
|
+- iOS JavaScriptCore 只支持不带毫秒的 ISO(parseDate 注释记录),new Date() 返回 Invalid Date
|
|
|
|
|
+- → formatDateKey 返回空串 → 与 todayDate 不匹配 → 今日成长「饮食」显示未打卡、完成数为 0。
|
|
|
|
|
+- 修复:
|
|
|
|
|
+- 1. utils/format.js 新增 recordDateOf(record):业务日期字段优先
|
|
|
|
|
+- (recordDate > startTime > sleepTime > checkinDate > createdAt),返回 yyyy-MM-dd;
|
|
|
|
|
+- createdAt 仅为兜底且经 parseDate 归一化(去掉 .SSS 毫秒段,iOS 可解析)。
|
|
|
|
|
+- 2. parseDate 增加对带毫秒+时区偏移 ISO(Jackson 默认输出格式)的去毫秒处理。
|
|
|
|
|
+- 3. growth-main/index.vue 饮食/运动/睡眠/心情 4 处完成判定统一改用 recordDateOf。
|
|
|
|
|
+- 测试:__tests__/utils/format.test.js 新增 recordDateOf 5 用例(补打优先/兜底/运动睡眠心情/空值/毫秒ISO),
|
|
|
|
|
+- format.test.js 26 个全过;全量 jest 无新增失败(3 套件 4 用例为既有失败,与本改动无关)。
|
|
|
|
|
+-
|
|
|
|
|
+- 全部缺失,本次按文档口径补齐 T01-T03 后端范围(数据层+服务层+接口层):
|
|
|
|
|
+- - 新增实体 IndicatorFavorite(@TableName indicator_favorite + @TableId AUTO)
|
|
|
|
|
+- - 新增 Mapper IndicatorFavoriteMapper(extends BaseMapper)
|
|
|
|
|
+- - 新增 Service 接口 IndicatorFavoriteService + 实现 IndicatorFavoriteServiceImpl
|
|
|
|
|
+- (toggle 幂等「存在则删、不存在则插」、list 按 5 维隔离+id 升序、remove 幂等删除)
|
|
|
|
|
+- - 新增 Controller IndicatorFavoriteController:
|
|
|
|
|
+- /api/indicator/favorite/toggle|list|remove 三个 POST,
|
|
|
|
|
+- @RequestAttribute 取 userId/familyId 不信任前端传值,checkMemberBelongs 归属校验
|
|
|
|
|
+- - DatabaseInitializer 新增迁移429 createIndicatorFavoriteTable()
|
|
|
|
|
+- (主线最大编号已为 428 coupon_gift_transfer,故取 428+1=429,幂等建表)
|
|
|
|
|
+- - JwtInterceptor.LOGIN_REQUIRED_PATHS 追加 /api/indicator/favorite(强制登录防匿名污染)
|
|
|
|
|
+- - schema.sql 追加 indicator_favorite 建表 DDL(与 DatabaseInitializer 一致)
|
|
|
|
|
+- - 单测 IndicatorFavoriteServiceTest(6) + IndicatorFavoriteControllerTest(10),
|
|
|
|
|
+- JwtInterceptorLoginRequiredTest 增补收藏接口无 token 401 两条,共 21 例全绿
|
|
|
|
|
+- - 文档:API_REFERENCE.md 新增 §4.48.2、2026-10-25 设计稿补方案A落点、PROJECT-OVERVIEW 同步
|
|
|
|
|
+- 不涉及前端(F1-F5 需基线 dbf13c610,尚未合入 cfclub,按 §12.1 待主理人确认)。
|
|
|
|
|
+-
|
|
|
|
|
+- - ChildBadge -> MemberBadge(实体),字段 childId -> memberId(@TableField("child_id") 兼容旧列)
|
|
|
|
|
+- - ChildBadgeMapper -> MemberBadgeMapper
|
|
|
|
|
+- - BadgeService/Controller/UserController 方法:getChildBadges->getMemberBadges、getActiveChildBadges->getActiveMemberBadges、getChildBadgeStats->getMemberBadgeStats、getChildBadgeDetail->getMemberBadgeDetail;Controller 路径 /child/list->/member/list、/statistics/child->/statistics/member;返回字段 childBadge->memberBadge
|
|
|
|
|
+- - 前端 api.js:getChildBadges->getMemberBadges、getChildBadgeStats->getMemberBadgeStats(getUserBadges 别名保留);achievement/wealth/rewards 页面同步;接口矩阵文档路径同步
|
|
|
|
|
+- - 成就页(pages/achievement/index.vue)重构:移除优惠券入口(资产类不属成就,财富中心已有)、移除"累计积分"目标;修正视角——调 getMemberBadges(null) 由后端 currentMemberId 查当前登录用户本人成就
|
|
|
|
|
+- - 约定:仅代码层规范,数据库表 child_badge / 列 child_id 保留,用 @TableField 兼容,未写迁移
|
|
|
|
|
+-
|
|
|
|
|
+
|
|
|
|
|
+### 新功能
|
|
|
|
|
+- P点口径改为成本价核算 + 多商品明细分摊落库
|
|
|
|
|
+- T04 指标收藏后端化(方案A)— GAP-2026-10-30-indicator-fav
|
|
|
|
|
+
|
|
|
|
|
+### 测试
|
|
|
|
|
+- 新增 API 级 e2e 套件(远程后端实测 37 passed / 3 fixme)
|
|
|
|
|
+- 接口冒烟闭环 2026-10-30 15:17 — 通过率 45% (fix=0 reg=0)
|
|
|
|
|
+- 接口冒烟闭环 2026-10-30 15:07 — 通过率 45% (fix=0 reg=0)
|
|
|
|
|
+- 接口冒烟闭环 2026-10-30 14:55 — 通过率 45% (fix=0 reg=0)
|
|
|
|
|
+
|
|
|
|
|
+### 重构
|
|
|
|
|
+- 批量规范化 childId 历史字段为 memberId(仅代码层)
|
|
|
|
|
+- 规范 ChildBadge 命名为 MemberBadge,并收敛成就页为纯成就
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
## v1.0.1854 (2026-10-30)
|
|
## v1.0.1854 (2026-10-30)
|
|
|
|
|
|
|
|
### Bug 修复
|
|
### Bug 修复
|