# 公司事务

返回:笔记

# 四信发布测试

  • 数据库脚本保证最新【E:\JAVA_WORK\document\CMMI\29_四信智慧消防云平台\01开发域\03系统设计\数据库设计】
/*** 2020-12-31 chenchaoliang 发布打版本号  start ***/
INSERT into ff_user.sys_version(id,name,sys_version,content,CREATE_BY,CREATE_TIME,CREATE_USER_NAME,UPDATE_BY,UPDATE_TIME,UPDATE_USER_NAME)
VALUES(UUID(),'四信智慧消防云平台','2.6.4.20201231','云平台测试包-云平台-BUG修复','system',NOW(),'system','system',NOW(),'system');
/*** 2020-12-31 chenchaoliang 发布打版本号  end  ***/
1
2
3
4

上面这句话,必须加上,如果存在表结构调整,还需更新ffdevice_20201218.nb3,数据库的备份文件

  • 保证程序最新并打包
  • changelog更新
  • 禅道建版本
    • 调整beta版本为当前发布的版本
    • 并新建beta版本,供bug修复挂版本
  • 禅道建测试单
  • svn打tag

# 数据同步接口

# 定时调用

back

<!--    <task:scheduled-tasks>         -->
<!--        &lt;!&ndash; 每隔9小时25分13秒调用一次,更新演示数据 &ndash;&gt;-->
<!--       &lt;!&ndash;  <task:scheduled ref="synchro" method="UpdateDemoData" cron="13 25 */9 * * ?"/> &ndash;&gt;-->
<!--        &lt;!&ndash; 每晚1点调用一次,清除超过一个月的数据 &ndash;&gt;-->
<!--         <task:scheduled ref="synchro" method="DeleteData" cron="0 0 1 * * ?"/>-->

<!--        &lt;!&ndash; 每隔5分钟查询超时未发送短信的告警记录-->
<!--        <task:scheduled ref="synchroMsg" method="SendSmsAlarmTimeout" cron="0 0/5 * * * ?"/> &ndash;&gt;-->
<!--        &lt;!&ndash; 每隔5分钟查询超时未发送短信的隐患记录-->
<!--        <task:scheduled ref="synchroMsg" method="SendSmsRecordTimeout" cron="0 0/5 * * * ?"/>&ndash;&gt;-->
<!--        &lt;!&ndash; 每隔5分钟查询超时未发送短信的处理记录-->
<!--        <task:scheduled ref="synchroMsg" method="SendSmsProcessTimeout" cron="0 0/5 * * * ?"/>&ndash;&gt;-->

<!--        &lt;!&ndash; 每隔5分钟查询超时未拨打语音电话的告警记录-->
<!--        <task:scheduled ref="synchroTTS" method="sendTTSAlarmTimeout" cron="0 0/5 * * * ?"/>&ndash;&gt;-->
<!--        &lt;!&ndash; 每隔5分钟查询超时未发送短信的隐患记录-->
<!--        <task:scheduled ref="synchroTTS" method="sendTTSRecordTimeout" cron="0 0/5 * * * ?"/>&ndash;&gt;-->
<!--        &lt;!&ndash; 每隔5分钟查询超时未拨打语音的处理记录-->
<!--        <task:scheduled ref="synchroTTS" method="sendTTSProcessTimeout" cron="0 0/5 * * * ?"/> &ndash;&gt;-->

<!--        &lt;!&ndash; 巡检计划每天9点推送第二天开始的计划信息 &ndash;&gt;-->
<!--        <task:scheduled ref="synchroCheckPlan" method="addMessage2Push" cron="0 0 9 * * ?"/>-->
<!--        -->
<!--      &lt;!&ndash; 每5分钟首页综合统计进行统计&ndash;&gt;-->
<!--        <task:scheduled ref="synchroTmChkTrouble" method="countRank" cron="0 0/5 * * * ?"/>-->
<!--        <task:scheduled ref="synchroTmChkTrouble" method="countTmChkFaultByStatus" cron="0 0/5 * * * ?"/>-->
<!--        <task:scheduled ref="synchroTmChkTrouble" method="countTmChkRecordByStatus" cron="0 0/5 0 * * ?"/>-->
<!--        <task:scheduled ref="synchroTmChkTrouble" method="countTmChkTroubleRectify" cron="0 0/5 0 * * ?"/>-->

<!--        &lt;!&ndash; 设备监控告警数统计 &ndash;&gt;-->
<!--        <task:scheduled ref="synchroStatsWarningCount" method="statsWarningCount" cron="0 0/5 * * * ?"/>-->

<!--        &lt;!&ndash; 告警超时未确认提醒&ndash;&gt;-->
<!--        <task:scheduled ref="synchroDevice" method="sendMsgDeviceWarn" cron="0 0/1 * * * ?"/>-->
<!--        &lt;!&ndash; 告警超时未处理提醒&ndash;&gt;-->
<!--        <task:scheduled ref="synchroDevice" method="sendMsgDeviceWarnProcess" cron="0 0/1 * * * ?"/>-->

<!--        &lt;!&ndash; 配置消息推送 - 巡检计划提醒消息&ndash;&gt;-->
<!--        <task:scheduled ref="synchroMsgPush" method="chkPlanDelayPush" cron="0 0/1 * * * ?"/>-->
<!--        &lt;!&ndash; 配置消息推送 - 隐患提醒消息&ndash;&gt;-->
<!--        <task:scheduled ref="synchroMsgPush" method="troubleDelayPush" cron="0 0/1 * * * ?"/>-->

<!--        &lt;!&ndash; 销控主机 关联设备及字库自动生成 每天1点跑一次 0 0 1 * * ?&ndash;&gt;-->
<!--        <task:scheduled ref="synchroDevice" method="insertHostWordDevice" cron="0 0 1 * * ?"/>-->

<!--        &lt;!&ndash; 配电箱统计,每小时0分0秒执行一次 &ndash;&gt;-->
<!--        <task:scheduled ref="synchroDistributionBox" method="stats" cron="0 0 * * * ?"/>-->

<!--        &lt;!&ndash; 每10分钟扫描一次数据同步任务 &ndash;&gt;-->
<!--        <task:scheduled ref="synchroDataTask" method="sync" cron="0 0/10 * * * ?"/>-->

<!--        &lt;!&ndash; 设备数据同步 30分钟同步一次&ndash;&gt;-->
<!--        <task:scheduled ref="synchroDevice" method="syncDeviceInfo" cron="0 0/30 * * * ?"/>-->

<!--        &lt;!&ndash; 每3分钟扫描一次数据同步任务 &ndash;&gt;-->
<!--        <task:scheduled ref="synchroDeviceWarnData" method="sync" cron="0 0/3 * * * ?"/>-->
<!--    </task:scheduled-tasks>-->
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57

# 方法实现

back

/**
 * 同步设备信息至监管版平台
 */
public void syncDeviceInfo(){
   if(SYNC_DEVICE_INFO) {
      logger.error("同步设备信息至监管平台!已有进程在处理,不能重复执行!");
      return;
   }
   try {
      SYNC_DEVICE_INFO=true;
      this.commonService.syncDataToJg(paramsFun->{
               long pageNo = (long) paramsFun.get("pageNo");
               long size = (long) paramsFun.get("size");
               DeviceType deviceType = (DeviceType) paramsFun.get("deviceType");
               String projectNo = (String) paramsFun.get("projectNo");
               Date beginTime = (Date) paramsFun.get("beginTime");
               Date endTime = (Date) paramsFun.get("endTime");
          return this.deviceService.getSyncDevices(pageNo,size,deviceType,beginTime,endTime,projectNo);
           },"1","api/v1/data/device/sync",Arrays.asList(DeviceType.values()));//具体实现参考附录
   } catch (Exception e){
      logger.error("设备信息同步失败!", e);
   } finally {
      SYNC_DEVICE_INFO=false;
   }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

commonService.java

@Override
public void syncDataToJg(Function<Map<String,Object>,Page> funData,String dataType,
                         String interfaceUrl,List<DeviceType> deviceTypes) {
    long pageNo = 1;
    long size = 100;
    Date nowTime = new Date();
    try {
        List<ProjectBean> listProject = this.getSynProjects();
        for (ProjectBean projectBean : listProject) {
            String timeStamp = String.valueOf(DateUtil.getUnixTimestamp());
            String appKey = projectBean.getAppKey();
            String appId = projectBean.getAppId();
            //待同步项目编号
            String projectNo = projectBean.getProjectNo();
            //接口地址
            String url = projectBean.getServiceUrl();
            //获取token的请求参数
            List<NameValuePair> listToken = Lists.newArrayList();
            listToken.add(new BasicNameValuePair("appId", appId));
            JSONObject tokenObj;
            String token;
            try {
                tokenObj = HttpClientUtils.sendHttpPostRequest(url + "api/v1/data/token/getToken", listToken,
                        appId, "", timeStamp, "");
                token = (String) Optional.ofNullable(((JSONObject) tokenObj.get("data")).get("token")).orElse("");
            } catch (BusinessException e) {
                e.printStackTrace();
                logger.error(e.getMessage());
                continue;
            }

            for (DeviceType deviceType : deviceTypes) {
                Map<String,Object> paramsFun = Maps.newHashMap();
                pageNo = 1;



                long pageNum = 0;
                boolean firstDo = true;
                try {
                    do {
                        //同步接口请求参数
                        List<NameValuePair> list = Lists.newArrayList();
                        list.add(new BasicNameValuePair("deviceType",deviceType.name()));
                        //待签名的数据
                        List<String> signParams = Lists.newArrayList();
                        paramsFun.put("pageNo",pageNo);
                        paramsFun.put("size",size);
                        paramsFun.put("deviceType",deviceType);
                        paramsFun.put("projectNo",projectNo);
                        paramsFun.put("beginTime",this.getDeviceSyncTime(dataType));
                        paramsFun.put("endTime",nowTime);
                        Page pageResult = funData.apply(paramsFun);//调用者实现具体逻辑
                        if (firstDo){
                            pageNum = pageResult.getPages();
                            firstDo = false;
                        }
                        list.add(new BasicNameValuePair("data", JsonUtil.objectToJson(pageResult.getRecords())));
                        signParams.add(deviceType.name());
                        signParams.add(JsonUtil.objectToJson(pageResult.getRecords()));
                        signParams.add(token);
                        signParams.add(timeStamp);
                        signParams.add(appKey);
                        String[] paramsArr = new String[signParams.size()];
                        paramsArr = signParams.toArray(paramsArr);
                        String signnature = SignUtils.genSignature(null,paramsArr);
                        JSONObject syncJson = HttpClientUtils.sendHttpPostRequest(url+interfaceUrl,
                                list,appId,token,timeStamp,signnature);
                        logger.info("设备"+deviceType.getTypeName()+"同步结果:"+syncJson.toJSONString());
                        pageNo++;
                        pageNum--;
                    } while (pageNum > 0);
                } catch (Exception e){
                    e.printStackTrace();
                    logger.error(e.getMessage());
                }
            }
        }
        this.updateDeviceSyncTime(dataType,nowTime);

    } catch (Exception e){
        throw new BusinessException("接口:"+interfaceUrl+"同步出错");
    }

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85

Http接口调用

/**
    * 发送http post请求
    * @param url
    * @param list
    * @throws ClientProtocolException
    * @throws IOException
    */
   public static JSONObject sendHttpPostRequest(String url, List<NameValuePair> list,String appId,
                                           String token,String timeStamp,String signature){
        JSONObject jsonResult = null;
      CloseableHttpClient httpClient = HttpClients.createDefault();
      HttpPost post = new HttpPost(url);
        // 设置请求和传输超时时间
        RequestConfig requestConfig = RequestConfig.custom()
                .setSocketTimeout(5000).setConnectTimeout(5000).build();
        post.setConfig(requestConfig);
      UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, Consts.UTF_8);
      post.setEntity(entity);
      post.setHeader("XF-API-app_id",appId);
      post.setHeader("XF-API-token",token);
      post.setHeader("XF-API-timestamp", timeStamp);
      post.setHeader("XF-API-signature", signature);
      post.setHeader("XF-API-app_type", "windows");
      post.setHeader("XF-API-app_os", "10");
      post.setHeader("XF-API-app_version", "1.0");
        try {

            CloseableHttpResponse response = httpClient.execute(post);
            if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
//       System.out.println("POST请求返回结果"+EntityUtils.toString(response.getEntity(),"utf-8"));
                //把json字符串转换成json对象
                jsonResult = JSONObject.parseObject(EntityUtils.toString(response.getEntity(),"utf-8"));
//          System.out.println(jsonResult);
            }
        } catch (ClientProtocolException e) {
         throw new BusinessException("01", "请求失败, [" + url + "]");
        } catch (IOException e) {
         throw new BusinessException("01", "请求提交失败, [" + url + "]");
        } finally {
            post.releaseConnection();
        }
        return jsonResult;
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

# 附录

back

反射应用

@Override
public Page getSyncDevices(long pageNo,long size,DeviceType deviceType,
                           Date beginTime,Date endTime,String projectNo) {
    Page page = PageUtils.initPage(pageNo,size);
    List lists = this.deviceMapper.getSyncDevices(page,deviceType,beginTime,endTime,projectNo).stream()
            .map(mp-> {
                try {
                    return mapToPojo(mp,Class.forName(deviceType.getBiClazz()));
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                } catch (Exception e){
                    e.printStackTrace();
                }
                return null;
            })
            .collect(Collectors.toList());
    page.setRecords(lists);
    return page;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

参数clazz曾试图写通过函数返回一个,但是行不通

public static <T,K,V> T mapToPojo(Map<K,V> map, Class<T> clazz){
    T t = null;
    try {
        BeanInfo beanInfo = Introspector.getBeanInfo(clazz);
        PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
        t = clazz.newInstance();
        for (PropertyDescriptor propertyDescriptor : propertyDescriptors){
            String key = propertyDescriptor.getName();
            if (map.containsKey(key.toUpperCase())){
                Object value = map.get(key.toUpperCase());
                Method setter = propertyDescriptor.getWriteMethod();
                Method getter = propertyDescriptor.getReadMethod();
                if (value instanceof BigDecimal){
                    if (StringUtils.equals("Double",getter.getReturnType().getSimpleName()) ||
                            StringUtils.equals("double",getter.getReturnType().getSimpleName())){
                        setter.invoke(t,((BigDecimal) value).doubleValue());
                    }
                    else if (StringUtils.equals("Float",getter.getReturnType().getSimpleName()) ||
                            StringUtils.equals("float",getter.getReturnType().getSimpleName())){
                        setter.invoke(t,((BigDecimal) value).floatValue());
                    }
                    else if (StringUtils.equals("Long",getter.getReturnType().getSimpleName()) ||
                            StringUtils.equals("long",getter.getReturnType().getSimpleName())){
                        setter.invoke(t,((BigDecimal) value).longValue());
                    }
                    else if (StringUtils.equals("Integer",getter.getReturnType().getSimpleName()) ||
                            StringUtils.equals("int",getter.getReturnType().getSimpleName())){
                        setter.invoke(t,((BigDecimal) value).intValue());
                    }
                } else{
                    setter.invoke(t,value);
                }
            }
        }
    } catch (IntrospectionException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    }
    return t;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

# 跳转登录页

back

meta.jsp中:

<script type="text/javascript">
//************ 可以在这里做一些全局变量 *************//
if("${sessionScope.currUser.colCode}" === '' ){
    getTopWinow().location.href = ctx+'pages/login.jsp';
}
var website_ = "${sessionScope.currUser.colWebsite}"; //组织
var userName_ = "${sessionScope.currUser.colName}";//用户名
var userCode_ = "${sessionScope.currUser.colCode}"; //用户编号
var branchcode_ = "${sessionScope.currUser.colBranchcode}"; //部门编号
var branchname_ = "${sessionScope.currUser.colBranchname}"; //部门名称
var postcode_ = "${sessionScope.currUser.colPostcode}"; //岗位编号
var postname_ = "${sessionScope.currUser.colPostname}"; //岗位名称
1
2
3
4
5
6
7
8
9
10
11
12

# 海康ISC视频对接

# 门禁权限下载

/**
     * 预约
     * @return 失败成功
     * @date 2019-11-08
     */
    @PostMapping("/person/reserve")
    public CustomResult personReserve(@RequestBody HikXdSubscriptionParamVo hikXdSubscriptionParamVo){
        HikXdUtil hikXdUtil = new HikXdUtil(this.customerProperties);
        HikXdPersonAddParamVo hikXdPersonAddParamVo  = hikXdUtil.advancePersonList(this.getAdvancePersonListParam(hikXdSubscriptionParamVo));
        if (ObjectUtils.isEmpty(hikXdPersonAddParamVo)){
            hikXdPersonAddParamVo = new HikXdPersonAddParamVo();
            //人员新增
            hikXdPersonAddParamVo.setPersonName(hikXdSubscriptionParamVo.getPersonName());
            hikXdPersonAddParamVo.setOrgIndexCode(DEFAULT_ORG_INDEX_CODE);
            hikXdPersonAddParamVo.setJobNo(hikXdSubscriptionParamVo.getJobNo());
            HikXdFaceInfoVo face = new HikXdFaceInfoVo();
            face.setFaceData(HikUtil.transferImg2Base64(hikXdSubscriptionParamVo.getFaceUrl()));
            hikXdPersonAddParamVo.setFaces(Stream.of(face).collect(Collectors.toList()));
            String personId = hikXdUtil.personSingleAdd(hikXdPersonAddParamVo);
            if (StringUtils.isBlank(personId)){
                return CustomResult.fail("人员添加到平台失败");
            }
            log.info("当前添加的用户的用户唯一标识:{}",personId);
            //添加人脸——无需单独添加,添加人员的时候已经添加人脸信息
//            HikXdFaceInfoVo hikXdFaceInfoVo = new HikXdFaceInfoVo();
//            hikXdFaceInfoVo.setPersonId(personId);
//            hikXdFaceInfoVo.setFaceData(HikUtil.transferImg2Base64(hikXdSubscriptionParamVo.getFaceUrl()));
//            HikXdFaceInfoVo responseFace =  hikXdUtil.faceSingleAdd(hikXdFaceInfoVo);
//            if (ObjectUtils.isEmpty(responseFace)){
//                return CustomResult.fail("人脸添加失败");
//            }
            //设置人脸信息-保存人脸唯一标识
//            HikXdFaceResultVo hikXdFaceResultVo = new HikXdFaceResultVo();
//            hikXdFaceResultVo.setPersonPhotoIndexCode(responseFace.getFaceId());
//            hikXdFaceResultVo.setPicUri(responseFace.getFaceUrl());
//            hikXdPersonAddParamVo.setPersonPhoto(Stream.of(hikXdFaceResultVo).collect(Collectors.toList()));

            //设置绑卡参数信息——必须绑卡否则下载权限会失败
            HikXdCardBindingParamVo hikXdCardBindingParamVo = new HikXdCardBindingParamVo();
            hikXdCardBindingParamVo.setStartDate(this.customerProperties.getHikXdProperties().getStartDate());
            hikXdCardBindingParamVo.setEndDate(this.customerProperties.getHikXdProperties().getEndDate());
            List<HikXdCardVo> cardList = Lists.newArrayList();
            HikXdCardVo card = new HikXdCardVo();
            card.setCardNo(this.customerProperties.getHikXdProperties().getCardNo());
            card.setPersonId(personId);
            cardList.add(card);
            hikXdCardBindingParamVo.setCardList(cardList);
            if (StringUtils.isBlank(hikXdUtil.cardBindings(hikXdCardBindingParamVo))){
                return CustomResult.fail("绑卡失败");
            }
            hikXdPersonAddParamVo = hikXdUtil.advancePersonList(this.getAdvancePersonListParam(hikXdSubscriptionParamVo));
        }

        //权限下载
        HikXdSimpleDownloadParamVo hikXdSimpleDownloadParamVo = new HikXdSimpleDownloadParamVo();

        //权限下载资源信息
        HikXdResourceVo hikXdResourceVo = new HikXdResourceVo();
        hikXdResourceVo.setResourceIndexCode(this.customerProperties.getHikXdProperties().getResourceIndexCode());
        hikXdResourceVo.setResourceType(this.customerProperties.getHikXdProperties().getResourceType());
        hikXdResourceVo.setChannelNos(this.customerProperties.getHikXdProperties().getChannelNos());
        hikXdSimpleDownloadParamVo.setResourceInfo(hikXdResourceVo);

        //权限下载人员信息
        HikXdPersonInfoVo hikXdPersonInfoVo = new HikXdPersonInfoVo();
        hikXdPersonInfoVo.setPersonId(hikXdPersonAddParamVo.getPersonId());
        //新增
        hikXdPersonInfoVo.setOperatorType(this.customerProperties.getHikXdProperties().getOperatorType());
        hikXdPersonInfoVo.setStartTime(hikXdSubscriptionParamVo.getStartTime()
                +this.customerProperties.getHikXdProperties().getTimeSuffix());
        hikXdPersonInfoVo.setEndTime(hikXdSubscriptionParamVo.getEndTime()
                +this.customerProperties.getHikXdProperties().getTimeSuffix());
        hikXdPersonInfoVo.setPersonType(this.customerProperties.getHikXdProperties().getPersonType());
        hikXdPersonInfoVo.setName(hikXdSubscriptionParamVo.getPersonName());
        //权限下载时的人员卡片信息
//        HikXdCardInfoVo hikXdCardInfoVo = new HikXdCardInfoVo();
//        hikXdCardInfoVo.setCard(this.customerProperties.getHikXdProperties().getPersonCard());
        //新增
//        hikXdCardInfoVo.setStatus("0");
//        List<HikXdCardInfoVo> personCards = Stream.of(hikXdCardInfoVo).collect(Collectors.toList());

        HikXdFaceInfoVo downFace = new HikXdFaceInfoVo();
        //这一句在api文档里没有,必须有
        downFace.setStorageNodeCode(hikXdPersonAddParamVo.getPersonPhoto().get(0).getServerIndexCode());
        Map<String,String> dataMap = Maps.newHashMap();
        dataMap.put(hikXdPersonAddParamVo.getPersonPhoto().get(0).getPersonPhotoIndexCode()
                ,hikXdPersonAddParamVo.getPersonPhoto().get(0).getPicUri());
        downFace.setData(dataMap);
//        hikXdPersonInfoVo.setCards(personCards);
        hikXdPersonInfoVo.setFace(downFace);

        hikXdSimpleDownloadParamVo.setPersonInfo(hikXdPersonInfoVo);
        hikXdSimpleDownloadParamVo.setTaskType(this.customerProperties.getHikXdProperties().getTaskType());
        HikXdSimpleDownloadResultVo hikXdSimpleDownloadResultVo = hikXdUtil.simpleDownload(hikXdSimpleDownloadParamVo);

        if (ObjectUtils.isEmpty(hikXdSimpleDownloadResultVo)){
            return CustomResult.fail("下载权限失败");
        }
        if (!StringUtils.equals(hikXdSimpleDownloadResultVo.getResourceDownloadDetail().getPersondownloadResult(),HikUtil.SUCCESS_CODE)){
            return CustomResult.fail(hikXdSubscriptionParamVo.getPersonName()+"权限下载失败");
        }

        return CustomResult.ok();
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104

# 海康isc权限配置

运管中心中的合作方key

p p p

注意:合作方key中的userId不可含中文,必须英文字母,否则存在问题

需要给角色配置资源权限

# 拾联视频对接

http://218.85.131.36:18081/webui/monitor/devchannel
https://218.85.131.36:18443/webui/monitor/devchannel

配置网址:https://192.168.25.10:9090/

  • 针对接口返回127.0.0.1得问题
    • 网络配置:配置外部访问的网络地址需要加上

# 工作事务

  • 产品需求遗漏问题,导致开发反复