refactor(ticket): 优化工单消息推送与多语言组件适配
- 优化工单相关控制器,新增工单推送消息的统一推送功能 - 设备详情VO改造,拆分实体,增加字段,丰富设备信息 - 统一零件多语言数据服务,替换旧语言数据实体及接口 - 统一工单事件发送逻辑,新增处理中状态的消息及邮件发送支持 - 修改TBaseLanguageData为GongfuDevicePartLanguageData,实现零件名称多语言支持 - 统一uniPushService发送方法,新增工单聊天消息及待办消息发送接口 - 统一工单导出PDF时客户名称和区域的获取逻辑,完善导出内容 - 修改深度翻译接口,调整请求参数传递方式由请求体改为请求参数 - 调整IdPostRequest类,ids类型由Integer改为Long - 更新pom文件中ognl依赖版本,降低版本号以兼容需求 - 修改票据PDF模板,调整标题及设备区域展示标签和内容 - 完善uniPush消息体,新增标题和内容字段以支持更丰富的推送消息 - 优化TicketController中多处代码,规范集合处理与字符串切割转换 - 代码中统一格式和注释,提升代码可读性和维护性
This commit is contained in:
parent
a24d588be4
commit
cc53fb1b68
|
|
@ -67,7 +67,7 @@
|
|||
<dependency>
|
||||
<groupId>ognl</groupId>
|
||||
<artifactId>ognl</artifactId>
|
||||
<version>3.4.3</version>
|
||||
<version>3.1.28</version>
|
||||
</dependency>
|
||||
<!-- <dependency>-->
|
||||
<!-- <groupId>com.itextpdf</groupId>-->
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -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<String> deepseek(@RequestBody String text) {
|
||||
public ApiResult<String> deepseek(@RequestParam String text) {
|
||||
return ApiResult.success(deepSeekTranslate.translateWord(text, "auto", AdminUserUtil.getLanguageName(), "text"));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -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<String> deepseek(@RequestBody String text) {
|
||||
return ApiResult.success(deepSeekTranslate.translateWord(text, "auto", AppUserUtil.getLanguageName(), "html"));
|
||||
public ApiResult<String> deepseek(@RequestParam String text) {
|
||||
return ApiResult.success(deepSeekTranslate.translateWord(text, "auto", AppUserUtil.getLanguageName(), "text"));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<Integer> cqms = deviceType1Service.getCqms(ticket.getDeviceNo());
|
||||
if (CollectionUtil.isEmpty(cqms)) {
|
||||
log.error("该设备尚未设置服务经理:{}", ticket.getDeviceNo());
|
||||
} else {
|
||||
List<AdminUser> 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<AdminUser> 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<AdminUser> 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<AdminUser> 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<String> 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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -21,4 +21,8 @@ public class UniPushMessageCallPayload {
|
|||
private String from;
|
||||
|
||||
private String category;
|
||||
|
||||
private String title;
|
||||
|
||||
private String content;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,5 +12,5 @@ public class IdPostRequest {
|
|||
* id集合
|
||||
*/
|
||||
@NotEmpty
|
||||
private List<Integer> ids;
|
||||
private List<Long> ids;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -43,6 +43,8 @@ public class DeviceInfoVO {
|
|||
//代理商名称
|
||||
private String agentName;
|
||||
|
||||
private String agentCode;
|
||||
|
||||
// @JsonIgnore
|
||||
// private Integer componentId;
|
||||
|
||||
|
|
|
|||
|
|
@ -74,8 +74,13 @@ public class TicketPdfVO {
|
|||
return TicketState.findByValue(state).getDescription();
|
||||
}
|
||||
|
||||
//设备地址
|
||||
/**
|
||||
* 设备地址
|
||||
*/
|
||||
private String deviceAddress;
|
||||
|
||||
//区域
|
||||
private String ticketArea;
|
||||
|
||||
private List<SolutionMeasuresItemVO> measures;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -67,7 +67,7 @@
|
|||
<dependency>
|
||||
<groupId>ognl</groupId>
|
||||
<artifactId>ognl</artifactId>
|
||||
<version>3.4.3</version>
|
||||
<version>3.1.28</version>
|
||||
</dependency>
|
||||
<!-- <dependency>-->
|
||||
<!-- <groupId>com.itextpdf</groupId>-->
|
||||
|
|
|
|||
|
|
@ -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<Integer> companyIds = Arrays.stream(user.getCompanyId().split(",")).map(Integer::parseInt).collect(Collectors.toList());
|
||||
List<TBaseCustomer> companys = customerService.listByIds(companyIds);
|
||||
DeviceInfoVO device = deviceService.getByDeviceNo(ticket.getDeviceNo());
|
||||
String comnpanyName = "";
|
||||
if (user.getType() == 0) {
|
||||
List<Integer> companyIds = Arrays.stream(user.getCompanyId().split(",")).map(Integer::parseInt).collect(Collectors.toList());
|
||||
List<TBaseCustomer> 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<AdminUser> 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")
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
/**
|
||||
* 设备状态名称
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@
|
|||
<td colspan="3"><img style="width: auto;height: 35px;" alt=""
|
||||
src="https://cabinet-tool.oss-cn-hangzhou.aliyuncs.com/admin/20250207/1/mmwf/logo.png"/>
|
||||
</td>
|
||||
<td colspan="9" style="text-align: center;margin: 10px;"><span style="font-size: 16pt;font-weight: bold;">移动破售后问题反馈表</span>
|
||||
<td colspan="9" style="text-align: center;margin: 10px;"><span style="font-size: 16pt;font-weight: bold;">工服售后问题反馈表</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
|
|
@ -61,8 +61,8 @@
|
|||
<tr>
|
||||
<td class="desc1">提交人</td>
|
||||
<td colspan="2" th:text="${ticket.createUserName}"></td>
|
||||
<td class="desc1">设备地点</td>
|
||||
<td colspan="4" th:text="${ticket.deviceAddress}"></td>
|
||||
<td class="desc1">设备区域</td>
|
||||
<td colspan="4" th:text="${ticket.ticketArea}"></td>
|
||||
<td colspan="2" class="desc1">设备运行时间</td>
|
||||
<td colspan="2" th:text="${ticket.useTime}+'小时'"></td>
|
||||
</tr>
|
||||
|
|
|
|||
|
|
@ -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<GongfuDevicePartMapper, GongfuDevicePart> implements IGongfuDevicePartService {
|
||||
|
||||
@Resource
|
||||
private ITBaseLanguageDataService languageDataService;
|
||||
private IGongfuDevicePartLanguageDataService gongfuDevicePartLanguageDataService;
|
||||
|
||||
public Page<GongfuDevicePart> selectListByPage(@Param("query") PageBaseQuery query) {
|
||||
return this.getBaseMapper().getListByPage(new Page<PageBaseQuery>(query.getPage(), query.getPageSize()), query);
|
||||
return this.getBaseMapper().getListByPage(new Page<>(query.getPage(), query.getPageSize()), query);
|
||||
}
|
||||
|
||||
public List<ExportPartDTO> exportPart(@Param("partNo") String partNo, @Param("partName") String partName) {
|
||||
|
|
@ -61,20 +61,20 @@ public class GongfuDevicePartServiceImpl extends ServiceImpl<GongfuDevicePartMap
|
|||
if (CollectionUtil.isEmpty(parts)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
List<TBaseLanguageData> languageData = languageDataService.lambdaQuery()
|
||||
.eq(TBaseLanguageData::getLanguageCode, language)
|
||||
.in(TBaseLanguageData::getSourceId, parts.stream().map(GongfuDevicePart::getId).collect(Collectors.toList()))
|
||||
List<GongfuDevicePartLanguageData> languageData = gongfuDevicePartLanguageDataService.lambdaQuery()
|
||||
.eq(GongfuDevicePartLanguageData::getLanguageCode, language)
|
||||
.in(GongfuDevicePartLanguageData::getSourceId, parts.stream().map(GongfuDevicePart::getId).collect(Collectors.toList()))
|
||||
.list();
|
||||
List<ComponentInfo> 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<GongfuDevicePartMap
|
|||
@Override
|
||||
public GongfuDevicePart getByIdAndLanguage(Long componentId, String language) {
|
||||
GongfuDevicePart part = getById(componentId);
|
||||
TBaseLanguageData languageData = languageDataService.lambdaQuery()
|
||||
.eq(TBaseLanguageData::getLanguageCode, language)
|
||||
.eq(TBaseLanguageData::getSourceId, componentId)
|
||||
GongfuDevicePartLanguageData languageData = gongfuDevicePartLanguageDataService.lambdaQuery()
|
||||
.eq(GongfuDevicePartLanguageData::getLanguageCode, language)
|
||||
.eq(GongfuDevicePartLanguageData::getSourceId, componentId)
|
||||
.one();
|
||||
if (Objects.nonNull(languageData) && StrUtil.isNotBlank(languageData.getLanguageValue())) {
|
||||
part.setPartName(languageData.getLanguageValue());
|
||||
} else {
|
||||
languageData = languageDataService.lambdaQuery()
|
||||
.eq(TBaseLanguageData::getLanguageCode, Constant.DEFAULT_LANGUAGE_CODE)
|
||||
.eq(TBaseLanguageData::getSourceId, componentId)
|
||||
languageData = gongfuDevicePartLanguageDataService.lambdaQuery()
|
||||
.eq(GongfuDevicePartLanguageData::getLanguageCode, Constant.DEFAULT_LANGUAGE_CODE)
|
||||
.eq(GongfuDevicePartLanguageData::getSourceId, componentId)
|
||||
.one();
|
||||
if (Objects.nonNull(languageData) && StrUtil.isNotBlank(languageData.getLanguageValue())) {
|
||||
part.setPartName(languageData.getLanguageValue());
|
||||
|
|
|
|||
|
|
@ -5,8 +5,8 @@
|
|||
<select id="getByDeviceNo" resultType="com.nflg.mobilebroken.common.pojo.vo.DeviceInfoVO">
|
||||
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;
|
||||
|
|
|
|||
|
|
@ -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<String> response = restTemplate.postForEntity(url,message, String.class);
|
||||
ResponseEntity<String> 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)
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -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();
|
||||
|
|
|
|||
Loading…
Reference in New Issue