DeviceFaultInfoServiceImpl.java 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. package com.xy.service;
  2. import cn.hutool.core.collection.CollUtil;
  3. import cn.hutool.core.map.MapUtil;
  4. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  5. import com.baomidou.mybatisplus.core.metadata.IPage;
  6. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  7. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  8. import com.xy.collections.list.JArrayList;
  9. import com.xy.collections.map.JMap;
  10. import com.xy.consts.CommConsts;
  11. import com.xy.dto.DeviceFaultInfoDto;
  12. import com.xy.dto.DeviceFaultInfoFlowDto;
  13. import com.xy.dto.SysCodeConfigureDto;
  14. import com.xy.dto.be.MercDto;
  15. import com.xy.entity.DeviceFaultInfo;
  16. import com.xy.entity.DeviceFaultLog;
  17. import com.xy.entity.DeviceInfo;
  18. import com.xy.entity.SysCodeConfigureRedis;
  19. import com.xy.error.CommRuntimeException;
  20. import com.xy.mapper.DeviceDataMapper;
  21. import com.xy.mapper.DeviceFaultInfoMapper;
  22. import com.xy.service.be.MercService;
  23. import com.xy.utils.*;
  24. import io.swagger.annotations.Api;
  25. import io.swagger.annotations.ApiOperation;
  26. import lombok.RequiredArgsConstructor;
  27. import org.springframework.stereotype.Service;
  28. import org.springframework.transaction.annotation.Transactional;
  29. import org.springframework.validation.annotation.Validated;
  30. import org.springframework.web.bind.annotation.PostMapping;
  31. import org.springframework.web.bind.annotation.RequestBody;
  32. import java.time.LocalDateTime;
  33. import java.util.List;
  34. import java.util.Map;
  35. import java.util.stream.Collectors;
  36. import static com.xy.utils.Beans.copy;
  37. import static com.xy.utils.PlusBeans.toIPage;
  38. import static com.xy.utils.PlusBeans.toPageBean;
  39. /**
  40. * <p>
  41. * 设备故障信息 服务实现类
  42. * </p>
  43. *
  44. * @author 谭斌
  45. * @since 2024-01-08
  46. */
  47. @Service
  48. @RequiredArgsConstructor
  49. @Api(tags = "设备故障信息")
  50. public class DeviceFaultInfoServiceImpl extends ServiceImpl<DeviceFaultInfoMapper, DeviceFaultInfo> implements DeviceFaultInfoService {
  51. private final DeviceFaultLogServiceImpl deviceFaultLogService;
  52. private final MercService mercService;
  53. private final DeviceInfoServiceImpl deviceInfoService;
  54. private final DeviceFaultInfoFlowServiceImpl deviceFaultInfoFlowService;
  55. private final SysWorkUserService sysWorkUserService;
  56. private final DeviceDataMapper deviceDataMapper;
  57. private final SysCodeConfigureService sysCodeConfigureService;
  58. @PostMapping("countToDo")
  59. @ApiOperation("待处理设备故障统计")
  60. public R<Long> countToDo() {
  61. // 只统计严重 紧急
  62. long count = count(Wrappers.<DeviceFaultInfo>lambdaQuery().eq(DeviceFaultInfo::getState, 0).in(DeviceFaultInfo::getFaultLevel, CollUtil.newArrayList(3, 4)));
  63. return R.ok(count);
  64. }
  65. @PostMapping("countByDevice")
  66. @ApiOperation("按故障类型统计设备数")
  67. public R<List<DeviceFaultInfoDto.CountByDeviceVO>> countByDevice() {
  68. List<DeviceFaultInfoDto.CountByDeviceVO> list = countDeviceByType();
  69. return R.ok(list);
  70. }
  71. public List<DeviceFaultInfoDto.CountByDeviceVO> countDeviceByType() {
  72. List<DeviceFaultInfoDto.CountByDeviceVO> list = deviceDataMapper.deviceFaultInfoCount();
  73. if (CollUtil.isEmpty(list)) {
  74. return list;
  75. }
  76. list.forEach(d -> {
  77. SysCodeConfigureRedis s = SysCodeConfigureUtils.get(d.getEventCode());
  78. if (s != null) {
  79. d.setEventName(s.getTitle());
  80. }
  81. });
  82. return list;
  83. }
  84. @PostMapping("countByDeviceHomePage")
  85. @ApiOperation("按故障类型统计设备数-运营首页")
  86. public R<List<DeviceFaultInfoDto.CountByDeviceVO>> countByDeviceHomePage() {
  87. List<DeviceFaultInfoDto.CountByDeviceVO> list = countDeviceByType();
  88. if (CollUtil.isEmpty(list)) {
  89. return R.ok(list);
  90. }
  91. // 最多只取5个
  92. if (list.size() > 5) {
  93. list = CollUtil.sub(list, 0, 5);
  94. }
  95. return R.ok(list);
  96. }
  97. @PostMapping("obj")
  98. @ApiOperation("对象查询")
  99. public R<DeviceFaultInfoDto.Vo> obj(@RequestBody DeviceFaultInfoDto.Vo vo) {
  100. DeviceFaultInfoDto.SelectList selectList = copy(DeviceFaultInfoDto.SelectList.class, vo);
  101. List<DeviceFaultInfoDto.Vo> list = list(selectList).getData();
  102. if (Emptys.check(list)) {
  103. return R.ok(list.get(0));
  104. }
  105. return R.ok();
  106. }
  107. @PostMapping("list")
  108. @ApiOperation("集合查询")
  109. public R<List<DeviceFaultInfoDto.Vo>> list(@RequestBody DeviceFaultInfoDto.SelectList selectList) {
  110. LambdaQueryWrapper<DeviceFaultInfo> lambdaQueryWrapper = new MybatisPlusQuery().eqWrapper(selectList, DeviceFaultInfo.class).build();
  111. List<DeviceFaultInfo> list = list(lambdaQueryWrapper);
  112. return R.ok(copy(DeviceFaultInfoDto.Vo.class, list));
  113. }
  114. @PostMapping("page")
  115. @ApiOperation("分页查询")
  116. public R<PageBean<DeviceFaultInfoDto.Vo>> page(@RequestBody DeviceFaultInfoDto.Page page) {
  117. PageBean pageBean = page.getPage();
  118. LocalDateTime beginTime = page.getBeginCreateTime();
  119. LocalDateTime endTime = page.getEndCreateTime();
  120. LambdaQueryWrapper<DeviceFaultInfo> lambdaQueryWrapper = new MybatisPlusQuery()
  121. .eqWrapper(page, DeviceFaultInfo.class).build()
  122. .ge(beginTime != null, DeviceFaultInfo::getCreateTime, beginTime)
  123. .le(endTime != null, DeviceFaultInfo::getCreateTime, endTime);
  124. Long sysId = AuthorizeUtils.getSysId();
  125. List<String> roleCodes = AuthorizeUtils.getRoleCodes(sysId);
  126. // 售后角色只看转售后的,其他角色看所有
  127. if (roleCodes.contains(CommConsts.MERC_SH_ADMIN)) {
  128. lambdaQueryWrapper.eq(DeviceFaultInfo::getToAfterSale, true);
  129. }
  130. IPage<DeviceFaultInfo> iPage = page(toIPage(pageBean), lambdaQueryWrapper);
  131. PageBean<DeviceFaultInfoDto.Vo> data = toPageBean(DeviceFaultInfoDto.Vo.class, iPage);
  132. List<DeviceFaultInfoDto.Vo> records = data.getRecords();
  133. if (CollUtil.isNotEmpty(records)) {
  134. List<Long> mercIds = records.stream().map(DeviceFaultInfoDto.Vo::getMercId).distinct().collect(Collectors.toList());
  135. List<String> codes = records.stream().map(DeviceFaultInfoDto.Vo::getEventCode).distinct().collect(Collectors.toList());
  136. SysCodeConfigureDto.SelectList selectList = new SysCodeConfigureDto.SelectList();
  137. selectList.setCodes(codes);
  138. List<SysCodeConfigureDto.Vo> vos = R.feignCheckData(sysCodeConfigureService.list(selectList));
  139. Map<String, SysCodeConfigureDto.Vo> sysCodeMap = MapUtil.newHashMap();
  140. if (CollUtil.isNotEmpty(vos)) {
  141. sysCodeMap = vos.stream().collect(Collectors.toMap(SysCodeConfigureDto.Vo::getCode, i -> i));
  142. }
  143. List<MercDto.Vo> mercs = mercService.list(new MercDto.SelectList().setMercIds(mercIds)).getData();
  144. JMap<Long, MercDto.Vo> longVoJMap = new JArrayList<>(mercs).toMap(MercDto.Vo::getId).cover();
  145. for (DeviceFaultInfoDto.Vo r : records) {
  146. Long mercId = r.getMercId();
  147. if (longVoJMap.get(mercId) != null) {
  148. r.setMercName(longVoJMap.get(mercId).getName());
  149. }
  150. SysCodeConfigureDto.Vo sysCodeInfo = sysCodeMap.get(r.getEventCode());
  151. // 故障说明与建议
  152. if (sysCodeInfo != null) {
  153. r.setMsg(sysCodeInfo.getMsg());
  154. r.setPropose(sysCodeInfo.getPropose());
  155. }
  156. }
  157. data.setRecords(records);
  158. }
  159. return R.ok(data);
  160. }
  161. @PostMapping("save")
  162. @ApiOperation("添加")
  163. public R save(@RequestBody @Validated DeviceFaultInfoDto.Save save) {
  164. DeviceFaultInfo saveInfo = copy(DeviceFaultInfo.class, save);
  165. save(saveInfo);
  166. return R.ok();
  167. }
  168. @PostMapping("update")
  169. @ApiOperation("修改")
  170. public R update(@RequestBody @Validated DeviceFaultInfoDto.Update update) {
  171. DeviceFaultInfo updateInfo = copy(DeviceFaultInfo.class, update);
  172. updateById(updateInfo);
  173. return R.ok();
  174. }
  175. @PostMapping("resolve")
  176. @ApiOperation("标记已解决")
  177. public R resolve(@RequestBody @Validated DeviceFaultInfoDto.Update update) {
  178. resolveDone(update);
  179. return R.ok();
  180. }
  181. @Transactional(rollbackFor = Exception.class)
  182. public void resolveDone(DeviceFaultInfoDto.Update update) {
  183. Long faultId = update.getFaultId();
  184. DeviceFaultInfo deviceFaultInfo = this.getById(faultId);
  185. if (deviceFaultInfo == null) {
  186. throw new CommRuntimeException("操作对象不存在!");
  187. }
  188. DeviceFaultInfo updateInfo = copy(DeviceFaultInfo.class, update);
  189. updateInfo.setState(true);
  190. updateInfo.setResolveTime(LocalDateTime.now());
  191. updateInfo.setFaultLevel(-1);
  192. boolean b = updateById(updateInfo);
  193. if (b) {
  194. DeviceFaultInfoFlowDto.Save save = new DeviceFaultInfoFlowDto.Save();
  195. save.setFaultId(faultId);
  196. save.setContent("故障已解决");
  197. deviceFaultInfoFlowService.save(save);
  198. // 清理日志 故障信息表标记已解决,清除日志表中对应设备事件在标记已解决时间之前所有事件。
  199. deviceFaultLogService.remove(Wrappers.<DeviceFaultLog>lambdaUpdate().le(DeviceFaultLog::getEventTime, LocalDateTime.now()));
  200. // 更新故障等级为正常
  201. deviceInfoService.updateById(new DeviceInfo().setDeviceId(deviceFaultInfo.getDeviceId()).setFaultLevel(-1));
  202. }
  203. }
  204. }