# 管理员分配爱心值给家庭成员 设计文档 **日期:** 2026-05-23 **版本:** 1.0 --- ## 1. 背景 管理员在 PC 管理后台,可以从用户总账号的爱心值余额中,分配一定数量给指定家庭成员。 --- ## 2. 业务规则 1. 分配数量必须 > 0 2. 分配数量不能超过总账号当前余额 3. 分配成功后: - 总账号 `loveValue` 扣减对应数量 - 家庭成员 `loveValue` 增加对应数量 4. 写两条流水记录(`ht_love_value_record`): - 总账号支出:`capitalFlow=2`,`transactionType=3`,`memberId=成员id` - 成员收入:`capitalFlow=1`,`transactionType=3`,`userId=总账号id`,`memberId=成员id` 5. `transactionType=3` 为新增类型,含义:管理员分配 --- ## 3. 改动范围 | 端 | 文件 | 改动类型 | |----|------|---------| | 后端 | `FamilyMemberDTO.java` | 新增 `loveValue` 字段 | | 后端 | `FamilyMemberServiceImpl.java` | `page()` 填充 `loveValue`;新增 `assignLoveValue()` | | 后端 | `FamilyMemberService.java` | 新增 `assignLoveValue()` 接口声明 | | 后端 | `FamilyMemberController.java` | 新增 `POST /core/family/member/assignLoveValue` | | 前端 | `familyMember.vue` | 新增「爱心值」列、「分配」按钮、分配弹窗 | --- ## 4. 后端设计 ### 4.1 FamilyMemberDTO 新增字段 ```java @ApiModelProperty(value = "爱心值") private BigDecimal loveValue; ``` ### 4.2 FamilyMemberServiceImpl — page() 填充 loveValue 在现有 `page()` 重写方法中,Entity 已通过 `baseDao.selectBatchIds` 批量查出(为填充 channelNames),直接复用,同时填充 `loveValue`: ``` entity.getLoveValue() → dto.setLoveValue() ``` ### 4.3 新增 assignLoveValue() 方法 **接口声明(FamilyMemberService.java):** ```java void assignLoveValue(Long memberId, Long userId, BigDecimal amount); ``` **实现逻辑(FamilyMemberServiceImpl.java):** ``` 1. 查 AppUserEntity(总账号),校验余额 >= amount > 0 2. 查 FamilyMemberEntity,校验成员属于该用户 3. 开启事务: a. 总账号 loveValue -= amount,updateById b. 成员 loveValue += amount,updateById c. 插入流水记录(总账号支出): userId=userId, capitalFlow=2, transactionType=3, memberId=memberId, loveQuantity=amount d. 插入流水记录(成员收入): userId=userId, capitalFlow=1, transactionType=3, memberId=memberId, loveQuantity=amount 4. 返回成功 ``` ### 4.4 新增接口 **Controller(FamilyMemberController.java):** ``` POST /core/family/member/assignLoveValue ``` 请求参数: | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | memberId | Long | 是 | 家庭成员 ID | | userId | Long | 是 | 总账号用户 ID | | amount | BigDecimal | 是 | 分配数量,必须 > 0 | 响应:统一 `Result` 格式,`code=0` 为成功。 错误场景: | 场景 | 返回 | |------|------| | amount <= 0 | `code=500, msg="分配数量必须大于0"` | | 余额不足 | `code=500, msg="总账号余额不足"` | | 成员不属于该用户 | `code=500, msg="家庭成员不存在"` | --- ## 5. 前端设计 **文件:** `src/views/modules/member/components/familyMember.vue` ### 5.1 列表新增「爱心值」列 在「所属渠道」列后新增: ```html ``` ### 5.2 操作列新增「分配」按钮 在列表末尾新增操作列: ```html ``` ### 5.3 分配弹窗 弹窗字段: - 成员姓名(只读展示) - 总账号当前余额(只读,从 `detail.vue` 通过 props 传入) - 分配数量(数字输入框,最大值 = 总账号余额,最小值 = 1) 提交调用:`POST /core/family/member/assignLoveValue` 成功后:刷新列表(`getList()`)、关闭弹窗。 ### 5.4 Props 新增 `familyMember.vue` 新增 prop: ```js props: ['userId', 'userLoveValue'] ``` `detail.vue` 传入: ```html ``` --- ## 6. 数据流 ``` 管理员点击「分配」 → 弹窗展示成员姓名 + 总账号余额 → 输入分配数量,点击确认 → POST /core/family/member/assignLoveValue → 校验余额 → 事务:扣总账号 + 加成员 + 写两条流水 → 成功:刷新列表,弹窗关闭 → 失败:Toast 提示错误信息 ``` --- ## 7. 不在本次范围内 - 爱心值分配记录的查询页面 - 撤销/退回分配 - 批量分配