From b3ec09148fec6123b4cf90dc96b87f76bdcf7225 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E9=B9=8F=E9=A3=9E?= Date: Wed, 5 Feb 2025 13:14:52 +0800 Subject: [PATCH 1/3] =?UTF-8?q?perf:=20=E6=B7=BB=E5=8A=A0=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/controller/MessageController.java | 37 ++++++++++++++---- .../admin/controller/SSEController.java | 37 ++++++++++++++++++ .../admin/controller/TicketController.java | 11 ++---- .../service/impl/EmailINotifyPushService.java | 12 +++++- .../service/impl/SSEINotifyPushService.java | 9 ++++- .../service/impl/WXINotifyPushService.java | 11 ++++++ .../cfs/controller/AreaController.java | 4 +- .../cfs/controller/MessageController.java | 32 +++++++++++----- .../common/constant/Constant.java | 13 +++++-- .../pojo/request/TicketSearchRequest.java | 10 ++--- .../common/pojo/vo/AdminMessageVO.java | 32 ++++++++++++++++ .../common/pojo/vo/AdminTicketVO.java | 24 ++++++++++++ .../common/util/LanguageUtil.java | 22 +++++++++++ .../repository/entity/Ticket.java | 10 ++++- .../repository/mapper/AdminMessageMapper.java | 2 +- .../mapper/DictionaryItemTranslateMapper.java | 2 + .../repository/mapper/TicketMapper.java | 4 +- .../service/IAdminMessageService.java | 7 ++-- .../repository/service/IAdminUserService.java | 2 + .../service/IAppMessageService.java | 5 ++- .../IDictionaryItemTranslateService.java | 2 + .../repository/service/ITicketService.java | 4 +- .../service/impl/AdminMessageServiceImpl.java | 13 ++++++- .../service/impl/AdminUserServiceImpl.java | 15 ++++++++ .../service/impl/AppAreaServiceImpl.java | 6 +-- .../service/impl/AppMessageServiceImpl.java | 8 ++++ .../DictionaryItemTranslateServiceImpl.java | 5 +++ .../service/impl/TicketServiceImpl.java | 38 +++++++++++++------ .../resources/mapper/AdminMessageMapper.xml | 8 ++-- .../mapper/DictionaryItemTranslateMapper.xml | 7 ++++ .../main/resources/mapper/TicketMapper.xml | 28 +++++++++++--- 31 files changed, 342 insertions(+), 78 deletions(-) create mode 100644 nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/SSEController.java create mode 100644 nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/util/LanguageUtil.java diff --git a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/MessageController.java b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/MessageController.java index 3fe49b50..b415a5b7 100644 --- a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/MessageController.java +++ b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/MessageController.java @@ -1,13 +1,16 @@ package com.nflg.mobilebroken.admin.controller; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.nflg.mobilebroken.common.constant.Constant; import com.nflg.mobilebroken.common.pojo.ApiResult; import com.nflg.mobilebroken.common.pojo.PageData; import com.nflg.mobilebroken.common.pojo.request.AdminMessageSearchRequest; import com.nflg.mobilebroken.common.pojo.vo.AdminMessageVO; +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.service.IAdminMessageService; +import com.nflg.mobilebroken.repository.service.IAdminUserService; import com.nflg.mobilebroken.starter.annotation.MethodInfoMark; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -17,6 +20,7 @@ import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import javax.validation.Valid; import java.util.List; +import java.util.stream.Collectors; /** * 消息相关接口 @@ -30,6 +34,9 @@ public class MessageController extends ControllerBase { @Resource private IAdminMessageService adminMessageService; + @Resource + private IAdminUserService adminUserService; + /** * 搜索消息 * @@ -39,11 +46,15 @@ public class MessageController extends ControllerBase { @PostMapping("searchMessages") @MethodInfoMark(value = "搜索消息", menuName = "消息管理") public ApiResult> searchMessages(@RequestBody AdminMessageSearchRequest request) { - IPage page = new Page<>(); - page.setCurrent(request.getPage()); - page.setSize(request.getPageSize()); - adminMessageService.search(Constant.USER_ID, request, page); - return ApiResult.success(page); + IPage pageData = adminMessageService.search(AdminUserUtil.getUserId(), request); + PageUtil.convert(pageData, d -> { + d.setTicketHandleBy(adminUserService.listByIds(StrUtil.split(",", d.getTicketHandleByIds())) + .stream() + .map(AdminUser::getUserName) + .collect(Collectors.toList())); + return d; + }); + return ApiResult.success(pageData); } /** @@ -57,4 +68,16 @@ public class MessageController extends ControllerBase { adminMessageService.setReaded(ids); return ApiResult.success(); } + + /** + * 设置消息未读 + * + * @param ids 消息id列表 + */ + @PostMapping("setNotRead") + @MethodInfoMark(value = "设置消息未读", menuName = "消息管理") + public ApiResult setNotRead(@Valid @RequestBody List ids) { + adminMessageService.setNotRead(ids); + return ApiResult.success(); + } } diff --git a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/SSEController.java b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/SSEController.java new file mode 100644 index 00000000..a08cf16b --- /dev/null +++ b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/SSEController.java @@ -0,0 +1,37 @@ +package com.nflg.mobilebroken.admin.controller; + +import com.nflg.mobilebroken.common.constant.STATE; +import com.nflg.mobilebroken.common.exception.NflgException; +import com.nflg.mobilebroken.starter.service.impl.AdminSSEManagerService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; + +import javax.annotation.Resource; +import java.io.IOException; + +@RestController +@Slf4j +@RequestMapping("/sse") +public class SSEController extends ControllerBase { + + @Resource + private AdminSSEManagerService adminSSEManagerService; + + @GetMapping(value = "connect", produces = MediaType.TEXT_EVENT_STREAM_VALUE) + public SseEmitter connect(@RequestParam String userId) { + SseEmitter sse = adminSSEManagerService.connect(userId); + try { + sse.send("您已连接"); + } catch (IOException e) { + log.error("sse发送数据出错", e); + sse.complete(); + throw new NflgException(STATE.BusinessError, "sse发送数据出错"); + } + return sse; + } +} \ No newline at end of file diff --git a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/TicketController.java b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/TicketController.java index d681f4e1..75ede310 100644 --- a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/TicketController.java +++ b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/TicketController.java @@ -1,13 +1,12 @@ package com.nflg.mobilebroken.admin.controller; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.nflg.mobilebroken.common.pojo.ApiResult; import com.nflg.mobilebroken.common.pojo.PageData; import com.nflg.mobilebroken.common.pojo.request.AdminTicketSearchRequest; import com.nflg.mobilebroken.common.pojo.request.AssignmentTicketRequest; import com.nflg.mobilebroken.common.pojo.vo.AdminTicketVO; import com.nflg.mobilebroken.common.util.EecExcelUtil; +import com.nflg.mobilebroken.common.util.PageUtil; import com.nflg.mobilebroken.repository.service.ITicketService; import com.nflg.mobilebroken.starter.annotation.MethodInfoMark; import lombok.extern.slf4j.Slf4j; @@ -43,11 +42,7 @@ public class TicketController extends ControllerBase { @PostMapping("searchTicket") @MethodInfoMark(value = "搜索工单", menuName = "工单管理") public ApiResult> searchTicket(@RequestBody AdminTicketSearchRequest request) { - IPage page = new Page<>(); - page.setCurrent(request.getPageNum()); - page.setSize(request.getPageSize()); - ticketService.search(request, page); - return ApiResult.success(page); + return ApiResult.success(PageUtil.convert(ticketService.searchPage(request), d -> d)); } /** @@ -58,7 +53,7 @@ public class TicketController extends ControllerBase { @PostMapping("exportSearchTicket") @MethodInfoMark(value = "导出搜索工单", menuName = "工单管理") public void exportSearchTicket(HttpServletResponse response, @RequestBody AdminTicketSearchRequest request) throws IOException { - List datas = ticketService.search(request); + List datas = ticketService.exportSearch(request); EecExcelUtil.export("工单", "sheet1", datas, response); } diff --git a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/service/impl/EmailINotifyPushService.java b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/service/impl/EmailINotifyPushService.java index 57206218..d2c4715b 100644 --- a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/service/impl/EmailINotifyPushService.java +++ b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/service/impl/EmailINotifyPushService.java @@ -1,15 +1,18 @@ package com.nflg.mobilebroken.admin.service.impl; import cn.hutool.core.util.StrUtil; +import com.nflg.mobilebroken.common.constant.Constant; import com.nflg.mobilebroken.common.constant.STATE; import com.nflg.mobilebroken.common.exception.NflgException; import com.nflg.mobilebroken.common.pojo.dto.UserDTO; import com.nflg.mobilebroken.starter.service.EmailService; import com.nflg.mobilebroken.starter.service.INotifyPushService; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.util.Objects; @Service @Slf4j @@ -18,6 +21,9 @@ public class EmailINotifyPushService implements INotifyPushService { @Resource private EmailService emailService; + @Resource + private RedisTemplate redisTemplate; + @Override public void push(UserDTO user, String subject, String content) { try { @@ -30,6 +36,10 @@ public class EmailINotifyPushService implements INotifyPushService { @Override public boolean check(UserDTO user) { - return StrUtil.isNotBlank(user.getEmail()); + Object value = redisTemplate.opsForHash().get("message:config:" + user.getId(), Constant.REDIS_KEY_MESSAGECONFIG_EMAIL); + if (Objects.isNull(value) || (boolean) value) { + return StrUtil.isNotBlank(user.getEmail()); + } + return false; } } diff --git a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/service/impl/SSEINotifyPushService.java b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/service/impl/SSEINotifyPushService.java index 574994a3..c8bdfd09 100644 --- a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/service/impl/SSEINotifyPushService.java +++ b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/service/impl/SSEINotifyPushService.java @@ -1,14 +1,17 @@ package com.nflg.mobilebroken.admin.service.impl; +import com.nflg.mobilebroken.common.constant.Constant; import com.nflg.mobilebroken.common.pojo.dto.UserDTO; import com.nflg.mobilebroken.starter.service.INotifyPushService; import com.nflg.mobilebroken.starter.service.SSEManagerService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.io.IOException; +import java.util.Objects; @Service @Slf4j @@ -18,6 +21,9 @@ public class SSEINotifyPushService implements INotifyPushService { @Qualifier("APPSSEManagerService") private SSEManagerService sseManagerService; + @Resource + private RedisTemplate redisTemplate; + @Override public void push(UserDTO user, String subject, String content) { try { @@ -29,6 +35,7 @@ public class SSEINotifyPushService implements INotifyPushService { @Override public boolean check(UserDTO user) { - return true; + Object value = redisTemplate.opsForHash().get("message:config:" + user.getId(), Constant.REDIS_KEY_MESSAGECONFIG_APP); + return Objects.isNull(value) || (boolean) value; } } diff --git a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/service/impl/WXINotifyPushService.java b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/service/impl/WXINotifyPushService.java index 34dbb8d2..81de50b5 100644 --- a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/service/impl/WXINotifyPushService.java +++ b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/service/impl/WXINotifyPushService.java @@ -1,14 +1,18 @@ package com.nflg.mobilebroken.admin.service.impl; +import cn.hutool.core.util.StrUtil; +import com.nflg.mobilebroken.common.constant.Constant; import com.nflg.mobilebroken.common.pojo.dto.UserDTO; import com.nflg.mobilebroken.starter.service.INotifyPushService; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.config.WxMpConfigStorage; import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.util.Objects; @Service @Slf4j @@ -23,6 +27,9 @@ public class WXINotifyPushService implements INotifyPushService { @Resource private WxMpConfigStorage wxMpConfigStorage; + @Resource + private RedisTemplate redisTemplate; + @Override public void push(UserDTO user,String subject, String content) { //TODO @@ -42,6 +49,10 @@ public class WXINotifyPushService implements INotifyPushService { @Override public boolean check(UserDTO user) { + Object value = redisTemplate.opsForHash().get("message:config:" + user.getId(), Constant.REDIS_KEY_MESSAGECONFIG_WX); + if (Objects.isNull(value) || (boolean) value) { + return StrUtil.isNotBlank(user.getWxOpenId()); + } return false; } } diff --git a/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/AreaController.java b/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/AreaController.java index b35873fb..2a3fd66c 100644 --- a/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/AreaController.java +++ b/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/AreaController.java @@ -2,7 +2,6 @@ package com.nflg.mobilebroken.cfs.controller; import cn.hutool.core.convert.Convert; import com.baomidou.mybatisplus.core.metadata.IPage; -import com.nflg.mobilebroken.common.constant.Constant; import com.nflg.mobilebroken.common.pojo.ApiResult; import com.nflg.mobilebroken.common.pojo.PageData; import com.nflg.mobilebroken.common.pojo.request.AreaSaveRequest; @@ -10,6 +9,7 @@ import com.nflg.mobilebroken.common.pojo.request.AreaSearchRequest; import com.nflg.mobilebroken.common.pojo.request.EnableRequest; import com.nflg.mobilebroken.common.pojo.vo.AreaSimpleVO; import com.nflg.mobilebroken.common.pojo.vo.AreaVO; +import com.nflg.mobilebroken.common.util.AppUserUtil; import com.nflg.mobilebroken.repository.entity.AppArea; import com.nflg.mobilebroken.repository.service.IAppAreaService; import org.springframework.web.bind.annotation.*; @@ -84,7 +84,7 @@ public class AreaController extends ControllerBase { AppArea area=new AppArea() .setId(request.getId()) .setEnable(request.getEnable()) - .setUpdateBy(Constant.USER_NAME) + .setUpdateBy(AppUserUtil.getUserName()) .setUpdateTime(LocalDateTime.now()); return ApiResult.success(appAreaService.updateById(area)); } diff --git a/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/MessageController.java b/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/MessageController.java index b2113d9c..16b49614 100644 --- a/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/MessageController.java +++ b/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/MessageController.java @@ -9,6 +9,7 @@ import com.nflg.mobilebroken.common.pojo.request.AppMessageSearchRequest; import com.nflg.mobilebroken.common.pojo.request.MessageConfigRequest; import com.nflg.mobilebroken.common.pojo.vo.AppMessageVO; import com.nflg.mobilebroken.common.pojo.vo.MessageConfigVO; +import com.nflg.mobilebroken.common.util.AppUserUtil; import com.nflg.mobilebroken.repository.service.IAppMessageService; import org.springframework.data.redis.core.HashOperations; import org.springframework.data.redis.core.RedisTemplate; @@ -45,7 +46,7 @@ public class MessageController extends ControllerBase { IPage page = new Page<>(); page.setCurrent(request.getPage()); page.setSize(request.getPageSize()); - appMessageService.search(Constant.USER_ID, request.getTitle(), page); + appMessageService.search(AppUserUtil.getUserId(), request.getTitle(), page); return ApiResult.success(page); } @@ -60,6 +61,17 @@ public class MessageController extends ControllerBase { return ApiResult.success(); } + /** + * 设置消息未读 + * + * @param ids 消息id列表 + */ + @PostMapping("setNotRead") + public ApiResult setNotRead(@Valid @RequestBody List ids) { + appMessageService.setNotRead(ids); + return ApiResult.success(); + } + /** * 获取未读消息 * @param num 获取未读消息的数量 @@ -70,7 +82,7 @@ public class MessageController extends ControllerBase { IPage page = new Page<>(); page.setCurrent(1); page.setSize(num); - appMessageService.getNotReadMessage(Constant.USER_ID, num, page); + appMessageService.getNotReadMessage(AppUserUtil.getUserId(), num, page); return ApiResult.success(page); } @@ -81,11 +93,11 @@ public class MessageController extends ControllerBase { @GetMapping("getConfig") public ApiResult getConfig(){ HashOperations hashOps = redisTemplate.opsForHash(); - Map maps=hashOps.entries("message:config:" + Constant.USER_ID); + Map maps = hashOps.entries("message:config:" + AppUserUtil.getUserId()); return ApiResult.success(new MessageConfigVO() - .setAppNotifyEnabled((Boolean) maps.getOrDefault("appNotifyEnabled",true)) - .setEmailNotifyEnabled((Boolean) maps.getOrDefault("emailNotifyEnabled",true)) - .setWxNotifyEnabled((Boolean) maps.getOrDefault("wxNotifyEnabled",true)) + .setAppNotifyEnabled((Boolean) maps.getOrDefault(Constant.REDIS_KEY_MESSAGECONFIG_APP, true)) + .setEmailNotifyEnabled((Boolean) maps.getOrDefault(Constant.REDIS_KEY_MESSAGECONFIG_EMAIL, true)) + .setWxNotifyEnabled((Boolean) maps.getOrDefault(Constant.REDIS_KEY_MESSAGECONFIG_WX, true)) ); } @@ -96,11 +108,11 @@ public class MessageController extends ControllerBase { @PostMapping("setConfig") public ApiResult setConfig(@Valid @RequestBody MessageConfigRequest request) { Map maps = new HashMap<>(); - maps.put("wxNotifyEnabled", request.isWxNotifyEnabled()); - maps.put("emailNotifyEnabled", request.isEmailNotifyEnabled()); - maps.put("appNotifyEnabled", request.isAppNotifyEnabled()); + maps.put(Constant.REDIS_KEY_MESSAGECONFIG_WX, request.isWxNotifyEnabled()); + maps.put(Constant.REDIS_KEY_MESSAGECONFIG_EMAIL, request.isEmailNotifyEnabled()); + maps.put(Constant.REDIS_KEY_MESSAGECONFIG_APP, request.isAppNotifyEnabled()); HashOperations operations = redisTemplate.opsForHash(); - operations.putAll("message:config:" + Constant.USER_ID, maps); + operations.putAll("message:config:" + AppUserUtil.getUserId(), maps); return ApiResult.success(); } } 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 41643a19..52deb74a 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 @@ -2,13 +2,18 @@ package com.nflg.mobilebroken.common.constant; public class Constant { - public static final String USER_NAME="admin"; - public static final Integer USER_ID=1; - //字典 类型 用户职位 public static final String DICTIONARY_TYPE_TITLE="UserTitle"; - public static final String DICTIONARY_TYPE_LANGUAGE="Language"; + public static final String DICTIONARY_TYPE_TITLE_CQM = "CQM"; public static final String REDIS_KEY_USER_UPDATE_KAPTCHA = "kaptcha:userupdate:{}"; + + public static final String DICTIONARY_TYPE_SYSTEMERROR_CQMNOTCONFIG = "CQMNotConfig"; + + public static final String REDIS_KEY_MESSAGECONFIG_WX = "wxNotifyEnabled"; + + public static final String REDIS_KEY_MESSAGECONFIG_EMAIL = "emailNotifyEnabled"; + + public static final String REDIS_KEY_MESSAGECONFIG_APP = "appNotifyEnabled"; } diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/TicketSearchRequest.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/TicketSearchRequest.java index ad184dbb..473dfac2 100644 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/TicketSearchRequest.java +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/TicketSearchRequest.java @@ -1,12 +1,14 @@ package com.nflg.mobilebroken.common.pojo.request; import lombok.Data; +import lombok.EqualsAndHashCode; import javax.validation.constraints.NotNull; import java.time.LocalDateTime; +@EqualsAndHashCode(callSuper = false) @Data -public class TicketSearchRequest { +public class TicketSearchRequest extends PageRequest { //搜索类型,1: 我的工单,2: 我的关注,3: 区域工单 @NotNull(message = "搜索类型不能为空") @@ -32,10 +34,4 @@ public class TicketSearchRequest { //结束日期 private LocalDateTime endTime; - - //页码 - private Integer pageNum=1; - - //每页数量 - private Integer pageSize=10; } diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/AdminMessageVO.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/AdminMessageVO.java index db56d854..bef38940 100644 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/AdminMessageVO.java +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/AdminMessageVO.java @@ -1,14 +1,28 @@ package com.nflg.mobilebroken.common.pojo.vo; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.nflg.mobilebroken.common.constant.MessageType; import lombok.Data; import lombok.experimental.Accessors; +import java.time.LocalDateTime; +import java.util.List; + @Data @Accessors(chain = true) public class AdminMessageVO { + //任务id + private Integer ticketId; + + //任务编号 + private String ticketNo; + + //任务事项 + private String content; + //任务类别 + @JsonIgnore private Integer type; //任务类别名称 @@ -17,4 +31,22 @@ public class AdminMessageVO { public String getTypeName() { return MessageType.findByValue(type).getDescription(); } + + //消息时间 + private LocalDateTime createTime; + + //提交人 + private String createUserName; + + //任务提交时间 + private LocalDateTime ticketCreateTime; + + @JsonIgnore + private String ticketHandleByIds; + + //待处理人 + private List ticketHandleBy; + + //是否已读 + private boolean isRead; } diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/AdminTicketVO.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/AdminTicketVO.java index 4b1f7224..2291f72a 100644 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/AdminTicketVO.java +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/AdminTicketVO.java @@ -34,77 +34,101 @@ public class AdminTicketVO { //解决状态 @ExcelColumn("解决状态") private String stateDesc; + //紧急程度 @IgnoreExport @JsonIgnore private Integer urgency; + //紧急程度 @ExcelColumn("紧急程度") private String urgencyDesc; + //问题部位 @ExcelColumn("问题部位") private String component; + //问题类型 @ExcelColumn("问题类型") private String question; + //解决方案 @ExcelColumn("解决方案") private String solution; + //区域名称 @ExcelColumn("区域") private String areaName; + //代理商名称 @ExcelColumn("代理商") private String companyName; + //客户 @ExcelColumn("客户") private String createUserName; + //设备编号 @ExcelColumn("设备编号") private String deviceNo; + //设备类型 @ExcelColumn("设备类型") private String deviceType; + //设备机型 @ExcelColumn("设备机型") private String equipmentModel; + //发货日期 @ExcelColumn("发货日期") private String shipmentDate; + //使用时长 @ExcelColumn("使用时长(小时)") private Integer useTime; + //质保状态 @ExcelColumn("质保状态") private String warrantyStatusDesc; + //提交时间 @ExcelColumn("提交时间") private LocalDateTime createTime; + //提交人 @ExcelColumn("提交人") private String createBy; + //所属CQM @ExcelColumn("所属CQM") private String cqm; + //处理人 @JsonIgnore @IgnoreExport private String handle; + //处理人 @ExcelColumn("处理人") private List handleBy; + //当前处理人 @ExcelColumn("当前处理人") private List currentProcessor; + //处理完成时间 @ExcelColumn("处理完成时间") private LocalDateTime solveTime; + //关闭时间 @ExcelColumn("关闭时间") private LocalDateTime closeTime; + //是否已关注 @IgnoreExport private boolean followed; + @ExcelColumn("关注") private String followedDesc; diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/util/LanguageUtil.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/util/LanguageUtil.java new file mode 100644 index 00000000..7a7ad05f --- /dev/null +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/util/LanguageUtil.java @@ -0,0 +1,22 @@ +package com.nflg.mobilebroken.common.util; + +public class LanguageUtil { + + private static final ThreadLocal threadLocal = new ThreadLocal<>(); + + public static String getLanguage() { + String language = threadLocal.get(); + if (language == null) { + language = "cn"; + } + return language; + } + + public static void setLanguage(String language) { + threadLocal.set(language); + } + + public static void clear() { + threadLocal.remove(); + } +} diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/Ticket.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/Ticket.java index 6f6535d2..d599de80 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/Ticket.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/Ticket.java @@ -2,12 +2,13 @@ package com.nflg.mobilebroken.repository.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; -import java.io.Serializable; -import java.time.LocalDateTime; import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; +import java.io.Serializable; +import java.time.LocalDateTime; + /** *

* 工单 @@ -76,6 +77,11 @@ public class Ticket implements Serializable { */ private LocalDateTime createTime; + /** + * 所属CQM + */ + private Integer cqm; + /** * 紧急程度,0:非紧急;1:普通;2:紧急 */ diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/AdminMessageMapper.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/AdminMessageMapper.java index b8006ffb..6acc3601 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/AdminMessageMapper.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/AdminMessageMapper.java @@ -16,5 +16,5 @@ import com.nflg.mobilebroken.repository.entity.AdminMessage; */ public interface AdminMessageMapper extends BaseMapper { - void search(Integer userId, AdminMessageSearchRequest request, IPage page); + IPage search(Integer userId, AdminMessageSearchRequest request, IPage page); } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/DictionaryItemTranslateMapper.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/DictionaryItemTranslateMapper.java index 768b9661..042ac509 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/DictionaryItemTranslateMapper.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/DictionaryItemTranslateMapper.java @@ -20,4 +20,6 @@ public interface DictionaryItemTranslateMapper extends BaseMapper getListByDictionaryItemId(Integer id); List getTitles(String language); + + String getErrorMsg(String language, String errorCode); } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/TicketMapper.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/TicketMapper.java index 5efd605f..063c55b4 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/TicketMapper.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/TicketMapper.java @@ -26,7 +26,7 @@ public interface TicketMapper extends BaseMapper { IPage searchArea(IPage page, TicketSearchRequest request, List companyIds); - void searchFromAdmin(AdminTicketSearchRequest request, IPage page); + IPage searchFromAdmin(AdminTicketSearchRequest request, IPage page); void completeTicket(List ids, Integer userId); @@ -34,7 +34,7 @@ public interface TicketMapper extends BaseMapper { List searchAllFromAdmin(AdminTicketSearchRequest request); - void searchFromAdminAndFollow(AdminTicketSearchRequest request, Integer userId, IPage page); + IPage searchFromAdminAndFollow(AdminTicketSearchRequest request, Integer userId, IPage page); List searchAllFromAdminAndFollow(AdminTicketSearchRequest request, Integer userId); } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IAdminMessageService.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IAdminMessageService.java index c284d8b5..64e7f88f 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IAdminMessageService.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IAdminMessageService.java @@ -6,7 +6,6 @@ import com.nflg.mobilebroken.common.pojo.request.AdminMessageSearchRequest; import com.nflg.mobilebroken.common.pojo.vo.AdminMessageVO; import com.nflg.mobilebroken.repository.entity.AdminMessage; -import javax.validation.Valid; import java.util.List; /** @@ -19,7 +18,9 @@ import java.util.List; */ public interface IAdminMessageService extends IService { - void search(Integer userId, AdminMessageSearchRequest request, IPage page); + IPage search(Integer userId, AdminMessageSearchRequest request); - void setReaded(@Valid List ids); + void setReaded(List ids); + + void setNotRead(List ids); } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IAdminUserService.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IAdminUserService.java index 4f299cf6..37f1cff3 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IAdminUserService.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IAdminUserService.java @@ -28,4 +28,6 @@ public interface IAdminUserService extends IService { void enable(EnableAccountRequest request); PageData search(SearchAccountRequest request); + + AdminUser getCQM(); } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IAppMessageService.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IAppMessageService.java index bf81caef..ddb0a9bc 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IAppMessageService.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IAppMessageService.java @@ -5,7 +5,6 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.nflg.mobilebroken.common.pojo.vo.AppMessageVO; import com.nflg.mobilebroken.repository.entity.AppMessage; -import javax.validation.Valid; import java.util.List; /** @@ -22,5 +21,7 @@ public interface IAppMessageService extends IService { void search(Integer userId, String title, IPage page); - void setReaded(@Valid List ids); + void setReaded(List ids); + + void setNotRead(List ids); } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IDictionaryItemTranslateService.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IDictionaryItemTranslateService.java index 685234a4..9fc93cef 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IDictionaryItemTranslateService.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IDictionaryItemTranslateService.java @@ -25,4 +25,6 @@ public interface IDictionaryItemTranslateService extends IService getTitles(String language); + + String getErrorMsg(String language, String errorCode); } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/ITicketService.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/ITicketService.java index 48d1558b..d4a43ecf 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/ITicketService.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/ITicketService.java @@ -27,7 +27,7 @@ public interface ITicketService extends IService { IPage search(TicketSearchRequest request, UserDTO user); - void search(AdminTicketSearchRequest request, IPage page); + IPage searchPage(AdminTicketSearchRequest request); void assignmentTicket(AssignmentTicketRequest request); @@ -35,7 +35,7 @@ public interface ITicketService extends IService { void closeTicket(List ids); - List search(AdminTicketSearchRequest request); + List exportSearch(AdminTicketSearchRequest request); List getEmergencys(int days); diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AdminMessageServiceImpl.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AdminMessageServiceImpl.java index b5c0ea53..fc23f36a 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AdminMessageServiceImpl.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AdminMessageServiceImpl.java @@ -1,6 +1,7 @@ package com.nflg.mobilebroken.repository.service.impl; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.nflg.mobilebroken.common.pojo.request.AdminMessageSearchRequest; import com.nflg.mobilebroken.common.pojo.vo.AdminMessageVO; @@ -23,8 +24,8 @@ import java.util.List; public class AdminMessageServiceImpl extends ServiceImpl implements IAdminMessageService { @Override - public void search(Integer userId, AdminMessageSearchRequest request, IPage page) { - baseMapper.search(userId, request, page); + public IPage search(Integer userId, AdminMessageSearchRequest request) { + return baseMapper.search(userId, request, new Page<>(request.getPage(), request.getPageSize())); } @Override @@ -34,4 +35,12 @@ public class AdminMessageServiceImpl extends ServiceImpl ids) { + lambdaUpdate() + .set(AdminMessage::getIsRead, false) + .in(AdminMessage::getId, ids) + .update(); + } } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AdminUserServiceImpl.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AdminUserServiceImpl.java index 3170da54..f93bab46 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AdminUserServiceImpl.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AdminUserServiceImpl.java @@ -5,6 +5,7 @@ import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.nflg.mobilebroken.common.constant.Constant; import com.nflg.mobilebroken.common.pojo.PageData; import com.nflg.mobilebroken.common.pojo.request.AccountAddRequest; import com.nflg.mobilebroken.common.pojo.request.AccountUpdateRequest; @@ -51,6 +52,9 @@ public class AdminUserServiceImpl extends ServiceImpl impl @Override public boolean saveOrUpdate(AppArea entity) { if (Objects.isNull(entity.getId()) || entity.getId()<=0){ - entity.setCreateBy(Constant.USER_NAME); + entity.setCreateBy(AppUserUtil.getUserName()); entity.setCreateTime(LocalDateTime.now()); return save(entity); }else { - entity.setUpdateBy(Constant.USER_NAME); + entity.setUpdateBy(AppUserUtil.getUserName()); entity.setUpdateTime(LocalDateTime.now()); return updateById(entity); } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AppMessageServiceImpl.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AppMessageServiceImpl.java index b4cd196d..72ac98ed 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AppMessageServiceImpl.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AppMessageServiceImpl.java @@ -38,4 +38,12 @@ public class AppMessageServiceImpl extends ServiceImpl ids) { + lambdaUpdate() + .set(AppMessage::getIsRead, false) + .in(AppMessage::getId, ids) + .update(); + } } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/DictionaryItemTranslateServiceImpl.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/DictionaryItemTranslateServiceImpl.java index 1f226684..4319064c 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/DictionaryItemTranslateServiceImpl.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/DictionaryItemTranslateServiceImpl.java @@ -86,4 +86,9 @@ public class DictionaryItemTranslateServiceImpl extends ServiceImpl getTitles(String language) { return baseMapper.getTitles(language); } + + @Override + public String getErrorMsg(String language, String errorCode) { + return baseMapper.getErrorMsg(language, errorCode); + } } 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 573b8428..92a5b8e1 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 @@ -4,6 +4,7 @@ import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.nflg.mobilebroken.common.constant.Constant; import com.nflg.mobilebroken.common.constant.TicketState; import com.nflg.mobilebroken.common.constant.TicketUrgency; import com.nflg.mobilebroken.common.pojo.dto.UserDTO; @@ -14,13 +15,18 @@ import com.nflg.mobilebroken.common.pojo.request.TicketSearchRequest; import com.nflg.mobilebroken.common.pojo.vo.AdminTicketVO; import com.nflg.mobilebroken.common.pojo.vo.TicketVO; import com.nflg.mobilebroken.common.util.AdminUserUtil; +import com.nflg.mobilebroken.common.util.LanguageUtil; import com.nflg.mobilebroken.common.util.TicketUtl; import com.nflg.mobilebroken.common.util.VUtils; +import com.nflg.mobilebroken.repository.entity.AdminUser; import com.nflg.mobilebroken.repository.entity.Ticket; import com.nflg.mobilebroken.repository.mapper.TicketMapper; +import com.nflg.mobilebroken.repository.service.IAdminUserService; +import com.nflg.mobilebroken.repository.service.IDictionaryItemTranslateService; import com.nflg.mobilebroken.repository.service.ITicketService; import org.springframework.stereotype.Service; +import javax.annotation.Resource; import java.time.LocalDateTime; import java.util.List; import java.util.Objects; @@ -36,14 +42,23 @@ import java.util.Objects; @Service public class TicketServiceImpl extends ServiceImpl implements ITicketService { + @Resource + private IAdminUserService adminUserService; + + @Resource + private IDictionaryItemTranslateService dictionaryItemTranslateService; + @Override public void add(TicketAddRequest request,Integer userId) { + AdminUser cqmUser = adminUserService.getCQM(); + VUtils.trueThrowBusinessError(Objects.isNull(cqmUser)) + .throwMessage(dictionaryItemTranslateService.getErrorMsg(LanguageUtil.getLanguage(), Constant.DICTIONARY_TYPE_SYSTEMERROR_CQMNOTCONFIG)); Ticket lastTicket=lambdaQuery() .ge(Ticket::getCreateTime, LocalDateTime.now().toLocalDate()) .orderByDesc(Ticket::getId) .last("LIMIT 1") .one(); - String no=lastTicket==null? TicketUtl.getNextNo(null):TicketUtl.getNextNo(lastTicket.getNo()); + String no = lastTicket == null ? TicketUtl.getNextNo(null) : TicketUtl.getNextNo(lastTicket.getNo()); Ticket ticket = new Ticket() .setNo(no) .setDeviceNo(request.getDeviceNo()) @@ -51,31 +66,32 @@ public class TicketServiceImpl extends ServiceImpl impleme .setUseTime(request.getUseTime()) .setTitle(request.getTitle()) .setDescription(request.getDescription()) - .setAttachments(StrUtil.join(",",request.getAttachments())) - .setState(TicketState.PendingProcessing.getState().byteValue()) + .setAttachments(StrUtil.join(",", request.getAttachments())) + .setState(TicketState.PendingProcessing.getState()) .setUserId(userId) - .setCreateTime(LocalDateTime.now()); + .setCreateTime(LocalDateTime.now()) + .setCqm(cqmUser.getId()); save(ticket); } @Override public IPage search(TicketSearchRequest request, UserDTO user) { if (request.getType()==1){ - return baseMapper.searchMy(new Page<>(request.getPageNum(), request.getPageSize()), request, user.getId()); + return baseMapper.searchMy(new Page<>(request.getPage(), request.getPageSize()), request, user.getId()); }else if (request.getType()==2){ - return baseMapper.searchFollow(new Page<>(request.getPageNum(), request.getPageSize()), request, user.getId()); + return baseMapper.searchFollow(new Page<>(request.getPage(), request.getPageSize()), request, user.getId()); }else if (request.getType()==3) { - return baseMapper.searchArea(new Page<>(request.getPageNum(), request.getPageSize()), request, user.getCompanyIds()); + return baseMapper.searchArea(new Page<>(request.getPage(), request.getPageSize()), request, user.getCompanyIds()); } return null; } @Override - public void search(AdminTicketSearchRequest request, IPage page) { + public IPage searchPage(AdminTicketSearchRequest request) { if (request.getType() == 2) { - baseMapper.searchFromAdminAndFollow(request, AdminUserUtil.getUserId(), page); + return baseMapper.searchFromAdminAndFollow(request, AdminUserUtil.getUserId(), new Page<>(request.getPage(), request.getPageSize())); } else { - baseMapper.searchFromAdmin(request, page); + return baseMapper.searchFromAdmin(request, new Page<>(request.getPage(), request.getPageSize())); } } @@ -105,7 +121,7 @@ public class TicketServiceImpl extends ServiceImpl impleme } @Override - public List search(AdminTicketSearchRequest request) { + public List exportSearch(AdminTicketSearchRequest request) { if (request.getType() == 2) { return baseMapper.searchAllFromAdminAndFollow(request, AdminUserUtil.getUserId()); } else { diff --git a/nflg-mobilebroken-repository/src/main/resources/mapper/AdminMessageMapper.xml b/nflg-mobilebroken-repository/src/main/resources/mapper/AdminMessageMapper.xml index ab67d820..01c5283a 100644 --- a/nflg-mobilebroken-repository/src/main/resources/mapper/AdminMessageMapper.xml +++ b/nflg-mobilebroken-repository/src/main/resources/mapper/AdminMessageMapper.xml @@ -2,10 +2,10 @@ - + SELECT t.id AS 'ticketId',t.`no` AS 'ticketNo',m.content,m.type,m.create_time AS 'createTime', + u.`name` AS 'createUserName',t.create_time AS 'ticketCreateTime',t.handle AS 'ticketHandleByIds', + m.is_read AS 'isRead' FROM admin_message m INNER JOIN ticket t ON m.ticket_id=t.id INNER JOIN admin_user u ON t.user_id=u.id diff --git a/nflg-mobilebroken-repository/src/main/resources/mapper/DictionaryItemTranslateMapper.xml b/nflg-mobilebroken-repository/src/main/resources/mapper/DictionaryItemTranslateMapper.xml index 98d451e8..417069c2 100644 --- a/nflg-mobilebroken-repository/src/main/resources/mapper/DictionaryItemTranslateMapper.xml +++ b/nflg-mobilebroken-repository/src/main/resources/mapper/DictionaryItemTranslateMapper.xml @@ -19,4 +19,11 @@ LEFT JOIN dictionary_item_translate dit ON di.id=dit.dictionary_item_id WHERE d.`code`=#{Constant.DICTIONARY_TYPE_TITLE} AND dit.language_code=#{language} + + diff --git a/nflg-mobilebroken-repository/src/main/resources/mapper/TicketMapper.xml b/nflg-mobilebroken-repository/src/main/resources/mapper/TicketMapper.xml index 29c4f8eb..0157f10a 100644 --- a/nflg-mobilebroken-repository/src/main/resources/mapper/TicketMapper.xml +++ b/nflg-mobilebroken-repository/src/main/resources/mapper/TicketMapper.xml @@ -95,12 +95,16 @@ - + SELECT t.id,t.`no`,t.title,t.state,t.urgency,t.component,t.question,t.solution,a.`name` AS 'areaName' + ,c.agency_company_name AS 'companyName',u.`name` AS 'createUserName',t.device_no AS 'deviceNo',t.use_time AS 'useTime' + ,t.create_time AS 'createTime',t.handle,t.solve_time AS 'solveTime',di.name AS 'warrantyStatusDesc' FROM ticket t LEFT JOIN app_user u ON t.user_id=u.id LEFT JOIN t_base_customer c ON u.company_id=c.id LEFT JOIN app_area a ON u.area_id=a.id + LEFT JOIN device d ON t.device_no=d.device_no AND d.data_valid_state=1 + LEFT JOIN dictionary_item di ON d.warranty_state=di.id @@ -123,31 +127,43 @@ - + SELECT t.id,t.`no`,t.title,t.state,t.urgency,t.component,t.question,t.solution,a.`name` AS 'areaName' + ,c.agency_company_name AS 'companyName',u.`name` AS 'createUserName',t.device_no AS 'deviceNo',t.use_time AS 'useTime' + ,t.create_time AS 'createTime',t.handle,t.solve_time AS 'solveTime',di.name AS 'warrantyStatusDesc' FROM ticket t LEFT JOIN app_user u ON t.user_id=u.id LEFT JOIN t_base_customer c ON u.company_id=c.id LEFT JOIN app_area a ON u.area_id=a.id INNER JOIN ticket_follow tf ON t.id=tf.ticket_id AND tf.user_id=#{userId} + LEFT JOIN device d ON t.device_no=d.device_no AND d.data_valid_state=1 + LEFT JOIN dictionary_item di ON d.warranty_state=di.id From 5f9543d0972f7f869075a498760631f5a94e5e9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E9=B9=8F=E9=A3=9E?= Date: Wed, 5 Feb 2025 17:24:07 +0800 Subject: [PATCH 2/3] =?UTF-8?q?perf:=20=E6=B7=BB=E5=8A=A0=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/MultilingualController.java | 2 +- .../cfs/controller/SystemController.java | 2 +- .../cfs/controller/TiketController.java | 19 +++++++++- .../common/constant/Constant.java | 8 +++++ .../request/SaveDictionaryItemRequest.java | 5 +++ .../pojo/request/TicketSearchRequest.java | 2 +- .../common/pojo/vo/LanguageVO.java | 2 +- .../common/pojo/vo/TicketEvaluateItemVO.java | 13 +++++++ .../common/pojo/vo/TicketEvaluateVO.java | 21 +++++++++++ .../mapper/DictionaryItemTranslateMapper.java | 3 ++ .../service/IAdminMessageService.java | 2 ++ .../repository/service/IAdminUserService.java | 4 ++- .../IDictionaryItemTranslateService.java | 3 ++ .../repository/service/ITicketService.java | 2 +- .../service/impl/AdminMessageServiceImpl.java | 29 +++++++++++++++ .../service/impl/AdminUserServiceImpl.java | 5 +-- .../impl/DictionaryItemServiceImpl.java | 22 +++++++++--- .../DictionaryItemTranslateServiceImpl.java | 12 +++++++ .../service/impl/TicketServiceImpl.java | 36 +++++++++---------- .../mapper/DictionaryItemTranslateMapper.xml | 8 +++++ .../advice/GlobalRestControllerAdvice.java | 16 +++++++++ 21 files changed, 185 insertions(+), 31 deletions(-) create mode 100644 nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/TicketEvaluateItemVO.java create mode 100644 nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/TicketEvaluateVO.java diff --git a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/MultilingualController.java b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/MultilingualController.java index 519df8c2..b761e78b 100644 --- a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/MultilingualController.java +++ b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/MultilingualController.java @@ -57,7 +57,7 @@ public class MultilingualController extends ControllerBase { * * @return 语言列表 */ - @PostMapping("/getLanguage") + @GetMapping("/getLanguage") @MethodInfoMark(value = "获取语言列表", menuName = "系统管理") public ApiResult> getLanguage() { List languages = languageService.getAllLanguages(); diff --git a/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/SystemController.java b/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/SystemController.java index c9adc89d..89ead5f3 100644 --- a/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/SystemController.java +++ b/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/SystemController.java @@ -40,7 +40,7 @@ public class SystemController extends ControllerBase { .map(l->new LanguageVO() .setCode(l.getCode()) .setName(l.getName()) - .setVaLue(l.getValue()) + .setValue(l.getValue()) .setIco(l.getIco()) .setSort(l.getSort()) .setEnable(l.getEnable())) diff --git a/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/TiketController.java b/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/TiketController.java index 26ebcf41..cd2afdb1 100644 --- a/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/TiketController.java +++ b/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/TiketController.java @@ -7,6 +7,7 @@ import com.nflg.mobilebroken.common.pojo.PageData; import com.nflg.mobilebroken.common.pojo.request.*; import com.nflg.mobilebroken.common.pojo.vo.*; import com.nflg.mobilebroken.common.util.AppUserUtil; +import com.nflg.mobilebroken.common.util.LanguageUtil; import com.nflg.mobilebroken.repository.entity.AppUser; import com.nflg.mobilebroken.repository.entity.Ticket; import com.nflg.mobilebroken.repository.entity.TicketChat; @@ -51,6 +52,12 @@ public class TiketController extends ControllerBase { @Resource private ITicketEvaluateService ticketEvaluateService; + @Resource + private IAdminMessageService adminMessageService; + + @Resource + private IDictionaryItemTranslateService dictionaryItemTranslateService; + /** * 搜索设备 * @@ -90,7 +97,8 @@ public class TiketController extends ControllerBase { **/ @PostMapping("/addTiket") public ApiResult addTiket(@Valid @RequestBody TicketAddRequest request) { - ticketService.add(request, AppUserUtil.getUserId()); + Integer ticketId = ticketService.add(request, AppUserUtil.getUserId()); + adminMessageService.addCQMNotify(ticketId); return ApiResult.success(); } @@ -175,6 +183,15 @@ public class TiketController extends ControllerBase { return ApiResult.success(); } + /** + * 获取工单评价数据 + **/ + @GetMapping("getTicketEvaluateSelect") + public ApiResult getTicketEvaluateSelect() { + String language = LanguageUtil.getLanguage(); + return ApiResult.success(dictionaryItemTranslateService.getTicketEvaluateSelect(language)); + } + /** * 添加工单评价 * 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 52deb74a..0b4b56f9 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 @@ -2,6 +2,14 @@ package com.nflg.mobilebroken.common.constant; public class Constant { + public static final String DICTIONARY_TYPE_SERVICE_EVALUATION = "ServiceEvaluation"; + + public static final String DICTIONARY_TYPE_SERVICE_EVALUATION_SELECT = "ServiceEvaluationSelect"; + + public static final String DICTIONARY_TYPE_EXPERIENCE_EVALUATION = "ExperienceEvaluation"; + + public static final String DICTIONARY_TYPE_EXPERIENCE_EVALUATION_SELECT = "ExperienceEvaluationSelect"; + //字典 类型 用户职位 public static final String DICTIONARY_TYPE_TITLE="UserTitle"; diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/SaveDictionaryItemRequest.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/SaveDictionaryItemRequest.java index 6760c3e3..bfcf336c 100644 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/SaveDictionaryItemRequest.java +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/SaveDictionaryItemRequest.java @@ -3,6 +3,7 @@ package com.nflg.mobilebroken.common.pojo.request; import lombok.Data; import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; import java.util.List; @Data @@ -11,6 +12,10 @@ public class SaveDictionaryItemRequest { //字典值id private Integer id; + //字典id + @NotNull + private Integer dictionaryId; + //字典值名称 @NotBlank(message = "字典名称不能为空") private String name; diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/TicketSearchRequest.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/TicketSearchRequest.java index 473dfac2..b03f1018 100644 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/TicketSearchRequest.java +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/TicketSearchRequest.java @@ -10,7 +10,7 @@ import java.time.LocalDateTime; @Data public class TicketSearchRequest extends PageRequest { - //搜索类型,1: 我的工单,2: 我的关注,3: 区域工单 + //搜索类型,1: 我的工单,2: 我的关注,3: 区域工单,4: 全部工单 @NotNull(message = "搜索类型不能为空") private Integer type; diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/LanguageVO.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/LanguageVO.java index d35c475e..7311af38 100644 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/LanguageVO.java +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/LanguageVO.java @@ -14,7 +14,7 @@ public class LanguageVO { private String name; //语言名称 - private String vaLue; + private String value; //图标url private String ico; diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/TicketEvaluateItemVO.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/TicketEvaluateItemVO.java new file mode 100644 index 00000000..c6dd4f37 --- /dev/null +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/TicketEvaluateItemVO.java @@ -0,0 +1,13 @@ +package com.nflg.mobilebroken.common.pojo.vo; + +import lombok.Data; + +@Data +public class TicketEvaluateItemVO { + + //编码 + private String code; + + //描述 + private String desc; +} diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/TicketEvaluateVO.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/TicketEvaluateVO.java new file mode 100644 index 00000000..7437b4bb --- /dev/null +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/TicketEvaluateVO.java @@ -0,0 +1,21 @@ +package com.nflg.mobilebroken.common.pojo.vo; + +import lombok.Data; + +import java.util.List; + +@Data +public class TicketEvaluateVO { + + // 售后服务评价 + private List serviceEvaluation; + + // 售后服务评价选择项 + private List serviceEvaluationSelect; + + // 产品体验评价 + private List experienceEvaluation; + + // 产品体验评价选择项 + private List experienceEvaluationSelect; +} diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/DictionaryItemTranslateMapper.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/DictionaryItemTranslateMapper.java index 042ac509..5b85f9ff 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/DictionaryItemTranslateMapper.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/DictionaryItemTranslateMapper.java @@ -2,6 +2,7 @@ package com.nflg.mobilebroken.repository.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.nflg.mobilebroken.common.pojo.vo.DictionaryItemTranslateVO; +import com.nflg.mobilebroken.common.pojo.vo.TicketEvaluateItemVO; import com.nflg.mobilebroken.common.pojo.vo.TitleVO; import com.nflg.mobilebroken.repository.entity.DictionaryItemTranslate; @@ -22,4 +23,6 @@ public interface DictionaryItemTranslateMapper extends BaseMapper getTitles(String language); String getErrorMsg(String language, String errorCode); + + List getListByDictionaryCode(String dictionaryCode, String language); } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IAdminMessageService.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IAdminMessageService.java index 64e7f88f..438a60be 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IAdminMessageService.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IAdminMessageService.java @@ -23,4 +23,6 @@ public interface IAdminMessageService extends IService { void setReaded(List ids); void setNotRead(List ids); + + void addCQMNotify(Integer ticketId); } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IAdminUserService.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IAdminUserService.java index 37f1cff3..f06790a4 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IAdminUserService.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IAdminUserService.java @@ -9,6 +9,8 @@ import com.nflg.mobilebroken.common.pojo.request.SearchAccountRequest; import com.nflg.mobilebroken.common.pojo.vo.AdminUserVO; import com.nflg.mobilebroken.repository.entity.AdminUser; +import java.util.List; + /** *

* 后台-用户 服务类 @@ -29,5 +31,5 @@ public interface IAdminUserService extends IService { PageData search(SearchAccountRequest request); - AdminUser getCQM(); + List getCQM(); } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IDictionaryItemTranslateService.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IDictionaryItemTranslateService.java index 9fc93cef..450dc298 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IDictionaryItemTranslateService.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IDictionaryItemTranslateService.java @@ -3,6 +3,7 @@ package com.nflg.mobilebroken.repository.service; import com.baomidou.mybatisplus.extension.service.IService; import com.nflg.mobilebroken.common.pojo.dto.DictionaryItemTranslateDTO; import com.nflg.mobilebroken.common.pojo.vo.DictionaryItemTranslateVO; +import com.nflg.mobilebroken.common.pojo.vo.TicketEvaluateVO; import com.nflg.mobilebroken.common.pojo.vo.TitleVO; import com.nflg.mobilebroken.repository.entity.DictionaryItemTranslate; @@ -27,4 +28,6 @@ public interface IDictionaryItemTranslateService extends IService getTitles(String language); String getErrorMsg(String language, String errorCode); + + TicketEvaluateVO getTicketEvaluateSelect(String language); } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/ITicketService.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/ITicketService.java index d4a43ecf..3f99453b 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/ITicketService.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/ITicketService.java @@ -23,7 +23,7 @@ import java.util.List; */ public interface ITicketService extends IService { - void add(TicketAddRequest request,Integer userId); + Integer add(TicketAddRequest request, Integer userId); IPage search(TicketSearchRequest request, UserDTO user); diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AdminMessageServiceImpl.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AdminMessageServiceImpl.java index fc23f36a..6aee3762 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AdminMessageServiceImpl.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AdminMessageServiceImpl.java @@ -1,16 +1,24 @@ package com.nflg.mobilebroken.repository.service.impl; +import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.nflg.mobilebroken.common.constant.MessageType; import com.nflg.mobilebroken.common.pojo.request.AdminMessageSearchRequest; import com.nflg.mobilebroken.common.pojo.vo.AdminMessageVO; import com.nflg.mobilebroken.repository.entity.AdminMessage; +import com.nflg.mobilebroken.repository.entity.AdminUser; import com.nflg.mobilebroken.repository.mapper.AdminMessageMapper; import com.nflg.mobilebroken.repository.service.IAdminMessageService; +import com.nflg.mobilebroken.repository.service.IAdminUserService; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import javax.annotation.Resource; +import java.time.LocalDateTime; import java.util.List; +import java.util.stream.Collectors; /** *

@@ -23,6 +31,9 @@ import java.util.List; @Service public class AdminMessageServiceImpl extends ServiceImpl implements IAdminMessageService { + @Resource + private IAdminUserService adminUserService; + @Override public IPage search(Integer userId, AdminMessageSearchRequest request) { return baseMapper.search(userId, request, new Page<>(request.getPage(), request.getPageSize())); @@ -43,4 +54,22 @@ public class AdminMessageServiceImpl extends ServiceImpl cqmUsers = adminUserService.getCQM(); + if (CollectionUtil.isEmpty(cqmUsers)) { + log.error("未设置CQM负责人"); + } else { + List messages = cqmUsers.stream().map(c -> new AdminMessage() + .setUserId(c.getId()) + .setTicketId(ticketId) + .setIsRead(false) + .setType(MessageType.WorkOrderAssignment.getState().byteValue()) + .setContent("工单待分配") + .setCreateTime(LocalDateTime.now())).collect(Collectors.toList()); + saveBatch(messages); + } + } } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AdminUserServiceImpl.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AdminUserServiceImpl.java index f93bab46..7a5c597c 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AdminUserServiceImpl.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AdminUserServiceImpl.java @@ -24,6 +24,7 @@ import javax.annotation.Resource; import java.time.LocalDateTime; import java.util.Collection; import java.util.Collections; +import java.util.List; import java.util.Objects; import java.util.stream.Collectors; @@ -132,14 +133,14 @@ public class AdminUserServiceImpl extends ServiceImpl getCQM() { DictionaryItem cqm = dictionaryItemService .lambdaQuery() .eq(DictionaryItem::getCode, Constant.DICTIONARY_TYPE_TITLE_CQM) .one(); return lambdaQuery() .eq(AdminUser::getTitleId, cqm.getId()) - .one(); + .list(); } private String getDepartmentName(Integer departmentId) { diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/DictionaryItemServiceImpl.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/DictionaryItemServiceImpl.java index a5ad296b..913bf8c8 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/DictionaryItemServiceImpl.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/DictionaryItemServiceImpl.java @@ -10,11 +10,14 @@ import com.nflg.mobilebroken.common.pojo.request.DictionaryItemSearchRequest; import com.nflg.mobilebroken.common.pojo.request.SaveDictionaryItemRequest; import com.nflg.mobilebroken.common.pojo.request.TranslateMap; import com.nflg.mobilebroken.common.util.AdminUserUtil; +import com.nflg.mobilebroken.common.util.VUtils; +import com.nflg.mobilebroken.repository.entity.Dictionary; import com.nflg.mobilebroken.repository.entity.DictionaryItem; import com.nflg.mobilebroken.repository.entity.DictionaryItemTranslate; import com.nflg.mobilebroken.repository.mapper.DictionaryItemMapper; import com.nflg.mobilebroken.repository.service.IDictionaryItemService; import com.nflg.mobilebroken.repository.service.IDictionaryItemTranslateService; +import com.nflg.mobilebroken.repository.service.IDictionaryService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -39,6 +42,9 @@ public class DictionaryItemServiceImpl extends ServiceImpl queryWrapper = new LambdaQueryWrapper<>(); @@ -64,25 +70,33 @@ public class DictionaryItemServiceImpl extends ServiceImpl() diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/DictionaryItemTranslateServiceImpl.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/DictionaryItemTranslateServiceImpl.java index 4319064c..17c17c53 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/DictionaryItemTranslateServiceImpl.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/DictionaryItemTranslateServiceImpl.java @@ -3,8 +3,10 @@ package com.nflg.mobilebroken.repository.service.impl; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.nflg.mobilebroken.common.constant.Constant; import com.nflg.mobilebroken.common.pojo.dto.DictionaryItemTranslateDTO; import com.nflg.mobilebroken.common.pojo.vo.DictionaryItemTranslateVO; +import com.nflg.mobilebroken.common.pojo.vo.TicketEvaluateVO; import com.nflg.mobilebroken.common.pojo.vo.TitleVO; import com.nflg.mobilebroken.common.util.VUtils; import com.nflg.mobilebroken.repository.entity.Dictionary; @@ -91,4 +93,14 @@ public class DictionaryItemTranslateServiceImpl extends ServiceImpl @@ -45,14 +44,8 @@ public class TicketServiceImpl extends ServiceImpl impleme @Resource private IAdminUserService adminUserService; - @Resource - private IDictionaryItemTranslateService dictionaryItemTranslateService; - @Override - public void add(TicketAddRequest request,Integer userId) { - AdminUser cqmUser = adminUserService.getCQM(); - VUtils.trueThrowBusinessError(Objects.isNull(cqmUser)) - .throwMessage(dictionaryItemTranslateService.getErrorMsg(LanguageUtil.getLanguage(), Constant.DICTIONARY_TYPE_SYSTEMERROR_CQMNOTCONFIG)); + public Integer add(TicketAddRequest request, Integer userId) { Ticket lastTicket=lambdaQuery() .ge(Ticket::getCreateTime, LocalDateTime.now().toLocalDate()) .orderByDesc(Ticket::getId) @@ -69,9 +62,9 @@ public class TicketServiceImpl extends ServiceImpl impleme .setAttachments(StrUtil.join(",", request.getAttachments())) .setState(TicketState.PendingProcessing.getState()) .setUserId(userId) - .setCreateTime(LocalDateTime.now()) - .setCqm(cqmUser.getId()); + .setCreateTime(LocalDateTime.now()); save(ticket); + return ticket.getId(); } @Override @@ -90,9 +83,10 @@ public class TicketServiceImpl extends ServiceImpl impleme public IPage searchPage(AdminTicketSearchRequest request) { if (request.getType() == 2) { return baseMapper.searchFromAdminAndFollow(request, AdminUserUtil.getUserId(), new Page<>(request.getPage(), request.getPageSize())); - } else { + } else if (request.getType() == 4) { return baseMapper.searchFromAdmin(request, new Page<>(request.getPage(), request.getPageSize())); } + return new Page<>(request.getPage(), request.getPageSize(), 0); } @Override @@ -100,10 +94,13 @@ public class TicketServiceImpl extends ServiceImpl impleme Ticket ticket = getById(request.getTickerId()); VUtils.trueThrowBusinessError(Objects.isNull(ticket)).throwMessage("未找到工单"); VUtils.trueThrowBusinessError(ticket.getState() != TicketState.PendingProcessing.getState().byteValue()).throwMessage("工单状态异常"); + VUtils.trueThrowBusinessError(Objects.nonNull(ticket.getCqm()) && !Objects.equals(ticket.getCqm(), AdminUserUtil.getUserId())) + .throwMessage("当前工单已归属别的CQM负责人"); ticket.setUrgency(TicketUrgency.findByValue(request.getUrgency()).getState().byteValue()); ticket.setQuestion(request.getQuestion()); ticket.setRemark(request.getRemark()); ticket.setHandle(StrUtil.join(",", request.getUserIds())); + ticket.setCqm(AdminUserUtil.getUserId()); ticket.setUpdateTime(LocalDateTime.now()); updateById(ticket); } @@ -115,18 +112,21 @@ public class TicketServiceImpl extends ServiceImpl impleme @Override public void closeTicket(List ids) { - //TokenUtil.getUserId() - //TODO 判断用户是否有权限关闭工单 - baseMapper.closeTicket(ids); + List tickets = listByIds(ids); + List tids = tickets.stream().map(Ticket::getId).filter(cqm -> Objects.equals(AdminUserUtil.getUserId(), cqm)).collect(Collectors.toList()); + if (CollectionUtil.isNotEmpty(tids)) { + baseMapper.closeTicket(ids); + } } @Override public List exportSearch(AdminTicketSearchRequest request) { if (request.getType() == 2) { return baseMapper.searchAllFromAdminAndFollow(request, AdminUserUtil.getUserId()); - } else { + } else if (request.getType() == 4) { return baseMapper.searchAllFromAdmin(request); } + return Collections.emptyList(); } @Override diff --git a/nflg-mobilebroken-repository/src/main/resources/mapper/DictionaryItemTranslateMapper.xml b/nflg-mobilebroken-repository/src/main/resources/mapper/DictionaryItemTranslateMapper.xml index 417069c2..8304bdd6 100644 --- a/nflg-mobilebroken-repository/src/main/resources/mapper/DictionaryItemTranslateMapper.xml +++ b/nflg-mobilebroken-repository/src/main/resources/mapper/DictionaryItemTranslateMapper.xml @@ -26,4 +26,12 @@ LEFT JOIN dictionary_item_translate dit ON dit.dictionary_item_id=di.id AND dit.language_code=#{language} WHERE di.`code`=#{errorCode} + + diff --git a/nflg-mobilebroken-starter/src/main/java/com/nflg/mobilebroken/starter/advice/GlobalRestControllerAdvice.java b/nflg-mobilebroken-starter/src/main/java/com/nflg/mobilebroken/starter/advice/GlobalRestControllerAdvice.java index 625c18f3..6e23c4cf 100644 --- a/nflg-mobilebroken-starter/src/main/java/com/nflg/mobilebroken/starter/advice/GlobalRestControllerAdvice.java +++ b/nflg-mobilebroken-starter/src/main/java/com/nflg/mobilebroken/starter/advice/GlobalRestControllerAdvice.java @@ -5,11 +5,15 @@ import com.nflg.mobilebroken.common.constant.STATE; import com.nflg.mobilebroken.common.exception.NflgException; import com.nflg.mobilebroken.common.pojo.ApiResult; import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.FieldError; +import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import javax.validation.ConstraintViolation; import javax.validation.ConstraintViolationException; +import java.util.ArrayList; +import java.util.List; import java.util.stream.Collectors; @RestControllerAdvice @@ -33,4 +37,16 @@ public class GlobalRestControllerAdvice { log.error("数据校验失败: ", ex); return ApiResult.error(STATE.ParamErr, "数据校验失败: " + StrUtil.join(",", ex.getConstraintViolations().stream().map(ConstraintViolation::getMessage).collect(Collectors.toList()))); } + + @ExceptionHandler(MethodArgumentNotValidException.class) + public ApiResult handleMethodArgumentNotValidException(MethodArgumentNotValidException ex) { + log.error("数据校验失败: ", ex); + List errors = new ArrayList<>(); + ex.getBindingResult().getAllErrors().forEach(error -> { + String fieldName = ((FieldError) error).getField(); + String errorMessage = error.getDefaultMessage(); + errors.add(fieldName + ":" + errorMessage); + }); + return ApiResult.error(STATE.ParamErr, "数据校验失败: " + StrUtil.join(",", errors)); + } } \ No newline at end of file From 148ff6dbb0e1c28ffa11d71d851cf65b00b68186 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E9=B9=8F=E9=A3=9E?= Date: Wed, 5 Feb 2025 18:19:51 +0800 Subject: [PATCH 3/3] =?UTF-8?q?feat:=20=E6=A0=B9=E6=8D=AE=E8=AF=AD?= =?UTF-8?q?=E8=A8=80=E5=AF=B9=E5=BA=94=E7=9A=84=E6=97=B6=E5=8C=BA=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cfs/controller/TiketController.java | 4 +- .../mobilebroken/cfs/runner/InitZoneMap.java | 33 +++++++++++++++ .../common/pojo/vo/AdminTicketVO.java | 4 ++ .../common/util/LanguageUtil.java | 22 ---------- .../common/util/MultilingualUtil.java | 40 +++++++++++++++++++ .../repository/entity/Language.java | 8 +++- .../starter/advice/LoggingAspect.java | 1 + .../handler/UTCLocalDateTimeTypeHandler.java | 7 ++-- 8 files changed, 91 insertions(+), 28 deletions(-) create mode 100644 nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/runner/InitZoneMap.java delete mode 100644 nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/util/LanguageUtil.java create mode 100644 nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/util/MultilingualUtil.java diff --git a/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/TiketController.java b/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/TiketController.java index cd2afdb1..a55ac970 100644 --- a/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/TiketController.java +++ b/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/TiketController.java @@ -7,7 +7,7 @@ import com.nflg.mobilebroken.common.pojo.PageData; import com.nflg.mobilebroken.common.pojo.request.*; import com.nflg.mobilebroken.common.pojo.vo.*; import com.nflg.mobilebroken.common.util.AppUserUtil; -import com.nflg.mobilebroken.common.util.LanguageUtil; +import com.nflg.mobilebroken.common.util.MultilingualUtil; import com.nflg.mobilebroken.repository.entity.AppUser; import com.nflg.mobilebroken.repository.entity.Ticket; import com.nflg.mobilebroken.repository.entity.TicketChat; @@ -188,7 +188,7 @@ public class TiketController extends ControllerBase { **/ @GetMapping("getTicketEvaluateSelect") public ApiResult getTicketEvaluateSelect() { - String language = LanguageUtil.getLanguage(); + String language = MultilingualUtil.getLanguage(); return ApiResult.success(dictionaryItemTranslateService.getTicketEvaluateSelect(language)); } diff --git a/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/runner/InitZoneMap.java b/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/runner/InitZoneMap.java new file mode 100644 index 00000000..8ed80521 --- /dev/null +++ b/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/runner/InitZoneMap.java @@ -0,0 +1,33 @@ +package com.nflg.mobilebroken.cfs.runner; + +import cn.hutool.core.collection.CollectionUtil; +import com.nflg.mobilebroken.common.util.MultilingualUtil; +import com.nflg.mobilebroken.repository.entity.Language; +import com.nflg.mobilebroken.repository.service.ILanguageService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Component +@Slf4j +public class InitZoneMap implements CommandLineRunner { + + @Resource + private ILanguageService languageService; + + @Override + public void run(String... args) { + log.info("初始化语言区域映射"); + List languages = languageService.getLanguages(); + if (CollectionUtil.isNotEmpty(languages)) { + Map map = languages.stream() + .collect(Collectors.toMap(Language::getCode, Language::getZone)); + MultilingualUtil.setZoneMap(map); + } + } +} diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/AdminTicketVO.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/AdminTicketVO.java index 2291f72a..8d4a0d47 100644 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/AdminTicketVO.java +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/AdminTicketVO.java @@ -10,6 +10,7 @@ import org.ttzero.excel.annotation.IgnoreExport; import java.time.LocalDateTime; import java.util.List; +import java.util.Objects; @Data public class AdminTicketVO { @@ -137,6 +138,9 @@ public class AdminTicketVO { } public String getUrgencyDesc() { + if (Objects.isNull(urgency)) { + return ""; + } return TicketUrgency.findByValue(urgency).getDescription(); } diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/util/LanguageUtil.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/util/LanguageUtil.java deleted file mode 100644 index 7a7ad05f..00000000 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/util/LanguageUtil.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.nflg.mobilebroken.common.util; - -public class LanguageUtil { - - private static final ThreadLocal threadLocal = new ThreadLocal<>(); - - public static String getLanguage() { - String language = threadLocal.get(); - if (language == null) { - language = "cn"; - } - return language; - } - - public static void setLanguage(String language) { - threadLocal.set(language); - } - - public static void clear() { - threadLocal.remove(); - } -} diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/util/MultilingualUtil.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/util/MultilingualUtil.java new file mode 100644 index 00000000..ce274c91 --- /dev/null +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/util/MultilingualUtil.java @@ -0,0 +1,40 @@ +package com.nflg.mobilebroken.common.util; + +import cn.hutool.core.map.MapUtil; + +import java.util.Map; + +public class MultilingualUtil { + + private static final ThreadLocal THREAD_LOCAL = new ThreadLocal<>(); + + private static final Map ZONE_MAP = MapUtil.newHashMap(); + + public static String getLanguage() { + String language = THREAD_LOCAL.get(); + if (language == null) { + language = "cn"; + } + return language; + } + + public static void setLanguage(String language) { + THREAD_LOCAL.set(language); + } + + public static void clear() { + THREAD_LOCAL.remove(); + } + + public static void setZoneMap(Map map) { + ZONE_MAP.putAll(map); + } + + public static String getZone(String language) { + return ZONE_MAP.get(language); + } + + public static String getZone() { + return ZONE_MAP.get(getLanguage()); + } +} diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/Language.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/Language.java index e8756f22..bfa5bad6 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/Language.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/Language.java @@ -2,11 +2,12 @@ package com.nflg.mobilebroken.repository.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; -import java.io.Serializable; import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; +import java.io.Serializable; + /** *

* 字典 @@ -45,6 +46,11 @@ public class Language implements Serializable { */ private String ico; + /** + * 时区 + */ + private String zone; + /** * 排序,从大到小 */ diff --git a/nflg-mobilebroken-starter/src/main/java/com/nflg/mobilebroken/starter/advice/LoggingAspect.java b/nflg-mobilebroken-starter/src/main/java/com/nflg/mobilebroken/starter/advice/LoggingAspect.java index ee702a17..4172a4d9 100644 --- a/nflg-mobilebroken-starter/src/main/java/com/nflg/mobilebroken/starter/advice/LoggingAspect.java +++ b/nflg-mobilebroken-starter/src/main/java/com/nflg/mobilebroken/starter/advice/LoggingAspect.java @@ -73,6 +73,7 @@ public class LoggingAspect { StackTraceElement[] stackTraceElements = ex.getStackTrace(); logRecord.setRequestResult(false); logDetail.setRequestErrMsg(stackTraceElements.length > 0 ? ex.getMessage() + ":" + stackTraceElements[0].toString() : ""); +// logger.error("未捕获的异常",ex); return ApiResult.error(STATE.Error,"操作出现错误"+ex.getMessage()); } finally { diff --git a/nflg-mobilebroken-starter/src/main/java/com/nflg/mobilebroken/starter/handler/UTCLocalDateTimeTypeHandler.java b/nflg-mobilebroken-starter/src/main/java/com/nflg/mobilebroken/starter/handler/UTCLocalDateTimeTypeHandler.java index 4f4655fa..10c4fe95 100644 --- a/nflg-mobilebroken-starter/src/main/java/com/nflg/mobilebroken/starter/handler/UTCLocalDateTimeTypeHandler.java +++ b/nflg-mobilebroken-starter/src/main/java/com/nflg/mobilebroken/starter/handler/UTCLocalDateTimeTypeHandler.java @@ -1,5 +1,6 @@ package com.nflg.mobilebroken.starter.handler; +import com.nflg.mobilebroken.common.util.MultilingualUtil; import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; import org.apache.ibatis.type.MappedTypes; @@ -31,7 +32,7 @@ public class UTCLocalDateTimeTypeHandler extends BaseTypeHandler public LocalDateTime getNullableResult(ResultSet rs, String columnName) throws SQLException { LocalDateTime utcTime = rs.getObject(columnName, LocalDateTime.class); // 将 UTC 时间转换为本地时间 - return utcTime != null ? utcTime.atZone(ZoneId.of("UTC")) + return utcTime != null ? utcTime.atZone(ZoneId.of(MultilingualUtil.getZone())) .withZoneSameInstant(ZoneId.systemDefault()) .toLocalDateTime() : null; } @@ -40,7 +41,7 @@ public class UTCLocalDateTimeTypeHandler extends BaseTypeHandler public LocalDateTime getNullableResult(ResultSet rs, int columnIndex) throws SQLException { LocalDateTime utcTime = rs.getObject(columnIndex, LocalDateTime.class); // 将 UTC 时间转换为本地时间 - return utcTime != null ? utcTime.atZone(ZoneId.of("UTC")) + return utcTime != null ? utcTime.atZone(ZoneId.of(MultilingualUtil.getZone())) .withZoneSameInstant(ZoneId.systemDefault()) .toLocalDateTime() : null; } @@ -49,7 +50,7 @@ public class UTCLocalDateTimeTypeHandler extends BaseTypeHandler public LocalDateTime getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { LocalDateTime utcTime = cs.getObject(columnIndex, LocalDateTime.class); // 将 UTC 时间转换为本地时间 - return utcTime != null ? utcTime.atZone(ZoneId.of("UTC")) + return utcTime != null ? utcTime.atZone(ZoneId.of(MultilingualUtil.getZone())) .withZoneSameInstant(ZoneId.systemDefault()) .toLocalDateTime() : null; }