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 a5ba8926..720e309e 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 @@ -26,9 +26,7 @@ import java.time.LocalDateTime; import java.time.ZoneId; import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; +import java.util.*; import java.util.stream.Collectors; @Component @@ -76,27 +74,30 @@ public class TicketScheduledTasks { */ @Scheduled(cron = "0 0 0 * * ?") public void sendInviteCommentEmail() { - List tickets=ticketService.getNonComment(7); + log.info("【工单评论邀请】开始执行"); + List tickets = ticketService.getNonComment(3); + log.info("【工单评论邀请】共{}条数据", tickets.size()); tickets.forEach(ticket -> { - AdminUser createUser = adminUserService.getById(ticket.getUserId()); + AppUser createUser = appUserService.getById(ticket.getUserId()); if (Objects.equals(createUser.getState(), UserState.Activated.getState())) { - List adminUserIds = Arrays.stream(ticket.getHandle().split(",")) - .map(Integer::parseInt) - .collect(Collectors.toList()); - List adminUsers = adminUserService.listByIds(adminUserIds); +// List adminUserIds = Arrays.stream(ticket.getHandle().split(",")) +// .map(Integer::parseInt) +// .collect(Collectors.toList()); +// List adminUsers = adminUserService.listByIds(adminUserIds); String subject = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_TITLE_TICKET_INVITE_COMMENT, Constant.DEFAULT_LANGUAGE_CODE); String content = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_CONTENT_TICKET_INVITE_COMMENT, Constant.DEFAULT_LANGUAGE_CODE) .replace("${websiteUrl}", websiteUrl) .replace("${title}", ticket.getTitle()) - .replace("${createUser}", createUser.getUserName()) - .replace("${url}", websiteUrl+"/#/workOrder/workOrderDetail?id="+ticket.getId()); + .replace("${createUser}", createUser.getName()) + .replace("${url}", websiteUrl + "/#/workOrder/workOrderDetail?id=" + ticket.getId()); try { - sendEamilForAdminUser(adminUsers, subject, content); + sendEamilForAppUser(Collections.singletonList(createUser), subject, content); } catch (Exception e) { - log.error("邮件发送失败", e); + log.error("【工单评论邀请】邮件发送失败", e); } } }); + log.info("【工单评论邀请】执行完成"); } /** @@ -105,18 +106,20 @@ public class TicketScheduledTasks { */ @Scheduled(cron = "0 0 0 * * ?") public void autoComment() { - List tickets=ticketService.getNonComment(10); - TicketEvaluateAddVO vo=dictionaryItemTranslateService.getTicketEvaluateSelect(Constant.DEFAULT_LANGUAGE_CODE); + log.info("【工单自动评论】开始执行"); + List tickets = ticketService.getNonComment(10); + log.info("【工单自动评论】共{}条数据", tickets.size()); + TicketEvaluateAddVO vo = dictionaryItemTranslateService.getTicketEvaluateSelect(Constant.DEFAULT_LANGUAGE_CODE); TicketEvaluateAddRequest request = new TicketEvaluateAddRequest(); request.setType(1); request.setScore(new BigDecimal("5")); - TicketEvaluateItemVO se=vo.getServiceEvaluation().stream() - .filter(it->StrUtil.equals(it.getCode(), Constant.DICTIONARY_TYPE_SERVICE_EVALUATION+"Satisfied")) + TicketEvaluateItemVO se = vo.getServiceEvaluation().stream() + .filter(it -> StrUtil.equals(it.getCode(), Constant.DICTIONARY_TYPE_SERVICE_EVALUATION + "Satisfied")) .findFirst().get(); request.setServiceEvaluationId(se.getId()); request.setServiceEvaluationSelectIds(se.getChildren().stream().map(TicketEvaluateItemVO::getId).collect(Collectors.toList())); - TicketEvaluateItemVO pe=vo.getServiceEvaluation().stream() - .filter(it->StrUtil.equals(it.getCode(), Constant.DICTIONARY_TYPE_SERVICE_EVALUATION+"Satisfied")) + TicketEvaluateItemVO pe = vo.getServiceEvaluation().stream() + .filter(it -> StrUtil.equals(it.getCode(), Constant.DICTIONARY_TYPE_SERVICE_EVALUATION + "Satisfied")) .findFirst().get(); request.setProductEvaluationId(pe.getId()); request.setProductEvaluationSelectIds(pe.getChildren().stream().map(TicketEvaluateItemVO::getId).collect(Collectors.toList())); @@ -124,6 +127,7 @@ public class TicketScheduledTasks { request.setTicketId(ticket.getId()); ticketEvaluateService.add(request); }); + log.info("【工单自动评论】执行完成"); } /** @@ -132,13 +136,13 @@ public class TicketScheduledTasks { */ @Scheduled(cron = "0 0 0 * * ?") public void timeoutRemind() { - log.info("开始执行工单超时提醒"); + log.info("【工单超时提醒】开始执行"); ParamConfig config = paramConfigService.lambdaQuery().eq(ParamConfig::getCode, "TiketTimeout").one(); TiketTimeoutDTO cfgTimeout= JSONUtil.toBean(config.getValue(), TiketTimeoutDTO.class); emergencyRemind(cfgTimeout); generalRemind(cfgTimeout); nonemergencyRemind(cfgTimeout); - log.info("执行工单超时提醒完成"); + log.info("【工单超时提醒】执行完成"); } /** @@ -155,32 +159,32 @@ public class TicketScheduledTasks { } private void emergencyRemind(TiketTimeoutDTO cfgTimeout) { - log.info("获取状态为紧急且{}天未解决的工单", cfgTimeout.getEmergency()); + log.info("【工单超时提醒】获取状态为紧急且{}天未解决的工单", cfgTimeout.getEmergency()); List tickets = ticketService.getEmergencys(cfgTimeout.getEmergency()); - log.info("共{}条数据", tickets.size()); + log.info("【工单超时提醒】共{}条数据", tickets.size()); tickets.forEach(this::ticketHande); } private void generalRemind(TiketTimeoutDTO cfgTimeout) { - log.info("获取状态为普通且{}天未解决的工单", cfgTimeout.getGeneral()); + log.info("【工单超时提醒】获取状态为普通且{}天未解决的工单", cfgTimeout.getGeneral()); List tickets = ticketService.getGenerals(cfgTimeout.getGeneral()); - log.info("共{}条数据", tickets.size()); + log.info("【工单超时提醒】共{}条数据", tickets.size()); tickets.forEach(this::ticketHande); } private void nonemergencyRemind(TiketTimeoutDTO cfgTimeout) { - log.info("获取状态为非紧急且{}天未解决的工单", cfgTimeout.getNonemergency()); + log.info("【工单超时提醒】获取状态为非紧急且{}天未解决的工单", cfgTimeout.getNonemergency()); List tickets = ticketService.getNonemergency(cfgTimeout.getNonemergency()); - log.info("共{}条数据", tickets.size()); + log.info("【工单超时提醒】共{}条数据", tickets.size()); tickets.forEach(this::ticketHande); } private void ticketHande(Ticket ticket) { AppUser createUser=appUserService.getById(ticket.getUserId()); //处理人 - List adminUserIds = Arrays.stream(ticket.getHandle().split(",")) + Set adminUserIds = Arrays.stream(ticket.getHandle().split(",")) .map(Integer::parseInt) - .collect(Collectors.toList()); + .collect(Collectors.toSet()); //CQM adminUserIds.add(ticket.getCqm()); //管理端关注人 @@ -194,31 +198,32 @@ public class TicketScheduledTasks { if (CollectionUtil.isNotEmpty(followUserIds)){ adminUserIds.addAll(followUserIds); } - 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) - .replace("${no}", ticket.getNo()) - .replace("${title}", ticket.getTitle()) - .replace("${createUser}", createUser.getName()) - .replace("${handleUser}", StrUtil.join(",",adminUsers.stream().map(AdminUser::getUserName).collect(Collectors.toList()))) - .replace("${createTime}", toTimeString(ticket.getCreateTime())) - .replace("${msg}", subject); - try { - sendEamilForAdminUser(adminUsers, subject, content); - }catch (Exception e){ - log.error("邮件发送失败", e); + if (CollectionUtil.isNotEmpty(adminUserIds)) { + 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) + .replace("${no}", ticket.getNo()) + .replace("${title}", ticket.getTitle()) + .replace("${createUser}", createUser.getName()) + .replace("${handleUser}", StrUtil.join(",", adminUsers.stream().map(AdminUser::getUserName).collect(Collectors.toList()))) + .replace("${createTime}", toTimeString(ticket.getCreateTime())) + .replace("${msg}", subject); + try { + sendEamilForAdminUser(adminUsers, subject, content); + } catch (Exception e) { + log.error("【工单超时提醒】邮件发送失败", e); + } } - //客户端关注人 - List appUserIds=ticketFollowService.lambdaQuery() + Set appUserIds=ticketFollowService.lambdaQuery() .eq(TicketFollow::getTicketId, ticket.getId()) .eq(TicketFollow::getFrom, (byte) 0) .list() .stream() .map(TicketFollow::getUserId) - .collect(Collectors.toList()); + .collect(Collectors.toSet()); + appUserIds.add(ticket.getUserId()); List appUsers = appUserService.listByIds(appUserIds); - appUsers.add(createUser); sendAppMessage(appUsers, ticket); } @@ -231,6 +236,7 @@ public class TicketScheduledTasks { private void sendAppMessage(List appUsers, Ticket ticket){ for (AppUser appUser : appUsers){ + log.info("【工单超时提醒】添加消息给{}({})",appUser.getName(),appUser.getId()); appMessageService.add(new AppMessage() .setUserId(appUser.getId()) .setTicketId(ticket.getId()) @@ -243,8 +249,18 @@ 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 sendEamilForAppUser(List users,String subject,String content) throws MessagingException { + if (CollectionUtil.isNotEmpty(users)){ + for (AppUser user:users) { + log.info("【工单超时提醒】发送邮件到{}",user.getEmail()); + emailService.sendEmail(user.getEmail(),subject,content); + } + } + } } \ No newline at end of file diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/TicketAddRequest.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/TicketAddRequest.java index 36443edd..b7c1a2c8 100644 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/TicketAddRequest.java +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/TicketAddRequest.java @@ -22,7 +22,7 @@ public class TicketAddRequest { //标题 @NotBlank - @Size(max = 20, message = "标题长度不能超过20") + @Size(max = 150, message = "标题长度不能超过150") private String title; //描述 diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/TicketServiceImpl.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/TicketServiceImpl.java index b10a8a46..4adfe5a9 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/TicketServiceImpl.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/TicketServiceImpl.java @@ -122,12 +122,12 @@ public class TicketServiceImpl extends ServiceImpl impleme if (Objects.nonNull(request.getEndTime())) { request.setEndTime(request.getEndTime().plusDays(1)); } + Integer userId = AdminUserUtil.getUserId(); + List tickerMangagers = adminUserService.getTickerMangagers(); + request.setTicketManager(tickerMangagers.stream().anyMatch(uid -> Objects.equals(uid, userId))); if (request.getType() == 2) { return baseMapper.searchFromAdminAndFollow(request, AdminUserUtil.getUserId(), new Page<>(request.getPage(), request.getPageSize())); } else if (request.getType() == 4) { - Integer userId = AdminUserUtil.getUserId(); - List tickerMangagers = adminUserService.getTickerMangagers(); - request.setTicketManager(tickerMangagers.stream().anyMatch(uid -> Objects.equals(uid, userId))); return baseMapper.searchFromAdmin(request, userId, new Page<>(request.getPage(), request.getPageSize())); } return new Page<>(request.getPage(), request.getPageSize(), 0); diff --git a/nflg-mobilebroken-repository/src/main/resources/mapper/TicketMapper.xml b/nflg-mobilebroken-repository/src/main/resources/mapper/TicketMapper.xml index 88030f05..2fb79167 100644 --- a/nflg-mobilebroken-repository/src/main/resources/mapper/TicketMapper.xml +++ b/nflg-mobilebroken-repository/src/main/resources/mapper/TicketMapper.xml @@ -51,7 +51,7 @@ AND d.agent_code=#{request.agentCode} - AND FIND_IN_SET(#{request.areaCode},c.area_code)>0 + AND u.is_primary AND FIND_IN_SET(#{request.areaCode},fun_getPrimaryUserAreaCode(u.company_id))>0 AND t.question=#{request.question} @@ -219,7 +219,10 @@ FROM ticket t LEFT JOIN app_user u ON t.user_id=u.id LEFT JOIN app_area a2 ON u.area_id=a2.id - INNER JOIN ticket_follow tf ON t.id=tf.ticket_id AND tf.user_id=#{userId} AND tf.from=1 AND tf.favorites_id=#{favouritesId} + INNER JOIN ticket_follow tf ON t.id=tf.ticket_id AND tf.user_id=#{userId} AND tf.from=1 + + AND tf.favorites_id=#{favouritesId} + LEFT JOIN device d ON t.device_no=d.device_no LEFT JOIN t_base_device_type dt ON d.device_type=dt.device_type LEFT JOIN dictionary_item di ON d.warranty_state=di.id