“编译修改”

This commit is contained in:
weizhong committed 2025-10-14 16:48:17 +08:00
1 parent e79bf5a26c
commit 2f2e303781
105 files changed
+26461

No files matched your search

@@ -0,0 +1,58 @@
-- ==============================================
-- 出国申请附件表设计
-- 表名: rs_overseas_application_attachment
-- 说明: 用于管理出国申请的附件信息(支持标题和内容说明)
-- 创建时间: 2025-10-10
-- ==============================================
-- 创建附件表
DROP TABLE IF EXISTS `rs_overseas_application_attachment`;
CREATE TABLE `rs_overseas_application_attachment` (
`attachment_id` bigint(20) NOT NULL COMMENT '附件ID(主键)',
`application_id` bigint(20) NOT NULL COMMENT '出国申请ID(关联rs_overseas_application)',
-- 附件基本信息
`attachment_title` varchar(200) NOT NULL COMMENT '附件标题',
`attachment_content` text COMMENT '附件内容说明',
-- 文件信息
`file_name` varchar(200) NOT NULL COMMENT '文件名称',
`file_original_name` varchar(200) NOT NULL COMMENT '文件原始名称',
`file_path` varchar(500) NOT NULL COMMENT '文件存储路径/OSS URL',
`file_size` bigint(20) DEFAULT NULL COMMENT '文件大小(字节)',
`file_type` varchar(50) DEFAULT NULL COMMENT '文件类型(如pdf、jpg、png、doc等)',
`mime_type` varchar(100) DEFAULT NULL COMMENT 'MIME类型',
-- 上传信息
`upload_time` datetime DEFAULT NULL COMMENT '上传时间',
`upload_user_id` bigint(20) DEFAULT NULL COMMENT '上传人ID',
`upload_user_name` varchar(50) DEFAULT NULL COMMENT '上传人姓名',
-- 系统字段
`tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户编号',
`deleted` char(1) DEFAULT '0' COMMENT '删除标志(0-存在,1-删除)',
`create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门',
`create_by` bigint(20) DEFAULT NULL COMMENT '创建者',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` bigint(20) DEFAULT NULL COMMENT '更新者',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`attachment_id`),
KEY `idx_application_id` (`application_id`) COMMENT '出国申请ID索引',
KEY `idx_tenant_deleted` (`tenant_id`, `deleted`) COMMENT '租户和删除标志联合索引',
KEY `idx_upload_time` (`upload_time`) COMMENT '上传时间索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='出国申请附件表';
-- 添加注释说明
ALTER TABLE `rs_overseas_application_attachment` COMMENT = '出国申请附件表 - 支持附件标题和内容说明';
-- ==============================================
-- 使用说明
-- ==============================================
-- 1. attachment_title: 必填,用于在列表中显示的附件标题
-- 2. attachment_content: 可选,用于详细描述附件内容
-- 3. 支持多种文件格式:PDF、Word、Excel、图片等
-- 4. file_path 存储OSS URL或相对路径
-- 5. 逻辑删除:使用deleted字段,不物理删除数据
-- ==============================================
@@ -0,0 +1,214 @@
-- ======================================
-- 出国行程变更申请表
-- 表名: rs_overseas_itinerary_change
-- 说明: 存储已通过的出国申请的行程变更申请信息
-- 重要说明: 关联的是出国记录表(rs_overseas_record),不是出国申请表
-- 创建时间: 2025-10-13
-- 更新时间: 2025-10-13 - 修改关联逻辑为出国记录表
-- ======================================
DROP TABLE IF EXISTS `rs_overseas_itinerary_change`;
CREATE TABLE `rs_overseas_itinerary_change` (
`change_id` bigint(20) NOT NULL COMMENT '变更ID(主键,雪花ID)',
`record_id` bigint(20) NOT NULL COMMENT '关联出国记录ID(关联rs_overseas_record表)',
`application_id` bigint(20) DEFAULT NULL COMMENT '原出国申请ID(关联rs_overseas_application表,来自记录表冗余)',
`applicant_id` bigint(20) NOT NULL COMMENT '申请人ID(用户ID)',
`applicant_name` varchar(100) NOT NULL COMMENT '申请人姓名',
`department` varchar(200) DEFAULT NULL COMMENT '部门',
-- 原记录信息(从出国记录表冗余存储,便于查询和历史记录)
`original_destination` varchar(100) DEFAULT NULL COMMENT '原目的地国家',
`original_destination_city` varchar(100) DEFAULT NULL COMMENT '原目的地城市',
`original_exit_reason` varchar(100) DEFAULT NULL COMMENT '原出境事由',
`original_start_date` date DEFAULT NULL COMMENT '原出发日期',
`original_end_date` date DEFAULT NULL COMMENT '原返回日期',
`original_duration` int(11) DEFAULT NULL COMMENT '原出国天数',
`original_itinerary` text COMMENT '原行程安排',
`original_accommodation_plan` text COMMENT '原住宿安排',
`original_transportation_plan` text COMMENT '原交通安排',
-- 变更信息
`change_type` varchar(200) NOT NULL COMMENT '变更类型(目的地变更,时间变更,行程变更,多个用逗号分隔)',
`new_destination` varchar(100) DEFAULT NULL COMMENT '新目的地国家',
`new_destination_city` varchar(100) DEFAULT NULL COMMENT '新目的地城市',
`new_exit_reason` varchar(100) DEFAULT NULL COMMENT '新出境事由',
`new_start_date` date DEFAULT NULL COMMENT '新出发日期',
`new_end_date` date DEFAULT NULL COMMENT '新返回日期',
`new_duration` int(11) DEFAULT NULL COMMENT '新出国天数',
`new_itinerary` text COMMENT '新行程安排',
`new_accommodation_plan` text COMMENT '新住宿安排',
`new_transportation_plan` text COMMENT '新交通安排',
-- 变更原因和备注
`change_reason` varchar(500) NOT NULL COMMENT '变更原因(必填)',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
-- 审批信息
`status` char(1) NOT NULL DEFAULT '0' COMMENT '变更状态(0=待审核,1=已通过,2=已拒绝,3=已撤回)',
`approval_opinion` varchar(500) DEFAULT NULL COMMENT '审批意见',
`approval_time` datetime DEFAULT NULL COMMENT '审批时间',
`approver_id` bigint(20) DEFAULT NULL COMMENT '审批人ID',
`approver_name` varchar(100) DEFAULT NULL COMMENT '审批人姓名',
-- 多租户字段
`tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户ID',
-- 标准基础字段
`create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门',
`create_by` bigint(20) DEFAULT NULL COMMENT '创建者',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` bigint(20) DEFAULT NULL COMMENT '更新者',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` tinyint(1) DEFAULT '0' COMMENT '逻辑删除标志(0=未删除,1=已删除)',
PRIMARY KEY (`change_id`),
KEY `idx_record_id` (`record_id`) COMMENT '出国记录ID索引',
KEY `idx_application_id` (`application_id`) COMMENT '原申请ID索引',
KEY `idx_applicant_id` (`applicant_id`) COMMENT '申请人ID索引',
KEY `idx_status` (`status`) COMMENT '状态索引',
KEY `idx_tenant_id` (`tenant_id`) COMMENT '租户ID索引',
KEY `idx_create_time` (`create_time`) COMMENT '创建时间索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='出国行程变更申请表';
-- ======================================
-- 字典数据 - 变更状态
-- ======================================
-- 删除旧字典(如果存在)
DELETE FROM sys_dict_type WHERE dict_type = 'rs_itinerary_change_status';
DELETE FROM sys_dict_data WHERE dict_type = 'rs_itinerary_change_status';
-- 插入字典类型
INSERT INTO sys_dict_type VALUES (
NULL, -- dict_id (自增)
'000000', -- tenant_id
'行程变更状态', -- dict_name
'rs_itinerary_change_status', -- dict_type
1, -- status
NULL, -- create_dept
0, -- create_by
SYSDATE(), -- create_time
NULL, -- update_by
NULL, -- update_time
'出国行程变更申请状态字典' -- remark
);
-- 插入字典数据
INSERT INTO sys_dict_data VALUES (NULL, '000000', 0, '待审核', '0', 'rs_itinerary_change_status', '', 'primary', 'N', 1, NULL, 0, SYSDATE(), NULL, NULL, '待审核状态');
INSERT INTO sys_dict_data VALUES (NULL, '000000', 1, '已通过', '1', 'rs_itinerary_change_status', '', 'success', 'N', 1, NULL, 0, SYSDATE(), NULL, NULL, '已通过状态');
INSERT INTO sys_dict_data VALUES (NULL, '000000', 2, '已拒绝', '2', 'rs_itinerary_change_status', '', 'danger', 'N', 1, NULL, 0, SYSDATE(), NULL, NULL, '已拒绝状态');
INSERT INTO sys_dict_data VALUES (NULL, '000000', 3, '已撤回', '3', 'rs_itinerary_change_status', '', 'info', 'N', 1, NULL, 0, SYSDATE(), NULL, NULL, '已撤回状态');
-- ======================================
-- 字典数据 - 变更类型
-- ======================================
DELETE FROM sys_dict_type WHERE dict_type = 'rs_itinerary_change_type';
DELETE FROM sys_dict_data WHERE dict_type = 'rs_itinerary_change_type';
INSERT INTO sys_dict_type VALUES (
NULL,
'000000',
'行程变更类型',
'rs_itinerary_change_type',
1,
NULL,
0,
SYSDATE(),
NULL,
NULL,
'出国行程变更类型字典'
);
INSERT INTO sys_dict_data VALUES (NULL, '000000', 0, '目的地变更', 'destination_change', 'rs_itinerary_change_type', '', 'primary', 'N', 1, NULL, 0, SYSDATE(), NULL, NULL, '目的地变更');
INSERT INTO sys_dict_data VALUES (NULL, '000000', 1, '时间变更', 'time_change', 'rs_itinerary_change_type', '', 'warning', 'N', 1, NULL, 0, SYSDATE(), NULL, NULL, '时间变更');
INSERT INTO sys_dict_data VALUES (NULL, '000000', 2, '行程变更', 'itinerary_change', 'rs_itinerary_change_type', '', 'info', 'N', 1, NULL, 0, SYSDATE(), NULL, NULL, '行程变更');
INSERT INTO sys_dict_data VALUES (NULL, '000000', 3, '交通方式变更', 'transportation_change', 'rs_itinerary_change_type', '', 'success', 'N', 1, NULL, 0, SYSDATE(), NULL, NULL, '交通方式变更');
INSERT INTO sys_dict_data VALUES (NULL, '000000', 4, '住宿变更', 'accommodation_change', 'rs_itinerary_change_type', '', 'default', 'N', 1, NULL, 0, SYSDATE(), NULL, NULL, '住宿变更');
-- ======================================
-- 字段说明
-- ======================================
/*
核心业务字段:
1. change_id: 变更申请ID(雪花ID,主键)
2. record_id: 关联的出国记录ID(主要关联字段)
3. application_id: 原出国申请ID(冗余字段,来自记录表)
4. applicant_id, applicant_name: 申请人信息
5. original_*: 原记录信息(从出国记录表冗余存储)
6. new_*: 变更后的新信息
7. change_type: 变更类型(支持多种变更类型组合)
8. change_reason: 变更原因(必填)
9. status: 变更状态(0=待审核,1=已通过,2=已拒绝,3=已撤回)
数据关联说明:
- 通过record_id关联rs_overseas_record表(出国记录)
- 变更申请基于已通过的出国申请生成的出国记录
- 选择原出国申请时,实际选择的是出国记录选项卡中的记录
审批字段:
- approval_opinion: 审批意见
- approval_time: 审批时间
- approver_id, approver_name: 审批人信息
标准字段:
- tenant_id: 多租户支持
- create_dept: 创建部门
- create_by, create_time: 创建信息
- update_by, update_time: 更新信息
- deleted: 逻辑删除标志
索引说明:
- PRIMARY KEY: change_id(主键索引)
- idx_record_id: 用于快速查询某个出国记录的所有变更记录
- idx_application_id: 用于快速查询某个出国申请的所有变更记录
- idx_applicant_id: 用于快速查询某个用户的所有变更申请
- idx_status: 用于按状态筛选(待审核、已通过等)
- idx_tenant_id: 多租户数据隔离
- idx_create_time: 按创建时间排序和筛选
*/
-- ======================================
-- 常用查询示例
-- ======================================
-- 1. 查询某个用户的所有变更申请
-- SELECT * FROM rs_overseas_itinerary_change
-- WHERE applicant_id = ? AND deleted = 0
-- ORDER BY create_time DESC;
-- 2. 查询某个出国记录的所有变更记录
-- SELECT * FROM rs_overseas_itinerary_change
-- WHERE record_id = ? AND deleted = 0
-- ORDER BY create_time DESC;
-- 3. 查询待审核的变更申请
-- SELECT * FROM rs_overseas_itinerary_change
-- WHERE status = '0' AND deleted = 0
-- ORDER BY create_time ASC;
-- 4. 查询已通过的变更申请
-- SELECT * FROM rs_overseas_itinerary_change
-- WHERE status = '1' AND deleted = 0
-- ORDER BY approval_time DESC;
-- 5. 统计各状态的变更申请数量
-- SELECT status, COUNT(*) as count
-- FROM rs_overseas_itinerary_change
-- WHERE deleted = 0
-- GROUP BY status;
-- 6. 联合查询变更申请和出国记录详情
-- SELECT
-- c.*,
-- r.applicant_name,
-- r.department,
-- r.destination,
-- r.actual_start_date,
-- r.actual_end_date
-- FROM rs_overseas_itinerary_change c
-- LEFT JOIN rs_overseas_record r ON c.record_id = r.record_id
-- WHERE c.deleted = 0 AND r.deleted = 0
-- ORDER BY c.create_time DESC;
@@ -0,0 +1,58 @@
-- ====================================
-- 出国行程变更表增加本人基本情况字段脚本
-- 用途: 为rs_overseas_itinerary_change表添加性别、出生年月、政治面貌、职称、职务、证件等字段
-- 创建时间: 2025-10-13
-- ====================================
-- 添加新字段到rs_overseas_itinerary_change表
ALTER TABLE `rs_overseas_itinerary_change`
ADD COLUMN `gender` char(1) DEFAULT NULL COMMENT '性别:0-男,1-女' AFTER `applicant_name`,
ADD COLUMN `birth_date` date DEFAULT NULL COMMENT '出生日期' AFTER `gender`,
ADD COLUMN `political_status` varchar(20) DEFAULT NULL COMMENT '政治面貌' AFTER `birth_date`,
ADD COLUMN `professional_title` varchar(100) DEFAULT NULL COMMENT '职称' AFTER `political_status`,
ADD COLUMN `position` varchar(100) DEFAULT NULL COMMENT '职务' AFTER `professional_title`,
ADD COLUMN `document_name` varchar(100) DEFAULT NULL COMMENT '申领证件名称' AFTER `position`,
ADD COLUMN `document_number` varchar(100) DEFAULT NULL COMMENT '证件号码' AFTER `document_name`;
-- 验证字段添加结果
SELECT
COLUMN_NAME AS '字段名',
COLUMN_TYPE AS '字段类型',
IS_NULLABLE AS '允许空值',
COLUMN_COMMENT AS '字段说明'
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'rs_overseas_itinerary_change'
AND COLUMN_NAME IN ('gender', 'birth_date', 'political_status', 'professional_title', 'position', 'document_name', 'document_number')
ORDER BY ORDINAL_POSITION;
-- ====================================
-- 使用说明
-- ====================================
/*
1. 执行前请确认:
- 数据库连接正常
- rs_overseas_itinerary_change表已存在
- 有足够的权限执行ALTER TABLE操作
2. 新增字段说明:
- gender: 性别(0-男,1-女),与出国申请表保持一致
- birth_date: 出生日期
- political_status: 政治面貌(使用字典值)
- professional_title: 职称
- position: 职务
- document_name: 申领证件名称(如:护照、通行证等)
- document_number: 证件号码
3. 字段用途:
- 这些字段会在变更申请时从原出国申请中自动填充
- 用于在"一、本人基本情况"部分显示完整的个人信息
- 所有字段均为可选字段,不影响现有数据
4. 执行后续步骤:
- 更新后端VO类,添加新字段
- 更新前端TypeScript接口定义
- 修改前端表单,在"一、本人基本情况"部分显示新字段
- 更新数据自动填充逻辑
*/
@@ -0,0 +1,187 @@
-- ======================================
-- 出国行程变更审批管理 - 菜单权限配置SQL
-- 创建时间: 2025-10-13
-- 说明: 在人事管理菜单下新增"行程变更审批"菜单及相关权限
-- 用途: 用于审批人员审批出国行程变更申请
-- ======================================
-- ======================================
-- 1. 查询人事管理菜单ID(假设人事管理菜单已存在)
-- ======================================
-- 假设人事管理菜单的menu_id为105(实际使用时需要查询确认)
-- SELECT menu_id, menu_name, parent_id FROM sys_menu WHERE menu_name = '人事管理';
-- ======================================
-- 2. 插入行程变更审批菜单(二级菜单)
-- ======================================
-- 注意:menu_id使用实际系统的菜单ID规则,这里使用示例值2060
-- 注意:parent_id需要替换为实际的"人事管理"菜单ID
INSERT INTO `sys_menu` VALUES (
2060, -- menu_id(菜单ID,需根据实际情况调整)
'行程变更审批', -- menu_name(菜单名称)
105, -- parent_id(父菜单ID,假设105是"人事管理")
6, -- order_num(显示顺序,在人事管理下第6个)
'itinerary-change-approval', -- path(路由地址)
'rs/overseas/itinerary-change-approval', -- component(对应前端页面路径)
'F', -- is_frame(是否外链:N=否)
'1', -- is_cache(是否缓存:1=缓存)
'C', -- menu_type(菜单类型:M=目录,C=菜单,F=按钮)
'0', -- visible(显示状态:0=显示,1=隐藏)
'0', -- status(菜单状态:0=正常,1=停用)
'rs:itineraryChange:approve', -- perms(权限标识)
'circle-check', -- icon(菜单图标)
SYSDATE(), -- create_time(创建时间)
0, -- create_by(创建者)
NULL, -- update_time(更新时间)
NULL, -- update_by(更新者)
'出国行程变更审批管理', -- remark(备注)
0 -- deleted(删除标志:0=未删除,1=已删除)
);
-- ======================================
-- 3. 插入功能按钮权限(三级菜单)
-- ======================================
-- 3.1 查询按钮(查看待审批列表和审批记录)
INSERT INTO `sys_menu` VALUES (
2061, -- menu_id
'行程变更审批查询', -- menu_name
2060, -- parent_id
1, -- order_num
'#', -- path
'', -- component
'F', -- is_frame
'1', -- is_cache
'F', -- menu_type(F=按钮)
'0', -- visible
'0', -- status
'rs:itineraryChange:query', -- perms
'#', -- icon
SYSDATE(), -- create_time
0, -- create_by
NULL, -- update_time
NULL, -- update_by
'查看行程变更详情', -- remark
0 -- deleted
);
-- 3.2 审批按钮
INSERT INTO `sys_menu` VALUES (
2062, -- menu_id
'行程变更审批', -- menu_name
2060, -- parent_id
2, -- order_num
'#', -- path
'', -- component
'F', -- is_frame
'1', -- is_cache
'F', -- menu_type(F=按钮)
'0', -- visible
'0', -- status
'rs:itineraryChange:approve', -- perms
'#', -- icon
SYSDATE(), -- create_time
0, -- create_by
NULL, -- update_time
NULL, -- update_by
'审批行程变更(通过/拒绝)', -- remark
0 -- deleted
);
-- ======================================
-- 4. 菜单权限说明
-- ======================================
--
-- 【菜单结构】
-- 人事管理
-- ├─ 变更行程(申请人员使用,menu_id=2050)
-- │ └─ 变更行程管理(申请页面,menu_id=2051)
-- │ ├─ 查询(rs:itineraryChange:query)
-- │ ├─ 新增(rs:itineraryChange:add)
-- │ ├─ 修改(rs:itineraryChange:edit)
-- │ ├─ 删除(rs:itineraryChange:remove)
-- │ └─ 撤回(rs:itineraryChange:cancel)
-- │
-- └─ 行程变更审批(审批人员使用,menu_id=2060)⬅️ 本SQL新增
-- ├─ 查询(rs:itineraryChange:query)
-- └─ 审批(rs:itineraryChange:approve)
--
-- 【权限标识说明】
-- rs:itineraryChange:query - 查询行程变更详情
-- rs:itineraryChange:approve - 审批行程变更(通过/拒绝)
-- rs:itineraryChange:list - 查询行程变更列表(申请页面使用)
-- rs:itineraryChange:add - 新增行程变更申请(申请页面使用)
-- rs:itineraryChange:edit - 修改行程变更申请(申请页面使用)
-- rs:itineraryChange:remove - 删除行程变更申请(申请页面使用)
-- rs:itineraryChange:cancel - 撤回行程变更申请(申请页面使用)
--
-- 【角色权限配置建议】
-- 1. 申请人员:分配"变更行程"菜单权限(menu_id=2050及其子菜单)
-- - 可以提交、修改、撤回、删除自己的变更申请
-- - 可以查看自己的变更申请列表
--
-- 2. 审批人员:分配"行程变更审批"菜单权限(menu_id=2060及其子菜单)
-- - 可以查看待审批的变更申请列表
-- - 可以审批(通过/拒绝)变更申请
-- - 可以查看审批记录
--
-- 3. 管理员:同时分配两个菜单权限
-- - 既可以申请,也可以审批
--
-- ======================================
-- 5. 角色菜单关联示例(可选)
-- ======================================
-- 假设角色ID:
-- - 申请人员角色ID = 10
-- - 审批人员角色ID = 20
-- - 管理员角色ID = 1
--
-- 5.1 为申请人员角色分配权限
-- INSERT INTO sys_role_menu (role_id, menu_id) VALUES
-- (10, 2050), -- 变更行程菜单
-- (10, 2051), -- 变更行程管理页面
-- (10, 2052), -- 查询按钮
-- (10, 2053), -- 新增按钮
-- (10, 2054), -- 修改按钮
-- (10, 2055), -- 删除按钮
-- (10, 2056); -- 撤回按钮
--
-- 5.2 为审批人员角色分配权限
-- INSERT INTO sys_role_menu (role_id, menu_id) VALUES
-- (20, 2060), -- 行程变更审批菜单
-- (20, 2061), -- 查询按钮
-- (20, 2062); -- 审批按钮
--
-- 5.3 为管理员角色分配权限(拥有全部权限)
-- INSERT INTO sys_role_menu (role_id, menu_id) VALUES
-- (1, 2050), (1, 2051), (1, 2052), (1, 2053), (1, 2054), (1, 2055), (1, 2056), -- 申请相关
-- (1, 2060), (1, 2061), (1, 2062); -- 审批相关
--
-- ======================================
-- 6. 验证SQL
-- ======================================
--
-- 6.1 查询菜单是否创建成功
-- SELECT menu_id, menu_name, parent_id, path, component, perms, menu_type
-- FROM sys_menu
-- WHERE menu_id BETWEEN 2060 AND 2062
-- ORDER BY menu_id;
--
-- 6.2 查询某个角色的菜单权限
-- SELECT m.menu_id, m.menu_name, m.perms, m.menu_type
-- FROM sys_menu m
-- INNER JOIN sys_role_menu rm ON m.menu_id = rm.menu_id
-- WHERE rm.role_id = 20 -- 替换为实际角色ID
-- AND m.menu_id BETWEEN 2050 AND 2062
-- ORDER BY m.menu_id;
--
-- ======================================
-- 7. 删除菜单SQL(回滚用)
-- ======================================
--
-- DELETE FROM sys_role_menu WHERE menu_id BETWEEN 2060 AND 2062;
-- DELETE FROM sys_menu WHERE menu_id BETWEEN 2060 AND 2062;
--
-- ======================================
@@ -0,0 +1,320 @@
-- ======================================
-- 出国行程变更管理 - 完整SQL脚本
-- 包括: 数据库表、字典数据、菜单权限配置
-- 创建时间: 2025-10-13
-- 更新时间: 2025-10-13(修复字符集编码问题)
-- 说明: 一键导入所有配置
-- ======================================
-- ⚠️ 重要:设置字符集,避免中文乱码
SET NAMES utf8mb4;
-- ======================================
-- 第一部分: 数据库表结构
-- ======================================
DROP TABLE IF EXISTS `rs_overseas_itinerary_change`;
CREATE TABLE `rs_overseas_itinerary_change` (
`change_id` bigint(20) NOT NULL COMMENT '变更ID(主键,雪花ID)',
`record_id` bigint(20) NOT NULL COMMENT '关联出国记录ID(关联rs_overseas_record表)',
`application_id` bigint(20) DEFAULT NULL COMMENT '原出国申请ID(关联rs_overseas_application表,来自记录表冗余)',
`applicant_id` bigint(20) NOT NULL COMMENT '申请人ID(用户ID)',
`applicant_name` varchar(100) NOT NULL COMMENT '申请人姓名',
`gender` char(1) DEFAULT NULL COMMENT '性别:0-男,1-女',
`birth_date` date DEFAULT NULL COMMENT '出生日期',
`political_status` varchar(20) DEFAULT NULL COMMENT '政治面貌',
`professional_title` varchar(100) DEFAULT NULL COMMENT '职称',
`position` varchar(100) DEFAULT NULL COMMENT '职务',
`document_name` varchar(100) DEFAULT NULL COMMENT '申领证件名称',
`document_number` varchar(100) DEFAULT NULL COMMENT '证件号码',
`department` varchar(200) DEFAULT NULL COMMENT '部门',
-- 原记录信息(从出国记录表冗余存储)
`original_destination` varchar(100) DEFAULT NULL COMMENT '原目的地国家',
`original_destination_city` varchar(100) DEFAULT NULL COMMENT '原目的地城市',
`original_exit_reason` varchar(100) DEFAULT NULL COMMENT '原出境事由',
`original_start_date` date DEFAULT NULL COMMENT '原出发日期',
`original_end_date` date DEFAULT NULL COMMENT '原返回日期',
`original_duration` int(11) DEFAULT NULL COMMENT '原出国天数',
`original_itinerary` text COMMENT '原行程安排',
`original_accommodation_plan` text COMMENT '原住宿安排',
`original_transportation_plan` text COMMENT '原交通安排',
-- 变更信息
`change_type` varchar(200) NOT NULL COMMENT '变更类型(目的地变更,时间变更,行程变更,多个用逗号分隔)',
`new_destination` varchar(100) DEFAULT NULL COMMENT '新目的地国家',
`new_destination_city` varchar(100) DEFAULT NULL COMMENT '新目的地城市',
`new_exit_reason` varchar(100) DEFAULT NULL COMMENT '新出境事由',
`new_start_date` date DEFAULT NULL COMMENT '新出发日期',
`new_end_date` date DEFAULT NULL COMMENT '新返回日期',
`new_duration` int(11) DEFAULT NULL COMMENT '新出国天数',
`new_itinerary` text COMMENT '新行程安排',
`new_accommodation_plan` text COMMENT '新住宿安排',
`new_transportation_plan` text COMMENT '新交通安排',
-- 变更原因和备注
`change_reason` varchar(500) NOT NULL COMMENT '变更原因(必填)',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
-- 审批信息
`status` char(1) NOT NULL DEFAULT '0' COMMENT '变更状态(0=待审核,1=已通过,2=已拒绝,3=已撤回)',
`approval_opinion` varchar(500) DEFAULT NULL COMMENT '审批意见',
`approval_time` datetime DEFAULT NULL COMMENT '审批时间',
`approver_id` bigint(20) DEFAULT NULL COMMENT '审批人ID',
`approver_name` varchar(100) DEFAULT NULL COMMENT '审批人姓名',
-- 多租户字段
`tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户ID',
-- 标准基础字段
`create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门',
`create_by` bigint(20) DEFAULT NULL COMMENT '创建者',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` bigint(20) DEFAULT NULL COMMENT '更新者',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` tinyint(1) DEFAULT '0' COMMENT '逻辑删除标志(0=未删除,1=已删除)',
PRIMARY KEY (`change_id`),
KEY `idx_record_id` (`record_id`) COMMENT '出国记录ID索引',
KEY `idx_application_id` (`application_id`) COMMENT '原申请ID索引',
KEY `idx_applicant_id` (`applicant_id`) COMMENT '申请人ID索引',
KEY `idx_status` (`status`) COMMENT '状态索引',
KEY `idx_tenant_id` (`tenant_id`) COMMENT '租户ID索引',
KEY `idx_create_time` (`create_time`) COMMENT '创建时间索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='出国行程变更申请表';
-- ======================================
-- 第二部分: 字典数据
-- ======================================
-- 删除旧字典(如果存在)
DELETE FROM sys_dict_type WHERE dict_type = 'rs_itinerary_change_status';
DELETE FROM sys_dict_data WHERE dict_type = 'rs_itinerary_change_status';
DELETE FROM sys_dict_type WHERE dict_type = 'rs_itinerary_change_type';
DELETE FROM sys_dict_data WHERE dict_type = 'rs_itinerary_change_type';
-- 插入字典类型:行程变更状态(使用CONVERT确保正确编码)
INSERT INTO sys_dict_type (dict_id, tenant_id, dict_name, dict_type, create_dept, create_by, create_time, update_by, update_time, remark)
VALUES (
3000000000000001018,
'000000',
CONVERT('行程变更状态' USING utf8mb4),
'rs_itinerary_change_status',
NULL,
0,
SYSDATE(),
NULL,
NULL,
CONVERT('出国行程变更申请状态字典' USING utf8mb4)
);
-- 插入字典数据:行程变更状态(使用CONVERT确保正确编码)
INSERT INTO sys_dict_data (dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark)
VALUES (3000000000000002069, '000000', 0, CONVERT('待审核' USING utf8mb4), '0', 'rs_itinerary_change_status', '', 'primary', 'N', NULL, 0, SYSDATE(), NULL, NULL, CONVERT('待审核状态' USING utf8mb4));
INSERT INTO sys_dict_data (dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark)
VALUES (3000000000000002070, '000000', 1, CONVERT('已通过' USING utf8mb4), '1', 'rs_itinerary_change_status', '', 'success', 'N', NULL, 0, SYSDATE(), NULL, NULL, CONVERT('已通过状态' USING utf8mb4));
INSERT INTO sys_dict_data (dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark)
VALUES (3000000000000002071, '000000', 2, CONVERT('已拒绝' USING utf8mb4), '2', 'rs_itinerary_change_status', '', 'danger', 'N', NULL, 0, SYSDATE(), NULL, NULL, CONVERT('已拒绝状态' USING utf8mb4));
INSERT INTO sys_dict_data (dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark)
VALUES (3000000000000002072, '000000', 3, CONVERT('已撤回' USING utf8mb4), '3', 'rs_itinerary_change_status', '', 'info', 'N', NULL, 0, SYSDATE(), NULL, NULL, CONVERT('已撤回状态' USING utf8mb4));
-- 插入字典类型:行程变更类型(使用CONVERT确保正确编码)
INSERT INTO sys_dict_type (dict_id, tenant_id, dict_name, dict_type, create_dept, create_by, create_time, update_by, update_time, remark)
VALUES (
3000000000000001019,
'000000',
CONVERT('行程变更类型' USING utf8mb4),
'rs_itinerary_change_type',
NULL,
0,
SYSDATE(),
NULL,
NULL,
CONVERT('出国行程变更类型字典' USING utf8mb4)
);
-- 插入字典数据:行程变更类型(使用CONVERT确保正确编码)
INSERT INTO sys_dict_data (dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark)
VALUES (3000000000000002073, '000000', 0, CONVERT('目的地变更' USING utf8mb4), 'destination_change', 'rs_itinerary_change_type', '', 'primary', 'N', NULL, 0, SYSDATE(), NULL, NULL, CONVERT('目的地变更' USING utf8mb4));
INSERT INTO sys_dict_data (dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark)
VALUES (3000000000000002074, '000000', 1, CONVERT('时间变更' USING utf8mb4), 'time_change', 'rs_itinerary_change_type', '', 'warning', 'N', NULL, 0, SYSDATE(), NULL, NULL, CONVERT('时间变更' USING utf8mb4));
INSERT INTO sys_dict_data (dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark)
VALUES (3000000000000002075, '000000', 2, CONVERT('行程变更' USING utf8mb4), 'itinerary_change', 'rs_itinerary_change_type', '', 'info', 'N', NULL, 0, SYSDATE(), NULL, NULL, CONVERT('行程变更' USING utf8mb4));
INSERT INTO sys_dict_data (dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark)
VALUES (3000000000000002076, '000000', 3, CONVERT('交通方式变更' USING utf8mb4), 'transportation_change', 'rs_itinerary_change_type', '', 'success', 'N', NULL, 0, SYSDATE(), NULL, NULL, CONVERT('交通方式变更' USING utf8mb4));
INSERT INTO sys_dict_data (dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark)
VALUES (3000000000000002077, '000000', 4, CONVERT('住宿变更' USING utf8mb4), 'accommodation_change', 'rs_itinerary_change_type', '', 'default', 'N', NULL, 0, SYSDATE(), NULL, NULL, CONVERT('住宿变更' USING utf8mb4));
-- ======================================
-- 第三部分: 菜单权限配置
-- ======================================
-- 注意:menu_id使用2050-2058,请确保这些ID在系统中未被占用
-- 如果已被占用,请替换为其他可用ID
-- 删除旧菜单(如果存在)
DELETE FROM sys_menu WHERE menu_id >= 2050 AND menu_id <= 2058;
DELETE FROM sys_role_menu WHERE menu_id >= 2050 AND menu_id <= 2058;
-- 插入一级菜单:变更行程
INSERT INTO `sys_menu` (menu_id, menu_name, parent_id, order_num, path, component, query_param, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
VALUES (
2050, -- menu_id
'变更行程', -- menu_name
105, -- parent_id(人事管理菜单ID,请根据实际情况调整)
5, -- order_num
'/rs/itinerary-change', -- path
'', -- component
'', -- query_param
0, -- is_frame (0=否,1=是)
1, -- is_cache (0=不缓存,1=缓存)
'C', -- menu_type
'0', -- visible
'0', -- status
'rs:itineraryChange:list', -- perms
'edit', -- icon
103, -- create_dept
1, -- create_by
SYSDATE(), -- create_time
NULL, -- update_by
NULL, -- update_time
'出国行程变更申请管理' -- remark
);
-- 插入二级菜单:变更行程管理
INSERT INTO `sys_menu` (menu_id, menu_name, parent_id, order_num, path, component, query_param, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
VALUES (
2051,
'变更行程管理',
2050,
1,
'index',
'rs/overseas/itinerary-change',
'',
0,
1,
'C',
'0',
'0',
'rs:itineraryChange:list',
'edit',
103,
1,
SYSDATE(),
NULL,
NULL,
'变更行程管理页面'
);
-- 插入功能按钮:查询
INSERT INTO `sys_menu` (menu_id, menu_name, parent_id, order_num, path, component, query_param, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
VALUES (2052, '变更行程查询', 2051, 1, '#', '', '', 0, 1, 'F', '0', '0', 'rs:itineraryChange:query', '#', 103, 1, SYSDATE(), NULL, NULL, '');
-- 插入功能按钮:新增
INSERT INTO `sys_menu` (menu_id, menu_name, parent_id, order_num, path, component, query_param, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
VALUES (2053, '变更行程新增', 2051, 2, '#', '', '', 0, 1, 'F', '0', '0', 'rs:itineraryChange:add', '#', 103, 1, SYSDATE(), NULL, NULL, '');
-- 插入功能按钮:修改
INSERT INTO `sys_menu` (menu_id, menu_name, parent_id, order_num, path, component, query_param, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
VALUES (2054, '变更行程修改', 2051, 3, '#', '', '', 0, 1, 'F', '0', '0', 'rs:itineraryChange:edit', '#', 103, 1, SYSDATE(), NULL, NULL, '');
-- 插入功能按钮:删除
INSERT INTO `sys_menu` (menu_id, menu_name, parent_id, order_num, path, component, query_param, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
VALUES (2055, '变更行程删除', 2051, 4, '#', '', '', 0, 1, 'F', '0', '0', 'rs:itineraryChange:remove', '#', 103, 1, SYSDATE(), NULL, NULL, '');
-- 插入功能按钮:撤回
INSERT INTO `sys_menu` (menu_id, menu_name, parent_id, order_num, path, component, query_param, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
VALUES (2056, '变更行程撤回', 2051, 5, '#', '', '', 0, 1, 'F', '0', '0', 'rs:itineraryChange:cancel', '#', 103, 1, SYSDATE(), NULL, NULL, '');
-- 插入功能按钮:导出
INSERT INTO `sys_menu` (menu_id, menu_name, parent_id, order_num, path, component, query_param, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
VALUES (2057, '变更行程导出', 2051, 6, '#', '', '', 0, 1, 'F', '0', '0', 'rs:itineraryChange:export', '#', 103, 1, SYSDATE(), NULL, NULL, '');
-- 插入功能按钮:审批
INSERT INTO `sys_menu` (menu_id, menu_name, parent_id, order_num, path, component, query_param, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
VALUES (2058, '变更行程审批', 2051, 7, '#', '', '', 0, 1, 'F', '0', '0', 'rs:itineraryChange:approve', '#', 103, 1, SYSDATE(), NULL, NULL, '');
-- ======================================
-- 为管理员角色分配菜单权限(可选)
-- ======================================
-- 注意:role_id需要替换为实际的管理员角色ID(通常为1)
-- 如果需要自动为管理员分配权限,取消下面的注释
-- INSERT INTO `sys_role_menu` VALUES (1, 2050); -- 变更行程菜单
-- INSERT INTO `sys_role_menu` VALUES (1, 2051); -- 变更行程管理页面
-- INSERT INTO `sys_role_menu` VALUES (1, 2052); -- 查询权限
-- INSERT INTO `sys_role_menu` VALUES (1, 2053); -- 新增权限
-- INSERT INTO `sys_role_menu` VALUES (1, 2054); -- 修改权限
-- INSERT INTO `sys_role_menu` VALUES (1, 2055); -- 删除权限
-- INSERT INTO `sys_role_menu` VALUES (1, 2056); -- 撤回权限
-- INSERT INTO `sys_role_menu` VALUES (1, 2057); -- 导出权限
-- INSERT INTO `sys_role_menu` VALUES (1, 2058); -- 审批权限
-- ======================================
-- 验证导入结果
-- ======================================
-- 验证表结构
SELECT '验证表结构' AS '检查项';
SHOW TABLES LIKE 'rs_overseas_itinerary_change';
-- 验证字典数据
SELECT '验证字典数据' AS '检查项';
SELECT dict_type, dict_name FROM sys_dict_type WHERE dict_type LIKE 'rs_itinerary_change%';
SELECT dict_type, COUNT(*) AS count FROM sys_dict_data WHERE dict_type LIKE 'rs_itinerary_change%' GROUP BY dict_type;
-- 验证菜单配置
SELECT '验证菜单配置' AS '检查项';
SELECT menu_id, menu_name, parent_id, perms, menu_type
FROM sys_menu
WHERE menu_id >= 2050 AND menu_id <= 2058
ORDER BY menu_id;
-- ======================================
-- 使用说明
-- ======================================
/*
1. 执行步骤:
- 确保数据库连接正常
- 确保menu_id(2050-2058)在系统中未被占用
- 执行完整SQL脚本
- 检查验证结果
2. 菜单层级结构:
人事管理(105)
└── 变更行程(2050)
└── 变更行程管理(2051)
├── 变更行程查询(2052)
├── 变更行程新增(2053)
├── 变更行程修改(2054)
├── 变更行程删除(2055)
├── 变更行程撤回(2056)
├── 变更行程导出(2057)
└── 变更行程审批(2058)
3. API接口路径:
- 列表查询: GET /rs/itinerary/change/list
- 我的申请: GET /rs/itinerary/change/my/list
- 待审批: GET /rs/itinerary/change/pending/list
- 详情查询: GET /rs/itinerary/change/{changeId}
- 新增申请: POST /rs/itinerary/change
- 修改申请: PUT /rs/itinerary/change
- 删除申请: DELETE /rs/itinerary/change/{changeIds}
- 撤回申请: PUT /rs/itinerary/change/cancel/{changeId}
- 审批申请: PUT /rs/itinerary/change/approve
- 导出列表: POST /rs/itinerary/change/export
- 可用记录: GET /rs/itinerary/change/available-records
- 记录详情: GET /rs/itinerary/change/record/{recordId}
- 变更历史: GET /rs/itinerary/change/record/{recordId}/history
4. 前端页面路径:
- 前端访问: /rs/itinerary-change
- 前端组件: src/views/rs/overseas/itinerary-change.vue
5. 后续操作:
- 在"系统管理-角色管理"中为相应角色分配菜单权限
- 在前端创建对应的Vue组件页面
- 测试所有功能接口
*/
@@ -0,0 +1,278 @@
-- ======================================
-- 出国行程变更管理 - 菜单权限配置SQL
-- 创建时间: 2025-10-13
-- 说明: 在人事管理菜单下新增"变更行程"菜单及相关权限
-- ======================================
-- ======================================
-- 1. 查询人事管理菜单ID(假设人事管理菜单已存在)
-- ======================================
-- 假设人事管理菜单的menu_id为105(实际使用时需要查询确认)
-- SELECT menu_id, menu_name, parent_id FROM sys_menu WHERE menu_name = '人事管理';
-- ======================================
-- 2. 插入变更行程菜单(一级菜单:变更行程)
-- ======================================
-- 注意:menu_id使用实际系统的菜单ID规则,这里使用示例值2050
-- 注意:parent_id需要替换为实际的"人事管理"菜单ID
INSERT INTO `sys_menu` VALUES (
2050, -- menu_id(菜单ID,需根据实际情况调整)
'变更行程', -- menu_name(菜单名称)
105, -- parent_id(父菜单ID,假设105是"人事管理")
5, -- order_num(显示顺序,在人事管理下第5个)
'/rs/itinerary-change', -- path(路由地址)
'', -- component(组件路径,空表示Layout)
'F', -- is_frame(是否外链:N=否)
'1', -- is_cache(是否缓存:1=缓存)
'C', -- menu_type(菜单类型:M=目录,C=菜单,F=按钮)
'0', -- visible(显示状态:0=显示,1=隐藏)
'0', -- status(菜单状态:0=正常,1=停用)
'rs:itineraryChange:list', -- perms(权限标识)
'edit', -- icon(菜单图标)
SYSDATE(), -- create_time(创建时间)
0, -- create_by(创建者)
NULL, -- update_time(更新时间)
NULL, -- update_by(更新者)
'出国行程变更申请管理', -- remark(备注)
0 -- deleted(删除标志:0=未删除,1=已删除)
);
-- ======================================
-- 3. 插入变更行程管理页面路由(二级菜单)
-- ======================================
INSERT INTO `sys_menu` VALUES (
2051, -- menu_id
'变更行程管理', -- menu_name
2050, -- parent_id(指向"变更行程"菜单)
1, -- order_num
'index', -- path
'rs/overseas/itinerary-change', -- component(对应前端页面路径)
'F', -- is_frame
'1', -- is_cache
'C', -- menu_type
'0', -- visible
'0', -- status
'rs:itineraryChange:list', -- perms
'edit', -- icon
SYSDATE(), -- create_time
0, -- create_by
NULL, -- update_time
NULL, -- update_by
'变更行程管理页面', -- remark
0 -- deleted
);
-- ======================================
-- 4. 插入功能按钮权限(三级菜单)
-- ======================================
-- 4.1 查询按钮
INSERT INTO `sys_menu` VALUES (
2052, -- menu_id
'变更行程查询', -- menu_name
2051, -- parent_id
1, -- order_num
'#', -- path
'', -- component
'F', -- is_frame
'1', -- is_cache
'F', -- menu_type(F=按钮)
'0', -- visible
'0', -- status
'rs:itineraryChange:query', -- perms
'#', -- icon
SYSDATE(), -- create_time
0, -- create_by
NULL, -- update_time
NULL, -- update_by
'', -- remark
0 -- deleted
);
-- 4.2 新增按钮
INSERT INTO `sys_menu` VALUES (
2053, -- menu_id
'变更行程新增', -- menu_name
2051, -- parent_id
2, -- order_num
'#', -- path
'', -- component
'F', -- is_frame
'1', -- is_cache
'F', -- menu_type
'0', -- visible
'0', -- status
'rs:itineraryChange:add', -- perms
'#', -- icon
SYSDATE(), -- create_time
0, -- create_by
NULL, -- update_time
NULL, -- update_by
'', -- remark
0 -- deleted
);
-- 4.3 修改按钮
INSERT INTO `sys_menu` VALUES (
2054, -- menu_id
'变更行程修改', -- menu_name
2051, -- parent_id
3, -- order_num
'#', -- path
'', -- component
'F', -- is_frame
'1', -- is_cache
'F', -- menu_type
'0', -- visible
'0', -- status
'rs:itineraryChange:edit', -- perms
'#', -- icon
SYSDATE(), -- create_time
0, -- create_by
NULL, -- update_time
NULL, -- update_by
'', -- remark
0 -- deleted
);
-- 4.4 删除按钮
INSERT INTO `sys_menu` VALUES (
2055, -- menu_id
'变更行程删除', -- menu_name
2051, -- parent_id
4, -- order_num
'#', -- path
'', -- component
'F', -- is_frame
'1', -- is_cache
'F', -- menu_type
'0', -- visible
'0', -- status
'rs:itineraryChange:remove', -- perms
'#', -- icon
SYSDATE(), -- create_time
0, -- create_by
NULL, -- update_time
NULL, -- update_by
'', -- remark
0 -- deleted
);
-- 4.5 撤回按钮
INSERT INTO `sys_menu` VALUES (
2056, -- menu_id
'变更行程撤回', -- menu_name
2051, -- parent_id
5, -- order_num
'#', -- path
'', -- component
'F', -- is_frame
'1', -- is_cache
'F', -- menu_type
'0', -- visible
'0', -- status
'rs:itineraryChange:cancel', -- perms
'#', -- icon
SYSDATE(), -- create_time
0, -- create_by
NULL, -- update_time
NULL, -- update_by
'', -- remark
0 -- deleted
);
-- ======================================
-- 5. 为管理员角色分配菜单权限(可选)
-- ======================================
-- 注意:role_id需要替换为实际的管理员角色ID(通常为1)
-- 如果需要自动为管理员分配权限,取消下面的注释
-- INSERT INTO `sys_role_menu` VALUES (1, 2050); -- 变更行程菜单
-- INSERT INTO `sys_role_menu` VALUES (1, 2051); -- 变更行程管理页面
-- INSERT INTO `sys_role_menu` VALUES (1, 2052); -- 查询权限
-- INSERT INTO `sys_role_menu` VALUES (1, 2053); -- 新增权限
-- INSERT INTO `sys_role_menu` VALUES (1, 2054); -- 修改权限
-- INSERT INTO `sys_role_menu` VALUES (1, 2055); -- 删除权限
-- INSERT INTO `sys_role_menu` VALUES (1, 2056); -- 撤回权限
-- INSERT INTO `sys_role_menu` VALUES (1, 2057); -- 导出权限
-- ======================================
-- 6. 验证菜单配置
-- ======================================
-- 查询变更行程菜单及其子菜单
-- SELECT
-- menu_id,
-- menu_name,
-- parent_id,
-- order_num,
-- path,
-- component,
-- perms,
-- menu_type,
-- visible,
-- status
-- FROM sys_menu
-- WHERE menu_id >= 2050 AND menu_id <= 2056
-- ORDER BY menu_id;
-- ======================================
-- 7. 删除菜单配置(回滚用,慎用)
-- ======================================
-- DELETE FROM sys_menu WHERE menu_id >= 2050 AND menu_id <= 2056;
-- DELETE FROM sys_role_menu WHERE menu_id >= 2050 AND menu_id <= 2056;
-- ======================================
-- 菜单结构说明
-- ======================================
/*
菜单层级结构:
人事管理(105)
└── 变更行程(2050)
└── 变更行程管理(2051)
├── 变更行程查询(2052)- rs:itineraryChange:query
├── 变更行程新增(2053)- rs:itineraryChange:add
├── 变更行程修改(2054)- rs:itineraryChange:edit
├── 变更行程删除(2055)- rs:itineraryChange:remove
└── 变更行程撤回(2056)- rs:itineraryChange:cancel
权限标识说明:
- rs:itineraryChange:list - 访问变更行程列表页面
- rs:itineraryChange:query - 查询变更行程详情
- rs:itineraryChange:add - 新增变更申请
- rs:itineraryChange:edit - 修改变更申请(重新提交)
- rs:itineraryChange:remove - 删除变更申请
- rs:itineraryChange:cancel - 撤回变更申请
路由配置:
- 前端访问路径: /rs/itinerary-change
- 前端组件路径: rs/overseas/itinerary-change.vue
*/
-- ======================================
-- 使用说明
-- ======================================
/*
1. 执行前请先确认:
- 人事管理菜单的实际menu_id(本脚本假设为105)
- 确保menu_id(2050-2056)在系统中未被占用
- 确认sys_menu表结构与本脚本一致
2. 执行顺序:
- 先执行菜单插入SQL(第2-4节)
- 再为相应角色分配菜单权限(第5节)
- 最后验证菜单配置(第6节)
3. 权限分配:
- 管理员默认拥有所有权限
- 其他角色需要在"系统管理-角色管理"中分配相应权限
4. 前端路由配置:
- 确保前端已创建对应的Vue组件:src/views/rs/overseas/itinerary-change.vue
- 确保前端路由配置正确
5. 后端接口开发:
- Controller需要使用对应的权限注解:@SaCheckPermission("rs:itineraryChange:xxx")
*/
@@ -0,0 +1,95 @@
-- =====================================================
-- 培训申请表字段补充SQL脚本
-- 目标数据库:hzdyjs_xg (远程数据库)
-- 表名:rs_training_application
-- 执行时间:2025-01-03
-- 描述:添加前端申请培训界面新增的字段
-- =====================================================
-- 1. 检查当前表结构
-- DESC rs_training_application;
-- 2. 备份表数据(可选,建议在生产环境执行)
-- CREATE TABLE rs_training_application_backup AS SELECT * FROM rs_training_application;
-- 3. 一次性添加所有缺失字段
ALTER TABLE `rs_training_application`
ADD COLUMN `course_id` bigint(20) DEFAULT NULL COMMENT '课程ID' AFTER `application_id`,
ADD COLUMN `current_title` varchar(100) DEFAULT NULL COMMENT '现职称' AFTER `position`,
ADD COLUMN `current_position` varchar(50) DEFAULT NULL COMMENT '现岗位' AFTER `current_title`,
ADD COLUMN `work_start_time` date DEFAULT NULL COMMENT '参加工作时间' AFTER `current_position`,
ADD COLUMN `phone` varchar(20) DEFAULT NULL COMMENT '联系电话' AFTER `work_start_time`,
ADD COLUMN `organizer_unit` varchar(200) DEFAULT NULL COMMENT '主办单位' AFTER `phone`,
ADD COLUMN `training_type` varchar(50) DEFAULT NULL COMMENT '培训类型' AFTER `organizer_unit`,
ADD COLUMN `training_fee` decimal(10,2) DEFAULT '0.00' COMMENT '培训费用' AFTER `training_type`,
ADD COLUMN `companions` text DEFAULT NULL COMMENT '同行人员列表(JSON格式)' AFTER `training_fee`,
ADD COLUMN `training_purpose` text DEFAULT NULL COMMENT '培训目的' AFTER `companions`,
ADD COLUMN `attachment_ids` text DEFAULT NULL COMMENT '附件ID列表(逗号分隔)' AFTER `training_purpose`;
-- 4. 验证表结构
-- DESC rs_training_application;
-- 5. 查看更新后的表结构
-- SHOW CREATE TABLE rs_training_application;
-- 6. 测试数据插入(验证用,执行后可删除)
/*
INSERT INTO rs_training_application (
application_id, course_id, course_name, user_id, user_name,
department, position, current_title, current_position,
work_start_time, phone, organizer_unit, training_type,
training_fee, companions, training_purpose, attachment_ids,
reason, status, apply_time, location, duration,
start_time, end_time, tenant_id, create_dept,
create_by, create_time, remark, deleted
) VALUES (
999999999, 0, '测试培训课程', 1, '测试用户',
'人文学院', '教师', '副教授', '教学',
'2020-01-01', '13800138000', '浙江大学', '教学',
1500.00, '[{"teacherId": 2, "teacherName": "李四"}]', '提升教学能力', '1001,1002',
'参加培训提升能力', '0', NOW(), '杭州', 40,
'2025-02-01', '2025-02-05', '000000', 101,
1, NOW(), '测试备注', '0'
);
-- 验证插入的测试数据
SELECT * FROM rs_training_application WHERE application_id = 999999999;
-- 删除测试数据
DELETE FROM rs_training_application WHERE application_id = 999999999;
*/
-- =====================================================
-- 执行结果验证
-- =====================================================
-- 1. 检查字段是否添加成功
-- SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT, COLUMN_COMMENT
-- FROM INFORMATION_SCHEMA.COLUMNS
-- WHERE TABLE_SCHEMA = 'hzdyjs_xg'
-- AND TABLE_NAME = 'rs_training_application'
-- ORDER BY ORDINAL_POSITION;
-- 2. 检查新增字段
-- SELECT COLUMN_NAME, COLUMN_COMMENT
-- FROM INFORMATION_SCHEMA.COLUMNS
-- WHERE TABLE_SCHEMA = 'hzdyjs_xg'
-- AND TABLE_NAME = 'rs_training_application'
-- AND COLUMN_NAME IN ('course_id', 'current_title', 'current_position', 'work_start_time', 'phone', 'organizer_unit', 'training_type', 'training_fee', 'companions', 'training_purpose', 'attachment_ids');
-- =====================================================
-- 字段说明
-- =====================================================
/*
新增字段说明:
1. course_id - 课程ID,关联课程表
2. current_title - 现职称,如:教授、副教授、讲师等
3. current_position - 现岗位,如:教学、管理、其他
4. work_start_time - 参加工作时间
5. phone - 联系电话
6. organizer_unit - 主办单位,培训的组织方
7. training_type - 培训类型,如:教学、德育、行政、管理、其他
8. training_fee - 培训费用
9. companions - 同行人员,JSON格式存储
10. training_purpose - 培训目的
11. attachment_ids - 附件ID列表,逗号分隔
*/
@@ -0,0 +1,28 @@
-- ⚡ 一键修复:添加行程变更表缺失的个人信息字段
-- 直接复制粘贴到MySQL中执行即可!
SET NAMES utf8mb4;
-- 添加8个缺失的个人信息字段
ALTER TABLE rs_overseas_itinerary_change
ADD COLUMN `gender` char(1) DEFAULT NULL COMMENT '性别:0-男,1-女' AFTER `applicant_name`,
ADD COLUMN `birth_date` date DEFAULT NULL COMMENT '出生日期' AFTER `gender`,
ADD COLUMN `political_status` varchar(20) DEFAULT NULL COMMENT '政治面貌' AFTER `birth_date`,
ADD COLUMN `professional_title` varchar(100) DEFAULT NULL COMMENT '职称' AFTER `political_status`,
ADD COLUMN `position` varchar(100) DEFAULT NULL COMMENT '职务' AFTER `professional_title`,
ADD COLUMN `document_name` varchar(100) DEFAULT NULL COMMENT '申领证件名称' AFTER `position`,
ADD COLUMN `document_number` varchar(100) DEFAULT NULL COMMENT '证件号码' AFTER `document_name`,
ADD COLUMN `department` varchar(200) DEFAULT NULL COMMENT '部门' AFTER `document_number`;
-- 验证修复结果(字段数量应该是47)
SELECT COUNT(*) AS '字段数量' FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'rs_overseas_itinerary_change';
-- 查看新添加的字段
SHOW COLUMNS FROM rs_overseas_itinerary_change WHERE Field IN (
'gender', 'birth_date', 'political_status', 'professional_title',
'position', 'document_name', 'document_number', 'department'
);
-- ✅ 修复完成!下一步:重启后端服务
@@ -0,0 +1,96 @@
-- ⚡ 智能修复:只添加缺失的个人信息字段
-- 跳过已存在的字段,只添加缺失的字段
SET NAMES utf8mb4;
-- 添加 gender 字段(如果不存在)
SET @sql = (SELECT IF(
(SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'hzdyjs_xg' AND TABLE_NAME = 'rs_overseas_itinerary_change' AND COLUMN_NAME = 'gender') = 0,
'ALTER TABLE rs_overseas_itinerary_change ADD COLUMN `gender` char(1) DEFAULT NULL COMMENT ''性别:0-男,1-女'' AFTER `applicant_name`;',
'SELECT ''字段 gender 已存在,跳过'' AS result;'
));
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 添加 birth_date 字段(如果不存在)
SET @sql = (SELECT IF(
(SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'hzdyjs_xg' AND TABLE_NAME = 'rs_overseas_itinerary_change' AND COLUMN_NAME = 'birth_date') = 0,
'ALTER TABLE rs_overseas_itinerary_change ADD COLUMN `birth_date` date DEFAULT NULL COMMENT ''出生日期'' AFTER `gender`;',
'SELECT ''字段 birth_date 已存在,跳过'' AS result;'
));
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 添加 political_status 字段(如果不存在)
SET @sql = (SELECT IF(
(SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'hzdyjs_xg' AND TABLE_NAME = 'rs_overseas_itinerary_change' AND COLUMN_NAME = 'political_status') = 0,
'ALTER TABLE rs_overseas_itinerary_change ADD COLUMN `political_status` varchar(20) DEFAULT NULL COMMENT ''政治面貌'' AFTER `birth_date`;',
'SELECT ''字段 political_status 已存在,跳过'' AS result;'
));
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 添加 professional_title 字段(如果不存在)
SET @sql = (SELECT IF(
(SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'hzdyjs_xg' AND TABLE_NAME = 'rs_overseas_itinerary_change' AND COLUMN_NAME = 'professional_title') = 0,
'ALTER TABLE rs_overseas_itinerary_change ADD COLUMN `professional_title` varchar(100) DEFAULT NULL COMMENT ''职称'' AFTER `political_status`;',
'SELECT ''字段 professional_title 已存在,跳过'' AS result;'
));
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 添加 position 字段(如果不存在)
SET @sql = (SELECT IF(
(SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'hzdyjs_xg' AND TABLE_NAME = 'rs_overseas_itinerary_change' AND COLUMN_NAME = 'position') = 0,
'ALTER TABLE rs_overseas_itinerary_change ADD COLUMN `position` varchar(100) DEFAULT NULL COMMENT ''职务'' AFTER `professional_title`;',
'SELECT ''字段 position 已存在,跳过'' AS result;'
));
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 添加 document_name 字段(如果不存在)
SET @sql = (SELECT IF(
(SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'hzdyjs_xg' AND TABLE_NAME = 'rs_overseas_itinerary_change' AND COLUMN_NAME = 'document_name') = 0,
'ALTER TABLE rs_overseas_itinerary_change ADD COLUMN `document_name` varchar(100) DEFAULT NULL COMMENT ''申领证件名称'' AFTER `position`;',
'SELECT ''字段 document_name 已存在,跳过'' AS result;'
));
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 添加 document_number 字段(如果不存在)
SET @sql = (SELECT IF(
(SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'hzdyjs_xg' AND TABLE_NAME = 'rs_overseas_itinerary_change' AND COLUMN_NAME = 'document_number') = 0,
'ALTER TABLE rs_overseas_itinerary_change ADD COLUMN `document_number` varchar(100) DEFAULT NULL COMMENT ''证件号码'' AFTER `document_name`;',
'SELECT ''字段 document_number 已存在,跳过'' AS result;'
));
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- department 字段已存在,跳过
-- 验证修复结果(字段数量应该是47)
SELECT COUNT(*) AS '字段数量' FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'hzdyjs_xg' AND TABLE_NAME = 'rs_overseas_itinerary_change';
-- 查看所有字段
SELECT COLUMN_NAME AS '字段名', COLUMN_TYPE AS '类型', COLUMN_COMMENT AS '注释'
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'hzdyjs_xg' AND TABLE_NAME = 'rs_overseas_itinerary_change'
ORDER BY ORDINAL_POSITION;
-- ✅ 修复完成!下一步:重启后端服务
@@ -0,0 +1,75 @@
-- ============================================================
-- 🔴 紧急修复:出国登记表 political_status 字段长度不足
-- 创建时间: 2025-10-05
-- 问题: Data too long for column 'political_status' at row 1
-- 原因: 字段长度不足以存储完整的政治面貌文本
-- ============================================================
USE hzdyjs_xg;
-- ============================================================
-- 第一步:备份现有数据(安全起见)
-- ============================================================
-- 创建备份表(如果不存在)
CREATE TABLE IF NOT EXISTS rs_overseas_registration_backup_20251005
SELECT * FROM rs_overseas_registration;
CREATE TABLE IF NOT EXISTS rs_overseas_application_backup_20251005
SELECT * FROM rs_overseas_application;
-- ============================================================
-- 第二步:修改字段长度
-- ============================================================
-- 修改出国登记表的 political_status 字段
ALTER TABLE `rs_overseas_registration`
MODIFY COLUMN `political_status` varchar(50) NOT NULL COMMENT '政治面貌';
-- 修改出国申请表的 political_status 字段(保持一致)
ALTER TABLE `rs_overseas_application`
MODIFY COLUMN `political_status` varchar(50) NOT NULL COMMENT '政治面貌';
-- ============================================================
-- 第三步:验证修改结果
-- ============================================================
SELECT
'✅ 字段修改验证' as '步骤',
TABLE_NAME as '表名',
COLUMN_NAME as '字段名',
DATA_TYPE as '数据类型',
CHARACTER_MAXIMUM_LENGTH as '最大长度',
COLUMN_COMMENT as '注释'
FROM
information_schema.COLUMNS
WHERE
TABLE_SCHEMA = 'hzdyjs_xg'
AND TABLE_NAME IN ('rs_overseas_registration', 'rs_overseas_application')
AND COLUMN_NAME = 'political_status';
-- ============================================================
-- 预期结果
-- ============================================================
-- TABLE_NAME | COLUMN_NAME | DATA_TYPE | CHARACTER_MAXIMUM_LENGTH
-- ----------------------------|------------------|-----------|------------------------
-- rs_overseas_registration | political_status | varchar | 50
-- rs_overseas_application | political_status | varchar | 50
-- ============================================================
-- 执行说明
-- ============================================================
-- 1. 直接执行本脚本即可完成修复
-- 2. 执行时间约1-2秒(取决于表中数据量)
-- 3. ALTER TABLE不会丢失现有数据
-- 4. 已自动创建备份表,可随时回滚
-- 5. 修复完成后请测试"新增出国登记"功能
-- ============================================================
-- 问题分析
-- ============================================================
-- 原字段: char(2) 或 varchar(20)
-- 前端传值: 完整中文文本(如"中共党员")
-- UTF-8编码: 4个中文字符 = 12字节
-- 结论: char(2)完全无法存储,varchar(20)也不够安全
-- 修复: varchar(50) 可以存储最长16个中文字符,满足需求
@@ -0,0 +1,18 @@
-- ==========================================
-- 添加OSS ID字段到出国申请表
-- 用于支持安全的文件下载功能
-- ==========================================
-- 添加盖章文件OSS ID字段
ALTER TABLE `rs_overseas_application`
ADD COLUMN `stamped_file_oss_id` BIGINT(20) NULL COMMENT '盖章文件OSS ID' AFTER `stamped_file_upload_status`;
-- 添加党籍保留附件OSS ID字段
ALTER TABLE `rs_overseas_application`
ADD COLUMN `party_retention_file_oss_id` BIGINT(20) NULL COMMENT '党籍保留附件OSS ID' AFTER `party_retention_upload_status`;
-- 添加索引以提升查询性能
ALTER TABLE `rs_overseas_application`
ADD INDEX `idx_stamped_file_oss_id` (`stamped_file_oss_id`),
ADD INDEX `idx_party_retention_file_oss_id` (`party_retention_file_oss_id`);
@@ -0,0 +1,104 @@
-- ============================================================
-- 数据库迁移脚本:为出国申请表添加党籍保留附件字段
-- ============================================================
-- 创建时间:2025-10-10
-- 说明:为支持党籍保留附件上传功能,在 rs_overseas_application 表中添加4个字段
-- 执行方式:直接在生产数据库执行
-- ============================================================
USE hzdyjs_xg;
-- 检查字段是否已存在,如果不存在则添加
SET @dbname = DATABASE();
SET @tablename = 'rs_overseas_application';
-- 添加党籍保留附件文件路径
SET @column_check = (
SELECT COUNT(*)
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @dbname
AND TABLE_NAME = @tablename
AND COLUMN_NAME = 'party_retention_file_path'
);
SET @sql = IF(@column_check = 0,
'ALTER TABLE rs_overseas_application ADD COLUMN party_retention_file_path VARCHAR(500) DEFAULT NULL COMMENT ''党籍保留附件文件路径'' AFTER stamped_file_upload_status',
'SELECT ''字段 party_retention_file_path 已存在,跳过添加'' AS result'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 添加党籍保留附件文件名
SET @column_check = (
SELECT COUNT(*)
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @dbname
AND TABLE_NAME = @tablename
AND COLUMN_NAME = 'party_retention_file_name'
);
SET @sql = IF(@column_check = 0,
'ALTER TABLE rs_overseas_application ADD COLUMN party_retention_file_name VARCHAR(200) DEFAULT NULL COMMENT ''党籍保留附件文件名'' AFTER party_retention_file_path',
'SELECT ''字段 party_retention_file_name 已存在,跳过添加'' AS result'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 添加党籍保留附件上传时间
SET @column_check = (
SELECT COUNT(*)
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @dbname
AND TABLE_NAME = @tablename
AND COLUMN_NAME = 'party_retention_upload_time'
);
SET @sql = IF(@column_check = 0,
'ALTER TABLE rs_overseas_application ADD COLUMN party_retention_upload_time DATETIME DEFAULT NULL COMMENT ''党籍保留附件上传时间'' AFTER party_retention_file_name',
'SELECT ''字段 party_retention_upload_time 已存在,跳过添加'' AS result'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 添加党籍保留附件上传状态
SET @column_check = (
SELECT COUNT(*)
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @dbname
AND TABLE_NAME = @tablename
AND COLUMN_NAME = 'party_retention_upload_status'
);
SET @sql = IF(@column_check = 0,
'ALTER TABLE rs_overseas_application ADD COLUMN party_retention_upload_status VARCHAR(1) DEFAULT ''0'' COMMENT ''党籍保留附件上传状态:0-未上传,1-已上传'' AFTER party_retention_upload_time',
'SELECT ''字段 party_retention_upload_status 已存在,跳过添加'' AS result'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 验证字段是否添加成功
SELECT
COLUMN_NAME AS '字段名',
COLUMN_TYPE AS '字段类型',
COLUMN_DEFAULT AS '默认值',
COLUMN_COMMENT AS '备注'
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'rs_overseas_application'
AND COLUMN_NAME IN (
'party_retention_file_path',
'party_retention_file_name',
'party_retention_upload_time',
'party_retention_upload_status'
)
ORDER BY ORDINAL_POSITION;
-- ============================================================
-- 执行完成提示
-- ============================================================
SELECT '党籍保留附件字段添加完成!请检查上方验证结果。' AS '执行结果';
@@ -0,0 +1,117 @@
-- ======================================
-- 修复行程变更状态字典编码问题
-- ======================================
-- 问题描述:字典数据存在双重UTF-8编码,导致前端显示乱码
-- 根本原因:插入数据时字符集设置不正确,导致UTF-8数据被当作Latin1存储
-- 解决方案:使用正确的字符集连接,重新插入数据
-- 执行时间:2025-10-13
-- ======================================
SET NAMES utf8mb4;
-- 步骤1: 删除旧的字典数据
DELETE FROM sys_dict_data WHERE dict_type = 'rs_itinerary_change_status';
DELETE FROM sys_dict_type WHERE dict_type = 'rs_itinerary_change_status';
-- 步骤2: 插入字典类型(使用CONVERT确保正确编码)
INSERT INTO sys_dict_type (
dict_id,
tenant_id,
dict_name,
dict_type,
create_dept,
create_by,
create_time,
update_by,
update_time,
remark
) VALUES (
3000000000000001018,
'000000',
CONVERT('行程变更状态' USING utf8mb4),
'rs_itinerary_change_status',
NULL,
0,
NOW(),
NULL,
NULL,
CONVERT('出国行程变更申请状态字典' USING utf8mb4)
);
-- 步骤3: 插入字典数据(使用CONVERT确保正确编码)
INSERT INTO sys_dict_data (
dict_code,
tenant_id,
dict_sort,
dict_label,
dict_value,
dict_type,
css_class,
list_class,
is_default,
create_dept,
create_by,
create_time,
update_by,
update_time,
remark
) VALUES
(3000000000000002069, '000000', 0, CONVERT('待审核' USING utf8mb4), '0', 'rs_itinerary_change_status', '', 'primary', 'N', NULL, 0, NOW(), NULL, NULL, CONVERT('待审核状态' USING utf8mb4)),
(3000000000000002070, '000000', 1, CONVERT('已通过' USING utf8mb4), '1', 'rs_itinerary_change_status', '', 'success', 'N', NULL, 0, NOW(), NULL, NULL, CONVERT('已通过状态' USING utf8mb4)),
(3000000000000002071, '000000', 2, CONVERT('已拒绝' USING utf8mb4), '2', 'rs_itinerary_change_status', '', 'danger', 'N', NULL, 0, NOW(), NULL, NULL, CONVERT('已拒绝状态' USING utf8mb4)),
(3000000000000002072, '000000', 3, CONVERT('已撤回' USING utf8mb4), '3', 'rs_itinerary_change_status', '', 'info', 'N', NULL, 0, NOW(), NULL, NULL, CONVERT('已撤回状态' USING utf8mb4));
-- ======================================
-- 验证修复结果
-- ======================================
SELECT '===== 1. 验证字典类型 =====' AS step;
SELECT
dict_id,
dict_name,
dict_type,
HEX(dict_name) as hex_encoding,
LENGTH(dict_name) as byte_length,
CHAR_LENGTH(dict_name) as char_length
FROM sys_dict_type
WHERE dict_type = 'rs_itinerary_change_status';
SELECT '===== 2. 验证字典数据 =====' AS step;
SELECT
dict_code,
dict_label,
dict_value,
HEX(dict_label) as hex_encoding,
LENGTH(dict_label) as byte_length,
CHAR_LENGTH(dict_label) as char_length
FROM sys_dict_data
WHERE dict_type = 'rs_itinerary_change_status'
ORDER BY dict_sort;
SELECT '===== 3. 测试字典关联查询 =====' AS step;
SELECT
c.change_id,
c.applicant_name,
c.status as status_value,
d.dict_label as status_text
FROM rs_overseas_itinerary_change c
LEFT JOIN sys_dict_data d
ON d.dict_value = c.status
AND d.dict_type = 'rs_itinerary_change_status'
WHERE c.deleted = 0
LIMIT 3;
-- ======================================
-- 预期结果说明
-- ======================================
-- 1. HEX编码应该是正确的UTF-8编码,例如:
-- "待审核" = E5BE85E5AEA1E6A0B8
-- "已通过" = E5B7B2E9809AE8BF87
-- "已拒绝" = E5B7B2E68B92E7BB9D
-- "已撤回" = E5B7B2E692A4E59B9E
--
-- 2. byte_length应该是char_length的3倍(UTF-8中文字符占3字节)
--
-- 3. 字典关联查询应该正确返回status_text中文文本
-- ======================================
@@ -0,0 +1,93 @@
-- ============================================================
-- 修复出国登记表 political_status 字段长度
-- 创建时间: 2025-10-04
-- 问题描述: 字段长度不足,导致插入数据时报错
-- 原长度: varchar(20)
-- 新长度: varchar(50)
-- ============================================================
-- 修改 rs_overseas_registration 表的 political_status 字段长度
ALTER TABLE `rs_overseas_registration`
MODIFY COLUMN `political_status` varchar(50) NOT NULL COMMENT '政治面貌';
-- 验证修改
SELECT
TABLE_NAME,
COLUMN_NAME,
DATA_TYPE,
CHARACTER_MAXIMUM_LENGTH,
COLUMN_COMMENT
FROM
information_schema.COLUMNS
WHERE
TABLE_SCHEMA = 'hzdyjs_xg'
AND TABLE_NAME = 'rs_overseas_registration'
AND COLUMN_NAME = 'political_status';
-- ============================================================
-- 同步修改出国申请表(如果需要的话)
-- ============================================================
-- 修改 rs_overseas_application 表的 political_status 字段长度
ALTER TABLE `rs_overseas_application`
MODIFY COLUMN `political_status` varchar(50) NOT NULL COMMENT '政治面貌(字典值1-13)';
-- 验证修改
SELECT
TABLE_NAME,
COLUMN_NAME,
DATA_TYPE,
CHARACTER_MAXIMUM_LENGTH,
COLUMN_COMMENT
FROM
information_schema.COLUMNS
WHERE
TABLE_SCHEMA = 'hzdyjs_xg'
AND TABLE_NAME = 'rs_overseas_application'
AND COLUMN_NAME = 'political_status';
-- ============================================================
-- 政治面貌字典数据统计
-- ============================================================
-- 查看政治面貌字典中最长的标签
SELECT
dict_label,
dict_value,
LENGTH(dict_label) as label_length,
CHAR_LENGTH(dict_label) as char_count
FROM
sys_dict_data
WHERE
dict_type = 'xg_political_status'
ORDER BY
LENGTH(dict_label) DESC;
-- ============================================================
-- 问题分析
-- ============================================================
-- 1. 原字段长度: varchar(20) - 最多20个字节
-- 2. 中文字符编码: UTF-8,每个中文字符占3个字节
-- 3. 最长标签: "中国国民党革命委员会会员" = 13个中文字符 = 39字节
-- 4. 结论: varchar(20)远远不够,需要至少varchar(40),为安全起见设为varchar(50)
-- ============================================================
-- 字典数据长度对比
-- ============================================================
-- 字典标签 | 字符数 | 字节数(UTF-8)
-- ----------------------------|--------|-------------
-- 中国国民党革命委员会会员 | 13 | 39
-- 中国共产主义青年团团员 | 12 | 36
-- 台湾民主自治同盟盟员 | 11 | 33
-- 中国民主建国会会员 | 10 | 30
-- 中国民主促进会会员 | 10 | 30
-- 中国农工民主党党员 | 10 | 30
-- 中国共产党预备党员 | 9 | 27
-- 中国民主同盟盟员 | 8 | 24
-- 中国共产党党员 | 7 | 21 ⚠️ 超过varchar(20)
-- 中国致公党党员 | 7 | 21 ⚠️ 超过varchar(20)
-- 九三学社社员 | 6 | 18
-- 无党派民主人士 | 7 | 21 ⚠️ 超过varchar(20)
-- 群众 | 2 | 6
@@ -0,0 +1,524 @@
# 出国管理三表架构设计方案
**文档版本**: v1.0
**创建日期**: 2025-09-30
**更新日期**: 2025-09-30
**设计原则**: 三表独立 + 流程递进 + 状态关联
---
## 📋 业务背景
出国管理系统涉及**三个独立的业务流程**:
1. **出国申请** → 教职工因私出国的初始申请
2. **出国登记** → 申请通过后的登记备案
3. **出国党籍保留** → 党员出国超过1个月需办理党籍保留
### 业务关系
```
┌──────────────┐ ┌──────────────┐ ┌──────────────────┐
│ 出国申请 │ ───> │ 出国登记 │ ───> │ 出国党籍保留 │
│ (必须先办理) │ │ (申请通过后) │ │ (党员且>1个月) │
└──────────────┘ └──────────────┘ └──────────────────┘
状态:已审批 ───> 状态:已确认 ───> 状态:已批准
```
### 递进规则
- ✅ **出国登记**: 必须基于**已审批通过**的出国申请
- ✅ **出国党籍保留**: 必须基于**已确认**的出国登记
- ✅ 每个流程都有独立的ID和审批状态
- ✅ 通过关联字段判断前置流程完成情况
---
## 🗂️ 三表设计总览
| 表名 | 中文名 | 主键 | 关联字段 | 前置条件 |
|------|--------|------|----------|----------|
| `rs_overseas_application` | 出国申请表 | application_id | - | 无 |
| `rs_overseas_registration` | 出国登记表 | registration_id | application_id | 申请已审批 |
| `rs_party_membership_retention` | 出国党籍保留表 | retention_id | application_id, registration_id | 登记已确认 |
---
## 📊 表一:出国申请表 (rs_overseas_application)
### 表结构概述
- **表名**: `rs_overseas_application`
- **主键**: `application_id` bigint(20)
- **字段数量**: 30个 (23个业务字段 + 7个系统字段)
- **状态字典**: `rs_overseas_application_status`
### 完整字段列表
#### 1. 主键字段
```sql
application_id bigint(20) NOT NULL AUTO_INCREMENT -- 申请ID(主键)
```
#### 2. 基本信息字段 (6个)
```sql
applicant_name varchar(50) NOT NULL -- 申请人姓名
gender char(1) NOT NULL -- 性别:0-男,1-女
birth_date date NULL -- 出生年月
political_status varchar(20) NOT NULL -- 政治面貌(字典值1-13)
department varchar(100) NOT NULL -- 现工作部门
position varchar(100) NULL -- 职务
```
#### 3. 职业信息字段 (1个)
```sql
professional_title varchar(100) NULL -- 职称
```
#### 4. 证件信息字段 (2个)
```sql
document_name varchar(100) NULL -- 申领证件名称
document_number varchar(100) NULL -- 证件号码
```
#### 5. 出国信息字段 (5个)
```sql
destination_country varchar(100) NOT NULL -- 前往国家
exit_reason varchar(50) NOT NULL -- 出境事由:旅游、探亲
visit_relationship varchar(200) NULL -- 探望对象关系(仅探亲时填写)
start_date date NOT NULL -- 出发日期
end_date date NOT NULL -- 返回日期
```
#### 6. 计算字段 (1个)
```sql
duration int(11) NULL -- 出国天数(自动计算)
```
#### 7. 联系信息字段 (2个)
```sql
mobile_phone varchar(20) NULL -- 联系电话
emergency_contact varchar(100) NULL -- 应急联系人及电话
```
#### 8. 签名和备注字段 (2个)
```sql
signature text NULL -- 手写签名(Base64)
remarks text NULL -- 备注
```
#### 9. 文件上传字段 (3个)
```sql
stamped_file_path varchar(500) NULL -- 盖章文件路径
stamped_file_name varchar(200) NULL -- 盖章文件名称
stamped_file_upload_time datetime NULL -- 盖章文件上传时间
```
#### 10. 状态和时间字段 (2个)
```sql
status char(1) NOT NULL DEFAULT '0' -- 申请状态
apply_time datetime NULL -- 申请时间
```
#### 11. 系统字段 (7个)
```sql
tenant_id varchar(20) DEFAULT '000000' -- 租户编号
deleted char(1) DEFAULT '0' -- 删除标志
create_dept bigint(20) NULL -- 创建部门
create_by bigint(20) NULL -- 创建者
create_time datetime NULL -- 创建时间
update_by bigint(20) NULL -- 更新者
update_time datetime NULL -- 更新时间
```
### 状态定义
```sql
-- 申请状态字典 (rs_overseas_application_status)
'0' - 待审核 (info) -- 已提交,等待审批
'1' - 已通过 (success) -- 审批通过,可生成登记表
'2' - 已拒绝 (danger) -- 审批拒绝
'3' - 已取消 (warning) -- 用户主动取消
```
### 索引设计
```sql
PRIMARY KEY (application_id)
INDEX idx_applicant_name (applicant_name)
INDEX idx_department (department)
INDEX idx_status (status)
INDEX idx_apply_time (apply_time)
INDEX idx_tenant_deleted (tenant_id, deleted)
INDEX idx_create_time (create_time)
```
---
## 📊 表二:出国登记表 (rs_overseas_registration)
### 表结构概述
- **表名**: `rs_overseas_registration`
- **主键**: `registration_id` bigint(20)
- **关联字段**: `application_id` (关联出国申请)
- **字段数量**: 22个 (15个业务字段 + 7个系统字段)
- **状态字典**: `rs_overseas_registration_status`
### 完整字段列表
#### 1. 主键和关联字段 (2个)
```sql
registration_id bigint(20) NOT NULL AUTO_INCREMENT -- 登记ID(主键)
application_id bigint(20) NULL -- 关联出国申请ID(可为空)
```
#### 2. 基本信息字段 (7个)
```sql
name varchar(50) NOT NULL -- 姓名
gender char(1) NOT NULL -- 性别:0-男,1-女
birth_date date NOT NULL -- 出生日期
photo varchar(500) NULL -- 照片地址(预留区域)
id_number varchar(18) NOT NULL -- 公民身份号码
political_status varchar(20) NOT NULL -- 政治面貌
registered_address varchar(200) NOT NULL -- 户籍所在地
```
#### 3. 工作信息字段 (4个)
```sql
department varchar(100) NOT NULL -- 工作部门
position varchar(100) NOT NULL -- 职务职称
administrative_level varchar(20) NULL -- 行政职级
personnel_category varchar(10) NULL -- 人员类别代码
```
#### 4. 状态和时间字段 (2个)
```sql
status char(1) NOT NULL DEFAULT '0' -- 登记状态
registration_time datetime NULL -- 登记时间
```
#### 5. 备注字段 (1个)
```sql
remarks text NULL -- 备注
```
#### 6. 系统字段 (7个)
```sql
tenant_id varchar(20) DEFAULT '000000'
deleted char(1) DEFAULT '0'
create_dept bigint(20) NULL
create_by bigint(20) NULL
create_time datetime NULL
update_by bigint(20) NULL
update_time datetime NULL
```
### 状态定义
```sql
-- 登记状态字典 (rs_overseas_registration_status)
'0' - 草稿 (info) -- 初始创建状态,可编辑
'1' - 已提交 (warning) -- 提交后等待确认
'2' - 已确认 (success) -- 管理员确认,可生成证明
'3' - 已撤回 (danger) -- 用户主动撤回
```
### 索引设计
```sql
PRIMARY KEY (registration_id)
INDEX idx_application_id (application_id) -- 关联查询
INDEX idx_name (name)
INDEX idx_id_number (id_number)
INDEX idx_department (department)
INDEX idx_status (status)
INDEX idx_registration_time (registration_time)
INDEX idx_tenant_deleted (tenant_id, deleted)
INDEX idx_create_time (create_time)
```
---
## 📊 表三:出国党籍保留表 (rs_party_membership_retention)
### 表结构概述
- **表名**: `rs_party_membership_retention`
- **主键**: `retention_id` bigint(20)
- **关联字段**: `application_id`、`registration_id`
- **字段数量**: 25个 (18个业务字段 + 7个系统字段)
- **状态字典**: `rs_party_retention_status`
### 完整字段列表
#### 1. 主键和关联字段 (3个)
```sql
retention_id bigint(20) NOT NULL AUTO_INCREMENT -- 党籍保留ID(主键)
application_id bigint(20) NULL -- 关联出国申请ID
registration_id bigint(20) NULL -- 关联出国登记ID
```
#### 2. 基本信息字段 (2个)
```sql
name varchar(50) NOT NULL -- 我支部同志(姓名)
spouse varchar(50) NULL -- 偕配偶姓名
```
#### 3. 出国时间字段 (3个)
```sql
travel_start_date date NOT NULL -- 拟出国开始日期
travel_end_date date NOT NULL -- 拟出国结束日期
stay_days int(11) NULL -- 在外停留天数
```
#### 4. 出国目的和地点字段 (3个)
```sql
destination varchar(100) NOT NULL -- 因私赴XX(国家或地区)
purpose text NULL -- 出国目的详细说明
travel_reason varchar(50) NULL -- 出国原因(简要)
```
#### 5. 费用信息字段 (1个)
```sql
self_funded char(1) NOT NULL DEFAULT '1' -- 费用自理:1-是,0-否
```
#### 6. 审批信息字段 (2个)
```sql
request_approval text NULL -- 请求批准说明(固定文本)
final_approval text NULL -- 妥否请审批(固定文本)
```
#### 7. 党支部信息字段 (2个)
```sql
party_branch varchar(100) NOT NULL -- XXXX党支部
application_date date NOT NULL -- 申请日期
```
#### 8. 状态和时间字段 (2个)
```sql
status char(1) NOT NULL DEFAULT '0' -- 申请状态
application_time datetime NULL -- 申请时间
```
#### 9. 备注字段 (1个)
```sql
remarks text NULL -- 备注
```
#### 10. 系统字段 (7个)
```sql
tenant_id varchar(20) DEFAULT '000000'
deleted char(1) DEFAULT '0'
create_dept bigint(20) NULL
create_by bigint(20) NULL
create_time datetime NULL
update_by bigint(20) NULL
update_time datetime NULL
```
### 状态定义
```sql
-- 党籍保留状态字典 (rs_party_retention_status)
'0' - 草稿 (info) -- 初始创建状态,可编辑
'1' - 已提交 (warning) -- 提交后等待审批
'2' - 已批准 (success) -- 党支部批准
'3' - 已拒绝 (danger) -- 审批拒绝
'4' - 已撤回 (warning) -- 用户主动撤回
```
### 索引设计
```sql
PRIMARY KEY (retention_id)
INDEX idx_application_id (application_id)
INDEX idx_registration_id (registration_id)
INDEX idx_name (name)
INDEX idx_destination (destination)
INDEX idx_status (status)
INDEX idx_application_time (application_time)
INDEX idx_tenant_deleted (tenant_id, deleted)
INDEX idx_create_time (create_time)
```
---
## 🔗 流程递进关系设计
### 1. 关联关系图
```
rs_overseas_application (出国申请)
|
| application_id
|
├──> rs_overseas_registration (出国登记)
| |
| | registration_id
| |
| └──> rs_party_membership_retention (党籍保留)
| |
└─────────────────┘ (同时关联 application_id)
```
### 2. 流程判断逻辑
#### 出国登记前置条件检查
```sql
-- 检查是否可以创建出国登记
SELECT
application_id,
applicant_name,
status,
CASE
WHEN status = '1' THEN '可以创建登记'
ELSE '申请未通过审批'
END AS can_create_registration
FROM rs_overseas_application
WHERE application_id = ?
AND status = '1' -- 必须是已通过状态
AND deleted = '0';
```
#### 出国党籍保留前置条件检查
```sql
-- 检查是否可以创建党籍保留
SELECT
reg.registration_id,
reg.name,
reg.status AS registration_status,
app.political_status,
DATEDIFF(app.end_date, app.start_date) AS travel_days,
CASE
WHEN reg.status = '2'
AND app.political_status IN ('1', '2') -- 党员或预备党员
AND DATEDIFF(app.end_date, app.start_date) >= 30 -- 超过30天
THEN '可以创建党籍保留'
WHEN reg.status != '2' THEN '登记未确认'
WHEN app.political_status NOT IN ('1', '2') THEN '非党员无需办理'
WHEN DATEDIFF(app.end_date, app.start_date) < 30 THEN '出国时间不足30天'
ELSE '不符合条件'
END AS can_create_retention
FROM rs_overseas_registration reg
INNER JOIN rs_overseas_application app ON reg.application_id = app.application_id
WHERE reg.registration_id = ?
AND reg.deleted = '0'
AND app.deleted = '0';
```
### 3. 前端按钮显示逻辑
#### 出国申请列表按钮显示
```javascript
// 生成登记表按钮
canGenerateRegistration(row) {
return row.status === '1' && !row.hasRegistration;
}
```
#### 出国登记列表按钮显示
```javascript
// 生成党籍保留按钮
canGenerateRetention(row) {
return row.status === '2' // 登记已确认
&& row.isPartyMember // 是党员
&& row.travelDays >= 30 // 出国时间>=30天
&& !row.hasRetention; // 未生成过党籍保留
}
```
---
## 🎯 业务规则总结
### 必须遵守的流程规则
1. ✅ **出国申请** → 必须先审批通过 (status='1')
2. ✅ **出国登记** → 基于已通过的申请,需管理员确认 (status='2')
3. ✅ **党籍保留** → 基于已确认的登记,仅党员且出国>=30天
### 数据完整性约束
1. ✅ 每个表都有独立的主键ID
2. ✅ 通过 application_id 关联出国申请
3. ✅ 通过 registration_id 关联出国登记
4. ✅ 使用逻辑删除,不使用物理删除
5. ✅ 所有表支持多租户隔离
### 状态流转规则
#### 出国申请状态流转
```
草稿 → 待审核(0) → 已通过(1) / 已拒绝(2)
↓
可撤回为已取消(3)
```
#### 出国登记状态流转
```
草稿(0) → 已提交(1) → 已确认(2)
↓
可撤回(3)
```
#### 党籍保留状态流转
```
草稿(0) → 已提交(1) → 已批准(2) / 已拒绝(3)
↓
可撤回(4)
```
---
## 📝 实施建议
### 第一步:创建三个表
1. ✅ 执行出国申请表创建脚本
2. ✅ 执行出国登记表创建脚本
3. ⏳ 执行出国党籍保留表创建脚本(待创建)
### 第二步:插入字典数据
1. ✅ `rs_overseas_application_status` (4条)
2. ✅ `rs_overseas_registration_status` (4条)
3. ⏳ `rs_party_retention_status` (5条)
4. ✅ `rs_political_status` (13条 - 共用)
### 第三步:后端开发
1. 为每个表创建独立的实体类、VO、BO
2. 实现流程递进判断的Service方法
3. 添加关联查询的API接口
4. 实现状态流转的业务逻辑
### 第四步:前端开发
1. 三个独立的页面组件
2. 实现按钮显示的条件判断
3. 添加流程提示信息
4. 实现关联数据的展示
---
## ⚠️ 重要注意事项
### 数据一致性
- 🔴 删除申请时,关联的登记和党籍保留不应被级联删除
- 🔴 使用逻辑删除,保留历史数据追溯
- 🟡 状态变更需要记录操作日志
### 性能优化
- ✅ 在关联字段上创建索引
- ✅ 避免过度的多表JOIN查询
- ✅ 使用VO对象返回关联数据
### 安全性
- ✅ 严格的权限控制
- ✅ 状态流转的业务校验
- ✅ 防止跨租户数据访问
---
## 📞 相关文档
- **数据库规范**: `docs/设计文档/database/mysql-database-standard.md`
- **后端开发规范**: `.cursor/cursorrules-backend.md`
- **API文档**: `docs/开发文档/API/出国登记管理API.md`
- **需求文档**: `docs/需求文档/人事管理/出国申请管理需求.md`
---
**文档维护人**: Cursor AI
**创建时间**: 2025-09-30
**审核状态**: ✅ 设计完成,待实施
**下一步**: 创建党籍保留表SQL脚本
@@ -0,0 +1,38 @@
-- ======================================================
-- rs_overseas_record_status_backup 表字符集修复脚本
-- ======================================================
-- 问题:old_status_text 字段使用了 latin1 字符集,导致中文乱码
-- 解决:修改为 utf8mb4 字符集,符合项目数据库规范
-- 创建时间:2025-01-08
-- ======================================================
-- 1. 备份表数据(可选,建议在生产环境执行)
-- CREATE TABLE rs_overseas_record_status_backup_20250108 AS SELECT * FROM rs_overseas_record_status_backup;
-- 2. 修复字符集问题
ALTER TABLE `rs_overseas_record_status_backup`
MODIFY COLUMN `old_status_text` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '原状态文本';
-- 3. 验证修复结果
-- SHOW FULL COLUMNS FROM rs_overseas_record_status_backup;
-- ======================================================
-- 修复后的正确表结构
-- ======================================================
/*
CREATE TABLE `rs_overseas_record_status_backup` (
`record_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '记录ID',
`completion_status` char(1) DEFAULT '0' COMMENT '完成状态:0-进行中,1-已完成,2-提前结束',
`old_status_text` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '原状态文本',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
*/
-- ======================================================
-- 注意事项
-- ======================================================
-- 1. 修复前建议备份数据
-- 2. 如果已有乱码数据,可能需要数据转换
-- 3. 修复后需要重新插入中文数据以验证
-- ======================================================
@@ -0,0 +1,114 @@
-- ======================================================
-- 数据库字符集检测和验证脚本
-- ======================================================
-- 用途:检测和验证数据库字符集配置是否符合项目规范
-- 创建时间:2025-01-08
-- 适用数据库:hzdyjs_xg
-- ======================================================
-- 1. 检查数据库默认字符集
-- ======================================================
SELECT
SCHEMA_NAME as '数据库名',
DEFAULT_CHARACTER_SET_NAME as '默认字符集',
DEFAULT_COLLATION_NAME as '默认排序规则'
FROM INFORMATION_SCHEMA.SCHEMATA
WHERE SCHEMA_NAME = 'hzdyjs_xg';
-- 2. 检查所有非utf8mb4字符集的字段
-- ======================================================
SELECT
TABLE_NAME as '表名',
COLUMN_NAME as '字段名',
DATA_TYPE as '数据类型',
CHARACTER_SET_NAME as '字符集',
COLLATION_NAME as '排序规则',
COLUMN_COMMENT as '字段注释'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'hzdyjs_xg'
AND CHARACTER_SET_NAME IS NOT NULL
AND CHARACTER_SET_NAME != 'utf8mb4'
ORDER BY TABLE_NAME, COLUMN_NAME;
-- 3. 专门检查 rs_overseas_record_status_backup 表
-- ======================================================
SELECT
COLUMN_NAME as '字段名',
DATA_TYPE as '数据类型',
CHARACTER_MAXIMUM_LENGTH as '最大长度',
CHARACTER_SET_NAME as '字符集',
COLLATION_NAME as '排序规则',
IS_NULLABLE as '可为空',
COLUMN_DEFAULT as '默认值',
COLUMN_COMMENT as '注释'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'hzdyjs_xg'
AND TABLE_NAME = 'rs_overseas_record_status_backup'
ORDER BY ORDINAL_POSITION;
-- 4. 检查表的默认字符集
-- ======================================================
SELECT
TABLE_NAME as '表名',
TABLE_COLLATION as '表排序规则',
ENGINE as '存储引擎',
TABLE_COMMENT as '表注释'
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'hzdyjs_xg'
AND TABLE_NAME = 'rs_overseas_record_status_backup';
-- ======================================================
-- 修复后验证脚本
-- ======================================================
-- 5. 验证修复效果 - 中文数据测试
-- ======================================================
-- 5.1 插入中文测试数据
INSERT INTO rs_overseas_record_status_backup
(record_id, completion_status, old_status_text, create_time)
VALUES
(999999, '0', '测试中文', NOW()),
(999998, '1', '已完成', NOW()),
(999997, '2', '提前结束', NOW());
-- 5.2 查询验证中文显示
SELECT
record_id as '记录ID',
completion_status as '完成状态',
old_status_text as '原状态文本',
CHAR_LENGTH(old_status_text) as '字符长度',
LENGTH(old_status_text) as '字节长度',
create_time as '创建时间'
FROM rs_overseas_record_status_backup
WHERE record_id IN (999999, 999998, 999997)
ORDER BY record_id DESC;
-- 5.3 验证字符编码
SELECT
old_status_text as '原文',
HEX(old_status_text) as '十六进制编码',
CHAR_LENGTH(old_status_text) as '字符数',
LENGTH(old_status_text) as '字节数'
FROM rs_overseas_record_status_backup
WHERE record_id = 999999;
-- 5.4 清理测试数据
DELETE FROM rs_overseas_record_status_backup
WHERE record_id IN (999999, 999998, 999997);
-- ======================================================
-- 预期验证结果
-- ======================================================
/*
正确的验证结果应该显示:
1. 字符集检查:old_status_text 字段显示为 utf8mb4
2. 中文测试:中文字符正常显示,无乱码
3. 字符编码:中文字符的十六进制编码正确(每个中文字符占3字节)
如果仍有问题,请检查:
- 数据库连接字符集配置
- 应用程序的字符集配置
- 客户端工具的字符集设置
*/
@@ -0,0 +1,220 @@
# 出国行程变更表增加本人基本情况字段 - 执行步骤
## 📋 快速执行指南
### 第一步:执行数据库脚本
1. **连接到MySQL数据库**
```bash
mysql -u your_username -p your_database_name
```
2. **执行ALTER脚本**
```bash
source /path/to/rs_overseas_itinerary_change_add_fields.sql
```
或者直接在MySQL客户端中执行SQL:
```sql
ALTER TABLE `rs_overseas_itinerary_change`
ADD COLUMN `gender` char(1) DEFAULT NULL COMMENT '性别:0-男,1-女' AFTER `applicant_name`,
ADD COLUMN `birth_date` date DEFAULT NULL COMMENT '出生日期' AFTER `gender`,
ADD COLUMN `political_status` varchar(20) DEFAULT NULL COMMENT '政治面貌' AFTER `birth_date`,
ADD COLUMN `professional_title` varchar(100) DEFAULT NULL COMMENT '职称' AFTER `political_status`,
ADD COLUMN `position` varchar(100) DEFAULT NULL COMMENT '职务' AFTER `professional_title`,
ADD COLUMN `document_name` varchar(100) DEFAULT NULL COMMENT '申领证件名称' AFTER `position`,
ADD COLUMN `document_number` varchar(100) DEFAULT NULL COMMENT '证件号码' AFTER `document_name`;
```
3. **验证字段添加成功**
```sql
DESC rs_overseas_itinerary_change;
```
应该能看到以下新字段:
- gender
- birth_date
- political_status
- professional_title
- position
- document_name
- document_number
### 第二步:重启后端服务
1. **编译后端项目**
```bash
cd backend
mvn clean package
```
2. **重启后端服务**
```bash
# 根据你的部署方式选择
# 方式1: 直接运行
java -jar ruoyi-admin/target/ruoyi-admin.jar
# 方式2: Docker
docker-compose restart backend
# 方式3: systemctl
systemctl restart ruoyi
```
### 第三步:重启前端服务
1. **重新构建前端**
```bash
cd web
npm run build
```
2. **重启前端服务**
```bash
# 开发环境
npm run dev
# 生产环境
systemctl restart nginx
```
### 第四步:验证功能
1. **登录系统**
- 访问前端页面
- 使用管理员账号登录
2. **打开行程变更页面**
- 导航:人事管理 → 变更行程 → 变更行程管理
3. **测试新增功能**
- 点击"新增变更申请"
- 选择一个已审批通过的出国申请
- 检查"一、本人基本情况"部分是否显示了所有新字段:
- ✅ 姓名
- ✅ 性别
- ✅ 出生年月
- ✅ 政治面貌
- ✅ 职称
- ✅ 职务
- ✅ 申领证件名称
- ✅ 证件号码
- ✅ 单位
4. **测试数据保存**
- 填写实际行程情况
- 填写变更原因
- 提交保存
- 查看详情,验证新字段已保存
## 🔍 常见问题排查
### 问题1:字段添加失败
**错误信息**:`Duplicate column name 'gender'`
**解决方案**:字段已存在,跳过此步骤或先删除字段再添加
```sql
-- 检查字段是否存在
SHOW COLUMNS FROM rs_overseas_itinerary_change LIKE 'gender';
-- 如果存在且需要重新添加,先删除
ALTER TABLE rs_overseas_itinerary_change DROP COLUMN gender;
```
### 问题2:后端启动失败
**错误信息**:MyBatis映射错误
**解决方案**:
1. 检查实体类字段是否正确添加
2. 清理Maven缓存
```bash
mvn clean
rm -rf ~/.m2/repository
mvn install
```
### 问题3:前端字段不显示
**可能原因**:
1. 前端缓存未清理
2. 类型定义未更新
3. 后端未返回新字段
**解决方案**:
```bash
# 清理前端缓存
cd web
rm -rf node_modules/.cache
rm -rf dist
# 重新安装依赖
npm install
# 重新运行
npm run dev
```
### 问题4:性别显示为空
**可能原因**:出国申请表中gender字段为空
**解决方案**:
1. 检查原出国申请数据
2. 确保出国申请表中有gender字段且有值
## 📊 SQL验证脚本
```sql
-- 验证表结构
SELECT
COLUMN_NAME AS '字段名',
COLUMN_TYPE AS '字段类型',
IS_NULLABLE AS '允许空值',
COLUMN_COMMENT AS '字段说明'
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'rs_overseas_itinerary_change'
AND COLUMN_NAME IN ('gender', 'birth_date', 'political_status', 'professional_title', 'position', 'document_name', 'document_number')
ORDER BY ORDINAL_POSITION;
-- 验证数据
SELECT
change_id,
applicant_name,
gender,
birth_date,
political_status,
professional_title,
position,
document_name,
document_number
FROM rs_overseas_itinerary_change
LIMIT 5;
```
## ✅ 执行检查清单
- [ ] 数据库字段添加成功
- [ ] 后端代码已更新(Entity、VO、Bo)
- [ ] 前端代码已更新(API类型、表单UI)
- [ ] 后端服务重启成功
- [ ] 前端服务重启成功
- [ ] 新增变更申请功能正常
- [ ] 字段自动填充正常
- [ ] 数据保存正常
- [ ] 查看详情显示正常
## 📞 技术支持
如遇到问题,请检查:
1. 日志文件:`backend/logs/`
2. 浏览器控制台:F12 → Console
3. 网络请求:F12 → Network
---
**文档版本**:1.0
**最后更新**:2025-10-13
@@ -0,0 +1,124 @@
-- ======================================
-- 诊断:检查行程变更表缺失的字段
-- 创建时间: 2025-10-13
-- 执行方式: 在MySQL中直接执行
-- ======================================
-- 设置字符集
SET NAMES utf8mb4;
-- ======================================
-- 检查1:查看当前表结构
-- ======================================
SELECT '当前表结构' AS '检查项';
SHOW COLUMNS FROM rs_overseas_itinerary_change;
-- ======================================
-- 检查2:统计字段数量
-- ======================================
SELECT
'字段数量检查' AS '检查项',
COUNT(*) AS '当前字段数',
'47' AS '期望字段数',
CASE
WHEN COUNT(*) < 47 THEN '⚠️ 缺少字段'
WHEN COUNT(*) = 47 THEN '✅ 字段完整'
ELSE '❓ 字段数量异常'
END AS '状态'
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'rs_overseas_itinerary_change';
-- ======================================
-- 检查3:检查必需的个人信息字段是否存在
-- ======================================
SELECT
'个人信息字段检查' AS '检查项',
CASE WHEN COUNT(*) = 8 THEN '✅ 全部存在' ELSE CONCAT('⚠️ 缺少 ', 8 - COUNT(*), ' 个字段') END AS '状态',
GROUP_CONCAT(COLUMN_NAME ORDER BY COLUMN_NAME) AS '已存在的字段'
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'rs_overseas_itinerary_change'
AND COLUMN_NAME IN (
'gender',
'birth_date',
'political_status',
'professional_title',
'position',
'document_name',
'document_number',
'department'
);
-- ======================================
-- 检查4:列出缺失的字段
-- ======================================
SELECT '缺失字段列表' AS '检查项';
SELECT
field_name AS '缺失字段',
field_type AS '字段类型',
field_comment AS '字段说明'
FROM (
SELECT 'gender' AS field_name, 'char(1)' AS field_type, '性别:0-男,1-女' AS field_comment
UNION ALL
SELECT 'birth_date', 'date', '出生日期'
UNION ALL
SELECT 'political_status', 'varchar(20)', '政治面貌'
UNION ALL
SELECT 'professional_title', 'varchar(100)', '职称'
UNION ALL
SELECT 'position', 'varchar(100)', '职务'
UNION ALL
SELECT 'document_name', 'varchar(100)', '申领证件名称'
UNION ALL
SELECT 'document_number', 'varchar(100)', '证件号码'
UNION ALL
SELECT 'department', 'varchar(200)', '部门'
) AS required_fields
WHERE field_name NOT IN (
SELECT COLUMN_NAME
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'rs_overseas_itinerary_change'
);
-- ======================================
-- 检查5:查看表的基本信息
-- ======================================
SELECT
'表基本信息' AS '检查项',
TABLE_NAME AS '表名',
TABLE_ROWS AS '数据行数',
CREATE_TIME AS '创建时间',
UPDATE_TIME AS '更新时间',
TABLE_COMMENT AS '表注释'
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'rs_overseas_itinerary_change';
-- ======================================
-- 诊断结果说明
-- ======================================
/*
诊断说明:
1. 如果"字段数量检查"显示 ⚠️ 缺少字段:
- 说明表结构不完整
- 需要执行修复SQL(🔧修复-添加缺失字段.sql)
2. 如果"个人信息字段检查"显示 ⚠️ 缺少X个字段:
- 说明缺少个人信息相关字段
- 这正是导致"Unknown column 'gender'"错误的原因
3. "缺失字段列表"会显示具体缺少哪些字段:
- 如果有结果,说明需要添加这些字段
- 如果无结果,说明字段完整
下一步操作:
1. 如果发现缺失字段 → 执行 🔧修复-添加缺失字段.sql
2. 如果字段完整 → 检查后端Mapper映射是否正确
3. 修复后重启后端服务
4. 重新测试审批功能
*/
@@ -0,0 +1,163 @@
-- ======================================
-- 修复:添加行程变更表缺失的字段
-- 创建时间: 2025-10-13
-- 问题描述: 表中缺少gender等个人信息字段
-- 执行方式: 直接在MySQL中执行
-- ======================================
-- 设置字符集
SET NAMES utf8mb4;
-- ======================================
-- 第一步:检查当前表结构(诊断用)
-- ======================================
SHOW COLUMNS FROM rs_overseas_itinerary_change;
-- ======================================
-- 第二步:添加缺失的个人信息字段
-- ======================================
-- 添加性别字段(在applicant_name之后)
ALTER TABLE rs_overseas_itinerary_change
ADD COLUMN `gender` char(1) DEFAULT NULL COMMENT '性别:0-男,1-女'
AFTER `applicant_name`;
-- 添加出生日期字段
ALTER TABLE rs_overseas_itinerary_change
ADD COLUMN `birth_date` date DEFAULT NULL COMMENT '出生日期'
AFTER `gender`;
-- 添加政治面貌字段
ALTER TABLE rs_overseas_itinerary_change
ADD COLUMN `political_status` varchar(20) DEFAULT NULL COMMENT '政治面貌'
AFTER `birth_date`;
-- 添加职称字段
ALTER TABLE rs_overseas_itinerary_change
ADD COLUMN `professional_title` varchar(100) DEFAULT NULL COMMENT '职称'
AFTER `political_status`;
-- 添加职务字段
ALTER TABLE rs_overseas_itinerary_change
ADD COLUMN `position` varchar(100) DEFAULT NULL COMMENT '职务'
AFTER `professional_title`;
-- 添加证件名称字段
ALTER TABLE rs_overseas_itinerary_change
ADD COLUMN `document_name` varchar(100) DEFAULT NULL COMMENT '申领证件名称'
AFTER `position`;
-- 添加证件号码字段
ALTER TABLE rs_overseas_itinerary_change
ADD COLUMN `document_number` varchar(100) DEFAULT NULL COMMENT '证件号码'
AFTER `document_name`;
-- 添加部门字段
ALTER TABLE rs_overseas_itinerary_change
ADD COLUMN `department` varchar(200) DEFAULT NULL COMMENT '部门'
AFTER `document_number`;
-- ======================================
-- 第三步:验证修复结果
-- ======================================
-- 查看表结构(检查字段是否添加成功)
SELECT '验证表结构' AS '检查项';
SHOW COLUMNS FROM rs_overseas_itinerary_change;
-- 统计字段数量(应该是47个字段)
SELECT
'字段数量检查' AS '检查项',
COUNT(*) AS '当前字段数',
'47' AS '期望字段数'
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'rs_overseas_itinerary_change';
-- 查看新添加的字段
SELECT
COLUMN_NAME AS '字段名',
COLUMN_TYPE AS '字段类型',
IS_NULLABLE AS '允许NULL',
COLUMN_DEFAULT AS '默认值',
COLUMN_COMMENT AS '字段说明'
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'rs_overseas_itinerary_change'
AND COLUMN_NAME IN (
'gender',
'birth_date',
'political_status',
'professional_title',
'position',
'document_name',
'document_number',
'department'
)
ORDER BY ORDINAL_POSITION;
-- ======================================
-- 使用说明
-- ======================================
/*
问题原因:
数据库中的表结构是旧版本,缺少个人信息相关字段。
后端查询时包含了这些字段,导致SQL语法错误。
修复步骤:
1. 确保数据库连接正常
2. 选择正确的数据库(USE your_database)
3. 执行本SQL脚本
4. 检查验证结果,确认字段已添加
5. 重启后端服务(清除MyBatis缓存)
6. 重新测试审批功能
添加的字段列表:
- gender: 性别(char(1))
- birth_date: 出生日期(date)
- political_status: 政治面貌(varchar(20))
- professional_title: 职称(varchar(100))
- position: 职务(varchar(100))
- document_name: 申领证件名称(varchar(100))
- document_number: 证件号码(varchar(100))
- department: 部门(varchar(200))
注意事项:
1. 这些字段都允许为NULL(因为已有数据可能没有这些信息)
2. 新添加的字段会自动插入到applicant_name字段之后
3. 现有数据的这些字段值为NULL
4. 如需填充数据,可以从其他表(如用户表)同步
*/
-- ======================================
-- 可选:从其他表同步数据(如果需要)
-- ======================================
/*
-- 示例:从sys_user表同步性别和部门信息
UPDATE rs_overseas_itinerary_change c
LEFT JOIN sys_user u ON c.applicant_id = u.user_id
SET
c.gender = u.sex,
c.department = (
SELECT dept_name
FROM sys_dept
WHERE dept_id = u.dept_id
)
WHERE c.gender IS NULL;
-- 示例:从rs_overseas_application表同步个人信息
UPDATE rs_overseas_itinerary_change c
LEFT JOIN rs_overseas_application a ON c.application_id = a.application_id
SET
c.gender = a.gender,
c.birth_date = a.birth_date,
c.political_status = a.political_status,
c.professional_title = a.professional_title,
c.position = a.position,
c.document_name = a.document_name,
c.document_number = a.document_number,
c.department = a.department
WHERE c.application_id IS NOT NULL
AND c.gender IS NULL;
*/