hejianhao
2026-08-28 cc31d303d12f9c7cd2c4574351b67db04069ae0d
tcm-training-admin-backend/src/main/java/com/tcm/training/admin/member/service/ClinicAppService.java
@@ -28,8 +28,13 @@
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 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 +44,7 @@
import java.util.*;
@Service
@Slf4j
public class ClinicAppService {
    private final ClinicQueryMapper clinicQueryMapper;
@@ -46,13 +52,20 @@
    private final ProvincialAgentMapper provincialAgentMapper;
    private final UserMapper userMapper;
    private final SysRegionMapper sysRegionMapper;
    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,
                           DataSourceTransactionManager transactionManager) {
        this.clinicQueryMapper = clinicQueryMapper;
        this.clinicMapper = clinicMapper;
        this.provincialAgentMapper = provincialAgentMapper;
        this.userMapper = userMapper;
        this.sysRegionMapper = sysRegionMapper;
        this.transactionManager = transactionManager;
    }
    public PageResponse<ClinicListItemVO> page(int page,
@@ -60,6 +73,7 @@
                                               String regionCode,
                                               String name,
                                               String phone,
                                               String agentName,
                                               LocalDateTime createdFrom,
                                               LocalDateTime createdTo,
                                               Integer status) {
@@ -68,6 +82,7 @@
                trimToNull(regionCode),
                trimToNull(name),
                trimToNull(phone),
                trimToNull(agentName),
                createdFrom,
                createdTo,
                status
@@ -159,6 +174,7 @@
    public void export(String regionCode,
                       String name,
                       String phone,
                       String agentName,
                       LocalDateTime createdFrom,
                       LocalDateTime createdTo,
                       Integer status,
@@ -172,6 +188,7 @@
                trimToNull(regionCode),
                trimToNull(name),
                trimToNull(phone),
                trimToNull(agentName),
                createdFrom,
                createdTo,
                status
@@ -229,49 +246,66 @@
        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);
        return detail(id);
    }
@@ -343,6 +377,7 @@
        item.setPhone(row.getPhone() == null ? "-" : PhoneMasker.mask(row.getPhone()));
        item.setRegionName(defaultText(row.getRegionName()));
        item.setStatus(row.getStatus());
        item.setAgentName(defaultText(row.getAgentName()));
        item.setUserCount(row.getUserCount() == null ? 0 : row.getUserCount());
        item.setCreatedAt(row.getCreatedAt());
        item.setBusinessLicenseUrl(trimToNull(row.getBusinessLicenseUrl()));