doum
11 小时以前 f67e78a754fb8d7364d35aaafb0295690a4cc810
最新版本541200007
已添加1个文件
已修改7个文件
394 ■■■■■ 文件已修改
admin/src/components/business/OperaDeviceBroadcastWindow.vue 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/deviceBroadcast.vue 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/core/utils/HttpsUtil.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/HkSyncCloudController.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/resources/bootstrap.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/ISAPIBroadcastAddPlanSchemeRequest.java 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/DeviceService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/DeviceServiceImpl.java 134 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaDeviceBroadcastWindow.vue
@@ -15,6 +15,18 @@
          <el-form-item label="设备序列号" prop="no">
            <el-input v-model="form.no" placeholder="请输入序列号" v-trim/>
          </el-form-item>
          <el-form-item label="连接IP" prop="ip">
            <el-input v-model="form.ip" placeholder="请输入设备连接IP地址" v-trim/>
          </el-form-item>
          <el-form-item label="连接端口" prop="port">
            <el-input v-model="form.port" placeholder="请输入连接端口" v-trim/>
          </el-form-item>
          <el-form-item label="连接账号" prop="doorId">
            <el-input v-model="form.doorId" placeholder="请输入设备连接账号" v-trim/>
          </el-form-item>
          <el-form-item label="连接密码" prop="doorName">
            <el-input v-model="form.doorName" type="password"  maxlength="30" show-password></el-input>
          </el-form-item>
          <el-form-item label="所在位置" prop="regionPathName">
            <el-input v-model="form.regionPathName" placeholder="请输入所在位置" v-trim/>
          </el-form-item>
@@ -38,13 +50,29 @@
        name: '',
        regionPathName: '',
        no: '',
        type: 4
        type: 4,
        ip: '',
        port: '',
        doorId: '',
        doorName:''
      },
      // éªŒè¯è§„则
      rules: {
        name: [
          { required: true, message: '请输入设备名称' }
        ],
        ip: [
          { required: true, message: '请输入设备连接IP地址' }
        ],
        port: [
          { required: true, message: '请输入设备连接端口号' }
        ],
        doorId: [
          { required: true, message: '请输入设备连接账号' }
        ],
        doorName: [
          { required: true, message: '请输入设备连接密码' }
        ],
        hkId: [
          { required: true, message: '请输入设备唯一码' }
        ]
admin/src/views/business/deviceBroadcast.vue
@@ -25,18 +25,30 @@
            >
              <el-table-column type="selection" width="55"></el-table-column>
              <el-table-column label="序号"  width="55" fixed><template slot-scope="scope" >{{scope.$index+1}}</template></el-table-column>
                <el-table-column prop="name" label="名称"></el-table-column>
                <el-table-column prop="hkId" label="唯一标识"  ></el-table-column>
                <el-table-column prop="no" label="序列号"  ></el-table-column>
                <el-table-column prop="regionPathName" label="所在位置"></el-table-column>
                <el-table-column prop="editDate" label="最近更新时间"></el-table-column>
                <el-table-column
                    v-if="containPermissions(['business:devicerole:update', 'business:devicerole:delete'])"
                    label="操作"
                    align="center"
                    min-width="120"
                    fixed="right"
                >
              <el-table-column prop="name" label="名称"></el-table-column>
              <el-table-column prop="hkId" label="唯一标识"  ></el-table-column>
              <el-table-column prop="regionPathName" label="所在位置"></el-table-column>
              <el-table-column prop="no" label="序列号"  ></el-table-column>
              <el-table-column prop="ip" label="IP地址"  ></el-table-column>
              <el-table-column prop="port" label="端口"  ></el-table-column>
              <el-table-column prop="doorId" label="账号"></el-table-column>
              <el-table-column prop="doorName" label="密码" align="center">
                <template slot-scope="{row}">
                  <span :class=" 'blue'">{{row.showPwd?row.doorName:'******'}}</span>
                  <el-button  style="margin-left: 10px" v-if="row.doorName!=null"
                              @click.native.p.prevent="showPassward(row)" type="text">
                   <i class="el-icon-view" :class="row.showPwd?'red':'blue'" :title="row.showPwd?'隐藏':'显示'"></i>
                  </el-button>
                </template>
              </el-table-column>
              <el-table-column prop="editDate" label="最近更新时间"></el-table-column>
              <el-table-column
                  v-if="containPermissions(['business:devicerole:update', 'business:devicerole:delete'])"
                  label="操作"
                  align="center"
                  min-width="120"
                  fixed="right"
              >
                  <template slot-scope="{row}">
                    <el-button type="text" @click="$refs.operaDeviceWindow.open('编辑广播', row)" icon="el-icon-edit" v-permissions="['business:device:update']">编辑</el-button>
                    <el-button type="text" @click="send(row)" icon="el-icon-edit"  v-permissions="['business:device:update']">发送播报</el-button>
@@ -79,6 +91,7 @@
import TableLayout from '@/layouts/TableLayout'
import Pagination from '@/components/common/Pagination'
import OperaDeviceBroadcastWindow from '@/components/business/OperaDeviceBroadcastWindow'
import { syncDevices } from '@/api/business/device'
export default {
  name: 'Device',
  extends: BaseTable,
@@ -114,11 +127,18 @@
    this.search()
  },
  methods: {
    showPassward (row) {
      if (!row.showPwd) {
        this.$set(row, 'showPwd', true)
      } else {
        this.$set(row, 'showPwd', false)
      }
    },
    sendBobao () {
      if(!this.form.sendInfo){
      if (!this.form.sendInfo) {
        return
      }
      this.$dialog.actionConfirm('确认进行广播播报吗?','操作确认提醒')
      this.$dialog.actionConfirm('确认进行广播播报吗?', '操作确认提醒')
        .then(() => {
          this.isWorkSending = true
          this.api.sendBobao(this.form)
@@ -143,17 +163,17 @@
      this.isWorkSending = false
      this.form = { sendInfo: '', id: '', hkId: '', name: '' }
    },
     synchronousData () {
    synchronousData () {
      this.$dialog.actionConfirm('操作确认提醒', '您确认同步全部信息吗?')
        .then(() => {
          this.isWorking.delete = true
          syncDevices({type: 4})
          syncDevices({ type: 4 })
            .then(res => {
              this.$tip.apiSuccess(res || '同步成功')
              this.search()
            })
            .catch(e => {
             //  this.$tip.apiFailed(e)
              //  this.$tip.apiFailed(e)
            })
            .finally(() => {
              this.isWorking.delete = false
server/system_service/src/main/java/com/doumee/core/utils/HttpsUtil.java
@@ -1,17 +1,35 @@
package com.doumee.core.utils;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpEntity;
import org.apache.http.ParseException;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.springframework.http.HttpMethod;
import javax.net.ssl.*;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URI;
import java.net.URL;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
@Slf4j
public class HttpsUtil {
    public static String get(String url,boolean ignoreSSL) {
@@ -28,6 +46,65 @@
            return connectionHttp(url, "POST", data, "application/json");
        }
    }
    private static final int CONNECT_TIMEOUT =10000;// è®¾ç½®è¿žæŽ¥å»ºç«‹çš„超时时间为10s
    private static final int SOCKET_TIMEOUT = 10000;//socket读写超时时间(单位毫秒)
    private static void setRequestConfig(HttpRequestBase httpRequestBase) {
        RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(CONNECT_TIMEOUT)
                .setConnectTimeout(CONNECT_TIMEOUT).setSocketTimeout(SOCKET_TIMEOUT).build();
        httpRequestBase.setConfig(requestConfig);
    }
    public static String doPostHk(String host,int port,String UserName,String Password,String url, String Input) {
        try {
            CloseableHttpResponse responseBody = null;
            HttpPost httpPost = new HttpPost("http://"+host+":"+port+url);
            setRequestConfig(httpPost);
            httpPost.setEntity(new StringEntity(Input, "UTF-8"));
            CredentialsProvider credsProvider = new BasicCredentialsProvider();
            credsProvider.setCredentials(new AuthScope(host, port),
                    new UsernamePasswordCredentials(UserName, Password));
            CloseableHttpClient httpClient = HttpClients.custom().setDefaultCredentialsProvider(credsProvider).build();
            String response = "";
            // ç”±å®¢æˆ·ç«¯æ‰§è¡Œ(发送)Post请求
            responseBody = httpClient.execute(httpPost);
            // ä»Žå“åº”模型中获取响应实体
            HttpEntity responseEntity = responseBody.getEntity();
            log.error("doPostHk响应状态为:" + responseBody.getStatusLine());
            if (responseBody.getStatusLine().getStatusCode() == 302){
                String redirectLocation = responseBody.getHeaders("Location")[0].getValue();
                log.error("doPostHkRedirected to: " + redirectLocation);
                // åœ¨è¿™é‡Œï¼Œä½ å¯ä»¥å‘送一个新的请求到redirectLocation
                httpPost.setURI(URI.create(redirectLocation));
                CloseableHttpResponse responseBody2 = httpClient.execute(httpPost);
                log.error("doPostHk重定向后响应状态为:" + responseBody2.getStatusLine());
                HttpEntity responseEntity2 = responseBody2.getEntity();
                log.error("doPostHk重定向后响应内容长度为:" + responseEntity2.getContentLength());
                response = EntityUtils.toString(responseEntity2);
                log.error("doPostHk重定向后响应内容为:\n" + response);
                responseBody2.close();
                return response;
            }else {
                if (responseEntity != null) {
                    log.error("doPostHk响应内容长度为:" + responseEntity.getContentLength());
                    response = EntityUtils.toString(responseEntity);
                    log.error("doPostHk响应内容为:\n" + response);
                    return response;
                }
            }
            if (httpClient != null) {
                httpClient.close();
            }
            if (responseBody != null) {
                responseBody.close();
            }
        } catch (Exception e) {
            log.error("doPostHk发起请求异常:\n" + e.getMessage());
        }
        return null;
    }
    public static String connection(String url,String method,String data,String contentType,boolean ignoreSSL){
        HttpsURLConnection connection = null;
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/HkSyncCloudController.java
@@ -356,7 +356,12 @@
    }
    @ApiOperation("【海康】广播播报")
    @PostMapping("/sendBobao")
    public ApiResponse<List<Map<String,Object>>> setBroadcaseBobao(@RequestBody Device body  , HttpServletResponse response) {
    public ApiResponse<String> setBroadcaseBobao(@RequestBody Device body  , HttpServletResponse response) {
        return ApiResponse.success( deviceService.setBroadcaseBobaoHttp(body));
    }
    @ApiOperation("【海康】广播播报")
    @PostMapping("/sendBobaoOpenapi")
    public ApiResponse<List<Map<String,Object>>> sendBobaoOpenapi(@RequestBody Device body  , HttpServletResponse response) {
        deviceService.setBroadcaseBobao(body);
        return ApiResponse.success(null);
    }
server/visits/dmvisit_admin/src/main/resources/bootstrap.yml
@@ -1,6 +1,6 @@
spring:
  profiles:
    active: pro
    active: dev
  application:
    name: visitsAdmin
    # å®‰å…¨é…ç½®
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/ISAPIBroadcastAddPlanSchemeRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,87 @@
package com.doumee.core.haikang.model.param.request;
import lombok.Data;
import java.util.List;
@Data
public class ISAPIBroadcastAddPlanSchemeRequest {
    /**
    {
        "terminalInfoList": [
        {
            "terminalID": 1,
                "audioOutID": [
            2
            ],
            "audioOutIndexList": [
            1
            ]
        }
    ],
        "broadcastPlanSchemeList": [
        {
            "planSchemeID": "plan1",
                "enabled": true,
                "sourceID": "fdb4465d7aa5495884845127a8bbbe3c",
                "weklyScheduleInfo": {
            "startTime": "1970-01-01",
                    "stopTime": "1970-01-01",
                    "weeklyScheduleList": [
            {
                "dayOfWeek": 1,
                    "scheduleList": [
                {
                    "planSchemeExecID": 0,
                        "beginTime": "00:00:00",
                        "endTime": "00:00:00",
                        "playNowTime": "00:00:00",
                        "operation": {
                    "audioSource": "customAudio",
                            "customAudioID": [
                    2
                                    ],
                    "URLIDs": [
                    1
                                    ],
                    "speechSynthesisContent": "test",
                            "audioLevel": 0,
                            "TTSLanguageType": "english",
                            "voiceType": "male",
                            "audioVolume": 1
                }
                }
                        ]
            }
                ]
        },
            "dailyScheduleInfo": {
            "startTime": "1970-01-01",
                    "stopTime": "1970-01-01",
                    "dailyScheduleList": [
            {
                "beginTime": "00:00:00",
                    "endTime": "00:00:00",
                    "playNowTime": "00:00:00",
                    "operation": {
                "audioSource": "customAudio",
                        "customAudioID": [
                2
                            ],
                "URLIDs": [
                1
                            ],
                "speechSynthesisContent": "test",
                        "audioLevel": 0,
                        "TTSLanguageType": "english",
                        "audioVolume": 1
            }
            }
                ]
        }
        }
    ]
    }
    */
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/DeviceService.java
@@ -108,4 +108,5 @@
    void allLedDefualtContent();
    void setBroadcaseBobao(Device body);
    String setBroadcaseBobaoHttp(Device body);
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/DeviceServiceImpl.java
@@ -1,5 +1,6 @@
package com.doumee.service.business.impl;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.doumee.biz.system.SystemDictDataBiz;
@@ -10,6 +11,7 @@
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.dao.business.*;
import com.doumee.dao.business.model.*;
import com.doumee.service.business.third.model.LoginUserInfo;
@@ -268,6 +270,138 @@
        }
    }
    @Override
    public String setBroadcaseBobaoHttp(Device param){
       /* Device model = deviceMapper.selectById(param.getId());
        if(model ==null && Constants.equalsInteger(param.getType(),Constants.FOUR)){
            throw  new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        String input = "";
        JSONObject objext = new JSONObject();
        //重新下发计划
        JSONObject jsonObject = new JSONObject();
        //第一层
        JSONArray firstJsonArray = new JSONArray();
        JSONObject downJson = new JSONObject();
        downJson.put("terminalID",1);
        //不填默认对所有通道下发
        JSONArray audioJsonArray = new JSONArray();
        audioJsonArray.add(1);
        downJson.put("audioOutID",audioJsonArray);
        firstJsonArray.add(downJson);
        jsonObject.put("TerminalInfoList",firstJsonArray);
        //第一层数组
        JSONArray allJsonArray = new JSONArray();
        //数组中对象
        for (WaterTimingBroadcastDO waterTimingBroadcastDO : searchList) {
            JSONObject downArrayData = new JSONObject();
            downArrayData.put("audioOutID",audioJsonArray);
            downArrayData.put("enabled",true);
            downArrayData.put("planSchemeID",waterTimingBroadcastDO.getName());
            JSONObject executeJson = new JSONObject();
            executeJson.put("startTime", getDateStringByZones(waterTimingBroadcastDO.getStartDate()));
            executeJson.put("stopTime",getDateStringByZones(waterTimingBroadcastDO.getEndDate()));
            if (Constant.ONE.equals(waterTimingBroadcastDO.getPeriodType())){
                //日计划
                JSONArray executeJsonArray = new JSONArray();
                JSONObject executeJsonDataItem = new JSONObject();
                executeJsonDataItem.put("beginTime",waterTimingBroadcastDO.getStartTime()+"+08:00");
                executeJsonDataItem.put("endTime",waterTimingBroadcastDO.getEndTime()+"+08:00");
                executeJsonDataItem.put("playMode","loop");
                executeJsonDataItem.put("playNowTime","");
                executeJsonDataItem.put("planSchemeExecID",0);
                JSONObject secondDownOperationJson = new JSONObject();
                if (Constant.ONE.equals(waterTimingBroadcastDO.getContentType())){
                    //文本
                    secondDownOperationJson.put("audioSource","speechSynthesis");
                    secondDownOperationJson.put("speechSynthesisContent",waterTimingBroadcastDO.getContent());
                }else if (Constant.TWO.equals(waterTimingBroadcastDO.getContentType())){
                    //音频
                    secondDownOperationJson.put("audioSource","customAudio");
                    String json = waterTimingBroadcastDO.getJson();
                    JSONObject jsonData = JSONObject.parseObject(json);
                    List<Integer> hkAudioIds = new ArrayList<>();
                    hkAudioIds.add(jsonData.getIntValue(waterDeviceDO.getIp()));
                    secondDownOperationJson.put("customAudioID",hkAudioIds);
                }
                secondDownOperationJson.put("audioLevel",5);
                //语言类型
                secondDownOperationJson.put("TTSLanguageType","chinese");
                secondDownOperationJson.put("voiceType","female");
                secondDownOperationJson.put("audioVolume",100);
                executeJsonDataItem.put("Operation",secondDownOperationJson);
                executeJsonArray.add(executeJsonDataItem);
                executeJson.put("dailyScheduleList",executeJsonArray);
            }else {
                //周计划
                JSONArray executeJsonArray = new JSONArray();
                List<String> executeTime = new ArrayList<>();
                if (Constant.ONE.equals(waterTimingBroadcastDO.getPeriodType())){
                    //日计划 å¾ªçŽ¯ä¸€æ¬¡
                    executeTime.add("1");
                }else if (Constant.TWO.equals(waterTimingBroadcastDO.getPeriodType())){
                    //周计划多一个周几
                    executeTime = Arrays.asList(waterTimingBroadcastDO.getExecuteTime().split(","));
                }
                for (String s : executeTime) {
                    JSONObject executeJsonData = new JSONObject();
                    if (Constant.TWO.equals(waterTimingBroadcastDO.getPeriodType())){
                        //周计划多一个周几
                        executeJsonData.put("dayOfWeek",Integer.parseInt(s));
                    }
                    JSONArray executeJsonDataArray = new JSONArray();
                    JSONObject executeJsonDataItem = new JSONObject();
                    executeJsonDataItem.put("beginTime",waterTimingBroadcastDO.getStartTime()+"+08:00");
                    executeJsonDataItem.put("endTime",waterTimingBroadcastDO.getEndTime()+"+08:00");
                    executeJsonDataItem.put("playMode","loop");
                    executeJsonDataItem.put("playNowTime","");
                    executeJsonDataItem.put("planSchemeExecID",0);
                    JSONObject secondDownOperationJson = new JSONObject();
                    if (Constant.ONE.equals(waterTimingBroadcastDO.getContentType())){
                        //文本
                        secondDownOperationJson.put("audioSource","speechSynthesis");
                        secondDownOperationJson.put("speechSynthesisContent",waterTimingBroadcastDO.getContent());
                    }else if (Constant.TWO.equals(waterTimingBroadcastDO.getContentType())){
                        //音频
                        secondDownOperationJson.put("audioSource","customAudio");
                        String json = waterTimingBroadcastDO.getJson();
                        JSONObject jsonData = JSONObject.parseObject(json);
                        List<Integer> hkAudioIds = new ArrayList<>();
                        hkAudioIds.add(jsonData.getIntValue(waterDeviceDO.getIp()));
                        secondDownOperationJson.put("customAudioID",hkAudioIds);
                    }
                    secondDownOperationJson.put("audioLevel",5);
                    //语言类型
                    secondDownOperationJson.put("TTSLanguageType","chinese");
                    secondDownOperationJson.put("voiceType","female");
                    secondDownOperationJson.put("audioVolume",10);
                    executeJsonDataItem.put("Operation",secondDownOperationJson);
                    executeJsonDataArray.add(executeJsonDataItem);
                    executeJsonData.put("scheduleList",executeJsonDataArray);
                    executeJsonArray.add(executeJsonData);
                }
                executeJson.put("weeklyScheduleList",executeJsonArray);
            }
            if (Constant.ONE.equals(waterTimingBroadcastDO.getPeriodType())){
                //日计划
                downArrayData.put("dailyScheduleInfo",executeJson);
            }else {
                //周计划
                downArrayData.put("weklyScheduleInfo",executeJson);
            }
            allJsonArray.add(downArrayData);
        }
        jsonObject.put("broadcastPlanSchemeList",allJsonArray);
        log.info("海康播放计划下发入参内容 : " + jsonObject);
        String result = HttpsUtil.doPostHk(param.getIp(),Integer.parseInt(StringUtils.defaultString(param.getPort(),"80"))
                ,"/ISAPI/VideoIntercom/broadcast/AddPlanScheme?format=json",param.getDoorId(), param.getDoorName(),jsonObject.toJSONString());
        return result;*/
        return  null;
    }
    @Override
    public void setLedContent(TransparentChannelSingleRequest model) {
        Device device = findById(model.getDeviceId());
        if(device == null