feat(db): 删除用户社交身份表及相关迁移脚本

- 删除 `20260922_user_social.sql` 文件及其内容
- 更新 `README.md`,移除关于用户社交身份迁移的说明
- 删除 `2026-03-18-flow-withdraw-design.md` 和 `2026-03-19-flow-withdraw-resubmit-design.md` 文档,清理与撤回和重新提交流程相关的设计文档
This commit is contained in:
PIGCLOUD committed 2026-09-22 22:14:02 +08:00
1 parent 7712a1bb3c
commit db60b48f6c
6 files changed
-1296

No files matched your search

@@ -1,196 +0,0 @@
-- 将既有数据库字段定义对齐当前初始化脚本;执行前备份并在副本验证。
-- MySQL DDL 会隐式提交;仅 MODIFY 列和表默认排序规则,不删除表或业务数据。
-- boot 通过 --database 指定目标库;services 请核对下面 USE 的库名。
-- OAuth 默认授权仅更新新安装种子,不覆盖现有客户的授权配置。
-- Quartz 关联键需要在同一会话中一并调整字符集。
SET @pigx_previous_foreign_key_checks = @@FOREIGN_KEY_CHECKS;
SET FOREIGN_KEY_CHECKS = 0;
ALTER TABLE `sys_api_key`
MODIFY COLUMN `tenant_id` bigint DEFAULT NULL COMMENT '租户ID';
ALTER TABLE `sys_dept`
MODIFY COLUMN `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '创建人',
MODIFY COLUMN `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '修改人';
ALTER TABLE `sys_dict`
MODIFY COLUMN `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '创建人',
MODIFY COLUMN `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '修改人';
ALTER TABLE `sys_dict_item`
MODIFY COLUMN `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '创建人',
MODIFY COLUMN `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '修改人';
ALTER TABLE `sys_file`
MODIFY COLUMN `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '创建人',
MODIFY COLUMN `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '修改人';
ALTER TABLE `sys_i18n`
MODIFY COLUMN `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '创建人',
MODIFY COLUMN `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '修改人';
ALTER TABLE `sys_log`
MODIFY COLUMN `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '创建人',
MODIFY COLUMN `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '修改人';
ALTER TABLE `sys_menu`
MODIFY COLUMN `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '创建人',
MODIFY COLUMN `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '修改人';
ALTER TABLE `sys_oauth_client_details`
MODIFY COLUMN `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '创建人',
MODIFY COLUMN `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '修改人';
ALTER TABLE `sys_public_param`
MODIFY COLUMN `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '创建人',
MODIFY COLUMN `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '修改人';
ALTER TABLE `sys_role`
MODIFY COLUMN `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '创建人',
MODIFY COLUMN `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '修改人';
ALTER TABLE `sys_route_conf`
MODIFY COLUMN `route_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
MODIFY COLUMN `route_id` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
MODIFY COLUMN `uri` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
MODIFY COLUMN `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '创建人',
MODIFY COLUMN `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '修改人',
MODIFY COLUMN `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0';
ALTER TABLE `sys_schedule`
MODIFY COLUMN `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '创建人',
MODIFY COLUMN `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '修改人';
ALTER TABLE `sys_social_details`
MODIFY COLUMN `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '创建人',
MODIFY COLUMN `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '修改人';
ALTER TABLE `sys_user`
MODIFY COLUMN `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '创建人',
MODIFY COLUMN `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '修改人';
ALTER TABLE `bmp_oa_leave`
MODIFY COLUMN `username` varchar(255) COLLATE utf8mb4_general_ci NOT NULL COMMENT '申请人',
MODIFY COLUMN `leave_reason` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '请假原因',
MODIFY COLUMN `process_instance_id` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '流程实例的编号',
MODIFY COLUMN `create_by` varchar(64) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者',
MODIFY COLUMN `update_by` varchar(64) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者',
MODIFY COLUMN `del_flag` char(1) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '是否删除',
DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `qrtz_blob_triggers`
MODIFY COLUMN `sched_name` varchar(120) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `trigger_name` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `trigger_group` varchar(200) CHARACTER SET utf8mb4 NOT NULL;
ALTER TABLE `qrtz_calendars`
MODIFY COLUMN `sched_name` varchar(120) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `calendar_name` varchar(200) CHARACTER SET utf8mb4 NOT NULL;
ALTER TABLE `qrtz_cron_triggers`
MODIFY COLUMN `sched_name` varchar(120) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `trigger_name` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `trigger_group` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `cron_expression` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `time_zone_id` varchar(80) CHARACTER SET utf8mb4 DEFAULT NULL;
ALTER TABLE `qrtz_fired_triggers`
MODIFY COLUMN `sched_name` varchar(120) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `entry_id` varchar(95) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `trigger_name` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `trigger_group` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `instance_name` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `state` varchar(16) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `job_name` varchar(200) CHARACTER SET utf8mb4 DEFAULT NULL,
MODIFY COLUMN `job_group` varchar(200) CHARACTER SET utf8mb4 DEFAULT NULL,
MODIFY COLUMN `is_nonconcurrent` varchar(1) CHARACTER SET utf8mb4 DEFAULT NULL,
MODIFY COLUMN `requests_recovery` varchar(1) CHARACTER SET utf8mb4 DEFAULT NULL;
ALTER TABLE `qrtz_job_details`
MODIFY COLUMN `sched_name` varchar(120) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `job_name` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `job_group` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `description` varchar(250) CHARACTER SET utf8mb4 DEFAULT NULL,
MODIFY COLUMN `job_class_name` varchar(250) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `is_durable` varchar(1) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `is_nonconcurrent` varchar(1) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `is_update_data` varchar(1) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `requests_recovery` varchar(1) CHARACTER SET utf8mb4 NOT NULL;
ALTER TABLE `qrtz_locks`
MODIFY COLUMN `sched_name` varchar(120) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `lock_name` varchar(40) CHARACTER SET utf8mb4 NOT NULL;
ALTER TABLE `qrtz_paused_trigger_grps`
MODIFY COLUMN `sched_name` varchar(120) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `trigger_group` varchar(200) CHARACTER SET utf8mb4 NOT NULL;
ALTER TABLE `qrtz_scheduler_state`
MODIFY COLUMN `sched_name` varchar(120) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `instance_name` varchar(200) CHARACTER SET utf8mb4 NOT NULL;
ALTER TABLE `qrtz_simple_triggers`
MODIFY COLUMN `sched_name` varchar(120) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `trigger_name` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `trigger_group` varchar(200) CHARACTER SET utf8mb4 NOT NULL;
ALTER TABLE `qrtz_simprop_triggers`
MODIFY COLUMN `sched_name` varchar(120) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `trigger_name` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `trigger_group` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `str_prop_1` varchar(512) CHARACTER SET utf8mb4 DEFAULT NULL,
MODIFY COLUMN `str_prop_2` varchar(512) CHARACTER SET utf8mb4 DEFAULT NULL,
MODIFY COLUMN `str_prop_3` varchar(512) CHARACTER SET utf8mb4 DEFAULT NULL,
MODIFY COLUMN `bool_prop_1` varchar(1) CHARACTER SET utf8mb4 DEFAULT NULL,
MODIFY COLUMN `bool_prop_2` varchar(1) CHARACTER SET utf8mb4 DEFAULT NULL;
ALTER TABLE `qrtz_triggers`
MODIFY COLUMN `sched_name` varchar(120) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `trigger_name` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `trigger_group` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `job_name` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `job_group` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `description` varchar(250) CHARACTER SET utf8mb4 DEFAULT NULL,
MODIFY COLUMN `trigger_state` varchar(16) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `trigger_type` varchar(8) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `calendar_name` varchar(200) CHARACTER SET utf8mb4 DEFAULT NULL;
ALTER TABLE `sys_job_log`
MODIFY COLUMN `job_name` varchar(64) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '任务名称',
MODIFY COLUMN `job_group` varchar(64) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '任务组名',
MODIFY COLUMN `job_order` char(1) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '组内执行顺利,值越大执行优先级越高,最大值9,最小值1',
MODIFY COLUMN `job_type` char(1) CHARACTER SET utf8mb4 NOT NULL DEFAULT '1' COMMENT '1、java类;2、spring bean名称;3、rest调用;4、jar调用;9其他',
MODIFY COLUMN `execute_path` varchar(500) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT 'job_type=3时,rest调用地址,仅支持post协议;job_type=4时,jar路径;其它值为空',
MODIFY COLUMN `class_name` varchar(500) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT 'job_type=1时,类完整路径;job_type=2时,spring bean名称;其它值为空',
MODIFY COLUMN `method_name` varchar(500) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '任务方法',
MODIFY COLUMN `method_params_value` varchar(2000) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '参数值',
MODIFY COLUMN `cron_expression` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT 'cron执行表达式',
MODIFY COLUMN `job_message` varchar(500) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '日志信息',
MODIFY COLUMN `job_log_status` char(1) CHARACTER SET utf8mb4 DEFAULT '0' COMMENT '执行状态(0正常 1失败)',
MODIFY COLUMN `execute_time` varchar(30) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '执行时间',
MODIFY COLUMN `exception_info` varchar(2000) CHARACTER SET utf8mb4 DEFAULT '' COMMENT '异常信息',
MODIFY COLUMN `fire_instance_id` varchar(128) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT 'Quartz触发实例ID',
MODIFY COLUMN `dedup_status` char(1) CHARACTER SET utf8mb4 DEFAULT '0' COMMENT '去重状态(0正常执行 1同一触发点重复 2任务运行中跳过)';
ALTER TABLE `wx_auto_reply`
MODIFY COLUMN `remark` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',
MODIFY COLUMN `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '逻辑删除标记(0:显示;1:隐藏)';
ALTER TABLE `wx_msg`
MODIFY COLUMN `wx_user_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '微信用户ID',
MODIFY COLUMN `read_flag` char(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '1' COMMENT '已读标记(1:是;0:否)',
MODIFY COLUMN `remark` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',
MODIFY COLUMN `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '逻辑删除标记(0:显示;1:隐藏)';
ALTER TABLE `gen_group`
MODIFY COLUMN `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '创建人',
MODIFY COLUMN `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '修改人';
ALTER TABLE `gen_template`
MODIFY COLUMN `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '创建人',
MODIFY COLUMN `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '修改人';
SET FOREIGN_KEY_CHECKS = @pigx_previous_foreign_key_checks;
SET @pigx_previous_foreign_key_checks = NULL;
@@ -1,207 +0,0 @@
-- 将既有数据库字段定义对齐当前初始化脚本;执行前备份并在副本验证。
-- MySQL DDL 会隐式提交;仅 MODIFY 列和表默认排序规则,不删除表或业务数据。
-- boot 通过 --database 指定目标库;services 请核对下面 USE 的库名。
-- OAuth 默认授权仅更新新安装种子,不覆盖现有客户的授权配置。
-- Quartz 关联键需要在同一会话中一并调整字符集。
SET @pigx_previous_foreign_key_checks = @@FOREIGN_KEY_CHECKS;
SET FOREIGN_KEY_CHECKS = 0;
USE pigxx;
ALTER TABLE `sys_dept`
MODIFY COLUMN `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '创建人',
MODIFY COLUMN `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '修改人';
ALTER TABLE `sys_dict`
MODIFY COLUMN `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '创建人',
MODIFY COLUMN `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '修改人';
ALTER TABLE `sys_dict_item`
MODIFY COLUMN `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '创建人',
MODIFY COLUMN `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '修改人';
ALTER TABLE `sys_file`
MODIFY COLUMN `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '创建人',
MODIFY COLUMN `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '修改人';
ALTER TABLE `sys_i18n`
MODIFY COLUMN `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '创建人',
MODIFY COLUMN `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '修改人';
ALTER TABLE `sys_log`
MODIFY COLUMN `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '创建人',
MODIFY COLUMN `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '修改人',
MODIFY COLUMN `user_agent` text COLLATE utf8mb4_general_ci COMMENT '浏览器标识';
ALTER TABLE `sys_menu`
MODIFY COLUMN `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '创建人',
MODIFY COLUMN `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '修改人';
ALTER TABLE `sys_oauth_client_details`
MODIFY COLUMN `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '创建人',
MODIFY COLUMN `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '修改人';
ALTER TABLE `sys_public_param`
MODIFY COLUMN `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '创建人',
MODIFY COLUMN `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '修改人';
ALTER TABLE `sys_role`
MODIFY COLUMN `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '创建人',
MODIFY COLUMN `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '修改人';
ALTER TABLE `sys_route_conf`
MODIFY COLUMN `route_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
MODIFY COLUMN `route_id` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
MODIFY COLUMN `uri` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
MODIFY COLUMN `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '创建人',
MODIFY COLUMN `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '修改人',
MODIFY COLUMN `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0';
ALTER TABLE `sys_schedule`
MODIFY COLUMN `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '创建人',
MODIFY COLUMN `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '修改人';
ALTER TABLE `sys_social_details`
MODIFY COLUMN `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '创建人',
MODIFY COLUMN `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '修改人';
-- 未分配主部门的 NULL 对齐为 0。
UPDATE `sys_user` SET `dept_id` = 0 WHERE `dept_id` IS NULL;
ALTER TABLE `sys_user`
MODIFY COLUMN `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '创建人',
MODIFY COLUMN `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '修改人',
MODIFY COLUMN `dept_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '主部门ID';
USE pigxx_flow;
ALTER TABLE `bmp_oa_leave`
MODIFY COLUMN `username` varchar(255) COLLATE utf8mb4_general_ci NOT NULL COMMENT '申请人',
MODIFY COLUMN `leave_reason` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '请假原因',
MODIFY COLUMN `process_instance_id` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '流程实例的编号',
MODIFY COLUMN `create_by` varchar(64) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者',
MODIFY COLUMN `update_by` varchar(64) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者',
MODIFY COLUMN `del_flag` char(1) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '是否删除',
DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
USE pigxx_job;
ALTER TABLE `qrtz_blob_triggers`
MODIFY COLUMN `sched_name` varchar(120) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `trigger_name` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `trigger_group` varchar(200) CHARACTER SET utf8mb4 NOT NULL;
ALTER TABLE `qrtz_calendars`
MODIFY COLUMN `sched_name` varchar(120) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `calendar_name` varchar(200) CHARACTER SET utf8mb4 NOT NULL;
ALTER TABLE `qrtz_cron_triggers`
MODIFY COLUMN `sched_name` varchar(120) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `trigger_name` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `trigger_group` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `cron_expression` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `time_zone_id` varchar(80) CHARACTER SET utf8mb4 DEFAULT NULL;
ALTER TABLE `qrtz_fired_triggers`
MODIFY COLUMN `sched_name` varchar(120) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `entry_id` varchar(95) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `trigger_name` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `trigger_group` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `instance_name` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `state` varchar(16) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `job_name` varchar(200) CHARACTER SET utf8mb4 DEFAULT NULL,
MODIFY COLUMN `job_group` varchar(200) CHARACTER SET utf8mb4 DEFAULT NULL,
MODIFY COLUMN `is_nonconcurrent` varchar(1) CHARACTER SET utf8mb4 DEFAULT NULL,
MODIFY COLUMN `requests_recovery` varchar(1) CHARACTER SET utf8mb4 DEFAULT NULL;
ALTER TABLE `qrtz_job_details`
MODIFY COLUMN `sched_name` varchar(120) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `job_name` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `job_group` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `description` varchar(250) CHARACTER SET utf8mb4 DEFAULT NULL,
MODIFY COLUMN `job_class_name` varchar(250) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `is_durable` varchar(1) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `is_nonconcurrent` varchar(1) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `is_update_data` varchar(1) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `requests_recovery` varchar(1) CHARACTER SET utf8mb4 NOT NULL;
ALTER TABLE `qrtz_locks`
MODIFY COLUMN `sched_name` varchar(120) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `lock_name` varchar(40) CHARACTER SET utf8mb4 NOT NULL;
ALTER TABLE `qrtz_paused_trigger_grps`
MODIFY COLUMN `sched_name` varchar(120) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `trigger_group` varchar(200) CHARACTER SET utf8mb4 NOT NULL;
ALTER TABLE `qrtz_scheduler_state`
MODIFY COLUMN `sched_name` varchar(120) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `instance_name` varchar(200) CHARACTER SET utf8mb4 NOT NULL;
ALTER TABLE `qrtz_simple_triggers`
MODIFY COLUMN `sched_name` varchar(120) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `trigger_name` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `trigger_group` varchar(200) CHARACTER SET utf8mb4 NOT NULL;
ALTER TABLE `qrtz_simprop_triggers`
MODIFY COLUMN `sched_name` varchar(120) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `trigger_name` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `trigger_group` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `str_prop_1` varchar(512) CHARACTER SET utf8mb4 DEFAULT NULL,
MODIFY COLUMN `str_prop_2` varchar(512) CHARACTER SET utf8mb4 DEFAULT NULL,
MODIFY COLUMN `str_prop_3` varchar(512) CHARACTER SET utf8mb4 DEFAULT NULL,
MODIFY COLUMN `bool_prop_1` varchar(1) CHARACTER SET utf8mb4 DEFAULT NULL,
MODIFY COLUMN `bool_prop_2` varchar(1) CHARACTER SET utf8mb4 DEFAULT NULL;
ALTER TABLE `qrtz_triggers`
MODIFY COLUMN `sched_name` varchar(120) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `trigger_name` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `trigger_group` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `job_name` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `job_group` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `description` varchar(250) CHARACTER SET utf8mb4 DEFAULT NULL,
MODIFY COLUMN `trigger_state` varchar(16) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `trigger_type` varchar(8) CHARACTER SET utf8mb4 NOT NULL,
MODIFY COLUMN `calendar_name` varchar(200) CHARACTER SET utf8mb4 DEFAULT NULL;
ALTER TABLE `sys_job_log`
MODIFY COLUMN `job_name` varchar(64) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '任务名称',
MODIFY COLUMN `job_group` varchar(64) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '任务组名',
MODIFY COLUMN `job_order` char(1) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '组内执行顺利,值越大执行优先级越高,最大值9,最小值1',
MODIFY COLUMN `job_type` char(1) CHARACTER SET utf8mb4 NOT NULL DEFAULT '1' COMMENT '1、java类;2、spring bean名称;3、rest调用;4、jar调用;9其他',
MODIFY COLUMN `execute_path` varchar(500) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT 'job_type=3时,rest调用地址,仅支持post协议;job_type=4时,jar路径;其它值为空',
MODIFY COLUMN `class_name` varchar(500) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT 'job_type=1时,类完整路径;job_type=2时,spring bean名称;其它值为空',
MODIFY COLUMN `method_name` varchar(500) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '任务方法',
MODIFY COLUMN `method_params_value` varchar(2000) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '参数值',
MODIFY COLUMN `cron_expression` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT 'cron执行表达式',
MODIFY COLUMN `job_message` varchar(500) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '日志信息',
MODIFY COLUMN `job_log_status` char(1) CHARACTER SET utf8mb4 DEFAULT '0' COMMENT '执行状态(0正常 1失败)',
MODIFY COLUMN `execute_time` varchar(30) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '执行时间',
MODIFY COLUMN `exception_info` varchar(2000) CHARACTER SET utf8mb4 DEFAULT '' COMMENT '异常信息',
MODIFY COLUMN `fire_instance_id` varchar(128) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT 'Quartz触发实例ID',
MODIFY COLUMN `dedup_status` char(1) CHARACTER SET utf8mb4 DEFAULT '0' COMMENT '去重状态(0正常执行 1同一触发点重复 2任务运行中跳过)';
USE pigxx_mp;
ALTER TABLE `wx_auto_reply`
MODIFY COLUMN `remark` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',
MODIFY COLUMN `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '逻辑删除标记(0:显示;1:隐藏)';
ALTER TABLE `wx_msg`
MODIFY COLUMN `wx_user_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '微信用户ID',
MODIFY COLUMN `read_flag` char(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '1' COMMENT '已读标记(1:是;0:否)',
MODIFY COLUMN `remark` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',
MODIFY COLUMN `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '逻辑删除标记(0:显示;1:隐藏)';
USE pigxx_codegen;
ALTER TABLE `gen_group`
MODIFY COLUMN `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '创建人',
MODIFY COLUMN `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '修改人';
ALTER TABLE `gen_template`
MODIFY COLUMN `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '创建人',
MODIFY COLUMN `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '修改人';
SET FOREIGN_KEY_CHECKS = @pigx_previous_foreign_key_checks;
SET @pigx_previous_foreign_key_checks = NULL;
-58
View File
@@ -1,58 +0,0 @@
-- 适用:升级到独立社交身份表的既有 PIGX 数据库。
-- 执行前备份,并通过 mysql 的 --database 指定 pigxx 或 pigxx_boot;不要对业务库重跑初始化脚本。
-- 保留 sys_user 旧字段;仅迁移当前仍支持的平台。重复执行不会覆盖已经绑定的身份。
-- 若同一身份绑定多个用户,或用户已有不同身份,唯一索引将阻止迁移并回滚数据,请先核对冲突。
CREATE TABLE IF NOT EXISTS `sys_user_social` (
`id` bigint(20) NOT NULL COMMENT '主键ID',
`user_id` bigint(20) NOT NULL COMMENT '用户ID',
`type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '社交平台类型',
`identifier` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '唯一凭据',
`create_time` datetime NOT NULL COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `uk_social_identifier` (`type`,`identifier`) USING BTREE,
UNIQUE KEY `uk_user_social_type` (`user_id`,`type`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户社交登录身份表';
DROP PROCEDURE IF EXISTS pigx_migrate_user_social_20260922;
DELIMITER $$
CREATE PROCEDURE pigx_migrate_user_social_20260922()
BEGIN
DECLARE platform_index INT DEFAULT 0;
DECLARE legacy_column VARCHAR(32);
DECLARE platform_type VARCHAR(32);
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
RESIGNAL;
END;
START TRANSACTION;
WHILE platform_index < 5 DO
SET legacy_column = ELT(platform_index + 1, 'wx_openid', 'mini_openid', 'qq_openid', 'wx_cp_userid', 'wx_ding_userid');
SET platform_type = ELT(platform_index + 1, 'WX', 'MINI', 'QQ', 'WEIXIN_CP', 'DINGTALK');
IF EXISTS (
SELECT 1 FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'sys_user' AND COLUMN_NAME = legacy_column
) THEN
SET @pigx_social_migration_sql = CONCAT(
'INSERT INTO sys_user_social (id, user_id, type, identifier, create_time) ',
'SELECT UUID_SHORT(), u.user_id, ', QUOTE(platform_type), ', u.`', legacy_column, '`, NOW() ',
'FROM sys_user u WHERE u.`', legacy_column, '` IS NOT NULL ',
'AND TRIM(u.`', legacy_column, '`) <> ', QUOTE(''), ' ',
'AND NOT EXISTS (SELECT 1 FROM sys_user_social s WHERE s.user_id = u.user_id ',
'AND s.type = ', QUOTE(platform_type), ' AND BINARY s.identifier = BINARY u.`', legacy_column, '`)'
);
PREPARE pigx_social_migration_stmt FROM @pigx_social_migration_sql;
EXECUTE pigx_social_migration_stmt;
DEALLOCATE PREPARE pigx_social_migration_stmt;
END IF;
SET platform_index = platform_index + 1;
END WHILE;
COMMIT;
END$$
DELIMITER ;
CALL pigx_migrate_user_social_20260922();
DROP PROCEDURE pigx_migrate_user_social_20260922;
SET @pigx_social_migration_sql = NULL;
-27
View File
@@ -1,27 +0,0 @@
# 2026-09-22 数据库脚本同步
以 `ai-dev-next` 的 `c0b8a966b` 为参考,仅同步当前商业版代码对应的结构,不包含 AI 表、菜单、路由和镜像初始化入口。
## 新安装
单体使用 `db/0pigxx_boot.sql`;微服务按 `db/Dockerfile` 所列脚本初始化。两种模式的公共表结构已对齐,包括 utf8mb4、日志 `user_agent` 的 TEXT 类型和用户 `dept_id` 的默认值 0。
内置 `app`、`pig` 客户端的新安装授权类型与参考分支一致,移除 `client_credentials`;其他授权类型保持不变。服务端仍支持该授权模式,需要机器客户端时单独配置。
## 既有数据库
不要对已有数据库重跑带有 `DROP TABLE` 的初始化脚本。备份后先在数据库副本验证,根据实际部署模式选择升级文件:
| 文件 | 适用范围 |
| --- | --- |
| `20260922_schema_alignment_boot.sql` | 单体;执行时指定目标数据库,默认部署为 `pigxx_boot` |
| `20260922_schema_alignment_services.sql` | 微服务;核对脚本内 `USE` 的各模块数据库名 |
| `20260922_user_social.sql` | 从旧版用户表迁移社交身份;单体在 `pigxx_boot` 执行,微服务在 `pigxx` 执行 |
结构升级以本轮修改前的 `dev` 为起点,不是任意历史版本的全量升级工具;更早版本缺少的表或字段需要按实际版本补齐。MySQL DDL 会隐式提交,脚本失败后应核对已完成的语句再重跑。为同步修改 Quartz 外键关联列的字符集,脚本暂时关闭当前会话的外键检查,并在结尾恢复;执行期间停止相关写入,失败时退出该会话。微服务旧表中 `dept_id IS NULL` 的记录先转为 0,再施加非空约束。
社交身份脚本将 `wx_openid`、`mini_openid`、`qq_openid`、`wx_cp_userid`、`wx_ding_userid` 映射到代码中的 `WX`、`MINI`、`QQ`、`WEIXIN_CP`、`DINGTALK`。迁移保留原字段,重复执行跳过完全相同的身份映射;绑定冲突触发唯一索引错误并回滚当次数据迁移,不覆盖新绑定。该脚本使用 `UUID_SHORT()` 生成迁移记录 ID,应在同一 MySQL 实例执行,迁移期间停止账号绑定写入。
结构升级不会覆盖既有 OAuth 授权、第三方应用密钥、注册开关或自定义菜单。旧安装的飞书字典项及应用配置应结合 `pigx-upms/FEISHU-LOGIN.md` 核对;本目录脚本不替用户配置飞书应用。
动态加签的 `process_task_add_sign_record`、`assignment_origin`、`initial_user_id` 已存在于当前单体及微服务初始化脚本。本轮未改动其结构。
@@ -1,431 +0,0 @@
# Flow Starter Withdraw Design
## Scope
This design covers the starter-side "withdraw process" capability across:
- `pigx/pigx-flow`
- `pigx-ui-pro/src/views/flow`
The goal is to add a clear "withdraw" action for starters without conflating it with the existing "terminate process" capability.
## Problem Statement
The current starter-facing page [started.vue](/Users/lengleng/work/dev1227/pigx-ui-pro/src/views/flow/task/started.vue) exposes `终止流程`, but the backend implementation is a force-stop semantic:
- API: `POST /task/task/stopProcessInstance`
- Service: `TaskServiceImpl.stopProcessInstance`
- End reason: `finishReason=9`
This is not the same as business-level "withdraw":
- `withdraw` means the starter takes back a just-submitted process before the first approval has been consumed
- `terminate` means a stronger administrative stop on an in-flight process
If the project keeps reusing terminate for starter withdraw, UI labels, audit semantics, business status sync, and future permission rules will remain mixed.
## Confirmed Product Decisions
### Withdraw Semantics
Use product option `B`:
- the starter can withdraw only when the first approval stage has not been processed yet
### Starter-Side Operation Set
On the starter side:
- remove the generic `终止流程` button
- keep `撤回` as the only starter-side stop action
### Business Visibility
Business pages such as leave requests must explicitly show `已撤回`, not collapse it into `已结束`.
## Goals
1. Add a clear starter-only `撤回` action
2. Keep `撤回` and `终止` as separate backend semantics
3. Compute withdraw availability server-side and expose it to the UI
4. Sync withdraw result to business tables through the existing flow status event chain
5. Avoid duplicating withdraw logic in each business form page
## Non-Goals
1. Do not redesign admin-side force-stop permissions in this iteration
2. Do not add withdraw-reason input in V1
3. Do not add business-form-specific withdraw buttons in every detail page in V1
## Recommended Placement
### Primary Entry
Use the starter list page:
- [started.vue](/Users/lengleng/work/dev1227/pigx-ui-pro/src/views/flow/task/started.vue)
Reason:
- it already represents the "我发起的" mental model
- it already groups starter-only actions such as `重新提交`
- it keeps withdraw as a platform capability instead of pushing it into each business page
### Secondary Entry
Add the same withdraw action in the detail drawer header opened from `started.vue`.
Reason:
- users often inspect details before acting
- it avoids forcing the user back to the list page
### Not Recommended for V1
Do not make business detail pages such as [detail.vue](/Users/lengleng/work/dev1227/pigx-ui-pro/src/views/flow/oaLeave/detail.vue) the primary entry.
Reason:
- this would duplicate logic across each business form
- withdraw is a workflow-center capability, not a business-form-specific capability
## User Interaction Design
### Starter List Display Rules
On [started.vue](/Users/lengleng/work/dev1227/pigx-ui-pro/src/views/flow/task/started.vue):
- show `撤回` only when `canWithdraw === true`
- show `重新提交` when `rejectToStarter === true`
- do not show the old `终止流程` button for normal starters
- show `已撤回` when `finishReason === '3'`
### Detail Drawer Display Rules
In the detail drawer header:
- show `撤回` when `canWithdraw === true`
- optionally show disabled state plus `withdrawDisabledReason` when not allowed
### Confirmation Copy
Use a confirmation dialog before submit:
- title: `确认撤回流程?`
- content: `仅首个审批节点尚未处理时可撤回。撤回后流程将结束,且不可恢复。`
## Approach Comparison
### Option 1: Reuse Existing Stop API
Description:
- keep calling `stopProcessInstance`
- only change button label from `终止流程` to `撤回`
Pros:
- lowest implementation cost
Cons:
- backend semantic remains wrong
- audit and business sync still treat starter withdraw as terminate
- impossible to distinguish `已撤回` from `已终止`
Conclusion:
- reject
### Option 2: New Withdraw API with Shared Internal Termination Path
Description:
- add a new starter-facing withdraw API
- keep terminate as a separate API
- internally share low-level engine shutdown logic
Pros:
- clear product semantics
- supports distinct UI labels and business status mapping
- keeps future admin permission expansion clean
Cons:
- needs small backend refactor
Conclusion:
- recommend
### Option 3: Business-Form-Specific Withdraw Entry First
Description:
- add withdraw directly into each business detail page
Pros:
- strong local context
Cons:
- duplicated logic across forms
- weak platform consistency
Conclusion:
- reject for V1
## Backend Design
### New API
Add a new endpoint in [ProcessTaskController.java](/Users/lengleng/work/dev1227/pigx/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/controller/ProcessTaskController.java):
```http
POST /task/task/withdrawProcessInstance
```
Request body:
```json
{
"processInstanceId": "xxx"
}
```
Use existing DTO [TaskParamDto.java](/Users/lengleng/work/dev1227/pigx/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/TaskParamDto.java) in V1.
### Service Contract
Add method to [ITaskService.java](/Users/lengleng/work/dev1227/pigx/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/ITaskService.java):
```java
R withdrawProcessInstance(TaskParamDto taskParamDto);
```
Implement in [TaskServiceImpl.java](/Users/lengleng/work/dev1227/pigx/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/TaskServiceImpl.java).
### Withdraw Eligibility Rule
Do not try to hard-parse "first approval node" from the process graph for V1.
Instead, use the current persistence model:
1. query `process_instance_record`
2. require:
- current user is starter
- `status == 1`
- no final `finishReason`
3. reject when runtime variable `rejectToStarter == true`
4. inspect `process_node_record_assign_user`
5. if any record exists for the same `processInstanceId` where:
- `nodeId != 'root'`
- and the task has already been processed
then withdraw is not allowed
Suggested definition of "already processed":
- `end_time is not null`, or
- `status != JXZ`
This rule aligns with the current audit model because completed-task reads already rely on [ProcessNodeRecordAssignUser.java](/Users/lengleng/work/dev1227/pigx/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/entity/ProcessNodeRecordAssignUser.java).
### Shared Internal Termination Logic
Refactor the current terminate implementation into a shared internal method, for example:
```java
private R terminateProcessInstance(String processInstanceId, String finishReason)
```
Use it from:
- `stopProcessInstance(..., finishReason='9')`
- `withdrawProcessInstance(..., finishReason='3')`
This keeps engine-level stop logic shared while preserving product-level semantics.
### Persistence Update Rules
On successful withdraw:
1. end the Flowable runtime instance
2. update `process_instance_record`
- `status = 2`
- `finish_reason = '3'`
- `end_time = now`
3. close in-progress `process_node_record`
4. close in-progress `process_node_record_assign_user`
The main requirement is that no runtime or local audit record remains in a "进行中" state after withdraw.
## Frontend Design
### API Layer
Add a new API in [src/api/flow/task/index.ts](/Users/lengleng/work/dev1227/pigx-ui-pro/src/api/flow/task/index.ts):
```ts
export function withdrawProcessInstance(param: { processInstanceId: string }) { ... }
```
### Starter List Data
Extend [ProcessInstanceRecordVo.java](/Users/lengleng/work/dev1227/pigx/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/vo/ProcessInstanceRecordVo.java) with:
- `Boolean canWithdraw`
- `String withdrawDisabledReason`
Populate both in:
- `queryMineStarted`
- `detail(processInstanceId)`
This keeps all action availability server-driven.
### Starter Page Behavior
Update [started.vue](/Users/lengleng/work/dev1227/pigx-ui-pro/src/views/flow/task/started.vue):
1. remove starter-facing `终止流程`
2. add `撤回`
3. keep `重新提交` unchanged for `rejectToStarter`
4. add `已撤回` tag for `finishReason === '3'`
5. add withdraw action in drawer header as secondary entry
## Flow Status and Business Status Design
### Flow-Level Final States
Keep `process_instance_record.status` as coarse state:
- `1` 进行中
- `2` 已结束
Use `finish_reason` for final meaning:
- `1` 通过
- `0` 拒绝
- `3` 撤回
- `9` 终止
### Business Table Mapping
For leave requests in [BpmOaLeaveEntity.java](/Users/lengleng/work/dev1227/pigx/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/entity/BpmOaLeaveEntity.java), the current `leaveStatus` values are too coarse.
Recommended mapping:
- `0` 待审批
- `1` 进行中
- `2` 已通过
- `3` 已撤回
- `4` 已拒绝
- `5` 已终止
If schema change must stay minimal, a fallback is adding a separate finish-reason field. That is not recommended for V1 because UI filtering and display would become more fragmented.
### Event-Driven Sync
Continue using the existing status event chain:
- [FlowProcessEventListener.java](/Users/lengleng/work/dev1227/pigx/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/listeners/FlowProcessEventListener.java)
- [NodeTaskCompleteNotify.java](/Users/lengleng/work/dev1227/pigx/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/listeners/NodeTaskCompleteNotify.java)
- [IProcessInstanceStatusEventService.java](/Users/lengleng/work/dev1227/pigx/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/event/IProcessInstanceStatusEventService.java)
Update [BpmOaLeaveServiceImpl.java](/Users/lengleng/work/dev1227/pigx/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/BpmOaLeaveServiceImpl.java) so `handleStatusEvent` maps based on:
- `status`
- `finishReason`
not just `status`.
This design should become the standard pattern for other business tables too.
## Detail Response Contract
The current [ProcessInstanceServiceImpl.java](/Users/lengleng/work/dev1227/pigx/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/ProcessInstanceServiceImpl.java) `detail(processInstanceId)` response should be extended with:
- `canWithdraw`
- `withdrawDisabledReason`
- current `finishReason`
This lets the drawer header and later business detail integrations share one source of truth.
## Validation and Error Handling
### Backend Errors
Suggested failure messages:
- `流程不存在或已结束`
- `仅发起人可撤回流程`
- `驳回待提交状态不可撤回`
- `首个审批节点已处理,无法撤回`
### Frontend Behavior
On withdraw failure:
- show backend error message directly when available
- refresh list after success
- close detail drawer after success if triggered there
## Acceptance Criteria
### UI Acceptance
1. `我发起的` page shows `撤回` only for eligible in-progress instances
2. `重新提交` remains available only for reject-to-starter instances
3. starter-facing `终止流程` no longer appears
4. withdrawn instances show `已撤回`
5. detail drawer header stays consistent with list action availability
### Backend Acceptance
1. withdraw is rejected once any non-root approval record has been processed
2. withdraw ends the runtime instance cleanly
3. `process_instance_record.finish_reason='3'` after withdraw
4. no in-progress node or assign-user record remains after withdraw
5. existing terminate path still yields `finishReason='9'`
### Business Acceptance
1. leave request business status explicitly displays `已撤回`
2. leave request no longer collapses withdraw into generic `已结束`
## Risks
1. `ProcessNodeRecordAssignUser.status` comments and actual usage are not fully consistent, so withdraw implementation should rely on current persisted behavior, not comments alone
2. some business modules may currently map only `status` and ignore `finishReason`, causing partial UI mismatch until each listener implementation is updated
3. parallel first-approval scenarios must use "any processed non-root approval record" as the blocking condition
## Rollout Order
1. add backend withdraw API and shared termination helper
2. add `finishReason='3'` support in flow list/detail responses
3. update starter page actions and status tags
4. update leave business status mapping and display
5. verify happy path and blocked path with real process instances
## Implementation Outline
The `writing-plans` skill referenced by the brainstorming workflow is not available in this workspace. As a fallback, use this execution order:
1. Backend
- add `withdrawProcessInstance` controller/service method
- extract shared terminate helper
- return `canWithdraw` and `withdrawDisabledReason` from starter list and detail
2. Frontend
- add withdraw API client
- replace starter-side terminate button with withdraw
- add withdrawn status tag and detail-header action
3. Business sync
- extend leave status mapping for withdrawn
- update leave list/detail labels and filters if needed
4. Verification
- test starter can withdraw before first approval action
- test withdraw blocked after any first-stage approval processing
- test business page shows `已撤回`
@@ -1,377 +0,0 @@
# Flow Withdraw Resubmit Design
## Scope
This design covers starter-side "resubmit after withdraw" behavior for:
- `pigx-ui-pro/src/views/flow/task/started.vue`
- dynamic flow forms
- custom business forms
The capability is limited to processes already withdrawn by the starter. It does not reopen the old process instance.
## Problem Statement
The current flow center supports:
- withdraw for starter-side in-progress instances
- resubmit for `rejectToStarter`
But it does not support the common case where the starter withdraws because they found mistakes in the form and wants to:
1. edit the old submitted data
2. keep the withdrawn record as history
3. start a brand new process instance from the corrected data
This must work for both:
- dynamic flow forms
- custom business forms
## Confirmed Product Decisions
1. After withdraw, resubmission must create a new process instance
2. The old withdrawn record must remain as a separate historical record
3. The entry point should be a single user-facing capability: `重新编辑提交`
4. The implementation path should split by form type:
- dynamic flow form: edit in flow center drawer
- business form: edit in a page/container path
5. Previous manually selected approvers / copy recipients should be carried as defaults and remain editable
## Goals
1. Add `重新编辑提交` for withdrawn starter records
2. Let users correct form mistakes before submitting again
3. Preserve withdrawn process history
4. Reuse existing form loading and start-process capabilities where possible
5. Support both dynamic and business forms in the same product capability
## Non-Goals
1. Do not reopen the old withdrawn Flowable instance
2. Do not merge new submission into the old withdrawn record
3. Do not copy approval history from the old instance to the new one
4. Do not introduce a dedicated backend "withdraw-resubmit" API in V1
## Recommended Approach
### Option 1: Unified Entry, Split by Form Type
Description:
- show one action named `重新编辑提交`
- branch internally by form type
- dynamic flow forms open an editable drawer in flow center
- business forms go through a common restart container page
Pros:
- unified user mental model
- minimal duplication
- works for both form types
- avoids forcing every business form page to implement workflow-side participant editing on its own
Cons:
- needs a common restart context loader
- needs one new common business-form restart container page
Conclusion:
- recommend
### Option 2: Always Jump to a Full Page
Description:
- both dynamic forms and business forms always jump to a dedicated page
Pros:
- interaction form is consistent
Cons:
- duplicates current dynamic-form drawer flow
- larger change surface
Conclusion:
- not recommended for V1
### Option 3: Always Stay in started.vue Drawer
Description:
- both dynamic forms and business forms are handled inside `started.vue`
Pros:
- entry is centralized
Cons:
- business forms often depend on route/page context
- harder to keep complex custom forms maintainable
Conclusion:
- reject
## Product Behavior
### Starter List
On [started.vue](/Users/lengleng/work/dev1227/pigx-ui-pro/src/views/flow/task/started.vue):
- records with process status `已撤回` should display `重新编辑提交`
- records with `rejectToStarter` should keep the current `重新提交`
- these are different capabilities and must remain separate
### Old Record Handling
After successful resubmission:
- the old record remains `已撤回`
- a new record appears as `进行中`
### Button Naming
Use a single starter-facing action name:
- `重新编辑提交`
Reason:
- it makes the user intent explicit
- it distinguishes this flow from `驳回待提交 -> 重新提交`
## Data Flow Design
### Shared Source Data
When the user clicks `重新编辑提交`, frontend should load:
1. old instance snapshot via `detail(processInstanceId)`
2. current flow definition via `getFlowDetail(flowId)`
The old instance snapshot provides:
- previous form data
- previous manually selected participant values stored in submitted process params
The current flow definition provides:
- current form type
- current form component path / dynamic form schema
- current selectable participant nodes
### Participant Default Value Strategy
Only carry forward values the user explicitly selected before.
Use old submitted process params such as:
- `nodeId_assignee_select`
Do not carry forward:
- historical approval results
- historical comments
- runtime-derived approval outcomes
If a previously selected node no longer exists in the current flow definition:
- ignore the old value
If a new required selectable node is present in the current definition:
- require the user to select it again before submit
## Form-Type Split
### Dynamic Flow Form
When `formType=10`:
- stay in [started.vue](/Users/lengleng/work/dev1227/pigx-ui-pro/src/views/flow/task/started.vue)
- open an editable restart drawer
- left side reuses dynamic form rendering
- right side reuses [FlowNodeFormatData.vue](/Users/lengleng/work/dev1227/pigx-ui-pro/src/views/flow/form/tools/FlowNodeFormatData.vue)
- old participant selections are injected into `nodeUser`
- submit starts a new process instance
### Business Form
When `formType=20`:
- do not jump directly to each existing business create page as the primary architecture
- add a common restart container page under flow task module
- the container page is responsible for:
- loading the business form create component
- loading the current flow definition
- rendering the right-side participant panel
- orchestrating final submit as a new process start
Reason:
- existing business pages usually do not own a common workflow participant panel
- a common restart container keeps workflow behavior centralized and reusable
## Frontend Component Boundary
### started.vue
Responsibilities:
- expose `重新编辑提交` entry for withdrawn records
- decide route vs drawer by form type
- continue handling current starter list concerns
### New Restart Context Loader
Add a shared loader/composable responsible for:
- fetching old instance detail
- fetching current flow detail
- building initial form values
- building initial participant defaults
- exposing the resolved restart mode
### FlowNodeFormatData.vue
Needs a small enhancement:
- allow external default `nodeUser` injection for restart scenarios
### New Business Restart Container Page
Responsibilities:
- render the business create component dynamically
- render `FlowNodeFormatData`
- merge edited business form data and participant selections
- start a new process instance
## Existing Capabilities Reused
### Frontend
- [dynamicComponent.ts](/Users/lengleng/work/dev1227/pigx-ui-pro/src/views/flow/workflow/utils/dynamicComponent.ts)
- [useTaskForm.ts](/Users/lengleng/work/dev1227/pigx-ui-pro/src/views/flow/task/composables/useTaskForm.ts)
- [FlowNodeFormatData.vue](/Users/lengleng/work/dev1227/pigx-ui-pro/src/views/flow/form/tools/FlowNodeFormatData.vue)
- [startFlow](/Users/lengleng/work/dev1227/pigx-ui-pro/src/api/flow/flow/index.ts)
### Backend
V1 should reuse existing APIs:
- `detail(processInstanceId)`
- `getFlowDetail(flowId)`
- `startProcessInstance / startFlow`
No dedicated backend restart API is required in V1.
## Business Form Compatibility
For business forms to participate in V1:
- their create component must support loading old data by `processInstanceId`
Example:
- [create.vue](/Users/lengleng/work/dev1227/pigx-ui-pro/src/views/flow/oaLeave/create.vue) already supports querying old data with `processInstanceId`
If some business form cannot load old data this way:
- it is out of V1 support unless adapted
## Submit Semantics
### Dynamic Form Submit
Payload:
- edited dynamic form data
- participant selections from `FlowNodeFormatData`
Behavior:
- call process start API
- create a new process instance
### Business Form Submit
Payload:
- edited business form data from the business create component
- participant selections from `FlowNodeFormatData`
Behavior:
- call business-form submit path that starts a new process instance
- create a new process instance
## Success and Failure UX
### Success
Message:
- `已重新发起流程`
Behavior:
- close restart drawer or leave restart page
- return to starter list
- refresh list
### Failure
If current flow definition is unavailable:
- `当前流程已不可发起`
If business form component path is invalid:
- `业务表单不可用,无法重新发起`
If old participant values are no longer valid:
- do not block opening
- require reselection at validation time
## Acceptance Criteria
1. Withdrawn starter records show `重新编辑提交`
2. Dynamic flow forms open editable restart drawer with old form values
3. Business forms open common restart container with old form values
4. Previous manually selected approvers/copy users are prefilled when possible
5. User can change both form data and participant selections before submit
6. Submit creates a new process instance
7. Old withdrawn record remains unchanged
8. New record appears independently in starter list
## Risks
1. Business forms vary in how much they depend on route context
2. Some business create components may not yet support restart-container integration cleanly
3. Participant default values rely on old submitted explicit selections, not on all runtime assignment types
## Recommended V1 Rollout
1. Dynamic flow forms first
2. Common restart container for business forms
3. Verify `oaLeave` as the first business-form example
4. Expand to additional business forms that already support `processInstanceId`-based reload
## Implementation Outline
The `writing-plans` skill referenced by brainstorming is unavailable in this workspace. As a fallback, implement in this order:
1. Add withdrawn-record `重新编辑提交` action to starter list
2. Add restart context loader and split logic by form type
3. Add dynamic-form restart drawer path
4. Add business-form restart container page
5. Enhance participant panel to accept default values
6. Verify `oaLeave` and one dynamic form end to end