From cbbe3b87b4d0733c4276acec9a58e9131579573d Mon Sep 17 00:00:00 2001 From: "weicw1996@qq.com" Date: Tue, 22 Sep 2026 20:35:21 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=AB=AF=E5=8F=A3=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sql/20260921_prod_patch_align_dev.sql | 148 ++++++++++++++++++++ sql/20260921_prod_patch_data.sql | 99 +++++++++++++ sql/20260921_prod_patch_data_docker_exec.sh | 101 +++++++++++++ sql/20260921_prod_patch_docker_exec.sh | 106 ++++++++++++++ src/main/resources/application-dev.yml | 2 +- src/main/resources/application-prod.yml | 4 +- src/main/resources/application.yml | 6 +- 7 files changed, 460 insertions(+), 6 deletions(-) create mode 100644 sql/20260921_prod_patch_align_dev.sql create mode 100644 sql/20260921_prod_patch_data.sql create mode 100644 sql/20260921_prod_patch_data_docker_exec.sh create mode 100644 sql/20260921_prod_patch_docker_exec.sh diff --git a/sql/20260921_prod_patch_align_dev.sql b/sql/20260921_prod_patch_align_dev.sql new file mode 100644 index 0000000..d9b67b9 --- /dev/null +++ b/sql/20260921_prod_patch_align_dev.sql @@ -0,0 +1,148 @@ +-- ============================================================================ +-- 生产环境表结构补丁:对齐开发环境 +-- +-- 基准对比: +-- 生产环境 tuanwei_20260921152032l8u4e.sql(MariaDB 10.6.26,54 张表) +-- 开发环境 132.232.214.96:13306/tuanwei(MySQL 8.0.44,57 张表,实时读取) +-- +-- 差异汇总(已逐表逐列逐索引比对,过滤导出格式差异后): +-- 1. 缺失 3 张表 gxmu_student / gxmu_teacher / gxmu_sync_record +-- 2. 缺失 2 个唯一键 gxmu_class.uk_gxmu_class_code +-- sys_organization.uk_sys_organization_code +-- 3. 列差异 0 处 54 张共有表的 965 个列,类型/可空/默认值/注释全部一致 +-- +-- 说明:生产库是 MariaDB 10.6,开发库是 MySQL 8.0,两者 DDL 语法在本补丁 +-- 涉及范围内完全兼容。 +-- 可重复执行:建表用 IF NOT EXISTS,加索引前先查 information_schema。 +-- ============================================================================ + +-- --------------------------------------------------------------------------- +-- 1. 学生名册(与 sys_user 账号分离,见 ADR-0001) +-- --------------------------------------------------------------------------- +CREATE TABLE IF NOT EXISTS `gxmu_student` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `xh` varchar(32) NOT NULL COMMENT '学号(开放平台外部键)', + `xm` varchar(64) DEFAULT NULL COMMENT '姓名', + `xbm` varchar(8) DEFAULT NULL COMMENT '性别码(平台原始)', + `sex` varchar(16) DEFAULT NULL COMMENT '性别名称', + `mzm` varchar(8) DEFAULT NULL COMMENT '民族码(平台原始)', + `nation` varchar(32) DEFAULT NULL COMMENT '民族名称', + `zzmmm` varchar(8) DEFAULT NULL COMMENT '政治面貌码(平台原始)', + `politics` varchar(64) DEFAULT NULL COMMENT '政治面貌名称', + `sfzjh` varchar(32) DEFAULT NULL COMMENT '身份证件号', + `sjh` varchar(32) DEFAULT NULL COMMENT '手机号(认领键)', + `bjm` varchar(64) DEFAULT NULL COMMENT '平台班级码(原始)', + `bh` varchar(64) DEFAULT NULL COMMENT '平台班号(学籍库原始)', + `class_id` int DEFAULT NULL COMMENT '解析出的班级ID', + `college_id` int DEFAULT NULL COMMENT '解析出的学院ID', + `dwh` varchar(64) DEFAULT NULL COMMENT '单位号(平台原始)', + `zyh` varchar(32) DEFAULT NULL COMMENT '专业号', + `zymc` varchar(128) DEFAULT NULL COMMENT '专业名称', + `pyccmc` varchar(32) DEFAULT NULL COMMENT '培养层次', + `sfzx` varchar(8) DEFAULT NULL COMMENT '是否在校', + `xjzt` varchar(32) DEFAULT NULL COMMENT '学籍状态', + `xsdqzt` varchar(32) DEFAULT NULL COMMENT '学生当前状态', + `csrq` varchar(20) DEFAULT NULL COMMENT '出生日期', + `user_id` int DEFAULT NULL COMMENT '认领后的 sys_user.user_id', + `claim_time` datetime DEFAULT NULL COMMENT '认领时间', + `status` tinyint NOT NULL DEFAULT '1' COMMENT '状态:1在校 0毕业/结业/休学', + `sync_time` datetime DEFAULT NULL COMMENT '最近同步时间', + `tenant_id` int DEFAULT NULL COMMENT '租户ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` tinyint NOT NULL DEFAULT '0' COMMENT '删除标记:0未删 1已删', + `row_hash` varchar(32) DEFAULT NULL COMMENT '平台权威字段指纹,用于跳过未变更行', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_gxmu_student_xh` (`tenant_id`,`xh`), + KEY `idx_gxmu_student_xh` (`xh`), + KEY `idx_gxmu_student_sjh` (`sjh`), + KEY `idx_gxmu_student_class` (`class_id`), + KEY `idx_gxmu_student_college` (`college_id`), + KEY `idx_gxmu_student_uid` (`user_id`), + KEY `idx_gxmu_student_status` (`status`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学生名册(开放平台同步)'; + +-- --------------------------------------------------------------------------- +-- 2. 教师名册 +-- --------------------------------------------------------------------------- +CREATE TABLE IF NOT EXISTS `gxmu_teacher` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `jgh` varchar(32) NOT NULL COMMENT '教工号(开放平台外部键)', + `xm` varchar(64) DEFAULT NULL COMMENT '姓名', + `xbm` varchar(8) DEFAULT NULL COMMENT '性别码(平台原始)', + `sex` varchar(16) DEFAULT NULL COMMENT '性别名称', + `dwh` varchar(64) DEFAULT NULL COMMENT '单位号(平台原始)', + `college_id` int DEFAULT NULL COMMENT '解析出的学院ID', + `ksjybh` varchar(64) DEFAULT NULL COMMENT '科室教研室编号', + `sjh` varchar(32) DEFAULT NULL COMMENT '手机号(敏感字段, 不对外输出)', + `status` tinyint NOT NULL DEFAULT '1' COMMENT '状态:1启用 0停用', + `sync_time` datetime DEFAULT NULL COMMENT '最近同步时间', + `tenant_id` int DEFAULT NULL COMMENT '租户ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` tinyint NOT NULL DEFAULT '0' COMMENT '删除标记:0未删 1已删', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_gxmu_teacher_jgh` (`tenant_id`,`jgh`), + KEY `idx_gxmu_teacher_jgh` (`jgh`), + KEY `idx_gxmu_teacher_college` (`college_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='教师名册(开放平台同步)'; + +-- --------------------------------------------------------------------------- +-- 3. 开放平台同步记录 +-- --------------------------------------------------------------------------- +CREATE TABLE IF NOT EXISTS `gxmu_sync_record` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `batch_id` varchar(64) DEFAULT NULL COMMENT '批次号(同一次触发的各段共享)', + `sync_type` varchar(32) NOT NULL COMMENT '同步类型:dept/teacher/class/student', + `trigger_type` varchar(16) NOT NULL COMMENT '触发方式:schedule/manual', + `trigger_user` varchar(100) DEFAULT NULL COMMENT '触发人(手动触发时)', + `start_time` datetime DEFAULT NULL COMMENT '开始时间', + `end_time` datetime DEFAULT NULL COMMENT '结束时间', + `success_count` int NOT NULL DEFAULT '0' COMMENT '成功条数', + `fail_count` int NOT NULL DEFAULT '0' COMMENT '失败条数', + `skip_count` int NOT NULL DEFAULT '0' COMMENT '跳过条数', + `status` tinyint NOT NULL DEFAULT '0' COMMENT '状态:0成功 1失败', + `error_msg` varchar(1000) DEFAULT NULL COMMENT '错误摘要(不含手机号/身份证)', + `tenant_id` int DEFAULT NULL COMMENT '租户ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `idx_gxmu_sync_record_batch` (`batch_id`), + KEY `idx_gxmu_sync_record_start` (`start_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='开放平台同步记录'; + +-- --------------------------------------------------------------------------- +-- 4. 唯一键(幂等 upsert 的前提) +-- 先把手写的空串规范成 NULL,否则唯一键会被一堆 '' 互撞。 +-- 生产库现有数据若存在 (tenant_id, class_code) 或 (tenant_id, organization_code) +-- 重复,加唯一键会失败——见文件末尾的预检查语句。 +-- --------------------------------------------------------------------------- +UPDATE `gxmu_class` SET `class_code` = NULL WHERE `class_code` = ''; +UPDATE `sys_organization` SET `organization_code` = NULL WHERE `organization_code` = ''; + +SET @exist := (SELECT COUNT(*) FROM information_schema.STATISTICS + WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'gxmu_class' + AND INDEX_NAME = 'uk_gxmu_class_code'); +SET @stmt := IF(@exist = 0, + 'ALTER TABLE `gxmu_class` ADD UNIQUE KEY `uk_gxmu_class_code` (`tenant_id`, `class_code`)', + 'SELECT 1'); +PREPARE s FROM @stmt; EXECUTE s; DEALLOCATE PREPARE s; + +SET @exist := (SELECT COUNT(*) FROM information_schema.STATISTICS + WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'sys_organization' + AND INDEX_NAME = 'uk_sys_organization_code'); +SET @stmt := IF(@exist = 0, + 'ALTER TABLE `sys_organization` ADD UNIQUE KEY `uk_sys_organization_code` (`tenant_id`, `organization_code`)', + 'SELECT 1'); +PREPARE s FROM @stmt; EXECUTE s; DEALLOCATE PREPARE s; + +-- ============================================================================ +-- 附:执行前建议先跑这两条预检查,确认无重复值再加唯一键 +-- ============================================================================ +-- SELECT tenant_id, class_code, COUNT(*) c FROM gxmu_class +-- WHERE class_code IS NOT NULL AND class_code <> '' +-- GROUP BY tenant_id, class_code HAVING c > 1; +-- +-- SELECT tenant_id, organization_code, COUNT(*) c FROM sys_organization +-- WHERE organization_code IS NOT NULL AND organization_code <> '' +-- GROUP BY tenant_id, organization_code HAVING c > 1; diff --git a/sql/20260921_prod_patch_data.sql b/sql/20260921_prod_patch_data.sql new file mode 100644 index 0000000..4040e45 --- /dev/null +++ b/sql/20260921_prod_patch_data.sql @@ -0,0 +1,99 @@ +-- ============================================================================ +-- 生产环境数据补丁:开放平台同步相关的角色、菜单、字典 +-- +-- 基准对比: +-- 生产环境 tuanwei_20260921152032l8u4e.sql +-- 开发环境 132.232.214.96:13306/tuanwei(实时读取) +-- +-- 差异汇总(开发相对生产的新增): +-- sys_role +1 294 教师(teacher) +-- sys_menu +8 14400-14407 数据同步/学生名册/教师名册 + 按钮权限 +-- sys_dict +3 9001-9003 开放平台码表 +-- sys_dict_data +2 640/641 性别 男/女 +-- sys_role_menu +8 超管 242 -> 新增菜单 +-- +-- 刻意不同步(经确认): +-- sys_role 293(teach) 已软删除的废弃记录,不带到生产 +-- sys_role_menu 13 条 角色 294 挂老菜单,tenant_id=1 与实际 10049 不符,疑似开发库脏数据 +-- sys_user_role 2 条 用户 832/833 绑定学生角色,属开发库本地测试数据 +-- +-- 可重复执行:全部使用「不存在才插入」的写法。 +-- ============================================================================ + +SET @tenant := 10049; + + +-- --------------------------------------------------------------------------- +-- 1. 角色:教师 +-- --------------------------------------------------------------------------- +INSERT INTO `sys_role` (`role_id`, `role_name`, `role_code`, `comments`, `deleted`, `tenant_id`, `create_time`, `update_time`) +SELECT 294, '教师', 'teacher', '', 0, 10049, NOW(), NOW() +FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `sys_role` WHERE `role_id` = 294); + + +-- --------------------------------------------------------------------------- +-- 2. 菜单:数据同步、学生名册、教师名册及按钮权限 +-- menu_type=0 为菜单(生成路由),menu_type=1 为按钮权限(不生成路由) +-- --------------------------------------------------------------------------- +INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `title`, `path`, `component`, `menu_type`, `sort_number`, `authority`, `hide`, `app_id`, `deleted`, `merchant_code`, `tenant_id`) +SELECT 14400, 8574, '数据同步', '/gxmu/dataSync', '/gxmu/dataSync', 0, 100, '', 0, 0, 0, '', 10049 FROM DUAL +WHERE NOT EXISTS (SELECT 1 FROM `sys_menu` WHERE `menu_id` = 14400); +INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `title`, `path`, `component`, `menu_type`, `sort_number`, `authority`, `hide`, `app_id`, `deleted`, `merchant_code`, `tenant_id`) +SELECT 14401, 14400, '手动同步', '', '', 1, 1, 'gxmu:sync:manual', 0, 0, 0, '', 10049 FROM DUAL +WHERE NOT EXISTS (SELECT 1 FROM `sys_menu` WHERE `menu_id` = 14401); +INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `title`, `path`, `component`, `menu_type`, `sort_number`, `authority`, `hide`, `app_id`, `deleted`, `merchant_code`, `tenant_id`) +SELECT 14402, 8574, '学生名册', '/gxmu/studentRoster', '/gxmu/studentRoster', 0, 105, '', 0, 0, 0, '', 10049 FROM DUAL +WHERE NOT EXISTS (SELECT 1 FROM `sys_menu` WHERE `menu_id` = 14402); +INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `title`, `path`, `component`, `menu_type`, `sort_number`, `authority`, `hide`, `app_id`, `deleted`, `merchant_code`, `tenant_id`) +SELECT 14403, 14402, '名册查询', '', '', 1, 1, 'gxmu:student:list', 0, 0, 0, '', 10049 FROM DUAL +WHERE NOT EXISTS (SELECT 1 FROM `sys_menu` WHERE `menu_id` = 14403); +INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `title`, `path`, `component`, `menu_type`, `sort_number`, `authority`, `hide`, `app_id`, `deleted`, `merchant_code`, `tenant_id`) +SELECT 14404, 14402, '名册导出', '', '', 1, 2, 'gxmu:student:export', 0, 0, 0, '', 10049 FROM DUAL +WHERE NOT EXISTS (SELECT 1 FROM `sys_menu` WHERE `menu_id` = 14404); +INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `title`, `path`, `component`, `menu_type`, `sort_number`, `authority`, `hide`, `app_id`, `deleted`, `merchant_code`, `tenant_id`) +SELECT 14405, 8574, '教师名册', '/gxmu/teacherRoster', '/gxmu/teacherRoster', 0, 106, '', 0, 0, 0, '', 10049 FROM DUAL +WHERE NOT EXISTS (SELECT 1 FROM `sys_menu` WHERE `menu_id` = 14405); +INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `title`, `path`, `component`, `menu_type`, `sort_number`, `authority`, `hide`, `app_id`, `deleted`, `merchant_code`, `tenant_id`) +SELECT 14406, 14405, '名册查询', '', '', 1, 1, 'gxmu:teacher:list', 0, 0, 0, '', 10049 FROM DUAL +WHERE NOT EXISTS (SELECT 1 FROM `sys_menu` WHERE `menu_id` = 14406); +INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `title`, `path`, `component`, `menu_type`, `sort_number`, `authority`, `hide`, `app_id`, `deleted`, `merchant_code`, `tenant_id`) +SELECT 14407, 14405, '名册导出', '', '', 1, 2, 'gxmu:teacher:export', 0, 0, 0, '', 10049 FROM DUAL +WHERE NOT EXISTS (SELECT 1 FROM `sys_menu` WHERE `menu_id` = 14407); + +-- --------------------------------------------------------------------------- +-- 3. 码表:开放平台原始码 -> 名称 +-- 平台只返回代码不返回名称,且平台本身没有码表接口(见 ADR-0006)。 +-- --------------------------------------------------------------------------- +INSERT INTO `sys_dict` (`dict_id`, `dict_code`, `dict_name`, `sort_number`, `comments`, `deleted`, `merchant_code`, `tenant_id`, `create_time`, `update_time`) +SELECT 9001, 'openplat_sex', '开放平台-性别码', 1, '1=男 2=女(已由实测确认)', 0, '', 10049, NOW(), NOW() +FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `sys_dict` WHERE `dict_id` = 9001); +INSERT INTO `sys_dict` (`dict_id`, `dict_code`, `dict_name`, `sort_number`, `comments`, `deleted`, `merchant_code`, `tenant_id`, `create_time`, `update_time`) +SELECT 9002, 'openplat_nation', '开放平台-民族码', 2, '待 RS_JZGXX 授权后用 MZM/MZM1 反推回填', 0, '', 10049, NOW(), NOW() +FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `sys_dict` WHERE `dict_id` = 9002); +INSERT INTO `sys_dict` (`dict_id`, `dict_code`, `dict_name`, `sort_number`, `comments`, `deleted`, `merchant_code`, `tenant_id`, `create_time`, `update_time`) +SELECT 9003, 'openplat_politics', '开放平台-政治面貌码', 3, '待 RS_JZGXX 授权后用 ZZZTM/ZZZTM1 反推回填', 0, '', 10049, NOW(), NOW() +FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `sys_dict` WHERE `dict_id` = 9003); + +-- --------------------------------------------------------------------------- +-- 4. 码表数据:性别 +-- --------------------------------------------------------------------------- +INSERT INTO `sys_dict_data` (`dict_data_id`, `dict_id`, `dict_data_code`, `dict_data_name`, `sort_number`, `comments`, `deleted`, `merchant_code`, `tenant_id`, `create_time`, `update_time`) +SELECT 640, 9001, '1', '男', 1, NULL, 0, '', 10049, NOW(), NOW() +FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `sys_dict_data` WHERE `dict_data_id` = 640); +INSERT INTO `sys_dict_data` (`dict_data_id`, `dict_id`, `dict_data_code`, `dict_data_name`, `sort_number`, `comments`, `deleted`, `merchant_code`, `tenant_id`, `create_time`, `update_time`) +SELECT 641, 9001, '2', '女', 2, NULL, 0, '', 10049, NOW(), NOW() +FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `sys_dict_data` WHERE `dict_data_id` = 641); + +-- --------------------------------------------------------------------------- +-- 5. 给超级管理员(superAdmin)授权新增菜单 +-- sys_role_menu.id 是自增主键,不写死,由数据库分配。 +-- 其它角色请按需在后台「角色管理」里勾选。 +-- --------------------------------------------------------------------------- +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`, `tenant_id`) +SELECT r.`role_id`, m.`menu_id`, 10049 +FROM `sys_role` r +JOIN `sys_menu` m ON m.`menu_id` BETWEEN 14400 AND 14407 +LEFT JOIN `sys_role_menu` rm ON rm.`role_id` = r.`role_id` AND rm.`menu_id` = m.`menu_id` +WHERE r.`role_code` = 'superAdmin' + AND r.`tenant_id` = 10049 + AND rm.`id` IS NULL; diff --git a/sql/20260921_prod_patch_data_docker_exec.sh b/sql/20260921_prod_patch_data_docker_exec.sh new file mode 100644 index 0000000..bcf6534 --- /dev/null +++ b/sql/20260921_prod_patch_data_docker_exec.sh @@ -0,0 +1,101 @@ +docker exec -i 1Panel-mariadb-ZOpD mysql -u tuanwei -p'TytQZsSW5m4wGh38' tuanwei <<'SQLDATA' +-- ============================================================================ +-- 生产环境数据补丁:开放平台同步相关的角色、菜单、字典 +-- +-- 基准对比: +-- 生产环境 tuanwei_20260921152032l8u4e.sql +-- 开发环境 132.232.214.96:13306/tuanwei(实时读取) +-- +-- 差异汇总(开发相对生产的新增): +-- sys_role +1 294 教师(teacher) +-- sys_menu +8 14400-14407 数据同步/学生名册/教师名册 + 按钮权限 +-- sys_dict +3 9001-9003 开放平台码表 +-- sys_dict_data +2 640/641 性别 男/女 +-- sys_role_menu +8 超管 242 -> 新增菜单 +-- +-- 刻意不同步(经确认): +-- sys_role 293(teach) 已软删除的废弃记录,不带到生产 +-- sys_role_menu 13 条 角色 294 挂老菜单,tenant_id=1 与实际 10049 不符,疑似开发库脏数据 +-- sys_user_role 2 条 用户 832/833 绑定学生角色,属开发库本地测试数据 +-- +-- 可重复执行:全部使用「不存在才插入」的写法。 +-- ============================================================================ + +SET @tenant := 10049; + + +-- --------------------------------------------------------------------------- +-- 1. 角色:教师 +-- --------------------------------------------------------------------------- +INSERT INTO `sys_role` (`role_id`, `role_name`, `role_code`, `comments`, `deleted`, `tenant_id`, `create_time`, `update_time`) +SELECT 294, '教师', 'teacher', '', 0, 10049, NOW(), NOW() +FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `sys_role` WHERE `role_id` = 294); + + +-- --------------------------------------------------------------------------- +-- 2. 菜单:数据同步、学生名册、教师名册及按钮权限 +-- menu_type=0 为菜单(生成路由),menu_type=1 为按钮权限(不生成路由) +-- --------------------------------------------------------------------------- +INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `title`, `path`, `component`, `menu_type`, `sort_number`, `authority`, `hide`, `app_id`, `deleted`, `merchant_code`, `tenant_id`) +SELECT 14400, 8574, '数据同步', '/gxmu/dataSync', '/gxmu/dataSync', 0, 100, '', 0, 0, 0, '', 10049 FROM DUAL +WHERE NOT EXISTS (SELECT 1 FROM `sys_menu` WHERE `menu_id` = 14400); +INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `title`, `path`, `component`, `menu_type`, `sort_number`, `authority`, `hide`, `app_id`, `deleted`, `merchant_code`, `tenant_id`) +SELECT 14401, 14400, '手动同步', '', '', 1, 1, 'gxmu:sync:manual', 0, 0, 0, '', 10049 FROM DUAL +WHERE NOT EXISTS (SELECT 1 FROM `sys_menu` WHERE `menu_id` = 14401); +INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `title`, `path`, `component`, `menu_type`, `sort_number`, `authority`, `hide`, `app_id`, `deleted`, `merchant_code`, `tenant_id`) +SELECT 14402, 8574, '学生名册', '/gxmu/studentRoster', '/gxmu/studentRoster', 0, 105, '', 0, 0, 0, '', 10049 FROM DUAL +WHERE NOT EXISTS (SELECT 1 FROM `sys_menu` WHERE `menu_id` = 14402); +INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `title`, `path`, `component`, `menu_type`, `sort_number`, `authority`, `hide`, `app_id`, `deleted`, `merchant_code`, `tenant_id`) +SELECT 14403, 14402, '名册查询', '', '', 1, 1, 'gxmu:student:list', 0, 0, 0, '', 10049 FROM DUAL +WHERE NOT EXISTS (SELECT 1 FROM `sys_menu` WHERE `menu_id` = 14403); +INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `title`, `path`, `component`, `menu_type`, `sort_number`, `authority`, `hide`, `app_id`, `deleted`, `merchant_code`, `tenant_id`) +SELECT 14404, 14402, '名册导出', '', '', 1, 2, 'gxmu:student:export', 0, 0, 0, '', 10049 FROM DUAL +WHERE NOT EXISTS (SELECT 1 FROM `sys_menu` WHERE `menu_id` = 14404); +INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `title`, `path`, `component`, `menu_type`, `sort_number`, `authority`, `hide`, `app_id`, `deleted`, `merchant_code`, `tenant_id`) +SELECT 14405, 8574, '教师名册', '/gxmu/teacherRoster', '/gxmu/teacherRoster', 0, 106, '', 0, 0, 0, '', 10049 FROM DUAL +WHERE NOT EXISTS (SELECT 1 FROM `sys_menu` WHERE `menu_id` = 14405); +INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `title`, `path`, `component`, `menu_type`, `sort_number`, `authority`, `hide`, `app_id`, `deleted`, `merchant_code`, `tenant_id`) +SELECT 14406, 14405, '名册查询', '', '', 1, 1, 'gxmu:teacher:list', 0, 0, 0, '', 10049 FROM DUAL +WHERE NOT EXISTS (SELECT 1 FROM `sys_menu` WHERE `menu_id` = 14406); +INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `title`, `path`, `component`, `menu_type`, `sort_number`, `authority`, `hide`, `app_id`, `deleted`, `merchant_code`, `tenant_id`) +SELECT 14407, 14405, '名册导出', '', '', 1, 2, 'gxmu:teacher:export', 0, 0, 0, '', 10049 FROM DUAL +WHERE NOT EXISTS (SELECT 1 FROM `sys_menu` WHERE `menu_id` = 14407); + +-- --------------------------------------------------------------------------- +-- 3. 码表:开放平台原始码 -> 名称 +-- 平台只返回代码不返回名称,且平台本身没有码表接口(见 ADR-0006)。 +-- --------------------------------------------------------------------------- +INSERT INTO `sys_dict` (`dict_id`, `dict_code`, `dict_name`, `sort_number`, `comments`, `deleted`, `merchant_code`, `tenant_id`, `create_time`, `update_time`) +SELECT 9001, 'openplat_sex', '开放平台-性别码', 1, '1=男 2=女(已由实测确认)', 0, '', 10049, NOW(), NOW() +FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `sys_dict` WHERE `dict_id` = 9001); +INSERT INTO `sys_dict` (`dict_id`, `dict_code`, `dict_name`, `sort_number`, `comments`, `deleted`, `merchant_code`, `tenant_id`, `create_time`, `update_time`) +SELECT 9002, 'openplat_nation', '开放平台-民族码', 2, '待 RS_JZGXX 授权后用 MZM/MZM1 反推回填', 0, '', 10049, NOW(), NOW() +FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `sys_dict` WHERE `dict_id` = 9002); +INSERT INTO `sys_dict` (`dict_id`, `dict_code`, `dict_name`, `sort_number`, `comments`, `deleted`, `merchant_code`, `tenant_id`, `create_time`, `update_time`) +SELECT 9003, 'openplat_politics', '开放平台-政治面貌码', 3, '待 RS_JZGXX 授权后用 ZZZTM/ZZZTM1 反推回填', 0, '', 10049, NOW(), NOW() +FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `sys_dict` WHERE `dict_id` = 9003); + +-- --------------------------------------------------------------------------- +-- 4. 码表数据:性别 +-- --------------------------------------------------------------------------- +INSERT INTO `sys_dict_data` (`dict_data_id`, `dict_id`, `dict_data_code`, `dict_data_name`, `sort_number`, `comments`, `deleted`, `merchant_code`, `tenant_id`, `create_time`, `update_time`) +SELECT 640, 9001, '1', '男', 1, NULL, 0, '', 10049, NOW(), NOW() +FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `sys_dict_data` WHERE `dict_data_id` = 640); +INSERT INTO `sys_dict_data` (`dict_data_id`, `dict_id`, `dict_data_code`, `dict_data_name`, `sort_number`, `comments`, `deleted`, `merchant_code`, `tenant_id`, `create_time`, `update_time`) +SELECT 641, 9001, '2', '女', 2, NULL, 0, '', 10049, NOW(), NOW() +FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `sys_dict_data` WHERE `dict_data_id` = 641); + +-- --------------------------------------------------------------------------- +-- 5. 给超级管理员(superAdmin)授权新增菜单 +-- sys_role_menu.id 是自增主键,不写死,由数据库分配。 +-- 其它角色请按需在后台「角色管理」里勾选。 +-- --------------------------------------------------------------------------- +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`, `tenant_id`) +SELECT r.`role_id`, m.`menu_id`, 10049 +FROM `sys_role` r +JOIN `sys_menu` m ON m.`menu_id` BETWEEN 14400 AND 14407 +LEFT JOIN `sys_role_menu` rm ON rm.`role_id` = r.`role_id` AND rm.`menu_id` = m.`menu_id` +WHERE r.`role_code` = 'superAdmin' + AND r.`tenant_id` = 10049 + AND rm.`id` IS NULL; +SQLDATA diff --git a/sql/20260921_prod_patch_docker_exec.sh b/sql/20260921_prod_patch_docker_exec.sh new file mode 100644 index 0000000..58f4016 --- /dev/null +++ b/sql/20260921_prod_patch_docker_exec.sh @@ -0,0 +1,106 @@ +docker exec -i 1Panel-mariadb-ZOpD mysql -u tuanwei -p'TytQZsSW5m4wGh38' tuanwei <<'SQLPATCH' +CREATE TABLE IF NOT EXISTS `gxmu_student` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `xh` varchar(32) NOT NULL COMMENT '学号(开放平台外部键)', + `xm` varchar(64) DEFAULT NULL COMMENT '姓名', + `xbm` varchar(8) DEFAULT NULL COMMENT '性别码(平台原始)', + `sex` varchar(16) DEFAULT NULL COMMENT '性别名称', + `mzm` varchar(8) DEFAULT NULL COMMENT '民族码(平台原始)', + `nation` varchar(32) DEFAULT NULL COMMENT '民族名称', + `zzmmm` varchar(8) DEFAULT NULL COMMENT '政治面貌码(平台原始)', + `politics` varchar(64) DEFAULT NULL COMMENT '政治面貌名称', + `sfzjh` varchar(32) DEFAULT NULL COMMENT '身份证件号', + `sjh` varchar(32) DEFAULT NULL COMMENT '手机号(认领键)', + `bjm` varchar(64) DEFAULT NULL COMMENT '平台班级码(原始)', + `bh` varchar(64) DEFAULT NULL COMMENT '平台班号(学籍库原始)', + `class_id` int DEFAULT NULL COMMENT '解析出的班级ID', + `college_id` int DEFAULT NULL COMMENT '解析出的学院ID', + `dwh` varchar(64) DEFAULT NULL COMMENT '单位号(平台原始)', + `zyh` varchar(32) DEFAULT NULL COMMENT '专业号', + `zymc` varchar(128) DEFAULT NULL COMMENT '专业名称', + `pyccmc` varchar(32) DEFAULT NULL COMMENT '培养层次', + `sfzx` varchar(8) DEFAULT NULL COMMENT '是否在校', + `xjzt` varchar(32) DEFAULT NULL COMMENT '学籍状态', + `xsdqzt` varchar(32) DEFAULT NULL COMMENT '学生当前状态', + `csrq` varchar(20) DEFAULT NULL COMMENT '出生日期', + `user_id` int DEFAULT NULL COMMENT '认领后的 sys_user.user_id', + `claim_time` datetime DEFAULT NULL COMMENT '认领时间', + `status` tinyint NOT NULL DEFAULT '1' COMMENT '状态:1在校 0毕业/结业/休学', + `sync_time` datetime DEFAULT NULL COMMENT '最近同步时间', + `tenant_id` int DEFAULT NULL COMMENT '租户ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` tinyint NOT NULL DEFAULT '0' COMMENT '删除标记:0未删 1已删', + `row_hash` varchar(32) DEFAULT NULL COMMENT '平台权威字段指纹,用于跳过未变更行', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_gxmu_student_xh` (`tenant_id`,`xh`), + KEY `idx_gxmu_student_xh` (`xh`), + KEY `idx_gxmu_student_sjh` (`sjh`), + KEY `idx_gxmu_student_class` (`class_id`), + KEY `idx_gxmu_student_college` (`college_id`), + KEY `idx_gxmu_student_uid` (`user_id`), + KEY `idx_gxmu_student_status` (`status`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学生名册(开放平台同步)'; + +CREATE TABLE IF NOT EXISTS `gxmu_teacher` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `jgh` varchar(32) NOT NULL COMMENT '教工号(开放平台外部键)', + `xm` varchar(64) DEFAULT NULL COMMENT '姓名', + `xbm` varchar(8) DEFAULT NULL COMMENT '性别码(平台原始)', + `sex` varchar(16) DEFAULT NULL COMMENT '性别名称', + `dwh` varchar(64) DEFAULT NULL COMMENT '单位号(平台原始)', + `college_id` int DEFAULT NULL COMMENT '解析出的学院ID', + `ksjybh` varchar(64) DEFAULT NULL COMMENT '科室教研室编号', + `sjh` varchar(32) DEFAULT NULL COMMENT '手机号(敏感字段, 不对外输出)', + `status` tinyint NOT NULL DEFAULT '1' COMMENT '状态:1启用 0停用', + `sync_time` datetime DEFAULT NULL COMMENT '最近同步时间', + `tenant_id` int DEFAULT NULL COMMENT '租户ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` tinyint NOT NULL DEFAULT '0' COMMENT '删除标记:0未删 1已删', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_gxmu_teacher_jgh` (`tenant_id`,`jgh`), + KEY `idx_gxmu_teacher_jgh` (`jgh`), + KEY `idx_gxmu_teacher_college` (`college_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='教师名册(开放平台同步)'; + +CREATE TABLE IF NOT EXISTS `gxmu_sync_record` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `batch_id` varchar(64) DEFAULT NULL COMMENT '批次号(同一次触发的各段共享)', + `sync_type` varchar(32) NOT NULL COMMENT '同步类型:dept/teacher/class/student', + `trigger_type` varchar(16) NOT NULL COMMENT '触发方式:schedule/manual', + `trigger_user` varchar(100) DEFAULT NULL COMMENT '触发人(手动触发时)', + `start_time` datetime DEFAULT NULL COMMENT '开始时间', + `end_time` datetime DEFAULT NULL COMMENT '结束时间', + `success_count` int NOT NULL DEFAULT '0' COMMENT '成功条数', + `fail_count` int NOT NULL DEFAULT '0' COMMENT '失败条数', + `skip_count` int NOT NULL DEFAULT '0' COMMENT '跳过条数', + `status` tinyint NOT NULL DEFAULT '0' COMMENT '状态:0成功 1失败', + `error_msg` varchar(1000) DEFAULT NULL COMMENT '错误摘要(不含手机号/身份证)', + `tenant_id` int DEFAULT NULL COMMENT '租户ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `idx_gxmu_sync_record_batch` (`batch_id`), + KEY `idx_gxmu_sync_record_start` (`start_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='开放平台同步记录'; + +UPDATE `gxmu_class` SET `class_code` = NULL WHERE `class_code` = ''; +UPDATE `sys_organization` SET `organization_code` = NULL WHERE `organization_code` = ''; + +SET @exist := (SELECT COUNT(*) FROM information_schema.STATISTICS + WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'gxmu_class' + AND INDEX_NAME = 'uk_gxmu_class_code'); +SET @stmt := IF(@exist = 0, + 'ALTER TABLE `gxmu_class` ADD UNIQUE KEY `uk_gxmu_class_code` (`tenant_id`, `class_code`)', + 'SELECT 1'); +PREPARE s FROM @stmt; EXECUTE s; DEALLOCATE PREPARE s; + +SET @exist := (SELECT COUNT(*) FROM information_schema.STATISTICS + WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'sys_organization' + AND INDEX_NAME = 'uk_sys_organization_code'); +SET @stmt := IF(@exist = 0, + 'ALTER TABLE `sys_organization` ADD UNIQUE KEY `uk_sys_organization_code` (`tenant_id`, `organization_code`)', + 'SELECT 1'); +PREPARE s FROM @stmt; EXECUTE s; DEALLOCATE PREPARE s; +SQLPATCH diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 3cb6711..80b555a 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -20,7 +20,7 @@ logging: # 框架配置 config: # 开发环境接口 - server-url: http://localhost:10051/api + server-url: http://localhost:38927/api # upload-path: /Users/gxwebsoft/Documents/uploads/ upload-path: /Users/liangxin/Project/JAVA/tuanwei-java/ diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index 18cf751..22d7584 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -3,7 +3,7 @@ # 数据源配置 spring: datasource: - url: jdbc:mysql://1Panel-mysql-Bqdt:3306/tuanwei?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&rewriteBatchedStatements=true + url: jdbc:mysql://1Panel-mariadb-ZOpD:3306/tuanwei?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&rewriteBatchedStatements=true username: tuanwei password: TytQZsSW5m4wGh38 driver-class-name: com.mysql.cj.jdbc.Driver @@ -11,7 +11,7 @@ spring: redis: database: 0 - host: 1Panel-redis-Q1LE + host: 1Panel-redis-uc3l port: 6379 password: redis_WSDb88 diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 53a8d42..c5647ba 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,6 +1,6 @@ # 端口 server: - port: 10051 + port: 38927 # 多环境配置 spring: @@ -85,7 +85,7 @@ config: swagger-version: 1.0 token-key: WLgNsWJ8rPjRtnjzX/Gx2RGS80Kwnm/ZeLbvIL+NrBs= server-url: https://server.gxwebsoft.com/api - file-server: http://localhost:10051 + file-server: http://localhost:38927 upload-path: /Users/liangxin/Project/JAVA/tower-java/ local-upload-path: /Users/gxwebsoft/Documents/uploads/ @@ -205,4 +205,4 @@ gxmu: # 默认关闭:首次全量会建出上万账号,需要有意打开。 # 打开后重跑一次教师同步,即可给已有账号补授 teacher 角色。 teacher-account: - enabled: false + enabled: true