001/* 002 * Copyright 2024-2025, Warm-Flow (290631660@qq.com). 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * https://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016package org.dromara.warm.flow.core.config; 017 018import org.dromara.warm.flow.core.FlowFactory; 019import org.dromara.warm.flow.core.constant.FlowConfigCons; 020import org.dromara.warm.flow.core.expression.ExpressionStrategy; 021import org.dromara.warm.flow.core.invoker.FrameInvoker; 022import org.dromara.warm.flow.core.json.JsonConvert; 023import org.dromara.warm.flow.core.utils.*; 024import org.dromara.warm.flow.core.variable.VariableStrategy; 025 026import java.io.Serializable; 027 028/** 029 * WarmFlow属性配置文件 030 * 031 * @author warm 032 */ 033public class WarmFlow implements Serializable { 034 035 /** 036 * 开关 037 */ 038 private boolean enabled = true; 039 040 /** 041 * 启动banner 042 */ 043 private boolean banner = true; 044 045 /** 046 * id生成器类型, 不填默认为orm扩展自带生成器或者warm-flow内置的19位雪花算法, SnowId14:14位,SnowId15:15位, SnowFlake19:19位 047 */ 048 private String keyType; 049 050 /** 051 * 是否开启逻辑删除 052 */ 053 private boolean logicDelete = false; 054 055 /** 056 * 逻辑删除字段值 057 */ 058 private String logicDeleteValue = "2"; 059 060 /** 061 * 逻辑未删除字段 062 */ 063 private String logicNotDeleteValue = "0"; 064 065 /** 066 * 数据填充处理类路径 067 */ 068 private String dataFillHandlerPath; 069 070 /** 071 * 租户模式处理类路径 072 */ 073 private String tenantHandlerPath; 074 /** 075 * 数据源类型, mybatis模块对orm进一步的封装, 由于各数据库分页语句存在差异, 076 * 当配置此参数时, 以此参数结果为基准, 未配置时, 取DataSource中数据源类型, 077 * 兜底为mysql数据库 078 */ 079 private String dataSourceType; 080 081 /** 082 * ui开关 083 */ 084 private boolean ui = true; 085 086 /** 087 * 如果需要工作流共享业务系统权限,默认Authorization,如果有多个token,用逗号分隔 088 */ 089 private String tokenName = "Authorization"; 090 091 public static WarmFlow init() { 092 WarmFlow flowConfig = new WarmFlow(); 093 // 设置banner 094 String banner = FrameInvoker.getCfg(FlowConfigCons.BANNER); 095 if (StringUtils.isNotEmpty(banner)) { 096 flowConfig.setBanner(ObjectUtil.isStrTrue(banner)); 097 } 098 099 // 设置ui开关 100 String ui = FrameInvoker.getCfg(FlowConfigCons.UI); 101 if (StringUtils.isNotEmpty(ui)) { 102 flowConfig.setUi(ObjectUtil.isStrTrue(ui)); 103 } 104 105 // 设置TOKEN_NAME开关 106 String tokenName = FrameInvoker.getCfg(FlowConfigCons.TOKEN_NAME); 107 if (StringUtils.isNotEmpty(tokenName)) { 108 flowConfig.setTokenName(tokenName); 109 } 110 111 // 设置id生成器类型 112 String keyType = FrameInvoker.getCfg(FlowConfigCons.KEYTYPE); 113 if (StringUtils.isNotEmpty(keyType)) { 114 flowConfig.setKeyType(keyType); 115 } 116 117 // 设置逻辑删除 118 setLogicDelete(flowConfig); 119 120 // 设置租户模式 121 flowConfig.setTenantHandlerPath(FrameInvoker.getCfg(FlowConfigCons.TENANTHANDLERPATH)); 122 123 // 设置数据填充处理类 124 flowConfig.setDataFillHandlerPath(FrameInvoker.getCfg(FlowConfigCons.DATAFILLHANDLEPATH)); 125 126 // 设置数据源类型 127 flowConfig.setDataSourceType(FrameInvoker.getCfg(FlowConfigCons.DATA_SOURCE_TYPE)); 128 printBanner(flowConfig); 129 130 // 通过SPI机制 131 spiLoad(); 132 return flowConfig; 133 } 134 public static void spiLoad() { 135 // 通过SPI机制加载条件表达式策略实现类 136 ServiceLoaderUtil.loadList(ExpressionStrategy.class).forEach(ExpressionUtil::setExpression); 137 138 // 通过SPI机制加载办理人变量表达式策略实现类 139 ServiceLoaderUtil.loadList(VariableStrategy.class).forEach(VariableUtil::setExpression); 140 141 // 通过SPI机制加载json转换策略实现类 142 FlowFactory.jsonConvert(ServiceLoaderUtil.loadFirst(JsonConvert.class)); 143 } 144 145 private static void setLogicDelete(WarmFlow flowConfig) { 146 String logicDelete = FrameInvoker.getCfg(FlowConfigCons.LOGICDELETE); 147 if (ObjectUtil.isStrTrue(logicDelete)) { 148 flowConfig.setLogicDelete(ObjectUtil.isStrTrue(logicDelete)); 149 String logicDeleteValue = FrameInvoker.getCfg(FlowConfigCons.LOGICDELETEVALUE); 150 if (StringUtils.isNotEmpty(logicDeleteValue)) { 151 flowConfig.setLogicDeleteValue(logicDeleteValue); 152 } 153 String logicNotDeleteValue = FrameInvoker.getCfg(FlowConfigCons.LOGICNOTDELETEVALUE); 154 if (StringUtils.isNotEmpty(logicNotDeleteValue)) { 155 flowConfig.setLogicNotDeleteValue(logicNotDeleteValue); 156 } 157 } 158 } 159 160 private static void printBanner(WarmFlow flowConfig) { 161 if (flowConfig.isBanner()) { 162 System.out.println("\n" + 163 " ▄ ▄ ▄▄▄▄▄▄ ▄ \n" + 164 " █ █ █ ▄▄▄ ▄ ▄▄ ▄▄▄▄▄ █ █ ▄▄▄ ▄ ▄ \n" + 165 " ▀ █▀█ █ ▀ █ █▀ ▀ █ █ █ █▄▄▄▄▄ █ █▀ ▀█ ▀▄ ▄ ▄▀ \n" + 166 " ██ ██▀ ▄▀▀▀█ █ █ █ █ █ █ █ █ █▄█▄█ \n" + 167 " █ █ ▀▄▄▀█ █ █ █ █ █ ▀▄▄ ▀█▄█▀ █ █ \n" + 168 "\n" + 169 "\033[32m :: Warm-Flow :: (v" + WarmFlow.class.getPackage() 170 .getImplementationVersion() + ")\033[0m\n"); 171 } 172 } 173 174 public boolean isEnabled() { 175 return enabled; 176 } 177 178 public void setEnabled(boolean enabled) { 179 this.enabled = enabled; 180 } 181 182 public boolean isBanner() { 183 return banner; 184 } 185 186 public void setBanner(boolean banner) { 187 this.banner = banner; 188 } 189 190 public String getKeyType() { 191 return keyType; 192 } 193 194 public void setKeyType(String keyType) { 195 this.keyType = keyType; 196 } 197 198 public boolean isLogicDelete() { 199 return logicDelete; 200 } 201 202 public void setLogicDelete(boolean logicDelete) { 203 this.logicDelete = logicDelete; 204 } 205 206 public String getLogicDeleteValue() { 207 return logicDeleteValue; 208 } 209 210 public void setLogicDeleteValue(String logicDeleteValue) { 211 this.logicDeleteValue = logicDeleteValue; 212 } 213 214 public String getLogicNotDeleteValue() { 215 return logicNotDeleteValue; 216 } 217 218 public void setLogicNotDeleteValue(String logicNotDeleteValue) { 219 this.logicNotDeleteValue = logicNotDeleteValue; 220 } 221 222 public String getDataFillHandlerPath() { 223 return dataFillHandlerPath; 224 } 225 226 public void setDataFillHandlerPath(String dataFillHandlerPath) { 227 this.dataFillHandlerPath = dataFillHandlerPath; 228 } 229 230 public String getTenantHandlerPath() { 231 return tenantHandlerPath; 232 } 233 234 public void setTenantHandlerPath(String tenantHandlerPath) { 235 this.tenantHandlerPath = tenantHandlerPath; 236 } 237 238 public String getDataSourceType() { 239 return dataSourceType; 240 } 241 242 public void setDataSourceType(String dataSourceType) { 243 this.dataSourceType = dataSourceType; 244 } 245 246 public boolean isUi() { 247 return ui; 248 } 249 250 public void setUi(boolean ui) { 251 this.ui = ui; 252 } 253 254 public String getTokenName() { 255 return tokenName; 256 } 257 258 public void setTokenName(String tokenName) { 259 this.tokenName = tokenName; 260 } 261}