diff --git a/db/0pigxx_boot.sql b/db/0pigxx_boot.sql index 285f9cd54..4affc6981 100644 --- a/db/0pigxx_boot.sql +++ b/db/0pigxx_boot.sql @@ -1509,6 +1509,30 @@ CREATE TABLE `process` ( KEY `idx_id` (`id`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=182 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='流程定义数据'; +-- ---------------------------- +-- Table structure for bmp_oa_leave +-- ---------------------------- +DROP TABLE IF EXISTS `bmp_oa_leave`; +CREATE TABLE `bmp_oa_leave` ( + `id` bigint NOT NULL COMMENT '请假表单主键', + `username` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '申请人', + `leave_type` int NOT NULL COMMENT '请假类型', + `leave_reason` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '请假原因', + `start_time` datetime NOT NULL COMMENT '开始时间', + `end_time` datetime NOT NULL COMMENT '结束时间', + `leave_day` int NOT NULL COMMENT '请假天数', + `leave_status` int DEFAULT NULL COMMENT '请假结果', + `process_instance_id` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '流程实例的编号', + `create_by` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者', + `create_time` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT '创建时间', + `update_by` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者', + `update_time` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '更新时间', + `del_flag` char(1) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户编号', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='请假表单'; + +SET FOREIGN_KEY_CHECKS = 1; -- ---------------------------- -- Table structure for process_copy @@ -2947,673 +2971,3 @@ BEGIN; INSERT INTO `app_user_role` VALUES (1, 1); COMMIT; -INSERT INTO `sys_menu` VALUES (9700,'AI大模型',NULL,'/knowledge',NULL,-1,'iconfont icon-zhishi','1',5,'0',NULL,'0','admin','2024-03-14 13:48:31','admin','2025-03-28 12:39:07','0',1); -INSERT INTO `sys_menu` VALUES (9710,'文档管理','','/knowledge/aiDocument/index',NULL,9822,'iconfont icon-wendangguanli','1',4,'0',NULL,'0','',NULL,'admin','2025-03-28 12:54:18','0',1); -INSERT INTO `sys_menu` VALUES (9711,'知识文档查看','knowledge_aiDocument_view',NULL,NULL,9710,'1','1',0,'0',NULL,'1',' ',NULL,' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9712,'知识文档新增','knowledge_aiDocument_add',NULL,NULL,9710,'1','1',1,'0',NULL,'1',' ',NULL,' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9713,'知识文档修改','knowledge_aiDocument_edit',NULL,NULL,9710,'1','1',2,'0',NULL,'1',' ',NULL,' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9714,'知识文档删除','knowledge_aiDocument_del',NULL,NULL,9710,'1','1',3,'0',NULL,'1',' ',NULL,' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9715,'导入导出','knowledge_aiDocument_export',NULL,NULL,9710,'1','1',3,'0',NULL,'1',' ',NULL,' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9720,'AI 知识库','','/knowledge/aiDataset/index',NULL,9822,'iconfont icon-zhishiku','1',3,'0',NULL,'0','',NULL,'admin','2025-03-28 12:54:07','0',1); -INSERT INTO `sys_menu` VALUES (9721,'知识库查看','knowledge_aiDataset_view',NULL,NULL,9720,'1','1',0,'0',NULL,'1',' ',NULL,' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9722,'知识库新增','knowledge_aiDataset_add',NULL,NULL,9720,'1','1',1,'0',NULL,'1',' ',NULL,' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9723,'知识库修改','knowledge_aiDataset_edit',NULL,NULL,9720,'1','1',2,'0',NULL,'1',' ',NULL,' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9724,'知识库删除','knowledge_aiDataset_del',NULL,NULL,9720,'1','1',3,'0',NULL,'1',' ',NULL,' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9725,'导入导出','knowledge_aiDataset_export',NULL,NULL,9720,'1','1',3,'0',NULL,'1',' ',NULL,' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9730,'切片管理','','/knowledge/aiSlice/index',NULL,9822,'iconfont icon-qiepianguanli','1',5,'0',NULL,'0','',NULL,'admin','2025-03-28 12:54:34','0',1); -INSERT INTO `sys_menu` VALUES (9731,'知识切片查看','knowledge_aiSlice_view',NULL,NULL,9730,'1','1',0,'0',NULL,'1',' ',NULL,' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9732,'知识切片新增','knowledge_aiSlice_add',NULL,NULL,9730,'1','1',1,'0',NULL,'1',' ',NULL,' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9733,'知识切片修改','knowledge_aiSlice_edit',NULL,NULL,9730,'1','1',2,'0',NULL,'1',' ',NULL,' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9734,'知识切片删除','knowledge_aiSlice_del',NULL,NULL,9730,'1','1',3,'0',NULL,'1',' ',NULL,' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9735,'导入导出','knowledge_aiSlice_export',NULL,NULL,9730,'1','1',3,'0',NULL,'1',' ',NULL,' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9740,'提示词管理','','/knowledge/aiPrompt/index',NULL,9818,'iconfont icon-tishici','1',6,'0',NULL,'0','',NULL,'admin','2025-03-28 12:49:51','0',1); -INSERT INTO `sys_menu` VALUES (9741,'提示词查看','knowledge_aiPrompt_view',NULL,NULL,9740,'1','1',0,'0',NULL,'1',' ',NULL,' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9742,'提示词新增','knowledge_aiPrompt_add',NULL,NULL,9740,'1','1',1,'0',NULL,'1',' ',NULL,' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9743,'提示词修改','knowledge_aiPrompt_edit',NULL,NULL,9740,'1','1',2,'0',NULL,'1',' ',NULL,' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9744,'提示词删除','knowledge_aiPrompt_del',NULL,NULL,9740,'1','1',3,'0',NULL,'1',' ',NULL,' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9745,'导入导出','knowledge_aiPrompt_export',NULL,NULL,9740,'1','1',3,'0',NULL,'1',' ',NULL,' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9750,'账单管理','','/knowledge/aiBill/index',NULL,9818,'iconfont icon-zhangdanguanli','1',0,'0',NULL,'0','',NULL,'admin','2025-03-28 12:48:56','0',1); -INSERT INTO `sys_menu` VALUES (9751,'账单查看','knowledge_aiBill_view',NULL,NULL,9750,'1','1',0,'0',NULL,'1',' ',NULL,' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9752,'账单新增','knowledge_aiBill_add',NULL,NULL,9750,'1','1',1,'0',NULL,'1',' ',NULL,' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9753,'账单修改','knowledge_aiBill_edit',NULL,NULL,9750,'1','1',2,'0',NULL,'1',' ',NULL,' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9754,'账单删除','knowledge_aiBill_del',NULL,NULL,9750,'1','1',3,'0',NULL,'1',' ',NULL,' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9755,'导入导出','knowledge_aiBill_export',NULL,NULL,9750,'1','1',3,'0',NULL,'1',' ',NULL,' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9760,'AI 助手',NULL,'/knowledge/aiChat/index',NULL,9700,'iconfont icon-aizhushou','1',0,'0','0','0','admin','2024-03-20 14:51:13','admin','2025-03-28 13:00:16','0',1); -INSERT INTO `sys_menu` VALUES (9770,'数据标注','','/knowledge/aiChatRecord/index',NULL,9818,'iconfont icon-shujuzhongxin-shujubiaozhu','1',7,'0',NULL,'0','',NULL,'admin','2025-03-28 12:49:59','0',1); -INSERT INTO `sys_menu` VALUES (9771,'查看','knowledge_aiChatRecord_view',NULL,NULL,9770,'1','1',0,'0',NULL,'1',' ',NULL,' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9772,'新增','knowledge_aiChatRecord_add',NULL,NULL,9770,'1','1',1,'0',NULL,'1',' ',NULL,' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9773,'修改','knowledge_aiChatRecord_edit',NULL,NULL,9770,'1','1',2,'0',NULL,'1',' ',NULL,' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9774,'删除','knowledge_aiChatRecord_del',NULL,NULL,9770,'1','1',3,'0',NULL,'1',' ',NULL,' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9775,'导入导出','knowledge_aiChatRecord_export',NULL,NULL,9770,'1','1',3,'0',NULL,'1',' ',NULL,' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9776,'OCR配置页面',NULL,'/knowledge/ocr/KonvaPage',NULL,9819,'iconfont icon-yunxiazai_o','0',999,'0','0','0','admin','2024-09-09 17:28:01','admin','2025-03-28 12:51:38','0',1); -INSERT INTO `sys_menu` VALUES (9777,'AI 慧眼',NULL,'/knowledge/ocr/index',NULL,9819,'iconfont icon-OCRshibie','1',999,'0',NULL,'0','admin','2024-09-10 00:49:09','admin','2025-03-28 12:51:46','0',1); -INSERT INTO `sys_menu` VALUES (9778,'查看','knowledge_ocr_view',NULL,NULL,9777,NULL,'1',1,'0',NULL,'1','admin','2024-09-10 00:49:09',' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9779,'新增','knowledge_ocr_add',NULL,NULL,9777,NULL,'1',1,'0',NULL,'1','admin','2024-09-10 00:49:09',' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9780,'编辑','knowledge_ocr_edit',NULL,NULL,9777,NULL,'1',1,'0',NULL,'1','admin','2024-09-10 00:49:09',' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9781,'删除','knowledge_ocr_del',NULL,NULL,9777,NULL,'1',1,'0',NULL,'1','admin','2024-09-10 00:49:09',' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9782,'模型配置',NULL,'/knowledge/aiModel/index',NULL,9818,'iconfont icon-zhuantikumoxingpeizhi','1',1,'0',NULL,'0','admin','2024-09-27 23:37:54','admin','2025-03-28 12:49:07','0',1); -INSERT INTO `sys_menu` VALUES (9783,'查看','knowledge_aiModel_view',NULL,NULL,9782,NULL,'1',1,'0',NULL,'1','admin','2024-09-27 23:37:54',' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9784,'新增','knowledge_aiModel_add',NULL,NULL,9782,NULL,'1',1,'0',NULL,'1','admin','2024-09-27 23:37:54',' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9785,'编辑','knowledge_aiModel_edit',NULL,NULL,9782,NULL,'1',1,'0',NULL,'1','admin','2024-09-27 23:37:54',' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9786,'删除','knowledge_aiModel_del',NULL,NULL,9782,NULL,'1',1,'0',NULL,'1','admin','2024-09-27 23:37:54',' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9787,'导入导出','knowledge_aiModel_export',NULL,NULL,9782,NULL,'1',1,'0',NULL,'1','admin','2024-09-27 23:37:54',' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9788,'向量配置',NULL,'/knowledge/aiEmbedStore/index',NULL,9818,'iconfont icon-xiangliang','1',2,'0',NULL,'0','admin','2024-09-27 23:37:54','admin','2025-03-28 12:49:37','0',1); -INSERT INTO `sys_menu` VALUES (9789,'查看','knowledge_aiEmbedStore_view',NULL,NULL,9782,NULL,'1',1,'0',NULL,'1','admin','2024-09-27 23:37:54',' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9790,'新增','knowledge_aiEmbedStore_add',NULL,NULL,9782,NULL,'1',1,'0',NULL,'1','admin','2024-09-27 23:37:54',' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9791,'编辑','knowledge_aiEmbedStore_edit',NULL,NULL,9782,NULL,'1',1,'0',NULL,'1','admin','2024-09-27 23:37:54',' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9792,'删除','knowledge_aiEmbedStore_del',NULL,NULL,9782,NULL,'1',1,'0',NULL,'1','admin','2024-09-27 23:37:54',' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9793,'AI 编排',NULL,'/knowledge/aiFlow/manage/index',NULL,9823,'iconfont icon-tenant','1',999,'0','0','0','admin','2025-03-02 17:59:12','admin','2025-03-28 12:59:24','0',1); -INSERT INTO `sys_menu` VALUES (9794,'查看','knowledge_aiFlow_view',NULL,NULL,9793,NULL,'1',0,'0','0','1','admin','2025-03-03 10:49:32','admin','2025-03-03 10:58:48','0',1); -INSERT INTO `sys_menu` VALUES (9795,'新增','knowledge_aiFlow_add',NULL,NULL,9793,NULL,'1',0,'0','0','1','admin','2025-03-03 10:49:43',' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9796,'编辑','knowledge_aiFlow_edit',NULL,NULL,9793,NULL,'1',0,'0','0','1','admin','2025-03-03 10:49:54',' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9797,'删除','knowledge_aiFlow_del',NULL,NULL,9793,NULL,'1',0,'0','0','1','admin','2025-03-03 10:50:08',' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9800,'AI MCP',NULL,'/knowledge/aiMcpConfig/index',NULL,9700,'iconfont icon-mcp','1',3,'0',NULL,'0','admin','2025-03-22 13:36:32','admin','2025-03-31 10:41:22','0',1); -INSERT INTO `sys_menu` VALUES (9801,'查看','knowledge_aiMcpConfig_view',NULL,NULL,9800,NULL,'1',1,'0',NULL,'1','admin','2025-03-22 13:36:32',' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9802,'新增','knowledge_aiMcpConfig_add',NULL,NULL,9800,NULL,'1',1,'0',NULL,'1','admin','2025-03-22 13:36:32',' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9803,'编辑','knowledge_aiMcpConfig_edit',NULL,NULL,9800,NULL,'1',1,'0',NULL,'1','admin','2025-03-22 13:36:32',' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9804,'删除','knowledge_aiMcpConfig_del',NULL,NULL,9800,NULL,'1',1,'0',NULL,'1','admin','2025-03-22 13:36:32',' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9805,'导入导出','knowledge_aiMcpConfig_export',NULL,NULL,9800,NULL,'1',1,'0',NULL,'1','admin','2025-03-22 13:36:32',' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9806,'AI 数据集',NULL,'/knowledge/aiData/index',NULL,9820,'iconfont icon-chanliangfenxi','1',2,'0',NULL,'0','admin','2025-03-26 21:47:46','admin','2025-03-28 13:25:26','0',1); -INSERT INTO `sys_menu` VALUES (9807,'查看','knowledge_aiData_view',NULL,NULL,9806,NULL,'1',1,'0',NULL,'1','admin','2025-03-26 21:47:46',' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9808,'新增','knowledge_aiData_add',NULL,NULL,9806,NULL,'1',1,'0',NULL,'1','admin','2025-03-26 21:47:46',' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9809,'编辑','knowledge_aiData_edit',NULL,NULL,9806,NULL,'1',1,'0',NULL,'1','admin','2025-03-26 21:47:46',' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9810,'删除','knowledge_aiData_del',NULL,NULL,9806,NULL,'1',1,'0',NULL,'1','admin','2025-03-26 21:47:46',' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9811,'导入导出','knowledge_aiData_export',NULL,NULL,9806,NULL,'1',1,'0',NULL,'1','admin','2025-03-26 21:47:46',' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9812,'AI 数据表',NULL,'/knowledge/aiDataTable/index',NULL,9820,'iconfont icon-SQLshujuji','1',1,'0',NULL,'0','admin','2025-03-26 21:48:16','admin','2025-03-28 13:17:59','0',1); -INSERT INTO `sys_menu` VALUES (9813,'查看','knowledge_aiDataTable_view',NULL,NULL,9812,NULL,'1',1,'0',NULL,'1','admin','2025-03-26 21:48:16',' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9814,'新增','knowledge_aiDataTable_add',NULL,NULL,9812,NULL,'1',1,'0',NULL,'1','admin','2025-03-26 21:48:16',' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9815,'编辑','knowledge_aiDataTable_edit',NULL,NULL,9812,NULL,'1',1,'0',NULL,'1','admin','2025-03-26 21:48:16',' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9816,'删除','knowledge_aiDataTable_del',NULL,NULL,9812,NULL,'1',1,'0',NULL,'1','admin','2025-03-26 21:48:16',' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9817,'导入导出','knowledge_aiDataTable_export',NULL,NULL,9812,NULL,'1',1,'0',NULL,'1','admin','2025-03-26 21:48:16',' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9818,'AI 配置',NULL,'/knowledge/config',NULL,9700,'iconfont icon-UI-AIpeizhi','1',1,'0',NULL,'0','admin','2025-03-28 12:40:21','admin','2025-03-28 13:09:04','0',1); -INSERT INTO `sys_menu` VALUES (9819,'AI 视觉',NULL,'/knowledge/vision',NULL,9700,'iconfont icon-Television','1',5,'0',NULL,'0','admin','2025-03-28 12:41:54','admin','2025-03-28 13:09:31','0',1); -INSERT INTO `sys_menu` VALUES (9820,'AI 问数',NULL,'/knowledge/data',NULL,9700,'iconfont icon-keshihuazhanshi','1',3,'0','0','0','admin','2025-03-28 12:43:11','admin','2025-03-28 13:14:04','0',1); -INSERT INTO `sys_menu` VALUES (9821,'AI 联动',NULL,'/knowledge/aiChat/base/-6','/knowledge/aiChat/base',9700,'iconfont icon-liandong','1',4,'0','0','0','admin','2025-03-28 12:43:49','admin','2025-03-29 09:55:21','0',1); -INSERT INTO `sys_menu` VALUES (9822,'AI 问答',NULL,'/knowledge/rag',NULL,9700,'iconfont icon-icon_icon_tiwen_s','1',2,'0','0','0','admin','2025-03-28 12:53:51','admin','2025-03-28 13:17:36','0',1); -INSERT INTO `sys_menu` VALUES (9823,'AI 智能体',NULL,'/knowledge/agent',NULL,9700,'iconfont icon-zhinengti','1',999,'0',NULL,'0','admin','2025-03-28 12:58:40','admin','2025-03-28 13:12:13','0',1); -INSERT INTO `sys_menu` VALUES (9824,'AI 智绘',NULL,'/knowledge/aiChat/image',NULL,9819,'iconfont icon-tupian','1',0,'0',NULL,'0','admin','2025-03-28 12:58:40','admin','2025-03-28 13:12:13','0',1); -INSERT INTO `sys_menu` VALUES (9825,'AI 思图',NULL,'/knowledge/aiChat/base/-4','/knowledge/aiChat/base',9819,'iconfont icon-chanliangfenxi','1',1,'0','0','0','admin','2025-03-29 09:44:12','admin','2025-03-29 09:46:22','0',1); -INSERT INTO `sys_menu` VALUES (9826,'AI 海报',NULL,'/knowledge/aiPoster/index',NULL,9819,'iconfont icon-haibao-1','1',1,'0','0','0','admin','2025-03-29 09:44:12','admin','2025-03-29 09:46:22','0',1); -INSERT INTO `sys_menu` VALUES (9827,'AI 视频',NULL,'/knowledge/aiChat/video',NULL,9819,'iconfont icon-shipinbofang','1',0,'0',NULL,'0','admin','2025-03-28 12:58:40','admin','2025-03-28 13:12:13','0',1); -INSERT INTO `sys_menu` VALUES (9828,'AI 音频',NULL,'/knowledge/aiChat/voice',NULL,9819,'iconfont icon-yinpin','1',0,'0',NULL,'0','admin','2025-03-28 12:58:40','admin','2025-03-28 13:12:13','0',1); -INSERT INTO `sys_menu` VALUES (9829,'AI 报告配置',NULL,'/knowledge/aiReport/KonvaPage',NULL,9700,'iconfont icon-yunxiazai_o','0',4,'0','0','0','admin','2024-09-09 17:28:01','admin','2025-03-28 12:51:38','0',1); -INSERT INTO `sys_menu` VALUES (9830,'AI 报告',NULL,'/knowledge/aiReport/index',NULL,9700,'iconfont icon-xitongrizhi','1',4,'0',NULL,'0','admin','2025-03-28 12:41:54','admin','2025-03-28 13:09:31','0',1); -INSERT INTO `sys_menu` VALUES (9831,'查看','knowledge_aiReportConf_view',NULL,NULL,9830,NULL,'1',1,'0',NULL,'1','admin','2025-03-26 21:48:16',' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9832,'新增','knowledge_aiReportConf_add',NULL,NULL,9830,NULL,'1',1,'0',NULL,'1','admin','2025-03-26 21:48:16',' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9833,'编辑','knowledge_aiReportConf_edit',NULL,NULL,9830,NULL,'1',1,'0',NULL,'1','admin','2025-03-26 21:48:16',' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9834,'删除','knowledge_aiReportConf_del',NULL,NULL,9830,NULL,'1',1,'0',NULL,'1','admin','2025-03-26 21:48:16',' ',NULL,'0',1); -INSERT INTO `sys_menu` VALUES (9835,'导入导出','knowledge_aiReportConf_export',NULL,NULL,9830,NULL,'1',1,'0',NULL,'1','admin','2025-03-26 21:48:16',' ',NULL,'0',1); - - -INSERT INTO `sys_role_menu` VALUES (1, 9700); -INSERT INTO `sys_role_menu` VALUES (1, 9710); -INSERT INTO `sys_role_menu` VALUES (1, 9711); -INSERT INTO `sys_role_menu` VALUES (1, 9712); -INSERT INTO `sys_role_menu` VALUES (1, 9713); -INSERT INTO `sys_role_menu` VALUES (1, 9714); -INSERT INTO `sys_role_menu` VALUES (1, 9715); -INSERT INTO `sys_role_menu` VALUES (1, 9720); -INSERT INTO `sys_role_menu` VALUES (1, 9721); -INSERT INTO `sys_role_menu` VALUES (1, 9722); -INSERT INTO `sys_role_menu` VALUES (1, 9723); -INSERT INTO `sys_role_menu` VALUES (1, 9724); -INSERT INTO `sys_role_menu` VALUES (1, 9725); -INSERT INTO `sys_role_menu` VALUES (1, 9730); -INSERT INTO `sys_role_menu` VALUES (1, 9731); -INSERT INTO `sys_role_menu` VALUES (1, 9732); -INSERT INTO `sys_role_menu` VALUES (1, 9733); -INSERT INTO `sys_role_menu` VALUES (1, 9734); -INSERT INTO `sys_role_menu` VALUES (1, 9735); -INSERT INTO `sys_role_menu` VALUES (1, 9740); -INSERT INTO `sys_role_menu` VALUES (1, 9741); -INSERT INTO `sys_role_menu` VALUES (1, 9742); -INSERT INTO `sys_role_menu` VALUES (1, 9743); -INSERT INTO `sys_role_menu` VALUES (1, 9744); -INSERT INTO `sys_role_menu` VALUES (1, 9745); -INSERT INTO `sys_role_menu` VALUES (1, 9750); -INSERT INTO `sys_role_menu` VALUES (1, 9751); -INSERT INTO `sys_role_menu` VALUES (1, 9752); -INSERT INTO `sys_role_menu` VALUES (1, 9753); -INSERT INTO `sys_role_menu` VALUES (1, 9754); -INSERT INTO `sys_role_menu` VALUES (1, 9755); -INSERT INTO `sys_role_menu` VALUES (1, 9760); -INSERT INTO `sys_role_menu` VALUES (1, 9770); -INSERT INTO `sys_role_menu` VALUES (1, 9771); -INSERT INTO `sys_role_menu` VALUES (1, 9772); -INSERT INTO `sys_role_menu` VALUES (1, 9773); -INSERT INTO `sys_role_menu` VALUES (1, 9774); -INSERT INTO `sys_role_menu` VALUES (1, 9775); -INSERT INTO `sys_role_menu` VALUES (1, 9776); -INSERT INTO `sys_role_menu` VALUES (1, 9777); -INSERT INTO `sys_role_menu` VALUES (1, 9778); -INSERT INTO `sys_role_menu` VALUES (1, 9779); -INSERT INTO `sys_role_menu` VALUES (1, 9780); -INSERT INTO `sys_role_menu` VALUES (1, 9781); -INSERT INTO `sys_role_menu` VALUES (1, 9782); -INSERT INTO `sys_role_menu` VALUES (1, 9783); -INSERT INTO `sys_role_menu` VALUES (1, 9784); -INSERT INTO `sys_role_menu` VALUES (1, 9785); -INSERT INTO `sys_role_menu` VALUES (1, 9786); -INSERT INTO `sys_role_menu` VALUES (1, 9787); -INSERT INTO `sys_role_menu` VALUES (1, 9788); -INSERT INTO `sys_role_menu` VALUES (1, 9789); -INSERT INTO `sys_role_menu` VALUES (1, 9790); -INSERT INTO `sys_role_menu` VALUES (1, 9791); -INSERT INTO `sys_role_menu` VALUES (1, 9792); -INSERT INTO `sys_role_menu` VALUES (1, 9793); -INSERT INTO `sys_role_menu` VALUES (1, 9794); -INSERT INTO `sys_role_menu` VALUES (1, 9795); -INSERT INTO `sys_role_menu` VALUES (1, 9796); -INSERT INTO `sys_role_menu` VALUES (1, 9797); -INSERT INTO `sys_role_menu` VALUES (1, 9800); -INSERT INTO `sys_role_menu` VALUES (1, 9801); -INSERT INTO `sys_role_menu` VALUES (1, 9802); -INSERT INTO `sys_role_menu` VALUES (1, 9803); -INSERT INTO `sys_role_menu` VALUES (1, 9804); -INSERT INTO `sys_role_menu` VALUES (1, 9805); -INSERT INTO `sys_role_menu` VALUES (1, 9806); -INSERT INTO `sys_role_menu` VALUES (1, 9807); -INSERT INTO `sys_role_menu` VALUES (1, 9808); -INSERT INTO `sys_role_menu` VALUES (1, 9809); -INSERT INTO `sys_role_menu` VALUES (1, 9810); -INSERT INTO `sys_role_menu` VALUES (1, 9811); -INSERT INTO `sys_role_menu` VALUES (1, 9812); -INSERT INTO `sys_role_menu` VALUES (1, 9813); -INSERT INTO `sys_role_menu` VALUES (1, 9814); -INSERT INTO `sys_role_menu` VALUES (1, 9815); -INSERT INTO `sys_role_menu` VALUES (1, 9816); -INSERT INTO `sys_role_menu` VALUES (1, 9817); -INSERT INTO `sys_role_menu` VALUES (1, 9818); -INSERT INTO `sys_role_menu` VALUES (1, 9819); -INSERT INTO `sys_role_menu` VALUES (1, 9820); -INSERT INTO `sys_role_menu` VALUES (1, 9821); -INSERT INTO `sys_role_menu` VALUES (1, 9822); -INSERT INTO `sys_role_menu` VALUES (1, 9823); -INSERT INTO `sys_role_menu` VALUES (1, 9824); -INSERT INTO `sys_role_menu` VALUES (1, 9825); -INSERT INTO `sys_role_menu` VALUES (1, 9826); -INSERT INTO `sys_role_menu` VALUES (1, 9827); -INSERT INTO `sys_role_menu` VALUES (1, 9828); -INSERT INTO `sys_role_menu` VALUES (1, 9829); -INSERT INTO `sys_role_menu` VALUES (1, 9830); -INSERT INTO `sys_role_menu` VALUES (1, 9831); -INSERT INTO `sys_role_menu` VALUES (1, 9832); -INSERT INTO `sys_role_menu` VALUES (1, 9833); -INSERT INTO `sys_role_menu` VALUES (1, 9834); -INSERT INTO `sys_role_menu` VALUES (1, 9835); - -INSERT INTO `sys_dict` VALUES (129, 'source_type', '文件来源', 'admin', ' ', '2023-10-27 10:29:48', NULL, NULL, '1', '0', 1); -INSERT INTO `sys_dict` VALUES (130, 'slice_status', '切片状态', 'admin', ' ', '2023-10-27 10:29:48', NULL, NULL, '1', '0', 1); -INSERT INTO `sys_dict` VALUES (131, 'summary_status', '总结状态', 'admin', ' ', '2023-10-27 10:29:48', NULL, NULL, '1', '0', 1); -INSERT INTO `sys_dict` VALUES (132, 'llm_use_status', '调用状态', 'admin', ' ', '2023-10-27 10:29:48', NULL, NULL, '1', '0', 1); -INSERT INTO `sys_dict` VALUES (133, 'embed_store_type', '向量库类型', 'admin', ' ', '2023-10-27 10:29:48', NULL, NULL, '1', '0', 1); - -INSERT INTO `sys_dict_item` VALUES (195, 129, '1', '上传', 'source_type', '上传', 1, 'admin', ' ', '2023-10-27 10:30:47', NULL, NULL, '0', 1); -INSERT INTO `sys_dict_item` VALUES (196, 129, '2', '录入', 'source_type', '录入', 2, 'admin', ' ', '2023-10-27 10:30:47', NULL, NULL, '0', 1); -INSERT INTO `sys_dict_item` VALUES (197, 129, '3', 'Q&A', 'source_type', 'Q&A', 3, 'admin', ' ', '2023-10-27 10:30:47', NULL, NULL, '0', 1); -INSERT INTO `sys_dict_item` VALUES (198, 129, '4', '网页', 'source_type', 'URL', 4, 'admin', ' ', '2023-10-27 10:30:47', NULL, NULL, '0', 1); -INSERT INTO `sys_dict_item` VALUES (199, 130, '0', '未切片', 'slice_status', '未切片', 3, 'admin', ' ', '2023-10-27 10:30:47', NULL, NULL, '0', 1); -INSERT INTO `sys_dict_item` VALUES (200, 130, '1', '已切片', 'slice_status', '已切片', 3, 'admin', ' ', '2023-10-27 10:30:47', NULL, NULL, '0', 1); -INSERT INTO `sys_dict_item` VALUES (201, 130, '2', '切片中', 'slice_status', '切片中', 3, 'admin', ' ', '2023-10-27 10:30:47', NULL, NULL, '0', 1); -INSERT INTO `sys_dict_item` VALUES (202, 130, '9', '失败', 'slice_status', '失败', 3, 'admin', ' ', '2023-10-27 10:30:47', NULL, NULL, '0', 1); -INSERT INTO `sys_dict_item` VALUES (203, 131, '0', '未总结', 'summary_status', '未总结', 3, 'admin', ' ', '2023-10-27 10:30:47', NULL, NULL, '0', 1); -INSERT INTO `sys_dict_item` VALUES (204, 131, '1', '已总结', 'summary_status', '已总结', 3, 'admin', ' ', '2023-10-27 10:30:47', NULL, NULL, '0', 1); -INSERT INTO `sys_dict_item` VALUES (205, 131, '9', '失败', 'summary_status', '失败', 3, 'admin', ' ', '2023-10-27 10:30:47', NULL, NULL, '0', 1); -INSERT INTO `sys_dict_item` VALUES (206, 132, '0', '未调用', 'llm_use_status', '未调用', 3, 'admin', ' ', '2023-10-27 10:30:47', NULL, NULL, '0', 1); -INSERT INTO `sys_dict_item` VALUES (207, 132, '1', '已调用', 'llm_use_status', '已调用', 3, 'admin', ' ', '2023-10-27 10:30:47', NULL, NULL, '0', 1); -INSERT INTO `sys_dict_item` VALUES (208, 132, '2', '触发敏感词', 'llm_use_status', '触发敏感词', 3, 'admin', ' ', '2023-10-27 10:30:47', NULL, NULL, '0', 1); -INSERT INTO `sys_dict_item` VALUES (209, 132, '9', '失败', 'llm_use_status', '失败', 3, 'admin', ' ', '2023-10-27 10:30:47', NULL, NULL, '0', 1); -INSERT INTO `sys_dict_item` VALUES (210, 133, 'qdrant', 'qdrant', 'embed_store_type', 'qdrant', 1, 'admin', ' ', '2023-10-27 10:30:47', NULL, NULL, '0', 1); -INSERT INTO `sys_dict_item` VALUES (211, 133, 'chroma', 'chroma', 'embed_store_type', 'chroma', 2, 'admin', ' ', '2023-10-27 10:30:47', NULL, NULL, '0', 1); -INSERT INTO `sys_dict_item` VALUES (212, 133, 'milvus', 'milvus', 'embed_store_type', 'milvus', 3, 'admin', ' ', '2023-10-27 10:30:47', NULL, NULL, '0', 1); -INSERT INTO `sys_dict_item` VALUES (213, 133, 'neo4j', 'neo4j', 'embed_store_type', 'neo4j', 3, 'admin', ' ', '2023-10-27 10:30:47', NULL, NULL, '0', 1); -INSERT INTO `sys_dict_item` VALUES (214, 133, 'pgvector', 'pgvector', 'embed_store_type', 'pgvector', 3, 'admin', ' ', '2023-10-27 10:30:47', NULL, NULL, '0', 1); -INSERT INTO `sys_dict_item` VALUES (215, 130, '3', 'AI解析中', 'slice_status', '解析中', 3, 'admin', ' ', '2023-10-27 10:30:47', NULL, NULL, '0', 1); - --- ---------------------------- --- Table structure for ai_model --- ---------------------------- -DROP TABLE IF EXISTS `ai_model`; -CREATE TABLE `ai_model` ( - `id` bigint NOT NULL COMMENT '主键ID', - `model_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '类型: CHAT、Embedding、Image', - `model_name` varchar(100) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '模型名称', - `provider` varchar(100) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '供应商', - `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '别名', - `response_limit` int DEFAULT NULL COMMENT '响应长度', - `temperature` double DEFAULT NULL COMMENT '温度', - `top_p` double DEFAULT NULL, - `api_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, - `base_url` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, - `secret_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, - `endpoint` varchar(100) COLLATE utf8mb4_bin DEFAULT NULL, - `default_model` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '默认模型', - `azure_deployment_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'azure模型参数', - `gemini_project` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'gemini模型参数', - `gemini_location` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'gemini模型参数', - `image_size` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '图片大小', - `image_quality` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '图片质量', - `image_style` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '图片风格', - `dimensions` int DEFAULT NULL COMMENT '向量维数', - `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '删除标记', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_time` datetime DEFAULT NULL COMMENT '修改时间', - `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '创建人', - `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '修改人', - `ext_data` longtext COLLATE utf8mb4_bin COMMENT '扩展字段', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='模型配置表'; - - -DROP TABLE IF EXISTS `ai_bill`; -CREATE TABLE `ai_bill` ( - `id` bigint NOT NULL COMMENT '主键ID', - `user_id` bigint DEFAULT NULL COMMENT '用户ID', - `message_key` bigint DEFAULT NULL COMMENT 'message key', - `prompt_tokens` bigint DEFAULT NULL COMMENT '提示令牌数量', - `completion_tokens` bigint DEFAULT NULL COMMENT '补全令牌数量', - `model` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '模型名称', - `reqid` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '请求ID', - `ip` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'IP地址', - `note` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '备注', - `token_id` bigint DEFAULT NULL COMMENT '令牌ID', - `tokens` bigint DEFAULT NULL COMMENT '令牌数量', - `token_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '令牌类型 0 系统 1 用户', - `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '删除标记', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_time` datetime DEFAULT NULL COMMENT '修改时间', - `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '创建人', - `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '修改人', - PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='账单'; - --- ---------------------------- --- Table structure for ai_chat_record --- ---------------------------- -DROP TABLE IF EXISTS `ai_chat_record`; -CREATE TABLE `ai_chat_record` ( - `record_id` bigint NOT NULL COMMENT '主键', - `username` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户标识', - `model_name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '模型名称', - `question_text` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '问题', - `answer_text` text COLLATE utf8mb4_general_ci COMMENT '答案', - `dataset_id` bigint DEFAULT NULL COMMENT '所属知识库', - `document_ids` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '关联文档IDs', - `suitability` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '匹配度', - `ip` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '客户端IP', - `user_agent` text COLLATE utf8mb4_general_ci COMMENT '浏览器标识', - `conversation_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '会话ID', - `websearch_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '网络搜索', - `standard_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '标注', - `qdrant_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '向量ID', - `inner_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '内部调用', - `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '删除标记', - `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人', - `update_by` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '修改人', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_time` datetime DEFAULT NULL COMMENT '修改时间', - `llm_flag` char(1) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '大模型交互结果', - `ext_details` text COLLATE utf8mb4_general_ci COMMENT '详细信息', - PRIMARY KEY (`record_id`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='聊天记录'; - --- ---------------------------- --- Table structure for ai_dataset --- ---------------------------- -DROP TABLE IF EXISTS `ai_dataset`; -CREATE TABLE `ai_dataset` ( - `id` bigint NOT NULL COMMENT '主键', - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '名称', - `avatar_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '头像', - `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '描述', - `collection_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '集合名称', - `store_id` bigint DEFAULT NULL COMMENT '存储ID', - `units` bigint DEFAULT NULL COMMENT '知识数量', - `file_size` bigint DEFAULT NULL COMMENT '大小', - `multi_round` int DEFAULT NULL COMMENT '多轮会话', - `top_k` int DEFAULT NULL COMMENT '匹配条数', - `score` int DEFAULT NULL COMMENT '匹配率', - `sort_order` int DEFAULT NULL COMMENT '排序值', - `fragment_size` int DEFAULT NULL COMMENT '切片数量', - `empty_llm_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '空查询', - `empty_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '未匹配提示', - `sensitive_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '敏感词汇', - `sensitive_msg` text COLLATE utf8mb4_bin COMMENT '敏感词命中消息', - `welcome_msg` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '欢迎语', - `public_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '是否对外', - `public_password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '访问密码', - `embedding_model` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '嵌入模型', - `summary_model` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '摘要模型', - `reranker_model` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '排序模型', - `pre_summary` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '预总结', - `pre_compress` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '预压缩', - `ai_ocr_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '是否使用AI OCR', - `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '删除标记', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_time` datetime DEFAULT NULL COMMENT '修改时间', - `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '创建人', - `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '修改人', - `footer` text COLLATE utf8mb4_bin COMMENT '底部信息', - `standard_flag` char(1) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '标记数据', - PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='知识库'; - -DROP TABLE IF EXISTS `ai_embed_store`; -CREATE TABLE `ai_embed_store` ( - `store_id` bigint NOT NULL COMMENT '主键', - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '名称', - `store_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '类型', - `uri` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '链接端点', - `host` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'Host', - `port` int DEFAULT NULL COMMENT '端口', - `use_tls` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '是否使用安全模式', - `api_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '密钥', - `ext_data` longtext COLLATE utf8mb4_general_ci COMMENT '扩展参数', - `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '删除标记', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_time` datetime DEFAULT NULL COMMENT '更新时间', - `create_by` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人', - `update_by` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '更新人', - PRIMARY KEY (`store_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='向量库配置'; --- ---------------------------- --- Table structure for ai_document --- ---------------------------- -DROP TABLE IF EXISTS `ai_document`; -CREATE TABLE `ai_document` ( - `id` bigint NOT NULL COMMENT '主键', - `dataset_id` bigint DEFAULT NULL COMMENT '知识库ID', - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '名称', - `file_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '文件类型', - `file_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '文件链接', - `file_hash` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'MD5hash', - `source_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '文件来源', - `slice_count` bigint DEFAULT NULL COMMENT '切片数量', - `hit_count` bigint DEFAULT NULL COMMENT '命中次数', - `file_size` bigint DEFAULT NULL COMMENT '文件大小', - `file_status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '状态', - `slice_status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '状态', - `graph_status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '图状态', - `slice_fail_reason` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '总结摘要失败原因', - `summary` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '总结摘要', - `summary_fail_reason` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '总结摘要失败原因', - `summary_status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '总结状态', - `document_config` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '文档配置元信息', - `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '删除标记', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_time` datetime DEFAULT NULL COMMENT '修改时间', - `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '创建人', - `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '修改人', - PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='知识文档'; - --- ---------------------------- --- Table structure for ai_prompt --- ---------------------------- -DROP TABLE IF EXISTS `ai_prompt`; -CREATE TABLE `ai_prompt` ( - `id` bigint NOT NULL COMMENT '主键ID', - `act` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '标题', - `prompt` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '提示词', - `prompt_sort` bigint DEFAULT NULL COMMENT '列表排序', - `prompt_status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '状态', - `user_id` bigint DEFAULT NULL COMMENT '所属人', - `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '删除标记', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_time` datetime DEFAULT NULL COMMENT '修改时间', - `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '创建人', - `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '修改人', - PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='提示词'; - --- ---------------------------- --- Table structure for ai_slice --- ---------------------------- -DROP TABLE IF EXISTS `ai_slice`; -CREATE TABLE `ai_slice` ( - `id` bigint NOT NULL COMMENT '主键', - `document_id` bigint DEFAULT NULL COMMENT '文档ID', - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '名称', - `units` bigint DEFAULT NULL COMMENT '知识数量', - `file_size` bigint DEFAULT NULL COMMENT '大小', - `hit_count` bigint DEFAULT NULL COMMENT '命中次数', - `char_count` bigint DEFAULT NULL COMMENT '字符数量', - `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '内容', - `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '删除标记', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_time` datetime DEFAULT NULL COMMENT '修改时间', - `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '创建人', - `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '修改人', - `slice_status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '训练状态', - `qdrant_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '向量ID', - PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='知识切片'; - -DROP TABLE IF EXISTS `ai_ocr_conf`; -CREATE TABLE `ai_ocr_conf` ( - `id` bigint NOT NULL COMMENT '主键', - `ocr_title` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '标题', - `ocr_prompt` longtext COLLATE utf8mb4_general_ci COMMENT '描述提示词', - `image_resource` longtext COLLATE utf8mb4_general_ci COMMENT '资源base64', - `ocr_marked` longtext COLLATE utf8mb4_general_ci COMMENT '标注结果', - `create_time` datetime DEFAULT NULL, - `update_time` datetime DEFAULT NULL, - `create_by` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL, - `update_by` datetime DEFAULT NULL, - `del_flag` char(1) COLLATE utf8mb4_general_ci DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='AI OCR'; - -DROP TABLE IF EXISTS `ai_flow`; -CREATE TABLE `ai_flow` ( - `id` bigint NOT NULL COMMENT '流程主键', - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '流程名称', - `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '流程描述', - `type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '流程类型', - `dsl` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '流程设计DSL', - `icon` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '流程图标', - `api_enabled` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '是否启用api', - `enabled` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '其否启用', - `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人', - `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '修改人', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_time` datetime DEFAULT NULL COMMENT '修改时间', - `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '1' COMMENT '状态', - `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '是否已删除', - `result` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '最终结果', - PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='大模型流程表'; - --- ---------------------------- --- Table structure for ai_flow_log --- ---------------------------- -DROP TABLE IF EXISTS `ai_flow_log`; -CREATE TABLE `ai_flow_log` ( - `id` bigint NOT NULL COMMENT '流程日志主键', - `flow_id` bigint NOT NULL COMMENT '流程主键', - `type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '流程类型', - `input_params` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '输入参数', - `output_params` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '输出参数', - `result` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '最终结果', - `executed` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '执行状态', - `error` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '错误信息', - `run_time` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '运行时间', - `api_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'api key', - `total_tokens` bigint DEFAULT NULL COMMENT 'api tokens', - `create_user` bigint DEFAULT NULL COMMENT '创建人', - `create_dept` bigint DEFAULT NULL COMMENT '创建部门', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_user` bigint DEFAULT NULL COMMENT '修改人', - `update_time` datetime DEFAULT NULL COMMENT '修改时间', - `status` int DEFAULT '1' COMMENT '状态', - `is_deleted` int DEFAULT '0' COMMENT '是否已删除', - PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='大模型流程日志表'; - - -DROP TABLE IF EXISTS `ai_data`; -CREATE TABLE `ai_data` ( - `data_id` bigint NOT NULL COMMENT '主键ID', - `dataset_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '数据集名称', - `description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '数据集描述', - `dataset_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '数据集类型 (1-明细表, 2-多指标周期表, 3-键值对表, 4-其他)', - `ds_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '关联数据源名称', - `table_name` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '关联数据表', - `learning_status` char(1) COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '学习状态(0-未学习, 1-已学习)', - `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '创建人', - `create_time` datetime COMMENT '创建时间', - `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '更新人', - `update_time` datetime DEFAULT NULL COMMENT '更新时间', - `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记 (0-正常, 1-删除)', - PRIMARY KEY (`data_id`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='AI 数据集管理表'; - --- ---------------------------- --- Table structure for ai_data_field --- ---------------------------- -DROP TABLE IF EXISTS `ai_data_field`; -CREATE TABLE `ai_data_field` ( - `field_id` bigint NOT NULL COMMENT '主键ID', - `table_id` bigint NOT NULL COMMENT '关联数据表', - `field_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字段名称', - `field_comment` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '字段备注', - `virtual_comment` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '虚拟注释', - `field_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字段类型', - `db_type` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '数据库类型', - `ds_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '关联数据源名称', - `modify_status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '修正状态 ', - `modify_time` datetime DEFAULT NULL COMMENT '修正时间', - `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '创建人', - `create_time` datetime COMMENT '创建时间', - `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '更新人', - `update_time` datetime DEFAULT NULL COMMENT '更新时间', - `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记 (0-正常, 1-删除)', - PRIMARY KEY (`field_id`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='AI 字段管理表'; - --- ---------------------------- --- Table structure for ai_data_tablec --- ---------------------------- -DROP TABLE IF EXISTS `ai_data_table`; -CREATE TABLE `ai_data_table` ( - `table_id` bigint NOT NULL COMMENT '主键ID', - `ds_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '关联数据源名称', - `ds_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '关联数据源类型', - `table_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '表名称', - `table_comment` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '物理表注释', - `virtual_comment` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '虚拟表注释', - `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '创建人', - `create_time` datetime COMMENT '创建时间', - `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '更新人', - `update_time` datetime DEFAULT NULL COMMENT '更新时间', - `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记 (0-正常, 1-删除)', - PRIMARY KEY (`table_id`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='AI 数据表管理表'; - --- ---------------------------- --- Table structure for ai_mcp_config --- ---------------------------- -DROP TABLE IF EXISTS `ai_mcp_config`; -CREATE TABLE `ai_mcp_config` ( - `mcp_id` bigint NOT NULL COMMENT '主键ID', - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '服务器名称', - `description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '描述', - `mcp_type` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '类型 (SSE: Server-Sent Events, STDIO: Standard Input/Output)', - `command` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '命令', - `sse_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT 'SSE URL', - `parameters` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '参数', - `environment_variables` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '环境变量', - `mcp_enabled` char(1) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '1' COMMENT '是否启用(1:启用,0:禁用)', - `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '创建人', - `create_time` datetime COMMENT '创建时间', - `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '更新人', - `update_time` datetime DEFAULT NULL COMMENT '更新时间', - `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记', - PRIMARY KEY (`mcp_id`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='MCP配置表'; - -DROP TABLE IF EXISTS `ai_poster`; -CREATE TABLE `ai_poster` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', - `template_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '模板名称', - `template_code` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '模板代码', - `template_css` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '模板CSS', - `template_style` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '模板风格', - `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '更新人', - `update_time` datetime DEFAULT NULL COMMENT '更新时间', - `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='AI海报模板表'; - --- ---------------------------- --- Records of ai_poster --- ---------------------------- -BEGIN; -INSERT INTO `ai_poster` (`id`, `template_name`, `template_code`, `template_css`, `template_style`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`) VALUES (1, '红色党政风', '
\n
\n
二〇二五年七月一日
\n

新时代为民服务

\n

践行初心使命 提升服务效能

\n
\n
\n 全心全意为人民服务是我们一切工作的根本宗旨,要始终把人民放在心中最高位置。\n
\n
\n
\n 01\n 深化简政放权,推进\"最多跑一次\"改革\n
\n
\n 02\n 完善基层服务体系,打通服务群众\"最后一公里\"\n
\n
\n 03\n 强化数字赋能,建设智慧服务平台\n
\n
\n 04\n 健全监督机制,确保权力在阳光下运行\n
\n
\n
\n \"QR\n
扫码进入便民服务直通车
\n
\n
\n 重要通知: 本年度将全面推进服务型建设,欢迎广大群众监督并提出宝贵意见建议,共同推动服务工作提质增效。\n
\n
', '', '采用党政风格设计,体现庄重典雅与为民服务的特质。使用浅红色背景,配以党政标准色调如正红、米白和浅灰。排版应规整大气,使用传统中文排版元素,与普通政务风格相比更具文化底蕴。字体选择宋体或仿宋等衬线字体,字重适中确保正式感。装饰元素应体现传统文化特色,使用五角星、红色圆形徽章等元素。内容区块采用对称布局,参考党政刊物和红色宣传品的版式设计。整体设计应呈现出庄重、温暖且富有文化底蕴的特质,平衡权威性与亲和力,体现\"以人民为中心\"的服务理念。', NULL, NULL, NULL, NULL, '0'); -INSERT INTO `ai_poster` (`id`, `template_name`, `template_code`, `template_css`, `template_style`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`) VALUES (2, '淡雅政务风', '
\n
\n
2025年5月15日
\n

政务服务优化

\n

推动便民利企服务高质量发展

\n
\n
\n 坚持以人民为中心的发展思想,持续深化\"放管服\"改革,打造高效、透明、便民的政务服务体系。\n
\n
\n
\n 一\n 推进\"一网通办\",实现政务服务事项全程网上办理\n
\n
\n 二\n 优化审批流程,压缩办理时限,提升服务效率\n
\n
\n 三\n 加强政务公开,保障群众知情权、参与权、监督权\n
\n
\n 四\n 完善投诉反馈机制,及时解决群众反映的问题\n
\n
\n
\n \"QR\n
扫描二维码,进入政务服务网上大厅
\n
\n
\n 政务公告: 本年度将继续推进政务服务标准化规范化便利化建设,欢迎广大市民群众监督并提出宝贵意见。\n
\n
', '', '采用政务风格设计,体现政府文件的权威性与亲民服务的平衡。使用浅灰背景,配以政务标准色调如深蓝、浅灰和米白。排版应规整有序,使用大量留白保持清晰可读性,但与公文不同,应加入适度亲和元素。字体选择标准无衬线字体如微软雅黑或思源黑体,字重适中确保易读性。装饰元素应精简但体现正式感,可使用传统政务元素如徽章、双分隔线和编号圆点。内容区块采用清晰分隔,参考政府公报和政务公开栏目的版式设计。整体设计应呈现出庄重、清晰且亲民的政务特质,平衡权威性与服务性,参考国务院公报和省级政府门户网站的视觉规范。', NULL, NULL, NULL, NULL, '0'); -INSERT INTO `ai_poster` (`id`, `template_name`, `template_code`, `template_css`, `template_style`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`) VALUES (3, '新表现主义风格', '
\n
\n
2025年03月28日
\n

黑胶复兴

\n

模拟声音的回归,旧时代技术在数字世界中的意外胜利

\n \n
\n
\n 在完美无瑕的数字音频中,我们失去了音乐的灵魂;而在黑胶唱片的噼啪声中,我们重新找到了它。\n
\n
\n \n
\n
\n 1\n
触觉体验:黑胶唱片提供了一种物理仪式感,从挑选唱片到放上唱盘的每一步都是体验的一部分
\n
\n
\n 2\n
温暖声学:模拟录制的非线性特性创造出数字完美主义无法复制的声音质感
\n
\n
\n 3\n
艺术载体:12英寸唱片封面成为视觉艺术的重要媒介,许多经典专辑因其封面设计而被铭记
\n
\n
\n 4\n
慢听革命:黑胶体验鼓励人们完整聆听一张专辑,抵抗流媒体时代的碎片化消费
\n
\n
\n \n
\n \"QR\n
扫码探索珍稀黑胶唱片收藏
\n
\n \n
\n 编辑笔记:黑胶唱片的复兴超越了单纯的怀旧,它代表了人们对实体音乐体验的渴望与反抗。在数字极简主义主导的今天,这种\"不完美\"的媒介正在成为艺术真实性的象征。\n
\n
\n
', '', '采用新表现主义风格设计,体现80年代艺术运动的原始能量和情感表达。色彩应强烈且不协调,使用原始、未经调和的色彩组合,可包含泼溅和涂抹效果。排版应富有表现力且不规则,使用手写或笔刷字体,文字可被部分遮挡或融入背景。线条必须粗犷且富有动感,展现明显的笔触和手工感。图像应被重新诠释,可添加涂鸦、划痕或重绘效果。装饰元素应看似随意但富有象征性,如原始符号、面具图案或抽象人物。整体设计应呈现出强烈的情感张力和原始能量,仿佛一幅由情感驱动的表现主义画作,参考Jean-Michel Basquiat和Georg Baselitz的作品风格。', NULL, NULL, NULL, NULL, '0'); -INSERT INTO `ai_poster` (`id`, `template_name`, `template_code`, `template_css`, `template_style`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`) VALUES (4, '波普艺术风格', '
\n
\n
\n
\n
\n
2025年6月15日
\n
\n
VIRAL!
\n

网红经济

\n
网红经济
\n
\n

社交媒体如何彻底改变了我们的消费方式、审美标准与名人文化

\n
\n

\"在这个时代,每个人都有15分钟的成名机会,但网红们用算法延长了这个时间到无限!\"

\n
\n
\n
\n
1
\n
信任营销:相比传统广告,76%的消费者更相信真实人物的产品推荐
\n
\n
\n
2
\n
微网红崛起:专注小众领域的内容创作者正获得比大网红更高的互动率
\n
\n
\n
3
\n
真实性危机:完美人设背后,创作者身份与现实生活的严重割裂导致心理健康问题
\n
\n
\n
4
\n
算法控制:平台推荐机制决定了谁能出名,创作者如何迎合算法成为成功关键
\n
\n
\n
\n
\n \"QR\n
\n
扫码关注我们的爆款网红推荐
\n
\n
\n 网红经济不仅创造了全新的职业,更重塑了整个市场营销生态。当每个人都能成为媒体时,影响力成为新的货币,而真实性则成为最稀缺的资源。\n
\n
\n
', '', '采用波普艺术风格设计,重现60年代艺术运动的大胆美学。必须使用亮丽原色(红、黄、蓝)和黑色轮廓线,色彩应平面且不含渐变。排版应大胆且戏剧化,使用漫画风格字体和夸张的感叹词,文字可放置在对话气泡中。图像处理是关键,应使用半调网点(Halftone)效果模拟印刷,将图像简化为点阵和色块。装饰元素应包含漫画风格的线条、爆炸形状和拟声词。可使用重复图案和网格排列增强视觉冲击。整体设计应呈现出鲜明、直接且充满流行文化引用的视觉效果,仿佛一页来自60年代漫画或安迪·沃霍尔的艺术作品,参考Roy Lichtenstein的绘画和经典漫画书的视觉语言。', NULL, NULL, NULL, NULL, '0'); -INSERT INTO `ai_poster` (`id`, `template_name`, `template_code`, `template_css`, `template_style`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`) VALUES (5, '极简主义风格', '
\n
2025.05.18
\n

摄影的艺术

\n

光影与构图的永恒魅力

\n
\n
\n \"摄影不仅是捕捉瞬间,而是创造永恒。\"\n
\n
\n
\n 01\n 摄影是光影的艺术,掌握光线是创作好照片的关键\n
\n
\n 02\n 构图是视觉语言,通过空间关系传达情感与故事\n
\n
\n 03\n 数码技术改变了摄影工具,但不改变摄影的本质\n
\n
\n 04\n 真正的摄影眼光将在视觉饱和的时代成为宝贵能力\n
\n
\n
\n \"QR\n
扫描二维码,获取更多摄影技巧
\n
\n
\n 编辑笔记: 在图像泛滥的数字时代,摄影的形式在变,但作为记录与表达的方式,其艺术本质不变。\n
\n
', '', '采用极简主义风格设计,遵循\"少即是多\"的理念。使用大量留白创造呼吸空间,仅保留最必要的元素。配色方案限制在2-3种中性色,主要为白色背景配以黑色或深灰色文字。排版应精确到像素级别,使用精心设计的网格系统和黄金比例。字体选择无衬线字体如Helvetica或Noto Sans,字重变化作为主要层次手段。装饰元素几乎为零,仅使用极细的分隔线和微妙的阴影。整体设计应呈现出克制、优雅且永恒的美学,让内容本身成为焦点。参考Dieter Rams的设计原则和日本无印良品(MUJI)的产品美学。', NULL, NULL, NULL, NULL, '0'); -INSERT INTO `ai_poster` (`id`, `template_name`, `template_code`, `template_css`, `template_style`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`) VALUES (6, '优雅复古\n', '
\n
\n
\n
\n
\n
\n
Le 15 Avril, 2025
\n

古典音乐的复兴

\n

在数字时代,巴赫、莫扎特与贝多芬的永恒旋律重获新生

\n
\n
\n 古典音乐不是过去的遗物,而是人类灵魂深处永恒的共鸣,跨越时空与文化的界限。\n
\n
\n
\n ※\n 古典音乐与现代聆听:流媒体平台革命性地改变了年轻一代接触古典音乐的方式\n
\n
\n ※\n 数字化保存:高保真技术让历史录音重获新生,填补音乐史的空白\n
\n
\n ※\n 跨界融合:古典元素在电影、游戏与流行音乐中的创新应用\n
\n
\n ※\n 音乐教育的变革:虚拟现实和交互式应用为古典音乐普及带来新机遇\n
\n
\n
\n \"QR\n
扫描二维码,聆听精选古典音乐集
\n
\n
\n 编辑笔记: 在这个快节奏的数字时代,古典音乐以其深度与复杂性,为我们提供了一种珍贵的沉浸式体验,让我们能够暂时脱离浮躁,回归内心的宁静。\n
\n
', '', '采用优雅复古风格设计,重现20世纪初期印刷品的精致美学。使用米色或淡黄色纸张质感背景,配以深棕、暗红等老式印刷色。字体必须使用衬线字体如Baskerville或Noto Serif,标题可使用装饰性字体。排版应对称且庄重,遵循传统书籍设计原则。装饰元素包括精致的花纹边框、古典分隔线和角落装饰,可添加轻微做旧效果如纸张纹理和微妙污点。图像应用复古滤镜处理,呈现褪色照片效果。整体设计应散发出典雅、成熟且历经时间考验的气质,参考The New Yorker和老式法国时尚杂志的设计语言。', NULL, NULL, NULL, NULL, '0'); -INSERT INTO `ai_poster` (`id`, `template_name`, `template_code`, `template_css`, `template_style`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`) VALUES (7, '大胆现代', '
\n
15 JULY 2025
\n

城市重构

\n

新型建筑正在重塑城市景观,打造更具可持续性与人文关怀的未来生活空间

\n
\n
\n \"未来的城市不仅是由玻璃、钢铁和混凝土构成的,更应该是由社区、生态和创新精神塑造的有机体。\"\n
\n
\n
\n 01\n 垂直森林:建筑外立面融合大量植被,每栋建筑成为碳吸收器和生物多样性中心\n
\n
\n 02\n 模块化设计:可重配置的建筑系统使空间根据需求灵活变化,减少资源浪费\n
\n
\n 03\n 智能材料:自修复混凝土和光伏玻璃等材料革命性地改变建筑能耗与寿命\n
\n
\n 04\n 社区导向:建筑设计重新聚焦于创造有意义的公共空间,促进人际互动\n
\n
\n
\n \"QR\n
扫描二维码,探索全球创新建筑案例
\n
\n
\n EDITOR\'S NOTE: 现代建筑正走向一个关键转折点,从单纯追求形式美学转向整合生态系统、人文关怀与技术创新的综合解决方案。\n
\n
', '', '采用大胆现代风格设计,打破传统排版规则,创造强烈视觉冲击。使用鲜艳对比色如荧光粉、电子蓝、亮黄等,背景可使用深色或鲜艳色块。排版应不对称且动态,标题文字极大(至少60px),可使用极粗字重或压缩字体,甚至允许文字重叠和溢出。图形元素应用几何形状,边缘锐利,可添加不规则裁切效果。层次感通过大小、颜色和位置的极端对比创造。整体设计应充满张力和活力,像一张视觉宣言,参考Wired杂志和Pentagram设计工作室的作品。添加微妙动效如悬停放大或颜色变换,增强现代感。', NULL, NULL, NULL, NULL, '0'); -INSERT INTO `ai_poster` (`id`, `template_name`, `template_code`, `template_css`, `template_style`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`) VALUES (8, '日式极简\n', '
\n
\n
2025年5月17日
\n
\n
\n

茶道之美

\n
\n

一碗茶,一方宇宙,茶道中蕴含的东方生活美学与哲思

\n
\n 茶道不只是饮茶仪式,更是对和、敬、清、寂四大原则的生活实践。\n
\n
\n
\n 待客之心:茶室中每一个动作,每一处设计都体现对客人的至高敬意\n
\n
\n 四季感知:茶道仪式随季节变化而调整,体现与自然和谐共处的理念\n
\n
\n 珍视瞬间:茶道秉持\"一期一会\"精神,视每次相聚为人生独特相遇\n
\n
\n 留白之美:茶室布置的极简与留白,是对内心平静的物理表达\n
\n
\n
\n \"QR\n
扫描二维码,探索更多日本传统美学
\n
\n
\n 編集者注: 在这个快节奏的现代社会,茶道所蕴含的慢生活哲学,为我们提供了一种回归本真、寻找内心平静的方式。\n
\n
\n
', '', '采用日式极简风格设计,体现\"侘寂\"(Wabi-Sabi)美学——接受不完美、无常与不完整的哲学。使用极度克制的色彩,主要为白、灰、黑和淡墨色。留白(Ma)是核心元素,至少70%的设计应为空白,创造宁静感。排版应非对称且垂直,可使用垂直书写模式,体现日本传统排版。字体应极度简约,笔画轻盈。装饰元素几乎为零,但可添加一处墨迹、简单印章或单一线条作为点睛之笔。整体设计应呈现出深度宁静、精致且富有禅意的视觉体验,仿佛一页来自京都寺院的书页,参考原研哉的MUJI设计理念和日本传统水墨画的留白美学', NULL, NULL, NULL, NULL, '0'); -INSERT INTO `ai_poster` (`id`, `template_name`, `template_code`, `template_css`, `template_style`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`) VALUES (9, '赛博朋克风格', '
\n
\n
03.09.2025 :: RENDER_LOG
\n

\n
\n
沉浸式艺术
\n
\n

\n

数字技术正在重塑艺术创作与体验的边界,建立物理与虚拟世界之间的无缝连接

\n
\n
\n \"当代艺术已不再局限于观看,而是成为一种全身心参与的多感官体验;技术不只是工具,更是创作的共同体。\"\n
\n
\n
\n 01\n 生成式艺术:AI算法已从辅助工具发展为独立创作者,挑战我们对原创性与创造力的理解\n
\n
\n 02\n 物理-数字混合:增强现实技术使艺术装置可以同时存在于物理空间和数字领域,创造多层次叙事\n
\n
\n 03\n 神经反馈:新一代沉浸式作品可读取观众脑电波,实时调整内容以优化情感体验\n
\n
\n 04\n 非永久性艺术:数字作品的短暂性和动态性正挑战艺术保存的传统理念,强调体验而非收藏\n
\n
\n
\n \"QR\n
扫码进入虚拟展览,体验最前沿沉浸式艺术作品
\n
\n
\n 数字艺术生态正在迅速演变,技术与创意的融合不仅创造了前所未有的表达形式,也重新定义了艺术与观众、艺术与社会的关系。在这个新兴领域,体验已成为作品的核心。\n
\n
', '', '采用赛博朋克风格设计,体现\"高科技,低生活\"的反乌托邦美学。背景必须为深色(黑色或深蓝),配以霓虹色彩如荧光粉、电子蓝和酸性绿,创造夜间都市氛围。排版应模拟故障效果,使用像素化字体或未来感等宽字体,添加字符错位、扫描线和数字噪点。装饰元素必须包含科技界面、数据流、电路板图案和全息投影效果。必须添加故障艺术(Glitch Art)效果如RGB分离、数据损坏和画面撕裂。图像应高对比且添加霓虹光效,模拟雨夜霓虹灯反射。整体设计应呈现出未来主义与复古科技的混搭,营造一种数字化衰败的氛围,参考《银翼杀手》、《神经漫游者》和《赛博朋克2077》的视觉语言。', NULL, NULL, NULL, NULL, '0'); -INSERT INTO `ai_poster` (`id`, `template_name`, `template_code`, `template_css`, `template_style`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`) VALUES (10, '瑞士国际主义风格的解构版', '
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
17.08.2025
\n
\n

字体革命

\n
字体革命
\n
\n

在数字时代,字体设计如何突破传统边界,重新定义可读性与表现力的平衡

\n
\n
\n
\n
\n \"字体不仅是内容的载体,更是信息本身的一部分;它以无声的方式塑造我们的阅读体验与情感反应。\"\n
\n
\n
\n
\n
01
\n
可变字体技术:单一字体文件可实现无限权重变化,为设计师提供前所未有的精细控制
\n
\n
\n
02
\n
屏幕优化:新一代数字字体通过亚像素渲染技术,解决了高分辨率显示器上的清晰度挑战
\n
\n
\n
03
\n
多语言兼容:字体设计正在拥抱全球化,单一字体系统可支持多达十几种文字系统
\n
\n
\n
04
\n
表情符号演变:从简单图标到复杂表情系统,它们已成为现代字体设计中不可或缺的部分
\n
\n
\n
\n \"QR\n
扫描探索当代最具创新性的字体设计
\n
\n
\n 编辑笔记: 字体设计正处于历史性转折点,数字工具与多屏阅读体验正推动这门古老艺术形式进入全新时代。设计师不再只关注形式美学,更需思考跨平台、跨文化的视觉语言建构。\n
\n
', '', '采用瑞士国际主义风格的解构版设计,在严格网格系统的基础上进行有意识的破坏和重组。排版应基于经典瑞士网格,但故意打破和扭曲,文字可越过栏格、重叠或被切割。色彩应保持瑞士风格的克制,主要使用黑白,但可添加一两种鲜艳原色作为点缀。字体必须使用无衬线几何字体如Helvetica或Akzidenz-Grotesk,但可通过极端的字重、间距和大小变化创造张力。图像应高对比且可被解构或重组。装饰元素几乎为零,但可使用解构的网格线和参考点。整体设计应呈现出理性与叛逆并存的视觉效果,像是经典瑞士设计被有意识地挑战和重新诠释,参考Wolfgang Weingart和April Greiman的实验性作品。', NULL, NULL, NULL, NULL, '0'); -INSERT INTO `ai_poster` (`id`, `template_name`, `template_code`, `template_css`, `template_style`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`) VALUES (11, '新未来主义', '
\n
\n
\n \n
\n
2025.09.21
\n \n
\n

星际探索

\n

当代太空技术正在重新定义人类的边界,开启多行星文明的新篇章

\n
\n \n
\n
\n 宇宙不仅比我们想象的更奇异,甚至比我们能够想象的还要奇异。探索太空不只是关于发现新世界,更是重新认识我们自己。\n
\n
\n \n
\n
\n
01
\n
可重复使用火箭:航天发射成本降低90%,开启太空旅行的商业化时代
\n
\n
\n
02
\n
月球基地建设:国际联合计划已进入实质性阶段,首个永久前哨将于2030年建成
\n
\n
\n
03
\n
深空通信网络:量子纠缠技术突破将实现与火星探测器的即时通信
\n
\n
\n
04
\n
小行星采矿:近地轨道资源开发预计将在2035年实现商业化,创造万亿级市场
\n
\n
\n \n
\n \"QR\n
扫描观看最新太空任务实时数据与高清图像
\n
\n \n
\n 编辑注释:太空探索已从政府主导的国家项目转变为公私合作的产业生态。这一转变不仅加速了技术创新,也正在为地球资源、能源与环境危机提供潜在解决方案。\n
\n
\n
', '', '采用新未来主义风格设计,体现当代建筑和产品设计中的前沿美学。形态应强调流线型曲线和有机几何形状,避免直角和静态形式。色彩应使用金属色调如银色、钛白和铬黄,配以一两种高饱和度的强调色。材质表现是关键,应模拟高科技材料如拉丝金属、碳纤维和磨砂玻璃。排版应动态且流畅,使用现代无衬线字体,可沿曲线排列或呈放射状。装饰元素应包含参数化生成的图案、流体动力学形态和仿生学结构。整体设计应呈现出高度发达的技术美学和动态感,仿佛来自近未来的高端产品,参考扎哈·哈迪德的建筑、特斯拉Cybertruck和Apple产品的设计语言', NULL, NULL, NULL, NULL, '0'); -INSERT INTO `ai_poster` (`id`, `template_name`, `template_code`, `template_css`, `template_style`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`) VALUES (12, '超现实主义数字拼贴风格', '
\n
\n
\n
\n
RÉALITÉ • 17 JUIN 2025
\n
\n

数字身份的迷宫

\n

在社交媒体的万花筒中,我们的自我变成了一系列精心策划的数字碎片

\n
\n
\n
\n \"我们创造了数字化的第二自我,它既是我们的延伸,又是我们的囚笼;既是真实的表达,又是精心构建的幻象。\"\n
\n
\n
\n
\n
数字拼贴:现代人的身份已成为多平台角色的复合体,每个平台展现不同的自我片段
\n
\n
\n
算法回音室:我们所见的内容塑造着我们的认知,而我们的行为又强化着算法的预测
\n
\n
\n
真实与表演的融合:在持续的公开展示中,表演逐渐成为真实,界限被永久模糊
\n
\n
\n
集体孤独:我们从未如此紧密连接,却同时经历着新形式的社交隔离与疏离
\n
\n
\n
\n \"QR\n
扫描进入一场关于数字身份的沉浸式体验
\n
\n
\n ÉDITORIAL:\n 社交媒体已不仅是我们使用的工具,更成为塑造我们思维与互动方式的环境。理解这种新现实的超现实性质,是我们在数字时代保持真实与连接的关键。\n
\n
', '', '采用超现实主义数字拼贴风格设计,创造梦境般的视觉叙事。图像处理是核心,应组合不相关元素创造意外联系,如古典雕塑与现代电子产品、自然元素与几何形状。比例应故意失调,创造视觉张力。色彩可使用梦幻般的组合,如暖日落色调或冷月光色调,添加轻微的色偏。排版应融入拼贴中,文字可环绕物体、穿过图像或成为构图的一部分。装饰元素应包含超现实符号如悬浮物体、不可能的建筑、变形的人物或动物。可添加微妙的阴影和光效增强立体感。整体设计应呈现出一种介于现实与梦境之间的视觉体验,引发观者的想象和潜意识联想,参考René Magritte的绘画和现代数字艺术家如Justin Peters的作品。', NULL, NULL, NULL, NULL, '0'); -INSERT INTO `ai_poster` (`id`, `template_name`, `template_code`, `template_css`, `template_style`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`) VALUES (13, '新巴洛克数字风格', '
\n
\n
\n
\n
\n
\n \n
\n
LE XVII AOÛT • ANNO DOMINI MMXXIV
\n
✧ ✦ ✧
\n

交响盛宴

\n

古典音乐的永恒华彩,在当代世界中绽放出永不褪色的光辉

\n \n
\n \n
\n \"交响乐不仅是音符的组合,更是人类情感的建筑;每一个乐章如同巴洛克宫殿的厅堂,宏伟、精致且充满戏剧性。\"\n
\n \n
\n
\n
管弦乐团正在经历数字化复兴,通过沉浸式技术与全息投影,为古典音乐带来革命性的聆听体验
\n
\n
\n
巴洛克音乐的复杂对位法与华丽装饰音,成为当代作曲家重新探索的灵感源泉,影响着电影配乐与游戏音乐
\n
\n
\n
年轻指挥家正在打破传统界限,将古典作品与现代元素融合,吸引新一代观众走进音乐厅
\n
\n
\n
高分辨率音频技术使巴赫、亨德尔与维瓦尔第的作品呈现出前所未有的细节与层次,重现巴洛克音乐的精髓
\n
\n
\n \n
\n
\n
HARMONIA MUNDI
\n \"QR\n
扫描聆听精选巴洛克音乐杰作
\n
\n
\n \n
\n MAESTRO\'S NOTE:\n 古典音乐的魅力在于它超越了时间的限制。几个世纪前的作品至今仍能唤起深刻的共鸣,提醒我们艺术的永恒价值。在这个快节奏的数字时代,交响乐团提供了一种珍贵的共同体验,让我们暂时脱离碎片化的现代生活。\n
\n
\n
', '', '采用新巴洛克数字风格设计,将17世纪的华丽美学重新诠释为数字形式。装饰是核心元素,应使用极其丰富的数字化巴洛克花纹、卷轴和浮雕效果,每个角落都应有精致细节。色彩应奢华且戏剧性,主要使用金色、深红、皇家蓝和黑色,可添加金属光泽和渐变效果。排版应华丽且层次丰富,使用装饰性强的衬线字体,可添加花体字母和装饰性首字母。图像应添加华丽框架和装饰性边缘。光影效果是关键,应创造强烈的明暗对比,模拟巴洛克绘画的戏剧性光效。整体设计应呈现出极度奢华、复杂且充满戏剧性的视觉体验,仿佛数字时代的凡尔赛宫,参考巴洛克艺术大师如鲁本斯的作品和现代奢侈品牌的视觉语言。', NULL, NULL, NULL, NULL, '0'); -INSERT INTO `ai_poster` (`id`, `template_name`, `template_code`, `template_css`, `template_style`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`) VALUES (15, '斯堪的纳维亚风格', '
\n
\n
Juni 20, 2025
\n

可持续设计

\n

如何通过设计创造更环保的未来

\n
\n
\n 优秀的设计不只是看起来美观,更应该对地球和人类的未来负责。\n
\n
\n
\n 1\n 可循环材料:选择可生物降解或可完全回收的材料是可持续设计的基础\n
\n
\n 2\n 长久耐用:设计应超越短暂流行,创造能经受时间考验的产品\n
\n
\n 3\n 节能生产:优化制造流程,减少能源消耗和碳排放\n
\n
\n 4\n 全生命周期:考虑产品从原材料到废弃处理的完整环境影响\n
\n
\n
\n \"QR\n
扫描二维码,了解更多可持续设计案例
\n
\n
\n 编辑手记: 在资源有限的世界里,可持续设计不再是选择而是必需。北欧设计一直引领这一理念,将简约美学与环保责任完美结合。\n
\n
', '', '采用斯堪的纳维亚风格设计,体现北欧设计的简约与功能美学。使用纯白背景,配以特定的北欧色调如淡蓝、浅灰、原木色和淡粉。排版应极度克制且有序,使用大量留白,但与极简主义不同,应加入温暖质感。字体选择无衬线几何字体如Futura或Circular,字重轻盈。装饰元素应极少但精心选择,可使用简单几何图案如三角形和线条,参考马勒维奇的构成主义。图像应明亮、简洁且自然。整体设计应呈现出清爽、实用且温暖的北欧特质,平衡美学与功能性,参考Kinfolk杂志和丹麦设计品牌HAY的产品美学。', NULL, NULL, NULL, NULL, '0'); -INSERT INTO `ai_poster` (`id`, `template_name`, `template_code`, `template_css`, `template_style`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`) VALUES (16, '未来科技风格', '
\n
2025.03.21
\n

深空探索

\n

人类文明跨越星际的下一步

\n
\n
\n \"我们在地球上的存在只是宇宙意识的短暂火花,深空探索是延续这火花的唯一希望。\"\n
\n
\n
\n 001\n 量子引擎突破光速限制的理论基础已初步验证,星际旅行不再是科幻\n
\n
\n 002\n 近星系人工智能探测网络已部署,预计5年内发回首批系外行星详细数据\n
\n
\n 003\n 深空辐射防护技术解决了长期太空旅行的最大生物学障碍\n
\n
\n 004\n 月球永久基地将成为人类迈向火星与更远星系的跳板\n
\n
\n
\n \"QR\n
扫描接入星际探索实时数据网络
\n
\n
\n 编辑笔记: 本报道基于最新深空探索计划发布的官方数据。部分预测基于当前技术发展曲线,实际进展可能因政治或资金因素有所调整。\n
\n
', '', '采用未来科技风格设计,呈现高度发达的数字界面美学。背景必须使用深蓝或纯黑,配以霓虹蓝、电子紫等高饱和度荧光色。排版应模拟高科技显示界面,使用等宽字体如Space Mono,添加数据可视化元素如图表、网格和代码片段。装饰元素包括科技感线条、HUD界面框架和全息投影效果。必须添加动态元素如扫描线、数据流动效果和微妙闪烁。可使用半透明叠加层和模糊效果创造深度。整体设计应呈现出未来感、高科技和信息密集的视觉体验,仿佛来自几十年后的界面,参考《银翼杀手2049》和《攻壳机动队》的视觉设计。', '1', '2025-04-04 14:42:37', '1', '2025-04-04 14:42:40', '0'); -COMMIT; - --- ---------------------------- --- Table structure for ai_material_log --- ---------------------------- -DROP TABLE IF EXISTS `ai_material_log`; -CREATE TABLE `ai_material_log` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', - `material_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '资源类型', - `prompt` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '提示词', - `model_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '模型', - `original_url` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '原生链接', - `local_url` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '本地链接', - `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '更新人', - `update_time` datetime DEFAULT NULL COMMENT '更新时间', - `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记', - `material_status` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '资源状态', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='AI资源记录'; - --- ---------------------------- --- Table structure for ai_report_conf --- ---------------------------- -DROP TABLE IF EXISTS `ai_report_conf`; -CREATE TABLE `ai_report_conf` ( - `id` bigint NOT NULL COMMENT '主键', - `report_title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '标题', - `report_prompt` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '描述提示词', - `report_resource` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '资源base64', - `report_marked` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '报告字段', - `create_time` datetime DEFAULT NULL, - `update_time` datetime DEFAULT NULL, - `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, - `update_by` datetime DEFAULT NULL, - `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='AI 报告'; - --- ---------------------------- --- Table structure for ai_dataset_user --- ---------------------------- -DROP TABLE IF EXISTS `ai_dataset_user`; -CREATE TABLE `ai_dataset_user` ( - `dataset_id` bigint NOT NULL COMMENT '知识库ID', - `user_id` bigint NOT NULL COMMENT '用户ID', - PRIMARY KEY (`dataset_id`,`user_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='知识库用户权限'; - -SET FOREIGN_KEY_CHECKS = 1; diff --git a/db/3pigxx_flow.sql b/db/3pigxx_flow.sql index 375de3aa5..2cbf9b3a1 100644 --- a/db/3pigxx_flow.sql +++ b/db/3pigxx_flow.sql @@ -22,8 +22,8 @@ CREATE TABLE `process` ( `process` json NOT NULL COMMENT '流程设置内容', `remark` varchar(125) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', `sort` int NOT NULL, - `is_hidden` tinyint(1) NOT NULL COMMENT '0 正常 1=隐藏', - `is_stop` tinyint(1) NOT NULL COMMENT '0 正常 1=停用 ', + `is_hidden` char(1) NOT NULL COMMENT '0 正常 1=隐藏', + `is_stop` char(1) NOT NULL COMMENT '0 正常 1=停用 ', `admin_id` bigint DEFAULT NULL COMMENT '流程管理员', `unique_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '唯一性id', `admin_list` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '管理员', @@ -42,8 +42,8 @@ DROP TABLE IF EXISTS `process_copy`; CREATE TABLE `process_copy` ( `id` bigint NOT NULL COMMENT '用户id', `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志', - `create_time` datetime NOT NULL COMMENT '创建时间', - `update_time` datetime NOT NULL COMMENT '更新时间', + `create_time` datetime COMMENT '创建时间', + `update_time` datetime COMMENT '更新时间', `start_time` datetime NOT NULL COMMENT ' 流程发起时间', `node_time` datetime NOT NULL COMMENT '当前节点时间', `start_user_id` bigint NOT NULL COMMENT '发起人', @@ -115,8 +115,8 @@ DROP TABLE IF EXISTS `process_node_data`; CREATE TABLE `process_node_data` ( `id` bigint NOT NULL COMMENT '用户id', `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志', - `create_time` datetime NOT NULL COMMENT '创建时间', - `update_time` datetime NOT NULL COMMENT '更新时间', + `create_time` datetime COMMENT '创建时间', + `update_time` datetime COMMENT '更新时间', `flow_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '流程id', `data` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '表单数据', `node_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, @@ -133,8 +133,8 @@ DROP TABLE IF EXISTS `process_node_record`; CREATE TABLE `process_node_record` ( `id` bigint NOT NULL COMMENT '用户id', `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志', - `create_time` datetime NOT NULL COMMENT '创建时间', - `update_time` datetime NOT NULL COMMENT '更新时间', + `create_time` datetime COMMENT '创建时间', + `update_time` datetime COMMENT '更新时间', `flow_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '流程id', `process_instance_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '流程实例id', `data` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '表单数据', @@ -158,13 +158,13 @@ DROP TABLE IF EXISTS `process_node_record_assign_user`; CREATE TABLE `process_node_record_assign_user` ( `id` bigint NOT NULL COMMENT '用户id', `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志', - `create_time` datetime NOT NULL COMMENT '创建时间', - `update_time` datetime NOT NULL COMMENT '更新时间', + `create_time` datetime COMMENT '创建时间', + `update_time` datetime COMMENT '更新时间', `flow_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '流程id', `process_instance_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '流程实例id', `data` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '表单数据', `node_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `user_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT ' 用户id', + `user_id` bigint NOT NULL COMMENT ' 用户id', `status` int NOT NULL COMMENT '节点状态', `start_time` datetime NOT NULL COMMENT '开始时间', `end_time` datetime DEFAULT NULL COMMENT '结束时间', @@ -187,8 +187,8 @@ DROP TABLE IF EXISTS `process_starter`; CREATE TABLE `process_starter` ( `id` bigint NOT NULL COMMENT '用户id', `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志', - `create_time` datetime NOT NULL COMMENT '创建时间', - `update_time` datetime NOT NULL COMMENT '更新时间', + `create_time` datetime COMMENT '创建时间', + `update_time` datetime COMMENT '更新时间', `type_id` bigint NOT NULL COMMENT '用户id或者部门id', `type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT ' 类型 user dept', `process_id` bigint NOT NULL COMMENT '流程id', diff --git a/db/6pigxx_config.sql b/db/6pigxx_config.sql index ee919fcdb..2eb6d2e1d 100644 --- a/db/6pigxx_config.sql +++ b/db/6pigxx_config.sql @@ -32,22 +32,21 @@ CREATE TABLE `config_info` ( -- Records of config_info -- ---------------------------- BEGIN; -INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (1, 'application-dev.yml', 'DEFAULT_GROUP', '# 配置文件加密根密码\njasypt:\n encryptor:\n password: pigx\n algorithm: PBEWithMD5AndDES\n iv-generator-classname: org.jasypt.iv.NoIvGenerator\n\n\nspring:\n data:\n redis:\n host: pigx-redis\n servlet:\n multipart:\n max-file-size: 100MB\n max-request-size: 100MB\n cloud:\n sentinel:\n eager: true\n transport:\n dashboard: pigx-sentinel:5020\n openfeign:\n sentinel:\n enabled: true\n okhttp:\n enabled: true\n httpclient:\n enabled: false\n connection-timeout: 20000\n compression:\n request:\n enabled: true\n response:\n enabled: true\n\n# 端点对外暴露\nmanagement:\n endpoints:\n web:\n exposure:\n include: \'*\' \n endpoint:\n health:\n show-details: ALWAYS\n\n#开启灰度\ngray:\n rule:\n enabled: true\n\n# mybatis-plus 配置\nmybatis-plus:\n tenant-enable: ture\n mapper-locations: classpath:/mapper/*Mapper.xml\n global-config:\n capitalMode: true\n banner: false\n db-config:\n id-type: auto\n where-strategy: not_empty\n insert-strategy: not_empty\n update-strategy: not_null\n type-handlers-package: com.pig4cloud.pigx.common.data.handler\n configuration:\n jdbc-type-for-null: \'null\'\n call-setters-on-nulls: true\n shrink-whitespaces-in-sql: true\nmybatis-plus-join:\n banner: false #关闭连表查询组件banner', '7cce78966662abb8cf108c02322d7e8e', '2025-05-03 21:22:27', '2025-06-24 10:15:00', 'nacos', '0:0:0:0:0:0:0:1', '', 'public', '', NULL, NULL, 'yaml', NULL, ''); -INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (2, 'pigx-auth-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n freemarker:\n allow-request-override: false\n allow-session-override: false\n cache: true\n charset: UTF-8\n check-template-location: true\n content-type: text/html\n enabled: true\n expose-request-attributes: false\n expose-session-attributes: false\n expose-spring-macro-helpers: true\n prefer-file-system-access: true\n suffix: .ftl\n template-loader-path: classpath:/templates/\n\n# 前端登录验证码\nsecurity:\n encodeKey: \'pigxpigxpigxpigx\'\n# 验证码相关配置参考: http://t.cn/A647jEdu\naj:\n captcha:\n cache-type: redis\n water-mark: pig4cloud', 'bb6bd9b9e21afdec3d6c88636387df96', '2025-05-03 21:22:27', '2025-05-03 21:22:27', 'nacos_namespace_migrate', '0:0:0:0:0:0:0:1', '', 'public', '', NULL, NULL, 'yaml', NULL, ''); -INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (3, 'pigx-codegen-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pigxx_codegen}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true\n resources:\n static-locations: classpath:/static/,classpath:/views/\n', 'ed6de06e34e2634c28a24e8a1db99b06', '2025-05-03 21:22:27', '2025-05-03 21:22:27', 'nacos_namespace_migrate', '0:0:0:0:0:0:0:1', '', 'public', '', NULL, NULL, 'yaml', NULL, ''); -INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (4, 'pigx-daemon-elastic-job-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pigxx_job}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true', '09996f46e0b80d7b2aa320ef4cb31c82', '2025-05-03 21:22:27', '2025-05-03 21:22:27', 'nacos_namespace_migrate', '127.0.0.1', '', 'public', '', NULL, NULL, 'yaml', NULL, ''); -INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (5, 'pigx-gateway-dev.yml', 'DEFAULT_GROUP', '# 固定路由转发配置 无修改\nspring:\n cloud:\n gateway:\n server:\n webflux:\n routes:\n - id: openapi\n uri: lb://pigx-gateway\n predicates:\n - Path=/v3/api-docs/**\n filters:\n - RewritePath=/v3/api-docs/(?.*), /$\\{path}/$\\{path}/v3/api-docs\n\n# gateway 刷新端点\nmanagement:\n endpoint:\n gateway:\n access: unrestricted\n', '97d980236595aac57bd310e2e89d21b4', '2025-05-03 21:22:27', '2025-06-24 10:20:53', 'nacos', '0:0:0:0:0:0:0:1', '', 'public', '', NULL, NULL, 'yaml', NULL, ''); -INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (6, 'pigx-monitor-dev.yml', 'DEFAULT_GROUP', 'spring:\n # 安全配置\n security:\n user:\n name: ENC(rZHA4LW5hHmhLAAzJoFNag==) # pigx\n password: ENC(bjeyh+Aeii3kHXkoo00ZUw==) # pigx\n autoconfigure:\n exclude: com.pig4cloud.pigx.common.core.config.JacksonConfiguration\n boot:\n admin:\n ui:\n title: \'pigx 服务状态监控\'\n brand: \'pigx 服务状态监控\'\n external-views:\n - label: \"SQL监控\"\n url: /druid/sql.html\n order: 2000\n iframe: true\nmanagement:\n endpoints:\n web:\n exposure:\n include: \'*\'\n endpoint:\n health:\n show-details: ALWAYS #显示详细信息\n\n\n# druid 监控的服务\nmonitor:\n applications:\n - pigx-upms-biz\n', '2bb39e4dee3f90d4186d1e42aa666d2a', '2025-05-03 21:22:27', '2025-05-03 21:22:27', 'nacos_namespace_migrate', '127.0.0.1', '', 'public', '', NULL, NULL, 'yaml', NULL, ''); -INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (7, 'pigx-upms-biz-dev.yml', 'DEFAULT_GROUP', '## spring security 配置\nsecurity:\n oauth2:\n client:\n ignore-urls:\n - /druid/**\n\n# 数据源\nspring:\n autoconfigure:\n exclude: org.springframework.cloud.gateway.config.GatewayAutoConfiguration,org.springframework.cloud.gateway.config.GatewayClassPathWarningAutoConfiguration\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pigxx}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true\n stat-view-servlet:\n enabled: true\n allow: \"\"\n url-pattern: /druid/*\n #login-username: admin\n #login-password: admin\n filter:\n stat:\n enabled: true\n log-slow-sql: true\n slow-sql-millis: 10000\n merge-sql: false\n wall:\n config:\n multi-statement-allow: true\n\n# 本地文件系统\nfile:\n local:\n enable: true\n basePath: /Users/lengleng/Downloads/files', '28f2305c1cfb413dcc45a3d432ef7098', '2025-05-03 21:22:27', '2025-06-05 00:24:09', 'nacos', '0:0:0:0:0:0:0:1', '', 'public', NULL, NULL, NULL, 'yaml', NULL, ''); -INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (8, 'pigx-daemon-quartz-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pigxx_job}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true\n resources:\n static-locations: classpath:/static/,classpath:/views/', '79619124a30cdb6e8bc1046aaa18d91c', '2025-05-03 21:22:27', '2025-05-03 21:22:27', 'nacos_namespace_migrate', '0:0:0:0:0:0:0:1', '', 'public', '', NULL, NULL, 'yaml', NULL, ''); -INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (9, 'pigx-pay-platform-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pigxx_pay}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true\n freemarker:\n allow-request-override: false\n allow-session-override: false\n cache: true\n charset: UTF-8\n check-template-location: true\n content-type: text/html\n enabled: true\n expose-request-attributes: false\n expose-session-attributes: false\n expose-spring-macro-helpers: true\n prefer-file-system-access: true\n suffix: .ftl\n template-loader-path: classpath:/templates/\n# 租户表维护\npigx:\n pay:\n test: lengleng\n aliPayConfig:\n expire-time: 30\n return-url: http://pig4cloud.com\n notify-url: http://payx.yunjihuitong.com/pay/notify/ali/callbak\n wxPayConfig:\n notify-url: https://admin.pig4cloud.com/pay/notify/wx/callbak\n mergePayConfig:\n return-url: http://pig4cloud.com\n notify-url: http://wechat.pigx.top/pay/notify/merge/callbak\n xsequence: #发号器相关配置\n db:\n retry-times: 3\n table-name: pay_sequence', 'f4e5734a99f3c1f059071deac081b33d', '2025-05-03 21:22:27', '2025-05-03 21:22:27', 'nacos_namespace_migrate', '0:0:0:0:0:0:0:1', '', 'public', '', NULL, NULL, 'yaml', NULL, ''); -INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (10, 'pigx-mp-platform-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pigxx_mp}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true\n resources:\n static-locations: classpath:/static/,classpath:/views/', 'd5936e0c352fb1fbe1d05f054f14c98a', '2025-05-03 21:22:27', '2025-05-03 21:22:27', 'nacos_namespace_migrate', '0:0:0:0:0:0:0:1', '', 'public', '', NULL, NULL, 'yaml', NULL, ''); -INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (11, 'pigx-xxl-job-admin-dev.yml', 'DEFAULT_GROUP', '# xxl\nxxl:\n job:\n i18n: zh_CN\n logretentiondays: 30\n triggerpool:\n fast.max: 200\n slow.max: 200\n\n# mybatis\nmybatis:\n mapper-locations: classpath:/mybatis-mapper/*Mapper.xml\n\n# spring\nspring:\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pigxx_job}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true\n mvc:\n static-path-pattern: /static/**\n freemarker:\n suffix: .ftl\n request-context-attribute: request\n settings:\n number_format: 0.##########\n mail:\n host: smtp.mxhichina.com\n port: 465\n from: xxxx@gitee.wang\n username: xxxx@gitee.wang\n password: xxxx\n properties:\n mail:\n smtp:\n auth: true\n ssl.enable: true\n starttls.enable: false\n required: false\n\nmanagement:\n health:\n mail:\n enabled: false\n endpoints:\n web:\n exposure:\n include: \'*\'\n endpoint:\n health:\n show-details: ALWAYS', '6d70dce1f3ee48f261dce29bcfa99cbb', '2025-05-03 21:22:27', '2025-05-03 21:22:27', 'nacos_namespace_migrate', '127.0.0.1', '', 'public', '', NULL, NULL, 'yaml', NULL, ''); -INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (12, 'pigx-report-platform-dev.yml', 'DEFAULT_GROUP', 'spring:\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pigxx_report}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true\n jpa:\n database-platform: org.hibernate.dialect.MySQL8Dialect\n\nsecurity:\n oauth2:\n client:\n ignore-urls:\n - /\n - /api/project/getData\n - /static/**\n - /api/project/get-file/*\n\n# 文件上传路径\ngv:\n img-path: /Users/lengleng/Downloads/img/\n', 'ce3fde4b4592cdd61feb2e443b2ddfe5', '2025-05-03 21:22:27', '2025-05-03 21:22:27', 'nacos_namespace_migrate', '127.0.0.1', '', 'public', '', NULL, NULL, 'yaml', NULL, ''); -INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (13, 'pigx-jimu-platform-dev.yml', 'DEFAULT_GROUP', 'spring:\n #配置静态资源\n mvc:\n static-path-pattern: /**\n resource:\n static-locations: classpath:/static/\n #配置数据库\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pigxx_bi}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true\n \n#JimuReport[minidao配置]\nminidao :\n base-package: org.jeecg.modules.jmreport.desreport.dao*\n db-type: mysql\n#JimuReport[上传配置]\njeecg :\n jmreport:\n customPrePath: /api/jimu\n # 自动保存\n autoSave: true\n # 单位毫秒 默认5*60*1000 \n interval: 10000\n # local|minio|alioss\n uploadType: local\n # local\n path :\n #文件路径A\n upload: ~/jimu/data\n # alioss\n oss:\n endpoint: oss-cn-beijing.aliyuncs.com\n accessKey: ??\n secretKey: ??\n staticDomain: ??\n bucketName: ??\n # minio\n minio:\n minio_url: http://minio.jeecg.com\n minio_name: ??\n minio_pass: ??\n bucketName: ??\n#输出sql日志\nlogging:\n level:\n org.jeecg.modules.jmreport : debug', '66319da04963c4c7217f807bf1bd5f2d', '2025-05-03 21:22:27', '2025-05-03 21:22:27', 'nacos_namespace_migrate', '0:0:0:0:0:0:0:1', '', 'public', '', NULL, NULL, 'yaml', NULL, ''); -INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (14, 'pigx-app-server-biz-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pigxx_app}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true', 'e4668a1854e92a5a666e83479ef7d26a', '2025-05-03 21:22:27', '2025-05-03 21:22:27', 'nacos_namespace_migrate', '0:0:0:0:0:0:0:1', '', 'public', '', NULL, NULL, 'yaml', NULL, ''); -INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (15, 'pigx-flow-engine-biz-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pigxx_flow}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&nullCatalogMeansCurrent=true', '233121e20445609e1ba378c3686ea7d5', '2025-05-03 21:22:27', '2025-05-03 21:22:27', 'nacos_namespace_migrate', '0:0:0:0:0:0:0:1', '', 'public', 'flowable 工作引擎', NULL, NULL, 'yaml', NULL, ''); -INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (16, 'pigx-flow-task-biz-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pigxx_flow}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&nullCatalogMeansCurrent=true', '233121e20445609e1ba378c3686ea7d5', '2025-05-03 21:22:27', '2025-05-03 21:22:27', 'nacos_namespace_migrate', '0:0:0:0:0:0:0:1', '', 'public', 'flowable 业务', NULL, NULL, 'yaml', NULL, ''); +INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (1, 'application-dev.yml', 'DEFAULT_GROUP', '# 配置文件加密根密码\njasypt:\n encryptor:\n password: pigx\n algorithm: PBEWithMD5AndDES\n iv-generator-classname: org.jasypt.iv.NoIvGenerator\n\n\nspring:\n data:\n redis:\n host: pigx-redis\n servlet:\n multipart:\n max-file-size: 100MB\n max-request-size: 100MB\n cloud:\n sentinel:\n eager: true\n transport:\n dashboard: pigx-sentinel:5020\n openfeign:\n sentinel:\n enabled: true\n okhttp:\n enabled: true\n httpclient:\n enabled: false\n connection-timeout: 20000\n compression:\n request:\n enabled: true\n response:\n enabled: true\n\n# 端点对外暴露\nmanagement:\n endpoints:\n web:\n exposure:\n include: \'*\' \n endpoint:\n restart:\n enabled: true\n health:\n show-details: ALWAYS\n\n#开启灰度\ngray:\n rule:\n enabled: true\n\n# mybatis-plus 配置\nmybatis-plus:\n tenant-enable: ture\n mapper-locations: classpath:/mapper/*Mapper.xml\n global-config:\n capitalMode: true\n banner: false\n db-config:\n id-type: auto\n where-strategy: not_empty\n insert-strategy: not_empty\n update-strategy: not_null\n type-handlers-package: com.pig4cloud.pigx.common.data.handler\n configuration:\n jdbc-type-for-null: \'null\'\n call-setters-on-nulls: true\n shrink-whitespaces-in-sql: true\nmybatis-plus-join:\n banner: false #关闭连表查询组件banner', '90942d7d4856ccba068fe5847643737d', '2022-12-16 10:44:25', '2023-08-14 11:44:19', 'nacos', '127.0.0.1', '', 'public', '', '', '', 'yaml', '', ''); +INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (2, 'pigx-auth-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n freemarker:\n allow-request-override: false\n allow-session-override: false\n cache: true\n charset: UTF-8\n check-template-location: true\n content-type: text/html\n enabled: true\n expose-request-attributes: false\n expose-session-attributes: false\n expose-spring-macro-helpers: true\n prefer-file-system-access: true\n suffix: .ftl\n template-loader-path: classpath:/templates/\n\n# 前端登录验证码\nsecurity:\n encodeKey: \'pigxpigxpigxpigx\'\n# 验证码相关配置参考: http://t.cn/A647jEdu\naj:\n captcha:\n cache-type: redis\n water-mark: pig4cloud', 'bb6bd9b9e21afdec3d6c88636387df96', '2022-12-16 10:44:25', '2024-04-20 22:47:21', 'nacos', '127.0.0.1', '', 'public', '', '', '', 'yaml', '', ''); +INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (3, 'pigx-codegen-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pigxx_codegen}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true\n resources:\n static-locations: classpath:/static/,classpath:/views/\n', 'ed6de06e34e2634c28a24e8a1db99b06', '2022-12-16 10:44:25', '2024-02-22 15:08:09', 'nacos', '127.0.0.1', '', 'public', '', '', '', 'yaml', '', ''); +INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (4, 'pigx-daemon-elastic-job-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pigxx_job}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true', '09996f46e0b80d7b2aa320ef4cb31c82', '2022-12-16 10:44:25', '2023-04-07 14:14:50', 'nacos', '127.0.0.1', '', 'public', '', '', '', 'yaml', '', ''); +INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (5, 'pigx-gateway-dev.yml', 'DEFAULT_GROUP', '# 固定路由转发配置 无修改\nspring:\n cloud:\n gateway:\n routes:\n - id: openapi\n uri: lb://pigx-gateway\n predicates:\n - Path=/v3/api-docs/**\n filters:\n - RewritePath=/v3/api-docs/(?.*), /$\\{path}/$\\{path}/v3/api-docs\n\n# gateway 刷新端点\nmanagement:\n endpoint:\n gateway:\n enabled: true\n', 'd9454d877ff3d8bd3fd0d5be99810195', '2022-12-16 10:44:25', '2024-04-20 22:47:02', 'nacos', '127.0.0.1', '', 'public', '', '', '', 'yaml', '', ''); +INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (6, 'pigx-monitor-dev.yml', 'DEFAULT_GROUP', 'spring:\n # 安全配置\n security:\n user:\n name: ENC(rZHA4LW5hHmhLAAzJoFNag==) # pigx\n password: ENC(bjeyh+Aeii3kHXkoo00ZUw==) # pigx\n autoconfigure:\n exclude: com.pig4cloud.pigx.common.core.config.JacksonConfiguration\n boot:\n admin:\n ui:\n title: \'pigx 服务状态监控\'\n brand: \'pigx 服务状态监控\'\n external-views:\n - label: \"SQL监控\"\n url: /druid/sql.html\n order: 2000\n iframe: true\nmanagement:\n endpoints:\n web:\n exposure:\n include: \'*\'\n endpoint:\n health:\n show-details: ALWAYS #显示详细信息\n\n\n# druid 监控的服务\nmonitor:\n applications:\n - pigx-upms-biz\n', '2bb39e4dee3f90d4186d1e42aa666d2a', '2022-12-16 10:44:25', '2023-04-07 14:12:09', 'nacos', '127.0.0.1', '', 'public', '', '', '', 'yaml', '', ''); +INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (7, 'pigx-upms-biz-dev.yml', 'DEFAULT_GROUP', '## spring security 配置\nsecurity:\n oauth2:\n client:\n ignore-urls:\n - /druid/**\n\n# 数据源\nspring:\n autoconfigure:\n exclude: org.springframework.cloud.gateway.config.GatewayAutoConfiguration,org.springframework.cloud.gateway.config.GatewayClassPathWarningAutoConfiguration\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pigxx}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true\n stat-view-servlet:\n enabled: true\n allow: \"\"\n url-pattern: /druid/*\n #login-username: admin\n #login-password: admin\n filter:\n stat:\n enabled: true\n log-slow-sql: true\n slow-sql-millis: 10000\n merge-sql: false\n wall:\n config:\n multi-statement-allow: true\n\n# 本地文件系统\nfile:\n local:\n enable: true\n basePath: /Users/lengleng/Downloads/files', '28f2305c1cfb413dcc45a3d432ef7098', '2022-12-16 10:44:25', '2024-02-22 15:08:36', 'nacos', '127.0.0.1', '', 'public', '', '', '', 'yaml', '', ''); +INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (8, 'pigx-daemon-quartz-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pigxx_job}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true\n resources:\n static-locations: classpath:/static/,classpath:/views/', '79619124a30cdb6e8bc1046aaa18d91c', '2022-12-16 10:44:25', '2024-04-19 21:49:00', 'nacos', '127.0.0.1', '', 'public', '', '', '', 'yaml', '', ''); +INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (9, 'pigx-pay-platform-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pigxx_pay}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true\n freemarker:\n allow-request-override: false\n allow-session-override: false\n cache: true\n charset: UTF-8\n check-template-location: true\n content-type: text/html\n enabled: true\n expose-request-attributes: false\n expose-session-attributes: false\n expose-spring-macro-helpers: true\n prefer-file-system-access: true\n suffix: .ftl\n template-loader-path: classpath:/templates/\n# 租户表维护\npigx:\n pay:\n test: lengleng\n aliPayConfig:\n expire-time: 30\n return-url: http://pig4cloud.com\n notify-url: http://payx.yunjihuitong.com/pay/notify/ali/callbak\n wxPayConfig:\n notify-url: https://admin.pig4cloud.com/pay/notify/wx/callbak\n mergePayConfig:\n return-url: http://pig4cloud.com\n notify-url: http://wechat.pigx.top/pay/notify/merge/callbak\n xsequence: #发号器相关配置\n db:\n retry-times: 3\n table-name: pay_sequence', 'f4e5734a99f3c1f059071deac081b33d', '2022-12-16 10:44:25', '2024-02-22 15:09:08', 'nacos', '127.0.0.1', '', 'public', '', '', '', 'yaml', '', ''); +INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (11, 'pigx-mp-platform-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pigxx_mp}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true\n resources:\n static-locations: classpath:/static/,classpath:/views/', 'd5936e0c352fb1fbe1d05f054f14c98a', '2022-12-16 10:44:25', '2024-02-22 15:09:20', 'nacos', '127.0.0.1', '', 'public', '', '', '', 'yaml', '', ''); +INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (12, 'pigx-xxl-job-admin-dev.yml', 'DEFAULT_GROUP', '# xxl\nxxl:\n job:\n i18n: zh_CN\n logretentiondays: 30\n triggerpool:\n fast.max: 200\n slow.max: 200\n\n# mybatis\nmybatis:\n mapper-locations: classpath:/mybatis-mapper/*Mapper.xml\n\n# spring\nspring:\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pigxx_job}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true\n mvc:\n static-path-pattern: /static/**\n freemarker:\n suffix: .ftl\n request-context-attribute: request\n settings:\n number_format: 0.##########\n mail:\n host: smtp.mxhichina.com\n port: 465\n from: xxxx@gitee.wang\n username: xxxx@gitee.wang\n password: xxxx\n properties:\n mail:\n smtp:\n auth: true\n ssl.enable: true\n starttls.enable: false\n required: false\n\nmanagement:\n health:\n mail:\n enabled: false\n endpoints:\n web:\n exposure:\n include: \'*\'\n endpoint:\n health:\n show-details: ALWAYS', '6d70dce1f3ee48f261dce29bcfa99cbb', '2022-12-16 10:44:25', '2023-01-04 18:22:48', 'nacos', '127.0.0.1', '', 'public', '', '', '', 'yaml', '', ''); +INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (13, 'pigx-report-platform-dev.yml', 'DEFAULT_GROUP', 'spring:\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pigxx_report}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true\n jpa:\n database-platform: org.hibernate.dialect.MySQL8Dialect\n\nsecurity:\n oauth2:\n client:\n ignore-urls:\n - /\n - /api/project/getData\n - /static/**\n - /api/project/get-file/*\n\n# 文件上传路径\ngv:\n img-path: /Users/lengleng/Downloads/img/\n', 'ce3fde4b4592cdd61feb2e443b2ddfe5', '2022-12-16 10:44:25', '2023-04-07 12:56:57', 'nacos', '127.0.0.1', '', 'public', '', '', '', 'yaml', '', ''); +INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (14, 'pigx-jimu-platform-dev.yml', 'DEFAULT_GROUP', 'spring:\n #配置静态资源\n mvc:\n static-path-pattern: /**\n resource:\n static-locations: classpath:/static/\n #配置数据库\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pigxx_bi}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true\n \n#JimuReport[minidao配置]\nminidao :\n base-package: org.jeecg.modules.jmreport.desreport.dao*\n db-type: mysql\n#JimuReport[上传配置]\njeecg :\n jmreport:\n customPrePath: /api/jimu\n # 自动保存\n autoSave: true\n # 单位毫秒 默认5*60*1000 \n interval: 10000\n # local|minio|alioss\n uploadType: local\n # local\n path :\n #文件路径A\n upload: ~/jimu/data\n # alioss\n oss:\n endpoint: oss-cn-beijing.aliyuncs.com\n accessKey: ??\n secretKey: ??\n staticDomain: ??\n bucketName: ??\n # minio\n minio:\n minio_url: http://minio.jeecg.com\n minio_name: ??\n minio_pass: ??\n bucketName: ??\n#输出sql日志\nlogging:\n level:\n org.jeecg.modules.jmreport : debug', '66319da04963c4c7217f807bf1bd5f2d', '2022-12-16 10:44:25', '2024-01-30 20:44:36', 'nacos', '127.0.0.1', '', 'public', '', '', '', 'yaml', '', ''); +INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (15, 'pigx-app-server-biz-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pigxx_app}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true', 'e4668a1854e92a5a666e83479ef7d26a', '2022-12-19 10:30:07', '2024-02-22 15:09:50', 'nacos', '127.0.0.1', '', 'public', '', '', '', 'yaml', '', ''); +INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (16, 'pigx-flow-biz-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pigxx_flow}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&nullCatalogMeansCurrent=true', '233121e20445609e1ba378c3686ea7d5', '2023-07-28 13:41:32', '2023-07-28 13:43:36', 'nacos', '127.0.0.1', '', 'public', 'flowable 工作引擎', '', '', 'yaml', '', ''); COMMIT; -- ---------------------------- diff --git a/docker-compose.yml b/docker-compose.yml index a87fe6f4d..b1aad7e24 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,4 +1,4 @@ -# 使用说明 V5.9 +# 使用说明 V5.10 # 1. 使用docker-compose 宿主机不需要配置host来发现 # 2. 无需修改源码,根目录 docker-compose up 即可 # 3. 静静等待服务启动 @@ -65,21 +65,12 @@ services: networks: - spring_cloud_default - pigx-flow-task: + pigx-flow-biz: build: - context: ./pigx-flow/pigx-flow-task/pigx-flow-task-biz + context: ./pigx-flow/pigx-flow-biz restart: always - container_name: pigx-flow-task - image: pigx-flow-task - networks: - - spring_cloud_default - - pigx-flow-engine: - build: - context: ./pigx-flow/pigx-flow-engine/pigx-flow-engine-biz - restart: always - container_name: pigx-flow-engine - image: pigx-flow-engine + container_name: pigx-flow-biz + image: pigx-flow-biz networks: - spring_cloud_default @@ -172,5 +163,5 @@ services: networks: spring_cloud_default: - name: spring_cloud_default + name: spring_cloud_default driver: bridge diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/pom.xml b/pigx-flow/pigx-flow-api/pom.xml similarity index 89% rename from pigx-flow/pigx-flow-task/pigx-flow-task-api/pom.xml rename to pigx-flow/pigx-flow-api/pom.xml index cc440ff7b..f3720ee47 100644 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/pom.xml +++ b/pigx-flow/pigx-flow-api/pom.xml @@ -6,11 +6,11 @@ 4.0.0 com.pig4cloud - pigx-flow-task - 5.9.0 + pigx-flow + 5.10.2-SNAPSHOT - pigx-flow-task-api + pigx-flow-api diff --git a/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/api/feign/RemoteFlowApiFlowService.java b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/api/feign/RemoteFlowApiFlowService.java new file mode 100644 index 000000000..dd277ee60 --- /dev/null +++ b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/api/feign/RemoteFlowApiFlowService.java @@ -0,0 +1,72 @@ +package com.pig4cloud.pigx.flow.api.feign; + +import com.pig4cloud.pigx.common.core.constant.ServiceNameConstants; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.dto.ProcessInstanceParamDto; +import com.pig4cloud.pigx.flow.vo.FormGroupVo; +import com.pig4cloud.pigx.flow.vo.ProcessVO; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; + +/** + * 远程流程API服务接口 + *

+ * 通过Feign客户端调用流程服务的远程接口,提供流程相关的核心功能。 + * 主要包括流程查询、流程启动等操作。该接口用于微服务间的远程调用, + * 使其他服务能够便捷地使用流程引擎的功能。 + *

+ * + * @author lengleng + * @date 2025/07/12 + */ +@FeignClient(contextId = "remoteFlowApiFlowService", value = ServiceNameConstants.FLOW_SERVER) +public interface RemoteFlowApiFlowService { + + /** + * 查询当前用户可发起的流程列表 + *

+ * 根据当前登录用户的权限,查询该用户有权发起的所有流程。 + * 返回结果按分组组织,方便前端展示。 + *

+ * + * @return 分组后的流程列表,包含分组信息和各分组下的流程 + */ + @GetMapping("/combination/group/listCurrentUserStartGroup") + R> listCurrentUserStartGroup(); + + /** + * 获取流程详细信息 + *

+ * 根据流程ID获取流程的完整配置信息,包括: + * - 流程基本信息(名称、图标、描述等) + * - 表单配置(表单项定义、验证规则等) + * - 流程配置(节点定义、流转规则等) + *

+ * + * @param flowId 流程定义ID + * @return 流程详细信息视图对象 + */ + @GetMapping("/process/getDetail") + R getDetail(@RequestParam("flowId") String flowId); + + /** + * 启动流程实例 + *

+ * 根据流程定义创建新的流程实例。启动流程时需要提供: + * - 流程ID + * - 表单数据 + * - 需要自选的节点执行人信息 + *

+ * + * @param paramDto 流程实例启动参数,包含流程ID、表单数据等 + * @return 启动成功后的流程实例ID + */ + @PostMapping("/process-instance/startProcessInstance") + R startProcessInstance(@RequestBody ProcessInstanceParamDto paramDto); + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/api/feign/packge-info.java b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/api/feign/packge-info.java similarity index 71% rename from pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/api/feign/packge-info.java rename to pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/api/feign/packge-info.java index 5ffbac507..11578aed0 100644 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/api/feign/packge-info.java +++ b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/api/feign/packge-info.java @@ -3,4 +3,4 @@ *

* feign client 存放目录,注意 @EnablePigxFeignClients 的扫描范围 */ -package com.pig4cloud.pigx.flow.task.api.feign; \ No newline at end of file +package com.pig4cloud.pigx.flow.api.feign; \ No newline at end of file diff --git a/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/constant/FormTypeEnum.java b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/constant/FormTypeEnum.java new file mode 100644 index 000000000..32e74a507 --- /dev/null +++ b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/constant/FormTypeEnum.java @@ -0,0 +1,156 @@ +package com.pig4cloud.pigx.flow.constant; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +import java.util.ArrayList; + +/** + * 表单类型枚举 + *

+ * 定义流程表单中支持的所有控件类型。每种类型对应不同的表单组件, + * 用于构建动态表单,收集流程执行过程中所需的各类数据。 + *

+ * + * @author pigx + * @since 2024/01/01 + */ +@Getter +@RequiredArgsConstructor +public enum FormTypeEnum { + + /** + * 单行文本输入框 + *

+ * 用于输入简短的文本内容,如姓名、标题等。 + * 默认值为空字符串。 + *

+ */ + INPUT("Input", "单行文本", ""), + + /** + * 多行文本输入框 + *

+ * 用于输入较长的文本内容,如描述、备注等。 + * 支持换行输入,默认值为空字符串。 + *

+ */ + TEXTAREA("Textarea", "多行文本", ""), + + /** + * 数字输入框 + *

+ * 用于输入数字类型的数据,支持整数和小数。 + * 可设置最大值、最小值等限制。 + *

+ */ + NUMBER("Number", "数字", null), + + /** + * 日期选择器 + *

+ * 用于选择日期,格式为 yyyy-MM-dd。 + * 不包含时间部分。 + *

+ */ + DATE("Date", "日期", null), + + /** + * 日期时间选择器 + *

+ * 用于选择日期和时间,格式为 yyyy-MM-dd HH:mm:ss。 + * 包含完整的日期时间信息。 + *

+ */ + DATE_TIME("DateTime", "日期时间", null), + + /** + * 序列号生成器 + *

+ * 自动生成唯一的序列号,如单据编号、流水号等。 + * 支持自定义前缀、后缀和序列规则。 + *

+ */ + SEQUENCE("Sequence", "发号器", null), + + /** + * 明细表格布局 + *

+ * 用于创建子表单,支持动态增减行。 + * 适用于需要录入多条明细数据的场景,如报销明细、订单明细等。 + *

+ */ + LAYOUT("Layout", "明细", null), + + /** + * 时间选择器 + *

+ * 用于选择时间,格式为 HH:mm:ss。 + * 仅包含时间部分,不包含日期。 + *

+ */ + TIME("Time", "时间", null), + + /** + * 金额输入框 + *

+ * 专门用于输入货币金额,支持千分位显示。 + * 自动保留两位小数,支持大写金额转换。 + *

+ */ + MONEY("Money", "金额", null), + + /** + * 单选下拉框 + *

+ * 从预定义选项中选择一个值。 + * 默认值为空列表,需要配置选项数据。 + *

+ */ + SINGLE_SELECT("SingleSelect", "单选", new ArrayList<>()), + + /** + * 部门选择器 + *

+ * 从组织架构中选择部门。 + * 支持树形结构展示,可配置单选或多选。 + *

+ */ + SELECT_DEPT("SelectDept", "部门", new ArrayList<>()), + + /** + * 用户选择器 + *

+ * 从系统用户中选择人员。 + * 支持按部门、角色筛选,可配置单选或多选。 + *

+ */ + SELECT_USER("SelectUser", "用户", new ArrayList<>()), + + ; + + /** + * 表单类型标识 + *

+ * 前端组件类型的唯一标识符 + *

+ */ + private final String type; + + /** + * 表单类型名称 + *

+ * 用于界面显示的中文名称 + *

+ */ + private final String name; + + /** + * 默认值 + *

+ * 该类型表单项的默认值,可以是字符串、数字、列表等 + *

+ */ + private final Object defaultValue; + +} diff --git a/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/constant/IBaseEnum.java b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/constant/IBaseEnum.java new file mode 100644 index 000000000..777e122c2 --- /dev/null +++ b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/constant/IBaseEnum.java @@ -0,0 +1,113 @@ +package com.pig4cloud.pigx.flow.constant; + +import cn.hutool.core.util.ObjectUtil; + +import java.util.EnumSet; +import java.util.Objects; + +/** + * 枚举通用接口 + *

+ * 为所有业务枚举提供统一的接口规范,实现枚举值和标签的标准化管理。 + * 提供了根据值获取枚举、根据值获取标签、根据标签获取值等通用方法。 + * 所有业务枚举类都应实现此接口,以保证枚举使用的一致性。 + *

+ * + * @param 枚举值的类型,通常为Integer或String + * @author haoxr + * @since 2022/3/27 12:06 + */ +public interface IBaseEnum { + + /** + * 获取枚举值 + *

+ * 返回枚举对应的实际值,通常用于数据库存储或接口传输 + *

+ * + * @return 枚举对应的值 + */ + T getValue(); + + /** + * 获取枚举标签 + *

+ * 返回枚举对应的显示标签,通常用于界面展示 + *

+ * + * @return 枚举对应的中文标签 + */ + String getLabel(); + + /** + * 根据值获取对应的枚举实例 + *

+ * 通过枚举值查找对应的枚举实例,常用于数据库查询结果的转换。 + * 如果找不到匹配的枚举,返回null。 + *

+ * + * @param value 枚举值 + * @param clazz 枚举类的Class对象 + * @param 枚举类型,必须实现IBaseEnum接口 + * @return 匹配的枚举实例,如果没有找到返回null + */ + static & IBaseEnum> E getEnumByValue(Object value, Class clazz) { + Objects.requireNonNull(value); + EnumSet allEnums = EnumSet.allOf(clazz); // 获取类型下的所有枚举 + E matchEnum = allEnums.stream().filter(e -> ObjectUtil.equal(e.getValue(), value)).findFirst().orElse(null); + return matchEnum; + } + + /** + * 根据值获取对应的标签 + *

+ * 通过枚举值直接获取对应的显示标签,常用于列表展示时的值转换。 + * 如果找不到匹配的枚举,返回null。 + *

+ * + * @param value 枚举值 + * @param clazz 枚举类的Class对象 + * @param 枚举类型,必须实现IBaseEnum接口 + * @return 枚举对应的标签,如果没有找到返回null + */ + static & IBaseEnum> String getLabelByValue(Object value, Class clazz) { + Objects.requireNonNull(value); + EnumSet allEnums = EnumSet.allOf(clazz); // 获取类型下的所有枚举 + E matchEnum = allEnums.stream().filter(e -> ObjectUtil.equal(e.getValue(), value)).findFirst().orElse(null); + + String label = null; + if (matchEnum != null) { + label = matchEnum.getLabel(); + } + return label; + } + + /** + * 根据标签获取对应的值 + *

+ * 通过枚举标签反向查找对应的枚举值,常用于表单提交时的数据转换。 + * 如果找不到匹配的枚举,返回null。 + *

+ * + * @param label 枚举标签 + * @param clazz 枚举类的Class对象 + * @param 枚举类型,必须实现IBaseEnum接口 + * @return 枚举对应的值,如果没有找到返回null + */ + static & IBaseEnum> Object getValueByLabel(String label, Class clazz) { + Objects.requireNonNull(label); + EnumSet allEnums = EnumSet.allOf(clazz); // 获取类型下的所有枚举 + String finalLabel = label; + E matchEnum = allEnums.stream() + .filter(e -> ObjectUtil.equal(e.getLabel(), finalLabel)) + .findFirst() + .orElse(null); + + Object value = null; + if (matchEnum != null) { + value = matchEnum.getValue(); + } + return value; + } + +} diff --git a/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/constant/NodeStatusEnum.java b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/constant/NodeStatusEnum.java new file mode 100644 index 000000000..a70286dde --- /dev/null +++ b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/constant/NodeStatusEnum.java @@ -0,0 +1,96 @@ +package com.pig4cloud.pigx.flow.constant; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +/** + * 流程节点状态枚举 + *

+ * 定义流程节点的执行状态,用于追踪每个节点在流程实例中的处理进度。 + * 状态变化遵循:未开始 -> 进行中 -> 已结束的生命周期。 + *

+ * + * @author pigx + * @since 2024/01/01 + */ +@Getter +@RequiredArgsConstructor +public enum NodeStatusEnum { + + /** + * 未开始 + *

+ * 节点已创建但尚未开始执行。 + * 表示流程已到达该节点的前置节点,但该节点还未被激活。 + *

+ */ + WKS(0, "未开始"), + + /** + * 进行中 + *

+ * 节点正在执行中,等待审批人处理或系统任务完成。 + * 对于审批节点,表示已分配给审批人但尚未完成审批。 + *

+ */ + JXZ(1, "进行中"), + + /** + * 已结束 + *

+ * 节点已完成执行,流程可以继续流转到下一节点。 + * 包括正常完成、跳过、驳回等所有结束状态。 + *

+ */ + YJS(2, "已结束"); + + /** + * 状态编码 + *

+ * 节点状态的数字编码,用于数据库存储和状态比较 + *

+ */ + private final int code; + + /** + * 状态名称 + *

+ * 节点状态的中文描述,用于界面显示 + *

+ */ + private final String name; + + /** + * 根据状态编码获取枚举实例 + * + * @param code 状态编码 + * @return 对应的枚举实例,如果找不到返回null + */ + public static NodeStatusEnum getByCode(int code) { + for (NodeStatusEnum status : values()) { + if (status.getCode() == code) { + return status; + } + } + return null; + } + + /** + * 判断节点是否可以处理 + * + * @return true表示节点可以被处理,false表示不能处理 + */ + public boolean canProcess() { + return this == JXZ; + } + + /** + * 判断节点是否已完成 + * + * @return true表示节点已完成,false表示未完成 + */ + public boolean isFinished() { + return this == YJS; + } + +} diff --git a/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/constant/NodeTypeEnum.java b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/constant/NodeTypeEnum.java new file mode 100644 index 000000000..a32a6dde7 --- /dev/null +++ b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/constant/NodeTypeEnum.java @@ -0,0 +1,82 @@ +package com.pig4cloud.pigx.flow.constant; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +import java.util.Arrays; + +/** + * 流程节点类型枚举 + *

+ * 定义流程中所有可用的节点类型,每种节点类型在流程中有不同的作用和行为。 + *

+ * + * @author pigx + */ +@Getter +@RequiredArgsConstructor +public enum NodeTypeEnum { + + /** + * 根节点 - 流程的起始点,每个流程必须有且只有一个根节点 + */ + ROOT("根节点", 0, false), + + /** + * 结束节点 - 流程的终止点,标识流程执行完成 + */ + END("结束节点", -1, false), + + /** + * 审批节点 - 需要用户进行审批操作的节点,支持单人或多人审批 + */ + APPROVAL("审批节点", 1, false), + + /** + * 抄送节点 - 仅用于通知,不阻塞流程执行,抄送人只需查看无需审批 + */ + CC("抄送节点", 2, false), + + /** + * 条件分支 - 根据表单数据或表达式判断流程走向,只会选择一条分支执行 + */ + EXCLUSIVE_GATEWAY("条件分支", 4, true), + + /** + * 并行分支 - 同时执行多条分支,所有分支都完成后才能继续后续流程 + */ + PARALLEL_GATEWAY("并行分支", 5, true), + + /** + * 空节点 - 占位节点,用于流程设计时的过渡 + */ + EMPTY("空", 3, false); + + /** + * 节点名称 + */ + private final String name; + + /** + * 节点类型值 + */ + private final Integer value; + + /** + * 是否为分支节点 + * true=分支节点(如条件分支、并行分支),false=普通节点 + */ + private final Boolean branch; + + /** + * 根据节点类型值获取枚举实例 + * + * @param value 节点类型值 + * @return 对应的节点类型枚举,找不到返回null + */ + + public static NodeTypeEnum getByValue(int value) { + return Arrays.stream(NodeTypeEnum.values()).filter(w -> w.getValue() == value).findAny().orElse(null); + } + +} diff --git a/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/constant/NodeUserTypeEnum.java b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/constant/NodeUserTypeEnum.java new file mode 100644 index 000000000..aba1ad046 --- /dev/null +++ b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/constant/NodeUserTypeEnum.java @@ -0,0 +1,19 @@ +package com.pig4cloud.pigx.flow.constant; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +/** + * 用户节点类型枚举 + */ +@Getter +@RequiredArgsConstructor +public enum NodeUserTypeEnum { + + USER("user", "用户"), DEPT("dept", "部门"), ROLE("role", "角色"), POST("post", "岗位"); + + private final String key; + + private final String name; + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/packge-info.java b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/constant/packge-info.java similarity index 58% rename from pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/packge-info.java rename to pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/constant/packge-info.java index 990c3b3fa..6ce2ffc6e 100644 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/packge-info.java +++ b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/constant/packge-info.java @@ -3,4 +3,4 @@ *

* 常量和枚举定义 */ -package com.pig4cloud.pigx.flow.task.constant; \ No newline at end of file +package com.pig4cloud.pigx.flow.constant; \ No newline at end of file diff --git a/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/CheckChildDto.java b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/CheckChildDto.java new file mode 100644 index 000000000..b78a6367a --- /dev/null +++ b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/CheckChildDto.java @@ -0,0 +1,36 @@ +package com.pig4cloud.pigx.flow.dto; + +import lombok.Data; + +import java.util.List; + +/** + * 子部门检查数据传输对象 + *

+ * 该DTO用于检查指定的子部门是否属于给定的父部门列表中的任意一个。 + * 主要用于流程中判断审批人是否在指定部门范围内的场景。 + *

+ * + * @author pigx + */ +@Data +public class CheckChildDto { + + /** + * 需要检查的子部门ID + *

+ * 要验证是否为指定父部门子部门的部门ID + *

+ */ + private Long childId; + + /** + * 父部门ID列表 + *

+ * 包含所有需要检查的父部门ID。 + * 如果childId是这个列表中任意一个部门的子部门(直接或间接),则检查通过。 + *

+ */ + private List deptIdList; + +} diff --git a/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/CheckParentDto.java b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/CheckParentDto.java new file mode 100644 index 000000000..f64b64e19 --- /dev/null +++ b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/CheckParentDto.java @@ -0,0 +1,36 @@ +package com.pig4cloud.pigx.flow.dto; + +import lombok.Data; + +import java.util.List; + +/** + * 父部门检查数据传输对象 + *

+ * 该DTO用于检查指定的父部门是否为给定部门列表中任意一个的父部门。 + * 主要用于流程中验证部门层级关系,判断审批人是否具有对某些部门的管辖权限。 + *

+ * + * @author pigx + */ +@Data +public class CheckParentDto { + + /** + * 需要检查的父部门ID + *

+ * 要验证是否为指定部门列表父部门的部门ID + *

+ */ + private Long parentId; + + /** + * 子部门ID列表 + *

+ * 包含所有需要检查的子部门ID。 + * 如果parentId是这个列表中任意一个部门的父部门(直接或间接),则检查通过。 + *

+ */ + private List deptIdList; + +} diff --git a/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/Condition.java b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/Condition.java new file mode 100644 index 000000000..19e042197 --- /dev/null +++ b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/Condition.java @@ -0,0 +1,67 @@ +package com.pig4cloud.pigx.flow.dto; + +import lombok.Data; + +/** + * 流程条件数据传输对象 + *

+ * 该DTO用于定义流程节点的单个执行条件。条件由键、表达式和值组成, + * 用于判断流程是否满足某个分支或节点的执行要求。 + * 常用于条件分支节点,根据表单数据判断流程走向。 + *

+ * + * @author pigx + */ +@Data +public class Condition { + + /** + * 条件键(字段标识) + *

+ * 对应表单中的字段ID或变量名,如 "amount"、"deptId" 等。 + * 用于标识需要判断的数据字段。 + *

+ */ + private String key; + + /** + * 条件表达式 + *

+ * 定义判断逻辑的表达式,支持的表达式类型包括: + * - EQ: 等于 + * - NE: 不等于 + * - GT: 大于 + * - GE: 大于等于 + * - LT: 小于 + * - LE: 小于等于 + * - IN: 包含在 + * - NOT_IN: 不包含在 + * - CONTAINS: 包含(字符串) + * - NOT_CONTAINS: 不包含(字符串) + * - EMPTY: 为空 + * - NOT_EMPTY: 不为空 + *

+ */ + private String expression; + + /** + * 条件值 + *

+ * 与表达式配合使用的比较值。 + * 类型可以是字符串、数字、日期、数组等,具体取决于字段类型和表达式。 + * 例如:金额大于1000时,value=1000;部门包含在[1,2,3]时,value=[1,2,3] + *

+ */ + private Object value; + + /** + * 字段类型 + *

+ * 标识条件键对应的数据类型,用于正确解析和比较数据。 + * 常见类型:INPUT(输入框)、NUMBER(数字)、DATE(日期)、 + * SELECT_USER(选择用户)、SELECT_DEPT(选择部门)等 + *

+ */ + private String keyType; + +} diff --git a/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/GroupCondition.java b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/GroupCondition.java new file mode 100644 index 000000000..6279be90c --- /dev/null +++ b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/GroupCondition.java @@ -0,0 +1,40 @@ +package com.pig4cloud.pigx.flow.dto; + +import lombok.Data; + +import java.util.List; + +/** + * 分组条件数据传输对象 + *

+ * 该DTO用于定义一组条件的逻辑关系。可以将多个条件组合在一起, + * 通过AND(与)或OR(或)的方式进行逻辑运算,用于复杂的流程条件判断。 + * 常用于条件分支节点,支持构建复杂的条件表达式。 + *

+ * + * @author pigx + */ +@Data +public class GroupCondition { + + /** + * 条件组合模式 + *

+ * 定义条件列表中各个条件之间的逻辑关系: + * - true: AND模式,所有条件都必须满足(与关系) + * - false: OR模式,满足任意一个条件即可(或关系) + *

+ */ + private Boolean mode; + + /** + * 条件列表 + *

+ * 包含该分组下的所有条件。 + * 这些条件会根据mode字段指定的逻辑关系进行组合判断。 + * 每个条件包含键、表达式、值等信息,用于具体的条件判断。 + *

+ */ + private List conditionList; + +} diff --git a/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/IndexPageStatistics.java b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/IndexPageStatistics.java new file mode 100644 index 000000000..f6690493c --- /dev/null +++ b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/IndexPageStatistics.java @@ -0,0 +1,60 @@ +package com.pig4cloud.pigx.flow.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 首页统计数据传输对象 + *

+ * 该DTO用于传输流程系统首页的统计数据,包括待办任务、已发起流程、 + * 抄送任务和已完成任务的数量统计。主要用于首页仪表盘的数据展示, + * 帮助用户快速了解当前的工作状态和任务情况。 + *

+ * + * @author pigx + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class IndexPageStatistics { + + /** + * 待办任务数量 + *

+ * 当前用户需要处理的待办任务总数。 + * 包括所有分配给当前用户但尚未完成的审批任务。 + *

+ */ + private Long pendingNum; + + /** + * 已发起流程数量 + *

+ * 当前用户发起的所有流程实例总数。 + * 包括进行中、已完成和已终止的流程。 + *

+ */ + private Long startedNum; + + /** + * 抄送任务数量 + *

+ * 抄送给当前用户的任务总数。 + * 这些任务仅供查看,不需要用户进行审批操作。 + *

+ */ + private Long copyNum; + + /** + * 已完成任务数量 + *

+ * 当前用户已经完成的任务总数。 + * 包括所有已审批(同意或拒绝)的任务。 + *

+ */ + private Long completedNum; + +} diff --git a/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/Nobody.java b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/Nobody.java new file mode 100644 index 000000000..08b7e48a7 --- /dev/null +++ b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/Nobody.java @@ -0,0 +1,43 @@ +package com.pig4cloud.pigx.flow.dto; + +import lombok.Data; + +import java.util.List; + +/** + * 无执行人处理策略数据传输对象 + *

+ * 该DTO用于定义当流程节点找不到执行人时的处理策略。 + * 在实际流程执行中,可能因为人员离职、角色变更等原因导致节点无法找到执行人, + * 此时需要根据预定义的策略进行处理,如自动通过、转交管理员、指定默认审批人等。 + *

+ * + * @author pigx + */ +@Data +public class Nobody { + + /** + * 处理策略 + *

+ * 定义当节点找不到执行人时的处理方式: + * - TO_PASS: 自动通过,节点自动完成 + * - TO_REFUSE: 自动拒绝,节点自动拒绝 + * - TO_ADMIN: 转交给管理员处理 + * - TO_USER: 转交给指定用户处理 + * - TO_END: 直接结束流程 + *

+ */ + private String handler; + + /** + * 指定的处理人列表 + *

+ * 当handler为TO_USER时,指定接收任务的用户列表。 + * 包含用户的ID、名称、类型等信息。 + * 如果handler为其他值,此字段可为空。 + *

+ */ + private List assignedUser; + +} diff --git a/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/Node.java b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/Node.java index 1e9eb72d9..2199d837a 100644 --- a/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/Node.java +++ b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/Node.java @@ -141,4 +141,13 @@ public class Node { */ private Refuse refuse; + /** 条件类型 */ + private Integer conditionType; + + /** 表达式文本 */ + private String expressionText; + + /** 规则名称 */ + private String ruleName; + } diff --git a/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/NodeHttpResultVO.java b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/NodeHttpResultVO.java new file mode 100644 index 000000000..cd770ec56 --- /dev/null +++ b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/NodeHttpResultVO.java @@ -0,0 +1,40 @@ +package com.pig4cloud.pigx.flow.dto; + +import lombok.Data; + +import java.util.Map; + +/** + * 节点HTTP请求结果数据传输对象 + *

+ * 该DTO用于封装流程节点执行HTTP请求后的返回结果。 + * 在流程执行过程中,某些节点可能需要调用外部系统的接口(如获取审批人、 + * 验证业务数据等),此对象用于统一封装这些HTTP请求的响应结果。 + *

+ * + * @author pigx + */ +@Data +public class NodeHttpResultVO { + + /** + * 请求是否成功 + *

+ * 标识HTTP请求是否执行成功: + * - true: 请求成功,data字段包含返回的业务数据 + * - false: 请求失败,data字段可能包含错误信息 + *

+ */ + private Boolean ok; + + /** + * 返回的数据内容 + *

+ * HTTP请求返回的业务数据,以Map形式存储,便于灵活处理各种数据结构。 + * 成功时包含业务数据,失败时可能包含错误码、错误信息等。 + * 具体内容取决于调用的接口定义。 + *

+ */ + private Map data; + +} diff --git a/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/NodeUser.java b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/NodeUser.java new file mode 100644 index 000000000..b7da694fa --- /dev/null +++ b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/NodeUser.java @@ -0,0 +1,74 @@ +package com.pig4cloud.pigx.flow.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 节点用户数据传输对象 + *

+ * 该DTO用于表示流程节点的执行人信息。可以代表具体的用户、角色或部门, + * 用于流程节点的审批人配置、抄送人配置等场景。 + * 支持多种类型的执行人,如指定用户、角色成员、部门成员等。 + *

+ * + * @author pigx + */ +@NoArgsConstructor +@Data +@Builder +@AllArgsConstructor +public class NodeUser { + + /** + * 用户/角色/部门ID + *

+ * 根据type字段的不同,此ID可能代表: + * - 用户ID(当type为USER时) + * - 角色ID(当type为ROLE时) + * - 部门ID(当type为DEPT时) + *

+ */ + private Long id; + + /** + * 名称 + *

+ * 显示名称,如用户姓名、角色名称、部门名称等。 + * 用于在界面上展示给用户看。 + *

+ */ + private String name; + + /** + * 类型标识 + *

+ * 标识该对象的类型: + * - USER: 用户 + * - ROLE: 角色 + * - DEPT: 部门 + * - VARIABLE: 流程变量 + *

+ */ + private String type; + + /** + * 是否选中 + *

+ * 在用户界面中标识该项是否被选中。 + * 主要用于前端交互,如在审批人选择列表中标记已选项。 + *

+ */ + private Boolean selected; + + /** + * 用户头像URL + *

+ * 用户的头像地址,仅当type为USER时有效。 + * 用于在界面上展示用户头像,提升用户体验。 + *

+ */ + private String avatar; + +} diff --git a/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/ProcessCopyDto.java b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/ProcessCopyDto.java new file mode 100644 index 000000000..eed0332d3 --- /dev/null +++ b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/ProcessCopyDto.java @@ -0,0 +1,92 @@ +package com.pig4cloud.pigx.flow.dto; + +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 流程抄送数据传输对象 + *

+ * 该DTO用于创建流程抄送记录。当流程执行到某个节点时, + * 可以将该节点的信息抄送给相关人员,抄送人员可以查看但不需要审批。 + * 常用于让相关人员了解流程进展,保持信息透明。 + *

+ * + * @author pigx + */ +@Data +public class ProcessCopyDto { + + /** + * 抄送时间 + *

+ * 记录抄送动作发生的时间,即当前节点的执行时间。 + * 用于追溯抄送记录的时间线。 + *

+ */ + private LocalDateTime nodeTime; + + /** + * 流程发起人ID + *

+ * 发起该流程实例的用户ID。 + * 用于标识流程的发起者,便于抄送人了解流程来源。 + *

+ */ + private Long startUserId; + + /** + * 流程定义ID + *

+ * 流程定义的唯一标识,标识这是哪个流程模板。 + * 如:leave_process(请假流程)、purchase_process(采购流程)等。 + *

+ */ + private String flowId; + + /** + * 流程实例ID + *

+ * 当前运行的流程实例的唯一标识。 + * 用于关联到具体的流程实例,便于查看详情。 + *

+ */ + private String processInstanceId; + + /** + * 节点ID + *

+ * 触发抄送的流程节点ID。 + * 标识是在哪个节点产生的抄送记录。 + *

+ */ + private String nodeId; + + /** + * 节点名称 + *

+ * 触发抄送的流程节点名称,如"部门经理审批"、"财务审核"等。 + * 用于在界面上显示,让抄送人了解流程进展到哪一步。 + *

+ */ + private String nodeName; + + /** + * 表单数据 + *

+ * JSON格式的表单数据,包含流程实例的业务数据。 + * 如请假流程的请假事由、天数等信息,便于抄送人查看具体内容。 + *

+ */ + private String formData; + + /** + * 抄送接收人ID + *

+ * 接收抄送通知的用户ID。 + * 该用户将在抄送列表中看到此流程的信息。 + *

+ */ + private Long userId; + +} diff --git a/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/ProcessInstanceRecordParamDto.java b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/ProcessInstanceRecordParamDto.java new file mode 100644 index 000000000..b06c8753d --- /dev/null +++ b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/ProcessInstanceRecordParamDto.java @@ -0,0 +1,68 @@ +package com.pig4cloud.pigx.flow.dto; + +import lombok.Getter; +import lombok.Setter; + +/** + * 流程实例记录参数数据传输对象 + *

+ * 该DTO用于创建或更新流程实例的执行记录。 + * 记录流程实例的基本信息和表单数据,用于流程历史追溯和数据存储。 + * 支持主流程和子流程的记录创建。 + *

+ * + * @author Vincent + * @since 2023-05-07 + */ +@Getter +@Setter +public class ProcessInstanceRecordParamDto { + + /** + * 用户ID + *

+ * 执行此操作的用户ID,通常是流程发起人或当前任务处理人。 + * 用于记录操作人信息,便于审计和追溯。 + *

+ */ + private Long userId; + + /** + * 流程定义ID + *

+ * 流程模板的唯一标识。 + * 标识这条记录属于哪个流程定义。 + *

+ */ + private String flowId; + + /** + * 流程实例ID + *

+ * 当前流程实例的唯一标识。 + * 用于关联流程实例的所有相关记录。 + *

+ */ + private String processInstanceId; + + /** + * 父流程实例ID + *

+ * 如果当前流程是子流程,此字段存储父流程的实例ID。 + * 用于建立流程间的父子关系,支持流程嵌套场景。 + * 如果是主流程,此字段为空。 + *

+ */ + private String parentProcessInstanceId; + + /** + * 表单数据 + *

+ * JSON格式的表单数据,存储流程实例的业务数据。 + * 包含用户填写的所有表单字段值,如申请内容、金额、日期等。 + * 这些数据会在流程执行过程中被各节点使用和展示。 + *

+ */ + private String formData; + +} diff --git a/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/ProcessNodeDataDto.java b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/ProcessNodeDataDto.java new file mode 100644 index 000000000..2d7097cc0 --- /dev/null +++ b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/ProcessNodeDataDto.java @@ -0,0 +1,50 @@ +package com.pig4cloud.pigx.flow.dto; + +import lombok.Data; + +/** + * 流程节点数据传输对象 + *

+ * 该DTO用于存储和传输流程节点的配置数据。 + * 每个流程节点可能有特定的配置信息,如审批人设置、表单权限、条件配置等, + * 这些配置数据以JSON格式存储在data字段中。 + *

+ * + * @author pigx + */ +@Data +public class ProcessNodeDataDto { + + /** + * 流程定义ID + *

+ * 节点所属的流程定义唯一标识。 + * 标识该节点配置属于哪个流程模板。 + *

+ */ + private String flowId; + + /** + * 节点ID + *

+ * 流程节点的唯一标识。 + * 用于定位具体的节点,每个流程中的节点ID是唯一的。 + *

+ */ + private String nodeId; + + /** + * 节点配置数据 + *

+ * JSON格式的节点配置信息,可能包含: + * - 审批人配置:指定用户、角色、部门主管等 + * - 表单权限:各字段的读写权限设置 + * - 条件配置:分支条件、跳转条件等 + * - 事件配置:超时提醒、自动处理等 + * - 其他自定义配置 + * 具体内容根据节点类型和业务需求而定。 + *

+ */ + private String data; + +} diff --git a/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/ProcessNodeRecordAssignUserParamDto.java b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/ProcessNodeRecordAssignUserParamDto.java new file mode 100644 index 000000000..0c209a352 --- /dev/null +++ b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/ProcessNodeRecordAssignUserParamDto.java @@ -0,0 +1,120 @@ +package com.pig4cloud.pigx.flow.dto; + +import lombok.Data; + +/** + * 流程节点记录执行人参数数据传输对象 + *

+ * 该DTO用于记录流程节点的执行人信息。当任务分配给用户或用户处理任务时, + * 创建相应的执行人记录,用于追踪任务的处理过程和审批历史。 + * 包含任务执行的完整上下文信息。 + *

+ * + * @author pigx + */ +@Data +public class ProcessNodeRecordAssignUserParamDto { + + /** + * 流程定义ID + *

+ * 流程模板的唯一标识。 + * 标识该记录所属的流程定义。 + *

+ */ + private String flowId; + + /** + * 流程实例ID + *

+ * 运行中的流程实例唯一标识。 + * 用于关联到具体的流程实例。 + *

+ */ + private String processInstanceId; + + /** + * 表单数据 + *

+ * JSON格式的表单数据,包含流程实例的业务数据。 + * 记录任务执行时的表单内容,便于历史查看。 + *

+ */ + private String data; + + /** + * 节点本地数据 + *

+ * 节点级别的局部数据,仅在当前节点范围内有效。 + * 可能包含节点特定的配置或临时数据。 + *

+ */ + private String localData; + + /** + * 节点ID + *

+ * 流程节点的唯一标识。 + * 标识任务所在的节点。 + *

+ */ + private String nodeId; + + /** + * 执行人用户ID + *

+ * 被分配执行该任务的用户ID。 + * 记录谁负责处理这个任务。 + *

+ */ + private Long userId; + + /** + * 执行ID + *

+ * Flowable引擎的执行ID。 + * 用于关联流程引擎中的执行实例。 + *

+ */ + private String executionId; + + /** + * 任务ID + *

+ * Flowable引擎生成的任务ID。 + * 用于唯一标识一个用户任务实例。 + *

+ */ + private String taskId; + + /** + * 审批意见 + *

+ * 用户处理任务时填写的审批意见或备注。 + * 记录审批理由、建议等信息。 + *

+ */ + private String approveDesc; + + /** + * 节点名称 + *

+ * 流程节点的显示名称,如"部门经理审批"。 + * 用于在界面上展示,提高可读性。 + *

+ */ + private String nodeName; + + /** + * 任务类型 + *

+ * 标识任务的类型: + * - APPROVAL: 审批任务 + * - COPY: 抄送任务 + * - NOTIFY: 通知任务 + * - CUSTOM: 自定义任务 + *

+ */ + private String taskType; + +} diff --git a/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/Refuse.java b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/Refuse.java new file mode 100644 index 000000000..a661ae7df --- /dev/null +++ b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/Refuse.java @@ -0,0 +1,41 @@ +package com.pig4cloud.pigx.flow.dto; + +import lombok.Data; + +/** + * 拒绝处理策略数据传输对象 + *

+ * 该DTO用于定义流程节点被拒绝后的处理策略。 + * 当审批人拒绝某个节点时,系统需要根据预定义的策略决定流程的后续走向, + * 如回退到指定节点、直接结束流程、转交其他人处理等。 + *

+ * + * @author pigx + */ +@Data +public class Refuse { + + /** + * 拒绝处理策略 + *

+ * 定义节点被拒绝后的处理方式: + * - TO_END: 直接结束流程 + * - TO_NODE: 回退到指定节点 + * - TO_BEFORE: 回退到上一个节点 + * - TO_START: 回退到发起人 + * - CONTINUE: 继续流程(忽略拒绝) + *

+ */ + private String handler; + + /** + * 目标节点ID + *

+ * 当handler为TO_NODE时,指定要回退到的目标节点ID。 + * 流程将回退到该节点重新执行。 + * 如果handler为其他值,此字段可为空。 + *

+ */ + private String nodeId; + +} diff --git a/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/SelectValue.java b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/SelectValue.java new file mode 100644 index 000000000..4df83cd78 --- /dev/null +++ b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/SelectValue.java @@ -0,0 +1,37 @@ +package com.pig4cloud.pigx.flow.dto; + +import lombok.Data; + +/** + * 选择项数据传输对象 + *

+ * 该DTO用于表示下拉选择、单选、多选等表单控件的选项。 + * 提供键值对的数据结构,key用于存储和逻辑处理,value用于界面显示。 + * 常用于表单配置、条件选择、数据字典等场景。 + *

+ * + * @author Huijun Zhao + * @date 2023-07-28 10:36 + */ +@Data +public class SelectValue { + + /** + * 选项键 + *

+ * 选项的唯一标识,用于数据存储和逻辑处理。 + * 通常是编码、ID等不会改变的值,如"1"、"APPROVED"、"DEPT_001"等。 + *

+ */ + private String key; + + /** + * 选项显示值 + *

+ * 选项的显示文本,用于在界面上展示给用户。 + * 通常是描述性的文字,如"已批准"、"销售部"、"紧急"等。 + *

+ */ + private String value; + +} diff --git a/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/TaskDto.java b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/TaskDto.java new file mode 100644 index 000000000..0e1c5be39 --- /dev/null +++ b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/TaskDto.java @@ -0,0 +1,176 @@ +package com.pig4cloud.pigx.flow.dto; + +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.Date; +import java.util.Map; + +/** + * 任务数据传输对象 + *

+ * 该DTO用于传输流程任务的详细信息。包含任务的基本信息、 + * 执行信息、关联的流程信息等。主要用于任务列表展示、 + * 任务详情查看、任务处理等场景。 + *

+ * + * @author pigx + */ +@Data +public class TaskDto { + + /** + * 流程定义ID + *

+ * 任务所属的流程定义唯一标识。 + * 标识该任务属于哪个流程模板。 + *

+ */ + private String flowId; + + /** + * 流程变量集合 + *

+ * 存储流程执行过程中的各种变量。 + * 包含表单数据、控制变量、业务数据等。 + * 这些变量可用于任务处理和决策。 + *

+ */ + private Map paramMap; + + /** + * 流程实例ID + *

+ * 任务所属的流程实例唯一标识。 + * 用于关联到具体的流程实例。 + *

+ */ + private String processInstanceId; + + /** + * 执行ID + *

+ * Flowable引擎的执行ID。 + * 用于关联流程引擎中的执行实例。 + *

+ */ + private String executionId; + + /** + * 任务耗时 + *

+ * 任务从创建到完成的时间,单位为毫秒。 + * 用于统计任务处理效率。 + *

+ */ + private Long durationInMillis; + + /** + * 任务ID + *

+ * Flowable引擎生成的任务唯一标识。 + * 用于任务的查询和操作。 + *

+ */ + private String taskId; + + /** + * 任务执行人 + *

+ * 当前任务的执行人用户标识。 + * 可能是用户ID或用户名,取决于系统配置。 + *

+ */ + private String assign; + + /** + * 任务名称 + *

+ * 任务的显示名称,如"部门经理审批"。 + * 对应流程节点的名称。 + *

+ */ + private String taskName; + + /** + * 节点ID + *

+ * 任务对应的流程节点ID。 + * 用于定位任务在流程中的位置。 + *

+ */ + private String nodeId; + + /** + * 任务创建时间 + *

+ * 任务在流程引擎中的创建时间。 + * 标记任务何时产生。 + *

+ */ + private Date taskCreateTime; + + /** + * 任务结束时间 + *

+ * 任务完成或终止的时间。 + * 用于计算任务处理时长。 + *

+ */ + private Date taskEndTime; + + /** + * 流程组名称 + *

+ * 流程所属分组的名称,如"行政类流程"、"财务类流程"。 + * 用于流程分类展示。 + *

+ */ + private String groupName; + + /** + * 流程发起人ID + *

+ * 发起该流程实例的用户ID。 + * 用于显示流程的发起者信息。 + *

+ */ + private Long rootUserId; + + /** + * 流程发起人姓名 + *

+ * 发起该流程实例的用户姓名。 + * 用于界面显示,提高可读性。 + *

+ */ + private String rootUserName; + + /** + * 流程发起人头像URL + *

+ * 发起人的头像地址。 + * 用于在界面上展示发起人头像,提升用户体验。 + *

+ */ + private String rootUserAvatarUrl; + + /** + * 流程发起时间 + *

+ * 流程实例的创建时间。 + * 记录流程何时开始。 + *

+ */ + private LocalDateTime startTime; + + /** + * 流程名称 + *

+ * 流程定义的名称,如"请假申请流程"、"报销流程"。 + * 用于界面显示,便于用户理解。 + *

+ */ + private String processName; + +} diff --git a/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/TaskParamDto.java b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/TaskParamDto.java new file mode 100644 index 000000000..2c544bfd5 --- /dev/null +++ b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/TaskParamDto.java @@ -0,0 +1,112 @@ +package com.pig4cloud.pigx.flow.dto; + +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * 任务操作参数数据传输对象 + *

+ * 该DTO用于任务操作时传递参数,如完成任务、转办任务、委派任务等。 包含任务标识、操作人信息、流程变量、目标节点等信息。 支持单个任务操作和批量任务操作。 + *

+ * + * @author pigx + */ +@Data +public class TaskParamDto { + + /** + * 流程实例ID + *

+ * 单个流程实例的唯一标识。 用于定位要操作的流程实例。 + *

+ */ + private String processInstanceId; + + /** + * 流程实例ID列表 + *

+ * 批量操作时使用,包含多个流程实例ID。 支持批量完成、批量转办等操作。 + *

+ */ + private List processInstanceIdList; + + /** + * 节点ID + *

+ * 当前操作的节点ID。 用于标识任务所在的流程节点。 + *

+ */ + private String nodeId; + + /** + * 是否添加子流程发起人 + *

+ * 标识是否需要在子流程中记录主流程的发起人信息。 true: 子流程会继承主流程的发起人信息 false: 子流程独立记录发起人 + *

+ */ + private Boolean appendChildProcessRootId; + + /** + * 任务ID + *

+ * Flowable引擎的任务唯一标识。 用于定位要操作的具体任务。 + *

+ */ + private String taskId; + + /** + * 操作用户ID + *

+ * 执行任务操作的用户ID。 记录是谁在操作这个任务。 + *

+ */ + private String userId; + + /** + * 目标用户ID(已废弃) + *

+ * 单个目标用户ID,用于转办等操作。 建议使用targetUserIdList代替。 + *

+ */ + private String targetUserId; + + /** + * 流程变量参数 + *

+ * 任务完成时设置的流程变量。 这些变量会存储在流程实例中,供后续节点使用。 如审批意见、审批结果、业务数据等。 + *

+ */ + private Map paramMap; + + /** + * 任务本地变量 + *

+ * 仅在当前任务范围内有效的变量。 任务完成后这些变量会被清除,不会传递到后续节点。 用于存储临时数据或任务特定的配置。 + *

+ */ + private Map taskLocalParamMap; + + /** + * 表单数据 + */ + private Map formData; + + /** + * 目标节点ID + *

+ * 指定跳转的目标节点ID。 用于实现流程跳转、回退等功能。 如驳回到指定节点、跳过某些节点等。 + *

+ */ + private String targetNodeId; + + /** + * 转办目标用户ID列表 + *

+ * 任务转办时的目标用户ID列表。 支持将任务转办给一个或多个用户。 转办后原执行人不再拥有该任务。 + *

+ */ + private List targetUserIdList; + +} diff --git a/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/TaskQueryParamDto.java b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/TaskQueryParamDto.java new file mode 100644 index 000000000..6e732abf1 --- /dev/null +++ b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/TaskQueryParamDto.java @@ -0,0 +1,81 @@ +package com.pig4cloud.pigx.flow.dto; + +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 用户任务查询参数数据传输对象 + *

+ * 该DTO用于查询用户任务列表时传递查询条件。 + * 支持按执行人、流程名称、时间范围、任务状态等条件进行查询, + * 并支持分页功能。主要用于任务列表、待办事项等功能。 + *

+ * + * @author pigx + */ +@Data +public class TaskQueryParamDto { + + /** + * 任务执行人 + *

+ * 用于查询指定用户的任务。 + * 可以是用户ID或用户名,取决于系统实现。 + * 为空时查询所有用户的任务。 + *

+ */ + private String assign; + + /** + * 当前页码 + *

+ * 分页查询的页码,从1开始。 + * 用于实现分页功能。 + *

+ */ + private Integer current; + + /** + * 每页记录数 + *

+ * 分页查询时每页显示的记录数量。 + * 用于控制返回数据的大小。 + *

+ */ + private Integer size; + + /** + * 流程名称 + *

+ * 用于按流程名称过滤任务。 + * 支持模糊查询,如输入"请假"可查询所有请假相关流程的任务。 + *

+ */ + private String processName; + + /** + * 任务时间范围 + *

+ * 用于按任务创建时间范围查询。 + * 数组包含两个元素:[开始时间, 结束时间]。 + * 可用于查询特定时间段内的任务。 + *

+ */ + private LocalDateTime[] taskTime; + + /** + * 任务状态 + *

+ * 用于按任务状态过滤: + * - 0: 待处理 + * - 1: 已完成 + * - 2: 已拒绝 + * - 3: 已撤回 + * - 4: 已转办 + * 为空时查询所有状态的任务。 + *

+ */ + private Integer status; + +} diff --git a/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/TaskResultDto.java b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/TaskResultDto.java new file mode 100644 index 000000000..f8a916f7d --- /dev/null +++ b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/TaskResultDto.java @@ -0,0 +1,100 @@ +package com.pig4cloud.pigx.flow.dto; + +import lombok.Data; + +import java.util.Map; + +/** + * 任务结果数据传输对象 + *

+ * 该DTO用于返回任务的详细信息和执行结果。 + * 包含任务的当前状态、节点配置、流程变量、委派状态等信息。 + * 主要用于任务详情展示、任务处理页面的数据渲染。 + *

+ * + * @author pigx + */ +@Data +public class TaskResultDto { + + /** + * 是否为当前任务 + *

+ * 标识该任务是否为流程的当前活动任务。 + * true: 任务正在等待处理 + * false: 任务已完成或不是当前节点 + *

+ */ + private Boolean currentTask; + + /** + * 流程定义ID + *

+ * 任务所属的流程定义唯一标识。 + * 用于获取流程模板信息。 + *

+ */ + private String flowId; + + /** + * 任务节点配置 + *

+ * 包含任务节点的完整配置信息。 + * 如节点类型、审批人设置、表单权限、条件配置等。 + * 用于渲染任务处理界面。 + *

+ */ + private Node taskNode; + + /** + * 节点ID + *

+ * 任务对应的流程节点ID。 + * 用于定位任务在流程中的位置。 + *

+ */ + private String nodeId; + + /** + * 流程实例ID + *

+ * 任务所属的流程实例唯一标识。 + * 用于关联到具体的流程实例。 + *

+ */ + private String processInstanceId; + + /** + * 委派状态 + *

+ * 标识任务的委派状态: + * - PENDING: 待处理,委派任务等待被委派人处理 + * - RESOLVED: 已解决,委派任务已完成并返回给委派人 + * - null: 非委派任务 + *

+ */ + private String delegationState; + + /** + * 是否允许继续委派 + *

+ * 控制任务是否可以被继续委派给其他人。 + * true: 允许当前处理人将任务委派给其他人 + * false: 不允许继续委派 + *

+ */ + private Boolean delegate; + + /** + * 所有流程变量 + *

+ * 包含流程实例的所有变量,包括: + * - 表单数据:用户填写的业务数据 + * - 系统变量:流程引擎设置的变量 + * - 控制变量:用于流程控制的变量 + * 这些变量可用于任务处理和页面展示。 + *

+ */ + private Map variableAll; + +} diff --git a/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/VariableQueryParamDto.java b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/VariableQueryParamDto.java new file mode 100644 index 000000000..edde02d0a --- /dev/null +++ b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/VariableQueryParamDto.java @@ -0,0 +1,51 @@ +package com.pig4cloud.pigx.flow.dto; + +import lombok.Data; + +import java.util.List; + +/** + * 变量查询参数数据传输对象 + *

+ * 该DTO用于查询流程变量或任务变量。 + * 支持按任务ID或执行ID查询指定的变量,可以查询单个或多个变量。 + * 主要用于获取流程执行过程中的数据,如表单数据、控制变量等。 + *

+ * + * @author pigx + */ +@Data +public class VariableQueryParamDto { + + /** + * 任务ID + *

+ * Flowable引擎的任务唯一标识。 + * 用于查询特定任务的变量。 + * 与executionId二选一,优先使用taskId。 + *

+ */ + private String taskId; + + /** + * 变量键列表 + *

+ * 需要查询的变量名称列表。 + * 如果为空,则查询所有变量; + * 如果指定了具体的键,则只返回这些键对应的变量值。 + * 例如:["amount", "reason", "approver"] + *

+ */ + private List keyList; + + /** + * 执行ID + *

+ * Flowable引擎的执行实例ID。 + * 用于查询特定执行实例的变量。 + * 当没有taskId时使用此字段查询。 + *

+ */ + private String executionId; + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/packge-info.java b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/packge-info.java similarity index 59% rename from pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/packge-info.java rename to pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/packge-info.java index d83dba1e1..9f14644cf 100644 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/packge-info.java +++ b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/dto/packge-info.java @@ -3,4 +3,4 @@ *

* DTO 存放目录 */ -package com.pig4cloud.pigx.flow.task.dto; \ No newline at end of file +package com.pig4cloud.pigx.flow.dto; \ No newline at end of file diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/ProcessCopy.java b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/entity/ProcessCopy.java similarity index 51% rename from pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/ProcessCopy.java rename to pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/entity/ProcessCopy.java index 748be68c7..694d872ba 100644 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/ProcessCopy.java +++ b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/entity/ProcessCopy.java @@ -1,4 +1,4 @@ -package com.pig4cloud.pigx.flow.task.entity; +package com.pig4cloud.pigx.flow.entity; import com.baomidou.mybatisplus.annotation.*; import com.pig4cloud.pigx.common.core.util.TenantTable; @@ -9,8 +9,11 @@ import lombok.experimental.Accessors; import java.time.LocalDateTime; /** + * 流程抄送记录实体类 *

- * 流程抄送数据 + * 记录流程执行过程中的抄送信息。抄送是指将流程信息通知给相关人员, + * 但这些人员不需要进行审批操作,仅供查看和了解流程进展。 + * 一个流程节点可以抄送给多个人员,每个抄送生成一条记录。 *

* * @author Vincent @@ -24,79 +27,92 @@ import java.time.LocalDateTime; public class ProcessCopy { /** - * 用户id + * 主键ID + * 使用雪花算法生成的分布式ID */ @TableId(value = "id", type = IdType.ASSIGN_ID) private Long id; /** * 流程发起时间 + * 记录流程实例的创建时间,用于追踪流程的开始时刻 */ @TableField("start_time") private LocalDateTime startTime; /** - * 当前节点时间 + * 抄送节点执行时间 + * 记录产生抄送的节点执行时间,即何时触发的抄送通知 */ @TableField("node_time") private LocalDateTime nodeTime; /** - * 发起人 + * 流程发起人ID + * 记录启动流程实例的用户ID,方便追溯流程的发起者 */ @TableField("start_user_id") private Long startUserId; /** - * 流程id + * 流程定义ID + * 关联process表的flow_id,标识该抄送属于哪个流程定义 */ @TableField("flow_id") private String flowId; /** - * 实例id + * 流程实例ID + * 关联process_instance_record表,标识该抄送属于哪个流程实例 */ @TableField("process_instance_id") private String processInstanceId; /** - * 节点id + * 流程节点ID + * 标识在哪个节点产生的抄送,对应流程定义中的节点标识 */ @TableField("node_id") private String nodeId; /** - * 分组id + * 流程分组ID + * 流程所属的分组ID,继承自流程定义 */ @TableField("group_id") private Long groupId; /** - * 分组名称 + * 流程分组名称 + * 缓存流程分组的名称,方便查询展示,避免关联查询 */ @TableField("group_name") private String groupName; /** * 流程名称 + * 缓存流程定义的名称,方便在抄送列表中直接展示 */ @TableField("process_name") private String processName; /** - * 节点 名称 + * 抄送节点名称 + * 产生抄送的节点名称,如"部门经理审批"、"财务审核"等 */ @TableField("node_name") private String nodeName; /** - * 表单数据 + * 表单数据快照 + * JSON格式存储抄送时的表单数据,确保抄送人看到的是当时的数据状态 */ @TableField("form_data") private String formData; /** - * 抄送人id + * 抄送接收人ID + * 接收抄送通知的用户ID,该用户可以查看但不能操作流程 */ @TableField("user_id") private Long userId; diff --git a/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/entity/ProcessGroup.java b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/entity/ProcessGroup.java new file mode 100644 index 000000000..91be639ac --- /dev/null +++ b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/entity/ProcessGroup.java @@ -0,0 +1,88 @@ +package com.pig4cloud.pigx.flow.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.pig4cloud.pigx.common.core.util.TenantTable; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.time.LocalDateTime; + +/** + * 流程分组实体类 + *

+ * 用于对流程进行分类管理,将相关的流程归类到同一个分组中,便于用户查找和管理。 + * 支持按照分组名称和排序顺序来组织流程的展示结构。 + *

+ * + * @author Vincent + * @since 2023-07-06 + */ +@Getter +@Setter +@TenantTable +@Accessors(chain = true) +@TableName("process_group") +public class ProcessGroup { + + /** + * 分组名称 + *

+ * 流程分组的显示名称,用于标识该分组的用途或类型。 + * 例如:人事管理、财务审批、行政事务等。 + *

+ */ + @TableField("group_name") + private String groupName; + + /** + * 排序序号 + *

+ * 用于控制分组在列表中的显示顺序,数值越小越靠前。 + * 可以根据业务重要性或使用频率来设置排序值。 + *

+ */ + @TableField("sort") + private Integer sort; + + /** + * 分组ID + *

+ * 分组的唯一标识符,采用雪花算法生成。 + * 在Process实体中通过groupId字段引用此ID,建立流程与分组的关联关系。 + *

+ */ + @TableId(value = "id", type = IdType.ASSIGN_ID) + private Long id; + + /** + * 逻辑删除标记 + *

+ * 用于软删除功能,删除时不会真正从数据库中移除记录,而是标记为已删除。 + * 0-正常,1-已删除。这样可以保留历史数据,便于数据恢复和审计。 + *

+ */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + private String delFlag; + + /** + * 创建时间 + *

+ * 记录分组的创建时间,自动填充,用于数据审计和追踪。 + *

+ */ + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 更新时间 + *

+ * 记录分组信息的最后更新时间,在创建和更新时自动填充。 + * 用于跟踪数据的变更历史。 + *

+ */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/ProcessInstanceRecord.java b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/entity/ProcessInstanceRecord.java similarity index 54% rename from pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/ProcessInstanceRecord.java rename to pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/entity/ProcessInstanceRecord.java index 666212755..d42870b73 100644 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/ProcessInstanceRecord.java +++ b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/entity/ProcessInstanceRecord.java @@ -1,4 +1,4 @@ -package com.pig4cloud.pigx.flow.task.entity; +package com.pig4cloud.pigx.flow.entity; import com.baomidou.mybatisplus.annotation.*; import com.pig4cloud.pigx.common.core.util.TenantTable; @@ -11,8 +11,10 @@ import java.time.LocalDateTime; import java.util.Date; /** + * 流程实例记录实体类 *

- * 流程记录 + * 该实体记录每个流程实例的执行情况,包括发起人、表单数据、执行状态等。 + * 一个流程定义(Process)可以创建多个流程实例记录。 *

* * @author Vincent @@ -27,79 +29,92 @@ import java.util.Date; public class ProcessInstanceRecord { /** - * 流程名字 + * 流程实例名称 + * 通常继承自流程定义的名称,也可以在创建时自定义 */ @TableField("name") private String name; /** - * 头像 + * 流程图标 + * 继承自流程定义的图标配置 */ @TableField("logo") private String logo; /** - * 用户id + * 流程发起人ID + * 记录该流程实例的创建者用户ID */ @TableField("user_id") private Long userId; /** - * 流程id + * 流程定义ID + * 关联process表的flow_id,指明该实例属于哪个流程定义 */ @TableField("flow_id") private String flowId; /** - * 流程实例id + * Flowable引擎流程实例ID + * 对应Flowable引擎中的流程实例ID,用于与引擎交互 */ @TableField("process_instance_id") private String processInstanceId; /** * 表单数据 + * JSON格式存储用户提交的表单数据,在流程执行过程中使用 */ @TableField("form_data") private String formData; /** - * 组id + * 流程分组ID + * 继承自流程定义的分组ID */ @TableField("group_id") private Long groupId; /** - * 组名称 + * 流程分组名称 + * 缓存流程所属分组的名称,方便查询展示 */ @TableField("group_name") private String groupName; /** - * 状态 + * 流程实例状态 + * 1=进行中,2=已完成,3=已取消,4=已中止 */ @TableField("status") private Integer status; - /** - * 完成原因 - */ - @TableField("finish_reason") - private String finishReason; + /** + * 流程结束原因 + * 记录流程完成、取消或中止的具体原因 + */ + @TableField("finish_reason") + private String finishReason; /** - * 结束时间 + * 流程结束时间 + * 记录流程实例的完成、取消或中止时间 */ @TableField("end_time") private Date endTime; /** - * 上级流程实例id + * 父流程实例ID + * 当前流程是子流程时,记录父流程的实例ID,支持流程嵌套 */ @TableField("parent_process_instance_id") private String parentProcessInstanceId; /** - * 用户id + * 主键ID + * 使用雪花算法生成的分布式ID */ @TableId(value = "id", type = IdType.ASSIGN_ID) private Long id; diff --git a/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/entity/ProcessNodeData.java b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/entity/ProcessNodeData.java new file mode 100644 index 000000000..ef8a4bcd7 --- /dev/null +++ b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/entity/ProcessNodeData.java @@ -0,0 +1,100 @@ +package com.pig4cloud.pigx.flow.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.pig4cloud.pigx.common.core.util.TenantTable; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.time.LocalDateTime; + +/** + * 流程节点数据实体类 + *

+ * 用于存储流程节点的表单数据和配置信息。当流程实例运行时,每个节点可能需要填写表单或提交数据, + * 这些数据通过本实体进行持久化存储。支持JSON格式的灵活数据结构,可以适应不同类型节点的数据需求。 + *

+ * + * @author Vincent + * @since 2023-07-06 + */ +@Getter +@Setter +@TenantTable +@Accessors(chain = true) +@TableName("process_node_data") +public class ProcessNodeData { + + /** + * 流程实例ID + *

+ * 关联到具体的流程实例,标识这些节点数据属于哪个流程实例。 + * 对应ProcessInstanceRecord表的flowId字段。 + *

+ */ + @TableField("flow_id") + private String flowId; + + /** + * 节点表单数据 + *

+ * 以JSON格式存储的节点表单数据,包含用户在该节点填写的所有表单字段值。 + * 数据结构根据节点配置的表单项动态变化,支持文本、数字、日期、选择等多种表单类型。 + * 例如:{"amount": 5000, "reason": "采购办公用品", "approver": "user123"} + *

+ */ + @TableField("data") + private String data; + + /** + * 节点ID + *

+ * 流程定义中的节点标识符,用于关联到具体的流程节点。 + * 通过此ID可以确定数据属于流程的哪个环节,如发起节点、审批节点、抄送节点等。 + * 与Node对象中的id字段对应。 + *

+ */ + @TableField("node_id") + private String nodeId; + + /** + * 主键ID + *

+ * 节点数据记录的唯一标识符,采用雪花算法生成。 + *

+ */ + @TableId(value = "id", type = IdType.ASSIGN_ID) + private Long id; + + /** + * 逻辑删除标记 + *

+ * 用于软删除功能,删除时不会真正从数据库中移除记录,而是标记为已删除。 + * 0-正常,1-已删除。保留历史数据便于审计和数据恢复。 + *

+ */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + private String delFlag; + + /** + * 创建时间 + *

+ * 记录节点数据的创建时间,通常是用户提交表单的时间。 + * 自动填充,用于数据审计和流程追踪。 + *

+ */ + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 更新时间 + *

+ * 记录节点数据的最后更新时间,在创建和更新时自动填充。 + * 用于跟踪数据的修改历史,如表单数据的补充或修正。 + *

+ */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/ProcessNodeRecord.java b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/entity/ProcessNodeRecord.java similarity index 56% rename from pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/ProcessNodeRecord.java rename to pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/entity/ProcessNodeRecord.java index eb8718f5b..c39eb1f09 100644 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/ProcessNodeRecord.java +++ b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/entity/ProcessNodeRecord.java @@ -1,4 +1,4 @@ -package com.pig4cloud.pigx.flow.task.entity; +package com.pig4cloud.pigx.flow.entity; import com.baomidou.mybatisplus.annotation.*; import com.pig4cloud.pigx.common.core.util.TenantTable; @@ -10,8 +10,10 @@ import java.time.LocalDateTime; import java.util.Date; /** + * 流程节点记录实体类 *

- * 流程节点记录 + * 记录流程实例中每个节点的执行情况。 + * 一个流程实例在执行过程中会产生多个节点记录,用于跟踪和审计流程执行路径。 *

* * @author Vincent @@ -25,64 +27,78 @@ import java.util.Date; public class ProcessNodeRecord { /** - * 流程id + * 流程定义ID + * 关联process表的flow_id */ @TableField("flow_id") private String flowId; /** - * 流程实例id + * 流程实例ID + * 关联process_instance_record表,标识该节点记录属于哪个流程实例 */ @TableField("process_instance_id") private String processInstanceId; /** - * 表单数据 + * 节点执行时的表单数据 + * JSON格式存储节点执行时的表单数据快照,用于记录和审计 */ @TableField("data") private String data; + /** + * 节点ID + * 流程定义中的节点唯一标识 + */ @TableField("node_id") private String nodeId; /** * 节点类型 + * 对应NodeTypeEnum中的值(审批节点、抄送节点、条件分支等) */ @TableField("node_type") private String nodeType; /** - * 节点名字 + * 节点名称 + * 节点的显示名称,如“部门经理审批”、“财务审核”等 */ @TableField("node_name") private String nodeName; /** - * 节点状态 + * 节点执行状态 + * 1=进行中,2=已完成,3=已取消,4=已跳过 */ @TableField("status") private Integer status; /** - * 开始时间 + * 节点开始执行时间 + * 记录节点开始执行的时间 */ @TableField("start_time") private Date startTime; /** - * 结束时间 + * 节点结束执行时间 + * 记录节点完成、取消或跳过的时间 */ @TableField("end_time") private Date endTime; /** - * 执行id + * Flowable引擎执行ID + * 对应Flowable引擎中的execution_id,用于与引擎交互 */ @TableField("execution_id") private String executionId; /** - * 用户id + * 主键ID + * 使用雪花算法生成的分布式ID */ @TableId(value = "id", type = IdType.ASSIGN_ID) private Long id; diff --git a/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/entity/ProcessNodeRecordAssignUser.java b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/entity/ProcessNodeRecordAssignUser.java new file mode 100644 index 000000000..45ab8b631 --- /dev/null +++ b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/entity/ProcessNodeRecordAssignUser.java @@ -0,0 +1,198 @@ +package com.pig4cloud.pigx.flow.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.pig4cloud.pigx.common.core.util.TenantTable; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.time.LocalDateTime; + +/** + * 流程节点记录分配用户实体类 + *

+ * 记录流程节点的执行人信息和执行详情。当一个流程节点需要由特定用户处理时, 系统会为每个被分配的用户创建一条记录。这个实体保存了用户的任务执行状态、 + * 处理时间、审批意见等核心信息,是流程执行过程中的重要审计记录。 + *

+ *

+ * 与ProcessNodeRecord的关系:ProcessNodeRecord记录节点的整体执行情况, 而本实体记录该节点分配给具体用户的执行情况。一个节点可能分配给多个用户 + * (如会签、或签场景),因此一个ProcessNodeRecord可对应多个ProcessNodeRecordAssignUser。 + *

+ * + * @author Vincent + * @since 2023-07-06 + */ +@Getter +@Setter +@TenantTable +@Accessors(chain = true) +@TableName("process_node_record_assign_user") +public class ProcessNodeRecordAssignUser { + + /** + * 流程定义ID + *

+ * 关联到流程定义,标识该任务属于哪个流程模板。 对应Process表的flowId字段,用于追溯任务的流程来源。 + *

+ */ + @TableField("flow_id") + private String flowId; + + /** + * 流程实例ID + *

+ * Flowable引擎中的流程实例标识符,用于关联到具体的流程实例。 通过此ID可以在Flowable引擎中查询流程实例的详细信息和运行状态。 + *

+ */ + @TableField("process_instance_id") + private String processInstanceId; + + /** + * 节点表单数据 + *

+ * JSON格式存储的表单数据,记录用户在处理该节点时提交的所有表单信息。 与ProcessNodeData中的data字段类似,但这里专门记录该执行人提交的数据。 + * 在会签场景下,不同执行人可能提交不同的表单数据。 + *

+ */ + @TableField("data") + private String data; + + /** + * 节点ID + *

+ * 流程定义中的节点标识符,标识任务属于哪个流程节点。 与Node对象的id字段对应,用于定位流程图中的具体位置。 + *

+ */ + @TableField("node_id") + private String nodeId; + + /** + * 执行用户ID + *

+ * 被分配处理该节点任务的用户标识符。 对应系统用户表的用户ID,标识谁负责处理这个任务。 在任务分配时设置,用于权限控制和任务查询。 + *

+ */ + @TableField("user_id") + private Long userId; + + /** + * 任务执行状态 + *

+ * 记录该用户对任务的处理状态,对应NodeStatusEnum枚举值: 0-待处理:任务已分配但用户还未处理 1-同意:用户已审批通过 2-拒绝:用户已审批拒绝 + * 3-撤销:任务已被撤销 4-转办:任务已转交他人处理 5-终止:流程已终止 6-跳过:任务被自动跳过 7-待执行:等待执行中 + *

+ */ + @TableField("status") + private Integer status; + + /** + * 任务开始时间 + *

+ * 记录任务分配给用户的时间,即用户开始拥有该任务处理权的时间。 用于计算任务处理时长和监控任务时效性。 + *

+ */ + @TableField("start_time") + private LocalDateTime startTime; + + /** + * 任务结束时间 + *

+ * 记录用户完成任务处理的时间,包括同意、拒绝、转办等操作的时间。 与startTime配合可计算任务处理耗时,用于绩效分析和流程优化。 + *

+ */ + @TableField("end_time") + private LocalDateTime endTime; + + /** + * 流程执行ID + *

+ * Flowable引擎中的执行实例标识符,用于精确定位流程执行路径。 在并行网关、子流程等复杂场景下,一个流程实例可能有多个执行实例。 + *

+ */ + @TableField("execution_id") + private String executionId; + + /** + * Flowable任务ID + *

+ * Flowable引擎中的任务实例标识符,是任务在工作流引擎中的唯一标识。 通过此ID可以调用Flowable API完成任务、查询任务详情等操作。 + *

+ */ + @TableField("task_id") + private String taskId; + + /** + * 审批意见 + *

+ * 用户在处理任务时填写的文字意见或备注,如批准理由、拒绝原因等。 这是流程审批的重要记录,用于后续的审计追踪和决策参考。 + *

+ */ + @TableField("approve_desc") + private String approveDesc; + + /** + * 节点名称 + *

+ * 流程节点的显示名称,如"部门经理审批"、"财务审核"等。 冗余存储以提高查询效率,避免每次都需要关联查询节点配置。 + *

+ */ + @TableField("node_name") + private String nodeName; + + /** + * 任务类型 + *

+ * 标识任务的类型,对应NodeTypeEnum枚举值: 0-发起人节点、1-审批人节点、2-抄送人节点、3-条件节点、4-并行节点等。 + * 不同类型的任务有不同的处理逻辑和界面展示。 + *

+ */ + @TableField("task_type") + private String taskType; + + /** + * 表单本地数据 + *

+ * 存储与该任务相关的本地化数据或临时数据,JSON格式。 可用于保存用户的草稿数据、中间计算结果或其他不需要提交到流程的辅助信息。 + *

+ */ + @TableField("local_data") + private String localData; + + /** + * 主键ID + *

+ * 任务分配记录的唯一标识符,采用雪花算法生成。 + *

+ */ + @TableId(value = "id", type = IdType.ASSIGN_ID) + private Long id; + + /** + * 逻辑删除标记 + *

+ * 用于软删除功能,删除时不会真正从数据库中移除记录。 0-正常,1-已删除。保留完整的任务处理记录用于审计。 + *

+ */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + private String delFlag; + + /** + * 创建时间 + *

+ * 记录任务分配的创建时间,通常与startTime相同或接近。 自动填充,用于数据审计。 + *

+ */ + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 更新时间 + *

+ * 记录最后更新时间,在任务状态变更、审批意见填写等操作时更新。 用于跟踪任务处理的最新动态。 + *

+ */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; + +} diff --git a/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/entity/ProcessStarter.java b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/entity/ProcessStarter.java new file mode 100644 index 000000000..8b442efc2 --- /dev/null +++ b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/entity/ProcessStarter.java @@ -0,0 +1,107 @@ +package com.pig4cloud.pigx.flow.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.pig4cloud.pigx.common.core.util.TenantTable; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.time.LocalDateTime; + +/** + * 流程发起人配置实体类 + *

+ * 用于配置哪些用户或部门可以发起特定的流程。通过本实体,可以灵活控制流程的发起权限, + * 支持按用户或按部门进行权限配置。这是流程权限管理的重要组成部分,确保只有授权的 + * 人员才能发起相应的流程申请。 + *

+ *

+ * 与Process实体的关系:多个ProcessStarter可以关联到同一个Process, + * 表示该流程可以由多个用户或部门发起。通过processId字段与Process表建立关联。 + *

+ * + * @author Vincent + * @since 2023-07-06 + */ +@Getter +@Setter +@TenantTable +@Accessors(chain = true) +@TableName("process_starter") +public class ProcessStarter { + + /** + * 类型关联ID + *

+ * 根据type字段的值,此ID可能代表不同的含义: + * - 当type为"user"时:表示用户ID,对应系统用户表的用户标识 + * - 当type为"dept"时:表示部门ID,对应组织架构中的部门标识 + * 通过这种设计,可以灵活配置个人权限或部门权限。 + *

+ */ + @TableField("type_id") + private Long typeId; + + /** + * 发起人类型 + *

+ * 标识发起人的类型,支持以下值: + * - "user":表示按用户配置,typeId为具体的用户ID + * - "dept":表示按部门配置,typeId为部门ID,该部门下的所有用户都有发起权限 + * 这种设计支持精细化的权限控制和批量授权。 + *

+ */ + @TableField("type") + private String type; + + /** + * 流程ID + *

+ * 关联到Process表的主键ID,标识这个发起人配置属于哪个流程。 + * 通过此字段建立与流程定义的关联关系,一个流程可以配置多个发起人。 + *

+ */ + @TableField("process_id") + private Long processId; + + /** + * 主键ID + *

+ * 流程发起人配置的唯一标识符,采用雪花算法生成。 + *

+ */ + @TableId(value = "id", type = IdType.ASSIGN_ID) + private Long id; + + /** + * 逻辑删除标记 + *

+ * 用于软删除功能,删除时不会真正从数据库中移除记录,而是标记为已删除。 + * 0-正常,1-已删除。保留历史配置数据便于审计和恢复。 + *

+ */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + private String delFlag; + + /** + * 创建时间 + *

+ * 记录发起人配置的创建时间,自动填充。 + * 用于追踪权限配置的时间线,便于审计和问题排查。 + *

+ */ + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 更新时间 + *

+ * 记录配置的最后更新时间,在创建和更新时自动填充。 + * 用于跟踪权限配置的变更历史。 + *

+ */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/packge-info.java b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/entity/packge-info.java similarity index 58% rename from pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/packge-info.java rename to pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/entity/packge-info.java index baecb2823..ae7863b26 100644 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/packge-info.java +++ b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/entity/packge-info.java @@ -3,4 +3,4 @@ *

* 实体 存放目录 */ -package com.pig4cloud.pigx.flow.task.entity; \ No newline at end of file +package com.pig4cloud.pigx.flow.entity; \ No newline at end of file diff --git a/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/vo/FormGroupVo.java b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/vo/FormGroupVo.java new file mode 100644 index 000000000..c2442ede3 --- /dev/null +++ b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/vo/FormGroupVo.java @@ -0,0 +1,121 @@ +package com.pig4cloud.pigx.flow.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * 流程表单分组视图对象 + *

+ * 用于在流程列表页面按分组展示流程,提供流程的分类管理和展示功能。 + * 支持将多个相关流程归类到同一分组中,便于用户查找和使用。 + *

+ * + * @author : willian fu + * @date : 2020/9/21 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class FormGroupVo { + + /** + * 分组ID + *

+ * 流程分组的唯一标识符 + *

+ */ + private Long id; + + /** + * 分组名称 + *

+ * 流程分组的显示名称,如"人事管理"、"财务审批"等 + *

+ */ + private String name; + + /** + * 流程列表 + *

+ * 该分组下包含的所有流程信息 + *

+ */ + private List items; + + /** + * 流程视图对象 + *

+ * 表示单个流程的基本信息,用于在分组中展示流程列表 + *

+ */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class FlowVo { + + /** + * 流程ID + *

+ * 流程的唯一标识符 + *

+ */ + private String flowId; + + /** + * 发起范围描述 + *

+ * 描述哪些用户或角色可以发起该流程,用于前端展示 + *

+ */ + private String rangeShow; + + /** + * 流程名称 + *

+ * 流程的显示名称,如"请假申请"、"报销申请"等 + *

+ */ + private String name; + + /** + * 流程图标 + *

+ * 流程的图标标识,用于在列表中展示 + *

+ */ + private String logo; + + /** + * 停用标识 + *

+ * 标识流程是否已停用,"1"表示已停用,其他表示正常 + *

+ */ + private String stop; + + /** + * 流程备注 + *

+ * 流程的详细说明或使用说明 + *

+ */ + private String remark; + + /** + * 更新时间 + *

+ * 流程最后更新的时间戳 + *

+ */ + private LocalDateTime updated; + + } + +} diff --git a/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/vo/FormItemVO.java b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/vo/FormItemVO.java new file mode 100644 index 000000000..160b86ffc --- /dev/null +++ b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/vo/FormItemVO.java @@ -0,0 +1,240 @@ +package com.pig4cloud.pigx.flow.vo; + +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.FieldNameConstants; + +/** + * 表单项视图对象 + *

+ * 用于定义流程表单中的各种表单项配置,包括输入框、选择框、日期选择器等各种表单控件。 + * 支持动态表单的构建和渲染,提供丰富的表单项属性配置。 + *

+ */ +@Data +@NoArgsConstructor +@FieldNameConstants +public class FormItemVO { + + /** + * 表单项ID + *

+ * 表单项的唯一标识符,用于表单数据的提交和绑定 + *

+ */ + private String id; + + /** + * 权限标识 + *

+ * 表单项的权限控制标识,如"write"(可写)、"read"(只读)、"hidden"(隐藏) + *

+ */ + private String perm; + + /** + * 表单项图标 + *

+ * 表单项的图标类名,用于在界面上展示对应的图标 + *

+ */ + private String icon; + + /** + * 表单项名称 + *

+ * 表单项的显示名称,如"姓名"、"部门"、"金额"等 + *

+ */ + private String name; + + /** + * 表单项类型 + *

+ * 表单项的控件类型,如"input"(输入框)、"select"(选择框)、"date"(日期选择)等 + *

+ */ + private String type; + + /** + * 是否必填 + *

+ * 标识该表单项是否为必填项,true表示必填,false表示选填 + *

+ */ + private Boolean required; + + /** + * 类型名称 + *

+ * 表单项类型的中文名称,用于前端展示 + *

+ */ + private String typeName; + + /** + * 占位提示文本 + *

+ * 表单项的输入提示信息,显示在输入框内 + *

+ */ + private String placeholder; + + /** + * 表单项属性配置 + *

+ * 包含表单项的各种扩展属性配置 + *

+ */ + private Props props = new Props(); + + /** + * 表单项属性配置对象 + *

+ * 封装了表单项的各种属性配置,支持不同类型表单项的特定属性 + *

+ */ + @Data + @NoArgsConstructor + @FieldNameConstants + public static class Props { + + /** + * 表单项默认值 + *

+ * 表单项的默认值,可以是字符串、数字、数组等类型 + *

+ */ + private Object value; + + /** + * 字典值 + *

+ * 当表单项类型为选择框时,指定使用的数据字典 + *

+ */ + private Object dictValue; + + /** + * 选项列表 + *

+ * 选择类表单项的选项数据,通常为数组格式 + *

+ */ + private Object options; + + /** + * 是否自定义 + *

+ * 标识是否允许用户自定义输入,通常用于选择框支持自定义选项 + *

+ */ + private Boolean self; + + /** + * 是否多选 + *

+ * 标识选择类表单项是否支持多选 + *

+ */ + private Boolean multi; + + /** + * 原始表单配置 + *

+ * 保存原始的表单配置信息,用于表单的动态生成 + *

+ */ + private Object oriForm; + + /** + * 最大长度 + *

+ * 输入类表单项的最大输入长度限制 + *

+ */ + private Object maxLength; + + /** + * 最小长度 + *

+ * 输入类表单项的最小输入长度限制 + *

+ */ + private Object minLength; + + /** + * 正则表达式 + *

+ * 用于输入验证的正则表达式 + *

+ */ + private Object regex; + + /** + * 正则验证说明 + *

+ * 正则表达式验证失败时的提示信息 + *

+ */ + private Object regexDesc; + + /** + * 前缀文本 + *

+ * 显示在输入框前的文本,如货币符号"¥" + *

+ */ + private String prefix; + + /** + * 最小值 + *

+ * 数字类表单项的最小值限制 + *

+ */ + private Long min; + + /** + * 最大值 + *

+ * 数字类表单项的最大值限制 + *

+ */ + private Long max; + + /** + * 单位 + *

+ * 数字类表单项的单位,如"元"、"天"等 + *

+ */ + private String unit; + + /** + * 小数位数 + *

+ * 数字类表单项允许的小数位数 + *

+ */ + private Integer radixNum; + + /** + * 最大文件大小 + *

+ * 文件上传类表单项的文件大小限制,单位为MB + *

+ */ + private Integer maxSize; + + /** + * 允许的文件后缀 + *

+ * 文件上传类表单项允许的文件类型后缀数组,如["jpg", "png", "pdf"] + *

+ */ + private String[] suffixArray; + + } + +} diff --git a/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/vo/NodeFormatParamVo.java b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/vo/NodeFormatParamVo.java new file mode 100644 index 000000000..92683616e --- /dev/null +++ b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/vo/NodeFormatParamVo.java @@ -0,0 +1,50 @@ +package com.pig4cloud.pigx.flow.vo; + +import lombok.Data; + +import java.util.Map; + +/** + * 节点格式化参数视图对象 + *

+ * 用于传递流程节点格式化所需的参数信息,包含流程实例、任务和动态参数等信息。 + * 主要用于节点展示时的数据格式化和条件判断。 + *

+ */ +@Data +public class NodeFormatParamVo { + + /** + * 流程ID + *

+ * 流程定义的唯一标识符 + *

+ */ + private String flowId; + + /** + * 流程实例ID + *

+ * 流程实例的唯一标识符,用于定位具体的流程实例 + *

+ */ + private String processInstanceId; + + /** + * 任务ID + *

+ * 当前任务的唯一标识符,用于定位具体的待办任务 + *

+ */ + private String taskId; + + /** + * 参数映射表 + *

+ * 包含节点格式化所需的动态参数,key为参数名,value为参数值。 + * 可用于条件判断、动态展示等场景。 + *

+ */ + private Map paramMap; + +} diff --git a/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/vo/NodeVo.java b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/vo/NodeVo.java new file mode 100644 index 000000000..c37f47289 --- /dev/null +++ b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/vo/NodeVo.java @@ -0,0 +1,98 @@ +package com.pig4cloud.pigx.flow.vo; + +import lombok.Data; + +import java.util.List; + +/** + * 流程节点显示视图对象 + *

+ * 用于在前端展示流程节点的详细信息,包括节点的基本属性、审批人员、状态等。 + * 支持树形结构和分支结构的节点展示,可用于流程图的渲染和流程进度的追踪。 + *

+ */ +@Data +public class NodeVo { + + /** + * 节点ID + *

+ * 流程节点的唯一标识符,对应流程定义中的节点ID + *

+ */ + private String id; + + /** + * 节点审批人列表 + *

+ * 该节点的审批人员信息列表,包含已审批和待审批的人员 + *

+ */ + private List userVoList; + + /** + * 节点占位提示 + *

+ * 用于在节点上显示的提示信息,如"请选择审批人"等 + *

+ */ + private String placeholder; + + /** + * 节点状态 + *

+ * 节点的执行状态:1-进行中,2-已完成 + *

+ */ + private Integer status; + + /** + * 节点名称 + *

+ * 节点的显示名称,如"部门经理审批"、"财务审核"等 + *

+ */ + private String name; + + /** + * 节点类型 + *

+ * 节点的类型标识,如"审批节点"、"抄送节点"、"条件节点"等。 + * 使用Object类型以支持不同的类型表示方式 + *

+ */ + private Object type; + + /** + * 是否需要发起人选择审批人 + *

+ * 标识该节点是否需要流程发起人指定审批人员 + *

+ */ + private Boolean selectUser; + + /** + * 是否支持多选 + *

+ * 当需要选择审批人时,标识是否允许选择多个审批人 + *

+ */ + private Boolean multiple; + + /** + * 子节点列表 + *

+ * 该节点的直接子节点列表,用于构建节点的树形结构 + *

+ */ + private List children; + + /** + * 分支节点列表 + *

+ * 条件分支或并行分支的节点列表,用于表示分支流程 + *

+ */ + private List branch; + +} diff --git a/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/vo/ProcessCopyVo.java b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/vo/ProcessCopyVo.java new file mode 100644 index 000000000..4687aef92 --- /dev/null +++ b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/vo/ProcessCopyVo.java @@ -0,0 +1,25 @@ +package com.pig4cloud.pigx.flow.vo; + +import com.pig4cloud.pigx.flow.entity.ProcessCopy; +import lombok.Data; + +/** + * 流程抄送视图对象 + *

+ * 继承自ProcessCopy实体类,用于展示流程抄送信息时的扩展字段。 + * 主要用于抄送列表的展示,包含抄送的基本信息和扩展的显示信息。 + *

+ */ +@Data +public class ProcessCopyVo extends ProcessCopy { + + /** + * 发起人姓名 + *

+ * 流程发起人的姓名,用于在抄送列表中显示流程是由谁发起的。 + * 该字段是对基础实体的扩展,便于前端直接展示发起人信息。 + *

+ */ + private String startUserName; + +} diff --git a/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/vo/ProcessVO.java b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/vo/ProcessVO.java new file mode 100644 index 000000000..567e53678 --- /dev/null +++ b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/vo/ProcessVO.java @@ -0,0 +1,47 @@ +package com.pig4cloud.pigx.flow.vo; + +import com.pig4cloud.pigx.flow.entity.Process; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * 流程视图对象 + *

+ * 继承自Process实体类,用于流程发起和展示时的扩展信息。 + * 包含了流程发起时需要的额外配置信息,如需要选择审批人的节点、流程变量、表单权限等。 + *

+ */ +@Data +public class ProcessVO extends Process { + + /** + * 需要发起人选择审批人的节点ID列表 + *

+ * 包含所有需要流程发起人指定审批人的节点ID。 + * 在流程发起时,前端需要根据这个列表展示审批人选择界面。 + *

+ */ + private List selectUserNodeId; + + /** + * 流程变量映射表 + *

+ * 包含流程运行时的变量信息,key为变量名,value为变量值。 + * 这些变量可用于流程条件判断、表单数据传递等场景。 + *

+ */ + private Map variableMap; + + /** + * 发起人节点的表单权限配置 + *

+ * 定义了发起人在填写表单时各个字段的权限。 + * key为表单字段ID,value为权限标识(如"write"、"read"、"hidden")。 + * 用于控制发起人对表单字段的操作权限。 + *

+ */ + private Map formPerms; + +} diff --git a/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/vo/UserVo.java b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/vo/UserVo.java new file mode 100644 index 000000000..949e40a20 --- /dev/null +++ b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/vo/UserVo.java @@ -0,0 +1,79 @@ +package com.pig4cloud.pigx.flow.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +/** + * 用户视图对象 + *

+ * 用于在流程处理过程中展示用户信息,包括审批人、抄送人等角色的信息展示。 + * 主要用于流程节点的用户列表、审批记录等场景。 + *

+ */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UserVo { + + /** + * 用户ID + *

+ * 用户的唯一标识符 + *

+ */ + private Long id; + + /** + * 用户姓名 + *

+ * 用户的显示名称,通常为真实姓名 + *

+ */ + private String name; + + /** + * 操作时间 + *

+ * 用户执行操作的时间,如审批时间、查看时间等 + *

+ */ + private LocalDateTime showTime; + + /** + * 用户头像 + *

+ * 用户头像的URL地址,用于在界面上展示用户头像 + *

+ */ + private String avatar; + + /** + * 审批意见 + *

+ * 用户在审批时填写的意见或备注信息 + *

+ */ + private String approveDesc; + + /** + * 操作类型 + *

+ * 用户执行的操作类型,如"同意"、"拒绝"、"转办"、"加签"等 + *

+ */ + private String operType; + + /** + * 处理状态 + *

+ * 用户的处理状态:0-待处理,1-处理中,2-已完成。默认为0 + *

+ */ + private Integer status = 0; + +} diff --git a/pigx-flow/pigx-flow-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports b/pigx-flow/pigx-flow-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports new file mode 100644 index 000000000..ef5e7f745 --- /dev/null +++ b/pigx-flow/pigx-flow-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports @@ -0,0 +1 @@ +com.pig4cloud.pigx.flow.api.feign.RemoteFlowApiFlowService \ No newline at end of file diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/Dockerfile b/pigx-flow/pigx-flow-biz/Dockerfile similarity index 66% rename from pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/Dockerfile rename to pigx-flow/pigx-flow-biz/Dockerfile index 6e9e72fda..7b4992f2d 100644 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/Dockerfile +++ b/pigx-flow/pigx-flow-biz/Dockerfile @@ -8,12 +8,12 @@ ENV JAVA_OPTS="-Xms512m -Xmx1024m -Djava.security.egd=file:/dev/./urandom" RUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone -RUN mkdir -p /pigx-flow-engine +RUN mkdir -p /pigx-flow -WORKDIR /pigx-flow-engine +WORKDIR /pigx-flow EXPOSE 9020 -ADD ./target/pigx-flow-engine-biz.jar ./ +ADD ./target/pigx-flow-biz.jar ./ -CMD sleep 60;java $JAVA_OPTS -jar pigx-flow-engine-biz.jar +CMD sleep 60;java $JAVA_OPTS -jar pigx-flow-biz.jar diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/pom.xml b/pigx-flow/pigx-flow-biz/pom.xml similarity index 92% rename from pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/pom.xml rename to pigx-flow/pigx-flow-biz/pom.xml index e09efc93c..3f1dbeef3 100644 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/pom.xml +++ b/pigx-flow/pigx-flow-biz/pom.xml @@ -6,34 +6,13 @@ 4.0.0 com.pig4cloud - pigx-flow-engine - 5.9.0 + pigx-flow + 5.10.2-SNAPSHOT - pigx-flow-engine-biz + pigx-flow-biz - - - org.flowable - flowable-bpmn-layout - ${flowable.version} - - - org.flowable - flowable-spring-boot-starter-process - ${flowable.version} - - - - com.pig4cloud - pigx-flow-task-api - - - - com.googlecode.aviator - aviator - org.springframework.boot @@ -59,6 +38,37 @@ com.pig4cloud pigx-common-data + + + com.pig4cloud + pigx-common-sequence + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-process + ${flowable.version} + + + mybatis + org.mybatis + + + + + + com.googlecode.aviator + aviator + + + cn.hutool + hutool-cache + com.pig4cloud @@ -74,11 +84,6 @@ com.pig4cloud pigx-common-sentinel - - - com.pig4cloud - pigx-common-encrypt-api - com.pig4cloud @@ -87,13 +92,18 @@ com.pig4cloud - pigx-flow-engine-api + pigx-flow-api com.pig4cloud pigx-common-log + + + com.pig4cloud + pigx-common-encrypt-api + com.baomidou @@ -114,10 +124,6 @@ com.pig4cloud pigx-common-swagger - - cn.hutool - hutool-cache - org.springframework.boot diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/PigxFlowApplication.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/PigxFlowApplication.java new file mode 100644 index 000000000..9c223233c --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/PigxFlowApplication.java @@ -0,0 +1,48 @@ +package com.pig4cloud.pigx.flow; + +import com.pig4cloud.pigx.common.feign.annotation.EnablePigxFeignClients; +import com.pig4cloud.pigx.common.security.annotation.EnablePigxResourceServer; +import com.pig4cloud.pigx.common.swagger.annotation.EnableOpenApi; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; + +/** + * 流程引擎服务启动类 + *

+ * PigX流程引擎微服务的主入口,基于Flowable工作流引擎构建。 + * 提供完整的工作流管理功能,包括流程定义、流程实例管理、任务处理等。 + * 主要特性: + * - 集成Flowable BPMN 2.0流程引擎 + * - 支持动态表单和流程配置 + * - 提供RESTful API接口 + * - 支持多租户隔离 + * - 集成Spring Cloud微服务架构 + *

+ * + * @author pigx archetype + */ +@EnableOpenApi("task") +@EnablePigxFeignClients +@EnableDiscoveryClient +@EnablePigxResourceServer +@SpringBootApplication +public class PigxFlowApplication { + + /** + * 流程引擎服务主方法 + *

+ * 启动Spring Boot应用,初始化流程引擎相关组件: + * - 初始化Flowable流程引擎 + * - 注册到服务发现中心 + * - 启用OAuth2资源服务器保护 + * - 开启Swagger API文档 + *

+ * + * @param args 命令行参数 + */ + public static void main(String[] args) { + SpringApplication.run(PigxFlowApplication.class, args); + } + +} \ No newline at end of file diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/config/SequenceConfiguration.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/config/SequenceConfiguration.java new file mode 100644 index 000000000..9c89945c0 --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/config/SequenceConfiguration.java @@ -0,0 +1,57 @@ +package com.pig4cloud.pigx.flow.config; + +import cn.hutool.core.date.DateUtil; +import com.pig4cloud.pigx.common.data.tenant.TenantContextHolder; +import com.pig4cloud.pigx.common.sequence.builder.DbSeqBuilder; +import com.pig4cloud.pigx.common.sequence.properties.BaseSequenceProperties; +import com.pig4cloud.pigx.common.sequence.sequence.Sequence; +import org.flowable.spring.SpringProcessEngineConfiguration; +import org.flowable.spring.boot.EngineConfigurationConfigurer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import javax.sql.DataSource; + +/** + * 流程序列号生成器配置类 + *

+ * 配置流程模块专用的序列号生成器,用于生成各种业务编号。 支持多租户隔离,每个租户的序列号独立生成。 序列号格式:flow_租户ID_日期_序号,保证全局唯一性。 主要用于: + * - 流程实例编号生成 - 任务编号生成 - 其他需要唯一标识的业务场景 + *

+ * + * @author lengleng + * @date 2023-07-19 + */ +@Configuration +public class SequenceConfiguration { + + /** + * 创建流程模块专用的序列号生成器 + *

+ * 基于数据库实现的分布式序列号生成器,特点: - 支持分布式环境下的并发生成 - 按租户和日期分段,避免序号过长 - 支持配置步长,提高生成性能 - + * 失败重试机制,保证可靠性 + *

+ * @param dataSource 数据源,用于访问序列号表 + * @param properties 序列号配置属性,包含步长、重试次数等 + * @return 配置好的序列号生成器实例 + */ + @Bean + public Sequence flowSequence(DataSource dataSource, BaseSequenceProperties properties) { + return DbSeqBuilder.create() + .bizName(() -> String.format("flow_%s_%s", TenantContextHolder.getTenantId(), DateUtil.today())) + .dataSource(dataSource) + .step(properties.getStep()) + .retryTimes(properties.getDb().getRetryTimes()) + .tableName(properties.getDb().getTableName()) + .build(); + } + + @Bean + public EngineConfigurationConfigurer configurer() { + return engineConfiguration -> { + engineConfiguration.setEnableDatabaseEventLogging(true); + engineConfiguration.setEnableVerboseExecutionTreeLogging(true); + }; + } + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/BpmOaLeaveController.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/controller/BpmOaLeaveController.java similarity index 100% rename from pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/BpmOaLeaveController.java rename to pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/controller/BpmOaLeaveController.java diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/controller/ProcessCombinationController.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/controller/ProcessCombinationController.java new file mode 100644 index 000000000..547d77970 --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/controller/ProcessCombinationController.java @@ -0,0 +1,56 @@ +package com.pig4cloud.pigx.flow.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.service.ICombinationGroupService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 流程组聚合控制器 + *

+ * 该控制器负责处理流程组的聚合查询操作,主要功能包括: 1. 查询流程组及其包含的流程列表 2. 查询当前用户有权限发起的流程组 + *

+ *

+ * 流程组是对多个相关流程的逻辑分组,便于用户快速找到和发起相关流程。 通过该控制器,前端可以展示流程分组导航,提升用户体验。 + *

+ * + * @author pigx + * @since 2023 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/combination/group") +public class ProcessCombinationController { + + private final ICombinationGroupService combinationGroupService; + + /** + * 分页查询流程组及其包含的流程列表 + *

+ * 该接口用于获取指定流程组的详细信息,包括组内的所有流程定义。 支持分页查询,适用于流程较多的场景。 + *

+ * @param page 分页参数对象,包含当前页码、每页大小等信息 + * @param groupId 流程组ID,用于查询特定组的流程;如果为空则查询所有组 + * @return R 统一响应对象,包含分页后的流程组及流程列表数据 + */ + @GetMapping("listGroupWithProcess") + public R listGroupWithProcess(Page page, Long groupId) { + return combinationGroupService.listGroupWithProcess(page, groupId); + } + + /** + * 查询当前登录用户可以发起的所有流程组 + *

+ * 该接口根据当前用户的权限,返回其有权限发起流程的所有流程组。 用于在流程发起页面展示用户可用的流程分组,实现权限控制。 + *

+ * @return R 统一响应对象,包含当前用户可发起的流程组列表 + */ + @GetMapping("listCurrentUserStartGroup") + public R listCurrentUserStartGroup() { + return combinationGroupService.listCurrentUserStartGroup(); + } + +} diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/controller/ProcessController.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/controller/ProcessController.java new file mode 100644 index 000000000..a4c3d6c14 --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/controller/ProcessController.java @@ -0,0 +1,81 @@ +package com.pig4cloud.pigx.flow.controller; + +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.entity.Process; +import com.pig4cloud.pigx.flow.service.IProcessService; +import com.pig4cloud.pigx.flow.vo.ProcessVO; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +/** + * 流程定义控制器 + *

+ * 提供流程定义相关的REST API接口,包括流程的创建、查询、更新等操作。 + * 所有接口都需要用户认证,并根据用户权限进行访问控制。 + *

+ * + * @author pigx + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/process") +public class ProcessController { + + private final IProcessService processService; + + /** + * 获取流程详细信息 + *

+ * 根据流程ID获取流程的完整配置信息,包括: + * - 基本信息(名称、图标、描述等) + * - 表单配置(表单项定义、验证规则等) + * - 流程配置(节点定义、流转规则等) + * - 权限配置(管理员、发起人范围等) + *

+ * + * @param flowId 流程定义ID + * @return 流程详细信息 + */ + @GetMapping("getDetail") + public R getDetail(String flowId) { + return processService.getDetail(flowId); + } + + /** + * 创建新流程定义 + *

+ * 创建新的流程定义,需要提供流程基本信息。 + * 系统会自动生成流程的唯一标识(flowId)和默认配置。 + * 创建者自动成为该流程的管理员。 + *

+ * + * @param process 流程定义实体(包含名称、分组、图标等信息) + * @return 创建结果,成功时返回生成的flowId + */ + @PostMapping("create") + public R create(@RequestBody Process process) { + return processService.create(process); + } + + /** + * 更新流程状态或分组 + *

+ * 支持以下操作: + * - stop: 停用流程(停用后不能创建新实例,但已有实例可继续执行) + * - using: 启用流程(恢复流程的正常使用) + * - delete: 删除流程(逻辑删除,可恢复) + * - 修改分组:传入groupId参数可将流程移动到其他分组 + *

+ * + * @param flowId 流程定义ID + * @param type 操作类型(stop/using/delete) + * @param groupId 流程分组ID(可选,用于修改流程所属分组) + * @return 操作结果 + */ + @PutMapping("update/{flowId}") + public R update(@PathVariable String flowId, @RequestParam String type, + @RequestParam(required = false) Long groupId) { + return processService.update(flowId, type, groupId); + } + +} diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/controller/ProcessCopyController.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/controller/ProcessCopyController.java new file mode 100644 index 000000000..12c9f8d62 --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/controller/ProcessCopyController.java @@ -0,0 +1,49 @@ +package com.pig4cloud.pigx.flow.controller; + +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.service.IProcessCopyService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 流程抄送控制器 + *

+ * 该控制器负责管理流程抄送功能,处理抄送相关的查询操作。 + * 流程抄送是工作流中的重要功能,允许将流程执行情况通知给相关人员, + * 这些人员无需参与审批,但需要了解流程进展。 + *

+ *

+ * 主要应用场景: + * 1. 领导知晓 - 将重要流程的执行情况抄送给相关领导 + * 2. 部门协同 - 将跨部门流程抄送给相关部门负责人 + * 3. 信息共享 - 将流程信息共享给利益相关者 + *

+ * + * @author Vincent + * @since 2023-05-20 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/processCopy") +public class ProcessCopyController { + + private final IProcessCopyService processCopyService; + + /** + * 查询单个抄送记录的详细信息 + *

+ * 获取指定抄送记录的完整信息,包括抄送的流程信息、抄送时间、 + * 抄送人、被抄送人等详细数据。用于在抄送列表中查看具体抄送内容。 + *

+ * + * @param id 抄送记录ID + * @return R 统一响应对象,包含抄送记录的详细信息 + */ + @GetMapping("querySingleDetail") + public R querySingleDetail(long id) { + return processCopyService.querySingleDetail(id); + } + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/ProcessGroupController.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/controller/ProcessGroupController.java similarity index 61% rename from pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/ProcessGroupController.java rename to pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/controller/ProcessGroupController.java index 70e0a878f..eba60d47b 100644 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/ProcessGroupController.java +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/controller/ProcessGroupController.java @@ -1,13 +1,19 @@ -package com.pig4cloud.pigx.flow.task.controller; +package com.pig4cloud.pigx.flow.controller; import com.pig4cloud.pigx.common.core.util.R; -import com.pig4cloud.pigx.flow.task.entity.ProcessGroup; -import com.pig4cloud.pigx.flow.task.service.IProcessGroupService; +import com.pig4cloud.pigx.flow.entity.ProcessGroup; +import com.pig4cloud.pigx.flow.service.IProcessGroupService; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; import java.util.List; +/** + * 流程分组控制器:提供流程分组的增删查等操作 + * + * @author lengleng + * @date 2025/07/14 + */ @RestController @RequiredArgsConstructor @RequestMapping("processGroup") @@ -16,8 +22,8 @@ public class ProcessGroupController { private final IProcessGroupService processGroupService; /** - * 组列表 - * @return + * 查询流程组列表 + * @return 流程组列表 */ @GetMapping("list") public R> queryList() { @@ -25,9 +31,9 @@ public class ProcessGroupController { } /** - * 新增流程分组 - * @param processGroup 分组名 - * @return 添加结果 + * 创建流程分组 + * @param processGroup 流程分组实体对象 + * @return 操作结果 */ @PostMapping("create") public R create(@RequestBody ProcessGroup processGroup) { @@ -36,8 +42,8 @@ public class ProcessGroupController { /** * 删除分组 - * @param id - * @return + * @param id 分组ID + * @return 操作结果 */ @DeleteMapping("delete/{id}") public R delete(@PathVariable long id) { diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/controller/ProcessInstanceController.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/controller/ProcessInstanceController.java new file mode 100644 index 000000000..5ca29bbd4 --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/controller/ProcessInstanceController.java @@ -0,0 +1,169 @@ +package com.pig4cloud.pigx.flow.controller; + +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.dto.ProcessInstanceParamDto; +import com.pig4cloud.pigx.flow.dto.TaskQueryParamDto; +import com.pig4cloud.pigx.flow.service.IProcessInstanceService; +import com.pig4cloud.pigx.flow.vo.NodeFormatParamVo; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import org.springframework.web.bind.annotation.*; + +/** + * 流程实例管理控制器 + *

+ * 该控制器提供流程实例的全生命周期管理功能,是工作流系统的核心业务接口。 + * 主要功能包括: + * 1. 流程启动 - 根据流程定义创建新的流程实例 + * 2. 任务查询 - 查询待办、已办、我发起的、抄送给我的任务 + * 3. 流程监控 - 查看流程实例详情和执行状态 + * 4. 流程展示 - 格式化展示流程节点和执行路径 + *

+ *

+ * 与EngineFlowController不同,该控制器提供的是面向业务的高级接口, + * 包含了业务逻辑处理、权限控制、数据格式化等功能。 + *

+ * + * @author pigx + * @since 2023 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/process-instance") +public class ProcessInstanceController { + + private final IProcessInstanceService processInstanceService; + + /** + * 启动新的流程实例 + *

+ * 根据流程定义启动一个新的流程实例。该接口会: + * 1. 验证用户是否有启动该流程的权限 + * 2. 创建流程实例记录并保存表单数据 + * 3. 根据流程配置分配第一个任务节点 + * 4. 处理流程抄送和通知 + *

+ * + * @param processInstanceParamDto 流程启动参数,包含: + * - processId: 流程定义ID + * - formData: 表单数据 + * - startUserId: 发起人用户ID + * - copyUserList: 抄送人员列表 + * @return R 统一响应对象,成功返回流程实例ID + */ + @SneakyThrows + @PostMapping("startProcessInstance") + public R startProcessInstance(@RequestBody ProcessInstanceParamDto processInstanceParamDto) { + return processInstanceService.startProcessInstance(processInstanceParamDto); + } + + /** + * 分页查询当前用户的待办任务 + *

+ * 查询分配给当前登录用户的所有待处理任务。支持按流程名称、 + * 创建时间等条件过滤。返回的数据包含任务信息和关联的表单数据。 + *

+ * + * @param queryParamDto 查询参数,包含: + * - processName: 流程名称(可选) + * - taskTime: 任务创建时间范围(可选) + * - current: 当前页码 + * - size: 每页大小 + * @return R 统一响应对象,包含分页的待办任务列表 + */ + @SneakyThrows + @PostMapping("queryMineTask") + public R queryMineTask(@RequestBody TaskQueryParamDto queryParamDto) { + return processInstanceService.queryMineTask(queryParamDto); + } + + /** + * 分页查询当前登录用户的已办任务 + *

+ * 查询当前用户已经完成处理的历史任务。包括审批通过、拒绝、 + * 转办等各种已完成状态的任务。返回数据包含任务处理结果和处理时间。 + *

+ * + * @param taskQueryParamDto 查询参数,支持按流程名称、完成时间等条件过滤 + * @return R 统一响应对象,包含分页的已办任务列表 + */ + @SneakyThrows + @PostMapping("queryMineEndTask") + public R queryMineEndTask(@RequestBody TaskQueryParamDto taskQueryParamDto) { + return processInstanceService.queryMineEndTask(taskQueryParamDto); + } + + /** + * 分页查询我发起的流程 + *

+ * 查询当前用户作为发起人创建的所有流程实例。 + * 包括运行中、已完成、已终止等各种状态的流程。 + * 用户可以查看自己发起流程的执行进度和当前状态。 + *

+ * + * @param taskQueryParamDto 查询参数,支持按流程名称、发起时间等条件过滤 + * @return R 统一响应对象,包含分页的流程实例列表 + */ + @SneakyThrows + @PostMapping("queryMineStarted") + public R queryMineStarted(@RequestBody TaskQueryParamDto taskQueryParamDto) { + return processInstanceService.queryMineStarted(taskQueryParamDto); + } + + /** + * 分页查询抄送给我的流程 + *

+ * 查询抄送给当前用户的流程信息。抄送是流程中的通知机制, + * 被抄送人只需了解流程进展,无需处理任务。 + * 通常用于让相关人员知晓重要流程的执行情况。 + *

+ * + * @param taskQueryParamDto 查询参数,支持按流程名称、抄送时间等条件过滤 + * @return R 统一响应对象,包含分页的抄送记录列表 + */ + @SneakyThrows + @PostMapping("queryMineCC") + public R queryMineCC(@RequestBody TaskQueryParamDto taskQueryParamDto) { + return processInstanceService.queryMineCC(taskQueryParamDto); + } + + /** + * 格式化显示流程节点 + *

+ * 根据流程定义和表单数据,格式化显示流程节点信息。 + * 该接口主要用于流程发起页面,根据表单数据动态计算并展示: + * 1. 各节点的审批人员 + * 2. 条件分支的走向 + * 3. 抄送人员列表 + * 帮助用户在发起流程前预览流程走向。 + *

+ * + * @param nodeFormatParamVo 节点格式化参数,包含: + * - processId: 流程定义ID + * - formData: 表单数据 + * @return R 统一响应对象,包含格式化后的节点显示信息 + */ + @PostMapping("formatStartNodeShow") + public R formatStartNodeShow(@RequestBody NodeFormatParamVo nodeFormatParamVo) { + return processInstanceService.formatStartNodeShow(nodeFormatParamVo); + } + + /** + * 查询流程实例详情 + *

+ * 获取指定流程实例的完整信息,包括: + * 1. 流程基本信息 - 发起人、发起时间、当前状态等 + * 2. 表单数据 - 流程关联的业务表单数据 + * 3. 执行历史 - 各节点的审批记录、处理人、处理意见等 + * 4. 流程图 - 当前执行节点和路径高亮显示 + *

+ * + * @param processInstanceId 流程实例ID + * @return R 统一响应对象,包含流程实例的完整详情 + */ + @GetMapping("detail") + public R detail(String processInstanceId) { + return processInstanceService.detail(processInstanceId); + } + +} diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/controller/ProcessNodeDataController.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/controller/ProcessNodeDataController.java new file mode 100644 index 000000000..0cb1752b4 --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/controller/ProcessNodeDataController.java @@ -0,0 +1,70 @@ +package com.pig4cloud.pigx.flow.controller; + +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.dto.Node; +import com.pig4cloud.pigx.flow.dto.ProcessNodeDataDto; +import com.pig4cloud.pigx.flow.service.IProcessNodeDataService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +/** + * 流程节点数据管理控制器 + *

+ * 该控制器负责管理流程节点的配置数据,包括节点的保存和查询操作。 + * 流程节点数据是流程定义的核心组成部分,定义了每个节点的属性、 + * 审批人员、条件规则、表单权限等关键信息。 + *

+ *

+ * 节点数据的主要内容: + * 1. 节点基本信息 - 节点类型、名称、描述等 + * 2. 人员配置 - 审批人、抄送人的分配规则 + * 3. 条件配置 - 分支条件、跳转规则等 + * 4. 表单权限 - 节点对表单字段的查看、编辑权限 + *

+ * + * @author Vincent + * @since 2023-05-07 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/processNodeData") +public class ProcessNodeDataController { + + private final IProcessNodeDataService processNodeDataService; + + /** + * 保存或更新流程节点数据 + *

+ * 保存流程中某个节点的配置信息。如果节点已存在则更新, + * 不存在则新增。该接口通常在流程设计器中保存节点配置时调用。 + *

+ * + * @param processNodeDataDto 节点数据对象,包含: + * - flowId: 流程定义ID + * - nodeId: 节点ID + * - nodeData: 节点配置数据(JSON格式) + * @return R 统一响应对象,保存成功返回节点数据ID + */ + @PostMapping("saveNodeData") + public R saveNodeData(@RequestBody ProcessNodeDataDto processNodeDataDto) { + return processNodeDataService.saveNodeData(processNodeDataDto); + } + + /** + * 获取指定节点的配置数据 + *

+ * 查询流程中特定节点的详细配置信息。返回的数据包含节点的 + * 所有配置项,如审批人规则、条件设置、表单权限等。 + * 主要用于流程设计器加载节点配置或流程执行时获取节点规则。 + *

+ * + * @param flowId 流程定义ID + * @param nodeId 节点ID + * @return R 统一响应对象,包含节点的完整配置信息 + */ + @GetMapping("getNodeData") + public R getNodeData(String flowId, String nodeId) { + return processNodeDataService.getNodeData(flowId, nodeId); + } + +} diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/controller/ProcessRemoteController.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/controller/ProcessRemoteController.java new file mode 100644 index 000000000..4724d4bd6 --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/controller/ProcessRemoteController.java @@ -0,0 +1,201 @@ +package com.pig4cloud.pigx.flow.controller; + +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.dto.*; +import com.pig4cloud.pigx.flow.service.IRemoteService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +/** + * 远程服务调用控制器 + *

+ * 该控制器作为流程模块的内部接口,主要供其他模块调用或流程引擎内部使用。 提供了一系列辅助功能接口,包括: 1. 用户和组织查询 - 根据角色、部门查询用户 2. 流程事件处理 + * - 节点开始/结束、任务分配等事件 3. 抄送管理 - 保存流程抄送记录 4. 权限验证 - 检查用户组织关系 + *

+ *

+ * 这些接口通常在流程执行过程中被引擎自动调用, 用于完成流程的各种业务逻辑。 + *

+ * + * @author pigx + * @since 2023 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/remote") +public class ProcessRemoteController { + + private final IRemoteService remoteService; + + /** + * 根据角色ID列表查询用户ID列表 + *

+ * 查询拥有指定角色的所有用户ID。该接口主要用于流程节点配置中 按角色分配任务时,获取对应角色下的所有用户。 + *

+ * @param roleIdList 角色ID列表 + * @return R> 统一响应对象,包含用户ID列表 + */ + @PostMapping("queryUserIdListByRoleIdList") + public R> queryUserIdListByRoleIdList(@RequestBody List roleIdList) { + return remoteService.queryUserIdListByRoleIdList(roleIdList); + } + + /** + * 保存流程抄送记录 + *

+ * 在流程执行过程中,当节点配置了抄送人时, 调用此接口保存抄送记录。被抄送人可以在抄送列表中查看流程信息。 + *

+ * @param copyDto 抄送数据对象,包含流程实例ID、抄送人、被抄送人等信息 + * @return R 统一响应对象 + */ + @PostMapping("savecc") + public R saveCC(@RequestBody ProcessCopyDto copyDto) { + return remoteService.saveCC(copyDto); + } + + /** + * 检查是否为所有父级部门 + *

+ * 验证指定部门是否包含了某些部门的所有父级部门。 用于流程中按部门层级分配任务时的权限验证。 + *

+ * @param checkParentDto 检查参数,包含需要验证的部门信息 + * @return R 统一响应对象,true-是所有父级,false-不是 + */ + @PostMapping("checkIsAllParent") + public R checkIsAllParent(@RequestBody CheckParentDto checkParentDto) { + return remoteService.checkIsAllParent(checkParentDto); + } + + /** + * 根据部门ID列表查询用户ID列表 + *

+ * 查询指定部门下的所有用户ID。该接口主要用于流程节点配置中 按部门分配任务时,获取对应部门下的所有用户。 + *

+ * @param depIdList 部门ID列表 + * @return R> 统一响应对象,包含用户ID列表 + */ + @PostMapping("queryUserIdListByDepIdList") + public R> queryUserIdListByDepIdList(@RequestBody List depIdList) { + return remoteService.queryUserIdListByDepIdList(depIdList); + } + + /** + * 检查是否为所有子级部门 + *

+ * 验证指定部门是否包含了某些部门的所有子级部门。 用于流程中按部门层级分配任务时的权限验证。 + *

+ * @param checkChildDto 检查参数,包含需要验证的部门信息 + * @return R 统一响应对象,true-是所有子级,false-不是 + */ + @PostMapping("checkIsAllChild") + public R checkIsAllChild(@RequestBody CheckChildDto checkChildDto) { + return remoteService.checkIsAllChild(checkChildDto); + } + + /** + * 获取用户全部信息 + *

+ * 查询用户的完整信息,包括基本信息和扩展字段。 扩展字段可能包括部门、角色、上级领导等信息, 这些信息在流程执行中用于人员分配和权限判断。 + *

+ * @param userId 用户ID + * @return R> 统一响应对象,包含用户的所有信息 + */ + @GetMapping("queryUserAllInfo") + public R> queryUserAllInfo(long userId) { + return remoteService.queryUserAllInfo(userId); + } + + /** + * 处理节点开始事件 + *

+ * 当流程节点开始执行时触发此事件。 记录节点开始时间、状态等信息,并可执行相关业务逻辑。 + *

+ * @param recordParamDto 节点记录参数,包含节点ID、流程实例ID等 + * @return R 统一响应对象 + */ + @PostMapping("startNodeEvent") + public R startNodeEvent(@RequestBody ProcessNodeRecordParamDto recordParamDto) { + return remoteService.startNodeEvent(recordParamDto); + } + + /** + * 处理流程创建事件 + *

+ * 当新的流程实例被创建时触发此事件。 记录流程实例的创建信息,包括发起人、发起时间、表单数据等。 + *

+ * @param processInstanceRecordParamDto 流程实例记录参数 + * @return R 统一响应对象 + */ + @PostMapping("createProcessEvent") + public R createProcessEvent(@RequestBody ProcessInstanceRecordParamDto processInstanceRecordParamDto) { + return remoteService.createProcessEvent(processInstanceRecordParamDto); + } + + /** + * 处理节点结束事件 + *

+ * 当流程节点执行完成时触发此事件。 更新节点状态、结束时间等信息,并可执行后续业务逻辑。 + *

+ * @param recordParamDto 节点记录参数,包含节点ID、流程实例ID等 + * @return R 统一响应对象 + */ + @PostMapping("endNodeEvent") + public R endNodeEvent(@RequestBody ProcessNodeRecordParamDto recordParamDto) { + return remoteService.endNodeEvent(recordParamDto); + } + + /** + * 设置任务执行人 + *

+ * 在任务创建时设置任务的执行人。 根据节点配置的人员分配规则,确定并记录任务的实际处理人。 + *

+ * @param processNodeRecordAssignUserParamDto 任务分配参数,包含任务ID、用户ID等 + * @return R 统一响应对象 + */ + @PostMapping("startAssignUser") + public R startAssignUser(@RequestBody ProcessNodeRecordAssignUserParamDto processNodeRecordAssignUserParamDto) { + return remoteService.startAssignUser(processNodeRecordAssignUserParamDto); + } + + /** + * 处理任务结束事件 + *

+ * 当任务被完成时触发此事件。 更新任务状态、处理结果、处理时间等信息, 并可执行相关的业务通知或后续处理。 + *

+ * @param processNodeRecordAssignUserParamDto 任务结束参数,包含任务ID、处理结果等 + * @return R 统一响应对象 + */ + @PostMapping("taskEndEvent") + public R taskEndEvent(@RequestBody ProcessNodeRecordAssignUserParamDto processNodeRecordAssignUserParamDto) { + return remoteService.taskEndEvent(processNodeRecordAssignUserParamDto); + } + + /** + * 处理流程实例结束事件 + *

+ * 当整个流程实例执行完成时触发此事件。 更新流程实例状态为已完成,记录结束时间, 并可执行流程结束后的业务处理。 + *

+ * @param processInstanceParamDto 流程实例参数 + * @return R 统一响应对象 + */ + @PostMapping("endProcess") + public R endProcess(@RequestBody ProcessInstanceParamDto processInstanceParamDto) { + return remoteService.endProcess(processInstanceParamDto); + } + + /** + * 查询流程管理员 + *

+ * 获取指定流程的管理员用户ID。 流程管理员拥有该流程的特殊权限, 如强制终止流程、调整流程路径等。 + *

+ * @param flowId 流程定义ID + * @return R 统一响应对象,包含管理员用户ID + */ + @GetMapping("queryProcessAdmin") + public R queryProcessAdmin(String flowId) { + return remoteService.queryProcessAdmin(flowId); + } + +} diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/controller/ProcessTaskController.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/controller/ProcessTaskController.java new file mode 100644 index 000000000..04c07a41e --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/controller/ProcessTaskController.java @@ -0,0 +1,160 @@ +package com.pig4cloud.pigx.flow.controller; + +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.dto.TaskParamDto; +import com.pig4cloud.pigx.flow.service.ITaskService; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import org.springframework.web.bind.annotation.*; + +/** + * 任务管理控制器 + *

+ * 该控制器提供任务操作的高级业务接口,是面向最终用户的任务处理入口。 与EngineTaskController不同,该控制器封装了完整的业务逻辑,包括: 1. 任务查询 - + * 查看任务详情、首页统计数据 2. 任务处理 - 完成任务、退回任务、终止流程 3. 高级操作 - 加签、委托、转办等特殊处理 + *

+ *

+ * 所有操作都包含权限验证、业务校验、操作记录等完整的业务处理流程, 确保任务处理的合规性和可追溯性。 + *

+ * + * @author pigx + * @since 2023 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/task") +public class ProcessTaskController { + + private final ITaskService taskService; + + /** + * 查询任务统计数据看板 + *

+ * 获取当前登录用户的任务统计信息,用于首页或工作台展示。 返回的统计数据可能包括:待办数量、已办数量、超时任务数等。 + *

+ * @return R 统一响应对象,包含任务统计数据 + */ + @SneakyThrows + @GetMapping("queryTaskData") + public R queryTaskData() { + return taskService.queryTaskData(); + } + + /** + * 查询任务详情 + *

+ * 获取指定任务的完整信息,包括: 1. 任务基本信息 - 任务名称、创建时间、处理人等 2. 流程信息 - 所属流程、发起人、流程状态等 3. 表单数据 - + * 与任务关联的业务表单信息 4. 操作权限 - 根据用户角色和任务状态判断可执行的操作 + *

+ * @param taskId 任务ID + * @param view 是否为查看模式:true-仅查看,false-可编辑处理 + * @return R 统一响应对象,包含任务的完整信息和可操作项 + */ + @SneakyThrows + @GetMapping("queryTask") + public R queryTask(String taskId, boolean view) { + + return taskService.queryTask(taskId, view); + + } + + /** + * 完成任务 + *

+ * 处理当前任务,支持多种完成方式: 1. 通过 - 同意任务审批,流程继续往下执行 2. 拒绝 - 不同意任务审批,流程可能结束或进入其他分支 3. 附带意见 - + * 可以添加审批意见和附件 完成后会记录操作日志,并根据流程配置进行后续处理。 + *

+ * @param completeParamDto 任务完成参数,包含: - taskId: 任务ID - result: 处理结果(通过/拒绝) - comment: + * 审批意见 - variables: 流程变量 + * @return R 统一响应对象,操作成功返回下一节点信息 + */ + @SneakyThrows + @PostMapping("completeTask") + public R completeTask(@RequestBody TaskParamDto completeParamDto) { + return taskService.completeTask(completeParamDto); + } + + /** + * 前加签任务 + *

+ * 在任务处理前添加其他审批人。前加签是指在当前任务处理前, 先让其他人进行审批,审批完成后再回到当前处理人。 通常用于需要征求其他人意见或补充审批的场景。 + *

+ * @param completeParamDto 加签参数,包含: - taskId: 当前任务ID - targetUserIdList: 加签用户ID列表 - + * comment: 加签说明 + * @return R 统一响应对象,操作成功返回加签任务信息 + */ + @SneakyThrows + @PostMapping("delegateTask") + public R delegateTask(@RequestBody TaskParamDto completeParamDto) { + + return taskService.delegateTask(completeParamDto); + + } + + /** + * 加签完成任务 + *

+ * 加签人完成加签任务后,任务会返回给原处理人。 该接口用于处理加签任务的完成操作,支持添加审批意见。 完成后,原处理人可以继续处理该任务。 + *

+ * @param completeParamDto 加签完成参数,包含: - taskId: 加签任务ID - comment: 加签意见 - variables: + * 需要传递的变量 + * @return R 统一响应对象,操作成功后任务返回给原处理人 + */ + @SneakyThrows + @PostMapping("resolveTask") + public R resolveTask(@RequestBody TaskParamDto completeParamDto) { + + return taskService.resolveTask(completeParamDto); + + } + + /** + * 设置任务执行人(转办) + *

+ * 将任务转办给其他用户处理。与加签不同,转办后任务不会返回给原处理人。 通常用于当前处理人无法处理该任务,需要其他人代为处理的场景。 转办后会保留转办记录。 + *

+ * @param completeParamDto 转办参数,包含: - taskId: 任务ID - targetUserIdList: 目标用户ID列表 - + * comment: 转办说明 + * @return R 统一响应对象,操作成功返回转办信息 + */ + @SneakyThrows + @PostMapping("setAssignee") + public R setAssignee(@RequestBody TaskParamDto completeParamDto) { + + return taskService.setAssignee(completeParamDto); + + } + + /** + * 终止流程实例 + *

+ * 强制终止当前流程实例的执行。该操作不可逆,流程终止后无法恢复。 通常用于: 1. 流程发起错误需要撤销 2. 业务变更导致流程无需继续 3. 紧急情况下的流程中止 + * 需要有相应权限才能执行此操作。 + *

+ * @param completeParamDto 终止参数,包含: - processInstanceId: 流程实例ID - reason: 终止原因 + * @return R 统一响应对象,操作成功返回终止信息 + */ + @SneakyThrows + @PostMapping("stopProcessInstance") + public R stopProcessInstance(@RequestBody TaskParamDto completeParamDto) { + + return taskService.stopProcessInstance(completeParamDto); + + } + + /** + * 退回任务 + *

+ * 将当前任务退回到上一个或指定的节点重新处理。 退回操作会: 1. 撤销当前节点的处理 2. 流程返回到指定节点 3. 保留退回记录和原因 + * 退回后,被退回节点的处理人需要重新处理任务。 + *

+ * @param taskParamDto 退回参数,包含: - taskId: 当前任务ID - targetNodeId: 目标节点ID(可选,不指定则退回上一节点) + * - reason: 退回原因 + * @return R 统一响应对象,操作成功返回退回信息 + */ + @PostMapping("back") + public R back(@RequestBody TaskParamDto taskParamDto) { + return taskService.back(taskParamDto); + } + +} diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/mapper/ProcessCopyMapper.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/mapper/ProcessCopyMapper.java new file mode 100644 index 000000000..fea3add37 --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/mapper/ProcessCopyMapper.java @@ -0,0 +1,20 @@ +package com.pig4cloud.pigx.flow.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.pig4cloud.pigx.flow.entity.ProcessCopy; +import org.apache.ibatis.annotations.Mapper; + +/** + * 流程抄送数据访问接口 + *

+ * 负责流程抄送表(wflow_process_copy)的数据访问操作 + * 管理流程实例的抄送记录,包括抄送人、抄送时间、已读状态等信息 + *

+ * + * @author Vincent + * @since 2023-05-20 + */ +@Mapper +public interface ProcessCopyMapper extends BaseMapper { + +} diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/mapper/ProcessGroupMapper.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/mapper/ProcessGroupMapper.java new file mode 100644 index 000000000..b5000e76e --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/mapper/ProcessGroupMapper.java @@ -0,0 +1,20 @@ +package com.pig4cloud.pigx.flow.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.pig4cloud.pigx.flow.entity.ProcessGroup; +import org.apache.ibatis.annotations.Mapper; + +/** + * 流程分组数据访问接口 + *

+ * 负责流程分组表(wflow_process_group)的数据访问操作 + * 管理流程的分类分组信息,支持流程的分类展示和管理 + *

+ * + * @author Vincent + * @since 2023-05-25 + */ +@Mapper +public interface ProcessGroupMapper extends BaseMapper { + +} diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/mapper/ProcessInstanceRecordMapper.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/mapper/ProcessInstanceRecordMapper.java new file mode 100644 index 000000000..437bc930b --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/mapper/ProcessInstanceRecordMapper.java @@ -0,0 +1,20 @@ +package com.pig4cloud.pigx.flow.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.pig4cloud.pigx.flow.entity.ProcessInstanceRecord; +import org.apache.ibatis.annotations.Mapper; + +/** + * 流程实例记录数据访问接口 + *

+ * 负责流程实例记录表(wflow_process_instance_record)的数据访问操作 + * 管理流程实例的执行记录,包括流程实例的创建、状态变更、完成等信息 + *

+ * + * @author Vincent + * @since 2023-05-07 + */ +@Mapper +public interface ProcessInstanceRecordMapper extends BaseMapper { + +} diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/mapper/ProcessMapper.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/mapper/ProcessMapper.java new file mode 100644 index 000000000..fcdeb06cc --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/mapper/ProcessMapper.java @@ -0,0 +1,20 @@ +package com.pig4cloud.pigx.flow.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.pig4cloud.pigx.flow.entity.Process; +import org.apache.ibatis.annotations.Mapper; + +/** + * 流程定义数据访问接口 + *

+ * 负责流程定义表(wflow_process)的数据访问操作 + * 包含流程定义的基本信息管理,如流程名称、流程图、表单配置等 + *

+ * + * @author cxygzl + * @since 2023-05-25 + */ +@Mapper +public interface ProcessMapper extends BaseMapper { + +} diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/mapper/ProcessNodeDataMapper.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/mapper/ProcessNodeDataMapper.java new file mode 100644 index 000000000..9bd6a5f05 --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/mapper/ProcessNodeDataMapper.java @@ -0,0 +1,20 @@ +package com.pig4cloud.pigx.flow.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.pig4cloud.pigx.flow.entity.ProcessNodeData; +import org.apache.ibatis.annotations.Mapper; + +/** + * 流程节点数据访问接口 + *

+ * 负责流程节点数据表(wflow_process_node_data)的数据访问操作 + * 管理流程各节点的表单数据,存储流程执行过程中各节点产生的业务数据 + *

+ * + * @author Vincent + * @since 2023-05-07 + */ +@Mapper +public interface ProcessNodeDataMapper extends BaseMapper { + +} diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/mapper/ProcessNodeRecordAssignUserMapper.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/mapper/ProcessNodeRecordAssignUserMapper.java new file mode 100644 index 000000000..aa79de4a5 --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/mapper/ProcessNodeRecordAssignUserMapper.java @@ -0,0 +1,20 @@ +package com.pig4cloud.pigx.flow.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.pig4cloud.pigx.flow.entity.ProcessNodeRecordAssignUser; +import org.apache.ibatis.annotations.Mapper; + +/** + * 流程节点执行人记录数据访问接口 + *

+ * 负责流程节点执行人记录表(wflow_process_node_record_assign_user)的数据访问操作 + * 管理流程节点的执行人分配记录,包括待办人员、实际执行人、执行状态等信息 + *

+ * + * @author cxygzl + * @since 2023-05-10 + */ +@Mapper +public interface ProcessNodeRecordAssignUserMapper extends BaseMapper { + +} diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/mapper/ProcessNodeRecordMapper.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/mapper/ProcessNodeRecordMapper.java new file mode 100644 index 000000000..b058829de --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/mapper/ProcessNodeRecordMapper.java @@ -0,0 +1,20 @@ +package com.pig4cloud.pigx.flow.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.pig4cloud.pigx.flow.entity.ProcessNodeRecord; +import org.apache.ibatis.annotations.Mapper; + +/** + * 流程节点记录数据访问接口 + *

+ * 负责流程节点记录表(wflow_process_node_record)的数据访问操作 + * 管理流程执行过程中各节点的执行记录,包括节点的开始、结束时间、执行状态、审批意见等 + *

+ * + * @author cxygzl + * @since 2023-05-10 + */ +@Mapper +public interface ProcessNodeRecordMapper extends BaseMapper { + +} diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/mapper/ProcessStarterMapper.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/mapper/ProcessStarterMapper.java new file mode 100644 index 000000000..949fac714 --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/mapper/ProcessStarterMapper.java @@ -0,0 +1,20 @@ +package com.pig4cloud.pigx.flow.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.pig4cloud.pigx.flow.entity.ProcessStarter; +import org.apache.ibatis.annotations.Mapper; + +/** + * 流程发起人数据访问接口 + *

+ * 负责流程发起人表(wflow_process_starter)的数据访问操作 + * 管理流程的发起权限配置,定义哪些用户、角色或部门可以发起特定流程 + *

+ * + * @author Vincent + * @since 2023-05-30 + */ +@Mapper +public interface ProcessStarterMapper extends BaseMapper { + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/BpmOaLeaveService.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/BpmOaLeaveService.java similarity index 100% rename from pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/BpmOaLeaveService.java rename to pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/BpmOaLeaveService.java diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/ICombinationGroupService.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/ICombinationGroupService.java new file mode 100644 index 000000000..500bf51b1 --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/ICombinationGroupService.java @@ -0,0 +1,44 @@ +package com.pig4cloud.pigx.flow.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.pig4cloud.pigx.common.core.util.R; + +/** + * 流程组合服务接口 + *

+ * 该服务负责管理流程表单组的聚合查询功能,提供了流程组与流程关联关系的查询, + * 以及用户权限范围内可发起流程组的查询等功能。主要用于流程发起页面的表单组展示 + * 和流程选择等场景。 + *

+ * + * @author pig code generator + * @date 2023-07-11 + */ +public interface ICombinationGroupService { + + /** + * 分页查询指定表单组下的流程列表 + *

+ * 根据表单组ID查询该组下所有关联的流程定义,支持分页查询。 + * 主要用于流程发起页面,展示某个表单组下可以发起的所有流程。 + *

+ * + * @param page 分页参数,包含当前页码、每页大小等分页信息 + * @param groupId 表单组ID,用于查询该组下的所有流程 + * @return R 响应结果,包含分页后的流程列表数据,每个流程包含流程定义信息、表单配置等 + */ + R listGroupWithProcess(Page page, Long groupId); + + /** + * 查询当前用户可发起的所有表单组 + *

+ * 根据当前登录用户的权限,查询其有权限发起的所有流程表单组。 + * 该接口会根据用户角色、部门等权限信息过滤表单组,确保用户只能看到 + * 自己有权限发起的流程组。通常用于流程发起入口页面的初始化展示。 + *

+ * + * @return R 响应结果,包含当前用户可发起的表单组列表,每个表单组包含组名称、图标、包含的流程数量等信息 + */ + R listCurrentUserStartGroup(); + +} diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/IFlowableEngineService.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/IFlowableEngineService.java new file mode 100644 index 000000000..8b7bbf80d --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/IFlowableEngineService.java @@ -0,0 +1,68 @@ +package com.pig4cloud.pigx.flow.service; + +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.dto.TaskParamDto; + +/** + * Flowable引擎核心服务接口 + *

+ * 该服务提供了对Flowable工作流引擎的核心操作封装,主要处理任务的委托、解决和退回等高级功能。 + * 这些功能是对标准Flowable API的扩展,为业务层提供更便捷的工作流操作能力。 + * 所有操作都基于Flowable引擎的任务服务(TaskService)和运行时服务(RuntimeService)实现。 + *

+ * + * @author pig code generator + * @date 2023-07-11 + */ +public interface IFlowableEngineService { + + /** + * 委托任务给其他用户处理 + *

+ * 将当前任务委托给指定的用户处理。委托后,原任务处理人仍保留任务的所有权, + * 被委托人完成任务后,任务会返回给原处理人进行确认。这种机制常用于任务处理人 + * 临时无法处理任务,需要他人协助的场景。委托操作会记录在任务历史中。 + *

+ * + * @param taskParamDto 任务参数对象,必须包含: + * - taskId: 要委托的任务ID + * - userId: 被委托人的用户ID + * - comment: 委托说明(可选) + * - variables: 流程变量(可选) + * @return R 响应结果,成功返回委托后的任务信息,失败返回错误信息 + */ + R delegateTask(TaskParamDto taskParamDto); + + /** + * 解决已委托的任务 + *

+ * 被委托人完成委托任务的处理。该操作将任务标记为已解决,并将任务控制权 + * 返回给原任务处理人。原处理人可以查看被委托人的处理结果,并决定是否 + * 继续推进流程。解决任务时可以添加处理意见和更新流程变量。 + *

+ * + * @param taskParamDto 任务参数对象,必须包含: + * - taskId: 要解决的委托任务ID + * - comment: 处理意见 + * - variables: 更新的流程变量(可选) + * @return R 响应结果,成功返回解决后的任务状态,失败返回错误信息 + */ + R resolveTask(TaskParamDto taskParamDto); + + /** + * 退回任务到上一节点 + *

+ * 将当前任务退回到流程的上一个处理节点。该功能用于审批不通过或需要 + * 上一步骤重新处理的场景。退回操作会保留完整的流程历史记录,并且 + * 可以配置是否清空后续节点的处理记录。支持跨多个节点的退回操作。 + *

+ * + * @param taskParamDto 任务参数对象,必须包含: + * - taskId: 要退回的任务ID + * - targetNodeId: 目标节点ID(可选,不指定则退回到上一节点) + * - comment: 退回原因 + * - variables: 更新的流程变量(可选) + * @return R 响应结果,成功返回退回后的任务信息,失败返回错误信息(如无法退回的情况) + */ + R back(TaskParamDto taskParamDto); +} \ No newline at end of file diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/IProcessCopyService.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/IProcessCopyService.java new file mode 100644 index 000000000..f1ab17a6b --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/IProcessCopyService.java @@ -0,0 +1,37 @@ +package com.pig4cloud.pigx.flow.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.entity.ProcessCopy; + +/** + * 流程抄送服务接口 + *

+ * 该服务负责管理工作流程中的抄送功能,包括抄送记录的创建、查询和管理。 + * 抄送是工作流中的重要功能,允许将流程信息同步给相关人员查看,但不需要其参与审批。 + * 抄送人员可以查看流程的详细信息、表单数据和审批进度,实现流程的透明化管理。 + *

+ * + * @author Vincent + * @since 2023-05-20 + */ +public interface IProcessCopyService extends IService { + + /** + * 查询单个抄送记录的详细信息 + *

+ * 根据抄送记录ID查询完整的抄送信息,包括流程实例信息、表单数据、 + * 抄送时间、抄送人信息等。该接口主要用于抄送接收人查看具体的抄送内容。 + * 返回的数据会包含流程的当前状态、审批历史和相关的业务表单数据。 + *

+ * + * @param id 抄送记录的唯一标识ID + * @return R 响应结果,包含抄送的详细信息: + * - 流程实例信息(流程名称、发起人、发起时间等) + * - 表单数据(业务表单的完整数据) + * - 抄送信息(抄送时间、抄送人、抄送节点等) + * - 流程进度(当前节点、审批历史等) + */ + R querySingleDetail(long id); + +} diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/IProcessGroupService.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/IProcessGroupService.java new file mode 100644 index 000000000..95e424f90 --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/IProcessGroupService.java @@ -0,0 +1,69 @@ +package com.pig4cloud.pigx.flow.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.entity.ProcessGroup; + +import java.util.List; + +/** + * 流程分组管理服务接口 + *

+ * 该服务负责管理流程的分组功能,提供流程分组的创建、查询、删除等操作。 + * 流程分组是对流程进行分类管理的重要机制,可以将相似或相关的流程组织在一起, + * 便于用户快速找到和使用流程。分组支持层级结构,可以实现流程的树形分类管理。 + *

+ * + * @author Vincent + * @since 2023-05-25 + */ +public interface IProcessGroupService extends IService { + + /** + * 查询所有流程分组列表 + *

+ * 获取系统中所有的流程分组信息,包括分组名称、图标、排序号等。 + * 返回的列表会按照排序号和创建时间进行排序,支持树形结构的展示。 + * 该接口通常用于流程管理页面的分组树展示和流程发起页面的分类导航。 + *

+ * + * @return R> 响应结果,包含所有流程分组的列表,每个分组包含: + * - id: 分组ID + * - groupName: 分组名称 + * - groupIcon: 分组图标 + * - sortOrder: 排序号 + * - parentId: 父分组ID(用于构建树形结构) + */ + R> queryList(); + + /** + * 创建新的流程分组 + *

+ * 添加一个新的流程分组到系统中。创建时会检查分组名称的唯一性, + * 并自动设置默认的排序号。支持创建子分组,通过设置parentId实现。 + * 新创建的分组默认为启用状态,可以立即用于流程的分类。 + *

+ * + * @param processGroup 流程分组对象,需要包含: + * - groupName: 分组名称(必填,不能重复) + * - groupIcon: 分组图标(可选) + * - sortOrder: 排序号(可选,默认为最大值+1) + * - parentId: 父分组ID(可选,用于创建子分组) + * @return R 响应结果,成功返回创建的分组信息,失败返回错误信息(如名称重复等) + */ + R create(ProcessGroup processGroup); + + /** + * 删除流程分组 + *

+ * 根据分组ID删除指定的流程分组。删除前会检查该分组下是否存在流程, + * 如果存在关联的流程则不允许删除。同时会检查是否有子分组,有子分组 + * 的情况下也不允许删除。删除操作是逻辑删除,保留历史记录。 + *

+ * + * @param id 要删除的分组ID + * @return R 响应结果,成功返回删除成功信息,失败返回错误原因(如分组下有流程、有子分组等) + */ + R delete(long id); + +} diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/IProcessInstanceRecordService.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/IProcessInstanceRecordService.java new file mode 100644 index 000000000..a3347ccf0 --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/IProcessInstanceRecordService.java @@ -0,0 +1,19 @@ +package com.pig4cloud.pigx.flow.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.flow.entity.ProcessInstanceRecord; + +/** + * 流程实例记录服务接口 + *

+ * 该服务负责管理流程实例的运行记录,记录每个流程实例从创建到结束的完整生命周期信息。 + * 包括流程的启动时间、结束时间、当前状态、流程变量等核心数据。这些记录是流程审计、 + * 统计分析和问题排查的重要依据。服务提供了对流程实例记录的基础CRUD操作。 + *

+ * + * @author Vincent + * @since 2023-05-07 + */ +public interface IProcessInstanceRecordService extends IService { + +} diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/IProcessInstanceService.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/IProcessInstanceService.java new file mode 100644 index 000000000..c83639e1b --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/IProcessInstanceService.java @@ -0,0 +1,156 @@ +package com.pig4cloud.pigx.flow.service; + +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.dto.ProcessInstanceParamDto; +import com.pig4cloud.pigx.flow.dto.TaskQueryParamDto; +import com.pig4cloud.pigx.flow.vo.NodeFormatParamVo; + +/** + * 流程实例管理服务接口 + *

+ * 该服务提供流程实例的完整生命周期管理功能,包括流程的启动、查询、结束等操作。 + * 同时提供了多维度的任务查询功能,支持查询待办任务、已办任务、我发起的流程、 + * 抄送给我的流程等。还提供了流程节点的格式化显示和流程详情查询等辅助功能。 + *

+ * + * @author pig code generator + * @date 2023-07-11 + */ +public interface IProcessInstanceService { + + /** + * 启动新的流程实例 + *

+ * 根据流程定义启动一个新的流程实例。启动时需要提供流程定义ID、业务关联ID、 + * 表单数据和流程变量等信息。系统会自动创建第一个任务节点,并根据配置分配 + * 给相应的处理人。启动成功后会返回流程实例ID供后续跟踪使用。 + *

+ * + * @param processInstanceParamDto 流程实例参数对象,包含: + * - processDefinitionId: 流程定义ID + * - businessKey: 业务关联键 + * - formData: 表单数据(JSON格式) + * - variables: 流程变量 + * - startUserId: 发起人ID(可选,默认当前用户) + * @return R 响应结果,成功返回流程实例ID和首个任务信息,失败返回错误信息 + */ + R startProcessInstance(ProcessInstanceParamDto processInstanceParamDto); + + /** + * 查询当前用户的待办任务 + *

+ * 查询分配给当前登录用户的所有待处理任务。支持分页查询和多条件筛选, + * 包括流程类型、紧急程度、创建时间等。返回的任务列表包含任务的基本信息、 + * 所属流程信息、表单数据预览等,便于用户快速了解和处理任务。 + *

+ * + * @param taskQueryParamDto 任务查询参数,支持: + * - pageNum: 页码 + * - pageSize: 每页大小 + * - processDefinitionKey: 流程定义标识(可选) + * - priority: 优先级(可选) + * - createTimeBegin/End: 创建时间范围(可选) + * @return R 响应结果,包含分页的待办任务列表,每个任务包含任务ID、名称、创建时间、流程信息等 + */ + R queryMineTask(TaskQueryParamDto taskQueryParamDto); + + /** + * 查询当前用户的已办任务 + *

+ * 查询当前用户已经处理完成的历史任务。包括已审批、已转办、已委托完成的任务。 + * 支持按时间范围、流程类型等条件筛选,帮助用户追溯历史处理记录。 + *

+ * + * @param taskQueryParamDto 任务查询参数,支持: + * - pageNum: 页码 + * - pageSize: 每页大小 + * - processDefinitionKey: 流程定义标识(可选) + * - completeTimeBegin/End: 完成时间范围(可选) + * @return R 响应结果,包含分页的已办任务列表,包含任务处理时间、处理意见、处理结果等信息 + */ + R queryMineEndTask(TaskQueryParamDto taskQueryParamDto); + + /** + * 强制结束流程实例 + *

+ * 管理员或流程发起人可以强制结束一个运行中的流程实例。结束时需要提供 + * 结束原因,系统会记录操作日志。该操作不可逆,结束后的流程无法恢复。 + * 通常用于流程异常或业务取消等场景。 + *

+ * + * @param processInstanceParamDto 参数对象,必须包含: + * - processInstanceId: 要结束的流程实例ID + * - reason: 结束原因 + * @return R 响应结果,成功返回结束确认信息,失败返回错误原因(如权限不足等) + */ + R end(ProcessInstanceParamDto processInstanceParamDto); + + /** + * 查询我发起的流程 + *

+ * 查询当前用户发起的所有流程实例,包括运行中和已结束的流程。 + * 支持按流程状态、发起时间等条件筛选。用户可以查看流程的当前进度、 + * 处理人等信息,并可以对自己发起的流程进行撤回、催办等操作。 + *

+ * + * @param taskQueryParamDto 查询参数,支持: + * - pageNum: 页码 + * - pageSize: 每页大小 + * - processStatus: 流程状态(运行中/已结束) + * - startTimeBegin/End: 发起时间范围 + * @return R 响应结果,包含我发起的流程列表,含流程状态、当前节点、处理人等信息 + */ + R queryMineStarted(TaskQueryParamDto taskQueryParamDto); + + /** + * 查询抄送给我的流程 + *

+ * 查询所有抄送给当前用户的流程信息。抄送是流程中的知会功能, + * 被抄送人可以查看流程详情但不参与审批。支持标记已读状态, + * 便于用户管理和跟踪需要关注的流程。 + *

+ * + * @param taskQueryParamDto 查询参数,支持: + * - pageNum: 页码 + * - pageSize: 每页大小 + * - readStatus: 已读/未读状态 + * - copyTimeBegin/End: 抄送时间范围 + * @return R 响应结果,包含抄送流程列表,含抄送时间、抄送人、流程状态、已读标记等 + */ + R queryMineCC(TaskQueryParamDto taskQueryParamDto); + + /** + * 格式化流程节点显示数据 + *

+ * 将流程定义的节点数据格式化为前端可展示的结构。包括节点的层级关系、 + * 条件分支、并行网关等复杂结构的可视化数据。该接口主要用于流程图的 + * 展示和流程设计器的数据渲染。 + *

+ * + * @param nodeFormatParamVo 节点格式化参数,包含: + * - processDefinitionId: 流程定义ID + * - nodeData: 原始节点数据 + * - showType: 显示类型(设计/运行/历史) + * @return R 响应结果,包含格式化后的节点树形结构,支持前端流程图渲染 + */ + R formatStartNodeShow(NodeFormatParamVo nodeFormatParamVo); + + /** + * 查询流程实例详情 + *

+ * 获取指定流程实例的完整信息,包括流程基本信息、表单数据、审批历史、 + * 流程图当前状态等。该接口会整合多个数据源,提供流程的全景视图, + * 支持流程追踪和问题排查。 + *

+ * + * @param processInstanceId 流程实例ID + * @return R 响应结果,包含: + * - 流程基本信息(名称、发起人、发起时间、当前状态等) + * - 表单数据(完整的业务表单数据) + * - 审批历史(所有节点的处理记录) + * - 流程图(带当前节点高亮的流程图数据) + * - 操作权限(当前用户对该流程的可操作项) + */ + R detail(String processInstanceId); + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessInstanceStatusEventService.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/IProcessInstanceStatusEventService.java similarity index 100% rename from pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessInstanceStatusEventService.java rename to pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/IProcessInstanceStatusEventService.java diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/IProcessNodeDataService.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/IProcessNodeDataService.java new file mode 100644 index 000000000..231247cbc --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/IProcessNodeDataService.java @@ -0,0 +1,62 @@ +package com.pig4cloud.pigx.flow.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.dto.Node; +import com.pig4cloud.pigx.flow.dto.ProcessNodeDataDto; +import com.pig4cloud.pigx.flow.entity.ProcessNodeData; + +/** + * 流程节点数据管理服务接口 + *

+ * 该服务负责管理流程定义中每个节点的配置数据,包括节点的属性设置、审批人配置、 + * 表单权限、条件表达式等。这些数据是流程引擎执行时的重要依据,决定了流程节点 + * 的行为方式。服务提供了节点数据的保存和查询功能,支持流程的动态配置。 + *

+ * + * @author Vincent + * @since 2023-05-07 + */ +public interface IProcessNodeDataService extends IService { + + /** + * 保存或更新流程节点数据 + *

+ * 保存流程节点的完整配置信息,包括节点基本属性、审批人设置、表单字段权限、 + * 条件配置等。如果节点数据已存在则更新,不存在则新增。保存时会进行数据 + * 验证,确保配置的合法性和完整性。该接口通常在流程设计时调用。 + *

+ * + * @param processNodeDataDto 节点数据传输对象,包含: + * - flowId: 流程定义ID + * - nodeId: 节点ID + * - nodeName: 节点名称 + * - nodeType: 节点类型(审批/抄送/条件等) + * - nodeUser: 节点处理人配置 + * - formPermission: 表单字段权限配置 + * - conditions: 条件表达式(条件节点使用) + * - properties: 其他扩展属性 + * @return R 响应结果,成功返回保存后的节点数据ID,失败返回错误信息 + */ + R saveNodeData(ProcessNodeDataDto processNodeDataDto); + + /** + * 获取指定节点的配置数据 + *

+ * 根据流程ID和节点ID查询节点的完整配置信息。返回的数据包括节点的所有 + * 配置项,可直接用于流程引擎的执行或流程设计器的回显。查询时会进行 + * 权限校验,确保调用者有权限访问该流程的节点数据。 + *

+ * + * @param flowId 流程定义ID,标识节点所属的流程 + * @param nodeId 节点ID,流程中节点的唯一标识 + * @return R 响应结果,包含节点的完整配置信息: + * - 基本信息(ID、名称、类型等) + * - 处理人配置(固定人员、角色、部门负责人等) + * - 表单权限(各字段的可见、可编辑权限) + * - 条件配置(分支条件、跳转条件等) + * - 其他属性(超时设置、多实例配置等) + */ + R getNodeData(String flowId, String nodeId); + +} diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/IProcessNodeRecordAssignUserService.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/IProcessNodeRecordAssignUserService.java new file mode 100644 index 000000000..5364bf882 --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/IProcessNodeRecordAssignUserService.java @@ -0,0 +1,60 @@ +package com.pig4cloud.pigx.flow.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.dto.ProcessNodeRecordAssignUserParamDto; +import com.pig4cloud.pigx.flow.entity.ProcessNodeRecordAssignUser; + +/** + * 流程节点执行人管理服务接口 + *

+ * 该服务负责管理流程节点的执行人分配和任务完成状态。在流程执行过程中, + * 每个节点可能有多个执行人(如会签、或签场景),该服务记录每个执行人的 + * 分配情况、处理状态和处理结果。同时提供任务完成事件的处理机制,支持 + * 多人审批场景下的复杂业务逻辑。 + *

+ * + * @author cxygzl + * @since 2023-05-10 + */ +public interface IProcessNodeRecordAssignUserService extends IService { + + /** + * 为流程节点添加执行人 + *

+ * 在流程运行时动态分配任务执行人。该接口支持为单个节点分配多个执行人, + * 适用于会签(所有人都需要审批)、或签(任意一人审批即可)等场景。 + * 分配时会记录执行人信息、分配时间和任务类型,并触发相应的任务通知。 + *

+ * + * @param processNodeRecordAssignUserParamDto 执行人分配参数,包含: + * - processInstanceId: 流程实例ID + * - nodeId: 节点ID + * - nodeRecordId: 节点记录ID + * - userId: 执行人用户ID + * - taskType: 任务类型(审批/抄送/加签等) + * - multiInstanceType: 多实例类型(会签/或签) + * @return R 响应结果,成功返回分配记录ID,失败返回错误信息(如用户不存在、重复分配等) + */ + R addAssignUser(ProcessNodeRecordAssignUserParamDto processNodeRecordAssignUserParamDto); + + /** + * 处理任务完成事件 + *

+ * 当执行人完成任务时调用此接口,更新执行人的任务状态和处理结果。 + * 对于多人审批场景,会根据配置的审批规则(会签/或签)判断整个节点 + * 是否完成。如果节点完成,会自动推进流程到下一节点。同时记录审批 + * 意见、审批时间等信息,用于流程追溯。 + *

+ * + * @param processNodeRecordAssignUserParamDto 任务完成参数,包含: + * - assignUserId: 执行人记录ID + * - taskId: Flowable任务ID + * - approved: 是否同意 + * - comment: 审批意见 + * - variables: 流程变量(可选) + * @return R 响应结果,成功返回节点是否全部完成的状态,失败返回错误信息 + */ + R completeTaskEvent(ProcessNodeRecordAssignUserParamDto processNodeRecordAssignUserParamDto); + +} diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/IProcessNodeRecordService.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/IProcessNodeRecordService.java new file mode 100644 index 000000000..e97bd9672 --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/IProcessNodeRecordService.java @@ -0,0 +1,61 @@ +package com.pig4cloud.pigx.flow.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.dto.ProcessNodeRecordParamDto; +import com.pig4cloud.pigx.flow.entity.ProcessNodeRecord; + +/** + * 流程节点执行记录服务接口 + *

+ * 该服务负责记录流程执行过程中每个节点的运行状态和执行历史。包括节点的开始时间、 + * 结束时间、执行结果、执行人信息等。这些记录构成了流程的执行轨迹,是流程监控、 + * 审计和问题排查的重要数据来源。服务提供了节点生命周期的管理功能。 + *

+ * + * @author cxygzl + * @since 2023-05-10 + */ +public interface IProcessNodeRecordService extends IService { + + /** + * 记录节点开始执行 + *

+ * 当流程执行到某个节点时调用此接口,创建节点执行记录。记录节点的基本信息、 + * 开始时间、节点配置等。同时会根据节点类型(审批、抄送、网关等)执行相应的 + * 初始化逻辑,如分配执行人、发送通知等。该记录将作为节点执行的主记录。 + *

+ * + * @param processNodeRecordParamDto 节点记录参数,包含: + * - processInstanceId: 流程实例ID + * - executionId: Flowable执行ID + * - nodeId: 节点ID + * - nodeName: 节点名称 + * - nodeType: 节点类型 + * - parentNodeId: 父节点ID(用于嵌套结构) + * - variables: 流程变量 + * @return R 响应结果,成功返回节点记录ID和初始化状态,失败返回错误信息 + */ + R start(ProcessNodeRecordParamDto processNodeRecordParamDto); + + /** + * 记录节点执行完成 + *

+ * 当节点执行完成时调用此接口,更新节点记录的结束时间和执行结果。 + * 对于审批节点,会记录最终的审批结果(通过/拒绝);对于网关节点, + * 会记录选择的分支;对于服务节点,会记录执行状态。完成后会触发 + * 流程继续向下执行。 + *

+ * + * @param processNodeRecordParamDto 节点记录参数,包含: + * - nodeRecordId: 节点记录ID + * - status: 执行状态(成功/失败/跳过等) + * - result: 执行结果(通过/拒绝/条件值等) + * - comment: 处理意见或说明 + * - endTime: 结束时间 + * - variables: 更新的流程变量 + * @return R 响应结果,成功返回更新状态和下一步节点信息,失败返回错误信息 + */ + R complete(ProcessNodeRecordParamDto processNodeRecordParamDto); + +} diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/IProcessService.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/IProcessService.java new file mode 100644 index 000000000..345df70e8 --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/IProcessService.java @@ -0,0 +1,72 @@ +package com.pig4cloud.pigx.flow.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.entity.Process; +import com.pig4cloud.pigx.flow.vo.ProcessVO; + +/** + * 流程定义服务接口 + *

+ * 提供流程定义的创建、编辑、查询、隐藏等核心功能。 + * 该服务是流程管理的核心服务,负责管理流程的生命周期。 + *

+ * + * @author cxygzl + * @since 2023-05-25 + */ +public interface IProcessService extends IService { + + /** + * 获取流程详细信息 + * 包括流程基本信息、表单配置、流程配置、权限信息等完整数据 + * + * @param flowId 流程定义ID + * @return 流程详细信息VO对象 + */ + R getDetail(String flowId); + + /** + * 根据流程ID获取流程定义实体 + * + * @param flowId 流程定义ID + * @return 流程定义实体 + */ + Process getByFlowId(String flowId); + + /** + * 根据流程ID更新流程定义 + * 用于更新流程的表单配置、流程配置等信息 + * + * @param process 包含更新信息的流程实体 + */ + void updateByFlowId(Process process); + + /** + * 隐藏流程定义 + * 隐藏的流程不在列表中显示,但已创建的实例仍可继续执行 + * + * @param flowId 流程定义ID + */ + void hide(String flowId); + + /** + * 创建新的流程定义 + * 创建流程时会同时生成流程的唯一标识和默认配置 + * + * @param process 流程定义实体 + * @return 创建结果,包含生成的flowId + */ + R create(Process process); + + /** + * 更新流程状态或分组 + * + * @param flowId 流程定义ID + * @param type 操作类型:stop(停用)、using(启用)、delete(删除) + * @param groupId 流程分组ID(可选,用于修改流程分组) + * @return 操作结果 + */ + R update(String flowId, String type, Long groupId); + +} diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/IProcessStarterService.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/IProcessStarterService.java new file mode 100644 index 000000000..f9ac16419 --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/IProcessStarterService.java @@ -0,0 +1,19 @@ +package com.pig4cloud.pigx.flow.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.flow.entity.ProcessStarter; + +/** + * 流程发起人权限管理服务接口 + *

+ * 该服务负责管理流程的发起权限配置,控制哪些用户、角色或部门可以发起特定的流程。 + * 通过灵活的权限配置,实现流程发起的精细化控制。支持按用户、角色、部门、岗位等 + * 多维度配置发起权限,确保流程只能被授权人员发起,提高流程管理的安全性。 + *

+ * + * @author Vincent + * @since 2023-05-30 + */ +public interface IProcessStarterService extends IService { + +} diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/IRemoteService.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/IRemoteService.java new file mode 100644 index 000000000..5b8b78192 --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/IRemoteService.java @@ -0,0 +1,213 @@ + +package com.pig4cloud.pigx.flow.service; + +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.dto.*; + +import java.util.List; +import java.util.Map; + +/** + * 远程服务调用接口 + *

+ * 该接口定义了流程模块与其他业务模块之间的远程调用契约。主要包括用户组织架构查询、 + * 流程事件通知、权限校验等功能。这些方法通过Feign客户端调用其他微服务,实现了 + * 流程引擎与业务系统的解耦。所有远程调用都进行了统一的异常处理和降级处理。 + *

+ * + * @author pig code generator + * @date 2023-07-11 + */ +public interface IRemoteService { + + /** + * 根据角色ID列表查询用户ID列表 + *

+ * 调用用户管理服务,查询指定角色下的所有用户。主要用于流程节点配置了 + * 角色审批时,动态获取该角色下的所有用户作为候选审批人。支持多个角色 + * 的联合查询,返回去重后的用户ID列表。 + *

+ * + * @param roleIdList 角色ID列表,支持批量查询多个角色 + * @return R> 响应结果,包含角色下所有用户的ID列表(已去重) + */ + R> queryUserIdListByRoleIdList(List roleIdList); + + /** + * 保存流程抄送记录 + *

+ * 当流程执行到抄送节点时,调用此接口创建抄送记录。抄送记录会保存到 + * 独立的抄送表中,被抄送人可以在抄送列表中查看但不参与审批。该接口 + * 会同时发送抄送通知给相关人员。 + *

+ * + * @param copyDto 抄送信息对象,包含: + * - processInstanceId: 流程实例ID + * - nodeId: 抄送节点ID + * - userId: 被抄送人ID + * - formData: 表单数据 + * - copyTime: 抄送时间 + * @return R 响应结果,成功返回抄送记录ID + */ + R saveCC(ProcessCopyDto copyDto); + + /** + * 检查用户是否为指定用户的所有上级 + *

+ * 用于流程节点配置了"部门负责人"或"上级领导"审批时,验证候选人 + * 是否符合组织架构关系。通过递归查询组织树,判断是否存在上下级关系。 + *

+ * + * @param checkParentDto 检查参数,包含: + * - userId: 要检查的用户ID + * - targetUserId: 目标用户ID + * - checkType: 检查类型(直接上级/所有上级) + * @return R 响应结果,true表示是上级关系,false表示不是 + */ + R checkIsAllParent(CheckParentDto checkParentDto); + + /** + * 根据部门ID列表查询用户ID列表 + *

+ * 调用组织架构服务,查询指定部门下的所有用户。用于流程节点配置了 + * 部门审批时,获取该部门的所有成员作为候选审批人。支持多部门查询 + * 和递归查询子部门。 + *

+ * + * @param depIdList 部门ID列表,支持批量查询多个部门 + * @return R> 响应结果,包含部门下所有用户的ID列表(已去重) + */ + R> queryUserIdListByDepIdList(List depIdList); + + /** + * 检查用户是否为指定用户的所有下级 + *

+ * 与checkIsAllParent相反,用于验证下级关系。主要用于某些特殊场景, + * 如向下委托、逐级审批等。通过递归查询组织树判断层级关系。 + *

+ * + * @param checkChildDto 检查参数,包含: + * - userId: 要检查的用户ID + * - targetUserId: 目标用户ID + * - checkLevel: 检查层级(直接下级/所有下级) + * @return R 响应结果,true表示是下级关系,false表示不是 + */ + R checkIsAllChild(CheckChildDto checkChildDto); + + /** + * 获取用户的完整信息(包括扩展字段) + *

+ * 查询用户的详细信息,除基本信息外,还包括部门、角色、岗位等扩展信息。 + * 这些信息用于流程执行时的条件判断、权限验证等。返回的Map结构便于 + * 在表达式中直接使用。 + *

+ * + * @param userId 用户ID + * @return R> 响应结果,包含用户的所有信息: + * - 基本信息(姓名、工号、邮箱等) + * - 组织信息(部门、岗位、上级等) + * - 权限信息(角色、权限标识等) + * - 扩展字段(自定义属性) + */ + R> queryUserAllInfo(long userId); + + /** + * 流程节点开始执行事件通知 + *

+ * 当流程节点开始执行时触发此事件,用于通知相关系统和人员。可以在此 + * 扩展自定义的业务逻辑,如发送消息、记录日志、触发其他流程等。 + *

+ * + * @param recordParamDto 节点记录参数,包含节点执行的上下文信息 + * @return R 响应结果,事件处理状态 + */ + R startNodeEvent(ProcessNodeRecordParamDto recordParamDto); + + /** + * 流程实例创建事件通知 + *

+ * 当新的流程实例被创建时触发此事件。用于初始化流程相关的业务数据, + * 发送流程启动通知,记录审计日志等。是流程生命周期的起始事件。 + *

+ * + * @param processInstanceRecordParamDto 流程实例参数,包含: + * - processInstanceId: 流程实例ID + * - processDefinitionId: 流程定义ID + * - businessKey: 业务关联键 + * - startUserId: 发起人ID + * - variables: 流程变量 + * @return R 响应结果,事件处理状态 + */ + R createProcessEvent(ProcessInstanceRecordParamDto processInstanceRecordParamDto); + + /** + * 流程节点结束事件通知 + *

+ * 当流程节点执行完成时触发此事件。可以在此处理节点完成后的业务逻辑, + * 如更新业务状态、发送完成通知、触发下游系统等。 + *

+ * + * @param recordParamDto 节点记录参数,包含节点执行结果等信息 + * @return R 响应结果,事件处理状态 + */ + R endNodeEvent(ProcessNodeRecordParamDto recordParamDto); + + /** + * 开始分配任务执行人事件 + *

+ * 当系统开始为任务分配执行人时触发。用于发送任务通知、记录分配日志等。 + * 在多人审批场景下,会为每个执行人触发一次该事件。 + *

+ * + * @param processNodeRecordAssignUserParamDto 执行人分配参数,包含: + * - userId: 被分配的用户ID + * - taskId: 任务ID + * - assignTime: 分配时间 + * @return R 响应结果,事件处理状态 + */ + R startAssignUser(ProcessNodeRecordAssignUserParamDto processNodeRecordAssignUserParamDto); + + /** + * 任务完成事件通知 + *

+ * 当用户完成分配给自己的任务时触发。用于更新业务状态、发送完成通知、 + * 记录操作日志等。对于会签场景,每个人完成都会触发一次。 + *

+ * + * @param processNodeRecordAssignUserParamDto 任务完成参数,包含: + * - userId: 完成任务的用户ID + * - taskId: 任务ID + * - result: 处理结果 + * - comment: 处理意见 + * @return R 响应结果,事件处理状态 + */ + R taskEndEvent(ProcessNodeRecordAssignUserParamDto processNodeRecordAssignUserParamDto); + + /** + * 流程实例结束事件通知 + *

+ * 当整个流程实例结束时触发,包括正常结束和异常终止。用于清理流程数据、 + * 更新最终业务状态、发送结束通知、归档流程数据等。 + *

+ * + * @param processInstanceParamDto 流程实例参数,包含: + * - processInstanceId: 流程实例ID + * - endReason: 结束原因 + * - endType: 结束类型(正常/异常) + * @return R 响应结果,事件处理状态 + */ + R endProcess(ProcessInstanceParamDto processInstanceParamDto); + + /** + * 查询流程的管理员 + *

+ * 获取指定流程的管理员用户ID。流程管理员拥有该流程的最高权限, + * 可以进行流程的编辑、删除、强制结束等操作。通常在权限校验时使用。 + *

+ * + * @param flowId 流程定义ID + * @return R 响应结果,包含流程管理员的用户ID,如果未设置则返回null + */ + R queryProcessAdmin(String flowId); + +} diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/ITaskService.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/ITaskService.java new file mode 100644 index 000000000..f4edd92e2 --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/ITaskService.java @@ -0,0 +1,97 @@ +package com.pig4cloud.pigx.flow.service; + +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.dto.TaskParamDto; + +/** + * 任务处理服务接口 + *

+ * 提供流程任务的核心操作功能,包括任务的查询、完成、委托、退回等。 该服务是流程执行过程中最重要的接口,处理所有与任务相关的业务逻辑。 + *

+ * + * @author pigx + */ +public interface ITaskService { + + /** + * 查询任务详情 + *

+ * 获取任务的详细信息,包括: - 任务基本信息(名称、创建时间、执行人等) - 所属流程信息 - 表单数据和权限 - 历史审批记录 + *

+ * @param taskId 任务ID + * @param view 是否为查看模式(true=只查看,false=处理模式) + * @return 任务详情信息 + */ + R queryTask(String taskId, boolean view); + + /** + * 完成任务 + *

+ * 处理当前任务并使流程继续执行。根据不同的处理结果: - 同意:任务通过,流程按照定义继续执行 - 拒绝:根据拒绝策略结束流程或跳转到指定节点 + *

+ * @param taskParamDto 任务参数,包括任务ID、处理意见、表单数据等 + * @return 任务完成结果 + */ + R completeTask(TaskParamDto taskParamDto); + + /** + * 委托任务(前加签) + *

+ * 将当前任务委托给其他人处理。委托后: - 原执行人不再拥有该任务 - 新执行人完成任务后,需要原执行人确认(resolveTask) - + * 通常用于审批人需要征求他人意见的场景 + *

+ * @param taskParamDto 任务参数,必须包含新执行人信息 + * @return 委托结果 + */ + R delegateTask(TaskParamDto taskParamDto); + + /** + * 加签完成任务 + *

+ * 当任务被委托后,委托人完成任务,原执行人使用此方法确认并完成任务。 这是委托流程的最后一步,确认委托结果并使流程继续。 + *

+ * @param taskParamDto 任务参数 + * @return 任务完成结果 + */ + R resolveTask(TaskParamDto taskParamDto); + + /** + * 设置任务执行人 + *

+ * 修改任务的执行人,通常用于: - 管理员重新分配任务 - 无执行人时指定执行人 - 任务转办 + *

+ * @param taskParamDto 任务参数,必须包含新执行人信息 + * @return 操作结果 + */ + R setAssignee(TaskParamDto taskParamDto); + + /** + * 结束流程实例 + *

+ * 强制结束正在执行的流程实例。通常用于: - 流程异常需要终止 - 管理员强制结束 - 业务需求变更 + *

+ * @param taskParamDto 任务参数,包含结束原因 + * @return 操作结果 + */ + R stopProcessInstance(TaskParamDto taskParamDto); + + /** + * 退回任务 + *

+ * 将当前任务退回到上一个节点或指定节点。通常用于: - 发现上一步审批有误 - 需要补充资料 - 业务流程需要回退重新处理 + *

+ * @param taskParamDto 任务参数,可指定退回到的节点 + * @return 操作结果 + */ + R back(TaskParamDto taskParamDto); + + /** + * 查询首页数据看板 + *

+ * 获取当前用户的任务统计数据,包括: - 待办任务数量 - 已办任务数量 - 我发起的流程数量 - 抄送给我的数量 + *

+ * @return 任务统计数据 + */ + R queryTaskData(); + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/BpmOaLeaveServiceImpl.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/BpmOaLeaveServiceImpl.java similarity index 99% rename from pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/BpmOaLeaveServiceImpl.java rename to pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/BpmOaLeaveServiceImpl.java index 9d3d0c730..d17f876fd 100644 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/BpmOaLeaveServiceImpl.java +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/BpmOaLeaveServiceImpl.java @@ -37,7 +37,7 @@ public class BpmOaLeaveServiceImpl extends ServiceImpl + * 该类负责处理流程分组相关的业务逻辑,主要包括: 1. 查询流程分组及其包含的流程信息 2. 根据用户权限过滤可发起的流程分组 3. 处理流程发起人权限验证 + *

+ * + * @author pigx code generator + * @date 2023-10-01 + */ +@Service +@Slf4j +@RequiredArgsConstructor +public class CombinationGroupServiceImpl implements ICombinationGroupService { + + private final IProcessGroupService processGroupService; + + private final IProcessService processService; + + private final IProcessStarterService processStarterService; + + /** + * 查询表单组包含流程 + *

+ * 根据流程分组ID查询该分组下所有未隐藏的流程,按照排序值升序和创建时间降序排列 + *

+ * @param page 分页参数,用于控制查询结果的分页 + * @param groupId 流程分组ID + * @return R 包含分页后的流程列表 + */ + @Override + public R listGroupWithProcess(Page page, Long groupId) { + return R.ok(processService.lambdaQuery() + .eq(Process::getGroupId, groupId) + .eq(Process::getHidden, YesNoEnum.NO.getCode()) + .orderByAsc(Process::getSort) + .orderByDesc(Process::getCreateTime) + .page(page)); + } + + /** + * 查询所有我可以发起的表单组 + *

+ * 该方法会根据当前登录用户的权限,查询所有可发起的流程分组及其包含的流程。 主要处理逻辑包括: 1. 获取所有流程分组,按排序值升序排列 2. + * 对每个分组查询其下的流程(未隐藏且未停用) 3. 根据流程发起人配置,判断当前用户是否有权限发起 4. 支持用户和部门两种发起人类型的权限判断 5. + * 过滤掉用户无权发起的流程 + *

+ * @return R 包含FormGroupVo列表,每个FormGroupVo包含分组信息和该分组下用户可发起的流程列表 + */ + @Override + public R listCurrentUserStartGroup() { + // 获取当前登录用户信息 + PigxUser user = SecurityUtils.getUser(); + + // 存储所有流程分组及其可发起的流程 + List formGroupVos = new LinkedList<>(); + + // 查询所有流程分组,按排序值升序排列 + List processGroupList = processGroupService.lambdaQuery() + .orderByAsc(ProcessGroup::getSort) + .list(); + + // 遍历每个流程分组 + processGroupList.forEach(group -> { + // 构建流程分组VO对象 + FormGroupVo formGroupVo = FormGroupVo.builder() + .id(group.getId()) + .name(group.getGroupName()) + .items(new LinkedList<>()) + .build(); + formGroupVos.add(formGroupVo); + + // 查询该分组下所有未隐藏且未停用的流程 + List processList = processService.lambdaQuery() + .eq(Process::getGroupId, group.getId()) + .eq(Process::getHidden, YesNoEnum.NO.getCode()) + .eq(Process::getStop, YesNoEnum.NO.getCode()) + .orderByAsc(Process::getSort) + .list(); + + // 用于存储每个流程是否允许当前用户发起的标识 + Map existMap = new HashMap<>(); + + if (!processList.isEmpty()) { + // 获取所有流程ID + List idList = processList.stream().map(Process::getId).toList(); + // 批量查询流程发起人配置 + List processStarterList = processStarterService.lambdaQuery() + .in(ProcessStarter::getProcessId, idList) + .list(); + // 按流程ID分组 + Map> groupmap = processStarterList.stream() + .collect(Collectors.groupingBy(ProcessStarter::getProcessId)); + + // 判断每个流程是否允许当前用户发起 + for (Process process : processList) { + List processStarters = groupmap.get(process.getId()); + // 如果没有配置发起人,则所有人都可以发起 + if (processStarters == null) { + existMap.put(process.getId(), true); + continue; + } + + // 检查是否配置了当前用户为发起人 + boolean match = processStarters.stream() + .anyMatch(w -> w.getTypeId().longValue() == user.getId() + && w.getType().equals(NodeUserTypeEnum.USER.getKey())); + if (match) { + existMap.put(process.getId(), true); + continue; + } + // 检查是否配置了当前用户所在部门为发起人 + Set deptIdSet = processStarters.stream() + .filter(w -> w.getType().equals(NodeUserTypeEnum.DEPT.getKey())) + .map(ProcessStarter::getTypeId) + .collect(Collectors.toSet()); + + boolean contains = CollUtil.containsAny(deptIdSet, user.getDeptIds()); + + if (contains) { + existMap.put(process.getId(), true); + continue; + } + + Set roleSet = processStarters.stream() + .filter(w -> w.getType().equals(NodeUserTypeEnum.ROLE.getKey())) + .map(ProcessStarter::getTypeId) + .collect(Collectors.toSet()); + + boolean roleContains = CollUtil.containsAny(roleSet, SecurityUtils.getRoleIds()); + if (roleContains) { + existMap.put(process.getId(), true); + continue; + } + + Set postSet = processStarters.stream() + .filter(w -> w.getType().equals(NodeUserTypeEnum.POST.getKey())) + .map(ProcessStarter::getTypeId) + .collect(Collectors.toSet()); + + boolean postContains = CollUtil.containsAny(postSet, user.getPostIds()); + existMap.put(process.getId(), postContains); + } + + } + + // 将有权限发起的流程添加到分组中 + processList.forEach(process -> { + + if (!existMap.get(process.getId())) { + return; + } + + formGroupVo.getItems() + .add(FormGroupVo.FlowVo.builder() + .flowId(process.getFlowId()) + .name(process.getName()) + .logo(process.getLogo()) + .remark(process.getRemark()) + .stop(process.getStop()) + .updated(process.getUpdateTime()) + .build()); + }); + }); + return R.ok(formGroupVos); + } + +} diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/FlowableEngineServiceImpl.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/FlowableEngineServiceImpl.java new file mode 100644 index 000000000..69370f367 --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/FlowableEngineServiceImpl.java @@ -0,0 +1,162 @@ +package com.pig4cloud.pigx.flow.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.dto.TaskParamDto; +import com.pig4cloud.pigx.flow.service.IFlowableEngineService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.task.api.Task; +import org.springframework.stereotype.Service; + +import java.util.Map; + +/** + * Flowable引擎服务实现类 + *

+ * 该类提供了对Flowable工作流引擎的高级操作封装,主要包括: + * 1. 委托任务(delegate):将任务委托给其他用户处理 + * 2. 解决委托(resolve):处理完委托任务后返回给原委托人 + * 3. 任务退回(back):将任务退回到指定节点重新处理 + * + * 这些功能扩展了Flowable原生的任务处理能力,为复杂的业务流程提供了更灵活的处理方式 + *

+ * + * @author pigx code generator + * @date 2023-10-01 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class FlowableEngineServiceImpl implements IFlowableEngineService { + + private final TaskService taskService; + private final RuntimeService runtimeService; + + /** + * 委托任务 + *

+ * 将当前任务委托给其他用户处理。委托后,原任务的处理人变为被委托人, + * 但原委托人仍保留对任务的控制权,被委托人完成后需要resolve返回给原委托人 + *

+ * + * @param taskParamDto 任务参数,包含: + * - taskId: 需要委托的任务ID + * - targetUserIdList: 被委托人用户ID列表 + * - taskLocalParamMap: 任务本地变量 + * @return R 操作结果,成功返回R.ok(),失败返回R.failed()及错误信息 + */ + @Override + public R delegateTask(TaskParamDto taskParamDto) { + try { + String taskId = taskParamDto.getTaskId(); + Map taskLocalParamMap = taskParamDto.getTaskLocalParamMap(); + + // 设置本地变量 + if (CollUtil.isNotEmpty(taskLocalParamMap)) { + taskService.setVariablesLocal(taskId, taskLocalParamMap); + } + + // 设置委托标记 + taskService.setVariableLocal(taskId, "delegate", true); + + // 委托任务给目标用户 + for (Long targetUserId : taskParamDto.getTargetUserIdList()) { + taskService.delegateTask(taskId, targetUserId.toString()); + } + + return R.ok(); + } catch (Exception e) { + log.error("委托任务失败", e); + return R.failed("委托任务失败: " + e.getMessage()); + } + } + + /** + * 解决委托任务 + *

+ * 被委托人完成任务处理后,通过此方法将任务返回给原委托人。 + * 该方法会清除委托状态,恢复任务的正常流转 + *

+ * + * @param taskParamDto 任务参数,包含: + * - taskId: 需要解决的委托任务ID + * - taskLocalParamMap: 任务本地变量 + * - paramMap: 任务完成时的全局变量 + * @return R 操作结果,成功返回R.ok(),失败返回R.failed()及错误信息 + */ + @Override + public R resolveTask(TaskParamDto taskParamDto) { + try { + String taskId = taskParamDto.getTaskId(); + Map taskLocalParamMap = taskParamDto.getTaskLocalParamMap(); + + // 设置本地变量 + if (CollUtil.isNotEmpty(taskLocalParamMap)) { + taskService.setVariablesLocal(taskId, taskLocalParamMap); + } + + // 解决委托任务 + taskService.resolveTask(taskId); + + // 完成任务 + if (CollUtil.isNotEmpty(taskParamDto.getParamMap())) { + taskService.complete(taskId, taskParamDto.getParamMap()); + } + + return R.ok(); + } catch (Exception e) { + log.error("解决委托任务失败", e); + return R.failed("解决委托任务失败: " + e.getMessage()); + } + } + + /** + * 退回任务 + *

+ * 将当前任务退回到指定的历史节点重新处理。 + * 该功能常用于审批不通过需要重新修改的场景。 + * 退回操作会保留退回原因和相关信息,便于追溯 + *

+ * + * @param taskParamDto 任务参数,包含: + * - taskId: 需要退回的任务ID + * - targetNodeId: 目标节点ID(退回到的节点) + * - paramMap: 包含退回原因等参数 + * @return R 操作结果,成功返回R.ok(),失败返回R.failed()及错误信息 + */ + @Override + public R back(TaskParamDto taskParamDto) { + try { + String taskId = taskParamDto.getTaskId(); + String targetNodeId = taskParamDto.getTargetNodeId(); + + // 获取当前任务 + Task task = taskService.createTaskQuery().taskId(taskId).singleResult(); + if (task == null) { + return R.failed("任务不存在"); + } + + // 设置退回标记 + Map variables = taskParamDto.getParamMap(); + variables.put("isBack", true); + // 退回原因可以从paramMap中获取 + if (variables.containsKey("comment")) { + variables.put("backReason", variables.get("comment")); + } + + // 使用流程跳转实现退回 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(task.getProcessInstanceId()) + .moveActivityIdTo(task.getTaskDefinitionKey(), targetNodeId) + .changeState(); + + return R.ok(); + } catch (Exception e) { + log.error("退回任务失败", e); + return R.failed("退回任务失败: " + e.getMessage()); + } + } +} \ No newline at end of file diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/ProcessCopyServiceImpl.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/ProcessCopyServiceImpl.java new file mode 100644 index 000000000..2cc4b3b4a --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/ProcessCopyServiceImpl.java @@ -0,0 +1,90 @@ +package com.pig4cloud.pigx.flow.service.impl; + +import cn.hutool.core.lang.Dict; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.dto.Node; +import com.pig4cloud.pigx.flow.entity.Process; +import com.pig4cloud.pigx.flow.entity.ProcessCopy; +import com.pig4cloud.pigx.flow.mapper.ProcessCopyMapper; +import com.pig4cloud.pigx.flow.service.IProcessCopyService; +import com.pig4cloud.pigx.flow.service.IProcessNodeDataService; +import com.pig4cloud.pigx.flow.service.IProcessService; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import org.springframework.stereotype.Service; + +import java.util.Map; + +/** + * 流程抄送数据服务实现类 + *

+ * 该类负责处理流程抄送相关的业务逻辑,主要功能包括: + * 1. 管理流程抄送记录的增删改查 + * 2. 查询抄送详情,包括流程表单、表单数据和权限信息 + * 3. 为被抄送人提供查看流程执行情况的能力 + * + * 抄送功能允许流程在执行过程中通知相关人员,被抄送人可以查看但不参与流程审批 + *

+ * + * @author Vincent + * @since 2023-05-20 + */ +@Service +@RequiredArgsConstructor +public class ProcessCopyServiceImpl extends ServiceImpl implements IProcessCopyService { + + private final ObjectMapper objectMapper; + + private final IProcessService processService; + + private final IProcessNodeDataService nodeDataService; + + /** + * 查询单个抄送详细信息 + *

+ * 根据抄送记录ID查询完整的抄送详情,包括: + * 1. 流程定义信息(process) + * 2. 表单项定义(formItems) + * 3. 表单数据(formData)- 流程实例的实际填写数据 + * 4. 表单权限(formPerms)- 基于当前节点的表单字段权限设置 + * + * 该方法主要用于抄送人查看被抄送的流程详情 + *

+ * + * @param id 抄送记录ID + * @return R 包含流程详情的响应对象,包括process、formItems、formData、formPerms + * @throws Exception 当解析JSON数据失败时抛出异常 + */ + @SneakyThrows + @Override + public R querySingleDetail(long id) { + // 获取抄送记录 + ProcessCopy processCopy = this.getById(id); + String flowId = processCopy.getFlowId(); + + // 查询流程定义 + Process oaForms = processService.getByFlowId(flowId); + if (oaForms == null) { + return R.failed("流程不存在"); + } + + // 获取表单数据和节点信息 + String formData = processCopy.getFormData(); + String nodeId = processCopy.getNodeId(); + + // 获取节点的表单权限配置 + Node node = nodeDataService.getNodeData(flowId, nodeId).getData(); + Map formPerms = node.getFormPerms(); + + // 构建返回数据 + Dict set = Dict.create() + .set("process", oaForms.getProcess()) // 流程定义 + .set("formItems", oaForms.getFormItems()) // 表单项定义 + .set("formData", formData) // 表单数据 + .set("formPerms", formPerms); // 表单权限 + return R.ok(set); + } + +} diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/ProcessGroupServiceImpl.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/ProcessGroupServiceImpl.java new file mode 100644 index 000000000..728870c7e --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/ProcessGroupServiceImpl.java @@ -0,0 +1,80 @@ +package com.pig4cloud.pigx.flow.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.entity.ProcessGroup; +import com.pig4cloud.pigx.flow.mapper.ProcessGroupMapper; +import com.pig4cloud.pigx.flow.service.IProcessGroupService; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 流程分组服务实现类 + *

+ * 该类负责管理流程分组相关的业务逻辑,主要功能包括: + * 1. 流程分组的增删改查操作 + * 2. 分组排序管理 + * 3. 为流程提供分类组织功能 + * + * 流程分组用于将相似或相关的流程进行分类管理,便于用户查找和使用 + *

+ * + * @author Vincent + * @since 2023-05-25 + */ +@Service +public class ProcessGroupServiceImpl extends ServiceImpl + implements IProcessGroupService { + + /** + * 查询所有流程分组列表 + *

+ * 获取系统中所有的流程分组,按照排序值(sort)升序排列 + *

+ * + * @return R> 包含所有流程分组的列表 + */ + @Override + public R> queryList() { + List processGroupList = this.lambdaQuery().orderByAsc(ProcessGroup::getSort).list(); + + return R.ok(processGroupList); + } + + /** + * 新增表单分组 + *

+ * 创建一个新的流程分组,默认排序值为0 + *

+ * + * @param processGroup 分组对象,需要包含groupName(分组名称) + * @return R 操作结果,成功返回R.ok() + */ + @Override + public R create(ProcessGroup processGroup) { + ProcessGroup pg = new ProcessGroup(); + pg.setSort(0); + pg.setGroupName(processGroup.getGroupName()); + + this.save(pg); + return R.ok(); + } + + /** + * 删除分组 + *

+ * 根据分组ID删除流程分组。 + * 注意:删除分组前应确保该分组下没有关联的流程,否则可能导致数据不一致 + *

+ * + * @param id 分组ID + * @return R 操作结果,成功返回R.ok() + */ + @Override + public R delete(long id) { + this.removeById(id); + return R.ok(); + } + +} diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/ProcessInstanceRecordServiceImpl.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/ProcessInstanceRecordServiceImpl.java new file mode 100644 index 000000000..ad746fbbf --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/ProcessInstanceRecordServiceImpl.java @@ -0,0 +1,28 @@ +package com.pig4cloud.pigx.flow.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.flow.entity.ProcessInstanceRecord; +import com.pig4cloud.pigx.flow.mapper.ProcessInstanceRecordMapper; +import com.pig4cloud.pigx.flow.service.IProcessInstanceRecordService; +import org.springframework.stereotype.Service; + +/** + * 流程实例记录服务实现类 + *

+ * 该类负责管理流程实例的历史记录,主要功能包括: + * 1. 记录流程实例的创建、执行、完成等状态变化 + * 2. 保存流程实例的快照信息,包括流程变量、表单数据等 + * 3. 提供流程实例历史数据的查询功能 + * 4. 支持流程追踪和审计需求 + * + * 该服务是流程执行历史的重要存储,用于流程回溯、统计分析等场景 + *

+ * + * @author Vincent + * @since 2023-05-07 + */ +@Service +public class ProcessInstanceRecordServiceImpl extends ServiceImpl + implements IProcessInstanceRecordService { + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessInstanceServiceImpl.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/ProcessInstanceServiceImpl.java similarity index 100% rename from pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessInstanceServiceImpl.java rename to pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/ProcessInstanceServiceImpl.java diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessNodeRecordAssignUserServiceImpl.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/ProcessNodeRecordAssignUserServiceImpl.java similarity index 53% rename from pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessNodeRecordAssignUserServiceImpl.java rename to pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/ProcessNodeRecordAssignUserServiceImpl.java index 3356dfd7b..f0e81029f 100644 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessNodeRecordAssignUserServiceImpl.java +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/ProcessNodeRecordAssignUserServiceImpl.java @@ -1,21 +1,28 @@ -package com.pig4cloud.pigx.flow.task.service.impl; +package com.pig4cloud.pigx.flow.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.pig4cloud.pigx.common.core.util.R; -import com.pig4cloud.pigx.flow.task.constant.NodeStatusEnum; -import com.pig4cloud.pigx.flow.task.dto.ProcessNodeRecordAssignUserParamDto; -import com.pig4cloud.pigx.flow.task.entity.ProcessNodeRecordAssignUser; -import com.pig4cloud.pigx.flow.task.mapper.ProcessNodeRecordAssignUserMapper; -import com.pig4cloud.pigx.flow.task.service.IProcessNodeRecordAssignUserService; +import com.pig4cloud.pigx.flow.constant.NodeStatusEnum; +import com.pig4cloud.pigx.flow.dto.ProcessNodeRecordAssignUserParamDto; +import com.pig4cloud.pigx.flow.entity.ProcessNodeRecordAssignUser; +import com.pig4cloud.pigx.flow.mapper.ProcessNodeRecordAssignUserMapper; +import com.pig4cloud.pigx.flow.service.IProcessNodeRecordAssignUserService; import org.springframework.stereotype.Service; import java.time.LocalDateTime; /** + * 流程节点记录-执行人服务实现类 *

- * 流程节点记录-执行人 服务实现类 + * 该类负责管理流程节点的执行人记录,主要功能包括: + * 1. 记录每个节点的执行人分配情况 + * 2. 跟踪执行人的任务处理状态(进行中、已完成) + * 3. 保存执行人的审批意见和处理时间 + * 4. 处理任务完成事件,更新执行记录 + * + * 每个流程节点可能有多个执行人(如会签),该服务记录每个执行人的处理情况 *

* * @author cxygzl @@ -28,11 +35,25 @@ public class ProcessNodeRecordAssignUserServiceImpl /** * 设置执行人 - * @param processNodeRecordAssignUserParamDto - * @return + *

+ * 为流程节点分配执行人,主要处理逻辑: + * 1. 如果是带审批意见的操作(如委托、转办),更新上一条记录的审批意见和状态 + * 2. 创建新的执行人记录,状态为"进行中" + * 3. 记录任务开始时间 + * + * 该方法支持任务的转办、委托等场景 + *

+ * + * @param processNodeRecordAssignUserParamDto 执行人参数,包含: + * - taskId: 任务ID + * - userId: 执行人ID + * - approveDesc: 审批意见(可选) + * - taskType: 任务类型(转办、委托等) + * @return R 操作结果 */ @Override public R addAssignUser(ProcessNodeRecordAssignUserParamDto processNodeRecordAssignUserParamDto) { + // 如果有审批意见,说明是转办、委托等操作,需要更新上一条记录 if (StrUtil.isNotBlank(processNodeRecordAssignUserParamDto.getApproveDesc())) { ProcessNodeRecordAssignUser processNodeRecordAssignUser = this.lambdaQuery() .eq(ProcessNodeRecordAssignUser::getTaskId, processNodeRecordAssignUserParamDto.getTaskId()) @@ -40,6 +61,7 @@ public class ProcessNodeRecordAssignUserServiceImpl .last("limit 1") .one(); if (processNodeRecordAssignUser != null) { + // 更新上一个执行人的记录为已完成 processNodeRecordAssignUser.setApproveDesc(processNodeRecordAssignUserParamDto.getApproveDesc()); processNodeRecordAssignUser.setTaskType(processNodeRecordAssignUserParamDto.getTaskType()); processNodeRecordAssignUser.setStatus(NodeStatusEnum.YJS.getCode()); @@ -49,10 +71,11 @@ public class ProcessNodeRecordAssignUserServiceImpl } + // 创建新的执行人记录 ProcessNodeRecordAssignUser processNodeRecordAssignUser = BeanUtil .copyProperties(processNodeRecordAssignUserParamDto, ProcessNodeRecordAssignUser.class); processNodeRecordAssignUser.setStartTime(LocalDateTime.now()); - processNodeRecordAssignUser.setStatus(NodeStatusEnum.JXZ.getCode()); + processNodeRecordAssignUser.setStatus(NodeStatusEnum.JXZ.getCode()); // 进行中状态 processNodeRecordAssignUser.setApproveDesc(""); processNodeRecordAssignUser.setTaskType(""); this.save(processNodeRecordAssignUser); @@ -62,11 +85,26 @@ public class ProcessNodeRecordAssignUserServiceImpl /** * 任务完成通知 - * @param processNodeRecordAssignUserParamDto - * @return + *

+ * 处理任务完成事件,更新执行人记录的状态。主要功能: + * 1. 根据任务ID和用户ID查找进行中的执行记录 + * 2. 更新记录状态为已完成 + * 3. 保存审批意见、结束时间和任务数据 + * + * 该方法在任务完成时被调用,记录任务的完成信息 + *

+ * + * @param processNodeRecordAssignUserParamDto 任务完成参数,包含: + * - taskId: 任务ID + * - userId: 执行人ID + * - approveDesc: 审批意见 + * - data: 任务数据(JSON格式) + * - localData: 本地任务数据 + * @return R 操作结果 */ @Override public R completeTaskEvent(ProcessNodeRecordAssignUserParamDto processNodeRecordAssignUserParamDto) { + // 查找进行中的执行人记录 ProcessNodeRecordAssignUser processNodeRecordAssignUser = this.lambdaQuery() .eq(ProcessNodeRecordAssignUser::getTaskId, processNodeRecordAssignUserParamDto.getTaskId()) .eq(ProcessNodeRecordAssignUser::getUserId, processNodeRecordAssignUserParamDto.getUserId()) @@ -76,6 +114,8 @@ public class ProcessNodeRecordAssignUserServiceImpl .orderByDesc(ProcessNodeRecordAssignUser::getId) .last("limit 1") .one(); + + // 更新记录为已完成状态 processNodeRecordAssignUser.setStatus(NodeStatusEnum.YJS.getCode()); processNodeRecordAssignUser.setApproveDesc(processNodeRecordAssignUserParamDto.getApproveDesc()); processNodeRecordAssignUser.setEndTime(LocalDateTime.now()); diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/ProcessNodeRecordServiceImpl.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/ProcessNodeRecordServiceImpl.java new file mode 100644 index 000000000..c6e7429e9 --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/ProcessNodeRecordServiceImpl.java @@ -0,0 +1,88 @@ +package com.pig4cloud.pigx.flow.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.constant.NodeStatusEnum; +import com.pig4cloud.pigx.flow.dto.ProcessNodeRecordParamDto; +import com.pig4cloud.pigx.flow.entity.ProcessNodeRecord; +import com.pig4cloud.pigx.flow.mapper.ProcessNodeRecordMapper; +import com.pig4cloud.pigx.flow.service.IProcessNodeRecordService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.Date; + +/** + * 流程节点记录服务实现类 + *

+ * 该类负责管理流程节点的执行记录,主要功能包括: + * 1. 记录流程节点的开始和结束时间 + * 2. 跟踪节点的执行状态(进行中、已完成) + * 3. 保存节点执行的历史记录,用于流程追踪 + * + * 每个流程实例的每个节点都会生成一条记录,记录节点的执行情况 + *

+ * + * @author cxygzl + * @since 2023-05-10 + */ +@Slf4j +@Service +public class ProcessNodeRecordServiceImpl extends ServiceImpl + implements IProcessNodeRecordService { + + /** + * 节点开始 + *

+ * 记录流程节点的开始执行。当流程执行到某个节点时, + * 创建该节点的执行记录,设置开始时间和进行中状态 + *

+ * + * @param processNodeRecordParamDto 节点记录参数,包含: + * - processInstanceId: 流程实例ID + * - nodeId: 节点ID + * - nodeName: 节点名称 + * - nodeType: 节点类型 + * @return R 操作结果 + */ + @Override + public R start(ProcessNodeRecordParamDto processNodeRecordParamDto) { + + ProcessNodeRecord processNodeRecord = BeanUtil.copyProperties(processNodeRecordParamDto, + ProcessNodeRecord.class); + processNodeRecord.setStartTime(new Date()); + processNodeRecord.setStatus(NodeStatusEnum.JXZ.getCode()); + + this.save(processNodeRecord); + return R.ok(); + } + + /** + * 节点结束 + *

+ * 记录流程节点的结束执行。当节点上的所有任务都完成后, + * 更新节点记录的状态为已完成,并设置结束时间 + *

+ * + * @param processNodeRecordParamDto 节点记录参数,包含: + * - processInstanceId: 流程实例ID + * - nodeId: 节点ID + * @return R 操作结果 + */ + @Override + public R complete(ProcessNodeRecordParamDto processNodeRecordParamDto) { + + log.info("节点结束---{}", processNodeRecordParamDto); + + // TODO 完成节点和完成任务要区分下 + this.lambdaUpdate() + .set(ProcessNodeRecord::getStatus, NodeStatusEnum.YJS.getCode()) + .set(ProcessNodeRecord::getEndTime, new Date()) + .eq(ProcessNodeRecord::getProcessInstanceId, processNodeRecordParamDto.getProcessInstanceId()) + .eq(ProcessNodeRecord::getNodeId, processNodeRecordParamDto.getNodeId()) + .update(new ProcessNodeRecord()); + return R.ok(); + } + +} diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/ProcessServiceImpl.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/ProcessServiceImpl.java index 7ef33cf00..08b48bf1b 100644 --- a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/ProcessServiceImpl.java +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/ProcessServiceImpl.java @@ -10,6 +10,7 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; @@ -36,7 +37,6 @@ import org.flowable.bpmn.converter.BpmnXMLConverter; import org.flowable.bpmn.model.BpmnModel; import org.flowable.engine.RepositoryService; import org.flowable.engine.repository.Deployment; -import org.flowable.engine.repository.ProcessDefinition; import org.springframework.stereotype.Service; import java.util.Date; @@ -195,15 +195,6 @@ public class ProcessServiceImpl extends ServiceImpl impl } Process oldProcess = this.getByFlowId(flowId); - if (Objects.nonNull(oldProcess) && StrUtil.isNotBlank(oldProcess.getUniqueId())) { - // 挂起原有流程定义 - String oldDeploymentId = oldProcess.getUniqueId(); - - ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery() - .deploymentId(oldDeploymentId) - .singleResult(); - repositoryService.suspendProcessDefinitionById(processDefinition.getId(), true, null); - } Deployment deployment = repositoryService.createDeployment() .addBpmnModel(StrUtil.format("{}.bpmn20.xml", "pig"), bpmnModel) @@ -268,10 +259,11 @@ public class ProcessServiceImpl extends ServiceImpl impl p.setRangeShow(stringBuilder.toString()); this.saveOrUpdate(p); - // 保存范围 + // 删除原有发起范围 + processStarterService + .remove(Wrappers.lambdaQuery().eq(ProcessStarter::getProcessId, p.getId())); for (NodeUser nodeUserDto : nodeUserList) { ProcessStarter processStarter = new ProcessStarter(); - processStarter.setProcessId(p.getId()); processStarter.setTypeId(nodeUserDto.getId()); processStarter.setType(nodeUserDto.getType()); diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/ProcessStarterServiceImpl.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/ProcessStarterServiceImpl.java new file mode 100644 index 000000000..6038520b1 --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/ProcessStarterServiceImpl.java @@ -0,0 +1,28 @@ +package com.pig4cloud.pigx.flow.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.flow.entity.ProcessStarter; +import com.pig4cloud.pigx.flow.mapper.ProcessStarterMapper; +import com.pig4cloud.pigx.flow.service.IProcessStarterService; +import org.springframework.stereotype.Service; + +/** + * 流程发起人服务实现类 + *

+ * 该类负责管理流程的发起人权限配置,主要功能包括: + * 1. 配置哪些用户可以发起特定流程 + * 2. 配置哪些部门可以发起特定流程 + * 3. 支持按用户、部门等不同维度设置发起权限 + * 4. 为流程列表的权限过滤提供数据支持 + * + * 通过该服务,可以精确控制流程的发起权限,确保只有授权的用户才能发起相应的流程 + *

+ * + * @author Vincent + * @since 2023-05-30 + */ +@Service +public class ProcessStarterServiceImpl extends ServiceImpl + implements IProcessStarterService { + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/RemoteServiceImpl.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/RemoteServiceImpl.java similarity index 58% rename from pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/RemoteServiceImpl.java rename to pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/RemoteServiceImpl.java index f7e0c7419..bee635a9b 100644 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/RemoteServiceImpl.java +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/RemoteServiceImpl.java @@ -1,4 +1,4 @@ -package com.pig4cloud.pigx.flow.task.service.impl; +package com.pig4cloud.pigx.flow.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; @@ -10,13 +10,13 @@ import com.pig4cloud.pigx.admin.api.feign.RemoteDeptService; import com.pig4cloud.pigx.admin.api.feign.RemoteUserService; import com.pig4cloud.pigx.admin.api.utils.DataUtil; import com.pig4cloud.pigx.common.core.util.R; -import com.pig4cloud.pigx.flow.task.constant.NodeStatusEnum; -import com.pig4cloud.pigx.flow.task.dto.*; -import com.pig4cloud.pigx.flow.task.entity.Process; -import com.pig4cloud.pigx.flow.task.entity.ProcessCopy; -import com.pig4cloud.pigx.flow.task.entity.ProcessGroup; -import com.pig4cloud.pigx.flow.task.entity.ProcessInstanceRecord; -import com.pig4cloud.pigx.flow.task.service.*; +import com.pig4cloud.pigx.flow.constant.NodeStatusEnum; +import com.pig4cloud.pigx.flow.dto.*; +import com.pig4cloud.pigx.flow.entity.Process; +import com.pig4cloud.pigx.flow.entity.ProcessCopy; +import com.pig4cloud.pigx.flow.entity.ProcessGroup; +import com.pig4cloud.pigx.flow.entity.ProcessInstanceRecord; +import com.pig4cloud.pigx.flow.service.*; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -25,6 +25,22 @@ import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; +/** + * 远程服务接口实现类 + *

+ * 该类为流程引擎提供远程调用接口,主要功能包括: + * 1. 用户和部门数据查询(角色、部门关联的用户等) + * 2. 流程事件处理(节点开始、结束、任务分配等) + * 3. 抄送功能的保存和处理 + * 4. 部门层级关系的判断 + * 5. 流程管理员查询 + * + * 该服务作为流程引擎与业务系统的桥梁,处理流程执行过程中的各种回调事件 + *

+ * + * @author pigx code generator + * @date 2023-10-01 + */ @Service @Slf4j @RequiredArgsConstructor @@ -50,8 +66,12 @@ public class RemoteServiceImpl implements IRemoteService { /** * 根据角色id集合查询用户id集合 - * @param roleIdList - * @return + *

+ * 查询拥有指定角色的所有用户ID,用于流程节点的角色审批人设置 + *

+ * + * @param roleIdList 角色ID列表 + * @return R> 拥有这些角色的用户ID列表 */ @Override public R> queryUserIdListByRoleIdList(List roleIdList) { @@ -60,8 +80,14 @@ public class RemoteServiceImpl implements IRemoteService { /** * 保存抄送 - * @param copyDto - * @return + *

+ * 异步保存流程抄送记录。由于抄送可能在流程的第一个节点, + * 此时流程实例记录可能还未创建,因此采用异步重试机制, + * 最多重试10次,每次间隔5秒,确保抄送记录能正确保存 + *

+ * + * @param copyDto 抄送信息,包含流程实例ID、抄送人、节点信息等 + * @return R 操作结果 */ @Override public R saveCC(ProcessCopyDto copyDto) { @@ -102,8 +128,13 @@ public class RemoteServiceImpl implements IRemoteService { /** * 检查是否是所有的父级 - * @param checkParentDto - * @return + *

+ * 判断给定的部门ID列表是否都是指定部门的父级部门。 + * 用于流程审批中的"部门主管"、"上级部门"等审批人设置 + *

+ * + * @param checkParentDto 包含父级部门ID和待检查的部门ID列表 + * @return R 如果所有部门都是父级返回true,否则返回false */ @Override public R checkIsAllParent(CheckParentDto checkParentDto) { @@ -114,7 +145,7 @@ public class RemoteServiceImpl implements IRemoteService { List allDept = deptService.getAllDept(null).getData(); List childrenDeptList = DataUtil.selectChildrenByDept(parentId, allDept); - List childrenDeptIdList = childrenDeptList.stream().map(SysDept::getDeptId).toList(); + List childrenDeptIdList = childrenDeptList.stream().map(SysDept::getDeptId).toList(); childrenDeptIdList.remove(parentId); List remainIdList = CollUtil.removeAny(deptIdList, ArrayUtil.toArray(childrenDeptIdList, Long.class)); @@ -124,8 +155,12 @@ public class RemoteServiceImpl implements IRemoteService { /** * 根据部门id集合查询用户id集合 - * @param depIdList - * @return + *

+ * 查询指定部门下的所有用户ID,用于流程节点的部门审批人设置 + *

+ * + * @param depIdList 部门ID列表 + * @return R> 这些部门下的所有用户ID列表 */ @Override public R> queryUserIdListByDepIdList(List depIdList) { @@ -139,8 +174,13 @@ public class RemoteServiceImpl implements IRemoteService { /** * 检查是否是所有的子级 - * @param checkChildDto - * @return + *

+ * 判断给定的部门ID列表是否都是指定部门的子级部门。 + * 用于流程审批中的下级部门相关的审批人设置 + *

+ * + * @param checkChildDto 包含子级部门ID和待检查的部门ID列表 + * @return R 如果所有部门都是子级返回true,否则返回false */ @Override public R checkIsAllChild(CheckChildDto checkChildDto) { @@ -149,7 +189,7 @@ public class RemoteServiceImpl implements IRemoteService { // 查询父级包括自己 List allDept = deptService.getAllDept(null).getData(); List parentDeptList = DataUtil.selectParentByDept(childId, allDept); - List parentDeptIdList = parentDeptList.stream().map(SysDept::getDeptId).toList(); + List parentDeptIdList = parentDeptList.stream().map(SysDept::getDeptId).toList(); parentDeptIdList.remove(childId); List remainIdList = CollUtil.removeAny(deptIdList, ArrayUtil.toArray(parentDeptIdList, Long.class)); return R.ok(remainIdList.isEmpty()); @@ -157,8 +197,13 @@ public class RemoteServiceImpl implements IRemoteService { /** * 获取用户的信息-包括扩展字段 - * @param userId - * @return + *

+ * 查询用户的完整信息,包括基本信息和扩展字段。 + * 用于流程表单中需要获取用户详细信息的场景 + *

+ * + * @param userId 用户ID + * @return R> 用户信息的Map格式,包含所有字段 */ @Override public R> queryUserAllInfo(long userId) { @@ -168,8 +213,12 @@ public class RemoteServiceImpl implements IRemoteService { /** * 开始节点事件 - * @param recordParamDto - * @return + *

+ * 处理流程节点开始执行的事件,记录节点的开始时间和状态 + *

+ * + * @param recordParamDto 节点记录参数 + * @return R 操作结果 */ @Override public R startNodeEvent(ProcessNodeRecordParamDto recordParamDto) { @@ -178,8 +227,13 @@ public class RemoteServiceImpl implements IRemoteService { /** * 流程创建了 - * @param processInstanceRecordParamDto - * @return + *

+ * 处理流程实例创建事件,保存流程实例的基本信息,包括: + * 流程名称、所属分组、发起人、logo等信息 + *

+ * + * @param processInstanceRecordParamDto 流程实例参数,包含流程ID、实例ID、用户ID等 + * @return R 操作结果 */ @Override public R createProcessEvent(ProcessInstanceRecordParamDto processInstanceRecordParamDto) { @@ -206,8 +260,12 @@ public class RemoteServiceImpl implements IRemoteService { /** * 完成节点事件 - * @param recordParamDto - * @return + *

+ * 处理流程节点完成事件,更新节点记录的结束时间和状态 + *

+ * + * @param recordParamDto 节点记录参数 + * @return R 操作结果 */ @Override public R endNodeEvent(ProcessNodeRecordParamDto recordParamDto) { @@ -216,8 +274,12 @@ public class RemoteServiceImpl implements IRemoteService { /** * 开始设置执行人 - * @param processNodeRecordAssignUserParamDto - * @return + *

+ * 为流程节点分配执行人,记录任务的分配信息 + *

+ * + * @param processNodeRecordAssignUserParamDto 执行人分配参数 + * @return R 操作结果 */ @Override public R startAssignUser(ProcessNodeRecordAssignUserParamDto processNodeRecordAssignUserParamDto) { @@ -226,8 +288,12 @@ public class RemoteServiceImpl implements IRemoteService { /** * 任务结束事件 - * @param processNodeRecordAssignUserParamDto - * @return + *

+ * 处理任务完成事件,更新执行人的任务完成状态和审批意见 + *

+ * + * @param processNodeRecordAssignUserParamDto 任务完成参数 + * @return R 操作结果 */ @Override public R taskEndEvent(ProcessNodeRecordAssignUserParamDto processNodeRecordAssignUserParamDto) { @@ -235,20 +301,28 @@ public class RemoteServiceImpl implements IRemoteService { } /** - * 结束流程实例的方法 - * - * @param processInstanceParamDto 包含流程实例标识的参数对象 - * @return 流程实例结束操作的响应结果 + * 结束流程实例的方法 + *

+ * 处理流程实例结束事件,更新流程实例的结束时间、状态和结束原因 + *

+ * + * @param processInstanceParamDto 包含流程实例标识的参数对象 + * @return R 流程实例结束操作的响应结果 */ @Override - public R endProcess(ProcessInstanceParamDto processInstanceParamDto) { - return processInstanceService.end(processInstanceParamDto); + public R endProcess(ProcessInstanceParamDto processInstanceParamDto) { + return processInstanceService.end(processInstanceParamDto); } /** * 查询流程管理员 - * @param flowId - * @return + *

+ * 根据流程ID查询该流程的管理员ID。 + * 流程管理员拥有该流程的最高权限,可以进行流程的编辑、删除等操作 + *

+ * + * @param flowId 流程ID + * @return R 流程管理员的用户ID */ @Override public R queryProcessAdmin(String flowId) { diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/TaskServiceImpl.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/TaskServiceImpl.java index 70b6e43e5..aac8309aa 100644 --- a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/TaskServiceImpl.java +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/TaskServiceImpl.java @@ -256,6 +256,12 @@ public class TaskServiceImpl implements ITaskService { taskService.setVariablesLocal(taskParamDto.getTaskId(), taskLocalParamMap); } + if (CollUtil.isNotEmpty(taskParamDto.getFormData())) { + // 获取当前任务 + Task task = taskService.createTaskQuery().taskId(taskParamDto.getTaskId()).singleResult(); + runtimeService.setVariables(task.getExecutionId(), taskParamDto.getFormData()); + } + taskService.complete(taskParamDto.getTaskId(), taskParamDto.getParamMap()); return R.ok(); @@ -315,6 +321,11 @@ public class TaskServiceImpl implements ITaskService { for (Long targetUserId : taskParamDto.getTargetUserIdList()) { taskService.setAssignee(taskParamDto.getTaskId(), targetUserId.toString()); } + + // 更新表单 + if (CollUtil.isNotEmpty(taskParamDto.getFormData())) { + runtimeService.setVariables(task.getExecutionId(), taskParamDto.getFormData()); + } return R.ok(); } diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/packge-info.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/packge-info.java new file mode 100644 index 000000000..842444f34 --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/packge-info.java @@ -0,0 +1,4 @@ +/* + * @author pigx archetype + */ +package com.pig4cloud.pigx.flow.service; \ No newline at end of file diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/ExpressionHandler.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/expression/ExpressionHandler.java similarity index 60% rename from pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/ExpressionHandler.java rename to pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/expression/ExpressionHandler.java index 45e379995..628cf5f6f 100644 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/ExpressionHandler.java +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/expression/ExpressionHandler.java @@ -1,4 +1,4 @@ -package com.pig4cloud.pigx.flow.engine.expression; +package com.pig4cloud.pigx.flow.support.expression; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; @@ -14,9 +14,9 @@ import com.googlecode.aviator.AviatorEvaluator; import com.pig4cloud.pigx.admin.api.entity.SysUser; import com.pig4cloud.pigx.admin.api.feign.RemoteUserService; import com.pig4cloud.pigx.common.core.util.R; -import com.pig4cloud.pigx.flow.task.constant.NodeUserTypeEnum; -import com.pig4cloud.pigx.flow.task.dto.NodeUser; -import com.pig4cloud.pigx.flow.task.dto.SelectValue; +import com.pig4cloud.pigx.flow.constant.NodeUserTypeEnum; +import com.pig4cloud.pigx.flow.dto.NodeUser; +import com.pig4cloud.pigx.flow.dto.SelectValue; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -27,7 +27,14 @@ import java.math.BigDecimal; import java.util.List; /** - * 表达式解析 + * 流程表达式处理器 + *

+ * 该类负责处理流程节点中的条件表达式,支持多种数据类型的比较和判断: 1. 日期时间类型的比较 2. 数字类型的比较和包含判断 3. 字符串的相等和包含判断 4. + * 单选/多选的判断 5. 部门和用户的归属判断 + *

+ * 使用Aviator表达式引擎进行动态表达式计算,支持在流程定义中配置灵活的条件判断逻辑 + * + * @author pigx */ @Slf4j @Component("expressionHandler") @@ -38,6 +45,13 @@ public class ExpressionHandler { private final ObjectMapper objectMapper; + /** + * 从流程变量中获取用户ID + * @param key 流程变量的键名 + * @param execution 流程执行上下文 + * @return 用户ID + * @throws Exception 当JSON解析失败时抛出异常 + */ @SneakyThrows public Long getUserId(String key, DelegateExecution execution) { Object variable = execution.getVariable(key); @@ -50,12 +64,14 @@ public class ExpressionHandler { /** * 日期时间比较 - * @param key - * @param symbol - * @param param - * @param execution - * @param format 时间格式化模式 - * @return + *

+ * 比较流程变量中的日期时间值与给定参数值的大小关系 + * @param key 流程变量的键名 + * @param symbol 比较符号(如:>, <, >=, <=, ==, !=) + * @param param 比较的参数值 + * @param execution 流程执行上下文 + * @param format 时间格式化模式(如:yyyy-MM-dd HH:mm:ss) + * @return 比较结果,true表示条件成立,false表示条件不成立 */ public boolean dateTimeCompare(String key, String symbol, Object param, DelegateExecution execution, String format) { @@ -75,11 +91,13 @@ public class ExpressionHandler { /** * 数字类型比较 - * @param key 表单key - * @param symbol 比较符号 - * @param param 表单参数 - * @param execution - * @return + *

+ * 比较流程变量中的数字值与给定参数值的大小关系 + * @param key 表单key,对应流程变量的键名 + * @param symbol 比较符号(如:>, <, >=, <=, ==, !=) + * @param param 比较的参数值 + * @param execution 流程执行上下文 + * @return 比较结果,true表示条件成立,false表示条件不成立 */ public boolean numberCompare(String key, String symbol, Object param, DelegateExecution execution) { @@ -94,6 +112,14 @@ public class ExpressionHandler { } + /** + * 通用比较方法 + *

+ * 使用Aviator表达式引擎执行比较表达式 + * @param symbol 包含比较符号的表达式字符串 + * @param value 包含变量值的字典 + * @return 比较结果 + */ private Boolean compare(String symbol, Dict value) { Object result = AviatorEvaluator.getInstance().execute(symbol, value); // 渲染结果 @@ -103,12 +129,14 @@ public class ExpressionHandler { /** * 日期类型对比 - * @param key 表单key - * @param symbol 比较符号 - * @param param 比较参数值 - * @param execution 上下午执行前 - * @param format 日期格式化字符串 - * @return + *

+ * 比较流程变量中的日期值与给定参数日期的大小关系 + * @param key 表单key,对应流程变量的键名 + * @param symbol 比较符号(如:>, <, >=, <=, ==, !=) + * @param param 比较的参数日期值 + * @param execution 流程执行上下文 + * @param format 日期格式化字符串(如:yyyy-MM-dd) + * @return 比较结果,true表示条件成立,false表示条件不成立 */ public boolean dateCompare(String key, String symbol, Object param, DelegateExecution execution, String format) { @@ -134,9 +162,12 @@ public class ExpressionHandler { /** * 判断数字数组包含 - * @param key 表单key - * @param array 条件值 - * @return + *

+ * 检查流程变量中的数字值是否在给定的数组中 + * @param key 表单key,对应流程变量的键名 + * @param execution 流程执行上下文 + * @param array 条件值数组 + * @return true表示包含,false表示不包含 */ public boolean numberContain(String key, DelegateExecution execution, Object... array) { @@ -149,6 +180,12 @@ public class ExpressionHandler { return numberContain(value, array); } + /** + * 内部方法:检查数字值是否在数组中 + * @param value 要检查的值 + * @param array 目标数组 + * @return true表示包含,false表示不包含 + */ private static boolean numberContain(Object value, Object[] array) { BigDecimal valueBigDecimal = Convert.toBigDecimal(value); @@ -162,9 +199,12 @@ public class ExpressionHandler { /** * 单选处理 - * @param key 表单key - * @param array 条件值 - * @return + *

+ * 检查单选表单的选中值是否在给定的数组中 + * @param key 表单key,对应流程变量的键名 + * @param execution 流程执行上下文 + * @param array 条件值数组 + * @return true表示选中值在数组中,false表示不在 */ public boolean singleSelectHandler(String key, DelegateExecution execution, String... array) { Object value = execution.getVariable(key); @@ -181,9 +221,12 @@ public class ExpressionHandler { /** * 字符串判断包含 - * @param key 表单key - * @param param 参数 - * @return + *

+ * 检查流程变量中的字符串值是否包含指定的子串 + * @param key 表单key,对应流程变量的键名 + * @param param 要查找的子串 + * @param execution 流程执行上下文 + * @return true表示包含,false表示不包含 */ public boolean stringContain(String key, String param, DelegateExecution execution) { Object value = execution.getVariable(key); @@ -196,9 +239,12 @@ public class ExpressionHandler { /** * 字符串判断相等 - * @param key 表单key - * @param param 参数 - * @return + *

+ * 检查流程变量中的字符串值是否与给定参数相等 + * @param key 表单key,对应流程变量的键名 + * @param param 比较的参数值 + * @param execution 流程执行上下文 + * @return true表示相等,false表示不相等 */ public boolean stringEqual(String key, String param, DelegateExecution execution) { Object value = execution.getVariable(key); @@ -209,6 +255,17 @@ public class ExpressionHandler { return StrUtil.equals(value.toString(), param); } + /** + * 部门比较 + *

+ * 检查流程变量中的部门是否满足给定的条件(属于或不属于指定部门列表) + * @param key 表单key,对应流程变量的键名 + * @param param 部门列表参数(JSON格式) + * @param symbol 比较符号(in/==:属于,notin/!=:不属于) + * @param execution 流程执行上下文 + * @return 比较结果 + * @throws Exception 当JSON解析失败时抛出异常 + */ @SneakyThrows public boolean deptCompare(String key, String param, String symbol, DelegateExecution execution) { param = EscapeUtil.unescape(param); @@ -235,12 +292,19 @@ public class ExpressionHandler { List paramDeptList = objectMapper.readValue(param, new TypeReference>() { }); Long deptId = nodeUserDto.getId(); - List deptIdList = paramDeptList.stream().map(NodeUser::getId).toList(); + List deptIdList = paramDeptList.stream().map(NodeUser::getId).toList(); return inCompare(symbol, deptId, deptIdList); } + /** + * 内部方法:判断ID是否在列表中 + * @param symbol 比较符号(in/==:属于,notin/!=:不属于) + * @param deptId 要检查的ID + * @param deptIdList ID列表 + * @return 比较结果 + */ private static boolean inCompare(String symbol, Long deptId, List deptIdList) { if (StrUtil.equalsAny(symbol, "in", "==")) { // 属于 @@ -255,10 +319,15 @@ public class ExpressionHandler { } /** - * user判断 - * @param key 表单key - * @param param 参数 - * @return + * 用户比较 + *

+ * 检查流程变量中的用户是否满足给定的条件(属于或不属于指定用户/部门列表) 支持直接指定用户或通过部门查找用户 + * @param key 表单key,对应流程变量的键名 + * @param param 用户/部门列表参数(JSON格式) + * @param symbol 比较符号(in/==:属于,notin/!=:不属于) + * @param execution 流程执行上下文 + * @return 比较结果 + * @throws Exception 当JSON解析失败时抛出异常 */ @SneakyThrows public boolean userCompare(String key, String param, String symbol, DelegateExecution execution) { @@ -291,12 +360,12 @@ public class ExpressionHandler { List deptIdList = paramDeptList.stream() .filter(w -> StrUtil.equals(w.getType(), NodeUserTypeEnum.DEPT.getKey())) .map(NodeUser::getId) - .toList(); + .toList(); List userIdList = paramDeptList.stream() .filter(w -> StrUtil.equals(w.getType(), NodeUserTypeEnum.USER.getKey())) .map(NodeUser::getId) - .toList(); + .toList(); if (CollUtil.isNotEmpty(deptIdList)) { R> r = remoteUserService.getUserIdListByDeptIdList(deptIdList); @@ -307,4 +376,8 @@ public class ExpressionHandler { return inCompare(symbol, Convert.toLong(nodeUserDto.getId()), userIdList); } + public boolean days(DelegateExecution execution) { + return true; + } + } diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/expression/condition/NodeConditionStrategy.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/expression/condition/NodeConditionStrategy.java new file mode 100644 index 000000000..94a2dbacb --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/expression/condition/NodeConditionStrategy.java @@ -0,0 +1,31 @@ +package com.pig4cloud.pigx.flow.support.expression.condition; + +import com.pig4cloud.pigx.flow.dto.Condition; + +/** + * 节点条件策略接口 + *

+ * 定义了流程节点条件处理的策略模式接口。 + * 该接口是策略模式的核心,不同的表单控件类型(如文本、数字、日期、选择器等) + * 都需要实现该接口,以提供相应的条件表达式生成逻辑。 + *

+ * 实现类将根据不同的表单控件类型和条件配置,生成对应的SpEL表达式, + * 这些表达式将在流程执行时被Flowable引擎解析和执行,用于判断流程的走向。 + * + * @author pigx + * @see com.pig4cloud.pigx.flow.dto.Condition 条件配置对象 + */ +public interface NodeConditionStrategy { + + /** + * 处理条件表达式 + *

+ * 根据传入的条件配置对象,生成对应的SpEL(Spring Expression Language)表达式字符串。 + * 生成的表达式会在流程运行时被评估,用于决定流程的条件分支走向。 + * + * @param condition 条件配置对象,包含字段名、操作符、比较值等信息 + * @return 生成的SpEL表达式字符串,例如:"${expressionHandler.numberCompare('age', '>', 18, execution)}" + */ + String handle(Condition condition); + +} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/NodeExpressionStrategyFactory.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/expression/condition/NodeExpressionStrategyFactory.java similarity index 52% rename from pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/NodeExpressionStrategyFactory.java rename to pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/expression/condition/NodeExpressionStrategyFactory.java index 8985b28c7..2f4cfcde7 100644 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/NodeExpressionStrategyFactory.java +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/expression/condition/NodeExpressionStrategyFactory.java @@ -1,19 +1,35 @@ -package com.pig4cloud.pigx.flow.engine.expression.condition; +package com.pig4cloud.pigx.flow.support.expression.condition; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.extra.spring.SpringUtil; -import com.pig4cloud.pigx.flow.task.dto.Condition; -import com.pig4cloud.pigx.flow.task.dto.GroupCondition; -import com.pig4cloud.pigx.flow.task.dto.Node; +import com.pig4cloud.pigx.flow.dto.Condition; +import com.pig4cloud.pigx.flow.dto.GroupCondition; +import com.pig4cloud.pigx.flow.dto.Node; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicReference; +/** + * 节点表达式策略工厂 + *

+ * 负责管理和协调不同类型的节点条件策略,生成复杂的条件表达式。 该工厂类是整个条件表达式生成系统的核心,它将多个条件组合成完整的SpEL表达式。 + *

+ * 主要功能: 1. 根据条件类型动态选择对应的策略实现 2. 处理条件组内的逻辑关系(AND/OR) 3. 处理多个条件组之间的逻辑关系 4. 生成默认分支的条件表达式 + * + * @author pigx + */ public class NodeExpressionStrategyFactory { + /** + * 处理单个条件 + *

+ * 根据条件的keyType(表单控件类型)动态选择对应的策略实现, 并调用其handle方法生成具体的表达式。 + * @param nodeConditionDto 单个条件配置对象 + * @return 生成的条件表达式字符串,如果找不到对应策略则返回"(1==1)" + */ public static String handleSingleCondition(Condition nodeConditionDto) { Map nodeConditionStrategyMap = SpringUtil .getBeansOfType(NodeConditionStrategy.class); @@ -26,7 +42,6 @@ public class NodeExpressionStrategyFactory { } }); - if (nodeConditionHandler.get() == null) { return "(1==1)"; } @@ -34,9 +49,11 @@ public class NodeExpressionStrategyFactory { } /** - * 组内处理表达式 - * @param groupDto - * @return + * 处理条件组表达式 + *

+ * 将一个条件组内的多个条件根据逻辑关系(AND/OR)组合成一个表达式。 mode为true时使用AND连接,为false时使用OR连接。 + * @param groupDto 条件组配置对象,包含多个条件和逻辑关系 + * @return 组合后的条件表达式,用括号包裹 */ public static String handleGroupCondition(GroupCondition groupDto) { @@ -59,10 +76,16 @@ public class NodeExpressionStrategyFactory { } /** - * 处理单个分支表达式 - * @return + * 处理节点的完整条件表达式 + *

+ * 将节点的所有条件组根据节点级别的逻辑关系组合成最终的SpEL表达式。 如果节点没有配置条件,返回永真表达式"${1==1}"。 + * @param node 节点配置对象,包含多个条件组 + * @return 完整的SpEL表达式,包含${}包裹 */ public static String handle(Node node) { + if (1 == node.getConditionType()) { + return "${(" + node.getExpressionText() + ")}"; + } List exps = new ArrayList<>(); @@ -84,6 +107,14 @@ public class NodeExpressionStrategyFactory { return "${(" + join + ")}"; } + /** + * 处理默认分支的条件表达式 + *

+ * 生成一个条件表达式,当其他所有分支条件都不满足时,该表达式为真。 实现方式是将其他分支的条件取反并用OR连接,然后整体取反。 + * @param branchs 所有分支节点列表 + * @param currentIndex 当前默认分支的索引位置 + * @return 默认分支的条件表达式 + */ public static String handleDefaultBranch(List branchs, int currentIndex) { List expList = new ArrayList<>(); @@ -105,4 +136,4 @@ public class NodeExpressionStrategyFactory { return "${" + join + "}"; } -} +} \ No newline at end of file diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/expression/condition/impl/DateNodeConditionStrategy.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/expression/condition/impl/DateNodeConditionStrategy.java new file mode 100644 index 000000000..be4ca8da8 --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/expression/condition/impl/DateNodeConditionStrategy.java @@ -0,0 +1,41 @@ +package com.pig4cloud.pigx.flow.support.expression.condition.impl; + +import cn.hutool.core.util.StrUtil; +import com.pig4cloud.pigx.flow.support.expression.condition.NodeConditionStrategy; +import com.pig4cloud.pigx.flow.dto.Condition; +import org.springframework.stereotype.Component; + +/** + * 日期选择器类型条件处理器 + *

+ * 处理日期选择器类型表单控件的条件表达式生成。 + * 支持日期比较操作:>, <, >=, <=, ==, != + * 默认使用"yyyy-MM-dd"格式进行日期解析和比较。 + * + * @author pigx + */ +@Component("datePickerNodeConditionStrategy") +public class DateNodeConditionStrategy implements NodeConditionStrategy { + + /** + * 处理日期类型的条件表达式 + *

+ * 生成日期比较的SpEL表达式,将日期字符串转换为时间戳进行比较。 + * 固定使用"yyyy-MM-dd"格式解析日期。 + * + * @param condition 条件配置对象,包含字段名、操作符、比较值等信息 + * @return SpEL表达式字符串,格式如:"(expressionHandler.dateTimeCompare("birthday",">","2023-01-01",execution,"yyyy-MM-dd"))" + */ + @Override + public String handle(Condition condition) { + + String compare = condition.getExpression(); + String id = condition.getKey(); + Object value = condition.getValue(); + + return StrUtil.format("(expressionHandler.dateTimeCompare(\"{}\",\"{}\",\"{}\",execution,\"yyyy-MM-dd\"))", id, + compare, value); + + } + +} diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/expression/condition/impl/DateTimeNodeConditionStrategy.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/expression/condition/impl/DateTimeNodeConditionStrategy.java new file mode 100644 index 000000000..a61638af4 --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/expression/condition/impl/DateTimeNodeConditionStrategy.java @@ -0,0 +1,43 @@ +package com.pig4cloud.pigx.flow.support.expression.condition.impl; + +import cn.hutool.core.util.StrUtil; +import com.pig4cloud.pigx.flow.support.expression.condition.NodeConditionStrategy; +import com.pig4cloud.pigx.flow.dto.Condition; +import org.springframework.stereotype.Component; + +/** + * 日期时间选择器类型条件处理器 + *

+ * 处理日期时间选择器类型表单控件的条件表达式生成。 + * 与DateNodeConditionStrategy的区别是包含时间部分的比较。 + * 支持日期时间比较操作:>, <, >=, <=, ==, != + * 默认使用"yyyy-MM-dd HH:mm:ss"格式进行日期时间解析和比较。 + * + * @author pigx + */ +@Component("DateTimeNodeConditionStrategy") +public class DateTimeNodeConditionStrategy implements NodeConditionStrategy { + + /** + * 处理日期时间类型的条件表达式 + *

+ * 生成日期时间比较的SpEL表达式,将日期时间字符串转换为时间戳进行比较。 + * 固定使用"yyyy-MM-dd HH:mm:ss"格式解析日期时间。 + * + * @param condition 条件配置对象,包含字段名、操作符、比较值等信息 + * @return SpEL表达式字符串,格式如:"(expressionHandler.dateTimeCompare("createTime",">","2023-01-01 12:00:00",execution,"yyyy-MM-dd HH:mm:ss"))" + */ + @Override + public String handle(Condition condition) { + + String compare = condition.getExpression(); + String id = condition.getKey(); + Object value = condition.getValue(); + + return StrUtil.format( + "(expressionHandler.dateTimeCompare(\"{}\",\"{}\",\"{}\",execution,\"yyyy-MM-dd " + "HH:mm:ss\"))", id, + compare, value); + + } + +} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/InputNodeConditionStrategy.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/expression/condition/impl/InputNodeConditionStrategy.java similarity index 50% rename from pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/InputNodeConditionStrategy.java rename to pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/expression/condition/impl/InputNodeConditionStrategy.java index c9d8077d7..3025043ac 100644 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/InputNodeConditionStrategy.java +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/expression/condition/impl/InputNodeConditionStrategy.java @@ -1,19 +1,33 @@ -package com.pig4cloud.pigx.flow.engine.expression.condition.impl; +package com.pig4cloud.pigx.flow.support.expression.condition.impl; import cn.hutool.core.util.StrUtil; -import com.pig4cloud.pigx.flow.engine.expression.condition.NodeConditionStrategy; -import com.pig4cloud.pigx.flow.task.dto.Condition; +import com.pig4cloud.pigx.flow.support.expression.condition.NodeConditionStrategy; +import com.pig4cloud.pigx.flow.dto.Condition; import org.springframework.stereotype.Component; /** - * 字符类型处理器 + * 输入框(字符串)类型条件处理器 + *

+ * 处理输入框类型表单控件的条件表达式生成。 + * 支持的比较操作: + * 1. 相等(==):检查字符串是否完全相等 + * 2. 不相等(!=):检查字符串是否不相等 + * 3. 包含(contain):检查字符串是否包含指定子串 + * 4. 不包含(notcontain):检查字符串是否不包含指定子串 + * + * @author pigx */ @Component("inputNodeConditionStrategy") public class InputNodeConditionStrategy implements NodeConditionStrategy { /** - * 抽象方法 处理表达式 + * 处理输入框类型的条件表达式 + *

+ * 根据不同的比较操作符生成对应的SpEL表达式, + * 表达式会调用ExpressionHandler中的相应方法进行字符串比较。 * + * @param condition 条件配置对象,包含字段名、操作符、比较值等信息 + * @return SpEL表达式字符串,如果操作符不支持则返回"(2==2)" */ @Override public String handle(Condition condition) { diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/expression/condition/impl/NumberNodeConditionStrategy.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/expression/condition/impl/NumberNodeConditionStrategy.java new file mode 100644 index 000000000..7bc5a381d --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/expression/condition/impl/NumberNodeConditionStrategy.java @@ -0,0 +1,40 @@ +package com.pig4cloud.pigx.flow.support.expression.condition.impl; + +import cn.hutool.core.util.StrUtil; +import com.pig4cloud.pigx.flow.support.expression.condition.NodeConditionStrategy; +import com.pig4cloud.pigx.flow.dto.Condition; +import org.springframework.stereotype.Component; + +/** + * 数字输入框类型条件处理器 + *

+ * 处理数字输入框类型表单控件的条件表达式生成。 + * 支持所有数字比较操作符:>, <, >=, <=, ==, != + * 生成的表达式会调用ExpressionHandler的numberCompare方法进行数值比较。 + * + * @author pigx + */ +@Component("inputNumberNodeConditionStrategy") +public class NumberNodeConditionStrategy implements NodeConditionStrategy { + + /** + * 处理数字类型的条件表达式 + *

+ * 生成数字比较的SpEL表达式,支持各种数值比较操作。 + * 表达式中会将字段值转换为数字类型后进行比较。 + * + * @param condition 条件配置对象,包含字段名、操作符、比较值等信息 + * @return SpEL表达式字符串,格式如:"(expressionHandler.numberCompare("age",">",18,execution))" + */ + @Override + public String handle(Condition condition) { + + String compare = condition.getExpression(); + String id = condition.getKey(); + Object value = condition.getValue(); + + return StrUtil.format("(expressionHandler.numberCompare(\"{}\",\"{}\",{},execution))", id, compare, value); + + } + +} diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/expression/condition/impl/SelectDeptNodeConditionStrategy.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/expression/condition/impl/SelectDeptNodeConditionStrategy.java new file mode 100644 index 000000000..ef7e8ddc0 --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/expression/condition/impl/SelectDeptNodeConditionStrategy.java @@ -0,0 +1,54 @@ +package com.pig4cloud.pigx.flow.support.expression.condition.impl; + +import cn.hutool.core.util.EscapeUtil; +import cn.hutool.core.util.StrUtil; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.pig4cloud.pigx.flow.support.expression.condition.NodeConditionStrategy; +import com.pig4cloud.pigx.flow.dto.Condition; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import org.springframework.stereotype.Component; + +/** + * 部门选择器类型条件处理器 + *

+ * 处理部门选择器类型表单控件的条件表达式生成。 + * 支持判断选中的部门是否在指定的部门列表中。 + * 支持的比较操作: + * 1. 属于(in/==):检查部门是否在指定的部门列表中 + * 2. 不属于(notin/!=):检查部门是否不在指定的部门列表中 + *

+ * 处理时会将部门数据序列化为JSON字符串并进行转义处理。 + * + * @author pigx + */ +@RequiredArgsConstructor +@Component("SelectDeptNodeConditionStrategy") +public class SelectDeptNodeConditionStrategy implements NodeConditionStrategy { + + private final ObjectMapper objectMapper; + + /** + * 处理部门选择器类型的条件表达式 + *

+ * 将部门选择数据序列化为JSON格式,并生成调用部门比较方法的SpEL表达式。 + * 序列化后的JSON会进行转义处理,以确保在表达式中的正确性。 + * + * @param condition 条件配置对象,包含字段名、操作符、部门列表等信息 + * @return SpEL表达式字符串,格式如:"(expressionHandler.deptCompare("dept","[{\"id\":1,\"name\":\"研发部\"}]","in", execution))" + * @throws Exception 当JSON序列化失败时抛出异常 + */ + @Override + @SneakyThrows + public String handle(Condition condition) { + + String compare = condition.getExpression(); + String id = condition.getKey(); + Object value = condition.getValue(); + + return StrUtil.format("(expressionHandler.deptCompare(\"{}\",\"{}\",\"{}\", execution))", id, + EscapeUtil.escape(objectMapper.writeValueAsString(value)), compare); + + } + +} diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/expression/condition/impl/SelectUserNodeConditionStrategy.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/expression/condition/impl/SelectUserNodeConditionStrategy.java new file mode 100644 index 000000000..044dfe534 --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/expression/condition/impl/SelectUserNodeConditionStrategy.java @@ -0,0 +1,55 @@ +package com.pig4cloud.pigx.flow.support.expression.condition.impl; + +import cn.hutool.core.util.EscapeUtil; +import cn.hutool.core.util.StrUtil; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.pig4cloud.pigx.flow.support.expression.condition.NodeConditionStrategy; +import com.pig4cloud.pigx.flow.dto.Condition; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import org.springframework.stereotype.Component; + +/** + * 用户选择器类型条件处理器 + *

+ * 处理用户选择器类型表单控件的条件表达式生成。 + * 支持判断选中的用户是否在指定的用户/部门列表中。 + * 支持的比较操作: + * 1. 属于(in/==):检查用户是否在指定的用户列表中,或属于指定的部门 + * 2. 不属于(notin/!=):检查用户是否不在指定的用户列表中,且不属于指定的部门 + *

+ * 特别说明:当条件中包含部门时,会自动查询该部门下的所有用户进行比较。 + * + * @author pigx + */ +@RequiredArgsConstructor +@Component("SelectUserNodeConditionStrategy") +public class SelectUserNodeConditionStrategy implements NodeConditionStrategy { + + private final ObjectMapper objectMapper; + + /** + * 处理用户选择器类型的条件表达式 + *

+ * 将用户/部门选择数据序列化为JSON格式,并生成调用用户比较方法的SpEL表达式。 + * 序列化后的JSON会进行转义处理,以确保在表达式中的正确性。 + * 支持混合选择用户和部门,系统会自动展开部门为用户列表。 + * + * @param condition 条件配置对象,包含字段名、操作符、用户/部门列表等信息 + * @return SpEL表达式字符串,格式如:"(expressionHandler.userCompare("assignee","[{\"id\":1,\"type\":\"USER\"}]","in", execution))" + * @throws Exception 当JSON序列化失败时抛出异常 + */ + @Override + @SneakyThrows + public String handle(Condition condition) { + + String compare = condition.getExpression(); + String id = condition.getKey(); + Object value = condition.getValue(); + + return StrUtil.format("(expressionHandler.userCompare(\"{}\",\"{}\",\"{}\", execution))", id, + EscapeUtil.escape(objectMapper.writeValueAsString(value)), compare); + + } + +} diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/expression/condition/impl/SingleSelectNodeConditionStrategy.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/expression/condition/impl/SingleSelectNodeConditionStrategy.java new file mode 100644 index 000000000..08517a475 --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/expression/condition/impl/SingleSelectNodeConditionStrategy.java @@ -0,0 +1,63 @@ +package com.pig4cloud.pigx.flow.support.expression.condition.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.pig4cloud.pigx.flow.support.expression.condition.NodeConditionStrategy; +import com.pig4cloud.pigx.flow.dto.Condition; +import com.pig4cloud.pigx.flow.dto.SelectValue; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 单选框类型条件处理器 + *

+ * 处理单选框(radio、下拉单选等)类型表单控件的条件表达式生成。 + * 支持的比较操作: + * 1. 包含(in):检查选中值是否在指定的选项列表中 + * 2. 不包含(not in):检查选中值是否不在指定的选项列表中 + *

+ * 处理时会将选项值转换为字符串数组格式传递给表达式处理器。 + * + * @author pigx + */ +@Component("SingleSelectNodeConditionStrategy") +public class SingleSelectNodeConditionStrategy implements NodeConditionStrategy { + + /** + * 处理单选类型的条件表达式 + *

+ * 将条件中的选项列表转换为字符串数组格式,并生成相应的SpEL表达式。 + * 支持判断单选值是否在指定的选项集合中。 + * + * @param condition 条件配置对象,包含字段名、操作符、选项值列表等信息 + * @return SpEL表达式字符串,格式如:"(expressionHandler.singleSelectHandler("status", execution,"1","2","3"))" + */ + @Override + public String handle(Condition condition) { + + String compare = condition.getExpression(); + String id = condition.getKey(); + Object value = condition.getValue(); + + List list = Convert.toList(SelectValue.class, value); + + StringBuilder sb = new StringBuilder(); + + for (SelectValue o : list) { + sb.append(",\"").append(o.getKey()).append("\""); + } + String string = sb.toString(); + if (CollUtil.isNotEmpty(list)) { + string = string.substring(1); + } + if (compare.equals("in")) { + return StrUtil.format("(expressionHandler.singleSelectHandler(\"{}\", execution,{}))", id, string); + } + + return StrUtil.format("(!expressionHandler.singleSelectHandler(\"{}\", execution,{}))", id, string); + + } + +} diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/expression/condition/impl/TextareaNodeConditionStrategy.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/expression/condition/impl/TextareaNodeConditionStrategy.java new file mode 100644 index 000000000..2e94c41dd --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/expression/condition/impl/TextareaNodeConditionStrategy.java @@ -0,0 +1,46 @@ +package com.pig4cloud.pigx.flow.support.expression.condition.impl; + +import cn.hutool.core.util.StrUtil; +import com.pig4cloud.pigx.flow.support.expression.condition.NodeConditionStrategy; +import com.pig4cloud.pigx.flow.dto.Condition; +import org.springframework.stereotype.Component; + +/** + * 多行文本框类型条件处理器 + *

+ * 处理多行文本框(textarea)类型表单控件的条件表达式生成。 + * 与输入框处理器相比,只支持相等和不相等的比较,不支持包含判断。 + * 支持的比较操作: + * 1. 相等(==):检查文本是否完全相等 + * 2. 不相等(!=):检查文本是否不相等 + * + * @author pigx + */ +@Component("TextareaNodeConditionStrategy") +public class TextareaNodeConditionStrategy implements NodeConditionStrategy { + + /** + * 处理多行文本框类型的条件表达式 + *

+ * 根据比较操作符生成对应的SpEL表达式,只支持相等和不相等的判断。 + * 如果操作符不支持,则返回永真表达式"(2==2)"。 + * + * @param condition 条件配置对象,包含字段名、操作符、比较值等信息 + * @return SpEL表达式字符串,格式如:"(expressionHandler.stringEqual("remark","备注内容",execution))" + */ + @Override + public String handle(Condition condition) { + + String compare = condition.getExpression(); + String id = condition.getKey(); + Object value = condition.getValue(); + if (StrUtil.equals(compare, "==")) { + return StrUtil.format("(expressionHandler.stringEqual(\"{}\",\"{}\",execution))", id, value); + } + if (StrUtil.equals(compare, "!=")) { + return StrUtil.format("(!expressionHandler.stringEqual(\"{}\",\"{}\",execution))", id, value); + } + return "(2==2)"; + } + +} diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/expression/condition/impl/TimeNodeConditionStrategy.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/expression/condition/impl/TimeNodeConditionStrategy.java new file mode 100644 index 000000000..9f7f54e4c --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/expression/condition/impl/TimeNodeConditionStrategy.java @@ -0,0 +1,42 @@ +package com.pig4cloud.pigx.flow.support.expression.condition.impl; + +import cn.hutool.core.util.StrUtil; +import com.pig4cloud.pigx.flow.support.expression.condition.NodeConditionStrategy; +import com.pig4cloud.pigx.flow.dto.Condition; +import org.springframework.stereotype.Component; + +/** + * 时间选择器类型条件处理器 + *

+ * 处理时间选择器类型表单控件的条件表达式生成。 + * 只比较时分秒部分,不包含日期。 + * 支持时间比较操作:>, <, >=, <=, ==, != + * 默认使用"HH:mm:ss"格式进行时间解析和比较。 + * + * @author pigx + */ +@Component("timePickerNodeConditionStrategy") +public class TimeNodeConditionStrategy implements NodeConditionStrategy { + + /** + * 处理时间类型的条件表达式 + *

+ * 生成时间比较的SpEL表达式,将时间字符串转换为时间戳进行比较。 + * 固定使用"HH:mm:ss"格式解析时间。 + * + * @param condition 条件配置对象,包含字段名、操作符、比较值等信息 + * @return SpEL表达式字符串,格式如:"(expressionHandler.dateTimeCompare("startTime",">","09:00:00",execution,"HH:mm:ss"))" + */ + @Override + public String handle(Condition condition) { + + String compare = condition.getExpression(); + String id = condition.getKey(); + Object value = condition.getValue(); + + return StrUtil.format("(expressionHandler.dateTimeCompare(\"{}\",\"{}\",\"{}\",execution,\"HH:mm:ss\"))", id, + compare, value); + + } + +} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/listeners/ApprovalCreateListener.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/listeners/ApprovalCreateListener.java similarity index 64% rename from pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/listeners/ApprovalCreateListener.java rename to pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/listeners/ApprovalCreateListener.java index 54f076e8c..31d27c102 100644 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/listeners/ApprovalCreateListener.java +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/listeners/ApprovalCreateListener.java @@ -1,15 +1,16 @@ -package com.pig4cloud.pigx.flow.engine.listeners; +package com.pig4cloud.pigx.flow.support.listeners; import cn.hutool.core.lang.Dict; import cn.hutool.core.util.StrUtil; import cn.hutool.extra.spring.SpringUtil; import com.pig4cloud.pigx.common.core.util.R; -import com.pig4cloud.pigx.flow.task.api.feign.RemoteFlowTaskService; -import com.pig4cloud.pigx.flow.task.constant.ProcessInstanceConstant; -import com.pig4cloud.pigx.flow.task.dto.Nobody; -import com.pig4cloud.pigx.flow.task.dto.Node; -import com.pig4cloud.pigx.flow.task.dto.NodeUser; -import com.pig4cloud.pigx.flow.task.utils.NodeUtil; +import com.pig4cloud.pigx.flow.constant.ProcessInstanceConstant; +import com.pig4cloud.pigx.flow.dto.Nobody; +import com.pig4cloud.pigx.flow.dto.Node; +import com.pig4cloud.pigx.flow.dto.NodeUser; +import com.pig4cloud.pigx.flow.service.IProcessNodeDataService; +import com.pig4cloud.pigx.flow.service.IRemoteService; +import com.pig4cloud.pigx.flow.support.utils.NodeUtil; import lombok.extern.slf4j.Slf4j; import org.flowable.engine.TaskService; import org.flowable.task.service.delegate.DelegateTask; @@ -17,18 +18,31 @@ import org.flowable.task.service.delegate.TaskListener; import org.flowable.task.service.impl.persistence.entity.TaskEntityImpl; /** - * 审批创建监听器 - * 用于处理任务创建时的逻辑,特别是针对没有指定执行人的任务进行自动处理 - * 根据节点配置的"无人处理策略"执行不同的操作:自动通过、指派给管理员、指派给特定用户或自动拒绝 + * 审批任务创建监听器 + *

+ * Flowable任务监听器实现,用于处理审批任务创建时的特殊逻辑。 + * 主要功能是处理没有指定执行人的任务,根据节点配置的"无人处理策略"自动执行相应操作。 + *

+ * 支持的无人处理策略: + * 1. 自动通过:任务自动完成并通过 + * 2. 指派给管理员:将任务分配给流程管理员 + * 3. 指派给特定用户:将任务分配给配置中指定的用户 + * 4. 自动拒绝:任务自动完成并拒绝 + *

+ * 该监听器需要在流程定义的用户任务节点中配置,通过taskListener扩展属性指定。 + * + * @author pigx */ @Slf4j public class ApprovalCreateListener implements TaskListener { /** - * 当任务被创建时触发该方法 - * 根据任务的配置和状态决定如何处理无人执行的任务 + * 任务创建事件处理方法 + *

+ * 当任务被创建时触发,检查任务是否有执行人,如果没有则根据配置的策略自动处理。 + * 这个机制解决了流程执行过程中可能出现的无人处理任务的问题。 * - * @param delegateTask 委派的任务对象,包含任务的所有信息 + * @param delegateTask 委派的任务对象,包含任务的所有信息和上下文 */ @Override public void notify(DelegateTask delegateTask) { @@ -36,13 +50,13 @@ public class ApprovalCreateListener implements TaskListener { TaskService taskService = SpringUtil.getBean(TaskService.class); // 获取任务的基本信息 - String assignee = delegateTask.getAssignee(); // 执行人 - String name = delegateTask.getName(); // 任务名称 + String assignee = delegateTask.getAssignee(); // 执行人 + String name = delegateTask.getName(); // 任务名称 log.debug("任务创建事件 - 任务名称:{}, 执行人:{}", name, assignee); // 转换为TaskEntity以获取更多信息 TaskEntityImpl taskEntity = (TaskEntityImpl) delegateTask; - String nodeId = taskEntity.getTaskDefinitionKey(); // 节点ID + String nodeId = taskEntity.getTaskDefinitionKey(); // 节点ID String processDefinitionId = taskEntity.getProcessDefinitionId(); // 流程定义ID // 从流程定义ID中提取流程ID @@ -54,12 +68,13 @@ public class ApprovalCreateListener implements TaskListener { || StrUtil.equals(ProcessInstanceConstant.DEFAULT_EMPTY_ASSIGN.toString(), assignee)) { log.debug("任务无执行人,开始处理无人执行策略"); - RemoteFlowTaskService remoteFlowTaskService = SpringUtil.getBean(RemoteFlowTaskService.class); + IProcessNodeDataService processNodeDataService = SpringUtil.getBean(IProcessNodeDataService.class); + IRemoteService remoteService = SpringUtil.getBean(IRemoteService.class); // 查询节点原始配置数据,获取无人处理策略 - Node node = remoteFlowTaskService.queryNodeOriData(flowId, nodeId).getData(); - Nobody nobody = node.getNobody(); // 获取无人处理配置 - String handler = nobody.getHandler(); // 获取无人处理的处理方式 + Node node = processNodeDataService.getNodeData(flowId, nodeId).getData(); + Nobody nobody = node.getNobody(); // 获取无人处理配置 + String handler = nobody.getHandler(); // 获取无人处理的处理方式 // 根据无人处理策略执行不同操作 // 策略1: 自动通过任务 @@ -74,7 +89,7 @@ public class ApprovalCreateListener implements TaskListener { if (StrUtil.equals(handler, ProcessInstanceConstant.USER_TASK_NOBODY_HANDLER_TO_ADMIN)) { log.info("无人处理策略: 指派给管理员 - 任务ID: {}", taskEntity.getId()); // 查询流程的管理员ID - R longR = remoteFlowTaskService.queryProcessAdmin(flowId); + R longR = remoteService.queryProcessAdmin(flowId); Long adminId = longR.getData(); // 将任务分配给管理员 @@ -100,8 +115,10 @@ public class ApprovalCreateListener implements TaskListener { Dict param = Dict.create().set(StrUtil.format("{}_approve_condition", nodeId), false); taskService.complete(taskEntity.getId(), param); } - } else { + } + else { log.debug("任务已有执行人,无需处理无人执行策略"); } } + } \ No newline at end of file diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/listeners/FlowProcessEventListener.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/listeners/FlowProcessEventListener.java similarity index 100% rename from pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/listeners/FlowProcessEventListener.java rename to pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/listeners/FlowProcessEventListener.java diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/listeners/NodeTaskCompleteNotify.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/listeners/NodeTaskCompleteNotify.java similarity index 100% rename from pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/listeners/NodeTaskCompleteNotify.java rename to pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/listeners/NodeTaskCompleteNotify.java diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/node/AssignUserStrategy.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/node/AssignUserStrategy.java new file mode 100644 index 000000000..acd2a8b5b --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/node/AssignUserStrategy.java @@ -0,0 +1,37 @@ +package com.pig4cloud.pigx.flow.support.node; + +import com.pig4cloud.pigx.flow.dto.Node; +import com.pig4cloud.pigx.flow.dto.NodeUser; + +import java.util.List; +import java.util.Map; + +/** + * 任务分配用户策略接口 + *

+ * 定义了流程节点任务分配给用户的策略模式接口。 + * 不同的节点可能有不同的用户分配策略,如指定用户、指定角色、发起人、部门负责人等。 + * 实现类需要根据节点配置和流程上下文,返回应该分配任务的用户ID列表。 + *

+ * 该接口是流程引擎用户分配机制的核心,确保任务能够正确地分配给合适的处理人。 + * + * @author pigx + * @see com.pig4cloud.pigx.flow.dto.Node 节点配置信息 + * @see com.pig4cloud.pigx.flow.dto.NodeUser 用户信息 + */ +public interface AssignUserStrategy { + + /** + * 处理用户分配逻辑 + *

+ * 根据节点配置的用户分配策略,结合流程发起人信息和流程变量, + * 计算并返回应该处理该节点任务的用户ID列表。 + * + * @param node 节点配置对象,包含节点的用户分配策略配置 + * @param rootUser 流程发起人信息,可用于"发起人"、"发起人部门负责人"等策略 + * @param variables 流程变量Map,包含表单数据和其他流程上下文信息 + * @return 应该分配任务的用户ID列表,如果返回空列表则任务无人处理 + */ + List handle(Node node, NodeUser rootUser, Map variables); + +} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/MultiInstanceHandler.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/node/MultiInstanceHandler.java similarity index 100% rename from pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/MultiInstanceHandler.java rename to pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/node/MultiInstanceHandler.java diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignExpressStrategyImpl.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/node/impl/AssignExpressStrategyImpl.java similarity index 94% rename from pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignExpressStrategyImpl.java rename to pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/node/impl/AssignExpressStrategyImpl.java index d94002bdc..ba5a49634 100644 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignExpressStrategyImpl.java +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/node/impl/AssignExpressStrategyImpl.java @@ -39,6 +39,10 @@ public class AssignExpressStrategyImpl implements AssignUserStrategy { @Override public List handle(Node node, NodeUser rootUser, Map variables) { String assignExpress = node.getAssignExpress(); + // 判断表达式是否为 ${} 包裹的形式,如果不是则进行包裹 + if (!assignExpress.startsWith("${") && !assignExpress.endsWith("}")) { + assignExpress = "${" + assignExpress + "}"; + } Object result = getExpressionValue(variables, assignExpress); return Convert.toList(Long.class, result); } diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignUserFixedStrategyImpl.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/node/impl/AssignUserFixedStrategyImpl.java similarity index 52% rename from pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignUserFixedStrategyImpl.java rename to pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/node/impl/AssignUserFixedStrategyImpl.java index 311aaa6aa..6b90ba977 100644 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignUserFixedStrategyImpl.java +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/node/impl/AssignUserFixedStrategyImpl.java @@ -1,15 +1,15 @@ -package com.pig4cloud.pigx.flow.engine.node.impl; +package com.pig4cloud.pigx.flow.support.node.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.pig4cloud.pigx.admin.api.entity.SysUser; import com.pig4cloud.pigx.admin.api.feign.RemoteUserService; import com.pig4cloud.pigx.common.core.util.R; -import com.pig4cloud.pigx.flow.engine.node.AssignUserStrategy; -import com.pig4cloud.pigx.flow.task.constant.NodeUserTypeEnum; -import com.pig4cloud.pigx.flow.task.constant.ProcessInstanceConstant; -import com.pig4cloud.pigx.flow.task.dto.Node; -import com.pig4cloud.pigx.flow.task.dto.NodeUser; +import com.pig4cloud.pigx.flow.support.node.AssignUserStrategy; +import com.pig4cloud.pigx.flow.constant.NodeUserTypeEnum; +import com.pig4cloud.pigx.flow.constant.ProcessInstanceConstant; +import com.pig4cloud.pigx.flow.dto.Node; +import com.pig4cloud.pigx.flow.dto.NodeUser; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; @@ -17,10 +17,20 @@ import java.util.List; import java.util.Map; /** - * 指定具体用户 + * 固定用户分配策略实现 + *

+ * 实现指定具体用户或部门的任务分配策略。 + * 该策略允许在流程设计时直接指定任务的处理人员或处理部门。 + *

+ * 支持的配置方式: + * 1. 直接指定用户:任务将分配给指定的用户 + * 2. 指定部门:任务将分配给该部门下的所有用户 + * 3. 混合配置:同时指定用户和部门,任务将分配给所有指定的用户及部门下的用户 + *

+ * 使用场景:适用于处理人员固定的审批节点,如财务审批、人事审批等 * * @author Huijun Zhao - * @description + * @description 指定具体用户的分配策略 * @date 2023-07-07 13:42 */ @RequiredArgsConstructor @@ -30,11 +40,15 @@ public class AssignUserFixedStrategyImpl implements AssignUserStrategy { private final RemoteUserService remoteUserService; /** - * 处理节点并返回用户ID列表。 - * @param node 节点 - * @param rootUser 根用户 - * @param variables 变量 - * @return 用户ID列表 + * 处理固定用户分配逻辑 + *

+ * 从节点配置中获取指定的用户和部门信息,将部门展开为用户列表, + * 最终返回所有应该处理该任务的用户ID列表。 + * + * @param node 节点配置对象,包含指定的用户和部门列表 + * @param rootUser 流程发起人信息(本策略中未使用) + * @param variables 流程变量(本策略中未使用) + * @return 用户ID列表,包含所有指定的用户和部门下的用户 */ @Override public List handle(Node node, NodeUser rootUser, Map variables) { diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/node/impl/AssignUserFormStrategyImpl.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/node/impl/AssignUserFormStrategyImpl.java new file mode 100644 index 000000000..e718bdaf1 --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/node/impl/AssignUserFormStrategyImpl.java @@ -0,0 +1,71 @@ +package com.pig4cloud.pigx.flow.support.node.impl; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.pig4cloud.pigx.flow.support.node.AssignUserStrategy; +import com.pig4cloud.pigx.flow.constant.ProcessInstanceConstant; +import com.pig4cloud.pigx.flow.dto.Node; +import com.pig4cloud.pigx.flow.dto.NodeUser; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 表单字段分配策略实现 + *

+ * 实现从表单字段中获取任务处理人的策略。 + * 允许在流程表单中通过用户选择器等控件动态指定任务的处理人。 + *

+ * 功能特点: + * 1. 从流程变量中读取指定表单字段的值 + * 2. 支持表单中的用户选择器控件 + * 3. 动态获取用户,提供更灵活的任务分配 + *

+ * 使用场景: + * - 需要在流程中动态指定下一步处理人 + * - 申请人可以选择审批人的场景 + * - 根据业务需要灵活指定处理人 + * + * @author Huijun Zhao + * @description 来自表单的分配策略 + * @date 2023-07-07 13:42 + */ +@RequiredArgsConstructor +@Component(ProcessInstanceConstant.AssignedTypeClass.FORM_USER + "AssignUserStrategy") +public class AssignUserFormStrategyImpl implements AssignUserStrategy { + + private final ObjectMapper objectMapper; + + /** + * 处理基于表单字段的用户分配逻辑 + *

+ * 从流程变量中获取指定表单字段的值,该字段应包含用户信息。 + * 将字段值解析为用户列表,并返回用户ID列表。 + * + * @param node 节点配置对象,包含表单字段ID + * @param rootUser 流程发起人信息(本策略中未使用) + * @param variables 流程变量Map,包含表单数据 + * @return 从表单字段中解析出的用户ID列表 + * @throws Exception 当JSON解析失败时抛出异常 + */ + @SneakyThrows + @Override + public List handle(Node node, NodeUser rootUser, Map variables) { + List assignList = new ArrayList<>(); + + Object variable = variables.get(node.getFormUserId()); + if (variable != null && !StrUtil.isBlankIfStr(variable)) { + String jsonString = objectMapper.writeValueAsString(variable); + List nodeUserDtoList = JSONUtil.toList(jsonString, NodeUser.class); + assignList.addAll(nodeUserDtoList.stream().map(NodeUser::getId).toList()); + } + + return assignList; + } + +} diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/node/impl/AssignUserLeaderStrategyImpl.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/node/impl/AssignUserLeaderStrategyImpl.java new file mode 100644 index 000000000..df2e050e2 --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/node/impl/AssignUserLeaderStrategyImpl.java @@ -0,0 +1,69 @@ +package com.pig4cloud.pigx.flow.support.node.impl; + +import cn.hutool.core.collection.CollUtil; +import com.pig4cloud.pigx.admin.api.feign.RemoteDeptService; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.security.util.SecurityUtils; +import com.pig4cloud.pigx.flow.constant.ProcessInstanceConstant; +import com.pig4cloud.pigx.flow.dto.Node; +import com.pig4cloud.pigx.flow.dto.NodeUser; +import com.pig4cloud.pigx.flow.support.node.AssignUserStrategy; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Stream; + +/** + * 部门主管分配策略实现 + *

+ * 实现将任务分配给指定部门主管的策略。 支持配置具体部门,如果未配置则默认使用当前用户所在部门。 + *

+ * 功能特点: 1. 支持指定多个部门,任务将分配给所有部门的主管 2. 如果未指定部门,默认分配给当前用户所在部门的主管 3. 支持获取部门的所有层级主管(如果部门有多级主管) + *

+ * 使用场景: - 需要部门主管审批的场景 - 逐级审批流程中的部门主管节点 - 跨部门协作需要多个部门主管审批 + * + * @author Huijun Zhao + * @description 指定主管的分配策略 + * @date 2023-07-07 13:42 + */ +@RequiredArgsConstructor +@Component(ProcessInstanceConstant.AssignedTypeClass.LEADER + "AssignUserStrategy") +public class AssignUserLeaderStrategyImpl implements AssignUserStrategy { + + private final RemoteDeptService deptService; + + /** + * 处理部门主管分配逻辑 + *

+ * 根据节点配置的部门列表,查询所有部门的主管用户ID。 如果节点未配置部门,则使用当前操作用户的部门作为默认值。 + * @param node 节点配置对象,可能包含指定的部门列表 + * @param rootUser 流程发起人信息(本策略中未直接使用) + * @param variables 流程变量(本策略中未使用) + * @return 所有相关部门主管的用户ID列表 + */ + @Override + public List handle(Node node, NodeUser rootUser, Map variables) { + // 如果节点没有设置部门主管,则默认为当前用户的部门主管 + if (CollUtil.isEmpty(node.getNodeUserList())) { + List nodeUserList = new ArrayList<>(); + nodeUserList.addAll(SecurityUtils.getUser() + .getDeptIds() + .stream() + .map(deptId -> NodeUser.builder().id(deptId).build()) + .toList()); + node.setNodeUserList(nodeUserList); + } + + return node.getNodeUserList() + .stream() + .map(nodeUser -> deptService.getAllDeptLeader(nodeUser.getId())) + .flatMap((Function>, Stream>) listR -> listR.getData() == null ? null + : listR.getData().stream()) + .toList(); + } + +} diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/node/impl/AssignUserRoleStrategyImpl.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/node/impl/AssignUserRoleStrategyImpl.java new file mode 100644 index 000000000..7fee74373 --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/node/impl/AssignUserRoleStrategyImpl.java @@ -0,0 +1,67 @@ +package com.pig4cloud.pigx.flow.support.node.impl; + +import com.pig4cloud.pigx.admin.api.feign.RemoteUserService; +import com.pig4cloud.pigx.common.core.util.RetOps; +import com.pig4cloud.pigx.flow.support.node.AssignUserStrategy; +import com.pig4cloud.pigx.flow.constant.ProcessInstanceConstant; +import com.pig4cloud.pigx.flow.dto.Node; +import com.pig4cloud.pigx.flow.dto.NodeUser; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +/** + * 角色分配策略实现 + *

+ * 实现基于角色的任务分配策略。 + * 任务将分配给拥有指定角色的所有用户。 + *

+ * 功能特点: + * 1. 支持配置多个角色 + * 2. 任务会分配给所有拥有这些角色的用户 + * 3. 通过远程服务查询角色对应的用户列表 + *

+ * 使用场景: + * - 特定角色才能处理的审批节点(如财务角色、人事角色) + * - 基于职能划分的任务分配 + * - 需要特定权限角色处理的流程节点 + * + * @author Huijun Zhao + * @description 来自角色的分配策略 + * @date 2023-07-07 13:42 + */ +@RequiredArgsConstructor +@Component(ProcessInstanceConstant.AssignedTypeClass.ROLE + "AssignUserStrategy") +public class AssignUserRoleStrategyImpl implements AssignUserStrategy { + + private final RemoteUserService remoteUserService; + + /** + * 处理基于角色的用户分配逻辑 + *

+ * 从节点配置中获取角色ID列表,通过远程服务查询拥有这些角色的所有用户, + * 返回这些用户的ID列表作为任务的处理人。 + * + * @param node 节点配置对象,包含角色ID列表 + * @param rootUser 流程发起人信息(本策略中未使用) + * @param variables 流程变量(本策略中未使用) + * @return 拥有指定角色的用户ID列表 + */ + @Override + public List handle(Node node, NodeUser rootUser, Map variables) { + // 使用 lambda 表达式和方法引用从 NodeUser 列表中提取角色 ID + List roleIds = node.getNodeUserList().stream().map(NodeUser::getId).toList(); + // 提取 Optional 结果中的数据 + List data = RetOps.of(remoteUserService.getUserIdListByRoleIdList(roleIds)) + .getData() + .orElseGet(Collections::emptyList); + + // 返回用户 ID 列表 + return new ArrayList<>(data); + } + +} diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/node/impl/AssignUserSelfSelectStrategyImpl.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/node/impl/AssignUserSelfSelectStrategyImpl.java new file mode 100644 index 000000000..cd103112d --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/node/impl/AssignUserSelfSelectStrategyImpl.java @@ -0,0 +1,82 @@ +package com.pig4cloud.pigx.flow.support.node.impl; + +import cn.hutool.core.util.StrUtil; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.pig4cloud.pigx.flow.support.node.AssignUserStrategy; +import com.pig4cloud.pigx.flow.constant.ProcessInstanceConstant; +import com.pig4cloud.pigx.flow.dto.Node; +import com.pig4cloud.pigx.flow.dto.NodeUser; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 发起人自选分配策略实现 + *

+ * 实现发起人在提交流程时自主选择后续节点处理人的策略。 + * 这种策略提供了最大的灵活性,允许流程发起人根据实际情况选择合适的审批人。 + *

+ * 功能特点: + * 1. 在流程发起时由发起人选择各节点的处理人 + * 2. 选择的处理人信息存储在特定的流程变量中 + * 3. 通过节点ID关联获取对应的处理人 + *

+ * 使用场景: + * - 审批人不固定,需要根据具体情况选择 + * - 发起人最了解应该由谁审批的场景 + * - 需要灵活配置审批链的流程 + *

+ * 变量命名规则:{nodeId}_assignee_select + * + * @author Huijun Zhao + * @description 发起人自选的分配策略 + * @date 2023-07-07 13:42 + */ +@Slf4j +@RequiredArgsConstructor +@Component(ProcessInstanceConstant.AssignedTypeClass.SELF_SELECT + "AssignUserStrategy") +public class AssignUserSelfSelectStrategyImpl implements AssignUserStrategy { + + private final ObjectMapper objectMapper; + + /** + * 处理发起人自选的用户分配逻辑 + *

+ * 从流程变量中获取发起人为当前节点选择的处理人信息。 + * 变量名格式为:{nodeId}_assignee_select + * + * @param node 节点配置对象,使用节点ID构建变量名 + * @param rootUser 流程发起人信息(本策略中未直接使用) + * @param variables 流程变量Map,包含发起人选择的处理人信息 + * @return 发起人选择的用户ID列表,如果未找到则返回空列表 + * @throws Exception 当JSON解析失败时抛出异常 + */ + @SneakyThrows + @Override + public List handle(Node node, NodeUser rootUser, Map variables) { + + List assignList = new ArrayList<>(); + + Object variable = variables.get(StrUtil.format("{}_assignee_select", node.getId())); + log.info("{}-发起人自选参数:{}", node.getName(), variable); + if (variable == null) { + return assignList; + } + + List nodeUserDtos = objectMapper.readValue(objectMapper.writeValueAsString(variable), + new TypeReference<>() { + }); + + List collect = nodeUserDtos.stream().map(NodeUser::getId).toList(); + + assignList.addAll(collect); + return assignList; + } + +} diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/node/impl/AssignUserSelfStrategyImpl.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/node/impl/AssignUserSelfStrategyImpl.java new file mode 100644 index 000000000..a9f3d7da6 --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/node/impl/AssignUserSelfStrategyImpl.java @@ -0,0 +1,48 @@ +package com.pig4cloud.pigx.flow.support.node.impl; + +import cn.hutool.core.collection.CollUtil; +import com.pig4cloud.pigx.flow.support.node.AssignUserStrategy; +import com.pig4cloud.pigx.flow.constant.ProcessInstanceConstant; +import com.pig4cloud.pigx.flow.dto.Node; +import com.pig4cloud.pigx.flow.dto.NodeUser; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Map; + +/** + * 发起人自己分配策略实现 + *

+ * 实现将任务分配给流程发起人本人的策略。 + * 这是最简单的分配策略,任务将返回给发起流程的用户处理。 + *

+ * 使用场景: + * 1. 申请被驳回后需要发起人修改 + * 2. 流程中需要发起人确认某些信息 + * 3. 发起人需要补充材料或信息 + *

+ * 特点:无需配置,自动获取流程发起人信息 + * + * @author Huijun Zhao + * @description 发起人自己的分配策略 + * @date 2023-07-07 13:42 + */ +@Component(ProcessInstanceConstant.AssignedTypeClass.SELF + "AssignUserStrategy") +public class AssignUserSelfStrategyImpl implements AssignUserStrategy { + + /** + * 处理发起人分配逻辑 + *

+ * 直接返回流程发起人的用户ID,任务将分配给发起人本人。 + * + * @param node 节点配置对象(本策略中未使用) + * @param rootUser 流程发起人信息,包含发起人的用户ID + * @param variables 流程变量(本策略中未使用) + * @return 包含发起人用户ID的列表 + */ + @Override + public List handle(Node node, NodeUser rootUser, Map variables) { + return CollUtil.newArrayList(rootUser.getId()); + } + +} diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/tasks/ApproveServiceTask.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/tasks/ApproveServiceTask.java new file mode 100644 index 000000000..f1d2e4ad1 --- /dev/null +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/tasks/ApproveServiceTask.java @@ -0,0 +1,116 @@ +package com.pig4cloud.pigx.flow.support.tasks; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.spring.SpringUtil; +import com.pig4cloud.pigx.flow.dto.Node; +import com.pig4cloud.pigx.flow.dto.Refuse; +import com.pig4cloud.pigx.flow.service.IProcessNodeDataService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.JavaDelegate; +import org.flowable.engine.impl.persistence.entity.ExecutionEntityImpl; + +/** + * 审批服务任务 + *

+ * Flowable服务任务(Service Task)实现,用于处理审批节点的自动化逻辑。 + * 该任务在审批节点执行后自动触发,根据审批结果(通过/拒绝)决定流程的走向。 + *

+ * 主要功能: + * 1. 读取审批节点的审批结果 + * 2. 如果审批通过,流程继续正常执行 + * 3. 如果审批拒绝,根据配置执行拒绝策略(跳转到指定节点或结束流程) + *

+ * 使用方式: + * 在流程定义中,将此类配置为审批节点后的服务任务, + * 任务ID需要遵循命名规则:approve_service_task_{nodeId} + * + * @author pigx + */ +public class ApproveServiceTask implements JavaDelegate { + + /** + * 执行审批服务任务 + *

+ * 根据审批节点的审批结果决定流程的下一步走向。 + * 如果审批通过,流程正常继续;如果审批拒绝,执行拒绝策略。 + * + * @param execution 流程执行上下文,包含流程实例信息和变量 + */ + @Override + public void execute(DelegateExecution execution) { + // 转换为实现类以访问额外的方法 + ExecutionEntityImpl entity = (ExecutionEntityImpl) execution; + + // 从执行上下文中提取关键标识符 + String currentActivityId = entity.getActivityId(); // 当前活动ID + String flowDefinitionKey = entity.getProcessDefinitionKey(); // 流程定义键 + String processInstanceId = entity.getProcessInstanceId(); // 流程实例ID + + // 从活动ID中提取节点标识符 + // 如果currentActivityId是"approve_service_task_node1",则nodeId将是"node1" + String nodeId = StrUtil.subAfter(currentActivityId, "approve_service_task_", true); + + // 获取此节点的审批条件变量 + // 变量名格式:"{nodeId}_approve_condition"(例如:"node1_approve_condition") + String conditionVarName = StrUtil.format("{}_approve_condition", nodeId); + Boolean isApproved = execution.getVariable(conditionVarName, Boolean.class); + + // 只有当审批条件明确设置时才继续处理 + if (isApproved != null) { + // 获取Flowable RuntimeService bean,用于工作流状态变更 + RuntimeService runtimeService = SpringUtil.getBean(RuntimeService.class); + + // 如果未批准,确定工作流重定向的位置 + if (!isApproved) { + handleRejection(flowDefinitionKey, nodeId, currentActivityId, processInstanceId, runtimeService); + } + // 如果已批准,工作流将沿其正常路径继续(无需操作) + } + } + + /** + * 处理任务被拒绝时的流程重定向逻辑 + *

+ * 根据节点配置的拒绝策略,将流程重定向到指定节点或结束节点。 + * 支持的拒绝策略: + * 1. TO_NODE:跳转到指定节点 + * 2. 其他:直接结束流程 + * + * @param flowDefinitionKey 流程定义键 + * @param nodeId 当前节点标识符 + * @param currentActivityId 当前活动标识符 + * @param processInstanceId 流程实例标识符 + * @param runtimeService 用于流程状态操作的运行时服务 + */ + private void handleRejection(String flowDefinitionKey, String nodeId, String currentActivityId, + String processInstanceId, RuntimeService runtimeService) { + // 获取流程节点数据服务以获取节点配置数据 + IProcessNodeDataService processNodeDataService = SpringUtil.getBean(IProcessNodeDataService.class); + + // 查询节点的原始配置数据 + Node node = processNodeDataService.getNodeData(flowDefinitionKey, nodeId).getData(); + + // 获取拒绝处理配置 + Refuse refuseConfig = node.getRefuse(); + + if (refuseConfig != null) { + String rejectionHandler = refuseConfig.getHandler(); + + // 为当前流程实例创建状态变更构建器 + var stateChangeBuilder = runtimeService.createChangeActivityStateBuilder() + .processInstanceId(processInstanceId); + + if (StrUtil.equals(rejectionHandler, "TO_NODE")) { + // 根据拒绝设置重定向到特定节点 + stateChangeBuilder.moveActivityIdTo(currentActivityId, refuseConfig.getNodeId()).changeState(); + } + else { + // 默认行为:重定向到结束节点 + stateChangeBuilder.moveActivityIdTo(currentActivityId, "end").changeState(); + } + } + // 如果未设置refuseConfig,工作流将沿其正常路径继续 + } + +} \ No newline at end of file diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/service/CopyServiceTask.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/tasks/CopyServiceTask.java similarity index 52% rename from pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/service/CopyServiceTask.java rename to pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/tasks/CopyServiceTask.java index 9e9927fae..4ee0af968 100644 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/service/CopyServiceTask.java +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/tasks/CopyServiceTask.java @@ -1,4 +1,4 @@ -package com.pig4cloud.pigx.flow.engine.service; +package com.pig4cloud.pigx.flow.support.tasks; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; @@ -7,11 +7,12 @@ import cn.hutool.extra.spring.SpringUtil; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.pig4cloud.pigx.common.core.util.R; -import com.pig4cloud.pigx.flow.task.api.feign.RemoteFlowTaskService; -import com.pig4cloud.pigx.flow.task.constant.NodeUserTypeEnum; -import com.pig4cloud.pigx.flow.task.dto.Node; -import com.pig4cloud.pigx.flow.task.dto.NodeUser; -import com.pig4cloud.pigx.flow.task.dto.ProcessCopyDto; +import com.pig4cloud.pigx.flow.constant.NodeUserTypeEnum; +import com.pig4cloud.pigx.flow.dto.Node; +import com.pig4cloud.pigx.flow.dto.NodeUser; +import com.pig4cloud.pigx.flow.dto.ProcessCopyDto; +import com.pig4cloud.pigx.flow.service.IProcessNodeDataService; +import com.pig4cloud.pigx.flow.service.IRemoteService; import lombok.SneakyThrows; import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.JavaDelegate; @@ -20,15 +21,37 @@ import org.flowable.engine.impl.persistence.entity.ExecutionEntityImpl; import java.time.LocalDateTime; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; /** - * 抄送任务处理器--java服务任务 + * 抄送服务任务 + *

+ * Flowable服务任务(Service Task)实现,用于处理流程中的抄送功能。 + * 抄送任务会将流程信息发送给指定的用户或部门成员,供其查看但不需要审批。 + *

+ * 主要功能: + * 1. 获取节点配置的抄送人员(支持用户和部门) + * 2. 将部门展开为具体的用户列表 + * 3. 为每个抄送人创建抄送记录 + * 4. 记录流程快照信息供抄送人查看 + *

+ * 使用场景: + * - 需要通知相关人员但不需要审批的节点 + * - 流程信息备案和知会 + * - 跨部门协作中的信息同步 + * + * @author pigx */ public class CopyServiceTask implements JavaDelegate { /** - * 执行给定执行的任务。 - * @param execution 要处理的执行 + * 执行抄送任务 + *

+ * 从节点配置中获取抄送人员列表,创建抄送记录并通过远程服务保存。 + * 支持直接指定用户或指定部门(会展开为部门下的所有用户)。 + * + * @param execution 流程执行上下文,包含流程实例信息和变量 + * @throws Exception 当JSON解析或远程服务调用失败时抛出异常 */ @SneakyThrows @Override @@ -38,8 +61,9 @@ public class CopyServiceTask implements JavaDelegate { String nodeId = entity.getActivityId(); String flowId = entity.getProcessDefinitionKey(); - RemoteFlowTaskService remoteFlowTaskService = SpringUtil.getBean(RemoteFlowTaskService.class); - Node node = remoteFlowTaskService.queryNodeOriData(flowId, nodeId).getData(); + IRemoteService remoteService = SpringUtil.getBean(IRemoteService.class); + IProcessNodeDataService processNodeDataService = SpringUtil.getBean(IProcessNodeDataService.class); + Node node = processNodeDataService.getNodeData(flowId, nodeId).getData(); // 获取指定人员 List userDtoList = node.getNodeUserList(); @@ -47,22 +71,23 @@ public class CopyServiceTask implements JavaDelegate { List userIdList = userDtoList.stream() .filter(w -> StrUtil.equals(w.getType(), NodeUserTypeEnum.USER.getKey())) .map(w -> Convert.toStr(w.getId())) - .toList(); + .collect(Collectors.toList()); // 部门ID列表 - List deptIdList = userDtoList.stream() + List deptIdList = userDtoList.stream() .filter(w -> StrUtil.equals(w.getType(), NodeUserTypeEnum.DEPT.getKey())) - .map(w -> Convert.toStr(w.getId())) - .toList(); + .map(NodeUser::getId) + .toList(); if (CollUtil.isNotEmpty(deptIdList)) { - R> r = remoteFlowTaskService.queryUserIdListByDepIdList(deptIdList); + R> r = remoteService.queryUserIdListByDepIdList(deptIdList); - List data = r.getData(); + List data = r.getData(); if (CollUtil.isNotEmpty(data)) { - for (String datum : data) { - if (!userIdList.contains(datum)) { - userIdList.add(datum); + for (Long datum : data) { + String userIdStr = Convert.toStr(datum); + if (!userIdList.contains(userIdStr)) { + userIdList.add(userIdStr); } } } @@ -89,7 +114,7 @@ public class CopyServiceTask implements JavaDelegate { processCopyDto.setNodeName(node.getName()); processCopyDto.setFormData(objectMapper.writeValueAsString(variables)); processCopyDto.setUserId(Long.parseLong(userIds)); - remoteFlowTaskService.saveCC(processCopyDto); + remoteService.saveCC(processCopyDto); } } diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/utils/DataUtil.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/utils/DataUtil.java similarity index 53% rename from pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/utils/DataUtil.java rename to pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/utils/DataUtil.java index 2f702e164..7d8b13ac7 100644 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/utils/DataUtil.java +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/utils/DataUtil.java @@ -1,4 +1,4 @@ -package com.pig4cloud.pigx.flow.task.utils; +package com.pig4cloud.pigx.flow.support.utils; import cn.hutool.core.collection.CollUtil; import com.pig4cloud.pigx.admin.api.entity.SysDept; @@ -7,13 +7,31 @@ import com.pig4cloud.pigx.admin.api.entity.SysMenu; import java.util.ArrayList; import java.util.List; +/** + * 数据处理工具类 + *

+ * 提供组织架构数据的递归查询功能,包括部门和菜单的树形结构遍历。 + * 主要用于处理层级关系数据,支持向上查找父级和向下查找子级。 + *

+ * 功能特点: + * 1. 支持部门树的向上和向下遍历 + * 2. 支持菜单树的向下遍历 + * 3. 返回结果包含查询节点本身 + * 4. 使用递归算法实现树形遍历 + * + * @author pigx + */ public class DataUtil { /** - * 根据当前部门id,向上查找所有的部门 - * @param deptId - * @param allDeptList - * @return 返回包括自己部门在内的所有父级部门 + * 根据部门ID向上查找所有父级部门 + *

+ * 递归查找指定部门的所有上级部门,包括直接上级和间接上级。 + * 查找顺序从当前部门开始,逐级向上直到根部门。 + * + * @param deptId 当前部门ID + * @param allDeptList 所有部门列表 + * @return 包括自己部门在内的所有父级部门列表,如果部门不存在则返回空列表 */ public static List selectParentByDept(long deptId, List allDeptList) { List list = new ArrayList<>(); @@ -30,10 +48,14 @@ public class DataUtil { } /** - * 根据当前部门id,向下查找所有的部门 - * @param deptId - * @param allDeptList - * @return 返回包括自己部门在内的所有子级部门 + * 根据部门ID向下查找所有子级部门 + *

+ * 递归查找指定部门的所有下级部门,包括直接下级和间接下级。 + * 使用深度优先遍历算法,获取完整的子部门树。 + * + * @param deptId 当前部门ID + * @param allDeptList 所有部门列表 + * @return 包括自己部门在内的所有子级部门列表 */ public static List selectChildrenByDept(long deptId, List allDeptList) { List list = new ArrayList<>(); @@ -54,10 +76,14 @@ public class DataUtil { } /** - * 根据当前菜单id,向下查找所有的菜单 - * @param menuId - * @param allMenuList - * @return 返回包括自己在内的所有子级菜单 + * 根据菜单ID向下查找所有子级菜单 + *

+ * 递归查找指定菜单的所有下级菜单,包括直接下级和间接下级。 + * 主要用于菜单权限管理和菜单树的渲染。 + * + * @param menuId 当前菜单ID + * @param allMenuList 所有菜单列表 + * @return 包括自己在内的所有子级菜单列表 */ public static List selectChildrenByMenu(long menuId, List allMenuList) { List list = new ArrayList<>(); diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/utils/FlowableUtils.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/utils/FlowableUtils.java similarity index 81% rename from pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/utils/FlowableUtils.java rename to pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/utils/FlowableUtils.java index 66bd02153..65dab9fd0 100644 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/utils/FlowableUtils.java +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/utils/FlowableUtils.java @@ -1,4 +1,4 @@ -package com.pig4cloud.pigx.flow.engine.utils; +package com.pig4cloud.pigx.flow.support.utils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -10,19 +10,41 @@ import org.flowable.engine.impl.bpmn.behavior.SequentialMultiInstanceBehavior; import java.util.*; /** - * 流程引擎工具类封装 + * Flowable流程引擎工具类 + *

+ * 提供流程模型遍历、节点查找、路径分析等功能的工具类。 + * 该类是流程引擎操作的核心工具,支持复杂的流程拓扑结构分析。 + *

+ * 主要功能: + * 1. 流程元素的入口/出口连线获取 + * 2. 递归遍历流程定义获取所有元素 + * 3. 向前/向后查找用户任务节点 + * 4. 脏数据线路分析(用于回退场景) + * 5. 串行/并行关系判断 + * 6. 历史数据清洗 + *

+ * 支持的流程结构: + * - 顺序流程 + * - 并行网关 + * - 排他网关 + * - 子流程 + * - 多实例任务(会签) * - * @author: linjinp - * @create: 2019-12-24 13:51 - **/ + * @author linjinp + * @create 2019-12-24 13:51 + */ public class FlowableUtils { public static final Logger logger = LogManager.getLogger(FlowableUtils.class); /** * 根据节点获取入口连线集合 + *

+ * 支持多种流程元素类型,包括任务、网关、子流程、开始/结束事件等。 + * 入口连线是指向该节点的所有连线。 + * * @param source 流程元素节点 - * @return 入口连线集合 + * @return 入口连线集合,如果节点类型不支持则返回null */ public static List getElementIncomingFlows(FlowElement source) { List sequenceFlows = null; @@ -46,8 +68,12 @@ public class FlowableUtils { /** * 根据节点获取出口连线集合 + *

+ * 支持多种流程元素类型,包括任务、网关、子流程、开始/结束事件等。 + * 出口连线是从该节点出发的所有连线。 + * * @param source 流程元素节点 - * @return 出口连线集合 + * @return 出口连线集合,如果节点类型不支持则返回null */ public static List getElementOutgoingFlows(FlowElement source) { List sequenceFlows = null; @@ -71,9 +97,13 @@ public class FlowableUtils { /** * 递归获取流程定义所有的流程元素 + *

+ * 深度优先遍历流程定义,包括子流程中的所有元素。 + * 该方法常用于分析整个流程结构或查找特定元素。 + * * @param flowElements 当前级别流程元素集合 - * @param allElements 用于存储的全部流程元素集合 - * @return 全部流程元素集合 + * @param allElements 用于存储的全部流程元素集合,可为null + * @return 全部流程元素集合,包含所有层级的元素 */ public static Collection getAllElements(Collection flowElements, Collection allElements) { @@ -91,9 +121,14 @@ public class FlowableUtils { /** * 从后向前递归获取父级用户任务节点 - * @param source 当前节点 - * @param hasSequenceFlow 已处理过的顺序流集合,避免循环 - * @param userTaskList 递归获取的用户任务节点集合 + *

+ * 从当前节点开始,沿着入口连线向前查找所有的用户任务节点。 + * 主要用于流程回退、驳回等场景,找到可以回退的目标节点。 + * 支持子流程的遍历。 + * + * @param source 当前节点 + * @param hasSequenceFlow 已处理过的顺序流集合,避免循环,可为null + * @param userTaskList 递归获取的用户任务节点集合,可为null * @return 用户任务节点集合 */ public static List iteratorFindParentUserTasks(FlowElement source, Set hasSequenceFlow, @@ -147,12 +182,16 @@ public class FlowableUtils { } /** - * 根据正在运行的任务节点,迭代获取子级任务节点列表,向后找 - * @param source 起始节点 - * @param runActiveIdList 正在运行的任务 Key,用于校验任务节点是否是正在运行的节点 - * @param hasSequenceFlow 已经经过的连线的 ID,用于判断线路是否重复 + * 根据正在运行的任务节点,迭代获取子级任务节点列表 + *

+ * 从当前节点开始,沿着出口连线向后查找正在运行的任务节点。 + * 主要用于找到需要撤回或影响的下游节点。 + * + * @param source 起始节点 + * @param runActiveIdList 正在运行的任务Key,用于校验任务节点是否是正在运行的节点 + * @param hasSequenceFlow 已经经过的连线的ID,用于判断线路是否重复 * @param flowElementList 需要撤回的用户任务列表 - * @return + * @return 找到的流程元素列表 */ public static List iteratorFindChildUserTasks(FlowElement source, List runActiveIdList, Set hasSequenceFlow, List flowElementList) { @@ -209,10 +248,14 @@ public class FlowableUtils { /** * 迭代获取子流程用户任务节点 - * @param source 起始节点 - * @param hasSequenceFlow 已经经过的连线的 ID,用于判断线路是否重复 - * @param userTaskList 需要撤回的用户任务列表 - * @return + *

+ * 专门用于处理子流程内部的用户任务节点查找。 + * 从子流程的起始节点开始,找到所有的用户任务节点。 + * + * @param source 起始节点 + * @param hasSequenceFlow 已经经过的连线的ID,用于判断线路是否重复 + * @param userTaskList 需要撤回的用户任务列表 + * @return 用户任务节点列表 */ public static List findChildProcessUserTasks(FlowElement source, Set hasSequenceFlow, List userTaskList) { @@ -260,12 +303,16 @@ public class FlowableUtils { /** * 从后向前寻路,获取所有脏线路上的点 - * @param source 起始节点 - * @param passRoads 已经经过的点集合 - * @param hasSequenceFlow 已经经过的连线的 ID,用于判断线路是否重复 - * @param targets 目标脏线路终点 - * @param dirtyRoads 确定为脏数据的点,因为不需要重复,因此使用 set 存储 - * @return + *

+ * 脏线路是指由于流程回退、驳回等操作产生的废弃路径。 + * 该方法用于识别这些废弃路径上的所有节点,以便进行清理或过滤。 + * + * @param source 起始节点 + * @param passRoads 已经经过的点集合 + * @param hasSequenceFlow 已经经过的连线的ID,用于判断线路是否重复 + * @param targets 目标脏线路终点 + * @param dirtyRoads 确定为脏数据的点,因为不需要重复,因此使用set存储 + * @return 脏线路上的所有节点ID集合 */ public static Set iteratorFindDirtyRoads(FlowElement source, List passRoads, Set hasSequenceFlow, List targets, Set dirtyRoads) { @@ -325,11 +372,15 @@ public class FlowableUtils { } /** - * 迭代获取子流程脏路线 说明,假如回退的点就是子流程,那么也肯定会回退到子流程最初的用户任务节点,因此子流程中的节点全是脏路线 - * @param source 起始节点 - * @param hasSequenceFlow 已经经过的连线的 ID,用于判断线路是否重复 - * @param dirtyRoads 确定为脏数据的点,因为不需要重复,因此使用 set 存储 - * @return + * 迭代获取子流程脏路线 + *

+ * 当回退点是子流程时,子流程中的所有节点都被认为是脏路线。 + * 该方法递归遍历子流程,获取其中的所有节点。 + * + * @param source 起始节点 + * @param hasSequenceFlow 已经经过的连线的ID,用于判断线路是否重复 + * @param dirtyRoads 确定为脏数据的点,因为不需要重复,因此使用set存储 + * @return 子流程中所有节点的ID集合 */ public static Set findChildProcessAllDirtyRoad(FlowElement source, Set hasSequenceFlow, Set dirtyRoads) { @@ -369,11 +420,15 @@ public class FlowableUtils { /** * 判断脏路线结束节点是否在子流程上 - * @param source 起始节点 - * @param hasSequenceFlow 已经经过的连线的 ID,用于判断线路是否重复 - * @param targets 判断脏路线节点是否存在子流程上,只要存在一个,说明脏路线只到子流程为止 - * @param inChildProcess 是否存在子流程上,true 是,false 否 - * @return + *

+ * 用于判断脏路线的范围,如果脏路线终点在子流程中, + * 说明脏路线只到子流程为止,不会影响父流程。 + * + * @param source 起始节点 + * @param hasSequenceFlow 已经经过的连线的ID,用于判断线路是否重复 + * @param targets 判断脏路线节点是否存在子流程上,只要存在一个,说明脏路线只到子流程为止 + * @param inChildProcess 是否存在子流程上,true是,false否 + * @return 是否在子流程中 */ public static Boolean dirtyTargetInChildProcess(FlowElement source, Set hasSequenceFlow, List targets, Boolean inChildProcess) { @@ -415,12 +470,17 @@ public class FlowableUtils { } /** - * 迭代从后向前扫描,判断目标节点相对于当前节点是否是串行 不存在直接回退到子流程中的情况,但存在从子流程出去到父流程情况 - * @param source 起始节点 - * @param isSequential 是否串行 - * @param hasSequenceFlow 已经经过的连线的 ID,用于判断线路是否重复 - * @param targetKsy 目标节点 - * @return + * 迭代从后向前扫描,判断目标节点相对于当前节点是否是串行 + *

+ * 用于判断两个节点之间是否存在并行关系。 + * 如果两个节点之间只有唯一路径,则为串行;如果存在多条路径,则为并行。 + * 不存在直接回退到子流程中的情况,但存在从子流程出去到父流程情况。 + * + * @param source 起始节点 + * @param targetKsy 目标节点ID + * @param hasSequenceFlow 已经经过的连线的ID,用于判断线路是否重复 + * @param isSequential 是否串行,默认为true + * @return true表示串行,false表示并行 */ public static Boolean iteratorCheckSequentialReferTarget(FlowElement source, String targetKsy, Set hasSequenceFlow, Boolean isSequential) { @@ -468,11 +528,17 @@ public class FlowableUtils { } /** - * 从后向前寻路,获取到达节点的所有路线 不存在直接回退到子流程,但是存在回退到父级流程的情况 - * @param source 起始节点 - * @param passRoads 已经经过的点集合 - * @param roads 路线 - * @return + * 从后向前寻路,获取到达节点的所有路线 + *

+ * 找到从当前节点到开始节点的所有可能路径。 + * 每条路径是一个用户任务节点的有序列表。 + * 不存在直接回退到子流程,但是存在回退到父级流程的情况。 + * + * @param source 起始节点 + * @param passRoads 已经经过的点集合 + * @param hasSequenceFlow 已经经过的连线的ID,用于判断线路是否重复 + * @param roads 路线集合 + * @return 所有可能的路径列表 */ public static List> findRoad(FlowElement source, List passRoads, Set hasSequenceFlow, List> roads) { @@ -515,10 +581,20 @@ public class FlowableUtils { } /** - * 历史节点数据清洗,清洗掉又回滚导致的脏数据 - * @param allElements 全部节点信息 + * 历史节点数据清洗,清洗掉由于回滚导致的脏数据 + *

+ * 在流程回退、驳回等操作后,历史数据中会存在废弃的节点记录。 + * 该方法通过分析删除原因和节点关系,识别并过滤掉这些脏数据, + * 返回真实有效的历史节点记录。 + *

+ * 特别处理: + * - 会签节点的多实例情况 + * - 并行网关的多分支情况 + * - 连续驳回的情况 + * + * @param allElements 全部节点信息 * @param historicActivityIdList 历史任务实例信息,数据采用开始时间升序 - * @return + * @return 清洗后的有效历史节点ID列表 */ public static List historicTaskInstanceClean(Collection allElements, List historicActivityIdList) { diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/utils/ModelUtil.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/utils/ModelUtil.java similarity index 71% rename from pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/utils/ModelUtil.java rename to pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/utils/ModelUtil.java index d2272b58d..a126071a2 100644 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/utils/ModelUtil.java +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/utils/ModelUtil.java @@ -1,38 +1,62 @@ -package com.pig4cloud.pigx.flow.engine.utils; +package com.pig4cloud.pigx.flow.support.utils; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.extra.spring.SpringUtil; import cn.hutool.json.JSONUtil; -import com.pig4cloud.pigx.flow.engine.expression.condition.NodeExpressionStrategyFactory; -import com.pig4cloud.pigx.flow.engine.listeners.ApprovalCreateListener; -import com.pig4cloud.pigx.flow.engine.listeners.FlowProcessEventListener; -import com.pig4cloud.pigx.flow.engine.service.ApproveServiceTask; -import com.pig4cloud.pigx.flow.engine.service.CopyServiceTask; -import com.pig4cloud.pigx.flow.task.api.feign.RemoteFlowTaskService; -import com.pig4cloud.pigx.flow.task.constant.NodeTypeEnum; -import com.pig4cloud.pigx.flow.task.constant.ProcessInstanceConstant; -import com.pig4cloud.pigx.flow.task.dto.Node; -import com.pig4cloud.pigx.flow.task.dto.ProcessNodeDataDto; -import com.pig4cloud.pigx.flow.task.utils.NodeUtil; +import com.pig4cloud.pigx.flow.constant.NodeTypeEnum; +import com.pig4cloud.pigx.flow.constant.ProcessInstanceConstant; +import com.pig4cloud.pigx.flow.dto.Node; +import com.pig4cloud.pigx.flow.dto.ProcessNodeDataDto; +import com.pig4cloud.pigx.flow.service.IProcessNodeDataService; +import com.pig4cloud.pigx.flow.support.expression.condition.NodeExpressionStrategyFactory; +import com.pig4cloud.pigx.flow.support.listeners.ApprovalCreateListener; +import com.pig4cloud.pigx.flow.support.listeners.FlowProcessEventListener; +import com.pig4cloud.pigx.flow.support.tasks.ApproveServiceTask; +import com.pig4cloud.pigx.flow.support.tasks.CopyServiceTask; import lombok.extern.slf4j.Slf4j; -import org.flowable.bpmn.model.Process; import org.flowable.bpmn.model.*; +import org.flowable.bpmn.model.Process; import java.util.ArrayList; import java.util.List; /** - * 模型工具类 处理模型构建相关的 + * BPMN模型构建工具类 + *

+ * 负责将前端设计的流程节点结构转换为Flowable引擎可执行的BPMN模型。 + * 该工具类是流程定义创建的核心,支持各种节点类型和流程结构的转换。 + *

+ * 主要功能: + * 1. 将前端节点树结构转换为BPMN模型 + * 2. 创建各种类型的流程节点(开始、结束、审批、抄送、网关等) + * 3. 创建节点间的连接线(顺序流) + * 4. 配置节点的执行策略和监听器 + * 5. 处理多实例任务(会签、或签) + *

+ * 支持的节点类型: + * - 开始节点、结束节点 + * - 审批节点(支持单人、会签、或签) + * - 抄送节点 + * - 排他网关(条件分支) + * - 并行网关 + * + * @author pigx */ @Slf4j public class ModelUtil { /** - * 构建模型 - * @param nodeDto 前端传输节点 - * @return + * 构建BPMN模型 + *

+ * 将前端传输的节点树结构转换为Flowable引擎可执行的BPMN模型。 + * 该方法是整个转换过程的入口,负责协调各个步骤。 + * + * @param nodeDto 前端传输的根节点,包含整个流程的节点树结构 + * @param processName 流程名称 + * @param flowId 流程定义ID + * @return 构建完成的BPMN模型对象 */ public static BpmnModel buildBpmnModel(Node nodeDto, String processName, String flowId) { BpmnModel bpmnModel = new BpmnModel(); @@ -72,10 +96,14 @@ public class ModelUtil { } /** - * 先创建所有的节点 - * @param process - * @param nodeDto - * @param flowId + * 递归创建所有节点 + *

+ * 遍历节点树结构,创建所有的流程节点元素。 + * 该方法只负责创建节点,不处理节点间的连接关系。 + * + * @param process 流程对象,用于添加流程元素 + * @param nodeDto 当前处理的节点 + * @param flowId 流程定义ID */ public static void buildAllNode(Process process, Node nodeDto, String flowId) { if (!NodeUtil.isNode(nodeDto)) { @@ -115,10 +143,14 @@ public class ModelUtil { } /** - * 先创建所有的内部节点连接线 - * @param process - * @param nodeDto - * @param flowId + * 创建所有节点的内部连接线 + *

+ * 处理节点内部的连接线,例如审批节点与其后续服务任务的连接。 + * 这些连接线是节点内部的逻辑关系,不属于节点间的连接。 + * + * @param process 流程对象 + * @param nodeDto 当前处理的节点 + * @param flowId 流程定义ID */ public static void buildAllNodeInnerSequence(Process process, Node nodeDto, String flowId) { if (!NodeUtil.isNode(nodeDto)) { @@ -155,10 +187,16 @@ public class ModelUtil { } /** - * 递归创建节点间连线 - * @param process 流程 - * @param nodeDto 节点对象 - * @param nextId + * 递归创建节点间连接线 + *

+ * 处理节点与节点之间的连接关系,包括: + * 1. 普通节点间的顺序连接 + * 2. 网关节点的分支连接 + * 3. 分支合并的连接 + * + * @param process 流程对象 + * @param nodeDto 当前处理的节点 + * @param nextId 下一个节点的ID,用于处理最后一个节点的连接 */ public static void buildAllNodeOuterSequence(Process process, Node nodeDto, String nextId) { @@ -251,9 +289,13 @@ public class ModelUtil { /** * 构建节点 - * @param node 前端传输节点 - * @param flowId - * @return + *

+ * 根据节点类型创建对应的BPMN元素。 + * 同时会将节点数据存储到数据库中,供运行时查询使用。 + * + * @param node 前端传输的节点数据 + * @param flowId 流程定义ID + * @return 创建的流程元素列表 */ private static List buildNode(Node node, String flowId) { List flowElementList = new ArrayList<>(); @@ -268,12 +310,12 @@ public class ModelUtil { node.setName(StrUtil.format("{}[{}]", node.getName(), RandomUtil.randomNumbers(5))); // 存储节点数据 - RemoteFlowTaskService remoteFlowTaskService = SpringUtil.getBean(RemoteFlowTaskService.class); + IProcessNodeDataService processNodeDataService = SpringUtil.getBean(IProcessNodeDataService.class); ProcessNodeDataDto processNodeDataDto = new ProcessNodeDataDto(); processNodeDataDto.setFlowId(flowId); processNodeDataDto.setNodeId(node.getId()); processNodeDataDto.setData(JSONUtil.toJsonStr(node)); - remoteFlowTaskService.saveNodeOriData(processNodeDataDto); + processNodeDataService.saveNodeData(processNodeDataDto); // 开始 if (node.getType() == NodeTypeEnum.ROOT.getValue().intValue()) { @@ -308,9 +350,13 @@ public class ModelUtil { } /** - * 构建开始节点 添加一个自动完成任务的用户任务节点 - * @param node 前端传输节点 - * @return + * 构建开始节点 + *

+ * 创建BPMN流程的开始事件节点。 + * 每个流程必须有且只有一个开始节点。 + * + * @param node 前端传输的开始节点数据 + * @return 包含开始事件的流程元素列表 */ private static List buildStartNode(Node node) { @@ -327,8 +373,15 @@ public class ModelUtil { /** * 构建审批节点 - * @param node - * @return + *

+ * 创建审批节点,包括用户任务和后续的服务任务。 + * 支持多种审批模式: + * 1. 单人审批 + * 2. 会签(并行/串行) + * 3. 或签 + * + * @param node 审批节点数据 + * @return 包含用户任务和服务任务的流程元素列表 */ private static List buildApproveNode(Node node) { List flowElementList = new ArrayList<>(); @@ -397,8 +450,12 @@ public class ModelUtil { /** * 创建用户任务 - * @param node 前端传输节点 - * @return + *

+ * 创建基本的用户任务节点,并可以添加任务监听器。 + * + * @param node 节点数据 + * @param flowableListeners 可选的任务监听器数组 + * @return 用户任务对象 */ private static UserTask buildUserTask(Node node, FlowableListener... flowableListeners) { UserTask userTask = new UserTask(); @@ -419,9 +476,12 @@ public class ModelUtil { } /** - * 构建简单的包容网关 - * @param node - * @return + * 构建简单的排他网关 + *

+ * 创建排他网关节点,用于条件分支。 + * + * @param node 网关节点数据 + * @return 排他网关元素 */ private static FlowElement buildSimpleExclusiveGatewayNode(Node node) { @@ -435,8 +495,12 @@ public class ModelUtil { /** * 构建并行网关 - * @param node - * @return + *

+ * 创建并行网关节点和对应的合并网关。 + * 并行网关用于创建多个并行执行的分支。 + * + * @param node 并行网关节点数据 + * @return 包含分叉网关和合并网关的元素列表 */ private static List buildParallelGatewayNode(Node node) { node.setTailId(StrUtil.format("{}_merge_gateway", node.getId())); @@ -458,8 +522,12 @@ public class ModelUtil { /** * 构建包容网关 - * @param node - * @return + *

+ * 创建包容网关(条件分支)节点和对应的合并网关。 + * 包容网关用于根据条件创建不同的执行路径。 + * + * @param node 包容网关节点数据 + * @return 包含分叉网关和合并网关的元素列表 */ private static List buildInclusiveGatewayNode(Node node) { @@ -483,9 +551,13 @@ public class ModelUtil { /** * 构建结束节点 - * @param node 前端传输节点 - * @param terminateAll - * @return + *

+ * 创建BPMN流程的结束事件节点。 + * 使用终止事件定义,确保流程实例正确结束。 + * + * @param node 结束节点数据 + * @param terminateAll 是否终止所有活动实例 + * @return 结束事件对象 */ private static EndEvent buildEndNode(Node node, boolean terminateAll) { EndEvent endEvent = new EndEvent(); @@ -502,11 +574,15 @@ public class ModelUtil { } /** - * 创建连接线 - * @param node 子级节点 + * 创建节点间连接线 + *

+ * 创建父节点到子节点的连接线。 + * 使用节点的tailId和headId确定连接点。 + * + * @param node 子级节点 * @param parentNode 父级节点 - * @param expression - * @return 所有连接线 + * @param expression 连接线条件表达式 + * @return 连接线列表 */ private static List buildSequenceFlow(Node node, Node parentNode, String expression) { List sequenceFlowList = new ArrayList<>(); @@ -529,10 +605,13 @@ public class ModelUtil { } /** - * 生成扩展数据 - * @param key - * @param val - * @return + * 生成扩展属性 + *

+ * 创建自定义的扩展属性,用于在BPMN元素中存储额外信息。 + * + * @param key 属性键 + * @param val 属性值 + * @return 扩展属性对象 */ public static ExtensionAttribute generateExtensionAttribute(String key, String val) { ExtensionAttribute ea = new ExtensionAttribute(); @@ -544,8 +623,12 @@ public class ModelUtil { /** * 创建抄送节点 - * @param node - * @return + *

+ * 创建抄送服务任务节点,用于将流程信息通知给相关人员。 + * 配置了失败重试机制,确保抄送任务的可靠性。 + * + * @param node 抄送节点数据 + * @return 服务任务元素 */ private static FlowElement buildCCNode(Node node) { @@ -570,10 +653,13 @@ public class ModelUtil { } /** - * 创建连接线 - * @param node 父级节点 - * @param flowId - * @return 所有连接线 + * 创建节点内部连接线 + *

+ * 创建节点内部的连接线,例如审批节点与其后续服务任务之间的连接。 + * + * @param node 节点数据 + * @param flowId 流程定义ID + * @return 内部连接线列表 */ private static List buildInnerSequenceFlow(Node node, String flowId) { @@ -603,11 +689,15 @@ public class ModelUtil { /** * 创建单个连接线 - * @param pId 父级id - * @param childId 子级id - * @param expression 表达式 - * @param name - * @return + *

+ * 创建两个节点之间的顺序流连接线。 + * 自动生成唯一的连接线ID和名称。 + * + * @param pId 父级节点ID(起始节点) + * @param childId 子级节点ID(目标节点) + * @param expression 条件表达式,可以为空 + * @param name 连接线名称,可以为null + * @return 顺序流对象,如果参数不合法则返回null */ private static SequenceFlow buildSingleSequenceFlow(String pId, String childId, String expression, String name) { if (StrUtil.hasBlank(pId, childId)) { diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/utils/NodeUtil.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/utils/NodeUtil.java similarity index 50% rename from pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/utils/NodeUtil.java rename to pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/utils/NodeUtil.java index bdb3e7253..7aef91f31 100644 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/utils/NodeUtil.java +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/support/utils/NodeUtil.java @@ -1,26 +1,53 @@ -package com.pig4cloud.pigx.flow.task.utils; +package com.pig4cloud.pigx.flow.support.utils; import cn.hutool.core.util.StrUtil; -import com.pig4cloud.pigx.flow.task.constant.NodeTypeEnum; -import com.pig4cloud.pigx.flow.task.constant.ProcessInstanceConstant; -import com.pig4cloud.pigx.flow.task.dto.Node; +import com.pig4cloud.pigx.flow.constant.NodeTypeEnum; +import com.pig4cloud.pigx.flow.constant.ProcessInstanceConstant; +import com.pig4cloud.pigx.flow.dto.Node; import java.util.ArrayList; import java.util.List; +/** + * 流程节点工具类 + *

+ * 提供流程节点的常用操作方法,包括节点遍历、节点查找、节点构建等功能。 主要用于处理流程定义的树形结构,支持条件分支和并行分支的递归处理。 + *

+ * + * @author pigx + */ public class NodeUtil { + /** + * 从流程定义ID中提取流程ID + *

+ * Flowable引擎的流程定义ID格式为:flowId:version:deploymentId 该方法提取冒号前的flowId部分 + *

+ * @param processDefinitionId Flowable引擎的流程定义ID + * @return 流程ID + */ public static String getFlowId(String processDefinitionId) { return StrUtil.subBefore(processDefinitionId, ":", false); } + /** + * 判断是否为有效节点 + *

+ * 有效节点的条件: 1. 节点对象不为null 2. 节点ID不为空 + *

+ * @param childNode 要判断的节点对象 + * @return true=有效节点,false=无效节点 + */ public static boolean isNode(Node childNode) { return childNode != null && StrUtil.isNotBlank(childNode.getId()); } /** - * 添加结束节点 - * @param node + * 为流程添加结束节点 + *

+ * 递归遍历流程节点链,找到最末端节点并添加结束节点。 Flowable引擎要求流程必须有明确的结束节点。 + *

+ * @param node 流程起始节点 */ public static void addEndNode(Node node) { @@ -40,8 +67,12 @@ public class NodeUtil { } /** - * 需要发起人选择用户的节点 - * @param node + * 查找需要发起人选择执行人的节点 + *

+ * 递归遍历流程节点,找出所有设置为"发起人自选"类型的审批节点。 这些节点在流程发起时需要发起人手动指定执行人。 支持处理条件分支和并行分支中的节点。 + *

+ * @param node 要遍历的起始节点 + * @return 需要发起人选择执行人的节点ID列表 */ public static List selectUserNodeId(Node node) { List list = new ArrayList<>(); diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/org/flowable/common/engine/impl/AbstractEngineConfiguration.java b/pigx-flow/pigx-flow-biz/src/main/java/org/flowable/common/engine/impl/AbstractEngineConfiguration.java similarity index 99% rename from pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/org/flowable/common/engine/impl/AbstractEngineConfiguration.java rename to pigx-flow/pigx-flow-biz/src/main/java/org/flowable/common/engine/impl/AbstractEngineConfiguration.java index 5ccce7389..cb97304d4 100644 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/org/flowable/common/engine/impl/AbstractEngineConfiguration.java +++ b/pigx-flow/pigx-flow-biz/src/main/java/org/flowable/common/engine/impl/AbstractEngineConfiguration.java @@ -451,6 +451,7 @@ public abstract class AbstractEngineConfiguration { databaseTypeMappings.setProperty("DB2/2", DATABASE_TYPE_DB2); databaseTypeMappings.setProperty("DB2 UDB AS400", DATABASE_TYPE_DB2); databaseTypeMappings.setProperty("DM DBMS", DATABASE_TYPE_MYSQL);// 扩展支持达梦数据 + databaseTypeMappings.setProperty("KingbaseES", DATABASE_TYPE_POSTGRES);// 扩展支持人大金仓 databaseTypeMappings.setProperty(PRODUCT_NAME_CRDB, DATABASE_TYPE_COCKROACHDB); return databaseTypeMappings; } diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/resources/application.yml b/pigx-flow/pigx-flow-biz/src/main/resources/application.yml similarity index 100% rename from pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/resources/application.yml rename to pigx-flow/pigx-flow-biz/src/main/resources/application.yml diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/resources/logback-spring.xml b/pigx-flow/pigx-flow-biz/src/main/resources/logback-spring.xml similarity index 99% rename from pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/resources/logback-spring.xml rename to pigx-flow/pigx-flow-biz/src/main/resources/logback-spring.xml index 1a5d10343..5c17b5b63 100644 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/resources/logback-spring.xml +++ b/pigx-flow/pigx-flow-biz/src/main/resources/logback-spring.xml @@ -63,7 +63,7 @@ - + diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-api/pom.xml b/pigx-flow/pigx-flow-engine/pigx-flow-engine-api/pom.xml deleted file mode 100644 index 31de527d9..000000000 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-api/pom.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - 4.0.0 - - com.pig4cloud - pigx-flow-engine - 5.9.0 - - - pigx-flow-engine-api - - - - - com.pig4cloud - pigx-common-core - - - - com.baomidou - mybatis-plus-extension - - - - com.pig4cloud - pigx-common-feign - - - - com.pig4cloud - pigx-common-excel - - - diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-api/src/main/java/com/pig4cloud/pigx/flow/engine/api/feign/packge-info.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-api/src/main/java/com/pig4cloud/pigx/flow/engine/api/feign/packge-info.java deleted file mode 100644 index b3dce91f5..000000000 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-api/src/main/java/com/pig4cloud/pigx/flow/engine/api/feign/packge-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/* - @author pigx archetype - *

- * feign client 存放目录,注意 @EnablePigxFeignClients 的扫描范围 - */ -package com.pig4cloud.pigx.flow.engine.api.feign; \ No newline at end of file diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-api/src/main/java/com/pig4cloud/pigx/flow/engine/constant/packge-info.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-api/src/main/java/com/pig4cloud/pigx/flow/engine/constant/packge-info.java deleted file mode 100644 index 99b19b1da..000000000 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-api/src/main/java/com/pig4cloud/pigx/flow/engine/constant/packge-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/* - * @author pigx archetype - *

- * 常量和枚举定义 - */ -package com.pig4cloud.pigx.flow.engine.constant; \ No newline at end of file diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-api/src/main/java/com/pig4cloud/pigx/flow/engine/dto/packge-info.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-api/src/main/java/com/pig4cloud/pigx/flow/engine/dto/packge-info.java deleted file mode 100644 index 6d96d5cdd..000000000 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-api/src/main/java/com/pig4cloud/pigx/flow/engine/dto/packge-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/* - * @author pigx archetype - *

- * DTO 存放目录 - */ -package com.pig4cloud.pigx.flow.engine.dto; \ No newline at end of file diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-api/src/main/java/com/pig4cloud/pigx/flow/engine/entity/packge-info.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-api/src/main/java/com/pig4cloud/pigx/flow/engine/entity/packge-info.java deleted file mode 100644 index f841cdff5..000000000 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-api/src/main/java/com/pig4cloud/pigx/flow/engine/entity/packge-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/* - * @author pigx archetype - *

- * 实体 存放目录 - */ -package com.pig4cloud.pigx.flow.engine.entity; \ No newline at end of file diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/PigxFlowEngineApplication.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/PigxFlowEngineApplication.java deleted file mode 100644 index a38349109..000000000 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/PigxFlowEngineApplication.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.pig4cloud.pigx.flow.engine; - -import com.pig4cloud.pigx.common.feign.annotation.EnablePigxFeignClients; -import com.pig4cloud.pigx.common.security.annotation.EnablePigxResourceServer; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.client.discovery.EnableDiscoveryClient; - -/** - * @author pigx archetype - *

- * 项目启动类 - */ -@EnablePigxFeignClients -@EnableDiscoveryClient -@EnablePigxResourceServer -@SpringBootApplication -public class PigxFlowEngineApplication { - - public static void main(String[] args) { - SpringApplication.run(PigxFlowEngineApplication.class, args); - } - -} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/controller/EngineFlowController.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/controller/EngineFlowController.java deleted file mode 100644 index d74deff40..000000000 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/controller/EngineFlowController.java +++ /dev/null @@ -1,293 +0,0 @@ -package com.pig4cloud.pigx.flow.engine.controller; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.date.DatePattern; -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.io.FileUtil; -import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.RandomUtil; -import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.pig4cloud.pigx.common.core.util.R; -import com.pig4cloud.pigx.common.data.tenant.TenantContextHolder; -import com.pig4cloud.pigx.flow.engine.utils.ModelUtil; -import com.pig4cloud.pigx.flow.task.dto.*; -import com.pig4cloud.pigx.flow.task.entity.Process; -import com.pig4cloud.pigx.flow.task.utils.NodeUtil; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.flowable.bpmn.converter.BpmnXMLConverter; -import org.flowable.bpmn.model.BpmnModel; -import org.flowable.common.engine.impl.identity.Authentication; -import org.flowable.engine.HistoryService; -import org.flowable.engine.RepositoryService; -import org.flowable.engine.RuntimeService; -import org.flowable.engine.TaskService; -import org.flowable.engine.history.HistoricActivityInstance; -import org.flowable.engine.history.HistoricActivityInstanceQuery; -import org.flowable.engine.runtime.Execution; -import org.flowable.engine.runtime.ProcessInstance; -import org.flowable.task.api.TaskQuery; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.time.ZoneId; -import java.time.ZonedDateTime; -import java.util.*; - -/** - * 工作流控制器 负责流程模型的创建、启动、审批等功能 - */ -@Slf4j -@RestController -@RequiredArgsConstructor -@RequestMapping("/flow") -public class EngineFlowController { - - private final TaskService taskService; - - private final HistoryService historyService; - - private final RepositoryService repositoryService; - - private final RuntimeService runtimeService; - - private final ObjectMapper objectMapper; - - /** - * 创建流程定义 - * - * @param map 创建参数 - * @return 流程定义ID - */ - @PostMapping("create") - @SneakyThrows - public R create(@RequestBody Map map) { - - Long userId = MapUtil.getLong(map, "userId"); - - Process process = MapUtil.get(map, "process", Process.class); - - String flowId = "P" + DateUtil.format(new Date(), DatePattern.PURE_DATETIME_MS_PATTERN) - + RandomUtil.randomString(5).toUpperCase(); - log.info("flowId={}", flowId); - BpmnModel bpmnModel = ModelUtil.buildBpmnModel(objectMapper.readValue(process.getProcess(), Node.class), - process.getName(), flowId); - { - byte[] bpmnBytess = new BpmnXMLConverter().convertToXML(bpmnModel); - String filename = "/tmp/flowable-deployment/" + flowId + ".bpmn20.xml"; - log.debug("部署时的模型文件:{}", filename); - FileUtil.writeBytes(bpmnBytess, filename); - } - repositoryService.createDeployment().addBpmnModel(StrUtil.format("{}.bpmn20.xml", "pig"), bpmnModel) - .tenantId(TenantContextHolder.getTenantId().toString()).deploy(); - - return R.ok(flowId); - } - - /** - * 启动流程实例 - * - * @param processInstanceParamDto 启动参数 - * @return 流程实例ID - */ - @PostMapping("/start") - public R start(@RequestBody ProcessInstanceParamDto processInstanceParamDto) { - Authentication.setAuthenticatedUserId(processInstanceParamDto.getStartUserId()); - ProcessInstance processInstance = runtimeService.startProcessInstanceByKeyAndTenantId(processInstanceParamDto.getFlowId(), - processInstanceParamDto.getParamMap(), TenantContextHolder.getTenantId().toString()); - - String processInstanceId = processInstance.getProcessInstanceId(); - return R.ok(processInstanceId); - - } - - /** - * 审批任务 - * - * @param taskId 任务ID - * @param approved 是否通过 - */ - @PostMapping("/approve") - public void approve(String taskId, boolean approved) { - Map variables = new HashMap<>(); - variables.put("approved", approved); - variables.put("ko", 10); - variables.put("assigneeListSub", CollUtil.newArrayList("aa", "bb")); - taskService.complete(taskId, variables); - - } - - /** - * 停止流程实例 - * - * @param taskParamDto 参数 - * @return 操作结果 - */ - @PostMapping("stopProcessInstance") - public R stopProcessInstance(@RequestBody TaskParamDto taskParamDto) { - List processInstanceIdList = taskParamDto.getProcessInstanceIdList(); - processInstanceIdList.forEach(processInstanceId -> { - // 查询流程实例 - ProcessInstance processInstance = runtimeService.createProcessInstanceQuery() - .processInstanceId(processInstanceId) - .processInstanceTenantId(TenantContextHolder.getTenantId().toString()) - .singleResult(); - if (Optional.ofNullable(processInstance).isPresent()) { - // 查询执行实例 - List executionIds = runtimeService.createExecutionQuery() - .parentId(processInstanceId) - .list() - .stream() - .map(Execution::getId) - .toList(); - // 更改活动状态为结束 - runtimeService.createChangeActivityStateBuilder() - .moveExecutionsToSingleActivityId(executionIds, "end") - .changeState(); - } - }); - return R.ok(); - } - - /** - * 查询用户已办任务 - * - * @param taskQueryParamDto 查询参数 - * @return 分页任务信息 - */ - @PostMapping("/queryCompletedTask") - public R queryCompletedTask(@RequestBody TaskQueryParamDto taskQueryParamDto) { - HistoricActivityInstanceQuery historicActivityInstanceQuery = historyService - .createHistoricActivityInstanceQuery(); - HistoricActivityInstanceQuery activityInstanceQuery = historicActivityInstanceQuery - .taskAssignee(taskQueryParamDto.getAssign()) - .finished() - .orderByHistoricActivityInstanceEndTime() - .desc(); - - if (ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime())) { - ZoneId zoneId = ZoneId.systemDefault(); - ZonedDateTime zonedBeforeDateTime = taskQueryParamDto.getTaskTime()[0].atZone(zoneId); - ZonedDateTime zonedAfterDateTime = taskQueryParamDto.getTaskTime()[1].atZone(zoneId); - Date beforeDate = Date.from(zonedBeforeDateTime.toInstant()); - Date afterDate = Date.from(zonedAfterDateTime.toInstant()); - activityInstanceQuery.finishedBefore(afterDate).finishedAfter(beforeDate); - } - - List list = activityInstanceQuery - .listPage((taskQueryParamDto.getCurrent() - 1) * taskQueryParamDto.getSize(), taskQueryParamDto.getSize()); - - long count = activityInstanceQuery.count(); - List taskDtoList = new ArrayList<>(); - - for (HistoricActivityInstance historicActivityInstance : list) { - String activityId = historicActivityInstance.getActivityId(); - String activityName = historicActivityInstance.getActivityName(); - String executionId = historicActivityInstance.getExecutionId(); - String taskId = historicActivityInstance.getTaskId(); - Date startTime = historicActivityInstance.getStartTime(); - Date endTime = historicActivityInstance.getEndTime(); - Long durationInMillis = historicActivityInstance.getDurationInMillis(); - String processInstanceId = historicActivityInstance.getProcessInstanceId(); - - String processDefinitionId = historicActivityInstance.getProcessDefinitionId(); - // 流程id - String flowId = NodeUtil.getFlowId(processDefinitionId); - - TaskDto taskDto = new TaskDto(); - taskDto.setFlowId(flowId); - taskDto.setTaskCreateTime(startTime); - taskDto.setTaskEndTime(endTime); - taskDto.setNodeId(activityId); - taskDto.setExecutionId(executionId); - taskDto.setProcessInstanceId(processInstanceId); - taskDto.setDurationInMillis(durationInMillis); - taskDto.setTaskId(taskId); - taskDto.setAssign(historicActivityInstance.getAssignee()); - taskDto.setTaskName(activityName); - - taskDtoList.add(taskDto); - } - - Page pageResultDto = new Page<>(); - pageResultDto.setTotal(count); - pageResultDto.setRecords(taskDtoList); - return R.ok(pageResultDto); - } - - /** - * 查询用户待办任务 - * - * @param taskQueryParamDto 查询参数 - * @return 分页任务信息 - */ - @PostMapping("/queryAssignTask") - public R queryAssignTask(@RequestBody TaskQueryParamDto taskQueryParamDto) { - - String assign = taskQueryParamDto.getAssign(); - - List taskDtoList = new ArrayList<>(); - - int pageIndex = taskQueryParamDto.getCurrent() - 1; - int pageSize = taskQueryParamDto.getSize(); - - Page pageResultDto = new Page<>(); - TaskQuery taskQuery = taskService.createTaskQuery().taskAssignee(assign).orderByTaskCreateTime().desc(); - if (StrUtil.isNotBlank(taskQueryParamDto.getProcessName())) { - List processInstanceList = runtimeService.createProcessInstanceQuery() - .processDefinitionName(taskQueryParamDto.getProcessName()) - .processInstanceTenantId(TenantContextHolder.getTenantId().toString()) - .list(); - if (CollUtil.isNotEmpty(processInstanceList)) { - taskQuery.processInstanceIdIn(processInstanceList.stream() - .map(ProcessInstance::getProcessInstanceId) - .toList()); - } - } - - if (ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime())) { - ZoneId zoneId = ZoneId.systemDefault(); - ZonedDateTime zonedBeforeDateTime = taskQueryParamDto.getTaskTime()[0].atZone(zoneId); - ZonedDateTime zonedAfterDateTime = taskQueryParamDto.getTaskTime()[1].atZone(zoneId); - Date beforeDate = Date.from(zonedBeforeDateTime.toInstant()); - Date afterDate = Date.from(zonedAfterDateTime.toInstant()); - taskQuery.taskCreatedBefore(afterDate).taskCreatedAfter(beforeDate); - } - - taskQuery.listPage(pageIndex * pageSize, pageSize).forEach(task -> { - String taskId = task.getId(); - String processInstanceId = task.getProcessInstanceId(); - log.debug("(taskId) {} processInstanceId={} executrionId={}", task.getName(), processInstanceId, task.getExecutionId()); - - String taskDefinitionKey = task.getTaskDefinitionKey(); - String processDefinitionId = task.getProcessDefinitionId(); - String flowId = NodeUtil.getFlowId(processDefinitionId); - - TaskDto taskDto = new TaskDto(); - taskDto.setFlowId(flowId); - taskDto.setTaskCreateTime(task.getCreateTime()); - taskDto.setNodeId(taskDefinitionKey); - taskDto.setProcessInstanceId(processInstanceId); - taskDto.setTaskId(taskId); - taskDto.setAssign(task.getAssignee()); - taskDto.setTaskName(task.getName()); - taskDtoList.add(taskDto); - }); - - long count = taskQuery.count(); - - log.debug("当前有 {} 个任务:", count); - - pageResultDto.setTotal(count); - pageResultDto.setRecords(taskDtoList); - - return R.ok(pageResultDto); - } - -} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/controller/EngineProcessInstanceController.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/controller/EngineProcessInstanceController.java deleted file mode 100644 index 0f039c7df..000000000 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/controller/EngineProcessInstanceController.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.pig4cloud.pigx.flow.engine.controller; - -import com.pig4cloud.pigx.common.core.util.R; -import com.pig4cloud.pigx.common.data.tenant.TenantContextHolder; -import com.pig4cloud.pigx.flow.task.dto.IndexPageStatistics; -import com.pig4cloud.pigx.flow.task.dto.VariableQueryParamDto; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.flowable.engine.HistoryService; -import org.flowable.engine.RuntimeService; -import org.flowable.engine.TaskService; -import org.flowable.engine.history.HistoricActivityInstanceQuery; -import org.flowable.task.api.TaskQuery; -import org.springframework.web.bind.annotation.*; - -import java.util.List; -import java.util.Map; - -/** - * 任务控制器 - */ -@RestController -@Slf4j -@RequiredArgsConstructor -@RequestMapping("/process-instance") -public class EngineProcessInstanceController { - - private final TaskService taskService; - - private final HistoryService historyService; - - private final RuntimeService runtimeService; - - /** - * 查询首页统计数量 - * - * @param userId 用户ID - * @return 统计结果 - */ - @GetMapping("querySimpleData") - public R querySimpleData(long userId) { - TaskQuery taskQuery = taskService.createTaskQuery(); - - // 待办数量 - long pendingNum = taskQuery.taskAssignee(String.valueOf(userId)) - .taskTenantId(TenantContextHolder.getTenantId().toString()) - .count(); - // 已完成任务 - HistoricActivityInstanceQuery historicActivityInstanceQuery = historyService - .createHistoricActivityInstanceQuery(); - - long completedNum = historicActivityInstanceQuery.taskAssignee(String.valueOf(userId)) - .tenantIdIn(List.of(TenantContextHolder.getTenantId().toString())).finished().count(); - - IndexPageStatistics indexPageStatistics = IndexPageStatistics.builder() - .pendingNum(pendingNum) - .completedNum(completedNum) - .build(); - - return R.ok(indexPageStatistics); - } - - /** - * 查询流程变量 - * - * @param paramDto 查询参数 - * @return 流程变量 - */ - @PostMapping("queryVariables") - public R queryVariables(@RequestBody VariableQueryParamDto paramDto) { - - Map variables = runtimeService.getVariables(paramDto.getExecutionId()); - - return R.ok(variables); - - } - -} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/controller/EngineTaskController.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/controller/EngineTaskController.java deleted file mode 100644 index 46ba0cb5f..000000000 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/controller/EngineTaskController.java +++ /dev/null @@ -1,181 +0,0 @@ -package com.pig4cloud.pigx.flow.engine.controller; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.convert.Convert; -import com.pig4cloud.pigx.common.core.util.R; -import com.pig4cloud.pigx.flow.task.dto.TaskParamDto; -import com.pig4cloud.pigx.flow.task.dto.TaskResultDto; -import com.pig4cloud.pigx.flow.task.dto.VariableQueryParamDto; -import com.pig4cloud.pigx.flow.task.utils.NodeUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.flowable.engine.HistoryService; -import org.flowable.engine.RuntimeService; -import org.flowable.engine.TaskService; -import org.flowable.task.api.DelegationState; -import org.flowable.task.api.Task; -import org.flowable.task.api.TaskQuery; -import org.flowable.task.api.history.HistoricTaskInstance; -import org.flowable.variable.api.history.HistoricVariableInstance; -import org.springframework.web.bind.annotation.*; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; - -/** - * 任务控制器 - */ -@RestController -@Slf4j -@RequiredArgsConstructor -@RequestMapping("/task") -public class EngineTaskController { - - private final TaskService taskService; - - private final HistoryService historyService; - - private final RuntimeService runtimeService; - - /** - * 查询任务变量 - * - * @param paramDto 参数DTO - * @return 变量Map - */ - @PostMapping("queryTaskVariables") - public R queryTaskVariables(@RequestBody VariableQueryParamDto paramDto) { - - List keyList = paramDto.getKeyList(); - if (CollUtil.isEmpty(keyList)) { - TaskQuery taskQuery = taskService.createTaskQuery(); - - Task task = taskQuery.taskId(paramDto.getTaskId()).singleResult(); - if (task == null) { - return R.failed("任务不存在"); - } - - Map variables = runtimeService.getVariables(task.getExecutionId()); - - return R.ok(variables); - } - - Map variables = taskService.getVariables(paramDto.getTaskId(), keyList); - return R.ok(variables); - - } - - /** - * 查询任务详情 - * - * @param taskId 任务ID - * @param userId 用户ID - * @return 任务结果DTO - */ - @GetMapping("/engine/queryTask") - public R queryTask(String taskId, String userId) { - Optional task = Optional - .ofNullable(taskService.createTaskQuery().taskId(taskId).taskAssignee(userId).singleResult()); - - if (task.isPresent()) { - String processDefinitionId = task.get().getProcessDefinitionId(); - String taskDefinitionKey = task.get().getTaskDefinitionKey(); - DelegationState delegationState = task.get().getDelegationState(); - String processInstanceId = task.get().getProcessInstanceId(); - Object delegateVariable = taskService.getVariableLocal(taskId, "delegate"); - - String flowId = NodeUtil.getFlowId(processDefinitionId); - Map variables = taskService.getVariables(taskId); - Map variableAll = new HashMap<>(variables); - - TaskResultDto taskResultDto = new TaskResultDto(); - taskResultDto.setFlowId(flowId); - taskResultDto.setProcessInstanceId(processDefinitionId); - taskResultDto.setNodeId(taskDefinitionKey); - taskResultDto.setCurrentTask(true); - taskResultDto.setDelegate(Convert.toBool(delegateVariable, false)); - taskResultDto.setVariableAll(variableAll); - taskResultDto.setProcessInstanceId(processInstanceId); - taskResultDto.setDelegationState(delegationState == null ? null : delegationState.toString()); - - return R.ok(taskResultDto); - } else { - Optional historicTaskInstance = Optional - .ofNullable(historyService.createHistoricTaskInstanceQuery() - .taskId(taskId) - .taskAssignee(userId) - .singleResult()); - - if (historicTaskInstance.isPresent()) { - String processDefinitionId = historicTaskInstance.get().getProcessDefinitionId(); - String taskDefinitionKey = historicTaskInstance.get().getTaskDefinitionKey(); - String processInstanceId = historicTaskInstance.get().getProcessInstanceId(); - - String flowId = NodeUtil.getFlowId(processDefinitionId); - - List variableInstanceList = historyService.createHistoricVariableInstanceQuery().processInstanceId(processInstanceId).list(); - Map variableAll = new HashMap<>(); - - if (CollUtil.isNotEmpty(variableInstanceList)) { - variableInstanceList.forEach(historicVariableInstance -> variableAll.put(historicVariableInstance.getVariableName(), historicVariableInstance.getValue())); - } - - TaskResultDto taskResultDto = new TaskResultDto(); - taskResultDto.setFlowId(flowId); - taskResultDto.setNodeId(taskDefinitionKey); - taskResultDto.setCurrentTask(false); - taskResultDto.setVariableAll(variableAll); - taskResultDto.setProcessInstanceId(processInstanceId); - - return R.ok(taskResultDto); - } else { - return R.failed("任务不存在"); - } - } - } - - /** - * 完成任务 - * - * @param taskParamDto 任务参数DTO - * @return 操作结果 - */ - @PostMapping("/complete") - public R complete(@RequestBody TaskParamDto taskParamDto) { - Map taskLocalParamMap = taskParamDto.getTaskLocalParamMap(); - if (CollUtil.isNotEmpty(taskLocalParamMap)) { - taskService.setVariablesLocal(taskParamDto.getTaskId(), taskLocalParamMap); - } - - taskService.complete(taskParamDto.getTaskId(), taskParamDto.getParamMap()); - - return R.ok(); - } - - /** - * 设置执行人 (转办) - * - * @param taskParamDto 任务参数DTO - * @return 操作结果 - */ - @PostMapping("/transferTask") - public R transferTask(@RequestBody TaskParamDto taskParamDto) { - Map taskLocalParamMap = taskParamDto.getTaskLocalParamMap(); - if (CollUtil.isNotEmpty(taskLocalParamMap)) { - taskService.setVariablesLocal(taskParamDto.getTaskId(), taskLocalParamMap); - } - - // 设置任务的 owner 为当前任务的 assignee - Task task = taskService.createTaskQuery().taskId(taskParamDto.getTaskId()).includeTaskLocalVariables().singleResult(); - taskService.setOwner(taskParamDto.getTaskId(), task.getAssignee()); - - // 设置任务的 assignee 为目标用户 (转办用户) - for (Long targetUserId : taskParamDto.getTargetUserIdList()) { - taskService.setAssignee(taskParamDto.getTaskId(), targetUserId.toString()); - } - return R.ok(); - } - -} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/NodeConditionStrategy.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/NodeConditionStrategy.java deleted file mode 100644 index 6eca2fd28..000000000 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/NodeConditionStrategy.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.pig4cloud.pigx.flow.engine.expression.condition; - -import com.pig4cloud.pigx.flow.task.dto.Condition; - -/** - * 节点单个条件处理器 - */ -public interface NodeConditionStrategy { - - /** - * 抽象方法 处理表达式 - */ - String handle(Condition condition); - -} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/DateNodeConditionStrategy.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/DateNodeConditionStrategy.java deleted file mode 100644 index 8c4ff67c2..000000000 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/DateNodeConditionStrategy.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.pig4cloud.pigx.flow.engine.expression.condition.impl; - -import cn.hutool.core.util.StrUtil; -import com.pig4cloud.pigx.flow.engine.expression.condition.NodeConditionStrategy; -import com.pig4cloud.pigx.flow.task.dto.Condition; -import org.springframework.stereotype.Component; - -/** - * 字符类型处理器 - */ -@Component("datePickerNodeConditionStrategy") -public class DateNodeConditionStrategy implements NodeConditionStrategy { - - /** - * 抽象方法 处理表达式 - */ - @Override - public String handle(Condition condition) { - - String compare = condition.getExpression(); - String id = condition.getKey(); - Object value = condition.getValue(); - - return StrUtil.format("(expressionHandler.dateTimeCompare(\"{}\",\"{}\",\"{}\",execution,\"yyyy-MM-dd\"))", id, - compare, value); - - } - -} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/DateTimeNodeConditionStrategy.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/DateTimeNodeConditionStrategy.java deleted file mode 100644 index c6e891525..000000000 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/DateTimeNodeConditionStrategy.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.pig4cloud.pigx.flow.engine.expression.condition.impl; - -import cn.hutool.core.util.StrUtil; -import com.pig4cloud.pigx.flow.engine.expression.condition.NodeConditionStrategy; -import com.pig4cloud.pigx.flow.task.dto.Condition; -import org.springframework.stereotype.Component; - -/** - * 字符类型处理器 - */ -@Component("DateTimeNodeConditionStrategy") -public class DateTimeNodeConditionStrategy implements NodeConditionStrategy { - - /** - * 抽象方法 处理表达式 - */ - @Override - public String handle(Condition condition) { - - String compare = condition.getExpression(); - String id = condition.getKey(); - Object value = condition.getValue(); - - return StrUtil.format( - "(expressionHandler.dateTimeCompare(\"{}\",\"{}\",\"{}\",execution,\"yyyy-MM-dd " + "HH:mm:ss\"))", id, - compare, value); - - } - -} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/NumberNodeConditionStrategy.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/NumberNodeConditionStrategy.java deleted file mode 100644 index d722b6444..000000000 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/NumberNodeConditionStrategy.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.pig4cloud.pigx.flow.engine.expression.condition.impl; - -import cn.hutool.core.util.StrUtil; -import com.pig4cloud.pigx.flow.engine.expression.condition.NodeConditionStrategy; -import com.pig4cloud.pigx.flow.task.dto.Condition; -import org.springframework.stereotype.Component; - -/** - * 字符类型处理器 - */ -@Component("inputNumberNodeConditionStrategy") -public class NumberNodeConditionStrategy implements NodeConditionStrategy { - - /** - * 抽象方法 处理表达式 - */ - @Override - public String handle(Condition condition) { - - String compare = condition.getExpression(); - String id = condition.getKey(); - Object value = condition.getValue(); - - return StrUtil.format("(expressionHandler.numberCompare(\"{}\",\"{}\",{},execution))", id, compare, value); - - } - -} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/SelectDeptNodeConditionStrategy.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/SelectDeptNodeConditionStrategy.java deleted file mode 100644 index 6694dfc13..000000000 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/SelectDeptNodeConditionStrategy.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.pig4cloud.pigx.flow.engine.expression.condition.impl; - -import cn.hutool.core.util.EscapeUtil; -import cn.hutool.core.util.StrUtil; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.pig4cloud.pigx.flow.engine.expression.condition.NodeConditionStrategy; -import com.pig4cloud.pigx.flow.task.dto.Condition; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import org.springframework.stereotype.Component; - -/** - * 字符类型处理器 - */ -@RequiredArgsConstructor -@Component("SelectDeptNodeConditionStrategy") -public class SelectDeptNodeConditionStrategy implements NodeConditionStrategy { - - private final ObjectMapper objectMapper; - - /** - * 抽象方法 处理表达式 - */ - @Override - @SneakyThrows - public String handle(Condition condition) { - - String compare = condition.getExpression(); - String id = condition.getKey(); - Object value = condition.getValue(); - - return StrUtil.format("(expressionHandler.deptCompare(\"{}\",\"{}\",\"{}\", execution))", id, - EscapeUtil.escape(objectMapper.writeValueAsString(value)), compare); - - } - -} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/SelectUserNodeConditionStrategy.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/SelectUserNodeConditionStrategy.java deleted file mode 100644 index 3af9c9749..000000000 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/SelectUserNodeConditionStrategy.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.pig4cloud.pigx.flow.engine.expression.condition.impl; - -import cn.hutool.core.util.EscapeUtil; -import cn.hutool.core.util.StrUtil; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.pig4cloud.pigx.flow.engine.expression.condition.NodeConditionStrategy; -import com.pig4cloud.pigx.flow.task.dto.Condition; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import org.springframework.stereotype.Component; - -/** - * 字符类型处理器 - */ -@RequiredArgsConstructor -@Component("SelectUserNodeConditionStrategy") -public class SelectUserNodeConditionStrategy implements NodeConditionStrategy { - - private final ObjectMapper objectMapper; - - /** - * 抽象方法 处理表达式 - */ - @Override - @SneakyThrows - public String handle(Condition condition) { - - String compare = condition.getExpression(); - String id = condition.getKey(); - Object value = condition.getValue(); - - return StrUtil.format("(expressionHandler.userCompare(\"{}\",\"{}\",\"{}\", execution))", id, - EscapeUtil.escape(objectMapper.writeValueAsString(value)), compare); - - } - -} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/SingleSelectNodeConditionStrategy.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/SingleSelectNodeConditionStrategy.java deleted file mode 100644 index 7b4496b0b..000000000 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/SingleSelectNodeConditionStrategy.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.pig4cloud.pigx.flow.engine.expression.condition.impl; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.convert.Convert; -import cn.hutool.core.util.StrUtil; -import com.pig4cloud.pigx.flow.engine.expression.condition.NodeConditionStrategy; -import com.pig4cloud.pigx.flow.task.dto.Condition; -import com.pig4cloud.pigx.flow.task.dto.SelectValue; -import org.springframework.stereotype.Component; - -import java.util.List; - -/** - * 字符类型处理器 - */ -@Component("SingleSelectNodeConditionStrategy") -public class SingleSelectNodeConditionStrategy implements NodeConditionStrategy { - - /** - * 抽象方法 处理表达式 - */ - @Override - public String handle(Condition condition) { - - String compare = condition.getExpression(); - String id = condition.getKey(); - Object value = condition.getValue(); - - List list = Convert.toList(SelectValue.class, value); - - StringBuilder sb = new StringBuilder(); - - for (SelectValue o : list) { - sb.append(",\"").append(o.getKey()).append("\""); - } - String string = sb.toString(); - if (CollUtil.isNotEmpty(list)) { - string = string.substring(1); - } - if (compare.equals("in")) { - return StrUtil.format("(expressionHandler.singleSelectHandler(\"{}\", execution,{}))", id, string); - } - - return StrUtil.format("(!expressionHandler.singleSelectHandler(\"{}\", execution,{}))", id, string); - - } - -} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/TextareaNodeConditionStrategy.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/TextareaNodeConditionStrategy.java deleted file mode 100644 index d4c8b219d..000000000 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/TextareaNodeConditionStrategy.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.pig4cloud.pigx.flow.engine.expression.condition.impl; - -import cn.hutool.core.util.StrUtil; -import com.pig4cloud.pigx.flow.engine.expression.condition.NodeConditionStrategy; -import com.pig4cloud.pigx.flow.task.dto.Condition; -import org.springframework.stereotype.Component; - -/** - * 字符类型处理器 - */ -@Component("TextareaNodeConditionStrategy") -public class TextareaNodeConditionStrategy implements NodeConditionStrategy { - - /** - * 抽象方法 处理表达式 - * - */ - @Override - public String handle(Condition condition) { - - String compare = condition.getExpression(); - String id = condition.getKey(); - Object value = condition.getValue(); - if (StrUtil.equals(compare, "==")) { - return StrUtil.format("(expressionHandler.stringEqual(\"{}\",\"{}\",execution))", id, value); - } - if (StrUtil.equals(compare, "!=")) { - return StrUtil.format("(!expressionHandler.stringEqual(\"{}\",\"{}\",execution))", id, value); - } - return "(2==2)"; - } - -} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/TimeNodeConditionStrategy.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/TimeNodeConditionStrategy.java deleted file mode 100644 index 7ba8adea9..000000000 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/TimeNodeConditionStrategy.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.pig4cloud.pigx.flow.engine.expression.condition.impl; - -import cn.hutool.core.util.StrUtil; -import com.pig4cloud.pigx.flow.engine.expression.condition.NodeConditionStrategy; -import com.pig4cloud.pigx.flow.task.dto.Condition; -import org.springframework.stereotype.Component; - -/** - * 字符类型处理器 - */ -@Component("timePickerNodeConditionStrategy") -public class TimeNodeConditionStrategy implements NodeConditionStrategy { - - /** - * 抽象方法 处理表达式 - */ - @Override - public String handle(Condition condition) { - - String compare = condition.getExpression(); - String id = condition.getKey(); - Object value = condition.getValue(); - - return StrUtil.format("(expressionHandler.dateTimeCompare(\"{}\",\"{}\",\"{}\",execution,\"HH:mm:ss\"))", id, - compare, value); - - } - -} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/AssignUserStrategy.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/AssignUserStrategy.java deleted file mode 100644 index 2850070be..000000000 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/AssignUserStrategy.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.pig4cloud.pigx.flow.engine.node; - -import com.pig4cloud.pigx.flow.task.dto.Node; -import com.pig4cloud.pigx.flow.task.dto.NodeUser; - -import java.util.List; -import java.util.Map; - -/** - * 指定用户策略处理器 - */ -public interface AssignUserStrategy { - - /** - * 抽象方法 处理表达式 - * @param node - * @param rootUser - * @param variables - */ - List handle(Node node, NodeUser rootUser, Map variables); - -} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignUserFormStrategyImpl.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignUserFormStrategyImpl.java deleted file mode 100644 index 0f77f1727..000000000 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignUserFormStrategyImpl.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.pig4cloud.pigx.flow.engine.node.impl; - -import cn.hutool.core.util.StrUtil; -import cn.hutool.json.JSONUtil; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.pig4cloud.pigx.flow.engine.node.AssignUserStrategy; -import com.pig4cloud.pigx.flow.task.constant.ProcessInstanceConstant; -import com.pig4cloud.pigx.flow.task.dto.Node; -import com.pig4cloud.pigx.flow.task.dto.NodeUser; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 来自表单 - * - * @author Huijun Zhao - * @description - * @date 2023-07-07 13:42 - */ -@RequiredArgsConstructor -@Component(ProcessInstanceConstant.AssignedTypeClass.FORM_USER + "AssignUserStrategy") -public class AssignUserFormStrategyImpl implements AssignUserStrategy { - - private final ObjectMapper objectMapper; - - @SneakyThrows - @Override - public List handle(Node node, NodeUser rootUser, Map variables) { - List assignList = new ArrayList<>(); - - Object variable = variables.get(node.getFormUserId()); - if (variable != null && !StrUtil.isBlankIfStr(variable)) { - String jsonString = objectMapper.writeValueAsString(variable); - List nodeUserDtoList = JSONUtil.toList(jsonString, NodeUser.class); - assignList.addAll(nodeUserDtoList.stream().map(NodeUser::getId).toList()); - } - - return assignList; - } - -} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignUserLeaderStrategyImpl.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignUserLeaderStrategyImpl.java deleted file mode 100644 index 7c7f0d0ce..000000000 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignUserLeaderStrategyImpl.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.pig4cloud.pigx.flow.engine.node.impl; - -import cn.hutool.core.collection.CollUtil; -import com.pig4cloud.pigx.admin.api.feign.RemoteDeptService; -import com.pig4cloud.pigx.common.core.util.R; -import com.pig4cloud.pigx.common.security.util.SecurityUtils; -import com.pig4cloud.pigx.flow.engine.node.AssignUserStrategy; -import com.pig4cloud.pigx.flow.task.constant.ProcessInstanceConstant; -import com.pig4cloud.pigx.flow.task.dto.Node; -import com.pig4cloud.pigx.flow.task.dto.NodeUser; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.function.Function; -import java.util.stream.Stream; - -/** - * 指定主管 - * - * @author Huijun Zhao - * @description - * @date 2023-07-07 13:42 - */ -@RequiredArgsConstructor -@Component(ProcessInstanceConstant.AssignedTypeClass.LEADER + "AssignUserStrategy") -public class AssignUserLeaderStrategyImpl implements AssignUserStrategy { - - private final RemoteDeptService deptService; - - @Override - public List handle(Node node, NodeUser rootUser, Map variables) { - // 如果节点没有设置部门主管,则默认为当前用户的部门主管 - if (CollUtil.isEmpty(node.getNodeUserList())) { - List nodeUserList = new ArrayList<>(); - nodeUserList.add(NodeUser.builder().id(SecurityUtils.getUser().getDeptId()).build()); - node.setNodeUserList(nodeUserList); - } - - return node.getNodeUserList() - .stream() - .map(nodeUser -> deptService.getAllDeptLeader(nodeUser.getId())) - .flatMap((Function>, Stream>) listR -> listR.getData() == null ? null - : listR.getData().stream()) - .toList(); - } - -} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignUserRoleStrategyImpl.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignUserRoleStrategyImpl.java deleted file mode 100644 index b627b6007..000000000 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignUserRoleStrategyImpl.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.pig4cloud.pigx.flow.engine.node.impl; - -import com.pig4cloud.pigx.admin.api.feign.RemoteUserService; -import com.pig4cloud.pigx.common.core.util.RetOps; -import com.pig4cloud.pigx.flow.engine.node.AssignUserStrategy; -import com.pig4cloud.pigx.flow.task.constant.ProcessInstanceConstant; -import com.pig4cloud.pigx.flow.task.dto.Node; -import com.pig4cloud.pigx.flow.task.dto.NodeUser; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; - -/** - * 来自角色 - * - * @author Huijun Zhao - * @description - * @date 2023-07-07 13:42 - */ -@RequiredArgsConstructor -@Component(ProcessInstanceConstant.AssignedTypeClass.ROLE + "AssignUserStrategy") -public class AssignUserRoleStrategyImpl implements AssignUserStrategy { - - private final RemoteUserService remoteUserService; - - /** - * 处理节点并返回用户ID列表。 - * @param node 节点 - * @param rootUser 根用户 - * @param variables 变量 - * @return 用户ID列表 - */ - @Override - public List handle(Node node, NodeUser rootUser, Map variables) { - // 使用 lambda 表达式和方法引用从 NodeUser 列表中提取角色 ID - List roleIds = node.getNodeUserList().stream().map(NodeUser::getId).toList(); - // 提取 Optional 结果中的数据 - List data = RetOps.of(remoteUserService.getUserIdListByRoleIdList(roleIds)) - .getData() - .orElseGet(Collections::emptyList); - - // 返回用户 ID 列表 - return new ArrayList<>(data); - } - -} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignUserSelfSelectStrategyImpl.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignUserSelfSelectStrategyImpl.java deleted file mode 100644 index 310545158..000000000 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignUserSelfSelectStrategyImpl.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.pig4cloud.pigx.flow.engine.node.impl; - -import cn.hutool.core.util.StrUtil; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.pig4cloud.pigx.flow.engine.node.AssignUserStrategy; -import com.pig4cloud.pigx.flow.task.constant.ProcessInstanceConstant; -import com.pig4cloud.pigx.flow.task.dto.Node; -import com.pig4cloud.pigx.flow.task.dto.NodeUser; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 发起人自选 - * - * @author Huijun Zhao - * @description - * @date 2023-07-07 13:42 - */ -@Slf4j -@RequiredArgsConstructor -@Component(ProcessInstanceConstant.AssignedTypeClass.SELF_SELECT + "AssignUserStrategy") -public class AssignUserSelfSelectStrategyImpl implements AssignUserStrategy { - - private final ObjectMapper objectMapper; - - @SneakyThrows - @Override - public List handle(Node node, NodeUser rootUser, Map variables) { - - List assignList = new ArrayList<>(); - - Object variable = variables.get(StrUtil.format("{}_assignee_select", node.getId())); - log.info("{}-发起人自选参数:{}", node.getName(), variable); - if (variable == null) { - return assignList; - } - - List nodeUserDtos = objectMapper.readValue(objectMapper.writeValueAsString(variable), - new TypeReference<>() { - }); - - List collect = nodeUserDtos.stream().map(NodeUser::getId).toList(); - - assignList.addAll(collect); - return assignList; - } - -} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignUserSelfStrategyImpl.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignUserSelfStrategyImpl.java deleted file mode 100644 index 2c6227683..000000000 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignUserSelfStrategyImpl.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.pig4cloud.pigx.flow.engine.node.impl; - -import cn.hutool.core.collection.CollUtil; -import com.pig4cloud.pigx.flow.engine.node.AssignUserStrategy; -import com.pig4cloud.pigx.flow.task.constant.ProcessInstanceConstant; -import com.pig4cloud.pigx.flow.task.dto.Node; -import com.pig4cloud.pigx.flow.task.dto.NodeUser; -import org.springframework.stereotype.Component; - -import java.util.List; -import java.util.Map; - -/** - * 发起人自己 - * - * @author Huijun Zhao - * @description - * @date 2023-07-07 13:42 - */ -@Component(ProcessInstanceConstant.AssignedTypeClass.SELF + "AssignUserStrategy") -public class AssignUserSelfStrategyImpl implements AssignUserStrategy { - - @Override - public List handle(Node node, NodeUser rootUser, Map variables) { - return CollUtil.newArrayList(rootUser.getId()); - } - -} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/service/ApproveServiceTask.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/service/ApproveServiceTask.java deleted file mode 100644 index 6359160ca..000000000 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/service/ApproveServiceTask.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.pig4cloud.pigx.flow.engine.service; - -import cn.hutool.core.util.StrUtil; -import cn.hutool.extra.spring.SpringUtil; -import com.pig4cloud.pigx.flow.task.api.feign.RemoteFlowTaskService; -import com.pig4cloud.pigx.flow.task.dto.Node; -import com.pig4cloud.pigx.flow.task.dto.Refuse; -import org.flowable.engine.RuntimeService; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.delegate.JavaDelegate; -import org.flowable.engine.impl.persistence.entity.ExecutionEntityImpl; - -/** - * 审批服务任务类,负责处理工作流中的审批逻辑 - * 该类根据审批条件确定工作流的下一步流程 - */ -public class ApproveServiceTask implements JavaDelegate { - - @Override - public void execute(DelegateExecution execution) { - // 转换为实现类以访问额外的方法 - ExecutionEntityImpl entity = (ExecutionEntityImpl) execution; - - // 从执行上下文中提取关键标识符 - String currentActivityId = entity.getActivityId(); // 当前活动ID - String flowDefinitionKey = entity.getProcessDefinitionKey(); // 流程定义键 - String processInstanceId = entity.getProcessInstanceId(); // 流程实例ID - - // 从活动ID中提取节点标识符 - // 如果currentActivityId是"approve_service_task_node1",则nodeId将是"node1" - String nodeId = StrUtil.subAfter(currentActivityId, "approve_service_task_", true); - - // 获取此节点的审批条件变量 - // 变量名格式:"{nodeId}_approve_condition"(例如:"node1_approve_condition") - String conditionVarName = StrUtil.format("{}_approve_condition", nodeId); - Boolean isApproved = execution.getVariable(conditionVarName, Boolean.class); - - // 只有当审批条件明确设置时才继续处理 - if (isApproved != null) { - // 获取Flowable RuntimeService bean,用于工作流状态变更 - RuntimeService runtimeService = SpringUtil.getBean(RuntimeService.class); - - // 如果未批准,确定工作流重定向的位置 - if (!isApproved) { - handleRejection(flowDefinitionKey, nodeId, currentActivityId, processInstanceId, runtimeService); - } - // 如果已批准,工作流将沿其正常路径继续(无需操作) - } - } - - /** - * 处理任务被拒绝时的工作流重定向逻辑 - * - * @param flowDefinitionKey 流程定义键 - * @param nodeId 当前节点标识符 - * @param currentActivityId 当前活动标识符 - * @param processInstanceId 流程实例标识符 - * @param runtimeService 用于工作流状态操作的运行时服务 - */ - private void handleRejection(String flowDefinitionKey, String nodeId, - String currentActivityId, String processInstanceId, - RuntimeService runtimeService) { - // 获取远程流程任务服务以获取节点配置数据 - RemoteFlowTaskService remoteFlowTaskService = SpringUtil.getBean(RemoteFlowTaskService.class); - - // 查询节点的原始配置数据 - Node node = remoteFlowTaskService.queryNodeOriData(flowDefinitionKey, nodeId).getData(); - - // 获取拒绝处理配置 - Refuse refuseConfig = node.getRefuse(); - - if (refuseConfig != null) { - String rejectionHandler = refuseConfig.getHandler(); - - // 为当前流程实例创建状态变更构建器 - var stateChangeBuilder = runtimeService.createChangeActivityStateBuilder() - .processInstanceId(processInstanceId); - - if (StrUtil.equals(rejectionHandler, "TO_NODE")) { - // 根据拒绝设置重定向到特定节点 - stateChangeBuilder.moveActivityIdTo(currentActivityId, refuseConfig.getNodeId()) - .changeState(); - } else { - // 默认行为:重定向到结束节点 - stateChangeBuilder.moveActivityIdTo(currentActivityId, "end") - .changeState(); - } - } - // 如果未设置refuseConfig,工作流将沿其正常路径继续 - } -} \ No newline at end of file diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/service/NodeTaskCompleteNotifyService.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/service/NodeTaskCompleteNotifyService.java deleted file mode 100644 index 249a694ae..000000000 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/service/NodeTaskCompleteNotifyService.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.pig4cloud.pigx.flow.engine.service; - -import cn.hutool.core.lang.Validator; -import cn.hutool.http.HttpRequest; -import cn.hutool.http.HttpResponse; -import cn.hutool.json.JSONUtil; -import com.pig4cloud.pigx.common.core.util.RetOps; -import com.pig4cloud.pigx.common.security.util.NonWebTokenContextHolder; -import com.pig4cloud.pigx.flow.task.api.feign.RemoteFlowTaskService; -import com.pig4cloud.pigx.flow.task.dto.ProcessNodeRecordAssignUserParamDto; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Service; - -/** - * 节点任务完成通知处理 - * - * @author lengleng - * @date 2024/7/9 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class NodeTaskCompleteNotifyService { - - private final RemoteFlowTaskService remoteFlowTaskService; - - @Async - public void sendNotify(String token, ProcessNodeRecordAssignUserParamDto taskCompleteParamDto) { - NonWebTokenContextHolder.setToken(token); - RetOps.of(remoteFlowTaskService.queryNodeOriData(taskCompleteParamDto.getFlowId(), taskCompleteParamDto.getNodeId())) - .getData() - .ifPresent(node -> { - if (Validator.isUrl(node.getEventConfig())) { - HttpResponse response = HttpRequest.post(node.getEventConfig()) - .body(JSONUtil.toJsonStr(taskCompleteParamDto)) - .timeout(10000) - .execute(); - log.debug("节点任务完成通知处理完成:{},数据:{}", response.getStatus(), taskCompleteParamDto); - } - }); - } -} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/service/packge-info.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/service/packge-info.java deleted file mode 100644 index d749389d8..000000000 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/service/packge-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/* - * @author pigx archetype - */ -package com.pig4cloud.pigx.flow.engine.service; \ No newline at end of file diff --git a/pigx-flow/pigx-flow-engine/pom.xml b/pigx-flow/pigx-flow-engine/pom.xml deleted file mode 100644 index 26298bcc0..000000000 --- a/pigx-flow/pigx-flow-engine/pom.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - 4.0.0 - - - com.pig4cloud - pigx-flow - 5.9.0 - - - pigx-flow-engine - pom - flowable 工作流核心引擎 - - - - pigx-flow-engine-api - pigx-flow-engine-biz - - diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/api/feign/RemoteFlowApiFlowService.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/api/feign/RemoteFlowApiFlowService.java deleted file mode 100644 index 25bf32383..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/api/feign/RemoteFlowApiFlowService.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.pig4cloud.pigx.flow.task.api.feign; - -import com.pig4cloud.pigx.common.core.constant.ServiceNameConstants; -import com.pig4cloud.pigx.common.core.util.R; -import com.pig4cloud.pigx.flow.task.dto.ProcessInstanceParamDto; -import com.pig4cloud.pigx.flow.task.vo.FormGroupVo; -import com.pig4cloud.pigx.flow.task.vo.ProcessVO; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; - -import java.util.List; - -/** - * @author lengleng - * @date 2023/7/14 - */ -@FeignClient(contextId = "remoteFlowApiFlowService", value = ServiceNameConstants.FLOW_TASK_SERVER) -public interface RemoteFlowApiFlowService { - - /** - * 查询所有我可以发起的表单 - * - * @return R - */ - @GetMapping("/combination/group/listCurrentUserStartGroup") - R> listCurrentUserStartGroup(); - - /** - * 获取流程详情 - * - * @param flowId 流程id - * @return R - */ - @GetMapping("/process/getDetail") - R getDetail(@RequestParam("flowId") String flowId); - - - /** - * 启动流程实例 - * - * @param paramDto param dto - * @return {@link R } 流程实例ID {@link String} - */ - @PostMapping("/process-instance/startProcessInstance") - R startProcessInstance(@RequestBody ProcessInstanceParamDto paramDto); - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/api/feign/RemoteFlowEngineService.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/api/feign/RemoteFlowEngineService.java deleted file mode 100644 index 31932bd4b..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/api/feign/RemoteFlowEngineService.java +++ /dev/null @@ -1,127 +0,0 @@ -package com.pig4cloud.pigx.flow.task.api.feign; - -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.pig4cloud.pigx.common.core.constant.ServiceNameConstants; -import com.pig4cloud.pigx.common.core.util.R; -import com.pig4cloud.pigx.flow.task.dto.*; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; - -import java.util.Map; - -/** - * @author lengleng - * @date 2023/7/14 - */ -@FeignClient(contextId = "remoteFlowEngineService", value = ServiceNameConstants.FLOW_ENGINE_SERVER) -public interface RemoteFlowEngineService { - - /** - * 查询任务变量 - * @param variableQueryParamDto 变量查询参数 - * @return 任务变量结果 - */ - @PostMapping("/task/queryTaskVariables") - R> queryTaskVariables(@RequestBody VariableQueryParamDto variableQueryParamDto); - - /** - * 查询简单数据 - * @param userId 用户ID - * @return 索引页统计数据 - */ - @GetMapping("/process-instance/querySimpleData") - R querySimpleData(@RequestParam("userId") Long userId); - - /** - * 创建流程 - * @param map 流程JSON对象 - * @return 创建流程结果 - */ - @PostMapping("/flow/create") - R createFlow(@RequestBody Map map); - - /** - * 启动流程实例 - * @param processInstanceParamDto 流程实例参数 - * @return 启动流程结果 - */ - @PostMapping("/flow/start") - R startProcess(@RequestBody ProcessInstanceParamDto processInstanceParamDto); - - /** - * 查询待办任务 - * @param paramDto 任务查询参数 - * @return 待办任务列表 - */ - @PostMapping("/flow/queryAssignTask") - R> queryAssignTask(@RequestBody TaskQueryParamDto paramDto); - - /** - * 查询已完成任务 - * @param paramDto 任务查询参数 - * @return 已完成任务列表 - */ - @PostMapping("/flow/queryCompletedTask") - R> queryCompletedTask(@RequestBody TaskQueryParamDto paramDto); - - /** - * 完成任务 - * @param taskParamDto 任务参数 - * @return 完成任务结果 - */ - @PostMapping("/task/complete") - R completeTask(@RequestBody TaskParamDto taskParamDto); - - /** - * 设置任务负责人 - * @param taskParamDto 任务参数 - * @return 设置负责人结果 - */ - @PostMapping("/task/transferTask") - R transferTask(@RequestBody TaskParamDto taskParamDto); - - /** - * 停止流程实例 - * @param taskParamDto 任务参数 - * @return 停止流程实例结果 - */ - @PostMapping("/flow/stopProcessInstance") - R stopProcessInstance(@RequestBody TaskParamDto taskParamDto); - - /** - * 解决任务 - * @param taskParamDto 任务参数 - * @return 解决任务结果 - */ - @PostMapping("/task/resolveTask") - R resolveTask(@RequestBody TaskParamDto taskParamDto); - - /** - * 退回任务 - * @param taskParamDto 任务参数 - * @return 退回任务结果 - */ - @PostMapping("/task/back") - R back(@RequestBody TaskParamDto taskParamDto); - - /** - * 委派任务 - * @param taskParamDto 任务参数 - * @return 委派任务结果 - */ - @PostMapping("/task/delegateTask") - R delegateTask(@RequestBody TaskParamDto taskParamDto); - - /** - * 查询任务 - * @param taskId 任务ID - * @param userId 用户ID - * @return 任务查询结果 - */ - @GetMapping("/task/engine/queryTask") - R queryTask(@RequestParam("taskId") String taskId, @RequestParam("userId") Long userId); - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/api/feign/RemoteFlowTaskService.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/api/feign/RemoteFlowTaskService.java deleted file mode 100644 index 7f89b55d3..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/api/feign/RemoteFlowTaskService.java +++ /dev/null @@ -1,128 +0,0 @@ -package com.pig4cloud.pigx.flow.task.api.feign; - -import com.pig4cloud.pigx.common.core.constant.ServiceNameConstants; -import com.pig4cloud.pigx.common.core.util.R; -import com.pig4cloud.pigx.flow.task.dto.*; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; - -import java.util.List; - -/** - * @author lengleng - * @date 2023/7/14 - */ -@FeignClient(contextId = "remoteFlowTaskService", value = ServiceNameConstants.FLOW_TASK_SERVER) -public interface RemoteFlowTaskService { - - /** - * 节点开始事件 - * - * @param nodeRecordParamDto - */ - @PostMapping("/remote/startNodeEvent") - void startNodeEvent(@RequestBody ProcessNodeRecordParamDto nodeRecordParamDto); - - /** - * 节点结束事件 - * - * @param nodeRecordParamDto - */ - @PostMapping("/remote/endNodeEvent") - void endNodeEvent(@RequestBody ProcessNodeRecordParamDto nodeRecordParamDto); - - /** - * 流程结束事件 - * - * @param processInstanceParamDto - */ - @PostMapping("/remote/endProcess") - void endProcessEvent(@RequestBody ProcessInstanceParamDto processInstanceParamDto); - - /** - * 创建流程事件 - * - * @param processInstanceRecordParamDto - */ - @PostMapping("/remote/createProcessEvent") - void createProcessEvent(@RequestBody ProcessInstanceRecordParamDto processInstanceRecordParamDto); - - /** - * 根据角色id集合查询用户id集合 - * - * @param roleIdList - */ - @PostMapping("/remote/queryUserIdListByRoleIdList") - R> queryUserIdListByRoleIdList(@RequestBody List roleIdList); - - /** - * 根据部门id集合查询所有的用户id集合 - * - * @param deptIdList - */ - @PostMapping("/remote/queryUserIdListByDepIdList") - R> queryUserIdListByDepIdList(@RequestBody List deptIdList); - - /** - * 查询流程管理员 - * - * @param flowId 流程id - */ - @GetMapping("/remote/queryProcessAdmin") - R queryProcessAdmin(@RequestParam("flowId") String flowId); - - /** - * 查询节点数据 - * - * @param flowId 流程id - * @param nodeId 节点id - * @return - */ - @GetMapping("/processNodeData/getNodeData") - R queryNodeOriData(@RequestParam("flowId") String flowId, @RequestParam("nodeId") String nodeId); - - /** - * 节点开始指派用户了 - * - * @param processNodeRecordAssignUserParamDto - */ - @PostMapping("/remote/startAssignUser") - R startAssignUser(@RequestBody ProcessNodeRecordAssignUserParamDto processNodeRecordAssignUserParamDto); - - /** - * 任务结束事件 - * - * @param processNodeRecordAssignUserParamDto - */ - @PostMapping("/remote/taskEndEvent") - R taskEndEvent(@RequestBody ProcessNodeRecordAssignUserParamDto processNodeRecordAssignUserParamDto); - - /** - * 保存抄送数据 - * - * @param processCopyDto - */ - @PostMapping("/remote/savecc") - R saveCC(@RequestBody ProcessCopyDto processCopyDto); - - /** - * 保存节点原始数据 - * - * @param processNodeDataDto - */ - @PostMapping("/processNodeData/saveNodeData") - R saveNodeOriData(@RequestBody ProcessNodeDataDto processNodeDataDto); - - - /** - * 查询流程实例记录 - * - * @param processInstanceId 过程实例id - * @return {@link R } - */ - @GetMapping("/process-instance/detail") - R queryProcessInstanceRecord(@RequestParam String processInstanceId); -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/CaptchaTypeEnum.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/CaptchaTypeEnum.java deleted file mode 100644 index 8418b55ae..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/CaptchaTypeEnum.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.pig4cloud.pigx.flow.task.constant; - -/** - * EasyCaptcha 验证码类型枚举 - * - * @author haoxr - * @since 2023/03/24 - */ -public enum CaptchaTypeEnum { - - /** - * 算数 - */ - ARITHMETIC, - /** - * 中文 - */ - CHINESE, - /** - * 中文闪图 - */ - CHINESE_GIF, - /** - * 闪图 - */ - GIF, SPEC - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/FormTypeEnum.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/FormTypeEnum.java deleted file mode 100644 index 722c7f1fb..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/FormTypeEnum.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.pig4cloud.pigx.flow.task.constant; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.ArrayList; - -/** - * 表单类型枚举 - */ -@Getter -@AllArgsConstructor -public enum FormTypeEnum { - - INPUT("Input", "单行文本", ""), TEXTAREA("Textarea", "多行文本", ""), NUMBER("Number", "数字", null), - DATE("Date", "日期", null), DATE_TIME("DateTime", "日期时间", null), - - SEQUENCE("Sequence", "发号器", null), LAYOUT("Layout", "明细", null), TIME("Time", "时间", null), - MONEY("Money", "金额", null), SINGLE_SELECT("SingleSelect", "单选", new ArrayList<>()), - SELECT_DEPT("SelectDept", "部门", new ArrayList<>()), SELECT_USER("SelectUser", "用户", new ArrayList<>()), - - ; - - private String type; - - private String name; - - private Object defaultValue; - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/IBaseEnum.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/IBaseEnum.java deleted file mode 100644 index ce365d614..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/IBaseEnum.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.pig4cloud.pigx.flow.task.constant; - -import cn.hutool.core.util.ObjectUtil; - -import java.util.EnumSet; -import java.util.Objects; - -/** - * 枚举通用接口 - * - * @author haoxr - * @since 2022/3/27 12:06 - */ -public interface IBaseEnum { - - T getValue(); - - String getLabel(); - - /** - * 根据值获取枚举 - * @param value - * @param clazz - * @param 枚举 - * @return - */ - static & IBaseEnum> E getEnumByValue(Object value, Class clazz) { - Objects.requireNonNull(value); - EnumSet allEnums = EnumSet.allOf(clazz); // 获取类型下的所有枚举 - E matchEnum = allEnums.stream().filter(e -> ObjectUtil.equal(e.getValue(), value)).findFirst().orElse(null); - return matchEnum; - } - - /** - * 根据文本标签获取值 - * @param value - * @param clazz - * @param - * @return - */ - static & IBaseEnum> String getLabelByValue(Object value, Class clazz) { - Objects.requireNonNull(value); - EnumSet allEnums = EnumSet.allOf(clazz); // 获取类型下的所有枚举 - E matchEnum = allEnums.stream().filter(e -> ObjectUtil.equal(e.getValue(), value)).findFirst().orElse(null); - - String label = null; - if (matchEnum != null) { - label = matchEnum.getLabel(); - } - return label; - } - - /** - * 根据文本标签获取值 - * @param label - * @param clazz - * @param - * @return - */ - static & IBaseEnum> Object getValueByLabel(String label, Class clazz) { - Objects.requireNonNull(label); - EnumSet allEnums = EnumSet.allOf(clazz); // 获取类型下的所有枚举 - String finalLabel = label; - E matchEnum = allEnums.stream() - .filter(e -> ObjectUtil.equal(e.getLabel(), finalLabel)) - .findFirst() - .orElse(null); - - Object value = null; - if (matchEnum != null) { - value = matchEnum.getValue(); - } - return value; - } - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/MenuTypeEnum.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/MenuTypeEnum.java deleted file mode 100644 index 9baadad58..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/MenuTypeEnum.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.pig4cloud.pigx.flow.task.constant; - -import com.baomidou.mybatisplus.annotation.EnumValue; -import lombok.Getter; - -/** - * 菜单类型枚举 - * - * @author haoxr - * @since 2022/4/23 9:36 - */ - -public enum MenuTypeEnum implements IBaseEnum { - - NULL(0, null), MENU(1, "菜单"), CATALOG(2, "目录"), EXTLINK(3, "外链"), BUTTON(4, "按钮"); - - @Getter - @EnumValue // Mybatis-Plus 提供注解表示插入数据库时插入该值 - private Integer value; - - @Getter - // @JsonValue // 表示对枚举序列化时返回此字段 - private String label; - - MenuTypeEnum(Integer value, String label) { - this.value = value; - this.label = label; - } - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/NodeStatusEnum.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/NodeStatusEnum.java deleted file mode 100644 index 7c8ed25eb..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/NodeStatusEnum.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.pig4cloud.pigx.flow.task.constant; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -@Getter -@RequiredArgsConstructor -public enum NodeStatusEnum { - - WKS(0, "未开始"), JXZ(1, "进行中"), YJS(2, "已结束"); - - private final int code; - - private final String name; - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/NodeTypeEnum.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/NodeTypeEnum.java deleted file mode 100644 index d441cedd8..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/NodeTypeEnum.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.pig4cloud.pigx.flow.task.constant; - -import lombok.Getter; - -import java.util.Arrays; - -/** - * 节点枚举 - */ -@Getter -public enum NodeTypeEnum { - - ROOT("根节点", 0, false), END("结束节点", -1, false), - - APPROVAL("审批节点", 1, false), CC("抄送节点", 2, false), EXCLUSIVE_GATEWAY("条件分支", 4, true), - - PARALLEL_GATEWAY("并行分支", 5, true), EMPTY("空", 3, false), - - ; - - public static NodeTypeEnum getByValue(int value) { - return Arrays.stream(NodeTypeEnum.values()).filter(w -> w.getValue() == value).findAny().orElse(null); - } - - NodeTypeEnum(String name, Integer value, Boolean branch) { - this.name = name; - this.value = value; - this.branch = branch; - } - - private String name; - - private Integer value; - - private Boolean branch; - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/NodeUserTypeEnum.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/NodeUserTypeEnum.java deleted file mode 100644 index 860ddad41..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/NodeUserTypeEnum.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.pig4cloud.pigx.flow.task.constant; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 用户节点类型枚举 - */ -@Getter -@AllArgsConstructor -public enum NodeUserTypeEnum { - - USER("user", "用户"), DEPT("dept", "部门"), ROLE("role", "角色"),; - - private String key; - - private String name; - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/ProcessInstanceConstant.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/ProcessInstanceConstant.java deleted file mode 100644 index 9ec61d0f9..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/ProcessInstanceConstant.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.pig4cloud.pigx.flow.task.constant; - -public class ProcessInstanceConstant { - - /** - * 空执行人 - */ - public static final Long DEFAULT_EMPTY_ASSIGN = -99999999L; - - /** - * 用户任务没有执行人的情况下如何处理 自动通过 - */ - public static final String USER_TASK_NOBODY_HANDLER_TO_PASS = "TO_PASS"; - - /** - * 转交给管理员 - */ - public static final String USER_TASK_NOBODY_HANDLER_TO_ADMIN = "TO_ADMIN"; - - /** - * 指定人员 - */ - public static final String USER_TASK_NOBODY_HANDLER_TO_USER = "TO_USER"; - - /** - * 结束流程 - */ - public static final String USER_TASK_NOBODY_HANDLER_TO_END = "TO_END"; - - public static final String USER_TASK_NOBODY_HANDLER_TO_REFUSE = "TO_REFUSE"; - - /** - * 拒绝之后 结束流程 - */ - public static final String USER_TASK_REFUSE_TYPE_TO_END = "TO_END"; - - /** - * 拒绝之后 到某个节点 - */ - public static final String USER_TASK_REFUSE_TYPE_TO_NODE = "TO_NODE"; - - /** - * 会签 - */ - public static final int MULTIPLE_MODE_AL_SAME = 1; - - /** - * 或签 - */ - public static final int MULTIPLE_MODE_ONE = 2; - - /** - * 顺签 - */ - public static final int MULTIPLE_MODE_ALL_SORT = 3; - - public static class AssignedTypeClass { - - // 指定用户 - public static final int USER = 1; - - // 指定主管 - public static final int LEADER = 2; - - // 发起人自己 - public static final int SELF = 5; - - // 表单人员 - public static final int FORM_USER = 8; - - // 发起人自选 - public static final int SELF_SELECT = 4; - - // 角色 - public static final int ROLE = 3; - - } - - /** - * 表单权限 - */ - public static class FormPermClass { - - // 隐藏 - public static final String HIDE = "H"; - - // 只读 - public static final String READ = "R"; - - // 编辑 - public static final String EDIT = "E"; - - } - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/StatusEnum.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/StatusEnum.java deleted file mode 100644 index 3a5c2bd90..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/StatusEnum.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.pig4cloud.pigx.flow.task.constant; - -import lombok.Getter; - -/** - * 状态枚举 - * - * @author haoxr - * @since 2022/10/14 - */ -public enum StatusEnum implements IBaseEnum { - - ENABLE(1, "启用"), DISABLE(0, "禁用"); - - @Getter - private Integer value; - - @Getter - private String label; - - StatusEnum(Integer value, String label) { - this.value = value; - this.label = label; - } - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/SystemConstants.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/SystemConstants.java deleted file mode 100644 index 8f0518f8a..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/SystemConstants.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.pig4cloud.pigx.flow.task.constant; - -/** - * 系统常量 - * - * @author haoxr - * @since 2022/10/22 - */ -public interface SystemConstants { - - /** - * 根节点ID - */ - Long ROOT_NODE_ID = 0L; - - /** - * 系统默认密码 - */ - String DEFAULT_PASSWORD = "123456"; - - /** - * 超级管理员角色编码 - */ - String ROOT_ROLE_CODE = "ROOT"; - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/CheckChildDto.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/CheckChildDto.java deleted file mode 100644 index 43f95a194..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/CheckChildDto.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.pig4cloud.pigx.flow.task.dto; - -import lombok.Data; - -import java.util.List; - -/** - * 检查子部门DTO - */ -@Data -public class CheckChildDto { - - /** - * 子部门ID - */ - private Long childId; - - /** - * 父部门ID列表 - */ - private List deptIdList; - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/CheckParentDto.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/CheckParentDto.java deleted file mode 100644 index 75bbc4846..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/CheckParentDto.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.pig4cloud.pigx.flow.task.dto; - -import lombok.Data; - -import java.util.List; - -/** - * 检查是否是给定的父级 - * - */ -@Data -public class CheckParentDto { - - private Long parentId; - - private List deptIdList; - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/Condition.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/Condition.java deleted file mode 100644 index a82d12566..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/Condition.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.pig4cloud.pigx.flow.task.dto; - -import lombok.Data; - -/** - * 条件类 - */ -@Data -public class Condition { - - /** - * 条件键 - */ - private String key; - - /** - * 表达式 - */ - private String expression; - - /** - * 值 - */ - private Object value; - - /** - * 键类型 - */ - private String keyType; - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/GroupCondition.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/GroupCondition.java deleted file mode 100644 index 2cfb9b461..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/GroupCondition.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.pig4cloud.pigx.flow.task.dto; - -import lombok.Data; - -import java.util.List; - -/** - * 分组条件类 - */ -@Data -public class GroupCondition { - - /** - * 是否并行 - */ - private Boolean mode; - - /** - * 条件列表 - */ - private List conditionList; - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/IndexPageStatistics.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/IndexPageStatistics.java deleted file mode 100644 index 8ee9cca74..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/IndexPageStatistics.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.pig4cloud.pigx.flow.task.dto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * 首页统计数据 - */ -@Data -@Builder -@AllArgsConstructor -@NoArgsConstructor -public class IndexPageStatistics { - - /** - * 待办数量 - */ - private Long pendingNum; - - /** - * 发起数量 - */ - private Long startedNum; - - /** - * 抄送任务 - */ - private Long copyNum; - - /** - * 完成数量 - */ - private Long completedNum; - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/Nobody.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/Nobody.java deleted file mode 100644 index b43f4cd40..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/Nobody.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.pig4cloud.pigx.flow.task.dto; - -import lombok.Data; - -import java.util.List; - -@Data -public class Nobody { - - private String handler; - - private List assignedUser; - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/Node.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/Node.java deleted file mode 100644 index a86d17983..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/Node.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.pig4cloud.pigx.flow.task.dto; - -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.Data; - -import java.util.List; -import java.util.Map; - -@Data -public class Node { - - private String id; - - private String parentId; - - private String headId; - - private String tailId; - - private String placeHolder; - - private Integer type; - - @JsonProperty(value = "nodeName") - private String name; - - private Boolean error; - - @JsonProperty("childNode") - private Node children; - - private String eventConfig; - - private Integer assignedType; - - private Boolean multiple; - - private Integer multipleMode; - - private Integer deptLeaderLevel; - - private String formUserId; - - private String formUserName; - - private List nodeUserList; - - private List conditionNodes; - - private Map formPerms; - - private Nobody nobody; - - private Boolean groupMode; - - private List conditionList; - - private Refuse refuse; - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/NodeHttpResultVO.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/NodeHttpResultVO.java deleted file mode 100644 index 2686c4ffc..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/NodeHttpResultVO.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.pig4cloud.pigx.flow.task.dto; - -import lombok.Data; - -import java.util.Map; - -/** - * 节点处理http请求结果对象 - */ -@Data -public class NodeHttpResultVO { - - private Boolean ok; - - private Map data; - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/NodeUser.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/NodeUser.java deleted file mode 100644 index a8fa54ca4..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/NodeUser.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.pig4cloud.pigx.flow.task.dto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * 节点用户对象 - */ -@NoArgsConstructor -@Data -@Builder -@AllArgsConstructor -public class NodeUser { - - /** - * 用户od - */ - private Long id; - - /** - * 用户名称 - */ - private String name; - - /** - * 类型 - */ - private String type; - - /** - * 选择 - */ - private Boolean selected; - - private String avatar; - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/ProcessCopyDto.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/ProcessCopyDto.java deleted file mode 100644 index f6eb84f26..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/ProcessCopyDto.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.pig4cloud.pigx.flow.task.dto; - -import lombok.Data; - -import java.time.LocalDateTime; - -@Data -public class ProcessCopyDto { - - /** - * 当前节点时间 - */ - private LocalDateTime nodeTime; - - /** - * 发起人 - */ - private Long startUserId; - - /** - * 流程id - */ - private String flowId; - - /** - * 实例id - */ - private String processInstanceId; - - /** - * 节点id - */ - private String nodeId; - - /** - * 节点 名称 - */ - private String nodeName; - - /** - * 表单数据 - */ - private String formData; - - /** - * 抄送人id - */ - private Long userId; - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/ProcessInstanceParamDto.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/ProcessInstanceParamDto.java deleted file mode 100644 index d395fb999..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/ProcessInstanceParamDto.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.pig4cloud.pigx.flow.task.dto; - -import lombok.Data; - -import java.util.HashMap; -import java.util.Map; - -/** - * 流程实例参数对象 - */ -@Data -public class ProcessInstanceParamDto { - - /** - * 流程id - */ - private String flowId; - - /** - * 参数集合 - */ - private Map paramMap = new HashMap<>(); - - /** - * 发起人 - */ - private String startUserId; - - /** - * 实例id - */ - private String processInstanceId; - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/ProcessInstanceRecordParamDto.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/ProcessInstanceRecordParamDto.java deleted file mode 100644 index 41713a43d..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/ProcessInstanceRecordParamDto.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.pig4cloud.pigx.flow.task.dto; - -import lombok.Getter; -import lombok.Setter; - -/** - *

- * 流程记录 - *

- * - * @author Vincent - * @since 2023-05-07 - */ -@Getter -@Setter -public class ProcessInstanceRecordParamDto { - - /** - * 用户id - */ - private Long userId; - - /** - * 流程id - */ - private String flowId; - - /** - * 流程实例id - */ - private String processInstanceId; - - private String parentProcessInstanceId; - - /** - * 表单数据 - */ - private String formData; - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/ProcessNodeDataDto.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/ProcessNodeDataDto.java deleted file mode 100644 index ff3ada016..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/ProcessNodeDataDto.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.pig4cloud.pigx.flow.task.dto; - -import lombok.Data; - -@Data -public class ProcessNodeDataDto { - - private String flowId; - - private String nodeId; - - private String data; - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/ProcessNodeRecordAssignUserParamDto.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/ProcessNodeRecordAssignUserParamDto.java deleted file mode 100644 index b640f866d..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/ProcessNodeRecordAssignUserParamDto.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.pig4cloud.pigx.flow.task.dto; - -import lombok.Data; - -/** - * 流程节点记录-执行人 - */ -@Data -public class ProcessNodeRecordAssignUserParamDto { - - /** - * 流程id (process id) - */ - private String flowId; - - /** - * 流程实例id (process instance id) - */ - private String processInstanceId; - - /** - * 表单数据 (form data) - */ - private String data; - - /** - * 本地数据 (local data) - */ - private String localData; - - /** - * 节点id (node id) - */ - private String nodeId; - - /** - * 用户id (user id) - */ - private Long userId; - - /** - * 执行id (execution id) - */ - private String executionId; - - /** - * 任务id (task id) - */ - private String taskId; - - /** - * 审批描述 (approval description) - */ - private String approveDesc; - - /** - * 节点名称 (node name) - */ - private String nodeName; - - /** - * 任务类型 (task type) - */ - private String taskType; - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/ProcessNodeRecordParamDto.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/ProcessNodeRecordParamDto.java deleted file mode 100644 index c8c19613d..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/ProcessNodeRecordParamDto.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.pig4cloud.pigx.flow.task.dto; - -import lombok.Data; - -/** - * 流程节点记录 - */ -@Data -public class ProcessNodeRecordParamDto { - - /** - * 流程id (process id) - */ - private String flowId; - - /** - * 流程实例id (process instance id) - */ - private String processInstanceId; - - /** - * 表单数据 (form data) - */ - private String data; - - /** - * 节点id (node id) - */ - private String nodeId; - - /** - * 节点类型 (node type) - */ - private String nodeType; - - /** - * 节点名字 (node name) - */ - private String nodeName; - - /** - * 执行id (execution id) - */ - private String executionId; - - /** - * 任务id (task id) - */ - private String taskId; - - /** - * 审批描述 (approval description) - */ - private String approveDesc; - - /** - * 任务类型 (task type) - */ - private String taskType; - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/Refuse.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/Refuse.java deleted file mode 100644 index 216310ed9..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/Refuse.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.pig4cloud.pigx.flow.task.dto; - -import lombok.Data; - -@Data -public class Refuse { - - private String handler; - - private String nodeId; - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/SelectValue.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/SelectValue.java deleted file mode 100644 index 0632acbab..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/SelectValue.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.pig4cloud.pigx.flow.task.dto; - -import lombok.Data; - -/** - * @author Huijun Zhao - * @description - * @date 2023-07-28 10:36 - */ -@Data -public class SelectValue { - - private String key; - - private String value; - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/TaskDto.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/TaskDto.java deleted file mode 100644 index 032417ba3..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/TaskDto.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.pig4cloud.pigx.flow.task.dto; - -import lombok.Data; - -import java.time.LocalDateTime; -import java.util.Date; -import java.util.Map; - -/** - * 任务对象 - */ -@Data -public class TaskDto { - - /** - * 流程id - */ - private String flowId; - - /** - * 参数集合 - */ - private Map paramMap; - - /** - * 实例id - */ - private String processInstanceId; - - /** - * 执行id - */ - private String executionId; - - /** - * 耗时 - */ - private Long durationInMillis; - - /** - * 任务id - */ - private String taskId; - - /** - * 执行人 - */ - private String assign; - - /** - * 任务名称 - */ - private String taskName; - - /** - * 节点id - */ - private String nodeId; - - /** - * 任务创建时间 - */ - private Date taskCreateTime; - - private Date taskEndTime; - - /** - * 流程组名字 - */ - private String groupName; - - /** - * 发起人id - */ - private Long rootUserId; - - /** - * 发起人名字 - */ - private String rootUserName; - - /** - * 发起人头像 - */ - private String rootUserAvatarUrl; - - /** - * 发起时间 - */ - private LocalDateTime startTime; - - /** - * 流程名称 - */ - private String processName; - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/TaskParamDto.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/TaskParamDto.java deleted file mode 100644 index 7b7448196..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/TaskParamDto.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.pig4cloud.pigx.flow.task.dto; - -import lombok.Data; - -import java.util.List; -import java.util.Map; - -/** - * 任务完成参数对象 - */ -@Data -public class TaskParamDto { - - private String processInstanceId; - - private List processInstanceIdList; - - /** - * 节点id - */ - private String nodeId; - - /** - * 添加子流程发起人 - */ - private Boolean appendChildProcessRootId; - - /** - * 任务id - */ - private String taskId; - - /** - * 用户id - */ - private String userId; - - /** - * 模板用户id - */ - private String targetUserId; - - /** - * 参数 - */ - private Map paramMap; - - /** - * 任务本地变量 - */ - private Map taskLocalParamMap; - - /** - * 模板节点 - */ - private String targetNodeId; - - /** - * 转办目标用户 ID 列表 - */ - private List targetUserIdList; -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/TaskQueryParamDto.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/TaskQueryParamDto.java deleted file mode 100644 index 349135269..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/TaskQueryParamDto.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.pig4cloud.pigx.flow.task.dto; - -import lombok.Data; - -import java.time.LocalDateTime; - -/** - * 用户任务查询参数 - */ -@Data -public class TaskQueryParamDto { - - /** - * 任务执行人 - */ - private String assign; - - /** - * 页码 - */ - private Integer current; - - /** - * 每页的数量 - */ - private Integer size; - - /** - * 流程名称 - */ - private String processName; - - /** - * 任务时间 - */ - private LocalDateTime[] taskTime; - - /** - * 状态 - */ - private Integer status; - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/TaskResultDto.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/TaskResultDto.java deleted file mode 100644 index d7c501f1c..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/TaskResultDto.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.pig4cloud.pigx.flow.task.dto; - -import lombok.Data; - -import java.util.Map; - -/** - * 任务结果对象 - * - */ -@Data -public class TaskResultDto { - - private Boolean currentTask; - - /** - * 流程id - */ - private String flowId; - - private Node taskNode; - - private String nodeId; - - /** - * 实例id - */ - private String processInstanceId; - - /** - * 委派状态 - */ - private String delegationState; - - /** - * 是否允许继续委派 - */ - private Boolean delegate; - - /** - * 所有变量 - */ - private Map variableAll; - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/VariableQueryParamDto.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/VariableQueryParamDto.java deleted file mode 100644 index 6f07f677d..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/VariableQueryParamDto.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.pig4cloud.pigx.flow.task.dto; - -import lombok.Data; - -import java.util.List; - -@Data -public class VariableQueryParamDto { - - private String taskId; - - private List keyList; - - private String executionId; - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/Process.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/Process.java deleted file mode 100644 index 9473e03b5..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/Process.java +++ /dev/null @@ -1,138 +0,0 @@ -package com.pig4cloud.pigx.flow.task.entity; - -import com.baomidou.mybatisplus.annotation.*; -import com.pig4cloud.pigx.common.core.util.TenantTable; -import lombok.Getter; -import lombok.Setter; -import lombok.experimental.Accessors; - -import java.time.LocalDateTime; - -/** - *

- * - *

- * - * @author Vincent - * @since 2023-07-06 - */ -@Getter -@Setter -@TenantTable -@Accessors(chain = true) -@TableName("process") -public class Process { - - /** - * 表单ID - */ - @TableField("flow_id") - private String flowId; - - /** - * 表单名称 - */ - @TableField("name") - private String name; - - /** - * 图标配置 - */ - @TableField("logo") - private String logo; - - /** - * 设置项 - */ - @TableField("settings") - private String settings; - - /** - * 分组ID - */ - @TableField("group_id") - private Long groupId; - - /** - * 表单设置内容 - */ - @TableField("form_items") - private String formItems; - - /** - * 流程设置内容 - */ - @TableField("process") - private String process; - - /** - * 备注 - */ - @TableField("remark") - private String remark; - - @TableField("sort") - private Integer sort; - - /** - * 0 正常 1=隐藏 - */ - @TableField("is_hidden") - private String hidden; - - /** - * 0 正常 1=停用 - */ - @TableField("is_stop") - private String stop; - - /** - * 流程管理员 - */ - @TableField("admin_id") - private Long adminId; - - /** - * 唯一性id - */ - @TableField("unique_id") - private String uniqueId; - - /** - * 管理员 - */ - @TableField("admin_list") - private String adminList; - - /** - * 范围描述显示 - */ - @TableField("range_show") - private String rangeShow; - - /** - * 用户id - */ - @TableId(value = "id", type = IdType.ASSIGN_ID) - private Long id; - - /** - * 逻辑删除字段 - */ - @TableLogic - @TableField(fill = FieldFill.INSERT) - private String delFlag; - - /** - * 创建时间 - */ - @TableField(fill = FieldFill.INSERT) - private LocalDateTime createTime; - - /** - * 更新时间 - */ - @TableField(fill = FieldFill.INSERT_UPDATE) - private LocalDateTime updateTime; - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/ProcessGroup.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/ProcessGroup.java deleted file mode 100644 index 43459ec49..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/ProcessGroup.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.pig4cloud.pigx.flow.task.entity; - -import com.baomidou.mybatisplus.annotation.*; -import com.pig4cloud.pigx.common.core.util.TenantTable; -import lombok.Getter; -import lombok.Setter; -import lombok.experimental.Accessors; - -import java.time.LocalDateTime; - -/** - *

- * - *

- * - * @author Vincent - * @since 2023-07-06 - */ -@Getter -@Setter -@TenantTable -@Accessors(chain = true) -@TableName("process_group") -public class ProcessGroup { - - /** - * 分组名 - */ - @TableField("group_name") - private String groupName; - - /** - * 排序 - */ - @TableField("sort") - private Integer sort; - - /** - * 用户id - */ - @TableId(value = "id", type = IdType.ASSIGN_ID) - private Long id; - - /** - * 逻辑删除字段 - */ - @TableLogic - @TableField(fill = FieldFill.INSERT) - private String delFlag; - - /** - * 创建时间 - */ - @TableField(fill = FieldFill.INSERT) - private LocalDateTime createTime; - - /** - * 更新时间 - */ - @TableField(fill = FieldFill.INSERT_UPDATE) - private LocalDateTime updateTime; - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/ProcessNodeData.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/ProcessNodeData.java deleted file mode 100644 index a3ea81612..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/ProcessNodeData.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.pig4cloud.pigx.flow.task.entity; - -import com.baomidou.mybatisplus.annotation.*; -import com.pig4cloud.pigx.common.core.util.TenantTable; -import lombok.Getter; -import lombok.Setter; -import lombok.experimental.Accessors; - -import java.time.LocalDateTime; - -/** - *

- * 流程节点数据 - *

- * - * @author Vincent - * @since 2023-07-06 - */ -@Getter -@Setter -@TenantTable -@Accessors(chain = true) -@TableName("process_node_data") -public class ProcessNodeData { - - /** - * 流程id - */ - @TableField("flow_id") - private String flowId; - - /** - * 表单数据 - */ - @TableField("data") - private String data; - - @TableField("node_id") - private String nodeId; - - /** - * 用户id - */ - @TableId(value = "id", type = IdType.ASSIGN_ID) - private Long id; - - /** - * 逻辑删除字段 - */ - @TableLogic - @TableField(fill = FieldFill.INSERT) - private String delFlag; - - /** - * 创建时间 - */ - @TableField(fill = FieldFill.INSERT) - private LocalDateTime createTime; - - /** - * 更新时间 - */ - @TableField(fill = FieldFill.INSERT_UPDATE) - private LocalDateTime updateTime; - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/ProcessNodeRecordAssignUser.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/ProcessNodeRecordAssignUser.java deleted file mode 100644 index 30704c3ab..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/ProcessNodeRecordAssignUser.java +++ /dev/null @@ -1,132 +0,0 @@ -package com.pig4cloud.pigx.flow.task.entity; - -import com.baomidou.mybatisplus.annotation.*; -import com.pig4cloud.pigx.common.core.util.TenantTable; -import lombok.Getter; -import lombok.Setter; -import lombok.experimental.Accessors; - -import java.time.LocalDateTime; - -/** - *

- * 流程节点记录-执行人 - *

- * - * @author Vincent - * @since 2023-07-06 - */ -@Getter -@Setter -@TenantTable -@Accessors(chain = true) -@TableName("process_node_record_assign_user") -public class ProcessNodeRecordAssignUser { - - /** - * 流程id - */ - @TableField("flow_id") - private String flowId; - - /** - * 流程实例id - */ - @TableField("process_instance_id") - private String processInstanceId; - - /** - * 表单数据 - */ - @TableField("data") - private String data; - - @TableField("node_id") - private String nodeId; - - /** - * 用户id - */ - @TableField("user_id") - private String userId; - - /** - * 节点状态 - */ - @TableField("status") - private Integer status; - - /** - * 开始时间 - */ - @TableField("start_time") - private LocalDateTime startTime; - - /** - * 结束时间 - */ - @TableField("end_time") - private LocalDateTime endTime; - - /** - * 执行id - */ - @TableField("execution_id") - private String executionId; - - /** - * 任务id - */ - @TableField("task_id") - private String taskId; - - /** - * 审批意见 - */ - @TableField("approve_desc") - private String approveDesc; - - /** - * 节点名称 - */ - @TableField("node_name") - private String nodeName; - - /** - * 任务类型 - */ - @TableField("task_type") - private String taskType; - - /** - * 表单本地数据 - */ - @TableField("local_data") - private String localData; - - /** - * 用户id - */ - @TableId(value = "id", type = IdType.ASSIGN_ID) - private Long id; - - /** - * 逻辑删除字段 - */ - @TableLogic - @TableField(fill = FieldFill.INSERT) - private String delFlag; - - /** - * 创建时间 - */ - @TableField(fill = FieldFill.INSERT) - private LocalDateTime createTime; - - /** - * 更新时间 - */ - @TableField(fill = FieldFill.INSERT_UPDATE) - private LocalDateTime updateTime; - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/ProcessStarter.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/ProcessStarter.java deleted file mode 100644 index 83774e976..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/ProcessStarter.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.pig4cloud.pigx.flow.task.entity; - -import com.baomidou.mybatisplus.annotation.*; -import com.pig4cloud.pigx.common.core.util.TenantTable; -import lombok.Getter; -import lombok.Setter; -import lombok.experimental.Accessors; - -import java.time.LocalDateTime; - -/** - *

- * 流程发起人 - *

- * - * @author Vincent - * @since 2023-07-06 - */ -@Getter -@Setter -@TenantTable -@Accessors(chain = true) -@TableName("process_starter") -public class ProcessStarter { - - /** - * 用户id或者部门id - */ - @TableField("type_id") - private Long typeId; - - /** - * 类型 user dept - */ - @TableField("type") - private String type; - - /** - * 流程id - */ - @TableField("process_id") - private Long processId; - - /** - * 用户id - */ - @TableId(value = "id", type = IdType.ASSIGN_ID) - private Long id; - - /** - * 逻辑删除字段 - */ - @TableLogic - @TableField(fill = FieldFill.INSERT) - private String delFlag; - - /** - * 创建时间 - */ - @TableField(fill = FieldFill.INSERT) - private LocalDateTime createTime; - - /** - * 更新时间 - */ - @TableField(fill = FieldFill.INSERT_UPDATE) - private LocalDateTime updateTime; - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/ErrorRspVo.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/ErrorRspVo.java deleted file mode 100644 index 25339cf47..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/ErrorRspVo.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.pig4cloud.pigx.flow.task.vo; - -import lombok.AllArgsConstructor; -import lombok.Data; - -/** - * @author : willian fu - * @date : 2022/7/4 - */ -@Data -@AllArgsConstructor -public class ErrorRspVo { - - private Integer code; - - private String msg; - - private String desp; - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/FormGroupVo.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/FormGroupVo.java deleted file mode 100644 index 6d6776013..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/FormGroupVo.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.pig4cloud.pigx.flow.task.vo; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.time.LocalDateTime; -import java.util.List; - -/** - * @author : willian fu - * @date : 2020/9/21 - */ -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class FormGroupVo { - - private Long id; - - /** - * 流程名字 - */ - private String name; - - /** - * 流程 - */ - private List items; - - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - public static class FlowVo { - - private String flowId; - - /** - * 发起范围 - */ - private String rangeShow; - - private String name; - - private String logo; - - private String stop; - - private String remark; - - private LocalDateTime updated; - - } - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/FormItemVO.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/FormItemVO.java deleted file mode 100644 index b9afca52f..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/FormItemVO.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.pig4cloud.pigx.flow.task.vo; - -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.FieldNameConstants; - -/** - * 表单 - */ -@Data -@NoArgsConstructor -@FieldNameConstants -public class FormItemVO { - - private String id; - - private String perm; - - private String icon; - - private String name; - - private String type; - - private Boolean required; - - private String typeName; - - private String placeholder; - - private Props props = new Props(); - - @Data - @NoArgsConstructor - @FieldNameConstants - public static class Props { - - private Object value; - - private Object dictValue; - - private Object options; - - private Boolean self; - - private Boolean multi; - - private Object oriForm; - - private Object maxLength; - - private Object minLength; - - private Object regex; - - private Object regexDesc; - - private String prefix; - - private Long min; - - private Long max; - - private String unit; - - private Integer radixNum; - - private Integer maxSize; - - private String[] suffixArray; - - } - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/NodeFormatParamVo.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/NodeFormatParamVo.java deleted file mode 100644 index 14be488be..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/NodeFormatParamVo.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.pig4cloud.pigx.flow.task.vo; - -import lombok.Data; - -import java.util.Map; - -@Data -public class NodeFormatParamVo { - - private String flowId; - - private String processInstanceId; - - private String taskId; - - private Map paramMap; - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/NodeVo.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/NodeVo.java deleted file mode 100644 index 37060f6e1..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/NodeVo.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.pig4cloud.pigx.flow.task.vo; - -import lombok.Data; - -import java.util.List; - -/** - * 流程节点显示对象 - */ -@Data -public class NodeVo { - - /** - * nodeId - */ - private String id; - - /** - * 用户列表 - */ - private List userVoList; - - /** - * 显示 - */ - private String placeholder; - - /** - * 状态 1进行中2已完成 - */ - private Integer status; - - /** - * 节点名称 - */ - private String name; - - /** - * 节点类型 - */ - private Object type; - - /** - * 发起人选择用户 - */ - private Boolean selectUser; - - /** - * 是否多选 - */ - private Boolean multiple; - - /** - * 子级列表 - */ - private List children; - - /** - * 分支列表 - */ - private List branch; - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/OrgTreeVo.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/OrgTreeVo.java deleted file mode 100644 index f105bdb95..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/OrgTreeVo.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.pig4cloud.pigx.flow.task.vo; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * @author : willian fu - * @version : 1.0 - */ -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class OrgTreeVo { - - /** - * 用户od - */ - private Long id; - - /** - * 用户名称 - */ - private String name; - - /** - * 类型 - */ - private String type; - - /** - * 选择 - */ - private Boolean selected; - - private String avatar; - - private Integer status = 1; - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/ProcessCopyVo.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/ProcessCopyVo.java deleted file mode 100644 index b66206317..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/ProcessCopyVo.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.pig4cloud.pigx.flow.task.vo; - -import com.pig4cloud.pigx.flow.task.entity.ProcessCopy; -import lombok.Data; - -@Data -public class ProcessCopyVo extends ProcessCopy { - - private String startUserName; - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/ProcessVO.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/ProcessVO.java deleted file mode 100644 index 73983d412..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/ProcessVO.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.pig4cloud.pigx.flow.task.vo; - -import com.pig4cloud.pigx.flow.task.entity.Process; -import lombok.Data; - -import java.util.List; -import java.util.Map; - -@Data -public class ProcessVO extends Process { - - /** - * 需要发起人选择的节点id - */ - private List selectUserNodeId; - - private Map variableMap; - - /** - * 发起人节点的表单权限 - */ - private Map formPerms; - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/UserVo.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/UserVo.java deleted file mode 100644 index 1d835f483..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/UserVo.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.pig4cloud.pigx.flow.task.vo; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.time.LocalDateTime; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class UserVo { - - /** - * 用户od - */ - private Long id; - - /** - * 用户名称 - */ - private String name; - - private LocalDateTime showTime; - - private String avatar; - - /** - * 意见 - */ - private String approveDesc; - - private String operType; - - /** - * 状态 1进行中2已完成 - */ - private Integer status = 0; - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports deleted file mode 100644 index c7b4ff957..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports +++ /dev/null @@ -1,3 +0,0 @@ -com.pig4cloud.pigx.flow.task.api.feign.RemoteFlowTaskService -com.pig4cloud.pigx.flow.task.api.feign.RemoteFlowEngineService -com.pig4cloud.pigx.flow.task.api.feign.RemoteFlowApiFlowService diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/Dockerfile b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/Dockerfile deleted file mode 100644 index 7084a213c..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/Dockerfile +++ /dev/null @@ -1,19 +0,0 @@ -FROM registry.cn-hangzhou.aliyuncs.com/dockerhub_mirror/java:21-anolis - -MAINTAINER wangiegie@gmail.com - -ENV TZ=Asia/Shanghai -ENV LANG C.UTF-8 -ENV JAVA_OPTS="-Xms512m -Xmx1024m -Djava.security.egd=file:/dev/./urandom" - -RUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone - -RUN mkdir -p /pigx-flow-task - -WORKDIR /pigx-flow-task - -EXPOSE 9030 - -ADD ./target/pigx-flow-task-biz.jar ./ - -CMD sleep 60;java $JAVA_OPTS -jar pigx-flow-task-biz.jar diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/pom.xml b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/pom.xml deleted file mode 100644 index fcd521427..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/pom.xml +++ /dev/null @@ -1,143 +0,0 @@ - - - 4.0.0 - - com.pig4cloud - pigx-flow-task - 5.9.0 - - - pigx-flow-task-biz - - - - - org.springframework.boot - spring-boot-starter-undertow - - - - org.springframework.boot - spring-boot-starter-web - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-discovery - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-config - - - - com.pig4cloud - pigx-common-data - - - - com.pig4cloud - pigx-common-sequence - - - - com.pig4cloud - pigx-common-security - - - - com.pig4cloud - pigx-common-xss - - - - com.pig4cloud - pigx-common-sentinel - - - - com.pig4cloud - pigx-common-feign - - - - com.pig4cloud - pigx-flow-task-api - - - - com.pig4cloud - pigx-common-log - - - - com.pig4cloud - pigx-common-encrypt-api - - - - com.baomidou - mybatis-plus-spring-boot3-starter - - - - com.alibaba - druid-spring-boot-3-starter - - - - com.mysql - mysql-connector-j - - - - com.pig4cloud - pigx-common-swagger - - - - org.springframework.boot - spring-boot-starter-test - - - - - cloud - - true - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - repackage - - - CLASSIC - - - - - - io.fabric8 - docker-maven-plugin - - false - - - - - - - boot - - - diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/PigxFlowTaskApplication.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/PigxFlowTaskApplication.java deleted file mode 100644 index ce820a08e..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/PigxFlowTaskApplication.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.pig4cloud.pigx.flow.task; - -import com.pig4cloud.pigx.common.feign.annotation.EnablePigxFeignClients; -import com.pig4cloud.pigx.common.security.annotation.EnablePigxResourceServer; -import com.pig4cloud.pigx.common.swagger.annotation.EnableOpenApi; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.client.discovery.EnableDiscoveryClient; - -/** - * @author pigx archetype - *

- * 项目启动类 - */ -@EnableOpenApi("task") -@EnablePigxFeignClients -@EnableDiscoveryClient -@EnablePigxResourceServer -@SpringBootApplication -public class PigxFlowTaskApplication { - - public static void main(String[] args) { - SpringApplication.run(PigxFlowTaskApplication.class, args); - } - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/config/SequenceConfiguration.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/config/SequenceConfiguration.java deleted file mode 100644 index ccf2a81e0..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/config/SequenceConfiguration.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.pig4cloud.pigx.flow.task.config; - -import cn.hutool.core.date.DateUtil; -import com.pig4cloud.pigx.common.data.tenant.TenantContextHolder; -import com.pig4cloud.pigx.common.sequence.builder.DbSeqBuilder; -import com.pig4cloud.pigx.common.sequence.properties.BaseSequenceProperties; -import com.pig4cloud.pigx.common.sequence.sequence.Sequence; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import javax.sql.DataSource; - -/** - * @author lengleng - * @date 2023-07-19 - *

- * 设置发号器生成规则 - */ -@Configuration -public class SequenceConfiguration { - - /** - * 工作流发号器 - * @param dataSource - * @param properties - * @return - */ - @Bean - public Sequence flowSequence(DataSource dataSource, BaseSequenceProperties properties) { - return DbSeqBuilder.create() - .bizName(() -> String.format("flow_%s_%s", TenantContextHolder.getTenantId(), DateUtil.today())) - .dataSource(dataSource) - .step(properties.getStep()) - .retryTimes(properties.getDb().getRetryTimes()) - .tableName(properties.getDb().getTableName()) - .build(); - } - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/CombinationGroupController.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/CombinationGroupController.java deleted file mode 100644 index 2c5ba3e1c..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/CombinationGroupController.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.pig4cloud.pigx.flow.task.controller; - -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.pig4cloud.pigx.common.core.util.R; -import com.pig4cloud.pigx.flow.task.service.ICombinationGroupService; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * 组聚合接口控制器 - */ -@RestController -@RequiredArgsConstructor -@RequestMapping("/combination/group") -public class CombinationGroupController { - - private final ICombinationGroupService combinationGroupService; - - /** - * 查询表单组包含流程 - * @return 表单组数据 - */ - @GetMapping("listGroupWithProcess") - public R listGroupWithProcess(Page page, Long groupId) { - return combinationGroupService.listGroupWithProcess(page, groupId); - } - - /** - * 查询所有我可以发起的表单组 - * @return - */ - @GetMapping("listCurrentUserStartGroup") - public R listCurrentUserStartGroup() { - return combinationGroupService.listCurrentUserStartGroup(); - } - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/ProcessController.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/ProcessController.java deleted file mode 100644 index 644522bcc..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/ProcessController.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.pig4cloud.pigx.flow.task.controller; - -import com.pig4cloud.pigx.common.core.util.R; -import com.pig4cloud.pigx.flow.task.entity.Process; -import com.pig4cloud.pigx.flow.task.service.IProcessService; -import com.pig4cloud.pigx.flow.task.vo.ProcessVO; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -@RestController -@RequiredArgsConstructor -@RequestMapping("/process") -public class ProcessController { - - private final IProcessService processService; - - /** - * 获取详细数据 - * @param flowId - * @return - */ - @GetMapping("getDetail") - public R getDetail(String flowId) { - return processService.getDetail(flowId); - } - - /** - * 创建流程 - * @param process - * @return - */ - @PostMapping("create") - public R create(@RequestBody Process process) { - return processService.create(process); - } - - /** - * 编辑表单 - * @param flowId 摸板ID - * @param type 类型 stop using delete - * @return 操作结果 - */ - @PutMapping("update/{flowId}") - public R update(@PathVariable String flowId, @RequestParam String type, - @RequestParam(required = false) Long groupId) { - return processService.update(flowId, type, groupId); - } - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/ProcessCopyController.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/ProcessCopyController.java deleted file mode 100644 index 19d2362a0..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/ProcessCopyController.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.pig4cloud.pigx.flow.task.controller; - -import com.pig4cloud.pigx.common.core.util.R; -import com.pig4cloud.pigx.flow.task.service.IProcessCopyService; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - *

- * 流程抄送数据 前端控制器 - *

- * - * @author Vincent - * @since 2023-05-20 - */ -@RestController -@RequiredArgsConstructor -@RequestMapping("/processCopy") -public class ProcessCopyController { - - private final IProcessCopyService processCopyService; - - /** - * 查询单个抄送详细信息 - * @param id - * @return - */ - @GetMapping("querySingleDetail") - public R querySingleDetail(long id) { - return processCopyService.querySingleDetail(id); - } - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/ProcessInstanceController.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/ProcessInstanceController.java deleted file mode 100644 index a9cf63a5a..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/ProcessInstanceController.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.pig4cloud.pigx.flow.task.controller; - -import com.pig4cloud.pigx.common.core.util.R; -import com.pig4cloud.pigx.flow.task.dto.ProcessInstanceParamDto; -import com.pig4cloud.pigx.flow.task.dto.TaskQueryParamDto; -import com.pig4cloud.pigx.flow.task.service.IProcessInstanceService; -import com.pig4cloud.pigx.flow.task.vo.NodeFormatParamVo; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import org.springframework.web.bind.annotation.*; - -/** - * 流程实例 - */ -@RestController -@RequiredArgsConstructor -@RequestMapping("/process-instance") -public class ProcessInstanceController { - - private final IProcessInstanceService processInstanceService; - - /** - * 启动流程 - * @param processInstanceParamDto - * @return - */ - @SneakyThrows - @PostMapping("startProcessInstance") - public R startProcessInstance(@RequestBody ProcessInstanceParamDto processInstanceParamDto) { - return processInstanceService.startProcessInstance(processInstanceParamDto); - } - - /** - * 查询我的任务 - * - * @param queryParamDto Query param DTO - * @return {@link R } - */ - @SneakyThrows - @PostMapping("queryMineTask") - public R queryMineTask(@RequestBody TaskQueryParamDto queryParamDto) { - return processInstanceService.queryMineTask(queryParamDto); - } - - /** - * 查询当前登录用户已办任务 - * @param taskQueryParamDto - * @return - */ - @SneakyThrows - @PostMapping("queryMineEndTask") - public R queryMineEndTask(@RequestBody TaskQueryParamDto taskQueryParamDto) { - return processInstanceService.queryMineEndTask(taskQueryParamDto); - } - - /** - * 查询我已启动 - * - * @param taskQueryParamDto task query param dto - * @return {@link R } - */ - @SneakyThrows - @PostMapping("queryMineStarted") - public R queryMineStarted(@RequestBody TaskQueryParamDto taskQueryParamDto) { - return processInstanceService.queryMineStarted(taskQueryParamDto); - } - - /** - * 查询我 CC - * - * @param taskQueryParamDto task query param dto - * @return {@link R } - */ - @SneakyThrows - @PostMapping("queryMineCC") - public R queryMineCC(@RequestBody TaskQueryParamDto taskQueryParamDto) { - return processInstanceService.queryMineCC(taskQueryParamDto); - } - - /** - * 格式化流程显示 - * @param nodeFormatParamVo - * @return - */ - @PostMapping("formatStartNodeShow") - public R formatStartNodeShow(@RequestBody NodeFormatParamVo nodeFormatParamVo) { - return processInstanceService.formatStartNodeShow(nodeFormatParamVo); - } - - /** - * 流程详情 - * @param processInstanceId - * @return - */ - @GetMapping("detail") - public R detail(String processInstanceId) { - return processInstanceService.detail(processInstanceId); - } - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/ProcessNodeDataController.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/ProcessNodeDataController.java deleted file mode 100644 index 2a5d6dce9..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/ProcessNodeDataController.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.pig4cloud.pigx.flow.task.controller; - -import com.pig4cloud.pigx.common.core.util.R; -import com.pig4cloud.pigx.flow.task.dto.Node; -import com.pig4cloud.pigx.flow.task.dto.ProcessNodeDataDto; -import com.pig4cloud.pigx.flow.task.service.IProcessNodeDataService; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -/** - *

- * 流程节点数据 前端控制器 - *

- * - * @author Vincent - * @since 2023-05-07 - */ -@RestController -@RequiredArgsConstructor -@RequestMapping("/processNodeData") -public class ProcessNodeDataController { - - private final IProcessNodeDataService processNodeDataService; - - /** - * 保存节点数据 - * @param processNodeDataDto - * @return - */ - @PostMapping("saveNodeData") - public R saveNodeData(@RequestBody ProcessNodeDataDto processNodeDataDto) { - return processNodeDataService.saveNodeData(processNodeDataDto); - } - - /** - * 获取节点数据 - * @param flowId - * @param nodeId - * @return - */ - @GetMapping("getNodeData") - public R getNodeData(String flowId, String nodeId) { - return processNodeDataService.getNodeData(flowId, nodeId); - } - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/RemoteController.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/RemoteController.java deleted file mode 100644 index 0e898d752..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/RemoteController.java +++ /dev/null @@ -1,152 +0,0 @@ -package com.pig4cloud.pigx.flow.task.controller; - -import com.pig4cloud.pigx.common.core.util.R; -import com.pig4cloud.pigx.flow.task.dto.*; -import com.pig4cloud.pigx.flow.task.service.IRemoteService; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -import java.util.List; -import java.util.Map; - -/** - * 远程请求控制器 - */ -@RestController -@RequiredArgsConstructor -@RequestMapping("/remote") -public class RemoteController { - - private final IRemoteService remoteService; - - /** - * 根据角色id集合查询用户id集合 - * @param roleIdList - * @return - */ - @PostMapping("queryUserIdListByRoleIdList") - public R> queryUserIdListByRoleIdList(@RequestBody List roleIdList) { - return remoteService.queryUserIdListByRoleIdList(roleIdList); - } - - /** - * 保存抄送 - * @param copyDto - * @return - */ - @PostMapping("savecc") - public R saveCC(@RequestBody ProcessCopyDto copyDto) { - return remoteService.saveCC(copyDto); - } - - /** - * 检查是否是所有的父级 - * @param checkParentDto - * @return - */ - @PostMapping("checkIsAllParent") - public R checkIsAllParent(@RequestBody CheckParentDto checkParentDto) { - return remoteService.checkIsAllParent(checkParentDto); - } - - /** - * 根据部门id集合查询用户id集合 - * @param depIdList - * @return - */ - @PostMapping("queryUserIdListByDepIdList") - public R> queryUserIdListByDepIdList(@RequestBody List depIdList) { - return remoteService.queryUserIdListByDepIdList(depIdList); - } - - /** - * 检查是否是所有的子级 - * @param checkChildDto - * @return - */ - @PostMapping("checkIsAllChild") - public R checkIsAllChild(@RequestBody CheckChildDto checkChildDto) { - return remoteService.checkIsAllChild(checkChildDto); - } - - /** - * 获取用户的信息-包括扩展字段 - * @param userId - * @return - */ - @GetMapping("queryUserAllInfo") - public R> queryUserAllInfo(long userId) { - return remoteService.queryUserAllInfo(userId); - } - - /** - * 开始节点事件 - * @param recordParamDto - * @return - */ - @PostMapping("startNodeEvent") - public R startNodeEvent(@RequestBody ProcessNodeRecordParamDto recordParamDto) { - return remoteService.startNodeEvent(recordParamDto); - } - - /** - * 流程创建了 - * @param processInstanceRecordParamDto - * @return - */ - @PostMapping("createProcessEvent") - public R createProcessEvent(@RequestBody ProcessInstanceRecordParamDto processInstanceRecordParamDto) { - return remoteService.createProcessEvent(processInstanceRecordParamDto); - } - - /** - * 结束节点事件 - * @param recordParamDto - * @return - */ - @PostMapping("endNodeEvent") - public R endNodeEvent(@RequestBody ProcessNodeRecordParamDto recordParamDto) { - return remoteService.endNodeEvent(recordParamDto); - } - - /** - * 开始设置执行人 - * @param processNodeRecordAssignUserParamDto - * @return - */ - @PostMapping("startAssignUser") - public R startAssignUser(@RequestBody ProcessNodeRecordAssignUserParamDto processNodeRecordAssignUserParamDto) { - return remoteService.startAssignUser(processNodeRecordAssignUserParamDto); - } - - /** - * 任务结束事件 - * @param processNodeRecordAssignUserParamDto - * @return - */ - @PostMapping("taskEndEvent") - public R taskEndEvent(@RequestBody ProcessNodeRecordAssignUserParamDto processNodeRecordAssignUserParamDto) { - return remoteService.taskEndEvent(processNodeRecordAssignUserParamDto); - } - - /** - * 实例结束 - * @param processInstanceParamDto - * @return - */ - @PostMapping("endProcess") - public R endProcess(@RequestBody ProcessInstanceParamDto processInstanceParamDto) { - return remoteService.endProcess(processInstanceParamDto); - } - - /** - * 查询流程管理员 - * @param flowId - * @return - */ - @GetMapping("queryProcessAdmin") - public R queryProcessAdmin(String flowId) { - return remoteService.queryProcessAdmin(flowId); - } - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/TaskController.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/TaskController.java deleted file mode 100644 index 665743f92..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/TaskController.java +++ /dev/null @@ -1,118 +0,0 @@ -package com.pig4cloud.pigx.flow.task.controller; - -import com.pig4cloud.pigx.common.core.util.R; -import com.pig4cloud.pigx.flow.task.dto.TaskParamDto; -import com.pig4cloud.pigx.flow.task.service.ITaskService; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import org.springframework.web.bind.annotation.*; - -/** - * 任务实例 - */ -@RestController -@RequiredArgsConstructor -@RequestMapping("/task") -public class TaskController { - - private final ITaskService taskService; - - /** - * 查询首页数据看板 - * @return - */ - @SneakyThrows - @GetMapping("queryTaskData") - public R queryTaskData() { - return taskService.queryTaskData(); - } - - /** - * 查询任务 - * @param taskId - * @return - */ - @SneakyThrows - @GetMapping("queryTask") - public R queryTask(String taskId, boolean view) { - - return taskService.queryTask(taskId, view); - - } - - /** - * 完成任务 - * @param completeParamDto - * @return - */ - @SneakyThrows - @PostMapping("completeTask") - public R completeTask(@RequestBody TaskParamDto completeParamDto) { - - return taskService.completeTask(completeParamDto); - - } - - /** - * 前加签 - * @param completeParamDto - * @return - */ - @SneakyThrows - @PostMapping("delegateTask") - public R delegateTask(@RequestBody TaskParamDto completeParamDto) { - - return taskService.delegateTask(completeParamDto); - - } - - /** - * 加签完成任务 - * @param completeParamDto - * @return - */ - @SneakyThrows - @PostMapping("resolveTask") - public R resolveTask(@RequestBody TaskParamDto completeParamDto) { - - return taskService.resolveTask(completeParamDto); - - } - - /** - * 设置执行人 - * @param completeParamDto - * @return - */ - @SneakyThrows - @PostMapping("setAssignee") - public R setAssignee(@RequestBody TaskParamDto completeParamDto) { - - return taskService.setAssignee(completeParamDto); - - } - - /** - * 结束流程 - * @param completeParamDto - * @return - */ - @SneakyThrows - @PostMapping("stopProcessInstance") - public R stopProcessInstance(@RequestBody TaskParamDto completeParamDto) { - - return taskService.stopProcessInstance(completeParamDto); - - } - - /** - * 退回 - * @param taskParamDto - * @return - */ - @PostMapping("back") - public R back(@RequestBody TaskParamDto taskParamDto) { - return taskService.back(taskParamDto); - } - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/mapper/ProcessCopyMapper.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/mapper/ProcessCopyMapper.java deleted file mode 100644 index db6b2d223..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/mapper/ProcessCopyMapper.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.pig4cloud.pigx.flow.task.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.pig4cloud.pigx.flow.task.entity.ProcessCopy; -import org.apache.ibatis.annotations.Mapper; - -/** - *

- * 流程抄送数据 Mapper 接口 - *

- * - * @author Vincent - * @since 2023-05-20 - */ -@Mapper -public interface ProcessCopyMapper extends BaseMapper { - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/mapper/ProcessGroupMapper.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/mapper/ProcessGroupMapper.java deleted file mode 100644 index 3b949c0e5..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/mapper/ProcessGroupMapper.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.pig4cloud.pigx.flow.task.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.pig4cloud.pigx.flow.task.entity.ProcessGroup; -import org.apache.ibatis.annotations.Mapper; - -/** - *

- * Mapper 接口 - *

- * - * @author Vincent - * @since 2023-05-25 - */ -@Mapper -public interface ProcessGroupMapper extends BaseMapper { - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/mapper/ProcessInstanceRecordMapper.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/mapper/ProcessInstanceRecordMapper.java deleted file mode 100644 index b54d1fece..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/mapper/ProcessInstanceRecordMapper.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.pig4cloud.pigx.flow.task.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.pig4cloud.pigx.flow.task.entity.ProcessInstanceRecord; -import org.apache.ibatis.annotations.Mapper; - -/** - *

- * 流程记录 Mapper 接口 - *

- * - * @author Vincent - * @since 2023-05-07 - */ -@Mapper -public interface ProcessInstanceRecordMapper extends BaseMapper { - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/mapper/ProcessMapper.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/mapper/ProcessMapper.java deleted file mode 100644 index b469ce726..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/mapper/ProcessMapper.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.pig4cloud.pigx.flow.task.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.pig4cloud.pigx.flow.task.entity.Process; -import org.apache.ibatis.annotations.Mapper; - -/** - *

- * Mapper 接口 - *

- * - * @author cxygzl - * @since 2023-05-25 - */ -@Mapper -public interface ProcessMapper extends BaseMapper { - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/mapper/ProcessNodeDataMapper.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/mapper/ProcessNodeDataMapper.java deleted file mode 100644 index 817977561..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/mapper/ProcessNodeDataMapper.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.pig4cloud.pigx.flow.task.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.pig4cloud.pigx.flow.task.entity.ProcessNodeData; -import org.apache.ibatis.annotations.Mapper; - -/** - *

- * 流程节点数据 Mapper 接口 - *

- * - * @author Vincent - * @since 2023-05-07 - */ -@Mapper -public interface ProcessNodeDataMapper extends BaseMapper { - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/mapper/ProcessNodeRecordAssignUserMapper.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/mapper/ProcessNodeRecordAssignUserMapper.java deleted file mode 100644 index 73cfbf26d..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/mapper/ProcessNodeRecordAssignUserMapper.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.pig4cloud.pigx.flow.task.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.pig4cloud.pigx.flow.task.entity.ProcessNodeRecordAssignUser; -import org.apache.ibatis.annotations.Mapper; - -/** - *

- * 流程节点记录-执行人 Mapper 接口 - *

- * - * @author cxygzl - * @since 2023-05-10 - */ -@Mapper -public interface ProcessNodeRecordAssignUserMapper extends BaseMapper { - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/mapper/ProcessNodeRecordMapper.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/mapper/ProcessNodeRecordMapper.java deleted file mode 100644 index 35acc48ff..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/mapper/ProcessNodeRecordMapper.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.pig4cloud.pigx.flow.task.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.pig4cloud.pigx.flow.task.entity.ProcessNodeRecord; -import org.apache.ibatis.annotations.Mapper; - -/** - *

- * 流程节点记录 Mapper 接口 - *

- * - * @author cxygzl - * @since 2023-05-10 - */ -@Mapper -public interface ProcessNodeRecordMapper extends BaseMapper { - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/mapper/ProcessStarterMapper.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/mapper/ProcessStarterMapper.java deleted file mode 100644 index 005e208a9..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/mapper/ProcessStarterMapper.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.pig4cloud.pigx.flow.task.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.pig4cloud.pigx.flow.task.entity.ProcessStarter; -import org.apache.ibatis.annotations.Mapper; - -/** - *

- * 流程发起人 Mapper 接口 - *

- * - * @author Vincent - * @since 2023-05-30 - */ -@Mapper -public interface ProcessStarterMapper extends BaseMapper { - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/ICombinationGroupService.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/ICombinationGroupService.java deleted file mode 100644 index 41155c026..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/ICombinationGroupService.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.pig4cloud.pigx.flow.task.service; - -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.pig4cloud.pigx.common.core.util.R; - -/** - * 聚合接口 - */ -public interface ICombinationGroupService { - - /** - * 查询表单组包含流程 - * @param groupId 表单ID - * @return 表单组数据 - */ - R listGroupWithProcess(Page page, Long groupId); - - /** - * 查询所有我可以发起的表单组 - * @return - */ - R listCurrentUserStartGroup(); - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessCopyService.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessCopyService.java deleted file mode 100644 index ac181cb80..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessCopyService.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.pig4cloud.pigx.flow.task.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.pig4cloud.pigx.common.core.util.R; -import com.pig4cloud.pigx.flow.task.entity.ProcessCopy; - -/** - *

- * 流程抄送数据 服务类 - *

- * - * @author Vincent - * @since 2023-05-20 - */ -public interface IProcessCopyService extends IService { - - /** - * 查询单个抄送详细信息 - * @param id - * @return - */ - R querySingleDetail(long id); - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessGroupService.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessGroupService.java deleted file mode 100644 index 1737f2a50..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessGroupService.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.pig4cloud.pigx.flow.task.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.pig4cloud.pigx.common.core.util.R; -import com.pig4cloud.pigx.flow.task.entity.ProcessGroup; - -import java.util.List; - -/** - *

- * 服务类 - *

- * - * @author Vincent - * @since 2023-05-25 - */ -public interface IProcessGroupService extends IService { - - /** - * 组列表 - * @return - */ - R> queryList(); - - /** - * 新增流程分组 - * @param processGroup 分组名 - * @return 添加结果 - */ - R create(ProcessGroup processGroup); - - /** - * 删除分组 - * @param id - * @return - */ - R delete(long id); - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessInstanceRecordService.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessInstanceRecordService.java deleted file mode 100644 index 8e08978d8..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessInstanceRecordService.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.pig4cloud.pigx.flow.task.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.pig4cloud.pigx.flow.task.entity.ProcessInstanceRecord; - -/** - *

- * 流程记录 服务类 - *

- * - * @author Vincent - * @since 2023-05-07 - */ -public interface IProcessInstanceRecordService extends IService { - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessInstanceService.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessInstanceService.java deleted file mode 100644 index 5481e5705..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessInstanceService.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.pig4cloud.pigx.flow.task.service; - -import com.pig4cloud.pigx.common.core.util.R; -import com.pig4cloud.pigx.flow.task.dto.ProcessInstanceParamDto; -import com.pig4cloud.pigx.flow.task.dto.TaskQueryParamDto; -import com.pig4cloud.pigx.flow.task.vo.NodeFormatParamVo; - -/** - * 流程实例进程 - */ -public interface IProcessInstanceService { - - /** - * 启动流程 - * @param processInstanceParamDto - * @return - */ - R startProcessInstance(ProcessInstanceParamDto processInstanceParamDto); - - /** - * 查询当前登录用户的待办任务 - * @param taskQueryParamDto taskQueryParamDto - * @return - */ - R queryMineTask(TaskQueryParamDto taskQueryParamDto); - - /** - * 查询已办任务 - * @param taskQueryParamDto - * @return - */ - R queryMineEndTask(TaskQueryParamDto taskQueryParamDto); - - /** - * 结束流程实例 - * - * @param processInstanceParamDto 包含流程实例ID的参数对象 - * @return 返回结果,具体类型未定义 - */ - R end(ProcessInstanceParamDto processInstanceParamDto); - - /** - * 查询我发起的 - * @param taskQueryParamDto - * @return - */ - R queryMineStarted(TaskQueryParamDto taskQueryParamDto); - - /** - * 查询抄送给我的 - * @param taskQueryParamDto - * @return - */ - R queryMineCC(TaskQueryParamDto taskQueryParamDto); - - /** - * 格式化流程显示 - * @param nodeFormatParamVo - * @return - */ - R formatStartNodeShow(NodeFormatParamVo nodeFormatParamVo); - - /** - * 流程详情 - * @param processInstanceId - * @return - */ - R detail(String processInstanceId); - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessNodeDataService.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessNodeDataService.java deleted file mode 100644 index 76d1d62d8..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessNodeDataService.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.pig4cloud.pigx.flow.task.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.pig4cloud.pigx.common.core.util.R; -import com.pig4cloud.pigx.flow.task.dto.Node; -import com.pig4cloud.pigx.flow.task.dto.ProcessNodeDataDto; -import com.pig4cloud.pigx.flow.task.entity.ProcessNodeData; - -/** - *

- * 流程节点数据 服务类 - *

- * - * @author Vincent - * @since 2023-05-07 - */ -public interface IProcessNodeDataService extends IService { - - /** - * 保存流程节点数据 - * @param processNodeDataDto - * @return - */ - R saveNodeData(ProcessNodeDataDto processNodeDataDto); - - /*** - * 获取节点数据 - * @param flowId - * @param nodeId - * @return - */ - R getNodeData(String flowId, String nodeId); - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessNodeRecordAssignUserService.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessNodeRecordAssignUserService.java deleted file mode 100644 index eb718587e..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessNodeRecordAssignUserService.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.pig4cloud.pigx.flow.task.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.pig4cloud.pigx.common.core.util.R; -import com.pig4cloud.pigx.flow.task.dto.ProcessNodeRecordAssignUserParamDto; -import com.pig4cloud.pigx.flow.task.entity.ProcessNodeRecordAssignUser; - -/** - *

- * 流程节点记录-执行人 服务类 - *

- * - * @author cxygzl - * @since 2023-05-10 - */ -public interface IProcessNodeRecordAssignUserService extends IService { - - /** - * 设置执行人 - * @param processNodeRecordAssignUserParamDto - * @return - */ - R addAssignUser(ProcessNodeRecordAssignUserParamDto processNodeRecordAssignUserParamDto); - - /** - * 任务完成通知 - * @param processNodeRecordAssignUserParamDto - * @return - */ - R completeTaskEvent(ProcessNodeRecordAssignUserParamDto processNodeRecordAssignUserParamDto); - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessNodeRecordService.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessNodeRecordService.java deleted file mode 100644 index e27652fb9..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessNodeRecordService.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.pig4cloud.pigx.flow.task.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.pig4cloud.pigx.common.core.util.R; -import com.pig4cloud.pigx.flow.task.dto.ProcessNodeRecordParamDto; -import com.pig4cloud.pigx.flow.task.entity.ProcessNodeRecord; - -/** - *

- * 流程节点记录 服务类 - *

- * - * @author cxygzl - * @since 2023-05-10 - */ -public interface IProcessNodeRecordService extends IService { - - /** - * 节点开始 - * @param processNodeRecordParamDto - * @return - */ - R start(ProcessNodeRecordParamDto processNodeRecordParamDto); - - /** - * 节点结束 - * @param processNodeRecordParamDto - * @return - */ - R complete(ProcessNodeRecordParamDto processNodeRecordParamDto); - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessService.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessService.java deleted file mode 100644 index aa828dfae..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessService.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.pig4cloud.pigx.flow.task.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.pig4cloud.pigx.common.core.util.R; -import com.pig4cloud.pigx.flow.task.entity.Process; -import com.pig4cloud.pigx.flow.task.vo.ProcessVO; - -/** - *

- * 服务类 - *

- * - * @author cxygzl - * @since 2023-05-25 - */ -public interface IProcessService extends IService { - - /** - * 获取详细数据 - * @param flowId - * @return - */ - R getDetail(String flowId); - - Process getByFlowId(String flowId); - - void updateByFlowId(Process process); - - void hide(String flowId); - - /** - * 创建流程 - * @param process - * @return - */ - R create(Process process); - - /** - * 编辑表单 - * @param flowId 摸板ID - * @param type 类型 stop using delete - * @return 操作结果 - */ - R update(String flowId, String type, Long groupId); - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessStarterService.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessStarterService.java deleted file mode 100644 index 45f021b24..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessStarterService.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.pig4cloud.pigx.flow.task.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.pig4cloud.pigx.flow.task.entity.ProcessStarter; - -/** - *

- * 流程发起人 服务类 - *

- * - * @author Vincent - * @since 2023-05-30 - */ -public interface IProcessStarterService extends IService { - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IRemoteService.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IRemoteService.java deleted file mode 100644 index 3edf3a0db..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IRemoteService.java +++ /dev/null @@ -1,107 +0,0 @@ - -package com.pig4cloud.pigx.flow.task.service; - -import com.pig4cloud.pigx.common.core.util.R; -import com.pig4cloud.pigx.flow.task.dto.*; - -import java.util.List; -import java.util.Map; - -/** - * 远程调用的接口 - */ -public interface IRemoteService { - - /** - * 根据角色id集合查询用户id集合 - * @param roleIdList - * @return - */ - R> queryUserIdListByRoleIdList(List roleIdList); - - /** - * 保存抄送 - * @param copyDto - * @return - */ - R saveCC(ProcessCopyDto copyDto); - - /** - * 检查是否是所有的父级 - * @param checkParentDto - * @return - */ - R checkIsAllParent(CheckParentDto checkParentDto); - - /** - * 根据部门id集合查询用户id集合 - * @param depIdList - * @return - */ - R> queryUserIdListByDepIdList(List depIdList); - - /** - * 检查是否是所有的子级 - * @param checkChildDto - * @return - */ - R checkIsAllChild(CheckChildDto checkChildDto); - - /** - * 获取用户的信息-包括扩展字段 - * @param userId - * @return - */ - R> queryUserAllInfo(long userId); - - /** - * 开始节点事件 - * @param recordParamDto - * @return - */ - R startNodeEvent(ProcessNodeRecordParamDto recordParamDto); - - /** - * 流程创建了 - * @param processInstanceRecordParamDto - * @return - */ - R createProcessEvent(ProcessInstanceRecordParamDto processInstanceRecordParamDto); - - /** - * 完成节点事件 - * @param recordParamDto - * @return - */ - R endNodeEvent(ProcessNodeRecordParamDto recordParamDto); - - /** - * 开始设置执行人 - * @param processNodeRecordAssignUserParamDto - * @return - */ - R startAssignUser(ProcessNodeRecordAssignUserParamDto processNodeRecordAssignUserParamDto); - - /** - * 任务结束事件 - * @param processNodeRecordAssignUserParamDto - * @return - */ - R taskEndEvent(ProcessNodeRecordAssignUserParamDto processNodeRecordAssignUserParamDto); - - /** - * 结束流程实例的方法 - * - * @param processInstanceParamDto 包含流程实例参数的数据传输对象 - * @return 返回流程实例结束的结果,具体返回类型未指定 - */ - R endProcess(ProcessInstanceParamDto processInstanceParamDto); - - /** - * 查询流程管理员 - * @param flowId - * @return - */ - R queryProcessAdmin(String flowId); - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/ITaskService.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/ITaskService.java deleted file mode 100644 index 16529694d..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/ITaskService.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.pig4cloud.pigx.flow.task.service; - -import com.pig4cloud.pigx.common.core.util.R; -import com.pig4cloud.pigx.flow.task.dto.TaskParamDto; - -/** - * 任务处理 - */ -public interface ITaskService { - - /** - * 查询任务 - * - * @param taskId 任务ID - * @param view 是否查看 - * @return 查询结果 - */ - R queryTask(String taskId, boolean view); - - /** - * 完成任务 - * - * @param taskParamDto 任务参数DTO - * @return 任务执行结果 - */ - R completeTask(TaskParamDto taskParamDto); - - /** - * 委托任务(前加签) - * - * @param taskParamDto 任务参数DTO - * @return 委托任务结果 - */ - R delegateTask(TaskParamDto taskParamDto); - - /** - * 加签完成任务 - * - * @param taskParamDto 任务参数DTO - * @return 任务处理结果 - */ - R resolveTask(TaskParamDto taskParamDto); - - /** - * 设置任务执行人 - * - * @param taskParamDto 任务参数DTO - * @return 操作结果 - */ - R setAssignee(TaskParamDto taskParamDto); - - /** - * 结束流程实例 - * - * @param taskParamDto 任务参数DTO - * @return 操作结果 - */ - R stopProcessInstance(TaskParamDto taskParamDto); - - /** - * 退回任务 - * - * @param taskParamDto 任务参数DTO - * @return 操作结果 - */ - R back(TaskParamDto taskParamDto); - - /** - * 查询首页数据看板 - * - * @return 任务数据结果 - */ - R queryTaskData(); - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/CombinationGroupServiceImpl.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/CombinationGroupServiceImpl.java deleted file mode 100644 index 14965392a..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/CombinationGroupServiceImpl.java +++ /dev/null @@ -1,134 +0,0 @@ -package com.pig4cloud.pigx.flow.task.service.impl; - -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.pig4cloud.pigx.common.core.constant.enums.YesNoEnum; -import com.pig4cloud.pigx.common.core.util.R; -import com.pig4cloud.pigx.common.security.service.PigxUser; -import com.pig4cloud.pigx.common.security.util.SecurityUtils; -import com.pig4cloud.pigx.flow.task.constant.NodeUserTypeEnum; -import com.pig4cloud.pigx.flow.task.entity.Process; -import com.pig4cloud.pigx.flow.task.entity.ProcessGroup; -import com.pig4cloud.pigx.flow.task.entity.ProcessStarter; -import com.pig4cloud.pigx.flow.task.service.ICombinationGroupService; -import com.pig4cloud.pigx.flow.task.service.IProcessGroupService; -import com.pig4cloud.pigx.flow.task.service.IProcessService; -import com.pig4cloud.pigx.flow.task.service.IProcessStarterService; -import com.pig4cloud.pigx.flow.task.vo.FormGroupVo; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@Slf4j -@RequiredArgsConstructor -public class CombinationGroupServiceImpl implements ICombinationGroupService { - - private final IProcessGroupService processGroupService; - - private final IProcessService processService; - - private final IProcessStarterService processStarterService; - - /** - * 查询表单组包含流程 - * @param groupId groupId - * @return 表单组数据 - */ - @Override - public R listGroupWithProcess(Page page, Long groupId) { - return R.ok(processService.lambdaQuery() - .eq(Process::getGroupId, groupId) - .eq(Process::getHidden, false) - .orderByAsc(Process::getSort) - .orderByDesc(Process::getCreateTime) - .page(page)); - } - - /** - * 查询所有我可以发起的表单组 - * @return - */ - @Override - public R listCurrentUserStartGroup() { - PigxUser user = SecurityUtils.getUser(); - - List formGroupVos = new LinkedList<>(); - - List processGroupList = processGroupService.lambdaQuery() - .orderByAsc(ProcessGroup::getSort) - .list(); - - processGroupList.forEach(group -> { - FormGroupVo formGroupVo = FormGroupVo.builder() - .id(group.getId()) - .name(group.getGroupName()) - .items(new LinkedList<>()) - .build(); - formGroupVos.add(formGroupVo); - - List processList = processService.lambdaQuery() - .eq(Process::getGroupId, group.getId()) - .eq(Process::getHidden, YesNoEnum.NO.getCode()) - .eq(Process::getStop, YesNoEnum.NO.getCode()) - .orderByAsc(Process::getSort) - .list(); - - Map existMap = new HashMap<>(); - - if (!processList.isEmpty()) { - List idList = processList.stream().map(Process::getId).toList(); - // 查询发起人集合 - List processStarterList = processStarterService.lambdaQuery() - .in(ProcessStarter::getProcessId, idList) - .list(); - Map> groupmap = processStarterList.stream() - .collect(Collectors.groupingBy(ProcessStarter::getProcessId)); - - for (Process process : processList) { - List processStarters = groupmap.get(process.getId()); - if (processStarters == null) { - existMap.put(process.getId(), true); - continue; - } - boolean match = processStarters.stream() - .anyMatch(w -> w.getTypeId().longValue() == user.getId() - && w.getType().equals(NodeUserTypeEnum.USER.getKey())); - if (match) { - existMap.put(process.getId(), true); - continue; - } - Set deptIdSet = processStarters.stream() - .filter(w -> w.getType().equals(NodeUserTypeEnum.DEPT.getKey())) - .map(w -> w.getTypeId()) - .collect(Collectors.toSet()); - - existMap.put(process.getId(), deptIdSet.contains(user.getDeptId())); - - } - - } - - processList.forEach(process -> { - - if (!existMap.get(process.getId())) { - return; - } - - formGroupVo.getItems() - .add(FormGroupVo.FlowVo.builder() - .flowId(process.getFlowId()) - .name(process.getName()) - .logo(process.getLogo()) - .remark(process.getRemark()) - .stop(process.getStop()) - .updated(process.getUpdateTime()) - .build()); - }); - }); - return R.ok(formGroupVos); - } - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessCopyServiceImpl.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessCopyServiceImpl.java deleted file mode 100644 index 1b62e3f11..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessCopyServiceImpl.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.pig4cloud.pigx.flow.task.service.impl; - -import cn.hutool.core.lang.Dict; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.pig4cloud.pigx.common.core.util.R; -import com.pig4cloud.pigx.flow.task.dto.Node; -import com.pig4cloud.pigx.flow.task.entity.Process; -import com.pig4cloud.pigx.flow.task.entity.ProcessCopy; -import com.pig4cloud.pigx.flow.task.mapper.ProcessCopyMapper; -import com.pig4cloud.pigx.flow.task.service.IProcessCopyService; -import com.pig4cloud.pigx.flow.task.service.IProcessNodeDataService; -import com.pig4cloud.pigx.flow.task.service.IProcessService; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import org.springframework.stereotype.Service; - -import java.util.Map; - -/** - *

- * 流程抄送数据 服务实现类 - *

- * - * @author Vincent - * @since 2023-05-20 - */ -@Service -@RequiredArgsConstructor -public class ProcessCopyServiceImpl extends ServiceImpl implements IProcessCopyService { - - private final ObjectMapper objectMapper; - - private final IProcessService processService; - - private final IProcessNodeDataService nodeDataService; - - /** - * 查询单个抄送详细信息 - * @param id - * @return - */ - @SneakyThrows - @Override - public R querySingleDetail(long id) { - ProcessCopy processCopy = this.getById(id); - String flowId = processCopy.getFlowId(); - Process oaForms = processService.getByFlowId(flowId); - if (oaForms == null) { - return R.failed("流程不存在"); - } - String formData = processCopy.getFormData(); - String nodeId = processCopy.getNodeId(); - - Node node = nodeDataService.getNodeData(flowId, nodeId).getData(); - Map formPerms = node.getFormPerms(); - - Dict set = Dict.create() - .set("process", oaForms.getProcess()) - .set("formItems", oaForms.getFormItems()) - .set("formData", formData) - .set("formPerms", formPerms); - return R.ok(set); - } - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessGroupServiceImpl.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessGroupServiceImpl.java deleted file mode 100644 index b8e48d8de..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessGroupServiceImpl.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.pig4cloud.pigx.flow.task.service.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.pig4cloud.pigx.common.core.util.R; -import com.pig4cloud.pigx.flow.task.entity.ProcessGroup; -import com.pig4cloud.pigx.flow.task.mapper.ProcessGroupMapper; -import com.pig4cloud.pigx.flow.task.service.IProcessGroupService; -import org.springframework.stereotype.Service; - -import java.util.List; - -/** - *

- * 服务实现类 - *

- * - * @author Vincent - * @since 2023-05-25 - */ -@Service -public class ProcessGroupServiceImpl extends ServiceImpl - implements IProcessGroupService { - - /** - * 组列表 - * @return - */ - @Override - public R> queryList() { - List processGroupList = this.lambdaQuery().orderByAsc(ProcessGroup::getSort).list(); - - return R.ok(processGroupList); - } - - /** - * 新增表单分组 - * @param processGroup 分组名 - * @return 添加结果 - */ - @Override - public R create(ProcessGroup processGroup) { - ProcessGroup pg = new ProcessGroup(); - pg.setSort(0); - pg.setGroupName(processGroup.getGroupName()); - - this.save(pg); - return R.ok(); - } - - /** - * 删除分组 - * @param id - * @return - */ - @Override - public R delete(long id) { - this.removeById(id); - return R.ok(); - } - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessInstanceRecordServiceImpl.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessInstanceRecordServiceImpl.java deleted file mode 100644 index 9cc962709..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessInstanceRecordServiceImpl.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.pig4cloud.pigx.flow.task.service.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.pig4cloud.pigx.flow.task.entity.ProcessInstanceRecord; -import com.pig4cloud.pigx.flow.task.mapper.ProcessInstanceRecordMapper; -import com.pig4cloud.pigx.flow.task.service.IProcessInstanceRecordService; -import org.springframework.stereotype.Service; - -/** - *

- * 流程记录 服务实现类 - *

- * - * @author Vincent - * @since 2023-05-07 - */ -@Service -public class ProcessInstanceRecordServiceImpl extends ServiceImpl - implements IProcessInstanceRecordService { - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessNodeDataServiceImpl.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessNodeDataServiceImpl.java deleted file mode 100644 index 8691e7b0b..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessNodeDataServiceImpl.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.pig4cloud.pigx.flow.task.service.impl; - -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.json.JSONUtil; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.pig4cloud.pigx.common.core.util.R; -import com.pig4cloud.pigx.flow.task.dto.Node; -import com.pig4cloud.pigx.flow.task.dto.ProcessNodeDataDto; -import com.pig4cloud.pigx.flow.task.entity.ProcessNodeData; -import com.pig4cloud.pigx.flow.task.mapper.ProcessNodeDataMapper; -import com.pig4cloud.pigx.flow.task.service.IProcessNodeDataService; -import org.springframework.stereotype.Service; - -import java.util.Optional; - -/** - *

- * 流程节点数据 服务实现类 - *

- * - * @author Vincent - * @since 2023-05-07 - */ -@Service -public class ProcessNodeDataServiceImpl extends ServiceImpl - implements IProcessNodeDataService { - - /** - * 保存流程节点数据。 - * @param processNodeDataDto 流程节点数据DTO - * @return 保存结果 - */ - @Override - public R saveNodeData(ProcessNodeDataDto processNodeDataDto) { - ProcessNodeData processNodeData = BeanUtil.copyProperties(processNodeDataDto, ProcessNodeData.class); - this.save(processNodeData); - return R.ok(); - } - - /** - * 获取节点数据。 - * @param flowId 流程ID - * @param nodeId 节点ID - * @return 节点数据 - */ - @Override - public R getNodeData(String flowId, String nodeId) { - Optional processNodeDataOptional = this.lambdaQuery() - .eq(ProcessNodeData::getFlowId, flowId) - .eq(ProcessNodeData::getNodeId, nodeId) - .oneOpt(); - - Node node = processNodeDataOptional - .map(processNodeData -> JSONUtil.toBean(processNodeData.getData(), Node.class)) - .orElse(null); - - return R.ok(node); - } - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessNodeRecordServiceImpl.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessNodeRecordServiceImpl.java deleted file mode 100644 index 827d47507..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessNodeRecordServiceImpl.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.pig4cloud.pigx.flow.task.service.impl; - -import cn.hutool.core.bean.BeanUtil; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.pig4cloud.pigx.common.core.util.R; -import com.pig4cloud.pigx.flow.task.constant.NodeStatusEnum; -import com.pig4cloud.pigx.flow.task.dto.ProcessNodeRecordParamDto; -import com.pig4cloud.pigx.flow.task.entity.ProcessNodeRecord; -import com.pig4cloud.pigx.flow.task.mapper.ProcessNodeRecordMapper; -import com.pig4cloud.pigx.flow.task.service.IProcessNodeRecordService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.Date; - -/** - *

- * 流程节点记录 服务实现类 - *

- * - * @author cxygzl - * @since 2023-05-10 - */ -@Slf4j -@Service -public class ProcessNodeRecordServiceImpl extends ServiceImpl - implements IProcessNodeRecordService { - - /** - * 节点开始 - * @param processNodeRecordParamDto - * @return - */ - @Override - public R start(ProcessNodeRecordParamDto processNodeRecordParamDto) { - - ProcessNodeRecord processNodeRecord = BeanUtil.copyProperties(processNodeRecordParamDto, - ProcessNodeRecord.class); - processNodeRecord.setStartTime(new Date()); - processNodeRecord.setStatus(NodeStatusEnum.JXZ.getCode()); - - this.save(processNodeRecord); - return R.ok(); - } - - /** - * 节点结束 - * @param processNodeRecordParamDto - * @return - */ - @Override - public R complete(ProcessNodeRecordParamDto processNodeRecordParamDto) { - - log.info("节点结束---{}", processNodeRecordParamDto); - - // TODO 完成节点和完成任务要区分下 - this.lambdaUpdate() - .set(ProcessNodeRecord::getStatus, NodeStatusEnum.YJS.getCode()) - .set(ProcessNodeRecord::getEndTime, new Date()) - .eq(ProcessNodeRecord::getProcessInstanceId, processNodeRecordParamDto.getProcessInstanceId()) - .eq(ProcessNodeRecord::getNodeId, processNodeRecordParamDto.getNodeId()) - .update(new ProcessNodeRecord()); - return R.ok(); - } - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessServiceImpl.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessServiceImpl.java deleted file mode 100644 index 03740f222..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessServiceImpl.java +++ /dev/null @@ -1,246 +0,0 @@ -package com.pig4cloud.pigx.flow.task.service.impl; - -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.json.JSONArray; -import cn.hutool.json.JSONObject; -import cn.hutool.json.JSONUtil; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.pig4cloud.pigx.common.core.util.R; -import com.pig4cloud.pigx.common.security.util.SecurityUtils; -import com.pig4cloud.pigx.common.sequence.sequence.Sequence; -import com.pig4cloud.pigx.flow.task.api.feign.RemoteFlowEngineService; -import com.pig4cloud.pigx.flow.task.constant.FormTypeEnum; -import com.pig4cloud.pigx.flow.task.dto.Node; -import com.pig4cloud.pigx.flow.task.dto.NodeUser; -import com.pig4cloud.pigx.flow.task.entity.Process; -import com.pig4cloud.pigx.flow.task.entity.ProcessStarter; -import com.pig4cloud.pigx.flow.task.mapper.ProcessMapper; -import com.pig4cloud.pigx.flow.task.service.IProcessService; -import com.pig4cloud.pigx.flow.task.service.IProcessStarterService; -import com.pig4cloud.pigx.flow.task.utils.NodeUtil; -import com.pig4cloud.pigx.flow.task.vo.FormItemVO; -import com.pig4cloud.pigx.flow.task.vo.ProcessVO; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; - -/** - *

- * 服务实现类 - *

- * - * @author cxygzl - * @since 2023-05-25 - */ -@Service -@RequiredArgsConstructor -public class ProcessServiceImpl extends ServiceImpl implements IProcessService { - - private final IProcessStarterService processStarterService; - - private final RemoteFlowEngineService flowEngineService; - - private final ObjectMapper objectMapper; - - private final Sequence flowSequence; - - - /** - * 获取详细数据 - * - * @param flowId - * @return - */ - @Override - public R getDetail(String flowId) { - // 获取流程详情 - ProcessVO processVO = this.getProcessVO(flowId); - return R.ok(processVO); - } - - /** - * 根据流程ID获取流程详情 - * - * @param flowId 流程ID - * @return 流程详情 - */ - @SneakyThrows - private ProcessVO getProcessVO(String flowId) { - - Process oaForms = getByFlowId(flowId); - String process = oaForms.getProcess(); - String formItems = oaForms.getFormItems(); - Node startNode = objectMapper.readValue(process, new TypeReference<>() { - }); - - List selectUserNodeId = NodeUtil.selectUserNodeId(startNode); - - ProcessVO processVO = BeanUtil.copyProperties(oaForms, ProcessVO.class); - processVO.setSelectUserNodeId(selectUserNodeId); - - JSONArray formItemJsonArray = JSONUtil.parseArray(formItems); - // 特殊字段复制 - for (Object object : formItemJsonArray) { - if (object instanceof JSONObject) { - JSONObject formVO = (JSONObject) object; - JSONObject props = formVO.getJSONObject(FormItemVO.Fields.props); - if (Objects.nonNull(props) && FormTypeEnum.SEQUENCE.getType().equals(props.getStr(FormItemVO.Fields.type))) { - String nextNo = flowSequence.nextNo(); - props.set(FormItemVO.Props.Fields.value, nextNo); - formVO.set(FormItemVO.Props.Fields.value, nextNo); - } - } - } - - processVO.setFormItems(formItemJsonArray.toStringPretty()); - processVO.setFormPerms(startNode.getFormPerms()); - return processVO; - } - - /** - * 根据流程ID获取流程 - * - * @param flowId 流程ID - * @return 流程 - */ - @Override - public Process getByFlowId(String flowId) { - return this.lambdaQuery().eq(Process::getFlowId, flowId).one(); - } - - /** - * 更新流程 - * - * @param process 流程 - */ - @Override - public void updateByFlowId(Process process) { - this.lambdaUpdate().eq(Process::getFlowId, process.getFlowId()).update(process); - } - - /** - * 隐藏流程 - * - * @param flowId 流程ID - */ - @Override - public void hide(String flowId) { - this.lambdaUpdate().set(Process::getHidden, true).eq(Process::getFlowId, flowId).update(new Process()); - } - - /** - * 创建流程 - * - * @param process 流程 - * @return 操作结果 - */ - @SneakyThrows - @Override - public R create(Process process) { - Map map = new HashMap<>(); - map.put("process", process); - map.put("userId", SecurityUtils.getUser().getId()); - R r = flowEngineService.createFlow(map); - if (!r.isOk()) { - return R.failed(r.getMsg()); - } - String flowId = r.getData(); - NodeUser nodeUser = objectMapper.readValue(process.getAdminList(), new TypeReference>() { - }).get(0); - - // 更新流程 - if (StrUtil.isNotBlank(process.getFlowId())) { - - Process oldProcess = this.getByFlowId(process.getFlowId()); - this.hide(process.getFlowId()); - // 修改所有的管理员 - this.lambdaUpdate() - .set(Process::getAdminId, nodeUser.getId()) - .eq(Process::getUniqueId, oldProcess.getUniqueId()) - .update(new Process()); - - } - - Node startNode = objectMapper.readValue(process.getProcess(), Node.class); - - List nodeUserList = startNode.getNodeUserList(); - - StringBuilder stringBuilder = new StringBuilder(); - if (CollUtil.isNotEmpty(nodeUserList)) { - int index = 0; - - for (NodeUser user : nodeUserList) { - if (index > 0) { - stringBuilder.append(","); - } - stringBuilder.append(user.getName()); - index++; - if (index > 5) { - break; - } - - } - } - - Process p = new Process(); - p.setFlowId(flowId); - p.setName(process.getName()); - p.setLogo(process.getLogo()); - p.setSettings(process.getSettings()); - p.setGroupId(process.getGroupId()); - p.setFormItems(process.getFormItems()); - p.setProcess(process.getProcess()); - p.setRemark(process.getRemark()); - p.setSort(0); - p.setHidden("0"); - p.setStop("0"); - p.setAdminId(nodeUser.getId()); - p.setUniqueId(IdUtil.fastSimpleUUID()); - p.setAdminList(process.getAdminList()); - p.setRangeShow(stringBuilder.toString()); - - this.save(p); - - // 保存范围 - for (NodeUser nodeUserDto : nodeUserList) { - ProcessStarter processStarter = new ProcessStarter(); - - processStarter.setProcessId(p.getId()); - processStarter.setTypeId(nodeUserDto.getId()); - processStarter.setType(nodeUserDto.getType()); - processStarterService.save(processStarter); - } - - return R.ok(); - } - - /** - * 编辑表单 - * - * @param flowId 流程ID - * @param type 类型 stop using delete - * @param groupId 分组ID - * @return 操作结果 - */ - @Override - public R update(String flowId, String type, Long groupId) { - Process process = new Process(); - process.setFlowId(flowId); - process.setStop("stop".equals(type) ? "1" : "0"); - process.setHidden("delete".equals(type) ? "1" : "0"); - process.setGroupId(groupId); - this.updateByFlowId(process); - return R.ok(); - } - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessStarterServiceImpl.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessStarterServiceImpl.java deleted file mode 100644 index 5e4f74efe..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessStarterServiceImpl.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.pig4cloud.pigx.flow.task.service.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.pig4cloud.pigx.flow.task.entity.ProcessStarter; -import com.pig4cloud.pigx.flow.task.mapper.ProcessStarterMapper; -import com.pig4cloud.pigx.flow.task.service.IProcessStarterService; -import org.springframework.stereotype.Service; - -/** - *

- * 流程发起人 服务实现类 - *

- * - * @author Vincent - * @since 2023-05-30 - */ -@Service -public class ProcessStarterServiceImpl extends ServiceImpl - implements IProcessStarterService { - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/TaskServiceImpl.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/TaskServiceImpl.java deleted file mode 100644 index 25649c1e3..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/TaskServiceImpl.java +++ /dev/null @@ -1,269 +0,0 @@ -package com.pig4cloud.pigx.flow.task.service.impl; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.lang.Dict; -import cn.hutool.core.util.StrUtil; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.pig4cloud.pigx.common.core.util.R; -import com.pig4cloud.pigx.common.security.util.SecurityUtils; -import com.pig4cloud.pigx.flow.task.api.feign.RemoteFlowEngineService; -import com.pig4cloud.pigx.flow.task.constant.NodeStatusEnum; -import com.pig4cloud.pigx.flow.task.dto.IndexPageStatistics; -import com.pig4cloud.pigx.flow.task.dto.Node; -import com.pig4cloud.pigx.flow.task.dto.TaskParamDto; -import com.pig4cloud.pigx.flow.task.dto.TaskResultDto; -import com.pig4cloud.pigx.flow.task.entity.Process; -import com.pig4cloud.pigx.flow.task.entity.ProcessCopy; -import com.pig4cloud.pigx.flow.task.entity.ProcessInstanceRecord; -import com.pig4cloud.pigx.flow.task.entity.ProcessNodeRecordAssignUser; -import com.pig4cloud.pigx.flow.task.service.*; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@RequiredArgsConstructor -public class TaskServiceImpl implements ITaskService { - - private final RemoteFlowEngineService flowEngineService; - - private final IProcessService processService; - - private final IProcessCopyService processCopyService; - - private final IProcessNodeDataService nodeDataService; - - private final IProcessNodeRecordAssignUserService processNodeRecordAssignUserService; - - private final IProcessInstanceRecordService processInstanceRecordService; - - private final ObjectMapper objectMapper; - - /** - * 查询首页数据看板 - * @return - */ - @Override - public R queryTaskData() { - R indexPageStatisticsR = flowEngineService - .querySimpleData(SecurityUtils.getUser().getId()); - - // 获取抄送任务 - Long copyCount = processCopyService.lambdaQuery() - .eq(ProcessCopy::getUserId, SecurityUtils.getUser().getId()) - .count(); - indexPageStatisticsR.getData().setCopyNum(copyCount); - return indexPageStatisticsR; - } - - /** - * 查询任务 - * @param taskId - * @param view - * @return - */ - @SneakyThrows - @Override - public R queryTask(String taskId, boolean view) { - - long userId = SecurityUtils.getUser().getId(); - - R r = flowEngineService.queryTask(taskId, userId); - - if (!r.isOk()) { - return R.failed(r.getMsg()); - } - - TaskResultDto taskResultDto = r.getData(); - - // 变量 - Map paramMap = taskResultDto.getVariableAll(); - // 是否是当前活动任务 - Boolean currentTask = taskResultDto.getCurrentTask(); - if (!currentTask) { - ProcessNodeRecordAssignUser processNodeRecordAssignUser = processNodeRecordAssignUserService.lambdaQuery() - .eq(ProcessNodeRecordAssignUser::getTaskId, taskId) - .eq(ProcessNodeRecordAssignUser::getUserId, userId) - .eq(ProcessNodeRecordAssignUser::getStatus, NodeStatusEnum.YJS.getCode()) - .last("limit 1") - .orderByDesc(ProcessNodeRecordAssignUser::getEndTime) - .one(); - - if (processNodeRecordAssignUser != null) { - String data = processNodeRecordAssignUser.getData(); - if (StrUtil.isNotBlank(data)) { - Map collect = objectMapper.readValue(data, new TypeReference<>() { - }); - paramMap.putAll(collect); - - } - } - - } - - // 当前节点数据 - Node node = nodeDataService.getNodeData(taskResultDto.getFlowId(), taskResultDto.getNodeId()).getData(); - Map formPerms = node.getFormPerms(); - - Process oaForms = processService.getByFlowId(taskResultDto.getFlowId()); - if (oaForms == null) { - return R.failed("流程不存在"); - } - - Dict set = Dict.create() - .set("processInstanceId", taskResultDto.getProcessInstanceId()) - .set("node", taskResultDto.getTaskNode()) - .set("process", oaForms.getProcess()) - .set("delegateAgain", taskResultDto.getDelegate()) - .set("delegationTask", StrUtil.equals(taskResultDto.getDelegationState(), "PENDING")) - .set("formItems", oaForms.getFormItems()) - .set("formData", paramMap) - .set("formPerms", formPerms); - - return R.ok(set); - } - - /** - * 完成任务 - * @param taskParamDto - * @return - */ - @Override - public R completeTask(TaskParamDto taskParamDto) { - long userId = SecurityUtils.getUser().getId(); - taskParamDto.setUserId(String.valueOf(userId)); - - R r = flowEngineService.completeTask(taskParamDto); - - if (!r.isOk()) { - return R.failed(r.getMsg()); - } - - return R.ok(); - } - - /** - * 前加签 - * @param taskParamDto - * @return - */ - @Transactional - @Override - public R delegateTask(TaskParamDto taskParamDto) { - - taskParamDto.setUserId(SecurityUtils.getUser().getId().toString()); - - R r = flowEngineService.delegateTask(taskParamDto); - if (!r.isOk()) { - return R.failed(r.getMsg()); - } - - return R.ok(); - } - - /** - * 加签完成任务 - * @param taskParamDto - * @return - */ - @Override - public R resolveTask(TaskParamDto taskParamDto) { - R r = flowEngineService.resolveTask(taskParamDto); - if (!r.isOk()) { - return R.failed(r.getMsg()); - } - - return R.ok(); - } - - /** - * 设置执行人 - * @param taskParamDto - * @return - */ - @Override - public R setAssignee(TaskParamDto taskParamDto) { - taskParamDto.setUserId(SecurityUtils.getUser().getId().toString()); - R r = flowEngineService.transferTask(taskParamDto); - if (!r.isOk()) { - return R.failed(r.getMsg()); - } - - return R.ok(); - } - - /** - * 结束流程 - * @param taskParamDto - * @return - */ - @Override - public R stopProcessInstance(TaskParamDto taskParamDto) { - - String processInstanceId = taskParamDto.getProcessInstanceId(); - - List allStopProcessInstanceIdList = getAllStopProcessInstanceIdList(processInstanceId); - CollUtil.reverse(allStopProcessInstanceIdList); - allStopProcessInstanceIdList.add(processInstanceId); - - taskParamDto.setProcessInstanceIdList(allStopProcessInstanceIdList); - taskParamDto.setUserId(SecurityUtils.getUser().getId().toString()); - R r = flowEngineService.stopProcessInstance(taskParamDto); - - if (!r.isOk()) { - return R.failed(r.getMsg()); - } - - // 停止流程实例后,更新流程实例记录状态 - processInstanceRecordService.lambdaUpdate() - .set(ProcessInstanceRecord::getStatus, NodeStatusEnum.YJS.getCode()) - .set(ProcessInstanceRecord::getFinishReason, "9") - .set(ProcessInstanceRecord::getEndTime, new Date()) - .eq(ProcessInstanceRecord::getProcessInstanceId, processInstanceId) - .update(new ProcessInstanceRecord()); - return R.ok(); - } - - /** - * 退回 - * @param taskParamDto - * @return - */ - @Override - public R back(TaskParamDto taskParamDto) { - taskParamDto.setUserId(SecurityUtils.getUser().getId().toString()); - R r = flowEngineService.back(taskParamDto); - if (!r.isOk()) { - return R.failed(r.getMsg()); - } - - return R.ok(); - } - - private List getAllStopProcessInstanceIdList(String processInstanceId) { - List list = processInstanceRecordService.lambdaQuery() - .eq(ProcessInstanceRecord::getParentProcessInstanceId, processInstanceId) - .list(); - - List collect = new ArrayList<>(list.stream().map(ProcessInstanceRecord::getProcessInstanceId).toList()); - - for (ProcessInstanceRecord processInstanceRecord : list) { - List allStopProcessInstanceIdList = getAllStopProcessInstanceIdList( - processInstanceRecord.getProcessInstanceId()); - - collect.addAll(allStopProcessInstanceIdList); - - } - return collect; - } - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/utils/NodeFormatUtil.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/utils/NodeFormatUtil.java deleted file mode 100644 index fd1066ccd..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/utils/NodeFormatUtil.java +++ /dev/null @@ -1,311 +0,0 @@ -package com.pig4cloud.pigx.flow.task.utils; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.convert.Convert; -import cn.hutool.core.util.StrUtil; -import cn.hutool.extra.spring.SpringUtil; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.pig4cloud.pigx.admin.api.entity.SysUser; -import com.pig4cloud.pigx.admin.api.feign.RemoteUserService; -import com.pig4cloud.pigx.common.core.util.RetOps; -import com.pig4cloud.pigx.common.security.util.SecurityUtils; -import com.pig4cloud.pigx.flow.task.constant.NodeStatusEnum; -import com.pig4cloud.pigx.flow.task.constant.NodeTypeEnum; -import com.pig4cloud.pigx.flow.task.constant.NodeUserTypeEnum; -import com.pig4cloud.pigx.flow.task.constant.ProcessInstanceConstant; -import com.pig4cloud.pigx.flow.task.dto.Node; -import com.pig4cloud.pigx.flow.task.dto.NodeUser; -import com.pig4cloud.pigx.flow.task.entity.ProcessInstanceRecord; -import com.pig4cloud.pigx.flow.task.entity.ProcessNodeRecordAssignUser; -import com.pig4cloud.pigx.flow.task.service.IProcessInstanceRecordService; -import com.pig4cloud.pigx.flow.task.service.IProcessNodeRecordAssignUserService; -import com.pig4cloud.pigx.flow.task.service.IRemoteService; -import com.pig4cloud.pigx.flow.task.vo.NodeVo; -import com.pig4cloud.pigx.flow.task.vo.UserVo; -import lombok.SneakyThrows; - -import java.util.*; -import java.util.stream.Collectors; - -/** - * 节点格式化显示工具 - */ -public class NodeFormatUtil { - - /** - * 格式化流程节点显示 - * - * @param node - * @param completeNodeSet - * @param continueNodeSet - * @param processInstanceId - * @param paramMap - */ - @SneakyThrows - public static List formatProcessNodeShow(Node node, Set completeNodeSet, - Set continueNodeSet, String processInstanceId, Map paramMap) { - List list = new ArrayList<>(); - - if (!NodeUtil.isNode(node)) { - return list; - } - - String name = node.getName(); - Integer type = node.getType(); - - // SELF_SELECT - - NodeVo nodeVo = new NodeVo(); - nodeVo.setId(node.getId()); - nodeVo.setName(name); - nodeVo.setType(type); - nodeVo.setStatus(NodeStatusEnum.WKS.getCode()); - if (completeNodeSet.contains(node.getId())) { - nodeVo.setStatus(NodeStatusEnum.YJS.getCode()); - - } - if (continueNodeSet.contains(node.getId())) { - nodeVo.setStatus(NodeStatusEnum.JXZ.getCode()); - - } - - { - nodeVo.setPlaceholder(node.getPlaceHolder()); - } - - List userVoList = new ArrayList<>(); - if (type == NodeTypeEnum.APPROVAL.getValue().intValue()) { - - Integer assignedType = node.getAssignedType(); - - boolean selfSelect = assignedType == ProcessInstanceConstant.AssignedTypeClass.SELF_SELECT; - nodeVo.setSelectUser(selfSelect); - if (selfSelect) { - nodeVo.setMultiple(node.getMultiple()); - } - - // 用户列表 - if (StrUtil.isNotBlank(processInstanceId)) { - IProcessNodeRecordAssignUserService processNodeRecordAssignUserService = SpringUtil - .getBean(IProcessNodeRecordAssignUserService.class); - List processNodeRecordAssignUserList = processNodeRecordAssignUserService - .lambdaQuery() - .eq(ProcessNodeRecordAssignUser::getNodeId, node.getId()) - .eq(ProcessNodeRecordAssignUser::getProcessInstanceId, processInstanceId) - .orderByAsc(ProcessNodeRecordAssignUser::getCreateTime) - .list(); - Map> map = processNodeRecordAssignUserList.stream() - .collect(Collectors.groupingBy(ProcessNodeRecordAssignUser::getTaskId)); - - for (Map.Entry> entry : map.entrySet()) { - List value = entry.getValue(); - List collect = value.stream().map(w -> { - UserVo userVo = buildUser(Long.parseLong(w.getUserId())); - if (userVo == null) { - return null; - } - - userVo.setShowTime(w.getEndTime()); - userVo.setApproveDesc(w.getApproveDesc()); - userVo.setStatus(w.getStatus()); - userVo.setOperType(w.getTaskType()); - return userVo; - }).filter(Objects::nonNull).toList(); - userVoList.addAll(collect); - } - - if (processNodeRecordAssignUserList.isEmpty()) { - if (assignedType == ProcessInstanceConstant.AssignedTypeClass.SELF) { - // 发起人自己 - userVoList.addAll(CollUtil.newArrayList(buildRootUser(processInstanceId))); - } - if (assignedType == ProcessInstanceConstant.AssignedTypeClass.SELF_SELECT) { - // 发起人自选 - Object variable = paramMap.get(StrUtil.format("{}_assignee_select", node.getId())); - - ObjectMapper objectMapper = SpringUtil.getBean(ObjectMapper.class); - List nodeUserDtos = objectMapper.readValue(objectMapper.writeValueAsString(variable), - new TypeReference<>() { - }); - - if (CollUtil.isNotEmpty(nodeUserDtos)) { - List collect = nodeUserDtos.stream().map(w -> Long.valueOf(w.getId())).toList(); - for (Long aLong : collect) { - UserVo userVo = buildUser(aLong); - userVoList.addAll(CollUtil.newArrayList(userVo)); - } - } - - } - } - - } else if (assignedType == ProcessInstanceConstant.AssignedTypeClass.USER) { - // 指定用户 - - List nodeUserList = node.getNodeUserList(); - List tempList = buildUser(nodeUserList); - userVoList.addAll(tempList); - - } else if (assignedType == ProcessInstanceConstant.AssignedTypeClass.FORM_USER) { - // 表单人员 - String formUser = node.getFormUserId(); - - Object o = paramMap.get(formUser); - if (o != null) { - ObjectMapper objectMapper = SpringUtil.getBean(ObjectMapper.class); - String jsonString = objectMapper.writeValueAsString(o); - if (StrUtil.isNotBlank(jsonString)) { - List nodeUserDtoList = objectMapper.readValue(jsonString, new TypeReference<>() { - }); - List userIdList = nodeUserDtoList.stream().map(NodeUser::getId).toList(); - for (Long aLong : userIdList) { - userVoList.addAll(CollUtil.newArrayList(buildUser(aLong))); - } - } - } - - } else if (assignedType == ProcessInstanceConstant.AssignedTypeClass.SELF) { - // 发起人自己 - userVoList.addAll(CollUtil.newArrayList(buildUser(SecurityUtils.getUser().getId()))); - } - - } else if (Objects.equals(node.getType(), NodeTypeEnum.ROOT.getValue())) { - // 发起节点 - if (StrUtil.isBlank(processInstanceId)) { - UserVo userVo = buildUser(SecurityUtils.getUser().getId()); - userVoList.addAll(CollUtil.newArrayList(userVo)); - } else { - - IProcessInstanceRecordService processInstanceRecordService = SpringUtil - .getBean(IProcessInstanceRecordService.class); - ProcessInstanceRecord processInstanceRecord = processInstanceRecordService.lambdaQuery() - .eq(ProcessInstanceRecord::getProcessInstanceId, processInstanceId) - .one(); - - UserVo userVo = buildRootUser(processInstanceId); - userVo.setShowTime(processInstanceRecord.getCreateTime()); - userVo.setStatus(NodeStatusEnum.YJS.getCode()); - userVoList.addAll(CollUtil.newArrayList(userVo)); - - } - } else if (node.getType() == NodeTypeEnum.CC.getValue()) { - // 抄送节点 - - List nodeUserList = node.getNodeUserList(); - - List tempList = buildUser(nodeUserList); - userVoList.addAll(tempList); - - } - - // 根据userVo 的ID 去重userVoList - nodeVo.setUserVoList(CollUtil.distinct(userVoList, UserVo::getId, true)); - - List branchList = new ArrayList<>(); - - if (type == NodeTypeEnum.EXCLUSIVE_GATEWAY.getValue().intValue() - || type == NodeTypeEnum.PARALLEL_GATEWAY.getValue().intValue()) { - // 条件分支 - List branchs = node.getConditionNodes(); - - for (Node branch : branchs) { - Node children = branch.getChildren(); - List processNodeShowDtos = formatProcessNodeShow(children, completeNodeSet, continueNodeSet, - processInstanceId, paramMap); - - NodeVo p = new NodeVo(); - p.setChildren(processNodeShowDtos); - - p.setPlaceholder(branch.getPlaceHolder()); - branchList.add(p); - } - } - nodeVo.setBranch(branchList); - - list.add(nodeVo); - - List next = formatProcessNodeShow(node.getChildren(), completeNodeSet, continueNodeSet, - processInstanceId, paramMap); - list.addAll(next); - - return list; - } - - /** - * 根据实例id - * - * @param processInstanceId - * @return - */ - private static UserVo buildRootUser(String processInstanceId) { - - IProcessInstanceRecordService processInstanceRecordService = SpringUtil - .getBean(IProcessInstanceRecordService.class); - ProcessInstanceRecord processInstanceRecord = processInstanceRecordService.lambdaQuery() - .eq(ProcessInstanceRecord::getProcessInstanceId, processInstanceId) - .one(); - Long userId = processInstanceRecord.getUserId(); - UserVo userVo = buildUser(userId); - return userVo; - } - - /** - * 根据用户id - * - * @param userId - * @return - */ - private static UserVo buildUser(long userId) { - if (ProcessInstanceConstant.DEFAULT_EMPTY_ASSIGN == userId) { - return UserVo.builder().id(userId).build(); - } - - RemoteUserService userService = SpringUtil.getBean(RemoteUserService.class); - SysUser user = RetOps.of(userService.getUserById(CollUtil.newArrayList(userId))) - .getData() - .map(sysUsers -> sysUsers.isEmpty() ? null : sysUsers.get(0)) - .orElse(null); - if (user == null) { - return null; - } - - return UserVo.builder().id(userId).name(user.getName()).avatar(user.getAvatar()).build(); - } - - private static List buildUser(List nodeUserList) { - List userVoList = new ArrayList<>(); - // 用户id - List userIdList = nodeUserList.stream() - .filter(w -> StrUtil.equals(w.getType(), NodeUserTypeEnum.USER.getKey())) - .map(w -> Convert.toLong(w.getId())) - .toList(); - // 部门id - List deptIdList = nodeUserList.stream() - .filter(w -> StrUtil.equals(w.getType(), NodeUserTypeEnum.DEPT.getKey())) - .map(w -> Convert.toLong(w.getId())) - .toList(); - - if (CollUtil.isNotEmpty(deptIdList)) { - - IRemoteService iRemoteService = SpringUtil.getBean(IRemoteService.class); - - List data = iRemoteService.queryUserIdListByDepIdList(deptIdList).getData(); - - if (CollUtil.isNotEmpty(data)) { - for (long datum : data) { - if (!userIdList.contains(datum)) { - userIdList.add(datum); - } - } - } - } - { - for (Long aLong : userIdList) { - userVoList.addAll(CollUtil.newArrayList(buildUser(aLong))); - } - } - return userVoList; - } - -} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/resources/application.yml b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/resources/application.yml deleted file mode 100644 index 4373cafe4..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/resources/application.yml +++ /dev/null @@ -1,18 +0,0 @@ -server: - port: 9030 - -spring: - application: - name: @artifactId@ - cloud: - nacos: - username: @nacos.username@ - password: @nacos.password@ - discovery: - server-addr: ${NACOS_HOST:pigx-register}:${NACOS_PORT:8848} - config: - server-addr: ${spring.cloud.nacos.discovery.server-addr} - config: - import: - - optional:nacos:application-@profiles.active@.yml - - optional:nacos:${spring.application.name}-@profiles.active@.yml diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/resources/logback-spring.xml b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/resources/logback-spring.xml deleted file mode 100644 index 1a5d10343..000000000 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/resources/logback-spring.xml +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - - - - - ${CONSOLE_LOG_PATTERN} - - - - - - ${log.path}/debug.log - - ${log.path}/%d{yyyy-MM, aux}/debug.%d{yyyy-MM-dd}.%i.log.gz - 50MB - 30 - - - %date [%thread] %-5level [%logger{50}] %file:%line - %msg%n - - - - - - ${log.path}/error.log - - ${log.path}/%d{yyyy-MM}/error.%d{yyyy-MM-dd}.%i.log.gz - 50MB - 30 - - - %date [%thread] %-5level [%logger{50}] %file:%line - %msg%n - - - ERROR - - - - - - - - - - - - - - - - - diff --git a/pigx-flow/pigx-flow-task/pom.xml b/pigx-flow/pigx-flow-task/pom.xml deleted file mode 100644 index d109d2f20..000000000 --- a/pigx-flow/pigx-flow-task/pom.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - 4.0.0 - - - com.pig4cloud - pigx-flow - 5.9.0 - - - pigx-flow-task - flowable 工作流业务处理模块 - pom - - - - pigx-flow-task-api - pigx-flow-task-biz - - diff --git a/pigx-flow/pom.xml b/pigx-flow/pom.xml index f2de9538c..d83e407ac 100644 --- a/pigx-flow/pom.xml +++ b/pigx-flow/pom.xml @@ -24,7 +24,7 @@ com.pig4cloud pigx - 5.9.0 + 5.10.2-SNAPSHOT pigx-flow @@ -32,7 +32,7 @@ pom - pigx-flow-engine - pigx-flow-task + pigx-flow-api + pigx-flow-biz