Merge branch 'feature/202504' into feature/202504-1

This commit is contained in:
曹鹏飞 2025-04-30 14:52:32 +08:00
commit c381492d9f
13 changed files with 151 additions and 72 deletions

View File

@ -18,6 +18,7 @@ import com.nflg.mobilebroken.common.pojo.dto.DevComponentExcel;
import com.nflg.mobilebroken.common.pojo.dto.DevComponentImportExcel; import com.nflg.mobilebroken.common.pojo.dto.DevComponentImportExcel;
import com.nflg.mobilebroken.common.pojo.query.DeviceComponentQuery; import com.nflg.mobilebroken.common.pojo.query.DeviceComponentQuery;
import com.nflg.mobilebroken.common.pojo.vo.DeviceComponentDetailVO; import com.nflg.mobilebroken.common.pojo.vo.DeviceComponentDetailVO;
import com.nflg.mobilebroken.common.pojo.vo.DeviceComponentPartGroupVO;
import com.nflg.mobilebroken.common.pojo.vo.DeviceComponentVO; import com.nflg.mobilebroken.common.pojo.vo.DeviceComponentVO;
import com.nflg.mobilebroken.common.util.AdminUserUtil; import com.nflg.mobilebroken.common.util.AdminUserUtil;
import com.nflg.mobilebroken.common.util.EecExcelUtil; import com.nflg.mobilebroken.common.util.EecExcelUtil;
@ -70,7 +71,12 @@ public class DeviceComponentController extends ControllerBase {
Page<DeviceComponentVO> result = deviceComponentService.selectListByPage(query); Page<DeviceComponentVO> result = deviceComponentService.selectListByPage(query);
result.getRecords().forEach(u->{ result.getRecords().forEach(u->{
List<DeviceComponentDetailVO> detail = deviceComponentDetailService.getDevicePartDetail(u.getId()); List<DeviceComponentDetailVO> detail = deviceComponentDetailService.getDevicePartDetail(u.getId());
u.setPartList(Convert.toList(DeviceComponentDetailVO.class,detail)); Map<String, List<DeviceComponentDetailVO>> collect=detail.stream().collect(Collectors.groupingBy(DeviceComponentDetailVO::getTypeAttr));
List<DeviceComponentPartGroupVO> vos=new ArrayList<>();
collect.forEach((k,v)->{
vos.add(new DeviceComponentPartGroupVO().setTypeAttr(k).setItems(v));
});
u.setPartList(vos);
}); });
return ApiResult.success(result.getRecords(),query,result.getTotal()); return ApiResult.success(result.getRecords(),query,result.getTotal());
} }

View File

@ -64,18 +64,26 @@ public class TicketCompleteEvent extends ApplicationEvent implements Application
.setCreateTime(LocalDateTime.now())); .setCreateTime(LocalDateTime.now()));
//我的待办 //我的待办
//CQM //CQM
AdminUser cqmUser = adminUserService.getById(ticket.getCqm()); List<Integer> cqms=deviceTypeService.getCqmsByDeviceType(ticket.getDeviceNo());
adminMessageService.add( if (CollectionUtil.isEmpty(cqms)){
new AdminMessage() log.warn("该设备尚未设置CQM负责人:{}", ticket.getDeviceNo());
.setNo(ticket.getNo()) }else {
.setTitle(ticket.getTitle()) List<AdminUser> cqmUsers = adminUserService.listByIds(cqms);
.setUserId(cqmUser.getId()) if (CollectionUtil.isNotEmpty(cqmUsers)) {
.setSourceId(ticket.getId()) cqmUsers.forEach(c -> adminMessageService.add(
.setSource(0) new AdminMessage()
.setType(MessageType.WorkOrderAssignment.getState()) .setNo(ticket.getNo())
.setSubType(MessageSubType.TicketCompletion.getState()) .setTitle(ticket.getTitle())
.setIsRead(false) .setUserId(c.getId())
.setCreateTime(LocalDateTime.now())); .setSourceId(ticket.getId())
.setSource(0)
.setType(MessageType.WorkOrderAssignment.getState())
.setSubType(MessageSubType.TicketCompletion.getState())
.setIsRead(false)
.setCreateTime(LocalDateTime.now()))
);
}
}
} }
private void sendEmail(){ private void sendEmail(){

View File

@ -90,6 +90,9 @@ public class TicketScheduledTasks {
@Resource @Resource
private SsePushService ssePushService; private SsePushService ssePushService;
@Resource
private ITBaseDeviceTypeService deviceTypeService;
/** /**
* 工单评论邀请邮件 * 工单评论邀请邮件
* 每天午夜12点执行一次 * 每天午夜12点执行一次
@ -252,7 +255,8 @@ public class TicketScheduledTasks {
//处理人 //处理人
Set<Integer> adminUserIds = StrUtil.split(ticket.getHandle(),",").stream().map(Integer::parseInt).collect(Collectors.toSet()); Set<Integer> adminUserIds = StrUtil.split(ticket.getHandle(),",").stream().map(Integer::parseInt).collect(Collectors.toSet());
//CQM //CQM
adminUserIds.add(ticket.getCqm()); List<Integer> cqms=deviceTypeService.getCqmsByDeviceType(ticket.getDeviceNo());
adminUserIds.addAll(cqms);
//管理端关注人 //管理端关注人
List<Integer> followUserIds=ticketFollowService.lambdaQuery() List<Integer> followUserIds=ticketFollowService.lambdaQuery()
.eq(TicketFollow::getTicketId, ticket.getId()) .eq(TicketFollow::getTicketId, ticket.getId())

View File

@ -188,11 +188,14 @@ public class TiketController extends ControllerBase {
Ticket ticket = ticketService.getById(id); Ticket ticket = ticketService.getById(id);
VUtils.trueThrowBusinessError(Objects.isNull(ticket)).throwMessage("未找到工单"); VUtils.trueThrowBusinessError(Objects.isNull(ticket)).throwMessage("未找到工单");
AppUser user = appUserService.getById(ticket.getUserId()); AppUser user = appUserService.getById(ticket.getUserId());
String areaName; String areaName = "";
if (user.getIsPrimary()){ if (user.getIsPrimary()){
areaName=StrUtil.join(",",customerService.getAreas(Arrays.stream(user.getCompanyId().split(",")).map(Integer::parseInt).collect(Collectors.toList()))); areaName=StrUtil.join(",",customerService.getAreas(Arrays.stream(user.getCompanyId().split(",")).map(Integer::parseInt).collect(Collectors.toList())));
}else { }else if (Objects.nonNull(user.getAreaId())){
areaName = appAreaService.getById(user.getAreaId()).getName(); AppArea area = appAreaService.getById(user.getAreaId());
if (Objects.nonNull(area)) {
areaName = area.getName();
}
} }
List<TBaseCustomer> companys = customerService.listByIds(Arrays.stream(user.getCompanyId().split(",")).map(Integer::parseInt).collect(Collectors.toList())); List<TBaseCustomer> companys = customerService.listByIds(Arrays.stream(user.getCompanyId().split(",")).map(Integer::parseInt).collect(Collectors.toList()));
DeviceInfoVO device = deviceService.getByDeviceNo(ticket.getDeviceNo()); DeviceInfoVO device = deviceService.getByDeviceNo(ticket.getDeviceNo());
@ -382,7 +385,7 @@ public class TiketController extends ControllerBase {
Ticket ticket=ticketService.reopen(id); Ticket ticket=ticketService.reopen(id);
ticketEventPublisher.publishTicketReopenEvent(ticket, MultilingualUtil.getLanguage(), MultilingualUtil.getZone()); ticketEventPublisher.publishTicketReopenEvent(ticket, MultilingualUtil.getLanguage(), MultilingualUtil.getZone());
ChatMessageDTO message = new ChatMessageDTO() ChatMessageDTO message = new ChatMessageDTO()
.setId(cn.hutool.core.util.IdUtil.getSnowflakeNextIdStr()) .setId(IdUtil.getSnowflakeNextIdStr())
.setFrom("system") .setFrom("system")
.setTicketState(ticket.getState()) .setTicketState(ticket.getState())
.setSenderId(0) .setSenderId(0)
@ -412,9 +415,9 @@ public class TiketController extends ControllerBase {
@PostMapping("addTicketEvaluate") @PostMapping("addTicketEvaluate")
public ApiResult<Void> addTicketEvaluate(@Valid @RequestBody TicketEvaluateAddRequest request) { public ApiResult<Void> addTicketEvaluate(@Valid @RequestBody TicketEvaluateAddRequest request) {
Ticket ticket=ticketEvaluateService.add(request); Ticket ticket=ticketEvaluateService.add(request);
ticketEventPublisher.publishTicketEvaluateEvent(ticket, MultilingualUtil.getLanguage(), MultilingualUtil.getZone()); // ticketEventPublisher.publishTicketEvaluateEvent(ticket, MultilingualUtil.getLanguage(), MultilingualUtil.getZone());
ChatMessageDTO message = new ChatMessageDTO() ChatMessageDTO message = new ChatMessageDTO()
.setId(cn.hutool.core.util.IdUtil.getSnowflakeNextIdStr()) .setId(IdUtil.getSnowflakeNextIdStr())
.setFrom("system") .setFrom("system")
.setTicketState(ticket.getState()) .setTicketState(ticket.getState())
.setSenderId(0) .setSenderId(0)
@ -428,7 +431,7 @@ public class TiketController extends ControllerBase {
if (ticketService.close(ticket)){ if (ticketService.close(ticket)){
ticketEventPublisher.publishTicketCloseEvent(ticket); ticketEventPublisher.publishTicketCloseEvent(ticket);
message = new ChatMessageDTO() message = new ChatMessageDTO()
.setId(cn.hutool.core.util.IdUtil.getSnowflakeNextIdStr()) .setId(IdUtil.getSnowflakeNextIdStr())
.setFrom("system") .setFrom("system")
.setTicketState(ticket.getState()) .setTicketState(ticket.getState())
.setSenderId(0) .setSenderId(0)

View File

@ -1,6 +1,8 @@
package com.nflg.mobilebroken.cfs.event; package com.nflg.mobilebroken.cfs.event;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DatePattern; 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.MessageSubType;
import com.nflg.mobilebroken.common.constant.MessageType; import com.nflg.mobilebroken.common.constant.MessageType;
import com.nflg.mobilebroken.repository.entity.AdminMessage; import com.nflg.mobilebroken.repository.entity.AdminMessage;
@ -18,6 +20,8 @@ import org.springframework.context.ApplicationEvent;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.stream.Collectors;
@Slf4j @Slf4j
public class TicketReopenEvent extends ApplicationEvent implements ApplicationContextAware { public class TicketReopenEvent extends ApplicationEvent implements ApplicationContextAware {
@ -54,18 +58,35 @@ public class TicketReopenEvent extends ApplicationEvent implements ApplicationCo
private void sendUserMessage(){ private void sendUserMessage(){
//我的待办 //我的待办
//CQM // CQM
AdminUser cqmUser = adminUserService.getById(ticket.getCqm()); // AdminUser cqmUser = adminUserService.getById(ticket.getCqm());
adminMessageService.add( // adminMessageService.add(
new AdminMessage() // new AdminMessage()
.setNo(ticket.getNo()) // .setNo(ticket.getNo())
.setTitle(ticket.getTitle()) // .setTitle(ticket.getTitle())
.setUserId(cqmUser.getId()) // .setUserId(cqmUser.getId())
.setSourceId(ticket.getId()) // .setSourceId(ticket.getId())
.setSource(0) // .setSource(0)
.setType(MessageType.WorkOrderAssignment.getState()) // .setType(MessageType.WorkOrderAssignment.getState())
.setSubType(MessageSubType.TicketReopen.getState()) // .setSubType(MessageSubType.TicketReopen.getState())
.setIsRead(false) // .setIsRead(false)
.setCreateTime(LocalDateTime.now())); // .setCreateTime(LocalDateTime.now()));
//处理人
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(ticket.getId())
.setSource(0)
.setType(MessageType.WorkOrderAssignment.getState())
.setSubType(MessageSubType.TicketReopen.getState())
.setIsRead(false)
.setCreateTime(LocalDateTime.now())
));
}
} }
} }

View File

@ -8,10 +8,7 @@ import com.nflg.mobilebroken.common.constant.MessageType;
import com.nflg.mobilebroken.repository.entity.AdminMessage; import com.nflg.mobilebroken.repository.entity.AdminMessage;
import com.nflg.mobilebroken.repository.entity.AdminUser; import com.nflg.mobilebroken.repository.entity.AdminUser;
import com.nflg.mobilebroken.repository.entity.Ticket; import com.nflg.mobilebroken.repository.entity.Ticket;
import com.nflg.mobilebroken.repository.service.IAdminMessageService; import com.nflg.mobilebroken.repository.service.*;
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 com.nflg.mobilebroken.starter.service.EmailService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
@ -33,6 +30,7 @@ public class TicketRevokeEvent extends ApplicationEvent implements ApplicationCo
private IDictionaryItemTranslateService dictionaryItemTranslateService; private IDictionaryItemTranslateService dictionaryItemTranslateService;
private IAppUserService appUserService; private IAppUserService appUserService;
private EmailService emailService; private EmailService emailService;
private ITBaseDeviceTypeService deviceTypeService;
private IAdminUserService adminUserService; private IAdminUserService adminUserService;
private IAdminMessageService adminMessageService; private IAdminMessageService adminMessageService;
@ -49,6 +47,7 @@ public class TicketRevokeEvent extends ApplicationEvent implements ApplicationCo
this.emailService = applicationContext.getBean(EmailService.class); this.emailService = applicationContext.getBean(EmailService.class);
this.adminUserService = applicationContext.getBean(IAdminUserService.class); this.adminUserService = applicationContext.getBean(IAdminUserService.class);
this.adminMessageService = applicationContext.getBean(IAdminMessageService.class); this.adminMessageService = applicationContext.getBean(IAdminMessageService.class);
this.deviceTypeService = applicationContext.getBean(ITBaseDeviceTypeService.class);
} }
@ -59,34 +58,44 @@ public class TicketRevokeEvent extends ApplicationEvent implements ApplicationCo
private void sendUserMessage(){ private void sendUserMessage(){
//我的待办 //我的待办
//CQM //CQM
AdminUser cqmUser = adminUserService.getById(ticket.getCqm()); List<Integer> cqms=deviceTypeService.getCqmsByDeviceType(ticket.getDeviceNo());
adminMessageService.add( if (CollectionUtil.isEmpty(cqms)){
new AdminMessage() log.warn("该设备尚未设置CQM负责人:{}", ticket.getDeviceNo());
.setNo(ticket.getNo()) }else {
.setTitle(ticket.getTitle()) List<AdminUser> cqmUsers = adminUserService.listByIds(cqms);
.setUserId(cqmUser.getId()) if (CollectionUtil.isNotEmpty(cqmUsers)) {
.setSourceId(ticket.getId()) cqmUsers.forEach(c -> adminMessageService.add(
.setSource(0) new AdminMessage()
.setType(MessageType.WorkOrderAssignment.getState()) .setNo(ticket.getNo())
.setSubType(MessageSubType.TicketRevoke.getState()) .setTitle(ticket.getTitle())
.setIsRead(false) .setUserId(c.getId())
.setCreateTime(LocalDateTime.now())); .setSourceId(ticket.getId())
.setSource(0)
.setType(MessageType.WorkOrderAssignment.getState())
.setSubType(MessageSubType.TicketRevoke.getState())
.setIsRead(false)
.setCreateTime(LocalDateTime.now()))
);
}
}
//处理人 //处理人
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(userIds)) {
if (CollectionUtil.isNotEmpty(adminUsers)){ List<AdminUser> adminUsers = adminUserService.listByIds(userIds);
adminUsers.forEach(c -> adminMessageService.add( if (CollectionUtil.isNotEmpty(adminUsers)) {
new AdminMessage() adminUsers.forEach(c -> adminMessageService.add(
.setNo(ticket.getNo()) new AdminMessage()
.setTitle(ticket.getTitle()) .setNo(ticket.getNo())
.setUserId(c.getId()) .setTitle(ticket.getTitle())
.setSourceId(ticket.getId()) .setUserId(c.getId())
.setSource(0) .setSourceId(ticket.getId())
.setType(MessageType.WorkOrderAssignment.getState()) .setSource(0)
.setSubType(MessageSubType.TicketRevoke.getState()) .setType(MessageType.WorkOrderAssignment.getState())
.setIsRead(false) .setSubType(MessageSubType.TicketRevoke.getState())
.setCreateTime(LocalDateTime.now())) .setIsRead(false)
); .setCreateTime(LocalDateTime.now()))
);
}
} }
} }
} }

View File

@ -61,4 +61,9 @@ public class DeviceComponentDetailVO implements Serializable {
* 部件编码 * 部件编码
*/ */
private String partNo; private String partNo;
/**
* 类别属性
*/
private String typeAttr;
} }

View File

@ -0,0 +1,21 @@
package com.nflg.mobilebroken.common.pojo.vo;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.List;
@Data
@Accessors(chain = true)
public class DeviceComponentPartGroupVO {
/**
* 类别属性
*/
private String typeAttr;
/**
* 部件列表
*/
private List<DeviceComponentDetailVO> items;
}

View File

@ -48,5 +48,6 @@ public class DeviceComponentVO {
* 最后更新时间 * 最后更新时间
*/ */
private LocalDateTime updateTime; private LocalDateTime updateTime;
List<DeviceComponentDetailVO> partList;
private List<DeviceComponentPartGroupVO> partList;
} }

View File

@ -1,6 +1,7 @@
package com.nflg.mobilebroken.common.pojo.vo; package com.nflg.mobilebroken.common.pojo.vo;
import com.nflg.mobilebroken.common.constant.TicketState; import com.nflg.mobilebroken.common.constant.TicketState;
import com.nflg.mobilebroken.common.constant.TicketUrgency;
import lombok.Data; import lombok.Data;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
@ -65,7 +66,7 @@ public class TicketPdfVO {
if (Objects.isNull(urgency)) { if (Objects.isNull(urgency)) {
return ""; return "";
} else { } else {
return TicketState.findByValue(urgency).getDescription(); return TicketUrgency.findByValue(urgency).getDescription();
} }
} }

View File

@ -87,10 +87,10 @@ public class Ticket implements Serializable {
*/ */
private LocalDateTime createTime; private LocalDateTime createTime;
/** // /**
* 所属CQM // * 所属CQM
*/ // */
private Integer cqm; // private Integer cqm;
/** /**
* 紧急程度0非紧急1普通2紧急 * 紧急程度0非紧急1普通2紧急

View File

@ -172,7 +172,7 @@ public class TicketServiceImpl extends ServiceImpl<TicketMapper, Ticket> impleme
ticket.setRemark(request.getRemark()); ticket.setRemark(request.getRemark());
ticket.setHandle(StrUtil.join(",", request.getUserIds())); ticket.setHandle(StrUtil.join(",", request.getUserIds()));
ticket.setHandleName(StrUtil.join(",", adminUserService.listByIds(request.getUserIds()).stream().map(AdminUser::getUserName).collect(Collectors.toList()))); ticket.setHandleName(StrUtil.join(",", adminUserService.listByIds(request.getUserIds()).stream().map(AdminUser::getUserName).collect(Collectors.toList())));
ticket.setCqm(AdminUserUtil.getUserId()); // ticket.setCqm(AdminUserUtil.getUserId());
ticket.setCurrentHandle(AdminUserUtil.getUserId()); ticket.setCurrentHandle(AdminUserUtil.getUserId());
ticket.setUpdateTime(LocalDateTime.now()); ticket.setUpdateTime(LocalDateTime.now());
updateById(ticket); updateById(ticket);

View File

@ -15,7 +15,7 @@
</delete> </delete>
<select id="getDevicePartDetail" resultType="com.nflg.mobilebroken.common.pojo.vo.DeviceComponentDetailVO"> <select id="getDevicePartDetail" resultType="com.nflg.mobilebroken.common.pojo.vo.DeviceComponentDetailVO">
select a.* ,b.part_no from device_component_detail a select a.* ,b.part_no,iFNULL(b.type_attr,'未设置') AS 'typeAttr' from device_component_detail a
join t_base_part b on a.model_part_id=b.id join t_base_part b on a.model_part_id=b.id
where a.device_component_id=#{deviceComponentId} where a.device_component_id=#{deviceComponentId}
</select> </select>