DeviceAnnualFeeServiceImpl.java 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521
  1. package com.xy.service;
  2. import cn.hutool.http.HttpRequest;
  3. import cn.hutool.json.JSONArray;
  4. import cn.hutool.json.JSONObject;
  5. import cn.hutool.json.JSONUtil;
  6. import com.alibaba.excel.EasyExcel;
  7. import com.alibaba.excel.annotation.ExcelProperty;
  8. import com.alibaba.excel.context.AnalysisContext;
  9. import com.alibaba.excel.read.listener.ReadListener;
  10. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  11. import com.baomidou.mybatisplus.core.metadata.IPage;
  12. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  13. import com.github.yitter.idgen.YitIdHelper;
  14. import com.xy.collections.list.JArrayList;
  15. import com.xy.collections.list.JList;
  16. import com.xy.collections.map.JHashMap;
  17. import com.xy.collections.map.JMap;
  18. import com.xy.config.DeviceThreadPoolConfig;
  19. import com.xy.dto.CommandMqtt;
  20. import com.xy.dto.DeviceAnnualFeeDto;
  21. import com.xy.dto.MqttUserDto;
  22. import com.xy.dto.be.MercDto;
  23. import com.xy.entity.*;
  24. import com.xy.mapper.DeviceAnnualFeeMapper;
  25. import com.xy.service.be.MercService;
  26. import com.xy.utils.*;
  27. import io.swagger.annotations.Api;
  28. import io.swagger.annotations.ApiOperation;
  29. import lombok.AllArgsConstructor;
  30. import lombok.Data;
  31. import lombok.RequiredArgsConstructor;
  32. import lombok.SneakyThrows;
  33. import lombok.extern.slf4j.Slf4j;
  34. import org.springframework.context.annotation.Lazy;
  35. import org.springframework.stereotype.Service;
  36. import org.springframework.transaction.annotation.Transactional;
  37. import org.springframework.validation.annotation.Validated;
  38. import org.springframework.web.bind.annotation.PostMapping;
  39. import org.springframework.web.bind.annotation.RequestBody;
  40. import org.springframework.web.bind.annotation.RequestParam;
  41. import org.springframework.web.multipart.MultipartFile;
  42. import javax.servlet.http.HttpServletResponse;
  43. import java.io.InputStream;
  44. import java.io.OutputStream;
  45. import java.time.LocalDateTime;
  46. import java.util.*;
  47. import static com.xy.utils.PlusBeans.toIPage;
  48. import static com.xy.utils.PlusBeans.toPageBean;
  49. /**
  50. * <p>
  51. * 设备年费表 服务实现类
  52. * </p>
  53. *
  54. * @author lijin
  55. * @since 2025-02-28
  56. */
  57. @Slf4j
  58. @Service
  59. @AllArgsConstructor(onConstructor_ = @Lazy)
  60. @Api(tags = "设备年费表")
  61. public class DeviceAnnualFeeServiceImpl extends ServiceImpl<DeviceAnnualFeeMapper, DeviceAnnualFee> implements DeviceAnnualFeeService {
  62. private DeviceCreateIdsServiceImpl deviceCreateIdsService;
  63. private DeviceRegisterServiceImpl deviceRegisterService;
  64. private DeviceInfoServiceImpl deviceInfoService;
  65. private DeviceSysinfoServiceImpl deviceSysinfoService;
  66. private DeviceStatusServiceImpl deviceStatusService;
  67. private DevicePartServiceImpl devicePartService;
  68. private MqttUserServiceImpl mqttUserService;
  69. private MercService mercService;
  70. private MqttService mqttService;
  71. @PostMapping("check")
  72. @ApiOperation("检查")
  73. public R<String> check(@RequestBody @Validated DeviceAnnualFeeDto.Check check) {
  74. DeviceAnnualFee deviceAnnualFee = getOne(new LambdaQueryWrapper<DeviceAnnualFee>()
  75. .eq(DeviceAnnualFee::getDeviceId, check.getDeviceId())
  76. .eq(DeviceAnnualFee::getIsThis, true)
  77. );
  78. if (deviceAnnualFee == null) {
  79. return R.fail("设备未分配到年费商家");
  80. }
  81. String timeout = DataTime.toString(deviceAnnualFee.getTimeout());
  82. int i = DataTime.stringContrast(timeout, DataTime.getSring());
  83. if (i < 0) {
  84. return R.fail("已欠费");
  85. }
  86. deviceAnnualFee.setRunPlatform(check.getRunPlatform());
  87. updateById(deviceAnnualFee);
  88. return R.ok(timeout);
  89. }
  90. @PostMapping("page")
  91. @ApiOperation("分页查询")
  92. public R<PageBean<DeviceAnnualFeeDto.Vo>> page(@RequestBody DeviceAnnualFeeDto.Page page) {
  93. LambdaQueryWrapper<DeviceAnnualFee> lambdaQueryWrapper = new MybatisPlusQuery()
  94. .eqWrapper(page, DeviceAnnualFee.class)
  95. .ge(DeviceAnnualFee::getTimeout, page.getBeginTime())
  96. .le(DeviceAnnualFee::getTimeout, page.getEndTime())
  97. .build();
  98. IPage<DeviceAnnualFee> iPage = page(toIPage(page.getPage()), lambdaQueryWrapper);
  99. PageBean<DeviceAnnualFeeDto.Vo> pageBean = toPageBean(DeviceAnnualFeeDto.Vo.class, iPage);
  100. List<DeviceAnnualFeeDto.Vo> records = pageBean.getRecords();
  101. if (Emptys.check(records)) {
  102. List<MercDto.Vo> mercs = mercService.list(new MercDto.SelectList().setMercIds(new JArrayList<>(records).getProperty(DeviceAnnualFeeDto.Vo::getMercId).comparing())).getData();
  103. JMap<Long, MercDto.Vo> cover = new JArrayList<>(mercs).toMap(MercDto.Vo::getId).cover();
  104. Map<String, SysDictRedis> stringSysDictRedisMap = SysDictUtils.get("merc_device_annual_fee");
  105. for (DeviceAnnualFeeDto.Vo record : records) {
  106. MercDto.Vo merc = cover.get(record.getMercId());
  107. SysDictRedis sysDictRedis = stringSysDictRedisMap.get(String.valueOf(record.getMercId()));
  108. JSONObject jsonObject = JSONUtil.parseObj(sysDictRedis.getValue());
  109. record.setMoney(jsonObject.getInt("money"))
  110. .setMercName(merc.getName());
  111. }
  112. }
  113. return R.ok(pageBean);
  114. }
  115. @PostMapping("mercPage")
  116. @ApiOperation("商家分页查询(无token)")
  117. public R<PageBean<DeviceAnnualFeeDto.Vo>> mercPage(@RequestBody DeviceAnnualFeeDto.Page page) {
  118. if (!Emptys.check(page.getCode())) {
  119. return R.fail("code不能为空");
  120. }
  121. Map<String, SysDictRedis> stringSysDictRedisMap = SysDictUtils.get("merc_device_annual_fee");
  122. SysDictRedis sysDictRedis = stringSysDictRedisMap.get(page.getCode());
  123. if (sysDictRedis == null) {
  124. return R.fail("code未配置商家");
  125. }
  126. page.setMercId(Long.valueOf(sysDictRedis.getValue())).setRegisterStatus(true);
  127. return page(page);
  128. }
  129. @SneakyThrows
  130. @ApiOperation("导出年费模版")
  131. @PostMapping("download")
  132. public void download(HttpServletResponse response) {
  133. InputStream inputStream = IoUtils.inputStream("device_annual_fee_templet.xlsx").get();
  134. response.setHeader("Content-Disposition", "attachment; filename=" + "device_annual_fee_templet.xlsx");
  135. response.setContentType("application/xlsx");
  136. byte[] buffer = new byte[1024];
  137. int bytesRead;
  138. OutputStream outputStream = response.getOutputStream();
  139. while ((bytesRead = inputStream.read(buffer)) != -1) {
  140. outputStream.write(buffer, 0, bytesRead);
  141. }
  142. inputStream.close();
  143. outputStream.close();
  144. }
  145. @SneakyThrows
  146. @ApiOperation("导入年费数据")
  147. @PostMapping("upload")
  148. public R upload(@RequestParam("file") MultipartFile file) {
  149. EasyExcel.read(file.getInputStream(), UploadInfo.class, new UploadListener(this)).sheet().doRead();
  150. return R.ok();
  151. }
  152. @PostMapping("sendDeviceInfo")
  153. @ApiOperation("推送设备到商家平台")
  154. public R sendDeviceInfo(@RequestBody @Validated DeviceAnnualFeeDto.SendDeviceInfo sendDeviceInfo) {
  155. List<Long> deviceIds = sendDeviceInfo.getDeviceIds();
  156. //设备年费信息
  157. List<DeviceAnnualFee> deviceAnnualFees = list(new LambdaQueryWrapper<DeviceAnnualFee>()
  158. .in(DeviceAnnualFee::getDeviceId, deviceIds)
  159. .eq(DeviceAnnualFee::getIsThis, true)
  160. );
  161. JMap<Long, DeviceAnnualFee> deviceAnnualFeesJMaps = new JArrayList<>(deviceAnnualFees).toMap(DeviceAnnualFee::getDeviceId).cover();
  162. //设备id创建信息
  163. List<DeviceCreateIds> deviceCreateIdss = deviceCreateIdsService.listByIds(deviceIds);
  164. JMap<Long, DeviceCreateIds> deviceCreateIdsJMaps = new JArrayList<>(deviceCreateIdss).toMap(DeviceCreateIds::getDeviceId).cover();
  165. //设备注册信息
  166. List<DeviceRegister> deviceRegisters = deviceRegisterService.listByIds(deviceIds);
  167. JMap<Long, DeviceRegister> deviceRegistersJMaps = new JArrayList<>(deviceRegisters).toMap(DeviceRegister::getDeviceId).cover();
  168. //设备信息
  169. List<DeviceInfo> deviceInfos = deviceInfoService.listByIds(deviceIds);
  170. JMap<Long, DeviceInfo> deviceInfosJMaps = new JArrayList<>(deviceInfos).toMap(DeviceInfo::getDeviceId).cover();
  171. //设备系统信息
  172. List<DeviceSysinfo> deviceSysinfos = deviceSysinfoService.listByIds(deviceIds);
  173. JMap<Long, DeviceSysinfo> deviceSysinfosJMaps = new JArrayList<>(deviceSysinfos).toMap(DeviceSysinfo::getDeviceId).cover();
  174. //设备状态信息
  175. List<DeviceStatus> deviceStatuses = deviceStatusService.listByIds(deviceIds);
  176. JMap<Long, DeviceStatus> deviceStatusesJMaps = new JArrayList<>(deviceStatuses).toMap(DeviceStatus::getDeviceId).cover();
  177. //设备配件信息
  178. List<DevicePart> devicePartss = devicePartService.list(new LambdaQueryWrapper<DevicePart>()
  179. .in(DevicePart::getDeviceId, deviceIds)
  180. );
  181. JMap<Long, List<DevicePart>> devicePartsJMaps = new JHashMap<>();
  182. if (Emptys.check(devicePartss)) {
  183. devicePartsJMaps = new JArrayList<>(devicePartss).toMap(DevicePart::getDeviceId).group();
  184. }
  185. JMap<Long, List<DevicePart>> finalDevicePartsJMaps = devicePartsJMaps;
  186. //mqtt连接信息
  187. List<MqttUser> mqttUsers = mqttUserService.list(new LambdaQueryWrapper<MqttUser>()
  188. .in(MqttUser::getDeviceId, deviceIds)
  189. );
  190. JMap<Long, MqttUser> mqttUsersJMaps = new JArrayList<>(mqttUsers).toMap(MqttUser::getDeviceId).cover();
  191. //字典信息
  192. Map<String, SysDictRedis> stringSysDictRedisMap = SysDictUtils.get("merc_device_annual_fee");
  193. //组装请求对象
  194. FunctionUtils.NoParamsResult<Map<Long, JSONObject>> getJsonObjects = () -> {
  195. Map<Long, JSONObject> jsonObjects = new HashMap<>();
  196. for (Long deviceId : deviceIds) {
  197. JSONObject jsonObject = new JSONObject()
  198. .set("deviceId", deviceId);
  199. //设备id创建信息
  200. DeviceCreateIds deviceCreateIds = deviceCreateIdsJMaps.get(deviceId);
  201. JSONObject deviceCreateIdsObj = JSONUtil.parseObj(deviceCreateIds)
  202. .set("bindTime", DataTime.toString(deviceCreateIds.getBindTime()))
  203. .set("createTime", DataTime.toString(deviceCreateIds.getCreateTime()));
  204. if (deviceCreateIds.getLastExportQrCodeTime() != null) {
  205. deviceCreateIdsObj.set("lastExportQrCodeTime", DataTime.toString(deviceCreateIds.getLastExportQrCodeTime()));
  206. }
  207. jsonObject.set("deviceCreateIds", deviceCreateIdsObj);
  208. //设备注册信息
  209. DeviceRegister deviceRegister = deviceRegistersJMaps.get(deviceId);
  210. JSONObject deviceRegisterObj = JSONUtil.parseObj(deviceRegister)
  211. .set("createTime", DataTime.toString(deviceRegister.getCreateTime()));
  212. jsonObject.set("deviceRegister", deviceRegisterObj);
  213. //设备信息
  214. DeviceInfo deviceInfo = deviceInfosJMaps.get(deviceId);
  215. SysDictRedis sysDictRedis = stringSysDictRedisMap.get(String.valueOf(deviceInfo.getMercId()));
  216. JSONObject obj = JSONUtil.parseObj(sysDictRedis.getValue());
  217. deviceInfo.setMercId(obj.getLong("target_merc_id")).setMercCode(obj.getStr("target_merc_code"));
  218. JSONObject deviceInfoObj = JSONUtil.parseObj(deviceInfo)
  219. .set("createTime", DataTime.toString(deviceInfo.getCreateTime()));
  220. if (deviceInfo.getUpdateTime() != null) {
  221. deviceInfoObj.set("updateTime", DataTime.toString(deviceInfo.getUpdateTime()));
  222. }
  223. if (deviceInfo.getActiveTime() != null) {
  224. deviceInfoObj.set("activeTime", DataTime.toString(deviceInfo.getActiveTime()));
  225. }
  226. jsonObject.set("deviceInfo", deviceInfoObj);
  227. //设备系统信息
  228. DeviceSysinfo deviceSysinfo = deviceSysinfosJMaps.get(deviceId);
  229. JSONObject deviceSysinfoObj = JSONUtil.parseObj(deviceSysinfo);
  230. if (deviceSysinfo.getCreateTime() != null) {
  231. deviceSysinfoObj.set("createTime", DataTime.toString(deviceSysinfo.getCreateTime()));
  232. }
  233. jsonObject.set("deviceSysinfo", deviceSysinfoObj);
  234. //设备状态信息
  235. DeviceStatus deviceStatus = deviceStatusesJMaps.get(deviceId);
  236. JSONObject deviceStatusObj = JSONUtil.parseObj(deviceStatus)
  237. .set("netState", 2);
  238. if (deviceStatus.getUpdateTime() != null) {
  239. deviceStatusObj.set("updateTime", DataTime.toString(deviceStatus.getUpdateTime()));
  240. }
  241. if (deviceStatus.getSysStartTime() != null) {
  242. deviceStatusObj.set("sysStartTime", DataTime.toString(deviceStatus.getSysStartTime()));
  243. }
  244. if (deviceStatus.getSysCurTime() != null) {
  245. deviceStatusObj.set("sysCurTime", DataTime.toString(deviceStatus.getSysCurTime()));
  246. }
  247. jsonObject.set("deviceStatus", deviceStatusObj);
  248. //设备配件信息
  249. List<DevicePart> deviceParts = finalDevicePartsJMaps.get(deviceId);
  250. if (Emptys.check(deviceParts)) {
  251. List<JSONObject> devicePartObjs = new ArrayList<>(deviceParts.size());
  252. for (DevicePart devicePart : deviceParts) {
  253. JSONObject devicePartObj = JSONUtil.parseObj(devicePart)
  254. .set("createTime", DataTime.toString(devicePart.getCreateTime()));
  255. if (devicePart.getUpdateTime() != null) {
  256. devicePartObj.set("updateTime", DataTime.toString(devicePart.getUpdateTime()));
  257. }
  258. devicePartObjs.add(devicePartObj);
  259. }
  260. jsonObject.set("deviceParts", devicePartObjs);
  261. }
  262. //mqtt连接信息
  263. MqttUser mqttUser = mqttUsersJMaps.get(deviceId);
  264. JSONObject mqttUserObj = JSONUtil.parseObj(mqttUser)
  265. .set("created", DataTime.toString(mqttUser.getCreated()))
  266. .set("id", null);
  267. jsonObject.set("mqttUser", mqttUserObj);
  268. jsonObjects.put(deviceId, jsonObject);
  269. }
  270. return jsonObjects;
  271. };
  272. //发送请求
  273. FunctionUtils.ParamsNoResult<Map<Long, JSONObject>> sendPost = jsonObjects -> {
  274. LocalDateTime now = LocalDateTime.now();
  275. Map<String, SysDictRedis> map = SysDictUtils.get("mqtt_cmd_templet_task");
  276. String value = map.get("env").getValue();
  277. ThreadPoolUtils.Execute execute = ThreadPoolUtils.excPoll(DeviceThreadPoolConfig.DEVICE_COMMON_POLL, deviceIds.size());
  278. //多线程逐条发送,发送集合担心参数体过大
  279. deviceIds.forEach(deviceId -> execute.execute(() -> {
  280. DeviceAnnualFee deviceAnnualFee = deviceAnnualFeesJMaps.get(deviceId);
  281. if (deviceAnnualFee.getRegisterStatus()) {
  282. return;
  283. }
  284. SysDictRedis sysDictRedis = stringSysDictRedisMap.get(String.valueOf(deviceAnnualFee.getMercId()));
  285. JSONObject obj = JSONUtil.parseObj(sysDictRedis.getValue());
  286. String url = obj.getStr("device_send_url");
  287. JSONObject env = JSONUtil.parseObj(value)
  288. .set("env", obj.getStr("env"));
  289. JSONObject jsonObject = jsonObjects.get(deviceId);
  290. JSONObject result = send(url, jsonObject, "发送设备数据到商家平台");
  291. //修改设备年费注册信息
  292. if (result.getInt("code") == 200) {
  293. deviceAnnualFee.setRegisterStatus(true)
  294. .setRegisterTime(now);
  295. updateById(deviceAnnualFee);
  296. //发送环境切换指令
  297. CommandMqtt commandMqtt = new CommandMqtt()
  298. .setDeviceId(deviceId)
  299. .setTemplet(env);
  300. mqttService.senCommand(Collections.singletonList(commandMqtt));
  301. }
  302. })
  303. .error(e -> log.error("", e))
  304. .end()
  305. );
  306. };
  307. Map<Long, JSONObject> jsonObjects = getJsonObjects.run();
  308. sendPost.run(jsonObjects);
  309. return R.ok();
  310. }
  311. @PostMapping("receiveDeviceInfo")
  312. @ApiOperation("接收兴元设备数据(无token)")
  313. @Transactional(rollbackFor = Exception.class)
  314. public R receiveDeviceInfo(@RequestBody Map<String, Object> map) {
  315. //设备id创建信息
  316. FunctionUtils.NoParamsNoResult deviceCreateIdsFun = () -> {
  317. JSONObject deviceCreateIdsSJson = JSONUtil.parseObj(map.get("deviceCreateIds"));
  318. DeviceCreateIds deviceCreateIds = deviceCreateIdsSJson.toBean(DeviceCreateIds.class);
  319. DeviceCreateIds byId = deviceCreateIdsService.getById(deviceCreateIds.getDeviceId());
  320. if (byId != null) {
  321. return;
  322. }
  323. deviceCreateIdsService.save(deviceCreateIds);
  324. };
  325. //设备注册信息
  326. FunctionUtils.NoParamsNoResult deviceRegisterFun = () -> {
  327. JSONObject deviceRegisterJson = JSONUtil.parseObj(map.get("deviceRegister"));
  328. DeviceRegister deviceRegister = deviceRegisterJson.toBean(DeviceRegister.class);
  329. DeviceRegister byId = deviceRegisterService.getById(deviceRegister.getDeviceId());
  330. if (byId != null) {
  331. return;
  332. }
  333. deviceRegisterService.save(deviceRegister);
  334. };
  335. //设备信息
  336. FunctionUtils.NoParamsNoResult deviceInfoFun = () -> {
  337. JSONObject deviceInfoJson = JSONUtil.parseObj(map.get("deviceInfo"));
  338. DeviceInfo deviceInfo = deviceInfoJson.toBean(DeviceInfo.class);
  339. DeviceInfo byId = deviceInfoService.getById(deviceInfo.getDeviceId());
  340. if (byId != null) {
  341. return;
  342. }
  343. MercDto.Vo merc = mercService.obj(new MercDto.Vo().setId(deviceInfo.getMercId())).getData();
  344. deviceInfo.setMercName(merc.getName());
  345. deviceInfoService.save(deviceInfo);
  346. };
  347. //设备系统信息
  348. FunctionUtils.NoParamsNoResult deviceSysinfoFun = () -> {
  349. JSONObject deviceSysinfoJson = JSONUtil.parseObj(map.get("deviceSysinfo"));
  350. DeviceSysinfo deviceSysinfo = deviceSysinfoJson.toBean(DeviceSysinfo.class);
  351. DeviceSysinfo byId = deviceSysinfoService.getById(deviceSysinfo.getDeviceId());
  352. if (byId != null) {
  353. return;
  354. }
  355. deviceSysinfoService.save(deviceSysinfo);
  356. };
  357. //设备状态信息
  358. FunctionUtils.NoParamsNoResult deviceStatusFun = () -> {
  359. JSONObject deviceStatusJson = JSONUtil.parseObj(map.get("deviceStatus"));
  360. DeviceStatus deviceStatus = deviceStatusJson.toBean(DeviceStatus.class);
  361. DeviceStatus byId = deviceStatusService.getById(deviceStatus.getDeviceId());
  362. if (byId != null) {
  363. return;
  364. }
  365. deviceStatusService.save(deviceStatus);
  366. };
  367. //设备配件信息
  368. FunctionUtils.NoParamsNoResult devicePartsFun = () -> {
  369. JSONArray array = JSONUtil.parseArray(map.get("deviceParts"));
  370. List<DevicePart> deviceParts = new ArrayList<>();
  371. for (Object o : array) {
  372. JSONObject devicePartsJson = JSONUtil.parseObj(o);
  373. DevicePart devicePart = devicePartsJson.toBean(DevicePart.class)
  374. .setId(YitIdHelper.nextId());
  375. DevicePart one = devicePartService.getOne(new LambdaQueryWrapper<DevicePart>()
  376. .eq(DevicePart::getDeviceId, devicePart.getDeviceId())
  377. .eq(DevicePart::getCode, devicePart.getCode())
  378. );
  379. if (one == null) {
  380. deviceParts.add(devicePart);
  381. }
  382. }
  383. if (Emptys.check(deviceParts)) {
  384. devicePartService.saveBatch(deviceParts);
  385. }
  386. };
  387. //mqtt连接信息
  388. FunctionUtils.NoParamsNoResult mqttUserFun = () -> {
  389. JSONObject mqttUserJson = JSONUtil.parseObj(map.get("mqttUser"));
  390. MqttUser mqttUser = mqttUserJson.toBean(MqttUser.class);
  391. MqttUser one = mqttUserService.getOne(new LambdaQueryWrapper<MqttUser>()
  392. .eq(MqttUser::getDeviceId, mqttUser.getDeviceId())
  393. .eq(MqttUser::getSn, mqttUser.getSn())
  394. );
  395. if (one != null) {
  396. return;
  397. }
  398. MqttUserDto.Save mqttUserInfo = Beans.copy(MqttUserDto.Save.class, mqttUser);
  399. mqttUserService.save(mqttUserInfo);
  400. };
  401. long deviceId = Long.parseLong(map.get("deviceId").toString());
  402. return new LockUtils2().name("receiveDeviceInfo_" + deviceId)
  403. .success(() -> {
  404. deviceCreateIdsFun.run();
  405. deviceRegisterFun.run();
  406. deviceInfoFun.run();
  407. deviceSysinfoFun.run();
  408. deviceStatusFun.run();
  409. devicePartsFun.run();
  410. mqttUserFun.run();
  411. return R.ok();
  412. });
  413. }
  414. private JSONObject send(String url, JSONObject params, String msg) {
  415. return send(url, params, msg, 5000);
  416. }
  417. private JSONObject send(String url, JSONObject params, String msg, int timeout) {
  418. try {
  419. String body = params.toString();
  420. log.info("{}请求参数:{}", msg, body);
  421. String result = HttpRequest.post(url)
  422. .body(body)
  423. .timeout(timeout)
  424. .execute()
  425. .body();
  426. log.info("{}响应参数:{}", msg, result);
  427. return JSONUtil.parseObj(result);
  428. } catch (Exception e) {
  429. log.error("", e);
  430. return new JSONObject().set("code", 500);
  431. }
  432. }
  433. @Slf4j
  434. @RequiredArgsConstructor
  435. public static class UploadListener implements ReadListener<UploadInfo> {
  436. private final DeviceAnnualFeeServiceImpl deviceAnnualFeeService;
  437. private JList<UploadInfo> uploadInfos = new JArrayList<>();
  438. /**
  439. * 这个每一条数据解析都会来调用
  440. *
  441. * @param data one row value. Is is same as {@link AnalysisContext#readRowHolder()}
  442. * @param context
  443. */
  444. @Override
  445. public void invoke(UploadInfo data, AnalysisContext context) {
  446. uploadInfos.add(data);
  447. }
  448. /**
  449. * 所有数据解析完成了 都会来调用
  450. *
  451. * @param context
  452. */
  453. @Override
  454. public void doAfterAllAnalysed(AnalysisContext context) {
  455. if (!Emptys.check(uploadInfos)) {
  456. throw new RuntimeException("导入不能为空");
  457. }
  458. List<DeviceAnnualFee> deviceAnnualFees = deviceAnnualFeeService.list(new LambdaQueryWrapper<DeviceAnnualFee>()
  459. .in(DeviceAnnualFee::getDeviceId, uploadInfos.getProperty(UploadInfo::getDeviceId))
  460. .eq(DeviceAnnualFee::getIsThis, true)
  461. );
  462. if (!Emptys.check(deviceAnnualFees)) {
  463. throw new RuntimeException("设备不存在");
  464. }
  465. JMap<Long, DeviceAnnualFee> cover = new JArrayList<>(deviceAnnualFees).toMap(DeviceAnnualFee::getDeviceId).cover();
  466. LocalDateTime now = LocalDateTime.now();
  467. List<DeviceAnnualFee> updates = new ArrayList<>(uploadInfos.size());
  468. for (UploadInfo uploadInfo : uploadInfos) {
  469. DeviceAnnualFee deviceAnnualFee = cover.get(uploadInfo.getDeviceId());
  470. if (deviceAnnualFee == null) {
  471. throw new RuntimeException("设备" + uploadInfo.getDeviceId() + "不存在");
  472. }
  473. deviceAnnualFee.setTimeout(DataTime.toLocal(uploadInfo.getTimeout() + " 23:59:59"));
  474. if (deviceAnnualFee.getFirstTime() == null) {
  475. deviceAnnualFee.setFirstTime(now);
  476. }
  477. updates.add(deviceAnnualFee);
  478. }
  479. deviceAnnualFeeService.updateBatchById(updates);
  480. }
  481. }
  482. @Data
  483. public static class UploadInfo {
  484. @ExcelProperty(value = "设备ID")
  485. private Long deviceId;
  486. @ExcelProperty(value = "到期时间(yyyy-MM-dd)")
  487. private String timeout;
  488. }
  489. }