DeviceController.java 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. package com.tmzn.devicelinkykc.controller;
  2. import cn.hutool.http.HttpRequest;
  3. import cn.hutool.http.server.HttpServerRequest;
  4. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  5. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  6. import com.tmzn.devicelinkykc.constant.Constant;
  7. import com.tmzn.devicelinkykc.constant.DeviceOnlineStatus;
  8. import com.tmzn.devicelinkykc.constant.PortStatusConstant;
  9. import com.tmzn.devicelinkykc.constant.RedisConstant;
  10. import com.tmzn.devicelinkykc.constant.ykc.StatusConstant;
  11. import com.tmzn.devicelinkykc.entity.*;
  12. import com.tmzn.devicelinkykc.entity.param.AjaxResult;
  13. import com.tmzn.devicelinkykc.entity.param.vo.TransOrderVO;
  14. import com.tmzn.devicelinkykc.mapstruct.DeviceMapping;
  15. import com.tmzn.devicelinkykc.mapstruct.TransMapping;
  16. import com.tmzn.devicelinkykc.redis.RedisCache;
  17. import com.tmzn.devicelinkykc.service.*;
  18. import com.tmzn.devicelinkykc.socket.SocketHandle;
  19. import com.tmzn.devicelinkykc.transdata.entity.DeviceParam;
  20. import org.slf4j.Logger;
  21. import org.slf4j.LoggerFactory;
  22. import org.springframework.beans.factory.annotation.Autowired;
  23. import org.springframework.stereotype.Controller;
  24. import org.springframework.web.bind.annotation.*;
  25. import java.util.HashSet;
  26. import java.util.List;
  27. import java.util.Set;
  28. import java.util.concurrent.TimeUnit;
  29. import java.util.stream.Collectors;
  30. /**
  31. * @author xp
  32. * @date 2024/4/10
  33. * @explain " 开放接口 "
  34. */
  35. @RestController
  36. @CrossOrigin(origins = "*")
  37. @RequestMapping("api/device")
  38. public class DeviceController {
  39. private static final Logger logger = LoggerFactory.getLogger(DeviceController.class);
  40. @Autowired
  41. private DeviceService deviceService;
  42. @Autowired
  43. private DeviceStatusService deviceStatusService;
  44. @Autowired
  45. private DeviceMapping deviceMapping;
  46. @Autowired
  47. private TransMapping transMapping;
  48. @Autowired
  49. private BillingModelService billingModelService;
  50. @Autowired
  51. private SocketHandle socketHandle;
  52. @Autowired
  53. private TransOrderService transOrderService;
  54. @Autowired
  55. private RedisCache redisCachel;
  56. @Autowired
  57. private DeviceControlerService deviceControlerService;
  58. /* *//**
  59. * 接收到充电桩后台提交的云快充连接设备进行保存
  60. *
  61. * @param
  62. * @return
  63. *//*
  64. @PostMapping
  65. public AjaxResult addAndUpdate(@RequestBody DeviceDTO deviceDTO) {
  66. String deviceSn = deviceDTO.getDeviceSn();
  67. String deviceImei = deviceDTO.getDeviceImei();
  68. String pileCode = deviceDTO.getPileCode();
  69. QueryWrapper<Device> deviceQueryWrapper = new QueryWrapper<>();
  70. deviceQueryWrapper.eq("device_sn", deviceSn).eq("device_imei", deviceImei).eq("pile_code", pileCode);
  71. Device device = deviceService.getOne(deviceQueryWrapper);
  72. if (device == null) {
  73. Device add = deviceMapping.deviceDTOTOdevice(deviceDTO);
  74. boolean save = deviceService.save(add);
  75. if (save) {
  76. return AjaxResult.success("设备连接云快充信息保存成功!");
  77. } else {
  78. return AjaxResult.error("设备连接云快充信息保存异常!");
  79. }
  80. } else {
  81. //更新操作分情况;TODO:设备双枪,枪禁用情况?
  82. QueryWrapper<DeviceStatus> deviceStatusQueryWrapper = new QueryWrapper<>();
  83. deviceStatusQueryWrapper.eq("device_sn", deviceSn).eq("device_imei", deviceImei).eq("pile_code", pileCode);
  84. List<DeviceStatus> deviceStatusList = deviceStatusService.list(deviceStatusQueryWrapper);
  85. if (device.getDisabled() == deviceDTO.getDisabled()) {
  86. //禁用状态没变化,更新设备信息
  87. deviceService.updateById(device);
  88. return AjaxResult.success();
  89. } else {
  90. if (device.getDisabled() == DeviceOnlineStatus.DISABLED) {
  91. //1.禁用变正常状态
  92. device.setDisabled(DeviceOnlineStatus.NORMAL);
  93. deviceService.updateById(device);
  94. return AjaxResult.success();
  95. } else {
  96. //2.设备是正常状态,更新成禁用状态,设备禁用后设备离线:一.校验设备是充电中不能操作,二.deviceStatus需要删除,不保留设备的状态信息
  97. List<DeviceStatus> collect = deviceStatusList.stream().filter(deviceStatus ->
  98. deviceStatus.getGunStatus() == StatusConstant.CHARGING
  99. ).collect(Collectors.toList());
  100. if (collect.size() > 0) {
  101. //设备有正在充电的端口
  102. return AjaxResult.error("设备有正在充电端口,不能设置禁用状态!");
  103. } else {
  104. //断开socket
  105. if (socketHandle.existDeviceConnection(pileCode)) {
  106. socketHandle.removeDeviceConnection(pileCode);
  107. }
  108. deviceStatusService.removeBatchByIds(deviceStatusList);
  109. device.setDisabled(DeviceOnlineStatus.DISABLED);
  110. deviceService.updateById(device);
  111. QueryWrapper<BillingModel> billingModelQueryWrapper = new QueryWrapper<>();
  112. billingModelQueryWrapper.eq("device_imei", deviceImei).eq("device_sn", deviceSn).eq("pile_code", pileCode);
  113. billingModelService.remove(billingModelQueryWrapper);
  114. return AjaxResult.success();
  115. }
  116. }
  117. }
  118. }
  119. }
  120. */
  121. @DeleteMapping("/{pileCode}")
  122. public AjaxResult delete( @PathVariable("pileCode") String pileCode) {
  123. AjaxResult ajaxResult = deviceService.deleteDevice(pileCode);
  124. return ajaxResult;
  125. }
  126. @GetMapping("order")
  127. public AjaxResult getOrder(TransOrderVO transOrderVO) {
  128. Page<TransOrder> transOrderPage = transOrderService.selectAndPage(transOrderVO);
  129. return AjaxResult.success(transOrderPage);
  130. }
  131. @PostMapping("/openLink/{imei}")
  132. public AjaxResult openLink(@PathVariable("imei")String imei) {
  133. Set<String> imeis = new HashSet<>();
  134. if (redisCachel.hasKey(RedisConstant.DEVICE_INFO)) {
  135. imeis = redisCachel.getCacheObject(RedisConstant.DEVICE_INFO);
  136. }
  137. //启用通知
  138. imeis.add(imei);
  139. //redisCachel.setCacheObject(RedisConstant.DEVICE_INFO, imeis, 6 * 1000 * 60, TimeUnit.MILLISECONDS);
  140. redisCachel.setCacheObject(RedisConstant.DEVICE_INFO,imeis);
  141. //imei保存后发个获取103,让新增设备立马上线
  142. DeviceParam deviceParam = new DeviceParam();
  143. deviceParam.setDeviceId(imei);
  144. deviceParam.setCcid(imei);
  145. deviceControlerService.sendPortDetailCmd(deviceParam);
  146. return AjaxResult.success();
  147. }
  148. @PostMapping("/handoff")
  149. public AjaxResult handoff(@RequestBody List<Device> deviceList) {
  150. //ip和端口的修改,必须从新登录
  151. if (deviceList.size()>0){
  152. for (Device device : deviceList) {
  153. QueryWrapper<DeviceStatus> deviceStatusQueryWrapper = new QueryWrapper<>();
  154. deviceStatusQueryWrapper.eq("gun_status",StatusConstant.CHARGING).eq("device_imei",device.getDeviceImei());
  155. List<DeviceStatus> list = deviceStatusService.list(deviceStatusQueryWrapper);
  156. if (list.size()>0){
  157. return AjaxResult.error("有充电中设备IP和端口无法修改!");
  158. }
  159. }
  160. deviceList.stream().forEach(device -> {
  161. //修改
  162. String key = redisCachel.getCacheMapValue(RedisConstant.YKC_KEY_MAP,device.getPileCode());
  163. if(key!=null){
  164. if (socketHandle.existDeviceConnection(device.getPileCode())){
  165. socketHandle.removeDeviceConnection(device.getPileCode());
  166. }
  167. redisCachel.deleteCacheMapValue(RedisConstant.YKC_KEY_MAP,device.getPileCode());
  168. }
  169. Device byId = deviceService.getById(device.getId());
  170. byId.setIp(device.getIp());
  171. byId.setPort(device.getPort());
  172. deviceService.updateById(byId);
  173. logger.info(device.toString());
  174. DeviceParam deviceParam = new DeviceParam();
  175. deviceParam.setDeviceId(byId.getDeviceImei());
  176. deviceParam.setCcid(byId.getDeviceImei());
  177. deviceControlerService.sendPortDetailCmd(deviceParam);
  178. });
  179. }
  180. return AjaxResult.success();
  181. }
  182. /**
  183. * 主动断开与运营商平台的TCPsocket连接,触发重新登录
  184. * @param pileCode
  185. * @return
  186. */
  187. @PostMapping("/restLogin/{pileCode}")
  188. public AjaxResult restLogin(@PathVariable("pileCode")String pileCode,HttpServerRequest request) {
  189. System.out.printf("111");
  190. socketHandle.removeDeviceConnection(pileCode);
  191. return AjaxResult.success("断开连接!!!!!!");
  192. }
  193. }