init: IotLCM 开源版部署仓
内容: - docker-compose.yml:14 个基础/业务服务 + 3 个可选 profile(with-mock 挡板、with-bot、with-nginx) - .env.example:集中管理镜像仓库、口令、端口;必填项缺失时 compose 直接报错退出 - config.example/:10 份配置模板,全部为占位值与注释说明 - schema/:12 个初始化脚本,按文件名顺序由 MySQL initdb 自动执行 脱敏处理: - 生产/内网 IP、镜像仓库地址、公司名、真实域名全部清除 - 演示账号保留 18 个(出库与划拨依赖账号与部门树的关联), 昵称/邮箱/手机号/登录IP/头像改为占位或编造值 - 数据库账号与 admin 口令改为初始化时按 .env 注入计算 - 通道模板与 Mock 通道的上游密钥置空 - Mock 通道地址指向 compose 内 onelink-mock 服务 部署时用 --profile with-mock 启动运营商接口挡板,即可在无真实运营商环境时跑通全链路。
This commit is contained in:
@@ -0,0 +1,95 @@
|
||||
# ============================================================
|
||||
# IotLCM 部署环境变量
|
||||
#
|
||||
# cp .env.example .env
|
||||
#
|
||||
# 标注「必填」的变量未设置时 docker compose 会直接报错退出,
|
||||
# 避免用弱口令启动。口令建议用 openssl rand -base64 24 生成。
|
||||
# ============================================================
|
||||
|
||||
# ---------- 镜像 ----------
|
||||
# 镜像仓库地址(不含末尾斜杠)。
|
||||
# 基础组件从 <REGISTRY>/library/ 拉取,业务镜像从 <REGISTRY>/iotlcm/ 拉取。
|
||||
REGISTRY=your-registry.example.com
|
||||
|
||||
# 镜像标签。生产建议用不可变标签(版本号或 commit sha),不要用 latest。
|
||||
TAG=latest
|
||||
|
||||
# ---------- 时区 ----------
|
||||
TZ=Asia/Shanghai
|
||||
|
||||
# ---------- 必填:数据库 ----------
|
||||
# MySQL root 口令
|
||||
MYSQL_ROOT_PASSWORD=change-me-strong-password
|
||||
|
||||
# 数据库名
|
||||
MYSQL_DATABASE=db_iotlcm
|
||||
|
||||
# 应用连接账号 u_iotlcm 的口令(首次启动时创建)
|
||||
MYSQL_APP_PASSWORD=change-me-strong-password
|
||||
|
||||
# admin 初始登录口令(首次启动时写入数据库)
|
||||
# 登录后请立即在「个人中心」修改
|
||||
MYSQL_ADMIN_PASSWORD=change-me-admin-password
|
||||
|
||||
# ---------- 必填:Redis ----------
|
||||
REDIS_PASSWORD=change-me-strong-password
|
||||
|
||||
# ---------- 必填:RabbitMQ ----------
|
||||
RABBITMQ_USER=iotlcm
|
||||
RABBITMQ_PASSWORD=change-me-strong-password
|
||||
|
||||
# ---------- 必填:JWT 签名密钥 ----------
|
||||
# admin-svr / openapi / app-server 必须使用同一个值,否则令牌跨服务不通用。
|
||||
# 生成:openssl rand -hex 32
|
||||
# 注意:更换此值会使已签发的所有登录态与接口令牌立即失效。
|
||||
JWT_SIGNING_KEY=change-me-run-openssl-rand-hex-32
|
||||
|
||||
# ---------- 可选:智能诊断内部凭据 ----------
|
||||
# admin-svr 与 upstream-proxy 必须一致。留空则该功能不可用。
|
||||
DIAGNOSIS_INTERNAL_TOKEN=
|
||||
|
||||
# ---------- 可选:短信服务商 ----------
|
||||
# 不启用短信时保持空值,并把配置里的 warning.sms.enabled 改为 false
|
||||
SMS_ACCESS_KEY_ID=
|
||||
SMS_ACCESS_KEY_SECRET=
|
||||
|
||||
# ---------- 可选:飞书通知(bot 服务) ----------
|
||||
# 不启用 bot 时不填,且不启动该容器
|
||||
FEISHU_APP_ID=
|
||||
FEISHU_APP_SECRET=
|
||||
FEISHU_CHAT_ID=
|
||||
|
||||
# ---------- 端口(宿主机侧) ----------
|
||||
# 仅监听 127.0.0.1 的服务需通过反向代理对外
|
||||
ADMIN_SVR_PORT=8008
|
||||
ADMIN_UI_PORT=8009
|
||||
OPENAPI_PORT=8000
|
||||
APP_SERVER_PORT=8010
|
||||
APP_WEB_PORT=8018
|
||||
DOCS_PORT=8019
|
||||
MOCK_PORT=8080
|
||||
|
||||
# 以下服务监听所有网卡(容器间互访也走这些端口)
|
||||
MYSQL_PORT=3306
|
||||
REDIS_PORT=6379
|
||||
RABBITMQ_PORT=5672
|
||||
RABBITMQ_MGMT_PORT=15672
|
||||
CONSUL_PORT=8500
|
||||
CHAN_HTTP_PORT=8110
|
||||
CHAN_GRPC_PORT=8310
|
||||
PROXY_PORT=8510
|
||||
SMS_HTTP_PORT=11190
|
||||
SMS_GRPC_PORT=11200
|
||||
|
||||
# nginx 对外端口(仅 --profile with-nginx)
|
||||
NGINX_HTTP_PORT=80
|
||||
|
||||
# ---------- 可选:TDengine(流量历史) ----------
|
||||
# 不启用时序库时全部留空,相关历史流量查询功能不可用,不影响主流程。
|
||||
TDENGINE_HOST=
|
||||
TDENGINE_PORT=6041
|
||||
TDENGINE_USER=root
|
||||
TDENGINE_PASSWORD=
|
||||
TDENGINE_DAILY_DB=iotlcm_daily
|
||||
TDENGINE_MONTHLY_DB=iotlcm_monthly
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
# 运行时数据(含数据库文件、日志、上传件)
|
||||
data/
|
||||
|
||||
# 实际配置(由 config.example 复制而来,含真实凭据)
|
||||
config/
|
||||
|
||||
# 环境变量文件
|
||||
.env
|
||||
|
||||
# 编辑器与系统文件
|
||||
.DS_Store
|
||||
*.swp
|
||||
.idea/
|
||||
.vscode/
|
||||
@@ -0,0 +1,228 @@
|
||||
# ============================================================
|
||||
# iotlcm-admin-svr 配置示例
|
||||
#
|
||||
# cp config.example.yaml config.yaml
|
||||
#
|
||||
# 标注「必改」的项需要按实际环境填写;
|
||||
# 其余为可运行默认值,按需调整。
|
||||
# 支持 ${VAR} 与 ${VAR:default} 环境变量占位(由 compose 注入)。
|
||||
# ============================================================
|
||||
|
||||
system:
|
||||
name: "IotLCM"
|
||||
version: "1.0"
|
||||
description: "IotLCM Server"
|
||||
gfmode: "prod" # prod / dev
|
||||
upload:
|
||||
local:
|
||||
path: "resource/upload"
|
||||
|
||||
workerDiagnostic:
|
||||
enabled: true
|
||||
|
||||
server:
|
||||
address: ":8008"
|
||||
openapiPath: "/api.json"
|
||||
swaggerPath: "/swagger"
|
||||
indexFiles: ["index.html", "index.htm"]
|
||||
indexFolder: false
|
||||
fileServerEnabled: true
|
||||
initLoadMemoryDB: false
|
||||
maxHeaderBytes: "20KB"
|
||||
clientMaxBodySize: "200MB"
|
||||
|
||||
logger:
|
||||
path: "/app/logs"
|
||||
file: "{Y-m-d-H}.log"
|
||||
prefix: ""
|
||||
level: "info"
|
||||
timeFormat: "2006-01-02T15:04:05"
|
||||
ctxKeys: []
|
||||
header: true
|
||||
stdout: true
|
||||
rotateSize: 0
|
||||
rotateExpire: 0
|
||||
rotateBackupLimit: 0
|
||||
rotateBackupExpire: 0
|
||||
rotateBackupCompress: 0
|
||||
rotateCheckInterval: "1h"
|
||||
stdoutColorDisabled: false
|
||||
writerColorEnable: false
|
||||
|
||||
# ---------- JWT ----------
|
||||
# 必改:signingKey 必须与 openapi、app-server 完全一致。
|
||||
jwt:
|
||||
signingKey: "${JWT_SIGNING_KEY}"
|
||||
expiresTime: 7d
|
||||
bufferTime: 1d
|
||||
issuer: iotlcm
|
||||
|
||||
captcha:
|
||||
keyLong: 6
|
||||
imgWidth: 240
|
||||
imgHeight: 80
|
||||
openCaptcha: 0
|
||||
openCaptchaTimeout: 3600
|
||||
|
||||
# ---------- 数据库 ----------
|
||||
database:
|
||||
# 旧平台库(历史数据对接)。不使用时空 link 即可。
|
||||
legacyCard:
|
||||
link: ""
|
||||
debug: false
|
||||
maxOpen: 5
|
||||
maxIdle: 2
|
||||
logger:
|
||||
path: "/app/logs"
|
||||
level: "all"
|
||||
stdout: true
|
||||
default:
|
||||
# 必改:连接串格式为 mysql:用户名:口令 再接 tcp(主机:端口)/库名?参数
|
||||
link: "mysql:u_iotlcm:${MYSQL_APP_PASSWORD}@tcp(mysql:3306)/${MYSQL_DATABASE}?charset=utf8mb4&parseTime=True&loc=Asia%2FShanghai"
|
||||
debug: false
|
||||
charset: "utf8mb4"
|
||||
dryRun: false
|
||||
maxIdle: 30
|
||||
maxOpen: 100
|
||||
maxLifetime: 120
|
||||
memorydb:
|
||||
link: "sqlite::@file(:memory:)"
|
||||
debug: false
|
||||
maxIdle: 1
|
||||
maxOpen: 1
|
||||
maxLifetime: 30
|
||||
|
||||
cache:
|
||||
adapter: "redis"
|
||||
fileDir: "/app/cache"
|
||||
|
||||
batch:
|
||||
allocate:
|
||||
chunkSize: 5000
|
||||
maxFileSize: 52428800 # 50MB
|
||||
|
||||
# ---------- 流量预警 ----------
|
||||
warning:
|
||||
expire:
|
||||
firstWarnDays: 30
|
||||
secondWarnDays: 15
|
||||
thirdWarnDays: 7
|
||||
|
||||
# 短信通道:指向 iotlcm-sms 服务。不用短信时 enabled 改 false。
|
||||
sms:
|
||||
enabled: true
|
||||
url: "http://iotlcm-sms:11190/api/v1/sms/send"
|
||||
grpcAddr: "iotlcm-sms:11200"
|
||||
timeout: "5s"
|
||||
# 以下为短信服务商参数,一般留空(由 sms 服务统一持有)
|
||||
routerId: 0
|
||||
serviceType: ""
|
||||
regionId: ""
|
||||
accessKeyId: ""
|
||||
accessKeySecret: ""
|
||||
sdkAppId: ""
|
||||
signName: ""
|
||||
templateId: ""
|
||||
msgContentTemplate: ""
|
||||
|
||||
# 微信小程序订阅消息。不用时 enabled 改 false。
|
||||
wechat:
|
||||
enabled: false
|
||||
appId: ""
|
||||
appSecret: ""
|
||||
templateId: ""
|
||||
page: "pages/message/index"
|
||||
timeout: "5s"
|
||||
|
||||
# ---------- 注册验证码 ----------
|
||||
register:
|
||||
# 走 HTTP 短信网关
|
||||
sms:
|
||||
url: ""
|
||||
method: "POST"
|
||||
headers: {}
|
||||
bodyTemplate: '{"phone":"{contact}","code":"{code}"}'
|
||||
successStatus: 200
|
||||
# 走 SMTP 邮件
|
||||
email:
|
||||
host: "" # 如 smtp.example.com
|
||||
port: 465
|
||||
username: ""
|
||||
password: ""
|
||||
from: ""
|
||||
fromName: "物联网卡管理平台"
|
||||
subject: "注册验证码"
|
||||
bodyTemplate: "您的注册验证码是:{code},6小时内有效。"
|
||||
ssl: true
|
||||
|
||||
# ---------- Redis ----------
|
||||
redis:
|
||||
default:
|
||||
mode: "single" # single / cluster / sentinel
|
||||
sentinelMasterName: ""
|
||||
address: "redis:6379"
|
||||
db: 0
|
||||
pass: "${REDIS_PASSWORD}"
|
||||
minIdle: 5
|
||||
maxIdle: 30
|
||||
maxActive: 5000
|
||||
idleTimeout: "60s"
|
||||
ClientName: "SystemCache"
|
||||
|
||||
# ---------- RabbitMQ ----------
|
||||
rabbitmq:
|
||||
enabled: true
|
||||
dsn: "amqp://${RABBITMQ_USER}:${RABBITMQ_PASSWORD}@rabbitmq:5672/"
|
||||
|
||||
# ---------- TDengine(流量历史) ----------
|
||||
# 需要 TDengine 3.x 的 WebSocket 接口(6041)。
|
||||
# 不启用时序库时 link 留空,历史流量相关功能不可用。
|
||||
tsdb:
|
||||
database: "TdEngine"
|
||||
tdengine:
|
||||
type: "taosWS"
|
||||
dsn: "${TDENGINE_USER}:${TDENGINE_PASSWORD}@ws(${TDENGINE_HOST}:${TDENGINE_PORT})/"
|
||||
dbName: "${TDENGINE_DAILY_DB}"
|
||||
dailyDbName: "${TDENGINE_DAILY_DB}"
|
||||
monthlyDbName: "${TDENGINE_MONTHLY_DB}"
|
||||
maxOpenConns: 100
|
||||
maxIdleConns: 10
|
||||
|
||||
# ---------- 免登录白名单 ----------
|
||||
router:
|
||||
exceptLogin:
|
||||
- /api/v1/system/auth/login
|
||||
- /api/v1/system/auth/refresh
|
||||
- /api/v1/system/captcha
|
||||
- /api/v1/system/auth/getTenantList
|
||||
- /openapi/v3/query/token
|
||||
- /api/v1/system/tTplatformSetting/view
|
||||
- /api/v1/pay/alipay/notify
|
||||
- /api/v1/pay/alipay/return
|
||||
|
||||
# ---------- 支付宝(可选) ----------
|
||||
# 不使用支付功能时整段删掉。
|
||||
alipay:
|
||||
appId: ""
|
||||
privateKey: ""
|
||||
alipayPublicKey: ""
|
||||
notifyUrl: "https://your-domain.example.com/api/v1/pay/alipay/notify"
|
||||
returnUrl: "https://your-domain.example.com/#/enterpriseManagement/tBalanceDetail/tAgentBalance"
|
||||
isProduction: false
|
||||
|
||||
pay:
|
||||
expireTime: 60
|
||||
balanceRecharge:
|
||||
timeoutDelay: "30m"
|
||||
|
||||
# ---------- 上游服务地址 ----------
|
||||
# 指向同 compose 内的服务名,一般无需修改。
|
||||
upstream:
|
||||
# 控制台智能诊断内部凭据,须与 upstream-proxy 的 appDiagnosis.internalToken 一致
|
||||
appDiagnosisToken: "${DIAGNOSIS_INTERNAL_TOKEN}"
|
||||
proxy:
|
||||
address: "upstream-proxy:8510"
|
||||
timeout: 10s
|
||||
gateway:
|
||||
address: "upstream-chan:8110"
|
||||
timeout: 10s
|
||||
@@ -0,0 +1,61 @@
|
||||
server {
|
||||
listen 80;
|
||||
root /usr/share/nginx/html;
|
||||
index index.html;
|
||||
|
||||
charset utf-8;
|
||||
client_max_body_size 200m;
|
||||
access_log /var/log/nginx/access_admin-ui.log;
|
||||
error_log /var/log/nginx/error_admin-ui.log;
|
||||
|
||||
# 入口 HTML 不强缓存,保证发布后立即生效
|
||||
location = /index.html {
|
||||
try_files $uri =404;
|
||||
add_header Cache-Control no-cache,no-store,must-revalidate always;
|
||||
add_header Pragma no-cache always;
|
||||
add_header Expires 0 always;
|
||||
}
|
||||
|
||||
# 运行时配置文件不强缓存
|
||||
location ~* ^/(?:_app[.]config[.]js|config[.]json|menu-setting[.]json|setting[.]json)$ {
|
||||
try_files $uri =404;
|
||||
add_header Cache-Control no-cache,no-store,must-revalidate always;
|
||||
add_header Pragma no-cache always;
|
||||
add_header Expires 0 always;
|
||||
}
|
||||
|
||||
# 带 hash 的静态资源长期缓存
|
||||
location ~* ^/(?:js|jse|css)/ {
|
||||
try_files $uri =404;
|
||||
add_header Cache-Control public,max-age=31536000,immutable always;
|
||||
}
|
||||
|
||||
location / {
|
||||
try_files $uri $uri/ /index.html;
|
||||
}
|
||||
|
||||
# 后端 API 转发(同 compose 内服务名)
|
||||
location /api/ {
|
||||
proxy_set_header Connection upgrade;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_http_version 1.1;
|
||||
chunked_transfer_encoding off;
|
||||
proxy_pass http://admin-svr:8008/api/v1/;
|
||||
proxy_redirect off;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
}
|
||||
|
||||
# 上传文件目录(与 admin-svr 共享同一挂载卷)
|
||||
location /upload/ {
|
||||
alias /app/upload/;
|
||||
}
|
||||
|
||||
location /app/upload/ {
|
||||
alias /app/upload/;
|
||||
}
|
||||
|
||||
gzip on;
|
||||
gzip_types text/plain application/javascript text/css application/json;
|
||||
}
|
||||
@@ -0,0 +1,263 @@
|
||||
# ============================================================
|
||||
# iotlcm-app-server 配置示例
|
||||
#
|
||||
# cp config.example.yaml config.yaml
|
||||
#
|
||||
# 小程序 / H5 端的后端服务。
|
||||
# ============================================================
|
||||
|
||||
system:
|
||||
name: "IotLCM"
|
||||
version: "1.0"
|
||||
description: "IotLCM App Server"
|
||||
gfmode: "prod"
|
||||
upload:
|
||||
local:
|
||||
path: "resource/upload"
|
||||
|
||||
server:
|
||||
address: ":8010"
|
||||
openapiPath: "/api.json"
|
||||
swaggerPath: "/swagger"
|
||||
indexFiles: ["index.html", "index.htm"]
|
||||
indexFolder: false
|
||||
serverRoot: "resource/public"
|
||||
searchPaths: ["/resource/public"]
|
||||
fileServerEnabled: true
|
||||
initLoadMemoryDB: false
|
||||
maxHeaderBytes: "20KB"
|
||||
clientMaxBodySize: "200MB"
|
||||
readTimeout: "20m"
|
||||
writeTimeout: "20m"
|
||||
allowedDomains: []
|
||||
enabledDBOperationLog: false
|
||||
|
||||
logger:
|
||||
path: "/app/resource/log/server"
|
||||
file: "{Y-m-d-H}.log"
|
||||
prefix: ""
|
||||
level: "info"
|
||||
timeFormat: "2006-01-02T15:04:05"
|
||||
ctxKeys: []
|
||||
header: true
|
||||
stdout: true
|
||||
rotateSize: 0
|
||||
rotateExpire: 0
|
||||
rotateBackupLimit: 0
|
||||
rotateBackupExpire: 0
|
||||
rotateBackupCompress: 0
|
||||
rotateCheckInterval: "1h"
|
||||
stdoutColorDisabled: false
|
||||
writerColorEnable: false
|
||||
|
||||
# ---------- JWT ----------
|
||||
# 必改:必须与 admin-svr、openapi 完全一致。
|
||||
jwt:
|
||||
signingKey: "${JWT_SIGNING_KEY}"
|
||||
expiresTime: "7d"
|
||||
bufferTime: "1d"
|
||||
issuer: "iotlcm"
|
||||
|
||||
captcha:
|
||||
keyLong: 6
|
||||
imgWidth: 240
|
||||
imgHeight: 80
|
||||
openCaptcha: 0
|
||||
openCaptchaTimeout: 3600
|
||||
|
||||
# ---------- 注册验证码:走短信服务 ----------
|
||||
register:
|
||||
sms:
|
||||
url: "http://iotlcm-sms:11190/api/v1/sms/send"
|
||||
method: "POST"
|
||||
headers: {}
|
||||
bodyTemplate: '{"config":{"scene":"{scene}"},"params":{"phoneNumber":"{contact}","msgContent":"{code}"}}'
|
||||
successStatus: 200
|
||||
|
||||
# ---------- 数据库 ----------
|
||||
database:
|
||||
# 旧平台库(历史数据对接)。不使用时空 link 即可。
|
||||
legacyCard:
|
||||
link: ""
|
||||
debug: false
|
||||
maxOpen: 5
|
||||
maxIdle: 2
|
||||
logger:
|
||||
path: "/app/resource/log/server/sql"
|
||||
level: "all"
|
||||
stdout: true
|
||||
default:
|
||||
# 必改:连接串
|
||||
link: "mysql:u_iotlcm:${MYSQL_APP_PASSWORD}@tcp(mysql:3306)/${MYSQL_DATABASE}?charset=utf8mb4&parseTime=True&loc=Asia%2FShanghai"
|
||||
debug: false
|
||||
charset: "utf8mb4"
|
||||
dryRun: false
|
||||
maxIdle: 30
|
||||
maxOpen: 100
|
||||
maxLifetime: 120
|
||||
memorydb:
|
||||
link: "sqlite::@file(:memory:)"
|
||||
debug: false
|
||||
maxIdle: 1
|
||||
maxOpen: 1
|
||||
maxLifetime: 30
|
||||
|
||||
cache:
|
||||
adapter: "redis"
|
||||
fileDir: "/app/resource/cache"
|
||||
|
||||
# ---------- Redis ----------
|
||||
redis:
|
||||
default:
|
||||
mode: "single"
|
||||
sentinelMasterName: ""
|
||||
address: "redis:6379"
|
||||
db: 0
|
||||
pass: "${REDIS_PASSWORD}"
|
||||
minIdle: 5
|
||||
maxIdle: 30
|
||||
maxActive: 5000
|
||||
idleTimeout: "60s"
|
||||
ClientName: "AppServerCache"
|
||||
|
||||
# ---------- RabbitMQ ----------
|
||||
rabbitmq:
|
||||
enabled: true
|
||||
dsn: "amqp://${RABBITMQ_USER}:${RABBITMQ_PASSWORD}@rabbitmq:5672/"
|
||||
|
||||
# ---------- 异步业务 ----------
|
||||
workerBatchAsync:
|
||||
enabled: true
|
||||
exchange: "iotlcm.batch"
|
||||
queueName: "iotlcm.batch.execute"
|
||||
failOnPublish: false
|
||||
|
||||
appBusinessAsync:
|
||||
enabled: true
|
||||
exchange: "iotlcm.app"
|
||||
queueName: "iotlcm.app.business"
|
||||
failOnPublish: false
|
||||
|
||||
# ---------- 支付(可选) ----------
|
||||
# 不使用支付功能时把 enabled 全部改 false。
|
||||
payment:
|
||||
balanceRecharge:
|
||||
enabled: false
|
||||
mock:
|
||||
enabled: false
|
||||
wechat:
|
||||
enabled: false
|
||||
envFile: ""
|
||||
apiBase: "https://api.mch.weixin.qq.com"
|
||||
mchId: ""
|
||||
mchSerialNo: ""
|
||||
apiV3Key: ""
|
||||
# 微信支付证书需单独放入 data/certs 目录,不随仓库分发
|
||||
privateKeyPath: "resource/certs/wechatpay_apiclient_key.pem"
|
||||
notifyUrl: "https://your-domain.example.com/app/api/v1/app/payment/wechat/notify"
|
||||
notifyBaseUrl: "https://your-domain.example.com/app"
|
||||
refundNotifyUrl: "https://your-domain.example.com/app/api/v1/app/payment/wechat/refund-notify"
|
||||
timeoutMinutes: 5
|
||||
platformPublicKeyId: ""
|
||||
platformPublicKeyPath: "resource/certs/wechatpay_platform_public_key.pem"
|
||||
h5:
|
||||
enabled: false
|
||||
appId: ""
|
||||
appName: ""
|
||||
appUrl: "https://your-domain.example.com/app"
|
||||
payerClientIp: ""
|
||||
mini:
|
||||
enabled: false
|
||||
appId: ""
|
||||
appSecret: ""
|
||||
|
||||
# ---------- 卡号识别(拍照查卡) ----------
|
||||
# 走 OpenAI 兼容接口的视觉模型。不需要该功能时 enabled 改 false。
|
||||
appCardRecognition:
|
||||
enabled: false
|
||||
provider: "openai-compatible"
|
||||
baseUrl: ""
|
||||
endpoint: ""
|
||||
model: ""
|
||||
apiKey: ""
|
||||
timeout: "25s"
|
||||
maxImageBytes: 8388608
|
||||
maxTokens: 256
|
||||
rateLimit:
|
||||
enabled: true
|
||||
count: 20
|
||||
period: "1m"
|
||||
|
||||
# 微信订阅消息模板
|
||||
appWarning:
|
||||
wechatSubscribeTemplateId: ""
|
||||
|
||||
# ---------- TDengine(流量历史) ----------
|
||||
tsdb:
|
||||
database: "TdEngine"
|
||||
tdengine:
|
||||
type: "taosWS"
|
||||
dsn: "${TDENGINE_USER}:${TDENGINE_PASSWORD}@ws(${TDENGINE_HOST}:${TDENGINE_PORT})/"
|
||||
dbName: "${TDENGINE_DAILY_DB}"
|
||||
dailyDbName: "${TDENGINE_DAILY_DB}"
|
||||
monthlyDbName: "${TDENGINE_MONTHLY_DB}"
|
||||
maxOpenConns: 100
|
||||
maxIdleConns: 10
|
||||
|
||||
# ---------- 免登录白名单 ----------
|
||||
router:
|
||||
exceptLogin:
|
||||
- /api/v1/auth/captcha
|
||||
- /api/v1/auth/side-captcha
|
||||
- /api/v1/auth/check-side-captcha
|
||||
- /api/v1/auth/sms
|
||||
- /api/v1/auth/register
|
||||
- /api/v1/auth/login
|
||||
- /api/v1/auth/wechat-login
|
||||
- /api/v1/auth/wechat-bind-phone
|
||||
- /api/v1/auth/forgot-password
|
||||
- /api/v1/card/public-query
|
||||
- /api/v1/card/recognize
|
||||
- /api/v1/card/public-package-detail
|
||||
- /api/v1/open/diagnosis/info
|
||||
- /api/v1/open/diagnosis/flow
|
||||
- /api/v1/payment/wechat/notify
|
||||
- /api/v1/payment/wechat/refund-notify
|
||||
- /api/v1/app/auth/captcha
|
||||
- /api/v1/app/auth/side-captcha
|
||||
- /api/v1/app/auth/check-side-captcha
|
||||
- /api/v1/app/auth/sms
|
||||
- /api/v1/app/auth/register
|
||||
- /api/v1/app/auth/login
|
||||
- /api/v1/app/auth/wechat-login
|
||||
- /api/v1/app/auth/wechat-bind-phone
|
||||
- /api/v1/app/auth/forgot-password
|
||||
- /api/v1/app/card/public-query
|
||||
- /api/v1/app/card/recognize
|
||||
- /api/v1/app/card/public-package-detail
|
||||
- /api/v1/app/open/diagnosis/info
|
||||
- /api/v1/app/open/diagnosis/flow
|
||||
- /api/v1/app/payment/wechat/notify
|
||||
- /api/v1/app/payment/wechat/refund-notify
|
||||
- /openapi/v3/query/token
|
||||
|
||||
# ---------- 上游服务地址 ----------
|
||||
upstream:
|
||||
# 控制台智能诊断内部凭据,须与 admin-svr 一致
|
||||
appDiagnosisToken: "${DIAGNOSIS_INTERNAL_TOKEN}"
|
||||
provider: "onelink_mock"
|
||||
default:
|
||||
clientName: "http://upstream-proxy:8510"
|
||||
timeout: "10s"
|
||||
gateway:
|
||||
clientName: "http://upstream-chan:8110"
|
||||
timeout: "10s"
|
||||
# 移动 OneLink 挡板(联调用)。对接真实运营商时 enabled 改 false。
|
||||
onelinkMock:
|
||||
enabled: false
|
||||
baseUrl: "http://onelink-mock:8080/v5"
|
||||
appid: ""
|
||||
password: ""
|
||||
timeout: "10s"
|
||||
tokenTTL: 3600
|
||||
accounts: []
|
||||
@@ -0,0 +1,26 @@
|
||||
# ============================================================
|
||||
# iotlcm-bot 配置示例
|
||||
#
|
||||
# cp config.example.yaml config.yaml
|
||||
#
|
||||
# 本服务把全量同步等运维事件推送到飞书群。
|
||||
# 不使用飞书通知时不要启动该容器(默认走 with-bot profile)。
|
||||
# ============================================================
|
||||
|
||||
environment: prod
|
||||
|
||||
# 全量同步归档目录与状态目录(容器内路径,compose 已挂载)
|
||||
archiveDir: /data/full-sync
|
||||
stateDir: /data/state
|
||||
|
||||
# 轮询间隔
|
||||
pollInterval: 10s
|
||||
|
||||
# ---------- 飞书 ----------
|
||||
# 在飞书开放平台创建自建应用后获取:
|
||||
# appId / appSecret:应用凭证
|
||||
# chatId:目标群会话 ID
|
||||
feishu:
|
||||
appId: "${FEISHU_APP_ID}"
|
||||
appSecret: "${FEISHU_APP_SECRET}"
|
||||
chatId: "${FEISHU_CHAT_ID}"
|
||||
@@ -0,0 +1,141 @@
|
||||
# ============================================================
|
||||
# IotLCM 对外入口 nginx 配置示例
|
||||
#
|
||||
# 作用:把多个服务按路径分流到统一域名下。
|
||||
# 若宿主机已有 nginx 或面板,可不启动本容器,
|
||||
# 把下面的 location 段落并入宿主机配置即可。
|
||||
#
|
||||
# 把 your-domain.example.com 替换为你的实际域名。
|
||||
# ============================================================
|
||||
|
||||
upstream iotlcm_admin_api {
|
||||
server admin-svr:8008;
|
||||
}
|
||||
|
||||
upstream iotlcm_admin_ui {
|
||||
server admin-ui:80;
|
||||
}
|
||||
|
||||
upstream iotlcm_openapi_api {
|
||||
server openapi:8000;
|
||||
}
|
||||
|
||||
upstream iotlcm_docs {
|
||||
server docs:80;
|
||||
}
|
||||
|
||||
upstream iotlcm_app_web {
|
||||
server app-web:80;
|
||||
}
|
||||
|
||||
upstream iotlcm_app_server {
|
||||
server app-server:8010;
|
||||
}
|
||||
|
||||
# ---------- OpenAPI 对外域名 ----------
|
||||
server {
|
||||
listen 80;
|
||||
server_name api.your-domain.example.com;
|
||||
|
||||
client_max_body_size 200m;
|
||||
|
||||
location ^~ /openapi/v3/ {
|
||||
proxy_pass http://iotlcm_openapi_api;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_read_timeout 120s;
|
||||
proxy_send_timeout 120s;
|
||||
}
|
||||
|
||||
# 运营商能力代理(白名单转发 / 共享 Token)
|
||||
location ^~ /route/open/ {
|
||||
proxy_pass http://iotlcm_openapi_api;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_read_timeout 120s;
|
||||
proxy_send_timeout 120s;
|
||||
}
|
||||
|
||||
location / {
|
||||
proxy_pass http://iotlcm_openapi_api;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
}
|
||||
}
|
||||
|
||||
# ---------- 管理端 ----------
|
||||
server {
|
||||
listen 80;
|
||||
server_name admin.your-domain.example.com;
|
||||
|
||||
client_max_body_size 200m;
|
||||
|
||||
location / {
|
||||
proxy_pass http://iotlcm_admin_ui;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
}
|
||||
|
||||
# 文档站(子路径 /docs/)
|
||||
location = /docs {
|
||||
return 301 /docs/;
|
||||
}
|
||||
|
||||
location /docs/ {
|
||||
proxy_pass http://iotlcm_docs;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
}
|
||||
}
|
||||
|
||||
# ---------- 小程序 / H5 ----------
|
||||
server {
|
||||
listen 80;
|
||||
server_name app.your-domain.example.com;
|
||||
|
||||
client_max_body_size 200m;
|
||||
|
||||
location ^~ /app/api/v1/ {
|
||||
proxy_pass http://iotlcm_app_server/api/v1/;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_read_timeout 120s;
|
||||
proxy_send_timeout 120s;
|
||||
}
|
||||
|
||||
location ^~ /app/ {
|
||||
proxy_pass http://iotlcm_app_web;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
}
|
||||
|
||||
location / {
|
||||
proxy_pass http://iotlcm_app_web;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,91 @@
|
||||
# ============================================================
|
||||
# iotlcm-openapi 配置示例
|
||||
#
|
||||
# cp config.example.yaml config.yaml
|
||||
# ============================================================
|
||||
|
||||
system:
|
||||
name: "IotLCM-OpenAPI"
|
||||
version: "1.0"
|
||||
description: "IotLCM OpenAPI Service"
|
||||
gfmode: "prod"
|
||||
|
||||
server:
|
||||
address: ":8000"
|
||||
openapiPath: "/api.json"
|
||||
swaggerPath: "/swagger"
|
||||
maxHeaderBytes: "20KB"
|
||||
clientMaxBodySize: "200MB"
|
||||
readTimeout: "20m"
|
||||
writeTimeout: "20m"
|
||||
|
||||
logger:
|
||||
path: "/app/logs"
|
||||
file: "{Y-m-d-H}.log"
|
||||
level: "info"
|
||||
timeFormat: "2006-01-02T15:04:05"
|
||||
stdout: true
|
||||
header: true
|
||||
|
||||
# ---------- JWT ----------
|
||||
# 必改:必须与 admin-svr、app-server 完全一致,
|
||||
# 否则 admin 签发的令牌在 openapi 侧校验不通过。
|
||||
jwt:
|
||||
signingKey: "${JWT_SIGNING_KEY}"
|
||||
expiresTime: "7d"
|
||||
bufferTime: "1d"
|
||||
issuer: "iotlcm"
|
||||
|
||||
# ---------- 数据库 ----------
|
||||
# 建议为 OpenAPI 单独建只读账号,与 admin 的账号隔离。
|
||||
database:
|
||||
logger:
|
||||
path: "/app/logs/sql"
|
||||
level: "all"
|
||||
stdout: true
|
||||
default:
|
||||
# 必改:连接串
|
||||
link: "mysql:u_iotlcm:${MYSQL_APP_PASSWORD}@tcp(mysql:3306)/${MYSQL_DATABASE}?charset=utf8mb4&parseTime=True&loc=Asia%2FShanghai"
|
||||
debug: false
|
||||
charset: "utf8mb4"
|
||||
dryRun: false
|
||||
maxIdle: 30
|
||||
maxOpen: 100
|
||||
maxLifetime: 120
|
||||
|
||||
cache:
|
||||
adapter: "redis"
|
||||
fileDir: "resource/cache"
|
||||
|
||||
# ---------- Redis ----------
|
||||
redis:
|
||||
default:
|
||||
mode: "single"
|
||||
sentinelMasterName: ""
|
||||
address: "redis:6379"
|
||||
db: 0
|
||||
pass: "${REDIS_PASSWORD}"
|
||||
minIdle: 5
|
||||
maxIdle: 30
|
||||
maxActive: 5000
|
||||
idleTimeout: "60s"
|
||||
ClientName: "OpenAPICache"
|
||||
|
||||
# ---------- RabbitMQ ----------
|
||||
rabbitmq:
|
||||
enabled: true
|
||||
dsn: "amqp://${RABBITMQ_USER}:${RABBITMQ_PASSWORD}@rabbitmq:5672/"
|
||||
|
||||
# ---------- 免登录白名单 ----------
|
||||
router:
|
||||
exceptLogin:
|
||||
- /openapi/v3/query/token
|
||||
|
||||
# ---------- 上游服务地址 ----------
|
||||
upstream:
|
||||
proxy:
|
||||
address: "upstream-proxy:8510"
|
||||
timeout: "10s"
|
||||
gateway:
|
||||
address: "upstream-chan:8110"
|
||||
timeout: "10s"
|
||||
@@ -0,0 +1,29 @@
|
||||
# ============================================================
|
||||
# iotlcm-sms 配置示例
|
||||
#
|
||||
# cp config.example.yaml config.yaml
|
||||
#
|
||||
# 短信服务商的全局凭证与签名由本服务持有,
|
||||
# 调用方(admin-svr / app-server)只传模板 ID 与短信内容。
|
||||
# ============================================================
|
||||
|
||||
# 服务商:1=阿里云,2=腾讯云
|
||||
serviceType: "1"
|
||||
|
||||
# ---------- 必改:服务商凭据 ----------
|
||||
regionId: cn-hangzhou
|
||||
accessKeyId: "${SMS_ACCESS_KEY_ID}"
|
||||
accessKeySecret: "${SMS_ACCESS_KEY_SECRET}"
|
||||
|
||||
# 短信签名,需已在服务商侧审核通过
|
||||
signName: "示例签名"
|
||||
|
||||
# 仅腾讯云需要:
|
||||
# sdkAppId: ""
|
||||
|
||||
# ---------- 场景模板库(可选) ----------
|
||||
# 配置后按 scene 从 t_sms_template_config 表读取模板与签名,
|
||||
# 改库即生效(短 TTL 缓存)。
|
||||
# 不配置则 scene 功能关闭,调用方必须自带 templateId。
|
||||
sceneDbDsn: "u_iotlcm:${MYSQL_APP_PASSWORD}@tcp(mysql:3306)/${MYSQL_DATABASE}?charset=utf8mb4&parseTime=true&loc=Local"
|
||||
sceneDbCacheTtl: 60s
|
||||
@@ -0,0 +1,108 @@
|
||||
# ============================================================
|
||||
# iotlcm-upstream-chan 配置示例
|
||||
#
|
||||
# cp config.example.yaml config.yaml
|
||||
#
|
||||
# 本服务负责具体运营商协议对接(移动 OneLink / 电信 CMP /
|
||||
# 联通 10646 / 各类三方渠道)。
|
||||
#
|
||||
# 注意:接入运营商需要在数据库中配置通道(t_sim_channels 等),
|
||||
# 本文件只配置服务自身参数。
|
||||
# ============================================================
|
||||
|
||||
system:
|
||||
name: "IotLCM-Upstream-Chan"
|
||||
version: "1.0"
|
||||
description: "IotLCM Upstream Channel Service"
|
||||
gfmode: "prod"
|
||||
upload:
|
||||
local:
|
||||
path: "/app/upload"
|
||||
|
||||
server:
|
||||
name: "iotlcmupstreamchan-http-svc"
|
||||
address: ":8110"
|
||||
openapiPath: "/api.json"
|
||||
swaggerPath: "/swagger"
|
||||
indexFiles: ["index.html", "index.htm"]
|
||||
indexFolder: false
|
||||
fileServerEnabled: true
|
||||
initLoadMemoryDB: false
|
||||
maxHeaderBytes: "20KB"
|
||||
clientMaxBodySize: "200MB"
|
||||
|
||||
# ---------- 服务注册 ----------
|
||||
registry:
|
||||
type: "consul"
|
||||
address: "consul:8500"
|
||||
|
||||
logger:
|
||||
path: "/app/logs"
|
||||
file: "{Y-m-d-H}.log"
|
||||
prefix: ""
|
||||
level: "info"
|
||||
timeFormat: "2006-01-02T15:04:05.000"
|
||||
ctxKeys: []
|
||||
header: true
|
||||
stdout: true
|
||||
rotateSize: 0
|
||||
rotateExpire: 0
|
||||
rotateBackupLimit: 0
|
||||
rotateBackupExpire: 0
|
||||
rotateBackupCompress: 0
|
||||
rotateCheckInterval: "1h"
|
||||
stdoutColorDisabled: false
|
||||
writerColorEnable: false
|
||||
|
||||
# ---------- 数据库 ----------
|
||||
database:
|
||||
logger:
|
||||
path: "/app/logs"
|
||||
level: "all"
|
||||
stdout: true
|
||||
default:
|
||||
# 必改:连接串
|
||||
link: "mysql:u_iotlcm:${MYSQL_APP_PASSWORD}@tcp(mysql:3306)/${MYSQL_DATABASE}?charset=utf8mb4&parseTime=True&loc=Asia%2FShanghai"
|
||||
debug: false
|
||||
charset: "utf8mb4"
|
||||
dryRun: false
|
||||
maxIdle: 30
|
||||
maxOpen: 100
|
||||
maxLifetime: 120
|
||||
memorydb:
|
||||
link: "sqlite::@file(:memory:)"
|
||||
debug: false
|
||||
maxIdle: 1
|
||||
maxOpen: 1
|
||||
maxLifetime: 30
|
||||
|
||||
cache:
|
||||
adapter: "redis"
|
||||
fileDir: "resource/cache"
|
||||
|
||||
# ---------- Redis ----------
|
||||
redis:
|
||||
default:
|
||||
mode: "single"
|
||||
sentinelMasterName: ""
|
||||
address: "redis:6379"
|
||||
db: 0
|
||||
pass: "${REDIS_PASSWORD}"
|
||||
minIdle: 5
|
||||
maxIdle: 30
|
||||
maxActive: 5000
|
||||
idleTimeout: "60s"
|
||||
ClientName: "SystemCache"
|
||||
|
||||
# ---------- 依赖行为 ----------
|
||||
dependencies:
|
||||
# 运营商 Token 刷新策略
|
||||
token_refresh:
|
||||
mode: "expired_only" # expired_only / always
|
||||
skew_seconds: 600 # 提前刷新的时间窗(秒)
|
||||
|
||||
# 移动 OneLink 挡板地址。
|
||||
# 启动了 onelink-mock(--profile with-mock)时保持此值;
|
||||
# 对接真实运营商时删掉本段或改为真实地址。
|
||||
sim_yd_mock_v5:
|
||||
url: "http://onelink-mock:8080/v5/"
|
||||
@@ -0,0 +1,110 @@
|
||||
# ============================================================
|
||||
# iotlcm-upstream-proxy 配置示例
|
||||
#
|
||||
# cp config.example.yaml config.yaml
|
||||
#
|
||||
# 本服务是通道侧的缓存与转发层,通常不需要改业务参数。
|
||||
# ============================================================
|
||||
|
||||
system:
|
||||
name: "IotLCM-Upstream-Proxy"
|
||||
version: "1.0"
|
||||
description: "IotLCM Upstream Proxy Service"
|
||||
gfmode: "prod"
|
||||
upload:
|
||||
local:
|
||||
path: "/app/upload"
|
||||
|
||||
# ---------- 智能诊断内部凭据 ----------
|
||||
# 控制台「智能诊断」调用本服务的内部凭据,
|
||||
# 必须与 admin-svr 的 upstream.appDiagnosisToken 一致。
|
||||
# 生成:openssl rand -hex 16
|
||||
appDiagnosis:
|
||||
internalToken: "${DIAGNOSIS_INTERNAL_TOKEN}"
|
||||
|
||||
server:
|
||||
name: "iotlcmupstreamproxy-grpc-svc"
|
||||
address: ":8510"
|
||||
openapiPath: "/api.json"
|
||||
swaggerPath: "/swagger"
|
||||
indexFiles: ["index.html", "index.htm"]
|
||||
indexFolder: false
|
||||
fileServerEnabled: true
|
||||
initLoadMemoryDB: false
|
||||
maxHeaderBytes: "20KB"
|
||||
clientMaxBodySize: "200MB"
|
||||
|
||||
# ---------- 服务注册 ----------
|
||||
registry:
|
||||
type: "consul"
|
||||
address: "consul:8500"
|
||||
|
||||
logger:
|
||||
path: "/app/logs"
|
||||
file: "{Y-m-d-H}.log"
|
||||
prefix: ""
|
||||
level: "info"
|
||||
timeFormat: "2006-01-02T15:04:05.000"
|
||||
ctxKeys: []
|
||||
header: true
|
||||
stdout: true
|
||||
rotateSize: 0
|
||||
rotateExpire: 0
|
||||
rotateBackupLimit: 0
|
||||
rotateBackupExpire: 0
|
||||
rotateBackupCompress: 0
|
||||
rotateCheckInterval: "1h"
|
||||
stdoutColorDisabled: false
|
||||
writerColorEnable: false
|
||||
|
||||
# ---------- 数据库 ----------
|
||||
database:
|
||||
logger:
|
||||
path: "/app/logs"
|
||||
level: "all"
|
||||
stdout: true
|
||||
default:
|
||||
# 必改:连接串
|
||||
link: "mysql:u_iotlcm:${MYSQL_APP_PASSWORD}@tcp(mysql:3306)/${MYSQL_DATABASE}?charset=utf8mb4&parseTime=True&loc=Asia%2FShanghai"
|
||||
debug: false
|
||||
charset: "utf8mb4"
|
||||
dryRun: false
|
||||
maxIdle: 30
|
||||
maxOpen: 100
|
||||
maxLifetime: 120
|
||||
memorydb:
|
||||
link: "sqlite::@file(:memory:)"
|
||||
debug: false
|
||||
maxIdle: 1
|
||||
maxOpen: 1
|
||||
maxLifetime: 30
|
||||
|
||||
cache:
|
||||
adapter: "redis"
|
||||
fileDir: "resource/cache"
|
||||
|
||||
# ---------- Redis ----------
|
||||
redis:
|
||||
default:
|
||||
mode: "single"
|
||||
sentinelMasterName: ""
|
||||
address: "redis:6379"
|
||||
db: 0
|
||||
pass: "${REDIS_PASSWORD}"
|
||||
minIdle: 5
|
||||
maxIdle: 30
|
||||
maxActive: 5000
|
||||
idleTimeout: "60s"
|
||||
ClientName: "SystemCache"
|
||||
|
||||
# ---------- 上游通道服务 ----------
|
||||
gateway:
|
||||
# 通道服务地址(同 compose 内服务名)
|
||||
address: "upstream-chan"
|
||||
timeout: 10s
|
||||
# 单次批量转发的总预算上限。
|
||||
# 非 APN 批量按「单卡超时 × 卡数」计算并以此封顶,
|
||||
# 避免通道逐卡串行办理时请求仍在执行就被判失败
|
||||
# (批量重启、停复机、批量查询)。
|
||||
# worker 侧的超时配置必须大于该值。
|
||||
batchTimeout: 20m
|
||||
@@ -0,0 +1,139 @@
|
||||
# ============================================================
|
||||
# iotlcm-worker-svr 配置示例
|
||||
#
|
||||
# cp config.example.yaml config.yaml
|
||||
#
|
||||
# 本服务是异步中枢:消费 RabbitMQ 队列,执行批次开停复机、
|
||||
# 全量同步、流量统计等后台任务。
|
||||
# ============================================================
|
||||
|
||||
system:
|
||||
name: "IotLCM"
|
||||
version: "1.0"
|
||||
description: "IotLCM Worker"
|
||||
gfmode: "prod"
|
||||
upload:
|
||||
local:
|
||||
path: "resource/upload"
|
||||
|
||||
logger:
|
||||
path: "/app/logs"
|
||||
file: "{Y-m-d-H}.log"
|
||||
prefix: ""
|
||||
level: "all"
|
||||
timeFormat: "2006-01-02T15:04:05"
|
||||
ctxKeys: []
|
||||
header: true
|
||||
stdout: true
|
||||
rotateSize: 0
|
||||
rotateExpire: 0
|
||||
rotateBackupLimit: 0
|
||||
rotateBackupExpire: 0
|
||||
rotateBackupCompress: 0
|
||||
rotateCheckInterval: "1h"
|
||||
stdoutColorDisabled: false
|
||||
writerColorEnable: false
|
||||
|
||||
# ---------- 数据库 ----------
|
||||
database:
|
||||
logger:
|
||||
path: "/app/logs/sql"
|
||||
level: "all"
|
||||
stdout: true
|
||||
default:
|
||||
# 必改:连接串
|
||||
link: "mysql:u_iotlcm:${MYSQL_APP_PASSWORD}@tcp(mysql:3306)/${MYSQL_DATABASE}?charset=utf8mb4&parseTime=True&loc=Asia%2FShanghai"
|
||||
debug: false
|
||||
charset: "utf8mb4"
|
||||
dryRun: false
|
||||
maxIdle: 30
|
||||
maxOpen: 100
|
||||
maxLifetime: 120
|
||||
memorydb:
|
||||
link: "sqlite::@file(:memory:)"
|
||||
debug: false
|
||||
maxIdle: 1
|
||||
maxOpen: 1
|
||||
maxLifetime: 30
|
||||
|
||||
cache:
|
||||
adapter: "redis"
|
||||
fileDir: "resource/cache"
|
||||
|
||||
# ---------- Redis ----------
|
||||
redis:
|
||||
default:
|
||||
mode: "single"
|
||||
sentinelMasterName: ""
|
||||
address: "redis:6379"
|
||||
db: 0
|
||||
pass: "${REDIS_PASSWORD}"
|
||||
minIdle: 5
|
||||
maxIdle: 30
|
||||
maxActive: 5000
|
||||
idleTimeout: "60s"
|
||||
ClientName: "WorkerCache"
|
||||
|
||||
# ---------- RabbitMQ ----------
|
||||
rabbitmq:
|
||||
enabled: true
|
||||
dsn: "amqp://${RABBITMQ_USER}:${RABBITMQ_PASSWORD}@rabbitmq:5672/"
|
||||
balanceRecharge:
|
||||
retryDelay: "1m"
|
||||
batchExecute:
|
||||
executionTimeout: "0s"
|
||||
finalizationTimeout: "60s"
|
||||
retryDelay: "30s"
|
||||
maxRetries: 3
|
||||
|
||||
# ---------- 批次执行 ----------
|
||||
batch:
|
||||
allocate:
|
||||
processingRetryAfter: "30m"
|
||||
|
||||
inbound:
|
||||
upstreamBatchSize: 1
|
||||
upstreamConcurrency: 300
|
||||
# 运营商接口限流。必须按上游实际配额设置,
|
||||
# 调太大会被运营商限流甚至封禁。
|
||||
upstreamRateLimit:
|
||||
enabled: true
|
||||
mode: "redis"
|
||||
redisGroup: "default"
|
||||
keyPrefix: "iotlcm:worker:inbound:upstream_basic_info"
|
||||
redisFailureFallback: "error"
|
||||
default:
|
||||
enabled: false
|
||||
carriers:
|
||||
mobile:
|
||||
enabled: false
|
||||
telecom:
|
||||
enabled: true
|
||||
qps: 20
|
||||
burst: 1
|
||||
requestCost: 1
|
||||
channels: {}
|
||||
stockQueryBatchSize: 1000
|
||||
writeBatchSize: 1000
|
||||
|
||||
# ---------- TDengine(流量历史) ----------
|
||||
# 不启用时序库时 dsn 留空,全量同步中的流量历史部分不可用。
|
||||
tsdb:
|
||||
database: "TdEngine"
|
||||
tdengine:
|
||||
type: "taosWS"
|
||||
dsn: "${TDENGINE_USER}:${TDENGINE_PASSWORD}@ws(${TDENGINE_HOST}:${TDENGINE_PORT})/"
|
||||
# dbName 只是连接池键名与兜底值,不决定实际访问哪个库
|
||||
dbName: "${TDENGINE_DAILY_DB}"
|
||||
dailyDbName: "${TDENGINE_DAILY_DB}"
|
||||
monthlyDbName: "${TDENGINE_MONTHLY_DB}"
|
||||
maxOpenConns: 100
|
||||
maxIdleConns: 10
|
||||
|
||||
# ---------- 上游服务地址 ----------
|
||||
upstream:
|
||||
proxy:
|
||||
address: "upstream-proxy:8510"
|
||||
# 异步提交协议版本,保持默认
|
||||
apnAsyncProtocolVersion: 1
|
||||
timeout: 10s
|
||||
@@ -0,0 +1,397 @@
|
||||
name: iotlcm
|
||||
|
||||
# ============================================================
|
||||
# IotLCM 单机部署编排
|
||||
#
|
||||
# 快速开始:
|
||||
# 1. cp .env.example .env # 填写镜像仓库与各项口令
|
||||
# 2. cp -r config.example config # 逐份填写配置(见各文件内注释)
|
||||
# 3. docker compose up -d
|
||||
#
|
||||
# 首次启动会自动建库并导入 schema(见 schema/README.md)。
|
||||
#
|
||||
# 可选服务(默认不启动):
|
||||
# docker compose --profile with-mock up -d # 运营商接口挡板
|
||||
# docker compose --profile with-nginx up -d # 自带反向代理
|
||||
# ============================================================
|
||||
|
||||
services:
|
||||
# ---------------- 基础组件 ----------------
|
||||
mysql:
|
||||
image: '${REGISTRY:-your-registry}/library/mysql:8.0'
|
||||
container_name: iotlcm-mysql
|
||||
restart: always
|
||||
ports:
|
||||
- "${MYSQL_PORT:-3306}:3306"
|
||||
environment:
|
||||
MYSQL_ROOT_PASSWORD: '${MYSQL_ROOT_PASSWORD:?必须在 .env 中设置}'
|
||||
MYSQL_DATABASE: '${MYSQL_DATABASE:-db_iotlcm}'
|
||||
MYSQL_APP_PASSWORD: '${MYSQL_APP_PASSWORD:?必须在 .env 中设置}'
|
||||
MYSQL_ADMIN_PASSWORD: '${MYSQL_ADMIN_PASSWORD:?必须在 .env 中设置}'
|
||||
TZ: '${TZ:-Asia/Shanghai}'
|
||||
volumes:
|
||||
- ./data/mysql:/var/lib/mysql
|
||||
# 仅在 data/mysql 为空(首次启动)时执行,按文件名顺序
|
||||
- ./schema:/docker-entrypoint-initdb.d:ro
|
||||
command:
|
||||
- --character-set-server=utf8mb4
|
||||
- --collation-server=utf8mb4_general_ci
|
||||
- --default-time-zone=+08:00
|
||||
networks:
|
||||
- iotlcm-network
|
||||
healthcheck:
|
||||
test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "-p${MYSQL_ROOT_PASSWORD}"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 10
|
||||
start_period: 40s
|
||||
|
||||
redis:
|
||||
image: '${REGISTRY:-your-registry}/library/redis:7.2'
|
||||
container_name: iotlcm-redis
|
||||
restart: always
|
||||
ports:
|
||||
- "${REDIS_PORT:-6379}:6379"
|
||||
environment:
|
||||
TZ: '${TZ:-Asia/Shanghai}'
|
||||
command:
|
||||
- redis-server
|
||||
- --requirepass
|
||||
- '${REDIS_PASSWORD:?必须在 .env 中设置}'
|
||||
- --appendonly
|
||||
- "yes"
|
||||
volumes:
|
||||
- ./data/redis:/data
|
||||
networks:
|
||||
- iotlcm-network
|
||||
healthcheck:
|
||||
test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD}", "ping"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
rabbitmq:
|
||||
image: '${REGISTRY:-your-registry}/library/rabbitmq:4.3.5-management'
|
||||
container_name: iotlcm-rabbitmq
|
||||
hostname: rabbitmq
|
||||
restart: always
|
||||
ports:
|
||||
- "${RABBITMQ_PORT:-5672}:5672"
|
||||
- "${RABBITMQ_MGMT_PORT:-15672}:15672"
|
||||
environment:
|
||||
RABBITMQ_DEFAULT_USER: '${RABBITMQ_USER:-iotlcm}'
|
||||
RABBITMQ_DEFAULT_PASS: '${RABBITMQ_PASSWORD:?必须在 .env 中设置}'
|
||||
TZ: '${TZ:-Asia/Shanghai}'
|
||||
volumes:
|
||||
- ./data/rabbitmq:/var/lib/rabbitmq
|
||||
networks:
|
||||
- iotlcm-network
|
||||
healthcheck:
|
||||
test: ["CMD", "rabbitmq-diagnostics", "-q", "ping"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 5
|
||||
start_period: 30s
|
||||
|
||||
consul:
|
||||
image: '${REGISTRY:-your-registry}/library/consul:1.22'
|
||||
container_name: iotlcm-consul
|
||||
restart: always
|
||||
ports:
|
||||
- "${CONSUL_PORT:-8500}:8500"
|
||||
environment:
|
||||
TZ: '${TZ:-Asia/Shanghai}'
|
||||
CONSUL_LOCAL_CONFIG: |
|
||||
{
|
||||
"node_name": "iotlcm-node",
|
||||
"bind_addr": "0.0.0.0",
|
||||
"client_addr": "0.0.0.0",
|
||||
"datacenter": "dc1",
|
||||
"data_dir": "/consul/data",
|
||||
"server": true,
|
||||
"bootstrap_expect": 1,
|
||||
"ui": true,
|
||||
"connect": { "enabled": true }
|
||||
}
|
||||
volumes:
|
||||
- ./data/consul:/consul/data
|
||||
networks:
|
||||
- iotlcm-network
|
||||
|
||||
# ---------------- 业务服务 ----------------
|
||||
admin-svr:
|
||||
image: '${REGISTRY:-your-registry}/iotlcm/iotlcm-admin-svr:${TAG:-latest}'
|
||||
container_name: iotlcm-admin-svr
|
||||
restart: always
|
||||
ports:
|
||||
- "127.0.0.1:${ADMIN_SVR_PORT:-8008}:8008"
|
||||
environment:
|
||||
TZ: '${TZ:-Asia/Shanghai}'
|
||||
volumes:
|
||||
- ./config/admin-svr:/app/config:ro
|
||||
- ./data/logs/admin-svr:/app/logs
|
||||
- ./data/upload:/app/upload
|
||||
- ./data/upload:/app/resource/upload
|
||||
networks:
|
||||
- iotlcm-network
|
||||
depends_on:
|
||||
mysql:
|
||||
condition: service_healthy
|
||||
redis:
|
||||
condition: service_healthy
|
||||
rabbitmq:
|
||||
condition: service_healthy
|
||||
|
||||
admin-ui:
|
||||
image: '${REGISTRY:-your-registry}/iotlcm/iotlcm-admin-ui:${TAG:-latest}'
|
||||
container_name: iotlcm-admin-ui
|
||||
restart: always
|
||||
ports:
|
||||
- "127.0.0.1:${ADMIN_UI_PORT:-8009}:80"
|
||||
environment:
|
||||
TZ: '${TZ:-Asia/Shanghai}'
|
||||
volumes:
|
||||
- ./config/admin-ui/default.conf:/etc/nginx/conf.d/default.conf:ro
|
||||
- ./data/logs/admin-ui:/var/log/nginx
|
||||
- ./data/upload:/app/upload
|
||||
networks:
|
||||
- iotlcm-network
|
||||
depends_on:
|
||||
- admin-svr
|
||||
|
||||
openapi:
|
||||
image: '${REGISTRY:-your-registry}/iotlcm/iotlcm-openapi:${TAG:-latest}'
|
||||
container_name: iotlcm-openapi
|
||||
restart: always
|
||||
ports:
|
||||
- "127.0.0.1:${OPENAPI_PORT:-8000}:8000"
|
||||
environment:
|
||||
TZ: '${TZ:-Asia/Shanghai}'
|
||||
volumes:
|
||||
- ./config/openapi:/app/config:ro
|
||||
- ./data/logs/openapi:/app/logs
|
||||
networks:
|
||||
- iotlcm-network
|
||||
depends_on:
|
||||
mysql:
|
||||
condition: service_healthy
|
||||
redis:
|
||||
condition: service_healthy
|
||||
rabbitmq:
|
||||
condition: service_healthy
|
||||
|
||||
upstream-chan:
|
||||
image: '${REGISTRY:-your-registry}/iotlcm/iotlcm-upstream-chan:${TAG:-latest}'
|
||||
container_name: iotlcm-upstream-chan
|
||||
restart: always
|
||||
ports:
|
||||
- "${CHAN_HTTP_PORT:-8110}:8110"
|
||||
- "${CHAN_GRPC_PORT:-8310}:8310"
|
||||
environment:
|
||||
TZ: '${TZ:-Asia/Shanghai}'
|
||||
volumes:
|
||||
- ./config/upstream-chan:/app/config:ro
|
||||
- ./data/logs/upstream-chan:/app/logs
|
||||
- ./data/upload:/app/upload
|
||||
- ./data/upload:/app/resource/upload
|
||||
networks:
|
||||
- iotlcm-network
|
||||
depends_on:
|
||||
mysql:
|
||||
condition: service_healthy
|
||||
redis:
|
||||
condition: service_healthy
|
||||
consul:
|
||||
condition: service_started
|
||||
|
||||
upstream-proxy:
|
||||
image: '${REGISTRY:-your-registry}/iotlcm/iotlcm-upstream-proxy:${TAG:-latest}'
|
||||
container_name: iotlcm-upstream-proxy
|
||||
restart: always
|
||||
ports:
|
||||
- "${PROXY_PORT:-8510}:8510"
|
||||
environment:
|
||||
TZ: '${TZ:-Asia/Shanghai}'
|
||||
volumes:
|
||||
- ./config/upstream-proxy:/app/config:ro
|
||||
- ./data/logs/upstream-proxy:/app/logs
|
||||
- ./data/upload:/app/upload
|
||||
- ./data/upload:/app/resource/upload
|
||||
- ./data/tmp:/app/tmp
|
||||
networks:
|
||||
- iotlcm-network
|
||||
depends_on:
|
||||
mysql:
|
||||
condition: service_healthy
|
||||
redis:
|
||||
condition: service_healthy
|
||||
consul:
|
||||
condition: service_started
|
||||
|
||||
worker-svr:
|
||||
image: '${REGISTRY:-your-registry}/iotlcm/iotlcm-worker-svr:${TAG:-latest}'
|
||||
container_name: iotlcm-worker-svr
|
||||
restart: always
|
||||
environment:
|
||||
TZ: '${TZ:-Asia/Shanghai}'
|
||||
volumes:
|
||||
- ./config/worker-svr:/app/config:ro
|
||||
- ./data/logs/worker-svr:/app/logs
|
||||
- ./data/logs/worker-svr/full-sync:/app/logs/full-sync
|
||||
- ./data/upload:/app/upload
|
||||
- ./data/upload:/app/resource/upload
|
||||
networks:
|
||||
- iotlcm-network
|
||||
depends_on:
|
||||
mysql:
|
||||
condition: service_healthy
|
||||
redis:
|
||||
condition: service_healthy
|
||||
rabbitmq:
|
||||
condition: service_healthy
|
||||
|
||||
app-server:
|
||||
image: '${REGISTRY:-your-registry}/iotlcm/iotlcm-app-server:${TAG:-latest}'
|
||||
container_name: iotlcm-app-server
|
||||
restart: always
|
||||
ports:
|
||||
- "127.0.0.1:${APP_SERVER_PORT:-8010}:8010"
|
||||
environment:
|
||||
TZ: '${TZ:-Asia/Shanghai}'
|
||||
APP_UPLOAD_DIR: /app/resource/upload
|
||||
volumes:
|
||||
- ./config/app-server:/app/config:ro
|
||||
- ./data/upload:/app/resource/upload
|
||||
- ./data/logs/app-server:/app/resource/log/server
|
||||
networks:
|
||||
- iotlcm-network
|
||||
depends_on:
|
||||
mysql:
|
||||
condition: service_healthy
|
||||
redis:
|
||||
condition: service_healthy
|
||||
|
||||
app-web:
|
||||
image: '${REGISTRY:-your-registry}/iotlcm/iotlcm-app-web:${TAG:-latest}'
|
||||
container_name: iotlcm-app-web
|
||||
restart: always
|
||||
ports:
|
||||
- "127.0.0.1:${APP_WEB_PORT:-8018}:80"
|
||||
environment:
|
||||
TZ: '${TZ:-Asia/Shanghai}'
|
||||
volumes:
|
||||
- ./data/logs/app-web:/var/log/nginx
|
||||
networks:
|
||||
- iotlcm-network
|
||||
|
||||
sms:
|
||||
image: '${REGISTRY:-your-registry}/iotlcm/iotlcm-sms:${TAG:-latest}'
|
||||
container_name: iotlcm-sms
|
||||
hostname: iotlcm-sms
|
||||
restart: always
|
||||
environment:
|
||||
TZ: '${TZ:-Asia/Shanghai}'
|
||||
HTTP_ADDR: ':11190'
|
||||
GRPC_ADDR: ':11200'
|
||||
ports:
|
||||
- "${SMS_HTTP_PORT:-11190}:11190"
|
||||
- "${SMS_GRPC_PORT:-11200}:11200"
|
||||
volumes:
|
||||
- ./config/sms:/app/config:ro
|
||||
- ./data/logs/sms:/app/logs
|
||||
tmpfs:
|
||||
- /tmp
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
healthcheck:
|
||||
test: ["CMD", "wget", "--quiet", "--output-document=/dev/null", "http://127.0.0.1:11190/healthz"]
|
||||
interval: 10s
|
||||
timeout: 3s
|
||||
retries: 3
|
||||
start_period: 5s
|
||||
networks:
|
||||
- iotlcm-network
|
||||
|
||||
bot:
|
||||
image: '${REGISTRY:-your-registry}/iotlcm/iotlcm-bot:${TAG:-latest}'
|
||||
container_name: iotlcm-bot
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
TZ: '${TZ:-Asia/Shanghai}'
|
||||
command: ["watch", "--config", "/app/config/config.yaml"]
|
||||
volumes:
|
||||
- ./config/bot/config.yaml:/app/config/config.yaml:ro
|
||||
- ./data/logs/worker-svr/full-sync:/data/full-sync:ro
|
||||
- ./data/bot-state:/data/state
|
||||
networks:
|
||||
- iotlcm-network
|
||||
profiles:
|
||||
- with-bot
|
||||
|
||||
docs:
|
||||
image: '${REGISTRY:-your-registry}/iotlcm/iotlcm-docs:${TAG:-latest}'
|
||||
container_name: iotlcm-docs
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "127.0.0.1:${DOCS_PORT:-8019}:80"
|
||||
networks:
|
||||
- iotlcm-network
|
||||
|
||||
# ---------------- 可选:运营商接口挡板 ----------------
|
||||
# 模拟中国移动 OneLink 接口,用于在没有真实运营商环境时联调整条链路:
|
||||
# admin-svr → worker-svr → upstream-chan → onelink-mock
|
||||
#
|
||||
# 启用:docker compose --profile with-mock up -d
|
||||
# 启用后 upstream-chan 的 sim_yd_mock_v5.url 指向 http://onelink-mock:8080/v5/
|
||||
# (config.example/upstream-chan 已预置该地址)
|
||||
onelink-mock:
|
||||
image: '${REGISTRY:-your-registry}/iotlcm/iotlcm-onelink-mock:${TAG:-latest}'
|
||||
container_name: iotlcm-onelink-mock
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "127.0.0.1:${MOCK_PORT:-8080}:8080"
|
||||
environment:
|
||||
TZ: '${TZ:-Asia/Shanghai}'
|
||||
BAFFLE_ADDR: ':8080'
|
||||
BAFFLE_SQLITE_PATH: /app/data/onelink_mock.db
|
||||
volumes:
|
||||
- ./data/mock:/app/data
|
||||
- ./data/logs/mock:/app/logs
|
||||
networks:
|
||||
- iotlcm-network
|
||||
healthcheck:
|
||||
test: ["CMD", "wget", "--quiet", "--output-document=/dev/null", "http://127.0.0.1:8080/api.json"]
|
||||
interval: 30s
|
||||
timeout: 5s
|
||||
retries: 3
|
||||
start_period: 10s
|
||||
profiles:
|
||||
- with-mock
|
||||
|
||||
# ---------------- 可选:反向代理 ----------------
|
||||
# 若宿主机已有 nginx / 面板,可不启动本容器,
|
||||
# 参考 config.example/nginx/iotlcm.conf 把 location 段落到宿主机配置。
|
||||
nginx:
|
||||
image: '${REGISTRY:-your-registry}/library/nginx:1.30'
|
||||
container_name: iotlcm-nginx
|
||||
restart: always
|
||||
ports:
|
||||
- "${NGINX_HTTP_PORT:-80}:80"
|
||||
volumes:
|
||||
- ./config/nginx:/etc/nginx/conf.d:ro
|
||||
- ./data/logs/nginx:/var/log/nginx
|
||||
- ./data/upload:/app/upload
|
||||
networks:
|
||||
- iotlcm-network
|
||||
depends_on:
|
||||
- admin-ui
|
||||
- openapi
|
||||
- app-web
|
||||
- docs
|
||||
profiles:
|
||||
- with-nginx
|
||||
|
||||
networks:
|
||||
iotlcm-network:
|
||||
driver: bridge
|
||||
name: iotlcm-network
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,116 @@
|
||||
-- ============================================
|
||||
-- 演示环境种子库结构补齐(2026-10-16)
|
||||
-- 背景:mysql-init/01-schema.sql 源自 db_iotlcm_init.sql(较旧),
|
||||
-- 与当前业务镜像期望的 schema 存在差异,导致 app-server 后台任务
|
||||
-- 报 `Unknown column 'source_channel'` 等错误。
|
||||
-- 依据:以预演1(内网环境)的 db_iotlcm 为基准逐列比对得出。
|
||||
-- 差异:缺 1 张表(card_channel_assoc)+ 27 列(分布 8 张表)。
|
||||
--
|
||||
-- ⚠️ MySQL 8.0 不支持 `ALTER TABLE ... ADD COLUMN IF NOT EXISTS`(MariaDB 语法),
|
||||
-- 因此用存储过程按 information_schema 判断后动态执行,保证幂等、可重复运行。
|
||||
--
|
||||
-- 执行顺序:01-schema.sql → 本文件(按文件名排序,02-)。
|
||||
-- ============================================
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
USE `db_iotlcm`;
|
||||
|
||||
-- ---------- 1. 缺失的表:card_channel_assoc(卡号段-通道关联)----------
|
||||
CREATE TABLE IF NOT EXISTS `card_channel_assoc` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT,
|
||||
`channel_id` int NOT NULL COMMENT '通道ID',
|
||||
`match_type` tinyint NOT NULL COMMENT '匹配类型',
|
||||
`iccid` varchar(32) DEFAULT NULL COMMENT '单卡ICCID',
|
||||
`iccid_start` varchar(32) DEFAULT NULL COMMENT '卡号段起始',
|
||||
`iccid_end` varchar(32) DEFAULT NULL COMMENT '卡号段结束',
|
||||
`status` tinyint NOT NULL DEFAULT 1 COMMENT '状态',
|
||||
`remark` varchar(255) DEFAULT NULL COMMENT '备注',
|
||||
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_channel_id` (`channel_id`),
|
||||
KEY `idx_iccid` (`iccid`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='卡号段与通道关联';
|
||||
|
||||
-- ---------- 2. 幂等补列辅助过程 ----------
|
||||
DROP PROCEDURE IF EXISTS `sp_add_column_if_missing`;
|
||||
DELIMITER $$
|
||||
CREATE PROCEDURE `sp_add_column_if_missing`(
|
||||
IN p_table VARCHAR(64),
|
||||
IN p_column VARCHAR(64),
|
||||
IN p_ddl TEXT
|
||||
)
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM information_schema.columns
|
||||
WHERE table_schema = DATABASE()
|
||||
AND table_name = p_table
|
||||
AND column_name = p_column
|
||||
) THEN
|
||||
SET @s = CONCAT('ALTER TABLE `', p_table, '` ADD COLUMN ', p_ddl);
|
||||
PREPARE stmt FROM @s; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
SELECT CONCAT('added ', p_table, '.', p_column) AS action;
|
||||
ELSE
|
||||
SELECT CONCAT('exists ', p_table, '.', p_column) AS action;
|
||||
END IF;
|
||||
END$$
|
||||
DELIMITER ;
|
||||
|
||||
-- ---------- 3. batch_main:补 2 列 ----------
|
||||
CALL sp_add_column_if_missing('batch_main', 'source_channel',
|
||||
"`source_channel` varchar(24) NOT NULL DEFAULT 'legacy' COMMENT '发起渠道:console/mini_program/api/system/legacy'");
|
||||
CALL sp_add_column_if_missing('batch_main', 'execution_mode',
|
||||
"`execution_mode` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '执行模式'");
|
||||
|
||||
-- ---------- 4. sys_user:补 1 列 ----------
|
||||
CALL sp_add_column_if_missing('sys_user', 'is_init_password',
|
||||
"`is_init_password` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否为初始密码'");
|
||||
|
||||
-- ---------- 5. t_sim_card_info:补 4 列 ----------
|
||||
CALL sp_add_column_if_missing('t_sim_card_info', 'imei_sync_time',
|
||||
"`imei_sync_time` datetime DEFAULT NULL COMMENT 'IMEI 同步时间'");
|
||||
CALL sp_add_column_if_missing('t_sim_card_info', 'imei_update_time',
|
||||
"`imei_update_time` datetime DEFAULT NULL COMMENT 'IMEI 更新时间'");
|
||||
CALL sp_add_column_if_missing('t_sim_card_info', 'traffic_cutoff_triggered_at',
|
||||
"`traffic_cutoff_triggered_at` datetime DEFAULT NULL COMMENT '流量停机触发时间'");
|
||||
CALL sp_add_column_if_missing('t_sim_card_info', 'traffic_cutoff_cross_month_hold',
|
||||
"`traffic_cutoff_cross_month_hold` tinyint(1) NOT NULL DEFAULT 0 COMMENT '流量停机跨月保持'");
|
||||
|
||||
-- ---------- 6. t_sim_channels:补 9 列 ----------
|
||||
CALL sp_add_column_if_missing('t_sim_channels', 'app_key',
|
||||
"`app_key` varchar(64) DEFAULT NULL COMMENT '运营商 app_key'");
|
||||
CALL sp_add_column_if_missing('t_sim_channels', 'app_secret',
|
||||
"`app_secret` varchar(64) DEFAULT NULL COMMENT '运营商 app_secret'");
|
||||
CALL sp_add_column_if_missing('t_sim_channels', 'operator',
|
||||
"`operator` tinyint unsigned DEFAULT NULL COMMENT '运营商'");
|
||||
CALL sp_add_column_if_missing('t_sim_channels', 'is_normal',
|
||||
"`is_normal` tinyint(1) DEFAULT NULL COMMENT '是否正常'");
|
||||
CALL sp_add_column_if_missing('t_sim_channels', 'docking_status',
|
||||
"`docking_status` tinyint(1) DEFAULT NULL COMMENT '对接状态'");
|
||||
CALL sp_add_column_if_missing('t_sim_channels', 'sync_enabled',
|
||||
"`sync_enabled` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否启用全量同步'");
|
||||
CALL sp_add_column_if_missing('t_sim_channels', 'card_info_count',
|
||||
"`card_info_count` bigint NOT NULL DEFAULT 0 COMMENT '卡信息数量'");
|
||||
CALL sp_add_column_if_missing('t_sim_channels', 'stock_card_count',
|
||||
"`stock_card_count` bigint NOT NULL DEFAULT 0 COMMENT '库存卡数量'");
|
||||
CALL sp_add_column_if_missing('t_sim_channels', 'cancellation_card_count',
|
||||
"`cancellation_card_count` bigint NOT NULL DEFAULT 0 COMMENT '销户卡数量'");
|
||||
|
||||
-- ---------- 7. 两张套餐绑定表:补 batch_no ----------
|
||||
CALL sp_add_column_if_missing('t_sim_pool_bind_package', 'batch_no',
|
||||
"`batch_no` varchar(64) NOT NULL DEFAULT '' COMMENT '批次号'");
|
||||
CALL sp_add_column_if_missing('t_sim_pool_bind_pkg_logs', 'batch_no',
|
||||
"`batch_no` varchar(64) NOT NULL DEFAULT '' COMMENT '批次号'");
|
||||
|
||||
-- ---------- 8. 清理辅助过程 ----------
|
||||
DROP PROCEDURE IF EXISTS `sp_add_column_if_missing`;
|
||||
|
||||
-- ---------- 9. 校验 ----------
|
||||
SELECT 'tables' AS check_item, COUNT(*) AS n FROM information_schema.tables
|
||||
WHERE table_schema='db_iotlcm'
|
||||
UNION ALL SELECT 'columns', COUNT(*) FROM information_schema.columns
|
||||
WHERE table_schema='db_iotlcm'
|
||||
UNION ALL SELECT 'has_source_channel', COUNT(*) FROM information_schema.columns
|
||||
WHERE table_schema='db_iotlcm' AND table_name='batch_main' AND column_name='source_channel'
|
||||
UNION ALL SELECT 'has_card_channel_assoc', COUNT(*) FROM information_schema.tables
|
||||
WHERE table_schema='db_iotlcm' AND table_name='card_channel_assoc';
|
||||
@@ -0,0 +1,42 @@
|
||||
-- ============================================
|
||||
-- 演示环境种子库 —— 按生产基准补齐(2026-10-27)
|
||||
-- 基准:生产 生产环境/db_iotlcm(89 表)
|
||||
-- 受检:演示 内网环境 演示库容器/db_iotlcm(88 表)
|
||||
--
|
||||
-- 经 DBX 直连生产 + 演示端逐列比对(列名/类型/可空/默认/extra),确认实际差异仅 2 处:
|
||||
-- 1. 缺表 t_sms_template_config(11 列,生产新增的短信场景模板配置)
|
||||
-- 2. 两处 batch_no 默认值:种子库 DEFAULT '',生产无默认值
|
||||
--
|
||||
-- 说明:此前误报的 batch_detail 缺 id 列 / t_sim_channels 两列可空性差异,
|
||||
-- 均为 shell 管道首行丢失 + MD5 签名受表级 collation 影响的假象,已排除。
|
||||
-- 88 张同名表中 86 张列定义与生产完全一致。
|
||||
--
|
||||
-- 幂等:可重复执行。
|
||||
-- 执行顺序:02-schema-fix-preview1.sql 之后(03-);可与 02 互换,两者互补不重叠。
|
||||
-- ============================================
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
USE `db_iotlcm`;
|
||||
|
||||
-- ---------- 1. 缺表:t_sms_template_config ----------
|
||||
CREATE TABLE IF NOT EXISTS `t_sms_template_config` (
|
||||
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
`scene` varchar(64) NOT NULL COMMENT '业务场景码,全局唯一,如 bind_phone',
|
||||
`scene_name` varchar(128) NOT NULL DEFAULT '' COMMENT '场景名称(可读)',
|
||||
`service_type` varchar(8) NOT NULL DEFAULT '' COMMENT '短信供应商:空=用服务默认,1=阿里云,2=腾讯云',
|
||||
`sign_name` varchar(64) NOT NULL DEFAULT '' COMMENT '短信签名:空=用服务默认',
|
||||
`template_id` varchar(64) NOT NULL COMMENT '短信模板ID',
|
||||
`msg_content_template` varchar(512) NOT NULL DEFAULT '' COMMENT '内容参数模板,支持 {content}/{contentJson} 占位;空=直接使用调用方 msgContent',
|
||||
`status` tinyint NOT NULL DEFAULT '1' COMMENT '状态:0停用,1启用',
|
||||
`remark` varchar(255) NOT NULL DEFAULT '' COMMENT '备注',
|
||||
`created_at` datetime DEFAULT NULL COMMENT '创建时间',
|
||||
`updated_at` datetime DEFAULT NULL COMMENT '更新时间',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_scene` (`scene`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='短信业务场景模板配置';
|
||||
|
||||
-- ---------- 2. batch_no 默认值对齐生产(去掉 '' 默认) ----------
|
||||
-- 生产:`batch_no` varchar(64) NOT NULL (无 DEFAULT)
|
||||
-- 种子:`batch_no` varchar(64) NOT NULL DEFAULT ''
|
||||
ALTER TABLE `t_sim_pool_bind_package` MODIFY COLUMN `batch_no` varchar(64) NOT NULL COMMENT '批次号';
|
||||
ALTER TABLE `t_sim_pool_bind_pkg_logs` MODIFY COLUMN `batch_no` varchar(64) NOT NULL COMMENT '批次号';
|
||||
Executable
+33
@@ -0,0 +1,33 @@
|
||||
#!/bin/bash
|
||||
# ============================================================
|
||||
# 业务数据库账号与附加库
|
||||
# 由 MySQL 容器 docker-entrypoint-initdb.d 在首次启动时执行。
|
||||
#
|
||||
# 为什么用 .sh 而不是 .sql:
|
||||
# MySQL 官方镜像的 initdb 脚本无法在 SQL 里读环境变量,
|
||||
# 而账号口令必须从 .env 注入,不能写死在仓库里。
|
||||
# ============================================================
|
||||
set -euo pipefail
|
||||
|
||||
if [ -z "${MYSQL_APP_PASSWORD:-}" ]; then
|
||||
echo "[initdb] 错误:未设置 MYSQL_APP_PASSWORD" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
mysql --protocol=socket -uroot -p"${MYSQL_ROOT_PASSWORD}" <<SQL
|
||||
SET NAMES utf8mb4;
|
||||
|
||||
-- 应用账号(对应各 config 文件里的数据库用户名 u_iotlcm)
|
||||
CREATE USER IF NOT EXISTS 'u_iotlcm'@'%'
|
||||
IDENTIFIED WITH mysql_native_password BY '${MYSQL_APP_PASSWORD}';
|
||||
GRANT ALL PRIVILEGES ON \`db_iotlcm\`.* TO 'u_iotlcm'@'%';
|
||||
|
||||
-- legacyCard 附加库(可选,不需要时删掉这三行)
|
||||
CREATE DATABASE IF NOT EXISTS \`iotdb\`
|
||||
DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
|
||||
GRANT ALL PRIVILEGES ON \`iotdb\`.* TO 'u_iotlcm'@'%';
|
||||
|
||||
FLUSH PRIVILEGES;
|
||||
SQL
|
||||
|
||||
echo "[initdb] 应用账号 u_iotlcm 已创建"
|
||||
Executable
+56
@@ -0,0 +1,56 @@
|
||||
#!/bin/bash
|
||||
# ============================================================
|
||||
# 重置种子账号口令(由 MySQL 容器 initdb 自动执行)
|
||||
#
|
||||
# 01-schema.sql 里的密码哈希源自旧库,不能用于开源分发。
|
||||
# 这里按 MYSQL_ADMIN_PASSWORD 统一重算,登录后请逐个修改。
|
||||
#
|
||||
# 哈希算法(见 iotlcm-admin-svr server/internal/library/utils/utils.go):
|
||||
# md5( hex(md5(明文)) + md5(salt) )
|
||||
# salt 取自每行 sys_user.salt 列。
|
||||
# ============================================================
|
||||
set -euo pipefail
|
||||
|
||||
if [ -z "${MYSQL_ADMIN_PASSWORD:-}" ]; then
|
||||
echo "[initdb] 错误:未设置 MYSQL_ADMIN_PASSWORD" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
PWD_MD5=$(printf '%s' "$MYSQL_ADMIN_PASSWORD" | md5sum | awk '{print $1}')
|
||||
|
||||
# 逐个账号按其自身 salt 计算哈希(salt 每行不同)
|
||||
mysql --protocol=socket -uroot -p"${MYSQL_ROOT_PASSWORD}" <<SQL
|
||||
SET NAMES utf8mb4;
|
||||
USE \`db_iotlcm\`;
|
||||
|
||||
DROP PROCEDURE IF EXISTS sp_reset_all_passwords;
|
||||
DELIMITER \$\$
|
||||
CREATE PROCEDURE sp_reset_all_passwords()
|
||||
BEGIN
|
||||
DECLARE done INT DEFAULT 0;
|
||||
DECLARE v_id BIGINT;
|
||||
DECLARE v_salt VARCHAR(64);
|
||||
DECLARE v_salt_md5 VARCHAR(64);
|
||||
DECLARE v_final VARCHAR(64);
|
||||
DECLARE cur CURSOR FOR SELECT user_id, salt FROM sys_user;
|
||||
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
|
||||
|
||||
OPEN cur;
|
||||
read_loop: LOOP
|
||||
FETCH cur INTO v_id, v_salt;
|
||||
IF done THEN
|
||||
LEAVE read_loop;
|
||||
END IF;
|
||||
SET v_salt_md5 = MD5(v_salt);
|
||||
SET v_final = MD5(CONCAT('${PWD_MD5}', v_salt_md5));
|
||||
UPDATE sys_user SET password = v_final WHERE user_id = v_id;
|
||||
END LOOP;
|
||||
CLOSE cur;
|
||||
END\$\$
|
||||
DELIMITER ;
|
||||
|
||||
CALL sp_reset_all_passwords();
|
||||
DROP PROCEDURE sp_reset_all_passwords;
|
||||
SQL
|
||||
|
||||
echo "[initdb] 种子账号口令已统一重置"
|
||||
@@ -0,0 +1,45 @@
|
||||
-- ============================================
|
||||
-- 演示环境种子数据:通道模板(2026-10-27)
|
||||
-- 来源:生产 db_iotlcm.t_sim_channel_template(DBX 直连导出 23 条)
|
||||
--
|
||||
-- **筛选口径(2026-10-27 裁定)**:演示环境只保留 3 条模板 ——
|
||||
-- 移动 `sim_yd_v5` 中国移动V5模板
|
||||
-- 电信 `sim_dx_v1` 电信BOSS卡API
|
||||
-- 移动Mock `sim_yd_mock_v5` 移动Mock(演示实际上游,Mock 通道引用它)
|
||||
-- 生产其余 20 条是三方共享 Token 渠道(腾宇/蓝尚/千寻/岱合/云达/铭谦/
|
||||
-- 河南信金/澜数/倍信/梦网/乐联等),演示环境不需要,全部剔除。
|
||||
-- 附带好处:原先需为 `sim_onelink_henan_xinjing_v1` 做真实密钥脱敏,
|
||||
-- 该条已不在保留范围内,脱敏问题随之消失。
|
||||
--
|
||||
-- 语义:把模板表重置为「恰好这 3 条」——`DELETE ... NOT IN` 保证幂等,
|
||||
-- 即使演示库被人手工加过三方模板,重跑本文件也会回到基线。
|
||||
--
|
||||
-- 幂等:可重复执行。
|
||||
-- 执行顺序:06(在 01-05 之后)
|
||||
-- ============================================
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
USE `db_iotlcm`;
|
||||
|
||||
-- 重置为基线:只保留 移动 / 电信 / 移动Mock
|
||||
DELETE FROM `t_sim_channel_template`
|
||||
WHERE `temp_key` NOT IN ('sim_dx_v1', 'sim_yd_v5', 'sim_yd_mock_v5');
|
||||
|
||||
INSERT INTO `t_sim_channel_template`
|
||||
(`id`,`temp_key`,`temp_name`,`temp_model`,`temp_config`,`temp_status`,`remark`,`tenant_id`,`created_dept`,`created_by`,`created_at`,`updated_by`,`updated_at`)
|
||||
VALUES
|
||||
(1,'sim_dx_v1','电信BOSS卡API','direct','{"api":{"baseUrl":"https://cmp-api.ctwing.cn:20164"}}',0,'','000000',103,1,'2026-06-12 10:16:22',NULL,'2026-09-08 20:31:54'),
|
||||
(2,'sim_yd_v5','中国移动V5模板','direct','{"api":{"baseUrl":"https://api.iot.10086.cn/v5/"},"token":{"path":"/ec/get/token"}}',0,NULL,'000000',103,1,'2026-06-12 10:17:03',NULL,'2026-09-08 20:31:54'),
|
||||
(4,'sim_yd_mock_v5','移动Mock','direct','{"api":{"baseUrl":"http://onelink-mock:8080/v5/"}}',0,NULL,'000000',103,1,'2026-08-14 11:00:53',NULL,'2026-09-08 20:31:54')
|
||||
ON DUPLICATE KEY UPDATE
|
||||
`temp_name` = VALUES(`temp_name`),
|
||||
`temp_model` = VALUES(`temp_model`),
|
||||
`temp_config` = VALUES(`temp_config`),
|
||||
`temp_status` = VALUES(`temp_status`),
|
||||
`remark` = VALUES(`remark`),
|
||||
`updated_at` = VALUES(`updated_at`);
|
||||
|
||||
-- 自检:应恰好 3 条
|
||||
SELECT COUNT(*) AS template_count,
|
||||
GROUP_CONCAT(`temp_key` ORDER BY `id`) AS temp_keys
|
||||
FROM `t_sim_channel_template`;
|
||||
@@ -0,0 +1,677 @@
|
||||
-- ============================================
|
||||
-- 演示环境种子数据:数据字典(2026-10-27)
|
||||
-- 来源:生产 db_iotlcm 的 sys_dict_type(86) + sys_dict_data(435),DBX 直连导出
|
||||
--
|
||||
-- 演示环境是给客户做演示的环境,字典必须与生产保持一致。
|
||||
-- 对齐前差异:缺 7 类共 21 条 + 5 类条数不一致(合计差 29 条)+ 类型表缺 6 条。
|
||||
--
|
||||
-- 策略:纯参照数据,整体替换(先清空再全量导入),保证与生产逐条一致。
|
||||
--
|
||||
-- 重要:下列两处极易出错,混用会导致数据看起来"一样"但校验和对不上:
|
||||
-- 1) NULL 与空字符串 '' 语义不同,必须严格按生产保留;
|
||||
-- 2) 部分 description/remark 含换行符(多行枚举),不能拍平成空格。
|
||||
-- 全量数据经 HEX + MD5 逐行比对确认与生产字节级一致。
|
||||
--
|
||||
-- 幂等:可重复执行。
|
||||
-- 执行顺序:07(在 01-06 之后)
|
||||
-- ============================================
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
USE `db_iotlcm`;
|
||||
|
||||
-- 清空后全量导入(字典为纯参照数据,无业务含义,可安全替换)
|
||||
DELETE FROM `sys_dict_data`;
|
||||
DELETE FROM `sys_dict_type`;
|
||||
|
||||
INSERT INTO `sys_dict_type` (`dict_name`,`dict_type`,`is_sys`,`tenant_id`,`created_dept`,`created_by`,`remark`) VALUES
|
||||
('提现账号类型','account_type',1,'000000',100,1,'1:银行卡
|
||||
2:支付宝
|
||||
3:微信'),
|
||||
('状态','apply_status',1,'000000',100,1,'0:待审核
|
||||
1:已通过
|
||||
2:已驳回
|
||||
3:已打款
|
||||
4:已取消'),
|
||||
('申请类型','apply_type',1,'000000',100,1,'1:提现申请
|
||||
2:余额转提现'),
|
||||
('审核结果','audit_result',1,'000000',100,1,'0:通过
|
||||
1:驳回'),
|
||||
('审核类型','audit_type',1,'000000',100,1,'1:初审
|
||||
2:复审'),
|
||||
('批次异步状态','batch_async_status',1,'000000',NULL,1,'批次异步状态:0-已创建 1-待处理 2-处理中 3-成功 4-失败'),
|
||||
('批次类型','batch_type',1,'000000',103,1,'批次类型:1-3通用批次,101+卡业务专属'),
|
||||
('卡状态','boss_card_status',0,'000000',103,1,'待激活:1
|
||||
已激活:2
|
||||
停机:4
|
||||
可测试:6
|
||||
库存:7
|
||||
预销户:8
|
||||
已销户:9
|
||||
未知:0'),
|
||||
('变动类型','change_type',1,'000000',100,1,'0:分润
|
||||
1:提现
|
||||
2:转出
|
||||
3:转入
|
||||
4:还款'),
|
||||
('创建人类型','creator_type',1,'000000',100,1,'1:终端用户
|
||||
2:代理商'),
|
||||
('当前处理状态','current_status',1,'000000',100,1,'1:已分派
|
||||
2:处理中
|
||||
3:已解决
|
||||
4:已完结_关单
|
||||
5:已取消'),
|
||||
('客户类型','customer_type',1,'000000',100,1,'1 渠道用户
|
||||
2 终端用户'),
|
||||
('批次明细状态','detail_status',0,'000000',NULL,1,'批次明细状态:0待处理 1处理中 2成功 3失败'),
|
||||
('分销分成状态','distribution_status',1,'000000',117,1,'0:未分成
|
||||
1:已分成'),
|
||||
('下载状态','download_status',1,'000000',103,1,'0:待生成 1:已生成 2:生成中 3:生成失败'),
|
||||
('生效状态','effective_status',1,'000000',100,1,'0:待生效
|
||||
1:生效中
|
||||
2:已过期
|
||||
3:已终止
|
||||
4:已作废'),
|
||||
('套餐启用状态','flow_package_enabled',0,'000000',100,1,'套餐管理-是否启用,与global_enable方向相反(0=停用 1=启用)'),
|
||||
('全局-是否启用','global_enable',0,'000000',103,1,'0:启用
|
||||
1:停用'),
|
||||
('全局-是否','global_yes_or_no',0,'000000',103,1,'0:是
|
||||
1:否'),
|
||||
('收支类型','income_expense_type',1,'000000',100,1,'0:收入
|
||||
1:支出'),
|
||||
('是否需要分佣','is_need_commission',1,'000000',117,1,'0:分佣
|
||||
1:不分佣 '),
|
||||
('是否撤回','is_recall',1,'000000',100,1,'0:未撤回
|
||||
1:已撤回'),
|
||||
('消息类型','message_type',1,'000000',100,1,'1:系统通知
|
||||
2:活动通知
|
||||
3:订单通知
|
||||
4:账户通知'),
|
||||
('请求方法','method',1,'000000',100,1,'1:POST
|
||||
2:PUT
|
||||
3:DELETE
|
||||
4:GET'),
|
||||
('操作类型','operation_type',1,'000000',100,1,'0:创建
|
||||
1:分派
|
||||
2:处理
|
||||
3:完成
|
||||
4:关单
|
||||
5:取消'),
|
||||
('订单状态','order_status',1,'000000',100,1,'0 待确定,待支付
|
||||
1 已确定,待发货
|
||||
2处理中,已发货
|
||||
3 已取消
|
||||
4 无效
|
||||
5 已完成'),
|
||||
('订单类型','order_type',1,'000000',100,1,'1:卡订购
|
||||
2: 卡续费
|
||||
3: 卡变更'),
|
||||
('oss权限桶类型','oss_access_policy',1,'000000',103,1,''),
|
||||
('支付状态','pay_status',1,'000000',100,1,'0 未支付
|
||||
1 支付中
|
||||
2 已支付
|
||||
3 退款中
|
||||
4 部分退款
|
||||
5 已退款'),
|
||||
('支付类型','pay_type',1,'000000',100,1,'1:在线支付
|
||||
2:货到付款
|
||||
3:线下支付'),
|
||||
('套餐名称','pool_package_code',1,'000000',100,1,'此处为流量池名称 每次新增流量池套餐需要进行配置'),
|
||||
('资源导出场景','resource_export_scene',1,'000000',103,1,'t_resource_batch_download.export_scene'),
|
||||
('资源类型','resource_type',1,'000000',103,1,'t_resource_batch_download.resource_type'),
|
||||
('退货状态','return_status',1,'000000',100,1,'0未退款
|
||||
1待审核
|
||||
2执行中
|
||||
3部分退货
|
||||
4退货成功'),
|
||||
('运行结果','run_result',0,'000000',NULL,1,'运行结果:0待运行 1运行中 2成功 3失败'),
|
||||
('发送用户类型','send_user_type',1,'000000',100,1,'1:代理商
|
||||
2:终端用户'),
|
||||
('共享token','share_enabled',1,'000000',100,1,'0:否
|
||||
1:是'),
|
||||
('发货方式','shipping_method',1,'000000',100,1,'1 物流
|
||||
2 商家自提
|
||||
3 无需配送'),
|
||||
('配送状态','shipping_status',1,'000000',117,1,'0:未发货
|
||||
1:已发货
|
||||
2:已收货
|
||||
4:退货'),
|
||||
('卡入库导入状态','sim_card_inbound_import_status',1,'000000',103,1,'TSimCardInboundExcelImportRes.importStatus'),
|
||||
('系统状态','sys_common_status',1,'000000',103,1,'登录状态列表'),
|
||||
('组织类型','sys_dept_type',0,'000000',103,1,'0:部门
|
||||
1:公司'),
|
||||
('设备类型','sys_device_type',1,'000000',103,1,'客户端设备类型'),
|
||||
('代码生成状态','sys_gen_status',1,'000000',103,1,''),
|
||||
('授权类型','sys_grant_type',1,'000000',103,1,'认证授权类型'),
|
||||
('任务是否并发执行','sys_job_concurrent',1,'000000',101,11,'是否并发执行(0允许 1禁止)'),
|
||||
('任务分组','sys_job_group',1,'000000',101,11,'任务分组(0 默认 1系统 2数据中心)'),
|
||||
('任务计划执行策略','sys_missfire_policy',1,'000000',101,11,'计划执行策略(1多次执行 2执行一次)'),
|
||||
('系统开关','sys_normal_disable',1,'000000',103,1,'系统开关列表'),
|
||||
('通知状态','sys_notice_status',1,'000000',103,1,'通知状态列表'),
|
||||
('通知类型','sys_notice_type',1,'000000',103,1,'通知类型列表'),
|
||||
('操作类型','sys_oper_type',1,'000000',103,1,'操作类型列表'),
|
||||
('菜单状态','sys_show_hide',0,'000000',103,1,'菜单状态列表'),
|
||||
('系统状态','sys_status',1,'000000',100,1,'0 正常
|
||||
1 停用'),
|
||||
('用户性别','sys_user_sex',0,'000000',103,1,'用户性别列表'),
|
||||
('系统是否','sys_yes_no',1,'000000',103,1,'系统是否列表'),
|
||||
('是否默认','sys_yes_no_num',1,'000000',103,1,'是否默认 0是 1否'),
|
||||
('交易渠道','transaction_channel',1,'000000',100,1,'1:支付宝
|
||||
2:微信
|
||||
3:可提现金额'),
|
||||
('交易状态','transaction_status',1,'000000',100,1,'0:待支付
|
||||
1:已支付
|
||||
2:已过期
|
||||
3:交易失败'),
|
||||
('交易类型','transaction_type',1,'000000',100,1,'0:充值
|
||||
1:消费
|
||||
2:转可提现
|
||||
3:可提现转入
|
||||
4:人工调整'),
|
||||
('渠道适用类型','t_agent_scope_type',0,'000000',103,1,'0:所有客户
|
||||
1:指定客户'),
|
||||
('批次操作规模','t_batch_execution_mode',1,'000000',100,1,'未知 0 单卡 1 批量 2'),
|
||||
('批次发起渠道','t_batch_source_channel',1,'000000',100,1,'批次创建入口:console 管理控制台,app 小程序,api API请求调用'),
|
||||
('批次来源方式','t_batch_source_type',0,'000000',100,1,'0:批次选择
|
||||
1:连号
|
||||
2:批量输入
|
||||
3:文件'),
|
||||
('计费方式','t_billing_method',0,'000000',103,1,'1:月
|
||||
2:年'),
|
||||
('卡信息_查询维度','t_cardInfo_dimension',1,'000000',103,1,'卡信息表'),
|
||||
('卡信息_维度状态','t_cardInfo_dimensionStatus',1,'000000',103,1,'卡信息表'),
|
||||
('卡信息_查询条件','t_cardInfo_selectCondition',1,'000000',103,1,'卡信息表'),
|
||||
('卡信息_排序类型','t_cardInfo_sortType',1,'000000',103,1,'卡信息表'),
|
||||
('卡信息_排序值','t_cardInfo_sortValue',1,'000000',103,1,'卡信息表'),
|
||||
('卡信息_时间类型','t_cardInfo_timeType',1,'000000',103,1,'卡信息表'),
|
||||
('卡类型','t_card_type',0,'000000',103,1,'1:通用插拔 SIM 卡
|
||||
2:贴片 M2M 卡 5×6mm
|
||||
3:贴片 M2M 卡 2×2mm
|
||||
4:MP1-消费级插拔物联卡
|
||||
5:MP2-工业级插拔物联卡
|
||||
6:MS0-消费级贴片物联卡
|
||||
7:MS1-工业级贴片物联卡'),
|
||||
('通道状态','t_channels_status',1,'000000',100,1,'0:启用
|
||||
1:停用
|
||||
2:未申请
|
||||
3:申请中
|
||||
4:接口信息不全'),
|
||||
('通道对接信息','t_channel_docking_status',1,'000000',NULL,NULL,'通道对接信息状态'),
|
||||
('通道是否轮询','t_channel_sync_enabled',1,'000000',NULL,1,NULL),
|
||||
('网络类型','t_net_model',1,'000000',103,1,'1 3G
|
||||
2 2G
|
||||
3 4G
|
||||
4 5G
|
||||
5 NB-IOT
|
||||
6 5G-SA
|
||||
7 5G-NSA
|
||||
8 2G/3G
|
||||
9 电信NB
|
||||
10 移动4G
|
||||
11 联通NB
|
||||
12 联通4G
|
||||
13 电信4G
|
||||
14 RedCap'),
|
||||
('运营商','t_operators',0,'000000',103,1,'1:移动
|
||||
2:联通
|
||||
3:电信'),
|
||||
('套餐定价-价格来源','t_package_price_source',1,'000000',100,26,'system — 系统级
|
||||
agentDefault — 本级默认
|
||||
target — 下级专属'),
|
||||
('套餐状态','t_package_status',0,'000000',103,1,'0:无套餐
|
||||
1:待生效
|
||||
2:生效中
|
||||
3:已过期'),
|
||||
('套餐类型','t_package_type',0,'000000',103,1,'101:卡套餐
|
||||
102:池套餐
|
||||
103:单卡加油包
|
||||
104:池卡加油包'),
|
||||
('流量池状态','t_pool_status',1,'000000',103,1,'0:正常
|
||||
1:停用
|
||||
2:锁定'),
|
||||
('预警-第三次是否停机','t_warn_auto_action',1,'000000',100,1,'0:否,3:是'),
|
||||
('预警启停状态','t_warn_enabled',1,'000000',100,1,'1:启用,0:停用'),
|
||||
('预警-提醒方式','t_warn_method',1,'000000',100,1,'3:站内提醒,1:邮箱,0:短信'),
|
||||
('预警-预警单位','t_warn_unit',1,'000000',100,1,'1:流量阈值(MB),2:流量池百分比'),
|
||||
('工单类型','wo_type',1,'000000',100,1,'0:卡
|
||||
1:模组
|
||||
2:设备
|
||||
3:订单
|
||||
4:余额
|
||||
5:提现');
|
||||
|
||||
INSERT INTO `sys_dict_data` (`dict_type`,`dict_value`,`dict_label`,`dict_sort`,`list_class`,`css_class`,`is_default`,`tenant_id`,`created_dept`,`created_by`,`remark`) VALUES
|
||||
('account_type','1','银行卡',0,'primary','','','000000',103,1,''),
|
||||
('account_type','2','支付宝',1,'primary','','','000000',103,1,''),
|
||||
('account_type','3','微信',2,'primary','','','000000',103,1,''),
|
||||
('addd','33','22',55,'22','44','','000000',103,1,'44'),
|
||||
('agent_scope_type','0','所有客户',1,'','','','000000',103,1,''),
|
||||
('agent_scope_type','1','指定客户',2,'','','','000000',103,1,''),
|
||||
('apply_status','0','待审核',0,'primary','','','000000',103,1,''),
|
||||
('apply_status','1','已通过',1,'success','','','000000',103,1,''),
|
||||
('apply_status','2','已驳回',2,'danger','','','000000',103,1,''),
|
||||
('apply_status','3','已打款',3,'primary','','','000000',103,1,''),
|
||||
('apply_status','4','已取消',4,'default','','','000000',103,1,''),
|
||||
('apply_type','1','提现申请',0,'default','','','000000',103,1,''),
|
||||
('apply_type','2','余额转提现',1,'default','','','000000',103,1,''),
|
||||
('audit_result','0','通过',0,'primary','','','000000',103,1,''),
|
||||
('audit_result','1','驳回',1,'danger','','','000000',103,1,''),
|
||||
('audit_type','1','初审',0,'primary','','','000000',103,1,''),
|
||||
('audit_type','2','复审',1,'warning','','','000000',103,1,''),
|
||||
('batch_async_status','0','已创建',0,'primary',NULL,'N','000000',103,1,''),
|
||||
('batch_async_status','1','待处理',1,'primary',NULL,'N','000000',103,1,''),
|
||||
('batch_async_status','2','处理中',2,'primary',NULL,'N','000000',103,1,''),
|
||||
('batch_async_status','3','成功',3,'primary',NULL,'N','000000',103,1,''),
|
||||
('batch_async_status','4','失败',4,'primary',NULL,'N','000000',103,1,''),
|
||||
('batch_async_status','5','部分成功',5,'warning',NULL,'N','000000',103,1,''),
|
||||
('batch_operation_source','console','管理控制台',1,'primary','','','000000',103,1,'未标记来源的历史批次默认归为管理控制台'),
|
||||
('batch_status','0','正常',0,NULL,NULL,'Y','000000',103,1,NULL),
|
||||
('batch_status','1','废弃',1,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('batch_type','1','入库',1,'primary',NULL,'N','000000',103,1,''),
|
||||
('batch_type','2','出库',2,'primary',NULL,'N','000000',103,1,''),
|
||||
('batch_type','3','划拨',3,'primary',NULL,'N','000000',103,1,''),
|
||||
('batch_type','4','预处理',4,'warning','','','000000',103,1,''),
|
||||
('batch_type','11','卡订购加油包',11,'primary','','N','000000',103,1,'批次类型:单卡加油包订购'),
|
||||
('batch_type','12','流量池订购加油包',12,'primary','','N','000000',103,1,'批次类型:流量池加油包订购'),
|
||||
('batch_type','40','预警配置',40,'primary','','N','000000',103,1,'预警配置批次类型'),
|
||||
('batch_type','41','达量断网配置',41,'primary','','','000000',103,1,'达量断网配置'),
|
||||
('batch_type','101','卡续费',101,'primary',NULL,'N','000000',103,1,'卡业务专属'),
|
||||
('batch_type','102','卡变更',102,'primary',NULL,'N','000000',103,1,'卡业务专属'),
|
||||
('batch_type','103','卡开机',103,'primary',NULL,'N','000000',103,1,'卡业务专属'),
|
||||
('batch_type','104','卡停机',104,'primary',NULL,'N','000000',103,1,'卡业务专属'),
|
||||
('batch_type','105','卡停复机',105,'primary',NULL,'N','000000',103,1,'卡业务专属'),
|
||||
('batch_type','106','卡销户',106,'primary',NULL,'N','000000',103,1,'卡业务专属'),
|
||||
('batch_type','107','卡达量断网执行',107,'primary','','','000000',103,1,'卡业务专属'),
|
||||
('batch_type','108','卡退订',108,'primary',NULL,'N','000000',103,1,'卡业务专属'),
|
||||
('batch_type','109','卡APN开启',109,'primary','','','000000',103,1,'卡业务专属'),
|
||||
('batch_type','110','卡APN关停',110,'primary','','','000000',103,1,'卡业务专属'),
|
||||
('billing_method','1','月',1,'','','','000000',103,1,''),
|
||||
('billing_method','2','年',2,'','','','000000',103,1,''),
|
||||
('boss_card_status','0','未知 ',1,'','','','000000',103,1,''),
|
||||
('boss_card_status','1','待激活 ',1,'primary','','','000000',103,1,''),
|
||||
('boss_card_status','2','已激活 ',1,'','','','000000',103,1,''),
|
||||
('boss_card_status','4','停机 ',1,'danger','','','000000',103,1,''),
|
||||
('boss_card_status','6','可测试',1,'','','','000000',103,1,''),
|
||||
('boss_card_status','7','库存 ',1,'','','','000000',103,1,''),
|
||||
('boss_card_status','8','预销户 ',1,'','','','000000',103,1,''),
|
||||
('boss_card_status','9','已销户 ',1,'','','','000000',103,1,''),
|
||||
('business_type','0','订购',0,NULL,NULL,'Y','000000',103,1,NULL),
|
||||
('business_type','1','变更',1,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('business_type','2','续费',2,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('cardInfo_dimension','1','使用流量',1,'','','','000000',103,1,''),
|
||||
('cardInfo_dimension','2','剩余流量',1,'','','','000000',103,1,''),
|
||||
('cardInfo_dimensionStatus','!=','!=',1,'','','','000000',103,1,''),
|
||||
('cardInfo_dimensionStatus','<','<',1,'','','','000000',103,1,''),
|
||||
('cardInfo_dimensionStatus','<=','<=',1,'','','','000000',103,1,''),
|
||||
('cardInfo_dimensionStatus','=','=',1,'','','','000000',103,1,''),
|
||||
('cardInfo_dimensionStatus','>','>',1,'','','','000000',103,1,''),
|
||||
('cardInfo_dimensionStatus','>=','>=',1,'','','','000000',103,1,''),
|
||||
('cardInfo_selectCondition','iccid','ICCID',1,'','','','000000',103,1,''),
|
||||
('cardInfo_selectCondition','imei','IMEI',1,'','','','000000',103,1,''),
|
||||
('cardInfo_selectCondition','imis','IMSI',1,'','','','000000',103,1,''),
|
||||
('cardInfo_selectCondition','msisdn','MSISDN',1,'','','','000000',103,1,''),
|
||||
('cardInfo_timeType','0','开卡时间',1,'','','','000000',103,1,''),
|
||||
('cardInfo_timeType','1','激活时间',1,'','','','000000',103,1,''),
|
||||
('cardInfo_timeType','2','入库时间',1,'','','','000000',103,1,''),
|
||||
('cardInfo_timeType','3','出库时间',1,'','','','000000',103,1,''),
|
||||
('cardInfo_timeType','4','到期时间',1,'','','','000000',103,1,''),
|
||||
('cardInfo_timeType','5','创建时间',1,'','','','000000',103,1,''),
|
||||
('cardInfo_timeType','6','流量同步时间',1,'','','','000000',103,1,''),
|
||||
('cardInfo_timeType','7','状态同步时间',1,'','','','000000',103,1,''),
|
||||
('change_type','0','分润',0,'primary','','','000000',103,1,''),
|
||||
('change_type','1','提现',1,'primary','','','000000',103,1,''),
|
||||
('change_type','2','转出',2,'primary','','','000000',103,1,''),
|
||||
('change_type','3','转入',3,'primary','','','000000',103,1,''),
|
||||
('change_type','4','还款',4,'primary','','','000000',103,1,''),
|
||||
('check_status','0','待审核',0,NULL,NULL,'Y','000000',103,1,NULL),
|
||||
('check_status','1','审核通过',1,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('check_status','2','审核未通过',2,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('creator_type','1','终端用户',0,'primary','','','000000',103,1,''),
|
||||
('creator_type','2','代理商',1,'primary','','','000000',103,1,''),
|
||||
('current_status','1','已分派',0,'primary','','','000000',103,1,''),
|
||||
('current_status','2','处理中',1,'success','','','000000',103,1,''),
|
||||
('current_status','3','已解决',2,'warning','','','000000',103,1,''),
|
||||
('current_status','4','已完结',3,'success','','','000000',103,1,''),
|
||||
('current_status','5','已取消',4,'primary','','','000000',103,1,''),
|
||||
('customer_type','1','渠道用户',1,NULL,NULL,'Y','000000',103,1,NULL),
|
||||
('customer_type','2','终端用户',2,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('detail_status','0','待处理',0,'info','','N','000000',103,1,NULL),
|
||||
('detail_status','1','处理中',1,'primary','','N','000000',103,1,NULL),
|
||||
('detail_status','2','成功',2,'success','','N','000000',103,1,NULL),
|
||||
('detail_status','3','失败',3,'danger','','N','000000',103,1,NULL),
|
||||
('distribution_status','0','未分成',0,NULL,NULL,'Y','000000',103,1,NULL),
|
||||
('distribution_status','1','已分成',1,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('download_status','2','生成中',0,'primary','','N','000000',103,1,'结果文件生成中'),
|
||||
('download_status','0','待生成',1,'default','','','000000',103,1,''),
|
||||
('download_status','1','已生成',2,'default','','','000000',103,1,''),
|
||||
('download_status','3','生成失败',3,'default','','','000000',103,1,''),
|
||||
('effective_status','0','待生效',0,'default','','','000000',103,1,''),
|
||||
('effective_status','1','生效中',1,'primary','','','000000',103,1,''),
|
||||
('effective_status','2','已过期',2,'danger','','','000000',103,1,''),
|
||||
('effective_status','3','已终止',3,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('effective_status','4','已作废',4,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('enabled','0','启用',0,NULL,NULL,'Y','000000',103,1,NULL),
|
||||
('enabled','1','停用',1,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('export_scene','1','list_export',1,NULL,NULL,'Y','000000',103,1,NULL),
|
||||
('export_scene','2','report_export',2,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('export_scene','3','settlement_export',3,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('fixed_shipping_type','1','固定运费',1,NULL,NULL,'Y','000000',103,1,NULL),
|
||||
('fixed_shipping_type','2','手动填写运费',2,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('flow_package_enabled','1','启用',0,'success','','N','000000',103,1,''),
|
||||
('flow_package_enabled','0','停用',1,'danger','','N','000000',103,1,''),
|
||||
('global_enable','0','启用',0,'success','','','000000',103,1,''),
|
||||
('global_enable','1','停用',1,'danger','','','000000',103,1,''),
|
||||
('global_yes_or_no','0','是',0,'success','','','000000',103,1,''),
|
||||
('global_yes_or_no','1','否',1,'danger','','','000000',103,1,''),
|
||||
('income_expense_type','0','收入',0,'warning','','','000000',103,1,''),
|
||||
('income_expense_type','1','支出',1,'primary','','','000000',103,1,''),
|
||||
('is_need_commission','0','分佣',0,'primary','','','000000',103,1,''),
|
||||
('is_need_commission','1','不分佣',1,'primary','','','000000',103,1,''),
|
||||
('is_recall','0','未撤回',0,'primary','','','000000',103,1,''),
|
||||
('is_recall','1','已撤回',1,'danger','','','000000',103,1,''),
|
||||
('is_show','1','显示',0,NULL,NULL,'Y','000000',103,1,NULL),
|
||||
('is_show','0','不显示',1,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('message_type','1','系统通知',0,'primary','','','000000',103,1,''),
|
||||
('message_type','2','活动通知',1,'primary','','','000000',103,1,''),
|
||||
('message_type','3','订单通知',2,'primary','','','000000',103,1,''),
|
||||
('message_type','4','账户通知',3,'primary','','','000000',103,1,''),
|
||||
('method','1','POST',0,'primary','','','000000',103,1,''),
|
||||
('method','2','PUT',1,'primary','','','000000',103,1,''),
|
||||
('method','3','DELETE',2,'primary','','','000000',103,1,''),
|
||||
('method','4','GET',3,'primary','','','000000',103,1,''),
|
||||
('operation_type','0','创建',0,'primary','','','000000',103,1,''),
|
||||
('operation_type','1','分派',1,'primary','','','000000',103,1,''),
|
||||
('operation_type','2','处理',2,'primary','','','000000',103,1,''),
|
||||
('operation_type','3','完成',3,'primary','','','000000',103,1,''),
|
||||
('operation_type','4','关单',4,'primary','','','000000',103,1,''),
|
||||
('operation_type','5','取消',5,'primary','','','000000',103,1,''),
|
||||
('operators','1','移动',1,'','','','000000',103,1,''),
|
||||
('operators','2','联通',2,'','','','000000',103,1,''),
|
||||
('operators','3','电信',3,'','','','000000',103,1,''),
|
||||
('order_status','0','待确定,待支付',0,NULL,NULL,'Y','000000',103,1,NULL),
|
||||
('order_status','1','已确定,待发货',1,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('order_status','2','处理中,已发货',2,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('order_status','3','已取消',3,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('order_status','4','无效',4,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('order_status','5','已完成',5,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('order_type','1','卡订购',1,'primary','','','000000',103,1,''),
|
||||
('order_type','2','卡续费',2,'primary','','','000000',103,1,''),
|
||||
('order_type','3','卡变更',3,'primary','','','000000',103,1,''),
|
||||
('oss_access_policy','0','私有',1,'orange','','','000000',103,1,''),
|
||||
('oss_access_policy','1','公开',2,'primary','','','000000',103,1,''),
|
||||
('oss_access_policy','2','自定义',3,'','','','000000',103,1,''),
|
||||
('package_codes','400','池套餐001',1,'default','','','000000',103,1,''),
|
||||
('package_codes','["dx-300m-3y"]','池套餐002',2,'default','','','000000',103,1,''),
|
||||
('package_type','101','单卡流量套餐',1,'','','','000000',103,1,''),
|
||||
('package_type','102','池卡流量套餐',2,'','','','000000',103,1,''),
|
||||
('package_type','103','单卡流量加油包',3,'','','','000000',103,1,''),
|
||||
('package_type','104','池卡流量加油包',4,'','','','000000',103,1,''),
|
||||
('package_type','201','单卡短信套餐',5,'','','','000000',103,1,''),
|
||||
('package_type','203','单卡短信加油包',6,'','','','000000',103,1,''),
|
||||
('package_type','301','单卡语音套餐',7,'','','','000000',103,1,''),
|
||||
('package_type','303','单卡语音加油包',8,'','','','000000',103,1,''),
|
||||
('package_type','401','单卡国漫套餐',8,'','','','000000',103,1,''),
|
||||
('package_type','403','单卡国漫加油包',9,'','','','000000',103,1,''),
|
||||
('pay_mode','0','一次性购买',0,NULL,NULL,'Y','000000',103,1,NULL),
|
||||
('pay_mode','1','包年包月',1,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('pay_mode','2','按量付费',2,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('pay_status','0','未支付',0,NULL,NULL,'Y','000000',103,1,NULL),
|
||||
('pay_status','1','支付中',1,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('pay_status','2','已支付',2,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('pay_status','3','退款中',3,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('pay_status','4','部分退款',4,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('pay_status','5','已退款',5,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('pay_type','1','在线支付',1,'primary','','','000000',103,1,''),
|
||||
('pay_type','2','货到付款',2,'primary','','','000000',103,1,''),
|
||||
('pay_type','3','线下支付',3,'primary','','','000000',103,1,''),
|
||||
('pool_package_code','100','套餐100',1,'default','','','000000',103,1,''),
|
||||
('pool_package_code','400','套餐400',1,'default','','','000000',103,1,''),
|
||||
('process_status','0','待处理',0,NULL,NULL,'Y','000000',103,1,NULL),
|
||||
('process_status','1','处理汇总',1,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('process_status','2','成功',2,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('process_status','3','失败',3,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('product_status','0','下架',0,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('product_status','1','上架',1,NULL,NULL,'Y','000000',103,1,NULL),
|
||||
('product_type','1','卡',1,NULL,NULL,'Y','000000',103,1,NULL),
|
||||
('product_type','2','模组',2,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('product_type','3','设备',3,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('product_type','4','普通商品',4,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('product_type','5','虚拟商品',5,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('product_type','6','卡密商品',6,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('product_type','7','付费内容',7,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('repayment_method','0','余额',0,NULL,NULL,'Y','000000',103,1,NULL),
|
||||
('repayment_method','1','银行卡',1,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('repayment_method','2','支付宝',2,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('repayment_method','3','微信',3,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('resource_export_scene','1','卡入库结果',0,'primary','','N','000000',103,1,'Excel 批量卡入库结果文件'),
|
||||
('resource_export_scene','2','卡出库结果',0,'primary','','N','000000',103,1,'Excel 批量卡出库结果文件(预留)'),
|
||||
('resource_export_scene','3','卡划拨结果',0,'primary','','N','000000',103,1,'Excel 批量卡划拨结果文件(预留)'),
|
||||
('resource_type','1','Card',0,'primary','','N','000000',103,1,'批量结果 Excel 文件'),
|
||||
('resource_type','2','Customer',2,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('resource_type','3','Package',3,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('resource_type','4','recharge_record',4,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('resource_type','5','profit_record',5,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('resource_type','6','settlement_report',6,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('return_status','0','未退款',0,NULL,NULL,'Y','000000',103,1,NULL),
|
||||
('return_status','1','待审核',1,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('return_status','2','执行中',2,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('return_status','3','部分退货',3,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('return_status','4','退货成功',4,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('run_result','0','待运行',0,'info','','N','000000',103,1,NULL),
|
||||
('run_result','1','运行中',1,'primary','','N','000000',103,1,NULL),
|
||||
('run_result','2','成功',2,'success','','N','000000',103,1,NULL),
|
||||
('run_result','3','失败',3,'danger','','N','000000',103,1,NULL),
|
||||
('run_result','4','部分成功',4,'warning','','N','000000',103,1,NULL),
|
||||
('send_user_type','1','代理商',0,'primary','','','000000',103,1,''),
|
||||
('send_user_type','2','终端用户',1,'warning','','','000000',103,1,''),
|
||||
('share_enabled','0','否',0,'danger','','','000000',103,1,''),
|
||||
('share_enabled','1','是',1,'primary','','','000000',103,1,''),
|
||||
('shipping_method','1','物流',1,NULL,NULL,'Y','000000',103,1,NULL),
|
||||
('shipping_method','2','商家自提',2,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('shipping_method','3','无需配送',3,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('shipping_status','0','未发货',0,NULL,NULL,'Y','000000',103,1,NULL),
|
||||
('shipping_status','1','已发货',1,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('shipping_status','2','已收货',2,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('shipping_status','4','退货',4,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('sim_card_inbound_import_status','failed','失败',0,'danger','','N','000000',103,1,'文件、校验或业务处理失败'),
|
||||
('sim_card_inbound_import_status','success','成功',0,'success','','N','000000',103,1,'整批导入成功'),
|
||||
('system_enabled_status','0','未启用',1,'warning','','','000000',103,1,''),
|
||||
('system_enabled_status','1','启用',2,'primary','','','000000',103,1,''),
|
||||
('sys_common_status','0','成功',1,'primary','','N','000000',103,1,'正常状态'),
|
||||
('sys_common_status','1','失败',2,'danger','','N','000000',103,1,'停用状态'),
|
||||
('sys_dept_type','0','部门',0,'','','','000000',103,1,''),
|
||||
('sys_dept_type','1','公司',1,'green','','','000000',103,1,''),
|
||||
('sys_device_type','android','安卓',0,'default','','N','000000',103,1,'安卓'),
|
||||
('sys_device_type','ios','iOS',0,'default','','N','000000',103,1,'iOS'),
|
||||
('sys_device_type','pc','PC',0,'default','','N','000000',103,1,'PC'),
|
||||
('sys_device_type','xcx','小程序',0,'default','','N','000000',103,1,'小程序'),
|
||||
('sys_gen_status','0','生成成功',1,'success','','','000000',103,1,''),
|
||||
('sys_gen_status','1','未生成',2,'','','','000000',103,1,''),
|
||||
('sys_gen_status','2','生成失败',3,'danger','','','000000',103,1,''),
|
||||
('sys_grant_type','email','邮件认证',0,'default','el-check-tag','N','000000',103,1,'邮件认证'),
|
||||
('sys_grant_type','password','密码认证',0,'default','el-check-tag','N','000000',103,1,'密码认证'),
|
||||
('sys_grant_type','sms','短信认证',0,'default','el-check-tag','N','000000',103,1,'短信认证'),
|
||||
('sys_grant_type','social','三方登录认证',0,'default','el-check-tag','N','000000',103,1,'三方登录认证'),
|
||||
('sys_grant_type','xcx','小程序认证',0,'default','el-check-tag','N','000000',103,1,'小程序认证'),
|
||||
('sys_job_concurrent','0','允许',1,'','','','000000',103,1,''),
|
||||
('sys_job_concurrent','1','禁止',2,'','','','000000',103,1,''),
|
||||
('sys_job_group','0','默认',1,'','','','000000',103,1,''),
|
||||
('sys_job_group','1','系统',1,'','','','000000',103,1,''),
|
||||
('sys_job_group','2','数据中心',2,'','','','000000',103,1,''),
|
||||
('sys_job_group','3','预警',3,'','','','000000',103,1,''),
|
||||
('sys_job_group','4','卡数据',4,'','','','000000',103,1,''),
|
||||
('sys_job_group','5','财务',5,'','','','000000',103,1,''),
|
||||
('sys_job_group','6','流量池',6,'','','','000000',103,1,''),
|
||||
('sys_job_group','7','卡管控',7,'','','','000000',103,1,''),
|
||||
('sys_job_group','8','套餐',8,'','','','000000',103,1,''),
|
||||
('sys_job_group','9','测试',9,'','','','000000',103,1,''),
|
||||
('sys_missfire_policy','1','多次执行',1,'','','','000000',103,1,''),
|
||||
('sys_missfire_policy','2','执行一次',2,'','','','000000',103,1,''),
|
||||
('sys_normal_disable','0','正常',1,'primary','','','000000',103,1,'正常状态'),
|
||||
('sys_normal_disable','1','停用',2,'danger','','','000000',103,1,'停用状态'),
|
||||
('sys_notice_status','0','正常',1,'primary','','Y','000000',103,1,'正常状态'),
|
||||
('sys_notice_status','1','关闭',2,'danger','','N','000000',103,1,'关闭状态'),
|
||||
('sys_notice_type','1','通知',1,'warning','','Y','000000',103,1,'通知'),
|
||||
('sys_notice_type','2','公告',2,'success','','N','000000',103,1,'公告'),
|
||||
('sys_oper_type','1','新增',1,'info','','N','000000',103,1,'新增操作'),
|
||||
('sys_oper_type','2','修改',2,'info','','N','000000',103,1,'修改操作'),
|
||||
('sys_oper_type','3','删除',3,'danger','','N','000000',103,1,'删除操作'),
|
||||
('sys_oper_type','4','授权',4,'primary','','N','000000',103,1,'授权操作'),
|
||||
('sys_oper_type','5','导出',5,'warning','','N','000000',103,1,'导出操作'),
|
||||
('sys_oper_type','6','导入',6,'warning','','N','000000',103,1,'导入操作'),
|
||||
('sys_oper_type','7','强退',7,'danger','','N','000000',103,1,'强退操作'),
|
||||
('sys_oper_type','8','生成代码',8,'warning','','N','000000',103,1,'生成操作'),
|
||||
('sys_oper_type','9','清空数据',9,'danger','','N','000000',103,1,'清空操作'),
|
||||
('sys_oper_type','0','其他',99,'info','','N','000000',103,1,'其他操作'),
|
||||
('sys_show_hide','0','显示',1,'primary','','Y','000000',103,1,'显示菜单'),
|
||||
('sys_show_hide','1','隐藏',2,'danger','','N','000000',103,1,'隐藏菜单'),
|
||||
('sys_status','0','正常',0,NULL,NULL,'Y','000000',103,1,NULL),
|
||||
('sys_status','1','停用',1,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('sys_user_sex','0','男',1,'','','Y','000000',103,1,'性别男'),
|
||||
('sys_user_sex','1','女',2,'','','N','000000',103,1,'性别女'),
|
||||
('sys_user_sex','2','未知',3,'','','N','000000',103,1,'性别未知'),
|
||||
('sys_yes_no','Y','是',1,'primary','','Y','000000',103,1,'系统默认是'),
|
||||
('sys_yes_no','N','否',2,'danger','','N','000000',103,1,'系统默认否'),
|
||||
('sys_yes_no_num','0','是',1,'primary','','','000000',103,1,''),
|
||||
('sys_yes_no_num','1','否',2,'danger','','','000000',103,1,''),
|
||||
('transaction_channel','1','支付宝',0,'primary','','','000000',103,1,''),
|
||||
('transaction_channel','2','微信',1,'primary','','','000000',103,1,''),
|
||||
('transaction_channel','3','余额',2,'primary','','','000000',103,1,''),
|
||||
('transaction_status','0','待支付',0,'warning','','','000000',103,1,''),
|
||||
('transaction_status','1','已支付',1,'primary','','','000000',103,1,''),
|
||||
('transaction_status','2','已过期',2,'danger','','','000000',103,1,''),
|
||||
('transaction_status','3','交易失败',3,'danger','','','000000',103,1,''),
|
||||
('transaction_type','0','充值',0,'primary','','','000000',103,1,''),
|
||||
('transaction_type','1','消费',1,'warning','','','000000',103,1,''),
|
||||
('transaction_type','2','转可提现',2,'primary','','','000000',103,1,''),
|
||||
('transaction_type','3','可提现转入',3,'primary','','','000000',103,1,''),
|
||||
('transaction_type','4','人工调整',4,'primary','','','000000',103,1,''),
|
||||
('t_agent_scope_type','0','所有客户',0,'primary','','','000000',103,1,''),
|
||||
('t_agent_scope_type','1','指定客户',1,'primary','','','000000',103,1,''),
|
||||
('t_batch_execution_mode','0','未知',0,'primary','','','000000',103,1,''),
|
||||
('t_batch_execution_mode','1','单卡',10,'primary','','','000000',103,1,''),
|
||||
('t_batch_execution_mode','2','批量',20,'primary','','','000000',103,1,''),
|
||||
('t_batch_source_channel','console','控制台',10,'primary','','','000000',103,1,'控制台认证入口创建的批次'),
|
||||
('t_batch_source_channel','mini_program','小程序',20,'primary','','','000000',103,1,'小程序及其 H5 用户端入口创建的批次'),
|
||||
('t_batch_source_channel','api','API',30,'primary','','','000000',103,1,'开放 API 验签或认证入口创建的批次'),
|
||||
('t_batch_source_channel','system','系统任务',40,'primary','','','000000',103,1,'独立调度或自动业务任务创建的批次'),
|
||||
('t_batch_source_channel','legacy','历史未知',90,'primary','','','000000',103,1,'历史记录或无法确认真实来源的批次,不代表实际发起入口'),
|
||||
('t_batch_source_type','0','批次选择',0,'primary','','','000000',103,1,''),
|
||||
('t_batch_source_type','1','连号',1,'primary','','','000000',103,1,''),
|
||||
('t_batch_source_type','2','批量输入',2,'primary','','','000000',103,1,''),
|
||||
('t_batch_source_type','3','文件',3,'primary','','','000000',103,1,''),
|
||||
('t_batch_source_type','4','定时任务',4,'primary','','','000000',103,1,''),
|
||||
('t_billing_method','1','月',0,'primary','','','000000',103,1,''),
|
||||
('t_billing_method','2','年',1,'primary','','','000000',103,1,''),
|
||||
('t_boss_card_status','7','库存',1,'default','','','000000',103,1,''),
|
||||
('t_boss_card_status','1','待激活',2,'warning','','','000000',103,1,''),
|
||||
('t_boss_card_status','6','可测试',3,'info','','','000000',103,1,''),
|
||||
('t_boss_card_status','2','已激活',4,'success','','','000000',103,1,''),
|
||||
('t_boss_card_status','4','停机',5,'danger','','','000000',103,1,''),
|
||||
('t_boss_card_status','8','预销户',6,'warning','','','000000',103,1,''),
|
||||
('t_boss_card_status','9','已销户',7,'info','','','000000',103,1,''),
|
||||
('t_boss_card_status','0','未知',99,'default','','','000000',103,1,''),
|
||||
('t_cardInfo_dimension','1','使用流量',1,'default','','','000000',103,1,''),
|
||||
('t_cardInfo_dimension','2','剩余流量',1,'default','','','000000',103,1,''),
|
||||
('t_cardInfo_dimensionStatus','!=','!=',1,'default','','','000000',103,1,''),
|
||||
('t_cardInfo_dimensionStatus','<','<',1,'default','','','000000',103,1,''),
|
||||
('t_cardInfo_dimensionStatus','<=','<=',1,'default','','','000000',103,1,''),
|
||||
('t_cardInfo_dimensionStatus','=','=',1,'default','','','000000',103,1,''),
|
||||
('t_cardInfo_dimensionStatus','>','>',1,'default','','','000000',103,1,''),
|
||||
('t_cardInfo_dimensionStatus','>=','>=',1,'default','','','000000',103,1,''),
|
||||
('t_cardInfo_selectCondition','iccid','ICCID',1,'default','','','000000',103,1,''),
|
||||
('t_cardInfo_selectCondition','imei','IMEI',1,'default','','','000000',103,1,''),
|
||||
('t_cardInfo_selectCondition','imsi','IMSI',1,'default','','','000000',103,1,''),
|
||||
('t_cardInfo_selectCondition','msisdn','MSISDN',1,'default','','','000000',103,1,''),
|
||||
('t_cardInfo_sortType','0','升序',1,'default','','','000000',103,1,''),
|
||||
('t_cardInfo_sortType','1','降序',1,'default','','','000000',103,1,''),
|
||||
('t_cardInfo_sortValue','1','iccid',1,'default','','','000000',103,1,''),
|
||||
('t_cardInfo_sortValue','2','msisdn',1,'default','','','000000',103,1,''),
|
||||
('t_cardInfo_sortValue','3','imsi',1,'default','','','000000',103,1,''),
|
||||
('t_cardInfo_sortValue','4','流量用量',1,'default','','','000000',103,1,''),
|
||||
('t_cardInfo_sortValue','5','激活日期',1,'default','','','000000',103,1,''),
|
||||
('t_cardInfo_sortValue','6','流量到期日期',1,'default','','','000000',103,1,''),
|
||||
('t_cardInfo_sortValue','7','状态同步日期',1,'default','','','000000',103,1,''),
|
||||
('t_cardInfo_sortValue','8','出库时间',1,'default','','','000000',103,1,''),
|
||||
('t_cardInfo_timeType','0','开卡时间',1,'default','','','000000',103,1,''),
|
||||
('t_cardInfo_timeType','1','激活时间',1,'default','','','000000',103,1,''),
|
||||
('t_cardInfo_timeType','2','入库时间',1,'default','','','000000',103,1,''),
|
||||
('t_cardInfo_timeType','3','出库时间',3,'default','','','000000',103,1,''),
|
||||
('t_cardInfo_timeType','4','到期时间',4,'default','','','000000',103,1,''),
|
||||
('t_cardInfo_timeType','5','创建时间',5,'default','','','000000',103,1,''),
|
||||
('t_cardInfo_timeType','6','流量同步时间',6,'default','','','000000',103,1,''),
|
||||
('t_cardInfo_timeType','7','状态同步时间',7,'default','','','000000',103,1,''),
|
||||
('t_card_type','1','通用插拔 SIM 卡',0,'primary','','','000000',103,1,''),
|
||||
('t_card_type','2','贴片卡 5×6mm',1,'primary','','','000000',103,1,''),
|
||||
('t_card_type','3','贴片卡 2×2mm',2,'primary','','','000000',103,1,''),
|
||||
('t_card_type','4','消费级插拔物联卡',3,'primary','','','000000',103,1,''),
|
||||
('t_card_type','5','工业级插拔物联卡',4,'primary','','','000000',103,1,''),
|
||||
('t_card_type','6','消费级贴片物联卡',5,'primary','','','000000',103,1,''),
|
||||
('t_card_type','7','工业级贴片物联卡',6,'primary','','','000000',103,1,''),
|
||||
('t_channels_status','0','启用',0,'primary','','','000000',103,1,''),
|
||||
('t_channels_status','1','停用',1,'danger','','','000000',103,1,''),
|
||||
('t_channel_docking_status','1','接口申请中',1,'default','','','000000',103,1,''),
|
||||
('t_channel_docking_status','2','不需要对接',2,'danger','','','000000',103,1,''),
|
||||
('t_channel_docking_status','6','对接中',3,'warning','','','000000',103,1,''),
|
||||
('t_channel_docking_status','3','测试中',4,'primary','','','000000',103,1,''),
|
||||
('t_channel_docking_status','4','已对接',5,'success','','','000000',103,1,''),
|
||||
('t_channel_docking_status','5','接口订阅不全',6,'warning','','','000000',103,1,''),
|
||||
('t_channel_sync_enabled','0','是',0,'success','','','000000',103,1,''),
|
||||
('t_channel_sync_enabled','1','否',1,'danger','','','000000',103,1,''),
|
||||
('t_net_model','1','3G',1,'default','','','000000',103,1,''),
|
||||
('t_net_model','10','移动4G',1,'default','','','000000',103,1,''),
|
||||
('t_net_model','11','联通NB',1,'default','','','000000',103,1,''),
|
||||
('t_net_model','12','联通4G',1,'default','','','000000',103,1,''),
|
||||
('t_net_model','13','电信4G',1,'default','','','000000',103,1,''),
|
||||
('t_net_model','14','RedCap',1,'default','','','000000',103,1,''),
|
||||
('t_net_model','2','2G',1,'default','','','000000',103,1,''),
|
||||
('t_net_model','3','4G',1,'default','','','000000',103,1,''),
|
||||
('t_net_model','4','5G',1,'default','','','000000',103,1,''),
|
||||
('t_net_model','5','NB-IOT',1,'default','','','000000',103,1,''),
|
||||
('t_net_model','6','5G-SA',1,'default','','','000000',103,1,''),
|
||||
('t_net_model','7','5G-NSA',1,'default','','','000000',103,1,''),
|
||||
('t_net_model','8','2G/3G',1,'default','','','000000',103,1,''),
|
||||
('t_net_model','9','电信NB',1,'default','','','000000',103,1,''),
|
||||
('t_operators','1','移动',0,'primary','','','000000',103,1,''),
|
||||
('t_operators','2','联通',1,'primary','','','000000',103,1,''),
|
||||
('t_operators','3','电信',2,'primary','','','000000',103,1,''),
|
||||
('t_package_price_source','system','系统级',0,'primary','','','000000',103,1,''),
|
||||
('t_package_price_source','agentDefault','本级默认',1,'primary','','','000000',103,1,''),
|
||||
('t_package_price_source','target','下级专属',3,'primary','','','000000',103,1,''),
|
||||
('t_package_status','0','无套餐',0,'primary','','','000000',103,1,''),
|
||||
('t_package_status','1','待生效',1,'primary','','','000000',103,1,''),
|
||||
('t_package_status','2','生效中',2,'primary','','','000000',103,1,''),
|
||||
('t_package_status','3','已过期',3,'primary','','','000000',103,1,''),
|
||||
('t_package_type','101','卡套餐',101,NULL,NULL,'N','000000',103,1,'卡套餐'),
|
||||
('t_package_type','102','池套餐',102,NULL,NULL,'N','000000',103,1,'池套餐'),
|
||||
('t_package_type','103','单卡加油包',103,NULL,NULL,'N','000000',103,1,'单卡加油包'),
|
||||
('t_package_type','104','池卡加油包',104,NULL,NULL,'N','000000',103,1,'池卡加油包'),
|
||||
('t_pool_status','0','正常',0,'primary','','','000000',103,1,''),
|
||||
('t_pool_status','1','停用',1,'primary','','','000000',103,1,''),
|
||||
('t_pool_status','2','锁定',2,'primary','','','000000',103,1,''),
|
||||
('t_sim_flow_package_info','101','卡套餐',1,'','','','000000',103,1,''),
|
||||
('t_sim_flow_package_info','102','池套餐',2,'','','','000000',103,1,''),
|
||||
('t_sim_flow_package_info','103','单卡加油包',3,'','','','000000',103,1,''),
|
||||
('t_sim_flow_package_info','104','池卡加油包',4,'','','','000000',103,1,''),
|
||||
('t_warn_auto_action','3','是',1,'default','','','000000',103,1,''),
|
||||
('t_warn_auto_action','0','否',2,'default','','','000000',103,1,''),
|
||||
('t_warn_enabled','1','启用',1,'default','','','000000',103,1,''),
|
||||
('t_warn_enabled','0','停用',2,'default','','','000000',103,1,''),
|
||||
('t_warn_method','3','站内提醒',1,'default','','','000000',103,1,''),
|
||||
('t_warn_method','1','邮箱',2,'default','','','000000',103,1,''),
|
||||
('t_warn_method','0','短信',3,'default','','','000000',103,1,''),
|
||||
('t_warn_unit','1','流量阈值(MB)',1,'default','','','000000',103,1,''),
|
||||
('t_warn_unit','2','流量池百分比',2,'default','','','000000',103,1,''),
|
||||
('warn_methods','0','短信',0,NULL,NULL,'Y','000000',103,1,NULL),
|
||||
('warn_methods','1','邮箱',1,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('warn_methods','2','电话',2,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('warn_methods','3','平台消息',3,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('withdraw_amount_status','0','正常',0,NULL,NULL,'Y','000000',103,1,NULL),
|
||||
('withdraw_amount_status','1','冻结',1,NULL,NULL,'N','000000',103,1,NULL),
|
||||
('wo_type','0','卡',6,'primary','','','000000',103,1,''),
|
||||
('wo_type','1','模组',7,'primary','','','000000',103,1,''),
|
||||
('wo_type','2','设备',8,'primary','','','000000',103,1,''),
|
||||
('wo_type','3','订单',9,'primary','','','000000',103,1,''),
|
||||
('wo_type','4','余额',10,'primary','','','000000',103,1,''),
|
||||
('wo_type','5','提现',11,'primary','','','000000',103,1,''),
|
||||
('yesno_enum','1','是',0,NULL,NULL,'Y','000000',103,1,NULL),
|
||||
('yesno_enum','0','否',1,NULL,NULL,'N','000000',103,1,NULL);
|
||||
@@ -0,0 +1,52 @@
|
||||
-- ============================================
|
||||
-- 演示环境种子数据:Mock 通道(2026-10-27)
|
||||
-- 来源:旧演示机 .160 的 t_sim_channels(该库唯一一条通道记录)
|
||||
--
|
||||
-- 为什么必须有:
|
||||
-- 种子库 01-schema.sql 只含 t_sim_channels 的建表语句、没有数据,
|
||||
-- 但 t_sim_card_info(100 张) 与 t_sim_card_stock(50100 张) 的 chan_key
|
||||
-- 全部指向 channel_yd_mock。通道缺失会让卡片管理页的通道列、按通道筛选、
|
||||
-- 以及开卡/停复机等依赖通道的操作全部异常。
|
||||
--
|
||||
-- 上游走 Mock(http://onelink-mock:8080/),不消耗真实运营商流量。
|
||||
--
|
||||
-- 幂等:以 (tenant_id, chan_key) 唯一键做 ON DUPLICATE KEY UPDATE。
|
||||
-- 执行顺序:08(在 01-07 之后)
|
||||
-- ============================================
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
USE `db_iotlcm`;
|
||||
|
||||
INSERT INTO `t_sim_channels` (
|
||||
`id`,`temp_key`,`chan_key`,`chan_name`,`chan_config`,`chan_status`,`share_enabled`,
|
||||
`chan_alias`,`region_code`,`app_key`,`app_secret`,`access_token`,
|
||||
`access_token_created`,`access_token_expire`,`refresh_token`,
|
||||
`login_user`,`login_password`,`login_url`,`remark`,`tenant_id`,
|
||||
`created_dept`,`created_by`,`created_at`,`updated_by`,`updated_at`,
|
||||
`operator`,`is_normal`,`docking_status`,`sync_enabled`,
|
||||
`card_info_count`,`stock_card_count`,`cancellation_card_count`
|
||||
) VALUES (
|
||||
34,'sim_yd_mock_v5','channel_yd_mock','移动模拟通道','{}',0,0,
|
||||
'中国移动00',NULL,'100059999270000006','password123',NULL,
|
||||
NULL,NULL,'',
|
||||
NULL,NULL,'http://onelink-mock:8080/',NULL,'000000',
|
||||
1,1,'2026-10-19 15:35:03',NULL,NOW(),
|
||||
1,1,NULL,0,
|
||||
100,50100,0
|
||||
)
|
||||
ON DUPLICATE KEY UPDATE
|
||||
`temp_key` = VALUES(`temp_key`),
|
||||
`chan_name` = VALUES(`chan_name`),
|
||||
`chan_config` = VALUES(`chan_config`),
|
||||
`chan_status` = VALUES(`chan_status`),
|
||||
`chan_alias` = VALUES(`chan_alias`),
|
||||
`app_key` = VALUES(`app_key`),
|
||||
`app_secret` = VALUES(`app_secret`),
|
||||
`login_url` = VALUES(`login_url`),
|
||||
`operator` = VALUES(`operator`),
|
||||
`is_normal` = VALUES(`is_normal`),
|
||||
`sync_enabled` = VALUES(`sync_enabled`),
|
||||
`updated_at` = VALUES(`updated_at`),
|
||||
`card_info_count` = VALUES(`card_info_count`),
|
||||
`stock_card_count` = VALUES(`stock_card_count`),
|
||||
`cancellation_card_count` = VALUES(`cancellation_card_count`);
|
||||
@@ -0,0 +1,77 @@
|
||||
-- ============================================
|
||||
-- 演示环境:模板参数与生产旧版本的下发标记(2026-10-27)
|
||||
--
|
||||
-- 版本依据:生产环境 当前运行 admin 镜像 db11766c...,
|
||||
-- 二进制 CommitID=cad19df988a0;演示环境镜像及程序 SHA256 与生产一致。
|
||||
-- 不以浮动 tag、master HEAD 或历史发布记录代替实际运行版本。
|
||||
--
|
||||
-- cad19df 的 passRoleByDept(agent_dept.go:496):
|
||||
-- 仅“当前机构 == 模板机构”走平台模板;其他机构仍查本级唯一
|
||||
-- status=0 / is_pass=1 角色,即使已经配置平台模板也是如此。
|
||||
-- 因此只配置 agent.role.template.role_id 不能解决代理建下级报错。
|
||||
--
|
||||
-- 本文件:
|
||||
-- 1. 修正现有 role 2 的模板属性,并写入唯一的演示模板参数。
|
||||
-- 2. 若测试库已有 dept 172 → role 82,则为该现有角色设置 is_pass=1。
|
||||
-- 不创建角色、机构或账号,不改菜单和 sys_dept.dept_role。
|
||||
-- 全新库没有 role 82 时跳过;它是测试期间创建的一级代理角色。
|
||||
--
|
||||
-- 限制:cad19df 的 createEnterpriseRole 仍将新角色 IsPass 写为 0。
|
||||
-- 新建机构继续创建下级前,仍需配置本机构唯一的下发角色;
|
||||
-- 此 SQL 不是多级下发代码修复,不代表新建三级及以后均已通过验收。
|
||||
-- 不自动补建业务方故意删除的 dept 2/4/5/6/7 角色。
|
||||
--
|
||||
-- sys_config 无 (tenant_id, config_key) 唯一索引,故先删后插,避免重复。
|
||||
-- 种子 SQL 仍处于实测阶段,业务基准向预演看齐;运行代码遵从生产版本。
|
||||
-- 执行顺序:01-08 之后;可重复执行。
|
||||
-- ============================================
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
USE `db_iotlcm`;
|
||||
START TRANSACTION;
|
||||
|
||||
-- 模板校验同时要求:启用、非超管、is_pass=1、data_scope=4、机构有效,
|
||||
-- created_dept 为 0/NULL 或等于 dept_id,且菜单不能使用全部/自定义范围。
|
||||
UPDATE `sys_role`
|
||||
SET `created_dept` = `dept_id`, `status` = '0', `is_pass` = 1, `data_scope` = '4'
|
||||
WHERE `tenant_id` = '000000' AND `role_id` = 2 AND `dept_id` = 1
|
||||
AND `deleted_at` IS NULL;
|
||||
|
||||
DELETE FROM `sys_config`
|
||||
WHERE `tenant_id` = '000000' AND `config_key` = 'agent.role.template.role_id';
|
||||
INSERT INTO `sys_config`
|
||||
(`tenant_id`,`config_name`,`config_key`,`config_value`,`config_type`,`created_dept`,`created_by`,`remark`)
|
||||
VALUES
|
||||
('000000','代理角色下发-平台模板角色ID','agent.role.template.role_id','2','Y',1,1,
|
||||
'演示模板:dept 1 的现有 role 2;生产 cad19df 中代理机构仍需本级唯一 is_pass=1 角色');
|
||||
|
||||
-- 只处理已存在、已绑定的演示一级代理角色;不恢复或新建已删除的角色。
|
||||
UPDATE `sys_role` r
|
||||
JOIN `sys_dept` d ON d.`tenant_id` = r.`tenant_id`
|
||||
AND d.`dept_id` = r.`dept_id` AND d.`dept_role` = r.`role_id`
|
||||
SET r.`is_pass` = 1
|
||||
WHERE r.`tenant_id` = '000000' AND r.`role_id` = 82 AND r.`dept_id` = 172
|
||||
AND r.`deleted_at` IS NULL AND r.`status` = '0'
|
||||
AND d.`deleted_at` IS NULL AND d.`status` = '0'
|
||||
AND 0 = (
|
||||
SELECT other_roles.n FROM (
|
||||
SELECT COUNT(*) AS n FROM `sys_role`
|
||||
WHERE `tenant_id` = '000000' AND `dept_id` = 172 AND `role_id` <> 82
|
||||
AND `is_pass` = 1 AND `deleted_at` IS NULL
|
||||
) other_roles
|
||||
);
|
||||
COMMIT;
|
||||
|
||||
-- 自检输出仅反映配置条件,不能代替页面创建下级的端到端验收。
|
||||
SELECT COUNT(*) AS template_parameter_rows
|
||||
FROM `sys_config`
|
||||
WHERE `tenant_id` = '000000' AND `config_key` = 'agent.role.template.role_id';
|
||||
SELECT `role_id`, `dept_id`, `status`, `is_pass`, `data_scope`, `created_dept`
|
||||
FROM `sys_role` WHERE `tenant_id` = '000000' AND `role_id` IN (2,82)
|
||||
AND `deleted_at` IS NULL;
|
||||
SELECT d.`dept_id`, d.`dept_role`, COUNT(r.`role_id`) AS enabled_distribution_roles
|
||||
FROM `sys_dept` d
|
||||
LEFT JOIN `sys_role` r ON r.`tenant_id` = d.`tenant_id` AND r.`dept_id` = d.`dept_id`
|
||||
AND r.`status` = '0' AND r.`is_pass` = 1 AND r.`deleted_at` IS NULL
|
||||
WHERE d.`tenant_id` = '000000' AND d.`dept_id` = 172 AND d.`deleted_at` IS NULL
|
||||
GROUP BY d.`dept_id`, d.`dept_role`;
|
||||
@@ -0,0 +1,73 @@
|
||||
-- ============================================
|
||||
-- 演示环境种子数据:定时任务(2026-10-27)
|
||||
--
|
||||
-- 基准:生产 生产环境 的 sys_job 当前配置(可直连核对)。
|
||||
-- 预演环境本机不可达(内网环境 / 内网环境 均 No route to host),
|
||||
-- 故以生产实际值为准;若业务要求以预演为基准,需提供预演库访问方式后再比对。
|
||||
--
|
||||
-- 演示原状(15 条可见)与生产的差异:
|
||||
-- 1) 缺 25 / 41 / 42 三个队列全量同步任务
|
||||
-- 2) job_group 除 9 外全为 0(默认),生产已按
|
||||
-- sys_job_group 字典分配到 卡数据4 / 预警3 / 财务5 / 流量池6 / 卡管控7 / 套餐8 / 测试9
|
||||
-- 3) 9/10/11/12 的 cron 是错峰前的旧值,生产已改为
|
||||
-- 0 0 2 * * ? / 0 0 2 * * ? / 0 40 8 1 * ? / 0 25 6 * * ?
|
||||
-- 4) 任务名是旧版带前缀写法,生产已重命名
|
||||
-- 5) job 17 的 cron 含反引号 `0 */15 * * * ?`,不是合法表达式
|
||||
-- 6) job_params 生产为空,演示残留 2026-07 / 117 等历史参数
|
||||
--
|
||||
-- 本文件:清掉 1-8 测试垃圾行,按生产当前配置重建 9-25/41/42 共 19 条。
|
||||
-- 字段(名称/分组/调用目标/cron/misfire/concurrent/remark)与生产逐条一致。
|
||||
--
|
||||
-- 运行状态与生产不同(有意为之):
|
||||
-- 生产启用 11/12/25/41/42 五个同步任务;演示环境全部置 status=1(停用)。
|
||||
-- 演示上游走 Mock、库内 5 万余张卡,若自动跑全量同步会持续打 mock 服务并占满
|
||||
-- 这台 2vCPU/8GB 演示机。若演示确需展示任务执行,请只临时启用单个任务
|
||||
-- (建议 13 测试-全量预警扫描),用完再停用。
|
||||
--
|
||||
-- 幂等:先删后插,可重复执行。执行顺序:09 之后。
|
||||
-- ============================================
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
USE `db_iotlcm`;
|
||||
|
||||
-- 1-8 为 RuoYi 上游演示垃圾数据(生产亦为软删除),演示环境直接物理删除。
|
||||
DELETE FROM `sys_job` WHERE `job_id` BETWEEN 1 AND 8;
|
||||
|
||||
-- 9-25/41/42 按生产当前配置整体重建(含 job 14:生产可见,演示此前被软删除)。
|
||||
DELETE FROM `sys_job` WHERE `job_id` BETWEEN 9 AND 42;
|
||||
|
||||
INSERT INTO `sys_job`
|
||||
(`job_id`, `job_name`, `job_params`, `job_group`, `invoke_target`, `cron_expression`,
|
||||
`misfire_policy`, `concurrent`, `status`, `remark`,
|
||||
`created_dept`, `created_by`, `created_at`, `updated_by`, `updated_at`, `deleted_by`, `deleted_at`)
|
||||
VALUES
|
||||
(9, '同步卡用量', '', 1, 'syns_usage', '0 0 2 * * ?', 1, 0, '1', '', 100, 1, '2026-06-04 21:12:34', 1, '2026-10-27 00:00:00', NULL, NULL),
|
||||
(10, '同步卡运营商状态', '', 0, 'syns_sim_status', '0 0 2 * * ?', 1, 0, '1', '', 100, 1, '2026-06-04 21:12:34', 1, '2026-10-27 00:00:00', NULL, NULL),
|
||||
(11, '月用量记录时序', '', 4, 'sync_traffic_usage_monthly', '0 40 8 1 * ?', 1, 0, '1', '', 100, 1, '2026-06-21 11:53:03', 1, '2026-10-27 00:00:00', NULL, NULL),
|
||||
(12, '日用量记录时序', '', 4, 'sync_traffic_usage_daily', '0 25 6 * * ?', 1, 0, '1', '', 100, 1, '2026-06-22 00:11:11', 1, '2026-10-27 00:00:00', NULL, NULL),
|
||||
(13, '全量预警扫描', '', 9, 'scan_sim_warning', '30 0 1 * * *', 1, 1, '1', '单卡,流量池', 100, 1, '2026-07-24 10:18:00', 1, '2026-10-27 00:00:00', NULL, NULL),
|
||||
(14, ' 预警 - SIM卡到期扫描','', 0, 'notify_package_expiry', '0 0 9 * * ?', 1, 1, '1', '', 100, 1, '2026-07-27 14:35:16', 1, '2026-10-27 00:00:00', NULL, NULL),
|
||||
(15, '流量池用量扫描', '', 3, 'check_flow_pool_warning', '0 */15 * * * ?', 1, 1, '1', '', 100, 1, '2026-07-27 14:37:34', 1, '2026-10-27 00:00:00', NULL, NULL),
|
||||
(16, 'SIM卡用量扫描', '', 3, 'scan_sim_traffic_warning', '0 */15 * * * ?', 1, 1, '1', '', 100, 1, '2026-07-27 14:37:59', 1, '2026-10-27 00:00:00', NULL, NULL),
|
||||
(17, '达量断网扫描', '', 7, 'check_traffic_cutoff', '0 */15 * * * ?', 1, 1, '1', '', 100, 1, '2026-07-27 15:37:08', 1, '2026-10-27 00:00:00', NULL, NULL),
|
||||
(18, '生命周期流转', '', 8, 'sync_package_lifecycle', '0 */15 * * * ?', 1, 1, '1', '', 100, 1, '2026-07-28 16:00:00', 1, '2026-10-27 00:00:00', NULL, NULL),
|
||||
(19, '可提现账户月账单', '', 5, 'settle_profit_account_month_bill','0 0 4 2 * ?', 1, 0, '1', '', 100, 1, '2026-07-28 16:09:51', 1, '2026-10-27 00:00:00', NULL, NULL),
|
||||
(20, '消费账户月账单', '', 5, 'settle_consume_account_month_bill','0 0 4 2 * ?', 1, 0, '1', '', 100, 1, '2026-07-28 16:20:25', 1, '2026-10-27 00:00:00', NULL, NULL),
|
||||
(21, '分润出账', '', 5, 'settle_commission', '0 0 4 * * ?', 1, 0, '1', '', 100, 1, '2026-07-28 16:48:19', 1, '2026-10-27 00:00:00', NULL, NULL),
|
||||
(22, '卡信息数据同步流量池', '', 6, 'sync_flow_pool_card', '0 0 4 * * ?', 1, 0, '1', '', 100, 1, '2026-07-31 16:16:32', 1, '2026-10-27 00:00:00', NULL, NULL),
|
||||
(23, '到期预警全量预加载', '', 3, 'PreloadSimExpireWarning', '0 30 23 L * ?', 1, 1, '1', '每月底扫描下下个月到期卡,写入 Redis 候选池', 100, 1, '2026-07-31 17:53:44', 1, '2026-10-27 00:00:00', NULL, NULL),
|
||||
(24, '定时到期预警扫描', '', 3, 'ScanSimExpireCandidateWarning', '0 0 9 * * ?', 1, 1, '1', '', 100, 1, '2026-07-31 17:54:13', 1, '2026-10-27 00:00:00', NULL, NULL),
|
||||
(25, '队列-用量同步', '', 4, 'start_traffic_usage_full_sync', '0 30 0 * * ?', 1, 1, '1', '', 100, 1, '2026-10-23 00:00:00', 1, '2026-10-27 00:00:00', NULL, NULL),
|
||||
(41, '队列-状态同步', '', 4, 'syns_sim_status_queue', '0 30 18 * * ?', 1, 0, '1', '', 100, 1, '2026-10-23 00:00:00', 1, '2026-10-27 00:00:00', NULL, NULL),
|
||||
(42, '队列-IMEI 同步', '', 4, 'syns_imei_queue', '0 10 20 1/3 * ?', 1, 0, '1', '', 100, 1, '2026-10-23 00:00:00', 1, '2026-10-27 00:00:00', NULL, NULL);
|
||||
|
||||
-- 自检:应与生产一致(可见 19 条、全部停用、分组分布如下)
|
||||
SELECT COUNT(*) AS visible_total,
|
||||
SUM(`status` = 0) AS enabled_total,
|
||||
SUM(`job_group` = 4) AS group_kadata,
|
||||
SUM(`job_group` = 3) AS group_warning,
|
||||
SUM(`job_group` = 5) AS group_finance
|
||||
FROM `sys_job` WHERE `deleted_at` IS NULL;
|
||||
|
||||
SELECT `job_id`, `job_name`, `job_group`, `cron_expression`, `status`
|
||||
FROM `sys_job` WHERE `deleted_at` IS NULL ORDER BY `job_id`;
|
||||
@@ -0,0 +1,72 @@
|
||||
-- ============================================
|
||||
-- 演示环境种子数据:sys_menu 与生产全量对齐(2026-10-27)
|
||||
--
|
||||
-- 背景:演示库 sys_menu 420 条,生产 459 条,缺 27 条增量(生产有、演示无),
|
||||
-- 反向差异 0 条(演示无多余菜单)。缺的包括:
|
||||
-- · 达量断网 4 个按钮权限(excel:template / excel:submit / range:submit / input:submit)
|
||||
-- —— 这是"达量断网页面按钮点了 403 / 看不到功能"的直接原因
|
||||
-- · 全量同步页(fullSyncRuns:view/failures/start/replay/replay:view)5 条
|
||||
-- · 订单模块(订单目录 + 管理员订单 + 销售订单列表)3 条
|
||||
-- · 文档中心(含 Web 手册 / OpenAPI 文档)3 条
|
||||
-- · 财务/流量池/通道/销户等按钮权限 12 条
|
||||
--
|
||||
-- 方法:以 perms 为语义键做比对(perms 为空时用 menu_type+menu_name),
|
||||
-- 生产 ID 与演示 ID 体系不同,故新建菜单占用演示 421-447 段,
|
||||
-- 父级按语义递归解析到演示现有菜单(0 个悬空)。
|
||||
--
|
||||
-- 结果:演示 447 条;与生产逐条比对 —— 缺 0 条、多余 0 条。
|
||||
-- 数量差 12 = 演示独有的 5 条租户按钮(system:tenant:*)
|
||||
-- + 生产侧 7 条同 perms 的重复菜单(语义键去重后合并)
|
||||
--
|
||||
-- 角色绑定:演示仅 5 个角色,新菜单绑到 2/82/88(原有的全量绑定角色),
|
||||
-- 与它们各自 190 条的绑定模式一致;role 3/4 是限定角色,不绑。
|
||||
--
|
||||
-- 前置知识:超管(role 1) 的菜单可见性走代码分支直接返回全部 status=0 菜单;
|
||||
-- 但接口鉴权的 accessCodeList 仍需 sys_role_menu 里有该菜单,
|
||||
-- 否则 normalizeMenuAccessCodes 拿不到 perms → 按钮/功能 403。
|
||||
--
|
||||
-- 幂等:先删后插,可重复执行。执行顺序:10 之后(11-)。
|
||||
-- ============================================
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
USE `db_iotlcm`;
|
||||
|
||||
DELETE FROM `sys_menu` WHERE `menu_id` BETWEEN 421 AND 447;
|
||||
INSERT INTO `sys_menu` (`menu_id`,`menu_name`,`parent_id`,`order_num`,`path`,`component`,`is_frame`,`is_cache`,`menu_type`,`visible`,`status`,`perms`,`icon`,`created_dept`,`created_by`,`created_at`,`remark`) VALUES
|
||||
(421,'全量同步',2,7,'full-sync','monitor/full-sync/index','1','0','C','0','0','cpm:iot:fullSyncRuns:view','lucide:refresh-cw',100,1,NOW(),'全量同步结果与手动启动'),
|
||||
(422,'查看失败明细',421,1,'',NULL,'1','0','F','0','0','cpm:iot:fullSyncRuns:failures','#',100,1,NOW(),NULL),
|
||||
(423,'手动启动同步',421,2,'',NULL,'1','0','F','0','0','cpm:iot:fullSyncRuns:start','#',100,1,NOW(),NULL),
|
||||
(424,'重投失败卡',421,3,'',NULL,'1','0','F','0','0','cpm:iot:fullSyncRuns:replay','#',100,1,NOW(),NULL),
|
||||
(425,'查看重投状态',421,4,'',NULL,'1','0','F','0','0','cpm:iot:fullSyncRuns:replay:view','#',100,1,NOW(),NULL),
|
||||
(426,'订单',196,10,'TOrder',NULL,'1','0','M','0','0',NULL,NULL,100,1,NOW(),NULL),
|
||||
(427,'管理员订单',426,11,'indexTwo','iotlcm/tOrder/indexTwo','1','0','C','0','0',NULL,'ant-design:appstore-outlined',100,1,NOW(),NULL),
|
||||
(428,'获取财务审核记录表列表',354,10,'',NULL,'1','0','F','0','0','gen:tFinanceAuditRecord:list',NULL,100,1,NOW(),NULL),
|
||||
(429,'获取财务申请表列表',349,10,'',NULL,'1','0','F','0','0','gen:tFinanceApply:list',NULL,100,1,NOW(),NULL),
|
||||
(430,'获取分层分润概览',334,10,'',NULL,'1','0','F','0','0','common:tFinCommissionDetail:getCommissionOverview',NULL,100,1,NOW(),NULL),
|
||||
(431,'获取SIM流量池套餐配置表列表',411,10,'',NULL,'1','0','F','0','0','iot:tFlowPackageConfig:list',NULL,100,1,NOW(),NULL),
|
||||
(432,'敏感定价查看',135,15,'',NULL,'1','0','F','0','0','iot:tSimFlowPackagePrice:sensitive:view',NULL,100,1,NOW(),NULL),
|
||||
(433,'敏感定价维护',135,15,'',NULL,'1','0','F','0','0','iot:tSimFlowPackagePrice:sensitive:edit',NULL,100,1,NOW(),NULL),
|
||||
(434,'下载批量卡销户Excel模板',257,10,'',NULL,'1','0','F','0','0','iot:tSimCardCancel:excel:template',NULL,100,1,NOW(),NULL),
|
||||
(435,'提交Excel批量卡销户',257,10,'',NULL,'1','0','F','0','0','iot:tSimCardCancel:excel:submit',NULL,100,1,NOW(),NULL),
|
||||
(436,'通道测试',119,10,'',NULL,'1','0','F','0','0','iot:tSimChannels:test',NULL,100,1,NOW(),NULL),
|
||||
(437,'提交批量输入达量断网配置',257,10,'',NULL,'1','0','F','0','0','iot:tSimCardTrafficCutoff:input:submit',NULL,100,1,NOW(),NULL),
|
||||
(438,'单卡加油包',257,10,'',NULL,'1','0','F','0','0','iot:tSimCardBindPkg:addPackage',NULL,100,1,NOW(),NULL),
|
||||
(439,'流量池加油包',257,10,'',NULL,'1','0','F','0','0','iot:tSimPoolBindPackage:addPackage',NULL,100,1,NOW(),NULL),
|
||||
(440,'看订购表/套餐详情',257,10,'',NULL,'1','0','F','0','0','iot:tSimCardBindPkg:view',NULL,100,1,NOW(),NULL),
|
||||
(441,'下载达量断网配置Excel模板',416,1,'',NULL,'1','0','F','0','0','iot:tSimCardTrafficCutoff:excel:template',NULL,100,1,NOW(),NULL),
|
||||
(442,'提交Excel批量达量断网配置',416,1,'',NULL,'1','0','F','0','0','iot:tSimCardTrafficCutoff:excel:submit',NULL,100,1,NOW(),NULL),
|
||||
(443,'提交连号达量断网配置',416,1,'',NULL,'1','0','F','0','0','iot:tSimCardTrafficCutoff:range:submit',NULL,100,1,NOW(),NULL),
|
||||
(444,'文档中心',0,33,'','/','1','0','C','0','0',NULL,NULL,100,1,NOW(),NULL),
|
||||
(445,'Web 使用手册',444,1,'/docs/manual/web/',NULL,'0','0','C','0','0',NULL,NULL,100,1,NOW(),NULL),
|
||||
(446,'OpenAPI 文档',444,2,'/docs/openapi/v3/',NULL,'0','0','C','0','0',NULL,NULL,100,1,NOW(),NULL),
|
||||
(447,'获取销售订单列表',427,10,'',NULL,'1','0','F','0','0','iot:tOrder:sellList',NULL,100,1,NOW(),NULL);
|
||||
|
||||
DELETE FROM sys_role_menu WHERE menu_id BETWEEN 421 AND 447;
|
||||
INSERT INTO sys_role_menu (tenant_id, role_id, menu_id, data_scope)
|
||||
SELECT '000000', r.role_id, m.menu_id, '0'
|
||||
FROM (SELECT 2 AS role_id UNION ALL SELECT 82 UNION ALL SELECT 88) r
|
||||
CROSS JOIN (SELECT menu_id FROM sys_menu WHERE menu_id BETWEEN 421 AND 447) m;
|
||||
|
||||
-- 自检:菜单总数应为 447,新增绑定 81 条
|
||||
SELECT COUNT(*) AS menu_total FROM `sys_menu`;
|
||||
SELECT role_id, COUNT(*) AS menus FROM `sys_role_menu` GROUP BY role_id ORDER BY role_id;
|
||||
@@ -0,0 +1,70 @@
|
||||
-- ============================================
|
||||
-- 演示环境数据修复:sys_dept.ancestors 尾逗号归一化(2026-10-27)
|
||||
--
|
||||
-- 症状:一级代理账号在「业务受理 → 卡片划拨」里选不到下级(下拉“暂无数据”)。
|
||||
--
|
||||
-- 根因(两处代码缺陷,见 hotfix/dept-ancestors-20261027):
|
||||
-- 1) 写入端 `agent_dept.go childDeptAncestors` 生成 "0,1,172"(缺尾逗号),
|
||||
-- 与平台约定格式 "0,1,172," 不一致;
|
||||
-- 2) 匹配端 `xgorm/handler/filter_auth.go GetDeptAndSub` 只按 '%,id,%' 匹配,
|
||||
-- 缺尾逗号时匹配不到,于是「本机构及以下」数据范围里没有下级,
|
||||
-- 卡片划拨的 targets 接口(parent_id = 当前机构 + 数据权限过滤)返回空。
|
||||
--
|
||||
-- 本文件只修数据:按父子链重算 ancestors,统一为「以逗号结尾」的平台格式。
|
||||
-- 已创建的机构(如 dept 206「二级代理」= '0,1,172')会被修正为 '0,1,172,'。
|
||||
--
|
||||
-- 状态(2026-10-27 更新):**两端代码修复已上线**
|
||||
-- admin-svr `6e3253c`(tag v1.0.3)已规范部署到演示与生产,写入端不再产生缺尾逗号。
|
||||
-- 因此:
|
||||
-- · 对**全新种子库**:无脏数据,本文件为空操作(保留仅为对称与可追溯);
|
||||
-- · 对**既有库**:仍可用于修复历史上已写坏的 ancestors(幂等,可随时重跑)。
|
||||
-- 代码修复见 wiki `projects/iotlcm-deploy/references/dept-ancestors-hotfix-20261027`。
|
||||
--
|
||||
-- 执行顺序:11 之后(12-)。
|
||||
--
|
||||
-- 幂等:可重复执行。MySQL 8.0 递归 CTE + 中转表(避免 1093 自表更新限制)。
|
||||
-- 注:递归 CTE 的列宽取自非递归部分,必须 CAST,否则 CONCAT 结果报 1406。
|
||||
-- ============================================
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
USE `db_iotlcm`;
|
||||
|
||||
DROP TABLE IF EXISTS `_tmp_dept_ancestors_fix`;
|
||||
CREATE TABLE `_tmp_dept_ancestors_fix` (
|
||||
`dept_id` BIGINT NOT NULL,
|
||||
`ancestors_calc` VARCHAR(255) NOT NULL,
|
||||
PRIMARY KEY (`dept_id`)
|
||||
);
|
||||
|
||||
INSERT INTO `_tmp_dept_ancestors_fix` (`dept_id`, `ancestors_calc`)
|
||||
WITH RECURSIVE `dept_tree` (`dept_id`, `tenant_id`, `ancestors_calc`, `depth`) AS (
|
||||
SELECT `dept_id`, `tenant_id`, CAST('0,' AS CHAR(255)), 1
|
||||
FROM `sys_dept`
|
||||
WHERE `parent_id` = 0
|
||||
UNION ALL
|
||||
SELECT d.`dept_id`, d.`tenant_id`, CONCAT(t.`ancestors_calc`, d.`parent_id`, ','), t.`depth` + 1
|
||||
FROM `sys_dept` d
|
||||
JOIN `dept_tree` t ON d.`parent_id` = t.`dept_id` AND d.`tenant_id` = t.`tenant_id`
|
||||
WHERE t.`depth` < 32
|
||||
)
|
||||
SELECT `dept_id`, `ancestors_calc` FROM `dept_tree`;
|
||||
|
||||
UPDATE `sys_dept` d
|
||||
JOIN `_tmp_dept_ancestors_fix` t ON t.`dept_id` = d.`dept_id`
|
||||
SET d.`ancestors` = t.`ancestors_calc`
|
||||
WHERE d.`ancestors` <> t.`ancestors_calc`;
|
||||
|
||||
DROP TABLE `_tmp_dept_ancestors_fix`;
|
||||
|
||||
-- 自检 1:不应再有非空且不以逗号结尾的 ancestors
|
||||
SELECT COUNT(*) AS still_missing_trailing_comma
|
||||
FROM `sys_dept`
|
||||
WHERE `ancestors` IS NOT NULL AND `ancestors` <> '' AND `ancestors` <> '0,'
|
||||
AND RIGHT(`ancestors`, 1) <> ',';
|
||||
|
||||
-- 自检 2:复现划拨接口的取数条件(parent_id = 一级代理 + 数据权限展开结果)
|
||||
SELECT `dept_id`, `dept_name`, `parent_id`, `ancestors`
|
||||
FROM `sys_dept`
|
||||
WHERE `deleted_at` IS NULL AND `status` = '0' AND `parent_id` = 172
|
||||
AND (`ancestors` LIKE '%,172,%' OR `ancestors` LIKE '%,172')
|
||||
ORDER BY `dept_id`;
|
||||
@@ -0,0 +1,94 @@
|
||||
# 数据库初始化脚本
|
||||
|
||||
MySQL 容器**首次以空数据卷启动**时,`docker-entrypoint-initdb.d` 会按**文件名顺序**自动执行本目录下的脚本。
|
||||
|
||||
改了这些文件必须清空数据卷才会重跑:
|
||||
|
||||
```bash
|
||||
docker compose stop mysql
|
||||
sudo rm -rf ./data/mysql
|
||||
docker compose up -d mysql
|
||||
```
|
||||
|
||||
> ⚠️ 清空 `./data/mysql` 会**删除全部数据**,生产环境不要执行。
|
||||
|
||||
## 执行顺序
|
||||
|
||||
按「结构 → 账号 → 种子数据」三阶段编号,文件名顺序即执行顺序。除 01 外全部幂等,可重复执行。
|
||||
|
||||
| 序号 | 文件 | 内容 |
|
||||
| --- | --- | --- |
|
||||
| 01 | `01-schema.sql` | 建 `db_iotlcm` 库 + 全部表结构 + 基础数据(菜单、字典、角色、租户、演示账号)。自包含:`DROP DATABASE` → `CREATE` → `USE` |
|
||||
| 02 | `02-schema-fix-preview1.sql` | 补 `card_channel_assoc` 表 + 27 列。用存储过程按 `information_schema` 判断,规避 MySQL 8 无 `ADD COLUMN IF NOT EXISTS` |
|
||||
| 03 | `03-schema-align-prod.sql` | 补 `t_sms_template_config` 表 + 修正 `batch_no` 默认值 |
|
||||
| 04 | `04-users.sh` | 建应用账号 `u_iotlcm`(口令取自 `MYSQL_APP_PASSWORD`)+ 可选库 `iotdb` |
|
||||
| 05 | `05-reset-passwords.sh` | 把所有种子账号口令重置为 `MYSQL_ADMIN_PASSWORD`(按各账号自身 salt 重算哈希) |
|
||||
| 06 | `06-seed-channel-templates.sql` | 通道模板 23 条(上游密钥已置空) |
|
||||
| 07 | `07-seed-dict.sql` | 数据字典:`sys_dict_type` 86 类 + `sys_dict_data` 435 条 |
|
||||
| 08 | `08-seed-mock-channel.sql` | **Mock 通道 `channel_yd_mock`**。演示卡全部挂在该通道上,缺则卡片管理的通道列、筛选、开停复机均不可用 |
|
||||
| 09 | `09-seed-role-chain.sql` | 代理下发模板参数 + 角色下发标记 |
|
||||
| 10 | `10-seed-jobs.sql` | 定时任务 19 条,**默认全部停用**(避免自动全量同步压满机器) |
|
||||
| 11 | `11-seed-menu-align-prod.sql` | 菜单增量 27 条(含达量断网按钮权限、全量同步页) |
|
||||
| 12 | `12-repair-dept-ancestors.sql` | `sys_dept.ancestors` 尾逗号归一化。全新库为空操作,仅用于修复既有库脏数据 |
|
||||
|
||||
## 种子数据说明
|
||||
|
||||
### 保留的内容(业务必需)
|
||||
|
||||
- **菜单** `sys_menu`:系统导航与按钮权限
|
||||
- **字典** `sys_dict_type` / `sys_dict_data`:全部业务枚举
|
||||
- **角色** `sys_role` / `sys_role_menu` / `sys_role_dept`:超级管理员、M管理员、M用户、终端用户
|
||||
- **租户与部门** `sys_tenant` / `sys_dept`:企业-代理-部门三层结构
|
||||
- **接口权限** `t_api` / `t_api_group` / `t_api_resource`:OpenAPI 权限模型
|
||||
- **通道模板** `t_sim_channel_template`:运营商通道配置模板
|
||||
- **行政区划** `t_division_code`:省市级
|
||||
- **演示账号** `sys_user` 18 个:覆盖管理员、代理、终端用户等角色,出库与划拨流程依赖这张表与部门树的关联
|
||||
|
||||
### 已脱敏的内容
|
||||
|
||||
| 项 | 处理 |
|
||||
| --- | --- |
|
||||
| 账号昵称 | `示例用户01` ~ `示例用户18` |
|
||||
| 邮箱 | `user01@example.com` ~ `user18@example.com` |
|
||||
| 手机号 | 合法 11 位编造号(`1380000` + 4 位序号,保持互异) |
|
||||
| 登录 IP | 清空 |
|
||||
| 头像地址 | 清空 |
|
||||
| 公司名 / 组织名 | `示例企业` / `示例代理` |
|
||||
| 密码哈希 | 初始化时按 `MYSQL_ADMIN_PASSWORD` 重算 |
|
||||
| 通道密钥 | 置空 |
|
||||
|
||||
### 空表(正常)
|
||||
|
||||
以下表在种子库中为空,属预期状态:
|
||||
|
||||
| 表 | 说明 |
|
||||
| --- | --- |
|
||||
| `t_sim_flow_package_info` | 流量套餐。为空时无法办理套餐/续费/改套餐,需自行在后台「套餐定价」中创建 |
|
||||
| `t_sim_card` | 卡数据。可通过挡板服务的造卡接口生成测试卡 |
|
||||
| `t_sim_channels` | 业务通道。Mock 通道由 `08` 脚本插入 |
|
||||
| 其余 `t_*` 业务表 | 均为空,随业务操作产生数据 |
|
||||
|
||||
## 首次登录
|
||||
|
||||
| 项 | 值 |
|
||||
| --- | --- |
|
||||
| 地址 | `http://<宿主机IP><:ADMIN_UI_PORT>` |
|
||||
| 账号 | `admin` |
|
||||
| 口令 | `.env` 里的 `MYSQL_ADMIN_PASSWORD` |
|
||||
|
||||
其余演示账号的登录名见 `sys_user.user_name`,口令同为 `MYSQL_ADMIN_PASSWORD`。**所有账号登录后请立即修改口令。**
|
||||
|
||||
## 手动执行
|
||||
|
||||
容器已启动后需要单独执行某个脚本:
|
||||
|
||||
```bash
|
||||
docker compose exec -T mysql sh -c \
|
||||
'mysql -uroot -p"$MYSQL_ROOT_PASSWORD" db_iotlcm' < schema/07-seed-dict.sql
|
||||
```
|
||||
|
||||
`.sh` 脚本需要环境变量,在容器内执行:
|
||||
|
||||
```bash
|
||||
docker compose exec mysql bash /docker-entrypoint-initdb.d/04-users.sh
|
||||
```
|
||||
Reference in New Issue
Block a user