Browse Source

接口接入与实现

master
fbw 1 week ago
parent
commit
8fecabbac0
  1. 245
      cc-admin-master/yudao-module-interphone/src/main/java/cn/iocoder/yudao/module/interphone/controller/admin/InterphoneOpenController.java
  2. 9
      cc-admin-master/yudao-module-interphone/src/main/java/cn/iocoder/yudao/module/interphone/core/ApiClient.java
  3. 27
      cc-admin-master/yudao-module-interphone/src/main/java/cn/iocoder/yudao/module/interphone/core/ApiRequest.java
  4. 28
      cc-admin-master/yudao-module-interphone/src/main/java/cn/iocoder/yudao/module/interphone/demo/DemoRemoteClient.java
  5. 2
      cc-admin-master/yudao-module-interphone/src/main/java/cn/iocoder/yudao/module/interphone/retry/TokenExpiredRetryHandler.java
  6. 53
      cc-admin-master/yudao-module-interphone/src/main/java/cn/iocoder/yudao/module/interphone/service/InterphoneApiService.java
  7. 470
      cc-admin-master/yudao-module-interphone/src/main/java/cn/iocoder/yudao/module/interphone/service/apidoc.md
  8. 207
      cc-admin-master/yudao-module-interphone/src/main/java/cn/iocoder/yudao/module/interphone/service/impl/InterphoneApiServiceImpl.java
  9. 76
      cc-admin-master/yudao-server/src/main/resources/logback-spring.xml

245
cc-admin-master/yudao-module-interphone/src/main/java/cn/iocoder/yudao/module/interphone/controller/admin/InterphoneOpenController.java

@ -0,0 +1,245 @@
package cn.iocoder.yudao.module.interphone.controller.admin;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.interphone.service.InterphoneApiService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.annotation.security.PermitAll;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Tag(name = "开放接口 - 对讲平台代理")
@RestController
@RequestMapping("/interphone/open-api")
@Validated
public class InterphoneOpenController {
@Resource
private InterphoneApiService interphoneApiService;
@GetMapping("/profile/agent")
@Operation(summary = "获取代理商个人信息")
@PermitAll
public CommonResult<String> getAgentProfile() {
return success(interphoneApiService.getAgentProfile());
}
@GetMapping("/agent/list")
@Operation(summary = "查询代理商列表")
@Parameters({
@Parameter(name = "pageNo", description = "页码", required = true),
@Parameter(name = "pageSize", description = "每页数量", required = true),
@Parameter(name = "name", description = "代理商名称")
})
@PermitAll
public CommonResult<String> getAgentList(@RequestParam("pageNo") Integer pageNo,
@RequestParam("pageSize") Integer pageSize,
@RequestParam(value = "name", required = false) String name) {
return success(interphoneApiService.getAgentList(pageNo, pageSize, name));
}
@GetMapping("/agent/detail")
@Operation(summary = "查询代理商详情")
@Parameter(name = "id", description = "代理商 ID", required = true)
@PermitAll
public CommonResult<String> getAgentDetail(@RequestParam("id") String id) {
return success(interphoneApiService.getAgentDetail(id));
}
@GetMapping("/profile/faststats")
@Operation(summary = "查询代理商单位群组用户统计")
@PermitAll
public CommonResult<String> getFastStats() {
return success(interphoneApiService.getFastStats());
}
@GetMapping("/group/getGroupName")
@Operation(summary = "查询群组名称")
@Parameter(name = "orgId", description = "单位 ID", required = true)
@PermitAll
public CommonResult<String> getGroupName(@RequestParam("orgId") String orgId) {
return success(interphoneApiService.getGroupName(orgId));
}
@GetMapping("/terminal/querySubordinateUser")
@Operation(summary = "查询下级用户")
@Parameters({
@Parameter(name = "pageNo", description = "页码", required = true),
@Parameter(name = "pageSize", description = "每页数量", required = true),
@Parameter(name = "agentId", description = "代理商 ID"),
@Parameter(name = "orgId", description = "单位 ID"),
@Parameter(name = "groupId", description = "群组 ID"),
@Parameter(name = "userName", description = "用户名称"),
@Parameter(name = "account", description = "账号")
})
@PermitAll
public CommonResult<String> querySubordinateUser(@RequestParam("pageNo") Integer pageNo,
@RequestParam("pageSize") Integer pageSize,
@RequestParam(value = "agentId", required = false) String agentId,
@RequestParam(value = "orgId", required = false) String orgId,
@RequestParam(value = "groupId", required = false) String groupId,
@RequestParam(value = "userName", required = false) String userName,
@RequestParam(value = "account", required = false) String account) {
return success(interphoneApiService.querySubordinateUser(pageNo, pageSize, agentId, orgId, groupId, userName, account));
}
@GetMapping("/agent/orgs")
@Operation(summary = "查询单位列表")
@Parameters({
@Parameter(name = "pageNo", description = "页码", required = true),
@Parameter(name = "pageSize", description = "每页数量", required = true),
@Parameter(name = "name", description = "单位名称")
})
@PermitAll
public CommonResult<String> getAgentOrgs(@RequestParam("pageNo") Integer pageNo,
@RequestParam("pageSize") Integer pageSize,
@RequestParam(value = "name", required = false) String name) {
return success(interphoneApiService.getAgentOrgs(pageNo, pageSize, name));
}
@GetMapping("/group/list")
@Operation(summary = "查询群组列表")
@Parameters({
@Parameter(name = "pageNo", description = "页码", required = true),
@Parameter(name = "pageSize", description = "每页数量", required = true),
@Parameter(name = "name", description = "群组名称"),
@Parameter(name = "orgname", description = "单位名称")
})
@PermitAll
public CommonResult<String> getGroupList(@RequestParam("pageNo") Integer pageNo,
@RequestParam("pageSize") Integer pageSize,
@RequestParam(value = "name", required = false) String name,
@RequestParam(value = "orgname", required = false) String orgName) {
return success(interphoneApiService.getGroupList(pageNo, pageSize, name, orgName));
}
@PostMapping("/group/add")
@Operation(summary = "新增群组")
@PermitAll
public CommonResult<String> addGroup(@RequestBody String requestBody) {
return success(interphoneApiService.addGroup(requestBody));
}
@GetMapping("/group/detail")
@Operation(summary = "查询群组详情")
@Parameter(name = "id", description = "群组 ID", required = true)
@PermitAll
public CommonResult<String> getGroupDetail(@RequestParam("id") String id) {
return success(interphoneApiService.getGroupDetail(id));
}
@PostMapping("/group/updateGroup")
@Operation(summary = "编辑群组")
@PermitAll
public CommonResult<String> updateGroup(@RequestBody String requestBody) {
return success(interphoneApiService.updateGroup(requestBody));
}
@PostMapping("/group/delete")
@Operation(summary = "删除群组")
@PermitAll
public CommonResult<String> deleteGroup(@RequestBody String requestBody) {
return success(interphoneApiService.deleteGroup(requestBody));
}
@GetMapping("/group/members")
@Operation(summary = "获取群组成员")
@Parameter(name = "id", description = "群组 ID", required = true)
@PermitAll
public CommonResult<String> getGroupMembers(@RequestParam("id") String id) {
return success(interphoneApiService.getGroupMembers(id));
}
@PostMapping("/group/members/add")
@Operation(summary = "添加群组成员")
@PermitAll
public CommonResult<String> addGroupMembers(@RequestBody String requestBody) {
return success(interphoneApiService.addGroupMembers(requestBody));
}
@PostMapping("/group/members/remove")
@Operation(summary = "移除群组成员")
@PermitAll
public CommonResult<String> removeGroupMembers(@RequestBody String requestBody) {
return success(interphoneApiService.removeGroupMembers(requestBody));
}
@GetMapping("/jsp/queryGroupByUId")
@Operation(summary = "查询用户群组")
@PermitAll
public CommonResult<String> queryGroupByUid(@RequestParam Map<String, String> queryParams) {
return success(interphoneApiService.queryGroupByUid(queryParams));
}
@PostMapping("/terminal/batch")
@Operation(summary = "创建对讲用户")
@PermitAll
public CommonResult<String> createTerminalUsers(@RequestBody String requestBody) {
return success(interphoneApiService.createTerminalUsers(requestBody));
}
@GetMapping("/terminal/list")
@Operation(summary = "查询对讲用户列表")
@Parameters({
@Parameter(name = "pageNo", description = "页码", required = true),
@Parameter(name = "pageSize", description = "每页数量", required = true),
@Parameter(name = "org_id", description = "单位 ID"),
@Parameter(name = "groupId", description = "群组 ID"),
@Parameter(name = "name", description = "用户名称")
})
@PermitAll
public CommonResult<String> getTerminalList(@RequestParam("pageNo") Integer pageNo,
@RequestParam("pageSize") Integer pageSize,
@RequestParam(value = "org_id", required = false) String orgId,
@RequestParam(value = "groupId", required = false) String groupId,
@RequestParam(value = "name", required = false) String name) {
return success(interphoneApiService.getTerminalList(pageNo, pageSize, orgId, groupId, name));
}
@GetMapping("/terminal/detail")
@Operation(summary = "查询对讲用户详情")
@PermitAll
public CommonResult<String> getTerminalDetail(@RequestParam Map<String, String> queryParams) {
return success(interphoneApiService.getTerminalDetail(queryParams));
}
@PostMapping("/terminal/updateUser")
@Operation(summary = "修改对讲用户信息")
@PermitAll
public CommonResult<String> updateTerminalUser(@RequestBody String requestBody) {
return success(interphoneApiService.updateTerminalUser(requestBody));
}
@PostMapping("/terminal/deleteUser")
@Operation(summary = "删除对讲用户")
@PermitAll
public CommonResult<String> deleteTerminalUser(@RequestBody String requestBody) {
return success(interphoneApiService.deleteTerminalUser(requestBody));
}
@GetMapping("/terminal/userOnlineStatus")
@Operation(summary = "查询对讲用户在线状态")
@PermitAll
public CommonResult<String> getTerminalUserOnlineStatus(@RequestParam Map<String, String> queryParams) {
return success(interphoneApiService.getTerminalUserOnlineStatus(queryParams));
}
@GetMapping("/record/list")
@Operation(summary = "查询录音列表")
@PermitAll
public CommonResult<String> getRecordList(@RequestParam Map<String, String> queryParams) {
return success(interphoneApiService.getRecordList(queryParams));
}
}

9
cc-admin-master/yudao-module-interphone/src/main/java/cn/iocoder/yudao/module/interphone/core/ApiClient.java

@ -66,19 +66,22 @@ public class ApiClient {
} }
private ApiResponse doExecute(ApiRequest apiRequest) throws IOException { private ApiResponse doExecute(ApiRequest apiRequest) throws IOException {
String url = QueryStringBuilder.build(
String rawUrl = QueryStringBuilder.build(
properties.getApiUrl(), properties.getApiUrl(),
apiRequest.getPath(), apiRequest.getPath(),
apiRequest.getQueryParams() apiRequest.getQueryParams()
); );
Request.Builder builder = new Request.Builder().url(url);
HttpUrl.Builder urlBuilder = Objects.requireNonNull(HttpUrl.parse(rawUrl), "无效请求地址").newBuilder();
if (apiRequest.isNeedToken()) { if (apiRequest.isNeedToken()) {
Author author = tokenManager.getAuthor(); Author author = tokenManager.getAuthor();
builder.url(url + "?access_token=" + author.getAccessToken() + "&openid=" + author.getOpenId());
urlBuilder.addQueryParameter("access_token", author.getAccessToken());
urlBuilder.addQueryParameter("openid", author.getOpenId());
} }
Request.Builder builder = new Request.Builder().url(urlBuilder.build());
if (apiRequest.getHeaders() != null) { if (apiRequest.getHeaders() != null) {
for (Map.Entry<String, String> entry : apiRequest.getHeaders().entrySet()) { for (Map.Entry<String, String> entry : apiRequest.getHeaders().entrySet()) {
builder.header(entry.getKey(), entry.getValue()); builder.header(entry.getKey(), entry.getValue());

27
cc-admin-master/yudao-module-interphone/src/main/java/cn/iocoder/yudao/module/interphone/core/ApiRequest.java

@ -1,10 +1,13 @@
package cn.iocoder.yudao.module.interphone.core; package cn.iocoder.yudao.module.interphone.core;
import lombok.Getter;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@Getter
public class ApiRequest { public class ApiRequest {
private HttpMethod method; private HttpMethod method;
@ -15,50 +18,26 @@ public class ApiRequest {
private boolean needToken = true; private boolean needToken = true;
public HttpMethod getMethod() {
return method;
}
public void setMethod(HttpMethod method) { public void setMethod(HttpMethod method) {
this.method = method; this.method = method;
} }
public String getPath() {
return path;
}
public void setPath(String path) { public void setPath(String path) {
this.path = path; this.path = path;
} }
public Map<String, String> getQueryParams() {
return queryParams;
}
public void setQueryParams(Map<String, String> queryParams) { public void setQueryParams(Map<String, String> queryParams) {
this.queryParams = queryParams; this.queryParams = queryParams;
} }
public Map<String, String> getHeaders() {
return headers;
}
public void setHeaders(Map<String, String> headers) { public void setHeaders(Map<String, String> headers) {
this.headers = headers; this.headers = headers;
} }
public String getJsonBody() {
return jsonBody;
}
public void setJsonBody(String jsonBody) { public void setJsonBody(String jsonBody) {
this.jsonBody = jsonBody; this.jsonBody = jsonBody;
} }
public boolean isNeedToken() {
return needToken;
}
public void setNeedToken(boolean needToken) { public void setNeedToken(boolean needToken) {
this.needToken = needToken; this.needToken = needToken;
} }

28
cc-admin-master/yudao-module-interphone/src/main/java/cn/iocoder/yudao/module/interphone/demo/DemoRemoteClient.java

@ -1,28 +0,0 @@
package cn.iocoder.yudao.module.interphone.demo;
import cn.iocoder.yudao.module.interphone.core.ApiClient;
import cn.iocoder.yudao.module.interphone.core.ApiRequest;
import cn.iocoder.yudao.module.interphone.core.ApiResponse;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
@Component
public class DemoRemoteClient {
private final ApiClient apiClient;
public DemoRemoteClient(ApiClient apiClient) {
this.apiClient = apiClient;
}
public String getUserInfo() {
ApiRequest request = ApiRequest.get("/profile/agent");
ApiResponse response = apiClient.execute(request);
return response.getBody();
}
}

2
cc-admin-master/yudao-module-interphone/src/main/java/cn/iocoder/yudao/module/interphone/retry/TokenExpiredRetryHandler.java

@ -29,7 +29,7 @@ public class TokenExpiredRetryHandler implements RetryHandler {
// 方式2:业务码判断 // 方式2:业务码判断
String body = response.getBody(); String body = response.getBody();
if (body != null && if (body != null &&
(body.contains("\"code\":40101") || body.contains("token expired") || body.contains("登录过期"))) {
(body.contains("\"code\":40102") || body.contains("token expired") || body.contains("登录过期"))) {
tokenManager.forceRefreshToken(); tokenManager.forceRefreshToken();
return RetryDecision.retryAfterTokenRefresh(); return RetryDecision.retryAfterTokenRefresh();
} }

53
cc-admin-master/yudao-module-interphone/src/main/java/cn/iocoder/yudao/module/interphone/service/InterphoneApiService.java

@ -0,0 +1,53 @@
package cn.iocoder.yudao.module.interphone.service;
import java.util.Map;
public interface InterphoneApiService {
String getAgentProfile();
String getAgentList(Integer pageNo, Integer pageSize, String name);
String getAgentDetail(String id);
String getFastStats();
String getGroupName(String orgId);
String querySubordinateUser(Integer pageNo, Integer pageSize, String agentId, String orgId,
String groupId, String userName, String account);
String getAgentOrgs(Integer pageNo, Integer pageSize, String name);
String getGroupList(Integer pageNo, Integer pageSize, String name, String orgName);
String addGroup(String requestBody);
String getGroupDetail(String id);
String updateGroup(String requestBody);
String deleteGroup(String requestBody);
String getGroupMembers(String id);
String addGroupMembers(String requestBody);
String removeGroupMembers(String requestBody);
String queryGroupByUid(Map<String, String> queryParams);
String createTerminalUsers(String requestBody);
String getTerminalList(Integer pageNo, Integer pageSize, String orgId, String groupId, String name);
String getTerminalDetail(Map<String, String> queryParams);
String updateTerminalUser(String requestBody);
String deleteTerminalUser(String requestBody);
String getTerminalUserOnlineStatus(Map<String, String> queryParams);
String getRecordList(Map<String, String> queryParams);
}

470
cc-admin-master/yudao-module-interphone/src/main/java/cn/iocoder/yudao/module/interphone/service/apidoc.md

@ -0,0 +1,470 @@
# 管理平台 API 文档
Base URL
```text
https://chat.zdhlcn.com:9443/api
```
---
# 通用返回格式
```json
{
"code": 20001,
"msg": "OK",
"data": {},
"count": 0
}
```
---
# 1 用户信息
---
# 1.1 个人信息 - 代理商
### 接口
```
GET /v1/profile/agent
```
### 参数
| 参数 | 类型 | 必填 | 说明 |
| ------------ | ------ | -- | ---- |
| access_token | String | 是 | 登录凭证 |
| openid | String | 是 | 用户ID |
---
### 返回示例
```json
{
"code":20001,
"msg":"OK",
"data":{
"loginname":"broadtest",
"usertype":0,
"agentinfo":{
"id":"efad38ced1bb4ac0bf97665041db752a",
"name":"测试平台",
"contact":"测试测试",
"country_id":86,
"blance":939
}
}
}
```
---
# 2 代理商管理
---
# 2.1 代理商查询
```
GET /v1/agent/list
```
### 参数
| 参数 | 类型 | 必填 |
| ------------ | ------ | -- |
| access_token | String | 是 |
| openid | String | 是 |
| pageNo | int | 是 |
| pageSize | int | 是 |
| name | string | 否 |
---
# 2.2 查询代理商详情
```
GET /v1/agent/detail
```
### 参数
| 参数 | 类型 | 必填 |
| ------------ | ------ | -- |
| access_token | String | 是 |
| openid | String | 是 |
| id | String | 是 |
---
# 2.3 查询代理商单位群组用户数
```
GET /v1/profile/faststats
```
### 参数
| 参数 | 类型 | 必填 |
| ------------ | ------ | -- |
| access_token | String | 是 |
| openid | String | 是 |
---
### 返回示例
```json
{
"agent_count":232,
"org_count":107,
"group_count":107,
"user_count":488
}
```
---
# 3 群组相关
---
# 3.1 查询群组名称
```
GET /v1/group/getGroupName
```
### 参数
| 参数 | 类型 | 必填 |
| ------------ | ------ | -- |
| access_token | String | 是 |
| openid | String | 是 |
| orgId | String | 是 |
---
# 3.2 查询下级用户
```
GET /v1/terminal/querySubordinateUser
```
### 参数
| 参数 | 类型 | 必填 |
| ------------ | ------ | -- |
| access_token | String | 是 |
| openid | String | 是 |
| pageNo | int | 是 |
| pageSize | int | 是 |
| agentId | String | 否 |
| orgId | String | 否 |
| groupId | String | 否 |
| userName | String | 否 |
| account | String | 否 |
---
# 4 单位管理
---
# 4.1 单位查询
```
GET /v1/agent/orgs
```
### 参数
| 参数 | 类型 | 必填 |
| ------------ | ------ | -- |
| access_token | String | 是 |
| openid | String | 是 |
| pageNo | int | 是 |
| pageSize | int | 是 |
| name | string | 否 |
---
# 5 群组管理
---
# 5.1 群组查询
```
GET /v1/group/list
```
### 参数
| 参数 | 类型 | 必填 |
| ------------ | ------ | -- |
| access_token | String | 是 |
| openid | String | 是 |
| pageNo | int | 是 |
| pageSize | int | 是 |
| name | string | 否 |
| orgname | string | 否 |
---
# 5.2 添加群组
```
POST /v1/group/add
```
### 参数
| 参数 | 类型 | 必填 |
| ---------------------- | ------ | -- |
| access_token | String | 是 |
| openid | String | 是 |
| orgId | String | 是 |
| cgName | String | 是 |
| cg_speech_limit_second | int | 是 |
| remarks | String | 否 |
---
# 5.3 群组详情
```
GET /v1/group/detail
```
### 参数
| 参数 | 类型 | 必填 |
| ------------ | ------ | -- |
| access_token | String | 是 |
| openid | String | 是 |
| id | String | 是 |
---
# 5.4 编辑群组
```
POST /v1/group/updateGroup
```
### 参数
| 参数 | 类型 | 必填 |
| ---------------------- | ------ | -- |
| access_token | String | 是 |
| openid | String | 是 |
| id | String | 是 |
| cgName | String | 是 |
| cg_speech_limit_second | int | 是 |
| remarks | String | 是 |
---
# 5.5 删除群组
```
POST /v1/group/delete
```
### 参数
| 参数 | 类型 | 必填 |
| ------------ | ------ | -- |
| access_token | String | 是 |
| openid | String | 是 |
| id | String | 是 |
---
# 6 群组成员
---
# 6.1 获取群组成员
```
GET /v1/group/members
```
### 参数
| 参数 | 类型 | 必填 |
| ------------ | ------ | -- |
| access_token | String | 是 |
| openid | String | 是 |
| id | String | 是 |
---
# 6.2 添加群组成员
```
POST /v1/group/members/add
```
### 示例
```json
{
"id":"groupId",
"members":[
{
"id":"userUuid",
"user_id":5583024,
"priorities":1
}
]
}
```
---
# 6.3 移除群组成员
```
POST /v1/group/members/remove
```
---
# 6.4 获取用户群组
```
GET /v1/jsp/queryGroupByUId
```
---
# 7 对讲用户
---
# 7.1 创建用户
```
POST /v1/terminal/batch
```
### 示例
```json
{
"orgId":"uuid",
"groups":[{"id":"groupId"}],
"prefix":"test",
"accounts":["imei1","imei2"],
"cardTypes":[0,2]
}
```
---
# 7.2 用户查询
```
GET /v1/terminal/list
```
### 参数
| 参数 | 类型 |
| -------- | ------ |
| pageNo | int |
| pageSize | int |
| org_id | String |
| groupId | String |
| name | String |
---
# 7.3 用户详情
```
GET /v1/terminal/detail
```
---
# 7.4 修改用户信息
```
POST /v1/terminal/updateUser
```
---
# 7.5 删除用户
```
POST /v1/terminal/deleteUser
```
---
# 7.6 查询用户在线状态
```
GET /v1/terminal/userOnlineStatus
```
---
# 8 录音
---
# 8.1 查询录音
```
GET /v1/record/list
```
---
# 接口模块结构
```
用户
├─ 个人信息
代理商
├─ 查询
├─ 详情
├─ 统计
单位
├─ 查询
群组
├─ 查询
├─ 创建
├─ 编辑
├─ 删除
群组成员
├─ 获取
├─ 添加
├─ 删除
对讲用户
├─ 创建
├─ 查询
├─ 详情
├─ 修改
├─ 删除
├─ 在线状态
录音
├─ 查询
```

207
cc-admin-master/yudao-module-interphone/src/main/java/cn/iocoder/yudao/module/interphone/service/impl/InterphoneApiServiceImpl.java

@ -0,0 +1,207 @@
package cn.iocoder.yudao.module.interphone.service.impl;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.module.interphone.core.ApiClient;
import cn.iocoder.yudao.module.interphone.core.ApiRequest;
import cn.iocoder.yudao.module.interphone.core.ApiResponse;
import cn.iocoder.yudao.module.interphone.service.InterphoneApiService;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import java.util.LinkedHashMap;
import java.util.Map;
@Service
@Validated
public class InterphoneApiServiceImpl implements InterphoneApiService {
private final ApiClient apiClient;
public InterphoneApiServiceImpl(ApiClient apiClient) {
this.apiClient = apiClient;
}
@Override
public String getAgentProfile() {
return executeGet("/profile/agent");
}
@Override
public String getAgentList(Integer pageNo, Integer pageSize, String name) {
Map<String, String> queryParams = new LinkedHashMap<>();
putIfNotNull(queryParams, "pageNo", pageNo);
putIfNotNull(queryParams, "pageSize", pageSize);
putIfHasText(queryParams, "name", name);
return executeGet("/agent/list", queryParams);
}
@Override
public String getAgentDetail(String id) {
return executeGet("/agent/detail", Map.of("id", id));
}
@Override
public String getFastStats() {
return executeGet("/profile/faststats");
}
@Override
public String getGroupName(String orgId) {
return executeGet("/group/getGroupName", Map.of("orgId", orgId));
}
@Override
public String querySubordinateUser(Integer pageNo, Integer pageSize, String agentId, String orgId,
String groupId, String userName, String account) {
Map<String, String> queryParams = new LinkedHashMap<>();
putIfNotNull(queryParams, "pageNo", pageNo);
putIfNotNull(queryParams, "pageSize", pageSize);
putIfHasText(queryParams, "agentId", agentId);
putIfHasText(queryParams, "orgId", orgId);
putIfHasText(queryParams, "groupId", groupId);
putIfHasText(queryParams, "userName", userName);
putIfHasText(queryParams, "account", account);
return executeGet("/terminal/querySubordinateUser", queryParams);
}
@Override
public String getAgentOrgs(Integer pageNo, Integer pageSize, String name) {
Map<String, String> queryParams = new LinkedHashMap<>();
putIfNotNull(queryParams, "pageNo", pageNo);
putIfNotNull(queryParams, "pageSize", pageSize);
putIfHasText(queryParams, "name", name);
return executeGet("/agent/orgs", queryParams);
}
@Override
public String getGroupList(Integer pageNo, Integer pageSize, String name, String orgName) {
Map<String, String> queryParams = new LinkedHashMap<>();
putIfNotNull(queryParams, "pageNo", pageNo);
putIfNotNull(queryParams, "pageSize", pageSize);
putIfHasText(queryParams, "name", name);
putIfHasText(queryParams, "orgname", orgName);
return executeGet("/group/list", queryParams);
}
@Override
public String addGroup(String requestBody) {
return executePost("/group/add", requestBody);
}
@Override
public String getGroupDetail(String id) {
return executeGet("/group/detail", Map.of("id", id));
}
@Override
public String updateGroup(String requestBody) {
return executePost("/group/updateGroup", requestBody);
}
@Override
public String deleteGroup(String requestBody) {
return executePost("/group/delete", requestBody);
}
@Override
public String getGroupMembers(String id) {
return executeGet("/group/members", Map.of("id", id));
}
@Override
public String addGroupMembers(String requestBody) {
return executePost("/group/members/add", requestBody);
}
@Override
public String removeGroupMembers(String requestBody) {
return executePost("/group/members/remove", requestBody);
}
@Override
public String queryGroupByUid(Map<String, String> queryParams) {
return executeGet("/jsp/queryGroupByUId", queryParams);
}
@Override
public String createTerminalUsers(String requestBody) {
return executePost("/terminal/batch", requestBody);
}
@Override
public String getTerminalList(Integer pageNo, Integer pageSize, String orgId, String groupId, String name) {
Map<String, String> queryParams = new LinkedHashMap<>();
putIfNotNull(queryParams, "pageNo", pageNo);
putIfNotNull(queryParams, "pageSize", pageSize);
putIfHasText(queryParams, "org_id", orgId);
putIfHasText(queryParams, "groupId", groupId);
putIfHasText(queryParams, "name", name);
return executeGet("/terminal/list", queryParams);
}
@Override
public String getTerminalDetail(Map<String, String> queryParams) {
return executeGet("/terminal/detail", queryParams);
}
@Override
public String updateTerminalUser(String requestBody) {
return executePost("/terminal/updateUser", requestBody);
}
@Override
public String deleteTerminalUser(String requestBody) {
return executePost("/terminal/deleteUser", requestBody);
}
@Override
public String getTerminalUserOnlineStatus(Map<String, String> queryParams) {
return executeGet("/terminal/userOnlineStatus", queryParams);
}
@Override
public String getRecordList(Map<String, String> queryParams) {
return executeGet("/record/list", queryParams);
}
private String executeGet(String path) {
return executeGet(path, null);
}
private String executeGet(String path, Map<String, String> queryParams) {
ApiRequest request = ApiRequest.get(path, sanitizeQueryParams(queryParams));
ApiResponse response = apiClient.execute(request);
return response.getBody();
}
private String executePost(String path, String requestBody) {
ApiRequest request = ApiRequest.postJson(path, StrUtil.emptyToDefault(requestBody, ""));
ApiResponse response = apiClient.execute(request);
return response.getBody();
}
private Map<String, String> sanitizeQueryParams(Map<String, String> queryParams) {
if (queryParams == null || queryParams.isEmpty()) {
return null;
}
Map<String, String> sanitized = new LinkedHashMap<>();
queryParams.forEach((key, value) -> {
if (value != null) {
sanitized.put(key, value);
}
});
return sanitized.isEmpty() ? null : sanitized;
}
private void putIfHasText(Map<String, String> queryParams, String key, String value) {
if (StrUtil.isNotBlank(value)) {
queryParams.put(key, value);
}
}
private void putIfNotNull(Map<String, String> queryParams, String key, Object value) {
if (value != null) {
queryParams.put(key, String.valueOf(value));
}
}
}

76
cc-admin-master/yudao-server/src/main/resources/logback-spring.xml

@ -0,0 +1,76 @@
<configuration>
<!-- 引用 Spring Boot 的 logback 基础配置 -->
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<!-- 变量 yudao.info.base-package,基础业务包 -->
<springProperty scope="context" name="yudao.info.base-package" source="yudao.info.base-package"/>
<!-- 格式化输出:%d 表示日期,%X{tid} SkWalking 链路追踪编号,%thread 表示线程名,%-5level:级别从左显示 5 个字符宽度,%msg:日志消息,%n是换行符 -->
<property name="PATTERN_DEFAULT" value="%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} | %highlight(${LOG_LEVEL_PATTERN:-%5p} ${PID:- }) | %boldYellow(%thread [%tid]) %boldGreen(%-40.40logger{39}) | %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
<!-- 控制台 Appender -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">     
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
<pattern>${PATTERN_DEFAULT}</pattern>
</layout>
</encoder>
</appender>
<!-- 文件 Appender -->
<!-- 参考 Spring Boot 的 file-appender.xml 编写 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
<pattern>${PATTERN_DEFAULT}</pattern>
</layout>
</encoder>
<!-- 日志文件名 -->
<file>${LOG_FILE}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 滚动后的日志文件名 -->
<fileNamePattern>${LOGBACK_ROLLINGPOLICY_FILE_NAME_PATTERN:-${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz}</fileNamePattern>
<!-- 启动服务时,是否清理历史日志,一般不建议清理 -->
<cleanHistoryOnStart>${LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START:-false}</cleanHistoryOnStart>
<!-- 日志文件,到达多少容量,进行滚动 -->
<maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-10MB}</maxFileSize>
<!-- 日志文件的总大小,0 表示不限制 -->
<totalSizeCap>${LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP:-0}</totalSizeCap>
<!-- 日志文件的保留天数 -->
<maxHistory>${LOGBACK_ROLLINGPOLICY_MAX_HISTORY:-30}</maxHistory>
</rollingPolicy>
</appender>
<!-- 异步写入日志,提升性能 -->
<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<!-- 不丢失日志。默认的,如果队列的 80% 已满,则会丢弃 TRACT、DEBUG、INFO 级别的日志 -->
<discardingThreshold>0</discardingThreshold>
<!-- 更改默认的队列的深度,该值会影响性能。默认值为 256 -->
<queueSize>256</queueSize>
<appender-ref ref="FILE"/>
</appender>
<!-- SkyWalking GRPC 日志收集,实现日志中心。注意:SkyWalking 8.4.0 版本开始支持 -->
<appender name="GRPC" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
<pattern>${PATTERN_DEFAULT}</pattern>
</layout>
</encoder>
</appender>
<!-- 本地环境 -->
<springProfile name="local">
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="GRPC"/> <!-- 本地环境下,如果不想接入 SkyWalking 日志服务,可以注释掉本行 -->
<appender-ref ref="ASYNC"/> <!-- 本地环境下,如果不想打印日志,可以注释掉本行 -->
</root>
</springProfile>
<!-- 其它环境 -->
<springProfile name="dev,test,stage,prod,default">
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="ASYNC"/>
<appender-ref ref="GRPC"/>
</root>
</springProfile>
</configuration>
Loading…
Cancel
Save