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.query.DeviceComponentQuery;
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.util.AdminUserUtil;
import com.nflg.mobilebroken.common.util.EecExcelUtil;
@ -70,7 +71,12 @@ public class DeviceComponentController extends ControllerBase {
Page<DeviceComponentVO> result = deviceComponentService.selectListByPage(query);
result.getRecords().forEach(u->{
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());
}

View File

@ -64,18 +64,26 @@ public class TicketCompleteEvent extends ApplicationEvent implements Application
.setCreateTime(LocalDateTime.now()));
//我的待办
//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.TicketCompletion.getState())
.setIsRead(false)
.setCreateTime(LocalDateTime.now()));
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.TicketCompletion.getState())
.setIsRead(false)
.setCreateTime(LocalDateTime.now()))
);
}
}
}
private void sendEmail(){

View File

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

View File

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

View File

@ -1,6 +1,8 @@
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.repository.entity.AdminMessage;
@ -18,6 +20,8 @@ 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 {
@ -54,18 +58,35 @@ public class TicketReopenEvent extends ApplicationEvent implements ApplicationCo
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()));
// 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()));
//处理人
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.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.repository.service.*;
import com.nflg.mobilebroken.starter.service.EmailService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationContext;
@ -33,6 +30,7 @@ public class TicketRevokeEvent extends ApplicationEvent implements ApplicationCo
private IDictionaryItemTranslateService dictionaryItemTranslateService;
private IAppUserService appUserService;
private EmailService emailService;
private ITBaseDeviceTypeService deviceTypeService;
private IAdminUserService adminUserService;
private IAdminMessageService adminMessageService;
@ -49,6 +47,7 @@ public class TicketRevokeEvent extends ApplicationEvent implements ApplicationCo
this.emailService = applicationContext.getBean(EmailService.class);
this.adminUserService = applicationContext.getBean(IAdminUserService.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(){
//我的待办
//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.TicketRevoke.getState())
.setIsRead(false)
.setCreateTime(LocalDateTime.now()));
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()))
);
}
}
//处理人
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.TicketRevoke.getState())
.setIsRead(false)
.setCreateTime(LocalDateTime.now()))
);
if (CollectionUtil.isNotEmpty(userIds)) {
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.TicketRevoke.getState())
.setIsRead(false)
.setCreateTime(LocalDateTime.now()))
);
}
}
}
}

View File

@ -61,4 +61,9 @@ public class DeviceComponentDetailVO implements Serializable {
* 部件编码
*/
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;
List<DeviceComponentDetailVO> partList;
private List<DeviceComponentPartGroupVO> partList;
}

View File

@ -1,6 +1,7 @@
package com.nflg.mobilebroken.common.pojo.vo;
import com.nflg.mobilebroken.common.constant.TicketState;
import com.nflg.mobilebroken.common.constant.TicketUrgency;
import lombok.Data;
import lombok.experimental.Accessors;
@ -65,7 +66,7 @@ public class TicketPdfVO {
if (Objects.isNull(urgency)) {
return "";
} 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;
/**
* 所属CQM
*/
private Integer cqm;
// /**
// * 所属CQM
// */
// private Integer cqm;
/**
* 紧急程度0非紧急1普通2紧急

View File

@ -172,7 +172,7 @@ public class TicketServiceImpl extends ServiceImpl<TicketMapper, Ticket> impleme
ticket.setRemark(request.getRemark());
ticket.setHandle(StrUtil.join(",", request.getUserIds()));
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.setUpdateTime(LocalDateTime.now());
updateById(ticket);

View File

@ -15,7 +15,7 @@
</delete>
<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
where a.device_component_id=#{deviceComponentId}
</select>