DeviceAnnualFeeServiceImpl.java 27 KB

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