DeviceCreateIdsServiceImpl.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. package com.xy.service;
  2. import com.alibaba.excel.EasyExcel;
  3. import com.alibaba.excel.context.AnalysisContext;
  4. import com.alibaba.excel.read.listener.ReadListener;
  5. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  6. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  7. import com.baomidou.mybatisplus.core.metadata.IPage;
  8. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  9. import com.xy.annotation.Lock;
  10. import com.xy.collections.list.JArrayList;
  11. import com.xy.collections.list.JList;
  12. import com.xy.collections.map.JHashMap;
  13. import com.xy.collections.map.JMap;
  14. import com.xy.config.DeviceThreadPoolConfig;
  15. import com.xy.device.EnumDeviceQrCode;
  16. import com.xy.dto.DeviceCreateIdsDto;
  17. import com.xy.dto.SysWorkUser.ListDto;
  18. import com.xy.dto.SysWorkUser.SysWorkVo;
  19. import com.xy.entity.DeviceCreateIds;
  20. import com.xy.entity.SysDictRedis;
  21. import com.xy.error.CommRuntimeException;
  22. import com.xy.mapper.DeviceCreateIdsMapper;
  23. import com.xy.utils.*;
  24. import io.swagger.annotations.Api;
  25. import io.swagger.annotations.ApiOperation;
  26. import lombok.Data;
  27. import lombok.RequiredArgsConstructor;
  28. import lombok.SneakyThrows;
  29. import lombok.extern.slf4j.Slf4j;
  30. import org.springframework.stereotype.Service;
  31. import org.springframework.validation.annotation.Validated;
  32. import org.springframework.web.bind.annotation.PostMapping;
  33. import org.springframework.web.bind.annotation.RequestBody;
  34. import org.springframework.web.bind.annotation.RequestParam;
  35. import org.springframework.web.multipart.MultipartFile;
  36. import javax.servlet.http.HttpServletResponse;
  37. import java.io.IOException;
  38. import java.io.InputStream;
  39. import java.io.OutputStream;
  40. import java.time.LocalDate;
  41. import java.time.LocalDateTime;
  42. import java.util.ArrayList;
  43. import java.util.List;
  44. import static com.xy.utils.Beans.copy;
  45. import static com.xy.utils.PlusBeans.toIPage;
  46. import static com.xy.utils.PlusBeans.toPageBean;
  47. /**
  48. * <p>
  49. * 设备-机器ID号生成 服务实现类
  50. * </p>
  51. *
  52. * @author lijin
  53. * @since 2022-12-29
  54. */
  55. @Slf4j
  56. @Service
  57. @RequiredArgsConstructor
  58. @Api(tags = "设备-机器ID号生成")
  59. public class DeviceCreateIdsServiceImpl extends ServiceImpl<DeviceCreateIdsMapper, DeviceCreateIds> implements DeviceCreateIdsService {
  60. private final SysWorkUserService sysWorkUserService;
  61. @SneakyThrows
  62. @PostMapping("save")
  63. @ApiOperation("添加")
  64. @Lock("device-create-ids-save")
  65. public R<JList<DeviceCreateIds>> save(@RequestBody @Validated DeviceCreateIdsDto.Save save) {
  66. LocalDate localDate = LocalDate.now();
  67. String year = String.valueOf(localDate.getYear());
  68. String month = String.valueOf(localDate.getMonthValue());
  69. String yearMonth = year.substring(2) + (month.length() == 1 ? "0" + month : month);
  70. String property = LambdaUtils.getProperty(DeviceCreateIds::getDeviceId);
  71. QueryWrapper<DeviceCreateIds> queryWrapper = new QueryWrapper<DeviceCreateIds>()
  72. .select(String.format("max(%s) as %s", StringTools.humpToLine(property), property))
  73. .eq(StringTools.humpToLine(LambdaUtils.getProperty(DeviceCreateIds::getIsCustom)), false);
  74. DeviceCreateIds deviceCreateIds = getOne(queryWrapper);
  75. JMap<Long, DeviceCreateIds> deviceCreateIdss = new JHashMap<>(save.getNum());
  76. Long loginId = AuthorizeUtils.getLoginId(Long.class);
  77. for (int i = 0; i < save.getNum(); i++) {
  78. String tail = null;
  79. if (deviceCreateIds != null) {
  80. String substring = String.valueOf(deviceCreateIds.getDeviceId()).substring(0, 4);
  81. if (substring.equals(yearMonth)) {
  82. tail = String.valueOf(deviceCreateIds.getDeviceId() + (i + 1)).substring(4);
  83. }
  84. }
  85. if (tail == null) {
  86. tail = String.valueOf((i + 1));
  87. int i0 = 6 - tail.length();
  88. for (int i1 = 0; i1 < i0; i1++) {
  89. tail = 0 + tail;
  90. }
  91. }
  92. Long deviceId = Long.valueOf(yearMonth + tail);
  93. DeviceCreateIds deviceCreateIdsInfo = copy(DeviceCreateIds.class, save)
  94. .setDeviceId(deviceId)
  95. .setCreateUserId(loginId)
  96. .setCreateTime(LocalDateTime.now());
  97. deviceCreateIdss.put(deviceId, deviceCreateIdsInfo);
  98. }
  99. //去重复
  100. weight(deviceCreateIdss, save.getNum());
  101. //添加
  102. JList<DeviceCreateIds> value = deviceCreateIdss.toList().value();
  103. JList<JList<DeviceCreateIds>> partition = value.partition(20);
  104. ThreadPoolUtils.Execute execute = ThreadPoolUtils.excPoll(DeviceThreadPoolConfig.DEVICE_COMMON_POLL, partition.size());
  105. partition.forEach(createIds -> execute.execute(() -> saveBatch(createIds)));
  106. execute.end();
  107. return R.ok(value);
  108. }
  109. @PostMapping("saveCustom")
  110. @ApiOperation("添加自定义机器号")
  111. @Lock("device-create-ids-save")
  112. public R saveCustom(@RequestBody @Validated DeviceCreateIdsDto.SaveCustom saveCustom) {
  113. DeviceCreateIds deviceCreateIds = getById(saveCustom.getDeviceId());
  114. if (deviceCreateIds != null) {
  115. return R.fail("机器号已存在");
  116. }
  117. DeviceCreateIds deviceCreateIdsInfo = copy(DeviceCreateIds.class, saveCustom)
  118. .setCreateUserId(AuthorizeUtils.getLoginId(Long.class))
  119. .setIsCustom(true)
  120. .setCreateTime(LocalDateTime.now());
  121. save(deviceCreateIdsInfo);
  122. return R.ok();
  123. }
  124. @PostMapping("page")
  125. @ApiOperation("分页查询")
  126. public R<PageBean<DeviceCreateIdsDto.Vo>> page(@RequestBody DeviceCreateIdsDto.Page page) {
  127. PageBean pageBean = page.getPage();
  128. LambdaQueryWrapper<DeviceCreateIds> lambdaQueryWrapper = new MybatisPlusQuery().eqWrapper(page, DeviceCreateIds.class)
  129. .ge(DeviceCreateIds::getCreateTime, page.getBeginCreateTime())
  130. .le(DeviceCreateIds::getCreateTime, page.getEndCreateTime())
  131. .ge(DeviceCreateIds::getBindTime, page.getBeginBindTime())
  132. .le(DeviceCreateIds::getBindTime, page.getEndBindTime())
  133. .build()
  134. .orderByDesc(!Emptys.check(pageBean.getOrders()), DeviceCreateIds::getCreateTime);
  135. IPage<DeviceCreateIds> iPage = page(toIPage(pageBean), lambdaQueryWrapper);
  136. PageBean<DeviceCreateIdsDto.Vo> voPageBean = toPageBean(PlusBeans.copy(DeviceCreateIdsDto.Vo.class, iPage));
  137. List<DeviceCreateIdsDto.Vo> records = voPageBean.getRecords();
  138. JList<Long> createUserIds = new JArrayList<>(records).getProperty(DeviceCreateIdsDto.Vo::getCreateUserId);
  139. List<SysWorkVo> sysWorkVos = sysWorkUserService.list(new ListDto().setId(createUserIds)).getData();
  140. if (Emptys.check(sysWorkVos)) {
  141. JMap<Long, SysWorkVo> sysWorkVoJMap = new JArrayList<>(sysWorkVos).toMap(SysWorkVo::getId).cover();
  142. records.forEach(vo -> {
  143. SysWorkVo sysWorkVo = sysWorkVoJMap.get(vo.getCreateUserId());
  144. if (sysWorkVo == null) {
  145. return;
  146. }
  147. vo.setCreateUserName(sysWorkVo.getAccount());
  148. });
  149. }
  150. return R.ok(voPageBean);
  151. }
  152. @Override
  153. @ApiOperation("修改")
  154. public R update(DeviceCreateIdsDto.Update update) {
  155. DeviceCreateIds deviceCreateIds = copy(DeviceCreateIds.class, update);
  156. updateById(deviceCreateIds);
  157. return R.ok();
  158. }
  159. @PostMapping("exportQrCode")
  160. @ApiOperation("导出二维码")
  161. public void exportQrCode(@RequestBody DeviceCreateIdsDto.ExportQrCode exportQrCode) {
  162. SysDictRedis sysDictRedis = SysDictUtils.get(EnumDeviceQrCode.Code.CODE.getCode(), EnumDeviceQrCode.URL.getCode());
  163. List<String> list = new ArrayList<>();
  164. Boolean isWhere = exportQrCode.getIsWhere() == null ? false : exportQrCode.getIsWhere();
  165. if (!isWhere) {
  166. List<Long> deviceIds = exportQrCode.getDeviceIds();
  167. if (Emptys.check(deviceIds)) {
  168. deviceIds.forEach(deviceId -> list.add(deviceId.toString()));
  169. }
  170. } else {
  171. LambdaQueryWrapper<DeviceCreateIds> lambdaQueryWrapper = new MybatisPlusQuery().eqWrapper(exportQrCode, DeviceCreateIds.class)
  172. .ge(DeviceCreateIds::getCreateTime, exportQrCode.getBeginCreateTime())
  173. .le(DeviceCreateIds::getCreateTime, exportQrCode.getEndCreateTime())
  174. .ge(DeviceCreateIds::getBindTime, exportQrCode.getBeginBindTime())
  175. .le(DeviceCreateIds::getBindTime, exportQrCode.getEndBindTime())
  176. .build();
  177. List<DeviceCreateIds> deviceCreateIds = list(lambdaQueryWrapper);
  178. deviceCreateIds.forEach(deviceCreateIds1 -> list.add(String.valueOf(deviceCreateIds1.getDeviceId())));
  179. }
  180. if (!Emptys.check(list)) {
  181. throw new CommRuntimeException("没有导出的数据");
  182. }
  183. List<String> infos = new ArrayList<>();
  184. for (String deviceId : list) {
  185. infos.add(sysDictRedis.getValue() + deviceId);
  186. }
  187. QRCodeUtils.create(infos, 400, 400, "back1.png", list).download(list);
  188. }
  189. @SneakyThrows
  190. @ApiOperation("下载自定义设备id模板")
  191. @PostMapping("downloadIdTemplet")
  192. public void downloadIdTemplet(HttpServletResponse response) {
  193. InputStream inputStream = IoUtils.inputStream("id_templet.xlsx").get();
  194. response.setHeader("Content-Disposition", "attachment; filename=" + "id_templet.xlsx");
  195. response.setContentType("application/xlsx");
  196. byte[] buffer = new byte[1024];
  197. int bytesRead;
  198. OutputStream outputStream = response.getOutputStream();
  199. while ((bytesRead = inputStream.read(buffer)) != -1) {
  200. outputStream.write(buffer, 0, bytesRead);
  201. }
  202. }
  203. @ApiOperation("批量添加自定义机器号")
  204. @PostMapping("uploadSaveCustom")
  205. public R uploadSaveCustom(@RequestParam("file") MultipartFile file, @RequestParam("deviceType") Integer deviceType, @RequestParam("doorType") String doorType, @RequestParam("createPc") String createPc) {
  206. ThreadPoolUtils.excPoll(DeviceThreadPoolConfig.DEVICE_COMMON_POLL, 1)
  207. .execute(() -> {
  208. try {
  209. EasyExcel.read(file.getInputStream(), UploadSaveCustom.class, new UploadSaveCustomListener(deviceType, doorType, createPc, AuthorizeUtils.getLoginId(Long.class), this)).sheet().doRead();
  210. } catch (IOException e) {
  211. log.error("", e);
  212. }
  213. });
  214. return R.ok();
  215. }
  216. private void weight(JMap<Long, DeviceCreateIds> deviceCreateIdss, int num) {
  217. List<DeviceCreateIds> list = list(new LambdaQueryWrapper<DeviceCreateIds>().in(DeviceCreateIds::getDeviceId, deviceCreateIdss.toList().key()));
  218. if (Emptys.check(list)) {
  219. list.forEach(deviceCreateIdsInfo -> {
  220. //添加
  221. DeviceCreateIds deviceCreateIdsOld = deviceCreateIdss.get(deviceCreateIdsInfo.getDeviceId());
  222. Long deviceId = deviceCreateIdsOld.getDeviceId() + num;
  223. deviceCreateIdss.put(deviceId, copy(DeviceCreateIds.class, deviceCreateIdsOld).setDeviceId(deviceId));
  224. //删除
  225. deviceCreateIdss.remove(deviceCreateIdsInfo.getDeviceId());
  226. });
  227. weight(deviceCreateIdss, num);
  228. }
  229. }
  230. @Slf4j
  231. @RequiredArgsConstructor
  232. public static class UploadSaveCustomListener implements ReadListener<UploadSaveCustom> {
  233. private final Integer deviceType;
  234. private final String doorType;
  235. private final String createPc;
  236. private final Long loginId;
  237. private final DeviceCreateIdsServiceImpl deviceCreateIdsService;
  238. private JMap<Long, UploadSaveCustom> deviceIds = new JHashMap<>();
  239. /**
  240. * 这个每一条数据解析都会来调用
  241. *
  242. * @param data one row value. Is is same as {@link AnalysisContext#readRowHolder()}
  243. * @param context
  244. */
  245. @Override
  246. public void invoke(UploadSaveCustom data, AnalysisContext context) {
  247. deviceIds.put(data.getDeviceId(), data);
  248. }
  249. /**
  250. * 所有数据解析完成了 都会来调用
  251. *
  252. * @param context
  253. */
  254. @Override
  255. public void doAfterAllAnalysed(AnalysisContext context) {
  256. List<DeviceCreateIds> list = deviceCreateIdsService.list(new LambdaQueryWrapper<DeviceCreateIds>().in(DeviceCreateIds::getDeviceId, deviceIds.toList().key()));
  257. if (Emptys.check(list)) {
  258. list.forEach(deviceCreateIds -> {
  259. deviceIds.remove(deviceCreateIds.getDeviceId());
  260. log.info("重复的设备号:{}", deviceCreateIds.getDeviceId());
  261. });
  262. }
  263. if (Emptys.check(deviceIds)) {
  264. LocalDateTime now = LocalDateTime.now();
  265. JList<Long> deviceIds2 = deviceIds.toList().key();
  266. List<DeviceCreateIds> saves = new ArrayList<>(deviceIds2.size());
  267. deviceIds2.forEach(deviceId -> {
  268. DeviceCreateIds deviceCreateIdsInfo = new DeviceCreateIds()
  269. .setDeviceId(deviceId)
  270. .setDeviceType(deviceType)
  271. .setDoorType(doorType)
  272. .setCreatePc(createPc)
  273. .setCreateUserId(loginId)
  274. .setIsCustom(true)
  275. .setCreateTime(now);
  276. saves.add(deviceCreateIdsInfo);
  277. });
  278. deviceCreateIdsService.saveBatch(saves);
  279. log.info("批量添加自定义机器号完成,共{}条", saves.size());
  280. }
  281. }
  282. }
  283. @Data
  284. public static class UploadSaveCustom {
  285. private Long deviceId;
  286. }
  287. }