From fd8912351d80673494f655bf8036e72f6d7e3a2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E9=B9=8F=E9=A3=9E?= Date: Mon, 17 Feb 2025 20:51:37 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=B8=80=E4=BA=9B=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/controller/AdminUserController.java | 40 ++++++++++++----- .../admin/controller/AppUserController.java | 44 +++++++++++++------ .../admin/controller/TicketController.java | 12 ++++- .../admin/pojo/dto/TiketTimeoutDTO.java | 13 ++++++ .../admin/task/TicketScheduledTasks.java | 42 ++++++++++-------- .../cfs/controller/TiketController.java | 13 ++++-- .../cfs/controller/UserController.java | 29 +++++++++--- .../common/constant/Constant.java | 8 ++++ .../common/pojo/request/TicketAddRequest.java | 1 - .../common/pojo/vo/AppUserApplyforInfoVO.java | 2 +- .../common/pojo/vo/AppUserForAdminVO.java | 3 ++ .../mobilebroken/common/pojo/vo/MenuVO.java | 2 + .../repository/service/IAdminUserService.java | 6 +-- .../repository/service/IAppUserService.java | 6 +-- .../service/impl/AdminRoleServiceImpl.java | 24 +++++++++- .../service/impl/AdminUserServiceImpl.java | 10 +++-- .../service/impl/AppAreaServiceImpl.java | 10 ++--- .../impl/AppUserApplyforServiceImpl.java | 18 ++++---- .../service/impl/AppUserServiceImpl.java | 24 ++++++---- .../impl/DictionaryItemServiceImpl.java | 2 +- .../main/resources/mapper/AdminRoleMapper.xml | 2 +- .../main/resources/mapper/TicketMapper.xml | 37 +++++++++------- 22 files changed, 241 insertions(+), 107 deletions(-) create mode 100644 nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/pojo/dto/TiketTimeoutDTO.java diff --git a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/AdminUserController.java b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/AdminUserController.java index a3a08689..7ebfcbd7 100644 --- a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/AdminUserController.java +++ b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/AdminUserController.java @@ -17,6 +17,7 @@ import com.nflg.mobilebroken.common.util.AdminUserUtil; import com.nflg.mobilebroken.common.util.VUtils; import com.nflg.mobilebroken.repository.entity.AdminUser; import com.nflg.mobilebroken.repository.service.IAdminUserService; +import com.nflg.mobilebroken.repository.service.IDictionaryItemTranslateService; import com.nflg.mobilebroken.repository.service.ITBaseDepartmentService; import com.nflg.mobilebroken.repository.service.ITBasePositionService; import com.nflg.mobilebroken.starter.annotation.MethodInfoMark; @@ -52,6 +53,9 @@ public class AdminUserController extends ControllerBase { @Value("${email.activate.admin.url}") private String activateUrl; + @Value("${email.activate.admin.website}") + private String websiteUrl; + @Resource private IAdminUserService adminUserService; @@ -67,6 +71,9 @@ public class AdminUserController extends ControllerBase { @Resource private WXQRCodeService wxQRCodeService; + @Resource + private IDictionaryItemTranslateService dictionaryItemTranslateService; + @Resource private RedisTemplate redisTemplate; @@ -99,11 +106,16 @@ public class AdminUserController extends ControllerBase { @ApiMark(moduleName = "账号管理", apiName = "新增账号") public ApiResult addAccount(@Valid @RequestBody AccountAddRequest request) { request.setPassword(RandomUtil.randomString(6)); - adminUserService.add(request); + AdminUser adminUser=adminUserService.add(request); try { - String email = request.getEmail(); - emailService.sendEmail(email, "新增账号", - "您的账号已创建,随机码为:" + request.getPassword() + ",点击链接激活账号: " + activateUrl + "?code=" + Base64.getUrlEncoder().encodeToString(email.getBytes())); + String email = adminUser.getEmail(); + String subject = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_TITLE_ACCOUNT_ACTIVATION, "cn"); + String content = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_CONTENT_ACCOUNT_ACTIVATION_NOTIFY, "cn") + .replace("${loginName}",adminUser.getLoginName()) + .replace("${url}",activateUrl + "?code=" + Base64.getUrlEncoder().encodeToString(email.getBytes())) + .replace("${password}",request.getPassword()) + .replace("${website}",websiteUrl); + emailService.sendEmail(email, subject, content); } catch (MessagingException e) { log.error("发送邮件失败", e); } @@ -168,9 +180,13 @@ public class AdminUserController extends ControllerBase { try { for (Integer id : ids) { String password = RandomUtil.randomString(6); - String email = adminUserService.resetPassword(id, password); - emailService.sendEmail(email, "密码重置", - "随机码为:" + password + ",点击链接激活账号: " + activateUrl + "?code=" + Base64.getUrlEncoder().encodeToString(email.getBytes())); + AdminUser adminUser = adminUserService.resetPassword(id, password); + String subject = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_TITLE_ACCOUNT_RESET_PASSWORD, "cn"); + String content = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_CONTENT_RESET_PASSWORD_NOTIFY, "cn") + .replace("${loginName}",adminUser.getLoginName()) + .replace("${url}",activateUrl + "?code=" + Base64.getUrlEncoder().encodeToString(adminUser.getEmail().getBytes())) + .replace("${password}",password); + emailService.sendEmail(adminUser.getEmail(), subject, content); } } catch (Exception ex) { throw new NflgException(STATE.BusinessError, "发送邮件失败:" + ex.getMessage()); @@ -188,9 +204,13 @@ public class AdminUserController extends ControllerBase { public ApiResult forgetPassword(@Valid @RequestParam @NotBlank String email) { try { String password = RandomUtil.randomString(6); - adminUserService.forgetPassword(email, password); - emailService.sendEmail(email, "忘记密码", - "随机码为:" + password + ",点击链接激活账号: " + activateUrl + "?code=" + Base64.getUrlEncoder().encodeToString(email.getBytes())); + AdminUser adminUser=adminUserService.forgetPassword(email, password); + String subject = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_TITLE_ACCOUNT_RESET_PASSWORD, "cn"); + String content = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_CONTENT_RESET_PASSWORD_NOTIFY, "cn") + .replace("${loginName}",adminUser.getLoginName()) + .replace("${url}",activateUrl + "?code=" + Base64.getUrlEncoder().encodeToString(email.getBytes())) + .replace("${password}",password); + emailService.sendEmail(email, subject, content); } catch (Exception ex) { throw new NflgException(STATE.BusinessError, "发送邮件失败:" + ex.getMessage()); } 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 8cf0c3eb..0b100608 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 @@ -3,17 +3,16 @@ package com.nflg.mobilebroken.admin.controller; import cn.hutool.core.util.RandomUtil; import com.nflg.mobilebroken.admin.annotation.ApiMark; import com.nflg.mobilebroken.common.constant.AppUserApplyforType; +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.*; +import com.nflg.mobilebroken.repository.entity.AppUser; 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.repository.service.*; import com.nflg.mobilebroken.starter.annotation.MethodInfoMark; import com.nflg.mobilebroken.starter.service.EmailService; import lombok.extern.slf4j.Slf4j; @@ -41,6 +40,9 @@ public class AppUserController extends ControllerBase { @Value("${email.activate.app.url}") private String activateUrl; + @Value("${email.activate.app.website}") + private String websiteUrl; + @Resource private IAppUserService appUserService; @@ -56,6 +58,9 @@ public class AppUserController extends ControllerBase { @Resource private EmailService emailService; + @Resource + private IDictionaryItemTranslateService dictionaryItemTranslateService; + /** * 获取公司列表 * @return 部门列表 @@ -85,11 +90,16 @@ public class AppUserController extends ControllerBase { @ApiMark(moduleName = "代理商管理", apiName = "添加代理商主账号") public ApiResult addPrimaryAppUser(@Valid @RequestBody PrimaryAppUserAddRequest request) { request.setPassword(RandomUtil.randomNumbers(6)); - appUserService.addPrimaryAppUser(request); + AppUser appUser =appUserService.addPrimaryAppUser(request); try { String email = request.getEmail(); - emailService.sendEmail(email, "账号开通", - "您的账号已开通,随机码为:" + request.getPassword() + ",点击链接激活账号: " + activateUrl + "?code=" + Base64.getUrlEncoder().encodeToString(email.getBytes())); + String subject = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_TITLE_ACCOUNT_ACTIVATION, appUser.getLanguageCode()); + String content = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_CONTENT_ACCOUNT_ACTIVATION_NOTIFY, appUser.getLanguageCode()) + .replace("${loginName}",appUser.getLoginName()) + .replace("${url}",activateUrl + "?code=" + Base64.getUrlEncoder().encodeToString(email.getBytes())) + .replace("${password}",request.getPassword()) + .replace("${website}",websiteUrl); + emailService.sendEmail(email, subject, content); } catch (MessagingException e) { log.error("发送邮件失败", e); } @@ -131,9 +141,13 @@ public class AppUserController extends ControllerBase { AppUserApplyfor applyfor = appUserApplyforService.getById(request.getId()); if (applyfor.getType() == AppUserApplyforType.ADD.getState().byteValue()) { try { - String email = applyfor.getUserEmail(); - emailService.sendEmail(email, "账号审核通过", - "您的账号审核通过,随机码为:" + request.getPassword() + ",点击链接激活账号: " + activateUrl + "?code=" + Base64.getUrlEncoder().encodeToString(email.getBytes())); + String subject = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_TITLE_ACCOUNT_ACTIVATION, applyfor.getLanguageCode()); + String content = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_CONTENT_ACCOUNT_ACTIVATION_NOTIFY, applyfor.getLanguageCode()) + .replace("${loginName}",applyfor.getUserEmail()) + .replace("${url}",activateUrl + "?code=" + Base64.getUrlEncoder().encodeToString(applyfor.getUserEmail().getBytes())) + .replace("${password}",request.getPassword()) + .replace("${website}",websiteUrl); + emailService.sendEmail(applyfor.getUserEmail(), subject, content); } catch (MessagingException e) { log.error("发送邮件失败", e); } @@ -219,9 +233,13 @@ public class AppUserController extends ControllerBase { try { for (Integer id : ids) { String password=RandomUtil.randomString(6); - String email=appUserService.resetPassword(id,password); - emailService.sendEmail(email, "密码重置", - "随机码为:" + password + ",点击链接激活账号: " + activateUrl + "?code=" + Base64.getUrlEncoder().encodeToString(email.getBytes())); + AppUser appUser=appUserService.resetPassword(id,password); + String subject = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_TITLE_ACCOUNT_RESET_PASSWORD, appUser.getLanguageCode()); + String content = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_CONTENT_RESET_PASSWORD_NOTIFY, appUser.getLanguageCode()) + .replace("${loginName}",appUser.getLoginName()) + .replace("${url}",activateUrl + "?code=" + Base64.getUrlEncoder().encodeToString(appUser.getEmail().getBytes())) + .replace("${password}",password); + emailService.sendEmail(appUser.getEmail(), subject, content); } }catch (Exception ex){ throw new NflgException(STATE.BusinessError,"发送邮件失败:"+ex.getMessage()); diff --git a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/TicketController.java b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/TicketController.java index 7c1bfde6..fa372200 100644 --- a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/TicketController.java +++ b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/TicketController.java @@ -81,6 +81,9 @@ public class TicketController extends ControllerBase { @Resource private IAppAreaService appAreaService; + @Resource + private ITBaseAreaService adminAreaService; + @Resource private IDictionaryItemService dictionaryItemService; @@ -336,7 +339,12 @@ public class TicketController extends ControllerBase { public ApiResult getTicket(@Valid @RequestParam @NotNull Integer id) { Ticket ticket = ticketService.getById(id); AppUser user = appUserService.getById(ticket.getUserId()); - AppArea appArea = appAreaService.getById(user.getAreaId()); + String areaName; + if (user.getIsPrimary()){ + areaName=adminAreaService.getById(user.getAreaId()).getAreaName(); + }else { + areaName = appAreaService.getById(user.getAreaId()).getName(); + } // TBaseCustomer company = customerService.getById(Integer.valueOf(user.getCompanyId())); DeviceInfoVO device = deviceService.getByDeviceNo(ticket.getDeviceNo()); String warrantyStateDesc = ""; @@ -376,7 +384,7 @@ public class TicketController extends ControllerBase { .setCreateUserName(user.getName()) .setCreateUserAvatar(user.getAvatar()) .setCreateTime(ticket.getCreateTime()) - .setAreaName(appArea.getName()) + .setAreaName(areaName) .setCompanyName(device.getCustomerName()) .setHandle(handle) .setSolution(ticket.getSolution()) diff --git a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/pojo/dto/TiketTimeoutDTO.java b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/pojo/dto/TiketTimeoutDTO.java new file mode 100644 index 00000000..6f9036e1 --- /dev/null +++ b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/pojo/dto/TiketTimeoutDTO.java @@ -0,0 +1,13 @@ +package com.nflg.mobilebroken.admin.pojo.dto; + +import lombok.Data; + +@Data +public class TiketTimeoutDTO { + + private Integer emergency; + + private Integer general; + + private Integer nonemergency; +} diff --git a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/task/TicketScheduledTasks.java b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/task/TicketScheduledTasks.java index 296eeb74..228a77a5 100644 --- a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/task/TicketScheduledTasks.java +++ b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/task/TicketScheduledTasks.java @@ -3,7 +3,8 @@ package com.nflg.mobilebroken.admin.task; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DatePattern; import cn.hutool.core.util.StrUtil; -import com.nflg.mobilebroken.admin.service.NotificationService; +import cn.hutool.json.JSONUtil; +import com.nflg.mobilebroken.admin.pojo.dto.TiketTimeoutDTO; import com.nflg.mobilebroken.common.constant.Constant; import com.nflg.mobilebroken.common.constant.MessageSubType; import com.nflg.mobilebroken.repository.entity.*; @@ -39,19 +40,23 @@ public class TicketScheduledTasks { @Resource private ITicketFollowService ticketFollowService; - @Resource - private NotificationService notificationService; - private static final DateTimeFormatter FORMATTER= DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN); + @Resource private IAppMessageService appMessageService; + @Resource private IDictionaryItemTranslateService dictionaryItemTranslateService; + @Resource private ITBaseDeviceTypeService deviceTypeService; + @Resource private EmailService emailService; + @Resource + private IParamConfigService paramConfigService; + /** * 工单超时提醒 * 每天午夜12点执行一次 @@ -59,32 +64,31 @@ public class TicketScheduledTasks { @Scheduled(cron = "0 0 0 * * ?") public void timeoutRemind() { log.info("开始执行工单超时提醒"); - emergencyRemind(); - generalRemind(); - nonemergencyRemind(); + ParamConfig config = paramConfigService.lambdaQuery().eq(ParamConfig::getCode, "TiketTimeout").one(); + TiketTimeoutDTO cfgTimeout= JSONUtil.toBean(config.getValue(), TiketTimeoutDTO.class); + emergencyRemind(cfgTimeout); + generalRemind(cfgTimeout); + nonemergencyRemind(cfgTimeout); log.info("执行工单超时提醒完成"); } - private void emergencyRemind() { - int days = 3; - log.info("获取状态为紧急且{}天未解决的工单", days); - List tickets = ticketService.getEmergencys(days); + private void emergencyRemind(TiketTimeoutDTO cfgTimeout) { + log.info("获取状态为紧急且{}天未解决的工单", cfgTimeout.getEmergency()); + List tickets = ticketService.getEmergencys(cfgTimeout.getEmergency()); log.info("共{}条数据", tickets.size()); tickets.forEach(this::ticketHande); } - private void generalRemind() { - int days = 7; - log.info("获取状态为普通且{}天未解决的工单", days); - List tickets = ticketService.getGenerals(days); + private void generalRemind(TiketTimeoutDTO cfgTimeout) { + log.info("获取状态为普通且{}天未解决的工单", cfgTimeout.getGeneral()); + List tickets = ticketService.getGenerals(cfgTimeout.getGeneral()); log.info("共{}条数据", tickets.size()); tickets.forEach(this::ticketHande); } - private void nonemergencyRemind() { - int days = 15; - log.info("获取状态为普通且{}天未解决的工单", days); - List tickets = ticketService.getNonemergency(days); + private void nonemergencyRemind(TiketTimeoutDTO cfgTimeout) { + log.info("获取状态为非紧急且{}天未解决的工单", cfgTimeout.getNonemergency()); + List tickets = ticketService.getNonemergency(cfgTimeout.getNonemergency()); log.info("共{}条数据", tickets.size()); tickets.forEach(this::ticketHande); } diff --git a/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/TiketController.java b/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/TiketController.java index 835e9136..64945788 100644 --- a/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/TiketController.java +++ b/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/TiketController.java @@ -73,6 +73,9 @@ public class TiketController extends ControllerBase { @Resource private IAppAreaService appAreaService; + @Resource + private ITBaseAreaService adminAreaService; + @Resource private ITBaseCustomerService customerService; @@ -104,7 +107,6 @@ public class TiketController extends ControllerBase { /** * 获取所有设备部件 - * * @return 设备部件列表 **/ @GetMapping("getAllDeviceComponents") @@ -186,7 +188,12 @@ public class TiketController extends ControllerBase { public ApiResult getTicket(@Valid @RequestParam @NotNull Integer id) { Ticket ticket = ticketService.getById(id); AppUser user = appUserService.getById(ticket.getUserId()); - AppArea appArea = appAreaService.getById(user.getAreaId()); + String areaName; + if (user.getIsPrimary()){ + areaName=adminAreaService.getById(user.getAreaId()).getAreaName(); + }else { + areaName = appAreaService.getById(user.getAreaId()).getName(); + } List companys = customerService.listByIds(Arrays.stream(user.getCompanyId().split(",")).map(Integer::parseInt).collect(Collectors.toList())); DeviceInfoVO device = deviceService.getByDeviceNo(ticket.getDeviceNo()); String handle = ticket.getHandle(); @@ -210,7 +217,7 @@ public class TiketController extends ControllerBase { .setCreateUserName(user.getName()) .setCreateUserAvatar(user.getAvatar()) .setCreateTime(ticket.getCreateTime()) - .setAreaName(appArea.getName()) + .setAreaName(areaName) .setSolveTime(ticket.getSolveTime()) .setCompanyName(StrUtil.join(",",companys.stream().map(TBaseCustomer::getAgencyCompanyName).collect(Collectors.toList()))) .setHandle(handle) 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 ea9d063f..dab227f2 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 @@ -55,6 +55,9 @@ public class UserController extends ControllerBase { @Value("${email.activate.app.url}") private String activateUrl; + @Value("${email.activate.app.website}") + private String websiteUrl; + @Resource private IAppUserService appUserService; @@ -82,6 +85,9 @@ public class UserController extends ControllerBase { @Resource private IAdminMessageService adminMessageService; + @Resource + private IDictionaryItemTranslateService dictionaryItemTranslateService; + /** * 获取用户信息 * @return 用户信息 @@ -259,11 +265,15 @@ public class UserController extends ControllerBase { @Transactional @PostMapping("forgetPassword") public ApiResult forgetPassword(@Valid @RequestParam @NotBlank String email) { + String password = RandomUtil.randomString(6); + AppUser appUser=appUserService.forgetPassword(email, password); try { - String password = RandomUtil.randomString(6); - appUserService.forgetPassword(email, password); - emailService.sendEmail(email, "忘记密码", - "随机码为:" + password + ",点击链接激活账号: " + activateUrl + "?code=" + Base64.getUrlEncoder().encodeToString(email.getBytes())); + String subject = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_TITLE_ACCOUNT_RESET_PASSWORD, appUser.getLanguageCode()); + String content = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_CONTENT_RESET_PASSWORD_NOTIFY, appUser.getLanguageCode()) + .replace("${loginName}",appUser.getLoginName()) + .replace("${url}",activateUrl + "?code=" + Base64.getUrlEncoder().encodeToString(email.getBytes())) + .replace("${password}",password); + emailService.sendEmail(email, subject,content); } catch (Exception ex) { throw new NflgException(STATE.BusinessError, "发送邮件失败:" + ex.getMessage()); } @@ -281,9 +291,14 @@ public class UserController extends ControllerBase { try { for (Integer id : ids) { String password=RandomUtil.randomString(6); - String email=appUserService.resetPassword(id,password); - emailService.sendEmail(email, "密码重置", - "随机码为:" + password + ",点击链接激活账号: " + activateUrl + "?code=" + Base64.getUrlEncoder().encodeToString(email.getBytes())); + AppUser appUser=appUserService.resetPassword(id,password); + String subject = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_TITLE_ACCOUNT_RESET_PASSWORD, appUser.getLanguageCode()); + String content = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_CONTENT_RESET_PASSWORD_NOTIFY, appUser.getLanguageCode()) + .replace("${loginName}",appUser.getLoginName()) + .replace("${url}",activateUrl + "?code=" + Base64.getUrlEncoder().encodeToString(appUser.getEmail().getBytes())) + .replace("${password}",password) + .replace("${website}",websiteUrl); + emailService.sendEmail(appUser.getEmail(), subject, content); } }catch (Exception ex){ throw new NflgException(STATE.BusinessError,"发送邮件失败:"+ex.getMessage()); 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 e4b32690..b6f62ed6 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 @@ -42,6 +42,14 @@ public class Constant { public static final String DICTIONARY_ITEM_EMAIL_CONTENT_TICKET_NOTIFY="TicketNotify"; + public static final String DICTIONARY_ITEM_EMAIL_TITLE_ACCOUNT_RESET_PASSWORD="TitleResetPassword"; + + public static final String DICTIONARY_ITEM_EMAIL_TITLE_ACCOUNT_ACTIVATION="TitleAccountActivation"; + + public static final String DICTIONARY_ITEM_EMAIL_CONTENT_RESET_PASSWORD_NOTIFY="ResetPassword"; + + public static final String DICTIONARY_ITEM_EMAIL_CONTENT_ACCOUNT_ACTIVATION_NOTIFY="AccountActivation"; + /** * 事业部部长 */ 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 0edb0941..36443edd 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 @@ -26,7 +26,6 @@ public class TicketAddRequest { private String title; //描述 - @NotBlank @Size(max = 500, message = "描述长度不能超过500") private String description; diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/AppUserApplyforInfoVO.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/AppUserApplyforInfoVO.java index 6b176fbf..64c557c8 100644 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/AppUserApplyforInfoVO.java +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/AppUserApplyforInfoVO.java @@ -13,7 +13,7 @@ public class AppUserApplyforInfoVO { private String avatar; //申请类型,0:新增账号;1:账号启用,2:账号延期 - private Integer type; + private Byte type; //公司名称 private String companyName; diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/AppUserForAdminVO.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/AppUserForAdminVO.java index 13d034bd..4dec0c4d 100644 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/AppUserForAdminVO.java +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/AppUserForAdminVO.java @@ -81,6 +81,9 @@ public class AppUserForAdminVO { */ private String languageCode; + //职位 + private String title; + //下级账号 private List children; } diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/MenuVO.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/MenuVO.java index 3d9e044c..77ef952e 100644 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/MenuVO.java +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/MenuVO.java @@ -1,12 +1,14 @@ package com.nflg.mobilebroken.common.pojo.vo; import lombok.Data; +import lombok.experimental.Accessors; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; @Data +@Accessors(chain = true) public class MenuVO { private Integer id; diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IAdminUserService.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IAdminUserService.java index a5facbc9..8b294a03 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IAdminUserService.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IAdminUserService.java @@ -20,7 +20,7 @@ public interface IAdminUserService extends IService { AdminUser getUser(String userName, String password); - void add(AccountAddRequest request); + AdminUser add(AccountAddRequest request); void update(AccountUpdateRequest request); @@ -32,7 +32,7 @@ public interface IAdminUserService extends IService { void authorizeRole(AuthorizeRoleRequest request); - String resetPassword(Integer id, String password); + AdminUser resetPassword(Integer id, String password); void setAvatar(Integer userId, String avatar); @@ -40,7 +40,7 @@ public interface IAdminUserService extends IService { void activateUser(UserActivateRequest request); - void forgetPassword(String email, String password); + AdminUser forgetPassword(String email, String password); List getByTitleCode(String titleCode); diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IAppUserService.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IAppUserService.java index 9bc3bfa2..e02afb7f 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IAppUserService.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IAppUserService.java @@ -25,7 +25,7 @@ public interface IAppUserService extends IService { void disable(Integer id); - String resetPassword(Integer id, String password); + AppUser resetPassword(Integer id, String password); IPage search(UserSearchRequest request); @@ -33,7 +33,7 @@ public interface IAppUserService extends IService { AppUserVO getInfo(Integer userId); - void addPrimaryAppUser(PrimaryAppUserAddRequest request); + AppUser addPrimaryAppUser(PrimaryAppUserAddRequest request); void updatePrimaryAppUser(PrimaryAppUserUpdateRequest request); @@ -51,7 +51,7 @@ public interface IAppUserService extends IService { void activateUser(UserActivateRequest request); - void forgetPassword(String email, String password); + AppUser forgetPassword(String email, String password); AppUser getPrimaryByCompanyId(String companyId); } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AdminRoleServiceImpl.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AdminRoleServiceImpl.java index 12ddffd5..7150004f 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AdminRoleServiceImpl.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AdminRoleServiceImpl.java @@ -12,14 +12,18 @@ import com.nflg.mobilebroken.common.pojo.vo.ButtonVO; import com.nflg.mobilebroken.common.pojo.vo.MenuVO; import com.nflg.mobilebroken.common.pojo.vo.RoleVO; import com.nflg.mobilebroken.common.util.AdminUserUtil; +import com.nflg.mobilebroken.repository.entity.AdminMenu; import com.nflg.mobilebroken.repository.entity.AdminRole; import com.nflg.mobilebroken.repository.mapper.AdminRoleMapper; +import com.nflg.mobilebroken.repository.service.IAdminMenuService; import com.nflg.mobilebroken.repository.service.IAdminRoleService; import org.springframework.stereotype.Service; +import javax.annotation.Resource; import java.time.LocalDateTime; import java.util.Collections; import java.util.List; +import java.util.Objects; /** *

@@ -32,6 +36,9 @@ import java.util.List; @Service public class AdminRoleServiceImpl extends ServiceImpl implements IAdminRoleService { + @Resource + private IAdminMenuService menuService; + @Override public void add(RoleAddRequest request) { AdminRole adminRole = new AdminRole() @@ -75,7 +82,22 @@ public class AdminRoleServiceImpl extends ServiceImpl menus=baseMapper.getMenusByRoleCodes(roleCodes); + for (int i = 0; i < menus.size(); i++) { + MenuVO menu = menus.get(i); + bindParent(menu, menus); + } + return menus; + } + + private void bindParent(MenuVO menu,List datas){ + if (!Objects.equals(0,menu.getParentId())){ + AdminMenu mp=menuService.getById(menu.getParentId()); + if (datas.stream().noneMatch(d->Objects.equals(d.getId(),mp.getId()))){ + MenuVO m=new MenuVO().setId(mp.getId()).setName(mp.getName()).setUrl(mp.getUrl()).setComponent(mp.getComponent()).setParentId(mp.getParentId()); + datas.add(m); + } + } } @Override 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 d414a3e5..18be156f 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 @@ -67,7 +67,7 @@ public class AdminUserServiceImpl extends ServiceImpl impl @Override public IPage search(AreaSearchRequest request) { - if (StrUtil.isBlank(request.getName())) { + if (StrUtil.isBlank(request.getName()) && Objects.isNull(request.getEnabled())) { return getPage(request); }else { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - if (StrUtil.isNotBlank(request.getName())) { - queryWrapper.like(AppArea::getName, request.getName()); - } - if (Objects.nonNull(request.getEnabled())) { - queryWrapper.eq(AppArea::getEnable, request.getEnabled()); - } + queryWrapper.like(StrUtil.isNotBlank(request.getName()),AppArea::getName, request.getName()); + queryWrapper.eq(Objects.nonNull(request.getEnabled()),AppArea::getEnable, request.getEnabled()); queryWrapper.orderByDesc(AppArea::getId); List list = baseMapper.selectList(queryWrapper); //找出非根节点 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 e0670e2f..aaff6993 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 @@ -14,15 +14,9 @@ import com.nflg.mobilebroken.common.pojo.vo.AppUserVO; import com.nflg.mobilebroken.common.util.AdminUserUtil; import com.nflg.mobilebroken.common.util.AppUserUtil; 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.entity.*; 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.ITBasePositionService; +import com.nflg.mobilebroken.repository.service.*; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; @@ -54,6 +48,9 @@ public class AppUserApplyforServiceImpl extends ServiceImpl impl private IAdminUserService adminUserService; @Resource - private ILanguageService languageService; + private ITBasePositionService positionService; + + @Resource + private ITBaseAreaService adminAreaService; @Override public AppUser getUser(String userName, String password) { @@ -83,7 +86,7 @@ public class AppUserServiceImpl extends ServiceImpl impl } @Override - public String resetPassword(Integer id, String password) { + public AppUser resetPassword(Integer id, String password) { String encodePassword=PASSWORDENCODER.encode(password); AppUser user=getById(id); VUtils.trueThrowBusinessError(Objects.isNull(user)).throwMessage("用户不存在"); @@ -91,7 +94,7 @@ public class AppUserServiceImpl extends ServiceImpl impl user.setPassword(encodePassword); user.setUpdateTime(LocalDateTime.now()); updateById(user); - return user.getEmail(); + return user; } @Override @@ -130,7 +133,7 @@ public class AppUserServiceImpl extends ServiceImpl impl } @Override - public void addPrimaryAppUser(PrimaryAppUserAddRequest request) { + public AppUser addPrimaryAppUser(PrimaryAppUserAddRequest request) { VUtils.trueThrowBusinessError(lambdaQuery().eq(AppUser::getLoginName, request.getLoginName()).exists()) .throwMessage("登录名已存在"); List companyIds = lambdaQuery() @@ -167,6 +170,7 @@ public class AppUserServiceImpl extends ServiceImpl impl .setState(UserState.ToBeActivated.getState()) .setExpireTime(LocalDateTime.of(LocalDateTime.now().getYear(), 12, 31, 0, 0, 0).toLocalDate()); save(user); + return user; } @Override @@ -234,7 +238,7 @@ public class AppUserServiceImpl extends ServiceImpl impl .like(StrUtil.isNotBlank(request.getName()), AppUser::getName, request.getName()) .page(new Page<>(request.getPage(), request.getPageSize())); return PageUtil.convert(page, d -> { - AppArea area = appAreaService.getById(d.getAreaId()); + TBaseArea area = adminAreaService.getById(d.getAreaId()); String createBy = ""; if (d.getIsPrimary()) { if (Objects.nonNull(d.getCreateBy())) { @@ -267,7 +271,7 @@ public class AppUserServiceImpl extends ServiceImpl impl .setPhone(d.getPhone()) .setAreaId(d.getAreaId()) .setSalesUserName(d.getSalesUserName()) - .setAreaName(area.getName()) + .setAreaName(area.getAreaName()) .setUserState(d.getState()) .setExpireTime(d.getExpireTime()) .setCreateBy(createBy) @@ -329,15 +333,18 @@ public class AppUserServiceImpl extends ServiceImpl impl if (Objects.nonNull(d.getUpdateBy())) { updateBy = getById(d.getUpdateBy()).getName(); } + TBaseCustomer customer=customerService.getById(d.getCompanyId()); + TBasePosition title=positionService.getById(d.getTitleId()); return new AppUserForAdminVO() .setKey("u-" + d.getId()) .setId(d.getId()) .setAvatar(d.getAvatar()) .setLoginName(d.getLoginName()) .setUserName(d.getName()) - .setCompanyName(d.getCompanyId()) + .setCompanyName(customer.getAgencyCompanyName()) .setName(d.getName()) .setEmail(d.getEmail()) + .setTitle(title.getPositionName()) .setLanguageCode(d.getLanguageCode()) .setSalesUserName(d.getSalesUserName()) .setAreaName(area.getName()) @@ -473,7 +480,7 @@ public class AppUserServiceImpl extends ServiceImpl impl } @Override - public void forgetPassword(String email, String password) { + public AppUser forgetPassword(String email, String password) { String encodePassword = PASSWORDENCODER.encode(password); AppUser user = lambdaQuery().eq(AppUser::getLoginName, email).one(); VUtils.trueThrowBusinessError(Objects.isNull(user)).throwMessage("用户不存在"); @@ -483,6 +490,7 @@ public class AppUserServiceImpl extends ServiceImpl impl user.setPassword(encodePassword); user.setUpdateTime(LocalDateTime.now()); updateById(user); + return user; } @Override diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/DictionaryItemServiceImpl.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/DictionaryItemServiceImpl.java index e64ff75d..0b64320f 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/DictionaryItemServiceImpl.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/DictionaryItemServiceImpl.java @@ -88,7 +88,7 @@ public class DictionaryItemServiceImpl extends ServiceImpl - SELECT t.*,a.`name` AS 'areaName',IF(tf.id IS NULL, false, true) AS 'followed',u.`name` AS 'createBy' + SELECT t.*,IF(u.is_primary,a1.area_name,a2.`name`) AS 'areaName',IF(tf.id IS NULL, false, true) AS 'followed',u.`name` AS 'createBy' ,IF(tf.id IS NULL, false, true) AS 'followed',t.handle FROM ticket t LEFT JOIN app_user u ON t.user_id=u.id - LEFT JOIN app_area a ON u.area_id=a.id + LEFT JOIN t_base_area a1 ON u.area_id=a1.id + LEFT JOIN app_area a2 ON u.area_id=a2.id LEFT JOIN ticket_follow tf ON t.id=tf.ticket_id AND tf.user_id=#{userId} AND tf.from=0 WHERE t.user_id=#{userId} AND t.state!=4 @@ -84,10 +85,11 @@ - SELECT t.id,t.`no`,t.title,t.state,t.urgency,t.component,t.question,t.solution,a.`name` AS 'areaName' + SELECT t.id,t.`no`,t.title,t.state,t.urgency,t.component,t.question,t.solution,IF(u.is_primary,a1.area_name,a2.`name`) AS 'areaName' ,d.customer_name AS 'companyName',u.company_id AS 'companyId',u.`name` AS 'createBy',t.device_no AS 'deviceNo',t.use_time AS 'useTime' ,t.create_time AS 'createTime',t.handle,t.solve_time AS 'solveTime',di.name AS 'warrantyStatusDesc' FROM ticket t LEFT JOIN app_user u ON t.user_id=u.id LEFT JOIN t_base_customer c ON u.company_id=c.id - LEFT JOIN app_area a ON u.area_id=a.id + LEFT JOIN t_base_area a1 ON u.area_id=a1.id + LEFT JOIN app_area a2 ON u.area_id=a2.id LEFT JOIN device d ON t.device_no=d.device_no AND d.data_valid_state=1 LEFT JOIN dictionary_item di ON d.warranty_state=di.id @@ -147,14 +152,15 @@