fix:支付宝删除分账关系

This commit is contained in:
dzc committed 2026-08-26 18:50:02 +08:00
1 parent fc35443b90
commit 2c9feb5473
3 files changed
+18 -23

No files matched your search

@@ -31,7 +31,8 @@ public interface ThirdMchFzRelationService {
ThirdMchFzRelationVo saveForManage(ThirdMchFzRelationSaveDto dto);
/**
* 删除关系;已绑定关系只标记为历史关系,默认关系删除前必须自动切换到可用替代关系。
* 删除关系;已绑定关系只标记为历史关系,删除默认关系后允许当前支付配置暂时没有默认关系。
* 新支付在新的默认关系绑定前会被支付前置校验拒绝,历史订单仍使用原关系快照。
*
* @param ids 关系主键列表
* @return 全部处理成功时返回 true
@@ -383,9 +383,8 @@ public class ThirdMchFzRelationServiceImpl implements ThirdMchFzRelationService
/**
* 删除关系;已绑定关系保留为历史事实,只移出默认候选,避免历史订单无法退分账。
*
* <p>默认关系删除前必须在同一支付配置下找到另一个已绑定且启用抽佣的关系,
* 并在当前事务内先切换默认关系,再将旧关系标记为历史。这样管理端可以完整维护关系,
* 同时不会出现“默认关系已删但新支付没有可用分账关系”的中间状态。</p>
* <p>删除默认关系不再强制寻找替代关系。删除后当前支付配置可以暂时没有默认关系,
* 新支付会由支付前置校验拒绝,直到管理端新增并绑定新的默认关系;历史订单仍按原关系快照继续退款和退分账。</p>
*
* @param ids 关系主键
* @return 是否全部处理成功
@@ -409,25 +408,6 @@ public class ThirdMchFzRelationServiceImpl implements ThirdMchFzRelationService
if (relation == null) {
continue;
}
if (YesNoEnum.YES.getCode().equals(relation.getIsDefault())) {
ThirdMchFzRelationEntity replacement = relationMapper.selectOne(new LambdaQueryWrapper<ThirdMchFzRelationEntity>()
.eq(ThirdMchFzRelationEntity::getTenantId, tenantId)
.eq(ThirdMchFzRelationEntity::getMchId, relation.getMchId())
.eq(ThirdMchFzRelationEntity::getPaySettingId, relation.getPaySettingId())
.eq(ThirdMchFzRelationEntity::getDelFlag, "0")
.eq(ThirdMchFzRelationEntity::getStatus, ThirdMchFzRelationStatusEnum.BOUND.getCode())
.eq(ThirdMchFzRelationEntity::getIsDefault, YesNoEnum.NO.getCode())
.gt(ThirdMchFzRelationEntity::getFzRatio, 0D)
.notIn(ThirdMchFzRelationEntity::getId, relationIds)
.ne(ThirdMchFzRelationEntity::getId, relation.getId())
.orderByDesc(ThirdMchFzRelationEntity::getCreateTime)
.last("LIMIT 1"));
if (replacement == null) {
throw new IllegalArgumentException("默认分账关系没有可用替代关系,请先新增并绑定一条启用抽佣的关系");
}
// setDefault 会在当前事务内清理旧默认标记,再把候选关系设为默认。
setDefault(replacement);
}
LambdaUpdateWrapper<ThirdMchFzRelationEntity> update = new LambdaUpdateWrapper<ThirdMchFzRelationEntity>()
.eq(ThirdMchFzRelationEntity::getId, id)
.eq(ThirdMchFzRelationEntity::getTenantId, tenantId)
@@ -338,6 +338,20 @@ class ThirdMchFzRelationServiceImplTest {
() -> Assertions.assertTrue(outRequestNo.matches("[a-z0-9_]+")));
}
/**
* 删除唯一默认关系时不再强制准备替代关系;已绑定关系转为历史状态,新支付由前置校验阻断。
*/
@Test
void removeForManageShouldAllowDeletingDefaultWithoutReplacement() {
ThirdMchFzRelationEntity existing = boundWechatRelation(7010L);
when(relationMapper.selectOne(any(Wrapper.class))).thenReturn(existing, null);
when(relationMapper.update(any(), any())).thenReturn(1);
Assertions.assertTrue(service.removeForManage(List.of(existing.getId())));
verify(relationMapper, times(1)).update(any(), any());
}
/** 构造商户关系同步快照。 */
private MchManageVo merchant(List<MchPaySettingVo> settings) {
MchManageVo merchant = new MchManageVo();