From bfd6c3fd2bf6e6a2c1b2c0c9d9e85a7b88103dcb Mon Sep 17 00:00:00 2001
From: hejianhao <15708179461@qq.com>
Date: 星期四, 20 八月 2026 15:29:26 +0800
Subject: [PATCH] feat0806: 新流程下创建门店绑定普通代理
---
tcm-training-admin-backend/src/main/java/com/tcm/training/admin/member/service/ClinicAppService.java | 167 ++++++++++++++++++++++++++++++++++++++++++-------------
1 files changed, 127 insertions(+), 40 deletions(-)
diff --git a/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/member/service/ClinicAppService.java b/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/member/service/ClinicAppService.java
index f6343aa..38ae9da 100644
--- a/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/member/service/ClinicAppService.java
+++ b/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/member/service/ClinicAppService.java
@@ -4,6 +4,7 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fasterxml.jackson.databind.JsonNode;
import com.tcm.training.admin.agent.entity.AgentRegion;
import com.tcm.training.admin.agent.entity.ProvincialAgent;
import com.tcm.training.admin.agent.excel.ClinicAgentImportRow;
@@ -28,8 +29,14 @@
import com.tcm.training.admin.member.vo.ClinicDetailVO;
import com.tcm.training.admin.member.vo.ClinicListItemVO;
import com.tcm.training.admin.member.vo.ClinicRegionOptionVO;
+import com.tcm.training.admin.utils.VzanHttpUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.stereotype.Service;
+import org.springframework.transaction.TransactionDefinition;
+import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.support.DefaultTransactionDefinition;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
@@ -39,6 +46,7 @@
import java.util.*;
@Service
+@Slf4j
public class ClinicAppService {
private final ClinicQueryMapper clinicQueryMapper;
@@ -46,13 +54,23 @@
private final ProvincialAgentMapper provincialAgentMapper;
private final UserMapper userMapper;
private final SysRegionMapper sysRegionMapper;
+ private final VzanHttpUtil vzanHttpUtil;
+ private final DataSourceTransactionManager transactionManager;
- public ClinicAppService(ClinicQueryMapper clinicQueryMapper, ClinicMapper clinicMapper, ProvincialAgentMapper provincialAgentMapper, UserMapper userMapper, SysRegionMapper sysRegionMapper) {
+ public ClinicAppService(ClinicQueryMapper clinicQueryMapper,
+ ClinicMapper clinicMapper,
+ ProvincialAgentMapper provincialAgentMapper,
+ UserMapper userMapper,
+ SysRegionMapper sysRegionMapper,
+ VzanHttpUtil vzanHttpUtil,
+ DataSourceTransactionManager transactionManager) {
this.clinicQueryMapper = clinicQueryMapper;
this.clinicMapper = clinicMapper;
this.provincialAgentMapper = provincialAgentMapper;
this.userMapper = userMapper;
this.sysRegionMapper = sysRegionMapper;
+ this.vzanHttpUtil = vzanHttpUtil;
+ this.transactionManager = transactionManager;
}
public PageResponse<ClinicListItemVO> page(int page,
@@ -229,52 +247,121 @@
return vo;
}
- @Transactional
public ClinicDetailVO updateBankAccount(Long id, ClinicBankAccountUpdateRequest request) {
- Clinic clinic = clinicMapper.selectById(id);
- if (clinic == null || (clinic.getDeleted() != null && clinic.getDeleted() == 1)) {
- throw new IllegalArgumentException("诊所不存在");
- }
- String loginAccount = trimToNull(request.getLoginAccount());
- AppUser user = userMapper.selectOne(new LambdaQueryWrapper<AppUser>().eq(AppUser::getPhone, loginAccount).eq(AppUser::getDeleted, 0).last("limit 1"));
- if (user == null) {
- throw new IllegalArgumentException("登录账号不存在");
- }
- user.setAvatar(trimToNull(request.getAvatar()));
- user.setPhone(loginAccount);
- userMapper.updateById(user);
- Set<String> codes = new LinkedHashSet<String>();
- addCode(codes, request.getProvinceCode());
- addCode(codes, request.getCityCode());
- addCode(codes, request.getDistrictCode());
- Map<String, SysRegion> regions = new HashMap<String, SysRegion>();
- List<SysRegion> regionList = sysRegionMapper.selectList(new LambdaQueryWrapper<SysRegion>().in(SysRegion::getCode, codes));
- if (!regionList.isEmpty()) {
- for (SysRegion region : regionList) {
- regions.put(region.getCode(), region);
+ // 手动开启事务
+ DefaultTransactionDefinition def = new DefaultTransactionDefinition();
+ def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
+ TransactionStatus status = transactionManager.getTransaction(def);
+
+ try {
+ Clinic clinic = clinicMapper.selectById(id);
+ if (clinic == null || (clinic.getDeleted() != null && clinic.getDeleted() == 1)) {
+ throw new IllegalArgumentException("诊所不存在");
}
+ String loginAccount = trimToNull(request.getLoginAccount());
+ AppUser user = userMapper.selectOne(new LambdaQueryWrapper<AppUser>().eq(AppUser::getPhone, loginAccount).eq(AppUser::getDeleted, 0).last("limit 1"));
+ if (user == null) {
+ throw new IllegalArgumentException("登录账号不存在");
+ }
+ user.setAvatar(trimToNull(request.getAvatar()));
+ user.setPhone(loginAccount);
+ userMapper.updateById(user);
+ Set<String> codes = new LinkedHashSet<String>();
+ addCode(codes, request.getProvinceCode());
+ addCode(codes, request.getCityCode());
+ addCode(codes, request.getDistrictCode());
+ Map<String, SysRegion> regions = new HashMap<String, SysRegion>();
+ List<SysRegion> regionList = sysRegionMapper.selectList(new LambdaQueryWrapper<SysRegion>().in(SysRegion::getCode, codes));
+ if (!regionList.isEmpty()) {
+ for (SysRegion region : regionList) {
+ regions.put(region.getCode(), region);
+ }
+ }
+
+ clinic.setName(trimToNull(request.getName()));
+ clinic.setContactPhone(loginAccount);
+ clinic.setProvinceCode(trimToNull(request.getProvinceCode()));
+ clinic.setProvinceName(regionName(request.getProvinceCode(), request.getProvinceName(), regions));
+ clinic.setCityCode(trimToNull(request.getCityCode()));
+ clinic.setCityName(regionName(request.getCityCode(), request.getCityName(), regions));
+ clinic.setDistrictCode(trimToNull(request.getDistrictCode()));
+ clinic.setDistrictName(regionName(request.getDistrictCode(), request.getDistrictName(), regions));
+ clinic.setAddress(trimToNull(request.getAddress()));
+ clinic.setBusinessLicenseUrl(trimToNull(request.getBusinessLicenseUrl()));
+ clinic.setStatus(request.getStatus());
+ clinic.setAgentId(request.getAgentId());
+ clinic.setBankName(trimToNull(request.getBankName()));
+ clinic.setAccountHolder(trimToNull(request.getAccountHolder()));
+ clinic.setAccountNumber(trimToNull(request.getAccountNumber()));
+ clinic.setBranchName(trimToNull(request.getBranchName()));
+ clinicMapper.updateById(clinic);
+
+ // 提交事务
+ transactionManager.commit(status);
+ log.info("诊所本地数据更新成功,clinicId={}", id);
+
+ } catch (Exception e) {
+ // 发生异常,回滚事务
+ transactionManager.rollback(status);
+ log.error("诊所本地数据更新失败,clinicId={}", id, e);
+ throw e;
}
- clinic.setName(trimToNull(request.getName()));
- clinic.setContactPhone(loginAccount);
- clinic.setProvinceCode(trimToNull(request.getProvinceCode()));
- clinic.setProvinceName(regionName(request.getProvinceCode(), request.getProvinceName(), regions));
- clinic.setCityCode(trimToNull(request.getCityCode()));
- clinic.setCityName(regionName(request.getCityCode(), request.getCityName(), regions));
- clinic.setDistrictCode(trimToNull(request.getDistrictCode()));
- clinic.setDistrictName(regionName(request.getDistrictCode(), request.getDistrictName(), regions));
- clinic.setAddress(trimToNull(request.getAddress()));
- clinic.setBusinessLicenseUrl(trimToNull(request.getBusinessLicenseUrl()));
- clinic.setStatus(request.getStatus());
- clinic.setAgentId(request.getAgentId());
- clinic.setBankName(trimToNull(request.getBankName()));
- clinic.setAccountHolder(trimToNull(request.getAccountHolder()));
- clinic.setAccountNumber(trimToNull(request.getAccountNumber()));
- clinic.setBranchName(trimToNull(request.getBranchName()));
- clinicMapper.updateById(clinic);
+ // 事务提交后,调用微赞接口(不回滚本地事务)
+ try {
+ Clinic clinic = clinicMapper.selectById(id);
+
+ // 调用微赞创建门店
+ Integer provinceCode = parseRegionCode(clinic.getProvinceCode(), "省编码");
+ Integer cityCode = parseRegionCode(clinic.getCityCode(), "市编码");
+ Integer areaCode = parseRegionCode(clinic.getDistrictCode(), "区县编码");
+ log.info("调用微赞创建门店,入参 title={}, provinceCode={}, cityCode={}, areaCode={}, address={}, telephone={}",
+ clinic.getName(), provinceCode, cityCode, areaCode, clinic.getAddress(), clinic.getContactPhone());
+ JsonNode vzanStoreResponse = vzanHttpUtil.createStore(clinic.getName(), provinceCode, cityCode, areaCode, clinic.getAddress(), clinic.getContactPhone());
+ log.info("微赞创建门店成功,出参={}", vzanStoreResponse);
+
+ // 查询代理信息获取parentMobile
+ ProvincialAgent agent = provincialAgentMapper.selectById(request.getAgentId());
+ if (agent == null) {
+ throw new IllegalArgumentException("代理不存在,agentId=" + request.getAgentId());
+ }
+ String parentMobile = agent.getContactInfo();
+ if (parentMobile == null || parentMobile.trim().isEmpty()) {
+ throw new IllegalArgumentException("代理联系方式为空,agentId=" + request.getAgentId());
+ }
+
+ // 调用微赞创建代理
+ log.info("调用微赞创建代理,入参 agentMobile={}, agentName={}, levelCode=1, storeName={}, parentMobile={}",
+ clinic.getContactPhone(), clinic.getName(), clinic.getName(), parentMobile);
+ JsonNode vzanAgentResponse = vzanHttpUtil.createAgent(
+ clinic.getContactPhone(), // agentMobile传门店的手机号
+ clinic.getName(), // agentName传门店的名称
+ 1, // levelCode传1
+ parentMobile, // parentMobile传代理的contact_info
+ clinic.getName() // storeName传门店的name
+ );
+ log.info("微赞创建代理成功,出参={}", vzanAgentResponse);
+
+ } catch (Exception e) {
+ // 捕获微赞接口异常,不回滚本地事务
+ log.error("调用微赞接口失败,但本地数据已保存成功,clinicId={}", id, e);
+ throw new IllegalStateException("调用微赞失败", e);
+ }
+
return detail(id);
}
+ private Integer parseRegionCode(String code, String fieldName) {
+ if (code == null || code.trim().isEmpty()) {
+ throw new IllegalArgumentException(fieldName + "不能为空");
+ }
+ try {
+ return Integer.parseInt(code);
+ } catch (NumberFormatException e) {
+ throw new IllegalArgumentException(fieldName + "格式错误: " + code);
+ }
+ }
+
private void addCode(Set<String> codes, String code) {
String value = trimToNull(code);
if (value != null) {
--
Gitblit v1.7.1