init: IotLCM 开源版部署仓

内容:
- docker-compose.yml:14 个基础/业务服务 + 3 个可选 profile(with-mock 挡板、with-bot、with-nginx)
- .env.example:集中管理镜像仓库、口令、端口;必填项缺失时 compose 直接报错退出
- config.example/:10 份配置模板,全部为占位值与注释说明
- schema/:12 个初始化脚本,按文件名顺序由 MySQL initdb 自动执行

脱敏处理:
- 生产/内网 IP、镜像仓库地址、公司名、真实域名全部清除
- 演示账号保留 18 个(出库与划拨依赖账号与部门树的关联),
  昵称/邮箱/手机号/登录IP/头像改为占位或编造值
- 数据库账号与 admin 口令改为初始化时按 .env 注入计算
- 通道模板与 Mock 通道的上游密钥置空
- Mock 通道地址指向 compose 内 onelink-mock 服务

部署时用 --profile with-mock 启动运营商接口挡板,即可在无真实运营商环境时跑通全链路。
This commit is contained in:
MiFaZhan
2026-10-28 13:40:12 +08:00
commit bc2c7bcc6b
26 changed files with 7264 additions and 0 deletions
+77
View File
@@ -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`;