From 308bc8e5c0db7298a127f3478995ddc6167328e9 Mon Sep 17 00:00:00 2001
From: doum <doum>
Date: 星期四, 25 十二月 2025 16:43:27 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/wuhuyancao' into wuhuyancao
---
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/DeviceServiceImpl.java | 353 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 344 insertions(+), 9 deletions(-)
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/DeviceServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/DeviceServiceImpl.java
index 72f6c8f..b72835a 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/DeviceServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/DeviceServiceImpl.java
@@ -11,14 +11,15 @@
import com.doumee.core.haikang.model.param.request.CustomBroadcastRequest;
import com.doumee.core.haikang.model.param.request.TransparentChannelSingleRequest;
import com.doumee.core.haikang.service.HKService;
-import com.doumee.core.utils.HttpsUtil;
+import com.doumee.core.utils.*;
import com.doumee.dao.business.*;
import com.doumee.dao.business.model.*;
+import com.doumee.mqtt.config.MqttConfig;
+import com.doumee.mqtt.service.MqttBizService;
+import com.doumee.service.business.impl.mqtt.MqttClientCache;
import com.doumee.service.business.third.model.LoginUserInfo;
import com.doumee.service.business.third.model.PageData;
import com.doumee.service.business.third.model.PageWrap;
-import com.doumee.core.utils.Constants;
-import com.doumee.core.utils.Utils;
import com.doumee.service.business.DeviceService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -28,11 +29,14 @@
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
+import org.eclipse.paho.client.mqttv3.MqttClient;
+import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.*;
+import java.util.Date;
import java.util.stream.Collectors;
/**
@@ -45,7 +49,11 @@
public class DeviceServiceImpl implements DeviceService {
@Autowired
+ private MqttBizService mqttBizService;
+ @Autowired
private DeviceMapper deviceMapper;
+ @Autowired
+ private DeviceDataMapper deviceDataMapper;
@Autowired
private PlatformMapper platformMapper;
@Autowired
@@ -54,6 +62,8 @@
private SystemDictDataBiz systemDictDataBiz;
@Autowired
private PlatformBroadcastLogMapper platformBroadcastLogMapper;
+ @Autowired
+ private InterfaceLogMapper interfaceLogMapper;
@Override
@@ -63,6 +73,14 @@
model.setIsdeleted(Constants.ZERO);
model.setEditDate(new Date());
model.setCreateDate(model.getEditDate());
+ if(model.getDoorNameObj()!=null && Constants.equalsInteger(model.getType(),Constants.DEVICE_TYPE.duanluqi)){
+ model.setDoorName(JSONObject.toJSONString(model.getDoorNameObj()));
+ if(StringUtils.isNotBlank(model.getLevel())){
+ if(getNumberByStr(model.getLevel()) <300){
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝鎺у埗鏃堕暱蹇呴』澶т簬绛変簬300绉�");
+ }
+ }
+ }
deviceMapper.insert(model);
return model.getId();
}
@@ -97,6 +115,9 @@
public void updateById(Device device) {
device.setEdirot(device.getLoginUserInfo().getId()+"");
device.setEditDate(new Date());
+ if(device.getDoorNameObj()!=null && Constants.equalsInteger(device.getType(),Constants.DEVICE_TYPE.duanluqi)){
+ device.setDoorName(JSONObject.toJSONString(device.getDoorNameObj()));
+ }
deviceMapper.updateById(device);
}
@@ -112,7 +133,16 @@
@Override
public Device findById(Integer id) {
- return deviceMapper.selectById(id);
+ Device d = deviceMapper.selectById(id);
+ if(StringUtils.isNotBlank(d.getDoorName()) &&Constants.equalsInteger(d.getType(),Constants.DEVICE_TYPE.duanluqi)){
+ try {
+ //鏂矾鍣ㄨ澶囧弬鏁�
+ d.setDoorNameObj(JSONObject.parseObject(d.getDoorName()));
+ }catch (Exception e){
+
+ }
+ }
+ return d;
}
@Override
@@ -136,7 +166,20 @@
.eq(null !=param.getIsdeleted(),Device::getIsdeleted,param.getIsdeleted())
.eq(Objects.isNull(param.getIsdeleted()),Device::getIsdeleted,Constants.ZERO)
.eq(null != param.getHkStatus(),Device::getHkStatus,param.getHkStatus());
- return deviceMapper.selectList(wrapper);
+ List<Device> list = deviceMapper.selectList(wrapper);
+ if(list!=null){
+ for(Device d : list){
+ if(StringUtils.isNotBlank(d.getDoorName()) &&Constants.equalsInteger(d.getType(),Constants.DEVICE_TYPE.duanluqi)){
+ try {
+ //鏂矾鍣ㄨ澶囧弬鏁�
+ d.setDoorNameObj(JSONObject.parseObject(d.getDoorName()));
+ }catch (Exception e){
+
+ }
+ }
+ }
+ }
+ return list;
}
@Override
@@ -245,7 +288,20 @@
queryWrapper.orderByAsc(sortData.getProperty());
}
}
- return PageData.from(deviceMapper.selectPage(page, queryWrapper));
+ IPage<Device> result = deviceMapper.selectPage(page, queryWrapper);
+ if(result!=null){
+ for(Device d : result.getRecords()){
+ if(StringUtils.isNotBlank(d.getDoorName()) &&Constants.equalsInteger(d.getType(),Constants.DEVICE_TYPE.duanluqi)){
+ try {
+ //鏂矾鍣ㄨ澶囧弬鏁�
+ d.setDoorNameObj(JSONObject.parseObject(d.getDoorName()));
+ }catch (Exception e){
+
+ }
+ }
+ }
+ }
+ return PageData.from(result);
}
@Override
@@ -270,6 +326,125 @@
throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"鍙戦�佸け璐ワ細"+ JSONObject.toJSONString(response));
}
}
+
+ @Override
+ public void updateUsedById(Device param){
+ Device model = deviceMapper.selectById(param.getId());
+ if(model ==null && Constants.equalsInteger(param.getType(),Constants.DEVICE_TYPE.duanluqi)){
+ throw new BusinessException(ResponseStatus.DATA_EMPTY);
+ }
+
+ MqttConfig config = getMqttConfigByParam(model,"device_");
+ MqttClient mqttClient = MqttClientCache.clientMapCache.get("device"+param.getId());
+ String[] topics =new String[]{Constants.MqttTopic.mts_status,
+ Constants.MqttTopic.mts_attr,
+ Constants.MqttTopic.mts_resp};
+ if(Constants.equalsInteger(param.getIsUsed(),Constants.ONE)){
+ //濡傛灉绯荤粺涓嶇敤浜嗭紝绔彛mqtt杩炴帴
+ try {
+ mqttClient = mqttBizService.unsubscribe(mqttClient,config ,topics);
+ if(mqttClient ==null){
+ throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"寤虹珛杩炴帴澶辫触锛�");
+ }
+ if(mqttClient.isConnected()){
+ mqttClient.disconnect();
+ }
+ }catch (Exception e){
+ log.error("==============绔彛mqtt閾炬帴澶辫触锛�"+model.getName()+e.getMessage());
+ }
+ }else{
+ //濡傛灉寮�濮嬩娇鐢紝寮�濮嬭闃�
+ mqttClient = mqttBizService.subscribe(mqttClient,config ,topics);
+ if(mqttClient ==null){
+ throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"寤虹珛杩炴帴澶辫触锛�");
+ }
+ MqttClientCache.clientMapCache.put("device"+param.getId(),mqttClient);
+ }
+
+ this.updateById(param);
+ }
+ @Override
+ public void duanluqiCmd(Device param){
+ Device model = deviceMapper.selectById(param.getId());
+ if(model ==null && Constants.equalsInteger(param.getType(),Constants.DEVICE_TYPE.duanluqi)){
+ throw new BusinessException(ResponseStatus.DATA_EMPTY);
+ }
+ dealDuanluqiCmd(model,param,"device_");
+
+ }
+
+ private void dealDuanluqiCmd(Device model, Device param,String clientIndex) {
+ MqttConfig config = getMqttConfigByParam(model,clientIndex);
+ MqttClient mqttClient = MqttClientCache.clientMapCache.get("device"+param.getId());
+ String cmdTopic = Constants.MqttTopic.mts_cmd.replace("$CATE",model.getNo()).replace("$DEVID",model.getDoorNo());
+ if(Constants.equalsInteger(param.getStatus(),Constants.ONE)){
+ //濡傛灉鏄紑闂革紝鍏堣В閿�
+ String cmdParamAction = CmdContants.T30A.cmdParam.replace("$DEVID", model.getDoorNo())
+ .replace("$CMD", CmdContants.T30ACmd.do_err_clear)//寮傚父瑙i攣
+ .replace("$BUSADDR",model.getChannelNo());
+ mqttClient = mqttBizService.publish(mqttClient,config,cmdTopic, cmdParamAction);//瑙i攣鍛戒护
+ if(mqttClient ==null){
+ throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"鎸囦护鍙戦�佸け璐ワ紒");
+ }
+ }
+ String cmdParamAction =CmdContants.T30A.cmdParam.replace("$DEVID", model.getDoorNo())
+ .replace("$CMD",(Constants.equalsInteger(param.getStatus(),Constants.ONE)?CmdContants.T30ACmd.do_turn_on:CmdContants.T30ACmd.do_turn_off))
+ .replace("$BUSADDR", param.getChannelNo());
+ mqttClient = mqttBizService.publish(mqttClient,config,cmdTopic, cmdParamAction);//寮�鍏抽椄鍛戒护
+ if(mqttClient ==null){
+ throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"鎸囦护鍙戦�佸け璐ワ紒");
+ }
+ MqttClientCache.clientMapCache.put("device"+param.getId(),mqttClient);
+ String curremak = "銆�"+param.getLoginUserInfo().getRealname()
+ +"銆戜簬"+ DateUtil.getPlusTime2(new Date()) +"杩涜浜�"+(Constants.equalsInteger(param.getStatus(),Constants.ONE)?"銆愬紑闂搞��":"銆愬叧闂搞��")+"鎿嶄綔,寮�鍏炽��"+param.getChannelNo()+"銆戯紱";
+ deviceMapper.update(null,new UpdateWrapper<Device>().lambda()
+// .setSql("remark = concat(ifnull(remark,''),'"+curremak+"','\n')")
+ .set(Device::getRemark,curremak)
+ .set(Device::getEditDate,new Date())
+ .set(Device::getEdirot,param.getLoginUserInfo().getId())
+ .eq(Device::getId,param.getId()));
+ }
+
+ private MqttConfig getMqttConfigByParam(Device model,String index) {
+ MqttConfig config = new MqttConfig();
+ JSONObject mqtt = new JSONObject();
+ if(StringUtils.isBlank(model.getNo())
+ ||StringUtils.isBlank(model.getDoorNo()) ){
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝璁惧鏍囪瘑绗﹀拰璁惧鍙锋湭閰嶇疆锛�");
+ }
+ if(StringUtils.isNotBlank(model.getDoorName())){
+ try {
+ //鏂矾鍣ㄨ澶囧弬鏁�
+ mqtt = (JSONObject.parseObject(model.getDoorName()));
+ }catch (Exception e){
+ }
+ }
+ if(mqtt == null
+ ||StringUtils.isBlank(mqtt.getString("mqttUsername"))
+ ||StringUtils.isBlank(mqtt.getString("mqttIp"))
+ ||StringUtils.isBlank(mqtt.getString("mqttPort"))
+ ||StringUtils.isBlank(mqtt.getString("mqttPassword"))){
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝璁惧mqtt鏈嶅姟鍙傛暟閰嶇疆涓嶆纭紒");
+ }
+ /**
+ * MqttConfig config = (new MqttConfig());
+ * config.setHost("tcp://192.168.0.7:1883");
+ * config.setClientid("doumee1");
+ * config.setPassword("doumee@168");
+ * config.setUsername("doumee");
+ * config.setVersion("003");
+ */
+ config.setVersion("003");
+ config.setUsername( mqtt.getString("mqttUsername"));
+ config.setPassword( mqtt.getString("mqttPassword"));
+ config.setHost("tcp://"+ mqtt.getString("mqttIp")+":"+mqtt.getString("mqttPort"));
+ config.setClientid(index+model.getId());
+ return config;
+ }
+ public void mqttCallbackService(String topic, MqttMessage message){
+ log.error("mqtt鏀跺埌娑堟伅=====topic锛�",topic);
+ log.error("mqtt鏀跺埌娑堟伅=====message锛�",JSONObject.toJSONString(message));
+ }
@Override
public String setBroadcaseBobaoHttp(Device param){
Device model = deviceMapper.selectById(param.getId());
@@ -279,9 +454,9 @@
String input = "";
model.setSendInfo(param.getSendInfo());
- return sendBroadcaseBobaoHttpBiz(model);
+ return sendBroadcaseBobaoHttpBiz(model,interfaceLogMapper);
}
- public static String sendBroadcaseBobaoHttpBiz(Device model){
+ public static String sendBroadcaseBobaoHttpBiz(Device model,InterfaceLogMapper interfaceLogMapper){
//閲嶆柊涓嬪彂璁″垝
JSONObject jsonObject = new JSONObject();
jsonObject.put("command","start");
@@ -298,8 +473,27 @@
log.error("========娴峰悍骞挎挱鎾斁鍏ュ弬鍐呭 : " + params);
String result = HttpsUtil.doPutHk(model.getIp(),Integer.parseInt(StringUtils.defaultString(model.getPort(),"80")),model.getDoorId(), model.getDoorName()
,"/ISAPI/AccessControl/EventCardLinkageCfg/TTSAudio?format=json",params);
-
log.error("========娴峰悍骞挎挱鎾斁杩斿洖鍐呭 : " + result);
+
+ JSONObject resultJson = JSONObject.parseObject(result);
+ Boolean success = false;
+ if(Constants.equalsInteger(resultJson.getInteger("statusCode"),Constants.ONE)){
+ success = true;
+ }
+ InterfaceLog log = new InterfaceLog();
+ log.setCreateDate(new Date());
+ log.setUrl("/ISAPI/AccessControl/EventCardLinkageCfg/TTSAudio?format=json");
+ log.setEditDate(log.getCreateDate());
+ log.setPlat(Constants.ZERO);
+ log.setName("娴峰悍骞挎挱鎾斁");
+ log.setIsdeleted(Constants.ZERO);
+ log.setRequest(params);
+ log.setType(Constants.ZERO);
+ log.setSuccess(success?Constants.ZERO:Constants.ONE);
+ log.setRepose(result);
+ interfaceLogMapper.insert(log);
+
+
return result;
}
@Override
@@ -361,4 +555,145 @@
}
log.error( "灞忓箷鍐呭璁剧疆=======================缁撴潫========" );
}
+
+
+ /**
+ * 鏈嶅姟寮�鍚闃呬换鍔�
+ */
+ @Override
+ public void startCheckDuanluqiSubjob() {
+ List<Device> devices = deviceMapper.selectList(new QueryWrapper<Device>().lambda()
+ .eq(Device::getType,Constants.DEVICE_TYPE.duanluqi)//鏂矾鍣�
+ .eq(Device::getIsUsed,Constants.ZERO)
+ .eq(Device::getIsdeleted,Constants.ZERO)
+ );
+ if(devices!=null && devices.size()>0){
+ for (Device model : devices){
+ try {
+ MqttConfig config = getMqttConfigByParam(model,"device_");
+ MqttClient mqttClient = MqttClientCache.clientMapCache.get("device"+model.getId());
+ String[] topics =new String[]{Constants.MqttTopic.mts_status,
+ Constants.MqttTopic.mts_attr,
+ Constants.MqttTopic.mts_resp};
+ //濡傛灉寮�濮嬩娇鐢紝寮�濮嬭闃�
+ mqttClient = mqttBizService.subscribe(mqttClient,config ,topics);
+ if(mqttClient ==null){
+ throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"寤虹珛杩炴帴澶辫触锛�");
+ }
+ MqttClientCache.clientMapCache.put("device"+model.getId(),mqttClient);
+ log.error("=======寮�濮嬭嚜鍔ㄥ畾浜巑qtt浠诲姟瀹屾垚锛�"+model.getName() );
+ }catch (Exception e){
+ log.error("=======寮�濮嬭嚜鍔ㄥ畾浜巑qtt浠诲姟澶辫触锛�"+model.getName()+e.getMessage());
+ }
+ }
+
+ }
+ }
+ /**
+ * 鏂矾鍣ㄥ垽鏂槸鍚﹂渶瑕佽繙绋嬪垎闂稿畾浜轰换鍔�
+ */
+ @Override
+ public void autoCloseCmdTimer(){
+ if(Constants.DEALING_DUANLUQI_CLOSE){
+ return;
+ }
+ log.error("寮�鍚畾鏃惰繙绋嬫帶鍒舵柇璺櫒寮�濮�=========");
+ Constants.DEALING_DUANLUQI_CLOSE = true;
+ try {
+ List<Device> devices = deviceMapper.selectList(new QueryWrapper<Device>().lambda()
+ .eq(Device::getType,Constants.DEVICE_TYPE.duanluqi)//鏂矾鍣�
+ .isNotNull(Device::getLevel)//閰嶇疆浜嗙┖闂叉椂闀块檺鍒�
+ .isNotNull(Device::getDoorName)//閰嶇疆浜哅QTT鍙傛暟
+ .isNotNull(Device::getChannelInfo)//閰嶇疆浜嗘帶鍒跺紑鍏冲簭鍙�
+ .eq(Device::getIsUsed,Constants.ZERO)
+ .eq(Device::getIsdeleted,Constants.ZERO)
+ );
+ if(devices!=null && devices.size()>0){
+ for(Device device : devices){
+ try {
+ long time = (long)getNumberByStr(device.getLevel());//鎺у埗鏃堕暱
+ if(time < 300 ){
+ log.error("寮�鍚畾鏃惰繙绋嬫帶鍒舵柇璺櫒鍒嗛椄澶辫触=========绌洪棽鏃堕暱鏈纭厤缃�"+time);
+ continue;
+ }
+ double closeDianliu = getCloseDianliuByParam(device);
+ if(closeDianliu < 0 ){
+ log.error("寮�鍚畾鏃惰繙绋嬫帶鍒舵柇璺櫒鍒嗛椄澶辫触=========绌洪棽鐢垫祦闃堝�艰缃敊璇�"+closeDianliu);
+ continue;
+ }
+ List<String> closeBtn = new ArrayList<>();
+ String[] btns = device.getChannelInfo().split(",");
+ Date startDate = new Date((System.currentTimeMillis()-time*1000));//鏌ヨ寮�濮嬫椂闂�
+ List<DeviceData> dataList = deviceDataMapper.selectList(new QueryWrapper<DeviceData>().lambda()
+ .eq(DeviceData::getDeviceId,device.getId())
+ .in(DeviceData::getVal1,btns)
+ .ge(DeviceData::getHappenTime,DateUtil.getPlusTime2(startDate))
+ .orderByDesc(DeviceData::getHappenTime));
+ if(dataList != null && dataList.size()>0 ){
+ for(String b : btns){
+ DeviceData last = getLastDataByVal1(b,dataList,closeDianliu);
+ if(last !=null && StringUtils.equals(last.getVal7(),"1")){
+ closeBtn.add(b);//闇�瑕佸垎闂�
+ }
+ }
+ if(StringUtils.equals( dataList.get(0).getVal7(),"0")){
+ log.error("寮�鍚畾鏃惰繙绋嬫帶鍒舵柇璺櫒鍒嗛椄缁撴潫======鍒嗛椄鐘舵�佹棤闇�鎿嶄綔==="+device.getName());
+ continue;
+ }
+ }
+ if(closeBtn.size()>0){
+ Device param = new Device();
+ param.setLoginUserInfo(new LoginUserInfo());
+ param.getLoginUserInfo().setRealname("绯荤粺鑷姩鎺у埗");
+ param.setChannelNo(String.join(",",closeBtn));
+ param.setId(device.getId());
+ param.setStatus(Constants.ZERO);
+ dealDuanluqiCmd(device,param,"deviceTimer_");
+ }
+ }catch (Exception e){
+ log.error("寮�鍚畾鏃惰繙绋嬫帶鍒舵柇璺櫒鍒嗛椄澶辫触========="+device.getName()+e.getMessage());
+ }
+ }
+ }
+ log.error("寮�鍚畾鏃惰繙绋嬫帶鍒舵柇璺櫒鍒嗛椄鏁伴噺========="+devices.size());
+ }catch (Exception e){
+ log.error("寮�鍚畾鏃惰繙绋嬫帶鍒舵柇璺櫒鍒嗛椄寮傚父========="+e.getMessage());
+ }finally {
+ Constants.DEALING_DUANLUQI_CLOSE = false;
+ }
+ log.error("寮�鍚畾鏃惰繙绋嬫帶鍒舵柇璺櫒鍒嗛椄缁撴潫=========");
+ }
+
+ private double getCloseDianliuByParam(Device device) {
+ try {
+ JSONObject json = JSONObject.parseObject(device.getDoorName() );
+ return json.getDouble("max");
+ }catch (Exception e){
+
+ }
+ return 0;
+ }
+
+ private DeviceData getLastDataByVal1(String b, List<DeviceData> dataList,double limit) {
+ List<DeviceData> list = new ArrayList<>();
+ for(DeviceData d :dataList){
+ if(StringUtils.equals(d.getVal1(),b)){
+ if(limit <= getNumberByStr(d.getVal2())){
+ //濡傛灉鏈夊疄鏃剁數娴佸�煎ぇ浜庣┖闂查槇鍊硷紝鍒欒〃绀哄伐浣滀腑锛屼笉鍋氬鐞�
+ return null;
+ }
+ list.add(d);
+ }
+ }
+ return list.size()>0?list.get(0):null;
+ }
+
+ private double getNumberByStr(String level) {
+ try {
+ return Double.parseDouble(level);
+ }catch (Exception e){
+
+ }
+ return 0;
+ }
}
--
Gitblit v1.9.3