package com.care.bms.service; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.care.common.entity.*; import com.care.common.enums.*; import com.care.common.exception.BDException; import com.care.common.service.*; import com.care.common.util.HttpUtil; import com.care.common.util.MyBeanUtils; import com.care.common.vo.PageReqVO; import com.care.common.vo.UserLogindConvertVO; import com.care.common.vo.device.DeviceVO; import com.care.common.vo.order.OrderContactorVO; import com.care.common.vo.order.OrderOlderVO; import com.care.mqtt.service.MqttConnectorPoolService; import lombok.Synchronized; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.*; /** * @Author: lilt * @Date: 2021/7/14 * @Desc: */ @Service public class DeviceService { @Resource private CareHouseService careHouseService; @Resource private CareStationService careStationService; @Resource private CareDeviceService careDeviceService; @Resource private CareOlderService careOlderService; @Resource private CareHouseContactService careHouseContactService; @Resource private CareHouseOlderRelService careHouseOlderRelService; @Resource private CareHouseContactRelService careHouseContactRelService; @Resource private CareMemberInfoService careMemberInfoService; @Resource private CareSysUserService careSysUserService; @Resource private MqttConnectorPoolService mqttConnectorPoolService; @Resource private CareOrganizationService careOrganizationService; // @Value("${mqtt.topic.work.template:#{null}}") // private String mqttTopicWorkTemplate; // @Value("${mqtt.topic.install.template:#{null}}") // private String mqttTopicInstallTemplate; @Value("${syn.dev.url:#{null}}") private String synDevUrl; /** * 删除设备 * @param id * @return */ public boolean deleteById(Long id){ mqttConnectorPoolService.removeOne(this.careDeviceService.getById(id)); return this.careDeviceService.removeById(id); } public DeviceVO getDevById(Long id){ CareDevice dev = this.careDeviceService.getById(id); if (dev!=null){ DeviceVO vo = new DeviceVO(); BeanUtil.copyProperties(dev,vo); vo.setStatusName(DeviceStatusEnum.getCodeToName(vo.getStatus())); vo.setActiveStatusName(DeviceActiveStatusEnum.getCodeToName(vo.getActiveStatus())); vo.setDevSceneName(DeviceSceneEnum.getCodeToName(vo.getDevScene())); CareSysUser careSysUser = this.careSysUserService.getById(vo.getChambId()); if (careSysUser != null){ vo.setChambPhone(careSysUser.getPhone()); vo.setChambName(careSysUser.getName()); } CareStation station = this.careStationService.getById(vo.getStationId()); if (station!=null){ vo.setStationName(station.getShortName()); } CareHouse house = this.careHouseService.getById(vo.getHouseId()); if (house!=null){ vo.setHouseAddr(house.getAddr()); vo.setHouseNumber(house.getHouseNumber()); vo.setLatitude(house.getLatitude()); vo.setLongitude(house.getLongitude()); } QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(CareHouseOlderRel::getHouseId,dev.getHouseId()); List olderRels = careHouseOlderRelService.list(queryWrapper); if(CollUtil.isNotEmpty(olderRels)) { List orderOlderVOList = new ArrayList<>(); olderRels.forEach(item -> { CareOlder older = this.careOlderService.getById(item.getOlderId()); OrderOlderVO orderOlderVO = new OrderOlderVO(); BeanUtil.copyProperties(older,orderOlderVO); orderOlderVO.setLiveTypeDesc(OlderLiveTypeEnum.getCodeToName(orderOlderVO.getLiveType())); orderOlderVOList.add(orderOlderVO); }); vo.setOrderOlderVOList(orderOlderVOList); } QueryWrapper queryWrapper1 = new QueryWrapper<>(); queryWrapper1.lambda().eq(CareHouseContactRel::getHouseId,dev.getHouseId()); List contactRels = careHouseContactRelService.list(queryWrapper1); if(CollUtil.isNotEmpty(contactRels)) { List orderContactorVOList = new ArrayList<>(); contactRels.forEach(item -> { CareHouseContact contact = this.careHouseContactService.getById(item.getContactId()); OrderContactorVO orderContactorVO = new OrderContactorVO(); BeanUtil.copyProperties(contact,orderContactorVO); orderContactorVO.setRelationTypeDesc(RelationTypeEnum.getCodeToName(orderContactorVO.getRelationType())); orderContactorVOList.add(orderContactorVO); }); vo.setOrderContactorVOList(orderContactorVOList); } return vo; } return null; } /** * 保存设备 //TODO功能暂时不用 * @param vo */ @Transactional(rollbackFor = Exception.class) @Synchronized public void createDevice(DeviceVO vo,UserLogindConvertVO loginUser){ //生成登陆账号 if (StrUtil.isEmpty(vo.getDevCode())){ throw new BDException("设备编号不能为空"); }else { QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.lambda().eq(CareDevice::getDevCode,vo.getDevCode()); if (this.careDeviceService.count(queryWrapper)>0){ throw new BDException("设备编号已经存在!"); } } //保存设备 CareDevice device = new CareDevice(); BeanUtil.copyProperties(vo,device); //设备上线 device.setStatus(DeviceStatusEnum.ONLINE.getValue()); device.setCreateTime(new Date()); device.setOrgId(loginUser.getOrgId()); // String topic = mqttTopicWorkTemplate.replace("XXXXX",device.getDevCode()); // device.setTopic(topic); // // String topicInstall = mqttTopicInstallTemplate.replace("XXXXX",device.getDevCode()); // device.setTopicInstall(topicInstall); device.setClientId(UUID.randomUUID().toString()); device.setClientIdInstall(UUID.randomUUID().toString()); this.careDeviceService.save(device); //保存完后,启动通道 mqttConnectorPoolService.addOne(device); } /** * 修改设备 * @param vo */ @Transactional(rollbackFor = Exception.class) public void updateDevice(DeviceVO vo) { //保存设备 CareDevice device = this.careDeviceService.getById(vo.getId()); if (DeviceActiveStatusEnum.ACTIVE.getValue().equals(device.getActiveStatus())) { //设备离线 device.setStatus(DeviceStatusEnum.OFFLINE.getValue()); mqttConnectorPoolService.removeOne(device); } MyBeanUtils.copyProperties(vo, device); //处理house if (device.getHouseId() == null) { //新增 CareHouse careHouse = new CareHouse(); careHouse.setAddr(vo.getHouseAddr()); careHouse.setHouseNumber(vo.getHouseNumber()); if(StringUtils.isNotEmpty(vo.getHouseNumber())){ careHouse.setName(vo.getHouseAddr() + vo.getHouseNumber()); } else { careHouse.setName(vo.getHouseAddr()); } careHouse.setLatitude(vo.getLatitude()); careHouse.setLongitude(vo.getLongitude()); careHouse.setCreateTime(new Date()); careHouse.setOrgId(device.getOrgId()); careHouse.setStationId(device.getStationId()); this.careHouseService.save(careHouse); device.setHouseId(careHouse.getId()); } else { //修改 CareHouse careHouse = this.careHouseService.getById(device.getHouseId()); careHouse.setAddr(vo.getHouseAddr()); careHouse.setHouseNumber(vo.getHouseNumber()); if(StringUtils.isNotEmpty(vo.getHouseNumber())){ careHouse.setName(vo.getHouseAddr() + vo.getHouseNumber()); } else { careHouse.setName(vo.getHouseAddr()); } careHouse.setLatitude(vo.getLatitude()); careHouse.setLongitude(vo.getLongitude()); careHouse.setModifyTime(new Date()); this.careHouseService.updateById(careHouse); } //关联用户 //用手机号查找care_member_info表,有的话就关联上,没有的话只保留手机号在设备表 QueryWrapper queryWrapper0 = new QueryWrapper<>(); queryWrapper0.lambda().eq(CareMemberInfo::getPhone,vo.getMemberPhone()); CareMemberInfo careMemberInfo = this.careMemberInfoService.getOne(queryWrapper0); if (careMemberInfo != null) { //关联, device.setMemberId(careMemberInfo.getId()); } else { //todo 置空,null 不生效,暂时置为0 device.setMemberId(0L); } //mqtt // if(StringUtils.isEmpty(device.getTopic())){ // String topic = mqttTopicWorkTemplate.replace("XXXXX",device.getDevCode()); // device.setTopic(topic); // } // if(StringUtils.isEmpty(device.getTopicInstall())){ // String topicInstall = mqttTopicInstallTemplate.replace("XXXXX",device.getDevCode()); // device.setTopicInstall(topicInstall); // } if(StringUtils.isEmpty(device.getClientId())){ device.setClientId(UUID.randomUUID().toString()); } if(StringUtils.isEmpty(device.getClientIdInstall())){ device.setClientIdInstall(UUID.randomUUID().toString()); } device.setModifyTime(new Date()); this.careDeviceService.updateById(device); //被监护人 List orderOlderVOList = vo.getOrderOlderVOList(); List orderOlderVOIdList = new ArrayList<>(); if(CollUtil.isNotEmpty(orderOlderVOList)){ orderOlderVOList.forEach(item -> { CareOlder careOlder = new CareOlder(); BeanUtil.copyProperties(item, careOlder); if(careOlder.getId() != null) {//修改 careOlder.setModifyTime(new Date()); careOlderService.updateById(careOlder); } else { //新增 careOlder.setOrgId(device.getOrgId()); careOlder.setStationId(device.getStationId()); careOlder.setCreateTime(new Date()); careOlderService.save(careOlder); CareHouseOlderRel careHouseOlderRel = new CareHouseOlderRel(); careHouseOlderRel.setHouseId(device.getHouseId()); careHouseOlderRel.setOlderId(careOlder.getId()); careHouseOlderRelService.save(careHouseOlderRel); } orderOlderVOIdList.add(careOlder.getId()); }); } //联系人 List orderContactorVOList = vo.getOrderContactorVOList(); List orderContactorVOIdList = new ArrayList<>(); if(CollUtil.isNotEmpty(orderContactorVOList)){ orderContactorVOList.forEach(item -> { CareHouseContact careHouseContact = new CareHouseContact(); BeanUtil.copyProperties(item, careHouseContact); if(careHouseContact.getId() != null) {//修改 careHouseContact.setModifyTime(new Date()); careHouseContactService.updateById(careHouseContact); } else { //新增 careHouseContact.setOrgId(device.getOrgId()); careHouseContact.setStationId(device.getStationId()); careHouseContact.setCreateTime(new Date()); careHouseContactService.save(careHouseContact); CareHouseContactRel careHouseContactRel = new CareHouseContactRel(); careHouseContactRel.setHouseId(device.getHouseId()); careHouseContactRel.setContactId(careHouseContact.getId()); careHouseContactRelService.save(careHouseContactRel); } orderContactorVOIdList.add(careHouseContact.getId()); }); } //处理删除部分 QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(CareHouseOlderRel::getHouseId,device.getHouseId()); //查询出来数据库里已经有的 List olderRelsDb = careHouseOlderRelService.list(queryWrapper); if(CollUtil.isNotEmpty(olderRelsDb)){ List olderIdDels = new ArrayList<>(); List olderReIdDels = new ArrayList<>(); olderRelsDb.forEach(item -> { if(!orderOlderVOIdList.contains(item.getOlderId())){ olderReIdDels.add(item.getId()); olderIdDels.add(item.getOlderId()); } }); if(CollUtil.isNotEmpty(olderIdDels)){ this.careHouseOlderRelService.removeByIds(olderReIdDels); this.careOlderService.removeByIds(olderIdDels); } } //处理删除部分 //查询出来数据库里已经有的 QueryWrapper queryWrapper2 = new QueryWrapper<>(); queryWrapper2.lambda().eq(CareHouseContactRel::getHouseId,device.getHouseId()); List contactRels = careHouseContactRelService.list(queryWrapper2); if(CollUtil.isNotEmpty(contactRels)){ List contactIdDels = new ArrayList<>(); List contactReIdDels = new ArrayList<>(); contactRels.forEach(item -> { if(!orderContactorVOIdList.contains(item.getContactId())){ contactReIdDels.add(item.getId()); contactIdDels.add(item.getContactId()); } }); if(CollUtil.isNotEmpty(contactIdDels)){ this.careHouseContactRelService.removeByIds(contactReIdDels); this.careHouseContactService.removeByIds(contactIdDels); } } if(DeviceActiveStatusEnum.ACTIVE.getValue().equals(device.getActiveStatus())) { //设备上线 device.setStatus(DeviceStatusEnum.ONLINE.getValue()); //保存完后,启动通道 mqttConnectorPoolService.addOne(device); } } /** * 列表查询 * @param loginUser * @param pageReqVo * @return */ public IPage listDevice(Long stationId, String devCode, String activeStatus, String chambName,String status,String houseAddr,Long chambId,Long memberId,Long orgId,UserLogindConvertVO loginUser, PageReqVO pageReqVo) { return this.careDeviceService.queryList(pageReqVo,stationId,devCode,activeStatus,chambName,status,houseAddr,chambId,memberId,orgId,loginUser); } /** * 列表查询没有站点的 * @param loginUser * @param pageReqVo * @return */ public IPage listDeviceNonStation(UserLogindConvertVO loginUser, PageReqVO pageReqVo) { return this.careDeviceService.listDeviceNonStation(pageReqVo,loginUser); } /** * 同步设备 */ public boolean synDev(String companyId) { try { if (StringUtils.isEmpty(companyId)){ return false; } QueryWrapper queryWrapper1 = new QueryWrapper<>(); queryWrapper1.lambda().eq(CareOrganization::getCompanyId,companyId); CareOrganization careOrganization = this.careOrganizationService.getOne(queryWrapper1); if (careOrganization == null){ return false; } // 通过synDevUrl获取data JSONObject jsonObject = HttpUtil.httpGet(synDevUrl + "?companyId=" + companyId); int code = jsonObject.getInt("code"); if (code == 1) { JSONArray data = jsonObject.getJSONArray("data"); Iterator it = data.iterator(); List list = new ArrayList<>(); while (it.hasNext()) { JSONObject obj = (JSONObject) it.next(); if(careOrganization != null) { CareDevice careDevice = new CareDevice(); careDevice.setDevCode(obj.getStr("mdid")); careDevice.setOrgId(careOrganization.getId()); careDevice.setTopic("/companyId/" + careDevice.getDevCode() + "/event"); careDevice.setTopicInstall("/companyId/" + careDevice.getDevCode() + "/control"); list.add(careDevice); } else { continue; } } if (!list.isEmpty()) { careDeviceService.synDev(list); return true; } else { return false; } } else { return false; } } catch (Exception e) { e.printStackTrace(); return false; } } }