package com.tcm.training.admin.app.clinic.service; import com.tcm.training.admin.app.auth.service.AppAuthSessionService; import com.tcm.training.admin.app.clinic.dto.AppClinicInfoUpdateRequest; import com.tcm.training.admin.app.clinic.vo.AppClinicInfoVO; import com.tcm.training.admin.live.entity.Clinic; import com.tcm.training.admin.live.mapper.ClinicMapper; import com.tcm.training.admin.member.entity.AppUser; import com.tcm.training.admin.member.mapper.UserMapper; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; /** * APP 诊所信息服务。 */ @Service public class AppClinicInfoService { private static final int USER_TYPE_DOCTOR = 1; private static final int USER_STATUS_ENABLED = 1; private final AppAuthSessionService appAuthSessionService; private final UserMapper userMapper; private final ClinicMapper clinicMapper; /** * 注入 APP 诊所信息所需依赖。 */ public AppClinicInfoService(AppAuthSessionService appAuthSessionService, UserMapper userMapper, ClinicMapper clinicMapper) { this.appAuthSessionService = appAuthSessionService; this.userMapper = userMapper; this.clinicMapper = clinicMapper; } /** * 获取当前登录医生所属诊所详情。 */ public AppClinicInfoVO detail() { Clinic clinic = requireOwnedClinic(); return toClinicInfo(clinic); } /** * 更新当前登录医生所属诊所信息。 */ @Transactional public AppClinicInfoVO update(AppClinicInfoUpdateRequest request) { Clinic clinic = requireOwnedClinic(); clinic.setName(trimRequired(request.getInstitutionName(), "请输入诊所名称")); clinic.setProvinceCode(trimRequired(request.getProvinceCode(), "请选择省份")); clinic.setProvinceName(trimRequired(request.getProvinceName(), "请选择省份")); clinic.setCityCode(trimRequired(request.getCityCode(), "请选择城市")); clinic.setCityName(trimRequired(request.getCityName(), "请选择城市")); clinic.setDistrictCode(trimRequired(request.getDistrictCode(), "请选择区县")); clinic.setDistrictName(trimRequired(request.getDistrictName(), "请选择区县")); clinic.setAddress(trimRequired(request.getDetailAddress(), "请输入详细地址")); // 营业执照在诊所信息页允许为空,方便用户先完善基础资料再补传附件。 clinic.setBusinessLicenseUrl(trimToNull(request.getBusinessLicenseUrl())); clinicMapper.updateById(clinic); return toClinicInfo(clinic); } /** * 校验当前登录用户为启用中的医生并已绑定诊所。 */ private Clinic requireOwnedClinic() { Long userId = appAuthSessionService.requireLoginUserId(); AppUser user = userMapper.selectById(userId); if (user == null || user.getDeleted() == null || user.getDeleted().intValue() != 0) { throw new IllegalArgumentException("用户不存在"); } if (user.getStatus() == null || user.getStatus().intValue() != USER_STATUS_ENABLED) { throw new IllegalArgumentException("用户已禁用"); } if (user.getType() == null || user.getType().intValue() != USER_TYPE_DOCTOR) { throw new IllegalArgumentException("当前用户无权查看诊所信息"); } if (user.getClinicId() == null) { throw new IllegalArgumentException("当前账号未绑定诊所"); } Clinic clinic = clinicMapper.selectById(user.getClinicId()); if (clinic == null || clinic.getDeleted() == null || clinic.getDeleted().intValue() != 0) { throw new IllegalArgumentException("诊所不存在"); } return clinic; } /** * 将诊所实体转换为 APP 诊所信息响应结构。 */ private AppClinicInfoVO toClinicInfo(Clinic clinic) { AppClinicInfoVO result = new AppClinicInfoVO(); result.setClinicId(clinic.getId()); result.setInstitutionName(trimToEmpty(clinic.getName())); result.setProvinceCode(trimToEmpty(clinic.getProvinceCode())); result.setProvinceName(trimToEmpty(clinic.getProvinceName())); result.setCityCode(trimToEmpty(clinic.getCityCode())); result.setCityName(trimToEmpty(clinic.getCityName())); result.setDistrictCode(trimToEmpty(clinic.getDistrictCode())); result.setDistrictName(trimToEmpty(clinic.getDistrictName())); result.setRegionText(buildRegionText(clinic)); result.setDetailAddress(trimToEmpty(clinic.getAddress())); result.setBusinessLicenseUrl(trimToEmpty(clinic.getBusinessLicenseUrl())); return result; } /** * 将省市区名称拼接成页面直接可展示的地区文案。 */ private String buildRegionText(Clinic clinic) { StringBuilder builder = new StringBuilder(); appendText(builder, clinic == null ? null : clinic.getProvinceName()); appendText(builder, clinic == null ? null : clinic.getCityName()); appendText(builder, clinic == null ? null : clinic.getDistrictName()); return builder.toString().trim(); } /** * 将文本安全追加到地区名称拼接器中。 */ private void appendText(StringBuilder builder, String value) { String normalized = trimToNull(value); if (normalized == null) { return; } if (builder.length() > 0) { builder.append(' '); } builder.append(normalized); } /** * 将必填文本归一化,并在空值时抛出业务错误。 */ private String trimRequired(String value, String message) { String normalized = trimToNull(value); if (normalized == null) { throw new IllegalArgumentException(message); } return normalized; } /** * 将空白文本统一归一化为 null。 */ private String trimToNull(String value) { if (value == null) { return null; } String trimmed = value.trim(); return trimmed.isEmpty() ? null : trimmed; } /** * 将可空文本统一转换为空字符串。 */ private String trimToEmpty(String value) { String normalized = trimToNull(value); return normalized == null ? "" : normalized; } }