DeviceQualityServiceImpl.java 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  1. package com.xy.service;
  2. import cn.hutool.json.JSONObject;
  3. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  4. import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
  5. import com.baomidou.mybatisplus.core.metadata.IPage;
  6. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  7. import com.xy.collections.list.JArrayList;
  8. import com.xy.collections.list.JList;
  9. import com.xy.collections.map.JHashMap;
  10. import com.xy.collections.map.JMap;
  11. import com.xy.device.EnumDeviceFactoryStatus;
  12. import com.xy.device.EnumDeviceQualityStatus;
  13. import com.xy.device.EnumDeviceQualityThreshold;
  14. import com.xy.dto.DeviceQualityDto;
  15. import com.xy.dto.DeviceQualityValueDto;
  16. import com.xy.dto.be.MercDto;
  17. import com.xy.entity.*;
  18. import com.xy.error.CommRuntimeException;
  19. import com.xy.mapper.DeviceInfoMapper;
  20. import com.xy.mapper.DeviceQualityMapper;
  21. import com.xy.service.be.MercService;
  22. import com.xy.utils.*;
  23. import io.swagger.annotations.Api;
  24. import io.swagger.annotations.ApiOperation;
  25. import lombok.AllArgsConstructor;
  26. import lombok.Getter;
  27. import org.springframework.stereotype.Service;
  28. import org.springframework.web.bind.annotation.PostMapping;
  29. import org.springframework.web.bind.annotation.RequestBody;
  30. import java.time.LocalDateTime;
  31. import java.util.ArrayList;
  32. import java.util.Arrays;
  33. import java.util.List;
  34. import static com.xy.utils.PlusBeans.*;
  35. /**
  36. * <p>
  37. * 设备-质检 服务实现类
  38. * </p>
  39. *
  40. * @author lijin
  41. * @since 2023-01-05
  42. */
  43. @Service
  44. @AllArgsConstructor
  45. @Api(tags = "设备-质检")
  46. public class DeviceQualityServiceImpl extends ServiceImpl<DeviceQualityMapper, DeviceQuality> implements DeviceQualityService {
  47. private DeviceInfoMapper deviceInfoMapper;
  48. private DeviceQualityValueServiceImpl deviceQualityValueService;
  49. private DeviceSysinfoServiceImpl deviceSysinfoService;
  50. private DeviceStatusServiceImpl deviceStatusService;
  51. private DeviceCreateIdsServiceImpl deviceCreateIdsService;
  52. private MercService mercService;
  53. private void queryDeviceQualityValue(List<DeviceQualityDto.Vo> list) {
  54. if (Emptys.check(list)) {
  55. JList<DeviceQualityDto.Vo> deviceQualitys = new JArrayList<>(list);
  56. //查询质检值
  57. JList<Integer> qualityIds = deviceQualitys.getProperty(DeviceQualityDto.Vo::getQualityId);
  58. List<DeviceQualityValue> deviceQualityValues = deviceQualityValueService.list(new LambdaQueryWrapper<DeviceQualityValue>().in(DeviceQualityValue::getQualityId, qualityIds));
  59. JMap<Integer, DeviceQualityValue> deviceQualityValueMap = new JArrayList<>(deviceQualityValues).toMap(DeviceQualityValue::getQualityId).cover();
  60. //查询机器ID号
  61. List<DeviceCreateIds> deviceCreateIds = deviceCreateIdsService.list(new LambdaQueryWrapper<DeviceCreateIds>()
  62. .in(DeviceCreateIds::getDeviceId, deviceQualitys.getProperty(DeviceQualityDto.Vo::getDeviceId))
  63. .isNotNull(DeviceCreateIds::getDeviceQrMercId)
  64. .ge(DeviceCreateIds::getDeviceQrMercId, 0)
  65. );
  66. JMap<Long, DeviceCreateIds> deviceCreateIdsJMaps;
  67. JMap<Long, MercDto.Vo> mercsJMaps;
  68. if (Emptys.check(deviceCreateIds)) {
  69. JList<DeviceCreateIds> deviceCreateIdss = new JArrayList<>(deviceCreateIds);
  70. deviceCreateIdsJMaps = deviceCreateIdss.toMap(DeviceCreateIds::getDeviceId).cover();
  71. JList<Long> mercIds = deviceCreateIdss.getProperty(DeviceCreateIds::getDeviceQrMercId);
  72. List<MercDto.Vo> mercs = mercService.list(new MercDto.SelectList().setMercIds(mercIds)).getData();
  73. mercsJMaps = new JArrayList<>(mercs).toMap(MercDto.Vo::getId).cover();
  74. } else {
  75. deviceCreateIdsJMaps = new JHashMap<>();
  76. mercsJMaps = new JHashMap<>();
  77. }
  78. list.forEach(vo -> {
  79. //质检值信息
  80. DeviceQualityValue deviceQualityValue = deviceQualityValueMap.get(vo.getQualityId());
  81. if (deviceQualityValue == null) {
  82. return;
  83. }
  84. vo.setDeviceQualityValue(copy(DeviceQualityValueDto.Vo.class, deviceQualityValue));
  85. //机器ID号商户信息
  86. DeviceCreateIds deviceCreateIdsInfo = deviceCreateIdsJMaps.get(vo.getDeviceId());
  87. if (Emptys.check(deviceCreateIdsInfo)) {
  88. MercDto.Vo merc = mercsJMaps.get(deviceCreateIdsInfo.getDeviceQrMercId());
  89. if (Emptys.check(merc)) {
  90. vo.setDeviceQrMercId(merc.getId()).setDeviceQrMercName(merc.getName());
  91. }
  92. }
  93. });
  94. }
  95. }
  96. @PostMapping("page")
  97. @ApiOperation("分页查询")
  98. public R<PageBean<DeviceQualityDto.Vo>> page(@RequestBody DeviceQualityDto.Page page) {
  99. PageBean pageBean = page.getPage();
  100. LambdaQueryWrapper<DeviceQuality> lambdaQueryWrapper = new MybatisPlusQuery().eqWrapper(page, DeviceQuality.class)
  101. .ge(DeviceQuality::getUpdateTime, page.getBeginUpdateTime())
  102. .le(DeviceQuality::getUpdateTime, page.getEndUpdateTime())
  103. .build()
  104. .orderByDesc(!Emptys.check(pageBean.getOrders()), DeviceQuality::getCreateTime);
  105. IPage<DeviceQuality> iPage = page(toIPage(pageBean), lambdaQueryWrapper);
  106. PageBean<DeviceQualityDto.Vo> voPageBean = toPageBean(DeviceQualityDto.Vo.class, iPage);
  107. List<DeviceQualityDto.Vo> list = voPageBean.getRecords();
  108. queryDeviceQualityValue(list);
  109. return R.ok(voPageBean);
  110. }
  111. @PostMapping("list")
  112. @ApiOperation("集合查询")
  113. public R<List<DeviceQualityDto.Vo>> list(@RequestBody DeviceQualityDto.SelectList selectList) {
  114. LambdaQueryWrapper<DeviceQuality> lambdaQueryWrapper = new MybatisPlusQuery().eqWrapper(selectList, DeviceQuality.class)
  115. .in(DeviceQuality::getQualityId, selectList.getQualityIds())
  116. .in(DeviceQuality::getDeviceId, selectList.getDeviceIds())
  117. .build();
  118. List<DeviceQuality> deviceQualities = list(lambdaQueryWrapper);
  119. List<DeviceQualityDto.Vo> list = copy(DeviceQualityDto.Vo.class, deviceQualities);
  120. queryDeviceQualityValue(list);
  121. return R.ok(list);
  122. }
  123. @PostMapping("obj")
  124. @ApiOperation("对象查询")
  125. public R<DeviceQualityDto.Vo> obj(@RequestBody DeviceQualityDto.Obj obj) {
  126. LambdaQueryWrapper<DeviceQuality> lambdaQueryWrapper = new MybatisPlusQuery().eqWrapper(obj, DeviceQuality.class)
  127. .build()
  128. .orderByDesc(DeviceQuality::getQualityId);
  129. List<DeviceQuality> deviceQualities = list(lambdaQueryWrapper);
  130. List<DeviceQualityDto.Vo> list = copy(DeviceQualityDto.Vo.class, deviceQualities);
  131. if (!Emptys.check(list)) {
  132. if (Emptys.check(obj.getDeviceId())) {
  133. save(Arrays.asList(new DeviceQualityDto.Save().setDeviceId(obj.getDeviceId())));
  134. return obj(obj);
  135. }
  136. return R.ok();
  137. }
  138. DeviceQualityDto.Vo vo = copy(DeviceQualityDto.Vo.class, list.get(0));
  139. queryDeviceQualityValue(Arrays.asList(vo));
  140. return R.ok(vo);
  141. }
  142. @PostMapping("update")
  143. @ApiOperation("修改")
  144. public R update(@RequestBody List<DeviceQualityDto.Vo> vos) {
  145. List<DeviceQuality> deviceQualities = copy(DeviceQuality.class, vos);
  146. LocalDateTime now = LocalDateTime.now();
  147. List<DeviceSysinfo> deviceSysinfos = deviceSysinfoService.list(new LambdaQueryWrapper<DeviceSysinfo>().in(DeviceSysinfo::getDeviceId, new JArrayList<>(vos).getProperty(DeviceQualityDto.Vo::getDeviceId)));
  148. JMap<Long, DeviceSysinfo> deviceSysinfosJMaps = new JArrayList<>(deviceSysinfos).toMap(DeviceSysinfo::getDeviceId).cover();
  149. int qualified = SysDictUtils.getValue(EnumDeviceQualityStatus.Code.CODE.getCode(), EnumDeviceQualityStatus.QUALIFIED.getCode(), Integer.class);
  150. List<DeviceStatus> deviceStatuses = new ArrayList<>();
  151. for (DeviceQuality deviceQuality : deviceQualities) {
  152. if (deviceQuality.getQualityState() != null) {
  153. //合格
  154. if (qualified == deviceQuality.getQualityState()) {
  155. //检查磁盘空间和内存容量
  156. DeviceSysinfo deviceSysinfo = deviceSysinfosJMaps.get(deviceQuality.getDeviceId());
  157. Integer diskSpace = deviceSysinfo.getDiskSpace();
  158. int diskSpaceSize = SysDictUtils.getValue(EnumDeviceQualityThreshold.Code.CODE.getCode(), EnumDeviceQualityThreshold.DISK_SPACE_SIZE.getCode(), Integer.class);
  159. if (diskSpace == null || diskSpace < diskSpaceSize) {
  160. return R.fail(deviceSysinfo.getDeviceId() + "磁盘空间不足" + diskSpaceSize + "G");
  161. }
  162. Integer memerySpace = deviceSysinfo.getMemerySpace();
  163. int memerySpaceSize = SysDictUtils.getValue(EnumDeviceQualityThreshold.Code.CODE.getCode(), EnumDeviceQualityThreshold.MEMERY_SPACE_SIZE.getCode(), Integer.class);
  164. if (memerySpace == null || memerySpace < memerySpaceSize) {
  165. return R.fail(deviceSysinfo.getDeviceId() + "内存容量不足" + memerySpaceSize + "M");
  166. }
  167. //标记机器不可交易
  168. DeviceStatus deviceStatus = new DeviceStatus()
  169. .setDeviceId(deviceQuality.getDeviceId())
  170. .setIsPay(false);
  171. deviceStatuses.add(deviceStatus);
  172. }
  173. deviceQuality.setQualityAuditUserId(AuthorizeUtils.getLoginId(Long.class));
  174. }
  175. if (deviceQuality.getFactoryState() != null) {
  176. deviceQuality.setFactoryAuditUserId(AuthorizeUtils.getLoginId(Long.class));
  177. }
  178. deviceQuality.setUpdateTime(now);
  179. }
  180. updateBatchById(deviceQualities);
  181. if (Emptys.check(deviceStatuses)) {
  182. deviceStatusService.updateBatchById(deviceStatuses);
  183. }
  184. return R.ok();
  185. }
  186. @PostMapping("rest")
  187. @ApiOperation(value = "重置多项质检", hidden = true)
  188. public R rest(@RequestBody DeviceQualityDto.Rest rest) {
  189. SysDictRedis sysDictRedis1 = SysDictUtils.get(EnumDeviceQualityStatus.Code.CODE.getCode(), EnumDeviceQualityStatus.QUALIFIED.getCode());
  190. SysDictRedis sysDictRedis2 = SysDictUtils.get(EnumDeviceFactoryStatus.Code.CODE.getCode(), EnumDeviceFactoryStatus.CAN_SHIPPED.getCode());
  191. DeviceQuality deviceQuality = getById(rest.getQualityId());
  192. if (sysDictRedis1.getValue().equals(deviceQuality.getQualityState()) || sysDictRedis2.getValue().equals(deviceQuality.getFactoryState())) {
  193. return R.fail("设备已合格或已出厂");
  194. }
  195. List<String> types = rest.getTypes();
  196. LocalDateTime now = LocalDateTime.now();
  197. types.forEach(type -> {
  198. QualityEnum qualityEnum = QualityEnum.getQualityEnum(type);
  199. if (qualityEnum == null) {
  200. return;
  201. }
  202. //修改质检
  203. UpdateWrapper<DeviceQuality> updateWrapper = new UpdateWrapper<DeviceQuality>()
  204. .set(qualityEnum.getBeginTime(), now)
  205. .set(qualityEnum.getEndTime(), null)
  206. .set(StringTools.humpToLine(LambdaUtils.getProperty(DeviceQuality::getUpdateTime)), now)
  207. .eq(StringTools.humpToLine(LambdaUtils.getProperty(DeviceQuality::getQualityId)), rest.getQualityId());
  208. update(updateWrapper);
  209. //删除质检属性
  210. DeviceQualityValueDto.Vo del = new DeviceQualityValueDto.Vo()
  211. .setQualityId(rest.getQualityId())
  212. .setQualityType(type);
  213. deviceQualityValueService.del(del);
  214. });
  215. return R.ok();
  216. }
  217. @PostMapping("save")
  218. @ApiOperation("添加新质检")
  219. public R<List<Tuple.Tuple3<Long, Long, Boolean>>> save(@RequestBody List<DeviceQualityDto.Save> deviceQualitySaves) {
  220. List<DeviceQualityDto.Vo> updates = new ArrayList<>();
  221. List<DeviceQuality> saves = new ArrayList<>();
  222. JList<Long> deviceIds = new JArrayList<>(deviceQualitySaves).getProperty(DeviceQualityDto.Save::getDeviceId);
  223. //获取设备信息
  224. List<DeviceInfo> deviceInfos = deviceInfoMapper.selectList(new LambdaQueryWrapper<DeviceInfo>().in(DeviceInfo::getDeviceId, deviceIds));
  225. JMap<Long, DeviceInfo> deviceInfoJMap = new JArrayList<>(deviceInfos).toMap(DeviceInfo::getDeviceId).cover();
  226. //获取已有质检信息
  227. List<DeviceQuality> deviceQualities = list(new LambdaQueryWrapper<DeviceQuality>()
  228. .in(DeviceQuality::getDeviceId, deviceIds)
  229. .eq(DeviceQuality::getShowStatus, true)
  230. );
  231. JMap<Long, List<DeviceQuality>> deviceQualitieJMap = new JArrayList<>(deviceQualities).toMap(DeviceQuality::getDeviceId).group();
  232. LocalDateTime now = LocalDateTime.now();
  233. //封装修改和添加对象
  234. deviceQualitySaves.forEach(save -> {
  235. DeviceInfo deviceInfo = deviceInfoJMap.get(save.getDeviceId());
  236. if (deviceInfo == null) {
  237. throw new CommRuntimeException(save.getDeviceId() + "设备不存在");
  238. }
  239. DeviceQuality deviceQuality = new DeviceQuality()
  240. .setDeviceId(save.getDeviceId())
  241. .setDeviceType(deviceInfo.getDeviceType())
  242. .setCreateTime(now);
  243. List<DeviceQuality> list = deviceQualitieJMap.get(deviceQuality.getDeviceId());
  244. if (Emptys.check(list)) {
  245. JList<Integer> qualityIds = new JArrayList<>(list).getProperty(DeviceQuality::getQualityId);
  246. List<DeviceQualityDto.Vo> vos2 = new ArrayList<>(qualityIds.size());
  247. qualityIds.forEach(qualityId -> vos2.add(new DeviceQualityDto.Vo().setQualityId(qualityId).setShowStatus(false)));
  248. updates.addAll(vos2);
  249. }
  250. saves.add(deviceQuality);
  251. });
  252. //修改
  253. if (Emptys.check(updates)) {
  254. update(updates);
  255. }
  256. //添加
  257. saveBatch(saves);
  258. return R.ok();
  259. }
  260. @ApiOperation(value = "质检结果通知", hidden = true)
  261. @PostMapping("qualityResultBack")
  262. public R qualityResultBack(@RequestBody DeviceQualityDto.QualityResultBack qualityResultBack) {
  263. Long deviceId = qualityResultBack.getDeviceId();
  264. String type = qualityResultBack.getType();
  265. JSONObject data = qualityResultBack.getData();
  266. LambdaQueryWrapper<DeviceQuality> lambdaQueryWrapper = new LambdaQueryWrapper<DeviceQuality>()
  267. .eq(DeviceQuality::getDeviceId, deviceId)
  268. .eq(DeviceQuality::getShowStatus, true).orderByDesc(DeviceQuality::getQualityId).last("limit 1");
  269. DeviceQuality deviceQuality = getOne(lambdaQueryWrapper);
  270. if (deviceQuality == null) {
  271. return R.fail("设备不存在");
  272. }
  273. //修改质检
  274. QualityEnum qualityEnum = QualityEnum.getQualityEnum(type);
  275. if (qualityEnum != null) {
  276. UpdateWrapper<DeviceQuality> updateWrapper = new UpdateWrapper<DeviceQuality>()
  277. .set(qualityEnum.getEndTime(), LocalDateTime.now())
  278. .eq(StringTools.humpToLine(LambdaUtils.getProperty(DeviceQuality::getDeviceId)), deviceId)
  279. .eq(StringTools.humpToLine(LambdaUtils.getProperty(DeviceQuality::getShowStatus)), true);
  280. update(updateWrapper);
  281. }
  282. //修改质检值
  283. DeviceQualityValueDto.Vo saveOrUpdate = new DeviceQualityValueDto.Vo()
  284. .setQualityType(type)
  285. .setQualityValue(data.toString());
  286. saveOrUpdate.setQualityId(deviceQuality.getQualityId());
  287. deviceQualityValueService.saveOrUpdate(saveOrUpdate);
  288. return R.ok();
  289. }
  290. /**
  291. * 工厂枚举
  292. */
  293. @Getter
  294. @AllArgsConstructor
  295. public enum QualityEnum {
  296. /**
  297. * 软件硬系统检查
  298. */
  299. CHECK_SYSTEM("check_system", "system_state", "system_state_begin_time", "system_state_end_time"),
  300. /**
  301. * 交易测试检查
  302. */
  303. CHECK_TRADE("check_trade", "trade_state", "trade_state_begin_time", "trade_state_end_time"),
  304. /**
  305. * 门锁检查
  306. */
  307. CHECK_LOCKER("check_locker", "locker_state", "locker_state_begin_time", "locker_state_end_time"),
  308. /**
  309. * 温度检查
  310. */
  311. CHECK_TEMPERATURE("check_temperature", "temperature_state", "temperature_state_begin_time", "temperature_state_end_time"),
  312. /**
  313. * 模拟批量测试
  314. */
  315. CHECK_IMITATE_TEST("check_imitate_test", "imitate_test_state", "imitate_test_state_begin_time", "imitate_test_state_end_time"),
  316. /**
  317. * 参数设置检查
  318. */
  319. CHECK_SETTING("check_setting", "setting_state", "setting_state_begin_time", "setting_state_end_time"),
  320. ;
  321. /**
  322. * 质检类型
  323. */
  324. private String type;
  325. /**
  326. * 质检状态列名
  327. */
  328. private String state;
  329. /**
  330. * 质检状态开始时间列名
  331. */
  332. private String beginTime;
  333. /**
  334. * 质检状态结束时间列名
  335. */
  336. private String endTime;
  337. public static QualityEnum getQualityEnum(String type) {
  338. QualityEnum[] values = QualityEnum.values();
  339. for (QualityEnum qualityEnum : values) {
  340. if (qualityEnum.type.equals(type)) {
  341. return qualityEnum;
  342. }
  343. }
  344. return null;
  345. }
  346. }
  347. }