fix: 修复一些问题

This commit is contained in:
曹鹏飞 2025-03-13 17:24:07 +08:00
parent 27018d0787
commit 13bfc612bf
4 changed files with 71 additions and 52 deletions

View File

@ -26,9 +26,7 @@ import java.time.LocalDateTime;
import java.time.ZoneId; import java.time.ZoneId;
import java.time.ZoneOffset; import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.Arrays; import java.util.*;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@Component @Component
@ -76,27 +74,30 @@ public class TicketScheduledTasks {
*/ */
@Scheduled(cron = "0 0 0 * * ?") @Scheduled(cron = "0 0 0 * * ?")
public void sendInviteCommentEmail() { public void sendInviteCommentEmail() {
List<Ticket> tickets=ticketService.getNonComment(7); log.info("【工单评论邀请】开始执行");
List<Ticket> tickets = ticketService.getNonComment(3);
log.info("【工单评论邀请】共{}条数据", tickets.size());
tickets.forEach(ticket -> { tickets.forEach(ticket -> {
AdminUser createUser = adminUserService.getById(ticket.getUserId()); AppUser createUser = appUserService.getById(ticket.getUserId());
if (Objects.equals(createUser.getState(), UserState.Activated.getState())) { if (Objects.equals(createUser.getState(), UserState.Activated.getState())) {
List<Integer> adminUserIds = Arrays.stream(ticket.getHandle().split(",")) // List<Integer> adminUserIds = Arrays.stream(ticket.getHandle().split(","))
.map(Integer::parseInt) // .map(Integer::parseInt)
.collect(Collectors.toList()); // .collect(Collectors.toList());
List<AdminUser> adminUsers = adminUserService.listByIds(adminUserIds); // List<AdminUser> 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 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) String content = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_CONTENT_TICKET_INVITE_COMMENT, Constant.DEFAULT_LANGUAGE_CODE)
.replace("${websiteUrl}", websiteUrl) .replace("${websiteUrl}", websiteUrl)
.replace("${title}", ticket.getTitle()) .replace("${title}", ticket.getTitle())
.replace("${createUser}", createUser.getUserName()) .replace("${createUser}", createUser.getName())
.replace("${url}", websiteUrl+"/#/workOrder/workOrderDetail?id="+ticket.getId()); .replace("${url}", websiteUrl + "/#/workOrder/workOrderDetail?id=" + ticket.getId());
try { try {
sendEamilForAdminUser(adminUsers, subject, content); sendEamilForAppUser(Collections.singletonList(createUser), subject, content);
} catch (Exception e) { } catch (Exception e) {
log.error("邮件发送失败", e); log.error("【工单评论邀请】邮件发送失败", e);
} }
} }
}); });
log.info("【工单评论邀请】执行完成");
} }
/** /**
@ -105,18 +106,20 @@ public class TicketScheduledTasks {
*/ */
@Scheduled(cron = "0 0 0 * * ?") @Scheduled(cron = "0 0 0 * * ?")
public void autoComment() { public void autoComment() {
List<Ticket> tickets=ticketService.getNonComment(10); log.info("【工单自动评论】开始执行");
TicketEvaluateAddVO vo=dictionaryItemTranslateService.getTicketEvaluateSelect(Constant.DEFAULT_LANGUAGE_CODE); List<Ticket> tickets = ticketService.getNonComment(10);
log.info("【工单自动评论】共{}条数据", tickets.size());
TicketEvaluateAddVO vo = dictionaryItemTranslateService.getTicketEvaluateSelect(Constant.DEFAULT_LANGUAGE_CODE);
TicketEvaluateAddRequest request = new TicketEvaluateAddRequest(); TicketEvaluateAddRequest request = new TicketEvaluateAddRequest();
request.setType(1); request.setType(1);
request.setScore(new BigDecimal("5")); request.setScore(new BigDecimal("5"));
TicketEvaluateItemVO se=vo.getServiceEvaluation().stream() TicketEvaluateItemVO se = vo.getServiceEvaluation().stream()
.filter(it->StrUtil.equals(it.getCode(), Constant.DICTIONARY_TYPE_SERVICE_EVALUATION+"Satisfied")) .filter(it -> StrUtil.equals(it.getCode(), Constant.DICTIONARY_TYPE_SERVICE_EVALUATION + "Satisfied"))
.findFirst().get(); .findFirst().get();
request.setServiceEvaluationId(se.getId()); request.setServiceEvaluationId(se.getId());
request.setServiceEvaluationSelectIds(se.getChildren().stream().map(TicketEvaluateItemVO::getId).collect(Collectors.toList())); request.setServiceEvaluationSelectIds(se.getChildren().stream().map(TicketEvaluateItemVO::getId).collect(Collectors.toList()));
TicketEvaluateItemVO pe=vo.getServiceEvaluation().stream() TicketEvaluateItemVO pe = vo.getServiceEvaluation().stream()
.filter(it->StrUtil.equals(it.getCode(), Constant.DICTIONARY_TYPE_SERVICE_EVALUATION+"Satisfied")) .filter(it -> StrUtil.equals(it.getCode(), Constant.DICTIONARY_TYPE_SERVICE_EVALUATION + "Satisfied"))
.findFirst().get(); .findFirst().get();
request.setProductEvaluationId(pe.getId()); request.setProductEvaluationId(pe.getId());
request.setProductEvaluationSelectIds(pe.getChildren().stream().map(TicketEvaluateItemVO::getId).collect(Collectors.toList())); request.setProductEvaluationSelectIds(pe.getChildren().stream().map(TicketEvaluateItemVO::getId).collect(Collectors.toList()));
@ -124,6 +127,7 @@ public class TicketScheduledTasks {
request.setTicketId(ticket.getId()); request.setTicketId(ticket.getId());
ticketEvaluateService.add(request); ticketEvaluateService.add(request);
}); });
log.info("【工单自动评论】执行完成");
} }
/** /**
@ -132,13 +136,13 @@ public class TicketScheduledTasks {
*/ */
@Scheduled(cron = "0 0 0 * * ?") @Scheduled(cron = "0 0 0 * * ?")
public void timeoutRemind() { public void timeoutRemind() {
log.info("开始执行工单超时提醒"); log.info("【工单超时提醒】开始执行");
ParamConfig config = paramConfigService.lambdaQuery().eq(ParamConfig::getCode, "TiketTimeout").one(); ParamConfig config = paramConfigService.lambdaQuery().eq(ParamConfig::getCode, "TiketTimeout").one();
TiketTimeoutDTO cfgTimeout= JSONUtil.toBean(config.getValue(), TiketTimeoutDTO.class); TiketTimeoutDTO cfgTimeout= JSONUtil.toBean(config.getValue(), TiketTimeoutDTO.class);
emergencyRemind(cfgTimeout); emergencyRemind(cfgTimeout);
generalRemind(cfgTimeout); generalRemind(cfgTimeout);
nonemergencyRemind(cfgTimeout); nonemergencyRemind(cfgTimeout);
log.info("执行工单超时提醒完成"); log.info("【工单超时提醒】执行完成");
} }
/** /**
@ -155,32 +159,32 @@ public class TicketScheduledTasks {
} }
private void emergencyRemind(TiketTimeoutDTO cfgTimeout) { private void emergencyRemind(TiketTimeoutDTO cfgTimeout) {
log.info("获取状态为紧急且{}天未解决的工单", cfgTimeout.getEmergency()); log.info("【工单超时提醒】获取状态为紧急且{}天未解决的工单", cfgTimeout.getEmergency());
List<Ticket> tickets = ticketService.getEmergencys(cfgTimeout.getEmergency()); List<Ticket> tickets = ticketService.getEmergencys(cfgTimeout.getEmergency());
log.info("共{}条数据", tickets.size()); log.info("【工单超时提醒】共{}条数据", tickets.size());
tickets.forEach(this::ticketHande); tickets.forEach(this::ticketHande);
} }
private void generalRemind(TiketTimeoutDTO cfgTimeout) { private void generalRemind(TiketTimeoutDTO cfgTimeout) {
log.info("获取状态为普通且{}天未解决的工单", cfgTimeout.getGeneral()); log.info("【工单超时提醒】获取状态为普通且{}天未解决的工单", cfgTimeout.getGeneral());
List<Ticket> tickets = ticketService.getGenerals(cfgTimeout.getGeneral()); List<Ticket> tickets = ticketService.getGenerals(cfgTimeout.getGeneral());
log.info("共{}条数据", tickets.size()); log.info("【工单超时提醒】共{}条数据", tickets.size());
tickets.forEach(this::ticketHande); tickets.forEach(this::ticketHande);
} }
private void nonemergencyRemind(TiketTimeoutDTO cfgTimeout) { private void nonemergencyRemind(TiketTimeoutDTO cfgTimeout) {
log.info("获取状态为非紧急且{}天未解决的工单", cfgTimeout.getNonemergency()); log.info("【工单超时提醒】获取状态为非紧急且{}天未解决的工单", cfgTimeout.getNonemergency());
List<Ticket> tickets = ticketService.getNonemergency(cfgTimeout.getNonemergency()); List<Ticket> tickets = ticketService.getNonemergency(cfgTimeout.getNonemergency());
log.info("共{}条数据", tickets.size()); log.info("【工单超时提醒】共{}条数据", tickets.size());
tickets.forEach(this::ticketHande); tickets.forEach(this::ticketHande);
} }
private void ticketHande(Ticket ticket) { private void ticketHande(Ticket ticket) {
AppUser createUser=appUserService.getById(ticket.getUserId()); AppUser createUser=appUserService.getById(ticket.getUserId());
//处理人 //处理人
List<Integer> adminUserIds = Arrays.stream(ticket.getHandle().split(",")) Set<Integer> adminUserIds = Arrays.stream(ticket.getHandle().split(","))
.map(Integer::parseInt) .map(Integer::parseInt)
.collect(Collectors.toList()); .collect(Collectors.toSet());
//CQM //CQM
adminUserIds.add(ticket.getCqm()); adminUserIds.add(ticket.getCqm());
//管理端关注人 //管理端关注人
@ -194,31 +198,32 @@ public class TicketScheduledTasks {
if (CollectionUtil.isNotEmpty(followUserIds)){ if (CollectionUtil.isNotEmpty(followUserIds)){
adminUserIds.addAll(followUserIds); adminUserIds.addAll(followUserIds);
} }
if (CollectionUtil.isNotEmpty(adminUserIds)) {
List<AdminUser> adminUsers = adminUserService.listByIds(adminUserIds); List<AdminUser> adminUsers = adminUserService.listByIds(adminUserIds);
String subject = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_TITLE_TICKET_TIMEOUT, Constant.DEFAULT_LANGUAGE_CODE); 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) String content = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_CONTENT_TICKET_NOTIFY, Constant.DEFAULT_LANGUAGE_CODE)
.replace("${no}", ticket.getNo()) .replace("${no}", ticket.getNo())
.replace("${title}", ticket.getTitle()) .replace("${title}", ticket.getTitle())
.replace("${createUser}", createUser.getName()) .replace("${createUser}", createUser.getName())
.replace("${handleUser}", StrUtil.join(",",adminUsers.stream().map(AdminUser::getUserName).collect(Collectors.toList()))) .replace("${handleUser}", StrUtil.join(",", adminUsers.stream().map(AdminUser::getUserName).collect(Collectors.toList())))
.replace("${createTime}", toTimeString(ticket.getCreateTime())) .replace("${createTime}", toTimeString(ticket.getCreateTime()))
.replace("${msg}", subject); .replace("${msg}", subject);
try { try {
sendEamilForAdminUser(adminUsers, subject, content); sendEamilForAdminUser(adminUsers, subject, content);
}catch (Exception e){ } catch (Exception e) {
log.error("邮件发送失败", e); log.error("【工单超时提醒】邮件发送失败", e);
}
} }
//客户端关注人 //客户端关注人
List<Integer> appUserIds=ticketFollowService.lambdaQuery() Set<Integer> appUserIds=ticketFollowService.lambdaQuery()
.eq(TicketFollow::getTicketId, ticket.getId()) .eq(TicketFollow::getTicketId, ticket.getId())
.eq(TicketFollow::getFrom, (byte) 0) .eq(TicketFollow::getFrom, (byte) 0)
.list() .list()
.stream() .stream()
.map(TicketFollow::getUserId) .map(TicketFollow::getUserId)
.collect(Collectors.toList()); .collect(Collectors.toSet());
appUserIds.add(ticket.getUserId());
List<AppUser> appUsers = appUserService.listByIds(appUserIds); List<AppUser> appUsers = appUserService.listByIds(appUserIds);
appUsers.add(createUser);
sendAppMessage(appUsers, ticket); sendAppMessage(appUsers, ticket);
} }
@ -231,6 +236,7 @@ public class TicketScheduledTasks {
private void sendAppMessage(List<AppUser> appUsers, Ticket ticket){ private void sendAppMessage(List<AppUser> appUsers, Ticket ticket){
for (AppUser appUser : appUsers){ for (AppUser appUser : appUsers){
log.info("【工单超时提醒】添加消息给{}({})",appUser.getName(),appUser.getId());
appMessageService.add(new AppMessage() appMessageService.add(new AppMessage()
.setUserId(appUser.getId()) .setUserId(appUser.getId())
.setTicketId(ticket.getId()) .setTicketId(ticket.getId())
@ -243,8 +249,18 @@ public class TicketScheduledTasks {
private void sendEamilForAdminUser(List<AdminUser> adminUsers,String subject,String content) throws MessagingException { private void sendEamilForAdminUser(List<AdminUser> adminUsers,String subject,String content) throws MessagingException {
if (CollectionUtil.isNotEmpty(adminUsers)){ if (CollectionUtil.isNotEmpty(adminUsers)){
for (AdminUser adminUser:adminUsers) { for (AdminUser adminUser:adminUsers) {
log.info("【工单超时提醒】发送邮件到{}",adminUser.getEmail());
emailService.sendEmail(adminUser.getEmail(),subject,content); emailService.sendEmail(adminUser.getEmail(),subject,content);
} }
} }
} }
private void sendEamilForAppUser(List<AppUser> 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);
}
}
}
} }

View File

@ -22,7 +22,7 @@ public class TicketAddRequest {
//标题 //标题
@NotBlank @NotBlank
@Size(max = 20, message = "标题长度不能超过20") @Size(max = 150, message = "标题长度不能超过150")
private String title; private String title;
//描述 //描述

View File

@ -122,12 +122,12 @@ public class TicketServiceImpl extends ServiceImpl<TicketMapper, Ticket> impleme
if (Objects.nonNull(request.getEndTime())) { if (Objects.nonNull(request.getEndTime())) {
request.setEndTime(request.getEndTime().plusDays(1)); request.setEndTime(request.getEndTime().plusDays(1));
} }
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(); Integer userId = AdminUserUtil.getUserId();
List<Integer> tickerMangagers = adminUserService.getTickerMangagers(); List<Integer> tickerMangagers = adminUserService.getTickerMangagers();
request.setTicketManager(tickerMangagers.stream().anyMatch(uid -> Objects.equals(uid, userId))); 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) {
return baseMapper.searchFromAdmin(request, userId, new Page<>(request.getPage(), request.getPageSize())); return baseMapper.searchFromAdmin(request, userId, new Page<>(request.getPage(), request.getPageSize()));
} }
return new Page<>(request.getPage(), request.getPageSize(), 0); return new Page<>(request.getPage(), request.getPageSize(), 0);

View File

@ -51,7 +51,7 @@
AND d.agent_code=#{request.agentCode} AND d.agent_code=#{request.agentCode}
</if> </if>
<if test="request.areaCode!=null and request.areaCode!=''"> <if test="request.areaCode!=null and request.areaCode!=''">
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
</if> </if>
<if test="request.question!=null and request.question!=''"> <if test="request.question!=null and request.question!=''">
AND t.question=#{request.question} AND t.question=#{request.question}
@ -219,7 +219,10 @@
FROM ticket t FROM ticket t
LEFT JOIN app_user u ON t.user_id=u.id LEFT JOIN app_user u ON t.user_id=u.id
LEFT JOIN app_area a2 ON u.area_id=a2.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
<if test="favouritesId>0">
AND tf.favorites_id=#{favouritesId}
</if>
LEFT JOIN device d ON t.device_no=d.device_no 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 t_base_device_type dt ON d.device_type=dt.device_type
LEFT JOIN dictionary_item di ON d.warranty_state=di.id LEFT JOIN dictionary_item di ON d.warranty_state=di.id