From cc53fb1b683e499ff216d4f0648d9a080b009952 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E9=B9=8F=E9=A3=9E?= Date: Fri, 28 Nov 2025 18:23:42 +0800 Subject: [PATCH] =?UTF-8?q?refactor(ticket):=20=E4=BC=98=E5=8C=96=E5=B7=A5?= =?UTF-8?q?=E5=8D=95=E6=B6=88=E6=81=AF=E6=8E=A8=E9=80=81=E4=B8=8E=E5=A4=9A?= =?UTF-8?q?=E8=AF=AD=E8=A8=80=E7=BB=84=E4=BB=B6=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 优化工单相关控制器,新增工单推送消息的统一推送功能 - 设备详情VO改造,拆分实体,增加字段,丰富设备信息 - 统一零件多语言数据服务,替换旧语言数据实体及接口 - 统一工单事件发送逻辑,新增处理中状态的消息及邮件发送支持 - 修改TBaseLanguageData为GongfuDevicePartLanguageData,实现零件名称多语言支持 - 统一uniPushService发送方法,新增工单聊天消息及待办消息发送接口 - 统一工单导出PDF时客户名称和区域的获取逻辑,完善导出内容 - 修改深度翻译接口,调整请求参数传递方式由请求体改为请求参数 - 调整IdPostRequest类,ids类型由Integer改为Long - 更新pom文件中ognl依赖版本,降低版本号以兼容需求 - 修改票据PDF模板,调整标题及设备区域展示标签和内容 - 完善uniPush消息体,新增标题和内容字段以支持更丰富的推送消息 - 优化TicketController中多处代码,规范集合处理与字符串切割转换 - 代码中统一格式和注释,提升代码可读性和维护性 --- nflg-mobilebroken-admin/pom.xml | 2 +- .../admin/controller/TicketController.java | 14 ++ .../admin/controller/TranslateController.java | 7 +- .../cfs/controller/TicketController.java | 5 + .../cfs/controller/TranslateController.java | 6 +- .../cfs/event/GongFuTicketCreateEvent.java | 88 ++++++++--- .../pojo/dto/UniPushMessageCallPayload.java | 4 + .../common/pojo/request/IdPostRequest.java | 2 +- .../common/pojo/vo/DeviceInfoVO.java | 2 + .../common/pojo/vo/TicketPdfVO.java | 7 +- nflg-mobilebroken-gongfu/pom.xml | 2 +- .../gongfu/controller/TicketController.java | 38 ++++- .../gongfu/pojo/vo/DeviceDetailResultVO.java | 138 +++++++++++++++++- .../main/resources/templates/ticketpdf.html | 6 +- .../impl/GongfuDevicePartServiceImpl.java | 36 ++--- .../resources/mapper/GongfuDeviceMapper.xml | 4 +- .../starter/service/UniPushService.java | 53 ++++++- .../service/impl/DeepSeekTranslate.java | 2 +- 18 files changed, 348 insertions(+), 68 deletions(-) diff --git a/nflg-mobilebroken-admin/pom.xml b/nflg-mobilebroken-admin/pom.xml index 5a18c8dd..4f88735a 100644 --- a/nflg-mobilebroken-admin/pom.xml +++ b/nflg-mobilebroken-admin/pom.xml @@ -67,7 +67,7 @@ ognl ognl - 3.4.3 + 3.1.28 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 d928a768..df53a57e 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 @@ -372,6 +372,9 @@ public class TicketController extends ControllerBase { //推送消息 ssePushService.sendTicketMessageToApp(Long.valueOf(ticket.getId()), message); ssePushService.sendTicketMessageToAdmin(Long.valueOf(ticket.getId()), message); + request.getUserIds().forEach(userId -> { + uniPushService.sendTodoMessageFromAdmin(Long.valueOf(ticket.getId()), Constant.FROM_ADMIN, userId, "分派工单"); + }); return ApiResult.success(); } @@ -430,6 +433,10 @@ public class TicketController extends ControllerBase { //推送消息 ssePushService.sendTicketMessageToAdmin(Long.valueOf(id), message); ssePushService.sendTicketMessageToApp(Long.valueOf(id), message); + uniPushService.sendTodoMessageFromAdmin(Long.valueOf(ticket.getId()), ticket.getUserPlatform(), ticket.getUserId(), "工单已完成"); + deviceTypeService.getCqmsByDeviceType(ticket.getDeviceNo()).forEach(cqm -> { + uniPushService.sendTodoMessageFromAdmin(Long.valueOf(ticket.getId()), Constant.FROM_ADMIN, cqm, "工单已完成"); + }); } return ApiResult.success(); } @@ -457,6 +464,7 @@ public class TicketController extends ControllerBase { //推送消息 ssePushService.sendTicketMessageToAdmin(Long.valueOf(id), message); ssePushService.sendTicketMessageToApp(Long.valueOf(id), message); + uniPushService.sendTodoMessageFromAdmin(Long.valueOf(ticket.getId()), Constant.FROM_ADMIN, StrUtil.splitToInt(ticket.getHandle(), ",")[0], "工单被驳回"); } return ApiResult.success(); } @@ -1288,6 +1296,8 @@ public class TicketController extends ControllerBase { .setTitle("视频通话") .setContent(adminUser.getUserName() + "请求与您视频通话") .setPayload(new UniPushMessageCallPayload() + .setTitle("视频通话") + .setContent(adminUser.getUserName() + "请求与您视频通话") .setTicketId(Long.valueOf(ticketId)) .setUserId(adminUser.getId()) .setUserName(adminUser.getUserName()) @@ -1331,6 +1341,8 @@ public class TicketController extends ControllerBase { .setTitle("视频通话") .setContent(adminUser.getUserName() + "请求与您视频通话") .setPayload(new UniPushMessageCallPayload() + .setTitle("视频通话") + .setContent(adminUser.getUserName() + "请求与您视频通话") .setTicketId(request.getTicketId()) .setUserId(adminUser.getId()) .setUserName(adminUser.getUserName()) @@ -1388,6 +1400,7 @@ public class TicketController extends ControllerBase { .setSendData(new UniPushMessageBody() .setTitle("视频通话") .setPayload(new UniPushMessageCallPayload() + .setTitle("视频通话") .setTicketId(Long.valueOf(ticketId)) .setUserId(AdminUserUtil.getUserId()) .setCategory("ticketCallJoined") @@ -1481,6 +1494,7 @@ public class TicketController extends ControllerBase { .setSendData(new UniPushMessageBody() .setTitle("视频通话结束") .setPayload(new UniPushMessageCallPayload() + .setTitle("视频通话结束") .setTicketId(request.getTicketId()) .setUserId(Integer.valueOf(StrUtil.split(uid, "-").get(1))) .setCategory("ticketCallEnd") diff --git a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/TranslateController.java b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/TranslateController.java index 033952fb..ac7a70d9 100644 --- a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/TranslateController.java +++ b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/TranslateController.java @@ -5,10 +5,7 @@ import com.nflg.mobilebroken.common.pojo.request.TranslateWordRequest; import com.nflg.mobilebroken.common.util.AdminUserUtil; import com.nflg.mobilebroken.starter.service.ITranslate; import com.nflg.mobilebroken.starter.service.impl.DeepSeekTranslate; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.validation.Valid; @@ -42,7 +39,7 @@ public class TranslateController extends ControllerBase{ * @return 翻译结果 */ @PostMapping("deepseek") - public ApiResult deepseek(@RequestBody String text) { + public ApiResult deepseek(@RequestParam String text) { return ApiResult.success(deepSeekTranslate.translateWord(text, "auto", AdminUserUtil.getLanguageName(), "text")); } } diff --git a/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/TicketController.java b/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/TicketController.java index 365fc47a..567942bc 100644 --- a/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/TicketController.java +++ b/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/TicketController.java @@ -480,6 +480,7 @@ public class TicketController extends ControllerBase { //推送消息 ssePushService.sendTicketMessageToAdmin(id, message); ssePushService.sendTicketMessageToApp(id, message); + uniPushService.sendTodoMessageFromApp(ticket.getId(), ticket.getCurrentHandle(), "工单被重启"); return ApiResult.success(); } @@ -571,6 +572,8 @@ public class TicketController extends ControllerBase { .setTitle("视频通话") .setContent(appUser.getName() + "请求与您视频通话") .setPayload(new UniPushMessageCallPayload() + .setTitle("视频通话") + .setContent(appUser.getName() + "请求与您视频通话") .setTicketId(ticketId) .setUserId(appUser.getId()) .setUserName(appUser.getName()) @@ -609,6 +612,7 @@ public class TicketController extends ControllerBase { .setSendData(new UniPushMessageBody() .setTitle("视频通话") .setPayload(new UniPushMessageCallPayload() + .setTitle("视频通话") .setTicketId(ticketId) .setUserId(AppUserUtil.getUserId()) .setCategory("ticketCallJoined") @@ -635,6 +639,7 @@ public class TicketController extends ControllerBase { .setSendData(new UniPushMessageBody() .setTitle("视频通话结束") .setPayload(new UniPushMessageCallPayload() + .setTitle("视频通话结束") .setTicketId(request.getTicketId()) .setUserId(Integer.valueOf(StrUtil.split(uid, "-").get(1))) .setCategory("ticketCallEnd") diff --git a/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/TranslateController.java b/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/TranslateController.java index 7606a3f6..1cdd983e 100644 --- a/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/TranslateController.java +++ b/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/TranslateController.java @@ -4,8 +4,8 @@ import com.nflg.mobilebroken.common.pojo.ApiResult; import com.nflg.mobilebroken.common.util.AppUserUtil; import com.nflg.mobilebroken.starter.service.impl.DeepSeekTranslate; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; @@ -26,7 +26,7 @@ public class TranslateController extends ControllerBase { * @return 翻译结果 */ @PostMapping("deepseek") - public ApiResult deepseek(@RequestBody String text) { - return ApiResult.success(deepSeekTranslate.translateWord(text, "auto", AppUserUtil.getLanguageName(), "html")); + public ApiResult deepseek(@RequestParam String text) { + return ApiResult.success(deepSeekTranslate.translateWord(text, "auto", AppUserUtil.getLanguageName(), "text")); } } diff --git a/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/event/GongFuTicketCreateEvent.java b/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/event/GongFuTicketCreateEvent.java index 7eaf8c02..6f63ecb5 100644 --- a/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/event/GongFuTicketCreateEvent.java +++ b/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/event/GongFuTicketCreateEvent.java @@ -21,10 +21,7 @@ import org.springframework.context.ApplicationEvent; import javax.mail.MessagingException; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; @Slf4j @@ -63,6 +60,9 @@ public class GongFuTicketCreateEvent extends ApplicationEvent implements Applica if (Objects.equals(ticket.getState(), TicketState.PendingProcessing.getState())) { sendUserMessage(); sendEmail(); + } else if (Objects.equals(ticket.getState(), TicketState.Processing.getState())) { + sendUserMessage1(); + sendEmail1(); } } @@ -71,22 +71,41 @@ public class GongFuTicketCreateEvent extends ApplicationEvent implements Applica List cqms = deviceType1Service.getCqms(ticket.getDeviceNo()); if (CollectionUtil.isEmpty(cqms)) { log.error("该设备尚未设置服务经理:{}", ticket.getDeviceNo()); - } else { - List cqmUsers = adminUserService.listByIds(cqms); - if (CollectionUtil.isNotEmpty(cqmUsers)) { - cqmUsers.forEach(c -> adminMessageService.add( - new AdminMessage() - .setNo(ticket.getNo()) - .setTitle(ticket.getTitle()) - .setUserId(c.getId()) - .setSourceId(ticket.getId()) - .setSource(3) - .setType(MessageType.WorkOrderAssignment.getState()) - .setSubType(MessageSubType.TicketToBeAssigned.getState()) - .setIsRead(false) - .setCreateTime(LocalDateTime.now())) - ); - } + return; + } + List cqmUsers = adminUserService.listByIds(cqms); + if (CollectionUtil.isNotEmpty(cqmUsers)) { + cqmUsers.forEach(c -> adminMessageService.add( + new AdminMessage() + .setNo(ticket.getNo()) + .setTitle(ticket.getTitle()) + .setUserId(c.getId()) + .setSourceId(ticket.getId()) + .setSource(3) + .setType(MessageType.WorkOrderAssignment.getState()) + .setSubType(MessageSubType.TicketToBeAssigned.getState()) + .setIsRead(false) + .setCreateTime(LocalDateTime.now())) + ); + } + } + + private void sendUserMessage1() { + //我的待办 + List handlers = adminUserService.listByIds(Collections.singleton(StrUtil.splitToLong(ticket.getHandle(), ","))); + if (CollectionUtil.isNotEmpty(handlers)) { + handlers.forEach(c -> adminMessageService.add( + new AdminMessage() + .setNo(ticket.getNo()) + .setTitle(ticket.getTitle()) + .setUserId(c.getId()) + .setSourceId(ticket.getId()) + .setSource(3) + .setType(MessageType.WorkOrderAssignment.getState()) + .setSubType(MessageSubType.TicketAssignment.getState()) + .setIsRead(false) + .setCreateTime(LocalDateTime.now())) + ); } } @@ -120,6 +139,31 @@ public class GongFuTicketCreateEvent extends ApplicationEvent implements Applica } } + private void sendEmail1() { + try { + String tickerUserName; + if (StrUtil.equals(ticket.getUserPlatform(), "app")) { + AppUser appUser = appUserService.getById(ticket.getUserId()); + tickerUserName = appUser.getName(); + } else { + AdminUser adminUser = adminUserService.getById(ticket.getUserId()); + tickerUserName = adminUser.getUserName(); + } + String subject = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_TITLE_TICKET_ASSIGNED, language); + String content = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_CONTENT_TICKET_NOTIFY, language) + .replace("${no}", ticket.getNo()) + .replace("${title}", ticket.getTitle()) + .replace("${createUser}", tickerUserName) + .replace("${handleUser}", "") + .replace("${createTime}", toTimeString(ticket.getCreateTime())) + .replace("${msg}", subject); + List handlers = adminUserService.listByIds(Collections.singleton(StrUtil.splitToLong(ticket.getHandle(), ","))); + sendEmail(handlers.stream().map(AdminUser::getEmail).collect(Collectors.toSet()), subject, content); + } catch (Exception ex) { + log.error("邮件发送失败", ex); + } + } + private void sendEmail(Set emails, String subject, String content) throws MessagingException { if (CollectionUtil.isNotEmpty(emails)) { for (String email : emails) { @@ -129,10 +173,6 @@ public class GongFuTicketCreateEvent extends ApplicationEvent implements Applica } private String toTimeString(LocalDateTime time) { -// return time.atZone(ZoneOffset.UTC) -// .withZoneSameInstant(ZoneId.of(zone)) -// .toLocalDateTime() -// .format(FORMATTER); return time.format(FORMATTER); } } diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/dto/UniPushMessageCallPayload.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/dto/UniPushMessageCallPayload.java index cfcd7390..ef478433 100644 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/dto/UniPushMessageCallPayload.java +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/dto/UniPushMessageCallPayload.java @@ -21,4 +21,8 @@ public class UniPushMessageCallPayload { private String from; private String category; + + private String title; + + private String content; } diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/IdPostRequest.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/IdPostRequest.java index 16ea6fd3..ef0fe797 100644 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/IdPostRequest.java +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/IdPostRequest.java @@ -12,5 +12,5 @@ public class IdPostRequest { * id集合 */ @NotEmpty - private List ids; + private List ids; } diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/DeviceInfoVO.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/DeviceInfoVO.java index 9a70c4a9..773e0433 100644 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/DeviceInfoVO.java +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/DeviceInfoVO.java @@ -43,6 +43,8 @@ public class DeviceInfoVO { //代理商名称 private String agentName; + private String agentCode; + // @JsonIgnore // private Integer componentId; diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/TicketPdfVO.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/TicketPdfVO.java index ff6b68a6..5d939b3c 100644 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/TicketPdfVO.java +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/TicketPdfVO.java @@ -74,8 +74,13 @@ public class TicketPdfVO { return TicketState.findByValue(state).getDescription(); } - //设备地址 + /** + * 设备地址 + */ private String deviceAddress; + //区域 + private String ticketArea; + private List measures; } diff --git a/nflg-mobilebroken-gongfu/pom.xml b/nflg-mobilebroken-gongfu/pom.xml index 9eb2e508..98b85e0b 100644 --- a/nflg-mobilebroken-gongfu/pom.xml +++ b/nflg-mobilebroken-gongfu/pom.xml @@ -67,7 +67,7 @@ ognl ognl - 3.4.3 + 3.1.28 diff --git a/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/controller/TicketController.java b/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/controller/TicketController.java index 315beb77..b718c44c 100644 --- a/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/controller/TicketController.java +++ b/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/controller/TicketController.java @@ -365,6 +365,9 @@ public class TicketController extends ControllerBase { //推送消息 ssePushService.sendTicketMessageToApp(ticket.getId(), message); ssePushService.sendTicketMessageToAdmin(ticket.getId(), message); + request.getUserIds().forEach(userId -> { + uniPushService.sendTodoMessageFromAdmin(ticket.getId(), Constant.FROM_ADMIN, userId, "分派工单"); + }); return ApiResult.success(); } @@ -423,6 +426,10 @@ public class TicketController extends ControllerBase { //推送消息 ssePushService.sendTicketMessageToAdmin(id, message); ssePushService.sendTicketMessageToApp(id, message); + uniPushService.sendTodoMessageFromAdmin(ticket.getId(), ticket.getUserPlatform(), ticket.getUserId(), "工单已完成"); + deviceTypeService.getCqms(ticket.getDeviceNo()).forEach(cqm -> { + uniPushService.sendTodoMessageFromAdmin(ticket.getId(), Constant.FROM_ADMIN, cqm, "工单已完成"); + }); } return ApiResult.success(); } @@ -450,6 +457,7 @@ public class TicketController extends ControllerBase { //推送消息 ssePushService.sendTicketMessageToAdmin(id, message); ssePushService.sendTicketMessageToApp(id, message); + uniPushService.sendTodoMessageFromAdmin(ticket.getId(), Constant.FROM_ADMIN, StrUtil.splitToInt(ticket.getHandle(), ",")[0], "工单被驳回"); } return ApiResult.success(); } @@ -463,9 +471,25 @@ public class TicketController extends ControllerBase { public void exportPdf(HttpServletResponse response, @Valid @RequestParam @NotNull(message = "工单编号不能为空") Long id) { GongfuTicket ticket = ticketService.getById(id); AppUser user = appUserService.getById(ticket.getUserId()); - List companyIds = Arrays.stream(user.getCompanyId().split(",")).map(Integer::parseInt).collect(Collectors.toList()); - List companys = customerService.listByIds(companyIds); DeviceInfoVO device = deviceService.getByDeviceNo(ticket.getDeviceNo()); + String comnpanyName = ""; + if (user.getType() == 0) { + List companyIds = Arrays.stream(user.getCompanyId().split(",")).map(Integer::parseInt).collect(Collectors.toList()); + List companys = customerService.listByIds(companyIds); + comnpanyName = StrUtil.join(",", companys.stream().map(TBaseCustomer::getAgencyCompanyName).collect(Collectors.toList())); + } else { + TBaseCustomer customer = customerService.lambdaQuery().eq(TBaseCustomer::getAgencyCompanyCode, device.getAgentCode()).one(); + if (Objects.nonNull(customer)) { + comnpanyName = customer.getAgencyCompanyName(); + } + } + String areaName = ""; + if (Objects.nonNull(ticket.getAreaId())) { + GongfuTicketArea ticketArea = ticketAreaService.getById(ticket.getAreaId()); + if (Objects.nonNull(ticketArea)) { + areaName = ticketArea.getName(); + } + } String handle = ticket.getHandle(); if (StrUtil.isNotBlank(handle)) { List adminUsers = adminUserService.listByIds(Arrays.stream(handle.split(",")).map(Integer::parseInt).collect(Collectors.toList())); @@ -495,12 +519,12 @@ public class TicketController extends ControllerBase { .setState(ticket.getState()) .setCreateUserName(user.getName()) .setCreateTime(DateTimeUtil.format(ticket.getCreateTime())) - .setCompanyName(StrUtil.join(",", companys.stream().map(TBaseCustomer::getAgencyCompanyName).collect(Collectors.toList()))) + .setCompanyName(comnpanyName) .setUrgency(ticket.getUrgency()) .setUpdateTime(DateTimeUtil.format(ticket.getUpdateTime())) .setHandleUserName(handle) .setReason(ticket.getReason()) - .setDeviceAddress(ticket.getDeviceAddress()) + .setTicketArea(areaName) .setImages(images) // .setFiles(files) .setMeasures(ticketSolutionService.getSolutionMeasures(ticket.getId()).getMeasures()); @@ -1193,6 +1217,8 @@ public class TicketController extends ControllerBase { .setTitle("视频通话") .setContent(adminUser.getUserName() + "请求与您视频通话") .setPayload(new UniPushMessageCallPayload() + .setTitle("视频通话") + .setContent(adminUser.getUserName() + "请求与您视频通话") .setTicketId(ticketId) .setUserId(adminUser.getId()) .setUserName(adminUser.getUserName()) @@ -1236,6 +1262,8 @@ public class TicketController extends ControllerBase { .setTitle("视频通话") .setContent(adminUser.getUserName() + "请求与您视频通话") .setPayload(new UniPushMessageCallPayload() + .setTitle("视频通话") + .setContent(adminUser.getUserName() + "请求与您视频通话") .setTicketId(request.getTicketId()) .setUserId(adminUser.getId()) .setUserName(adminUser.getUserName()) @@ -1275,6 +1303,7 @@ public class TicketController extends ControllerBase { .setSendData(new UniPushMessageBody() .setTitle("视频通话") .setPayload(new UniPushMessageCallPayload() + .setTitle("视频通话") .setTicketId(ticketId) .setUserId(AdminUserUtil.getUserId()) .setCategory("ticketCallJoined") @@ -1301,6 +1330,7 @@ public class TicketController extends ControllerBase { .setSendData(new UniPushMessageBody() .setTitle("视频通话结束") .setPayload(new UniPushMessageCallPayload() + .setTitle("视频通话结束") .setTicketId(request.getTicketId()) .setUserId(Integer.valueOf(StrUtil.split(uid, "-").get(1))) .setCategory("ticketCallEnd") diff --git a/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/pojo/vo/DeviceDetailResultVO.java b/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/pojo/vo/DeviceDetailResultVO.java index a49a7b5b..3cb6b559 100644 --- a/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/pojo/vo/DeviceDetailResultVO.java +++ b/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/pojo/vo/DeviceDetailResultVO.java @@ -1,10 +1,144 @@ package com.nflg.mobilebroken.gongfu.pojo.vo; -import com.nflg.mobilebroken.repository.entity.Device; import lombok.Data; +import java.time.LocalDate; +import java.time.LocalDateTime; + @Data -public class DeviceDetailResultVO extends Device { +public class DeviceDetailResultVO { + + private Long id; + + /** + * 设备编号 + */ + private String deviceNo; + + /** + * 设备名称 + */ + private String deviceName; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * 设备类型细分 + */ + private String deviceTypeSub; + + /** + * 设备机型 + */ + private String modelNo; + + /** + * 客户id + */ + private Integer customerId; + + /** + * 客户名称 + */ + private String customerName; + + /** + * 设备状态-来自字典 + */ + private Integer deviceState; + + /** + * 代理商编码 + */ + private String agentCode; + + /** + * 代理商名称 + */ + private String agentName; + + /** + * 区域编码 + */ + private String areaCode; + + /** + * 区域名称 + */ + private String areaName; + + /** + * 发货日期 + */ + private LocalDate shipmentDate; + + /** + * 质保状态-来自字典 + */ + private Integer warrantyState; + + /** + * 开始质保日期 + */ + private LocalDate startWarrantyDate; + + /** + * 质保期(月) + */ + private Integer warrantyMonth; + + /** + * 行数据是否有效 0-无效 1-有效 + */ + private Boolean dataValidState; + + /** + * 数据来源 1-手工新增 2-CRM(接口同步) + */ + private Integer sourceFrom; + + /** + * 数据来源id + */ + private String sourceId; + + /** + * 创建人 + */ + private String createBy; + + /** + * 创建时间 + */ + private LocalDateTime createTime; + + /** + * 最后更新人 + */ + private String updateBy; + + /** + * 最后更新时间 + */ + private LocalDateTime updateTime; + + /** + * 备注 + */ + private String remark; + + /** + * 产品线 + */ + private String productLine; + + /** + * 设备地址 + */ + private String address; /** * 设备状态名称 diff --git a/nflg-mobilebroken-gongfu/src/main/resources/templates/ticketpdf.html b/nflg-mobilebroken-gongfu/src/main/resources/templates/ticketpdf.html index 77295701..233484d4 100644 --- a/nflg-mobilebroken-gongfu/src/main/resources/templates/ticketpdf.html +++ b/nflg-mobilebroken-gongfu/src/main/resources/templates/ticketpdf.html @@ -41,7 +41,7 @@ - 移动破售后问题反馈表 + 工服售后问题反馈表 @@ -61,8 +61,8 @@ 提交人 - 设备地点 - + 设备区域 + 设备运行时间 diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/GongfuDevicePartServiceImpl.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/GongfuDevicePartServiceImpl.java index b0bb0f8e..1282681b 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/GongfuDevicePartServiceImpl.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/GongfuDevicePartServiceImpl.java @@ -9,10 +9,10 @@ import com.nflg.mobilebroken.common.pojo.dto.ExportPartDTO; import com.nflg.mobilebroken.common.pojo.query.PageBaseQuery; import com.nflg.mobilebroken.common.pojo.vo.ComponentInfo; import com.nflg.mobilebroken.repository.entity.GongfuDevicePart; -import com.nflg.mobilebroken.repository.entity.TBaseLanguageData; +import com.nflg.mobilebroken.repository.entity.GongfuDevicePartLanguageData; import com.nflg.mobilebroken.repository.mapper.GongfuDevicePartMapper; +import com.nflg.mobilebroken.repository.service.IGongfuDevicePartLanguageDataService; import com.nflg.mobilebroken.repository.service.IGongfuDevicePartService; -import com.nflg.mobilebroken.repository.service.ITBaseLanguageDataService; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Service; @@ -34,10 +34,10 @@ import java.util.stream.Collectors; public class GongfuDevicePartServiceImpl extends ServiceImpl implements IGongfuDevicePartService { @Resource - private ITBaseLanguageDataService languageDataService; + private IGongfuDevicePartLanguageDataService gongfuDevicePartLanguageDataService; public Page selectListByPage(@Param("query") PageBaseQuery query) { - return this.getBaseMapper().getListByPage(new Page(query.getPage(), query.getPageSize()), query); + return this.getBaseMapper().getListByPage(new Page<>(query.getPage(), query.getPageSize()), query); } public List exportPart(@Param("partNo") String partNo, @Param("partName") String partName) { @@ -61,20 +61,20 @@ public class GongfuDevicePartServiceImpl extends ServiceImpl languageData = languageDataService.lambdaQuery() - .eq(TBaseLanguageData::getLanguageCode, language) - .in(TBaseLanguageData::getSourceId, parts.stream().map(GongfuDevicePart::getId).collect(Collectors.toList())) + List languageData = gongfuDevicePartLanguageDataService.lambdaQuery() + .eq(GongfuDevicePartLanguageData::getLanguageCode, language) + .in(GongfuDevicePartLanguageData::getSourceId, parts.stream().map(GongfuDevicePart::getId).collect(Collectors.toList())) .list(); List vos = new ArrayList<>(); parts.forEach(part -> { ComponentInfo vo = new ComponentInfo(); vo.setId(part.getId()); - TBaseLanguageData l = languageData.stream() - .filter(data -> Objects.equals(data.getSourceId().intValue(), part.getId()) && StrUtil.isNotBlank(data.getLanguageValue())) + GongfuDevicePartLanguageData l = languageData.stream() + .filter(data -> Objects.equals(data.getSourceId(), part.getId()) && StrUtil.isNotBlank(data.getLanguageValue())) .findFirst() - .orElseGet(() -> languageDataService.lambdaQuery() - .eq(TBaseLanguageData::getSourceId, part.getId().longValue()) - .eq(TBaseLanguageData::getLanguageCode, Constant.DEFAULT_LANGUAGE_CODE) + .orElseGet(() -> gongfuDevicePartLanguageDataService.lambdaQuery() + .eq(GongfuDevicePartLanguageData::getSourceId, part.getId()) + .eq(GongfuDevicePartLanguageData::getLanguageCode, Constant.DEFAULT_LANGUAGE_CODE) .one()); if (Objects.nonNull(l) && StrUtil.isNotBlank(l.getLanguageValue())) { vo.setName(l.getLanguageValue()); @@ -89,16 +89,16 @@ public class GongfuDevicePartServiceImpl extends ServiceImpl SELECT d.*, dc.id AS 'componentId',c.area_name FROM gongfu_device d - LEFT JOIN gongfu_device_component dc ON d.model_no = dc.model_no AND dc.`enable` = 1 - LEFT JOIN t_base_customer c ON c.agency_company_code=d.agent_code + LEFT JOIN gongfu_device_component dc ON d.model_no = dc.model_no AND dc.`enable` = 1 + LEFT JOIN t_base_customer c ON c.agency_company_code=d.agent_code WHERE d.device_no = #{deviceNo} ORDER BY d.data_valid_state DESC,d.device_state DESC LIMIT 1; diff --git a/nflg-mobilebroken-starter/src/main/java/com/nflg/mobilebroken/starter/service/UniPushService.java b/nflg-mobilebroken-starter/src/main/java/com/nflg/mobilebroken/starter/service/UniPushService.java index c89cf3ef..4f266a31 100644 --- a/nflg-mobilebroken-starter/src/main/java/com/nflg/mobilebroken/starter/service/UniPushService.java +++ b/nflg-mobilebroken-starter/src/main/java/com/nflg/mobilebroken/starter/service/UniPushService.java @@ -1,7 +1,13 @@ package com.nflg.mobilebroken.starter.service; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.json.JSONUtil; +import com.nflg.mobilebroken.common.pojo.dto.ChatMessageDTO; import com.nflg.mobilebroken.common.pojo.dto.UniPushMessage; +import com.nflg.mobilebroken.common.pojo.dto.UniPushMessageBody; +import com.nflg.mobilebroken.common.pojo.dto.UniPushMessageCallPayload; +import com.nflg.mobilebroken.common.util.AdminUserUtil; +import com.nflg.mobilebroken.common.util.AppUserUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.ResponseEntity; @@ -15,10 +21,53 @@ public class UniPushService { @Value("${uniapp.cloud.push.url}") private String url; - public void send(UniPushMessage message){ + public void send(UniPushMessage message) { log.info("发送uniapp消息:{}", JSONUtil.toJsonStr(message)); RestTemplate restTemplate = new RestTemplate(); - ResponseEntity response = restTemplate.postForEntity(url,message, String.class); + ResponseEntity response = restTemplate.postForEntity(url, message, String.class); log.info("发送uniapp消息结果:{}", response.getBody()); } + + public void sendTicketMessage(String from, String to, ChatMessageDTO data) { + send(new UniPushMessage() + .setSenderId(from) + .setReceiverId(to) + .setSendData(new UniPushMessageBody() + .setTitle("工单聊天消息") + .setContent(CollectionUtil.isNotEmpty(data.getAttachments()) ? "文件" : (CollectionUtil.isNotEmpty(data.getImages()) ? "图片" : data.getContent())) + ) + ); + } + + public void sendTodoMessageFromAdmin(Long ticketId, String platform, Integer userId, String content) { + send(new UniPushMessage() + .setSenderId("admin-uid-" + AdminUserUtil.getUserId()) + .setReceiverId(platform + "-uid-" + userId) + .setSendData(new UniPushMessageBody() + .setTitle("工单消息") + .setContent(content) + .setPayload(new UniPushMessageCallPayload() + .setTicketId(ticketId) + .setTitle("工单消息") + .setContent(content) + ) + ) + ); + } + + public void sendTodoMessageFromApp(Long ticketId, Integer userId, String content) { + send(new UniPushMessage() + .setSenderId("app-uid-" + AppUserUtil.getUserId()) + .setReceiverId("admin-uid-" + userId) + .setSendData(new UniPushMessageBody() + .setTitle("工单消息") + .setContent(content) + .setPayload(new UniPushMessageCallPayload() + .setTicketId(ticketId) + .setTitle("工单消息") + .setContent(content) + ) + ) + ); + } } \ No newline at end of file diff --git a/nflg-mobilebroken-starter/src/main/java/com/nflg/mobilebroken/starter/service/impl/DeepSeekTranslate.java b/nflg-mobilebroken-starter/src/main/java/com/nflg/mobilebroken/starter/service/impl/DeepSeekTranslate.java index eed71b0e..7d1a7070 100644 --- a/nflg-mobilebroken-starter/src/main/java/com/nflg/mobilebroken/starter/service/impl/DeepSeekTranslate.java +++ b/nflg-mobilebroken-starter/src/main/java/com/nflg/mobilebroken/starter/service/impl/DeepSeekTranslate.java @@ -52,7 +52,7 @@ public class DeepSeekTranslate implements ITranslate { data.putOnce("model", "deepseek-chat"); JSONArray array = new JSONArray(); array.add(new JSONObject().putOnce("role", "system").putOnce("content", prompt)); - array.add(new JSONObject().putOnce("role", "user").putOnce("content", "请将“" + text + "”翻译成" + targetLanguage)); + array.add(new JSONObject().putOnce("role", "user").putOnce("content", "请将" + text + "翻译成" + targetLanguage)); data.putOnce("messages", array); data.putOnce("stream", false); String dataStr = data.toString();