diff --git a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/AppUserController.java b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/AppUserController.java index 854192a6..be59e460 100644 --- a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/AppUserController.java +++ b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/AppUserController.java @@ -1,5 +1,7 @@ package com.nflg.mobilebroken.admin.controller; +import cn.hutool.core.util.RandomUtil; +import com.nflg.mobilebroken.common.constant.AppUserApplyforType; import com.nflg.mobilebroken.common.pojo.ApiResult; import com.nflg.mobilebroken.common.pojo.PageData; import com.nflg.mobilebroken.common.pojo.request.*; @@ -7,14 +9,18 @@ import com.nflg.mobilebroken.common.pojo.vo.AppUserApplyforVO; import com.nflg.mobilebroken.common.pojo.vo.AppUserForAdminVO; import com.nflg.mobilebroken.common.pojo.vo.AreaSimpleVO; import com.nflg.mobilebroken.common.pojo.vo.CompanySimpleVO; +import com.nflg.mobilebroken.repository.entity.AppUserApplyfor; import com.nflg.mobilebroken.repository.service.IAppUserApplyforService; import com.nflg.mobilebroken.repository.service.IAppUserService; import com.nflg.mobilebroken.repository.service.ITBaseAreaService; import com.nflg.mobilebroken.repository.service.ITBaseCustomerService; import com.nflg.mobilebroken.starter.annotation.MethodInfoMark; +import com.nflg.mobilebroken.starter.service.EmailService; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import javax.mail.MessagingException; import javax.validation.Valid; import javax.validation.constraints.NotNull; import java.util.List; @@ -24,6 +30,7 @@ import java.util.List; * * @author 曹鹏飞 */ +@Slf4j @RestController @RequestMapping("/appuser") public class AppUserController extends ControllerBase { @@ -40,6 +47,9 @@ public class AppUserController extends ControllerBase { @Resource private IAppUserApplyforService appUserApplyforService; + @Resource + private EmailService emailService; + /** * 获取公司列表 * @@ -105,7 +115,16 @@ public class AppUserController extends ControllerBase { @PostMapping("approveAppUserApplyfor") @MethodInfoMark(value = "代理商子账号审核", menuName = "代理商管理") public ApiResult approveAppUserApplyfor(@Valid @RequestBody ApproveAppUserApplyforRequest request) { + request.setPassword(RandomUtil.randomNumbers(6)); appUserApplyforService.approveAppUserApplyfor(request); + AppUserApplyfor applyfor = appUserApplyforService.getById(request.getId()); + if (applyfor.getType() == AppUserApplyforType.ADD.getState().byteValue()) { + try { + emailService.sendEmail(applyfor.getUserEmail(), "账号审核通过", "您的账号审核通过,密码为:" + request.getPassword()); + } catch (MessagingException e) { + log.error("发送邮件失败", e); + } + } return ApiResult.success(); } diff --git a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/DictionaryController.java b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/DictionaryController.java index d4f5fc1d..7b882dc5 100644 --- a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/DictionaryController.java +++ b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/DictionaryController.java @@ -1,6 +1,7 @@ package com.nflg.mobilebroken.admin.controller; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -18,6 +19,7 @@ import com.nflg.mobilebroken.common.pojo.vo.DictionaryItemVO; import com.nflg.mobilebroken.common.pojo.vo.DictionaryVO; import com.nflg.mobilebroken.common.util.AdminUserUtil; import com.nflg.mobilebroken.common.util.EecExcelUtil; +import com.nflg.mobilebroken.common.util.PageUtil; import com.nflg.mobilebroken.common.util.VUtils; import com.nflg.mobilebroken.repository.entity.DictionaryItemTranslate; import com.nflg.mobilebroken.repository.entity.Language; @@ -106,18 +108,13 @@ public class DictionaryController extends ControllerBase { /** * 搜索字典值 - * * @param request 请求参数 * @return 字典列表 */ @PostMapping("searchDictionaryItem") @MethodInfoMark(value = "搜索字典值", menuName = "字典管理") public ApiResult> searchDictionaryItem(@RequestBody DictionaryItemSearchRequest request) { - IPage page = new Page<>(); - page.setCurrent(request.getPage()); - page.setSize(request.getPageSize()); - dictionaryItemService.search(request, page); - return ApiResult.success(page); + return ApiResult.success(PageUtil.convert(dictionaryItemService.search(request), d -> Convert.convert(DictionaryItemVO.class, d))); } /** diff --git a/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/UserController.java b/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/UserController.java index e6a29117..4810bdb7 100644 --- a/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/UserController.java +++ b/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/UserController.java @@ -2,22 +2,22 @@ package com.nflg.mobilebroken.cfs.controller; import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; import com.nflg.mobilebroken.common.constant.Constant; import com.nflg.mobilebroken.common.constant.STATE; import com.nflg.mobilebroken.common.exception.NflgException; import com.nflg.mobilebroken.common.pojo.ApiResult; import com.nflg.mobilebroken.common.pojo.PageData; import com.nflg.mobilebroken.common.pojo.request.*; -import com.nflg.mobilebroken.common.pojo.vo.AppUserVO; -import com.nflg.mobilebroken.common.pojo.vo.CompanySimpleVO; -import com.nflg.mobilebroken.common.pojo.vo.TitleVO; +import com.nflg.mobilebroken.common.pojo.vo.*; import com.nflg.mobilebroken.common.util.AppUserUtil; +import com.nflg.mobilebroken.common.util.MultilingualUtil; import com.nflg.mobilebroken.common.util.VUtils; import com.nflg.mobilebroken.repository.entity.AppUser; import com.nflg.mobilebroken.repository.service.IAppUserApplyforService; import com.nflg.mobilebroken.repository.service.IAppUserService; -import com.nflg.mobilebroken.repository.service.IDictionaryItemTranslateService; import com.nflg.mobilebroken.repository.service.ITBaseCustomerService; +import com.nflg.mobilebroken.repository.service.ITBasePositionService; import com.nflg.mobilebroken.starter.service.EmailService; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.transaction.annotation.Transactional; @@ -25,10 +25,11 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.validation.Valid; -import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotEmpty; import java.time.Duration; import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; /** * 用户相关接口 @@ -55,7 +56,7 @@ public class UserController extends ControllerBase { private ITBaseCustomerService customerService; @Resource - private IDictionaryItemTranslateService dictionaryItemTranslateService; + ITBasePositionService positionService; /** * 获取用户信息 @@ -99,8 +100,15 @@ public class UserController extends ControllerBase { **/ @GetMapping("getTitles") //@SaUserCheckRole("primary") - public ApiResult> getTitles(@RequestParam @NotBlank(message = "语言不能为空") String language){ - return ApiResult.success(dictionaryItemTranslateService.getTitles(language)); + public ApiResult> getTitles() { + List datas = positionService.getSimpleTitles(2); + String language = MultilingualUtil.getLanguage(); + List list = datas.stream().map(d -> { + List lvos = JSONUtil.toList(d.getPositionLanguage(), PositionLanguageVO.class); + PositionLanguageVO lvo = lvos.stream().filter(l -> StrUtil.equals(l.getCode(), language)).findFirst().orElse(null); + return new TitleVO().setId(d.getId()).setName(d.getName()).setValue(Objects.isNull(lvo) ? d.getName() : lvo.getLanguageValue()); + }).collect(Collectors.toList()); + return ApiResult.success(list); } /** diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/constant/Constant.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/constant/Constant.java index 0b4b56f9..0c01fcf1 100644 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/constant/Constant.java +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/constant/Constant.java @@ -10,15 +10,10 @@ public class Constant { public static final String DICTIONARY_TYPE_EXPERIENCE_EVALUATION_SELECT = "ExperienceEvaluationSelect"; - //字典 类型 用户职位 - public static final String DICTIONARY_TYPE_TITLE="UserTitle"; - public static final String DICTIONARY_TYPE_TITLE_CQM = "CQM"; public static final String REDIS_KEY_USER_UPDATE_KAPTCHA = "kaptcha:userupdate:{}"; - public static final String DICTIONARY_TYPE_SYSTEMERROR_CQMNOTCONFIG = "CQMNotConfig"; - public static final String REDIS_KEY_MESSAGECONFIG_WX = "wxNotifyEnabled"; public static final String REDIS_KEY_MESSAGECONFIG_EMAIL = "emailNotifyEnabled"; diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/AddUserRequest.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/AddUserRequest.java index 0960ff72..2f5a27ee 100644 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/AddUserRequest.java +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/AddUserRequest.java @@ -28,10 +28,6 @@ public class AddUserRequest { @NotBlank(message = "邮箱不能为空") private String email; - //密码 - @NotBlank(message = "密码不能为空") - private String password; - //手机号 private String phone; diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/ApproveAppUserApplyforRequest.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/ApproveAppUserApplyforRequest.java index 14c7e623..08540aa3 100644 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/ApproveAppUserApplyforRequest.java +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/ApproveAppUserApplyforRequest.java @@ -1,5 +1,6 @@ package com.nflg.mobilebroken.common.pojo.request; +import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.Data; @Data @@ -9,4 +10,7 @@ public class ApproveAppUserApplyforRequest { // 通过/不通过 private Boolean pass; + + @JsonIgnore + private String password; } diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/DictionaryItemSearchRequest.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/DictionaryItemSearchRequest.java index e345f2db..112e613b 100644 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/DictionaryItemSearchRequest.java +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/DictionaryItemSearchRequest.java @@ -3,10 +3,16 @@ package com.nflg.mobilebroken.common.pojo.request; import lombok.Data; import lombok.EqualsAndHashCode; +import javax.validation.constraints.NotNull; + @EqualsAndHashCode(callSuper = false) @Data public class DictionaryItemSearchRequest extends PageRequest { + //字典id + @NotNull + private Integer dictionaryId; + //字典名称 private String name; diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/TicketAddRequest.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/TicketAddRequest.java index b6228a0c..21846d1b 100644 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/TicketAddRequest.java +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/TicketAddRequest.java @@ -2,8 +2,8 @@ package com.nflg.mobilebroken.common.pojo.request; import lombok.Data; -import javax.validation.constraints.Max; import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; import java.util.List; @Data @@ -22,12 +22,12 @@ public class TicketAddRequest { //标题 @NotBlank - @Max(value = 20, message = "标题长度不能超过20") + @Size(max = 20, message = "标题长度不能超过20") private String title; //描述 @NotBlank - @Max(value = 500, message = "描述长度不能超过500") + @Size(max = 500, message = "描述长度不能超过500") private String description; //附件 diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/PositionLanguageVO.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/PositionLanguageVO.java new file mode 100644 index 00000000..5a15aa8e --- /dev/null +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/PositionLanguageVO.java @@ -0,0 +1,22 @@ +package com.nflg.mobilebroken.common.pojo.vo; + +import lombok.Data; + +@Data +public class PositionLanguageVO { + + /** + * 语言编码 + */ + private String code; + + /** + * 语言名称 + */ + private String name; + + /** + * 内容 + */ + private String languageValue; +} diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/TitleSimpleVO.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/TitleSimpleVO.java index 02365a90..48f38f90 100644 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/TitleSimpleVO.java +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/TitleSimpleVO.java @@ -1,5 +1,6 @@ package com.nflg.mobilebroken.common.pojo.vo; +import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.Data; import lombok.experimental.Accessors; @@ -12,4 +13,10 @@ public class TitleSimpleVO { //职位名称 private String name; + + // 语言对应的值 + private String languageValue; + + @JsonIgnore + private String positionLanguage; } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/AppUserApplyfor.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/AppUserApplyfor.java index cfa8b60d..4a404934 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/AppUserApplyfor.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/AppUserApplyfor.java @@ -3,12 +3,13 @@ package com.nflg.mobilebroken.repository.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import java.io.Serializable; -import java.time.LocalDateTime; import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; +import java.io.Serializable; +import java.time.LocalDateTime; + /** *

* 用户端-用户申请 @@ -38,11 +39,6 @@ public class AppUserApplyfor implements Serializable { */ private String userName; - /** - * 被申请人用户密码,BCrypt - */ - private String userPassword; - /** * 被申请人头像 */ diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IDictionaryItemService.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IDictionaryItemService.java index 0245c991..67023f70 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IDictionaryItemService.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IDictionaryItemService.java @@ -16,11 +16,9 @@ import com.nflg.mobilebroken.repository.entity.DictionaryItem; */ public interface IDictionaryItemService extends IService { - void search(DictionaryItemSearchRequest request, IPage page); + IPage search(DictionaryItemSearchRequest request); void save(SaveDictionaryItemRequest request); Integer getId(String dictionaryName, String dictionaryItemName); - - String getTitleName(String titleCode); } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AdminUserServiceImpl.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AdminUserServiceImpl.java index 7a5c597c..5db16b6a 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AdminUserServiceImpl.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AdminUserServiceImpl.java @@ -53,9 +53,6 @@ public class AdminUserServiceImpl extends ServiceImpl getCQM() { - DictionaryItem cqm = dictionaryItemService - .lambdaQuery() - .eq(DictionaryItem::getCode, Constant.DICTIONARY_TYPE_TITLE_CQM) + TBasePosition position = positionService.lambdaQuery() + .eq(TBasePosition::getDataValidState, 1) + .eq(TBasePosition::getPositionCode, Constant.DICTIONARY_TYPE_TITLE_CQM) .one(); + if (Objects.isNull(position)) { + return Collections.emptyList(); + } return lambdaQuery() - .eq(AdminUser::getTitleId, cqm.getId()) + .eq(AdminUser::getTitleId, position.getId()) .list(); } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AppUserApplyforServiceImpl.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AppUserApplyforServiceImpl.java index eaccc18d..d94718d1 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AppUserApplyforServiceImpl.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AppUserApplyforServiceImpl.java @@ -15,11 +15,14 @@ import com.nflg.mobilebroken.common.util.VUtils; import com.nflg.mobilebroken.repository.entity.AppArea; import com.nflg.mobilebroken.repository.entity.AppUser; import com.nflg.mobilebroken.repository.entity.AppUserApplyfor; +import com.nflg.mobilebroken.repository.entity.TBasePosition; import com.nflg.mobilebroken.repository.mapper.AppUserApplyforMapper; import com.nflg.mobilebroken.repository.service.IAppAreaService; import com.nflg.mobilebroken.repository.service.IAppUserApplyforService; import com.nflg.mobilebroken.repository.service.IAppUserService; -import com.nflg.mobilebroken.repository.service.IDictionaryItemService; +import com.nflg.mobilebroken.repository.service.ITBasePositionService; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -38,14 +41,16 @@ import java.util.Objects; @Service public class AppUserApplyforServiceImpl extends ServiceImpl implements IAppUserApplyforService { + private static final PasswordEncoder PASSWORDENCODER = new BCryptPasswordEncoder(); + @Resource private IAppAreaService appAreaService; @Resource - private IDictionaryItemService dictionaryItemService; + private IAppUserService appUserService; @Resource - private IAppUserService appUserService; + private ITBasePositionService positionService; @Override public void add(AddUserRequest request) { @@ -94,7 +99,11 @@ public class AppUserApplyforServiceImpl extends ServiceImpl search(DictionaryItemSearchRequest request) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(DictionaryItem::getDictionaryId, request.getDictionaryId()); if (StrUtil.isNotBlank(request.getName())) { queryWrapper.like(DictionaryItem::getName, request.getName()); } @@ -55,7 +56,7 @@ public class DictionaryItemServiceImpl extends ServiceImpl(request.getPage(), request.getPageSize()), queryWrapper); } @Transactional @@ -129,9 +130,4 @@ public class DictionaryItemServiceImpl extends ServiceImpl @@ -38,8 +37,10 @@ public class TBasePositionServiceImpl extends ServiceImpl getSimpleTitles(Integer type) { List datas = lambdaQuery() .eq(TBasePosition::getDataValidState, 1) - .in(TBasePosition::getPositionAttribute, type, ListUtil.of(type, 3)) + .in(TBasePosition::getPositionAttribute, type, 3) .list(); - return Convert.toList(TitleSimpleVO.class, datas); + return datas.stream() + .map(d -> new TitleSimpleVO().setId(d.getId()).setName(d.getPositionName()).setPositionLanguage(d.getPositionLanguage())) + .collect(Collectors.toList()); } } diff --git a/nflg-mobilebroken-starter/src/main/java/com/nflg/mobilebroken/starter/handler/UTCLocalDateTimeTypeHandler.java b/nflg-mobilebroken-starter/src/main/java/com/nflg/mobilebroken/starter/handler/UTCLocalDateTimeTypeHandler.java index 10c4fe95..1b042cb0 100644 --- a/nflg-mobilebroken-starter/src/main/java/com/nflg/mobilebroken/starter/handler/UTCLocalDateTimeTypeHandler.java +++ b/nflg-mobilebroken-starter/src/main/java/com/nflg/mobilebroken/starter/handler/UTCLocalDateTimeTypeHandler.java @@ -11,6 +11,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.time.LocalDateTime; import java.time.ZoneId; +import java.util.Objects; /** * 本地时间与UTC时间转换 @@ -32,26 +33,30 @@ public class UTCLocalDateTimeTypeHandler extends BaseTypeHandler public LocalDateTime getNullableResult(ResultSet rs, String columnName) throws SQLException { LocalDateTime utcTime = rs.getObject(columnName, LocalDateTime.class); // 将 UTC 时间转换为本地时间 - return utcTime != null ? utcTime.atZone(ZoneId.of(MultilingualUtil.getZone())) - .withZoneSameInstant(ZoneId.systemDefault()) - .toLocalDateTime() : null; + return convertToLocalDateTime(utcTime); } @Override public LocalDateTime getNullableResult(ResultSet rs, int columnIndex) throws SQLException { LocalDateTime utcTime = rs.getObject(columnIndex, LocalDateTime.class); // 将 UTC 时间转换为本地时间 - return utcTime != null ? utcTime.atZone(ZoneId.of(MultilingualUtil.getZone())) - .withZoneSameInstant(ZoneId.systemDefault()) - .toLocalDateTime() : null; + return convertToLocalDateTime(utcTime); } @Override public LocalDateTime getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { LocalDateTime utcTime = cs.getObject(columnIndex, LocalDateTime.class); // 将 UTC 时间转换为本地时间 - return utcTime != null ? utcTime.atZone(ZoneId.of(MultilingualUtil.getZone())) + return convertToLocalDateTime(utcTime); + } + + private LocalDateTime convertToLocalDateTime(LocalDateTime utcTime) { + if (utcTime == null) { + return null; + } + String zone = MultilingualUtil.getZone(); + return utcTime.atZone(ZoneId.of(Objects.isNull(zone) ? "Asia/Shanghai" : zone)) .withZoneSameInstant(ZoneId.systemDefault()) - .toLocalDateTime() : null; + .toLocalDateTime(); } } \ No newline at end of file