hejianhao
2026-09-01 4b4d225c0f8456b8918dc79eec2e093485746d0f
fix0901: 修复问题2
18个文件已修改
108 ■■■■■ 已修改文件
tcm-training-admin-backend/src/main/java/com/tcm/training/admin/agent/entity/AgentRegion.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
tcm-training-admin-backend/src/main/java/com/tcm/training/admin/agent/entity/ProvincialAgent.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
tcm-training-admin-backend/src/main/java/com/tcm/training/admin/agent/service/ProvincialAgentAppService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
tcm-training-admin-backend/src/main/java/com/tcm/training/admin/app/bankcard/service/AppBankCardService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
tcm-training-admin-backend/src/main/java/com/tcm/training/admin/app/popularization/service/AppHealthPopularizationService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
tcm-training-admin-backend/src/main/java/com/tcm/training/admin/app/projectintroduction/service/AppProjectIntroductionService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
tcm-training-admin-backend/src/main/java/com/tcm/training/admin/app/register/service/AppRegisterService.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
tcm-training-admin-backend/src/main/java/com/tcm/training/admin/bootstrap/DataInitializer.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/entity/Clinic.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/entity/HealthPopularization.java 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/entity/LiveCourse.java 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/entity/ProjectIntroduction.java 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/entity/ProjectIntroductionPassword.java 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/service/HealthPopularizationAppService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/service/LiveCourseAppService.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/service/LiveRoomSettingService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/service/ProjectIntroductionAppService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/service/ProjectIntroductionPasswordService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
tcm-training-admin-backend/src/main/java/com/tcm/training/admin/agent/entity/AgentRegion.java
@@ -11,12 +11,14 @@
import java.time.LocalDateTime;
/** 省级代理负责的行政区域。 */
@TableName("tcm_agent_region")
@Getter
@Setter
@NoArgsConstructor
public class AgentRegion {
    /** 主键。 */
    @TableId(type = IdType.AUTO)
    private Long id;
@@ -35,3 +37,8 @@
    @TableField("created_at")
    private LocalDateTime createdAt;
}
    /** 代理ID。 */
    /** 行政区域编码。 */
    /** 行政区域名称。 */
    /** 行政区域层级。 */
    /** 创建时间。 */
tcm-training-admin-backend/src/main/java/com/tcm/training/admin/agent/entity/ProvincialAgent.java
@@ -7,15 +7,18 @@
import java.time.LocalDateTime;
/** 省级代理及其结算、联系信息。 */
@TableName("tcm_provincial_agent")
@Getter
@Setter
@NoArgsConstructor
public class ProvincialAgent {
    /** 主键。 */
    @TableId(type = IdType.AUTO)
    private Long id;
    /** 代理名称。 */
    @TableField("agent_name")
    private String agentName;
@@ -37,8 +40,10 @@
    @TableField("contact_info")
    private String contactInfo;
    /** 状态:0禁用,1启用。 */
    private Integer status;
    /** 联系地址。 */
    @TableField("address")
    private String address;
tcm-training-admin-backend/src/main/java/com/tcm/training/admin/agent/service/ProvincialAgentAppService.java
@@ -24,6 +24,7 @@
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.tcm.training.admin.common.enums.EnabledStatus;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@@ -94,7 +95,7 @@
        return toDetail(require(id));
    }
    @Transactional
    @Transactional(rollbackFor = Exception.class)
    public ProvincialAgentDetailVO create(ProvincialAgentSaveRequest request) {
        boolean firstAgent = agentMapper.selectCount(new LambdaQueryWrapper<ProvincialAgent>()
                .eq(ProvincialAgent::getDeleted, 0)) == 0;
@@ -121,7 +122,7 @@
        return detail(agent.getId());
    }
    @Transactional
    @Transactional(rollbackFor = Exception.class)
    public ProvincialAgentDetailVO update(Long id, ProvincialAgentSaveRequest request) {
        ProvincialAgent agent = require(id);
        fill(agent, request);
@@ -131,7 +132,7 @@
        return detail(id);
    }
    @Transactional
    @Transactional(rollbackFor = Exception.class)
    public void delete(Long id) {
        require(id);
        agentMapper.deleteById(id);
@@ -145,7 +146,7 @@
        agent.setAccountHolder(trim(request.getAccountHolder()));
        agent.setBranchName(trim(request.getBranchName()));
        agent.setContactInfo(trim(request.getContactInfo()));
        agent.setStatus(request.getStatus() == null ? 1 : request.getStatus());
        agent.setStatus(request.getStatus() == null ? EnabledStatus.ENABLED.getValue() : request.getStatus());
        agent.setAddress(trim(request.getAddress()));
    }
tcm-training-admin-backend/src/main/java/com/tcm/training/admin/app/bankcard/service/AppBankCardService.java
@@ -1,6 +1,7 @@
package com.tcm.training.admin.app.bankcard.service;
import com.tcm.training.admin.app.auth.service.AppAuthSessionService;
import com.tcm.training.admin.member.enums.UserType;
import com.tcm.training.admin.app.bankcard.dto.AppBankCardUpdateRequest;
import com.tcm.training.admin.app.bankcard.vo.AppBankCardVO;
import com.tcm.training.admin.live.entity.Clinic;
@@ -22,7 +23,7 @@
    public AppBankCardVO detail() { return toVO(requireClinic()); }
    @Transactional
    @Transactional(rollbackFor = Exception.class)
    public AppBankCardVO update(AppBankCardUpdateRequest request) {
        Clinic clinic = requireClinic();
        clinic.setBankName(trim(request.getBankName()));
@@ -36,7 +37,7 @@
    private Clinic requireClinic() {
        AppUser user = userMapper.selectById(sessionService.requireLoginUserId());
        if (user == null || user.getDeleted() == null || user.getDeleted() != 0) throw new IllegalArgumentException("用户不存在");
        if (user.getType() == null || user.getType() != 1 || user.getClinicId() == null) throw new IllegalArgumentException("当前账号未绑定诊所");
        if (user.getType() == null || user.getType() != UserType.CLINIC.getValue() || user.getClinicId() == null) throw new IllegalArgumentException("当前账号未绑定诊所");
        Clinic clinic = clinicMapper.selectById(user.getClinicId());
        if (clinic == null || clinic.getDeleted() == null || clinic.getDeleted() != 0) throw new IllegalArgumentException("诊所不存在");
        return clinic;
tcm-training-admin-backend/src/main/java/com/tcm/training/admin/app/popularization/service/AppHealthPopularizationService.java
@@ -61,7 +61,7 @@
    /**
     * 获取 APP 健康科普详情页数据,并在每次访问时累加点击量。
     */
    @Transactional
    @Transactional(rollbackFor = Exception.class)
    public AppHealthPopularizationDetailVO detail(Long popularizationId) {
        HealthPopularization item = requireEnabledItem(popularizationId);
        // 参考项目介绍,APP 进入详情后累加点击量并回写。
tcm-training-admin-backend/src/main/java/com/tcm/training/admin/app/projectintroduction/service/AppProjectIntroductionService.java
@@ -54,7 +54,7 @@
    /**
     * 获取APP项目介绍详情,并增加点击量
     */
    @Transactional
    @Transactional(rollbackFor = Exception.class)
    public AppProjectIntroductionDetailVO getDetail(Long id) {
        ProjectIntroduction entity = projectIntroductionMapper.selectOne(
                new LambdaQueryWrapper<ProjectIntroduction>()
tcm-training-admin-backend/src/main/java/com/tcm/training/admin/app/register/service/AppRegisterService.java
@@ -31,6 +31,8 @@
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.tcm.training.admin.member.enums.UserStatus;
import com.tcm.training.admin.member.enums.UserType;
import java.util.List;
import java.util.UUID;
@@ -127,8 +129,8 @@
        AppUser user = new AppUser();
        user.setPhone(phone);
        user.setType(0);
        user.setStatus(1);
        user.setType(UserType.DOCTOR.getValue());
        user.setStatus(UserStatus.ENABLED.getValue());
        // 优先同步海诊通同手机号用户资料,未命中时使用手机号兜底昵称。
        HztAppUser hztAppUser = findHztAppUserByPhone(phone);
@@ -165,7 +167,7 @@
    /**
     * 完成经营者第二步,创建本地诊所与诊所用户。
     */
    @Transactional
    @Transactional(rollbackFor = Exception.class)
    public AppLoginResponse completeOperatorRegister(AppRegisterOperatorCompleteRequest request) {
        OperatorRegisterDraft draft = loadDraft(normalizeRegisterTicket(request.getRegisterTicket()));
        ensurePhoneAvailable(draft.getPhone());
@@ -183,7 +185,7 @@
        clinic.setAddress(trimRequired(request.getDetailAddress(), "请输入详细地址"));
        clinic.setBusinessLicenseUrl(trimToNull(request.getBusinessLicenseUrl()));
        clinic.setInviteCode(generateInviteCode());
        clinic.setStatus(1);
        clinic.setStatus(UserStatus.ENABLED.getValue());
        clinic.setAgentId(4L); // 绑定到默认的省代上面
@@ -192,8 +194,8 @@
        AppUser user = new AppUser();
        user.setNickname(clinic.getName());
        user.setPhone(draft.getPhone());
        user.setType(1);
        user.setStatus(1);
        user.setType(UserType.CLINIC.getValue());
        user.setStatus(UserStatus.ENABLED.getValue());
        user.setClinicId(clinic.getId());
        userMapper.insert(user);
tcm-training-admin-backend/src/main/java/com/tcm/training/admin/bootstrap/DataInitializer.java
@@ -15,6 +15,7 @@
import org.springframework.boot.ApplicationRunner;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Component;
import com.tcm.training.admin.common.enums.EnabledStatus;
import java.time.LocalDateTime;
import java.util.ArrayList;
@@ -56,7 +57,7 @@
            user.setUsername("admin");
            user.setNickname("管理员");
            user.setRealName("系统管理员");
            user.setStatus(1);
            user.setStatus(EnabledStatus.ENABLED.getValue());
            user.setDeleted(0);
            user.setPassword(passwordEncoder.encode("Admin@123456"));
            user.setCreatedAt(LocalDateTime.now());
@@ -82,7 +83,7 @@
        role = new SysRole();
        role.setRoleName("超级管理员");
        role.setRoleCode("SUPER_ADMIN");
        role.setStatus(1);
            role.setStatus(EnabledStatus.ENABLED.getValue());
        role.setDeleted(0);
        role.setRemark("默认拥有全部后台权限");
        role.setCreatedAt(LocalDateTime.now());
@@ -428,7 +429,7 @@
        menu.setComponent(component);
        menu.setIcon(icon);
        menu.setSort(sort);
        menu.setStatus(1);
                menu.setStatus(EnabledStatus.ENABLED.getValue());
        menu.setVisible(1);
        menu.setPermissionKey(permissionKey);
        menu.setRemark(remark);
tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/entity/Clinic.java
@@ -12,17 +12,21 @@
import java.time.LocalDateTime;
/** 诊所及其归属代理、联系和结算信息。 */
@TableName("tcm_clinic")
@Getter
@Setter
@NoArgsConstructor
public class Clinic {
    /** 主键。 */
    @TableId(type = IdType.AUTO)
    private Long id;
    /** 诊所名称。 */
    private String name;
    /** 归属代理ID。 */
    @TableField("agent_id")
    private Long agentId;
@@ -50,8 +54,10 @@
    @TableField("district_name")
    private String districtName;
    /** 详细地址。 */
    private String address;
    /** 营业执照文件地址。 */
    @TableField("business_license_url")
    private String businessLicenseUrl;
@@ -88,3 +94,21 @@
    @TableField("updated_at")
    private LocalDateTime updatedAt;
}
    /** 联系人姓名。 */
    /** 联系电话。 */
    /** 省级行政区编码。 */
    /** 省级行政区名称。 */
    /** 市级行政区编码。 */
    /** 市级行政区名称。 */
    /** 区县行政区编码。 */
    /** 区县行政区名称。 */
    /** 邀请码。 */
    /** 开户银行。 */
    /** 银行账号。 */
    /** 银行账户户名。 */
    /** 开户支行。 */
    /** 逻辑删除标识:0未删除,1已删除。 */
    /** 创建人。 */
    /** 最后更新人。 */
    /** 创建时间。 */
    /** 最后更新时间。 */
tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/entity/HealthPopularization.java
@@ -13,6 +13,7 @@
import java.time.LocalDateTime;
@TableName("tcm_health_popularization")
/** 养生科普内容实体。 */
@Getter
@Setter
@NoArgsConstructor
tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/entity/LiveCourse.java
@@ -15,6 +15,7 @@
import java.util.List;
@TableName(value = "tcm_live_course", autoResultMap = true)
/** 养生直播课程实体。 */
@Getter
@Setter
@NoArgsConstructor
tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/entity/ProjectIntroduction.java
@@ -13,6 +13,7 @@
import java.time.LocalDateTime;
@TableName("tcm_project_introduction")
/** 项目介绍内容实体。 */
@Getter
@Setter
@NoArgsConstructor
tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/entity/ProjectIntroductionPassword.java
@@ -11,6 +11,7 @@
@Getter
@Setter
@TableName("tcm_project_introduction_password")
/** 项目介绍访问密码配置。 */
public class ProjectIntroductionPassword {
    @TableId(type = IdType.AUTO)
tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/service/HealthPopularizationAppService.java
@@ -56,7 +56,7 @@
        return toDetailVO(requireItem(id));
    }
    @Transactional
    @Transactional(rollbackFor = Exception.class)
    public HealthPopularizationDetailVO create(HealthPopularizationSaveRequest req) {
        HealthPopularization item = new HealthPopularization();
        fillEntity(item, req);
@@ -66,7 +66,7 @@
        return detail(item.getId());
    }
    @Transactional
    @Transactional(rollbackFor = Exception.class)
    public HealthPopularizationDetailVO update(Long id, HealthPopularizationSaveRequest req) {
        HealthPopularization item = requireItem(id);
        fillEntity(item, req);
@@ -74,7 +74,7 @@
        return detail(id);
    }
    @Transactional
    @Transactional(rollbackFor = Exception.class)
    public void delete(Long id) {
        requireItem(id);
        healthPopularizationMapper.deleteById(id);
tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/service/LiveCourseAppService.java
@@ -27,6 +27,7 @@
import org.springframework.stereotype.Service;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.transaction.annotation.Transactional;
import com.tcm.training.admin.common.enums.EnabledStatus;
import java.util.ArrayList;
import java.util.List;
@@ -83,7 +84,7 @@
        return PageResponse.of(list, p.getTotal(), p.getCurrent(), p.getSize());
    }
    @Transactional
    @Transactional(rollbackFor = Exception.class)
    public LiveCourseDetailVO create(LiveCourseUpsertRequest req) {
        throw new IllegalArgumentException("直播课程为初始化数据,禁止新增");
        /*
@@ -134,7 +135,7 @@
        return vo;
    }
    @Transactional
    @Transactional(rollbackFor = Exception.class)
    public LiveCourseDetailVO update(Long id, LiveCourseUpsertRequest req) {
        validateExpert(req.getExpertId());
@@ -158,7 +159,7 @@
        return detail(id);
    }
    @Transactional
    @Transactional(rollbackFor = Exception.class)
    public LiveCourseStatusVO patchStatus(Long id, LiveCourseStatusRequest req) {
        LiveCourse course = liveCourseMapper.selectById(id);
        if (course == null) {
@@ -169,7 +170,7 @@
        return new LiveCourseStatusVO(id, req.getStatus());
    }
    @Transactional
    @Transactional(rollbackFor = Exception.class)
    public void updatePassword(Long id, LiveCoursePasswordRequest req) {
        String password = req.getPassword();
        if (StrUtil.isNotBlank(password)) {
@@ -208,7 +209,7 @@
        }
    }
    @Transactional
    @Transactional(rollbackFor = Exception.class)
    public void delete(Long id) {
        throw new IllegalArgumentException("直播课程为初始化数据,禁止删除");
    }
@@ -218,7 +219,7 @@
        if (expert == null) {
            throw new IllegalArgumentException("授课专家不存在");
        }
        if (expert.getStatus() != null && expert.getStatus() != 1) {
        if (expert.getStatus() != null && expert.getStatus() != EnabledStatus.ENABLED.getValue()) {
            throw new IllegalArgumentException("授课专家已禁用");
        }
    }
tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/service/LiveRoomSettingService.java
@@ -19,7 +19,7 @@
        return toVO(mapper.selectCurrent());
    }
    @Transactional
    @Transactional(rollbackFor = Exception.class)
    public LiveRoomSettingVO save(LiveRoomSettingSaveRequest request) {
        LiveRoomSetting setting = mapper.selectCurrent();
        if (setting == null) {
tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/service/ProjectIntroductionAppService.java
@@ -60,7 +60,7 @@
        return toDetailVO(requireItem(id));
    }
    @Transactional
    @Transactional(rollbackFor = Exception.class)
    public ProjectIntroductionDetailVO create(ProjectIntroductionSaveRequest req) {
        ProjectIntroduction item = new ProjectIntroduction();
        fillEntity(item, req);
@@ -70,7 +70,7 @@
        return detail(item.getId());
    }
    @Transactional
    @Transactional(rollbackFor = Exception.class)
    public ProjectIntroductionDetailVO update(Long id, ProjectIntroductionSaveRequest req) {
        ProjectIntroduction item = requireItem(id);
        fillEntity(item, req);
@@ -78,7 +78,7 @@
        return detail(id);
    }
    @Transactional
    @Transactional(rollbackFor = Exception.class)
    public void delete(Long id) {
        requireItem(id);
        projectIntroductionMapper.deleteById(id);
tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/service/ProjectIntroductionPasswordService.java
@@ -48,7 +48,7 @@
    /**
     * 保存项目介绍密码配置
     */
    @Transactional
    @Transactional(rollbackFor = Exception.class)
    public void savePasswordConfig(ProjectIntroductionPasswordRequest req) {
        // 验证密码格式
        if (req.getPasswordEnabled() == 1) {