MercMiniDeviceController.java 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575
  1. package com.xy.controller;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import cn.hutool.core.collection.CollUtil;
  4. import cn.hutool.core.util.BooleanUtil;
  5. import cn.hutool.core.util.ObjectUtil;
  6. import cn.hutool.core.util.StrUtil;
  7. import cn.hutool.json.JSONUtil;
  8. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  9. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  10. import com.github.yitter.idgen.YitIdHelper;
  11. import com.xy.annotate.RestMappingController;
  12. import com.xy.annotation.LogOperate;
  13. import com.xy.collections.list.JArrayList;
  14. import com.xy.collections.map.JMap;
  15. import com.xy.device.EnumDeviceActiveStatus;
  16. import com.xy.device.EnumDeviceFreezeStatus;
  17. import com.xy.dto.*;
  18. import com.xy.dto.be.MercDto;
  19. import com.xy.dto.common.MercPlaceDto;
  20. import com.xy.entity.*;
  21. import com.xy.enums.LogEnum;
  22. import com.xy.enums.MercStatus;
  23. import com.xy.service.*;
  24. import com.xy.service.be.MercFeignService;
  25. import com.xy.service.common.MercLineService;
  26. import com.xy.service.common.MercPlaceService;
  27. import com.xy.service.factory.device.DeviceFactory;
  28. import com.xy.utils.*;
  29. import com.xy.utils.Enum.AlgorithmTypeEnum;
  30. import com.xy.utils.enums.DeviceActiveStateEnum;
  31. import com.xy.utils.enums.DeviceAuthCodeUseStatus;
  32. import com.xy.utils.enums.DeviceLockState;
  33. import com.xy.utils.enums.DeviceNetSateType;
  34. import com.xy.vo.DeviceDetailVO;
  35. import io.swagger.annotations.Api;
  36. import io.swagger.annotations.ApiOperation;
  37. import lombok.AllArgsConstructor;
  38. import lombok.extern.slf4j.Slf4j;
  39. import org.springframework.validation.annotation.Validated;
  40. import org.springframework.web.bind.annotation.PostMapping;
  41. import org.springframework.web.bind.annotation.RequestBody;
  42. import javax.validation.Valid;
  43. import java.time.LocalDateTime;
  44. import java.util.List;
  45. import java.util.Objects;
  46. import java.util.stream.Collectors;
  47. import static com.xy.utils.Beans.copy;
  48. /**
  49. * <p>
  50. * 小程序-设备
  51. * </p>
  52. *
  53. * @author hechunping
  54. * @since 2023/3/4
  55. */
  56. @RestMappingController("merc-mini/device")
  57. @AllArgsConstructor
  58. @Api(tags = "小程序-设备")
  59. @Slf4j
  60. public class MercMiniDeviceController {
  61. /**
  62. * auth-code有效期30分钟,单位:s ,
  63. */
  64. public static final Integer AUTH_CODE_TIMEOUT = 1800;
  65. private final MercFeignService mercFeignService;
  66. private final DeviceInfoServiceImpl deviceInfoService;
  67. private final DeviceSysinfoServiceImpl deviceSysinfoService;
  68. private final MercPlaceService mercPlaceService;
  69. private final MercLineService mercLineService;
  70. private final DeviceBluetoothAuthServiceImpl deviceBluetoothAuthService;
  71. private final DeviceTempRecordsServiceImpl deviceTempRecordsService;
  72. private final AlipayDeviceService alipayDeviceService;
  73. private final DeviceStatusServiceImpl deviceStatusService;
  74. private final DeviceConfigServiceImpl deviceConfigService;
  75. private final DeviceTempSetServiceImpl deviceTempSetService;
  76. public static void setCacheAuthCode(Long deviceId, String code) {
  77. RedisService<String> redisService = SpringBeanUtils.getBean(RedisService.class);
  78. redisService.set("device:auth:code:" + deviceId, code, AUTH_CODE_TIMEOUT);
  79. }
  80. public static String getCacheAuthCode(Long deviceId) {
  81. RedisService<String> redisService = SpringBeanUtils.getBean(RedisService.class);
  82. return redisService.get("device:auth:code:" + deviceId);
  83. }
  84. public static void delCacheAuthCode(Long deviceId) {
  85. RedisService<String> redisService = SpringBeanUtils.getBean(RedisService.class);
  86. redisService.remove("device:auth:code:" + deviceId);
  87. }
  88. @LogOperate(logType = LogEnum.LogType.V2, optType = LogEnum.OptType.V2, logContent = "解绑商户")
  89. @ApiOperation("解绑商户")
  90. @PostMapping("unBindMercDevice")
  91. R<Boolean> unBindMercDevice(@RequestBody @Validated DeviceInfoDto.MercDeviceUnBindDto dto) {
  92. MercAuthUtils.MercAuth.Merc merc = MercAuthUtils.getMercAuth().getMerc();
  93. dto.setMercId(merc.getId());
  94. dto.setMercCode(merc.getMercCode());
  95. dto.setMercName(merc.getName());
  96. List<Long> deviceIds = dto.getDeviceIds();
  97. String log = String.format("解绑商户:被解绑商户:%s,解绑设备:%s", merc.getId() + "," + merc.getName(), CollUtil.isEmpty(deviceIds) ? "" : CollUtil.join(deviceIds, ","));
  98. return R.ok(deviceInfoService.unBindDeviceByMerc(dto)).setLogMsg(log);
  99. }
  100. @LogOperate(logType = LogEnum.LogType.V2, optType = LogEnum.OptType.V2, logContent = "商户设备授权")
  101. @ApiOperation("商户设备授权")
  102. @PostMapping("deviceAuth")
  103. public R mercDeviceAuth(@RequestBody @Validated DeviceInfoDto.MercDeviceAuthDto auth) {
  104. String mercCode = auth.getMercCode();
  105. MercDto.Vo merc = R.feignCheckData(mercFeignService.obj(new MercDto.ListDTO().setMercCode(mercCode)));
  106. // MercAuthUtils.MercAuth.Merc merc = MercAuthUtils.getMercAuth().getMerc();
  107. auth.setMercCode(mercCode);
  108. auth.setMercId(merc.getId());
  109. auth.setParentId(merc.getParentId());
  110. auth.setMercName(merc.getName());
  111. auth.setAlgorithmId(merc.getAlgorithmId());
  112. auth.setMercOperate(true);
  113. // 设备服务授权处理
  114. R<Boolean> r = R.feignCheck(deviceInfoService.mercDeviceAuth(auth));
  115. List<Long> deviceIds = auth.getDeviceIds();
  116. String log = String.format("商户设备授权:授权商户:%s,授权设备:%s", merc.getId() + "," + merc.getName(), deviceIds.size() == 0 ? "取消所有设备授权" : CollUtil.join(deviceIds, ","));
  117. return R.ok(r.getData()).setLogMsg(log);
  118. }
  119. @ApiOperation("设备分页-管理员")
  120. @PostMapping("pageByAdminName")
  121. public R<PageBean<DeviceInfoDto.ListByAdminName>> pageByAdminName(@RequestBody @Validated DeviceInfoDto.PageByAdminNameDto dto) {
  122. dto.setMercId(MercAuthUtils.getMercId());
  123. dto.setDeviceIdList(getMyDevices());
  124. dto.setPage(dto.getPage().setOrders(null));
  125. return deviceInfoService.pageByAdminName(dto);
  126. }
  127. @ApiOperation("设备分页-商户")
  128. @PostMapping("pageByMerc")
  129. public R<PageBean<DeviceInfoDto.Vo>> pageByMerc(@RequestBody @Validated DeviceInfoDto.PageByMercDto dto) {
  130. List<Long> deviceIds = dto.getDeviceIds();
  131. dto.setMercId(MercAuthUtils.getMercId());
  132. Boolean choosed = dto.getChoosed();
  133. if (BooleanUtil.isTrue(choosed)) {
  134. // 查询已选择,为前端传入 deviceIds
  135. dto.setDeviceIds(deviceIds);
  136. }
  137. dto.setMyDeviceIds(getMyDevices());
  138. return R.ok(deviceInfoService.pageByMerc(dto));
  139. }
  140. @ApiOperation("商户设备列表分页-穿梭框用")
  141. @PostMapping("myDeviceList")
  142. public R<PageBean<DeviceInfoDto.MyDeviceInfo>> myDeviceList(@RequestBody @Validated DeviceInfoDto.MyDeviceDTO dto) {
  143. dto.setMercId(MercAuthUtils.getMercId());
  144. return deviceInfoService.myDeviceList(dto);
  145. }
  146. @ApiOperation("设备列表带卡包数")
  147. @PostMapping("algorithmChargingDevice")
  148. public R<PageBean<DeviceInfoDto.AlgorithmChargingVo>> algorithmChargingDevice(@RequestBody @Validated DeviceInfoDto.AlgorithmCharging algorithmCharging) {
  149. algorithmCharging.setMercId(MercAuthUtils.getMercId());
  150. return deviceInfoService.algorithmChargingDevice(algorithmCharging);
  151. }
  152. @ApiOperation("商户设备首页统计")
  153. @PostMapping("mercHomeStatistical")
  154. public R<DeviceInfoDto.MercHomeStatisticalVO> mercHomeStatistical(@RequestBody @Valid DeviceInfoDto.MercHomeQueryDTO dto) {
  155. dto.setMercId(MercAuthUtils.getMercId());
  156. dto.setMyDeviceIds(getMyDevices());
  157. return deviceInfoService.mercHomeStatistical(dto);
  158. }
  159. @ApiOperation("设备列表-Id&Name")
  160. @PostMapping("listOfIdName")
  161. public R listOfIdName() {
  162. DeviceInfoDto.ListCommon listCommonDto = new DeviceInfoDto.ListCommon();
  163. DeviceInfoDto.Vo voDto = new DeviceInfoDto.Vo();
  164. voDto.setActiveState(Integer.valueOf(DeviceActiveStateEnum.TRUE.getCode()))
  165. .setMercId(MercAuthUtils.getMercId());
  166. listCommonDto.setVo(voDto);
  167. List<MercMiniDeviceDto.ListOfIdNameVo> copy = copy(MercMiniDeviceDto.ListOfIdNameVo.class, deviceInfoService.listCommon(listCommonDto).getData());
  168. return R.ok(copy);
  169. }
  170. @PostMapping("searchPage")
  171. @ApiOperation("小程序商户设备搜索")
  172. public R<PageBean<DeviceInfoDto.MerHomeSearchVO>> mercDeviceSearchPage(@RequestBody DeviceInfoDto.Page page) {
  173. page.setMercId(MercAuthUtils.getMercId());
  174. page.setMyDeviceIds(getMyDevices());
  175. return deviceInfoService.mercDeviceSearchPage(page);
  176. }
  177. @PostMapping("simpleDeviceSearchPage")
  178. @ApiOperation("小程序-通用商户设备搜索组件")
  179. public R<PageBean<DeviceInfoDto.SimpleDeviceSearchPageVo>> simpleDeviceSearchPage(@RequestBody DeviceInfoDto.SimpleDeviceSearchPageDto page) {
  180. page.setMercId(MercAuthUtils.getMercId());
  181. page.setMyDeviceIds(getMyDevices());
  182. return deviceInfoService.simpleDeviceSearchPage(page);
  183. }
  184. @ApiOperation("小程序商户设备详情-设备信息")
  185. @PostMapping("detail")
  186. R<DeviceInfoDto.Vo> detail(@RequestBody DeviceInfoDto.Obj obj) {
  187. obj.setMercId(MercAuthUtils.getMercId());
  188. obj.setIsStatus(true);
  189. R<DeviceInfoDto.Vo> r = deviceInfoService.obj(obj);
  190. DeviceInfoDto.Vo vo = r.getData();
  191. if (vo != null) {
  192. Long algorithmId = vo.getAlgorithmId();
  193. // 点位
  194. Long placeId = vo.getPlaceId();
  195. List<MercPlaceDto.Vo> merPlaceList = R.feignCheckData(mercPlaceService.list(new MercPlaceDto.ListDto().setIds(CollUtil.newArrayList(placeId))));
  196. MercPlaceDto.Vo mercPlace = CollUtil.isNotEmpty(merPlaceList) ? merPlaceList.get(0) : null;
  197. if (Emptys.check(mercPlace)) {
  198. vo.setDistrictName(mercPlace.getRegionName());
  199. vo.setPlaceName(mercPlace.getPlaceName());
  200. vo.setPlaceImgs(mercPlace.getImgs());
  201. }
  202. // 返显区域名称
  203. DeviceStatusDto.Vo deviceStatus = vo.getDeviceStatus();
  204. vo.setNetStateName(deviceStatus == null ? StrUtil.EMPTY : DeviceNetSateType.getEnumByCode(deviceStatus.getNetState()).getDescription());
  205. if (deviceStatus != null) {
  206. Integer tempValue = deviceStatus.getTempValue();
  207. if (tempValue == null) {
  208. List<DeviceTempRecords> deviceTempRecords = deviceTempRecordsService
  209. .list(Wrappers.<DeviceTempRecords>lambdaQuery()
  210. .eq(DeviceTempRecords::getDeviceId, vo.getDeviceId()).orderByDesc(DeviceTempRecords::getCreateTime).last("limit 1")
  211. );
  212. if (CollUtil.isNotEmpty(deviceTempRecords)) {
  213. deviceStatus.setTempValue(deviceTempRecords.get(0).getTempValue());
  214. vo.setDeviceStatus(deviceStatus);
  215. } else {
  216. deviceStatus.setTempValue(0);
  217. vo.setDeviceStatus(deviceStatus);
  218. }
  219. }
  220. Integer deviceStateL = deviceStatus.getLockStateL();
  221. Integer deviceStateR = deviceStatus.getLockStateR();
  222. Boolean isUseBattery = deviceStatus.getIsUseBattery();
  223. if (BooleanUtil.isTrue(isUseBattery)) {
  224. // 使用电池。即断电状态
  225. vo.setSysPower(2);
  226. } else {
  227. vo.setSysPower(1);
  228. }
  229. vo.setDeviceStateL(deviceStateL);
  230. vo.setDeviceStateR(deviceStateR);
  231. DeviceLockState deviceLockStateL = DeviceLockState.getEnumByCode(deviceStateL);
  232. DeviceLockState deviceLockStateR = DeviceLockState.getEnumByCode(deviceStateR);
  233. vo.setDeviceStateRName(deviceLockStateR == null ? "未知" : deviceLockStateR.getDescription());
  234. vo.setDeviceStateLName(deviceLockStateL == null ? "未知" : deviceLockStateL.getDescription());
  235. if (AlgorithmTypeEnum.ALIPAY.getId() == algorithmId) {
  236. String deviceId = String.valueOf(vo.getDeviceId());
  237. // 主动查询一次温度、音量 温度:TEMP 音量:VOL
  238. alipayDeviceService.queryAttributes(new DeviceQueryAttr().setTerminalId(deviceId).setType("VOL"));
  239. alipayDeviceService.queryAttributes(new DeviceQueryAttr().setTerminalId(deviceId).setType("TEMP"));
  240. // 支付宝状态实时返回
  241. DeviceDetailVO deviceDetailVO = alipayDeviceService.queryDetail(new DeviceDetailDTO().setTerminalId(String.valueOf(vo.getDeviceId())));
  242. Boolean online = deviceDetailVO.getOnline();
  243. Integer netState = BooleanUtil.isTrue(online) ? DeviceNetSateType.CONNECTED.getCode() : DeviceNetSateType.DISCONNECT.getCode();
  244. if (!ObjectUtil.equals(netState, deviceStatus.getNetState())) {
  245. // 存在差异更新设备状态表
  246. deviceStatusService.updateById(new DeviceStatus().setDeviceId(vo.getDeviceId()).setNetState(netState));
  247. }
  248. deviceStatus.setNetState(netState);
  249. vo.setDeviceStatus(deviceStatus);
  250. }
  251. }
  252. // 工作温度设置
  253. DeviceTempSetDto.Vo lastTempset = R.feignCheckData(deviceTempSetService.getLastOne(new DeviceTempSetDto.GetLastOneDto().setDeviceId(vo.getDeviceId())));
  254. vo.setJobTempSetValue(lastTempset == null ? null : lastTempset.getTempValue());
  255. // 设备配置
  256. DeviceConfigDto.Vo deviceConfig = deviceConfigService.obj(new DeviceConfigDto.Obj().setDeviceId(vo.getDeviceId())).getData();
  257. vo.setDeviceConfig(deviceConfig);
  258. }
  259. DeviceConfig deviceConfig = deviceConfigService.getById(obj.getDeviceId());
  260. vo.setTempSetInfo(BeanUtil.copyProperties(deviceConfig, DeviceInfoDto.TempSetInfo.class));
  261. return R.ok(vo);
  262. }
  263. @ApiOperation("小程序商户设备详情-数据统计")
  264. @PostMapping("dataCount")
  265. R<DeviceInfoDto.DeviceDataCountVO> dataCount(@RequestBody DeviceInfoDto.DeviceDataCountDTO dto) {
  266. dto.setMercId(MercAuthUtils.getMercId());
  267. return deviceInfoService.dataCount(dto);
  268. }
  269. private R checkDeviceByMerc(DeviceInfo deviceInfo) {
  270. Long mercId = MercAuthUtils.getMercId();
  271. // 商户是否已通过审核
  272. MercDto.Vo mercInfo = mercFeignService.obj(new MercDto.ListDTO().setId(mercId)).getData();
  273. if (!mercInfo.getStatus().equals(String.valueOf(MercStatus.APPROVED.getCode()))) {
  274. return R.fail("商户未通过审核");
  275. }
  276. // 设备是否存在
  277. if (!Emptys.check(deviceInfo)) {
  278. return R.fail("机器不存在");
  279. }
  280. // 机器是否已授权给该商户
  281. if (!deviceInfo.getMercId().equals(mercId)) {
  282. return R.fail("机器未授权给商户");
  283. }
  284. // 机器是否冻结
  285. Integer freezeStatus = SysDictUtils.getValue(EnumDeviceFreezeStatus.Code.CODE.getCode(), EnumDeviceFreezeStatus.N_2.getCode(), Integer.class);
  286. if (deviceInfo.getFreezeStatus().equals(freezeStatus)) {
  287. return R.fail("机器已冻结");
  288. }
  289. return R.ok();
  290. }
  291. @PostMapping("isMerc")
  292. @ApiOperation("判断设备是否归属商户")
  293. public R isMerc(@RequestBody MercMiniDeviceDto.Active active) {
  294. DeviceInfo deviceInfo = deviceInfoService.getById(active.getDeviceId());
  295. R checkR = this.checkDeviceByMerc(deviceInfo);
  296. if (checkR.getCode() == R.Enum.SUCCESS.getCode()) {
  297. Integer activeState = SysDictUtils.getValue(EnumDeviceActiveStatus.Code.CODE.getCode(), EnumDeviceActiveStatus.N_1.getCode(), Integer.class);
  298. String refMercCode = deviceInfo.getMercCode();
  299. // 非质检商户需要进行判断,质检商户跳过
  300. if (!"10001".equals(refMercCode) && !deviceInfo.getActiveState().equals(activeState)) {
  301. return R.fail("机器未激活");
  302. }
  303. return R.ok();
  304. }
  305. return checkR;
  306. }
  307. @PostMapping("getActiveInfo")
  308. @ApiOperation("激活设备前判断")
  309. public R getActiveInfo(@RequestBody MercMiniDeviceDto.Active active) {
  310. DeviceInfo deviceInfo = deviceInfoService.getById(active.getDeviceId());
  311. R checkR = this.checkDeviceByMerc(deviceInfo);
  312. if (checkR.getCode() == R.Enum.SUCCESS.getCode()) {
  313. Integer activeState = SysDictUtils.getValue(EnumDeviceActiveStatus.Code.CODE.getCode(), EnumDeviceActiveStatus.N_1.getCode(), Integer.class);
  314. if (deviceInfo.getActiveState().equals(activeState)) {
  315. return R.fail("机器已激活");
  316. }
  317. return R.ok();
  318. }
  319. return checkR;
  320. }
  321. @PostMapping("active")
  322. @ApiOperation("激活设备")
  323. public R active(@RequestBody MercMiniDeviceDto.Active2 active) {
  324. List<Long> deviceIds = active.getDeviceId();
  325. List<DeviceInfo> list = deviceInfoService.list(new LambdaQueryWrapper<DeviceInfo>()
  326. .in(DeviceInfo::getDeviceId, deviceIds)
  327. );
  328. JMap<Integer, DeviceInfo> cover = new JArrayList<>(list).toMap(DeviceInfo::getDeviceType).cover();
  329. if (cover.size() > 1) {
  330. return R.fail("批量激活设备类型必须一致");
  331. }
  332. for (DeviceInfo deviceInfo : list) {
  333. R checkR = this.checkDeviceByMerc(deviceInfo);
  334. if (checkR.getCode() == R.Enum.FAIL.getCode()) {
  335. return checkR;
  336. }
  337. }
  338. return FactoryUtils.getServiceRoute(DeviceFactory.class, list.get(0).getDeviceType()).active(active);
  339. }
  340. @PostMapping("restActive")
  341. @ApiOperation("重置设备激活")
  342. public R restActive(@RequestBody @Validated MercMiniDeviceDto.RestActive restActive) {
  343. DeviceInfoDto.Vo deviceInfo = deviceInfoService.obj(new DeviceInfoDto.Obj().setDeviceId(restActive.getDeviceId()).setIsSysinfo(true)).getData();
  344. DeviceSysinfoDto.Vo deviceSysinfo = deviceInfo.getDeviceSysinfo();
  345. if (deviceSysinfo != null) {
  346. restActive.setNfcSn(deviceSysinfo.getNfcSn());
  347. }
  348. return FactoryUtils.getServiceRoute(DeviceFactory.class, deviceInfo.getDeviceType()).restActive(restActive);
  349. }
  350. @ApiOperation("运营状态修改")
  351. @PostMapping("modifyBusyStage")
  352. public R modifyBusyStage(@RequestBody @Validated MercMiniDeviceDto.BusySate busySate) {
  353. Long mercId = MercAuthUtils.getMercId();
  354. DeviceInfo deviceInfo = deviceInfoService.getById(busySate.getDeviceId());
  355. return FactoryUtils.getServiceRoute(DeviceFactory.class, deviceInfo.getDeviceType()).busyStatus(busySate.setMercId(mercId));
  356. }
  357. @ApiOperation("修改设备信息、上传坐标等")
  358. @PostMapping("updateInfo")
  359. public R updateInfo(@RequestBody @Validated MercMiniDeviceDto.UpdateInfo dto) {
  360. DeviceInfo deviceInfo = deviceInfoService.getById(dto.getDeviceId());
  361. if (!Emptys.check(deviceInfo) || !Objects.equals(deviceInfo.getMercId(), MercAuthUtils.getMercId())) {
  362. return R.fail("设备不存在");
  363. }
  364. DeviceInfoDto.Update update = copy(DeviceInfoDto.Update.class, dto);
  365. deviceInfoService.update(update);
  366. return R.ok();
  367. }
  368. @ApiOperation("当前登录用户拥有的设备")
  369. @PostMapping("myDevices")
  370. R<List<Long>> myDevices() {
  371. return R.ok(getMyDevices());
  372. }
  373. /**
  374. * 获取登录人的设备
  375. *
  376. * @return
  377. */
  378. List<Long> getMyDevices() {
  379. boolean mercAdmin = MercAuthUtils.isMercAdmin();
  380. Long mercId = MercAuthUtils.getMercId();
  381. if (mercAdmin) {
  382. MercAuthUtils.MercAuth.Merc merc = MercAuthUtils.getMercAuth().getMerc();
  383. boolean qaModeMerc = MercAuthUtils.isQaModeMerc(merc.getMercCode());
  384. //非QA需要查激活的设备
  385. List<DeviceInfo> deviceInfos = deviceInfoService.list(Wrappers.<DeviceInfo>lambdaQuery().eq(DeviceInfo::getMercId, mercId).eq(!qaModeMerc, DeviceInfo::getActiveState, DeviceActiveStateEnum.TRUE.getCode()));
  386. if (CollUtil.isEmpty(deviceInfos)) {
  387. return CollUtil.newArrayList();
  388. }
  389. return deviceInfos.stream().map(DeviceInfo::getDeviceId).collect(Collectors.toList());
  390. } else {
  391. // 成员设备
  392. List<Long> deviceIds = R.feignCheckData(mercFeignService.mercUserDevice());
  393. return deviceIds;
  394. }
  395. }
  396. @PostMapping("genCode")
  397. @ApiOperation("蓝牙开门-生成授权码")
  398. public R<Boolean> genCode(@RequestBody @Validated DeviceBluetoothAuthDto.GenCode dto) {
  399. String deviceSn = dto.getDeviceSn();
  400. List<DeviceSysinfo> list = deviceSysinfoService.list(Wrappers.<DeviceSysinfo>lambdaQuery().eq(DeviceSysinfo::getDeviceSn, deviceSn).orderByDesc(DeviceSysinfo::getCreateTime));
  401. if (CollUtil.isEmpty(list)) {
  402. return R.fail("设备不存在!");
  403. }
  404. DeviceSysinfo deviceSysinfo = list.get(0);
  405. Long deviceId = deviceSysinfo.getDeviceId();
  406. // 用户输入的
  407. String authCode = dto.getAuthCode();
  408. List<Long> myDevices = getMyDevices();
  409. if (!myDevices.contains(deviceId)) {
  410. return R.fail("抱歉!您无权对此设备进行授权!");
  411. }
  412. Long mercId = MercAuthUtils.getMercId();
  413. DeviceBluetoothAuth deviceBluetoothAuth = deviceBluetoothAuthService.getOne(Wrappers.<DeviceBluetoothAuth>lambdaQuery()
  414. .eq(DeviceBluetoothAuth::getDeviceId, deviceId)
  415. .eq(DeviceBluetoothAuth::getMercId, mercId)
  416. .eq(DeviceBluetoothAuth::getUseStatus, DeviceAuthCodeUseStatus.UN_USED.getCode())
  417. );
  418. String cacheAuthCode = getCacheAuthCode(deviceId);
  419. if (deviceBluetoothAuth != null) {
  420. if (StrUtil.isNotEmpty(cacheAuthCode)) {
  421. return R.fail("此设备尚有未使用的授权码:【" + cacheAuthCode + "】,请使用后再来生成!");
  422. } else {
  423. // 已失效了
  424. deviceBluetoothAuthService.saveOrUpdate(deviceBluetoothAuth.setUseStatus(DeviceAuthCodeUseStatus.TIME_OUT.getCode()));
  425. }
  426. }
  427. // 缓存
  428. setCacheAuthCode(deviceId, authCode);
  429. DeviceBluetoothAuth saveInfo = new DeviceBluetoothAuth()
  430. .setDeviceId(deviceId)
  431. .setMercId(mercId)
  432. .setDeviceId(deviceId).setAuthCode(authCode);
  433. return R.ok(deviceBluetoothAuthService.save(saveInfo));
  434. }
  435. @PostMapping("genCodeByAdmin")
  436. @ApiOperation("蓝牙开门-平台管理员生成授权码(通用码)")
  437. public R<Long> genCodeByAdmin(@RequestBody @Validated DeviceBluetoothAuthDto.GenCodeByAdmin dto) {
  438. long deviceId = YitIdHelper.nextId();
  439. // 缓存
  440. setCacheAuthCode(deviceId, String.valueOf(deviceId));
  441. DeviceBluetoothAuth saveInfo = new DeviceBluetoothAuth()
  442. .setDeviceId(deviceId)
  443. .setMercId(0L)
  444. .setDeviceId(deviceId).setAuthCode(String.valueOf(deviceId));
  445. deviceBluetoothAuthService.save(saveInfo);
  446. return R.ok(deviceId);
  447. }
  448. @PostMapping("verificationBlueCode")
  449. @ApiOperation("蓝牙开门-校验并使用授权码(平台管理员生成)")
  450. public R<Boolean> verificationBlueCode(@RequestBody @Validated DeviceBluetoothAuthDto.VerificationCodeByAdmin dto) {
  451. String authCode = dto.getAuthCode();
  452. String cacheAuthCode = getCacheAuthCode(Long.valueOf(authCode));
  453. if (!authCode.equals(cacheAuthCode)) {
  454. return R.fail("您输入的授权码有误或者无效!");
  455. }
  456. // 验证通过,缓存去掉授权码,并更新状态
  457. // Long mercId = MercAuthUtils.getMercId();
  458. DeviceBluetoothAuth deviceBluetoothAuth = deviceBluetoothAuthService.getOne(Wrappers.<DeviceBluetoothAuth>lambdaQuery()
  459. .eq(DeviceBluetoothAuth::getDeviceId, Long.valueOf(authCode))
  460. .eq(DeviceBluetoothAuth::getAuthCode, authCode)
  461. .eq(DeviceBluetoothAuth::getUseStatus, DeviceAuthCodeUseStatus.UN_USED.getCode())
  462. );
  463. if (deviceBluetoothAuth == null) {
  464. return R.fail("您输入的授权码无效!");
  465. }
  466. // 缓存去掉授权码
  467. delCacheAuthCode(Long.valueOf(authCode));
  468. deviceBluetoothAuth.setUseStatus(DeviceAuthCodeUseStatus.USED.getCode());
  469. deviceBluetoothAuth.setUseUser(AuthorizeUtils.getLoginId(Long.class));
  470. deviceBluetoothAuth.setUseTime(LocalDateTime.now());
  471. return R.ok(deviceBluetoothAuthService.saveOrUpdate(deviceBluetoothAuth));
  472. }
  473. @PostMapping("verificationCode")
  474. @ApiOperation("蓝牙开门-校验并使用授权码")
  475. public R<Boolean> verificationCode(@RequestBody @Validated DeviceBluetoothAuthDto.VerificationCode dto) {
  476. log.info("蓝牙开门-校验并使用授权码:" + JSONUtil.toJsonPrettyStr(dto));
  477. String deviceSn = dto.getDeviceSn();
  478. List<DeviceSysinfo> list = deviceSysinfoService.list(Wrappers.<DeviceSysinfo>lambdaQuery().eq(DeviceSysinfo::getDeviceSn, deviceSn).orderByDesc(DeviceSysinfo::getCreateTime));
  479. if (CollUtil.isEmpty(list)) {
  480. return R.fail("设备不存在!");
  481. }
  482. DeviceSysinfo deviceSysinfo = list.get(0);
  483. Long deviceId = deviceSysinfo.getDeviceId();
  484. String authCode = dto.getAuthCode();
  485. String cacheAuthCode = getCacheAuthCode(deviceId);
  486. if (!authCode.equals(cacheAuthCode)) {
  487. return R.fail("您输入的授权码有误或者无效!");
  488. }
  489. // 验证通过,缓存去掉授权码,并更新状态
  490. // Long mercId = MercAuthUtils.getMercId();
  491. DeviceBluetoothAuth deviceBluetoothAuth = deviceBluetoothAuthService.getOne(Wrappers.<DeviceBluetoothAuth>lambdaQuery()
  492. .eq(DeviceBluetoothAuth::getDeviceId, deviceId)
  493. .eq(DeviceBluetoothAuth::getAuthCode, authCode)
  494. // .eq(DeviceBluetoothAuth::getMercId, mercId)
  495. .eq(DeviceBluetoothAuth::getUseStatus, DeviceAuthCodeUseStatus.UN_USED.getCode())
  496. );
  497. if (deviceBluetoothAuth == null) {
  498. return R.fail("您输入的授权码无效!");
  499. }
  500. // 缓存去掉授权码
  501. delCacheAuthCode(deviceId);
  502. deviceBluetoothAuth.setUseStatus(DeviceAuthCodeUseStatus.USED.getCode());
  503. deviceBluetoothAuth.setUseUser(AuthorizeUtils.getLoginId(Long.class));
  504. deviceBluetoothAuth.setUseTime(LocalDateTime.now());
  505. return R.ok(deviceBluetoothAuthService.saveOrUpdate(deviceBluetoothAuth));
  506. }
  507. @ApiOperation("支付宝Npad音量设置")
  508. @PostMapping("setAliNpadVol")
  509. public R<Boolean> setAliNpadVol(@RequestBody @Validated DeviceInfoDto.NfcVol nfcVol) {
  510. String deviceId = nfcVol.getDeviceId();
  511. DeviceSetAttr dto = new DeviceSetAttr();
  512. dto.setType("VOL").setTerminalId(deviceId).setValue(nfcVol.getValue());
  513. return R.ok(R.feignCheckData(alipayDeviceService.setAttributes(dto)));
  514. }
  515. @ApiOperation("音量、温度查询")
  516. @PostMapping("queryAliNpadVol")
  517. public R<Boolean> queryAliNpadVol(@RequestBody DeviceInfoDto.NfcVolQuery dto) {
  518. DeviceQueryAttr deviceQueryAttr = new DeviceQueryAttr();
  519. deviceQueryAttr.setTerminalId(dto.getDeviceId());
  520. deviceQueryAttr.setType("VOL");
  521. return R.ok(R.feignCheckData(alipayDeviceService.queryAttributes(deviceQueryAttr)));
  522. }
  523. }