From db60b48f6c97afea7e673cb390f77328fe34bdea Mon Sep 17 00:00:00 2001 From: PIGCLOUD Date: Tue, 22 Sep 2026 22:14:02 +0800 Subject: [PATCH] =?UTF-8?q?feat(db):=20=E5=88=A0=E9=99=A4=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E7=A4=BE=E4=BA=A4=E8=BA=AB=E4=BB=BD=E8=A1=A8=E5=8F=8A?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E8=BF=81=E7=A7=BB=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 删除 `20260922_user_social.sql` 文件及其内容 - 更新 `README.md`,移除关于用户社交身份迁移的说明 - 删除 `2026-03-18-flow-withdraw-design.md` 和 `2026-03-19-flow-withdraw-resubmit-design.md` 文档,清理与撤回和重新提交流程相关的设计文档 --- db/upgrade/20260922_schema_alignment_boot.sql | 196 -------- .../20260922_schema_alignment_services.sql | 207 --------- db/upgrade/20260922_user_social.sql | 58 --- db/upgrade/README.md | 27 -- docs/plans/2026-03-18-flow-withdraw-design.md | 431 ------------------ ...026-03-19-flow-withdraw-resubmit-design.md | 377 --------------- 6 files changed, 1296 deletions(-) delete mode 100644 db/upgrade/20260922_schema_alignment_boot.sql delete mode 100644 db/upgrade/20260922_schema_alignment_services.sql delete mode 100644 db/upgrade/20260922_user_social.sql delete mode 100644 db/upgrade/README.md delete mode 100644 docs/plans/2026-03-18-flow-withdraw-design.md delete mode 100644 docs/plans/2026-03-19-flow-withdraw-resubmit-design.md diff --git a/db/upgrade/20260922_schema_alignment_boot.sql b/db/upgrade/20260922_schema_alignment_boot.sql deleted file mode 100644 index 6bac7193b..000000000 --- a/db/upgrade/20260922_schema_alignment_boot.sql +++ /dev/null @@ -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; diff --git a/db/upgrade/20260922_schema_alignment_services.sql b/db/upgrade/20260922_schema_alignment_services.sql deleted file mode 100644 index f5c2f1a11..000000000 --- a/db/upgrade/20260922_schema_alignment_services.sql +++ /dev/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; diff --git a/db/upgrade/20260922_user_social.sql b/db/upgrade/20260922_user_social.sql deleted file mode 100644 index 6364dc0d7..000000000 --- a/db/upgrade/20260922_user_social.sql +++ /dev/null @@ -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; diff --git a/db/upgrade/README.md b/db/upgrade/README.md deleted file mode 100644 index 27f4a32df..000000000 --- a/db/upgrade/README.md +++ /dev/null @@ -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` 已存在于当前单体及微服务初始化脚本。本轮未改动其结构。 diff --git a/docs/plans/2026-03-18-flow-withdraw-design.md b/docs/plans/2026-03-18-flow-withdraw-design.md deleted file mode 100644 index 9f2c57e16..000000000 --- a/docs/plans/2026-03-18-flow-withdraw-design.md +++ /dev/null @@ -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 `已撤回` diff --git a/docs/plans/2026-03-19-flow-withdraw-resubmit-design.md b/docs/plans/2026-03-19-flow-withdraw-resubmit-design.md deleted file mode 100644 index 014067af5..000000000 --- a/docs/plans/2026-03-19-flow-withdraw-resubmit-design.md +++ /dev/null @@ -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