mirror of
https://codeup.aliyun.com/67c68d4e484ca2f0a13ac3c1/ydc/jsowell-charger-web.git
synced 2026-06-11 18:59:51 +08:00
update 汇付
This commit is contained in:
@@ -405,6 +405,85 @@ export function getAdapayOpenDetailV2(data) {
|
||||
- 个人无结算账户:主按钮为“创建对私结算账户”。
|
||||
- 结算账户删除前提示:删除后支付分账将不可用,需重新创建后恢复。
|
||||
|
||||
## Review 待修复计划
|
||||
|
||||
### 问题一:结算账户创建成功后缓存未失效
|
||||
|
||||
风险:
|
||||
|
||||
- `createSettleAccount` 成功写入 `settle_account_id` 后,当前使用 `updateAdapayMemberAccountByMemberId` 更新本地记录。
|
||||
- `updateAdapayMemberAccountByMemberId` 只更新数据库,没有清理 `ADAPAY_MEMBER_ACCOUNT + merchantId` 缓存。
|
||||
- `/adapay/member/v2/detail` 继续读取旧缓存时,页面可能仍显示“未创建结算账户”,导致状态停留在 `PERSONAL_OPENED_NO_SETTLE` 或 `CORP_OPENED_NO_SETTLE`。
|
||||
|
||||
修改计划:
|
||||
|
||||
- 在 `AdapayMemberAccountServiceImpl.updateAdapayMemberAccountByMemberId` 中补齐缓存清理。
|
||||
- 优先使用传入对象的 `merchantId` 清理缓存。
|
||||
- 若调用方只传 `adapayMemberId`,则先按 `adapayMemberId` 查询当前记录,拿到 `merchantId` 后清理缓存。
|
||||
- 调整 `AdapayService.createSettleAccount`、`changeBankCard` 等调用点,尽量在更新对象中补充 `merchantId`,减少额外查询。
|
||||
|
||||
验收标准:
|
||||
|
||||
- 创建结算账户成功后,立即刷新 V2 页面,状态应变为 `PERSONAL_COMPLETED` 或 `CORP_COMPLETED`。
|
||||
- 结算账户 ID、银行卡信息能立即展示,不依赖 Redis 过期。
|
||||
|
||||
### 问题二:删除结算账户缺少业务阻断校验
|
||||
|
||||
风险:
|
||||
|
||||
- 文档已确认删除结算账户前需要校验未结算分账/在途提现。
|
||||
- 当前 `deleteSettleAccount` 只校验 V2 action 和结算账户是否存在,随后直接调用汇付删除并清空本地结算账户。
|
||||
- 若存在未结算分账或在途提现,删除结算账户会影响后续结算、提现或分账状态追踪。
|
||||
|
||||
修改计划:
|
||||
|
||||
- 在 `AdapayService.deleteSettleAccount` 调用汇付删除前增加业务校验方法,例如 `assertSettleAccountCanDelete(merchantId)`。
|
||||
- 校验维度先按现有数据能力落地,明确数据源和阻断状态:
|
||||
- 在途提现:查询 `clearing_withdraw_info`,若存在 `withdraw_status = '0'` 的记录,阻断删除。
|
||||
- 清分账单:查询 `clearing_bill_info`,若存在 `bill_status in ('0', '1', '3', '5')` 的记录,阻断删除,分别对应未清分、清分在途、提现申请中、等待处理。
|
||||
- 未分账订单:查询 `order_unsplit_record`,若存在 `status = 'unsplit'` 且订单归属当前 `merchantId` 的记录,阻断删除。
|
||||
- 为未分账订单补齐按商户查询能力:
|
||||
- 在 `OrderUnsplitRecordMapper` 新增 `countUnsplitByMerchantId(merchantId)`。
|
||||
- SQL 通过 `order_unsplit_record.order_code` 关联 `order_basic_info.order_code`,按 `order_basic_info.merchant_id` 过滤当前商户。
|
||||
- 在 `OrderUnsplitRecordService` 增加同名方法,供 `AdapayService.assertSettleAccountCanDelete` 调用。
|
||||
- 为提现和清分账单尽量使用轻量查询:
|
||||
- 优先新增 `ClearingWithdrawInfoService.countProcessingByMerchantId(merchantId)`,只统计 `withdraw_status = '0'`。
|
||||
- 优先新增 `ClearingBillInfoService.countBlockingByMerchantId(merchantId)`,只统计 `bill_status in ('0', '1', '3', '5')`。
|
||||
- 若已有列表查询能满足,可先复用现有方法,但最终实现应避免在删除前加载大量历史记录。
|
||||
- 阻断时返回明确错误信息,例如“存在在途提现,请完成后再删除结算账户”或“存在未结算分账,请完成结算后再删除结算账户”。
|
||||
- 前端保留现有确认弹窗,但以后端校验结果作为最终准入。
|
||||
|
||||
验收标准:
|
||||
|
||||
- 无在途提现、无未结算分账时,可以删除结算账户并清空本地 `settle_account_id`。
|
||||
- 存在 `withdraw_status = '0'` 的提现记录时,删除接口返回业务错误,汇付删除请求不会发起,本地结算账户不会清空。
|
||||
- 存在 `bill_status in ('0', '1', '3', '5')` 的清分账单时,删除接口返回业务错误,汇付删除请求不会发起,本地结算账户不会清空。
|
||||
- 存在 `status = 'unsplit'` 且归属当前商户的未分账订单时,删除接口返回业务错误,汇付删除请求不会发起,本地结算账户不会清空。
|
||||
|
||||
### 问题三:删除汇付用户未接入 V2 action 后端校验
|
||||
|
||||
风险:
|
||||
|
||||
- V2 计划要求后端统一动作校验,避免绕过前端按钮限制。
|
||||
- 当前创建、更新、创建/删除结算账户已接入 `assertActionAllowed`。
|
||||
- `deleteAdapayMember` 未校验 `DELETE_MEMBER`,直接调用接口时可能删除企业审核中的本地记录,导致后续汇付回调无法匹配记录。
|
||||
|
||||
修改计划:
|
||||
|
||||
- 在 `AdapayService.deleteAdapayMember` 开始处增加 `assertActionAllowed(dto.getMerchantId(), AdapayOpenActionEnum.DELETE_MEMBER)`。
|
||||
- 保留现有 `adapayMemberId` 一致性校验和“需先删除结算账户”校验,作为二次保护。
|
||||
- 确认 `resolveActions` 中仅允许以下状态删除会员:
|
||||
- `PERSONAL_OPENED_NO_SETTLE`
|
||||
- `CORP_FAILED`
|
||||
- 若后续业务允许更多状态删除,再由状态机统一扩展,不在接口中散落判断。
|
||||
|
||||
验收标准:
|
||||
|
||||
- 企业审核中状态调用删除汇付用户接口,应返回“不允许执行删除”类业务错误。
|
||||
- 企业失败且无结算账户时,可以删除本地失败记录。
|
||||
- 个人已开户但未创建结算账户时,可以删除本地会员记录。
|
||||
- 已有结算账户时仍必须先删除结算账户。
|
||||
|
||||
## 分阶段实施清单
|
||||
|
||||
### 阶段一:后端状态与接口
|
||||
@@ -453,4 +532,3 @@ export function getAdapayOpenDetailV2(data) {
|
||||
回答:确定补齐采集。
|
||||
4. 删除结算账户前是否需要校验未结算分账/在途提现?本计划建议后续补一层业务校验。
|
||||
回答:需要校验 。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user