From bc2c7bcc6b327b430e9d816910980034396dd9ec Mon Sep 17 00:00:00 2001 From: MiFaZhan Date: Wed, 28 Oct 2026 13:40:12 +0800 Subject: [PATCH 01/24] =?UTF-8?q?init:=20IotLCM=20=E5=BC=80=E6=BA=90?= =?UTF-8?q?=E7=89=88=E9=83=A8=E7=BD=B2=E4=BB=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 内容: - 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 启动运营商接口挡板,即可在无真实运营商环境时跑通全链路。 --- .env.example | 95 + .gitignore | 14 + config.example/admin-svr/config.example.yaml | 228 + config.example/admin-ui/default.conf | 61 + config.example/app-server/config.example.yaml | 263 ++ config.example/bot/config.example.yaml | 26 + config.example/nginx/iotlcm.conf | 141 + config.example/openapi/config.example.yaml | 91 + config.example/sms/config.example.yaml | 29 + .../upstream-chan/config.example.yaml | 108 + .../upstream-proxy/config.example.yaml | 110 + config.example/worker-svr/config.example.yaml | 139 + docker-compose.yml | 397 ++ schema/01-schema.sql | 4155 +++++++++++++++++ schema/02-schema-fix-preview1.sql | 116 + schema/03-schema-align-prod.sql | 42 + schema/04-users.sh | 33 + schema/05-reset-passwords.sh | 56 + schema/06-seed-channel-templates.sql | 45 + schema/07-seed-dict.sql | 677 +++ schema/08-seed-mock-channel.sql | 52 + schema/09-seed-role-chain.sql | 77 + schema/10-seed-jobs.sql | 73 + schema/11-seed-menu-align-prod.sql | 72 + schema/12-repair-dept-ancestors.sql | 70 + schema/README.md | 94 + 26 files changed, 7264 insertions(+) create mode 100644 .env.example create mode 100644 .gitignore create mode 100644 config.example/admin-svr/config.example.yaml create mode 100644 config.example/admin-ui/default.conf create mode 100644 config.example/app-server/config.example.yaml create mode 100644 config.example/bot/config.example.yaml create mode 100644 config.example/nginx/iotlcm.conf create mode 100644 config.example/openapi/config.example.yaml create mode 100644 config.example/sms/config.example.yaml create mode 100644 config.example/upstream-chan/config.example.yaml create mode 100644 config.example/upstream-proxy/config.example.yaml create mode 100644 config.example/worker-svr/config.example.yaml create mode 100644 docker-compose.yml create mode 100644 schema/01-schema.sql create mode 100644 schema/02-schema-fix-preview1.sql create mode 100644 schema/03-schema-align-prod.sql create mode 100755 schema/04-users.sh create mode 100755 schema/05-reset-passwords.sh create mode 100644 schema/06-seed-channel-templates.sql create mode 100644 schema/07-seed-dict.sql create mode 100644 schema/08-seed-mock-channel.sql create mode 100644 schema/09-seed-role-chain.sql create mode 100644 schema/10-seed-jobs.sql create mode 100644 schema/11-seed-menu-align-prod.sql create mode 100644 schema/12-repair-dept-ancestors.sql create mode 100644 schema/README.md diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..abb24d3 --- /dev/null +++ b/.env.example @@ -0,0 +1,95 @@ +# ============================================================ +# IotLCM 部署环境变量 +# +# cp .env.example .env +# +# 标注「必填」的变量未设置时 docker compose 会直接报错退出, +# 避免用弱口令启动。口令建议用 openssl rand -base64 24 生成。 +# ============================================================ + +# ---------- 镜像 ---------- +# 镜像仓库地址(不含末尾斜杠)。 +# 基础组件从 /library/ 拉取,业务镜像从 /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 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..82d5639 --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +# 运行时数据(含数据库文件、日志、上传件) +data/ + +# 实际配置(由 config.example 复制而来,含真实凭据) +config/ + +# 环境变量文件 +.env + +# 编辑器与系统文件 +.DS_Store +*.swp +.idea/ +.vscode/ diff --git a/config.example/admin-svr/config.example.yaml b/config.example/admin-svr/config.example.yaml new file mode 100644 index 0000000..ba51502 --- /dev/null +++ b/config.example/admin-svr/config.example.yaml @@ -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 diff --git a/config.example/admin-ui/default.conf b/config.example/admin-ui/default.conf new file mode 100644 index 0000000..8ccfa24 --- /dev/null +++ b/config.example/admin-ui/default.conf @@ -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; +} diff --git a/config.example/app-server/config.example.yaml b/config.example/app-server/config.example.yaml new file mode 100644 index 0000000..8fab95f --- /dev/null +++ b/config.example/app-server/config.example.yaml @@ -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: [] diff --git a/config.example/bot/config.example.yaml b/config.example/bot/config.example.yaml new file mode 100644 index 0000000..aaca7da --- /dev/null +++ b/config.example/bot/config.example.yaml @@ -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}" diff --git a/config.example/nginx/iotlcm.conf b/config.example/nginx/iotlcm.conf new file mode 100644 index 0000000..5c3e1d3 --- /dev/null +++ b/config.example/nginx/iotlcm.conf @@ -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; + } +} diff --git a/config.example/openapi/config.example.yaml b/config.example/openapi/config.example.yaml new file mode 100644 index 0000000..33e65b5 --- /dev/null +++ b/config.example/openapi/config.example.yaml @@ -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" diff --git a/config.example/sms/config.example.yaml b/config.example/sms/config.example.yaml new file mode 100644 index 0000000..161ea7e --- /dev/null +++ b/config.example/sms/config.example.yaml @@ -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 diff --git a/config.example/upstream-chan/config.example.yaml b/config.example/upstream-chan/config.example.yaml new file mode 100644 index 0000000..37fa987 --- /dev/null +++ b/config.example/upstream-chan/config.example.yaml @@ -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/" diff --git a/config.example/upstream-proxy/config.example.yaml b/config.example/upstream-proxy/config.example.yaml new file mode 100644 index 0000000..eda616d --- /dev/null +++ b/config.example/upstream-proxy/config.example.yaml @@ -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 diff --git a/config.example/worker-svr/config.example.yaml b/config.example/worker-svr/config.example.yaml new file mode 100644 index 0000000..a01af2a --- /dev/null +++ b/config.example/worker-svr/config.example.yaml @@ -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 diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..51ea11f --- /dev/null +++ b/docker-compose.yml @@ -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 diff --git a/schema/01-schema.sql b/schema/01-schema.sql new file mode 100644 index 0000000..f4d0bf7 --- /dev/null +++ b/schema/01-schema.sql @@ -0,0 +1,4155 @@ +-- ============================================ +-- db_iotlcm 数据库初始化脚本(清理版) +-- 来源: db_iotlcm_init.sql (mysqldump 导版本) +-- 清理内容: +-- 1. 主键 ID 按插入顺序重排为 1,2,3,...(同步更新外键引用) +-- 2. 部门树压平至 3 级,按 客户/代理/部门 角色重命名 +-- 3. 移除 mysqldump 的 LOCK TABLES / UNLOCK TABLES / DISABLE KEYS / ENABLE KEYS 噪音 +-- 4. 移除 session 变量的 @OLD_* 保存/恢复包装 +-- 5. INSERT 语句改为每行一条记录 +-- 注意: 本脚本不修改业务语义。 +-- t_division_code: 仅导出 region_level IN (1,2) 省/市级 +-- ============================================ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +DROP DATABASE IF EXISTS `db_iotlcm`; +CREATE DATABASE `db_iotlcm` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +USE `db_iotlcm`; + +DROP TABLE IF EXISTS `batch_detail`; +CREATE TABLE `batch_detail` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `batch_no` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '批次编号', + `batch_type` int NOT NULL COMMENT '批次类型 枚举(与主表一致)', + `detail_status` tinyint NOT NULL COMMENT '明细异步处理状态 0-待处理 1-处理中 2-成功 3-失败', + `blank_out_status` tinyint NOT NULL COMMENT '作废状态 0-是 1-否', + `row_no` int NOT NULL COMMENT '行号', + `item_id` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '项ID:卡ICCID/设备编码', + `error_code` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '异常编码', + `error_reason` varchar(512) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '异常原因', + `snapshot` json DEFAULT NULL COMMENT '信息快照', + `tenant_id` varchar(20) COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门ID', + `created_by` bigint NOT NULL COMMENT '创建者ID', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者ID', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_batch_type_row_no` (`batch_no`,`batch_type`,`row_no`), + KEY `idx_batch_type` (`batch_type`), + KEY `idx_detail_status` (`detail_status`), + KEY `idx_error_code` (`error_code`), + KEY `idx_tenant_id` (`tenant_id`), + KEY `idx_batch_type_item_id` (`batch_no`,`batch_type`,`item_id`) +) ENGINE=InnoDB AUTO_INCREMENT=1719 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='批次明细表'; + +DROP TABLE IF EXISTS `batch_main`; +CREATE TABLE `batch_main` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `batch_no` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '批次编号', + `order_sn` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '订单编号', + `batch_type` int NOT NULL COMMENT '批次类型 枚举', + `batch_status` tinyint NOT NULL DEFAULT '0' COMMENT '批次状态 枚举', + `batch_async_status` tinyint NOT NULL DEFAULT '0' COMMENT '异步处理状态 0=已创建 1=待处理 2=处理中 3=成功 4=失败 5=部分成功', + `source_type` tinyint DEFAULT NULL COMMENT '来源方式 枚举', + `source_batch_no` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '来源批次编号', + `source_oss_id` bigint DEFAULT NULL COMMENT '源文件OSS ID', + `result_oss_id` bigint DEFAULT NULL COMMENT '结果文件OSS ID', + `is_cross_dept` tinyint NOT NULL DEFAULT '0' COMMENT '是否跨级操作机构 0-否 1-是', + `target_dept_id` bigint DEFAULT NULL COMMENT '目标机构编号', + `dept_id` bigint DEFAULT NULL COMMENT '机构编号', + `total_count` int NOT NULL DEFAULT '0' COMMENT '总数量', + `valid_count` int NOT NULL DEFAULT '0' COMMENT '有效数量', + `success_count` int NOT NULL DEFAULT '0' COMMENT '成功数量', + `fail_count` int NOT NULL DEFAULT '0' COMMENT '失败数量', + `run_result` tinyint DEFAULT NULL COMMENT '运行结果:0-待运行 1-运行中 2-成功 3-失败', + `fail_reason` text COLLATE utf8mb4_general_ci COMMENT '失败原因', + `batch_info` json DEFAULT NULL COMMENT '批次信息:入库/出库展示字段', + `remark` json DEFAULT NULL COMMENT '备注扩展字段', + `start_time` datetime DEFAULT NULL COMMENT '开始时间', + `end_time` datetime DEFAULT NULL COMMENT '结束时间', + `tenant_id` varchar(20) COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门ID', + `created_by` bigint NOT NULL COMMENT '创建者ID', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者ID', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_batch_no` (`batch_no`), + KEY `idx_batch_type` (`batch_type`), + KEY `idx_batch_status` (`batch_status`), + KEY `idx_source_batch_no` (`source_batch_no`), + KEY `idx_dept_id` (`dept_id`), + KEY `idx_target_dept_id` (`target_dept_id`), + KEY `idx_tenant_id` (`tenant_id`), + KEY `idx_created_at` (`created_at`), + KEY `idx_batch_async_status` (`batch_async_status`) +) ENGINE=InnoDB AUTO_INCREMENT=855 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='批次主表'; + +DROP TABLE IF EXISTS `gen_table`; +CREATE TABLE `gen_table` ( + `table_id` bigint NOT NULL COMMENT '编号', + `data_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '数据源名称', + `table_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '表名称', + `table_comment` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '表描述', + `sub_table_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '关联子表的表名', + `sub_table_fk_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '子表关联的外键名', + `class_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '实体类名称', + `tpl_category` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'crud' COMMENT '使用的模板(crud单表操作 tree树表操作)', + `package_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '生成包路径', + `module_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '生成模块名', + `business_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '生成业务名', + `function_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '生成功能名', + `function_author` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '生成功能作者', + `gen_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '生成代码方式(0zip压缩包 1自定义路径)', + `gen_path` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '/' COMMENT '生成路径(不填默认项目路径)', + `options` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '其它生成选项', + `created_dept` bigint DEFAULT NULL COMMENT '创建部门', + `created_by` bigint DEFAULT NULL COMMENT '创建者', + `created_at` datetime DEFAULT NULL COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`table_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='代码生成业务表'; + +DROP TABLE IF EXISTS `gen_table_column`; +CREATE TABLE `gen_table_column` ( + `column_id` bigint NOT NULL COMMENT '编号', + `table_id` bigint DEFAULT NULL COMMENT '归属表编号', + `column_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '列名称', + `column_comment` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '列描述', + `column_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '列类型', + `java_type` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'JAVA类型', + `java_field` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'JAVA字段名', + `is_pk` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '是否主键(1是)', + `is_increment` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '是否自增(1是)', + `is_required` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '是否必填(1是)', + `is_insert` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '是否为插入字段(1是)', + `is_edit` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '是否编辑字段(1是)', + `is_list` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '是否列表字段(1是)', + `is_query` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '是否查询字段(1是)', + `query_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'EQ' COMMENT '查询方式(等于、不等于、大于、小于、范围)', + `html_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '显示类型(文本框、文本域、下拉框、复选框、单选框、日期控件)', + `dict_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '字典类型', + `sort` int DEFAULT NULL COMMENT '排序', + `created_dept` bigint DEFAULT NULL COMMENT '创建部门', + `created_by` bigint DEFAULT NULL COMMENT '创建者', + `created_at` datetime DEFAULT NULL COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`column_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='代码生成业务表字段'; + +DROP TABLE IF EXISTS `sys_client`; +CREATE TABLE `sys_client` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', + `client_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '客户端id', + `client_key` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '客户端key', + `client_secret` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '客户端秘钥', + `grant_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '授权类型', + `device_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '设备类型', + `active_timeout` int DEFAULT '1800' COMMENT 'token活跃超时时间', + `timeout` int DEFAULT '604800' COMMENT 'token固定超时', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '状态(0正常 1停用)', + `created_dept` bigint DEFAULT NULL COMMENT '创建部门', + `created_by` bigint DEFAULT NULL COMMENT '创建者', + `created_at` datetime DEFAULT NULL COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime DEFAULT NULL COMMENT '更新时间', + `deleted_by` bigint DEFAULT NULL COMMENT '删除人', + `deleted_at` datetime DEFAULT NULL COMMENT '删除时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='系统授权表'; + +DROP TABLE IF EXISTS `sys_config`; +CREATE TABLE `sys_config` ( + `config_id` bigint NOT NULL AUTO_INCREMENT COMMENT '参数主键', + `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '000000' COMMENT '租户编号', + `config_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '参数名称', + `config_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '参数键名', + `config_value` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '参数键值', + `config_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'N' COMMENT '系统内置(Y是 N否)', + `created_dept` bigint DEFAULT NULL COMMENT '创建部门', + `created_by` bigint DEFAULT NULL COMMENT '创建者', + `created_at` datetime DEFAULT NULL COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`config_id`) +) ENGINE=InnoDB AUTO_INCREMENT=41 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='参数配置表'; + +DROP TABLE IF EXISTS `sys_dept`; +CREATE TABLE `sys_dept` ( + `dept_id` bigint NOT NULL AUTO_INCREMENT COMMENT '部门id', + `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '000000' COMMENT '租户编号', + `parent_id` bigint DEFAULT '0' COMMENT '父部门id', + `ancestors` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '祖级列表', + `dept_key` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '机构编号', + `dept_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '部门名称', + `dept_type` tinyint(1) DEFAULT '0' COMMENT '部门类型(0:部门 1:公司)', + `dept_category` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '部门类别编码', + `order_num` int DEFAULT '0' COMMENT '显示顺序', + `leader` bigint DEFAULT NULL COMMENT '负责人', + `phone` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '联系电话', + `email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '邮箱', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '部门状态(0正常 1停用)', + `credit_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '统一社会信用代码', + `area_code` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '行政区域代码', + `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '地址', + `dept_role` bigint DEFAULT NULL COMMENT '机构默认角色ID', + `created_dept` bigint DEFAULT NULL COMMENT '创建部门', + `created_by` bigint DEFAULT NULL COMMENT '创建者', + `created_at` datetime DEFAULT NULL COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime DEFAULT NULL COMMENT '更新时间', + `deleted_by` bigint DEFAULT NULL COMMENT '删除人', + `deleted_at` datetime DEFAULT NULL COMMENT '删除时间', + PRIMARY KEY (`dept_id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=171 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='部门表'; + +DROP TABLE IF EXISTS `sys_dict_data`; +CREATE TABLE `sys_dict_data` ( + `dict_code` bigint NOT NULL AUTO_INCREMENT COMMENT '字典编码', + `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '000000' COMMENT '租户编号', + `dict_sort` int DEFAULT '0' COMMENT '字典排序', + `dict_label` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '字典标签', + `dict_value` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '字典键值', + `dict_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '字典类型', + `css_class` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '样式属性(其他样式扩展)', + `list_class` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '表格回显样式', + `is_default` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'N' COMMENT '是否默认(Y是 N否)', + `created_dept` bigint DEFAULT NULL COMMENT '创建部门', + `created_by` bigint DEFAULT NULL COMMENT '创建者', + `created_at` datetime DEFAULT NULL COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`dict_code`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=495 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='字典数据表'; + +DROP TABLE IF EXISTS `sys_dict_type`; +CREATE TABLE `sys_dict_type` ( + `dict_id` bigint NOT NULL AUTO_INCREMENT COMMENT '字典主键', + `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '000000' COMMENT '租户编号', + `dict_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '字典名称', + `dict_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '字典类型', + `is_sys` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '1' COMMENT '是否系统(0是 1否)', + `created_dept` bigint DEFAULT NULL COMMENT '创建部门', + `created_by` bigint DEFAULT NULL COMMENT '创建者', + `created_at` datetime DEFAULT NULL COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`dict_id`) USING BTREE, + UNIQUE KEY `tenant_id` (`tenant_id`,`dict_type`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=107 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='字典类型表'; + +DROP TABLE IF EXISTS `sys_gen_table`; +CREATE TABLE `sys_gen_table` ( + `table_id` bigint NOT NULL AUTO_INCREMENT COMMENT '生成ID', + `gen_type` int unsigned NOT NULL COMMENT '生成类型', + `gen_template` int DEFAULT '0' COMMENT '生成模板', + `var_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '实体命名', + `options` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '配置选项', + `db_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '数据库名称', + `table_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主表名称', + `table_comment` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '主表注释', + `dao_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '主表dao模型', + `master_columns` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '主表字段', + `addon_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '插件名称', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '生成状态(0成功 1未开始)', + `created_dept` bigint DEFAULT NULL COMMENT '创建部门', + `created_by` bigint DEFAULT NULL COMMENT '创建者', + `created_at` datetime DEFAULT NULL COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`table_id`), + CONSTRAINT `sys_gen_table_chk_1` CHECK (json_valid(`options`)), + CONSTRAINT `sys_gen_table_chk_2` CHECK (json_valid(`master_columns`)) +) ENGINE=InnoDB AUTO_INCREMENT=55 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='代码生成业务表'; + +DROP TABLE IF EXISTS `sys_job`; +CREATE TABLE `sys_job` ( + `job_id` bigint NOT NULL AUTO_INCREMENT COMMENT '任务ID', + `job_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '任务名称', + `job_params` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '参数', + `job_group` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'DEFAULT' COMMENT '任务组名', + `invoke_target` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '调用目标字符串', + `cron_expression` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'cron执行表达式', + `misfire_policy` tinyint DEFAULT '1' COMMENT '计划执行策略(1多次执行 2执行一次)', + `concurrent` tinyint DEFAULT '1' COMMENT '是否并发执行(0允许 1禁止)', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '1' COMMENT '状态(0正常 1暂停)', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '备注信息', + `created_dept` bigint DEFAULT NULL COMMENT '创建部门', + `created_by` bigint DEFAULT NULL COMMENT '创建者', + `created_at` datetime DEFAULT NULL COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime DEFAULT NULL COMMENT '更新时间', + `deleted_by` bigint DEFAULT NULL COMMENT '删除人', + `deleted_at` datetime DEFAULT NULL COMMENT '删除时间', + PRIMARY KEY (`job_id`,`job_name`,`job_group`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=25 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='定时任务调度表'; + +DROP TABLE IF EXISTS `sys_logininfor`; +CREATE TABLE `sys_logininfor` ( + `info_id` bigint NOT NULL AUTO_INCREMENT COMMENT '访问ID', + `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '000000' COMMENT '租户编号', + `user_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '用户账号', + `client_key` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '客户端', + `device_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '设备类型', + `ipaddr` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '登录IP地址', + `login_location` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '登录地点', + `browser` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '浏览器类型', + `os` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '操作系统', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '登录状态(0成功 1失败)', + `msg` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '提示消息', + `login_time` datetime DEFAULT NULL COMMENT '访问时间', + PRIMARY KEY (`info_id`), + KEY `idx_sys_logininfor_s` (`status`), + KEY `idx_sys_logininfor_lt` (`login_time`) +) ENGINE=InnoDB AUTO_INCREMENT=671 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='系统访问记录'; + +DROP TABLE IF EXISTS `sys_menu`; +CREATE TABLE `sys_menu` ( + `menu_id` bigint NOT NULL AUTO_INCREMENT COMMENT '菜单ID', + `menu_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '菜单名称', + `parent_id` bigint DEFAULT '0' COMMENT '父菜单ID', + `level` int DEFAULT '1' COMMENT '关系树等级', + `tree` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '关系树', + `order_num` int DEFAULT '0' COMMENT '显示顺序', + `path` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '路由地址', + `component` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '组件路径', + `query_param` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '路由参数', + `is_frame` int DEFAULT '1' COMMENT '是否为外链(0是 1否)', + `is_cache` int DEFAULT '0' COMMENT '是否缓存(0缓存 1不缓存)', + `menu_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '菜单类型(M目录 C菜单 F按钮)', + `visible` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '显示状态(0显示 1隐藏)', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '菜单状态(0正常 1停用)', + `perms` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '权限标识', + `icon` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '#' COMMENT '菜单图标', + `created_dept` bigint DEFAULT NULL COMMENT '创建部门', + `created_by` bigint DEFAULT NULL COMMENT '创建者', + `created_at` datetime DEFAULT NULL COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '备注', + PRIMARY KEY (`menu_id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=2115 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='菜单权限表'; + +DROP TABLE IF EXISTS `sys_notice`; +CREATE TABLE `sys_notice` ( + `notice_id` bigint NOT NULL AUTO_INCREMENT COMMENT '公告ID', + `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '000000' COMMENT '租户编号', + `notice_title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '公告标题', + `notice_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '公告类型(1通知 2公告)', + `notice_content` longblob COMMENT '公告内容', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '公告状态(0正常 1关闭)', + `notice_range` tinyint(1) NOT NULL DEFAULT '1' COMMENT '通知范围(1全员 2指定机构 3指定用户)', + `dept_ids` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '通知机构ID列表JSON', + `user_ids` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '通知用户ID列表JSON', + `created_dept` bigint DEFAULT NULL COMMENT '创建部门', + `created_by` bigint DEFAULT NULL COMMENT '创建者', + `created_at` datetime DEFAULT NULL COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime DEFAULT NULL COMMENT '更新时间', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`notice_id`) +) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='通知公告表'; + +DROP TABLE IF EXISTS `sys_oper_log`; +CREATE TABLE `sys_oper_log` ( + `oper_id` bigint NOT NULL AUTO_INCREMENT COMMENT '日志主键', + `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '000000' COMMENT '租户编号', + `title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '模块标题', + `business_type` int DEFAULT '0' COMMENT '业务类型(0其它 1新增 2修改 3删除)', + `method` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '方法名称', + `request_method` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '请求方式', + `operator_type` int DEFAULT '0' COMMENT '操作类别(0其它 1后台用户 2手机端用户)', + `oper_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '操作人员', + `dept_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '部门名称', + `oper_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '请求URL', + `oper_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '主机地址', + `oper_location` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '操作地点', + `oper_param` varchar(4000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '请求参数', + `json_result` varchar(4000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '返回参数', + `status` int DEFAULT '0' COMMENT '操作状态(0正常 1异常)', + `error_msg` varchar(4000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '错误消息', + `oper_time` datetime DEFAULT NULL COMMENT '操作时间', + `cost_time` bigint DEFAULT '0' COMMENT '消耗时间', + PRIMARY KEY (`oper_id`), + KEY `idx_sys_oper_log_bt` (`business_type`), + KEY `idx_sys_oper_log_s` (`status`), + KEY `idx_sys_oper_log_ot` (`oper_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='操作日志记录'; + +DROP TABLE IF EXISTS `sys_oss`; +CREATE TABLE `sys_oss` ( + `oss_id` bigint NOT NULL AUTO_INCREMENT COMMENT '对象存储主键', + `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '000000' COMMENT '租户编号', + `file_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '文件名', + `original_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '原名', + `file_suffix` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '文件后缀名', + `path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '存储路径', + `url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'URL地址', + `created_dept` bigint DEFAULT NULL COMMENT '创建部门', + `created_at` datetime DEFAULT NULL COMMENT '创建时间', + `created_by` bigint DEFAULT NULL COMMENT '创建者', + `updated_at` datetime DEFAULT NULL COMMENT '更新时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `service` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'minio' COMMENT '服务商', + `md5` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '文件MD5', + `file_size` int DEFAULT NULL COMMENT '文件大小', + `file_crc16` int DEFAULT NULL COMMENT '文件Crc16', + `file_sum` int DEFAULT NULL COMMENT '文件校验和', + PRIMARY KEY (`oss_id`) +) ENGINE=InnoDB AUTO_INCREMENT=861 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='OSS对象存储表'; + +DROP TABLE IF EXISTS `sys_oss_config`; +CREATE TABLE `sys_oss_config` ( + `oss_config_id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', + `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '000000' COMMENT '租户编号', + `config_key` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '配置key', + `access_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'accessKey', + `secret_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '秘钥', + `bucket_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '桶名称', + `prefix` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '前缀', + `endpoint` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '访问站点', + `domain` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '自定义域名', + `is_https` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'N' COMMENT '是否https(Y=是,N=否)', + `region` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '域', + `access_policy` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '1' COMMENT '桶权限类型(0=private 1=public 2=custom)', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '1' COMMENT '是否默认(0=是,1=否)', + `ext1` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '扩展字段', + `created_dept` bigint DEFAULT NULL COMMENT '创建部门', + `created_by` bigint DEFAULT NULL COMMENT '创建者', + `created_at` datetime DEFAULT NULL COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`oss_config_id`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='对象存储配置表'; + +DROP TABLE IF EXISTS `sys_post`; +CREATE TABLE `sys_post` ( + `post_id` bigint NOT NULL AUTO_INCREMENT COMMENT '岗位ID', + `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '000000' COMMENT '租户编号', + `dept_id` bigint NOT NULL COMMENT '部门id', + `post_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '岗位编码', + `post_category` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '岗位类别编码', + `post_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '岗位名称', + `post_sort` int NOT NULL COMMENT '显示顺序', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '状态(0正常 1停用)', + `created_dept` bigint DEFAULT NULL COMMENT '创建部门', + `created_by` bigint DEFAULT NULL COMMENT '创建者', + `created_at` datetime DEFAULT NULL COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime DEFAULT NULL COMMENT '更新时间', + `deleted_by` bigint DEFAULT NULL COMMENT '删除人', + `deleted_at` datetime DEFAULT NULL COMMENT '删除时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`post_id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='岗位信息表'; + +DROP TABLE IF EXISTS `sys_role`; +CREATE TABLE `sys_role` ( + `role_id` bigint NOT NULL AUTO_INCREMENT COMMENT '角色ID', + `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '000000' COMMENT '租户编号', + `dept_id` bigint NOT NULL DEFAULT '0' COMMENT '部门机构id', + `role_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '角色名称', + `role_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '角色权限字符串', + `role_sort` int NOT NULL COMMENT '显示顺序', + `data_scope` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '1' COMMENT '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限 5:仅本人数据权限 6:仅本人数据权限 7:本组织及下一级数据权限 ', + `menu_check_strictly` tinyint(1) DEFAULT '1' COMMENT '菜单树选择项是否关联显示', + `dept_check_strictly` tinyint(1) DEFAULT '1' COMMENT '部门树选择项是否关联显示', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '角色状态(0正常 1停用)', + `is_pass` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否传递数据权限(0:传递 1:不传递)', + `created_dept` bigint DEFAULT NULL COMMENT '创建部门', + `created_by` bigint DEFAULT NULL COMMENT '创建者', + `created_at` datetime DEFAULT NULL COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime DEFAULT NULL COMMENT '更新时间', + `deleted_by` bigint DEFAULT NULL COMMENT '删除人', + `deleted_at` datetime DEFAULT NULL COMMENT '删除时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`role_id`) +) ENGINE=InnoDB AUTO_INCREMENT=81 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='角色信息表'; + +DROP TABLE IF EXISTS `sys_role_dept`; +CREATE TABLE `sys_role_dept` ( + `tenant_id` varchar(20) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '000000' COMMENT '租户编号', + `role_id` bigint NOT NULL COMMENT '角色ID', + `dept_id` bigint NOT NULL COMMENT '部门ID', + PRIMARY KEY (`tenant_id`,`role_id`,`dept_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='角色和部门关联表'; + +DROP TABLE IF EXISTS `sys_role_menu`; +CREATE TABLE `sys_role_menu` ( + `tenant_id` varchar(20) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '000000' COMMENT '租户编号', + `role_id` bigint NOT NULL COMMENT '角色ID', + `menu_id` bigint NOT NULL COMMENT '菜单ID', + `data_scope` char(1) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '数据范围(0按角色数据权限 1全部数据权限 3本部门数据权限 4本部门及以下数据权限 5仅本人数据权限 6本部门及以下或本人数据权限 7本组织及本组织下一级数据权限 8本组织下一级数据权限)', + PRIMARY KEY (`tenant_id`,`role_id`,`menu_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='角色和菜单关联表'; + +DROP TABLE IF EXISTS `sys_social`; +CREATE TABLE `sys_social` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', + `user_id` bigint NOT NULL COMMENT '用户ID', + `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '000000' COMMENT '租户id', + `auth_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '平台+平台唯一id', + `source` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户来源', + `open_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '平台编号唯一id', + `user_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '登录账号', + `nick_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '用户昵称', + `email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '用户邮箱', + `avatar` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '头像地址', + `access_token` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户的授权令牌', + `expire_in` int DEFAULT NULL COMMENT '用户的授权令牌的有效期,部分平台可能没有', + `refresh_token` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '刷新令牌,部分平台可能没有', + `access_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '平台的授权信息,部分平台可能没有', + `union_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户的 unionid', + `scope` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '授予的权限,部分平台可能没有', + `token_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '个别平台的授权信息,部分平台可能没有', + `id_token` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'id token,部分平台可能没有', + `mac_algorithm` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '小米平台用户的附带属性,部分平台可能没有', + `mac_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '小米平台用户的附带属性,部分平台可能没有', + `code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户的授权code,部分平台可能没有', + `oauth_token` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'Twitter平台用户的附带属性,部分平台可能没有', + `oauth_token_secret` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'Twitter平台用户的附带属性,部分平台可能没有', + `created_dept` bigint DEFAULT NULL COMMENT '创建部门', + `created_by` bigint DEFAULT NULL COMMENT '创建者', + `created_at` datetime DEFAULT NULL COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime DEFAULT NULL COMMENT '更新时间', + `deleted_by` bigint DEFAULT NULL COMMENT '删除人', + `deleted_at` datetime DEFAULT NULL COMMENT '删除时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='社会化关系表'; + +DROP TABLE IF EXISTS `sys_tenant`; +CREATE TABLE `sys_tenant` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', + `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户编号', + `contact_user_name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '联系人', + `contact_phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '联系电话', + `company_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '企业名称', + `license_number` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '统一社会信用代码', + `address` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '地址', + `intro` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '企业简介', + `domain` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '域名', + `remark` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `package_id` bigint DEFAULT NULL COMMENT '租户套餐编号', + `admin_role_id` bigint DEFAULT NULL COMMENT '管理员角色ID', + `admin_dept_id` bigint DEFAULT NULL COMMENT '管理员部门ID', + `admin_user_id` bigint DEFAULT NULL COMMENT '管理员用户ID', + `expire_time` datetime DEFAULT NULL COMMENT '过期时间', + `account_count` int DEFAULT '-1' COMMENT '用户数量(-1不限制)', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '租户状态(0正常 1停用)', + `created_dept` bigint DEFAULT NULL COMMENT '创建部门', + `created_by` bigint DEFAULT NULL COMMENT '创建者', + `created_at` datetime DEFAULT NULL COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime DEFAULT NULL COMMENT '更新时间', + `deleted_by` bigint DEFAULT NULL COMMENT '删除人', + `deleted_at` datetime DEFAULT NULL COMMENT '删除时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='租户表'; + +DROP TABLE IF EXISTS `sys_tenant_package`; +CREATE TABLE `sys_tenant_package` ( + `package_id` bigint NOT NULL AUTO_INCREMENT COMMENT '租户套餐id', + `package_name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '套餐名称', + `menu_ids` varchar(3000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '关联菜单id', + `remark` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `menu_check_strictly` tinyint(1) DEFAULT '1' COMMENT '菜单树选择项是否关联显示', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '状态(0正常 1停用)', + `created_dept` bigint DEFAULT NULL COMMENT '创建部门', + `created_by` bigint DEFAULT NULL COMMENT '创建者', + `created_at` datetime DEFAULT NULL COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime DEFAULT NULL COMMENT '更新时间', + `deleted_by` bigint DEFAULT NULL COMMENT '删除人', + `deleted_at` datetime DEFAULT NULL COMMENT '删除时间', + PRIMARY KEY (`package_id`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='租户套餐表'; + +DROP TABLE IF EXISTS `sys_user`; +CREATE TABLE `sys_user` ( + `user_id` bigint NOT NULL AUTO_INCREMENT COMMENT '用户ID', + `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '000000' COMMENT '租户编号', + `dept_id` bigint DEFAULT NULL COMMENT '部门ID', + `user_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户账号', + `nick_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户昵称', + `user_type` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'sys_user' COMMENT '用户类型(sys_user系统用户)', + `email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '用户邮箱', + `phonenumber` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '手机号码', + `sex` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '用户性别(0男 1女 2未知)', + `avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '头像地址', + `salt` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '加密盐', + `password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '密码', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '帐号状态(0正常 1停用)', + `login_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '最后登录IP', + `login_date` datetime DEFAULT NULL COMMENT '最后登录时间', + `mfa_enabled` tinyint(1) DEFAULT NULL COMMENT '是否开启邮箱MFA 0否 1是', + `created_dept` bigint DEFAULT NULL COMMENT '创建部门', + `created_by` bigint DEFAULT NULL COMMENT '创建者', + `created_at` datetime DEFAULT NULL COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime DEFAULT NULL COMMENT '更新时间', + `deleted_by` bigint DEFAULT NULL COMMENT '删除人', + `deleted_at` datetime DEFAULT NULL COMMENT '删除时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`user_id`), + UNIQUE KEY `uk_user_name` (`tenant_id`,`user_name`) +) ENGINE=InnoDB AUTO_INCREMENT=128 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户信息表'; + +DROP TABLE IF EXISTS `sys_user_online`; +CREATE TABLE `sys_user_online` ( + `online_id` bigint NOT NULL AUTO_INCREMENT COMMENT '访问ID', + `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '000000' COMMENT '租户编号', + `uuid` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'UUID', + `user_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '用户账号', + `client_key` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '客户端', + `device_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '设备类型', + `ipaddr` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '登录IP地址', + `login_location` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '登录地点', + `browser` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '浏览器类型', + `os` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '操作系统', + `token` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT 'Token', + `login_time` datetime DEFAULT NULL COMMENT '访问时间', + `expire_time` datetime DEFAULT NULL COMMENT '过期时间', + `deleted_at` datetime DEFAULT NULL COMMENT '删除时间', + PRIMARY KEY (`online_id`) +) ENGINE=InnoDB AUTO_INCREMENT=671 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户在线列表'; + +DROP TABLE IF EXISTS `sys_user_post`; +CREATE TABLE `sys_user_post` ( + `tenant_id` varchar(20) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '000000' COMMENT '租户编号', + `user_id` bigint NOT NULL COMMENT '用户ID', + `post_id` bigint NOT NULL COMMENT '岗位ID', + PRIMARY KEY (`tenant_id`,`user_id`,`post_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户与岗位关联表'; + +DROP TABLE IF EXISTS `sys_user_role`; +CREATE TABLE `sys_user_role` ( + `tenant_id` varchar(20) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '000000' COMMENT '租户编号', + `user_id` bigint NOT NULL COMMENT '用户ID', + `role_id` bigint NOT NULL COMMENT '角色ID', + PRIMARY KEY (`tenant_id`,`user_id`,`role_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户和角色关联表'; + +DROP TABLE IF EXISTS `t_agent_balance`; +CREATE TABLE `t_agent_balance` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '账户ID', + `dept_id` bigint NOT NULL COMMENT '机构ID', + `balance` decimal(15,2) DEFAULT '0.00' COMMENT '账户余额', + `withdraw_amount` decimal(15,2) DEFAULT '0.00' COMMENT '可提现金额', + `withdraw_amount_status` tinyint(1) DEFAULT '1' COMMENT '可提现金额状态: 0-正常,1-冻结', + `invoice_amount` decimal(15,2) DEFAULT '0.00' COMMENT '已开票金额', + `can_invoice_amount` decimal(15,2) DEFAULT '0.00' COMMENT '可开票金额', + `credit_limit` decimal(15,2) DEFAULT '0.00' COMMENT '信用额度', + `used_credit` decimal(15,2) DEFAULT '0.00' COMMENT '已使用信用额度', + `pending_repayment` decimal(15,2) DEFAULT '0.00' COMMENT '待还款金额', + `status` tinyint(1) DEFAULT '1' COMMENT '状态: 0-正常, 1-禁用', + `tenant_id` varchar(20) COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门', + `created_by` bigint NOT NULL COMMENT '创建者', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `idx_customer_status` (`status`) +) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='企业客户财务信息'; + +DROP TABLE IF EXISTS `t_agent_enterprise`; +CREATE TABLE `t_agent_enterprise` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `dept_id` bigint NOT NULL COMMENT '部门机构id', + `full_name` varchar(255) COLLATE utf8mb4_general_ci NOT NULL COMMENT '单位全称', + `industry` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '行业', + `legal_person_name` varchar(50) COLLATE utf8mb4_general_ci NOT NULL COMMENT '法人名称', + `legal_person_id_card` varchar(18) COLLATE utf8mb4_general_ci NOT NULL COMMENT '法人身份证号', + `company_type` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '单位类型', + `establish_time` date DEFAULT NULL COMMENT '单位成立时间', + `bank_name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '开户行名称', + `bank_account` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '开户行账号', + `tenant_id` varchar(20) COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门', + `created_by` bigint NOT NULL COMMENT '创建者', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_legal_id_card` (`legal_person_id_card`), + KEY `idx_dept_id` (`dept_id`), + KEY `idx_company_type` (`company_type`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='企业客户单位信息'; + +DROP TABLE IF EXISTS `t_api`; +CREATE TABLE `t_api` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ID', + `app_key` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'APPKey', + `app_secret` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'APPSecret', + `rate_limit_period` int NOT NULL COMMENT '限流周期(秒,0:不限流)', + `rate_limit_count` int NOT NULL COMMENT '限流次数', + `dept_id` bigint NOT NULL COMMENT '所属机构', + `group_id` bigint DEFAULT NULL COMMENT '开放接口权限组ID', + `status` tinyint NOT NULL DEFAULT '0' COMMENT '状态:0启用,1停用', + `tenant_id` varchar(20) COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门', + `created_by` bigint NOT NULL COMMENT '创建者', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `app_key` (`app_key`), + KEY `tenant_id` (`tenant_id`), + KEY `idx_t_api_group_id` (`group_id`) USING BTREE, + KEY `idx_t_api_status` (`status`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='API集成'; + +DROP TABLE IF EXISTS `t_api_group`; +CREATE TABLE `t_api_group` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `group_name` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '权限组名称', + `group_code` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '权限组编码', + `status` tinyint NOT NULL DEFAULT '0' COMMENT '状态:0启用,1停用', + `remark` varchar(500) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `tenant_id` varchar(20) COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门', + `created_by` bigint NOT NULL COMMENT '创建者', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `uk_api_group_code` (`tenant_id`,`group_code`) USING BTREE, + KEY `idx_api_group_status` (`status`) USING BTREE, + KEY `idx_api_group_tenant_id` (`tenant_id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='开放接口权限组表'; + +DROP TABLE IF EXISTS `t_api_group_resource`; +CREATE TABLE `t_api_group_resource` ( + `group_id` bigint NOT NULL COMMENT '权限组ID,对应t_api_group.id', + `api_id` bigint NOT NULL COMMENT '开放接口资源ID,对应t_api_resource.id', + PRIMARY KEY (`group_id`,`api_id`) USING BTREE, + KEY `idx_api_group_resource_api_id` (`api_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='开放接口权限组资源关联表'; + +DROP TABLE IF EXISTS `t_api_resource`; +CREATE TABLE `t_api_resource` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `api_name` varchar(100) COLLATE utf8mb4_general_ci NOT NULL COMMENT '接口名称', + `api_code` varchar(100) COLLATE utf8mb4_general_ci NOT NULL COMMENT '接口权限标识', + `method` tinyint NOT NULL COMMENT '请求方法:1:POST,2:PUT,3:DELETE,4:GET', + `path` varchar(255) COLLATE utf8mb4_general_ci NOT NULL COMMENT '接口路径', + `status` tinyint NOT NULL DEFAULT '0' COMMENT '状态:0启用,1停用', + `version` varchar(255) COLLATE utf8mb4_general_ci NOT NULL COMMENT '接口版本', + `remark` varchar(500) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `tenant_id` varchar(20) COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门', + `created_by` bigint NOT NULL COMMENT '创建者', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `uk_api_resource_code` (`api_code`) USING BTREE, + UNIQUE KEY `uk_api_resource_method_path` (`method`,`path`) USING BTREE, + KEY `idx_api_resource_status` (`status`) USING BTREE, + KEY `idx_api_resource_tenant_id` (`tenant_id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='开放接口资源表'; + +DROP TABLE IF EXISTS `t_balance_detail`; +CREATE TABLE `t_balance_detail` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '明细ID', + `dept_id` bigint NOT NULL COMMENT '账户ID', + `serial_no` varchar(64) NOT NULL COMMENT '流水号', + `transaction_time` datetime NOT NULL COMMENT '交易时间', + `income_expense_type` tinyint(1) NOT NULL COMMENT '收支类型: 0收入,1支出', + `transaction_type` tinyint(1) NOT NULL COMMENT '交易类型:0充值 1消费 2转可提现 3可提现转入 4人工调整', + `transaction_channel` tinyint(1) DEFAULT NULL COMMENT '交易渠道:1支付宝 2微信 3可提现金额', + `transaction_status` tinyint DEFAULT '1' COMMENT '交易状态:0待支付、1已支付、2已过期、3交易失败', + `amount` decimal(15,2) NOT NULL COMMENT '交易金额', + `before_balance` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '变动前余额', + `balance_after` decimal(15,2) NOT NULL DEFAULT '0.00' COMMENT '变动后余额', + `channel_serial_no` varchar(100) DEFAULT NULL COMMENT '交易渠道流水号', + `order_sn` varchar(100) DEFAULT NULL COMMENT '关联订单号', + `remark` varchar(500) DEFAULT NULL COMMENT '备注', + `tenant_id` varchar(20) NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门', + `created_by` bigint NOT NULL COMMENT '创建者', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `idx_transaction_type` (`transaction_type`), + KEY `idx_created_at` (`created_at`), + KEY `idx_serial_no` (`serial_no`) +) ENGINE=InnoDB AUTO_INCREMENT=44 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='余额明细表'; + +DROP TABLE IF EXISTS `t_brand`; +CREATE TABLE `t_brand` ( + `brand_id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增id号', + `brand_name` varchar(60) NOT NULL DEFAULT '' COMMENT '品牌名称', + `brand_logo` varchar(120) DEFAULT '' COMMENT '上传的该公司Logo图片', + `brand_desc` text COMMENT '品牌描述', + `site_url` varchar(255) NOT NULL DEFAULT '' COMMENT '品牌的网址', + `sort_order` tinyint unsigned NOT NULL DEFAULT '50' COMMENT '品牌在前台页面的显示顺序,数字越大越靠后', + `is_show` tinyint unsigned NOT NULL DEFAULT '1' COMMENT '该品牌是否显示 枚举', + `brand_type` varchar(80) DEFAULT '' COMMENT '品牌分类', + `brand_is_hot` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '是否热销品牌 枚举:yesno_enum', + `first_word` varchar(11) DEFAULT '' COMMENT '首字母', + `brand_en_name` varchar(80) DEFAULT '' COMMENT '品牌英文名', + `status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '状态 枚举sys_status', + `tenant_id` varchar(20) NOT NULL, + `created_dept` bigint NOT NULL, + `created_by` bigint NOT NULL, + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_by` bigint DEFAULT NULL, + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`brand_id`) USING BTREE, + KEY `is_show` (`is_show`) USING BTREE, + KEY `first_word` (`first_word`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='商品品牌表'; + +DROP TABLE IF EXISTS `t_category`; +CREATE TABLE `t_category` ( + `category_id` bigint NOT NULL AUTO_INCREMENT COMMENT '分类ID', + `category_name` varchar(90) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '分类名称', + `short_name` varchar(80) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '分类短名', + `level` tinyint NOT NULL DEFAULT '1' COMMENT '层级深度:1-一级 2-二级 3-三级...', + `keywords` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '分类关键字(搜索用)', + `search_keywords` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '搜索关键字', + `category_desc` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '分类描述', + `parent_id` bigint NOT NULL DEFAULT '0' COMMENT '父分类ID(0=顶级分类)', + `sort_order` smallint unsigned NOT NULL DEFAULT '50' COMMENT '排序序号(数字越大越靠后)', + `measure_unit` varchar(15) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '计量单位', + `is_show` tinyint unsigned NOT NULL DEFAULT '1' COMMENT '是否前台显示 枚举', + `is_hot` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '是否热门 枚举:yesno_enum', + `seo_title` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'SEO标题', + `category_pic` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '分类图片', + `category_ico` varchar(80) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '分类图标', + `tenant_id` varchar(20) COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门ID', + `created_by` bigint NOT NULL COMMENT '创建者ID', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者ID', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`category_id`), + KEY `idx_parent_id` (`parent_id`), + KEY `idx_is_show` (`is_show`), + KEY `idx_sort_order` (`sort_order`), + KEY `idx_is_hot` (`is_hot`), + KEY `idx_tenant_id` (`tenant_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='商品分类表'; + +DROP TABLE IF EXISTS `t_consume_account_month_bill`; +CREATE TABLE `t_consume_account_month_bill` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '账单ID', + `dept_id` bigint NOT NULL COMMENT '机构ID', + `account_period` varchar(7) COLLATE utf8mb4_general_ci NOT NULL COMMENT '账期YYYY-MM', + `opening_balance` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '月初余额', + `recharge_income` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '充值收入', + `withdrawable_transfer_in_income` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '可提现转入收入', + `manual_adjust_income` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '人工调账收入', + `refund_income` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '退款收入', + `consume_expense` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '平台消费支出', + `balance_transfer_out_expense` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '转可提现支出', + `manual_adjust_expense` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '人工调账支出', + `consume_credit_repay_expense` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '消费账户还款支出', + `total_income` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '本月收入总额', + `total_expense` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '本月支出总额', + `closing_balance` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '月末余额(月初余额+本月收入-本月支出)', + `income_count` int NOT NULL DEFAULT '0' COMMENT '收入笔数', + `expense_count` int NOT NULL DEFAULT '0' COMMENT '支出笔数', + `credit_used` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '本月使用信用额度', + `credit_repaid` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '本月还款信用额度', + `bill_status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '账单状态:1正常,2已调整,3已作废', + `settle_time` datetime DEFAULT NULL COMMENT '结算时间', + `remark` varchar(500) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `tenant_id` varchar(20) COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门', + `created_by` bigint NOT NULL COMMENT '创建者', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_bill_consume_dept_period` (`dept_id`,`account_period`), + KEY `idx_bill_consume_period` (`account_period`), + KEY `idx_bill_consume_dept` (`dept_id`), + KEY `idx_bill_consume_status` (`bill_status`) +) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='消费账户月账单表'; + +DROP TABLE IF EXISTS `t_credit_detail`; +CREATE TABLE `t_credit_detail` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '明细ID', + `dept_id` bigint NOT NULL COMMENT '组织机构ID', + `account_period` varchar(7) NOT NULL COMMENT '账期(YYYY-MM)', + `transaction_type` varchar(50) NOT NULL COMMENT '交易类型: 使用/还款', + `amount` decimal(15,2) NOT NULL COMMENT '金额', + `credit_balance_before` decimal(18,2) DEFAULT NULL COMMENT '变动前信用额度余额', + `credit_balance_after` decimal(18,2) DEFAULT NULL COMMENT '变动后信用额度余额', + `related_order_sn` varchar(100) DEFAULT NULL COMMENT '关联订单号', + `repayment_method` tinyint(1) DEFAULT NULL COMMENT '还款方式: 0 余额 1 银行卡 2 支付宝 3 微信', + `repayment_channel_serial` varchar(100) DEFAULT NULL COMMENT '交易渠道流水号', + `transaction_time` datetime DEFAULT NULL COMMENT '交易时间', + `remark` varchar(500) DEFAULT NULL COMMENT '备注', + `tenant_id` varchar(20) NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门', + `created_by` bigint NOT NULL COMMENT '创建者', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `idx_account_month` (`dept_id`,`account_period`), + KEY `idx_created_at` (`created_at`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='信用额度明细表'; + +DROP TABLE IF EXISTS `t_cust_withdraw_account`; +CREATE TABLE `t_cust_withdraw_account` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `dept_id` mediumint unsigned NOT NULL DEFAULT '0' COMMENT '企业客户ID', + `account_type` tinyint unsigned NOT NULL DEFAULT '1' COMMENT '提现账号类型,1:支付宝,2:微信', + `account_no` text NOT NULL COMMENT '账号', + `account_name` varchar(128) NOT NULL COMMENT '账户名称/真实姓名', + `mobile` varchar(20) DEFAULT NULL COMMENT '手机号', + `is_default` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否默认账号:0-否 1-是', + `enabled` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否启用:0-未启用 1-启用', + `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态:0-禁用 1-正常', + `tenant_id` varchar(20) NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门ID', + `created_by` bigint NOT NULL COMMENT '创建者ID', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者ID', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `idx_tenant_dept` (`tenant_id`,`dept_id`), + KEY `idx_account_type` (`account_type`), + KEY `idx_mobile` (`mobile`), + KEY `idx_created_at` (`created_at`) +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='客户提现账户表'; + +DROP TABLE IF EXISTS `t_dept_flow_daily`; +CREATE TABLE `t_dept_flow_daily` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增主键', + `dept_id` bigint NOT NULL COMMENT '渠道客户ID', + `stat_date` date NOT NULL COMMENT '统计日期', + `total_used_flow_mb` decimal(18,3) NOT NULL DEFAULT '0.000' COMMENT '当日所有卡总消耗流量GB', + `total_sms` int NOT NULL DEFAULT '0' COMMENT '当日总短信使用条数', + `total_voice_min` int NOT NULL DEFAULT '0' COMMENT '当日总语音分钟数', + `remark` varchar(500) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注,同步失败原因/特殊说明', + `tenant_id` varchar(20) COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门', + `created_by` bigint NOT NULL COMMENT '创建者', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_tenant_dept_date_package` (`tenant_id`,`dept_id`,`stat_date`), + KEY `idx_dept_date` (`dept_id`,`stat_date`), + KEY `idx_tenant_date` (`tenant_id`,`stat_date`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='渠道客户每日流量汇总统计表'; + +DROP TABLE IF EXISTS `t_division_code`; +CREATE TABLE `t_division_code` ( + `region_id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ID', + `region_code` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '行政区域代码', + `region_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '行政区域名称', + `region_level` tinyint(1) NOT NULL COMMENT '等级', + `region_parent` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '上级代码', + `region_type` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '城乡分类代码', + PRIMARY KEY (`region_id`) USING BTREE, + KEY `idx_region_code` (`region_code`) USING BTREE, + KEY `idx_region_parent` (`region_parent`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=664243 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='村级行政区划表'; + +DROP TABLE IF EXISTS `t_fin_commission_detail`; +CREATE TABLE `t_fin_commission_detail` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `commission_no` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '分润明细编号', + `order_sn` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '订单编号', + `order_type` varchar(1) COLLATE utf8mb4_general_ci NOT NULL COMMENT '订单类型', + `product_id` bigint NOT NULL DEFAULT '0' COMMENT '商品ID', + `payer_dept_id` bigint NOT NULL COMMENT '下级机构ID', + `benefit_dept_id` bigint NOT NULL COMMENT '受益机构ID', + `benefit_dept_level` int DEFAULT NULL COMMENT '受益机构层级', + `commission_amount` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '分润金额', + `commission_status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '分润状态:0待结算,1可提现', + `benefit_snapshot` json DEFAULT NULL COMMENT '价格快照(受益机构的成本价+利润+利润悉数=出货单价)', + `account_period` varchar(7) COLLATE utf8mb4_general_ci NOT NULL COMMENT '账期(YYYY-MM)', + `settlement_time` datetime DEFAULT NULL COMMENT '结算时间', + `tenant_id` varchar(20) COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门', + `created_by` bigint NOT NULL COMMENT '创建者', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_commission_no` (`commission_no`), + KEY `idx_commission_business` (`order_sn`), + KEY `idx_commission_payer` (`payer_dept_id`), + KEY `idx_commission_benefit` (`benefit_dept_id`), + KEY `idx_commission_status` (`commission_status`), + KEY `idx_commission_created_at` (`created_at`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='分润明细表'; + +DROP TABLE IF EXISTS `t_fin_withdrawable_change`; +CREATE TABLE `t_fin_withdrawable_change` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `dept_id` bigint NOT NULL COMMENT '机构ID', + `change_type` tinyint(1) NOT NULL COMMENT '变动类型:0分润,1提现,2转出(可提现转余额)3转入(余额转可提现)4还款', + `income_expense_type` tinyint(1) NOT NULL COMMENT '收支类型: 0收入,1支出', + `change_amount` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '变动金额', + `before_balance` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '变动前可提现余额', + `after_balance` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '变动后可提现余额', + `account_type` tinyint(1) NOT NULL COMMENT '提现账号类型,1:银行卡,2:支付宝,3:微信', + `bank_name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '开户行名称', + `bank_account` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '开户行账号或账号', + `account_name` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户姓名', + `identity_card` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户身份证号', + `source_no` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '来源单号', + `remark` varchar(500) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `account_period` varchar(7) COLLATE utf8mb4_general_ci NOT NULL COMMENT '账期(YYYY-MM)', + `tenant_id` varchar(20) COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门', + `created_by` bigint NOT NULL COMMENT '创建者', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `idx_withdrawable_change_dept` (`dept_id`), + KEY `idx_withdrawable_change_type` (`change_type`), + KEY `idx_withdrawable_change_source` (`source_no`), + KEY `idx_withdrawable_change_created_at` (`created_at`) +) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='可提现变动明细表'; + +DROP TABLE IF EXISTS `t_finance_apply`; +CREATE TABLE `t_finance_apply` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `apply_no` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '申请单号', + `apply_type` tinyint(1) NOT NULL COMMENT '申请类型(1:提现申请,2:余额转提现)', + `audit_type` tinyint(1) NOT NULL DEFAULT '1' COMMENT '审核类型:1初审,2复审', + `apply_dept_id` bigint NOT NULL COMMENT '申请机构ID', + `audit_dept_id` bigint NOT NULL COMMENT '审核方机构ID,通常为直属上级或顶级', + `available_amount_snapshot` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '申请前可提现余额快照', + `apply_amount` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '申请金额', + `account_type` tinyint(1) NOT NULL COMMENT '提现账号类型,1:银行卡,2:支付宝,3:微信', + `bank_name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '开户行名称', + `bank_account` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '开户行账号或账号', + `account_name` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户姓名', + `identity_card` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户身份证号', + `receive_account` json DEFAULT NULL COMMENT '收款账户信息快照', + `apply_status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '状态:0待审核,1已通过,2已驳回,3已打款,4已取消', + `apply_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '申请时间', + `audit_time` datetime DEFAULT NULL COMMENT '最近审核时间', + `remark` varchar(500) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `tenant_id` varchar(20) COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门', + `created_by` bigint NOT NULL COMMENT '创建者', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_withdrawal_apply_no` (`apply_no`), + KEY `idx_withdrawal_apply_dept` (`apply_dept_id`), + KEY `idx_withdrawal_audit_dept` (`audit_dept_id`), + KEY `idx_withdrawal_status` (`apply_status`), + KEY `idx_withdrawal_apply_time` (`apply_time`) +) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='财务申请表'; + +DROP TABLE IF EXISTS `t_finance_audit_record`; +CREATE TABLE `t_finance_audit_record` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `audit_no` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '审核记录编号', + `apply_no` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '申请单号', + `audit_dept_id` bigint NOT NULL COMMENT '审核方机构ID', + `auditor_user_id` bigint DEFAULT NULL COMMENT '审核人ID', + `audit_result` tinyint(1) NOT NULL DEFAULT '0' COMMENT '审核结果:0通过,1驳回', + `audit_opinion` varchar(500) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '审核意见', + `audit_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '审核时间', + `tenant_id` varchar(20) COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门', + `created_by` bigint NOT NULL COMMENT '创建者', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_withdrawal_audit_no` (`audit_no`), + KEY `idx_withdrawal_audit_apply` (`apply_no`), + KEY `idx_withdrawal_audit_dept` (`audit_dept_id`), + KEY `idx_withdrawal_audit_time` (`audit_time`) +) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='财务审核记录表'; + +DROP TABLE IF EXISTS `t_flow_package_config`; +CREATE TABLE `t_flow_package_config` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `pool_package_code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '池编码', + `package_codes` json DEFAULT NULL COMMENT '套餐编码列表', + `topup_package_codes` json DEFAULT NULL COMMENT '可订购加油包套餐编码列表', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门ID', + `created_by` bigint NOT NULL COMMENT '创建者ID', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者ID', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `idx_pool_package_code` (`pool_package_code`), + KEY `idx_tenant_id` (`tenant_id`) +) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='SIM流量池套餐配置表'; + +DROP TABLE IF EXISTS `t_message_log`; +CREATE TABLE `t_message_log` ( + `message_log_id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `message_type` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '消息类型 1系统通知 2活动通知 3订单通知 4账户通知', + `send_user_type` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '发送用户类型 1代理商 2终端用户', + `user_ids` json NOT NULL COMMENT '接收用户ID集合(JSON数组)', + `message_title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '消息标题', + `message_content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '消息内容', + `message_link` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT '' COMMENT '跳转链接地址', + `send_time` datetime DEFAULT NULL COMMENT '发送时间', + `is_recall` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '是否撤回 0未撤回 1已撤回', + `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门', + `created_by` bigint NOT NULL COMMENT '创建者', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`message_log_id`) USING BTREE, + KEY `send_user_type` (`send_user_type`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=118 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='消息日志'; + +DROP TABLE IF EXISTS `t_message_type`; +CREATE TABLE `t_message_type` ( + `message_id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `name` varchar(100) DEFAULT '' COMMENT '通知类型', + `describe` varchar(128) DEFAULT '' COMMENT '通知描述', + `send_type` tinyint(1) DEFAULT '1' COMMENT '发送类型 1代理商 2终端', + `tenant_id` varchar(20) NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门', + `created_by` bigint NOT NULL COMMENT '创建者', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`message_id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='消息类型'; + +DROP TABLE IF EXISTS `t_notify_log`; +CREATE TABLE `t_notify_log` ( + `notify_id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `notify_title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '标题', + `notify_content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '内容', + `send_user_type` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '发送用户类型 1代理商 2终端用户', + `send_time` datetime DEFAULT NULL COMMENT '发送时间', + `tenant_id` varchar(20) NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门', + `created_by` bigint NOT NULL COMMENT '创建者', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`notify_id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='通知日志'; + +DROP TABLE IF EXISTS `t_order`; +CREATE TABLE `t_order` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `order_sn` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '订单编号', + `parent_order_id` bigint NOT NULL DEFAULT '0' COMMENT '父订单ID', + `parent_order_sn` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '父订单编号', + `customer_type` tinyint NOT NULL COMMENT '客户类型 枚举', + `customer_agent_id` bigint NOT NULL COMMENT '渠道编号(购买方)', + `end_user_id` bigint NOT NULL COMMENT '终端客户编号', + `agent_id` bigint NOT NULL COMMENT '渠道编号(销售方)', + `order_type` tinyint NOT NULL COMMENT '订单类型 枚举', + `order_status` tinyint NOT NULL COMMENT '订单状态 枚举', + `shipping_status` tinyint NOT NULL DEFAULT '0' COMMENT '配送状态 枚举', + `return_status` tinyint NOT NULL DEFAULT '0' COMMENT '退货状态 枚举', + `consignee` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '收货人姓名', + `mobile` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '收货人手机', + `email` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '收货人邮箱', + `address` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '详细地址', + `area_code` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '行政区域代码', + `buyer_note` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '买家备注', + `admin_note` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '商家备注', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '系统备注', + `shipping_method` tinyint NOT NULL DEFAULT '1' COMMENT '发货方式 枚举', + `logistics_id` bigint NOT NULL DEFAULT '0' COMMENT '快递公司ID', + `logistics_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '物流公司名称', + `shipping_type_id` bigint NOT NULL DEFAULT '0' COMMENT '配送类型ID', + `shipping_type_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '配送类型名称', + `tracking_no` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '物流单号', + `shipping_time` datetime DEFAULT NULL COMMENT '发货时间', + `received_time` datetime DEFAULT NULL COMMENT '收货时间', + `pay_type` tinyint NOT NULL DEFAULT '0' COMMENT '支付类型 枚举', + `pay_status` tinyint NOT NULL DEFAULT '0' COMMENT '支付状态 枚举', + `pay_order_sn` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '支付订单编号', + `pay_time` datetime DEFAULT NULL COMMENT '支付时间', + `total_amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '订单总金额', + `product_amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '商品总金额', + `shipping_fee` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '运费金额', + `service_fee` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '服务费金额', + `invoice_fee` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '发票费金额', + `coupon_amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '优惠券抵扣金额', + `discount_amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '活动优惠金额', + `balance` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '余额抵扣金额', + `paid_amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '已支付总金额', + `online_paid_amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '线上支付金额', + `offline_paid_amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '线下支付金额', + `unpaid_amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '未支付金额', + `unrefund_amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '未退款金额', + `is_need_commission` tinyint NOT NULL DEFAULT '0' COMMENT '是否需要分佣 枚举:yesno_enum', + `distribution_status` tinyint NOT NULL DEFAULT '0' COMMENT '分销分成状态 枚举', + `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门ID', + `created_by` bigint NOT NULL COMMENT '创建者ID', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者ID', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `uk_order_sn` (`order_sn`) USING BTREE, + KEY `idx_parent_order_sn` (`parent_order_sn`) USING BTREE, + KEY `idx_order_type` (`order_type`) USING BTREE, + KEY `idx_order_status` (`order_status`) USING BTREE, + KEY `idx_pay_status` (`pay_status`) USING BTREE, + KEY `idx_shipping_status` (`shipping_status`) USING BTREE, + KEY `idx_customer_agent_id` (`customer_agent_id`) USING BTREE, + KEY `idx_agent_id` (`agent_id`) USING BTREE, + KEY `idx_end_user_id` (`end_user_id`) USING BTREE, + KEY `idx_created_at` (`created_at`) USING BTREE, + KEY `idx_tenant_id` (`tenant_id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=249 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='订单主表'; + +DROP TABLE IF EXISTS `t_order_item`; +CREATE TABLE `t_order_item` ( + `item_id` bigint NOT NULL AUTO_INCREMENT COMMENT '订单商品信息自增id', + `order_id` bigint NOT NULL DEFAULT '0' COMMENT '订单ID', + `order_sn` varchar(60) NOT NULL DEFAULT '' COMMENT '订单编号', + `customer_type` tinyint(1) NOT NULL COMMENT '客户类型 枚举', + `customer_agent_id` bigint NOT NULL COMMENT '渠道编号(购买方)', + `end_user_id` bigint NOT NULL COMMENT '客户编号', + `price` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '商品最终单价', + `quantity` smallint unsigned NOT NULL DEFAULT '1' COMMENT '商品的购买数量', + `product_id` bigint NOT NULL DEFAULT '0' COMMENT '商品ID', + `product_name` varchar(500) NOT NULL DEFAULT '' COMMENT '商品的名称', + `product_sn` varchar(60) NOT NULL DEFAULT '' COMMENT '商品的唯一货号', + `pic_thumb` varchar(255) NOT NULL DEFAULT '' COMMENT '商品缩略图', + `sku_id` bigint NOT NULL DEFAULT '0' COMMENT '规格ID', + `sku_data` text NOT NULL COMMENT '【JSON】sku信息[{sku_id,sku_value,sku_name}]', + `delivery_quantity` smallint unsigned NOT NULL DEFAULT '0' COMMENT '发货数量', + `product_type` tinyint unsigned NOT NULL DEFAULT '1' COMMENT '商品类型 枚举', + `is_gift` smallint unsigned NOT NULL DEFAULT '0' COMMENT '是否为赠品 枚举:yesno_enum', + `agent_id` bigint NOT NULL COMMENT '渠道编号(销售方)', + `prepay_price` decimal(8,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '预售价格', + `commission` varchar(255) DEFAULT '' COMMENT '佣金数据', + `origin_price` decimal(10,2) DEFAULT '0.00' COMMENT '商品初始价格', + `promotion_data` text COMMENT '优惠信息', + `extra_sku_data` text COMMENT '附加属性', + `pay_mode` tinyint DEFAULT NULL COMMENT '付费方式 枚举', + `service_begin_time` datetime DEFAULT NULL COMMENT '服务开始时间', + `service_end_time` datetime DEFAULT NULL COMMENT '服务结束时间', + `tenant_id` varchar(20) NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门', + `created_by` bigint NOT NULL COMMENT '创建者', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`item_id`) USING BTREE, + KEY `order_id` (`order_id`) USING BTREE, + KEY `goods_id` (`product_id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=247 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='订单的商品信息'; + +DROP TABLE IF EXISTS `t_package_apply`; +CREATE TABLE `t_package_apply` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `batch_no` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '批次编号', + `apply_no` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '申请单号', + `apply_type` tinyint(1) NOT NULL COMMENT '申请类型(1:变更,2:退订)', + `audit_type` tinyint(1) NOT NULL DEFAULT '1' COMMENT '审核类型:1初审,2复审', + `apply_dept_id` bigint NOT NULL COMMENT '申请机构ID', + `audit_dept_id` bigint NOT NULL COMMENT '审核方机构ID,通常为直属上级或顶级', + `apply_package_id` bigint NOT NULL COMMENT '申请前套餐ID', + `change_package_id` bigint DEFAULT NULL COMMENT '变更套餐ID', + `duration_months` int DEFAULT NULL COMMENT '套餐时长(月)', + `package_effective_type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '生效方式:1:立即生效,2:到期生效', + `package_effective_time` datetime DEFAULT NULL COMMENT '生效时间', + `apply_status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '状态:0待审核,1已通过,2已驳回,3已打款,4已取消', + `apply_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '申请时间', + `audit_time` datetime DEFAULT NULL COMMENT '最近审核时间', + `remark` varchar(500) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `tenant_id` varchar(20) COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门', + `created_by` bigint NOT NULL COMMENT '创建者', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `uk_withdrawal_apply_no` (`apply_no`) USING BTREE, + KEY `idx_withdrawal_apply_dept` (`apply_dept_id`) USING BTREE, + KEY `idx_withdrawal_status` (`apply_status`) USING BTREE, + KEY `idx_withdrawal_apply_time` (`apply_time`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='套餐相关申请表'; + +DROP TABLE IF EXISTS `t_package_audit_record`; +CREATE TABLE `t_package_audit_record` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `audit_no` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '审核记录编号', + `apply_no` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '申请单号', + `audit_dept_id` bigint NOT NULL COMMENT '审核方机构ID', + `auditor_user_id` bigint DEFAULT NULL COMMENT '审核人ID', + `audit_result` tinyint(1) NOT NULL DEFAULT '0' COMMENT '审核结果:0通过,1驳回', + `audit_opinion` varchar(500) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '审核意见', + `audit_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '审核时间', + `tenant_id` varchar(20) COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门', + `created_by` bigint NOT NULL COMMENT '创建者', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_withdrawal_audit_no` (`audit_no`), + KEY `idx_withdrawal_audit_apply` (`apply_no`), + KEY `idx_withdrawal_audit_dept` (`audit_dept_id`), + KEY `idx_withdrawal_audit_time` (`audit_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='套餐相关审核记录表'; + +DROP TABLE IF EXISTS `t_package_customer`; +CREATE TABLE `t_package_customer` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `package_code` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '套餐编码', + `package_name` varchar(128) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '套餐名称', + `dept_id` bigint DEFAULT NULL COMMENT '组织客户ID', + `dept_name` varchar(30) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '组织客户名称', + `remark` varchar(500) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `tenant_id` varchar(20) COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门ID', + `created_by` bigint NOT NULL COMMENT '创建者ID', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者ID', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_tenant_dept_package` (`tenant_id`,`dept_id`,`package_code`), + KEY `idx_dept_id` (`dept_id`), + KEY `idx_tenant_id` (`tenant_id`), + KEY `idx_created_at` (`created_at`) +) ENGINE=InnoDB AUTO_INCREMENT=732 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='套餐客户关联表'; + +DROP TABLE IF EXISTS `t_package_terminal`; +CREATE TABLE `t_package_terminal` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `package_code` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '套餐编码', + `package_name` varchar(128) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '套餐名称', + `terminal_id` bigint DEFAULT NULL COMMENT '终端客户ID', + `terminal_name` varchar(30) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '终端客户名称', + `remark` varchar(500) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `tenant_id` varchar(20) COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门ID', + `created_by` bigint NOT NULL COMMENT '创建者ID', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者ID', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_package_terminal` (`tenant_id`,`package_code`,`terminal_id`), + KEY `idx_tenant_id` (`tenant_id`), + KEY `idx_package_code` (`package_code`), + KEY `idx_terminal_id` (`terminal_id`), + KEY `idx_created_at` (`created_at`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='套餐终端客户关联表'; + +DROP TABLE IF EXISTS `t_product`; +CREATE TABLE `t_product` ( + `product_id` bigint NOT NULL AUTO_INCREMENT COMMENT '商品id ', + `product_name` varchar(120) NOT NULL DEFAULT '' COMMENT '商品的名称 ', + `product_sn` varchar(60) NOT NULL DEFAULT '' COMMENT '商品的唯一货号 ', + `product_tsn` varchar(255) DEFAULT NULL COMMENT '条形编码', + `product_stock` int unsigned NOT NULL DEFAULT '0' COMMENT '商品库存数量 ', + `product_price` decimal(10,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '本店售价 ', + `market_price` decimal(10,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '市场售价 ', + `product_status` tinyint unsigned NOT NULL DEFAULT '1' COMMENT '该商品状态 枚举', + `product_type` tinyint(1) DEFAULT '1' COMMENT '商品类型 枚举', + `category_id` bigint NOT NULL DEFAULT '0' COMMENT '商品所属商品分类id', + `brand_id` bigint NOT NULL DEFAULT '0' COMMENT '品牌id', + `keywords` varchar(255) DEFAULT '' COMMENT '商品关键字,放在商品页的关键字中,为搜索引擎收录用 ', + `check_status` tinyint unsigned NOT NULL DEFAULT '1' COMMENT '审核状态 枚举', + `check_reason` varchar(255) NOT NULL DEFAULT '' COMMENT '审核失败原因', + `click_count` int unsigned NOT NULL DEFAULT '0' COMMENT '商品点击数', + `product_weight` decimal(10,3) unsigned NOT NULL DEFAULT '0.000' COMMENT '商品的重量,以千克为单位 ', + `is_promote` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '是否特价促销 枚举yesno_enum', + `promote_price` decimal(10,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '促销价格', + `promote_start_date` datetime DEFAULT NULL COMMENT '促销价格开始日期', + `promote_end_date` datetime DEFAULT NULL COMMENT '促销价格结束日期', + `seckill_max_num` smallint unsigned NOT NULL DEFAULT '0' COMMENT '最大秒杀库存', + `product_brief` varchar(255) NOT NULL DEFAULT '' COMMENT '商品的简短描述 ', + `product_desc` text COMMENT '商品的详细描述 ', + `pic_url` varchar(255) NOT NULL DEFAULT '' COMMENT '商品的实际大小图片,如进入该商品页时介绍商品属性所显示的大图片', + `pic_thumb` varchar(255) NOT NULL DEFAULT '' COMMENT '商品在前台显示的微缩图片,如在分类筛选时显示的小图片 ', + `pic_original` varchar(255) NOT NULL DEFAULT '' COMMENT '应该是上传的商品的原始图片 ', + `comment_tag` varchar(255) DEFAULT NULL COMMENT '标签', + `free_shipping` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '是否包邮 枚举yesno_enum', + `sort_order` smallint unsigned NOT NULL DEFAULT '100' COMMENT '商品的显示顺序', + `store_sort_order` smallint unsigned NOT NULL DEFAULT '100' COMMENT '排序', + `is_best` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '是否是精品 枚举yesno_enum', + `is_new` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '是否是新品 枚举yesno_enum', + `is_hot` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '是否热销 枚举yesno_enum', + `last_update` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最近一次更新商品配置的时间 ', + `remark` varchar(255) NOT NULL DEFAULT '' COMMENT '商品的商家备注,仅商家可见 ', + `virtual_sales` int unsigned NOT NULL DEFAULT '0' COMMENT '虚拟销量', + `limit_number` int unsigned NOT NULL DEFAULT '0' COMMENT '限购数量', + `product_care` text COMMENT '温馨提示', + `product_related` text COMMENT '[JSON]关联的推荐商品Id', + `product_service_ids` text COMMENT '[JSON]服务项ids', + `is_support_return` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '是否支持无理由退货 枚举yesno_enum', + `is_support_cod` tinyint unsigned NOT NULL DEFAULT '1' COMMENT '是否支持货到付款 枚举yesno_enum', + `product_video` text COMMENT '商品视频', + `prepay_price` decimal(8,2) unsigned DEFAULT '0.00' COMMENT '预付金额', + `virtual_sample` text COMMENT '虚拟商品', + `paid_content` text COMMENT '付费内容', + `no_shipping` tinyint DEFAULT '0' COMMENT '是否无需配送 枚举yesno_enum', + `fixed_shipping_type` tinyint DEFAULT '2' COMMENT '运费类型 枚举', + `fixed_shipping_fee` decimal(10,2) DEFAULT '0.00' COMMENT '固定运费金额', + `dept_id` bigint NOT NULL DEFAULT '0' COMMENT '机构id', + `tenant_id` varchar(20) NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门', + `created_by` bigint NOT NULL COMMENT '创建者', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`product_id`,`brand_id`,`product_weight`) USING BTREE, + KEY `goods_sn` (`product_sn`) USING BTREE, + KEY `cat_id` (`category_id`) USING BTREE, + KEY `last_update` (`last_update`) USING BTREE, + KEY `brand_id` (`brand_id`) USING BTREE, + KEY `goods_weight` (`product_weight`) USING BTREE, + KEY `promote_end_date` (`promote_end_date`) USING BTREE, + KEY `promote_start_date` (`promote_start_date`) USING BTREE, + KEY `goods_number` (`product_stock`) USING BTREE, + KEY `sort_order` (`sort_order`) USING BTREE, + KEY `goods_basesell` (`virtual_sales`) USING BTREE, + KEY `product_name` (`product_name`) USING BTREE, + KEY `keywords` (`keywords`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=347 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='商品表'; + +DROP TABLE IF EXISTS `t_profit_account_month_bill`; +CREATE TABLE `t_profit_account_month_bill` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '账单ID', + `dept_id` bigint NOT NULL COMMENT '机构ID', + `account_period` varchar(7) COLLATE utf8mb4_general_ci NOT NULL COMMENT '账期YYYY-MM', + `opening_balance` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '月初余额', + `commission_income` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '分润收入', + `balance_transfer_in_income` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '余额转提现收入', + `withdrawal_expense` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '提现支出', + `withdrawable_transfer_out_expense` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '可提现转余额支出', + `profit_credit_repay_expense` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '盈利账户还款支出', + `total_income` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '本月收入总额', + `total_expense` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '本月支出总额', + `closing_balance` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '月末余额(月初余额+本月收入-本月支出)', + `income_count` int NOT NULL DEFAULT '0' COMMENT '收入笔数', + `expense_count` int NOT NULL DEFAULT '0' COMMENT '支出笔数', + `bill_status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '账单状态:1正常,2已调整,3已作废', + `settle_time` datetime DEFAULT NULL COMMENT '结算时间', + `settle_by` bigint DEFAULT NULL COMMENT '结算人ID', + `remark` varchar(500) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `tenant_id` varchar(20) COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门', + `created_by` bigint NOT NULL COMMENT '创建者', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_bill_profit_dept_period` (`dept_id`,`account_period`), + KEY `idx_bill_profit_period` (`account_period`), + KEY `idx_bill_profit_dept` (`dept_id`), + KEY `idx_bill_profit_status` (`bill_status`) +) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='盈利账户月账单表'; + +DROP TABLE IF EXISTS `t_resource_batch_download`; +CREATE TABLE `t_resource_batch_download` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `batch_no` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '批次编号(全局唯一)', + `task_name` varchar(128) COLLATE utf8mb4_general_ci NOT NULL COMMENT '任务名称', + `resource_type` tinyint NOT NULL COMMENT '资源类型 枚举', + `export_scene` tinyint DEFAULT NULL COMMENT '导出场景 枚举', + `query_params` json DEFAULT NULL COMMENT '导出查询条件快照', + `total_count` int NOT NULL DEFAULT '0' COMMENT '预计导出总条数', + `success_count` int NOT NULL DEFAULT '0' COMMENT '已成功导出条数', + `fail_count` int NOT NULL DEFAULT '0' COMMENT '失败条数', + `download_status` tinyint NOT NULL DEFAULT '0' COMMENT '下载状态 枚举', + `oss_id` bigint DEFAULT NULL COMMENT 'OSS文件ID', + `file_name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '导出文件名', + `file_ext` varchar(16) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '文件扩展名', + `file_url` varchar(512) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '文件访问地址', + `file_path` varchar(512) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '服务器本地路径', + `file_size` bigint NOT NULL DEFAULT '0' COMMENT '文件大小(字节)', + `file_md5` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '文件MD5', + `download_count` int NOT NULL DEFAULT '0' COMMENT '下载次数', + `last_download_time` datetime DEFAULT NULL COMMENT '最后下载时间', + `max_download_count` int NOT NULL DEFAULT '10' COMMENT '最大下载次数限制', + `error_message` text COLLATE utf8mb4_general_ci COMMENT '失败原因', + `dept_id` bigint NOT NULL COMMENT '所属机构ID', + `start_time` datetime DEFAULT NULL COMMENT '任务开始时间', + `finish_time` datetime DEFAULT NULL COMMENT '任务完成时间', + `expire_time` datetime DEFAULT NULL COMMENT '文件过期时间', + `remark` varchar(500) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `tenant_id` varchar(20) COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门ID', + `created_by` bigint NOT NULL COMMENT '创建者ID', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者ID', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_batch_no` (`batch_no`), + KEY `idx_dept_id` (`dept_id`), + KEY `idx_resource_type` (`resource_type`), + KEY `idx_download_status` (`download_status`), + KEY `idx_created_by` (`created_by`), + KEY `idx_expire_time` (`expire_time`), + KEY `idx_created_at` (`created_at`) +) ENGINE=InnoDB AUTO_INCREMENT=581 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='资源批次下载表'; + +DROP TABLE IF EXISTS `t_sim_bind_package_logs`; +CREATE TABLE `t_sim_bind_package_logs` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `subscription_no` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '订购记录编号', + `batch_no` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '批次编号', + `iccid` varchar(32) COLLATE utf8mb4_general_ci NOT NULL COMMENT 'ICCID', + `msisdn` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'MSISDN/卡号', + `dept_id` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '部门机构编号', + `package_type` tinyint NOT NULL COMMENT '套餐类型', + `package_code` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '套餐编号', + `previous_package_code` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '变更前套餐编号', + `business_type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '类型 枚举', + `effective_status` tinyint(1) NOT NULL COMMENT '订购状态 枚举', + `handle_time` datetime NOT NULL COMMENT '办理时间', + `effective_time` datetime NOT NULL COMMENT '生效时间', + `expected_expire_time` datetime DEFAULT NULL COMMENT '预计到期时间', + `actual_expire_time` datetime DEFAULT NULL COMMENT '实际到期时间', + `duration_months` int DEFAULT NULL COMMENT '套餐时长(月)', + `gift_duration_months` int NOT NULL DEFAULT '0' COMMENT '赠送时长(月)', + `order_code` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '订单编号', + `remark` varchar(500) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `tenant_id` varchar(20) COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门', + `created_by` bigint NOT NULL COMMENT '创建者', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_subscription_no` (`subscription_no`), + KEY `idx_subscription_iccid` (`iccid`), + KEY `idx_subscription_msisdn` (`msisdn`), + KEY `idx_subscription_dept` (`dept_id`), + KEY `idx_subscription_package` (`package_code`), + KEY `idx_subscription_status` (`effective_status`), + KEY `idx_subscription_business_type` (`business_type`), + KEY `idx_subscription_effective_time` (`effective_time`), + KEY `idx_subscription_expire_time` (`expected_expire_time`) +) ENGINE=InnoDB AUTO_INCREMENT=131 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订购历史表'; + +DROP TABLE IF EXISTS `t_sim_card_bind_pkg`; +CREATE TABLE `t_sim_card_bind_pkg` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `subscription_no` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '订购记录编号', + `batch_no` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '批次编号', + `iccid` varchar(32) COLLATE utf8mb4_general_ci NOT NULL COMMENT 'ICCID', + `msisdn` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'MSISDN/卡号', + `dept_id` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '部门机构编号', + `package_type` tinyint NOT NULL COMMENT '套餐类型', + `package_code` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '套餐编号', + `previous_package_code` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '变更前套餐编号', + `business_type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '类型 枚举', + `effective_status` tinyint(1) NOT NULL COMMENT '订购状态 枚举', + `handle_time` datetime NOT NULL COMMENT '办理时间', + `effective_time` datetime NOT NULL COMMENT '生效时间', + `expected_expire_time` datetime DEFAULT NULL COMMENT '预计到期时间', + `actual_expire_time` datetime DEFAULT NULL COMMENT '实际到期时间', + `duration_months` int DEFAULT NULL COMMENT '套餐时长(月)', + `gift_duration_months` int NOT NULL DEFAULT '0' COMMENT '赠送时长(月)', + `order_code` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '订单编号', + `remark` varchar(500) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `tenant_id` varchar(20) COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门', + `created_by` bigint NOT NULL COMMENT '创建者', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_subscription_no` (`subscription_no`), + KEY `idx_subscription_iccid` (`iccid`), + KEY `idx_subscription_msisdn` (`msisdn`), + KEY `idx_subscription_dept` (`dept_id`), + KEY `idx_subscription_package` (`package_code`), + KEY `idx_subscription_status` (`effective_status`), + KEY `idx_subscription_business_type` (`business_type`), + KEY `idx_subscription_effective_time` (`effective_time`), + KEY `idx_subscription_expire_time` (`expected_expire_time`) +) ENGINE=InnoDB AUTO_INCREMENT=251 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订购表'; + +DROP TABLE IF EXISTS `t_sim_card_cancellation`; +CREATE TABLE `t_sim_card_cancellation` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `iccid` varchar(32) COLLATE utf8mb4_general_ci NOT NULL COMMENT 'ICCID', + `msisdn` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'MSISDN/卡号', + `imsi` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'IMSI', + `imei` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'IMEI', + `region_code` varchar(128) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '归属地', + `dept_id` bigint NOT NULL COMMENT '渠道客户ID', + `current_package_code` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '当前套餐编号', + `package_status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '套餐状态:0 无套餐,1待生效,2生效中,3已过期', + `access_type` tinyint(1) DEFAULT NULL COMMENT '接入方式:ipv4、ipv6、ipv4_ipv6', + `boss_card_status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '运营商卡状态 枚举', + `cancel_batch_no` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '系统销户批次号', + `cancelled_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '系统销户完成时间', + `card_type` tinyint(1) DEFAULT NULL COMMENT '卡类型 枚举', + `boss_open_at` date DEFAULT NULL COMMENT '运营商开户日期', + `boss_activate_at` datetime DEFAULT NULL COMMENT '运营商激活日期', + `is_boss_activate_enabled` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否按运营商激活减去赠送时长方:1是,0否', + `inbound_batch_no` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '入库批次', + `outbound_batch_no` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '出库批次', + `allocation_batch_no` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '划拨批次', + `is_flow_pool` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否为池卡:1是,0否', + `flow_pool_code` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '流量池编号', + `flow_pkg_begin_at` datetime DEFAULT NULL COMMENT '当前套餐生效时间', + `flow_pkg_present_at` datetime DEFAULT NULL COMMENT '套餐赠送结束时间', + `flow_pkg_real_present_at` datetime DEFAULT NULL COMMENT '实际赠送结束时间', + `flow_pkg_end_at` datetime DEFAULT NULL COMMENT '当前套餐预计到期时间', + `data_service_status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '数据服务状态:0启用,1停用', + `package_total_flow_mb` decimal(18,3) NOT NULL DEFAULT '0.000' COMMENT '套餐总流量MB', + `used_flow_mb` decimal(18,3) NOT NULL DEFAULT '0.000' COMMENT '已用流量MB', + `traffic_cutoff_status` tinyint NOT NULL DEFAULT '0' COMMENT '达量断网配置状态:0未配置,1已开启,2已关闭', + `traffic_cutoff_threshold` decimal(18,3) DEFAULT '0.000' COMMENT '达量断网阈值', + `sms_service_status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '短信服务状态:0启用,1停用', + `package_total_sms` int NOT NULL DEFAULT '0' COMMENT '套餐短信总条数', + `used_sms` int NOT NULL DEFAULT '0' COMMENT '已用短信条数', + `voice_service_status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '语音服务状态:0启用,1停用', + `package_total_voice` int NOT NULL DEFAULT '0' COMMENT '套餐语音总分钟数', + `used_voice` int NOT NULL DEFAULT '0' COMMENT '已用语音分钟数', + `roam_service_status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '国漫服务状态:0启用,1停用', + `package_total_roam_flow_mb` decimal(18,3) NOT NULL DEFAULT '0.000' COMMENT '套餐国际流量MB', + `used_roam_flow_mb` decimal(18,3) NOT NULL DEFAULT '0.000' COMMENT '已用国际流量MB', + `status_sync_time` datetime DEFAULT NULL COMMENT '状态最后一次同步时间', + `flow_sync_time` datetime DEFAULT NULL COMMENT '流量最后一次同步时间', + `sms_sync_time` datetime DEFAULT NULL COMMENT '短信最后一次同步时间', + `voice_sync_time` datetime DEFAULT NULL COMMENT '语音最后一次同步时间', + `roam_sync_time` datetime DEFAULT NULL COMMENT '国漫最后一次同步时间', + `extra_fee_enabled` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否收取附加费:0是,1否', + `extra_fee_multiple` decimal(10,2) NOT NULL DEFAULT '1.00' COMMENT '附加费用倍数', + `extra_fee` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '附加金额', + `chan_key` varchar(32) COLLATE utf8mb4_general_ci NOT NULL COMMENT '通道编号', + `net_model` tinyint(1) DEFAULT NULL COMMENT '网络类型 枚举', + `remark` varchar(500) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `tenant_id` varchar(20) COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门', + `created_by` bigint NOT NULL COMMENT '创建者', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_card_iccid` (`iccid`), + UNIQUE KEY `uk_card_msisdn` (`msisdn`), + KEY `idx_card_imsi` (`imsi`), + KEY `idx_card_imei` (`imei`), + KEY `idx_card_inbound_batch` (`inbound_batch_no`), + KEY `idx_card_outbound_batch` (`outbound_batch_no`), + KEY `idx_card_allocation_batch` (`allocation_batch_no`), + KEY `idx_card_dept_id` (`dept_id`), + KEY `idx_card_current_package` (`current_package_code`), + KEY `idx_card_boss_card_status` (`boss_card_status`), + KEY `idx_card_package_status` (`package_status`), + KEY `idx_card_flow_pkg_end_at` (`flow_pkg_end_at`), + KEY `idx_card_flow_pool_code` (`flow_pool_code`), + KEY `idx_card_chan_key` (`chan_key`), + KEY `idx_cancel_batch_no` (`cancel_batch_no`), + KEY `idx_cancelled_at` (`cancelled_at`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='销户卡信息表'; + +DROP TABLE IF EXISTS `t_sim_card_info`; +CREATE TABLE `t_sim_card_info` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `iccid` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'ICCID', + `msisdn` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'MSISDN/卡号', + `imsi` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'IMSI', + `imei` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'IMEI', + `region_code` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '归属地', + `dept_id` bigint NOT NULL COMMENT '渠道客户ID', + `current_package_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '当前套餐编号', + `package_status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '套餐状态:0 无套餐,1待生效,2生效中,3已过期', + `access_type` tinyint(1) DEFAULT NULL COMMENT '接入方式:ipv4、ipv6、ipv4_ipv6', + `boss_card_status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '运营商卡状态 枚举', + `card_type` tinyint(1) DEFAULT NULL COMMENT '卡类型 枚举', + `boss_open_at` date DEFAULT NULL COMMENT '运营商开户日期', + `boss_activate_at` datetime DEFAULT NULL COMMENT '运营商激活日期', + `is_boss_activate_enabled` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否按运营商激活减去赠送时长方:1是,0否', + `inbound_batch_no` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '入库批次', + `outbound_batch_no` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '出库批次', + `allocation_batch_no` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '划拨批次', + `is_flow_pool` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否为池卡:1是,0否', + `flow_pool_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '流量池编号', + `out_stock_time` datetime DEFAULT NULL COMMENT '出库时间', + `flow_pkg_begin_at` datetime DEFAULT NULL COMMENT '当前套餐生效时间', + `flow_pkg_present_at` datetime DEFAULT NULL COMMENT '套餐赠送结束时间', + `flow_pkg_real_present_at` datetime DEFAULT NULL COMMENT '实际赠送结束时间', + `flow_pkg_end_at` datetime DEFAULT NULL COMMENT '当前套餐预计到期时间', + `data_service_status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '数据服务状态:1启用、0禁用', + `package_total_flow_mb` decimal(18,3) NOT NULL DEFAULT '0.000' COMMENT '套餐总流量MB', + `used_flow_mb` decimal(18,3) NOT NULL DEFAULT '0.000' COMMENT '已用流量MB', + `traffic_cutoff_status` tinyint NOT NULL DEFAULT '0' COMMENT '达量断网配置状态:0未配置,1已开启,2已关闭', + `traffic_cutoff_threshold` decimal(18,3) DEFAULT '0.000' COMMENT '达量断网阈值', + `sms_service_status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '短信服务状态:1启用、0禁用', + `package_total_sms` int NOT NULL DEFAULT '0' COMMENT '套餐短信总条数', + `used_sms` int NOT NULL DEFAULT '0' COMMENT '已用短信条数', + `voice_service_status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '语音服务状态:1启用、0禁用', + `package_total_voice` int NOT NULL DEFAULT '0' COMMENT '套餐语音总分钟数', + `used_voice` int NOT NULL DEFAULT '0' COMMENT '已用语音分钟数', + `roam_service_status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '国漫服务状态:1启用、0禁用', + `package_total_roam_flow_mb` decimal(18,3) NOT NULL DEFAULT '0.000' COMMENT '套餐国际流量MB', + `used_roam_flow_mb` decimal(18,3) NOT NULL DEFAULT '0.000' COMMENT '已用国际流量MB', + `status_sync_time` datetime DEFAULT NULL COMMENT '状态最后一次同步时间', + `flow_sync_time` datetime DEFAULT NULL COMMENT '流量最后一次同步时间', + `sms_sync_time` datetime DEFAULT NULL COMMENT '短信最后一次同步时间', + `voice_sync_time` datetime DEFAULT NULL COMMENT '语音最后一次同步时间', + `roam_sync_time` datetime DEFAULT NULL COMMENT '国漫最后一次同步时间', + `extra_fee_enabled` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否收取附加费:1是,0否', + `extra_fee_multiple` decimal(10,2) NOT NULL DEFAULT '1.00' COMMENT '附加费用倍数', + `extra_fee` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '附加金额', + `chan_key` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '通道编号', + `net_model` tinyint(1) DEFAULT NULL COMMENT '网络类型:4G、5G、NB-IoT', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门', + `created_by` bigint NOT NULL COMMENT '创建者', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `uk_card_iccid` (`iccid`) USING BTREE, + UNIQUE KEY `uk_card_msisdn` (`msisdn`) USING BTREE, + KEY `idx_card_imsi` (`imsi`) USING BTREE, + KEY `idx_card_imei` (`imei`) USING BTREE, + KEY `idx_card_inbound_batch` (`inbound_batch_no`) USING BTREE, + KEY `idx_card_outbound_batch` (`outbound_batch_no`) USING BTREE, + KEY `idx_card_allocation_batch` (`allocation_batch_no`) USING BTREE, + KEY `idx_card_dept_id` (`dept_id`) USING BTREE, + KEY `idx_card_current_package` (`current_package_code`) USING BTREE, + KEY `idx_card_boss_card_status` (`boss_card_status`) USING BTREE, + KEY `idx_card_package_status` (`package_status`) USING BTREE, + KEY `idx_card_flow_pkg_end_at` (`flow_pkg_end_at`) USING BTREE, + KEY `idx_card_flow_pool_code` (`flow_pool_code`) USING BTREE, + KEY `idx_card_chan_key` (`chan_key`) USING BTREE, + KEY `idx_traffic_cutoff_scan` (`traffic_cutoff_status`,`data_service_status`,`id`) +) ENGINE=InnoDB AUTO_INCREMENT=4088 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='卡信息表'; + +DROP TABLE IF EXISTS `t_sim_card_stock`; +CREATE TABLE `t_sim_card_stock` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `batch_no` varchar(64) COLLATE utf8mb4_general_ci NOT NULL, + `iccid` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'ICCID', + `msisdn` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'MSISDN', + `imsi` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'IMSI', + `imei` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'IMEI', + `chan_key` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '通道编号', + `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门', + `created_by` bigint NOT NULL COMMENT '创建者', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `uk_card_iccid` (`iccid`) USING BTREE, + UNIQUE KEY `uk_card_msisdn` (`msisdn`) USING BTREE, + KEY `idx_card_imsi` (`imsi`) USING BTREE, + KEY `idx_card_chan_key` (`chan_key`) USING BTREE, + KEY `idx_card_batch_no` (`batch_no`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=528 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='库存卡信息表'; + +DROP TABLE IF EXISTS `t_sim_channel_template`; +CREATE TABLE `t_sim_channel_template` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ID', + `temp_key` varchar(32) COLLATE utf8mb4_general_ci NOT NULL COMMENT '模板标识', + `temp_name` varchar(32) COLLATE utf8mb4_general_ci NOT NULL COMMENT '模板名称', + `temp_model` text COLLATE utf8mb4_general_ci COMMENT '模板模型', + `temp_config` text COLLATE utf8mb4_general_ci COMMENT '模板配置', + `temp_status` tinyint DEFAULT NULL COMMENT '模板状态(0未启用,1启用)', + `remark` varchar(512) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `tenant_id` varchar(20) COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门', + `created_by` bigint NOT NULL COMMENT '创建者', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_key` (`tenant_id`,`temp_key`), + KEY `temp_key` (`temp_key`), + KEY `tenant_id` (`tenant_id`) +) ENGINE=InnoDB AUTO_INCREMENT=38 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='通道模板'; + +DROP TABLE IF EXISTS `t_sim_channels`; +CREATE TABLE `t_sim_channels` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ID', + `temp_key` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '模板标识', + `chan_key` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '通道编号', + `chan_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '通道名称', + `chan_config` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '通道配置', + `chan_status` tinyint DEFAULT NULL COMMENT '通道状态(0启用,1停用, 2未申请, 3申请中, 4接口信息不全)', + `share_enabled` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否开放共享Token(0否,1是)', + `chan_alias` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '通道别名', + `region_code` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '通道行政区域代码(省市)', + `app_key` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '应用标识', + `app_secret` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '应用密钥', + `access_token` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '接口调用凭证', + `access_token_created` datetime DEFAULT NULL COMMENT '凭证申请时间', + `access_token_expire` datetime DEFAULT NULL COMMENT '凭证过期时间', + `refresh_token` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '刷新凭证', + `login_user` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '登录账号', + `login_password` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '登录密码', + `login_url` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '登录地址', + `remark` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门', + `created_by` bigint NOT NULL COMMENT '创建者', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `uk_key` (`tenant_id`,`chan_key`) USING BTREE, + KEY `chan_key` (`chan_key`) USING BTREE, + KEY `tenant_id` (`tenant_id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=34 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='通道列表'; + +DROP TABLE IF EXISTS `t_sim_flow_package_info`; +CREATE TABLE `t_sim_flow_package_info` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `package_code` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '套餐编码', + `category_code` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '套餐分类编码', + `pool_package_code` varchar(16) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '池套餐', + `package_name` varchar(128) COLLATE utf8mb4_general_ci NOT NULL COMMENT '套餐名称', + `package_type` int NOT NULL COMMENT '套餐类型:101-卡套餐 102-池套餐 103-单卡加油包 104-池卡加油包', + `billing_method` tinyint(1) DEFAULT NULL COMMENT '计费方式', + `sort_no` int NOT NULL DEFAULT '0' COMMENT '排序号', + `flow_mb` decimal(18,3) DEFAULT NULL COMMENT '套餐流量(MB)', + `flow_gb` decimal(18,3) DEFAULT NULL COMMENT '套餐流量(GB)', + `enabled` tinyint NOT NULL DEFAULT '1' COMMENT '是否启用:0-否 1-是(yesno_enum)', + `list_price` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '目录售价', + `cost_price` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '成本价', + `sys_default_profit` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '系统默认利润', + `sys_default_ratio` decimal(10,4) NOT NULL DEFAULT '100.0000' COMMENT '系统默认系数', + `terminal_cost` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '终端成本', + `sys_default_terminal_profit` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '系统默认终端利润', + `sys_default_terminal_ratio` decimal(10,4) NOT NULL DEFAULT '100.0000' COMMENT '系统默认终端系数', + `renewable_duration_config` json DEFAULT NULL COMMENT '可续费时长配置:[1,2,3]', + `discount_rate_config` json DEFAULT NULL COMMENT '折扣率配置:{"duration":1,"rate":100}', + `renewable_package_codes` json DEFAULT NULL COMMENT '可续费套餐编码列表', + `changeable_package_codes` json DEFAULT NULL COMMENT '可变更套餐编码列表', + `topup_package_codes` json DEFAULT NULL COMMENT '可订购加油包套餐编码列表', + `is_auto_renew` tinyint(1) DEFAULT '0' COMMENT '是否自动续费:0-否 1-是', + `auto_renew_package_id` bigint DEFAULT NULL COMMENT '自动续费套餐ID', + `auto_renew_years` tinyint DEFAULT '1' COMMENT '自动续费年限', + `remark` varchar(500) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `tenant_id` varchar(20) COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门ID', + `created_by` bigint NOT NULL COMMENT '创建者ID', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者ID', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_package_code` (`package_code`), + KEY `idx_category_code` (`category_code`), + KEY `idx_package_type` (`package_type`), + KEY `idx_enabled` (`enabled`) +) ENGINE=InnoDB AUTO_INCREMENT=49 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='SIM流量套餐管理表'; + +DROP TABLE IF EXISTS `t_sim_flow_package_price`; +CREATE TABLE `t_sim_flow_package_price` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `package_code` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '套餐编码', + `agent_scope_type` tinyint NOT NULL COMMENT '渠道适用类型:0-所有客户 1-指定客户', + `target_agent_id` bigint DEFAULT NULL COMMENT '指定渠道客户ID', + `dept_id` bigint DEFAULT NULL COMMENT '机构编号', + `agent_cost_ratio` decimal(10,4) NOT NULL DEFAULT '1.0000' COMMENT '渠道成本系数', + `agent_cost_profit` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '渠道成本利润', + `user_cost_ratio` decimal(10,4) NOT NULL DEFAULT '1.0000' COMMENT '终端用户成本系数', + `user_cost_profit` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '终端用户成本利润', + `enabled` tinyint NOT NULL DEFAULT '1' COMMENT '是否启用:0-否 1-是(yesno_enum)', + `remark` varchar(512) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `tenant_id` varchar(20) COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门ID', + `created_by` bigint NOT NULL COMMENT '创建者ID', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者ID', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_package_agent_scope` (`package_code`,`agent_scope_type`,`target_agent_id`,`dept_id`), + KEY `idx_package_code` (`package_code`), + KEY `idx_target_agent_id` (`target_agent_id`), + KEY `idx_dept_id` (`dept_id`), + KEY `idx_enabled` (`enabled`), + KEY `idx_tenant_id` (`tenant_id`) +) ENGINE=InnoDB AUTO_INCREMENT=62 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='SIM流量套餐定价表'; + +DROP TABLE IF EXISTS `t_sim_flow_pool`; +CREATE TABLE `t_sim_flow_pool` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `flow_pool_code` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '流量池编号', + `dept_id` bigint NOT NULL COMMENT '客户编号', + `package_codes` json DEFAULT NULL COMMENT '套餐编号列表(冗余)', + `pool_package_code` varchar(16) COLLATE utf8mb4_general_ci NOT NULL COMMENT '池套餐编码', + `card_count` bigint NOT NULL DEFAULT '0' COMMENT '关联卡数量', + `card_flow_mb` decimal(18,3) NOT NULL DEFAULT '0.000' COMMENT '套餐卡流量MB', + `pool_package_flow_mb` decimal(18,3) NOT NULL DEFAULT '0.000' COMMENT '套内总流量MB', + `add_on_flow_mb` decimal(18,3) NOT NULL DEFAULT '0.000' COMMENT '加油包总流量MB', + `total_flow_mb` decimal(18,3) NOT NULL DEFAULT '0.000' COMMENT '总流量MB(套内+加油包)', + `used_flow_mb` decimal(18,3) NOT NULL DEFAULT '0.000' COMMENT '已使用流量MB', + `remain_flow_mb` decimal(18,3) NOT NULL DEFAULT '0.000' COMMENT '剩余流量MB', + `last_stat_time` datetime DEFAULT NULL COMMENT '最后流量统计时间', + `pool_status` tinyint NOT NULL DEFAULT '0' COMMENT '状态:0 正常、1 停用、2 锁定', + `remark` varchar(500) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `tenant_id` varchar(20) COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门', + `created_by` bigint NOT NULL COMMENT '创建者', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_flow_pool_code` (`flow_pool_code`), + KEY `idx_dept_id` (`dept_id`), + KEY `idx_status` (`pool_status`) +) ENGINE=InnoDB AUTO_INCREMENT=54 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='流量池表'; + +DROP TABLE IF EXISTS `t_sim_package_category`; +CREATE TABLE `t_sim_package_category` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `category_code` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '套餐分类编号', + `category_name` varchar(128) COLLATE utf8mb4_general_ci NOT NULL COMMENT '套餐分类名称', + `sort_no` int NOT NULL DEFAULT '0' COMMENT '排序', + `enabled` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否启用:1启用,0停用', + `tenant_id` varchar(20) COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门', + `created_by` bigint NOT NULL COMMENT '创建者', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_package_category_code` (`category_code`), + KEY `idx_package_category_enabled` (`enabled`) +) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='套餐分类表'; + +DROP TABLE IF EXISTS `t_sim_pool`; +CREATE TABLE `t_sim_pool` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `flow_pool_code` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '流量池编号', + `dept_id` bigint NOT NULL COMMENT '客户编号', + `package_codes` json DEFAULT NULL COMMENT '套餐编号列表(冗余)', + `pool_package_code` bigint NOT NULL COMMENT '池套餐编码', + `card_count` bigint NOT NULL DEFAULT '0' COMMENT '关联卡数量', + `card_flow_mb` decimal(18,3) NOT NULL DEFAULT '0.000' COMMENT '套餐卡流量MB', + `pool_package_flow_mb` decimal(18,3) NOT NULL DEFAULT '0.000' COMMENT '套内总流量MB', + `add_on_flow_mb` decimal(18,3) NOT NULL DEFAULT '0.000' COMMENT '加油包总流量MB', + `total_flow_mb` decimal(18,3) NOT NULL DEFAULT '0.000' COMMENT '总流量MB(套内+加油包)', + `used_flow_mb` decimal(18,3) NOT NULL DEFAULT '0.000' COMMENT '已使用流量MB', + `remain_flow_mb` decimal(18,3) NOT NULL DEFAULT '0.000' COMMENT '剩余流量MB', + `status` tinyint NOT NULL DEFAULT '0' COMMENT '状态:0 正常、1 停用、2 锁定', + `remark` varchar(500) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `tenant_id` varchar(20) COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门', + `created_by` bigint NOT NULL COMMENT '创建者', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_flow_pool_code` (`flow_pool_code`), + KEY `idx_dept_id` (`dept_id`), + KEY `idx_status` (`status`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='流量池表'; + +DROP TABLE IF EXISTS `t_sim_pool_bind_package`; +CREATE TABLE `t_sim_pool_bind_package` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `subscription_no` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '订购记录编号', + `pool_no` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '流量池编号', + `dept_id` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '部门机构编号', + `package_type` tinyint NOT NULL COMMENT '套餐类型', + `package_code` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '套餐编号', + `previous_package_code` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '变更前套餐编号', + `business_type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '类型 枚举', + `effective_status` tinyint(1) NOT NULL COMMENT '订购状态 枚举', + `handle_time` datetime NOT NULL COMMENT '办理时间', + `effective_time` datetime NOT NULL COMMENT '生效时间', + `expected_expire_time` datetime DEFAULT NULL COMMENT '预计到期时间', + `actual_expire_time` datetime DEFAULT NULL COMMENT '实际到期时间', + `duration_months` int DEFAULT NULL COMMENT '套餐时长(月)', + `gift_duration_months` int NOT NULL DEFAULT '0' COMMENT '赠送时长(月)', + `order_code` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '订单编号', + `remark` varchar(500) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `tenant_id` varchar(20) COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门', + `created_by` bigint NOT NULL COMMENT '创建者', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_subscription_no` (`subscription_no`), + KEY `idx_subscription_pool` (`pool_no`), + KEY `idx_subscription_dept` (`dept_id`), + KEY `idx_subscription_package` (`package_code`), + KEY `idx_subscription_status` (`effective_status`), + KEY `idx_subscription_business_type` (`business_type`), + KEY `idx_subscription_effective_time` (`effective_time`), + KEY `idx_subscription_expire_time` (`expected_expire_time`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='卡池加油包订购表'; + +DROP TABLE IF EXISTS `t_sim_pool_bind_pkg_logs`; +CREATE TABLE `t_sim_pool_bind_pkg_logs` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `subscription_no` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '订购记录编号', + `pool_no` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '流量池编号', + `dept_id` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '部门机构编号', + `package_type` tinyint NOT NULL COMMENT '套餐类型', + `package_code` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '套餐编号', + `previous_package_code` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '变更前套餐编号', + `business_type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '类型 枚举', + `effective_status` tinyint(1) NOT NULL COMMENT '订购状态 枚举', + `handle_time` datetime NOT NULL COMMENT '办理时间', + `effective_time` datetime NOT NULL COMMENT '生效时间', + `expected_expire_time` datetime DEFAULT NULL COMMENT '预计到期时间', + `actual_expire_time` datetime DEFAULT NULL COMMENT '实际到期时间', + `duration_months` int DEFAULT NULL COMMENT '套餐时长(月)', + `gift_duration_months` int NOT NULL DEFAULT '0' COMMENT '赠送时长(月)', + `order_code` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '订单编号', + `remark` varchar(500) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `tenant_id` varchar(20) COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门', + `created_by` bigint NOT NULL COMMENT '创建者', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_subscription_no` (`subscription_no`), + KEY `idx_subscription_pool` (`pool_no`), + KEY `idx_subscription_dept` (`dept_id`), + KEY `idx_subscription_package` (`package_code`), + KEY `idx_subscription_status` (`effective_status`), + KEY `idx_subscription_business_type` (`business_type`), + KEY `idx_subscription_effective_time` (`effective_time`), + KEY `idx_subscription_expire_time` (`expected_expire_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='卡池加油包订购表历史'; + +DROP TABLE IF EXISTS `t_sim_pool_warn_config`; +CREATE TABLE `t_sim_pool_warn_config` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `pool_id` bigint NOT NULL COMMENT '流量池ID', + `warn_level` tinyint NOT NULL COMMENT '预警等级:1提示,2注意,3警告,4危险,5紧急', + `threshold_percent` decimal(10,2) NOT NULL COMMENT '阈值(例如0.7)', + `warn_methods` tinyint NOT NULL DEFAULT '0' COMMENT '预警方式:0短信,1邮箱,2电话,3平台消息 多选逗号分隔', + `warn_phones` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '预警手机号 多个逗号分隔', + `warn_emails` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '预警邮箱 多个逗号分隔', + `auto_action` tinyint NOT NULL DEFAULT '0' COMMENT '自动动作:0无,1限速,2断网', + `is_enabled` tinyint NOT NULL DEFAULT '1' COMMENT '是否启用:1启用,0停用', + `remark` varchar(500) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `tenant_id` varchar(20) COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门', + `created_by` bigint NOT NULL COMMENT '创建者', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_pool_level` (`pool_id`,`warn_level`), + KEY `idx_pool_threshold` (`pool_id`,`threshold_percent`), + KEY `idx_pool_enabled` (`pool_id`,`is_enabled`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='流量池预警配置表'; + +DROP TABLE IF EXISTS `t_sim_pool_warn_log`; +CREATE TABLE `t_sim_pool_warn_log` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `pool_id` bigint NOT NULL COMMENT '流量池ID', + `warn_level` tinyint NOT NULL COMMENT '预警级别', + `threshold_percent` decimal(10,2) NOT NULL COMMENT '触发阈值百分比(例如0.7)', + `used_percent` decimal(10,2) NOT NULL COMMENT '实际使用百分比', + `used_flow_mb` decimal(18,3) NOT NULL COMMENT '触发时已用流量MB', + `total_flow_mb` decimal(18,3) NOT NULL COMMENT '触发时总流量MB', + `warn_methods` tinyint(1) NOT NULL DEFAULT '0' COMMENT '预警方式:0短信,1邮箱,2电话,3平台消息', + `warn_phones` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '预警手机号', + `warn_emails` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '预警邮箱', + `warn_status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '预警状态:0成功,1失败', + `warn_time` datetime NOT NULL COMMENT '预警时间', + `remark` varchar(500) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `tenant_id` varchar(20) COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门', + `created_by` bigint NOT NULL COMMENT '创建者', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `idx_pool_time` (`pool_id`,`warn_time`), + KEY `idx_pool_level` (`pool_id`,`warn_level`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='流量池预警记录表'; + +DROP TABLE IF EXISTS `t_sim_terminal`; +CREATE TABLE `t_sim_terminal` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `iccid` varchar(32) COLLATE utf8mb4_general_ci NOT NULL COMMENT 'ICCID', + `msisdn` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'MSISDN/卡号', + `imsi` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'IMSI', + `terminal_id` bigint DEFAULT NULL COMMENT '终端客户ID', + `terminal_name` varchar(30) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '终端客户名称', + `remark` varchar(500) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `tenant_id` varchar(20) COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门ID', + `created_by` bigint NOT NULL COMMENT '创建者ID', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者ID', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `dept_id` bigint NOT NULL COMMENT '渠道客户ID', + `current_package_code` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '当前套餐编号', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_package_terminal` (`iccid`,`terminal_id`), + KEY `idx_tenant_id` (`tenant_id`), + KEY `idx_terminal_id` (`terminal_id`), + KEY `idx_created_at` (`created_at`) +) ENGINE=InnoDB AUTO_INCREMENT=39 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='终端客户卡关联表'; + +DROP TABLE IF EXISTS `t_sim_upstream_package`; +CREATE TABLE `t_sim_upstream_package` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', + `up_pkg_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '上游套餐编码', + `up_pkg_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '上游套餐名称', + `operator` tinyint NOT NULL COMMENT '运营商:1移动,2联通,3电信', + `apn_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'APN名称', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '000000' COMMENT '租户编号', + `created_dept` bigint DEFAULT NULL COMMENT '创建部门', + `created_at` datetime DEFAULT NULL COMMENT '创建时间', + `created_by` bigint DEFAULT NULL COMMENT '创建者', + `updated_at` datetime DEFAULT NULL COMMENT '更新时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `uk_up_pkg_code` (`up_pkg_code`), + KEY `idx_operator` (`operator`), + KEY `idx_created_at` (`created_at`), + KEY `idx_up_pkg_name` (`up_pkg_name`(100)) +) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='上游套餐表'; + +DROP TABLE IF EXISTS `t_terminal`; +CREATE TABLE `t_terminal` ( + `terminal_id` bigint NOT NULL AUTO_INCREMENT COMMENT '终端客户id', + `terminal_name` varchar(30) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '客户名称', + `leader` bigint DEFAULT NULL COMMENT '负责人', + `phone` varchar(11) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '联系电话', + `email` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '邮箱', + `status` char(1) COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '客户状态(0正常 1停用)', + `credit_code` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '统一社会信用代码', + `area_code` varchar(12) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '行政区域代码', + `address` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '地址', + `full_name` varchar(255) COLLATE utf8mb4_general_ci NOT NULL COMMENT '单位全称', + `industry` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '行业', + `legal_person_name` varchar(50) COLLATE utf8mb4_general_ci NOT NULL COMMENT '法人名称', + `legal_person_id_card` varchar(18) COLLATE utf8mb4_general_ci NOT NULL COMMENT '法人身份证号', + `company_type` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '单位类型', + `establish_time` date DEFAULT NULL COMMENT '单位成立时间', + `bank_name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '开户行名称', + `bank_account` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '开户行账号', + `balance` decimal(15,2) DEFAULT '0.00' COMMENT '账户余额', + `tenant_id` varchar(20) COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户ID', + `created_dept` bigint DEFAULT NULL COMMENT '创建部门', + `created_by` bigint DEFAULT NULL COMMENT '创建者', + `created_at` datetime DEFAULT NULL COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime DEFAULT NULL COMMENT '更新时间', + `deleted_by` bigint DEFAULT NULL COMMENT '删除人', + `deleted_at` datetime DEFAULT NULL COMMENT '删除时间', + PRIMARY KEY (`terminal_id`) +) ENGINE=InnoDB AUTO_INCREMENT=147 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='终端客户表'; + +DROP TABLE IF EXISTS `t_tplatform_setting`; +CREATE TABLE `t_tplatform_setting` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `sub_domain` varchar(128) NOT NULL COMMENT '二级域名前缀', + `full_domain` varchar(256) NOT NULL COMMENT '完整域名', + `app_title` varchar(128) NOT NULL COMMENT '平台标题', + `app_icon` varchar(512) DEFAULT NULL COMMENT '图标地址', + `login_page_title` varchar(256) DEFAULT NULL COMMENT '登录页大标题', + `login_page_description` varchar(512) DEFAULT NULL COMMENT '登录页描述文案', + `login_slogan_image` varchar(512) DEFAULT NULL COMMENT '登录标语图地址', + `sort` int DEFAULT '0' COMMENT '排序', + `status` tinyint NOT NULL DEFAULT '1' COMMENT '状态 0启用 1禁用', + `remark` varchar(500) DEFAULT NULL COMMENT '备注', + `tenant_id` varchar(20) NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门', + `created_by` bigint NOT NULL COMMENT '创建者', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_full_domain` (`full_domain`) COMMENT '完整域名唯一,防止重复配置', + KEY `idx_tenant_id` (`tenant_id`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='二级域名站点个性化配置表'; + +DROP TABLE IF EXISTS `t_user_message`; +CREATE TABLE `t_user_message` ( + `message_id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `message_log_id` bigint unsigned NOT NULL DEFAULT '0' COMMENT '消息日志ID', + `user_id` bigint unsigned NOT NULL DEFAULT '0' COMMENT '用户ID', + `is_read` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '是否已读 0未读 1已读', + `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门', + `created_by` bigint NOT NULL COMMENT '创建者', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`message_id`) USING BTREE, + KEY `message_log_id` (`message_log_id`) USING BTREE, + KEY `user_id` (`user_id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=203 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='用户消息'; + +DROP TABLE IF EXISTS `t_warn_config`; +CREATE TABLE `t_warn_config` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `tenant_id` varchar(20) COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户ID', + `batch_no` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '批次编号', + `item_type` tinyint NOT NULL COMMENT '对象类型:1卡,2流量池', + `item_id` bigint NOT NULL COMMENT '对象ID:单卡为t_sim_card_info.id,流量池为t_sim_flow_pool.id', + `item_code` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '对象编码快照:ICCID/MSISDN/流量池编码', + `warn_unit` tinyint NOT NULL COMMENT '预警单位:1MB,2百分比,3天数,4月数', + `first_warn` decimal(10,2) DEFAULT NULL COMMENT '第一档预警阈值,单位由warn_unit决定', + `second_warn` decimal(10,2) DEFAULT NULL COMMENT '第二档预警阈值,单位由warn_unit决定', + `third_warn` decimal(10,2) DEFAULT NULL COMMENT '第三档预警阈值,单位由warn_unit决定', + `warn_methods` varchar(64) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '3' COMMENT '预警方式:0短信,1邮箱,2电话,3平台消息;多选逗号分隔', + `warn_phones` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '预警手机号,多个逗号分隔', + `warn_emails` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '预警邮箱,多个逗号分隔', + `auto_action` tinyint NOT NULL DEFAULT '0' COMMENT '自动动作:0无,2断网;第一期只保存配置不自动执行', + `is_enabled` tinyint NOT NULL DEFAULT '1' COMMENT '是否启用:1启用,0停用', + `wx_template_id` varchar(128) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '微信订阅消息模板ID', + `remark` varchar(500) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `created_dept` bigint NOT NULL COMMENT '创建部门', + `created_by` bigint NOT NULL COMMENT '创建者', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `app_notify_enabled` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否开启小程序预警通知:0关闭,1开启', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `uk_warn_item_type` (`tenant_id`,`item_type`,`item_id`,`warn_unit`) USING BTREE, + KEY `idx_item_enabled` (`tenant_id`,`item_type`,`item_id`,`is_enabled`) USING BTREE, + KEY `idx_type_enabled_updated` (`tenant_id`,`warn_unit`,`is_enabled`,`updated_at`) USING BTREE, + KEY `idx_batch_no` (`tenant_id`,`batch_no`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=43 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='预警配置表'; + +DROP TABLE IF EXISTS `t_warn_log`; +CREATE TABLE `t_warn_log` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `tenant_id` varchar(20) COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户ID', + `config_id` bigint NOT NULL COMMENT '预警配置ID', + `item_type` tinyint NOT NULL COMMENT '对象类型:1单卡,2流量池', + `item_id` bigint NOT NULL COMMENT '对象ID:单卡为t_sim_card_info.id,流量池为t_sim_flow_pool.id', + `item_code` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '对象编码快照:ICCID/MSISDN/流量池编码', + `warn_stage` tinyint NOT NULL COMMENT '触发档位:1第一档,2第二档,3第三档', + `warn_level` tinyint NOT NULL COMMENT '预警级别:1提示,2注意,3警告,4危险,5紧急', + `warn_unit` tinyint NOT NULL COMMENT '预警单位/维度:1MB,2百分比,3天数,4月数', + `threshold_value` decimal(10,2) NOT NULL COMMENT '触发阈值,单位由warn_unit决定', + `actual_value` decimal(18,3) NOT NULL COMMENT '触发时实际值,单位由warn_unit决定', + `total_flow_mb` decimal(18,3) DEFAULT NULL COMMENT '触发时总流量MB;流量类预警使用', + `remain_flow_mb` decimal(18,3) DEFAULT NULL COMMENT '触发时剩余流量MB;流量类预警使用', + `warn_methods` varchar(64) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '3' COMMENT '实际预警方式快照', + `warn_phones` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '实际预警手机号快照', + `warn_emails` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '实际预警邮箱快照', + `message_log_id` bigint DEFAULT NULL COMMENT '平台消息ID;聚合通知时可能为空', + `warn_time` datetime NOT NULL COMMENT '预警时间', + `remark` varchar(500) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `created_dept` bigint NOT NULL COMMENT '创建部门', + `created_by` bigint NOT NULL COMMENT '创建者', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_item_time` (`tenant_id`,`item_type`,`item_id`,`warn_time`) USING BTREE, + KEY `idx_config_stage_time` (`config_id`,`warn_stage`,`warn_time`) USING BTREE, + KEY `idx_warn_unit_time` (`tenant_id`,`item_type`,`warn_unit`,`warn_time`) USING BTREE, + KEY `idx_message_log_id` (`message_log_id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=94 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='预警记录表'; + +DROP TABLE IF EXISTS `t_wo_communication`; +CREATE TABLE `t_wo_communication` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `wo_no` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '工单编号', + `comm_type` tinyint NOT NULL COMMENT '沟通类型:0回复,1反馈', + `sender_dept_id` bigint DEFAULT NULL COMMENT '发送人机构ID', + `sender_user_id` bigint DEFAULT NULL COMMENT '发送人用户ID', + `sender_name` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '发送人姓名', + `content` text COLLATE utf8mb4_general_ci NOT NULL COMMENT '内容', + `attachment_urls` json DEFAULT NULL COMMENT '附件URL列表', + `tenant_id` varchar(20) COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门', + `created_by` bigint NOT NULL COMMENT '创建者', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `idx_wo_comm_type` (`comm_type`), + KEY `idx_wo_comm_sender_user` (`sender_user_id`), + KEY `idx_wo_created_at` (`created_at`) +) ENGINE=InnoDB AUTO_INCREMENT=82 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='工单问题沟通表'; + +DROP TABLE IF EXISTS `t_wo_main`; +CREATE TABLE `t_wo_main` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `wo_no` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '工单编号', + `wo_type` tinyint(1) NOT NULL COMMENT '工单类型 0卡,1模组,2设备,3订单,4余额,5提现', + `related_id` bigint DEFAULT NULL COMMENT '关联业务ID', + `title` varchar(200) COLLATE utf8mb4_general_ci NOT NULL COMMENT '工单标题', + `content` text COLLATE utf8mb4_general_ci NOT NULL COMMENT '问题描述', + `attachment` varchar(512) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '附件', + `creator_type` tinyint NOT NULL COMMENT '创建人类型:1终端用户,2代理商', + `creator_dept_id` bigint DEFAULT NULL COMMENT '创建机构ID', + `creator_user_id` bigint DEFAULT NULL COMMENT '创建用户ID', + `creator_name` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人姓名', + `creator_phone` varchar(16) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人手机号', + `assign_dept_id` bigint DEFAULT NULL COMMENT '分派方机构ID', + `assign_user_id` bigint DEFAULT NULL COMMENT '分派人用户ID', + `current_status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '当前处理状态:1已分派,2处理中,3已解决,4已完结_关单,5已取消', + `handler_dept_id` bigint DEFAULT NULL COMMENT '处理方机构ID', + `handler_user_id` bigint DEFAULT NULL COMMENT '处理人用户ID', + `first_response_time` datetime DEFAULT NULL COMMENT '首次响应时间', + `resolve_time` datetime DEFAULT NULL COMMENT '确认时间', + `close_time` datetime DEFAULT NULL COMMENT '关闭时间', + `satisfaction_level` tinyint(1) DEFAULT NULL COMMENT '满意度:1-5分', + `eval_content` varchar(500) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '评价内容', + `eval_time` datetime DEFAULT NULL COMMENT '评价时间', + `remark` varchar(500) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `tenant_id` varchar(20) COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门', + `created_by` bigint NOT NULL COMMENT '创建者', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_wo_no` (`wo_no`), + KEY `idx_wo_wo_type` (`wo_type`), + KEY `idx_wo_creator_dept` (`creator_dept_id`), + KEY `idx_wo_creator_user` (`creator_user_id`), + KEY `idx_wo_handler_dept` (`handler_dept_id`), + KEY `idx_wo_handler_user` (`handler_user_id`), + KEY `idx_wo_status` (`current_status`), + KEY `idx_wo_created_at` (`created_at`) +) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='工单主表'; + +DROP TABLE IF EXISTS `t_wo_record`; +CREATE TABLE `t_wo_record` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `wo_no` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '工单编号', + `operation_type` tinyint(1) NOT NULL COMMENT '操作类型:0创建,1分派,2处理,3完成,4关单,5取消', + `operation_dept_id` bigint DEFAULT NULL COMMENT '操作机构ID', + `operation_user_id` bigint DEFAULT NULL COMMENT '操作用户ID', + `target_dept_id` bigint DEFAULT NULL COMMENT '目标部门ID', + `target_user_id` bigint DEFAULT NULL COMMENT '目标用户ID', + `before_status` tinyint(1) DEFAULT NULL COMMENT '变更前状态', + `after_status` tinyint(1) DEFAULT NULL COMMENT '变更后状态', + `tenant_id` varchar(20) COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户ID', + `created_dept` bigint NOT NULL COMMENT '创建部门', + `created_by` bigint NOT NULL COMMENT '创建者', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `idx_wo_record_wo_no` (`wo_no`), + KEY `idx_wo_record_operation_type` (`operation_type`), + KEY `idx_wo_record_auditor_user` (`operation_user_id`), + KEY `idx_wo_record_time` (`created_by`) +) ENGINE=InnoDB AUTO_INCREMENT=107 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='工单记录表'; + +DROP TABLE IF EXISTS `test_demo`; +CREATE TABLE `test_demo` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', + `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '000000' COMMENT '租户编号', + `dept_id` bigint DEFAULT NULL COMMENT '部门id', + `user_id` bigint DEFAULT NULL COMMENT '用户id', + `order_num` int DEFAULT '0' COMMENT '排序号', + `test_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'key键', + `value` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '值', + `version` int DEFAULT '0' COMMENT '版本', + `created_dept` bigint DEFAULT NULL COMMENT '创建部门', + `created_at` datetime DEFAULT NULL COMMENT '创建时间', + `created_by` bigint DEFAULT NULL COMMENT '创建者', + `updated_at` datetime DEFAULT NULL COMMENT '更新时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `deleted_by` bigint DEFAULT NULL COMMENT '删除人', + `deleted_at` datetime DEFAULT NULL COMMENT '删除时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='测试单表'; + +DROP TABLE IF EXISTS `test_tree`; +CREATE TABLE `test_tree` ( + `id` bigint NOT NULL COMMENT '主键', + `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '000000' COMMENT '租户编号', + `parent_id` bigint DEFAULT '0' COMMENT '父id', + `dept_id` bigint DEFAULT NULL COMMENT '部门id', + `user_id` bigint DEFAULT NULL COMMENT '用户id', + `tree_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '值', + `version` int DEFAULT '0' COMMENT '版本', + `created_dept` bigint DEFAULT NULL COMMENT '创建部门', + `created_at` datetime DEFAULT NULL COMMENT '创建时间', + `created_by` bigint DEFAULT NULL COMMENT '创建者', + `updated_at` datetime DEFAULT NULL COMMENT '更新时间', + `updated_by` bigint DEFAULT NULL COMMENT '更新者', + `deleted_by` bigint DEFAULT NULL COMMENT '删除人', + `deleted_at` datetime DEFAULT NULL COMMENT '删除时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='测试树表'; + +INSERT INTO `sys_menu` (`menu_id`, `menu_name`, `parent_id`, `level`, `tree`, `order_num`, `path`, `component`, `query_param`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `created_dept`, `created_by`, `created_at`, `updated_by`, `updated_at`, `remark`) VALUES +(1,'系统管理',0,1,NULL,900,'system','','',1,0,'M','0','0','','ant-design:setting-filled',103,1,'2025-02-13 11:56:36',1,'2026-06-03 13:16:46','系统管理目录'), +(2,'系统监控',0,1,NULL,902,'monitor','','',1,0,'M','0','0','','ant-design:bar-chart-outlined',103,1,'2025-02-13 11:56:36',1,'2026-06-03 13:17:07','系统监控目录'), +(3,'系统工具',0,1,NULL,903,'tool','','',1,0,'M','0','0','','ant-design:sliders-twotone',103,1,'2025-02-13 11:56:36',1,'2026-07-24 14:19:26','系统工具目录'), +(4,'首页',0,1,NULL,1,'analytics','iotlcm/tDashboard/index','',1,0,'C','0','0','','ant-design:bank-filled',103,1,'2025-02-13 11:56:36',1,'2026-07-20 15:15:24','RuoYi-Vue-Plus官网地址'), +(5,'租户管理',0,1,NULL,901,'tenant','','',1,0,'M','0','0','','ant-design:gold-twotone',103,1,'2025-02-13 11:56:36',1,'2026-07-24 14:19:35','租户管理目录'), +(6,'用户管理',1,1,NULL,1,'user','system/user/index','',1,0,'C','0','0','system:user:list','ant-design:user-outlined',103,1,'2025-02-13 11:56:36',1,'2025-02-25 13:31:59','用户管理菜单'), +(7,'角色管理',1,1,NULL,2,'role','system/role/index','',1,0,'C','0','0','system:role:list','ant-design:team-outlined',103,1,'2025-02-13 11:56:36',1,'2025-02-25 13:37:39','角色管理菜单'), +(8,'菜单管理',1,1,NULL,3,'menu','system/menu/index','',1,0,'C','0','0','system:menu:list','ant-design:menu-outlined',103,1,'2025-02-13 11:56:36',1,'2025-02-25 13:39:02','菜单管理菜单'), +(9,'组织管理',1,1,NULL,4,'dept','system/dept/index','',1,0,'C','0','0','system:dept:list','ant-design:apartment-outlined',103,1,'2025-02-13 11:56:36',1,'2025-02-25 13:42:16','部门管理菜单'), +(10,'岗位管理',1,1,NULL,5,'post','system/post/index','',1,0,'C','0','0','system:post:list','ant-design:solution-outlined',103,1,'2025-02-13 11:56:36',1,'2025-02-25 13:43:25','岗位管理菜单'), +(11,'字典管理',1,1,NULL,6,'dict','system/dict/index','',1,0,'C','0','0','system:dict:list','ant-design:book-twotone',103,1,'2025-02-13 11:56:36',1,'2025-02-25 13:48:51','字典管理菜单'), +(12,'参数设置',1,1,NULL,7,'config','system/config/index','',1,0,'C','0','0','system:config:list','ant-design:tool-outlined',103,1,'2025-02-13 11:56:36',1,'2025-02-25 13:50:51','参数设置菜单'), +(13,'通知公告',1,1,NULL,8,'notice','system/notice/index','',1,0,'C','0','0','system:notice:list','ant-design:notification-outlined',103,1,'2025-02-13 11:56:36',1,'2025-02-25 13:51:37','通知公告菜单'), +(14,'日志管理',1,1,NULL,9,'log','','',1,0,'M','0','0','','ant-design:file-text-outlined',103,1,'2025-02-13 11:56:36',1,'2025-02-25 13:53:07','日志管理菜单'), +(15,'在线用户',2,1,NULL,1,'online','monitor/online/index','',1,0,'C','0','0','monitor:online:list','ant-design:api-filled',103,1,'2025-02-13 11:56:36',1,'2025-02-25 13:58:44','在线用户菜单'), +(16,'缓存监控',2,1,NULL,5,'cache','monitor/cache/index','',1,0,'C','0','0','monitor:cache:list','ant-design:codepen-outlined',103,1,'2025-02-13 11:56:36',1,'2025-02-25 13:59:18','缓存监控菜单'), +(17,'代码生成',3,1,NULL,2,'gen','tool/gen/index','',1,0,'C','0','0','tool:gen:list','ant-design:code-outlined',103,1,'2025-02-13 11:56:36',1,'2025-02-25 14:01:09','代码生成菜单'), +(18,'服务监控',2,1,NULL,5,'Admin','monitor/server/index','',1,0,'C','0','0','monitor:server:list','ant-design:bar-chart-outlined',103,1,'2025-02-13 11:56:36',1,'2025-03-17 10:47:57','Admin监控菜单'), +(19,'文件管理',1,1,NULL,10,'oss','system/oss/index','',1,0,'C','0','0','system:oss:list','ant-design:folder-outlined',103,1,'2025-02-13 11:56:36',1,'2025-02-25 13:55:15','文件管理菜单'), +(20,'任务调度中心',2,1,NULL,6,'snailjob','system/job/index','',1,0,'C','0','0','system:job:list','ant-design:align-center-outlined',103,1,'2025-02-13 11:56:36',11,'2025-03-19 17:08:27','SnailJob控制台菜单'), +(21,'租户管理',5,1,NULL,1,'tenant','system/tenant/index','',1,0,'C','0','0','system:tenant:list','ant-design:gold-twotone',103,1,'2025-02-13 11:56:36',1,'2025-02-25 13:56:31','租户管理菜单'), +(22,'租户套餐管理',5,1,NULL,2,'tenantPackage','system/tenantPackage/index','',1,0,'C','0','0','system:tenantPackage:list','ant-design:unordered-list-outlined',103,1,'2025-02-13 11:56:36',1,'2025-02-25 13:58:05','租户套餐管理菜单'), +(23,'客户端管理',1,1,NULL,11,'client','system/client/index','',1,0,'C','0','0','system:client:list','ant-design:group-outlined',103,1,'2025-02-13 11:56:36',1,'2025-02-25 13:54:54','客户端管理菜单'), +(24,'操作日志',14,1,NULL,1,'operlog','system/operlog/index','',1,0,'C','0','0','monitor:operlog:list','ant-design:file-text-outlined',103,1,'2025-02-13 11:56:36',1,'2025-02-25 13:53:18','操作日志菜单'), +(25,'登录日志',14,1,NULL,2,'logininfor','system/logininfor/index','',1,0,'C','0','0','monitor:logininfor:list','ant-design:file-text-outlined',103,1,'2025-02-13 11:56:36',1,'2025-02-25 13:53:29','登录日志菜单'), +(26,'用户查询',6,1,NULL,1,'','','',1,0,'F','0','0','system:user:query','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(27,'用户新增',6,1,NULL,2,'','','',1,0,'F','0','0','system:user:add','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(28,'用户修改',6,1,NULL,3,'','','',1,0,'F','0','0','system:user:edit','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(29,'用户删除',6,1,NULL,4,'','','',1,0,'F','0','0','system:user:remove','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(30,'用户导出',6,1,NULL,5,'','','',1,0,'F','0','0','system:user:export','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(31,'用户导入',6,1,NULL,6,'','','',1,0,'F','0','0','system:user:import','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(32,'重置密码',6,1,NULL,7,'','','',1,0,'F','0','0','system:user:resetPwd','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(33,'角色查询',7,1,NULL,1,'','','',1,0,'F','0','0','system:role:query','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(34,'角色新增',7,1,NULL,2,'','','',1,0,'F','0','0','system:role:add','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(35,'角色修改',7,1,NULL,3,'','','',1,0,'F','0','0','system:role:edit','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(36,'角色删除',7,1,NULL,4,'','','',1,0,'F','0','0','system:role:remove','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(37,'角色导出',7,1,NULL,5,'','','',1,0,'F','0','0','system:role:export','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(38,'菜单查询',8,1,NULL,1,'','','',1,0,'F','0','0','system:menu:query','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(39,'菜单新增',8,1,NULL,2,'','','',1,0,'F','0','0','system:menu:add','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(40,'菜单修改',8,1,NULL,3,'','','',1,0,'F','0','0','system:menu:edit','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(41,'菜单删除',8,1,NULL,4,'','','',1,0,'F','0','0','system:menu:remove','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(42,'组织查询',9,1,NULL,1,'','','',1,0,'F','0','0','system:dept:query','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(43,'组织新增',9,1,NULL,2,'','','',1,0,'F','0','0','system:dept:add','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(44,'组织修改',9,1,NULL,3,'','','',1,0,'F','0','0','system:dept:edit','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(45,'组织删除',9,1,NULL,4,'','','',1,0,'F','0','0','system:dept:remove','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(46,'岗位查询',10,1,NULL,1,'','','',1,0,'F','0','0','system:post:query','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(47,'岗位新增',10,1,NULL,2,'','','',1,0,'F','0','0','system:post:add','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(48,'岗位修改',10,1,NULL,3,'','','',1,0,'F','0','0','system:post:edit','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(49,'岗位删除',10,1,NULL,4,'','','',1,0,'F','0','0','system:post:remove','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(50,'岗位导出',10,1,NULL,5,'','','',1,0,'F','0','0','system:post:export','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(51,'字典查询',11,1,NULL,1,'#','','',1,0,'F','0','0','system:dict:query','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(52,'字典新增',11,1,NULL,2,'#','','',1,0,'F','0','0','system:dict:add','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(53,'字典修改',11,1,NULL,3,'#','','',1,0,'F','0','0','system:dict:edit','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(54,'字典删除',11,1,NULL,4,'#','','',1,0,'F','0','0','system:dict:remove','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(55,'字典导出',11,1,NULL,5,'#','','',1,0,'F','0','0','system:dict:export','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(56,'参数查询',12,1,NULL,1,'#','','',1,0,'F','0','0','system:config:query','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(57,'参数新增',12,1,NULL,2,'#','','',1,0,'F','0','0','system:config:add','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(58,'参数修改',12,1,NULL,3,'#','','',1,0,'F','0','0','system:config:edit','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(59,'参数删除',12,1,NULL,4,'#','','',1,0,'F','0','0','system:config:remove','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(60,'参数导出',12,1,NULL,5,'#','','',1,0,'F','0','0','system:config:export','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(61,'公告查询',13,1,NULL,1,'#','','',1,0,'F','0','0','system:notice:query','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(62,'公告新增',13,1,NULL,2,'#','','',1,0,'F','0','0','system:notice:add','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(63,'公告修改',13,1,NULL,3,'#','','',1,0,'F','0','0','system:notice:edit','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(64,'公告删除',13,1,NULL,4,'#','','',1,0,'F','0','0','system:notice:remove','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(65,'操作查询',24,1,NULL,1,'#','','',1,0,'F','0','0','monitor:operlog:query','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(66,'操作删除',24,1,NULL,2,'#','','',1,0,'F','0','0','monitor:operlog:remove','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(67,'日志导出',24,1,NULL,4,'#','','',1,0,'F','0','0','monitor:operlog:export','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(68,'登录查询',25,1,NULL,1,'#','','',1,0,'F','0','0','monitor:logininfor:query','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(69,'登录删除',25,1,NULL,2,'#','','',1,0,'F','0','0','monitor:logininfor:remove','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(70,'日志导出',25,1,NULL,3,'#','','',1,0,'F','0','0','monitor:logininfor:export','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(71,'在线查询',15,1,NULL,1,'#','','',1,0,'F','0','0','monitor:online:query','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(72,'批量强退',15,1,NULL,2,'#','','',1,0,'F','0','0','monitor:online:batchLogout','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(73,'单条强退',15,1,NULL,3,'#','','',1,0,'F','0','0','monitor:online:forceLogout','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(74,'账户解锁',25,1,NULL,4,'#','','',1,0,'F','0','0','monitor:logininfor:unlock','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(75,'生成查询',17,1,NULL,1,'#','','',1,0,'F','0','0','tool:gen:query','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(76,'生成修改',17,1,NULL,2,'#','','',1,0,'F','0','0','tool:gen:edit','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(77,'生成删除',17,1,NULL,3,'#','','',1,0,'F','0','0','tool:gen:remove','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(78,'导入代码',17,1,NULL,2,'#','','',1,0,'F','0','0','tool:gen:import','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(79,'预览代码',17,1,NULL,4,'#','','',1,0,'F','0','0','tool:gen:preview','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(80,'生成代码',17,1,NULL,5,'#','','',1,0,'F','0','0','tool:gen:code','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(81,'客户端管理查询',23,1,NULL,1,'#','','',1,0,'F','0','0','system:client:query','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(82,'客户端管理新增',23,1,NULL,2,'#','','',1,0,'F','0','0','system:client:add','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(83,'客户端管理修改',23,1,NULL,3,'#','','',1,0,'F','0','0','system:client:edit','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(84,'客户端管理删除',23,1,NULL,4,'#','','',1,0,'F','0','0','system:client:remove','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(85,'客户端管理导出',23,1,NULL,5,'#','','',1,0,'F','0','0','system:client:export','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(86,'任务详情',20,1,NULL,1,'#','','',1,0,'F','0','0','system:job:view','#',103,1,'2025-03-26 09:03:17',NULL,NULL,'查看'), +(87,'任务新增',20,1,NULL,2,'#','','',1,0,'F','0','0','system:job:add','#',103,1,'2025-03-26 09:09:51',NULL,NULL,'新增'), +(88,'任务修改',20,1,NULL,3,'#','','',1,0,'F','0','0','system:job:update','#',103,1,'2025-03-26 09:09:51',NULL,NULL,'修改'), +(89,'任务状态修改',20,1,NULL,4,'#','','',1,0,'F','0','0','system:job:status','#',103,1,'2025-03-26 09:09:51',NULL,NULL,'修改状态'), +(90,'任务执行一次',20,1,NULL,5,'#','','',1,0,'F','0','0','system:job:exec','#',103,1,'2025-03-26 09:09:51',NULL,NULL,'执行一次'), +(91,'任务删除',20,1,NULL,6,'#','','',1,0,'F','0','0','system:job:delete','#',103,1,'2025-03-26 09:09:51',NULL,NULL,'删除'), +(92,'文件查询',19,1,NULL,1,'#','','',1,0,'F','0','0','system:oss:query','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(93,'文件上传',19,1,NULL,2,'#','','',1,0,'F','0','0','system:oss:upload','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(94,'文件下载',19,1,NULL,3,'#','','',1,0,'F','0','0','system:oss:download','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(95,'文件删除',19,1,NULL,4,'#','','',1,0,'F','0','0','system:oss:remove','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(96,'租户查询',21,1,NULL,1,'#','','',1,0,'F','0','0','system:tenant:query','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(97,'租户新增',21,1,NULL,2,'#','','',1,0,'F','0','0','system:tenant:add','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(98,'租户修改',21,1,NULL,3,'#','','',1,0,'F','0','0','system:tenant:edit','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(99,'租户删除',21,1,NULL,4,'#','','',1,0,'F','0','0','system:tenant:remove','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(100,'租户导出',21,1,NULL,5,'#','','',1,0,'F','0','0','system:tenant:export','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(101,'租户套餐查询',22,1,NULL,1,'#','','',1,0,'F','0','0','system:tenantPackage:query','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(102,'租户套餐新增',22,1,NULL,2,'#','','',1,0,'F','0','0','system:tenantPackage:add','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(103,'租户套餐修改',22,1,NULL,3,'#','','',1,0,'F','0','0','system:tenantPackage:edit','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(104,'租户套餐删除',22,1,NULL,4,'#','','',1,0,'F','0','0','system:tenantPackage:remove','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(105,'租户套餐导出',22,1,NULL,5,'#','','',1,0,'F','0','0','system:tenantPackage:export','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(106,'配置列表',19,1,NULL,5,'#','','',1,0,'F','0','0','system:ossConfig:list','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(107,'配置添加',19,1,NULL,6,'#','','',1,0,'F','0','0','system:ossConfig:add','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(108,'配置编辑',19,1,NULL,6,'#','','',1,0,'F','0','0','system:ossConfig:edit','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(109,'配置删除',19,1,NULL,6,'#','','',1,0,'F','0','0','system:ossConfig:remove','#',103,1,'2025-02-13 11:56:36',NULL,NULL,''), +(110,'字典数据',1,1,NULL,6,'dict-data/:id','system/dict-data/index','',1,0,'C','1','0','system:dict:list','ant-design:book-outlined',103,1,'2025-02-13 11:56:36',1,'2025-02-25 13:48:35','字典数据菜单'), +(111,'OSS配置',1,1,NULL,10,'oss-config','system/oss-config/index','',1,1,'C','1','0','system:oss-config:list','ant-design:file-outlined',103,1,'2025-03-13 16:19:44',1,'2025-03-13 16:19:44',''), +(112,'生成配置',3,1,NULL,20,'gen-develop','tool/gen/develop','',1,0,'C','1','0','tool:gen:develop','ant-design:code-outlined',103,1,'2025-03-20 11:43:45',1,'2025-03-26 15:35:17',''), +(113,'同步菜单',21,1,NULL,1,'','','',1,0,'F','0','0','system:tenant:syncmenu','',103,1,'2026-03-08 11:06:09',1,'2026-03-08 11:09:00',''), +(114,'套餐分类',178,2,'tr_1659 ',11,'tSimPackageCategory','iotlcm/tPricingPackage/tSimPackageCategory/index','',1,0,'C','0','0','iot:tSimPackageCategory:list','ant-design:interaction-outlined',103,1,'2026-05-26 11:41:45',1,'2026-06-03 14:00:54',''), +(115,'套餐分类表详情',114,3,'tr_1659 tr_1660 ',10,'','','',1,0,'F','0','0','iot:tSimPackageCategory:view','',103,1,'2026-05-26 11:41:45',NULL,NULL,''), +(116,'编辑/新增套餐分类表',114,3,'tr_1659 tr_1660 ',10,'','','',1,0,'F','0','0','iot:tSimPackageCategory:edit','',103,1,'2026-05-26 11:41:45',NULL,NULL,''), +(117,'删除套餐分类表',114,3,'tr_1659 tr_1660 ',10,'','','',1,0,'F','0','0','iot:tSimPackageCategory:delete','',103,1,'2026-05-26 11:41:45',NULL,NULL,''), +(118,'导出套餐分类表',114,3,'tr_1659 tr_1660 ',10,'','','',1,0,'F','0','0','iot:tSimPackageCategory:export','',103,1,'2026-05-26 11:41:45',NULL,NULL,''), +(119,'通道管理',179,2,'tr_1665 ',21,'tSimChannels','iotlcm/tChannel/tSimChannels/index','',1,0,'C','0','0','iot:tSimChannels:list','ant-design:appstore-outlined',103,1,'2026-05-26 14:47:55',1,'2026-06-03 13:25:05',''), +(120,'通道管理详情',119,3,'tr_1665 tr_1666 ',10,'','','',1,0,'F','0','0','iot:tSimChannels:view','',103,1,'2026-05-26 14:47:55',1,'2026-05-27 09:05:20',''), +(121,'编辑/新增通道列表',119,3,'tr_1665 tr_1666 ',10,'','','',1,0,'F','0','0','iot:tSimChannels:edit','',103,1,'2026-05-26 14:47:55',1,'2026-05-27 09:12:57',''), +(122,'删除通道列表',119,3,'tr_1665 tr_1666 ',10,'','','',1,0,'F','0','0','iot:tSimChannels:delete','',103,1,'2026-05-26 14:47:55',1,'2026-05-27 09:13:11',''), +(123,'导出通道列表',119,3,'tr_1665 tr_1666 ',10,'','','',1,0,'F','0','0','iot:tSimChannels:export','',103,1,'2026-05-26 14:47:55',1,'2026-05-27 09:13:34',''), +(124,'通道模板详情',134,3,'tr_1671 tr_1672 ',9,'','','',1,0,'F','0','0','iot:tSimChannelTemplate:view','',103,1,'2026-05-26 14:53:52',1,'2026-05-27 09:16:30',''), +(125,'编辑/新增通道模板',134,3,'tr_1671 tr_1672 ',9,'','','',1,0,'F','0','0','iot:tSimChannelTemplate:edit','',103,1,'2026-05-26 14:53:52',1,'2026-05-27 09:16:40',''), +(126,'删除通道模板',134,3,'tr_1671 tr_1672 ',9,'','','',1,0,'F','0','0','iot:tSimChannelTemplate:delete','',103,1,'2026-05-26 14:53:52',1,'2026-05-27 09:16:53',''), +(127,'导出通道模板',134,3,'tr_1671 tr_1672 ',9,'','','',1,0,'F','0','0','iot:tSimChannelTemplate:export','',103,1,'2026-05-26 14:53:52',1,'2026-05-27 09:17:05',''), +(128,'SIM流量套餐',178,2,'tr_1677 ',21,'tSimFlowPackageInfo','iotlcm/tPricingPackage/tSimFlowPackageInfo/index','',1,0,'C','0','0','iot:tSimFlowPackageInfo:list','ant-design:global-outlined',103,1,'2026-05-26 15:36:39',1,'2026-06-03 14:01:16',''), +(129,'SIM流量套餐管理详情',128,3,'tr_1677 tr_1678 ',10,'','','',1,0,'F','0','0','iot:tSimFlowPackageInfo:view','',103,1,'2026-05-26 15:36:39',NULL,NULL,''), +(130,'编辑/新增SIM流量套餐管理',128,3,'tr_1677 tr_1678 ',10,'','','',1,0,'F','0','0','iot:tSimFlowPackageInfo:edit','',103,1,'2026-05-26 15:36:39',NULL,NULL,''), +(131,'删除SIM流量套餐管理',128,3,'tr_1677 tr_1678 ',10,'','','',1,0,'F','0','0','iot:tSimFlowPackageInfo:delete','',103,1,'2026-05-26 15:36:39',NULL,NULL,''), +(132,'操作SIM流量套餐管理开关',128,3,'tr_1677 tr_1678 ',10,'','','',1,0,'F','0','0','iot:tSimFlowPackageInfo:switch','',103,1,'2026-05-26 15:36:39',NULL,NULL,''), +(133,'导出SIM流量套餐管理',128,3,'tr_1677 tr_1678 ',10,'','','',1,0,'F','0','0','iot:tSimFlowPackageInfo:export','',103,1,'2026-05-26 15:36:39',NULL,NULL,''), +(134,'通道模版',179,1,NULL,1,'tSimChannelTemplate','iotlcm/tChannel/tSimChannelTemplate/index','',1,0,'C','0','0','iot:tSimChannelTemplate:list','ant-design:slack-outlined',103,1,'2026-05-27 09:07:12',1,'2026-07-21 09:03:58',''), +(135,'SIM流量套餐定价',178,2,'tr_1686 ',31,'tSimFlowPackagePrice','iotlcm/tPricingPackage/tSimFlowPackagePrice/index','',1,0,'C','0','0','iot:tSimFlowPackagePrice:agentDefaultPackagePrice:list','ant-design:sliders-outlined',103,1,'2026-05-27 09:24:36',1,'2026-06-03 14:01:47',''), +(136,'村级行政区划表',1,1,NULL,12,'tDivisionCode','LAYOUT','',1,0,'M','0','0','','ant-design:home-twotone',103,1,'2026-05-27 10:28:00',1,'2026-06-03 11:27:41',''), +(137,'村级行政区划表列表',136,2,'tr_1704 ',10,'index','common/tDivisionCode/index','',1,0,'C','0','0','common:tDivisionCode:list','ant-design:home-twotone',103,1,'2026-05-27 10:28:00',1,'2026-05-29 09:48:22',''), +(138,'村级行政区划表详情',137,3,'tr_1704 tr_1705 ',10,'','','',1,0,'F','0','0','common:tDivisionCode:view','',103,1,'2026-05-27 10:28:00',NULL,NULL,''), +(139,'编辑/新增村级行政区划表',137,3,'tr_1704 tr_1705 ',10,'','','',1,0,'F','0','0','common:tDivisionCode:edit','',103,1,'2026-05-27 10:28:00',NULL,NULL,''), +(140,'删除村级行政区划表',137,3,'tr_1704 tr_1705 ',10,'','','',1,0,'F','0','0','common:tDivisionCode:delete','',103,1,'2026-05-27 10:28:00',NULL,NULL,''), +(141,'导出村级行政区划表',137,3,'tr_1704 tr_1705 ',10,'','','',1,0,'F','0','0','common:tDivisionCode:export','',103,1,'2026-05-27 10:28:00',NULL,NULL,''), +(142,'企业客户单位信息',170,1,'',1,'tAgentEnterprise','LAYOUT','',1,0,'M','0','0','','ant-design:home-twotone',103,1,'2026-05-27 14:09:49',1,'2026-05-29 09:50:38',''), +(143,'企业客户单位信息列表',142,2,'tr_1710 ',10,'index','agent/tAgentEnterprise/index','',1,0,'C','0','0','agent:tAgentEnterprise:list','ant-design:home-twotone',103,1,'2026-05-27 14:09:49',1,'2026-05-27 14:09:49',''), +(144,'企业客户单位信息详情',143,3,'tr_1710 tr_1711 ',10,'','','',1,0,'F','0','0','agent:tAgentEnterprise:view','',103,1,'2026-05-27 14:09:49',NULL,NULL,''), +(145,'编辑/新增企业客户单位信息',143,3,'tr_1710 tr_1711 ',10,'','','',1,0,'F','0','0','agent:tAgentEnterprise:edit','',103,1,'2026-05-27 14:09:49',NULL,NULL,''), +(146,'删除企业客户单位信息',143,3,'tr_1710 tr_1711 ',10,'','','',1,0,'F','0','0','agent:tAgentEnterprise:delete','',103,1,'2026-05-27 14:09:49',NULL,NULL,''), +(147,'导出企业客户单位信息',143,3,'tr_1710 tr_1711 ',10,'','','',1,0,'F','0','0','agent:tAgentEnterprise:export','',103,1,'2026-05-27 14:09:49',NULL,NULL,''), +(148,'API凭证管理',268,2,'tr_1716 ',20,'tApi','iotlcm/tApi/index','',1,0,'C','0','0','agent:tApi:list','ant-design:api-outlined',103,1,'2026-05-28 08:58:29',1,'2026-07-31 19:27:37',''), +(149,'API集成详情',148,3,'tr_1716 tr_1717 ',10,'','','',1,0,'F','0','0','agent:tApi:view','',103,1,'2026-05-28 08:58:29',NULL,NULL,''), +(150,'编辑/新增API集成',148,3,'tr_1716 tr_1717 ',10,'','','',1,0,'F','0','0','agent:tApi:edit','',103,1,'2026-05-28 08:58:29',NULL,NULL,''), +(151,'删除API集成',148,3,'tr_1716 tr_1717 ',10,'','','',1,0,'F','0','0','agent:tApi:delete','',103,1,'2026-05-28 08:58:29',NULL,NULL,''), +(152,'导出API集成',148,3,'tr_1716 tr_1717 ',10,'','','',1,0,'F','0','0','agent:tApi:export','',103,1,'2026-05-28 08:58:29',NULL,NULL,''), +(153,'卡信息',176,2,'tr_1722 ',31,'tSimCardInfo','iotlcm/tCommunication/tSimCardInfo/index','',1,0,'C','0','0','iot:tSimCardInfo:list','ant-design:layout-outlined',103,1,'2026-05-28 09:21:36',1,'2026-06-11 13:17:59',''), +(154,'卡信息表详情',153,3,'tr_1722 tr_1723 ',10,'','','',1,0,'F','0','0','iot:tSimCardInfo:view','',103,1,'2026-05-28 09:21:36',1,'2026-06-01 13:13:23',''), +(155,'编辑卡信息表',153,3,'tr_1722 tr_1723 ',10,'','','',1,0,'F','0','0','iot:tSimCardInfo:edit','',103,1,'2026-05-28 09:21:36',1,'2026-06-12 11:33:31',''), +(156,'删除卡信息表',153,3,'tr_1722 tr_1723 ',10,'','','',1,0,'F','0','0','iot:tSimCardInfo:delete','',103,1,'2026-05-28 09:21:36',1,'2026-06-01 13:13:44',''), +(157,'导出卡信息表',153,3,'tr_1722 tr_1723 ',10,'','','',1,0,'F','0','0','iot:tSimCardInfo:export','',103,1,'2026-05-28 09:21:36',1,'2026-06-01 13:14:13',''), +(158,'客户提现账户表',170,1,'',1,'tCustWithdrawAccount','LAYOUT','',1,0,'M','0','0','','ant-design:home-twotone',103,1,'2026-05-28 11:16:48',1,'2026-06-03 13:41:35',''), +(159,'客户提现账户表列表',158,2,'tr_1728 ',10,'index','another/tCustWithdrawAccount/index','',1,0,'C','0','0','agent:tCustWithdrawAccount:list','ant-design:home-twotone',103,1,'2026-05-28 11:16:48',1,'2026-06-03 13:42:03',''), +(160,'客户提现账户表详情',159,3,'tr_1728 tr_1729 ',10,'','','',1,0,'F','0','0','agent:tCustWithdrawAccount:view','',103,1,'2026-05-28 11:16:48',NULL,NULL,''), +(161,'编辑/新增客户提现账户表',159,3,'tr_1728 tr_1729 ',10,'','','',1,0,'F','0','0','agent:tCustWithdrawAccount:edit','',103,1,'2026-05-28 11:16:48',NULL,NULL,''), +(162,'删除客户提现账户表',159,3,'tr_1728 tr_1729 ',10,'','','',1,0,'F','0','0','agent:tCustWithdrawAccount:delete','',103,1,'2026-05-28 11:16:48',NULL,NULL,''), +(163,'修改客户提现账户表状态',159,3,'tr_1728 tr_1729 ',10,'','','',1,0,'F','0','0','agent:tCustWithdrawAccount:status','',103,1,'2026-05-28 11:16:48',NULL,NULL,''), +(164,'导出客户提现账户表',159,3,'tr_1728 tr_1729 ',10,'','','',1,0,'F','0','0','agent:tCustWithdrawAccount:export','',103,1,'2026-05-28 11:16:48',NULL,NULL,''), +(165,'批次管理',177,2,'tr_1735 ',31,'tBatch','iotlcm/tLifeCycle/tBatch/index','',1,0,'C','0','0','common:batchMain:list','ant-design:group-outlined',103,1,'2026-05-28 15:34:25',1,'2026-06-03 13:57:31',''), +(166,'批次主表详情',165,3,'tr_1735 tr_1736 ',10,'','','',1,0,'F','0','0','common:batchMain:view','',103,1,'2026-05-28 15:34:25',1,'2026-06-01 13:37:05',''), +(167,'编辑/新增批次主表',165,3,'tr_1735 tr_1736 ',10,'','','',1,0,'F','0','0','common:batchMain:edit','',103,1,'2026-05-28 15:34:25',1,'2026-06-01 13:37:18',''), +(168,'删除批次主表',165,3,'tr_1735 tr_1736 ',10,'','','',1,0,'F','0','0','common:batchMain:delete','',103,1,'2026-05-28 15:34:25',1,'2026-06-01 13:37:40',''), +(169,'导出批次主表',165,3,'tr_1735 tr_1736 ',10,'','','',1,0,'F','0','0','common:batchMain:export','',103,1,'2026-05-28 15:34:25',1,'2026-06-01 13:37:28',''), +(170,'不展示的目录',0,1,NULL,999,'another','','',1,0,'M','1','0','','ant-design:home-twotone',103,1,'2026-05-29 09:50:22',1,'2026-06-03 13:41:03',''), +(171,'上游套餐',178,2,'tr_1755 ',1,'tSimUpstreamPackage','iotlcm/tPricingPackage/tSimUpstreamPackage/index','',1,0,'C','0','0','iot:tSimUpstreamPackage:list','ant-design:gold-twotone',103,1,'2026-06-02 15:13:21',1,'2026-07-24 13:30:22',''), +(172,'上游套餐表详情',171,3,'tr_1755 tr_1756 ',10,'','','',1,0,'F','0','0','iot:tSimUpstreamPackage:view','',103,1,'2026-06-02 15:13:21',NULL,NULL,''), +(173,'编辑/新增上游套餐表',171,3,'tr_1755 tr_1756 ',10,'','','',1,0,'F','0','0','iot:tSimUpstreamPackage:edit','',103,1,'2026-06-02 15:13:21',NULL,NULL,''), +(174,'删除上游套餐表',171,3,'tr_1755 tr_1756 ',10,'','','',1,0,'F','0','0','iot:tSimUpstreamPackage:delete','',103,1,'2026-06-02 15:13:21',NULL,NULL,''), +(175,'导出上游套餐表',171,3,'tr_1755 tr_1756 ',10,'','','',1,0,'F','0','0','iot:tSimUpstreamPackage:export','',103,1,'2026-06-02 15:13:21',NULL,NULL,''), +(176,'通讯管理',0,1,NULL,1,'tCommunication','','',1,0,'M','0','0','','ant-design:credit-card-outlined',103,1,'2026-06-03 11:39:30',1,'2026-07-24 14:59:55',''), +(177,'生命周期管理',0,1,NULL,3,'tLifeCycle','','',1,0,'M','0','0','','ant-design:interaction-outlined',103,1,'2026-06-03 11:40:59',1,'2026-07-31 14:49:39',''), +(178,'资费套餐管理',0,1,NULL,2,'tPricingPackage','','',1,0,'M','0','0','','ant-design:book-outlined',103,1,'2026-06-03 11:41:44',1,'2026-07-31 14:49:33',''), +(179,'通道管理',0,1,NULL,3,'tChannel','','',1,0,'M','0','0','','ant-design:bars-outlined',103,1,'2026-06-03 11:43:24',1,'2026-07-31 14:49:52',''), +(180,'库存卡信息',177,3,'tr_1762 tr_1765 ',10,'tSimCardStock','iotlcm/tLifeCycle/tSimCardStock/index','',1,0,'C','0','0','iot:tSimCardStock:list','ant-design:credit-card-outlined',103,1,'2026-06-03 17:12:41',1,'2026-07-20 15:23:04',''), +(181,'库存卡信息表详情',180,4,'tr_1762 tr_1765 tr_1766 ',10,'','','',1,0,'F','0','0','iot:tSimCardStock:view','',103,1,'2026-06-03 17:12:41',1,'2026-06-03 18:01:35',''), +(182,'编辑/新增库存卡信息表',180,4,'tr_1762 tr_1765 tr_1766 ',10,'','','',1,0,'F','0','0','iot:tSimCardStock:edit','',103,1,'2026-06-03 17:12:41',1,'2026-06-03 18:01:45',''), +(183,'删除库存卡信息表',180,4,'tr_1762 tr_1765 tr_1766 ',10,'','','',1,0,'F','0','0','iot:tSimCardStock:delete','',103,1,'2026-06-03 17:12:41',1,'2026-06-03 18:02:00',''), +(184,'导出库存卡信息表',180,4,'tr_1762 tr_1765 tr_1766 ',10,'','','',1,0,'F','0','0','iot:tSimCardStock:export','',103,1,'2026-06-03 17:12:41',1,'2026-06-03 18:02:08',''), +(185,'测试菜单',0,1,NULL,9999,'test','test/index','',1,0,'C','0','0','','',103,1,'2026-06-04 15:23:18',1,'2026-06-04 15:23:18',''), +(186,'流量池',176,2,'tr_1772 ',51,'tSimFlowPool','iotlcm/tPricingPackage/tSimFlowPool/index','',1,0,'C','0','0','iot:tSimFlowPool:list','ant-design:dashboard-outlined',103,1,'2026-06-04 17:26:42',1,'2026-07-20 15:23:27',''), +(187,'流量池表详情',186,3,'tr_1772 tr_1773 ',10,'','','',1,0,'F','0','0','iot:tSimFlowPool:view','',103,1,'2026-06-04 17:26:42',1,'2026-06-05 10:06:02',''), +(188,'编辑/新增流量池表',186,3,'tr_1772 tr_1773 ',10,'','','',1,0,'F','0','0','iot:tSimFlowPool:edit','',103,1,'2026-06-04 17:26:42',1,'2026-06-05 10:06:17',''), +(189,'删除流量池表',186,3,'tr_1772 tr_1773 ',10,'','','',1,0,'F','0','0','iot:tSimFlowPool:delete','',103,1,'2026-06-04 17:26:42',1,'2026-06-05 10:06:32',''), +(190,'导出流量池表',186,3,'tr_1772 tr_1773 ',10,'','','',1,0,'F','0','0','iot:tSimFlowPool:export','',103,1,'2026-06-04 17:26:42',1,'2026-06-05 10:06:47',''), +(191,'卡信息 单张卡同步用量',153,1,NULL,1,'','','',1,0,'F','0','0','iot:tSimCardInfo:syncCardFlow','',103,1,'2026-06-05 09:03:55',1,'2026-07-01 11:41:59',''), +(192,'API调试',1,1,NULL,999,'api','system/api/index','',1,0,'C','0','0','','ant-design:api-twotone',103,1,'2026-06-05 10:46:03',1,'2026-06-05 10:46:03',''), +(193,'部门树',153,1,NULL,1,'','','',1,0,'F','0','0','system:dept:list','',103,1,'2026-06-07 19:26:13',1,'2026-06-07 19:31:45',''), +(194,'入库管理',177,1,NULL,1,'tWarehousing','iotlcm/tLifeCycle/tWarehousing/index','',1,0,'C','0','0','','ant-design:folder-open-outlined',103,1,'2026-06-08 10:36:34',1,'2026-06-08 10:36:34',''), +(195,'智能诊断',176,1,NULL,55,'tIntelligentDiagnosis','iotlcm/tIntelligentDiagnosis/index','',1,0,'C','0','0','','ant-design:tool-outlined',103,1,'2026-06-10 13:19:46',1,'2026-07-21 09:33:49',''), +(196,'企业管理',0,1,NULL,6,'enterpriseManagement','','',1,0,'M','0','0','','ant-design:appstore-outlined',103,1,'2026-06-11 12:32:12',1,'2026-07-31 14:50:15',''), +(197,'企业信息',196,1,NULL,1,'UnitInformation','system/enterpriseManagement/UnitInformation/index','',1,0,'C','0','0','','ant-design:bank-outlined',103,1,'2026-06-11 13:15:04',1,'2026-08-07 14:13:23',''), +(198,'实名认证',196,1,NULL,2,'realNameAuthentication','system/enterpriseManagement/realNameAuthentication/index','',1,0,'F','0','0','','ant-design:appstore-outlined',103,1,'2026-06-11 13:21:54',1,'2026-06-29 14:08:40',''), +(199,'新增卡信息表',153,1,NULL,10,'','','',1,0,'F','0','0','iot:tSimCardInfo:add','',103,1,'2026-06-12 11:33:12',1,'2026-06-12 11:33:12',''), +(200,'我的API凭证',0,1,NULL,11,'tDeptApi','iotlcm/tDeptApi/index','',1,0,'C','0','0','agent:dept:apiInfo','ant-design:apartment-outlined',103,1,'2026-06-16 11:24:57',1,'2026-07-31 19:53:46',''), +(201,'同步卡状态',153,1,NULL,2,'','','',1,0,'F','0','0','iot:tSimCardInfo:syncSimCardStatus','',103,1,'2026-06-18 17:02:11',1,'2026-07-31 14:16:33',''), +(202,'平台设置管理',196,1,NULL,3,'tTplatformSetting','system/enterpriseManagement/tTplatformSetting/index.vue','',1,0,'F','0','0','system:tTplatformSetting:list','ant-design:appstore-twotone',103,1,'2026-06-21 18:25:11',1,'2026-06-29 14:08:53',''), +(203,'修改/新增二级域名站点个性化配置表',202,1,NULL,1,'','','',1,0,'F','0','0','system:tTplatformSetting:edit','',103,1,'2026-06-21 18:29:47',1,'2026-06-21 18:29:47',''), +(204,'获取二级域名站点个性化配置表指定信息',202,1,NULL,1,'','','',1,0,'F','0','0','system:tTplatformSetting:view','',103,1,'2026-06-21 19:01:18',1,'2026-06-21 19:01:18',''), +(205,'企业客户',196,1,NULL,5,'organizationStructure','agent/structure/index','',1,0,'C','0','0','agent:dept:list','ant-design:apartment-outlined',103,1,'2026-06-22 03:00:34',1,'2026-06-22 16:25:23','企业管理下级组织架构'), +(206,'组织查询',205,1,NULL,1,'','','',1,0,'F','0','0','agent:dept:query','#',103,1,'2026-06-22 03:00:34',NULL,NULL,''), +(207,'组织新增',205,1,NULL,2,'','','',1,0,'F','0','0','agent:dept:edit','#',103,1,'2026-06-22 03:00:34',NULL,NULL,''), +(208,'组织修改',205,1,NULL,3,'','','',1,0,'F','0','0','agent:dept:edit','#',103,1,'2026-06-22 03:00:34',NULL,NULL,''), +(209,'组织删除',205,1,NULL,4,'','','',1,0,'F','0','0','agent:dept:remove','#',103,1,'2026-06-22 03:00:34',NULL,NULL,''), +(210,'用户管理',196,1,NULL,4,'subordinateUsers','agent/users/index','',1,0,'C','0','0','agent:user:list','ant-design:user-outlined',103,1,'2026-06-22 03:00:34',1,'2026-06-22 16:25:56','企业管理下级用户'), +(211,'用户查询',210,1,NULL,1,'','','',1,0,'F','0','0','agent:user:query','#',103,1,'2026-06-22 03:00:34',NULL,NULL,''), +(212,'用户新增',210,1,NULL,2,'','','',1,0,'F','0','0','agent:user:add','#',103,1,'2026-06-22 03:00:34',NULL,NULL,''), +(213,'用户修改',210,1,NULL,3,'','','',1,0,'F','0','0','agent:user:edit','#',103,1,'2026-06-22 03:00:34',NULL,NULL,''), +(214,'用户删除',210,1,NULL,4,'','','',1,0,'F','0','0','agent:user:remove','#',103,1,'2026-06-22 03:00:34',NULL,NULL,''), +(215,'用户导出',210,1,NULL,5,'','','',1,0,'F','0','0','agent:user:export','#',103,1,'2026-06-22 03:00:34',NULL,NULL,''), +(216,'用户导入',210,1,NULL,6,'','','',1,0,'F','0','0','agent:user:import','#',103,1,'2026-06-22 03:00:34',NULL,NULL,''), +(217,'重置密码',210,1,NULL,7,'','','',1,0,'F','0','0','agent:user:resetPwd','#',103,1,'2026-06-22 03:00:34',NULL,NULL,''), +(218,'角色管理',196,1,NULL,6,'rolePermission','agent/roles/index','',1,0,'C','0','0','agent:role:list','ant-design:team-outlined',103,1,'2026-06-22 03:00:34',1,'2026-06-22 16:26:23','企业管理角色权限'), +(219,'角色查询',218,1,NULL,1,'','','',1,0,'F','0','0','agent:role:query','#',103,1,'2026-06-22 03:00:34',NULL,NULL,''), +(220,'角色新增',218,1,NULL,2,'','','',1,0,'F','0','0','agent:role:edit','#',103,1,'2026-06-22 03:00:34',NULL,NULL,''), +(221,'角色修改',218,1,NULL,3,'','','',1,0,'F','0','0','agent:role:edit','#',103,1,'2026-06-22 03:00:34',NULL,NULL,''), +(222,'角色删除',218,1,NULL,4,'','','',1,0,'F','0','0','agent:role:remove','#',103,1,'2026-06-22 03:00:34',NULL,NULL,''), +(223,'角色导出',218,1,NULL,5,'','','',1,0,'F','0','0','agent:role:export','#',103,1,'2026-06-22 03:00:34',NULL,NULL,''), +(224,'渠道代理树',135,3,'tr_1686 tr_1687 ',10,'','','',1,0,'F','0','0','iot:tSimFlowPackagePrice:agentTree','',103,1,'2026-06-22 10:20:49',NULL,NULL,''), +(225,'查询下级代理套餐生效定价',135,3,'tr_1686 tr_1687 ',11,'','','',1,0,'F','0','0','iot:tSimFlowPackagePrice:agentPackagePrice:list','',103,1,'2026-06-22 10:48:17',NULL,NULL,''), +(226,'查询本级默认套餐定价',135,3,'tr_1686 tr_1687 ',12,'','','',1,0,'F','0','0','iot:tSimFlowPackagePrice:agentDefaultPackagePrice:list','',103,1,'2026-06-22 10:48:17',NULL,NULL,''), +(227,'执行日志',177,2,'tr_1762 ',32,'batchExecutionLog','iotlcm/tLifeCycle/tBatchExecutionLog/index','',1,0,'C','0','0','common:batchExecutionLog:list','ant-design:file-search-outlined',103,1,'2026-06-22 13:27:54',NULL,NULL,''), +(228,'执行日志详情',227,3,'tr_1762 tr_1836 ',10,'','','',1,0,'F','0','0','common:batchExecutionLog:detail','',103,1,'2026-06-22 13:27:54',NULL,NULL,''), +(229,'编辑本级默认套餐定价',135,3,'tr_1686 tr_1687 ',13,'','','',1,0,'F','0','0','iot:tSimFlowPackagePrice:agentDefaultPackagePrice:edit','',103,1,'2026-06-22 15:59:23',NULL,NULL,''), +(230,'编辑下级代理套餐定价',135,3,'tr_1686 tr_1687 ',14,'','','',1,0,'F','0','0','iot:tSimFlowPackagePrice:agentPackagePrice:edit','',103,1,'2026-06-22 15:59:23',NULL,NULL,''), +(231,'mfa验证',6,1,NULL,1,'','','',1,0,'F','0','0','system:user:query','',100,1,'2026-06-24 13:35:15',1,'2026-06-24 13:35:15',''), +(232,'mfa验证',6,1,NULL,1,'','','',1,0,'F','0','0','system:user:query','',100,1,'2026-06-24 13:51:16',1,'2026-06-24 13:51:16',''), +(233,'获取成功批次列表',165,1,NULL,10,'','','',1,0,'F','0','0','common:batchMain:successList','',100,1,'2026-06-24 16:31:10',1,'2026-06-24 16:31:10',''), +(234,'获取SIM流量套餐管理列表',128,1,NULL,10,'','','',1,0,'F','0','0','iot:tSimFlowPackageInfo:list','',100,1,'2026-06-24 16:54:20',1,'2026-06-24 16:54:20',''), +(235,'获取企业客户单位信息指定信息',198,1,NULL,10,'','','',1,0,'F','0','0','agent:tAgentEnterprise:view','',100,1,'2026-06-25 09:28:23',1,'2026-06-25 09:28:23',''), +(236,'获取村级行政区划表列表',197,1,NULL,10,'','','',1,0,'F','0','0','iot:tDivisionCode:list','',100,1,'2026-06-25 09:32:09',1,'2026-06-25 09:32:09',''), +(237,'查询SIM卡会话',154,1,NULL,1,'','','',1,0,'F','0','0','iot:tSimCardInfo:querySimSession','',100,1,'2026-06-25 09:39:19',1,'2026-06-25 09:39:19',''), +(238,'获取直属下级',205,1,NULL,6,'',NULL,NULL,1,0,'F','0','0','agent:dept:subCompany','#',NULL,NULL,'2026-06-25 13:26:23',NULL,NULL,''), +(239,'根据流量池表获取卡列表',186,1,NULL,1,'','','',1,0,'F','0','0','iot:tSimFlowPool:getCardsByPackageCodes','',100,1,'2026-06-25 16:02:04',1,'2026-06-25 16:02:04',''), +(240,'工单管理',0,1,'',9,'tWoMain','LAYOUT','',1,0,'M','0','0','','ant-design:diff-outlined',103,1,'2026-06-25 16:32:16',1,'2026-07-24 14:20:12',''), +(241,'工单主表详情',256,3,'tr_1858 tr_1859 ',10,'','','',1,0,'F','0','0','gen:tWoMain:view','',103,1,'2026-06-25 16:32:16',1,'2026-06-28 18:14:11',''), +(242,'编辑/新增工单主表',256,3,'tr_1858 tr_1859 ',10,'','','',1,0,'F','0','0','gen:tWoMain:edit','',103,1,'2026-06-25 16:32:16',1,'2026-06-28 18:14:26',''), +(243,'删除工单主表',256,3,'tr_1858 tr_1859 ',10,'','','',1,0,'F','0','0','gen:tWoMain:delete','',103,1,'2026-06-25 16:32:16',1,'2026-06-28 18:14:40',''), +(244,'导出工单主表',256,3,'tr_1858 tr_1859 ',10,'','','',1,0,'F','0','0','gen:tWoMain:export','',103,1,'2026-06-25 16:32:16',1,'2026-06-28 18:14:48',''), +(245,'工单问题沟通',240,2,'tr_1870 ',10,'tWoCommunication','common/tWoCommunication/index','',1,0,'C','1','0','gen:tWoCommunication:list','ant-design:home-twotone',103,1,'2026-06-25 16:36:25',1,'2026-07-07 14:28:44',''), +(246,'工单问题沟通表详情',245,3,'tr_1870 tr_1871 ',10,'','','',1,0,'F','0','0','gen:tWoCommunication:view','',103,1,'2026-06-25 16:36:25',NULL,NULL,''), +(247,'编辑/新增工单问题沟通表',245,3,'tr_1870 tr_1871 ',10,'','','',1,0,'F','0','0','gen:tWoCommunication:edit','',103,1,'2026-06-25 16:36:25',NULL,NULL,''), +(248,'删除工单问题沟通表',245,3,'tr_1870 tr_1871 ',10,'','','',1,0,'F','0','0','gen:tWoCommunication:delete','',103,1,'2026-06-25 16:36:25',NULL,NULL,''), +(249,'导出工单问题沟通表',245,3,'tr_1870 tr_1871 ',10,'','','',1,0,'F','0','0','gen:tWoCommunication:export','',103,1,'2026-06-25 16:36:25',NULL,NULL,''), +(250,'SIM流量套餐分类列表',114,1,NULL,1,'','','',1,0,'F','0','0','iot:tSimPackageCategory:list','',100,1,'2026-06-26 14:25:49',1,'2026-06-26 14:34:25',''), +(251,'工单记录',240,2,'tr_1877 ',10,'tWoRecord','common/tWoRecord/index','',1,0,'C','0','0','gen:tWoRecord:list','ant-design:database-outlined',103,1,'2026-06-26 16:45:12',1,'2026-07-21 08:46:37',''), +(252,'工单记录表详情',251,3,'tr_1877 tr_1878 ',10,'','','',1,0,'F','0','0','gen:tWoRecord:view','',103,1,'2026-06-26 16:45:12',NULL,NULL,''), +(253,'编辑/新增工单记录表',251,3,'tr_1877 tr_1878 ',10,'','','',1,0,'F','0','0','gen:tWoRecord:edit','',103,1,'2026-06-26 16:45:12',NULL,NULL,''), +(254,'删除工单记录表',251,3,'tr_1877 tr_1878 ',10,'','','',1,0,'F','0','0','gen:tWoRecord:delete','',103,1,'2026-06-26 16:45:12',NULL,NULL,''), +(255,'导出工单记录表',251,3,'tr_1877 tr_1878 ',10,'','','',1,0,'F','0','0','gen:tWoRecord:export','',103,1,'2026-06-26 16:45:12',NULL,NULL,''), +(256,'我的工单',240,1,NULL,1,'tWoMain','common/tWoMain/index','',1,0,'C','0','0','gen:tWoMain:list','ant-design:container-outlined',100,1,'2026-06-28 18:13:34',1,'2026-07-21 08:45:09',''), +(257,'业务受理',176,1,NULL,1,'tBusinessAcceptance','iotlcm/tCommunication/tBusinessAcceptance/index','',1,0,'C','0','0','','ant-design:apartment-outlined',100,1,'2026-06-29 09:55:10',1,'2026-06-29 09:56:34',''), +(258,'查询SIM卡基本信息、会话信息、套餐信息',195,1,NULL,1,'','','',1,0,'F','0','0','iot:tSimdiagnose:info','',100,1,'2026-06-30 17:06:19',1,'2026-06-30 17:06:19',''), +(259,'查询SIM卡使用流量',195,1,NULL,1,'','','',1,0,'F','0','0','iot:tSimdiagnose:flow','',100,1,'2026-06-30 17:07:30',1,'2026-06-30 17:07:30',''), +(260,'转单',256,1,NULL,1,'','','',1,0,'F','0','0','gen:tWoMain:transfer','',100,1,'2026-07-01 10:17:07',1,'2026-07-01 10:17:07',''), +(261,'工单处理完成',256,1,NULL,1,'','','',1,0,'F','0','0','gen:tWoMain:resolve','',100,1,'2026-07-01 10:17:54',1,'2026-07-01 10:17:54',''), +(262,'取消工单',256,1,NULL,1,'','','',1,0,'F','0','0','gen:tWoMain:cancel','',100,1,'2026-07-01 10:18:27',1,'2026-07-01 10:18:27',''), +(263,'关闭工单',256,1,NULL,1,'','','',1,0,'F','0','0','gen:tWoMain:close','',100,1,'2026-07-01 10:18:55',1,'2026-07-01 10:18:55',''), +(264,'用户评价工单',256,1,NULL,1,'','','',1,0,'F','0','0','gen:tWoMain:evaluate','',100,1,'2026-07-01 10:19:25',1,'2026-07-01 10:19:25',''), +(265,'发送工单对话消息',245,1,NULL,1,'','','',1,0,'F','0','0','gen:tWoCommunication:message','',100,1,'2026-07-01 10:20:53',1,'2026-07-01 10:20:53',''), +(266,'批次卡清单',165,1,NULL,1,'','','',1,0,'F','0','0','common:batchMain:cards','',100,1,'2026-07-01 11:07:08',1,'2026-07-01 11:07:08',''), +(267,'获取执行日志明细列表',227,1,NULL,1,'','','',1,0,'F','0','0','common:batchExecutionLog:detailList','',100,1,'2026-07-01 11:10:42',1,'2026-07-01 11:10:42',''), +(268,'API权限管理',0,1,'',8,'tApiGroup','LAYOUT','',1,0,'M','0','0','','ant-design:home-twotone',103,1,'2026-07-02 13:59:41',1,'2026-07-31 19:50:13',''), +(269,'API权限组',268,2,'tr_1898 ',10,'tApiGroup','agent/tApiGroup/index','',1,0,'C','0','0','agent:tApiGroup:list','ant-design:home-twotone',103,1,'2026-07-02 13:59:41',1,'2026-07-31 19:48:51',''), +(270,'开放接口权限组表详情',269,3,'tr_1898 tr_1899 ',10,'','','',1,0,'F','0','0','agent:tApiGroup:view','',103,1,'2026-07-02 13:59:41',1,'2026-07-03 10:22:00',''), +(271,'编辑/新增开放接口权限组表',269,3,'tr_1898 tr_1899 ',10,'','','',1,0,'F','0','0','agent:tApiGroup:edit','',103,1,'2026-07-02 13:59:41',1,'2026-07-03 10:22:09',''), +(272,'删除开放接口权限组表',269,3,'tr_1898 tr_1899 ',10,'','','',1,0,'F','0','0','agent:tApiGroup:delete','',103,1,'2026-07-02 13:59:41',1,'2026-07-03 10:22:19',''), +(273,'修改开放接口权限组表状态',269,3,'tr_1898 tr_1899 ',10,'','','',1,0,'F','0','0','agent:tApiGroup:status','',103,1,'2026-07-02 13:59:41',1,'2026-07-03 10:23:04',''), +(274,'导出开放接口权限组表',269,3,'tr_1898 tr_1899 ',10,'','','',1,0,'F','0','0','agent:tApiGroup:export','',103,1,'2026-07-02 13:59:41',1,'2026-07-03 10:23:18',''), +(275,'API接口资源',268,2,'tr_1905 ',10,'tApiResource/index','agent/tApiResource/index','',1,0,'C','0','0','agent:tApiResource:list','ant-design:home-twotone',103,1,'2026-07-02 13:59:54',1,'2026-07-31 19:49:05',''), +(276,'开放接口资源表详情',275,3,'tr_1905 tr_1906 ',10,'','','',1,0,'F','0','0','agent:tApiResource:view','',103,1,'2026-07-02 13:59:54',1,'2026-07-03 10:23:42',''), +(277,'编辑/新增开放接口资源表',275,3,'tr_1905 tr_1906 ',10,'','','',1,0,'F','0','0','agent:tApiResource:edit','',103,1,'2026-07-02 13:59:54',1,'2026-07-03 10:23:54',''), +(278,'删除开放接口资源表',275,3,'tr_1905 tr_1906 ',10,'','','',1,0,'F','0','0','agent:tApiResource:delete','',103,1,'2026-07-02 13:59:54',1,'2026-07-03 10:24:08',''), +(279,'修改开放接口资源表状态',275,3,'tr_1905 tr_1906 ',10,'','','',1,0,'F','0','0','agent:tApiResource:status','',103,1,'2026-07-02 13:59:54',1,'2026-07-03 10:24:17',''), +(280,'导出开放接口资源表',275,3,'tr_1905 tr_1906 ',10,'','','',1,0,'F','0','0','agent:tApiResource:export','',103,1,'2026-07-02 13:59:54',1,'2026-07-03 10:24:27',''), +(281,'下载Excel批量卡入库模板',194,1,NULL,10,'','',NULL,1,0,'F','0','0','iot:tSimCardInbound:excel:template','',100,1,'2026-07-07 11:15:18',NULL,NULL,''), +(282,'提交Excel批量卡入库',194,1,NULL,11,'','',NULL,1,0,'F','0','0','iot:tSimCardInbound:excel:submit','',100,1,'2026-07-07 11:15:18',NULL,NULL,''), +(283,'提交连号批量卡入库',194,1,NULL,12,'','',NULL,1,0,'F','0','0','iot:tSimCardInbound:range:submit','',100,1,'2026-07-07 11:15:18',NULL,NULL,''), +(284,'提交批量输入卡入库',194,1,NULL,13,'','',NULL,1,0,'F','0','0','iot:tSimCardInbound:input:submit','',100,1,'2026-07-07 11:15:18',NULL,NULL,''), +(285,'下载Excel批量卡出库模板',257,1,NULL,1,'','',NULL,1,0,'F','0','0','iot:tSimCardOutbound:excel:template','',100,1,'2026-07-07 11:15:18',NULL,NULL,''), +(286,'提交Excel批量卡出库校验批次',257,1,NULL,2,'','',NULL,1,0,'F','0','0','iot:tSimCardOutbound:excel:submit','',100,1,'2026-07-07 11:15:18',NULL,NULL,''), +(287,'提交连号卡出库校验批次',257,1,NULL,3,'','',NULL,1,0,'F','0','0','iot:tSimCardOutbound:range:submit','',100,1,'2026-07-07 11:15:18',NULL,NULL,''), +(288,'提交批量输入卡出库',257,1,NULL,4,'','',NULL,1,0,'F','0','0','iot:tSimCardOutbound:input:submit','',100,1,'2026-07-07 11:15:18',NULL,NULL,''), +(289,'查询可出库批次列表',257,1,NULL,5,'','',NULL,1,0,'F','0','0','iot:tSimCardOutbound:inboundBatch:list','',100,1,'2026-07-07 11:15:18',NULL,NULL,''), +(290,'查询指定批次卡列表',257,1,NULL,6,'','',NULL,1,0,'F','0','0','iot:tSimCardOutbound:inboundBatch:cards','',100,1,'2026-07-07 11:15:18',NULL,NULL,''), +(291,'提交指定批次卡出库',257,1,NULL,7,'','',NULL,1,0,'F','0','0','iot:tSimCardOutbound:batch:submit','',100,1,'2026-07-07 11:15:18',NULL,NULL,''), +(292,'下载Excel卡续费模板',257,1,NULL,1,'','',NULL,1,0,'F','0','0','iot:tSimCardRenew:excel:template','',100,1,'2026-07-07 11:15:18',NULL,NULL,''), +(293,'提交Excel卡续费',257,1,NULL,2,'','',NULL,1,0,'F','0','0','iot:tSimCardRenew:excel:submit','',100,1,'2026-07-07 11:15:18',NULL,NULL,''), +(294,'批量输入卡续费预处理',257,1,NULL,3,'','',NULL,1,0,'F','0','0','iot:tSimCardRenew:input:prepare','',100,1,'2026-07-07 11:15:18',NULL,NULL,''), +(295,'确认批次卡续费',257,1,NULL,4,'','',NULL,1,0,'F','0','0','iot:tSimCardRenew:batch:confirm','',100,1,'2026-07-07 11:15:18',NULL,NULL,''), +(296,'下载Excel卡退订模板',257,1,NULL,1,'','',NULL,1,0,'F','0','0','iot:tSimCardUnsub:excel:template','',100,1,'2026-07-07 11:15:18',NULL,NULL,''), +(297,'提交Excel卡退订',257,1,NULL,2,'','',NULL,1,0,'F','0','0','iot:tSimCardUnsub:excel:submit','',100,1,'2026-07-07 11:15:18',NULL,NULL,''), +(298,'提交批量输入卡退订',257,1,NULL,3,'','',NULL,1,0,'F','0','0','iot:tSimCardUnsub:input:submit','',100,1,'2026-07-07 11:15:18',NULL,NULL,''), +(299,'提交连号卡退订',257,1,NULL,4,'','',NULL,1,0,'F','0','0','iot:tSimCardUnsub:range:submit','',100,1,'2026-07-07 11:15:18',NULL,NULL,''), +(300,'下载Excel卡变更套餐模板',257,1,NULL,1,'','',NULL,1,0,'F','0','0','iot:tSimCardChange:excel:template','',100,1,'2026-07-07 11:15:18',NULL,NULL,''), +(301,'提交Excel卡变更套餐',257,1,NULL,2,'','',NULL,1,0,'F','0','0','iot:tSimCardChange:excel:submit','',100,1,'2026-07-07 11:15:18',NULL,NULL,''), +(302,'批量输入卡变更套餐预处理',257,1,NULL,3,'','',NULL,1,0,'F','0','0','iot:tSimCardChange:input:prepare','',100,1,'2026-07-07 11:15:18',NULL,NULL,''), +(303,'连号卡变更套餐预处理',257,1,NULL,4,'','',NULL,1,0,'F','0','0','iot:tSimCardChange:range:prepare','',100,1,'2026-07-07 11:15:18',NULL,NULL,''), +(304,'提交批次卡变更套餐',257,1,NULL,5,'','',NULL,1,0,'F','0','0','iot:tSimCardChange:batch:submit','',100,1,'2026-07-07 11:15:18',NULL,NULL,''), +(305,'企业客户财务信息列表',322,2,'tr_1940 ',10,'tAgentBalance','common/tAgentBalance/index','',1,0,'C','0','0','common:tAgentBalance:list','ant-design:contacts-outlined',103,1,'2026-07-07 15:48:59',1,'2026-07-21 09:26:07',''), +(306,'企业客户财务信息详情',305,3,'tr_1940 tr_1941 ',10,'','','',1,0,'F','0','0','common:tAgentBalance:view','',103,1,'2026-07-07 15:48:59',1,'2026-07-08 18:46:30',''), +(307,'编辑/新增企业客户财务信息',305,3,'tr_1940 tr_1941 ',10,'','','',1,0,'F','0','0','common:tAgentBalance:edit','',103,1,'2026-07-07 15:48:59',1,'2026-07-08 18:46:41',''), +(308,'删除企业客户财务信息',305,3,'tr_1940 tr_1941 ',10,'','','',1,0,'F','0','0','common:tAgentBalance:delete','',103,1,'2026-07-07 15:48:59',1,'2026-07-08 18:47:01',''), +(309,'修改企业客户财务信息状态',305,3,'tr_1940 tr_1941 ',10,'','','',1,0,'F','0','0','common:tAgentBalance:status','',103,1,'2026-07-07 15:48:59',1,'2026-07-08 18:47:15',''), +(310,'导出企业客户财务信息',305,3,'tr_1940 tr_1941 ',10,'','','',1,0,'F','0','0','common:tAgentBalance:export','',103,1,'2026-07-07 15:48:59',1,'2026-07-08 18:47:26',''), +(311,'消费账户月账单表列表',316,2,'tr_1947 ',10,'tConsumeAccountMonthBill','common/tConsumeAccountMonthBill/index','',1,0,'C','0','0','common:tConsumeAccountMonthBill:list','ant-design:account-book-filled',103,1,'2026-07-07 15:55:27',1,'2026-07-21 09:25:18',''), +(312,'消费账户月账单表详情',311,3,'tr_1947 tr_1948 ',10,'','','',1,0,'F','0','0','common:tConsumeAccountMonthBill:view','',103,1,'2026-07-07 15:55:27',1,'2026-07-08 18:43:58',''), +(313,'编辑/新增消费账户月账单表',311,3,'tr_1947 tr_1948 ',10,'','','',1,0,'F','0','0','common:tConsumeAccountMonthBill:edit','',103,1,'2026-07-07 15:55:27',1,'2026-07-08 18:44:12',''), +(314,'删除消费账户月账单表',311,3,'tr_1947 tr_1948 ',10,'','','',1,0,'F','0','0','common:tConsumeAccountMonthBill:delete','',103,1,'2026-07-07 15:55:27',1,'2026-07-08 18:44:27',''), +(315,'导出消费账户月账单表',311,3,'tr_1947 tr_1948 ',10,'','','',1,0,'F','0','0','common:tConsumeAccountMonthBill:export','',103,1,'2026-07-07 15:55:27',1,'2026-07-08 18:44:40',''), +(316,'账单',196,1,'',1,'tProfitAccountMonthBill','','',1,0,'M','0','0','','ant-design:dollar-outlined',103,1,'2026-07-07 15:56:20',1,'2026-07-21 08:39:08',''), +(317,'盈利账户月账单表详情',333,3,'tr_1953 tr_1954 ',10,'','','',1,0,'F','0','0','common:tProfitAccountMonthBill:view','',103,1,'2026-07-07 15:56:20',1,'2026-07-27 10:51:27',''), +(318,'编辑/新增盈利账户月账单表',333,3,'tr_1953 tr_1954 ',10,'','','',1,0,'F','0','0','common:tProfitAccountMonthBill:edit','',103,1,'2026-07-07 15:56:20',1,'2026-07-27 10:51:41',''), +(319,'删除盈利账户月账单表',333,3,'tr_1953 tr_1954 ',10,'','','',1,0,'F','0','0','common:tProfitAccountMonthBill:delete','',103,1,'2026-07-07 15:56:20',1,'2026-07-27 10:51:48',''), +(320,'导出盈利账户月账单表',333,3,'tr_1953 tr_1954 ',10,'','','',1,0,'F','0','0','common:tProfitAccountMonthBill:export','',103,1,'2026-07-07 15:56:20',1,'2026-07-27 10:51:55',''), +(321,'获取执行日志概要',227,1,NULL,10,'','','',1,0,'F','0','0','common:batchExecutionLog:summary','',100,1,'2026-07-08 13:46:29',1,'2026-07-08 13:46:29',''), +(322,'费用与成本',196,1,'',1,'tBalanceDetail','','',1,0,'M','0','0','','ant-design:money-collect-outlined',103,1,'2026-07-08 16:30:22',1,'2026-07-21 08:40:23',''), +(323,'余额明细表列表',322,2,'tr_1966 ',10,'tBalanceDetail','common/tBalanceDetail/index','',1,0,'C','0','0','common:tBalanceDetail:list','ant-design:wallet-outlined',103,1,'2026-07-08 16:30:22',1,'2026-07-21 09:30:21',''), +(324,'余额明细表详情',323,3,'tr_1966 tr_1967 ',10,'','','',1,0,'F','0','0','common:tBalanceDetail:view','',103,1,'2026-07-08 16:30:22',1,'2026-07-08 18:47:56',''), +(325,'编辑/新增余额明细表',323,3,'tr_1966 tr_1967 ',10,'','','',1,0,'F','0','0','common:tBalanceDetail:edit','',103,1,'2026-07-08 16:30:22',1,'2026-07-08 18:48:14',''), +(326,'删除余额明细表',323,3,'tr_1966 tr_1967 ',10,'','','',1,0,'F','0','0','common:tBalanceDetail:delete','',103,1,'2026-07-08 16:30:22',1,'2026-07-08 18:48:28',''), +(327,'导出余额明细表',323,3,'tr_1966 tr_1967 ',10,'','','',1,0,'F','0','0','common:tBalanceDetail:export','',103,1,'2026-07-08 16:30:22',1,'2026-07-08 18:48:55',''), +(328,'可提现变动明细',322,2,'tr_1972 ',10,'tFinWithdrawableChange','common/tFinWithdrawableChange/index','',1,0,'C','0','0','common:tFinWithdrawableChange:list','ant-design:transaction-outlined',103,1,'2026-07-08 16:33:47',1,'2026-07-21 09:30:42',''), +(329,'可提现变动明细表详情',328,3,'tr_1972 tr_1973 ',10,'','','',1,0,'F','0','0','common:tFinWithdrawableChange:view','',103,1,'2026-07-08 16:33:47',1,'2026-07-08 18:49:30',''), +(330,'编辑/新增可提现变动明细表',328,3,'tr_1972 tr_1973 ',10,'','','',1,0,'F','0','0','common:tFinWithdrawableChange:edit','',103,1,'2026-07-08 16:33:47',1,'2026-07-08 18:49:44',''), +(331,'删除可提现变动明细表',328,3,'tr_1972 tr_1973 ',10,'','','',1,0,'F','0','0','common:tFinWithdrawableChange:delete','',103,1,'2026-07-08 16:33:47',1,'2026-07-08 18:49:55',''), +(332,'导出可提现变动明细表',328,3,'tr_1972 tr_1973 ',10,'','','',1,0,'F','0','0','common:tFinWithdrawableChange:export','',103,1,'2026-07-08 16:33:47',1,'2026-07-08 18:50:09',''), +(333,'盈利账户月账单列表',316,1,NULL,1,'tProfitAccountMonthBill','common/tProfitAccountMonthBill/index','',1,0,'C','0','0','common:tProfitAccountMonthBill:list','ant-design:account-book-outlined',100,1,'2026-07-09 10:33:37',1,'2026-07-21 09:24:52',''), +(334,'财务总览',196,1,NULL,5,'financialOverview','common/financialOverview/index','',1,0,'C','0','0','','ant-design:property-safety-outlined',100,1,'2026-07-10 12:52:03',1,'2026-07-21 08:43:15',''), +(335,'下载Excel自主停机模板',257,1,NULL,10,'',NULL,NULL,1,0,'F','0','0','iot:tSimCardStop:excel:template','#',100,1,'2026-07-13 17:12:33',NULL,NULL,'批量自主停机/复机第一版权限'), +(336,'提交Excel自主停机批次',257,1,NULL,11,'',NULL,NULL,1,0,'F','0','0','iot:tSimCardStop:excel:submit','#',100,1,'2026-07-13 17:12:33',NULL,NULL,'批量自主停机/复机第一版权限'), +(337,'提交批量输入自主停机',257,1,NULL,12,'',NULL,NULL,1,0,'F','0','0','iot:tSimCardStop:input:submit','#',100,1,'2026-07-13 17:12:33',NULL,NULL,'批量自主停机/复机第一版权限'), +(338,'下载Excel自主复机模板',257,1,NULL,13,'',NULL,NULL,1,0,'F','0','0','iot:tSimCardStart:excel:template','#',100,1,'2026-07-13 17:12:33',NULL,NULL,'批量自主停机/复机第一版权限'), +(339,'提交Excel自主复机批次',257,1,NULL,14,'',NULL,NULL,1,0,'F','0','0','iot:tSimCardStart:excel:submit','#',100,1,'2026-07-13 17:12:33',NULL,NULL,'批量自主停机/复机第一版权限'), +(340,'提交批量输入自主复机',257,1,NULL,15,'',NULL,NULL,1,0,'F','0','0','iot:tSimCardStart:input:submit','#',100,1,'2026-07-13 17:12:33',NULL,NULL,'批量自主停机/复机第一版权限'), +(341,'获取企业客户财务信息列表',305,1,NULL,1,'','','',1,0,'F','0','0','gen:tAgentBalance:list','',100,1,'2026-07-14 10:46:16',1,'2026-07-14 10:46:16',''), +(342,'获取当前登录企业账户余额',305,1,NULL,1,'','','',1,0,'F','0','0','common:tAgentBalance:getAccountBalance','',100,1,'2026-07-14 10:48:02',1,'2026-07-14 10:48:02',''), +(343,'获取账户总览折线图',305,1,NULL,1,'','','',1,0,'F','0','0','common:tAgentBalance:accountTrend','',100,1,'2026-07-14 10:48:52',1,'2026-07-14 10:48:52',''), +(344,'套餐详情查询',153,1,NULL,1,'','','',1,0,'F','0','0','iot:tSimCardBindPkg:getPkgInfo','',100,1,'2026-07-16 09:51:06',1,'2026-07-16 09:51:06',''), +(345,'获取订购表列表',153,1,NULL,1,'','','',1,0,'F','0','0','iot:tSimCardBindPkg:list','',100,1,'2026-07-16 09:51:45',1,'2026-07-16 09:51:45',''), +(346,'变更套餐查询',153,1,NULL,1,'','','',1,0,'F','0','0','iot:tSimCardBindPkg:getChangePkg','',100,1,'2026-07-16 09:52:19',1,'2026-07-16 09:52:19',''), +(347,'获取企业客户企业认证信息',197,1,NULL,1,'','','',1,0,'F','0','0','agent:tAgentEnterprise:view','',100,1,'2026-07-17 16:01:07',1,'2026-07-17 16:01:07',''), +(348,'通道列表',153,1,NULL,1,'','','',1,0,'F','0','0','iot:tSimChannels:list','',100,1,'2026-07-20 15:14:43',1,'2026-07-20 15:14:43',''), +(349,'财务申请表列表',359,2,'tr_2007 ',1,'tFinanceApply','common/tFinanceApply/index','',1,0,'C','0','0','common:tFinanceApply:list','ant-design:home-twotone',103,1,'2026-07-22 14:12:55',1,'2026-07-22 15:24:56',''), +(350,'财务申请表详情',349,3,'tr_2007 tr_2008 ',10,'','','',1,0,'F','0','0','common:tFinanceApply:view','',103,1,'2026-07-22 14:12:55',1,'2026-07-22 15:25:23',''), +(351,'编辑/新增财务申请表',349,3,'tr_2007 tr_2008 ',10,'','','',1,0,'F','0','0','common:tFinanceApply:edit','',103,1,'2026-07-22 14:12:55',1,'2026-07-22 15:25:37',''), +(352,'删除财务申请表',349,3,'tr_2007 tr_2008 ',10,'','','',1,0,'F','0','0','common:tFinanceApply:delete','',103,1,'2026-07-22 14:12:55',1,'2026-07-22 15:25:52',''), +(353,'导出财务申请表',349,3,'tr_2007 tr_2008 ',10,'','','',1,0,'F','0','0','common:tFinanceApply:export','',103,1,'2026-07-22 14:12:55',1,'2026-07-22 15:26:11',''), +(354,'财务审核记录表',359,1,'',1,'tFinanceAuditRecord','common/tFinanceAuditRecord/index.vue','',1,0,'C','0','0','common:tFinanceAuditRecord:list','ant-design:home-twotone',103,1,'2026-07-22 14:13:55',1,'2026-07-22 15:10:22',''), +(355,'财务审核记录表详情',354,3,'tr_2013 tr_2014 ',10,'','','',1,0,'F','0','0','common:tFinanceAuditRecord:view','',103,1,'2026-07-22 14:13:55',1,'2026-07-22 15:21:20',''), +(356,'编辑/新增财务审核记录表',354,3,'tr_2013 tr_2014 ',10,'','','',1,0,'F','0','0','common:tFinanceAuditRecord:edit','',103,1,'2026-07-22 14:13:55',1,'2026-07-22 15:24:04',''), +(357,'删除财务审核记录表',354,3,'tr_2013 tr_2014 ',10,'','','',1,0,'F','0','0','common:tFinanceAuditRecord:delete','',103,1,'2026-07-22 14:13:55',1,'2026-07-22 15:26:33',''), +(358,'导出财务审核记录表',354,3,'tr_2013 tr_2014 ',10,'','','',1,0,'F','0','0','common:tFinanceAuditRecord:export','',103,1,'2026-07-22 14:13:55',1,'2026-07-22 15:27:03',''), +(359,'审核',196,1,NULL,13,'Finance','','',1,0,'M','0','0','','ant-design:database-filled',100,1,'2026-07-22 15:01:03',1,'2026-07-22 15:01:03',''), +(360,'获取财务审核记录表指定信息',354,1,NULL,1,'','','',1,0,'F','0','0','common:tFinanceAuditRecord:view','',100,1,'2026-07-22 15:15:18',1,'2026-07-22 15:15:18',''), +(361,'发起余额转可提现申请',305,1,NULL,1,'','','',1,0,'F','0','0','common:tAgentBalance:balanceTransferApply','',100,1,'2026-07-23 14:51:40',1,'2026-07-23 14:51:40',''), +(362,'通知日志列表',372,2,'tr_2023 ',10,'NotifyLog','common/tNotifyLog/index.vue','',1,0,'C','0','0','common:tNotifyLog:list','ant-design:home-twotone',103,1,'2026-07-24 14:29:57',1,'2026-07-24 15:32:46',''), +(363,'通知日志详情',362,3,'tr_2023 tr_2024 ',10,'','','',1,0,'F','0','0','common:tNotifyLog:view','',103,1,'2026-07-24 14:29:57',1,'2026-07-24 15:35:49',''), +(364,'编辑/新增通知日志',362,3,'tr_2023 tr_2024 ',10,'','','',1,0,'F','0','0','common:tNotifyLog:edit','',103,1,'2026-07-24 14:29:57',1,'2026-07-24 15:36:00',''), +(365,'删除通知日志',362,3,'tr_2023 tr_2024 ',10,'','','',1,0,'F','0','0','common:tNotifyLog:delete','',103,1,'2026-07-24 14:29:57',1,'2026-07-24 15:36:12',''), +(366,'导出通知日志',362,3,'tr_2023 tr_2024 ',10,'','','',1,0,'F','0','0','common:tNotifyLog:export','',103,1,'2026-07-24 14:29:57',1,'2026-07-24 15:36:24',''), +(367,'消息日志列表',372,2,'tr_2029 ',10,'tMessageLog','common/tMessageLog/index','',1,0,'C','0','0','common:tMessageLog:list','ant-design:home-twotone',103,1,'2026-07-24 14:30:34',1,'2026-07-24 15:33:49',''), +(368,'消息日志详情',367,3,'tr_2029 tr_2030 ',10,'','','',1,0,'F','0','0','common:tMessageLog:view','',103,1,'2026-07-24 14:30:34',1,'2026-07-24 15:36:34',''), +(369,'编辑/新增消息日志',367,3,'tr_2029 tr_2030 ',10,'','','',1,0,'F','0','0','common:tMessageLog:edit','',103,1,'2026-07-24 14:30:34',1,'2026-07-24 15:36:47',''), +(370,'删除消息日志',367,3,'tr_2029 tr_2030 ',10,'','','',1,0,'F','0','0','common:tMessageLog:delete','',103,1,'2026-07-24 14:30:34',1,'2026-07-24 15:36:58',''), +(371,'导出消息日志',367,3,'tr_2029 tr_2030 ',10,'','','',1,0,'F','0','0','common:tMessageLog:export','',103,1,'2026-07-24 14:30:34',1,'2026-07-24 15:37:09',''), +(372,'通知管理',0,1,NULL,20,'notify','','',1,0,'M','0','0','','',100,1,'2026-07-24 14:57:43',1,'2026-07-24 14:57:43',''), +(373,'下载Excel自主重启模板',257,1,NULL,1,'',NULL,NULL,1,0,'F','0','0','iot:tSimCardRestart:excel:template','#',NULL,NULL,NULL,NULL,NULL,''), +(374,'提交Excel自主重启批次',257,1,NULL,2,'',NULL,NULL,1,0,'F','0','0','iot:tSimCardRestart:excel:submit','#',NULL,NULL,NULL,NULL,NULL,''), +(375,'提交批量输入自主重启',257,1,NULL,3,'',NULL,NULL,1,0,'F','0','0','iot:tSimCardRestart:input:submit','#',NULL,NULL,NULL,NULL,NULL,''), +(376,'下载Excel数据服务开通模板',257,1,NULL,1,'',NULL,NULL,1,0,'F','0','0','iot:tSimCardDataStart:excel:template','#',NULL,NULL,NULL,NULL,NULL,''), +(377,'提交Excel数据服务开通',257,1,NULL,2,'',NULL,NULL,1,0,'F','0','0','iot:tSimCardDataStart:excel:submit','#',NULL,NULL,NULL,NULL,NULL,''), +(378,'提交批量输入数据服务开通',257,1,NULL,3,'',NULL,NULL,1,0,'F','0','0','iot:tSimCardDataStart:input:submit','#',NULL,NULL,NULL,NULL,NULL,''), +(379,'下载Excel数据服务停用模板',257,1,NULL,1,'',NULL,NULL,1,0,'F','0','0','iot:tSimCardDataStop:excel:template','#',NULL,NULL,NULL,NULL,NULL,''), +(380,'提交Excel数据服务停用',257,1,NULL,2,'',NULL,NULL,1,0,'F','0','0','iot:tSimCardDataStop:excel:submit','#',NULL,NULL,NULL,NULL,NULL,''), +(381,'提交批量输入数据服务停用',257,1,NULL,3,'',NULL,NULL,1,0,'F','0','0','iot:tSimCardDataStop:input:submit','#',NULL,NULL,NULL,NULL,NULL,''), +(382,'查询卡续费预处理结果',257,1,NULL,5,'',NULL,NULL,1,0,'F','0','0','iot:tSimCardRenew:prepare:result','#',NULL,NULL,NULL,NULL,NULL,''), +(383,'查询卡变更预处理结果',257,1,NULL,6,'',NULL,NULL,1,0,'F','0','0','iot:tSimCardChange:prepare:result','#',NULL,NULL,NULL,NULL,NULL,''), +(384,'下载预警配置Excel模板',257,1,NULL,16,'','','',1,0,'F','0','0','iot:tSimWarningConfig:excel:template','',100,1,'2026-07-27 10:54:26',1,'2026-07-27 10:54:51',''), +(385,'批量输入预警配置',257,1,NULL,17,'','','',1,0,'F','0','0','iot:tSimWarningConfig:input:submit','',100,1,'2026-07-27 10:55:27',1,'2026-07-27 10:57:10',''), +(386,'连号预警配置',257,1,NULL,18,'','','',1,0,'F','0','0','iot:tSimWarningConfig:range:submit','',100,1,'2026-07-27 10:55:54',1,'2026-07-27 10:56:47',''), +(387,'提交预警配置Excel',257,1,NULL,19,'','','',1,0,'F','0','0','iot:tSimWarningConfig:excel:submit','',100,1,'2026-07-27 10:58:02',1,'2026-07-27 10:58:02',''), +(388,'预警中心',0,1,NULL,4,'tWarnCenter','','',1,0,'M','0','0','','ant-design:alert-outlined',100,1,'2026-07-29 16:09:35',1,'2026-07-31 14:48:17',''), +(389,'卡配置',388,1,NULL,1,'cardConfig','iotlcm/tWarnCenter/cardConfig/index','',1,0,'C','0','0','iot:simWarningConfig:list','ant-design:credit-card-outlined',100,1,'2026-07-29 16:10:23',1,'2026-07-29 16:27:38',''), +(390,'流量池配置',388,1,NULL,1,'flowPoolConfig','iotlcm/tWarnCenter/flowPoolConfig/index','',1,0,'C','0','0','iot:simWarningConfig:list','ant-design:fund-outlined',100,1,'2026-07-29 16:12:06',1,'2026-07-29 16:27:53',''), +(391,'查看',389,1,NULL,1,'','','',1,0,'F','0','0','iot:simWarningConfig:view','',100,1,'2026-07-29 16:12:24',1,'2026-07-29 16:27:46',''), +(392,'查看',390,1,NULL,1,'','','',1,0,'F','0','0','iot:simWarningConfig:view','',100,1,'2026-07-29 16:12:39',1,'2026-07-29 16:28:20',''), +(393,'新增/修改',389,1,NULL,2,'','','',1,0,'F','0','0','iot:simWarningConfig:save','',100,1,'2026-07-29 16:13:03',1,'2026-07-29 16:28:01',''), +(394,'新增/查看',390,1,NULL,2,'','','',1,0,'F','0','0','iot:simWarningConfig:save','',100,1,'2026-07-29 16:13:23',1,'2026-07-29 16:28:26',''), +(395,'启用/停用',390,1,NULL,3,'','','',1,0,'F','0','0','iot:simWarningConfig:status','',100,1,'2026-07-29 16:14:14',1,'2026-07-29 16:28:34',''), +(396,'启用/停用',389,1,NULL,3,'','','',1,0,'F','0','0','iot:simWarningConfig:status','',100,1,'2026-07-29 16:14:35',1,'2026-07-29 16:28:08',''), +(397,'删除',389,1,NULL,4,'','','',1,0,'F','0','0','iot:simWarningConfig:delete','',100,1,'2026-07-29 16:14:52',1,'2026-07-29 16:28:14',''), +(398,'删除',390,1,NULL,4,'','','',1,0,'F','0','0','iot:simWarningConfig:delete','',100,1,'2026-07-29 16:15:01',1,'2026-07-29 16:28:41',''), +(399,'销户卡信息',177,2,'tr_1762 ',20,'tSimCardCancellation','iotlcm/tLifeCycle/tSimCardCancellation/index','',1,0,'C','0','0','iot:tSimCardCancellation:list','ant-design:credit-card-outlined',103,1,'2026-08-03 08:33:29',NULL,NULL,'销户卡只读查询'), +(400,'导出销户卡信息',399,3,'tr_1762 tr_2090 ',10,'','','',1,0,'F','0','0','iot:tSimCardCancellation:export','',103,1,'2026-08-03 08:33:29',NULL,NULL,'导出销户卡信息'), +(401,'划拨目标客户',257,1,NULL,20,'','','',1,0,'F','0','0','iot:tSimCardAllocate:targets','',100,1,'2026-08-04 09:03:53',1,'2026-08-04 09:03:53',''), +(402,'划拨下载模板',257,1,NULL,20,'','','',1,0,'F','0','0','iot:tSimCardAllocate:excel:template','',100,1,'2026-08-04 09:04:14',1,'2026-08-04 09:04:14',''), +(403,'划拨批量输入校验',257,1,NULL,20,'','','',1,0,'F','0','0','iot:tSimCardAllocate:input:prepare','',100,1,'2026-08-04 09:04:35',1,'2026-08-04 09:04:35',''), +(404,'划拨Excel校验 ',257,1,NULL,20,'','','',1,0,'F','0','0','iot:tSimCardAllocate:excel:submit','',100,1,'2026-08-04 09:04:50',1,'2026-08-04 09:04:50',''), +(405,'划拨确认提交',257,1,NULL,20,'','','',1,0,'F','0','0','iot:tSimCardAllocate:batch:submit','',100,1,'2026-08-04 09:05:06',1,'2026-08-04 09:05:06',''), +(406,'我的订单',196,2,'tr_2098 ',10,'iotlcm/tOrder','iotlcm/tOrder/index','',1,0,'C','0','0','iot:tOrder:list','ant-design:home-twotone',103,1,'2026-08-04 09:50:00',1,'2026-08-04 13:33:27',''), +(407,'订单主表详情',406,3,'tr_2098 tr_2099 ',10,'','','',1,0,'F','0','0','iot:tOrder:view','',103,1,'2026-08-04 09:50:00',1,'2026-08-04 10:55:24',''), +(408,'编辑/新增订单主表',406,3,'tr_2098 tr_2099 ',10,'','','',1,0,'F','0','0','iot:tOrder:edit','',103,1,'2026-08-04 09:50:00',1,'2026-08-04 10:55:34',''), +(409,'删除订单主表',406,3,'tr_2098 tr_2099 ',10,'','','',1,0,'F','0','0','iot:tOrder:delete','',103,1,'2026-08-04 09:50:00',1,'2026-08-04 10:55:41',''), +(410,'导出订单主表',406,3,'tr_2098 tr_2099 ',10,'','','',1,0,'F','0','0','iot:tOrder:export','',103,1,'2026-08-04 09:50:00',1,'2026-08-04 10:55:50',''), +(411,'流量池套餐配置',178,2,'tr_2104 ',32,'tFlowPackageConfig','iotlcm/tFlowPackageConfig/index.vue','',1,0,'C','0','0','iotv:tFlowPackageConfig:list','ant-design:home-twotone',103,1,'2026-08-05 09:44:58',1,'2026-08-06 10:09:56',''), +(412,'SIM流量池套餐配置表详情',411,3,'tr_2104 tr_2105 ',10,'','','',1,0,'F','0','0','iot:tFlowPackageConfig:view','',103,1,'2026-08-05 09:44:58',1,'2026-08-05 10:37:38',''), +(413,'编辑/新增SIM流量池套餐配置表',411,3,'tr_2104 tr_2105 ',10,'','','',1,0,'F','0','0','iot:tFlowPackageConfig:edit','',103,1,'2026-08-05 09:44:58',1,'2026-08-05 10:38:00',''), +(414,'删除SIM流量池套餐配置表',411,3,'tr_2104 tr_2105 ',10,'','','',1,0,'F','0','0','iot:tFlowPackageConfig:delete','',103,1,'2026-08-05 09:44:58',1,'2026-08-05 10:38:22',''), +(415,'导出SIM流量池套餐配置表',411,3,'tr_2104 tr_2105 ',10,'','','',1,0,'F','0','0','iot:tFlowPackageConfig:export','',103,1,'2026-08-05 09:44:58',1,'2026-08-05 10:38:35',''), +(416,'达量断网',176,1,NULL,32,'tSimCardTrafficCutoff','iotlcm/tCommunication/tSimCardTrafficCutoff/index','',1,0,'C','0','0','','ant-design:api-outlined',100,1,'2026-08-05 13:11:25',1,'2026-08-05 13:13:05',''), +(417,'达量断网卡信息列表',416,1,NULL,1,'','','',1,0,'F','0','0','iot:tSimCardTrafficCutoff:list','',100,1,'2026-08-05 13:12:19',1,'2026-08-05 13:12:19',''), +(418,'达量断网卡信息编辑',416,1,NULL,1,'','','',1,0,'F','0','0','iot:tSimCardTrafficCutoff:edit','',100,1,'2026-08-05 13:13:39',1,'2026-08-05 13:20:13',''), +(419,'达量断网卡信息删除',416,1,NULL,1,'','','',1,0,'F','0','0','iot:tSimCardTrafficCutoff:delete','',100,1,'2026-08-05 13:14:15',1,'2026-08-05 13:14:15',''), +(420,'达量断网卡信息导出',416,1,NULL,1,'','','',1,0,'F','0','0','iot:tSimCardTrafficCutoff:export','',100,1,'2026-08-05 14:07:32',1,'2026-08-05 14:07:32',''); + +INSERT INTO `sys_dict_data` (`dict_code`, `tenant_id`, `dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `created_dept`, `created_by`, `created_at`, `updated_by`, `updated_at`, `remark`) VALUES +(1,'000000',1,'男','0','sys_user_sex','','','Y',103,1,'2025-02-13 11:56:36',NULL,NULL,'性别男'), +(2,'000000',2,'女','1','sys_user_sex','','','N',103,1,'2025-02-13 11:56:36',NULL,NULL,'性别女'), +(3,'000000',3,'未知','2','sys_user_sex','','','N',103,1,'2025-02-13 11:56:36',NULL,NULL,'性别未知'), +(4,'000000',1,'显示','0','sys_show_hide','','primary','Y',103,1,'2025-02-13 11:56:36',NULL,NULL,'显示菜单'), +(5,'000000',2,'隐藏','1','sys_show_hide','','danger','N',103,1,'2025-02-13 11:56:36',NULL,NULL,'隐藏菜单'), +(6,'000000',1,'正常','0','sys_normal_disable','','primary','',103,1,'2025-02-13 11:56:36',1,'2026-05-28 14:36:42','正常状态'), +(7,'000000',2,'停用','1','sys_normal_disable','','danger','',103,1,'2025-02-13 11:56:36',1,'2026-05-28 14:36:36','停用状态'), +(8,'000000',1,'是','Y','sys_yes_no','','primary','Y',103,1,'2025-02-13 11:56:36',NULL,NULL,'系统默认是'), +(9,'000000',2,'否','N','sys_yes_no','','danger','N',103,1,'2025-02-13 11:56:36',NULL,NULL,'系统默认否'), +(10,'000000',1,'通知','1','sys_notice_type','','warning','Y',103,1,'2025-02-13 11:56:36',NULL,NULL,'通知'), +(11,'000000',2,'公告','2','sys_notice_type','','success','N',103,1,'2025-02-13 11:56:36',NULL,NULL,'公告'), +(12,'000000',1,'正常','0','sys_notice_status','','primary','Y',103,1,'2025-02-13 11:56:36',NULL,NULL,'正常状态'), +(13,'000000',2,'关闭','1','sys_notice_status','','danger','N',103,1,'2025-02-13 11:56:36',NULL,NULL,'关闭状态'), +(14,'000000',1,'新增','1','sys_oper_type','','info','N',103,1,'2025-02-13 11:56:36',NULL,NULL,'新增操作'), +(15,'000000',2,'修改','2','sys_oper_type','','info','N',103,1,'2025-02-13 11:56:36',NULL,NULL,'修改操作'), +(16,'000000',3,'删除','3','sys_oper_type','','danger','N',103,1,'2025-02-13 11:56:36',NULL,NULL,'删除操作'), +(17,'000000',4,'授权','4','sys_oper_type','','primary','N',103,1,'2025-02-13 11:56:36',NULL,NULL,'授权操作'), +(18,'000000',5,'导出','5','sys_oper_type','','warning','N',103,1,'2025-02-13 11:56:36',NULL,NULL,'导出操作'), +(19,'000000',6,'导入','6','sys_oper_type','','warning','N',103,1,'2025-02-13 11:56:36',NULL,NULL,'导入操作'), +(20,'000000',7,'强退','7','sys_oper_type','','danger','N',103,1,'2025-02-13 11:56:36',NULL,NULL,'强退操作'), +(21,'000000',8,'生成代码','8','sys_oper_type','','warning','N',103,1,'2025-02-13 11:56:36',NULL,NULL,'生成操作'), +(22,'000000',9,'清空数据','9','sys_oper_type','','danger','N',103,1,'2025-02-13 11:56:36',NULL,NULL,'清空操作'), +(23,'000000',1,'成功','0','sys_common_status','','primary','N',103,1,'2025-02-13 11:56:36',NULL,NULL,'正常状态'), +(24,'000000',2,'失败','1','sys_common_status','','danger','N',103,1,'2025-02-13 11:56:36',NULL,NULL,'停用状态'), +(25,'000000',99,'其他','0','sys_oper_type','','info','N',103,1,'2025-02-13 11:56:36',NULL,NULL,'其他操作'), +(26,'000000',0,'密码认证','password','sys_grant_type','el-check-tag','default','N',103,1,'2025-02-13 11:56:36',NULL,NULL,'密码认证'), +(27,'000000',0,'短信认证','sms','sys_grant_type','el-check-tag','default','N',103,1,'2025-02-13 11:56:36',NULL,NULL,'短信认证'), +(28,'000000',0,'邮件认证','email','sys_grant_type','el-check-tag','default','N',103,1,'2025-02-13 11:56:36',NULL,NULL,'邮件认证'), +(29,'000000',0,'小程序认证','xcx','sys_grant_type','el-check-tag','default','N',103,1,'2025-02-13 11:56:36',NULL,NULL,'小程序认证'), +(30,'000000',0,'三方登录认证','social','sys_grant_type','el-check-tag','default','N',103,1,'2025-02-13 11:56:36',NULL,NULL,'三方登录认证'), +(31,'000000',0,'PC','pc','sys_device_type','','default','N',103,1,'2025-02-13 11:56:36',NULL,NULL,'PC'), +(32,'000000',0,'安卓','android','sys_device_type','','default','N',103,1,'2025-02-13 11:56:36',NULL,NULL,'安卓'), +(33,'000000',0,'iOS','ios','sys_device_type','','default','N',103,1,'2025-02-13 11:56:36',NULL,NULL,'iOS'), +(34,'000000',0,'小程序','xcx','sys_device_type','','default','N',103,1,'2025-02-13 11:56:36',NULL,NULL,'小程序'), +(35,'000000',55,'22','33','addd','44','22','',103,1,'2025-03-05 12:59:35',NULL,'2025-03-05 12:59:35','44'), +(36,'000000',1,'是','0','sys_yes_no_num','','primary','',103,1,'2025-03-13 16:42:15',1,'2025-03-13 16:42:50',''), +(37,'000000',2,'否','1','sys_yes_no_num','','danger','',103,1,'2025-03-13 16:42:28',1,'2025-03-13 16:43:06',''), +(38,'000000',1,'私有','0','oss_access_policy','','orange','',103,1,'2025-03-13 16:55:30',NULL,'2025-03-13 16:55:30',''), +(39,'000000',2,'公开','1','oss_access_policy','','primary','',103,1,'2025-03-13 16:55:52',NULL,'2025-03-13 16:55:52',''), +(40,'000000',3,'自定义','2','oss_access_policy','','','',103,1,'2025-03-13 16:56:17',NULL,'2025-03-13 16:56:17',''), +(41,'000000',1,'生成成功','0','sys_gen_status','','success','',103,1,'2025-03-18 14:27:50',NULL,'2025-03-18 14:27:50',''), +(42,'000000',2,'未生成','1','sys_gen_status','','','',103,1,'2025-03-18 14:28:09',1,'2025-03-20 11:21:25',''), +(43,'000000',3,'生成失败','2','sys_gen_status','','danger','',103,1,'2025-03-18 14:28:24',1,'2025-03-18 14:28:43',''), +(44,'000000',1,'默认','0','sys_job_group','','','',101,11,'2025-03-19 17:37:14',11,'2025-03-19 17:37:41',''), +(45,'000000',1,'系统','1','sys_job_group','','','',101,11,'2025-03-19 17:37:34',NULL,'2025-03-19 17:37:34',''), +(46,'000000',2,'数据中心','2','sys_job_group','','','',101,11,'2025-03-19 17:37:55',NULL,'2025-03-19 17:37:55',''), +(47,'000000',1,'多次执行','1','sys_missfire_policy','','','',101,11,'2025-03-19 17:38:55',NULL,'2025-03-19 17:38:55',''), +(48,'000000',2,'执行一次','2','sys_missfire_policy','','','',101,11,'2025-03-19 17:39:04',NULL,'2025-03-19 17:39:04',''), +(49,'000000',1,'允许','0','sys_job_concurrent','','','',101,11,'2025-03-20 11:25:29',NULL,'2025-03-20 11:25:29',''), +(50,'000000',2,'禁止','1','sys_job_concurrent','','','',101,11,'2025-03-20 11:25:41',NULL,'2025-03-20 11:25:41',''), +(51,'000000',0,'部门','0','sys_dept_type','','','',103,1,'2026-05-24 22:43:24',NULL,'2026-05-24 22:43:24',''), +(52,'000000',1,'公司','1','sys_dept_type','','green','',103,1,'2026-05-24 22:43:42',NULL,'2026-05-24 22:43:42',''), +(53,'000000',1,'未启用','0','system_enabled_status','','warning','',103,1,'2026-05-27 14:34:09',1,'2026-05-27 14:40:07',''), +(54,'000000',2,'启用','1','system_enabled_status','','primary','',103,1,'2026-05-27 14:34:22',1,'2026-05-27 14:39:39',''), +(55,'000000',1,'卡套餐','101','t_sim_flow_package_info','','','',103,1,'2026-05-27 15:06:35',NULL,'2026-05-27 15:06:35',''), +(56,'000000',2,'池套餐','102','t_sim_flow_package_info','','','',103,1,'2026-05-27 15:06:58',NULL,'2026-05-27 15:06:58',''), +(57,'000000',3,'单卡加油包','103','t_sim_flow_package_info','','','',103,1,'2026-05-27 15:07:23',NULL,'2026-05-27 15:07:23',''), +(58,'000000',4,'池卡加油包','104','t_sim_flow_package_info','','','',103,1,'2026-05-27 15:07:50',NULL,'2026-05-27 15:07:50',''), +(59,'000000',1,'月','1','billing_method','','','',103,1,'2026-05-28 10:20:10',NULL,'2026-05-28 10:20:10',''), +(60,'000000',2,'年','2','billing_method','','','',103,1,'2026-05-28 10:20:20',NULL,'2026-05-28 10:20:20',''), +(61,'000000',1,'单卡流量套餐','101','package_type','','','',103,1,'2026-05-28 11:10:13',1,'2026-05-28 11:11:18',''), +(62,'000000',2,'池卡流量套餐','102','package_type','','','',103,1,'2026-05-28 11:10:31',NULL,'2026-05-28 11:10:31',''), +(63,'000000',3,'单卡流量加油包','103','package_type','','','',103,1,'2026-05-28 11:10:49',NULL,'2026-05-28 11:10:49',''), +(64,'000000',4,'池卡流量加油包','104','package_type','','','',103,1,'2026-05-28 11:11:12',NULL,'2026-05-28 11:11:12',''), +(65,'000000',5,'单卡短信套餐','201','package_type','','','',103,1,'2026-05-28 11:11:48',NULL,'2026-05-28 11:11:48',''), +(66,'000000',6,'单卡短信加油包','203','package_type','','','',103,1,'2026-05-28 11:12:09',1,'2026-05-28 11:12:18',''), +(67,'000000',7,'单卡语音套餐','301','package_type','','','',103,1,'2026-05-28 11:12:46',NULL,'2026-05-28 11:12:46',''), +(68,'000000',8,'单卡语音加油包','303','package_type','','','',103,1,'2026-05-28 11:13:20',NULL,'2026-05-28 11:13:20',''), +(69,'000000',8,'单卡国漫套餐','401','package_type','','','',103,1,'2026-05-28 11:14:01',NULL,'2026-05-28 11:14:01',''), +(70,'000000',9,'单卡国漫加油包','403','package_type','','','',103,1,'2026-05-28 11:14:17',NULL,'2026-05-28 11:14:17',''), +(71,'000000',1,'所有客户','0','agent_scope_type','','','',103,1,'2026-06-01 20:42:42',NULL,'2026-06-01 20:42:42',''), +(72,'000000',2,'指定客户','1','agent_scope_type','','','',103,1,'2026-06-01 20:42:58',NULL,'2026-06-01 20:42:58',''), +(73,'000000',1,'移动','1','operators','','','',103,1,'2026-06-02 15:43:21',1,'2026-06-02 16:59:30',''), +(74,'000000',2,'联通','2','operators','','','',103,1,'2026-06-02 15:43:37',1,'2026-06-02 16:59:40',''), +(75,'000000',3,'电信','3','operators','','','',103,1,'2026-06-02 15:44:12',1,'2026-06-02 16:59:47',''), +(76,'000000',1,'待激活 ','1','boss_card_status','','primary','',103,1,'2026-06-03 10:49:08',1,'2026-06-03 10:49:19',''), +(77,'000000',1,'已激活 ','2','boss_card_status','','','',103,1,'2026-06-03 10:49:36',NULL,'2026-06-03 10:49:36',''), +(78,'000000',1,'停机 ','4','boss_card_status','','','',103,1,'2026-06-03 10:50:12',NULL,'2026-06-03 10:50:12',''), +(79,'000000',1,'可测试','6','boss_card_status','','','',103,1,'2026-06-03 10:50:36',NULL,'2026-06-03 10:50:36',''), +(80,'000000',1,'库存 ','7','boss_card_status','','','',103,1,'2026-06-03 10:50:57',NULL,'2026-06-03 10:50:57',''), +(81,'000000',1,'预销户 ','8','boss_card_status','','','',103,1,'2026-06-03 10:51:18',NULL,'2026-06-03 10:51:18',''), +(82,'000000',1,'已销户 ','9','boss_card_status','','','',103,1,'2026-06-03 10:51:37',NULL,'2026-06-03 10:51:37',''), +(83,'000000',1,'未知 ','0','boss_card_status','','','',103,1,'2026-06-03 10:51:54',NULL,'2026-06-03 10:51:54',''), +(84,'000000',1,'开卡时间','0','cardInfo_timeType','','','',103,1,'2026-06-04 09:14:45',NULL,'2026-06-04 09:14:45',''), +(85,'000000',1,'激活时间','1','cardInfo_timeType','','','',103,1,'2026-06-04 09:15:04',NULL,'2026-06-04 09:15:04',''), +(86,'000000',1,'入库时间','2','cardInfo_timeType','','','',103,1,'2026-06-04 09:15:18',NULL,'2026-06-04 09:15:18',''), +(87,'000000',1,'出库时间','3','cardInfo_timeType','','','',103,1,'2026-06-04 09:15:34',NULL,'2026-06-04 09:15:34',''), +(88,'000000',1,'到期时间','4','cardInfo_timeType','','','',103,1,'2026-06-04 09:15:51',NULL,'2026-06-04 09:15:51',''), +(89,'000000',1,'创建时间','5','cardInfo_timeType','','','',103,1,'2026-06-04 09:16:06',NULL,'2026-06-04 09:16:06',''), +(90,'000000',1,'流量同步时间','6','cardInfo_timeType','','','',103,1,'2026-06-04 09:16:20',NULL,'2026-06-04 09:16:20',''), +(91,'000000',1,'状态同步时间','7','cardInfo_timeType','','','',103,1,'2026-06-04 09:16:36',NULL,'2026-06-04 09:16:36',''), +(92,'000000',1,'年','2','t_billing_method','','primary','',103,1,'2026-06-04 09:35:43',NULL,'2026-06-04 09:35:43',''), +(93,'000000',0,'月','1','t_billing_method','','primary','',103,1,'2026-06-04 09:35:43',NULL,'2026-06-04 09:35:43',''), +(94,'000000',1,'指定客户','1','t_agent_scope_type','','primary','',103,1,'2026-06-04 09:36:05',NULL,'2026-06-04 09:36:05',''), +(95,'000000',0,'所有客户','0','t_agent_scope_type','','primary','',103,1,'2026-06-04 09:36:05',NULL,'2026-06-04 09:36:05',''), +(96,'000000',2,'电信','3','t_operators','','primary','',103,1,'2026-06-04 09:36:18',NULL,'2026-06-04 09:36:18',''), +(97,'000000',1,'联通','2','t_operators','','primary','',103,1,'2026-06-04 09:36:18',NULL,'2026-06-04 09:36:18',''), +(98,'000000',0,'移动','1','t_operators','','primary','',103,1,'2026-06-04 09:36:18',NULL,'2026-06-04 09:36:18',''), +(99,'000000',1,'MSISDN','msisdn','cardInfo_selectCondition','','','',103,1,'2026-06-04 10:29:57',NULL,'2026-06-04 10:29:57',''), +(100,'000000',1,'ICCID','iccid','cardInfo_selectCondition','','','',103,1,'2026-06-04 10:30:11',NULL,'2026-06-04 10:30:11',''), +(101,'000000',1,'IMSI','imis','cardInfo_selectCondition','','','',103,1,'2026-06-04 10:30:25',NULL,'2026-06-04 10:30:25',''), +(102,'000000',1,'IMEI','imei','cardInfo_selectCondition','','','',103,1,'2026-06-04 10:30:38',NULL,'2026-06-04 10:30:38',''), +(103,'000000',1,'使用流量','1','cardInfo_dimension','','','',103,1,'2026-06-04 10:41:36',NULL,'2026-06-04 10:41:36',''), +(104,'000000',1,'剩余流量','2','cardInfo_dimension','','','',103,1,'2026-06-04 10:41:50',NULL,'2026-06-04 10:41:50',''), +(105,'000000',1,'>=','>=','cardInfo_dimensionStatus','','','',103,1,'2026-06-04 10:44:04',1,'2026-06-04 10:58:25',''), +(106,'000000',1,'>','>','cardInfo_dimensionStatus','','','',103,1,'2026-06-04 10:44:23',1,'2026-06-04 10:58:31',''), +(107,'000000',1,'=','=','cardInfo_dimensionStatus','','','',103,1,'2026-06-04 10:44:32',1,'2026-06-04 10:58:37',''), +(108,'000000',1,'<','<','cardInfo_dimensionStatus','','','',103,1,'2026-06-04 10:44:42',1,'2026-06-04 10:58:43',''), +(109,'000000',1,'<=','<=','cardInfo_dimensionStatus','','','',103,1,'2026-06-04 10:44:53',1,'2026-06-04 10:58:48',''), +(110,'000000',1,'!=','!=','cardInfo_dimensionStatus','','','',103,1,'2026-06-04 10:45:05',1,'2026-06-04 10:58:54',''), +(111,'000000',1,'>=','>=','t_cardInfo_dimensionStatus','','default','',103,1,'2026-06-04 11:19:22',NULL,'2026-06-04 11:19:22',''), +(112,'000000',1,'=','=','t_cardInfo_dimensionStatus','','default','',103,1,'2026-06-04 11:19:33',NULL,'2026-06-04 11:19:33',''), +(113,'000000',1,'开卡时间','0','t_cardInfo_timeType','','default','',103,1,'2026-06-04 11:33:33',NULL,'2026-06-04 11:33:33',''), +(114,'000000',1,'激活时间','1','t_cardInfo_timeType','','default','',103,1,'2026-06-04 11:33:42',NULL,'2026-06-04 11:33:42',''), +(115,'000000',1,'入库时间','2','t_cardInfo_timeType','','default','',103,1,'2026-06-04 11:33:52',NULL,'2026-06-04 11:33:52',''), +(116,'000000',3,'出库时间','3','t_cardInfo_timeType','','default','',103,1,'2026-06-04 11:34:01',NULL,'2026-06-04 11:34:01',''), +(117,'000000',4,'到期时间','4','t_cardInfo_timeType','','default','',103,1,'2026-06-04 11:34:11',NULL,'2026-06-04 11:34:11',''), +(118,'000000',5,'创建时间','5','t_cardInfo_timeType','','default','',103,1,'2026-06-04 11:34:22',NULL,'2026-06-04 11:34:22',''), +(119,'000000',6,'流量同步时间','6','t_cardInfo_timeType','','default','',103,1,'2026-06-04 11:34:31',NULL,'2026-06-04 11:34:31',''), +(120,'000000',7,'状态同步时间','7','t_cardInfo_timeType','','default','',103,1,'2026-06-04 11:34:40',NULL,'2026-06-04 11:34:40',''), +(121,'000000',1,'MSISDN','msisdn','t_cardInfo_selectCondition','','default','',103,1,'2026-06-04 11:36:56',NULL,'2026-06-04 11:36:56',''), +(122,'000000',1,'ICCID','iccid','t_cardInfo_selectCondition','','default','',103,1,'2026-06-04 11:37:09',NULL,'2026-06-04 11:37:09',''), +(123,'000000',1,'IMSI','imsi','t_cardInfo_selectCondition','','default','',103,1,'2026-06-04 11:37:25',NULL,'2026-06-04 11:37:25',''), +(124,'000000',1,'IMEI','imei','t_cardInfo_selectCondition','','default','',103,1,'2026-06-04 11:37:37',NULL,'2026-06-04 11:37:37',''), +(125,'000000',1,'使用流量','1','t_cardInfo_dimension','','default','',103,1,'2026-06-04 11:44:06',NULL,'2026-06-04 11:44:06',''), +(126,'000000',1,'剩余流量','2','t_cardInfo_dimension','','default','',103,1,'2026-06-04 11:44:16',NULL,'2026-06-04 11:44:16',''), +(127,'000000',1,'>','>','t_cardInfo_dimensionStatus','','default','',103,1,'2026-06-04 11:45:17',NULL,'2026-06-04 11:45:17',''), +(128,'000000',1,'<','<','t_cardInfo_dimensionStatus','','default','',103,1,'2026-06-04 11:45:31',NULL,'2026-06-04 11:45:31',''), +(129,'000000',1,'<=','<=','t_cardInfo_dimensionStatus','','default','',103,1,'2026-06-04 11:45:38',NULL,'2026-06-04 11:45:38',''), +(130,'000000',1,'!=','!=','t_cardInfo_dimensionStatus','','default','',103,1,'2026-06-04 11:45:46',NULL,'2026-06-04 11:45:46',''), +(131,'000000',1,'iccid','1','t_cardInfo_sortValue','','default','',103,1,'2026-06-04 12:26:46',NULL,'2026-06-04 12:26:46',''), +(132,'000000',1,'msisdn','2','t_cardInfo_sortValue','','default','',103,1,'2026-06-04 12:27:26',NULL,'2026-06-04 12:27:26',''), +(133,'000000',1,'imsi','3','t_cardInfo_sortValue','','default','',103,1,'2026-06-04 12:27:47',NULL,'2026-06-04 12:27:47',''), +(134,'000000',1,'流量用量','4','t_cardInfo_sortValue','','default','',103,1,'2026-06-04 12:27:59',NULL,'2026-06-04 12:27:59',''), +(135,'000000',1,'激活日期','5','t_cardInfo_sortValue','','default','',103,1,'2026-06-04 12:28:09',NULL,'2026-06-04 12:28:09',''), +(136,'000000',1,'流量到期日期','6','t_cardInfo_sortValue','','default','',103,1,'2026-06-04 12:28:23',NULL,'2026-06-04 12:28:23',''), +(137,'000000',1,'状态同步日期','7','t_cardInfo_sortValue','','default','',103,1,'2026-06-04 12:28:35',NULL,'2026-06-04 12:28:35',''), +(138,'000000',1,'升序','0','t_cardInfo_sortType','','default','',103,1,'2026-06-04 13:01:11',NULL,'2026-06-04 13:01:11',''), +(139,'000000',1,'降序','1','t_cardInfo_sortType','','default','',103,1,'2026-06-04 13:01:22',NULL,'2026-06-04 13:01:22',''), +(140,'000000',1,'3G','1','t_net_model','','default','',103,1,'2026-06-04 14:30:39',NULL,'2026-06-04 14:30:39',''), +(141,'000000',1,'2G','2','t_net_model','','default','',103,1,'2026-06-04 14:30:58',NULL,'2026-06-04 14:30:58',''), +(142,'000000',1,'4G','3','t_net_model','','default','',103,1,'2026-06-04 14:31:12',NULL,'2026-06-04 14:31:12',''), +(143,'000000',1,'5G','4','t_net_model','','default','',103,1,'2026-06-04 14:31:24',NULL,'2026-06-04 14:31:24',''), +(144,'000000',1,'NB-IOT','5','t_net_model','','default','',103,1,'2026-06-04 14:31:43',NULL,'2026-06-04 14:31:43',''), +(145,'000000',1,'5G-SA','6','t_net_model','','default','',103,1,'2026-06-04 14:31:59',NULL,'2026-06-04 14:31:59',''), +(146,'000000',1,'5G-NSA','7','t_net_model','','default','',103,1,'2026-06-04 14:32:19',NULL,'2026-06-04 14:32:19',''), +(147,'000000',1,'2G/3G','8','t_net_model','','default','',103,1,'2026-06-04 14:32:34',NULL,'2026-06-04 14:32:34',''), +(148,'000000',1,'电信NB','9','t_net_model','','default','',103,1,'2026-06-04 14:32:55',NULL,'2026-06-04 14:32:55',''), +(149,'000000',1,'移动4G','10','t_net_model','','default','',103,1,'2026-06-04 14:33:17',NULL,'2026-06-04 14:33:17',''), +(150,'000000',1,'联通NB','11','t_net_model','','default','',103,1,'2026-06-04 14:33:51',NULL,'2026-06-04 14:33:51',''), +(151,'000000',1,'联通4G','12','t_net_model','','default','',103,1,'2026-06-04 14:34:12',NULL,'2026-06-04 14:34:12',''), +(152,'000000',1,'电信4G','13','t_net_model','','default','',103,1,'2026-06-04 14:34:29',NULL,'2026-06-04 14:34:29',''), +(153,'000000',1,'RedCap','14','t_net_model','','default','',103,1,'2026-06-04 14:35:05',NULL,'2026-06-04 14:35:05',''), +(154,'000000',2,'待激活','1','t_boss_card_status','','warning','',103,1,'2026-06-04 14:57:58',NULL,'2026-07-13 17:38:11',''), +(155,'000000',4,'已激活','2','t_boss_card_status','','success','',103,1,'2026-06-04 14:58:10',NULL,'2026-07-13 17:38:11',''), +(156,'000000',5,'停机','4','t_boss_card_status','','danger','',103,1,'2026-06-04 14:58:22',NULL,'2026-07-13 17:38:11',''), +(157,'000000',3,'可测试','6','t_boss_card_status','','info','',103,1,'2026-06-04 14:58:38',NULL,'2026-07-13 17:38:11',''), +(158,'000000',1,'库存','7','t_boss_card_status','','default','',103,1,'2026-06-04 14:58:49',NULL,'2026-07-13 17:38:11',''), +(159,'000000',6,'预销户','8','t_boss_card_status','','warning','',103,1,'2026-06-04 14:59:02',NULL,'2026-07-13 17:38:11',''), +(160,'000000',7,'已销户','9','t_boss_card_status','','info','',103,1,'2026-06-04 14:59:12',NULL,'2026-07-13 17:38:11',''), +(161,'000000',99,'未知','0','t_boss_card_status','','default','',103,1,'2026-06-04 14:59:25',NULL,'2026-07-13 17:38:11',''), +(162,'000000',2,'锁定','2','t_pool_status','','primary','',103,1,'2026-06-05 14:18:24',NULL,'2026-06-05 14:18:24',''), +(163,'000000',1,'停用','1','t_pool_status','','primary','',103,1,'2026-06-05 14:18:24',NULL,'2026-06-05 14:18:24',''), +(164,'000000',0,'正常','0','t_pool_status','','primary','',103,1,'2026-06-05 14:18:24',NULL,'2026-06-05 14:18:24',''), +(165,'000000',1,'停用','1','global_enable','','danger','',103,1,'2026-06-08 15:30:56',NULL,'2026-06-08 15:30:56',''), +(166,'000000',0,'启用','0','global_enable','','success','',103,1,'2026-06-08 15:30:56',NULL,'2026-06-08 15:30:56',''), +(167,'000000',1,'否','1','global_yes_or_no','','danger','',103,1,'2026-06-08 15:31:46',NULL,'2026-06-08 15:31:46',''), +(168,'000000',0,'是','0','global_yes_or_no','','success','',103,1,'2026-06-08 15:31:46',NULL,'2026-06-08 15:31:46',''), +(169,'000000',1,'待生成','0','download_status','','default','',103,1,'2026-06-12 10:04:29',NULL,'2026-06-12 10:04:29',''), +(170,'000000',2,'已生成','1','download_status','','default','',103,1,'2026-06-12 10:04:39',NULL,'2026-06-12 10:04:39',''), +(171,'000000',3,'生成失败','3','download_status','','default','',103,1,'2026-06-12 10:05:05',1,'2026-06-12 16:53:22',''), +(172,'000000',6,'工业级贴片物联卡','7','t_card_type','','primary','',103,1,'2026-06-12 13:12:22',1,'2026-08-10 13:09:38',''), +(173,'000000',5,'消费级贴片物联卡','6','t_card_type','','primary','',103,1,'2026-06-12 13:12:22',1,'2026-08-10 13:09:33',''), +(174,'000000',4,'工业级插拔物联卡','5','t_card_type','','primary','',103,1,'2026-06-12 13:12:22',1,'2026-08-10 13:09:26',''), +(175,'000000',3,'消费级插拔物联卡','4','t_card_type','','primary','',103,1,'2026-06-12 13:12:22',1,'2026-08-10 13:09:20',''), +(176,'000000',2,'贴片卡 2×2mm','3','t_card_type','','primary','',103,1,'2026-06-12 13:12:22',1,'2026-08-10 13:12:02',''), +(177,'000000',1,'贴片卡 5×6mm','2','t_card_type','','primary','',103,1,'2026-06-12 13:12:22',1,'2026-08-10 13:11:56',''), +(178,'000000',0,'通用插拔 SIM 卡','1','t_card_type','','primary','',103,1,'2026-06-12 13:12:22',1,'2026-08-10 13:07:39',''), +(179,'000000',3,'已过期','3','t_package_status','','primary','',103,1,'2026-06-12 13:14:56',NULL,'2026-06-12 13:14:56',''), +(180,'000000',2,'生效中','2','t_package_status','','primary','',103,1,'2026-06-12 13:14:56',NULL,'2026-06-12 13:14:56',''), +(181,'000000',1,'待生效','1','t_package_status','','primary','',103,1,'2026-06-12 13:14:56',NULL,'2026-06-12 13:14:56',''), +(182,'000000',0,'无套餐','0','t_package_status','','primary','',103,1,'2026-06-12 13:14:56',NULL,'2026-06-12 13:14:56',''), +(183,'000000',0,'生成中','2','download_status','','primary','N',103,1,'2026-06-12 16:53:22',NULL,'2026-06-12 16:53:22','结果文件生成中'), +(184,'000000',0,'Card','1','resource_type','','primary','N',103,1,'2026-06-12 16:53:22',NULL,'2026-06-12 16:53:22','批量结果 Excel 文件'), +(185,'000000',0,'卡入库结果','1','resource_export_scene','','primary','N',103,1,'2026-06-12 16:53:22',NULL,'2026-06-12 16:53:22','Excel 批量卡入库结果文件'), +(186,'000000',0,'卡出库结果','2','resource_export_scene','','primary','N',103,1,'2026-06-12 16:53:22',NULL,'2026-06-12 16:53:22','Excel 批量卡出库结果文件(预留)'), +(187,'000000',0,'卡划拨结果','3','resource_export_scene','','primary','N',103,1,'2026-06-12 16:53:22',NULL,'2026-06-12 16:53:22','Excel 批量卡划拨结果文件(预留)'), +(188,'000000',0,'成功','success','sim_card_inbound_import_status','','success','N',103,1,'2026-06-12 16:53:22',NULL,'2026-06-12 16:53:22','整批导入成功'), +(189,'000000',0,'失败','failed','sim_card_inbound_import_status','','danger','N',103,1,'2026-06-12 16:53:22',NULL,'2026-06-12 16:53:22','文件、校验或业务处理失败'), +(190,'000000',1,'本级默认','agentDefault','t_package_price_source','','primary','',100,26,'2026-06-22 14:15:49',NULL,'2026-06-22 14:15:49',''), +(191,'000000',0,'系统级','system','t_package_price_source','','primary','',100,26,'2026-06-22 14:15:49',1,'2026-06-22 14:32:50',''), +(192,'000000',3,'下级专属','target','t_package_price_source','','primary','',103,1,'2026-06-22 14:32:36',1,'2026-06-22 14:32:42',''), +(193,'000000',3,'文件','3','t_batch_source_type','','primary','',100,1,'2026-06-24 09:07:58',NULL,'2026-06-24 09:07:58',''), +(194,'000000',2,'批量输入','2','t_batch_source_type','','primary','',100,1,'2026-06-24 09:07:58',NULL,'2026-06-24 09:07:58',''), +(195,'000000',1,'连号','1','t_batch_source_type','','primary','',100,1,'2026-06-24 09:07:58',NULL,'2026-06-24 09:07:58',''), +(196,'000000',0,'批次选择','0','t_batch_source_type','','primary','',100,1,'2026-06-24 09:07:58',NULL,'2026-06-24 09:07:58',''), +(197,'000000',0,'启用','0','enabled',NULL,NULL,'Y',NULL,NULL,NULL,NULL,NULL,NULL), +(198,'000000',1,'停用','1','enabled',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(199,'000000',0,'显示','1','is_show',NULL,NULL,'Y',NULL,NULL,NULL,NULL,NULL,NULL), +(200,'000000',1,'不显示','0','is_show',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(201,'000000',0,'是','1','yesno_enum',NULL,NULL,'Y',NULL,NULL,NULL,NULL,NULL,NULL), +(202,'000000',1,'否','0','yesno_enum',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(203,'000000',0,'正常','0','sys_status',NULL,NULL,'Y',NULL,NULL,NULL,NULL,NULL,NULL), +(204,'000000',1,'停用','1','sys_status',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(205,'000000',0,'正常','0','batch_status',NULL,NULL,'Y',NULL,NULL,NULL,NULL,NULL,NULL), +(206,'000000',1,'废弃','1','batch_status',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(207,'000000',0,'待处理','0','process_status',NULL,NULL,'Y',NULL,NULL,NULL,NULL,NULL,NULL), +(208,'000000',1,'处理汇总','1','process_status',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(209,'000000',2,'成功','2','process_status',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(210,'000000',3,'失败','3','process_status',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(211,'000000',1,'卡订购','1','order_type','','primary','',NULL,NULL,NULL,1,'2026-07-09 16:24:04',''), +(212,'000000',2,'卡续费','2','order_type','','primary','',NULL,NULL,NULL,1,'2026-07-09 16:24:09',''), +(213,'000000',3,'卡变更','3','order_type','','primary','',NULL,NULL,NULL,1,'2026-07-09 16:24:15',''), +(214,'000000',0,'待确定,待支付','0','order_status',NULL,NULL,'Y',NULL,NULL,NULL,NULL,NULL,NULL), +(215,'000000',1,'已确定,待发货','1','order_status',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(216,'000000',2,'处理中,已发货','2','order_status',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(217,'000000',3,'已取消','3','order_status',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(218,'000000',4,'无效','4','order_status',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(219,'000000',5,'已完成','5','order_status',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(220,'000000',0,'未发货','0','shipping_status',NULL,NULL,'Y',NULL,NULL,NULL,NULL,NULL,NULL), +(221,'000000',1,'已发货','1','shipping_status',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(222,'000000',2,'已收货','2','shipping_status',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(223,'000000',4,'退货','4','shipping_status',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(224,'000000',0,'未退款','0','return_status',NULL,NULL,'Y',NULL,NULL,NULL,NULL,NULL,NULL), +(225,'000000',1,'待审核','1','return_status',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(226,'000000',2,'执行中','2','return_status',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(227,'000000',3,'部分退货','3','return_status',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(228,'000000',4,'退货成功','4','return_status',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(229,'000000',1,'物流','1','shipping_method',NULL,NULL,'Y',NULL,NULL,NULL,NULL,NULL,NULL), +(230,'000000',2,'商家自提','2','shipping_method',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(231,'000000',3,'无需配送','3','shipping_method',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(232,'000000',1,'固定运费','1','fixed_shipping_type',NULL,NULL,'Y',NULL,NULL,NULL,NULL,NULL,NULL), +(233,'000000',2,'手动填写运费','2','fixed_shipping_type',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(234,'000000',0,'订购','0','business_type',NULL,NULL,'Y',NULL,NULL,NULL,NULL,NULL,NULL), +(235,'000000',1,'变更','1','business_type',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(236,'000000',2,'续费','2','business_type',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(237,'000000',0,'待生效','0','effective_status','','default','',NULL,NULL,NULL,1,'2026-07-14 13:50:55',''), +(238,'000000',1,'生效中','1','effective_status','','primary','',NULL,NULL,NULL,1,'2026-07-14 13:50:49',''), +(239,'000000',2,'已过期','2','effective_status','','danger','',NULL,NULL,NULL,1,'2026-07-14 13:51:05',''), +(240,'000000',3,'已终止','3','effective_status',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(241,'000000',4,'已作废','4','effective_status',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(242,'000000',1,'上架','1','product_status',NULL,NULL,'Y',NULL,NULL,NULL,NULL,NULL,NULL), +(243,'000000',0,'下架','0','product_status',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(244,'000000',1,'卡','1','product_type',NULL,NULL,'Y',NULL,NULL,NULL,NULL,NULL,NULL), +(245,'000000',2,'模组','2','product_type',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(246,'000000',3,'设备','3','product_type',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(247,'000000',4,'普通商品','4','product_type',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(248,'000000',5,'虚拟商品','5','product_type',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(249,'000000',6,'卡密商品','6','product_type',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(250,'000000',7,'付费内容','7','product_type',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(251,'000000',0,'待审核','0','check_status',NULL,NULL,'Y',NULL,NULL,NULL,NULL,NULL,NULL), +(252,'000000',1,'审核通过','1','check_status',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(253,'000000',2,'审核未通过','2','check_status',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(254,'000000',1,'渠道用户','1','customer_type',NULL,NULL,'Y',NULL,NULL,NULL,NULL,NULL,NULL), +(255,'000000',2,'终端用户','2','customer_type',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(256,'000000',1,'在线支付','1','pay_type','','primary','',NULL,NULL,NULL,1,'2026-07-09 17:26:21',''), +(257,'000000',2,'货到付款','2','pay_type','','primary','',NULL,NULL,NULL,1,'2026-07-09 17:26:27',''), +(258,'000000',3,'线下支付','3','pay_type','','primary','',NULL,NULL,NULL,1,'2026-07-09 17:26:31',''), +(259,'000000',0,'未支付','0','pay_status',NULL,NULL,'Y',NULL,NULL,NULL,NULL,NULL,NULL), +(260,'000000',1,'支付中','1','pay_status',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(261,'000000',2,'已支付','2','pay_status',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(262,'000000',3,'退款中','3','pay_status',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(263,'000000',4,'部分退款','4','pay_status',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(264,'000000',5,'已退款','5','pay_status',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(265,'000000',0,'余额','0','repayment_method',NULL,NULL,'Y',NULL,NULL,NULL,NULL,NULL,NULL), +(266,'000000',1,'银行卡','1','repayment_method',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(267,'000000',2,'支付宝','2','repayment_method',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(268,'000000',3,'微信','3','repayment_method',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(269,'000000',0,'一次性购买','0','pay_mode',NULL,NULL,'Y',NULL,NULL,NULL,NULL,NULL,NULL), +(270,'000000',1,'包年包月','1','pay_mode',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(271,'000000',2,'按量付费','2','pay_mode',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(272,'000000',0,'未分成','0','distribution_status',NULL,NULL,'Y',NULL,NULL,NULL,NULL,NULL,NULL), +(273,'000000',1,'已分成','1','distribution_status',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(274,'000000',0,'正常','0','withdraw_amount_status',NULL,NULL,'Y',NULL,NULL,NULL,NULL,NULL,NULL), +(275,'000000',1,'冻结','1','withdraw_amount_status',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(276,'000000',2,'Customer','2','resource_type',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(277,'000000',3,'Package','3','resource_type',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(278,'000000',4,'recharge_record','4','resource_type',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(279,'000000',5,'profit_record','5','resource_type',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(280,'000000',6,'settlement_report','6','resource_type',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(281,'000000',1,'list_export','1','export_scene',NULL,NULL,'Y',NULL,NULL,NULL,NULL,NULL,NULL), +(282,'000000',2,'report_export','2','export_scene',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(283,'000000',3,'settlement_export','3','export_scene',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(284,'000000',0,'短信','0','warn_methods',NULL,NULL,'Y',NULL,NULL,NULL,NULL,NULL,NULL), +(285,'000000',1,'邮箱','1','warn_methods',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(286,'000000',2,'电话','2','warn_methods',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(287,'000000',3,'平台消息','3','warn_methods',NULL,NULL,'N',NULL,NULL,NULL,NULL,NULL,NULL), +(288,'000000',4,'接口信息不全','4','t_channels_status','','danger','',100,1,'2026-06-25 09:32:58',NULL,'2026-06-25 09:32:58',''), +(289,'000000',3,'申请中','3','t_channels_status','','success','',100,1,'2026-06-25 09:32:58',NULL,'2026-06-25 09:32:58',''), +(290,'000000',2,'未申请','2','t_channels_status','','warning','',100,1,'2026-06-25 09:32:58',NULL,'2026-06-25 09:32:58',''), +(291,'000000',1,'停用','1','t_channels_status','','danger','',100,1,'2026-06-25 09:32:59',NULL,'2026-06-25 09:32:59',''), +(292,'000000',0,'启用','0','t_channels_status','','primary','',100,1,'2026-06-25 09:32:59',NULL,'2026-06-25 09:32:59',''), +(293,'000000',1,'池套餐001','400','package_codes','','default','',100,1,'2026-06-25 11:42:40',1,'2026-06-25 13:09:36',''), +(294,'000000',2,'池套餐002','[\"dx-300m-3y\"]','package_codes','','default','',100,1,'2026-06-25 11:43:04',NULL,'2026-06-25 11:43:04',''), +(295,'000000',1,'套餐100','100','pool_package_code','','default','',100,1,'2026-06-25 13:10:14',1,'2026-07-29 14:54:25',''), +(296,'000000',1,'套餐400','400','pool_package_code','','default','',100,1,'2026-06-25 13:10:38',NULL,'2026-06-25 13:10:38',''), +(297,'000000',1,'入库','1','batch_type',NULL,'primary','N',NULL,1,'2026-06-29 11:01:10',NULL,NULL,''), +(298,'000000',2,'出库','2','batch_type',NULL,'primary','N',NULL,1,'2026-06-29 11:01:10',NULL,NULL,''), +(299,'000000',3,'划拨','3','batch_type',NULL,'primary','N',NULL,1,'2026-06-29 11:01:10',NULL,NULL,''), +(300,'000000',101,'卡续费','101','batch_type',NULL,'primary','N',NULL,1,'2026-06-29 11:01:10',NULL,NULL,'卡业务专属'), +(301,'000000',102,'卡变更','102','batch_type',NULL,'primary','N',NULL,1,'2026-06-29 11:01:10',NULL,NULL,'卡业务专属'), +(302,'000000',103,'卡开机','103','batch_type',NULL,'primary','N',NULL,1,'2026-06-29 11:01:10',NULL,NULL,'卡业务专属'), +(303,'000000',104,'卡停机','104','batch_type',NULL,'primary','N',NULL,1,'2026-06-29 11:01:10',NULL,NULL,'卡业务专属'), +(304,'000000',105,'卡停复机','105','batch_type',NULL,'primary','N',NULL,1,'2026-06-29 11:01:10',NULL,NULL,'卡业务专属'), +(305,'000000',106,'卡销户','106','batch_type',NULL,'primary','N',NULL,1,'2026-06-29 11:01:10',NULL,NULL,'卡业务专属'), +(306,'000000',107,'卡达量断网执行','107','batch_type','','primary','',NULL,1,'2026-06-29 11:01:10',1,'2026-08-03 16:09:06','卡业务专属'), +(307,'000000',108,'卡退订','108','batch_type',NULL,'primary','N',NULL,1,'2026-06-29 11:01:10',NULL,NULL,'卡业务专属'), +(308,'000000',0,'已创建','0','batch_async_status',NULL,'primary','N',NULL,1,'2026-06-29 13:22:45',NULL,NULL,''), +(309,'000000',1,'待处理','1','batch_async_status',NULL,'primary','N',NULL,1,'2026-06-29 13:22:45',NULL,NULL,''), +(310,'000000',2,'处理中','2','batch_async_status',NULL,'primary','N',NULL,1,'2026-06-29 13:22:45',NULL,NULL,''), +(311,'000000',3,'成功','3','batch_async_status',NULL,'primary','N',NULL,1,'2026-06-29 13:22:45',NULL,NULL,''), +(312,'000000',4,'失败','4','batch_async_status',NULL,'primary','N',NULL,1,'2026-06-29 13:22:45',NULL,NULL,''), +(313,'000000',11,'提现','5','wo_type','','primary','',100,1,'2026-06-29 16:12:54',NULL,'2026-06-29 16:12:54',''), +(314,'000000',10,'余额','4','wo_type','','primary','',100,1,'2026-06-29 16:12:54',NULL,'2026-06-29 16:12:54',''), +(315,'000000',9,'订单','3','wo_type','','primary','',100,1,'2026-06-29 16:12:54',NULL,'2026-06-29 16:12:54',''), +(316,'000000',8,'设备','2','wo_type','','primary','',100,1,'2026-06-29 16:12:54',NULL,'2026-06-29 16:12:54',''), +(317,'000000',7,'模组','1','wo_type','','primary','',100,1,'2026-06-29 16:12:54',NULL,'2026-06-29 16:12:54',''), +(318,'000000',6,'卡','0','wo_type','','primary','',100,1,'2026-06-29 16:12:54',NULL,'2026-06-29 16:12:54',''), +(319,'000000',1,'代理商','2','creator_type','','primary','',100,1,'2026-06-29 16:28:37',NULL,'2026-06-29 16:28:37',''), +(320,'000000',0,'终端用户','1','creator_type','','primary','',100,1,'2026-06-29 16:28:37',NULL,'2026-06-29 16:28:37',''), +(321,'000000',0,'待运行','0','run_result','','info','N',NULL,1,'2026-06-30 17:08:27',NULL,NULL,NULL), +(322,'000000',1,'运行中','1','run_result','','primary','N',NULL,1,'2026-06-30 17:08:27',NULL,NULL,NULL), +(323,'000000',2,'成功','2','run_result','','success','N',NULL,1,'2026-06-30 17:08:27',NULL,NULL,NULL), +(324,'000000',3,'失败','3','run_result','','danger','N',NULL,1,'2026-06-30 17:08:27',NULL,NULL,NULL), +(325,'000000',0,'待处理','0','detail_status','','info','N',NULL,1,'2026-06-30 17:08:27',NULL,NULL,NULL), +(326,'000000',1,'处理中','1','detail_status','','primary','N',NULL,1,'2026-06-30 17:08:27',NULL,NULL,NULL), +(327,'000000',2,'成功','2','detail_status','','success','N',NULL,1,'2026-06-30 17:08:27',NULL,NULL,NULL), +(328,'000000',3,'失败','3','detail_status','','danger','N',NULL,1,'2026-06-30 17:08:27',NULL,NULL,NULL), +(329,'000000',4,'已取消','5','current_status','','primary','',100,1,'2026-07-01 09:38:49',NULL,'2026-07-01 09:38:49',''), +(330,'000000',3,'已完结','4','current_status','','success','',100,1,'2026-07-01 09:38:49',NULL,'2026-07-01 09:38:49',''), +(331,'000000',2,'已解决','3','current_status','','warning','',100,1,'2026-07-01 09:38:49',NULL,'2026-07-01 09:38:49',''), +(332,'000000',1,'处理中','2','current_status','','success','',100,1,'2026-07-01 09:38:49',NULL,'2026-07-01 09:38:49',''), +(333,'000000',0,'已分派','1','current_status','','primary','',100,1,'2026-07-01 09:38:49',NULL,'2026-07-01 09:38:49',''), +(334,'000000',5,'取消','5','operation_type','','primary','',100,1,'2026-07-01 11:15:20',NULL,'2026-07-01 11:15:20',''), +(335,'000000',4,'关单','4','operation_type','','primary','',100,1,'2026-07-01 11:15:20',NULL,'2026-07-01 11:15:20',''), +(336,'000000',3,'完成','3','operation_type','','primary','',100,1,'2026-07-01 11:15:20',NULL,'2026-07-01 11:15:20',''), +(337,'000000',2,'处理','2','operation_type','','primary','',100,1,'2026-07-01 11:15:20',NULL,'2026-07-01 11:15:20',''), +(338,'000000',1,'分派','1','operation_type','','primary','',100,1,'2026-07-01 11:15:21',NULL,'2026-07-01 11:15:21',''), +(339,'000000',0,'创建','0','operation_type','','primary','',100,1,'2026-07-01 11:15:21',NULL,'2026-07-01 11:15:21',''), +(340,'000000',4,'预处理','4','batch_type','','warning','',100,1,'2026-07-01 15:16:35',1,'2026-07-01 15:16:50',''), +(341,'000000',3,'GET','4','method','','primary','',100,1,'2026-07-03 10:51:40',NULL,'2026-07-03 10:51:40',''), +(342,'000000',2,'DELETE','3','method','','primary','',100,1,'2026-07-03 10:51:40',NULL,'2026-07-03 10:51:40',''), +(343,'000000',1,'PUT','2','method','','primary','',100,1,'2026-07-03 10:51:40',NULL,'2026-07-03 10:51:40',''), +(344,'000000',0,'POST','1','method','','primary','',100,1,'2026-07-03 10:51:40',NULL,'2026-07-03 10:51:40',''), +(345,'000000',101,'卡套餐','101','t_package_type',NULL,NULL,'N',103,1,'2026-07-07 09:22:35',NULL,NULL,'卡套餐'), +(346,'000000',102,'池套餐','102','t_package_type',NULL,NULL,'N',103,1,'2026-07-07 09:22:41',NULL,NULL,'池套餐'), +(347,'000000',103,'单卡加油包','103','t_package_type',NULL,NULL,'N',103,1,'2026-07-07 09:22:46',NULL,NULL,'单卡加油包'), +(348,'000000',104,'池卡加油包','104','t_package_type',NULL,NULL,'N',103,1,'2026-07-07 09:22:52',NULL,NULL,'池卡加油包'), +(349,'000000',0,'启用','1','flow_package_enabled','','success','N',100,1,'2026-07-08 13:43:37',1,'2026-07-08 13:43:37',''), +(350,'000000',1,'停用','0','flow_package_enabled','','danger','N',100,1,'2026-07-08 13:43:37',1,'2026-07-08 13:43:37',''), +(351,'000000',1,'支出','1','income_expense_type','','primary','',100,1,'2026-07-09 16:01:41',NULL,'2026-07-09 16:01:41',''), +(352,'000000',0,'收入','0','income_expense_type','','warning','',100,1,'2026-07-09 16:01:41',1,'2026-08-07 17:18:15',''), +(353,'000000',4,'还款','4','change_type','','primary','',100,1,'2026-07-09 16:19:58',NULL,'2026-07-09 16:19:58',''), +(354,'000000',3,'转入','3','change_type','','primary','',100,1,'2026-07-09 16:19:58',NULL,'2026-07-09 16:19:58',''), +(355,'000000',2,'转出','2','change_type','','primary','',100,1,'2026-07-09 16:19:58',NULL,'2026-07-09 16:19:58',''), +(356,'000000',1,'提现','1','change_type','','primary','',100,1,'2026-07-09 16:19:58',NULL,'2026-07-09 16:19:58',''), +(357,'000000',0,'分润','0','change_type','','primary','',100,1,'2026-07-09 16:19:58',NULL,'2026-07-09 16:19:58',''), +(358,'000000',4,'人工调整','4','transaction_type','','primary','',100,1,'2026-07-09 17:28:23',NULL,'2026-07-09 17:28:23',''), +(359,'000000',3,'可提现转入','3','transaction_type','','primary','',100,1,'2026-07-09 17:28:23',NULL,'2026-07-09 17:28:23',''), +(360,'000000',2,'转可提现','2','transaction_type','','primary','',100,1,'2026-07-09 17:28:23',NULL,'2026-07-09 17:28:23',''), +(361,'000000',1,'消费','1','transaction_type','','primary','',100,1,'2026-07-09 17:28:23',NULL,'2026-07-09 17:28:23',''), +(362,'000000',0,'充值','0','transaction_type','','primary','',100,1,'2026-07-09 17:28:23',NULL,'2026-07-09 17:28:23',''), +(363,'000000',2,'可提现金额','3','transaction_channel','','primary','',100,1,'2026-07-09 17:29:34',NULL,'2026-07-09 17:29:34',''), +(364,'000000',1,'微信','2','transaction_channel','','primary','',100,1,'2026-07-09 17:29:34',NULL,'2026-07-09 17:29:34',''), +(365,'000000',0,'支付宝','1','transaction_channel','','primary','',100,1,'2026-07-09 17:29:34',NULL,'2026-07-09 17:29:34',''), +(366,'000000',5,'部分成功','5','batch_async_status',NULL,'warning','N',NULL,1,'2026-07-17 11:29:40',NULL,'2026-07-17 11:29:40',''), +(367,'000000',4,'部分成功','4','run_result','','warning','N',NULL,1,'2026-07-17 11:29:44',NULL,'2026-07-17 11:29:44',NULL), +(368,'000000',109,'卡APN关停','109','batch_type','','primary','',100,1,'2026-07-22 16:07:21',NULL,'2026-07-22 16:07:21','卡业务专属'), +(369,'000000',110,'卡APN开启','110','batch_type','','primary','',100,1,'2026-07-22 16:07:40',1,'2026-07-22 16:08:09','卡业务专属'), +(370,'000000',1,'驳回','1','audit_result','','danger','',100,1,'2026-07-23 09:31:30',NULL,'2026-07-23 09:31:30',''), +(371,'000000',0,'通过','0','audit_result','','primary','',100,1,'2026-07-23 09:31:31',NULL,'2026-07-23 09:31:31',''), +(372,'000000',1,'余额转提现','2','apply_type','','default','',100,1,'2026-07-23 09:42:22',NULL,'2026-07-23 09:42:22',''), +(373,'000000',0,'提现申请','1','apply_type','','default','',100,1,'2026-07-23 09:42:22',NULL,'2026-07-23 09:42:22',''), +(374,'000000',1,'复审','2','audit_type','','warning','',100,1,'2026-07-23 09:45:07',NULL,'2026-07-23 09:45:07',''), +(375,'000000',0,'初审','1','audit_type','','primary','',100,1,'2026-07-23 09:45:07',NULL,'2026-07-23 09:45:07',''), +(376,'000000',2,'微信','3','account_type','','primary','',100,1,'2026-07-23 09:46:58',NULL,'2026-07-23 09:46:58',''), +(377,'000000',1,'支付宝','2','account_type','','primary','',100,1,'2026-07-23 09:46:58',NULL,'2026-07-23 09:46:58',''), +(378,'000000',0,'银行卡','1','account_type','','primary','',100,1,'2026-07-23 09:46:58',NULL,'2026-07-23 09:46:58',''), +(379,'000000',4,'已取消','4','apply_status','','default','',100,1,'2026-07-23 11:01:45',NULL,'2026-07-23 11:01:45',''), +(380,'000000',3,'已打款','3','apply_status','','primary','',100,1,'2026-07-23 11:01:45',NULL,'2026-07-23 11:01:45',''), +(381,'000000',2,'已驳回','2','apply_status','','danger','',100,1,'2026-07-23 11:01:45',NULL,'2026-07-23 11:01:45',''), +(382,'000000',1,'已通过','1','apply_status','','success','',100,1,'2026-07-23 11:01:46',NULL,'2026-07-23 11:01:46',''), +(383,'000000',0,'待审核','0','apply_status','','primary','',100,1,'2026-07-23 11:01:46',NULL,'2026-07-23 11:01:46',''), +(384,'000000',3,'账户通知','4','message_type','','primary','',100,1,'2026-07-27 13:10:16',NULL,'2026-07-27 13:10:16',''), +(385,'000000',2,'订单通知','3','message_type','','primary','',100,1,'2026-07-27 13:10:16',NULL,'2026-07-27 13:10:16',''), +(386,'000000',1,'活动通知','2','message_type','','primary','',100,1,'2026-07-27 13:10:16',NULL,'2026-07-27 13:10:16',''), +(387,'000000',0,'系统通知','1','message_type','','primary','',100,1,'2026-07-27 13:10:16',NULL,'2026-07-27 13:10:16',''), +(388,'000000',1,'终端用户','2','send_user_type','','warning','',100,1,'2026-07-27 13:14:23',NULL,'2026-07-27 13:14:23',''), +(389,'000000',0,'代理商','1','send_user_type','','primary','',100,1,'2026-07-27 13:14:23',NULL,'2026-07-27 13:14:23',''), +(390,'000000',1,'已撤回','1','is_recall','','danger','',100,1,'2026-07-27 13:17:24',NULL,'2026-07-27 13:17:24',''), +(391,'000000',0,'未撤回','0','is_recall','','primary','',100,1,'2026-07-27 13:17:24',NULL,'2026-07-27 13:17:24',''), +(392,'000000',40,'预警配置','40','batch_type','','primary','N',100,1,'2026-07-27 13:38:02',1,'2026-07-27 13:38:02','预警配置批次类型'), +(393,'000000',41,'达量断网配置','41','batch_type','','primary','',100,1,'2026-08-03 16:08:02',1,'2026-08-03 16:08:48','达量断网配置'), +(394,'000000',1,'流量阈值(MB)','1','t_warn_unit','','default','',100,1,'2026-08-06 13:04:52',NULL,'2026-08-06 13:04:52',''), +(395,'000000',2,'流量池百分比','2','t_warn_unit','','default','',100,1,'2026-08-06 13:05:01',NULL,'2026-08-06 13:05:01',''), +(396,'000000',1,'站内提醒','3','t_warn_method','','default','',100,1,'2026-08-06 13:05:24',NULL,'2026-08-06 13:05:24',''), +(397,'000000',2,'邮箱','1','t_warn_method','','default','',100,1,'2026-08-06 13:05:38',NULL,'2026-08-06 13:05:38',''), +(398,'000000',3,'短信','0','t_warn_method','','default','',100,1,'2026-08-06 13:05:47',NULL,'2026-08-06 13:05:47',''), +(399,'000000',1,'是','3','t_warn_auto_action','','default','',100,1,'2026-08-06 13:06:03',NULL,'2026-08-06 13:06:03',''), +(400,'000000',2,'否','0','t_warn_auto_action','','default','',100,1,'2026-08-06 13:06:15',NULL,'2026-08-06 13:06:15',''), +(401,'000000',1,'启用','1','t_warn_enabled','','default','',100,1,'2026-08-06 13:06:25',NULL,'2026-08-06 13:06:25',''), +(402,'000000',2,'停用','0','t_warn_enabled','','default','',100,1,'2026-08-06 13:06:33',NULL,'2026-08-06 13:06:33',''), +(403,'000000',3,'交易失败','3','transaction_status','','primary','',100,1,'2026-08-07 15:03:08',NULL,'2026-08-07 15:03:08',''), +(404,'000000',2,'已过期','2','transaction_status','','primary','',100,1,'2026-08-07 15:03:08',NULL,'2026-08-07 15:03:08',''), +(405,'000000',1,'已支付','1','transaction_status','','primary','',100,1,'2026-08-07 15:03:08',NULL,'2026-08-07 15:03:08',''), +(406,'000000',0,'待支付','0','transaction_status','','primary','',100,1,'2026-08-07 15:03:08',NULL,'2026-08-07 15:03:08',''); + +INSERT INTO `sys_dict_type` (`dict_id`, `tenant_id`, `dict_name`, `dict_type`, `is_sys`, `created_dept`, `created_by`, `created_at`, `updated_by`, `updated_at`, `remark`) VALUES +(1,'000000','用户性别','sys_user_sex','0',103,1,'2025-02-13 11:56:36',1,'2026-05-24 22:42:49','用户性别列表'), +(2,'000000','菜单状态','sys_show_hide','0',103,1,'2025-02-13 11:56:36',1,'2026-05-24 22:42:57','菜单状态列表'), +(3,'000000','系统开关','sys_normal_disable','1',103,1,'2025-02-13 11:56:36',NULL,NULL,'系统开关列表'), +(4,'000000','系统是否','sys_yes_no','1',103,1,'2025-02-13 11:56:36',NULL,NULL,'系统是否列表'), +(5,'000000','通知类型','sys_notice_type','1',103,1,'2025-02-13 11:56:36',NULL,NULL,'通知类型列表'), +(6,'000000','通知状态','sys_notice_status','1',103,1,'2025-02-13 11:56:36',NULL,NULL,'通知状态列表'), +(7,'000000','操作类型','sys_oper_type','1',103,1,'2025-02-13 11:56:36',NULL,NULL,'操作类型列表'), +(8,'000000','系统状态','sys_common_status','1',103,1,'2025-02-13 11:56:36',NULL,NULL,'登录状态列表'), +(9,'000000','授权类型','sys_grant_type','1',103,1,'2025-02-13 11:56:36',NULL,NULL,'认证授权类型'), +(10,'000000','设备类型','sys_device_type','1',103,1,'2025-02-13 11:56:36',NULL,NULL,'客户端设备类型'), +(11,'000000','是否默认','sys_yes_no_num','1',103,1,'2025-03-05 12:32:12',1,'2025-03-13 16:41:48','是否默认 0是 1否'), +(12,'000000','oss权限桶类型','oss_access_policy','1',103,1,'2025-03-13 16:54:51',NULL,'2025-03-13 16:54:51',''), +(13,'000000','代码生成状态','sys_gen_status','1',103,1,'2025-03-18 14:27:03',NULL,'2025-03-18 14:27:03',''), +(14,'000000','任务分组','sys_job_group','1',101,11,'2025-03-19 17:36:37',1,'2025-03-26 09:47:20','任务分组(0 默认 1系统 2数据中心)'), +(15,'000000','任务计划执行策略','sys_missfire_policy','1',101,11,'2025-03-19 17:38:30',1,'2025-03-26 09:46:20','计划执行策略(1多次执行 2执行一次)'), +(16,'000000','任务是否并发执行','sys_job_concurrent','1',101,11,'2025-03-20 11:24:58',11,'2025-03-20 11:25:14','是否并发执行(0允许 1禁止)'), +(17,'000000','组织类型','sys_dept_type','0',103,1,'2026-05-24 22:42:39',NULL,'2026-05-24 22:42:39','0:部门\n1:公司'), +(18,'000000','套餐类型','t_package_type','0',103,1,'2026-06-04 09:09:40',NULL,'2026-06-04 09:09:40','101:卡套餐\n102:池套餐\n103:单卡加油包\n104:池卡加油包'), +(19,'000000','卡信息_时间类型','t_cardInfo_timeType','1',103,1,'2026-06-04 09:14:19',1,'2026-06-04 11:27:32','卡信息表'), +(20,'000000','计费方式','t_billing_method','0',103,1,'2026-06-04 09:16:36',NULL,'2026-06-04 09:16:36','1:月\n2:年'), +(21,'000000','渠道适用类型','t_agent_scope_type','0',103,1,'2026-06-04 09:18:15',1,'2026-06-04 09:18:19','0:所有客户\n1:指定客户'), +(22,'000000','运营商','t_operators','0',103,1,'2026-06-04 09:18:53',NULL,'2026-06-04 09:18:53','1:移动\n2:联通\n3:电信'), +(23,'000000','卡信息_查询条件','t_cardInfo_selectCondition','1',103,1,'2026-06-04 10:28:33',1,'2026-06-04 11:28:18','卡信息表'), +(24,'000000','卡信息_查询维度','t_cardInfo_dimension','1',103,1,'2026-06-04 10:41:15',1,'2026-06-04 14:25:38','卡信息表'), +(25,'000000','卡信息_维度状态','t_cardInfo_dimensionStatus','1',103,1,'2026-06-04 10:42:41',1,'2026-06-04 14:25:45','卡信息表'), +(26,'000000','卡信息_排序值','t_cardInfo_sortValue','1',103,1,'2026-06-04 12:26:16',1,'2026-06-04 14:25:59','卡信息表'), +(27,'000000','卡信息_排序类型','t_cardInfo_sortType','1',103,1,'2026-06-04 12:29:56',1,'2026-06-04 14:26:07','卡信息表'), +(28,'000000','网络类型','t_net_model','1',103,1,'2026-06-04 14:25:18',1,'2026-06-04 14:29:46','1 3G\n2 2G\n3 4G\n4 5G\n5 NB-IOT\n6 5G-SA\n7 5G-NSA\n8 2G/3G\n9 电信NB\n10 移动4G\n11 联通NB\n12 联通4G\n13 电信4G\n14 RedCap'), +(29,'000000','卡状态','t_boss_card_status','0',103,1,'2026-06-04 14:56:04',1,'2026-06-05 16:14:06','待激活:1\n已激活:2\n停机:4\n可测试:6\n库存:7\n预销户:8\n已销户:9\n未知:0'), +(30,'000000','流量池状态','t_pool_status','1',103,1,'2026-06-05 14:00:06',1,'2026-06-05 14:18:07','0:正常\n1:停用\n2:锁定'), +(31,'000000','全局-是否启用','global_enable','0',103,1,'2026-06-08 15:30:44',1,'2026-06-08 15:31:06','0:启用\n1:停用'), +(32,'000000','全局-是否','global_yes_or_no','0',103,1,'2026-06-08 15:31:34',NULL,'2026-06-08 15:31:34','0:是\n1:否'), +(33,'000000','下载状态','download_status','1',103,1,'2026-06-12 10:04:11',NULL,'2026-06-12 10:04:11','0:待生成 1:已生成 2:生成中 3:生成失败'), +(34,'000000','卡类型','t_card_type','0',103,1,'2026-06-12 13:12:11',1,'2026-08-10 13:07:21','1:通用插拔 SIM 卡\n2:贴片 M2M 卡 5×6mm\n3:贴片 M2M 卡 2×2mm\n4:MP1-消费级插拔物联卡\n5:MP2-工业级插拔物联卡\n6:MS0-消费级贴片物联卡\n7:MS1-工业级贴片物联卡'), +(35,'000000','套餐状态','t_package_status','0',103,1,'2026-06-12 13:14:52',NULL,'2026-06-12 13:14:52','0:无套餐\n1:待生效\n2:生效中\n3:已过期'), +(36,'000000','批次类型','batch_type','1',103,1,'2026-06-12 16:53:22',1,'2026-07-27 14:52:48','批次类型:1-3通用批次,101+卡业务专属'), +(37,'000000','资源类型','resource_type','1',103,1,'2026-06-12 16:53:22',NULL,'2026-06-12 16:53:22','t_resource_batch_download.resource_type'), +(38,'000000','资源导出场景','resource_export_scene','1',103,1,'2026-06-12 16:53:22',NULL,'2026-06-12 16:53:22','t_resource_batch_download.export_scene'), +(39,'000000','卡入库导入状态','sim_card_inbound_import_status','1',103,1,'2026-06-12 16:53:22',NULL,'2026-06-12 16:53:22','TSimCardInboundExcelImportRes.importStatus'), +(40,'000000','套餐定价-价格来源','t_package_price_source','1',100,26,'2026-06-22 14:15:37',1,'2026-06-22 14:32:05','system — 系统级\nagentDefault — 本级默认\ntarget — 下级专属'), +(41,'000000','批次来源方式','t_batch_source_type','0',100,1,'2026-06-24 09:07:53',NULL,'2026-06-24 09:07:53','0:批次选择\n1:连号\n2:批量输入\n3:文件'), +(42,'000000','通道状态','t_channels_status','1',100,1,'2026-06-25 09:30:53',1,'2026-06-25 09:32:35','0:启用\n1:停用\n2:未申请\n3:申请中\n4:接口信息不全'), +(43,'000000','套餐名称','pool_package_code','1',100,1,'2026-06-25 11:41:40',1,'2026-06-25 13:09:24','此处为流量池名称 每次新增流量池套餐需要进行配置'), +(44,'000000','批次异步状态','batch_async_status','1',NULL,1,'2026-06-29 13:22:34',NULL,NULL,'批次异步状态:0-已创建 1-待处理 2-处理中 3-成功 4-失败'), +(45,'000000','工单类型','wo_type','1',100,1,'2026-06-29 16:12:37',NULL,'2026-06-29 16:12:37','0:卡\n1:模组\n2:设备\n3:订单\n4:余额\n5:提现'), +(46,'000000','创建人类型','creator_type','1',100,1,'2026-06-29 16:28:26',NULL,'2026-06-29 16:28:26','1:终端用户\n2:代理商'), +(47,'000000','运行结果','run_result','0',NULL,1,'2026-06-30 17:08:27',NULL,NULL,'运行结果:0待运行 1运行中 2成功 3失败'), +(48,'000000','批次明细状态','detail_status','0',NULL,1,'2026-06-30 17:08:27',NULL,NULL,'批次明细状态:0待处理 1处理中 2成功 3失败'), +(49,'000000','当前处理状态','current_status','1',100,1,'2026-07-01 09:37:54',NULL,'2026-07-01 09:37:54','1:已分派\n2:处理中\n3:已解决\n4:已完结_关单\n5:已取消'), +(50,'000000','操作类型','operation_type','1',100,1,'2026-07-01 11:15:12',NULL,'2026-07-01 11:15:12','0:创建\n1:分派\n2:处理\n3:完成\n4:关单\n5:取消'), +(51,'000000','请求方法','method','1',100,1,'2026-07-03 10:51:30',NULL,'2026-07-03 10:51:30','1:POST\n2:PUT\n3:DELETE\n4:GET'), +(52,'000000','套餐启用状态','flow_package_enabled','0',100,1,'2026-07-08 13:43:37',1,'2026-07-08 13:43:37','套餐管理-是否启用,与global_enable方向相反(0=停用 1=启用)'), +(53,'000000','收支类型','income_expense_type','1',100,1,'2026-07-09 16:18:26',NULL,'2026-07-09 16:18:26','0:收入\n1:支出'), +(54,'000000','变动类型','change_type','1',100,1,'2026-07-09 16:19:52',NULL,'2026-07-09 16:19:52','0:分润\n1:提现\n2:转出\n3:转入\n4:还款'), +(55,'000000','订单类型','order_type','1',100,1,'2026-07-09 16:23:49',NULL,'2026-07-09 16:23:49','1:卡订购\n2: 卡续费\n3: 卡变更'), +(56,'000000','支付类型','pay_type','1',100,1,'2026-07-09 17:26:00',NULL,'2026-07-09 17:26:00','1:在线支付\n2:货到付款\n3:线下支付'), +(57,'000000','交易类型','transaction_type','1',100,1,'2026-07-09 17:28:15',NULL,'2026-07-09 17:28:15','0:充值 \n1:消费\n2:转可提现 \n3:可提现转入 \n4:人工调整'), +(58,'000000','交易渠道','transaction_channel','1',100,1,'2026-07-09 17:29:28',NULL,'2026-07-09 17:29:28','1:支付宝\n2:微信 \n3:可提现金额'), +(59,'000000','生效状态','effective_status','1',100,1,'2026-07-14 13:45:04',NULL,'2026-07-14 13:45:04','0:待生效\n1:生效中\n2:已过期\n3:已终止\n4:已作废'), +(60,'000000','审核结果','audit_result','1',100,1,'2026-07-23 09:31:13',NULL,'2026-07-23 09:31:13','0:通过\n1:驳回'), +(61,'000000','申请类型','apply_type','1',100,1,'2026-07-23 09:42:08',NULL,'2026-07-23 09:42:08','1:提现申请\n2:余额转提现'), +(62,'000000','审核类型','audit_type','1',100,1,'2026-07-23 09:43:51',NULL,'2026-07-23 09:43:51','1:初审\n2:复审'), +(63,'000000','提现账号类型','account_type','1',100,1,'2026-07-23 09:46:51',NULL,'2026-07-23 09:46:51','1:银行卡\n2:支付宝\n3:微信'), +(64,'000000','状态','apply_status','1',100,1,'2026-07-23 11:01:19',NULL,'2026-07-23 11:01:19','0:待审核\n1:已通过\n2:已驳回\n3:已打款\n4:已取消'), +(65,'000000','消息类型','message_type','1',100,1,'2026-07-27 13:10:06',NULL,'2026-07-27 13:10:06','1:系统通知 \n2:活动通知 \n3:订单通知 \n4:账户通知'), +(66,'000000','发送用户类型','send_user_type','1',100,1,'2026-07-27 13:14:14',NULL,'2026-07-27 13:14:14','1:代理商 \n2:终端用户'), +(67,'000000','是否撤回','is_recall','1',100,1,'2026-07-27 13:17:11',NULL,'2026-07-27 13:17:11','0:未撤回 \n1:已撤回'), +(68,'000000','客户类型','customer_type','1',100,1,'2026-08-06 11:21:35',NULL,'2026-08-06 11:21:35','1 渠道用户\n2 终端用户'), +(69,'000000','预警-预警单位','t_warn_unit','1',100,1,'2026-08-06 13:03:24',1,'2026-08-06 13:07:00','1:流量阈值(MB),2:流量池百分比'), +(70,'000000','预警-提醒方式','t_warn_method','1',100,1,'2026-08-06 13:03:42',1,'2026-08-06 13:07:13','3:站内提醒,1:邮箱,0:短信'), +(71,'000000','预警-第三次是否停机','t_warn_auto_action','1',100,1,'2026-08-06 13:04:07',1,'2026-08-06 13:07:26','0:否,3:是'), +(72,'000000','预警启停状态','t_warn_enabled','1',100,1,'2026-08-06 13:04:32',1,'2026-08-06 13:07:38','1:启用,0:停用'), +(73,'000000','订单状态','order_status','1',100,1,'2026-08-06 13:39:56',NULL,'2026-08-06 13:39:56','0 待确定,待支付 \n1 已确定,待发货 \n2处理中,已发货 \n3 已取消 \n4 无效 \n5 已完成'), +(74,'000000','退货状态','return_status','1',100,1,'2026-08-06 13:40:34',NULL,'2026-08-06 13:40:34','0未退款\n1待审核\n2执行中\n3部分退货\n4退货成功'), +(75,'000000','系统状态','sys_status','1',100,1,'2026-08-06 13:41:50',NULL,'2026-08-06 13:41:50','0 正常\n1 停用'), +(76,'000000','发货方式','shipping_method','1',100,1,'2026-08-06 13:42:12',NULL,'2026-08-06 13:42:12','1 物流\n2 商家自提\n3 无需配送'), +(77,'000000','支付状态','pay_status','1',100,1,'2026-08-06 13:46:13',NULL,'2026-08-06 13:46:13','0 未支付 \n1 支付中\n2 已支付\n3 退款中\n4 部分退款\n5 已退款'), +(78,'000000','交易状态','transaction_status','1',100,1,'2026-08-07 15:02:56',NULL,'2026-08-07 15:02:56','0:待支付\n1:已支付\n2:已过期\n3:交易失败'); + +INSERT INTO `sys_role_menu` (`tenant_id`, `role_id`, `menu_id`, `data_scope`) VALUES +('000000',2,4,'0'), +('000000',2,42,'0'), +('000000',2,92,'0'), +('000000',2,93,'0'), +('000000',2,94,'0'), +('000000',2,106,'0'), +('000000',2,107,'0'), +('000000',2,108,'0'), +('000000',2,109,'0'), +('000000',2,128,'0'), +('000000',2,129,'0'), +('000000',2,133,'0'), +('000000',2,135,'0'), +('000000',2,138,'0'), +('000000',2,153,'0'), +('000000',2,154,'0'), +('000000',2,157,'0'), +('000000',2,165,'0'), +('000000',2,166,'0'), +('000000',2,169,'0'), +('000000',2,176,'0'), +('000000',2,177,'0'), +('000000',2,178,'0'), +('000000',2,186,'0'), +('000000',2,187,'0'), +('000000',2,190,'0'), +('000000',2,191,'0'), +('000000',2,193,'7'), +('000000',2,195,'0'), +('000000',2,196,'0'), +('000000',2,197,'0'), +('000000',2,198,'0'), +('000000',2,201,'0'), +('000000',2,205,'0'), +('000000',2,206,'0'), +('000000',2,207,'0'), +('000000',2,208,'0'), +('000000',2,209,'0'), +('000000',2,210,'0'), +('000000',2,211,'0'), +('000000',2,212,'0'), +('000000',2,213,'0'), +('000000',2,214,'0'), +('000000',2,215,'0'), +('000000',2,216,'0'), +('000000',2,217,'0'), +('000000',2,218,'0'), +('000000',2,219,'0'), +('000000',2,220,'0'), +('000000',2,221,'0'), +('000000',2,222,'0'), +('000000',2,223,'0'), +('000000',2,224,'0'), +('000000',2,225,'0'), +('000000',2,226,'0'), +('000000',2,227,'0'), +('000000',2,228,'0'), +('000000',2,229,'0'), +('000000',2,230,'0'), +('000000',2,233,'0'), +('000000',2,234,'0'), +('000000',2,235,'0'), +('000000',2,236,'0'), +('000000',2,237,'0'), +('000000',2,238,'0'), +('000000',2,239,'0'), +('000000',2,240,'0'), +('000000',2,241,'0'), +('000000',2,244,'0'), +('000000',2,245,'0'), +('000000',2,246,'0'), +('000000',2,249,'0'), +('000000',2,250,'0'), +('000000',2,251,'0'), +('000000',2,252,'0'), +('000000',2,255,'0'), +('000000',2,256,'0'), +('000000',2,257,'0'), +('000000',2,258,'0'), +('000000',2,259,'0'), +('000000',2,260,'0'), +('000000',2,261,'0'), +('000000',2,265,'0'), +('000000',2,266,'0'), +('000000',2,267,'0'), +('000000',2,285,'0'), +('000000',2,286,'0'), +('000000',2,287,'0'), +('000000',2,288,'0'), +('000000',2,289,'0'), +('000000',2,290,'0'), +('000000',2,291,'0'), +('000000',2,292,'0'), +('000000',2,293,'0'), +('000000',2,294,'0'), +('000000',2,295,'0'), +('000000',2,296,'0'), +('000000',2,297,'0'), +('000000',2,298,'0'), +('000000',2,299,'0'), +('000000',2,300,'0'), +('000000',2,301,'0'), +('000000',2,302,'0'), +('000000',2,303,'0'), +('000000',2,304,'0'), +('000000',2,305,'0'), +('000000',2,306,'0'), +('000000',2,309,'0'), +('000000',2,310,'0'), +('000000',2,311,'0'), +('000000',2,312,'0'), +('000000',2,315,'0'), +('000000',2,316,'0'), +('000000',2,317,'0'), +('000000',2,320,'0'), +('000000',2,321,'0'), +('000000',2,322,'0'), +('000000',2,323,'0'), +('000000',2,324,'0'), +('000000',2,327,'0'), +('000000',2,328,'0'), +('000000',2,329,'0'), +('000000',2,332,'0'), +('000000',2,333,'0'), +('000000',2,335,'0'), +('000000',2,336,'0'), +('000000',2,337,'0'), +('000000',2,338,'0'), +('000000',2,339,'0'), +('000000',2,340,'0'), +('000000',2,341,'0'), +('000000',2,342,'0'), +('000000',2,343,'0'), +('000000',2,344,'0'), +('000000',2,345,'0'), +('000000',2,346,'0'), +('000000',2,347,'0'), +('000000',2,348,'0'), +('000000',2,361,'0'), +('000000',2,362,'0'), +('000000',2,363,'0'), +('000000',2,366,'0'), +('000000',2,367,'0'), +('000000',2,368,'0'), +('000000',2,371,'0'), +('000000',2,372,'0'), +('000000',2,373,'0'), +('000000',2,374,'0'), +('000000',2,375,'0'), +('000000',2,376,'0'), +('000000',2,377,'0'), +('000000',2,378,'0'), +('000000',2,379,'0'), +('000000',2,380,'0'), +('000000',2,381,'0'), +('000000',2,382,'0'), +('000000',2,383,'0'), +('000000',2,384,'0'), +('000000',2,385,'0'), +('000000',2,386,'0'), +('000000',2,387,'0'), +('000000',2,388,'0'), +('000000',2,389,'0'), +('000000',2,390,'0'), +('000000',2,391,'0'), +('000000',2,392,'0'), +('000000',2,393,'0'), +('000000',2,394,'0'), +('000000',2,395,'0'), +('000000',2,396,'0'), +('000000',2,397,'0'), +('000000',2,398,'0'), +('000000',2,401,'0'), +('000000',2,402,'0'), +('000000',2,403,'0'), +('000000',2,404,'0'), +('000000',2,405,'0'), +('000000',3,4,'0'), +('000000',3,19,'0'), +('000000',3,92,'0'), +('000000',3,93,'0'), +('000000',3,94,'0'), +('000000',3,95,'0'), +('000000',3,106,'0'), +('000000',3,107,'0'), +('000000',3,108,'0'), +('000000',3,109,'0'), +('000000',3,119,'0'), +('000000',3,153,'0'), +('000000',3,154,'0'), +('000000',3,157,'0'), +('000000',3,176,'0'), +('000000',3,191,'0'), +('000000',3,193,'0'), +('000000',3,195,'0'), +('000000',3,201,'0'), +('000000',3,237,'0'), +('000000',3,240,'0'), +('000000',3,241,'0'), +('000000',3,242,'0'), +('000000',3,244,'0'), +('000000',3,1865,'0'), +('000000',3,1866,'0'), +('000000',3,1869,'0'), +('000000',3,245,'0'), +('000000',3,246,'0'), +('000000',3,249,'0'), +('000000',3,250,'0'), +('000000',3,251,'0'), +('000000',3,252,'0'), +('000000',3,255,'0'), +('000000',3,256,'0'), +('000000',3,258,'0'), +('000000',3,259,'0'), +('000000',3,262,'0'), +('000000',3,263,'0'), +('000000',3,264,'0'), +('000000',3,265,'0'), +('000000',3,344,'0'), +('000000',3,345,'0'), +('000000',3,346,'0'), +('000000',4,4,'0'), +('000000',4,153,'0'), +('000000',4,154,'0'), +('000000',4,157,'0'), +('000000',4,176,'0'), +('000000',4,191,'0'), +('000000',4,195,'0'), +('000000',4,201,'0'), +('000000',4,237,'0'), +('000000',4,240,'0'), +('000000',4,241,'0'), +('000000',4,244,'0'), +('000000',4,245,'0'), +('000000',4,246,'0'), +('000000',4,249,'0'), +('000000',4,251,'0'), +('000000',4,252,'0'), +('000000',4,255,'0'), +('000000',4,256,'0'), +('000000',4,257,'0'), +('000000',4,258,'0'), +('000000',4,259,'0'), +('000000',4,262,'0'), +('000000',4,263,'0'), +('000000',4,264,'0'), +('000000',4,265,'0'), +('000000',4,285,'0'), +('000000',4,286,'0'), +('000000',4,287,'0'), +('000000',4,288,'0'), +('000000',4,289,'0'), +('000000',4,290,'0'), +('000000',4,291,'0'), +('000000',4,292,'0'), +('000000',4,293,'0'), +('000000',4,294,'0'), +('000000',4,295,'0'), +('000000',4,296,'0'), +('000000',4,297,'0'), +('000000',4,298,'0'), +('000000',4,299,'0'), +('000000',4,300,'0'), +('000000',4,301,'0'), +('000000',4,302,'0'), +('000000',4,303,'0'), +('000000',4,304,'0'), +('000000',4,335,'0'), +('000000',4,336,'0'), +('000000',4,337,'0'), +('000000',4,338,'0'), +('000000',4,339,'0'), +('000000',4,340,'0'), +('000000',4,344,'0'), +('000000',4,345,'0'), +('000000',4,346,'0'), +('000000',4,362,'0'), +('000000',4,363,'0'), +('000000',4,366,'0'), +('000000',4,367,'0'), +('000000',4,368,'0'), +('000000',4,371,'0'), +('000000',4,373,'0'), +('000000',4,374,'0'), +('000000',4,375,'0'), +('000000',4,376,'0'), +('000000',4,377,'0'), +('000000',4,378,'0'), +('000000',4,379,'0'), +('000000',4,380,'0'), +('000000',4,381,'0'), +('000000',4,382,'0'), +('000000',4,383,'0'), +('000000',4,384,'0'), +('000000',4,385,'0'), +('000000',4,386,'0'), +('000000',4,387,'0'); + +INSERT INTO `sys_user` (`user_id`, `tenant_id`, `dept_id`, `user_name`, `nick_name`, `user_type`, `email`, `phonenumber`, `sex`, `avatar`, `salt`, `password`, `status`, `login_ip`, `login_date`, `mfa_enabled`, `created_dept`, `created_by`, `created_at`, `updated_by`, `updated_at`, `deleted_by`, `deleted_at`, `remark`) VALUES +(1,'000000',1,'admin','示例用户01','sys_user','user01@example.com','13800000001','0','','123456','5f1d7a84db00d2fce00b31a7fc73224f','0','','2026-08-10 09:30:44',0,103,1,'2025-02-13 11:56:36',1,'2026-08-10 09:30:44',NULL,NULL,''), +(2,'100006',2,'user02','示例用户02','sys_user','user02@example.com','13800000002','2','','5nyxW','68c6e105523f29f1a97607f6739cd245','0','',NULL,NULL,0,0,'2025-03-16 14:36:52',0,'2025-03-16 14:36:52',NULL,NULL,''), +(3,'000000',2,'2admin','示例用户03','sys_user','user03@example.com','13800000003','2','','5nyxW','68c6e105523f29f1a97607f6739cd245','0','','2026-08-10 09:28:19',NULL,103,1,'2026-05-30 22:39:09',1,'2026-08-10 09:28:19',NULL,NULL,''), +(4,'000000',2,'2user','示例用户04','','user04@example.com','13800000004','2','','VZ0wN','e6ad50a55c5cca432e58445500433943','0','','2026-07-21 09:44:52',NULL,103,1,'2026-06-10 17:04:02',1,'2026-07-21 09:44:52',NULL,NULL,''), +(5,'000000',4,'3admin','示例用户05','sys_user','user05@example.com','13800000005','2','','mLwlN','70824cefa9bc3da395ea16a48118e477','0','','2026-08-05 10:44:43',NULL,117,12,'2026-06-22 17:32:57',1,'2026-08-05 10:44:43',NULL,NULL,''), +(6,'000000',4,'3user','示例用户06','','user06@example.com','13800000006','2','','5nyxW','68c6e105523f29f1a97607f6739cd245','0','','2026-07-31 14:30:05',NULL,131,27,'2026-06-22 19:56:29',1,'2026-07-31 14:30:05',NULL,NULL,''), +(7,'000000',1,'admin1','示例用户07','','user07@example.com','13800000007','0','','mLwlN','70824cefa9bc3da395ea16a48118e477','0','','2026-08-05 09:20:19',NULL,100,1,'2026-06-30 16:53:41',1,'2026-08-05 09:20:19',NULL,NULL,''), +(8,'000000',6,'admin4','示例用户08','','user08@example.com','13800000008','0','','446lG','72f5e0fa52945f173262566183afd9e6','0','','2026-08-05 10:46:03',NULL,100,1,'2026-07-02 13:57:27',1,'2026-08-05 10:46:03',NULL,NULL,''), +(9,'000000',2,'4admin','示例用户09','','user09@example.com','13800000009','2','','5nyxW','8f2dd9b2f537dc0f3a4adf7238ab9939','0','',NULL,NULL,100,1,'2026-07-07 13:31:14',1,'2026-07-07 13:32:19',1,'2026-07-07 13:32:19',''), +(10,'000000',2,'admin5','示例用户10','','user10@example.com','13800000010','0','','mLwlN','3a87db29951e21633cc31f5af6c6c724','0','',NULL,NULL,100,1,'2026-07-07 13:32:53',1,'2026-07-07 13:34:45',1,'2026-07-07 13:34:45',''), +(11,'000000',4,'admin05','示例用户11','','user11@example.com','13800000011','0','','VZ0wN','8cd10b084f93ebe5f1a38b9143d44c90','0','',NULL,NULL,100,1,'2026-07-07 13:34:21',1,'2026-07-07 13:34:21',NULL,NULL,''), +(12,'000000',2,'admin06','示例用户12','','user12@example.com','13800000012','0','','47YVX','66d5cf5d32c90aecc4a0424423717fce','0','','2026-07-20 15:32:10',NULL,100,1,'2026-07-07 13:42:16',1,'2026-07-20 15:32:10',NULL,NULL,''), +(13,'000000',4,'admin06_01','示例用户13','','user13@example.com','13800000013','0','','qMXQa','4783c8a80550887fc7acf826cad3757e','0','',NULL,NULL,100,1,'2026-07-07 13:43:35',1,'2026-07-07 13:48:43',NULL,NULL,''), +(14,'000000',6,'admin_06_02','示例用户14','','user14@example.com','13800000014','0','','XKlFv','6713996e56e9dcbe69b5d097eaf3316a','0','',NULL,NULL,100,1,'2026-07-07 13:44:16',1,'2026-07-07 13:48:53',NULL,NULL,''), +(15,'000000',7,'agent2','示例用户15','sys_user','user15@example.com','13800000015','0','','mLwlN','70824cefa9bc3da395ea16a48118e477','0','','2026-07-17 09:33:02',NULL,100,1,'2026-07-17 09:30:51',1,'2026-07-17 09:33:02',NULL,NULL,''), +(16,'000000',3,'zhongduan01M','示例用户16','sys_user','user16@example.com','13800000016','0','','mLwlN','70824cefa9bc3da395ea16a48118e477','0','','2026-07-21 09:13:05',NULL,100,1,'2026-07-21 09:05:50',1,'2026-07-21 09:59:16',1,'2026-07-21 09:59:16',''), +(17,'000000',3,'zhongduanM01','示例用户17','app_user','user17@example.com','13800000017','0','','VZ0wN','e6ad50a55c5cca432e58445500433943','0','','2026-07-28 10:41:56',NULL,100,1,'2026-07-27 16:53:15',1,'2026-07-28 10:41:56',NULL,NULL,''), +(18,'000000',3,'enduser01','示例用户18','sys_user','user18@example.com','13800000018','0','','5nyxW','68c6e105523f29f1a97607f6739cd245','0','','2026-08-07 13:56:53',NULL,100,1,'2026-07-30 09:41:54',1,'2026-08-07 13:56:53',NULL,NULL,'') +; + +INSERT INTO `sys_user_role` (`tenant_id`, `user_id`, `role_id`) VALUES +('000000',1,1), +('000000',3,2), +('000000',4,3), +('000000',5,2), +('000000',6,3), +('000000',7,2), +('000000',8,2), +('000000',16,4), +('000000',17,4), +('000000',18,3); + +INSERT INTO `sys_role` (`role_id`, `tenant_id`, `dept_id`, `role_name`, `role_key`, `role_sort`, `data_scope`, `menu_check_strictly`, `dept_check_strictly`, `status`, `is_pass`, `created_dept`, `created_by`, `created_at`, `updated_by`, `updated_at`, `deleted_by`, `deleted_at`, `remark`) VALUES +(1,'000000',0,'超级管理员','superadmin',1,'1',1,1,'0',0,103,1,'2025-02-13 11:56:36',NULL,NULL,NULL,NULL,'超级管理员'), +(2,'000000',1,'M管理员','MADMIN',0,'4',0,0,'0',1,100,1,'2026-06-30 16:58:35',1,'2026-08-07 09:38:09',NULL,NULL,''), +(3,'000000',1,'M用户','MUSER',1,'7',0,1,'0',0,100,1,'2026-06-30 16:59:58',1,'2026-08-05 13:54:52',NULL,NULL,''), +(4,'000000',3,'M终端用户','enduser',10,'3',0,1,'0',0,100,1,'2026-07-21 09:11:08',1,'2026-07-30 10:17:44',NULL,NULL,''); + +INSERT INTO `sys_role_dept` (`tenant_id`, `role_id`, `dept_id`) VALUES +('000000',2,1); + +INSERT INTO `sys_dept` (`dept_id`, `tenant_id`, `parent_id`, `ancestors`, `dept_key`, `dept_name`, `dept_type`, `dept_category`, `order_num`, `leader`, `phone`, `email`, `status`, `credit_code`, `area_code`, `address`, `dept_role`, `created_dept`, `created_by`, `created_at`, `updated_by`, `updated_at`, `deleted_by`, `deleted_at`) VALUES +(1,'000000',0,'0,','CUS-202601-0001','示例企业',1,'',0,36,'15888888222','xxx@qq.com','0','098765432109876543','370100000000','历下区',66,100,1,'2025-02-13 11:56:36',111,'2026-07-29 16:06:31',NULL,NULL), +(2,'000000',1,'0,1,','CUS-202601-0002','示例企业',1,'',1,12,'','','0','123456789012345678','','高新区',67,NULL,0,'2025-03-16 14:36:52',12,'2026-07-29 16:14:12',NULL,NULL), +(3,'000000',1,'0,1,','','终端用户部门',1,'',20,0,'','','0','','','',0,100,1,'2026-07-08 15:30:23',1,'2026-07-08 15:34:57',NULL,NULL), +(4,'000000',2,'0,1,2,','','示例代理1',1,'',1,27,'','','0','','','',0,100,1,'2026-06-22 03:07:10',1,'2026-07-21 09:38:12',NULL,NULL), +(5,'000000',2,'0,1,2,','','示例代理2',1,'',2,0,'','','0','','','',0,100,12,'2026-06-22 14:18:35',12,'2026-06-22 14:18:35',NULL,NULL), +(6,'000000',2,'0,1,2,','','示例代理3',1,'',1,0,'','','0','','','',0,100,1,'2026-07-02 13:39:51',1,'2026-07-02 13:39:52',NULL,NULL), +(7,'000000',2,'0,1,2,','','示例代理4',1,'',5,0,'','','0','','','',0,100,1,'2026-07-17 09:29:09',1,'2026-07-17 09:29:16',NULL,NULL); + +INSERT INTO `sys_config` (`config_id`, `tenant_id`, `config_name`, `config_key`, `config_value`, `config_type`, `created_dept`, `created_by`, `created_at`, `updated_by`, `updated_at`, `remark`) VALUES +(1,'000000','主框架页-默认皮肤样式名称','sys.index.skinName','skin-blue','Y',103,1,'2025-02-13 11:56:36',NULL,NULL,'蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow'), +(2,'000000','用户管理-账号初始密码','sys.user.initPassword','123456','Y',103,1,'2025-02-13 11:56:36',NULL,NULL,'初始化密码 123456'), +(3,'000000','主框架页-侧边栏主题','sys.index.sideTheme','theme-dark','Y',103,1,'2025-02-13 11:56:36',NULL,NULL,'深色主题theme-dark,浅色主题theme-light'), +(4,'000000','账号自助-是否开启用户注册功能','sys.account.registerUser','false','Y',103,1,'2025-02-13 11:56:36',NULL,NULL,'是否开启注册用户功能(true开启,false关闭)'), +(5,'000000','OSS预览列表资源开关','sys.oss.previewListResource','true','Y',103,1,'2025-02-13 11:56:36',NULL,NULL,'true:开启, false:关闭'), +(6,'000000','上传文件类型','sys.oss.fileType','txt,md,doc,docx,pdf,xls,xlsx,ppt,pptx,txt,jpg,jpeg,png,gif,mp4,avi,mov,mp3,wav,m4a,csv','Y',103,1,'2025-03-14 11:28:54',1,'2025-03-14 11:29:11',''), +(7,'000000','上传图片类型','sys.oss.imgType','jpg,jpeg,png,gif,webp','Y',103,1,'2025-03-14 11:29:32',1,'2025-03-14 11:29:32',''), +(8,'000000','上传文件大小','sys.oss.fileSize','20M','Y',103,1,'2025-03-14 11:29:48',1,'2025-03-14 11:29:48',''), +(9,'000000','上传图片大小','sys.oss.imgSize','5M','Y',103,1,'2025-03-14 11:30:07',1,'2025-03-14 11:30:07',''), +(10,'000000','上传文件Url路径','sys.oss.urlPath','resource/upload|/upload','Y',103,1,'2025-03-14 12:48:44',1,'2025-03-14 12:48:44','\"http://ab.com/\" 或 \"/\" 或 \"resource/upload|http://ab.com/upload\"'), +(11,'000000','是否启动在线用户强制退出','sys.online.forceLogout','true','Y',103,1,'2025-03-26 20:07:24',1,'2025-03-26 20:08:33','true开启,false关闭'), +(12,'100007','主框架页-默认皮肤样式名称','sys.index.skinName','skin-blue','Y',120,14,'2026-06-01 14:48:06',NULL,NULL,'蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow'), +(13,'100007','用户管理-账号初始密码','sys.user.initPassword','123456','Y',120,14,'2026-06-01 14:48:06',NULL,NULL,'初始化密码 123456'), +(14,'100007','主框架页-侧边栏主题','sys.index.sideTheme','theme-dark','Y',120,14,'2026-06-01 14:48:06',NULL,NULL,'深色主题theme-dark,浅色主题theme-light'), +(15,'100007','账号自助-是否开启用户注册功能','sys.account.registerUser','false','Y',120,14,'2026-06-01 14:48:06',NULL,NULL,'是否开启注册用户功能(true开启,false关闭)'), +(16,'100007','OSS预览列表资源开关','sys.oss.previewListResource','true','Y',120,14,'2026-06-01 14:48:06',NULL,NULL,'true:开启, false:关闭'), +(17,'100007','上传文件类型','sys.oss.fileType','txt,md,doc,docx,pdf,xls,xlsx,ppt,pptx,txt,jpg,jpeg,png,gif,mp4,avi,mov,mp3,wav,m4a,csv,json,application/json,bin,hex,fw,zip','Y',103,1,'2026-06-01 14:48:06',NULL,NULL,''), +(18,'100007','上传图片类型','sys.oss.imgType','jpg,jpeg,png,gif,webp','Y',120,14,'2026-06-01 14:48:06',NULL,NULL,''), +(19,'100007','上传文件大小','sys.oss.fileSize','20M','Y',120,14,'2026-06-01 14:48:06',NULL,NULL,''), +(20,'100007','上传图片大小','sys.oss.imgSize','5M','Y',120,14,'2026-06-01 14:48:06',NULL,NULL,''), +(21,'100007','上传文件Url路径','sys.oss.urlPath','resource/upload|/upload','Y',120,14,'2026-06-01 14:48:06',NULL,NULL,'\"http://ab.com/\" 或 \"/\" 或 \"resource/upload|http://ab.com/upload\"'), +(22,'100007','是否启动在线用户强制退出','sys.online.forceLogout','true','Y',120,14,'2026-06-01 14:48:06',NULL,NULL,'true开启,false关闭'), +(23,'100007','系统启用的监控通道','iot.default.channel.gb28181','0','Y',120,14,'2026-06-01 14:48:06',NULL,NULL,''), +(24,'100007','报警资源匹配时间','iot.alarm.image.timesec','10','N',120,14,'2026-06-01 14:48:06',NULL,NULL,NULL), +(25,'100007','自主注册组织ID','iot.register.dept','0','N',120,14,'2026-06-01 14:48:06',NULL,NULL,NULL), +(26,'100007','自主注册角色ID','iot.register.role','0','N',120,14,'2026-06-01 14:48:06',NULL,NULL,NULL), +(27,'100007','系统默认MQTT渠道','iot.default.channel.mqtt','0','N',120,14,'2026-06-01 14:48:06',NULL,NULL,NULL), +(28,'100007','系统默认TCP渠道','iot.default.channel.tcp','0','N',120,14,'2026-06-01 14:48:06',NULL,NULL,NULL), +(29,'100007','系统默认UDP渠道','iot.default.channel.udp','0','N',120,14,'2026-06-01 14:48:06',NULL,NULL,NULL), +(30,'100007','项目API默认地址','iot.project.api.default.addr','http://127.0.0.1:8510','Y',120,14,'2026-06-01 14:48:06',NULL,NULL,''), +(31,'000000','小程序自主注册组织ID','iot.register.app.dept','147','Y',100,1,'2026-07-14 11:18:39',1,'2026-07-14 11:18:39','小程序默认部门ID'), +(32,'000000','小程序自主注册角色ID','iot.register.app.role','54','Y',100,1,'2026-07-14 11:24:06',1,'2026-07-14 11:24:06','小程序默认角色ID'); + +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 +(1,'test1','','1','test.abb','0 * * * ',1,1,'1','Lorem elit',101,11,'2025-03-19 12:00:33',11,'2025-03-20 11:28:07',11,'2025-03-20 11:28:07'), +(2,'韩成','Duis aute','0','0',' sss ',1,0,'0','0',101,11,'2025-03-19 13:13:29',11,'2025-03-20 11:28:13',11,'2025-03-20 11:28:13'), +(3,'test2','收拾收拾','0','test2','test2',2,0,'1','test2',101,11,'2025-03-20 10:29:48',11,'2025-03-20 11:28:13',11,'2025-03-20 11:28:13'), +(4,'test31','1','0','clear_data','3/10 * * * * ?',1,0,'1','test31',101,11,'2025-03-20 10:33:23',1,'2026-07-30 15:46:29',1,'2026-07-30 15:46:29'), +(5,'test11','','0','test','3/5 * * * 3/5 ?',1,0,'1','test11',101,11,'2025-03-20 11:28:57',1,'2026-07-30 15:46:27',1,'2026-07-30 15:46:27'), +(6,'test121','test121','0','test121','3/5 * 2,3 * * ? *',1,0,'1','test121',101,11,'2025-03-20 11:29:16',11,'2026-07-30 15:46:13',1,'2026-07-30 15:46:13'), +(7,'test2','1','1','test','3/5 * * * * ?',1,1,'1','test2',103,1,'2025-03-25 16:53:33',1,'2025-03-25 16:54:56',1,'2025-03-25 16:54:56'), +(8,'test1','2','2','test','* * * ? * 2/1',2,1,'1','test2',103,1,'2025-03-26 09:54:08',1,'2026-07-30 15:46:11',1,'2026-07-30 15:46:11'), +(9,'卡数据 - 当前用量同步','','1','syns_usage','0 0 0/6 * * ? ',1,0,'1','',103,1,NULL,1,'2026-07-30 16:14:13',NULL,NULL), +(10,' 卡数据 - 运营商状态同步','','0','syns_sim_status','0 0 0 1/1 * ? ',1,0,'1','',103,1,'2026-06-04 21:12:34',1,'2026-07-30 16:28:47',NULL,NULL), +(11,' 卡数据 - 月用量记录时序','','0','sync_traffic_usage_monthly','0 0 3 1 * ? ',1,0,'1','',103,1,'2026-06-21 11:53:03',1,'2026-07-30 16:16:11',NULL,NULL), +(12,'卡数据 - 日用量记录时序','','0','sync_traffic_usage_daily','0 0 3 * * ?',1,0,'1','',103,1,'2026-06-22 00:11:11',1,'2026-07-30 16:16:00',NULL,NULL), +(13,'测试 - 全量预警扫描','','0','scan_sim_warning','30 0 1 * * *',1,1,'1','单卡,流量池',100,1,'2026-07-24 10:18:00',1,'2026-08-05 09:42:06',NULL,NULL), +(14,' 预警 - SIM卡到期扫描','','0','notify_package_expiry','0 0 9 * * ?',1,1,'1','',100,1,'2026-07-27 14:35:16',1,'2026-07-31 17:54:32',1,'2026-07-31 17:54:32'), +(15,' 预警 - 流量池用量扫描','','0','check_flow_pool_warning','0 */15 * * * ?',1,1,'0','',100,1,'2026-07-27 14:37:34',1,'2026-07-30 16:10:14',NULL,NULL), +(16,'预警 - SIM卡用量扫描','','0','scan_sim_traffic_warning','0 */15 * * * ?',1,1,'0','',100,1,'2026-07-27 14:37:59',1,'2026-07-30 16:09:59',NULL,NULL), +(17,'卡管控 - 达量断网扫描','','0','check_traffic_cutoff','`0 */15 * * * ?`',1,1,'0','',100,1,'2026-07-27 15:37:08',1,'2026-07-30 16:09:31',NULL,NULL), +(18,' 套餐 - 生命周期流转','','0','sync_package_lifecycle','0 */15 * * * ?',1,1,'0','',100,1,'2026-07-28 16:00:00',1,'2026-07-30 16:08:45',NULL,NULL), +(19,'财务 - 可提现账户月账单','2026-07','0','settle_profit_account_month_bill','0 0 4 2 * ?',1,0,'0','',100,1,'2026-07-28 16:09:51',1,'2026-07-30 16:08:57',NULL,NULL), +(20,'财务 - 消费账户月账单','2026-07','0','settle_consume_account_month_bill','0 0 4 2 * ?',1,0,'0','',100,1,'2026-07-28 16:20:25',1,'2026-07-30 16:09:02',NULL,NULL), +(21,'财务 - 分润出账','2026-06|2025-07','0','settle_commission','0 0 4 * * ?',1,0,'0','',100,1,'2026-07-28 16:48:19',1,'2026-07-31 16:14:06',NULL,NULL), +(22,'流量池-卡信息数据同步流量池 ','117','0','sync_flow_pool_card','0 0 4 * * ?',1,0,'0','',100,1,'2026-07-31 16:16:32',1,'2026-07-31 16:21:56',NULL,NULL), +(23,'预警-到期预警全量预加载','','0','PreloadSimExpireWarning','0 30 23 L * ?',1,1,'0','每月底扫描下下个月到期卡,写入 Redis 候选池',100,1,'2026-07-31 17:53:44',1,'2026-07-31 17:56:34',NULL,NULL), +(24,'预警-定时到期预警扫描','','0','ScanSimExpireCandidateWarning','0 0 9 * * ?',1,1,'0','',100,1,'2026-07-31 17:54:13',1,'2026-08-03 08:38:06',NULL,NULL); + +INSERT INTO `sys_oss_config` (`oss_config_id`, `tenant_id`, `config_key`, `access_key`, `secret_key`, `bucket_name`, `prefix`, `endpoint`, `domain`, `is_https`, `region`, `access_policy`, `status`, `ext1`, `created_dept`, `created_by`, `created_at`, `updated_by`, `updated_at`, `remark`) VALUES +(1,'000000','minio','ruoyi','ruoyi123','ruoyi','','127.0.0.1:9000','','N','','1','0','',103,1,'2025-02-13 11:56:36',1,'2025-02-13 11:56:36',NULL), +(2,'000000','qiniu','XXXXXXXXXXXXXXX','XXXXXXXXXXXXXXX','ruoyi','','s3-cn-north-1.qiniucs.com','','N','','1','1','',103,1,'2025-02-13 11:56:36',1,'2025-02-13 11:56:36',NULL), +(3,'000000','aliyun','XXXXXXXXXXXXXXX','XXXXXXXXXXXXXXX','ruoyi','','oss-cn-beijing.aliyuncs.com','','N','','1','1','',103,1,'2025-02-13 11:56:36',1,'2025-02-13 11:56:36',NULL), +(4,'000000','qcloud','XXXXXXXXXXXXXXX','XXXXXXXXXXXXXXX','ruoyi-1240000000','','cos.ap-beijing.myqcloud.com','','N','ap-beijing','1','1','',103,1,'2025-02-13 11:56:36',1,'2025-02-13 11:56:36',NULL), +(5,'000000','image','ruoyi','ruoyi123','ruoyi','image','127.0.0.1:9000','','N','','1','1','',103,1,'2025-02-13 11:56:36',1,'2025-02-13 11:56:36',NULL), +(6,'000000','test','test222','test222','test222','stet','test22','222','Y','test','2','1','',103,1,'2025-03-13 17:11:44',1,'2025-03-13 17:17:53','sttt'); + +INSERT INTO `sys_client` (`id`, `client_id`, `client_key`, `client_secret`, `grant_type`, `device_type`, `active_timeout`, `timeout`, `status`, `created_dept`, `created_by`, `created_at`, `updated_by`, `updated_at`, `deleted_by`, `deleted_at`) VALUES +(1,'e5cd7e4891bf95d1d19206ce24a7b32e','pc','pc123','password,social','pc',1800,604800,'0',103,1,'2025-02-13 11:56:36',1,'2025-03-14 14:51:44',NULL,NULL), +(2,'428a8310cd442757ae699df5d894f051','app','app123','password,sms,social','android',1800,604800,'0',103,1,'2025-02-13 11:56:36',1,'2025-02-13 11:56:36',NULL,NULL), +(3,'','dd','dd','sms,xcx','android',1800,604800,'0',103,1,'2025-03-14 14:24:31',1,'2025-03-14 14:33:54',1,'2025-03-14 14:33:54'), +(4,'1f6fxdu15xzd8fs32vh5ywwe004xwmqv','dd','dd','sms,email','ios',1800,604800,'0',103,1,'2025-03-14 14:34:09',NULL,'2025-03-14 14:52:59',1,'2025-03-14 14:52:59'); + +INSERT INTO `sys_notice` (`notice_id`, `tenant_id`, `notice_title`, `notice_type`, `notice_content`, `status`, `notice_range`, `dept_ids`, `user_ids`, `created_dept`, `created_by`, `created_at`, `updated_by`, `updated_at`, `remark`) VALUES +(1,'000000','温馨提醒:2018-07-01 新版本发布啦','2',_binary '新版本内容','0',1,NULL,NULL,103,1,'2025-02-13 11:56:36',NULL,NULL,'管理员'), +(2,'000000','维护通知:2018-07-01 系统凌晨维护','1',_binary '维护内容','0',1,NULL,NULL,103,1,'2025-02-13 11:56:36',NULL,NULL,'管理员'); + +INSERT INTO `sys_tenant` (`id`, `tenant_id`, `contact_user_name`, `contact_phone`, `company_name`, `license_number`, `address`, `intro`, `domain`, `remark`, `package_id`, `admin_role_id`, `admin_dept_id`, `admin_user_id`, `expire_time`, `account_count`, `status`, `created_dept`, `created_by`, `created_at`, `updated_by`, `updated_at`, `deleted_by`, `deleted_at`) VALUES +(1,'000000','管理组','15888888888','示例企业有限公司','','','多租户通用后台管理管理系统','','备注',0,1,103,1,'2027-05-28 00:00:00',-1,'0',103,1,'2025-02-13 11:56:36',1,'2026-05-28 15:22:57',NULL,NULL), +(6,'100006','李先生','18600000000','示例企业','3332233','地址','企业介绍','example.com','备注',9,117,10,1,'2026-03-16 00:00:00',-1,'0',103,1,'2025-03-16 14:36:52',1,'2026-05-28 15:23:12',1,'2026-05-28 15:23:12'); + +INSERT INTO `sys_social` (`id`, `user_id`, `tenant_id`, `auth_id`, `source`, `open_id`, `user_name`, `nick_name`, `email`, `avatar`, `access_token`, `expire_in`, `refresh_token`, `access_code`, `union_id`, `scope`, `token_type`, `id_token`, `mac_algorithm`, `mac_key`, `code`, `oauth_token`, `oauth_token_secret`, `created_dept`, `created_by`, `created_at`, `updated_by`, `updated_at`, `deleted_by`, `deleted_at`) VALUES +(1,60,'000000','wechat_mp:oWvGO7SkEur8Tb9TTYyl2aKMWdPg','wechat_mp','oWvGO7SkEur8Tb9TTYyl2aKMWdPg','user06','示例用户06','','','oWvGO7SkEur8Tb9TTYyl2aKMWdPg',NULL,NULL,NULL,'',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,117,60,'2026-07-17 16:59:11',60,'2026-07-22 10:33:31',NULL,NULL), +(2,87,'000000','wechat_mp:oWvGO7SkEur8Tb9TTYyl2aKMWdPg','wechat_mp','oWvGO7SkEur8Tb9TTYyl2aKMWdPg','18816314697','appuser006','','/static/images/default-avatar.png','oWvGO7SkEur8Tb9TTYyl2aKMWdPg',NULL,NULL,NULL,'',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,147,87,'2026-07-31 18:38:39',87,'2026-07-31 18:38:55',NULL,NULL); + +INSERT INTO `sys_tenant_package` (`package_id`, `package_name`, `menu_ids`, `remark`, `menu_check_strictly`, `status`, `created_dept`, `created_by`, `created_at`, `updated_by`, `updated_at`, `deleted_by`, `deleted_at`) VALUES +(1,'test','100,1001,1002,1003,1004,1005,1006,1007','test',1,'0',0,0,'2025-03-16 11:56:06',1,'2026-06-01 14:55:50',0,NULL); + +INSERT INTO `sys_user_post` (`tenant_id`, `user_id`, `post_id`) VALUES +('000000',6,3); + +INSERT INTO `t_api` (`id`, `app_key`, `app_secret`, `rate_limit_period`, `rate_limit_count`, `dept_id`, `group_id`, `status`, `tenant_id`, `created_dept`, `created_by`, `created_at`, `updated_by`, `updated_at`) VALUES +(1,'b96b84a4d70740c1bfe569a11ca62e219affe3a6','588035550bd35c0001fbcda2c4d812ebdebae9763127943f097758e029a0fdbc',100,100,2,2,0,'000000',117,1,'2026-05-28 09:15:19',NULL,'2026-07-06 14:17:23'), +(2,'a05df96b13285dea7abb1edbb7dadc5b02dda7fd','fa51b92ff866fb4e080fd5fcb42618249a6e1a2c87b7ead8006359980669bda9',3600,10000,2,2,0,'000000',117,1,'2026-06-15 16:32:47',1,'2026-07-24 14:18:12'); + +INSERT INTO `t_api_group` (`id`, `group_name`, `group_code`, `status`, `remark`, `tenant_id`, `created_dept`, `created_by`, `created_at`, `updated_by`, `updated_at`) VALUES +(1,'管理者数据权限','managerAuth',0,'','000000',100,1,'2026-07-03 08:39:47',1,'2026-07-24 14:20:56'), +(2,'默认数据权限','defaultAuth',0,'','000000',100,1,'2026-07-03 08:40:23',1,'2026-07-24 14:20:46'); + +INSERT INTO `t_api_resource` (`id`, `api_name`, `api_code`, `method`, `path`, `status`, `version`, `remark`, `tenant_id`, `created_dept`, `created_by`, `created_at`, `updated_by`, `updated_at`) VALUES +(1,'获取Token','auth:token',1,'/openapi/v3/query/token',0,'v3','','000000',100,1,'2026-07-02 18:00:15',NULL,'2026-07-03 10:49:32'), +(2,'查询SIM IMEI','auth:sim-imei',1,'/openapi/v3/query/sim-imei',0,'v3',NULL,'000000',100,1,'2026-07-03 08:34:20',NULL,'2026-07-03 10:49:33'), +(3,'查询SIM信息','auth:simInfo',1,'/openapi/v3/query/sim-info',0,'v3',NULL,'000000',100,1,'2026-07-03 08:35:47',NULL,'2026-07-03 10:49:34'), +(4,'查询SIM流量限制','auth:sim-limit',1,'/openapi/v3/query/sim-limit',0,'v3',NULL,'000000',100,1,'2026-07-03 08:37:11',NULL,'2026-07-03 10:49:36'), +(5,'查询SIM流量使用','auth:sim-usage',1,'/openapi/v3/query/sim-usage',0,'v3',NULL,'000000',100,1,'2026-07-03 08:38:11',NULL,'2026-07-03 10:49:39'); + +INSERT INTO `t_api_group_resource` (`group_id`, `api_id`) VALUES +(1,1), +(2,1), +(1,2), +(2,2), +(1,3), +(2,3), +(1,4), +(2,4), +(1,5), +(2,5); + +INSERT INTO `t_division_code` (`region_id`, `region_code`, `region_name`, `region_level`, `region_parent`, `region_type`) VALUES +(1,'110100000000','市辖区',2,'110000000000',''), +(2,'120100000000','市辖区',2,'120000000000',''), +(3,'130100000000','石家庄市',2,'130000000000',''), +(4,'130200000000','唐山市',2,'130000000000',''), +(5,'130300000000','秦皇岛市',2,'130000000000',''), +(6,'130400000000','邯郸市',2,'130000000000',''), +(7,'130500000000','邢台市',2,'130000000000',''), +(8,'130600000000','保定市',2,'130000000000',''), +(9,'130700000000','张家口市',2,'130000000000',''), +(10,'130800000000','承德市',2,'130000000000',''), +(11,'130900000000','沧州市',2,'130000000000',''), +(12,'131000000000','廊坊市',2,'130000000000',''), +(13,'131100000000','衡水市',2,'130000000000',''), +(14,'133100000000','雄安新区',2,'130000000000',''), +(15,'140100000000','太原市',2,'140000000000',''), +(16,'140200000000','大同市',2,'140000000000',''), +(17,'140300000000','阳泉市',2,'140000000000',''), +(18,'140400000000','长治市',2,'140000000000',''), +(19,'140500000000','晋城市',2,'140000000000',''), +(20,'140600000000','朔州市',2,'140000000000',''), +(21,'140700000000','晋中市',2,'140000000000',''), +(22,'140800000000','运城市',2,'140000000000',''), +(23,'140900000000','忻州市',2,'140000000000',''), +(24,'141000000000','临汾市',2,'140000000000',''), +(25,'141100000000','吕梁市',2,'140000000000',''), +(26,'150100000000','呼和浩特市',2,'150000000000',''), +(27,'150200000000','包头市',2,'150000000000',''), +(28,'150300000000','乌海市',2,'150000000000',''), +(29,'150400000000','赤峰市',2,'150000000000',''), +(30,'150500000000','通辽市',2,'150000000000',''), +(31,'150600000000','鄂尔多斯市',2,'150000000000',''), +(32,'150700000000','呼伦贝尔市',2,'150000000000',''), +(33,'150800000000','巴彦淖尔市',2,'150000000000',''), +(34,'150900000000','乌兰察布市',2,'150000000000',''), +(35,'152200000000','兴安盟',2,'150000000000',''), +(36,'152500000000','锡林郭勒盟',2,'150000000000',''), +(37,'152900000000','阿拉善盟',2,'150000000000',''), +(38,'210100000000','沈阳市',2,'210000000000',''), +(39,'210200000000','大连市',2,'210000000000',''), +(40,'210300000000','鞍山市',2,'210000000000',''), +(41,'210400000000','抚顺市',2,'210000000000',''), +(42,'210500000000','本溪市',2,'210000000000',''), +(43,'210600000000','丹东市',2,'210000000000',''), +(44,'210700000000','锦州市',2,'210000000000',''), +(45,'210800000000','营口市',2,'210000000000',''), +(46,'210900000000','阜新市',2,'210000000000',''), +(47,'211000000000','辽阳市',2,'210000000000',''), +(48,'211100000000','盘锦市',2,'210000000000',''), +(49,'211200000000','铁岭市',2,'210000000000',''), +(50,'211300000000','朝阳市',2,'210000000000',''), +(51,'211400000000','葫芦岛市',2,'210000000000',''), +(52,'220100000000','长春市',2,'220000000000',''), +(53,'220200000000','吉林市',2,'220000000000',''), +(54,'220300000000','四平市',2,'220000000000',''), +(55,'220400000000','辽源市',2,'220000000000',''), +(56,'220500000000','通化市',2,'220000000000',''), +(57,'220600000000','白山市',2,'220000000000',''), +(58,'220700000000','松原市',2,'220000000000',''), +(59,'220800000000','白城市',2,'220000000000',''), +(60,'222400000000','延边朝鲜族自治州',2,'220000000000',''), +(61,'230100000000','哈尔滨市',2,'230000000000',''), +(62,'230200000000','齐齐哈尔市',2,'230000000000',''), +(63,'230300000000','鸡西市',2,'230000000000',''), +(64,'230400000000','鹤岗市',2,'230000000000',''), +(65,'230500000000','双鸭山市',2,'230000000000',''), +(66,'230600000000','大庆市',2,'230000000000',''), +(67,'230700000000','伊春市',2,'230000000000',''), +(68,'230800000000','佳木斯市',2,'230000000000',''), +(69,'230900000000','七台河市',2,'230000000000',''), +(70,'231000000000','牡丹江市',2,'230000000000',''), +(71,'231100000000','黑河市',2,'230000000000',''), +(72,'231200000000','绥化市',2,'230000000000',''), +(73,'232700000000','大兴安岭地区',2,'230000000000',''), +(74,'310100000000','市辖区',2,'310000000000',''), +(75,'320100000000','南京市',2,'320000000000',''), +(76,'320200000000','无锡市',2,'320000000000',''), +(77,'320300000000','徐州市',2,'320000000000',''), +(78,'320400000000','常州市',2,'320000000000',''), +(79,'320500000000','苏州市',2,'320000000000',''), +(80,'320600000000','南通市',2,'320000000000',''), +(81,'320700000000','连云港市',2,'320000000000',''), +(82,'320800000000','淮安市',2,'320000000000',''), +(83,'320900000000','盐城市',2,'320000000000',''), +(84,'321000000000','扬州市',2,'320000000000',''), +(85,'321100000000','镇江市',2,'320000000000',''), +(86,'321200000000','泰州市',2,'320000000000',''), +(87,'321300000000','宿迁市',2,'320000000000',''), +(88,'330100000000','杭州市',2,'330000000000',''), +(89,'330200000000','宁波市',2,'330000000000',''), +(90,'330300000000','温州市',2,'330000000000',''), +(91,'330400000000','嘉兴市',2,'330000000000',''), +(92,'330500000000','湖州市',2,'330000000000',''), +(93,'330600000000','绍兴市',2,'330000000000',''), +(94,'330700000000','金华市',2,'330000000000',''), +(95,'330800000000','衢州市',2,'330000000000',''), +(96,'330900000000','舟山市',2,'330000000000',''), +(97,'331000000000','台州市',2,'330000000000',''), +(98,'331100000000','丽水市',2,'330000000000',''), +(99,'340100000000','合肥市',2,'340000000000',''), +(100,'340200000000','芜湖市',2,'340000000000',''), +(101,'340300000000','蚌埠市',2,'340000000000',''), +(102,'340400000000','淮南市',2,'340000000000',''), +(103,'340500000000','马鞍山市',2,'340000000000',''), +(104,'340600000000','淮北市',2,'340000000000',''), +(105,'340700000000','铜陵市',2,'340000000000',''), +(106,'340800000000','安庆市',2,'340000000000',''), +(107,'341000000000','黄山市',2,'340000000000',''), +(108,'341100000000','滁州市',2,'340000000000',''), +(109,'341200000000','阜阳市',2,'340000000000',''), +(110,'341300000000','宿州市',2,'340000000000',''), +(111,'341500000000','六安市',2,'340000000000',''), +(112,'341600000000','亳州市',2,'340000000000',''), +(113,'341700000000','池州市',2,'340000000000',''), +(114,'341800000000','宣城市',2,'340000000000',''), +(115,'350100000000','福州市',2,'350000000000',''), +(116,'350200000000','厦门市',2,'350000000000',''), +(117,'350300000000','莆田市',2,'350000000000',''), +(118,'350400000000','三明市',2,'350000000000',''), +(119,'350500000000','泉州市',2,'350000000000',''), +(120,'350600000000','漳州市',2,'350000000000',''), +(121,'350700000000','南平市',2,'350000000000',''), +(122,'350800000000','龙岩市',2,'350000000000',''), +(123,'350900000000','宁德市',2,'350000000000',''), +(124,'360100000000','南昌市',2,'360000000000',''), +(125,'360200000000','景德镇市',2,'360000000000',''), +(126,'360300000000','萍乡市',2,'360000000000',''), +(127,'360400000000','九江市',2,'360000000000',''), +(128,'360500000000','新余市',2,'360000000000',''), +(129,'360600000000','鹰潭市',2,'360000000000',''), +(130,'360700000000','赣州市',2,'360000000000',''), +(131,'360800000000','吉安市',2,'360000000000',''), +(132,'360900000000','宜春市',2,'360000000000',''), +(133,'361000000000','抚州市',2,'360000000000',''), +(134,'361100000000','上饶市',2,'360000000000',''), +(135,'370100000000','济南市',2,'370000000000',''), +(136,'370200000000','青岛市',2,'370000000000',''), +(137,'370300000000','淄博市',2,'370000000000',''), +(138,'370400000000','枣庄市',2,'370000000000',''), +(139,'370500000000','东营市',2,'370000000000',''), +(140,'370600000000','烟台市',2,'370000000000',''), +(141,'370700000000','潍坊市',2,'370000000000',''), +(142,'370800000000','济宁市',2,'370000000000',''), +(143,'370900000000','泰安市',2,'370000000000',''), +(144,'371000000000','威海市',2,'370000000000',''), +(145,'371100000000','日照市',2,'370000000000',''), +(146,'371300000000','临沂市',2,'370000000000',''), +(147,'371400000000','德州市',2,'370000000000',''), +(148,'371500000000','聊城市',2,'370000000000',''), +(149,'371600000000','滨州市',2,'370000000000',''), +(150,'371700000000','菏泽市',2,'370000000000',''), +(151,'410100000000','郑州市',2,'410000000000',''), +(152,'410200000000','开封市',2,'410000000000',''), +(153,'410300000000','洛阳市',2,'410000000000',''), +(154,'410400000000','平顶山市',2,'410000000000',''), +(155,'410500000000','安阳市',2,'410000000000',''), +(156,'410600000000','鹤壁市',2,'410000000000',''), +(157,'410700000000','新乡市',2,'410000000000',''), +(158,'410800000000','焦作市',2,'410000000000',''), +(159,'410900000000','濮阳市',2,'410000000000',''), +(160,'411000000000','许昌市',2,'410000000000',''), +(161,'411100000000','漯河市',2,'410000000000',''), +(162,'411200000000','三门峡市',2,'410000000000',''), +(163,'411300000000','南阳市',2,'410000000000',''), +(164,'411400000000','商丘市',2,'410000000000',''), +(165,'411500000000','信阳市',2,'410000000000',''), +(166,'411600000000','周口市',2,'410000000000',''), +(167,'411700000000','驻马店市',2,'410000000000',''), +(168,'419000000000','省直辖县级行政区划',2,'410000000000',''), +(169,'420100000000','武汉市',2,'420000000000',''), +(170,'420200000000','黄石市',2,'420000000000',''), +(171,'420300000000','十堰市',2,'420000000000',''), +(172,'420500000000','宜昌市',2,'420000000000',''), +(173,'420600000000','襄阳市',2,'420000000000',''), +(174,'420700000000','鄂州市',2,'420000000000',''), +(175,'420800000000','荆门市',2,'420000000000',''), +(176,'420900000000','孝感市',2,'420000000000',''), +(177,'421000000000','荆州市',2,'420000000000',''), +(178,'421100000000','黄冈市',2,'420000000000',''), +(179,'421200000000','咸宁市',2,'420000000000',''), +(180,'421300000000','随州市',2,'420000000000',''), +(181,'422800000000','恩施土家族苗族自治州',2,'420000000000',''), +(182,'429000000000','省直辖县级行政区划',2,'420000000000',''), +(183,'430100000000','长沙市',2,'430000000000',''), +(184,'430200000000','株洲市',2,'430000000000',''), +(185,'430300000000','湘潭市',2,'430000000000',''), +(186,'430400000000','衡阳市',2,'430000000000',''), +(187,'430500000000','邵阳市',2,'430000000000',''), +(188,'430600000000','岳阳市',2,'430000000000',''), +(189,'430700000000','常德市',2,'430000000000',''), +(190,'430800000000','张家界市',2,'430000000000',''), +(191,'430900000000','益阳市',2,'430000000000',''), +(192,'431000000000','郴州市',2,'430000000000',''), +(193,'431100000000','永州市',2,'430000000000',''), +(194,'431200000000','怀化市',2,'430000000000',''), +(195,'431300000000','娄底市',2,'430000000000',''), +(196,'433100000000','湘西土家族苗族自治州',2,'430000000000',''), +(197,'440100000000','广州市',2,'440000000000',''), +(198,'440200000000','韶关市',2,'440000000000',''), +(199,'440300000000','深圳市',2,'440000000000',''), +(200,'440400000000','珠海市',2,'440000000000',''), +(201,'440500000000','汕头市',2,'440000000000',''), +(202,'440600000000','佛山市',2,'440000000000',''), +(203,'440700000000','江门市',2,'440000000000',''), +(204,'440800000000','湛江市',2,'440000000000',''), +(205,'440900000000','茂名市',2,'440000000000',''), +(206,'441200000000','肇庆市',2,'440000000000',''), +(207,'441300000000','惠州市',2,'440000000000',''), +(208,'441400000000','梅州市',2,'440000000000',''), +(209,'441500000000','汕尾市',2,'440000000000',''), +(210,'441600000000','河源市',2,'440000000000',''), +(211,'441700000000','阳江市',2,'440000000000',''), +(212,'441800000000','清远市',2,'440000000000',''), +(213,'441900000000','东莞市',2,'440000000000',''), +(214,'442000000000','中山市',2,'440000000000',''), +(215,'445100000000','潮州市',2,'440000000000',''), +(216,'445200000000','揭阳市',2,'440000000000',''), +(217,'445300000000','云浮市',2,'440000000000',''), +(218,'450100000000','南宁市',2,'450000000000',''), +(219,'450200000000','柳州市',2,'450000000000',''), +(220,'450300000000','桂林市',2,'450000000000',''), +(221,'450400000000','梧州市',2,'450000000000',''), +(222,'450500000000','北海市',2,'450000000000',''), +(223,'450600000000','防城港市',2,'450000000000',''), +(224,'450700000000','钦州市',2,'450000000000',''), +(225,'450800000000','贵港市',2,'450000000000',''), +(226,'450900000000','玉林市',2,'450000000000',''), +(227,'451000000000','百色市',2,'450000000000',''), +(228,'451100000000','贺州市',2,'450000000000',''), +(229,'451200000000','河池市',2,'450000000000',''), +(230,'451300000000','来宾市',2,'450000000000',''), +(231,'451400000000','崇左市',2,'450000000000',''), +(232,'460100000000','海口市',2,'460000000000',''), +(233,'460200000000','三亚市',2,'460000000000',''), +(234,'460300000000','三沙市',2,'460000000000',''), +(235,'460400000000','儋州市',2,'460000000000',''), +(236,'469000000000','省直辖县级行政区划',2,'460000000000',''), +(237,'500100000000','市辖区',2,'500000000000',''), +(238,'500200000000','县',2,'500000000000',''), +(239,'510100000000','成都市',2,'510000000000',''), +(240,'510300000000','自贡市',2,'510000000000',''), +(241,'510400000000','攀枝花市',2,'510000000000',''), +(242,'510500000000','泸州市',2,'510000000000',''), +(243,'510600000000','德阳市',2,'510000000000',''), +(244,'510700000000','绵阳市',2,'510000000000',''), +(245,'510800000000','广元市',2,'510000000000',''), +(246,'510900000000','遂宁市',2,'510000000000',''), +(247,'511000000000','内江市',2,'510000000000',''), +(248,'511100000000','乐山市',2,'510000000000',''), +(249,'511300000000','南充市',2,'510000000000',''), +(250,'511400000000','眉山市',2,'510000000000',''), +(251,'511500000000','宜宾市',2,'510000000000',''), +(252,'511600000000','广安市',2,'510000000000',''), +(253,'511700000000','达州市',2,'510000000000',''), +(254,'511800000000','雅安市',2,'510000000000',''), +(255,'511900000000','巴中市',2,'510000000000',''), +(256,'512000000000','资阳市',2,'510000000000',''), +(257,'513200000000','阿坝藏族羌族自治州',2,'510000000000',''), +(258,'513300000000','甘孜藏族自治州',2,'510000000000',''), +(259,'513400000000','凉山彝族自治州',2,'510000000000',''), +(260,'520100000000','贵阳市',2,'520000000000',''), +(261,'520200000000','六盘水市',2,'520000000000',''), +(262,'520300000000','遵义市',2,'520000000000',''), +(263,'520400000000','安顺市',2,'520000000000',''), +(264,'520500000000','毕节市',2,'520000000000',''), +(265,'520600000000','铜仁市',2,'520000000000',''), +(266,'522300000000','黔西南布依族苗族自治州',2,'520000000000',''), +(267,'522600000000','黔东南苗族侗族自治州',2,'520000000000',''), +(268,'522700000000','黔南布依族苗族自治州',2,'520000000000',''), +(269,'530100000000','昆明市',2,'530000000000',''), +(270,'530300000000','曲靖市',2,'530000000000',''), +(271,'530400000000','玉溪市',2,'530000000000',''), +(272,'530500000000','保山市',2,'530000000000',''), +(273,'530600000000','昭通市',2,'530000000000',''), +(274,'530700000000','丽江市',2,'530000000000',''), +(275,'530800000000','普洱市',2,'530000000000',''), +(276,'530900000000','临沧市',2,'530000000000',''), +(277,'532300000000','楚雄彝族自治州',2,'530000000000',''), +(278,'532500000000','红河哈尼族彝族自治州',2,'530000000000',''), +(279,'532600000000','文山壮族苗族自治州',2,'530000000000',''), +(280,'532800000000','西双版纳傣族自治州',2,'530000000000',''), +(281,'532900000000','大理白族自治州',2,'530000000000',''), +(282,'533100000000','德宏傣族景颇族自治州',2,'530000000000',''), +(283,'533300000000','怒江傈僳族自治州',2,'530000000000',''), +(284,'533400000000','迪庆藏族自治州',2,'530000000000',''), +(285,'540100000000','拉萨市',2,'540000000000',''), +(286,'540200000000','日喀则市',2,'540000000000',''), +(287,'540300000000','昌都市',2,'540000000000',''), +(288,'540400000000','林芝市',2,'540000000000',''), +(289,'540500000000','山南市',2,'540000000000',''), +(290,'540600000000','那曲市',2,'540000000000',''), +(291,'542500000000','阿里地区',2,'540000000000',''), +(292,'610100000000','西安市',2,'610000000000',''), +(293,'610200000000','铜川市',2,'610000000000',''), +(294,'610300000000','宝鸡市',2,'610000000000',''), +(295,'610400000000','咸阳市',2,'610000000000',''), +(296,'610500000000','渭南市',2,'610000000000',''), +(297,'610600000000','延安市',2,'610000000000',''), +(298,'610700000000','汉中市',2,'610000000000',''), +(299,'610800000000','榆林市',2,'610000000000',''), +(300,'610900000000','安康市',2,'610000000000',''), +(301,'611000000000','商洛市',2,'610000000000',''), +(302,'620100000000','兰州市',2,'620000000000',''), +(303,'620200000000','嘉峪关市',2,'620000000000',''), +(304,'620300000000','金昌市',2,'620000000000',''), +(305,'620400000000','白银市',2,'620000000000',''), +(306,'620500000000','天水市',2,'620000000000',''), +(307,'620600000000','武威市',2,'620000000000',''), +(308,'620700000000','张掖市',2,'620000000000',''), +(309,'620800000000','平凉市',2,'620000000000',''), +(310,'620900000000','酒泉市',2,'620000000000',''), +(311,'621000000000','庆阳市',2,'620000000000',''), +(312,'621100000000','定西市',2,'620000000000',''), +(313,'621200000000','陇南市',2,'620000000000',''), +(314,'622900000000','临夏回族自治州',2,'620000000000',''), +(315,'623000000000','甘南藏族自治州',2,'620000000000',''), +(316,'630100000000','西宁市',2,'630000000000',''), +(317,'630200000000','海东市',2,'630000000000',''), +(318,'632200000000','海北藏族自治州',2,'630000000000',''), +(319,'632300000000','黄南藏族自治州',2,'630000000000',''), +(320,'632500000000','海南藏族自治州',2,'630000000000',''), +(321,'632600000000','果洛藏族自治州',2,'630000000000',''), +(322,'632700000000','玉树藏族自治州',2,'630000000000',''), +(323,'632800000000','海西蒙古族藏族自治州',2,'630000000000',''), +(324,'640100000000','银川市',2,'640000000000',''), +(325,'640200000000','石嘴山市',2,'640000000000',''), +(326,'640300000000','吴忠市',2,'640000000000',''), +(327,'640400000000','固原市',2,'640000000000',''), +(328,'640500000000','中卫市',2,'640000000000',''), +(329,'650100000000','乌鲁木齐市',2,'650000000000',''), +(330,'650200000000','克拉玛依市',2,'650000000000',''), +(331,'650400000000','吐鲁番市',2,'650000000000',''), +(332,'650500000000','哈密市',2,'650000000000',''), +(333,'652300000000','昌吉回族自治州',2,'650000000000',''), +(334,'652700000000','博尔塔拉蒙古自治州',2,'650000000000',''), +(335,'652800000000','巴音郭楞蒙古自治州',2,'650000000000',''), +(336,'652900000000','阿克苏地区',2,'650000000000',''), +(337,'653000000000','克孜勒苏柯尔克孜自治州',2,'650000000000',''), +(338,'653100000000','喀什地区',2,'650000000000',''), +(339,'653200000000','和田地区',2,'650000000000',''), +(340,'654000000000','伊犁哈萨克自治州',2,'650000000000',''), +(341,'654200000000','塔城地区',2,'650000000000',''), +(342,'654300000000','阿勒泰地区',2,'650000000000',''), +(343,'659000000000','自治区直辖县级行政区划',2,'650000000000',''), +(344,'110000000000','北京市',1,'000000000000',''), +(345,'120000000000','天津市',1,'000000000000',''), +(346,'130000000000','河北省',1,'000000000000',''), +(347,'140000000000','山西省',1,'000000000000',''), +(348,'150000000000','内蒙古自治区',1,'000000000000',''), +(349,'210000000000','辽宁省',1,'000000000000',''), +(350,'220000000000','吉林省',1,'000000000000',''), +(351,'230000000000','黑龙江省',1,'000000000000',''), +(352,'310000000000','上海市',1,'000000000000',''), +(353,'320000000000','江苏省',1,'000000000000',''), +(354,'330000000000','浙江省',1,'000000000000',''), +(355,'340000000000','安徽省',1,'000000000000',''), +(356,'350000000000','福建省',1,'000000000000',''), +(357,'360000000000','江西省',1,'000000000000',''), +(358,'370000000000','山东省',1,'000000000000',''), +(359,'410000000000','河南省',1,'000000000000',''), +(360,'420000000000','湖北省',1,'000000000000',''), +(361,'430000000000','湖南省',1,'000000000000',''), +(362,'440000000000','广东省',1,'000000000000',''), +(363,'450000000000','广西壮族自治区',1,'000000000000',''), +(364,'460000000000','海南省',1,'000000000000',''), +(365,'500000000000','重庆市',1,'000000000000',''), +(366,'510000000000','四川省',1,'000000000000',''), +(367,'520000000000','贵州省',1,'000000000000',''), +(368,'530000000000','云南省',1,'000000000000',''), +(369,'540000000000','西藏自治区',1,'000000000000',''), +(370,'610000000000','陕西省',1,'000000000000',''), +(371,'620000000000','甘肃省',1,'000000000000',''), +(372,'630000000000','青海省',1,'000000000000',''), +(373,'640000000000','宁夏回族自治区',1,'000000000000',''), +(374,'650000000000','新疆维吾尔自治区',1,'000000000000',''), +(375,'710000000000','台湾省',1,'000000000000',''), +(376,'810000000000','香港特别行政区',1,'000000000000',''), +(377,'820000000000','澳门特别行政区',1,'000000000000',''); + + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/schema/02-schema-fix-preview1.sql b/schema/02-schema-fix-preview1.sql new file mode 100644 index 0000000..1d4b3c0 --- /dev/null +++ b/schema/02-schema-fix-preview1.sql @@ -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'; diff --git a/schema/03-schema-align-prod.sql b/schema/03-schema-align-prod.sql new file mode 100644 index 0000000..2b5e1c1 --- /dev/null +++ b/schema/03-schema-align-prod.sql @@ -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 '批次号'; diff --git a/schema/04-users.sh b/schema/04-users.sh new file mode 100755 index 0000000..e47f2ae --- /dev/null +++ b/schema/04-users.sh @@ -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}" <&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}" <','>',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); diff --git a/schema/08-seed-mock-channel.sql b/schema/08-seed-mock-channel.sql new file mode 100644 index 0000000..db2280a --- /dev/null +++ b/schema/08-seed-mock-channel.sql @@ -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`); diff --git a/schema/09-seed-role-chain.sql b/schema/09-seed-role-chain.sql new file mode 100644 index 0000000..1b2997f --- /dev/null +++ b/schema/09-seed-role-chain.sql @@ -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`; diff --git a/schema/10-seed-jobs.sql b/schema/10-seed-jobs.sql new file mode 100644 index 0000000..7356dca --- /dev/null +++ b/schema/10-seed-jobs.sql @@ -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`; diff --git a/schema/11-seed-menu-align-prod.sql b/schema/11-seed-menu-align-prod.sql new file mode 100644 index 0000000..a9253a8 --- /dev/null +++ b/schema/11-seed-menu-align-prod.sql @@ -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; diff --git a/schema/12-repair-dept-ancestors.sql b/schema/12-repair-dept-ancestors.sql new file mode 100644 index 0000000..826d4f7 --- /dev/null +++ b/schema/12-repair-dept-ancestors.sql @@ -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`; diff --git a/schema/README.md b/schema/README.md new file mode 100644 index 0000000..667ac62 --- /dev/null +++ b/schema/README.md @@ -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 +``` From 503fe59fe74401c5fb312d68efb660041621c6f8 Mon Sep 17 00:00:00 2001 From: MiFaZhan Date: Wed, 28 Oct 2026 13:54:39 +0800 Subject: [PATCH 02/24] =?UTF-8?q?docs:=20=E9=83=A8=E7=BD=B2=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - README:项目概览、快速开始、目录结构、重要提示 - 01 环境准备:硬件/系统/Docker 版本、镜像仓库、端口、防火墙、可选外部服务 - 02 配置说明:.env 必填与可选项、10 份应用配置逐项说明、启动前自检 - 03 启动与验证:首次初始化流程、状态检查、6 步验证清单、首次登录必做项 - 04 可选服务:挡板 onelink-mock、飞书 bot、自带 nginx(含 HTTPS)、组合启动 - 05 升级与备份:版本固定、升级回滚、备份脚本与恢复、日志清理、监控指标 - 06 故障排查:启动/功能/性能/网络四类共 20 个问题 --- README.md | 76 +++++++++++ docs/01-环境准备.md | 124 ++++++++++++++++++ docs/02-配置说明.md | 183 ++++++++++++++++++++++++++ docs/03-启动与验证.md | 173 +++++++++++++++++++++++++ docs/04-可选服务.md | 168 ++++++++++++++++++++++++ docs/05-升级与备份.md | 185 ++++++++++++++++++++++++++ docs/06-故障排查.md | 292 ++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 1201 insertions(+) create mode 100644 README.md create mode 100644 docs/01-环境准备.md create mode 100644 docs/02-配置说明.md create mode 100644 docs/03-启动与验证.md create mode 100644 docs/04-可选服务.md create mode 100644 docs/05-升级与备份.md create mode 100644 docs/06-故障排查.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..e79f4a3 --- /dev/null +++ b/README.md @@ -0,0 +1,76 @@ +# IotLCM 部署仓 + +IotLCM 物联网卡管理平台的部署编排与数据库初始化脚本。使用 Docker Compose 在单机上拉起完整平台。 + +## 部署内容 + +| 类别 | 服务 | +| --- | --- | +| 基础组件 | MySQL、Redis、RabbitMQ、Consul | +| 业务服务 | admin-svr(管理端后端)、admin-ui(管理端前端)、openapi(对外 API)、app-server(小程序后端)、app-web(小程序前端)、upstream-chan(运营商对接)、upstream-proxy(通道缓存转发)、worker-svr(异步任务)、sms(短信)、docs(文档站) | +| 可选 | onelink-mock(运营商接口挡板)、bot(飞书通知)、nginx(反向代理) | + +## 快速开始 + +```bash +# 1. 准备环境变量 +cp .env.example .env +vi .env # 填镜像仓库、各项口令 + +# 2. 准备配置 +cp -r config.example config +vi config/*/config.yaml # 逐份填写(标注「必改」的项) + +# 3. 启动 +docker compose up -d + +# 4. 查看状态 +docker compose ps +``` + +首次启动会自动建库并导入 schema,MySQL 初始化约需 1~2 分钟。等待 `iotlcm-mysql` 健康后其余服务才会启动。 + +启动完成后访问 `http://<宿主机IP>:8009`,账号 `admin`,口令为 `.env` 中的 `MYSQL_ADMIN_PASSWORD`。 + +## 文档 + +| 文档 | 内容 | +| --- | --- | +| [环境准备](docs/01-环境准备.md) | 硬件、系统、Docker 版本要求 | +| [配置说明](docs/02-配置说明.md) | `.env` 与 `config/` 各项含义 | +| [启动与验证](docs/03-启动与验证.md) | 启动流程、健康检查、首次登录 | +| [可选服务](docs/04-可选服务.md) | 挡板、飞书通知、自带反向代理 | +| [升级与备份](docs/05-升级与备份.md) | 版本固定、升级、数据备份 | +| [故障排查](docs/06-故障排查.md) | 常见问题与处理 | + +## 目录结构 + +``` +iotlcm-deploy/ +├── docker-compose.yml # 服务编排 +├── .env.example # 环境变量模板 → 复制为 .env +├── config.example/ # 配置模板 → 复制为 config/ +│ ├── admin-svr/ +│ ├── admin-ui/ +│ ├── app-server/ +│ ├── bot/ +│ ├── nginx/ +│ ├── openapi/ +│ ├── sms/ +│ ├── upstream-chan/ +│ ├── upstream-proxy/ +│ └── worker-svr/ +├── schema/ # 数据库初始化脚本(首次启动自动执行) +├── docs/ # 部署文档 +├── config/ # 实际配置(不入版本库) +└── data/ # 运行数据(不入版本库) +``` + +`config/` 与 `data/` 在 `.gitignore` 中,不会被提交。 + +## 重要提示 + +- **`JWT_SIGNING_KEY` 必须在 `admin-svr`、`openapi`、`app-server` 三者间完全一致**,否则令牌跨服务不通 +- **镜像标签不要用 `latest`**,生产环境请固定到具体版本 +- **改 `schema/` 下的脚本不会自动生效**,需要清空 `data/mysql` 重新初始化(会丢失全部数据) +- 默认只监听 `127.0.0.1` 的服务需通过反向代理对外,见[可选服务](docs/04-可选服务.md) diff --git a/docs/01-环境准备.md b/docs/01-环境准备.md new file mode 100644 index 0000000..eb8f7e7 --- /dev/null +++ b/docs/01-环境准备.md @@ -0,0 +1,124 @@ +# 环境准备 + +## 硬件要求 + +按数据规模选择配置: + +| 场景 | CPU | 内存 | 磁盘 | 说明 | +| --- | --- | --- | --- | --- | +| 试用 / 演示 | 2 核 | 4 GB | 40 GB | 少量卡片,关闭定时任务 | +| 生产(中小规模) | 4 核 | 8 GB | 200 GB | 万级卡片,开启全量同步 | +| 生产(大规模) | 8 核+ | 16 GB+ | 500 GB+ | 十万级卡片,建议数据库独立部署 | + +磁盘估算:MySQL 数据约为卡片数的 1~2 KB/张;日志按每日同步任务量增长,建议单独挂载并配置轮转。 + +内存分配参考(生产 8 GB 场景): + +| 服务 | 大致占用 | +| --- | --- | +| MySQL | 1~2 GB | +| Redis | 200~500 MB | +| RabbitMQ | 300~500 MB | +| worker-svr | 500 MB~1 GB(与并发同步的卡片数相关) | +| 其余业务服务 | 每个 100~200 MB | + +## 系统要求 + +| 项 | 要求 | +| --- | --- | +| 操作系统 | Linux x86_64(CentOS 7+ / Ubuntu 20.04+ / Debian 11+) | +| 内核 | 3.10 以上 | +| 文件系统 | ext4 / xfs | +| 时区 | 建议设为 `Asia/Shanghai`,与 `.env` 中的 `TZ` 保持一致 | + +## Docker 要求 + +| 组件 | 最低版本 | 说明 | +| --- | --- | --- | +| Docker Engine | 20.10 | 需要支持 `healthcheck` 与 `profiles` | +| Docker Compose | v2.0(插件版) | `docker compose` 而非 `docker-compose` | + +验证: + +```bash +docker version +docker compose version +``` + +`docker compose version` 输出的版本号需 ≥ v2.0。若只有 `docker-compose`(v1),请升级到 Compose V2 插件。 + +## 镜像仓库 + +平台镜像由官方镜像仓库分发,需要: + +1. 能访问镜像仓库地址(内网仓库需先配置网络或代理) +2. 具备拉取权限(私有仓库需先登录) + +```bash +docker login <你的镜像仓库地址> +``` + +`.env` 中的 `REGISTRY` 填写仓库地址(不含 `https://` 与末尾斜杠): + +```bash +REGISTRY=registry.example.com +``` + +基础组件从 `/library/` 拉取(mysql、redis、rabbitmq、consul、nginx),业务镜像从 `/iotlcm/` 拉取。 + +## 端口 + +默认占用的宿主机端口: + +| 端口 | 服务 | 对外 | +| --- | --- | --- | +| 8000 | openapi | 需经反向代理 | +| 8008 | admin-svr | 需经反向代理 | +| 8009 | admin-ui | 需经反向代理 | +| 8010 | app-server | 需经反向代理 | +| 8018 | app-web | 需经反向代理 | +| 8019 | docs | 需经反向代理 | +| 8080 | onelink-mock | 仅联调时启用 | +| 3306 | MySQL | 建议仅内网 | +| 6379 | Redis | 建议仅内网 | +| 5672 / 15672 | RabbitMQ | 建议仅内网 | +| 8500 | Consul | 建议仅内网 | +| 8110 / 8310 | upstream-chan | 建议仅内网 | +| 8510 | upstream-proxy | 建议仅内网 | +| 11190 / 11200 | sms | 建议仅内网 | +| 80 | nginx | 启用 with-nginx 时 | + +端口冲突时在 `.env` 中修改对应变量即可,不要直接改 `docker-compose.yml`。 + +## 防火墙 + +仅需对外开放反向代理端口(默认 80/443)。其余服务端口应限制为内网访问: + +```bash +# 示例:firewalld 仅放行 80/443 +firewall-cmd --permanent --add-service=http +firewall-cmd --permanent --add-service=https +firewall-cmd --reload +``` + +## 依赖外部服务(可选) + +| 服务 | 用途 | 是否必需 | +| --- | --- | --- | +| TDengine 3.x | 存流量历史数据 | 可选。不配置则历史流量查询不可用 | +| 短信服务商 | 发送验证码 | 可选。不配置则无法发送短信 | +| 微信支付 | 在线支付 | 可选。不配置则支付功能不可用 | +| 飞书 | 运维通知 | 可选。不配置则不启动 bot | + +TDengine 需开启 WebSocket 接口(默认 6041 端口),在 `.env` 中配置: + +```bash +TDENGINE_HOST=tdengine.example.com +TDENGINE_PORT=6041 +TDENGINE_USER=root +TDENGINE_PASSWORD= +TDENGINE_DAILY_DB=iotlcm_daily +TDENGINE_MONTHLY_DB=iotlcm_monthly +``` + +不使用时全部留空即可,主流程不受影响。 diff --git a/docs/02-配置说明.md b/docs/02-配置说明.md new file mode 100644 index 0000000..39cb392 --- /dev/null +++ b/docs/02-配置说明.md @@ -0,0 +1,183 @@ +# 配置说明 + +平台配置分两层: + +| 层 | 位置 | 管什么 | 是否入库 | +| --- | --- | --- | --- | +| 部署层 | `.env` | 镜像仓库、口令、端口、外部服务地址 | 否 | +| 应用层 | `config/<服务>/config.yaml` | 业务参数、连接串、功能开关 | 否 | + +两者都由 `config.example/` 与 `.env.example` 复制而来,`.gitignore` 已排除。**不要把自己的配置提交回仓库。** + +## 一、`.env` + +```bash +cp .env.example .env +``` + +### 必填项 + +| 变量 | 说明 | +| --- | --- | +| `REGISTRY` | 镜像仓库地址,不含协议与末尾斜杠 | +| `TAG` | 镜像标签。生产请用具体版本号,不要用 `latest` | +| `MYSQL_ROOT_PASSWORD` | MySQL root 口令 | +| `MYSQL_APP_PASSWORD` | 应用账号 `u_iotlcm` 的口令,各服务用它连库 | +| `MYSQL_ADMIN_PASSWORD` | 平台 admin 账号的初始登录口令 | +| `REDIS_PASSWORD` | Redis 口令 | +| `RABBITMQ_PASSWORD` | RabbitMQ 口令 | +| `JWT_SIGNING_KEY` | JWT 签名密钥 | + +以上任意一项未设置时,`docker compose` 会直接报错退出,不会用空值或弱口令启动。 + +生成强口令: + +```bash +openssl rand -base64 24 # 用于各类密码 +openssl rand -hex 32 # 用于 JWT_SIGNING_KEY +``` + +::: warning JWT_SIGNING_KEY 必须三处一致 +`admin-svr`、`openapi`、`app-server` 共用同一个 `JWT_SIGNING_KEY`(都从 `.env` 读取)。不一致的表现是:能登录管理端,但调用外部 API 或小程序端提示未授权。 + +**更换此值会使已签发的全部登录态与接口令牌立即失效**,请在维护窗口操作。 +::: + +### 可选项 + +| 变量 | 不填的影响 | +| --- | --- | +| `DIAGNOSIS_INTERNAL_TOKEN` | 控制台「智能诊断」不可用 | +| `SMS_ACCESS_KEY_ID` / `SMS_ACCESS_KEY_SECRET` | 无法发送短信验证码 | +| `FEISHU_APP_ID` / `SECRET` / `CHAT_ID` | 不启动 bot 服务即可 | +| `TDENGINE_*` | 历史流量查询不可用,主流程正常 | + +### 端口 + +全部端口变量见 `.env.example`,均有默认值。改端口只改 `.env`,不要改 `docker-compose.yml`。 + +## 二、应用配置 + +```bash +cp -r config.example config +``` + +得到: + +``` +config/ +├── admin-svr/config.yaml +├── admin-ui/default.conf +├── app-server/config.yaml +├── bot/config.yaml +├── nginx/iotlcm.conf +├── openapi/config.yaml +├── sms/config.yaml +├── upstream-chan/config.yaml +├── upstream-proxy/config.yaml +└── worker-svr/config.yaml +``` + +### 通用:环境变量占位 + +所有配置都支持 `${VAR}` 与 `${VAR:default}` 语法,由 compose 从 `.env` 注入。因此**口令类字段不必写进 yaml**,保持 `${MYSQL_APP_PASSWORD}` 这样的引用即可。 + +### 逐份说明 + +#### admin-svr(管理端后端) + +| 项 | 说明 | +| --- | --- | +| `database.default.link` | 库连接串,默认已用 `${MYSQL_APP_PASSWORD}` 拼好 | +| `database.legacyCard.link` | 旧平台库,没有就留空 | +| `jwt.signingKey` | 保持 `${JWT_SIGNING_KEY}`,不要手写 | +| `warning.sms.enabled` | 不用短信改 `false` | +| `warning.wechat.*` | 不用微信订阅消息改 `false` 并留空 | +| `register.email.*` | 邮件验证码的 SMTP,不用则留空 | +| `tsdb.tdengine.dsn` | 不用时序库则留空 | +| `alipay.*` | 不用支付宝整段删除 | +| `upstream.appDiagnosisToken` | 与 `upstream-proxy` 的 `appDiagnosis.internalToken` 一致 | + +#### openapi(对外 API) + +| 项 | 说明 | +| --- | --- | +| `jwt.signingKey` | 与 admin-svr 一致 | +| `database.default.link` | 建议单独建只读账号与之隔离 | + +#### worker-svr(异步任务) + +| 项 | 说明 | +| --- | --- | +| `batch.inbound.upstreamRateLimit` | **运营商接口限流,必须按上游实际配额设置**。调太大会被运营商限流甚至封禁 | +| `rabbitmq.batchExecute.maxRetries` | 批次执行失败重试次数 | +| `tsdb.tdengine.dsn` | 不用时序库则留空 | + +#### upstream-chan(运营商对接) + +| 项 | 说明 | +| --- | --- | +| `registry.address` | Consul 地址,默认 `consul:8500` | +| `dependencies.sim_yd_mock_v5.url` | 挡板地址。对接真实运营商时删除本段 | +| `dependencies.token_refresh.skew_seconds` | 运营商 Token 提前刷新窗口 | + +运营商通道本身(AppKey、AppSecret、接口地址)不在本文件配置,而是在平台「通道管理」中录入,存数据库。 + +#### upstream-proxy(通道缓存转发) + +| 项 | 说明 | +| --- | --- | +| `appDiagnosis.internalToken` | 与 admin-svr 的 `upstream.appDiagnosisToken` 一致 | +| `gateway.batchTimeout` | 批量转发总预算上限,**worker 侧超时必须大于此值** | + +#### app-server(小程序后端) + +| 项 | 说明 | +| --- | --- | +| `jwt.signingKey` | 与 admin-svr 一致 | +| `payment.wechat.*` | 不用支付把 `enabled` 改 `false`;启用需把支付证书放入 `data/certs/` | +| `appCardRecognition.*` | 拍照识别卡号,不用改 `false` | +| `upstream.onelinkMock.*` | 挡板联调配置,对接真实运营商时 `enabled: false` | + +#### sms(短信服务) + +| 项 | 说明 | +| --- | --- | +| `serviceType` | `1`=阿里云,`2`=腾讯云 | +| `accessKeyId` / `accessKeySecret` | 从 `.env` 注入 | +| `signName` | 短信签名,需服务商审核通过 | +| `sceneDbDsn` | 场景模板库连接,默认已拼好 | + +#### bot(飞书通知,可选) + +| 项 | 说明 | +| --- | --- | +| `feishu.appId` / `appSecret` / `chatId` | 全部从 `.env` 注入 | + +#### admin-ui(管理端 nginx) + +`default.conf` 里 `/api/` 反代到 `admin-svr:8008`,`/upload/` 指向共享上传目录。一般无需修改。 + +#### nginx(对外入口,可选) + +`iotlcm.conf` 按域名分三组 server:`api.*` → openapi,`admin.*` → 管理端 + 文档站,`app.*` → 小程序端。**把 `your-domain.example.com` 替换为实际域名。** + +不使用自带 nginx 时,把其中的 `location` 段落复制到宿主机 nginx 配置中即可。 + +## 三、配置自检 + +启动前先验证语法: + +```bash +# 检查 compose 展开是否正确(不会启动容器) +docker compose config + +# 只检查必填项是否齐全 +docker compose config --quiet +``` + +配置文件语法错误(缩进、冒号)会导致服务启动后立刻退出,用日志定位: + +```bash +docker compose logs --tail=50 admin-svr +``` diff --git a/docs/03-启动与验证.md b/docs/03-启动与验证.md new file mode 100644 index 0000000..6d14ea6 --- /dev/null +++ b/docs/03-启动与验证.md @@ -0,0 +1,173 @@ +# 启动与验证 + +## 启动 + +```bash +# 前台启动(首次部署建议,便于观察初始化过程) +docker compose up + +# 确认无误后改为后台 +docker compose up -d +``` + +### 首次启动会发生什么 + +1. **MySQL 建库并导入 schema**(约 1~2 分钟) + `schema/` 下的 12 个脚本按文件名顺序自动执行:建表 → 结构补齐 → 创建应用账号 → 重置种子账号口令 → 导入通道模板/字典/菜单等种子数据 +2. MySQL 通过健康检查后,`admin-svr`、`openapi`、`worker-svr` 等服务依次启动 +3. 各服务向 Consul 注册 + +观察初始化进度: + +```bash +docker compose logs -f mysql +``` + +看到 `[initdb] 应用账号 u_iotlcm 已创建` 与 `[initdb] 种子账号口令已统一重置` 表示初始化完成。 + +::: warning 首次初始化失败的处理 +MySQL 只在 `data/mysql` 为空时执行 `schema/`。若初始化中途失败,修改脚本后**必须清空数据卷**才会重跑: + +```bash +docker compose down +sudo rm -rf ./data/mysql +docker compose up -d +``` + +这会删除全部数据,仅在首次部署阶段使用。 +::: + +## 检查运行状态 + +```bash +docker compose ps +``` + +期望结果: + +| 服务 | 状态 | +| --- | --- | +| iotlcm-mysql | Up (healthy) | +| iotlcm-redis | Up (healthy) | +| iotlcm-rabbitmq | Up (healthy) | +| iotlcm-consul | Up | +| iotlcm-admin-svr | Up | +| iotlcm-admin-ui | Up | +| iotlcm-openapi | Up | +| iotlcm-upstream-chan | Up | +| iotlcm-upstream-proxy | Up | +| iotlcm-worker-svr | Up | +| iotlcm-app-server | Up | +| iotlcm-app-web | Up | +| iotlcm-sms | Up (healthy) | +| iotlcm-docs | Up | + +任一服务显示 `Restarting` 或 `Exited` 需查日志: + +```bash +docker compose logs --tail=100 <服务名> +``` + +## 验证清单 + +按顺序逐项确认,任一步失败先解决再继续。 + +### 1. 数据库 + +```bash +docker compose exec mysql sh -c \ + 'mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e "SELECT COUNT(*) AS tables_count FROM information_schema.tables WHERE table_schema=\"db_iotlcm\";"' +``` + +预期输出 `tables_count` 为 **89**。 + +```bash +# 确认种子数据 +docker compose exec mysql sh -c \ + 'mysql -uroot -p"$MYSQL_ROOT_PASSWORD" db_iotlcm -e "SELECT COUNT(*) AS menus FROM sys_menu; SELECT COUNT(*) AS users FROM sys_user;"' +``` + +预期:菜单约 447 条,账号 18 个。 + +### 2. 管理端后端 + +```bash +curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8008/api.json +``` + +预期 `200`。 + +### 3. 管理端前端 + +```bash +curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8009/ +``` + +预期 `200`。 + +### 4. 对外 API + +```bash +curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8000/api.json +``` + +预期 `200`。 + +### 5. 短信服务 + +```bash +curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:11190/healthz +``` + +预期 `200`。 + +### 6. 浏览器登录 + +访问 `http://<宿主机IP>:8009`: + +| 项 | 值 | +| --- | --- | +| 账号 | `admin` | +| 口令 | `.env` 里的 `MYSQL_ADMIN_PASSWORD` | + +能进入首页工作台、左侧菜单完整显示,即部署成功。 + +## 首次登录后必做 + +1. **修改 admin 口令**:右上角个人中心 → 安全设置 +2. **修改其余种子账号口令**:种子账号(`user02`、`2admin` 等 17 个)默认与 admin 同一口令,如不使用请停用或删除 +3. **确认字典与菜单加载正常**:进入「卡信息」页,确认筛选下拉框选项不为空 + +## 后端服务自检 + +```bash +# admin-svr 是否连上数据库 +docker compose logs admin-svr | grep -i 'error\|panic' | tail -20 + +# worker-svr 是否连上 RabbitMQ +docker compose logs worker-svr | tail -30 + +# upstream-chan 是否连上 Redis 与 Consul +docker compose logs upstream-chan | tail -30 +``` + +正常日志里不应出现 `connection refused`、`access denied`、`panic`。 + +## 停止与重启 + +```bash +docker compose stop # 停止容器,保留数据 +docker compose restart # 重启全部 +docker compose restart admin-svr # 重启单个服务 +docker compose down # 停止并删除容器(数据卷在 ./data,不受影响) +``` + +::: danger 不要执行 `docker compose down -v` +`-v` 会删除命名数据卷。虽然本编排的数据都在 `./data` 宿主机目录下,但 `down -v` 仍可能影响其他同项目的卷。停止服务用 `down` 即可。 +::: + +## 下一步 + +- 需要运营商挡板联调 → [可选服务](04-可选服务.md) +- 需要对外域名访问 → [可选服务](04-可选服务.md) 的反向代理章节 +- 遇到报错 → [故障排查](06-故障排查.md) diff --git a/docs/04-可选服务.md b/docs/04-可选服务.md new file mode 100644 index 0000000..4d340ed --- /dev/null +++ b/docs/04-可选服务.md @@ -0,0 +1,168 @@ +# 可选服务 + +以下服务默认不启动,按需通过 profile 开启。 + +## 一、运营商接口挡板(onelink-mock) + +### 用途 + +模拟中国移动 OneLink 接口。**没有真实运营商环境时,靠它跑通完整链路**: + +``` +admin-svr → worker-svr → upstream-chan → onelink-mock +``` + +不开挡板时,`upstream-chan` 会尝试连接真实运营商接口,没有凭据则批次执行、状态同步、流量查询全部失败。 + +### 启动 + +```bash +docker compose --profile with-mock up -d +``` + +验证: + +```bash +curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8080/api.json +``` + +预期 `200`。管理界面在 `http://127.0.0.1:8080/swagger`。 + +### 配置 + +挡板自身无需配置,数据存在容器内 SQLite(`./data/mock/onelink_mock.db`)。 + +`upstream-chan` 的配置里已预置指向: + +```yaml +dependencies: + sim_yd_mock_v5: + url: "http://onelink-mock:8080/v5/" +``` + +数据库种子脚本 `schema/08-seed-mock-channel.sql` 已插入一条 Mock 通道(`channel_yd_mock`)并指向该地址。 + +`app-server` 若要使用挡板,把 `upstream.onelinkMock.enabled` 改为 `true` 并填写 `baseUrl: "http://onelink-mock:8080/v5"`。 + +### 造测试卡 + +挡板支持生成模拟卡片,用于验证查询、开停复机、续费等流程。具体接口见挡板 Swagger 页面。 + +### 对接真实运营商 + +1. 删除或注释 `upstream-chan` 配置里的 `sim_yd_mock_v5` 段 +2. 在平台「通道管理」中录入真实运营商通道(AppKey、AppSecret、接口地址) +3. 停用 Mock 通道,避免卡片误挂到 Mock 上 + +```bash +docker compose --profile with-mock stop onelink-mock +``` + +## 二、飞书通知(bot) + +### 用途 + +把全量同步完成、失败告警等运维事件推送到飞书群。 + +### 准备 + +在飞书开放平台创建自建应用,获取: + +| 项 | 获取方式 | +| --- | --- | +| `appId` / `appSecret` | 应用凭证页面 | +| `chatId` | 目标群的会话 ID | + +填入 `.env`: + +```bash +FEISHU_APP_ID=cli_xxxxxxxx +FEISHU_APP_SECRET=xxxxxxxx +FEISHU_CHAT_ID=oc_xxxxxxxx +``` + +### 启动 + +```bash +docker compose --profile with-bot up -d +``` + +bot 依赖 `worker-svr` 生成的全量同步归档(`./data/logs/worker-svr/full-sync`),需该目录已有数据才会产生通知。 + +## 三、自带反向代理(nginx) + +### 用途 + +把分散在各端口的服务统一到域名下按路径分流。宿主机已有 nginx 或面板时不需要。 + +### 域名字段 + +编辑 `config/nginx/iotlcm.conf`,把示例域名替换为实际域名: + +| 域名 | 分流到 | +| --- | --- | +| `api.your-domain.example.com` | openapi(`/openapi/v3/`、`/route/open/`) | +| `admin.your-domain.example.com` | 管理端前端 + `/docs/` 文档站 | +| `app.your-domain.example.com` | 小程序前端 + `/app/api/v1/` 后端 | + +### 启动 + +```bash +docker compose --profile with-nginx up -d +``` + +默认监听 80 端口,改 `.env` 的 `NGINX_HTTP_PORT` 可调整。 + +### 使用宿主机 nginx + +不启动容器时,把 `config/nginx/iotlcm.conf` 中的 `upstream` 与 `location` 段落复制到宿主机 nginx 配置。 + +需注意: + +- 宿主机 nginx 无法解析 compose 内的服务名,`upstream` 要改为 `127.0.0.1:<端口>` +- 例如 `server admin-svr:8008;` → `server 127.0.0.1:8008;` + +### HTTPS + +自带 nginx 配置未包含证书。启用 HTTPS 需: + +1. 准备证书文件 +2. 在 `iotlcm.conf` 的 server 块加入: + +```nginx +listen 443 ssl; +ssl_certificate /etc/nginx/certs/fullchain.pem; +ssl_certificate_key /etc/nginx/certs/privkey.pem; +ssl_protocols TLSv1.2 TLSv1.3; +``` + +3. 在 compose 的 nginx 服务增加证书目录挂载: + +```yaml +volumes: + - ./data/certs:/etc/nginx/certs:ro +``` + +4. 增加 80 → 443 跳转: + +```nginx +server { + listen 80; + server_name admin.your-domain.example.com; + return 301 https://$host$request_uri; +} +``` + +## 四、组合启动 + +多个 profile 可同时启用: + +```bash +docker compose --profile with-mock --profile with-nginx up -d +``` + +查看当前启用的 profile 与对应的服务: + +```bash +docker compose --profile with-mock config --services +``` diff --git a/docs/05-升级与备份.md b/docs/05-升级与备份.md new file mode 100644 index 0000000..71cb240 --- /dev/null +++ b/docs/05-升级与备份.md @@ -0,0 +1,185 @@ +# 升级与备份 + +## 版本固定 + +生产环境**必须固定镜像标签**,不要用 `latest`。原因: + +- `latest` 会随仓库推送变化,同一份 compose 在不同时间拉到的镜像不同 +- 出问题无法确定运行的是哪个版本 +- 回滚时没有明确目标 + +`.env` 中指定: + +```bash +TAG=1.0.3 +``` + +记录当前部署版本: + +```bash +echo "$(date '+%Y-%m-%d %H:%M') TAG=$(grep '^TAG=' .env | cut -d= -f2)" >> deploy-history.log +``` + +## 升级流程 + +```bash +# 1. 备份(见下节,不要跳过) +./backup.sh + +# 2. 拉取新镜像 +vi .env # 修改 TAG +docker compose pull + +# 3. 只更新发生变化的服务 +docker compose up -d + +# 4. 验证 +docker compose ps +docker compose logs --tail=50 admin-svr +``` + +滚动更新单个服务,减少中断: + +```bash +docker compose up -d --no-deps admin-svr +``` + +## 回滚 + +```bash +# 改回上一个版本 +vi .env # TAG 改回旧版本 +docker compose pull +docker compose up -d +``` + +::: warning 数据库变更不可自动回滚 +若新版本包含数据库结构变更,回滚代码后数据库仍是新结构。升级前务必确认变更脚本可逆,或保留升级前的完整备份。 +::: + +## 什么情况下需要重新初始化数据库 + +`schema/` 下的脚本**只在 `data/mysql` 为空时执行**。以下情况才需要清空重建: + +| 情况 | 是否需要 | +| --- | --- | +| 升级应用镜像 | 否 | +| 修改 `config/` | 否,重启对应服务即可 | +| 修改 `schema/` 脚本 | 是(会丢数据) | +| 首次初始化失败 | 是 | + +清空重建: + +```bash +docker compose down +sudo rm -rf ./data/mysql +docker compose up -d +``` + +::: danger 生产环境禁止清空 data/mysql +生产数据必须通过数据库工具单独备份与迁移,不能依赖 schema 重建。上面这条命令仅用于首次部署阶段。 +::: + +## 备份 + +### 全量备份脚本 + +保存为 `backup.sh`(不要提交到仓库,`.gitignore` 已排除 `backup.sh` 外的脚本时请自行确认): + +```bash +#!/bin/bash +set -euo pipefail +cd "$(dirname "$0")" + +STAMP=$(date '+%Y%m%d-%H%M%S') +DEST="./backups/${STAMP}" +mkdir -p "$DEST" + +echo "[1/3] 导出数据库..." +docker compose exec -T mysql sh -c \ + 'exec mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" --single-transaction --routines --triggers --events db_iotlcm' \ + | gzip > "${DEST}/db_iotlcm.sql.gz" + +echo "[2/3] 备份配置..." +tar czf "${DEST}/config.tar.gz" config/ .env + +echo "[3/3] 备份上传文件(可选,量大可跳过)..." +tar czf "${DEST}/upload.tar.gz" data/upload/ 2>/dev/null || echo " 上传目录为空,跳过" + +echo "完成:${DEST}" +ls -lh "$DEST" +``` + +```bash +chmod +x backup.sh +./backup.sh +``` + +### 只备份数据库 + +```bash +docker compose exec -T mysql sh -c \ + 'exec mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" --single-transaction db_iotlcm' \ + | gzip > "db_iotlcm-$(date +%Y%m%d).sql.gz" +``` + +### 恢复数据库 + +```bash +gunzip -c db_iotlcm-20260101.sql.gz | \ + docker compose exec -T mysql sh -c \ + 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" db_iotlcm' +``` + +### 备份内容清单 + +| 内容 | 位置 | 重要性 | +| --- | --- | --- | +| 数据库 | MySQL 容器内 `db_iotlcm` | **最高**,业务数据全在这里 | +| 配置 | `config/` + `.env` | 高,丢失需重新配置 | +| 上传文件 | `data/upload/` | 中,附件与图片 | +| Redis 数据 | `data/redis/` | 低,缓存可重建 | +| RabbitMQ 队列 | `data/rabbitmq/` | 低,未消费消息会丢失 | +| 日志 | `data/logs/` | 低,排障用 | + +### 备份策略建议 + +| 场景 | 频率 | 保留 | +| --- | --- | --- | +| 生产 | 每日一次 + 升级前 | 30 天 | +| 试用 | 有数据变更时 | 7 天 | + +备份文件应转存到异机或对象存储,不要与数据库放同一块盘。 + +## 日志清理 + +日志写在 `data/logs/` 下,按服务分目录,应用侧已配置按小时轮转(`{Y-m-d-H}.log`)。磁盘吃紧时清理旧日志: + +```bash +# 删除 7 天前的日志 +find ./data/logs -name '*.log' -mtime +7 -delete +``` + +建议用系统 cron 定期执行: + +```bash +# /etc/cron.d/iotlcm-logrotate +0 3 * * * root find /path/to/iotlcm-deploy/data/logs -name '*.log' -mtime +7 -delete +``` + +## 监控 + +基础组件自带的监控端点: + +| 服务 | 端点 | +| --- | --- | +| RabbitMQ | `http://:15672`(管理界面) | +| Consul | `http://:8500/ui` | +| MySQL | `docker compose exec mysql mysqladmin status` | + +建议对以下指标告警: + +- MySQL 连接数与磁盘使用率 +- Redis 内存使用率 +- RabbitMQ 队列积压数(`iotlcm.batch.execute`、`iotlcm.app.business`) +- worker-svr 全量同步任务失败数 diff --git a/docs/06-故障排查.md b/docs/06-故障排查.md new file mode 100644 index 0000000..6411795 --- /dev/null +++ b/docs/06-故障排查.md @@ -0,0 +1,292 @@ +# 故障排查 + +## 通用排查步骤 + +```bash +# 1. 看容器状态 +docker compose ps + +# 2. 看某个服务的日志 +docker compose logs --tail=100 <服务名> + +# 3. 跟随日志 +docker compose logs -f <服务名> + +# 4. 进容器排查 +docker compose exec <服务名> sh +``` + +## 启动类 + +### MySQL 一直不 healthy + +**现象**:`iotlcm-mysql` 显示 `Up (healthrestarting)` 或一直 `starting`,其余服务不启动。 + +**排查**: + +```bash +docker compose logs mysql | tail -50 +``` + +| 日志关键词 | 原因 | 处理 | +| --- | --- | --- | +| `Access denied` | root 口令与旧数据卷中的不一致 | 改 `.env` 的 `MYSQL_ROOT_PASSWORD` 与卷内一致,或清空 `data/mysql` 重建 | +| `Can't create/write to file` | 目录权限问题 | `sudo chown -R 999:999 data/mysql` | +| `No space left on device` | 磁盘满 | 清理磁盘 | +| `mysqld: Can't open shared library` | 架构不匹配 | 确认镜像与宿主机架构一致 | + +### schema 初始化失败 + +**现象**:MySQL 起来了,但表数量不对,或日志中有 SQL 报错。 + +**排查**: + +```bash +docker compose logs mysql | grep -iE 'error|ERROR' | head -30 +``` + +常见原因: + +| 原因 | 处理 | +| --- | --- | +| `MYSQL_APP_PASSWORD` 未设置,`04-users.sh` 退出 | 在 `.env` 补上后清空 `data/mysql` 重建 | +| `MYSQL_ADMIN_PASSWORD` 未设置,`05-reset-passwords.sh` 退出 | 同上 | +| SQL 脚本本身语法问题 | 单独执行该脚本定位,见 [schema/README](../schema/README.md) | + +::: warning 改脚本后必须清空数据卷 +MySQL 只在 `data/mysql` 为空时执行 `schema/`。文件改了不会自动重跑: + +```bash +docker compose down && sudo rm -rf ./data/mysql && docker compose up -d +``` +::: + +### 业务服务反复重启 + +**排查**: + +```bash +docker compose logs --tail=80 admin-svr +``` + +| 报错 | 原因 | 处理 | +| --- | --- | --- | +| `possible config files "config" not found` | `config/` 目录不存在或挂载失败 | `cp -r config.example config` 并确认 `config/admin-svr/config.yaml` 存在 | +| `dial tcp mysql:3306: connect: connection refused` | MySQL 未就绪 | 等 MySQL healthy,或检查 `depends_on` 是否生效 | +| `Access denied for user 'u_iotlcm'` | 应用账号密码与数据库内不一致 | 确认 `.env` 的 `MYSQL_APP_PASSWORD` 与初始化时一致;改过则需重建库 | +| `panic: unsupported provider xxx` | 数据库通道模板与镜像版本不匹配 | 确认镜像版本与 schema 版本配套 | + +## 功能类 + +### 登录后提示未授权 / 接口 401 + +**原因**:`JWT_SIGNING_KEY` 在服务间不一致。 + +**处理**:确认 `admin-svr`、`openapi`、`app-server` 三份配置里的 `jwt.signingKey` 都引用 `${JWT_SIGNING_KEY}`,且 `.env` 里有值。改完重启三个服务: + +```bash +docker compose restart admin-svr openapi app-server +``` + +### 登录成功但页面空白 / 菜单不显示 + +**排查**: + +1. 浏览器 F12 看 Network 有无 4xx/5xx +2. 检查菜单数据: + +```bash +docker compose exec mysql sh -c \ + 'mysql -uroot -p"$MYSQL_ROOT_PASSWORD" db_iotlcm -e "SELECT COUNT(*) FROM sys_menu WHERE status=0;"' +``` + +菜单为 0 说明种子数据未导入,需重建库。 + +3. 检查角色菜单关联: + +```bash +docker compose exec mysql sh -c \ + 'mysql -uroot -p"$MYSQL_ROOT_PASSWORD" db_iotlcm -e "SELECT COUNT(*) FROM sys_role_menu;"' +``` + +### 卡信息页通道列空白 / 筛选无选项 + +**原因**:Mock 通道未插入,或通道数据缺失。 + +**处理**: + +```bash +docker compose exec mysql sh -c \ + 'mysql -uroot -p"$MYSQL_ROOT_PASSWORD" db_iotlcm -e "SELECT channel_id, channel_name FROM t_sim_channels;"' +``` + +为空则手工执行种子脚本: + +```bash +docker compose exec -T mysql sh -c \ + 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" db_iotlcm' < schema/08-seed-mock-channel.sql +``` + +### 批次执行一直失败 + +**排查顺序**: + +1. **挡板是否启动**(无真实运营商时) + +```bash +docker compose ps | grep onelink-mock +curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8080/api.json +``` + +未启动则:`docker compose --profile with-mock up -d` + +2. **worker-svr 是否连上 RabbitMQ** + +```bash +docker compose logs worker-svr | grep -i 'rabbit\|amqp' | tail -20 +``` + +3. **upstream-chan 是否能连到上游** + +```bash +docker compose logs upstream-chan --tail=50 +``` + +4. **运营商是否限流** + +看 `worker-svr` 日志中是否有 `rate limit`、`429`、`12021` 等错误。检查 `batch.inbound.upstreamRateLimit` 配置的 QPS 是否超过上游配额。 + +### 历史流量查询无数据 + +**原因**:TDengine 未配置或未连接。 + +**处理**: + +```bash +docker compose logs worker-svr | grep -i 'tdengine\|taos' | tail -20 +``` + +确认 `.env` 中 `TDENGINE_HOST` 等变量已填,且 TDengine 的 WebSocket 端口(默认 6041)可达: + +```bash +docker compose exec worker-svr sh -c 'nc -zv $TDENGINE_HOST $TDENGINE_PORT' +``` + +不用该功能时留空即可,不影响主流程。 + +### 短信发不出去 + +**排查**: + +```bash +# 1. 短信服务健康 +curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:11190/healthz + +# 2. 服务日志 +docker compose logs sms --tail=50 +``` + +| 报错 | 原因 | +| --- | --- | +| `InvalidAccessKeyId` | `.env` 里 AK 未填或错误 | +| `isv.SMS_SIGNATURE_ILLEGAL` | `signName` 与服务商审核的签名不一致 | +| `isv.SMS_TEMPLATE_ILLEGAL` | 模板 ID 未在服务商侧审核通过 | +| `缺少 config.templateId` | 场景模板库未配置,调用方需自带 templateId | + +### 图片上传失败 / 图片不显示 + +**原因**:`data/upload` 目录权限或挂载问题。 + +**处理**: + +```bash +ls -la data/upload/ +sudo chown -R 1000:1000 data/upload +docker compose restart admin-svr admin-ui +``` + +## 性能类 + +### CPU 被 worker-svr 打满 + +**原因**:定时任务开启了全量同步,大量卡片并发查询上游。 + +**处理**: + +1. 降低并发: + +```yaml +batch: + inbound: + upstreamConcurrency: 50 # 从 300 降低 + upstreamBatchSize: 1 +``` + +2. 降低限流 QPS,与上游配额匹配 + +3. 演示/试用环境建议直接停用定时任务: + +```bash +docker compose exec mysql sh -c \ + 'mysql -uroot -p"$MYSQL_ROOT_PASSWORD" db_iotlcm -e "UPDATE sys_job SET status=1;"' +``` + +种子数据中定时任务默认已全部停用(`status=1`)。 + +### 磁盘持续增长 + +按占用从大到小排查: + +```bash +du -sh data/* | sort -rh +``` + +| 目录 | 处理 | +| --- | --- | +| `data/logs` | 清理旧日志,见 [升级与备份](05-升级与备份.md) 的日志清理 | +| `data/upload` | 检查是否有异常大的上传文件 | +| `data/mysql` | 数据库增长正常,关注 binlog:`docker compose exec mysql du -sh /var/lib/mysql` | +| `data/redis` | AOF 文件,正常 | + +## 网络类 + +### 容器间无法互访 + +```bash +# 查看网络 +docker network inspect iotlcm-network + +# 从容器内测试 +docker compose exec admin-svr sh -c 'nc -zv mysql 3306' +``` + +服务名即主机名,配置里应使用 `mysql:3306`、`redis:6379` 这样的形式,不要写 `127.0.0.1`。 + +### 宿主机访问不了 127.0.0.1 绑定的服务 + +`admin-svr`、`admin-ui`、`openapi`、`app-server`、`app-web`、`docs` 默认只绑定 `127.0.0.1`,仅本机可访问。对外访问需: + +1. 用 `--profile with-nginx` 启动反向代理,或 +2. 在宿主机配置 nginx 转发到 `127.0.0.1:<端口>` + +不建议直接把端口改成 `0.0.0.0` 暴露到公网。 + +## 获取帮助信息 + +排查时附上这些信息便于定位: + +```bash +# 版本信息 +docker compose version +docker version --format '{{.Server.Version}}' + +# 服务状态 +docker compose ps + +# 相关服务日志 +docker compose logs --tail=200 <服务名> + +# 磁盘与内存 +df -h +free -h +``` From 249b1a03a94181d77c25d775613b32d3d676b83b Mon Sep 17 00:00:00 2001 From: MiFaZhan Date: Wed, 28 Oct 2026 14:01:06 +0800 Subject: [PATCH 03/24] =?UTF-8?q?docs:=20=E7=A7=BB=E9=99=A4=20docs/=20?= =?UTF-8?q?=E7=9B=AE=E5=BD=95=EF=BC=8C=E9=83=A8=E7=BD=B2=E6=89=8B=E5=86=8C?= =?UTF-8?q?=E5=BD=92=E5=85=A5=E6=96=87=E6=A1=A3=E7=AB=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 部署手册属于文档站(iotlcm-public/iotlcm-docs)的 /deploy/ 章节, 不应放在部署仓里。本仓保留 README 作为快速开始与索引。 --- docs/01-环境准备.md | 124 ------------------ docs/02-配置说明.md | 183 -------------------------- docs/03-启动与验证.md | 173 ------------------------- docs/04-可选服务.md | 168 ------------------------ docs/05-升级与备份.md | 185 -------------------------- docs/06-故障排查.md | 292 ------------------------------------------ 6 files changed, 1125 deletions(-) delete mode 100644 docs/01-环境准备.md delete mode 100644 docs/02-配置说明.md delete mode 100644 docs/03-启动与验证.md delete mode 100644 docs/04-可选服务.md delete mode 100644 docs/05-升级与备份.md delete mode 100644 docs/06-故障排查.md diff --git a/docs/01-环境准备.md b/docs/01-环境准备.md deleted file mode 100644 index eb8f7e7..0000000 --- a/docs/01-环境准备.md +++ /dev/null @@ -1,124 +0,0 @@ -# 环境准备 - -## 硬件要求 - -按数据规模选择配置: - -| 场景 | CPU | 内存 | 磁盘 | 说明 | -| --- | --- | --- | --- | --- | -| 试用 / 演示 | 2 核 | 4 GB | 40 GB | 少量卡片,关闭定时任务 | -| 生产(中小规模) | 4 核 | 8 GB | 200 GB | 万级卡片,开启全量同步 | -| 生产(大规模) | 8 核+ | 16 GB+ | 500 GB+ | 十万级卡片,建议数据库独立部署 | - -磁盘估算:MySQL 数据约为卡片数的 1~2 KB/张;日志按每日同步任务量增长,建议单独挂载并配置轮转。 - -内存分配参考(生产 8 GB 场景): - -| 服务 | 大致占用 | -| --- | --- | -| MySQL | 1~2 GB | -| Redis | 200~500 MB | -| RabbitMQ | 300~500 MB | -| worker-svr | 500 MB~1 GB(与并发同步的卡片数相关) | -| 其余业务服务 | 每个 100~200 MB | - -## 系统要求 - -| 项 | 要求 | -| --- | --- | -| 操作系统 | Linux x86_64(CentOS 7+ / Ubuntu 20.04+ / Debian 11+) | -| 内核 | 3.10 以上 | -| 文件系统 | ext4 / xfs | -| 时区 | 建议设为 `Asia/Shanghai`,与 `.env` 中的 `TZ` 保持一致 | - -## Docker 要求 - -| 组件 | 最低版本 | 说明 | -| --- | --- | --- | -| Docker Engine | 20.10 | 需要支持 `healthcheck` 与 `profiles` | -| Docker Compose | v2.0(插件版) | `docker compose` 而非 `docker-compose` | - -验证: - -```bash -docker version -docker compose version -``` - -`docker compose version` 输出的版本号需 ≥ v2.0。若只有 `docker-compose`(v1),请升级到 Compose V2 插件。 - -## 镜像仓库 - -平台镜像由官方镜像仓库分发,需要: - -1. 能访问镜像仓库地址(内网仓库需先配置网络或代理) -2. 具备拉取权限(私有仓库需先登录) - -```bash -docker login <你的镜像仓库地址> -``` - -`.env` 中的 `REGISTRY` 填写仓库地址(不含 `https://` 与末尾斜杠): - -```bash -REGISTRY=registry.example.com -``` - -基础组件从 `/library/` 拉取(mysql、redis、rabbitmq、consul、nginx),业务镜像从 `/iotlcm/` 拉取。 - -## 端口 - -默认占用的宿主机端口: - -| 端口 | 服务 | 对外 | -| --- | --- | --- | -| 8000 | openapi | 需经反向代理 | -| 8008 | admin-svr | 需经反向代理 | -| 8009 | admin-ui | 需经反向代理 | -| 8010 | app-server | 需经反向代理 | -| 8018 | app-web | 需经反向代理 | -| 8019 | docs | 需经反向代理 | -| 8080 | onelink-mock | 仅联调时启用 | -| 3306 | MySQL | 建议仅内网 | -| 6379 | Redis | 建议仅内网 | -| 5672 / 15672 | RabbitMQ | 建议仅内网 | -| 8500 | Consul | 建议仅内网 | -| 8110 / 8310 | upstream-chan | 建议仅内网 | -| 8510 | upstream-proxy | 建议仅内网 | -| 11190 / 11200 | sms | 建议仅内网 | -| 80 | nginx | 启用 with-nginx 时 | - -端口冲突时在 `.env` 中修改对应变量即可,不要直接改 `docker-compose.yml`。 - -## 防火墙 - -仅需对外开放反向代理端口(默认 80/443)。其余服务端口应限制为内网访问: - -```bash -# 示例:firewalld 仅放行 80/443 -firewall-cmd --permanent --add-service=http -firewall-cmd --permanent --add-service=https -firewall-cmd --reload -``` - -## 依赖外部服务(可选) - -| 服务 | 用途 | 是否必需 | -| --- | --- | --- | -| TDengine 3.x | 存流量历史数据 | 可选。不配置则历史流量查询不可用 | -| 短信服务商 | 发送验证码 | 可选。不配置则无法发送短信 | -| 微信支付 | 在线支付 | 可选。不配置则支付功能不可用 | -| 飞书 | 运维通知 | 可选。不配置则不启动 bot | - -TDengine 需开启 WebSocket 接口(默认 6041 端口),在 `.env` 中配置: - -```bash -TDENGINE_HOST=tdengine.example.com -TDENGINE_PORT=6041 -TDENGINE_USER=root -TDENGINE_PASSWORD= -TDENGINE_DAILY_DB=iotlcm_daily -TDENGINE_MONTHLY_DB=iotlcm_monthly -``` - -不使用时全部留空即可,主流程不受影响。 diff --git a/docs/02-配置说明.md b/docs/02-配置说明.md deleted file mode 100644 index 39cb392..0000000 --- a/docs/02-配置说明.md +++ /dev/null @@ -1,183 +0,0 @@ -# 配置说明 - -平台配置分两层: - -| 层 | 位置 | 管什么 | 是否入库 | -| --- | --- | --- | --- | -| 部署层 | `.env` | 镜像仓库、口令、端口、外部服务地址 | 否 | -| 应用层 | `config/<服务>/config.yaml` | 业务参数、连接串、功能开关 | 否 | - -两者都由 `config.example/` 与 `.env.example` 复制而来,`.gitignore` 已排除。**不要把自己的配置提交回仓库。** - -## 一、`.env` - -```bash -cp .env.example .env -``` - -### 必填项 - -| 变量 | 说明 | -| --- | --- | -| `REGISTRY` | 镜像仓库地址,不含协议与末尾斜杠 | -| `TAG` | 镜像标签。生产请用具体版本号,不要用 `latest` | -| `MYSQL_ROOT_PASSWORD` | MySQL root 口令 | -| `MYSQL_APP_PASSWORD` | 应用账号 `u_iotlcm` 的口令,各服务用它连库 | -| `MYSQL_ADMIN_PASSWORD` | 平台 admin 账号的初始登录口令 | -| `REDIS_PASSWORD` | Redis 口令 | -| `RABBITMQ_PASSWORD` | RabbitMQ 口令 | -| `JWT_SIGNING_KEY` | JWT 签名密钥 | - -以上任意一项未设置时,`docker compose` 会直接报错退出,不会用空值或弱口令启动。 - -生成强口令: - -```bash -openssl rand -base64 24 # 用于各类密码 -openssl rand -hex 32 # 用于 JWT_SIGNING_KEY -``` - -::: warning JWT_SIGNING_KEY 必须三处一致 -`admin-svr`、`openapi`、`app-server` 共用同一个 `JWT_SIGNING_KEY`(都从 `.env` 读取)。不一致的表现是:能登录管理端,但调用外部 API 或小程序端提示未授权。 - -**更换此值会使已签发的全部登录态与接口令牌立即失效**,请在维护窗口操作。 -::: - -### 可选项 - -| 变量 | 不填的影响 | -| --- | --- | -| `DIAGNOSIS_INTERNAL_TOKEN` | 控制台「智能诊断」不可用 | -| `SMS_ACCESS_KEY_ID` / `SMS_ACCESS_KEY_SECRET` | 无法发送短信验证码 | -| `FEISHU_APP_ID` / `SECRET` / `CHAT_ID` | 不启动 bot 服务即可 | -| `TDENGINE_*` | 历史流量查询不可用,主流程正常 | - -### 端口 - -全部端口变量见 `.env.example`,均有默认值。改端口只改 `.env`,不要改 `docker-compose.yml`。 - -## 二、应用配置 - -```bash -cp -r config.example config -``` - -得到: - -``` -config/ -├── admin-svr/config.yaml -├── admin-ui/default.conf -├── app-server/config.yaml -├── bot/config.yaml -├── nginx/iotlcm.conf -├── openapi/config.yaml -├── sms/config.yaml -├── upstream-chan/config.yaml -├── upstream-proxy/config.yaml -└── worker-svr/config.yaml -``` - -### 通用:环境变量占位 - -所有配置都支持 `${VAR}` 与 `${VAR:default}` 语法,由 compose 从 `.env` 注入。因此**口令类字段不必写进 yaml**,保持 `${MYSQL_APP_PASSWORD}` 这样的引用即可。 - -### 逐份说明 - -#### admin-svr(管理端后端) - -| 项 | 说明 | -| --- | --- | -| `database.default.link` | 库连接串,默认已用 `${MYSQL_APP_PASSWORD}` 拼好 | -| `database.legacyCard.link` | 旧平台库,没有就留空 | -| `jwt.signingKey` | 保持 `${JWT_SIGNING_KEY}`,不要手写 | -| `warning.sms.enabled` | 不用短信改 `false` | -| `warning.wechat.*` | 不用微信订阅消息改 `false` 并留空 | -| `register.email.*` | 邮件验证码的 SMTP,不用则留空 | -| `tsdb.tdengine.dsn` | 不用时序库则留空 | -| `alipay.*` | 不用支付宝整段删除 | -| `upstream.appDiagnosisToken` | 与 `upstream-proxy` 的 `appDiagnosis.internalToken` 一致 | - -#### openapi(对外 API) - -| 项 | 说明 | -| --- | --- | -| `jwt.signingKey` | 与 admin-svr 一致 | -| `database.default.link` | 建议单独建只读账号与之隔离 | - -#### worker-svr(异步任务) - -| 项 | 说明 | -| --- | --- | -| `batch.inbound.upstreamRateLimit` | **运营商接口限流,必须按上游实际配额设置**。调太大会被运营商限流甚至封禁 | -| `rabbitmq.batchExecute.maxRetries` | 批次执行失败重试次数 | -| `tsdb.tdengine.dsn` | 不用时序库则留空 | - -#### upstream-chan(运营商对接) - -| 项 | 说明 | -| --- | --- | -| `registry.address` | Consul 地址,默认 `consul:8500` | -| `dependencies.sim_yd_mock_v5.url` | 挡板地址。对接真实运营商时删除本段 | -| `dependencies.token_refresh.skew_seconds` | 运营商 Token 提前刷新窗口 | - -运营商通道本身(AppKey、AppSecret、接口地址)不在本文件配置,而是在平台「通道管理」中录入,存数据库。 - -#### upstream-proxy(通道缓存转发) - -| 项 | 说明 | -| --- | --- | -| `appDiagnosis.internalToken` | 与 admin-svr 的 `upstream.appDiagnosisToken` 一致 | -| `gateway.batchTimeout` | 批量转发总预算上限,**worker 侧超时必须大于此值** | - -#### app-server(小程序后端) - -| 项 | 说明 | -| --- | --- | -| `jwt.signingKey` | 与 admin-svr 一致 | -| `payment.wechat.*` | 不用支付把 `enabled` 改 `false`;启用需把支付证书放入 `data/certs/` | -| `appCardRecognition.*` | 拍照识别卡号,不用改 `false` | -| `upstream.onelinkMock.*` | 挡板联调配置,对接真实运营商时 `enabled: false` | - -#### sms(短信服务) - -| 项 | 说明 | -| --- | --- | -| `serviceType` | `1`=阿里云,`2`=腾讯云 | -| `accessKeyId` / `accessKeySecret` | 从 `.env` 注入 | -| `signName` | 短信签名,需服务商审核通过 | -| `sceneDbDsn` | 场景模板库连接,默认已拼好 | - -#### bot(飞书通知,可选) - -| 项 | 说明 | -| --- | --- | -| `feishu.appId` / `appSecret` / `chatId` | 全部从 `.env` 注入 | - -#### admin-ui(管理端 nginx) - -`default.conf` 里 `/api/` 反代到 `admin-svr:8008`,`/upload/` 指向共享上传目录。一般无需修改。 - -#### nginx(对外入口,可选) - -`iotlcm.conf` 按域名分三组 server:`api.*` → openapi,`admin.*` → 管理端 + 文档站,`app.*` → 小程序端。**把 `your-domain.example.com` 替换为实际域名。** - -不使用自带 nginx 时,把其中的 `location` 段落复制到宿主机 nginx 配置中即可。 - -## 三、配置自检 - -启动前先验证语法: - -```bash -# 检查 compose 展开是否正确(不会启动容器) -docker compose config - -# 只检查必填项是否齐全 -docker compose config --quiet -``` - -配置文件语法错误(缩进、冒号)会导致服务启动后立刻退出,用日志定位: - -```bash -docker compose logs --tail=50 admin-svr -``` diff --git a/docs/03-启动与验证.md b/docs/03-启动与验证.md deleted file mode 100644 index 6d14ea6..0000000 --- a/docs/03-启动与验证.md +++ /dev/null @@ -1,173 +0,0 @@ -# 启动与验证 - -## 启动 - -```bash -# 前台启动(首次部署建议,便于观察初始化过程) -docker compose up - -# 确认无误后改为后台 -docker compose up -d -``` - -### 首次启动会发生什么 - -1. **MySQL 建库并导入 schema**(约 1~2 分钟) - `schema/` 下的 12 个脚本按文件名顺序自动执行:建表 → 结构补齐 → 创建应用账号 → 重置种子账号口令 → 导入通道模板/字典/菜单等种子数据 -2. MySQL 通过健康检查后,`admin-svr`、`openapi`、`worker-svr` 等服务依次启动 -3. 各服务向 Consul 注册 - -观察初始化进度: - -```bash -docker compose logs -f mysql -``` - -看到 `[initdb] 应用账号 u_iotlcm 已创建` 与 `[initdb] 种子账号口令已统一重置` 表示初始化完成。 - -::: warning 首次初始化失败的处理 -MySQL 只在 `data/mysql` 为空时执行 `schema/`。若初始化中途失败,修改脚本后**必须清空数据卷**才会重跑: - -```bash -docker compose down -sudo rm -rf ./data/mysql -docker compose up -d -``` - -这会删除全部数据,仅在首次部署阶段使用。 -::: - -## 检查运行状态 - -```bash -docker compose ps -``` - -期望结果: - -| 服务 | 状态 | -| --- | --- | -| iotlcm-mysql | Up (healthy) | -| iotlcm-redis | Up (healthy) | -| iotlcm-rabbitmq | Up (healthy) | -| iotlcm-consul | Up | -| iotlcm-admin-svr | Up | -| iotlcm-admin-ui | Up | -| iotlcm-openapi | Up | -| iotlcm-upstream-chan | Up | -| iotlcm-upstream-proxy | Up | -| iotlcm-worker-svr | Up | -| iotlcm-app-server | Up | -| iotlcm-app-web | Up | -| iotlcm-sms | Up (healthy) | -| iotlcm-docs | Up | - -任一服务显示 `Restarting` 或 `Exited` 需查日志: - -```bash -docker compose logs --tail=100 <服务名> -``` - -## 验证清单 - -按顺序逐项确认,任一步失败先解决再继续。 - -### 1. 数据库 - -```bash -docker compose exec mysql sh -c \ - 'mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e "SELECT COUNT(*) AS tables_count FROM information_schema.tables WHERE table_schema=\"db_iotlcm\";"' -``` - -预期输出 `tables_count` 为 **89**。 - -```bash -# 确认种子数据 -docker compose exec mysql sh -c \ - 'mysql -uroot -p"$MYSQL_ROOT_PASSWORD" db_iotlcm -e "SELECT COUNT(*) AS menus FROM sys_menu; SELECT COUNT(*) AS users FROM sys_user;"' -``` - -预期:菜单约 447 条,账号 18 个。 - -### 2. 管理端后端 - -```bash -curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8008/api.json -``` - -预期 `200`。 - -### 3. 管理端前端 - -```bash -curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8009/ -``` - -预期 `200`。 - -### 4. 对外 API - -```bash -curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8000/api.json -``` - -预期 `200`。 - -### 5. 短信服务 - -```bash -curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:11190/healthz -``` - -预期 `200`。 - -### 6. 浏览器登录 - -访问 `http://<宿主机IP>:8009`: - -| 项 | 值 | -| --- | --- | -| 账号 | `admin` | -| 口令 | `.env` 里的 `MYSQL_ADMIN_PASSWORD` | - -能进入首页工作台、左侧菜单完整显示,即部署成功。 - -## 首次登录后必做 - -1. **修改 admin 口令**:右上角个人中心 → 安全设置 -2. **修改其余种子账号口令**:种子账号(`user02`、`2admin` 等 17 个)默认与 admin 同一口令,如不使用请停用或删除 -3. **确认字典与菜单加载正常**:进入「卡信息」页,确认筛选下拉框选项不为空 - -## 后端服务自检 - -```bash -# admin-svr 是否连上数据库 -docker compose logs admin-svr | grep -i 'error\|panic' | tail -20 - -# worker-svr 是否连上 RabbitMQ -docker compose logs worker-svr | tail -30 - -# upstream-chan 是否连上 Redis 与 Consul -docker compose logs upstream-chan | tail -30 -``` - -正常日志里不应出现 `connection refused`、`access denied`、`panic`。 - -## 停止与重启 - -```bash -docker compose stop # 停止容器,保留数据 -docker compose restart # 重启全部 -docker compose restart admin-svr # 重启单个服务 -docker compose down # 停止并删除容器(数据卷在 ./data,不受影响) -``` - -::: danger 不要执行 `docker compose down -v` -`-v` 会删除命名数据卷。虽然本编排的数据都在 `./data` 宿主机目录下,但 `down -v` 仍可能影响其他同项目的卷。停止服务用 `down` 即可。 -::: - -## 下一步 - -- 需要运营商挡板联调 → [可选服务](04-可选服务.md) -- 需要对外域名访问 → [可选服务](04-可选服务.md) 的反向代理章节 -- 遇到报错 → [故障排查](06-故障排查.md) diff --git a/docs/04-可选服务.md b/docs/04-可选服务.md deleted file mode 100644 index 4d340ed..0000000 --- a/docs/04-可选服务.md +++ /dev/null @@ -1,168 +0,0 @@ -# 可选服务 - -以下服务默认不启动,按需通过 profile 开启。 - -## 一、运营商接口挡板(onelink-mock) - -### 用途 - -模拟中国移动 OneLink 接口。**没有真实运营商环境时,靠它跑通完整链路**: - -``` -admin-svr → worker-svr → upstream-chan → onelink-mock -``` - -不开挡板时,`upstream-chan` 会尝试连接真实运营商接口,没有凭据则批次执行、状态同步、流量查询全部失败。 - -### 启动 - -```bash -docker compose --profile with-mock up -d -``` - -验证: - -```bash -curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8080/api.json -``` - -预期 `200`。管理界面在 `http://127.0.0.1:8080/swagger`。 - -### 配置 - -挡板自身无需配置,数据存在容器内 SQLite(`./data/mock/onelink_mock.db`)。 - -`upstream-chan` 的配置里已预置指向: - -```yaml -dependencies: - sim_yd_mock_v5: - url: "http://onelink-mock:8080/v5/" -``` - -数据库种子脚本 `schema/08-seed-mock-channel.sql` 已插入一条 Mock 通道(`channel_yd_mock`)并指向该地址。 - -`app-server` 若要使用挡板,把 `upstream.onelinkMock.enabled` 改为 `true` 并填写 `baseUrl: "http://onelink-mock:8080/v5"`。 - -### 造测试卡 - -挡板支持生成模拟卡片,用于验证查询、开停复机、续费等流程。具体接口见挡板 Swagger 页面。 - -### 对接真实运营商 - -1. 删除或注释 `upstream-chan` 配置里的 `sim_yd_mock_v5` 段 -2. 在平台「通道管理」中录入真实运营商通道(AppKey、AppSecret、接口地址) -3. 停用 Mock 通道,避免卡片误挂到 Mock 上 - -```bash -docker compose --profile with-mock stop onelink-mock -``` - -## 二、飞书通知(bot) - -### 用途 - -把全量同步完成、失败告警等运维事件推送到飞书群。 - -### 准备 - -在飞书开放平台创建自建应用,获取: - -| 项 | 获取方式 | -| --- | --- | -| `appId` / `appSecret` | 应用凭证页面 | -| `chatId` | 目标群的会话 ID | - -填入 `.env`: - -```bash -FEISHU_APP_ID=cli_xxxxxxxx -FEISHU_APP_SECRET=xxxxxxxx -FEISHU_CHAT_ID=oc_xxxxxxxx -``` - -### 启动 - -```bash -docker compose --profile with-bot up -d -``` - -bot 依赖 `worker-svr` 生成的全量同步归档(`./data/logs/worker-svr/full-sync`),需该目录已有数据才会产生通知。 - -## 三、自带反向代理(nginx) - -### 用途 - -把分散在各端口的服务统一到域名下按路径分流。宿主机已有 nginx 或面板时不需要。 - -### 域名字段 - -编辑 `config/nginx/iotlcm.conf`,把示例域名替换为实际域名: - -| 域名 | 分流到 | -| --- | --- | -| `api.your-domain.example.com` | openapi(`/openapi/v3/`、`/route/open/`) | -| `admin.your-domain.example.com` | 管理端前端 + `/docs/` 文档站 | -| `app.your-domain.example.com` | 小程序前端 + `/app/api/v1/` 后端 | - -### 启动 - -```bash -docker compose --profile with-nginx up -d -``` - -默认监听 80 端口,改 `.env` 的 `NGINX_HTTP_PORT` 可调整。 - -### 使用宿主机 nginx - -不启动容器时,把 `config/nginx/iotlcm.conf` 中的 `upstream` 与 `location` 段落复制到宿主机 nginx 配置。 - -需注意: - -- 宿主机 nginx 无法解析 compose 内的服务名,`upstream` 要改为 `127.0.0.1:<端口>` -- 例如 `server admin-svr:8008;` → `server 127.0.0.1:8008;` - -### HTTPS - -自带 nginx 配置未包含证书。启用 HTTPS 需: - -1. 准备证书文件 -2. 在 `iotlcm.conf` 的 server 块加入: - -```nginx -listen 443 ssl; -ssl_certificate /etc/nginx/certs/fullchain.pem; -ssl_certificate_key /etc/nginx/certs/privkey.pem; -ssl_protocols TLSv1.2 TLSv1.3; -``` - -3. 在 compose 的 nginx 服务增加证书目录挂载: - -```yaml -volumes: - - ./data/certs:/etc/nginx/certs:ro -``` - -4. 增加 80 → 443 跳转: - -```nginx -server { - listen 80; - server_name admin.your-domain.example.com; - return 301 https://$host$request_uri; -} -``` - -## 四、组合启动 - -多个 profile 可同时启用: - -```bash -docker compose --profile with-mock --profile with-nginx up -d -``` - -查看当前启用的 profile 与对应的服务: - -```bash -docker compose --profile with-mock config --services -``` diff --git a/docs/05-升级与备份.md b/docs/05-升级与备份.md deleted file mode 100644 index 71cb240..0000000 --- a/docs/05-升级与备份.md +++ /dev/null @@ -1,185 +0,0 @@ -# 升级与备份 - -## 版本固定 - -生产环境**必须固定镜像标签**,不要用 `latest`。原因: - -- `latest` 会随仓库推送变化,同一份 compose 在不同时间拉到的镜像不同 -- 出问题无法确定运行的是哪个版本 -- 回滚时没有明确目标 - -`.env` 中指定: - -```bash -TAG=1.0.3 -``` - -记录当前部署版本: - -```bash -echo "$(date '+%Y-%m-%d %H:%M') TAG=$(grep '^TAG=' .env | cut -d= -f2)" >> deploy-history.log -``` - -## 升级流程 - -```bash -# 1. 备份(见下节,不要跳过) -./backup.sh - -# 2. 拉取新镜像 -vi .env # 修改 TAG -docker compose pull - -# 3. 只更新发生变化的服务 -docker compose up -d - -# 4. 验证 -docker compose ps -docker compose logs --tail=50 admin-svr -``` - -滚动更新单个服务,减少中断: - -```bash -docker compose up -d --no-deps admin-svr -``` - -## 回滚 - -```bash -# 改回上一个版本 -vi .env # TAG 改回旧版本 -docker compose pull -docker compose up -d -``` - -::: warning 数据库变更不可自动回滚 -若新版本包含数据库结构变更,回滚代码后数据库仍是新结构。升级前务必确认变更脚本可逆,或保留升级前的完整备份。 -::: - -## 什么情况下需要重新初始化数据库 - -`schema/` 下的脚本**只在 `data/mysql` 为空时执行**。以下情况才需要清空重建: - -| 情况 | 是否需要 | -| --- | --- | -| 升级应用镜像 | 否 | -| 修改 `config/` | 否,重启对应服务即可 | -| 修改 `schema/` 脚本 | 是(会丢数据) | -| 首次初始化失败 | 是 | - -清空重建: - -```bash -docker compose down -sudo rm -rf ./data/mysql -docker compose up -d -``` - -::: danger 生产环境禁止清空 data/mysql -生产数据必须通过数据库工具单独备份与迁移,不能依赖 schema 重建。上面这条命令仅用于首次部署阶段。 -::: - -## 备份 - -### 全量备份脚本 - -保存为 `backup.sh`(不要提交到仓库,`.gitignore` 已排除 `backup.sh` 外的脚本时请自行确认): - -```bash -#!/bin/bash -set -euo pipefail -cd "$(dirname "$0")" - -STAMP=$(date '+%Y%m%d-%H%M%S') -DEST="./backups/${STAMP}" -mkdir -p "$DEST" - -echo "[1/3] 导出数据库..." -docker compose exec -T mysql sh -c \ - 'exec mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" --single-transaction --routines --triggers --events db_iotlcm' \ - | gzip > "${DEST}/db_iotlcm.sql.gz" - -echo "[2/3] 备份配置..." -tar czf "${DEST}/config.tar.gz" config/ .env - -echo "[3/3] 备份上传文件(可选,量大可跳过)..." -tar czf "${DEST}/upload.tar.gz" data/upload/ 2>/dev/null || echo " 上传目录为空,跳过" - -echo "完成:${DEST}" -ls -lh "$DEST" -``` - -```bash -chmod +x backup.sh -./backup.sh -``` - -### 只备份数据库 - -```bash -docker compose exec -T mysql sh -c \ - 'exec mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" --single-transaction db_iotlcm' \ - | gzip > "db_iotlcm-$(date +%Y%m%d).sql.gz" -``` - -### 恢复数据库 - -```bash -gunzip -c db_iotlcm-20260101.sql.gz | \ - docker compose exec -T mysql sh -c \ - 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" db_iotlcm' -``` - -### 备份内容清单 - -| 内容 | 位置 | 重要性 | -| --- | --- | --- | -| 数据库 | MySQL 容器内 `db_iotlcm` | **最高**,业务数据全在这里 | -| 配置 | `config/` + `.env` | 高,丢失需重新配置 | -| 上传文件 | `data/upload/` | 中,附件与图片 | -| Redis 数据 | `data/redis/` | 低,缓存可重建 | -| RabbitMQ 队列 | `data/rabbitmq/` | 低,未消费消息会丢失 | -| 日志 | `data/logs/` | 低,排障用 | - -### 备份策略建议 - -| 场景 | 频率 | 保留 | -| --- | --- | --- | -| 生产 | 每日一次 + 升级前 | 30 天 | -| 试用 | 有数据变更时 | 7 天 | - -备份文件应转存到异机或对象存储,不要与数据库放同一块盘。 - -## 日志清理 - -日志写在 `data/logs/` 下,按服务分目录,应用侧已配置按小时轮转(`{Y-m-d-H}.log`)。磁盘吃紧时清理旧日志: - -```bash -# 删除 7 天前的日志 -find ./data/logs -name '*.log' -mtime +7 -delete -``` - -建议用系统 cron 定期执行: - -```bash -# /etc/cron.d/iotlcm-logrotate -0 3 * * * root find /path/to/iotlcm-deploy/data/logs -name '*.log' -mtime +7 -delete -``` - -## 监控 - -基础组件自带的监控端点: - -| 服务 | 端点 | -| --- | --- | -| RabbitMQ | `http://:15672`(管理界面) | -| Consul | `http://:8500/ui` | -| MySQL | `docker compose exec mysql mysqladmin status` | - -建议对以下指标告警: - -- MySQL 连接数与磁盘使用率 -- Redis 内存使用率 -- RabbitMQ 队列积压数(`iotlcm.batch.execute`、`iotlcm.app.business`) -- worker-svr 全量同步任务失败数 diff --git a/docs/06-故障排查.md b/docs/06-故障排查.md deleted file mode 100644 index 6411795..0000000 --- a/docs/06-故障排查.md +++ /dev/null @@ -1,292 +0,0 @@ -# 故障排查 - -## 通用排查步骤 - -```bash -# 1. 看容器状态 -docker compose ps - -# 2. 看某个服务的日志 -docker compose logs --tail=100 <服务名> - -# 3. 跟随日志 -docker compose logs -f <服务名> - -# 4. 进容器排查 -docker compose exec <服务名> sh -``` - -## 启动类 - -### MySQL 一直不 healthy - -**现象**:`iotlcm-mysql` 显示 `Up (healthrestarting)` 或一直 `starting`,其余服务不启动。 - -**排查**: - -```bash -docker compose logs mysql | tail -50 -``` - -| 日志关键词 | 原因 | 处理 | -| --- | --- | --- | -| `Access denied` | root 口令与旧数据卷中的不一致 | 改 `.env` 的 `MYSQL_ROOT_PASSWORD` 与卷内一致,或清空 `data/mysql` 重建 | -| `Can't create/write to file` | 目录权限问题 | `sudo chown -R 999:999 data/mysql` | -| `No space left on device` | 磁盘满 | 清理磁盘 | -| `mysqld: Can't open shared library` | 架构不匹配 | 确认镜像与宿主机架构一致 | - -### schema 初始化失败 - -**现象**:MySQL 起来了,但表数量不对,或日志中有 SQL 报错。 - -**排查**: - -```bash -docker compose logs mysql | grep -iE 'error|ERROR' | head -30 -``` - -常见原因: - -| 原因 | 处理 | -| --- | --- | -| `MYSQL_APP_PASSWORD` 未设置,`04-users.sh` 退出 | 在 `.env` 补上后清空 `data/mysql` 重建 | -| `MYSQL_ADMIN_PASSWORD` 未设置,`05-reset-passwords.sh` 退出 | 同上 | -| SQL 脚本本身语法问题 | 单独执行该脚本定位,见 [schema/README](../schema/README.md) | - -::: warning 改脚本后必须清空数据卷 -MySQL 只在 `data/mysql` 为空时执行 `schema/`。文件改了不会自动重跑: - -```bash -docker compose down && sudo rm -rf ./data/mysql && docker compose up -d -``` -::: - -### 业务服务反复重启 - -**排查**: - -```bash -docker compose logs --tail=80 admin-svr -``` - -| 报错 | 原因 | 处理 | -| --- | --- | --- | -| `possible config files "config" not found` | `config/` 目录不存在或挂载失败 | `cp -r config.example config` 并确认 `config/admin-svr/config.yaml` 存在 | -| `dial tcp mysql:3306: connect: connection refused` | MySQL 未就绪 | 等 MySQL healthy,或检查 `depends_on` 是否生效 | -| `Access denied for user 'u_iotlcm'` | 应用账号密码与数据库内不一致 | 确认 `.env` 的 `MYSQL_APP_PASSWORD` 与初始化时一致;改过则需重建库 | -| `panic: unsupported provider xxx` | 数据库通道模板与镜像版本不匹配 | 确认镜像版本与 schema 版本配套 | - -## 功能类 - -### 登录后提示未授权 / 接口 401 - -**原因**:`JWT_SIGNING_KEY` 在服务间不一致。 - -**处理**:确认 `admin-svr`、`openapi`、`app-server` 三份配置里的 `jwt.signingKey` 都引用 `${JWT_SIGNING_KEY}`,且 `.env` 里有值。改完重启三个服务: - -```bash -docker compose restart admin-svr openapi app-server -``` - -### 登录成功但页面空白 / 菜单不显示 - -**排查**: - -1. 浏览器 F12 看 Network 有无 4xx/5xx -2. 检查菜单数据: - -```bash -docker compose exec mysql sh -c \ - 'mysql -uroot -p"$MYSQL_ROOT_PASSWORD" db_iotlcm -e "SELECT COUNT(*) FROM sys_menu WHERE status=0;"' -``` - -菜单为 0 说明种子数据未导入,需重建库。 - -3. 检查角色菜单关联: - -```bash -docker compose exec mysql sh -c \ - 'mysql -uroot -p"$MYSQL_ROOT_PASSWORD" db_iotlcm -e "SELECT COUNT(*) FROM sys_role_menu;"' -``` - -### 卡信息页通道列空白 / 筛选无选项 - -**原因**:Mock 通道未插入,或通道数据缺失。 - -**处理**: - -```bash -docker compose exec mysql sh -c \ - 'mysql -uroot -p"$MYSQL_ROOT_PASSWORD" db_iotlcm -e "SELECT channel_id, channel_name FROM t_sim_channels;"' -``` - -为空则手工执行种子脚本: - -```bash -docker compose exec -T mysql sh -c \ - 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" db_iotlcm' < schema/08-seed-mock-channel.sql -``` - -### 批次执行一直失败 - -**排查顺序**: - -1. **挡板是否启动**(无真实运营商时) - -```bash -docker compose ps | grep onelink-mock -curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8080/api.json -``` - -未启动则:`docker compose --profile with-mock up -d` - -2. **worker-svr 是否连上 RabbitMQ** - -```bash -docker compose logs worker-svr | grep -i 'rabbit\|amqp' | tail -20 -``` - -3. **upstream-chan 是否能连到上游** - -```bash -docker compose logs upstream-chan --tail=50 -``` - -4. **运营商是否限流** - -看 `worker-svr` 日志中是否有 `rate limit`、`429`、`12021` 等错误。检查 `batch.inbound.upstreamRateLimit` 配置的 QPS 是否超过上游配额。 - -### 历史流量查询无数据 - -**原因**:TDengine 未配置或未连接。 - -**处理**: - -```bash -docker compose logs worker-svr | grep -i 'tdengine\|taos' | tail -20 -``` - -确认 `.env` 中 `TDENGINE_HOST` 等变量已填,且 TDengine 的 WebSocket 端口(默认 6041)可达: - -```bash -docker compose exec worker-svr sh -c 'nc -zv $TDENGINE_HOST $TDENGINE_PORT' -``` - -不用该功能时留空即可,不影响主流程。 - -### 短信发不出去 - -**排查**: - -```bash -# 1. 短信服务健康 -curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:11190/healthz - -# 2. 服务日志 -docker compose logs sms --tail=50 -``` - -| 报错 | 原因 | -| --- | --- | -| `InvalidAccessKeyId` | `.env` 里 AK 未填或错误 | -| `isv.SMS_SIGNATURE_ILLEGAL` | `signName` 与服务商审核的签名不一致 | -| `isv.SMS_TEMPLATE_ILLEGAL` | 模板 ID 未在服务商侧审核通过 | -| `缺少 config.templateId` | 场景模板库未配置,调用方需自带 templateId | - -### 图片上传失败 / 图片不显示 - -**原因**:`data/upload` 目录权限或挂载问题。 - -**处理**: - -```bash -ls -la data/upload/ -sudo chown -R 1000:1000 data/upload -docker compose restart admin-svr admin-ui -``` - -## 性能类 - -### CPU 被 worker-svr 打满 - -**原因**:定时任务开启了全量同步,大量卡片并发查询上游。 - -**处理**: - -1. 降低并发: - -```yaml -batch: - inbound: - upstreamConcurrency: 50 # 从 300 降低 - upstreamBatchSize: 1 -``` - -2. 降低限流 QPS,与上游配额匹配 - -3. 演示/试用环境建议直接停用定时任务: - -```bash -docker compose exec mysql sh -c \ - 'mysql -uroot -p"$MYSQL_ROOT_PASSWORD" db_iotlcm -e "UPDATE sys_job SET status=1;"' -``` - -种子数据中定时任务默认已全部停用(`status=1`)。 - -### 磁盘持续增长 - -按占用从大到小排查: - -```bash -du -sh data/* | sort -rh -``` - -| 目录 | 处理 | -| --- | --- | -| `data/logs` | 清理旧日志,见 [升级与备份](05-升级与备份.md) 的日志清理 | -| `data/upload` | 检查是否有异常大的上传文件 | -| `data/mysql` | 数据库增长正常,关注 binlog:`docker compose exec mysql du -sh /var/lib/mysql` | -| `data/redis` | AOF 文件,正常 | - -## 网络类 - -### 容器间无法互访 - -```bash -# 查看网络 -docker network inspect iotlcm-network - -# 从容器内测试 -docker compose exec admin-svr sh -c 'nc -zv mysql 3306' -``` - -服务名即主机名,配置里应使用 `mysql:3306`、`redis:6379` 这样的形式,不要写 `127.0.0.1`。 - -### 宿主机访问不了 127.0.0.1 绑定的服务 - -`admin-svr`、`admin-ui`、`openapi`、`app-server`、`app-web`、`docs` 默认只绑定 `127.0.0.1`,仅本机可访问。对外访问需: - -1. 用 `--profile with-nginx` 启动反向代理,或 -2. 在宿主机配置 nginx 转发到 `127.0.0.1:<端口>` - -不建议直接把端口改成 `0.0.0.0` 暴露到公网。 - -## 获取帮助信息 - -排查时附上这些信息便于定位: - -```bash -# 版本信息 -docker compose version -docker version --format '{{.Server.Version}}' - -# 服务状态 -docker compose ps - -# 相关服务日志 -docker compose logs --tail=200 <服务名> - -# 磁盘与内存 -df -h -free -h -``` From 0bfc0ebe80338e41508e774c57397706d7d10b07 Mon Sep 17 00:00:00 2001 From: MiFaZhan Date: Wed, 28 Oct 2026 14:02:44 +0800 Subject: [PATCH 04/24] =?UTF-8?q?docs:=20README=20=E5=8E=BB=E6=8E=89?= =?UTF-8?q?=E5=AF=B9=E6=96=87=E6=A1=A3=E7=AB=99=E7=9A=84=E5=A4=96=E9=93=BE?= =?UTF-8?q?=EF=BC=8C=E8=A1=A5=E5=8F=AF=E9=80=89=E6=9C=8D=E5=8A=A1=E5=90=AF?= =?UTF-8?q?=E5=8A=A8=E5=91=BD=E4=BB=A4=E4=B8=8E=20LICENSE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除「文档」章节:手动归入文档站后,README 不再引用任何外部仓库地址 - 补三个可选 profile 的启动命令 - 补 Apache-2.0 LICENSE(与其余开源仓一致) --- LICENSE | 201 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 23 ++++--- 2 files changed, 213 insertions(+), 11 deletions(-) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md index e79f4a3..7331225 100644 --- a/README.md +++ b/README.md @@ -32,16 +32,13 @@ docker compose ps 启动完成后访问 `http://<宿主机IP>:8009`,账号 `admin`,口令为 `.env` 中的 `MYSQL_ADMIN_PASSWORD`。 -## 文档 +需要按需开启的可选服务: -| 文档 | 内容 | -| --- | --- | -| [环境准备](docs/01-环境准备.md) | 硬件、系统、Docker 版本要求 | -| [配置说明](docs/02-配置说明.md) | `.env` 与 `config/` 各项含义 | -| [启动与验证](docs/03-启动与验证.md) | 启动流程、健康检查、首次登录 | -| [可选服务](docs/04-可选服务.md) | 挡板、飞书通知、自带反向代理 | -| [升级与备份](docs/05-升级与备份.md) | 版本固定、升级、数据备份 | -| [故障排查](docs/06-故障排查.md) | 常见问题与处理 | +```bash +docker compose --profile with-mock up -d # 运营商接口挡板 +docker compose --profile with-bot up -d # 飞书通知 +docker compose --profile with-nginx up -d # 自带反向代理 +``` ## 目录结构 @@ -61,7 +58,6 @@ iotlcm-deploy/ │ ├── upstream-proxy/ │ └── worker-svr/ ├── schema/ # 数据库初始化脚本(首次启动自动执行) -├── docs/ # 部署文档 ├── config/ # 实际配置(不入版本库) └── data/ # 运行数据(不入版本库) ``` @@ -73,4 +69,9 @@ iotlcm-deploy/ - **`JWT_SIGNING_KEY` 必须在 `admin-svr`、`openapi`、`app-server` 三者间完全一致**,否则令牌跨服务不通 - **镜像标签不要用 `latest`**,生产环境请固定到具体版本 - **改 `schema/` 下的脚本不会自动生效**,需要清空 `data/mysql` 重新初始化(会丢失全部数据) -- 默认只监听 `127.0.0.1` 的服务需通过反向代理对外,见[可选服务](docs/04-可选服务.md) +- 默认只监听 `127.0.0.1` 的服务需通过反向代理对外 +- 数据库初始化脚本的详细说明见 [`schema/README.md`](schema/README.md) + +## 许可 + +[Apache License 2.0](LICENSE) From 5ddad0c5e53c73a29804e74faf0b78deb296e69f Mon Sep 17 00:00:00 2001 From: MiFaZhan Date: Thu, 29 Oct 2026 09:17:26 +0800 Subject: [PATCH 05/24] =?UTF-8?q?feat:=20=E4=B8=80=E9=94=AE=E9=83=A8?= =?UTF-8?q?=E7=BD=B2=E2=80=94=E2=80=94=E9=85=8D=E7=BD=AE=E5=86=85=E7=BD=AE?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E5=80=BC=EF=BC=8C=E5=8E=BB=E6=8E=89=E7=A4=BA?= =?UTF-8?q?=E4=BE=8B=E5=A4=8D=E5=88=B6=E4=B8=8E=E7=8E=AF=E5=A2=83=E5=8F=98?= =?UTF-8?q?=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 目标:git clone 后 docker compose up -d 直接可用,无需任何手工准备。 变更: - config.example/ → config/,config.example.yaml → config.yaml 不再需要 cp -r 与逐份修改 - 删除 .env / .env.example,值全部内置到 docker-compose.yml (GoFrame 不展开配置文件中的 ${VAR},环境变量方案在 Go 侧不可用) - 配置文件里的 ${VAR} 全部替换为字面默认值 - schema/04-users.sh 与 05-reset-passwords.sh 改为脚本内字面口令, 不再读取环境变量 - 新增 schema/13-seed-flow-package.sql 占位文件,说明套餐表为空的原因与补齐方式 - .gitignore 不再排除 config/ 与 .env(已无 .env) - README 改为「一键启动」+「上线前必改」两张表 已验证:docker compose config 通过;compose 口令、各配置文件 DSN、 初始化脚本三处口令哈希一致;库名与 schema 中一致。 --- .env.example | 95 -------------- .gitignore | 7 +- README.md | 111 ++++++++++------- .../admin-svr/config.yaml | 21 ++-- .../admin-ui/default.conf | 0 .../app-server/config.yaml | 18 +-- .../bot/config.yaml | 6 +- {config.example => config}/nginx/iotlcm.conf | 0 .../openapi/config.yaml | 8 +- .../sms/config.yaml | 6 +- .../upstream-chan/config.yaml | 4 +- .../upstream-proxy/config.yaml | 6 +- .../worker-svr/config.yaml | 14 +-- docker-compose.yml | 117 +++++++++--------- schema/04-users.sh | 30 ++--- schema/05-reset-passwords.sh | 23 ++-- schema/13-seed-flow-package.sql | 35 ++++++ schema/README.md | 50 ++++---- 18 files changed, 252 insertions(+), 299 deletions(-) delete mode 100644 .env.example rename config.example/admin-svr/config.example.yaml => config/admin-svr/config.yaml (87%) rename {config.example => config}/admin-ui/default.conf (100%) rename config.example/app-server/config.example.yaml => config/app-server/config.yaml (92%) rename config.example/bot/config.example.yaml => config/bot/config.yaml (88%) rename {config.example => config}/nginx/iotlcm.conf (100%) rename config.example/openapi/config.example.yaml => config/openapi/config.yaml (86%) rename config.example/sms/config.example.yaml => config/sms/config.yaml (80%) rename config.example/upstream-chan/config.example.yaml => config/upstream-chan/config.yaml (93%) rename config.example/upstream-proxy/config.example.yaml => config/upstream-proxy/config.yaml (92%) rename config.example/worker-svr/config.example.yaml => config/worker-svr/config.yaml (87%) create mode 100644 schema/13-seed-flow-package.sql diff --git a/.env.example b/.env.example deleted file mode 100644 index abb24d3..0000000 --- a/.env.example +++ /dev/null @@ -1,95 +0,0 @@ -# ============================================================ -# IotLCM 部署环境变量 -# -# cp .env.example .env -# -# 标注「必填」的变量未设置时 docker compose 会直接报错退出, -# 避免用弱口令启动。口令建议用 openssl rand -base64 24 生成。 -# ============================================================ - -# ---------- 镜像 ---------- -# 镜像仓库地址(不含末尾斜杠)。 -# 基础组件从 /library/ 拉取,业务镜像从 /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 diff --git a/.gitignore b/.gitignore index 82d5639..e551619 100644 --- a/.gitignore +++ b/.gitignore @@ -1,11 +1,8 @@ # 运行时数据(含数据库文件、日志、上传件) data/ -# 实际配置(由 config.example 复制而来,含真实凭据) -config/ - -# 环境变量文件 -.env +# 本地覆盖配置(如需保留自己的修改而不进版本库,可放 config/local.yaml) +config/*/local.yaml # 编辑器与系统文件 .DS_Store diff --git a/README.md b/README.md index 7331225..87b5eb3 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,41 @@ IotLCM 物联网卡管理平台的部署编排与数据库初始化脚本。使用 Docker Compose 在单机上拉起完整平台。 +## 一键启动 + +```bash +git clone <本仓库地址> iotlcm-deploy +cd iotlcm-deploy +docker compose up -d +``` + +无需复制或修改任何文件,配置里已带可用默认值。首次启动会自动建库、建表、创建应用账号并导入种子数据,约需 1~2 分钟。 + +等待 MySQL 健康后其余服务依次启动,观察进度: + +```bash +docker compose logs -f mysql +``` + +启动完成后访问 `http://<宿主机IP>:8009`: + +| 项 | 值 | +| --- | --- | +| 账号 | `admin` | +| 口令 | `Iotlcm2026Default` | + +> ⚠️ **正式使用前必须修改默认口令**,见下方「上线前必改」。 + +## 可选服务 + +```bash +docker compose --profile with-mock up -d # 运营商接口挡板 +docker compose --profile with-bot up -d # 飞书通知 +docker compose --profile with-nginx up -d # 自带反向代理 +``` + +多个 profile 可组合:`--profile with-mock --profile with-nginx up -d` + ## 部署内容 | 类别 | 服务 | @@ -10,59 +45,42 @@ IotLCM 物联网卡管理平台的部署编排与数据库初始化脚本。使 | 业务服务 | admin-svr(管理端后端)、admin-ui(管理端前端)、openapi(对外 API)、app-server(小程序后端)、app-web(小程序前端)、upstream-chan(运营商对接)、upstream-proxy(通道缓存转发)、worker-svr(异步任务)、sms(短信)、docs(文档站) | | 可选 | onelink-mock(运营商接口挡板)、bot(飞书通知)、nginx(反向代理) | -## 快速开始 - -```bash -# 1. 准备环境变量 -cp .env.example .env -vi .env # 填镜像仓库、各项口令 - -# 2. 准备配置 -cp -r config.example config -vi config/*/config.yaml # 逐份填写(标注「必改」的项) - -# 3. 启动 -docker compose up -d - -# 4. 查看状态 -docker compose ps -``` - -首次启动会自动建库并导入 schema,MySQL 初始化约需 1~2 分钟。等待 `iotlcm-mysql` 健康后其余服务才会启动。 - -启动完成后访问 `http://<宿主机IP>:8009`,账号 `admin`,口令为 `.env` 中的 `MYSQL_ADMIN_PASSWORD`。 - -需要按需开启的可选服务: - -```bash -docker compose --profile with-mock up -d # 运营商接口挡板 -docker compose --profile with-bot up -d # 飞书通知 -docker compose --profile with-nginx up -d # 自带反向代理 -``` - ## 目录结构 ``` iotlcm-deploy/ -├── docker-compose.yml # 服务编排 -├── .env.example # 环境变量模板 → 复制为 .env -├── config.example/ # 配置模板 → 复制为 config/ -│ ├── admin-svr/ -│ ├── admin-ui/ -│ ├── app-server/ -│ ├── bot/ -│ ├── nginx/ -│ ├── openapi/ -│ ├── sms/ -│ ├── upstream-chan/ -│ ├── upstream-proxy/ -│ └── worker-svr/ +├── docker-compose.yml # 服务编排(含全部默认值) +├── config/ # 各服务配置,已带可用默认值 +│ ├── admin-svr/config.yaml +│ ├── admin-ui/default.conf +│ ├── app-server/config.yaml +│ ├── bot/config.yaml +│ ├── nginx/iotlcm.conf +│ ├── openapi/config.yaml +│ ├── sms/config.yaml +│ ├── upstream-chan/config.yaml +│ ├── upstream-proxy/config.yaml +│ └── worker-svr/config.yaml ├── schema/ # 数据库初始化脚本(首次启动自动执行) -├── config/ # 实际配置(不入版本库) -└── data/ # 运行数据(不入版本库) +└── data/ # 运行数据(首次启动自动创建,不入版本库) ``` -`config/` 与 `data/` 在 `.gitignore` 中,不会被提交。 +## 上线前必改 + +默认口令仅用于快速试用。**正式部署前必须修改以下内容**,具体位置见[部署手册](https://git.5iot.com/iotlcm-public/iotlcm-docs): + +| 项 | 位置 | +| --- | --- | +| 数据库口令(root 与应用账号) | `docker-compose.yml` + `config/*/config.yaml` + `schema/04-users.sh` | +| Redis 口令 | `docker-compose.yml` + `config/*/config.yaml` | +| RabbitMQ 口令 | `docker-compose.yml` + `config/*/config.yaml` | +| admin 初始口令 | `docker-compose.yml` + `schema/05-reset-passwords.sh` | +| JWT 签名密钥 | `config/admin-svr`、`config/openapi`、`config/app-server` 三处 | +| 对外域名 | `config/nginx/iotlcm.conf` | + +::: warning 改口令必须多处同步 +因为配置文件里是字面值(未使用环境变量),改口令时**编排、配置、初始化脚本三处必须一致**,漏改会导致服务连不上数据库。 +::: ## 重要提示 @@ -70,7 +88,6 @@ iotlcm-deploy/ - **镜像标签不要用 `latest`**,生产环境请固定到具体版本 - **改 `schema/` 下的脚本不会自动生效**,需要清空 `data/mysql` 重新初始化(会丢失全部数据) - 默认只监听 `127.0.0.1` 的服务需通过反向代理对外 -- 数据库初始化脚本的详细说明见 [`schema/README.md`](schema/README.md) ## 许可 diff --git a/config.example/admin-svr/config.example.yaml b/config/admin-svr/config.yaml similarity index 87% rename from config.example/admin-svr/config.example.yaml rename to config/admin-svr/config.yaml index ba51502..4f23f77 100644 --- a/config.example/admin-svr/config.example.yaml +++ b/config/admin-svr/config.yaml @@ -5,7 +5,7 @@ # # 标注「必改」的项需要按实际环境填写; # 其余为可运行默认值,按需调整。 -# 支持 ${VAR} 与 ${VAR:default} 环境变量占位(由 compose 注入)。 +# 支持 与 环境变量占位(由 compose 注入)。 # ============================================================ system: @@ -52,7 +52,7 @@ logger: # ---------- JWT ---------- # 必改:signingKey 必须与 openapi、app-server 完全一致。 jwt: - signingKey: "${JWT_SIGNING_KEY}" + signingKey: "1f8b3c5d7e9a2b4c6d8e0f1a3b5c7d9e1f8b3c5d7e9a2b4c6d8e0f1a3b5c7d9e" expiresTime: 7d bufferTime: 1d issuer: iotlcm @@ -77,8 +77,7 @@ database: 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" + # 必改:连接串格式为 mysql:用户名:Iotlcm2026Default@tcp(mysql:3306)/db_iotlcm?charset=utf8mb4&parseTime=True&loc=Asia%2FShanghai" debug: false charset: "utf8mb4" dryRun: false @@ -162,7 +161,7 @@ redis: sentinelMasterName: "" address: "redis:6379" db: 0 - pass: "${REDIS_PASSWORD}" + pass: "Iotlcm2026Default" minIdle: 5 maxIdle: 30 maxActive: 5000 @@ -172,7 +171,7 @@ redis: # ---------- RabbitMQ ---------- rabbitmq: enabled: true - dsn: "amqp://${RABBITMQ_USER}:${RABBITMQ_PASSWORD}@rabbitmq:5672/" + dsn: "amqp://iotlcm:Iotlcm2026Default@rabbitmq:5672/" # ---------- TDengine(流量历史) ---------- # 需要 TDengine 3.x 的 WebSocket 接口(6041)。 @@ -181,10 +180,10 @@ 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}" + dsn: ":@ws(:)/" + dbName: "" + dailyDbName: "" + monthlyDbName: "" maxOpenConns: 100 maxIdleConns: 10 @@ -219,7 +218,7 @@ pay: # 指向同 compose 内的服务名,一般无需修改。 upstream: # 控制台智能诊断内部凭据,须与 upstream-proxy 的 appDiagnosis.internalToken 一致 - appDiagnosisToken: "${DIAGNOSIS_INTERNAL_TOKEN}" + appDiagnosisToken: "iotlcm_diagnosis_2026" proxy: address: "upstream-proxy:8510" timeout: 10s diff --git a/config.example/admin-ui/default.conf b/config/admin-ui/default.conf similarity index 100% rename from config.example/admin-ui/default.conf rename to config/admin-ui/default.conf diff --git a/config.example/app-server/config.example.yaml b/config/app-server/config.yaml similarity index 92% rename from config.example/app-server/config.example.yaml rename to config/app-server/config.yaml index 8fab95f..4e85659 100644 --- a/config.example/app-server/config.example.yaml +++ b/config/app-server/config.yaml @@ -53,7 +53,7 @@ logger: # ---------- JWT ---------- # 必改:必须与 admin-svr、openapi 完全一致。 jwt: - signingKey: "${JWT_SIGNING_KEY}" + signingKey: "1f8b3c5d7e9a2b4c6d8e0f1a3b5c7d9e1f8b3c5d7e9a2b4c6d8e0f1a3b5c7d9e" expiresTime: "7d" bufferTime: "1d" issuer: "iotlcm" @@ -88,7 +88,7 @@ database: stdout: true default: # 必改:连接串 - link: "mysql:u_iotlcm:${MYSQL_APP_PASSWORD}@tcp(mysql:3306)/${MYSQL_DATABASE}?charset=utf8mb4&parseTime=True&loc=Asia%2FShanghai" + link: "mysql:u_iotlcm:Iotlcm2026Default@tcp(mysql:3306)/db_iotlcm?charset=utf8mb4&parseTime=True&loc=Asia%2FShanghai" debug: false charset: "utf8mb4" dryRun: false @@ -113,7 +113,7 @@ redis: sentinelMasterName: "" address: "redis:6379" db: 0 - pass: "${REDIS_PASSWORD}" + pass: "Iotlcm2026Default" minIdle: 5 maxIdle: 30 maxActive: 5000 @@ -123,7 +123,7 @@ redis: # ---------- RabbitMQ ---------- rabbitmq: enabled: true - dsn: "amqp://${RABBITMQ_USER}:${RABBITMQ_PASSWORD}@rabbitmq:5672/" + dsn: "amqp://iotlcm:Iotlcm2026Default@rabbitmq:5672/" # ---------- 异步业务 ---------- workerBatchAsync: @@ -197,10 +197,10 @@ 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}" + dsn: ":@ws(:)/" + dbName: "" + dailyDbName: "" + monthlyDbName: "" maxOpenConns: 100 maxIdleConns: 10 @@ -244,7 +244,7 @@ router: # ---------- 上游服务地址 ---------- upstream: # 控制台智能诊断内部凭据,须与 admin-svr 一致 - appDiagnosisToken: "${DIAGNOSIS_INTERNAL_TOKEN}" + appDiagnosisToken: "iotlcm_diagnosis_2026" provider: "onelink_mock" default: clientName: "http://upstream-proxy:8510" diff --git a/config.example/bot/config.example.yaml b/config/bot/config.yaml similarity index 88% rename from config.example/bot/config.example.yaml rename to config/bot/config.yaml index aaca7da..5086033 100644 --- a/config.example/bot/config.example.yaml +++ b/config/bot/config.yaml @@ -21,6 +21,6 @@ pollInterval: 10s # appId / appSecret:应用凭证 # chatId:目标群会话 ID feishu: - appId: "${FEISHU_APP_ID}" - appSecret: "${FEISHU_APP_SECRET}" - chatId: "${FEISHU_CHAT_ID}" + appId: "" + appSecret: "" + chatId: "" diff --git a/config.example/nginx/iotlcm.conf b/config/nginx/iotlcm.conf similarity index 100% rename from config.example/nginx/iotlcm.conf rename to config/nginx/iotlcm.conf diff --git a/config.example/openapi/config.example.yaml b/config/openapi/config.yaml similarity index 86% rename from config.example/openapi/config.example.yaml rename to config/openapi/config.yaml index 33e65b5..863eddd 100644 --- a/config.example/openapi/config.example.yaml +++ b/config/openapi/config.yaml @@ -31,7 +31,7 @@ logger: # 必改:必须与 admin-svr、app-server 完全一致, # 否则 admin 签发的令牌在 openapi 侧校验不通过。 jwt: - signingKey: "${JWT_SIGNING_KEY}" + signingKey: "1f8b3c5d7e9a2b4c6d8e0f1a3b5c7d9e1f8b3c5d7e9a2b4c6d8e0f1a3b5c7d9e" expiresTime: "7d" bufferTime: "1d" issuer: "iotlcm" @@ -45,7 +45,7 @@ database: stdout: true default: # 必改:连接串 - link: "mysql:u_iotlcm:${MYSQL_APP_PASSWORD}@tcp(mysql:3306)/${MYSQL_DATABASE}?charset=utf8mb4&parseTime=True&loc=Asia%2FShanghai" + link: "mysql:u_iotlcm:Iotlcm2026Default@tcp(mysql:3306)/db_iotlcm?charset=utf8mb4&parseTime=True&loc=Asia%2FShanghai" debug: false charset: "utf8mb4" dryRun: false @@ -64,7 +64,7 @@ redis: sentinelMasterName: "" address: "redis:6379" db: 0 - pass: "${REDIS_PASSWORD}" + pass: "Iotlcm2026Default" minIdle: 5 maxIdle: 30 maxActive: 5000 @@ -74,7 +74,7 @@ redis: # ---------- RabbitMQ ---------- rabbitmq: enabled: true - dsn: "amqp://${RABBITMQ_USER}:${RABBITMQ_PASSWORD}@rabbitmq:5672/" + dsn: "amqp://iotlcm:Iotlcm2026Default@rabbitmq:5672/" # ---------- 免登录白名单 ---------- router: diff --git a/config.example/sms/config.example.yaml b/config/sms/config.yaml similarity index 80% rename from config.example/sms/config.example.yaml rename to config/sms/config.yaml index 161ea7e..9f53eae 100644 --- a/config.example/sms/config.example.yaml +++ b/config/sms/config.yaml @@ -12,8 +12,8 @@ serviceType: "1" # ---------- 必改:服务商凭据 ---------- regionId: cn-hangzhou -accessKeyId: "${SMS_ACCESS_KEY_ID}" -accessKeySecret: "${SMS_ACCESS_KEY_SECRET}" +accessKeyId: "" +accessKeySecret: "" # 短信签名,需已在服务商侧审核通过 signName: "示例签名" @@ -25,5 +25,5 @@ signName: "示例签名" # 配置后按 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" +sceneDbDsn: "u_iotlcm:Iotlcm2026Default@tcp(mysql:3306)/db_iotlcm?charset=utf8mb4&parseTime=true&loc=Local" sceneDbCacheTtl: 60s diff --git a/config.example/upstream-chan/config.example.yaml b/config/upstream-chan/config.yaml similarity index 93% rename from config.example/upstream-chan/config.example.yaml rename to config/upstream-chan/config.yaml index 37fa987..b55a4e8 100644 --- a/config.example/upstream-chan/config.example.yaml +++ b/config/upstream-chan/config.yaml @@ -62,7 +62,7 @@ database: stdout: true default: # 必改:连接串 - link: "mysql:u_iotlcm:${MYSQL_APP_PASSWORD}@tcp(mysql:3306)/${MYSQL_DATABASE}?charset=utf8mb4&parseTime=True&loc=Asia%2FShanghai" + link: "mysql:u_iotlcm:Iotlcm2026Default@tcp(mysql:3306)/db_iotlcm?charset=utf8mb4&parseTime=True&loc=Asia%2FShanghai" debug: false charset: "utf8mb4" dryRun: false @@ -87,7 +87,7 @@ redis: sentinelMasterName: "" address: "redis:6379" db: 0 - pass: "${REDIS_PASSWORD}" + pass: "Iotlcm2026Default" minIdle: 5 maxIdle: 30 maxActive: 5000 diff --git a/config.example/upstream-proxy/config.example.yaml b/config/upstream-proxy/config.yaml similarity index 92% rename from config.example/upstream-proxy/config.example.yaml rename to config/upstream-proxy/config.yaml index eda616d..585f7e8 100644 --- a/config.example/upstream-proxy/config.example.yaml +++ b/config/upstream-proxy/config.yaml @@ -20,7 +20,7 @@ system: # 必须与 admin-svr 的 upstream.appDiagnosisToken 一致。 # 生成:openssl rand -hex 16 appDiagnosis: - internalToken: "${DIAGNOSIS_INTERNAL_TOKEN}" + internalToken: "iotlcm_diagnosis_2026" server: name: "iotlcmupstreamproxy-grpc-svc" @@ -65,7 +65,7 @@ database: stdout: true default: # 必改:连接串 - link: "mysql:u_iotlcm:${MYSQL_APP_PASSWORD}@tcp(mysql:3306)/${MYSQL_DATABASE}?charset=utf8mb4&parseTime=True&loc=Asia%2FShanghai" + link: "mysql:u_iotlcm:Iotlcm2026Default@tcp(mysql:3306)/db_iotlcm?charset=utf8mb4&parseTime=True&loc=Asia%2FShanghai" debug: false charset: "utf8mb4" dryRun: false @@ -90,7 +90,7 @@ redis: sentinelMasterName: "" address: "redis:6379" db: 0 - pass: "${REDIS_PASSWORD}" + pass: "Iotlcm2026Default" minIdle: 5 maxIdle: 30 maxActive: 5000 diff --git a/config.example/worker-svr/config.example.yaml b/config/worker-svr/config.yaml similarity index 87% rename from config.example/worker-svr/config.example.yaml rename to config/worker-svr/config.yaml index a01af2a..169a6c2 100644 --- a/config.example/worker-svr/config.example.yaml +++ b/config/worker-svr/config.yaml @@ -42,7 +42,7 @@ database: stdout: true default: # 必改:连接串 - link: "mysql:u_iotlcm:${MYSQL_APP_PASSWORD}@tcp(mysql:3306)/${MYSQL_DATABASE}?charset=utf8mb4&parseTime=True&loc=Asia%2FShanghai" + link: "mysql:u_iotlcm:Iotlcm2026Default@tcp(mysql:3306)/db_iotlcm?charset=utf8mb4&parseTime=True&loc=Asia%2FShanghai" debug: false charset: "utf8mb4" dryRun: false @@ -67,7 +67,7 @@ redis: sentinelMasterName: "" address: "redis:6379" db: 0 - pass: "${REDIS_PASSWORD}" + pass: "Iotlcm2026Default" minIdle: 5 maxIdle: 30 maxActive: 5000 @@ -77,7 +77,7 @@ redis: # ---------- RabbitMQ ---------- rabbitmq: enabled: true - dsn: "amqp://${RABBITMQ_USER}:${RABBITMQ_PASSWORD}@rabbitmq:5672/" + dsn: "amqp://iotlcm:Iotlcm2026Default@rabbitmq:5672/" balanceRecharge: retryDelay: "1m" batchExecute: @@ -122,11 +122,11 @@ tsdb: database: "TdEngine" tdengine: type: "taosWS" - dsn: "${TDENGINE_USER}:${TDENGINE_PASSWORD}@ws(${TDENGINE_HOST}:${TDENGINE_PORT})/" + dsn: ":@ws(:)/" # dbName 只是连接池键名与兜底值,不决定实际访问哪个库 - dbName: "${TDENGINE_DAILY_DB}" - dailyDbName: "${TDENGINE_DAILY_DB}" - monthlyDbName: "${TDENGINE_MONTHLY_DB}" + dbName: "" + dailyDbName: "" + monthlyDbName: "" maxOpenConns: 100 maxIdleConns: 10 diff --git a/docker-compose.yml b/docker-compose.yml index 51ea11f..ac4a62b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -18,17 +18,16 @@ name: iotlcm services: # ---------------- 基础组件 ---------------- mysql: - image: '${REGISTRY:-your-registry}/library/mysql:8.0' + # 基础组件统走同一镜像仓库(`/library/`),版本在 .env 里固定 + image: 'crpi-qflrqrxoohllkvgc.cn-chengdu.personal.cr.aliyuncs.com/library/mysql:8.0' container_name: iotlcm-mysql restart: always ports: - - "${MYSQL_PORT:-3306}:3306" + - "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}' + MYSQL_ROOT_PASSWORD: 'Iotlcm2026Default' + MYSQL_DATABASE: 'db_iotlcm' + TZ: 'Asia/Shanghai' volumes: - ./data/mysql:/var/lib/mysql # 仅在 data/mysql 为空(首次启动)时执行,按文件名顺序 @@ -40,24 +39,24 @@ services: networks: - iotlcm-network healthcheck: - test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "-p${MYSQL_ROOT_PASSWORD}"] + test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "-piotlcm_root_2026"] interval: 10s timeout: 5s retries: 10 start_period: 40s redis: - image: '${REGISTRY:-your-registry}/library/redis:7.2' + image: 'crpi-qflrqrxoohllkvgc.cn-chengdu.personal.cr.aliyuncs.com/library/redis:7.2' container_name: iotlcm-redis restart: always ports: - - "${REDIS_PORT:-6379}:6379" + - "6379:6379" environment: - TZ: '${TZ:-Asia/Shanghai}' + TZ: 'Asia/Shanghai' command: - redis-server - --requirepass - - '${REDIS_PASSWORD:?必须在 .env 中设置}' + - 'Iotlcm2026Default' - --appendonly - "yes" volumes: @@ -65,23 +64,23 @@ services: networks: - iotlcm-network healthcheck: - test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD}", "ping"] + test: ["CMD", "redis-cli", "-a", "Iotlcm2026Default", "ping"] interval: 10s timeout: 5s retries: 5 rabbitmq: - image: '${REGISTRY:-your-registry}/library/rabbitmq:4.3.5-management' + image: 'crpi-qflrqrxoohllkvgc.cn-chengdu.personal.cr.aliyuncs.com/library/rabbitmq:4.3.5-management' container_name: iotlcm-rabbitmq hostname: rabbitmq restart: always ports: - - "${RABBITMQ_PORT:-5672}:5672" - - "${RABBITMQ_MGMT_PORT:-15672}:15672" + - "5672:5672" + - "15672:15672" environment: - RABBITMQ_DEFAULT_USER: '${RABBITMQ_USER:-iotlcm}' - RABBITMQ_DEFAULT_PASS: '${RABBITMQ_PASSWORD:?必须在 .env 中设置}' - TZ: '${TZ:-Asia/Shanghai}' + RABBITMQ_DEFAULT_USER: 'iotlcm' + RABBITMQ_DEFAULT_PASS: 'Iotlcm2026Default' + TZ: 'Asia/Shanghai' volumes: - ./data/rabbitmq:/var/lib/rabbitmq networks: @@ -94,13 +93,13 @@ services: start_period: 30s consul: - image: '${REGISTRY:-your-registry}/library/consul:1.22' + image: 'crpi-qflrqrxoohllkvgc.cn-chengdu.personal.cr.aliyuncs.com/library/consul:1.22' container_name: iotlcm-consul restart: always ports: - - "${CONSUL_PORT:-8500}:8500" + - "8500:8500" environment: - TZ: '${TZ:-Asia/Shanghai}' + TZ: 'Asia/Shanghai' CONSUL_LOCAL_CONFIG: | { "node_name": "iotlcm-node", @@ -120,13 +119,13 @@ services: # ---------------- 业务服务 ---------------- admin-svr: - image: '${REGISTRY:-your-registry}/iotlcm/iotlcm-admin-svr:${TAG:-latest}' + image: 'crpi-qflrqrxoohllkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-admin-svr:latest' container_name: iotlcm-admin-svr restart: always ports: - - "127.0.0.1:${ADMIN_SVR_PORT:-8008}:8008" + - "127.0.0.1:8008:8008" environment: - TZ: '${TZ:-Asia/Shanghai}' + TZ: 'Asia/Shanghai' volumes: - ./config/admin-svr:/app/config:ro - ./data/logs/admin-svr:/app/logs @@ -143,13 +142,13 @@ services: condition: service_healthy admin-ui: - image: '${REGISTRY:-your-registry}/iotlcm/iotlcm-admin-ui:${TAG:-latest}' + image: 'crpi-qflrqrxoohllkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-admin-ui:latest' container_name: iotlcm-admin-ui restart: always ports: - - "127.0.0.1:${ADMIN_UI_PORT:-8009}:80" + - "127.0.0.1:8009:80" environment: - TZ: '${TZ:-Asia/Shanghai}' + TZ: 'Asia/Shanghai' volumes: - ./config/admin-ui/default.conf:/etc/nginx/conf.d/default.conf:ro - ./data/logs/admin-ui:/var/log/nginx @@ -160,13 +159,13 @@ services: - admin-svr openapi: - image: '${REGISTRY:-your-registry}/iotlcm/iotlcm-openapi:${TAG:-latest}' + image: 'crpi-qflrqrxoohllkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-openapi:latest' container_name: iotlcm-openapi restart: always ports: - - "127.0.0.1:${OPENAPI_PORT:-8000}:8000" + - "127.0.0.1:8000:8000" environment: - TZ: '${TZ:-Asia/Shanghai}' + TZ: 'Asia/Shanghai' volumes: - ./config/openapi:/app/config:ro - ./data/logs/openapi:/app/logs @@ -181,14 +180,14 @@ services: condition: service_healthy upstream-chan: - image: '${REGISTRY:-your-registry}/iotlcm/iotlcm-upstream-chan:${TAG:-latest}' + image: 'crpi-qflrqrxoohllkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-upstream-chan:latest' container_name: iotlcm-upstream-chan restart: always ports: - - "${CHAN_HTTP_PORT:-8110}:8110" - - "${CHAN_GRPC_PORT:-8310}:8310" + - "8110:8110" + - "8310:8310" environment: - TZ: '${TZ:-Asia/Shanghai}' + TZ: 'Asia/Shanghai' volumes: - ./config/upstream-chan:/app/config:ro - ./data/logs/upstream-chan:/app/logs @@ -205,13 +204,13 @@ services: condition: service_started upstream-proxy: - image: '${REGISTRY:-your-registry}/iotlcm/iotlcm-upstream-proxy:${TAG:-latest}' + image: 'crpi-qflrqrxoohllkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-upstream-proxy:latest' container_name: iotlcm-upstream-proxy restart: always ports: - - "${PROXY_PORT:-8510}:8510" + - "8510:8510" environment: - TZ: '${TZ:-Asia/Shanghai}' + TZ: 'Asia/Shanghai' volumes: - ./config/upstream-proxy:/app/config:ro - ./data/logs/upstream-proxy:/app/logs @@ -229,11 +228,11 @@ services: condition: service_started worker-svr: - image: '${REGISTRY:-your-registry}/iotlcm/iotlcm-worker-svr:${TAG:-latest}' + image: 'crpi-qflrqrxoohllkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-worker-svr:latest' container_name: iotlcm-worker-svr restart: always environment: - TZ: '${TZ:-Asia/Shanghai}' + TZ: 'Asia/Shanghai' volumes: - ./config/worker-svr:/app/config:ro - ./data/logs/worker-svr:/app/logs @@ -251,13 +250,13 @@ services: condition: service_healthy app-server: - image: '${REGISTRY:-your-registry}/iotlcm/iotlcm-app-server:${TAG:-latest}' + image: 'crpi-qflrqrxoohllkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-app-server:latest' container_name: iotlcm-app-server restart: always ports: - - "127.0.0.1:${APP_SERVER_PORT:-8010}:8010" + - "127.0.0.1:8010:8010" environment: - TZ: '${TZ:-Asia/Shanghai}' + TZ: 'Asia/Shanghai' APP_UPLOAD_DIR: /app/resource/upload volumes: - ./config/app-server:/app/config:ro @@ -272,30 +271,30 @@ services: condition: service_healthy app-web: - image: '${REGISTRY:-your-registry}/iotlcm/iotlcm-app-web:${TAG:-latest}' + image: 'crpi-qflrqrxoohllkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-app-web:latest' container_name: iotlcm-app-web restart: always ports: - - "127.0.0.1:${APP_WEB_PORT:-8018}:80" + - "127.0.0.1:8018:80" environment: - TZ: '${TZ:-Asia/Shanghai}' + TZ: 'Asia/Shanghai' volumes: - ./data/logs/app-web:/var/log/nginx networks: - iotlcm-network sms: - image: '${REGISTRY:-your-registry}/iotlcm/iotlcm-sms:${TAG:-latest}' + image: 'crpi-qflrqrxoohllkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-sms:latest' container_name: iotlcm-sms hostname: iotlcm-sms restart: always environment: - TZ: '${TZ:-Asia/Shanghai}' + TZ: 'Asia/Shanghai' HTTP_ADDR: ':11190' GRPC_ADDR: ':11200' ports: - - "${SMS_HTTP_PORT:-11190}:11190" - - "${SMS_GRPC_PORT:-11200}:11200" + - "11190:11190" + - "11200:11200" volumes: - ./config/sms:/app/config:ro - ./data/logs/sms:/app/logs @@ -313,11 +312,11 @@ services: - iotlcm-network bot: - image: '${REGISTRY:-your-registry}/iotlcm/iotlcm-bot:${TAG:-latest}' + image: 'crpi-qflrqrxoohllkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-bot:latest' container_name: iotlcm-bot restart: unless-stopped environment: - TZ: '${TZ:-Asia/Shanghai}' + TZ: 'Asia/Shanghai' command: ["watch", "--config", "/app/config/config.yaml"] volumes: - ./config/bot/config.yaml:/app/config/config.yaml:ro @@ -329,11 +328,11 @@ services: - with-bot docs: - image: '${REGISTRY:-your-registry}/iotlcm/iotlcm-docs:${TAG:-latest}' + image: 'crpi-qflrqrxoohllkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-docs:latest' container_name: iotlcm-docs restart: unless-stopped ports: - - "127.0.0.1:${DOCS_PORT:-8019}:80" + - "127.0.0.1:8019:80" networks: - iotlcm-network @@ -345,13 +344,13 @@ services: # 启用后 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}' + image: 'crpi-qflrqrxoohllkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-onelink-mock:latest' container_name: iotlcm-onelink-mock restart: unless-stopped ports: - - "127.0.0.1:${MOCK_PORT:-8080}:8080" + - "127.0.0.1:8080:8080" environment: - TZ: '${TZ:-Asia/Shanghai}' + TZ: 'Asia/Shanghai' BAFFLE_ADDR: ':8080' BAFFLE_SQLITE_PATH: /app/data/onelink_mock.db volumes: @@ -372,11 +371,11 @@ services: # 若宿主机已有 nginx / 面板,可不启动本容器, # 参考 config.example/nginx/iotlcm.conf 把 location 段落到宿主机配置。 nginx: - image: '${REGISTRY:-your-registry}/library/nginx:1.30' + image: 'crpi-qflrqrxoohllkvgc.cn-chengdu.personal.cr.aliyuncs.com/library/nginx:1.30' container_name: iotlcm-nginx restart: always ports: - - "${NGINX_HTTP_PORT:-80}:80" + - "80:80" volumes: - ./config/nginx:/etc/nginx/conf.d:ro - ./data/logs/nginx:/var/log/nginx diff --git a/schema/04-users.sh b/schema/04-users.sh index e47f2ae..759ae4e 100755 --- a/schema/04-users.sh +++ b/schema/04-users.sh @@ -3,31 +3,33 @@ # 业务数据库账号与附加库 # 由 MySQL 容器 docker-entrypoint-initdb.d 在首次启动时执行。 # -# 为什么用 .sh 而不是 .sql: -# MySQL 官方镜像的 initdb 脚本无法在 SQL 里读环境变量, -# 而账号口令必须从 .env 注入,不能写死在仓库里。 +# 口令直接写在本文件(不使用环境变量)。 +# 改口令时必须同时修改以下三处,否则服务连不上库: +# 1. docker-compose.yml 的 MYSQL_APP_PASSWORD +# 2. config/*/config.yaml 里 database link 的口令 +# 3. 本文件下方的 APP_PASSWORD # ============================================================ set -euo pipefail -if [ -z "${MYSQL_APP_PASSWORD:-}" ]; then - echo "[initdb] 错误:未设置 MYSQL_APP_PASSWORD" >&2 - exit 1 -fi +# 与 docker-compose.yml 保持一致 +APP_USER='iotlcm_app' +APP_PASSWORD='Iotlcm2026Default' +ROOT_PASSWORD='Iotlcm2026Default' +DB_NAME='db_iotlcm' -mysql --protocol=socket -uroot -p"${MYSQL_ROOT_PASSWORD}" <&2 - exit 1 -fi +ADMIN_PASSWORD='Iotlcm2026Default' +ROOT_PASSWORD='Iotlcm2026Default' +DB_NAME='db_iotlcm' -PWD_MD5=$(printf '%s' "$MYSQL_ADMIN_PASSWORD" | md5sum | awk '{print $1}') +PWD_MD5=$(printf '%s' "$ADMIN_PASSWORD" | md5sum | awk '{print $1}') -# 逐个账号按其自身 salt 计算哈希(salt 每行不同) -mysql --protocol=socket -uroot -p"${MYSQL_ROOT_PASSWORD}" <" db_iotlcm' < schema/13-seed-flow-package.sql +-- ============================================================ + +SET NAMES utf8mb4; +USE `db_iotlcm`; + +-- 留空,由使用者按上述方式补齐 diff --git a/schema/README.md b/schema/README.md index 667ac62..028e599 100644 --- a/schema/README.md +++ b/schema/README.md @@ -14,22 +14,32 @@ docker compose up -d mysql ## 执行顺序 -按「结构 → 账号 → 种子数据」三阶段编号,文件名顺序即执行顺序。除 01 外全部幂等,可重复执行。 - | 序号 | 文件 | 内容 | | --- | --- | --- | -| 01 | `01-schema.sql` | 建 `db_iotlcm` 库 + 全部表结构 + 基础数据(菜单、字典、角色、租户、演示账号)。自包含:`DROP DATABASE` → `CREATE` → `USE` | +| 01 | `01-schema.sql` | 建库 + 全部表结构 + 基础数据(菜单、字典、角色、租户、演示账号)。自包含:`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 重算哈希) | +| 04 | `04-users.sh` | 建应用账号 `iotlcm_app` + 可选库 `iotdb` | +| 05 | `05-reset-passwords.sh` | 把所有种子账号口令重置为脚本内设定的口令(按各账号自身 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` 尾逗号归一化。全新库为空操作,仅用于修复既有库脏数据 | +| 12 | `12-repair-dept-ancestors.sql` | `sys_dept.ancestors` 尾逗号归一化。全新库为空操作 | +| 13 | `13-seed-flow-package.sql` | **占位文件**,流量套餐为空。需在管理端「套餐定价」中创建 | + +## 口令说明 + +`04-users.sh` 与 `05-reset-passwords.sh` 里的口令是**字面值**(不使用环境变量),必须与以下位置保持一致: + +| 口令 | 需同步的位置 | +| --- | --- | +| 应用账号 `iotlcm_app` | `docker-compose.yml` 的 `MYSQL_ROOT_PASSWORD`(root)与 `config/*/config.yaml` 里 database link 的口令 | +| 种子账号 | `docker-compose.yml` 里 admin 的初始化口令说明、`05-reset-passwords.sh` 的 `ADMIN_PASSWORD` | + +改口令时三处一起改,漏改会导致服务连不上库或登录失败。 ## 种子数据说明 @@ -50,44 +60,30 @@ docker compose up -d mysql | --- | --- | | 账号昵称 | `示例用户01` ~ `示例用户18` | | 邮箱 | `user01@example.com` ~ `user18@example.com` | -| 手机号 | 合法 11 位编造号(`1380000` + 4 位序号,保持互异) | +| 手机号 | 合法 11 位编造号(保持互异) | | 登录 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`。**所有账号登录后请立即修改口令。** +| `t_sim_flow_package_info` | 流量套餐,见 `13-seed-flow-package.sql` 说明 | +| `t_sim_card` | 卡数据,可通过挡板服务造卡或自行入库 | +| 其余 `t_*` 业务表 | 随业务操作产生数据 | ## 手动执行 -容器已启动后需要单独执行某个脚本: +容器已启动后单独执行某个脚本: ```bash docker compose exec -T mysql sh -c \ - 'mysql -uroot -p"$MYSQL_ROOT_PASSWORD" db_iotlcm' < schema/07-seed-dict.sql + 'exec mysql -uroot -p"" db_iotlcm' < schema/07-seed-dict.sql ``` -`.sh` 脚本需要环境变量,在容器内执行: +`.sh` 脚本: ```bash docker compose exec mysql bash /docker-entrypoint-initdb.d/04-users.sh From fd72d088fc04346a563aba3da3bf521c1da9fd1a Mon Sep 17 00:00:00 2001 From: MiFaZhan Date: Thu, 29 Oct 2026 13:14:09 +0800 Subject: [PATCH 06/24] =?UTF-8?q?fix:=20=E4=BF=AE=E6=AD=A3=E9=98=BF?= =?UTF-8?q?=E9=87=8C=E4=BA=91=E9=95=9C=E5=83=8F=E4=BB=93=E5=BA=93=E5=9F=9F?= =?UTF-8?q?=E5=90=8D=EF=BC=88crpi-...ohlkkvgc=EF=BC=8C=E5=8E=9F=E4=B8=BA?= =?UTF-8?q?=20ohlLkvgc=20=E6=8B=BC=E5=86=99=E9=94=99=E8=AF=AF=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 17 处镜像地址全部更正。已验证:域名解析正常(47.108.26.223), /v2/ 返回 401(可访问,需登录)。 --- docker-compose.yml | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index ac4a62b..1c7f860 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -19,7 +19,7 @@ services: # ---------------- 基础组件 ---------------- mysql: # 基础组件统走同一镜像仓库(`/library/`),版本在 .env 里固定 - image: 'crpi-qflrqrxoohllkvgc.cn-chengdu.personal.cr.aliyuncs.com/library/mysql:8.0' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/library/mysql:8.0' container_name: iotlcm-mysql restart: always ports: @@ -46,7 +46,7 @@ services: start_period: 40s redis: - image: 'crpi-qflrqrxoohllkvgc.cn-chengdu.personal.cr.aliyuncs.com/library/redis:7.2' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/library/redis:7.2' container_name: iotlcm-redis restart: always ports: @@ -70,7 +70,7 @@ services: retries: 5 rabbitmq: - image: 'crpi-qflrqrxoohllkvgc.cn-chengdu.personal.cr.aliyuncs.com/library/rabbitmq:4.3.5-management' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/library/rabbitmq:4.3.5-management' container_name: iotlcm-rabbitmq hostname: rabbitmq restart: always @@ -93,7 +93,7 @@ services: start_period: 30s consul: - image: 'crpi-qflrqrxoohllkvgc.cn-chengdu.personal.cr.aliyuncs.com/library/consul:1.22' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/library/consul:1.22' container_name: iotlcm-consul restart: always ports: @@ -119,7 +119,7 @@ services: # ---------------- 业务服务 ---------------- admin-svr: - image: 'crpi-qflrqrxoohllkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-admin-svr:latest' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-admin-svr:latest' container_name: iotlcm-admin-svr restart: always ports: @@ -142,7 +142,7 @@ services: condition: service_healthy admin-ui: - image: 'crpi-qflrqrxoohllkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-admin-ui:latest' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-admin-ui:latest' container_name: iotlcm-admin-ui restart: always ports: @@ -159,7 +159,7 @@ services: - admin-svr openapi: - image: 'crpi-qflrqrxoohllkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-openapi:latest' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-openapi:latest' container_name: iotlcm-openapi restart: always ports: @@ -180,7 +180,7 @@ services: condition: service_healthy upstream-chan: - image: 'crpi-qflrqrxoohllkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-upstream-chan:latest' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-upstream-chan:latest' container_name: iotlcm-upstream-chan restart: always ports: @@ -204,7 +204,7 @@ services: condition: service_started upstream-proxy: - image: 'crpi-qflrqrxoohllkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-upstream-proxy:latest' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-upstream-proxy:latest' container_name: iotlcm-upstream-proxy restart: always ports: @@ -228,7 +228,7 @@ services: condition: service_started worker-svr: - image: 'crpi-qflrqrxoohllkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-worker-svr:latest' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-worker-svr:latest' container_name: iotlcm-worker-svr restart: always environment: @@ -250,7 +250,7 @@ services: condition: service_healthy app-server: - image: 'crpi-qflrqrxoohllkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-app-server:latest' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-app-server:latest' container_name: iotlcm-app-server restart: always ports: @@ -271,7 +271,7 @@ services: condition: service_healthy app-web: - image: 'crpi-qflrqrxoohllkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-app-web:latest' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-app-web:latest' container_name: iotlcm-app-web restart: always ports: @@ -284,7 +284,7 @@ services: - iotlcm-network sms: - image: 'crpi-qflrqrxoohllkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-sms:latest' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-sms:latest' container_name: iotlcm-sms hostname: iotlcm-sms restart: always @@ -312,7 +312,7 @@ services: - iotlcm-network bot: - image: 'crpi-qflrqrxoohllkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-bot:latest' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-bot:latest' container_name: iotlcm-bot restart: unless-stopped environment: @@ -328,7 +328,7 @@ services: - with-bot docs: - image: 'crpi-qflrqrxoohllkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-docs:latest' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-docs:latest' container_name: iotlcm-docs restart: unless-stopped ports: @@ -344,7 +344,7 @@ services: # 启用后 upstream-chan 的 sim_yd_mock_v5.url 指向 http://onelink-mock:8080/v5/ # (config.example/upstream-chan 已预置该地址) onelink-mock: - image: 'crpi-qflrqrxoohllkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-onelink-mock:latest' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-onelink-mock:latest' container_name: iotlcm-onelink-mock restart: unless-stopped ports: @@ -371,7 +371,7 @@ services: # 若宿主机已有 nginx / 面板,可不启动本容器, # 参考 config.example/nginx/iotlcm.conf 把 location 段落到宿主机配置。 nginx: - image: 'crpi-qflrqrxoohllkvgc.cn-chengdu.personal.cr.aliyuncs.com/library/nginx:1.30' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/library/nginx:1.30' container_name: iotlcm-nginx restart: always ports: From 4d43238c63a0d4f3f7ef6d69bb4c0daf00343102 Mon Sep 17 00:00:00 2001 From: MiFaZhan Date: Thu, 29 Oct 2026 14:44:56 +0800 Subject: [PATCH 07/24] =?UTF-8?q?update:=20=E5=9F=BA=E7=A1=80=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E9=95=9C=E5=83=8F=E6=94=B9=E7=94=A8=20iotlcm=20?= =?UTF-8?q?=E5=91=BD=E5=90=8D=E7=A9=BA=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 阿里云企业版 ACR 的命名空间须在控制台预先创建,library 不存在。 统一放到已存在的 iotlcm 命名空间,与业务镜像同处一处: /iotlcm/mysql:8.0 /iotlcm/redis:7.2 /iotlcm/rabbitmq:4.3.5-management /iotlcm/consul:1.22 /iotlcm/nginx:1.30 已实测推送成功。 --- docker-compose.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 1c7f860..214ccc0 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -18,8 +18,8 @@ name: iotlcm services: # ---------------- 基础组件 ---------------- mysql: - # 基础组件统走同一镜像仓库(`/library/`),版本在 .env 里固定 - image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/library/mysql:8.0' + # 基础组件统走同一镜像仓库(`/iotlcm/`),版本在此固定 + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/mysql:8.0' container_name: iotlcm-mysql restart: always ports: @@ -46,7 +46,7 @@ services: start_period: 40s redis: - image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/library/redis:7.2' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/redis:7.2' container_name: iotlcm-redis restart: always ports: @@ -70,7 +70,7 @@ services: retries: 5 rabbitmq: - image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/library/rabbitmq:4.3.5-management' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/rabbitmq:4.3.5-management' container_name: iotlcm-rabbitmq hostname: rabbitmq restart: always @@ -93,7 +93,7 @@ services: start_period: 30s consul: - image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/library/consul:1.22' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/consul:1.22' container_name: iotlcm-consul restart: always ports: @@ -371,7 +371,7 @@ services: # 若宿主机已有 nginx / 面板,可不启动本容器, # 参考 config.example/nginx/iotlcm.conf 把 location 段落到宿主机配置。 nginx: - image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/library/nginx:1.30' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/nginx:1.30' container_name: iotlcm-nginx restart: always ports: From 616451b29da9ec7da61098bdd76807e94f5f1fde Mon Sep 17 00:00:00 2001 From: MiFaZhan Date: Thu, 29 Oct 2026 16:32:27 +0800 Subject: [PATCH 08/24] =?UTF-8?q?update:=20=E6=95=B0=E6=8D=AE=E5=BA=93?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E4=B8=BA=E5=8D=95=E6=96=87=E4=BB=B6?= =?UTF-8?q?=EF=BC=8C=E6=8D=A2=E7=94=A8=E6=BC=94=E7=A4=BA=E7=8E=AF=E5=A2=83?= =?UTF-8?q?=E7=A7=8D=E5=AD=90=E5=BA=93=EF=BC=88v1.0.4=20=E5=AF=B9=E9=BD=90?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原 13 个分散脚本整合为 schema/init.sql 一个文件,来源换成演示环境 正在使用的种子库(结构已与生产核对,89 表基线)。 内容变化(相比旧的 12 文件版本): - 新增 v1.0.4 前置段:t_export_task(导出中心)、sys_notice_user、 card_channel_assoc.channel_id 扩宽为 varchar(64)、9 条菜单权限 - 修正 3 个真实缺陷:cron 表达式 L 改为 28-31(调度器可解析)、 通道模板 created_dept 103 改为 1(悬空机构致列表恒为空)、 菜单 444 的 path 修正 - 数据库共 91 表(旧版 89,v1.0.4 新增 2 张) 脱敏: - 18 个演示账号保留(出库/划拨依赖账号与部门树关联), 昵称/邮箱/手机号/登录IP/头像改为占位或编造值 - 归属部门、租户的联系电话与邮箱一并处理 - 公司名、组织名 → 示例企业 - 内网/生产 IP、内部域名 → 删除或改为服务名 - Mock 通道地址指向 onelink-mock 服务 - 通道模板真实上游密钥置空 - sys_social(微信绑定)不随分发 口令处理:改为纯 SQL,不再用 .sh + 环境变量。 业务账号:CREATE USER 语句内字面口令 种子账号:UPDATE sys_user SET password = MD5(CONCAT(MD5('<口令>'), MD5(salt))) 与 docker-compose.yml、config/*/config.yaml 保持同一口令 已验证:本地 MySQL 8.0 容器按 docker-entrypoint-initdb.d 实际导入, 无报错;表 91、菜单 456、账号 18、字典 86/436、通道模板 3、Mock 通道 1、 导出中心与通知表各 1、定时任务 20;18 条口令哈希自洽; 应用账号 u_iotlcm 可连库查询。 --- README.md | 6 +- schema/02-schema-fix-preview1.sql | 116 --- schema/03-schema-align-prod.sql | 42 - schema/04-users.sh | 35 - schema/05-reset-passwords.sh | 59 -- schema/06-seed-channel-templates.sql | 45 - schema/07-seed-dict.sql | 677 -------------- schema/08-seed-mock-channel.sql | 52 -- schema/09-seed-role-chain.sql | 77 -- schema/10-seed-jobs.sql | 73 -- schema/11-seed-menu-align-prod.sql | 72 -- schema/12-repair-dept-ancestors.sql | 70 -- schema/13-seed-flow-package.sql | 35 - schema/README.md | 131 ++- schema/{01-schema.sql => init.sql} | 1271 +++++++++++++++++++++++++- 15 files changed, 1321 insertions(+), 1440 deletions(-) delete mode 100644 schema/02-schema-fix-preview1.sql delete mode 100644 schema/03-schema-align-prod.sql delete mode 100755 schema/04-users.sh delete mode 100755 schema/05-reset-passwords.sh delete mode 100644 schema/06-seed-channel-templates.sql delete mode 100644 schema/07-seed-dict.sql delete mode 100644 schema/08-seed-mock-channel.sql delete mode 100644 schema/09-seed-role-chain.sql delete mode 100644 schema/10-seed-jobs.sql delete mode 100644 schema/11-seed-menu-align-prod.sql delete mode 100644 schema/12-repair-dept-ancestors.sql delete mode 100644 schema/13-seed-flow-package.sql rename schema/{01-schema.sql => init.sql} (81%) diff --git a/README.md b/README.md index 87b5eb3..e6e85a0 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,7 @@ iotlcm-deploy/ │ ├── upstream-chan/config.yaml │ ├── upstream-proxy/config.yaml │ └── worker-svr/config.yaml -├── schema/ # 数据库初始化脚本(首次启动自动执行) +├── schema/init.sql # 数据库初始化(单文件,首次启动自动执行) └── data/ # 运行数据(首次启动自动创建,不入版本库) ``` @@ -71,10 +71,10 @@ iotlcm-deploy/ | 项 | 位置 | | --- | --- | -| 数据库口令(root 与应用账号) | `docker-compose.yml` + `config/*/config.yaml` + `schema/04-users.sh` | +| 数据库口令(root 与应用账号) | `docker-compose.yml` + `config/*/config.yaml` + `schema/init.sql` | | Redis 口令 | `docker-compose.yml` + `config/*/config.yaml` | | RabbitMQ 口令 | `docker-compose.yml` + `config/*/config.yaml` | -| admin 初始口令 | `docker-compose.yml` + `schema/05-reset-passwords.sh` | +| admin 初始口令 | `docker-compose.yml` + `schema/init.sql` | | JWT 签名密钥 | `config/admin-svr`、`config/openapi`、`config/app-server` 三处 | | 对外域名 | `config/nginx/iotlcm.conf` | diff --git a/schema/02-schema-fix-preview1.sql b/schema/02-schema-fix-preview1.sql deleted file mode 100644 index 1d4b3c0..0000000 --- a/schema/02-schema-fix-preview1.sql +++ /dev/null @@ -1,116 +0,0 @@ --- ============================================ --- 演示环境种子库结构补齐(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'; diff --git a/schema/03-schema-align-prod.sql b/schema/03-schema-align-prod.sql deleted file mode 100644 index 2b5e1c1..0000000 --- a/schema/03-schema-align-prod.sql +++ /dev/null @@ -1,42 +0,0 @@ --- ============================================ --- 演示环境种子库 —— 按生产基准补齐(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 '批次号'; diff --git a/schema/04-users.sh b/schema/04-users.sh deleted file mode 100755 index 759ae4e..0000000 --- a/schema/04-users.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash -# ============================================================ -# 业务数据库账号与附加库 -# 由 MySQL 容器 docker-entrypoint-initdb.d 在首次启动时执行。 -# -# 口令直接写在本文件(不使用环境变量)。 -# 改口令时必须同时修改以下三处,否则服务连不上库: -# 1. docker-compose.yml 的 MYSQL_APP_PASSWORD -# 2. config/*/config.yaml 里 database link 的口令 -# 3. 本文件下方的 APP_PASSWORD -# ============================================================ -set -euo pipefail - -# 与 docker-compose.yml 保持一致 -APP_USER='iotlcm_app' -APP_PASSWORD='Iotlcm2026Default' -ROOT_PASSWORD='Iotlcm2026Default' -DB_NAME='db_iotlcm' - -mysql --protocol=socket -uroot -p"${ROOT_PASSWORD}" <','>',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); diff --git a/schema/08-seed-mock-channel.sql b/schema/08-seed-mock-channel.sql deleted file mode 100644 index db2280a..0000000 --- a/schema/08-seed-mock-channel.sql +++ /dev/null @@ -1,52 +0,0 @@ --- ============================================ --- 演示环境种子数据: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`); diff --git a/schema/09-seed-role-chain.sql b/schema/09-seed-role-chain.sql deleted file mode 100644 index 1b2997f..0000000 --- a/schema/09-seed-role-chain.sql +++ /dev/null @@ -1,77 +0,0 @@ --- ============================================ --- 演示环境:模板参数与生产旧版本的下发标记(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`; diff --git a/schema/10-seed-jobs.sql b/schema/10-seed-jobs.sql deleted file mode 100644 index 7356dca..0000000 --- a/schema/10-seed-jobs.sql +++ /dev/null @@ -1,73 +0,0 @@ --- ============================================ --- 演示环境种子数据:定时任务(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`; diff --git a/schema/11-seed-menu-align-prod.sql b/schema/11-seed-menu-align-prod.sql deleted file mode 100644 index a9253a8..0000000 --- a/schema/11-seed-menu-align-prod.sql +++ /dev/null @@ -1,72 +0,0 @@ --- ============================================ --- 演示环境种子数据: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; diff --git a/schema/12-repair-dept-ancestors.sql b/schema/12-repair-dept-ancestors.sql deleted file mode 100644 index 826d4f7..0000000 --- a/schema/12-repair-dept-ancestors.sql +++ /dev/null @@ -1,70 +0,0 @@ --- ============================================ --- 演示环境数据修复: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`; diff --git a/schema/13-seed-flow-package.sql b/schema/13-seed-flow-package.sql deleted file mode 100644 index 2db7e2a..0000000 --- a/schema/13-seed-flow-package.sql +++ /dev/null @@ -1,35 +0,0 @@ --- ============================================================ --- 流量套餐种子数据(占位文件) --- --- 本文件目前为空,属预期状态。 --- --- 原因:套餐(t_sim_flow_package_info)与具体运营商、渠道、 --- 资费政策强相关,不适合随代码分发固定数据。 --- --- 影响:表为空时,业务受理中的「办理套餐 / 续费 / 变更套餐」 --- 无套餐可选,其余功能(查卡、状态同步、通道管理)不受影响。 --- --- 补齐方式(二选一): --- --- 方式一:登录管理端 →「套餐定价」创建套餐(推荐) --- 创建后即可在业务受理中选择。 --- --- 方式二:按下列结构自行插入 SQL。 --- 字段含义以 `SHOW CREATE TABLE t_sim_flow_package_info` --- 与厂商 API 文档为准。 --- --- 示例(字段不完整,仅示意,按实际情况补全): --- INSERT INTO `t_sim_flow_package_info` --- (`package_name`, `package_type`, `flow_size`, `price`, `status`, ...) --- VALUES --- ('示例套餐-1GB/月', 1, 1024, 10.00, 0, ...); --- --- 执行方式: --- docker compose exec -T mysql sh -c \ --- 'exec mysql -uroot -p"" db_iotlcm' < schema/13-seed-flow-package.sql --- ============================================================ - -SET NAMES utf8mb4; -USE `db_iotlcm`; - --- 留空,由使用者按上述方式补齐 diff --git a/schema/README.md b/schema/README.md index 028e599..5c8a447 100644 --- a/schema/README.md +++ b/schema/README.md @@ -1,8 +1,58 @@ -# 数据库初始化脚本 +# 数据库初始化 -MySQL 容器**首次以空数据卷启动**时,`docker-entrypoint-initdb.d` 会按**文件名顺序**自动执行本目录下的脚本。 +`init.sql` 是**单文件**初始化脚本,MySQL 容器首次以空数据卷启动时由 `docker-entrypoint-initdb.d` 自动执行。 -改了这些文件必须清空数据卷才会重跑: +## 内容组成 + +按文件内顺序执行,整体幂等: + +| 段 | 内容 | +| --- | --- | +| 表结构与基础数据 | 建 `db_iotlcm` 库 + 全部表 + 菜单/字典/角色/租户/部门/演示账号 | +| 结构补齐 | `card_channel_assoc` 表 + 27 个列(用存储过程按 `information_schema` 判断) | +| 结构对齐生产 | `t_sms_template_config` 表、`batch_no` 默认值 | +| 通道模板 | 23 条(上游密钥已置空) | +| 数据字典 | 86 类 / 435 条 | +| Mock 通道 | `channel_yd_mock`。**卡全部挂在该通道上**,缺则卡片管理的通道列、筛选、开停复机均不可用 | +| 角色链 | 代理下发模板参数与角色下发标记 | +| 定时任务 | 19 条,**默认全部停用**(避免自动全量同步打满机器) | +| 菜单增量 | 达量断网按钮权限、全量同步页 | +| v1.0.4 前置 | 导出中心表 `t_export_task`、通知已读表 `sys_notice_user`、`card_channel_assoc.channel_id` 扩宽、菜单权限 | +| 数据修复 | `sys_dept.ancestors` 尾逗号归一化(全新库为空操作) | +| 业务账号与口令 | 建 `u_iotlcm` 账号、可选库 `iotdb`、种子账号口令统一重置 | + +## 来源 + +内容取自**演示环境正在使用的种子库**,结构已与生产核对(89 表 / 1703 列)。与源版本的差异仅为脱敏: + +- 演示账号昵称、邮箱、手机号、登录 IP、头像 → 占位或编造值 +- 公司名、组织名 → 「示例企业」等通用名 +- 内网/生产 IP、内部域名 → 删除或改为服务名 +- 通道模板中真实上游密钥 → 置空 +- 数据库账号与种子账号口令 → 统一为部署口令(字面值,见下) + +## 改口令 + +口令是**字面值**,不使用环境变量。修改时必须同步以下三处: + +| 位置 | 内容 | +| --- | --- | +| `docker-compose.yml` | `MYSQL_ROOT_PASSWORD` | +| `config/*/config.yaml` | 各服务 `database link` 的口令 | +| `schema/init.sql` 末段 | `u_iotlcm` 账号口令、种子账号重置口令 | + +```bash +OLD='原口令'; NEW='新口令' +grep -rl "$OLD" docker-compose.yml config/ schema/ | xargs sed -i "s/$OLD/$NEW/g" +``` + +::: warning 口令不能含 @ : / 等字符 +连接串格式为 `mysql:用户:口令` 再接 `tcp(主机:端口)/库`,口令里的 `@`、`:`、`/` 会被当作分隔符,导致连接失败。用字母数字组合。 +::: + +## 重新初始化 + +`init.sql` 只在 `data/mysql` 为空时执行。改完必须清空数据卷才会重跑: ```bash docker compose stop mysql @@ -10,81 +60,14 @@ sudo rm -rf ./data/mysql docker compose up -d mysql ``` -> ⚠️ 清空 `./data/mysql` 会**删除全部数据**,生产环境不要执行。 +> ⚠️ 会删除全部数据,生产环境禁止执行。 -## 执行顺序 +## 空表说明 -| 序号 | 文件 | 内容 | -| --- | --- | --- | -| 01 | `01-schema.sql` | 建库 + 全部表结构 + 基础数据(菜单、字典、角色、租户、演示账号)。自包含:`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` | 建应用账号 `iotlcm_app` + 可选库 `iotdb` | -| 05 | `05-reset-passwords.sh` | 把所有种子账号口令重置为脚本内设定的口令(按各账号自身 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` 尾逗号归一化。全新库为空操作 | -| 13 | `13-seed-flow-package.sql` | **占位文件**,流量套餐为空。需在管理端「套餐定价」中创建 | - -## 口令说明 - -`04-users.sh` 与 `05-reset-passwords.sh` 里的口令是**字面值**(不使用环境变量),必须与以下位置保持一致: - -| 口令 | 需同步的位置 | -| --- | --- | -| 应用账号 `iotlcm_app` | `docker-compose.yml` 的 `MYSQL_ROOT_PASSWORD`(root)与 `config/*/config.yaml` 里 database link 的口令 | -| 种子账号 | `docker-compose.yml` 里 admin 的初始化口令说明、`05-reset-passwords.sh` 的 `ADMIN_PASSWORD` | - -改口令时三处一起改,漏改会导致服务连不上库或登录失败。 - -## 种子数据说明 - -### 保留的内容(业务必需) - -- **菜单** `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 位编造号(保持互异) | -| 登录 IP | 清空 | -| 头像地址 | 清空 | -| 公司名 / 组织名 | `示例企业` / `示例代理` | -| 通道密钥 | 置空 | - -### 空表(正常) +以下表为空属预期: | 表 | 说明 | | --- | --- | -| `t_sim_flow_package_info` | 流量套餐,见 `13-seed-flow-package.sql` 说明 | +| `t_sim_flow_package_info` | 流量套餐。为空时无法办理套餐/续费/改套餐,需在管理端「套餐定价」中创建 | | `t_sim_card` | 卡数据,可通过挡板服务造卡或自行入库 | | 其余 `t_*` 业务表 | 随业务操作产生数据 | - -## 手动执行 - -容器已启动后单独执行某个脚本: - -```bash -docker compose exec -T mysql sh -c \ - 'exec mysql -uroot -p"" db_iotlcm' < schema/07-seed-dict.sql -``` - -`.sh` 脚本: - -```bash -docker compose exec mysql bash /docker-entrypoint-initdb.d/04-users.sh -``` diff --git a/schema/01-schema.sql b/schema/init.sql similarity index 81% rename from schema/01-schema.sql rename to schema/init.sql index f4d0bf7..2e7f164 100644 --- a/schema/01-schema.sql +++ b/schema/init.sql @@ -1,3 +1,21 @@ +-- ============================================================ +-- IotLCM 数据库初始化(单文件) +-- +-- 由 MySQL 容器 docker-entrypoint-initdb.d 在首次以空数据卷启动时执行。 +-- 内容取自演示环境正在使用的种子库,结构已与生产核对(89 表 / 1703 列)。 +-- 执行顺序即文件内顺序,整体幂等,可重复执行。 +-- +-- 改本文件后须清空数据卷才会重跑: +-- docker compose stop mysql && sudo rm -rf ./data/mysql && docker compose up -d mysql +-- ============================================================ + +SET NAMES utf8mb4; + + +-- ============================================================ +-- 表结构与基础数据 +-- ============================================================ + -- ============================================ -- db_iotlcm 数据库初始化脚本(清理版) -- 来源: db_iotlcm_init.sql (mysqldump 导版本) @@ -3603,8 +3621,8 @@ INSERT INTO `sys_role_menu` (`tenant_id`, `role_id`, `menu_id`, `data_scope`) VA ('000000',4,387,'0'); INSERT INTO `sys_user` (`user_id`, `tenant_id`, `dept_id`, `user_name`, `nick_name`, `user_type`, `email`, `phonenumber`, `sex`, `avatar`, `salt`, `password`, `status`, `login_ip`, `login_date`, `mfa_enabled`, `created_dept`, `created_by`, `created_at`, `updated_by`, `updated_at`, `deleted_by`, `deleted_at`, `remark`) VALUES -(1,'000000',1,'admin','示例用户01','sys_user','user01@example.com','13800000001','0','','123456','5f1d7a84db00d2fce00b31a7fc73224f','0','','2026-08-10 09:30:44',0,103,1,'2025-02-13 11:56:36',1,'2026-08-10 09:30:44',NULL,NULL,''), -(2,'100006',2,'user02','示例用户02','sys_user','user02@example.com','13800000002','2','','5nyxW','68c6e105523f29f1a97607f6739cd245','0','',NULL,NULL,0,0,'2025-03-16 14:36:52',0,'2025-03-16 14:36:52',NULL,NULL,''), +(1,'000000',1,'admin','示例用户01','sys_user','user01@example.com','13800000001','0','','123456','5f1d7a84db00d2fce00b31a7fc73224f','0','','2026-08-10 09:30:44',0,103,1,'2025-02-13 11:56:36',1,'2026-08-10 09:30:44',NULL,NULL,'管理员'), +(2,'100006',2,'user02','示例用户02','sys_user','user02@example.com','13800000002','2','','5nyxW','68c6e105523f29f1a97607f6739cd245','0','',NULL,NULL,0,0,'2025-03-16 14:36:52',0,'2025-03-16 14:36:52',NULL,NULL,NULL), (3,'000000',2,'2admin','示例用户03','sys_user','user03@example.com','13800000003','2','','5nyxW','68c6e105523f29f1a97607f6739cd245','0','','2026-08-10 09:28:19',NULL,103,1,'2026-05-30 22:39:09',1,'2026-08-10 09:28:19',NULL,NULL,''), (4,'000000',2,'2user','示例用户04','','user04@example.com','13800000004','2','','VZ0wN','e6ad50a55c5cca432e58445500433943','0','','2026-07-21 09:44:52',NULL,103,1,'2026-06-10 17:04:02',1,'2026-07-21 09:44:52',NULL,NULL,''), (5,'000000',4,'3admin','示例用户05','sys_user','user05@example.com','13800000005','2','','mLwlN','70824cefa9bc3da395ea16a48118e477','0','','2026-08-05 10:44:43',NULL,117,12,'2026-06-22 17:32:57',1,'2026-08-05 10:44:43',NULL,NULL,''), @@ -3645,7 +3663,7 @@ INSERT INTO `sys_role_dept` (`tenant_id`, `role_id`, `dept_id`) VALUES ('000000',2,1); INSERT INTO `sys_dept` (`dept_id`, `tenant_id`, `parent_id`, `ancestors`, `dept_key`, `dept_name`, `dept_type`, `dept_category`, `order_num`, `leader`, `phone`, `email`, `status`, `credit_code`, `area_code`, `address`, `dept_role`, `created_dept`, `created_by`, `created_at`, `updated_by`, `updated_at`, `deleted_by`, `deleted_at`) VALUES -(1,'000000',0,'0,','CUS-202601-0001','示例企业',1,'',0,36,'15888888222','xxx@qq.com','0','098765432109876543','370100000000','历下区',66,100,1,'2025-02-13 11:56:36',111,'2026-07-29 16:06:31',NULL,NULL), +(1,'000000',0,'0,','CUS-202601-0001','示例企业',1,'',0,36,'13800000101','contact@example.com','0','098765432109876543','370100000000','历下区',66,100,1,'2025-02-13 11:56:36',111,'2026-07-29 16:06:31',NULL,NULL), (2,'000000',1,'0,1,','CUS-202601-0002','示例企业',1,'',1,12,'','','0','123456789012345678','','高新区',67,NULL,0,'2025-03-16 14:36:52',12,'2026-07-29 16:14:12',NULL,NULL), (3,'000000',1,'0,1,','','终端用户部门',1,'',20,0,'','','0','','','',0,100,1,'2026-07-08 15:30:23',1,'2026-07-08 15:34:57',NULL,NULL), (4,'000000',2,'0,1,2,','','示例代理1',1,'',1,27,'','','0','','','',0,100,1,'2026-06-22 03:07:10',1,'2026-07-21 09:38:12',NULL,NULL), @@ -3710,7 +3728,7 @@ INSERT INTO `sys_job` (`job_id`, `job_name`, `job_params`, `job_group`, `invoke_ (20,'财务 - 消费账户月账单','2026-07','0','settle_consume_account_month_bill','0 0 4 2 * ?',1,0,'0','',100,1,'2026-07-28 16:20:25',1,'2026-07-30 16:09:02',NULL,NULL), (21,'财务 - 分润出账','2026-06|2025-07','0','settle_commission','0 0 4 * * ?',1,0,'0','',100,1,'2026-07-28 16:48:19',1,'2026-07-31 16:14:06',NULL,NULL), (22,'流量池-卡信息数据同步流量池 ','117','0','sync_flow_pool_card','0 0 4 * * ?',1,0,'0','',100,1,'2026-07-31 16:16:32',1,'2026-07-31 16:21:56',NULL,NULL), -(23,'预警-到期预警全量预加载','','0','PreloadSimExpireWarning','0 30 23 L * ?',1,1,'0','每月底扫描下下个月到期卡,写入 Redis 候选池',100,1,'2026-07-31 17:53:44',1,'2026-07-31 17:56:34',NULL,NULL), +(23,'预警-到期预警全量预加载','','0','PreloadSimExpireWarning','0 30 23 28-31 * ?',1,1,'0','每月底扫描下下个月到期卡,写入 Redis 候选池',100,1,'2026-07-31 17:53:44',1,'2026-07-31 17:56:34',NULL,NULL), (24,'预警-定时到期预警扫描','','0','ScanSimExpireCandidateWarning','0 0 9 * * ?',1,1,'0','',100,1,'2026-07-31 17:54:13',1,'2026-08-03 08:38:06',NULL,NULL); INSERT INTO `sys_oss_config` (`oss_config_id`, `tenant_id`, `config_key`, `access_key`, `secret_key`, `bucket_name`, `prefix`, `endpoint`, `domain`, `is_https`, `region`, `access_policy`, `status`, `ext1`, `created_dept`, `created_by`, `created_at`, `updated_by`, `updated_at`, `remark`) VALUES @@ -3732,12 +3750,10 @@ INSERT INTO `sys_notice` (`notice_id`, `tenant_id`, `notice_title`, `notice_type (2,'000000','维护通知:2018-07-01 系统凌晨维护','1',_binary '维护内容','0',1,NULL,NULL,103,1,'2025-02-13 11:56:36',NULL,NULL,'管理员'); INSERT INTO `sys_tenant` (`id`, `tenant_id`, `contact_user_name`, `contact_phone`, `company_name`, `license_number`, `address`, `intro`, `domain`, `remark`, `package_id`, `admin_role_id`, `admin_dept_id`, `admin_user_id`, `expire_time`, `account_count`, `status`, `created_dept`, `created_by`, `created_at`, `updated_by`, `updated_at`, `deleted_by`, `deleted_at`) VALUES -(1,'000000','管理组','15888888888','示例企业有限公司','','','多租户通用后台管理管理系统','','备注',0,1,103,1,'2027-05-28 00:00:00',-1,'0',103,1,'2025-02-13 11:56:36',1,'2026-05-28 15:22:57',NULL,NULL), -(6,'100006','李先生','18600000000','示例企业','3332233','地址','企业介绍','example.com','备注',9,117,10,1,'2026-03-16 00:00:00',-1,'0',103,1,'2025-03-16 14:36:52',1,'2026-05-28 15:23:12',1,'2026-05-28 15:23:12'); +(1,'000000','管理组','13800000102','示例企业有限公司','','','多租户通用后台管理管理系统','','备注',0,1,103,1,'2027-05-28 00:00:00',-1,'0',103,1,'2025-02-13 11:56:36',1,'2026-05-28 15:22:57',NULL,NULL), +(6,'100006','李先生','13800000103','示例企业','3332233','地址','企业介绍','example.com','备注',9,117,10,1,'2026-03-16 00:00:00',-1,'0',103,1,'2025-03-16 14:36:52',1,'2026-05-28 15:23:12',1,'2026-05-28 15:23:12'); -INSERT INTO `sys_social` (`id`, `user_id`, `tenant_id`, `auth_id`, `source`, `open_id`, `user_name`, `nick_name`, `email`, `avatar`, `access_token`, `expire_in`, `refresh_token`, `access_code`, `union_id`, `scope`, `token_type`, `id_token`, `mac_algorithm`, `mac_key`, `code`, `oauth_token`, `oauth_token_secret`, `created_dept`, `created_by`, `created_at`, `updated_by`, `updated_at`, `deleted_by`, `deleted_at`) VALUES -(1,60,'000000','wechat_mp:oWvGO7SkEur8Tb9TTYyl2aKMWdPg','wechat_mp','oWvGO7SkEur8Tb9TTYyl2aKMWdPg','user06','示例用户06','','','oWvGO7SkEur8Tb9TTYyl2aKMWdPg',NULL,NULL,NULL,'',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,117,60,'2026-07-17 16:59:11',60,'2026-07-22 10:33:31',NULL,NULL), -(2,87,'000000','wechat_mp:oWvGO7SkEur8Tb9TTYyl2aKMWdPg','wechat_mp','oWvGO7SkEur8Tb9TTYyl2aKMWdPg','18816314697','appuser006','','/static/images/default-avatar.png','oWvGO7SkEur8Tb9TTYyl2aKMWdPg',NULL,NULL,NULL,'',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,147,87,'2026-07-31 18:38:39',87,'2026-07-31 18:38:55',NULL,NULL); +-- 表 sys_social 无种子数据 INSERT INTO `sys_tenant_package` (`package_id`, `package_name`, `menu_ids`, `remark`, `menu_check_strictly`, `status`, `created_dept`, `created_by`, `created_at`, `updated_by`, `updated_at`, `deleted_by`, `deleted_at`) VALUES (1,'test','100,1001,1002,1003,1004,1005,1006,1007','test',1,'0',0,0,'2025-03-16 11:56:06',1,'2026-06-01 14:55:50',0,NULL); @@ -4152,4 +4168,1239 @@ INSERT INTO `t_division_code` (`region_id`, `region_code`, `region_name`, `regio (377,'820000000000','澳门特别行政区',1,'000000000000',''); -SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file +SET FOREIGN_KEY_CHECKS = 1; + + +-- ============================================================ +-- 结构补齐:card_channel_assoc 表与 27 个列 +-- ============================================================ + +-- ---------- 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'; + + +-- ============================================================ +-- 结构对齐生产:t_sms_template_config 表、batch_no 默认值 +-- ============================================================ + +-- ---------- 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 '批次号'; + + +-- ============================================================ +-- 通道模板种子(真实上游密钥已置空) +-- ============================================================ + +-- 重置为基线:只保留 移动 / 电信 / 移动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',1,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',1,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',1,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`; + + +-- ============================================================ +-- 数据字典种子(86 类 / 435 条) +-- ============================================================ + +-- 清空后全量导入(字典为纯参照数据,无业务含义,可安全替换) +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); + + +-- ============================================================ +-- Mock 通道(演示卡全部挂在此通道,缺则卡片管理异常) +-- ============================================================ + +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`); + + +-- ============================================================ +-- 代理下发模板参数与角色下发标记 +-- ============================================================ + +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`; + + +-- ============================================================ +-- 定时任务(默认全部停用,避免自动全量同步打满机器) +-- ============================================================ + +-- 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 28-31 * ?', 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`; + + +-- ============================================================ +-- 菜单增量(达量断网按钮权限、全量同步页) +-- ============================================================ + +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,'docs','','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; + + +-- ============================================================ +-- v1.0.4 前置:导出中心表、通知已读表、channel_id 扩宽、菜单权限 +-- ============================================================ + +-- ------------------------------------------------------------ +-- 1) 导出任务表 +-- ------------------------------------------------------------ +CREATE TABLE IF NOT EXISTS `t_export_task` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `task_no` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '任务编号(= 执行日志批次编号 = 文件名主体)', + `biz_key` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '业务标识,如 tSimCardInfo', + `biz_name` varchar(100) COLLATE utf8mb4_general_ci NOT NULL COMMENT '业务名称,如 卡信息', + `perm_code` varchar(128) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '导出权限码快照,K1业务过滤用', + `query_params` json DEFAULT NULL COMMENT '筛选条件快照', + `identity_snapshot` json DEFAULT NULL COMMENT '提交时用户身份与角色范围快照,异步执行还原上下文用', + `status` tinyint NOT NULL DEFAULT '0' COMMENT '状态 0排队 2生成中 1已完成 3失败', + `total_count` int NOT NULL DEFAULT '0' COMMENT '导出总行数', + `oss_id` bigint NOT NULL DEFAULT '0' COMMENT 'OSS文件ID', + `file_name` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '文件名,= task_no + .xlsx', + `file_size` bigint NOT NULL DEFAULT '0' COMMENT '文件大小(字节)', + `file_md5` varchar(64) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '文件MD5', + `download_count` int NOT NULL DEFAULT '0' COMMENT '下载次数', + `last_download_time` datetime DEFAULT NULL COMMENT '最后下载时间', + `error_message` varchar(2000) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '失败原因', + `owner_user_id` bigint NOT NULL DEFAULT '0' COMMENT '发起用户ID,K2归属过滤用', + `dept_id` bigint NOT NULL DEFAULT '0' COMMENT '机构ID', + `tenant_id` varchar(20) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '000000' COMMENT '租户ID', + `created_dept` bigint NOT NULL DEFAULT '0' COMMENT '创建部门ID', + `created_by` bigint NOT NULL DEFAULT '0' COMMENT '创建者ID', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `start_time` datetime DEFAULT NULL COMMENT '开始生成时间', + `finish_time` datetime DEFAULT NULL COMMENT '完成/失败时间', + `expire_time` datetime DEFAULT NULL COMMENT '文件过期时间', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted_time` datetime DEFAULT NULL COMMENT '文件清理时间,NULL表示未清理', + `delete_reason` varchar(20) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '文件清理原因:user手动删除,expired到期清理', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_task_no` (`task_no`), + KEY `idx_owner_user_id` (`owner_user_id`,`id`), + KEY `idx_dept_id` (`dept_id`), + KEY `idx_status` (`status`), + KEY `idx_perm_code` (`perm_code`), + KEY `idx_expire_time` (`expire_time`), + KEY `idx_export_cleanup` (`deleted_time`,`status`,`expire_time`,`id`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='导出任务表'; + +-- ------------------------------------------------------------ +-- 2) 通知已读表 +-- ------------------------------------------------------------ +CREATE TABLE IF NOT EXISTS `sys_notice_user` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `notice_id` bigint NOT NULL DEFAULT '0', + `tenant_id` varchar(20) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '000000', + `notice_title` varchar(50) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '', + `notice_type` char(1) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '1', + `notice_content` longblob, + `status` char(1) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0', + `user_id` bigint NOT NULL DEFAULT '0', + `is_read` tinyint NOT NULL DEFAULT '0', + `created_dept` bigint NOT NULL DEFAULT '0', + `created_by` bigint NOT NULL DEFAULT '0', + `created_at` datetime DEFAULT CURRENT_TIMESTAMP, + `updated_by` bigint DEFAULT NULL, + `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `remark` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `idx_notice_user_unread` (`tenant_id`,`user_id`,`status`,`is_read`), + KEY `idx_notice_id` (`notice_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- ------------------------------------------------------------ +-- 3) 通道关联列改 varchar(64)(迁移 20260920;只改类型不改数据) +-- ------------------------------------------------------------ +ALTER TABLE `card_channel_assoc` + MODIFY COLUMN `channel_id` VARCHAR(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '通道编号'; + +-- ------------------------------------------------------------ +-- 4) 菜单 / 权限(先删后插,幂等) +-- 4.1 流量池预警配置独立权限 4 条(admin-svr storage/data/pool_warn_config_permission.sql 的等价物,固定 id) +-- ------------------------------------------------------------ +DELETE FROM `sys_role_menu` WHERE `menu_id` BETWEEN 2115 AND 2123; +DELETE FROM `sys_menu` WHERE `menu_id` BETWEEN 2115 AND 2123; + +INSERT INTO `sys_menu` + (`menu_id`, `menu_name`, `parent_id`, `level`, `tree`, `order_num`, `path`, `component`, + `query_param`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, + `created_dept`, `created_by`, `created_at`, `remark`) +VALUES + (2115, '连号流量池预警配置', 257, 2, 'tr_257', 23, '', '', NULL, 1, 0, 'F', '0', '0', 'iot:tSimPoolWarnConfig:range:submit', '#', 100, 1, NOW(), '流量池预警配置(独立权限)'), + (2116, '批量输入流量池预警配置', 257, 2, 'tr_257', 22, '', '', NULL, 1, 0, 'F', '0', '0', 'iot:tSimPoolWarnConfig:input:submit', '#', 100, 1, NOW(), '流量池预警配置(独立权限)'), + (2117, '提交流量池预警配置Excel', 257, 2, 'tr_257', 21, '', '', NULL, 1, 0, 'F', '0', '0', 'iot:tSimPoolWarnConfig:excel:submit', '#', 100, 1, NOW(), '流量池预警配置(独立权限)'), + (2118, '下载流量池预警配置Excel模板', 257, 2, 'tr_257', 20, '', '', NULL, 1, 0, 'F', '0', '0', 'iot:tSimPoolWarnConfig:excel:template', '#', 100, 1, NOW(), '流量池预警配置(独立权限)'), + (2119, '下载中心', 0, 1, NULL, 34, 'downloadCenter', 'iotlcm/downloadCenter/index', NULL, 1, 0, 'C', '0', '0', 'common:downloadCenter:list', '#', 100, 1, NOW(), '导出任务与文件下载'), + (2120, '下载文件', 2119, 2, 'tr_2119', 1, '', '', NULL, 1, 0, 'F', '0', '0', 'common:downloadCenter:download', '#', 100, 1, NOW(), '下载导出文件'), + (2121, '删除任务', 2119, 2, 'tr_2119', 2, '', '', NULL, 1, 0, 'F', '0', '0', 'common:downloadCenter:remove', '#', 100, 1, NOW(), '删除导出任务与文件'), + (2122, '卡基础信息查询', 257, 2, 'tr_257', 1, '', '', NULL, 1, 0, 'F', '0', '0', 'iot:tSimCardBaseQuery:view', '#', 100, 1, NOW(), '卡基础信息查询与导出'), + (2123, '月历史用量查询', 257, 2, 'tr_257', 3, '', '', NULL, 1, 0, 'F', '0', '0', 'iot:tSimCardUsageHistory:view', '#', 100, 1, NOW(), '月历史用量查询与导出'); + +-- 4.2 授权 +-- 下载中心 3 条 → 全部角色(照预演:所有角色都有) +INSERT INTO `sys_role_menu` (`tenant_id`, `role_id`, `menu_id`, `data_scope`) +SELECT '000000', r.`role_id`, m.`menu_id`, 0 +FROM `sys_role` r +JOIN `sys_menu` m ON m.`perms` IN ('common:downloadCenter:list','common:downloadCenter:download','common:downloadCenter:remove') +WHERE r.`status` = '0' AND r.`deleted_at` IS NULL; + +-- 卡基础信息查询 / 月历史用量查询 → dl(代理商)+ enduser(照预演) +INSERT INTO `sys_role_menu` (`tenant_id`, `role_id`, `menu_id`, `data_scope`) +SELECT '000000', r.`role_id`, m.`menu_id`, 0 +FROM `sys_role` r +JOIN `sys_menu` m ON m.`perms` IN ('iot:tSimCardBaseQuery:view','iot:tSimCardUsageHistory:view') +WHERE r.`status` = '0' AND r.`deleted_at` IS NULL AND r.`role_key` IN ('dl','enduser'); + +-- 流量池预警 4 条 → 拥有对应旧权限项(tSimWarningConfig:*)的角色自动补授 +INSERT INTO `sys_role_menu` (`tenant_id`, `role_id`, `menu_id`, `data_scope`) +SELECT old.`tenant_id`, old.`role_id`, new.`menu_id`, old.`data_scope` +FROM `sys_role_menu` old +JOIN `sys_menu` old_menu ON old_menu.`menu_id` = old.`menu_id` +JOIN `sys_menu` new + ON new.`parent_id` = old_menu.`parent_id` + AND new.`perms` = REPLACE(old_menu.`perms`, 'iot:tSimWarningConfig:', 'iot:tSimPoolWarnConfig:') +WHERE old_menu.`perms` IN ( + 'iot:tSimWarningConfig:excel:template', + 'iot:tSimWarningConfig:excel:submit', + 'iot:tSimWarningConfig:input:submit', + 'iot:tSimWarningConfig:range:submit' + ); + +-- ------------------------------------------------------------ +-- 5) 字典 detail_status = 5「未执行」(迁移 20261021) +-- ------------------------------------------------------------ +INSERT INTO `sys_dict_data` ( + `tenant_id`, `dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, + `is_default`, `created_dept`, `created_by`, `created_at`, `remark`) +SELECT '000000', 5, '未执行', '5', 'detail_status', '', 'warning', + 'N', 100, 1, NOW(), '本卡校验通过,本批存在校验失败卡,整批未执行' +FROM `sys_dict_type` AS dict_type +WHERE dict_type.`tenant_id` = '000000' + AND dict_type.`dict_type` = 'detail_status' + AND NOT EXISTS ( + SELECT 1 FROM `sys_dict_data` AS dict_data + WHERE dict_data.`tenant_id` = '000000' + AND dict_data.`dict_type` = 'detail_status' + AND dict_data.`dict_value` = '5' + ); + +-- ------------------------------------------------------------ +-- 6) 套餐到期提醒(企业月度汇总)—— 默认暂停(迁移 20261014) +-- 启用/改调度需在任务管理页操作(直接改库不刷新进程内调度) +-- ------------------------------------------------------------ +INSERT INTO sys_job (job_name, job_params, job_group, invoke_target, cron_expression, misfire_policy, concurrent, status, remark, created_at, updated_at) +SELECT '套餐到期提醒(企业月度汇总)', '', '3', 'NotifyMonthlyPackageExpiry', + '0 0 9 15 * ?', 1, 1, '1', '独立月度到期通知任务;默认暂停', NOW(), NOW() +WHERE NOT EXISTS ( + SELECT 1 FROM sys_job WHERE invoke_target = 'NotifyMonthlyPackageExpiry' +); + + +-- ============================================================ +-- 数据修复:sys_dept.ancestors 尾逗号归一化(全新库为空操作) +-- ============================================================ + +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`; + + +-- ============================================================ +-- 业务账号与种子账号口令 +-- ============================================================ + +-- 口令为字面值(不使用环境变量)。改口令须同步修改: +-- docker-compose.yml 的 MYSQL_ROOT_PASSWORD +-- config/*/config.yaml 各服务 database link 的口令 +-- config/*/config.yaml 各服务 database link 的口令 +-- 口令算法:md5( hex(md5(明文)) + md5(salt) ),见 iotlcm-admin-svr utils.go + +CREATE USER IF NOT EXISTS 'u_iotlcm'@'%' + IDENTIFIED WITH mysql_native_password BY 'Iotlcm2026Default'; +GRANT ALL PRIVILEGES ON `db_iotlcm`.* TO 'u_iotlcm'@'%'; + +CREATE DATABASE IF NOT EXISTS `iotdb` + DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +GRANT ALL PRIVILEGES ON `iotdb`.* TO 'u_iotlcm'@'%'; + +FLUSH PRIVILEGES; + +-- 种子账号口令统一重置为部署口令(登录后请逐个修改) +UPDATE `sys_user` SET `password` = MD5(CONCAT(MD5('Iotlcm2026Default'), MD5(`salt`))); + From e6abbf65dd413014157ca17886fa306a69b417ba Mon Sep 17 00:00:00 2001 From: MiFaZhan Date: Thu, 29 Oct 2026 17:14:58 +0800 Subject: [PATCH 09/24] =?UTF-8?q?docs:=20=E6=A0=A1=E6=AD=A3=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E5=8C=96=E8=84=9A=E6=9C=AC=E7=9A=84=E8=A1=A8=E5=92=8C?= =?UTF-8?q?=E7=A7=8D=E5=AD=90=E6=95=B0=E6=8D=AE=E7=BB=9F=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- schema/README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/schema/README.md b/schema/README.md index 5c8a447..34008c0 100644 --- a/schema/README.md +++ b/schema/README.md @@ -11,11 +11,11 @@ | 表结构与基础数据 | 建 `db_iotlcm` 库 + 全部表 + 菜单/字典/角色/租户/部门/演示账号 | | 结构补齐 | `card_channel_assoc` 表 + 27 个列(用存储过程按 `information_schema` 判断) | | 结构对齐生产 | `t_sms_template_config` 表、`batch_no` 默认值 | -| 通道模板 | 23 条(上游密钥已置空) | -| 数据字典 | 86 类 / 435 条 | +| 通道模板 | 3 条(上游密钥已置空) | +| 数据字典 | 86 类 / 436 条 | | Mock 通道 | `channel_yd_mock`。**卡全部挂在该通道上**,缺则卡片管理的通道列、筛选、开停复机均不可用 | | 角色链 | 代理下发模板参数与角色下发标记 | -| 定时任务 | 19 条,**默认全部停用**(避免自动全量同步打满机器) | +| 定时任务 | 20 条,**默认全部停用**(避免自动全量同步打满机器) | | 菜单增量 | 达量断网按钮权限、全量同步页 | | v1.0.4 前置 | 导出中心表 `t_export_task`、通知已读表 `sys_notice_user`、`card_channel_assoc.channel_id` 扩宽、菜单权限 | | 数据修复 | `sys_dept.ancestors` 尾逗号归一化(全新库为空操作) | @@ -23,7 +23,7 @@ ## 来源 -内容取自**演示环境正在使用的种子库**,结构已与生产核对(89 表 / 1703 列)。与源版本的差异仅为脱敏: +内容取自**演示环境正在使用的种子库**,以生产 89 表基线为基础并补齐 v1.0.4 的 2 张表,初始化后为 **91 表**。脱敏及部署适配包括: - 演示账号昵称、邮箱、手机号、登录 IP、头像 → 占位或编造值 - 公司名、组织名 → 「示例企业」等通用名 @@ -37,7 +37,7 @@ | 位置 | 内容 | | --- | --- | -| `docker-compose.yml` | `MYSQL_ROOT_PASSWORD` | +| `docker-compose.yml` | `MYSQL_ROOT_PASSWORD`(MySQL 健康检查会引用此值) | | `config/*/config.yaml` | 各服务 `database link` 的口令 | | `schema/init.sql` 末段 | `u_iotlcm` 账号口令、种子账号重置口令 | From 314e213a5a80320f0881bf850fe3f5cc2681c4a8 Mon Sep 17 00:00:00 2001 From: MiFaZhan Date: Thu, 29 Oct 2026 17:21:59 +0800 Subject: [PATCH 10/24] =?UTF-8?q?update:=20=E5=9B=BA=E5=AE=9A=2012=20?= =?UTF-8?q?=E4=B8=AA=E4=B8=9A=E5=8A=A1=E9=95=9C=E5=83=8F=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=B9=B6=E4=BF=AE=E6=AD=A3=E9=83=A8=E7=BD=B2=E5=81=A5=E5=BA=B7?= =?UTF-8?q?=E6=A3=80=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++++ docker-compose.yml | 37 ++++++++++++++++++------------------- 2 files changed, 22 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index e6e85a0..0cb0539 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,10 @@ docker compose --profile with-nginx up -d # 自带反向代理 多个 profile 可组合:`--profile with-mock --profile with-nginx up -d` +## 镜像版本 + +当前部署编排固定使用业务镜像 `v1.0.4`;`iotlcm-app-server` 与 `iotlcm-app-web` 固定为 `v1.0.2`。升级时请在 `docker-compose.yml` 中同步更新对应 tag,不要改用 `latest`。 + ## 部署内容 | 类别 | 服务 | diff --git a/docker-compose.yml b/docker-compose.yml index 214ccc0..e9529c8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -4,9 +4,8 @@ name: iotlcm # IotLCM 单机部署编排 # # 快速开始: -# 1. cp .env.example .env # 填写镜像仓库与各项口令 -# 2. cp -r config.example config # 逐份填写配置(见各文件内注释) -# 3. docker compose up -d +# 1. docker compose up -d +# 配置文件和初始口令均已内置;正式部署前按 README.md 修改默认口令。 # # 首次启动会自动建库并导入 schema(见 schema/README.md)。 # @@ -30,7 +29,7 @@ services: TZ: 'Asia/Shanghai' volumes: - ./data/mysql:/var/lib/mysql - # 仅在 data/mysql 为空(首次启动)时执行,按文件名顺序 + # 仅在 data/mysql 为空(首次启动)时执行 schema/init.sql - ./schema:/docker-entrypoint-initdb.d:ro command: - --character-set-server=utf8mb4 @@ -39,7 +38,7 @@ services: networks: - iotlcm-network healthcheck: - test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "-piotlcm_root_2026"] + test: ["CMD-SHELL", "MYSQL_PWD=\"$$MYSQL_ROOT_PASSWORD\" mysqladmin ping -h 127.0.0.1 -u root --silent"] interval: 10s timeout: 5s retries: 10 @@ -119,7 +118,7 @@ services: # ---------------- 业务服务 ---------------- admin-svr: - image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-admin-svr:latest' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-admin-svr:v1.0.4' container_name: iotlcm-admin-svr restart: always ports: @@ -142,7 +141,7 @@ services: condition: service_healthy admin-ui: - image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-admin-ui:latest' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-admin-ui:v1.0.4' container_name: iotlcm-admin-ui restart: always ports: @@ -159,7 +158,7 @@ services: - admin-svr openapi: - image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-openapi:latest' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-openapi:v1.0.4' container_name: iotlcm-openapi restart: always ports: @@ -180,7 +179,7 @@ services: condition: service_healthy upstream-chan: - image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-upstream-chan:latest' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-upstream-chan:v1.0.4' container_name: iotlcm-upstream-chan restart: always ports: @@ -204,7 +203,7 @@ services: condition: service_started upstream-proxy: - image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-upstream-proxy:latest' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-upstream-proxy:v1.0.4' container_name: iotlcm-upstream-proxy restart: always ports: @@ -228,7 +227,7 @@ services: condition: service_started worker-svr: - image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-worker-svr:latest' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-worker-svr:v1.0.4' container_name: iotlcm-worker-svr restart: always environment: @@ -250,7 +249,7 @@ services: condition: service_healthy app-server: - image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-app-server:latest' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-app-server:v1.0.2' container_name: iotlcm-app-server restart: always ports: @@ -271,7 +270,7 @@ services: condition: service_healthy app-web: - image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-app-web:latest' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-app-web:v1.0.2' container_name: iotlcm-app-web restart: always ports: @@ -284,7 +283,7 @@ services: - iotlcm-network sms: - image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-sms:latest' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-sms:v1.0.4' container_name: iotlcm-sms hostname: iotlcm-sms restart: always @@ -312,7 +311,7 @@ services: - iotlcm-network bot: - image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-bot:latest' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-bot:v1.0.4' container_name: iotlcm-bot restart: unless-stopped environment: @@ -328,7 +327,7 @@ services: - with-bot docs: - image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-docs:latest' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-docs:v1.0.4' container_name: iotlcm-docs restart: unless-stopped ports: @@ -342,9 +341,9 @@ services: # # 启用:docker compose --profile with-mock up -d # 启用后 upstream-chan 的 sim_yd_mock_v5.url 指向 http://onelink-mock:8080/v5/ - # (config.example/upstream-chan 已预置该地址) + # (config/upstream-chan 已预置该地址) onelink-mock: - image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-onelink-mock:latest' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-onelink-mock:v1.0.4' container_name: iotlcm-onelink-mock restart: unless-stopped ports: @@ -369,7 +368,7 @@ services: # ---------------- 可选:反向代理 ---------------- # 若宿主机已有 nginx / 面板,可不启动本容器, - # 参考 config.example/nginx/iotlcm.conf 把 location 段落到宿主机配置。 + # 参考 config/nginx/iotlcm.conf 把 location 段落到宿主机配置。 nginx: image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/nginx:1.30' container_name: iotlcm-nginx From 94e09fd013368d9ead46434934d4edda6686c369 Mon Sep 17 00:00:00 2001 From: MiFaZhan Date: Thu, 29 Oct 2026 17:32:46 +0800 Subject: [PATCH 11/24] =?UTF-8?q?fix:=20=E6=81=A2=E5=A4=8D=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=9C=8D=E5=8A=A1=E7=BC=BA=E5=A4=B1=E7=9A=84=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E8=BF=9E=E6=8E=A5=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/admin-svr/config.yaml | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/config/admin-svr/config.yaml b/config/admin-svr/config.yaml index 4f23f77..c4980a2 100644 --- a/config/admin-svr/config.yaml +++ b/config/admin-svr/config.yaml @@ -1,11 +1,7 @@ # ============================================================ # iotlcm-admin-svr 配置示例 # -# cp config.example.yaml config.yaml -# -# 标注「必改」的项需要按实际环境填写; -# 其余为可运行默认值,按需调整。 -# 支持 与 环境变量占位(由 compose 注入)。 +# 文件已随部署仓提供可运行默认值;正式上线前修改口令等配置。 # ============================================================ system: @@ -77,7 +73,8 @@ database: level: "all" stdout: true default: - # 必改:连接串格式为 mysql:用户名:Iotlcm2026Default@tcp(mysql:3306)/db_iotlcm?charset=utf8mb4&parseTime=True&loc=Asia%2FShanghai" + # 使用与其余服务相同的 u_iotlcm 应用账号。 + link: "mysql:u_iotlcm:Iotlcm2026Default@tcp(mysql:3306)/db_iotlcm?charset=utf8mb4&parseTime=True&loc=Asia%2FShanghai" debug: false charset: "utf8mb4" dryRun: false From 57e03233f8b4a9cd890c721c45f7c653e39f0db7 Mon Sep 17 00:00:00 2001 From: MiFaZhan Date: Thu, 29 Oct 2026 17:56:46 +0800 Subject: [PATCH 12/24] =?UTF-8?q?fix:=20=E6=8C=89=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E5=AE=9E=E9=99=85=E5=8A=A0=E5=AF=86=E7=AE=97?= =?UTF-8?q?=E6=B3=95=E9=87=8D=E7=BD=AE=E7=A7=8D=E5=AD=90=E8=B4=A6=E5=8F=B7?= =?UTF-8?q?=E5=8F=A3=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- schema/init.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/schema/init.sql b/schema/init.sql index 2e7f164..ba5c3b1 100644 --- a/schema/init.sql +++ b/schema/init.sql @@ -5402,5 +5402,5 @@ GRANT ALL PRIVILEGES ON `iotdb`.* TO 'u_iotlcm'@'%'; FLUSH PRIVILEGES; -- 种子账号口令统一重置为部署口令(登录后请逐个修改) -UPDATE `sys_user` SET `password` = MD5(CONCAT(MD5('Iotlcm2026Default'), MD5(`salt`))); +UPDATE `sys_user` SET `password` = MD5(CONCAT(MD5('Iotlcm2026Default'), `salt`)); From b60695b0e5693a6e88203d146176745bcee91a8a Mon Sep 17 00:00:00 2001 From: MiFaZhan Date: Thu, 29 Oct 2026 18:07:50 +0800 Subject: [PATCH 13/24] =?UTF-8?q?fix:=20=E8=A1=A5=E9=BD=90=E5=BC=82?= =?UTF-8?q?=E6=AD=A5=E5=8A=9E=E7=90=86=E6=81=A2=E5=A4=8D=E8=A1=A8=E5=B9=B6?= =?UTF-8?q?=E6=A0=A1=E6=AD=A3=E5=88=9D=E5=A7=8B=E5=8C=96=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +++ schema/README.md | 5 ++-- schema/init.sql | 76 ++++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 81 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 0cb0539..f2469b1 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,8 @@ docker compose --profile with-nginx up -d # 自带反向代理 多个 profile 可组合:`--profile with-mock --profile with-nginx up -d` +`with-bot` 需要先在 `config/bot/config.yaml` 填入有效的飞书应用 `appId` / `appSecret`;开源默认配置未提供企业凭据,不配置时 bot 无法启动。默认启动不包含 bot。 + ## 镜像版本 当前部署编排固定使用业务镜像 `v1.0.4`;`iotlcm-app-server` 与 `iotlcm-app-web` 固定为 `v1.0.2`。升级时请在 `docker-compose.yml` 中同步更新对应 tag,不要改用 `latest`。 @@ -69,6 +71,8 @@ iotlcm-deploy/ └── data/ # 运行数据(首次启动自动创建,不入版本库) ``` +全新初始化生成 95 张业务表(原有 91 张 + worker 异步恢复所需 4 张);已部署旧库不会自动执行新增迁移,见 `schema/README.md`。 + ## 上线前必改 默认口令仅用于快速试用。**正式部署前必须修改以下内容**,具体位置见[部署手册](https://git.5iot.com/iotlcm-public/iotlcm-docs): diff --git a/schema/README.md b/schema/README.md index 34008c0..1882826 100644 --- a/schema/README.md +++ b/schema/README.md @@ -1,6 +1,6 @@ # 数据库初始化 -`init.sql` 是**单文件**初始化脚本,MySQL 容器首次以空数据卷启动时由 `docker-entrypoint-initdb.d` 自动执行。 +`init.sql` 是**单文件**初始化脚本,MySQL 容器首次以空数据卷启动时由 `docker-entrypoint-initdb.d` 自动执行。已有数据目录不会自动执行新增 DDL,升级时需先核对四张表状态,再按上游迁移规范处理,不能删除数据卷。 ## 内容组成 @@ -18,12 +18,13 @@ | 定时任务 | 20 条,**默认全部停用**(避免自动全量同步打满机器) | | 菜单增量 | 达量断网按钮权限、全量同步页 | | v1.0.4 前置 | 导出中心表 `t_export_task`、通知已读表 `sys_notice_user`、`card_channel_assoc.channel_id` 扩宽、菜单权限 | +| APN 异步恢复 | `data_operation_parent`、`data_operation_sub_batch`、`data_operation_sub_detail`、`data_operation_card_claim` 四表;须先建表后启动 worker | | 数据修复 | `sys_dept.ancestors` 尾逗号归一化(全新库为空操作) | | 业务账号与口令 | 建 `u_iotlcm` 账号、可选库 `iotdb`、种子账号口令统一重置 | ## 来源 -内容取自**演示环境正在使用的种子库**,以生产 89 表基线为基础并补齐 v1.0.4 的 2 张表,初始化后为 **91 表**。脱敏及部署适配包括: +内容取自**演示环境正在使用的种子库**,以生产 89 表基线为基础,补齐 v1.0.4 的 2 张表及 worker 异步恢复所需的 4 张表,初始化后为 **95 表**。四张恢复表直接采用内部数据库仓 `feat/data-operation-reconcile-20261015` 的 `SQL/20261015_data_operation_sub_batch.sql`(提交 `bf5f7fd`);原有 91 表统计不含这四张表。脱敏及部署适配包括: - 演示账号昵称、邮箱、手机号、登录 IP、头像 → 占位或编造值 - 公司名、组织名 → 「示例企业」等通用名 diff --git a/schema/init.sql b/schema/init.sql index ba5c3b1..adaa386 100644 --- a/schema/init.sql +++ b/schema/init.sql @@ -5388,8 +5388,7 @@ SELECT `dept_id`, `dept_name`, `parent_id`, `ancestors` -- 口令为字面值(不使用环境变量)。改口令须同步修改: -- docker-compose.yml 的 MYSQL_ROOT_PASSWORD -- config/*/config.yaml 各服务 database link 的口令 --- config/*/config.yaml 各服务 database link 的口令 --- 口令算法:md5( hex(md5(明文)) + md5(salt) ),见 iotlcm-admin-svr utils.go +-- 口令算法:MD5(CONCAT(MD5(明文), salt));前端先 MD5 明文,后端再将该值与原始 salt 拼接后 MD5。 CREATE USER IF NOT EXISTS 'u_iotlcm'@'%' IDENTIFIED WITH mysql_native_password BY 'Iotlcm2026Default'; @@ -5404,3 +5403,76 @@ FLUSH PRIVILEGES; -- 种子账号口令统一重置为部署口令(登录后请逐个修改) UPDATE `sys_user` SET `password` = MD5(CONCAT(MD5('Iotlcm2026Default'), `salt`)); + + +-- ============================================================ +-- worker-svr v1.0.4 的 APN 异步办理恢复表(来源:iotlcm-database +-- feat/data-operation-reconcile-20261015:SQL/20261015_data_operation_sub_batch.sql,bf5f7fd) +-- 新库初始化阶段先建表,后启动 worker;旧库单独执行原迁移,不覆盖已有记录。 +-- ============================================================ +-- APN异步任务:先执行迁移,再部署配套chan/proxy/worker;禁止混版直接发送办理请求。 +-- apnAsyncProtocolVersion=0仅阻断网络办理请求,worker恢复器仍会访问本脚本创建的四张表;故必须先迁移。 +-- 升级前排空旧路由与在途请求、逐批核实旧同步processing批次:可能已送上游却无operationId者不得自动重投。 +-- 所有chan/proxy/worker实例均升级且旧实例退出后才显式开启门禁;能力probe成功不证明下一次办理必达同一实例。 +-- 本脚本只创建全新四表,不负责升级此前未部署的试验版表结构;若已存在同名表须先核对列与排序规则。 +-- 仅适用于首次创建四表;CREATE IF NOT EXISTS不升级未部署的旧试验结构。 +-- 若发现同名旧表,须停止启用并单独核验冻结请求/明细/active归属,禁止清空或重置jobId和补查次数。 +-- worker数据库连接须保持写入与读取一致的loc/parseTime约定(与现有生产配置一致)。 +CREATE TABLE IF NOT EXISTS `data_operation_parent` ( + `batch_no` varchar(64) NOT NULL, + `ready` tinyint NOT NULL DEFAULT 0, + `finalize_token` varchar(64) DEFAULT NULL, + `finalize_until` datetime(3) DEFAULT NULL, + `recovery_attempt_at` datetime(3) DEFAULT NULL, + `last_reason` varchar(1024) DEFAULT NULL, + `updated_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), + PRIMARY KEY (`batch_no`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='APN父批准备屏障及可恢复汇总租约'; + +CREATE TABLE IF NOT EXISTS `data_operation_sub_batch` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `batch_no` varchar(64) NOT NULL, + `batch_type` int NOT NULL, + `chan_key` varchar(128) NOT NULL, + `operation_id` varchar(64) CHARACTER SET ascii COLLATE ascii_bin NOT NULL, + `detail_ids` json NOT NULL, + `request_data` json NOT NULL COMMENT '首发前冻结请求,恢复不能重新构建', + `job_id` varchar(128) DEFAULT NULL, + `status` varchar(24) NOT NULL DEFAULT 'prepared' COMMENT 'prepared/submitting/accepted/uncertain/review/done', + `poll_count` tinyint unsigned NOT NULL DEFAULT 0, + `next_check_at` datetime(3) DEFAULT NULL, + `submitted_at` datetime(3) DEFAULT NULL, + `lease_token` varchar(64) DEFAULT NULL, + `lease_until` datetime(3) DEFAULT NULL, + `last_reason` varchar(1024) DEFAULT NULL, + `created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updated_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), + PRIMARY KEY (`id`), + UNIQUE KEY `uk_data_operation_id` (`operation_id`), + KEY `idx_data_sub_due` (`status`,`next_check_at`,`lease_until`), + KEY `idx_data_sub_batch` (`batch_no`,`status`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='APN异步子批及恢复状态'; + +CREATE TABLE IF NOT EXISTS `data_operation_sub_detail` ( + `detail_id` bigint NOT NULL, + `operation_id` varchar(64) CHARACTER SET ascii COLLATE ascii_bin NOT NULL, + `batch_no` varchar(64) NOT NULL, + `iccid` varchar(64) NOT NULL, + PRIMARY KEY (`detail_id`), + UNIQUE KEY `uk_data_sub_batch_card` (`batch_no`,`iccid`), + KEY `idx_data_sub_detail_operation` (`operation_id`), + KEY `idx_data_sub_detail_batch` (`batch_no`), + KEY `idx_data_sub_detail_card` (`iccid`,`batch_no`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='明细唯一提交意图映射'; + +-- queued与active分离:新准备意图不抢已提交请求的owner,未知active不能自动释放。 +CREATE TABLE IF NOT EXISTS `data_operation_card_claim` ( + `tenant_id` varchar(64) NOT NULL, + `iccid` varchar(64) NOT NULL, + `batch_id` bigint NOT NULL DEFAULT 0 COMMENT '最新queued批次序', + `operation_id` varchar(64) CHARACTER SET ascii COLLATE ascii_bin NOT NULL DEFAULT '' COMMENT '最新queued意图', + `active_batch_id` bigint NOT NULL DEFAULT 0, + `active_operation_id` varchar(64) CHARACTER SET ascii COLLATE ascii_bin NOT NULL DEFAULT '', + `updated_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), + PRIMARY KEY (`tenant_id`,`iccid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='APN卡持久化提交顺序屏障'; From bf2656e95f45dae6a2a9baf9dd28f6a6110bd0a0 Mon Sep 17 00:00:00 2001 From: MiFaZhan Date: Thu, 29 Oct 2026 18:20:05 +0800 Subject: [PATCH 14/24] =?UTF-8?q?docs:=20=E8=AF=B4=E6=98=8E=E6=97=B6?= =?UTF-8?q?=E5=BA=8F=E5=BA=93=E6=9C=AA=E5=86=85=E7=BD=AE=E7=9A=84=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E9=99=90=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index f2469b1..8df923d 100644 --- a/README.md +++ b/README.md @@ -73,6 +73,8 @@ iotlcm-deploy/ 全新初始化生成 95 张业务表(原有 91 张 + worker 异步恢复所需 4 张);已部署旧库不会自动执行新增迁移,见 `schema/README.md`。 +本编排不包含 TDengine。默认配置中的时序库名称留空,因此首页流量/用量图表等依赖时序数据的功能不能仅靠上述容器完整展示;需要自行部署 TDengine,并在相关服务的 `config.yaml` 中配置连接及数据库名称。管理端登录、菜单、卡信息筛选不依赖这项配置。 + ## 上线前必改 默认口令仅用于快速试用。**正式部署前必须修改以下内容**,具体位置见[部署手册](https://git.5iot.com/iotlcm-public/iotlcm-docs): From 8543038dad7a5de77580c67fa7bc8c26d614f51c Mon Sep 17 00:00:00 2001 From: MiFaZhan Date: Fri, 30 Oct 2026 08:47:21 +0800 Subject: [PATCH 15/24] =?UTF-8?q?docs:=20=E4=BF=AE=E6=AD=A3=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E6=96=87=E4=BB=B6=E5=A4=B4=E9=83=A8=E7=9A=84=E6=97=A7?= =?UTF-8?q?=E7=89=88=E5=A4=8D=E5=88=B6=E8=AF=B4=E6=98=8E=EF=BC=8C=E6=98=8E?= =?UTF-8?q?=E7=A1=AE=20bot=20=E4=B8=BA=E5=8F=AF=E9=80=89=E8=BF=90=E7=BB=B4?= =?UTF-8?q?=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 7 个配置文件的头部仍写着「cp config.example.yaml config.yaml」, 但该文件已不存在(现为直接可用的 config.yaml),改为准确说明 - config/bot 补充说明:飞书通知是可选运维工具,非平台功能, 默认不启动;使用需自行在飞书开放平台创建应用,不提供企业凭据 - README 同步:去掉「开源未提供企业凭据」的措辞,改为使用者自备 --- README.md | 6 ++++-- config/admin-svr/config.yaml | 6 ++++-- config/app-server/config.yaml | 8 ++++---- config/bot/config.yaml | 20 +++++++++++--------- config/openapi/config.yaml | 6 ++++-- config/sms/config.yaml | 9 ++++----- config/upstream-chan/config.yaml | 12 ++++-------- config/upstream-proxy/config.yaml | 8 ++++---- config/worker-svr/config.yaml | 9 ++++----- 9 files changed, 43 insertions(+), 41 deletions(-) diff --git a/README.md b/README.md index 8df923d..809ae95 100644 --- a/README.md +++ b/README.md @@ -31,13 +31,15 @@ docker compose logs -f mysql ```bash docker compose --profile with-mock up -d # 运营商接口挡板 -docker compose --profile with-bot up -d # 飞书通知 +docker compose --profile with-bot up -d # 飞书通知(运维自用) docker compose --profile with-nginx up -d # 自带反向代理 ``` 多个 profile 可组合:`--profile with-mock --profile with-nginx up -d` -`with-bot` 需要先在 `config/bot/config.yaml` 填入有效的飞书应用 `appId` / `appSecret`;开源默认配置未提供企业凭据,不配置时 bot 无法启动。默认启动不包含 bot。 +`with-bot` 是把全量同步等运维事件推送到飞书群的**内部运维工具**,不是平台功能。它需要你自己的飞书自建应用凭证(`config/bot/config.yaml` 的 `appId` / `appSecret` / `chatId`),没填就不启动。 + +**默认不启动,也不影响平台功能**;不需要飞书通知就完全不用管它。 ## 镜像版本 diff --git a/config/admin-svr/config.yaml b/config/admin-svr/config.yaml index c4980a2..784aea4 100644 --- a/config/admin-svr/config.yaml +++ b/config/admin-svr/config.yaml @@ -1,7 +1,9 @@ # ============================================================ -# iotlcm-admin-svr 配置示例 +# iotlcm-admin-svr 配置 # -# 文件已随部署仓提供可运行默认值;正式上线前修改口令等配置。 +# 本文件随部署仓分发,已带可运行默认值,无需复制或改名。 +# 正式上线前请修改口令等敏感项;修改时需与 docker-compose.yml、 +# schema/init.sql 及 config/ 下其他文件保持一致(详见 README)。 # ============================================================ system: diff --git a/config/app-server/config.yaml b/config/app-server/config.yaml index 4e85659..0ac7726 100644 --- a/config/app-server/config.yaml +++ b/config/app-server/config.yaml @@ -1,9 +1,9 @@ # ============================================================ -# iotlcm-app-server 配置示例 +# iotlcm-app-server 配置 # -# cp config.example.yaml config.yaml -# -# 小程序 / H5 端的后端服务。 +# 本文件随部署仓分发,已带可运行默认值,无需复制或改名。 +# 正式上线前请修改口令等敏感项;修改时需与 docker-compose.yml、 +# schema/init.sql 及 config/ 下其他文件保持一致(详见 README)。 # ============================================================ system: diff --git a/config/bot/config.yaml b/config/bot/config.yaml index 5086033..9ce83b0 100644 --- a/config/bot/config.yaml +++ b/config/bot/config.yaml @@ -1,12 +1,15 @@ # ============================================================ -# iotlcm-bot 配置示例 +# iotlcm-bot 配置 # -# cp config.example.yaml config.yaml -# -# 本服务把全量同步等运维事件推送到飞书群。 -# 不使用飞书通知时不要启动该容器(默认走 with-bot profile)。 +# 本文件随部署仓分发,已带可运行默认值,无需复制或改名。 +# 正式上线前请修改口令等敏感项;修改时需与 docker-compose.yml、 +# schema/init.sql 及 config/ 下其他文件保持一致(详见 README)。 # ============================================================ +# 说明:本服务把全量同步等运维事件推送到飞书群,属可选的运维通知工具, +# 不是平台功能本身。默认不启动(需显式 --profile with-bot), +# 不启动不影响任何平台功能。 + environment: prod # 全量同步归档目录与状态目录(容器内路径,compose 已挂载) @@ -16,10 +19,9 @@ stateDir: /data/state # 轮询间隔 pollInterval: 10s -# ---------- 飞书 ---------- -# 在飞书开放平台创建自建应用后获取: -# appId / appSecret:应用凭证 -# chatId:目标群会话 ID +# ---------- 飞书(自建应用,自己的凭证) ---------- +# appId / appSecret:在飞书开放平台创建自建应用后获取 +# chatId:接收通知的群会话 ID feishu: appId: "" appSecret: "" diff --git a/config/openapi/config.yaml b/config/openapi/config.yaml index 863eddd..1bd54e0 100644 --- a/config/openapi/config.yaml +++ b/config/openapi/config.yaml @@ -1,7 +1,9 @@ # ============================================================ -# iotlcm-openapi 配置示例 +# iotlcm-openapi 配置 # -# cp config.example.yaml config.yaml +# 本文件随部署仓分发,已带可运行默认值,无需复制或改名。 +# 正式上线前请修改口令等敏感项;修改时需与 docker-compose.yml、 +# schema/init.sql 及 config/ 下其他文件保持一致(详见 README)。 # ============================================================ system: diff --git a/config/sms/config.yaml b/config/sms/config.yaml index 9f53eae..5510339 100644 --- a/config/sms/config.yaml +++ b/config/sms/config.yaml @@ -1,10 +1,9 @@ # ============================================================ -# iotlcm-sms 配置示例 +# iotlcm-sms 配置 # -# cp config.example.yaml config.yaml -# -# 短信服务商的全局凭证与签名由本服务持有, -# 调用方(admin-svr / app-server)只传模板 ID 与短信内容。 +# 本文件随部署仓分发,已带可运行默认值,无需复制或改名。 +# 正式上线前请修改口令等敏感项;修改时需与 docker-compose.yml、 +# schema/init.sql 及 config/ 下其他文件保持一致(详见 README)。 # ============================================================ # 服务商:1=阿里云,2=腾讯云 diff --git a/config/upstream-chan/config.yaml b/config/upstream-chan/config.yaml index b55a4e8..281f72f 100644 --- a/config/upstream-chan/config.yaml +++ b/config/upstream-chan/config.yaml @@ -1,13 +1,9 @@ # ============================================================ -# iotlcm-upstream-chan 配置示例 +# iotlcm-upstream-chan 配置 # -# cp config.example.yaml config.yaml -# -# 本服务负责具体运营商协议对接(移动 OneLink / 电信 CMP / -# 联通 10646 / 各类三方渠道)。 -# -# 注意:接入运营商需要在数据库中配置通道(t_sim_channels 等), -# 本文件只配置服务自身参数。 +# 本文件随部署仓分发,已带可运行默认值,无需复制或改名。 +# 正式上线前请修改口令等敏感项;修改时需与 docker-compose.yml、 +# schema/init.sql 及 config/ 下其他文件保持一致(详见 README)。 # ============================================================ system: diff --git a/config/upstream-proxy/config.yaml b/config/upstream-proxy/config.yaml index 585f7e8..4f5eeeb 100644 --- a/config/upstream-proxy/config.yaml +++ b/config/upstream-proxy/config.yaml @@ -1,9 +1,9 @@ # ============================================================ -# iotlcm-upstream-proxy 配置示例 +# iotlcm-upstream-proxy 配置 # -# cp config.example.yaml config.yaml -# -# 本服务是通道侧的缓存与转发层,通常不需要改业务参数。 +# 本文件随部署仓分发,已带可运行默认值,无需复制或改名。 +# 正式上线前请修改口令等敏感项;修改时需与 docker-compose.yml、 +# schema/init.sql 及 config/ 下其他文件保持一致(详见 README)。 # ============================================================ system: diff --git a/config/worker-svr/config.yaml b/config/worker-svr/config.yaml index 169a6c2..43f5ca7 100644 --- a/config/worker-svr/config.yaml +++ b/config/worker-svr/config.yaml @@ -1,10 +1,9 @@ # ============================================================ -# iotlcm-worker-svr 配置示例 +# iotlcm-worker-svr 配置 # -# cp config.example.yaml config.yaml -# -# 本服务是异步中枢:消费 RabbitMQ 队列,执行批次开停复机、 -# 全量同步、流量统计等后台任务。 +# 本文件随部署仓分发,已带可运行默认值,无需复制或改名。 +# 正式上线前请修改口令等敏感项;修改时需与 docker-compose.yml、 +# schema/init.sql 及 config/ 下其他文件保持一致(详见 README)。 # ============================================================ system: From 247e5b2a60b2b63216ab1a2b890b26ef36dcacfe Mon Sep 17 00:00:00 2001 From: MiFaZhan Date: Fri, 30 Oct 2026 09:12:45 +0800 Subject: [PATCH 16/24] =?UTF-8?q?update:=20=E9=95=9C=E5=83=8F=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=E5=8D=95=E4=BB=93=E5=BA=93=20iotlcm/iotlcm=EF=BC=8Cta?= =?UTF-8?q?g=20=E4=B8=BA=E3=80=8C=E6=9C=8D=E5=8A=A1=E5=90=8D-=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E3=80=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 阿里云 ACR 的仓库地址结构是 /<命名空间>/<镜像仓库>:, 此前每个服务单独建了一个镜像仓库(iotlcm/mysql、iotlcm/iotlcm-admin-svr …), 现按要求统一到同一个镜像仓库 iotlcm/iotlcm,服务名放进 tag。 镜像地址变化: crpi-.../iotlcm/iotlcm-admin-svr:v1.0.4 → crpi-.../iotlcm/iotlcm:iotlcm-admin-svr-v1.0.4 17 个镜像(12 业务 + 5 基础组件)已重新打 tag 推送到单仓库并验证。 已验证 docker compose pull 全部拉取成功、14 个默认服务正常启动、 admin-svr/openapi/sms 健康检查 200、数据库 95 表。 Jenkins 流水线同步改为推送到 iotlcm/iotlcm,tag 自动拼接服务名。 --- README.md | 15 ++++++++++++++- docker-compose.yml | 34 +++++++++++++++++----------------- 2 files changed, 31 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 809ae95..88fbf15 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,20 @@ docker compose --profile with-nginx up -d # 自带反向代理 ## 镜像版本 -当前部署编排固定使用业务镜像 `v1.0.4`;`iotlcm-app-server` 与 `iotlcm-app-web` 固定为 `v1.0.2`。升级时请在 `docker-compose.yml` 中同步更新对应 tag,不要改用 `latest`。 +所有镜像(含基础组件)都在**同一个镜像仓库** `<镜像仓库>/iotlcm/iotlcm` 下,靠 tag 区分服务与版本: + +```text +crpi-.../iotlcm/iotlcm:mysql-8.0 +crpi-.../iotlcm/iotlcm:redis-7.2 +crpi-.../iotlcm/iotlcm:iotlcm-admin-svr-v1.0.4 +crpi-.../iotlcm/iotlcm:iotlcm-app-server-v1.0.2 +``` + +tag 格式统一为 **`<服务名>-<版本>`**。 + +当前业务版本:大部分服务为 `v1.0.4`,`iotlcm-app-server` / `iotlcm-app-web` 为 `v1.0.2`(源仓最新 tag 就是 v1.0.2)。 + +升级时在 `docker-compose.yml` 中同步更新 tag 的版本部分,不要改用 `latest`。 ## 部署内容 diff --git a/docker-compose.yml b/docker-compose.yml index e9529c8..22a7831 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -18,7 +18,7 @@ services: # ---------------- 基础组件 ---------------- mysql: # 基础组件统走同一镜像仓库(`/iotlcm/`),版本在此固定 - image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/mysql:8.0' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm:mysql-8.0' container_name: iotlcm-mysql restart: always ports: @@ -45,7 +45,7 @@ services: start_period: 40s redis: - image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/redis:7.2' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm:redis-7.2' container_name: iotlcm-redis restart: always ports: @@ -69,7 +69,7 @@ services: retries: 5 rabbitmq: - image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/rabbitmq:4.3.5-management' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm:rabbitmq-4.3.5-management' container_name: iotlcm-rabbitmq hostname: rabbitmq restart: always @@ -92,7 +92,7 @@ services: start_period: 30s consul: - image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/consul:1.22' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm:consul-1.22' container_name: iotlcm-consul restart: always ports: @@ -118,7 +118,7 @@ services: # ---------------- 业务服务 ---------------- admin-svr: - image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-admin-svr:v1.0.4' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm:iotlcm-admin-svr-v1.0.4' container_name: iotlcm-admin-svr restart: always ports: @@ -141,7 +141,7 @@ services: condition: service_healthy admin-ui: - image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-admin-ui:v1.0.4' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm:iotlcm-admin-ui-v1.0.4' container_name: iotlcm-admin-ui restart: always ports: @@ -158,7 +158,7 @@ services: - admin-svr openapi: - image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-openapi:v1.0.4' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm:iotlcm-openapi-v1.0.4' container_name: iotlcm-openapi restart: always ports: @@ -179,7 +179,7 @@ services: condition: service_healthy upstream-chan: - image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-upstream-chan:v1.0.4' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm:iotlcm-upstream-chan-v1.0.4' container_name: iotlcm-upstream-chan restart: always ports: @@ -203,7 +203,7 @@ services: condition: service_started upstream-proxy: - image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-upstream-proxy:v1.0.4' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm:iotlcm-upstream-proxy-v1.0.4' container_name: iotlcm-upstream-proxy restart: always ports: @@ -227,7 +227,7 @@ services: condition: service_started worker-svr: - image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-worker-svr:v1.0.4' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm:iotlcm-worker-svr-v1.0.4' container_name: iotlcm-worker-svr restart: always environment: @@ -249,7 +249,7 @@ services: condition: service_healthy app-server: - image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-app-server:v1.0.2' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm:iotlcm-app-server-v1.0.2' container_name: iotlcm-app-server restart: always ports: @@ -270,7 +270,7 @@ services: condition: service_healthy app-web: - image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-app-web:v1.0.2' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm:iotlcm-app-web-v1.0.2' container_name: iotlcm-app-web restart: always ports: @@ -283,7 +283,7 @@ services: - iotlcm-network sms: - image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-sms:v1.0.4' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm:iotlcm-sms-v1.0.4' container_name: iotlcm-sms hostname: iotlcm-sms restart: always @@ -311,7 +311,7 @@ services: - iotlcm-network bot: - image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-bot:v1.0.4' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm:iotlcm-bot-v1.0.4' container_name: iotlcm-bot restart: unless-stopped environment: @@ -327,7 +327,7 @@ services: - with-bot docs: - image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-docs:v1.0.4' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm:iotlcm-docs-v1.0.4' container_name: iotlcm-docs restart: unless-stopped ports: @@ -343,7 +343,7 @@ services: # 启用后 upstream-chan 的 sim_yd_mock_v5.url 指向 http://onelink-mock:8080/v5/ # (config/upstream-chan 已预置该地址) onelink-mock: - image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm-onelink-mock:v1.0.4' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm:iotlcm-onelink-mock-v1.0.4' container_name: iotlcm-onelink-mock restart: unless-stopped ports: @@ -370,7 +370,7 @@ services: # 若宿主机已有 nginx / 面板,可不启动本容器, # 参考 config/nginx/iotlcm.conf 把 location 段落到宿主机配置。 nginx: - image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/nginx:1.30' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm:nginx-1.30' container_name: iotlcm-nginx restart: always ports: From d84f93ce0acbf7ad94ffe14dcd87a34cd6dfdcb1 Mon Sep 17 00:00:00 2001 From: MiFaZhan Date: Fri, 30 Oct 2026 10:02:25 +0800 Subject: [PATCH 17/24] =?UTF-8?q?feat:=20=E5=86=85=E7=BD=AE=20TDengine=20?= =?UTF-8?q?=E6=97=B6=E5=BA=8F=E5=BA=93=EF=BC=8C=E8=87=AA=E5=8A=A8=E5=BB=BA?= =?UTF-8?q?=E5=BA=93=E5=BB=BA=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 此前编排不含时序库,首页流量/用量图表、单卡流量历史等依赖时序数据的功能 不可用。现补上: - 新增 tdengine 服务(镜像 iotlcm/iotlcm:tdengine-3.3.6.13) 端口 6041(taosAdapter/WebSocket,应用用这个)+ 6030,数据卷 ./data/tdengine - 新增 tdengine-init 一次性服务:等 tdengine 健康后建库建表,并校验超级表存在, 缺表则以非零码退出 - 建库建表 SQL 取自生产环境 SHOW CREATE STABLE(仅结构无数据): iotlcm_daily DURATION 7d KEEP 1095d ms -> t_sim_card_usage_daily iotlcm_monthly DURATION 30d KEEP 1095d ms -> t_sim_card_usage_monthly - 三个服务的 tsdb.tdengine 配置指向 tdengine:6041(admin-svr / app-server / worker-svr) 踩坑记录:taos -f 是按行执行语句的,多行 CREATE STABLE 会报 Incomplete SQL statement,因此 SQL 必须单行;且 taos 出错时退出码仍为 0, 故 run.sh 额外做超级表校验。 已验证:初始化 4 条语句全部 Create OK、0 error;按 worker 的 INSERT 形式 (USING ... TAGS)写入成功、按 admin 的查询形式(SELECT ts,usage_mb,package_code,iccid) 可读回;整栈 15 个服务全 Up,admin-svr/openapi/sms/docs 均 200,worker 无时序库报错。 --- README.md | 16 +++++++++++--- config/admin-svr/config.yaml | 11 ++++++---- config/app-server/config.yaml | 11 ++++++---- config/worker-svr/config.yaml | 10 +++++---- docker-compose.yml | 36 ++++++++++++++++++++++++++++++++ tdengine-init/init.sql | 17 +++++++++++++++ tdengine-init/run.sh | 39 +++++++++++++++++++++++++++++++++++ 7 files changed, 125 insertions(+), 15 deletions(-) create mode 100644 tdengine-init/init.sql create mode 100644 tdengine-init/run.sh diff --git a/README.md b/README.md index 88fbf15..4614ccc 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ tag 格式统一为 **`<服务名>-<版本>`**。 | 类别 | 服务 | | --- | --- | -| 基础组件 | MySQL、Redis、RabbitMQ、Consul | +| 基础组件 | MySQL、Redis、RabbitMQ、Consul、TDengine(流量历史) | | 业务服务 | admin-svr(管理端后端)、admin-ui(管理端前端)、openapi(对外 API)、app-server(小程序后端)、app-web(小程序前端)、upstream-chan(运营商对接)、upstream-proxy(通道缓存转发)、worker-svr(异步任务)、sms(短信)、docs(文档站) | | 可选 | onelink-mock(运营商接口挡板)、bot(飞书通知)、nginx(反向代理) | @@ -82,13 +82,23 @@ iotlcm-deploy/ │ ├── upstream-chan/config.yaml │ ├── upstream-proxy/config.yaml │ └── worker-svr/config.yaml -├── schema/init.sql # 数据库初始化(单文件,首次启动自动执行) +├── schema/init.sql # MySQL 初始化(单文件,首次启动自动执行) +├── tdengine-init/ # TDengine 建库建表(首次启动自动执行) └── data/ # 运行数据(首次启动自动创建,不入版本库) ``` 全新初始化生成 95 张业务表(原有 91 张 + worker 异步恢复所需 4 张);已部署旧库不会自动执行新增迁移,见 `schema/README.md`。 -本编排不包含 TDengine。默认配置中的时序库名称留空,因此首页流量/用量图表等依赖时序数据的功能不能仅靠上述容器完整展示;需要自行部署 TDengine,并在相关服务的 `config.yaml` 中配置连接及数据库名称。管理端登录、菜单、卡信息筛选不依赖这项配置。 +编排已内置 TDengine(流量历史库),由 `tdengine-init` 服务在 TDengine 健康后自动建库建表: + +| 库 | 分片 | 保留 | 超级表 | +| --- | --- | --- | --- | +| `iotlcm_daily` | 7 天 | 3 年 | `t_sim_card_usage_daily` | +| `iotlcm_monthly` | 30 天 | 3 年 | `t_sim_card_usage_monthly` | + +结构取自生产环境,`tdengine-init` 会校验建表结果,缺表则报错退出。业务代码只读写不建表,因此这一步不能跳过。 + +TDengine 版本为 `3.3.6.13`(公开镜像可得),生产用的是 `3.4.0.9`。两者在流量历史的读写上一致;如需与生产完全对齐,可自行构建镜像并替换 `docker-compose.yml` 里的 tag。 ## 上线前必改 diff --git a/config/admin-svr/config.yaml b/config/admin-svr/config.yaml index 784aea4..1b5cbeb 100644 --- a/config/admin-svr/config.yaml +++ b/config/admin-svr/config.yaml @@ -179,10 +179,13 @@ tsdb: database: "TdEngine" tdengine: type: "taosWS" - dsn: ":@ws(:)/" - dbName: "" - dailyDbName: "" - monthlyDbName: "" + # TDengine 3.x WebSocket 地址(容器内服务名 tdengine,端口 6041) + # 口令为 TDengine 默认 root/taosdata;改过口令需同步改这里 + dsn: "root:taosdata@ws(tdengine:6041)/" + # dbName 只是连接池键名与兜底值,不决定实际访问哪个库 + dbName: "iotlcm_daily" + dailyDbName: "iotlcm_daily" + monthlyDbName: "iotlcm_monthly" maxOpenConns: 100 maxIdleConns: 10 diff --git a/config/app-server/config.yaml b/config/app-server/config.yaml index 0ac7726..231ea0e 100644 --- a/config/app-server/config.yaml +++ b/config/app-server/config.yaml @@ -197,10 +197,13 @@ tsdb: database: "TdEngine" tdengine: type: "taosWS" - dsn: ":@ws(:)/" - dbName: "" - dailyDbName: "" - monthlyDbName: "" + # TDengine 3.x WebSocket 地址(容器内服务名 tdengine,端口 6041) + # 口令为 TDengine 默认 root/taosdata;改过口令需同步改这里 + dsn: "root:taosdata@ws(tdengine:6041)/" + # dbName 只是连接池键名与兜底值,不决定实际访问哪个库 + dbName: "iotlcm_daily" + dailyDbName: "iotlcm_daily" + monthlyDbName: "iotlcm_monthly" maxOpenConns: 100 maxIdleConns: 10 diff --git a/config/worker-svr/config.yaml b/config/worker-svr/config.yaml index 43f5ca7..b7958f7 100644 --- a/config/worker-svr/config.yaml +++ b/config/worker-svr/config.yaml @@ -121,11 +121,13 @@ tsdb: database: "TdEngine" tdengine: type: "taosWS" - dsn: ":@ws(:)/" + # TDengine 3.x WebSocket 地址(容器内服务名 tdengine,端口 6041) + # 口令为 TDengine 默认 root/taosdata;改过口令需同步改这里 + dsn: "root:taosdata@ws(tdengine:6041)/" # dbName 只是连接池键名与兜底值,不决定实际访问哪个库 - dbName: "" - dailyDbName: "" - monthlyDbName: "" + dbName: "iotlcm_daily" + dailyDbName: "iotlcm_daily" + monthlyDbName: "iotlcm_monthly" maxOpenConns: 100 maxIdleConns: 10 diff --git a/docker-compose.yml b/docker-compose.yml index 22a7831..9d8d6cb 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -91,6 +91,42 @@ services: retries: 5 start_period: 30s + # 时序数据库:存流量历史(daily / monthly),worker-svr 全量同步写这里 + tdengine: + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm:tdengine-3.3.6.13' + container_name: iotlcm-tdengine + restart: always + ports: + - "${TDENGINE_PORT:-6041}:6041" # taosAdapter(WebSocket,应用用这个) + - "${TDENGINE_NATIVE_PORT:-6030}:6030" + environment: + TZ: '${TZ:-Asia/Shanghai}' + volumes: + - ./data/tdengine/data:/var/lib/taos + - ./data/tdengine/log:/var/log/taos + networks: + - iotlcm-network + healthcheck: + test: ["CMD-SHELL", "curl -sf http://127.0.0.1:6041/-/ping || exit 1"] + interval: 15s + timeout: 5s + retries: 10 + start_period: 30s + + # 建库建表:业务代码不负责建 TDengine 库表,由本服务在 tdengine 健康后执行一次 + tdengine-init: + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm:tdengine-3.3.6.13' + container_name: iotlcm-tdengine-init + restart: "no" + entrypoint: ["sh", "/init/run.sh"] + volumes: + - ./tdengine-init:/init:ro + depends_on: + tdengine: + condition: service_healthy + networks: + - iotlcm-network + consul: image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm:consul-1.22' container_name: iotlcm-consul diff --git a/tdengine-init/init.sql b/tdengine-init/init.sql new file mode 100644 index 0000000..a4033e3 --- /dev/null +++ b/tdengine-init/init.sql @@ -0,0 +1,17 @@ +-- ============================================================ +-- TDengine 初始化:流量历史库与超级表 +-- +-- 结构取自生产环境(SHOW CREATE STABLE 导出),仅结构、无数据。 +-- 由 compose 的 tdengine-init 服务在 tdengine 健康后执行。 +-- +-- 注意:`taos -f` 是**按行**执行语句的,每条 SQL 必须写在一行内, +-- 跨行会被判为 "Incomplete SQL statement"。改本文件时务必保持单行。 +-- +-- 业务代码(worker-svr / admin-svr)只连接读写,不负责建库建表, +-- 因此这一步必须在首次启动时完成,否则单卡流量重试写入会报库表不存在。 +-- ============================================================ + +CREATE DATABASE IF NOT EXISTS iotlcm_daily PRECISION 'ms' KEEP 1095d DURATION 7d; +CREATE DATABASE IF NOT EXISTS iotlcm_monthly PRECISION 'ms' KEEP 1095d DURATION 30d; +CREATE STABLE IF NOT EXISTS iotlcm_daily.t_sim_card_usage_daily (ts TIMESTAMP, usage_mb DOUBLE, package_code VARCHAR(128)) TAGS (iccid VARCHAR(64)); +CREATE STABLE IF NOT EXISTS iotlcm_monthly.t_sim_card_usage_monthly (ts TIMESTAMP, usage_mb DOUBLE, package_code VARCHAR(128)) TAGS (iccid VARCHAR(64)); diff --git a/tdengine-init/run.sh b/tdengine-init/run.sh new file mode 100644 index 0000000..d20aadf --- /dev/null +++ b/tdengine-init/run.sh @@ -0,0 +1,39 @@ +#!/bin/sh +# ============================================================ +# TDengine 初始化执行脚本 +# +# 由 compose 的 tdengine-init 服务调用,在 tdengine 健康后执行一次。 +# 做三件事: +# 1. 过滤掉 init.sql 里的注释与空行(taos -f 会逐行执行, +# 注释行会被当成不完整 SQL 报错) +# 2. 执行建库建表 +# 3. 校验超级表确实存在,缺表则以非零码退出(让 compose 暴露失败) +# ============================================================ +set -eu + +echo "[tdengine-init] 准备 SQL(过滤注释与空行)" +grep -vE '^[[:space:]]*(--|$)' /init/init.sql > /tmp/init.sql +echo "[tdengine-init] 待执行语句数:$(wc -l < /tmp/init.sql)" + +echo "[tdengine-init] 执行建库建表" +taos -h tdengine -f /tmp/init.sql + +echo "[tdengine-init] 校验超级表" +missing=0 +for pair in "iotlcm_daily:t_sim_card_usage_daily" "iotlcm_monthly:t_sim_card_usage_monthly"; do + db=${pair%%:*} + stable=${pair##*:} + if taos -h tdengine -s "show ${db}.stables;" 2>/dev/null | grep -q "$stable"; then + echo " OK ${db}.${stable}" + else + echo " MISS ${db}.${stable}" + missing=1 + fi +done + +if [ "$missing" -ne 0 ]; then + echo "[tdengine-init] 失败:超级表缺失,请检查 taos 输出" + exit 1 +fi + +echo "[tdengine-init] 完成" From d740123174abf422f429e96cb5413cb2418de613 Mon Sep 17 00:00:00 2001 From: MiFaZhan Date: Fri, 30 Oct 2026 11:00:14 +0800 Subject: [PATCH 18/24] =?UTF-8?q?chore:=20run.sh=20=E5=8A=A0=E5=8F=AF?= =?UTF-8?q?=E6=89=A7=E8=A1=8C=E4=BD=8D=EF=BC=8C=E6=A0=A1=E6=AD=A3=E9=A6=96?= =?UTF-8?q?=E6=AC=A1=E5=90=AF=E5=8A=A8=E8=80=97=E6=97=B6=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 实测从空目录执行 docker compose up -d:33 秒全部服务启动, MySQL 初始化出 95 表、TDengine 建表校验通过。 --- README.md | 2 +- tdengine-init/run.sh | 0 2 files changed, 1 insertion(+), 1 deletion(-) mode change 100644 => 100755 tdengine-init/run.sh diff --git a/README.md b/README.md index 4614ccc..07e527b 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ cd iotlcm-deploy docker compose up -d ``` -无需复制或修改任何文件,配置里已带可用默认值。首次启动会自动建库、建表、创建应用账号并导入种子数据,约需 1~2 分钟。 +无需复制或修改任何文件,配置里已带可用默认值。首次启动会自动完成 MySQL 建库建表(95 张)、种子数据导入、时序库建表,实测约 30 秒~1 分钟。 等待 MySQL 健康后其余服务依次启动,观察进度: diff --git a/tdengine-init/run.sh b/tdengine-init/run.sh old mode 100644 new mode 100755 From 69a136b05dadb3070bcd0b0f7886c4d1aa1b5667 Mon Sep 17 00:00:00 2001 From: MiFaZhan Date: Fri, 30 Oct 2026 11:27:41 +0800 Subject: [PATCH 19/24] =?UTF-8?q?ci:=20main/tag=20=E6=8E=A8=E9=80=81?= =?UTF-8?q?=E6=97=B6=E8=87=AA=E5=8A=A8=E9=95=9C=E5=83=8F=E5=88=B0=20Gitee?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增 .gitea/workflows/mirror-to-gitee.yml --- .gitea/workflows/mirror-to-gitee.yml | 48 ++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 .gitea/workflows/mirror-to-gitee.yml diff --git a/.gitea/workflows/mirror-to-gitee.yml b/.gitea/workflows/mirror-to-gitee.yml new file mode 100644 index 0000000..49562d3 --- /dev/null +++ b/.gitea/workflows/mirror-to-gitee.yml @@ -0,0 +1,48 @@ +name: mirror-to-gitee + +# 把本仓同步到 Gitee 企业仓 snowgoat/<同名仓库>。 +# 触发:main 分支推送、v* tag 推送,也可手动。 +on: + push: + branches: + - main + tags: + - 'v*' + workflow_dispatch: + +concurrency: + group: mirror-${{ github.ref }} + cancel-in-progress: true + +jobs: + mirror: + runs-on: host + steps: + - name: 同步到 Gitee + env: + SRC_TOKEN: ${{ secrets.SRC_GIT_TOKEN }} + DST_TOKEN: ${{ secrets.GITEE_TOKEN }} + DST_OWNER: ${{ secrets.GITEE_OWNER }} + DST_USER: ${{ secrets.GITEE_USER }} + REPO_NAME: ${{ github.event.repository.name }} + run: | + set -eu + + if [ -z "${REPO_NAME:-}" ]; then + echo "未取到仓库名,退出"; exit 1 + fi + + WORK=$(mktemp -d) + trap 'rm -rf "$WORK"' EXIT + + echo "源:git.5iot.com/iotlcm-public/$REPO_NAME" + echo "目标:gitee.com/$DST_OWNER/$REPO_NAME" + + git clone --mirror "https://jenkins:${SRC_TOKEN}@git.5iot.com/iotlcm-public/${REPO_NAME}.git" "$WORK/repo.git" + + cd "$WORK/repo.git" + echo "本地 ref:$(git for-each-ref --format='%(refname:short)' | tr '\n' ' ')" + + git push --mirror "https://${DST_USER}:${DST_TOKEN}@gitee.com/${DST_OWNER}/${REPO_NAME}.git" + + echo "✅ 已同步到 Gitee" From 56e930c7d06231df7e2b7d81a93d3d1e22b2380f Mon Sep 17 00:00:00 2001 From: MiFaZhan Date: Fri, 30 Oct 2026 11:50:19 +0800 Subject: [PATCH 20/24] =?UTF-8?q?docs:=20=E5=88=9D=E5=A7=8B=E5=8C=96?= =?UTF-8?q?=E8=84=9A=E6=9C=AC=E6=B3=A8=E9=87=8A=E5=8E=BB=E6=8E=89=E5=86=85?= =?UTF-8?q?=E9=83=A8=E7=8E=AF=E5=A2=83=E6=8E=AA=E8=BE=9E=EF=BC=88=E4=BB=85?= =?UTF-8?q?=E6=B3=A8=E9=87=8A=EF=BC=8C=E4=B8=8D=E5=BD=B1=E5=93=8D=E6=89=A7?= =?UTF-8?q?=E8=A1=8C=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit schema/init.sql 两处「照预演」的注释改为直述授权范围,避免出现内部环境字样。 SQL 语句本身未改动。 --- schema/init.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/schema/init.sql b/schema/init.sql index adaa386..a7b1466 100644 --- a/schema/init.sql +++ b/schema/init.sql @@ -5277,14 +5277,14 @@ VALUES (2123, '月历史用量查询', 257, 2, 'tr_257', 3, '', '', NULL, 1, 0, 'F', '0', '0', 'iot:tSimCardUsageHistory:view', '#', 100, 1, NOW(), '月历史用量查询与导出'); -- 4.2 授权 --- 下载中心 3 条 → 全部角色(照预演:所有角色都有) +-- 下载中心 3 条 → 全部角色 INSERT INTO `sys_role_menu` (`tenant_id`, `role_id`, `menu_id`, `data_scope`) SELECT '000000', r.`role_id`, m.`menu_id`, 0 FROM `sys_role` r JOIN `sys_menu` m ON m.`perms` IN ('common:downloadCenter:list','common:downloadCenter:download','common:downloadCenter:remove') WHERE r.`status` = '0' AND r.`deleted_at` IS NULL; --- 卡基础信息查询 / 月历史用量查询 → dl(代理商)+ enduser(照预演) +-- 卡基础信息查询 / 月历史用量查询 → dl(代理商)+ enduser INSERT INTO `sys_role_menu` (`tenant_id`, `role_id`, `menu_id`, `data_scope`) SELECT '000000', r.`role_id`, m.`menu_id`, 0 FROM `sys_role` r From 6b5fb707c2ea8c316b4d86fba2434f8bb806104d Mon Sep 17 00:00:00 2001 From: MiFaZhan Date: Fri, 30 Oct 2026 13:19:10 +0800 Subject: [PATCH 21/24] =?UTF-8?q?fix:=20docs=20=E9=95=9C=E5=83=8F=E5=8D=87?= =?UTF-8?q?=E7=BA=A7=E5=88=B0=20v1.0.5=EF=BC=8C=E4=BF=AE=E5=A4=8D=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E7=AB=99=E7=99=BD=E5=B1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 测试反馈:访问文档站白屏、点击无反应。 根因:VitePress 配置 base: '/docs/',构建产物里资源引用是绝对路径 /docs/assets/xxx, 而 dist 目录是平铺的;镜像里的 nginx.conf 从根路径服务,/docs/assets/* 全部 404。 (此前修过同一问题,v1.0.4 同步代码时被覆盖回旧配置。) 上游已在 iotlcm-docs 修 nginx.conf(alias 剥前缀 + / -> /docs/ 重定向)并打 v1.0.5, 镜像 iotlcm-docs-v1.0.5 已由 tag 推送自动构建入库。 本仓把 docs 镜像 tag 从 v1.0.4 升到 v1.0.5。 实测:/ 302、/docs/ 200、/docs/manual/web/ 200、核心 CSS 200。 --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 9d8d6cb..fcf720d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -363,7 +363,7 @@ services: - with-bot docs: - image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm:iotlcm-docs-v1.0.4' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm:iotlcm-docs-v1.0.5' container_name: iotlcm-docs restart: unless-stopped ports: From a8a5537c6999eb106911558e345564ac5f9c91be Mon Sep 17 00:00:00 2001 From: MiFaZhan Date: Fri, 30 Oct 2026 13:20:32 +0800 Subject: [PATCH 22/24] =?UTF-8?q?ci:=20=E9=95=9C=E5=83=8F=E5=88=B0=20Gitee?= =?UTF-8?q?=20=E5=A2=9E=E5=8A=A0=E9=80=80=E9=81=BF=E9=87=8D=E8=AF=95?= =?UTF-8?q?=E4=B8=8E=E6=AF=8F=E6=97=A5=E5=85=9C=E5=BA=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Gitee 在推送密集时返回 429 Pending queue overflowed / 408 Authorization server timeout,属服务端限流,原实现一次失败即终止。 - 推送改为最多 5 次退避重试(30s/60s/90s/120s) - 增加每日定时兜底(18:30 UTC = 次日 02:30 北京时间), 避免某次推送失败后长期不同步 --- .gitea/workflows/mirror-to-gitee.yml | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/.gitea/workflows/mirror-to-gitee.yml b/.gitea/workflows/mirror-to-gitee.yml index 49562d3..b8f8b52 100644 --- a/.gitea/workflows/mirror-to-gitee.yml +++ b/.gitea/workflows/mirror-to-gitee.yml @@ -1,13 +1,16 @@ name: mirror-to-gitee # 把本仓同步到 Gitee 企业仓 snowgoat/<同名仓库>。 -# 触发:main 分支推送、v* tag 推送,也可手动。 +# 触发:main 分支推送、v* tag 推送、手动;另有每日兜底重试。 on: push: branches: - main tags: - 'v*' + schedule: + # Gitea Actions 的 cron 用 UTC:18:30 UTC = 次日 02:30 北京时间 + - cron: '30 18 * * *' workflow_dispatch: concurrency: @@ -26,7 +29,7 @@ jobs: DST_USER: ${{ secrets.GITEE_USER }} REPO_NAME: ${{ github.event.repository.name }} run: | - set -eu + set -u if [ -z "${REPO_NAME:-}" ]; then echo "未取到仓库名,退出"; exit 1 @@ -39,10 +42,23 @@ jobs: echo "目标:gitee.com/$DST_OWNER/$REPO_NAME" git clone --mirror "https://jenkins:${SRC_TOKEN}@git.5iot.com/iotlcm-public/${REPO_NAME}.git" "$WORK/repo.git" - cd "$WORK/repo.git" echo "本地 ref:$(git for-each-ref --format='%(refname:short)' | tr '\n' ' ')" - git push --mirror "https://${DST_USER}:${DST_TOKEN}@gitee.com/${DST_OWNER}/${REPO_NAME}.git" + # Gitee 在推送密集时会返回 429 Pending queue overflowed / 408 Authorization server timeout, + # 属服务端限流,退避重试即可。 + attempt=0 + while [ "$attempt" -lt 5 ]; do + attempt=$((attempt + 1)) + echo "----- 推送尝试 $attempt/5" + if git push --mirror "https://${DST_USER}:${DST_TOKEN}@gitee.com/${DST_OWNER}/${REPO_NAME}.git" 2>&1; then + echo "✅ 已同步到 Gitee" + exit 0 + fi + wait_s=$((attempt * 30)) + echo "推送失败,${wait_s}s 后重试" + sleep "$wait_s" + done - echo "✅ 已同步到 Gitee" + echo "❌ 连续 5 次推送失败,请检查 Gitee 状态或令牌" + exit 1 From 01d1e39c345d9c5dad448e2fca09115bf57da8d8 Mon Sep 17 00:00:00 2001 From: MiFaZhan Date: Fri, 30 Oct 2026 13:39:20 +0800 Subject: [PATCH 23/24] =?UTF-8?q?fix:=20docs=20=E9=95=9C=E5=83=8F=E6=94=B9?= =?UTF-8?q?=E5=9B=9E=20v1.0.4=EF=BC=88=E4=BF=AE=E5=A4=8D=E5=B7=B2=E5=B9=B6?= =?UTF-8?q?=E5=85=A5=E8=AF=A5=E7=89=88=E6=9C=AC=EF=BC=8C=E4=B8=8D=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E7=89=88=E6=9C=AC=E5=8F=B7=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 版本号与功能一一对应,这是开源发布版本,修复不能自造新版本号。 - iotlcm-docs 的 git tag v1.0.4 前移到含 nginx 修复的提交(947e22e) - 镜像 iotlcm/iotlcm:iotlcm-docs-v1.0.4 用修复版覆盖(现 digest 8ae5b646) - 删除临时产生的 git tag v1.0.5 与镜像 tag iotlcm-docs-v1.0.5 - 本仓 docs 镜像 tag 从 v1.0.5 改回 v1.0.4 实测重新拉取 v1.0.4 后:/ 302、/docs/ 200、/docs/manual/web/ 200、核心 CSS 200。 --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index fcf720d..9d8d6cb 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -363,7 +363,7 @@ services: - with-bot docs: - image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm:iotlcm-docs-v1.0.5' + image: 'crpi-qflrqrxoohlkkvgc.cn-chengdu.personal.cr.aliyuncs.com/iotlcm/iotlcm:iotlcm-docs-v1.0.4' container_name: iotlcm-docs restart: unless-stopped ports: From eb97c5300a8b17b0d25d07a582ef7e0c6407fd29 Mon Sep 17 00:00:00 2001 From: MiFaZhan Date: Fri, 30 Oct 2026 17:44:02 +0800 Subject: [PATCH 24/24] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BB=A3?= =?UTF-8?q?=E7=90=86=E8=BD=AC=E5=8F=91=E7=AB=AF=E5=8F=A3=E7=BC=BA=E5=A4=B1?= =?UTF-8?q?=E4=B8=8E=20mock=20=E9=80=9A=E9=81=93=E6=9C=AA=E5=AE=9E?= =?UTF-8?q?=E4=BE=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 测试反馈两个问题: 1. 代理转发地址只写了服务名 upstream-chan,未带端口 → 默认连 80 端口被拒。 改为 upstream-chan:8110。已核对其它服务(admin-svr / openapi / app-server / worker-svr)的上游地址均带端口,只有 upstream-proxy 这一处遗漏。 2. 直连 8110 查询报「通道未实例化」。根因在种子数据的 is_normal: 该字段语义是 0=正常、1=异常(chan 侧 CanCreateInstance 只在 *IsNormal==0 时 创建实例;NULL 也不合格)。mock 通道原来写的 1,因此实例从未创建。 改为 0。注意内网演示环境种子同样是 1,属开源版修正。 种子的 ON DUPLICATE KEY UPDATE 已包含 is_normal,老库重跑该段即可修复。 已验证(清空 data 目录从零启动): - t_sim_channels 中 channel_yd_mock 的 is_normal=0 - chan 日志出现 Create channel instance success, chanKey: channel_yd_mock - 日志无 abnormal / 未实例化 相关记录 --- config/upstream-proxy/config.yaml | 4 ++-- schema/init.sql | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/config/upstream-proxy/config.yaml b/config/upstream-proxy/config.yaml index 4f5eeeb..462beaf 100644 --- a/config/upstream-proxy/config.yaml +++ b/config/upstream-proxy/config.yaml @@ -99,8 +99,8 @@ redis: # ---------- 上游通道服务 ---------- gateway: - # 通道服务地址(同 compose 内服务名) - address: "upstream-chan" + # 通道服务地址:必须带端口,只写服务名会走默认 80 端口被拒 + address: "upstream-chan:8110" timeout: 10s # 单次批量转发的总预算上限。 # 非 APN 批量按「单卡超时 × 卡数」计算并以此封顶, diff --git a/schema/init.sql b/schema/init.sql index a7b1466..f56d425 100644 --- a/schema/init.sql +++ b/schema/init.sql @@ -4996,6 +4996,10 @@ INSERT INTO `sys_dict_data` (`dict_type`,`dict_value`,`dict_label`,`dict_sort`,` -- ============================================================ -- Mock 通道(演示卡全部挂在此通道,缺则卡片管理异常) +-- +-- 注意 is_normal:0=正常、1=异常(见 chan 侧 model.SimChannelConfigItemCache.CanCreateInstance, +-- 只有 *IsNormal == 0 才会创建通道实例)。写成 1 会导致「通道未实例化」。 +-- 这里的取值与内网演示环境种子不同(那边是 1),属开源版修正。 -- ============================================================ INSERT INTO `t_sim_channels` ( @@ -5012,7 +5016,7 @@ INSERT INTO `t_sim_channels` ( NULL,NULL,'', NULL,NULL,'http://onelink-mock:8080/',NULL,'000000', 1,1,'2026-10-19 15:35:03',NULL,NOW(), - 1,1,NULL,0, + 1,0,NULL,0, 100,50100,0 ) ON DUPLICATE KEY UPDATE