fix(ticket): 修复工单相关功能和消息推送问题

- 完善AdminMessage中来源字段注释,新增来源类型派工单、工服工单
- 优化用户登录时账号过期判断,支持不同用户类型的过期处理
- 派工单获取接口添加派工单不存在异常抛出
- 文件上传接口修正参数类型,完善文件路径构建格式及异常处理
- GongfuTicketAreaService新增根据语言获取区域名功能
- 调整GongfuTicketMapper中的时间字段映射,修正完成时间、关闭时间字段一致性问题
- GongfuTicket服务中设置工单紧急程度,完善完成工单权限校验及完成时间设置
- 统一工单管理员获取方法,修正工单操作权限判断
- 将TicketEvaluate返回类型改为TicketDTO,统一DTO使用
- 调整SsePushService部分接口ticketId参数类型为Long,修正消息推送参数
- TicketCallBeginEvent和TicketCallEndEvent中修正ticketId传递类型
- TicketCloseEvent使用TicketDTO替代Ticket,完善消息推送中来源类型及来源ID设置
- TicketController获取工单详情时支持多语言区域名显示并修正公司名称获取逻辑
- 修正TicketController工单信息返回部分字段,新增客户名称和工单类型字段返回
- 其他若干代码格式和异常信息细节优化提升代码规范性和稳定性
This commit is contained in:
曹鹏飞 2025-11-27 18:09:29 +08:00
parent ced5b87a67
commit a24d588be4
33 changed files with 376 additions and 342 deletions

View File

@ -73,10 +73,15 @@ public class AppController extends ControllerBase {
.throwMessage(STATE.PassportErr, dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_SYSTEMERROR, Constant.DICTIONARY_ITEM_ACCOUNT_DISABLED, user.getLanguageCode()));
VUtils.trueThrow(Objects.equals(user.getState(), UserState.ToBeActivated.getState()))
.throwMessage(STATE.PassportErr, dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_SYSTEMERROR, Constant.DICTIONARY_ITEM_ACCOUNT_NOT_ACTIVATED, user.getLanguageCode()));
VUtils.trueThrow(user.getExpireTime().isBefore(ChronoLocalDate.from(LocalDateTime.now())) && user.getIsPrimary())
.throwMessage(STATE.PassportErr, dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_SYSTEMERROR, Constant.DICTIONARY_ITEM_ACCOUNT_HAS_EXPIRED_PRIMARY, user.getLanguageCode()));
VUtils.trueThrow(user.getExpireTime().isBefore(ChronoLocalDate.from(LocalDateTime.now())) && !user.getIsPrimary())
.throwMessage(STATE.PassportErr, dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_SYSTEMERROR, Constant.DICTIONARY_ITEM_ACCOUNT_HAS_EXPIRED, user.getLanguageCode()));
if (user.getType() == 0) {
VUtils.trueThrow(user.getExpireTime().isBefore(ChronoLocalDate.from(LocalDateTime.now())) && user.getIsPrimary())
.throwMessage(STATE.PassportErr, dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_SYSTEMERROR, Constant.DICTIONARY_ITEM_ACCOUNT_HAS_EXPIRED_PRIMARY, user.getLanguageCode()));
VUtils.trueThrow(user.getExpireTime().isBefore(ChronoLocalDate.from(LocalDateTime.now())) && !user.getIsPrimary())
.throwMessage(STATE.PassportErr, dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_SYSTEMERROR, Constant.DICTIONARY_ITEM_ACCOUNT_HAS_EXPIRED, user.getLanguageCode()));
} else if (user.getType() == 1) {
VUtils.trueThrow(user.getExpireTime().isBefore(ChronoLocalDate.from(LocalDateTime.now())))
.throwMessage(STATE.PassportErr, dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_SYSTEMERROR, Constant.DICTIONARY_ITEM_ACCOUNT_HAS_EXPIRED_ENDUSER, user.getLanguageCode()));
}
SaTokenAppUtil.login(user.getId(), SaLoginConfig
.setExtra("from", Constant.FROM_APP)
.setExtra("name", user.getName())

View File

@ -43,59 +43,59 @@ public class FileController extends ControllerBase {
@Resource
private IFileUploadRecordService fileUploadRecordService;
private static final DateTimeFormatter FORMATTER= DateTimeFormatter.ofPattern("yyyyMMdd");
private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd");
/**
* 上传单个文件
* @param file 要上传的文件
* @param source 文件来源 0工单1代理商2管理端账户3匿名工单
* @param file 要上传的文件
* @param source 文件来源 0工单1代理商2管理端账户3匿名工单
* @param sourceId 文件来源id 对应来源的数据id比如工单id代理商id管理端账户id
* @return 可访问的文件url
*/
@PostMapping("uploadSingleFile")
public ApiResult<FileUploadVO> uploadSingleFile(@Valid @NotNull @RequestParam("file") MultipartFile file
,@Valid @NotNull @RequestParam("source") Byte source
,@Valid @NotNull @RequestParam("sourceId") Integer sourceId) {
, @Valid @NotNull @RequestParam("source") Byte source
, @Valid @NotNull @RequestParam("sourceId") Long sourceId) {
try {
String fileName=file.getOriginalFilename();
String fileType=getFileType(fileName);
String url=fileUploadService.upload(buildFilePath(fileType), file);
FileUploadRecord record=buildFileUploadRecord(source,sourceId,fileName,fileType,url);
String fileName = file.getOriginalFilename();
String fileType = getFileType(fileName);
String url = fileUploadService.upload(buildFilePath(fileType), file);
FileUploadRecord record = buildFileUploadRecord(source, sourceId, fileName, fileType, url);
fileUploadRecordService.save(record);
return ApiResult.success(new FileUploadVO(record.getId(), fileName, url, file.getSize()));
}catch (Exception ex){
throw new NflgException(STATE.BusinessError,"上传文件失败:"+ex.getMessage());
} catch (Exception ex) {
throw new NflgException(STATE.BusinessError, "上传文件失败:" + ex.getMessage());
}
}
private String buildFilePath(String fileType) {
if (SaTokenAppUtil.isLogin()){
if (SaTokenAppUtil.isLogin()) {
return StrUtil.format("cfs/{}/{}/{}/{}{}", LocalDateTime.now().format(FORMATTER)
, AppUserUtil.getUserId(), RandomUtil.randomString(4), IdUtil.fastUUID(),fileType);
}else {
, AppUserUtil.getUserId(), RandomUtil.randomString(4), IdUtil.fastUUID(), fileType);
} else {
return StrUtil.format("cfs/{}/temp/{}/{}{}", LocalDateTime.now().format(FORMATTER)
,RandomUtil.randomString(4), IdUtil.fastUUID(),fileType);
, RandomUtil.randomString(4), IdUtil.fastUUID(), fileType);
}
}
/**
* 上传多个文件
* @param files 要上传的文件列表
* @param source 文件来源 0工单1代理商2管理端账户3匿名工单
* @param files 要上传的文件列表
* @param source 文件来源 0工单1代理商2管理端账户3匿名工单
* @param sourceId 文件来源id 对应来源的数据id比如工单id代理商id管理端账户id
* @return 可访问的文件url列表
*/
@PostMapping("uploadMultipleFiles")
public ApiResult<List<FileUploadVO>> uploadMultipleFiles(@Valid @RequestParam("files") @NotEmpty List<MultipartFile> files
,@Valid @NotNull @RequestParam("source") Byte source
,@Valid @NotNull @RequestParam("sourceId") Integer sourceId) {
, @Valid @NotNull @RequestParam("source") Byte source
, @Valid @NotNull @RequestParam("sourceId") Long sourceId) {
try {
List<FileUploadVO> list = new ArrayList<>();
for (MultipartFile file : files) {
String fileName=file.getOriginalFilename();
String fileType=getFileType(fileName);
String url=fileUploadService.upload(buildFilePath(fileType), file);
FileUploadRecord record=buildFileUploadRecord(source,sourceId,fileName,fileType,url);
String fileName = file.getOriginalFilename();
String fileType = getFileType(fileName);
String url = fileUploadService.upload(buildFilePath(fileType), file);
FileUploadRecord record = buildFileUploadRecord(source, sourceId, fileName, fileType, url);
fileUploadRecordService.save(record);
list.add(new FileUploadVO(record.getId(), fileName, url, file.getSize()));
}
@ -113,28 +113,28 @@ public class FileController extends ControllerBase {
@PostMapping("uploadSingleFile1")
public ApiResult<FileUploadVO> uploadSingleFile1(@Valid @NotNull @RequestParam("file") MultipartFile file) {
try {
String fileName=file.getOriginalFilename();
String fileType=getFileType(fileName);
String url=fileUploadService.upload(buildFilePath(fileType), file);
String fileName = file.getOriginalFilename();
String fileType = getFileType(fileName);
String url = fileUploadService.upload(buildFilePath(fileType), file);
return ApiResult.success(new FileUploadVO(0, fileName, url, file.getSize()));
}catch (Exception ex){
throw new NflgException(STATE.BusinessError,"上传文件失败:"+ex.getMessage());
} catch (Exception ex) {
throw new NflgException(STATE.BusinessError, "上传文件失败:" + ex.getMessage());
}
}
private String getFileType(String fileName){
return "."+FilenameUtils.getExtension(fileName);
private String getFileType(String fileName) {
return "." + FilenameUtils.getExtension(fileName);
}
private FileUploadRecord buildFileUploadRecord(Byte source,Integer sourceId,String fileName,String fileType,String url){
private FileUploadRecord buildFileUploadRecord(Byte source, Long sourceId, String fileName, String fileType, String url) {
return new FileUploadRecord()
.setFileName(fileName)
.setFileType(fileType)
.setFrom("app")
.setCreateTime(LocalDateTime.now())
.setSource(source)
.setSourceId(Long.valueOf(sourceId))
.setSourceId(sourceId)
.setUrl(url)
.setCreateBy(SaTokenAppUtil.isLogin()?AppUserUtil.getUserName():"");
.setCreateBy(SaTokenAppUtil.isLogin() ? AppUserUtil.getUserName() : "");
}
}

View File

@ -8,6 +8,7 @@ import com.nflg.mobilebroken.cfs.publisher.GongFuTicketEventPublisher;
import com.nflg.mobilebroken.cfs.publisher.TicketEventPublisher;
import com.nflg.mobilebroken.cfs.service.ShengWangService;
import com.nflg.mobilebroken.cfs.service.SsePushService;
import com.nflg.mobilebroken.cfs.service.TicketUnionService;
import com.nflg.mobilebroken.common.constant.Constant;
import com.nflg.mobilebroken.common.constant.TicketState;
import com.nflg.mobilebroken.common.pojo.ApiResult;
@ -52,6 +53,9 @@ public class TicketController extends ControllerBase {
@Resource
private IGongfuTicketService ticket1Service;
@Resource
private TicketUnionService ticketUnionService;
@Resource
private ITicketFollowService ticketFollowService;
@ -110,7 +114,7 @@ public class TicketController extends ControllerBase {
private ITicketSolutionAuditService ticketSolutionAuditService;
@Resource
private ITBaseAreaService baseAreaService;
private IGongfuTicketAreaService gongfuTicketAreaService;
/**
* 搜索设备
@ -232,9 +236,9 @@ public class TicketController extends ControllerBase {
public ApiResult<TicketInfoVO> getTicket(@Valid @RequestParam @NotNull Long id) {
TicketDTO ticket = ticketService.getDto(id);
VUtils.trueThrowBusinessError(Objects.isNull(ticket)).throwMessage("未找到工单");
String areaName = "";
List<TBaseCustomer> companys = new ArrayList<>();
String areaName = "", companyName = "";
String userName, userAvatar;
DeviceInfoVO device = deviceService.getByDeviceNo(ticket.getDeviceNo());
if (StrUtil.equals(ticket.getUserPlatform(), "app")) {
AppUser user = appUserService.getById(ticket.getUserId());
userName = user.getName();
@ -248,21 +252,17 @@ public class TicketController extends ControllerBase {
areaName = area.getName();
}
}
companys = customerService.listByIds(Arrays.stream(user.getCompanyId().split(",")).map(Integer::parseInt).collect(Collectors.toList()));
companyName = StrUtil.join(",", customerService.listByIds(Arrays.stream(user.getCompanyId().split(",")).map(Integer::parseInt).collect(Collectors.toList()))
.stream().map(TBaseCustomer::getAgencyCompanyName).collect(Collectors.toList()));
} else if (user.getType() == 1) {
if (Objects.nonNull(user.getAreaId())) {
TBaseArea area = baseAreaService.getById(user.getAreaId());
if (Objects.nonNull(area)) {
areaName = area.getAreaName();
}
}
areaName = gongfuTicketAreaService.getAreaName(ticket.getAreaId(), MultilingualUtil.getLanguage());
companyName = device.getAgentName();
}
} else {
AdminUser adminUser = adminUserService.getById(ticket.getUserId());
userName = adminUser.getUserName();
userAvatar = adminUser.getAvatar();
}
DeviceInfoVO device = deviceService.getByDeviceNo(ticket.getDeviceNo());
String handle = ticket.getHandle();
if (StrUtil.isNotBlank(handle)) {
List<AdminUser> adminUsers = adminUserService.listByIds(Arrays.stream(handle.split(",")).map(Integer::parseInt).collect(Collectors.toList()));
@ -286,9 +286,11 @@ public class TicketController extends ControllerBase {
.setCreateTime(ticket.getCreateTime())
.setAreaName(areaName)
.setSolveTime(ticket.getSolveTime())
.setCompanyName(StrUtil.join(",", companys.stream().map(TBaseCustomer::getAgencyCompanyName).collect(Collectors.toList())))
.setCompanyName(companyName)
.setHandle(handle)
.setSolution(ticket.getReason())
.setCustomerName(ticket.getCustomerName())
.setType(ticket.getType())
.setEvaluate(getTicketEvaluate(ticket.getId()));
if (Objects.equals(ticket.getType(), 0)) {
@ -400,7 +402,7 @@ public class TicketController extends ControllerBase {
**/
@PostMapping("addChatMessage")
public ApiResult<Void> addChatMessage(@Valid @RequestBody AddChatMessageRequest request) {
TicketVO ticket = ticketService.getFromView(request.getTicketId());
TicketDTO ticket = ticketService.getDto(request.getTicketId());
VUtils.trueThrowBusinessError(Objects.isNull(ticket)).throwMessage("工单不存在");
VUtils.trueThrowBusinessError(Byte.compare(ticket.getState(), TicketState.Processing.getState()) > 1)
.throwMessage("当前工单状态不允许发送消息");
@ -452,8 +454,8 @@ public class TicketController extends ControllerBase {
* @param id 工单编号
**/
@GetMapping("revokedTicket")
public ApiResult<Void> revokedTicket(@Valid @RequestParam @NotNull Integer id) {
Ticket ticket = ticketService.revoked(id);
public ApiResult<Void> revokedTicket(@Valid @RequestParam @NotNull Long id) {
TicketDTO ticket = ticketUnionService.revoked(id);
ticketEventPublisher.publishTicketRevokeEvent(ticket, MultilingualUtil.getLanguage(), MultilingualUtil.getZone());
return ApiResult.success();
}
@ -463,8 +465,8 @@ public class TicketController extends ControllerBase {
* @param id 工单编号
**/
@GetMapping
public ApiResult<Void> reopenTicket(@Valid @RequestParam @NotNull Integer id) {
Ticket ticket = ticketService.reopen(id);
public ApiResult<Void> reopenTicket(@Valid @RequestParam @NotNull Long id) {
TicketDTO ticket = ticketUnionService.reopen(id);
ticketEventPublisher.publishTicketReopenEvent(ticket, MultilingualUtil.getLanguage(), MultilingualUtil.getZone());
ChatMessageDTO message = new ChatMessageDTO()
.setId(IdUtil.getSnowflakeNextIdStr())
@ -474,10 +476,10 @@ public class TicketController extends ControllerBase {
.setSenderName("服务助手")
.setContent("<b>重启议题</b><br/>用户重启议题,请继续关注此工单信息。")
.setCreateTime(Instant.now());
ticketChatService.addMessage(Long.valueOf(id), message);
ticketChatService.addMessage(id, message);
//推送消息
ssePushService.sendTicketMessageToAdmin(Long.valueOf(id), message);
ssePushService.sendTicketMessageToApp(Long.valueOf(id), message);
ssePushService.sendTicketMessageToAdmin(id, message);
ssePushService.sendTicketMessageToApp(id, message);
return ApiResult.success();
}
@ -496,7 +498,7 @@ public class TicketController extends ControllerBase {
**/
@PostMapping("addTicketEvaluate")
public ApiResult<Void> addTicketEvaluate(@Valid @RequestBody TicketEvaluateAddRequest request) {
Ticket ticket = ticketEvaluateService.add(request);
TicketDTO ticket = ticketEvaluateService.add(request);
// ticketEventPublisher.publishTicketEvaluateEvent(ticket, MultilingualUtil.getLanguage(), MultilingualUtil.getZone());
ChatMessageDTO message = new ChatMessageDTO()
.setId(IdUtil.getSnowflakeNextIdStr())
@ -508,9 +510,9 @@ public class TicketController extends ControllerBase {
.setCreateTime(Instant.now());
ticketChatService.addMessage(request.getTicketId(), message);
//推送消息
ssePushService.sendTicketMessageToAdmin(Long.valueOf(ticket.getId()), message);
ssePushService.sendTicketMessageToApp(Long.valueOf(ticket.getId()), message);
if (ticketService.close(ticket)) {
ssePushService.sendTicketMessageToAdmin(ticket.getId(), message);
ssePushService.sendTicketMessageToApp(ticket.getId(), message);
if (ticketUnionService.close(ticket)) {
ticketEventPublisher.publishTicketCloseEvent(ticket);
message = new ChatMessageDTO()
.setId(IdUtil.getSnowflakeNextIdStr())
@ -553,7 +555,7 @@ public class TicketController extends ControllerBase {
*/
@GetMapping("call")
public ApiResult<Void> call(@Valid @RequestParam @NotNull Long ticketId) {
Ticket ticket = ticketService.getById(ticketId);
TicketDTO ticket = ticketService.getDto(ticketId);
VUtils.trueThrowBusinessError(Objects.isNull(ticket)).throwMessage("工单不存在");
VUtils.trueThrowBusinessError(!Objects.equals(ticket.getState(), TicketState.Processing.getState()))
.throwMessage("当前工单状态不允许请求通话");
@ -591,8 +593,8 @@ public class TicketController extends ControllerBase {
* @param ticketId 工单编号
*/
@GetMapping("call/joinChannel")
public ApiResult<Void> joinChannel(@Valid @RequestParam @NotNull Integer ticketId) throws IOException, InterruptedException {
Ticket ticket = ticketService.getById(ticketId);
public ApiResult<Void> joinChannel(@Valid @RequestParam @NotNull Long ticketId) throws IOException, InterruptedException {
TicketDTO ticket = ticketService.getDto(ticketId);
VUtils.trueThrowBusinessError(Objects.isNull(ticket)).throwMessage("工单不存在");
VUtils.trueThrowBusinessError(!Objects.equals(ticket.getState(), TicketState.Processing.getState()))
.throwMessage("当前工单状态不允许通话");
@ -607,7 +609,7 @@ public class TicketController extends ControllerBase {
.setSendData(new UniPushMessageBody()
.setTitle("视频通话")
.setPayload(new UniPushMessageCallPayload()
.setTicketId(Long.valueOf(ticketId))
.setTicketId(ticketId)
.setUserId(AppUserUtil.getUserId())
.setCategory("ticketCallJoined")
.setFrom("app")
@ -633,7 +635,7 @@ public class TicketController extends ControllerBase {
.setSendData(new UniPushMessageBody()
.setTitle("视频通话结束")
.setPayload(new UniPushMessageCallPayload()
.setTicketId(Long.valueOf(request.getTicketId()))
.setTicketId(request.getTicketId())
.setUserId(Integer.valueOf(StrUtil.split(uid, "-").get(1)))
.setCategory("ticketCallEnd")
.setFrom("app")

View File

@ -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(@RequestParam String text) {
public ApiResult<String> deepseek(@RequestBody String text) {
return ApiResult.success(deepSeekTranslate.translateWord(text, "auto", AppUserUtil.getLanguageName(), "html"));
}
}

View File

@ -40,7 +40,7 @@ public class TicketCallBeginEvent extends ApplicationEvent implements Applicatio
.setSenderName("通话助手")
.setContent(userName+"发起了视频通话")
.setCreateTime(Instant.now());
ticketChatService.addMessage(Long.valueOf(ticketId), message);
ticketChatService.addMessage(ticketId, message);
//推送消息
ssePushService.sendTicketMessageToAdmin(ticketId,message);
ssePushService.sendTicketMessageToApp(ticketId,message);

View File

@ -54,7 +54,7 @@ public class TicketCallEndEvent extends ApplicationEvent implements ApplicationC
.setSenderName("通话助手")
.setContent("视频通话已结束")
.setCreateTime(Instant.now());
ticketChatService.addMessage(Long.valueOf(ticketId), message);
ticketChatService.addMessage(ticketId, message);
//推送消息
ssePushService.sendTicketMessageToAdmin(ticketId, message);
ssePushService.sendTicketMessageToApp(ticketId, message);

View File

@ -1,66 +1,55 @@
package com.nflg.mobilebroken.cfs.event;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.util.StrUtil;
import com.nflg.mobilebroken.common.constant.MessageSubType;
import com.nflg.mobilebroken.common.constant.MessageType;
import com.nflg.mobilebroken.common.pojo.dto.TicketDTO;
import com.nflg.mobilebroken.repository.entity.AdminMessage;
import com.nflg.mobilebroken.repository.entity.AdminUser;
import com.nflg.mobilebroken.repository.entity.Ticket;
import com.nflg.mobilebroken.repository.service.*;
import com.nflg.mobilebroken.starter.service.EmailService;
import com.nflg.mobilebroken.repository.service.IAdminMessageService;
import com.nflg.mobilebroken.repository.service.IAdminUserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ApplicationEvent;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.stream.Collectors;
public class TicketCloseEvent extends ApplicationEvent implements ApplicationContextAware {
private static final DateTimeFormatter FORMATTER= DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN);
private final Ticket ticket;
private IDictionaryItemTranslateService dictionaryItemTranslateService;
private IAppUserService appUserService;
private EmailService emailService;
private ITBaseDeviceTypeService deviceTypeService;
private final TicketDTO ticket;
private IAdminUserService adminUserService;
private IAdminMessageService adminMessageService;
public TicketCloseEvent(Object source,Ticket ticket) {
public TicketCloseEvent(Object source, TicketDTO ticket) {
super(source);
this.ticket = ticket;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) {
this.dictionaryItemTranslateService = applicationContext.getBean(IDictionaryItemTranslateService.class);
this.appUserService = applicationContext.getBean(IAppUserService.class);
this.emailService = applicationContext.getBean(EmailService.class);
this.adminUserService = applicationContext.getBean(IAdminUserService.class);
this.adminMessageService = applicationContext.getBean(IAdminMessageService.class);
this.deviceTypeService = applicationContext.getBean(ITBaseDeviceTypeService.class);
}
public void send(){
public void send() {
sendUserMessage();
}
private void sendUserMessage(){
private void sendUserMessage() {
//我的待办
List<Integer> userIds= StrUtil.split(ticket.getHandle(),",").stream().map(Integer::parseInt).collect(Collectors.toList());
List<AdminUser> adminUsers=adminUserService.listByIds(userIds);
if (CollectionUtil.isNotEmpty(adminUsers)){
List<Integer> userIds = StrUtil.split(ticket.getHandle(), ",").stream().map(Integer::parseInt).collect(Collectors.toList());
List<AdminUser> adminUsers = adminUserService.listByIds(userIds);
if (CollectionUtil.isNotEmpty(adminUsers)) {
adminUsers.forEach(c -> adminMessageService.add(
new AdminMessage()
.setNo(ticket.getNo())
.setTitle(ticket.getTitle())
.setUserId(c.getId())
.setSourceId(Long.valueOf(ticket.getId()))
.setSource(0)
.setSourceId(ticket.getId())
.setSource(ticket.getType() == 0 ? 0 : 3)
.setType(MessageType.WorkOrderAssignment.getState())
.setSubType(MessageSubType.TicketClosed.getState())
.setIsRead(false)

View File

@ -4,11 +4,13 @@ import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DatePattern;
import com.nflg.mobilebroken.common.constant.MessageSubType;
import com.nflg.mobilebroken.common.constant.MessageType;
import com.nflg.mobilebroken.common.pojo.dto.TicketDTO;
import com.nflg.mobilebroken.repository.entity.AdminMessage;
import com.nflg.mobilebroken.repository.entity.AdminUser;
import com.nflg.mobilebroken.repository.entity.Ticket;
import com.nflg.mobilebroken.repository.service.*;
import com.nflg.mobilebroken.starter.service.EmailService;
import com.nflg.mobilebroken.repository.service.IAdminMessageService;
import com.nflg.mobilebroken.repository.service.IAdminUserService;
import com.nflg.mobilebroken.repository.service.IGongfuDeviceTypeService;
import com.nflg.mobilebroken.repository.service.ITBaseDeviceTypeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
@ -21,45 +23,40 @@ import java.util.List;
@Slf4j
public class TicketEvaluateEvent extends ApplicationEvent implements ApplicationContextAware {
private static final DateTimeFormatter FORMATTER= DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN);
private final Ticket ticket;
private final String language;
private final String zone;
private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN);
private final TicketDTO ticket;
private IDictionaryItemTranslateService dictionaryItemTranslateService;
private IAppUserService appUserService;
private EmailService emailService;
private ITBaseDeviceTypeService deviceTypeService;
private IGongfuDeviceTypeService gongfuDeviceTypeService;
private IAdminUserService adminUserService;
private IAdminMessageService adminMessageService;
public TicketEvaluateEvent(Object source, Ticket ticket,String language,String zone) {
public TicketEvaluateEvent(Object source, TicketDTO ticket, String language, String zone) {
super(source);
this.ticket = ticket;
this.language = language;
this.zone = zone;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) {
this.dictionaryItemTranslateService = applicationContext.getBean(IDictionaryItemTranslateService.class);
this.appUserService = applicationContext.getBean(IAppUserService.class);
this.emailService = applicationContext.getBean(EmailService.class);
this.adminUserService = applicationContext.getBean(IAdminUserService.class);
this.adminMessageService = applicationContext.getBean(IAdminMessageService.class);
this.deviceTypeService = applicationContext.getBean(ITBaseDeviceTypeService.class);
}
public void send(){
sendUserMessage();
public void send() {
if (ticket.getType() == 0) {
sendUserMessage();
} else {
sendUserMessage1();
}
}
private void sendUserMessage(){
private void sendUserMessage() {
//我的待办
List<Integer> cqms=deviceTypeService.getCqmsByDeviceType(ticket.getDeviceNo());
if (CollectionUtil.isEmpty(cqms)){
List<Integer> cqms = deviceTypeService.getCqmsByDeviceType(ticket.getDeviceNo());
if (CollectionUtil.isEmpty(cqms)) {
log.warn("该设备尚未设置CQM负责人:{}", ticket.getDeviceNo());
}else {
} else {
List<AdminUser> cqmUsers = adminUserService.listByIds(cqms);
if (CollectionUtil.isNotEmpty(cqmUsers)) {
cqmUsers.forEach(c -> adminMessageService.add(
@ -67,7 +64,7 @@ public class TicketEvaluateEvent extends ApplicationEvent implements Application
.setNo(ticket.getNo())
.setTitle(ticket.getTitle())
.setUserId(c.getId())
.setSourceId(Long.valueOf(ticket.getId()))
.setSourceId(ticket.getId())
.setSource(0)
.setType(MessageType.WorkOrderAssignment.getState())
.setSubType(MessageSubType.TicketCompletion.getState())
@ -77,4 +74,28 @@ public class TicketEvaluateEvent extends ApplicationEvent implements Application
}
}
}
private void sendUserMessage1() {
//我的待办
List<Integer> cqms = gongfuDeviceTypeService.getCqms(ticket.getDeviceNo());
if (CollectionUtil.isEmpty(cqms)) {
log.warn("该设备尚未设置负责人:{}", 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.TicketCompletion.getState())
.setIsRead(false)
.setCreateTime(LocalDateTime.now()))
);
}
}
}
}

View File

@ -1,76 +1,46 @@
package com.nflg.mobilebroken.cfs.event;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.util.StrUtil;
import com.nflg.mobilebroken.common.constant.MessageSubType;
import com.nflg.mobilebroken.common.constant.MessageType;
import com.nflg.mobilebroken.common.pojo.dto.TicketDTO;
import com.nflg.mobilebroken.repository.entity.AdminMessage;
import com.nflg.mobilebroken.repository.entity.AdminUser;
import com.nflg.mobilebroken.repository.entity.Ticket;
import com.nflg.mobilebroken.repository.service.IAdminMessageService;
import com.nflg.mobilebroken.repository.service.IAdminUserService;
import com.nflg.mobilebroken.repository.service.IAppUserService;
import com.nflg.mobilebroken.repository.service.IDictionaryItemTranslateService;
import com.nflg.mobilebroken.starter.service.EmailService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ApplicationEvent;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.stream.Collectors;
@Slf4j
public class TicketReopenEvent extends ApplicationEvent implements ApplicationContextAware {
private static final DateTimeFormatter FORMATTER= DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN);
private final Ticket ticket;
private final String language;
private final String zone;
private IDictionaryItemTranslateService dictionaryItemTranslateService;
private IAppUserService appUserService;
private EmailService emailService;
private final TicketDTO ticket;
private IAdminUserService adminUserService;
private IAdminMessageService adminMessageService;
public TicketReopenEvent(Object source,Ticket ticket, String language, String zone) {
public TicketReopenEvent(Object source, TicketDTO ticket, String language, String zone) {
super(source);
this.ticket = ticket;
this.language = language;
this.zone = zone;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) {
this.dictionaryItemTranslateService = applicationContext.getBean(IDictionaryItemTranslateService.class);
this.appUserService = applicationContext.getBean(IAppUserService.class);
this.emailService = applicationContext.getBean(EmailService.class);
this.adminUserService = applicationContext.getBean(IAdminUserService.class);
this.adminMessageService = applicationContext.getBean(IAdminMessageService.class);
}
public void send(){
public void send() {
sendUserMessage();
}
private void sendUserMessage(){
//我的待办
// CQM
// AdminUser cqmUser = adminUserService.getById(ticket.getCqm());
// adminMessageService.add(
// new AdminMessage()
// .setNo(ticket.getNo())
// .setTitle(ticket.getTitle())
// .setUserId(cqmUser.getId())
// .setSourceId(ticket.getId())
// .setSource(0)
// .setType(MessageType.WorkOrderAssignment.getState())
// .setSubType(MessageSubType.TicketReopen.getState())
// .setIsRead(false)
// .setCreateTime(LocalDateTime.now()));
private void sendUserMessage() {
//处理人
List<Integer> userIds = StrUtil.split(ticket.getHandle(), ",").stream().map(Integer::parseInt).collect(Collectors.toList());
List<AdminUser> adminUsers = adminUserService.listByIds(userIds);
@ -80,8 +50,8 @@ public class TicketReopenEvent extends ApplicationEvent implements ApplicationCo
.setNo(ticket.getNo())
.setTitle(ticket.getTitle())
.setUserId(c.getId())
.setSourceId(Long.valueOf(ticket.getId()))
.setSource(0)
.setSourceId(ticket.getId())
.setSource(ticket.getType() == 0 ? 0 : 3)
.setType(MessageType.WorkOrderAssignment.getState())
.setSubType(MessageSubType.TicketReopen.getState())
.setIsRead(false)

View File

@ -6,7 +6,7 @@ import cn.hutool.core.util.StrUtil;
import com.nflg.mobilebroken.common.constant.Constant;
import com.nflg.mobilebroken.common.constant.MessageSubType;
import com.nflg.mobilebroken.common.constant.MessageType;
import com.nflg.mobilebroken.common.pojo.vo.TicketVO;
import com.nflg.mobilebroken.common.pojo.dto.TicketDTO;
import com.nflg.mobilebroken.repository.entity.AdminMessage;
import com.nflg.mobilebroken.repository.entity.AdminUser;
import com.nflg.mobilebroken.repository.entity.AppUser;
@ -31,8 +31,8 @@ import java.util.stream.Collectors;
@Slf4j
public class TicketReplyEvent extends ApplicationEvent implements ApplicationContextAware {
private static final DateTimeFormatter FORMATTER= DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN);
private final TicketVO ticket;
private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN);
private final TicketDTO ticket;
private final String language;
private final String zone;
private IDictionaryItemTranslateService dictionaryItemTranslateService;
@ -41,7 +41,7 @@ public class TicketReplyEvent extends ApplicationEvent implements ApplicationCon
private IAdminUserService adminUserService;
private IAdminMessageService adminMessageService;
public TicketReplyEvent(Object source, TicketVO ticket, String language, String zone) {
public TicketReplyEvent(Object source, TicketDTO ticket, String language, String zone) {
super(source);
this.ticket = ticket;
this.language = language;
@ -57,15 +57,15 @@ public class TicketReplyEvent extends ApplicationEvent implements ApplicationCon
this.adminMessageService = applicationContext.getBean(IAdminMessageService.class);
}
public void send(){
public void send() {
sendUserMessage();
// sendEmail();
}
private void sendUserMessage(){
private void sendUserMessage() {
//我的待办
if(StrUtil.isNotBlank(ticket.getHandle())) {
List<Integer> userIds = StrUtil.split(ticket.getHandle(),",").stream().map(Integer::parseInt).collect(Collectors.toList());
if (StrUtil.isNotBlank(ticket.getHandle())) {
List<Integer> userIds = StrUtil.split(ticket.getHandle(), ",").stream().map(Integer::parseInt).collect(Collectors.toList());
List<AdminUser> adminUsers = adminUserService.listByIds(userIds);
if (CollectionUtil.isNotEmpty(adminUsers)) {
adminUsers.forEach(c -> adminMessageService.add(
@ -74,7 +74,7 @@ public class TicketReplyEvent extends ApplicationEvent implements ApplicationCon
.setTitle(ticket.getTitle())
.setUserId(c.getId())
.setSourceId(ticket.getId())
.setSource(0)
.setSource(ticket.getType() == 0 ? 0 : 3)
.setType(MessageType.WorkOrderAssignment.getState())
.setSubType(MessageSubType.TicketNewMessage.getState())
.setIsRead(false)
@ -86,7 +86,7 @@ public class TicketReplyEvent extends ApplicationEvent implements ApplicationCon
private void sendEmail() {
try {
List<Integer> userIds = StrUtil.split(ticket.getHandle(),",").stream().map(Integer::parseInt).collect(Collectors.toList());
List<Integer> userIds = StrUtil.split(ticket.getHandle(), ",").stream().map(Integer::parseInt).collect(Collectors.toList());
List<AdminUser> adminUsers = adminUserService.listByIds(userIds);
if (CollectionUtil.isNotEmpty(adminUsers)) {
AppUser appUser = appUserService.getById(ticket.getUserId());
@ -106,15 +106,15 @@ public class TicketReplyEvent extends ApplicationEvent implements ApplicationCon
}
}
private void sendEmail(List<AdminUser> adminUsers,String subject,String content) throws MessagingException {
if (CollectionUtil.isNotEmpty(adminUsers)){
for (AdminUser adminUser:adminUsers) {
emailService.sendEmail(adminUser.getEmail(),subject,content);
private void sendEmail(List<AdminUser> adminUsers, String subject, String content) throws MessagingException {
if (CollectionUtil.isNotEmpty(adminUsers)) {
for (AdminUser adminUser : adminUsers) {
emailService.sendEmail(adminUser.getEmail(), subject, content);
}
}
}
private String toTimeString(LocalDateTime time){
private String toTimeString(LocalDateTime time) {
return time.atZone(ZoneOffset.UTC)
.withZoneSameInstant(ZoneId.of(zone))
.toLocalDateTime()

View File

@ -1,85 +1,60 @@
package com.nflg.mobilebroken.cfs.event;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.util.StrUtil;
import com.nflg.mobilebroken.common.constant.MessageSubType;
import com.nflg.mobilebroken.common.constant.MessageType;
import com.nflg.mobilebroken.common.pojo.dto.TicketDTO;
import com.nflg.mobilebroken.repository.entity.AdminMessage;
import com.nflg.mobilebroken.repository.entity.AdminUser;
import com.nflg.mobilebroken.repository.entity.Ticket;
import com.nflg.mobilebroken.repository.service.*;
import com.nflg.mobilebroken.starter.service.EmailService;
import com.nflg.mobilebroken.repository.service.IAdminMessageService;
import com.nflg.mobilebroken.repository.service.IAdminUserService;
import com.nflg.mobilebroken.repository.service.IGongfuDeviceTypeService;
import com.nflg.mobilebroken.repository.service.ITBaseDeviceTypeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ApplicationEvent;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.stream.Collectors;
@Slf4j
public class TicketRevokeEvent extends ApplicationEvent implements ApplicationContextAware {
private static final DateTimeFormatter FORMATTER= DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN);
private final Ticket ticket;
private final String language;
private final String zone;
private IDictionaryItemTranslateService dictionaryItemTranslateService;
private IAppUserService appUserService;
private EmailService emailService;
private final TicketDTO ticket;
private ITBaseDeviceTypeService deviceTypeService;
private IGongfuDeviceTypeService gongfuDeviceTypeService;
private IAdminUserService adminUserService;
private IAdminMessageService adminMessageService;
public TicketRevokeEvent(Object source,Ticket ticket, String language, String zone) {
public TicketRevokeEvent(Object source, TicketDTO ticket, String language, String zone) {
super(source);
this.ticket = ticket;
this.language = language;
this.zone = zone;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) {
this.dictionaryItemTranslateService = applicationContext.getBean(IDictionaryItemTranslateService.class);
this.appUserService = applicationContext.getBean(IAppUserService.class);
this.emailService = applicationContext.getBean(EmailService.class);
this.adminUserService = applicationContext.getBean(IAdminUserService.class);
this.adminMessageService = applicationContext.getBean(IAdminMessageService.class);
this.deviceTypeService = applicationContext.getBean(ITBaseDeviceTypeService.class);
this.gongfuDeviceTypeService = applicationContext.getBean(IGongfuDeviceTypeService.class);
}
public void send(){
sendUserMessage();
}
private void sendUserMessage(){
//我的待办
//CQM
List<Integer> cqms=deviceTypeService.getCqmsByDeviceType(ticket.getDeviceNo());
if (CollectionUtil.isEmpty(cqms)){
log.warn("该设备尚未设置CQM负责人:{}", 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(Long.valueOf(ticket.getId()))
.setSource(0)
.setType(MessageType.WorkOrderAssignment.getState())
.setSubType(MessageSubType.TicketRevoke.getState())
.setIsRead(false)
.setCreateTime(LocalDateTime.now()))
);
}
public void send() {
if (ticket.getType() == 0) {
sendToCqm();
} else {
sendToCqm1();
}
sendToHandler();
}
private void sendToHandler() {
//处理人
List<Integer> userIds= StrUtil.split(ticket.getHandle(),",").stream().map(Integer::parseInt).collect(Collectors.toList());
List<Integer> userIds = StrUtil.split(ticket.getHandle(), ",").stream().map(Integer::parseInt).collect(Collectors.toList());
if (CollectionUtil.isNotEmpty(userIds)) {
List<AdminUser> adminUsers = adminUserService.listByIds(userIds);
if (CollectionUtil.isNotEmpty(adminUsers)) {
@ -88,7 +63,7 @@ public class TicketRevokeEvent extends ApplicationEvent implements ApplicationCo
.setNo(ticket.getNo())
.setTitle(ticket.getTitle())
.setUserId(c.getId())
.setSourceId(Long.valueOf(ticket.getId()))
.setSourceId(ticket.getId())
.setSource(0)
.setType(MessageType.WorkOrderAssignment.getState())
.setSubType(MessageSubType.TicketRevoke.getState())
@ -98,4 +73,54 @@ public class TicketRevokeEvent extends ApplicationEvent implements ApplicationCo
}
}
}
private void sendToCqm() {
//我的待办
//CQM
List<Integer> cqms = deviceTypeService.getCqmsByDeviceType(ticket.getDeviceNo());
if (CollectionUtil.isEmpty(cqms)) {
log.warn("该设备尚未设置CQM负责人:{}", 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(0)
.setType(MessageType.WorkOrderAssignment.getState())
.setSubType(MessageSubType.TicketRevoke.getState())
.setIsRead(false)
.setCreateTime(LocalDateTime.now()))
);
}
}
}
private void sendToCqm1() {
//我的待办
//CQM
List<Integer> cqms = gongfuDeviceTypeService.getCqms(ticket.getDeviceNo());
if (CollectionUtil.isEmpty(cqms)) {
log.warn("该设备尚未设置负责人:{}", 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.TicketRevoke.getState())
.setIsRead(false)
.setCreateTime(LocalDateTime.now()))
);
}
}
}
}

View File

@ -1,7 +1,7 @@
package com.nflg.mobilebroken.cfs.publisher;
import com.nflg.mobilebroken.cfs.event.*;
import com.nflg.mobilebroken.common.pojo.vo.TicketVO;
import com.nflg.mobilebroken.common.pojo.dto.TicketDTO;
import com.nflg.mobilebroken.repository.entity.Ticket;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationEventPublisher;
@ -24,31 +24,31 @@ public class TicketEventPublisher {
eventPublisher.publishEvent(event);
}
public void publishTicketReplyEvent(TicketVO ticket, String language, String zone) {
public void publishTicketReplyEvent(TicketDTO ticket, String language, String zone) {
TicketReplyEvent event = new TicketReplyEvent(this, ticket, language, zone);
event.setApplicationContext(applicationContext);
eventPublisher.publishEvent(event);
}
public void publishTicketRevokeEvent(Ticket ticket, String language, String zone) {
public void publishTicketRevokeEvent(TicketDTO ticket, String language, String zone) {
TicketRevokeEvent event = new TicketRevokeEvent(this, ticket, language, zone);
event.setApplicationContext(applicationContext);
eventPublisher.publishEvent(event);
}
public void publishTicketReopenEvent(Ticket ticket, String language, String zone) {
public void publishTicketReopenEvent(TicketDTO ticket, String language, String zone) {
TicketReopenEvent event = new TicketReopenEvent(this, ticket, language, zone);
event.setApplicationContext(applicationContext);
eventPublisher.publishEvent(event);
}
public void publishTicketEvaluateEvent(Ticket ticket, String language, String zone) {
public void publishTicketEvaluateEvent(TicketDTO ticket, String language, String zone) {
TicketEvaluateEvent event = new TicketEvaluateEvent(this, ticket, language, zone);
event.setApplicationContext(applicationContext);
eventPublisher.publishEvent(event);
}
public void publishTicketCloseEvent(Ticket ticket) {
public void publishTicketCloseEvent(TicketDTO ticket) {
TicketCloseEvent event = new TicketCloseEvent(this, ticket);
event.setApplicationContext(applicationContext);
eventPublisher.publishEvent(event);

View File

@ -174,17 +174,17 @@ public class SsePushService {
return restTemplate.postForObject(sseUrl + "/sse/" + to + "/push/user/message", request, ApiResult.class);
}
public void sendTicketCallHangUpToAdmin(@NotNull Integer ticketId, @NotNull Integer userId, AppUser user) {
public void sendTicketCallHangUpToAdmin(@NotNull Long ticketId, @NotNull Integer userId, AppUser user) {
try {
PushUserMessageRequest request = new PushUserMessageRequest()
.setUserId(userId)
.setMessage(new PushMessageDTO()
.setType("ticketCallHangUp")
.setData(new PushMessageDataBody()
.setTargetId(Long.valueOf(ticketId))
.setTargetId(ticketId)
.setType("ticketCallHangUp")
.setData(new UniPushMessageCallPayload()
.setTicketId(Long.valueOf(ticketId))
.setTicketId(ticketId)
.setUserId(user.getId())
.setUserName(user.getName())
.setUserAvatar(user.getAvatar())
@ -199,17 +199,17 @@ public class SsePushService {
}
}
public void sendTicketCallCancelToAdmin(@NotNull Integer ticketId, @NotNull Integer userId, AppUser user) {
public void sendTicketCallCancelToAdmin(@NotNull Long ticketId, @NotNull Integer userId, AppUser user) {
try {
PushUserMessageRequest request = new PushUserMessageRequest()
.setUserId(userId)
.setMessage(new PushMessageDTO()
.setType("ticketCallCancel")
.setData(new PushMessageDataBody()
.setTargetId(Long.valueOf(ticketId))
.setTargetId(ticketId)
.setType("ticketCallCancel")
.setData(new UniPushMessageCallPayload()
.setTicketId(Long.valueOf(ticketId))
.setTicketId(ticketId)
.setUserId(user.getId())
.setUserName(user.getName())
.setUserAvatar(user.getAvatar())
@ -224,17 +224,17 @@ public class SsePushService {
}
}
public void sendTicketCallJoinedToApp(Integer userId,@NotNull Integer ticketId) {
public void sendTicketCallJoinedToApp(Integer userId, @NotNull Long ticketId) {
try {
PushUserMessageRequest request = new PushUserMessageRequest()
.setUserId(userId)
.setMessage(new PushMessageDTO()
.setType("ticketCallJoined")
.setData(new PushMessageDataBody()
.setTargetId(Long.valueOf(ticketId))
.setTargetId(ticketId)
.setType("ticketCallJoined")
.setData(new UniPushMessageCallPayload()
.setTicketId(Long.valueOf(ticketId))
.setTicketId(ticketId)
.setFrom("app")
)
)
@ -246,17 +246,17 @@ public class SsePushService {
}
}
public void sendTicketCallJoined(Integer userId, @Valid @NotNull Integer ticketId, String to) {
public void sendTicketCallJoined(Integer userId, @Valid @NotNull Long ticketId, String to) {
try {
PushUserMessageRequest request = new PushUserMessageRequest()
.setUserId(userId)
.setMessage(new PushMessageDTO()
.setType("ticketCallJoined")
.setData(new PushMessageDataBody()
.setTargetId(Long.valueOf(ticketId))
.setTargetId(ticketId)
.setType("ticketCallJoined")
.setData(new UniPushMessageCallPayload()
.setTicketId(Long.valueOf(ticketId))
.setTicketId(ticketId)
.setFrom("app")
)
)

View File

@ -0,0 +1,57 @@
package com.nflg.mobilebroken.cfs.service;
import cn.hutool.core.convert.Convert;
import com.nflg.mobilebroken.common.pojo.dto.TicketDTO;
import com.nflg.mobilebroken.repository.entity.GongfuTicket;
import com.nflg.mobilebroken.repository.entity.Ticket;
import com.nflg.mobilebroken.repository.service.IGongfuTicketService;
import com.nflg.mobilebroken.repository.service.ITicketService;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@Component
public class TicketUnionService {
@Resource
private ITicketService ticketService;
@Resource
private IGongfuTicketService gongfuTicketService;
public TicketDTO reopen(Long id) {
if (id < Integer.MAX_VALUE) {
Ticket ticket = ticketService.reopen(Math.toIntExact(id));
TicketDTO dto = Convert.convert(TicketDTO.class, ticket);
dto.setType(0);
return dto;
} else {
GongfuTicket ticket = gongfuTicketService.reopen(id);
TicketDTO dto = Convert.convert(TicketDTO.class, ticket);
dto.setType(1);
return dto;
}
}
public TicketDTO revoked(Long id) {
if (id < Integer.MAX_VALUE) {
Ticket ticket = ticketService.revoked(Math.toIntExact(id));
TicketDTO dto = Convert.convert(TicketDTO.class, ticket);
dto.setType(0);
return dto;
} else {
GongfuTicket ticket = gongfuTicketService.revoked(id);
TicketDTO dto = Convert.convert(TicketDTO.class, ticket);
dto.setType(1);
return dto;
}
}
public boolean close(TicketDTO ticket) {
if (ticket.getType() == 0) {
return ticketService.close(Convert.convert(Ticket.class, ticket));
} else {
return gongfuTicketService.close(Convert.convert(GongfuTicket.class, ticket));
}
}
}

View File

@ -110,6 +110,8 @@ public class Constant {
public static final String DICTIONARY_ITEM_ACCOUNT_HAS_EXPIRED="AccountHasExpired";
public static final String DICTIONARY_ITEM_ACCOUNT_HAS_EXPIRED_ENDUSER = "EndUserAccountHasExpired";
public static final String DICTIONARY_SOLUTION_MEASURES = "SolutionMeasures";
public static final String DICTIONARY_SOLUTION_REVIEW_DEPARTMENT = "SolutionReviewDepartment";

View File

@ -143,4 +143,9 @@ public class TicketDTO {
* 类型0移动破1工服
*/
private Integer type;
/**
* 区域id仅工服工单
*/
private Long areaId;
}

View File

@ -1,10 +1,12 @@
package com.nflg.mobilebroken.common.pojo.request;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotBlank;
@Data
@Accessors(chain = true)
public class LanguageDataRequest {
/**

View File

@ -54,7 +54,7 @@ public class TicketAddRequest {
/**
* 紧急程度0非紧急1普通2紧急
*/
private Integer urgency;
private Byte urgency;
/**
* 处理人id

View File

@ -142,4 +142,14 @@ public class TicketInfoVO {
* 区域
*/
private String area;
/**
* 客户名称
*/
private String customerName;
/**
* 类型0移动破1工服
*/
private Integer type;
}

View File

@ -176,6 +176,7 @@ public class DispatchController extends ControllerBase {
@GetMapping("/getInfo")
public ApiResult<DispatchVO> getInfo(@RequestParam Long id) {
DispatchVO vo = dispatchService.getInfo(id);
VUtils.trueThrowBusinessError(Objects.isNull(vo)).throwMessage("派工单不存在");
vo.setFiles(Convert.toList(GongfuFileVO.class, fileService.lambdaQuery()
.eq(GongfuFile::getNo, vo.getNo())
.eq(GongfuFile::getType, 0)

View File

@ -131,9 +131,6 @@ public class TicketController extends ControllerBase {
@Resource
private IGongfuTicketAreaService ticketAreaService;
@Resource
private ITBaseAreaService baseAreaService;
/**
* 获取问题类型
* @return 问题类型列表
@ -557,12 +554,7 @@ public class TicketController extends ControllerBase {
areaName = appAreaService.getById(user.getAreaId()).getName();
}
} else if (user.getType() == 1) {
if (Objects.nonNull(user.getAreaId())) {
TBaseArea area = baseAreaService.getById(user.getAreaId());
if (Objects.nonNull(area)) {
areaName = area.getAreaName();
}
}
areaName = ticketAreaService.getAreaName(ticket.getAreaId(), MultilingualUtil.getLanguage());
}
}
// TBaseCustomer company = customerService.getById(Integer.valueOf(user.getCompanyId()));
@ -639,7 +631,9 @@ public class TicketController extends ControllerBase {
.setUserPlatform(ticket.getUserPlatform())
.setCanSendMessage(adminUsers.contains(AdminUserUtil.getUserId()))
.setEvaluate(getTicketEvaluate(ticket.getId()))
.setArea(area);
.setArea(area)
.setType(1)
.setCustomerName(ticket.getCustomerName());
return ApiResult.success(vo);
}

View File

@ -40,7 +40,7 @@ public class AdminMessage implements Serializable {
private String title;
/**
* 来源0工单1代理商账户
* 来源0工单1代理商账户审核表2派工单3工服工单
*/
private Integer source;

View File

@ -44,6 +44,4 @@ public interface TicketMapper extends BaseMapper<Ticket> {
IPage<AdminTicketVO> searchByFavouritesId(Integer userId, Integer favouritesId, Page<?> page);
TicketDTO getDto(Long id);
TicketVO getById(Long id);
}

View File

@ -1,7 +1,7 @@
package com.nflg.mobilebroken.repository.service;
import com.nflg.mobilebroken.repository.entity.GongfuTicketArea;
import com.baomidou.mybatisplus.extension.service.IService;
import com.nflg.mobilebroken.repository.entity.GongfuTicketArea;
/**
* <p>
@ -12,4 +12,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/
public interface IGongfuTicketAreaService extends IService<GongfuTicketArea> {
String getAreaName(Long areaId, String language);
}

View File

@ -1,8 +1,8 @@
package com.nflg.mobilebroken.repository.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.nflg.mobilebroken.common.pojo.dto.TicketDTO;
import com.nflg.mobilebroken.common.pojo.request.TicketEvaluateAddRequest;
import com.nflg.mobilebroken.repository.entity.Ticket;
import com.nflg.mobilebroken.repository.entity.TicketEvaluate;
/**
@ -15,5 +15,5 @@ import com.nflg.mobilebroken.repository.entity.TicketEvaluate;
*/
public interface ITicketEvaluateService extends IService<TicketEvaluate> {
Ticket add(TicketEvaluateAddRequest request);
TicketDTO add(TicketEvaluateAddRequest request);
}

View File

@ -59,6 +59,4 @@ public interface ITicketService extends IService<Ticket> {
boolean close(Ticket ticket);
TicketDTO getDto(Long id);
TicketVO getFromView(Long ticketId);
}

View File

@ -1,11 +1,15 @@
package com.nflg.mobilebroken.repository.service.impl;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.nflg.mobilebroken.common.pojo.request.LanguageDataRequest;
import com.nflg.mobilebroken.repository.entity.GongfuTicketArea;
import com.nflg.mobilebroken.repository.mapper.GongfuTicketAreaMapper;
import com.nflg.mobilebroken.repository.service.IGongfuTicketAreaService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import java.util.Objects;
/**
* <p>
* 服务实现类
@ -16,4 +20,17 @@ import org.springframework.stereotype.Service;
@Service
public class GongfuTicketAreaServiceImpl extends ServiceImpl<GongfuTicketAreaMapper, GongfuTicketArea> implements IGongfuTicketAreaService {
@Override
public String getAreaName(Long areaId, String language) {
GongfuTicketArea area = getById(areaId);
if (Objects.isNull(area)) {
return null;
}
return JSONUtil.toList(area.getLanguageData(), LanguageDataRequest.class)
.stream()
.filter(item -> item.getCode().equals(language))
.findFirst()
.orElse(new LanguageDataRequest().setLanguageValue(area.getName()))
.getLanguageValue();
}
}

View File

@ -92,6 +92,7 @@ public class GongfuTicketServiceImpl extends ServiceImpl<GongfuTicketMapper, Gon
ticket.setCurrentHandle(request.getHandlerUserId());
ticket.setHandle(String.valueOf(request.getHandlerUserId()));
ticket.setHandleName(request.getHandlerUserName());
ticket.setUrgency(request.getUrgency());
ticket.setState(TicketState.Processing.getState());
}
ticket.setCustomerName(AppUserUtil.getCustomerName());
@ -207,44 +208,12 @@ public class GongfuTicketServiceImpl extends ServiceImpl<GongfuTicketMapper, Gon
return ticket;
}
// @Override
// public void completeTicket(List<Integer> ids) {
/// / baseMapper.completeTicket(ids, AdminUserUtil.getUserId());
// List<Ticket> tickets=listByIds(ids);
// List<String> stateErrors=new ArrayList<>();
// List<String> handleErrors=new ArrayList<>();
// for (Ticket ticket : tickets) {
// if (!Objects.equals(ticket.getState(), TicketState.Processing.getState())){
// stateErrors.add(ticket.getTitle());
// }else if(Arrays.stream(ticket.getHandle().split(","))
// .noneMatch(uid->StrUtil.equals(uid, AdminUserUtil.getUserId().toString()))
// ){
// handleErrors.add(ticket.getTitle());
// }
// }
// StringBuilder sb=new StringBuilder();
// if (!stateErrors.isEmpty()){
// sb.append("以下工单状态不允许完成:").append(StrUtil.join(",", stateErrors));
// }
// if (!handleErrors.isEmpty()){
// sb.append("以下工单你无权操作:").append(StrUtil.join(",", handleErrors));
// }
// String msg=sb.toString();
// VUtils.trueThrowBusinessError(StrUtil.isNotBlank(msg))
// .throwMessage(msg);
// lambdaUpdate()
// .in(Ticket::getId, ids)
// .set(Ticket::getState, TicketState.ProcessingCompleted.getState())
// .set(Ticket::getUpdateTime, LocalDateTime.now())
// .update();
// }
@Override
public GongfuTicket completeTicket(Long id) {
GongfuTicket ticket = getById(id);
VUtils.trueThrowBusinessError(!Objects.equals(ticket.getState(), TicketState.Processing.getState()))
.throwMessage("非处理中状态不允许完成");
List<Integer> tickerMangagers = adminUserService.getTickerMangagers();
List<Integer> tickerMangagers = adminUserService.getGongfuTickerMangagers();
tickerMangagers.addAll(StrUtil.split(ticket.getHandle(), ",").stream().map(Integer::parseInt).collect(Collectors.toList()));
VUtils.trueThrowBusinessError(tickerMangagers.stream().noneMatch(uid -> Objects.equals(uid, AdminUserUtil.getUserId())))
.throwMessage("你无权完成工单");
@ -252,40 +221,19 @@ public class GongfuTicketServiceImpl extends ServiceImpl<GongfuTicketMapper, Gon
.throwMessage("工单“" + ticket.getTitle() + "”还未填写解决方案");
ticket.setState(TicketState.ProcessingCompleted.getState());
ticket.setCurrentHandle(AdminUserUtil.getUserId());
ticket.setSolveTime(LocalDateTime.now());
ticket.setUpdateTime(LocalDateTime.now());
updateById(ticket);
return ticket;
}
// @Override
// public Ticket closeTicket(TicketCloseRequest request) {
// Ticket ticket = getById(request.getTicketId());
// VUtils.trueThrowBusinessError(Objects.isNull(ticket)).throwMessage("未找到工单");
// VUtils.trueThrowBusinessError(!Objects.equals(ticket.getState(), TicketState.ProcessingCompleted.getState()))
// .throwMessage("非处理完成状态不允许关闭");
// VUtils.trueThrowBusinessError(!ticketEvaluateService.lambdaQuery()
// .eq(TicketEvaluate::getTicketId, request.getTicketId())
// .exists())
// .throwMessage("工单尚未评价,不能关闭");
// List<Integer> tickerMangagers = adminUserService.getTickerMangagers();
// tickerMangagers.addAll(Arrays.stream(ticket.getHandle().split(",")).map(Integer::parseInt).collect(Collectors.toList()));
// VUtils.trueThrowBusinessError(tickerMangagers.stream().noneMatch(uid -> Objects.equals(uid, AdminUserUtil.getUserId())))
// .throwMessage("你无权关闭工单");
// ticket.setState(TicketState.Closed.getState());
// ticket.setReason(request.getSolution());
// ticket.setSolveTime(LocalDateTime.now());
// ticket.setCurrentHandle(AdminUserUtil.getUserId());
// updateById(ticket);
// return ticket;
// }
@Override
public List<AdminTicketVO> exportSearch(AdminTicketSearchRequest request) {
if (request.getType() == 2) {
return baseMapper.searchAllFromAdminAndFollow(request, AdminUserUtil.getUserId());
} else if (request.getType() == 4) {
Integer userId = AdminUserUtil.getUserId();
List<Integer> tickerMangagers = adminUserService.getTickerMangagers();
List<Integer> tickerMangagers = adminUserService.getGongfuTickerMangagers();
request.setTicketManager(tickerMangagers.stream().anyMatch(uid -> Objects.equals(uid, userId)));
return baseMapper.searchAllFromAdmin(request, userId);
}
@ -353,7 +301,7 @@ public class GongfuTicketServiceImpl extends ServiceImpl<GongfuTicketMapper, Gon
GongfuTicket ticket = getById(request.getTicketId());
VUtils.trueThrowBusinessError(Objects.isNull(ticket)).throwMessage("未找到工单");
VUtils.trueThrowBusinessError(!Objects.equals(ticket.getState(), TicketState.Processing.getState())).throwMessage("工单状态异常");
List<Integer> tickerMangagers = adminUserService.getTickerMangagers();
List<Integer> tickerMangagers = adminUserService.getGongfuTickerMangagers();
tickerMangagers.addAll(StrUtil.split(ticket.getHandle(), ",").stream().map(Integer::parseInt).collect(Collectors.toList()));
VUtils.trueThrowBusinessError(tickerMangagers.stream().noneMatch(uid -> Objects.equals(uid, AdminUserUtil.getUserId())))
.throwMessage("你无权添加处理人");
@ -394,7 +342,7 @@ public class GongfuTicketServiceImpl extends ServiceImpl<GongfuTicketMapper, Gon
VUtils.trueThrowBusinessError(Objects.isNull(ticket)).throwMessage("未找到工单");
VUtils.trueThrowBusinessError(!Objects.equals(ticket.getState(), TicketState.ProcessingCompleted.getState()))
.throwMessage("工单状态不允许驳回");
List<Integer> tickerMangagers = adminUserService.getTickerMangagers();
List<Integer> tickerMangagers = adminUserService.getGongfuTickerMangagers();
VUtils.trueThrowBusinessError(tickerMangagers.stream().noneMatch(uid -> Objects.equals(uid, AdminUserUtil.getUserId())))
.throwMessage("你无权驳回工单");
ticket.setState(TicketState.Processing.getState());
@ -426,7 +374,7 @@ public class GongfuTicketServiceImpl extends ServiceImpl<GongfuTicketMapper, Gon
}
return lambdaUpdate()
.set(GongfuTicket::getState, TicketState.Closed.getState())
.set(GongfuTicket::getSolveTime, LocalDateTime.now())
// .set(GongfuTicket::getSolveTime, LocalDateTime.now())
.set(GongfuTicket::getUpdateTime, LocalDateTime.now())
.eq(GongfuTicket::getId, ticket.getId())
.eq(GongfuTicket::getState, TicketState.ProcessingCompleted.getState())

View File

@ -3,9 +3,9 @@ package com.nflg.mobilebroken.repository.service.impl;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.nflg.mobilebroken.common.constant.TicketState;
import com.nflg.mobilebroken.common.pojo.dto.TicketDTO;
import com.nflg.mobilebroken.common.pojo.request.TicketEvaluateAddRequest;
import com.nflg.mobilebroken.common.util.VUtils;
import com.nflg.mobilebroken.repository.entity.Ticket;
import com.nflg.mobilebroken.repository.entity.TicketEvaluate;
import com.nflg.mobilebroken.repository.mapper.TicketEvaluateMapper;
import com.nflg.mobilebroken.repository.service.ITicketEvaluateService;
@ -31,8 +31,8 @@ public class TicketEvaluateServiceImpl extends ServiceImpl<TicketEvaluateMapper,
private ITicketService ticketService;
@Override
public Ticket add(TicketEvaluateAddRequest request) {
Ticket ticket = ticketService.getById(request.getTicketId());
public TicketDTO add(TicketEvaluateAddRequest request) {
TicketDTO ticket = ticketService.getDto(request.getTicketId());
VUtils.trueThrowBusinessError(Objects.isNull(ticket)).throwMessage("工单不存在");
VUtils.trueThrowBusinessError(!Objects.equals(ticket.getState(), TicketState.ProcessingCompleted.getState())
&& !Objects.equals(ticket.getState(), TicketState.Closed.getState())).throwMessage("工单状态异常");

View File

@ -242,6 +242,7 @@ public class TicketServiceImpl extends ServiceImpl<TicketMapper, Ticket> impleme
.throwMessage("工单“" + ticket.getTitle() + "”还未填写解决方案");
ticket.setState(TicketState.ProcessingCompleted.getState());
ticket.setCurrentHandle(AdminUserUtil.getUserId());
ticket.setSolveTime(LocalDateTime.now());
ticket.setUpdateTime(LocalDateTime.now());
updateById(ticket);
return ticket;
@ -365,7 +366,7 @@ public class TicketServiceImpl extends ServiceImpl<TicketMapper, Ticket> impleme
@Override
public List<AdminUserSimpleVO> getTicketHandle(Long id) {
TicketVO ticket = baseMapper.getById(id);
TicketDTO ticket = baseMapper.getDto(id);
VUtils.trueThrowBusinessError(Objects.isNull(ticket)).throwMessage("未找到工单");
List<Integer> handles = StrUtil.split(ticket.getHandle(), ",")
.stream()
@ -432,9 +433,4 @@ public class TicketServiceImpl extends ServiceImpl<TicketMapper, Ticket> impleme
public TicketDTO getDto(Long id) {
return baseMapper.getDto(id);
}
@Override
public TicketVO getFromView(Long ticketId) {
return baseMapper.getById(ticketId);
}
}

View File

@ -240,12 +240,11 @@ public class TicketSolutionServiceImpl extends ServiceImpl<TicketSolutionMapper,
List<TicketSolution> ts = forUpdate.stream().filter(s -> !Objects.equals(s.getCreateUserId(), userId)).sorted(Comparator.comparing(TicketSolution::getId)).collect(Collectors.toList());
VUtils.trueThrowBusinessError(!ts.equals(solutions1)).throwMessage("不能修改他人创建的措施");
}
ticketService.lambdaUpdate()
.set(Ticket::getReason, request.getReason())
.set(Ticket::getAccidentLevel, request.getAccidentLevel())
.set(Ticket::getState, 2)
.set(Ticket::getSolveTime, LocalDateTime.now())
.eq(Ticket::getId, request.getTicketId())
ticket1Service.lambdaUpdate()
.set(GongfuTicket::getReason, request.getReason())
.set(GongfuTicket::getQuestion, request.getQuestion())
.set(GongfuTicket::getAccidentLevel, request.getAccidentLevel())
.eq(GongfuTicket::getId, request.getTicketId())
.update();
if (CollectionUtil.isNotEmpty(idForReserve)) {
baseMapper.delete(new LambdaQueryWrapper<TicketSolution>()

View File

@ -155,9 +155,9 @@
SELECT t.id,t.`no`,t.title,t.state,t.urgency,p.part_name AS 'component',t.question,t.reason
,a1.area_name AS 'areaName','' AS 'agentAreaName',d.customer_name AS 'customerName',d.agent_name AS 'agentName'
,IF(t.user_platform='admin',au.user_name,u.`name`) AS 'createBy',t.device_no AS 'deviceNo',t.use_time AS 'useTime'
,t.create_time AS 'createTime',t.update_time AS 'completeTime',di.name AS 'warrantyStatusDesc',d.device_type AS 'deviceType'
,t.create_time AS 'createTime',t.solve_time AS 'completeTime',di.name AS 'warrantyStatusDesc',d.device_type AS 'deviceType'
,d.model_no AS 'equipmentModel',d.shipment_date AS 'shipmentDate',IF(tf.id IS NULL, false, true) AS 'followed'
,auc.user_name AS 'cqm',t.solve_time AS 'closeTime',auh.user_name AS 'currentHandle',dt.cqm_person_name AS 'cqms'
,auc.user_name AS 'cqm',t.update_time AS 'closeTime',auh.user_name AS 'currentHandle',dt.cqm_person_name AS 'cqms'
,t.handle_name AS 'handle',t.description
FROM gongfu_ticket t
LEFT JOIN app_user u ON t.user_id=u.id
@ -178,9 +178,9 @@
SELECT t.id,t.`no`,t.title,t.state,t.urgency,p.part_name AS 'component',t.question,t.reason
,a1.area_name AS 'areaName','' AS 'agentAreaName',d.customer_name AS 'customerName',d.agent_name AS 'agentName'
,IF(t.user_platform='admin',au.user_name,u.`name`) AS 'createBy',t.device_no AS 'deviceNo',t.use_time AS 'useTime'
,t.create_time AS 'createTime',t.update_time AS 'completeTime',di.name AS 'warrantyStatusDesc',d.device_type AS 'deviceType'
,t.create_time AS 'createTime',t.solve_time AS 'completeTime',di.name AS 'warrantyStatusDesc',d.device_type AS 'deviceType'
,d.model_no AS 'equipmentModel',d.shipment_date AS 'shipmentDate',IF(tf.id IS NULL, false, true) AS 'followed'
,auc.user_name AS 'cqm',t.solve_time AS 'closeTime',auh.user_name AS 'currentHandle',dt.cqm_person_name AS 'cqms'
,auc.user_name AS 'cqm',t.update_time AS 'closeTime',auh.user_name AS 'currentHandle',dt.cqm_person_name AS 'cqms'
,t.handle_name AS 'handle',t.description
FROM gongfu_ticket t
LEFT JOIN app_user u ON t.user_id=u.id
@ -201,9 +201,9 @@
SELECT t.id,t.`no`,t.title,t.state,t.urgency,p.part_name AS 'component',t.question,t.reason
,a1.area_name AS 'areaName','' AS 'agentAreaName',d.customer_name AS 'customerName',d.agent_name AS 'agentName'
,IF(t.user_platform='admin',au.user_name,u.`name`) AS 'createBy',t.device_no AS 'deviceNo',t.use_time AS 'useTime'
,t.create_time AS 'createTime',t.update_time AS 'completeTime',di.name AS 'warrantyStatusDesc',d.device_type AS 'deviceType'
,t.create_time AS 'createTime',t.solve_time AS 'completeTime',di.name AS 'warrantyStatusDesc',d.device_type AS 'deviceType'
,d.model_no AS 'equipmentModel',d.shipment_date AS 'shipmentDate',true AS 'followed',auc.user_name AS 'cqm'
,t.solve_time AS 'closeTime',auh.user_name AS 'currentHandle',dt.cqm_person_name AS 'cqms'
,t.update_time AS 'closeTime',auh.user_name AS 'currentHandle',dt.cqm_person_name AS 'cqms'
,t.handle_name AS 'handle',t.description
FROM gongfu_ticket t
LEFT JOIN app_user u ON t.user_id=u.id
@ -224,8 +224,8 @@
SELECT t.id,t.`no`,t.title,t.state,t.urgency,p.part_name AS 'component',t.question,t.reason
,a1.area_name AS 'areaName','' AS 'agentAreaName',d.customer_name AS 'customerName',d.agent_name AS 'agentName'
,IF(t.user_platform='admin',au.user_name,u.`name`) AS 'createBy',t.device_no AS 'deviceNo',t.use_time AS 'useTime'
,t.create_time AS 'createTime',t.update_time AS 'completeTime',di.name AS 'warrantyStatusDesc',true AS 'followed'
,auc.user_name AS 'cqm',t.solve_time AS 'closeTime',auh.user_name AS 'currentHandle'
,t.create_time AS 'createTime',t.solve_time AS 'completeTime',di.name AS 'warrantyStatusDesc',true AS 'followed'
,auc.user_name AS 'cqm',t.update_time AS 'closeTime',auh.user_name AS 'currentHandle'
,dt.cqm_person_name AS 'cqms',t.handle_name AS 'handle',t.description
FROM gongfu_ticket t
LEFT JOIN app_user u ON t.user_id=u.id
@ -256,9 +256,9 @@
SELECT t.id,t.`no`,t.title,t.state,t.urgency,p.part_name AS 'component',t.question,t.reason
,a1.area_name AS 'areaName','' AS 'agentAreaName',d.customer_name AS 'customerName',d.agent_name AS 'agentName'
,IF(t.user_platform='admin',au.user_name,u.`name`) AS 'createBy',t.device_no AS 'deviceNo',t.use_time AS 'useTime'
,t.create_time AS 'createTime',t.update_time AS 'completeTime',di.name AS 'warrantyStatusDesc',d.device_type AS 'deviceType'
,t.create_time AS 'createTime',t.solve_time AS 'completeTime',di.name AS 'warrantyStatusDesc',d.device_type AS 'deviceType'
,d.model_no AS 'equipmentModel',d.shipment_date AS 'shipmentDate',true AS 'followed',auc.user_name AS 'cqm'
,t.solve_time AS 'closeTime',auh.user_name AS 'currentHandle',dt.cqm_person_name AS 'cqms'
,t.update_time AS 'closeTime',auh.user_name AS 'currentHandle',dt.cqm_person_name AS 'cqms'
,t.handle_name AS 'handle',t.description
FROM gongfu_ticket t
LEFT JOIN app_user u ON t.user_id=u.id

View File

@ -281,12 +281,6 @@
</select>
<select id="getDto" resultType="com.nflg.mobilebroken.common.pojo.dto.TicketDTO">
select *
from v_all_ticket
where id = #{id}
</select>
<select id="getById" resultType="com.nflg.mobilebroken.common.pojo.vo.TicketVO">
select * from v_all_ticket where id = #{id}
</select>
</mapper>