From 135b92ca751b87458fe70f73b656a66589743bf7 Mon Sep 17 00:00:00 2001 From: 10002617 Date: Thu, 26 Mar 2026 10:39:34 +0800 Subject: [PATCH 1/5] =?UTF-8?q?zjr0325-=E6=96=B0=E5=A2=9E=E9=82=AE?= =?UTF-8?q?=E4=BB=B6=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/SendMsgConfigController.java | 61 ++++++ .../SendMsgConfigUserController.java | 59 +++++ .../admin/event/TicketAssignedEvent.java | 42 ++-- .../admin/event/TicketCloseEvent.java | 51 ++++- .../admin/event/TicketCompleteEvent.java | 92 ++++---- .../admin/event/TicketReplyEvent.java | 50 +++-- .../admin/task/TicketScheduledTasks.java | 50 +++-- .../cfs/event/GongFuTicketCreateEvent.java | 49 +++-- .../cfs/event/TicketCloseEvent.java | 70 +++++- .../cfs/event/TicketCreateEvent.java | 55 +++-- .../cfs/event/TicketReopenEvent.java | 69 +++++- .../cfs/event/TicketReplyEvent.java | 70 +++--- .../cfs/listener/TicketEventListener.java | 6 + .../common/constant/Constant.java | 18 ++ .../constant/SendMsgConfigDataTypeEnum.java | 33 +++ .../constant/SendMsgConfigRemindTypeEnum.java | 37 ++++ .../SendMsgConfigUserReceiverTypeEnum.java | 41 ++++ .../constant/SendMsgConfigUserTypeEnum.java | 31 +++ .../pojo/request/SendMsgConfigAddRequest.java | 15 ++ .../request/SendMsgConfigGetPageRequest.java | 12 ++ .../request/SendMsgConfigUpdateRequest.java | 18 ++ .../request/SendMsgConfigUserAddRequest.java | 22 ++ .../SendMsgConfigUserGetListRequest.java | 10 + .../SendMsgConfigUserUpdateRequest.java | 25 +++ .../pojo/vo/SendMsgConfigGetPageVO.java | 30 +++ .../pojo/vo/SendMsgConfigUserGetListVO.java | 36 ++++ .../gongfu/event/TicketAssignedEvent.java | 40 ++-- .../gongfu/event/TicketCloseEvent.java | 59 ++++- .../gongfu/event/TicketCompleteEvent.java | 89 ++++---- .../gongfu/event/TicketReplyEvent.java | 48 +++-- .../gongfu/task/TicketScheduledTasks.java | 52 +++-- .../repository/entity/AdminUser.java | 13 ++ .../repository/entity/SendMsgConfig.java | 36 ++++ .../repository/entity/SendMsgConfigUser.java | 48 +++++ .../mapper/SendMsgConfigMapper.java | 7 + .../mapper/SendMsgConfigUserMapper.java | 7 + .../service/ISendMsgConfigService.java | 32 +++ .../service/ISendMsgConfigUserService.java | 21 ++ .../impl/SendMsgConfigServiceImpl.java | 203 ++++++++++++++++++ .../impl/SendMsgConfigServiceUserImpl.java | 126 +++++++++++ .../starter/event/AbsTicketEvent.java | 46 ++++ .../starter/service/EmailService.java | 27 +++ .../utils/SpringContextHolderUtils.java | 21 ++ 43 files changed, 1616 insertions(+), 311 deletions(-) create mode 100644 nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/SendMsgConfigController.java create mode 100644 nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/SendMsgConfigUserController.java create mode 100644 nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/constant/SendMsgConfigDataTypeEnum.java create mode 100644 nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/constant/SendMsgConfigRemindTypeEnum.java create mode 100644 nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/constant/SendMsgConfigUserReceiverTypeEnum.java create mode 100644 nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/constant/SendMsgConfigUserTypeEnum.java create mode 100644 nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/SendMsgConfigAddRequest.java create mode 100644 nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/SendMsgConfigGetPageRequest.java create mode 100644 nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/SendMsgConfigUpdateRequest.java create mode 100644 nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/SendMsgConfigUserAddRequest.java create mode 100644 nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/SendMsgConfigUserGetListRequest.java create mode 100644 nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/SendMsgConfigUserUpdateRequest.java create mode 100644 nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/SendMsgConfigGetPageVO.java create mode 100644 nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/SendMsgConfigUserGetListVO.java create mode 100644 nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/SendMsgConfig.java create mode 100644 nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/SendMsgConfigUser.java create mode 100644 nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/SendMsgConfigMapper.java create mode 100644 nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/SendMsgConfigUserMapper.java create mode 100644 nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/ISendMsgConfigService.java create mode 100644 nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/ISendMsgConfigUserService.java create mode 100644 nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/SendMsgConfigServiceImpl.java create mode 100644 nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/SendMsgConfigServiceUserImpl.java create mode 100644 nflg-mobilebroken-starter/src/main/java/com/nflg/mobilebroken/starter/event/AbsTicketEvent.java create mode 100644 nflg-mobilebroken-starter/src/main/java/com/nflg/mobilebroken/starter/utils/SpringContextHolderUtils.java diff --git a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/SendMsgConfigController.java b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/SendMsgConfigController.java new file mode 100644 index 00000000..9c39baf4 --- /dev/null +++ b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/SendMsgConfigController.java @@ -0,0 +1,61 @@ +package com.nflg.mobilebroken.admin.controller; + +import cn.hutool.core.collection.CollectionUtil; +import com.nflg.mobilebroken.admin.annotation.ApiMark; +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.SendMsgConfigAddRequest; +import com.nflg.mobilebroken.common.pojo.request.SendMsgConfigGetPageRequest; +import com.nflg.mobilebroken.common.pojo.request.SendMsgConfigUpdateRequest; +import com.nflg.mobilebroken.common.pojo.vo.SendMsgConfigGetPageVO; +import com.nflg.mobilebroken.repository.entity.SendMsgConfig; +import com.nflg.mobilebroken.repository.service.ISendMsgConfigService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.Valid; +import java.util.Arrays; +import java.util.List; + +@RestController +@RequestMapping("/sendMsgConfig") +public class SendMsgConfigController extends ControllerBase{ + + @Autowired + private ISendMsgConfigService sendMsgConfigService; + + @PostMapping("page") + @ApiMark(moduleName = "发信管理", apiName = "分页查询") + public ApiResult> page(@RequestBody SendMsgConfigGetPageRequest request) { + return ApiResult.success(sendMsgConfigService.getPage(request)); + } + + @PostMapping("add") + @ApiMark(moduleName = "发信管理", apiName = "新增") + public ApiResult add(@Valid @RequestBody SendMsgConfigAddRequest request) { + sendMsgConfigService.addSendMsgConfig(request); + return ApiResult.success(true); + } + + @PostMapping("update") + @ApiMark(moduleName = "发信管理", apiName = "更新") + public ApiResult update(@Valid @RequestBody SendMsgConfigUpdateRequest request) { + sendMsgConfigService.updateSendMsgConfig(request); + return ApiResult.success(true); + } + + @PostMapping("deleteByIds") + @ApiMark(moduleName = "发信管理", apiName = "删除") + public ApiResult deleteByIds(@RequestBody List ids) { + if (CollectionUtil.isEmpty(ids)) { + throw new NflgException(STATE.ParamErr, "ids必传"); + } + sendMsgConfigService.removeByIds(ids); + return ApiResult.success(true); + } +} diff --git a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/SendMsgConfigUserController.java b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/SendMsgConfigUserController.java new file mode 100644 index 00000000..75c6811c --- /dev/null +++ b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/SendMsgConfigUserController.java @@ -0,0 +1,59 @@ +package com.nflg.mobilebroken.admin.controller; + +import cn.hutool.core.collection.CollectionUtil; +import com.nflg.mobilebroken.admin.annotation.ApiMark; +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.SendMsgConfigGetPageVO; +import com.nflg.mobilebroken.common.pojo.vo.SendMsgConfigUserGetListVO; +import com.nflg.mobilebroken.repository.service.ISendMsgConfigService; +import com.nflg.mobilebroken.repository.service.ISendMsgConfigUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.Valid; +import java.util.List; + +@RestController +@RequestMapping("/sendMsgConfigUser") +public class SendMsgConfigUserController extends ControllerBase { + + @Autowired + private ISendMsgConfigUserService sendMsgConfigUserService; + + @PostMapping("list") + @ApiMark(moduleName = "发信管理用户配置", apiName = "查询列表") + public ApiResult> list(@RequestBody SendMsgConfigUserGetListRequest request) { + return ApiResult.success(sendMsgConfigUserService.getList(request)); + } + + @PostMapping("add") + @ApiMark(moduleName = "发信管理用户配置", apiName = "新增") + public ApiResult add(@Valid @RequestBody SendMsgConfigUserAddRequest request) { + sendMsgConfigUserService.addSendMsgUserConfig(request); + return ApiResult.success(true); + } + + @PostMapping("update") + @ApiMark(moduleName = "发信管理用户配置", apiName = "更新") + public ApiResult update(@Valid @RequestBody SendMsgConfigUserUpdateRequest request) { + sendMsgConfigUserService.updateSendMsgUserConfig(request); + return ApiResult.success(true); + } + + @PostMapping("deleteByIds") + @ApiMark(moduleName = "发信管理用户配置", apiName = "删除") + public ApiResult deleteByIds(@RequestBody List ids) { + if (CollectionUtil.isEmpty(ids)) { + throw new NflgException(STATE.ParamErr, "ids必传"); + } + sendMsgConfigUserService.removeByIds(ids); + return ApiResult.success(true); + } +} diff --git a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/event/TicketAssignedEvent.java b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/event/TicketAssignedEvent.java index af185b36..a3dd4fb6 100644 --- a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/event/TicketAssignedEvent.java +++ b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/event/TicketAssignedEvent.java @@ -3,31 +3,29 @@ package com.nflg.mobilebroken.admin.event; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DatePattern; import cn.hutool.core.util.StrUtil; -import com.nflg.mobilebroken.common.constant.Constant; -import com.nflg.mobilebroken.common.constant.MessageSubType; -import com.nflg.mobilebroken.common.constant.MessageType; +import com.google.common.collect.Sets; +import com.nflg.mobilebroken.common.constant.*; +import com.nflg.mobilebroken.starter.event.AbsTicketEvent; import com.nflg.mobilebroken.repository.entity.AdminMessage; import com.nflg.mobilebroken.repository.entity.AdminUser; import com.nflg.mobilebroken.repository.entity.AppUser; import com.nflg.mobilebroken.repository.entity.Ticket; -import com.nflg.mobilebroken.repository.service.IAdminMessageService; -import com.nflg.mobilebroken.repository.service.IAdminUserService; -import com.nflg.mobilebroken.repository.service.IAppUserService; -import com.nflg.mobilebroken.repository.service.IDictionaryItemTranslateService; +import com.nflg.mobilebroken.repository.service.*; import com.nflg.mobilebroken.starter.service.EmailService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.compress.utils.Lists; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; -import org.springframework.context.ApplicationEvent; import javax.mail.MessagingException; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; @Slf4j -public class TicketAssignedEvent extends ApplicationEvent implements ApplicationContextAware { +public class TicketAssignedEvent extends AbsTicketEvent implements ApplicationContextAware { private static final DateTimeFormatter FORMATTER= DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN); private final Ticket ticket; @@ -42,6 +40,7 @@ public class TicketAssignedEvent extends ApplicationEvent implements Application super(source); this.ticket = ticket; this.userIds = userIds; + initSendMsgConfigAdminUserMap(SendMsgConfigDataTypeEnum.MOBILE_BROKEN_TICKET, SendMsgConfigRemindTypeEnum.TITLE_TICKET_ASSIGNED); } @Override @@ -60,9 +59,12 @@ public class TicketAssignedEvent extends ApplicationEvent implements Application private void sendUserMessage(){ //我的待办 - List adminUsers=adminUserService.listByIds(userIds); - if (CollectionUtil.isNotEmpty(adminUsers)){ - adminUsers.forEach(c -> adminMessageService.add( + Set adminUserSet = Sets.newHashSet(); + adminUserSet.addAll(adminUserService.listByIds(userIds)); + adminUserSet.addAll(getSendMsgConfigAdminUserForInSiteMsg()); + + if (CollectionUtil.isNotEmpty(adminUserSet)){ + adminUserSet.forEach(c -> adminMessageService.add( new AdminMessage() .setNo(ticket.getNo()) .setTitle(ticket.getTitle()) @@ -79,8 +81,10 @@ public class TicketAssignedEvent extends ApplicationEvent implements Application private void sendEmail(){ try { - List adminUsers = adminUserService.listByIds(userIds); - if (CollectionUtil.isNotEmpty(adminUsers)) { + List adminUsers = CollectionUtil.defaultIfEmpty(adminUserService.listByIds(userIds), Lists.newArrayList()); + List configAdminUsers = getSendMsgConfigAdminUserForEmail(); + + if (CollectionUtil.isNotEmpty(adminUsers) || CollectionUtil.isNotEmpty(configAdminUsers)) { AppUser appUser=appUserService.getById(ticket.getUserId()); String subject = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_TITLE_TICKET_ASSIGNED, Constant.DEFAULT_LANGUAGE_CODE); String content = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_CONTENT_TICKET_NOTIFY, Constant.DEFAULT_LANGUAGE_CODE) @@ -90,18 +94,10 @@ public class TicketAssignedEvent extends ApplicationEvent implements Application .replace("${handleUser}", StrUtil.join(",",adminUsers.stream().map(AdminUser::getUserName).collect(Collectors.toList()))) .replace("${createTime}", ticket.getCreateTime().format(FORMATTER)) .replace("${msg}", subject); - sendEmail(adminUsers, subject, content); + emailService.sendEmailForAdminUser(adminUsers, configAdminUsers, subject, content); } }catch(Exception ex){ log.error("邮件发送失败", ex); } } - - private void sendEmail(List adminUsers,String subject,String content) throws MessagingException { - if (CollectionUtil.isNotEmpty(adminUsers)){ - for (AdminUser adminUser:adminUsers) { - emailService.sendEmail(adminUser.getEmail(),subject,content); - } - } - } } diff --git a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/event/TicketCloseEvent.java b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/event/TicketCloseEvent.java index 4c4882bd..1db4c6d1 100644 --- a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/event/TicketCloseEvent.java +++ b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/event/TicketCloseEvent.java @@ -3,25 +3,29 @@ package com.nflg.mobilebroken.admin.event; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DatePattern; import cn.hutool.core.util.StrUtil; -import com.nflg.mobilebroken.common.constant.MessageSubType; -import com.nflg.mobilebroken.common.constant.MessageType; +import com.google.common.collect.Sets; +import com.nflg.mobilebroken.common.constant.*; +import com.nflg.mobilebroken.starter.event.AbsTicketEvent; import com.nflg.mobilebroken.repository.entity.AdminMessage; import com.nflg.mobilebroken.repository.entity.AdminUser; +import com.nflg.mobilebroken.repository.entity.AppUser; import com.nflg.mobilebroken.repository.entity.Ticket; import com.nflg.mobilebroken.repository.service.*; import com.nflg.mobilebroken.starter.service.EmailService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.compress.utils.Lists; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; -import org.springframework.context.ApplicationEvent; +import javax.mail.MessagingException; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; @Slf4j -public class TicketCloseEvent extends ApplicationEvent implements ApplicationContextAware { +public class TicketCloseEvent extends AbsTicketEvent implements ApplicationContextAware { private static final DateTimeFormatter FORMATTER= DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN); private final Ticket ticket; @@ -35,6 +39,7 @@ public class TicketCloseEvent extends ApplicationEvent implements ApplicationCon public TicketCloseEvent(Object source,Ticket ticket) { super(source); this.ticket = ticket; + initSendMsgConfigAdminUserMap(SendMsgConfigDataTypeEnum.MOBILE_BROKEN_TICKET, SendMsgConfigRemindTypeEnum.TITLE_TICKET_CLOSE); } @Override @@ -48,15 +53,19 @@ public class TicketCloseEvent extends ApplicationEvent implements ApplicationCon } public void send(){ - sendUserMessage(); + List userIds= StrUtil.split(ticket.getHandle(),",").stream().map(Integer::parseInt).collect(Collectors.toList()); + sendUserMessage(userIds); + sendEmail(userIds); } - private void sendUserMessage(){ + private void sendUserMessage(List userIds){ //我的待办 - List userIds= StrUtil.split(ticket.getHandle(),",").stream().map(Integer::parseInt).collect(Collectors.toList()); - List adminUsers=adminUserService.listByIds(userIds); - if (CollectionUtil.isNotEmpty(adminUsers)){ - adminUsers.forEach(c -> adminMessageService.add( + Set adminUserSet = Sets.newHashSet(); + adminUserSet.addAll(adminUserService.listByIds(userIds)); + adminUserSet.addAll(getSendMsgConfigAdminUserForInSiteMsg()); + + if (CollectionUtil.isNotEmpty(adminUserSet)){ + adminUserSet.forEach(c -> adminMessageService.add( new AdminMessage() .setNo(ticket.getNo()) .setTitle(ticket.getTitle()) @@ -70,4 +79,26 @@ public class TicketCloseEvent extends ApplicationEvent implements ApplicationCon ); } } + + private void sendEmail(List userIds){ + try { + List adminUsers = CollectionUtil.defaultIfEmpty(adminUserService.listByIds(userIds), Lists.newArrayList()); + List configAdminUsers = getSendMsgConfigAdminUserForEmail(); + + if (CollectionUtil.isNotEmpty(adminUsers) || CollectionUtil.isNotEmpty(configAdminUsers)) { + AppUser appUser=appUserService.getById(ticket.getUserId()); + String subject = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_TITLE_TICKET_CLOSE, Constant.DEFAULT_LANGUAGE_CODE); + String content = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_CONTENT_TICKET_NOTIFY, Constant.DEFAULT_LANGUAGE_CODE) + .replace("${no}", ticket.getNo()) + .replace("${title}", ticket.getTitle()) + .replace("${createUser}", appUser.getName()) + .replace("${handleUser}", StrUtil.join(",",adminUsers.stream().map(AdminUser::getUserName).collect(Collectors.toList()))) + .replace("${createTime}", ticket.getCreateTime().format(FORMATTER)) + .replace("${msg}", subject); + emailService.sendEmailForAdminUser(adminUsers, configAdminUsers, subject, content); + } + }catch(Exception ex){ + log.error("邮件发送失败", ex); + } + } } diff --git a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/event/TicketCompleteEvent.java b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/event/TicketCompleteEvent.java index a787bc40..79a2eeb9 100644 --- a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/event/TicketCompleteEvent.java +++ b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/event/TicketCompleteEvent.java @@ -3,25 +3,26 @@ package com.nflg.mobilebroken.admin.event; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DatePattern; import cn.hutool.core.util.StrUtil; -import com.nflg.mobilebroken.common.constant.Constant; -import com.nflg.mobilebroken.common.constant.MessageSubType; -import com.nflg.mobilebroken.common.constant.MessageType; +import com.google.common.collect.Sets; +import com.nflg.mobilebroken.common.constant.*; +import com.nflg.mobilebroken.starter.event.AbsTicketEvent; import com.nflg.mobilebroken.repository.entity.*; import com.nflg.mobilebroken.repository.service.*; import com.nflg.mobilebroken.starter.service.EmailService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.compress.utils.Lists; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; -import org.springframework.context.ApplicationEvent; import javax.mail.MessagingException; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; @Slf4j -public class TicketCompleteEvent extends ApplicationEvent implements ApplicationContextAware { +public class TicketCompleteEvent extends AbsTicketEvent implements ApplicationContextAware { private static final DateTimeFormatter FORMATTER= DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN); private final Ticket ticket; @@ -36,6 +37,7 @@ public class TicketCompleteEvent extends ApplicationEvent implements Application public TicketCompleteEvent(Object source,Ticket ticket) { super(source); this.ticket = ticket; + initSendMsgConfigAdminUserMap(SendMsgConfigDataTypeEnum.MOBILE_BROKEN_TICKET, SendMsgConfigRemindTypeEnum.TITLE_TICKET_COMPLETE); } @Override @@ -64,63 +66,59 @@ public class TicketCompleteEvent extends ApplicationEvent implements Application .setIsRead(false) .setCreateTime(LocalDateTime.now())); //我的待办 + + Set adminUserSet = Sets.newHashSet(); //CQM List cqms=deviceTypeService.getCqmsByDeviceType(ticket.getDeviceNo()); if (CollectionUtil.isEmpty(cqms)){ log.warn("该设备尚未设置CQM负责人:{}", ticket.getDeviceNo()); }else { - List cqmUsers = adminUserService.listByIds(cqms); - if (CollectionUtil.isNotEmpty(cqmUsers)) { - cqmUsers.forEach(c -> adminMessageService.add( - new AdminMessage() - .setNo(ticket.getNo()) - .setTitle(ticket.getTitle()) - .setUserId(c.getId()) - .setSourceId(Long.valueOf(ticket.getId())) - .setSource(0) - .setType(MessageType.WorkOrderAssignment.getState()) - .setSubType(MessageSubType.TicketCompletion.getState()) - .setIsRead(false) - .setCreateTime(LocalDateTime.now())) - ); - } + adminUserSet.addAll(adminUserService.listByIds(cqms)); + } + + adminUserSet.addAll(getSendMsgConfigAdminUserForInSiteMsg()); + + if (CollectionUtil.isNotEmpty(adminUserSet)) { + adminUserSet.forEach(c -> adminMessageService.add( + new AdminMessage() + .setNo(ticket.getNo()) + .setTitle(ticket.getTitle()) + .setUserId(c.getId()) + .setSourceId(Long.valueOf(ticket.getId())) + .setSource(0) + .setType(MessageType.WorkOrderAssignment.getState()) + .setSubType(MessageSubType.TicketCompletion.getState()) + .setIsRead(false) + .setCreateTime(LocalDateTime.now())) + ); } } private void sendEmail(){ try { List cqmUserIds=deviceTypeService.getCqmsByDeviceType(ticket.getDeviceNo()); + List configAdminUsers = getSendMsgConfigAdminUserForEmail(); + + List cqmUsers = Lists.newArrayList(); if (CollectionUtil.isNotEmpty(cqmUserIds)) { - List cqmUsers = adminUserService.listByIds(cqmUserIds); - if (CollectionUtil.isNotEmpty(cqmUsers)) { - List handleUserIds = StrUtil.split(ticket.getHandle(),",").stream().map(Integer::parseInt).collect(Collectors.toList()); - List handleUsers = adminUserService.listByIds(handleUserIds); - AppUser appUser = appUserService.getById(ticket.getUserId()); - String subject = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_TITLE_TICKET_Complete, Constant.DEFAULT_LANGUAGE_CODE); - String content = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_CONTENT_TICKET_NOTIFY, Constant.DEFAULT_LANGUAGE_CODE) - .replace("${no}", ticket.getNo()) - .replace("${title}", ticket.getTitle()) - .replace("${createUser}", appUser.getName()) - .replace("${handleUser}", StrUtil.join(",", handleUsers.stream().map(AdminUser::getUserName).collect(Collectors.toList()))) - .replace("${createTime}", ticket.getCreateTime().format(FORMATTER)) - .replace("${msg}", subject); - sendEmail(cqmUsers, subject, content); - } + cqmUsers = CollectionUtil.defaultIfEmpty(adminUserService.listByIds(cqmUserIds), Lists.newArrayList()); + } + if (CollectionUtil.isNotEmpty(cqmUsers) || CollectionUtil.isNotEmpty(configAdminUsers)) { + List handleUserIds = StrUtil.split(ticket.getHandle(),",").stream().map(Integer::parseInt).collect(Collectors.toList()); + List handleUsers = adminUserService.listByIds(handleUserIds); + AppUser appUser = appUserService.getById(ticket.getUserId()); + String subject = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_TITLE_TICKET_Complete, Constant.DEFAULT_LANGUAGE_CODE); + String content = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_CONTENT_TICKET_NOTIFY, Constant.DEFAULT_LANGUAGE_CODE) + .replace("${no}", ticket.getNo()) + .replace("${title}", ticket.getTitle()) + .replace("${createUser}", appUser.getName()) + .replace("${handleUser}", StrUtil.join(",", handleUsers.stream().map(AdminUser::getUserName).collect(Collectors.toList()))) + .replace("${createTime}", ticket.getCreateTime().format(FORMATTER)) + .replace("${msg}", subject); + emailService.sendEmailForAdminUser(cqmUsers, configAdminUsers, subject, content); } }catch(Exception ex){ log.error("邮件发送失败", ex); } } - - private void sendEmail(List adminUsers,String subject,String content){ - if (CollectionUtil.isNotEmpty(adminUsers)){ - for (AdminUser adminUser:adminUsers) { - try { - emailService.sendEmail(adminUser.getEmail(),subject,content); - } catch (MessagingException e) { - log.error("邮件发送失败", e); - } - } - } - } } diff --git a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/event/TicketReplyEvent.java b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/event/TicketReplyEvent.java index 12f2c042..8a8fd003 100644 --- a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/event/TicketReplyEvent.java +++ b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/event/TicketReplyEvent.java @@ -3,27 +3,26 @@ package com.nflg.mobilebroken.admin.event; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DatePattern; import cn.hutool.core.util.StrUtil; -import com.nflg.mobilebroken.common.constant.Constant; -import com.nflg.mobilebroken.common.constant.MessageSubType; -import com.nflg.mobilebroken.repository.entity.AdminUser; -import com.nflg.mobilebroken.repository.entity.AppMessage; -import com.nflg.mobilebroken.repository.entity.AppUser; -import com.nflg.mobilebroken.repository.entity.Ticket; +import com.google.common.collect.Sets; +import com.nflg.mobilebroken.common.constant.*; +import com.nflg.mobilebroken.repository.entity.*; +import com.nflg.mobilebroken.starter.event.AbsTicketEvent; import com.nflg.mobilebroken.repository.service.*; import com.nflg.mobilebroken.starter.service.EmailService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.compress.utils.Lists; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; -import org.springframework.context.ApplicationEvent; import javax.mail.MessagingException; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; @Slf4j -public class TicketReplyEvent extends ApplicationEvent implements ApplicationContextAware { +public class TicketReplyEvent extends AbsTicketEvent implements ApplicationContextAware { private static final DateTimeFormatter FORMATTER= DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN); private final Ticket ticket; @@ -38,6 +37,7 @@ public class TicketReplyEvent extends ApplicationEvent implements ApplicationCon public TicketReplyEvent(Object source,Ticket ticket) { super(source); this.ticket = ticket; + initSendMsgConfigAdminUserMap(SendMsgConfigDataTypeEnum.MOBILE_BROKEN_TICKET, SendMsgConfigRemindTypeEnum.TITLE_TICKET_REPLY); } @Override @@ -53,7 +53,7 @@ public class TicketReplyEvent extends ApplicationEvent implements ApplicationCon public void send(){ sendUserMessage(); -// sendEmail(); + sendEmail(); } private void sendUserMessage(){ @@ -65,13 +65,35 @@ public class TicketReplyEvent extends ApplicationEvent implements ApplicationCon .setSubType(MessageSubType.TicketNewMessage.getState()) .setIsRead(false) .setCreateTime(LocalDateTime.now())); + + //我的待办 + Set adminUserSet = Sets.newHashSet(); + adminUserSet.addAll(getSendMsgConfigAdminUserForInSiteMsg()); + + if (CollectionUtil.isNotEmpty(adminUserSet)){ + adminUserSet.forEach(c -> adminMessageService.add( + new AdminMessage() + .setNo(ticket.getNo()) + .setTitle(ticket.getTitle()) + .setUserId(c.getId()) + .setSourceId(Long.valueOf(ticket.getId())) + .setSource(0) + .setType(MessageType.WorkOrderAssignment.getState()) + .setSubType(MessageSubType.TicketNewMessage.getState()) + .setIsRead(false) + .setCreateTime(LocalDateTime.now())) + ); + } } private void sendEmail(){ try { List userIds = StrUtil.split(ticket.getHandle(),",").stream().map(Integer::parseInt).collect(Collectors.toList()); - List adminUsers = adminUserService.listByIds(userIds); - if (CollectionUtil.isNotEmpty(adminUsers)) { + List adminUsers = CollectionUtil.defaultIfEmpty(adminUserService.listByIds(userIds), Lists.newArrayList()); + + List configAdminUsers = getSendMsgConfigAdminUserForEmail(); + + if (CollectionUtil.isNotEmpty(adminUsers) || CollectionUtil.isNotEmpty(configAdminUsers)) { AppUser appUser=appUserService.getById(ticket.getUserId()); String subject = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_TITLE_TICKET_REPLY, Constant.DEFAULT_LANGUAGE_CODE); String content = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_CONTENT_TICKET_NOTIFY, Constant.DEFAULT_LANGUAGE_CODE) @@ -82,14 +104,10 @@ public class TicketReplyEvent extends ApplicationEvent implements ApplicationCon .replace("${createTime}", ticket.getCreateTime().format(FORMATTER)) .replace("${msg}", subject); //发送给提交人 - sendEmail(appUser, subject, content); + emailService.sendEmailForAdminUser(Lists.newArrayList(), configAdminUsers, subject, content); } }catch(Exception ex){ log.error("邮件发送失败", ex); } } - - private void sendEmail(AppUser appUser,String subject,String content) throws MessagingException { - emailService.sendEmail(appUser.getEmail(),subject,content); - } } 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 77e40677..3a138456 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 @@ -4,16 +4,14 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DatePattern; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; +import com.google.common.collect.Sets; import com.nflg.mobilebroken.admin.pojo.dto.SyncFromCrmDTO; import com.nflg.mobilebroken.admin.pojo.dto.TiketTimeoutDTO; import com.nflg.mobilebroken.admin.publisher.TicketEventPublisher; import com.nflg.mobilebroken.admin.service.AdminCustomerService; import com.nflg.mobilebroken.admin.service.AdminDeviceService; import com.nflg.mobilebroken.admin.service.SsePushService; -import com.nflg.mobilebroken.common.constant.Constant; -import com.nflg.mobilebroken.common.constant.MessageSubType; -import com.nflg.mobilebroken.common.constant.TicketState; -import com.nflg.mobilebroken.common.constant.UserState; +import com.nflg.mobilebroken.common.constant.*; import com.nflg.mobilebroken.common.pojo.dto.ChatMessageDTO; import com.nflg.mobilebroken.common.pojo.request.TicketEvaluateAddRequest; import com.nflg.mobilebroken.common.pojo.vo.TicketEvaluateAddVO; @@ -22,6 +20,7 @@ import com.nflg.mobilebroken.repository.entity.*; import com.nflg.mobilebroken.repository.service.*; import com.nflg.mobilebroken.starter.service.EmailService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.compress.utils.Lists; import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @@ -31,10 +30,7 @@ import javax.mail.MessagingException; import java.math.BigDecimal; import java.time.*; import java.time.format.DateTimeFormatter; -import java.util.Collections; -import java.util.List; -import java.util.Objects; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; @Component @@ -97,6 +93,9 @@ public class TicketScheduledTasks { @Resource private ITBaseDeviceTypeService deviceTypeService; + @Resource + private ISendMsgConfigService sendMsgConfigService; + /** * 工单评论邀请邮件 * 每天午夜12点执行一次 @@ -277,8 +276,12 @@ public class TicketScheduledTasks { if (CollectionUtil.isNotEmpty(followUserIds)){ adminUserIds.addAll(followUserIds); } - if (CollectionUtil.isNotEmpty(adminUserIds)) { - List adminUsers = adminUserService.listByIds(adminUserIds); + Map> sendMsgConfigAdminUserMap = sendMsgConfigService.getAdminUserMapByDataTypeAndRemindType(SendMsgConfigDataTypeEnum.MOBILE_BROKEN_TICKET, SendMsgConfigRemindTypeEnum.TITLE_TICKET_TIMEOUT); + + List configEmailsAdminUsers = sendMsgConfigAdminUserMap.getOrDefault(SendMsgConfigUserReceiverTypeEnum.EMAIL, Lists.newArrayList()); + + if (CollectionUtil.isNotEmpty(adminUserIds) || CollectionUtil.isNotEmpty(configEmailsAdminUsers)) { + List adminUsers = CollectionUtil.isNotEmpty(adminUserIds) ? adminUserService.listByIds(adminUserIds) : Lists.newArrayList(); String subject = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_TITLE_TICKET_TIMEOUT, Constant.DEFAULT_LANGUAGE_CODE); String content = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_CONTENT_TICKET_NOTIFY, Constant.DEFAULT_LANGUAGE_CODE) .replace("${no}", ticket.getNo()) @@ -288,11 +291,29 @@ public class TicketScheduledTasks { .replace("${createTime}", toTimeString(ticket.getCreateTime())) .replace("${msg}", subject); try { - sendEamilForAdminUser(adminUsers, subject, content); + sendEamilForAdminUser(adminUsers, configEmailsAdminUsers, subject, content); } catch (Exception e) { log.error("【工单超时提醒】邮件发送失败", e); } } + + // 发信管理设置的站内信接收人 + List configInSiteMsgAdminUsers = sendMsgConfigAdminUserMap.getOrDefault(SendMsgConfigUserReceiverTypeEnum.IN_SITE_MSG, Lists.newArrayList()); + if (CollectionUtil.isNotEmpty(configInSiteMsgAdminUsers)) { + configInSiteMsgAdminUsers.forEach(c -> adminMessageService.add( + new AdminMessage() + .setNo(ticket.getNo()) + .setTitle(ticket.getTitle()) + .setUserId(c.getId()) + .setSourceId(Long.valueOf(ticket.getId())) + .setSource(0) + .setType(MessageType.WorkOrderAssignment.getState()) + .setSubType(MessageSubType.TicketTimeout.getState()) + .setIsRead(false) + .setCreateTime(LocalDateTime.now())) + ); + } + //客户端关注人 Set appUserIds=ticketFollowService.lambdaQuery() .eq(TicketFollow::getTicketId, ticket.getId()) @@ -325,9 +346,10 @@ public class TicketScheduledTasks { } } - private void sendEamilForAdminUser(List adminUsers,String subject,String content) throws MessagingException { - if (CollectionUtil.isNotEmpty(adminUsers)){ - for (AdminUser adminUser:adminUsers) { + private void sendEamilForAdminUser(List adminUsers, List configAdminUsers, String subject,String content) throws MessagingException { + Set adminUserSet = Sets.union(Sets.newHashSet(adminUsers), Sets.newHashSet(configAdminUsers)); + if (CollectionUtil.isNotEmpty(adminUserSet)){ + for (AdminUser adminUser:adminUserSet) { log.info("【工单超时提醒】发送邮件到{}",adminUser.getEmail()); emailService.sendEmail(adminUser.getEmail(),subject,content); } diff --git a/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/event/GongFuTicketCreateEvent.java b/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/event/GongFuTicketCreateEvent.java index 9334e5b6..692ae87f 100644 --- a/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/event/GongFuTicketCreateEvent.java +++ b/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/event/GongFuTicketCreateEvent.java @@ -3,15 +3,14 @@ package com.nflg.mobilebroken.cfs.event; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DatePattern; import cn.hutool.core.util.StrUtil; -import com.nflg.mobilebroken.common.constant.Constant; -import com.nflg.mobilebroken.common.constant.MessageSubType; -import com.nflg.mobilebroken.common.constant.MessageType; -import com.nflg.mobilebroken.common.constant.TicketState; +import com.google.common.collect.Sets; +import com.nflg.mobilebroken.common.constant.*; import com.nflg.mobilebroken.repository.entity.AdminMessage; import com.nflg.mobilebroken.repository.entity.AdminUser; import com.nflg.mobilebroken.repository.entity.AppUser; import com.nflg.mobilebroken.repository.entity.GongfuTicket; import com.nflg.mobilebroken.repository.service.*; +import com.nflg.mobilebroken.starter.event.AbsTicketEvent; import com.nflg.mobilebroken.starter.service.EmailService; import lombok.extern.slf4j.Slf4j; import org.springframework.context.ApplicationContext; @@ -25,7 +24,7 @@ import java.util.*; import java.util.stream.Collectors; @Slf4j -public class GongFuTicketCreateEvent extends ApplicationEvent implements ApplicationContextAware { +public class GongFuTicketCreateEvent extends AbsTicketEvent implements ApplicationContextAware { private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN); private final GongfuTicket ticket; @@ -44,6 +43,7 @@ public class GongFuTicketCreateEvent extends ApplicationEvent implements Applica this.ticket = ticket; this.language = language; this.zone = zone; + initSendMsgConfigAdminUserMap(SendMsgConfigDataTypeEnum.GONGFU_TICKET, SendMsgConfigRemindTypeEnum.TITLE_TICKET_CREATE); } @Override @@ -73,9 +73,13 @@ public class GongFuTicketCreateEvent extends ApplicationEvent implements Applica log.error("该设备尚未设置服务经理:{}", ticket.getDeviceNo()); return; } - List cqmUsers = adminUserService.listByIds(cqms); - if (CollectionUtil.isNotEmpty(cqmUsers)) { - cqmUsers.forEach(c -> adminMessageService.add( + + Set adminUserSet = Sets.newHashSet(); + adminUserSet.addAll(adminUserService.listByIds(cqms)); + adminUserSet.addAll(getSendMsgConfigAdminUserForInSiteMsg()); + + if (CollectionUtil.isNotEmpty(adminUserSet)) { + adminUserSet.forEach(c -> adminMessageService.add( new AdminMessage() .setNo(ticket.getNo()) .setTitle(ticket.getTitle()) @@ -93,8 +97,13 @@ public class GongFuTicketCreateEvent extends ApplicationEvent implements Applica private void sendUserMessage1() { //我的待办 List handlers = adminUserService.listByIds(Arrays.stream(StrUtil.splitToLong(ticket.getHandle(), ",")).boxed().collect(Collectors.toList())); - if (CollectionUtil.isNotEmpty(handlers)) { - handlers.forEach(c -> adminMessageService.add( + + Set adminUserSet = Sets.newHashSet(); + adminUserSet.addAll(handlers); + adminUserSet.addAll(getSendMsgConfigAdminUserForInSiteMsg()); + + if (CollectionUtil.isNotEmpty(adminUserSet)) { + adminUserSet.forEach(c -> adminMessageService.add( new AdminMessage() .setNo(ticket.getNo()) .setTitle(ticket.getTitle()) @@ -107,6 +116,7 @@ public class GongFuTicketCreateEvent extends ApplicationEvent implements Applica .setCreateTime(LocalDateTime.now())) ); } + } private void sendEmail() { @@ -119,7 +129,7 @@ public class GongFuTicketCreateEvent extends ApplicationEvent implements Applica AdminUser adminUser = adminUserService.getById(ticket.getUserId()); tickerUserName = adminUser.getUserName(); } - String subject = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_TITLE_TICKET_CREATE, language); + String subject = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_TITLE_TICKET_CREATE_GONGFU, language); String content = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_CONTENT_TICKET_NOTIFY, language) .replace("${no}", ticket.getNo()) .replace("${title}", ticket.getTitle()) @@ -133,7 +143,8 @@ public class GongFuTicketCreateEvent extends ApplicationEvent implements Applica if (CollectionUtil.isNotEmpty(cqms)) { adminUsers.addAll(adminUserService.listByIds(cqms)); } - sendEmail(adminUsers.stream().map(AdminUser::getEmail).collect(Collectors.toSet()), subject, content); + List configAdminUsers = getSendMsgConfigAdminUserForEmail(); + emailService.sendEmailForAdminUser(adminUsers, configAdminUsers, subject, content); } catch (Exception ex) { log.error("邮件发送失败", ex); } @@ -149,7 +160,7 @@ public class GongFuTicketCreateEvent extends ApplicationEvent implements Applica AdminUser adminUser = adminUserService.getById(ticket.getUserId()); tickerUserName = adminUser.getUserName(); } - String subject = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_TITLE_TICKET_ASSIGNED, language); + String subject = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_TITLE_TICKET_CREATE_GONGFU, language); String content = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_CONTENT_TICKET_NOTIFY, language) .replace("${no}", ticket.getNo()) .replace("${title}", ticket.getTitle()) @@ -158,20 +169,14 @@ public class GongFuTicketCreateEvent extends ApplicationEvent implements Applica .replace("${createTime}", toTimeString(ticket.getCreateTime())) .replace("${msg}", subject); List handlers = adminUserService.listByIds(Arrays.stream(StrUtil.splitToLong(ticket.getHandle(), ",")).boxed().collect(Collectors.toList())); - sendEmail(handlers.stream().map(AdminUser::getEmail).collect(Collectors.toSet()), subject, content); + + List configAdminUsers = getSendMsgConfigAdminUserForEmail(); + emailService.sendEmailForAdminUser(handlers, configAdminUsers, subject, content); } catch (Exception ex) { log.error("邮件发送失败", ex); } } - private void sendEmail(Set emails, String subject, String content) throws MessagingException { - if (CollectionUtil.isNotEmpty(emails)) { - for (String email : emails) { - emailService.sendEmail(email, subject, content); - } - } - } - private String toTimeString(LocalDateTime time) { return time.format(FORMATTER); } diff --git a/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/event/TicketCloseEvent.java b/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/event/TicketCloseEvent.java index 6b18d28b..2060a7da 100644 --- a/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/event/TicketCloseEvent.java +++ b/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/event/TicketCloseEvent.java @@ -1,49 +1,74 @@ package com.nflg.mobilebroken.cfs.event; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DatePattern; import cn.hutool.core.util.StrUtil; -import com.nflg.mobilebroken.common.constant.MessageSubType; -import com.nflg.mobilebroken.common.constant.MessageType; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; +import com.nflg.mobilebroken.common.constant.*; import com.nflg.mobilebroken.common.pojo.dto.TicketDTO; import com.nflg.mobilebroken.repository.entity.AdminMessage; import com.nflg.mobilebroken.repository.entity.AdminUser; +import com.nflg.mobilebroken.repository.entity.AppUser; import com.nflg.mobilebroken.repository.service.IAdminMessageService; import com.nflg.mobilebroken.repository.service.IAdminUserService; +import com.nflg.mobilebroken.repository.service.IAppUserService; +import com.nflg.mobilebroken.repository.service.IDictionaryItemTranslateService; +import com.nflg.mobilebroken.starter.event.AbsTicketEvent; +import com.nflg.mobilebroken.starter.service.EmailService; +import lombok.extern.slf4j.Slf4j; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.ApplicationEvent; +import javax.mail.MessagingException; import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; -public class TicketCloseEvent extends ApplicationEvent implements ApplicationContextAware { +@Slf4j +public class TicketCloseEvent extends AbsTicketEvent implements ApplicationContextAware { private final TicketDTO ticket; private IAdminUserService adminUserService; private IAdminMessageService adminMessageService; + private IDictionaryItemTranslateService dictionaryItemTranslateService; + private IAppUserService appUserService; + private EmailService emailService; + private static final DateTimeFormatter FORMATTER= DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN); public TicketCloseEvent(Object source, TicketDTO ticket) { super(source); this.ticket = ticket; + SendMsgConfigDataTypeEnum dataTypeEnum = Constant.TICKET_TYPE_MOBILE_BROKEN.equals(ticket.getType()) ? SendMsgConfigDataTypeEnum.MOBILE_BROKEN_TICKET : SendMsgConfigDataTypeEnum.GONGFU_TICKET; + initSendMsgConfigAdminUserMap(dataTypeEnum, SendMsgConfigRemindTypeEnum.TITLE_TICKET_CLOSE); } @Override public void setApplicationContext(ApplicationContext applicationContext) { this.adminUserService = applicationContext.getBean(IAdminUserService.class); this.adminMessageService = applicationContext.getBean(IAdminMessageService.class); + this.dictionaryItemTranslateService = applicationContext.getBean(IDictionaryItemTranslateService.class); + this.appUserService = applicationContext.getBean(IAppUserService.class); + this.emailService = applicationContext.getBean(EmailService.class); } public void send() { - sendUserMessage(); + List userIds = StrUtil.split(ticket.getHandle(), ",").stream().map(Integer::parseInt).collect(Collectors.toList()); + sendUserMessage(userIds); + sendEmail(userIds); } - private void sendUserMessage() { + private void sendUserMessage(List userIds) { //我的待办 - List userIds = StrUtil.split(ticket.getHandle(), ",").stream().map(Integer::parseInt).collect(Collectors.toList()); - List adminUsers = adminUserService.listByIds(userIds); - if (CollectionUtil.isNotEmpty(adminUsers)) { - adminUsers.forEach(c -> adminMessageService.add( + Set adminUserSet = Sets.newHashSet(); + adminUserSet.addAll(adminUserService.listByIds(userIds)); + adminUserSet.addAll(getSendMsgConfigAdminUserForInSiteMsg()); + + if (CollectionUtil.isNotEmpty(adminUserSet)) { + adminUserSet.forEach(c -> adminMessageService.add( new AdminMessage() .setNo(ticket.getNo()) .setTitle(ticket.getTitle()) @@ -57,4 +82,31 @@ public class TicketCloseEvent extends ApplicationEvent implements ApplicationCon ); } } + + private void sendEmail(List userIds){ + try { + List adminUsers = CollectionUtil.defaultIfEmpty(adminUserService.listByIds(userIds), Lists.newArrayList()); + + List configAdminUsers = getSendMsgConfigAdminUserForEmail(); + + if (CollectionUtil.isNotEmpty(adminUsers) || CollectionUtil.isNotEmpty(configAdminUsers)) { + AppUser appUser=appUserService.getById(ticket.getUserId()); + String subject = dictionaryItemTranslateService.getValueByCode( + Constant.DICTIONARY_EMAIL_NOTIFY, + Constant.TICKET_TYPE_MOBILE_BROKEN.equals(ticket.getType()) ? Constant.DICTIONARY_ITEM_EMAIL_TITLE_TICKET_CLOSE : Constant.DICTIONARY_ITEM_EMAIL_TITLE_TICKET_CLOSE_GONGFU, + Constant.DEFAULT_LANGUAGE_CODE + ); + String content = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_CONTENT_TICKET_NOTIFY, Constant.DEFAULT_LANGUAGE_CODE) + .replace("${no}", ticket.getNo()) + .replace("${title}", ticket.getTitle()) + .replace("${createUser}", appUser.getName()) + .replace("${handleUser}", StrUtil.join(",",adminUsers.stream().map(AdminUser::getUserName).collect(Collectors.toList()))) + .replace("${createTime}", ticket.getCreateTime().format(FORMATTER)) + .replace("${msg}", subject); + emailService.sendEmailForAdminUser(adminUsers, configAdminUsers, subject, content); + } + }catch(Exception ex){ + log.error("邮件发送失败", ex); + } + } } diff --git a/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/event/TicketCreateEvent.java b/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/event/TicketCreateEvent.java index 1e5bf26c..862cb90f 100644 --- a/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/event/TicketCreateEvent.java +++ b/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/event/TicketCreateEvent.java @@ -3,14 +3,14 @@ package com.nflg.mobilebroken.cfs.event; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DatePattern; import cn.hutool.core.util.StrUtil; -import com.nflg.mobilebroken.common.constant.Constant; -import com.nflg.mobilebroken.common.constant.MessageSubType; -import com.nflg.mobilebroken.common.constant.MessageType; +import com.google.common.collect.Sets; +import com.nflg.mobilebroken.common.constant.*; import com.nflg.mobilebroken.repository.entity.AdminMessage; import com.nflg.mobilebroken.repository.entity.AdminUser; import com.nflg.mobilebroken.repository.entity.AppUser; import com.nflg.mobilebroken.repository.entity.Ticket; import com.nflg.mobilebroken.repository.service.*; +import com.nflg.mobilebroken.starter.event.AbsTicketEvent; import com.nflg.mobilebroken.starter.service.EmailService; import lombok.extern.slf4j.Slf4j; import org.springframework.context.ApplicationContext; @@ -26,7 +26,7 @@ import java.util.Set; import java.util.stream.Collectors; @Slf4j -public class TicketCreateEvent extends ApplicationEvent implements ApplicationContextAware { +public class TicketCreateEvent extends AbsTicketEvent implements ApplicationContextAware { private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN); private final Ticket ticket; @@ -45,6 +45,7 @@ public class TicketCreateEvent extends ApplicationEvent implements ApplicationCo this.ticket = ticket; this.language = language; this.zone = zone; + initSendMsgConfigAdminUserMap(SendMsgConfigDataTypeEnum.MOBILE_BROKEN_TICKET, SendMsgConfigRemindTypeEnum.TITLE_TICKET_CREATE); } @Override @@ -64,25 +65,29 @@ public class TicketCreateEvent extends ApplicationEvent implements ApplicationCo private void sendUserMessage() { //我的待办 + Set adminUserSet = Sets.newHashSet(); + List cqms = deviceTypeService.getCqmsByDeviceType(ticket.getDeviceNo()); if (CollectionUtil.isEmpty(cqms)) { log.warn("该设备尚未设置CQM负责人:{}", ticket.getDeviceNo()); } else { - List cqmUsers = adminUserService.listByIds(cqms); - if (CollectionUtil.isNotEmpty(cqmUsers)) { - cqmUsers.forEach(c -> adminMessageService.add( - new AdminMessage() - .setNo(ticket.getNo()) - .setTitle(ticket.getTitle()) - .setUserId(c.getId()) - .setSourceId(Long.valueOf(ticket.getId())) - .setSource(0) - .setType(MessageType.WorkOrderAssignment.getState()) - .setSubType(MessageSubType.TicketToBeAssigned.getState()) - .setIsRead(false) - .setCreateTime(LocalDateTime.now())) - ); - } + adminUserSet.addAll(adminUserService.listByIds(cqms)); + } + adminUserSet.addAll(getSendMsgConfigAdminUserForInSiteMsg()); + + if (CollectionUtil.isNotEmpty(adminUserSet)) { + adminUserSet.forEach(c -> adminMessageService.add( + new AdminMessage() + .setNo(ticket.getNo()) + .setTitle(ticket.getTitle()) + .setUserId(c.getId()) + .setSourceId(Long.valueOf(ticket.getId())) + .setSource(0) + .setType(MessageType.WorkOrderAssignment.getState()) + .setSubType(MessageSubType.TicketToBeAssigned.getState()) + .setIsRead(false) + .setCreateTime(LocalDateTime.now())) + ); } } @@ -120,20 +125,14 @@ public class TicketCreateEvent extends ApplicationEvent implements ApplicationCo adminUsers.addAll(adminUserService.getByTitleCode(Constant.TITLE_TEST_MANAGER)); //发给质量主管 adminUsers.addAll(adminUserService.getByTitleCode(Constant.TITLE_QUALITY_MANAGER)); - sendEmail(adminUsers.stream().map(AdminUser::getEmail).collect(Collectors.toSet()), subject, content); + + List sendMsgConfigAdminUserList = getSendMsgConfigAdminUserForEmail(); + emailService.sendEmailForAdminUser(adminUsers, sendMsgConfigAdminUserList, subject, content); } catch (Exception ex) { log.error("邮件发送失败", ex); } } - private void sendEmail(Set emails, String subject, String content) throws MessagingException { - if (CollectionUtil.isNotEmpty(emails)) { - for (String email : emails) { - emailService.sendEmail(email, subject, content); - } - } - } - private String toTimeString(LocalDateTime time) { // return time.atZone(ZoneOffset.UTC) // .withZoneSameInstant(ZoneId.of(zone)) diff --git a/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/event/TicketReopenEvent.java b/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/event/TicketReopenEvent.java index 262c377f..b40a2794 100644 --- a/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/event/TicketReopenEvent.java +++ b/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/event/TicketReopenEvent.java @@ -1,51 +1,75 @@ package com.nflg.mobilebroken.cfs.event; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DatePattern; import cn.hutool.core.util.StrUtil; -import com.nflg.mobilebroken.common.constant.MessageSubType; -import com.nflg.mobilebroken.common.constant.MessageType; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; +import com.nflg.mobilebroken.common.constant.*; import com.nflg.mobilebroken.common.pojo.dto.TicketDTO; import com.nflg.mobilebroken.repository.entity.AdminMessage; import com.nflg.mobilebroken.repository.entity.AdminUser; +import com.nflg.mobilebroken.repository.entity.AppUser; import com.nflg.mobilebroken.repository.service.IAdminMessageService; import com.nflg.mobilebroken.repository.service.IAdminUserService; +import com.nflg.mobilebroken.repository.service.IAppUserService; +import com.nflg.mobilebroken.repository.service.IDictionaryItemTranslateService; +import com.nflg.mobilebroken.starter.event.AbsTicketEvent; +import com.nflg.mobilebroken.starter.service.EmailService; import lombok.extern.slf4j.Slf4j; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.ApplicationEvent; +import javax.mail.MessagingException; import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; @Slf4j -public class TicketReopenEvent extends ApplicationEvent implements ApplicationContextAware { +public class TicketReopenEvent extends AbsTicketEvent implements ApplicationContextAware { private final TicketDTO ticket; private IAdminUserService adminUserService; private IAdminMessageService adminMessageService; + private IDictionaryItemTranslateService dictionaryItemTranslateService; + private IAppUserService appUserService; + private EmailService emailService; + private static final DateTimeFormatter FORMATTER= DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN); public TicketReopenEvent(Object source, TicketDTO ticket, String language, String zone) { super(source); this.ticket = ticket; + SendMsgConfigDataTypeEnum dataTypeEnum = Constant.TICKET_TYPE_MOBILE_BROKEN.equals(ticket.getType()) ? SendMsgConfigDataTypeEnum.MOBILE_BROKEN_TICKET : SendMsgConfigDataTypeEnum.GONGFU_TICKET; + initSendMsgConfigAdminUserMap(dataTypeEnum, SendMsgConfigRemindTypeEnum.TITLE_TICKET_REOPEN); } @Override public void setApplicationContext(ApplicationContext applicationContext) { this.adminUserService = applicationContext.getBean(IAdminUserService.class); this.adminMessageService = applicationContext.getBean(IAdminMessageService.class); + this.dictionaryItemTranslateService = applicationContext.getBean(IDictionaryItemTranslateService.class); + this.appUserService = applicationContext.getBean(IAppUserService.class); + this.emailService = applicationContext.getBean(EmailService.class); } public void send() { - sendUserMessage(); + List userIds = StrUtil.split(ticket.getHandle(), ",").stream().map(Integer::parseInt).collect(Collectors.toList()); + sendUserMessage(userIds); + sendEmail(userIds); } - private void sendUserMessage() { + private void sendUserMessage(List userIds) { //处理人 - List userIds = StrUtil.split(ticket.getHandle(), ",").stream().map(Integer::parseInt).collect(Collectors.toList()); - List adminUsers = adminUserService.listByIds(userIds); - if (CollectionUtil.isNotEmpty(adminUsers)) { - adminUsers.forEach(c -> adminMessageService.add( + + Set adminUserSet = Sets.newHashSet(); + adminUserSet.addAll(adminUserService.listByIds(userIds)); + adminUserSet.addAll(getSendMsgConfigAdminUserForInSiteMsg()); + + if (CollectionUtil.isNotEmpty(adminUserSet)) { + adminUserSet.forEach(c -> adminMessageService.add( new AdminMessage() .setNo(ticket.getNo()) .setTitle(ticket.getTitle()) @@ -59,4 +83,31 @@ public class TicketReopenEvent extends ApplicationEvent implements ApplicationCo )); } } + + private void sendEmail(List userIds){ + try { + List adminUsers = CollectionUtil.defaultIfEmpty(adminUserService.listByIds(userIds), Lists.newArrayList()); + + List configAdminUsers = getSendMsgConfigAdminUserForEmail(); + + if (CollectionUtil.isNotEmpty(adminUsers) || CollectionUtil.isNotEmpty(configAdminUsers)) { + AppUser appUser=appUserService.getById(ticket.getUserId()); + String subject = dictionaryItemTranslateService.getValueByCode( + Constant.DICTIONARY_EMAIL_NOTIFY, + Constant.TICKET_TYPE_MOBILE_BROKEN.equals(ticket.getType()) ? Constant.DICTIONARY_ITEM_EMAIL_TITLE_TICKET_REOPEN : Constant.DICTIONARY_ITEM_EMAIL_TITLE_TICKET_REOPEN_GONGFU, + Constant.DEFAULT_LANGUAGE_CODE + ); + String content = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_CONTENT_TICKET_NOTIFY, Constant.DEFAULT_LANGUAGE_CODE) + .replace("${no}", ticket.getNo()) + .replace("${title}", ticket.getTitle()) + .replace("${createUser}", appUser.getName()) + .replace("${handleUser}", StrUtil.join(",",adminUsers.stream().map(AdminUser::getUserName).collect(Collectors.toList()))) + .replace("${createTime}", ticket.getCreateTime().format(FORMATTER)) + .replace("${msg}", subject); + emailService.sendEmailForAdminUser(adminUsers, configAdminUsers, subject, content); + } + }catch(Exception ex){ + log.error("邮件发送失败", ex); + } + } } diff --git a/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/event/TicketReplyEvent.java b/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/event/TicketReplyEvent.java index 8f67a304..d38bc2b5 100644 --- a/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/event/TicketReplyEvent.java +++ b/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/event/TicketReplyEvent.java @@ -3,9 +3,9 @@ package com.nflg.mobilebroken.cfs.event; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DatePattern; import cn.hutool.core.util.StrUtil; -import com.nflg.mobilebroken.common.constant.Constant; -import com.nflg.mobilebroken.common.constant.MessageSubType; -import com.nflg.mobilebroken.common.constant.MessageType; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; +import com.nflg.mobilebroken.common.constant.*; import com.nflg.mobilebroken.common.pojo.dto.TicketDTO; import com.nflg.mobilebroken.repository.entity.AdminMessage; import com.nflg.mobilebroken.repository.entity.AdminUser; @@ -14,6 +14,7 @@ import com.nflg.mobilebroken.repository.service.IAdminMessageService; import com.nflg.mobilebroken.repository.service.IAdminUserService; import com.nflg.mobilebroken.repository.service.IAppUserService; import com.nflg.mobilebroken.repository.service.IDictionaryItemTranslateService; +import com.nflg.mobilebroken.starter.event.AbsTicketEvent; import com.nflg.mobilebroken.starter.service.EmailService; import lombok.extern.slf4j.Slf4j; import org.springframework.context.ApplicationContext; @@ -26,10 +27,11 @@ import java.time.ZoneId; import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; @Slf4j -public class TicketReplyEvent extends ApplicationEvent implements ApplicationContextAware { +public class TicketReplyEvent extends AbsTicketEvent implements ApplicationContextAware { private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN); private final TicketDTO ticket; @@ -46,6 +48,8 @@ public class TicketReplyEvent extends ApplicationEvent implements ApplicationCon this.ticket = ticket; this.language = language; this.zone = zone; + SendMsgConfigDataTypeEnum dataTypeEnum = Constant.TICKET_TYPE_MOBILE_BROKEN.equals(ticket.getType()) ? SendMsgConfigDataTypeEnum.MOBILE_BROKEN_TICKET : SendMsgConfigDataTypeEnum.GONGFU_TICKET; + initSendMsgConfigAdminUserMap(dataTypeEnum, SendMsgConfigRemindTypeEnum.TITLE_TICKET_REPLY); } @Override @@ -59,38 +63,48 @@ public class TicketReplyEvent extends ApplicationEvent implements ApplicationCon public void send() { sendUserMessage(); -// sendEmail(); + sendEmail(); } private void sendUserMessage() { //我的待办 + Set adminUserSet = Sets.newHashSet(); + if (StrUtil.isNotBlank(ticket.getHandle())) { List userIds = StrUtil.split(ticket.getHandle(), ",").stream().map(Integer::parseInt).collect(Collectors.toList()); - List adminUsers = adminUserService.listByIds(userIds); - if (CollectionUtil.isNotEmpty(adminUsers)) { - adminUsers.forEach(c -> adminMessageService.add( - new AdminMessage() - .setNo(ticket.getNo()) - .setTitle(ticket.getTitle()) - .setUserId(c.getId()) - .setSourceId(ticket.getId()) - .setSource(ticket.getType() == 0 ? 0 : 3) - .setType(MessageType.WorkOrderAssignment.getState()) - .setSubType(MessageSubType.TicketNewMessage.getState()) - .setIsRead(false) - .setCreateTime(LocalDateTime.now())) - ); - } + adminUserSet.addAll(adminUserService.listByIds(userIds)); + } + adminUserSet.addAll(getSendMsgConfigAdminUserForInSiteMsg()); + if (CollectionUtil.isNotEmpty(adminUserSet)) { + adminUserSet.forEach(c -> adminMessageService.add( + new AdminMessage() + .setNo(ticket.getNo()) + .setTitle(ticket.getTitle()) + .setUserId(c.getId()) + .setSourceId(ticket.getId()) + .setSource(ticket.getType() == 0 ? 0 : 3) + .setType(MessageType.WorkOrderAssignment.getState()) + .setSubType(MessageSubType.TicketNewMessage.getState()) + .setIsRead(false) + .setCreateTime(LocalDateTime.now())) + ); } } private void sendEmail() { try { List userIds = StrUtil.split(ticket.getHandle(), ",").stream().map(Integer::parseInt).collect(Collectors.toList()); - List adminUsers = adminUserService.listByIds(userIds); - if (CollectionUtil.isNotEmpty(adminUsers)) { + List adminUsers = CollectionUtil.defaultIfEmpty(adminUserService.listByIds(userIds), Lists.newArrayList()); + + List configAdminUsers = getSendMsgConfigAdminUserForEmail(); + + if (CollectionUtil.isNotEmpty(adminUsers) || CollectionUtil.isNotEmpty(configAdminUsers)) { AppUser appUser = appUserService.getById(ticket.getUserId()); - String subject = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_TITLE_TICKET_REPLY, language); + String subject = dictionaryItemTranslateService.getValueByCode( + Constant.DICTIONARY_EMAIL_NOTIFY, + Constant.TICKET_TYPE_MOBILE_BROKEN.equals(ticket.getType()) ? Constant.DICTIONARY_ITEM_EMAIL_TITLE_TICKET_REPLY : Constant.DICTIONARY_ITEM_EMAIL_TITLE_TICKET_REPLY_GONGFU, + language + ); String content = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_CONTENT_TICKET_NOTIFY, language) .replace("${no}", ticket.getNo()) .replace("${title}", ticket.getTitle()) @@ -99,21 +113,13 @@ public class TicketReplyEvent extends ApplicationEvent implements ApplicationCon .replace("${createTime}", toTimeString(ticket.getCreateTime())) .replace("${msg}", subject); //发送给处理人 - sendEmail(adminUsers, subject, content); + emailService.sendEmailForAdminUser(adminUsers, configAdminUsers, subject, content); } } catch (Exception ex) { log.error("邮件发送失败", ex); } } - private void sendEmail(List adminUsers, String subject, String content) throws MessagingException { - if (CollectionUtil.isNotEmpty(adminUsers)) { - for (AdminUser adminUser : adminUsers) { - emailService.sendEmail(adminUser.getEmail(), subject, content); - } - } - } - private String toTimeString(LocalDateTime time) { return time.atZone(ZoneOffset.UTC) .withZoneSameInstant(ZoneId.of(zone)) diff --git a/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/listener/TicketEventListener.java b/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/listener/TicketEventListener.java index 155755f2..2c6304d7 100644 --- a/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/listener/TicketEventListener.java +++ b/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/listener/TicketEventListener.java @@ -51,4 +51,10 @@ public class TicketEventListener { public void handleTicketCallEndEvent(TicketCallEndEvent event) throws IOException, InterruptedException { event.send(); } + + @Async + @EventListener + public void handleTicketReopenEvent(TicketReopenEvent event) { + event.send(); + } } 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 953f8750..1ba52923 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 @@ -70,6 +70,20 @@ public class Constant { public static final String DICTIONARY_ITEM_EMAIL_CONTENT_ACCOUNT_ACTIVATION_NOTIFY="AccountActivation"; + public static final String DICTIONARY_ITEM_EMAIL_TITLE_TICKET_CLOSE="TitleTicketClose"; + + public static final String DICTIONARY_ITEM_EMAIL_TITLE_TICKET_REOPEN="TitleTicketReopen"; + + public static final String DICTIONARY_ITEM_EMAIL_TITLE_TICKET_CREATE_GONGFU="TitleTicketCreateGongfu"; + public static final String DICTIONARY_ITEM_EMAIL_TITLE_TICKET_ASSIGNED_GONGFU="TitleTicketAssignedGongfu"; + public static final String DICTIONARY_ITEM_EMAIL_TITLE_TICKET_REPLY_GONGFU="TitleTicketReplyGongfu"; + public static final String DICTIONARY_ITEM_EMAIL_TITLE_TICKET_TIMEOUT_GONGFU="TitleTicketTimeoutGongfu"; + public static final String DICTIONARY_ITEM_EMAIL_TITLE_TICKET_COMPLETE_GONGFU="TitleTicketCompleteGongfu"; + public static final String DICTIONARY_ITEM_EMAIL_TITLE_TICKET_REOPEN_GONGFU="TitleTicketReopenGongfu"; + public static final String DICTIONARY_ITEM_EMAIL_TITLE_TICKET_CLOSE_GONGFU="TitleTicketCloseGongfu"; + + + /** * 事业部部长 */ @@ -145,4 +159,8 @@ public class Constant { public static final String MOBILE_BROKEN = "移动破碎"; public static final String DICTIONARY_TICKET_QUESTION = "Question"; + + public static final Integer TICKET_TYPE_MOBILE_BROKEN = 0; + public static final Integer TICKET_TYPE_GONGFU = 1; + } diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/constant/SendMsgConfigDataTypeEnum.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/constant/SendMsgConfigDataTypeEnum.java new file mode 100644 index 00000000..7d48bedb --- /dev/null +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/constant/SendMsgConfigDataTypeEnum.java @@ -0,0 +1,33 @@ +package com.nflg.mobilebroken.common.constant; + +public enum SendMsgConfigDataTypeEnum { + + MOBILE_BROKEN_TICKET("mobileBrokenTicket", "移动破工单"), + GONGFU_TICKET("gongfuTicket", "工服工单"); + + private final String dataType; + private final String desc; + + SendMsgConfigDataTypeEnum(String dataType, String desc) { + this.dataType = dataType; + this.desc = desc; + } + + public String getDataType() { + return dataType; + } + + public String getDesc() { + return desc; + } + + public static String getDescByDataType(String dataType) { + for (SendMsgConfigDataTypeEnum enumItem : values()) { + if (enumItem.getDataType().equals(dataType)) { + return enumItem.getDesc(); + } + } + return null; + } + +} diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/constant/SendMsgConfigRemindTypeEnum.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/constant/SendMsgConfigRemindTypeEnum.java new file mode 100644 index 00000000..09d8bbeb --- /dev/null +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/constant/SendMsgConfigRemindTypeEnum.java @@ -0,0 +1,37 @@ +package com.nflg.mobilebroken.common.constant; + +public enum SendMsgConfigRemindTypeEnum { + + TITLE_TICKET_CREATE("TitleTicketCreate", "工单新建"), + TITLE_TICKET_ASSIGNED("TitleTicketAssigned", "工单分派"), + TITLE_TICKET_REPLY("TitleTicketReply", "工单新回复"), + TITLE_TICKET_TIMEOUT("TitleTicketTimeout", "工单超时"), + TITLE_TICKET_COMPLETE("TitleTicketComplete", "工单完成"), + TITLE_TICKET_REOPEN("TitleTicketReopen", "工单重启"), + TITLE_TICKET_CLOSE("TitleTicketClose", "工单关闭"); + + private final String remindType; + private final String desc; + + SendMsgConfigRemindTypeEnum(String remindType, String desc) { + this.remindType = remindType; + this.desc = desc; + } + + public String getRemindType() { + return remindType; + } + + public String getDesc() { + return desc; + } + + public static String getDescByRemindType(String remindType) { + for (SendMsgConfigRemindTypeEnum enumItem : values()) { + if (enumItem.getRemindType().equals(remindType)) { + return enumItem.getDesc(); + } + } + return null; + } +} diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/constant/SendMsgConfigUserReceiverTypeEnum.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/constant/SendMsgConfigUserReceiverTypeEnum.java new file mode 100644 index 00000000..ef989749 --- /dev/null +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/constant/SendMsgConfigUserReceiverTypeEnum.java @@ -0,0 +1,41 @@ +package com.nflg.mobilebroken.common.constant; + +public enum SendMsgConfigUserReceiverTypeEnum { + + IN_SITE_MSG("in_site_msg", "站内信"), + EMAIL("email", "邮件"); + + private final String receiverType; + private final String desc; + + SendMsgConfigUserReceiverTypeEnum(String receiverType, String desc) { + this.receiverType = receiverType; + this.desc = desc; + } + + public String getReceiverType() { + return receiverType; + } + + public String getDesc() { + return desc; + } + + public static String getDescByReceiverType(String receiverType) { + for (SendMsgConfigUserReceiverTypeEnum enumItem : values()) { + if (enumItem.getReceiverType().equals(receiverType)) { + return enumItem.getDesc(); + } + } + return null; + } + + public static SendMsgConfigUserReceiverTypeEnum getEnumByReceiverType(String receiverType) { + for (SendMsgConfigUserReceiverTypeEnum enumItem : values()) { + if (enumItem.getReceiverType().equals(receiverType)) { + return enumItem; + } + } + return null; + } +} diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/constant/SendMsgConfigUserTypeEnum.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/constant/SendMsgConfigUserTypeEnum.java new file mode 100644 index 00000000..a3f5b5d6 --- /dev/null +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/constant/SendMsgConfigUserTypeEnum.java @@ -0,0 +1,31 @@ +package com.nflg.mobilebroken.common.constant; + +public enum SendMsgConfigUserTypeEnum { + ADMIN("admin", "内部账号"), + APP("app", "代理商账号"); + + private final String userType; + private final String desc; + + SendMsgConfigUserTypeEnum(String userType, String desc) { + this.userType = userType; + this.desc = desc; + } + + public String getUserType() { + return userType; + } + + public String getDesc() { + return desc; + } + + public static String getDescByUserType(String userType) { + for (SendMsgConfigUserTypeEnum enumItem : values()) { + if (enumItem.getUserType().equals(userType)) { + return enumItem.getDesc(); + } + } + return null; + } +} \ No newline at end of file diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/SendMsgConfigAddRequest.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/SendMsgConfigAddRequest.java new file mode 100644 index 00000000..a168dc4e --- /dev/null +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/SendMsgConfigAddRequest.java @@ -0,0 +1,15 @@ +package com.nflg.mobilebroken.common.pojo.request; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotEmpty; + +@EqualsAndHashCode(callSuper = false) +@Data +public class SendMsgConfigAddRequest { + @NotEmpty(message = "数据类型不能为空") + private String dataType; + @NotEmpty(message = "提醒类型不能为空") + private String remindType; +} diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/SendMsgConfigGetPageRequest.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/SendMsgConfigGetPageRequest.java new file mode 100644 index 00000000..f9f6ef32 --- /dev/null +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/SendMsgConfigGetPageRequest.java @@ -0,0 +1,12 @@ +package com.nflg.mobilebroken.common.pojo.request; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = false) +@Data +public class SendMsgConfigGetPageRequest extends PageRequest { + + private String dataType; + private String remindType; +} diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/SendMsgConfigUpdateRequest.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/SendMsgConfigUpdateRequest.java new file mode 100644 index 00000000..efa734ae --- /dev/null +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/SendMsgConfigUpdateRequest.java @@ -0,0 +1,18 @@ +package com.nflg.mobilebroken.common.pojo.request; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +@EqualsAndHashCode(callSuper = false) +@Data +public class SendMsgConfigUpdateRequest { + @NotNull(message = "id不能为空") + private Long id; + @NotEmpty(message = "数据类型不能为空") + private String dataType; + @NotEmpty(message = "提醒类型不能为空") + private String remindType; +} diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/SendMsgConfigUserAddRequest.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/SendMsgConfigUserAddRequest.java new file mode 100644 index 00000000..6c63752c --- /dev/null +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/SendMsgConfigUserAddRequest.java @@ -0,0 +1,22 @@ +package com.nflg.mobilebroken.common.pojo.request; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; +import java.util.TreeSet; + +@EqualsAndHashCode(callSuper = false) +@Data +public class SendMsgConfigUserAddRequest { + @NotNull(message = "发信配置ID不能为空") + private Integer sendMsgConfigId; + @NotNull(message = "用户类型不能为空") + private String userType; + @NotNull(message = "接收人ID不能为空") + private Integer receiverId; + @NotEmpty(message = "接收人类型不能为空") + private List receiverTypes; +} diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/SendMsgConfigUserGetListRequest.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/SendMsgConfigUserGetListRequest.java new file mode 100644 index 00000000..b1a83e9b --- /dev/null +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/SendMsgConfigUserGetListRequest.java @@ -0,0 +1,10 @@ +package com.nflg.mobilebroken.common.pojo.request; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = false) +@Data +public class SendMsgConfigUserGetListRequest { + private Long sendMsgConfigId; +} diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/SendMsgConfigUserUpdateRequest.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/SendMsgConfigUserUpdateRequest.java new file mode 100644 index 00000000..9d998b94 --- /dev/null +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/SendMsgConfigUserUpdateRequest.java @@ -0,0 +1,25 @@ +package com.nflg.mobilebroken.common.pojo.request; + +import cn.hutool.core.lang.tree.Tree; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; +import java.util.TreeSet; + +@EqualsAndHashCode(callSuper = false) +@Data +public class SendMsgConfigUserUpdateRequest { + @NotNull(message = "ID不能为空") + private Long id; + @NotNull(message = "发信配置ID不能为空") + private Integer sendMsgConfigId; + @NotNull(message = "用户类型不能为空") + private String userType; + @NotNull(message = "接收人ID不能为空") + private Integer receiverId; + @NotEmpty(message = "接收人类型不能为空") + private List receiverTypes; +} diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/SendMsgConfigGetPageVO.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/SendMsgConfigGetPageVO.java new file mode 100644 index 00000000..3354774e --- /dev/null +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/SendMsgConfigGetPageVO.java @@ -0,0 +1,30 @@ +package com.nflg.mobilebroken.common.pojo.vo; + +import com.nflg.mobilebroken.common.constant.Constant; +import com.nflg.mobilebroken.common.constant.SendMsgConfigDataTypeEnum; +import com.nflg.mobilebroken.common.constant.SendMsgConfigRemindTypeEnum; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class SendMsgConfigGetPageVO { + + private Long id; + private String dataType; + private String dataTypeDesc; + private String remindType; + private String remindTypeDesc; + private String createByUserName; + private LocalDateTime createTime; + private String updateByUserName; + private LocalDateTime updateTime; + + public String getDataTypeDesc() { + return SendMsgConfigDataTypeEnum.getDescByDataType(dataType); + } + + public String getRemindTypeDesc() { + return SendMsgConfigRemindTypeEnum.getDescByRemindType(remindType); + } +} diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/SendMsgConfigUserGetListVO.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/SendMsgConfigUserGetListVO.java new file mode 100644 index 00000000..0b3a009c --- /dev/null +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/SendMsgConfigUserGetListVO.java @@ -0,0 +1,36 @@ +package com.nflg.mobilebroken.common.pojo.vo; + +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.nflg.mobilebroken.common.constant.SendMsgConfigUserReceiverTypeEnum; +import com.nflg.mobilebroken.common.constant.SendMsgConfigUserTypeEnum; +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +@Data +public class SendMsgConfigUserGetListVO { + private Long id; + private String userType; + private String userTypeDesc; + private Integer receiverId; + private String receiverUserName; + private String receiverTypes; + private String receiverTypesDesc; + + public String getUserTypeDesc() { + return SendMsgConfigUserTypeEnum.getDescByUserType(userType); + } + + public String getReceiverTypesDesc() { + if (StringUtils.isBlank(receiverTypes)) { + return ""; + } + String[] types = receiverTypes.split(","); + List receiverTypesDescList = new ArrayList<>(); + for (String type : types) { + receiverTypesDescList.add(SendMsgConfigUserReceiverTypeEnum.getDescByReceiverType(type)); + } + return String.join(",", receiverTypesDescList); + } +} diff --git a/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/event/TicketAssignedEvent.java b/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/event/TicketAssignedEvent.java index 563cb01d..7e4aa484 100644 --- a/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/event/TicketAssignedEvent.java +++ b/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/event/TicketAssignedEvent.java @@ -3,9 +3,10 @@ package com.nflg.mobilebroken.gongfu.event; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DatePattern; import cn.hutool.core.util.StrUtil; -import com.nflg.mobilebroken.common.constant.Constant; -import com.nflg.mobilebroken.common.constant.MessageSubType; -import com.nflg.mobilebroken.common.constant.MessageType; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; +import com.nflg.mobilebroken.common.constant.*; +import com.nflg.mobilebroken.starter.event.AbsTicketEvent; import com.nflg.mobilebroken.repository.entity.AdminMessage; import com.nflg.mobilebroken.repository.entity.AdminUser; import com.nflg.mobilebroken.repository.entity.AppUser; @@ -18,16 +19,16 @@ import com.nflg.mobilebroken.starter.service.EmailService; import lombok.extern.slf4j.Slf4j; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; -import org.springframework.context.ApplicationEvent; import javax.mail.MessagingException; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; @Slf4j -public class TicketAssignedEvent extends ApplicationEvent implements ApplicationContextAware { +public class TicketAssignedEvent extends AbsTicketEvent implements ApplicationContextAware { private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN); private final GongfuTicket ticket; @@ -42,6 +43,7 @@ public class TicketAssignedEvent extends ApplicationEvent implements Application super(source); this.ticket = ticket; this.userIds = userIds; + initSendMsgConfigAdminUserMap(SendMsgConfigDataTypeEnum.GONGFU_TICKET, SendMsgConfigRemindTypeEnum.TITLE_TICKET_ASSIGNED); } @Override @@ -60,9 +62,12 @@ public class TicketAssignedEvent extends ApplicationEvent implements Application private void sendUserMessage() { //我的待办 - List adminUsers = adminUserService.listByIds(userIds); - if (CollectionUtil.isNotEmpty(adminUsers)) { - adminUsers.forEach(c -> adminMessageService.add( + Set adminUserSet = Sets.newHashSet(); + adminUserSet.addAll(adminUserService.listByIds(userIds)); + adminUserSet.addAll(getSendMsgConfigAdminUserForInSiteMsg()); + + if (CollectionUtil.isNotEmpty(adminUserSet)) { + adminUserSet.forEach(c -> adminMessageService.add( new AdminMessage() .setNo(ticket.getNo()) .setTitle(ticket.getTitle()) @@ -79,10 +84,13 @@ public class TicketAssignedEvent extends ApplicationEvent implements Application private void sendEmail() { try { - List adminUsers = adminUserService.listByIds(userIds); - if (CollectionUtil.isNotEmpty(adminUsers)) { + List adminUsers = CollectionUtil.defaultIfEmpty(adminUserService.listByIds(userIds), Lists.newArrayList()); + + List configAdminUsers = getSendMsgConfigAdminUserForEmail(); + + if (CollectionUtil.isNotEmpty(adminUsers) && CollectionUtil.isNotEmpty(configAdminUsers)) { AppUser appUser = appUserService.getById(ticket.getUserId()); - String subject = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_TITLE_TICKET_ASSIGNED, Constant.DEFAULT_LANGUAGE_CODE); + String subject = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_TITLE_TICKET_ASSIGNED_GONGFU, Constant.DEFAULT_LANGUAGE_CODE); String content = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_CONTENT_TICKET_NOTIFY, Constant.DEFAULT_LANGUAGE_CODE) .replace("${no}", ticket.getNo()) .replace("${title}", ticket.getTitle()) @@ -90,18 +98,10 @@ public class TicketAssignedEvent extends ApplicationEvent implements Application .replace("${handleUser}", StrUtil.join(",", adminUsers.stream().map(AdminUser::getUserName).collect(Collectors.toList()))) .replace("${createTime}", ticket.getCreateTime().format(FORMATTER)) .replace("${msg}", subject); - sendEmail(adminUsers, subject, content); + emailService.sendEmailForAdminUser(adminUsers, configAdminUsers, subject, content); } } catch (Exception ex) { log.error("邮件发送失败", ex); } } - - private void sendEmail(List adminUsers, String subject, String content) throws MessagingException { - if (CollectionUtil.isNotEmpty(adminUsers)) { - for (AdminUser adminUser : adminUsers) { - emailService.sendEmail(adminUser.getEmail(), subject, content); - } - } - } } diff --git a/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/event/TicketCloseEvent.java b/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/event/TicketCloseEvent.java index f616c8e1..a1a04c5b 100644 --- a/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/event/TicketCloseEvent.java +++ b/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/event/TicketCloseEvent.java @@ -3,52 +3,71 @@ package com.nflg.mobilebroken.gongfu.event; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DatePattern; import cn.hutool.core.util.StrUtil; -import com.nflg.mobilebroken.common.constant.MessageSubType; -import com.nflg.mobilebroken.common.constant.MessageType; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; +import com.nflg.mobilebroken.common.constant.*; import com.nflg.mobilebroken.repository.entity.AdminMessage; import com.nflg.mobilebroken.repository.entity.AdminUser; +import com.nflg.mobilebroken.repository.entity.AppUser; import com.nflg.mobilebroken.repository.entity.GongfuTicket; import com.nflg.mobilebroken.repository.service.IAdminMessageService; import com.nflg.mobilebroken.repository.service.IAdminUserService; +import com.nflg.mobilebroken.repository.service.IAppUserService; +import com.nflg.mobilebroken.repository.service.IDictionaryItemTranslateService; +import com.nflg.mobilebroken.starter.event.AbsTicketEvent; +import com.nflg.mobilebroken.starter.service.EmailService; import lombok.extern.slf4j.Slf4j; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.ApplicationEvent; +import javax.mail.MessagingException; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; @Slf4j -public class TicketCloseEvent extends ApplicationEvent implements ApplicationContextAware { +public class TicketCloseEvent extends AbsTicketEvent implements ApplicationContextAware { private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN); private final GongfuTicket ticket; private IAdminUserService adminUserService; private IAdminMessageService adminMessageService; + private IDictionaryItemTranslateService dictionaryItemTranslateService; + private IAppUserService appUserService; + private EmailService emailService; public TicketCloseEvent(Object source, GongfuTicket ticket) { super(source); this.ticket = ticket; + initSendMsgConfigAdminUserMap(SendMsgConfigDataTypeEnum.GONGFU_TICKET, SendMsgConfigRemindTypeEnum.TITLE_TICKET_CLOSE); } @Override public void setApplicationContext(ApplicationContext applicationContext) { this.adminUserService = applicationContext.getBean(IAdminUserService.class); this.adminMessageService = applicationContext.getBean(IAdminMessageService.class); + this.dictionaryItemTranslateService = applicationContext.getBean(IDictionaryItemTranslateService.class); + this.appUserService = applicationContext.getBean(IAppUserService.class); + this.emailService = applicationContext.getBean(EmailService.class); } public void send() { - sendUserMessage(); + List userIds = StrUtil.split(ticket.getHandle(), ",").stream().map(Integer::parseInt).collect(Collectors.toList()); + sendUserMessage(userIds); + sendEmail(userIds); } - private void sendUserMessage() { + private void sendUserMessage(List userIds) { //我的待办 - List userIds = StrUtil.split(ticket.getHandle(), ",").stream().map(Integer::parseInt).collect(Collectors.toList()); - List adminUsers = adminUserService.listByIds(userIds); - if (CollectionUtil.isNotEmpty(adminUsers)) { - adminUsers.forEach(c -> adminMessageService.add( + Set adminUserSet = Sets.newHashSet(); + adminUserSet.addAll(adminUserService.listByIds(userIds)); + adminUserSet.addAll(getSendMsgConfigAdminUserForInSiteMsg()); + + if (CollectionUtil.isNotEmpty(adminUserSet)) { + adminUserSet.forEach(c -> adminMessageService.add( new AdminMessage() .setNo(ticket.getNo()) .setTitle(ticket.getTitle()) @@ -62,4 +81,26 @@ public class TicketCloseEvent extends ApplicationEvent implements ApplicationCon ); } } + + private void sendEmail(List userIds){ + try { + List adminUsers = CollectionUtil.defaultIfEmpty(adminUserService.listByIds(userIds), Lists.newArrayList()); + + List configAdminUsers = getSendMsgConfigAdminUserForEmail(); + if (CollectionUtil.isNotEmpty(adminUsers) || CollectionUtil.isNotEmpty(configAdminUsers)) { + AppUser appUser=appUserService.getById(ticket.getUserId()); + String subject = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_TITLE_TICKET_CLOSE_GONGFU, Constant.DEFAULT_LANGUAGE_CODE); + String content = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_CONTENT_TICKET_NOTIFY, Constant.DEFAULT_LANGUAGE_CODE) + .replace("${no}", ticket.getNo()) + .replace("${title}", ticket.getTitle()) + .replace("${createUser}", appUser.getName()) + .replace("${handleUser}", StrUtil.join(",",adminUsers.stream().map(AdminUser::getUserName).collect(Collectors.toList()))) + .replace("${createTime}", ticket.getCreateTime().format(FORMATTER)) + .replace("${msg}", subject); + emailService.sendEmailForAdminUser(adminUsers, configAdminUsers, subject, content); + } + }catch(Exception ex){ + log.error("邮件发送失败", ex); + } + } } diff --git a/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/event/TicketCompleteEvent.java b/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/event/TicketCompleteEvent.java index 0f788ae0..11e4b141 100644 --- a/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/event/TicketCompleteEvent.java +++ b/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/event/TicketCompleteEvent.java @@ -3,13 +3,14 @@ package com.nflg.mobilebroken.gongfu.event; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DatePattern; import cn.hutool.core.util.StrUtil; -import com.nflg.mobilebroken.common.constant.Constant; -import com.nflg.mobilebroken.common.constant.MessageSubType; -import com.nflg.mobilebroken.common.constant.MessageType; +import com.google.common.collect.Sets; +import com.nflg.mobilebroken.common.constant.*; import com.nflg.mobilebroken.repository.entity.*; import com.nflg.mobilebroken.repository.service.*; +import com.nflg.mobilebroken.starter.event.AbsTicketEvent; import com.nflg.mobilebroken.starter.service.EmailService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.compress.utils.Lists; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.ApplicationEvent; @@ -18,10 +19,11 @@ import javax.mail.MessagingException; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; @Slf4j -public class TicketCompleteEvent extends ApplicationEvent implements ApplicationContextAware { +public class TicketCompleteEvent extends AbsTicketEvent implements ApplicationContextAware { private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN); private final GongfuTicket ticket; @@ -36,6 +38,7 @@ public class TicketCompleteEvent extends ApplicationEvent implements Application public TicketCompleteEvent(Object source, GongfuTicket ticket) { super(source); this.ticket = ticket; + initSendMsgConfigAdminUserMap(SendMsgConfigDataTypeEnum.GONGFU_TICKET, SendMsgConfigRemindTypeEnum.TITLE_TICKET_COMPLETE); } @Override @@ -64,63 +67,57 @@ public class TicketCompleteEvent extends ApplicationEvent implements Application .setIsRead(false) .setCreateTime(LocalDateTime.now())); //我的待办 + Set adminUserSet = Sets.newHashSet(); //CQM List cqms = deviceTypeService.getCqms(ticket.getDeviceNo()); if (CollectionUtil.isEmpty(cqms)) { log.warn("该设备尚未设置CQM负责人:{}", ticket.getDeviceNo()); } else { - List cqmUsers = adminUserService.listByIds(cqms); - if (CollectionUtil.isNotEmpty(cqmUsers)) { - cqmUsers.forEach(c -> adminMessageService.add( - new AdminMessage() - .setNo(ticket.getNo()) - .setTitle(ticket.getTitle()) - .setUserId(c.getId()) - .setSourceId(ticket.getId()) - .setSource(3) - .setType(MessageType.WorkOrderAssignment.getState()) - .setSubType(MessageSubType.TicketSolutionAudit.getState()) - .setIsRead(false) - .setCreateTime(LocalDateTime.now())) - ); - } + adminUserSet.addAll(adminUserService.listByIds(cqms)); + } + adminUserSet.addAll(getSendMsgConfigAdminUserForInSiteMsg()); + + if (CollectionUtil.isNotEmpty(adminUserSet)) { + adminUserSet.forEach(c -> adminMessageService.add( + new AdminMessage() + .setNo(ticket.getNo()) + .setTitle(ticket.getTitle()) + .setUserId(c.getId()) + .setSourceId(ticket.getId()) + .setSource(3) + .setType(MessageType.WorkOrderAssignment.getState()) + .setSubType(MessageSubType.TicketSolutionAudit.getState()) + .setIsRead(false) + .setCreateTime(LocalDateTime.now())) + ); } } private void sendEmail() { try { List cqmUserIds = deviceTypeService.getCqms(ticket.getDeviceNo()); + List configAdminUsers = getSendMsgConfigAdminUserForEmail(); + + List cqmUsers = Lists.newArrayList(); if (CollectionUtil.isNotEmpty(cqmUserIds)) { - List cqmUsers = adminUserService.listByIds(cqmUserIds); - if (CollectionUtil.isNotEmpty(cqmUsers)) { - List handleUserIds = StrUtil.split(ticket.getHandle(), ",").stream().map(Integer::parseInt).collect(Collectors.toList()); - List handleUsers = adminUserService.listByIds(handleUserIds); - AppUser appUser = appUserService.getById(ticket.getUserId()); - String subject = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_TITLE_TICKET_ASSIGNED, Constant.DEFAULT_LANGUAGE_CODE); - String content = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_CONTENT_TICKET_NOTIFY, Constant.DEFAULT_LANGUAGE_CODE) - .replace("${no}", ticket.getNo()) - .replace("${title}", ticket.getTitle()) - .replace("${createUser}", appUser.getName()) - .replace("${handleUser}", StrUtil.join(",", handleUsers.stream().map(AdminUser::getUserName).collect(Collectors.toList()))) - .replace("${createTime}", ticket.getCreateTime().format(FORMATTER)) - .replace("${msg}", subject); - sendEmail(cqmUsers, subject, content); - } + cqmUsers = CollectionUtil.defaultIfEmpty(adminUserService.listByIds(cqmUserIds), Lists.newArrayList()); + } + if (CollectionUtil.isNotEmpty(cqmUsers) || CollectionUtil.isNotEmpty(configAdminUsers)) { + List handleUserIds = StrUtil.split(ticket.getHandle(), ",").stream().map(Integer::parseInt).collect(Collectors.toList()); + List handleUsers = adminUserService.listByIds(handleUserIds); + AppUser appUser = appUserService.getById(ticket.getUserId()); + String subject = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_TITLE_TICKET_COMPLETE_GONGFU, Constant.DEFAULT_LANGUAGE_CODE); + String content = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_CONTENT_TICKET_NOTIFY, Constant.DEFAULT_LANGUAGE_CODE) + .replace("${no}", ticket.getNo()) + .replace("${title}", ticket.getTitle()) + .replace("${createUser}", appUser.getName()) + .replace("${handleUser}", StrUtil.join(",", handleUsers.stream().map(AdminUser::getUserName).collect(Collectors.toList()))) + .replace("${createTime}", ticket.getCreateTime().format(FORMATTER)) + .replace("${msg}", subject); + emailService.sendEmailForAdminUser(cqmUsers, configAdminUsers, subject, content); } } catch (Exception ex) { log.error("邮件发送失败", ex); } } - - private void sendEmail(List adminUsers, String subject, String content) { - if (CollectionUtil.isNotEmpty(adminUsers)) { - for (AdminUser adminUser : adminUsers) { - try { - emailService.sendEmail(adminUser.getEmail(), subject, content); - } catch (MessagingException e) { - log.error("邮件发送失败", e); - } - } - } - } } diff --git a/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/event/TicketReplyEvent.java b/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/event/TicketReplyEvent.java index 9251b02a..d1fe8f35 100644 --- a/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/event/TicketReplyEvent.java +++ b/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/event/TicketReplyEvent.java @@ -3,12 +3,14 @@ package com.nflg.mobilebroken.gongfu.event; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DatePattern; import cn.hutool.core.util.StrUtil; -import com.nflg.mobilebroken.common.constant.Constant; -import com.nflg.mobilebroken.common.constant.MessageSubType; +import com.google.common.collect.Sets; +import com.nflg.mobilebroken.common.constant.*; import com.nflg.mobilebroken.repository.entity.*; import com.nflg.mobilebroken.repository.service.*; +import com.nflg.mobilebroken.starter.event.AbsTicketEvent; import com.nflg.mobilebroken.starter.service.EmailService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.compress.utils.Lists; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.ApplicationEvent; @@ -17,10 +19,11 @@ import javax.mail.MessagingException; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; @Slf4j -public class TicketReplyEvent extends ApplicationEvent implements ApplicationContextAware { +public class TicketReplyEvent extends AbsTicketEvent implements ApplicationContextAware { private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN); private final GongfuTicket ticket; @@ -29,10 +32,12 @@ public class TicketReplyEvent extends ApplicationEvent implements ApplicationCon private EmailService emailService; private IAdminUserService adminUserService; private IAppMessageService appMessageService; + private IAdminMessageService adminMessageService; public TicketReplyEvent(Object source, GongfuTicket ticket) { super(source); this.ticket = ticket; + initSendMsgConfigAdminUserMap(SendMsgConfigDataTypeEnum.GONGFU_TICKET, SendMsgConfigRemindTypeEnum.TITLE_TICKET_REPLY); } @Override @@ -42,11 +47,12 @@ public class TicketReplyEvent extends ApplicationEvent implements ApplicationCon this.emailService = applicationContext.getBean(EmailService.class); this.adminUserService = applicationContext.getBean(IAdminUserService.class); this.appMessageService = applicationContext.getBean(IAppMessageService.class); + this.adminMessageService = applicationContext.getBean(IAdminMessageService.class); } public void send() { sendUserMessage(); -// sendEmail(); + sendEmail(); } private void sendUserMessage() { @@ -58,15 +64,37 @@ public class TicketReplyEvent extends ApplicationEvent implements ApplicationCon .setSubType(MessageSubType.TicketNewMessage.getState()) .setIsRead(false) .setCreateTime(LocalDateTime.now())); + + //我的待办 + Set adminUserSet = Sets.newHashSet(); + adminUserSet.addAll(getSendMsgConfigAdminUserForInSiteMsg()); + + if (CollectionUtil.isNotEmpty(adminUserSet)){ + adminUserSet.forEach(c -> adminMessageService.add( + new AdminMessage() + .setNo(ticket.getNo()) + .setTitle(ticket.getTitle()) + .setUserId(c.getId()) + .setSourceId(Long.valueOf(ticket.getId())) + .setSource(3) + .setType(MessageType.WorkOrderAssignment.getState()) + .setSubType(MessageSubType.TicketNewMessage.getState()) + .setIsRead(false) + .setCreateTime(LocalDateTime.now())) + ); + } } private void sendEmail() { try { List userIds = StrUtil.split(ticket.getHandle(), ",").stream().map(Integer::parseInt).collect(Collectors.toList()); - List adminUsers = adminUserService.listByIds(userIds); - if (CollectionUtil.isNotEmpty(adminUsers)) { + List adminUsers = CollectionUtil.defaultIfEmpty(adminUserService.listByIds(userIds), Lists.newArrayList()); + + List configAdminUsers = getSendMsgConfigAdminUserForEmail(); + + if (CollectionUtil.isNotEmpty(adminUsers) || CollectionUtil.isNotEmpty(configAdminUsers)) { AppUser appUser = appUserService.getById(ticket.getUserId()); - String subject = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_TITLE_TICKET_REPLY, Constant.DEFAULT_LANGUAGE_CODE); + String subject = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_TITLE_TICKET_REPLY_GONGFU, Constant.DEFAULT_LANGUAGE_CODE); String content = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_CONTENT_TICKET_NOTIFY, Constant.DEFAULT_LANGUAGE_CODE) .replace("${no}", ticket.getNo()) .replace("${title}", ticket.getTitle()) @@ -75,14 +103,10 @@ public class TicketReplyEvent extends ApplicationEvent implements ApplicationCon .replace("${createTime}", ticket.getCreateTime().format(FORMATTER)) .replace("${msg}", subject); //发送给提交人 - sendEmail(appUser, subject, content); + emailService.sendEmailForAdminUser(Lists.newArrayList(), configAdminUsers, subject, content); } } catch (Exception ex) { log.error("邮件发送失败", ex); } } - - private void sendEmail(AppUser appUser, String subject, String content) throws MessagingException { - emailService.sendEmail(appUser.getEmail(), subject, content); - } } diff --git a/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/task/TicketScheduledTasks.java b/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/task/TicketScheduledTasks.java index db7eda26..138f53d1 100644 --- a/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/task/TicketScheduledTasks.java +++ b/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/task/TicketScheduledTasks.java @@ -4,9 +4,8 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DatePattern; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; -import com.nflg.mobilebroken.common.constant.Constant; -import com.nflg.mobilebroken.common.constant.MessageSubType; -import com.nflg.mobilebroken.common.constant.UserState; +import com.google.common.collect.Sets; +import com.nflg.mobilebroken.common.constant.*; import com.nflg.mobilebroken.common.pojo.dto.ChatMessageDTO; import com.nflg.mobilebroken.common.pojo.request.TicketEvaluateAddRequest; import com.nflg.mobilebroken.common.pojo.vo.TicketEvaluateAddVO; @@ -21,6 +20,7 @@ import com.nflg.mobilebroken.repository.entity.*; import com.nflg.mobilebroken.repository.service.*; import com.nflg.mobilebroken.starter.service.EmailService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.compress.utils.Lists; import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @@ -30,10 +30,7 @@ import javax.mail.MessagingException; import java.math.BigDecimal; import java.time.*; import java.time.format.DateTimeFormatter; -import java.util.Collections; -import java.util.List; -import java.util.Objects; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; @Component @@ -96,6 +93,9 @@ public class TicketScheduledTasks { @Resource private IGongfuDeviceTypeService deviceTypeService; + @Resource + private ISendMsgConfigService sendMsgConfigService; + /** * 工单评论邀请邮件 * 每天午夜12点执行一次 @@ -278,7 +278,12 @@ public class TicketScheduledTasks { if (CollectionUtil.isNotEmpty(followUserIds)) { adminUserIds.addAll(followUserIds); } - if (CollectionUtil.isNotEmpty(adminUserIds)) { + + Map> sendMsgConfigAdminUserMap = sendMsgConfigService.getAdminUserMapByDataTypeAndRemindType(SendMsgConfigDataTypeEnum.MOBILE_BROKEN_TICKET, SendMsgConfigRemindTypeEnum.TITLE_TICKET_TIMEOUT); + + List configEmailsAdminUsers = sendMsgConfigAdminUserMap.getOrDefault(SendMsgConfigUserReceiverTypeEnum.EMAIL, Lists.newArrayList()); + + if (CollectionUtil.isNotEmpty(adminUserIds) || CollectionUtil.isNotEmpty(configEmailsAdminUsers)) { List adminUsers = adminUserService.listByIds(adminUserIds); String subject = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_TITLE_TICKET_TIMEOUT, Constant.DEFAULT_LANGUAGE_CODE); String content = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_CONTENT_TICKET_NOTIFY, Constant.DEFAULT_LANGUAGE_CODE) @@ -289,11 +294,29 @@ public class TicketScheduledTasks { .replace("${createTime}", toTimeString(ticket.getCreateTime())) .replace("${msg}", subject); try { - sendEamilForAdminUser(adminUsers, subject, content); + sendEamilForAdminUser(adminUsers, configEmailsAdminUsers, subject, content); } catch (Exception e) { log.error("【工单超时提醒】邮件发送失败", e); } } + + // 发信管理设置的站内信接收人 + List configInSiteMsgAdminUsers = sendMsgConfigAdminUserMap.getOrDefault(SendMsgConfigUserReceiverTypeEnum.IN_SITE_MSG, Lists.newArrayList()); + if (CollectionUtil.isNotEmpty(configInSiteMsgAdminUsers)) { + configInSiteMsgAdminUsers.forEach(c -> adminMessageService.add( + new AdminMessage() + .setNo(ticket.getNo()) + .setTitle(ticket.getTitle()) + .setUserId(c.getId()) + .setSourceId(Long.valueOf(ticket.getId())) + .setSource(0) + .setType(MessageType.WorkOrderAssignment.getState()) + .setSubType(MessageSubType.TicketTimeout.getState()) + .setIsRead(false) + .setCreateTime(LocalDateTime.now())) + ); + } + //客户端关注人 Set appUserIds = ticketFollowService.lambdaQuery() .eq(TicketFollow::getTicketId, ticket.getId()) @@ -326,11 +349,12 @@ public class TicketScheduledTasks { } } - private void sendEamilForAdminUser(List adminUsers, String subject, String content) throws MessagingException { - if (CollectionUtil.isNotEmpty(adminUsers)) { - for (AdminUser adminUser : adminUsers) { - log.info("【工单超时提醒】发送邮件到{}", adminUser.getEmail()); - emailService.sendEmail(adminUser.getEmail(), subject, content); + private void sendEamilForAdminUser(List adminUsers, List configAdminUsers, String subject,String content) throws MessagingException { + Set adminUserSet = Sets.union(Sets.newHashSet(adminUsers), Sets.newHashSet(configAdminUsers)); + if (CollectionUtil.isNotEmpty(adminUserSet)){ + for (AdminUser adminUser:adminUserSet) { + log.info("【工单超时提醒】发送邮件到{}",adminUser.getEmail()); + emailService.sendEmail(adminUser.getEmail(),subject,content); } } } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/AdminUser.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/AdminUser.java index d594a7d2..711f324e 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/AdminUser.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/AdminUser.java @@ -10,6 +10,7 @@ import lombok.experimental.Accessors; import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Objects; /** *

@@ -132,4 +133,16 @@ public class AdminUser implements Serializable { */ @TableField("is_gongfu") private boolean gongfu; + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) return false; + AdminUser adminUser = (AdminUser) o; + return Objects.equals(id, adminUser.id); + } + + @Override + public int hashCode() { + return Objects.hashCode(id); + } } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/SendMsgConfig.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/SendMsgConfig.java new file mode 100644 index 00000000..344a39ae --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/SendMsgConfig.java @@ -0,0 +1,36 @@ +package com.nflg.mobilebroken.repository.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.time.LocalDateTime; + +@Getter +@Setter +@Accessors(chain = true) +@TableName("t_send_msg_config") +public class SendMsgConfig implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + private String dataType; + + private String remindType; + + private Integer createBy; + + private LocalDateTime createTime; + + private Integer updateBy; + + private LocalDateTime updateTime; +} diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/SendMsgConfigUser.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/SendMsgConfigUser.java new file mode 100644 index 00000000..885804e6 --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/SendMsgConfigUser.java @@ -0,0 +1,48 @@ +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 lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.time.LocalDateTime; + +@Getter +@Setter +@Accessors(chain = true) +@TableName("t_send_msg_config_user") +public class SendMsgConfigUser implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + private Long sendMsgConfigId; + private String userType; + private Integer receiverId; + + private String receiverTypes; + /** + * 上传人 + */ + private Integer createBy; + + /** + * 上传时间 + */ + private LocalDateTime createTime; + + /** + * 最后更新人 + */ + private Integer updateBy; + + /** + * 最后更新时间 + */ + private LocalDateTime updateTime; +} diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/SendMsgConfigMapper.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/SendMsgConfigMapper.java new file mode 100644 index 00000000..14b31b73 --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/SendMsgConfigMapper.java @@ -0,0 +1,7 @@ +package com.nflg.mobilebroken.repository.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.nflg.mobilebroken.repository.entity.SendMsgConfig; + +public interface SendMsgConfigMapper extends BaseMapper { +} diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/SendMsgConfigUserMapper.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/SendMsgConfigUserMapper.java new file mode 100644 index 00000000..a2e17be0 --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/SendMsgConfigUserMapper.java @@ -0,0 +1,7 @@ +package com.nflg.mobilebroken.repository.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.nflg.mobilebroken.repository.entity.SendMsgConfigUser; + +public interface SendMsgConfigUserMapper extends BaseMapper { +} diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/ISendMsgConfigService.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/ISendMsgConfigService.java new file mode 100644 index 00000000..66b29402 --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/ISendMsgConfigService.java @@ -0,0 +1,32 @@ +package com.nflg.mobilebroken.repository.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.nflg.mobilebroken.common.constant.SendMsgConfigDataTypeEnum; +import com.nflg.mobilebroken.common.constant.SendMsgConfigRemindTypeEnum; +import com.nflg.mobilebroken.common.constant.SendMsgConfigUserReceiverTypeEnum; +import com.nflg.mobilebroken.common.pojo.PageData; +import com.nflg.mobilebroken.common.pojo.request.SendMsgConfigAddRequest; +import com.nflg.mobilebroken.common.pojo.request.SendMsgConfigGetPageRequest; +import com.nflg.mobilebroken.common.pojo.request.SendMsgConfigUpdateRequest; +import com.nflg.mobilebroken.common.pojo.vo.SendMsgConfigGetPageVO; +import com.nflg.mobilebroken.repository.entity.AdminUser; +import com.nflg.mobilebroken.repository.entity.AppUser; +import com.nflg.mobilebroken.repository.entity.SendMsgConfig; + +import java.util.List; +import java.util.Map; + + +public interface ISendMsgConfigService extends IService { + + PageData getPage(SendMsgConfigGetPageRequest request); + + void addSendMsgConfig(SendMsgConfigAddRequest request); + + void updateSendMsgConfig(SendMsgConfigUpdateRequest request); + + Map> getAdminUserMapByDataTypeAndRemindType(SendMsgConfigDataTypeEnum dataTypeEnum, SendMsgConfigRemindTypeEnum remindTypeEnum); + + Map> getAppUserMapByDataTypeAndRemindType(SendMsgConfigDataTypeEnum dataTypeEnum, SendMsgConfigRemindTypeEnum remindTypeEnum); + +} diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/ISendMsgConfigUserService.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/ISendMsgConfigUserService.java new file mode 100644 index 00000000..45ab0c2b --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/ISendMsgConfigUserService.java @@ -0,0 +1,21 @@ +package com.nflg.mobilebroken.repository.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.nflg.mobilebroken.common.pojo.PageData; +import com.nflg.mobilebroken.common.pojo.request.*; +import com.nflg.mobilebroken.common.pojo.vo.SendMsgConfigGetPageVO; +import com.nflg.mobilebroken.common.pojo.vo.SendMsgConfigUserGetListVO; +import com.nflg.mobilebroken.repository.entity.SendMsgConfig; +import com.nflg.mobilebroken.repository.entity.SendMsgConfigUser; + +import java.util.List; + + +public interface ISendMsgConfigUserService extends IService { + + List getList(SendMsgConfigUserGetListRequest request); + + void addSendMsgUserConfig(SendMsgConfigUserAddRequest request); + + void updateSendMsgUserConfig(SendMsgConfigUserUpdateRequest request); +} diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/SendMsgConfigServiceImpl.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/SendMsgConfigServiceImpl.java new file mode 100644 index 00000000..729b566b --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/SendMsgConfigServiceImpl.java @@ -0,0 +1,203 @@ +package com.nflg.mobilebroken.repository.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.beust.ah.A; +import com.beust.jcommander.internal.Lists; +import com.beust.jcommander.internal.Maps; +import com.nflg.mobilebroken.common.constant.*; +import com.nflg.mobilebroken.common.exception.NflgException; +import com.nflg.mobilebroken.common.pojo.PageData; +import com.nflg.mobilebroken.common.pojo.request.SendMsgConfigAddRequest; +import com.nflg.mobilebroken.common.pojo.request.SendMsgConfigGetPageRequest; +import com.nflg.mobilebroken.common.pojo.request.SendMsgConfigUpdateRequest; +import com.nflg.mobilebroken.common.pojo.vo.SendMsgConfigGetPageVO; +import com.nflg.mobilebroken.common.util.AdminUserUtil; +import com.nflg.mobilebroken.common.util.PageUtil; +import com.nflg.mobilebroken.repository.entity.AdminUser; +import com.nflg.mobilebroken.repository.entity.AppUser; +import com.nflg.mobilebroken.repository.entity.SendMsgConfig; +import com.nflg.mobilebroken.repository.entity.SendMsgConfigUser; +import com.nflg.mobilebroken.repository.mapper.SendMsgConfigMapper; +import com.nflg.mobilebroken.repository.service.IAdminUserService; +import com.nflg.mobilebroken.repository.service.IAppUserService; +import com.nflg.mobilebroken.repository.service.ISendMsgConfigService; +import com.nflg.mobilebroken.repository.service.ISendMsgConfigUserService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Collectors; + +@Service +@Slf4j +public class SendMsgConfigServiceImpl extends ServiceImpl implements ISendMsgConfigService { + + @Resource + private IAdminUserService adminUserService; + + @Resource + private IAppUserService appUserService; + + @Resource + private ISendMsgConfigUserService sendMsgConfigUserService; + + @Override + public PageData getPage(SendMsgConfigGetPageRequest request) { + Page datas = lambdaQuery() + .eq(Objects.nonNull(request.getDataType()), SendMsgConfig::getDataType, request.getDataType()) + .eq(Objects.nonNull(request.getRemindType()), SendMsgConfig::getRemindType, request.getRemindType()) + .orderByDesc(SendMsgConfig::getDataType) + .page(new Page<>(request.getPage(), request.getPageSize())); + + List userIds = new ArrayList<>(); + datas.getRecords().forEach(d -> { + userIds.add(d.getCreateBy()); + userIds.add(d.getUpdateBy()); + }); + List users = adminUserService.listByIds(userIds); + Map userMap = users.stream().collect(Collectors.toMap(AdminUser::getId, Function.identity())); + + return PageUtil.convert(datas, d -> { + SendMsgConfigGetPageVO vo = Convert.convert(SendMsgConfigGetPageVO.class, d); + AdminUser au = userMap.get(d.getCreateBy()); + vo.setCreateByUserName(au.getUserName()); + if (Objects.nonNull(d.getUpdateBy())) { + AdminUser au2 = userMap.get(d.getUpdateBy()); + vo.setUpdateByUserName(au2.getUserName()); + } + return vo; + }); + } + + public void checkDuplicate(SendMsgConfig sendMsgConfig) { + List list = lambdaQuery().eq(SendMsgConfig::getDataType, sendMsgConfig.getDataType()) + .eq(SendMsgConfig::getRemindType, sendMsgConfig.getRemindType()).list(); + if (CollectionUtil.isNotEmpty(list) && (Objects.isNull(sendMsgConfig.getId()) || !sendMsgConfig.getId().equals(list.get(0).getId()))) { + throw new NflgException(STATE.ParamErr, "该配置已存在"); + } + } + + @Override + public void addSendMsgConfig(SendMsgConfigAddRequest request) { + SendMsgConfig sendMsgConfig = Convert.convert(SendMsgConfig.class, request); + checkDuplicate(sendMsgConfig); + + sendMsgConfig.setCreateBy(AdminUserUtil.getUserId()); + sendMsgConfig.setCreateTime(LocalDateTime.now()); + save(sendMsgConfig); + } + + @Override + public void updateSendMsgConfig(SendMsgConfigUpdateRequest request) { + SendMsgConfig sendMsgConfig = Convert.convert(SendMsgConfig.class, request); + checkDuplicate(sendMsgConfig); + + sendMsgConfig.setUpdateBy(AdminUserUtil.getUserId()); + sendMsgConfig.setUpdateTime(LocalDateTime.now()); + updateById(sendMsgConfig); + } + + private List getSendMsgConfigUserList(SendMsgConfigDataTypeEnum dataTypeEnum, SendMsgConfigRemindTypeEnum remindTypeEnum, SendMsgConfigUserTypeEnum userType) { + if (dataTypeEnum == null || remindTypeEnum == null) { + return Lists.newArrayList(); + } + SendMsgConfig sendMsgConfig = getOne(Wrappers.lambdaQuery(SendMsgConfig.class) + .eq(SendMsgConfig::getDataType, dataTypeEnum.getDataType()) + .eq(SendMsgConfig::getRemindType, remindTypeEnum.getRemindType())); + if (sendMsgConfig == null) { + return Lists.newArrayList(); + } + return sendMsgConfigUserService.list( + Wrappers.lambdaQuery(SendMsgConfigUser.class) + .eq(SendMsgConfigUser::getSendMsgConfigId, sendMsgConfig.getId()) + .eq(SendMsgConfigUser::getUserType, userType.getUserType()) + ); + } + + @Override + public Map> getAdminUserMapByDataTypeAndRemindType(SendMsgConfigDataTypeEnum dataTypeEnum, SendMsgConfigRemindTypeEnum remindTypeEnum) { + log.info("【发信管理】根据数据类型{}和提醒类型{}获取发信管理用户", dataTypeEnum, remindTypeEnum); + List sendMsgConfigUserList = getSendMsgConfigUserList(dataTypeEnum, remindTypeEnum, SendMsgConfigUserTypeEnum.ADMIN); + if (CollectionUtil.isEmpty(sendMsgConfigUserList)) { + return Maps.newHashMap(); + } + List receiverIds = sendMsgConfigUserList.stream().map(SendMsgConfigUser::getReceiverId).collect(Collectors.toList()); + List users = adminUserService.listByIds(receiverIds); + Map userMap = users.stream().collect(Collectors.toMap(AdminUser::getId, Function.identity())); + + Map> resultMap = Maps.newHashMap(); + for(SendMsgConfigUser sendMsgConfigUser : sendMsgConfigUserList) { + AdminUser au = userMap.get(sendMsgConfigUser.getReceiverId()); + if (Objects.isNull(au)) { + continue; + } + String receiverTypes = sendMsgConfigUser.getReceiverTypes(); + if (StringUtils.isBlank(receiverTypes)) { + continue; + } + String[] types = receiverTypes.split(","); + for(String type : types) { + if (StringUtils.isBlank(type)) { + continue; + } + SendMsgConfigUserReceiverTypeEnum enumItem = SendMsgConfigUserReceiverTypeEnum.getEnumByReceiverType(type); + if (Objects.isNull(enumItem)) { + continue; + } + resultMap.putIfAbsent(enumItem, new ArrayList<>()); + resultMap.get(enumItem).add(au); + } + } + return resultMap; + } + + @Override + public Map> getAppUserMapByDataTypeAndRemindType(SendMsgConfigDataTypeEnum dataTypeEnum, SendMsgConfigRemindTypeEnum remindTypeEnum) { + List sendMsgConfigUserList = getSendMsgConfigUserList(dataTypeEnum, remindTypeEnum, SendMsgConfigUserTypeEnum.APP); + if (CollectionUtil.isEmpty(sendMsgConfigUserList)) { + return Maps.newHashMap(); + } + + List receiverIds = sendMsgConfigUserList.stream().map(SendMsgConfigUser::getReceiverId).collect(Collectors.toList()); + List users = appUserService.listByIds(receiverIds); + Map userMap = users.stream().collect(Collectors.toMap(AppUser::getId, Function.identity())); + + Map> resultMap = Maps.newHashMap(); + for(SendMsgConfigUser sendMsgConfigUser : sendMsgConfigUserList) { + AppUser au = userMap.get(sendMsgConfigUser.getReceiverId()); + if (Objects.isNull(au)) { + continue; + } + String receiverTypes = sendMsgConfigUser.getReceiverTypes(); + if (StringUtils.isBlank(receiverTypes)) { + continue; + } + String[] types = receiverTypes.split(","); + for(String type : types) { + if (StringUtils.isBlank(type)) { + continue; + } + SendMsgConfigUserReceiverTypeEnum enumItem = SendMsgConfigUserReceiverTypeEnum.getEnumByReceiverType(type); + if (Objects.isNull(enumItem)) { + continue; + } + resultMap.putIfAbsent(enumItem, new ArrayList<>()); + resultMap.get(enumItem).add(au); + } + } + return resultMap; + } + + +} diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/SendMsgConfigServiceUserImpl.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/SendMsgConfigServiceUserImpl.java new file mode 100644 index 00000000..de3d463b --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/SendMsgConfigServiceUserImpl.java @@ -0,0 +1,126 @@ +package com.nflg.mobilebroken.repository.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.beust.jcommander.internal.Lists; +import com.beust.jcommander.internal.Maps; +import com.nflg.mobilebroken.common.constant.STATE; +import com.nflg.mobilebroken.common.constant.SendMsgConfigUserTypeEnum; +import com.nflg.mobilebroken.common.exception.NflgException; +import com.nflg.mobilebroken.common.pojo.PageData; +import com.nflg.mobilebroken.common.pojo.request.*; +import com.nflg.mobilebroken.common.pojo.vo.SendMsgConfigGetPageVO; +import com.nflg.mobilebroken.common.pojo.vo.SendMsgConfigUserGetListVO; +import com.nflg.mobilebroken.common.util.AdminUserUtil; +import com.nflg.mobilebroken.common.util.PageUtil; +import com.nflg.mobilebroken.repository.entity.AdminUser; +import com.nflg.mobilebroken.repository.entity.AppUser; +import com.nflg.mobilebroken.repository.entity.SendMsgConfig; +import com.nflg.mobilebroken.repository.entity.SendMsgConfigUser; +import com.nflg.mobilebroken.repository.mapper.SendMsgConfigMapper; +import com.nflg.mobilebroken.repository.mapper.SendMsgConfigUserMapper; +import com.nflg.mobilebroken.repository.service.IAdminUserService; +import com.nflg.mobilebroken.repository.service.IAppUserService; +import com.nflg.mobilebroken.repository.service.ISendMsgConfigService; +import com.nflg.mobilebroken.repository.service.ISendMsgConfigUserService; +import org.apache.tomcat.util.buf.StringUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +@Service +public class SendMsgConfigServiceUserImpl extends ServiceImpl implements ISendMsgConfigUserService { + + @Resource + private IAdminUserService adminUserService; + + @Resource + private IAppUserService appUserService; + + @Override + public List getList(SendMsgConfigUserGetListRequest request) { + List list = lambdaQuery().eq(SendMsgConfigUser::getSendMsgConfigId, request.getSendMsgConfigId()).list(); + + List adminUserIds = new ArrayList<>(); + List appUserIds = new ArrayList<>(); + list.forEach(d -> { + if (SendMsgConfigUserTypeEnum.ADMIN.getUserType().equals(d.getUserType())) { + adminUserIds.add(d.getReceiverId()); + } else { + appUserIds.add(d.getReceiverId()); + } + }); + + final Map adminUserMap = Maps.newHashMap(); + if (CollectionUtil.isNotEmpty(adminUserIds)) { + List users = adminUserService.listByIds(adminUserIds); + adminUserMap.putAll(users.stream().collect(Collectors.toMap(AdminUser::getId, Function.identity()))); + } + final Map appUserMap = Maps.newHashMap(); + if (CollectionUtil.isNotEmpty(appUserIds)) { + List users = appUserService.listByIds(appUserIds); + appUserMap.putAll(users.stream().collect(Collectors.toMap(AppUser::getId, Function.identity()))); + } + + List voList = new ArrayList<>(); + + list.forEach(d -> { + SendMsgConfigUserGetListVO vo = Convert.convert(SendMsgConfigUserGetListVO.class, d); + if (SendMsgConfigUserTypeEnum.ADMIN.getUserType().equals(d.getUserType())) { + AdminUser au = adminUserMap.get(d.getReceiverId()); + vo.setReceiverUserName(au.getUserName() + " (" + au.getLoginName() + ")"); + } else { + AppUser au = appUserMap.get(d.getReceiverId()); + vo.setReceiverUserName(au.getName() + " (" + au.getLoginName() + ")"); + } + + voList.add(vo); + }); + + return voList; + } + + + public void checkDuplicate(SendMsgConfigUser sendMsgConfigUser) { + List list = lambdaQuery().eq(SendMsgConfigUser::getSendMsgConfigId, sendMsgConfigUser.getSendMsgConfigId()) + .eq(SendMsgConfigUser::getReceiverId, sendMsgConfigUser.getReceiverId()).list(); + if (CollectionUtil.isNotEmpty(list) && (Objects.isNull(sendMsgConfigUser.getId()) || !sendMsgConfigUser.getId().equals(list.get(0).getId()))) { + throw new NflgException(STATE.ParamErr, "该收信人已存在"); + } + } + + + @Override + public void addSendMsgUserConfig(SendMsgConfigUserAddRequest request) { + SendMsgConfigUser sendMsgConfigUser = Convert.convert(SendMsgConfigUser.class, request); + checkDuplicate(sendMsgConfigUser); + + request.getReceiverTypes().sort(Comparator.reverseOrder()); + sendMsgConfigUser.setReceiverTypes(StringUtils.join(request.getReceiverTypes(), ',')); + sendMsgConfigUser.setCreateBy(AdminUserUtil.getUserId()); + sendMsgConfigUser.setCreateTime(LocalDateTime.now()); + save(sendMsgConfigUser); + } + + + + @Override + public void updateSendMsgUserConfig(SendMsgConfigUserUpdateRequest request) { + SendMsgConfigUser sendMsgConfigUser = Convert.convert(SendMsgConfigUser.class, request); + checkDuplicate(sendMsgConfigUser); + + request.getReceiverTypes().sort(Comparator.reverseOrder()); + sendMsgConfigUser.setReceiverTypes(StringUtils.join(request.getReceiverTypes(), ',')); + sendMsgConfigUser.setUpdateBy(AdminUserUtil.getUserId()); + sendMsgConfigUser.setUpdateTime(LocalDateTime.now()); + updateById(sendMsgConfigUser); + } + + +} diff --git a/nflg-mobilebroken-starter/src/main/java/com/nflg/mobilebroken/starter/event/AbsTicketEvent.java b/nflg-mobilebroken-starter/src/main/java/com/nflg/mobilebroken/starter/event/AbsTicketEvent.java new file mode 100644 index 00000000..bf1839b6 --- /dev/null +++ b/nflg-mobilebroken-starter/src/main/java/com/nflg/mobilebroken/starter/event/AbsTicketEvent.java @@ -0,0 +1,46 @@ +package com.nflg.mobilebroken.starter.event; + +import cn.hutool.core.collection.CollectionUtil; +import com.beust.jcommander.internal.Lists; +import com.nflg.mobilebroken.common.constant.SendMsgConfigDataTypeEnum; +import com.nflg.mobilebroken.common.constant.SendMsgConfigRemindTypeEnum; +import com.nflg.mobilebroken.common.constant.SendMsgConfigUserReceiverTypeEnum; +import com.nflg.mobilebroken.starter.utils.SpringContextHolderUtils; +import com.nflg.mobilebroken.repository.entity.AdminUser; +import com.nflg.mobilebroken.repository.service.ISendMsgConfigService; +import org.springframework.context.ApplicationEvent; + +import java.util.List; +import java.util.Map; + +public abstract class AbsTicketEvent extends ApplicationEvent { + + private final ISendMsgConfigService sendMsgConfigService; + private Map> sendMsgConfigAdminUserMap; + + public AbsTicketEvent(Object source) { + super(source); + this.sendMsgConfigService = SpringContextHolderUtils.getBean(ISendMsgConfigService.class); + } + + protected void initSendMsgConfigAdminUserMap(SendMsgConfigDataTypeEnum dataTypeEnum, SendMsgConfigRemindTypeEnum remindTypeEnum) { + this.sendMsgConfigAdminUserMap = sendMsgConfigService.getAdminUserMapByDataTypeAndRemindType(dataTypeEnum, remindTypeEnum); + } + + protected List getSendMsgConfigAdminUserForInSiteMsg() { + List adminUsers = sendMsgConfigAdminUserMap.get(SendMsgConfigUserReceiverTypeEnum.IN_SITE_MSG); + if (CollectionUtil.isEmpty(adminUsers)) { + return Lists.newArrayList(); + } + return adminUsers; + } + + protected List getSendMsgConfigAdminUserForEmail() { + List adminUsers = sendMsgConfigAdminUserMap.get(SendMsgConfigUserReceiverTypeEnum.EMAIL); + if (CollectionUtil.isEmpty(adminUsers)) { + return Lists.newArrayList(); + } + return adminUsers; + } + +} diff --git a/nflg-mobilebroken-starter/src/main/java/com/nflg/mobilebroken/starter/service/EmailService.java b/nflg-mobilebroken-starter/src/main/java/com/nflg/mobilebroken/starter/service/EmailService.java index 17f28d02..066fa2d9 100644 --- a/nflg-mobilebroken-starter/src/main/java/com/nflg/mobilebroken/starter/service/EmailService.java +++ b/nflg-mobilebroken-starter/src/main/java/com/nflg/mobilebroken/starter/service/EmailService.java @@ -1,8 +1,11 @@ package com.nflg.mobilebroken.starter.service; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.json.JSONUtil; +import com.beust.jcommander.internal.Sets; import com.nflg.mobilebroken.common.pojo.dto.EmailConfig; import com.nflg.mobilebroken.common.util.VUtils; +import com.nflg.mobilebroken.repository.entity.AdminUser; import com.nflg.mobilebroken.repository.entity.ParamConfig; import com.nflg.mobilebroken.repository.service.IParamConfigService; import lombok.extern.slf4j.Slf4j; @@ -12,8 +15,11 @@ import javax.annotation.Resource; import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; +import java.util.List; import java.util.Objects; import java.util.Properties; +import java.util.Set; +import java.util.stream.Collectors; @Component @@ -23,6 +29,27 @@ public class EmailService { @Resource private IParamConfigService paramConfigService; + public void sendEmailForAdminUser(List adminUsers, List configAdminUsers, String subject,String content) throws MessagingException { + Set adminUserSet = Sets.newHashSet(); + if (CollectionUtil.isNotEmpty(adminUsers)){ + adminUserSet.addAll(adminUsers); + } + if (CollectionUtil.isNotEmpty(configAdminUsers)){ + adminUserSet.addAll(configAdminUsers); + log.info("【发信管理】配置的邮件地址:{}", configAdminUsers.stream().map(AdminUser::getEmail).collect(Collectors.toList())); + } + log.info("批量发送邮件,用户数量:{}", adminUserSet.size()); + if (CollectionUtil.isNotEmpty(adminUserSet)){ + for (AdminUser adminUser:adminUserSet) { + try { + sendEmail(adminUser.getEmail(), subject, content); + } catch (MessagingException e) { + log.error("邮件发送失败", e); + } + } + } + } + public void sendEmail(String to,String subject, String content) throws MessagingException { log.info("准备发送邮件,to:{},subject:{},content:{}",to,subject,content); ParamConfig config = paramConfigService.lambdaQuery().eq(ParamConfig::getCode, "EmailSet").one(); diff --git a/nflg-mobilebroken-starter/src/main/java/com/nflg/mobilebroken/starter/utils/SpringContextHolderUtils.java b/nflg-mobilebroken-starter/src/main/java/com/nflg/mobilebroken/starter/utils/SpringContextHolderUtils.java new file mode 100644 index 00000000..904c1d80 --- /dev/null +++ b/nflg-mobilebroken-starter/src/main/java/com/nflg/mobilebroken/starter/utils/SpringContextHolderUtils.java @@ -0,0 +1,21 @@ +package com.nflg.mobilebroken.starter.utils; + +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + +@Component +public class SpringContextHolderUtils implements ApplicationContextAware { + + private static ApplicationContext applicationContext; + + @Override + public void setApplicationContext(ApplicationContext applicationContext) { + SpringContextHolderUtils.applicationContext = applicationContext; + } + + public static T getBean(Class clazz) { + return applicationContext.getBean(clazz); + } + +} \ No newline at end of file From 80e89777d20a410fbb9566e4922687c5609ac204 Mon Sep 17 00:00:00 2001 From: 10002617 Date: Mon, 30 Mar 2026 11:18:23 +0800 Subject: [PATCH 2/5] =?UTF-8?q?zjr0325-=E6=96=B0=E5=A2=9E=E9=82=AE?= =?UTF-8?q?=E4=BB=B6=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nflg-mobilebroken-cfs-app/src/main/resources/logback-sit.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/nflg-mobilebroken-cfs-app/src/main/resources/logback-sit.xml b/nflg-mobilebroken-cfs-app/src/main/resources/logback-sit.xml index 7b2193a9..266ab35f 100644 --- a/nflg-mobilebroken-cfs-app/src/main/resources/logback-sit.xml +++ b/nflg-mobilebroken-cfs-app/src/main/resources/logback-sit.xml @@ -2,7 +2,8 @@ - + + From 5e09b83df06cfaaf74a986531b1c164869242702 Mon Sep 17 00:00:00 2001 From: 10002617 Date: Mon, 30 Mar 2026 11:48:01 +0800 Subject: [PATCH 3/5] =?UTF-8?q?zjr0325-=E6=96=B0=E5=A2=9E=E9=82=AE?= =?UTF-8?q?=E4=BB=B6=E7=AE=A1=E7=90=86-=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/SendMsgConfigController.java | 5 ++++- .../admin/task/TicketScheduledTasks.java | 14 +++---------- .../gongfu/task/TicketScheduledTasks.java | 20 ++++++------------- .../service/ISendMsgConfigService.java | 1 + .../impl/SendMsgConfigServiceImpl.java | 8 +++++++- 5 files changed, 21 insertions(+), 27 deletions(-) diff --git a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/SendMsgConfigController.java b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/SendMsgConfigController.java index 9c39baf4..220695e4 100644 --- a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/SendMsgConfigController.java +++ b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/SendMsgConfigController.java @@ -1,6 +1,7 @@ package com.nflg.mobilebroken.admin.controller; import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.nflg.mobilebroken.admin.annotation.ApiMark; import com.nflg.mobilebroken.common.constant.STATE; import com.nflg.mobilebroken.common.exception.NflgException; @@ -11,7 +12,9 @@ import com.nflg.mobilebroken.common.pojo.request.SendMsgConfigGetPageRequest; import com.nflg.mobilebroken.common.pojo.request.SendMsgConfigUpdateRequest; import com.nflg.mobilebroken.common.pojo.vo.SendMsgConfigGetPageVO; import com.nflg.mobilebroken.repository.entity.SendMsgConfig; +import com.nflg.mobilebroken.repository.entity.SendMsgConfigUser; import com.nflg.mobilebroken.repository.service.ISendMsgConfigService; +import com.nflg.mobilebroken.repository.service.ISendMsgConfigUserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -55,7 +58,7 @@ public class SendMsgConfigController extends ControllerBase{ if (CollectionUtil.isEmpty(ids)) { throw new NflgException(STATE.ParamErr, "ids必传"); } - sendMsgConfigService.removeByIds(ids); + sendMsgConfigService.removeSendMsgConfigByIds(ids); return ApiResult.success(true); } } 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 3a138456..cc818781 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 @@ -291,7 +291,9 @@ public class TicketScheduledTasks { .replace("${createTime}", toTimeString(ticket.getCreateTime())) .replace("${msg}", subject); try { - sendEamilForAdminUser(adminUsers, configEmailsAdminUsers, subject, content); + log.info("【工单超时提醒】发送邮件到adminUsers: {}",CollectionUtil.isNotEmpty(adminUsers) ? adminUsers.stream().map(AdminUser::getEmail).collect(Collectors.toList()) : Lists.newArrayList()); + log.info("【工单超时提醒】发送邮件到configEmailsAdminUsers: {}",CollectionUtil.isNotEmpty(configEmailsAdminUsers) ? configEmailsAdminUsers.stream().map(AdminUser::getEmail).collect(Collectors.toList()) : Lists.newArrayList()); + emailService.sendEmailForAdminUser(adminUsers, configEmailsAdminUsers, subject, content); } catch (Exception e) { log.error("【工单超时提醒】邮件发送失败", e); } @@ -346,16 +348,6 @@ public class TicketScheduledTasks { } } - private void sendEamilForAdminUser(List adminUsers, List configAdminUsers, String subject,String content) throws MessagingException { - Set adminUserSet = Sets.union(Sets.newHashSet(adminUsers), Sets.newHashSet(configAdminUsers)); - if (CollectionUtil.isNotEmpty(adminUserSet)){ - for (AdminUser adminUser:adminUserSet) { - log.info("【工单超时提醒】发送邮件到{}",adminUser.getEmail()); - emailService.sendEmail(adminUser.getEmail(),subject,content); - } - } - } - private void sendEamilForAppUser(List users,String subject,String content) throws MessagingException { if (CollectionUtil.isNotEmpty(users)){ for (AppUser user:users) { diff --git a/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/task/TicketScheduledTasks.java b/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/task/TicketScheduledTasks.java index 138f53d1..346abe3a 100644 --- a/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/task/TicketScheduledTasks.java +++ b/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/task/TicketScheduledTasks.java @@ -184,7 +184,7 @@ public class TicketScheduledTasks { * 工单超时提醒 * 每天午夜12点执行一次 */ - @Scheduled(cron = "0 0 0 * * ?") + @Scheduled(fixedRate = 10000) public void timeoutRemind() { log.info("【工单超时提醒】开始执行"); ParamConfig config = paramConfigService.lambdaQuery().eq(ParamConfig::getCode, "TiketTimeout").one(); @@ -279,7 +279,7 @@ public class TicketScheduledTasks { adminUserIds.addAll(followUserIds); } - Map> sendMsgConfigAdminUserMap = sendMsgConfigService.getAdminUserMapByDataTypeAndRemindType(SendMsgConfigDataTypeEnum.MOBILE_BROKEN_TICKET, SendMsgConfigRemindTypeEnum.TITLE_TICKET_TIMEOUT); + Map> sendMsgConfigAdminUserMap = sendMsgConfigService.getAdminUserMapByDataTypeAndRemindType(SendMsgConfigDataTypeEnum.GONGFU_TICKET, SendMsgConfigRemindTypeEnum.TITLE_TICKET_TIMEOUT); List configEmailsAdminUsers = sendMsgConfigAdminUserMap.getOrDefault(SendMsgConfigUserReceiverTypeEnum.EMAIL, Lists.newArrayList()); @@ -294,7 +294,9 @@ public class TicketScheduledTasks { .replace("${createTime}", toTimeString(ticket.getCreateTime())) .replace("${msg}", subject); try { - sendEamilForAdminUser(adminUsers, configEmailsAdminUsers, subject, content); + log.info("【工单超时提醒】发送邮件到adminUsers: {}",CollectionUtil.isNotEmpty(adminUsers) ? adminUsers.stream().map(AdminUser::getEmail).collect(Collectors.toList()) : Lists.newArrayList()); + log.info("【工单超时提醒】发送邮件到configEmailsAdminUsers: {}",CollectionUtil.isNotEmpty(configEmailsAdminUsers) ? configEmailsAdminUsers.stream().map(AdminUser::getEmail).collect(Collectors.toList()) : Lists.newArrayList()); + emailService.sendEmailForAdminUser(adminUsers, configEmailsAdminUsers, subject, content); } catch (Exception e) { log.error("【工单超时提醒】邮件发送失败", e); } @@ -309,7 +311,7 @@ public class TicketScheduledTasks { .setTitle(ticket.getTitle()) .setUserId(c.getId()) .setSourceId(Long.valueOf(ticket.getId())) - .setSource(0) + .setSource(3) .setType(MessageType.WorkOrderAssignment.getState()) .setSubType(MessageSubType.TicketTimeout.getState()) .setIsRead(false) @@ -349,16 +351,6 @@ public class TicketScheduledTasks { } } - private void sendEamilForAdminUser(List adminUsers, List configAdminUsers, String subject,String content) throws MessagingException { - Set adminUserSet = Sets.union(Sets.newHashSet(adminUsers), Sets.newHashSet(configAdminUsers)); - if (CollectionUtil.isNotEmpty(adminUserSet)){ - for (AdminUser adminUser:adminUserSet) { - log.info("【工单超时提醒】发送邮件到{}",adminUser.getEmail()); - emailService.sendEmail(adminUser.getEmail(),subject,content); - } - } - } - private void sendEamilForAppUser(List users, String subject, String content) throws MessagingException { if (CollectionUtil.isNotEmpty(users)) { for (AppUser user : users) { diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/ISendMsgConfigService.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/ISendMsgConfigService.java index 66b29402..7bde4bc2 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/ISendMsgConfigService.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/ISendMsgConfigService.java @@ -29,4 +29,5 @@ public interface ISendMsgConfigService extends IService { Map> getAppUserMapByDataTypeAndRemindType(SendMsgConfigDataTypeEnum dataTypeEnum, SendMsgConfigRemindTypeEnum remindTypeEnum); + void removeSendMsgConfigByIds(List ids); } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/SendMsgConfigServiceImpl.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/SendMsgConfigServiceImpl.java index 729b566b..91bcf290 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/SendMsgConfigServiceImpl.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/SendMsgConfigServiceImpl.java @@ -29,6 +29,7 @@ import com.nflg.mobilebroken.repository.service.ISendMsgConfigService; import com.nflg.mobilebroken.repository.service.ISendMsgConfigUserService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.time.LocalDateTime; @@ -199,5 +200,10 @@ public class SendMsgConfigServiceImpl extends ServiceImpl ids) { + removeByIds(ids); + sendMsgConfigUserService.remove(Wrappers.lambdaQuery(SendMsgConfigUser.class).in(SendMsgConfigUser::getSendMsgConfigId, ids)); + } } From a7738792f30a6e22487ad7cba207c5f3eb723ecd Mon Sep 17 00:00:00 2001 From: 10002617 Date: Mon, 30 Mar 2026 13:50:54 +0800 Subject: [PATCH 4/5] =?UTF-8?q?zjr0325-=E6=96=B0=E5=A2=9E=E9=82=AE?= =?UTF-8?q?=E4=BB=B6=E7=AE=A1=E7=90=86-=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/nflg/mobilebroken/gongfu/task/TicketScheduledTasks.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/task/TicketScheduledTasks.java b/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/task/TicketScheduledTasks.java index 346abe3a..b78ae33c 100644 --- a/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/task/TicketScheduledTasks.java +++ b/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/task/TicketScheduledTasks.java @@ -184,7 +184,7 @@ public class TicketScheduledTasks { * 工单超时提醒 * 每天午夜12点执行一次 */ - @Scheduled(fixedRate = 10000) + @Scheduled(cron = "0 0 0 * * ?") public void timeoutRemind() { log.info("【工单超时提醒】开始执行"); ParamConfig config = paramConfigService.lambdaQuery().eq(ParamConfig::getCode, "TiketTimeout").one(); From 6290dac43914273707c1be9bb34d6cf83d300a56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E9=B9=8F=E9=A3=9E?= Date: Wed, 1 Apr 2026 11:10:21 +0800 Subject: [PATCH 5/5] =?UTF-8?q?feat(ticket):=20=E6=B7=BB=E5=8A=A0=E4=BA=8B?= =?UTF-8?q?=E6=95=85=E7=AD=89=E7=BA=A7=E5=AD=97=E6=AE=B5=E5=88=B0=E5=B7=A5?= =?UTF-8?q?=E5=8D=95=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在工单映射文件中添加 accident_level 字段到多个查询语句 - 更新5个不同的SQL查询以包含事故等级信息 - 确保工单详情能够返回完整的事故等级数据 --- .../src/main/resources/mapper/TicketMapper.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/nflg-mobilebroken-repository/src/main/resources/mapper/TicketMapper.xml b/nflg-mobilebroken-repository/src/main/resources/mapper/TicketMapper.xml index c0de8b3f..a65c0b90 100644 --- a/nflg-mobilebroken-repository/src/main/resources/mapper/TicketMapper.xml +++ b/nflg-mobilebroken-repository/src/main/resources/mapper/TicketMapper.xml @@ -165,7 +165,7 @@ ,t.create_time AS 'createTime',t.update_time AS 'completeTime',di.name AS 'warrantyStatusDesc',d.device_type AS 'deviceType' ,d.model_no AS 'equipmentModel',d.shipment_date AS 'shipmentDate',IF(tf.id IS NULL, false, true) AS 'followed',auc.user_name AS 'cqm' ,t.solve_time AS 'closeTime',auh.user_name AS 'currentHandle',dt.cqm_person_name AS 'cqms' - ,t.handle_name AS 'handle',t.description,t.throughput + ,t.handle_name AS 'handle',t.description,t.throughput,t.accident_level FROM ticket t LEFT JOIN app_user u ON t.user_id=u.id LEFT JOIN admin_user au ON t.user_id=au.id @@ -189,7 +189,7 @@ ,t.create_time AS 'createTime',t.update_time AS 'completeTime',di.name AS 'warrantyStatusDesc',d.device_type AS 'deviceType' ,d.model_no AS 'equipmentModel',d.shipment_date AS 'shipmentDate',IF(tf.id IS NULL, false, true) AS 'followed',auc.user_name AS 'cqm' ,t.solve_time AS 'closeTime',auh.user_name AS 'currentHandle',dt.cqm_person_name AS 'cqms' - ,t.handle_name AS 'handle',t.description,t.throughput + ,t.handle_name AS 'handle',t.description,t.throughput,t.accident_level FROM ticket t LEFT JOIN app_user u ON t.user_id=u.id LEFT JOIN admin_user au ON t.user_id=au.id @@ -213,7 +213,7 @@ ,t.create_time AS 'createTime',t.update_time AS 'completeTime',di.name AS 'warrantyStatusDesc',d.device_type AS 'deviceType' ,d.model_no AS 'equipmentModel',d.shipment_date AS 'shipmentDate',true AS 'followed',auc.user_name AS 'cqm' ,t.solve_time AS 'closeTime',auh.user_name AS 'currentHandle',dt.cqm_person_name AS 'cqms' - ,t.handle_name AS 'handle',t.description,t.throughput + ,t.handle_name AS 'handle',t.description,t.throughput,t.accident_level FROM ticket t LEFT JOIN app_user u ON t.user_id=u.id LEFT JOIN admin_user au ON t.user_id=au.id @@ -236,7 +236,7 @@ ,d.customer_name AS 'customerName',d.agent_name AS 'agentName',IF(t.user_platform='admin',au.user_name,u.`name`) AS 'createBy',t.device_no AS 'deviceNo',t.use_time AS 'useTime' ,t.create_time AS 'createTime',t.update_time AS 'completeTime',di.name AS 'warrantyStatusDesc',true AS 'followed' ,auc.user_name AS 'cqm',t.solve_time AS 'closeTime',auh.user_name AS 'currentHandle' - ,dt.cqm_person_name AS 'cqms',t.handle_name AS 'handle',t.description,t.throughput + ,dt.cqm_person_name AS 'cqms',t.handle_name AS 'handle',t.description,t.throughput,t.accident_level FROM ticket t LEFT JOIN app_user u ON t.user_id=u.id LEFT JOIN admin_user au ON t.user_id=au.id @@ -271,7 +271,7 @@ ,t.create_time AS 'createTime',t.update_time AS 'completeTime',di.name AS 'warrantyStatusDesc',d.device_type AS 'deviceType' ,d.model_no AS 'equipmentModel',d.shipment_date AS 'shipmentDate',true AS 'followed',auc.user_name AS 'cqm' ,t.solve_time AS 'closeTime',auh.user_name AS 'currentHandle',dt.cqm_person_name AS 'cqms' - ,t.handle_name AS 'handle',t.description,t.throughput + ,t.handle_name AS 'handle',t.description,t.throughput,t.accident_level FROM ticket t LEFT JOIN app_user u ON t.user_id=u.id LEFT JOIN admin_user au ON t.user_id=au.id