Initial commit

This commit is contained in:
Docker7530
2026-03-01 01:43:46 +08:00
commit c6125c117b
3840 changed files with 415340 additions and 0 deletions
@@ -0,0 +1,562 @@
在线地址:[toB命中率及穿透率统计分析 (qq.com)](https://docs.qq.com/doc/DZVpYaU5vRVFqdGpJ)
# 1 查询命中率
**接口地址** `/pdga/toB/hit-rate/query`
**请求方式** `POST`
**请求格式** `application/json`
---
## 请求参数
| 参数名 | 类型 | 是否必填 | 描述 |
| ------------ | ------ | ---- | ----------------------------------- |
| startTime | String | 是 | 查询的开始时间,格式为 `yyyy-MM-dd HH:mm:ss` |
| endTime | String | 是 | 查询的结束时间,格式为 `yyyy-MM-dd HH:mm:ss` |
| granularity | String | 是 | 时间粒度,枚举值:`5m`5 分钟),`1h`(小时),`1d`(天) |
| domain | String | 否 | 加速域名 |
| protocolType | String | 否 | 协议类型,枚举值:`HTTP``HTTPS` |
**请求示例**
```json
{
"startTime": "2024-08-14 00:00:00",
"endTime": "2024-08-14 23:00:00",
"granularity": "5m",
"domain": "example.com",
"protocolType": "HTTPS"
}
```
---
## 响应参数
| 参数名 | 类型 | 描述 |
| ----------- | ------- | -------------------------------------- |
| status | String | 请求的结果状态,`success` 表示成功,`error` 表示失败 |
| errCode | Integer | 错误码,`0` 表示成功,其他值表示错误(具体错误码见错误码表) |
| message | String | 详细描述请求结果的信息,通常用于错误时说明原因 |
| maxTime | String | 返回命中率最高时刻的时间,格式为 `yyyy-MM-dd HH:mm:ss` |
| maxHitRate | Double | 返回的最大命中率值,四舍五入两位小数(单位:%) |
| hitRateList | Array | 时间区间内的命中率列表,包含时间点及对应的命中率值 |
**hitRateList 字段详情**
| 参数名 | 类型 | 描述 |
| ----- | ------ | -------------------------------- |
| time | String | 对应的时间点,格式为 `yyyy-MM-dd HH:mm:ss` |
| value | Double | 对应时间点的命中率值,四舍五入两位小数(单位:%) |
**响应示例**
```json
{
"status": "success",
"errCode": 0,
"message": "请求成功。",
"maxTime": "2024-08-14 12:00:00",
"maxHitRate": 69.76,
"hitRateList": [
{
"time": "2024-08-14 12:00:00",
"value": 69.76
},
{
"time": "2024-08-14 12:05:00",
"value": 69.76
},
{
"time": "2024-08-14 12:10:00",
"value": 69.64
},
{
"time": "2024-08-14 12:15:00",
"value": 69.53
},
{
"time": "2024-08-14 12:20:00",
"value": 69.41
},
{
"time": "2024-08-14 12:25:00",
"value": 69.3
},
{
"time": "2024-08-14 12:30:00",
"value": 69.19
},
{
"time": "2024-08-14 12:35:00",
"value": 69.08
},
{
"time": "2024-08-14 12:40:00",
"value": 68.97
},
{
"time": "2024-08-14 12:45:00",
"value": 68.86
},
{
"time": "2024-08-14 12:50:00",
"value": 68.75
},
{
"time": "2024-08-14 12:55:00",
"value": 68.64
}
]
}
```
---
## 说明
- `startTime``endTime` 必须指定,且 `endTime` 必须晚于 `startTime`
- `granularity` 决定了返回的时间间隔数据,分别为 5 分钟、1 小时或 1 天的命中率数据。
- `domain` 为选填项,查询指定域名的命中率。
- 响应中的 `maxHitRate` 为时间区间内的最大命中率,`maxTime` 为其对应的时间点。
- `status` 字段用于快速标识请求的整体结果,而 `message` 字段提供详细说明。
# 2 查询调度次数
**接口地址** `/pdga/toB/scheduling-count/query`
**请求方式** `POST`
**请求格式** `application/json`
---
## 请求参数
| 参数名 | 类型 | 是否必填 | 描述 |
| ------------ | ------ | ---- | ----------------------------------- |
| startTime | String | 是 | 查询的开始时间,格式为 `yyyy-MM-dd HH:mm:ss` |
| endTime | String | 是 | 查询的结束时间,格式为 `yyyy-MM-dd HH:mm:ss` |
| granularity | String | 是 | 时间粒度,枚举值:`5m`5 分钟),`1h`(小时),`1d`(天) |
| domain | String | 否 | 加速域名 |
| protocolType | String | 否 | 协议类型,枚举值:`HTTP``HTTPS` |
**请求示例**
```json
{
"startTime": "2024-08-14 00:00:00",
"endTime": "2024-08-14 23:00:00",
"granularity": "5m",
"domain": "example.com",
"protocolType": "HTTPS"
}
```
---
## 响应参数
| 参数名 | 类型 | 描述 |
| -------------- | ------- | --------------------------------------- |
| status | String | 请求的结果状态,`success` 表示成功,`error` 表示失败 |
| errCode | Integer | 错误码,`0` 表示成功,其他值表示错误(具体错误码见错误码表) |
| message | String | 详细描述请求结果的信息,通常用于错误时说明原因 |
| peakTime | String | 返回调度次数峰值时刻的时间,格式为 `yyyy-MM-dd HH:mm:ss` |
| peakTotalCount | Long | 返回的峰值调度次数 |
| peakHitCount | Long | 返回的峰值命中次数 |
| peakBackCount | Long | 返回的峰值回源次数 |
| countList | Array | 时间区间内的调度次数列表,包含时间点及对应的调度次数、命中次数、回源次数 |
**countList 字段详情**
| 参数名 | 类型 | 描述 |
| ----- | ------ | -------------------------------- |
| time | String | 对应的时间点,格式为 `yyyy-MM-dd HH:mm:ss` |
| total | Long | 对应时间点的总调度次数 |
| hit | Long | 对应时间点的命中次数 |
| back | Long | 对应时间点的回源次数 |
**响应示例**
```json
{
"status": "success",
"errCode": 0,
"message": "请求成功。",
"peakTime": "2024-08-14 12:55:00",
"peakTotalCount": 3540,
"peakHitCount": 2430,
"peakBackCount": 1110,
"countList": [
{
"time": "2024-08-14 12:00:00",
"total": 3340,
"hit": 2330,
"back": 1010
},
{
"time": "2024-08-14 12:05:00",
"total": 3340,
"hit": 2330,
"back": 1010
},
{
"time": "2024-08-14 12:10:00",
"total": 3360,
"hit": 2340,
"back": 1020
},
{
"time": "2024-08-14 12:15:00",
"total": 3380,
"hit": 2350,
"back": 1030
},
{
"time": "2024-08-14 12:20:00",
"total": 3400,
"hit": 2360,
"back": 1040
},
{
"time": "2024-08-14 12:25:00",
"total": 3420,
"hit": 2370,
"back": 1050
},
{
"time": "2024-08-14 12:30:00",
"total": 3440,
"hit": 2380,
"back": 1060
},
{
"time": "2024-08-14 12:35:00",
"total": 3460,
"hit": 2390,
"back": 1070
},
{
"time": "2024-08-14 12:40:00",
"total": 3480,
"hit": 2400,
"back": 1080
},
{
"time": "2024-08-14 12:45:00",
"total": 3500,
"hit": 2410,
"back": 1090
},
{
"time": "2024-08-14 12:50:00",
"total": 3520,
"hit": 2420,
"back": 1100
},
{
"time": "2024-08-14 12:55:00",
"total": 3540,
"hit": 2430,
"back": 1110
}
]
}
```
---
## 说明
- `startTime``endTime` 必须指定,且 `endTime` 必须晚于 `startTime`
- `granularity` 决定了返回的时间间隔数据,分别为 5 分钟、1 小时或 1 天的调度次数数据。
- `domain` 为选填项,查询指定域名的调度次数。
- 响应中的 `peakTotalCount` 为时间区间内的峰值调度次数,`peakTime` 为其对应的时间点。
- `status` 字段用于快速标识请求的整体结果,而 `message` 字段提供详细说明。
# 3 查询穿透率
**接口地址** `/pdga/toB/penetration-rate/query`
**请求方式** `POST`
**请求格式** `application/json`
---
## 请求参数
| 参数名 | 类型 | 是否必填 | 描述 |
| ----------- | ------ | ---- | ------------------------------------------------------------- |
| startTime | String | 是 | 查询的开始时间,格式为 `yyyy-MM-dd HH:mm:ss` |
| endTime | String | 是 | 查询的结束时间,格式为 `yyyy-MM-dd HH:mm:ss` |
| granularity | String | 是 | 时间粒度,枚举值:`5m`5 分钟),`1h`(小时),`1d`(天) |
| natType | String | 否 | NAT 类型,枚举值:`0`(没有 NAT),`1`(全锥型),`2`IP 受限型),`3`(端口受限型),`4`(对称型) |
**请求示例**
```json
{
"startTime": "2024-08-21 00:00:00",
"endTime": "2024-08-21 08:00:00",
"granularity": "5m",
"natType": 1
}
```
---
## 响应参数
| 参数名 | 类型 | 描述 |
| ------------------- | ------- | ---------------------------------------- |
| status | String | 请求的结果状态,`success` 表示成功,`error` 表示失败 |
| errCode | Integer | 错误码,`0` 表示成功,其他值表示错误(具体错误码见错误码表) |
| message | String | 详细描述请求结果的信息,通常用于错误时说明原因 |
| maxTime | String | 返回穿透成功率最高时刻的时间,格式为 `yyyy-MM-dd HH:mm:ss` |
| maxPenetrationRate | Double | 返回的最大穿透成功率值(单位:%) |
| penetrationRateList | Array | 时间区间内的穿透成功率列表,包含时间点及对应的穿透成功率值 |
**penetrationRateList 字段详情**
| 参数名 | 类型 | 描述 |
| ------ | ------ | ------------------------------------------ |
| time | String | 对应的时间点,格式为 `yyyy-MM-dd HH:mm:ss` |
| value | Double | 对应时间点的穿透成功率值(单位:%) |
**响应示例**
```json
{
"status": "success",
"errCode": 0,
"message": "请求成功。",
"maxTime": "2024-08-14 12:00:00",
"maxPenetrationRate": 69.76,
"penetrationRateList": [
{
"time": "2024-08-14 12:00:00",
"value": 69.76
},
{
"time": "2024-08-14 12:05:00",
"value": 69.76
},
{
"time": "2024-08-14 12:10:00",
"value": 69.64
},
{
"time": "2024-08-14 12:15:00",
"value": 69.53
},
{
"time": "2024-08-14 12:20:00",
"value": 69.41
},
{
"time": "2024-08-14 12:25:00",
"value": 69.3
},
{
"time": "2024-08-14 12:30:00",
"value": 69.19
},
{
"time": "2024-08-14 12:35:00",
"value": 69.08
},
{
"time": "2024-08-14 12:40:00",
"value": 68.97
},
{
"time": "2024-08-14 12:45:00",
"value": 68.86
},
{
"time": "2024-08-14 12:50:00",
"value": 68.75
},
{
"time": "2024-08-14 12:55:00",
"value": 68.64
}
]
}
```
---
## 说明
- `startTime``endTime` 必须指定,且 `endTime` 必须晚于 `startTime`
- `granularity` 决定了返回的时间间隔数据,分别为 5 分钟、1 小时或 1 天的穿透成功率数据。
- `natType` 为选填项,用于指定不同的 NAT 类型进行穿透成功率的查询。
- 响应中的 `maxPenetrationRate` 为时间区间内的最大穿透成功率,`maxTime` 为其对应的时间点。
- `status` 字段用于快速标识请求的整体结果,而 `message` 字段提供详细说明。
# 4 调度穿透次数查询接口
**接口地址** `/pdga/toB/penetration-count/query`
**请求方式** `POST`
**请求格式** `application/json`
---
## 请求参数
| 参数名 | 类型 | 是否必填 | 描述 |
| ----------- | ------ | ---- | ------------------------------------------------------------- |
| startTime | String | 是 | 查询的开始时间,格式为 `yyyy-MM-dd HH:mm:ss` |
| endTime | String | 是 | 查询的结束时间,格式为 `yyyy-MM-dd HH:mm:ss` |
| granularity | String | 是 | 时间粒度,枚举值:`5m`5 分钟),`1h`(小时),`1d`(天) |
| natType | String | 否 | NAT 类型,枚举值:`0`(没有 NAT),`1`(全锥型),`2`IP 受限型),`3`(端口受限型),`4`(对称型) |
**请求示例**
```json
{
"startTime": "2024-08-21 00:00:00",
"endTime": "2024-08-21 08:00:00",
"granularity": "5m",
"natType": 1
}
```
---
## 响应参数
| 参数名 | 类型 | 描述 |
| ---------------- | ------- | ----------------------------------------- |
| status | String | 请求的结果状态,`success` 表示成功,`error` 表示失败 |
| errCode | Integer | 错误码,`0` 表示成功,其他值表示错误(具体错误码见错误码表) |
| message | String | 详细描述请求结果的信息,通常用于错误时说明原因 |
| peakTime | String | 返回穿透次数峰值时刻的时间,格式为 `yyyy-MM-dd HH:mm:ss` |
| peakTotalCount | Long | 返回的峰值穿透次数 |
| peakSuccessCount | Long | 返回的峰值穿透成功次数 |
| peakFailureCount | Long | 返回的峰值穿透失败次数 |
| countList | Array | 时间区间内的穿透次数列表,包含时间点及对应的总穿透次数、穿透成功次数、穿透失败次数 |
**countList 字段详情**
| 参数名 | 类型 | 描述 |
| ------- | ------ | -------------------------------- |
| time | String | 对应的时间点,格式为 `yyyy-MM-dd HH:mm:ss` |
| total | Long | 对应时间点的总穿透次数 |
| success | Long | 对应时间点的穿透成功次数 |
| failure | Long | 对应时间点的穿透失败次数 |
**响应示例**
```json
{
"status": "success",
"errCode": 0,
"message": "请求成功。",
"peakTime": "2024-08-14 12:55:00",
"peakTotalCount": 3540,
"peakSuccessCount": 2430,
"peakFailureCount": 1110,
"countList": [
{
"time": "2024-08-14 12:00:00",
"total": 3340,
"success": 2330,
"failure": 1010
},
{
"time": "2024-08-14 12:05:00",
"total": 3340,
"success": 2330,
"failure": 1010
},
{
"time": "2024-08-14 12:10:00",
"total": 3360,
"success": 2340,
"failure": 1020
},
{
"time": "2024-08-14 12:15:00",
"total": 3380,
"success": 2350,
"failure": 1030
},
{
"time": "2024-08-14 12:20:00",
"total": 3400,
"success": 2360,
"failure": 1040
},
{
"time": "2024-08-14 12:25:00",
"total": 3420,
"success": 2370,
"failure": 1050
},
{
"time": "2024-08-14 12:30:00",
"total": 3440,
"success": 2380,
"failure": 1060
},
{
"time": "2024-08-14 12:35:00",
"total": 3460,
"success": 2390,
"failure": 1070
},
{
"time": "2024-08-14 12:40:00",
"total": 3480,
"success": 2400,
"failure": 1080
},
{
"time": "2024-08-14 12:45:00",
"total": 3500,
"success": 2410,
"failure": 1090
},
{
"time": "2024-08-14 12:50:00",
"total": 3520,
"success": 2420,
"failure": 1100
},
{
"time": "2024-08-14 12:55:00",
"total": 3540,
"success": 2430,
"failure": 1110
}
]
}
```
---
## 说明
- `startTime``endTime` 必须指定,且 `endTime` 必须晚于 `startTime`
- `granularity` 决定了返回的时间间隔数据,分别为 5 分钟、1 小时或 1 天的穿透成功率数据。
- `natType` 为选填项,用于指定不同的 NAT 类型进行穿透成功率的查询。
- 响应中的 `maxPenetrationRate` 为时间区间内的最大穿透成功率,`maxTime` 为其对应的时间点。
- `status` 字段用于快速标识请求的整体结果,而 `message` 字段提供详细说明。
# 错误码表
| 错误码 | 描述 |
| ---- | --------- |
| 0 | 成功 |
| 1001 | 参数缺失或格式错误 |
| 1002 | 时间区间不合法 |
| 1003 | 数据查询失败 |
@@ -0,0 +1,54 @@
# 仓库地址
http://git.komect.net/NRWLXT/hcdn-csc.git
开发主分支用这个:pcdnVodInit_20240528
# 测试环境
```
服务器:
ssh root@172.21.174.166 @6ZxfZdX*4
组件
数据库:
172.21.174.1663306
mysql -h 127.0.0.1 -uroot -P 3306 -pDispatch@2020 库:csc_data
redis
/usr/local/bin/redis-cli --raw -c -h 172.21.174.166 -p 6379 -a redis@#$
```
# 管理页面
```
http://172.21.174.166:443/#/
账号:superadmin
密码:<6yj7\i777HU
```
# 需求开发
1. 命中率、穿透率精确到几位小数?四舍五入原则吗?
4 位小数,遵循四舍五入原则。举例:小数形式:0.9812 百分号形式:98.12%
# Ng 操作
```
# 放子轩给的配置文件,注意改路径。
include /etc/nginx/cscng/*.conf;
start nginx
tasklist /fi "imagename eq nginx.exe"
nginx -t
nginx -s reload
nginx -s stop
nginx -s quit
```
@@ -0,0 +1,664 @@
【金山文档 | WPS云文档】 网关 API 文档
https://kdocs.cn/l/cboRgHwJiGUI
# 网关实例 API 文档
## 1. 分页查询网关实例列表
接口地址: `GET /gateway/instance/list`
请求参数:
`?pageNum=1&pageSize=10&ip=127&port=8080&healthStatus=false&syncStatus=false&enabled=false`
- `pageNum` (可选):页码,默认1
- `pageSize` (可选):每页大小,默认10
- `ip`(可选):网关实例IP,支持模糊
- `port`(可选):网关实例端口
- `healthStatus`(可选):健康状态 true 和 false
- `syncStatus`(可选):配置同步状态 true 和 false
- `enabled`(可选):是否启用 true 和 false
响应示例:
```json
{
"total": 1,
"rows": [
{
"id": 1,
"ip": "127.0.0.1",
"port": "8080",
"healthStatus": false,
"healthCheckTime": "2025-07-29 15:36:29",
"syncStatus": false,
"syncTime": null,
"enabled": false
}
],
"code": 200,
"msg": "查询成功"
}
```
## 2. 配置同步接口
接口地址
`POST /gateway/instance/sync/{instanceId}`
响应示例
```json
{
"id": 10001,
"status": true,
"time": "2024-05-18 14:33:55"
}
```
## 3. 状态刷新接口
接口地址
`GET /gateway/instance/refresh/{instanceId}`
响应示例
```json
{
"id": 10001,
"status": true,
"time": "2024-05-18 14:33:55"
}
```
## 4. 配置查询接口
接口地址
`GET /gateway/instance/config/detail/{instanceId}`
响应示例
```
待补充
```
# 网关服务实例管理 API 文档
## 1. 分页查询网关服务实例
接口地址: `GET /gateway/service-instance/list`
请求参数:
- `name` (可选): 服务实例名称,支持模糊搜索
- `mode` (可选): 转发模式,0-负载均衡,1-静态地址
- `pageNum` (可选): 页码,默认1
- `pageSize` (可选): 每页大小,默认10
响应示例:
```json
{
"total": 2,
"rows": [
{
"serviceId": 2,
"name": "mock-uri",
"mode": 0,
"uris": [
{
"id": 2,
"serviceId": 2,
"uri": "https://mock.p.cdn.10086.cn",
"enabled": 1
}
]
},
{
"serviceId": 1,
"name": "portal-dev",
"mode": 0,
"uris": [
{
"id": 1,
"serviceId": 1,
"uri": "http://127.0.0.1:8080",
"enabled": 1
}
]
}
],
"code": 200,
"msg": "查询成功"
}
```
## 2. 批量更新网关服务实例
接口地址: `POST /gateway/service-instance/batch-update`
请求体示例:
```json
{
"deleteServiceIds": [
// 3,
5
],
"addServiceInstances": [
// {
// "name": "new-service5",
// "mode": 0,
// "uris": [
// {
// "uri": "http://new-service.com",
// "enabled": 1
// }
// ]
// }
],
"updateServiceInstances": [
{
"serviceId": 3,
"name": "updated-portal-dev",
"mode": 1,
"uris": [
{
"uri": "http://updated.127.0.0.1:8080",
"enabled": 1
},
{
"uri": "http://backup.127.0.0.1:8080",
"enabled": 0
}
]
}
]
}
```
响应示例:
```json
{
"code": 200,
"msg": "批量更新服务实例配置成功",
"data": null
}
{
"code": 400,
"msg": "批量更新服务实例配置失败: 服务实例名称已存在: new-service",
"data": null
}
{
"code": 200,
"msg": "批量更新服务实例配置成功",
"data": null
}
```
## 3. 获取服务实例ID和名称对应关系
接口地址: `GET /gateway/service-instance/id-name-map`
响应示例:
```json
{
"code": 200,
"msg": "操作成功",
"data": {
"1": "portal-dev",
"2": "mock-uri",
"3": "updated-portal-dev"
}
}
```
# 网关路由配置管理 API 文档
## 1. 分页查询网关路由配置
接口地址:`GET /gateway/config/list`
请求参数:
- `routeName` (可选): 路由名称,支持模糊搜索
- `serviceId` (可选): 服务实例ID
- `enabled` (可选): 是否启用,true-启用,false-禁用
- `pageNum` (可选): 页码,默认1
- `pageSize` (可选): 每页大小,默认10
**响应示例:**
```json
{
"code": 200,
"msg": "查询成功",
"total": 2,
"rows": [
{
"routeId": 1,
"routeName": "portal-api",
"serviceId": 1,
"serviceName": "portal-dev",
"remark": "门户API路由",
"order": 0,
"enabled": true,
"paths": ["/api/portal/**", "/portal/**"],
"methods": ["GET", "POST"],
"requestParams": [
{"version": "v1"},
{"source": "web"}
],
"createTime": "2024-01-15 10:30:00",
"updateTime": "2024-01-15 10:30:00"
},
{
"routeId": 2,
"routeName": "user-service",
"serviceId": 2,
"serviceName": "mock-uri",
"remark": "用户服务路由",
"order": 1,
"enabled": true,
"paths": ["/api/user/**"],
"methods": ["GET", "POST", "PUT", "DELETE"],
"requestParams": [],
"createTime": "2024-01-15 11:00:00",
"updateTime": "2024-01-15 11:00:00"
}
]
}
```
## 2. 批量更新网关路由配置
接口地址:`POST /gateway/config/batch-update`
请求体示例:
```json
{
"deleteRouteIds": [
3
],
"addRoutes": [
{
"routeName": "new-api-route5",
"serviceId": 3,
"remark": "新增API路由",
"priority": 0,
"enabled": true,
"paths": [
{
"path": "/api/new/**"
}
],
"methods": [
{
"method": "GET"
},
{
"method": "POST"
}
],
"params": [
{
"paramName": "version",
"paramValue": "v2"
}
]
}
],
"updateRoutes": [
{
"routeId": 4,
"routeName": "updated-portal-api4",
"serviceId": 2,
"remark": "更新后的门户API路由",
"priority": 1,
"enabled": false,
"paths": [
{
"path": "/api/portal/v2/**"
},
{
"path": "/portal/new/**"
}
],
"methods": [
{
"method": "GET"
},
{
"method": "POST"
},
{
"method": "PUT"
}
],
"params": [
{
"paramName": "version",
"paramValue": "v2"
},
{
"paramName": "client",
"paramValue": "web"
}
]
}
]
}
```
响应示例:
```json
{
"code": 200,
"msg": "批量更新路由配置成功",
"data": null
}
```
# 获取网关转发记录
## 1. 分页查询网关转发记录列表
接口地址:`GET /gateway/record/list`
请求参数:
- `pageNum` (可选):页码,默认1
- `pageSize` (可选):每页大小,默认10
- `uuid` (可选):请求UUID
- `requestUrl` (可选):接口路径,支持模糊搜索
- `method` (可选):请求方法,如GET、POST等
- `targetEndpoint` (可选):目的地址
- `httpCode` (可选):请求响应码
- `traceId` (可选):链路追踪ID
- `gatewayEndpoint` (可选):网关地址
- `routeId` (可选):请求匹配的路由ID
- `routeName` (可选):路由名称
- `requestTimeStart` (可选):请求开始时间,格式:yyyy-MM-dd HH:mm:ss
- `requestTimeEnd` (可选):请求结束时间,格式:yyyy-MM-dd HH:mm:ss
- `minCostTime` (可选):最小耗时(ms)
- `maxCostTime` (可选):最大耗时(ms)
响应示例:
```json
{
"total": 2,
"rows": [
{
"recordId": 91041,
"uuid": "4c091ee8-8fc6-4796-8b4e-34f3cc2bda15",
"requestTime": "2025-07-29 15:15:03",
"requestUrl": "/api/v1/payment/callback",
"method": "GET",
"targetEndpoint": "192.168.1.102:8080",
"httpCode": 400,
"traceId": "4c091ee88fc64796",
"gatewayEndpoint": "192.168.208.18:8087",
"routeId": 2,
"routeName": "IBS->BBoss",
"costTime": 67
},
{
"recordId": 70130,
"uuid": "925d255e-26b0-45a9-9944-3e37b195f38c",
"requestTime": "2025-07-29 15:12:42",
"requestUrl": "/api/v1/user/logout",
"method": "PUT",
"targetEndpoint": "192.168.1.100:8080",
"httpCode": 200,
"traceId": "925d255e26b045a9",
"gatewayEndpoint": "192.168.208.16:8087",
"routeId": 2,
"routeName": "IBS->BBoss",
"costTime": 394
}
],
"code": 200,
"msg": "查询成功"
}
```
## 2. 根据记录ID获取详情信息
接口地址:`GET /gateway/record/detail/{recordId}`
路径参数:
- `recordId`:记录ID
响应示例:
```json
{
"code": 200,
"msg": "操作成功",
"data": {
"requestParam": "{aaa=[111, 222], bbb=[333]}",
"requestBody": "{\r\n \"content\": {\r\n \"ECID\": \"ECID1695801457\",\r\n \"OrderType\": \"2\", // 1:试用申请 2:业务开通 3:试用变更 4:试用暂停 5:试用恢复 6:业务注销 7:试用删除\r\n \"ProductID\": \"AA11131040\",\r\n \"ProvID\": \"000\", // 主办省代码\r\n \"TrialNo\": \"TEST20241111001\",\r\n // \"Domain\": [\r\n // \"www.zphconflict10241513.com.99.cdnhwcqir15.com\",\r\n // ],\r\n \"BusiType\": \"1\", // 1、点播下载网页类; 4、直播类; 试用单/开通单必传\r\n // \"ECNumber\": \"13810151511\",\r\n // \"ECMail\": \"123@123.com\",\r\n // \"InfoSecurityTable\": \"info_security_file2.xlsx\"\r\n }\r\n}",
"requestHeaders": "[Content-Type:\"application/json\", User-Agent:\"PostmanRuntime/7.29.2\", Accept:\"*/*\", Postman-Token:\"cdc4bd2d-e7bc-481d-a390-02e848131c24\", Host:\"127.0.0.1:8087\", Accept-Encoding:\"gzip, deflate, br\", Connection:\"keep-alive\", Content-Length:\"705\"]",
"responseBody": "{\n\t\"providePartyID\":\"CDNP9950\",\n\t\"response\":{\n\t\t\"rspCode\":\"00000\",\n\t\t\"rspDesc\":\"成功\"\n\t},\n\t\"result\":\"{\\\"ResCode\\\":\\\"00\\\",\\\"ResDetail\\\":\\\"成功\\\"}\",\n\t\"transIDH\":\"1612\",\n\t\"transIDHTime\":\"20250724172043\"\n}",
"responseHeaders": "[Access-Control-Allow-Methods:\"POST, GET, OPTIONS\", Access-Control-Max-Age:\"3600\", Access-Control-Allow-Headers:\"content-type,x-requested-with,Authorization, x-request-with,x-ui-request,lang,x-csrf-token,csrf-token\", Access-Control-Allow-Credentials:\"true\", X-Content-Type-Options:\"nosniff\", X-XSS-Protection:\"1; mode=block\", Cache-Control:\"no-cache, no-store, max-age=0, must-revalidate\", Pragma:\"no-cache\", Expires:\"0\", Content-Type:\"application/json\", Content-Length:\"205\", Date:\"Thu, 24 Jul 2025 09:20:43 GMT\"]"
}
}
```
错误响应示例:
```json
{
"code": 500,
"msg": "记录不存在或详情信息为空",
"data": null
}
```
## 3. 获取数据看板统计信息
接口地址:`GET /gateway/record/dashboard`
请求参数:
- `startTime` (必填):开始时间,格式:yyyy-MM-dd
- `endTime` (必填):结束时间,格式:yyyy-MM-dd
请求示例:
`?startTime=2025-07-24&endTime=2025-07-31`
响应示例:
```json
{
"code": 200,
"msg": "操作成功",
"data": {
"totalRequestCount": 137116,
"requestCount": 0,
"requestCountChange": -418,
"requestCountRatio": -100.00,
"successRate": 0,
"successRateChange": -58.85,
"successRateRatio": -100.00,
"avgCostTime": 0.00,
"avgCostTimeChange": -3043.73,
"avgCostTimeRatio": -100.00
}
}
```
## 4. 获取曲线图数据
接口地址:`POST /gateway/record/chart`
请求体示例:
```json
{
"startTime": "2025-01-01",
"endTime": "2025-07-31",
"timeGranularity": "1MONTH",
"requestUrl": "/api/v2/sync/BBOSS/PreCheckServ",
"method": "GET",
"targetEndpoint": "127.0.0.1:8080",
"httpCode": 200,
"gatewayEndpoint": "192.168.208.16:8087",
"minCostTime": 2000,
"maxCostTime": 5000,
"routeId": 1
}
```
请求参数说明:
- `startTime` (必填):查询开始时间,格式:yyyy-MM-dd
- `endTime` (必填):查询结束时间,格式:yyyy-MM-dd
- `timeGranularity` (必填):时间粒度,可选值:
- `5MIN`5分钟
- `1HOUR`1小时
- `1DAY`1天
- `1WEEK`1周
- `1MONTH`1月
- `requestUrl` (可选):接口路径过滤条件
- `method` (可选):请求方法过滤条件
- `targetEndpoint` (可选):目的地址过滤条件
- `httpCode` (可选):请求响应码过滤条件
- `gatewayEndpoint` (可选):网关地址过滤条件
- `minCostTime` (可选):最小耗时(ms)过滤条件
- `maxCostTime` (可选):最大耗时(ms)过滤条件
- `routeId` (可选):路由ID过滤条件
响应示例:
```json
{
"code": 200,
"msg": "操作成功",
"data": {
"dataPoints": [
{
"timePoint": "2025-02-01 00:00:00",
"count2xx": 2,
"count4xx": 0,
"count5xx": 0,
"count3xx": 0,
"avgCostTime": 3557.00
},
{
"timePoint": "2025-04-01 00:00:00",
"count2xx": 3,
"count4xx": 0,
"count5xx": 0,
"count3xx": 0,
"avgCostTime": 3791.33
},
{
"timePoint": "2025-05-01 00:00:00",
"count2xx": 1,
"count4xx": 0,
"count5xx": 0,
"count3xx": 0,
"avgCostTime": 4858.00
},
{
"timePoint": "2025-06-01 00:00:00",
"count2xx": 1,
"count4xx": 0,
"count5xx": 0,
"count3xx": 0,
"avgCostTime": 3668.00
}
]
}
}
```
响应字段说明:
- `timePoint`:时间点(时间轴X轴)
- `count2xx`2xx状态码请求次数
- `count3xx`3xx状态码请求次数
- `count4xx`4xx状态码请求次数
- `count5xx`5xx状态码请求次数
- `avgCostTime`:平均耗时(ms),保留2位小数
## 5. 获取去重的请求URL列表
接口地址:`GET /gateway/record/request-urls`
请求参数:无
响应示例:
```json
{
"code": 200,
"msg": "操作成功",
"data": [
"/api/v1/order/cancel",
"/api/v1/order/create",
"/api/v1/order/query",
"/api/v1/order/update",
"/api/v1/payment/callback",
"/api/v1/payment/create",
"/api/v1/payment/query",
"/api/v1/product/detail",
"/api/v1/product/list",
"/api/v1/product/search",
"/api/v1/system/config",
"/api/v1/system/health",
"/api/v1/system/monitor",
"/api/v1/user/login",
"/api/v1/user/logout",
"/api/v1/user/profile",
"/api/v2/sync/BBOSS/PauseResultServ",
"/api/v2/sync/BBOSS/PreCheckServ",
"/api/v2/sync/BBOSS/QueryServ",
"/api/v2/sync/BBOSS/UpdateServ"
]
}
```
响应字段说明:
- `data`:去重后的请求URL列表
## 6. 获取去重的目标端点列表
接口地址:`GET /gateway/record/target-endpoints`
请求参数:无
响应示例:
```json
{
"code": 200,
"msg": "操作成功",
"data": [
"127.0.0.1:8080",
"127.0.0.1:8081",
"127.0.0.1:8082",
"192.168.1.100:8080",
"192.168.1.101:8080",
"192.168.1.102:8080",
"mock.p.cdn.10086.cn:443"
]
}
```
响应字段说明:
- `data`:去重后的目标端点列表
@@ -0,0 +1,205 @@
# 开发账号
```
18800010003cmcc
111111
```
# 相关备忘
接口转发规则
```
/alarm/user/.../create/user
/api/ibs/system/monitor/.. /create/user
```
用户(UserController-UserService):`user`
用户组(AlarmCrowdController-AlarmCrowdService):`ding_talk_alarm_crowd`
项目(ProjectServiceController-ProjectService):`project_service`
服务:`system_service`
模块:`server_module`
告警规则(AlarmRuleController-AlarmRuleService):`alarm_rule`
告警事件(AlarmEventsController-AlarmEventsService):`notice_alarm_nfo`
1. 所有项目下拉。
2. 项目对应模块所有下拉。
3. 所有用户组、所有用户下拉框
4. 根据规则 Id 获取规则详情。
```
ElasticSearchAlarmNoticeJob
IbsSystemBusinessDataInspectionReportJob
IbsSystemInspectionReportJob
LostContactHostHardWareMonitorJob
MonitorByteDanceSubscribeJob
MonitorChargeInterFaceStabilityJob
MonitorDgaContentCenterDataTaskJob
MonitorDgaEdgeDataTaskJob
MonitorDgaEdgeServerDataStabilityJob
MonitorIQiyiSubscribeJob
MonitorProductIdEdgeBillDataStabilityJob
MonitorStatisticInterFaceTaskJob
QueryEnterpriseProductIdDomainInfoJob
RedisStorageAlarmInfoJob
```
```
alarm_rule 告警规则主表
alarm_rule_disk_directory 无数据-告警规则与磁盘目录相关的配置信息
alarm_rule_host 无数据-告警规则与主机之间的关联信息
alarm_rule_user 无数据-告警规则与用户之间的关联信息
alarm_rule_user_group 无数据-告警规则与用户组关联数据表。
ding_talk_alarm_crowd 无数据-钉钉告警群组的配置信息
notice_alarm_nfo 记录告警信息(记录告警相关的项目、服务、规则、通知方式及告警内容等详细信息。)
user 平台用户
user_group 用户组数据表
user_user_group 用户与用户组关联数据表
user_project 用户与项目关联关系
project_service 项目信息
system_service 服务信息
server_module 模块信息
system_service_alarm_rule 无数据-系统服务与告警规则的关联关系,记录某个系统服务绑定的具体告警规则。
ip_library IP库信息,记录主机的基本信息及监控相关数据,如主机名、IP、类型及最后监控时间。
host_hard_ware_monitor_info 主机硬件监控信息,记录主机的运行状态数据,如磁盘、CPU、内存使用率及连接状态。
---------------------------------------------------------------------------------------------------------------------------------------
log_stability 无数据-日志稳定性数据,存储企业日志任务的相关统计信息,如日志文件数量和大小。
ibs_system_inspection IBS系统巡检信息,记录与巡检相关的产品ID列表。
---------------------------------------------------------------------------------------------------------------------------------------
monitor_byte_dance_subscribe 字节跳动相关的订阅监控任务信息,记录任务执行计划和企业相关数据。
monitor_charge_interface_stability 计费接口稳定性的监控任务信息,包括任务配置、执行周期、阈值设置及相关企业信息。
monitor_dga_content_center_data 内容中心的数据配置信息,包括任务ID、企业信息、执行计划、周期、阈值等,用于管理监控任务的执行和异常规则。
monitor_dga_edge_data 边缘数据监控任务的配置信息,包括任务名称、企业信息、执行周期、阈值规则等。
monitor_dga_edge_server_data_stability 边缘服务器数据稳定性的相关配置和规则信息,包括企业信息、任务执行周期、阈值设置以及数据异常和中断的规则编号。
monitor_iqiyi_subscribe 爱奇艺订阅监控任务的相关信息,记录任务的基本配置和执行规则。
monitor_product_id_edge_bill_data_stability 监控产品ID边缘账单数据的稳定性相关配置和规则信息。
monitor_statistic_inter_face 接口统计任务的相关配置和信息,包括任务名称、企业信息、域名列表、执行周期及规则等。
monitor_log_subscribe 无数据-监控日志订阅信息,记录订阅任务的配置和执行规则。
monitor_log_stability 无数据-监控系统的稳定性日志信息,存储任务执行的调度配置和状态数据。
monitor_edge_bill_product_id_info 与边缘账单相关的企业产品ID信息,记录企业的基本信息及关联的产品ID列表。
product_id_domain_info 储企业ID、产品ID与域名之间的关联信息。
enterprise_product_id_info 企业产品ID的相关信息,记录企业的基本信息如名称、ID和所属省份。
---------------------------------------------------------------------------------------------------------------------------------------
system_config 项目配置
tenant_authentication 存储租户的认证信息,包括租户ID和密钥,用于身份验证。
---------------------------------------------------------------------------------------------------------------------------------------
backup_data(未上线)
backup_data_taskId(未上线)
project_system_service(中间表)
system_service_module(中间表)
monitor_edge_bill_data_stability_product_info(中间表)
```
项目名称:该系统正式称谓
服务名称:该设备的固定资产编号
运行状态:在建、在线、待用、停用、报废
所属环境:生产环境、开发环境、测试环境、灾备环境
设备型号:设备的产品型号
序列号:设备序列号
设备配置清单:CPU核数、主频
设备配置清单:内存信息
设备配置清单:本地硬盘数量和磁盘空间
设备配置清单:网卡信息
机房:设备摆放的物理位置
功能描述:该设备在系统中的作用
主机名:该设备的名称
内网IP地址:内网中的IP地址
互联网IP:如果有外网IP,填写在此。
虚拟IP:如果有虚拟IP,填写在此。
操作系统类型:服务器的操作系统类型,其余设备可以不填
操作系统版本:服务器的操作系统版本,其余设备可以不填
该设备的固定资产编号 在建、在线、待用、停用、报废 "生产环境
开发环境
测试环境
灾备环境" 设备的产品型号 设备序列号 CPU核数、主频 内存信息 本地硬盘数量和磁盘空间 网卡信息 设备摆放的物理位置 该设备在系统中的作用 该设备的名称 内网中的IP地址 如果有外网IP,填写在此。 如果有虚拟IP,填写在此。 服务器的操作系统类型,其余设备可以不填 服务器的操作系统版本,其余设备可以不填
1. 更改组名称:
```
cdn_woms> UPDATE cdn_woms.sys_menu t SET t.menu_name = '钉钉群管理' WHERE t.menu_id = 133
[2025-04-28 10:21:12] 78 ms 中有 1 行受到影响
cdn_woms> select *
from sys_menu
[2025-04-28 10:21:13] 在 506 ms (execution: 130 ms, fetching: 376 ms) 内检索到从 1 开始的 145 行
```
---
业务模块改为项目信息。(田卓)
---
服务告警地址(定义为):日志采集路径。(寰宇)
---
**用户信息**(田卓)
**用户组信息**(田卓、寰宇)
![](../../../../attachment/images-paste/image-20250428103043446.png)
用户所属项目(多对多)归属某个项目或多个项目
![](../../../../attachment/images-paste/image-20250428103656866.png)
---
![](../../../../attachment/images-paste/image-20250428104224211.png)
---
偏移量(定义问题)
![](../../../../attachment/images-paste/image-20250428104437289.png)
---
停启用。
![](../../../../attachment/images-paste/image-20250428105643760.png)
---
告警编号后台生成,列表返回。
@@ -0,0 +1,16 @@
```
服务名称:
ibs-export
目录:
/opt/ibs-export/
启动命令:参考history
服务器:97那台,与ibs-ai是同一台
curl -o cachedata10.xlsx 'http://localhost:9998/ibs_data_export/getCacheEnterpriseData?yearMonth=2025-10'
curl -o esopEnterpriseData10.xlsx 'http://localhost:9998/ibs_data_export/getEnterpriseData?startTime=2025-10-01&endTime=2025-10-31&token=ZjdjZGM1ZjEtNjFiZi00ZmZjLWFiNjctMWJiODkwOGMxNGVh'
token换成超管子账号的cookie的jsessionid
```
@@ -0,0 +1,55 @@
# 一、场景限制条件说明
1. 冲突域名场景,仅支持ESOP订购入口点播业务,ESOP订购入口其他业务(直播、动态加速等)和移动云订购入口、移动中台订购入口所有业务均不支持;
2. 不支持同一企业账号下,两个相同域名冲突的场景;
3. 冲突域名场景,不能对客户承诺按点击来调整分发比例;
4. 政企客户经理必须提前识别冲突域名,并按照冲突域名映射规则来录入;
5. 冲突域名场景,最多只能支持两个域名同时分发;
6. 冲突域名分发后,各项配置均需人工执行,售后支撑效率不能承诺;
7. 后续所有工单,不支持信安附件未上传至IBS的建单场景;
8. 冲突域名场景,不支持IBS页面下发内容管理、安全管理任务(需线下或调用华为定制转发接口);
9. 冲突域名场景,不支持使用自助配置类API(需线下或确认是否可调用华为定制转发接口);
10. 冲突域名场景,不支持变更域名分发平面
# 二、定义说明
域名A:真实域名,如www.baidu.com
域名B:华为侧提供的虚拟域名
格式为:域名A.编号.cdnhwcqir15.com
其中:编号部分必须为数字,范围为01-99的随机数
如:www.baidu.com.01.cdnhwcqir15.com
CPID:企业对应的唯一编号
# 三、提单方案
1. 当政企客户经理在集客大厅提新增域名A工单时,IBS校验反馈域名发生冲突;
2. 客户经理将冲突域名情况发邮件至对应运营经理SA,邮件内容包含:冲突域名A列表和CPID,申请使用域名冲突场景。
3. SA评估后,转发邮件至华为
1. 鲁贤宇( luxianyu2@huawei-partners.com
2. 同时抄送网络事业部
3. 刘宗泽( liuzongze@chinamobile.com
4. 徐娜( xuna@chinamobile.com
5. 迂姗姗( yushanshan@chinamobile.com
6. 祁相宜( qixiangyi@chinamobile.com
7. 华为马骥( maji6@huawei.com
4. 华为分配虚拟域名B
5. SA将域名B提供给客户经理,再次提单。
客户经理提单说明:
信安附件为冲突域名的唯一识别标准,填写如下:
A列域名填写为域名B(假域名,如:www.baidu.com.01.cdnhwcqir15.com
其他B-R列(如备案号、许可证号)均按域名A真实信息填写。
S列(无表头)填写为域名A(真实域名,如:www.baidu.com
![](../../../../attachment/images-paste/image-20250212101441586.png)
![](../../../../attachment/images-paste/image-20250212101456904.png)
@@ -0,0 +1,109 @@
```sql
#
select ei.enterprise_id
from enterprise_info ei
left join ep_product_chargemode epc on ei.enterprise_id = epc.enterprise_id
left join self_service_domain_config ssdc on ssdc.tenant_id = epc.enterprise_id
where epc.product_state in (3, 6)
and ssdc.product = epc.product_id
and ei.source = 'BSS'
and ssdc.product not in (0, 1, 2, 3, 8, 9)
and ei.enter_province = '安徽'
group by ei.enterprise_id;
#
select ei.enterprise_id
from enterprise_info ei
left join ep_product_chargemode epc on ei.enterprise_id = epc.enterprise_id
left join self_service_domain_config ssdc on ssdc.tenant_id = epc.enterprise_id
where epc.product_state in (4)
and ssdc.product = epc.product_id
and ei.source = 'BSS'
and ssdc.product not in (0, 1, 2, 3, 8, 9)
and ei.enter_province = '北京'
group by ei.enterprise_id;
#
select ei.enterprise_id
from enterprise_info ei
left join ep_product_chargemode epc on ei.enterprise_id = epc.enterprise_id
left join self_service_domain_config ssdc on ssdc.tenant_id = epc.enterprise_id
where epc.product_state in (3, 6)
and ssdc.product = epc.product_id
and ei.source = 'BSS'
and ssdc.product in (0, 1, 2, 3, 8, 9)
and ei.enter_province = '安徽'
group by ei.enterprise_id;
#
select ei.enterprise_id
from enterprise_info ei
left join ep_product_chargemode epc on ei.enterprise_id = epc.enterprise_id
left join self_service_domain_config ssdc on ssdc.tenant_id = epc.enterprise_id
where epc.product_state in (4)
and ssdc.product = epc.product_id
and ei.source = 'BSS'
and ssdc.product in (0, 1, 2, 3, 8, 9)
and ei.enter_province = '北京'
group by ei.enterprise_id;
#
SELECT ei.enterprise_id
FROM enterprise_info ei
LEFT JOIN ep_product_chargemode epc ON ei.enterprise_id = epc.enterprise_id
LEFT JOIN self_service_domain_config ssdc ON ssdc.tenant_id = epc.enterprise_id
WHERE epc.product_state IN (3, 6)
AND ssdc.product = epc.product_id
AND ei.source = 'BSS'
AND ssdc.product IN (0, 1, 2, 3, 8, 9)
AND ei.enter_province = '北京'
AND NOT EXISTS (
-- 排除点播商用
SELECT 1
FROM ep_product_chargemode epc_excl
LEFT JOIN self_service_domain_config ssdc_excl ON ssdc_excl.tenant_id = epc_excl.enterprise_id
WHERE epc_excl.enterprise_id = ei.enterprise_id
AND epc_excl.product_state IN (4)
AND ssdc_excl.product = epc_excl.product_id
AND ssdc_excl.product IN (0, 1, 2, 3, 8, 9))
AND NOT EXISTS (
-- 排除直播商用
SELECT 1
FROM ep_product_chargemode epc_excl
LEFT JOIN self_service_domain_config ssdc_excl ON ssdc_excl.tenant_id = epc_excl.enterprise_id
WHERE epc_excl.enterprise_id = ei.enterprise_id
AND epc_excl.product_state IN (4)
AND ssdc_excl.product = epc_excl.product_id
AND ssdc_excl.product NOT IN (0, 1, 2, 3, 8, 9))
GROUP BY ei.enterprise_id;
#
SELECT ei.enterprise_id
FROM enterprise_info ei
LEFT JOIN ep_product_chargemode epc ON ei.enterprise_id = epc.enterprise_id
LEFT JOIN self_service_domain_config ssdc ON ssdc.tenant_id = epc.enterprise_id
WHERE epc.product_state IN (3, 6)
AND ssdc.product = epc.product_id
AND ei.source = 'BSS'
AND ssdc.product NOT IN (0, 1, 2, 3, 8, 9)
AND ei.enter_province = '北京'
AND NOT EXISTS (
-- 排除点播商用
SELECT 1
FROM ep_product_chargemode epc_excl
LEFT JOIN self_service_domain_config ssdc_excl ON ssdc_excl.tenant_id = epc_excl.enterprise_id
WHERE epc_excl.enterprise_id = ei.enterprise_id
AND epc_excl.product_state IN (4)
AND ssdc_excl.product = epc_excl.product_id
AND ssdc_excl.product IN (0, 1, 2, 3, 8, 9))
AND NOT EXISTS (
-- 排除直播商用
SELECT 1
FROM ep_product_chargemode epc_excl
LEFT JOIN self_service_domain_config ssdc_excl ON ssdc_excl.tenant_id = epc_excl.enterprise_id
WHERE epc_excl.enterprise_id = ei.enterprise_id
AND epc_excl.product_state IN (4)
AND ssdc_excl.product = epc_excl.product_id
AND ssdc_excl.product NOT IN (0, 1, 2, 3, 8, 9))
GROUP BY ei.enterprise_id;
```
@@ -0,0 +1,7 @@
熊哥的优化需求,因为解决方法可以借鉴所以进行了流程梳理
![](../../../../attachment/images-uuid/be68042791134b489a189c9e07ffdd0a.png)
# 流程图
[关于网状网Token问题-ProcessOn](https://www.processon.com/diagraming/65672a9722ad8076ebd813ef)
@@ -0,0 +1,99 @@
# 时长到期
修改的 `start_time``test_duration` 字段,今天到期:保证 `start_time` + `test_duration` (时长)是今天。
```sql
SELECT id,
order_num,
dev_req,
start_time,
actual_start_time,
test_duration,
DATE_SUB(start_time, INTERVAL test_duration DAY) AS
FROM testorder_info
WHERE order_num = '试用工单号!!!';
```
**TestOrderTimeMonitorJob**:监控试用工单试用时长定时任务,修改工单处理结果。(注册时间为:开始时间 + 试用时长,工单到期当天的 23:59。)
```sql
select *
from qrtz_triggers
where TRIGGER_NAME like '%试用工单号!!!%';
```
**TestOrderEmailAlarmJob**:试用工单到期邮件提醒。(注册时间为:每天 09:00:00 扫描符合条件的 1、2、4、9 天的,只发邮件提醒。还有一天是明天的 23:59。)
```sql
select *
from qrtz_triggers
where TRIGGER_NAME like '%TestOrderEmailAlarmJob%';
```
**TestOrderCloseDomainJob**:试用工单域名关停。(注册时间为:每天 02:00:00。规则:未开通商用单, 仍挂有生效域名, 且创建于 6.5.0 及之后的试用工单。关停时间=开始时间 + 试用时长 + 1, 即到期后的第二天凌晨两点)
```sql
select *
from qrtz_triggers
where TRIGGER_NAME like '%TestOrderCloseDomainJob%';
```
**TestOrderCloseOrderJob**:监控试用工单下的域名状态,若均已删除(域名不存在)或已停用,则关闭工单,流量和时长均监控。(注册时间:每 10 分钟执行一次。)
```sql
select *
from qrtz_triggers
where TRIGGER_NAME like '%TestOrderCloseOrderJob%';
```
## 例子
一个工单到期前 1、2、4、9 天提醒,收到最后一次提醒的第二天的 23:59 修改工单结果,两小时后 02:00:00 关停域名,如果域名都关了或者删除了,关闭试用单。
# 流量耗尽
大数据表中插入数据
```sql
select *
from t_cdn_trial_dataflow_record;
INSERT INTO bss.t_cdn_trial_dataflow_record (job_id, domain, dataflow_history, dataflow_delta, base_time, update_time,
create_time)
VALUES ('1218_1427_57', 'DevReq1734503329A.komect.com', 10995116277760, 10995116277760, '20241218143213',
'20241218143213', '20241218143213')
```
**TestOrderFlowMonitorJob**:流量监控定时任务(注册时间:每 10 分钟。)
提醒:0.6-0.8、0.8-0.95
耗尽:1
注意:`flowConsumeMarkTime` 和 `sendMail` 标记。
改工单结果、取消时长定时任务。
**TestOrderFlowMonitorJob**T + 2 关停。例如:2023 年 4 月 1 日 + 2 天 = 2023 年 4 月 3 日。
```sql
select *
from qrtz_triggers
where TRIGGER_NAME like '%TestOrderFlowMonitorJob%';
```
**TestOrderCloseOrderJob**:监控试用工单下的域名状态,若均已删除(域名不存在)或已停用,则关闭工单,流量和时长均监控。(注册时间:每 10 分钟执行一次。)
```sql
select *
from qrtz_triggers
where TRIGGER_NAME like '%TestOrderCloseOrderJob%';
```
## 例子
一个工单 2024-12-01 11:00:00 检测到流量耗尽,改工单状态。遵循 T + 2,在 2024-12-03 11:00:00 那一轮(大概率是下一轮因为标记位多几秒)的定时任务会关停域名。域名停用后 10 分钟关单。
# 域名删除
**TestOrderDeleteDomainJob**:域名停用 60 天后可删除,现网未开启。(注册时间为:每天 02:00:00。)
@@ -0,0 +1,9 @@
# 联调准备
```
联调环境(172.21.145.113)和 BBOSS、BPM 联调需要
关闭 172.21.16.40 Bss 服务的 bboss.mock
系统配置文件 BPM_URL 改为 http://172.21.16.223:50087
删除 bpm_interactive_auth_key (开mock 可能获取错的鉴权)
删除 BBOSS_AUTH_INFO_KEY (开mock 可能获取错的鉴权)
```
@@ -0,0 +1,335 @@
# 背景介绍
信安信息可以简单理解为域名及其所属公司的基本信息,这些信息来源于新建域名时上传的附件中所填写的内容。信安信息校验是指 IBS 系统对客户在新建域名时上传附件中的字段信息进行核验。而信安信息同步则是将域名的信安信息从 IBS 系统同步至中国移动 CDN 信安系统(即 CU 系统)。
信安相关业务主要包括以下三个方面:
1. **信安附件的上传、解析与校验**:对客户提供的信安附件进行上传与解析,并核验信息的完整性与准确性。
2. **信安附件的下载**:提供信安附件的下载功能,便于信息的查阅和备份。
3. **信安信息的同步**:将校验后的信安信息同步到 CU 系统,确保系统间的数据一致性。
# 信安附件的上传、解析与校验
信安信息的上传、解析与校验的入口不同工单是不一样的。
大致分为**运营操作工单**是一个接口地址,**业务操作工单**是一个接口地址。
## 运营操作工单
### 1、接口位置
```java
/workorder/requestDomain/upload
com.cmcc.cdn.platform.selfservice.controller.NewWorkOrderController#requestDomainUpload
```
### 2、附件解析
IBS 项目中,有一个函数将域名上传的 excel 附件转为 String 字符串,如下:
```java
com.cmcc.cdn.platform.common.util.ExcelUtil#convertToObjectFromExcel(java.io.InputStream, java.util.List<java.lang.String>, java.util.List<java.lang.String>)
```
核心函数是 `analysisExcelFile`,其中的 `checkExcelFormat` 函数是校验 Excel 表头的函数。
`analysisExcelFile` 校验 Excel 附件大致的逻辑是:先通过 checkExcelFormat 函数提取并校验 excel 表头是否和 Contents 中记录的表头相同,如果不相同,直接返回 false,表示附件解析失败,否则一条条读取 excel 的每一行进行解析。
`@SecurityExcelAnalysis` 注解(`convertToObjectFromExcel` 函数上)
IBS6.3.1 版本迭代增加,这个主要是在解析信安附件的时候判断附件中填写的业务类型是否为直播,如果是直播且用户没有填写回源地址的话,IBS 后台去华为云那边查询回源地址并填写,或者自动补齐回源地址为加速域名。
因为原来回源地址是必填项,但是 IBS6.3.1 直播业务的回源地址可以不填写,会导致上层在取值时如果不去校验是否会空的话,会导致出现空指针异常,因此,这个 AOP 的作用就是当用户没有填写直播业务的域名的回源地址时,后台这边给它补齐,用于通过上层校验。
### 3、附件校验
信安附件校验场景(域名配置需求和cache+域名配置),地址: https://kdocs.cn/l/cp84H09h2t89
核心信安信息校验函数
```java
com.cmcc.cdn.platform.selfservice.service.impl.InformationSecurityTableManagerImpl#validateInformationSecurityInfo
```
历史流程:[校验流程图](https://www.processon.com/diagraming/63c5d31e2a93473cd86b7759)
## 业务操作工单(页面)
![](../../../../attachment/images-uuid/5f44a56e500840e2a744c951eb90bb3a.jpg)
### 1、接口位置
```java
/order/security/upload
com.cmcc.cdn.platform.selfservice.controller.OrderController#uploadSecurity
```
### 2、附件校验
```java
com.cmcc.cdn.platform.selfservice.service.impl.PortalInformationServiceImpl#validateAndSaveInfo
```
试用单、试用变更单以及非首次开通的业务单在 IBS 界面上传的信安附件的校验
```java
com.cmcc.cdn.platform.selfservice.service.impl.BatchSelfDomainServiceImpl#checkXinAnExcelFromIBS
```
> 在 IBS 界面上传的试用单、试用变更单、业务单的信安附件,通过校验之后,信安附件结果存储至表 information_self_domain。
## BPM 回调可承接之后从 BBOSS 拉取信安附件并校验
用户在集客大厅上传的信安附件在 BPM 回调试用可承接之后,再对信安附件中的信息进行校验,这里的信安信息校验涉及到试用单、试用变更单以及业务单。
### 1、试用单信安附件拉取以及校验
```java
com.cmcc.cdn.platform.selfservice.service.impl.TestOrderServiceImpl#checkAndSaveInformationSecurityTable
```
该函数中的核心校验代码为:batchSelfDomainService.checkXinAnExcelFromIBS(vos, false);
### 2、试用变更单信安附件拉取以及校验
```java
com.cmcc.cdn.platform.selfservice.service.impl.TestOrderChangeServiceImpl#checkAndSaveXinanTableFromTestChange
```
该函数中的核心校验代码为:batchSelfDomainService.checkXinAnExcelFromIBS(vos, false);
### 3、业务受理工单信安附件拉取以及校验
```java
com.cmcc.cdn.platform.selfservice.service.impl.BusinessOrderServiceImpl#checkAndSaveXinanTableFromOrder
```
> 信安信息校验通过之后会存储至表 information_self_domain
## 前置校验 - 拉取 BBOSS 信安附件并校验及存储
```java
com.cmcc.cdn.platform.selfservice.service.impl.PreCheckServiceImpl#checkInfoSecurityTable
```
> 当信安附件校验通过之后,也存储至 information_self_domain 表中。
# 信安附件下载
## 域名详情页
![](../../../../attachment/images-uuid/dfb4426892794ed297561acaadcd2ca4.png)
```java
/configManage/getSecurity
com.cmcc.cdn.platform.selfservice.controller.ConfigManageController#getInformationSecurity
```
该接口在 ibs 界面如图所示,进入业务运维 - 配置管理界面,点击“下载已上传的附件”
## 位置二
```java
/download/exportFile
com.cmcc.cdn.platform.selfservice.controller.HttpFileController#exportFile
```
这个接口主要是在 IBS 页面下载 BBOSS 那边传的附件的接口(个人认为是试用单页面)。
# 信安信息同步
> 每 1 分钟会扫描上报一次删除,上报后需要等工信部反馈结果后,信安系统才会删除本地数据
> 工信部对上报数据的解析是自动的,正常情况下 1 分钟内就会有反馈
> 新增和修改是每天定时(晚上 23 点)上报
## 信安同步底层代码
信安的同步主要分为企业信安的同步和域名信安的同步。
所谓企业信安也就是企业的基本信息,包括企业名,企业地址,企业单位编码等;
所谓域名信安指的就是域名的基本信息,包括域名,回源地址,分发省份等。
根据同步的操作不同,可以分为同步新增和同步修改,因此主要有以下四个函数。
### 1、同步企业新增信安
```java
com.cmcc.cdn.platform.selfservice.service.impl.BigCloudBasicInfoServiceImpl#createInfomationUser
```
首先获取信安 token,然后向信安系统发起新建企业信安信息的请求,将获取的响应存储至 information_user 表中,其中 information_user 表中的 user_id_cdn 为企业的唯一标识,同步到信安系统的企业名称以及表中所存储的企业名称为附件中填写的企业名称。
### 2、同步企业修改信安
```java
com.cmcc.cdn.platform.selfservice.service.impl.BigCloudBasicInfoServiceImpl#updateInfomationUser
```
这个函数的大致逻辑是,首先获取信安 token,然后向信安系统发起修改企业信安信息的请求,将获取的响应存储至 information_user 表中,其中 information_user 表中的 user_id_cdn 为企业的唯一标识
### 3、同步域名新增信安
```java
com.cmcc.cdn.platform.selfservice.service.impl.BigCloudBasicInfoServiceImpl#addInformationDomainInfo
```
这个函数的大致逻辑是,首先获取信安 token,然后向信安系统发起同步域名新增信安信息的请求,将获取的响应存储至表 big_cloud_information_domain 中,其中表 big_cloud_information_domain 中的 domain_id_cdnsys 为域名的唯一标识
### 4、同步域名修改信安
```java
com.cmcc.cdn.platform.selfservice.service.impl.BigCloudBasicInfoServiceImpl#updateInformationDomainInfo
```
### 5、删除域名同步信安
```java
com.cmcc.cdn.platform.selfservice.service.impl.BigCloudBasicInfoServiceImpl#deletedInformationDomainInfo
```
根据域名 iddomain_id_cdnsys)去删除,删除 big_cloud_information_domain 表
### 6、删除企业同步信安
```java
com.cmcc.cdn.platform.selfservice.service.impl.BigCloudBasicInfoServiceImpl#deletedInformationUser
```
根据企业 id(user_id_cdn)去删除,并删除企业下所有域名的信安信息,删除 information_user 以及 big_cloud_information_domain 表
## 封装代码
### 同步新增企业以及域名信安
```java
com.cmcc.cdn.platform.selfservice.service.impl.PortalInformationServiceImpl#createOrUpdateInfo
```
通过调用上述四个信安同步底层函数写的同步新增信安或同步修改信安的函数。
一般很多工单在同步的时候不会直接调用上述四个信安同步底层函数,而直接调用这两个函数。
这个函数主要做了新增或修改企业信安,新增或修改域名信安,主要用于用户第一次上传信安附件或者域名第一次同步信安时,可以调用该函数。
### 同步新增或修改域名信安
```java
com.cmcc.cdn.platform.selfservice.service.impl.PortalInformationServiceImpl#updateDomainInformation
```
这个函数主要做了新增或修改域名信安,主要是用于,当域名的信安信息已经在 BigCloudInformationDomain 中存在,则表明域名已在信安系统备案,直接同步修改信安即可。
### 删除域名企业信安
```java
com.cmcc.cdn.platform.selfservice.service.impl.PortalInformationServiceImpl#notifyDeleteInformation
```
## 不同工单的不同位置
### cache+ 域名配置工单
在第一步运营经理提交 cache+ 域名配置工单的时候,即运营经理点击提交的时候。
```java
# 自助
com.cmcc.cdn.platform.selfservice.manager.WorkOrderManager#handleCacheDomainXinAnInfo
# 定制化
com.cmcc.cdn.platform.selfservice.service.CacheWorkOrderServiceImpl#cacheDomainIcpUpdateSyncProcess
```
### esop 政企客户经理提交的域名配置需求工单新增域名
政企客户经理提交的域名配置需求工单新增域名也是在第一步提交域名配置需求工单的时候。
```java
com.cmcc.cdn.platform.selfservice.order.WorkOrderServiceImpl#saveCustomWorkOrder
```
### 新增直播域名工单(已取消此类型工单)
新增直播域名工单在运营经理新建工单点击提交之后就校验备案号并同步信安了,新增直播域名工单也是走的队列下发,直播域名同步时分发省份固定为全国。
```java
com.cmcc.cdn.platform.selfservice.rabbitmq.consumer.LiveIcpConsumer#handle
```
### 信安补录工单
运营经理提交信安补录工单成功之后即将域名的信安信息同步到信安系统中去了。
信安补录工单的功能比较单一,其用处就是在于,当域名信安信息缺少时,可以通过运营经理(线上的话还可以通过超管账号)提交信安补录工单,将需要修改或者补充的域名信安信息同步到信安系统中去。
```java
/information/order/submit
com.cmcc.cdn.platform.selfservice.controller.InformationController#submit
```
调用链
submit -> createInformationWorkOrder -> createFrom -> checkUpInformation -> checkUnitXinan
### 试用单、试用变更单、业务单同步信安(老流程)
试用单、试用变更单、业务单老流程(即 6.3.1 版本对接 BPM 之前的流程)是在运营经理在业务运维 - 配置管理界面,点击配置域名的时候会同步信安。其实也不一定仅仅指的是这三个单子,对于那些在业务运维 - 配置管理界面点击配置的域名都会再次同步信安,无论这个域名在工单提交的时候有没有同步过信安。这样其实有的域名会同步两次信安了,其实,之前工信部那边要求未下发的域名也需要同步信安,所以域名会同步两次,同步信安也需要分为两步,第一步是域名同步新增信安,第二步是域名同步修改信安。
```java
/configManage/update/config
com.cmcc.cdn.platform.selfservice.controller.ConfigManageController#update(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Boolean, com.cmcc.cdn.platform.selfservice.pojo.SelfServiceDomainConfigVO, org.springframework.validation.BindingResult)
```
自助域名点击配置后同步信安
![](../../../../attachment/images-uuid/0a02041a38ed411ea403617abe70bbdf.png)
定制化域名点击配置后同步信安
在 updateConfig->offlineDomainHandle 函数中
```java
com.cmcc.cdn.platform.selfservice.service.impl.ConfigManageServiceImpl#offlineDomainHandle
```
### 试用单、试用变更单、业务单同步信安(新流程)
IBS6.3.1 版本点播域名对接 BPM 之后,试用单、试用变更单、业务单同步信安是在 BPM 验收反馈可承接之后。
首先,可以统一将试用单、试用变更单、业务单都理解为是从 BBOSS 那边建单的,IBS6.3.1 之后试用单、试用变更单、业务单均对接 BPM,其中试用单、试用变更单以及非首次开通的业务单对接 BPM 的适配单接口,其下发的记录存储至 `bpm_task` 表;首次开通的业务单对接 BPM 的通用运维单接口,其下发记录存储至 `bpm_dns_task` 表。
**对于试用单、试用变更单以及非首次开通的业务单对接 BPM 的适配单接口**,其信安同步在
```java
com.cmcc.cdn.platform.selfservice.service.bpm.impl.BpmManageServiceImpl#uniCastCallBackProcess
```
这个统一处理函数中,这个统一处理函数做了配置入库、同步信安、日志订阅、同步 crs 的操作。其中同步信安的函数为:`syncXinAn`
syncXinAn 函数中试用单,试用变更单以及非首次开通的业务单的同步信安子函数如下所示,这些函数的大致逻辑是,首先去 `information_self_domain` 表中查询是否存在域名信安信息,如果存在则直接取这张表里的数据进行同步,否则就直接取 BBOSS 那边拉取附件进行同步,从 BBOSS 那边拉取信安附件的函数为:
```java
com.cmcc.cdn.platform.selfservice.service.impl.HttpFileServiceImpl#exportAndSaveFileContent
```
对于试用单、试用变更单以及非首次开通的业务单对接 BPM 的适配单接口,其信安同步失败的信息记录在 `bpm_task` 表的 `xin_an_error_msg` 字段;
对于对于首次开通的业务单对接 BPM 的通用运维单接口,其信安同步失败的结果记录在 `bpm_dns_task` 表的 `xin_an_error_msg` 字段,目前同步失败的结果仅在数据库中记录,因此需要定期安排人员去检查有没有同步失败的域名,如果有的话需要线下调接口再次同步,或者安排运营经理提交信安补录工单,同步失败的结果仅在数据库中记录。
### 直播控制台 - 自助域名 - 点击配置同步信安
```
/live/config/addPlainInfo
com.cmcc.cdn.platform.selfservice.service.live.impl.LiveConfigServiceImpl#manageDomain
```
源于 6.2.0 需求,在 manageDomain 中进行了自助域名修改信安的异步同步。其大致逻辑为,先去华为云那边查询域名的源站信息,然后调用域名修改信安的同步函数 `updateDomainInformation` 将域名信安同步到信安系统中去。
# 信安接口能力
新增和删除接口目前最多支持多少数据的同步能力。
目前一次最多 100 条,后续删除会增加到 1000 条
# 信安备案号接口优化开关
XINAN_ICP_OPT_SWITCH
@@ -0,0 +1,196 @@
```
---
【核心判断】
🔴 这是垃圾代码 - 复杂、低效、有隐藏的递归炸弹
---
【流程分析:a.b.c.tttt.cn 每层都没备案会怎样】
假设主域名集合包含 cn,那么:
第1轮:直接查询
查询: a.b.c.tttt.cn
返回: false (未备案)
计算主域名: tttt.cn
生成子域名列表: [b.c.tttt.cn, c.tttt.cn, tttt.cn]
进入第2轮 ↓
第2轮:递归查子域名(第258行的递归陷阱)
查询: [b.c.tttt.cn, c.tttt.cn, tttt.cn]
全部返回: false
↓ 分别处理:
b.c.tttt.cn → 生成 [c.tttt.cn, tttt.cn]
c.tttt.cn → 生成 [tttt.cn]
tttt.cn → 生成 [] (空!递归终止条件)
合并后查询列表: [c.tttt.cn, tttt.cn, tttt.cn] ← 注意重复!
进入第3轮 ↓
第3轮:继续递归
查询: [c.tttt.cn, tttt.cn, tttt.cn] ← tttt.cn被查了2次!
全部返回: false
c.tttt.cn → 生成 [tttt.cn]
tttt.cn → 生成 []
tttt.cn → 生成 []
合并后查询列表: [tttt.cn]
进入第4轮 ↓
第4轮:最后一次
查询: [tttt.cn]
返回: false
tttt.cn → 生成 []
递归结束!
最终结果
icpMap = {
"a.b.c.tttt.cn": "false" // 186行的逻辑会用最后一次子域名查询结果覆盖
}
---
【致命问题】
1️⃣ 隐藏的递归炸弹 (XinAnApiService.java:258)
Map<String, String> domainsICP = getDomainsIcp(subDomains); // 递归!
这他妈是在干什么?
- 方法 getDomainsIcp 调用 getSubDomainIcp
- getSubDomainIcp 又调用回 getDomainsIcp
- 形成递归,但没有任何注释说明!
- 递归深度 = 域名层级数 - 1
对于 a.b.c.d.e.f.g.tttt.cn8层域名):
- 会递归 7 次
- 总查询次数:1 + 7 + 6 + 5 + 4 + 3 + 2 + 1 = 28 次调用信安接口!
- 而且 tttt.cn 会被重复查询 7 次!
2️⃣ 数据结构错了 - 没有去重!
List<String> subDomains = Lists.newArrayList();
subDomainMap.values().forEach(subDomains::addAll); // 256-257行:直接addAll,没去重!
tttt.cn 会在 subDomains 列表中出现多次,每次都要查询信安接口。
"Bad programmers worry about the code. Good programmers worry about data structures."
- 你需要的是 Set<String>,而不是 List<String>
- 或者在查询前去重:subDomains.stream().distinct().collect(Collectors.toList())
3️⃣ 复杂度爆炸 - 3层缩进是底线,这代码有多少层?
看看第147-158行的嵌套:
for (Map.Entry<String, String> entry : icpMap.entrySet()) { // 第1层
if (StringUtils.isEmpty(icp) || FALSE_ICP.getValue().equals(icp)) { // 第2层
if (CollectionUtils.isEmpty(subDomains)) { // 第3层
continue;
}
}
}
还有异常处理里又重复了一遍逻辑(159-170行)—— 这是什么鬼设计?
4️⃣ getSubDomain 的诡异逻辑 (XinAnApiService.java:358-367)
temp.forEach(var ->
subDomains.addFirst(StringUtils.join(Arrays.asList(var, subDomains.getFirst()), SEPARATOR2))
);
subDomains.remove(subDomains.getFirst()); // 为什么要先加再删?
为什么不一开始就不加原域名?
- 这是在解决不存在的问题
- 应该直接构建正确的列表,而不是"先加后删"
---
【Linus式重构方案】
核心思想:消除递归,用迭代 + 去重
public Map<String, String> getDomainsIcp(List<String> domains) {
if (CollectionUtils.isEmpty(domains)) {
return Maps.newHashMap();
}
// 第1步:收集所有需要查询的域名(包括子域名),用 Set 去重
Set<String> allDomainsToQuery = new LinkedHashSet<>();
Map<String, List<String>> domainHierarchy = new HashMap<>();
for (String domain : domains) {
allDomainsToQuery.add(domain);
String mainDomain = getDomainParam(domain);
List<String> subDomains = getSubDomain(mainDomain, domain);
allDomainsToQuery.addAll(subDomains); // Set自动去重
domainHierarchy.put(domain, subDomains);
}
// 第2步:一次性查询所有域名(去重后)
Map<String, String> allIcpResults = queryDomainsIcpByGroup(new ArrayList<>(allDomainsToQuery));
// 第3步:为每个原始域名找最近的有备案的父域名
Map<String, String> result = new HashMap<>();
for (String domain : domains) {
String icp = allIcpResults.get(domain);
// 如果自己有备案,直接用
if (icp != null && !icp.equals(FALSE_ICP.getValue()) && !icp.isEmpty()) {
result.put(domain, icp);
continue;
}
// 否则从子域名列表中找第一个有备案的
List<String> subDomains = domainHierarchy.get(domain);
boolean found = false;
if (subDomains != null) {
for (String subDomain : subDomains) {
String subIcp = allIcpResults.get(subDomain);
if (subIcp != null && !subIcp.equals(FALSE_ICP.getValue()) && !subIcp.isEmpty()) {
result.put(domain, subIcp);
found = true;
break;
}
}
}
if (!found) {
result.put(domain, icp != null ? icp : "");
}
}
return result;
}
改进效果:
| 指标 | 原代码 | 重构后 |
|--------------|---------------|-----------|
| 递归次数 | N层 | 0 |
| 接口调用次数(8层域名) | 28次 | 8次(去重后) |
| 重复查询 | 是 | 否 |
| 代码行数 | ~80行(分散在3个方法) | ~40行(单方法) |
| 可读性 | 需要追踪递归 | 一目了然 |
---
【最后警告】
这段代码有三个经典反模式:
1. "聪明"代码 - 递归隐藏在方法调用里,不看完整代码根本发现不了
2. 重复逻辑 - 异常处理块里复制粘贴了主逻辑
3. 过度抽象 - getSubDomain 方法可以简化成3行,但写成了10行
"Talk is cheap. Show me the code." - 现在代码给你了,你看着办吧。
需要我帮你重构吗?还是你有其他问题?
```
@@ -0,0 +1,33 @@
域名备案号查询时,如果对一个完整的域名(例如:`cdn.jiangsu.chinatax.gov.cn`)无法直接获取备案信息,会将其拆分为子域名列表进行逐级查询。例如:
- 原始域名:`cdn.jiangsu.chinatax.gov.cn`
- 切割后的子域名列表:`["jiangsu.chinatax.gov.cn", "chinatax.gov.cn"]`
通过对这些子域名一次性全部查询备案信息,得到一个备案信息映射:
```
{
"chinatax.gov.cn": "true_京ICP备13021685号-2",
"jiangsu.chinatax.gov.cn": "true_苏ICP备05002258号-2"
}
```
最后为原始域名(`cdn.jiangsu.chinatax.gov.cn`)确定一个最终的备案号。
逻辑是遍历子域名列表,根据子域名在备案信息映射中是否存在,选取对应的备案号。代码逻辑如下:
```java
subDomainMap.forEach((key, subs) -> subs.forEach(sub -> {
if (domainsICP.containsKey(sub)) {
result.put(key, domainsICP.get(sub));
}
}));
```
这里 `subDomainMap` 存储的是原始域名和其对应的子域名列表的映射,例如 `{ "cdn.jiangsu.chinatax.gov.cn": ["jiangsu.chinatax.gov.cn", "chinatax.gov.cn"] }``domainsICP` 是备案信息映射,`result` 用于存储最终的备案号结果。
代码逻辑中,子域名列表 `["jiangsu.chinatax.gov.cn", "chinatax.gov.cn"]` 是按照从长到短的顺序遍历的。由于 `result.put(key, value)` 会覆盖之前的值,最终结果总是会被列表中最后一个匹配到的子域名的备案号覆盖。
- 第一次循环,`sub``jiangsu.chinatax.gov.cn`,找到备案号 `true_苏ICP备05002258号-2`,存储到 `result` 中。
- 第二次循环,`sub``chinatax.gov.cn`,也找到备案号 `true_京ICP备13021685号-2`,会覆盖掉之前的值。
- 同理如果 `chinatax.gov.cn``false` 那么最终 `cdn.jiangsu.chinatax.gov.cn` 也会被覆盖为未备案(false)。
@@ -0,0 +1,7 @@
将信安模板放到线上4台服务器上的制定目录 `/opt/cdn-portal/`
超管修改配置项:`XINAN_EXCEL_FILE_URL` value: `/opt/cdn-portal/信安导入模板.xls` description:更新信安模板文件路径
超管调用接口:`/patch/3.8.1/upload/default/file`,获取到新信安模板的md5值
超管修改配置项:`INFORMATION_SECURITY_EXCEL_FILE_ID` value: 填入上述接口响应的md5值. description:更新信安模板
@@ -0,0 +1,9 @@
1、1008 校验异常,同一个域名支持多个主体但被校验返回异常(信安临时关闭)
2、ibs 因企业下只存在一个域名,当发起域名删除时会变为同步企业信息删除。但信安侧未删除域名信安信息。
3、信安系统到工信部 ftp 删除不稳定,会导致我们删了但是信安系统还有客户咨询为什么。
4、出现过一次 jyj.jiaozuo.gov.cn 域名查询异常,在信安测处理后查询正常(不知道他们是不是出问题了)
5、并发认证会失败
@@ -0,0 +1,264 @@
# 数据核实
1. 通过数据库表 `big_cloud_information_domain``information_user` 确认需要处理的信安信息现状,前者为域名信息,后者为企业信息。
2. 通过 IBS-信安对接群 与信安侧人员确认要处理的信安信息的存在性,一定要确认好两点:
1. 要删除的域名所属的主体下是否只有这一个域名;
2. 要删除的主体下的域名是不是预期要删除的所有域名。
> [!TIP]
>
> 如果发起企业信安信息删除,会将此企业下的所有域名删除。
>
> 如果当前域名是此企业下的最后一个域名,应发起企业信安信息删除,否则直接发起域名信安信息删除。
# 相关接口
> [!TIP]
>
> 每个请求接口中添加 HeadersAccessKey : dayun_admin
>
> 逻辑未使用但是接口有声明
## 新增企业信安信息
```json
{{}}/v1.0/add_user_info
{
"add_user_info_list": [
{
"add": "北京市朝阳区东风镇东枫德必 c 栋 1 层 c1",
"domain_info": [
{
"distribute_prov": [
"551",
"100",
"591",
"931",
"200",
"771",
"851",
"898",
"311",
"371",
"451",
"270",
"731",
"431",
"250",
"791",
"240",
"471",
"951",
"971",
"531",
"351",
"290",
"210",
"280",
"220",
"891",
"991",
"871",
"571",
"230"
],
"domain": "vodtest.manlaxy.com",
"domain_id_cdnsys": "jERiixMeU_sxtYZt",
"introduce_prov": "210",
"reg_id": "冀ICP备2022004811号-3",
"source_list": [
"origin.s.manlaxy.com"
],
"top_domain": "com",
"user_id_cdn": "jERiixMeU"
}
],
"id_number": "91131001MA0ELE1768",
"id_type": 1,
"officer_email": "",
"officer_employee": "刘洋",
"officer_id_no": "210404198209082434",
"officer_id_type": 2,
"officer_mobile": "18910285873",
"officer_tel": "",
"prov_id_list": [
"210"
],
"unit_name": "廊坊数云科技有限公司",
"unit_nature": 4,
"user_id_cdn": "jERiixMeU"
}
]
}
```
## 修改企业信安信息
```json
{{}}/v1.0/update_user_info
{
"update_user_info_list": [
{
"id_number": "91310113MA1GL9DG67",
"user_id_cdn": "CHDwiJoOf",
"unit_name": "上海梦曼网络科技有限公司",
"id_type": 1,
"unit_nature": 4,
"zip_code": "",
"add": "上海市闵行区光华路598号",
"officer_employee": "陈杰",
"officer_id_type": 2,
"officer_id_no": "310108199606290015",
"officer_tel": "",
"officer_mobile": "13817366987",
"officer_email": "bob@new1cloud.com",
"prov_id_list": [
"100"
],
"deleted": false
}
]
}
```
## 删除企业信安信息
```json
{{}}/v1.0/delete_user_info
{
"delete_user_info_list": [
{
"user_id_cdn": "vihrMBFok"
}
]
}
```
## 新增域名信安信息
```json
{{}}/v1.0/add_domain_info
{
"add_domain_info_list": [
{
"domain_id_cdnsys": "DtsPgBHHY_gPUcTP",
"domain": "valipl-vip.cp31.ott.cibntv.net.01.hy84739386.cn",
"source_list": [
"valipl-vip.cp31.ott.cibntv.net.upstream.myalicdn.com"
],
"reg_id": "京ICP备12001949号-1",
"top_domain": "net",
"user_id_cdn": "DtsPgBHHY",
"distribute_prov": [
"551",
"100",
"591",
"931",
"200",
"771",
"851",
"898",
"311",
"371",
"451",
"270",
"731",
"431",
"250",
"791",
"240",
"471",
"951",
"971",
"531",
"351",
"290",
"210",
"280",
"220",
"891",
"991",
"871",
"571",
"230"
],
"introduce_prov": "996",
"cp_domain": "valipl-vip.cp31.ott.cibntv.net"
}
]
}
```
## 修改域名信安信息
```json
{{}}/v1.0/update_domain_info
{
"update_domain_info_list": [
{
"distribute_prov": [
"210",
"571",
"791",
"471",
"280",
"531",
"371",
"731",
"250",
"100",
"551",
"220",
"230",
"311",
"351",
"240",
"431",
"451",
"591",
"270",
"200",
"771",
"898",
"851",
"871",
"891",
"290",
"931",
"971",
"951",
"991"
],
"domain": "sptest.tj.jcy.gov.cn.84.cdnhwcqir15.com",
"domain_id_cdnsys": "VFZKhiIyQ_wbhkrW",
"introduce_prov": "220",
"reg_id": "京ICP备10217144号-1",
"source_list": [
"test.eos-tianjin-1-internal.cmecloud.cn"
],
"top_domain": "gov.cn",
"user_id_cdn": "VFZKhiIyQ",
"cp_domain": "sptest.tj.jcy.gov.cn"
}
]
}
```
## 删除域名信安信息
```json
{{}}/v1.0/delete_domain_info
{
"delete_domain_info_list": [
{
"domain_id_cdnsys": "xdbLMBFMR_RLHYqZ"
}
]
}
```
@@ -0,0 +1,37 @@
| 分类 | 状态名 | 编码 |
| ---- | ---------------------- | --- |
| 初始化 | INIT | 0 |
| 待排期 | SCHEDULE | 1 |
| 待分发 | DISTRIBUTE | 2 |
| | WAF_DISTRIBUTE | 11 |
| 部署中 | DEPLOY | 3 |
| | CONFIG | 7 |
| | WAF_DEPLOY | 14 |
| | DEPLOY_CALLBACK | 15 |
| | SCHEDULE_DEPLOY | 16 |
| | DELETE_CHANGE_DNS | 19 |
| | OFF_LINE_DOMAIN_STATE | 21 |
| | YIWANG_WAITING | 22 |
| | UPDATE_DELETE | 29 |
| | UPDATE_CALLBACK | 30 |
| | UPDATE_DNS_DELETE | 31 |
| | UPDATE_WAITING_DELETE | 32 |
| | UPDATE_WAITING_CREATE | 33 |
| 已生效 | EFFICIENT | 4 |
| 部署失败 | DEPLOY_FAILED | 5 |
| 已停用 | DISABLE | 6 |
| 删除中 | DELETING | 8 |
| | DELETEBEGIN | 12 |
| | DELETECONFIG | 13 |
| | DELETE_CALLBACK | 17 |
| | SCHEDULE_DELETE | 18 |
| | YIWANG_DELETE_WAITING | 23 |
| | DELETE_INFORMATION | 28 |
| | DELETE_OM_APPROVING | 34 |
| 停用中 | DISABLING | 9 |
| | YIWANG_DISABLE_WAITING | 24 |
| 启用中 | ENABLING | 10 |
| | YIWANG_ENABLE_WAITING | 25 |
| 待配置 | BBOSS_INIT_STATE | 20 |
| 已保存 | OMS_WAIT | 26 |
| 待确认 | WAIT_CHECK | 27 |
@@ -0,0 +1 @@
![](../../../../attachment/images-uuid/c5963fdd1d2a4e808f2d76085a9e8c4f.png)
@@ -0,0 +1,108 @@
# 验收通过 - 点播
```json
{
"approve":0,
"code":"01241449_57",
"plain_info":[
{
"approve":0,
"domain_pre_info":[
{
"domain":"DevReq502294699A.komect.com",
"httpSelection":{
},
"plain_name":"华为平面",
"provinces":[
],
"schedule_type":"Forward",
"server_domain":[
"1.1.1.1"
],
"sources":[
{
"back_addr":"1.1.1.1",
"back_protocol":0,
"primary":true,
"type":"ip"
}
]
},
{
"domain":"DevReq502294699B.komect.com",
"httpSelection":{
},
"plain_name":"华为平面",
"provinces":[
],
"schedule_type":"Forward",
"server_domain":[
"1.1.1.1"
],
"sources":[
{
"back_addr":"1.1.1.1",
"back_protocol":0,
"primary":true,
"type":"ip"
}
]
}
],
"plain_name":"华为平面"
}
],
"try_time":1706080467000,
"user_id":"24"
}
```
# 验收通过 - 直播
```json
{
"approve":0,
"code":"01241743_34",
"plain_info":[
{
"approve":0,
"domain_pre_info":[
{
"domain":"DevReq532118819A.komect.com"
},
{
"domain":"DevReq532118819B.komect.com"
}
],
"plain_name":"华为平面"
}
],
"try_time":1706090129000,
"user_id":"24"
}
```
# 验收不通过
```json
{
"approve":1,
"code":"01241607_59_001",
"plain_info":[
{
"approve":1,
"domain_pre_info":[
],
"plain_name":"华为平面"
}
],
"try_time":1706085841000,
"user_id":"24"
}
```
@@ -0,0 +1,214 @@
# 数据统计
华为内容中心接口(ProductIdChargeInfoController
com.cmcc.cdn.platform.selfservice.controller.ProductIdChargeInfoController#queryStatisticBssCssFlow
查询cp_id与域名对应关系接口(ProductIdChargeInfoController
com.cmcc.cdn.platform.selfservice.controller.ProductIdChargeInfoController#getEnterpriseDomainInfo
---
实时监控 - 回源流量查询接口(CrsStatisticsController
com.cmcc.cdn.platform.selfservice.controller.CrsStatisticsController#getBackSourceFlow
实时监控 - 回源流量导出接口(CrsStatisticsController
com.cmcc.cdn.platform.selfservice.controller.CrsStatisticsController#getBackSourceFlowFile
带宽导出(CrsStatisticsController
com.cmcc.cdn.platform.selfservice.controller.CrsStatisticsController#getBwFile
---
大数据交互
BBossAndDssInteractiveService
# 页面
试商用客户峰值带宽(ReportController
com.cmcc.cdn.platform.selfservice.controller.vodstatistic.ReportController#getEnterprisePeekBW
# Cache+ 业务
## cache+域名省运营经理点删除
```
/configManage/domainOperate
```
### 调度回调接口
```
com.cmcc.cdn.platform.selfservice.controller.itcm.PortalDnsController#dnsCallBack
收到调度系统回调, data:{"configIds":[156827,156828],"operate":"DELETE","success":true}
```
## 创建企业
```
/cache/enterprise/order/submit
{
"enterpriseType": "省内自有业务",
"enterpriseName": "testbb",
"creditCode": "",
"enterProvince": "江苏",
"oaDetail": "1234567890",
"streamLog": "",
"contactName": "13554183478",
"contactPhone": "13554183478",
"contactEmail": "13554183478@163.com",
"chargeDetail": "",
"address": "浙江,杭州",
"fileIds": []
}
```
```
/workorder/approvedecision
id: 46544
option: ok
optionDetail:
type: CACHE_ENTERPRISE
secondCheck: true
```
# 集团业务管理员退回
```
/order/orderBack
```
# 业务单前置校验接口
```
/sync/BBOSS/PreCheckServ
com.cmcc.cdn.platform.selfservice.controller.ReceiveBbossOrderController#preCheckServeForBboss
```
# 商机与试用申请信息同步
## 创单
```
/sync/BBOSS/OpportunityTrialServ
```
## 集团业务管理员
### 受理按钮
```
POST /order/orderAccept
参数
orderId: 3522
```
> [!NOTE]
> 集团业务管理员受理后,如果是省侧工单会流转到 省业务管理员 再进行分配。
### 分配触发选择工单处理人(集团运营经理/省运营经理)
```
POST /order/getDistributeUsers
参数
orderId: 3522
```
### 进行分配(集团运营经理/省运营经理)
```
POST /order/distribute
参数
orderId: 3522
userId: 921
```
## 集团运营经理/省运营经理
### 受理按钮(弹出关联售前支撑工单)
```
GET /presales/workorder/gain/enter
```
### 点击确认(两个接口)
绑定
```
POST /presales/workorder/bind/order
参数
{"orderId":"3522","enterPriseName":"无","supportDemand":""}
```
受理
```
POST /order/orderAccept
参数
orderId=3522
```
## BPM 阶段反馈
```
POST /v1/cdn/business/change/adaptation/feedBack
```
## 政企客户经理管理员更换客户经理
获取客户经理
```
POST /selfService/enterprise/alterCm/getCmList
参数
provinceName: 政企分公司
```
点击变更确认
```
POST /selfService/enterprise/alterCm/getWorkOrderStatus
参数
cmZqId: 918
epid: 6qt5rc9n-sud7iy8xho6poxp8
```
确认(只是替换了 enterprise_info 的 account_manager_id
```
POST /selfService/enterprise/alterCm
oldCmZqId: 918
newCmZqId: 831
epid: 6qt5rc9n-sud7iy8xho6poxp8
```
## BPM 验收反馈
```
POST /api/bpm/feedback
```
# 增值业务工单
```
com.cmcc.cdn.platform.selfservice.controller.ReceiveBbossOrderController#receiveValueAddedServiceOrder
```
@@ -0,0 +1,61 @@
# 登录流程
> 联调环境为例
页面请求地址
```
https://t11.inte.p.cdn.10086.cn:9181/login/authv2
```
hosts 配置地址
```
172.21.16.68 t11.inte.p.cdn.10086.cn
```
对应 ng 查找路径
```shell
[tianzhuo@chiqingguo92 nginx]$ grep -r "9181" .
Binary file ./conf.d/iam.conf.error matches
./conf.d/iam-web.conf: #listen *:9181 ;
./conf.d/1: listen *:9181 ssl ;
./conf.d/1: proxy_pass http://172.21.16.202:9181;
./conf.d/iam-api-upstream.conf: server 172.21.16.202:9181 fail_timeout=10s;
./conf.d/iam-api.conf: listen *:9181 ssl ;
[tianzhuo@chiqingguo92 conf.d]$ cat iam-web.conf
server {
# listen *:80;
listen *:9180 ssl;
#listen *:9181 ;
ssl_certificate /etc/nginx/ssl/t12.inte.p.cdn.10086.cn.pem;
ssl_certificate_key /etc/nginx/ssl/t12.inte.p.cdn.10086.cn.key;
# ssl_session_cache shared:SSL:1m;
#ssl_session_timeout 10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
server_name t12.inte.p.cdn.10086.cn;
access_log /var/log/nginx/upstream3.log;
error_log /var/log/nginx/upstream3.error.log;
location / {
proxy_pass http://172.21.16.202:9180;
proxy_read_timeout 90;
proxy_connect_timeout 10;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-From-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
```
找到对应的地址为 http://172.21.16.202:9180;
@@ -0,0 +1,39 @@
```
<meta name="_csrf" content="ee4476e9-8a3c-4c72-b263-fe5d8f3ad18c">
<meta name="_csrf_header" content="X-CSRF-TOKEN">
```
```js
if (process.env.NODE_ENV == 'production') {
headers['X-Requested-With'] = 'XMLHttpRequest';
const _csrf_header = Dom.dom(Dom.query("meta[name='_csrf_header']")).attr('content');
const token = Dom.dom(Dom.query("meta[name='_csrf']")).attr('content');
if (_csrf_header && token) {
headers[_csrf_header] = token;
}
} else {
headers['X-CSRF-TOKEN'] = await XTOKEN();
}
```
```
x-csrf-token:ee4476e9-8a3c-4c72-b263-fe5d8f3ad18c
```
production 是生产。
下边是开发环境,会走 `/admin/getCurrentUser` 实际是后端的 `/getCurrentUser`
后台会
```java
CsrfToken csrfToken = (CsrfToken) request.getSession().getAttribute(IBSCsrfTokenRepository.class.getName().concat(".CSRF_TOKEN"));
if (csrfToken != null) {
userVO.setCsrfToken(csrfToken.getToken());
}
```
```
c23b84266a894c68b336073c7a185edd
acc94df0fbbc482ca535edb1e52e5b09
```
@@ -0,0 +1,35 @@
```
统计分析——用量查询(show_submenu
点播业务运维('TYMH_YWYW_JDGL', 'TYMH_YWYW_YMGL', 'TYMH_YWYW_HCCLGL_RDYZ', 'TYMH_YWYW'
点播业务运维——节点管理(TYMH_YWYW_JDGL && TYMH_YWYW_JDGL_EJZDYPM || TYMH_YWYW_JDGL_ZDYPM || TYMH_YWYW_JDGL_EJZDYPM
点播业务运维——节点管理——集中调度(secondScheduleValid
点播业务运维——节点管理——平面调度(secondScheduleValid
点播业务运维——节点管理——自定义平面(!secondScheduleValid
点播业务运维——调度管理(secondScheduleValid
点播业务运维——调度管理(!secondScheduleValid
安全防护(wafopen
账户管理——角色权限管理(roleauth)
账户管理——角色管理(roleauth)
产品管理(cpType!='THIRD'&&enterpriseStatus!=null&&enterpriseStatus!='INIT'&&enterpriseStatus!='FAILED'&&(isThirdParty==null||isThirdParty==false)
安全防护(waf
内容管理('TYMH_YWYW_NRGL','NEW_NRGL'
日志管理——日志订阅('TYMH_YYGL_RZGL','NEW_RZGL_RZDY'
日志管理——日志列表('TYMH_YYGL_RZGL','NEW_RZGL_RZLB'
计费对账(cpType == 'BSS'
工单管理((forward && (cpType == 'WEB'|| cpType == 'BSS')) || (isThirdParty == true && role == 'CP')
工单管理——新建工单((cpType != 'BSS') && (role != 'CP')) || (cpType != 'BSS' && role == 'CP'&& enableCreateOrders) || cpType == 'BSS'
企业管理(!${role == 'CMA_GROUP' || role == 'GRP_ADMIN' || role == 'GRP_BS_LEADER' || role == 'GRP_BS_MEMBER' || roleWaf || role == 'CP' || role == 'CP_SUB'}
证书管理('NEW_CERT_MANAGEMENT','GRP_AUTH'
帮助中心1 'HELP_CENTER''HELP_CENTER_EDIT'
帮助中心2 SSO_ASPIRE_REPOSITORY' || 'HELP_CENTER_WOMS'
帮助中心3 HELP_CENTER_QUERY'&&'HELP_CENTER_EDIT' &&SSO_ASPIRE_REPOSITORY && !HELP_CENTER_WOMS
```
@@ -0,0 +1,48 @@
# 配置证书按钮
```log
02:05:52 [ibs-portal:DESKTOP-EDQ1M7C:8080,,,,] [http-nio-8080-exec-6] INFO com.cmcc.cdn.platform.selfservice.service.crt.impl.CertificateTracServiceImpl 1064 getDomainBindInfo - 证书域名校验,证书名称:03191002_32
02:05:55 [ibs-portal:DESKTOP-EDQ1M7C:8080,,,,] [http-nio-8080-exec-9] INFO com.cmcc.cdn.platform.selfservice.service.crt.impl.CertificateTracServiceImpl 261 sendToCrtPlatForm - 下发证书到证书系统:03191002_32
02:05:55 [ibs-portal:DESKTOP-EDQ1M7C:8080,,,,] [http-nio-8080-exec-9] INFO com.cmcc.cdn.platform.selfservice.service.crt.impl.CertificateServiceImpl 210 saveCertificate - 证书系统返回响应:idResponse:{"error_code":0,"error_msg":"success.","uniqueId":"20240319100589--d5fb-40a3-9cfb-d85aca09cea5"}
02:05:55 [ibs-portal:DESKTOP-EDQ1M7C:8080,,,,] [http-nio-8080-exec-9] INFO com.cmcc.cdn.platform.selfservice.service.crt.impl.CertificateServiceImpl 217 saveCertificate - 证书:03191002_32 上传成功,唯一id:20240319100589--d5fb-40a3-9cfb-d85aca09cea5
02:05:55 [ibs-portal:DESKTOP-EDQ1M7C:8080,,,,] [http-nio-8080-exec-9] INFO com.cmcc.cdn.platform.selfservice.service.crt.impl.CertificateOrderServiceImpl 54 createOrders - 新增操作不生成工单...
```
## 提交配置证书触发校验接口
```
/crt/checkDomain?domain=&certName=03191002_32&_=1710813951698
/crt/getPublicKey?_=1710813952378
/crt/save
```
携带参数
![](../../../../attachment/images-paste/image-20240319101332076.png)
# 查询列表数据来源
```
/crt/list?pageNum=1&pageSize=10&name=&enterpriseId=&uniqueId=&domain=&search=&_=1710832023802
```
绑定域名:`cert_bind_domain`
# 部署按钮列表
```
/crt/domain/deploy/list?crtUniqueId=20240319100589--d5fb-40a3-9cfb-d85aca09cea5&_=1710832805993
```
部署域名:`cert_domain_deploy`
# 证书编辑 - 域名绑定情况
```
/crt/list/unbindDomain?enterpriseId=fr8v9e34-rnfrte8htfnlut1o&certUniqueId=20240319100589--d5fb-40a3-9cfb-d85aca09cea5&_=1710833401536
```
只取定制化域名
@@ -0,0 +1,281 @@
# 提单前台
![](../../../../attachment/images-uuid/693cd68687d040ef952976cee6bde0e4.png)
# 处理流程
## 获取企业产品
![](../../../../attachment/images-uuid/4da9fd5979524ed7b2aa1fd55e848233.png)
/workorder/filter/product?enterpriseId=impdmahu-qxqlctq2lghkfq7q&operateType=add
正哥已处理
operateType 如果是删除:已开通
operateType 如果是删除:已开通、试用中
ep_product_chargemode 查询产品
转换为 ProductsBBossEnum 中的产品
无暂停单 && 无注销单 && (开通的 || 试用单没走完的删了域名的)
# 提单(政企客户经理/省客户经理)
/workorder/custom/save
com.cmcc.cdn.platform.selfservice.controller.NewWorkOrderController#save
#### 提单参数
```json
{
"code": null,
"type": "domain_request",
"model": null,
"source": null,
"enterpriseCpId": null,
"name": null,
"mobile": null,
"email": null,
"createUser": null,
"corp": null,
"creatorInfo": null,
"dealer": null,
"createTime": null,
"state": null,
"approve": null,
"description": "",
"domain": null,
"https": null,
"keyLessFlag": null,
"keyless": null,
"speedDomain": null,
"speedList": [
{
"domain": "20250822110828.komect.com",
"cpDomain": "",
"icpNumber": "京ICP备0500_komect.com_12号",
"mainLoopDomain": null,
"loopDomain": null,
"loopType": null
}
],
"product": "网页加速",
"port": null,
"provinces": [
33
],
"plains": null,
"orignAddress": null,
"loopDomain": [
{
"value": "[2001:0db8:85a3:0000:0000:8a2e:0370:7334]:80",
"type": "ip",
"mainFlag": true,
"weight": null
}
],
"md5List": [
"eehgcudaliutvzavcyv7xysao"
],
"requirement": "add",
"enterprise": "awgb5qxx-hdmw9aygdphcswsi",
"icpNumber": null,
"isBatch": null,
"fileId": null,
"id": null,
"secInfoFileId": [
"0rawbsu5ee2ygvcyq13jpuri2"
],
"plane": null,
"httpSelection": {
"http": null,
"https": null
},
"domainType": null,
"subdomain": null,
"isSubscribe": null,
"productId": "PRODUCTID1747035900"
}
```
存在性校验:
self_service_domain_config
work_order_cache_domain
batch_self_domain
configure_list、speed_configure_domain、work_order
live_order_info、live_order_domain_info
---
主表:work_order
子表:configure_list (映射)
配置表:orign_address、speed_configure_domain、batch_self_domain(批量)
审批记录:domain_history(刚开始会创建两条记录)
域名表:self_service_domain_config、live_stream_domain_config(直播)
附件:log_file_resource
企业工单关系表:worker_order_enterprise
更新:configure_list 的 record_number 和 self_service_domain_config 的合法性。
更新:domain_history 会设置校验状态 isIcpCheckCompleted、isIcpCheckSuccess
随后找人的时候会设置:approvingUserid、approvingMobile、dealer(下一个审批人角色)、userTemp(审批过的人)
### 审批下发 BPM(集团客户经理管理员)
/workorder/approvedecision
下发话单
置空 approvingUserid、approvingMobile
增加审批记录。
### 下发 BPM 人员选择
根据创单人判断
省客户经理:取省 SA,如果没有取 徐娜 GLOBAL_AREA_MANAGER_ID
不是省客户经理 :取 SA,如果没有取 徐娜 GLOBAL_AREA_MANAGER_ID
#### 阶段反馈
com.cmcc.cdn.platform.selfservice.order.DomainOrderService#domainOrderStageFeedback
针对阶段反馈成功只是更改了 bpmTaskDao 表的状态
#### 回退接口
work_order 表
configure_list 表
通过 `domain_history`​校验是否已通过备案
如果备案未完成不可驳回
退回工单至发起人处
如果是批量域名需要删除对应的表
关话单
删除域名,发邮件
`domain_history`​记录
![](../../../../attachment/images-uuid/91fdfa5d86b04aa69ad894325eaa7301.png)
## 工单列表查询
/workorder/getworkList
![](../../../../attachment/images-uuid/15e2021af5cf402caae8da61ee7ab567.png)
```json
{
"data":[
{
"approving":true,
"approvingWorker":"政企分公司|政企汤汤|18867102345",
"corpName":"ECName-1701700035",
"createUser":false,
"customConfig":false,
"dealer":"政企客户经理",
"details":"20231204233906.komect.com",
"distribute":false,
"enumType":"domain_request",
"id":347411,
"mobile":"18867102345",
"modifying":true,
"orderType":0,
"orderTypeCheck":false,
"prohibited":false,
"status":"bpmReject",
"time":"2023-12-04 23:40",
"type":"域名配置需求",
"user":"政企汤汤 | 18867102345 | lichunliang@cmhi.chinamobile.com"
}
],
"pageNum":1,
"pageSize":10,
"total":1
}
```
![](../../../../attachment/images-uuid/dbf72bd18a6b4f06bc55c096315941bf.png)
```json
{
"data":[
{
"approving":false,
"corpName":"xj测试企业193",
"createUser":true,
"customConfig":false,
"details":"p193000925001",
"distribute":false,
"enumType":"DOMAIN_MIGRATE",
"id":347374,
"modifying":false,
"orderType":0,
"orderTypeCheck":false,
"prohibited":false,
"status":"finished",
"time":"2023-11-13 16:18",
"type":"订购迁移工单",
"user":"政企汤汤|18867102345"
}
],
"pageNum":1,
"pageSize":10,
"total":1
}
```
`WorkOrder`​的 status 决定列表
## 工单详情
/workorder/detail
## 域名配置工单修改合法性位置
com.cmcc.cdn.platform.selfservice.order.DomainOrderService#updateCheckedIcpInfo
## 客户经理修改工单接口
```
http://dev.p.cdn.10086.cn:8080/workorder/modify/detail
id: 347652
type: domain_request
```
上传附件普通
/workorder/custom/upload
删除附件
/workorder/custom/deleteFile
上传信安附件
/workorder/requestDomain/upload
@@ -0,0 +1,122 @@
## 获取加速域名接口
/workorder/cmcustom/getEffectTrailInfo
![](../../../../attachment/images-uuid/890e09e81ded4b199939267edf9ee3f5.png)
![](../../../../attachment/images-uuid/16ce6c644f104d96ab8b1725c8f59250.png)
## 提单接口(政企客户经理/省客户经理——直接下发 BPM)
/workorder/adapt/configchange
## 下发 BPM 参数
重点关注的 `cdn_type`y 已经进行过处理是通过前台页面过来的解析
```json
{
"accessSystem":"IBS",
"account":"CDN-IBS",
"code":"002-20231217001",
"data":{
"cdn_type":"LowLatencyLive",
"cpId":"83585286",
"domains":[
"DevReq363613166.komect.com"
],
"nameOfClient":"ECName-1700620430",
"operMail":"lichunliang@cmhi.chinamobile.com",
"operTel":"18867102345",
"operUser":"18867102345cmcc",
"sourceBasis":"002-20231217001",
"sourceOfDemand":"ESOPIBS平台)",
"summaryOfDemand":"其他说明"
},
"processType":"4",
"userList":[
{
"userMail":"remaxob441@kamismail.comabc",
"userName":"15700197926cmcc",
"userTel":"15700197926"
}
]
}
```
## 业务管理员回退流程
/workorder/approvedecision
com.cmcc.cdn.platform.selfservice.order.WorkOrderServiceImpl#decision
com.cmcc.cdn.platform.selfservice.order.DomainOrderService#decision
com.cmcc.cdn.platform.selfservice.order.DomainOrderService#cmaOrderReject
com.cmcc.cdn.platform.selfservice.service.impl.DomainDeleteTrancServiceImpl#deleteDomainFromIbs
# 确认项
需求变更工单对于绑定证书的域名更换证书,能否正常验收反馈
1. 准备一个已绑定证书的自助域名
2. 通过需求变更工单验收修改证书
3. 观察证书域名绑定情况。
4. 域名是否挂到了新证书下。
20240409154911--4b35-42ba-8a94-605964c2857e
试用单:验收反馈
![](../../../../attachment/images-paste/image-20240409155202130.png)
![](../../../../attachment/images-paste/image-20240409155322109.png)
![](../../../../attachment/images-paste/image-20240409155338836.png)
![](../../../../attachment/images-paste/image-20240409155407570.png)
20240409155625--2b71-4a5c-9b1c-2ec19f90488a
04091555_59
变更单:验收反馈
![](../../../../attachment/images-paste/image-20240409160316993.png)
![](../../../../attachment/images-paste/image-20240409160358207.png)
![](../../../../attachment/images-paste/image-20240409160413162.png)
![](../../../../attachment/images-paste/image-20240409160436906.png)
自助域名
83538802
20240409161187--9c5e-43d0-aca4-c8fc65f15cf4
04091611_15
![](../../../../attachment/images-paste/image-20240409161720709.png)
![](../../../../attachment/images-paste/image-20240409161750813.png)
![](../../../../attachment/images-paste/image-20240409161804426.png)
![](../../../../attachment/images-paste/image-20240409161823266.png)
需求变更
20240409162083--ebaa-4df6-9ee6-f51d3068aa41
04091618_58
![](../../../../attachment/images-paste/image-20240409164150542.png)
![](../../../../attachment/images-paste/image-20240409164204915.png)
![](../../../../attachment/images-paste/image-20240409164222073.png)
![](../../../../attachment/images-paste/image-20240409164243241.png)
@@ -0,0 +1,87 @@
# 自助域名提单截图(适配开发关闭)
![](../../../../attachment/images-uuid/6ef2d0ade42840fab3afee2e025e70b5.png)
## 后台接口
### 提单入口
```java
/cache/domain/order/submit
```
### 省业务管理员、集团运营经理审批
```java
/workorder/approvedecision
```
### 省运营经理点击配置
```java
/configManage/update/domain
```
### 提交配置接口
```java
/configManage/update/config
```
参数:
![](../../../../attachment/images-paste/image-20240319103239062.png)
有同步信安信息
上传证书操作
com.cmcc.cdn.platform.selfservice.service.impl.DomainStateServiceImpl#uploadCrtAndSaveDomain
com.cmcc.cdn.platform.selfservice.service.crt.impl.CertificateServiceImpl#uploadAndBindDomain
如果传了证书 ID
自助的变化的需要通知绑定
状态:UNUSED -》 ISSUE
部署:20240319102014.komect.com,0,0
绑定:20240319102014.komect.com,0
![](../../../../attachment/images-paste/image-20240319111737509.png)
## 流转流程
省运营经理 -23(创建后可直接结束,可提交点播业务目前)
-> 省业务管理员 -21(同意、终止、退回)
-> 集团运营经理 -22(同意、终止、退回,域名入库)
-> 省运营经理 -23(配置触发管道化下发,并生成域名配置记录工单)
-> 配管回调(pipe_config_entity 为管道化任务表,配管回调后任务记录消失,域名已生效,工单结束)
## 后台流程
```mermaid
sequenceDiagram
接受请求(控制层)->> + 生成工单:创建工单createCachePlusDomainWorkOrder
生成工单 ->>生成工单:如果是企业客户,需要绑定运营经理
生成工单 ->>生成工单:createFrom工单参数转换,work_order_cache_domain、work_order
生成工单 ->>生成工单:新增泛域名之间关系校验
生成工单 ->>生成工单:创单人审批记录work_order_cache_domain_history
生成工单 ->>生成工单:Icp审批记录work_order_cache_domain_history
生成工单 ->>生成工单:工单入库
生成工单 -->> - 接受请求(控制层):获得work_order_cache_domain表信息
接受请求(控制层)-x信安信息:rabbitmq异步处理
MQ信安信息消费者 ->> 消费者:待补充主要是信安校验和信安同步
接受请求(控制层)->>保存工单和企业关系:worker_order_enterprise
接受请求(控制层)-x订阅日志:如程序无异常默认订阅,异常捕获程序正常结束
```
## 已生效显示配置
![](../../../../attachment/images-paste/image-20240319155317842.png)