DeviceService.java 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  1. package com.care.bms.service;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import cn.hutool.core.collection.CollUtil;
  4. import cn.hutool.core.util.StrUtil;
  5. import cn.hutool.json.JSONArray;
  6. import cn.hutool.json.JSONObject;
  7. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  8. import com.baomidou.mybatisplus.core.metadata.IPage;
  9. import com.care.common.entity.*;
  10. import com.care.common.enums.*;
  11. import com.care.common.exception.BDException;
  12. import com.care.common.service.*;
  13. import com.care.common.util.HttpUtil;
  14. import com.care.common.util.MyBeanUtils;
  15. import com.care.common.vo.PageReqVO;
  16. import com.care.common.vo.UserLogindConvertVO;
  17. import com.care.common.vo.device.DeviceVO;
  18. import com.care.common.vo.order.OrderContactorVO;
  19. import com.care.common.vo.order.OrderOlderVO;
  20. import com.care.mqtt.service.MqttConnectorPoolService;
  21. import lombok.Synchronized;
  22. import org.apache.commons.lang3.StringUtils;
  23. import org.springframework.beans.factory.annotation.Value;
  24. import org.springframework.stereotype.Service;
  25. import org.springframework.transaction.annotation.Transactional;
  26. import javax.annotation.Resource;
  27. import java.util.*;
  28. /**
  29. * @Author: lilt
  30. * @Date: 2021/7/14
  31. * @Desc:
  32. */
  33. @Service
  34. public class DeviceService {
  35. @Resource
  36. private CareHouseService careHouseService;
  37. @Resource
  38. private CareStationService careStationService;
  39. @Resource
  40. private CareDeviceService careDeviceService;
  41. @Resource
  42. private CareOlderService careOlderService;
  43. @Resource
  44. private CareHouseContactService careHouseContactService;
  45. @Resource
  46. private CareHouseOlderRelService careHouseOlderRelService;
  47. @Resource
  48. private CareHouseContactRelService careHouseContactRelService;
  49. @Resource
  50. private CareMemberInfoService careMemberInfoService;
  51. @Resource
  52. private CareSysUserService careSysUserService;
  53. @Resource
  54. private MqttConnectorPoolService mqttConnectorPoolService;
  55. @Resource
  56. private CareOrganizationService careOrganizationService;
  57. // @Value("${mqtt.topic.work.template:#{null}}")
  58. // private String mqttTopicWorkTemplate;
  59. // @Value("${mqtt.topic.install.template:#{null}}")
  60. // private String mqttTopicInstallTemplate;
  61. @Value("${syn.dev.url:#{null}}")
  62. private String synDevUrl;
  63. /**
  64. * 删除设备
  65. * @param id
  66. * @return
  67. */
  68. public boolean deleteById(Long id){
  69. mqttConnectorPoolService.removeOne(this.careDeviceService.getById(id));
  70. return this.careDeviceService.removeById(id);
  71. }
  72. public DeviceVO getDevById(Long id){
  73. CareDevice dev = this.careDeviceService.getById(id);
  74. if (dev!=null){
  75. DeviceVO vo = new DeviceVO();
  76. BeanUtil.copyProperties(dev,vo);
  77. vo.setStatusName(DeviceStatusEnum.getCodeToName(vo.getStatus()));
  78. vo.setActiveStatusName(DeviceActiveStatusEnum.getCodeToName(vo.getActiveStatus()));
  79. vo.setDevSceneName(DeviceSceneEnum.getCodeToName(vo.getDevScene()));
  80. CareSysUser careSysUser = this.careSysUserService.getById(vo.getChambId());
  81. if (careSysUser != null){
  82. vo.setChambPhone(careSysUser.getPhone());
  83. vo.setChambName(careSysUser.getName());
  84. }
  85. CareStation station = this.careStationService.getById(vo.getStationId());
  86. if (station!=null){
  87. vo.setStationName(station.getShortName());
  88. }
  89. CareHouse house = this.careHouseService.getById(vo.getHouseId());
  90. if (house!=null){
  91. vo.setHouseAddr(house.getAddr());
  92. vo.setHouseNumber(house.getHouseNumber());
  93. vo.setLatitude(house.getLatitude());
  94. vo.setLongitude(house.getLongitude());
  95. }
  96. QueryWrapper<CareHouseOlderRel> queryWrapper = new QueryWrapper<>();
  97. queryWrapper.lambda().eq(CareHouseOlderRel::getHouseId,dev.getHouseId());
  98. List<CareHouseOlderRel> olderRels = careHouseOlderRelService.list(queryWrapper);
  99. if(CollUtil.isNotEmpty(olderRels)) {
  100. List<OrderOlderVO> orderOlderVOList = new ArrayList<>();
  101. olderRels.forEach(item -> {
  102. CareOlder older = this.careOlderService.getById(item.getOlderId());
  103. OrderOlderVO orderOlderVO = new OrderOlderVO();
  104. BeanUtil.copyProperties(older,orderOlderVO);
  105. orderOlderVO.setLiveTypeDesc(OlderLiveTypeEnum.getCodeToName(orderOlderVO.getLiveType()));
  106. orderOlderVOList.add(orderOlderVO);
  107. });
  108. vo.setOrderOlderVOList(orderOlderVOList);
  109. }
  110. QueryWrapper<CareHouseContactRel> queryWrapper1 = new QueryWrapper<>();
  111. queryWrapper1.lambda().eq(CareHouseContactRel::getHouseId,dev.getHouseId());
  112. List<CareHouseContactRel> contactRels = careHouseContactRelService.list(queryWrapper1);
  113. if(CollUtil.isNotEmpty(contactRels)) {
  114. List<OrderContactorVO> orderContactorVOList = new ArrayList<>();
  115. contactRels.forEach(item -> {
  116. CareHouseContact contact = this.careHouseContactService.getById(item.getContactId());
  117. OrderContactorVO orderContactorVO = new OrderContactorVO();
  118. BeanUtil.copyProperties(contact,orderContactorVO);
  119. orderContactorVO.setRelationTypeDesc(RelationTypeEnum.getCodeToName(orderContactorVO.getRelationType()));
  120. orderContactorVOList.add(orderContactorVO);
  121. });
  122. vo.setOrderContactorVOList(orderContactorVOList);
  123. }
  124. return vo;
  125. }
  126. return null;
  127. }
  128. /**
  129. * 保存设备 //TODO功能暂时不用
  130. * @param vo
  131. */
  132. @Transactional(rollbackFor = Exception.class)
  133. @Synchronized
  134. public void createDevice(DeviceVO vo,UserLogindConvertVO loginUser){
  135. //生成登陆账号
  136. if (StrUtil.isEmpty(vo.getDevCode())){
  137. throw new BDException("设备编号不能为空");
  138. }else {
  139. QueryWrapper<CareDevice> queryWrapper = new QueryWrapper();
  140. queryWrapper.lambda().eq(CareDevice::getDevCode,vo.getDevCode());
  141. if (this.careDeviceService.count(queryWrapper)>0){
  142. throw new BDException("设备编号已经存在!");
  143. }
  144. }
  145. //保存设备
  146. CareDevice device = new CareDevice();
  147. BeanUtil.copyProperties(vo,device);
  148. //设备上线
  149. device.setStatus(DeviceStatusEnum.ONLINE.getValue());
  150. device.setCreateTime(new Date());
  151. device.setOrgId(loginUser.getOrgId());
  152. // String topic = mqttTopicWorkTemplate.replace("XXXXX",device.getDevCode());
  153. // device.setTopic(topic);
  154. //
  155. // String topicInstall = mqttTopicInstallTemplate.replace("XXXXX",device.getDevCode());
  156. // device.setTopicInstall(topicInstall);
  157. device.setClientId(UUID.randomUUID().toString());
  158. device.setClientIdInstall(UUID.randomUUID().toString());
  159. this.careDeviceService.save(device);
  160. //保存完后,启动通道
  161. mqttConnectorPoolService.addOne(device);
  162. }
  163. /**
  164. * 修改设备
  165. * @param vo
  166. */
  167. @Transactional(rollbackFor = Exception.class)
  168. public void updateDevice(DeviceVO vo) {
  169. //保存设备
  170. CareDevice device = this.careDeviceService.getById(vo.getId());
  171. if (DeviceActiveStatusEnum.ACTIVE.getValue().equals(device.getActiveStatus())) {
  172. //设备离线
  173. device.setStatus(DeviceStatusEnum.OFFLINE.getValue());
  174. mqttConnectorPoolService.removeOne(device);
  175. }
  176. MyBeanUtils.copyProperties(vo, device);
  177. //处理house
  178. if (device.getHouseId() == null) { //新增
  179. CareHouse careHouse = new CareHouse();
  180. careHouse.setAddr(vo.getHouseAddr());
  181. careHouse.setHouseNumber(vo.getHouseNumber());
  182. if(StringUtils.isNotEmpty(vo.getHouseNumber())){
  183. careHouse.setName(vo.getHouseAddr() + vo.getHouseNumber());
  184. } else {
  185. careHouse.setName(vo.getHouseAddr());
  186. }
  187. careHouse.setLatitude(vo.getLatitude());
  188. careHouse.setLongitude(vo.getLongitude());
  189. careHouse.setCreateTime(new Date());
  190. careHouse.setOrgId(device.getOrgId());
  191. careHouse.setStationId(device.getStationId());
  192. this.careHouseService.save(careHouse);
  193. device.setHouseId(careHouse.getId());
  194. } else { //修改
  195. CareHouse careHouse = this.careHouseService.getById(device.getHouseId());
  196. careHouse.setAddr(vo.getHouseAddr());
  197. careHouse.setHouseNumber(vo.getHouseNumber());
  198. if(StringUtils.isNotEmpty(vo.getHouseNumber())){
  199. careHouse.setName(vo.getHouseAddr() + vo.getHouseNumber());
  200. } else {
  201. careHouse.setName(vo.getHouseAddr());
  202. }
  203. careHouse.setLatitude(vo.getLatitude());
  204. careHouse.setLongitude(vo.getLongitude());
  205. careHouse.setModifyTime(new Date());
  206. this.careHouseService.updateById(careHouse);
  207. }
  208. //关联用户
  209. //用手机号查找care_member_info表,有的话就关联上,没有的话只保留手机号在设备表
  210. QueryWrapper<CareMemberInfo> queryWrapper0 = new QueryWrapper<>();
  211. queryWrapper0.lambda().eq(CareMemberInfo::getPhone,vo.getMemberPhone());
  212. CareMemberInfo careMemberInfo = this.careMemberInfoService.getOne(queryWrapper0);
  213. if (careMemberInfo != null) { //关联,
  214. device.setMemberId(careMemberInfo.getId());
  215. } else { //todo 置空,null 不生效,暂时置为0
  216. device.setMemberId(0L);
  217. }
  218. //mqtt
  219. // if(StringUtils.isEmpty(device.getTopic())){
  220. // String topic = mqttTopicWorkTemplate.replace("XXXXX",device.getDevCode());
  221. // device.setTopic(topic);
  222. // }
  223. // if(StringUtils.isEmpty(device.getTopicInstall())){
  224. // String topicInstall = mqttTopicInstallTemplate.replace("XXXXX",device.getDevCode());
  225. // device.setTopicInstall(topicInstall);
  226. // }
  227. if(StringUtils.isEmpty(device.getClientId())){
  228. device.setClientId(UUID.randomUUID().toString());
  229. }
  230. if(StringUtils.isEmpty(device.getClientIdInstall())){
  231. device.setClientIdInstall(UUID.randomUUID().toString());
  232. }
  233. device.setModifyTime(new Date());
  234. this.careDeviceService.updateById(device);
  235. //被监护人
  236. List<OrderOlderVO> orderOlderVOList = vo.getOrderOlderVOList();
  237. List<Long> orderOlderVOIdList = new ArrayList<>();
  238. if(CollUtil.isNotEmpty(orderOlderVOList)){
  239. orderOlderVOList.forEach(item -> {
  240. CareOlder careOlder = new CareOlder();
  241. BeanUtil.copyProperties(item, careOlder);
  242. if(careOlder.getId() != null) {//修改
  243. careOlder.setModifyTime(new Date());
  244. careOlderService.updateById(careOlder);
  245. } else { //新增
  246. careOlder.setOrgId(device.getOrgId());
  247. careOlder.setStationId(device.getStationId());
  248. careOlder.setCreateTime(new Date());
  249. careOlderService.save(careOlder);
  250. CareHouseOlderRel careHouseOlderRel = new CareHouseOlderRel();
  251. careHouseOlderRel.setHouseId(device.getHouseId());
  252. careHouseOlderRel.setOlderId(careOlder.getId());
  253. careHouseOlderRelService.save(careHouseOlderRel);
  254. }
  255. orderOlderVOIdList.add(careOlder.getId());
  256. });
  257. }
  258. //联系人
  259. List<OrderContactorVO> orderContactorVOList = vo.getOrderContactorVOList();
  260. List<Long> orderContactorVOIdList = new ArrayList<>();
  261. if(CollUtil.isNotEmpty(orderContactorVOList)){
  262. orderContactorVOList.forEach(item -> {
  263. CareHouseContact careHouseContact = new CareHouseContact();
  264. BeanUtil.copyProperties(item, careHouseContact);
  265. if(careHouseContact.getId() != null) {//修改
  266. careHouseContact.setModifyTime(new Date());
  267. careHouseContactService.updateById(careHouseContact);
  268. } else { //新增
  269. careHouseContact.setOrgId(device.getOrgId());
  270. careHouseContact.setStationId(device.getStationId());
  271. careHouseContact.setCreateTime(new Date());
  272. careHouseContactService.save(careHouseContact);
  273. CareHouseContactRel careHouseContactRel = new CareHouseContactRel();
  274. careHouseContactRel.setHouseId(device.getHouseId());
  275. careHouseContactRel.setContactId(careHouseContact.getId());
  276. careHouseContactRelService.save(careHouseContactRel);
  277. }
  278. orderContactorVOIdList.add(careHouseContact.getId());
  279. });
  280. }
  281. //处理删除部分
  282. QueryWrapper<CareHouseOlderRel> queryWrapper = new QueryWrapper<>();
  283. queryWrapper.lambda().eq(CareHouseOlderRel::getHouseId,device.getHouseId());
  284. //查询出来数据库里已经有的
  285. List<CareHouseOlderRel> olderRelsDb = careHouseOlderRelService.list(queryWrapper);
  286. if(CollUtil.isNotEmpty(olderRelsDb)){
  287. List<Long> olderIdDels = new ArrayList<>();
  288. List<Long> olderReIdDels = new ArrayList<>();
  289. olderRelsDb.forEach(item -> {
  290. if(!orderOlderVOIdList.contains(item.getOlderId())){
  291. olderReIdDels.add(item.getId());
  292. olderIdDels.add(item.getOlderId());
  293. }
  294. });
  295. if(CollUtil.isNotEmpty(olderIdDels)){
  296. this.careHouseOlderRelService.removeByIds(olderReIdDels);
  297. this.careOlderService.removeByIds(olderIdDels);
  298. }
  299. }
  300. //处理删除部分
  301. //查询出来数据库里已经有的
  302. QueryWrapper<CareHouseContactRel> queryWrapper2 = new QueryWrapper<>();
  303. queryWrapper2.lambda().eq(CareHouseContactRel::getHouseId,device.getHouseId());
  304. List<CareHouseContactRel> contactRels = careHouseContactRelService.list(queryWrapper2);
  305. if(CollUtil.isNotEmpty(contactRels)){
  306. List<Long> contactIdDels = new ArrayList<>();
  307. List<Long> contactReIdDels = new ArrayList<>();
  308. contactRels.forEach(item -> {
  309. if(!orderContactorVOIdList.contains(item.getContactId())){
  310. contactReIdDels.add(item.getId());
  311. contactIdDels.add(item.getContactId());
  312. }
  313. });
  314. if(CollUtil.isNotEmpty(contactIdDels)){
  315. this.careHouseContactRelService.removeByIds(contactReIdDels);
  316. this.careHouseContactService.removeByIds(contactIdDels);
  317. }
  318. }
  319. if(DeviceActiveStatusEnum.ACTIVE.getValue().equals(device.getActiveStatus())) {
  320. //设备上线
  321. device.setStatus(DeviceStatusEnum.ONLINE.getValue());
  322. //保存完后,启动通道
  323. mqttConnectorPoolService.addOne(device);
  324. }
  325. }
  326. /**
  327. * 列表查询
  328. * @param loginUser
  329. * @param pageReqVo
  330. * @return
  331. */
  332. public IPage<DeviceVO> listDevice(Long stationId, String devCode, String activeStatus, String chambName,String status,String houseAddr,Long chambId,Long memberId,Long orgId,UserLogindConvertVO loginUser, PageReqVO pageReqVo) {
  333. return this.careDeviceService.queryList(pageReqVo,stationId,devCode,activeStatus,chambName,status,houseAddr,chambId,memberId,orgId,loginUser);
  334. }
  335. /**
  336. * 列表查询没有站点的
  337. * @param loginUser
  338. * @param pageReqVo
  339. * @return
  340. */
  341. public IPage<DeviceVO> listDeviceNonStation(UserLogindConvertVO loginUser, PageReqVO pageReqVo) {
  342. return this.careDeviceService.listDeviceNonStation(pageReqVo,loginUser);
  343. }
  344. /**
  345. * 同步设备
  346. */
  347. public boolean synDev(String companyId) {
  348. try {
  349. if (StringUtils.isEmpty(companyId)){
  350. return false;
  351. }
  352. QueryWrapper<CareOrganization> queryWrapper1 = new QueryWrapper<>();
  353. queryWrapper1.lambda().eq(CareOrganization::getCompanyId,companyId);
  354. CareOrganization careOrganization = this.careOrganizationService.getOne(queryWrapper1);
  355. if (careOrganization == null){
  356. return false;
  357. }
  358. // 通过synDevUrl获取data
  359. JSONObject jsonObject = HttpUtil.httpGet(synDevUrl + "?companyId=" + companyId);
  360. int code = jsonObject.getInt("code");
  361. if (code == 1) {
  362. JSONArray data = jsonObject.getJSONArray("data");
  363. Iterator it = data.iterator();
  364. List<CareDevice> list = new ArrayList<>();
  365. while (it.hasNext()) {
  366. JSONObject obj = (JSONObject) it.next();
  367. if(careOrganization != null) {
  368. CareDevice careDevice = new CareDevice();
  369. careDevice.setDevCode(obj.getStr("mdid"));
  370. careDevice.setOrgId(careOrganization.getId());
  371. careDevice.setTopic("/companyId/" + careDevice.getDevCode() + "/event");
  372. careDevice.setTopicInstall("/companyId/" + careDevice.getDevCode() + "/control");
  373. list.add(careDevice);
  374. } else {
  375. continue;
  376. }
  377. }
  378. if (!list.isEmpty()) {
  379. careDeviceService.synDev(list);
  380. return true;
  381. } else {
  382. return false;
  383. }
  384. } else {
  385. return false;
  386. }
  387. } catch (Exception e) {
  388. e.printStackTrace();
  389. return false;
  390. }
  391. }
  392. }