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