liurunyu
2025-08-13 77f31f98b476273ffd6ca03e5d42b18cb6b3c480
Merge branch 'master' of http://8.140.179.55:20000/r/pipIrr-SV
1个文件已修改
4个文件已添加
397 ■■■■■ 已修改文件
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/README_REMOTE_INTEGRATION.md 199 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/config/RemoteServiceConfig.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/remote/RemoteCtrl.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/remote/RemoteService.java 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/resources/application-self.yml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/README_REMOTE_INTEGRATION.md
New file
@@ -0,0 +1,199 @@
# 微信模块调用远程视频模块集成说明
## 概述
本文档说明如何在 `pipIrr-web-wechat` 模块中调用 `pipIrr-web-remote` 模块的 `video/some` 接口,实现微信端视频监控功能。
## 架构说明
- **pipIrr-web-wechat**: 微信小程序服务(端口:/wx)
- **pipIrr-web-remote**: 远程控制服务(端口:/remote)
两个服务通过HTTP接口进行通信,微信模块作为客户端调用远程控制模块的视频监控REST API。
## 配置说明
### 1. 配置文件
在 `application-self.yml` 中添加远程服务配置:
```yaml
remote:
  service:
    base-url: ${pipIrr.remote.baseUrl:http://localhost:8081/remote}
```
### 2. 环境变量配置
根据部署环境设置相应的环境变量:
```properties
# 开发环境
pipIrr.remote.baseUrl=http://localhost:8081/remote
# 生产环境
pipIrr.remote.baseUrl=http://remote-service-host:8081/remote
```
## 接口说明
### 获取视频监控数据
**接口地址**: `GET /wx/remote/video/some`
**请求参数**:
- pageCurr: 当前页码(默认1)
- pageSize: 每页大小(可选)
**响应示例**:
```json
{
  "success": true,
  "msg": "查询成功",
  "content": {
    "obj": [
      {
        "id": 123456,
        "name": "摄像机1",
        "videoUrl4Simple": "rtmp://...",
        "videoUrl4Standard": "rtmp://...",
        "videoUrl4Security": "rtmp://...",
        "videoUrl4PcLive": "http://..."
      }
    ],
    "pageCurr": 1,
    "pageSize": 4,
    "itemTotal": 10
  }
}
```
## 使用示例
### Java代码示例
```java
@RestController
@RequestMapping("wechat/video")
public class WechatVideoController {
    @Autowired
    private RemoteService remoteService;
    @GetMapping("cameras")
    public BaseResponse<Object> getCameras(
            @RequestParam(defaultValue = "1") Integer pageCurr,
            @RequestParam(required = false) Integer pageSize) {
        // 构建查询参数
        StringBuilder queryParams = new StringBuilder();
        queryParams.append("pageCurr=").append(pageCurr);
        if (pageSize != null) {
            queryParams.append("&pageSize=").append(pageSize);
        }
        // 调用远程视频接口
        return remoteService.getVideoSome(queryParams.toString());
    }
}
```
### 前端调用示例
```javascript
// 微信小程序调用示例
wx.request({
  url: 'https://your-domain.com/wx/remote/video/some?pageCurr=1&pageSize=10',
  method: 'GET',
  success: function(res) {
    if (res.data.success) {
      const cameras = res.data.content.obj;
      // 处理摄像机数据
      cameras.forEach(camera => {
        console.log('摄像机:', camera.name);
        console.log('直播地址:', camera.videoUrl4PcLive);
      });
    } else {
      wx.showToast({
        title: res.data.msg,
        icon: 'error'
      });
    }
  }
});
```
## 错误处理
### 常见错误码
- `HTTP 404`: 远程服务接口不存在
- `HTTP 500`: 远程服务内部错误
- `HTTP 503`: 远程服务不可用
- `Connection Timeout`: 连接超时
- `Read Timeout`: 读取超时
### 错误处理策略
1. **连接失败重试**: OkHttpClient配置了连接失败自动重试
2. **超时处理**: 配置合理的连接、读取、写入超时时间
3. **异常日志**: 详细记录调用异常信息,便于问题排查
4. **降级处理**: 在远程服务不可用时,可以考虑本地缓存或降级方案
## 监控和日志
### 日志配置
```yaml
logging:
  level:
    com.dy.pipIrrWechat.remote: DEBUG
```
### 关键日志
- 远程接口调用记录
- 请求和响应内容(调试模式)
- 异常详细信息
- 性能监控(响应时间)
## 部署注意事项
1. **网络连通性**: 确保微信服务能够访问远程控制服务
2. **端口配置**: 检查防火墙和安全组设置
3. **负载均衡**: 如果远程服务有多个实例,配置负载均衡
4. **健康检查**: 定期检查远程服务可用性
## 扩展功能
### 1. 添加新的远程接口
1. 在 `RemoteService` 中添加新的方法
2. 在 `RemoteCtrl` 中添加对应的控制器方法
3. 更新文档和测试用例
### 2. 增加缓存机制
可以考虑对查询类接口添加缓存,提高响应速度:
```java
@Cacheable(value = "controllerAlarmState", key = "#queryParams")
public BaseResponse<Object> getControllerAlarmState(String queryParams) {
    // 实现代码
}
```
### 3. 异步调用
对于不需要立即返回结果的操作,可以考虑异步调用:
```java
@Async
public CompletableFuture<BaseResponse<Object>> openValveAsync(String requestBody) {
    return CompletableFuture.completedFuture(callRemoteApi("/valve/open", requestBody, "POST"));
}
```
## 总结
通过以上配置和代码,微信模块可以成功调用远程控制模块的 `video/some` 接口,实现视频监控数据的获取功能。这种架构设计保持了模块间的解耦,同时提供了简洁高效的视频数据访问能力。
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/config/RemoteServiceConfig.java
New file
@@ -0,0 +1,33 @@
package com.dy.pipIrrWechat.config;
import okhttp3.OkHttpClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.concurrent.TimeUnit;
/**
 * 远程视频服务配置类
 *
 * @author zuoxiao
 * @date 2025-01-21
 * @description 远程视频服务相关配置
 */
@Configuration
public class RemoteServiceConfig {
    /**
     * 配置OkHttpClient Bean
     *
     * @return OkHttpClient实例
     */
    @Bean
    public OkHttpClient okHttpClient() {
        return new OkHttpClient.Builder()
                .connectTimeout(30, TimeUnit.SECONDS)
                .readTimeout(60, TimeUnit.SECONDS)
                .writeTimeout(60, TimeUnit.SECONDS)
                .retryOnConnectionFailure(true) // 连接失败时重试
                .build();
    }
}
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/remote/RemoteCtrl.java
New file
@@ -0,0 +1,61 @@
package com.dy.pipIrrWechat.remote;
import com.dy.common.webUtil.BaseResponse;
import com.dy.common.webUtil.BaseResponseUtils;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
/**
 * 微信端远程视频接口
 * 提供微信小程序调用远程控制模块video接口
 *
 * @author zuoxiao
 * @date 2025-01-21
 * @description 微信端远程视频功能控制器
 */
@Slf4j
@Tag(name = "微信远程视频", description = "微信端调用远程控制模块的video接口")
@RestController
@RequestMapping(path = "remote")
@RequiredArgsConstructor
public class RemoteCtrl {
    private final RemoteService remoteService;
    /**
     * 获取视频监控数据
     *
     * @param pageCurr 当前页码
     * @param pageSize 每页大小
     * @return 视频监控数据
     */
    @Operation(summary = "获取视频监控数据", description = "微信端调用远程控制模块获取摄像机数据")
    @GetMapping(path = "video/some")
    public BaseResponse<Object> getVideoSome(
            @RequestParam(defaultValue = "1") Integer pageCurr,
            @RequestParam(required = false) Integer pageSize) {
        try {
            log.info("微信端请求视频监控数据: pageCurr={}, pageSize={}", pageCurr, pageSize);
            // 构建查询参数
            StringBuilder queryParams = new StringBuilder();
            queryParams.append("pageCurr=").append(pageCurr);
            if (pageSize != null) {
                queryParams.append("&pageSize=").append(pageSize);
            }
            // 调用远程服务
            BaseResponse<Object> result = remoteService.getVideoSome(queryParams.toString());
            log.info("视频监控数据查询结果: {}", result);
            return result;
        } catch (Exception e) {
            log.error("微信端视频监控数据查询异常", e);
            return BaseResponseUtils.buildException("视频监控数据查询失败: " + e.getMessage());
        }
    }
}
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/remote/RemoteService.java
New file
@@ -0,0 +1,99 @@
package com.dy.pipIrrWechat.remote;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.dy.common.webUtil.BaseResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import okhttp3.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.io.IOException;
/**
 * 远程视频服务调用类
 * 用于调用pipIrr-web-remote模块的video接口
 *
 * @author zuoxiao
 * @date 2025-01-21
 * @description 微信模块调用远程控制模块的视频服务类
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class RemoteService {
    @Value("${remote.service.base-url:http://localhost:8081/remote}")
    private String remoteServiceBaseUrl;
    private final OkHttpClient httpClient;
    /**
     * 调用远程视频监控接口 - 获取摄像机数据
     *
     * @param queryParams 查询参数字符串
     * @return 远程调用结果
     */
    public BaseResponse<Object> getVideoSome(String queryParams) {
        return callRemoteApi("/video/some?" + (queryParams != null ? queryParams : ""), null, "GET");
    }
    /**
     * 通用远程API调用方法
     *
     * @param endpoint 接口端点
     * @param requestBody 请求体(GET请求时为null)
     * @param method HTTP方法
     * @return 调用结果
     */
    private BaseResponse<Object> callRemoteApi(String endpoint, String requestBody, String method) {
        String url = remoteServiceBaseUrl + endpoint;
        Request request;
        try {
            Request.Builder requestBuilder = new Request.Builder()
                    .url(url)
                    .addHeader("Content-Type", "application/json")
                    .addHeader("Accept", "application/json");
            if ("POST".equalsIgnoreCase(method) && requestBody != null) {
                RequestBody body = RequestBody.create(requestBody, MediaType.get("application/json; charset=utf-8"));
                request = requestBuilder.post(body).build();
            } else {
                request = requestBuilder.get().build();
            }
            log.info("调用远程接口: {} {}", method, url);
            log.debug("请求体: {}", requestBody);
            try (Response response = httpClient.newCall(request).execute()) {
                if (!response.isSuccessful()) {
                    log.error("远程调用失败: HTTP {}", response.code());
                    return BaseResponse.<Object>builder()
                            .success(false)
                            .msg("远程服务调用失败: HTTP " + response.code())
                            .build();
                }
                String responseBody = response.body() != null ? response.body().string() : "";
                log.debug("远程接口响应: {}", responseBody);
                // 解析远程服务返回的BaseResponse
                JSONObject jsonResponse = JSON.parseObject(responseBody);
                return BaseResponse.<Object>builder()
                        .success(jsonResponse.getBooleanValue("success"))
                        .msg(jsonResponse.getString("msg"))
                        .content(jsonResponse.get("content"))
                        .build();
            }
        } catch (IOException e) {
            log.error("调用远程接口异常: {}", e.getMessage(), e);
            return BaseResponse.<Object>builder()
                    .success(false)
                    .msg("远程服务调用异常: " + e.getMessage())
                    .build();
        }
    }
}
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/resources/application-self.yml
@@ -21,6 +21,11 @@
            delay: 5 #轮灌中计划开阀的延迟时长(分钟)
            preOpeningTime: 10 #提前时间(分钟)
            planTerminateLimitMinutes: 5 #计划终止后限制发布新计划的时间间隔(分钟)
#远程视频服务配置
remote:
    service:
        base-url: ${pipIrr.remote.baseUrl:http://localhost:8081/remote} #远程控制服务基础URL
#阿里短信服务
aliyun:
    sms: