DeviceAnnualFeeServiceImpl.java 28 KB

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