doum
2025-12-03 6e3d13f32301eaa8af392f95b6f7966e06c5fcde
最新版本541200007
已修改6个文件
215 ■■■■■ 文件已修改
admin/src/components/business/OperaDeviceBroadcastWindow.vue 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/deviceBroadcast.vue 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/core/utils/HttpsUtil.java 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/HkSyncCloudController.java 7 ●●●● 补丁 | 查看 | 原始文档 | 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
@@ -27,8 +27,20 @@
              <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="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'])"
@@ -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,6 +127,13 @@
    this.search()
  },
  methods: {
    showPassward (row) {
      if (!row.showPwd) {
        this.$set(row, 'showPwd', true)
      } else {
        this.$set(row, 'showPwd', false)
      }
    },
    sendBobao () {
      if(!this.form.sendInfo){
        return
server/system_service/src/main/java/com/doumee/core/utils/HttpsUtil.java
@@ -8,7 +8,10 @@
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.*;
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;
@@ -52,14 +55,12 @@
        httpRequestBase.setConfig(requestConfig);
    }
    public static String doPutHk(String host,int port,String UserName,String Password,String url, String Input) {
    public static String doPostHk(String host,int port,String UserName,String Password,String url, String Input) {
        try {
            CloseableHttpResponse responseBody = null;
            HttpPut httpPut = new HttpPut("http://"+host+":"+port+url);
            log.error("====================海康isapi接口:http://"+host+":"+port+url);
            httpPut.setHeader("Content-Type", "application/json");
            setRequestConfig(httpPut);
            httpPut.setEntity(new StringEntity(Input, "UTF-8"));
            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));
@@ -68,7 +69,7 @@
            String response = "";
            // 由客户端执行(发送)Post请求
            responseBody = httpClient.execute(httpPut);
            responseBody = httpClient.execute(httpPost);
            // 从响应模型中获取响应实体
            HttpEntity responseEntity = responseBody.getEntity();
            log.error("doPostHk响应状态为:" + responseBody.getStatusLine());
@@ -76,8 +77,8 @@
                String redirectLocation = responseBody.getHeaders("Location")[0].getValue();
                log.error("doPostHkRedirected to: " + redirectLocation);
                // 在这里,你可以发送一个新的请求到redirectLocation
                httpPut.setURI(URI.create(redirectLocation));
                CloseableHttpResponse responseBody2 = httpClient.execute(httpPut);
                httpPost.setURI(URI.create(redirectLocation));
                CloseableHttpResponse responseBody2 = httpClient.execute(httpPost);
                log.error("doPostHk重定向后响应状态为:" + responseBody2.getStatusLine());
                HttpEntity responseEntity2 = responseBody2.getEntity();
                log.error("doPostHk重定向后响应内容长度为:" + responseEntity2.getContentLength());
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_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