From 89263bbe5141e129cbba506b16916bed4c7e6a44 Mon Sep 17 00:00:00 2001 From: Guoqs <123456@jsowell.com> Date: Wed, 25 Mar 2026 16:19:15 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E9=87=8D=E6=9E=84=E6=B1=87=E4=BB=98?= =?UTF-8?q?=E4=BC=9A=E5=91=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plan/huifu-member-page-refactor.md | 85 ++++ .../pile/AdapayMemberController.java | 115 +++++- .../adapay/dto/CreateCorpMemberDTO.java | 29 ++ .../adapay/dto/CreatePersonalMemberDTO.java | 16 + .../adapay/dto/CreateSettleAccountDTO.java | 23 ++ .../adapay/dto/DeleteAdapayMemberDTO.java | 13 + .../adapay/dto/UpdateCorpMemberDTO.java | 28 ++ .../adapay/dto/UpdatePersonalMemberDTO.java | 16 + .../jsowell/adapay/service/AdapayService.java | 369 +++++++++++++----- .../adapay/vo/AdapayMemberAggregateVO.java | 21 + .../jsowell/adapay/vo/AdapayMemberInfoVO.java | 2 + .../mapper/AdapayMemberAccountMapper.java | 2 + .../service/AdapayMemberAccountService.java | 2 + .../impl/AdapayMemberAccountServiceImpl.java | 8 +- .../mapper/pile/AdapayMemberAccountMapper.xml | 14 +- 15 files changed, 621 insertions(+), 122 deletions(-) create mode 100644 docs/plan/huifu-member-page-refactor.md create mode 100644 jsowell-pile/src/main/java/com/jsowell/adapay/dto/CreateCorpMemberDTO.java create mode 100644 jsowell-pile/src/main/java/com/jsowell/adapay/dto/CreatePersonalMemberDTO.java create mode 100644 jsowell-pile/src/main/java/com/jsowell/adapay/dto/CreateSettleAccountDTO.java create mode 100644 jsowell-pile/src/main/java/com/jsowell/adapay/dto/DeleteAdapayMemberDTO.java create mode 100644 jsowell-pile/src/main/java/com/jsowell/adapay/dto/UpdateCorpMemberDTO.java create mode 100644 jsowell-pile/src/main/java/com/jsowell/adapay/dto/UpdatePersonalMemberDTO.java create mode 100644 jsowell-pile/src/main/java/com/jsowell/adapay/vo/AdapayMemberAggregateVO.java diff --git a/docs/plan/huifu-member-page-refactor.md b/docs/plan/huifu-member-page-refactor.md new file mode 100644 index 000000000..24f44f6f5 --- /dev/null +++ b/docs/plan/huifu-member-page-refactor.md @@ -0,0 +1,85 @@ +# 汇付会员页面重构计划 + +## Summary + +基于 AdaPay 官方文档、SDK 能力和当前仓库现状,重构现有商户详情页里的汇付用户区域,统一提供个人用户、企业用户、结算账户三类操作入口,并补齐后端接口与页面状态流。 + +- 一商户仅维护一个当前有效的汇付用户关系 +- 一商户仅维护一个当前有效的结算账户 +- 删除汇付用户按本地解绑落地,不做远端 AdaPay 用户对象删除 + +## 个人用户与企业用户 + +- 个人用户 `Member` + - 轻量开户,无审核附件 + - 核心字段:`nickname`、`gender`、`location`、`email` + - 支持创建、查询、更新 + - 结算账户单独创建 +- 企业用户 `CorpMember` + - 需要企业实名资料和附件压缩包 + - 审核状态:`A/B/C/D/E` + - 支持创建、查询、更新 + - 结算账户单独创建或删除 +- 结算账户 `SettleAccount` + - 个人和企业都独立维护 + - 支持创建、查询、删除 + - 删除用户前必须先删除结算账户 + +## 本次实现 + +### 页面与交互 + +- 重构商户详情页“钱包汇总”中的汇付用户区域 +- 页面拆成三块: + - 用户概览 + - 用户操作 + - 结算账户操作 +- 新增用户时先选个人/企业,再进入对应表单 +- 删除用户按钮仅在没有结算账户时可用 +- 企业用户保留审核状态和失败原因展示 + +### 后端接口 + +- `POST /adapay/member/createAdapayMember` +- `POST /adapay/member/createCorpMember` +- `POST /adapay/member/selectAdapayMember` +- `POST /adapay/member/updateAdapayMember` +- `POST /adapay/member/deleteAdapayMember` +- `POST /adapay/member/createSettleAccount` +- `POST /adapay/member/selectSettleAccount` +- `POST /adapay/member/deleteSettleAccount` + +### 后端类型 + +- `CreatePersonalMemberDTO` +- `CreateCorpMemberDTO` +- `UpdatePersonalMemberDTO` +- `UpdateCorpMemberDTO` +- `CreateSettleAccountDTO` +- `DeleteAdapayMemberDTO` +- `AdapayMemberAggregateVO` + +### 服务规则 + +- 个人用户创建与结算账户创建彻底拆开 +- 企业用户创建与结算账户创建彻底拆开 +- 用户查询返回聚合结果,兼容旧字段并补充: + - `memberType` + - `adapayMember` + - `adapayCorpMember` + - `settleAccountList` + - `canDeleteUser` + - `deleteBlockReason` +- 删除结算账户后只清空本地 `settle_account_id`,不删除用户绑定关系 +- 删除用户前校验当前商户下不存在结算账户 + +## 测试结论 + +- 后端:`mvn -pl jsowell-admin -am compile -DskipTests` 通过 +- 前端:对本次改动文件执行 `eslint --no-ignore` 通过 + +## Assumptions + +- “删除汇付用户”按本地解绑实现,不做 AdaPay 远端用户删除 +- 当前实现边界仍是一商户对应一个当前有效汇付用户 +- 不支持同一商户同时维护多个有效汇付用户 diff --git a/jsowell-admin/src/main/java/com/jsowell/web/controller/pile/AdapayMemberController.java b/jsowell-admin/src/main/java/com/jsowell/web/controller/pile/AdapayMemberController.java index 98d270964..664dfefa7 100644 --- a/jsowell-admin/src/main/java/com/jsowell/web/controller/pile/AdapayMemberController.java +++ b/jsowell-admin/src/main/java/com/jsowell/web/controller/pile/AdapayMemberController.java @@ -18,6 +18,7 @@ import com.jsowell.pile.service.ClearingWithdrawInfoService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import java.util.List; import java.util.Map; @RestController @@ -30,14 +31,55 @@ public class AdapayMemberController extends BaseController { @Autowired private ClearingWithdrawInfoService clearingWithdrawInfoService; + /** + * 创建个人用户 + */ + @PostMapping("/createAdapayMember") + public AjaxResult createAdapayMember(@RequestBody CreatePersonalMemberDTO dto) { + AjaxResult result; + try { + if (StringUtils.isBlank(dto.getMerchantId())) { + throw new BusinessException(ReturnCodeEnum.CODE_PARAM_NOT_NULL_ERROR); + } + adapayService.createAdapayMember(dto); + result = AjaxResult.success(); + } catch (BusinessException e) { + logger.warn("创建个人汇付用户接口warn", e); + result = AjaxResult.error(e.getMessage()); + } catch (Exception e) { + logger.error("创建个人汇付用户接口error", e); + result = AjaxResult.error("创建个人汇付用户接口异常:" + e.getMessage()); + } + return result; + } + + /** + * 创建企业用户 + */ + @PostMapping("/createCorpMember") + public AjaxResult createCorpMember(@RequestBody CreateCorpMemberDTO dto) { + AjaxResult result; + try { + if (StringUtils.isBlank(dto.getMerchantId())) { + throw new BusinessException(ReturnCodeEnum.CODE_PARAM_NOT_NULL_ERROR); + } + adapayService.createCorpMember(dto); + result = AjaxResult.success(); + } catch (BusinessException e) { + logger.warn("创建企业汇付用户接口warn", e); + result = AjaxResult.error(e.getMessage()); + } catch (Exception e) { + logger.error("创建企业汇付用户接口error", e); + result = AjaxResult.error("创建企业汇付用户接口异常:" + e.getMessage()); + } + return result; + } + /** * 创建结算账户 - * http://localhost:8080/adapay/member/createSettleAccount - * @param dto - * @return */ @PostMapping("/createSettleAccount") - public AjaxResult createSettleAccount(@RequestBody SettleAccountDTO dto) { + public AjaxResult createSettleAccount(@RequestBody CreateSettleAccountDTO dto) { logger.info("创建结算账户接口 param:{}", JSON.toJSONString(dto)); AjaxResult result; try { @@ -59,7 +101,6 @@ public class AdapayMemberController extends BaseController { /** * 查询汇付会员接口 - * http://localhost:8080/adapay/member/selectAdapayMember */ @PostMapping("/selectAdapayMember") public AjaxResult selectAdapayMember(@RequestBody AdapayMemberInfoDTO dto) { @@ -68,8 +109,7 @@ public class AdapayMemberController extends BaseController { if (StringUtils.isBlank(dto.getMerchantId())) { throw new BusinessException(ReturnCodeEnum.CODE_PARAM_NOT_NULL_ERROR); } - Map map = adapayService.selectAdapayMember(dto.getMerchantId()); - result = AjaxResult.success(map); + result = AjaxResult.success(adapayService.selectAdapayMember(dto.getMerchantId())); } catch (BusinessException e) { logger.warn("查询汇付会员接口异常warn", e); result = AjaxResult.error(e.getMessage()); @@ -81,24 +121,67 @@ public class AdapayMemberController extends BaseController { } /** - * 更新结算账户接口 - * http://localhost:8080/adapay/member/updateAdapayMember + * 查询结算账户接口 */ - @PostMapping("/updateAdapayMember") - public AjaxResult updateAdapayMember(@RequestBody SettleAccountDTO dto) { + @PostMapping("/selectSettleAccount") + public AjaxResult selectSettleAccount(@RequestBody AdapayMemberInfoDTO dto) { AjaxResult result; try { if (StringUtils.isBlank(dto.getMerchantId())) { throw new BusinessException(ReturnCodeEnum.CODE_PARAM_NOT_NULL_ERROR); } - Map map = adapayService.updateAdapayMember(dto); - result = AjaxResult.success(map); + List list = adapayService.selectSettleAccount(dto.getMerchantId()); + result = AjaxResult.success(list); } catch (BusinessException e) { - logger.warn("更新结算账户接口warn", e); + logger.warn("查询结算账户接口warn", e); result = AjaxResult.error(e.getMessage()); } catch (Exception e) { - logger.error("更新结算账户接口error", e); - result = AjaxResult.error("查询汇付会员接口异常"); + logger.error("查询结算账户接口error", e); + result = AjaxResult.error("查询结算账户接口异常"); + } + return result; + } + + /** + * 更新汇付会员接口 + */ + @PostMapping("/updateAdapayMember") + public AjaxResult updateAdapayMember(@RequestBody Map dto) { + AjaxResult result; + try { + if (StringUtils.isBlank((String) dto.get("merchantId"))) { + throw new BusinessException(ReturnCodeEnum.CODE_PARAM_NOT_NULL_ERROR); + } + adapayService.updateAdapayMember(dto); + result = AjaxResult.success(); + } catch (BusinessException e) { + logger.warn("更新汇付会员接口warn", e); + result = AjaxResult.error(e.getMessage()); + } catch (Exception e) { + logger.error("更新汇付会员接口error", e); + result = AjaxResult.error("更新汇付会员接口异常"); + } + return result; + } + + /** + * 删除汇付会员绑定关系 + */ + @PostMapping("/deleteAdapayMember") + public AjaxResult deleteAdapayMember(@RequestBody DeleteAdapayMemberDTO dto) { + AjaxResult result; + try { + if (StringUtils.isBlank(dto.getMerchantId())) { + throw new BusinessException(ReturnCodeEnum.CODE_PARAM_NOT_NULL_ERROR); + } + adapayService.deleteAdapayMember(dto); + result = AjaxResult.success(); + } catch (BusinessException e) { + logger.warn("删除汇付会员绑定接口warn", e); + result = AjaxResult.error(e.getMessage()); + } catch (Exception e) { + logger.error("删除汇付会员绑定接口error", e); + result = AjaxResult.error("删除汇付会员绑定接口异常"); } return result; } diff --git a/jsowell-pile/src/main/java/com/jsowell/adapay/dto/CreateCorpMemberDTO.java b/jsowell-pile/src/main/java/com/jsowell/adapay/dto/CreateCorpMemberDTO.java new file mode 100644 index 000000000..1b58e26c1 --- /dev/null +++ b/jsowell-pile/src/main/java/com/jsowell/adapay/dto/CreateCorpMemberDTO.java @@ -0,0 +1,29 @@ +package com.jsowell.adapay.dto; + +import lombok.*; + +import java.util.List; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class CreateCorpMemberDTO { + private String merchantId; + private String name; + private String provCode; + private String areaCode; + private String socialCreditCode; + private String socialCreditCodeExpires; + private String businessScope; + private String legalPerson; + private String legalCertId; + private String legalCertIdExpires; + private String legalMp; + private String address; + private String zipCode; + private String telphone; + private String email; + private List imgList; +} diff --git a/jsowell-pile/src/main/java/com/jsowell/adapay/dto/CreatePersonalMemberDTO.java b/jsowell-pile/src/main/java/com/jsowell/adapay/dto/CreatePersonalMemberDTO.java new file mode 100644 index 000000000..619b53149 --- /dev/null +++ b/jsowell-pile/src/main/java/com/jsowell/adapay/dto/CreatePersonalMemberDTO.java @@ -0,0 +1,16 @@ +package com.jsowell.adapay.dto; + +import lombok.*; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class CreatePersonalMemberDTO { + private String merchantId; + private String location; + private String email; + private String gender; + private String nickname; +} diff --git a/jsowell-pile/src/main/java/com/jsowell/adapay/dto/CreateSettleAccountDTO.java b/jsowell-pile/src/main/java/com/jsowell/adapay/dto/CreateSettleAccountDTO.java new file mode 100644 index 000000000..4bd503750 --- /dev/null +++ b/jsowell-pile/src/main/java/com/jsowell/adapay/dto/CreateSettleAccountDTO.java @@ -0,0 +1,23 @@ +package com.jsowell.adapay.dto; + +import lombok.*; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class CreateSettleAccountDTO { + private String merchantId; + private String bankAcctType; + private String cardId; + private String cardNo; + private String cardName; + private String certId; + private String certType; + private String telNo; + private String bankCode; + private String bankName; + private String provCode; + private String areaCode; +} diff --git a/jsowell-pile/src/main/java/com/jsowell/adapay/dto/DeleteAdapayMemberDTO.java b/jsowell-pile/src/main/java/com/jsowell/adapay/dto/DeleteAdapayMemberDTO.java new file mode 100644 index 000000000..a5559ddb6 --- /dev/null +++ b/jsowell-pile/src/main/java/com/jsowell/adapay/dto/DeleteAdapayMemberDTO.java @@ -0,0 +1,13 @@ +package com.jsowell.adapay.dto; + +import lombok.*; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class DeleteAdapayMemberDTO { + private String merchantId; + private String adapayMemberId; +} diff --git a/jsowell-pile/src/main/java/com/jsowell/adapay/dto/UpdateCorpMemberDTO.java b/jsowell-pile/src/main/java/com/jsowell/adapay/dto/UpdateCorpMemberDTO.java new file mode 100644 index 000000000..9a2c47a84 --- /dev/null +++ b/jsowell-pile/src/main/java/com/jsowell/adapay/dto/UpdateCorpMemberDTO.java @@ -0,0 +1,28 @@ +package com.jsowell.adapay.dto; + +import lombok.*; + +import java.util.List; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class UpdateCorpMemberDTO { + private String merchantId; + private String name; + private String provCode; + private String areaCode; + private String socialCreditCodeExpires; + private String businessScope; + private String legalPerson; + private String legalCertId; + private String legalCertIdExpires; + private String legalMp; + private String address; + private String zipCode; + private String telphone; + private String email; + private List imgList; +} diff --git a/jsowell-pile/src/main/java/com/jsowell/adapay/dto/UpdatePersonalMemberDTO.java b/jsowell-pile/src/main/java/com/jsowell/adapay/dto/UpdatePersonalMemberDTO.java new file mode 100644 index 000000000..312af46d4 --- /dev/null +++ b/jsowell-pile/src/main/java/com/jsowell/adapay/dto/UpdatePersonalMemberDTO.java @@ -0,0 +1,16 @@ +package com.jsowell.adapay.dto; + +import lombok.*; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class UpdatePersonalMemberDTO { + private String merchantId; + private String location; + private String email; + private String gender; + private String nickname; +} diff --git a/jsowell-pile/src/main/java/com/jsowell/adapay/service/AdapayService.java b/jsowell-pile/src/main/java/com/jsowell/adapay/service/AdapayService.java index ed1f2b6ae..295b56d1c 100644 --- a/jsowell-pile/src/main/java/com/jsowell/adapay/service/AdapayService.java +++ b/jsowell-pile/src/main/java/com/jsowell/adapay/service/AdapayService.java @@ -266,33 +266,91 @@ public class AdapayService { } /** - * 创建结算账户 - * - * @param dto - * @throws BaseAdaPayException - * @throws BusinessException + * 创建个人用户 */ - public void createSettleAccount(SettleAccountDTO dto) throws BaseAdaPayException, BusinessException { - String bankAcctType = dto.getBankAcctType(); + public void createAdapayMember(CreatePersonalMemberDTO dto) throws BaseAdaPayException, BusinessException { + SettleAccountDTO request = SettleAccountDTO.builder() + .merchantId(dto.getMerchantId()) + .location(dto.getLocation()) + .email(dto.getEmail()) + .gender(dto.getGender()) + .nickname(dto.getNickname()) + .wechatAppId(pileMerchantInfoService.queryAppIdByMerchantId(dto.getMerchantId())) + .build(); + createMember(request); + } + + /** + * 创建企业用户 + */ + public void createCorpMember(CreateCorpMemberDTO dto) throws BaseAdaPayException, BusinessException { + SettleAccountDTO request = SettleAccountDTO.builder() + .merchantId(dto.getMerchantId()) + .wechatAppId(pileMerchantInfoService.queryAppIdByMerchantId(dto.getMerchantId())) + .businessName(dto.getName()) + .provCode(dto.getProvCode()) + .areaCode(dto.getAreaCode()) + .socialCreditCode(dto.getSocialCreditCode()) + .socialCreditCodeExpires(dto.getSocialCreditCodeExpires()) + .businessScope(dto.getBusinessScope()) + .legalPerson(dto.getLegalPerson()) + .legalCertId(dto.getLegalCertId()) + .legalCertIdExpires(dto.getLegalCertIdExpires()) + .legalMp(dto.getLegalMp()) + .address(dto.getAddress()) + .zipCode(dto.getZipCode()) + .telphone(dto.getTelphone()) + .email(dto.getEmail()) + .imgList(dto.getImgList()) + .build(); + createCorpMember(request); + } + + /** + * 创建结算账户 + */ + public void createSettleAccount(CreateSettleAccountDTO dto) throws BaseAdaPayException, BusinessException { + AdapayMemberAccount adapayMemberAccount = requireCurrentMemberAccount(dto.getMerchantId()); + if (CollectionUtils.isNotEmpty(selectSettleAccount(dto.getMerchantId()))) { + throw new BusinessException("", "当前商户已存在结算账户"); + } - // 设置wechatAppId String wechatAppId = pileMerchantInfoService.queryAppIdByMerchantId(dto.getMerchantId()); - dto.setWechatAppId(wechatAppId); - - String cardId = dto.getCardId(); - String cardNo = dto.getCardNo(); - if (StringUtils.isBlank(cardId) && StringUtils.isNotBlank(cardNo)) { - dto.setCardId(cardNo); - } - if (StringUtils.isBlank(cardNo) && StringUtils.isNotBlank(cardId)) { - dto.setCardNo(cardId); + SettleAccountDTO request = buildSettleAccountDTO(dto); + Map settleCount = createSettleAccountRequest(request, adapayMemberAccount.getAdapayMemberId(), wechatAppId); + if (settleCount == null || StringUtils.equals((String) settleCount.get("status"), "failed")) { + String errorMsg = settleCount == null ? "创建汇付结算账户失败" : (String) settleCount.get("error_msg"); + throw new BusinessException("00500001", errorMsg); } - if (StringUtils.equals(bankAcctType, Constants.ONE)) { - createCorpMember(dto); - } else if (StringUtils.equals(bankAcctType, Constants.TWO)) { - createMember(dto); + AdapayMemberAccount updateRecord = new AdapayMemberAccount(); + updateRecord.setAdapayMemberId(adapayMemberAccount.getAdapayMemberId()); + updateRecord.setSettleAccountId((String) settleCount.get("id")); + adapayMemberAccountService.updateAdapayMemberAccountByMemberId(updateRecord); + } + + /** + * 查询当前商户的结算账户 + */ + public List selectSettleAccount(String merchantId) throws BaseAdaPayException { + AdapayMemberAccount adapayMemberAccount = adapayMemberAccountService.selectByMerchantId(merchantId); + if (adapayMemberAccount == null) { + return Lists.newArrayList(); } + String wechatAppId = pileMerchantInfoService.queryAppIdByMerchantId(merchantId); + String settleAccountId = adapayMemberAccount.getSettleAccountId(); + if (StringUtils.isBlank(settleAccountId) && isCorpMember(adapayMemberAccount.getAdapayMemberId())) { + AdapayCorpMemberVO corpMemberVO = queryCorpAdapayMemberInfo(adapayMemberAccount.getAdapayMemberId(), wechatAppId); + if (corpMemberVO != null) { + settleAccountId = corpMemberVO.getSettleAccountId(); + } + } + AdapaySettleAccountVO adapaySettleAccountVO = queryAdapaySettleAccount(adapayMemberAccount.getAdapayMemberId(), settleAccountId, wechatAppId); + if (adapaySettleAccountVO == null) { + return Lists.newArrayList(); + } + adapaySettleAccountVO.setMerchantId(merchantId); + return Lists.newArrayList(adapaySettleAccountVO); } /** @@ -314,9 +372,8 @@ public class AdapayService { // 查询汇付会员关系 AdapayMemberAccount adapayMemberAccount = adapayMemberAccountService.selectByMerchantId(dto.getMerchantId()); - if (adapayMemberAccount != null && StringUtils.equals(adapayMemberAccount.getStatus(), Constants.ONE)) { - log.error("通过merchantId:{}, 查询到结算账户配置:{}", dto.getMerchantId(), JSON.toJSONString(adapayMemberAccount)); - return; + if (adapayMemberAccount != null) { + throw new BusinessException("", "当前商户已绑定汇付用户"); } log.info("=======execute CreateMember begin======="); @@ -338,19 +395,10 @@ public class AdapayService { throw new BusinessException("00500001", errorMsg); } - Map settleCount = createSettleAccountRequest(dto, adapayMemberId, dto.getWechatAppId()); - - if (settleCount == null || StringUtils.equals((String) settleCount.get("status"), "failed")) { - String errorMsg = settleCount == null ? "创建汇付结算账户失败" : (String) settleCount.get("error_msg"); - throw new BusinessException("00500001", errorMsg); - } - - String settleAccountId = (String) settleCount.get("id"); // 保存到数据库 adapayMemberAccount = new AdapayMemberAccount(); adapayMemberAccount.setMerchantId(dto.getMerchantId()); adapayMemberAccount.setAdapayMemberId(adapayMemberId); - adapayMemberAccount.setSettleAccountId(settleAccountId); adapayMemberAccount.setStatus(Constants.ONE); adapayMemberAccountService.insertAdapayMemberAccount(adapayMemberAccount); } @@ -361,66 +409,61 @@ public class AdapayService { * @param merchantId * @return */ - public Map selectAdapayMember(String merchantId) throws BaseAdaPayException { - Map map = Maps.newHashMap(); + public AdapayMemberAggregateVO selectAdapayMember(String merchantId) throws BaseAdaPayException { AdapayMemberAccount adapayMemberAccount = adapayMemberAccountService.selectByMerchantId(merchantId); if (adapayMemberAccount == null) { log.error("通过merchantId:{}, 没有查询到结算账户配置", merchantId); return null; } - String bankAcctType = null; - AdapayMemberInfoVO adapayMemberInfoVO = null; - AdapayCorpMemberVO adapayCorpMemberVO = null; - List list = null; + AdapayMemberAggregateVO.AdapayMemberAggregateVOBuilder builder = AdapayMemberAggregateVO.builder() + .adapayMemberId(adapayMemberAccount.getAdapayMemberId()); // 审核失败 if (Constants.TWO.equals(adapayMemberAccount.getStatus())) { - bankAcctType = Constants.ONE; // 只有企业用户才会审核失败 - adapayCorpMemberVO = new AdapayCorpMemberVO(); + AdapayCorpMemberVO adapayCorpMemberVO = new AdapayCorpMemberVO(); MerchantInfoVO merchantInfoVO = pileMerchantInfoService.getMerchantInfoVO(adapayMemberAccount.getMerchantId()); if (merchantInfoVO != null) { adapayCorpMemberVO.setName(merchantInfoVO.getMerchantName()); } adapayCorpMemberVO.setAuditState("B"); adapayCorpMemberVO.setAuditDesc(adapayMemberAccount.getRemark()); - map.put("adapayCorpMember", adapayCorpMemberVO); - map.put("bankAcctType", bankAcctType); - map.put("adapayMember", adapayMemberInfoVO); - map.put("settleAccountList", list); - return map; + return builder + .memberType("CORP") + .bankAcctType(Constants.ONE) + .adapayCorpMember(adapayCorpMemberVO) + .settleAccountList(Lists.newArrayList()) + .canDeleteUser(true) + .build(); } // 通过merchantId获取appId String wechatAppId = pileMerchantInfoService.queryAppIdByMerchantId(merchantId); String adapayMemberId = adapayMemberAccount.getAdapayMemberId(); + List settleAccountList = selectSettleAccount(merchantId); + boolean canDeleteUser = CollectionUtils.isEmpty(settleAccountList); + builder + .settleAccountList(settleAccountList) + .canDeleteUser(canDeleteUser) + .deleteBlockReason(canDeleteUser ? "" : "请先删除结算账户"); if (StringUtils.startsWith(adapayMemberId, Constants.ADAPAY_MEMBER_PREFIX)) { - bankAcctType = Constants.TWO; // 查询个人用户 - adapayMemberInfoVO = queryAdapayMemberInfo(adapayMemberId, wechatAppId); - if (adapayMemberInfoVO != null) { - adapayMemberInfoVO.setMerchantId(merchantId); - } - AdapaySettleAccountVO adapaySettleAccountVO = queryAdapaySettleAccount(adapayMemberId, adapayMemberAccount.getSettleAccountId(), wechatAppId); - if (adapaySettleAccountVO != null) { - adapaySettleAccountVO.setMerchantId(merchantId); - } - map.put("adapayMember", adapayMemberInfoVO); - list = Lists.newArrayList(adapaySettleAccountVO); - map.put("settleAccountList", list); - - } else { - bankAcctType = Constants.ONE; - // 查询企业用户 - adapayCorpMemberVO = queryCorpAdapayMemberInfo(adapayMemberId, wechatAppId); + AdapayMemberInfoVO adapayMemberInfoVO = queryAdapayMemberInfo(adapayMemberId, wechatAppId); + return builder + .memberType("PERSONAL") + .bankAcctType(Constants.TWO) + .adapayMember(adapayMemberInfoVO) + .build(); } - map.put("bankAcctType", bankAcctType); - map.put("adapayMember", adapayMemberInfoVO); - map.put("settleAccountList", list); - map.put("adapayCorpMember", adapayCorpMemberVO); - return map; + // 查询企业用户 + AdapayCorpMemberVO adapayCorpMemberVO = queryCorpAdapayMemberInfo(adapayMemberId, wechatAppId); + return builder + .memberType("CORP") + .bankAcctType(Constants.ONE) + .adapayCorpMember(adapayCorpMemberVO) + .build(); } @@ -449,6 +492,7 @@ public class AdapayService { QueryMemberResponse queryMemberResponse = JSON.parseObject(JSON.toJSONString(member), QueryMemberResponse.class); AdapayMemberInfoVO resultVO = AdapayMemberInfoVO.builder() + .memberId(adapayMemberId) .nickname(queryMemberResponse.getNickname()) .gender(queryMemberResponse.getGender()) .email(queryMemberResponse.getEmail()) @@ -761,6 +805,11 @@ public class AdapayService { // 逻辑删除原来审核不通过的记录 adapayMemberAccountService.deleteAuditFailed(dto.getMerchantId()); + AdapayMemberAccount currentAccount = adapayMemberAccountService.selectByMerchantId(dto.getMerchantId()); + if (currentAccount != null) { + throw new BusinessException("", "当前商户已绑定汇付用户"); + } + // 创建企业用户参数 Map memberParams = Maps.newHashMap(); String adapayMemberId = Constants.ADAPAY_CORP_MEMBER_PREFIX + IdUtils.getMemberId(); @@ -790,10 +839,6 @@ public class AdapayService { memberParams.put("zip_code", dto.getZipCode()); memberParams.put("telphone", dto.getTelphone()); memberParams.put("email", dto.getEmail()); - memberParams.put("bank_code", dto.getBankCode()); - memberParams.put("bank_acct_type", dto.getBankAcctType()); - memberParams.put("card_no", dto.getCardNo()); - memberParams.put("card_name", dto.getCardName()); memberParams.put("notify_url", ADAPAY_CALLBACK_URL); File file = ZipUtil.createZipFileFromImages(dto.getImgList()); Map member = CorpMember.create(memberParams, file, config.getWechatAppId()); @@ -958,6 +1003,63 @@ public class AdapayService { * @return * @throws BaseAdaPayException */ + public void updateAdapayMember(Map payload) throws BaseAdaPayException { + String merchantId = (String) payload.get("merchantId"); + AdapayMemberAccount adapayMemberAccount = requireCurrentMemberAccount(merchantId); + if (isPersonalMember(adapayMemberAccount.getAdapayMemberId())) { + UpdatePersonalMemberDTO dto = JSON.parseObject(JSON.toJSONString(payload), UpdatePersonalMemberDTO.class); + updatePersonalMember(dto); + return; + } + + UpdateCorpMemberDTO dto = JSON.parseObject(JSON.toJSONString(payload), UpdateCorpMemberDTO.class); + updateCorpMember(dto); + } + + public void updateCorpMember(UpdateCorpMemberDTO dto) throws BaseAdaPayException { + SettleAccountDTO request = SettleAccountDTO.builder() + .merchantId(dto.getMerchantId()) + .businessName(dto.getName()) + .provCode(dto.getProvCode()) + .areaCode(dto.getAreaCode()) + .socialCreditCodeExpires(dto.getSocialCreditCodeExpires()) + .businessScope(dto.getBusinessScope()) + .legalPerson(dto.getLegalPerson()) + .legalCertId(dto.getLegalCertId()) + .legalCertIdExpires(dto.getLegalCertIdExpires()) + .legalMp(dto.getLegalMp()) + .address(dto.getAddress()) + .zipCode(dto.getZipCode()) + .telphone(dto.getTelphone()) + .email(dto.getEmail()) + .imgList(dto.getImgList()) + .build(); + updateAdapayMember(request); + } + + public void updatePersonalMember(UpdatePersonalMemberDTO dto) throws BaseAdaPayException { + String wechatAppId = pileMerchantInfoService.queryAppIdByMerchantId(dto.getMerchantId()); + AbstractAdapayConfig config = AdapayConfigFactory.getConfig(wechatAppId); + if (config == null) { + throw new BusinessException(ReturnCodeEnum.CODE_ADAPAY_CONFIG_IS_NULL_ERROR); + } + + AdapayMemberAccount adapayMemberAccount = requireCurrentMemberAccount(dto.getMerchantId()); + Map memberParams = Maps.newHashMap(); + memberParams.put("member_id", adapayMemberAccount.getAdapayMemberId()); + memberParams.put("app_id", config.getAdapayAppId()); + memberParams.put("location", dto.getLocation()); + memberParams.put("email", dto.getEmail()); + memberParams.put("gender", dto.getGender()); + memberParams.put("nickname", dto.getNickname()); + Map member = Member.update(memberParams, config.getWechatAppId()); + log.info("更新个人账户param:{}, result:{}", JSON.toJSONString(memberParams), JSON.toJSONString(member)); + if (member == null || AdapayStatusEnum.FAILED.getValue().equals((String) member.get("status"))) { + String errorMsg = member == null ? "更新汇付个人用户失败" : (String) member.get("error_msg"); + throw new BusinessException("", errorMsg); + } + } + public Map updateAdapayMember(SettleAccountDTO dto) throws BaseAdaPayException { String wechatAppId = pileMerchantInfoService.queryAppIdByMerchantId(dto.getMerchantId()); // 获取汇付支付配置 @@ -1486,7 +1588,13 @@ public class AdapayService { settleAccountDTO.setBankAcctType(dto.getBankAcctType()); settleAccountDTO.setProvCode(dto.getProvCode()); settleAccountDTO.setAreaCode(dto.getAreaCode()); - this.createSettleAccountRequest(settleAccountDTO, adapayMemberId, wechatAppId); + Map settleAccount = this.createSettleAccountRequest(settleAccountDTO, adapayMemberId, wechatAppId); + if (settleAccount != null && !StringUtils.equals((String) settleAccount.get("status"), "failed")) { + AdapayMemberAccount updateRecord = new AdapayMemberAccount(); + updateRecord.setAdapayMemberId(adapayMemberId); + updateRecord.setSettleAccountId((String) settleAccount.get("id")); + adapayMemberAccountService.updateAdapayMemberAccountByMemberId(updateRecord); + } } /** @@ -1551,33 +1659,21 @@ public class AdapayService { * @throws BaseAdaPayException */ public void createBankAccount(SettleAccountDTO dto) throws BaseAdaPayException { - // 根据运营商id 查出现有的adapayMemberId - String merchantId = dto.getMerchantId(); - // 新写一个查询方法,查询最近一条的记录(因为之前已经删除过数据,使用原查询方法查不到数据) - AdapayMemberAccount adapayMemberAccount = adapayMemberAccountService.selectRecentInfoByMerchantId(merchantId); - if (adapayMemberAccount == null) { - return; - } - String adapayMemberId = adapayMemberAccount.getAdapayMemberId(); - // 查询该商户的wxAppId - String wxAppId = pileMerchantInfoService.queryAppIdByMerchantId(merchantId); - // 创建结算账户请求 - Map settleAccount = this.createSettleAccountRequest(dto, adapayMemberId, wxAppId); - - // 保存结果 - if (settleAccount == null || StringUtils.equals((String) settleAccount.get("status"), "failed")) { - String errorMsg = settleAccount == null ? "创建汇付结算账户失败" : (String) settleAccount.get("error_msg"); - throw new BusinessException("00500001", errorMsg); - } - - String settleAccountId = (String) settleAccount.get("id"); - // 保存到数据库 - adapayMemberAccount = new AdapayMemberAccount(); - adapayMemberAccount.setMerchantId(dto.getMerchantId()); - adapayMemberAccount.setAdapayMemberId(adapayMemberId); - adapayMemberAccount.setSettleAccountId(settleAccountId); - adapayMemberAccount.setStatus(Constants.ONE); - adapayMemberAccountService.insertAdapayMemberAccount(adapayMemberAccount); + CreateSettleAccountDTO request = CreateSettleAccountDTO.builder() + .merchantId(dto.getMerchantId()) + .bankAcctType(dto.getBankAcctType()) + .cardId(dto.getCardId()) + .cardNo(dto.getCardNo()) + .cardName(dto.getCardName()) + .certId(dto.getCertId()) + .certType(dto.getCertType()) + .telNo(dto.getTelNo()) + .bankCode(dto.getBankCode()) + .bankName(dto.getBankName()) + .provCode(dto.getProvCode()) + .areaCode(dto.getAreaCode()) + .build(); + createSettleAccount(request); } /** @@ -1586,14 +1682,79 @@ public class AdapayService { * @throws BaseAdaPayException */ public void deleteSettleAccount(AdapayMemberInfoDTO dto) throws BaseAdaPayException { - // 查询appId + AdapayMemberAccount adapayMemberAccount = requireCurrentMemberAccount(dto.getMerchantId()); String wechatAppId = pileMerchantInfoService.queryAppIdByMerchantId(dto.getMerchantId()); - // 1、新建删除请求 2、如果成功,再将数据库中的记录删除 - this.createDeleteSettleAccountRequest(dto.getAdapayMemberId(), dto.getSettleAccountId(), wechatAppId); - // 删除数据库中的记录 + String adapayMemberId = StringUtils.isNotBlank(dto.getAdapayMemberId()) ? dto.getAdapayMemberId() : adapayMemberAccount.getAdapayMemberId(); + String settleAccountId = StringUtils.isNotBlank(dto.getSettleAccountId()) ? dto.getSettleAccountId() : adapayMemberAccount.getSettleAccountId(); + if (StringUtils.isBlank(settleAccountId) && isCorpMember(adapayMemberId)) { + AdapayCorpMemberVO corpMemberVO = queryCorpAdapayMemberInfo(adapayMemberId, wechatAppId); + if (corpMemberVO != null) { + settleAccountId = corpMemberVO.getSettleAccountId(); + } + } + if (StringUtils.isBlank(settleAccountId)) { + throw new BusinessException("", "未查询到结算账户"); + } + + this.createDeleteSettleAccountRequest(adapayMemberId, settleAccountId, wechatAppId); + adapayMemberAccountService.clearSettleAccountByMerchantId(dto.getMerchantId()); + } + + public void deleteAdapayMember(DeleteAdapayMemberDTO dto) throws BaseAdaPayException { + AdapayMemberAccount adapayMemberAccount = requireCurrentMemberAccount(dto.getMerchantId()); + if (StringUtils.isNotBlank(dto.getAdapayMemberId()) + && !StringUtils.equals(dto.getAdapayMemberId(), adapayMemberAccount.getAdapayMemberId())) { + throw new BusinessException("", "汇付用户信息不匹配"); + } + + if (CollectionUtils.isNotEmpty(selectSettleAccount(dto.getMerchantId()))) { + throw new BusinessException("", "请先删除结算账户"); + } adapayMemberAccountService.deleteAccountByMerchantId(dto.getMerchantId()); } + private AdapayMemberAccount requireCurrentMemberAccount(String merchantId) { + AdapayMemberAccount adapayMemberAccount = adapayMemberAccountService.selectByMerchantId(merchantId); + if (adapayMemberAccount == null) { + throw new BusinessException(ReturnCodeEnum.CODE_ADAPAY_MEMBER_IS_NULL_ERROR); + } + return adapayMemberAccount; + } + + private boolean isPersonalMember(String adapayMemberId) { + return StringUtils.startsWith(adapayMemberId, Constants.ADAPAY_MEMBER_PREFIX); + } + + private boolean isCorpMember(String adapayMemberId) { + return StringUtils.startsWith(adapayMemberId, Constants.ADAPAY_CORP_MEMBER_PREFIX); + } + + private SettleAccountDTO buildSettleAccountDTO(CreateSettleAccountDTO dto) { + SettleAccountDTO request = SettleAccountDTO.builder() + .merchantId(dto.getMerchantId()) + .bankAcctType(dto.getBankAcctType()) + .cardId(dto.getCardId()) + .cardNo(dto.getCardNo()) + .cardName(dto.getCardName()) + .certId(dto.getCertId()) + .certType(dto.getCertType()) + .telNo(dto.getTelNo()) + .bankCode(dto.getBankCode()) + .bankName(dto.getBankName()) + .provCode(dto.getProvCode()) + .areaCode(dto.getAreaCode()) + .build(); + String cardId = request.getCardId(); + String cardNo = request.getCardNo(); + if (StringUtils.isBlank(cardId) && StringUtils.isNotBlank(cardNo)) { + request.setCardId(cardNo); + } + if (StringUtils.isBlank(cardNo) && StringUtils.isNotBlank(cardId)) { + request.setCardNo(cardId); + } + return request; + } + /** * 根据paymentIdList查询分账信息 * @param paymentIdList diff --git a/jsowell-pile/src/main/java/com/jsowell/adapay/vo/AdapayMemberAggregateVO.java b/jsowell-pile/src/main/java/com/jsowell/adapay/vo/AdapayMemberAggregateVO.java new file mode 100644 index 000000000..26260865a --- /dev/null +++ b/jsowell-pile/src/main/java/com/jsowell/adapay/vo/AdapayMemberAggregateVO.java @@ -0,0 +1,21 @@ +package com.jsowell.adapay.vo; + +import lombok.*; + +import java.util.List; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class AdapayMemberAggregateVO { + private String memberType; + private String bankAcctType; + private String adapayMemberId; + private Boolean canDeleteUser; + private String deleteBlockReason; + private AdapayMemberInfoVO adapayMember; + private AdapayCorpMemberVO adapayCorpMember; + private List settleAccountList; +} diff --git a/jsowell-pile/src/main/java/com/jsowell/adapay/vo/AdapayMemberInfoVO.java b/jsowell-pile/src/main/java/com/jsowell/adapay/vo/AdapayMemberInfoVO.java index 6fda095b0..de4240d40 100644 --- a/jsowell-pile/src/main/java/com/jsowell/adapay/vo/AdapayMemberInfoVO.java +++ b/jsowell-pile/src/main/java/com/jsowell/adapay/vo/AdapayMemberInfoVO.java @@ -8,6 +8,8 @@ import lombok.*; @AllArgsConstructor @Builder public class AdapayMemberInfoVO { + // 汇付会员id + private String memberId; // 运营商id private String merchantId; // 地址 diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/mapper/AdapayMemberAccountMapper.java b/jsowell-pile/src/main/java/com/jsowell/pile/mapper/AdapayMemberAccountMapper.java index 0dacb435a..daa906b51 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/mapper/AdapayMemberAccountMapper.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/mapper/AdapayMemberAccountMapper.java @@ -126,6 +126,8 @@ public interface AdapayMemberAccountMapper { */ void deleteAccountByMerchantId(String merchantId); + void clearSettleAccountByMerchantId(String merchantId); + /** * 根据运营商id查询最近一条的信息 * @param merchantId diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/AdapayMemberAccountService.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/AdapayMemberAccountService.java index c9f9d2751..09e6e3ddd 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/AdapayMemberAccountService.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/AdapayMemberAccountService.java @@ -116,6 +116,8 @@ public interface AdapayMemberAccountService { */ void deleteAccountByMerchantId(String merchantId); + void clearSettleAccountByMerchantId(String merchantId); + /** * 根据运营商Id查询最近一条的信息 * @param merchantId diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/AdapayMemberAccountServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/AdapayMemberAccountServiceImpl.java index bb3ef5304..41e5d767f 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/AdapayMemberAccountServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/AdapayMemberAccountServiceImpl.java @@ -262,6 +262,13 @@ public class AdapayMemberAccountServiceImpl implements AdapayMemberAccountServic @Override public void deleteAccountByMerchantId(String merchantId) { adapayMemberAccountMapper.deleteAccountByMerchantId(merchantId); + redisCache.deleteObject(CacheConstants.ADAPAY_MEMBER_ACCOUNT + merchantId); + } + + @Override + public void clearSettleAccountByMerchantId(String merchantId) { + adapayMemberAccountMapper.clearSettleAccountByMerchantId(merchantId); + redisCache.deleteObject(CacheConstants.ADAPAY_MEMBER_ACCOUNT + merchantId); } /** @@ -282,4 +289,3 @@ public class AdapayMemberAccountServiceImpl implements AdapayMemberAccountServic return adapayMemberAccountMapper.selectUsedAdapayMemberIdByMerchantId(merchantId); } } - diff --git a/jsowell-pile/src/main/resources/mapper/pile/AdapayMemberAccountMapper.xml b/jsowell-pile/src/main/resources/mapper/pile/AdapayMemberAccountMapper.xml index f6e6893ef..5c590b5cf 100644 --- a/jsowell-pile/src/main/resources/mapper/pile/AdapayMemberAccountMapper.xml +++ b/jsowell-pile/src/main/resources/mapper/pile/AdapayMemberAccountMapper.xml @@ -515,6 +515,8 @@ from adapay_member_account where del_flag = '0' and merchant_id = #{merchantId,jdbcType=VARCHAR} + order by create_time desc, id desc + limit 1 @@ -532,8 +534,18 @@ update adapay_member_account - set del_flag = '0' + set del_flag = '1' where merchant_id = #{merchantId,jdbcType=VARCHAR} + and del_flag = '0' + + + + update + adapay_member_account + set settle_account_id = null, + update_time = now() + where merchant_id = #{merchantId,jdbcType=VARCHAR} + and del_flag = '0'