diff --git a/pom.xml b/pom.xml index 8494ba12b..d596e7177 100644 --- a/pom.xml +++ b/pom.xml @@ -62,7 +62,6 @@ 3.3.5 - 1.8.9 2.16.1.2 2.6.8 @@ -346,19 +345,6 @@ ${mapstruct-plus.version} - - - org.dromara.warm - warm-flow-mybatis-plus-sb4-starter - ${warm-flow.version} - - - - org.dromara.warm - warm-flow-plugin-ui-sb-web - ${warm-flow.version} - - com.yomahub diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/SpringUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/SpringUtils.java index fdf49585f..d612cdd73 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/SpringUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/SpringUtils.java @@ -69,4 +69,18 @@ public final class SpringUtils extends SpringUtil { return Threading.VIRTUAL.isActive(getBean(Environment.class)); } + /** + * 获取Bean 容器中不存在时返回null而非抛出异常 + * + * @param clazz Bean类型 + * @return Bean实例 不存在时返回null + */ + public static T getBeanOrNull(Class clazz) { + try { + return getBean(clazz); + } catch (NoSuchBeanDefinitionException e) { + return null; + } + } + } diff --git a/ruoyi-modules/ruoyi-workflow/pom.xml b/ruoyi-modules/ruoyi-workflow/pom.xml index 814de3e96..afe06c82d 100644 --- a/ruoyi-modules/ruoyi-workflow/pom.xml +++ b/ruoyi-modules/ruoyi-workflow/pom.xml @@ -84,18 +84,6 @@ ruoyi-api - - - org.dromara.warm - warm-flow-mybatis-plus-sb4-starter - - - - - org.dromara.warm - warm-flow-plugin-ui-sb-web - - org.dromara diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/FlowEngine.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/FlowEngine.java new file mode 100644 index 000000000..6fa2281a4 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/FlowEngine.java @@ -0,0 +1,152 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow; + +import cn.hutool.core.util.StrUtil; + +import org.dromara.warm.flow.config.WarmFlowProperties; +import org.dromara.warm.flow.handler.DataFillHandler; +import org.dromara.warm.flow.handler.PermissionHandler; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.warm.flow.listener.GlobalListener; +import org.dromara.warm.flow.service.*; +import cn.hutool.core.util.ClassUtil; + + + +import java.lang.reflect.Constructor; +import java.util.function.Supplier; +/** + * 流程引擎,通过静态方法驱动流程流转 + */ +public class FlowEngine { + + private static WarmFlowProperties flowConfig; + private static DataFillHandler dataFillHandler; + private static PermissionHandler permissionHandler; + private static GlobalListener globalListener; + + public static DefService defService() { + return SpringUtils.getBeanOrNull(DefService.class); + } + + public static NodeService nodeService() { + return SpringUtils.getBeanOrNull(NodeService.class); + } + + public static SkipService skipService() { + return SpringUtils.getBeanOrNull(SkipService.class); + } + + public static InsService insService() { + return SpringUtils.getBeanOrNull(InsService.class); + } + + public static TaskService taskService() { + return SpringUtils.getBeanOrNull(TaskService.class); + } + + public static HisTaskService hisTaskService() { + return SpringUtils.getBeanOrNull(HisTaskService.class); + } + + public static UserService userService() { + return SpringUtils.getBeanOrNull(UserService.class); + } + + public static ChartService chartService() { + return SpringUtils.getBeanOrNull(ChartService.class); + } + + public static WarmFlowProperties getFlowConfig() { + return flowConfig; + } + + public static void setFlowConfig(WarmFlowProperties flowConfig) { + FlowEngine.flowConfig = flowConfig; + } + + public static void initDataFillHandler(String handlerPath) { + dataFillHandler = initBean(DataFillHandler.class, handlerPath, () -> new DataFillHandler() {}); + } + + public static void initPermissionHandler(String handlerPath) { + permissionHandler = initBean(PermissionHandler.class, handlerPath, null); + } + + public static void initGlobalListener(String handlerPath) { + globalListener = initBean(GlobalListener.class, handlerPath, null); + } + + /** + * 获取填充类 + */ + public static DataFillHandler dataFillHandler() { + return dataFillHandler; + } + + /** + * 获取填充类 + */ + public static PermissionHandler permissionHandler() { + return permissionHandler; + } + + /** + * 获取全局监听器 + */ + public static GlobalListener globalListener() { + return globalListener; + } + + /** + * 获取数据库类型 + */ + public static String dataSourceType() { + return flowConfig.getDataSourceType(); + } + + /** + * 初始化bean,先从yml配置获取bean的全包名路径,否则从spring容器获取bean,如果都没有,则通过supplier获取bean + * + * @param tClazz bean的class类型 + * @param beanPath bean全包名路径 + * @param supplier 获取bean的lambda + * @param bean类型 + * @return bean + */ + private static T initBean(Class tClazz, String beanPath, Supplier supplier) { + T hander = null; + try { + if (!StrUtil.isEmpty(beanPath)) { + Class clazz = ClassUtil.loadClass(beanPath); + if (clazz != null && tClazz.isAssignableFrom(clazz)) { + Constructor constructor = clazz.getConstructor(); + hander = tClazz.cast(constructor.newInstance()); + } + } + } catch (Exception ignored) { + } + if (hander == null) { + hander = SpringUtils.getBeanOrNull(tClazz); + } + if (hander == null && supplier != null) { + hander = supplier.get(); + } + return hander; + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/config/WarmFlowInitializer.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/config/WarmFlowInitializer.java new file mode 100644 index 000000000..438caa1a3 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/config/WarmFlowInitializer.java @@ -0,0 +1,53 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.config; + +import jakarta.annotation.PostConstruct; +import org.dromara.warm.flow.FlowEngine; +import org.dromara.warm.flow.enums.FrameworkType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * 工作流引擎初始化,各服务由注解扫描注册(见 flow.service 包的 @Service) + * + * @author warm + * @since 2023/6/5 23:01 + */ +@Component +@EnableConfigurationProperties(WarmFlowProperties.class) +@ConditionalOnProperty(value = "warm-flow.enabled", havingValue = "true", matchIfMissing = true) +public class WarmFlowInitializer { + + private static final Logger log = LoggerFactory.getLogger(WarmFlowInitializer.class); + + private final WarmFlowProperties warmFlow; + + public WarmFlowInitializer(WarmFlowProperties warmFlow) { + this.warmFlow = warmFlow; + } + + @PostConstruct + public void init() { + warmFlow.init(); + warmFlow.setFramework(FrameworkType.SPRING_BOOT); + FlowEngine.setFlowConfig(warmFlow); + log.info("【warm-flow】,加载完成"); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/config/WarmFlowProperties.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/config/WarmFlowProperties.java new file mode 100644 index 000000000..616b52e53 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/config/WarmFlowProperties.java @@ -0,0 +1,136 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.config; + +import lombok.Getter; +import lombok.Setter; +import org.dromara.warm.flow.FlowEngine; +import org.dromara.warm.flow.enums.ChartStatus; +import org.dromara.warm.flow.enums.FrameworkType; +import org.springframework.boot.context.properties.ConfigurationProperties; + +import java.io.Serializable; +import java.util.List; +/** + * WarmFlow属性配置文件(warm-flow 前缀绑定) + * + * @author warm + */ +@Getter +@Setter +@ConfigurationProperties("warm-flow") +public class WarmFlowProperties implements Serializable { + + /** + * 开关 + */ + private boolean enabled = true; + + /** + * 框架类型: springboot、solon + */ + private FrameworkType framework; + + /** + * 启动banner + */ + private boolean banner = true; + + /** + * 数据填充处理类路径 + */ + private String dataFillHandlerPath; + + /** + * 办理人权限处理器类路径 + */ + private String permissionHandlerPath; + + /** + * 全局监听器类路径 + */ + private String globalListenerPath; + + /** + * 数据源类型, mybatis模块对orm进一步的封装, 由于各数据库分页语句存在差异, + * 当配置此参数时, 以此参数结果为基准, 未配置时, 取DataSource中数据源类型, + * 兜底为mysql数据库 + */ + private String dataSourceType; + + /** + * ui开关 + */ + private boolean ui = true; + + /** + * 如果需要工作流共享业务系统权限,默认Authorization,如果有多个token,用逗号分隔 + */ + private String tokenName = "Authorization"; + + /** + * 公共模型流程状态对应的三原色 + */ + private List chartStatusColor; + + /** + * 经典模式流程状态对应的三原色 + */ + private List chartStatusColorClassics; + + /** + * 仿钉钉模式流程状态对应的三原色 + */ + private List chartStatusColorMimic; + + /** + * 是否显示流程图顶部文字 + */ + private boolean topTextShow = true; + + public void init() {; + + // 设置数据填充处理类 + FlowEngine.initDataFillHandler(this.getDataFillHandlerPath()); + + // 设置办理人权限处理类 + FlowEngine.initPermissionHandler(this.getPermissionHandlerPath()); + + // 设置全局监听器 + FlowEngine.initGlobalListener(this.getGlobalListenerPath()); + + // 打印banner图 + printBanner(); + + // 初始化流程状态对应的自定义三原色 + ChartStatus.initCustomColor(this.getChartStatusColor(), this.getChartStatusColorClassics(), this.getChartStatusColorMimic()); + } + + private void printBanner() { + if (this.isBanner()) { + System.out.println("\n" + + " ▄ ▄ ▄▄▄▄▄▄ ▄ \n" + + " █ █ █ ▄▄▄ ▄ ▄▄ ▄▄▄▄▄ █ █ ▄▄▄ ▄ ▄ \n" + + " ▀ █▀█ █ ▀ █ █▀ ▀ █ █ █ ▄▄▄▄▄ █▄▄▄▄▄ █ █▀ ▀█ ▀▄ ▄ ▄▀ \n" + + " ██ ██▀ ▄▀▀▀█ █ █ █ █ █ █ █ █ █▄█▄█ \n" + + " █ █ ▀▄▄▀█ █ █ █ █ █ █▄▄ ▀█▄█▀ █ █ \n" + + "\n" + + "\033[32m :: Warm-Flow :: (v" + WarmFlowProperties.class.getPackage() + .getImplementationVersion() + ")\033[0m\n"); + } + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/constant/ExceptionCons.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/constant/ExceptionCons.java new file mode 100644 index 000000000..9ffbc03d0 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/constant/ExceptionCons.java @@ -0,0 +1,152 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.constant; + +/** + * 工作流中用到的一些常量 + * + * @author warm + * @since 2023/3/30 14:05 + */ +public class ExceptionCons { + + public static final String SAME_CONDITION_VALUE = "中间节点,同一个节点不能有相同跳转类型,跳转同一个目标节点!"; + + public static final String SAME_CONDITION_NODE = "互斥网关,同一个节点不能有相同跳转条件,跳转同一个目标节点!"; + + public static final String SAME_DEST_NODE = "并行网关,同一个节点不能跳转同一个目标节点!"; + + public static final String MUL_START_NODE = "开始节点不能超过1个!"; + + public static final String MUL_SKIP_BETWEEN = "不可同时通过或者退回到多个中间节点,必须先流转到网关节点!"; + + public static final String MUL_START_SKIP = "节点流转条件不能超过1个!"; + + public static final String LOST_START_NODE = "流程缺少开始节点!"; + + public static final String LOST_NODE_CODE = "节点编码缺失"; + + public static final String MUST_SKIP = "开始或者中间节点必须画跳转线"; + + public static final String SAME_NODE_CODE = "同一流程中节点编码重复!"; + + public static final String NULL_DEST_NODE = "无法他跳转,未配置目标节点!"; + + public static final String NULL_SKIP_TYPE = "未找到跳转类型匹配的目标节点!"; + + public static final String NULL_CONDITION_VALUE_NODE = "未找到跳转条件,不支持跳转!"; + + public static final String NULL_CONDITION_VALUE = "跳转条件不能为空!"; + + public static final String FIRST_FORBID_BACK = "禁止退回到第一个节点"; + + public static final String NULL_ROLE_NODE = "无法跳转到该节点,请检查当前用户是否有权限!"; + + public static final String LOST_DEST_NODE = "目标节点为空!"; + + public static final String LOST_CUR_NODE = "当前流程节点丢失!"; + + public static final String NULL_NODE_CODE = "目标节点编码不存在!"; + + public static final String NULL_BUSINESS_ID = "业务id为空!"; + + public static final String NULL_FLOW_CODE = "流程编码缺失!"; + + public static final String NOT_FOUNT_DEF = "流程定义不存在!"; + + public static final String NOT_FOUNT_INSTANCE = "流程实例获取失败!"; + + public static final String NULL_INSTANCE_ID = "流程实例id不能为空!"; + + public static final String NULL_TASK_ID = "任务id不能为空!"; + + public static final String NOT_FOUNT_TASK = "未找到待办任务!"; + + public static final String TASK_NOT_ONE = "此接口不能同时跳转多个待办任务,请更换!"; + + public static final String NOT_DEFINITION_ID = "流程定义id不能为空!"; + + public static final String NOT_NODE_DATA = "流程节点数据缺失!"; + + public static final String EXIST_START_TASK = "流程定义已开启过审批任务,不可操作!"; + + public static final String FLOW_FINISH = "流程已完成!"; + + public static final String NOT_AUTHORITY = "请检查当前用户是否有权限!"; + + public static final String SIGN_NULL_HANDLER = "会签票签时,办理人标识不能为空"; + + public static final String REDUCTION_SIGN_ONE_ERROR = "办理人不足或者只有一人,不可减签"; + + public static final String IS_ALREADY_SIGN = "已经是待办人,不可加签"; + + public static final String IS_ALREADY_TRANSFER = "已经是转办人,不可转办"; + + public static final String IS_ALREADY_DEPUTE = "已经是受托人,不可委托"; + + public static final String NOT_ACTIVITY = "当前流程定义或者实例已经挂起,请先激活"; + + public static final String NOT_DEFINITION_ACTIVITY = "当前流程定义已挂起,不可开启新的流程"; + + public static final String DEFINITION_ALREADY_ACTIVITY = "当前流程定义已经激活"; + + public static final String DEFINITION_ALREADY_SUSPENDED = "当前流程定义已经挂起"; + + public static final String INSTANCE_ALREADY_ACTIVITY = "当前流程实例已经激活"; + + public static final String INSTANCE_ALREADY_SUSPENDED = "当前流程实例已经挂起"; + + public static final String FORM_ALREADY_PUBLISH = "当前表单状态已发布"; + + public static final String FORM_ALREADY_UN_PUBLISH = "当前表单状态未发布"; + + public static final String FORM_NOT_ONE = "表单数据错误, 请联系管理员排查!"; + + public static final String ID_EMPTY = "ID不能为空"; + + public static final String NOT_DEF_PROMOTER_NOT_CANCEL = "不是当前流程的发起人,无法撤销"; + + public static final String HANDLER_NOT_EMPTY = "办理人不能为空"; + + public static final String TAR_NOT_GATEWAY = "目标节点不能是网关节点!"; + + public static final String NOT_FOUND_FLOW_TASK = "未获取到流程任务"; + + public static final String FLOW_HAVE_USELESS_SKIP = "存在无用的跳转"; + + public static final String NULL_TRANSFER_HANDLER = "转办对象不能为空"; + + public static final String NULL_DEPUTE_HANDLER = "委托对象不能为空"; + + public static final String NULL_ADD_SIGNATURE_HANDLER = "加签对象不能为空"; + + public static final String NULL_REDUCTION_SIGNATURE_HANDLER = "减签对象不能为空"; + + public static final String READ_IS_ERROR = "读取is流失败"; + + public static final String EXIST_USE_FORM = "流程表单已使用,不可操作!"; + + public static final String NOT_FOUNT_LAST_TASK = "未找到前置任务!"; + + public static final String NOT_FOUNT_HANDLED_TASK = "未找到您已办理过的任务!"; + + public static final String NOT_FOUNT_HANDLED_TASK_HANDLER = "拿回的任务未办理!"; + + public static final String START_NODE_NOT_ALLOW_JUMP = "开始节点不允许跳转!"; + + public static final String NOT_DRAW_FLOW_ERROR = "未绘制流程图,不可发布"; + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/constant/FlowCons.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/constant/FlowCons.java new file mode 100644 index 000000000..246003249 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/constant/FlowCons.java @@ -0,0 +1,68 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.constant; + +import java.util.regex.Pattern; + +/** + * warm-flow常量 + * + * @author warm + */ +public class FlowCons { + + /** + * 分隔符 + */ + public static final String SPLIT_AT = "@@"; + public static final String SPLIT_VERTICAL = "\\|"; + public static final String DEFAULT = "default"; + public static final String SPEL = "spel"; + public static final String SNEL = "snel"; + + public static final Pattern LISTENER_PATTERN = Pattern.compile("^([^()]*)(.*)$"); + + /** + * 权限标识中的发起人标识符,办理过程中进行替换 + */ + public static final String WARMFLOWINITIATOR = "warmFlowInitiator"; + + /** + * 监听器参数 + */ + public static final String WARM_LISTENER_PARAM = "WarmListenerParam"; + + /** + * 表单自定义状态 + * 内置表单 + */ + public static final String FORM_CUSTOM_Y = "Y"; + /** + * 外挂表单路径 + */ + public static final String FORM_CUSTOM_N = "N"; + + /** + * 表单数据 + */ + public static final String FORM_DATA = "formData"; + + + public static final String PREVIOUS = "previous"; + + public static final String SUFFIX = "suffix"; + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/dto/ApiResult.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/dto/ApiResult.java new file mode 100644 index 000000000..59bf22c7d --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/dto/ApiResult.java @@ -0,0 +1,96 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.dto; + +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; + +/** + * 响应信息主体 + * + * @author ruoyi + */ +@Setter +@Getter +public class ApiResult implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 成功 + */ + public static final int SUCCESS = 200; + + /** + * 失败 + */ + public static final int FAIL = 500; + + private int code; + + private String msg; + + private T data; + + public static ApiResult ok() { + return restResult(null, SUCCESS, "操作成功"); + } + + public static ApiResult ok(T data) { + return restResult(data, SUCCESS, "操作成功"); + } + + public static ApiResult ok(T data, String msg) { + return restResult(data, SUCCESS, msg); + } + + public static ApiResult fail() { + return restResult(null, FAIL, "操作失败"); + } + + public static ApiResult fail(String msg) { + return restResult(null, FAIL, msg); + } + + public static ApiResult fail(T data) { + return restResult(data, FAIL, "操作失败"); + } + + public static ApiResult fail(T data, String msg) { + return restResult(data, FAIL, msg); + } + + public static ApiResult fail(int code, String msg) { + return restResult(null, code, msg); + } + + private static ApiResult restResult(T data, int code, String msg) { + ApiResult apiResult = new ApiResult<>(); + apiResult.setCode(code); + apiResult.setData(data); + apiResult.setMsg(msg); + return apiResult; + } + + public static Boolean isError(ApiResult ret) { + return !isSuccess(ret); + } + + public static Boolean isSuccess(ApiResult ret) { + return ApiResult.SUCCESS == ret.getCode(); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/dto/DefChart.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/dto/DefChart.java new file mode 100644 index 000000000..925aceed5 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/dto/DefChart.java @@ -0,0 +1,50 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.dto; + + +import lombok.Getter; +import lombok.Setter; + +import java.util.ArrayList; +import java.util.List; + + +/** + * 流程图所需数据集合 + * + * @author warm + * @since 2023/3/30 14:27 + */ +@Getter +@Setter +public class DefChart { + /** + * 流程图所需的流程定义 + */ + private DefJson defJson = new DefJson(); + + /** + * 流程图所需的流程节点 + */ + private List nodeJsonList = new ArrayList<>(); + + /** + * 流程图所需的流程跳转 + */ + private List skipJsonList = new ArrayList<>(); + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/dto/DefJson.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/dto/DefJson.java new file mode 100644 index 000000000..f693274c8 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/dto/DefJson.java @@ -0,0 +1,292 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.dto; +import org.dromara.warm.flow.entity.*; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.experimental.Accessors; +import org.dromara.warm.flow.FlowEngine; +import org.dromara.warm.flow.entity.FlowDefinition; +import org.dromara.warm.flow.entity.FlowInstance; +import org.dromara.warm.flow.entity.FlowNode; +import org.dromara.warm.flow.entity.FlowSkip; + + + +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 流程定义json对象 + * + * @author warm + * @since 2023-03-29 + */ +@Setter +@Getter +@Accessors(chain = true) +@ToString +public class DefJson { + + /** + * 主键 + */ + private Long id; + + /** + * 流程编码 + */ + private String flowCode; + + /** + * 流程名称 + */ + private String flowName; + + /** + * 设计器模型(CLASSICS经典模型 MIMIC仿钉钉模型) + */ + private String modelValue; + + /** + * 流程类别 + */ + private String category; + + /** + * 流程版本 + */ + private String version; + + /** + * 是否发布(0未开启 1开启) + */ + private Integer isPublish; + + /** + * 审批表单是否自定义(Y=是 N=否) + */ + private String formCustom; + + /** + * 审批表单是否自定义(Y=是 N=否) + */ + private String formPath; + + /** + * 监听器类型 + */ + private String listenerType; + + /** + * 监听器路径 + */ + private String listenerPath; + + /** + * 实例对象 + */ + private FlowInstance instance; + + /** + * 扩展字段,预留给业务系统使用 + */ + private String ext; + + /** + * 扩展map,保存业务自定义扩展属性 + */ + private Map extMap; + + /** + * 所有节点结合 + */ + private List nodeList = new ArrayList<>(); + + /** + * 流程状态对应的三原色 + */ + private List chartStatusColor; + + /** + * 顶部信息: 比如流程名称等 + */ + private String topText; + + /** + * 顶部信息: 流程名称是否显示 + */ + private boolean topTextShow; + + private String createBy; + + private String updateBy; + + /** + * 流程类别 + */ + private List categoryList; + + /** + * 自定义表单的唯一标识:如formCode+version + */ + private List formPathList; + + + public String getModelValue() { + if (StrUtil.isEmpty(modelValue)) { + modelValue = "CLASSICS"; + } + return modelValue; + } + + public static DefJson copyDef(FlowDefinition definition) { + DefJson defJson = new DefJson() + .setFlowCode(definition.getFlowCode()) + .setFlowName(definition.getFlowName()) + .setModelValue(definition.getModelValue()) + .setVersion(definition.getVersion()) + .setIsPublish(definition.getIsPublish()) + .setCategory(definition.getCategory()) + .setFormCustom(definition.getFormCustom()) + .setFormPath(definition.getFormPath()) + .setListenerType(definition.getListenerType()) + .setListenerPath(definition.getListenerPath()) + .setExt(definition.getExt()) + .setCreateBy(definition.getCreateBy()) + .setUpdateBy(definition.getUpdateBy()); + + List nodeList = new ArrayList<>(); + defJson.setNodeList(nodeList); + for (FlowNode node : definition.getNodeList()) { + // 向节点中添加子节点 + NodeJson nodeJson = new NodeJson() + .setNodeType(node.getNodeType()) + .setNodeCode(node.getNodeCode()) + .setNodeName(node.getNodeName()) + .setPermissionFlag(node.getPermissionFlag()) + .setNodeRatio(node.getNodeRatio()) + .setCoordinate(node.getCoordinate()) + .setAnyNodeSkip(node.getAnyNodeSkip()) + .setListenerType(node.getListenerType()) + .setListenerPath(node.getListenerPath()) + .setFormCustom(node.getFormCustom()) + .setFormPath(node.getFormPath()) + .setExt(node.getExt()) + .setCreateBy(node.getCreateBy()) + .setUpdateBy(node.getUpdateBy()); + nodeList.add(nodeJson); + + List skipList = new ArrayList<>(); + nodeJson.setSkipList(skipList); + if (CollUtil.isNotEmpty(node.getSkipList())) { + for (FlowSkip skip : node.getSkipList()) { + skipList.add(new SkipJson() + .setCoordinate(skip.getCoordinate()) + .setSkipType(skip.getSkipType()) + .setSkipName(skip.getSkipName()) + .setSkipCondition(skip.getSkipCondition()) + .setNowNodeCode(skip.getNowNodeCode()) + .setNextNodeCode(skip.getNextNodeCode()) + .setCreateBy(skip.getCreateBy()) + .setUpdateBy(skip.getUpdateBy())); + } + } + + } + return defJson; + } + + public static FlowDefinition copyDef(DefJson defJson) { + FlowDefinition definition = new FlowDefinition() + .setId(defJson.getId()) + .setFlowCode(defJson.getFlowCode()) + .setFlowName(defJson.getFlowName()) + .setModelValue(defJson.getModelValue()) + .setVersion(defJson.getVersion()) + .setCategory(defJson.getCategory()) + .setFormCustom(defJson.getFormCustom()) + .setFormPath(defJson.getFormPath()) + .setListenerType(defJson.getListenerType()) + .setListenerPath(defJson.getListenerPath()) + .setExt(defJson.getExt()) + .setCreateBy(defJson.getCreateBy()) + .setUpdateBy(defJson.getUpdateBy()); + + List nodeList = new ArrayList<>(); + definition.setNodeList(nodeList); + for (NodeJson nodeJson : defJson.getNodeList()) { + // 向节点中添加子节点 + FlowNode node = new FlowNode() + .setNodeType(nodeJson.getNodeType()) + .setNodeCode(nodeJson.getNodeCode()) + .setNodeName(nodeJson.getNodeName()) + .setPermissionFlag(nodeJson.getPermissionFlag()) + .setNodeRatio(nodeJson.getNodeRatio() != null ? nodeJson.getNodeRatio() : "0") + .setCoordinate(nodeJson.getCoordinate()) + .setAnyNodeSkip(nodeJson.getAnyNodeSkip()) + .setListenerType(nodeJson.getListenerType()) + .setListenerPath(nodeJson.getListenerPath()) + .setFormCustom(nodeJson.getFormCustom()) + .setFormPath(nodeJson.getFormPath()) + .setExt(nodeJson.getExt()) + .setCreateBy(nodeJson.getCreateBy()) + .setUpdateBy(nodeJson.getUpdateBy()); + nodeList.add(node); + + List skipList = new ArrayList<>(); + node.setSkipList(skipList); + + if (CollUtil.isNotEmpty(nodeJson.getSkipList())) { + for (SkipJson skipJson : nodeJson.getSkipList()) { + skipList.add(new FlowSkip() + .setCoordinate(skipJson.getCoordinate()) + .setSkipType(skipJson.getSkipType()) + .setSkipName(skipJson.getSkipName()) + .setSkipCondition(skipJson.getSkipCondition()) + .setNowNodeCode(skipJson.getNowNodeCode()) + .setNextNodeCode(skipJson.getNextNodeCode()) + .setCreateBy(skipJson.getCreateBy()) + .setUpdateBy(skipJson.getUpdateBy())); + } + } + + } + return definition; + } + + public static FlowCombine copyCombine(DefJson defJson) { + FlowDefinition definition = copyDef(defJson); + FlowCombine flowCombine = new FlowCombine(); + flowCombine.setDefinition(definition); + flowCombine.setAllNodes(definition.getNodeList()); + List skipList = definition.getNodeList().stream() + .map(FlowNode::getSkipList) + .filter(Objects::nonNull) + .flatMap(List::stream) + .collect(Collectors.toList()); + + flowCombine.setAllSkips(skipList); + return flowCombine; + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/dto/FlowCombine.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/dto/FlowCombine.java new file mode 100644 index 000000000..a57f3fa01 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/dto/FlowCombine.java @@ -0,0 +1,59 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.dto; +import org.dromara.warm.flow.entity.*; + + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.dromara.warm.flow.FlowEngine; +import org.dromara.warm.flow.entity.FlowDefinition; +import org.dromara.warm.flow.entity.FlowNode; +import org.dromara.warm.flow.entity.FlowSkip; + +import java.util.ArrayList; +import java.util.List; + + +/** + * 流程数据集合 + * + * @author warm + * @since 2023/3/30 14:27 + */ +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class FlowCombine { + /** + * 所有的流程定义 + */ + private FlowDefinition definition = new FlowDefinition(); + + /** + * 所有的流程节点 + */ + private List allNodes = new ArrayList<>(); + + /** + * 所有的流程节点跳转关联 + */ + private List allSkips = new ArrayList<>(); + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/dto/FlowDto.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/dto/FlowDto.java new file mode 100644 index 000000000..5e26facaa --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/dto/FlowDto.java @@ -0,0 +1,42 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.dto; + + +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; + +/** + * @author vanlin + * @since 2024-9-24 11:11 + */ +@Getter +@Setter +public class FlowDto implements Serializable { + + /** + * ID + */ + private Long id; + + /** + * 数据 + */ + private Object data; + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/dto/FlowPage.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/dto/FlowPage.java new file mode 100644 index 000000000..b486bc3bc --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/dto/FlowPage.java @@ -0,0 +1,70 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.dto; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.List; + +/** + * 表格分页数据对象 + * + * @author ruoyi + */ +@Getter +@Setter +@NoArgsConstructor +@Accessors(chain = true) +public class FlowPage implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 总记录数 + */ + private long total; + + /** + * 列表数据 + */ + private List rows; + + /** + * 消息状态码 + */ + private int code; + + /** + * 消息内容 + */ + private String msg; + + /** + * 分页 + * + * @param list 列表数据 + * @param total 总记录数 + */ + public FlowPage(List list, int total) { + this.rows = list; + this.total = total; + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/dto/FlowParams.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/dto/FlowParams.java new file mode 100644 index 000000000..81a3e3929 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/dto/FlowParams.java @@ -0,0 +1,340 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.dto; + +import org.dromara.warm.flow.json.JsonUtil; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; + +import lombok.Getter; +import org.dromara.warm.flow.FlowEngine; +import org.dromara.warm.flow.handler.PermissionHandler; + + + +import java.io.Serializable; +import java.util.*; + +/** + * 工作流内置参数 + * + * @author warm + * @since 2023/3/31 17:18 + */ +public class FlowParams implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 流程编码 + */ + @Getter + private String flowCode; + + /** + * 当前办理人唯一标识:就是确定唯一用的,如用户id,通常用来入库,记录流程实例创建人,办理人 + */ + private String handler; + + /** + * 节点编码(如果要指定跳转节点,传入) + */ + @Getter + private String nodeCode; + + /** + * 用户权限标识:和办理权限有关,是否有办理权限,通俗来说,就是设计器里面预设的办理人,和这个标识是否有交集,有交集就可以办理,审批的时候,就不会提示报错 + */ + private List permissionFlag; + + /** + * 跳转类型(PASS审批通过 REJECT退回) + */ + @Getter + private String skipType; + + /** + * 审批意见 + */ + @Getter + private String message; + + /** + * 流程变量 + */ + @Getter + private Map variable = new HashMap<>(); + + /** + * 流程实例状态 + */ + @Getter + private String flowStatus; + + /** + * 历史任务表状态 + */ + @Getter + private String hisStatus; + + /** + * 流程激活状态(0挂起 1激活) + */ + @Getter + private Integer activityStatus; + + /** + * 协作方式(1审批 2转办 3委派 4会签 5票签 6加签 7减签) + */ + @Getter + private Integer cooperateType; + + /** + * 扩展字段,预留给业务系统使用 + */ + @Getter + private String ext; + + /** + * 扩展字段,预留给业务系统使用 + */ + @Getter + private String hisTaskExt; + + /** + * 增加办理人:加签,转办,委托 + */ + @Getter + private List addHandlers; + + /** + * 减少办理人:减签,委托 + */ + @Getter + private List reductionHandlers; + + /** + * 忽略-办理权限校验(true:忽略,false:不忽略) + */ + @Getter + private boolean ignore; + + /** + * 忽略-委派处理(true:忽略,false:不忽略) + */ + @Getter + private boolean ignoreDepute; + + /** + * 忽略-会签票签处理(true:忽略,false:不忽略) + */ + @Getter + private boolean ignoreCooperate; + + /** + * 执行的下个任务的办理人 + */ + @Getter + private String[] nextHandler; + + /** + * 下个任务处理人配置类型(true-追加,false-覆盖,默认false) + */ + @Getter + private boolean nextHandlerAppend; + + public FlowParams() { + } + + public FlowParams(String skipType, String message, Map variable) { + this.skipType = skipType; + this.message = message; + this.variable = variable; + } + + public FlowParams(String nodeCode, String skipType, String message, Map variable) { + this.nodeCode = nodeCode; + this.skipType = skipType; + this.message = message; + this.variable = variable; + } + + public FlowParams(String skipType, String message, Map variable + , String flowStatus, String hisStatus) { + this.skipType = skipType; + this.message = message; + this.variable = variable; + this.flowStatus = flowStatus; + this.hisStatus = hisStatus; + } + + public FlowParams(String nodeCode, String skipType, String message, Map variable + , String flowStatus, String hisStatus) { + this.nodeCode = nodeCode; + this.skipType = skipType; + this.message = message; + this.variable = variable; + this.flowStatus = flowStatus; + this.hisStatus = hisStatus; + } + + public static FlowParams build() { + return new FlowParams(); + } + + public FlowParams flowCode(String flowCode) { + this.flowCode = flowCode; + return this; + } + + public FlowParams handler(String handler) { + this.handler = handler; + return this; + } + + public FlowParams nodeCode(String nodeCode) { + this.nodeCode = nodeCode; + return this; + } + + public FlowParams permissionFlag(List permissionFlag) { + this.permissionFlag = permissionFlag; + return this; + } + + public FlowParams message(String message) { + this.message = message; + return this; + } + + public FlowParams variable(Map variable) { + this.variable = variable; + return this; + } + + public FlowParams flowStatus(String flowStatus) { + this.flowStatus = flowStatus; + return this; + } + + public FlowParams hisStatus(String hisStatus) { + this.hisStatus = hisStatus; + return this; + } + + public FlowParams activityStatus(Integer activityStatus) { + this.activityStatus = activityStatus; + return this; + } + + public FlowParams cooperateType(Integer cooperateType) { + this.cooperateType = cooperateType; + return this; + } + + public FlowParams ext(String ext) { + this.ext = ext; + return this; + } + + public FlowParams hisTaskExt(String hisTaskExt) { + this.hisTaskExt = hisTaskExt; + return this; + } + + public FlowParams nextHandler(String... nextHandler) { + // 如果外部传递 null , 就忽略 , 维持节点本身审批,防止 null 数据变成 [null] + if (nextHandler == null) { + return this; + } + this.nextHandler = Arrays.stream(nextHandler).filter(Objects::nonNull).toArray(String[]::new); + return this; + } + + public String getVariableStr() { + return JsonUtil.objToStr(variable); + } + + public String getHandler() { + if (StrUtil.isEmpty(handler)) { + PermissionHandler permissionHandler = FlowEngine.permissionHandler(); + if (permissionHandler != null) { + try { + handler = permissionHandler.getHandler(); + } catch (Exception ignored) { + } + } + } + return handler; + } + + public List getPermissionFlag() { + if (CollUtil.isEmpty(permissionFlag)) { + PermissionHandler permissionHandler = FlowEngine.permissionHandler(); + if (permissionHandler != null) { + try { + permissionFlag = permissionHandler.permissions(); + } catch (Exception ignored) { + } + } + } + return permissionFlag; + } + + public FlowParams skipType(String skipType) { + this.skipType = skipType; + return this; + } + + public FlowParams addHandlers(List addHandlers) { + this.addHandlers = addHandlers; + return this; + } + + public FlowParams reductionHandlers(List reductionHandlers) { + this.reductionHandlers = reductionHandlers; + return this; + } + + public FlowParams ignore(boolean ignore) { + this.ignore = ignore; + return this; + } + + public FlowParams ignoreDepute(boolean ignoreDepute) { + this.ignoreDepute = ignoreDepute; + return this; + } + + public FlowParams ignoreCooperate(boolean ignoreCooperate) { + this.ignoreCooperate = ignoreCooperate; + return this; + } + + public FlowParams nextHandlerAppend(boolean nextHandlerAppend) { + this.nextHandlerAppend = nextHandlerAppend; + return this; + } + + public FlowParams formData(Map formData) { + if (this.variable == null) { + this.variable = new HashMap<>(); + } + this.variable.put("formData", formData); + return this; + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/dto/NodeJson.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/dto/NodeJson.java new file mode 100644 index 000000000..292e3d5e3 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/dto/NodeJson.java @@ -0,0 +1,125 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.dto; + +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; +import org.dromara.warm.flow.utils.MapUtil; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 流程节点对象Vo + * + * @author warm + * @since 2023-03-29 + */ +@Setter +@Getter +@Accessors(chain = true) +public class NodeJson { + + /** + * 节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) + */ + private Integer nodeType; + /** + * 流程节点编码 每个流程的nodeCode是唯一的,即definitionId+nodeCode唯一,在数据库层面做了控制 + */ + private String nodeCode; + /** + * 流程节点名称 + */ + private String nodeName; + /** + * 流程节点版本 + */ + private String version; + /** + * 权限标识(权限类型:权限标识,可以多个,用@@隔开) + */ + private String permissionFlag; + /** + * 流程签署比例值 + */ + private String nodeRatio; + /** + * 流程节点坐标 + */ + private String coordinate; + /** + * 任意结点跳转 + */ + private String anyNodeSkip; + /** + * 监听器类型 + */ + private String listenerType; + /** + * 监听器路径 + */ + private String listenerPath; + /** + * 审批表单是否自定义(Y=是 N=否) + */ + private String formCustom; + + /** + * 审批表单是否自定义(Y=是 N=否) + */ + private String formPath; + + /** + * 节点扩展属性 + */ + private String ext; + + /** + * 办理状态: 0未办理 1待办理 2已办理 + */ + private Integer status; + + /** + * 扩展map,保存业务自定义扩展属性 + */ + private Map extMap; + + /** + * 流程图节点提示内容 + */ + private PromptContent promptContent; + + /** + * 跳转条件 + */ + private List skipList = new ArrayList<>(); + + private String createBy; + + private String updateBy; + + public Map getExtMap() { + if (MapUtil.isEmpty(extMap)) { + extMap = new HashMap<>(); + } + return extMap; + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/dto/PathWayData.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/dto/PathWayData.java new file mode 100644 index 000000000..d485d319a --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/dto/PathWayData.java @@ -0,0 +1,69 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.dto; + + +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; +import org.dromara.warm.flow.entity.FlowNode; +import org.dromara.warm.flow.entity.FlowSkip; + +import java.util.ArrayList; +import java.util.List; + + +/** + * 办理过程中途径数据,用于渲染流程图 + * + * @author warm + * @since 2025/1/4 + */ +@Getter +@Setter +@Accessors(chain = true) +public class PathWayData { + /** + * 流程定义id + */ + private Long defId; + + /** + * 流程实例id + */ + private Long insId; + + /** + * 跳转类型(PASS审批通过 REJECT退回) + */ + private String skipType; + + /** + * 目标结点集合 + */ + private List targetNodes = new ArrayList<>(); + + /** + * 途径结点集合 + */ + private List pathWayNodes = new ArrayList<>(); + + /** + * 途径流程跳转线 + */ + private List pathWaySkips = new ArrayList<>(); + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/dto/PromptContent.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/dto/PromptContent.java new file mode 100644 index 000000000..56eb737ff --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/dto/PromptContent.java @@ -0,0 +1,80 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.util.List; +import java.util.Map; + +/** + * 提示信息 + * + * @author warm + * @since 2025/6/5 + */ +@Getter +@Setter +@Accessors(chain = true) +@AllArgsConstructor +@NoArgsConstructor +public class PromptContent { + /** + * 弹窗样式 + */ + private Map dialogStyle; + /** + * 提示信息 + */ + private List info; + + /** + * 提示信息项 + */ + @Getter + @Setter + @Accessors(chain = true) + @AllArgsConstructor + @NoArgsConstructor + public static class InfoItem { + /** + * 前缀 + */ + private String prefix; + /** + * 前缀样式 + */ + private Map prefixStyle; + /** + * 内容 + */ + private String content; + /** + * 内容样式 + */ + private Map contentStyle; + /** + * 行样式 + */ + private Map rowStyle; + + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/dto/SkipJson.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/dto/SkipJson.java new file mode 100644 index 000000000..64fdefcf2 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/dto/SkipJson.java @@ -0,0 +1,85 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.dto; + +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.util.List; +import java.util.Map; + +/** + * 节点跳转关联对象Vo + * + * @author warm + * @since 2023-03-29 + */ +@Setter +@Getter +@Accessors(chain = true) +public class SkipJson { + + /** + * 当前流程节点的编码 + */ + private String nowNodeCode; + + /** + * 下一个流程节点的编码 + */ + private String nextNodeCode; + + /** + * 跳转名称 + */ + private String skipName; + + /** + * 跳转类型(PASS审批通过 REJECT退回) + */ + private String skipType; + + /** + * 跳转条件 + */ + private String skipCondition; + + /** + * 流程跳转坐标 + */ + private String coordinate; + + /** + * 办理状态: 0未办理 1待办理 2已办理 + */ + private Integer status; + + /** + * 扩展map,保存业务自定义扩展属性 + */ + private Map extMap; + + /** + * 流程图节点提示内容 + */ + private List promptContent; + + private String createBy; + + private String updateBy; + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/dto/Tree.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/dto/Tree.java new file mode 100644 index 000000000..384758954 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/dto/Tree.java @@ -0,0 +1,62 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +/** + * 页面树列表 + * + * @author ruoyi + */ +@Getter +@Setter +@Accessors(chain = true) +@AllArgsConstructor +@NoArgsConstructor +public class Tree implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + private String id; + + /** + * 名称 + */ + private String name; + + /** + * 父ID + */ + private String parentId; + + /** + * 子 + */ + private List children = new ArrayList<>(); + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/entity/FlowDefinition.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/entity/FlowDefinition.java new file mode 100644 index 000000000..468d77c83 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/entity/FlowDefinition.java @@ -0,0 +1,154 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.entity; +import org.dromara.warm.flow.entity.RootEntity; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.experimental.Accessors; +import org.dromara.warm.flow.entity.FlowDefinition; +import org.dromara.warm.flow.entity.FlowNode; +import org.dromara.warm.flow.entity.FlowUser; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +/** + * 流程定义 + */ +@Data +@Accessors(chain = true) +public class FlowDefinition implements RootEntity { + + /** + * 主键 + */ + private Long id; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 创建人 + */ + private String createBy; + + /** + * 更新人 + */ + private String updateBy; + + /** + * + * 删除标记 + */ + @TableLogic(value = "0", delval = "1") + private String delFlag; + + /** + * 流程编码 + */ + private String flowCode; + + /** + * 流程名称 + */ + private String flowName; + + /** + * 设计器模型(CLASSICS经典模型 MIMIC仿钉钉模型) + */ + private String modelValue; + + /** + * 流程类别 + */ + private String category; + + /** + * 流程版本 + */ + private String version; + + /** + * 是否发布(0未开启 1开启) + */ + private Integer isPublish; + + /** + * 审批表单是否自定义(Y是 N否) + */ + private String formCustom; + + /** + * 审批表单路径 + */ + private String formPath; + + /** + * 流程激活状态(0挂起 1激活) + */ + private Integer activityStatus; + + /** + * 监听器类型 + */ + private String listenerType; + + /** + * 监听器路径 + */ + private String listenerPath; + + /** + * 扩展字段,预留给业务系统使用 + */ + private String ext; + + @TableField(exist = false) + private List nodeList = new ArrayList<>(); + + @TableField(exist = false) + private List userList = new ArrayList<>(); + + + /** + * 复制当前对象(不含主键、时间字段) + */ + public FlowDefinition copy() { + return new FlowDefinition() + .setDelFlag(this.getDelFlag()) + .setFlowCode(this.getFlowCode()) + .setFlowName(this.getFlowName()) + .setModelValue(this.getModelValue()) + .setCategory(this.getCategory()) + .setVersion(this.getVersion()) + .setFormCustom(this.getFormCustom()) + .setFormPath(this.getFormPath()) + .setListenerType(this.getListenerType()) + .setListenerPath(this.getListenerPath()) + .setExt(this.getExt()) + .setCreateBy(this.getCreateBy()) + .setUpdateBy(this.getUpdateBy()); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/entity/FlowHisTask.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/entity/FlowHisTask.java new file mode 100644 index 000000000..589b17845 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/entity/FlowHisTask.java @@ -0,0 +1,171 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.entity; +import org.dromara.warm.flow.json.JsonUtil; + +import org.dromara.warm.flow.entity.RootEntity; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.experimental.Accessors; +import org.dromara.warm.flow.entity.FlowHisTask; + +import java.util.Date; +import java.util.List; +/** + * 历史任务记录 + */ +@Data +@Accessors(chain = true) +public class FlowHisTask implements RootEntity { + + /** + * 主键 + */ + private Long id; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 删除标记 + */ + @TableLogic(value = "0", delval = "1") + private String delFlag; + + /** + * 对应flow_definition表的id + */ + private Long definitionId; + + /** + * 流程名称 + */ + @TableField(exist = false) + private String flowName; + + /** + * 流程实例表id + */ + private Long instanceId; + + /** + * 任务表id + */ + private Long taskId; + + /** + * 协作方式(1审批 2转办 3委派 4会签 5票签 6加签 7减签) + */ + private Integer cooperateType; + + /** + * 业务id + */ + @TableField(exist = false) + private String businessId; + + /** + * 开始节点编码 + */ + private String nodeCode; + + /** + * 开始节点名称 + */ + private String nodeName; + + /** + * 开始节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) + */ + private Integer nodeType; + + /** + * 目标节点编码 + */ + private String targetNodeCode; + + /** + * 结束节点名称 + */ + private String targetNodeName; + + /** + * 审批者 + */ + private String approver; + + /** + * 协作人(只有转办、会签、票签、委派) + */ + private String collaborator; + + /** + * 权限标识 permissionFlag的list形式 + */ + @TableField(exist = false) + private List permissionList; + + /** + * 跳转类型(PASS通过 REJECT退回 NONE无动作) + */ + private String skipType; + + /** + * 流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回) + */ + private String flowStatus; + + /** + * 审批意见 + */ + private String message; + + /** + * 流程变量 + */ + private String variable; + + /** + * 业务详情 存业务类的json + */ + private String ext; + + /** + * 审批表单是否自定义(Y=是 N=否) + */ + private String formCustom; + + /** + * 审批表单路径 + */ + private String formPath; + + + /** + * 流程变量转 map + */ + public java.util.Map getVariableMap() { + return JsonUtil.strToMap(getVariable()); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/entity/FlowInstance.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/entity/FlowInstance.java new file mode 100644 index 000000000..5930ba577 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/entity/FlowInstance.java @@ -0,0 +1,140 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.entity; +import org.dromara.warm.flow.json.JsonUtil; + +import org.dromara.warm.flow.entity.RootEntity; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.experimental.Accessors; +import org.dromara.warm.flow.entity.FlowInstance; + +import java.util.Date; +/** + * 流程实例 + */ +@Data +@Accessors(chain = true) +public class FlowInstance implements RootEntity { + + /** + * 主键 + */ + private Long id; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 创建人 + */ + private String createBy; + + /** + * 更新人 + */ + private String updateBy; + + /** + * 删除标记 + */ + @TableLogic(value = "0", delval = "1") + private String delFlag; + + /** + * 对应flow_definition表的id + */ + private Long definitionId; + + /** + * 流程名称 + */ + @TableField(exist = false) + private String flowName; + + /** + * 业务id + */ + private String businessId; + + /** + * 节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) + */ + private Integer nodeType; + + /** + * 流程节点编码 每个流程的nodeCode是唯一的,即definitionId+nodeCode唯一,在数据库层面做了控制 + */ + private String nodeCode; + + /** + * 流程节点名称 + */ + private String nodeName; + + /** + * 流程变量 + */ + private String variable; + + /** + * 流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回) + */ + private String flowStatus; + + /** + * 流程激活状态(0挂起 1激活) + */ + private Integer activityStatus; + + /** + * 审批表单是否自定义(Y=是 N=否) + */ + @TableField(exist = false) + private String formCustom; + + /** + * 审批表单是否自定义(Y=是 N=否) + */ + @TableField(exist = false) + private String formPath; + + /** + * 流程定义json + */ + private String defJson; + + /** + * 扩展字段,预留给业务系统使用 + */ + private String ext; + + + /** + * 流程变量转 map + */ + public java.util.Map getVariableMap() { + return JsonUtil.strToMap(getVariable()); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/entity/FlowNode.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/entity/FlowNode.java new file mode 100644 index 000000000..1922b9706 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/entity/FlowNode.java @@ -0,0 +1,157 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.entity; +import org.dromara.warm.flow.entity.RootEntity; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.experimental.Accessors; +import org.dromara.warm.flow.entity.FlowNode; +import org.dromara.warm.flow.entity.FlowSkip; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +/** + * 流程节点 + */ +@Data +@Accessors(chain = true) +public class FlowNode implements RootEntity { + + /** + * 节点跳转列表(非表字段) + */ + @TableField(exist = false) + List skipList; + + /** + * 主键 + */ + private Long id; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 创建人 + */ + private String createBy; + + /** + * 更新人 + */ + private String updateBy; + + /** + * 删除标记 + */ + @TableLogic(value = "0", delval = "1") + private String delFlag; + + /** + * 节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) + */ + private Integer nodeType; + /** + * 流程id + */ + private Long definitionId; + /** + * 流程节点编码 每个流程的nodeCode是唯一的,即definitionId+nodeCode唯一,在数据库层面做了控制 + */ + private String nodeCode; + /** + * 流程节点名称 + */ + private String nodeName; + /** + * 权限标识(权限类型:权限标识,可以多个,用@@隔开) + */ + private String permissionFlag; + /** + * 流程签署比例值 + */ + private String nodeRatio; + /** + * 流程节点坐标 + */ + private String coordinate; + /** + * 版本 + * + * @deprecated 下个版本废弃 + */ + @Deprecated + private String version; + /** + * 任意结点跳转 + */ + private String anyNodeSkip; + /** + * 监听器类型 + */ + private String listenerType; + /** + * 监听器路径 + */ + private String listenerPath; + /** + * 审批表单是否自定义(Y=是 N=否) + */ + private String formCustom; + + /** + * 审批表单路径 + */ + private String formPath; + + /** + * 节点扩展属性 + */ + private String ext; + + + /** + * 复制当前对象(不含主键、时间字段) + */ + public FlowNode copy() { + return new FlowNode() + .setDelFlag(this.getDelFlag()) + .setNodeType(this.getNodeType()) + .setDefinitionId(this.getDefinitionId()) + .setNodeCode(this.getNodeCode()) + .setNodeName(this.getNodeName()) + .setNodeRatio(this.getNodeRatio()) + .setPermissionFlag(this.getPermissionFlag()) + .setCoordinate(this.getCoordinate()) + .setVersion(this.getVersion()) + .setAnyNodeSkip(this.getAnyNodeSkip()) + .setListenerType(this.getListenerType()) + .setListenerPath(this.getListenerPath()) + .setFormCustom(this.getFormCustom()) + .setFormPath(this.getFormPath()) + .setExt(this.getExt()); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/entity/FlowSkip.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/entity/FlowSkip.java new file mode 100644 index 000000000..de7501af7 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/entity/FlowSkip.java @@ -0,0 +1,131 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.entity; +import org.dromara.warm.flow.entity.RootEntity; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.experimental.Accessors; +import org.dromara.warm.flow.entity.FlowSkip; + +import java.util.Date; +/** + * 节点跳转关联 + */ +@Data +@Accessors(chain = true) +public class FlowSkip implements RootEntity { + + /** + * 主键 + */ + private Long id; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 创建人 + */ + private String createBy; + + /** + * 更新人 + */ + private String updateBy; + + /** + * 删除标记 + */ + @TableLogic(value = "0", delval = "1") + private String delFlag; + + /** + * 流程id + */ + private Long definitionId; + + /** + * 节点id + */ + @TableField(exist = false) + private Long nodeId; + + /** + * 当前流程节点的编码 + */ + private String nowNodeCode; + + /** + * 当前节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) + */ + private Integer nowNodeType; + + /** + * 下一个流程节点的编码 + */ + private String nextNodeCode; + + /** + * 下一个节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) + */ + private Integer nextNodeType; + + /** + * 跳转名称 + */ + private String skipName; + + /** + * 跳转类型(PASS审批通过 REJECT退回) + */ + private String skipType; + + /** + * 跳转条件 + */ + private String skipCondition; + + /** + * 流程跳转坐标 + */ + private String coordinate; + + + /** + * 复制当前对象(不含主键、时间字段) + */ + public FlowSkip copy() { + return new FlowSkip() + .setDelFlag(getDelFlag()) + .setDefinitionId(getDefinitionId()) + .setNowNodeCode(getNowNodeCode()) + .setNowNodeType(getNowNodeType()) + .setNextNodeCode(getNextNodeCode()) + .setNextNodeType(getNextNodeType()) + .setSkipName(getSkipName()) + .setSkipType(getSkipType()) + .setSkipCondition(getSkipCondition()) + .setCoordinate(getCoordinate()); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/entity/FlowTask.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/entity/FlowTask.java new file mode 100644 index 000000000..42e684b5e --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/entity/FlowTask.java @@ -0,0 +1,129 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.entity; +import org.dromara.warm.flow.entity.RootEntity; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.experimental.Accessors; +import org.dromara.warm.flow.entity.FlowTask; +import org.dromara.warm.flow.entity.FlowUser; + +import java.util.Date; +import java.util.List; +/** + * 待办任务 + */ +@Data +@Accessors(chain = true) +public class FlowTask implements RootEntity { + + /** + * 主键 + */ + private Long id; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 创建人 + */ + private String createBy; + + /** + * 更新人 + */ + private String updateBy; + + /** + * 删除标记 + */ + @TableLogic(value = "0", delval = "1") + private String delFlag; + + /** + * 对应flow_definition表的id + */ + private Long definitionId; + + /** + * 流程实例表id + */ + private Long instanceId; + + /** + * 流程名称 + */ + @TableField(exist = false) + private String flowName; + + /** + * 业务id + */ + @TableField(exist = false) + private String businessId; + + /** + * 节点编码 + */ + private String nodeCode; + + /** + * 节点名称 + */ + private String nodeName; + + /** + * 节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) + */ + private Integer nodeType; + + /** + * 流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回) + */ + private String flowStatus; + + /** + * 权限标识 permissionFlag的list形式 + */ + @TableField(exist = false) + private List permissionList; + + /** + * 流程用户列表 + */ + @TableField(exist = false) + private List userList; + + /** + * 审批表单是否自定义(Y=是 N=否) + */ + private String formCustom; + + /** + * 审批表单 + */ + private String formPath; + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/entity/FlowUser.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/entity/FlowUser.java new file mode 100644 index 000000000..d3f3a5668 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/entity/FlowUser.java @@ -0,0 +1,78 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.entity; +import org.dromara.warm.flow.entity.RootEntity; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.experimental.Accessors; +import org.dromara.warm.flow.entity.FlowUser; + +import java.util.Date; +/** + * 流程用户 + */ +@Data +@Accessors(chain = true) +public class FlowUser implements RootEntity { + + /** + * 主键 + */ + private Long id; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 创建人 + */ + private String createBy; + + /** + * 更新人 + */ + private String updateBy; + + /** + * 删除标记 + */ + @TableLogic(value = "0", delval = "1") + private String delFlag; + + /** + * 人员类型(1待办任务的审批人权限 2待办任务的转办人权限 3待办任务的委托人权限) + */ + private String type; + + /** + * 权限人 + */ + private String processedBy; + + /** + * 任务表id + */ + private Long associated; + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/entity/RootEntity.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/entity/RootEntity.java new file mode 100644 index 000000000..8e6b58a06 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/entity/RootEntity.java @@ -0,0 +1,61 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.entity; + +import java.io.Serializable; +import java.util.Date; + +/** + * 流程基础entity + * + * @author warm + * @since 2023/5/17 17:23 + */ +public interface RootEntity extends Serializable { + + Long getId(); + + RootEntity setId(Long id); + + Date getCreateTime(); + + RootEntity setCreateTime(Date createTime); + + Date getUpdateTime(); + + RootEntity setUpdateTime(Date updateTime); + + default String getCreateBy() { + return null; + } + + default RootEntity setCreateBy(String createBy) { + return this; + } + + default String getUpdateBy() { + return null; + } + + default RootEntity setUpdateBy(String updateBy) { + return this; + } + + String getDelFlag(); + + RootEntity setDelFlag(String delFlag); + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/enums/ActivityStatus.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/enums/ActivityStatus.java new file mode 100644 index 000000000..eac0392ff --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/enums/ActivityStatus.java @@ -0,0 +1,57 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.enums; + +import cn.hutool.core.util.ObjectUtil; + +import lombok.AllArgsConstructor; +import lombok.Getter; + + +/** + * 激活状态 + * + * @author warm + * @since 2025/6/25 + */ +@Getter +@AllArgsConstructor +public enum ActivityStatus { + + /** + * 激活状态 + */ + SUSPENDED(0, "挂起"), + + ACTIVITY(1, "激活"); + + private final Integer key; + private final String value; + + /** + * 判断流程是否激活 + */ + public static Boolean isActivity(Integer key) { + return ObjectUtil.isNotNull(key) && (ActivityStatus.ACTIVITY.getKey().equals(key)); + } + + /** + * 判断流程是否挂起 + */ + public static Boolean isSuspended(Integer key) { + return ObjectUtil.isNotNull(key) && (ActivityStatus.SUSPENDED.getKey().equals(key)); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/enums/ChartStatus.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/enums/ChartStatus.java new file mode 100644 index 000000000..afe6c9c85 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/enums/ChartStatus.java @@ -0,0 +1,158 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.enums; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.ObjectUtil; + +import lombok.AllArgsConstructor; +import lombok.Getter; + + + + +import java.awt.*; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 流程图状态 + * + * @author warm + * @since 2023/3/31 12:16 + */ +@Getter +@AllArgsConstructor +public enum ChartStatus { + /** + * 流程图状态 + */ + NOT_DONE(0, "未办理", new Color(107,114,128)), + + TO_DO(1, "待办理", new Color(245,158,11)), + + DONE(2, "已办理", new Color(56,161,105)); + + private final Integer key; + private final String value; + private final Color color; + + private static final Map CUSTOM_COLOR = new HashMap<>(); + private static final Map CUSTOM_COLOR_CLASSICS = new HashMap<>(); + private static final Map CUSTOM_COLOR_MIMIC = new HashMap<>(); + + public static void initCustomColor(List chartStatusColor, List chartStatusColorClassics, + List chartStatusColorMimic) { + if (CollUtil.isNotEmpty(chartStatusColor) && chartStatusColor.size() == 3) { + for (int i = 0; i < chartStatusColor.size(); i++) { + String statusColor = chartStatusColor.get(i); + if (StrUtil.isNotEmpty(statusColor)) { + String[] colorArr = statusColor.split(","); + if (colorArr.length == 3) { + ChartStatus.CUSTOM_COLOR.put(i, new Color(Integer.parseInt(colorArr[0]), Integer.parseInt(colorArr[1]), Integer.parseInt(colorArr[2]))); + } + } + } + } + if (CollUtil.isNotEmpty(chartStatusColorClassics) && chartStatusColorClassics.size() == 3) { + for (int i = 0; i < chartStatusColorClassics.size(); i++) { + String statusColor = chartStatusColorClassics.get(i); + if (StrUtil.isNotEmpty(statusColor)) { + String[] colorArr = statusColor.split(","); + if (colorArr.length == 3) { + ChartStatus.CUSTOM_COLOR_CLASSICS.put(i, new Color(Integer.parseInt(colorArr[0]), Integer.parseInt(colorArr[1]), Integer.parseInt(colorArr[2]))); + } + } + } + } + if (CollUtil.isNotEmpty(chartStatusColorMimic) && chartStatusColorMimic.size() == 3) { + for (int i = 0; i < chartStatusColorMimic.size(); i++) { + String statusColor = chartStatusColorMimic.get(i); + if (StrUtil.isNotEmpty(statusColor)) { + String[] colorArr = statusColor.split(","); + if (colorArr.length == 3) { + ChartStatus.CUSTOM_COLOR_MIMIC.put(i, new Color(Integer.parseInt(colorArr[0]), Integer.parseInt(colorArr[1]), Integer.parseInt(colorArr[2]))); + } + } + } + } + } + + public static Color getNotDone(String modelValue) { + return getColorByKey(ChartStatus.NOT_DONE, modelValue); + } + + public static Color getToDo(String modelValue) { + return getColorByKey(ChartStatus.TO_DO, modelValue); + } + + public static Color getDone(String modelValue) { + return getColorByKey(ChartStatus.DONE, modelValue); + } + + public static Color getColorByKey(ChartStatus chartStatus, String modelValue) { + Color color = null; + if (ModelEnum.CLASSICS.name().equals(modelValue)) { + color = ChartStatus.CUSTOM_COLOR_CLASSICS.get(chartStatus.getKey()); + } else if (ModelEnum.MIMIC.name().equals(modelValue)) { + color = ChartStatus.CUSTOM_COLOR_MIMIC.get(chartStatus.getKey()); + } + if (ObjectUtil.isNull(color)) { + color = ChartStatus.CUSTOM_COLOR.get(chartStatus.getKey()); + } + return ObjectUtil.defaultIfNull(color, chartStatus.getColor()); + } + + public static Color getColorByKey(Integer key) { + for (ChartStatus item : ChartStatus.values()) { + if (item.getKey().equals(key)) { + Color color = ChartStatus.CUSTOM_COLOR.get(key); + return ObjectUtil.defaultIfNull(color, item.getColor()); + } + } + return null; + } + + /** + * 判断是否未办理 + * + * @param key 状态 + */ + public static Boolean isNotDone(Integer key) { + return ObjectUtil.isNotNull(key) && (ChartStatus.NOT_DONE.getKey().equals(key)); + } + + /** + * 判断是否待办理 + * + * @param key 状态 + */ + public static Boolean isToDo(Integer key) { + return ObjectUtil.isNotNull(key) && (ChartStatus.TO_DO.getKey().equals(key)); + } + + /** + * 判断是否已办理 + * + * @param key 状态 + */ + public static Boolean isDone(Integer key) { + return ObjectUtil.isNotNull(key) && (ChartStatus.DONE.getKey().equals(key)); + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/enums/Condition.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/enums/Condition.java new file mode 100644 index 000000000..04f2ae3e5 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/enums/Condition.java @@ -0,0 +1,180 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.enums; + +import org.dromara.warm.flow.constant.ExceptionCons; +import org.dromara.warm.flow.constant.FlowCons; +import org.dromara.warm.flow.expression.SpelHelper; +import org.dromara.warm.flow.strategy.ConditionStrategy; +import org.dromara.warm.flow.utils.AssertUtil; +import org.dromara.warm.flow.utils.MathUtil; + +import java.util.Map; + +/** + * 内置条件表达式策略,合并原 eq/ne/gt/ge/lt/le/like/notLike/spel/default 十个策略类及 ConditionType 枚举 + * 表达式格式:eq@@flag|4(前缀 eq@@ 由 {@link ConditionStrategy} 截取,进入 eval 的为 flag|4) + * + * @author warm + */ +public enum Condition implements ConditionStrategy { + + /** + * 等于 + */ + EQ("eq") { + @Override + public Boolean afterEval(String value, String variableValue) { + if (MathUtil.isNumeric(value)) { + return MathUtil.determineSize(variableValue, value) == 0; + } + return variableValue.equals(value); + } + }, + + /** + * 不等于 + */ + NE("ne") { + @Override + public Boolean afterEval(String value, String variableValue) { + if (MathUtil.isNumeric(value)) { + return MathUtil.determineSize(variableValue, value) != 0; + } + return !variableValue.equals(value); + } + }, + + /** + * 大于(仅数值比较) + */ + GT("gt") { + @Override + public Boolean afterEval(String value, String variableValue) { + return MathUtil.isNumeric(value) && MathUtil.determineSize(variableValue, value) > 0; + } + }, + + /** + * 大于等于(仅数值比较) + */ + GE("ge") { + @Override + public Boolean afterEval(String value, String variableValue) { + return MathUtil.isNumeric(value) && MathUtil.determineSize(variableValue, value) >= 0; + } + }, + + /** + * 小于(仅数值比较) + */ + LT("lt") { + @Override + public Boolean afterEval(String value, String variableValue) { + return MathUtil.isNumeric(value) && MathUtil.determineSize(variableValue, value) < 0; + } + }, + + /** + * 小于等于(仅数值比较) + */ + LE("le") { + @Override + public Boolean afterEval(String value, String variableValue) { + return MathUtil.isNumeric(value) && MathUtil.determineSize(variableValue, value) <= 0; + } + }, + + /** + * 包含 + */ + LIKE("like") { + @Override + public Boolean afterEval(String value, String variableValue) { + return variableValue.contains(value); + } + }, + + /** + * 不包含 + */ + NOT_LIKE("notLike") { + @Override + public Boolean afterEval(String value, String variableValue) { + return !variableValue.contains(value); + } + }, + + /** + * spel 条件表达式 spel@@#{@user.eval()} + */ + SPEL(FlowCons.SPEL) { + @Override + public Boolean eval(String expression, Map variable) { + return SpelHelper.evalBool(expression, variable); + } + + @Override + public Boolean afterEval(String value, String variableValue) { + throw new UnsupportedOperationException("spel 条件表达式不走值比较"); + } + }, + + /** + * 默认条件表达式 default@@${flag == 5 && flag > 4},基于 spel 简化使用 + */ + DEFAULT(FlowCons.DEFAULT) { + @Override + public Boolean eval(String expression, Map variable) { + return SPEL.eval(SpelHelper.replace(expression, variable), variable); + } + + @Override + public Boolean afterEval(String value, String variableValue) { + throw new UnsupportedOperationException("默认条件表达式不走值比较"); + } + }; + + private final String key; + + Condition(String key) { + this.key = key; + } + + @Override + public String getType() { + return key; + } + + @Override + public Boolean eval(String expression, Map variable) { + AssertUtil.isEmpty(variable, ExceptionCons.NULL_CONDITION_VALUE); + String[] split = expression.split(FlowCons.SPLIT_VERTICAL); + String name = split[0].trim(); + Object o = variable.get(name); + AssertUtil.isNull(o, ExceptionCons.NULL_CONDITION_VALUE); + return afterEval(split[1].trim(), String.valueOf(o)); + } + + /** + * 比较表达式值与流程变量值 + * + * @param value 表达式最后一个参数,比如:eq@@flag|5 的 [5] + * @param variableValue 流程变量值 + * @return 比较结果 + */ + public abstract Boolean afterEval(String value, String variableValue); +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/enums/CooperateType.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/enums/CooperateType.java new file mode 100644 index 000000000..b806f9d95 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/enums/CooperateType.java @@ -0,0 +1,198 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.enums; + +import cn.hutool.core.util.StrUtil; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.dromara.warm.flow.constant.FlowCons; +import org.dromara.warm.flow.utils.MathUtil; + + +/** + * 协作类型 + * APPROVAL-无:无其他协作方式 + * TRANSFER-转办:任务转给其他人办理 + * DEPUTE-委派:求助其他人审批,然后参照他的意见决定是否审批通过 + * COUNTERSIGN-会签:和其他人一起审批通过,才算通过 + * VOTE-票签:和部分人一起审批,达到一定通过率,才算通过 + * ADD_SIGNATURE-加签:办理中途,希望其他人一起参与办理 + * REDUCTION_SIGNATURE-减签:办理中途,希望某些人不参与办理 + * + * @author xiarg + * @since 2024/5/10 16:04 + */ +@Getter +@AllArgsConstructor +public enum CooperateType { + + /** + * 协作类型 + */ + APPROVAL(1, "无"), + + TRANSFER(2, "转办"), + + DEPUTE(3, "委派"), + + COUNTERSIGN(4, "会签"), + + VOTE(5, "票签"), + + ADD_SIGNATURE(6, "加签"), + + REDUCTION_SIGNATURE(7, "减签"); + + private final Integer key; + private final String value; + + + /** + * 票签中的固定通过人数策略前缀 + */ + public static final String PASS_COUNT = "passCount"; + /** + * 票签中的固定驳回人数策略前缀 + */ + public static final String REJECT_COUNT = "rejectCount"; + + /** + * 顺签 + */ + public static final String SEQUENCE = "sequence"; + + public static Integer getKeyByValue(String value) { + for (CooperateType item : CooperateType.values()) { + if (item.getValue().equals(value)) { + return item.getKey(); + } + } + return null; + } + + public static String getValueByKey(Integer key) { + for (CooperateType item : CooperateType.values()) { + if (item.getKey().equals(key)) { + return item.getValue(); + } + } + return null; + } + + public static CooperateType getByKey(Integer key) { + for (CooperateType item : CooperateType.values()) { + if (item.getKey().equals(key)) { + return item; + } + } + return null; + } + + + /** + * 判断是否为或签 + * @param ratio 比例 + * @return true:是;false:不是 + */ + public static boolean isOrSign(String ratio) { + return MathUtil.isZero(ratio); + } + + /** + * 判断是否是会签 + * + * @param ratio 比例 + * @return true:是;false:不是 + */ + public static boolean isCountersign(String ratio) { + return MathUtil.isHundred(ratio); + } + + /** + * 判断是否是票签中通过率策略 + * + * @param ratio 比例 + * @return true:是;false:不是 + */ + public static boolean isVoteSignPassRatio(String ratio) { + return MathUtil.isBetweenZeroAndHundred(ratio); + } + + /** + * 判断是否是票签中的固定通过人数策略 + * + * @param passCount 固定通过人数 + * @return true:是;false:不是 + */ + public static boolean isVoteSignPassCount(String passCount) { + return StrUtil.isNotEmpty(passCount) && passCount.startsWith(PASS_COUNT); + } + + /** + * 判断是否是票签中的固定驳回人数策略 + * + * @param rejectCount 固定驳回人数 + * @return true:是;false:不是 + */ + public static boolean isVoteSignRejectCount(String rejectCount) { + return StrUtil.isNotEmpty(rejectCount) && rejectCount.startsWith(REJECT_COUNT); + } + + /** + * 判断是否是票签中的默认表达式策略 + * + * @param expression 默认表达式 + * @return true:是;false:不是 + */ + public static boolean isVoteSignDefault(String expression) { + return StrUtil.isNotEmpty(expression) && expression.startsWith(FlowCons.DEFAULT); + } + + /** + * 判断是否是票签中的spel表达式策略 + * + * @param expression spel表达式 + * @return true:是;false:不是 + */ + public static boolean isVoteSignRejectSpel(String expression) { + return StrUtil.isNotEmpty(expression) && expression.startsWith(FlowCons.SPEL); + } + + /** + * 判断是否是顺签 + * + * @param expression 表达式 + * @return true:是;false:不是 + */ + public static boolean isSequenceSign(String expression) { + return StrUtil.isNotEmpty(expression) && expression.endsWith(FlowCons.SPLIT_AT + SEQUENCE); + } + + /** + * 判断是否是顺签 + * + * @param expression 表达式 + * @return true:是;false:不是 + */ + public static String removeSequence(String expression) { + if (isSequenceSign(expression)) { + return expression.substring(0, expression.lastIndexOf(FlowCons.SPLIT_AT + SEQUENCE)); + } + return expression; + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/enums/FlowStatus.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/enums/FlowStatus.java new file mode 100644 index 000000000..e2be298cf --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/enums/FlowStatus.java @@ -0,0 +1,104 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.enums; + +import cn.hutool.core.util.ObjectUtil; + +import lombok.AllArgsConstructor; +import lombok.Getter; + + +/** + * 流程状态 + * + * @author warm + * @since 2023/3/31 12:16 + */ +@Getter +@AllArgsConstructor +public enum FlowStatus { + /** + * 流程状态 + */ + TOBESUBMIT("0", "待提交"), + + APPROVAL("1", "审批中"), + + PASS("2", "审批通过"), + + AUTO_PASS("3", "自动完成"), + + TERMINATE("4", "终止"), + + NULLIFY("5", "作废"), + + CANCEL("6", "撤销"), + + RETRIEVE("7", "取回"), + + FINISHED("8", "已完成"), + + REJECT("9", "已退回"), + + INVALID("10", "失效"), + + TASK_BACK("11", "拿回"), + + RE_START("12", "重启"), + + PENDING("13", "暂存"); + + private final String key; + private final String value; + + public static String getKeyByValue(String value) { + for (FlowStatus item : FlowStatus.values()) { + if (item.getValue().equals(value)) { + return item.getKey(); + } + } + return null; + } + + public static String getValueByKey(String key) { + for (FlowStatus item : FlowStatus.values()) { + if (item.getKey().equals(key)) { + return item.getValue(); + } + } + return null; + } + + public static FlowStatus getByKey(String key) { + for (FlowStatus item : FlowStatus.values()) { + if (item.getKey().equals(key)) { + return item; + } + } + return null; + } + + /** + * 判断是否结束节点 + * + * @param key 枚举key + * @return boolean + */ + public static Boolean isFinished(String key) { + return ObjectUtil.isNotNull(key) && (FlowStatus.FINISHED.getKey().equals(key)); + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/enums/FormCustomEnum.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/enums/FormCustomEnum.java new file mode 100644 index 000000000..ee6e98071 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/enums/FormCustomEnum.java @@ -0,0 +1,40 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 表单类型 + * + * @author warm + * @since 2025/6/25 + */ +@Getter +@AllArgsConstructor +public enum FormCustomEnum { + + /** + * 表单路径 + */ + N, + + /** + * 表单路径 + */ + Y, +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/enums/FrameworkType.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/enums/FrameworkType.java new file mode 100644 index 000000000..dcb066778 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/enums/FrameworkType.java @@ -0,0 +1,35 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 框架类型: springboot、solon + * + * @author warm + * @since 2026/3/24 + */ +@Getter +@AllArgsConstructor +public enum FrameworkType { + + SPRING_BOOT, + + SOLON; + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/enums/Handler.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/enums/Handler.java new file mode 100644 index 000000000..42cec8987 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/enums/Handler.java @@ -0,0 +1,62 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.enums; + +import org.dromara.warm.flow.expression.SpelHelper; +import org.dromara.warm.flow.strategy.HandlerStrategy; + +import java.util.Map; + +/** + * 内置办理人表达式策略,合并原 DefaultHandlerStrategy/HandlerStrategySpel 两个策略类 + * 表达式格式:${flag} 或 #{@user.evalVar()} + * + * @author warm,battcn + */ +public enum Handler implements HandlerStrategy { + + /** + * 默认办理人表达式 ${flag} + */ + DEFAULT("$") { + @Override + public Object preEval(String expression, Map variable) { + String result = expression.replace("${", "").replace("}", ""); + return variable.get(result); + } + }, + + /** + * spel 办理人表达式 #{@user.evalVar()} + */ + SPEL("#") { + @Override + public Object preEval(String expression, Map variable) { + return SpelHelper.parseExpression(expression, variable); + } + }; + + private final String key; + + Handler(String key) { + this.key = key; + } + + @Override + public String getType() { + return key; + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/enums/ModelEnum.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/enums/ModelEnum.java new file mode 100644 index 000000000..7172c8b41 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/enums/ModelEnum.java @@ -0,0 +1,40 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 设计器模型(CLASSICS经典模型 MIMIC仿钉钉模型) + * + * @author warm + * @since 2025/6/25 + */ +@Getter +@AllArgsConstructor +public enum ModelEnum { + + /** + * 经典模型 + */ + CLASSICS, + + /** + * 仿钉钉模型 + */ + MIMIC +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/enums/NodeType.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/enums/NodeType.java new file mode 100644 index 000000000..5ec1fc108 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/enums/NodeType.java @@ -0,0 +1,162 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.enums; + +import cn.hutool.core.util.ObjectUtil; + +import lombok.AllArgsConstructor; +import lombok.Getter; + + +/** + * 节点类型 + * + * @author warm + * @since 2023/3/31 12:16 + */ +@AllArgsConstructor +@Getter +public enum NodeType { + /** + * 开始节点 + */ + START(0, "start"), + /** + * 中间节点 + */ + BETWEEN(1, "between"), + /** + * 结束节点 + */ + END(2, "end"), + + /** + * 互斥网关 + */ + SERIAL(3, "serial"), + + /** + * 并行网关 + */ + PARALLEL(4, "parallel"), + + /** + * 包容网关 + */ + INCLUSIVE(5, "inclusive"); + + private final Integer key; + private final String value; + + public static Integer getKeyByValue(String value) { + for (NodeType item : NodeType.values()) { + if (item.getValue().equals(value)) { + return item.getKey(); + } + } + return null; + } + + public static String getValueByKey(Integer key) { + for (NodeType item : NodeType.values()) { + if (item.getKey().equals(key)) { + return item.getValue(); + } + } + return null; + } + + public static NodeType getByKey(Integer key) { + for (NodeType item : NodeType.values()) { + if (item.getKey().equals(key)) { + return item; + } + } + return null; + } + + /** + * 判断是否开始节点 + * + * @param key 枚举key + * @return boolean + */ + public static Boolean isStart(Integer key) { + return ObjectUtil.isNotNull(key) && (NodeType.START.getKey().equals(key)); + } + + /** + * 判断是否中间节点 + * + * @param key 枚举key + * @return boolean + */ + public static Boolean isBetween(Integer key) { + return ObjectUtil.isNotNull(key) && (NodeType.BETWEEN.getKey().equals(key)); + } + + /** + * 判断是否结束节点 + * + * @param key 枚举key + * @return boolean + */ + public static Boolean isEnd(Integer key) { + return ObjectUtil.isNotNull(key) && (NodeType.END.getKey().equals(key)); + } + + /** + * 判断是否网关节点 + * + * @param key 枚举key + * @return boolean + */ + public static Boolean isGateWay(Integer key) { + return ObjectUtil.isNotNull(key) && (NodeType.SERIAL.getKey().equals(key) + || NodeType.PARALLEL.getKey().equals(key)|| NodeType.INCLUSIVE.getKey().equals(key)); + } + + /** + * 判断是否互斥网关节点 + * + * @param key 枚举key + * @return boolean + */ + public static Boolean isGateWaySerial(Integer key) { + return ObjectUtil.isNotNull(key) && NodeType.SERIAL.getKey().equals(key); + } + + /** + * 判断是否并行网关节点 + * + * @param key 枚举key + * @return boolean + */ + public static Boolean isGateWayParallel(Integer key) { + return ObjectUtil.isNotNull(key) && NodeType.PARALLEL.getKey().equals(key); + } + + /** + * 判断是否包容网关节点 + * + * @param key 枚举key + * @return boolean + */ + public static Boolean isGateWayInclusive(Integer key) { + return ObjectUtil.isNotNull(key) && NodeType.INCLUSIVE.getKey().equals(key); + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/enums/PublishStatus.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/enums/PublishStatus.java new file mode 100644 index 000000000..01e3ee618 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/enums/PublishStatus.java @@ -0,0 +1,70 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 节点类型 + * + * @author warm + * @since 2023/3/31 12:16 + */ +@Getter +@AllArgsConstructor +public enum PublishStatus { + + /** + * 9=已失效;0=未发布;1=已发布 + */ + EXPIRED(9, "已失效"), + + UNPUBLISHED(0, "未发布"), + + PUBLISHED(1, "已发布"); + + private final Integer key; + private final String value; + + public static Integer getKeyByValue(String value) { + for (PublishStatus item : PublishStatus.values()) { + if (item.getValue().equals(value)) { + return item.getKey(); + } + } + return null; + } + + public static String getValueByKey(Integer key) { + for (PublishStatus item : PublishStatus.values()) { + if (item.getKey().equals(key)) { + return item.getValue(); + } + } + return null; + } + + public static PublishStatus getByKey(Integer key) { + for (PublishStatus item : PublishStatus.values()) { + if (item.getKey().equals(key)) { + return item; + } + } + return null; + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/enums/SkipType.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/enums/SkipType.java new file mode 100644 index 000000000..44d382b3a --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/enums/SkipType.java @@ -0,0 +1,102 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.enums; + +import cn.hutool.core.util.StrUtil; + +import lombok.AllArgsConstructor; +import lombok.Getter; + + +/** + * 审批动作 + * + * @author warm + * @since 2023/3/31 12:16 + */ +@Getter +@AllArgsConstructor +public enum SkipType { + /** + * 审批动作 + */ + PASS("PASS", "审批通过"), + + REJECT("REJECT", "退回"), + + NONE("NONE", "无动作"); + + private final String key; + private final String value; + + public static String getKeyByValue(String value) { + for (SkipType item : SkipType.values()) { + if (item.getValue().equals(value)) { + return item.getKey(); + } + } + return null; + } + + public static String getValueByKey(String key) { + for (SkipType item : SkipType.values()) { + if (item.getKey().equals(key)) { + return item.getValue(); + } + } + return null; + } + + public static SkipType getByKey(String key) { + for (SkipType item : SkipType.values()) { + if (item.getKey().equals(key)) { + return item; + } + } + return null; + } + + /** + * 判断是否通过类型 + * + * @param key 枚举key + * @return boolean + */ + public static Boolean isPass(String key) { + return StrUtil.isNotEmpty(key) && (SkipType.PASS.getKey().equals(key)); + } + + /** + * 判断是否退回类型 + * + * @param key 枚举key + * @return boolean + */ + public static Boolean isReject(String key) { + return StrUtil.isNotEmpty(key) && (SkipType.REJECT.getKey().equals(key)); + } + + /** + * 判断是否无动作类型 + * + * @param key 枚举key + * @return boolean + */ + public static Boolean isNone(String key) { + return StrUtil.isNotEmpty(key) && (SkipType.NONE.getKey().equals(key)); + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/enums/UserType.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/enums/UserType.java new file mode 100644 index 000000000..9523cbd8f --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/enums/UserType.java @@ -0,0 +1,70 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 流程用户类型 + * + * @author xiarg + * @since 2024/5/10 16:04 + */ +@Getter +@AllArgsConstructor +public enum UserType { + + /** + * 流程用户类型 + */ + APPROVAL("1", "待办任务的审批人权限"), + + TRANSFER("2", "待办任务的转办人权限"), + + DEPUTE("3", "待办任务的委托人权限"); + + private final String key; + private final String value; + + public static String getKeyByValue(String value) { + for (UserType item : UserType.values()) { + if (item.getValue().equals(value)) { + return item.getKey(); + } + } + return null; + } + + public static String getValueByKey(String key) { + for (UserType item : UserType.values()) { + if (item.getKey().equals(key)) { + return item.getValue(); + } + } + return null; + } + + public static UserType getByKey(String key) { + for (UserType item : UserType.values()) { + if (item.getKey().equals(key)) { + return item; + } + } + return null; + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/enums/VoteSign.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/enums/VoteSign.java new file mode 100644 index 000000000..22dd4fdd7 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/enums/VoteSign.java @@ -0,0 +1,62 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.enums; + +import org.dromara.warm.flow.constant.FlowCons; +import org.dromara.warm.flow.expression.SpelHelper; +import org.dromara.warm.flow.strategy.VoteSignStrategy; + +import java.util.Map; + +/** + * 内置会签票签表达式策略,合并原 VoteSignStrategySpel/VoteSignStrategyDefault 两个策略类 + * 表达式格式:spel@@#{@user.eval()} 或 default@@${flag == 5 && flag > 4} + * + * @author warm + */ +public enum VoteSign implements VoteSignStrategy { + + /** + * spel 会签表达式 spel@@#{@user.eval()} + */ + SPEL(FlowCons.SPEL) { + @Override + public Boolean eval(String expression, Map variable) { + return SpelHelper.evalBool(expression, variable); + } + }, + + /** + * 默认会签表达式 default@@${flag == 5 && flag > 4},基于 spel 简化使用 + */ + DEFAULT(FlowCons.DEFAULT) { + @Override + public Boolean eval(String expression, Map variable) { + return SPEL.eval(SpelHelper.replace(expression, variable), variable); + } + }; + + private final String key; + + VoteSign(String key) { + this.key = key; + } + + @Override + public String getType() { + return key; + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/exception/FlowException.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/exception/FlowException.java new file mode 100644 index 000000000..b2ac3022e --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/exception/FlowException.java @@ -0,0 +1,80 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.exception; + +import lombok.Getter; + +/** + * 流程异常 + * + * @author warm + */ +public final class FlowException extends RuntimeException { + private static final long serialVersionUID = 1L; + + /** + * 错误码 + */ + @Getter + private Integer code; + + /** + * 错误提示 + */ + private String message; + + /** + * 错误明细,内部调试错误 + */ + @Getter + private String detailMessage; + + /** + * 空构造方法,避免反序列化问题 + */ + public FlowException() { + } + + public FlowException(String message) { + this.message = message; + } + + public FlowException(String message, Throwable cause) { + super(message, cause); + this.message = message; + } + + public FlowException(String message, Integer code) { + this.message = message; + this.code = code; + } + + public FlowException setDetailMessage(String detailMessage) { + this.detailMessage = detailMessage; + return this; + } + + @Override + public String getMessage() { + return message; + } + + public FlowException setMessage(String message) { + this.message = message; + return this; + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/expression/ListenerStrategySpel.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/expression/ListenerStrategySpel.java new file mode 100644 index 000000000..b5effc9cd --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/expression/ListenerStrategySpel.java @@ -0,0 +1,41 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.expression; + +import org.dromara.warm.flow.strategy.ListenerStrategy; +import org.dromara.warm.flow.expression.SpelHelper; + +import java.util.Map; + +/** + * spel监听器表达式 #{@user.eval()} + * + * @author warm + */ +public class ListenerStrategySpel implements ListenerStrategy { + + @Override + public String getType() { + return "#"; + } + + @Override + public Boolean eval(String expression, Map variable) { + SpelHelper.parseExpression(expression, variable); + // 恒返回true,说明匹配上监听器表达式,扩展策略也一定要返回true + return true; + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/expression/SafeMethodResolver.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/expression/SafeMethodResolver.java new file mode 100644 index 000000000..3099a8f14 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/expression/SafeMethodResolver.java @@ -0,0 +1,53 @@ +package org.dromara.warm.flow.expression; + +import org.springframework.core.convert.TypeDescriptor; +import org.springframework.expression.AccessException; +import org.springframework.expression.EvaluationContext; +import org.springframework.expression.MethodExecutor; +import org.springframework.expression.MethodResolver; +import org.springframework.expression.spel.support.DataBindingMethodResolver; +import org.springframework.lang.NonNull; +import org.springframework.lang.Nullable; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * 安全的方法解析器(限制可调用的方法) + * + * @author warm + * @since 2026/3/31 + */ +public class SafeMethodResolver implements MethodResolver { + + private static final Set DANGEROUS_METHODS = new HashSet<>(Arrays.asList( + "getRuntime", + "exec", + "forName", + "loadClass", + "getClassLoader", + "setAccessible", + "newInstance", + "invoke", + "getField", + "getDeclaredField", + "getMethod", + "getDeclaredMethod" + )); + + + @Nullable + @Override + public MethodExecutor resolve(@NonNull EvaluationContext context, @NonNull Object targetObject + , @NonNull String name, @NonNull List argumentTypes) throws AccessException { + if (DANGEROUS_METHODS.contains(name)) { + throw new AccessException("不允许调用方法:" + name); + } + + // 委托给默认的方法解析器 + return DataBindingMethodResolver.forInstanceMethodInvocation() + .resolve(context, targetObject, name, argumentTypes); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/expression/SafeTypeLocator.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/expression/SafeTypeLocator.java new file mode 100644 index 000000000..b75de6956 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/expression/SafeTypeLocator.java @@ -0,0 +1,113 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.expression; + +import cn.hutool.core.util.StrUtil; + +import org.dromara.warm.flow.exception.FlowException; + +import org.springframework.expression.TypeLocator; +import org.springframework.expression.spel.support.StandardTypeLocator; +import org.springframework.lang.NonNull; + +import java.util.HashSet; +import java.util.Set; + +/** + * 自定义类型定位器,用于限制访问的类 + * + * @author warm + * @since 2026/3/31 + */ +// ... existing code ... + +/** + * 自定义类型定位器,用于限制访问的类 + * + * @author warm + * @since 2026/3/31 + */ +public class SafeTypeLocator implements TypeLocator { + private final StandardTypeLocator defaultTypeLocator; + private final Set allowedClasses; + private static final Set DANGEROUS_CLASSES; + + static { + // 初始化危险类黑名单(使用全限定名便于前缀匹配) + DANGEROUS_CLASSES = new HashSet<>(); + DANGEROUS_CLASSES.add("java.lang.Runtime"); + DANGEROUS_CLASSES.add("java.lang.ProcessBuilder"); + DANGEROUS_CLASSES.add("java.lang.System"); + DANGEROUS_CLASSES.add("java.lang.Class"); + DANGEROUS_CLASSES.add("java.lang.reflect"); + DANGEROUS_CLASSES.add("sun.misc.Unsafe"); + DANGEROUS_CLASSES.add("sun.reflect"); + } + + { + allowedClasses = new HashSet<>(); + allowedClasses.add("java.lang.String"); + allowedClasses.add("java.lang.Integer"); + allowedClasses.add("java.lang.Long"); + allowedClasses.add("java.lang.Double"); + allowedClasses.add("java.lang.Float"); + allowedClasses.add("java.lang.Boolean"); + allowedClasses.add("java.lang.Byte"); + allowedClasses.add("java.lang.Short"); + allowedClasses.add("java.lang.Character"); + allowedClasses.add("java.lang.Object"); + allowedClasses.add("java.util.List"); + allowedClasses.add("java.util.ArrayList"); + allowedClasses.add("java.util.Map"); + allowedClasses.add("java.util.HashMap"); + allowedClasses.add("java.util.Set"); + allowedClasses.add("java.util.HashSet"); + allowedClasses.add("java.util.Date"); + } + + public SafeTypeLocator() { + this.defaultTypeLocator = new StandardTypeLocator(); + } + + @Override + public Class findType(@NonNull String typeName) { + if (StrUtil.isEmpty(typeName)) { + throw new FlowException("Type name cannot be null or empty"); + } + + // 检查是否为危险类(黑名单) + if (isDangerousClass(typeName)) { + throw new FlowException("Forbidden dangerous class: " + typeName); + } + + // 检查是否在白名单内 + if (!allowedClasses.contains(typeName)) { + throw new FlowException("Forbidden class not in whitelist: " + typeName); + } + + return defaultTypeLocator.findType(typeName); + } + + private boolean isDangerousClass(String typeName) { + for (String dangerousClass : DANGEROUS_CLASSES) { + if (typeName.equals(dangerousClass) || typeName.startsWith(dangerousClass + ".")) { + return true; + } + } + return false; + } +} + diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/expression/SpelHelper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/expression/SpelHelper.java new file mode 100644 index 000000000..8bbcf3ebe --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/expression/SpelHelper.java @@ -0,0 +1,120 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.expression; + +import org.dromara.warm.flow.exception.FlowException; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.ListableBeanFactory; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.expression.BeanFactoryResolver; +import org.springframework.expression.BeanResolver; +import org.springframework.expression.ExpressionParser; +import org.springframework.expression.ParserContext; +import org.springframework.expression.common.TemplateParserContext; +import org.springframework.expression.spel.standard.SpelExpressionParser; +import org.springframework.expression.spel.support.StandardEvaluationContext; +import org.springframework.lang.NonNull; + +import java.util.Map; + +/** + * 条件表达式 spel + * + * @author warm,battcn + */ +@Configuration +public class SpelHelper implements ApplicationContextAware { + + private static final ExpressionParser PARSER = new SpelExpressionParser(); + private final static ParserContext PARSER_CONTEXT = new TemplateParserContext(); + + private static ApplicationContext applicationContext; + + /** + * bean解析器 用于处理 spel 表达式中对 bean 的调用 + */ + private static BeanResolver beanResolver = null; + + public static BeanResolver beanResolver() { + if (beanResolver == null) { + beanResolver = new BeanFactoryResolver(getBeanFactory()); + } + return beanResolver; + } + + /** + * @param expression expression + * @return Object + */ + public static Object parseExpression(String expression, Map variable) { + + // 创建带沙箱保护的评估上下文 + StandardEvaluationContext context = new StandardEvaluationContext(); + + // 设置 Bean 解析器(支持 @beanName 引用) + context.setBeanResolver(beanResolver()); + + // 设置变量 + context.setVariables(variable); + + // 设置沙箱:限制类型访问(白名单机制) + context.setTypeLocator(new SafeTypeLocator()); + + // 设置沙箱:限制方法调用 + context.addMethodResolver(new SafeMethodResolver()); + + return PARSER.parseExpression(expression, PARSER_CONTEXT).getValue(context, Object.class); + } + + /** + * 执行 spel 表达式并按布尔结果返回 + * + * @param expression 表达式 + * @param variable 流程变量 + * @return 布尔结果 + */ + public static boolean evalBool(String expression, Map variable) { + return Boolean.TRUE.equals(parseExpression(expression, variable)); + } + + @Override + public void setApplicationContext(@NonNull ApplicationContext applicationContext) throws BeansException { + if (SpelHelper.applicationContext == null) { + SpelHelper.applicationContext = applicationContext; + } + } + + public static ListableBeanFactory getBeanFactory() { + if (null == applicationContext) { + throw new FlowException("No ConfigurableListableBeanFactory or ApplicationContext injected, maybe not in the Spring environment?"); + } else { + return applicationContext; + } + } + + public static String replace(String expression, Map variable) { + expression = expression.replace("$", "#"); + for (Map.Entry entry : variable.entrySet()) { + if (expression.contains(entry.getKey())) { + expression = expression.replace(entry.getKey(), "#" + entry.getKey()); + } + } + return expression; + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/handler/DataFillHandler.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/handler/DataFillHandler.java new file mode 100644 index 000000000..44634fce3 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/handler/DataFillHandler.java @@ -0,0 +1,106 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.handler; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.ObjectUtil; + +import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator; +import com.baomidou.mybatisplus.core.toolkit.IdWorker; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.warm.flow.FlowEngine; +import org.dromara.warm.flow.entity.RootEntity; + + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Date; +import java.util.Objects; + +/** + * 数据填充handler,以下三个接口按照实际情况实现 + * + * @author warm + * @since 2023/4/1 15:37 + */ +public interface DataFillHandler { + + Logger logger = LoggerFactory.getLogger(DataFillHandler.class); + + /** + * id填充。引擎在入库前就需要主键做行间互引(如历史任务的 instanceId/taskId), + * 必须此处生成而非留给 MyBatis-Plus 在 insert 时补;与全局 IdentifierGenerator 同源, + * insert 时对非空 id 不会重复生成 + * + * @param object object + */ + default void idFill(Object object) { + if (object instanceof RootEntity entity && ObjectUtil.isNull(entity.getId())) { + IdentifierGenerator generator = SpringUtils.getBeanOrNull(IdentifierGenerator.class); + entity.setId(generator != null ? generator.nextId(entity).longValue() : IdWorker.getId()); + } + } + + /** + * 新增填充 + * + * @param object object + */ + default void insertFill(Object object) { + RootEntity entity = (RootEntity) object; + if (ObjectUtil.isNull(entity)) { + logger.warn("Insert operation failed - Reason: Entity is null after casting"); + return; + } + entity.setCreateTime(ObjectUtil.isNotNull(entity.getCreateTime()) ? entity.getCreateTime() : new Date()); + entity.setUpdateTime(ObjectUtil.isNotNull(entity.getUpdateTime()) ? entity.getUpdateTime() : new Date()); + + PermissionHandler permissionHandler = FlowEngine.permissionHandler(); + String handler = null; + if (permissionHandler != null) { + try { + handler = permissionHandler.getHandler(); + } catch (Exception ignored) { + } + } + entity.setCreateBy(StrUtil.isNotEmpty(handler) ? handler : entity.getCreateBy()); + entity.setUpdateBy(StrUtil.isNotEmpty(handler) ? handler : entity.getUpdateBy()); + } + + /** + * 设置更新常用参数 + * + * @param object object + */ + default void updateFill(Object object) { + RootEntity entity = (RootEntity) object; + if (ObjectUtil.isNull(entity)) { + logger.warn("Insert operation failed - Reason: Entity is null after casting"); + return; + } + entity.setUpdateTime(ObjectUtil.isNotNull(entity.getUpdateTime()) ? entity.getUpdateTime() : new Date()); + PermissionHandler permissionHandler = FlowEngine.permissionHandler(); + String handler = null; + if (permissionHandler != null) { + try { + handler = permissionHandler.getHandler(); + } catch (Exception ignored) { + } + } + entity.setUpdateBy(StrUtil.isNotEmpty(handler) ? handler : entity.getUpdateBy()); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/handler/PermissionHandler.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/handler/PermissionHandler.java new file mode 100644 index 000000000..85b70f496 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/handler/PermissionHandler.java @@ -0,0 +1,55 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.handler; + +import org.dromara.warm.flow.dto.FlowParams; + +import java.util.List; + +/** + * 办理人权限处理器 + * 用户获取工作流中用到的permissionFlag和handler + * permissionFlag: 办理人权限标识,比如用户,角色,部门等,用于校验是否有权限办理任务 + * handler: 当前办理人唯一标识,就是确定唯一用的,如用户id,通常用来入库,记录流程实例创建人,办理人 + * + * @author shadow + */ +public interface PermissionHandler { + + /** + * 办理人权限标识,比如用户,角色,部门等,用于校验是否有权限办理任务 + * 后续在{@link FlowParams#getPermissionFlag} 中获取 + * 返回当前用户权限集合 + * + */ + List permissions(); + + /** + * 获取当前办理人:就是确定唯一用的,如用户id,通常用来入库,记录流程实例创建人,办理人 + * 后续在{@link FlowParams#getHandler()} 中获取 + * + * @return 当前办理人 + */ + String getHandler(); + + /** + * 转换办理人,比如设计器中预设了能办理的人,如果其中包含角色或者部门id等,可以通过此接口进行转换成用户id + */ + default List convertPermissions(List permissions) { + return permissions; + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/json/JsonUtil.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/json/JsonUtil.java new file mode 100644 index 000000000..7845506be --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/json/JsonUtil.java @@ -0,0 +1,121 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.json; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import org.dromara.warm.flow.exception.FlowException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import tools.jackson.core.type.TypeReference; +import tools.jackson.databind.DeserializationFeature; +import tools.jackson.databind.json.JsonMapper; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Jackson 3:map和json字符串转换工具类 + * + * @author warm + */ +public final class JsonUtil { + + private static final Logger log = LoggerFactory.getLogger(JsonUtil.class); + + private static final JsonMapper JSON_MAPPER = JsonMapper.builder() + .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) + .build(); + + private JsonUtil() { + } + + /** + * 将字符串转为map + * + * @param jsonStr json字符串 + * @return map + */ + public static Map strToMap(String jsonStr) { + if (StrUtil.isNotEmpty(jsonStr)) { + try { + return JSON_MAPPER.readValue(jsonStr, + JSON_MAPPER.getTypeFactory().constructMapType(Map.class, String.class, Object.class)); + } catch (Exception e) { + log.error("json转换异常", e); + throw new FlowException("json转换异常"); + } + } + return new HashMap<>(); + } + + /** + * 将字符串转为bean + * + * @param jsonStr json字符串 + * @param clazz Class + * @return T + */ + public static T strToBean(String jsonStr, Class clazz) { + if (StrUtil.isNotEmpty(jsonStr)) { + try { + return JSON_MAPPER.readValue(jsonStr, clazz); + } catch (Exception e) { + log.error("json转换异常", e); + throw new FlowException("json转换异常"); + } + } + return null; + } + + /** + * 将字符串转为集合 + * + * @param jsonStr json字符串 + * @return List + */ + public static List strToList(String jsonStr) { + if (StrUtil.isNotEmpty(jsonStr)) { + try { + return JSON_MAPPER.readValue(jsonStr, new TypeReference>() { + }); + } catch (Exception e) { + log.error("json转换异常", e); + throw new FlowException("json转换异常"); + } + } + return null; + } + + /** + * 将对象转为字符串 + * + * @param variable object + * @return json字符串 + */ + public static String objToStr(Object variable) { + if (ObjectUtil.isNotNull(variable)) { + try { + return JSON_MAPPER.writeValueAsString(variable); + } catch (Exception e) { + log.error("Map转换异常", e); + throw new FlowException("Map转换异常"); + } + } + return null; + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/listener/GlobalListener.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/listener/GlobalListener.java new file mode 100644 index 000000000..9eca9d59f --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/listener/GlobalListener.java @@ -0,0 +1,80 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.listener; + +import java.io.Serializable; + +/** + * 全局监听器: 整个系统只有一个,任务开始、分派、完成和创建、时期执行 + * + * @author warm + * @since 2024/11/17 + */ +public interface GlobalListener extends Serializable { + + /** + * 开始监听器,任务开始办理时执行 + * + * @param listenerVariable 监听器变量 + */ + default void start(ListenerVariable listenerVariable) { + + } + + /** + * 分派监听器,动态修改代办任务信息 + * + * @param listenerVariable 监听器变量 + */ + default void assignment(ListenerVariable listenerVariable) { + + } + + /** + * 完成监听器,当前任务完成后执行 + * + * @param listenerVariable 监听器变量 + */ + default void finish(ListenerVariable listenerVariable) { + + } + + /** + * 创建监听器,任务创建时执行 + * + * @param listenerVariable 监听器变量 + */ + default void create(ListenerVariable listenerVariable) { + + } + + default void notify(String type, ListenerVariable listenerVariable) { + switch (type) { + case Listener.LISTENER_START: + start(listenerVariable); + break; + case Listener.LISTENER_ASSIGNMENT: + assignment(listenerVariable); + break; + case Listener.LISTENER_FINISH: + finish(listenerVariable); + break; + case Listener.LISTENER_CREATE: + create(listenerVariable); + break; + } + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/listener/Listener.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/listener/Listener.java new file mode 100644 index 000000000..7589b3fbc --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/listener/Listener.java @@ -0,0 +1,58 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.listener; + +import java.io.Serializable; + +/** + * 监听器 + * + * @author warm + */ +public interface Listener extends Serializable { + + /** + * 开始监听器,任务开始办理时执行 + */ + String LISTENER_START = "start"; + + /** + * 分派监听器,动态修改代办任务信息 + */ + String LISTENER_ASSIGNMENT = "assignment"; + + /** + * 完成监听器,当前任务完成后执行 + */ + String LISTENER_FINISH = "finish"; + + /** + * 创建监听器,任务创建时执行 + */ + String LISTENER_CREATE = "create"; + + /** + * 表单数据加载监听器,1.3.0 内置表单使用 + */ + String LISTENER_FORM_LOAD = "formLoad"; + + /** + * 通知 + * + * @param variable variable + */ + void notify(ListenerVariable variable); +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/listener/ListenerVariable.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/listener/ListenerVariable.java new file mode 100644 index 000000000..d169f78bc --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/listener/ListenerVariable.java @@ -0,0 +1,212 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.listener; + +import org.dromara.warm.flow.dto.FlowParams; +import org.dromara.warm.flow.entity.FlowDefinition; +import org.dromara.warm.flow.entity.FlowInstance; +import org.dromara.warm.flow.entity.FlowNode; +import org.dromara.warm.flow.entity.FlowTask; + +import java.util.List; +import java.util.Map; + +/** + * 监听器变量 + * + * @author warm + */ +public class ListenerVariable { + + /** + * 流程定义 + */ + private FlowDefinition definition; + + /** + * 流程实例 + */ + private FlowInstance instance; + + /** + * 监听器对应的节点 + */ + private FlowNode node; + + /** + * 当前任务 + */ + private FlowTask task; + + /** + * 下一次执行的节点集合 + */ + private List nextNodes; + + /** + * 新创建任务集合 + */ + private List nextTasks; + + /** + * 流程变量 + */ + private Map variable; + + /** + * 工作流内置参数 + */ + private FlowParams flowParams; + + + public ListenerVariable() { + } + + public ListenerVariable(FlowDefinition definition, FlowInstance instance, Map variable) { + this.definition = definition; + this.instance = instance; + this.variable = variable; + } + + public ListenerVariable(FlowDefinition definition, FlowInstance instance, FlowNode node, Map variable) { + this.definition = definition; + this.instance = instance; + this.node = node; + this.variable = variable; + } + + public ListenerVariable(FlowDefinition definition, FlowInstance instance, Map variable, FlowTask task) { + this.definition = definition; + this.instance = instance; + this.variable = variable; + this.task = task; + } + + public ListenerVariable(FlowDefinition definition, FlowInstance instance, FlowNode node, Map variable, FlowTask task) { + this.definition = definition; + this.instance = instance; + this.node = node; + this.variable = variable; + this.task = task; + } + + public ListenerVariable(FlowDefinition definition, FlowInstance instance, FlowNode node, Map variable, FlowTask task, List nextNodes) { + this.definition = definition; + this.instance = instance; + this.node = node; + this.variable = variable; + this.task = task; + this.nextNodes = nextNodes; + } + + public ListenerVariable(FlowDefinition definition, FlowInstance instance, FlowNode node, Map variable, FlowTask task + , List nextNodes, List nextTasks) { + this.definition = definition; + this.instance = instance; + this.node = node; + this.variable = variable; + this.task = task; + this.nextNodes = nextNodes; + this.nextTasks = nextTasks; + } + + public FlowDefinition getDefinition() { + return definition; + } + + public ListenerVariable setDefinition(FlowDefinition definition) { + this.definition = definition; + return this; + } + + public FlowInstance getInstance() { + return instance; + } + + public ListenerVariable setInstance(FlowInstance instance) { + this.instance = instance; + return this; + } + + public FlowNode getNode() { + return node; + } + + public ListenerVariable setNode(FlowNode node) { + this.node = node; + return this; + } + + public FlowTask getTask() { + return task; + } + + public ListenerVariable setTask(FlowTask task) { + this.task = task; + return this; + } + + public List getNextNodes() { + return nextNodes; + } + + public ListenerVariable setNextNodes(List nextNodes) { + this.nextNodes = nextNodes; + return this; + } + + public List getNextTasks() { + return nextTasks; + } + + public ListenerVariable setNextTasks(List nextTasks) { + this.nextTasks = nextTasks; + return this; + } + + public Map getVariable() { + return variable; + } + + public ListenerVariable setVariable(Map variable) { + this.variable = variable; + return this; + } + + public FlowParams getFlowParams() { + return flowParams; + } + + public ListenerVariable setFlowParams(FlowParams flowParams) { + this.flowParams = flowParams; + return this; + } + + + @Override + public String toString() { + return "ListenerVariable{" + + "definition=" + definition + + ", instance=" + instance + + ", node=" + node + + ", task=" + task + + ", nextNodes=" + nextNodes + + ", nextTasks=" + nextTasks + + ", variable=" + variable + + ", flowParams=" + flowParams + + '}'; + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/listener/ValueHolder.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/listener/ValueHolder.java new file mode 100644 index 000000000..acfce8d20 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/listener/ValueHolder.java @@ -0,0 +1,39 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.listener; + +import lombok.Data; + +/** + * @author warm + */ +@Data +public class ValueHolder { + + /** + * 路径 + */ + private String path; + /** + * 监听器 + */ + private Listener listener; + /** + * 参数 + */ + private String params; + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/mapper/FlowDefinitionMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/mapper/FlowDefinitionMapper.java new file mode 100644 index 000000000..5973d2743 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/mapper/FlowDefinitionMapper.java @@ -0,0 +1,55 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.mapper; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.dromara.warm.flow.entity.FlowDefinition; + +import java.util.List; + +/** + * 流程定义Mapper接口 + * + * @author warm + * @since 2023-03-29 + */ +public interface FlowDefinitionMapper extends WarmMapper { + + /** + * 根据编码批量查询 + * + * @param flowCodeList 流程编码集 + * @return 查询结果 + */ + default List queryByCodeList(List flowCodeList) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(FlowDefinition::getFlowCode, flowCodeList); + return selectList(queryWrapper); + } + + /** + * 根据ID批量修改发布状态 + * + * @param ids ids + * @param publishStatus 发布状态(9=已失效;0=未发布;1=已发布) + * @see org.dromara.warm.flow.enums.PublishStatus + */ + default void updatePublishStatus(List ids, Integer publishStatus) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(FlowDefinition::getId, ids); + update(new FlowDefinition().setIsPublish(publishStatus), queryWrapper); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/mapper/FlowHisTaskMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/mapper/FlowHisTaskMapper.java new file mode 100644 index 000000000..3f6b178f2 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/mapper/FlowHisTaskMapper.java @@ -0,0 +1,74 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.mapper; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.dromara.warm.flow.entity.FlowHisTask; +import org.dromara.warm.flow.enums.SkipType; + +import java.util.Arrays; +import java.util.List; + +/** + * 历史任务记录Mapper接口 + * + * @author warm + * @since 2023-03-29 + */ +public interface FlowHisTaskMapper extends WarmMapper { + + /** + * 根据instanceId获取未退回的历史记录 + */ + default List getNoReject(Long instanceId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(FlowHisTask::getInstanceId, instanceId) + .eq(FlowHisTask::getSkipType, SkipType.PASS.getKey()) + .orderByDesc(FlowHisTask::getCreateTime); + return selectList(queryWrapper); + } + + /** + * 根据instanceId和流程编码获取未退回的历史记录 + */ + default List getByInsAndNodeCodes(Long instanceId, List nodeCodes) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(FlowHisTask::getInstanceId, instanceId) + .in(CollUtil.isNotEmpty(nodeCodes), FlowHisTask::getNodeCode, nodeCodes) + .orderByDesc(FlowHisTask::getCreateTime); + return selectList(queryWrapper); + } + + /** + * 根据instanceIds删除 + * + * @param instanceIds 主键 + * @return 结果 + */ + default int deleteByInsIds(List instanceIds) { + return delete(new LambdaQueryWrapper().in(FlowHisTask::getInstanceId, instanceIds)); + } + + /** + * 根据任务id和协作类型查询 + */ + default List listByTaskIdAndCooperateTypes(Long taskId, Integer[] cooperateTypes) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(FlowHisTask::getTaskId, taskId).in(FlowHisTask::getCooperateType, Arrays.asList(cooperateTypes)); + return selectList(queryWrapper); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/mapper/FlowInstanceMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/mapper/FlowInstanceMapper.java new file mode 100644 index 000000000..36698d85a --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/mapper/FlowInstanceMapper.java @@ -0,0 +1,42 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.mapper; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.dromara.warm.flow.entity.FlowInstance; + +import java.util.List; + +/** + * 流程实例Mapper接口 + * + * @author warm + * @since 2023-03-29 + */ +public interface FlowInstanceMapper extends WarmMapper { + + /** + * 根据流程定义ID,查询流程实例集合 + * + * @param defIds 流程定义ID集合 + * @return 流程实例集合 + */ + default List getByDefIds(List defIds) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(FlowInstance::getDefinitionId, defIds); + return selectList(queryWrapper); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/mapper/FlowNodeMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/mapper/FlowNodeMapper.java new file mode 100644 index 000000000..b22032770 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/mapper/FlowNodeMapper.java @@ -0,0 +1,50 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.mapper; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.dromara.warm.flow.entity.FlowNode; + +import java.io.Serializable; +import java.util.Collection; +import java.util.List; + +/** + * 流程节点Mapper接口 + * + * @author warm + * @since 2023-03-29 + */ +public interface FlowNodeMapper extends WarmMapper { + + default List getByNodeCodes(List nodeCodes, Long definitionId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(CollUtil.isNotEmpty(nodeCodes), FlowNode::getNodeCode, nodeCodes) + .eq(FlowNode::getDefinitionId, definitionId); + return selectList(queryWrapper); + } + + /** + * 批量删除流程节点 + * + * @param defIds 需要删除的数据主键集合 + * @return 结果 + */ + default int deleteNodeByDefIds(Collection defIds) { + return delete(new LambdaQueryWrapper().in(FlowNode::getDefinitionId, defIds)); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/mapper/FlowSkipMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/mapper/FlowSkipMapper.java new file mode 100644 index 000000000..11b1d3c3c --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/mapper/FlowSkipMapper.java @@ -0,0 +1,41 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.mapper; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.dromara.warm.flow.entity.FlowSkip; + +import java.io.Serializable; +import java.util.Collection; + +/** + * 节点跳转关联Mapper接口 + * + * @author warm + * @since 2023-03-29 + */ +public interface FlowSkipMapper extends WarmMapper { + + /** + * 批量删除节点跳转关联 + * + * @param defIds 需要删除的数据主键集合 + * @return 结果 + */ + default int deleteSkipByDefIds(Collection defIds) { + return delete(new LambdaQueryWrapper().in(FlowSkip::getDefinitionId, defIds)); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/mapper/FlowTaskMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/mapper/FlowTaskMapper.java new file mode 100644 index 000000000..9047ea251 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/mapper/FlowTaskMapper.java @@ -0,0 +1,47 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.mapper; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.dromara.warm.flow.entity.FlowTask; + +import java.util.List; + +/** + * 待办任务Mapper接口 + * + * @author warm + * @since 2023-03-29 + */ +public interface FlowTaskMapper extends WarmMapper { + + /** + * 根据instanceIds删除 + * + * @param instanceIds 主键 + * @return 结果 + */ + default int deleteByInsIds(List instanceIds) { + return delete(new LambdaQueryWrapper().in(FlowTask::getInstanceId, instanceIds)); + } + + default List getByInsIdAndNodeCodes(Long instanceId, List nodeCodes) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(FlowTask::getInstanceId, instanceId); + queryWrapper.in(FlowTask::getNodeCode, nodeCodes); + return selectList(queryWrapper); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/mapper/FlowUserMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/mapper/FlowUserMapper.java new file mode 100644 index 000000000..9e4226747 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/mapper/FlowUserMapper.java @@ -0,0 +1,86 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.mapper; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.dromara.warm.flow.entity.FlowUser; + +import java.util.Arrays; +import java.util.List; + +/** + * 流程用户Mapper接口 + * + * @author warm + * @since 2023-03-29 + */ +public interface FlowUserMapper extends WarmMapper { + + /** + * 根据taskId删除 + * + * @param taskIdList 待办任务主键集合 + * @return 结果 + */ + default int deleteByTaskIds(List taskIdList) { + return delete(new LambdaQueryWrapper().in(FlowUser::getAssociated, taskIdList)); + } + + /** + * 根据(待办任务,实例,历史表,节点等)id查询权限人或者处理人 + * + * @param associatedList (待办任务,实例,历史表,节点等)id集合 + * @param types 用户表类型 + * @return 查询结果 + */ + default List listByAssociatedAndTypes(List associatedList, String[] types) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + if (CollUtil.isNotEmpty(associatedList)) { + if (associatedList.size() == 1) { + queryWrapper.eq(FlowUser::getAssociated, associatedList.get(0)); + } else { + queryWrapper.in(FlowUser::getAssociated, associatedList); + } + } + queryWrapper.in(ArrayUtil.isNotEmpty(types), FlowUser::getType, Arrays.asList(types)); + return selectList(queryWrapper); + } + + /** + * 根据办理人查询 + * + * @param associated 待办任务id + * @param processedBys 办理人id集合 + * @param types 用户表类型 + * @return 查询结果 + */ + default List listByProcessedBys(Long associated, List processedBys, String[] types) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ObjectUtil.isNotNull(associated), FlowUser::getAssociated, associated); + if (CollUtil.isNotEmpty(processedBys)) { + if (processedBys.size() == 1) { + queryWrapper.eq(FlowUser::getProcessedBy, processedBys.get(0)); + } else { + queryWrapper.in(FlowUser::getProcessedBy, processedBys); + } + } + queryWrapper.in(ArrayUtil.isNotEmpty(types), FlowUser::getType, types); + return selectList(queryWrapper); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/mapper/WarmMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/mapper/WarmMapper.java new file mode 100644 index 000000000..57eadf8c5 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/mapper/WarmMapper.java @@ -0,0 +1,69 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.mapper; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.dromara.warm.flow.entity.RootEntity; + +import java.util.List; + +/** + * BaseMapper接口(含原 Dao 层通用查询,default 方法由 MyBatis 直接调用) + * + * @author warm + * @since 2023-03-17 + */ +public interface WarmMapper extends BaseMapper { + + /** + * 实体条件查询 + * + * @param entity 条件实体 + */ + default List selectList(T entity) { + return selectList(new QueryWrapper<>(entity)); + } + + /** + * 实体条件计数(接口类型 lambda 需显式设置实体类) + */ + @SuppressWarnings("unchecked") + default long selectCount(T entity) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(entity); + queryWrapper.setEntityClass((Class) entity.getClass()); + return selectCount(queryWrapper); + } + + /** + * 按主键更新(接口类型 lambda 需显式设置实体类) + */ + @SuppressWarnings("unchecked") + default int update(T entity) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.setEntityClass((Class) entity.getClass()); + queryWrapper.eq(RootEntity::getId, entity.getId()); + return update(entity, queryWrapper); + } + + /** + * 实体条件删除 + */ + default int delete(T entity) { + return delete(new LambdaQueryWrapper<>(entity)); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/service/ChartService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/service/ChartService.java new file mode 100644 index 000000000..f5df7af88 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/service/ChartService.java @@ -0,0 +1,173 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.service; + +import org.dromara.warm.flow.json.JsonUtil; + +import cn.hutool.core.util.ArrayUtil; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; + +import org.dromara.warm.flow.FlowEngine; +import org.dromara.warm.flow.dto.DefJson; +import org.dromara.warm.flow.dto.NodeJson; +import org.dromara.warm.flow.dto.PathWayData; +import org.dromara.warm.flow.dto.SkipJson; +import org.dromara.warm.flow.entity.FlowInstance; +import org.dromara.warm.flow.entity.FlowSkip; +import org.dromara.warm.flow.enums.ChartStatus; +import org.dromara.warm.flow.enums.NodeType; +import org.dromara.warm.flow.enums.SkipType; + + +import org.dromara.common.core.utils.StreamUtils; +import org.springframework.stereotype.Service; + + +import java.awt.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 流程图绘制Service业务层处理 + * + * @author warm + * @since 2024-12-30 + */ +@Service +public class ChartService { + + public String startMetadata(PathWayData pathWayData) { + + DefJson defJson = FlowEngine.defService().queryDesign(pathWayData.getDefId()); + List nodeList = defJson.getNodeList(); + + Map nodeMap = StreamUtils.toMap(nodeList, NodeJson::getNodeCode + , node -> node.setStatus(ChartStatus.NOT_DONE.getKey())); + Map skipMap = nodeList.stream().map(NodeJson::getSkipList).flatMap(List::stream) + .collect(Collectors.toMap(this::getSkipKey, skip -> skip.setStatus(ChartStatus.NOT_DONE.getKey()))); + + pathWayData.getPathWayNodes().forEach(node -> nodeMap.get(node.getNodeCode()).setStatus(ChartStatus.DONE.getKey())); + pathWayData.getPathWaySkips().forEach(skip -> skipMap.get(getSkipKey(skip)).setStatus(ChartStatus.DONE.getKey())); + pathWayData.getTargetNodes().forEach(node -> nodeMap.get(node.getNodeCode()).setStatus( + NodeType.isEnd(node.getNodeType()) ? ChartStatus.DONE.getKey() : ChartStatus.TO_DO.getKey() + )); + + return JsonUtil.objToStr(defJson); + } + + public String skipMetadata(PathWayData pathWayData) { + FlowInstance instance = FlowEngine.insService().getById(pathWayData.getInsId()); + DefJson defJson = JsonUtil.strToBean(instance.getDefJson(), DefJson.class); + + List nodeList = defJson.getNodeList(); + List skipList = defJson.getNodeList().stream().map(NodeJson::getSkipList) + .filter(Objects::nonNull).flatMap(List::stream).collect(Collectors.toList()); + Map nodeMap = StreamUtils.toMap(nodeList, NodeJson::getNodeCode, node -> node); + Map skipMap = StreamUtils.toMap(skipList, this::getSkipKey, skip -> skip); + + pathWayData.getPathWayNodes().forEach(node -> { + NodeJson nodeJson = nodeMap.get(node.getNodeCode()); + if (SkipType.isPass(pathWayData.getSkipType())) { + nodeJson.setStatus(ChartStatus.DONE.getKey()); + } else if (SkipType.isReject(pathWayData.getSkipType())) { + nodeJson.setStatus(ChartStatus.NOT_DONE.getKey()); + } + }); + pathWayData.getPathWaySkips().forEach(skip -> { + SkipJson skipJson = skipMap.get(getSkipKey(skip)); + if (SkipType.isPass(pathWayData.getSkipType())) { + skipJson.setStatus(ChartStatus.DONE.getKey()); + } else if (SkipType.isReject(pathWayData.getSkipType())) { + skipJson.setStatus(ChartStatus.NOT_DONE.getKey()); + } + }); + pathWayData.getTargetNodes().forEach(node -> { + NodeJson nodeJson = nodeMap.get(node.getNodeCode()); + if (NodeType.isEnd(node.getNodeType())) { + nodeJson.setStatus(ChartStatus.DONE.getKey()); + } else { + nodeJson.setStatus(ChartStatus.TO_DO.getKey()); + } + }); + + if (SkipType.isReject(pathWayData.getSkipType())) { + Map> skipNextMap = StreamUtils.groupByKey( + StreamUtils.filter(skipList, skip -> !SkipType.isReject(skip.getSkipType())), SkipJson::getNowNodeCode); + pathWayData.getTargetNodes().forEach(node -> rejectReset(node.getNodeCode(), skipNextMap, nodeMap)); + } + + pathWayData.getTargetNodes().forEach(node -> { + if (NodeType.isEnd(node.getNodeType())) { + nodeList.forEach(nodeJson -> { + if (ChartStatus.isToDo(nodeJson.getStatus())) { + nodeJson.setStatus(ChartStatus.NOT_DONE.getKey()); + } + }); + } + }); + + + return JsonUtil.objToStr(defJson); + } + + public List getChartRgb(String modelValue) { + List chartStatusColor = new ArrayList<>(); + Color done = ChartStatus.getDone(modelValue); + chartStatusColor.add(done.getRed() + "," + done.getGreen() + "," + done.getBlue()); + Color toDo = ChartStatus.getToDo(modelValue); + chartStatusColor.add(toDo.getRed() + "," + toDo.getGreen() + "," + toDo.getBlue()); + Color notDone = ChartStatus.getNotDone(modelValue); + chartStatusColor.add(notDone.getRed() + "," + notDone.getGreen() + "," + notDone.getBlue()); + return chartStatusColor; + } + + private String getSkipKey(SkipJson skip) { + return ArrayUtil.join(new String[]{ + skip.getNowNodeCode(), + skip.getSkipType(), + skip.getSkipCondition(), + skip.getNextNodeCode()}, ":"); + } + + private String getSkipKey(FlowSkip skip) { + return ArrayUtil.join(new String[]{ + skip.getNowNodeCode(), + skip.getSkipType(), + skip.getSkipCondition(), + skip.getNextNodeCode()}, ":"); + } + + private void rejectReset(String nodeCode, Map> skipNextMap, Map nodeMap) { + List oneNextSkips = skipNextMap.get(nodeCode); + if (CollUtil.isNotEmpty(oneNextSkips)) { + oneNextSkips.forEach(oneNextSkip -> { + if (ObjectUtil.isNotNull(oneNextSkip) && !ChartStatus.isNotDone(oneNextSkip.getStatus())) { + oneNextSkip.setStatus(ChartStatus.NOT_DONE.getKey()); + NodeJson nodeJson = nodeMap.get(oneNextSkip.getNextNodeCode()); + if (ObjectUtil.isNotNull(nodeJson) && !ChartStatus.isNotDone(nodeJson.getStatus())) { + nodeJson.setStatus(ChartStatus.NOT_DONE.getKey()); + rejectReset(nodeJson.getNodeCode(), skipNextMap, nodeMap); + } + } + }); + } + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/service/DefService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/service/DefService.java new file mode 100644 index 000000000..84648dad6 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/service/DefService.java @@ -0,0 +1,361 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.service; +import org.dromara.warm.flow.json.JsonUtil; + +import org.dromara.warm.flow.entity.*; + +import org.dromara.common.core.utils.StreamUtils; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.ObjectUtil; + +import lombok.extern.slf4j.Slf4j; +import org.dromara.warm.flow.FlowEngine; +import org.dromara.warm.flow.constant.ExceptionCons; +import org.dromara.warm.flow.dto.DefJson; +import org.dromara.warm.flow.dto.FlowCombine; +import org.dromara.warm.flow.entity.FlowDefinition; +import org.dromara.warm.flow.entity.FlowInstance; +import org.dromara.warm.flow.entity.FlowNode; +import org.dromara.warm.flow.entity.FlowSkip; +import org.dromara.warm.flow.enums.ActivityStatus; +import org.dromara.warm.flow.enums.PublishStatus; +import org.dromara.warm.flow.exception.FlowException; +import org.dromara.warm.flow.service.WarmServiceImpl; +import org.dromara.warm.flow.utils.*; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.*; +import java.util.stream.Collectors; + + + +import org.dromara.common.core.utils.SpringUtils; +import org.springframework.stereotype.Service; +import org.dromara.warm.flow.mapper.FlowDefinitionMapper; + +import java.util.List; + + +/** + * 流程定义Service业务层处理 + * + * @author warm + * @since 2023-03-29 + */ +@Slf4j +@Service +public class DefService extends WarmServiceImpl { + public FlowDefinition importIs(InputStream is) { + StringBuilder stringBuilder = new StringBuilder(); + try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(is))) { + String line; + while ((line = bufferedReader.readLine()) != null) { + stringBuilder.append(line); + stringBuilder.append(System.lineSeparator()); + } + } catch (IOException e) { + throw new FlowException(ExceptionCons.READ_IS_ERROR); + } + return importJson(stringBuilder.toString()); + } + + public FlowDefinition importJson(String defJson) { + return importDef(JsonUtil.strToBean(defJson, DefJson.class)); + } + + public FlowDefinition importDef(DefJson defJson) { + FlowDefinition definition = DefJson.copyDef(defJson); + FlowCombine flowCombine = FlowConfigUtil.structureFlow(definition); + return insertFlow(flowCombine.getDefinition(), flowCombine.getAllNodes(), flowCombine.getAllSkips()); + } + + public FlowDefinition insertFlow(FlowDefinition definition, List nodeList, List skipList) { + definition.setVersion(getNewVersion(definition)); + for (FlowNode node : nodeList) { + node.setVersion(definition.getVersion()); + } + FlowEngine.defService().save(definition); + FlowEngine.nodeService().saveBatch(nodeList); + FlowEngine.skipService().saveBatch(skipList); + return definition; + } + + public boolean checkAndSave(FlowDefinition definition) { + return save(definition.setVersion(getNewVersion(definition))); + } + + public void saveDef(DefJson defJson, boolean onlyNodeSkip) { + if (ObjectUtil.isNull(defJson)) { + return; + } + FlowCombine flowCombine = DefJson.copyCombine(defJson); + FlowDefinition definition = flowCombine.getDefinition(); + Long id = definition.getId(); + // 如果是新增的流程定义 + if (ObjectUtil.isNull(id)) { + definition.setVersion(getNewVersion(definition)); + FlowEngine.dataFillHandler().idFill(definition); + } + + // 校验流程定义合法性 + checkFlowLegal(flowCombine); + + // 如果是新增的流程定义 + if (ObjectUtil.isNull(id)) { + FlowEngine.defService().save(definition); + } else { + if (!onlyNodeSkip) { + FlowEngine.defService().updateById(definition); + } + // 删除所有节点和连线 + FlowEngine.nodeService().remove(new FlowNode().setDefinitionId(id)); + FlowEngine.skipService().remove(new FlowSkip().setDefinitionId(id)); + } + + // 保存流程节点和跳转 + List allNodes = flowCombine.getAllNodes(); + allNodes.forEach(node -> { + if(StrUtil.isEmpty(node.getNodeRatio())) { + node.setNodeRatio("0"); + } + }); + // 所有的流程连线 + List allSkips = flowCombine.getAllSkips(); + + // 保存节点,流程连线,权利人 + FlowEngine.nodeService().saveBatch(allNodes); + FlowEngine.skipService().saveBatch(allSkips); + } + + public String exportJson(Long id) { + return JsonUtil.objToStr(queryDesign(id).setIsPublish(null)); + } + + public FlowDefinition getAllDataDefinition(Long id) { + FlowDefinition definition = getMapper().selectById(id); + List nodeList = FlowEngine.nodeService().getByDefId(id); + definition.setNodeList(nodeList); + List skips = FlowEngine.skipService().getByDefId(id); + Map> flowSkipMap = skips.stream() + .collect(Collectors.groupingBy(FlowSkip::getNowNodeCode)); + nodeList.forEach(flowNode -> flowNode.setSkipList(flowSkipMap.get(flowNode.getNodeCode()))); + return definition; + } + + public FlowCombine getFlowCombine(Long id) { + return getFlowCombine(getMapper().selectById(id)); + } + + public FlowCombine getFlowCombineNoDef(Long id) { + FlowCombine flowCombine = new FlowCombine(); + flowCombine.setAllNodes(FlowEngine.nodeService().getByDefId(id)); + flowCombine.setAllSkips(FlowEngine.skipService().getByDefId(id)); + return flowCombine; + } + + public FlowCombine getFlowCombine(FlowDefinition definition) { + FlowCombine flowCombine = getFlowCombineNoDef(definition.getId()); + flowCombine.setDefinition(definition); + return flowCombine; + } + + public DefJson queryDesign(Long id) { + return DefJson.copyDef(getAllDataDefinition(id)); + } + + public List queryByCodeList(List flowCodeList) { + return getMapper().queryByCodeList(flowCodeList); + } + + public void updatePublishStatus(List ids, Integer publishStatus) { + getMapper().updatePublishStatus(ids, publishStatus); + } + + /** + * 删除流程定义 + * + * @param ids 流程定义id + */ + public boolean removeDef(List ids) { + ids.forEach(id -> { + List instances = FlowEngine.insService().getByDefId(id); + AssertUtil.isNotEmpty(instances, ExceptionCons.EXIST_START_TASK); + }); + FlowEngine.nodeService().deleteNodeByDefIds(ids); + FlowEngine.skipService().deleteSkipByDefIds(ids); + return removeByIds(ids); + } + + public boolean publish(Long id) { + List nodeList = FlowEngine.nodeService().getByDefId(id); + AssertUtil.isEmpty(nodeList, ExceptionCons.NOT_DRAW_FLOW_ERROR); + FlowDefinition definition = getById(id); + List definitions = getByFlowCode(definition.getFlowCode()); + // 已发布流程定义,改为已失效或者未发布状态 + List otherDefIds = definitions.stream() + .filter(item -> !Objects.equals(definition.getId(), item.getId()) + && PublishStatus.PUBLISHED.getKey().equals(item.getIsPublish())) + .map(FlowDefinition::getId) + .collect(Collectors.toList()); + if (CollUtil.isNotEmpty(otherDefIds)) { + List instanceList = FlowEngine.insService().listByDefIds(otherDefIds); + if (CollUtil.isNotEmpty(instanceList)) { + // 已发布已使用过的流程定义 + Set useDefIds = StreamUtils.toSet(instanceList, FlowInstance::getDefinitionId); + if (CollUtil.isNotEmpty(useDefIds)) { + // 已发布已使用过的流程定义,改为已失效 + getMapper().updatePublishStatus(new ArrayList<>(useDefIds), PublishStatus.EXPIRED.getKey()); + // 过滤掉已发布已使用-->已发布未使用 + otherDefIds.removeIf(useDefIds::contains); + } + } + if (CollUtil.isNotEmpty(otherDefIds)) { + // 已发布未使用过的流程定义,改为未发布 + getMapper().updatePublishStatus(otherDefIds, PublishStatus.UNPUBLISHED.getKey()); + } + } + + FlowDefinition flowDefinition = new FlowDefinition(); + flowDefinition.setId(id); + flowDefinition.setIsPublish(PublishStatus.PUBLISHED.getKey()); + return updateById(flowDefinition); + } + + public boolean unPublish(Long id) { + List instances = FlowEngine.insService().getByDefId(id); + AssertUtil.isNotEmpty(instances, ExceptionCons.EXIST_START_TASK); + FlowDefinition definition = new FlowDefinition().setId(id); + definition.setIsPublish(PublishStatus.UNPUBLISHED.getKey()); + return updateById(definition); + } + + public boolean copyDef(Long id) { + FlowDefinition sourceDef = getById(id); + AssertUtil.isNull(sourceDef, ExceptionCons.NOT_FOUNT_DEF); + FlowDefinition definition = sourceDef.copy(); + definition.setVersion(getNewVersion(definition)); + + List nodeList = FlowEngine.nodeService().getByDefId(id).stream().map(FlowNode::copy).collect(Collectors.toList()); + List skipList = FlowEngine.skipService().getByDefId(id).stream().map(FlowSkip::copy).collect(Collectors.toList()); + FlowEngine.dataFillHandler().idFill(definition); + + nodeList.forEach(node -> node.setDefinitionId(definition.getId()).setVersion(definition.getVersion())); + FlowEngine.nodeService().saveBatch(nodeList); + + skipList.forEach(skip -> skip.setDefinitionId(definition.getId())); + FlowEngine.skipService().saveBatch(skipList); + return save(definition); + } + + public boolean active(Long id) { + FlowDefinition definition = getById(id); + AssertUtil.isNull(definition, ExceptionCons.NOT_FOUNT_DEF); + AssertUtil.isTrue(ActivityStatus.isActivity(definition.getActivityStatus()), ExceptionCons.DEFINITION_ALREADY_ACTIVITY); + definition.setActivityStatus(ActivityStatus.ACTIVITY.getKey()); + return updateById(definition); + } + + public boolean unActive(Long id) { + FlowDefinition definition = getById(id); + AssertUtil.isNull(definition, ExceptionCons.NOT_FOUNT_DEF); + AssertUtil.isTrue(ActivityStatus.isSuspended(definition.getActivityStatus()), ExceptionCons.DEFINITION_ALREADY_SUSPENDED); + definition.setActivityStatus(ActivityStatus.SUSPENDED.getKey()); + return updateById(definition); + } + + public List getByFlowCode(String flowCode) { + return list(new FlowDefinition().setFlowCode(flowCode)); + } + + public FlowDefinition getPublishByFlowCode(String flowCode) { + return FlowEngine.defService().getOne(new FlowDefinition() + .setFlowCode(flowCode).setIsPublish(PublishStatus.PUBLISHED.getKey())); + } + + private String getNewVersion(FlowDefinition definition) { + List flowCodeList = Collections.singletonList(definition.getFlowCode()); + List definitions = getMapper().queryByCodeList(flowCodeList); + int highestVersion = 0; + String latestNonPositiveVersion = null; + long latestTimestamp = Long.MIN_VALUE; + + for (FlowDefinition otherDef : definitions) { + if (definition.getFlowCode().equals(otherDef.getFlowCode())) { + try { + int version = Integer.parseInt(otherDef.getVersion()); + if (version > highestVersion) { + highestVersion = version; + } + } catch (NumberFormatException e) { + long timestamp = otherDef.getCreateTime().getTime(); + if (timestamp > latestTimestamp) { + latestTimestamp = timestamp; + latestNonPositiveVersion = otherDef.getVersion(); + } + } + } + } + + String version = "1"; + if (highestVersion > 0) { + version = String.valueOf(highestVersion + 1); + } else if (latestNonPositiveVersion != null) { + version = latestNonPositiveVersion + "_1"; + } + + return version; + } + + private void checkFlowLegal(FlowCombine flowCombine) { + FlowDefinition definition = flowCombine.getDefinition(); + String flowName = definition.getFlowName(); + AssertUtil.isEmpty(definition.getFlowCode(), "【" + flowName + "】流程flowCode为空!"); + // 节点校验 + List allNodes = flowCombine.getAllNodes(); + List allSkips = flowCombine.getAllSkips(); + Map> skipMap = StreamUtils.groupByKey(allSkips, FlowSkip::getNowNodeCode); + allNodes.forEach(node -> { + node.setSkipList(skipMap.get(node.getNodeCode())); + skipMap.remove(node.getNodeCode()); + }); + AssertUtil.isNotEmpty(skipMap, "[" + flowName + "]" + ExceptionCons.FLOW_HAVE_USELESS_SKIP); + // 每一个流程的开始节点个数 + Set nodeCodeSet = new HashSet<>(); + // 便利一个流程中的各个节点 + int startNum = 0; + for (FlowNode node : allNodes) { + FlowConfigUtil.initNodeAndCondition(node, definition.getId(), definition.getVersion()); + startNum = FlowConfigUtil.checkStartAndSame(node, startNum, flowName, nodeCodeSet); + } + AssertUtil.isTrue(startNum == 0, "[" + flowName + "]" + ExceptionCons.LOST_START_NODE); + // 校验跳转节点的合法性 + FlowConfigUtil.checkSkipNode(allSkips); + // 校验所有目标节点是否都存在 + FlowConfigUtil.validaIsExistDestNode(allSkips, nodeCodeSet); + } + + + @Override + public FlowDefinitionMapper getMapper() { + return SpringUtils.getBean(FlowDefinitionMapper.class); + } +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/service/HisTaskService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/service/HisTaskService.java new file mode 100644 index 000000000..e7906b51a --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/service/HisTaskService.java @@ -0,0 +1,253 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.service; +import org.dromara.warm.flow.entity.*; + +import com.baomidou.mybatisplus.extension.toolkit.SqlHelper; +import org.dromara.common.core.utils.StreamUtils; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.ArrayUtil; + +import org.dromara.warm.flow.FlowEngine; +import org.dromara.warm.flow.dto.FlowParams; +import org.dromara.warm.flow.entity.FlowHisTask; +import org.dromara.warm.flow.entity.FlowNode; +import org.dromara.warm.flow.entity.FlowTask; +import org.dromara.warm.flow.entity.FlowUser; +import org.dromara.warm.flow.enums.CooperateType; +import org.dromara.warm.flow.enums.FlowStatus; +import org.dromara.warm.flow.enums.SkipType; +import org.dromara.warm.flow.service.WarmServiceImpl; +import org.dromara.warm.flow.utils.*; + +import java.util.ArrayList; +import java.util.List; + + + + + +import org.dromara.common.core.utils.SpringUtils; +import org.springframework.stereotype.Service; +import org.dromara.warm.flow.mapper.FlowHisTaskMapper; + + + + +/** + * 历史任务记录Service业务层处理 + * + * @author warm + * @since 2023-03-29 + */ +@Service +public class HisTaskService extends WarmServiceImpl { + public List listByTaskId(Long taskId) { + return list(new FlowHisTask().setTaskId(taskId)); + } + + public List listByTaskIdAndCooperateTypes(Long taskId, Integer... cooperateTypes) { + if (ArrayUtil.isEmpty(cooperateTypes)) { + return listByTaskId(taskId); + } + if (cooperateTypes.length == 1) { + return list(new FlowHisTask().setTaskId(taskId).setCooperateType(cooperateTypes[0])); + } + return getMapper().listByTaskIdAndCooperateTypes(taskId, cooperateTypes); + } + + public List getByInsAndNodeCodes(Long instanceId, List nodeCodes) { + return getMapper().getByInsAndNodeCodes(instanceId, nodeCodes); + } + + public boolean deleteByInsIds(List instanceIds) { + return SqlHelper.retBool(getMapper().deleteByInsIds(instanceIds)); + } + + public FlowHisTask setSkipInsHis(FlowTask task, List nextNodes, FlowParams flowParams) { + String flowStatus = getFlowStatus(flowParams); + return setSkipHis(task, nextNodes, flowParams, flowStatus); + } + + public List setSkipHisList(List taskList, List nextNodes, FlowParams flowParams) { + String flowStatus = getFlowStatus(flowParams); + List hisTasks = new ArrayList<>(); + for (FlowTask task : taskList) { + FlowHisTask hisTask = setSkipHis(task, nextNodes, flowParams, flowStatus); + hisTasks.add(hisTask); + } + return hisTasks; + } + + public FlowHisTask setSkipHisTask(FlowTask task, FlowNode nextNode, FlowParams flowParams) { + String flowStatus = getFlowStatus(flowParams); + return setSkipHis(task, CollUtil.toList(nextNode), flowParams, flowStatus); + } + + + public FlowHisTask setCooperateHis(FlowTask task, FlowParams flowParams + , List collaborators) { + String flowStatus = getFlowStatus(flowParams); + FlowHisTask hisTask = new FlowHisTask() + .setTaskId(task.getId()) + .setInstanceId(task.getInstanceId()) + .setCooperateType(ObjectUtil.defaultIfNull(flowParams.getCooperateType(), CooperateType.APPROVAL.getKey())) + .setCollaborator(StreamUtils.join(collaborators, c -> c)) + .setNodeCode(task.getNodeCode()) + .setNodeName(task.getNodeName()) + .setNodeType(task.getNodeType()) + .setDefinitionId(task.getDefinitionId()) + .setTargetNodeCode(task.getNodeCode()) + .setTargetNodeName(task.getNodeName()) + .setApprover(flowParams.getHandler()) + .setSkipType(flowParams.getSkipType()) + .setFlowStatus(StrUtil.emptyToDefault(flowStatus, FlowStatus.APPROVAL.getKey())) + .setFormCustom(task.getFormCustom()) + .setFormPath(task.getFormPath()) + .setMessage(flowParams.getMessage()) + .setVariable(flowParams.getVariableStr()) + //业务详情添加至历史记录 + .setExt(flowParams.getHisTaskExt()) + .setCreateTime(task.getCreateTime()); + FlowEngine.dataFillHandler().idFill(hisTask); + return hisTask; + } + + public FlowHisTask notSkip(FlowTask task, FlowParams flowParams) { + String flowStatus = getFlowStatus(flowParams); + FlowHisTask hisTask = new FlowHisTask() + .setTaskId(task.getId()) + .setInstanceId(task.getInstanceId()) + .setCooperateType(ObjectUtil.defaultIfNull(flowParams.getCooperateType(), CooperateType.APPROVAL.getKey())) + .setNodeCode(task.getNodeCode()) + .setNodeName(task.getNodeName()) + .setNodeType(task.getNodeType()) + .setDefinitionId(task.getDefinitionId()) + .setTargetNodeCode(task.getNodeCode()) + .setTargetNodeName(task.getNodeName()) + .setApprover(flowParams.getHandler()) + .setSkipType(SkipType.NONE.getKey()) + .setFlowStatus(flowStatus) + .setFormCustom(task.getFormCustom()) + .setFormPath(task.getFormPath()) + .setMessage(flowParams.getMessage()) + .setVariable(flowParams.getVariableStr()) + //业务详情添加至历史记录 + .setExt(flowParams.getHisTaskExt()) + .setCreateTime(task.getCreateTime()); + FlowEngine.dataFillHandler().idFill(hisTask); + return hisTask; + } + + public FlowHisTask setDeputeHisTask(FlowTask task, FlowParams flowParams, FlowUser entrustedUser) { + String flowStatus = getFlowStatus(flowParams); + FlowHisTask hisTask = new FlowHisTask() + .setTaskId(task.getId()) + .setInstanceId(task.getInstanceId()) + .setCooperateType(CooperateType.DEPUTE.getKey()) + .setNodeCode(task.getNodeCode()) + .setNodeName(task.getNodeName()) + .setNodeType(task.getNodeType()) + .setDefinitionId(task.getDefinitionId()) + .setTargetNodeCode(task.getNodeCode()) + .setTargetNodeName(task.getNodeName()) + .setApprover(flowParams.getHandler()) + .setCollaborator(entrustedUser.getCreateBy()) + .setSkipType(flowParams.getSkipType()) + .setFlowStatus(StrUtil.isNotEmpty(flowStatus) + ? flowStatus : SkipType.isReject(flowParams.getSkipType()) + ? FlowStatus.REJECT.getKey() : FlowStatus.PASS.getKey()) + .setFormCustom(task.getFormCustom()) + .setFormPath(task.getFormPath()) + .setMessage(flowParams.getMessage()) + .setVariable(flowParams.getVariableStr()) + //业务详情添加至历史记录 + .setExt(flowParams.getHisTaskExt()) + .setCreateTime(task.getCreateTime()); + FlowEngine.dataFillHandler().idFill(hisTask); + return hisTask; + } + + public FlowHisTask setSignHisTask(FlowTask task, FlowParams flowParams, String nodeRatio, boolean isPass) { + String flowStatus = getFlowStatus(flowParams); + FlowHisTask hisTask = new FlowHisTask() + .setTaskId(task.getId()) + .setInstanceId(task.getInstanceId()) + .setCooperateType(CooperateType.isCountersign(nodeRatio) + ? CooperateType.COUNTERSIGN.getKey() : CooperateType.VOTE.getKey()) + .setNodeCode(task.getNodeCode()) + .setNodeName(task.getNodeName()) + .setNodeType(task.getNodeType()) + .setDefinitionId(task.getDefinitionId()) + .setApprover(flowParams.getHandler()) + .setSkipType(isPass ? SkipType.PASS.getKey() : SkipType.REJECT.getKey()) + .setFlowStatus(StrUtil.isNotEmpty(flowStatus) + ? flowStatus : isPass + ? FlowStatus.PASS.getKey() : FlowStatus.REJECT.getKey()) + .setFormCustom(task.getFormCustom()) + .setFormPath(task.getFormPath()) + .setMessage(flowParams.getMessage()) + .setVariable(flowParams.getVariableStr()) + //业务详情添加至历史记录 + .setExt(flowParams.getHisTaskExt()) + .setCreateTime(task.getCreateTime()); + FlowEngine.dataFillHandler().idFill(hisTask); + return hisTask; + } + + public List getByInsId(Long instanceId) { + return FlowEngine.hisTaskService().list(new FlowHisTask().setInstanceId(instanceId)); + } + + private FlowHisTask setSkipHis(FlowTask task, List nextNodes, FlowParams flowParams, String flowStatus) { + FlowHisTask hisTask = new FlowHisTask() + .setTaskId(task.getId()) + .setInstanceId(task.getInstanceId()) + .setCooperateType(ObjectUtil.defaultIfNull(flowParams.getCooperateType(), CooperateType.APPROVAL.getKey())) + .setNodeCode(task.getNodeCode()) + .setNodeName(task.getNodeName()) + .setNodeType(task.getNodeType()) + .setDefinitionId(task.getDefinitionId()) + .setTargetNodeCode(StreamUtils.join(nextNodes, FlowNode::getNodeCode)) + .setTargetNodeName(StreamUtils.join(nextNodes, FlowNode::getNodeName)) + .setApprover(flowParams.getHandler()) + .setSkipType(flowParams.getSkipType()) + .setFlowStatus(StrUtil.isNotEmpty(flowStatus) + ? flowStatus : SkipType.isReject(flowParams.getSkipType()) + ? FlowStatus.REJECT.getKey() : FlowStatus.PASS.getKey()) + .setFormCustom(task.getFormCustom()) + .setFormPath(task.getFormPath()) + .setMessage(flowParams.getMessage()) + .setVariable(flowParams.getVariableStr()) + //业务详情添加至历史记录 + .setExt(flowParams.getHisTaskExt()) + .setCreateTime(task.getCreateTime()); + FlowEngine.dataFillHandler().idFill(hisTask); + return hisTask; + } + + private String getFlowStatus(FlowParams flowParams) { + return StrUtil.emptyToDefault(flowParams.getHisStatus(), flowParams.getFlowStatus()); + } + + @Override + public FlowHisTaskMapper getMapper() { + return SpringUtils.getBean(FlowHisTaskMapper.class); + } +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/service/IWarmService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/service/IWarmService.java new file mode 100644 index 000000000..001aee51b --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/service/IWarmService.java @@ -0,0 +1,115 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.service; + +import java.io.Serializable; +import java.util.Collection; +import java.util.List; + +/** + * Service接口 + * + * @author warm + * @since 2023-03-17 + */ +public interface IWarmService { + /** + * 根据id查询 + * + * @param id 主键 + * @return 实体 + */ + T getById(Serializable id); + + /** + * 根据ids查询 + * + * @param ids 主键 + * @return 实体 + */ + List getByIds(Collection ids); + + /** + * 查询列表 + * + * @param entity 查询实体 + * @return 集合 + */ + List list(T entity); + + /** + * 查询一条记录 + * + * @param entity 查询实体 + * @return 结果 + */ + T getOne(T entity); + + /** + * 判断是否存在 + * + * @param entity 查询实体 + * @return 结果 + */ + Boolean exists(T entity); + + /** + * 新增 + * + * @param entity 实体 + * @return 结果 + */ + boolean save(T entity); + + /** + * 根据id修改 + * + * @param entity 实体 + * @return 结果 + */ + boolean updateById(T entity); + + /** + * 根据id删除 + * + * @param id 主键 + * @return 结果 + */ + boolean removeById(Serializable id); + + /** + * 根据entity删除 + * + * @param entity 实体 + * @return 结果 + */ + boolean remove(T entity); + + /** + * 根据ids批量删除 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + boolean removeByIds(Collection ids); + + /** + * 批量新增 + * + * @param list 实体集合 + */ + void saveBatch(List list); +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/service/InsService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/service/InsService.java new file mode 100644 index 000000000..d16f09dcb --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/service/InsService.java @@ -0,0 +1,252 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.service; +import org.dromara.warm.flow.json.JsonUtil; + +import org.dromara.warm.flow.entity.*; + +import org.dromara.common.core.utils.StreamUtils; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; + +import org.dromara.warm.flow.FlowEngine; +import org.dromara.warm.flow.constant.ExceptionCons; +import org.dromara.warm.flow.dto.FlowCombine; +import org.dromara.warm.flow.dto.FlowParams; +import org.dromara.warm.flow.dto.PathWayData; +import org.dromara.warm.flow.enums.ActivityStatus; +import org.dromara.warm.flow.enums.FlowStatus; +import org.dromara.warm.flow.enums.NodeType; +import org.dromara.warm.flow.enums.SkipType; +import org.dromara.warm.flow.listener.ListenerVariable; +import org.dromara.warm.flow.service.WarmServiceImpl; +import org.dromara.warm.flow.utils.*; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + + +import org.dromara.warm.flow.entity.FlowInstance; + +import org.dromara.common.core.utils.SpringUtils; +import org.springframework.stereotype.Service; +import org.dromara.warm.flow.mapper.FlowInstanceMapper; + + + +/** + * 流程实例Service业务层处理 + * + * @author warm + * @since 2023-03-29 + */ +@Service +public class InsService extends WarmServiceImpl { + public FlowInstance start(String businessId, FlowParams flowParams) { + AssertUtil.isNull(flowParams.getFlowCode(), ExceptionCons.NULL_FLOW_CODE); + AssertUtil.isEmpty(businessId, ExceptionCons.NULL_BUSINESS_ID); + // 获取已发布的流程节点 + FlowDefinition definition = FlowEngine.defService().getPublishByFlowCode(flowParams.getFlowCode()); + AssertUtil.isNull(definition, ExceptionCons.NOT_FOUNT_DEF); + FlowCombine flowCombine = FlowEngine.defService().getFlowCombine(definition); + // 获取开始节点 + FlowNode startNode = StreamUtils.findFirstValue(flowCombine.getAllNodes(), t -> NodeType.isStart(t.getNodeType())); + AssertUtil.isNull(startNode, ExceptionCons.LOST_START_NODE); + + // 判断流程定义是否激活状态 + AssertUtil.isTrue(definition.getActivityStatus().equals(ActivityStatus.SUSPENDED.getKey()) + , ExceptionCons.NOT_DEFINITION_ACTIVITY); + flowParams.skipType(SkipType.PASS.getKey()); + + // 执行开始监听器 + ListenerUtil.executeStart(new ListenerVariable(definition, null, startNode, flowParams.getVariable()) + .setFlowParams(flowParams)); + + + // 获取下一个节点,如果是网关节点,则重新获取后续节点 + PathWayData pathWayData = new PathWayData().setDefId(startNode.getDefinitionId()).setSkipType(flowParams.getSkipType()); + List nextNodes = FlowEngine.nodeService().getNextNodeList(startNode, null, flowParams.getSkipType(), + flowParams.getVariable(), pathWayData, flowCombine); + + // 设置流程实例对象 + FlowInstance instance = setStartInstance(nextNodes.get(0), businessId, flowParams); + + // 设置历史任务 + FlowHisTask hisTask = setHisTask(nextNodes, flowParams, startNode, instance.getId()); + + List addTasks = StreamUtils.toList(nextNodes, node -> FlowEngine.taskService() + .addTask(node, instance, definition, flowParams)); + + // 办理人变量替换 + if (CollUtil.isNotEmpty(addTasks)) { + ExpressionUtil.evalVariable(addTasks, flowParams); + } + + // 设置流程图元数据 + pathWayData.getTargetNodes().addAll(nextNodes); + instance.setDefJson(FlowEngine.chartService().startMetadata(pathWayData)); + + // 执行分派监听器 + ListenerUtil.executeAssignment(new ListenerVariable(definition, instance, startNode, flowParams.getVariable() + , null, nextNodes, addTasks).setFlowParams(flowParams)); + + // 开启流程,保存流程信息 + saveFlowInfo(instance, addTasks, hisTask, flowParams); + + // 执行完成和创建监听器 + ListenerUtil.endCreateListener(new ListenerVariable(definition, instance, startNode, flowParams.getVariable() + , null, nextNodes, addTasks).setFlowParams(flowParams)); + + return instance; + } + + public List listByDefIds(List defIds) { + return getMapper().getByDefIds(defIds); + } + + public boolean remove(List instanceIds) { + return toRemoveTask(instanceIds); + } + + public List getByDefId(Long definitionId) { + return list(new FlowInstance().setDefinitionId(definitionId)); + } + + /** + * 设置历史任务 + * + * @param nextNodes 下一节点集合 + * @param flowParams 流程参数 + * @param startNode 开始节点 + * @param instanceId 流程实例id + */ + private FlowHisTask setHisTask(List nextNodes, FlowParams flowParams, FlowNode startNode, Long instanceId) { + FlowTask startTask = new FlowTask() + .setInstanceId(instanceId) + .setDefinitionId(startNode.getDefinitionId()) + .setNodeCode(startNode.getNodeCode()) + .setNodeName(startNode.getNodeName()) + .setNodeType(startNode.getNodeType()); + FlowEngine.dataFillHandler().idFill(startTask); + // 开始任务转历史任务 + return FlowEngine.hisTaskService().setSkipInsHis(startTask, nextNodes, flowParams); + } + + /** + * 开启流程,保存流程信息 + * + * @param instance 流程实例 + * @param addTasks 新增任务 + * @param hisTask 历史任务 + */ + private void saveFlowInfo(FlowInstance instance, List addTasks, FlowHisTask hisTask, FlowParams flowParams) { + FlowEngine.taskService().setInsFinishInfo(instance, addTasks, flowParams); + FlowEngine.hisTaskService().save(hisTask); + // 待办任务设置处理人 + if (CollUtil.isNotEmpty(addTasks)) { + List users = FlowEngine.userService().taskAddUsers(addTasks); + FlowEngine.taskService().saveBatch(addTasks); + FlowEngine.userService().saveBatch(users); + } + save(instance); + } + + /** + * 设置流程实例对象 + * + * @param firstBetweenNode 第一个中间节点 + * @param businessId 业务id + * @return FlowInstance + */ + private FlowInstance setStartInstance(FlowNode firstBetweenNode, String businessId + , FlowParams flowParams) { + FlowInstance instance = new FlowInstance(); + Date now = new Date(); + FlowEngine.dataFillHandler().idFill(instance); + // 关联业务id,其实后面可以不用到业务id,传业务id目前来看只是为了批量创建流程的时候能创建出有区别化的流程,也是为了后期需要用到businessId。 + instance.setDefinitionId(firstBetweenNode.getDefinitionId()) + .setBusinessId(businessId) + .setNodeType(firstBetweenNode.getNodeType()) + .setNodeCode(firstBetweenNode.getNodeCode()) + .setNodeName(firstBetweenNode.getNodeName()) + .setFlowStatus(StrUtil.emptyToDefault(flowParams.getFlowStatus(), FlowStatus.TOBESUBMIT.getKey())) + .setActivityStatus(ActivityStatus.ACTIVITY.getKey()) + .setVariable(JsonUtil.objToStr(flowParams.getVariable())) + .setCreateTime(now) + .setUpdateTime(now) + .setCreateBy(flowParams.getHandler()) + .setUpdateBy(flowParams.getHandler()) + .setExt(flowParams.getExt()); + return instance; + } + + private boolean toRemoveTask(List instanceIds) { + AssertUtil.isEmpty(instanceIds, ExceptionCons.NULL_INSTANCE_ID); + + List taskIds = new ArrayList<>(); + instanceIds.forEach(instanceId -> taskIds.addAll( + FlowEngine.taskService() + .list(new FlowTask().setInstanceId(instanceId)) + .stream() + .map(FlowTask::getId) + .collect(Collectors.toList()))); + + if (CollUtil.isNotEmpty(taskIds)) { + FlowEngine.userService().deleteByTaskIds(taskIds); + } + + FlowEngine.taskService().deleteByInsIds(instanceIds); + FlowEngine.hisTaskService().deleteByInsIds(instanceIds); + return FlowEngine.insService().removeByIds(instanceIds); + } + + public boolean active(Long id) { + FlowInstance instance = getById(id); + AssertUtil.isNull(instance, ExceptionCons.NOT_FOUNT_INSTANCE); + AssertUtil.isTrue(ActivityStatus.isActivity(instance.getActivityStatus()), ExceptionCons.INSTANCE_ALREADY_ACTIVITY); + instance.setActivityStatus(ActivityStatus.ACTIVITY.getKey()); + return updateById(instance); + } + + public boolean unActive(Long id) { + FlowInstance instance = getById(id); + AssertUtil.isNull(instance, ExceptionCons.NOT_FOUNT_INSTANCE); + AssertUtil.isTrue(ActivityStatus.isSuspended(instance.getActivityStatus()), ExceptionCons.INSTANCE_ALREADY_SUSPENDED); + instance.setActivityStatus(ActivityStatus.SUSPENDED.getKey()); + return updateById(instance); + } + + public void removeVariables(Long instanceId, String... keys) { + FlowInstance instance = FlowEngine.insService().getById(instanceId); + if (instance != null) { + Map variableMap = instance.getVariableMap(); + for (String key : keys) { + variableMap.remove(key); + } + instance.setVariable(JsonUtil.objToStr(variableMap)); + FlowEngine.insService().updateById(instance); + } + } + + @Override + public FlowInstanceMapper getMapper() { + return SpringUtils.getBean(FlowInstanceMapper.class); + } +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/service/NodeService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/service/NodeService.java new file mode 100644 index 000000000..d638d4415 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/service/NodeService.java @@ -0,0 +1,366 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.service; +import org.dromara.warm.flow.json.JsonUtil; + +import org.dromara.warm.flow.entity.*; + +import org.dromara.common.core.utils.StreamUtils; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.ObjectUtil; + +import lombok.extern.slf4j.Slf4j; +import org.dromara.warm.flow.FlowEngine; +import org.dromara.warm.flow.constant.ExceptionCons; +import org.dromara.warm.flow.constant.FlowCons; +import org.dromara.warm.flow.dto.FlowCombine; +import org.dromara.warm.flow.dto.PathWayData; +import org.dromara.warm.flow.entity.FlowDefinition; +import org.dromara.warm.flow.entity.FlowNode; +import org.dromara.warm.flow.entity.FlowSkip; +import org.dromara.warm.flow.enums.NodeType; +import org.dromara.warm.flow.enums.PublishStatus; +import org.dromara.warm.flow.enums.SkipType; +import org.dromara.warm.flow.exception.FlowException; +import org.dromara.warm.flow.service.WarmServiceImpl; +import org.dromara.warm.flow.utils.*; + +import java.io.Serializable; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + + + + +import org.dromara.common.core.utils.SpringUtils; +import org.springframework.stereotype.Service; +import org.dromara.warm.flow.mapper.FlowNodeMapper; + + +import java.util.Collection; + +import java.util.List; + + +/** + * 流程节点Service业务层处理 + * + * @author warm + * @since 2023-03-29 + */ +@Slf4j +@Service +public class NodeService extends WarmServiceImpl { + public List getPublishByFlowCode(String flowCode) { + FlowDefinition definition = FlowEngine.defService().getOne(new FlowDefinition() + .setFlowCode(flowCode).setIsPublish(PublishStatus.PUBLISHED.getKey())); + if (ObjectUtil.isNotNull(definition)) { + return list(new FlowNode().setDefinitionId(definition.getId())); + } + return Collections.emptyList(); + } + + public List getByNodeCodes(List nodeCodes, Long definitionId) { + return getMapper().getByNodeCodes(nodeCodes, definitionId); + } + + public List previousNodeList(Long nodeId) { + FlowNode nowNode = getById(nodeId); + return previousNodeList(nowNode.getDefinitionId(), nowNode.getNodeCode()); + } + + public List previousNodeList(Long definitionId, String nowNodeCode) { + return prefixOrSuffixNodes(definitionId, nowNodeCode, FlowCons.PREVIOUS); + } + + public List suffixNodeList(Long nodeId) { + FlowNode nowNode = getById(nodeId); + return suffixNodeList(nowNode.getDefinitionId(), nowNode.getNodeCode()); + } + + public List suffixNodeList(Long definitionId, String nowNodeCode) { + return prefixOrSuffixNodes(definitionId, nowNodeCode, FlowCons.SUFFIX); + } + + public List suffixNodeList(String nowNodeCode, FlowCombine flowCombine) { + return prefixOrSuffixNodes(nowNodeCode, FlowCons.SUFFIX, flowCombine); + } + + public List getByDefId(Long definitionId) { + return list(new FlowNode().setDefinitionId(definitionId)); + } + + public FlowNode getByDefIdAndNodeCode(Long definitionId, String nodeCode) { + return getOne(new FlowNode().setDefinitionId(definitionId).setNodeCode(nodeCode)); + } + + public FlowNode getStartNode(Long definitionId) { + return getOne(new FlowNode().setDefinitionId(definitionId).setNodeType(NodeType.START.getKey())); + } + + public List getBetweenNode(Long definitionId) { + return list(new FlowNode().setDefinitionId(definitionId).setNodeType(NodeType.BETWEEN.getKey())); + } + + + public List getFirstBetweenNode(Long definitionId, Map variable) { + FlowCombine flowCombine = FlowEngine.defService().getFlowCombineNoDef(definitionId); + FlowNode startNode = StreamUtils.findFirstValue(flowCombine.getAllNodes(), t -> NodeType.isStart(t.getNodeType())); + return getNextNodeList(startNode, null, SkipType.PASS.getKey(), + variable, null, flowCombine); + } + + public FlowNode getEndNode(Long definitionId) { + return getOne(new FlowNode().setDefinitionId(definitionId).setNodeType(NodeType.END.getKey())); + } + + public List prefixOrSuffixNodes(Long definitionId, String nowNodeCode, String type) { + FlowCombine flowCombine = new FlowCombine(); + flowCombine.setAllNodes(FlowEngine.nodeService().getByDefId(definitionId)); + flowCombine.setAllSkips(FlowEngine.skipService().getByDefId(definitionId)); + return prefixOrSuffixNodes(nowNodeCode, type, flowCombine); + } + + public List prefixOrSuffixNodes(String nowNodeCode, String type, FlowCombine flowCombine) { + Map nodeMap = StreamUtils.toMap(flowCombine.getAllNodes(), FlowNode::getNodeCode, node -> node); + Map> skipMap = flowCombine.getAllSkips().stream().filter(skip -> SkipType.isPass(skip.getSkipType())) + .collect(Collectors.groupingBy(FlowCons.PREVIOUS.equals(type) ? FlowSkip::getNextNodeCode : FlowSkip::getNowNodeCode + , LinkedHashMap::new, Collectors.toList())); + + List prefixOrSuffixNodes = new ArrayList<>(); + List prefixOrSuffixCode = prefixOrSuffixCodes(skipMap, nowNodeCode + , FlowCons.PREVIOUS.equals(type) ? FlowSkip::getNowNodeCode : FlowSkip::getNextNodeCode); + for (String nodeCode : prefixOrSuffixCode) { + FlowNode node = nodeMap.get(nodeCode); + if (!NodeType.isGateWay(node.getNodeType())) { + prefixOrSuffixNodes.add(node); + } + } + Collections.reverse(prefixOrSuffixNodes); + Set sameCode = new HashSet<>(); + prefixOrSuffixNodes.removeIf(node -> { + if (sameCode.contains(node.getNodeCode())) { + return true; + } + sameCode.add(node.getNodeCode()); + return false; + }); + Collections.reverse(prefixOrSuffixNodes); + return prefixOrSuffixNodes; + } + + public List getNextNodeList(Long definitionId, String nowNodeCode, String anyNodeCode, String skipType, + Map variable) { + AssertUtil.isEmpty(nowNodeCode, ExceptionCons.LOST_NODE_CODE); + // 查询当前节点 + FlowCombine flowCombine = FlowEngine.defService().getFlowCombineNoDef(definitionId); + FlowNode nowNode = StreamUtils.findFirstValue(flowCombine.getAllNodes(), t -> t.getNodeCode().equals(nowNodeCode)); + // 如果是网关节点,则根据条件判断 + return getNextByCheckGateway(variable, getNextNode(nowNode, anyNodeCode, skipType, null, flowCombine), + null, flowCombine); + } + + public FlowNode getNextNode(Long definitionId, String nowNodeCode, String anyNodeCode, String skipType) { + // 查询当前节点 + FlowCombine flowCombine = FlowEngine.defService().getFlowCombineNoDef(definitionId); + FlowNode nowNode = StreamUtils.findFirstValue(flowCombine.getAllNodes(), t -> t.getNodeCode().equals(nowNodeCode)); + return getNextNode(nowNode, anyNodeCode, skipType, null, flowCombine); + } + + public List getNextNodeList(FlowNode nowNode, String anyNodeCode, String skipType, Map variable + , PathWayData pathWayData, FlowCombine flowCombine) { + // 如果是网关节点,则根据条件判断 + return getNextByCheckGateway(variable, getNextNode(nowNode, anyNodeCode, skipType + , pathWayData, flowCombine), pathWayData, flowCombine); + } + + public FlowNode getNextNode(FlowNode nowNode, String anyNodeCode, String skipType, PathWayData pathWayData, FlowCombine flowCombine) { + // 查询当前节点 + AssertUtil.isNull(nowNode, ExceptionCons.LOST_NODE_CODE); + AssertUtil.isNull(nowNode.getDefinitionId(), ExceptionCons.NOT_DEFINITION_ID); + AssertUtil.isEmpty(skipType, ExceptionCons.NULL_CONDITION_VALUE); + + if (pathWayData != null) { + pathWayData.getPathWayNodes().add(nowNode); + } + FlowNode nextNode = null; + if (StrUtil.isNotEmpty(anyNodeCode)) { + // 如果指定了跳转节点,直接获取节点 + nextNode = StreamUtils.findFirstValue(flowCombine.getAllNodes(), node -> anyNodeCode.equals(node.getNodeCode())); + } else if (StrUtil.isNotEmpty(nowNode.getAnyNodeSkip()) && SkipType.isReject(skipType)) { + // 如果配置了任意跳转节点,直接获取节点 + nextNode = StreamUtils.findFirstValue(flowCombine.getAllNodes(), node -> nowNode.getAnyNodeSkip().equals(node.getNodeCode())); + } + + if (ObjectUtil.isNotNull(nextNode)) { + AssertUtil.isTrue(NodeType.isGateWay(nextNode.getNodeType()), ExceptionCons.TAR_NOT_GATEWAY); + return nextNode; + } + + // 获取跳转关系 + List skips = StreamUtils.filter(flowCombine.getAllSkips(), skip -> nowNode.getNodeCode().equals(skip.getNowNodeCode())); + AssertUtil.isNull(skips, ExceptionCons.NULL_DEST_NODE); + FlowSkip nextSkip = getSkipByCheck(skips, skipType); + + // 根据跳转查询出跳转到的那个节点 + nextNode = StreamUtils.findFirstValue(flowCombine.getAllNodes(), node -> nextSkip != null && nextSkip.getNextNodeCode().equals(node.getNodeCode())); + AssertUtil.isNull(nextNode, ExceptionCons.NULL_NODE_CODE); + AssertUtil.isTrue(NodeType.isStart(nextNode.getNodeType()), ExceptionCons.FIRST_FORBID_BACK); + if (pathWayData != null) { + pathWayData.getPathWayNodes().add(nextNode); + pathWayData.getPathWaySkips().add(nextSkip); + } + return nextNode; + } + + public List getNextByCheckGateway(Map variable, FlowNode nextNode, PathWayData pathWayData + , FlowCombine flowCombine) { + // 网关节点处理 + if (NodeType.isGateWay(nextNode.getNodeType())) { + List skipsGateway = StreamUtils.filter(flowCombine.getAllSkips() + , skip -> nextNode.getNodeCode().equals(skip.getNowNodeCode())); + if (CollUtil.isEmpty(skipsGateway)) { + return null; + } + + //如果是互斥网关,跳转条件匹配的,则取任意第一条,否则取跳转条件为空的任意一条 + if (NodeType.isGateWaySerial(nextNode.getNodeType())) { + FlowSkip skipOne = null; + for (FlowSkip skip : skipsGateway) { + if (StrUtil.isNotEmpty(skip.getSkipCondition())) { + if (ExpressionUtil.evalCondition(skip.getSkipCondition(), variable)) { + skipOne = skip; + break; + } + } else { + skipOne = skip; + } + } + skipsGateway = skipOne == null ? null : CollUtil.toList(skipOne); + } else if (NodeType.isGateWayInclusive(nextNode.getNodeType())) { + //如果是包含网关,有跳转条件的分支,但是跳转条件不匹配的不执行,没跳转条件为空的分支默认执行 + skipsGateway.removeIf(skip -> StrUtil.isNotEmpty(skip.getSkipCondition()) + && !ExpressionUtil.evalCondition(skip.getSkipCondition(), variable)); + } + + AssertUtil.isEmpty(skipsGateway, ExceptionCons.NULL_CONDITION_VALUE_NODE); + List nextNodeCodes = StreamUtils.toList(skipsGateway, FlowSkip::getNextNodeCode); + List nextNodes = StreamUtils.filter(flowCombine.getAllNodes() + , node -> nextNodeCodes.contains(node.getNodeCode())); + AssertUtil.isEmpty(nextNodes, ExceptionCons.NOT_NODE_DATA); + if (pathWayData != null) { + pathWayData.getPathWayNodes().addAll(nextNodes); + pathWayData.getPathWaySkips().addAll(skipsGateway); + } + List newNextNodes = new ArrayList<>(); + for (FlowNode node : nextNodes) { + List nodeList = getNextByCheckGateway(variable, node, pathWayData, flowCombine); + newNextNodes.addAll(nodeList); + } + return newNextNodes; + } + // 非网关节点直接返回 + if (pathWayData != null) { + pathWayData.getPathWayNodes().remove(nextNode); + } + AssertUtil.isTrue(NodeType.isStart(nextNode.getNodeType()), ExceptionCons.START_NODE_NOT_ALLOW_JUMP); + return CollUtil.toList(nextNode); + } + + + public int deleteNodeByDefIds(Collection defIds) { + return getMapper().deleteNodeByDefIds(defIds); + } + + public Map getExt(FlowNode node) { + Map map = new HashMap<>(); + String ext = node.getExt(); + if (StrUtil.isNotEmpty(ext)) { + List> extList = JsonUtil.strToList(ext); + if (CollUtil.isNotEmpty(extList)) { + for (Map extMap : extList) { + String code = ObjectUtil.defaultIfNull(extMap.get("code"), "").toString(); + String value = ObjectUtil.defaultIfNull(extMap.get("value"), "").toString(); + if (StrUtil.isAllNotEmpty(code, value)) { + map.put(code, value); + } + } + } + } + + return map; + } + + private List prefixOrSuffixCodes(Map> skipMap, String nodeCode, + Function supplier) { + // 记录已访问节点,防止循环 + Set visited = new HashSet<>(); + List result = new ArrayList<>(); + prefixOrSuffixCodesRecursive(skipMap, nodeCode, supplier, visited, result); + return result; + } + + private void prefixOrSuffixCodesRecursive(Map> skipMap, String nodeCode, + Function supplier, Set visited, List result) { + if (visited.contains(nodeCode)) { + // 防止循环访问 + return; + } + + visited.add(nodeCode); + List skipList = skipMap.get(nodeCode); + + if (CollUtil.isNotEmpty(skipList)) { + for (FlowSkip skip : skipList) { + if (SkipType.isPass(skip.getSkipType())) { + String nextNodeCode = supplier.apply(skip); + // 避免重复添加 + if (!result.contains(nextNodeCode)) { + result.add(nextNodeCode); + } + prefixOrSuffixCodesRecursive(skipMap, nextNodeCode, supplier, visited, result); + } + } + } + } + + + /** + * 通过校验跳转类型获取跳转集合 + * + * @param skips 跳转集合 + * @param skipType 跳转类型 + * @return List + * @author xiarg + * @since 2024/8/21 11:32 + */ + private FlowSkip getSkipByCheck(List skips, String skipType) { + return Optional.ofNullable(skips) + .orElse(Collections.emptyList()) + .stream() + .filter(t -> StrUtil.isEmpty(t.getSkipType()) || skipType.equals(t.getSkipType())) + .findFirst() + .orElseThrow(() -> new FlowException(ExceptionCons.NULL_SKIP_TYPE)); + } + + @Override + public FlowNodeMapper getMapper() { + return SpringUtils.getBean(FlowNodeMapper.class); + } +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/service/SkipService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/service/SkipService.java new file mode 100644 index 000000000..3fa059492 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/service/SkipService.java @@ -0,0 +1,59 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.service; +import org.dromara.warm.flow.entity.*; + +import org.dromara.warm.flow.entity.FlowSkip; +import org.dromara.warm.flow.service.WarmServiceImpl; + +import java.io.Serializable; +import java.util.Collection; +import java.util.List; + + + +import org.dromara.common.core.utils.SpringUtils; +import org.springframework.stereotype.Service; +import org.dromara.warm.flow.mapper.FlowSkipMapper; + + + + +/** + * 节点跳转关联Service业务层处理 + * + * @author warm + * @since 2023-03-29 + */ +@Service +public class SkipService extends WarmServiceImpl { + public int deleteSkipByDefIds(Collection defIds) { + return getMapper().deleteSkipByDefIds(defIds); + } + + public List getByDefId(Long definitionId) { + return list(new FlowSkip().setDefinitionId(definitionId)); + } + + public List getByDefIdAndNowNodeCode(Long definitionId, String nodeCode) { + return list(new FlowSkip().setDefinitionId(definitionId).setNowNodeCode(nodeCode)); + } + + @Override + public FlowSkipMapper getMapper() { + return SpringUtils.getBean(FlowSkipMapper.class); + } +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/service/TaskService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/service/TaskService.java new file mode 100644 index 000000000..7b7849d7e --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/service/TaskService.java @@ -0,0 +1,993 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.service; +import org.dromara.warm.flow.json.JsonUtil; + +import org.dromara.warm.flow.entity.*; + +import com.baomidou.mybatisplus.extension.toolkit.SqlHelper; +import org.dromara.common.core.utils.StreamUtils; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.ObjectUtil; + +import org.dromara.warm.flow.FlowEngine; +import org.dromara.warm.flow.constant.ExceptionCons; +import org.dromara.warm.flow.constant.FlowCons; +import org.dromara.warm.flow.dto.*; +import org.dromara.warm.flow.enums.*; +import org.dromara.warm.flow.listener.ListenerVariable; +import org.dromara.warm.flow.service.WarmServiceImpl; +import org.dromara.warm.flow.utils.*; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.*; +import java.util.stream.Collectors; + + +import org.dromara.warm.flow.entity.FlowTask; + +import org.dromara.common.core.utils.SpringUtils; +import org.springframework.stereotype.Service; +import org.dromara.warm.flow.mapper.FlowTaskMapper; + +import java.util.List; + + +/** + * 待办任务Service业务层处理 + * + * @author warm + * @since 2023-03-29 + */ +@Service +public class TaskService extends WarmServiceImpl { + public FlowInstance pass(Long taskId, String message, Map variable) { + return skip(taskId, new FlowParams(SkipType.PASS.getKey(), message, variable)); + } + + public FlowInstance passAtWill(Long taskId, String nodeCode, String message, Map variable) { + return skip(taskId, new FlowParams(nodeCode, SkipType.PASS.getKey(), message, variable)); + } + + public FlowInstance pass(Long taskId, String message, Map variable, String flowStatus, String hisStatus) { + return skip(taskId, new FlowParams(SkipType.PASS.getKey(), message, variable, flowStatus, hisStatus)); + } + + public FlowInstance passAtWill(Long taskId, String nodeCode, String message, Map variable + , String flowStatus, String hisStatus) { + return skip(taskId, new FlowParams(nodeCode, SkipType.PASS.getKey(), message, variable, flowStatus, hisStatus)); + } + + + public FlowInstance reject(Long taskId, String message, Map variable) { + return skip(taskId, new FlowParams(SkipType.REJECT.getKey(), message, variable)); + } + + public FlowInstance rejectAtWill(Long taskId, String nodeCode, String message, Map variable) { + return skip(taskId, new FlowParams(nodeCode, SkipType.REJECT.getKey(), message, variable)); + } + + public FlowInstance reject(Long taskId, String message, Map variable, String flowStatus, String hisStatus) { + return skip(taskId, new FlowParams(SkipType.REJECT.getKey(), message, variable, flowStatus, hisStatus)); + } + + public FlowInstance rejectAtWill(Long taskId, String nodeCode, String message, Map variable + , String flowStatus, String hisStatus) { + return skip(taskId, new FlowParams(nodeCode, SkipType.REJECT.getKey(), message, variable, flowStatus, hisStatus)); + } + + + public FlowInstance skip(Long taskId, FlowParams flowParams) { + // 获取待办任务 + FlowTask task = getById(taskId); + return skip(flowParams, task); + } + + public FlowInstance skipByInsId(Long instanceId, FlowParams flowParams) { + return skip(flowParams, getTask(instanceId)); + } + + public FlowInstance rejectLastByInsId(Long instanceId, FlowParams flowParams) { + return rejectLast(getTask(instanceId), flowParams); + } + + public FlowInstance rejectLast(Long taskId, FlowParams flowParams) { + return rejectLast(getById(taskId), flowParams); + } + + public FlowInstance rejectLast(FlowTask task, FlowParams flowParams) { + flowParams.skipType(SkipType.REJECT.getKey()); + AssertUtil.isNull(task, ExceptionCons.NOT_FOUNT_TASK); + // 获取当前任务的前置任务 + List hisTaskList = FlowEngine.hisTaskService().getByInsId(task.getInstanceId()); + // 获取hisTaskList中TargetNodeCod等于task.getNodeCode()的,并且id最大的 + FlowHisTask lastHisTask = hisTaskList.stream() + .filter(hisTask -> StrUtil.isNotEmpty(hisTask.getTargetNodeCode())) + .filter(hisTask -> SkipType.isPass(hisTask.getSkipType())) + .filter(hisTask -> { + String targetCode = hisTask.getTargetNodeCode(); + if (targetCode.contains(",")) { + return Arrays.asList(targetCode.split(",")).contains(task.getNodeCode()); + } else { + return targetCode.equals(task.getNodeCode()); + } + }) + .max(Comparator.comparingLong(FlowHisTask::getId)) + .orElse(null); + + AssertUtil.isNull(lastHisTask, ExceptionCons.NOT_FOUNT_LAST_TASK); + flowParams.nodeCode(lastHisTask.getNodeCode()); + return skip(flowParams, task); + } + + public FlowInstance taskBackByInsId(Long instanceId, FlowParams flowParams) { + // 获取当前任务的前置任务 + FlowHisTask lastHisTask = taskBack(flowParams, instanceId); + List suffixNodeList = FlowEngine.nodeService().suffixNodeList(lastHisTask.getDefinitionId() + , lastHisTask.getNodeCode()); + + List suffixNodeCodes = StreamUtils.toList(suffixNodeList, FlowNode::getNodeCode); + List taskList = FlowEngine.taskService().getByInsIdAndNodeCodes(instanceId, suffixNodeCodes); + AssertUtil.isEmpty(taskList, ExceptionCons.NOT_FOUNT_HANDLED_TASK_HANDLER); + return skip(flowParams, taskList.get(0)); + } + + public FlowInstance taskBack(Long taskId, FlowParams flowParams) { + FlowTask task = getById(taskId); + AssertUtil.isNull(task, ExceptionCons.NOT_FOUNT_TASK); + taskBack(flowParams, task.getInstanceId()); + return skip(flowParams, task); + } + + public FlowInstance skip(FlowParams flowParams, FlowTask task) { + // TODO min 后续考虑并发问题,待办任务和实例表不同步,可给待办任务id加锁,抽取所接口,方便后续兼容分布式锁 + // 流程开启前正确性校验 + R r = getAndCheck(task); + flowParams.variable(MapUtil.mergeAll(r.instance.getVariableMap(), flowParams.getVariable())); + // 非第一个记得跳转类型必传 + if (!NodeType.isStart(task.getNodeType())) { + AssertUtil.isFalse(StrUtil.isNotEmpty(flowParams.getSkipType()), ExceptionCons.NULL_CONDITION_VALUE); + } + task.setUserList(FlowEngine.userService().listByAssociatedAndTypes(task.getId())); + FlowCombine flowCombine = FlowEngine.defService().getFlowCombineNoDef(r.definition.getId()); + + // 执行开始监听器 + ListenerUtil.executeStart(new ListenerVariable(r.definition, r.instance, r.nowNode, flowParams.getVariable() + , task).setFlowParams(flowParams)); + + // 如果是受托人在处理任务,需要处理一条委派记录,并且更新委托人,回到计划审批人,然后直接返回流程实例 + if (!flowParams.isIgnoreDepute() && handleDepute(task, flowParams)) { + return r.instance; + } + + // 判断当前处理人是否有权限处理 + checkAuth(task, flowParams); + + //或签、会签、票签逻辑处理 + if (!flowParams.isIgnoreCooperate() && cooperate(r.nowNode, task, flowParams)) { + return r.instance; + } + + // 获取后续任务节点结合 + PathWayData pathWayData = new PathWayData().setInsId(task.getInstanceId()).setSkipType(flowParams.getSkipType()); + FlowNode nextNode = FlowEngine.nodeService().getNextNode(r.nowNode, flowParams.getNodeCode() + , flowParams.getSkipType(), pathWayData, flowCombine); + List nextNodes = FlowEngine.nodeService().getNextByCheckGateway(flowParams.getVariable() + , nextNode, pathWayData, flowCombine); + + // 判断并行网关和包容网关节点只剩一个前置代办任务,才能生成新的代办任务 + isGenerateNewTask(pathWayData, r.instance, nextNodes); + pathWayData.getTargetNodes().addAll(nextNodes); + + // 设置流程图元数据 + r.instance.setDefJson(FlowEngine.chartService().skipMetadata(pathWayData)); + + // 构建增待办任务和设置结束任务历史记录 + List addTasks = StreamUtils.toList(nextNodes, node -> addTask(node, r.instance, r.definition, flowParams)); + + // 办理人变量替换 + ExpressionUtil.evalVariable(addTasks, flowParams.variable(MapUtil.mergeAll(r.instance.getVariableMap(), flowParams.getVariable()))); + + // 执行分派监听器 + ListenerUtil.executeAssignment(new ListenerVariable(r.definition, r.instance, r.nowNode, flowParams.getVariable() + , task, nextNodes, addTasks).setFlowParams(flowParams)); + + // 更新流程信息 + updateFlowInfo(task, r.instance, addTasks, flowParams, nextNodes); + + // 一票否决(谨慎使用),如果退回,退回指向节点后还存在其他正在执行的待办任务,转历史任务,状态都为失效,重走流程。 + if (CollUtil.isNotEmpty(nextNodes) && SkipType.isReject(flowParams.getSkipType())) { + oneVoteVeto(task, nextNodes.get(0).getNodeCode(), flowCombine); + } + + // 处理未完成的任务,当流程完成,还存在待办任务未完成,转历史任务,状态完成。 + handUndoneTask(r.instance); + + // 执行完成和创建监听器 + ListenerUtil.endCreateListener(new ListenerVariable(r.definition, r.instance, r.nowNode + , flowParams.getVariable(), task, nextNodes, addTasks).setFlowParams(flowParams)); + + return r.instance; + } + + public FlowInstance revoke(Long instanceId, FlowParams flowParams) { + flowParams.skipType(SkipType.REJECT.getKey()); + // 删除待办任务,保存历史,删除所有代办任务的权限人 + if (StrUtil.isEmpty(flowParams.getFlowStatus())) { + flowParams.flowStatus(FlowStatus.CANCEL.getKey()); + } + + FlowInstance instance = FlowEngine.insService().getById(instanceId); + AssertUtil.isNull(instance, ExceptionCons.NOT_FOUNT_INSTANCE); + FlowDefinition definition = FlowEngine.defService().getById(instance.getDefinitionId()); + AssertUtil.isFalse(judgeActivityStatus(definition, instance), ExceptionCons.NOT_ACTIVITY); + AssertUtil.isTrue(NodeType.isEnd(instance.getNodeType()), ExceptionCons.FLOW_FINISH); + flowParams.variable(MapUtil.mergeAll(instance.getVariableMap(), flowParams.getVariable())); + + List taskList = getByInsId(instanceId); + FlowCombine flowCombine = FlowEngine.defService().getFlowCombine(definition); + Map nodeMap = StreamUtils.toMap(flowCombine.getAllNodes(), FlowNode::getNodeCode, node -> node); + // 执行开始监听器 + taskList.forEach(task -> ListenerUtil.executeStart(new ListenerVariable(definition, instance + , nodeMap.get(task.getNodeCode()), flowParams.getVariable(), task).setFlowParams(flowParams))); + + // 验证权限是不是当前任务的发起人 + if (!flowParams.isIgnore()) { + AssertUtil.isFalse(instance.getCreateBy().equals(flowParams.getHandler()) + , ExceptionCons.NOT_DEF_PROMOTER_NOT_CANCEL); + } + + // 获取开始节点 + FlowNode startNode = StreamUtils.findFirstValue(flowCombine.getAllNodes(), node -> NodeType.isStart(node.getNodeType())); + // 获取下一个节点,如果是网关节点,则重新获取后续节点 + PathWayData pathWayData = new PathWayData().setInsId(instanceId).setSkipType(flowParams.getSkipType()); + FlowNode nextNode = FlowEngine.nodeService().getNextNode(startNode, null, SkipType.PASS.getKey() + , null, flowCombine); + List nextNodes = FlowEngine.nodeService().getNextByCheckGateway(flowParams.getVariable(), nextNode + , pathWayData, flowCombine); + pathWayData.getTargetNodes().addAll(nextNodes); + // 设置流程图元数据 + instance.setDefJson(FlowEngine.chartService().skipMetadata(pathWayData)); + + // 查询任务,如果前一个节点是并行网关,可能任务表有多个任务,增加查询和判断 + List curTaskList = list(new FlowTask().setInstanceId(instance.getId())); + AssertUtil.isEmpty(curTaskList, ExceptionCons.NOT_FOUND_FLOW_TASK); + + // 给回退到的那个节点赋权限-给当前处理人权限 + List addTasks = StreamUtils.toList(nextNodes, node -> addTask(node, instance, definition, flowParams)); + + // 办理人变量替换 + ExpressionUtil.evalVariable(addTasks, flowParams.variable(MapUtil.mergeAll(instance.getVariableMap(), flowParams.getVariable()))); + + // 执行分派监听器 + taskList.forEach(task -> ListenerUtil.executeAssignment(new ListenerVariable(definition, instance, + nodeMap.get(task.getNodeCode()), flowParams.getVariable(), task, nextNodes, addTasks) + .setFlowParams(flowParams))); + + // 设置流程历史任务信息 + List insHisList = FlowEngine.hisTaskService().setSkipHisList(curTaskList, nextNodes, flowParams); + FlowEngine.hisTaskService().saveBatch(insHisList); + // 待办任务和处理人 + removeAndUser(curTaskList); + List users = FlowEngine.userService().taskAddUsers(addTasks); + + // 设置任务完成后的实例相关信息 + setInsFinishInfo(instance, addTasks, flowParams); + if (CollUtil.isNotEmpty(addTasks)) { + saveBatch(addTasks); + } + FlowEngine.insService().updateById(instance); + // 保存下一个待办任务的权限人 + FlowEngine.userService().saveBatch(users); + + // 执行完成和创建监听器 + taskList.forEach(task -> ListenerUtil.endCreateListener(new ListenerVariable(definition, instance, + nodeMap.get(task.getNodeCode()), flowParams.getVariable(), task, nextNodes, addTasks).setFlowParams(flowParams))); + return instance; + } + + public FlowInstance terminationByInsId(Long instanceId, FlowParams flowParams) { + AssertUtil.isNull(instanceId, ExceptionCons.NULL_INSTANCE_ID); + // 获取待办任务 + List taskList = FlowEngine.taskService().getByInsId(instanceId); + AssertUtil.isEmpty(taskList, ExceptionCons.NOT_FOUNT_TASK); + FlowTask task = taskList.get(0); + return termination(task, flowParams); + } + + public FlowInstance termination(Long taskId, FlowParams flowParams) { + return termination(getById(taskId), flowParams); + } + + public FlowInstance termination(FlowTask task, FlowParams flowParams) { + R r = getAndCheck(task); + flowParams.skipType(SkipType.PASS.getKey()); + flowParams.variable(MapUtil.mergeAll(r.instance.getVariableMap(), flowParams.getVariable())); + ListenerUtil.executeStart(new ListenerVariable(r.definition, r.instance, r.nowNode, flowParams.getVariable() + , task).setFlowParams(flowParams)); + + // 判断当前处理人是否有权限处理 + task.setUserList(FlowEngine.userService().listByAssociatedAndTypes(task.getId())); + checkAuth(task, flowParams); + + // 所有待办转历史 + FlowNode endNode = FlowEngine.nodeService().getEndNode(r.instance.getDefinitionId()); + + // 设置流程图元数据 + PathWayData pathWayData = new PathWayData() + .setInsId(task.getInstanceId()) + .setSkipType(flowParams.getSkipType()) + .setPathWayNodes(Collections.singletonList(r.nowNode)) + .setTargetNodes(Collections.singletonList(endNode)); + r.instance.setDefJson(FlowEngine.chartService().skipMetadata(pathWayData)); + + // 流程实例完成 + r.instance.setNodeType(endNode.getNodeType()) + .setNodeCode(endNode.getNodeCode()) + .setNodeName(endNode.getNodeName()) + .setFlowStatus(StrUtil.emptyToDefault(flowParams.getFlowStatus(), FlowStatus.TERMINATE.getKey())); + + // 待办任务转历史 + flowParams.flowStatus(r.instance.getFlowStatus()); + FlowHisTask insHis = FlowEngine.hisTaskService().setSkipInsHis(task, Collections.singletonList(endNode) + , flowParams); + FlowEngine.hisTaskService().save(insHis); + FlowEngine.insService().updateById(r.instance); + + // 删除流程相关办理人 + FlowEngine.userService().deleteByTaskIds(Collections.singletonList(task.getId())); + + // 处理未完成的任务,当流程完成,还存在待办任务未完成,转历史任务,状态完成。 + handUndoneTask(r.instance); + // 最后判断是否存在节点监听器,存在执行节点监听器 + ListenerUtil.executeFinish(new ListenerVariable(r.definition, r.instance, r.nowNode, flowParams.getVariable() + , task).setFlowParams(flowParams)); + return r.instance; + } + + public boolean deleteByInsIds(List instanceIds) { + List instanceList = FlowEngine.insService().getByIds(instanceIds); + FlowDefinition definition; + for (FlowInstance instance : instanceList) { + definition = FlowEngine.defService().getById(instance.getDefinitionId()); + AssertUtil.isFalse(judgeActivityStatus(definition, instance), ExceptionCons.NOT_ACTIVITY); + } + return SqlHelper.retBool(getMapper().deleteByInsIds(instanceIds)); + } + + public boolean transfer(Long taskId, FlowParams flowParams) { + AssertUtil.isNull(taskId, ExceptionCons.NULL_TASK_ID); + AssertUtil.isNull(flowParams.getHandler(), ExceptionCons.HANDLER_NOT_EMPTY); + AssertUtil.isNull(flowParams.getAddHandlers(), ExceptionCons.NULL_TRANSFER_HANDLER); + List users = FlowEngine.userService().getByProcessedBys(taskId, flowParams.getAddHandlers(), UserType.TRANSFER.getKey()); + AssertUtil.isNotEmpty(users, ExceptionCons.IS_ALREADY_TRANSFER); + flowParams.cooperateType(CooperateType.TRANSFER.getKey()) + .reductionHandlers(Collections.singletonList(flowParams.getHandler())); + + return updateHandler(taskId, flowParams); + } + + public boolean depute(Long taskId, FlowParams flowParams) { + AssertUtil.isNull(taskId, ExceptionCons.NULL_TASK_ID); + AssertUtil.isNull(flowParams.getHandler(), ExceptionCons.HANDLER_NOT_EMPTY); + AssertUtil.isNull(flowParams.getAddHandlers(), ExceptionCons.NULL_DEPUTE_HANDLER); + List users = FlowEngine.userService().getByProcessedBys(taskId, flowParams.getAddHandlers(), UserType.DEPUTE.getKey()); + AssertUtil.isNotEmpty(users, ExceptionCons.IS_ALREADY_DEPUTE); + flowParams.cooperateType(CooperateType.DEPUTE.getKey()) + .reductionHandlers(Collections.singletonList(flowParams.getHandler())); + + return updateHandler(taskId, flowParams); + } + + public boolean addSignature(Long taskId, FlowParams flowParams) { + AssertUtil.isNull(taskId, ExceptionCons.NULL_TASK_ID); + AssertUtil.isNull(flowParams.getHandler(), ExceptionCons.HANDLER_NOT_EMPTY); + AssertUtil.isNull(flowParams.getAddHandlers(), ExceptionCons.NULL_ADD_SIGNATURE_HANDLER); + List users = FlowEngine.userService().getByProcessedBys(taskId, flowParams.getAddHandlers(), UserType.APPROVAL.getKey()); + AssertUtil.isNotEmpty(users, ExceptionCons.IS_ALREADY_SIGN); + flowParams.cooperateType(CooperateType.ADD_SIGNATURE.getKey()); + + return updateHandler(taskId, flowParams); + } + + public boolean reductionSignature(Long taskId, FlowParams flowParams) { + AssertUtil.isNull(taskId, ExceptionCons.NULL_TASK_ID); + AssertUtil.isNull(flowParams.getHandler(), ExceptionCons.HANDLER_NOT_EMPTY); + AssertUtil.isNull(flowParams.getReductionHandlers(), ExceptionCons.NULL_REDUCTION_SIGNATURE_HANDLER); + List users = FlowEngine.userService().listByAssociatedAndTypes(taskId + , UserType.APPROVAL.getKey(), UserType.TRANSFER.getKey()); + AssertUtil.isTrue(CollUtil.isEmpty(users) || users.size() == 1, ExceptionCons.REDUCTION_SIGN_ONE_ERROR); + flowParams.cooperateType(CooperateType.REDUCTION_SIGNATURE.getKey()); + + return updateHandler(taskId, flowParams); + } + + public boolean updateHandler(Long taskId, FlowParams flowParams) { + // 获取待办任务 + R r = getAndCheck(taskId); + flowParams.variable(MapUtil.mergeAll(r.instance.getVariableMap(), flowParams.getVariable())); + // 执行开始监听器 + ListenerUtil.executeStart(new ListenerVariable(r.definition, r.instance, r.nowNode, null, r.task)); + + // 获取给谁的权限 + if (!flowParams.isIgnore()) { + // 判断当前处理人是否有权限,获取当前办理人的权限 + List permissions = flowParams.getPermissionFlag(); + // 获取任务权限人 + List taskPermissions = FlowEngine.userService().getPermission(taskId + , UserType.APPROVAL.getKey(), UserType.TRANSFER.getKey(), UserType.DEPUTE.getKey()); + AssertUtil.isTrue(CollUtil.isNotEmpty(taskPermissions) && (CollUtil.isEmpty(permissions) + || !CollUtil.containsAny(permissions, taskPermissions)), ExceptionCons.NOT_AUTHORITY); + } + // 留存历史记录 + flowParams.skipType(SkipType.NONE.getKey()); + FlowHisTask hisTask = null; + // 删除对应的操作人 + if (CollUtil.isNotEmpty(flowParams.getReductionHandlers())) { + for (String reductionHandler : flowParams.getReductionHandlers()) { + FlowEngine.userService().remove(new FlowUser().setAssociated(taskId) + .setProcessedBy(reductionHandler)); + } + hisTask = FlowEngine.hisTaskService().setCooperateHis(r.task, flowParams, flowParams.getReductionHandlers()); + } + + // 新增权限人 + if (CollUtil.isNotEmpty(flowParams.getAddHandlers())) { + String type; + if (CooperateType.TRANSFER.getKey().equals(flowParams.getCooperateType())) { + type = UserType.TRANSFER.getKey(); + } else if (CooperateType.DEPUTE.getKey().equals(flowParams.getCooperateType())) { + type = UserType.DEPUTE.getKey(); + } else { + type = UserType.APPROVAL.getKey(); + } + FlowEngine.userService().saveBatch(StreamUtils.toList(flowParams.getAddHandlers(), permission -> + FlowEngine.userService().structureUser(taskId, permission + , type, flowParams.getHandler()))); + hisTask = FlowEngine.hisTaskService().setCooperateHis(r.task, flowParams, flowParams.getAddHandlers()); + } + if (ObjectUtil.isNotNull(hisTask)) { + FlowEngine.hisTaskService().save(hisTask); + } + // 最后判断是否存在节点监听器,存在执行节点监听器 + ListenerUtil.executeFinish(new ListenerVariable(r.definition, r.instance, r.nowNode, flowParams.getVariable() + , r.task)); + return true; + } + + public FlowInstance pendingByInsId(Long instanceId, FlowParams flowParams) { + return pending(getTask(instanceId), flowParams); + } + + public FlowInstance pending(Long taskId, FlowParams flowParams) { + // 获取待办任务 + FlowTask task = getById(taskId); + return pending(task, flowParams); + } + + public FlowInstance pending(FlowTask task, FlowParams flowParams) { + // TODO min 后续考虑并发问题,待办任务和实例表不同步,可给待办任务id加锁,抽取所接口,方便后续兼容分布式锁 + // 流程开启前正确性校验 + R r = getAndCheck(task); + flowParams.flowStatus(StrUtil.emptyToDefault(flowParams.getFlowStatus(), FlowStatus.PENDING.getKey())); + // 执行开始监听器 + ListenerUtil.executeStart(new ListenerVariable(r.definition, r.instance, r.nowNode, flowParams.getVariable() + , r.task).setFlowParams(flowParams)); + + // 判断当前处理人是否有权限处理 + checkAuth(r.task, flowParams); + + // 设置流程历史任务信息 + FlowHisTask insHis = FlowEngine.hisTaskService().notSkip(r.task, flowParams); + FlowEngine.hisTaskService().save(insHis); + + FlowEngine.insService().updateById(r.instance.setFlowStatus(flowParams.getFlowStatus())); + + // 执行任务完成监听器 + ListenerUtil.executeFinish(new ListenerVariable(r.definition, r.instance, r.nowNode + , flowParams.getVariable(), r.task)); + + return r.instance; + } + + public FlowTask addTask(FlowNode node, FlowInstance instance, FlowDefinition definition, FlowParams flowParams) { + FlowTask addTask = new FlowTask(); + Date now = new Date(); + FlowEngine.dataFillHandler().idFill(addTask); + addTask.setDefinitionId(instance.getDefinitionId()) + .setInstanceId(instance.getId()) + .setNodeCode(node.getNodeCode()) + .setNodeName(node.getNodeName()) + .setNodeType(node.getNodeType()) + .setFlowStatus(StrUtil.emptyToDefault(flowParams.getFlowStatus(), + setFlowStatus(node.getNodeType(), flowParams.getSkipType()))) + .setCreateTime(now) + .setPermissionList(StrUtil.splitTrim(node.getPermissionFlag(), FlowCons.SPLIT_AT)); + + if (StrUtil.isNotEmpty(node.getFormCustom()) && StrUtil.isNotEmpty(node.getFormPath())) { + // 节点有自定义表单则使用 + addTask.setFormCustom(node.getFormCustom()).setFormPath(node.getFormPath()); + } else { + addTask.setFormCustom(definition.getFormCustom()).setFormPath(definition.getFormPath()); + } + + return addTask; + } + + public List getByInsId(Long instanceId) { + return list(new FlowTask().setInstanceId(instanceId)); + } + + public List getByInsIdAndNodeCodes(Long instanceId, List nodeCodes) { + return getMapper().getByInsIdAndNodeCodes(instanceId, nodeCodes); + } + + public void setInsFinishInfo(FlowInstance instance, List addTasks, FlowParams flowParams) { + instance.setUpdateTime(new Date()); + // 合并流程变量到实例对象 + mergeVariable(instance, flowParams.getVariable()); + if (CollUtil.isNotEmpty(addTasks)) { + // 终结节点任务不算待办任务,取其中最后一个作为实例最终信息 + List endTasks = addTasks.stream() + .filter(addTask -> NodeType.isEnd(addTask.getNodeType())) + .collect(Collectors.toList()); + addTasks.removeAll(endTasks); + FlowTask finallyTask = CollUtil.getLast(endTasks); + if (finallyTask == null) { + finallyTask = getNextTask(addTasks); + } + instance.setNodeType(finallyTask.getNodeType()) + .setNodeCode(finallyTask.getNodeCode()) + .setNodeName(finallyTask.getNodeName()) + .setFlowStatus(finallyTask.getFlowStatus()); + } + } + + public void mergeVariable(FlowInstance instance, Map variable) { + if (MapUtil.isNotEmpty(variable)) { + String variableStr = instance.getVariable(); + Map deserialize = JsonUtil.strToMap(variableStr); + deserialize.putAll(variable); + instance.setVariable(JsonUtil.objToStr(deserialize)); + } + } + + /** + * 根据流程实例id获取操作人最近的已办历史任务 + * + * @param flowParams 包含流程相关参数的对象 + * @param instanceId 流程实例id + * @return 最近的已办历史任务 + */ + private FlowHisTask taskBack(FlowParams flowParams, Long instanceId) { + flowParams.skipType(SkipType.REJECT.getKey()) + .ignore(true) + .ignoreDepute(true) + .ignoreCooperate(true) + .flowStatus(StrUtil.emptyToDefault(flowParams.getFlowStatus(), FlowStatus.TASK_BACK.getKey())); + // 获取当前任务的前置任务 + List hisTaskList = FlowEngine.hisTaskService().getByInsId(instanceId); + // 获取hisTaskList中TargetNodeCod等于task.getNodeCode()的,并且id最大的 + FlowHisTask lastHisTask = hisTaskList.stream() + .filter(hisTask -> StrUtil.isNotEmpty(hisTask.getApprover())) + .filter(hisTask -> SkipType.isPass(hisTask.getSkipType())) + .filter(hisTask -> hisTask.getApprover().equals(flowParams.getHandler())) + .max(Comparator.comparingLong(FlowHisTask::getId)) + .orElse(null); + AssertUtil.isNull(lastHisTask, ExceptionCons.NOT_FOUNT_HANDLED_TASK); + flowParams.nodeCode(lastHisTask.getNodeCode()); + return lastHisTask; + } + + /** + * 获取待办任务 + * + * @param instanceId 实例id + * @return 待办任务 + */ + private FlowTask getTask(Long instanceId) { + List taskList = getByInsId(instanceId); + AssertUtil.isEmpty(taskList, ExceptionCons.NOT_FOUNT_TASK); + AssertUtil.isTrue(taskList.size() > 1, ExceptionCons.TASK_NOT_ONE); + return taskList.get(0); + } + + private String setFlowStatus(Integer nodeType, String skipType) { + // 根据审批动作确定流程状态 + if (NodeType.isStart(nodeType)) { + return FlowStatus.TOBESUBMIT.getKey(); + } else if (NodeType.isEnd(nodeType)) { + return FlowStatus.FINISHED.getKey(); + } else if (SkipType.isReject(skipType)) { + return FlowStatus.REJECT.getKey(); + } else { + return FlowStatus.APPROVAL.getKey(); + } + } + + private FlowTask getNextTask(List tasks) { + if (tasks.size() == 1) { + return tasks.get(0); + } + return tasks.stream().max(Comparator.comparingLong(FlowTask::getId)).orElse(null); + } + + private void removeAndUser(List taskList) { + removeByIds(StreamUtils.toList(taskList, FlowTask::getId)); + FlowEngine.userService().deleteByTaskIds(StreamUtils.toList(taskList, FlowTask::getId)); + } + + private R getAndCheck(Long taskId) { + AssertUtil.isNull(taskId, ExceptionCons.NULL_TASK_ID); + return getAndCheck(getById(taskId)); + } + + private R getAndCheck(FlowTask task) { + AssertUtil.isNull(task, ExceptionCons.NOT_FOUNT_TASK); + FlowInstance instance = FlowEngine.insService().getById(task.getInstanceId()); + AssertUtil.isNull(instance, ExceptionCons.NOT_FOUNT_INSTANCE); + FlowDefinition definition = FlowEngine.defService().getById(instance.getDefinitionId()); + AssertUtil.isFalse(judgeActivityStatus(definition, instance), ExceptionCons.NOT_ACTIVITY); + AssertUtil.isTrue(NodeType.isEnd(instance.getNodeType()), ExceptionCons.FLOW_FINISH); + FlowNode nowNode = FlowEngine.nodeService().getByDefIdAndNodeCode(task.getDefinitionId(), task.getNodeCode()); + AssertUtil.isNull(nowNode, ExceptionCons.LOST_CUR_NODE); + return new R(instance, definition, nowNode, task); + } + + private static class R { + public final FlowInstance instance; + public final FlowDefinition definition; + public final FlowNode nowNode; + public final FlowTask task; + + public R(FlowInstance instance, FlowDefinition definition, FlowNode nowNode, FlowTask task) { + this.instance = instance; + this.definition = definition; + this.nowNode = nowNode; + this.task = task; + } + } + + private boolean handleDepute(FlowTask task, FlowParams flowParams) { + // 获取受托人 + List entrustedUserList = StreamUtils.filter(task.getUserList(), + user -> UserType.DEPUTE.getKey().equals(user.getType()) + && Objects.equals(flowParams.getHandler(), user.getProcessedBy())); + if (CollUtil.isEmpty(entrustedUserList)) { + return false; + } + + // 记录受托人处理任务记录 + FlowUser entrustedUser = entrustedUserList.get(0); + FlowHisTask hisTask = FlowEngine.hisTaskService().setDeputeHisTask(task, flowParams, entrustedUser); + FlowEngine.hisTaskService().save(hisTask); + FlowEngine.userService().removeById(entrustedUser.getId()); + + // 查询委托人,如果在flow_user不存在,则给委托人新增待办记录 + FlowUser deputeUser = FlowEngine.userService().getOne(new FlowUser().setAssociated(task.getId()) + .setProcessedBy(entrustedUser.getCreateBy()).setType(UserType.APPROVAL.getKey())); + if (ObjectUtil.isNull(deputeUser)) { + FlowUser newUser = FlowEngine.userService().structureUser(entrustedUser.getAssociated() + , entrustedUser.getCreateBy() + , UserType.APPROVAL.getKey(), entrustedUser.getProcessedBy()); + FlowEngine.userService().save(newUser); + } + + return true; + } + + /** + * 会签,票签,协作处理,返回true;或签或者会签、票签结束返回false + * + * @param nowNode 当前节点 + * @param task 任务 + * @param flowParams 流程参数 + * @return boolean + */ + private boolean cooperate(FlowNode nowNode, FlowTask task, FlowParams flowParams) { + if (flowParams.isIgnore()) { + return false; + } + String nodeRatio = nowNode.getNodeRatio(); + // 或签,直接返回 + if (CooperateType.isOrSign(nodeRatio)) { + return false; + } + + // 办理人和转办人列表 + List todoList = FlowEngine.userService().listByAssociatedAndTypes(task.getId() + , UserType.APPROVAL.getKey(), UserType.TRANSFER.getKey(), UserType.DEPUTE.getKey()); + + // 判断办理人是否有办理权限 + AssertUtil.isEmpty(flowParams.getHandler(), ExceptionCons.SIGN_NULL_HANDLER); + FlowUser todoUser = CollUtil.getFirst(StreamUtils.filter(todoList, u -> Objects.equals(u.getProcessedBy(), flowParams.getHandler()))); + AssertUtil.isNull(todoUser, ExceptionCons.NOT_AUTHORITY); + + // 除当前办理人外剩余办理人列表 + List restList = StreamUtils.filter(todoList, u -> !Objects.equals(u.getProcessedBy(), flowParams.getHandler())); + + // 会签并且当前人退回直接返回 + if (CooperateType.isCountersign(nodeRatio) && SkipType.isReject(flowParams.getSkipType())) { + return removeRestList(restList); + } + + // 查询会签票签已办列表 + List doneList = FlowEngine.hisTaskService().listByTaskId(task.getId()); + doneList = CollUtil.isEmpty(doneList) ? new ArrayList<>() : doneList; + + // 总人数 + int allNum = todoList.size() + doneList.size(); + + // 通过历史记录 + List donePassList = StreamUtils.filter(doneList + , hisTask -> Objects.equals(hisTask.getSkipType(), SkipType.PASS.getKey())); + + // 驳回历史记录 + List doneRejectList = StreamUtils.filter(doneList + , hisTask -> Objects.equals(hisTask.getSkipType(), SkipType.REJECT.getKey())); + + boolean isPass = SkipType.isPass(flowParams.getSkipType()); + // 如果是票签默认或者spel表达式策略,则执行表达式 + if (CooperateType.isVoteSignDefault(nodeRatio) || CooperateType.isVoteSignRejectSpel(nodeRatio)) { + Map variable = MapUtil.clone(flowParams.getVariable()); + variable.put("skipType", flowParams.getSkipType()); + variable.put("passNum", donePassList.size()); + variable.put("rejectNum", doneRejectList.size()); + variable.put("todoNum", todoList.size()); + variable.put("allNum", allNum); + variable.put("passList", donePassList); + variable.put("rejectList", doneRejectList); + variable.put("todoList", todoList); + if (ExpressionUtil.evalVoteSign(nodeRatio, variable)) { + return removeRestList(restList); + } + } else { + // 计算通过率 + BigDecimal passRatio = (isPass ? BigDecimal.ONE : BigDecimal.ZERO) + .add(BigDecimal.valueOf(donePassList.size())) + .divide(BigDecimal.valueOf(allNum), 4, RoundingMode.HALF_UP).multiply(MathUtil.ONE_HUNDRED); + // 计算驳回率 + BigDecimal rejectRatio = (isPass ? BigDecimal.ZERO : BigDecimal.ONE) + .add(BigDecimal.valueOf(doneRejectList.size())) + .divide(BigDecimal.valueOf(allNum), 4, RoundingMode.HALF_UP).multiply(MathUtil.ONE_HUNDRED); + + // 判断是否是票签中的固定通过人数,如果是则判断是否达到该人数 + if (CooperateType.isVoteSignPassCount(nodeRatio)) { + String passCount = StrUtil.subSuf(nodeRatio, nodeRatio.indexOf("=") + 1); + if ((isPass && donePassList.size() + 1 >= Integer.parseInt(passCount)) + || (!isPass && doneRejectList.size() + 1 > allNum - Integer.parseInt(passCount))) { + return removeRestList(restList); + } + } else if (CooperateType.isVoteSignRejectCount(nodeRatio)) { + // 判断是否是票签中的固定驳回人数,如果是则判断是否达到该人数 + String rejectCount = StrUtil.subSuf(nodeRatio, nodeRatio.indexOf("=") + 1); + if ((!isPass && doneRejectList.size() + 1 >= Integer.parseInt(rejectCount)) + || (isPass && donePassList.size() + 1 > allNum - Integer.parseInt(rejectCount))) { + return removeRestList(restList); + } + } else if ((!isPass && rejectRatio.compareTo(MathUtil.ONE_HUNDRED.subtract(new BigDecimal(nodeRatio))) > 0) + || (isPass && passRatio.compareTo(new BigDecimal(nodeRatio)) >= 0)) { + // 提前不满足通过率或者满足通过率,删除剩余办理人,流程正常流程流转 + return removeRestList(restList); + } + } + + // 当只剩一位待办用户时,由当前用户决定走向 + if (todoList.size() == 1) { + return false; + } + + // 添加历史任务 + FlowHisTask hisTask = FlowEngine.hisTaskService().setSignHisTask(task, flowParams, nodeRatio, isPass); + FlowEngine.hisTaskService().save(hisTask); + + // 删掉待办用户 + FlowEngine.userService().removeById(todoUser.getId()); + return true; + } + + /** + * 删除剩余办理人 + * @param restList 待办用户列表 + * @return boolean + */ + private static boolean removeRestList(List restList) { + if (CollUtil.isNotEmpty(restList)) { + FlowEngine.userService().removeByIds(StreamUtils.toList(restList, FlowUser::getId)); + } + return false; + } + + /** + * 判断并行网关和包容网关节点只剩一个前置代办任务,才能生成新的代办任务 + * + * @param pathWayData 办理过程中途径数据 + * @param instance 实例 + */ + private void isGenerateNewTask(PathWayData pathWayData, FlowInstance instance, List nextNodes) { + if (SkipType.isReject(pathWayData.getSkipType())) { + return; + } + + DefJson defJson = JsonUtil.strToBean(instance.getDefJson(), DefJson.class); + Map nodeJsonMap = StreamUtils.toMap(defJson.getNodeList(), NodeJson::getNodeCode, node -> node); + // 途径节点中的并行/包容网关,只剩一个前置待办任务时才能生成新的代办任务 + List parallelOrInclusiveList = pathWayData.getPathWayNodes().stream() + .filter(t -> NodeType.isGateWayParallel(t.getNodeType()) || NodeType.isGateWayInclusive(t.getNodeType())) + .collect(Collectors.toList()); + if (CollUtil.isEmpty(parallelOrInclusiveList)) { + return; + } + + List previousNodeList = FlowEngine.nodeService().previousNodeList(instance.getDefinitionId() + , parallelOrInclusiveList.get(parallelOrInclusiveList.size() - 1).getNodeCode()); + // 前置节点中处于待办状态的数量 + long toDoCount = previousNodeList.stream() + .map(FlowNode::getNodeCode) + .map(nodeJsonMap::get) + .filter(Objects::nonNull) + .filter(nodeJson -> ChartStatus.isToDo(nodeJson.getStatus())) + .count(); + // 并行网关和包容网关还有多个前置待办任务,不可生成新的代办任务 + if (toDoCount <= 1) { + return; + } + + nextNodes.clear(); + String gatewayCode = parallelOrInclusiveList.get(0).getNodeCode(); + // 途径节点保留首个网关自身,其后的全部移除 + List pathWayNodes = pathWayData.getPathWayNodes(); + for (int i = 0; i < pathWayNodes.size(); i++) { + if (pathWayNodes.get(i).getNodeCode().equals(gatewayCode)) { + pathWayNodes.subList(i + 1, pathWayNodes.size()).clear(); + break; + } + } + // 途径连线从首个网关出发的(含)全部移除 + List pathWaySkips = pathWayData.getPathWaySkips(); + for (int i = 0; i < pathWaySkips.size(); i++) { + if (pathWaySkips.get(i).getNowNodeCode().equals(gatewayCode)) { + pathWaySkips.subList(i, pathWaySkips.size()).clear(); + break; + } + } + } + + /** + * 判断当前处理人是否有权限处理 + * + * @param task 当前任务(任务id) + * @param flowParams:包含流程相关参数的对象 + */ + private void checkAuth(FlowTask task, FlowParams flowParams) { + if (flowParams.isIgnore()) { + return; + } + // 查询审批人和转办人 + List permissions = StreamUtils.toList(task.getUserList(), FlowUser::getProcessedBy); + // 当前办理人拥有的权限和设计时候填的权限集合是否有交集,有说明有权限办理 + AssertUtil.isTrue(CollUtil.isNotEmpty(permissions) && (CollUtil.isEmpty(flowParams.getPermissionFlag()) + || !CollUtil.containsAny(flowParams.getPermissionFlag(), permissions)), ExceptionCons.NULL_ROLE_NODE); + } + + + /** + * 一票否决(谨慎使用),如果退回,退回指向节点后还存在其他正在执行的待办任务,转历史任务,状态都为退回,重走流程。 + * + * @param task 当前任务 + * @param nextNodeCode 下一个节点编码 + * @param flowCombine 流程数据集合 + */ + private void oneVoteVeto(FlowTask task, String nextNodeCode, FlowCombine flowCombine) { + // 一票否决(谨慎使用),如果退回,退回指向节点后还存在其他正在执行的待办任务,转历史任务,状态失效,重走流程。 + List tasks = list(new FlowTask().setInstanceId(task.getInstanceId())); + // 属于退回指向节点的后置未完成的任务 + List noDoneTasks = new ArrayList<>(); + List suffixNodeList = FlowEngine.nodeService().suffixNodeList(nextNodeCode, flowCombine); + List suffixCodes = StreamUtils.toList(suffixNodeList, FlowNode::getNodeCode); + for (FlowTask flowTask : tasks) { + if (suffixCodes.contains(flowTask.getNodeCode())) { + noDoneTasks.add(flowTask); + } + } + if (CollUtil.isNotEmpty(noDoneTasks)) { + removeAndUser(noDoneTasks); + } + } + + + /** + * 处理未完成的任务,当流程完成,还存在待办任务未完成,转历史任务,状态完成。 + * + * @param instance 流程实例 + */ + private void handUndoneTask(FlowInstance instance) { + if (NodeType.isEnd(instance.getNodeType())) { + List taskList = list(new FlowTask().setInstanceId(instance.getId())); + if (CollUtil.isNotEmpty(taskList)) { + removeAndUser(taskList); + } + } + } + + /** + * 更新流程信息 + * + * @param task 当前任务 + * @param instance 流程实例 + * @param addTasks 新增待办任务 + * @param flowParams 包含流程相关参数的对象 + * @param nextNodes 下一个节点集合 + */ + private void updateFlowInfo(FlowTask task, FlowInstance instance, List addTasks, FlowParams flowParams + , List nextNodes) { + // 设置流程历史任务信息 + FlowHisTask insHis = FlowEngine.hisTaskService().setSkipInsHis(task, nextNodes, flowParams); + FlowEngine.hisTaskService().save(insHis); + removeAndUser(Collections.singletonList(task)); + // 待办任务设置处理人 + List users = FlowEngine.userService().taskAddUsers(addTasks); + + // 设置任务完成后的实例相关信息 + setInsFinishInfo(instance, addTasks, flowParams); + if (CollUtil.isNotEmpty(addTasks)) { + saveBatch(addTasks); + } + FlowEngine.insService().updateById(instance); + // 保存下一个待办任务的权限人 + FlowEngine.userService().saveBatch(users); + } + + private boolean judgeActivityStatus(FlowDefinition definition, FlowInstance instance) { + return ActivityStatus.isActivity(definition.getActivityStatus()) + && ActivityStatus.isActivity(instance.getActivityStatus()); + } + + + public FlowDto load(Long taskId, FlowParams flowParams) { + R r = getAndCheck(taskId); + + FlowDto flowDto = new FlowDto(); + flowDto.setData(r.instance.getVariableMap().get(FlowCons.FORM_DATA)); + + return flowDto; + } + + public FlowDto hisLoad(Long hisTaskId, FlowParams flowParams) { + FlowHisTask hisTask = FlowEngine.hisTaskService().getById(hisTaskId); + AssertUtil.isNull(hisTask, ExceptionCons.NOT_FOUND_FLOW_TASK); + + FlowDefinition definition = FlowEngine.defService().getById(hisTask.getDefinitionId()); + AssertUtil.isNull(definition, ExceptionCons.NOT_FOUNT_DEF); + + FlowNode nowNode = CollUtil.getFirst(FlowEngine.nodeService() + .getMapper().getByNodeCodes(Collections.singletonList(hisTask.getNodeCode()), hisTask.getDefinitionId())); + AssertUtil.isNull(nowNode, ExceptionCons.LOST_CUR_NODE); + + FlowDto flowDto = new FlowDto(); + flowDto.setData(hisTask.getVariableMap().get(FlowCons.FORM_DATA)); + + return flowDto; + } + + @Override + public FlowTaskMapper getMapper() { + return SpringUtils.getBean(FlowTaskMapper.class); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/service/UserService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/service/UserService.java new file mode 100644 index 000000000..a3bfce815 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/service/UserService.java @@ -0,0 +1,162 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.service; +import org.dromara.warm.flow.entity.*; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ArrayUtil; + +import org.dromara.warm.flow.FlowEngine; +import org.dromara.warm.flow.entity.FlowTask; +import org.dromara.warm.flow.entity.FlowUser; +import org.dromara.warm.flow.enums.UserType; +import org.dromara.warm.flow.service.WarmServiceImpl; + + +import org.dromara.common.core.utils.StreamUtils; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; + + + + + + +import org.dromara.common.core.utils.SpringUtils; +import org.springframework.stereotype.Service; +import org.dromara.warm.flow.mapper.FlowUserMapper; + + + + +/** + * 流程用户Service业务层处理 + * + * @author xiarg + * @since 2024/5/10 13:57 + */ +@Service +public class UserService extends WarmServiceImpl { + public List taskAddUsers(List addTasks) { + List taskUserList = new ArrayList<>(); + if (CollUtil.isNotEmpty(addTasks)) { + StreamUtils.toList(addTasks, task -> taskUserList.addAll(taskAddUser(task))); + } + return taskUserList; + } + + public List taskAddUser(FlowTask task) { + // 遍历权限集合,生成流程节点的权限 + List userList = StreamUtils.toList(task.getPermissionList() + , permission -> structureUser(task.getId(), permission, UserType.APPROVAL.getKey())); + task.setUserList(userList); + return userList; + } + + public void deleteByTaskIds(List ids) { + getMapper().deleteByTaskIds(ids); + } + + public List getPermission(Long associated, String... types) { + if (ArrayUtil.isEmpty(types)) { + return StreamUtils.toList(list(new FlowUser().setAssociated(associated)), FlowUser::getProcessedBy); + } + if (types.length == 1) { + return StreamUtils.toList(list(new FlowUser().setAssociated(associated).setType(types[0])) + , FlowUser::getProcessedBy); + } + return StreamUtils.toList(getMapper().listByAssociatedAndTypes(Collections.singletonList(associated), types) + , FlowUser::getProcessedBy); + } + + public List listByAssociatedAndTypes(Long associated, String... types) { + if (ArrayUtil.isEmpty(types)) { + return list(new FlowUser().setAssociated(associated)); + } + if (types.length == 1) { + return list(new FlowUser().setAssociated(associated).setType(types[0])); + } + return getMapper().listByAssociatedAndTypes(Collections.singletonList(associated), types); + } + + public List getByAssociateds(List associateds, String... types) { + if (CollUtil.isNotEmpty(associateds) && associateds.size() == 1) { + return listByAssociatedAndTypes(associateds.get(0), types); + } + return getMapper().listByAssociatedAndTypes(associateds, types); + } + + public List listByProcessedBys(Long associated, String processedBy, String... types) { + if (ArrayUtil.isEmpty(types)) { + return list(new FlowUser().setAssociated(associated).setProcessedBy(processedBy)); + } + if (types.length == 1) { + return list(new FlowUser().setAssociated(associated).setProcessedBy(processedBy).setType(types[0])); + } + return getMapper().listByProcessedBys(associated, Collections.singletonList(processedBy), types); + } + + public List getByProcessedBys(Long associated, List processedBys, String... types) { + if (CollUtil.isNotEmpty(processedBys) && processedBys.size() == 1) { + return listByProcessedBys(associated, processedBys.get(0), types); + } + return getMapper().listByProcessedBys(associated, processedBys, types); + } + + + public boolean updatePermission(Long associated, List permissions, String type, boolean clear, + String handler) { + // 判断是否clear,如果是true,则先删除当前关联id用户数据 + if (clear) { + getMapper().delete(new FlowUser().setAssociated(associated).setCreateBy(handler)); + } + // 再新增权限人 + saveBatch(StreamUtils.toList(permissions, permission -> structureUser(associated, permission, type, handler))); + return true; + } + + public List structureUser(Long associated, List permissionList, String type) { + return StreamUtils.toList(permissionList, permission -> structureUser(associated, permission, type, null)); + } + + public FlowUser structureUser(Long associated, String permission, String type) { + return structureUser(associated, permission, type, null); + } + + public List structureUser(Long associated, List permissionList, String type, String handler) { + return StreamUtils.toList(permissionList, permission -> structureUser(associated, permission, type, handler)); + } + + public FlowUser structureUser(Long associated, String permission, String type, String handler) { + Date now = new Date(); + FlowUser user = new FlowUser() + .setType(type) + .setProcessedBy(permission) + .setAssociated(associated) + .setCreateBy(handler); + FlowEngine.dataFillHandler().idFill(user); + return user; + } + + + @Override + public FlowUserMapper getMapper() { + return SpringUtils.getBean(FlowUserMapper.class); + } +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/service/WarmServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/service/WarmServiceImpl.java new file mode 100644 index 000000000..86e9eddab --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/service/WarmServiceImpl.java @@ -0,0 +1,119 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.service; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.extension.toolkit.SqlHelper; +import org.dromara.warm.flow.FlowEngine; +import org.dromara.warm.flow.entity.RootEntity; +import org.dromara.warm.flow.handler.DataFillHandler; +import org.dromara.warm.flow.mapper.WarmMapper; + +import java.io.Serializable; +import java.util.Collection; +import java.util.List; + +/** + * BaseService层处理,直接持有 Mapper,无独立 Dao 层 + * + * @author warm + * @since 2023-03-17 + */ +public abstract class WarmServiceImpl implements IWarmService { + + /** + * 获取Mapper(由子类提供,Mapper 由 MyBatis 扫描 mapper 包注册) + */ + public abstract WarmMapper getMapper(); + + @Override + public T getById(Serializable id) { + return getMapper().selectById(id); + } + + @Override + public List getByIds(Collection ids) { + return getMapper().selectBatchIds(ids); + } + + @Override + public List list(T entity) { + return getMapper().selectList(entity); + } + + @Override + public T getOne(T entity) { + List list = getMapper().selectList(entity); + return CollUtil.getFirst(list); + } + + @Override + public Boolean exists(T entity) { + return getMapper().selectCount(entity) > 0; + } + + @Override + public boolean save(T entity) { + insertFill(entity); + return SqlHelper.retBool(getMapper().insert(entity)); + } + + @Override + public boolean updateById(T entity) { + updateFill(entity); + return SqlHelper.retBool(getMapper().update(entity)); + } + + @Override + public boolean removeById(Serializable id) { + return SqlHelper.retBool(getMapper().deleteById(id)); + } + + @Override + public boolean remove(T entity) { + return SqlHelper.retBool(getMapper().delete(entity)); + } + + @Override + public boolean removeByIds(Collection ids) { + return SqlHelper.retBool(getMapper().deleteBatchIds(ids)); + } + + @Override + public void saveBatch(List list) { + if (CollUtil.isEmpty(list)) { + return; + } + list.forEach(this::save); + } + + public void insertFill(T entity) { + DataFillHandler dataFillHandler = FlowEngine.dataFillHandler(); + if (dataFillHandler == null) { + return; + } + dataFillHandler.idFill(entity); + dataFillHandler.insertFill(entity); + } + + public void updateFill(T entity) { + DataFillHandler dataFillHandler = FlowEngine.dataFillHandler(); + if (dataFillHandler == null) { + return; + } + dataFillHandler.updateFill(entity); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/strategy/ConditionStrategy.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/strategy/ConditionStrategy.java new file mode 100644 index 000000000..4c3534f27 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/strategy/ConditionStrategy.java @@ -0,0 +1,44 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.strategy; + +import org.dromara.warm.flow.constant.FlowCons; + +import java.util.ArrayList; +import java.util.List; + +/** + * 条件表达式接口 + * + * @author warm + */ +public interface ConditionStrategy extends ExpressionStrategy { + + /** + * 条件表达式策略实现类集合 + */ + List> EXPRESSION_STRATEGY_LIST = new ArrayList<>(); + + @Override + default void setExpression(ExpressionStrategy expressionStrategy) { + EXPRESSION_STRATEGY_LIST.add(expressionStrategy); + } + + @Override + default String interceptStr() { + return FlowCons.SPLIT_AT; + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/strategy/ExpressionStrategy.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/strategy/ExpressionStrategy.java new file mode 100644 index 000000000..904c919cf --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/strategy/ExpressionStrategy.java @@ -0,0 +1,60 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.strategy; + +import java.util.Map; + +/** + * 表达式策略类接口 + * + * @author warm + */ +public interface ExpressionStrategy { + + /** + * 获取策略类型 + * + * @return 类型 + */ + String getType(); + + /** + * 当选择截取,并且希望拼接上某些字符串,在进行截取 + * + * @return 类型 + */ + default String interceptStr() { + return ""; + } + + /** + * 执行表达式 + * + * @param expression 表达式 + * @param variable 流程变量 + * @return 执行结果 + */ + T eval(String expression, Map variable); + + + /** + * 设置表达式 + * + * @param expressionStrategy 表达式 + */ + void setExpression(ExpressionStrategy expressionStrategy); + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/strategy/HandlerStrategy.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/strategy/HandlerStrategy.java new file mode 100644 index 000000000..a58a957e9 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/strategy/HandlerStrategy.java @@ -0,0 +1,62 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.strategy; + +import cn.hutool.core.util.ObjectUtil; + + +import org.dromara.common.core.utils.StreamUtils; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 办理人表达式策略接口 + * + * @author warm,battcn + */ +public interface HandlerStrategy extends ExpressionStrategy> { + + /** + * 办理人表达式策略实现类集合 + */ + List>> EXPRESSION_STRATEGY_LIST = new ArrayList<>(); + + @Override + default void setExpression(ExpressionStrategy> expressionStrategy) { + EXPRESSION_STRATEGY_LIST.add(expressionStrategy); + } + + Object preEval(String expression, Map variable); + + @Override + default List eval(String expression, Map variable) { + return afterEval(preEval(expression, variable)); + } + + default List afterEval(Object o) { + if (ObjectUtil.isNull(o)) { + return null; + } + if (o instanceof List) { + return StreamUtils.toList((List) o, Object::toString); + } + if (o instanceof Object[]) { + return Arrays.stream((Object[]) o).map(Object::toString).collect(Collectors.toList()); + } + return Collections.singletonList(o.toString()); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/strategy/ListenerStrategy.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/strategy/ListenerStrategy.java new file mode 100644 index 000000000..3e6364e53 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/strategy/ListenerStrategy.java @@ -0,0 +1,38 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.strategy; + +import java.util.ArrayList; +import java.util.List; + +/** + * 监听器表达式策略接口 + * + * @author warm,battcn + */ +public interface ListenerStrategy extends ExpressionStrategy { + + /** + * 监听器表达式策略实现类集合 + */ + List> EXPRESSION_STRATEGY_LIST = new ArrayList<>(); + + @Override + default void setExpression(ExpressionStrategy expressionStrategy) { + EXPRESSION_STRATEGY_LIST.add(expressionStrategy); + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/strategy/VoteSignStrategy.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/strategy/VoteSignStrategy.java new file mode 100644 index 000000000..63eceb714 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/strategy/VoteSignStrategy.java @@ -0,0 +1,44 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.strategy; + +import org.dromara.warm.flow.constant.FlowCons; + +import java.util.ArrayList; +import java.util.List; + +/** + * 票签表达式接口 + * + * @author warm + */ +public interface VoteSignStrategy extends ExpressionStrategy { + + /** + * 票签表达式策略实现类集合 + */ + List> EXPRESSION_STRATEGY_LIST = new ArrayList<>(); + + @Override + default void setExpression(ExpressionStrategy expressionStrategy) { + EXPRESSION_STRATEGY_LIST.add(expressionStrategy); + } + + @Override + default String interceptStr() { + return FlowCons.SPLIT_AT; + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/config/WarmFlowUiConfig.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/config/WarmFlowUiConfig.java new file mode 100644 index 000000000..31b3a8262 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/config/WarmFlowUiConfig.java @@ -0,0 +1,43 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.ui.config; + +import org.dromara.warm.flow.ui.controller.WarmFlowController; +import org.dromara.warm.flow.ui.controller.WarmFlowUiController; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * 工作流设计器配置类 + * + * @author ruoyi + */ +@Configuration +@ConditionalOnProperty(value = "warm-flow.ui", havingValue = "true", matchIfMissing = true) +@Import({WarmFlowUiController.class + , WarmFlowController.class}) +public class WarmFlowUiConfig implements WebMvcConfigurer { + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + /** warm-flow配置 */ + registry.addResourceHandler("/warm-flow-ui/**") + .addResourceLocations("classpath:/META-INF/resources/warm-flow-ui/", "classpath:/warm-flow-ui/"); + + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/controller/WarmFlowController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/controller/WarmFlowController.java new file mode 100644 index 000000000..dfa3e17e9 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/controller/WarmFlowController.java @@ -0,0 +1,182 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.ui.controller; + +import org.dromara.warm.flow.dto.ApiResult; +import org.dromara.warm.flow.dto.DefJson; +import org.dromara.warm.flow.dto.FlowDto; +import org.dromara.warm.flow.entity.FlowInstance; +import org.dromara.warm.flow.ui.dto.HandlerFeedBackDto; +import org.dromara.warm.flow.ui.dto.HandlerQuery; +import org.dromara.warm.flow.ui.service.WarmFlowService; +import org.dromara.warm.flow.ui.vo.*; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +/** + * 设计器Controller 可选择是否放行,放行可与业务系统共享权限,主要是用来访问业务系统数据 + * + * @author warm + */ +@RestController +@RequestMapping("/warm-flow") +public class WarmFlowController { + + /** + * 保存流程json字符串 + * + * @param defJson 流程数据集合 + * @return ApiResult + * @throws Exception 异常 + * @author xiarg + * @since 2024/10/29 16:31 + */ + @PostMapping("/save-json") + @Transactional(rollbackFor = Exception.class) + public ApiResult saveJson(@RequestBody DefJson defJson, @RequestHeader("onlyNodeSkip") boolean onlyNodeSkip) throws Exception { + return WarmFlowService.saveJson(defJson, onlyNodeSkip); + } + + /** + * 获取流程定义数据(包含节点和跳转) + * + * @param id 流程定义id + * @return ApiResult + * @author xiarg + * @since 2024/10/29 16:31 + */ + @GetMapping(value = {"/query-def", "/query-def/{id}"}) + public ApiResult queryDef(@PathVariable(value = "id", required = false) Long id) { + return WarmFlowService.queryDef(id); + } + + /** + * 获取流程图 + * + * @param id 流程实例id + * @return ApiResult + */ + @GetMapping("/query-flow-chart/{id}") + public ApiResult queryFlowChart(@PathVariable("id") Long id) { + return WarmFlowService.queryFlowChart(id); + } + + /** + * 办理人权限设置列表tabs页签 + * + * @return List + */ + @GetMapping("/handler-type") + public ApiResult> handlerType() { + return WarmFlowService.handlerType(); + } + + /** + * 办理人权限设置列表结果 + * + * @return HandlerSelectVo + */ + @GetMapping("/handler-result") + public ApiResult handlerResult(HandlerQuery query) { + return WarmFlowService.handlerResult(query); + } + + /** + * 办理人权限名称回显 + * + * @return HandlerSelectVo + */ + @GetMapping("/handler-feedback") + public ApiResult> handlerFeedback(HandlerFeedBackDto handlerFeedBackDto) { + return WarmFlowService.handlerFeedback(handlerFeedBackDto); + } + + /** + * 办理人选择项 + * + * @return List + */ + @GetMapping("/handler-dict") + public ApiResult> handlerDict() { + return WarmFlowService.handlerDict(); + } + + /** + * 根据任务id获取待办任务表单及数据 + * + * @param taskId 当前任务id + * @return {@link ApiResult< FlowDto >} + * @author liangli + * @date 2024/8/21 17:08 + **/ + @GetMapping(value = "/execute/load/{taskId}") + public ApiResult load(@PathVariable("taskId") Long taskId) { + return WarmFlowService.load(taskId); + } + + /** + * 根据任务id获取已办任务表单及数据 + * + * @param hisTaskId + * @return + */ + @GetMapping(value = "/execute/hisLoad/{taskId}") + public ApiResult hisLoad(@PathVariable("taskId") Long hisTaskId) { + return WarmFlowService.hisLoad(hisTaskId); + } + + /** + * 通用表单流程审批接口 + * + * @param formData + * @param taskId + * @param skipType + * @param message + * @param nodeCode + * @return + */ + @Transactional(rollbackFor = Exception.class) + @PostMapping(value = "/execute/handle") + public ApiResult handle(@RequestBody Map formData, @RequestParam("taskId") Long taskId + , @RequestParam("skipType") String skipType, @RequestParam("message") String message + , @RequestParam(value = "nodeCode", required = false) String nodeCode) { + return WarmFlowService.handle(formData, taskId, skipType, message, nodeCode); + } + + /** + * 获取节点扩展属性 + * + * @return List + */ + @GetMapping("/node-ext") + public ApiResult> nodeExt() { + return WarmFlowService.nodeExt(); + } + + /** + * 获取节点扩展属性 + * + * @return List + */ + @GetMapping("/listener-list") + public ApiResult> listenerList() { + return WarmFlowService.listenerList(); + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/controller/WarmFlowUiController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/controller/WarmFlowUiController.java new file mode 100644 index 000000000..b53e60fd6 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/controller/WarmFlowUiController.java @@ -0,0 +1,44 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.ui.controller; + +import org.dromara.warm.flow.dto.ApiResult; +import org.dromara.warm.flow.ui.service.WarmFlowService; +import org.dromara.warm.flow.ui.vo.WarmFlowVo; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 设计器Controller 匿名访问 + * + * @author warm + */ +@RestController +@RequestMapping("/warm-flow-ui") +public class WarmFlowUiController { + + /** + * 返回流程定义的配置 + * + * @return ApiResult + */ + @GetMapping("/config") + public ApiResult config() { + return WarmFlowService.config(); + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/dto/HandlerFeedBackDto.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/dto/HandlerFeedBackDto.java new file mode 100644 index 000000000..0277de40a --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/dto/HandlerFeedBackDto.java @@ -0,0 +1,39 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.ui.dto; + +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.util.List; + +/** + * 流程设计器-办理人选择 + * + * @author warm + */ +@Getter +@Setter +@Accessors(chain = true) +public class HandlerFeedBackDto { + + /** + * 入库主键集合,比如怕角色和用户id重复,可拼接为role:id + */ + private List storageIds; + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/dto/HandlerFunDto.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/dto/HandlerFunDto.java new file mode 100644 index 000000000..c92745edb --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/dto/HandlerFunDto.java @@ -0,0 +1,73 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.ui.dto; + +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.util.List; +import java.util.function.Function; + +/** + * 办理人权限设置列表Function + * + * @author warm + */ +@Getter +@Setter +@Accessors(chain = true) +public class HandlerFunDto { + /** + * 权限列表 + */ + private List list; + + /** + * 权限列表list总数 + */ + private long total; + + /** + * 获取入库主键集合Function + */ + private Function storageId; + + /** + * 获取权限编码Function + */ + private Function handlerCode; + + /** + * 获取权限名称Function + */ + private Function handlerName; + + /** + * 获取权限分组名称Function + */ + private Function groupName; + + /** + * 获取创建时间Function + */ + private Function createTime; + + public HandlerFunDto(List list, long total) { + this.list = list; + this.total = total; + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/dto/HandlerQuery.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/dto/HandlerQuery.java new file mode 100644 index 000000000..661a3fde0 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/dto/HandlerQuery.java @@ -0,0 +1,71 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.ui.dto; + +import lombok.Getter; +import lombok.Setter; + +/** + * 流程设计器-办理人权限设置列表查询参数 + * 办理人权限列表选择框,可能存在多个,比如:部门、角色、用户的情况 + * + * @author warm + */ +@Getter +@Setter +public class HandlerQuery { + + /** + * 权限编码,如:zhang、roleAdmin、deptAdmin等编码 + */ + private String handlerCode; + + /** + * 权限名称,如:管理员、角色管理员、部门管理员等名称 + */ + private String handlerName; + + /** + * 办理权限类型,比如用户/角色/部门等 + */ + private String handlerType; + + /** + * 页面左侧树权限分组主键,如:角色、部门等主键 + */ + private String groupId; + + /** + * 当前页码 + */ + private Integer pageNum; + + /** + * 每页显示条数 + */ + private Integer pageSize; + + /** + * 开始时间 + */ + private String beginTime; + + /** + * 结束时间 + */ + private String endTime; + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/dto/TreeFunDto.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/dto/TreeFunDto.java new file mode 100644 index 000000000..87b1ee46f --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/dto/TreeFunDto.java @@ -0,0 +1,59 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.ui.dto; + +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.util.List; +import java.util.function.Function; + +/** + * 页面左侧树列表Function + * + * @author warm + */ +@Getter +@Setter +@Accessors(chain = true) +public class TreeFunDto { + + /** + * 左侧树列表 + */ + private List list; + + /** + * 获取左侧树ID Function + */ + private Function id; + + /** + * 获取左侧树名称 Function + */ + private Function name; + + /** + * 获取左侧树父级ID Function + */ + private Function parentId; + + public TreeFunDto(List list) { + this.list = list; + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/service/CategoryService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/service/CategoryService.java new file mode 100644 index 000000000..25bdf96cc --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/service/CategoryService.java @@ -0,0 +1,36 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.ui.service; + +import org.dromara.warm.flow.dto.Tree; + +import java.util.List; + +/** + * 分类接口 + * + * @author warm + * @since 2025/6/24 + */ +public interface CategoryService { + + /** + * 查询分类 + * + * @return 分类 + */ + List queryCategory(); +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/service/ChartExtService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/service/ChartExtService.java new file mode 100644 index 000000000..52b6d64eb --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/service/ChartExtService.java @@ -0,0 +1,93 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.ui.service; + +import org.dromara.warm.flow.dto.DefJson; +import org.dromara.warm.flow.dto.PromptContent; +import org.dromara.warm.flow.enums.NodeType; +import org.dromara.warm.flow.utils.MapUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * 流程图提示信息 + * + * @author warm + */ +public interface ChartExtService { + + + /** + * 设置流程图提示信息 + * + * @param defJson 流程定义json对象 + */ + void execute(DefJson defJson); + + /** + * 初始化流程图提示信息 + * + * @param defJson 流程定义json对象 + */ + default void initPromptContent(DefJson defJson) { + defJson.setTopText("流程名称: " + defJson.getFlowName()); + defJson.getNodeList().forEach(nodeJson -> { + // 提示信息主对象 + PromptContent promptContent = new PromptContent(); + + if (NodeType.isGateWay(nodeJson.getNodeType())) { + return; + } + + // 设置 dialogStyle 样式 + promptContent.setDialogStyle(MapUtil.mergeAll( + "position", "absolute", + "backgroundColor", "#fff", + "border", "1px solid #ccc", + "borderRadius", "4px", + "boxShadow", "0 2px 8px rgba(0, 0, 0, 0.15)", + "padding", "8px 12px", + "fontSize", "14px", + "zIndex", 1000, + "maxWidth", "500px", + "color", "#333" + )); + + // 创建 info 列表 + List infoList = new ArrayList<>(); + + // 添加第一个条目: 任务名称 + PromptContent.InfoItem item = new PromptContent.InfoItem() + .setPrefix("任务名称: ") + .setContent(nodeJson.getNodeName()) + .setContentStyle(MapUtil.mergeAll("border", "1px solid #d1e9ff", + "backgroundColor", "#e8f4ff", + "padding", "4px 8px", + "borderRadius", "4px" + )) + .setRowStyle(MapUtil.mergeAll("fontWeight", "bold", + "margin", "0 0 6px 0", + "padding", "0 0 8px 0", + "borderBottom", "1px solid #ccc" + )); + infoList.add(item); + promptContent.setInfo(infoList); + + nodeJson.setPromptContent(promptContent); + }); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/service/HandlerDictService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/service/HandlerDictService.java new file mode 100644 index 000000000..97b8301a8 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/service/HandlerDictService.java @@ -0,0 +1,35 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.ui.service; + +import org.dromara.warm.flow.ui.vo.Dict; + +import java.util.List; + +/** + * 流程设计器-获取办理人选择项 + * + * @author warm + */ +public interface HandlerDictService { + + /** + * 获取办理人选择项 + * + * @return 结果 + */ + List getHandlerDict(); +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/service/HandlerSelectService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/service/HandlerSelectService.java new file mode 100644 index 000000000..43fc1285c --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/service/HandlerSelectService.java @@ -0,0 +1,134 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.ui.service; + +import org.dromara.common.core.constant.HttpStatus; +import org.dromara.common.core.utils.StreamUtils; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; + +import org.dromara.warm.flow.dto.FlowPage; +import org.dromara.warm.flow.dto.Tree; +import org.dromara.warm.flow.utils.*; +import org.dromara.warm.flow.ui.dto.HandlerFunDto; +import org.dromara.warm.flow.ui.dto.HandlerQuery; +import org.dromara.warm.flow.ui.dto.TreeFunDto; +import org.dromara.warm.flow.ui.utils.TreeUtil; +import org.dromara.warm.flow.ui.vo.HandlerAuth; +import org.dromara.warm.flow.ui.vo.HandlerFeedBackVo; +import org.dromara.warm.flow.ui.vo.HandlerSelectVo; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 流程设计器-获取办理人权限设置列表接口 + * + * @author warm + */ +public interface HandlerSelectService { + + /** + * 获取办理人权限设置列表tabs页签,如:用户、角色和部门等,可以返回其中一种或者多种,按业务需求决定 + * + * @return tabs页签 + */ + List getHandlerType(); + + /** + * 获取用户列表、角色列表、部门列表等,可以返回其中一种或者多种,按业务需求决定 + * + * @param query 查询参数 + * @return 结果 + */ + HandlerSelectVo getHandlerSelect(HandlerQuery query); + + /** + * 办理人权限名称回显,兼容老项目,新项目重写提高性能 + * + * @param storageIds 入库主键集合 + * @return 结果 + */ + default List handlerFeedback(List storageIds) { + List handlerFeedBackVos = new ArrayList<>(); + if (CollUtil.isEmpty(storageIds)) { + return handlerFeedBackVos; + } + Map authMap = new HashMap<>(); + List handlerTypes = getHandlerType(); + if (CollUtil.isEmpty(handlerTypes)) { + return handlerFeedBackVos; + } + for (String handlerType : handlerTypes) { + HandlerQuery handlerQuery = new HandlerQuery(); + handlerQuery.setHandlerType(handlerType); + HandlerSelectVo handlerSelectVo = getHandlerSelect(handlerQuery); + if (ObjectUtil.isNotNull(handlerSelectVo)) { + FlowPage handlerAuths = handlerSelectVo.getHandlerAuths(); + List rows = handlerAuths.getRows(); + if (CollUtil.isNotEmpty(rows)) { + authMap.putAll(StreamUtils.toMap(rows, HandlerAuth::getStorageId, HandlerAuth::getHandlerName)); + } + } + } + + // 遍历storageIds,按照原本的顺序回显名称 + for (String storageId : storageIds) { + handlerFeedBackVos.add(new HandlerFeedBackVo(storageId + , MapUtil.isEmpty(authMap) ? "" : authMap.get(storageId))); + } + return handlerFeedBackVos; + } + + default HandlerSelectVo getHandlerSelectVo(HandlerFunDto handlerFunDto) { + List handlerAuths = new ArrayList<>(); + // 遍历角色数据,封装为组件可识别的数据 + for (T obj : handlerFunDto.getList()) { + handlerAuths.add(new HandlerAuth() + .setStorageId(handlerFunDto.getStorageId() == null ? null : handlerFunDto.getStorageId().apply(obj)) + .setHandlerCode(handlerFunDto.getHandlerCode() == null ? null : handlerFunDto.getHandlerCode().apply(obj)) + .setHandlerName(handlerFunDto.getHandlerName() == null ? null : handlerFunDto.getHandlerName().apply(obj)) + .setCreateTime(handlerFunDto.getCreateTime() == null ? null : handlerFunDto.getCreateTime().apply(obj)) + .setGroupName(handlerFunDto.getGroupName() == null ? null : handlerFunDto.getGroupName().apply(obj))); + } + return getResult(handlerAuths, handlerFunDto.getTotal()); + } + + default HandlerSelectVo getHandlerSelectVo(HandlerFunDto handlerFunDto, TreeFunDto treeFunDto) { + HandlerSelectVo handlerSelectVo = getHandlerSelectVo(handlerFunDto); + + List treeList = StreamUtils.toList(treeFunDto.getList(), org -> + new Tree().setId(treeFunDto.getId() == null ? null : treeFunDto.getId().apply(org)) + .setName(treeFunDto.getName() == null ? null : treeFunDto.getName().apply(org)) + .setParentId(treeFunDto.getParentId() == null ? null : treeFunDto.getParentId().apply(org))); + + // 通过递归,构建树状结构 + return handlerSelectVo.setTreeSelections(TreeUtil.buildTree(treeList)); + } + + + default HandlerSelectVo getResult(List handlerAuths, long total) { + return new HandlerSelectVo().setHandlerAuths(new FlowPage() + .setCode(HttpStatus.SUCCESS) + .setMsg("查询成功") + .setRows(handlerAuths) + .setTotal(total)); + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/service/ListenerListService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/service/ListenerListService.java new file mode 100644 index 000000000..e44e38c53 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/service/ListenerListService.java @@ -0,0 +1,35 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.ui.service; + +import org.dromara.warm.flow.ui.vo.ListenerVo; + +import java.util.List; + +/** + * 流程设计器-获取监听器列表 + * + * @author warm + */ +public interface ListenerListService { + + /** + * 获取监听器列表 + * + * @return 结果 + */ + List listenerList(); +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/service/NodeExtService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/service/NodeExtService.java new file mode 100644 index 000000000..bd766b2a6 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/service/NodeExtService.java @@ -0,0 +1,35 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.ui.service; + +import org.dromara.warm.flow.ui.vo.NodeExt; + +import java.util.List; + +/** + * 流程设计器-节点扩展属性 + * + * @author warm + */ +public interface NodeExtService { + + /** + * 获取节点扩展属性 + * + * @return 结果 + */ + List getNodeExt(); +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/service/WarmFlowService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/service/WarmFlowService.java new file mode 100644 index 000000000..5ac9abb26 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/service/WarmFlowService.java @@ -0,0 +1,330 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.ui.service; + +import org.dromara.warm.flow.json.JsonUtil; + +import cn.hutool.core.util.StrUtil; + +import lombok.extern.slf4j.Slf4j; +import org.dromara.warm.flow.FlowEngine; +import org.dromara.warm.flow.config.WarmFlowProperties; +import org.dromara.warm.flow.dto.*; +import org.dromara.warm.flow.entity.FlowInstance; +import org.dromara.warm.flow.enums.FormCustomEnum; +import org.dromara.warm.flow.enums.ModelEnum; +import org.dromara.warm.flow.exception.FlowException; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StreamUtils; + +import org.dromara.warm.flow.ui.dto.HandlerFeedBackDto; +import org.dromara.warm.flow.ui.dto.HandlerQuery; +import org.dromara.warm.flow.ui.utils.TreeUtil; +import org.dromara.warm.flow.ui.vo.*; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 设计器Controller 可选择是否放行,放行可与业务系统共享权限,主要是用来访问业务系统数据 + * + * @author warm + */ +@Slf4j +public class WarmFlowService { + + /** + * 返回流程定义的配置 + * + * @return ApiResult + */ + public static ApiResult config() { + WarmFlowVo warmFlowVo = new WarmFlowVo(); + WarmFlowProperties warmFlow = FlowEngine.getFlowConfig(); + warmFlowVo.setFramework(warmFlow.getFramework().name()); + // 获取tokenName + String tokenName = warmFlow.getTokenName(); + if (StrUtil.isEmpty(tokenName)) { + return ApiResult.fail("未配置tokenName"); + } + String[] tokenNames = tokenName.split(","); + List tokenNameList = Arrays.stream(tokenNames).filter(StrUtil::isNotEmpty) + .map(String::trim).collect(Collectors.toList()); + warmFlowVo.setTokenNameList(tokenNameList); + + return ApiResult.ok(warmFlowVo); + } + + /** + * 保存流程json字符串 + * + * @param defJson 流程数据集合 + * @param onlyNodeSkip 是否只保存节点和跳转 + * @return ApiResult + * @throws Exception 异常 + * @author xiarg + * @since 2024/10/29 16:31 + */ + public static ApiResult saveJson(DefJson defJson, boolean onlyNodeSkip) throws Exception { + FlowEngine.defService().saveDef(defJson, onlyNodeSkip); + return ApiResult.ok(); + } + + /** + * 获取流程定义数据(包含节点和跳转) + * + * @param id 流程定义id + * @return ApiResult + * @author xiarg + * @since 2024/10/29 16:31 + */ + public static ApiResult queryDef(Long id) { + try { + DefJson defJson; + if (id == null) { + defJson = new DefJson() + .setModelValue(ModelEnum.CLASSICS.name()) + .setFormCustom(FormCustomEnum.N.name()); + } else { + defJson = FlowEngine.defService().queryDesign(id); + } + CategoryService categoryService = SpringUtils.getBeanOrNull(CategoryService.class); + if (categoryService != null) { + List treeList = categoryService.queryCategory(); + defJson.setCategoryList(TreeUtil.buildTree(treeList)); + } + return ApiResult.ok(defJson); + } catch (Exception e) { + log.error("获取流程json字符串", e); + throw new FlowException("获取流程json字符串失败", e); + } + } + + /** + * 获取流程图 + * + * @param id 流程实例id + * @return ApiResult + */ + public static ApiResult queryFlowChart(Long id) { + try { + FlowInstance instance = FlowEngine.insService().getById(id); + String defJsonStr = instance.getDefJson(); + DefJson defJson = JsonUtil.strToBean(defJsonStr, DefJson.class); + defJson.setInstance(instance); + + // 获取流程图三原色 + defJson.setChartStatusColor(FlowEngine.chartService().getChartRgb(defJson.getModelValue())); + // 是否显示流程图顶部文字 + defJson.setTopTextShow(FlowEngine.getFlowConfig().isTopTextShow()); + // 需要业务系统实现该接口 + ChartExtService chartExtService = SpringUtils.getBeanOrNull(ChartExtService.class); + if (chartExtService != null) { + chartExtService.initPromptContent(defJson); + chartExtService.execute(defJson); + } + + return ApiResult.ok(defJson); + } catch (Exception e) { + log.error("获取流程图", e); + throw new FlowException("获取流程图失败", e); + } + } + + /** + * 办理人权限设置列表tabs页签 + * + * @return List + */ + public static ApiResult> handlerType() { + try { + // 需要业务系统实现该接口 + HandlerSelectService handlerSelectService = SpringUtils.getBeanOrNull(HandlerSelectService.class); + if (handlerSelectService == null) { + return ApiResult.ok(Collections.emptyList()); + } + List handlerType = handlerSelectService.getHandlerType(); + return ApiResult.ok(handlerType); + } catch (Exception e) { + log.error("办理人权限设置列表tabs页签异常", e); + throw new FlowException("办理人权限设置列表tabs页签失败", e); + } + } + + /** + * 办理人权限设置列表结果 + * + * @return HandlerSelectVo + */ + public static ApiResult handlerResult(HandlerQuery query) { + try { + // 需要业务系统实现该接口 + HandlerSelectService handlerSelectService = SpringUtils.getBeanOrNull(HandlerSelectService.class); + if (handlerSelectService == null) { + return ApiResult.ok(new HandlerSelectVo()); + } + HandlerSelectVo handlerSelectVo = handlerSelectService.getHandlerSelect(query); + return ApiResult.ok(handlerSelectVo); + } catch (Exception e) { + log.error("办理人权限设置列表结果异常", e); + throw new FlowException("办理人权限设置列表结果失败", e); + } + } + + /** + * 办理人权限名称回显 + * + * @return HandlerSelectVo + */ + public static ApiResult> handlerFeedback(HandlerFeedBackDto handlerFeedBackDto) { + try { + // 需要业务系统实现该接口 + HandlerSelectService handlerSelectService = SpringUtils.getBeanOrNull(HandlerSelectService.class); + if (handlerSelectService == null) { + List handlerFeedBackVos = StreamUtils.toList(handlerFeedBackDto.getStorageIds(), + storageId -> new HandlerFeedBackVo(storageId, null)); + return ApiResult.ok(handlerFeedBackVos); + } + List handlerFeedBackVos = handlerSelectService.handlerFeedback(handlerFeedBackDto.getStorageIds()); + return ApiResult.ok(handlerFeedBackVos); + } catch (Exception e) { + log.error("办理人权限名称回显", e); + throw new FlowException("办理人权限名称回显", e); + } + } + + /** + * 办理人选择项 + * + * @return List + */ + public static ApiResult> handlerDict() { + try { + // 需要业务系统实现该接口 + HandlerDictService handlerDictService = SpringUtils.getBeanOrNull(HandlerDictService.class); + if (handlerDictService == null) { + List dictList = new ArrayList<>(); + Dict dict = new Dict(); + dict.setLabel("默认表达式"); + dict.setValue("${handler}"); + Dict dict1 = new Dict(); + dict1.setLabel("spel表达式"); + dict1.setValue("#{@user.evalVar(#handler)}"); + Dict dict2 = new Dict(); + dict2.setLabel("其他"); + dict2.setValue(""); + dictList.add(dict); + dictList.add(dict1); + dictList.add(dict2); + + return ApiResult.ok(dictList); + } + return ApiResult.ok(handlerDictService.getHandlerDict()); + } catch (Exception e) { + log.error("办理人权限设置列表结果异常", e); + throw new FlowException("办理人权限设置列表结果失败", e); + } + } + + /** + * 根据任务id获取待办任务表单及数据 + * + * @param taskId 当前任务id + * @return {@link ApiResult} + * @author liangli + * @date 2024/8/21 17:08 + **/ + public static ApiResult load(Long taskId) { + FlowParams flowParams = FlowParams.build(); + + return ApiResult.ok(FlowEngine.taskService().load(taskId, flowParams)); + } + + /** + * 根据任务id获取已办任务表单及数据 + * + * @param hisTaskId + * @return + */ + public static ApiResult hisLoad(Long hisTaskId) { + FlowParams flowParams = FlowParams.build(); + + return ApiResult.ok(FlowEngine.taskService().hisLoad(hisTaskId, flowParams)); + } + + /** + * 通用表单流程审批接口 + * + * @param formData + * @param taskId + * @param skipType + * @param message + * @param nodeCode + * @return + */ + public static ApiResult handle(Map formData, Long taskId, String skipType + , String message, String nodeCode) { + FlowParams flowParams = FlowParams.build() + .skipType(skipType) + .nodeCode(nodeCode) + .message(message); + + flowParams.formData(formData); + + return ApiResult.ok(FlowEngine.taskService().skip(taskId, flowParams)); + } + + /** + * 获取节点扩展属性 + * + * @return List + */ + public static ApiResult> nodeExt() { + try { + // 需要业务系统实现该接口 + NodeExtService nodeExtService = SpringUtils.getBeanOrNull(NodeExtService.class); + if (nodeExtService == null) { + return ApiResult.ok(Collections.emptyList()); + } + List nodeExts = nodeExtService.getNodeExt(); + return ApiResult.ok(nodeExts); + } catch (Exception e) { + log.error("获取节点扩展属性", e); + throw new FlowException("获取节点扩展属性失败", e); + } + } + + /** + * 获取监听器列表 + * + * @return List + */ + public static ApiResult> listenerList() { + try { + // 需要业务系统实现该接口 + ListenerListService listenerListService = SpringUtils.getBeanOrNull(ListenerListService.class); + if (listenerListService == null) { + return ApiResult.ok(Collections.emptyList()); + } + List listenerList = listenerListService.listenerList(); + return ApiResult.ok(listenerList); + } catch (Exception e) { + log.error("获取监听器列表", e); + throw new FlowException("获取监听器列表失败", e); + } + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/utils/TreeUtil.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/utils/TreeUtil.java new file mode 100644 index 000000000..ce327c3bb --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/utils/TreeUtil.java @@ -0,0 +1,86 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.ui.utils; + +import cn.hutool.core.util.StrUtil; + +import org.dromara.warm.flow.dto.Tree; + + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class TreeUtil { + private TreeUtil() { + } + + /** + * 构建所需要树结构 + * + * @param trees 部门列表 + * @return 树结构列表 + */ + public static List buildTree(List trees) { + List returnList = new ArrayList<>(); + List tempList = trees.stream().map(Tree::getId).collect(Collectors.toList()); + for (Tree dept : trees) { + // 如果是顶级节点, 遍历该父节点的所有子节点 + if (!tempList.contains(dept.getParentId())) { + recursionFn(trees, dept); + returnList.add(dept); + } + } + if (returnList.isEmpty()) { + returnList = trees; + } + return returnList; + } + + /** + * 递归列表 + */ + private static void recursionFn(List list, Tree t) { + // 得到子节点列表 + List childList = getChildList(list, t); + t.setChildren(childList); + for (Tree tChild : childList) { + if (hasChild(list, tChild)) { + recursionFn(list, tChild); + } + } + } + + /** + * 判断是否有子节点 + */ + private static boolean hasChild(List list, Tree t) { + return !getChildList(list, t).isEmpty(); + } + + /** + * 得到子节点列表 + */ + private static List getChildList(List list, Tree t) { + List tlist = new ArrayList<>(); + for (Tree n : list) { + if (StrUtil.isNotEmpty(n.getParentId()) && n.getParentId().equals(t.getId())) { + tlist.add(n); + } + } + return tlist; + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/vo/Dict.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/vo/Dict.java new file mode 100644 index 000000000..043ae1e8a --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/vo/Dict.java @@ -0,0 +1,53 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.ui.vo; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.io.Serializable; +import java.util.List; + +/** + * 字典 + * + * @author warm + */ +@Getter +@Setter +@NoArgsConstructor +public class Dict implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 字典标签 + */ + private String label; + + /** + * 字典值 + */ + private String value; + + private List childList; + + public Dict(String label, String value) { + this.label = label; + this.value = value; + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/vo/HandlerAuth.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/vo/HandlerAuth.java new file mode 100644 index 000000000..19a345496 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/vo/HandlerAuth.java @@ -0,0 +1,58 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.ui.vo; + +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +/** + * 流程设计器-办理人权限设置列表 + * 办理人权限列表选择框,可能存在多个,比如:部门、角色、用户的情况 + * + * @author warm + */ +@Getter +@Setter +@Accessors(chain = true) +public class HandlerAuth { + + /** + * 入库主键,比如怕角色和用户id重复,可拼接为role:id + */ + private String storageId; + + /** + * 权限编码,如:zhang、roleAdmin、deptAdmin等编码 + */ + private String handlerCode; + + /** + * 权限名称,如:管理员、角色管理员、部门管理员等名称 + */ + private String handlerName; + + /** + * 权限分组名称,如:角色、部门等名称 + */ + private String groupName; + + /** + * 创建时间 + */ + private String createTime; + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/vo/HandlerFeedBackVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/vo/HandlerFeedBackVo.java new file mode 100644 index 000000000..82da45b5a --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/vo/HandlerFeedBackVo.java @@ -0,0 +1,45 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.ui.vo; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.Accessors; + +/** + * 流程设计器-办理人选择 + * + * @author warm + */ +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +public class HandlerFeedBackVo { + + /** + * 入库主键,比如怕角色和用户id重复,可拼接为role:id + */ + private String storageId; + + /** + * 权限名称,如:管理员、角色管理员、部门管理员等名称 + */ + private String handlerName; +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/vo/HandlerSelectVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/vo/HandlerSelectVo.java new file mode 100644 index 000000000..1ee3962a4 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/vo/HandlerSelectVo.java @@ -0,0 +1,46 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.ui.vo; + +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; +import org.dromara.warm.flow.dto.FlowPage; +import org.dromara.warm.flow.dto.Tree; + +import java.util.List; + +/** + * 流程设计器-办理人选择 + * + * @author warm + */ +@Getter +@Setter +@Accessors(chain = true) +public class HandlerSelectVo { + + /** + * 办理人选择,分页列表,有具体办理对象 比如:部门、角色和用户等情况 + */ + private FlowPage handlerAuths; + + /** + * 左侧树状选择,配合{@link #handlerAuths}使用,比如用户先选择部门,然后选择用户 + */ + private List treeSelections; + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/vo/ListenerVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/vo/ListenerVo.java new file mode 100644 index 000000000..0afd53776 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/vo/ListenerVo.java @@ -0,0 +1,52 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.ui.vo; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.io.Serializable; + +/** + * 监听器列表-设计器页面,监听器列表下拉选使用 + * + * @author warm + */ +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class ListenerVo implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 监听器类型,如:start、assignment、finish、create,如果未设置,选择监听器后,监听器类型不联动 + */ + private String type; + + /** + * 监听器全限定类路径 + */ + private String path; + + /** + * 监听器描述 + */ + private String description; + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/vo/NodeExt.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/vo/NodeExt.java new file mode 100644 index 000000000..2265f3d07 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/vo/NodeExt.java @@ -0,0 +1,80 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.ui.vo; + +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; +import java.util.List; + +/** + * 节点扩展属性 + * + * @author warm + * @since 2025/2/18 + */ +@Getter +@Setter +public class NodeExt implements Serializable { + private static final long serialVersionUID = 1L; + private String code; + private String name; + private String desc; + private int type; + private List childs; + + @Getter + @Setter + public static class ChildNode { + private String code; + private String desc; + private String label; + private int type; + private boolean must; + private boolean multiple; + private int precision; + private String step; + private String min; + private String dateType; + private String dateFormat; + private List dict; + + } + + @Getter + @Setter + public static class DictItem { + private String label; + private String value; + private boolean selected; + + public DictItem() { + } + + public DictItem(String label, String value) { + this.label = label; + this.value = value; + } + + public DictItem(String label, String value, boolean selected) { + this.label = label; + this.value = value; + this.selected = selected; + } + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/vo/WarmFlowVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/vo/WarmFlowVo.java new file mode 100644 index 000000000..67a7083dd --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/vo/WarmFlowVo.java @@ -0,0 +1,44 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.ui.vo; + +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.util.List; + +/** + * 流程配置vo + * + * @author warm + */ +@Getter +@Setter +@Accessors(chain = true) +public class WarmFlowVo { + + /** + * 如果需要工作流共享业务系统权限,默认Authorization + */ + private List tokenNameList; + + /** + * 框架类型: springboot、solon + */ + private String framework; + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/utils/AssertUtil.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/utils/AssertUtil.java new file mode 100644 index 000000000..bc7933039 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/utils/AssertUtil.java @@ -0,0 +1,114 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.utils; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; + +import org.dromara.warm.flow.exception.FlowException; + +import java.util.Collection; +import java.util.Map; + +/** + * Assert类 + * + * @author warm + * @since 2023/3/30 14:05 + */ +public class AssertUtil { + private AssertUtil() { + + } + + public static void isNull(Object obj, String errorMsg) { + if (obj == null) { + throw new FlowException(errorMsg); + } + } + + public static void isNotNull(Object obj, String errorMsg) { + if (obj != null) { + throw new FlowException(errorMsg); + } + } + + /** + * 为true不抛异常 + * + * @param obj + * @param errorMsg + */ + public static void isFalse(boolean obj, String errorMsg) { + if (!obj) { + throw new FlowException(errorMsg); + } + } + + /** + * 为false不抛异常 + * + * @param obj + * @param errorMsg + */ + public static void isTrue(boolean obj, String errorMsg) { + if (obj) { + throw new FlowException(errorMsg); + } + } + + public static void isNotEmpty(Object obj, String errorMsg) { + if (obj != null) { + if (obj instanceof String) { + AssertUtil.isTrue(StrUtil.isNotEmpty((String) obj), errorMsg); + } else if (obj instanceof Collection) { + AssertUtil.isTrue(CollUtil.isNotEmpty((Collection) obj), errorMsg); + } else if (obj instanceof Map) { + AssertUtil.isTrue(MapUtil.isNotEmpty((Map) obj), errorMsg); + } else { + throw new FlowException("Unsupported type: " + obj.getClass().getName()); + } + } + } + + + public static void isEmpty(Object obj, String errorMsg) { + if (obj == null) { + throw new FlowException(errorMsg); + } else if (obj instanceof String) { + AssertUtil.isTrue(StrUtil.isEmpty((String) obj), errorMsg); + } else if (obj instanceof Collection) { + AssertUtil.isTrue(CollUtil.isEmpty((Collection) obj), errorMsg); + } else if (obj instanceof Map) { + AssertUtil.isTrue(MapUtil.isEmpty((Map) obj), errorMsg); + } else { + throw new FlowException("Unsupported type: " + obj.getClass().getName()); + } + } + + public static void contains(Collection a, T b, String errorMsg) { + if (CollUtil.isNotEmpty(a) && a.contains(b)) { + throw new FlowException(errorMsg); + } + } + + public static void notContains(Collection a, T b, String errorMsg) { + if (CollUtil.isEmpty(a) || !a.contains(b)) { + throw new FlowException(errorMsg); + } + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/utils/ExpressionUtil.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/utils/ExpressionUtil.java new file mode 100644 index 000000000..518ab4cc8 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/utils/ExpressionUtil.java @@ -0,0 +1,197 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.utils; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.ArrayUtil; + +import org.dromara.warm.flow.FlowEngine; +import org.dromara.warm.flow.enums.Condition; +import org.dromara.warm.flow.enums.Handler; +import org.dromara.warm.flow.enums.VoteSign; +import org.dromara.warm.flow.dto.FlowParams; +import org.dromara.warm.flow.entity.FlowTask; +import org.dromara.warm.flow.expression.ListenerStrategySpel; +import org.dromara.warm.flow.handler.PermissionHandler; +import org.dromara.warm.flow.strategy.*; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 表达式工具类 + * + * @author warm + */ +public class ExpressionUtil { + + static { + // 注册条件表达式(比较类 + spel) + for (Condition condition : Condition.values()) { + setExpression(condition); + } + + // 注册会签票签表达式 + for (VoteSign voteSign : VoteSign.values()) { + setExpression(voteSign); + } + + // 注册监听器表达式 + setExpression(new ListenerStrategySpel()); + + // 注册办理人表达式 + for (Handler handler : Handler.values()) { + setExpression(handler); + } + } + + /** + * 设置表达式 + * + * @param expressionStrategy 表达式策略 + * @param 表达式类型 + */ + public static void setExpression(ExpressionStrategy expressionStrategy) { + expressionStrategy.setExpression(expressionStrategy); + } + + /** + * 条件表达式替换 + * + * @param expression 条件表达式,比如“eq@@flag|4” ,或者自定义策略 + * @param variable 变量 + * @return boolean + */ + public static boolean evalCondition(String expression, Map variable) { + return Boolean.TRUE.equals(getValue(ConditionStrategy.EXPRESSION_STRATEGY_LIST, expression, variable)); + } + + /** + * 办理人表达式替换 + * + * @param addTasks 任务列表 + * @param flowParams 流程变量 + */ + public static void evalVariable(List addTasks, FlowParams flowParams) { + if (CollUtil.isEmpty(addTasks)) { + return; + } + Map variable = flowParams.getVariable(); + addTasks.forEach(addTask -> { + List permissions = addTask.getPermissionList().stream() + .map(s -> evalVariable(s, variable)).filter(Objects::nonNull) + .flatMap(List::stream) + .distinct() + .collect(Collectors.toList()); + + // 转换办理人,比如设计器中预设了能办理的人,如果其中包含角色或者部门id等,可以通过此接口进行转换成用户id + PermissionHandler permissionHandler = FlowEngine.permissionHandler(); + if (permissionHandler != null) { + try { + permissions = permissionHandler.convertPermissions(permissions); + } catch (Exception ignored) { + } + } + // 自定义下个任务的处理人 下个任务处理人配置类型 和 执行的下个任务的办理人 + permissions = nextHandle(flowParams.isNextHandlerAppend(), flowParams.getNextHandler(), permissions); + + addTask.setPermissionList(permissions); + }); + } + + /** + * 办理人表达式替换 + * + * @param expression 表达式,比如“${flag}或者# { @user.notify(#listenerVariable) } ” ,或者自定义策略 + * @param variable 流程变量 + * @return List + */ + public static List evalVariable(String expression, Map variable) { + List value = getValue(HandlerStrategy.EXPRESSION_STRATEGY_LIST, expression, variable); + if (CollUtil.isNotEmpty(value)) { + return value; + } + return Collections.singletonList(expression); + } + + /** + * 监听器表达式替换 + * + * @param expression 条件表达式,比如“# { @user.notify(#listenerVariable) } ” ,或者自定义策略 + * @param variable 变量 + */ + public static boolean evalListener(String expression, Map variable) { + return Boolean.TRUE.equals(getValue(ListenerStrategy.EXPRESSION_STRATEGY_LIST, expression, variable)); + } + + /** + * 票签表达式替换 + * + * @param expression 表达式,比如“${flag}或者# { @user.notify(#listenerVariable) } ” ,或者自定义策略 + * @param variable 流程变量 + * @return boolean + */ + public static boolean evalVoteSign(String expression, Map variable) { + return Boolean.TRUE.equals(getValue(VoteSignStrategy.EXPRESSION_STRATEGY_LIST, expression, variable)); + } + + /** + * 获取表达式对应的值 + * + * @param strategyList 表达式策略列表 + * @param expression 变量表达式 + * @param variable 流程变量 + * @return 执行结果 + */ + private static T getValue(List> strategyList, String expression + , Map variable) { + if (StrUtil.isNotEmpty(expression)) { + // 倒叙遍历,优先匹配最后注入的策略实现类 + for (int i = strategyList.size() - 1; i >= 0; i--) { + ExpressionStrategy strategy = strategyList.get(i); + if (expression.startsWith(strategy.getType())) { + if (StrUtil.isNotEmpty(strategy.interceptStr())) { + expression = expression.replace(strategy.getType() + strategy.interceptStr(), ""); + } + return strategy.eval(expression, MapUtil.isEmpty(variable) ? new HashMap<>() : variable); + } + } + } + return null; + } + + /** + * 处理下个任务的处理人 + * + * @param nextHandlerAppend 下个任务处理人配置类型 + * @param nextHandler 下个任务的处理人 + * @param permissions 节点配置的原下个任务的处理人 + * @author xiarg + * @since 2025/06/03 15:33:38 + */ + private static List nextHandle(boolean nextHandlerAppend, String[] nextHandler, List permissions) { + if (ArrayUtil.isEmpty(nextHandler)) { + return permissions; + } + if (nextHandlerAppend) { + permissions.addAll(new ArrayList<>(Arrays.asList(nextHandler))); + } else { + permissions = new ArrayList<>(Arrays.asList(nextHandler)); + } + return permissions; + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/utils/FlowConfigUtil.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/utils/FlowConfigUtil.java new file mode 100644 index 000000000..d60ae0f15 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/utils/FlowConfigUtil.java @@ -0,0 +1,187 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.utils; + +import org.dromara.common.core.utils.StreamUtils; + +import cn.hutool.core.collection.CollUtil; + +import org.dromara.warm.flow.FlowEngine; +import org.dromara.warm.flow.constant.ExceptionCons; +import org.dromara.warm.flow.dto.FlowCombine; +import org.dromara.warm.flow.entity.FlowDefinition; +import org.dromara.warm.flow.entity.FlowNode; +import org.dromara.warm.flow.entity.FlowSkip; +import org.dromara.warm.flow.enums.NodeType; +import org.dromara.warm.flow.enums.SkipType; + +import java.util.*; + +/** + * 流程配置帮助类 + * + * @author zhoukai + */ +public class FlowConfigUtil { + /** + * 无参构造 + */ + private FlowConfigUtil() { + + } + + public static FlowCombine structureFlow(FlowDefinition definition) { + // 获取流程 + FlowCombine combine = new FlowCombine(); + // 流程定义 + combine.setDefinition(definition); + // 所有的流程节点 + List allNodes = combine.getAllNodes(); + // 所有的流程连线 + List allSkips = combine.getAllSkips(); + + String flowName = definition.getFlowName(); + AssertUtil.isEmpty(definition.getFlowCode(), "【" + flowName + "】流程flowCode为空!"); + // 发布 + definition.setIsPublish(0); + definition.setUpdateTime(new Date()); + FlowEngine.dataFillHandler().idFill(definition); + + List nodeList = definition.getNodeList(); + // 每一个流程的开始节点个数 + int startNum = 0; + Set nodeCodeSet = new HashSet<>(); + // 遍历一个流程中的各个节点 + for (FlowNode node : nodeList) { + initNodeAndCondition(node, definition.getId(), definition.getVersion()); + startNum = checkStartAndSame(node, startNum, flowName, nodeCodeSet); + allNodes.add(node); + allSkips.addAll(node.getSkipList()); + } + Map skipMap = StreamUtils.toMap(allNodes, FlowNode::getNodeCode, FlowNode::getNodeType); + allSkips.forEach(allSkip -> allSkip.setNextNodeType(skipMap.get(allSkip.getNextNodeCode()))); + AssertUtil.isTrue(startNum == 0, "[" + flowName + "]" + ExceptionCons.LOST_START_NODE); + // 校验跳转节点的合法性 + checkSkipNode(allSkips); + // 校验所有目标节点是否都存在 + validaIsExistDestNode(allSkips, nodeCodeSet); + return combine; + } + + public static int checkStartAndSame(FlowNode node, int startNum, String flowName, Set nodeCodeSet) { + if (NodeType.isStart(node.getNodeType())) { + startNum++; + AssertUtil.isTrue(startNum > 1, "[" + flowName + "]" + ExceptionCons.MUL_START_NODE); + } + // 保证不存在重复的nodeCode + AssertUtil.contains(nodeCodeSet, node.getNodeCode(), + "【" + flowName + "】" + ExceptionCons.SAME_NODE_CODE); + nodeCodeSet.add(node.getNodeCode()); + return startNum; + } + + /** + * 校验跳转节点的合法性 + * + * @param allSkips + */ + public static void checkSkipNode(List allSkips) { + Map> allSkipMap = StreamUtils.groupByKey(allSkips, FlowSkip::getNowNodeCode); + // 不可同时通过或者退回到多个中间节点,必须先流转到网关节点 + for (List values : allSkipMap.values()) { + int passNum = 0; + int rejectNum = 0; + for (FlowSkip value : values) { + if (NodeType.isBetween(value.getNowNodeType()) && NodeType.isBetween(value.getNextNodeType())) { + if (SkipType.isPass(value.getSkipType())) { + passNum++; + } else { + rejectNum++; + } + } + } + AssertUtil.isTrue(passNum > 1 || rejectNum > 1, ExceptionCons.MUL_SKIP_BETWEEN); + } + } + + /** + * 校验所有的目标节点是否存在 + * + * @param allSkips + * @param nodeCodeSet + */ + public static void validaIsExistDestNode(List allSkips, Set nodeCodeSet) { + for (FlowSkip allSkip : allSkips) { + String nextNodeCode = allSkip.getNextNodeCode(); + AssertUtil.isTrue(!nodeCodeSet.contains(nextNodeCode), "【" + nextNodeCode + "】" + ExceptionCons.NULL_NODE_CODE); + } + } + + + /** + * 读取工作节点和跳转条件 + * + * @param node node + * @param definitionId definitionId + * @param version version + */ + public static void initNodeAndCondition(FlowNode node, Long definitionId, String version) { + String nodeName = node.getNodeName(); + String nodeCode = node.getNodeCode(); + List skipList = node.getSkipList(); + if (!NodeType.isEnd(node.getNodeType())) { + AssertUtil.isEmpty(skipList, ExceptionCons.MUST_SKIP); + } + AssertUtil.isEmpty(nodeCode, "[" + nodeName + "]" + ExceptionCons.LOST_NODE_CODE); + + node.setVersion(version); + node.setDefinitionId(definitionId); + + // 中间节点的集合, 跳转类型和目标节点不能重复 + Set betweenSet = new HashSet<>(); + // 网关的集合 跳转条件和下目标节点不能重复 + Set gateWaySet = new HashSet<>(); + int skipNum = 0; + // 遍历节点下的跳转条件 + if (CollUtil.isEmpty(skipList)) { + return; + } + for (FlowSkip skip : skipList) { + if (NodeType.isStart(node.getNodeType())) { + skipNum++; + AssertUtil.isTrue(skipNum > 1, "[" + node.getNodeName() + "]" + ExceptionCons.MUL_START_SKIP); + } + AssertUtil.isEmpty(skip.getNextNodeCode(), "【" + nodeName + "】" + ExceptionCons.LOST_DEST_NODE); + // 流程id + skip.setDefinitionId(definitionId); + skip.setNowNodeType(node.getNodeType()); + if (NodeType.isGateWaySerial(node.getNodeType())) { + String target = skip.getSkipCondition() + ":" + skip.getNextNodeCode(); + AssertUtil.contains(gateWaySet, target, "[" + nodeName + "]" + ExceptionCons.SAME_CONDITION_NODE); + gateWaySet.add(target); + } else if (NodeType.isGateWayParallel(node.getNodeType())) { + String target = skip.getNextNodeCode(); + AssertUtil.contains(gateWaySet, target, "[" + nodeName + "]" + ExceptionCons.SAME_DEST_NODE); + gateWaySet.add(target); + } else { + String value = skip.getSkipType() + ":" + skip.getNextNodeCode(); + AssertUtil.contains(betweenSet, value, "[" + nodeName + "]" + ExceptionCons.SAME_CONDITION_VALUE); + betweenSet.add(value); + } + } + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/utils/ListenerUtil.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/utils/ListenerUtil.java new file mode 100644 index 000000000..f9300f7c8 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/utils/ListenerUtil.java @@ -0,0 +1,164 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.utils; + +import cn.hutool.core.util.ClassUtil; +import org.dromara.common.core.utils.StreamUtils; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.ObjectUtil; + +import org.dromara.warm.flow.FlowEngine; +import org.dromara.warm.flow.constant.FlowCons; +import org.dromara.warm.flow.entity.FlowDefinition; +import org.dromara.warm.flow.entity.FlowTask; +import org.dromara.warm.flow.enums.NodeType; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.warm.flow.listener.GlobalListener; +import org.dromara.warm.flow.listener.Listener; +import org.dromara.warm.flow.listener.ListenerVariable; +import org.dromara.warm.flow.listener.ValueHolder; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; + +/** + * 监听器工具类 + * + * @author warm + */ +public class ListenerUtil { + + private ListenerUtil() { + + } + + /** + * 执行完成监听器和下一节点的开始监听器 + * + * @param listenerVariable 监听器变量 + */ + public static void endCreateListener(ListenerVariable listenerVariable) { + // 执行任务完成监听器 + executeFinish(listenerVariable); + // 执行任务创建监听器 + List tasks = listenerVariable.getNextTasks(); + listenerVariable.getNextNodes().forEach(node -> { + if (!NodeType.isEnd(node.getNodeType())) { + FlowTask nextTask = StreamUtils.findFirstValue(tasks, task -> task.getNodeCode().equals(node.getNodeCode())); + listenerVariable.setNode(node) + .setNextNodes(null) + .setTask(nextTask) + .setNextTasks(null); + executeCreate(listenerVariable); + } + }); + } + + public static void executeStart(ListenerVariable listenerVariable) { + executeListener(listenerVariable, Listener.LISTENER_START); + } + + public static void executeAssignment(ListenerVariable listenerVariable) { + executeListener(listenerVariable, Listener.LISTENER_ASSIGNMENT); + } + + public static void executeFinish(ListenerVariable listenerVariable) { + executeListener(listenerVariable, Listener.LISTENER_FINISH); + } + + public static void executeCreate(ListenerVariable listenerVariable) { + executeListener(listenerVariable, Listener.LISTENER_CREATE); + } + + public static void executeListener(ListenerVariable listenerVariable, String type) { + // 执行监听器 + //listenerPath({"name": "John Doe", "age": 30})@@listenerPath@@listenerPath + String listenerType = listenerVariable.getNode().getListenerType(); + execute(listenerVariable, type, listenerVariable.getNode().getListenerPath(), listenerType); + FlowDefinition definition = listenerVariable.getDefinition(); + execute(listenerVariable, type, definition.getListenerPath(), definition.getListenerType()); + GlobalListener globalListener = FlowEngine.globalListener(); + if (ObjectUtil.isNotNull(globalListener)) { + globalListener.notify(type, listenerVariable); + } + } + + public static void execute(ListenerVariable listenerVariable, String type, String listenerPaths, String listenerTypes) { + if (StrUtil.isNotEmpty(listenerTypes)) { + String[] listenerTypeArr = listenerTypes.split(","); + for (int i = 0; i < listenerTypeArr.length; i++) { + String listenerType = listenerTypeArr[i].trim(); + if (listenerType.equals(type)) { + if (StrUtil.isNotEmpty(listenerPaths)) { + String[] listenerPathArr = listenerPaths.split(FlowCons.SPLIT_AT); + String listenerPath = listenerPathArr[i].trim(); + ValueHolder valueHolder = new ValueHolder(); + //截取出path 和params + getListenerPath(listenerPath, valueHolder); + + Map expressionMap = MapUtil.newAndPut("listenerVariable", listenerVariable); + // 如果返回为true,说明配置的path是表达式,并且已经执行完,不需要执行后续加载类路径(优先执行表达式监听器) + if (ExpressionUtil.evalListener(listenerPath, expressionMap)) { + return; + } + + Class clazz = ClassUtil.loadClass(valueHolder.getPath()); + // 增加传入类路径校验Listener接口, 防止强制类型转换失败 + if (ObjectUtil.isNotNull(clazz) && Listener.class.isAssignableFrom(clazz)) { + Listener listener = (Listener) SpringUtils.getBeanOrNull(clazz); + if (ObjectUtil.isNotNull(listener)) { + Map variable = listenerVariable.getVariable(); + if (MapUtil.isEmpty(variable)) { + variable = new HashMap<>(); + } else { + variable.remove(FlowCons.WARM_LISTENER_PARAM); + } + if (StrUtil.isNotEmpty(valueHolder.getParams())) { + variable.put(FlowCons.WARM_LISTENER_PARAM, valueHolder.getParams()); + } + listener.notify(listenerVariable.setVariable(variable)); + } + + } + } + } + } + } + } + + /** + * 分别截取监听器path 和 监听器params + * String input = "listenerPath({\"name\": \"John Doe\", \"age\": 30})"; + * + * @param listenerStr + * @param valueHolder + */ + public static void getListenerPath(String listenerStr, ValueHolder valueHolder) { + String path; + String params; + + Matcher matcher = FlowCons.LISTENER_PATTERN.matcher(listenerStr); + if (matcher.find()) { + path = matcher.group(1).replaceAll("[\\(\\)]", ""); + params = matcher.group(2).replaceAll("[\\(\\)]", ""); + valueHolder.setPath(path); + valueHolder.setParams(params); + } + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/utils/MapUtil.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/utils/MapUtil.java new file mode 100644 index 000000000..e00c5c775 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/utils/MapUtil.java @@ -0,0 +1,104 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.utils; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ObjectUtil; + +import java.util.HashMap; +import java.util.Map; + +/** + * map工具类(仅保留 hutool MapUtil 没有的方法,其余请直接使用 cn.hutool.core.map.MapUtil) + * + * @author warm + * @since 2023/5/18 9:46 + */ +public class MapUtil { + + /** + * * 判断一个Map是否为空 + * + * @param map 要判断的Map + * @return true:为空 false:非空 + */ + public static boolean isEmpty(Map map) { + return ObjectUtil.isNull(map) || map.isEmpty(); + } + + /** + * * 判断一个Map是否为空 + * + * @param map 要判断的Map + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Map map) { + return !isEmpty(map); + } + + /** + * 合并多个map(不修改入参,返回新map) + * + * @param maps 需要合并的map + */ + @SafeVarargs + public static Map mergeAll(Map... maps) { + Map map = new HashMap<>(); + for (Map m : maps) { + if (isNotEmpty(m)) { + map.putAll(m); + } + } + return map; + } + + /** + * 合并多个参数为 Map,每两个参数为一组 key-value + * + * @param values 参数 + */ + @SuppressWarnings("unchecked") + public static Map mergeAll(Object... values) { + Map map = new HashMap<>(); + if (ArrayUtil.isNotEmpty(values)) { + for (int i = 0; i < values.length - 1; i += 2) { + K key = (K) values[i]; + V value = (V) values[i + 1]; + map.put(key, value); + } + } + return map; + } + + public static Map newAndPut(K k, V v) { + Map map = new HashMap<>(); + map.put(k, v); + return map; + } + + /** + * 克隆一个Map + * + * @param map 要克隆的Map + * @return 克隆后的Map + */ + public static Map clone(Map map) { + if (isEmpty(map)) { + return new HashMap<>(); + } + return new HashMap<>(map); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/utils/MathUtil.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/utils/MathUtil.java new file mode 100644 index 000000000..4da3342b9 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/utils/MathUtil.java @@ -0,0 +1,121 @@ +/* + * Copyright 2024-2025, Warm-Flow (290631660@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.warm.flow.utils; + +import cn.hutool.core.util.StrUtil; + +import java.math.BigDecimal; + +/** + * 数字工具类 + * + * @author warm + */ +public class MathUtil { + + public static final BigDecimal ONE_HUNDRED = BigDecimal.valueOf(100); + + private MathUtil() { + } + + /** + * 判断是否为数字 + * + * @param str 字符串 + */ + public static boolean isNumeric(String str) { + // 检查字符串是否为空 + if (str == null || str.isEmpty()) { + return false; + } + try { + // 使用Double.parseDouble()方法尝试将字符串转换为double + Double.parseDouble(str.trim()); + // 转换成功,字符串是数字 + return true; + } catch (NumberFormatException e) { + // 转换失败,字符串不是数字 + return false; + } + } + + /** + * 判断数字大小 + * + * @param n1 字符串 + * @param n2 字符串 + */ + public static int determineSize(String n1, String n2) { + BigDecimal a = new BigDecimal(n1); + BigDecimal b = new BigDecimal(n2); + return a.compareTo(b); + } + + + /** + * 判断是否为0 + * + * @param str 字符串 + */ + public static boolean isZero(String str) { + if (StrUtil.isEmpty(str)) { + return false; + } + try { + BigDecimal value = new BigDecimal(str.trim()); + return value.compareTo(BigDecimal.ZERO) == 0; + } catch (NumberFormatException e) { + return false; + } + } + + /** + * 判断字符串是否等于 100 + * + * @param str 字符串 + * @return true:等于 100;false:不等于 + */ + public static boolean isHundred(String str) { + if (StrUtil.isEmpty(str)) { + return false; + } + try { + BigDecimal value = new BigDecimal(str.trim()); + return value.compareTo(ONE_HUNDRED) == 0; + } catch (NumberFormatException e) { + return false; + } + } + + /** + * 判断字符串表示的数值是否在 0 到 100 之间(含边界) + * + * @param str 字符串 + * @return true:在 [0, 100] 范围内;false:不在范围内 + */ + public static boolean isBetweenZeroAndHundred(String str) { + if (StrUtil.isEmpty(str)) { + return false; + } + try { + BigDecimal value = new BigDecimal(str.trim()); + return value.compareTo(BigDecimal.ZERO) >= 0 && value.compareTo(ONE_HUNDRED) <= 0; + } catch (NumberFormatException e) { + return false; + } + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java index cf41a1ad0..20c806a1c 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java @@ -10,9 +10,8 @@ import org.dromara.common.log.enums.BusinessType; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.redis.annotation.RepeatSubmit; import org.dromara.common.web.core.BaseController; -import org.dromara.warm.flow.core.entity.Definition; -import org.dromara.warm.flow.core.service.DefService; -import org.dromara.warm.flow.orm.entity.FlowDefinition; +import org.dromara.warm.flow.entity.FlowDefinition; +import org.dromara.warm.flow.service.DefService; import org.dromara.workflow.common.ConditionalOnEnable; import org.dromara.workflow.domain.vo.FlowDefinitionVo; import org.dromara.workflow.service.IFlwDefinitionService; @@ -73,7 +72,7 @@ public class FlwDefinitionController extends BaseController { */ @GetMapping(value = "/{id}") @SaCheckPermission("workflow:definition:query") - public R getInfo(@PathVariable Long id) { + public R getInfo(@PathVariable Long id) { return R.ok(defService.getById(id)); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java index 389597560..019343e7f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java @@ -11,7 +11,7 @@ import org.dromara.common.log.enums.BusinessType; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.redis.annotation.RepeatSubmit; import org.dromara.common.web.core.BaseController; -import org.dromara.warm.flow.core.service.InsService; +import org.dromara.warm.flow.service.InsService; import org.dromara.workflow.common.ConditionalOnEnable; import org.dromara.workflow.domain.bo.FlowCancelBo; import org.dromara.workflow.domain.bo.FlowInstanceBo; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java index d992f1e30..09f5fa7eb 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java @@ -11,8 +11,7 @@ import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.redis.annotation.RepeatSubmit; import org.dromara.common.web.core.BaseController; import org.dromara.system.api.domain.UserDTO; -import org.dromara.warm.flow.core.entity.Node; -import org.dromara.warm.flow.orm.entity.FlowNode; +import org.dromara.warm.flow.entity.FlowNode; import org.dromara.workflow.api.domain.StartProcessReturnDTO; import org.dromara.workflow.common.ConditionalOnEnable; import org.dromara.workflow.domain.bo.*; @@ -212,7 +211,7 @@ public class FlwTaskController extends BaseController { * @return 可驳回节点列表 */ @GetMapping("/getBackTaskNode/{taskId}/{nowNodeCode}") - public R> getBackTaskNode(@PathVariable Long taskId, @PathVariable String nowNodeCode) { + public R> getBackTaskNode(@PathVariable Long taskId, @PathVariable String nowNodeCode) { return R.ok(flwTaskService.getBackTaskNode(taskId, nowNodeCode)); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/context/CompleteTaskContext.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/context/CompleteTaskContext.java index c6f56a003..bc9ddc139 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/context/CompleteTaskContext.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/context/CompleteTaskContext.java @@ -1,9 +1,9 @@ package org.dromara.workflow.domain.context; import lombok.Data; -import org.dromara.warm.flow.core.dto.FlowParams; -import org.dromara.warm.flow.core.entity.Instance; -import org.dromara.warm.flow.orm.entity.FlowTask; +import org.dromara.warm.flow.dto.FlowParams; +import org.dromara.warm.flow.entity.FlowInstance; +import org.dromara.warm.flow.entity.FlowTask; import org.dromara.workflow.domain.bo.CompleteTaskBo; /** @@ -29,7 +29,7 @@ public class CompleteTaskContext { /** * 当前任务所属流程实例,由校验节点加载。 */ - private Instance instance; + private FlowInstance instance; /** * Warm-Flow 办理参数,由参数构建节点生成并供执行、自动审批节点复用。 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/context/InstanceDeleteContext.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/context/InstanceDeleteContext.java index 86a7a530c..f0f756c22 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/context/InstanceDeleteContext.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/context/InstanceDeleteContext.java @@ -1,7 +1,7 @@ package org.dromara.workflow.domain.context; import lombok.Data; -import org.dromara.warm.flow.orm.entity.FlowInstance; +import org.dromara.warm.flow.entity.FlowInstance; import java.util.Collection; import java.util.List; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/context/StartProcessContext.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/context/StartProcessContext.java index 9a8ae610e..98ce8ebd9 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/context/StartProcessContext.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/context/StartProcessContext.java @@ -1,10 +1,9 @@ package org.dromara.workflow.domain.context; import lombok.Data; -import org.dromara.warm.flow.core.entity.Definition; -import org.dromara.warm.flow.core.entity.Instance; -import org.dromara.warm.flow.core.entity.Task; -import org.dromara.warm.flow.orm.entity.FlowInstance; +import org.dromara.warm.flow.entity.FlowDefinition; +import org.dromara.warm.flow.entity.FlowInstance; +import org.dromara.warm.flow.entity.FlowTask; import org.dromara.workflow.api.domain.StartProcessReturnDTO; import org.dromara.workflow.domain.FlowInstanceBizExt; import org.dromara.workflow.domain.bo.StartProcessBo; @@ -50,17 +49,17 @@ public class StartProcessContext { /** * 已发布的流程定义。 */ - private Definition definition; + private FlowDefinition definition; /** * 新启动的流程实例。 */ - private Instance instance; + private FlowInstance instance; /** * 当前流程实例下生成的任务列表。 */ - private List taskList; + private List taskList; /** * 启动流程返回结果。 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/context/TaskOperationContext.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/context/TaskOperationContext.java index 73fa2de4c..8c9256d11 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/context/TaskOperationContext.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/context/TaskOperationContext.java @@ -1,9 +1,9 @@ package org.dromara.workflow.domain.context; import lombok.Data; -import org.dromara.warm.flow.core.dto.FlowParams; -import org.dromara.warm.flow.core.entity.Task; -import org.dromara.warm.flow.orm.entity.FlowNode; +import org.dromara.warm.flow.dto.FlowParams; +import org.dromara.warm.flow.entity.FlowTask; +import org.dromara.warm.flow.entity.FlowNode; import org.dromara.workflow.common.enums.TaskOperationEnum; import org.dromara.workflow.domain.bo.TaskOperationBo; @@ -40,7 +40,7 @@ public class TaskOperationContext { /** * 当前任务。 */ - private Task task; + private FlowTask task; /** * 当前任务对应的流程节点。 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java index 1733a701c..c45d70c16 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java @@ -4,7 +4,7 @@ import lombok.Data; import org.dromara.common.core.utils.DateUtils; import org.dromara.common.translation.annotation.Translation; import org.dromara.common.translation.constant.TransConstant; -import org.dromara.warm.flow.core.enums.CooperateType; +import org.dromara.warm.flow.enums.CooperateType; import org.dromara.workflow.common.constant.FlowConstant; import java.io.Serial; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java index c4aefbf56..2d669bf8b 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java @@ -3,7 +3,7 @@ package org.dromara.workflow.domain.vo; import lombok.Data; import org.dromara.common.translation.annotation.Translation; import org.dromara.common.translation.constant.TransConstant; -import org.dromara.warm.flow.core.entity.User; +import org.dromara.warm.flow.entity.FlowUser; import org.dromara.workflow.common.constant.FlowConstant; import java.io.Serial; @@ -86,7 +86,7 @@ public class FlowTaskVo implements Serializable { /** * 流程用户列表 */ - private List userList; + private List userList; /** * 审批表单是否自定义(Y是 N否) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/NodeExtVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/NodeExtVo.java index 5fb3380b4..6c3d3a730 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/NodeExtVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/NodeExtVo.java @@ -1,4 +1,5 @@ package org.dromara.workflow.domain.vo; +import org.dromara.warm.flow.entity.*; import lombok.Data; @@ -9,7 +10,7 @@ import java.util.Map; import java.util.Set; /** - * Node 扩展属性解析结果 VO + * FlowNode 扩展属性解析结果 VO *

* 用于封装从扩展属性 JSON 中解析出的各类信息,包括按钮权限、抄送对象和自定义参数。 * diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/event/WorkflowCopyEvent.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/event/WorkflowCopyEvent.java index 06336313e..6eff6ad43 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/event/WorkflowCopyEvent.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/event/WorkflowCopyEvent.java @@ -1,7 +1,7 @@ package org.dromara.workflow.event; import cn.hutool.core.collection.CollUtil; -import org.dromara.warm.flow.core.entity.Task; +import org.dromara.warm.flow.entity.FlowTask; import org.dromara.workflow.domain.bo.FlowCopyBo; import java.util.List; @@ -12,7 +12,7 @@ import java.util.List; * @param task 当前任务 * @param flowCopyList 抄送人列表 */ -public record WorkflowCopyEvent(Task task, List flowCopyList) { +public record WorkflowCopyEvent(FlowTask task, List flowCopyList) { public WorkflowCopyEvent { if (CollUtil.isNotEmpty(flowCopyList)) { diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/FlowExceptionHandler.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/FlowExceptionHandler.java index 837298704..c5706ca74 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/FlowExceptionHandler.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/FlowExceptionHandler.java @@ -3,7 +3,7 @@ package org.dromara.workflow.handler; import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.domain.R; -import org.dromara.warm.flow.core.exception.FlowException; +import org.dromara.warm.flow.exception.FlowException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/FlowProcessEventHandler.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/FlowProcessEventHandler.java index d61d685cf..2f9a6139d 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/FlowProcessEventHandler.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/FlowProcessEventHandler.java @@ -2,8 +2,8 @@ package org.dromara.workflow.handler; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.utils.SpringUtils; -import org.dromara.warm.flow.core.entity.Instance; -import org.dromara.warm.flow.core.entity.Task; +import org.dromara.warm.flow.entity.FlowInstance; +import org.dromara.warm.flow.entity.FlowTask; import org.dromara.workflow.api.event.ProcessDeleteEvent; import org.dromara.workflow.api.event.ProcessEvent; import org.dromara.workflow.api.event.ProcessTaskEvent; @@ -32,7 +32,7 @@ public class FlowProcessEventHandler { * @param params 办理参数 * @param submit 当为true时为申请人节点办理 */ - public void processHandler(String flowCode, Instance instance, String status, Map params, boolean submit) { + public void processHandler(String flowCode, FlowInstance instance, String status, Map params, boolean submit) { log.info("【流程事件发布】流程编码: {}, 业务ID: {}, 流程状态: {}, 节点类型: {}, 节点编码: {}, 节点名称: {}, 是否申请人节点: {}, 参数: {}", flowCode, instance.getBusinessId(), status, instance.getNodeType(), instance.getNodeCode(), instance.getNodeName(), submit, params); ProcessEvent processEvent = new ProcessEvent(); @@ -56,7 +56,7 @@ public class FlowProcessEventHandler { * @param nextTask 任务 * @param params 上一个任务的办理参数 */ - public void processTaskHandler(String flowCode, Instance instance, Task nextTask, Map params) { + public void processTaskHandler(String flowCode, FlowInstance instance, FlowTask nextTask, Map params) { log.info("【流程任务事件发布】流程编码: {}, 业务ID: {}, 节点类型: {}, 节点编码: {}, 节点名称: {}, 任务ID: {}", flowCode, instance.getBusinessId(), nextTask.getNodeType(), nextTask.getNodeCode(), nextTask.getNodeName(), nextTask.getId()); ProcessTaskEvent processTaskEvent = new ProcessTaskEvent(); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java index bebd4740c..7cf0e53e3 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java @@ -8,8 +8,8 @@ import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.system.api.domain.UserDTO; -import org.dromara.warm.flow.core.dto.FlowParams; -import org.dromara.warm.flow.core.handler.PermissionHandler; +import org.dromara.warm.flow.dto.FlowParams; +import org.dromara.warm.flow.handler.PermissionHandler; import org.dromara.workflow.common.ConditionalOnEnable; import org.dromara.workflow.service.IFlwTaskAssigneeService; import org.springframework.stereotype.Component; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java index ab958035e..e5fc8a291 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java @@ -12,13 +12,13 @@ import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.system.api.UserService; -import org.dromara.warm.flow.core.FlowEngine; -import org.dromara.warm.flow.core.dto.FlowParams; -import org.dromara.warm.flow.core.entity.Definition; -import org.dromara.warm.flow.core.entity.Instance; -import org.dromara.warm.flow.core.entity.Task; -import org.dromara.warm.flow.core.listener.GlobalListener; -import org.dromara.warm.flow.core.listener.ListenerVariable; +import org.dromara.warm.flow.FlowEngine; +import org.dromara.warm.flow.dto.FlowParams; +import org.dromara.warm.flow.entity.FlowDefinition; +import org.dromara.warm.flow.entity.FlowInstance; +import org.dromara.warm.flow.entity.FlowTask; +import org.dromara.warm.flow.listener.GlobalListener; +import org.dromara.warm.flow.listener.ListenerVariable; import org.dromara.workflow.common.ConditionalOnEnable; import org.dromara.workflow.common.constant.FlowConstant; import org.dromara.workflow.common.enums.TaskStatusEnum; @@ -109,14 +109,14 @@ public class WorkflowGlobalListener implements GlobalListener { @Override public void assignment(ListenerVariable listenerVariable) { Map variable = listenerVariable.getVariable(); - List nextTasks = listenerVariable.getNextTasks(); + List nextTasks = listenerVariable.getNextTasks(); FlowParams flowParams = listenerVariable.getFlowParams(); - Definition definition = listenerVariable.getDefinition(); - Instance instance = listenerVariable.getInstance(); + FlowDefinition definition = listenerVariable.getDefinition(); + FlowInstance instance = listenerVariable.getInstance(); String applyNodeCode = flwCommonService.applyNodeCode(definition.getId()); String hisStatus = flowParams != null ? flowParams.getHisStatus() : null; - for (Task flowTask : nextTasks) { + for (FlowTask flowTask : nextTasks) { String nodeCode = flowTask.getNodeCode(); // 处理办理或退回时指定办理人的情况 @@ -140,7 +140,7 @@ public class WorkflowGlobalListener implements GlobalListener { * @param flowTask 流程任务 * @param taskStatus 任务状态 */ - private void processTaskPermission(Map variable, Task flowTask, String taskStatus) { + private void processTaskPermission(Map variable, FlowTask flowTask, String taskStatus) { String nodeKey = taskStatus + StringUtils.COLON + flowTask.getNodeCode(); // 检查是否存在状态相关的变量 @@ -178,10 +178,10 @@ public class WorkflowGlobalListener implements GlobalListener { */ @Override public void finish(ListenerVariable listenerVariable) { - Instance instance = listenerVariable.getInstance(); - Definition definition = listenerVariable.getDefinition(); - Task task = listenerVariable.getTask(); - List nextTasks = listenerVariable.getNextTasks(); + FlowInstance instance = listenerVariable.getInstance(); + FlowDefinition definition = listenerVariable.getDefinition(); + FlowTask task = listenerVariable.getTask(); + List nextTasks = listenerVariable.getNextTasks(); Map params = new HashMap<>(); FlowParams flowParams = listenerVariable.getFlowParams(); Map variable = new HashMap<>(); @@ -220,7 +220,7 @@ public class WorkflowGlobalListener implements GlobalListener { } //发布任务事件 if (CollUtil.isNotEmpty(nextTasks)) { - for (Task nextTask : nextTasks) { + for (FlowTask nextTask : nextTasks) { flowProcessEventHandler.processTaskHandler(definition.getFlowCode(), instance, nextTask, params); } } @@ -266,7 +266,7 @@ public class WorkflowGlobalListener implements GlobalListener { * @param nextTasks 后续任务列表 * @return 是否发送待办消息 */ - private boolean shouldSendTaskMessage(FlowParams flowParams, Definition definition, List nextTasks) { + private boolean shouldSendTaskMessage(FlowParams flowParams, FlowDefinition definition, List nextTasks) { if (flowParams == null || !TaskStatusEnum.BACK.getStatus().equals(flowParams.getHisStatus())) { return true; } @@ -286,7 +286,7 @@ public class WorkflowGlobalListener implements GlobalListener { * @param status 业务状态 * @param variable 流程变量 */ - private void notifyInitiatorIfNeeded(Definition definition, Instance instance, String status, Map variable) { + private void notifyInitiatorIfNeeded(FlowDefinition definition, FlowInstance instance, String status, Map variable) { if (!StringUtils.equalsAny(status, BusinessStatusEnum.FINISH.getStatus(), BusinessStatusEnum.BACK.getStatus())) { return; } @@ -308,7 +308,7 @@ public class WorkflowGlobalListener implements GlobalListener { * @param instance 流程实例 * @return 流程最终状态 */ - private String determineFlowStatus(Instance instance) { + private String determineFlowStatus(FlowInstance instance) { String flowStatus = instance.getFlowStatus(); if (StringUtils.isNotBlank(flowStatus) && BusinessStatusEnum.initialState(flowStatus)) { log.info("流程实例当前状态: {}", flowStatus); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompleteAutoPassComponent.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompleteAutoPassComponent.java index cb21570f0..1aa6a312a 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompleteAutoPassComponent.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompleteAutoPassComponent.java @@ -9,12 +9,12 @@ import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.query.QueryBuilder; import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.warm.flow.core.FlowEngine; -import org.dromara.warm.flow.core.dto.FlowParams; -import org.dromara.warm.flow.core.entity.User; -import org.dromara.warm.flow.core.service.TaskService; -import org.dromara.warm.flow.orm.entity.FlowTask; -import org.dromara.warm.flow.orm.mapper.FlowTaskMapper; +import org.dromara.warm.flow.FlowEngine; +import org.dromara.warm.flow.dto.FlowParams; +import org.dromara.warm.flow.entity.FlowUser; +import org.dromara.warm.flow.service.TaskService; +import org.dromara.warm.flow.entity.FlowTask; +import org.dromara.warm.flow.mapper.FlowTaskMapper; import org.dromara.workflow.common.ConditionalOnEnable; import org.dromara.workflow.domain.context.CompleteTaskContext; @@ -58,7 +58,7 @@ public class CompleteAutoPassComponent extends NodeComponent { if (CollUtil.isEmpty(flowTaskList)) { return; } - List userList = FlowEngine.userService() + List userList = FlowEngine.userService() .getByAssociateds(StreamUtils.toList(flowTaskList, FlowTask::getId)); if (CollUtil.isEmpty(userList)) { return; @@ -68,7 +68,7 @@ public class CompleteAutoPassComponent extends NodeComponent { continue; } // 自动审批只处理当前登录人仍是办理人的后续任务,避免替其他候选人或并行分支误审批。 - List users = StreamUtils.filter(userList, + List users = StreamUtils.filter(userList, e -> ObjectUtil.equals(task.getId(), e.getAssociated()) && ObjectUtil.equal(e.getProcessedBy(), LoginHelper.getUserIdStr())); if (CollUtil.isEmpty(users)) { continue; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompleteExecuteComponent.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompleteExecuteComponent.java index a6cd00dd3..f1bdf874f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompleteExecuteComponent.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompleteExecuteComponent.java @@ -5,9 +5,9 @@ import com.yomahub.liteflow.annotation.LiteflowComponent; import com.yomahub.liteflow.core.NodeComponent; import lombok.RequiredArgsConstructor; import org.dromara.common.core.enums.BusinessStatusEnum; -import org.dromara.warm.flow.core.dto.FlowParams; -import org.dromara.warm.flow.core.enums.SkipType; -import org.dromara.warm.flow.core.service.TaskService; +import org.dromara.warm.flow.dto.FlowParams; +import org.dromara.warm.flow.enums.SkipType; +import org.dromara.warm.flow.service.TaskService; import org.dromara.workflow.common.ConditionalOnEnable; import org.dromara.workflow.common.enums.TaskStatusEnum; import org.dromara.workflow.domain.bo.CompleteTaskBo; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompletePrepareComponent.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompletePrepareComponent.java index ad3bb56e2..28a9a678b 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompletePrepareComponent.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompletePrepareComponent.java @@ -8,10 +8,10 @@ import lombok.RequiredArgsConstructor; import org.dromara.common.core.enums.BusinessStatusEnum; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.StringUtils; -import org.dromara.warm.flow.core.entity.Instance; -import org.dromara.warm.flow.core.service.InsService; -import org.dromara.warm.flow.orm.entity.FlowTask; -import org.dromara.warm.flow.orm.mapper.FlowTaskMapper; +import org.dromara.warm.flow.entity.FlowInstance; +import org.dromara.warm.flow.service.InsService; +import org.dromara.warm.flow.entity.FlowTask; +import org.dromara.warm.flow.mapper.FlowTaskMapper; import org.dromara.workflow.common.ConditionalOnEnable; import org.dromara.workflow.common.enums.TaskStatusEnum; import org.dromara.workflow.domain.bo.CompleteTaskBo; @@ -47,7 +47,7 @@ public class CompletePrepareComponent extends NodeComponent { if (ObjectUtil.isNull(flowTask)) { throw new ServiceException("流程任务不存在或任务已审批!"); } - Instance instance = insService.getById(flowTask.getInstanceId()); + FlowInstance instance = insService.getById(flowTask.getInstanceId()); if (ObjectUtil.isNull(instance)) { throw new ServiceException("流程实例不存在"); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/instance/InstanceDeleteEventComponent.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/instance/InstanceDeleteEventComponent.java index 8924b84ba..5c3a20fac 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/instance/InstanceDeleteEventComponent.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/instance/InstanceDeleteEventComponent.java @@ -8,9 +8,9 @@ import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.warm.flow.core.entity.Definition; -import org.dromara.warm.flow.core.entity.Instance; -import org.dromara.warm.flow.core.service.DefService; +import org.dromara.warm.flow.entity.FlowDefinition; +import org.dromara.warm.flow.entity.FlowInstance; +import org.dromara.warm.flow.service.DefService; import org.dromara.workflow.common.ConditionalOnEnable; import org.dromara.workflow.domain.context.InstanceDeleteContext; import org.dromara.workflow.handler.FlowProcessEventHandler; @@ -42,13 +42,13 @@ public class InstanceDeleteEventComponent extends NodeComponent { } }); - Map definitionMap = StreamUtils.toMap( - defService.getByIds(StreamUtils.toList(context.getFlowInstances(), Instance::getDefinitionId)), - Definition::getId, + Map definitionMap = StreamUtils.toMap( + defService.getByIds(StreamUtils.toList(context.getFlowInstances(), FlowInstance::getDefinitionId)), + FlowDefinition::getId, Function.identity() ); context.getFlowInstances().forEach(instance -> { - Definition definition = definitionMap.get(instance.getDefinitionId()); + FlowDefinition definition = definitionMap.get(instance.getDefinitionId()); if (ObjectUtil.isNull(definition)) { log.warn("实例 ID: {} 对应的流程定义信息未找到,跳过删除事件触发。", instance.getId()); return; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/instance/InstanceDeleteExecuteComponent.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/instance/InstanceDeleteExecuteComponent.java index 8e27a47e1..ee35507a3 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/instance/InstanceDeleteExecuteComponent.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/instance/InstanceDeleteExecuteComponent.java @@ -6,12 +6,12 @@ import com.yomahub.liteflow.core.NodeComponent; import lombok.RequiredArgsConstructor; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.mybatis.core.query.QueryBuilder; -import org.dromara.warm.flow.core.FlowEngine; -import org.dromara.warm.flow.core.service.InsService; -import org.dromara.warm.flow.orm.entity.FlowHisTask; -import org.dromara.warm.flow.orm.entity.FlowTask; -import org.dromara.warm.flow.orm.mapper.FlowHisTaskMapper; -import org.dromara.warm.flow.orm.mapper.FlowTaskMapper; +import org.dromara.warm.flow.FlowEngine; +import org.dromara.warm.flow.service.InsService; +import org.dromara.warm.flow.entity.FlowHisTask; +import org.dromara.warm.flow.entity.FlowTask; +import org.dromara.warm.flow.mapper.FlowHisTaskMapper; +import org.dromara.warm.flow.mapper.FlowTaskMapper; import org.dromara.workflow.common.ConditionalOnEnable; import org.dromara.workflow.common.enums.TaskStatusEnum; import org.dromara.workflow.domain.context.InstanceDeleteContext; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/instance/InstanceDeleteLoadComponent.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/instance/InstanceDeleteLoadComponent.java index 376996b6d..6f2304125 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/instance/InstanceDeleteLoadComponent.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/instance/InstanceDeleteLoadComponent.java @@ -7,8 +7,8 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.mybatis.core.query.QueryBuilder; -import org.dromara.warm.flow.orm.entity.FlowInstance; -import org.dromara.warm.flow.orm.mapper.FlowInstanceMapper; +import org.dromara.warm.flow.entity.FlowInstance; +import org.dromara.warm.flow.mapper.FlowInstanceMapper; import org.dromara.workflow.common.ConditionalOnEnable; import org.dromara.workflow.domain.context.InstanceDeleteContext; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/operation/TaskOpExecuteComponent.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/operation/TaskOpExecuteComponent.java index dc2b77825..60b1856a2 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/operation/TaskOpExecuteComponent.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/operation/TaskOpExecuteComponent.java @@ -3,7 +3,7 @@ package org.dromara.workflow.liteflow.operation; import com.yomahub.liteflow.annotation.LiteflowComponent; import com.yomahub.liteflow.core.NodeComponent; import lombok.RequiredArgsConstructor; -import org.dromara.warm.flow.core.service.TaskService; +import org.dromara.warm.flow.service.TaskService; import org.dromara.workflow.common.ConditionalOnEnable; import org.dromara.workflow.common.enums.TaskStatusEnum; import org.dromara.workflow.domain.context.TaskOperationContext; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/operation/TaskOpLoadComponent.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/operation/TaskOpLoadComponent.java index 226d771b0..8233af140 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/operation/TaskOpLoadComponent.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/operation/TaskOpLoadComponent.java @@ -6,11 +6,11 @@ import com.yomahub.liteflow.core.NodeComponent; import lombok.RequiredArgsConstructor; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.mybatis.core.query.QueryBuilder; -import org.dromara.warm.flow.core.entity.Task; -import org.dromara.warm.flow.core.enums.CooperateType; -import org.dromara.warm.flow.core.service.TaskService; -import org.dromara.warm.flow.orm.entity.FlowNode; -import org.dromara.warm.flow.orm.mapper.FlowNodeMapper; +import org.dromara.warm.flow.entity.FlowTask; +import org.dromara.warm.flow.enums.CooperateType; +import org.dromara.warm.flow.service.TaskService; +import org.dromara.warm.flow.entity.FlowNode; +import org.dromara.warm.flow.mapper.FlowNodeMapper; import org.dromara.workflow.common.ConditionalOnEnable; import org.dromara.workflow.common.enums.TaskOperationEnum; import org.dromara.workflow.domain.context.TaskOperationContext; @@ -31,7 +31,7 @@ public class TaskOpLoadComponent extends NodeComponent { @Override public void process() { TaskOperationContext context = getContextBean(TaskOperationContext.class); - Task task = taskService.getById(context.getTaskOperationBo().getTaskId()); + FlowTask task = taskService.getById(context.getTaskOperationBo().getTaskId()); if (ObjectUtil.isNull(task)) { throw new ServiceException("任务不存在!"); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/operation/TaskOpPrepareComponent.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/operation/TaskOpPrepareComponent.java index 4cfc0d6a2..054fc093c 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/operation/TaskOpPrepareComponent.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/operation/TaskOpPrepareComponent.java @@ -8,7 +8,7 @@ import org.dromara.common.core.utils.ValidatorUtils; import org.dromara.common.core.validate.AddGroup; import org.dromara.common.core.validate.EditGroup; import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.warm.flow.core.dto.FlowParams; +import org.dromara.warm.flow.dto.FlowParams; import org.dromara.workflow.common.ConditionalOnEnable; import org.dromara.workflow.common.enums.TaskOperationEnum; import org.dromara.workflow.domain.bo.TaskOperationBo; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/start/StartExecuteComponent.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/start/StartExecuteComponent.java index eacbcee8b..b4c025c8b 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/start/StartExecuteComponent.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/start/StartExecuteComponent.java @@ -6,12 +6,11 @@ import com.yomahub.liteflow.core.NodeComponent; import lombok.RequiredArgsConstructor; import org.dromara.common.core.enums.BusinessStatusEnum; import org.dromara.common.core.exception.ServiceException; -import org.dromara.warm.flow.core.dto.FlowParams; -import org.dromara.warm.flow.core.entity.Instance; -import org.dromara.warm.flow.core.entity.Task; -import org.dromara.warm.flow.core.service.InsService; -import org.dromara.warm.flow.core.service.TaskService; -import org.dromara.warm.flow.orm.entity.FlowTask; +import org.dromara.warm.flow.dto.FlowParams; +import org.dromara.warm.flow.entity.FlowInstance; +import org.dromara.warm.flow.entity.FlowTask; +import org.dromara.warm.flow.service.InsService; +import org.dromara.warm.flow.service.TaskService; import org.dromara.workflow.api.domain.StartProcessReturnDTO; import org.dromara.workflow.common.ConditionalOnEnable; import org.dromara.workflow.domain.FlowInstanceBizExt; @@ -42,11 +41,11 @@ public class StartExecuteComponent extends NodeComponent { .flowCode(context.getStartProcessBo().getFlowCode()) .variable(context.getVariables()) .flowStatus(BusinessStatusEnum.DRAFT.getStatus()); - Instance instance = insService.start(context.getBusinessId(), flowParams); + FlowInstance instance = insService.start(context.getBusinessId(), flowParams); context.setInstance(instance); saveBizExt(context, instance); - List taskList = taskService.list(new FlowTask().setInstanceId(instance.getId())); + List taskList = taskService.list(new FlowTask().setInstanceId(instance.getId())); if (CollUtil.isEmpty(taskList)) { throw new ServiceException("流程启动失败,未生成任务"); } @@ -57,7 +56,7 @@ public class StartExecuteComponent extends NodeComponent { context.setStartProcessReturn(new StartProcessReturnDTO(instance.getId(), taskList.getFirst().getId())); } - private void saveBizExt(StartProcessContext context, Instance instance) { + private void saveBizExt(StartProcessContext context, FlowInstance instance) { FlowInstanceBizExt bizExt = context.getBizExt(); bizExt.setInstanceId(instance.getId()); bizExt.setBusinessId(instance.getBusinessId()); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/start/StartPrepareInstanceComponent.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/start/StartPrepareInstanceComponent.java index fc3cfa753..e75980164 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/start/StartPrepareInstanceComponent.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/start/StartPrepareInstanceComponent.java @@ -7,8 +7,8 @@ import com.yomahub.liteflow.annotation.LiteflowComponent; import com.yomahub.liteflow.core.NodeComponent; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.json.utils.JsonUtils; -import org.dromara.warm.flow.core.FlowEngine; -import org.dromara.warm.flow.core.entity.Definition; +import org.dromara.warm.flow.FlowEngine; +import org.dromara.warm.flow.entity.FlowDefinition; import org.dromara.workflow.common.ConditionalOnEnable; import org.dromara.workflow.domain.FlowInstanceBizExt; import org.dromara.workflow.domain.context.StartProcessContext; @@ -29,7 +29,7 @@ public class StartPrepareInstanceComponent extends NodeComponent { @Override public void process() { StartProcessContext context = getContextBean(StartProcessContext.class); - Definition definition = FlowEngine.defService().getPublishByFlowCode(context.getStartProcessBo().getFlowCode()); + FlowDefinition definition = FlowEngine.defService().getPublishByFlowCode(context.getStartProcessBo().getFlowCode()); if (ObjectUtil.isNull(definition)) { throw new ServiceException("流程【" + context.getStartProcessBo().getFlowCode() + "】未发布,请先在流程设计器中发布流程定义"); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/start/StartPrepareRequestComponent.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/start/StartPrepareRequestComponent.java index a848c78a4..ae5667ea2 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/start/StartPrepareRequestComponent.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/start/StartPrepareRequestComponent.java @@ -7,8 +7,8 @@ import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.query.QueryBuilder; import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.warm.flow.orm.entity.FlowInstance; -import org.dromara.warm.flow.orm.mapper.FlowInstanceMapper; +import org.dromara.warm.flow.entity.FlowInstance; +import org.dromara.warm.flow.mapper.FlowInstanceMapper; import org.dromara.workflow.common.ConditionalOnEnable; import org.dromara.workflow.domain.context.StartProcessContext; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/start/StartResumeComponent.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/start/StartResumeComponent.java index 71b885042..18650b771 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/start/StartResumeComponent.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/start/StartResumeComponent.java @@ -6,10 +6,9 @@ import com.yomahub.liteflow.core.NodeComponent; import lombok.RequiredArgsConstructor; import org.dromara.common.core.enums.BusinessStatusEnum; import org.dromara.common.core.exception.ServiceException; -import org.dromara.warm.flow.core.entity.Task; -import org.dromara.warm.flow.core.service.InsService; -import org.dromara.warm.flow.core.service.TaskService; -import org.dromara.warm.flow.orm.entity.FlowTask; +import org.dromara.warm.flow.entity.FlowTask; +import org.dromara.warm.flow.service.InsService; +import org.dromara.warm.flow.service.TaskService; import org.dromara.workflow.api.domain.StartProcessReturnDTO; import org.dromara.workflow.common.ConditionalOnEnable; import org.dromara.workflow.domain.FlowInstanceBizExt; @@ -36,7 +35,7 @@ public class StartResumeComponent extends NodeComponent { public void process() { StartProcessContext context = getContextBean(StartProcessContext.class); BusinessStatusEnum.checkStartStatus(context.getExistingInstance().getFlowStatus()); - List taskList = taskService.list(new FlowTask().setInstanceId(context.getExistingInstance().getId())); + List taskList = taskService.list(new FlowTask().setInstanceId(context.getExistingInstance().getId())); if (CollUtil.isEmpty(taskList)) { throw new ServiceException("流程实例缺少任务,请检查流程定义配置"); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwHisTaskMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwHisTaskMapper.java index 5cc2e8c9d..7e1d0c8a3 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwHisTaskMapper.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwHisTaskMapper.java @@ -4,10 +4,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.github.yulichang.base.MPJBaseMapper; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; import org.dromara.common.mybatis.core.query.QueryBuilder; -import org.dromara.warm.flow.core.enums.NodeType; -import org.dromara.warm.flow.orm.entity.FlowDefinition; -import org.dromara.warm.flow.orm.entity.FlowHisTask; -import org.dromara.warm.flow.orm.entity.FlowInstance; +import org.dromara.warm.flow.enums.NodeType; +import org.dromara.warm.flow.entity.FlowDefinition; +import org.dromara.warm.flow.entity.FlowHisTask; +import org.dromara.warm.flow.entity.FlowInstance; import org.dromara.workflow.common.enums.TaskStatusEnum; import org.dromara.workflow.domain.FlowInstanceBizExt; import org.dromara.workflow.domain.bo.FlowTaskBo; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwInstanceMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwInstanceMapper.java index d87a18767..df0a62e6b 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwInstanceMapper.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwInstanceMapper.java @@ -3,7 +3,7 @@ package org.dromara.workflow.mapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.github.yulichang.base.MPJBaseMapper; import com.github.yulichang.wrapper.MPJLambdaWrapper; -import org.dromara.warm.flow.orm.entity.FlowInstance; +import org.dromara.warm.flow.entity.FlowInstance; import org.dromara.workflow.domain.vo.FlowInstanceVo; /** diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwTaskMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwTaskMapper.java index 25bb30293..0e530f0dd 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwTaskMapper.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwTaskMapper.java @@ -5,8 +5,8 @@ import com.github.yulichang.base.MPJBaseMapper; import org.dromara.common.core.enums.BusinessStatusEnum; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; import org.dromara.common.mybatis.core.query.QueryBuilder; -import org.dromara.warm.flow.core.enums.NodeType; -import org.dromara.warm.flow.orm.entity.*; +import org.dromara.warm.flow.enums.NodeType; +import org.dromara.warm.flow.entity.*; import org.dromara.workflow.domain.FlowInstanceBizExt; import org.dromara.workflow.domain.bo.FlowTaskBo; import org.dromara.workflow.domain.vo.FlowTaskVo; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwUserMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwUserMapper.java index f30d2c6b3..d569977bd 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwUserMapper.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwUserMapper.java @@ -2,7 +2,7 @@ package org.dromara.workflow.mapper; import com.github.yulichang.base.MPJBaseMapper; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.warm.flow.orm.entity.FlowUser; +import org.dromara.warm.flow.entity.FlowUser; /** * 任务信息Mapper接口 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java index e86c99cac..44ca1f67c 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java @@ -3,7 +3,7 @@ package org.dromara.workflow.service; import jakarta.servlet.http.HttpServletResponse; import org.dromara.common.core.domain.PageResult; import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.warm.flow.orm.entity.FlowDefinition; +import org.dromara.warm.flow.entity.FlowDefinition; import org.dromara.workflow.domain.vo.FlowDefinitionVo; import org.springframework.web.multipart.MultipartFile; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java index 38b50e08e..be162ca6a 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java @@ -2,7 +2,7 @@ package org.dromara.workflow.service; import org.dromara.common.core.domain.PageResult; import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.warm.flow.orm.entity.FlowInstance; +import org.dromara.warm.flow.entity.FlowInstance; import org.dromara.workflow.domain.bo.FlowCancelBo; import org.dromara.workflow.domain.bo.FlowInstanceBo; import org.dromara.workflow.domain.bo.FlowInvalidBo; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwNodeExtService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwNodeExtService.java index a94a225ac..6eb2b4f9d 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwNodeExtService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwNodeExtService.java @@ -1,4 +1,5 @@ package org.dromara.workflow.service; +import org.dromara.warm.flow.entity.*; import org.dromara.workflow.domain.vo.NodeExtVo; @@ -12,7 +13,7 @@ import java.util.Map; public interface IFlwNodeExtService { /** - * 解析扩展属性 JSON 并构建 Node 扩展属性对象 + * 解析扩展属性 JSON 并构建 FlowNode 扩展属性对象 *

* 根据传入的 JSON 字符串,将扩展属性分为三类: * 1. ButtonPermissionEnum:解析为按钮权限列表,标记每个按钮是否勾选 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java index b45f88817..8fa86bcb1 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java @@ -3,11 +3,9 @@ package org.dromara.workflow.service; import org.dromara.common.core.domain.PageResult; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.system.api.domain.UserDTO; -import org.dromara.warm.flow.core.entity.Node; -import org.dromara.warm.flow.core.entity.Task; -import org.dromara.warm.flow.orm.entity.FlowHisTask; -import org.dromara.warm.flow.orm.entity.FlowNode; -import org.dromara.warm.flow.orm.entity.FlowTask; +import org.dromara.warm.flow.entity.FlowNode; +import org.dromara.warm.flow.entity.FlowTask; +import org.dromara.warm.flow.entity.FlowHisTask; import org.dromara.workflow.api.domain.StartProcessReturnDTO; import org.dromara.workflow.domain.bo.*; import org.dromara.workflow.domain.vo.FlowHisTaskVo; @@ -45,7 +43,7 @@ public interface IFlwTaskService { * @param task 任务信息 * @param flowCopyList 抄送人 */ - void setCopy(Task task, List flowCopyList); + void setCopy(FlowTask task, List flowCopyList); /** * 查询当前用户的待办任务 @@ -116,7 +114,7 @@ public interface IFlwTaskService { * @param nowNodeCode 当前节点 * @return 结果 */ - List getBackTaskNode(Long taskId, String nowNodeCode); + List getBackTaskNode(Long taskId, String nowNodeCode); /** * 终止任务 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java index f1f299179..323c59114 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java @@ -9,8 +9,8 @@ import lombok.RequiredArgsConstructor; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.*; import org.dromara.common.mybatis.core.query.QueryBuilder; -import org.dromara.warm.flow.core.service.DefService; -import org.dromara.warm.flow.orm.entity.FlowDefinition; +import org.dromara.warm.flow.service.DefService; +import org.dromara.warm.flow.entity.FlowDefinition; import org.dromara.warm.flow.ui.service.CategoryService; import org.dromara.workflow.common.ConditionalOnEnable; import org.dromara.workflow.common.constant.FlowConstant; @@ -45,7 +45,6 @@ public class FlwCategoryServiceImpl implements IFlwCategoryService, CategoryServ * @param categoryId 主键 * @return 流程分类 */ - @Override public FlowCategoryVo queryById(Long categoryId) { return categoryMapper.selectVoById(categoryId); } @@ -57,7 +56,6 @@ public class FlwCategoryServiceImpl implements IFlwCategoryService, CategoryServ * @return 流程分类名称 */ @Cacheable(cacheNames = FlowConstant.FLOW_CATEGORY_NAME, key = "#categoryId") - @Override public String selectCategoryNameById(Long categoryId) { if (ObjectUtil.isNull(categoryId)) { return null; @@ -75,7 +73,6 @@ public class FlwCategoryServiceImpl implements IFlwCategoryService, CategoryServ * @param categoryIds 流程分类ID * @return 流程分类名称 */ - @Override public Map selectCategoryNameByIds(Set categoryIds) { if (CollUtil.isEmpty(categoryIds)) { return Collections.emptyMap(); @@ -93,7 +90,6 @@ public class FlwCategoryServiceImpl implements IFlwCategoryService, CategoryServ * @param bo 查询条件 * @return 流程分类列表 */ - @Override public List queryList(FlowCategoryBo bo) { LambdaQueryWrapper lqw = buildQueryWrapper(bo); return categoryMapper.selectVoList(lqw); @@ -105,7 +101,6 @@ public class FlwCategoryServiceImpl implements IFlwCategoryService, CategoryServ * @param category 流程分类信息 * @return 流程分类树信息集合 */ - @Override public List> selectCategoryTreeList(FlowCategoryBo category) { List categoryList = this.queryList(category); if (CollUtil.isEmpty(categoryList)) { @@ -128,10 +123,9 @@ public class FlwCategoryServiceImpl implements IFlwCategoryService, CategoryServ * * @return 分类树结构列表 */ - @Override - public List queryCategory() { + public List queryCategory() { List list = this.queryList(new FlowCategoryBo()); - return StreamUtils.toList(list, category -> new org.dromara.warm.flow.core.dto.Tree() + return StreamUtils.toList(list, category -> new org.dromara.warm.flow.dto.Tree() .setId(Convert.toStr(category.getCategoryId())) .setName(category.getCategoryName()) .setParentId(Convert.toStr(category.getParentId())) @@ -144,7 +138,6 @@ public class FlwCategoryServiceImpl implements IFlwCategoryService, CategoryServ * @param category 流程分类信息 * @return 结果 */ - @Override public boolean checkCategoryNameUnique(FlowCategoryBo category) { boolean exist = categoryMapper.lambda() .eq(FlowCategory::getCategoryName, category.getCategoryName()) @@ -160,7 +153,6 @@ public class FlwCategoryServiceImpl implements IFlwCategoryService, CategoryServ * @param categoryId 流程分类ID * @return 结果 true 存在 false 不存在 */ - @Override public boolean checkCategoryExistDefinition(Long categoryId) { FlowDefinition definition = new FlowDefinition(); definition.setCategory(categoryId.toString()); @@ -173,7 +165,6 @@ public class FlwCategoryServiceImpl implements IFlwCategoryService, CategoryServ * @param categoryId 流程分类ID * @return 结果 */ - @Override public boolean hasChildByCategoryId(Long categoryId) { return categoryMapper.lambda().eq(FlowCategory::getParentId, categoryId).exists(); } @@ -199,7 +190,6 @@ public class FlwCategoryServiceImpl implements IFlwCategoryService, CategoryServ * @param bo 流程分类 * @return 是否新增成功 */ - @Override public int insertByBo(FlowCategoryBo bo) { FlowCategory info = categoryMapper.selectById(bo.getParentId()); if (ObjectUtil.isNull(info)) { @@ -274,7 +264,6 @@ public class FlwCategoryServiceImpl implements IFlwCategoryService, CategoryServ * @return 是否删除成功 */ @CacheEvict(cacheNames = FlowConstant.FLOW_CATEGORY_NAME, key = "#categoryId") - @Override public int deleteWithValidById(Long categoryId) { return categoryMapper.deleteById(categoryId); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwChartExtServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwChartExtServiceImpl.java index 7c9cd1747..1ca29ca84 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwChartExtServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwChartExtServiceImpl.java @@ -14,13 +14,13 @@ import org.dromara.common.core.utils.StringUtils; import org.dromara.system.api.DeptService; import org.dromara.system.api.UserService; import org.dromara.system.api.domain.UserDTO; -import org.dromara.warm.flow.core.dto.DefJson; -import org.dromara.warm.flow.core.dto.NodeJson; -import org.dromara.warm.flow.core.dto.PromptContent; -import org.dromara.warm.flow.core.enums.NodeType; -import org.dromara.warm.flow.core.utils.MapUtil; -import org.dromara.warm.flow.orm.entity.FlowHisTask; -import org.dromara.warm.flow.orm.mapper.FlowHisTaskMapper; +import org.dromara.warm.flow.dto.DefJson; +import org.dromara.warm.flow.dto.NodeJson; +import org.dromara.warm.flow.dto.PromptContent; +import org.dromara.warm.flow.enums.NodeType; +import org.dromara.warm.flow.utils.MapUtil; +import org.dromara.warm.flow.entity.FlowHisTask; +import org.dromara.warm.flow.mapper.FlowHisTaskMapper; import org.dromara.warm.flow.ui.service.ChartExtService; import org.dromara.workflow.common.ConditionalOnEnable; import org.dromara.workflow.common.constant.FlowConstant; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java index 4afee8142..f76d79b62 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java @@ -16,9 +16,9 @@ import org.dromara.common.mail.core.MailBuilder; import org.dromara.system.api.MessageService; import org.dromara.system.api.domain.PushPayloadDTO; import org.dromara.system.api.domain.UserDTO; -import org.dromara.warm.flow.core.FlowEngine; -import org.dromara.warm.flow.core.entity.Node; -import org.dromara.warm.flow.orm.entity.FlowTask; +import org.dromara.warm.flow.FlowEngine; +import org.dromara.warm.flow.entity.FlowNode; +import org.dromara.warm.flow.entity.FlowTask; import org.dromara.workflow.common.ConditionalOnEnable; import org.dromara.workflow.common.enums.MessageTypeEnum; import org.dromara.workflow.service.IFlwCommonService; @@ -185,7 +185,7 @@ public class FlwCommonServiceImpl implements IFlwCommonService { */ @Override public String applyNodeCode(Long definitionId) { - List firstBetweenNode = FlowEngine.nodeService().getFirstBetweenNode(definitionId, new HashMap<>()); + List firstBetweenNode = FlowEngine.nodeService().getFirstBetweenNode(definitionId, new HashMap<>()); if (CollUtil.isEmpty(firstBetweenNode)) { throw new ServiceException("流程定义缺少申请人节点,请检查流程定义配置"); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java index 3f9d167cd..5b0dbde6f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java @@ -17,16 +17,16 @@ import org.dromara.common.core.utils.StringUtils; import org.dromara.common.json.utils.JsonUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.query.QueryBuilder; -import org.dromara.warm.flow.core.dto.DefJson; -import org.dromara.warm.flow.core.enums.NodeType; -import org.dromara.warm.flow.core.enums.PublishStatus; -import org.dromara.warm.flow.core.service.DefService; -import org.dromara.warm.flow.orm.entity.FlowDefinition; -import org.dromara.warm.flow.orm.entity.FlowHisTask; -import org.dromara.warm.flow.orm.entity.FlowNode; -import org.dromara.warm.flow.orm.mapper.FlowDefinitionMapper; -import org.dromara.warm.flow.orm.mapper.FlowHisTaskMapper; -import org.dromara.warm.flow.orm.mapper.FlowNodeMapper; +import org.dromara.warm.flow.dto.DefJson; +import org.dromara.warm.flow.enums.NodeType; +import org.dromara.warm.flow.enums.PublishStatus; +import org.dromara.warm.flow.service.DefService; +import org.dromara.warm.flow.entity.FlowDefinition; +import org.dromara.warm.flow.entity.FlowHisTask; +import org.dromara.warm.flow.entity.FlowNode; +import org.dromara.warm.flow.mapper.FlowDefinitionMapper; +import org.dromara.warm.flow.mapper.FlowHisTaskMapper; +import org.dromara.warm.flow.mapper.FlowNodeMapper; import org.dromara.workflow.common.ConditionalOnEnable; import org.dromara.workflow.domain.vo.FlowDefinitionVo; import org.dromara.workflow.mapper.FlwCategoryMapper; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index 8a6972e70..37305923e 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -1,5 +1,7 @@ package org.dromara.workflow.service.impl; +import org.dromara.warm.flow.json.JsonUtil; + import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; @@ -19,22 +21,20 @@ import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.query.LambdaJoinQueryBuilder; import org.dromara.common.mybatis.core.query.QueryBuilder; import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.warm.flow.core.FlowEngine; -import org.dromara.warm.flow.core.constant.ExceptionCons; -import org.dromara.warm.flow.core.dto.FlowParams; -import org.dromara.warm.flow.core.entity.Definition; -import org.dromara.warm.flow.core.entity.Instance; -import org.dromara.warm.flow.core.entity.Task; -import org.dromara.warm.flow.core.entity.User; -import org.dromara.warm.flow.core.enums.NodeType; -import org.dromara.warm.flow.core.service.DefService; -import org.dromara.warm.flow.core.service.InsService; -import org.dromara.warm.flow.core.service.TaskService; -import org.dromara.warm.flow.orm.entity.FlowHisTask; -import org.dromara.warm.flow.orm.entity.FlowInstance; -import org.dromara.warm.flow.orm.entity.FlowTask; -import org.dromara.warm.flow.orm.mapper.FlowHisTaskMapper; -import org.dromara.warm.flow.orm.mapper.FlowInstanceMapper; +import org.dromara.warm.flow.FlowEngine; +import org.dromara.warm.flow.constant.ExceptionCons; +import org.dromara.warm.flow.dto.FlowParams; +import org.dromara.warm.flow.entity.FlowDefinition; +import org.dromara.warm.flow.entity.FlowInstance; +import org.dromara.warm.flow.entity.FlowTask; +import org.dromara.warm.flow.entity.FlowUser; +import org.dromara.warm.flow.enums.NodeType; +import org.dromara.warm.flow.service.DefService; +import org.dromara.warm.flow.service.InsService; +import org.dromara.warm.flow.service.TaskService; +import org.dromara.warm.flow.entity.FlowHisTask; +import org.dromara.warm.flow.mapper.FlowHisTaskMapper; +import org.dromara.warm.flow.mapper.FlowInstanceMapper; import org.dromara.workflow.common.ConditionalOnEnable; import org.dromara.workflow.common.enums.TaskStatusEnum; import org.dromara.workflow.domain.FlowInstanceBizExt; @@ -119,7 +119,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { throw new ServiceException(ExceptionCons.NOT_FOUNT_INSTANCE); } FlowInstanceVo instanceVo = BeanUtil.toBean(instance, FlowInstanceVo.class); - Definition definition = defService.getById(instanceVo.getDefinitionId()); + FlowDefinition definition = defService.getById(instanceVo.getDefinitionId()); if (ObjectUtil.isNull(definition)) { throw new ServiceException(ExceptionCons.NOT_FOUNT_DEF); } @@ -145,21 +145,21 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { FlowInstance::getNodeType, FlowInstance::getNodeCode, FlowInstance::getNodeName, FlowInstance::getVariable, FlowInstance::getFlowStatus, FlowInstance::getActivityStatus, FlowInstance::getCreateBy, FlowInstance::getExt) - .select("fd", org.dromara.warm.flow.orm.entity.FlowDefinition::getFlowName, - org.dromara.warm.flow.orm.entity.FlowDefinition::getFlowCode, - org.dromara.warm.flow.orm.entity.FlowDefinition::getVersion, - org.dromara.warm.flow.orm.entity.FlowDefinition::getFormCustom, - org.dromara.warm.flow.orm.entity.FlowDefinition::getFormPath, - org.dromara.warm.flow.orm.entity.FlowDefinition::getCategory) + .select("fd", org.dromara.warm.flow.entity.FlowDefinition::getFlowName, + org.dromara.warm.flow.entity.FlowDefinition::getFlowCode, + org.dromara.warm.flow.entity.FlowDefinition::getVersion, + org.dromara.warm.flow.entity.FlowDefinition::getFormCustom, + org.dromara.warm.flow.entity.FlowDefinition::getFormPath, + org.dromara.warm.flow.entity.FlowDefinition::getCategory) .select("biz", FlowInstanceBizExt::getBusinessCode, FlowInstanceBizExt::getBusinessTitle) - .leftJoin(org.dromara.warm.flow.orm.entity.FlowDefinition.class, "fd", org.dromara.warm.flow.orm.entity.FlowDefinition::getId, FlowInstance::getDefinitionId) + .leftJoin(org.dromara.warm.flow.entity.FlowDefinition.class, "fd", org.dromara.warm.flow.entity.FlowDefinition::getId, FlowInstance::getDefinitionId) .leftJoin(FlowInstanceBizExt.class, "biz", FlowInstanceBizExt::getInstanceId, FlowInstance::getId); queryBuilder.likeIfText("fi", FlowInstance::getNodeName, flowInstanceBo.getNodeName()); - queryBuilder.likeIfText("fd", org.dromara.warm.flow.orm.entity.FlowDefinition::getFlowName, flowInstanceBo.getFlowName()); - queryBuilder.likeIfText("fd", org.dromara.warm.flow.orm.entity.FlowDefinition::getFlowCode, flowInstanceBo.getFlowCode()); + queryBuilder.likeIfText("fd", org.dromara.warm.flow.entity.FlowDefinition::getFlowName, flowInstanceBo.getFlowName()); + queryBuilder.likeIfText("fd", org.dromara.warm.flow.entity.FlowDefinition::getFlowCode, flowInstanceBo.getFlowCode()); if (StringUtils.isNotBlank(flowInstanceBo.getCategory())) { List categoryIds = flwCategoryMapper.selectCategoryIdsByParentId(Convert.toLong(flowInstanceBo.getCategory())); - queryBuilder.inIfNotEmpty("fd", org.dromara.warm.flow.orm.entity.FlowDefinition::getCategory, StreamUtils.toList(categoryIds, Convert::toStr)); + queryBuilder.inIfNotEmpty("fd", org.dromara.warm.flow.entity.FlowDefinition::getCategory, StreamUtils.toList(categoryIds, Convert::toStr)); } queryBuilder.eqIfText("fi", FlowInstance::getBusinessId, flowInstanceBo.getBusinessId()); queryBuilder.inIfNotEmpty("fi", FlowInstance::getCreateBy, flowInstanceBo.getCreateByIds()); @@ -254,11 +254,11 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { @Override @Transactional(rollbackFor = Exception.class) public boolean cancelProcessApply(FlowCancelBo bo) { - Instance instance = selectInstByBusinessId(bo.businessId()); + FlowInstance instance = selectInstByBusinessId(bo.businessId()); if (instance == null) { throw new ServiceException(ExceptionCons.NOT_FOUNT_INSTANCE); } - Definition definition = defService.getById(instance.getDefinitionId()); + FlowDefinition definition = defService.getById(instance.getDefinitionId()); if (definition == null) { throw new ServiceException(ExceptionCons.NOT_FOUNT_DEF); } @@ -312,18 +312,18 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { if (CollUtil.isNotEmpty(runningTasks)) { runningTaskVos = BeanUtil.copyToList(runningTasks, FlowHisTaskVo.class); - List associatedUsers = FlowEngine.userService() + List associatedUsers = FlowEngine.userService() .getByAssociateds(StreamUtils.toList(runningTasks, FlowTask::getId)); - Map> taskUserMap = StreamUtils.groupByKey(associatedUsers, User::getAssociated); + Map> taskUserMap = StreamUtils.groupByKey(associatedUsers, FlowUser::getAssociated); for (FlowHisTaskVo vo : runningTaskVos) { vo.setFlowStatus(TaskStatusEnum.WAITING.getStatus()); vo.setUpdateTime(null); vo.setRunDuration(null); - List users = taskUserMap.get(vo.getId()); + List users = taskUserMap.get(vo.getId()); if (CollUtil.isNotEmpty(users)) { - vo.setApprover(StreamUtils.join(users, User::getProcessedBy)); + vo.setApprover(StreamUtils.join(users, FlowUser::getProcessedBy)); } } } @@ -400,7 +400,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { return false; } variableMap.put(bo.key(), bo.value()); - flowInstance.setVariable(FlowEngine.jsonConvert.objToStr(variableMap)); + flowInstance.setVariable(JsonUtil.objToStr(variableMap)); return flowInstanceMapper.updateById(flowInstance) > 0; } @@ -412,7 +412,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { */ @Override public void setVariable(Long instanceId, Map variable) { - Instance instance = insService.getById(instanceId); + FlowInstance instance = insService.getById(instanceId); if (instance != null) { taskService.mergeVariable(instance, variable); insService.updateById(instance); @@ -427,7 +427,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { */ @Override public FlowInstance selectByTaskId(Long taskId) { - Task task = taskService.getById(taskId); + FlowTask task = taskService.getById(taskId); if (task == null) { FlowHisTask flowHisTask = flwTaskService.selectHisTaskById(taskId); if (flowHisTask != null) { @@ -448,7 +448,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { @Override @Transactional(rollbackFor = Exception.class) public boolean processInvalid(FlowInvalidBo bo) { - Instance instance = insService.getById(bo.id()); + FlowInstance instance = insService.getById(bo.id()); if (instance != null) { BusinessStatusEnum.checkInvalidStatus(instance.getFlowStatus()); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java index 6a3b312bf..84bef8aea 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java @@ -1,4 +1,5 @@ package org.dromara.workflow.service.impl; +import org.dromara.warm.flow.entity.*; import cn.hutool.core.convert.Convert; import cn.hutool.core.lang.Dict; @@ -9,9 +10,9 @@ import org.dromara.common.core.domain.dto.DictTypeDTO; import org.dromara.common.core.service.DictService; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.json.utils.JsonUtils; -import org.dromara.warm.flow.core.FlowEngine; -import org.dromara.warm.flow.core.utils.CollUtil; -import org.dromara.warm.flow.core.utils.ExpressionUtil; +import org.dromara.warm.flow.FlowEngine; +import cn.hutool.core.collection.CollUtil; +import org.dromara.warm.flow.utils.ExpressionUtil; import org.dromara.warm.flow.ui.service.NodeExtService; import org.dromara.warm.flow.ui.vo.NodeExt; import org.dromara.workflow.common.ConditionalOnEnable; @@ -79,7 +80,6 @@ public class FlwNodeExtServiceImpl implements NodeExtService, IFlwNodeExtService * * @return 节点扩展属性列表 */ - @Override public List getNodeExt() { List nodeExtList = new ArrayList<>(); // 构建基础设置页面 @@ -190,7 +190,7 @@ public class FlwNodeExtServiceImpl implements NodeExtService, IFlwNodeExtService } /** - * 解析扩展属性 JSON 并构建 Node 扩展属性对象 + * 解析扩展属性 JSON 并构建 FlowNode 扩展属性对象 *

* 根据传入的 JSON 字符串,将扩展属性分为三类: * 1. ButtonPermissionEnum:解析为按钮权限列表,标记每个按钮是否勾选 @@ -208,7 +208,6 @@ public class FlwNodeExtServiceImpl implements NodeExtService, IFlwNodeExtService * @param variable 流程变量 * @return NodeExtVo 对象,封装按钮权限列表、抄送对象集合和自定义参数 Map */ - @Override public NodeExtVo parseNodeExt(String ext, Map variable) { NodeExtVo nodeExtVo = new NodeExtVo(); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java index 8b6d9612d..2e8d88e4d 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java @@ -55,7 +55,6 @@ public class FlwTaskAssigneeServiceImpl implements IFlwTaskAssigneeService, Hand * * @return tabs页签 */ - @Override public List getHandlerType() { return TaskAssigneeEnum.getAssigneeTypeList(); } @@ -66,7 +65,6 @@ public class FlwTaskAssigneeServiceImpl implements IFlwTaskAssigneeService, Hand * @param query 查询条件 * @return HandlerSelectVo */ - @Override public HandlerSelectVo getHandlerSelect(HandlerQuery query) { // 获取任务办理类型 TaskAssigneeEnum type = TaskAssigneeEnum.fromDesc(query.getHandlerType()); @@ -86,7 +84,6 @@ public class FlwTaskAssigneeServiceImpl implements IFlwTaskAssigneeService, Hand * @param storageIds 入库主键集合 * @return 结果 */ - @Override public List handlerFeedback(List storageIds) { if (CollUtil.isEmpty(storageIds)) { return Collections.emptyList(); @@ -200,7 +197,6 @@ public class FlwTaskAssigneeServiceImpl implements IFlwTaskAssigneeService, Hand * @param storageIds 多个存储标识符字符串(逗号分隔) * @return 合并后的用户列表,去重后返回,非法格式的标识将被跳过 */ - @Override public List fetchUsersByStorageIds(String storageIds) { if (StringUtils.isEmpty(storageIds)) { return List.of(); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index ea378a981..f2a75ef31 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -1,4 +1,7 @@ package org.dromara.workflow.service.impl; +import org.dromara.warm.flow.entity.FlowDefinition; +import org.dromara.warm.flow.entity.FlowInstance; +import org.dromara.warm.flow.entity.FlowSkip; import cn.dev33.satoken.exception.NotPermissionException; import cn.dev33.satoken.stp.StpUtil; @@ -22,25 +25,24 @@ import org.dromara.common.mybatis.utils.IdGeneratorUtil; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.system.api.UserService; import org.dromara.system.api.domain.UserDTO; -import org.dromara.warm.flow.core.FlowEngine; -import org.dromara.warm.flow.core.constant.ExceptionCons; -import org.dromara.warm.flow.core.dto.FlowCombine; -import org.dromara.warm.flow.core.dto.FlowParams; -import org.dromara.warm.flow.core.entity.*; -import org.dromara.warm.flow.core.enums.NodeType; -import org.dromara.warm.flow.core.enums.SkipType; -import org.dromara.warm.flow.core.enums.UserType; -import org.dromara.warm.flow.core.exception.FlowException; -import org.dromara.warm.flow.core.service.*; -import org.dromara.warm.flow.core.utils.ExpressionUtil; -import org.dromara.warm.flow.core.utils.MapUtil; -import org.dromara.warm.flow.orm.entity.FlowHisTask; -import org.dromara.warm.flow.orm.entity.FlowNode; -import org.dromara.warm.flow.orm.entity.FlowTask; -import org.dromara.warm.flow.orm.entity.FlowUser; -import org.dromara.warm.flow.orm.mapper.FlowHisTaskMapper; -import org.dromara.warm.flow.orm.mapper.FlowNodeMapper; -import org.dromara.warm.flow.orm.mapper.FlowTaskMapper; +import org.dromara.warm.flow.FlowEngine; +import org.dromara.warm.flow.constant.ExceptionCons; +import org.dromara.warm.flow.dto.FlowCombine; +import org.dromara.warm.flow.dto.FlowParams; +import org.dromara.warm.flow.enums.NodeType; +import org.dromara.warm.flow.enums.SkipType; +import org.dromara.warm.flow.enums.UserType; +import org.dromara.warm.flow.exception.FlowException; +import org.dromara.warm.flow.service.*; +import org.dromara.warm.flow.utils.ExpressionUtil; +import org.dromara.warm.flow.utils.MapUtil; +import org.dromara.warm.flow.entity.FlowHisTask; +import org.dromara.warm.flow.entity.FlowNode; +import org.dromara.warm.flow.entity.FlowTask; +import org.dromara.warm.flow.entity.FlowUser; +import org.dromara.warm.flow.mapper.FlowHisTaskMapper; +import org.dromara.warm.flow.mapper.FlowNodeMapper; +import org.dromara.warm.flow.mapper.FlowTaskMapper; import org.dromara.workflow.api.domain.StartProcessReturnDTO; import org.dromara.workflow.common.ConditionalOnEnable; import org.dromara.workflow.common.enums.TaskAssigneeType; @@ -140,8 +142,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { * @param task 任务信息 * @param flowCopyList 抄送人 */ - @Override - public void setCopy(Task task, List flowCopyList) { + public void setCopy(FlowTask task, List flowCopyList) { if (CollUtil.isEmpty(flowCopyList)) { return; } @@ -166,11 +167,11 @@ public class FlwTaskServiceImpl implements IFlwTaskService { .skipType(SkipType.NONE.getKey()) .hisStatus(TaskStatusEnum.COPY.getStatus()) .message("【抄送给】" + StreamUtils.join(flowCopyList, FlowCopyBo::getNickName)); - HisTask hisTask = hisTaskService.setSkipHisTask(task, flowNode, flowParams); + FlowHisTask hisTask = hisTaskService.setSkipHisTask(task, flowNode, flowParams); hisTask.setCreateTime(updateTime); hisTask.setUpdateTime(updateTime); hisTaskService.save(hisTask); - List userList = StreamUtils.toList(flowCopyList, x -> + List userList = StreamUtils.toList(flowCopyList, x -> new FlowUser() .setType(TaskAssigneeType.COPY.getCode()) .setProcessedBy(Convert.toStr(x.getUserId())) @@ -237,12 +238,12 @@ public class FlwTaskServiceImpl implements IFlwTaskService { if (CollUtil.isEmpty(taskList)) { return; } - List associatedUsers = FlowEngine.userService().getByAssociateds(StreamUtils.toList(taskList, FlowTaskVo::getId)); - Map> taskUserMap = StreamUtils.groupByKey(associatedUsers, User::getAssociated); + List associatedUsers = FlowEngine.userService().getByAssociateds(StreamUtils.toList(taskList, FlowTaskVo::getId)); + Map> taskUserMap = StreamUtils.groupByKey(associatedUsers, FlowUser::getAssociated); // 组装用户数据回任务列表 for (FlowTaskVo task : taskList) { - List users = taskUserMap.get(task.getId()); - task.setAssigneeIds(StreamUtils.join(users, User::getProcessedBy)); + List users = taskUserMap.get(task.getId()); + task.setAssigneeIds(StreamUtils.join(users, FlowUser::getProcessedBy)); } } @@ -303,7 +304,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { if (ObjectUtil.isNull(task)) { throw new ServiceException("任务不存在!"); } - Instance inst = insService.getById(task.getInstanceId()); + FlowInstance inst = insService.getById(task.getInstanceId()); if (ObjectUtil.isNull(inst)) { throw new ServiceException("流程实例不存在"); } @@ -334,35 +335,34 @@ public class FlwTaskServiceImpl implements IFlwTaskService { * @param nowNodeCode 当前节点 * @return 当前任务允许驳回的节点列表 */ - @Override - public List getBackTaskNode(Long taskId, String nowNodeCode) { + public List getBackTaskNode(Long taskId, String nowNodeCode) { FlowTask task = flowTaskMapper.selectById(taskId); if (ObjectUtil.isNull(task)) { throw new ServiceException("任务不存在!"); } - List nodeCodes = nodeService.getByNodeCodes(Collections.singletonList(nowNodeCode), task.getDefinitionId()); + List nodeCodes = nodeService.getByNodeCodes(Collections.singletonList(nowNodeCode), task.getDefinitionId()); if (!CollUtil.isNotEmpty(nodeCodes)) { return nodeCodes; } - List userList = FlowEngine.userService() + List userList = FlowEngine.userService() .getByAssociateds(Collections.singletonList(task.getId()), UserType.DEPUTE.getKey()); if (CollUtil.isNotEmpty(userList)) { return nodeCodes; } //判断是否配置了固定驳回节点 - Node node = nodeCodes.getFirst(); + FlowNode node = nodeCodes.getFirst(); if (StringUtils.isNotBlank(node.getAnyNodeSkip())) { return nodeService.getByNodeCodes(Collections.singletonList(node.getAnyNodeSkip()), task.getDefinitionId()); } //获取可驳回的前置节点 Long definitionId = task.getDefinitionId(); FlowCombine flowCombine = defService.getFlowCombineNoDef(definitionId); - Map nodeMap = getPreviousNodeMap(nowNodeCode, flowCombine); - List hisTaskList = hisTaskService.getByInsId(task.getInstanceId()); + Map nodeMap = getPreviousNodeMap(nowNodeCode, flowCombine); + List hisTaskList = hisTaskService.getByInsId(task.getInstanceId()); Set reachableNodeCodes = new HashSet<>(); if (CollUtil.isNotEmpty(hisTaskList)) { - Instance instance = insService.getById(task.getInstanceId()); + FlowInstance instance = insService.getById(task.getInstanceId()); if (ObjectUtil.isNull(instance)) { throw new ServiceException("流程实例不存在"); } @@ -373,9 +373,9 @@ public class FlwTaskServiceImpl implements IFlwTaskService { } Set added = new HashSet<>(); - List backNodeList = new ArrayList<>(); - for (HisTask hisTask : hisTaskList) { - Node nodeValue = nodeMap.get(hisTask.getNodeCode()); + List backNodeList = new ArrayList<>(); + for (FlowHisTask hisTask : hisTaskList) { + FlowNode nodeValue = nodeMap.get(hisTask.getNodeCode()); if (nodeValue != null && NodeType.BETWEEN.getKey().equals(nodeValue.getNodeType()) && (CollUtil.isEmpty(reachableNodeCodes) || reachableNodeCodes.contains(nodeValue.getNodeCode())) @@ -393,33 +393,33 @@ public class FlwTaskServiceImpl implements IFlwTaskService { return StreamUtils.filter(nodeMap.values(), e -> NodeType.BETWEEN.getKey().equals(e.getNodeType())); } - private Map getPreviousNodeMap(String nodeCode, FlowCombine flowCombine) { + private Map getPreviousNodeMap(String nodeCode, FlowCombine flowCombine) { if (ObjectUtil.isNull(flowCombine) || CollUtil.isEmpty(flowCombine.getAllNodes()) || CollUtil.isEmpty(flowCombine.getAllSkips())) { return Collections.emptyMap(); } - Map allNodeMap = StreamUtils.toIdentityMap(flowCombine.getAllNodes(), Node::getNodeCode); - Map> previousSkipMap = new HashMap<>(); - for (Skip skip : flowCombine.getAllSkips()) { + Map allNodeMap = StreamUtils.toIdentityMap(flowCombine.getAllNodes(), FlowNode::getNodeCode); + Map> previousSkipMap = new HashMap<>(); + for (FlowSkip skip : flowCombine.getAllSkips()) { previousSkipMap.computeIfAbsent(skip.getNextNodeCode(), k -> new ArrayList<>()).add(skip); } - Map previousNodeMap = new LinkedHashMap<>(); + Map previousNodeMap = new LinkedHashMap<>(); Set visitedNodeCodes = new HashSet<>(); Deque nodeQueue = new ArrayDeque<>(); visitedNodeCodes.add(nodeCode); nodeQueue.add(nodeCode); while (CollUtil.isNotEmpty(nodeQueue)) { String currentNodeCode = nodeQueue.poll(); - List previousSkips = previousSkipMap.get(currentNodeCode); + List previousSkips = previousSkipMap.get(currentNodeCode); if (CollUtil.isEmpty(previousSkips)) { continue; } - for (Skip previousSkip : previousSkips) { + for (FlowSkip previousSkip : previousSkips) { String previousNodeCode = previousSkip.getNowNodeCode(); if (!visitedNodeCodes.add(previousNodeCode)) { continue; } - Node previousNode = allNodeMap.get(previousNodeCode); + FlowNode previousNode = allNodeMap.get(previousNodeCode); if (ObjectUtil.isNull(previousNode)) { continue; } @@ -430,24 +430,24 @@ public class FlwTaskServiceImpl implements IFlwTaskService { return previousNodeMap; } - private void collectReachableNodeCodes(Set nodeCodes, Instance instance, FlowCombine flowCombine) { + private void collectReachableNodeCodes(Set nodeCodes, FlowInstance instance, FlowCombine flowCombine) { if (ObjectUtil.isNull(flowCombine) || CollUtil.isEmpty(flowCombine.getAllNodes())) { return; } - Deque nodeQueue = new ArrayDeque<>(); + Deque nodeQueue = new ArrayDeque<>(); flowCombine.getAllNodes().stream() .filter(e -> NodeType.START.getKey().equals(e.getNodeType())) .findFirst() .ifPresent(nodeQueue::add); while (CollUtil.isNotEmpty(nodeQueue)) { - Node currentNode = nodeQueue.poll(); + FlowNode currentNode = nodeQueue.poll(); if (ObjectUtil.isNull(currentNode) || !nodeCodes.add(currentNode.getNodeCode())) { continue; } try { - List nextNodes = nodeService.getNextNodeList(currentNode, null, SkipType.PASS.getKey(), + List nextNodes = nodeService.getNextNodeList(currentNode, null, SkipType.PASS.getKey(), instance.getVariableMap(), null, flowCombine); if (CollUtil.isNotEmpty(nextNodes)) { nodeQueue.addAll(nextNodes); @@ -471,11 +471,11 @@ public class FlwTaskServiceImpl implements IFlwTaskService { @Transactional(rollbackFor = Exception.class) public boolean terminationTask(FlowTerminationBo bo) { Long taskId = bo.taskId(); - Task task = taskService.getById(taskId); + FlowTask task = taskService.getById(taskId); if (task == null) { throw new ServiceException("任务不存在!"); } - Instance instance = insService.getById(task.getInstanceId()); + FlowInstance instance = insService.getById(task.getInstanceId()); if (ObjectUtil.isNotNull(instance)) { BusinessStatusEnum.checkInvalidStatus(instance.getFlowStatus()); } @@ -508,17 +508,17 @@ public class FlwTaskServiceImpl implements IFlwTaskService { */ @Override public FlowTaskVo selectById(Long taskId) { - Task task = taskService.getById(taskId); + FlowTask task = taskService.getById(taskId); if (ObjectUtil.isNull(task)) { return null; } checkTaskReadAccess(task); FlowTaskVo flowTaskVo = BeanUtil.toBean(task, FlowTaskVo.class); - Instance instance = insService.getById(task.getInstanceId()); + FlowInstance instance = insService.getById(task.getInstanceId()); if (ObjectUtil.isNull(instance)) { throw new ServiceException("流程实例不存在"); } - Definition definition = defService.getById(task.getDefinitionId()); + FlowDefinition definition = defService.getById(task.getDefinitionId()); if (ObjectUtil.isNull(definition)) { throw new ServiceException("流程定义不存在"); } @@ -564,21 +564,21 @@ public class FlwTaskServiceImpl implements IFlwTaskService { public List getNextNodeList(FlowNextNodeBo bo) { Long taskId = bo.getTaskId(); Map variables = bo.getVariables(); - Task task = taskService.getById(taskId); + FlowTask task = taskService.getById(taskId); if (ObjectUtil.isNull(task)) { throw new ServiceException("任务不存在!"); } - Instance instance = insService.getById(task.getInstanceId()); + FlowInstance instance = insService.getById(task.getInstanceId()); if (ObjectUtil.isNull(instance)) { throw new ServiceException("流程实例不存在"); } - Definition definition = defService.getById(task.getDefinitionId()); + FlowDefinition definition = defService.getById(task.getDefinitionId()); if (ObjectUtil.isNull(definition)) { throw new ServiceException("流程定义不存在"); } Map mergeVariable = MapUtil.mergeAll(instance.getVariableMap(), variables); // 获取下一节点列表 - List nextNodeList = nodeService.getNextNodeList(task.getDefinitionId(), task.getNodeCode(), null, SkipType.PASS.getKey(), mergeVariable); + List nextNodeList = nodeService.getNextNodeList(task.getDefinitionId(), task.getNodeCode(), null, SkipType.PASS.getKey(), mergeVariable); if (CollUtil.isEmpty(nextNodeList)) { return new ArrayList<>(); } @@ -587,7 +587,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { nextFlowNodes = StreamUtils.filter(nextFlowNodes, node -> NodeType.BETWEEN.getKey().equals(node.getNodeType())); if (CollUtil.isNotEmpty(nextNodeList)) { //构建以下节点数据 - List buildNextTaskList = StreamUtils.toList(nextNodeList, node -> taskService.addTask(node, instance, definition, FlowParams.build())); + List buildNextTaskList = StreamUtils.toList(nextNodeList, node -> taskService.addTask(node, instance, definition, FlowParams.build())); //办理人变量替换 ExpressionUtil.evalVariable(buildNextTaskList, FlowParams.build().variable(mergeVariable)); for (FlowNode flowNode : nextFlowNodes) { @@ -688,7 +688,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { // 批量删除现有任务的办理人记录 if (CollUtil.isNotEmpty(flowTasks)) { FlowEngine.userService().deleteByTaskIds(StreamUtils.toList(flowTasks, FlowTask::getId)); - List userList = StreamUtils.toList(flowTasks, flowTask -> + List userList = StreamUtils.toList(flowTasks, flowTask -> new FlowUser() .setType(TaskAssigneeType.APPROVER.getCode()) .setProcessedBy(userId) @@ -715,7 +715,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { if (ObjectUtil.isNull(taskId)) { continue; } - Task task = taskService.getById(taskId); + FlowTask task = taskService.getById(taskId); if (ObjectUtil.isNotNull(task)) { checkTaskReadAccess(task); validTaskIds.add(taskId); @@ -725,7 +725,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { return Collections.emptyList(); } // 获取与当前任务关联的用户列表 - List userList = FlowEngine.userService().getByAssociateds(validTaskIds); + List userList = FlowEngine.userService().getByAssociateds(validTaskIds); if (CollUtil.isEmpty(userList)) { return Collections.emptyList(); } @@ -741,14 +741,14 @@ public class FlwTaskServiceImpl implements IFlwTaskService { * * @param task 当前任务 */ - private void checkTaskReadAccess(Task task) { + private void checkTaskReadAccess(FlowTask task) { if (LoginHelper.isSuperAdmin() || StpUtil.hasPermission("workflow:task:list") || StpUtil.hasPermission("workflow:task:edit")) { return; } String userId = LoginHelper.getUserIdStr(); - List associatedUsers = FlowEngine.userService().getByAssociateds(List.of(task.getId())); + List associatedUsers = FlowEngine.userService().getByAssociateds(List.of(task.getId())); boolean taskAssignee = CollUtil.isNotEmpty(associatedUsers) && associatedUsers.stream() .anyMatch(user -> Objects.equals(userId, user.getProcessedBy()) @@ -756,7 +756,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { if (taskAssignee) { return; } - Instance instance = insService.getById(task.getInstanceId()); + FlowInstance instance = insService.getById(task.getInstanceId()); if (ObjectUtil.isNotNull(instance) && Objects.equals(instance.getCreateBy(), userId)) { return; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java index 3955d163a..f35781bf4 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java @@ -4,7 +4,7 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; import lombok.RequiredArgsConstructor; import org.dromara.common.core.utils.StringUtils; -import org.dromara.warm.flow.orm.entity.FlowInstance; +import org.dromara.warm.flow.entity.FlowInstance; import org.dromara.workflow.api.WorkflowService; import org.dromara.workflow.api.domain.CompleteTaskDTO; import org.dromara.workflow.api.domain.StartProcessDTO; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/warm-flow-ui/css/index-DlKfNZiv.css b/ruoyi-modules/ruoyi-workflow/src/main/resources/warm-flow-ui/css/index-DlKfNZiv.css new file mode 100644 index 000000000..9bba27df3 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/warm-flow-ui/css/index-DlKfNZiv.css @@ -0,0 +1 @@ +:root{--el-color-white:#ffffff;--el-color-black:#000000;--el-color-primary-rgb:64,158,255;--el-color-success-rgb:103,194,58;--el-color-warning-rgb:230,162,60;--el-color-danger-rgb:245,108,108;--el-color-error-rgb:245,108,108;--el-color-info-rgb:144,147,153;--el-font-size-extra-large:20px;--el-font-size-large:18px;--el-font-size-medium:16px;--el-font-size-base:14px;--el-font-size-small:13px;--el-font-size-extra-small:12px;--el-font-family:"Helvetica Neue",Helvetica,"PingFang SC","Hiragino Sans GB","Microsoft YaHei","微软雅黑",Arial,sans-serif;--el-font-weight-primary:500;--el-font-line-height-primary:24px;--el-index-normal:1;--el-index-top:1000;--el-index-popper:2000;--el-border-radius-base:4px;--el-border-radius-small:2px;--el-border-radius-round:20px;--el-border-radius-circle:100%;--el-transition-duration:.3s;--el-transition-duration-fast:.2s;--el-transition-function-ease-in-out-bezier:cubic-bezier(.645, .045, .355, 1);--el-transition-function-fast-bezier:cubic-bezier(.23, 1, .32, 1);--el-transition-all:all var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier);--el-transition-fade:opacity var(--el-transition-duration) var(--el-transition-function-fast-bezier);--el-transition-md-fade:transform var(--el-transition-duration) var(--el-transition-function-fast-bezier),opacity var(--el-transition-duration) var(--el-transition-function-fast-bezier);--el-transition-fade-linear:opacity var(--el-transition-duration-fast) linear;--el-transition-border:border-color var(--el-transition-duration-fast) var(--el-transition-function-ease-in-out-bezier);--el-transition-box-shadow:box-shadow var(--el-transition-duration-fast) var(--el-transition-function-ease-in-out-bezier);--el-transition-color:color var(--el-transition-duration-fast) var(--el-transition-function-ease-in-out-bezier);--el-component-size-large:40px;--el-component-size:32px;--el-component-size-small:24px}:root{color-scheme:light;--el-color-white:#ffffff;--el-color-black:#000000;--el-color-primary:#409eff;--el-color-primary-light-3:#79bbff;--el-color-primary-light-5:#a0cfff;--el-color-primary-light-7:#c6e2ff;--el-color-primary-light-8:#d9ecff;--el-color-primary-light-9:#ecf5ff;--el-color-primary-dark-2:#337ecc;--el-color-success:#67c23a;--el-color-success-light-3:#95d475;--el-color-success-light-5:#b3e19d;--el-color-success-light-7:#d1edc4;--el-color-success-light-8:#e1f3d8;--el-color-success-light-9:#f0f9eb;--el-color-success-dark-2:#529b2e;--el-color-warning:#e6a23c;--el-color-warning-light-3:#eebe77;--el-color-warning-light-5:#f3d19e;--el-color-warning-light-7:#f8e3c5;--el-color-warning-light-8:#faecd8;--el-color-warning-light-9:#fdf6ec;--el-color-warning-dark-2:#b88230;--el-color-danger:#f56c6c;--el-color-danger-light-3:#f89898;--el-color-danger-light-5:#fab6b6;--el-color-danger-light-7:#fcd3d3;--el-color-danger-light-8:#fde2e2;--el-color-danger-light-9:#fef0f0;--el-color-danger-dark-2:#c45656;--el-color-error:#f56c6c;--el-color-error-light-3:#f89898;--el-color-error-light-5:#fab6b6;--el-color-error-light-7:#fcd3d3;--el-color-error-light-8:#fde2e2;--el-color-error-light-9:#fef0f0;--el-color-error-dark-2:#c45656;--el-color-info:#909399;--el-color-info-light-3:#b1b3b8;--el-color-info-light-5:#c8c9cc;--el-color-info-light-7:#dedfe0;--el-color-info-light-8:#e9e9eb;--el-color-info-light-9:#f4f4f5;--el-color-info-dark-2:#73767a;--el-bg-color:#ffffff;--el-bg-color-page:#f2f3f5;--el-bg-color-overlay:#ffffff;--el-text-color-primary:#303133;--el-text-color-regular:#606266;--el-text-color-secondary:#909399;--el-text-color-placeholder:#a8abb2;--el-text-color-disabled:#c0c4cc;--el-border-color:#dcdfe6;--el-border-color-light:#e4e7ed;--el-border-color-lighter:#ebeef5;--el-border-color-extra-light:#f2f6fc;--el-border-color-dark:#d4d7de;--el-border-color-darker:#cdd0d6;--el-fill-color:#f0f2f5;--el-fill-color-light:#f5f7fa;--el-fill-color-lighter:#fafafa;--el-fill-color-extra-light:#fafcff;--el-fill-color-dark:#ebedf0;--el-fill-color-darker:#e6e8eb;--el-fill-color-blank:#ffffff;--el-box-shadow:0px 12px 32px 4px rgba(0, 0, 0, .04),0px 8px 20px rgba(0, 0, 0, .08);--el-box-shadow-light:0px 0px 12px rgba(0, 0, 0, .12);--el-box-shadow-lighter:0px 0px 6px rgba(0, 0, 0, .12);--el-box-shadow-dark:0px 16px 48px 16px rgba(0, 0, 0, .08),0px 12px 32px rgba(0, 0, 0, .12),0px 8px 16px -8px rgba(0, 0, 0, .16);--el-disabled-bg-color:var(--el-fill-color-light);--el-disabled-text-color:var(--el-text-color-placeholder);--el-disabled-border-color:var(--el-border-color-light);--el-overlay-color:rgba(0, 0, 0, .8);--el-overlay-color-light:rgba(0, 0, 0, .7);--el-overlay-color-lighter:rgba(0, 0, 0, .5);--el-mask-color:rgba(255, 255, 255, .9);--el-mask-color-extra-light:rgba(255, 255, 255, .3);--el-border-width:1px;--el-border-style:solid;--el-border-color-hover:var(--el-text-color-disabled);--el-border:var(--el-border-width) var(--el-border-style) var(--el-border-color);--el-svg-monochrome-grey:var(--el-border-color)}.fade-in-linear-enter-active,.fade-in-linear-leave-active{transition:var(--el-transition-fade-linear)}.fade-in-linear-enter-from,.fade-in-linear-leave-to{opacity:0}.el-fade-in-linear-enter-active,.el-fade-in-linear-leave-active{transition:var(--el-transition-fade-linear)}.el-fade-in-linear-enter-from,.el-fade-in-linear-leave-to{opacity:0}.el-fade-in-enter-active,.el-fade-in-leave-active{transition:all var(--el-transition-duration) cubic-bezier(.55,0,.1,1)}.el-fade-in-enter-from,.el-fade-in-leave-active{opacity:0}.el-zoom-in-center-enter-active,.el-zoom-in-center-leave-active{transition:all var(--el-transition-duration) cubic-bezier(.55,0,.1,1)}.el-zoom-in-center-enter-from,.el-zoom-in-center-leave-active{opacity:0;transform:scaleX(0)}.el-zoom-in-top-enter-active,.el-zoom-in-top-leave-active{opacity:1;transform:scaleY(1);transition:var(--el-transition-md-fade);transform-origin:center top}.el-zoom-in-top-enter-active[data-popper-placement^=top],.el-zoom-in-top-leave-active[data-popper-placement^=top]{transform-origin:center bottom}.el-zoom-in-top-enter-from,.el-zoom-in-top-leave-active{opacity:0;transform:scaleY(0)}.el-zoom-in-bottom-enter-active,.el-zoom-in-bottom-leave-active{opacity:1;transform:scaleY(1);transition:var(--el-transition-md-fade);transform-origin:center bottom}.el-zoom-in-bottom-enter-from,.el-zoom-in-bottom-leave-active{opacity:0;transform:scaleY(0)}.el-zoom-in-left-enter-active,.el-zoom-in-left-leave-active{opacity:1;transform:scale(1);transition:var(--el-transition-md-fade);transform-origin:top left}.el-zoom-in-left-enter-from,.el-zoom-in-left-leave-active{opacity:0;transform:scale(.45)}.collapse-transition{transition:var(--el-transition-duration) height ease-in-out,var(--el-transition-duration) padding-top ease-in-out,var(--el-transition-duration) padding-bottom ease-in-out}.el-collapse-transition-enter-active,.el-collapse-transition-leave-active{transition:var(--el-transition-duration) max-height ease-in-out,var(--el-transition-duration) padding-top ease-in-out,var(--el-transition-duration) padding-bottom ease-in-out}.horizontal-collapse-transition{transition:var(--el-transition-duration) width ease-in-out,var(--el-transition-duration) padding-left ease-in-out,var(--el-transition-duration) padding-right ease-in-out}.el-list-enter-active,.el-list-leave-active{transition:all 1s}.el-list-enter-from,.el-list-leave-to{opacity:0;transform:translateY(-30px)}.el-list-leave-active{position:absolute!important}.el-opacity-transition{transition:opacity var(--el-transition-duration) cubic-bezier(.55,0,.1,1)}.el-icon-loading{-webkit-animation:rotating 2s linear infinite;animation:rotating 2s linear infinite}.el-icon--right{margin-left:5px}.el-icon--left{margin-right:5px}@-webkit-keyframes rotating{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes rotating{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.el-icon{--color:inherit;height:1em;width:1em;line-height:1em;display:inline-flex;justify-content:center;align-items:center;position:relative;fill:currentColor;color:var(--color);font-size:inherit}.el-icon.is-loading{-webkit-animation:rotating 2s linear infinite;animation:rotating 2s linear infinite}.el-icon svg{height:1em;width:1em}.el-affix--fixed{position:fixed}.el-alert{--el-alert-padding:8px 16px;--el-alert-border-radius-base:var(--el-border-radius-base);--el-alert-title-font-size:13px;--el-alert-description-font-size:12px;--el-alert-close-font-size:12px;--el-alert-close-customed-font-size:13px;--el-alert-icon-size:16px;--el-alert-icon-large-size:28px;width:100%;padding:var(--el-alert-padding);margin:0;box-sizing:border-box;border-radius:var(--el-alert-border-radius-base);position:relative;background-color:var(--el-color-white);overflow:hidden;opacity:1;display:flex;align-items:center;transition:opacity var(--el-transition-duration-fast)}.el-alert.is-light .el-alert__close-btn{color:var(--el-text-color-placeholder)}.el-alert.is-dark .el-alert__close-btn,.el-alert.is-dark .el-alert__description{color:var(--el-color-white)}.el-alert.is-center{justify-content:center}.el-alert--success{--el-alert-bg-color:var(--el-color-success-light-9)}.el-alert--success.is-light{background-color:var(--el-alert-bg-color);color:var(--el-color-success)}.el-alert--success.is-light .el-alert__description{color:var(--el-color-success)}.el-alert--success.is-dark{background-color:var(--el-color-success);color:var(--el-color-white)}.el-alert--info{--el-alert-bg-color:var(--el-color-info-light-9)}.el-alert--info.is-light{background-color:var(--el-alert-bg-color);color:var(--el-color-info)}.el-alert--info.is-light .el-alert__description{color:var(--el-color-info)}.el-alert--info.is-dark{background-color:var(--el-color-info);color:var(--el-color-white)}.el-alert--warning{--el-alert-bg-color:var(--el-color-warning-light-9)}.el-alert--warning.is-light{background-color:var(--el-alert-bg-color);color:var(--el-color-warning)}.el-alert--warning.is-light .el-alert__description{color:var(--el-color-warning)}.el-alert--warning.is-dark{background-color:var(--el-color-warning);color:var(--el-color-white)}.el-alert--error{--el-alert-bg-color:var(--el-color-error-light-9)}.el-alert--error.is-light{background-color:var(--el-alert-bg-color);color:var(--el-color-error)}.el-alert--error.is-light .el-alert__description{color:var(--el-color-error)}.el-alert--error.is-dark{background-color:var(--el-color-error);color:var(--el-color-white)}.el-alert__content{display:table-cell;padding:0 8px}.el-alert .el-alert__icon{font-size:var(--el-alert-icon-size);width:var(--el-alert-icon-size)}.el-alert .el-alert__icon.is-big{font-size:var(--el-alert-icon-large-size);width:var(--el-alert-icon-large-size)}.el-alert__title{font-size:var(--el-alert-title-font-size);line-height:18px;vertical-align:text-top}.el-alert__title.is-bold{font-weight:700}.el-alert .el-alert__description{font-size:var(--el-alert-description-font-size);margin:5px 0 0}.el-alert .el-alert__close-btn{font-size:var(--el-alert-close-font-size);opacity:1;position:absolute;top:12px;right:15px;cursor:pointer}.el-alert .el-alert__close-btn.is-customed{font-style:normal;font-size:var(--el-alert-close-customed-font-size);top:9px}.el-alert-fade-enter-from,.el-alert-fade-leave-active{opacity:0}.el-aside{overflow:auto;box-sizing:border-box;flex-shrink:0;width:var(--el-aside-width,300px)}.el-autocomplete{position:relative;display:inline-block}.el-autocomplete__popper.el-popper{background:var(--el-bg-color-overlay);border:1px solid var(--el-border-color-light);box-shadow:var(--el-box-shadow-light)}.el-autocomplete__popper.el-popper .el-popper__arrow:before{border:1px solid var(--el-border-color-light)}.el-autocomplete__popper.el-popper[data-popper-placement^=top] .el-popper__arrow:before{border-top-color:transparent;border-left-color:transparent}.el-autocomplete__popper.el-popper[data-popper-placement^=bottom] .el-popper__arrow:before{border-bottom-color:transparent;border-right-color:transparent}.el-autocomplete__popper.el-popper[data-popper-placement^=left] .el-popper__arrow:before{border-left-color:transparent;border-bottom-color:transparent}.el-autocomplete__popper.el-popper[data-popper-placement^=right] .el-popper__arrow:before{border-right-color:transparent;border-top-color:transparent}.el-autocomplete-suggestion{border-radius:var(--el-border-radius-base);box-sizing:border-box}.el-autocomplete-suggestion__wrap{max-height:280px;padding:10px 0;box-sizing:border-box}.el-autocomplete-suggestion__list{margin:0;padding:0}.el-autocomplete-suggestion li{padding:0 20px;margin:0;line-height:34px;cursor:pointer;color:var(--el-text-color-regular);font-size:var(--el-font-size-base);list-style:none;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.el-autocomplete-suggestion li:hover,.el-autocomplete-suggestion li.highlighted{background-color:var(--el-fill-color-light)}.el-autocomplete-suggestion li.divider{margin-top:6px;border-top:1px solid var(--el-color-black)}.el-autocomplete-suggestion li.divider:last-child{margin-bottom:-6px}.el-autocomplete-suggestion.is-loading li{text-align:center;height:100px;line-height:100px;font-size:20px;color:var(--el-text-color-secondary)}.el-autocomplete-suggestion.is-loading li:after{display:inline-block;content:"";height:100%;vertical-align:middle}.el-autocomplete-suggestion.is-loading li:hover{background-color:var(--el-bg-color-overlay)}.el-autocomplete-suggestion.is-loading .el-icon-loading{vertical-align:middle}.el-avatar{--el-avatar-text-color:var(--el-color-white);--el-avatar-bg-color:var(--el-text-color-disabled);--el-avatar-text-size:14px;--el-avatar-icon-size:18px;--el-avatar-border-radius:var(--el-border-radius-base);--el-avatar-size-large:56px;--el-avatar-size-small:24px;--el-avatar-size:40px;display:inline-flex;justify-content:center;align-items:center;box-sizing:border-box;text-align:center;overflow:hidden;color:var(--el-avatar-text-color);background:var(--el-avatar-bg-color);width:var(--el-avatar-size);height:var(--el-avatar-size);font-size:var(--el-avatar-text-size)}.el-avatar>img{display:block;width:100%;height:100%}.el-avatar--circle{border-radius:50%}.el-avatar--square{border-radius:var(--el-avatar-border-radius)}.el-avatar--icon{font-size:var(--el-avatar-icon-size)}.el-avatar--small{--el-avatar-size:24px}.el-avatar--large{--el-avatar-size:56px}.el-backtop{--el-backtop-bg-color:var(--el-bg-color-overlay);--el-backtop-text-color:var(--el-color-primary);--el-backtop-hover-bg-color:var(--el-border-color-extra-light);position:fixed;background-color:var(--el-backtop-bg-color);width:40px;height:40px;border-radius:50%;color:var(--el-backtop-text-color);display:flex;align-items:center;justify-content:center;font-size:20px;box-shadow:var(--el-box-shadow-lighter);cursor:pointer;z-index:5}.el-backtop:hover{background-color:var(--el-backtop-hover-bg-color)}.el-backtop__icon{font-size:20px}.el-badge{--el-badge-bg-color:var(--el-color-danger);--el-badge-radius:10px;--el-badge-font-size:12px;--el-badge-padding:6px;--el-badge-size:18px;position:relative;vertical-align:middle;display:inline-block;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.el-badge__content{background-color:var(--el-badge-bg-color);border-radius:var(--el-badge-radius);color:var(--el-color-white);display:inline-flex;justify-content:center;align-items:center;font-size:var(--el-badge-font-size);height:var(--el-badge-size);padding:0 var(--el-badge-padding);white-space:nowrap;border:1px solid var(--el-bg-color)}.el-badge__content.is-fixed{position:absolute;top:0;right:calc(1px + var(--el-badge-size)/ 2);transform:translateY(-50%) translate(100%);z-index:var(--el-index-normal)}.el-badge__content.is-fixed.is-dot{right:5px}.el-badge__content.is-dot{height:8px;width:8px;padding:0;right:0;border-radius:50%}.el-badge__content--primary{background-color:var(--el-color-primary)}.el-badge__content--success{background-color:var(--el-color-success)}.el-badge__content--warning{background-color:var(--el-color-warning)}.el-badge__content--info{background-color:var(--el-color-info)}.el-badge__content--danger{background-color:var(--el-color-danger)}.el-breadcrumb{font-size:14px;line-height:1}.el-breadcrumb:after,.el-breadcrumb:before{display:table;content:""}.el-breadcrumb:after{clear:both}.el-breadcrumb__separator{margin:0 9px;font-weight:700;color:var(--el-text-color-placeholder)}.el-breadcrumb__separator.el-icon{margin:0 6px;font-weight:400}.el-breadcrumb__separator.el-icon svg{vertical-align:middle}.el-breadcrumb__item{float:left;display:inline-flex;align-items:center}.el-breadcrumb__inner{color:var(--el-text-color-regular)}.el-breadcrumb__inner a,.el-breadcrumb__inner.is-link{font-weight:700;text-decoration:none;transition:var(--el-transition-color);color:var(--el-text-color-primary)}.el-breadcrumb__inner a:hover,.el-breadcrumb__inner.is-link:hover{color:var(--el-color-primary);cursor:pointer}.el-breadcrumb__item:last-child .el-breadcrumb__inner,.el-breadcrumb__item:last-child .el-breadcrumb__inner a,.el-breadcrumb__item:last-child .el-breadcrumb__inner a:hover,.el-breadcrumb__item:last-child .el-breadcrumb__inner:hover{font-weight:400;color:var(--el-text-color-regular);cursor:text}.el-breadcrumb__item:last-child .el-breadcrumb__separator{display:none}.el-button-group{display:inline-block;vertical-align:middle}.el-button-group:after,.el-button-group:before{display:table;content:""}.el-button-group:after{clear:both}.el-button-group>.el-button{float:left;position:relative}.el-button-group>.el-button+.el-button{margin-left:0}.el-button-group>.el-button:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.el-button-group>.el-button:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.el-button-group>.el-button:first-child:last-child{border-top-right-radius:var(--el-border-radius-base);border-bottom-right-radius:var(--el-border-radius-base);border-top-left-radius:var(--el-border-radius-base);border-bottom-left-radius:var(--el-border-radius-base)}.el-button-group>.el-button:first-child:last-child.is-round{border-radius:var(--el-border-radius-round)}.el-button-group>.el-button:first-child:last-child.is-circle{border-radius:50%}.el-button-group>.el-button:not(:first-child):not(:last-child){border-radius:0}.el-button-group>.el-button:not(:last-child){margin-right:-1px}.el-button-group>.el-button:active,.el-button-group>.el-button:focus,.el-button-group>.el-button:hover{z-index:1}.el-button-group>.el-button.is-active{z-index:1}.el-button-group>.el-dropdown>.el-button{border-top-left-radius:0;border-bottom-left-radius:0;border-left-color:var(--el-button-divide-border-color)}.el-button-group .el-button--primary:first-child{border-right-color:var(--el-button-divide-border-color)}.el-button-group .el-button--primary:last-child{border-left-color:var(--el-button-divide-border-color)}.el-button-group .el-button--primary:not(:first-child):not(:last-child){border-left-color:var(--el-button-divide-border-color);border-right-color:var(--el-button-divide-border-color)}.el-button-group .el-button--success:first-child{border-right-color:var(--el-button-divide-border-color)}.el-button-group .el-button--success:last-child{border-left-color:var(--el-button-divide-border-color)}.el-button-group .el-button--success:not(:first-child):not(:last-child){border-left-color:var(--el-button-divide-border-color);border-right-color:var(--el-button-divide-border-color)}.el-button-group .el-button--warning:first-child{border-right-color:var(--el-button-divide-border-color)}.el-button-group .el-button--warning:last-child{border-left-color:var(--el-button-divide-border-color)}.el-button-group .el-button--warning:not(:first-child):not(:last-child){border-left-color:var(--el-button-divide-border-color);border-right-color:var(--el-button-divide-border-color)}.el-button-group .el-button--danger:first-child{border-right-color:var(--el-button-divide-border-color)}.el-button-group .el-button--danger:last-child{border-left-color:var(--el-button-divide-border-color)}.el-button-group .el-button--danger:not(:first-child):not(:last-child){border-left-color:var(--el-button-divide-border-color);border-right-color:var(--el-button-divide-border-color)}.el-button-group .el-button--info:first-child{border-right-color:var(--el-button-divide-border-color)}.el-button-group .el-button--info:last-child{border-left-color:var(--el-button-divide-border-color)}.el-button-group .el-button--info:not(:first-child):not(:last-child){border-left-color:var(--el-button-divide-border-color);border-right-color:var(--el-button-divide-border-color)}.el-button{--el-button-font-weight:var(--el-font-weight-primary);--el-button-border-color:var(--el-border-color);--el-button-bg-color:var(--el-fill-color-blank);--el-button-text-color:var(--el-text-color-regular);--el-button-disabled-text-color:var(--el-disabled-text-color);--el-button-disabled-bg-color:var(--el-fill-color-blank);--el-button-disabled-border-color:var(--el-border-color-light);--el-button-divide-border-color:rgba(255, 255, 255, .5);--el-button-hover-text-color:var(--el-color-primary);--el-button-hover-bg-color:var(--el-color-primary-light-9);--el-button-hover-border-color:var(--el-color-primary-light-7);--el-button-active-text-color:var(--el-button-hover-text-color);--el-button-active-border-color:var(--el-color-primary);--el-button-active-bg-color:var(--el-button-hover-bg-color);--el-button-outline-color:var(--el-color-primary-light-5);--el-button-hover-link-text-color:var(--el-color-info);--el-button-active-color:var(--el-text-color-primary)}.el-button{display:inline-flex;justify-content:center;align-items:center;line-height:1;height:32px;white-space:nowrap;cursor:pointer;color:var(--el-button-text-color);text-align:center;box-sizing:border-box;outline:0;transition:.1s;font-weight:var(--el-button-font-weight);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;-webkit-appearance:none;background-color:var(--el-button-bg-color);border:var(--el-border);border-color:var(--el-button-border-color);padding:8px 15px;font-size:var(--el-font-size-base);border-radius:var(--el-border-radius-base)}.el-button:focus,.el-button:hover{color:var(--el-button-hover-text-color);border-color:var(--el-button-hover-border-color);background-color:var(--el-button-hover-bg-color);outline:0}.el-button:active{color:var(--el-button-active-text-color);border-color:var(--el-button-active-border-color);background-color:var(--el-button-active-bg-color);outline:0}.el-button:focus-visible{outline:2px solid var(--el-button-outline-color);outline-offset:1px}.el-button>span{display:inline-flex;align-items:center}.el-button+.el-button{margin-left:12px}.el-button.is-round{padding:8px 15px}.el-button::-moz-focus-inner{border:0}.el-button [class*=el-icon]+span{margin-left:6px}.el-button [class*=el-icon] svg{vertical-align:bottom}.el-button.is-plain{--el-button-hover-text-color:var(--el-color-primary);--el-button-hover-bg-color:var(--el-fill-color-blank);--el-button-hover-border-color:var(--el-color-primary)}.el-button.is-active{color:var(--el-button-active-text-color);border-color:var(--el-button-active-border-color);background-color:var(--el-button-active-bg-color);outline:0}.el-button.is-disabled,.el-button.is-disabled:focus,.el-button.is-disabled:hover{color:var(--el-button-disabled-text-color);cursor:not-allowed;background-image:none;background-color:var(--el-button-disabled-bg-color);border-color:var(--el-button-disabled-border-color)}.el-button.is-loading{position:relative;pointer-events:none}.el-button.is-loading:before{z-index:1;pointer-events:none;content:"";position:absolute;left:-1px;top:-1px;right:-1px;bottom:-1px;border-radius:inherit;background-color:var(--el-mask-color-extra-light)}.el-button.is-round{border-radius:var(--el-border-radius-round)}.el-button.is-circle{width:32px;border-radius:50%;padding:8px}.el-button.is-text{color:var(--el-button-text-color);border:0 solid transparent;background-color:transparent}.el-button.is-text.is-disabled{color:var(--el-button-disabled-text-color);background-color:transparent!important}.el-button.is-text:not(.is-disabled):focus,.el-button.is-text:not(.is-disabled):hover{background-color:var(--el-fill-color-light)}.el-button.is-text:not(.is-disabled):focus-visible{outline:2px solid var(--el-button-outline-color);outline-offset:1px}.el-button.is-text:not(.is-disabled):active{background-color:var(--el-fill-color)}.el-button.is-text:not(.is-disabled).is-has-bg{background-color:var(--el-fill-color-light)}.el-button.is-text:not(.is-disabled).is-has-bg:focus,.el-button.is-text:not(.is-disabled).is-has-bg:hover{background-color:var(--el-fill-color)}.el-button.is-text:not(.is-disabled).is-has-bg:active{background-color:var(--el-fill-color-dark)}.el-button__text--expand{letter-spacing:.3em;margin-right:-.3em}.el-button.is-link{border-color:transparent;color:var(--el-button-text-color);background:0 0;padding:2px;height:auto}.el-button.is-link:focus,.el-button.is-link:hover{color:var(--el-button-hover-link-text-color)}.el-button.is-link.is-disabled{color:var(--el-button-disabled-text-color);background-color:transparent!important;border-color:transparent!important}.el-button.is-link:not(.is-disabled):focus,.el-button.is-link:not(.is-disabled):hover{border-color:transparent;background-color:transparent}.el-button.is-link:not(.is-disabled):active{color:var(--el-button-active-color);border-color:transparent;background-color:transparent}.el-button--text{border-color:transparent;background:0 0;color:var(--el-color-primary);padding-left:0;padding-right:0}.el-button--text.is-disabled{color:var(--el-button-disabled-text-color);background-color:transparent!important;border-color:transparent!important}.el-button--text:not(.is-disabled):focus,.el-button--text:not(.is-disabled):hover{color:var(--el-color-primary-light-3);border-color:transparent;background-color:transparent}.el-button--text:not(.is-disabled):active{color:var(--el-color-primary-dark-2);border-color:transparent;background-color:transparent}.el-button__link--expand{letter-spacing:.3em;margin-right:-.3em}.el-button--primary{--el-button-text-color:var(--el-color-white);--el-button-bg-color:var(--el-color-primary);--el-button-border-color:var(--el-color-primary);--el-button-outline-color:var(--el-color-primary-light-5);--el-button-active-color:var(--el-color-primary-dark-2);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-link-text-color:var(--el-color-primary-light-5);--el-button-hover-bg-color:var(--el-color-primary-light-3);--el-button-hover-border-color:var(--el-color-primary-light-3);--el-button-active-bg-color:var(--el-color-primary-dark-2);--el-button-active-border-color:var(--el-color-primary-dark-2);--el-button-disabled-text-color:var(--el-color-white);--el-button-disabled-bg-color:var(--el-color-primary-light-5);--el-button-disabled-border-color:var(--el-color-primary-light-5)}.el-button--primary.is-link,.el-button--primary.is-plain,.el-button--primary.is-text{--el-button-text-color:var(--el-color-primary);--el-button-bg-color:var(--el-color-primary-light-9);--el-button-border-color:var(--el-color-primary-light-5);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-primary);--el-button-hover-border-color:var(--el-color-primary);--el-button-active-text-color:var(--el-color-white)}.el-button--primary.is-link.is-disabled,.el-button--primary.is-link.is-disabled:active,.el-button--primary.is-link.is-disabled:focus,.el-button--primary.is-link.is-disabled:hover,.el-button--primary.is-plain.is-disabled,.el-button--primary.is-plain.is-disabled:active,.el-button--primary.is-plain.is-disabled:focus,.el-button--primary.is-plain.is-disabled:hover,.el-button--primary.is-text.is-disabled,.el-button--primary.is-text.is-disabled:active,.el-button--primary.is-text.is-disabled:focus,.el-button--primary.is-text.is-disabled:hover{color:var(--el-color-primary-light-5);background-color:var(--el-color-primary-light-9);border-color:var(--el-color-primary-light-8)}.el-button--success{--el-button-text-color:var(--el-color-white);--el-button-bg-color:var(--el-color-success);--el-button-border-color:var(--el-color-success);--el-button-outline-color:var(--el-color-success-light-5);--el-button-active-color:var(--el-color-success-dark-2);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-link-text-color:var(--el-color-success-light-5);--el-button-hover-bg-color:var(--el-color-success-light-3);--el-button-hover-border-color:var(--el-color-success-light-3);--el-button-active-bg-color:var(--el-color-success-dark-2);--el-button-active-border-color:var(--el-color-success-dark-2);--el-button-disabled-text-color:var(--el-color-white);--el-button-disabled-bg-color:var(--el-color-success-light-5);--el-button-disabled-border-color:var(--el-color-success-light-5)}.el-button--success.is-link,.el-button--success.is-plain,.el-button--success.is-text{--el-button-text-color:var(--el-color-success);--el-button-bg-color:var(--el-color-success-light-9);--el-button-border-color:var(--el-color-success-light-5);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-success);--el-button-hover-border-color:var(--el-color-success);--el-button-active-text-color:var(--el-color-white)}.el-button--success.is-link.is-disabled,.el-button--success.is-link.is-disabled:active,.el-button--success.is-link.is-disabled:focus,.el-button--success.is-link.is-disabled:hover,.el-button--success.is-plain.is-disabled,.el-button--success.is-plain.is-disabled:active,.el-button--success.is-plain.is-disabled:focus,.el-button--success.is-plain.is-disabled:hover,.el-button--success.is-text.is-disabled,.el-button--success.is-text.is-disabled:active,.el-button--success.is-text.is-disabled:focus,.el-button--success.is-text.is-disabled:hover{color:var(--el-color-success-light-5);background-color:var(--el-color-success-light-9);border-color:var(--el-color-success-light-8)}.el-button--warning{--el-button-text-color:var(--el-color-white);--el-button-bg-color:var(--el-color-warning);--el-button-border-color:var(--el-color-warning);--el-button-outline-color:var(--el-color-warning-light-5);--el-button-active-color:var(--el-color-warning-dark-2);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-link-text-color:var(--el-color-warning-light-5);--el-button-hover-bg-color:var(--el-color-warning-light-3);--el-button-hover-border-color:var(--el-color-warning-light-3);--el-button-active-bg-color:var(--el-color-warning-dark-2);--el-button-active-border-color:var(--el-color-warning-dark-2);--el-button-disabled-text-color:var(--el-color-white);--el-button-disabled-bg-color:var(--el-color-warning-light-5);--el-button-disabled-border-color:var(--el-color-warning-light-5)}.el-button--warning.is-link,.el-button--warning.is-plain,.el-button--warning.is-text{--el-button-text-color:var(--el-color-warning);--el-button-bg-color:var(--el-color-warning-light-9);--el-button-border-color:var(--el-color-warning-light-5);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-warning);--el-button-hover-border-color:var(--el-color-warning);--el-button-active-text-color:var(--el-color-white)}.el-button--warning.is-link.is-disabled,.el-button--warning.is-link.is-disabled:active,.el-button--warning.is-link.is-disabled:focus,.el-button--warning.is-link.is-disabled:hover,.el-button--warning.is-plain.is-disabled,.el-button--warning.is-plain.is-disabled:active,.el-button--warning.is-plain.is-disabled:focus,.el-button--warning.is-plain.is-disabled:hover,.el-button--warning.is-text.is-disabled,.el-button--warning.is-text.is-disabled:active,.el-button--warning.is-text.is-disabled:focus,.el-button--warning.is-text.is-disabled:hover{color:var(--el-color-warning-light-5);background-color:var(--el-color-warning-light-9);border-color:var(--el-color-warning-light-8)}.el-button--danger{--el-button-text-color:var(--el-color-white);--el-button-bg-color:var(--el-color-danger);--el-button-border-color:var(--el-color-danger);--el-button-outline-color:var(--el-color-danger-light-5);--el-button-active-color:var(--el-color-danger-dark-2);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-link-text-color:var(--el-color-danger-light-5);--el-button-hover-bg-color:var(--el-color-danger-light-3);--el-button-hover-border-color:var(--el-color-danger-light-3);--el-button-active-bg-color:var(--el-color-danger-dark-2);--el-button-active-border-color:var(--el-color-danger-dark-2);--el-button-disabled-text-color:var(--el-color-white);--el-button-disabled-bg-color:var(--el-color-danger-light-5);--el-button-disabled-border-color:var(--el-color-danger-light-5)}.el-button--danger.is-link,.el-button--danger.is-plain,.el-button--danger.is-text{--el-button-text-color:var(--el-color-danger);--el-button-bg-color:var(--el-color-danger-light-9);--el-button-border-color:var(--el-color-danger-light-5);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-danger);--el-button-hover-border-color:var(--el-color-danger);--el-button-active-text-color:var(--el-color-white)}.el-button--danger.is-link.is-disabled,.el-button--danger.is-link.is-disabled:active,.el-button--danger.is-link.is-disabled:focus,.el-button--danger.is-link.is-disabled:hover,.el-button--danger.is-plain.is-disabled,.el-button--danger.is-plain.is-disabled:active,.el-button--danger.is-plain.is-disabled:focus,.el-button--danger.is-plain.is-disabled:hover,.el-button--danger.is-text.is-disabled,.el-button--danger.is-text.is-disabled:active,.el-button--danger.is-text.is-disabled:focus,.el-button--danger.is-text.is-disabled:hover{color:var(--el-color-danger-light-5);background-color:var(--el-color-danger-light-9);border-color:var(--el-color-danger-light-8)}.el-button--info{--el-button-text-color:var(--el-color-white);--el-button-bg-color:var(--el-color-info);--el-button-border-color:var(--el-color-info);--el-button-outline-color:var(--el-color-info-light-5);--el-button-active-color:var(--el-color-info-dark-2);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-link-text-color:var(--el-color-info-light-5);--el-button-hover-bg-color:var(--el-color-info-light-3);--el-button-hover-border-color:var(--el-color-info-light-3);--el-button-active-bg-color:var(--el-color-info-dark-2);--el-button-active-border-color:var(--el-color-info-dark-2);--el-button-disabled-text-color:var(--el-color-white);--el-button-disabled-bg-color:var(--el-color-info-light-5);--el-button-disabled-border-color:var(--el-color-info-light-5)}.el-button--info.is-link,.el-button--info.is-plain,.el-button--info.is-text{--el-button-text-color:var(--el-color-info);--el-button-bg-color:var(--el-color-info-light-9);--el-button-border-color:var(--el-color-info-light-5);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-info);--el-button-hover-border-color:var(--el-color-info);--el-button-active-text-color:var(--el-color-white)}.el-button--info.is-link.is-disabled,.el-button--info.is-link.is-disabled:active,.el-button--info.is-link.is-disabled:focus,.el-button--info.is-link.is-disabled:hover,.el-button--info.is-plain.is-disabled,.el-button--info.is-plain.is-disabled:active,.el-button--info.is-plain.is-disabled:focus,.el-button--info.is-plain.is-disabled:hover,.el-button--info.is-text.is-disabled,.el-button--info.is-text.is-disabled:active,.el-button--info.is-text.is-disabled:focus,.el-button--info.is-text.is-disabled:hover{color:var(--el-color-info-light-5);background-color:var(--el-color-info-light-9);border-color:var(--el-color-info-light-8)}.el-button--large{--el-button-size:40px;height:var(--el-button-size);padding:12px 19px;font-size:var(--el-font-size-base);border-radius:var(--el-border-radius-base)}.el-button--large [class*=el-icon]+span{margin-left:8px}.el-button--large.is-round{padding:12px 19px}.el-button--large.is-circle{width:var(--el-button-size);padding:12px}.el-button--small{--el-button-size:24px;height:var(--el-button-size);padding:5px 11px;font-size:12px;border-radius:calc(var(--el-border-radius-base) - 1px)}.el-button--small [class*=el-icon]+span{margin-left:4px}.el-button--small.is-round{padding:5px 11px}.el-button--small.is-circle{width:var(--el-button-size);padding:5px}.el-calendar{--el-calendar-border:var(--el-table-border, 1px solid var(--el-border-color-lighter));--el-calendar-header-border-bottom:var(--el-calendar-border);--el-calendar-selected-bg-color:var(--el-color-primary-light-9);--el-calendar-cell-width:85px;background-color:var(--el-fill-color-blank)}.el-calendar__header{display:flex;justify-content:space-between;padding:12px 20px;border-bottom:var(--el-calendar-header-border-bottom)}.el-calendar__title{color:var(--el-text-color);align-self:center}.el-calendar__body{padding:12px 20px 35px}.el-calendar-table{table-layout:fixed;width:100%}.el-calendar-table thead th{padding:12px 0;color:var(--el-text-color-regular);font-weight:400}.el-calendar-table:not(.is-range) td.next,.el-calendar-table:not(.is-range) td.prev{color:var(--el-text-color-placeholder)}.el-calendar-table td{border-bottom:var(--el-calendar-border);border-right:var(--el-calendar-border);vertical-align:top;transition:background-color var(--el-transition-duration-fast) ease}.el-calendar-table td.is-selected{background-color:var(--el-calendar-selected-bg-color)}.el-calendar-table td.is-today{color:var(--el-color-primary)}.el-calendar-table tr:first-child td{border-top:var(--el-calendar-border)}.el-calendar-table tr td:first-child{border-left:var(--el-calendar-border)}.el-calendar-table tr.el-calendar-table__row--hide-border td{border-top:none}.el-calendar-table .el-calendar-day{box-sizing:border-box;padding:8px;height:var(--el-calendar-cell-width)}.el-calendar-table .el-calendar-day:hover{cursor:pointer;background-color:var(--el-calendar-selected-bg-color)}.el-card{--el-card-border-color:var(--el-border-color-light);--el-card-border-radius:4px;--el-card-padding:20px;--el-card-bg-color:var(--el-fill-color-blank)}.el-card{border-radius:var(--el-card-border-radius);border:1px solid var(--el-card-border-color);background-color:var(--el-card-bg-color);overflow:hidden;color:var(--el-text-color-primary);transition:var(--el-transition-duration)}.el-card.is-always-shadow{box-shadow:var(--el-box-shadow-light)}.el-card.is-hover-shadow:focus,.el-card.is-hover-shadow:hover{box-shadow:var(--el-box-shadow-light)}.el-card__header{padding:calc(var(--el-card-padding) - 2px) var(--el-card-padding);border-bottom:1px solid var(--el-card-border-color);box-sizing:border-box}.el-card__body{padding:var(--el-card-padding)}.el-card__footer{padding:calc(var(--el-card-padding) - 2px) var(--el-card-padding);border-top:1px solid var(--el-card-border-color);box-sizing:border-box}.el-carousel__item{position:absolute;top:0;left:0;width:100%;height:100%;display:inline-block;overflow:hidden;z-index:calc(var(--el-index-normal) - 1)}.el-carousel__item.is-active{z-index:calc(var(--el-index-normal) - 1)}.el-carousel__item.is-animating{transition:transform .4s ease-in-out}.el-carousel__item--card{width:50%;transition:transform .4s ease-in-out}.el-carousel__item--card.is-in-stage{cursor:pointer;z-index:var(--el-index-normal)}.el-carousel__item--card.is-in-stage.is-hover .el-carousel__mask,.el-carousel__item--card.is-in-stage:hover .el-carousel__mask{opacity:.12}.el-carousel__item--card.is-active{z-index:calc(var(--el-index-normal) + 1)}.el-carousel__item--card-vertical{width:100%;height:50%}.el-carousel__mask{position:absolute;width:100%;height:100%;top:0;left:0;background-color:var(--el-color-white);opacity:.24;transition:var(--el-transition-duration-fast)}.el-carousel{--el-carousel-arrow-font-size:12px;--el-carousel-arrow-size:36px;--el-carousel-arrow-background:rgba(31, 45, 61, .11);--el-carousel-arrow-hover-background:rgba(31, 45, 61, .23);--el-carousel-indicator-width:30px;--el-carousel-indicator-height:2px;--el-carousel-indicator-padding-horizontal:4px;--el-carousel-indicator-padding-vertical:12px;--el-carousel-indicator-out-color:var(--el-border-color-hover);position:relative}.el-carousel--horizontal,.el-carousel--vertical{overflow:hidden}.el-carousel__container{position:relative;height:300px}.el-carousel__arrow{border:none;outline:0;padding:0;margin:0;height:var(--el-carousel-arrow-size);width:var(--el-carousel-arrow-size);cursor:pointer;transition:var(--el-transition-duration);border-radius:50%;background-color:var(--el-carousel-arrow-background);color:#fff;position:absolute;top:50%;z-index:10;transform:translateY(-50%);text-align:center;font-size:var(--el-carousel-arrow-font-size);display:inline-flex;justify-content:center;align-items:center}.el-carousel__arrow--left{left:16px}.el-carousel__arrow--right{right:16px}.el-carousel__arrow:hover{background-color:var(--el-carousel-arrow-hover-background)}.el-carousel__arrow i{cursor:pointer}.el-carousel__indicators{position:absolute;list-style:none;margin:0;padding:0;z-index:calc(var(--el-index-normal) + 1)}.el-carousel__indicators--horizontal{bottom:0;left:50%;transform:translate(-50%)}.el-carousel__indicators--vertical{right:0;top:50%;transform:translateY(-50%)}.el-carousel__indicators--outside{bottom:calc(var(--el-carousel-indicator-height) + var(--el-carousel-indicator-padding-vertical) * 2);text-align:center;position:static;transform:none}.el-carousel__indicators--outside .el-carousel__indicator:hover button{opacity:.64}.el-carousel__indicators--outside button{background-color:var(--el-carousel-indicator-out-color);opacity:.24}.el-carousel__indicators--right{right:0}.el-carousel__indicators--labels{left:0;right:0;transform:none;text-align:center}.el-carousel__indicators--labels .el-carousel__button{height:auto;width:auto;padding:2px 18px;font-size:12px;color:#000}.el-carousel__indicators--labels .el-carousel__indicator{padding:6px 4px}.el-carousel__indicator{background-color:transparent;cursor:pointer}.el-carousel__indicator:hover button{opacity:.72}.el-carousel__indicator--horizontal{display:inline-block;padding:var(--el-carousel-indicator-padding-vertical) var(--el-carousel-indicator-padding-horizontal)}.el-carousel__indicator--vertical{padding:var(--el-carousel-indicator-padding-horizontal) var(--el-carousel-indicator-padding-vertical)}.el-carousel__indicator--vertical .el-carousel__button{width:var(--el-carousel-indicator-height);height:calc(var(--el-carousel-indicator-width)/ 2)}.el-carousel__indicator.is-active button{opacity:1}.el-carousel__button{display:block;opacity:.48;width:var(--el-carousel-indicator-width);height:var(--el-carousel-indicator-height);background-color:#fff;border:none;outline:0;padding:0;margin:0;cursor:pointer;transition:var(--el-transition-duration)}.carousel-arrow-left-enter-from,.carousel-arrow-left-leave-active{transform:translateY(-50%) translate(-10px);opacity:0}.carousel-arrow-right-enter-from,.carousel-arrow-right-leave-active{transform:translateY(-50%) translate(10px);opacity:0}.el-cascader-panel{--el-cascader-menu-text-color:var(--el-text-color-regular);--el-cascader-menu-selected-text-color:var(--el-color-primary);--el-cascader-menu-fill:var(--el-bg-color-overlay);--el-cascader-menu-font-size:var(--el-font-size-base);--el-cascader-menu-radius:var(--el-border-radius-base);--el-cascader-menu-border:solid 1px var(--el-border-color-light);--el-cascader-menu-shadow:var(--el-box-shadow-light);--el-cascader-node-background-hover:var(--el-fill-color-light);--el-cascader-node-color-disabled:var(--el-text-color-placeholder);--el-cascader-color-empty:var(--el-text-color-placeholder);--el-cascader-tag-background:var(--el-fill-color)}.el-cascader-panel{display:flex;border-radius:var(--el-cascader-menu-radius);font-size:var(--el-cascader-menu-font-size)}.el-cascader-panel.is-bordered{border:var(--el-cascader-menu-border);border-radius:var(--el-cascader-menu-radius)}.el-cascader-menu{min-width:180px;box-sizing:border-box;color:var(--el-cascader-menu-text-color);border-right:var(--el-cascader-menu-border)}.el-cascader-menu:last-child{border-right:none}.el-cascader-menu:last-child .el-cascader-node{padding-right:20px}.el-cascader-menu__wrap.el-scrollbar__wrap{height:204px}.el-cascader-menu__list{position:relative;min-height:100%;margin:0;padding:6px 0;list-style:none;box-sizing:border-box}.el-cascader-menu__hover-zone{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}.el-cascader-menu__empty-text{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);display:flex;align-items:center;color:var(--el-cascader-color-empty)}.el-cascader-menu__empty-text .is-loading{margin-right:2px}.el-cascader-node{position:relative;display:flex;align-items:center;padding:0 30px 0 20px;height:34px;line-height:34px;outline:0}.el-cascader-node.is-selectable.in-active-path{color:var(--el-cascader-menu-text-color)}.el-cascader-node.in-active-path,.el-cascader-node.is-active,.el-cascader-node.is-selectable.in-checked-path{color:var(--el-cascader-menu-selected-text-color);font-weight:700}.el-cascader-node:not(.is-disabled){cursor:pointer}.el-cascader-node:not(.is-disabled):focus,.el-cascader-node:not(.is-disabled):hover{background:var(--el-cascader-node-background-hover)}.el-cascader-node.is-disabled{color:var(--el-cascader-node-color-disabled);cursor:not-allowed}.el-cascader-node__prefix{position:absolute;left:10px}.el-cascader-node__postfix{position:absolute;right:10px}.el-cascader-node__label{flex:1;text-align:left;padding:0 8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.el-cascader-node>.el-checkbox{margin-right:0}.el-cascader-node>.el-radio{margin-right:0}.el-cascader-node>.el-radio .el-radio__label{padding-left:0}.el-cascader{--el-cascader-menu-text-color:var(--el-text-color-regular);--el-cascader-menu-selected-text-color:var(--el-color-primary);--el-cascader-menu-fill:var(--el-bg-color-overlay);--el-cascader-menu-font-size:var(--el-font-size-base);--el-cascader-menu-radius:var(--el-border-radius-base);--el-cascader-menu-border:solid 1px var(--el-border-color-light);--el-cascader-menu-shadow:var(--el-box-shadow-light);--el-cascader-node-background-hover:var(--el-fill-color-light);--el-cascader-node-color-disabled:var(--el-text-color-placeholder);--el-cascader-color-empty:var(--el-text-color-placeholder);--el-cascader-tag-background:var(--el-fill-color);display:inline-block;vertical-align:middle;position:relative;font-size:var(--el-font-size-base);line-height:32px;outline:0}.el-cascader:not(.is-disabled):hover .el-input__wrapper{cursor:pointer;box-shadow:0 0 0 1px var(--el-input-hover-border-color) inset}.el-cascader .el-input{display:flex;cursor:pointer}.el-cascader .el-input .el-input__inner{text-overflow:ellipsis;cursor:pointer}.el-cascader .el-input .el-input__suffix-inner .el-icon{height:calc(100% - 2px)}.el-cascader .el-input .el-input__suffix-inner .el-icon svg{vertical-align:middle}.el-cascader .el-input .icon-arrow-down{transition:transform var(--el-transition-duration);font-size:14px}.el-cascader .el-input .icon-arrow-down.is-reverse{transform:rotate(180deg)}.el-cascader .el-input .icon-circle-close:hover{color:var(--el-input-clear-hover-color,var(--el-text-color-secondary))}.el-cascader .el-input.is-focus .el-input__wrapper{box-shadow:0 0 0 1px var(--el-input-focus-border-color,var(--el-color-primary)) inset}.el-cascader--large{font-size:14px;line-height:40px}.el-cascader--small{font-size:12px;line-height:24px}.el-cascader.is-disabled .el-cascader__label{z-index:calc(var(--el-index-normal) + 1);color:var(--el-disabled-text-color)}.el-cascader__dropdown{--el-cascader-menu-text-color:var(--el-text-color-regular);--el-cascader-menu-selected-text-color:var(--el-color-primary);--el-cascader-menu-fill:var(--el-bg-color-overlay);--el-cascader-menu-font-size:var(--el-font-size-base);--el-cascader-menu-radius:var(--el-border-radius-base);--el-cascader-menu-border:solid 1px var(--el-border-color-light);--el-cascader-menu-shadow:var(--el-box-shadow-light);--el-cascader-node-background-hover:var(--el-fill-color-light);--el-cascader-node-color-disabled:var(--el-text-color-placeholder);--el-cascader-color-empty:var(--el-text-color-placeholder);--el-cascader-tag-background:var(--el-fill-color)}.el-cascader__dropdown{font-size:var(--el-cascader-menu-font-size);border-radius:var(--el-cascader-menu-radius)}.el-cascader__dropdown.el-popper{background:var(--el-cascader-menu-fill);border:var(--el-cascader-menu-border);box-shadow:var(--el-cascader-menu-shadow)}.el-cascader__dropdown.el-popper .el-popper__arrow:before{border:var(--el-cascader-menu-border)}.el-cascader__dropdown.el-popper[data-popper-placement^=top] .el-popper__arrow:before{border-top-color:transparent;border-left-color:transparent}.el-cascader__dropdown.el-popper[data-popper-placement^=bottom] .el-popper__arrow:before{border-bottom-color:transparent;border-right-color:transparent}.el-cascader__dropdown.el-popper[data-popper-placement^=left] .el-popper__arrow:before{border-left-color:transparent;border-bottom-color:transparent}.el-cascader__dropdown.el-popper[data-popper-placement^=right] .el-popper__arrow:before{border-right-color:transparent;border-top-color:transparent}.el-cascader__dropdown.el-popper{box-shadow:var(--el-cascader-menu-shadow)}.el-cascader__tags{position:absolute;left:0;right:30px;top:50%;transform:translateY(-50%);display:flex;flex-wrap:wrap;line-height:normal;text-align:left;box-sizing:border-box}.el-cascader__tags .el-tag{display:inline-flex;align-items:center;max-width:100%;margin:2px 0 2px 6px;text-overflow:ellipsis;background:var(--el-cascader-tag-background)}.el-cascader__tags .el-tag:not(.is-hit){border-color:transparent}.el-cascader__tags .el-tag>span{flex:1;overflow:hidden;text-overflow:ellipsis}.el-cascader__tags .el-tag .el-icon-close{flex:none;background-color:var(--el-text-color-placeholder);color:var(--el-color-white)}.el-cascader__tags .el-tag .el-icon-close:hover{background-color:var(--el-text-color-secondary)}.el-cascader__collapse-tags{white-space:normal;z-index:var(--el-index-normal)}.el-cascader__collapse-tags .el-tag{display:inline-flex;align-items:center;max-width:100%;margin:2px 0 2px 6px;text-overflow:ellipsis;background:var(--el-fill-color)}.el-cascader__collapse-tags .el-tag:not(.is-hit){border-color:transparent}.el-cascader__collapse-tags .el-tag>span{flex:1;overflow:hidden;text-overflow:ellipsis}.el-cascader__collapse-tags .el-tag .el-icon-close{flex:none;background-color:var(--el-text-color-placeholder);color:var(--el-color-white)}.el-cascader__collapse-tags .el-tag .el-icon-close:hover{background-color:var(--el-text-color-secondary)}.el-cascader__suggestion-panel{border-radius:var(--el-cascader-menu-radius)}.el-cascader__suggestion-list{max-height:204px;margin:0;padding:6px 0;font-size:var(--el-font-size-base);color:var(--el-cascader-menu-text-color);text-align:center}.el-cascader__suggestion-item{display:flex;justify-content:space-between;align-items:center;height:34px;padding:0 15px;text-align:left;outline:0;cursor:pointer}.el-cascader__suggestion-item:focus,.el-cascader__suggestion-item:hover{background:var(--el-cascader-node-background-hover)}.el-cascader__suggestion-item.is-checked{color:var(--el-cascader-menu-selected-text-color);font-weight:700}.el-cascader__suggestion-item>span{margin-right:10px}.el-cascader__empty-text{margin:10px 0;color:var(--el-cascader-color-empty)}.el-cascader__search-input{flex:1;height:24px;min-width:60px;margin:2px 0 2px 11px;padding:0;color:var(--el-cascader-menu-text-color);border:none;outline:0;box-sizing:border-box;background:0 0}.el-cascader__search-input::-moz-placeholder{color:transparent}.el-cascader__search-input:-ms-input-placeholder{color:transparent}.el-cascader__search-input::placeholder{color:transparent}.el-check-tag{background-color:var(--el-color-info-light-9);border-radius:var(--el-border-radius-base);color:var(--el-color-info);cursor:pointer;display:inline-block;font-size:var(--el-font-size-base);line-height:var(--el-font-size-base);padding:7px 15px;transition:var(--el-transition-all);font-weight:700}.el-check-tag:hover{background-color:var(--el-color-info-light-7)}.el-check-tag.is-checked{background-color:var(--el-color-primary-light-8);color:var(--el-color-primary)}.el-check-tag.is-checked:hover{background-color:var(--el-color-primary-light-7)}.el-checkbox-button{--el-checkbox-button-checked-bg-color:var(--el-color-primary);--el-checkbox-button-checked-text-color:var(--el-color-white);--el-checkbox-button-checked-border-color:var(--el-color-primary)}.el-checkbox-button{position:relative;display:inline-block}.el-checkbox-button__inner{display:inline-block;line-height:1;font-weight:var(--el-checkbox-font-weight);white-space:nowrap;vertical-align:middle;cursor:pointer;background:var(--el-button-bg-color,var(--el-fill-color-blank));border:var(--el-border);border-left-color:transparent;color:var(--el-button-text-color,var(--el-text-color-regular));-webkit-appearance:none;text-align:center;box-sizing:border-box;outline:0;margin:0;position:relative;transition:var(--el-transition-all);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding:8px 15px;font-size:var(--el-font-size-base);border-radius:0}.el-checkbox-button__inner.is-round{padding:8px 15px}.el-checkbox-button__inner:hover{color:var(--el-color-primary)}.el-checkbox-button__inner [class*=el-icon-]{line-height:.9}.el-checkbox-button__inner [class*=el-icon-]+span{margin-left:5px}.el-checkbox-button__original{opacity:0;outline:0;position:absolute;margin:0;z-index:-1}.el-checkbox-button.is-checked .el-checkbox-button__inner{color:var(--el-checkbox-button-checked-text-color);background-color:var(--el-checkbox-button-checked-bg-color);border-color:var(--el-checkbox-button-checked-border-color);box-shadow:-1px 0 0 0 var(--el-color-primary-light-7)}.el-checkbox-button.is-checked:first-child .el-checkbox-button__inner{border-left-color:var(--el-checkbox-button-checked-border-color)}.el-checkbox-button.is-disabled .el-checkbox-button__inner{color:var(--el-disabled-text-color);cursor:not-allowed;background-image:none;background-color:var(--el-button-disabled-bg-color,var(--el-fill-color-blank));border-color:var(--el-button-disabled-border-color,var(--el-border-color-light));box-shadow:none}.el-checkbox-button.is-disabled:first-child .el-checkbox-button__inner{border-left-color:var(--el-button-disabled-border-color,var(--el-border-color-light))}.el-checkbox-button:first-child .el-checkbox-button__inner{border-left:var(--el-border);border-top-left-radius:var(--el-border-radius-base);border-bottom-left-radius:var(--el-border-radius-base);box-shadow:none!important}.el-checkbox-button.is-focus .el-checkbox-button__inner{border-color:var(--el-checkbox-button-checked-border-color)}.el-checkbox-button:last-child .el-checkbox-button__inner{border-top-right-radius:var(--el-border-radius-base);border-bottom-right-radius:var(--el-border-radius-base)}.el-checkbox-button--large .el-checkbox-button__inner{padding:12px 19px;font-size:var(--el-font-size-base);border-radius:0}.el-checkbox-button--large .el-checkbox-button__inner.is-round{padding:12px 19px}.el-checkbox-button--small .el-checkbox-button__inner{padding:5px 11px;font-size:12px;border-radius:0}.el-checkbox-button--small .el-checkbox-button__inner.is-round{padding:5px 11px}.el-checkbox-group{font-size:0;line-height:0}.el-checkbox{--el-checkbox-font-size:14px;--el-checkbox-font-weight:var(--el-font-weight-primary);--el-checkbox-text-color:var(--el-text-color-regular);--el-checkbox-input-height:14px;--el-checkbox-input-width:14px;--el-checkbox-border-radius:var(--el-border-radius-small);--el-checkbox-bg-color:var(--el-fill-color-blank);--el-checkbox-input-border:var(--el-border);--el-checkbox-disabled-border-color:var(--el-border-color);--el-checkbox-disabled-input-fill:var(--el-fill-color-light);--el-checkbox-disabled-icon-color:var(--el-text-color-placeholder);--el-checkbox-disabled-checked-input-fill:var(--el-border-color-extra-light);--el-checkbox-disabled-checked-input-border-color:var(--el-border-color);--el-checkbox-disabled-checked-icon-color:var(--el-text-color-placeholder);--el-checkbox-checked-text-color:var(--el-color-primary);--el-checkbox-checked-input-border-color:var(--el-color-primary);--el-checkbox-checked-bg-color:var(--el-color-primary);--el-checkbox-checked-icon-color:var(--el-color-white);--el-checkbox-input-border-color-hover:var(--el-color-primary)}.el-checkbox{color:var(--el-checkbox-text-color);font-weight:var(--el-checkbox-font-weight);font-size:var(--el-font-size-base);position:relative;cursor:pointer;display:inline-flex;align-items:center;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;margin-right:30px;height:var(--el-checkbox-height,32px)}.el-checkbox.is-disabled{cursor:not-allowed}.el-checkbox.is-bordered{padding:0 15px 0 9px;border-radius:var(--el-border-radius-base);border:var(--el-border);box-sizing:border-box}.el-checkbox.is-bordered.is-checked{border-color:var(--el-color-primary)}.el-checkbox.is-bordered.is-disabled{border-color:var(--el-border-color-lighter)}.el-checkbox.is-bordered.el-checkbox--large{padding:0 19px 0 11px;border-radius:var(--el-border-radius-base)}.el-checkbox.is-bordered.el-checkbox--large .el-checkbox__label{font-size:var(--el-font-size-base)}.el-checkbox.is-bordered.el-checkbox--large .el-checkbox__inner{height:14px;width:14px}.el-checkbox.is-bordered.el-checkbox--small{padding:0 11px 0 7px;border-radius:calc(var(--el-border-radius-base) - 1px)}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__label{font-size:12px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner{height:12px;width:12px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner:after{height:6px;width:2px}.el-checkbox input:focus-visible+.el-checkbox__inner{outline:2px solid var(--el-checkbox-input-border-color-hover);outline-offset:1px;border-radius:var(--el-checkbox-border-radius)}.el-checkbox__input{white-space:nowrap;cursor:pointer;outline:0;display:inline-flex;position:relative}.el-checkbox__input.is-disabled .el-checkbox__inner{background-color:var(--el-checkbox-disabled-input-fill);border-color:var(--el-checkbox-disabled-border-color);cursor:not-allowed}.el-checkbox__input.is-disabled .el-checkbox__inner:after{cursor:not-allowed;border-color:var(--el-checkbox-disabled-icon-color)}.el-checkbox__input.is-disabled.is-checked .el-checkbox__inner{background-color:var(--el-checkbox-disabled-checked-input-fill);border-color:var(--el-checkbox-disabled-checked-input-border-color)}.el-checkbox__input.is-disabled.is-checked .el-checkbox__inner:after{border-color:var(--el-checkbox-disabled-checked-icon-color)}.el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner{background-color:var(--el-checkbox-disabled-checked-input-fill);border-color:var(--el-checkbox-disabled-checked-input-border-color)}.el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner:before{background-color:var(--el-checkbox-disabled-checked-icon-color);border-color:var(--el-checkbox-disabled-checked-icon-color)}.el-checkbox__input.is-disabled+span.el-checkbox__label{color:var(--el-disabled-text-color);cursor:not-allowed}.el-checkbox__input.is-checked .el-checkbox__inner{background-color:var(--el-checkbox-checked-bg-color);border-color:var(--el-checkbox-checked-input-border-color)}.el-checkbox__input.is-checked .el-checkbox__inner:after{transform:rotate(45deg) scaleY(1);border-color:var(--el-checkbox-checked-icon-color)}.el-checkbox__input.is-checked+.el-checkbox__label{color:var(--el-checkbox-checked-text-color)}.el-checkbox__input.is-focus:not(.is-checked) .el-checkbox__original:not(:focus-visible){border-color:var(--el-checkbox-input-border-color-hover)}.el-checkbox__input.is-indeterminate .el-checkbox__inner{background-color:var(--el-checkbox-checked-bg-color);border-color:var(--el-checkbox-checked-input-border-color)}.el-checkbox__input.is-indeterminate .el-checkbox__inner:before{content:"";position:absolute;display:block;background-color:var(--el-checkbox-checked-icon-color);height:2px;transform:scale(.5);left:0;right:0;top:5px}.el-checkbox__input.is-indeterminate .el-checkbox__inner:after{display:none}.el-checkbox__inner{display:inline-block;position:relative;border:var(--el-checkbox-input-border);border-radius:var(--el-checkbox-border-radius);box-sizing:border-box;width:var(--el-checkbox-input-width);height:var(--el-checkbox-input-height);background-color:var(--el-checkbox-bg-color);z-index:var(--el-index-normal);transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46),outline .25s cubic-bezier(.71,-.46,.29,1.46)}.el-checkbox__inner:hover{border-color:var(--el-checkbox-input-border-color-hover)}.el-checkbox__inner:after{box-sizing:content-box;content:"";border:1px solid transparent;border-left:0;border-top:0;height:7px;left:4px;position:absolute;top:1px;transform:rotate(45deg) scaleY(0);width:3px;transition:transform .15s ease-in 50ms;transform-origin:center}.el-checkbox__original{opacity:0;outline:0;position:absolute;margin:0;width:0;height:0;z-index:-1}.el-checkbox__label{display:inline-block;padding-left:8px;line-height:1;font-size:var(--el-checkbox-font-size)}.el-checkbox.el-checkbox--large{height:40px}.el-checkbox.el-checkbox--large .el-checkbox__label{font-size:14px}.el-checkbox.el-checkbox--large .el-checkbox__inner{width:14px;height:14px}.el-checkbox.el-checkbox--small{height:24px}.el-checkbox.el-checkbox--small .el-checkbox__label{font-size:12px}.el-checkbox.el-checkbox--small .el-checkbox__inner{width:12px;height:12px}.el-checkbox.el-checkbox--small .el-checkbox__input.is-indeterminate .el-checkbox__inner:before{top:4px}.el-checkbox.el-checkbox--small .el-checkbox__inner:after{width:2px;height:6px}.el-checkbox:last-of-type{margin-right:0}[class*=el-col-]{box-sizing:border-box}[class*=el-col-].is-guttered{display:block;min-height:1px}.el-col-0,.el-col-0.is-guttered{display:none}.el-col-0{max-width:0%;flex:0 0 0%}.el-col-offset-0{margin-left:0}.el-col-pull-0{position:relative;right:0}.el-col-push-0{position:relative;left:0}.el-col-1{max-width:4.1666666667%;flex:0 0 4.1666666667%}.el-col-offset-1{margin-left:4.1666666667%}.el-col-pull-1{position:relative;right:4.1666666667%}.el-col-push-1{position:relative;left:4.1666666667%}.el-col-2{max-width:8.3333333333%;flex:0 0 8.3333333333%}.el-col-offset-2{margin-left:8.3333333333%}.el-col-pull-2{position:relative;right:8.3333333333%}.el-col-push-2{position:relative;left:8.3333333333%}.el-col-3{max-width:12.5%;flex:0 0 12.5%}.el-col-offset-3{margin-left:12.5%}.el-col-pull-3{position:relative;right:12.5%}.el-col-push-3{position:relative;left:12.5%}.el-col-4{max-width:16.6666666667%;flex:0 0 16.6666666667%}.el-col-offset-4{margin-left:16.6666666667%}.el-col-pull-4{position:relative;right:16.6666666667%}.el-col-push-4{position:relative;left:16.6666666667%}.el-col-5{max-width:20.8333333333%;flex:0 0 20.8333333333%}.el-col-offset-5{margin-left:20.8333333333%}.el-col-pull-5{position:relative;right:20.8333333333%}.el-col-push-5{position:relative;left:20.8333333333%}.el-col-6{max-width:25%;flex:0 0 25%}.el-col-offset-6{margin-left:25%}.el-col-pull-6{position:relative;right:25%}.el-col-push-6{position:relative;left:25%}.el-col-7{max-width:29.1666666667%;flex:0 0 29.1666666667%}.el-col-offset-7{margin-left:29.1666666667%}.el-col-pull-7{position:relative;right:29.1666666667%}.el-col-push-7{position:relative;left:29.1666666667%}.el-col-8{max-width:33.3333333333%;flex:0 0 33.3333333333%}.el-col-offset-8{margin-left:33.3333333333%}.el-col-pull-8{position:relative;right:33.3333333333%}.el-col-push-8{position:relative;left:33.3333333333%}.el-col-9{max-width:37.5%;flex:0 0 37.5%}.el-col-offset-9{margin-left:37.5%}.el-col-pull-9{position:relative;right:37.5%}.el-col-push-9{position:relative;left:37.5%}.el-col-10{max-width:41.6666666667%;flex:0 0 41.6666666667%}.el-col-offset-10{margin-left:41.6666666667%}.el-col-pull-10{position:relative;right:41.6666666667%}.el-col-push-10{position:relative;left:41.6666666667%}.el-col-11{max-width:45.8333333333%;flex:0 0 45.8333333333%}.el-col-offset-11{margin-left:45.8333333333%}.el-col-pull-11{position:relative;right:45.8333333333%}.el-col-push-11{position:relative;left:45.8333333333%}.el-col-12{max-width:50%;flex:0 0 50%}.el-col-offset-12{margin-left:50%}.el-col-pull-12{position:relative;right:50%}.el-col-push-12{position:relative;left:50%}.el-col-13{max-width:54.1666666667%;flex:0 0 54.1666666667%}.el-col-offset-13{margin-left:54.1666666667%}.el-col-pull-13{position:relative;right:54.1666666667%}.el-col-push-13{position:relative;left:54.1666666667%}.el-col-14{max-width:58.3333333333%;flex:0 0 58.3333333333%}.el-col-offset-14{margin-left:58.3333333333%}.el-col-pull-14{position:relative;right:58.3333333333%}.el-col-push-14{position:relative;left:58.3333333333%}.el-col-15{max-width:62.5%;flex:0 0 62.5%}.el-col-offset-15{margin-left:62.5%}.el-col-pull-15{position:relative;right:62.5%}.el-col-push-15{position:relative;left:62.5%}.el-col-16{max-width:66.6666666667%;flex:0 0 66.6666666667%}.el-col-offset-16{margin-left:66.6666666667%}.el-col-pull-16{position:relative;right:66.6666666667%}.el-col-push-16{position:relative;left:66.6666666667%}.el-col-17{max-width:70.8333333333%;flex:0 0 70.8333333333%}.el-col-offset-17{margin-left:70.8333333333%}.el-col-pull-17{position:relative;right:70.8333333333%}.el-col-push-17{position:relative;left:70.8333333333%}.el-col-18{max-width:75%;flex:0 0 75%}.el-col-offset-18{margin-left:75%}.el-col-pull-18{position:relative;right:75%}.el-col-push-18{position:relative;left:75%}.el-col-19{max-width:79.1666666667%;flex:0 0 79.1666666667%}.el-col-offset-19{margin-left:79.1666666667%}.el-col-pull-19{position:relative;right:79.1666666667%}.el-col-push-19{position:relative;left:79.1666666667%}.el-col-20{max-width:83.3333333333%;flex:0 0 83.3333333333%}.el-col-offset-20{margin-left:83.3333333333%}.el-col-pull-20{position:relative;right:83.3333333333%}.el-col-push-20{position:relative;left:83.3333333333%}.el-col-21{max-width:87.5%;flex:0 0 87.5%}.el-col-offset-21{margin-left:87.5%}.el-col-pull-21{position:relative;right:87.5%}.el-col-push-21{position:relative;left:87.5%}.el-col-22{max-width:91.6666666667%;flex:0 0 91.6666666667%}.el-col-offset-22{margin-left:91.6666666667%}.el-col-pull-22{position:relative;right:91.6666666667%}.el-col-push-22{position:relative;left:91.6666666667%}.el-col-23{max-width:95.8333333333%;flex:0 0 95.8333333333%}.el-col-offset-23{margin-left:95.8333333333%}.el-col-pull-23{position:relative;right:95.8333333333%}.el-col-push-23{position:relative;left:95.8333333333%}.el-col-24{max-width:100%;flex:0 0 100%}.el-col-offset-24{margin-left:100%}.el-col-pull-24{position:relative;right:100%}.el-col-push-24{position:relative;left:100%}@media only screen and (max-width:768px){.el-col-xs-0,.el-col-xs-0.is-guttered{display:none}.el-col-xs-0{max-width:0%;flex:0 0 0%}.el-col-xs-offset-0{margin-left:0}.el-col-xs-pull-0{position:relative;right:0}.el-col-xs-push-0{position:relative;left:0}.el-col-xs-1{display:block;max-width:4.1666666667%;flex:0 0 4.1666666667%}.el-col-xs-offset-1{margin-left:4.1666666667%}.el-col-xs-pull-1{position:relative;right:4.1666666667%}.el-col-xs-push-1{position:relative;left:4.1666666667%}.el-col-xs-2{display:block;max-width:8.3333333333%;flex:0 0 8.3333333333%}.el-col-xs-offset-2{margin-left:8.3333333333%}.el-col-xs-pull-2{position:relative;right:8.3333333333%}.el-col-xs-push-2{position:relative;left:8.3333333333%}.el-col-xs-3{display:block;max-width:12.5%;flex:0 0 12.5%}.el-col-xs-offset-3{margin-left:12.5%}.el-col-xs-pull-3{position:relative;right:12.5%}.el-col-xs-push-3{position:relative;left:12.5%}.el-col-xs-4{display:block;max-width:16.6666666667%;flex:0 0 16.6666666667%}.el-col-xs-offset-4{margin-left:16.6666666667%}.el-col-xs-pull-4{position:relative;right:16.6666666667%}.el-col-xs-push-4{position:relative;left:16.6666666667%}.el-col-xs-5{display:block;max-width:20.8333333333%;flex:0 0 20.8333333333%}.el-col-xs-offset-5{margin-left:20.8333333333%}.el-col-xs-pull-5{position:relative;right:20.8333333333%}.el-col-xs-push-5{position:relative;left:20.8333333333%}.el-col-xs-6{display:block;max-width:25%;flex:0 0 25%}.el-col-xs-offset-6{margin-left:25%}.el-col-xs-pull-6{position:relative;right:25%}.el-col-xs-push-6{position:relative;left:25%}.el-col-xs-7{display:block;max-width:29.1666666667%;flex:0 0 29.1666666667%}.el-col-xs-offset-7{margin-left:29.1666666667%}.el-col-xs-pull-7{position:relative;right:29.1666666667%}.el-col-xs-push-7{position:relative;left:29.1666666667%}.el-col-xs-8{display:block;max-width:33.3333333333%;flex:0 0 33.3333333333%}.el-col-xs-offset-8{margin-left:33.3333333333%}.el-col-xs-pull-8{position:relative;right:33.3333333333%}.el-col-xs-push-8{position:relative;left:33.3333333333%}.el-col-xs-9{display:block;max-width:37.5%;flex:0 0 37.5%}.el-col-xs-offset-9{margin-left:37.5%}.el-col-xs-pull-9{position:relative;right:37.5%}.el-col-xs-push-9{position:relative;left:37.5%}.el-col-xs-10{display:block;max-width:41.6666666667%;flex:0 0 41.6666666667%}.el-col-xs-offset-10{margin-left:41.6666666667%}.el-col-xs-pull-10{position:relative;right:41.6666666667%}.el-col-xs-push-10{position:relative;left:41.6666666667%}.el-col-xs-11{display:block;max-width:45.8333333333%;flex:0 0 45.8333333333%}.el-col-xs-offset-11{margin-left:45.8333333333%}.el-col-xs-pull-11{position:relative;right:45.8333333333%}.el-col-xs-push-11{position:relative;left:45.8333333333%}.el-col-xs-12{display:block;max-width:50%;flex:0 0 50%}.el-col-xs-offset-12{margin-left:50%}.el-col-xs-pull-12{position:relative;right:50%}.el-col-xs-push-12{position:relative;left:50%}.el-col-xs-13{display:block;max-width:54.1666666667%;flex:0 0 54.1666666667%}.el-col-xs-offset-13{margin-left:54.1666666667%}.el-col-xs-pull-13{position:relative;right:54.1666666667%}.el-col-xs-push-13{position:relative;left:54.1666666667%}.el-col-xs-14{display:block;max-width:58.3333333333%;flex:0 0 58.3333333333%}.el-col-xs-offset-14{margin-left:58.3333333333%}.el-col-xs-pull-14{position:relative;right:58.3333333333%}.el-col-xs-push-14{position:relative;left:58.3333333333%}.el-col-xs-15{display:block;max-width:62.5%;flex:0 0 62.5%}.el-col-xs-offset-15{margin-left:62.5%}.el-col-xs-pull-15{position:relative;right:62.5%}.el-col-xs-push-15{position:relative;left:62.5%}.el-col-xs-16{display:block;max-width:66.6666666667%;flex:0 0 66.6666666667%}.el-col-xs-offset-16{margin-left:66.6666666667%}.el-col-xs-pull-16{position:relative;right:66.6666666667%}.el-col-xs-push-16{position:relative;left:66.6666666667%}.el-col-xs-17{display:block;max-width:70.8333333333%;flex:0 0 70.8333333333%}.el-col-xs-offset-17{margin-left:70.8333333333%}.el-col-xs-pull-17{position:relative;right:70.8333333333%}.el-col-xs-push-17{position:relative;left:70.8333333333%}.el-col-xs-18{display:block;max-width:75%;flex:0 0 75%}.el-col-xs-offset-18{margin-left:75%}.el-col-xs-pull-18{position:relative;right:75%}.el-col-xs-push-18{position:relative;left:75%}.el-col-xs-19{display:block;max-width:79.1666666667%;flex:0 0 79.1666666667%}.el-col-xs-offset-19{margin-left:79.1666666667%}.el-col-xs-pull-19{position:relative;right:79.1666666667%}.el-col-xs-push-19{position:relative;left:79.1666666667%}.el-col-xs-20{display:block;max-width:83.3333333333%;flex:0 0 83.3333333333%}.el-col-xs-offset-20{margin-left:83.3333333333%}.el-col-xs-pull-20{position:relative;right:83.3333333333%}.el-col-xs-push-20{position:relative;left:83.3333333333%}.el-col-xs-21{display:block;max-width:87.5%;flex:0 0 87.5%}.el-col-xs-offset-21{margin-left:87.5%}.el-col-xs-pull-21{position:relative;right:87.5%}.el-col-xs-push-21{position:relative;left:87.5%}.el-col-xs-22{display:block;max-width:91.6666666667%;flex:0 0 91.6666666667%}.el-col-xs-offset-22{margin-left:91.6666666667%}.el-col-xs-pull-22{position:relative;right:91.6666666667%}.el-col-xs-push-22{position:relative;left:91.6666666667%}.el-col-xs-23{display:block;max-width:95.8333333333%;flex:0 0 95.8333333333%}.el-col-xs-offset-23{margin-left:95.8333333333%}.el-col-xs-pull-23{position:relative;right:95.8333333333%}.el-col-xs-push-23{position:relative;left:95.8333333333%}.el-col-xs-24{display:block;max-width:100%;flex:0 0 100%}.el-col-xs-offset-24{margin-left:100%}.el-col-xs-pull-24{position:relative;right:100%}.el-col-xs-push-24{position:relative;left:100%}}@media only screen and (min-width:768px){.el-col-sm-0,.el-col-sm-0.is-guttered{display:none}.el-col-sm-0{max-width:0%;flex:0 0 0%}.el-col-sm-offset-0{margin-left:0}.el-col-sm-pull-0{position:relative;right:0}.el-col-sm-push-0{position:relative;left:0}.el-col-sm-1{display:block;max-width:4.1666666667%;flex:0 0 4.1666666667%}.el-col-sm-offset-1{margin-left:4.1666666667%}.el-col-sm-pull-1{position:relative;right:4.1666666667%}.el-col-sm-push-1{position:relative;left:4.1666666667%}.el-col-sm-2{display:block;max-width:8.3333333333%;flex:0 0 8.3333333333%}.el-col-sm-offset-2{margin-left:8.3333333333%}.el-col-sm-pull-2{position:relative;right:8.3333333333%}.el-col-sm-push-2{position:relative;left:8.3333333333%}.el-col-sm-3{display:block;max-width:12.5%;flex:0 0 12.5%}.el-col-sm-offset-3{margin-left:12.5%}.el-col-sm-pull-3{position:relative;right:12.5%}.el-col-sm-push-3{position:relative;left:12.5%}.el-col-sm-4{display:block;max-width:16.6666666667%;flex:0 0 16.6666666667%}.el-col-sm-offset-4{margin-left:16.6666666667%}.el-col-sm-pull-4{position:relative;right:16.6666666667%}.el-col-sm-push-4{position:relative;left:16.6666666667%}.el-col-sm-5{display:block;max-width:20.8333333333%;flex:0 0 20.8333333333%}.el-col-sm-offset-5{margin-left:20.8333333333%}.el-col-sm-pull-5{position:relative;right:20.8333333333%}.el-col-sm-push-5{position:relative;left:20.8333333333%}.el-col-sm-6{display:block;max-width:25%;flex:0 0 25%}.el-col-sm-offset-6{margin-left:25%}.el-col-sm-pull-6{position:relative;right:25%}.el-col-sm-push-6{position:relative;left:25%}.el-col-sm-7{display:block;max-width:29.1666666667%;flex:0 0 29.1666666667%}.el-col-sm-offset-7{margin-left:29.1666666667%}.el-col-sm-pull-7{position:relative;right:29.1666666667%}.el-col-sm-push-7{position:relative;left:29.1666666667%}.el-col-sm-8{display:block;max-width:33.3333333333%;flex:0 0 33.3333333333%}.el-col-sm-offset-8{margin-left:33.3333333333%}.el-col-sm-pull-8{position:relative;right:33.3333333333%}.el-col-sm-push-8{position:relative;left:33.3333333333%}.el-col-sm-9{display:block;max-width:37.5%;flex:0 0 37.5%}.el-col-sm-offset-9{margin-left:37.5%}.el-col-sm-pull-9{position:relative;right:37.5%}.el-col-sm-push-9{position:relative;left:37.5%}.el-col-sm-10{display:block;max-width:41.6666666667%;flex:0 0 41.6666666667%}.el-col-sm-offset-10{margin-left:41.6666666667%}.el-col-sm-pull-10{position:relative;right:41.6666666667%}.el-col-sm-push-10{position:relative;left:41.6666666667%}.el-col-sm-11{display:block;max-width:45.8333333333%;flex:0 0 45.8333333333%}.el-col-sm-offset-11{margin-left:45.8333333333%}.el-col-sm-pull-11{position:relative;right:45.8333333333%}.el-col-sm-push-11{position:relative;left:45.8333333333%}.el-col-sm-12{display:block;max-width:50%;flex:0 0 50%}.el-col-sm-offset-12{margin-left:50%}.el-col-sm-pull-12{position:relative;right:50%}.el-col-sm-push-12{position:relative;left:50%}.el-col-sm-13{display:block;max-width:54.1666666667%;flex:0 0 54.1666666667%}.el-col-sm-offset-13{margin-left:54.1666666667%}.el-col-sm-pull-13{position:relative;right:54.1666666667%}.el-col-sm-push-13{position:relative;left:54.1666666667%}.el-col-sm-14{display:block;max-width:58.3333333333%;flex:0 0 58.3333333333%}.el-col-sm-offset-14{margin-left:58.3333333333%}.el-col-sm-pull-14{position:relative;right:58.3333333333%}.el-col-sm-push-14{position:relative;left:58.3333333333%}.el-col-sm-15{display:block;max-width:62.5%;flex:0 0 62.5%}.el-col-sm-offset-15{margin-left:62.5%}.el-col-sm-pull-15{position:relative;right:62.5%}.el-col-sm-push-15{position:relative;left:62.5%}.el-col-sm-16{display:block;max-width:66.6666666667%;flex:0 0 66.6666666667%}.el-col-sm-offset-16{margin-left:66.6666666667%}.el-col-sm-pull-16{position:relative;right:66.6666666667%}.el-col-sm-push-16{position:relative;left:66.6666666667%}.el-col-sm-17{display:block;max-width:70.8333333333%;flex:0 0 70.8333333333%}.el-col-sm-offset-17{margin-left:70.8333333333%}.el-col-sm-pull-17{position:relative;right:70.8333333333%}.el-col-sm-push-17{position:relative;left:70.8333333333%}.el-col-sm-18{display:block;max-width:75%;flex:0 0 75%}.el-col-sm-offset-18{margin-left:75%}.el-col-sm-pull-18{position:relative;right:75%}.el-col-sm-push-18{position:relative;left:75%}.el-col-sm-19{display:block;max-width:79.1666666667%;flex:0 0 79.1666666667%}.el-col-sm-offset-19{margin-left:79.1666666667%}.el-col-sm-pull-19{position:relative;right:79.1666666667%}.el-col-sm-push-19{position:relative;left:79.1666666667%}.el-col-sm-20{display:block;max-width:83.3333333333%;flex:0 0 83.3333333333%}.el-col-sm-offset-20{margin-left:83.3333333333%}.el-col-sm-pull-20{position:relative;right:83.3333333333%}.el-col-sm-push-20{position:relative;left:83.3333333333%}.el-col-sm-21{display:block;max-width:87.5%;flex:0 0 87.5%}.el-col-sm-offset-21{margin-left:87.5%}.el-col-sm-pull-21{position:relative;right:87.5%}.el-col-sm-push-21{position:relative;left:87.5%}.el-col-sm-22{display:block;max-width:91.6666666667%;flex:0 0 91.6666666667%}.el-col-sm-offset-22{margin-left:91.6666666667%}.el-col-sm-pull-22{position:relative;right:91.6666666667%}.el-col-sm-push-22{position:relative;left:91.6666666667%}.el-col-sm-23{display:block;max-width:95.8333333333%;flex:0 0 95.8333333333%}.el-col-sm-offset-23{margin-left:95.8333333333%}.el-col-sm-pull-23{position:relative;right:95.8333333333%}.el-col-sm-push-23{position:relative;left:95.8333333333%}.el-col-sm-24{display:block;max-width:100%;flex:0 0 100%}.el-col-sm-offset-24{margin-left:100%}.el-col-sm-pull-24{position:relative;right:100%}.el-col-sm-push-24{position:relative;left:100%}}@media only screen and (min-width:992px){.el-col-md-0,.el-col-md-0.is-guttered{display:none}.el-col-md-0{max-width:0%;flex:0 0 0%}.el-col-md-offset-0{margin-left:0}.el-col-md-pull-0{position:relative;right:0}.el-col-md-push-0{position:relative;left:0}.el-col-md-1{display:block;max-width:4.1666666667%;flex:0 0 4.1666666667%}.el-col-md-offset-1{margin-left:4.1666666667%}.el-col-md-pull-1{position:relative;right:4.1666666667%}.el-col-md-push-1{position:relative;left:4.1666666667%}.el-col-md-2{display:block;max-width:8.3333333333%;flex:0 0 8.3333333333%}.el-col-md-offset-2{margin-left:8.3333333333%}.el-col-md-pull-2{position:relative;right:8.3333333333%}.el-col-md-push-2{position:relative;left:8.3333333333%}.el-col-md-3{display:block;max-width:12.5%;flex:0 0 12.5%}.el-col-md-offset-3{margin-left:12.5%}.el-col-md-pull-3{position:relative;right:12.5%}.el-col-md-push-3{position:relative;left:12.5%}.el-col-md-4{display:block;max-width:16.6666666667%;flex:0 0 16.6666666667%}.el-col-md-offset-4{margin-left:16.6666666667%}.el-col-md-pull-4{position:relative;right:16.6666666667%}.el-col-md-push-4{position:relative;left:16.6666666667%}.el-col-md-5{display:block;max-width:20.8333333333%;flex:0 0 20.8333333333%}.el-col-md-offset-5{margin-left:20.8333333333%}.el-col-md-pull-5{position:relative;right:20.8333333333%}.el-col-md-push-5{position:relative;left:20.8333333333%}.el-col-md-6{display:block;max-width:25%;flex:0 0 25%}.el-col-md-offset-6{margin-left:25%}.el-col-md-pull-6{position:relative;right:25%}.el-col-md-push-6{position:relative;left:25%}.el-col-md-7{display:block;max-width:29.1666666667%;flex:0 0 29.1666666667%}.el-col-md-offset-7{margin-left:29.1666666667%}.el-col-md-pull-7{position:relative;right:29.1666666667%}.el-col-md-push-7{position:relative;left:29.1666666667%}.el-col-md-8{display:block;max-width:33.3333333333%;flex:0 0 33.3333333333%}.el-col-md-offset-8{margin-left:33.3333333333%}.el-col-md-pull-8{position:relative;right:33.3333333333%}.el-col-md-push-8{position:relative;left:33.3333333333%}.el-col-md-9{display:block;max-width:37.5%;flex:0 0 37.5%}.el-col-md-offset-9{margin-left:37.5%}.el-col-md-pull-9{position:relative;right:37.5%}.el-col-md-push-9{position:relative;left:37.5%}.el-col-md-10{display:block;max-width:41.6666666667%;flex:0 0 41.6666666667%}.el-col-md-offset-10{margin-left:41.6666666667%}.el-col-md-pull-10{position:relative;right:41.6666666667%}.el-col-md-push-10{position:relative;left:41.6666666667%}.el-col-md-11{display:block;max-width:45.8333333333%;flex:0 0 45.8333333333%}.el-col-md-offset-11{margin-left:45.8333333333%}.el-col-md-pull-11{position:relative;right:45.8333333333%}.el-col-md-push-11{position:relative;left:45.8333333333%}.el-col-md-12{display:block;max-width:50%;flex:0 0 50%}.el-col-md-offset-12{margin-left:50%}.el-col-md-pull-12{position:relative;right:50%}.el-col-md-push-12{position:relative;left:50%}.el-col-md-13{display:block;max-width:54.1666666667%;flex:0 0 54.1666666667%}.el-col-md-offset-13{margin-left:54.1666666667%}.el-col-md-pull-13{position:relative;right:54.1666666667%}.el-col-md-push-13{position:relative;left:54.1666666667%}.el-col-md-14{display:block;max-width:58.3333333333%;flex:0 0 58.3333333333%}.el-col-md-offset-14{margin-left:58.3333333333%}.el-col-md-pull-14{position:relative;right:58.3333333333%}.el-col-md-push-14{position:relative;left:58.3333333333%}.el-col-md-15{display:block;max-width:62.5%;flex:0 0 62.5%}.el-col-md-offset-15{margin-left:62.5%}.el-col-md-pull-15{position:relative;right:62.5%}.el-col-md-push-15{position:relative;left:62.5%}.el-col-md-16{display:block;max-width:66.6666666667%;flex:0 0 66.6666666667%}.el-col-md-offset-16{margin-left:66.6666666667%}.el-col-md-pull-16{position:relative;right:66.6666666667%}.el-col-md-push-16{position:relative;left:66.6666666667%}.el-col-md-17{display:block;max-width:70.8333333333%;flex:0 0 70.8333333333%}.el-col-md-offset-17{margin-left:70.8333333333%}.el-col-md-pull-17{position:relative;right:70.8333333333%}.el-col-md-push-17{position:relative;left:70.8333333333%}.el-col-md-18{display:block;max-width:75%;flex:0 0 75%}.el-col-md-offset-18{margin-left:75%}.el-col-md-pull-18{position:relative;right:75%}.el-col-md-push-18{position:relative;left:75%}.el-col-md-19{display:block;max-width:79.1666666667%;flex:0 0 79.1666666667%}.el-col-md-offset-19{margin-left:79.1666666667%}.el-col-md-pull-19{position:relative;right:79.1666666667%}.el-col-md-push-19{position:relative;left:79.1666666667%}.el-col-md-20{display:block;max-width:83.3333333333%;flex:0 0 83.3333333333%}.el-col-md-offset-20{margin-left:83.3333333333%}.el-col-md-pull-20{position:relative;right:83.3333333333%}.el-col-md-push-20{position:relative;left:83.3333333333%}.el-col-md-21{display:block;max-width:87.5%;flex:0 0 87.5%}.el-col-md-offset-21{margin-left:87.5%}.el-col-md-pull-21{position:relative;right:87.5%}.el-col-md-push-21{position:relative;left:87.5%}.el-col-md-22{display:block;max-width:91.6666666667%;flex:0 0 91.6666666667%}.el-col-md-offset-22{margin-left:91.6666666667%}.el-col-md-pull-22{position:relative;right:91.6666666667%}.el-col-md-push-22{position:relative;left:91.6666666667%}.el-col-md-23{display:block;max-width:95.8333333333%;flex:0 0 95.8333333333%}.el-col-md-offset-23{margin-left:95.8333333333%}.el-col-md-pull-23{position:relative;right:95.8333333333%}.el-col-md-push-23{position:relative;left:95.8333333333%}.el-col-md-24{display:block;max-width:100%;flex:0 0 100%}.el-col-md-offset-24{margin-left:100%}.el-col-md-pull-24{position:relative;right:100%}.el-col-md-push-24{position:relative;left:100%}}@media only screen and (min-width:1200px){.el-col-lg-0,.el-col-lg-0.is-guttered{display:none}.el-col-lg-0{max-width:0%;flex:0 0 0%}.el-col-lg-offset-0{margin-left:0}.el-col-lg-pull-0{position:relative;right:0}.el-col-lg-push-0{position:relative;left:0}.el-col-lg-1{display:block;max-width:4.1666666667%;flex:0 0 4.1666666667%}.el-col-lg-offset-1{margin-left:4.1666666667%}.el-col-lg-pull-1{position:relative;right:4.1666666667%}.el-col-lg-push-1{position:relative;left:4.1666666667%}.el-col-lg-2{display:block;max-width:8.3333333333%;flex:0 0 8.3333333333%}.el-col-lg-offset-2{margin-left:8.3333333333%}.el-col-lg-pull-2{position:relative;right:8.3333333333%}.el-col-lg-push-2{position:relative;left:8.3333333333%}.el-col-lg-3{display:block;max-width:12.5%;flex:0 0 12.5%}.el-col-lg-offset-3{margin-left:12.5%}.el-col-lg-pull-3{position:relative;right:12.5%}.el-col-lg-push-3{position:relative;left:12.5%}.el-col-lg-4{display:block;max-width:16.6666666667%;flex:0 0 16.6666666667%}.el-col-lg-offset-4{margin-left:16.6666666667%}.el-col-lg-pull-4{position:relative;right:16.6666666667%}.el-col-lg-push-4{position:relative;left:16.6666666667%}.el-col-lg-5{display:block;max-width:20.8333333333%;flex:0 0 20.8333333333%}.el-col-lg-offset-5{margin-left:20.8333333333%}.el-col-lg-pull-5{position:relative;right:20.8333333333%}.el-col-lg-push-5{position:relative;left:20.8333333333%}.el-col-lg-6{display:block;max-width:25%;flex:0 0 25%}.el-col-lg-offset-6{margin-left:25%}.el-col-lg-pull-6{position:relative;right:25%}.el-col-lg-push-6{position:relative;left:25%}.el-col-lg-7{display:block;max-width:29.1666666667%;flex:0 0 29.1666666667%}.el-col-lg-offset-7{margin-left:29.1666666667%}.el-col-lg-pull-7{position:relative;right:29.1666666667%}.el-col-lg-push-7{position:relative;left:29.1666666667%}.el-col-lg-8{display:block;max-width:33.3333333333%;flex:0 0 33.3333333333%}.el-col-lg-offset-8{margin-left:33.3333333333%}.el-col-lg-pull-8{position:relative;right:33.3333333333%}.el-col-lg-push-8{position:relative;left:33.3333333333%}.el-col-lg-9{display:block;max-width:37.5%;flex:0 0 37.5%}.el-col-lg-offset-9{margin-left:37.5%}.el-col-lg-pull-9{position:relative;right:37.5%}.el-col-lg-push-9{position:relative;left:37.5%}.el-col-lg-10{display:block;max-width:41.6666666667%;flex:0 0 41.6666666667%}.el-col-lg-offset-10{margin-left:41.6666666667%}.el-col-lg-pull-10{position:relative;right:41.6666666667%}.el-col-lg-push-10{position:relative;left:41.6666666667%}.el-col-lg-11{display:block;max-width:45.8333333333%;flex:0 0 45.8333333333%}.el-col-lg-offset-11{margin-left:45.8333333333%}.el-col-lg-pull-11{position:relative;right:45.8333333333%}.el-col-lg-push-11{position:relative;left:45.8333333333%}.el-col-lg-12{display:block;max-width:50%;flex:0 0 50%}.el-col-lg-offset-12{margin-left:50%}.el-col-lg-pull-12{position:relative;right:50%}.el-col-lg-push-12{position:relative;left:50%}.el-col-lg-13{display:block;max-width:54.1666666667%;flex:0 0 54.1666666667%}.el-col-lg-offset-13{margin-left:54.1666666667%}.el-col-lg-pull-13{position:relative;right:54.1666666667%}.el-col-lg-push-13{position:relative;left:54.1666666667%}.el-col-lg-14{display:block;max-width:58.3333333333%;flex:0 0 58.3333333333%}.el-col-lg-offset-14{margin-left:58.3333333333%}.el-col-lg-pull-14{position:relative;right:58.3333333333%}.el-col-lg-push-14{position:relative;left:58.3333333333%}.el-col-lg-15{display:block;max-width:62.5%;flex:0 0 62.5%}.el-col-lg-offset-15{margin-left:62.5%}.el-col-lg-pull-15{position:relative;right:62.5%}.el-col-lg-push-15{position:relative;left:62.5%}.el-col-lg-16{display:block;max-width:66.6666666667%;flex:0 0 66.6666666667%}.el-col-lg-offset-16{margin-left:66.6666666667%}.el-col-lg-pull-16{position:relative;right:66.6666666667%}.el-col-lg-push-16{position:relative;left:66.6666666667%}.el-col-lg-17{display:block;max-width:70.8333333333%;flex:0 0 70.8333333333%}.el-col-lg-offset-17{margin-left:70.8333333333%}.el-col-lg-pull-17{position:relative;right:70.8333333333%}.el-col-lg-push-17{position:relative;left:70.8333333333%}.el-col-lg-18{display:block;max-width:75%;flex:0 0 75%}.el-col-lg-offset-18{margin-left:75%}.el-col-lg-pull-18{position:relative;right:75%}.el-col-lg-push-18{position:relative;left:75%}.el-col-lg-19{display:block;max-width:79.1666666667%;flex:0 0 79.1666666667%}.el-col-lg-offset-19{margin-left:79.1666666667%}.el-col-lg-pull-19{position:relative;right:79.1666666667%}.el-col-lg-push-19{position:relative;left:79.1666666667%}.el-col-lg-20{display:block;max-width:83.3333333333%;flex:0 0 83.3333333333%}.el-col-lg-offset-20{margin-left:83.3333333333%}.el-col-lg-pull-20{position:relative;right:83.3333333333%}.el-col-lg-push-20{position:relative;left:83.3333333333%}.el-col-lg-21{display:block;max-width:87.5%;flex:0 0 87.5%}.el-col-lg-offset-21{margin-left:87.5%}.el-col-lg-pull-21{position:relative;right:87.5%}.el-col-lg-push-21{position:relative;left:87.5%}.el-col-lg-22{display:block;max-width:91.6666666667%;flex:0 0 91.6666666667%}.el-col-lg-offset-22{margin-left:91.6666666667%}.el-col-lg-pull-22{position:relative;right:91.6666666667%}.el-col-lg-push-22{position:relative;left:91.6666666667%}.el-col-lg-23{display:block;max-width:95.8333333333%;flex:0 0 95.8333333333%}.el-col-lg-offset-23{margin-left:95.8333333333%}.el-col-lg-pull-23{position:relative;right:95.8333333333%}.el-col-lg-push-23{position:relative;left:95.8333333333%}.el-col-lg-24{display:block;max-width:100%;flex:0 0 100%}.el-col-lg-offset-24{margin-left:100%}.el-col-lg-pull-24{position:relative;right:100%}.el-col-lg-push-24{position:relative;left:100%}}@media only screen and (min-width:1920px){.el-col-xl-0,.el-col-xl-0.is-guttered{display:none}.el-col-xl-0{max-width:0%;flex:0 0 0%}.el-col-xl-offset-0{margin-left:0}.el-col-xl-pull-0{position:relative;right:0}.el-col-xl-push-0{position:relative;left:0}.el-col-xl-1{display:block;max-width:4.1666666667%;flex:0 0 4.1666666667%}.el-col-xl-offset-1{margin-left:4.1666666667%}.el-col-xl-pull-1{position:relative;right:4.1666666667%}.el-col-xl-push-1{position:relative;left:4.1666666667%}.el-col-xl-2{display:block;max-width:8.3333333333%;flex:0 0 8.3333333333%}.el-col-xl-offset-2{margin-left:8.3333333333%}.el-col-xl-pull-2{position:relative;right:8.3333333333%}.el-col-xl-push-2{position:relative;left:8.3333333333%}.el-col-xl-3{display:block;max-width:12.5%;flex:0 0 12.5%}.el-col-xl-offset-3{margin-left:12.5%}.el-col-xl-pull-3{position:relative;right:12.5%}.el-col-xl-push-3{position:relative;left:12.5%}.el-col-xl-4{display:block;max-width:16.6666666667%;flex:0 0 16.6666666667%}.el-col-xl-offset-4{margin-left:16.6666666667%}.el-col-xl-pull-4{position:relative;right:16.6666666667%}.el-col-xl-push-4{position:relative;left:16.6666666667%}.el-col-xl-5{display:block;max-width:20.8333333333%;flex:0 0 20.8333333333%}.el-col-xl-offset-5{margin-left:20.8333333333%}.el-col-xl-pull-5{position:relative;right:20.8333333333%}.el-col-xl-push-5{position:relative;left:20.8333333333%}.el-col-xl-6{display:block;max-width:25%;flex:0 0 25%}.el-col-xl-offset-6{margin-left:25%}.el-col-xl-pull-6{position:relative;right:25%}.el-col-xl-push-6{position:relative;left:25%}.el-col-xl-7{display:block;max-width:29.1666666667%;flex:0 0 29.1666666667%}.el-col-xl-offset-7{margin-left:29.1666666667%}.el-col-xl-pull-7{position:relative;right:29.1666666667%}.el-col-xl-push-7{position:relative;left:29.1666666667%}.el-col-xl-8{display:block;max-width:33.3333333333%;flex:0 0 33.3333333333%}.el-col-xl-offset-8{margin-left:33.3333333333%}.el-col-xl-pull-8{position:relative;right:33.3333333333%}.el-col-xl-push-8{position:relative;left:33.3333333333%}.el-col-xl-9{display:block;max-width:37.5%;flex:0 0 37.5%}.el-col-xl-offset-9{margin-left:37.5%}.el-col-xl-pull-9{position:relative;right:37.5%}.el-col-xl-push-9{position:relative;left:37.5%}.el-col-xl-10{display:block;max-width:41.6666666667%;flex:0 0 41.6666666667%}.el-col-xl-offset-10{margin-left:41.6666666667%}.el-col-xl-pull-10{position:relative;right:41.6666666667%}.el-col-xl-push-10{position:relative;left:41.6666666667%}.el-col-xl-11{display:block;max-width:45.8333333333%;flex:0 0 45.8333333333%}.el-col-xl-offset-11{margin-left:45.8333333333%}.el-col-xl-pull-11{position:relative;right:45.8333333333%}.el-col-xl-push-11{position:relative;left:45.8333333333%}.el-col-xl-12{display:block;max-width:50%;flex:0 0 50%}.el-col-xl-offset-12{margin-left:50%}.el-col-xl-pull-12{position:relative;right:50%}.el-col-xl-push-12{position:relative;left:50%}.el-col-xl-13{display:block;max-width:54.1666666667%;flex:0 0 54.1666666667%}.el-col-xl-offset-13{margin-left:54.1666666667%}.el-col-xl-pull-13{position:relative;right:54.1666666667%}.el-col-xl-push-13{position:relative;left:54.1666666667%}.el-col-xl-14{display:block;max-width:58.3333333333%;flex:0 0 58.3333333333%}.el-col-xl-offset-14{margin-left:58.3333333333%}.el-col-xl-pull-14{position:relative;right:58.3333333333%}.el-col-xl-push-14{position:relative;left:58.3333333333%}.el-col-xl-15{display:block;max-width:62.5%;flex:0 0 62.5%}.el-col-xl-offset-15{margin-left:62.5%}.el-col-xl-pull-15{position:relative;right:62.5%}.el-col-xl-push-15{position:relative;left:62.5%}.el-col-xl-16{display:block;max-width:66.6666666667%;flex:0 0 66.6666666667%}.el-col-xl-offset-16{margin-left:66.6666666667%}.el-col-xl-pull-16{position:relative;right:66.6666666667%}.el-col-xl-push-16{position:relative;left:66.6666666667%}.el-col-xl-17{display:block;max-width:70.8333333333%;flex:0 0 70.8333333333%}.el-col-xl-offset-17{margin-left:70.8333333333%}.el-col-xl-pull-17{position:relative;right:70.8333333333%}.el-col-xl-push-17{position:relative;left:70.8333333333%}.el-col-xl-18{display:block;max-width:75%;flex:0 0 75%}.el-col-xl-offset-18{margin-left:75%}.el-col-xl-pull-18{position:relative;right:75%}.el-col-xl-push-18{position:relative;left:75%}.el-col-xl-19{display:block;max-width:79.1666666667%;flex:0 0 79.1666666667%}.el-col-xl-offset-19{margin-left:79.1666666667%}.el-col-xl-pull-19{position:relative;right:79.1666666667%}.el-col-xl-push-19{position:relative;left:79.1666666667%}.el-col-xl-20{display:block;max-width:83.3333333333%;flex:0 0 83.3333333333%}.el-col-xl-offset-20{margin-left:83.3333333333%}.el-col-xl-pull-20{position:relative;right:83.3333333333%}.el-col-xl-push-20{position:relative;left:83.3333333333%}.el-col-xl-21{display:block;max-width:87.5%;flex:0 0 87.5%}.el-col-xl-offset-21{margin-left:87.5%}.el-col-xl-pull-21{position:relative;right:87.5%}.el-col-xl-push-21{position:relative;left:87.5%}.el-col-xl-22{display:block;max-width:91.6666666667%;flex:0 0 91.6666666667%}.el-col-xl-offset-22{margin-left:91.6666666667%}.el-col-xl-pull-22{position:relative;right:91.6666666667%}.el-col-xl-push-22{position:relative;left:91.6666666667%}.el-col-xl-23{display:block;max-width:95.8333333333%;flex:0 0 95.8333333333%}.el-col-xl-offset-23{margin-left:95.8333333333%}.el-col-xl-pull-23{position:relative;right:95.8333333333%}.el-col-xl-push-23{position:relative;left:95.8333333333%}.el-col-xl-24{display:block;max-width:100%;flex:0 0 100%}.el-col-xl-offset-24{margin-left:100%}.el-col-xl-pull-24{position:relative;right:100%}.el-col-xl-push-24{position:relative;left:100%}}.el-collapse{--el-collapse-border-color:var(--el-border-color-lighter);--el-collapse-header-height:48px;--el-collapse-header-bg-color:var(--el-fill-color-blank);--el-collapse-header-text-color:var(--el-text-color-primary);--el-collapse-header-font-size:13px;--el-collapse-content-bg-color:var(--el-fill-color-blank);--el-collapse-content-font-size:13px;--el-collapse-content-text-color:var(--el-text-color-primary);border-top:1px solid var(--el-collapse-border-color);border-bottom:1px solid var(--el-collapse-border-color)}.el-collapse-item.is-disabled .el-collapse-item__header{color:var(--el-text-color-disabled);cursor:not-allowed}.el-collapse-item__header{width:100%;padding:0;border:none;display:flex;align-items:center;height:var(--el-collapse-header-height);line-height:var(--el-collapse-header-height);background-color:var(--el-collapse-header-bg-color);color:var(--el-collapse-header-text-color);cursor:pointer;border-bottom:1px solid var(--el-collapse-border-color);font-size:var(--el-collapse-header-font-size);font-weight:500;transition:border-bottom-color var(--el-transition-duration);outline:0}.el-collapse-item__arrow{margin:0 8px 0 auto;transition:transform var(--el-transition-duration);font-weight:300}.el-collapse-item__arrow.is-active{transform:rotate(90deg)}.el-collapse-item__header.focusing:focus:not(:hover){color:var(--el-color-primary)}.el-collapse-item__header.is-active{border-bottom-color:transparent}.el-collapse-item__wrap{will-change:height;background-color:var(--el-collapse-content-bg-color);overflow:hidden;box-sizing:border-box;border-bottom:1px solid var(--el-collapse-border-color)}.el-collapse-item__content{padding-bottom:25px;font-size:var(--el-collapse-content-font-size);color:var(--el-collapse-content-text-color);line-height:1.7692307692}.el-collapse-item:last-child{margin-bottom:-1px}.el-color-predefine{display:flex;font-size:12px;margin-top:8px;width:280px}.el-color-predefine__colors{display:flex;flex:1;flex-wrap:wrap}.el-color-predefine__color-selector{margin:0 0 8px 8px;width:20px;height:20px;border-radius:4px;cursor:pointer}.el-color-predefine__color-selector:nth-child(10n+1){margin-left:0}.el-color-predefine__color-selector.selected{box-shadow:0 0 3px 2px var(--el-color-primary)}.el-color-predefine__color-selector>div{display:flex;height:100%;border-radius:3px}.el-color-predefine__color-selector.is-alpha{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.el-color-hue-slider{position:relative;box-sizing:border-box;width:280px;height:12px;background-color:red;padding:0 2px;float:right}.el-color-hue-slider__bar{position:relative;background:linear-gradient(to right,red 0,#ff0 17%,#0f0 33%,#0ff,#00f 67%,#f0f 83%,red);height:100%}.el-color-hue-slider__thumb{position:absolute;cursor:pointer;box-sizing:border-box;left:0;top:0;width:4px;height:100%;border-radius:1px;background:#fff;border:1px solid var(--el-border-color-lighter);box-shadow:0 0 2px #0009;z-index:1}.el-color-hue-slider.is-vertical{width:12px;height:180px;padding:2px 0}.el-color-hue-slider.is-vertical .el-color-hue-slider__bar{background:linear-gradient(to bottom,red 0,#ff0 17%,#0f0 33%,#0ff,#00f 67%,#f0f 83%,red)}.el-color-hue-slider.is-vertical .el-color-hue-slider__thumb{left:0;top:0;width:100%;height:4px}.el-color-svpanel{position:relative;width:280px;height:180px}.el-color-svpanel__black,.el-color-svpanel__white{position:absolute;top:0;left:0;right:0;bottom:0}.el-color-svpanel__white{background:linear-gradient(to right,#fff,#fff0)}.el-color-svpanel__black{background:linear-gradient(to top,#000,#0000)}.el-color-svpanel__cursor{position:absolute}.el-color-svpanel__cursor>div{cursor:head;width:4px;height:4px;box-shadow:0 0 0 1.5px #fff,inset 0 0 1px 1px #0000004d,0 0 1px 2px #0006;border-radius:50%;transform:translate(-2px,-2px)}.el-color-alpha-slider{position:relative;box-sizing:border-box;width:280px;height:12px;background-image:linear-gradient(45deg,var(--el-color-picker-alpha-bg-a) 25%,var(--el-color-picker-alpha-bg-b) 25%),linear-gradient(135deg,var(--el-color-picker-alpha-bg-a) 25%,var(--el-color-picker-alpha-bg-b) 25%),linear-gradient(45deg,var(--el-color-picker-alpha-bg-b) 75%,var(--el-color-picker-alpha-bg-a) 75%),linear-gradient(135deg,var(--el-color-picker-alpha-bg-b) 75%,var(--el-color-picker-alpha-bg-a) 75%);background-size:12px 12px;background-position:0 0,6px 0,6px -6px,0 6px}.el-color-alpha-slider__bar{position:relative;background:linear-gradient(to right,rgba(255,255,255,0) 0,var(--el-bg-color) 100%);height:100%}.el-color-alpha-slider__thumb{position:absolute;cursor:pointer;box-sizing:border-box;left:0;top:0;width:4px;height:100%;border-radius:1px;background:#fff;border:1px solid var(--el-border-color-lighter);box-shadow:0 0 2px #0009;z-index:1}.el-color-alpha-slider.is-vertical{width:20px;height:180px}.el-color-alpha-slider.is-vertical .el-color-alpha-slider__bar{background:linear-gradient(to bottom,#fff0 0,#fff)}.el-color-alpha-slider.is-vertical .el-color-alpha-slider__thumb{left:0;top:0;width:100%;height:4px}.el-color-dropdown{width:300px}.el-color-dropdown__main-wrapper{margin-bottom:6px}.el-color-dropdown__main-wrapper:after{content:"";display:table;clear:both}.el-color-dropdown__btns{margin-top:12px;text-align:right}.el-color-dropdown__value{float:left;line-height:26px;font-size:12px;color:#000;width:160px}.el-color-picker{display:inline-block;position:relative;line-height:normal;outline:0}.el-color-picker:hover:not(.is-disabled,.is-focused) .el-color-picker__trigger{border-color:var(--el-border-color-hover)}.el-color-picker:focus-visible:not(.is-disabled) .el-color-picker__trigger{outline:2px solid var(--el-color-primary);outline-offset:1px}.el-color-picker.is-focused .el-color-picker__trigger{border-color:var(--el-color-primary)}.el-color-picker.is-disabled .el-color-picker__trigger{cursor:not-allowed}.el-color-picker--large{height:40px}.el-color-picker--large .el-color-picker__trigger{height:40px;width:40px}.el-color-picker--large .el-color-picker__mask{height:38px;width:38px}.el-color-picker--small{height:24px}.el-color-picker--small .el-color-picker__trigger{height:24px;width:24px}.el-color-picker--small .el-color-picker__mask{height:22px;width:22px}.el-color-picker--small .el-color-picker__empty,.el-color-picker--small .el-color-picker__icon{transform:scale(.8)}.el-color-picker__mask{height:30px;width:30px;border-radius:4px;position:absolute;top:1px;left:1px;z-index:1;cursor:not-allowed;background-color:#ffffffb3}.el-color-picker__trigger{display:inline-flex;justify-content:center;align-items:center;box-sizing:border-box;height:32px;width:32px;padding:4px;border:1px solid var(--el-border-color);border-radius:4px;font-size:0;position:relative;cursor:pointer}.el-color-picker__color{position:relative;display:block;box-sizing:border-box;border:1px solid var(--el-text-color-secondary);border-radius:var(--el-border-radius-small);width:100%;height:100%;text-align:center}.el-color-picker__color.is-alpha{background-image:linear-gradient(45deg,var(--el-color-picker-alpha-bg-a) 25%,var(--el-color-picker-alpha-bg-b) 25%),linear-gradient(135deg,var(--el-color-picker-alpha-bg-a) 25%,var(--el-color-picker-alpha-bg-b) 25%),linear-gradient(45deg,var(--el-color-picker-alpha-bg-b) 75%,var(--el-color-picker-alpha-bg-a) 75%),linear-gradient(135deg,var(--el-color-picker-alpha-bg-b) 75%,var(--el-color-picker-alpha-bg-a) 75%);background-size:12px 12px;background-position:0 0,6px 0,6px -6px,0 6px}.el-color-picker__color-inner{display:inline-flex;justify-content:center;align-items:center;width:100%;height:100%}.el-color-picker .el-color-picker__empty{font-size:12px;color:var(--el-text-color-secondary)}.el-color-picker .el-color-picker__icon{display:inline-flex;justify-content:center;align-items:center;color:#fff;font-size:12px}.el-color-picker__panel{position:absolute;z-index:10;padding:6px;box-sizing:content-box;background-color:#fff;border-radius:var(--el-border-radius-base);box-shadow:var(--el-box-shadow-light)}.el-color-picker__panel.el-popper{border:1px solid var(--el-border-color-lighter)}.el-color-picker,.el-color-picker__panel{--el-color-picker-alpha-bg-a:#ccc;--el-color-picker-alpha-bg-b:transparent}.dark .el-color-picker,.dark .el-color-picker__panel{--el-color-picker-alpha-bg-a:#333333}.el-container{display:flex;flex-direction:row;flex:1;flex-basis:auto;box-sizing:border-box;min-width:0}.el-container.is-vertical{flex-direction:column}.el-date-table{font-size:12px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.el-date-table.is-week-mode .el-date-table__row:hover .el-date-table-cell{background-color:var(--el-datepicker-inrange-bg-color)}.el-date-table.is-week-mode .el-date-table__row:hover td.available:hover{color:var(--el-datepicker-text-color)}.el-date-table.is-week-mode .el-date-table__row:hover td:first-child .el-date-table-cell{margin-left:5px;border-top-left-radius:15px;border-bottom-left-radius:15px}.el-date-table.is-week-mode .el-date-table__row:hover td:last-child .el-date-table-cell{margin-right:5px;border-top-right-radius:15px;border-bottom-right-radius:15px}.el-date-table.is-week-mode .el-date-table__row.current .el-date-table-cell{background-color:var(--el-datepicker-inrange-bg-color)}.el-date-table td{width:32px;height:30px;padding:4px 0;box-sizing:border-box;text-align:center;cursor:pointer;position:relative}.el-date-table td .el-date-table-cell{height:30px;padding:3px 0;box-sizing:border-box}.el-date-table td .el-date-table-cell .el-date-table-cell__text{width:24px;height:24px;display:block;margin:0 auto;line-height:24px;position:absolute;left:50%;transform:translate(-50%);border-radius:50%}.el-date-table td.next-month,.el-date-table td.prev-month{color:var(--el-datepicker-off-text-color)}.el-date-table td.today{position:relative}.el-date-table td.today .el-date-table-cell__text{color:var(--el-color-primary);font-weight:700}.el-date-table td.today.end-date .el-date-table-cell__text,.el-date-table td.today.start-date .el-date-table-cell__text{color:#fff}.el-date-table td.available:hover{color:var(--el-datepicker-hover-text-color)}.el-date-table td.in-range .el-date-table-cell{background-color:var(--el-datepicker-inrange-bg-color)}.el-date-table td.in-range .el-date-table-cell:hover{background-color:var(--el-datepicker-inrange-hover-bg-color)}.el-date-table td.current:not(.disabled) .el-date-table-cell__text{color:#fff;background-color:var(--el-datepicker-active-color)}.el-date-table td.current:not(.disabled):focus-visible .el-date-table-cell__text{outline:2px solid var(--el-datepicker-active-color);outline-offset:1px}.el-date-table td.end-date .el-date-table-cell,.el-date-table td.start-date .el-date-table-cell{color:#fff}.el-date-table td.end-date .el-date-table-cell__text,.el-date-table td.start-date .el-date-table-cell__text{background-color:var(--el-datepicker-active-color)}.el-date-table td.start-date .el-date-table-cell{margin-left:5px;border-top-left-radius:15px;border-bottom-left-radius:15px}.el-date-table td.end-date .el-date-table-cell{margin-right:5px;border-top-right-radius:15px;border-bottom-right-radius:15px}.el-date-table td.disabled .el-date-table-cell{background-color:var(--el-fill-color-light);opacity:1;cursor:not-allowed;color:var(--el-text-color-placeholder)}.el-date-table td.selected .el-date-table-cell{margin-left:5px;margin-right:5px;background-color:var(--el-datepicker-inrange-bg-color);border-radius:15px}.el-date-table td.selected .el-date-table-cell:hover{background-color:var(--el-datepicker-inrange-hover-bg-color)}.el-date-table td.selected .el-date-table-cell__text{background-color:var(--el-datepicker-active-color);color:#fff;border-radius:15px}.el-date-table td.week{font-size:80%;color:var(--el-datepicker-header-text-color)}.el-date-table td:focus{outline:0}.el-date-table th{padding:5px;color:var(--el-datepicker-header-text-color);font-weight:400;border-bottom:solid 1px var(--el-border-color-lighter)}.el-month-table{font-size:12px;margin:-1px;border-collapse:collapse}.el-month-table td{text-align:center;padding:8px 0;cursor:pointer}.el-month-table td div{height:48px;padding:6px 0;box-sizing:border-box}.el-month-table td.today .cell{color:var(--el-color-primary);font-weight:700}.el-month-table td.today.end-date .cell,.el-month-table td.today.start-date .cell{color:#fff}.el-month-table td.disabled .cell{background-color:var(--el-fill-color-light);cursor:not-allowed;color:var(--el-text-color-placeholder)}.el-month-table td.disabled .cell:hover{color:var(--el-text-color-placeholder)}.el-month-table td .cell{width:60px;height:36px;display:block;line-height:36px;color:var(--el-datepicker-text-color);margin:0 auto;border-radius:18px}.el-month-table td .cell:hover{color:var(--el-datepicker-hover-text-color)}.el-month-table td.in-range div{background-color:var(--el-datepicker-inrange-bg-color)}.el-month-table td.in-range div:hover{background-color:var(--el-datepicker-inrange-hover-bg-color)}.el-month-table td.end-date div,.el-month-table td.start-date div{color:#fff}.el-month-table td.end-date .cell,.el-month-table td.start-date .cell{color:#fff;background-color:var(--el-datepicker-active-color)}.el-month-table td.start-date div{border-top-left-radius:24px;border-bottom-left-radius:24px}.el-month-table td.end-date div{border-top-right-radius:24px;border-bottom-right-radius:24px}.el-month-table td.current:not(.disabled) .cell{color:var(--el-datepicker-active-color)}.el-month-table td:focus-visible{outline:0}.el-month-table td:focus-visible .cell{outline:2px solid var(--el-datepicker-active-color)}.el-year-table{font-size:12px;margin:-1px;border-collapse:collapse}.el-year-table .el-icon{color:var(--el-datepicker-icon-color)}.el-year-table td{text-align:center;padding:20px 3px;cursor:pointer}.el-year-table td.today .cell{color:var(--el-color-primary);font-weight:700}.el-year-table td.disabled .cell{background-color:var(--el-fill-color-light);cursor:not-allowed;color:var(--el-text-color-placeholder)}.el-year-table td.disabled .cell:hover{color:var(--el-text-color-placeholder)}.el-year-table td .cell{width:48px;height:36px;display:block;line-height:36px;color:var(--el-datepicker-text-color);border-radius:18px;margin:0 auto}.el-year-table td .cell:hover{color:var(--el-datepicker-hover-text-color)}.el-year-table td.current:not(.disabled) .cell{color:var(--el-datepicker-active-color)}.el-year-table td:focus-visible{outline:0}.el-year-table td:focus-visible .cell{outline:2px solid var(--el-datepicker-active-color)}.el-time-spinner.has-seconds .el-time-spinner__wrapper{width:33.3%}.el-time-spinner__wrapper{max-height:192px;overflow:auto;display:inline-block;width:50%;vertical-align:top;position:relative}.el-time-spinner__wrapper.el-scrollbar__wrap:not(.el-scrollbar__wrap--hidden-default){padding-bottom:15px}.el-time-spinner__wrapper.is-arrow{box-sizing:border-box;text-align:center;overflow:hidden}.el-time-spinner__wrapper.is-arrow .el-time-spinner__list{transform:translateY(-32px)}.el-time-spinner__wrapper.is-arrow .el-time-spinner__item:hover:not(.is-disabled):not(.is-active){background:var(--el-fill-color-light);cursor:default}.el-time-spinner__arrow{font-size:12px;color:var(--el-text-color-secondary);position:absolute;left:0;width:100%;z-index:var(--el-index-normal);text-align:center;height:30px;line-height:30px;cursor:pointer}.el-time-spinner__arrow:hover{color:var(--el-color-primary)}.el-time-spinner__arrow.arrow-up{top:10px}.el-time-spinner__arrow.arrow-down{bottom:10px}.el-time-spinner__input.el-input{width:70%}.el-time-spinner__input.el-input .el-input__inner{padding:0;text-align:center}.el-time-spinner__list{padding:0;margin:0;list-style:none;text-align:center}.el-time-spinner__list:after,.el-time-spinner__list:before{content:"";display:block;width:100%;height:80px}.el-time-spinner__item{height:32px;line-height:32px;font-size:12px;color:var(--el-text-color-regular)}.el-time-spinner__item:hover:not(.is-disabled):not(.is-active){background:var(--el-fill-color-light);cursor:pointer}.el-time-spinner__item.is-active:not(.is-disabled){color:var(--el-text-color-primary);font-weight:700}.el-time-spinner__item.is-disabled{color:var(--el-text-color-placeholder);cursor:not-allowed}.el-picker__popper{--el-datepicker-border-color:var(--el-disabled-border-color)}.el-picker__popper.el-popper{background:var(--el-bg-color-overlay);border:1px solid var(--el-datepicker-border-color);box-shadow:var(--el-box-shadow-light)}.el-picker__popper.el-popper .el-popper__arrow:before{border:1px solid var(--el-datepicker-border-color)}.el-picker__popper.el-popper[data-popper-placement^=top] .el-popper__arrow:before{border-top-color:transparent;border-left-color:transparent}.el-picker__popper.el-popper[data-popper-placement^=bottom] .el-popper__arrow:before{border-bottom-color:transparent;border-right-color:transparent}.el-picker__popper.el-popper[data-popper-placement^=left] .el-popper__arrow:before{border-left-color:transparent;border-bottom-color:transparent}.el-picker__popper.el-popper[data-popper-placement^=right] .el-popper__arrow:before{border-right-color:transparent;border-top-color:transparent}.el-date-editor{--el-date-editor-width:220px;--el-date-editor-monthrange-width:300px;--el-date-editor-daterange-width:350px;--el-date-editor-datetimerange-width:400px;--el-input-text-color:var(--el-text-color-regular);--el-input-border:var(--el-border);--el-input-hover-border:var(--el-border-color-hover);--el-input-focus-border:var(--el-color-primary);--el-input-transparent-border:0 0 0 1px transparent inset;--el-input-border-color:var(--el-border-color);--el-input-border-radius:var(--el-border-radius-base);--el-input-bg-color:var(--el-fill-color-blank);--el-input-icon-color:var(--el-text-color-placeholder);--el-input-placeholder-color:var(--el-text-color-placeholder);--el-input-hover-border-color:var(--el-border-color-hover);--el-input-clear-hover-color:var(--el-text-color-secondary);--el-input-focus-border-color:var(--el-color-primary);--el-input-width:100%;position:relative;text-align:left;vertical-align:middle}.el-date-editor.el-input__wrapper{box-shadow:0 0 0 1px var(--el-input-border-color,var(--el-border-color)) inset}.el-date-editor.el-input__wrapper:hover{box-shadow:0 0 0 1px var(--el-input-hover-border-color) inset}.el-date-editor.el-input,.el-date-editor.el-input__wrapper{width:var(--el-date-editor-width);height:var(--el-input-height,var(--el-component-size))}.el-date-editor--monthrange{--el-date-editor-width:var(--el-date-editor-monthrange-width)}.el-date-editor--daterange,.el-date-editor--timerange{--el-date-editor-width:var(--el-date-editor-daterange-width)}.el-date-editor--datetimerange{--el-date-editor-width:var(--el-date-editor-datetimerange-width)}.el-date-editor--dates .el-input__wrapper{text-overflow:ellipsis;white-space:nowrap}.el-date-editor .close-icon,.el-date-editor .clear-icon{cursor:pointer}.el-date-editor .clear-icon:hover{color:var(--el-text-color-secondary)}.el-date-editor .el-range__icon{height:inherit;font-size:14px;color:var(--el-text-color-placeholder);float:left}.el-date-editor .el-range__icon svg{vertical-align:middle}.el-date-editor .el-range-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;outline:0;display:inline-block;height:30px;line-height:30px;margin:0;padding:0;width:39%;text-align:center;font-size:var(--el-font-size-base);color:var(--el-text-color-regular);background-color:transparent}.el-date-editor .el-range-input::-moz-placeholder{color:var(--el-text-color-placeholder)}.el-date-editor .el-range-input:-ms-input-placeholder{color:var(--el-text-color-placeholder)}.el-date-editor .el-range-input::placeholder{color:var(--el-text-color-placeholder)}.el-date-editor .el-range-separator{flex:1;display:inline-flex;justify-content:center;align-items:center;height:100%;padding:0 5px;margin:0;font-size:14px;word-break:keep-all;color:var(--el-text-color-primary)}.el-date-editor .el-range__close-icon{font-size:14px;color:var(--el-text-color-placeholder);height:inherit;width:unset;cursor:pointer}.el-date-editor .el-range__close-icon:hover{color:var(--el-text-color-secondary)}.el-date-editor .el-range__close-icon svg{vertical-align:middle}.el-date-editor .el-range__close-icon--hidden{opacity:0;visibility:hidden}.el-range-editor.el-input__wrapper{display:inline-flex;align-items:center;padding:0 10px}.el-range-editor.is-active,.el-range-editor.is-active:hover{box-shadow:0 0 0 1px var(--el-input-focus-border-color) inset}.el-range-editor--large{line-height:var(--el-component-size-large)}.el-range-editor--large.el-input__wrapper{height:var(--el-component-size-large)}.el-range-editor--large .el-range-separator{line-height:40px;font-size:14px}.el-range-editor--large .el-range-input{height:38px;line-height:38px;font-size:14px}.el-range-editor--small{line-height:var(--el-component-size-small)}.el-range-editor--small.el-input__wrapper{height:var(--el-component-size-small)}.el-range-editor--small .el-range-separator{line-height:24px;font-size:12px}.el-range-editor--small .el-range-input{height:22px;line-height:22px;font-size:12px}.el-range-editor.is-disabled{background-color:var(--el-disabled-bg-color);border-color:var(--el-disabled-border-color);color:var(--el-disabled-text-color);cursor:not-allowed}.el-range-editor.is-disabled:focus,.el-range-editor.is-disabled:hover{border-color:var(--el-disabled-border-color)}.el-range-editor.is-disabled input{background-color:var(--el-disabled-bg-color);color:var(--el-disabled-text-color);cursor:not-allowed}.el-range-editor.is-disabled input::-moz-placeholder{color:var(--el-text-color-placeholder)}.el-range-editor.is-disabled input:-ms-input-placeholder{color:var(--el-text-color-placeholder)}.el-range-editor.is-disabled input::placeholder{color:var(--el-text-color-placeholder)}.el-range-editor.is-disabled .el-range-separator{color:var(--el-disabled-text-color)}.el-picker-panel{color:var(--el-text-color-regular);background:var(--el-bg-color-overlay);border-radius:var(--el-border-radius-base);line-height:30px}.el-picker-panel .el-time-panel{margin:5px 0;border:solid 1px var(--el-datepicker-border-color);background-color:var(--el-bg-color-overlay);box-shadow:var(--el-box-shadow-light)}.el-picker-panel__body-wrapper:after,.el-picker-panel__body:after{content:"";display:table;clear:both}.el-picker-panel__content{position:relative;margin:15px}.el-picker-panel__footer{border-top:1px solid var(--el-datepicker-inner-border-color);padding:4px 12px;text-align:right;background-color:var(--el-bg-color-overlay);position:relative;font-size:0}.el-picker-panel__shortcut{display:block;width:100%;border:0;background-color:transparent;line-height:28px;font-size:14px;color:var(--el-datepicker-text-color);padding-left:12px;text-align:left;outline:0;cursor:pointer}.el-picker-panel__shortcut:hover{color:var(--el-datepicker-hover-text-color)}.el-picker-panel__shortcut.active{background-color:#e6f1fe;color:var(--el-datepicker-active-color)}.el-picker-panel__btn{border:1px solid var(--el-fill-color-darker);color:var(--el-text-color-primary);line-height:24px;border-radius:2px;padding:0 20px;cursor:pointer;background-color:transparent;outline:0;font-size:12px}.el-picker-panel__btn[disabled]{color:var(--el-text-color-disabled);cursor:not-allowed}.el-picker-panel__icon-btn{font-size:12px;color:var(--el-datepicker-icon-color);border:0;background:0 0;cursor:pointer;outline:0;margin-top:8px}.el-picker-panel__icon-btn:hover{color:var(--el-datepicker-hover-text-color)}.el-picker-panel__icon-btn:focus-visible{color:var(--el-datepicker-hover-text-color)}.el-picker-panel__icon-btn.is-disabled{color:var(--el-text-color-disabled)}.el-picker-panel__icon-btn.is-disabled:hover{cursor:not-allowed}.el-picker-panel__icon-btn .el-icon{cursor:pointer;font-size:inherit}.el-picker-panel__link-btn{vertical-align:middle}.el-picker-panel [slot=sidebar],.el-picker-panel__sidebar{position:absolute;top:0;bottom:0;width:110px;border-right:1px solid var(--el-datepicker-inner-border-color);box-sizing:border-box;padding-top:6px;background-color:var(--el-bg-color-overlay);overflow:auto}.el-picker-panel [slot=sidebar]+.el-picker-panel__body,.el-picker-panel__sidebar+.el-picker-panel__body{margin-left:110px}.el-date-picker{--el-datepicker-text-color:var(--el-text-color-regular);--el-datepicker-off-text-color:var(--el-text-color-placeholder);--el-datepicker-header-text-color:var(--el-text-color-regular);--el-datepicker-icon-color:var(--el-text-color-primary);--el-datepicker-border-color:var(--el-disabled-border-color);--el-datepicker-inner-border-color:var(--el-border-color-light);--el-datepicker-inrange-bg-color:var(--el-border-color-extra-light);--el-datepicker-inrange-hover-bg-color:var(--el-border-color-extra-light);--el-datepicker-active-color:var(--el-color-primary);--el-datepicker-hover-text-color:var(--el-color-primary)}.el-date-picker{width:322px}.el-date-picker.has-sidebar.has-time{width:434px}.el-date-picker.has-sidebar{width:438px}.el-date-picker.has-time .el-picker-panel__body-wrapper{position:relative}.el-date-picker .el-picker-panel__content{width:292px}.el-date-picker table{table-layout:fixed;width:100%}.el-date-picker__editor-wrap{position:relative;display:table-cell;padding:0 5px}.el-date-picker__time-header{position:relative;border-bottom:1px solid var(--el-datepicker-inner-border-color);font-size:12px;padding:8px 5px 5px;display:table;width:100%;box-sizing:border-box}.el-date-picker__header{margin:12px;text-align:center}.el-date-picker__header--bordered{margin-bottom:0;padding-bottom:12px;border-bottom:solid 1px var(--el-border-color-lighter)}.el-date-picker__header--bordered+.el-picker-panel__content{margin-top:0}.el-date-picker__header-label{font-size:16px;font-weight:500;padding:0 5px;line-height:22px;text-align:center;cursor:pointer;color:var(--el-text-color-regular)}.el-date-picker__header-label:hover{color:var(--el-datepicker-hover-text-color)}.el-date-picker__header-label:focus-visible{outline:0;color:var(--el-datepicker-hover-text-color)}.el-date-picker__header-label.active{color:var(--el-datepicker-active-color)}.el-date-picker__prev-btn{float:left}.el-date-picker__next-btn{float:right}.el-date-picker__time-wrap{padding:10px;text-align:center}.el-date-picker__time-label{float:left;cursor:pointer;line-height:30px;margin-left:10px}.el-date-picker .el-time-panel{position:absolute}.el-date-range-picker{--el-datepicker-text-color:var(--el-text-color-regular);--el-datepicker-off-text-color:var(--el-text-color-placeholder);--el-datepicker-header-text-color:var(--el-text-color-regular);--el-datepicker-icon-color:var(--el-text-color-primary);--el-datepicker-border-color:var(--el-disabled-border-color);--el-datepicker-inner-border-color:var(--el-border-color-light);--el-datepicker-inrange-bg-color:var(--el-border-color-extra-light);--el-datepicker-inrange-hover-bg-color:var(--el-border-color-extra-light);--el-datepicker-active-color:var(--el-color-primary);--el-datepicker-hover-text-color:var(--el-color-primary)}.el-date-range-picker{width:646px}.el-date-range-picker.has-sidebar{width:756px}.el-date-range-picker.has-time .el-picker-panel__body-wrapper{position:relative}.el-date-range-picker table{table-layout:fixed;width:100%}.el-date-range-picker .el-picker-panel__body{min-width:513px}.el-date-range-picker .el-picker-panel__content{margin:0}.el-date-range-picker__header{position:relative;text-align:center;height:28px}.el-date-range-picker__header [class*=arrow-left]{float:left}.el-date-range-picker__header [class*=arrow-right]{float:right}.el-date-range-picker__header div{font-size:16px;font-weight:500;margin-right:50px}.el-date-range-picker__content{float:left;width:50%;box-sizing:border-box;margin:0;padding:16px}.el-date-range-picker__content.is-left{border-right:1px solid var(--el-datepicker-inner-border-color)}.el-date-range-picker__content .el-date-range-picker__header div{margin-left:50px;margin-right:50px}.el-date-range-picker__editors-wrap{box-sizing:border-box;display:table-cell}.el-date-range-picker__editors-wrap.is-right{text-align:right}.el-date-range-picker__time-header{position:relative;border-bottom:1px solid var(--el-datepicker-inner-border-color);font-size:12px;padding:8px 5px 5px;display:table;width:100%;box-sizing:border-box}.el-date-range-picker__time-header>.el-icon-arrow-right{font-size:20px;vertical-align:middle;display:table-cell;color:var(--el-datepicker-icon-color)}.el-date-range-picker__time-picker-wrap{position:relative;display:table-cell;padding:0 5px}.el-date-range-picker__time-picker-wrap .el-picker-panel{position:absolute;top:13px;right:0;z-index:1;background:#fff}.el-date-range-picker__time-picker-wrap .el-time-panel{position:absolute}.el-time-range-picker{width:354px;overflow:visible}.el-time-range-picker__content{position:relative;text-align:center;padding:10px;z-index:1}.el-time-range-picker__cell{box-sizing:border-box;margin:0;padding:4px 7px 7px;width:50%;display:inline-block}.el-time-range-picker__header{margin-bottom:5px;text-align:center;font-size:14px}.el-time-range-picker__body{border-radius:2px;border:1px solid var(--el-datepicker-border-color)}.el-time-panel{border-radius:2px;position:relative;width:180px;left:0;z-index:var(--el-index-top);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;box-sizing:content-box}.el-time-panel__content{font-size:0;position:relative;overflow:hidden}.el-time-panel__content:after,.el-time-panel__content:before{content:"";top:50%;position:absolute;margin-top:-16px;height:32px;z-index:-1;left:0;right:0;box-sizing:border-box;padding-top:6px;text-align:left}.el-time-panel__content:after{left:50%;margin-left:12%;margin-right:12%}.el-time-panel__content:before{padding-left:50%;margin-right:12%;margin-left:12%;border-top:1px solid var(--el-border-color-light);border-bottom:1px solid var(--el-border-color-light)}.el-time-panel__content.has-seconds:after{left:66.6666666667%}.el-time-panel__content.has-seconds:before{padding-left:33.3333333333%}.el-time-panel__footer{border-top:1px solid var(--el-timepicker-inner-border-color,var(--el-border-color-light));padding:4px;height:36px;line-height:25px;text-align:right;box-sizing:border-box}.el-time-panel__btn{border:none;line-height:28px;padding:0 5px;margin:0 5px;cursor:pointer;background-color:transparent;outline:0;font-size:12px;color:var(--el-text-color-primary)}.el-time-panel__btn.confirm{font-weight:800;color:var(--el-timepicker-active-color,var(--el-color-primary))}.el-descriptions{--el-descriptions-table-border:1px solid var(--el-border-color-lighter);--el-descriptions-item-bordered-label-background:var(--el-fill-color-light);box-sizing:border-box;font-size:var(--el-font-size-base);color:var(--el-text-color-primary)}.el-descriptions__header{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px}.el-descriptions__title{color:var(--el-text-color-primary);font-size:16px;font-weight:700}.el-descriptions__body{background-color:var(--el-fill-color-blank)}.el-descriptions__body .el-descriptions__table{border-collapse:collapse;width:100%}.el-descriptions__body .el-descriptions__table .el-descriptions__cell{box-sizing:border-box;text-align:left;font-weight:400;line-height:23px;font-size:14px}.el-descriptions__body .el-descriptions__table .el-descriptions__cell.is-left{text-align:left}.el-descriptions__body .el-descriptions__table .el-descriptions__cell.is-center{text-align:center}.el-descriptions__body .el-descriptions__table .el-descriptions__cell.is-right{text-align:right}.el-descriptions__body .el-descriptions__table.is-bordered .el-descriptions__cell{border:var(--el-descriptions-table-border);padding:8px 11px}.el-descriptions__body .el-descriptions__table:not(.is-bordered) .el-descriptions__cell{padding-bottom:12px}.el-descriptions--large{font-size:14px}.el-descriptions--large .el-descriptions__header{margin-bottom:20px}.el-descriptions--large .el-descriptions__header .el-descriptions__title{font-size:16px}.el-descriptions--large .el-descriptions__body .el-descriptions__table .el-descriptions__cell{font-size:14px}.el-descriptions--large .el-descriptions__body .el-descriptions__table.is-bordered .el-descriptions__cell{padding:12px 15px}.el-descriptions--large .el-descriptions__body .el-descriptions__table:not(.is-bordered) .el-descriptions__cell{padding-bottom:16px}.el-descriptions--small{font-size:12px}.el-descriptions--small .el-descriptions__header{margin-bottom:12px}.el-descriptions--small .el-descriptions__header .el-descriptions__title{font-size:14px}.el-descriptions--small .el-descriptions__body .el-descriptions__table .el-descriptions__cell{font-size:12px}.el-descriptions--small .el-descriptions__body .el-descriptions__table.is-bordered .el-descriptions__cell{padding:4px 7px}.el-descriptions--small .el-descriptions__body .el-descriptions__table:not(.is-bordered) .el-descriptions__cell{padding-bottom:8px}.el-descriptions__label.el-descriptions__cell.is-bordered-label{font-weight:700;color:var(--el-text-color-regular);background:var(--el-descriptions-item-bordered-label-background)}.el-descriptions__label:not(.is-bordered-label){color:var(--el-text-color-primary);margin-right:16px}.el-descriptions__label.el-descriptions__cell:not(.is-bordered-label).is-vertical-label{padding-bottom:6px}.el-descriptions__content.el-descriptions__cell.is-bordered-content{color:var(--el-text-color-primary)}.el-descriptions__content:not(.is-bordered-label){color:var(--el-text-color-regular)}.el-descriptions--large .el-descriptions__label:not(.is-bordered-label){margin-right:16px}.el-descriptions--large .el-descriptions__label.el-descriptions__cell:not(.is-bordered-label).is-vertical-label{padding-bottom:8px}.el-descriptions--small .el-descriptions__label:not(.is-bordered-label){margin-right:12px}.el-descriptions--small .el-descriptions__label.el-descriptions__cell:not(.is-bordered-label).is-vertical-label{padding-bottom:4px}:root{--el-popup-modal-bg-color:var(--el-color-black);--el-popup-modal-opacity:.5}.v-modal-enter{-webkit-animation:v-modal-in var(--el-transition-duration-fast) ease;animation:v-modal-in var(--el-transition-duration-fast) ease}.v-modal-leave{-webkit-animation:v-modal-out var(--el-transition-duration-fast) ease forwards;animation:v-modal-out var(--el-transition-duration-fast) ease forwards}@-webkit-keyframes v-modal-in{0%{opacity:0}}@keyframes v-modal-in{0%{opacity:0}}@-webkit-keyframes v-modal-out{to{opacity:0}}@keyframes v-modal-out{to{opacity:0}}.v-modal{position:fixed;left:0;top:0;width:100%;height:100%;opacity:var(--el-popup-modal-opacity);background:var(--el-popup-modal-bg-color)}.el-popup-parent--hidden{overflow:hidden}.el-dialog{--el-dialog-width:50%;--el-dialog-margin-top:15vh;--el-dialog-bg-color:var(--el-bg-color);--el-dialog-box-shadow:var(--el-box-shadow);--el-dialog-title-font-size:var(--el-font-size-large);--el-dialog-content-font-size:14px;--el-dialog-font-line-height:var(--el-font-line-height-primary);--el-dialog-padding-primary:20px;--el-dialog-border-radius:var(--el-border-radius-small);position:relative;margin:var(--el-dialog-margin-top,15vh) auto 50px;background:var(--el-dialog-bg-color);border-radius:var(--el-dialog-border-radius);box-shadow:var(--el-dialog-box-shadow);box-sizing:border-box;width:var(--el-dialog-width,50%)}.el-dialog:focus{outline:0!important}.el-dialog.is-align-center{margin:auto}.el-dialog.is-fullscreen{--el-dialog-width:100%;--el-dialog-margin-top:0;margin-bottom:0;height:100%;overflow:auto}.el-dialog__wrapper{position:fixed;top:0;right:0;bottom:0;left:0;overflow:auto;margin:0}.el-dialog.is-draggable .el-dialog__header{cursor:move;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.el-dialog__header{padding:var(--el-dialog-padding-primary);padding-bottom:10px;margin-right:16px}.el-dialog__headerbtn{position:absolute;top:6px;right:0;padding:0;width:54px;height:54px;background:0 0;border:none;outline:0;cursor:pointer;font-size:var(--el-message-close-size,16px)}.el-dialog__headerbtn .el-dialog__close{color:var(--el-color-info);font-size:inherit}.el-dialog__headerbtn:focus .el-dialog__close,.el-dialog__headerbtn:hover .el-dialog__close{color:var(--el-color-primary)}.el-dialog__title{line-height:var(--el-dialog-font-line-height);font-size:var(--el-dialog-title-font-size);color:var(--el-text-color-primary)}.el-dialog__body{padding:calc(var(--el-dialog-padding-primary) + 10px) var(--el-dialog-padding-primary);color:var(--el-text-color-regular);font-size:var(--el-dialog-content-font-size)}.el-dialog__footer{padding:var(--el-dialog-padding-primary);padding-top:10px;text-align:right;box-sizing:border-box}.el-dialog--center{text-align:center}.el-dialog--center .el-dialog__body{text-align:initial;padding:25px calc(var(--el-dialog-padding-primary) + 5px) 30px}.el-dialog--center .el-dialog__footer{text-align:inherit}.el-overlay-dialog{position:fixed;top:0;right:0;bottom:0;left:0;overflow:auto}.dialog-fade-enter-active{-webkit-animation:modal-fade-in var(--el-transition-duration);animation:modal-fade-in var(--el-transition-duration)}.dialog-fade-enter-active .el-overlay-dialog{-webkit-animation:dialog-fade-in var(--el-transition-duration);animation:dialog-fade-in var(--el-transition-duration)}.dialog-fade-leave-active{-webkit-animation:modal-fade-out var(--el-transition-duration);animation:modal-fade-out var(--el-transition-duration)}.dialog-fade-leave-active .el-overlay-dialog{-webkit-animation:dialog-fade-out var(--el-transition-duration);animation:dialog-fade-out var(--el-transition-duration)}@-webkit-keyframes dialog-fade-in{0%{transform:translate3d(0,-20px,0);opacity:0}to{transform:translateZ(0);opacity:1}}@keyframes dialog-fade-in{0%{transform:translate3d(0,-20px,0);opacity:0}to{transform:translateZ(0);opacity:1}}@-webkit-keyframes dialog-fade-out{0%{transform:translateZ(0);opacity:1}to{transform:translate3d(0,-20px,0);opacity:0}}@keyframes dialog-fade-out{0%{transform:translateZ(0);opacity:1}to{transform:translate3d(0,-20px,0);opacity:0}}@-webkit-keyframes modal-fade-in{0%{opacity:0}to{opacity:1}}@keyframes modal-fade-in{0%{opacity:0}to{opacity:1}}@-webkit-keyframes modal-fade-out{0%{opacity:1}to{opacity:0}}@keyframes modal-fade-out{0%{opacity:1}to{opacity:0}}.el-divider{position:relative}.el-divider--horizontal{display:block;height:1px;width:100%;margin:24px 0;border-top:1px var(--el-border-color) var(--el-border-style)}.el-divider--vertical{display:inline-block;width:1px;height:1em;margin:0 8px;vertical-align:middle;position:relative;border-left:1px var(--el-border-color) var(--el-border-style)}.el-divider__text{position:absolute;background-color:var(--el-bg-color);padding:0 20px;font-weight:500;color:var(--el-text-color-primary);font-size:14px}.el-divider__text.is-left{left:20px;transform:translateY(-50%)}.el-divider__text.is-center{left:50%;transform:translate(-50%) translateY(-50%)}.el-divider__text.is-right{right:20px;transform:translateY(-50%)}.el-drawer{--el-drawer-bg-color:var(--el-dialog-bg-color, var(--el-bg-color));--el-drawer-padding-primary:var(--el-dialog-padding-primary, 20px)}.el-drawer{position:absolute;box-sizing:border-box;background-color:var(--el-drawer-bg-color);display:flex;flex-direction:column;box-shadow:var(--el-box-shadow-dark);overflow:hidden;transition:all var(--el-transition-duration)}.el-drawer .rtl,.el-drawer .ltr,.el-drawer .ttb,.el-drawer .btt{transform:translate(0)}.el-drawer__sr-focus:focus{outline:0!important}.el-drawer__header{align-items:center;color:#72767b;display:flex;margin-bottom:32px;padding:var(--el-drawer-padding-primary);padding-bottom:0}.el-drawer__header>:first-child{flex:1}.el-drawer__title{margin:0;flex:1;line-height:inherit;font-size:1rem}.el-drawer__footer{padding:var(--el-drawer-padding-primary);padding-top:10px;text-align:right}.el-drawer__close-btn{display:inline-flex;border:none;cursor:pointer;font-size:var(--el-font-size-extra-large);color:inherit;background-color:transparent;outline:0}.el-drawer__close-btn:focus i,.el-drawer__close-btn:hover i{color:var(--el-color-primary)}.el-drawer__body{flex:1;padding:var(--el-drawer-padding-primary);overflow:auto}.el-drawer__body>*{box-sizing:border-box}.el-drawer.ltr,.el-drawer.rtl{height:100%;top:0;bottom:0}.el-drawer.btt,.el-drawer.ttb{width:100%;left:0;right:0}.el-drawer.ltr{left:0}.el-drawer.rtl{right:0}.el-drawer.ttb{top:0}.el-drawer.btt{bottom:0}.el-drawer-fade-enter-active,.el-drawer-fade-leave-active{transition:all var(--el-transition-duration)}.el-drawer-fade-enter-active,.el-drawer-fade-enter-from,.el-drawer-fade-enter-to,.el-drawer-fade-leave-active,.el-drawer-fade-leave-from,.el-drawer-fade-leave-to{overflow:hidden!important}.el-drawer-fade-enter-from,.el-drawer-fade-leave-to{opacity:0}.el-drawer-fade-enter-to,.el-drawer-fade-leave-from{opacity:1}.el-drawer-fade-enter-from .rtl,.el-drawer-fade-leave-to .rtl{transform:translate(100%)}.el-drawer-fade-enter-from .ltr,.el-drawer-fade-leave-to .ltr{transform:translate(-100%)}.el-drawer-fade-enter-from .ttb,.el-drawer-fade-leave-to .ttb{transform:translateY(-100%)}.el-drawer-fade-enter-from .btt,.el-drawer-fade-leave-to .btt{transform:translateY(100%)}.el-dropdown{--el-dropdown-menu-box-shadow:var(--el-box-shadow-light);--el-dropdown-menuItem-hover-fill:var(--el-color-primary-light-9);--el-dropdown-menuItem-hover-color:var(--el-color-primary);--el-dropdown-menu-index:10;display:inline-flex;position:relative;color:var(--el-text-color-regular);font-size:var(--el-font-size-base);line-height:1;vertical-align:top}.el-dropdown.is-disabled{color:var(--el-text-color-placeholder);cursor:not-allowed}.el-dropdown__popper{--el-dropdown-menu-box-shadow:var(--el-box-shadow-light);--el-dropdown-menuItem-hover-fill:var(--el-color-primary-light-9);--el-dropdown-menuItem-hover-color:var(--el-color-primary);--el-dropdown-menu-index:10}.el-dropdown__popper.el-popper{background:var(--el-bg-color-overlay);border:1px solid var(--el-border-color-light);box-shadow:var(--el-dropdown-menu-box-shadow)}.el-dropdown__popper.el-popper .el-popper__arrow:before{border:1px solid var(--el-border-color-light)}.el-dropdown__popper.el-popper[data-popper-placement^=top] .el-popper__arrow:before{border-top-color:transparent;border-left-color:transparent}.el-dropdown__popper.el-popper[data-popper-placement^=bottom] .el-popper__arrow:before{border-bottom-color:transparent;border-right-color:transparent}.el-dropdown__popper.el-popper[data-popper-placement^=left] .el-popper__arrow:before{border-left-color:transparent;border-bottom-color:transparent}.el-dropdown__popper.el-popper[data-popper-placement^=right] .el-popper__arrow:before{border-right-color:transparent;border-top-color:transparent}.el-dropdown__popper .el-dropdown-menu{border:none}.el-dropdown__popper .el-dropdown__popper-selfdefine{outline:0}.el-dropdown__popper .el-scrollbar__bar{z-index:calc(var(--el-dropdown-menu-index) + 1)}.el-dropdown__popper .el-dropdown__list{list-style:none;padding:0;margin:0;box-sizing:border-box}.el-dropdown .el-dropdown__caret-button{padding-left:0;padding-right:0;display:inline-flex;justify-content:center;align-items:center;width:32px;border-left:none}.el-dropdown .el-dropdown__caret-button>span{display:inline-flex}.el-dropdown .el-dropdown__caret-button:before{content:"";position:absolute;display:block;width:1px;top:-1px;bottom:-1px;left:0;background:var(--el-overlay-color-lighter)}.el-dropdown .el-dropdown__caret-button.el-button:before{background:var(--el-border-color);opacity:.5}.el-dropdown .el-dropdown__caret-button .el-dropdown__icon{font-size:inherit;padding-left:0}.el-dropdown .el-dropdown-selfdefine{outline:0}.el-dropdown--large .el-dropdown__caret-button{width:40px}.el-dropdown--small .el-dropdown__caret-button{width:24px}.el-dropdown-menu{position:relative;top:0;left:0;z-index:var(--el-dropdown-menu-index);padding:5px 0;margin:0;background-color:var(--el-bg-color-overlay);border:none;border-radius:var(--el-border-radius-base);box-shadow:none;list-style:none}.el-dropdown-menu__item{display:flex;align-items:center;white-space:nowrap;list-style:none;line-height:22px;padding:5px 16px;margin:0;font-size:var(--el-font-size-base);color:var(--el-text-color-regular);cursor:pointer;outline:0}.el-dropdown-menu__item:not(.is-disabled):focus{background-color:var(--el-dropdown-menuItem-hover-fill);color:var(--el-dropdown-menuItem-hover-color)}.el-dropdown-menu__item i{margin-right:5px}.el-dropdown-menu__item--divided{margin:6px 0;border-top:1px solid var(--el-border-color-lighter)}.el-dropdown-menu__item.is-disabled{cursor:not-allowed;color:var(--el-text-color-disabled)}.el-dropdown-menu--large{padding:7px 0}.el-dropdown-menu--large .el-dropdown-menu__item{padding:7px 20px;line-height:22px;font-size:14px}.el-dropdown-menu--large .el-dropdown-menu__item--divided{margin:8px 0}.el-dropdown-menu--small{padding:3px 0}.el-dropdown-menu--small .el-dropdown-menu__item{padding:2px 12px;line-height:20px;font-size:12px}.el-dropdown-menu--small .el-dropdown-menu__item--divided{margin:4px 0}.el-empty{--el-empty-padding:40px 0;--el-empty-image-width:160px;--el-empty-description-margin-top:20px;--el-empty-bottom-margin-top:20px;--el-empty-fill-color-0:var(--el-color-white);--el-empty-fill-color-1:#fcfcfd;--el-empty-fill-color-2:#f8f9fb;--el-empty-fill-color-3:#f7f8fc;--el-empty-fill-color-4:#eeeff3;--el-empty-fill-color-5:#edeef2;--el-empty-fill-color-6:#e9ebef;--el-empty-fill-color-7:#e5e7e9;--el-empty-fill-color-8:#e0e3e9;--el-empty-fill-color-9:#d5d7de;display:flex;justify-content:center;align-items:center;flex-direction:column;text-align:center;box-sizing:border-box;padding:var(--el-empty-padding)}.el-empty__image{width:var(--el-empty-image-width)}.el-empty__image img{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%;height:100%;vertical-align:top;-o-object-fit:contain;object-fit:contain}.el-empty__image svg{color:var(--el-svg-monochrome-grey);fill:currentColor;width:100%;height:100%;vertical-align:top}.el-empty__description{margin-top:var(--el-empty-description-margin-top)}.el-empty__description p{margin:0;font-size:var(--el-font-size-base);color:var(--el-text-color-secondary)}.el-empty__bottom{margin-top:var(--el-empty-bottom-margin-top)}.el-footer{--el-footer-padding:0 20px;--el-footer-height:60px;padding:var(--el-footer-padding);box-sizing:border-box;flex-shrink:0;height:var(--el-footer-height)}.el-form{--el-form-label-font-size:var(--el-font-size-base);--el-form-inline-content-width:220px}.el-form--label-left .el-form-item__label{justify-content:flex-start}.el-form--label-top .el-form-item{display:block}.el-form--label-top .el-form-item .el-form-item__label{display:block;height:auto;text-align:left;margin-bottom:8px;line-height:22px}.el-form--inline .el-form-item{display:inline-flex;vertical-align:middle;margin-right:32px}.el-form--inline.el-form--label-top{display:flex;flex-wrap:wrap}.el-form--inline.el-form--label-top .el-form-item{display:block}.el-form--large.el-form--label-top .el-form-item .el-form-item__label{margin-bottom:12px;line-height:22px}.el-form--default.el-form--label-top .el-form-item .el-form-item__label{margin-bottom:8px;line-height:22px}.el-form--small.el-form--label-top .el-form-item .el-form-item__label{margin-bottom:4px;line-height:20px}.el-form-item{display:flex;--font-size:14px;margin-bottom:18px}.el-form-item .el-form-item{margin-bottom:0}.el-form-item .el-input__validateIcon{display:none}.el-form-item--large{--font-size:14px;--el-form-label-font-size:var(--font-size);margin-bottom:22px}.el-form-item--large .el-form-item__label{height:40px;line-height:40px}.el-form-item--large .el-form-item__content{line-height:40px}.el-form-item--large .el-form-item__error{padding-top:4px}.el-form-item--default{--font-size:14px;--el-form-label-font-size:var(--font-size);margin-bottom:18px}.el-form-item--default .el-form-item__label{height:32px;line-height:32px}.el-form-item--default .el-form-item__content{line-height:32px}.el-form-item--default .el-form-item__error{padding-top:2px}.el-form-item--small{--font-size:12px;--el-form-label-font-size:var(--font-size);margin-bottom:18px}.el-form-item--small .el-form-item__label{height:24px;line-height:24px}.el-form-item--small .el-form-item__content{line-height:24px}.el-form-item--small .el-form-item__error{padding-top:2px}.el-form-item__label-wrap{display:flex}.el-form-item__label{display:inline-flex;justify-content:flex-end;align-items:flex-start;flex:0 0 auto;font-size:var(--el-form-label-font-size);color:var(--el-text-color-regular);height:32px;line-height:32px;padding:0 12px 0 0;box-sizing:border-box}.el-form-item__content{display:flex;flex-wrap:wrap;align-items:center;flex:1;line-height:32px;position:relative;font-size:var(--font-size);min-width:0}.el-form-item__content .el-input-group{vertical-align:top}.el-form-item__error{color:var(--el-color-danger);font-size:12px;line-height:1;padding-top:2px;position:absolute;top:100%;left:0}.el-form-item__error--inline{position:relative;top:auto;left:auto;display:inline-block;margin-left:10px}.el-form-item.is-required:not(.is-no-asterisk).asterisk-left>.el-form-item__label-wrap>.el-form-item__label:before,.el-form-item.is-required:not(.is-no-asterisk).asterisk-left>.el-form-item__label:before{content:"*";color:var(--el-color-danger);margin-right:4px}.el-form-item.is-required:not(.is-no-asterisk).asterisk-right>.el-form-item__label-wrap>.el-form-item__label:after,.el-form-item.is-required:not(.is-no-asterisk).asterisk-right>.el-form-item__label:after{content:"*";color:var(--el-color-danger);margin-left:4px}.el-form-item.is-error .el-select-v2__wrapper.is-focused{border-color:transparent}.el-form-item.is-error .el-select-v2__wrapper,.el-form-item.is-error .el-select-v2__wrapper:focus,.el-form-item.is-error .el-textarea__inner,.el-form-item.is-error .el-textarea__inner:focus{box-shadow:0 0 0 1px var(--el-color-danger) inset}.el-form-item.is-error .el-input__wrapper,.el-form-item.is-error .el-input__wrapper:hover{box-shadow:0 0 0 1px var(--el-color-danger) inset}.el-form-item.is-error .el-input__wrapper.is-focus{box-shadow:0 0 0 1px var(--el-color-danger) inset!important}.el-form-item.is-error .el-select:hover{box-shadow:0 0 0 1px transparent}.el-form-item.is-error .el-select .el-input .el-input__wrapper:hover{box-shadow:0 0 0 1px var(--el-color-danger) inset}.el-form-item.is-error .el-select .el-input.is-focus .el-input__wrapper{box-shadow:0 0 0 1px var(--el-color-danger) inset!important}.el-form-item.is-error .el-input-group__append .el-input__wrapper,.el-form-item.is-error .el-input-group__prepend .el-input__wrapper{box-shadow:0 0 0 1px transparent inset}.el-form-item.is-error .el-input__validateIcon{color:var(--el-color-danger)}.el-form-item--feedback .el-input__validateIcon{display:inline-flex}.el-header{--el-header-padding:0 20px;--el-header-height:60px;padding:var(--el-header-padding);box-sizing:border-box;flex-shrink:0;height:var(--el-header-height)}.el-image-viewer__wrapper{position:fixed;top:0;right:0;bottom:0;left:0}.el-image-viewer__btn{position:absolute;z-index:1;display:flex;align-items:center;justify-content:center;border-radius:50%;opacity:.8;cursor:pointer;box-sizing:border-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.el-image-viewer__btn .el-icon{font-size:inherit;cursor:pointer}.el-image-viewer__close{top:40px;right:40px;width:40px;height:40px;font-size:40px}.el-image-viewer__canvas{position:static;width:100%;height:100%;display:flex;justify-content:center;align-items:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.el-image-viewer__actions{left:50%;bottom:30px;transform:translate(-50%);width:282px;height:44px;padding:0 23px;background-color:var(--el-text-color-regular);border-color:#fff;border-radius:22px}.el-image-viewer__actions__inner{width:100%;height:100%;text-align:justify;cursor:default;font-size:23px;color:#fff;display:flex;align-items:center;justify-content:space-around}.el-image-viewer__prev{top:50%;transform:translateY(-50%);left:40px;width:44px;height:44px;font-size:24px;color:#fff;background-color:var(--el-text-color-regular);border-color:#fff}.el-image-viewer__next{top:50%;transform:translateY(-50%);right:40px;text-indent:2px;width:44px;height:44px;font-size:24px;color:#fff;background-color:var(--el-text-color-regular);border-color:#fff}.el-image-viewer__close{width:44px;height:44px;font-size:24px;color:#fff;background-color:var(--el-text-color-regular);border-color:#fff}.el-image-viewer__mask{position:absolute;width:100%;height:100%;top:0;left:0;opacity:.5;background:#000}.viewer-fade-enter-active{-webkit-animation:viewer-fade-in var(--el-transition-duration);animation:viewer-fade-in var(--el-transition-duration)}.viewer-fade-leave-active{-webkit-animation:viewer-fade-out var(--el-transition-duration);animation:viewer-fade-out var(--el-transition-duration)}@-webkit-keyframes viewer-fade-in{0%{transform:translate3d(0,-20px,0);opacity:0}to{transform:translateZ(0);opacity:1}}@keyframes viewer-fade-in{0%{transform:translate3d(0,-20px,0);opacity:0}to{transform:translateZ(0);opacity:1}}@-webkit-keyframes viewer-fade-out{0%{transform:translateZ(0);opacity:1}to{transform:translate3d(0,-20px,0);opacity:0}}@keyframes viewer-fade-out{0%{transform:translateZ(0);opacity:1}to{transform:translate3d(0,-20px,0);opacity:0}}.el-image__error,.el-image__inner,.el-image__placeholder,.el-image__wrapper{width:100%;height:100%}.el-image{position:relative;display:inline-block;overflow:hidden}.el-image__inner{vertical-align:top;opacity:1}.el-image__inner.is-loading{opacity:0}.el-image__wrapper{position:absolute;top:0;left:0}.el-image__placeholder{background:var(--el-fill-color-light)}.el-image__error{display:flex;justify-content:center;align-items:center;font-size:14px;background:var(--el-fill-color-light);color:var(--el-text-color-placeholder);vertical-align:middle}.el-image__preview{cursor:pointer}.el-input-number{position:relative;display:inline-flex;width:150px;line-height:30px}.el-input-number .el-input__wrapper{padding-left:42px;padding-right:42px}.el-input-number .el-input__inner{-webkit-appearance:none;-moz-appearance:textfield;text-align:center;line-height:1}.el-input-number .el-input__inner::-webkit-inner-spin-button,.el-input-number .el-input__inner::-webkit-outer-spin-button{margin:0;-webkit-appearance:none}.el-input-number__decrease,.el-input-number__increase{display:flex;justify-content:center;align-items:center;height:auto;position:absolute;z-index:1;top:1px;bottom:1px;width:32px;background:var(--el-fill-color-light);color:var(--el-text-color-regular);cursor:pointer;font-size:13px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.el-input-number__decrease:hover,.el-input-number__increase:hover{color:var(--el-color-primary)}.el-input-number__decrease:hover~.el-input:not(.is-disabled) .el-input__wrapper,.el-input-number__increase:hover~.el-input:not(.is-disabled) .el-input__wrapper{box-shadow:0 0 0 1px var(--el-input-focus-border-color,var(--el-color-primary)) inset}.el-input-number__decrease.is-disabled,.el-input-number__increase.is-disabled{color:var(--el-disabled-text-color);cursor:not-allowed}.el-input-number__increase{right:1px;border-radius:0 var(--el-border-radius-base) var(--el-border-radius-base) 0;border-left:var(--el-border)}.el-input-number__decrease{left:1px;border-radius:var(--el-border-radius-base) 0 0 var(--el-border-radius-base);border-right:var(--el-border)}.el-input-number.is-disabled .el-input-number__decrease,.el-input-number.is-disabled .el-input-number__increase{border-color:var(--el-disabled-border-color);color:var(--el-disabled-border-color)}.el-input-number.is-disabled .el-input-number__decrease:hover,.el-input-number.is-disabled .el-input-number__increase:hover{color:var(--el-disabled-border-color);cursor:not-allowed}.el-input-number--large{width:180px;line-height:38px}.el-input-number--large .el-input-number__decrease,.el-input-number--large .el-input-number__increase{width:40px;font-size:14px}.el-input-number--large .el-input__wrapper{padding-left:47px;padding-right:47px}.el-input-number--small{width:120px;line-height:22px}.el-input-number--small .el-input-number__decrease,.el-input-number--small .el-input-number__increase{width:24px;font-size:12px}.el-input-number--small .el-input__wrapper{padding-left:31px;padding-right:31px}.el-input-number--small .el-input-number__decrease [class*=el-icon],.el-input-number--small .el-input-number__increase [class*=el-icon]{transform:scale(.9)}.el-input-number.is-without-controls .el-input__wrapper{padding-left:15px;padding-right:15px}.el-input-number.is-controls-right .el-input__wrapper{padding-left:15px;padding-right:42px}.el-input-number.is-controls-right .el-input-number__decrease,.el-input-number.is-controls-right .el-input-number__increase{--el-input-number-controls-height:15px;height:var(--el-input-number-controls-height);line-height:var(--el-input-number-controls-height)}.el-input-number.is-controls-right .el-input-number__decrease [class*=el-icon],.el-input-number.is-controls-right .el-input-number__increase [class*=el-icon]{transform:scale(.8)}.el-input-number.is-controls-right .el-input-number__increase{bottom:auto;left:auto;border-radius:0 var(--el-border-radius-base) 0 0;border-bottom:var(--el-border)}.el-input-number.is-controls-right .el-input-number__decrease{right:1px;top:auto;left:auto;border-right:none;border-left:var(--el-border);border-radius:0 0 var(--el-border-radius-base) 0}.el-input-number.is-controls-right[class*=large] [class*=decrease],.el-input-number.is-controls-right[class*=large] [class*=increase]{--el-input-number-controls-height:19px}.el-input-number.is-controls-right[class*=small] [class*=decrease],.el-input-number.is-controls-right[class*=small] [class*=increase]{--el-input-number-controls-height:11px}.el-textarea{--el-input-text-color:var(--el-text-color-regular);--el-input-border:var(--el-border);--el-input-hover-border:var(--el-border-color-hover);--el-input-focus-border:var(--el-color-primary);--el-input-transparent-border:0 0 0 1px transparent inset;--el-input-border-color:var(--el-border-color);--el-input-border-radius:var(--el-border-radius-base);--el-input-bg-color:var(--el-fill-color-blank);--el-input-icon-color:var(--el-text-color-placeholder);--el-input-placeholder-color:var(--el-text-color-placeholder);--el-input-hover-border-color:var(--el-border-color-hover);--el-input-clear-hover-color:var(--el-text-color-secondary);--el-input-focus-border-color:var(--el-color-primary);--el-input-width:100%}.el-textarea{position:relative;display:inline-block;width:100%;vertical-align:bottom;font-size:var(--el-font-size-base)}.el-textarea__inner{position:relative;display:block;resize:vertical;padding:5px 11px;line-height:1.5;box-sizing:border-box;width:100%;font-size:inherit;font-family:inherit;color:var(--el-input-text-color,var(--el-text-color-regular));background-color:var(--el-input-bg-color,var(--el-fill-color-blank));background-image:none;-webkit-appearance:none;box-shadow:0 0 0 1px var(--el-input-border-color,var(--el-border-color)) inset;border-radius:var(--el-input-border-radius,var(--el-border-radius-base));transition:var(--el-transition-box-shadow);border:none}.el-textarea__inner::-moz-placeholder{color:var(--el-input-placeholder-color,var(--el-text-color-placeholder))}.el-textarea__inner:-ms-input-placeholder{color:var(--el-input-placeholder-color,var(--el-text-color-placeholder))}.el-textarea__inner::placeholder{color:var(--el-input-placeholder-color,var(--el-text-color-placeholder))}.el-textarea__inner:hover{box-shadow:0 0 0 1px var(--el-input-hover-border-color) inset}.el-textarea__inner:focus{outline:0;box-shadow:0 0 0 1px var(--el-input-focus-border-color) inset}.el-textarea .el-input__count{color:var(--el-color-info);background:var(--el-fill-color-blank);position:absolute;font-size:12px;line-height:14px;bottom:5px;right:10px}.el-textarea.is-disabled .el-textarea__inner{box-shadow:0 0 0 1px var(--el-disabled-border-color) inset;background-color:var(--el-disabled-bg-color);color:var(--el-disabled-text-color);cursor:not-allowed}.el-textarea.is-disabled .el-textarea__inner::-moz-placeholder{color:var(--el-text-color-placeholder)}.el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder{color:var(--el-text-color-placeholder)}.el-textarea.is-disabled .el-textarea__inner::placeholder{color:var(--el-text-color-placeholder)}.el-textarea.is-exceed .el-textarea__inner{box-shadow:0 0 0 1px var(--el-color-danger) inset}.el-textarea.is-exceed .el-input__count{color:var(--el-color-danger)}.el-input{--el-input-text-color:var(--el-text-color-regular);--el-input-border:var(--el-border);--el-input-hover-border:var(--el-border-color-hover);--el-input-focus-border:var(--el-color-primary);--el-input-transparent-border:0 0 0 1px transparent inset;--el-input-border-color:var(--el-border-color);--el-input-border-radius:var(--el-border-radius-base);--el-input-bg-color:var(--el-fill-color-blank);--el-input-icon-color:var(--el-text-color-placeholder);--el-input-placeholder-color:var(--el-text-color-placeholder);--el-input-hover-border-color:var(--el-border-color-hover);--el-input-clear-hover-color:var(--el-text-color-secondary);--el-input-focus-border-color:var(--el-color-primary);--el-input-width:100%}.el-input{--el-input-height:var(--el-component-size);position:relative;font-size:var(--el-font-size-base);display:inline-flex;width:var(--el-input-width);line-height:var(--el-input-height);box-sizing:border-box;vertical-align:middle}.el-input::-webkit-scrollbar{z-index:11;width:6px}.el-input::-webkit-scrollbar:horizontal{height:6px}.el-input::-webkit-scrollbar-thumb{border-radius:5px;width:6px;background:var(--el-text-color-disabled)}.el-input::-webkit-scrollbar-corner{background:var(--el-fill-color-blank)}.el-input::-webkit-scrollbar-track{background:var(--el-fill-color-blank)}.el-input::-webkit-scrollbar-track-piece{background:var(--el-fill-color-blank);width:6px}.el-input .el-input__clear,.el-input .el-input__password{color:var(--el-input-icon-color);font-size:14px;cursor:pointer}.el-input .el-input__clear:hover,.el-input .el-input__password:hover{color:var(--el-input-clear-hover-color)}.el-input .el-input__count{height:100%;display:inline-flex;align-items:center;color:var(--el-color-info);font-size:12px}.el-input .el-input__count .el-input__count-inner{background:var(--el-fill-color-blank);line-height:initial;display:inline-block;padding-left:8px}.el-input__wrapper{display:inline-flex;flex-grow:1;align-items:center;justify-content:center;padding:1px 11px;background-color:var(--el-input-bg-color,var(--el-fill-color-blank));background-image:none;border-radius:var(--el-input-border-radius,var(--el-border-radius-base));cursor:text;transition:var(--el-transition-box-shadow);transform:translateZ(0);box-shadow:0 0 0 1px var(--el-input-border-color,var(--el-border-color)) inset}.el-input__wrapper:hover{box-shadow:0 0 0 1px var(--el-input-hover-border-color) inset}.el-input__wrapper.is-focus{box-shadow:0 0 0 1px var(--el-input-focus-border-color) inset}.el-input__inner{--el-input-inner-height:calc(var(--el-input-height, 32px) - 2px);width:100%;flex-grow:1;-webkit-appearance:none;color:var(--el-input-text-color,var(--el-text-color-regular));font-size:inherit;height:var(--el-input-inner-height);line-height:var(--el-input-inner-height);padding:0;outline:0;border:none;background:0 0;box-sizing:border-box}.el-input__inner:focus{outline:0}.el-input__inner::-moz-placeholder{color:var(--el-input-placeholder-color,var(--el-text-color-placeholder))}.el-input__inner:-ms-input-placeholder{color:var(--el-input-placeholder-color,var(--el-text-color-placeholder))}.el-input__inner::placeholder{color:var(--el-input-placeholder-color,var(--el-text-color-placeholder))}.el-input__inner[type=password]::-ms-reveal{display:none}.el-input__prefix{display:inline-flex;white-space:nowrap;flex-shrink:0;flex-wrap:nowrap;height:100%;text-align:center;color:var(--el-input-icon-color,var(--el-text-color-placeholder));transition:all var(--el-transition-duration);pointer-events:none}.el-input__prefix-inner{pointer-events:all;display:inline-flex;align-items:center;justify-content:center}.el-input__prefix-inner>:last-child{margin-right:8px}.el-input__prefix-inner>:first-child,.el-input__prefix-inner>:first-child.el-input__icon{margin-left:0}.el-input__suffix{display:inline-flex;white-space:nowrap;flex-shrink:0;flex-wrap:nowrap;height:100%;text-align:center;color:var(--el-input-icon-color,var(--el-text-color-placeholder));transition:all var(--el-transition-duration);pointer-events:none}.el-input__suffix-inner{pointer-events:all;display:inline-flex;align-items:center;justify-content:center}.el-input__suffix-inner>:first-child{margin-left:8px}.el-input .el-input__icon{height:inherit;line-height:inherit;display:flex;justify-content:center;align-items:center;transition:all var(--el-transition-duration);margin-left:8px}.el-input__validateIcon{pointer-events:none}.el-input.is-active .el-input__wrapper{box-shadow:0 0 0 1px var(--el-input-focus-color,) inset}.el-input.is-disabled{cursor:not-allowed}.el-input.is-disabled .el-input__wrapper{background-color:var(--el-disabled-bg-color);box-shadow:0 0 0 1px var(--el-disabled-border-color) inset}.el-input.is-disabled .el-input__inner{color:var(--el-disabled-text-color);-webkit-text-fill-color:var(--el-disabled-text-color);cursor:not-allowed}.el-input.is-disabled .el-input__inner::-moz-placeholder{color:var(--el-text-color-placeholder)}.el-input.is-disabled .el-input__inner:-ms-input-placeholder{color:var(--el-text-color-placeholder)}.el-input.is-disabled .el-input__inner::placeholder{color:var(--el-text-color-placeholder)}.el-input.is-disabled .el-input__icon{cursor:not-allowed}.el-input.is-exceed .el-input__wrapper{box-shadow:0 0 0 1px var(--el-color-danger) inset}.el-input.is-exceed .el-input__suffix .el-input__count{color:var(--el-color-danger)}.el-input--large{--el-input-height:var(--el-component-size-large);font-size:14px}.el-input--large .el-input__wrapper{padding:1px 15px}.el-input--large .el-input__inner{--el-input-inner-height:calc(var(--el-input-height, 40px) - 2px)}.el-input--small{--el-input-height:var(--el-component-size-small);font-size:12px}.el-input--small .el-input__wrapper{padding:1px 7px}.el-input--small .el-input__inner{--el-input-inner-height:calc(var(--el-input-height, 24px) - 2px)}.el-input-group{display:inline-flex;width:100%;align-items:stretch}.el-input-group__append,.el-input-group__prepend{background-color:var(--el-fill-color-light);color:var(--el-color-info);position:relative;display:inline-flex;align-items:center;justify-content:center;min-height:100%;border-radius:var(--el-input-border-radius);padding:0 20px;white-space:nowrap}.el-input-group__append:focus,.el-input-group__prepend:focus{outline:0}.el-input-group__append .el-button,.el-input-group__append .el-select,.el-input-group__prepend .el-button,.el-input-group__prepend .el-select{display:inline-block;margin:0 -20px}.el-input-group__append button.el-button,.el-input-group__append button.el-button:hover,.el-input-group__append div.el-select .el-input__wrapper,.el-input-group__append div.el-select:hover .el-input__wrapper,.el-input-group__prepend button.el-button,.el-input-group__prepend button.el-button:hover,.el-input-group__prepend div.el-select .el-input__wrapper,.el-input-group__prepend div.el-select:hover .el-input__wrapper{border-color:transparent;background-color:transparent;color:inherit}.el-input-group__append .el-button,.el-input-group__append .el-input,.el-input-group__prepend .el-button,.el-input-group__prepend .el-input{font-size:inherit}.el-input-group__prepend{border-right:0;border-top-right-radius:0;border-bottom-right-radius:0;box-shadow:1px 0 0 0 var(--el-input-border-color) inset,0 1px 0 0 var(--el-input-border-color) inset,0 -1px 0 0 var(--el-input-border-color) inset}.el-input-group__append{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0;box-shadow:0 1px 0 0 var(--el-input-border-color) inset,0 -1px 0 0 var(--el-input-border-color) inset,-1px 0 0 0 var(--el-input-border-color) inset}.el-input-group--prepend>.el-input__wrapper{border-top-left-radius:0;border-bottom-left-radius:0}.el-input-group--prepend .el-input-group__prepend .el-select .el-input .el-input__inner{box-shadow:none!important}.el-input-group--prepend .el-input-group__prepend .el-select .el-input .el-input__wrapper{border-top-right-radius:0;border-bottom-right-radius:0;box-shadow:1px 0 0 0 var(--el-input-border-color) inset,0 1px 0 0 var(--el-input-border-color) inset,0 -1px 0 0 var(--el-input-border-color) inset}.el-input-group--prepend .el-input-group__prepend .el-select .el-input.is-focus .el-input__inner{box-shadow:none!important}.el-input-group--prepend .el-input-group__prepend .el-select .el-input.is-focus .el-input__wrapper{box-shadow:1px 0 0 0 var(--el-input-focus-border-color) inset,1px 0 0 0 var(--el-input-focus-border-color),0 1px 0 0 var(--el-input-focus-border-color) inset,0 -1px 0 0 var(--el-input-focus-border-color) inset!important;z-index:2}.el-input-group--prepend .el-input-group__prepend .el-select .el-input.is-focus .el-input__wrapper:focus{outline:0;z-index:2;box-shadow:1px 0 0 0 var(--el-input-focus-border-color) inset,1px 0 0 0 var(--el-input-focus-border-color),0 1px 0 0 var(--el-input-focus-border-color) inset,0 -1px 0 0 var(--el-input-focus-border-color) inset!important}.el-input-group--prepend .el-input-group__prepend .el-select:hover .el-input__inner{box-shadow:none!important}.el-input-group--prepend .el-input-group__prepend .el-select:hover .el-input__wrapper{z-index:1;box-shadow:1px 0 0 0 var(--el-input-hover-border-color) inset,1px 0 0 0 var(--el-input-hover-border-color),0 1px 0 0 var(--el-input-hover-border-color) inset,0 -1px 0 0 var(--el-input-hover-border-color) inset!important}.el-input-group--append>.el-input__wrapper{border-top-right-radius:0;border-bottom-right-radius:0}.el-input-group--append .el-input-group__append .el-select .el-input .el-input__inner{box-shadow:none!important}.el-input-group--append .el-input-group__append .el-select .el-input .el-input__wrapper{border-top-left-radius:0;border-bottom-left-radius:0;box-shadow:0 1px 0 0 var(--el-input-border-color) inset,0 -1px 0 0 var(--el-input-border-color) inset,-1px 0 0 0 var(--el-input-border-color) inset}.el-input-group--append .el-input-group__append .el-select .el-input.is-focus .el-input__inner{box-shadow:none!important}.el-input-group--append .el-input-group__append .el-select .el-input.is-focus .el-input__wrapper{z-index:2;box-shadow:-1px 0 0 0 var(--el-input-focus-border-color),-1px 0 0 0 var(--el-input-focus-border-color) inset,0 1px 0 0 var(--el-input-focus-border-color) inset,0 -1px 0 0 var(--el-input-focus-border-color) inset!important}.el-input-group--append .el-input-group__append .el-select:hover .el-input__inner{box-shadow:none!important}.el-input-group--append .el-input-group__append .el-select:hover .el-input__wrapper{z-index:1;box-shadow:-1px 0 0 0 var(--el-input-hover-border-color),-1px 0 0 0 var(--el-input-hover-border-color) inset,0 1px 0 0 var(--el-input-hover-border-color) inset,0 -1px 0 0 var(--el-input-hover-border-color) inset!important}.el-link{--el-link-font-size:var(--el-font-size-base);--el-link-font-weight:var(--el-font-weight-primary);--el-link-text-color:var(--el-text-color-regular);--el-link-hover-text-color:var(--el-color-primary);--el-link-disabled-text-color:var(--el-text-color-placeholder)}.el-link{display:inline-flex;flex-direction:row;align-items:center;justify-content:center;vertical-align:middle;position:relative;text-decoration:none;outline:0;cursor:pointer;padding:0;font-size:var(--el-link-font-size);font-weight:var(--el-link-font-weight);color:var(--el-link-text-color)}.el-link:hover{color:var(--el-link-hover-text-color)}.el-link.is-underline:hover:after{content:"";position:absolute;left:0;right:0;height:0;bottom:0;border-bottom:1px solid var(--el-link-hover-text-color)}.el-link.is-disabled{color:var(--el-link-disabled-text-color);cursor:not-allowed}.el-link [class*=el-icon-]+span{margin-left:5px}.el-link.el-link--default:after{border-color:var(--el-link-hover-text-color)}.el-link__inner{display:inline-flex;justify-content:center;align-items:center}.el-link.el-link--primary{--el-link-text-color:var(--el-color-primary);--el-link-hover-text-color:var(--el-color-primary-light-3);--el-link-disabled-text-color:var(--el-color-primary-light-5)}.el-link.el-link--primary:after{border-color:var(--el-link-text-color)}.el-link.el-link--primary.is-underline:hover:after{border-color:var(--el-link-text-color)}.el-link.el-link--success{--el-link-text-color:var(--el-color-success);--el-link-hover-text-color:var(--el-color-success-light-3);--el-link-disabled-text-color:var(--el-color-success-light-5)}.el-link.el-link--success:after{border-color:var(--el-link-text-color)}.el-link.el-link--success.is-underline:hover:after{border-color:var(--el-link-text-color)}.el-link.el-link--warning{--el-link-text-color:var(--el-color-warning);--el-link-hover-text-color:var(--el-color-warning-light-3);--el-link-disabled-text-color:var(--el-color-warning-light-5)}.el-link.el-link--warning:after{border-color:var(--el-link-text-color)}.el-link.el-link--warning.is-underline:hover:after{border-color:var(--el-link-text-color)}.el-link.el-link--danger{--el-link-text-color:var(--el-color-danger);--el-link-hover-text-color:var(--el-color-danger-light-3);--el-link-disabled-text-color:var(--el-color-danger-light-5)}.el-link.el-link--danger:after{border-color:var(--el-link-text-color)}.el-link.el-link--danger.is-underline:hover:after{border-color:var(--el-link-text-color)}.el-link.el-link--error{--el-link-text-color:var(--el-color-error);--el-link-hover-text-color:var(--el-color-error-light-3);--el-link-disabled-text-color:var(--el-color-error-light-5)}.el-link.el-link--error:after{border-color:var(--el-link-text-color)}.el-link.el-link--error.is-underline:hover:after{border-color:var(--el-link-text-color)}.el-link.el-link--info{--el-link-text-color:var(--el-color-info);--el-link-hover-text-color:var(--el-color-info-light-3);--el-link-disabled-text-color:var(--el-color-info-light-5)}.el-link.el-link--info:after{border-color:var(--el-link-text-color)}.el-link.el-link--info.is-underline:hover:after{border-color:var(--el-link-text-color)}:root{--el-loading-spinner-size:42px;--el-loading-fullscreen-spinner-size:50px}.el-loading-parent--relative{position:relative!important}.el-loading-parent--hidden{overflow:hidden!important}.el-loading-mask{position:absolute;z-index:2000;background-color:var(--el-mask-color);margin:0;top:0;right:0;bottom:0;left:0;transition:opacity var(--el-transition-duration)}.el-loading-mask.is-fullscreen{position:fixed}.el-loading-mask.is-fullscreen .el-loading-spinner{margin-top:calc((0px - var(--el-loading-fullscreen-spinner-size))/ 2)}.el-loading-mask.is-fullscreen .el-loading-spinner .circular{height:var(--el-loading-fullscreen-spinner-size);width:var(--el-loading-fullscreen-spinner-size)}.el-loading-spinner{top:50%;margin-top:calc((0px - var(--el-loading-spinner-size))/ 2);width:100%;text-align:center;position:absolute}.el-loading-spinner .el-loading-text{color:var(--el-color-primary);margin:3px 0;font-size:14px}.el-loading-spinner .circular{display:inline;height:var(--el-loading-spinner-size);width:var(--el-loading-spinner-size);-webkit-animation:loading-rotate 2s linear infinite;animation:loading-rotate 2s linear infinite}.el-loading-spinner .path{-webkit-animation:loading-dash 1.5s ease-in-out infinite;animation:loading-dash 1.5s ease-in-out infinite;stroke-dasharray:90,150;stroke-dashoffset:0;stroke-width:2;stroke:var(--el-color-primary);stroke-linecap:round}.el-loading-spinner i{color:var(--el-color-primary)}.el-loading-fade-enter-from,.el-loading-fade-leave-to{opacity:0}@-webkit-keyframes loading-rotate{to{transform:rotate(360deg)}}@keyframes loading-rotate{to{transform:rotate(360deg)}}@-webkit-keyframes loading-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-40px}to{stroke-dasharray:90,150;stroke-dashoffset:-120px}}@keyframes loading-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-40px}to{stroke-dasharray:90,150;stroke-dashoffset:-120px}}.el-main{--el-main-padding:20px;display:block;flex:1;flex-basis:auto;overflow:auto;box-sizing:border-box;padding:var(--el-main-padding)}:root{--el-menu-active-color:var(--el-color-primary);--el-menu-text-color:var(--el-text-color-primary);--el-menu-hover-text-color:var(--el-color-primary);--el-menu-bg-color:var(--el-fill-color-blank);--el-menu-hover-bg-color:var(--el-color-primary-light-9);--el-menu-item-height:56px;--el-menu-sub-item-height:calc(var(--el-menu-item-height) - 6px);--el-menu-horizontal-height:60px;--el-menu-horizontal-sub-item-height:36px;--el-menu-item-font-size:var(--el-font-size-base);--el-menu-item-hover-fill:var(--el-color-primary-light-9);--el-menu-border-color:var(--el-border-color);--el-menu-base-level-padding:20px;--el-menu-level-padding:20px;--el-menu-icon-width:24px}.el-menu{border-right:solid 1px var(--el-menu-border-color);list-style:none;position:relative;margin:0;padding-left:0;background-color:var(--el-menu-bg-color);box-sizing:border-box}.el-menu--vertical:not(.el-menu--collapse):not(.el-menu--popup-container) .el-menu-item,.el-menu--vertical:not(.el-menu--collapse):not(.el-menu--popup-container) .el-menu-item-group__title,.el-menu--vertical:not(.el-menu--collapse):not(.el-menu--popup-container) .el-sub-menu__title{white-space:nowrap;padding-left:calc(var(--el-menu-base-level-padding) + var(--el-menu-level) * var(--el-menu-level-padding))}.el-menu:not(.el-menu--collapse) .el-sub-menu__title{padding-right:calc(var(--el-menu-base-level-padding) + var(--el-menu-icon-width))}.el-menu--horizontal{display:flex;flex-wrap:nowrap;border-right:none;height:var(--el-menu-horizontal-height)}.el-menu--horizontal.el-menu--popup-container{height:unset}.el-menu--horizontal.el-menu{border-bottom:solid 1px var(--el-menu-border-color)}.el-menu--horizontal>.el-menu-item{display:inline-flex;justify-content:center;align-items:center;height:100%;margin:0;border-bottom:2px solid transparent;color:var(--el-menu-text-color)}.el-menu--horizontal>.el-menu-item a,.el-menu--horizontal>.el-menu-item a:hover{color:inherit}.el-menu--horizontal>.el-sub-menu:focus,.el-menu--horizontal>.el-sub-menu:hover{outline:0}.el-menu--horizontal>.el-sub-menu:hover .el-sub-menu__title{color:var(--el-menu-hover-text-color)}.el-menu--horizontal>.el-sub-menu.is-active .el-sub-menu__title{border-bottom:2px solid var(--el-menu-active-color);color:var(--el-menu-active-color)}.el-menu--horizontal>.el-sub-menu .el-sub-menu__title{height:100%;border-bottom:2px solid transparent;color:var(--el-menu-text-color)}.el-menu--horizontal>.el-sub-menu .el-sub-menu__title:hover{background-color:var(--el-menu-bg-color)}.el-menu--horizontal .el-menu .el-menu-item,.el-menu--horizontal .el-menu .el-sub-menu__title{background-color:var(--el-menu-bg-color);display:flex;align-items:center;height:var(--el-menu-horizontal-sub-item-height);line-height:var(--el-menu-horizontal-sub-item-height);padding:0 10px;color:var(--el-menu-text-color)}.el-menu--horizontal .el-menu .el-sub-menu__title{padding-right:40px}.el-menu--horizontal .el-menu .el-menu-item.is-active,.el-menu--horizontal .el-menu .el-sub-menu.is-active>.el-sub-menu__title{color:var(--el-menu-active-color)}.el-menu--horizontal .el-menu-item:not(.is-disabled):focus,.el-menu--horizontal .el-menu-item:not(.is-disabled):hover{outline:0;color:var(--el-menu-hover-text-color);background-color:var(--el-menu-hover-bg-color)}.el-menu--horizontal>.el-menu-item.is-active{border-bottom:2px solid var(--el-menu-active-color);color:var(--el-menu-active-color)!important}.el-menu--collapse{width:calc(var(--el-menu-icon-width) + var(--el-menu-base-level-padding) * 2)}.el-menu--collapse>.el-menu-item [class^=el-icon],.el-menu--collapse>.el-menu-item-group>ul>.el-sub-menu>.el-sub-menu__title [class^=el-icon],.el-menu--collapse>.el-sub-menu>.el-sub-menu__title [class^=el-icon]{margin:0;vertical-align:middle;width:var(--el-menu-icon-width);text-align:center}.el-menu--collapse>.el-menu-item .el-sub-menu__icon-arrow,.el-menu--collapse>.el-menu-item-group>ul>.el-sub-menu>.el-sub-menu__title .el-sub-menu__icon-arrow,.el-menu--collapse>.el-sub-menu>.el-sub-menu__title .el-sub-menu__icon-arrow{display:none}.el-menu--collapse>.el-menu-item-group>ul>.el-sub-menu>.el-sub-menu__title>span,.el-menu--collapse>.el-menu-item>span,.el-menu--collapse>.el-sub-menu>.el-sub-menu__title>span{height:0;width:0;overflow:hidden;visibility:hidden;display:inline-block}.el-menu--collapse>.el-menu-item.is-active i{color:inherit}.el-menu--collapse .el-menu .el-sub-menu{min-width:200px}.el-menu--popup{z-index:100;min-width:200px;border:none;padding:5px 0;border-radius:var(--el-border-radius-small);box-shadow:var(--el-box-shadow-light)}.el-menu .el-icon{flex-shrink:0}.el-menu-item{display:flex;align-items:center;height:var(--el-menu-item-height);line-height:var(--el-menu-item-height);font-size:var(--el-menu-item-font-size);color:var(--el-menu-text-color);padding:0 var(--el-menu-base-level-padding);list-style:none;cursor:pointer;position:relative;transition:border-color var(--el-transition-duration),background-color var(--el-transition-duration),color var(--el-transition-duration);box-sizing:border-box;white-space:nowrap}.el-menu-item *{vertical-align:bottom}.el-menu-item i{color:inherit}.el-menu-item:focus,.el-menu-item:hover{outline:0}.el-menu-item:hover{background-color:var(--el-menu-hover-bg-color)}.el-menu-item.is-disabled{opacity:.25;cursor:not-allowed;background:0 0!important}.el-menu-item [class^=el-icon]{margin-right:5px;width:var(--el-menu-icon-width);text-align:center;font-size:18px;vertical-align:middle}.el-menu-item.is-active{color:var(--el-menu-active-color)}.el-menu-item.is-active i{color:inherit}.el-menu-item .el-menu-tooltip__trigger{position:absolute;left:0;top:0;height:100%;width:100%;display:inline-flex;align-items:center;box-sizing:border-box;padding:0 var(--el-menu-base-level-padding)}.el-sub-menu{list-style:none;margin:0;padding-left:0}.el-sub-menu__title{display:flex;align-items:center;height:var(--el-menu-item-height);line-height:var(--el-menu-item-height);font-size:var(--el-menu-item-font-size);color:var(--el-menu-text-color);padding:0 var(--el-menu-base-level-padding);list-style:none;cursor:pointer;position:relative;transition:border-color var(--el-transition-duration),background-color var(--el-transition-duration),color var(--el-transition-duration);box-sizing:border-box;white-space:nowrap}.el-sub-menu__title *{vertical-align:bottom}.el-sub-menu__title i{color:inherit}.el-sub-menu__title:focus,.el-sub-menu__title:hover{outline:0}.el-sub-menu__title.is-disabled{opacity:.25;cursor:not-allowed;background:0 0!important}.el-sub-menu__title:hover{background-color:var(--el-menu-hover-bg-color)}.el-sub-menu .el-menu{border:none}.el-sub-menu .el-menu-item{height:var(--el-menu-sub-item-height);line-height:var(--el-menu-sub-item-height)}.el-sub-menu__hide-arrow .el-sub-menu__icon-arrow{display:none!important}.el-sub-menu.is-active .el-sub-menu__title{border-bottom-color:var(--el-menu-active-color)}.el-sub-menu.is-disabled .el-menu-item,.el-sub-menu.is-disabled .el-sub-menu__title{opacity:.25;cursor:not-allowed;background:0 0!important}.el-sub-menu .el-icon{vertical-align:middle;margin-right:5px;width:var(--el-menu-icon-width);text-align:center;font-size:18px}.el-sub-menu .el-icon.el-sub-menu__icon-more{margin-right:0!important}.el-sub-menu .el-sub-menu__icon-arrow{position:absolute;top:50%;right:var(--el-menu-base-level-padding);margin-top:-6px;transition:transform var(--el-transition-duration);font-size:12px;margin-right:0;width:inherit}.el-menu-item-group>ul{padding:0}.el-menu-item-group__title{padding:7px 0 7px var(--el-menu-base-level-padding);line-height:normal;font-size:12px;color:var(--el-text-color-secondary)}.horizontal-collapse-transition .el-sub-menu__title .el-sub-menu__icon-arrow{transition:var(--el-transition-duration-fast);opacity:0}.el-message-box{--el-messagebox-title-color:var(--el-text-color-primary);--el-messagebox-width:420px;--el-messagebox-border-radius:4px;--el-messagebox-font-size:var(--el-font-size-large);--el-messagebox-content-font-size:var(--el-font-size-base);--el-messagebox-content-color:var(--el-text-color-regular);--el-messagebox-error-font-size:12px;--el-messagebox-padding-primary:15px}.el-message-box{display:inline-block;max-width:var(--el-messagebox-width);width:100%;padding-bottom:10px;vertical-align:middle;background-color:var(--el-bg-color);border-radius:var(--el-messagebox-border-radius);border:1px solid var(--el-border-color-lighter);font-size:var(--el-messagebox-font-size);box-shadow:var(--el-box-shadow-light);text-align:left;overflow:hidden;-webkit-backface-visibility:hidden;backface-visibility:hidden;box-sizing:border-box}.el-message-box:focus{outline:0!important}.el-overlay.is-message-box .el-overlay-message-box{text-align:center;position:fixed;top:0;right:0;bottom:0;left:0;padding:16px;overflow:auto}.el-overlay.is-message-box .el-overlay-message-box:after{content:"";display:inline-block;height:100%;width:0;vertical-align:middle}.el-message-box.is-draggable .el-message-box__header{cursor:move;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.el-message-box__header{position:relative;padding:var(--el-messagebox-padding-primary);padding-bottom:10px}.el-message-box__title{padding-left:0;margin-bottom:0;font-size:var(--el-messagebox-font-size);line-height:1;color:var(--el-messagebox-title-color)}.el-message-box__headerbtn{position:absolute;top:var(--el-messagebox-padding-primary);right:var(--el-messagebox-padding-primary);padding:0;border:none;outline:0;background:0 0;font-size:var(--el-message-close-size,16px);cursor:pointer}.el-message-box__headerbtn .el-message-box__close{color:var(--el-color-info);font-size:inherit}.el-message-box__headerbtn:focus .el-message-box__close,.el-message-box__headerbtn:hover .el-message-box__close{color:var(--el-color-primary)}.el-message-box__content{padding:10px var(--el-messagebox-padding-primary);color:var(--el-messagebox-content-color);font-size:var(--el-messagebox-content-font-size)}.el-message-box__container{position:relative}.el-message-box__input{padding-top:15px}.el-message-box__input div.invalid>input{border-color:var(--el-color-error)}.el-message-box__input div.invalid>input:focus{border-color:var(--el-color-error)}.el-message-box__status{position:absolute;top:50%;transform:translateY(-50%);font-size:24px!important}.el-message-box__status:before{padding-left:1px}.el-message-box__status.el-icon{position:absolute}.el-message-box__status+.el-message-box__message{padding-left:36px;padding-right:12px;word-break:break-word}.el-message-box__status.el-message-box-icon--success{--el-messagebox-color:var(--el-color-success);color:var(--el-messagebox-color)}.el-message-box__status.el-message-box-icon--info{--el-messagebox-color:var(--el-color-info);color:var(--el-messagebox-color)}.el-message-box__status.el-message-box-icon--warning{--el-messagebox-color:var(--el-color-warning);color:var(--el-messagebox-color)}.el-message-box__status.el-message-box-icon--error{--el-messagebox-color:var(--el-color-error);color:var(--el-messagebox-color)}.el-message-box__message{margin:0}.el-message-box__message p{margin:0;line-height:24px}.el-message-box__errormsg{color:var(--el-color-error);font-size:var(--el-messagebox-error-font-size);min-height:18px;margin-top:2px}.el-message-box__btns{padding:5px 15px 0;display:flex;flex-wrap:wrap;justify-content:flex-end;align-items:center}.el-message-box__btns button:nth-child(2){margin-left:10px}.el-message-box__btns-reverse{flex-direction:row-reverse}.el-message-box--center .el-message-box__title{position:relative;display:flex;align-items:center;justify-content:center}.el-message-box--center .el-message-box__status{position:relative;top:auto;padding-right:5px;text-align:center;transform:translateY(-1px)}.el-message-box--center .el-message-box__message{margin-left:0}.el-message-box--center .el-message-box__btns{justify-content:center}.el-message-box--center .el-message-box__content{padding-left:calc(var(--el-messagebox-padding-primary) + 12px);padding-right:calc(var(--el-messagebox-padding-primary) + 12px);text-align:center}.fade-in-linear-enter-active .el-overlay-message-box{-webkit-animation:msgbox-fade-in var(--el-transition-duration);animation:msgbox-fade-in var(--el-transition-duration)}.fade-in-linear-leave-active .el-overlay-message-box{animation:msgbox-fade-in var(--el-transition-duration) reverse}@-webkit-keyframes msgbox-fade-in{0%{transform:translate3d(0,-20px,0);opacity:0}to{transform:translateZ(0);opacity:1}}@keyframes msgbox-fade-in{0%{transform:translate3d(0,-20px,0);opacity:0}to{transform:translateZ(0);opacity:1}}.el-message{--el-message-bg-color:var(--el-color-info-light-9);--el-message-border-color:var(--el-border-color-lighter);--el-message-padding:15px 19px;--el-message-close-size:16px;--el-message-close-icon-color:var(--el-text-color-placeholder);--el-message-close-hover-color:var(--el-text-color-secondary)}.el-message{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;max-width:calc(100% - 32px);box-sizing:border-box;border-radius:var(--el-border-radius-base);border-width:var(--el-border-width);border-style:var(--el-border-style);border-color:var(--el-message-border-color);position:fixed;left:50%;top:20px;transform:translate(-50%);background-color:var(--el-message-bg-color);transition:opacity var(--el-transition-duration),transform .4s,top .4s;padding:var(--el-message-padding);display:flex;align-items:center}.el-message.is-center{justify-content:center}.el-message.is-closable .el-message__content{padding-right:31px}.el-message p{margin:0}.el-message--success{--el-message-bg-color:var(--el-color-success-light-9);--el-message-border-color:var(--el-color-success-light-8);--el-message-text-color:var(--el-color-success)}.el-message--success .el-message__content{color:var(--el-message-text-color);overflow-wrap:anywhere}.el-message .el-message-icon--success{color:var(--el-message-text-color)}.el-message--info{--el-message-bg-color:var(--el-color-info-light-9);--el-message-border-color:var(--el-color-info-light-8);--el-message-text-color:var(--el-color-info)}.el-message--info .el-message__content{color:var(--el-message-text-color);overflow-wrap:anywhere}.el-message .el-message-icon--info{color:var(--el-message-text-color)}.el-message--warning{--el-message-bg-color:var(--el-color-warning-light-9);--el-message-border-color:var(--el-color-warning-light-8);--el-message-text-color:var(--el-color-warning)}.el-message--warning .el-message__content{color:var(--el-message-text-color);overflow-wrap:anywhere}.el-message .el-message-icon--warning{color:var(--el-message-text-color)}.el-message--error{--el-message-bg-color:var(--el-color-error-light-9);--el-message-border-color:var(--el-color-error-light-8);--el-message-text-color:var(--el-color-error)}.el-message--error .el-message__content{color:var(--el-message-text-color);overflow-wrap:anywhere}.el-message .el-message-icon--error{color:var(--el-message-text-color)}.el-message__icon{margin-right:10px}.el-message .el-message__badge{position:absolute;top:-8px;right:-8px}.el-message__content{padding:0;font-size:14px;line-height:1}.el-message__content:focus{outline-width:0}.el-message .el-message__closeBtn{position:absolute;top:50%;right:19px;transform:translateY(-50%);cursor:pointer;color:var(--el-message-close-icon-color);font-size:var(--el-message-close-size)}.el-message .el-message__closeBtn:focus{outline-width:0}.el-message .el-message__closeBtn:hover{color:var(--el-message-close-hover-color)}.el-message-fade-enter-from,.el-message-fade-leave-to{opacity:0;transform:translate(-50%,-100%)}.el-notification{--el-notification-width:330px;--el-notification-padding:14px 26px 14px 13px;--el-notification-radius:8px;--el-notification-shadow:var(--el-box-shadow-light);--el-notification-border-color:var(--el-border-color-lighter);--el-notification-icon-size:24px;--el-notification-close-font-size:var(--el-message-close-size, 16px);--el-notification-group-margin-left:13px;--el-notification-group-margin-right:8px;--el-notification-content-font-size:var(--el-font-size-base);--el-notification-content-color:var(--el-text-color-regular);--el-notification-title-font-size:16px;--el-notification-title-color:var(--el-text-color-primary);--el-notification-close-color:var(--el-text-color-secondary);--el-notification-close-hover-color:var(--el-text-color-regular)}.el-notification{display:flex;width:var(--el-notification-width);padding:var(--el-notification-padding);border-radius:var(--el-notification-radius);box-sizing:border-box;border:1px solid var(--el-notification-border-color);position:fixed;background-color:var(--el-bg-color-overlay);box-shadow:var(--el-notification-shadow);transition:opacity var(--el-transition-duration),transform var(--el-transition-duration),left var(--el-transition-duration),right var(--el-transition-duration),top .4s,bottom var(--el-transition-duration);overflow-wrap:anywhere;overflow:hidden;z-index:9999}.el-notification.right{right:16px}.el-notification.left{left:16px}.el-notification__group{margin-left:var(--el-notification-group-margin-left);margin-right:var(--el-notification-group-margin-right)}.el-notification__title{font-weight:700;font-size:var(--el-notification-title-font-size);line-height:var(--el-notification-icon-size);color:var(--el-notification-title-color);margin:0}.el-notification__content{font-size:var(--el-notification-content-font-size);line-height:24px;margin:6px 0 0;color:var(--el-notification-content-color);text-align:justify}.el-notification__content p{margin:0}.el-notification .el-notification__icon{height:var(--el-notification-icon-size);width:var(--el-notification-icon-size);font-size:var(--el-notification-icon-size)}.el-notification .el-notification__closeBtn{position:absolute;top:18px;right:15px;cursor:pointer;color:var(--el-notification-close-color);font-size:var(--el-notification-close-font-size)}.el-notification .el-notification__closeBtn:hover{color:var(--el-notification-close-hover-color)}.el-notification .el-notification--success{--el-notification-icon-color:var(--el-color-success);color:var(--el-notification-icon-color)}.el-notification .el-notification--info{--el-notification-icon-color:var(--el-color-info);color:var(--el-notification-icon-color)}.el-notification .el-notification--warning{--el-notification-icon-color:var(--el-color-warning);color:var(--el-notification-icon-color)}.el-notification .el-notification--error{--el-notification-icon-color:var(--el-color-error);color:var(--el-notification-icon-color)}.el-notification-fade-enter-from.right{right:0;transform:translate(100%)}.el-notification-fade-enter-from.left{left:0;transform:translate(-100%)}.el-notification-fade-leave-to{opacity:0}.el-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:2000;height:100%;background-color:var(--el-overlay-color-lighter);overflow:auto}.el-overlay .el-overlay-root{height:0}.el-page-header.is-contentful .el-page-header__main{border-top:1px solid var(--el-border-color-light);margin-top:16px}.el-page-header__header{display:flex;align-items:center;justify-content:space-between;line-height:24px}.el-page-header__left{display:flex;align-items:center;margin-right:40px;position:relative}.el-page-header__back{display:flex;align-items:center;cursor:pointer}.el-page-header__left .el-divider--vertical{margin:0 16px}.el-page-header__icon{font-size:16px;margin-right:10px;display:flex;align-items:center}.el-page-header__icon .el-icon{font-size:inherit}.el-page-header__title{font-size:14px;font-weight:500}.el-page-header__content{font-size:18px;color:var(--el-text-color-primary)}.el-page-header__breadcrumb{margin-bottom:16px}.el-pagination{--el-pagination-font-size:14px;--el-pagination-bg-color:var(--el-fill-color-blank);--el-pagination-text-color:var(--el-text-color-primary);--el-pagination-border-radius:2px;--el-pagination-button-color:var(--el-text-color-primary);--el-pagination-button-width:32px;--el-pagination-button-height:32px;--el-pagination-button-disabled-color:var(--el-text-color-placeholder);--el-pagination-button-disabled-bg-color:var(--el-fill-color-blank);--el-pagination-button-bg-color:var(--el-fill-color);--el-pagination-hover-color:var(--el-color-primary);--el-pagination-font-size-small:12px;--el-pagination-button-width-small:24px;--el-pagination-button-height-small:24px;--el-pagination-item-gap:16px;white-space:nowrap;color:var(--el-pagination-text-color);font-size:var(--el-pagination-font-size);font-weight:400;display:flex;align-items:center}.el-pagination .el-input__inner{text-align:center;-moz-appearance:textfield}.el-pagination .el-select .el-input{width:128px}.el-pagination button{display:flex;justify-content:center;align-items:center;font-size:var(--el-pagination-font-size);min-width:var(--el-pagination-button-width);height:var(--el-pagination-button-height);line-height:var(--el-pagination-button-height);color:var(--el-pagination-button-color);background:var(--el-pagination-bg-color);padding:0 4px;border:none;border-radius:var(--el-pagination-border-radius);cursor:pointer;text-align:center;box-sizing:border-box}.el-pagination button *{pointer-events:none}.el-pagination button:focus{outline:0}.el-pagination button:hover{color:var(--el-pagination-hover-color)}.el-pagination button.is-active{color:var(--el-pagination-hover-color);cursor:default;font-weight:700}.el-pagination button.is-active.is-disabled{font-weight:700;color:var(--el-text-color-secondary)}.el-pagination button.is-disabled,.el-pagination button:disabled{color:var(--el-pagination-button-disabled-color);background-color:var(--el-pagination-button-disabled-bg-color);cursor:not-allowed}.el-pagination button:focus-visible{outline:1px solid var(--el-pagination-hover-color);outline-offset:-1px}.el-pagination .btn-next .el-icon,.el-pagination .btn-prev .el-icon{display:block;font-size:12px;font-weight:700;width:inherit}.el-pagination>.is-first{margin-left:0!important}.el-pagination>.is-last{margin-right:0!important}.el-pagination .btn-prev{margin-left:var(--el-pagination-item-gap)}.el-pagination__sizes,.el-pagination__total{margin-left:var(--el-pagination-item-gap);font-weight:400;color:var(--el-text-color-regular)}.el-pagination__total[disabled=true]{color:var(--el-text-color-placeholder)}.el-pagination__jump{display:flex;align-items:center;margin-left:var(--el-pagination-item-gap);font-weight:400;color:var(--el-text-color-regular)}.el-pagination__jump[disabled=true]{color:var(--el-text-color-placeholder)}.el-pagination__goto{margin-right:8px}.el-pagination__editor{text-align:center;box-sizing:border-box}.el-pagination__editor.el-input{width:56px}.el-pagination__editor .el-input__inner::-webkit-inner-spin-button,.el-pagination__editor .el-input__inner::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.el-pagination__classifier{margin-left:8px}.el-pagination__rightwrapper{flex:1;display:flex;align-items:center;justify-content:flex-end}.el-pagination.is-background .btn-next,.el-pagination.is-background .btn-prev,.el-pagination.is-background .el-pager li{margin:0 4px;background-color:var(--el-pagination-button-bg-color)}.el-pagination.is-background .btn-next.is-active,.el-pagination.is-background .btn-prev.is-active,.el-pagination.is-background .el-pager li.is-active{background-color:var(--el-color-primary);color:var(--el-color-white)}.el-pagination.is-background .btn-next.is-disabled,.el-pagination.is-background .btn-next:disabled,.el-pagination.is-background .btn-prev.is-disabled,.el-pagination.is-background .btn-prev:disabled,.el-pagination.is-background .el-pager li.is-disabled,.el-pagination.is-background .el-pager li:disabled{color:var(--el-text-color-placeholder);background-color:var(--el-disabled-bg-color)}.el-pagination.is-background .btn-next.is-disabled.is-active,.el-pagination.is-background .btn-next:disabled.is-active,.el-pagination.is-background .btn-prev.is-disabled.is-active,.el-pagination.is-background .btn-prev:disabled.is-active,.el-pagination.is-background .el-pager li.is-disabled.is-active,.el-pagination.is-background .el-pager li:disabled.is-active{color:var(--el-text-color-secondary);background-color:var(--el-fill-color-dark)}.el-pagination.is-background .btn-prev{margin-left:var(--el-pagination-item-gap)}.el-pagination--small .btn-next,.el-pagination--small .btn-prev,.el-pagination--small .el-pager li{height:var(--el-pagination-button-height-small);line-height:var(--el-pagination-button-height-small);font-size:var(--el-pagination-font-size-small);min-width:var(--el-pagination-button-width-small)}.el-pagination--small button,.el-pagination--small span:not([class*=suffix]){font-size:var(--el-pagination-font-size-small)}.el-pagination--small .el-select .el-input{width:100px}.el-pager{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;list-style:none;font-size:0;padding:0;margin:0;display:flex;align-items:center}.el-pager li{display:flex;justify-content:center;align-items:center;font-size:var(--el-pagination-font-size);min-width:var(--el-pagination-button-width);height:var(--el-pagination-button-height);line-height:var(--el-pagination-button-height);color:var(--el-pagination-button-color);background:var(--el-pagination-bg-color);padding:0 4px;border:none;border-radius:var(--el-pagination-border-radius);cursor:pointer;text-align:center;box-sizing:border-box}.el-pager li *{pointer-events:none}.el-pager li:focus{outline:0}.el-pager li:hover{color:var(--el-pagination-hover-color)}.el-pager li.is-active{color:var(--el-pagination-hover-color);cursor:default;font-weight:700}.el-pager li.is-active.is-disabled{font-weight:700;color:var(--el-text-color-secondary)}.el-pager li.is-disabled,.el-pager li:disabled{color:var(--el-pagination-button-disabled-color);background-color:var(--el-pagination-button-disabled-bg-color);cursor:not-allowed}.el-pager li:focus-visible{outline:1px solid var(--el-pagination-hover-color);outline-offset:-1px}.el-popconfirm__main{display:flex;align-items:center}.el-popconfirm__icon{margin-right:5px}.el-popconfirm__action{text-align:right;margin-top:8px}.el-popover{--el-popover-bg-color:var(--el-bg-color-overlay);--el-popover-font-size:var(--el-font-size-base);--el-popover-border-color:var(--el-border-color-lighter);--el-popover-padding:12px;--el-popover-padding-large:18px 20px;--el-popover-title-font-size:16px;--el-popover-title-text-color:var(--el-text-color-primary);--el-popover-border-radius:4px}.el-popover.el-popper{background:var(--el-popover-bg-color);min-width:150px;border-radius:var(--el-popover-border-radius);border:1px solid var(--el-popover-border-color);padding:var(--el-popover-padding);z-index:var(--el-index-popper);color:var(--el-text-color-regular);line-height:1.4;text-align:justify;font-size:var(--el-popover-font-size);box-shadow:var(--el-box-shadow-light);word-break:break-all;box-sizing:border-box}.el-popover.el-popper--plain{padding:var(--el-popover-padding-large)}.el-popover__title{color:var(--el-popover-title-text-color);font-size:var(--el-popover-title-font-size);line-height:1;margin-bottom:12px}.el-popover__reference:focus:hover,.el-popover__reference:focus:not(.focusing){outline-width:0}.el-popover.el-popper.is-dark{--el-popover-bg-color:var(--el-text-color-primary);--el-popover-border-color:var(--el-text-color-primary);--el-popover-title-text-color:var(--el-bg-color);color:var(--el-bg-color)}.el-popover.el-popper:focus,.el-popover.el-popper:focus:active{outline-width:0}.el-progress{position:relative;line-height:1;display:flex;align-items:center}.el-progress__text{font-size:14px;color:var(--el-text-color-regular);margin-left:5px;min-width:50px;line-height:1}.el-progress__text i{vertical-align:middle;display:block}.el-progress--circle,.el-progress--dashboard{display:inline-block}.el-progress--circle .el-progress__text,.el-progress--dashboard .el-progress__text{position:absolute;top:50%;left:0;width:100%;text-align:center;margin:0;transform:translateY(-50%)}.el-progress--circle .el-progress__text i,.el-progress--dashboard .el-progress__text i{vertical-align:middle;display:inline-block}.el-progress--without-text .el-progress__text{display:none}.el-progress--without-text .el-progress-bar{padding-right:0;margin-right:0;display:block}.el-progress--text-inside .el-progress-bar{padding-right:0;margin-right:0}.el-progress.is-success .el-progress-bar__inner{background-color:var(--el-color-success)}.el-progress.is-success .el-progress__text{color:var(--el-color-success)}.el-progress.is-warning .el-progress-bar__inner{background-color:var(--el-color-warning)}.el-progress.is-warning .el-progress__text{color:var(--el-color-warning)}.el-progress.is-exception .el-progress-bar__inner{background-color:var(--el-color-danger)}.el-progress.is-exception .el-progress__text{color:var(--el-color-danger)}.el-progress-bar{flex-grow:1;box-sizing:border-box}.el-progress-bar__outer{height:6px;border-radius:100px;background-color:var(--el-border-color-lighter);overflow:hidden;position:relative;vertical-align:middle}.el-progress-bar__inner{position:absolute;left:0;top:0;height:100%;background-color:var(--el-color-primary);text-align:right;border-radius:100px;line-height:1;white-space:nowrap;transition:width .6s ease}.el-progress-bar__inner:after{display:inline-block;content:"";height:100%;vertical-align:middle}.el-progress-bar__inner--indeterminate{transform:translateZ(0);-webkit-animation:indeterminate 3s infinite;animation:indeterminate 3s infinite}.el-progress-bar__inner--striped{background-image:linear-gradient(45deg,rgba(0,0,0,.1) 25%,transparent 25%,transparent 50%,rgba(0,0,0,.1) 50%,rgba(0,0,0,.1) 75%,transparent 75%,transparent);background-size:1.25em 1.25em}.el-progress-bar__inner--striped.el-progress-bar__inner--striped-flow{-webkit-animation:striped-flow 3s linear infinite;animation:striped-flow 3s linear infinite}.el-progress-bar__innerText{display:inline-block;vertical-align:middle;color:#fff;font-size:12px;margin:0 5px}@-webkit-keyframes progress{0%{background-position:0 0}to{background-position:32px 0}}@keyframes progress{0%{background-position:0 0}to{background-position:32px 0}}@-webkit-keyframes indeterminate{0%{left:-100%}to{left:100%}}@keyframes indeterminate{0%{left:-100%}to{left:100%}}@-webkit-keyframes striped-flow{0%{background-position:-100%}to{background-position:100%}}@keyframes striped-flow{0%{background-position:-100%}to{background-position:100%}}.el-radio-button{--el-radio-button-checked-bg-color:var(--el-color-primary);--el-radio-button-checked-text-color:var(--el-color-white);--el-radio-button-checked-border-color:var(--el-color-primary);--el-radio-button-disabled-checked-fill:var(--el-border-color-extra-light)}.el-radio-button{position:relative;display:inline-block;outline:0}.el-radio-button__inner{display:inline-block;line-height:1;white-space:nowrap;vertical-align:middle;background:var(--el-button-bg-color,var(--el-fill-color-blank));border:var(--el-border);font-weight:var(--el-button-font-weight,var(--el-font-weight-primary));border-left:0;color:var(--el-button-text-color,var(--el-text-color-regular));-webkit-appearance:none;text-align:center;box-sizing:border-box;outline:0;margin:0;position:relative;cursor:pointer;transition:var(--el-transition-all);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding:8px 15px;font-size:var(--el-font-size-base);border-radius:0}.el-radio-button__inner.is-round{padding:8px 15px}.el-radio-button__inner:hover{color:var(--el-color-primary)}.el-radio-button__inner [class*=el-icon-]{line-height:.9}.el-radio-button__inner [class*=el-icon-]+span{margin-left:5px}.el-radio-button:first-child .el-radio-button__inner{border-left:var(--el-border);border-radius:var(--el-border-radius-base) 0 0 var(--el-border-radius-base);box-shadow:none!important}.el-radio-button__original-radio{opacity:0;outline:0;position:absolute;z-index:-1}.el-radio-button__original-radio:checked+.el-radio-button__inner{color:var(--el-radio-button-checked-text-color,var(--el-color-white));background-color:var(--el-radio-button-checked-bg-color,var(--el-color-primary));border-color:var(--el-radio-button-checked-border-color,var(--el-color-primary));box-shadow:-1px 0 0 0 var(--el-radio-button-checked-border-color,var(--el-color-primary))}.el-radio-button__original-radio:focus-visible+.el-radio-button__inner{border-left:var(--el-border);border-left-color:var(--el-radio-button-checked-border-color,var(--el-color-primary));outline:2px solid var(--el-radio-button-checked-border-color);outline-offset:1px;z-index:2;border-radius:var(--el-border-radius-base);box-shadow:none}.el-radio-button__original-radio:disabled+.el-radio-button__inner{color:var(--el-disabled-text-color);cursor:not-allowed;background-image:none;background-color:var(--el-button-disabled-bg-color,var(--el-fill-color-blank));border-color:var(--el-button-disabled-border-color,var(--el-border-color-light));box-shadow:none}.el-radio-button__original-radio:disabled:checked+.el-radio-button__inner{background-color:var(--el-radio-button-disabled-checked-fill)}.el-radio-button:last-child .el-radio-button__inner{border-radius:0 var(--el-border-radius-base) var(--el-border-radius-base) 0}.el-radio-button:first-child:last-child .el-radio-button__inner{border-radius:var(--el-border-radius-base)}.el-radio-button--large .el-radio-button__inner{padding:12px 19px;font-size:var(--el-font-size-base);border-radius:0}.el-radio-button--large .el-radio-button__inner.is-round{padding:12px 19px}.el-radio-button--small .el-radio-button__inner{padding:5px 11px;font-size:12px;border-radius:0}.el-radio-button--small .el-radio-button__inner.is-round{padding:5px 11px}.el-radio-group{display:inline-flex;align-items:center;flex-wrap:wrap;font-size:0}.el-radio{--el-radio-font-size:var(--el-font-size-base);--el-radio-text-color:var(--el-text-color-regular);--el-radio-font-weight:var(--el-font-weight-primary);--el-radio-input-height:14px;--el-radio-input-width:14px;--el-radio-input-border-radius:var(--el-border-radius-circle);--el-radio-input-bg-color:var(--el-fill-color-blank);--el-radio-input-border:var(--el-border);--el-radio-input-border-color:var(--el-border-color);--el-radio-input-border-color-hover:var(--el-color-primary)}.el-radio{color:var(--el-radio-text-color);font-weight:var(--el-radio-font-weight);position:relative;cursor:pointer;display:inline-flex;align-items:center;white-space:nowrap;outline:0;font-size:var(--el-font-size-base);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;margin-right:32px;height:32px}.el-radio.el-radio--large{height:40px}.el-radio.el-radio--small{height:24px}.el-radio.is-bordered{padding:0 15px 0 9px;border-radius:var(--el-border-radius-base);border:var(--el-border);box-sizing:border-box}.el-radio.is-bordered.is-checked{border-color:var(--el-color-primary)}.el-radio.is-bordered.is-disabled{cursor:not-allowed;border-color:var(--el-border-color-lighter)}.el-radio.is-bordered.el-radio--large{padding:0 19px 0 11px;border-radius:var(--el-border-radius-base)}.el-radio.is-bordered.el-radio--large .el-radio__label{font-size:var(--el-font-size-base)}.el-radio.is-bordered.el-radio--large .el-radio__inner{height:14px;width:14px}.el-radio.is-bordered.el-radio--small{padding:0 11px 0 7px;border-radius:var(--el-border-radius-base)}.el-radio.is-bordered.el-radio--small .el-radio__label{font-size:12px}.el-radio.is-bordered.el-radio--small .el-radio__inner{height:12px;width:12px}.el-radio:last-child{margin-right:0}.el-radio__input{white-space:nowrap;cursor:pointer;outline:0;display:inline-flex;position:relative;vertical-align:middle}.el-radio__input.is-disabled .el-radio__inner{background-color:var(--el-disabled-bg-color);border-color:var(--el-disabled-border-color);cursor:not-allowed}.el-radio__input.is-disabled .el-radio__inner:after{cursor:not-allowed;background-color:var(--el-disabled-bg-color)}.el-radio__input.is-disabled .el-radio__inner+.el-radio__label{cursor:not-allowed}.el-radio__input.is-disabled.is-checked .el-radio__inner{background-color:var(--el-disabled-bg-color);border-color:var(--el-disabled-border-color)}.el-radio__input.is-disabled.is-checked .el-radio__inner:after{background-color:var(--el-text-color-placeholder)}.el-radio__input.is-disabled+span.el-radio__label{color:var(--el-text-color-placeholder);cursor:not-allowed}.el-radio__input.is-checked .el-radio__inner{border-color:var(--el-color-primary);background:var(--el-color-primary)}.el-radio__input.is-checked .el-radio__inner:after{transform:translate(-50%,-50%) scale(1)}.el-radio__input.is-checked+.el-radio__label{color:var(--el-color-primary)}.el-radio__input.is-focus .el-radio__inner{border-color:var(--el-radio-input-border-color-hover)}.el-radio__inner{border:var(--el-radio-input-border);border-radius:var(--el-radio-input-border-radius);width:var(--el-radio-input-width);height:var(--el-radio-input-height);background-color:var(--el-radio-input-bg-color);position:relative;cursor:pointer;display:inline-block;box-sizing:border-box}.el-radio__inner:hover{border-color:var(--el-radio-input-border-color-hover)}.el-radio__inner:after{width:4px;height:4px;border-radius:var(--el-radio-input-border-radius);background-color:var(--el-color-white);content:"";position:absolute;left:50%;top:50%;transform:translate(-50%,-50%) scale(0);transition:transform .15s ease-in}.el-radio__original{opacity:0;outline:0;position:absolute;z-index:-1;top:0;left:0;right:0;bottom:0;margin:0}.el-radio__original:focus-visible+.el-radio__inner{outline:2px solid var(--el-radio-input-border-color-hover);outline-offset:1px;border-radius:var(--el-radio-input-border-radius)}.el-radio:focus:not(:focus-visible):not(.is-focus):not(:active):not(.is-disabled) .el-radio__inner{box-shadow:0 0 2px 2px var(--el-radio-input-border-color-hover)}.el-radio__label{font-size:var(--el-radio-font-size);padding-left:8px}.el-radio.el-radio--large .el-radio__label{font-size:14px}.el-radio.el-radio--large .el-radio__inner{width:14px;height:14px}.el-radio.el-radio--small .el-radio__label{font-size:12px}.el-radio.el-radio--small .el-radio__inner{width:12px;height:12px}.el-rate{--el-rate-height:20px;--el-rate-font-size:var(--el-font-size-base);--el-rate-icon-size:18px;--el-rate-icon-margin:6px;--el-rate-void-color:var(--el-border-color-darker);--el-rate-fill-color:#f7ba2a;--el-rate-disabled-void-color:var(--el-fill-color);--el-rate-text-color:var(--el-text-color-primary)}.el-rate{display:inline-flex;align-items:center;height:32px}.el-rate:active,.el-rate:focus{outline:0}.el-rate__item{cursor:pointer;display:inline-block;position:relative;font-size:0;vertical-align:middle;color:var(--el-rate-void-color);line-height:normal}.el-rate .el-rate__icon{position:relative;display:inline-block;font-size:var(--el-rate-icon-size);margin-right:var(--el-rate-icon-margin);transition:var(--el-transition-duration)}.el-rate .el-rate__icon.hover{transform:scale(1.15)}.el-rate .el-rate__icon .path2{position:absolute;left:0;top:0}.el-rate .el-rate__icon.is-active{color:var(--el-rate-fill-color)}.el-rate__decimal{position:absolute;top:0;left:0;display:inline-block;overflow:hidden;color:var(--el-rate-fill-color)}.el-rate__decimal--box{position:absolute;top:0;left:0}.el-rate__text{font-size:var(--el-rate-font-size);vertical-align:middle;color:var(--el-rate-text-color)}.el-rate--large{height:40px}.el-rate--small{height:24px}.el-rate--small .el-rate__icon{font-size:14px}.el-rate.is-disabled .el-rate__item{cursor:auto;color:var(--el-rate-disabled-void-color)}.el-result{--el-result-padding:40px 30px;--el-result-icon-font-size:64px;--el-result-title-font-size:20px;--el-result-title-margin-top:20px;--el-result-subtitle-margin-top:10px;--el-result-extra-margin-top:30px}.el-result{display:flex;justify-content:center;align-items:center;flex-direction:column;text-align:center;box-sizing:border-box;padding:var(--el-result-padding)}.el-result__icon svg{width:var(--el-result-icon-font-size);height:var(--el-result-icon-font-size)}.el-result__title{margin-top:var(--el-result-title-margin-top)}.el-result__title p{margin:0;font-size:var(--el-result-title-font-size);color:var(--el-text-color-primary);line-height:1.3}.el-result__subtitle{margin-top:var(--el-result-subtitle-margin-top)}.el-result__subtitle p{margin:0;font-size:var(--el-font-size-base);color:var(--el-text-color-regular);line-height:1.3}.el-result__extra{margin-top:var(--el-result-extra-margin-top)}.el-result .icon-primary{--el-result-color:var(--el-color-primary);color:var(--el-result-color)}.el-result .icon-success{--el-result-color:var(--el-color-success);color:var(--el-result-color)}.el-result .icon-warning{--el-result-color:var(--el-color-warning);color:var(--el-result-color)}.el-result .icon-danger{--el-result-color:var(--el-color-danger);color:var(--el-result-color)}.el-result .icon-error{--el-result-color:var(--el-color-error);color:var(--el-result-color)}.el-result .icon-info{--el-result-color:var(--el-color-info);color:var(--el-result-color)}.el-row{display:flex;flex-wrap:wrap;position:relative;box-sizing:border-box}.el-row.is-justify-center{justify-content:center}.el-row.is-justify-end{justify-content:flex-end}.el-row.is-justify-space-between{justify-content:space-between}.el-row.is-justify-space-around{justify-content:space-around}.el-row.is-justify-space-evenly{justify-content:space-evenly}.el-row.is-align-top{align-items:flex-start}.el-row.is-align-middle{align-items:center}.el-row.is-align-bottom{align-items:flex-end}.el-scrollbar{--el-scrollbar-opacity:.3;--el-scrollbar-bg-color:var(--el-text-color-secondary);--el-scrollbar-hover-opacity:.5;--el-scrollbar-hover-bg-color:var(--el-text-color-secondary)}.el-scrollbar{overflow:hidden;position:relative;height:100%}.el-scrollbar__wrap{overflow:auto;height:100%}.el-scrollbar__wrap--hidden-default{scrollbar-width:none}.el-scrollbar__wrap--hidden-default::-webkit-scrollbar{display:none}.el-scrollbar__thumb{position:relative;display:block;width:0;height:0;cursor:pointer;border-radius:inherit;background-color:var(--el-scrollbar-bg-color,var(--el-text-color-secondary));transition:var(--el-transition-duration) background-color;opacity:var(--el-scrollbar-opacity,.3)}.el-scrollbar__thumb:hover{background-color:var(--el-scrollbar-hover-bg-color,var(--el-text-color-secondary));opacity:var(--el-scrollbar-hover-opacity,.5)}.el-scrollbar__bar{position:absolute;right:2px;bottom:2px;z-index:1;border-radius:4px}.el-scrollbar__bar.is-vertical{width:6px;top:2px}.el-scrollbar__bar.is-vertical>div{width:100%}.el-scrollbar__bar.is-horizontal{height:6px;left:2px}.el-scrollbar__bar.is-horizontal>div{height:100%}.el-scrollbar-fade-enter-active{transition:opacity .34s ease-out}.el-scrollbar-fade-leave-active{transition:opacity .12s ease-out}.el-scrollbar-fade-enter-from,.el-scrollbar-fade-leave-active{opacity:0}.el-select-dropdown__option-item.is-selected:not(.is-multiple).is-disabled{color:var(--el-text-color-disabled)}.el-select-dropdown__option-item.is-selected:not(.is-multiple).is-disabled:after{background-color:var(--el-text-color-disabled)}.el-select-dropdown__option-item:hover:not(.hover){background-color:transparent}.el-select-dropdown.is-multiple .el-select-dropdown__option-item.is-disabled.is-selected{color:var(--el-text-color-disabled)}.el-select-dropdown__list{list-style:none;margin:6px 0!important;padding:0!important;box-sizing:border-box}.el-select-dropdown__option-item{font-size:var(--el-select-font-size);padding:0 32px 0 20px;position:relative;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--el-text-color-regular);height:34px;line-height:34px;box-sizing:border-box;cursor:pointer}.el-select-dropdown__option-item.is-disabled{color:var(--el-text-color-placeholder);cursor:not-allowed}.el-select-dropdown__option-item.is-disabled:hover{background-color:var(--el-bg-color)}.el-select-dropdown__option-item.is-selected{background-color:var(--el-fill-color-light);font-weight:700}.el-select-dropdown__option-item.is-selected:not(.is-multiple){color:var(--el-color-primary)}.el-select-dropdown__option-item.hover{background-color:var(--el-fill-color-light)!important}.el-select-dropdown__option-item:hover{background-color:var(--el-fill-color-light)}.el-select-dropdown.is-multiple .el-select-dropdown__option-item.is-selected{color:var(--el-color-primary);background-color:var(--el-bg-color-overlay)}.el-select-dropdown.is-multiple .el-select-dropdown__option-item.is-selected .el-icon{position:absolute;right:20px;top:0;height:inherit;font-size:12px}.el-select-dropdown.is-multiple .el-select-dropdown__option-item.is-selected .el-icon svg{height:inherit;vertical-align:middle}.el-select-group{margin:0;padding:0}.el-select-group__wrap{position:relative;list-style:none;margin:0;padding:0}.el-select-group__wrap:not(:last-of-type){padding-bottom:24px}.el-select-group__wrap:not(:last-of-type):after{content:"";position:absolute;display:block;left:20px;right:20px;bottom:12px;height:1px;background:var(--el-border-color-light)}.el-select-group__split-dash{position:absolute;left:20px;right:20px;height:1px;background:var(--el-border-color-light)}.el-select-group__title{padding-left:20px;font-size:12px;color:var(--el-color-info);line-height:30px}.el-select-group .el-select-dropdown__item{padding-left:20px}.el-select-v2{--el-select-border-color-hover:var(--el-border-color-hover);--el-select-disabled-border:var(--el-disabled-border-color);--el-select-font-size:var(--el-font-size-base);--el-select-close-hover-color:var(--el-text-color-secondary);--el-select-input-color:var(--el-text-color-placeholder);--el-select-multiple-input-color:var(--el-text-color-regular);--el-select-input-focus-border-color:var(--el-color-primary);--el-select-input-font-size:14px}.el-select-v2{display:inline-block;position:relative;vertical-align:middle;font-size:14px}.el-select-v2__wrapper{display:flex;align-items:center;flex-wrap:wrap;position:relative;box-sizing:border-box;cursor:pointer;padding:1px 30px 1px 0;border:1px solid var(--el-border-color);border-radius:var(--el-border-radius-base);background-color:var(--el-fill-color-blank);transition:var(--el-transition-duration)}.el-select-v2__wrapper:hover{border-color:var(--el-text-color-placeholder)}.el-select-v2__wrapper.is-filterable{cursor:text}.el-select-v2__wrapper.is-focused{border-color:var(--el-color-primary)}.el-select-v2__wrapper.is-hovering:not(.is-focused){border-color:var(--el-border-color-hover)}.el-select-v2__wrapper.is-disabled{cursor:not-allowed;background-color:var(--el-fill-color-light);color:var(--el-text-color-placeholder);border-color:var(--el-select-disabled-border)}.el-select-v2__wrapper.is-disabled:hover{border-color:var(--el-select-disabled-border)}.el-select-v2__wrapper.is-disabled.is-focus{border-color:var(--el-input-focus-border-color)}.el-select-v2__wrapper.is-disabled .is-transparent{opacity:1;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.el-select-v2__wrapper.is-disabled .el-select-v2__caret,.el-select-v2__wrapper.is-disabled .el-select-v2__combobox-input{cursor:not-allowed}.el-select-v2__wrapper .el-select-v2__input-wrapper{box-sizing:border-box;position:relative;-webkit-margin-start:12px;margin-inline-start:12px;max-width:100%;overflow:hidden}.el-select-v2__wrapper,.el-select-v2__wrapper .el-select-v2__input-wrapper{line-height:32px}.el-select-v2__wrapper .el-select-v2__input-wrapper input{--el-input-inner-height:calc(var(--el-component-size, 32px) - 8px);height:var(--el-input-inner-height);line-height:var(--el-input-inner-height);min-width:4px;width:100%;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;border:none;margin:2px 0;outline:0;padding:0}.el-select-v2 .el-select-v2__tags-text{display:inline-block;line-height:normal;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.el-select-v2__empty{padding:10px 0;margin:0;text-align:center;color:var(--el-text-color-secondary);font-size:14px}.el-select-v2__popper.el-popper{background:var(--el-bg-color-overlay);border:1px solid var(--el-border-color-light);box-shadow:var(--el-box-shadow-light)}.el-select-v2__popper.el-popper .el-popper__arrow:before{border:1px solid var(--el-border-color-light)}.el-select-v2__popper.el-popper[data-popper-placement^=top] .el-popper__arrow:before{border-top-color:transparent;border-left-color:transparent}.el-select-v2__popper.el-popper[data-popper-placement^=bottom] .el-popper__arrow:before{border-bottom-color:transparent;border-right-color:transparent}.el-select-v2__popper.el-popper[data-popper-placement^=left] .el-popper__arrow:before{border-left-color:transparent;border-bottom-color:transparent}.el-select-v2__popper.el-popper[data-popper-placement^=right] .el-popper__arrow:before{border-right-color:transparent;border-top-color:transparent}.el-select-v2--large .el-select-v2__wrapper .el-select-v2__combobox-input{height:32px}.el-select-v2--large .el-select-v2__caret,.el-select-v2--large .el-select-v2__suffix{height:40px}.el-select-v2--large .el-select-v2__placeholder{font-size:14px;line-height:40px}.el-select-v2--small .el-select-v2__wrapper .el-select-v2__combobox-input{height:16px}.el-select-v2--small .el-select-v2__caret,.el-select-v2--small .el-select-v2__suffix{height:24px}.el-select-v2--small .el-select-v2__placeholder{font-size:12px;line-height:24px}.el-select-v2 .el-select-v2__selection>span{display:inline-block}.el-select-v2:hover .el-select-v2__combobox-input{border-color:var(--el-select-border-color-hover)}.el-select-v2 .el-select__selection-text{text-overflow:ellipsis;display:inline-block;overflow-x:hidden;vertical-align:bottom}.el-select-v2 .el-select-v2__combobox-input{padding-right:35px;display:block;color:var(--el-text-color-regular)}.el-select-v2 .el-select-v2__combobox-input:focus{border-color:var(--el-select-input-focus-border-color)}.el-select-v2__input{border:none;outline:0;padding:0;margin-left:15px;color:var(--el-select-multiple-input-color);font-size:var(--el-select-font-size);-webkit-appearance:none;-moz-appearance:none;appearance:none;height:28px}.el-select-v2__input.is-small{height:14px}.el-select-v2__close{cursor:pointer;position:absolute;top:8px;z-index:var(--el-index-top);right:25px;color:var(--el-select-input-color);line-height:18px;font-size:var(--el-select-input-font-size)}.el-select-v2__close:hover{color:var(--el-select-close-hover-color)}.el-select-v2__suffix{display:inline-flex;position:absolute;right:12px;height:32px;top:50%;transform:translateY(-50%);color:var(--el-input-icon-color,var(--el-text-color-placeholder))}.el-select-v2__suffix .el-input__icon{height:inherit}.el-select-v2__suffix .el-input__icon:not(:first-child){margin-left:8px}.el-select-v2__caret{color:var(--el-select-input-color);font-size:var(--el-select-input-font-size);transition:var(--el-transition-duration);transform:rotate(180deg);cursor:pointer}.el-select-v2__caret.is-reverse{transform:rotate(0)}.el-select-v2__caret.is-show-close{font-size:var(--el-select-font-size);text-align:center;transform:rotate(180deg);border-radius:var(--el-border-radius-circle);color:var(--el-select-input-color);transition:var(--el-transition-color)}.el-select-v2__caret.is-show-close:hover{color:var(--el-select-close-hover-color)}.el-select-v2__caret.el-icon{height:inherit}.el-select-v2__caret.el-icon svg{vertical-align:middle}.el-select-v2__selection{white-space:normal;z-index:var(--el-index-normal);display:flex;align-items:center;flex-wrap:wrap;width:100%}.el-select-v2__input-calculator{left:0;position:absolute;top:0;visibility:hidden;white-space:pre;z-index:999}.el-select-v2__selected-item{line-height:inherit;height:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;flex-wrap:wrap}.el-select-v2__placeholder{position:absolute;top:50%;transform:translateY(-50%);-webkit-margin-start:12px;margin-inline-start:12px;width:calc(100% - 52px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--el-input-text-color,var(--el-text-color-regular))}.el-select-v2__placeholder.is-transparent{color:var(--el-text-color-placeholder)}.el-select-v2 .el-select-v2__selection .el-tag{box-sizing:border-box;border-color:transparent;margin:2px 0 2px 6px;background-color:var(--el-fill-color)}.el-select-v2 .el-select-v2__selection .el-tag .el-icon-close{background-color:var(--el-text-color-placeholder);right:-7px;color:var(--el-color-white)}.el-select-v2 .el-select-v2__selection .el-tag .el-icon-close:hover{background-color:var(--el-text-color-secondary)}.el-select-v2 .el-select-v2__selection .el-tag .el-icon-close:before{display:block;transform:translateY(.5px)}.el-select-v2.el-select-v2--small .el-select-v2__selection .el-tag{margin:1px 0 1px 6px;height:18px}.el-select-dropdown{z-index:calc(var(--el-index-top) + 1);border-radius:var(--el-border-radius-base);box-sizing:border-box}.el-select-dropdown.is-multiple .el-select-dropdown__item.selected{color:var(--el-color-primary);background-color:var(--el-bg-color-overlay)}.el-select-dropdown.is-multiple .el-select-dropdown__item.selected.hover{background-color:var(--el-fill-color-light)}.el-select-dropdown.is-multiple .el-select-dropdown__item.selected:after{content:"";position:absolute;top:50%;right:20px;border-top:none;border-right:none;background-repeat:no-repeat;background-position:center;background-color:var(--el-color-primary);-webkit-mask:url("data:image/svg+xml;utf8,%3Csvg class='icon' width='200' height='200' viewBox='0 0 1024 1024' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='currentColor' d='M406.656 706.944L195.84 496.256a32 32 0 10-45.248 45.248l256 256 512-512a32 32 0 00-45.248-45.248L406.592 706.944z'%3E%3C/path%3E%3C/svg%3E") no-repeat;mask:url("data:image/svg+xml;utf8,%3Csvg class='icon' width='200' height='200' viewBox='0 0 1024 1024' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='currentColor' d='M406.656 706.944L195.84 496.256a32 32 0 10-45.248 45.248l256 256 512-512a32 32 0 00-45.248-45.248L406.592 706.944z'%3E%3C/path%3E%3C/svg%3E") no-repeat;mask-size:100% 100%;-webkit-mask:url("data:image/svg+xml;utf8,%3Csvg class='icon' width='200' height='200' viewBox='0 0 1024 1024' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='currentColor' d='M406.656 706.944L195.84 496.256a32 32 0 10-45.248 45.248l256 256 512-512a32 32 0 00-45.248-45.248L406.592 706.944z'%3E%3C/path%3E%3C/svg%3E") no-repeat;-webkit-mask-size:100% 100%;transform:translateY(-50%);width:12px;height:12px}.el-select-dropdown.is-multiple .el-select-dropdown__item.selected.is-disabled:after{background-color:var(--el-text-color-disabled)}.el-select-dropdown .el-select-dropdown__option-item.is-selected:after{content:"";position:absolute;top:50%;right:20px;border-top:none;border-right:none;background-repeat:no-repeat;background-position:center;background-color:var(--el-color-primary);-webkit-mask:url("data:image/svg+xml;utf8,%3Csvg class='icon' width='200' height='200' viewBox='0 0 1024 1024' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='currentColor' d='M406.656 706.944L195.84 496.256a32 32 0 10-45.248 45.248l256 256 512-512a32 32 0 00-45.248-45.248L406.592 706.944z'%3E%3C/path%3E%3C/svg%3E") no-repeat;mask:url("data:image/svg+xml;utf8,%3Csvg class='icon' width='200' height='200' viewBox='0 0 1024 1024' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='currentColor' d='M406.656 706.944L195.84 496.256a32 32 0 10-45.248 45.248l256 256 512-512a32 32 0 00-45.248-45.248L406.592 706.944z'%3E%3C/path%3E%3C/svg%3E") no-repeat;mask-size:100% 100%;-webkit-mask:url("data:image/svg+xml;utf8,%3Csvg class='icon' width='200' height='200' viewBox='0 0 1024 1024' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='currentColor' d='M406.656 706.944L195.84 496.256a32 32 0 10-45.248 45.248l256 256 512-512a32 32 0 00-45.248-45.248L406.592 706.944z'%3E%3C/path%3E%3C/svg%3E") no-repeat;-webkit-mask-size:100% 100%;transform:translateY(-50%);width:12px;height:12px}.el-select-dropdown .el-scrollbar.is-empty .el-select-dropdown__list{padding:0}.el-select-dropdown .el-select-dropdown__item.is-disabled:hover{background-color:unset}.el-select-dropdown .el-select-dropdown__item.is-disabled.selected{color:var(--el-text-color-disabled)}.el-select-dropdown__empty{padding:10px 0;margin:0;text-align:center;color:var(--el-text-color-secondary);font-size:var(--el-select-font-size)}.el-select-dropdown__wrap{max-height:274px}.el-select-dropdown__list{list-style:none;padding:6px 0;margin:0;box-sizing:border-box}.el-select-dropdown__header{padding:10px;border-bottom:1px solid var(--el-border-color-light)}.el-select-dropdown__footer{padding:10px;border-top:1px solid var(--el-border-color-light)}.el-select{--el-select-border-color-hover:var(--el-border-color-hover);--el-select-disabled-border:var(--el-disabled-border-color);--el-select-font-size:var(--el-font-size-base);--el-select-close-hover-color:var(--el-text-color-secondary);--el-select-input-color:var(--el-text-color-placeholder);--el-select-multiple-input-color:var(--el-text-color-regular);--el-select-input-focus-border-color:var(--el-color-primary);--el-select-input-font-size:14px}.el-select{display:inline-block;position:relative;vertical-align:middle;line-height:32px}.el-select__popper.el-popper{background:var(--el-bg-color-overlay);border:1px solid var(--el-border-color-light);box-shadow:var(--el-box-shadow-light)}.el-select__popper.el-popper .el-popper__arrow:before{border:1px solid var(--el-border-color-light)}.el-select__popper.el-popper[data-popper-placement^=top] .el-popper__arrow:before{border-top-color:transparent;border-left-color:transparent}.el-select__popper.el-popper[data-popper-placement^=bottom] .el-popper__arrow:before{border-bottom-color:transparent;border-right-color:transparent}.el-select__popper.el-popper[data-popper-placement^=left] .el-popper__arrow:before{border-left-color:transparent;border-bottom-color:transparent}.el-select__popper.el-popper[data-popper-placement^=right] .el-popper__arrow:before{border-right-color:transparent;border-top-color:transparent}.el-select .el-select-tags-wrapper.has-prefix{margin-left:6px}.el-select--large{line-height:40px}.el-select--large .el-select-tags-wrapper.has-prefix{margin-left:8px}.el-select--small{line-height:24px}.el-select--small .el-select-tags-wrapper.has-prefix{margin-left:4px}.el-select .el-select__tags>span{display:inline-block}.el-select:hover:not(.el-select--disabled) .el-input__wrapper{box-shadow:0 0 0 1px var(--el-select-border-color-hover) inset}.el-select .el-select__tags-text{display:inline-block;line-height:normal;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.el-select .el-input__wrapper{cursor:pointer}.el-select .el-input__wrapper.is-focus{box-shadow:0 0 0 1px var(--el-select-input-focus-border-color) inset!important}.el-select .el-input__inner{cursor:pointer}.el-select .el-input{display:flex}.el-select .el-input .el-select__caret{color:var(--el-select-input-color);font-size:var(--el-select-input-font-size);transition:transform var(--el-transition-duration);transform:rotate(0);cursor:pointer}.el-select .el-input .el-select__caret.is-reverse{transform:rotate(-180deg)}.el-select .el-input .el-select__caret.is-show-close{font-size:var(--el-select-font-size);text-align:center;transform:rotate(0);border-radius:var(--el-border-radius-circle);color:var(--el-select-input-color);transition:var(--el-transition-color)}.el-select .el-input .el-select__caret.is-show-close:hover{color:var(--el-select-close-hover-color)}.el-select .el-input .el-select__caret.el-icon{position:relative;height:inherit;z-index:2}.el-select .el-input.is-disabled .el-input__wrapper{cursor:not-allowed}.el-select .el-input.is-disabled .el-input__wrapper:hover{box-shadow:0 0 0 1px var(--el-select-disabled-border) inset}.el-select .el-input.is-disabled .el-input__inner,.el-select .el-input.is-disabled .el-select__caret{cursor:not-allowed}.el-select .el-input.is-focus .el-input__wrapper{box-shadow:0 0 0 1px var(--el-select-input-focus-border-color) inset!important}.el-select__input{border:none;outline:0;padding:0;margin-left:15px;color:var(--el-select-multiple-input-color);font-size:var(--el-select-font-size);-webkit-appearance:none;-moz-appearance:none;appearance:none;height:28px;background-color:transparent}.el-select__input.is-disabled{cursor:not-allowed}.el-select__input--iOS{position:absolute;left:0;top:0;z-index:6}.el-select__input.is-small{height:14px}.el-select__close{cursor:pointer;position:absolute;top:8px;z-index:var(--el-index-top);right:25px;color:var(--el-select-input-color);line-height:18px;font-size:var(--el-select-input-font-size)}.el-select__close:hover{color:var(--el-select-close-hover-color)}.el-select__tags{position:absolute;line-height:normal;top:50%;transform:translateY(-50%);white-space:normal;z-index:var(--el-index-normal);display:flex;align-items:center;flex-wrap:wrap;cursor:pointer}.el-select__tags .el-tag{box-sizing:border-box;border-color:transparent;margin:2px 6px 2px 0}.el-select__tags .el-tag:last-child{margin-right:0}.el-select__tags .el-tag .el-icon-close{background-color:var(--el-text-color-placeholder);right:-7px;top:0;color:#fff}.el-select__tags .el-tag .el-icon-close:hover{background-color:var(--el-text-color-secondary)}.el-select__tags .el-tag .el-icon-close:before{display:block;transform:translateY(.5px)}.el-select__tags .el-tag--info{background-color:var(--el-fill-color)}.el-select__tags.is-disabled{cursor:not-allowed}.el-select__collapse-tags{white-space:normal;z-index:var(--el-index-normal);display:flex;align-items:center;flex-wrap:wrap;cursor:pointer}.el-select__collapse-tags .el-tag{box-sizing:border-box;border-color:transparent;margin:2px 6px 2px 0}.el-select__collapse-tags .el-tag:last-child{margin-right:0}.el-select__collapse-tags .el-tag .el-icon-close{background-color:var(--el-text-color-placeholder);right:-7px;top:0;color:#fff}.el-select__collapse-tags .el-tag .el-icon-close:hover{background-color:var(--el-text-color-secondary)}.el-select__collapse-tags .el-tag .el-icon-close:before{display:block;transform:translateY(.5px)}.el-select__collapse-tags .el-tag--info{background-color:var(--el-fill-color)}.el-select__collapse-tag{line-height:inherit;height:inherit;display:flex}.el-skeleton{--el-skeleton-circle-size:var(--el-avatar-size)}.el-skeleton__item{background:var(--el-skeleton-color);display:inline-block;height:16px;border-radius:var(--el-border-radius-base);width:100%}.el-skeleton__circle{border-radius:50%;width:var(--el-skeleton-circle-size);height:var(--el-skeleton-circle-size);line-height:var(--el-skeleton-circle-size)}.el-skeleton__button{height:40px;width:64px;border-radius:4px}.el-skeleton__p{width:100%}.el-skeleton__p.is-last{width:61%}.el-skeleton__p.is-first{width:33%}.el-skeleton__text{width:100%;height:var(--el-font-size-small)}.el-skeleton__caption{height:var(--el-font-size-extra-small)}.el-skeleton__h1{height:var(--el-font-size-extra-large)}.el-skeleton__h3{height:var(--el-font-size-large)}.el-skeleton__h5{height:var(--el-font-size-medium)}.el-skeleton__image{width:unset;display:flex;align-items:center;justify-content:center;border-radius:0}.el-skeleton__image svg{color:var(--el-svg-monochrome-grey);fill:currentColor;width:22%;height:22%}.el-skeleton{--el-skeleton-color:var(--el-fill-color);--el-skeleton-to-color:var(--el-fill-color-darker)}@-webkit-keyframes el-skeleton-loading{0%{background-position:100% 50%}to{background-position:0 50%}}@keyframes el-skeleton-loading{0%{background-position:100% 50%}to{background-position:0 50%}}.el-skeleton{width:100%}.el-skeleton__first-line,.el-skeleton__paragraph{height:16px;margin-top:16px;background:var(--el-skeleton-color)}.el-skeleton.is-animated .el-skeleton__item{background:linear-gradient(90deg,var(--el-skeleton-color) 25%,var(--el-skeleton-to-color) 37%,var(--el-skeleton-color) 63%);background-size:400% 100%;-webkit-animation:el-skeleton-loading 1.4s ease infinite;animation:el-skeleton-loading 1.4s ease infinite}.el-slider{--el-slider-main-bg-color:var(--el-color-primary);--el-slider-runway-bg-color:var(--el-border-color-light);--el-slider-stop-bg-color:var(--el-color-white);--el-slider-disabled-color:var(--el-text-color-placeholder);--el-slider-border-radius:3px;--el-slider-height:6px;--el-slider-button-size:20px;--el-slider-button-wrapper-size:36px;--el-slider-button-wrapper-offset:-15px}.el-slider{width:100%;height:32px;display:flex;align-items:center}.el-slider__runway{flex:1;height:var(--el-slider-height);background-color:var(--el-slider-runway-bg-color);border-radius:var(--el-slider-border-radius);position:relative;cursor:pointer}.el-slider__runway.show-input{margin-right:30px;width:auto}.el-slider__runway.is-disabled{cursor:default}.el-slider__runway.is-disabled .el-slider__bar{background-color:var(--el-slider-disabled-color)}.el-slider__runway.is-disabled .el-slider__button{border-color:var(--el-slider-disabled-color)}.el-slider__runway.is-disabled .el-slider__button-wrapper.hover,.el-slider__runway.is-disabled .el-slider__button-wrapper:hover,.el-slider__runway.is-disabled .el-slider__button-wrapper.dragging{cursor:not-allowed}.el-slider__runway.is-disabled .el-slider__button.dragging,.el-slider__runway.is-disabled .el-slider__button.hover,.el-slider__runway.is-disabled .el-slider__button:hover{transform:scale(1)}.el-slider__runway.is-disabled .el-slider__button.hover,.el-slider__runway.is-disabled .el-slider__button:hover,.el-slider__runway.is-disabled .el-slider__button.dragging{cursor:not-allowed}.el-slider__input{flex-shrink:0;width:130px}.el-slider__bar{height:var(--el-slider-height);background-color:var(--el-slider-main-bg-color);border-top-left-radius:var(--el-slider-border-radius);border-bottom-left-radius:var(--el-slider-border-radius);position:absolute}.el-slider__button-wrapper{height:var(--el-slider-button-wrapper-size);width:var(--el-slider-button-wrapper-size);position:absolute;z-index:1;top:var(--el-slider-button-wrapper-offset);transform:translate(-50%);background-color:transparent;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;line-height:normal;outline:0}.el-slider__button-wrapper:after{display:inline-block;content:"";height:100%;vertical-align:middle}.el-slider__button-wrapper.hover,.el-slider__button-wrapper:hover{cursor:-webkit-grab;cursor:grab}.el-slider__button-wrapper.dragging{cursor:-webkit-grabbing;cursor:grabbing}.el-slider__button{display:inline-block;width:var(--el-slider-button-size);height:var(--el-slider-button-size);vertical-align:middle;border:solid 2px var(--el-slider-main-bg-color);background-color:var(--el-color-white);border-radius:50%;box-sizing:border-box;transition:var(--el-transition-duration-fast);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.el-slider__button.dragging,.el-slider__button.hover,.el-slider__button:hover{transform:scale(1.2)}.el-slider__button.hover,.el-slider__button:hover{cursor:-webkit-grab;cursor:grab}.el-slider__button.dragging{cursor:-webkit-grabbing;cursor:grabbing}.el-slider__stop{position:absolute;height:var(--el-slider-height);width:var(--el-slider-height);border-radius:var(--el-border-radius-circle);background-color:var(--el-slider-stop-bg-color);transform:translate(-50%)}.el-slider__marks{top:0;left:12px;width:18px;height:100%}.el-slider__marks-text{position:absolute;transform:translate(-50%);font-size:14px;color:var(--el-color-info);margin-top:15px;white-space:pre}.el-slider.is-vertical{position:relative;display:inline-flex;width:auto;height:100%;flex:0}.el-slider.is-vertical .el-slider__runway{width:var(--el-slider-height);height:100%;margin:0 16px}.el-slider.is-vertical .el-slider__bar{width:var(--el-slider-height);height:auto;border-radius:0 0 3px 3px}.el-slider.is-vertical .el-slider__button-wrapper{top:auto;left:var(--el-slider-button-wrapper-offset);transform:translateY(50%)}.el-slider.is-vertical .el-slider__stop{transform:translateY(50%)}.el-slider.is-vertical .el-slider__marks-text{margin-top:0;left:15px;transform:translateY(50%)}.el-slider--large{height:40px}.el-slider--small{height:24px}.el-space{display:inline-flex;vertical-align:top}.el-space__item{display:flex;flex-wrap:wrap}.el-space__item>*{flex:1}.el-space--vertical{flex-direction:column}.el-time-spinner{width:100%;white-space:nowrap}.el-spinner{display:inline-block;vertical-align:middle}.el-spinner-inner{-webkit-animation:rotate 2s linear infinite;animation:rotate 2s linear infinite;width:50px;height:50px}.el-spinner-inner .path{stroke:var(--el-border-color-lighter);stroke-linecap:round;-webkit-animation:dash 1.5s ease-in-out infinite;animation:dash 1.5s ease-in-out infinite}@-webkit-keyframes rotate{to{transform:rotate(360deg)}}@keyframes rotate{to{transform:rotate(360deg)}}@-webkit-keyframes dash{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}to{stroke-dasharray:90,150;stroke-dashoffset:-124}}@keyframes dash{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}to{stroke-dasharray:90,150;stroke-dashoffset:-124}}.el-step{position:relative;flex-shrink:1}.el-step:last-of-type .el-step__line{display:none}.el-step:last-of-type.is-flex{flex-basis:auto!important;flex-shrink:0;flex-grow:0}.el-step:last-of-type .el-step__description,.el-step:last-of-type .el-step__main{padding-right:0}.el-step__head{position:relative;width:100%}.el-step__head.is-process{color:var(--el-text-color-primary);border-color:var(--el-text-color-primary)}.el-step__head.is-wait{color:var(--el-text-color-placeholder);border-color:var(--el-text-color-placeholder)}.el-step__head.is-success{color:var(--el-color-success);border-color:var(--el-color-success)}.el-step__head.is-error{color:var(--el-color-danger);border-color:var(--el-color-danger)}.el-step__head.is-finish{color:var(--el-color-primary);border-color:var(--el-color-primary)}.el-step__icon{position:relative;z-index:1;display:inline-flex;justify-content:center;align-items:center;width:24px;height:24px;font-size:14px;box-sizing:border-box;background:var(--el-bg-color);transition:.15s ease-out}.el-step__icon.is-text{border-radius:50%;border:2px solid;border-color:inherit}.el-step__icon.is-icon{width:40px}.el-step__icon-inner{display:inline-block;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-align:center;font-weight:700;line-height:1;color:inherit}.el-step__icon-inner[class*=el-icon]:not(.is-status){font-size:25px;font-weight:400}.el-step__icon-inner.is-status{transform:translateY(1px)}.el-step__line{position:absolute;border-color:inherit;background-color:var(--el-text-color-placeholder)}.el-step__line-inner{display:block;border-width:1px;border-style:solid;border-color:inherit;transition:.15s ease-out;box-sizing:border-box;width:0;height:0}.el-step__main{white-space:normal;text-align:left}.el-step__title{font-size:16px;line-height:38px}.el-step__title.is-process{font-weight:700;color:var(--el-text-color-primary)}.el-step__title.is-wait{color:var(--el-text-color-placeholder)}.el-step__title.is-success{color:var(--el-color-success)}.el-step__title.is-error{color:var(--el-color-danger)}.el-step__title.is-finish{color:var(--el-color-primary)}.el-step__description{padding-right:10%;margin-top:-5px;font-size:12px;line-height:20px;font-weight:400}.el-step__description.is-process{color:var(--el-text-color-primary)}.el-step__description.is-wait{color:var(--el-text-color-placeholder)}.el-step__description.is-success{color:var(--el-color-success)}.el-step__description.is-error{color:var(--el-color-danger)}.el-step__description.is-finish{color:var(--el-color-primary)}.el-step.is-horizontal{display:inline-block}.el-step.is-horizontal .el-step__line{height:2px;top:11px;left:0;right:0}.el-step.is-vertical{display:flex}.el-step.is-vertical .el-step__head{flex-grow:0;width:24px}.el-step.is-vertical .el-step__main{padding-left:10px;flex-grow:1}.el-step.is-vertical .el-step__title{line-height:24px;padding-bottom:8px}.el-step.is-vertical .el-step__line{width:2px;top:0;bottom:0;left:11px}.el-step.is-vertical .el-step__icon.is-icon{width:24px}.el-step.is-center .el-step__head,.el-step.is-center .el-step__main{text-align:center}.el-step.is-center .el-step__description{padding-left:20%;padding-right:20%}.el-step.is-center .el-step__line{left:50%;right:-50%}.el-step.is-simple{display:flex;align-items:center}.el-step.is-simple .el-step__head{width:auto;font-size:0;padding-right:10px}.el-step.is-simple .el-step__icon{background:0 0;width:16px;height:16px;font-size:12px}.el-step.is-simple .el-step__icon-inner[class*=el-icon]:not(.is-status){font-size:18px}.el-step.is-simple .el-step__icon-inner.is-status{transform:scale(.8) translateY(1px)}.el-step.is-simple .el-step__main{position:relative;display:flex;align-items:stretch;flex-grow:1}.el-step.is-simple .el-step__title{font-size:16px;line-height:20px}.el-step.is-simple:not(:last-of-type) .el-step__title{max-width:50%;word-break:break-all}.el-step.is-simple .el-step__arrow{flex-grow:1;display:flex;align-items:center;justify-content:center}.el-step.is-simple .el-step__arrow:after,.el-step.is-simple .el-step__arrow:before{content:"";display:inline-block;position:absolute;height:15px;width:1px;background:var(--el-text-color-placeholder)}.el-step.is-simple .el-step__arrow:before{transform:rotate(-45deg) translateY(-4px);transform-origin:0 0}.el-step.is-simple .el-step__arrow:after{transform:rotate(45deg) translateY(4px);transform-origin:100% 100%}.el-step.is-simple:last-of-type .el-step__arrow{display:none}.el-steps{display:flex}.el-steps--simple{padding:13px 8%;border-radius:4px;background:var(--el-fill-color-light)}.el-steps--horizontal{white-space:nowrap}.el-steps--vertical{height:100%;flex-flow:column}.el-switch{--el-switch-on-color:var(--el-color-primary);--el-switch-off-color:var(--el-border-color)}.el-switch{display:inline-flex;align-items:center;position:relative;font-size:14px;line-height:20px;height:32px;vertical-align:middle}.el-switch.is-disabled .el-switch__core,.el-switch.is-disabled .el-switch__label{cursor:not-allowed}.el-switch__label{transition:var(--el-transition-duration-fast);height:20px;display:inline-block;font-size:14px;font-weight:500;cursor:pointer;vertical-align:middle;color:var(--el-text-color-primary)}.el-switch__label.is-active{color:var(--el-color-primary)}.el-switch__label--left{margin-right:10px}.el-switch__label--right{margin-left:10px}.el-switch__label *{line-height:1;font-size:14px;display:inline-block}.el-switch__label .el-icon{height:inherit}.el-switch__label .el-icon svg{vertical-align:middle}.el-switch__input{position:absolute;width:0;height:0;opacity:0;margin:0}.el-switch__input:focus-visible~.el-switch__core{outline:2px solid var(--el-switch-on-color);outline-offset:1px}.el-switch__core{display:inline-flex;position:relative;align-items:center;min-width:40px;height:20px;border:1px solid var(--el-switch-border-color,var(--el-switch-off-color));outline:0;border-radius:10px;box-sizing:border-box;background:var(--el-switch-off-color);cursor:pointer;transition:border-color var(--el-transition-duration),background-color var(--el-transition-duration)}.el-switch__core .el-switch__inner{width:100%;transition:all var(--el-transition-duration);height:16px;display:flex;justify-content:center;align-items:center;overflow:hidden;padding:0 4px 0 18px}.el-switch__core .el-switch__inner .is-icon,.el-switch__core .el-switch__inner .is-text{font-size:12px;color:var(--el-color-white);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.el-switch__core .el-switch__action{position:absolute;left:1px;border-radius:var(--el-border-radius-circle);transition:all var(--el-transition-duration);width:16px;height:16px;background-color:var(--el-color-white);display:flex;justify-content:center;align-items:center;color:var(--el-switch-off-color)}.el-switch.is-checked .el-switch__core{border-color:var(--el-switch-border-color,var(--el-switch-on-color));background-color:var(--el-switch-on-color)}.el-switch.is-checked .el-switch__core .el-switch__action{left:calc(100% - 17px);color:var(--el-switch-on-color)}.el-switch.is-checked .el-switch__core .el-switch__inner{padding:0 18px 0 4px}.el-switch.is-disabled{opacity:.6}.el-switch--wide .el-switch__label.el-switch__label--left span{left:10px}.el-switch--wide .el-switch__label.el-switch__label--right span{right:10px}.el-switch .label-fade-enter-from,.el-switch .label-fade-leave-active{opacity:0}.el-switch--large{font-size:14px;line-height:24px;height:40px}.el-switch--large .el-switch__label{height:24px;font-size:14px}.el-switch--large .el-switch__label *{font-size:14px}.el-switch--large .el-switch__core{min-width:50px;height:24px;border-radius:12px}.el-switch--large .el-switch__core .el-switch__inner{height:20px;padding:0 6px 0 22px}.el-switch--large .el-switch__core .el-switch__action{width:20px;height:20px}.el-switch--large.is-checked .el-switch__core .el-switch__action{left:calc(100% - 21px)}.el-switch--large.is-checked .el-switch__core .el-switch__inner{padding:0 22px 0 6px}.el-switch--small{font-size:12px;line-height:16px;height:24px}.el-switch--small .el-switch__label{height:16px;font-size:12px}.el-switch--small .el-switch__label *{font-size:12px}.el-switch--small .el-switch__core{min-width:30px;height:16px;border-radius:8px}.el-switch--small .el-switch__core .el-switch__inner{height:12px;padding:0 2px 0 14px}.el-switch--small .el-switch__core .el-switch__action{width:12px;height:12px}.el-switch--small.is-checked .el-switch__core .el-switch__action{left:calc(100% - 13px)}.el-switch--small.is-checked .el-switch__core .el-switch__inner{padding:0 14px 0 2px}.el-table-column--selection .cell{padding-left:14px;padding-right:14px}.el-table-filter{border:solid 1px var(--el-border-color-lighter);border-radius:2px;background-color:#fff;box-shadow:var(--el-box-shadow-light);box-sizing:border-box}.el-table-filter__list{padding:5px 0;margin:0;list-style:none;min-width:100px}.el-table-filter__list-item{line-height:36px;padding:0 10px;cursor:pointer;font-size:var(--el-font-size-base)}.el-table-filter__list-item:hover{background-color:var(--el-color-primary-light-9);color:var(--el-color-primary)}.el-table-filter__list-item.is-active{background-color:var(--el-color-primary);color:#fff}.el-table-filter__content{min-width:100px}.el-table-filter__bottom{border-top:1px solid var(--el-border-color-lighter);padding:8px}.el-table-filter__bottom button{background:0 0;border:none;color:var(--el-text-color-regular);cursor:pointer;font-size:var(--el-font-size-small);padding:0 3px}.el-table-filter__bottom button:hover{color:var(--el-color-primary)}.el-table-filter__bottom button:focus{outline:0}.el-table-filter__bottom button.is-disabled{color:var(--el-disabled-text-color);cursor:not-allowed}.el-table-filter__wrap{max-height:280px}.el-table-filter__checkbox-group{padding:10px}.el-table-filter__checkbox-group label.el-checkbox{display:flex;align-items:center;margin-right:5px;margin-bottom:12px;margin-left:5px;height:unset}.el-table-filter__checkbox-group .el-checkbox:last-child{margin-bottom:0}.el-table{--el-table-border-color:var(--el-border-color-lighter);--el-table-border:1px solid var(--el-table-border-color);--el-table-text-color:var(--el-text-color-regular);--el-table-header-text-color:var(--el-text-color-secondary);--el-table-row-hover-bg-color:var(--el-fill-color-light);--el-table-current-row-bg-color:var(--el-color-primary-light-9);--el-table-header-bg-color:var(--el-bg-color);--el-table-fixed-box-shadow:var(--el-box-shadow-light);--el-table-bg-color:var(--el-fill-color-blank);--el-table-tr-bg-color:var(--el-bg-color);--el-table-expanded-cell-bg-color:var(--el-fill-color-blank);--el-table-fixed-left-column:inset 10px 0 10px -10px rgba(0, 0, 0, .15);--el-table-fixed-right-column:inset -10px 0 10px -10px rgba(0, 0, 0, .15);--el-table-index:var(--el-index-normal)}.el-table{position:relative;overflow:hidden;box-sizing:border-box;height:-webkit-fit-content;height:-moz-fit-content;height:fit-content;width:100%;max-width:100%;background-color:var(--el-table-bg-color);font-size:14px;color:var(--el-table-text-color)}.el-table__inner-wrapper{position:relative;display:flex;flex-direction:column;height:100%}.el-table__inner-wrapper:before{left:0;bottom:0;width:100%;height:1px}.el-table tbody:focus-visible{outline:0}.el-table.has-footer.el-table--fluid-height tr:last-child td.el-table__cell,.el-table.has-footer.el-table--scrollable-y tr:last-child td.el-table__cell{border-bottom-color:transparent}.el-table__empty-block{position:-webkit-sticky;position:sticky;left:0;min-height:60px;text-align:center;width:100%;display:flex;justify-content:center;align-items:center}.el-table__empty-text{line-height:60px;width:50%;color:var(--el-text-color-secondary)}.el-table__expand-column .cell{padding:0;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.el-table__expand-icon{position:relative;cursor:pointer;color:var(--el-text-color-regular);font-size:12px;transition:transform var(--el-transition-duration-fast) ease-in-out;height:20px}.el-table__expand-icon--expanded{transform:rotate(90deg)}.el-table__expand-icon>.el-icon{font-size:12px}.el-table__expanded-cell{background-color:var(--el-table-expanded-cell-bg-color)}.el-table__expanded-cell[class*=cell]{padding:20px 50px}.el-table__expanded-cell:hover{background-color:transparent!important}.el-table__placeholder{display:inline-block;width:20px}.el-table__append-wrapper{overflow:hidden}.el-table--fit{border-right:0;border-bottom:0}.el-table--fit .el-table__cell.gutter{border-right-width:1px}.el-table thead{color:var(--el-table-header-text-color)}.el-table thead th{font-weight:600}.el-table thead.is-group th.el-table__cell{background:var(--el-fill-color-light)}.el-table tfoot td.el-table__cell{background-color:var(--el-table-row-hover-bg-color);color:var(--el-table-text-color)}.el-table .el-table__cell{padding:8px 0;min-width:0;box-sizing:border-box;text-overflow:ellipsis;vertical-align:middle;position:relative;text-align:left;z-index:var(--el-table-index)}.el-table .el-table__cell.is-center{text-align:center}.el-table .el-table__cell.is-right{text-align:right}.el-table .el-table__cell.gutter{width:15px;border-right-width:0;border-bottom-width:0;padding:0}.el-table .el-table__cell.is-hidden>*{visibility:hidden}.el-table .cell{box-sizing:border-box;overflow:hidden;text-overflow:ellipsis;white-space:normal;word-break:break-all;line-height:23px;padding:0 12px}.el-table .cell.el-tooltip{white-space:nowrap;min-width:50px}.el-table--large{font-size:var(--el-font-size-base)}.el-table--large .el-table__cell{padding:12px 0}.el-table--large .cell{padding:0 16px}.el-table--default{font-size:14px}.el-table--default .el-table__cell{padding:8px 0}.el-table--default .cell{padding:0 12px}.el-table--small{font-size:12px}.el-table--small .el-table__cell{padding:4px 0}.el-table--small .cell{padding:0 8px}.el-table tr{background-color:var(--el-table-tr-bg-color)}.el-table tr input[type=checkbox]{margin:0}.el-table td.el-table__cell,.el-table th.el-table__cell.is-leaf{border-bottom:var(--el-table-border)}.el-table th.el-table__cell.is-sortable{cursor:pointer}.el-table th.el-table__cell{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:var(--el-table-header-bg-color)}.el-table th.el-table__cell>.cell.highlight{color:var(--el-color-primary)}.el-table th.el-table__cell.required>div:before{display:inline-block;content:"";width:8px;height:8px;border-radius:50%;background:#ff4d51;margin-right:5px;vertical-align:middle}.el-table td.el-table__cell div{box-sizing:border-box}.el-table td.el-table__cell.gutter{width:0}.el-table--border .el-table__inner-wrapper:after,.el-table--border:after,.el-table--border:before,.el-table__inner-wrapper:before{content:"";position:absolute;background-color:var(--el-table-border-color);z-index:calc(var(--el-table-index) + 2)}.el-table--border .el-table__inner-wrapper:after{left:0;top:0;width:100%;height:1px;z-index:calc(var(--el-table-index) + 2)}.el-table--border:before{top:-1px;left:0;width:1px;height:100%}.el-table--border:after{top:-1px;right:0;width:1px;height:100%}.el-table--border .el-table__inner-wrapper{border-right:none;border-bottom:none}.el-table--border .el-table__footer-wrapper{position:relative;flex-shrink:0}.el-table--border .el-table__cell{border-right:var(--el-table-border)}.el-table--border th.el-table__cell.gutter:last-of-type{border-bottom:var(--el-table-border);border-bottom-width:1px}.el-table--border th.el-table__cell{border-bottom:var(--el-table-border)}.el-table--hidden{visibility:hidden}.el-table__body-wrapper,.el-table__footer-wrapper,.el-table__header-wrapper{width:100%}.el-table__body-wrapper tr td.el-table-fixed-column--left,.el-table__body-wrapper tr td.el-table-fixed-column--right,.el-table__body-wrapper tr th.el-table-fixed-column--left,.el-table__body-wrapper tr th.el-table-fixed-column--right,.el-table__footer-wrapper tr td.el-table-fixed-column--left,.el-table__footer-wrapper tr td.el-table-fixed-column--right,.el-table__footer-wrapper tr th.el-table-fixed-column--left,.el-table__footer-wrapper tr th.el-table-fixed-column--right,.el-table__header-wrapper tr td.el-table-fixed-column--left,.el-table__header-wrapper tr td.el-table-fixed-column--right,.el-table__header-wrapper tr th.el-table-fixed-column--left,.el-table__header-wrapper tr th.el-table-fixed-column--right{position:-webkit-sticky!important;position:sticky!important;background:inherit;z-index:calc(var(--el-table-index) + 1)}.el-table__body-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--right.is-first-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--right.is-last-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--right.is-first-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--right.is-last-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--right.is-first-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--right.is-last-column:before{content:"";position:absolute;top:0;width:10px;bottom:-1px;overflow-x:hidden;overflow-y:hidden;box-shadow:none;touch-action:none;pointer-events:none}.el-table__body-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--right.is-first-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--right.is-first-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--right.is-first-column:before{left:-10px}.el-table__body-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--right.is-last-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--right.is-last-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--right.is-last-column:before{right:-10px;box-shadow:none}.el-table__body-wrapper tr td.el-table__fixed-right-patch,.el-table__body-wrapper tr th.el-table__fixed-right-patch,.el-table__footer-wrapper tr td.el-table__fixed-right-patch,.el-table__footer-wrapper tr th.el-table__fixed-right-patch,.el-table__header-wrapper tr td.el-table__fixed-right-patch,.el-table__header-wrapper tr th.el-table__fixed-right-patch{position:-webkit-sticky!important;position:sticky!important;z-index:calc(var(--el-table-index) + 1);background:#fff;right:0}.el-table__header-wrapper{flex-shrink:0}.el-table__header-wrapper tr th.el-table-fixed-column--left,.el-table__header-wrapper tr th.el-table-fixed-column--right{background-color:var(--el-table-header-bg-color)}.el-table__body,.el-table__footer,.el-table__header{table-layout:fixed;border-collapse:separate}.el-table__header-wrapper{overflow:hidden}.el-table__header-wrapper tbody td.el-table__cell{background-color:var(--el-table-row-hover-bg-color);color:var(--el-table-text-color)}.el-table__footer-wrapper{overflow:hidden;flex-shrink:0}.el-table__body-wrapper .el-table-column--selection>.cell,.el-table__header-wrapper .el-table-column--selection>.cell{display:inline-flex;align-items:center;height:23px}.el-table__body-wrapper .el-table-column--selection .el-checkbox,.el-table__header-wrapper .el-table-column--selection .el-checkbox{height:unset}.el-table.is-scrolling-left .el-table-fixed-column--right.is-first-column:before{box-shadow:var(--el-table-fixed-right-column)}.el-table.is-scrolling-left.el-table--border .el-table-fixed-column--left.is-last-column.el-table__cell{border-right:var(--el-table-border)}.el-table.is-scrolling-left th.el-table-fixed-column--left{background-color:var(--el-table-header-bg-color)}.el-table.is-scrolling-right .el-table-fixed-column--left.is-last-column:before{box-shadow:var(--el-table-fixed-left-column)}.el-table.is-scrolling-right .el-table-fixed-column--left.is-last-column.el-table__cell{border-right:none}.el-table.is-scrolling-right th.el-table-fixed-column--right{background-color:var(--el-table-header-bg-color)}.el-table.is-scrolling-middle .el-table-fixed-column--left.is-last-column.el-table__cell{border-right:none}.el-table.is-scrolling-middle .el-table-fixed-column--right.is-first-column:before{box-shadow:var(--el-table-fixed-right-column)}.el-table.is-scrolling-middle .el-table-fixed-column--left.is-last-column:before{box-shadow:var(--el-table-fixed-left-column)}.el-table.is-scrolling-none .el-table-fixed-column--left.is-first-column:before,.el-table.is-scrolling-none .el-table-fixed-column--left.is-last-column:before,.el-table.is-scrolling-none .el-table-fixed-column--right.is-first-column:before,.el-table.is-scrolling-none .el-table-fixed-column--right.is-last-column:before{box-shadow:none}.el-table.is-scrolling-none th.el-table-fixed-column--left,.el-table.is-scrolling-none th.el-table-fixed-column--right{background-color:var(--el-table-header-bg-color)}.el-table__body-wrapper{overflow:hidden;position:relative;flex:1}.el-table__body-wrapper .el-scrollbar__bar{z-index:calc(var(--el-table-index) + 2)}.el-table .caret-wrapper{display:inline-flex;flex-direction:column;align-items:center;height:14px;width:24px;vertical-align:middle;cursor:pointer;overflow:initial;position:relative}.el-table .sort-caret{width:0;height:0;border:solid 5px transparent;position:absolute;left:7px}.el-table .sort-caret.ascending{border-bottom-color:var(--el-text-color-placeholder);top:-5px}.el-table .sort-caret.descending{border-top-color:var(--el-text-color-placeholder);bottom:-3px}.el-table .ascending .sort-caret.ascending{border-bottom-color:var(--el-color-primary)}.el-table .descending .sort-caret.descending{border-top-color:var(--el-color-primary)}.el-table .hidden-columns{visibility:hidden;position:absolute;z-index:-1}.el-table--striped .el-table__body tr.el-table__row--striped td.el-table__cell{background:var(--el-fill-color-lighter)}.el-table--striped .el-table__body tr.el-table__row--striped.current-row td.el-table__cell{background-color:var(--el-table-current-row-bg-color)}.el-table__body tr.hover-row.current-row>td.el-table__cell,.el-table__body tr.hover-row.el-table__row--striped.current-row>td.el-table__cell,.el-table__body tr.hover-row.el-table__row--striped>td.el-table__cell,.el-table__body tr.hover-row>td.el-table__cell{background-color:var(--el-table-row-hover-bg-color)}.el-table__body tr.current-row>td.el-table__cell{background-color:var(--el-table-current-row-bg-color)}.el-table.el-table--scrollable-y .el-table__body-header{position:-webkit-sticky;position:sticky;top:0;z-index:calc(var(--el-table-index) + 2)}.el-table.el-table--scrollable-y .el-table__body-footer{position:-webkit-sticky;position:sticky;bottom:0;z-index:calc(var(--el-table-index) + 2)}.el-table__column-resize-proxy{position:absolute;left:200px;top:0;bottom:0;width:0;border-left:var(--el-table-border);z-index:calc(var(--el-table-index) + 9)}.el-table__column-filter-trigger{display:inline-block;cursor:pointer}.el-table__column-filter-trigger i{color:var(--el-color-info);font-size:14px;vertical-align:middle}.el-table__border-left-patch{top:0;left:0;width:1px;height:100%;z-index:calc(var(--el-table-index) + 2);position:absolute;background-color:var(--el-table-border-color)}.el-table__border-bottom-patch{left:0;height:1px;z-index:calc(var(--el-table-index) + 2);position:absolute;background-color:var(--el-table-border-color)}.el-table__border-right-patch{top:0;height:100%;width:1px;z-index:calc(var(--el-table-index) + 2);position:absolute;background-color:var(--el-table-border-color)}.el-table--enable-row-transition .el-table__body td.el-table__cell{transition:background-color .25s ease}.el-table--enable-row-hover .el-table__body tr:hover>td.el-table__cell{background-color:var(--el-table-row-hover-bg-color)}.el-table [class*=el-table__row--level] .el-table__expand-icon{display:inline-block;width:12px;line-height:12px;height:12px;text-align:center;margin-right:8px}.el-table .el-table.el-table--border .el-table__cell{border-right:var(--el-table-border)}.el-table:not(.el-table--border) .el-table__cell{border-right:none}.el-table:not(.el-table--border)>.el-table__inner-wrapper:after{content:none}.el-table-v2{--el-table-border-color:var(--el-border-color-lighter);--el-table-border:1px solid var(--el-table-border-color);--el-table-text-color:var(--el-text-color-regular);--el-table-header-text-color:var(--el-text-color-secondary);--el-table-row-hover-bg-color:var(--el-fill-color-light);--el-table-current-row-bg-color:var(--el-color-primary-light-9);--el-table-header-bg-color:var(--el-bg-color);--el-table-fixed-box-shadow:var(--el-box-shadow-light);--el-table-bg-color:var(--el-fill-color-blank);--el-table-tr-bg-color:var(--el-bg-color);--el-table-expanded-cell-bg-color:var(--el-fill-color-blank);--el-table-fixed-left-column:inset 10px 0 10px -10px rgba(0, 0, 0, .15);--el-table-fixed-right-column:inset -10px 0 10px -10px rgba(0, 0, 0, .15);--el-table-index:var(--el-index-normal)}.el-table-v2{font-size:14px}.el-table-v2 *{box-sizing:border-box}.el-table-v2__root{position:relative}.el-table-v2__root:hover .el-table-v2__main .el-virtual-scrollbar{opacity:1}.el-table-v2__main{display:flex;flex-direction:column-reverse;position:absolute;overflow:hidden;top:0;background-color:var(--el-bg-color);left:0}.el-table-v2__main .el-vl__horizontal,.el-table-v2__main .el-vl__vertical{z-index:2}.el-table-v2__left{display:flex;flex-direction:column-reverse;position:absolute;overflow:hidden;top:0;background-color:var(--el-bg-color);left:0;box-shadow:2px 0 4px #0000000f}.el-table-v2__left .el-virtual-scrollbar{opacity:0}.el-table-v2__left .el-vl__horizontal,.el-table-v2__left .el-vl__vertical{z-index:-1}.el-table-v2__right{display:flex;flex-direction:column-reverse;position:absolute;overflow:hidden;top:0;background-color:var(--el-bg-color);right:0;box-shadow:-2px 0 4px #0000000f}.el-table-v2__right .el-virtual-scrollbar{opacity:0}.el-table-v2__right .el-vl__horizontal,.el-table-v2__right .el-vl__vertical{z-index:-1}.el-table-v2__header-row,.el-table-v2__row{-webkit-padding-end:var(--el-table-scrollbar-size);padding-inline-end:var(--el-table-scrollbar-size)}.el-table-v2__header-wrapper{overflow:hidden}.el-table-v2__header{position:relative;overflow:hidden}.el-table-v2__footer{position:absolute;left:0;right:0;bottom:0;overflow:hidden}.el-table-v2__empty{position:absolute;left:0}.el-table-v2__overlay{position:absolute;left:0;right:0;top:0;bottom:0;z-index:9999}.el-table-v2__header-row{display:flex;border-bottom:var(--el-table-border)}.el-table-v2__header-cell{display:flex;align-items:center;padding:0 8px;height:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:hidden;background-color:var(--el-table-header-bg-color);color:var(--el-table-header-text-color);font-weight:700}.el-table-v2__header-cell.is-align-center{justify-content:center;text-align:center}.el-table-v2__header-cell.is-align-right{justify-content:flex-end;text-align:right}.el-table-v2__header-cell.is-sortable{cursor:pointer}.el-table-v2__header-cell:hover .el-icon{display:block}.el-table-v2__sort-icon{transition:opacity,display var(--el-transition-duration);opacity:.6;display:none}.el-table-v2__sort-icon.is-sorting{display:block;opacity:1}.el-table-v2__row{border-bottom:var(--el-table-border);display:flex;align-items:center;transition:background-color var(--el-transition-duration)}.el-table-v2__row.is-hovered,.el-table-v2__row:hover{background-color:var(--el-table-row-hover-bg-color)}.el-table-v2__row-cell{height:100%;overflow:hidden;display:flex;align-items:center;padding:0 8px}.el-table-v2__row-cell.is-align-center{justify-content:center;text-align:center}.el-table-v2__row-cell.is-align-right{justify-content:flex-end;text-align:right}.el-table-v2__expand-icon{margin:0 4px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.el-table-v2__expand-icon svg{transition:transform var(--el-transition-duration)}.el-table-v2__expand-icon.is-expanded svg{transform:rotate(90deg)}.el-table-v2:not(.is-dynamic) .el-table-v2__cell-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.el-table-v2.is-dynamic .el-table-v2__row{overflow:hidden;align-items:stretch}.el-table-v2.is-dynamic .el-table-v2__row .el-table-v2__row-cell{word-break:break-all}.el-tabs{--el-tabs-header-height:40px}.el-tabs__header{padding:0;position:relative;margin:0 0 15px}.el-tabs__active-bar{position:absolute;bottom:0;left:0;height:2px;background-color:var(--el-color-primary);z-index:1;transition:width var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier),transform var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier);list-style:none}.el-tabs__new-tab{display:flex;align-items:center;justify-content:center;float:right;border:1px solid var(--el-border-color);height:20px;width:20px;line-height:20px;margin:10px 0 10px 10px;border-radius:3px;text-align:center;font-size:12px;color:var(--el-text-color-primary);cursor:pointer;transition:all .15s}.el-tabs__new-tab .is-icon-plus{height:inherit;width:inherit;transform:scale(.8)}.el-tabs__new-tab .is-icon-plus svg{vertical-align:middle}.el-tabs__new-tab:hover{color:var(--el-color-primary)}.el-tabs__nav-wrap{overflow:hidden;margin-bottom:-1px;position:relative}.el-tabs__nav-wrap:after{content:"";position:absolute;left:0;bottom:0;width:100%;height:2px;background-color:var(--el-border-color-light);z-index:var(--el-index-normal)}.el-tabs__nav-wrap.is-scrollable{padding:0 20px;box-sizing:border-box}.el-tabs__nav-scroll{overflow:hidden}.el-tabs__nav-next,.el-tabs__nav-prev{position:absolute;cursor:pointer;line-height:44px;font-size:12px;color:var(--el-text-color-secondary);width:20px;text-align:center}.el-tabs__nav-next{right:0}.el-tabs__nav-prev{left:0}.el-tabs__nav{display:flex;white-space:nowrap;position:relative;transition:transform var(--el-transition-duration);float:left;z-index:calc(var(--el-index-normal) + 1)}.el-tabs__nav.is-stretch{min-width:100%;display:flex}.el-tabs__nav.is-stretch>*{flex:1;text-align:center}.el-tabs__item{padding:0 20px;height:var(--el-tabs-header-height);box-sizing:border-box;display:flex;align-items:center;justify-content:center;list-style:none;font-size:var(--el-font-size-base);font-weight:500;color:var(--el-text-color-primary);position:relative}.el-tabs__item:focus,.el-tabs__item:focus:active{outline:0}.el-tabs__item:focus-visible{box-shadow:0 0 2px 2px var(--el-color-primary) inset;border-radius:3px}.el-tabs__item .is-icon-close{border-radius:50%;text-align:center;transition:all var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier);margin-left:5px}.el-tabs__item .is-icon-close:before{transform:scale(.9);display:inline-block}.el-tabs__item .is-icon-close:hover{background-color:var(--el-text-color-placeholder);color:#fff}.el-tabs__item.is-active{color:var(--el-color-primary)}.el-tabs__item:hover{color:var(--el-color-primary);cursor:pointer}.el-tabs__item.is-disabled{color:var(--el-disabled-text-color);cursor:not-allowed}.el-tabs__content{overflow:hidden;position:relative}.el-tabs--card>.el-tabs__header{border-bottom:1px solid var(--el-border-color-light);height:var(--el-tabs-header-height)}.el-tabs--card>.el-tabs__header .el-tabs__nav-wrap:after{content:none}.el-tabs--card>.el-tabs__header .el-tabs__nav{border:1px solid var(--el-border-color-light);border-bottom:none;border-radius:4px 4px 0 0;box-sizing:border-box}.el-tabs--card>.el-tabs__header .el-tabs__active-bar{display:none}.el-tabs--card>.el-tabs__header .el-tabs__item .is-icon-close{position:relative;font-size:12px;width:0;height:14px;overflow:hidden;right:-2px;transform-origin:100% 50%}.el-tabs--card>.el-tabs__header .el-tabs__item{border-bottom:1px solid transparent;border-left:1px solid var(--el-border-color-light);transition:color var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier),padding var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier)}.el-tabs--card>.el-tabs__header .el-tabs__item:first-child{border-left:none}.el-tabs--card>.el-tabs__header .el-tabs__item.is-closable:hover{padding-left:13px;padding-right:13px}.el-tabs--card>.el-tabs__header .el-tabs__item.is-closable:hover .is-icon-close{width:14px}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active{border-bottom-color:var(--el-bg-color)}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active.is-closable{padding-left:20px;padding-right:20px}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active.is-closable .is-icon-close{width:14px}.el-tabs--border-card{background:var(--el-bg-color-overlay);border:1px solid var(--el-border-color)}.el-tabs--border-card>.el-tabs__content{padding:15px}.el-tabs--border-card>.el-tabs__header{background-color:var(--el-fill-color-light);border-bottom:1px solid var(--el-border-color-light);margin:0}.el-tabs--border-card>.el-tabs__header .el-tabs__nav-wrap:after{content:none}.el-tabs--border-card>.el-tabs__header .el-tabs__item{transition:all var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier);border:1px solid transparent;margin-top:-1px;color:var(--el-text-color-secondary)}.el-tabs--border-card>.el-tabs__header .el-tabs__item:first-child{margin-left:-1px}.el-tabs--border-card>.el-tabs__header .el-tabs__item+.el-tabs__item{margin-left:-1px}.el-tabs--border-card>.el-tabs__header .el-tabs__item.is-active{color:var(--el-color-primary);background-color:var(--el-bg-color-overlay);border-right-color:var(--el-border-color);border-left-color:var(--el-border-color)}.el-tabs--border-card>.el-tabs__header .el-tabs__item:not(.is-disabled):hover{color:var(--el-color-primary)}.el-tabs--border-card>.el-tabs__header .el-tabs__item.is-disabled{color:var(--el-disabled-text-color)}.el-tabs--border-card>.el-tabs__header .is-scrollable .el-tabs__item:first-child{margin-left:0}.el-tabs--bottom .el-tabs__item.is-bottom:nth-child(2),.el-tabs--bottom .el-tabs__item.is-top:nth-child(2),.el-tabs--top .el-tabs__item.is-bottom:nth-child(2),.el-tabs--top .el-tabs__item.is-top:nth-child(2){padding-left:0}.el-tabs--bottom .el-tabs__item.is-bottom:last-child,.el-tabs--bottom .el-tabs__item.is-top:last-child,.el-tabs--top .el-tabs__item.is-bottom:last-child,.el-tabs--top .el-tabs__item.is-top:last-child{padding-right:0}.el-tabs--bottom .el-tabs--left>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--bottom .el-tabs--right>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--bottom.el-tabs--border-card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--bottom.el-tabs--card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top .el-tabs--left>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top .el-tabs--right>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top.el-tabs--border-card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top.el-tabs--card>.el-tabs__header .el-tabs__item:nth-child(2){padding-left:20px}.el-tabs--bottom .el-tabs--left>.el-tabs__header .el-tabs__item:nth-child(2):not(.is-active).is-closable:hover,.el-tabs--bottom .el-tabs--right>.el-tabs__header .el-tabs__item:nth-child(2):not(.is-active).is-closable:hover,.el-tabs--bottom.el-tabs--border-card>.el-tabs__header .el-tabs__item:nth-child(2):not(.is-active).is-closable:hover,.el-tabs--bottom.el-tabs--card>.el-tabs__header .el-tabs__item:nth-child(2):not(.is-active).is-closable:hover,.el-tabs--top .el-tabs--left>.el-tabs__header .el-tabs__item:nth-child(2):not(.is-active).is-closable:hover,.el-tabs--top .el-tabs--right>.el-tabs__header .el-tabs__item:nth-child(2):not(.is-active).is-closable:hover,.el-tabs--top.el-tabs--border-card>.el-tabs__header .el-tabs__item:nth-child(2):not(.is-active).is-closable:hover,.el-tabs--top.el-tabs--card>.el-tabs__header .el-tabs__item:nth-child(2):not(.is-active).is-closable:hover{padding-left:13px}.el-tabs--bottom .el-tabs--left>.el-tabs__header .el-tabs__item:last-child,.el-tabs--bottom .el-tabs--right>.el-tabs__header .el-tabs__item:last-child,.el-tabs--bottom.el-tabs--border-card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--bottom.el-tabs--card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top .el-tabs--left>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top .el-tabs--right>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top.el-tabs--border-card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top.el-tabs--card>.el-tabs__header .el-tabs__item:last-child{padding-right:20px}.el-tabs--bottom .el-tabs--left>.el-tabs__header .el-tabs__item:last-child:not(.is-active).is-closable:hover,.el-tabs--bottom .el-tabs--right>.el-tabs__header .el-tabs__item:last-child:not(.is-active).is-closable:hover,.el-tabs--bottom.el-tabs--border-card>.el-tabs__header .el-tabs__item:last-child:not(.is-active).is-closable:hover,.el-tabs--bottom.el-tabs--card>.el-tabs__header .el-tabs__item:last-child:not(.is-active).is-closable:hover,.el-tabs--top .el-tabs--left>.el-tabs__header .el-tabs__item:last-child:not(.is-active).is-closable:hover,.el-tabs--top .el-tabs--right>.el-tabs__header .el-tabs__item:last-child:not(.is-active).is-closable:hover,.el-tabs--top.el-tabs--border-card>.el-tabs__header .el-tabs__item:last-child:not(.is-active).is-closable:hover,.el-tabs--top.el-tabs--card>.el-tabs__header .el-tabs__item:last-child:not(.is-active).is-closable:hover{padding-right:13px}.el-tabs--bottom .el-tabs__header.is-bottom{margin-bottom:0;margin-top:10px}.el-tabs--bottom.el-tabs--border-card .el-tabs__header.is-bottom{border-bottom:0;border-top:1px solid var(--el-border-color)}.el-tabs--bottom.el-tabs--border-card .el-tabs__nav-wrap.is-bottom{margin-top:-1px;margin-bottom:0}.el-tabs--bottom.el-tabs--border-card .el-tabs__item.is-bottom:not(.is-active){border:1px solid transparent}.el-tabs--bottom.el-tabs--border-card .el-tabs__item.is-bottom{margin:0 -1px -1px}.el-tabs--left,.el-tabs--right{overflow:hidden}.el-tabs--left .el-tabs__header.is-left,.el-tabs--left .el-tabs__header.is-right,.el-tabs--left .el-tabs__nav-scroll,.el-tabs--left .el-tabs__nav-wrap.is-left,.el-tabs--left .el-tabs__nav-wrap.is-right,.el-tabs--right .el-tabs__header.is-left,.el-tabs--right .el-tabs__header.is-right,.el-tabs--right .el-tabs__nav-scroll,.el-tabs--right .el-tabs__nav-wrap.is-left,.el-tabs--right .el-tabs__nav-wrap.is-right{height:100%}.el-tabs--left .el-tabs__active-bar.is-left,.el-tabs--left .el-tabs__active-bar.is-right,.el-tabs--right .el-tabs__active-bar.is-left,.el-tabs--right .el-tabs__active-bar.is-right{top:0;bottom:auto;width:2px;height:auto}.el-tabs--left .el-tabs__nav-wrap.is-left,.el-tabs--left .el-tabs__nav-wrap.is-right,.el-tabs--right .el-tabs__nav-wrap.is-left,.el-tabs--right .el-tabs__nav-wrap.is-right{margin-bottom:0}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev{height:30px;line-height:30px;width:100%;text-align:center;cursor:pointer}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next i,.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev i,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next i,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev i,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next i,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev i,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next i,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev i{transform:rotate(90deg)}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev{left:auto;top:0}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next{right:auto;bottom:0}.el-tabs--left .el-tabs__nav-wrap.is-left.is-scrollable,.el-tabs--left .el-tabs__nav-wrap.is-right.is-scrollable,.el-tabs--right .el-tabs__nav-wrap.is-left.is-scrollable,.el-tabs--right .el-tabs__nav-wrap.is-right.is-scrollable{padding:30px 0}.el-tabs--left .el-tabs__nav-wrap.is-left:after,.el-tabs--left .el-tabs__nav-wrap.is-right:after,.el-tabs--right .el-tabs__nav-wrap.is-left:after,.el-tabs--right .el-tabs__nav-wrap.is-right:after{height:100%;width:2px;bottom:auto;top:0}.el-tabs--left .el-tabs__nav.is-left,.el-tabs--left .el-tabs__nav.is-right,.el-tabs--right .el-tabs__nav.is-left,.el-tabs--right .el-tabs__nav.is-right{flex-direction:column}.el-tabs--left .el-tabs__item.is-left,.el-tabs--right .el-tabs__item.is-left{justify-content:flex-end}.el-tabs--left .el-tabs__item.is-right,.el-tabs--right .el-tabs__item.is-right{justify-content:flex-start}.el-tabs--left .el-tabs__header.is-left{float:left;margin-bottom:0;margin-right:10px}.el-tabs--left .el-tabs__nav-wrap.is-left{margin-right:-1px}.el-tabs--left .el-tabs__nav-wrap.is-left:after{left:auto;right:0}.el-tabs--left .el-tabs__active-bar.is-left{right:0;left:auto}.el-tabs--left .el-tabs__item.is-left{text-align:right}.el-tabs--left.el-tabs--card .el-tabs__active-bar.is-left{display:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left{border-left:none;border-right:1px solid var(--el-border-color-light);border-bottom:none;border-top:1px solid var(--el-border-color-light);text-align:left}.el-tabs--left.el-tabs--card .el-tabs__item.is-left:first-child{border-right:1px solid var(--el-border-color-light);border-top:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active{border:1px solid var(--el-border-color-light);border-right-color:#fff;border-left:none;border-bottom:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active:first-child{border-top:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active:last-child{border-bottom:none}.el-tabs--left.el-tabs--card .el-tabs__nav{border-radius:4px 0 0 4px;border-bottom:1px solid var(--el-border-color-light);border-right:none}.el-tabs--left.el-tabs--card .el-tabs__new-tab{float:none}.el-tabs--left.el-tabs--border-card .el-tabs__header.is-left{border-right:1px solid var(--el-border-color)}.el-tabs--left.el-tabs--border-card .el-tabs__item.is-left{border:1px solid transparent;margin:-1px 0 -1px -1px}.el-tabs--left.el-tabs--border-card .el-tabs__item.is-left.is-active{border-color:transparent;border-top-color:#d1dbe5;border-bottom-color:#d1dbe5}.el-tabs--right .el-tabs__header.is-right{float:right;margin-bottom:0;margin-left:10px}.el-tabs--right .el-tabs__nav-wrap.is-right{margin-left:-1px}.el-tabs--right .el-tabs__nav-wrap.is-right:after{left:0;right:auto}.el-tabs--right .el-tabs__active-bar.is-right{left:0}.el-tabs--right.el-tabs--card .el-tabs__active-bar.is-right{display:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right{border-bottom:none;border-top:1px solid var(--el-border-color-light)}.el-tabs--right.el-tabs--card .el-tabs__item.is-right:first-child{border-left:1px solid var(--el-border-color-light);border-top:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active{border:1px solid var(--el-border-color-light);border-left-color:#fff;border-right:none;border-bottom:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active:first-child{border-top:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active:last-child{border-bottom:none}.el-tabs--right.el-tabs--card .el-tabs__nav{border-radius:0 4px 4px 0;border-bottom:1px solid var(--el-border-color-light);border-left:none}.el-tabs--right.el-tabs--border-card .el-tabs__header.is-right{border-left:1px solid var(--el-border-color)}.el-tabs--right.el-tabs--border-card .el-tabs__item.is-right{border:1px solid transparent;margin:-1px -1px -1px 0}.el-tabs--right.el-tabs--border-card .el-tabs__item.is-right.is-active{border-color:transparent;border-top-color:#d1dbe5;border-bottom-color:#d1dbe5}.slideInLeft-transition,.slideInRight-transition{display:inline-block}.slideInRight-enter{-webkit-animation:slideInRight-enter var(--el-transition-duration);animation:slideInRight-enter var(--el-transition-duration)}.slideInRight-leave{position:absolute;left:0;right:0;-webkit-animation:slideInRight-leave var(--el-transition-duration);animation:slideInRight-leave var(--el-transition-duration)}.slideInLeft-enter{-webkit-animation:slideInLeft-enter var(--el-transition-duration);animation:slideInLeft-enter var(--el-transition-duration)}.slideInLeft-leave{position:absolute;left:0;right:0;-webkit-animation:slideInLeft-leave var(--el-transition-duration);animation:slideInLeft-leave var(--el-transition-duration)}@-webkit-keyframes slideInRight-enter{0%{opacity:0;transform-origin:0 0;transform:translate(100%)}to{opacity:1;transform-origin:0 0;transform:translate(0)}}@keyframes slideInRight-enter{0%{opacity:0;transform-origin:0 0;transform:translate(100%)}to{opacity:1;transform-origin:0 0;transform:translate(0)}}@-webkit-keyframes slideInRight-leave{0%{transform-origin:0 0;transform:translate(0);opacity:1}to{transform-origin:0 0;transform:translate(100%);opacity:0}}@keyframes slideInRight-leave{0%{transform-origin:0 0;transform:translate(0);opacity:1}to{transform-origin:0 0;transform:translate(100%);opacity:0}}@-webkit-keyframes slideInLeft-enter{0%{opacity:0;transform-origin:0 0;transform:translate(-100%)}to{opacity:1;transform-origin:0 0;transform:translate(0)}}@keyframes slideInLeft-enter{0%{opacity:0;transform-origin:0 0;transform:translate(-100%)}to{opacity:1;transform-origin:0 0;transform:translate(0)}}@-webkit-keyframes slideInLeft-leave{0%{transform-origin:0 0;transform:translate(0);opacity:1}to{transform-origin:0 0;transform:translate(-100%);opacity:0}}@keyframes slideInLeft-leave{0%{transform-origin:0 0;transform:translate(0);opacity:1}to{transform-origin:0 0;transform:translate(-100%);opacity:0}}.el-tag{--el-tag-font-size:12px;--el-tag-border-radius:4px;--el-tag-border-radius-rounded:9999px}.el-tag{--el-tag-bg-color:var(--el-color-primary-light-9);--el-tag-border-color:var(--el-color-primary-light-8);--el-tag-hover-color:var(--el-color-primary);--el-tag-text-color:var(--el-color-primary);background-color:var(--el-tag-bg-color);border-color:var(--el-tag-border-color);color:var(--el-tag-text-color);display:inline-flex;justify-content:center;align-items:center;vertical-align:middle;height:24px;padding:0 9px;font-size:var(--el-tag-font-size);line-height:1;border-width:1px;border-style:solid;border-radius:var(--el-tag-border-radius);box-sizing:border-box;white-space:nowrap;--el-icon-size:14px}.el-tag.el-tag--primary{--el-tag-bg-color:var(--el-color-primary-light-9);--el-tag-border-color:var(--el-color-primary-light-8);--el-tag-hover-color:var(--el-color-primary)}.el-tag.el-tag--success{--el-tag-bg-color:var(--el-color-success-light-9);--el-tag-border-color:var(--el-color-success-light-8);--el-tag-hover-color:var(--el-color-success)}.el-tag.el-tag--warning{--el-tag-bg-color:var(--el-color-warning-light-9);--el-tag-border-color:var(--el-color-warning-light-8);--el-tag-hover-color:var(--el-color-warning)}.el-tag.el-tag--danger{--el-tag-bg-color:var(--el-color-danger-light-9);--el-tag-border-color:var(--el-color-danger-light-8);--el-tag-hover-color:var(--el-color-danger)}.el-tag.el-tag--error{--el-tag-bg-color:var(--el-color-error-light-9);--el-tag-border-color:var(--el-color-error-light-8);--el-tag-hover-color:var(--el-color-error)}.el-tag.el-tag--info{--el-tag-bg-color:var(--el-color-info-light-9);--el-tag-border-color:var(--el-color-info-light-8);--el-tag-hover-color:var(--el-color-info)}.el-tag.el-tag--primary{--el-tag-text-color:var(--el-color-primary)}.el-tag.el-tag--success{--el-tag-text-color:var(--el-color-success)}.el-tag.el-tag--warning{--el-tag-text-color:var(--el-color-warning)}.el-tag.el-tag--danger{--el-tag-text-color:var(--el-color-danger)}.el-tag.el-tag--error{--el-tag-text-color:var(--el-color-error)}.el-tag.el-tag--info{--el-tag-text-color:var(--el-color-info)}.el-tag.is-hit{border-color:var(--el-color-primary)}.el-tag.is-round{border-radius:var(--el-tag-border-radius-rounded)}.el-tag .el-tag__close{color:var(--el-tag-text-color)}.el-tag .el-tag__close:hover{color:var(--el-color-white);background-color:var(--el-tag-hover-color)}.el-tag .el-icon{border-radius:50%;cursor:pointer;font-size:calc(var(--el-icon-size) - 2px);height:var(--el-icon-size);width:var(--el-icon-size)}.el-tag .el-tag__close{margin-left:6px}.el-tag--dark{--el-tag-bg-color:var(--el-color-primary);--el-tag-border-color:var(--el-color-primary);--el-tag-hover-color:var(--el-color-primary-light-3);--el-tag-text-color:var(--el-color-white)}.el-tag--dark.el-tag--primary{--el-tag-bg-color:var(--el-color-primary);--el-tag-border-color:var(--el-color-primary);--el-tag-hover-color:var(--el-color-primary-light-3)}.el-tag--dark.el-tag--success{--el-tag-bg-color:var(--el-color-success);--el-tag-border-color:var(--el-color-success);--el-tag-hover-color:var(--el-color-success-light-3)}.el-tag--dark.el-tag--warning{--el-tag-bg-color:var(--el-color-warning);--el-tag-border-color:var(--el-color-warning);--el-tag-hover-color:var(--el-color-warning-light-3)}.el-tag--dark.el-tag--danger{--el-tag-bg-color:var(--el-color-danger);--el-tag-border-color:var(--el-color-danger);--el-tag-hover-color:var(--el-color-danger-light-3)}.el-tag--dark.el-tag--error{--el-tag-bg-color:var(--el-color-error);--el-tag-border-color:var(--el-color-error);--el-tag-hover-color:var(--el-color-error-light-3)}.el-tag--dark.el-tag--info{--el-tag-bg-color:var(--el-color-info);--el-tag-border-color:var(--el-color-info);--el-tag-hover-color:var(--el-color-info-light-3)}.el-tag--dark.el-tag--primary,.el-tag--dark.el-tag--success,.el-tag--dark.el-tag--warning,.el-tag--dark.el-tag--danger,.el-tag--dark.el-tag--error,.el-tag--dark.el-tag--info{--el-tag-text-color:var(--el-color-white)}.el-tag--plain{--el-tag-border-color:var(--el-color-primary-light-5);--el-tag-hover-color:var(--el-color-primary);--el-tag-bg-color:var(--el-fill-color-blank)}.el-tag--plain.el-tag--primary{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-primary-light-5);--el-tag-hover-color:var(--el-color-primary)}.el-tag--plain.el-tag--success{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-success-light-5);--el-tag-hover-color:var(--el-color-success)}.el-tag--plain.el-tag--warning{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-warning-light-5);--el-tag-hover-color:var(--el-color-warning)}.el-tag--plain.el-tag--danger{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-danger-light-5);--el-tag-hover-color:var(--el-color-danger)}.el-tag--plain.el-tag--error{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-error-light-5);--el-tag-hover-color:var(--el-color-error)}.el-tag--plain.el-tag--info{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-info-light-5);--el-tag-hover-color:var(--el-color-info)}.el-tag.is-closable{padding-right:5px}.el-tag--large{padding:0 11px;height:32px;--el-icon-size:16px}.el-tag--large .el-tag__close{margin-left:8px}.el-tag--large.is-closable{padding-right:7px}.el-tag--small{padding:0 7px;height:20px;--el-icon-size:12px}.el-tag--small .el-tag__close{margin-left:4px}.el-tag--small.is-closable{padding-right:3px}.el-tag--small .el-icon-close{transform:scale(.8)}.el-tag.el-tag--primary.is-hit{border-color:var(--el-color-primary)}.el-tag.el-tag--success.is-hit{border-color:var(--el-color-success)}.el-tag.el-tag--warning.is-hit{border-color:var(--el-color-warning)}.el-tag.el-tag--danger.is-hit{border-color:var(--el-color-danger)}.el-tag.el-tag--error.is-hit{border-color:var(--el-color-error)}.el-tag.el-tag--info.is-hit{border-color:var(--el-color-info)}.el-text{--el-text-font-size:var(--el-font-size-base);--el-text-color:var(--el-text-color-regular)}.el-text{align-self:center;margin:0;padding:0;font-size:var(--el-text-font-size);color:var(--el-text-color);word-break:break-all}.el-text.is-truncated{display:inline-block;max-width:100%;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.el-text.is-line-clamp{display:-webkit-inline-box;-webkit-box-orient:vertical;overflow:hidden}.el-text--large{--el-text-font-size:var(--el-font-size-medium)}.el-text--default{--el-text-font-size:var(--el-font-size-base)}.el-text--small{--el-text-font-size:var(--el-font-size-extra-small)}.el-text.el-text--primary{--el-text-color:var(--el-color-primary)}.el-text.el-text--success{--el-text-color:var(--el-color-success)}.el-text.el-text--warning{--el-text-color:var(--el-color-warning)}.el-text.el-text--danger{--el-text-color:var(--el-color-danger)}.el-text.el-text--error{--el-text-color:var(--el-color-error)}.el-text.el-text--info{--el-text-color:var(--el-color-info)}.el-text>.el-icon{vertical-align:-2px}.time-select{margin:5px 0;min-width:0}.time-select .el-picker-panel__content{max-height:200px;margin:0}.time-select-item{padding:8px 10px;font-size:14px;line-height:20px}.time-select-item.disabled{color:var(--el-datepicker-border-color);cursor:not-allowed}.time-select-item:hover{background-color:var(--el-fill-color-light);font-weight:700;cursor:pointer}.time-select .time-select-item.selected:not(.disabled){color:var(--el-color-primary);font-weight:700}.el-timeline-item{position:relative;padding-bottom:20px}.el-timeline-item__wrapper{position:relative;padding-left:28px;top:-3px}.el-timeline-item__tail{position:absolute;left:4px;height:100%;border-left:2px solid var(--el-timeline-node-color)}.el-timeline-item .el-timeline-item__icon{color:var(--el-color-white);font-size:var(--el-font-size-small)}.el-timeline-item__node{position:absolute;background-color:var(--el-timeline-node-color);border-color:var(--el-timeline-node-color);border-radius:50%;box-sizing:border-box;display:flex;justify-content:center;align-items:center}.el-timeline-item__node--normal{left:-1px;width:var(--el-timeline-node-size-normal);height:var(--el-timeline-node-size-normal)}.el-timeline-item__node--large{left:-2px;width:var(--el-timeline-node-size-large);height:var(--el-timeline-node-size-large)}.el-timeline-item__node.is-hollow{background:var(--el-color-white);border-style:solid;border-width:2px}.el-timeline-item__node--primary{background-color:var(--el-color-primary);border-color:var(--el-color-primary)}.el-timeline-item__node--success{background-color:var(--el-color-success);border-color:var(--el-color-success)}.el-timeline-item__node--warning{background-color:var(--el-color-warning);border-color:var(--el-color-warning)}.el-timeline-item__node--danger{background-color:var(--el-color-danger);border-color:var(--el-color-danger)}.el-timeline-item__node--info{background-color:var(--el-color-info);border-color:var(--el-color-info)}.el-timeline-item__dot{position:absolute;display:flex;justify-content:center;align-items:center}.el-timeline-item__content{color:var(--el-text-color-primary)}.el-timeline-item__timestamp{color:var(--el-text-color-secondary);line-height:1;font-size:var(--el-font-size-small)}.el-timeline-item__timestamp.is-top{margin-bottom:8px;padding-top:4px}.el-timeline-item__timestamp.is-bottom{margin-top:8px}.el-timeline{--el-timeline-node-size-normal:12px;--el-timeline-node-size-large:14px;--el-timeline-node-color:var(--el-border-color-light)}.el-timeline{margin:0;font-size:var(--el-font-size-base);list-style:none}.el-timeline .el-timeline-item:last-child .el-timeline-item__tail{display:none}.el-timeline .el-timeline-item__center{display:flex;align-items:center}.el-timeline .el-timeline-item__center .el-timeline-item__wrapper{width:100%}.el-timeline .el-timeline-item__center .el-timeline-item__tail{top:0}.el-timeline .el-timeline-item__center:first-child .el-timeline-item__tail{height:calc(50% + 10px);top:calc(50% - 10px)}.el-timeline .el-timeline-item__center:last-child .el-timeline-item__tail{display:block;height:calc(50% - 10px)}.el-tooltip-v2__content{--el-tooltip-v2-padding:5px 10px;--el-tooltip-v2-border-radius:4px;--el-tooltip-v2-border-color:var(--el-border-color);border-radius:var(--el-tooltip-v2-border-radius);color:var(--el-color-black);background-color:var(--el-color-white);padding:var(--el-tooltip-v2-padding);border:1px solid var(--el-border-color)}.el-tooltip-v2__arrow{position:absolute;color:var(--el-color-white);width:var(--el-tooltip-v2-arrow-width);height:var(--el-tooltip-v2-arrow-height);pointer-events:none;left:var(--el-tooltip-v2-arrow-x);top:var(--el-tooltip-v2-arrow-y)}.el-tooltip-v2__arrow:before{content:"";width:0;height:0;border:var(--el-tooltip-v2-arrow-border-width) solid transparent;position:absolute}.el-tooltip-v2__arrow:after{content:"";width:0;height:0;border:var(--el-tooltip-v2-arrow-border-width) solid transparent;position:absolute}.el-tooltip-v2__content[data-side^=top] .el-tooltip-v2__arrow{bottom:0}.el-tooltip-v2__content[data-side^=top] .el-tooltip-v2__arrow:before{border-top-color:var(--el-color-white);border-top-width:var(--el-tooltip-v2-arrow-border-width);border-bottom:0;top:calc(100% - 1px)}.el-tooltip-v2__content[data-side^=top] .el-tooltip-v2__arrow:after{border-top-color:var(--el-border-color);border-top-width:var(--el-tooltip-v2-arrow-border-width);border-bottom:0;top:100%;z-index:-1}.el-tooltip-v2__content[data-side^=bottom] .el-tooltip-v2__arrow{top:0}.el-tooltip-v2__content[data-side^=bottom] .el-tooltip-v2__arrow:before{border-bottom-color:var(--el-color-white);border-bottom-width:var(--el-tooltip-v2-arrow-border-width);border-top:0;bottom:calc(100% - 1px)}.el-tooltip-v2__content[data-side^=bottom] .el-tooltip-v2__arrow:after{border-bottom-color:var(--el-border-color);border-bottom-width:var(--el-tooltip-v2-arrow-border-width);border-top:0;bottom:100%;z-index:-1}.el-tooltip-v2__content[data-side^=left] .el-tooltip-v2__arrow{right:0}.el-tooltip-v2__content[data-side^=left] .el-tooltip-v2__arrow:before{border-left-color:var(--el-color-white);border-left-width:var(--el-tooltip-v2-arrow-border-width);border-right:0;left:calc(100% - 1px)}.el-tooltip-v2__content[data-side^=left] .el-tooltip-v2__arrow:after{border-left-color:var(--el-border-color);border-left-width:var(--el-tooltip-v2-arrow-border-width);border-right:0;left:100%;z-index:-1}.el-tooltip-v2__content[data-side^=right] .el-tooltip-v2__arrow{left:0}.el-tooltip-v2__content[data-side^=right] .el-tooltip-v2__arrow:before{border-right-color:var(--el-color-white);border-right-width:var(--el-tooltip-v2-arrow-border-width);border-left:0;right:calc(100% - 1px)}.el-tooltip-v2__content[data-side^=right] .el-tooltip-v2__arrow:after{border-right-color:var(--el-border-color);border-right-width:var(--el-tooltip-v2-arrow-border-width);border-left:0;right:100%;z-index:-1}.el-tooltip-v2__content.is-dark{--el-tooltip-v2-border-color:transparent;background-color:var(--el-color-black);color:var(--el-color-white);border-color:transparent}.el-tooltip-v2__content.is-dark .el-tooltip-v2__arrow{background-color:var(--el-color-black);border-color:transparent}.el-transfer{--el-transfer-border-color:var(--el-border-color-lighter);--el-transfer-border-radius:var(--el-border-radius-base);--el-transfer-panel-width:200px;--el-transfer-panel-header-height:40px;--el-transfer-panel-header-bg-color:var(--el-fill-color-light);--el-transfer-panel-footer-height:40px;--el-transfer-panel-body-height:278px;--el-transfer-item-height:30px;--el-transfer-filter-height:32px}.el-transfer{font-size:var(--el-font-size-base)}.el-transfer__buttons{display:inline-block;vertical-align:middle;padding:0 30px}.el-transfer__button{vertical-align:top}.el-transfer__button:nth-child(2){margin:0 0 0 10px}.el-transfer__button i,.el-transfer__button span{font-size:14px}.el-transfer__button .el-icon+span{margin-left:0}.el-transfer-panel{overflow:hidden;background:var(--el-bg-color-overlay);display:inline-block;text-align:left;vertical-align:middle;width:var(--el-transfer-panel-width);max-height:100%;box-sizing:border-box;position:relative}.el-transfer-panel__body{height:var(--el-transfer-panel-body-height);border-left:1px solid var(--el-transfer-border-color);border-right:1px solid var(--el-transfer-border-color);border-bottom:1px solid var(--el-transfer-border-color);border-bottom-left-radius:var(--el-transfer-border-radius);border-bottom-right-radius:var(--el-transfer-border-radius);overflow:hidden}.el-transfer-panel__body.is-with-footer{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.el-transfer-panel__list{margin:0;padding:6px 0;list-style:none;height:var(--el-transfer-panel-body-height);overflow:auto;box-sizing:border-box}.el-transfer-panel__list.is-filterable{height:calc(100% - var(--el-transfer-filter-height) - 30px);padding-top:0}.el-transfer-panel__item{height:var(--el-transfer-item-height);line-height:var(--el-transfer-item-height);padding-left:15px;display:block!important}.el-transfer-panel__item+.el-transfer-panel__item{margin-left:0}.el-transfer-panel__item.el-checkbox{color:var(--el-text-color-regular)}.el-transfer-panel__item:hover{color:var(--el-color-primary)}.el-transfer-panel__item.el-checkbox .el-checkbox__label{width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;box-sizing:border-box;padding-left:22px;line-height:var(--el-transfer-item-height)}.el-transfer-panel__item .el-checkbox__input{position:absolute;top:8px}.el-transfer-panel__filter{text-align:center;padding:15px;box-sizing:border-box}.el-transfer-panel__filter .el-input__inner{height:var(--el-transfer-filter-height);width:100%;font-size:12px;display:inline-block;box-sizing:border-box;border-radius:calc(var(--el-transfer-filter-height)/ 2)}.el-transfer-panel__filter .el-icon-circle-close{cursor:pointer}.el-transfer-panel .el-transfer-panel__header{display:flex;align-items:center;height:var(--el-transfer-panel-header-height);background:var(--el-transfer-panel-header-bg-color);margin:0;padding-left:15px;border:1px solid var(--el-transfer-border-color);border-top-left-radius:var(--el-transfer-border-radius);border-top-right-radius:var(--el-transfer-border-radius);box-sizing:border-box;color:var(--el-color-black)}.el-transfer-panel .el-transfer-panel__header .el-checkbox{position:relative;display:flex;width:100%;align-items:center}.el-transfer-panel .el-transfer-panel__header .el-checkbox .el-checkbox__label{font-size:16px;color:var(--el-text-color-primary);font-weight:400}.el-transfer-panel .el-transfer-panel__header .el-checkbox .el-checkbox__label span{position:absolute;right:15px;top:50%;transform:translate3d(0,-50%,0);color:var(--el-text-color-secondary);font-size:12px;font-weight:400}.el-transfer-panel .el-transfer-panel__footer{height:var(--el-transfer-panel-footer-height);background:var(--el-bg-color-overlay);margin:0;padding:0;border:1px solid var(--el-transfer-border-color);border-bottom-left-radius:var(--el-transfer-border-radius);border-bottom-right-radius:var(--el-transfer-border-radius)}.el-transfer-panel .el-transfer-panel__footer:after{display:inline-block;content:"";height:100%;vertical-align:middle}.el-transfer-panel .el-transfer-panel__footer .el-checkbox{padding-left:20px;color:var(--el-text-color-regular)}.el-transfer-panel .el-transfer-panel__empty{margin:0;height:var(--el-transfer-item-height);line-height:var(--el-transfer-item-height);padding:6px 15px 0;color:var(--el-text-color-secondary);text-align:center}.el-transfer-panel .el-checkbox__label{padding-left:8px}.el-transfer-panel .el-checkbox__inner{height:14px;width:14px;border-radius:3px}.el-transfer-panel .el-checkbox__inner:after{height:6px;width:3px;left:4px}.el-tree{--el-tree-node-content-height:26px;--el-tree-node-hover-bg-color:var(--el-fill-color-light);--el-tree-text-color:var(--el-text-color-regular);--el-tree-expand-icon-color:var(--el-text-color-placeholder)}.el-tree{position:relative;cursor:default;background:var(--el-fill-color-blank);color:var(--el-tree-text-color);font-size:var(--el-font-size-base)}.el-tree__empty-block{position:relative;min-height:60px;text-align:center;width:100%;height:100%}.el-tree__empty-text{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);color:var(--el-text-color-secondary);font-size:var(--el-font-size-base)}.el-tree__drop-indicator{position:absolute;left:0;right:0;height:1px;background-color:var(--el-color-primary)}.el-tree-node{white-space:nowrap;outline:0}.el-tree-node:focus>.el-tree-node__content{background-color:var(--el-tree-node-hover-bg-color)}.el-tree-node.is-drop-inner>.el-tree-node__content .el-tree-node__label{background-color:var(--el-color-primary);color:#fff}.el-tree-node__content{--el-checkbox-height:var(--el-tree-node-content-height);display:flex;align-items:center;height:var(--el-tree-node-content-height);cursor:pointer}.el-tree-node__content>.el-tree-node__expand-icon{padding:6px;box-sizing:content-box}.el-tree-node__content>label.el-checkbox{margin-right:8px}.el-tree-node__content:hover{background-color:var(--el-tree-node-hover-bg-color)}.el-tree.is-dragging .el-tree-node__content{cursor:move}.el-tree.is-dragging .el-tree-node__content *{pointer-events:none}.el-tree.is-dragging.is-drop-not-allow .el-tree-node__content{cursor:not-allowed}.el-tree-node__expand-icon{cursor:pointer;color:var(--el-tree-expand-icon-color);font-size:12px;transform:rotate(0);transition:transform var(--el-transition-duration) ease-in-out}.el-tree-node__expand-icon.expanded{transform:rotate(90deg)}.el-tree-node__expand-icon.is-leaf{color:transparent;cursor:default;visibility:hidden}.el-tree-node__expand-icon.is-hidden{visibility:hidden}.el-tree-node__loading-icon{margin-right:8px;font-size:var(--el-font-size-base);color:var(--el-tree-expand-icon-color)}.el-tree-node>.el-tree-node__children{overflow:hidden;background-color:transparent}.el-tree-node.is-expanded>.el-tree-node__children{display:block}.el-tree--highlight-current .el-tree-node.is-current>.el-tree-node__content{background-color:var(--el-color-primary-light-9)}.el-tree-select{--el-tree-node-content-height:26px;--el-tree-node-hover-bg-color:var(--el-fill-color-light);--el-tree-text-color:var(--el-text-color-regular);--el-tree-expand-icon-color:var(--el-text-color-placeholder)}.el-tree-select__popper .el-tree-node__expand-icon{margin-left:8px}.el-tree-select__popper .el-tree-node.is-checked>.el-tree-node__content .el-select-dropdown__item.selected:after{content:none}.el-tree-select__popper .el-select-dropdown__item{flex:1;background:0 0!important;padding-left:0;height:20px;line-height:20px}.el-upload{--el-upload-dragger-padding-horizontal:40px;--el-upload-dragger-padding-vertical:10px}.el-upload{display:inline-flex;justify-content:center;align-items:center;cursor:pointer;outline:0}.el-upload__tip{font-size:12px;color:var(--el-text-color-regular);margin-top:7px}.el-upload iframe{position:absolute;z-index:-1;top:0;left:0;opacity:0}.el-upload--picture-card{--el-upload-picture-card-size:148px;background-color:var(--el-fill-color-lighter);border:1px dashed var(--el-border-color-darker);border-radius:6px;box-sizing:border-box;width:var(--el-upload-picture-card-size);height:var(--el-upload-picture-card-size);cursor:pointer;vertical-align:top;display:inline-flex;justify-content:center;align-items:center}.el-upload--picture-card>i{font-size:28px;color:var(--el-text-color-secondary)}.el-upload--picture-card:hover{border-color:var(--el-color-primary);color:var(--el-color-primary)}.el-upload.is-drag{display:block}.el-upload:focus{border-color:var(--el-color-primary);color:var(--el-color-primary)}.el-upload:focus .el-upload-dragger{border-color:var(--el-color-primary)}.el-upload-dragger{padding:var(--el-upload-dragger-padding-horizontal) var(--el-upload-dragger-padding-vertical);background-color:var(--el-fill-color-blank);border:1px dashed var(--el-border-color);border-radius:6px;box-sizing:border-box;text-align:center;cursor:pointer;position:relative;overflow:hidden}.el-upload-dragger .el-icon--upload{font-size:67px;color:var(--el-text-color-placeholder);margin-bottom:16px;line-height:50px}.el-upload-dragger+.el-upload__tip{text-align:center}.el-upload-dragger~.el-upload__files{border-top:var(--el-border);margin-top:7px;padding-top:5px}.el-upload-dragger .el-upload__text{color:var(--el-text-color-regular);font-size:14px;text-align:center}.el-upload-dragger .el-upload__text em{color:var(--el-color-primary);font-style:normal}.el-upload-dragger:hover{border-color:var(--el-color-primary)}.el-upload-dragger.is-dragover{padding:calc(var(--el-upload-dragger-padding-horizontal) - 1px) calc(var(--el-upload-dragger-padding-vertical) - 1px);background-color:var(--el-color-primary-light-9);border:2px dashed var(--el-color-primary)}.el-upload-list{margin:10px 0 0;padding:0;list-style:none;position:relative}.el-upload-list__item{transition:all .5s cubic-bezier(.55,0,.1,1);font-size:14px;color:var(--el-text-color-regular);margin-bottom:5px;position:relative;box-sizing:border-box;border-radius:4px;width:100%}.el-upload-list__item .el-progress{position:absolute;top:20px;width:100%}.el-upload-list__item .el-progress__text{position:absolute;right:0;top:-13px}.el-upload-list__item .el-progress-bar{margin-right:0;padding-right:0}.el-upload-list__item .el-icon--upload-success{color:var(--el-color-success)}.el-upload-list__item .el-icon--close{display:none;position:absolute;right:5px;top:50%;cursor:pointer;opacity:.75;color:var(--el-text-color-regular);transition:opacity var(--el-transition-duration);transform:translateY(-50%)}.el-upload-list__item .el-icon--close:hover{opacity:1;color:var(--el-color-primary)}.el-upload-list__item .el-icon--close-tip{display:none;position:absolute;top:1px;right:5px;font-size:12px;cursor:pointer;opacity:1;color:var(--el-color-primary);font-style:normal}.el-upload-list__item:hover{background-color:var(--el-fill-color-light)}.el-upload-list__item:hover .el-icon--close{display:inline-flex}.el-upload-list__item:hover .el-progress__text{display:none}.el-upload-list__item .el-upload-list__item-info{display:inline-flex;justify-content:center;flex-direction:column;width:calc(100% - 30px);margin-left:4px}.el-upload-list__item.is-success .el-upload-list__item-status-label{display:inline-flex}.el-upload-list__item.is-success .el-upload-list__item-name:focus,.el-upload-list__item.is-success .el-upload-list__item-name:hover{color:var(--el-color-primary);cursor:pointer}.el-upload-list__item.is-success:focus:not(:hover) .el-icon--close-tip{display:inline-block}.el-upload-list__item.is-success:active,.el-upload-list__item.is-success:not(.focusing):focus{outline-width:0}.el-upload-list__item.is-success:active .el-icon--close-tip,.el-upload-list__item.is-success:not(.focusing):focus .el-icon--close-tip{display:none}.el-upload-list__item.is-success:focus .el-upload-list__item-status-label,.el-upload-list__item.is-success:hover .el-upload-list__item-status-label{display:none;opacity:0}.el-upload-list__item-name{color:var(--el-text-color-regular);display:inline-flex;text-align:center;align-items:center;padding:0 4px;transition:color var(--el-transition-duration);font-size:var(--el-font-size-base)}.el-upload-list__item-name .el-icon{margin-right:6px;color:var(--el-text-color-secondary)}.el-upload-list__item-file-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.el-upload-list__item-status-label{position:absolute;right:5px;top:0;line-height:inherit;display:none;height:100%;justify-content:center;align-items:center;transition:opacity var(--el-transition-duration)}.el-upload-list__item-delete{position:absolute;right:10px;top:0;font-size:12px;color:var(--el-text-color-regular);display:none}.el-upload-list__item-delete:hover{color:var(--el-color-primary)}.el-upload-list--picture-card{--el-upload-list-picture-card-size:148px;display:inline-flex;flex-wrap:wrap;margin:0}.el-upload-list--picture-card .el-upload-list__item{overflow:hidden;background-color:var(--el-fill-color-blank);border:1px solid var(--el-border-color);border-radius:6px;box-sizing:border-box;width:var(--el-upload-list-picture-card-size);height:var(--el-upload-list-picture-card-size);margin:0 8px 8px 0;padding:0;display:inline-flex}.el-upload-list--picture-card .el-upload-list__item .el-icon--check,.el-upload-list--picture-card .el-upload-list__item .el-icon--circle-check{color:#fff}.el-upload-list--picture-card .el-upload-list__item .el-icon--close{display:none}.el-upload-list--picture-card .el-upload-list__item:hover .el-upload-list__item-status-label{opacity:0;display:block}.el-upload-list--picture-card .el-upload-list__item:hover .el-progress__text{display:block}.el-upload-list--picture-card .el-upload-list__item .el-upload-list__item-name{display:none}.el-upload-list--picture-card .el-upload-list__item-thumbnail{width:100%;height:100%;-o-object-fit:contain;object-fit:contain}.el-upload-list--picture-card .el-upload-list__item-status-label{right:-15px;top:-6px;width:40px;height:24px;background:var(--el-color-success);text-align:center;transform:rotate(45deg)}.el-upload-list--picture-card .el-upload-list__item-status-label i{font-size:12px;margin-top:11px;transform:rotate(-45deg)}.el-upload-list--picture-card .el-upload-list__item-actions{position:absolute;width:100%;height:100%;left:0;top:0;cursor:default;display:inline-flex;justify-content:center;align-items:center;color:#fff;opacity:0;font-size:20px;background-color:var(--el-overlay-color-lighter);transition:opacity var(--el-transition-duration)}.el-upload-list--picture-card .el-upload-list__item-actions span{display:none;cursor:pointer}.el-upload-list--picture-card .el-upload-list__item-actions span+span{margin-left:1rem}.el-upload-list--picture-card .el-upload-list__item-actions .el-upload-list__item-delete{position:static;font-size:inherit;color:inherit}.el-upload-list--picture-card .el-upload-list__item-actions:hover{opacity:1}.el-upload-list--picture-card .el-upload-list__item-actions:hover span{display:inline-flex}.el-upload-list--picture-card .el-progress{top:50%;left:50%;transform:translate(-50%,-50%);bottom:auto;width:126px}.el-upload-list--picture-card .el-progress .el-progress__text{top:50%}.el-upload-list--picture .el-upload-list__item{overflow:hidden;z-index:0;background-color:var(--el-fill-color-blank);border:1px solid var(--el-border-color);border-radius:6px;box-sizing:border-box;margin-top:10px;padding:10px;display:flex;align-items:center}.el-upload-list--picture .el-upload-list__item .el-icon--check,.el-upload-list--picture .el-upload-list__item .el-icon--circle-check{color:#fff}.el-upload-list--picture .el-upload-list__item:hover .el-upload-list__item-status-label{opacity:0;display:inline-flex}.el-upload-list--picture .el-upload-list__item:hover .el-progress__text{display:block}.el-upload-list--picture .el-upload-list__item.is-success .el-upload-list__item-name i{display:none}.el-upload-list--picture .el-upload-list__item .el-icon--close{top:5px;transform:translateY(0)}.el-upload-list--picture .el-upload-list__item-thumbnail{display:inline-flex;justify-content:center;align-items:center;width:70px;height:70px;-o-object-fit:contain;object-fit:contain;position:relative;z-index:1;background-color:var(--el-color-white)}.el-upload-list--picture .el-upload-list__item-status-label{position:absolute;right:-17px;top:-7px;width:46px;height:26px;background:var(--el-color-success);text-align:center;transform:rotate(45deg)}.el-upload-list--picture .el-upload-list__item-status-label i{font-size:12px;margin-top:12px;transform:rotate(-45deg)}.el-upload-list--picture .el-progress{position:relative;top:-7px}.el-upload-cover{position:absolute;left:0;top:0;width:100%;height:100%;overflow:hidden;z-index:10;cursor:default}.el-upload-cover:after{display:inline-block;content:"";height:100%;vertical-align:middle}.el-upload-cover img{display:block;width:100%;height:100%}.el-upload-cover__label{right:-15px;top:-6px;width:40px;height:24px;background:var(--el-color-success);text-align:center;transform:rotate(45deg)}.el-upload-cover__label i{font-size:12px;margin-top:11px;transform:rotate(-45deg);color:#fff}.el-upload-cover__progress{display:inline-block;vertical-align:middle;position:static;width:243px}.el-upload-cover__progress+.el-upload__inner{opacity:0}.el-upload-cover__content{position:absolute;top:0;left:0;width:100%;height:100%}.el-upload-cover__interact{position:absolute;bottom:0;left:0;width:100%;height:100%;background-color:var(--el-overlay-color-light);text-align:center}.el-upload-cover__interact .btn{display:inline-block;color:#fff;font-size:14px;cursor:pointer;vertical-align:middle;transition:var(--el-transition-md-fade);margin-top:60px}.el-upload-cover__interact .btn i{margin-top:0}.el-upload-cover__interact .btn span{opacity:0;transition:opacity .15s linear}.el-upload-cover__interact .btn:not(:first-child){margin-left:35px}.el-upload-cover__interact .btn:hover{transform:translateY(-13px)}.el-upload-cover__interact .btn:hover span{opacity:1}.el-upload-cover__interact .btn i{color:#fff;display:block;font-size:24px;line-height:inherit;margin:0 auto 5px}.el-upload-cover__title{position:absolute;bottom:0;left:0;background-color:#fff;height:36px;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:400;text-align:left;padding:0 10px;margin:0;line-height:36px;font-size:14px;color:var(--el-text-color-primary)}.el-upload-cover+.el-upload__inner{opacity:0;position:relative;z-index:1}.el-vl__wrapper{position:relative}.el-vl__wrapper:hover .el-virtual-scrollbar,.el-vl__wrapper.always-on .el-virtual-scrollbar{opacity:1}.el-vl__window{scrollbar-width:none}.el-vl__window::-webkit-scrollbar{display:none}.el-virtual-scrollbar{opacity:0;transition:opacity .34s ease-out}.el-virtual-scrollbar.always-on{opacity:1}.el-vg__wrapper{position:relative}.el-popper{--el-popper-border-radius:var(--el-popover-border-radius, 4px)}.el-popper{position:absolute;border-radius:var(--el-popper-border-radius);padding:5px 11px;z-index:2000;font-size:12px;line-height:20px;min-width:10px;word-wrap:break-word;visibility:visible}.el-popper.is-dark{color:var(--el-bg-color);background:var(--el-text-color-primary);border:1px solid var(--el-text-color-primary)}.el-popper.is-dark .el-popper__arrow:before{border:1px solid var(--el-text-color-primary);background:var(--el-text-color-primary);right:0}.el-popper.is-light{background:var(--el-bg-color-overlay);border:1px solid var(--el-border-color-light)}.el-popper.is-light .el-popper__arrow:before{border:1px solid var(--el-border-color-light);background:var(--el-bg-color-overlay);right:0}.el-popper.is-pure{padding:0}.el-popper__arrow{position:absolute;width:10px;height:10px;z-index:-1}.el-popper__arrow:before{position:absolute;width:10px;height:10px;z-index:-1;content:" ";transform:rotate(45deg);background:var(--el-text-color-primary);box-sizing:border-box}.el-popper[data-popper-placement^=top]>.el-popper__arrow{bottom:-5px}.el-popper[data-popper-placement^=top]>.el-popper__arrow:before{border-bottom-right-radius:2px}.el-popper[data-popper-placement^=bottom]>.el-popper__arrow{top:-5px}.el-popper[data-popper-placement^=bottom]>.el-popper__arrow:before{border-top-left-radius:2px}.el-popper[data-popper-placement^=left]>.el-popper__arrow{right:-5px}.el-popper[data-popper-placement^=left]>.el-popper__arrow:before{border-top-right-radius:2px}.el-popper[data-popper-placement^=right]>.el-popper__arrow{left:-5px}.el-popper[data-popper-placement^=right]>.el-popper__arrow:before{border-bottom-left-radius:2px}.el-popper[data-popper-placement^=top] .el-popper__arrow:before{border-top-color:transparent!important;border-left-color:transparent!important}.el-popper[data-popper-placement^=bottom] .el-popper__arrow:before{border-bottom-color:transparent!important;border-right-color:transparent!important}.el-popper[data-popper-placement^=left] .el-popper__arrow:before{border-left-color:transparent!important;border-bottom-color:transparent!important}.el-popper[data-popper-placement^=right] .el-popper__arrow:before{border-right-color:transparent!important;border-top-color:transparent!important}.el-select-dropdown__item{font-size:var(--el-font-size-base);padding:0 32px 0 20px;position:relative;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--el-text-color-regular);height:34px;line-height:34px;box-sizing:border-box;cursor:pointer}.el-select-dropdown__item.is-disabled{color:var(--el-text-color-placeholder);cursor:not-allowed}.el-select-dropdown__item.hover,.el-select-dropdown__item:hover{background-color:var(--el-fill-color-light)}.el-select-dropdown__item.selected{color:var(--el-color-primary);font-weight:700}.el-statistic{--el-statistic-title-font-weight:400;--el-statistic-title-font-size:var(--el-font-size-extra-small);--el-statistic-title-color:var(--el-text-color-regular);--el-statistic-content-font-weight:400;--el-statistic-content-font-size:var(--el-font-size-extra-large);--el-statistic-content-color:var(--el-text-color-primary)}.el-statistic__head{font-weight:var(--el-statistic-title-font-weight);font-size:var(--el-statistic-title-font-size);color:var(--el-statistic-title-color);line-height:20px;margin-bottom:4px}.el-statistic__content{font-weight:var(--el-statistic-content-font-weight);font-size:var(--el-statistic-content-font-size);color:var(--el-statistic-content-color)}.el-statistic__value{display:inline-block}.el-statistic__prefix{margin-right:4px;display:inline-block}.el-statistic__suffix{margin-left:4px;display:inline-block}:root{--wf-radius-sm: 4px;--wf-radius: 8px;--wf-radius-lg: 12px;--wf-radius-round: 20px;--wf-shadow-sm: 0 1px 4px rgba(0, 0, 0, .04);--wf-shadow: 0 2px 12px rgba(0, 0, 0, .06);--wf-shadow-lg: 0 4px 16px rgba(0, 0, 0, .1);--wf-shadow-primary: 0 2px 8px rgba(64, 158, 255, .3);--wf-transition: all .3s ease;--wf-warning-light: #fef0f0;--wf-warning-border: #fbc4c4}html.dark{--wf-shadow-sm: 0 1px 4px rgba(0, 0, 0, .2);--wf-shadow: 0 2px 12px rgba(0, 0, 0, .3);--wf-shadow-lg: 0 4px 16px rgba(0, 0, 0, .4);--wf-shadow-primary: 0 2px 8px rgba(64, 158, 255, .3);--wf-transition: all .3s ease;--wf-warning-light: #2e1a1a;--wf-warning-border: #5a2c2c}.fade-enter-active,.fade-leave-active{transition:opacity .28s}.fade-enter,.fade-leave-active{opacity:0}.fade-transform--move,.fade-transform-leave-active,.fade-transform-enter-active{transition:all .5s}.fade-transform-enter{opacity:0;transform:translate(-30px)}.fade-transform-leave-to{opacity:0;transform:translate(30px)}.breadcrumb-enter-active,.breadcrumb-leave-active{transition:all .5s}.breadcrumb-enter,.breadcrumb-leave-active{opacity:0;transform:translate(20px)}.breadcrumb-move{transition:all .5s}.breadcrumb-leave-active{position:absolute}.el-breadcrumb__inner,.el-breadcrumb__inner a{font-weight:400!important}.el-upload input[type=file]{display:none!important}.el-upload__input{display:none}.cell .el-tag{margin-right:0}.small-padding .cell{padding-left:5px;padding-right:5px}.fixed-width .el-button--mini{padding:7px 10px;width:60px}.status-col .cell{padding:0 10px;text-align:center}.status-col .cell .el-tag{margin-right:0}.el-dialog{transform:none;left:0;position:relative;margin:0 auto}.upload-container .el-upload{width:100%}.upload-container .el-upload .el-upload-dragger{width:100%;height:200px}.el-dropdown-menu a{display:block}.el-range-editor.el-input__inner{display:inline-flex!important}.el-range-separator{box-sizing:content-box}.el-menu--collapse>div>.el-submenu>.el-submenu__title .el-submenu__icon-arrow{display:none}.el-dropdown .el-dropdown-link{color:var(--el-color-primary)!important}#app .main-container{height:100%;transition:margin-left .28s;margin-left:200px;position:relative}#app .sidebarHide{margin-left:0!important}#app .sidebar-container{-webkit-transition:width .28s;transition:width .28s;width:200px!important;background-color:#304156;height:100%;position:fixed;font-size:0px;top:0;bottom:0;left:0;z-index:1001;overflow:hidden;-webkit-box-shadow:2px 0 6px rgba(0,21,41,.35);box-shadow:2px 0 6px #00152959}#app .sidebar-container .horizontal-collapse-transition{transition:0s width ease-in-out,0s padding-left ease-in-out,0s padding-right ease-in-out}#app .sidebar-container .scrollbar-wrapper{overflow-x:hidden!important}#app .sidebar-container .el-scrollbar__bar.is-vertical{right:0}#app .sidebar-container .el-scrollbar{height:100%}#app .sidebar-container.has-logo .el-scrollbar{height:calc(100% - 50px)}#app .sidebar-container .is-horizontal{display:none}#app .sidebar-container a{display:inline-block;width:100%;overflow:hidden}#app .sidebar-container .svg-icon{margin-right:16px}#app .sidebar-container .el-menu{border:none;height:100%;width:100%!important}#app .sidebar-container .el-menu-item,#app .sidebar-container .menu-title{overflow:hidden!important;text-overflow:ellipsis!important;white-space:nowrap!important}#app .sidebar-container .el-menu-item .el-menu-tooltip__trigger{display:inline-block!important}#app .sidebar-container .sub-menu-title-noDropdown:hover,#app .sidebar-container .el-sub-menu__title:hover{background-color:#0000000f!important}#app .sidebar-container .theme-dark .is-active>.el-sub-menu__title{color:#f4f4f5!important}#app .sidebar-container .nest-menu .el-sub-menu>.el-sub-menu__title,#app .sidebar-container .el-sub-menu .el-menu-item{min-width:200px!important}#app .sidebar-container .nest-menu .el-sub-menu>.el-sub-menu__title:hover,#app .sidebar-container .el-sub-menu .el-menu-item:hover{background-color:#0000000f!important}#app .sidebar-container .theme-dark .nest-menu .el-sub-menu>.el-sub-menu__title,#app .sidebar-container .theme-dark .el-sub-menu .el-menu-item{background-color:#1f2d3d!important}#app .sidebar-container .theme-dark .nest-menu .el-sub-menu>.el-sub-menu__title:hover,#app .sidebar-container .theme-dark .el-sub-menu .el-menu-item:hover{background-color:#001528!important}#app .hideSidebar .sidebar-container{width:54px!important}#app .hideSidebar .main-container{margin-left:54px}#app .hideSidebar .sub-menu-title-noDropdown{padding:0!important;position:relative}#app .hideSidebar .sub-menu-title-noDropdown .el-tooltip{padding:0!important}#app .hideSidebar .sub-menu-title-noDropdown .el-tooltip .svg-icon{margin-left:20px}#app .hideSidebar .el-sub-menu{overflow:hidden}#app .hideSidebar .el-sub-menu>.el-sub-menu__title{padding:0!important}#app .hideSidebar .el-sub-menu>.el-sub-menu__title .svg-icon{margin-left:20px}#app .hideSidebar .el-menu--collapse .el-sub-menu>.el-sub-menu__title>span{height:0;width:0;overflow:hidden;visibility:hidden;display:inline-block}#app .hideSidebar .el-menu--collapse .el-sub-menu>.el-sub-menu__title>i{height:0;width:0;overflow:hidden;visibility:hidden;display:inline-block}#app .el-menu--collapse .el-menu .el-sub-menu{min-width:200px!important}#app .mobile .main-container{margin-left:0}#app .mobile .sidebar-container{transition:transform .28s;width:200px!important}#app .mobile.hideSidebar .sidebar-container{pointer-events:none;transition-duration:.3s;transform:translate3d(-200px,0,0)}#app .withoutAnimation .main-container,#app .withoutAnimation .sidebar-container{transition:none}.el-menu--vertical>.el-menu .svg-icon{margin-right:16px}.el-menu--vertical .nest-menu .el-sub-menu>.el-sub-menu__title:hover,.el-menu--vertical .el-menu-item:hover{background-color:#0000000f!important}.el-menu--vertical>.el-menu--popup{max-height:100vh;overflow-y:auto}.el-menu--vertical>.el-menu--popup::-webkit-scrollbar-track-piece{background:#d3dce6}.el-menu--vertical>.el-menu--popup::-webkit-scrollbar{width:6px}.el-menu--vertical>.el-menu--popup::-webkit-scrollbar-thumb{background:#99a9bf;border-radius:20px}:export{menuColor:#bfcbd9;menuLightColor:rgba(0,0,0,.7);menuColorActive:#f4f4f5;menuBackground:#304156;menuLightBackground:#ffffff;subMenuBackground:#1f2d3d;subMenuHover:#001528;sideBarWidth:200px;logoTitleColor:#ffffff;logoLightTitleColor:#001529;primaryColor:#409EFF;successColor:#67C23A;dangerColor:#F56C6C;infoColor:#909399;warningColor:#E6A23C}.blue-btn{background:#324157}.blue-btn:hover{color:#324157}.blue-btn:hover:before,.blue-btn:hover:after{background:#324157}.light-blue-btn{background:#3a71a8}.light-blue-btn:hover{color:#3a71a8}.light-blue-btn:hover:before,.light-blue-btn:hover:after{background:#3a71a8}.red-btn{background:#c03639}.red-btn:hover{color:#c03639}.red-btn:hover:before,.red-btn:hover:after{background:#c03639}.pink-btn{background:#e65d6e}.pink-btn:hover{color:#e65d6e}.pink-btn:hover:before,.pink-btn:hover:after{background:#e65d6e}.green-btn{background:#30b08f}.green-btn:hover{color:#30b08f}.green-btn:hover:before,.green-btn:hover:after{background:#30b08f}.tiffany-btn{background:#4ab7bd}.tiffany-btn:hover{color:#4ab7bd}.tiffany-btn:hover:before,.tiffany-btn:hover:after{background:#4ab7bd}.yellow-btn{background:#fec171}.yellow-btn:hover{color:#fec171}.yellow-btn:hover:before,.yellow-btn:hover:after{background:#fec171}.pan-btn{font-size:14px;color:#fff;padding:14px 36px;border-radius:8px;border:none;outline:none;transition:.6s ease all;position:relative;display:inline-block}.pan-btn:hover{background:#fff}.pan-btn:hover:before,.pan-btn:hover:after{width:100%;transition:.6s ease all}.pan-btn:before,.pan-btn:after{content:"";position:absolute;top:0;right:0;height:2px;width:0;transition:.4s ease all}.pan-btn:after{right:inherit;top:inherit;left:0;bottom:0}.custom-button{display:inline-block;line-height:1;white-space:nowrap;cursor:pointer;background:#fff;color:#fff;-webkit-appearance:none;text-align:center;box-sizing:border-box;outline:0;margin:0;padding:10px 15px;font-size:14px;border-radius:4px}.pt5{padding-top:5px}.pr5{padding-right:5px}.pb5{padding-bottom:5px}.mt5{margin-top:5px}.mr5{margin-right:5px}.mb5{margin-bottom:5px}.mb8{margin-bottom:8px}.ml5{margin-left:5px}.mt10{margin-top:10px}.mr10{margin-right:10px}.mb10{margin-bottom:10px}.ml10{margin-left:10px}.mt20{margin-top:20px}.mr20{margin-right:20px}.mb20{margin-bottom:20px}.ml20{margin-left:20px}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.flex-hc{display:flex;align-items:center}.el-form .el-form-item__label{font-weight:700}.el-dialog:not(.is-fullscreen){margin-top:6vh!important}.el-dialog.scrollbar .el-dialog__body{overflow:auto;overflow-x:hidden;max-height:70vh;padding:10px 20px 0}.el-table .el-table__header-wrapper th,.el-table .el-table__fixed-header-wrapper th{word-break:break-word;background-color:#f8f8f9!important;color:#515a6e;height:40px!important;font-size:13px}.el-table .el-table__body-wrapper .el-button [class*=el-icon-]+span{margin-left:1px}.form-header{font-size:15px;color:#6379bb;border-bottom:1px solid #ddd;margin:8px 10px 25px;padding-bottom:5px}.pagination-container{position:relative;height:25px;margin-bottom:10px;margin-top:15px;padding:10px 20px!important}.el-dialog .pagination-container{position:static!important}.tree-border{margin-top:5px;border:1px solid #e5e6e7;background:#fff none;border-radius:4px;width:100%}.pagination-container .el-pagination{right:0;position:absolute}@media (max-width: 768px){.pagination-container .el-pagination>.el-pagination__jump{display:none!important}.pagination-container .el-pagination>.el-pagination__sizes{display:none!important}}.el-table .fixed-width .el-button--small{padding-left:0;padding-right:0;width:inherit}.el-table .el-dropdown-link{cursor:pointer;color:#409eff;margin-left:10px}.el-table .el-dropdown,.el-icon-arrow-down{font-size:12px}.el-tree-node__content>.el-checkbox{margin-right:8px}.list-group-striped>.list-group-item{border-left:0;border-right:0;border-radius:0;padding-left:0;padding-right:0}.list-group{padding-left:0;list-style:none}.list-group-item{border-bottom:1px solid #e7eaec;border-top:1px solid #e7eaec;margin-bottom:-1px;padding:11px 0;font-size:13px}.pull-right{float:right!important}.el-card__header{padding:14px 15px 7px!important;min-height:40px}.el-card__body{padding:15px 20px 20px!important}.card-box{padding-right:15px;padding-left:15px;margin-bottom:10px}.el-button--cyan.is-active,.el-button--cyan:active{background:#20b2aa;border-color:#20b2aa;color:#fff}.el-button--cyan:focus,.el-button--cyan:hover{background:#48d1cc;border-color:#48d1cc;color:#fff}.el-button--cyan{background-color:#20b2aa;border-color:#20b2aa;color:#fff}.text-navy{color:#1ab394}.text-primary{color:inherit}.text-success{color:#1c84c6}.text-info{color:#23c6c8}.text-warning{color:#f8ac59}.text-danger{color:#ed5565}.text-muted{color:#888}.img-circle{border-radius:50%}.img-lg{width:120px;height:120px}.avatar-upload-preview{position:absolute;top:50%;transform:translate(50%,-50%);width:200px;height:200px;border-radius:50%;box-shadow:0 0 4px #ccc;overflow:hidden}.sortable-ghost{opacity:.8;color:#fff!important;background:#42b983!important}.top-right-btn{margin-left:auto}body{height:100%;margin:0;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;font-family:Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Arial,sans-serif}label{font-weight:700}html{height:100%;box-sizing:border-box}#app{height:100%}*,*:before,*:after{box-sizing:inherit}.no-padding{padding:0!important}.padding-content{padding:4px 0}a:focus,a:active{outline:none}a,a:focus,a:hover{cursor:pointer;color:inherit;text-decoration:none}div:focus{outline:none}.fr{float:right}.fl{float:left}.pr-5{padding-right:5px}.pl-5{padding-left:5px}.block{display:block}.pointer{cursor:pointer}.inlineBlock{display:block}.clearfix:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}aside{background:#eef1f6;padding:8px 24px;margin-bottom:20px;border-radius:2px;display:block;line-height:32px;font-size:16px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;color:#2c3e50;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}aside a{color:#337ab7;cursor:pointer}aside a:hover{color:#20a0ff}.app-container{padding:20px;transition:var(--wf-transition)}.components-container{margin:30px 50px;position:relative}.pagination-container{margin-top:30px}.text-center{text-align:center}.sub-navbar{height:50px;line-height:50px;position:relative;width:100%;text-align:right;padding-right:20px;transition:.6s ease position;background:linear-gradient(90deg,#20b6f9,#20b6f9 0%,#2178f1 100%,#2178f1)}.sub-navbar .subtitle{font-size:20px;color:#fff}.sub-navbar.draft,.sub-navbar.deleted{background:#d0d0d0}.link-type,.link-type:focus{color:#337ab7;cursor:pointer}.link-type:hover,.link-type:focus:hover{color:#20a0ff}.filter-container{padding-bottom:10px}.filter-container .filter-item{display:inline-block;vertical-align:middle;margin-bottom:10px}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-thumb{background:#c0c4cc;border-radius:3px}::-webkit-scrollbar-thumb:hover{background:#909399}::-webkit-scrollbar-track{background:transparent}.card-section{background:var(--wf-bg-white);border-radius:var(--wf-radius-lg);box-shadow:var(--wf-shadow);padding:24px;margin-bottom:16px;transition:var(--wf-transition)}.card-section:hover{box-shadow:var(--wf-shadow-lg)}.section-title{font-size:15px;font-weight:600;color:var(--wf-text-primary);padding-bottom:12px;margin-bottom:20px;border-bottom:1px solid var(--wf-border-lighter);display:flex;align-items:center}.section-title:before{content:"";display:inline-block;width:3px;height:14px;background:linear-gradient(180deg,var(--wf-primary),var(--wf-primary-dark));border-radius:2px;margin-right:8px}.section-divider{height:1px;background:var(--wf-border-lighter);margin:20px 0}html.dark{--el-input-disabled-bg-color: #2a2d35;--el-disabled-bg-color: #2a2d35;--el-fill-color: #2a2d35}html.dark .el-input__wrapper{background-color:var(--wf-bg-color, #141414);box-shadow:0 0 0 1px var(--wf-border-color, #333333) inset}html.dark .el-input__wrapper:hover{box-shadow:0 0 0 1px var(--wf-primary, #409eff) inset}html.dark .el-input__wrapper.is-focus{box-shadow:0 0 0 1px var(--wf-primary, #409eff) inset,0 0 0 3px #409eff26}html.dark .el-input__wrapper.is-disabled{background-color:var(--wf-bg-color, #2a2d35)!important;box-shadow:none!important}html.dark .el-input__inner{color:var(--wf-text-primary, #e0e0e0)}html.dark .el-input__inner::placeholder{color:var(--wf-text-placeholder, #5a5a5a)}html.dark .el-input .el-input__suffix .el-input__count .el-input__count-inner,html.dark .el-input .el-input__count,html.dark .el-input__count-inner{background:transparent!important;color:var(--wf-text-secondary, #888888)!important}html.dark .el-radio__inner{background-color:var(--wf-bg-color, #141414);border-color:var(--wf-border-color, #333333)}html.dark .el-radio__input.is-checked .el-radio__inner{background-color:var(--wf-primary, #409eff);border-color:var(--wf-primary, #409eff)}html.dark .el-radio__label{color:var(--wf-text-primary, #e0e0e0)}html.dark .el-textarea__inner{background-color:var(--wf-bg-color, #141414);border-color:var(--wf-border-color, #333333);color:var(--wf-text-primary, #e0e0e0);box-shadow:0 0 0 1px var(--wf-border-color, #333333) inset}html.dark .el-textarea__inner::placeholder{color:var(--wf-text-placeholder, #5a5a5a)}html.dark .el-textarea__inner:hover{box-shadow:0 0 0 1px var(--wf-primary, #409eff) inset}html.dark .el-textarea__inner:focus{box-shadow:0 0 0 1px var(--wf-primary, #409eff) inset,0 0 0 3px #409eff26}html.dark .el-textarea__inner.is-disabled{background-color:var(--wf-bg-color, #2a2d35)!important}html.dark .el-select .el-input__wrapper{background-color:var(--wf-bg-color, #141414);box-shadow:0 0 0 1px var(--wf-border-color, #333333) inset}html.dark .el-select .el-select__input{color:var(--wf-text-primary, #e0e0e0)}html.dark .el-select__wrapper{background-color:var(--wf-bg-color, #141414);box-shadow:0 0 0 1px var(--wf-border-color, #333333) inset}html.dark .el-select__wrapper:hover{box-shadow:0 0 0 1px var(--wf-primary, #409eff) inset}html.dark .el-select__wrapper.is-focused{box-shadow:0 0 0 1px var(--wf-primary, #409eff) inset,0 0 0 3px #409eff26}html.dark .el-select__wrapper.is-disabled{background-color:var(--wf-bg-color, #2a2d35)!important}html.dark .el-select__wrapper .el-select__selected-item,html.dark .el-select__wrapper .el-select__placeholder{color:var(--wf-text-primary, #e0e0e0)}html.dark .el-select__wrapper .el-select__placeholder.is-transparent{color:var(--wf-text-placeholder, #5a5a5a)}html.dark .el-select-dropdown{background-color:var(--wf-bg-white, #1f1f1f);border:1px solid var(--wf-border-color, #333333)}html.dark .el-select-dropdown__item{color:var(--wf-text-primary, #e0e0e0)}html.dark .el-select-dropdown__item.hover,html.dark .el-select-dropdown__item:hover{background-color:var(--wf-bg-color, #141414)}html.dark .el-select-dropdown__item.selected{color:var(--wf-primary, #409eff)}html.dark .el-tree-select__popper,html.dark .el-select__popper{background-color:var(--wf-bg-white, #1f1f1f);border:1px solid var(--wf-border-color, #333333)}html.dark .el-tree-select__popper .el-tree,html.dark .el-select__popper .el-tree{background-color:var(--wf-bg-white, #1f1f1f);color:var(--wf-text-primary, #e0e0e0)}html.dark .el-tree-select__popper .el-tree .el-tree-node__content:hover,html.dark .el-select__popper .el-tree .el-tree-node__content:hover{background-color:var(--wf-bg-color, #141414)}html.dark .el-tree-select__popper .el-tree .el-tree-node.is-current>.el-tree-node__content,html.dark .el-select__popper .el-tree .el-tree-node.is-current>.el-tree-node__content{background-color:var(--wf-primary-light, #1a3a5c);color:var(--wf-primary, #409eff)}html.dark .el-form-item__label{color:var(--wf-text-primary, #e0e0e0)}html.dark .el-form-item__error{color:var(--wf-danger, #f56c6c)}html.dark .el-table{--el-table-bg-color: var(--wf-bg-white, #1f1f1f);--el-table-tr-bg-color: var(--wf-bg-white, #1f1f1f);--el-table-header-bg-color: var(--wf-primary-lighter, #1a2e4a);--el-table-row-hover-bg-color: var(--wf-primary-light, #1a3a5c);--el-table-border-color: var(--wf-border-color, #333333);--el-table-text-color: var(--wf-text-primary, #e0e0e0);--el-table-header-text-color: var(--wf-text-primary, #e0e0e0);background-color:var(--wf-bg-white, #1f1f1f);color:var(--wf-text-primary, #e0e0e0)}html.dark .el-table tr{background-color:var(--wf-bg-white, #1f1f1f)}html.dark .el-table th.el-table__cell{background-color:var(--wf-primary-lighter, #1a2e4a)!important;color:var(--wf-text-primary, #e0e0e0)}html.dark .el-table td.el-table__cell{border-bottom-color:var(--wf-border-color, #333333)}html.dark .el-table .el-table__row:hover>td.el-table__cell{background-color:var(--wf-primary-light, #1a3a5c)!important}html.dark .el-table .el-table__row--striped td.el-table__cell{background-color:var(--wf-bg-color, #141414)}html.dark .el-table .el-table__empty-text{color:var(--wf-text-secondary, #888888)}html.dark .el-table .el-table__inner-wrapper:before,html.dark .el-table .el-table__border-left-patch,html.dark .el-table:before{background-color:var(--wf-border-color, #333333)}html.dark .el-table .el-input__wrapper,html.dark .el-table .el-select .el-input__wrapper,html.dark .el-table .el-select__wrapper{background-color:var(--wf-bg-color, #141414);box-shadow:0 0 0 1px var(--wf-border-color, #333333) inset}html.dark .el-autocomplete__popper{background-color:var(--wf-bg-white, #1f1f1f);border:1px solid var(--wf-border-color, #333333)}html.dark .el-autocomplete-suggestion li{color:var(--wf-text-primary, #e0e0e0)}html.dark .el-autocomplete-suggestion li:hover{background-color:var(--wf-bg-color, #141414)}html.dark .el-popper.is-light{background-color:var(--wf-bg-white, #1f1f1f);border-color:var(--wf-border-color, #333333);color:var(--wf-text-primary, #e0e0e0)}html.dark .el-popper.is-light .el-popper__arrow:before{background-color:var(--wf-bg-white, #1f1f1f);border-color:var(--wf-border-color, #333333)}html.dark .lf-control{background:var(--wf-bg-white, #1f1f1f);box-shadow:none;border:1px solid var(--wf-border-color, #333333)}html.dark .lf-control .lf-control-item:hover{background:var(--wf-bg-color, #141414)}html.dark .lf-control .lf-control-text{color:var(--wf-text-primary, #e0e0e0)}html.dark ::-webkit-scrollbar-thumb{background:#4a4a4a}html.dark ::-webkit-scrollbar-thumb:hover{background:#606060}.lf-graph{position:relative;z-index:0;width:100%;height:100%;background:#fff;-webkit-user-select:none;user-select:none}.lf-element-text{cursor:text}.lf-text-disabled{pointer-events:none}.lf-text-draggable{cursor:move}*:focus{outline:none}.lf-node-anchor{cursor:crosshair}.lf-node-anchor-hover{visibility:hidden}.lf-anchor:hover .lf-node-anchor-hover{visibility:visible}.lf-edge.pointer-none{pointer-events:none}.lf-edge-append{cursor:pointer}.lf-edge-animation{stroke-dashoffset:100%;animation:lf_animate_dash 5s linear infinite}@keyframes lf_animate_dash{to{stroke-dashoffset:0}}.lf-node-not-allow{cursor:not-allowed}.lf-polyline-append-ns-resize{cursor:ns-resize}.lf-polyline-append-ew-resize{cursor:ew-resize}.lf-dragging,.lf-dragging .lf-element-text{cursor:move}.lf-draggable{cursor:default}.lf-bezier-adjust-anchor{cursor:pointer}.lf-background,.lf-grid{position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1}.lf-background-area{width:100%;height:100%}.lf-html-overlay{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;overflow:hidden;-webkit-user-select:none;user-select:none;pointer-events:none}.lf-html-overlay__transform>*{pointer-events:all}.lf-text-editable{pointer-events:all}.lf-text-input{position:absolute;box-sizing:border-box;min-width:100px;min-height:20px;padding:5px;line-height:1.2;white-space:pre;text-align:center;background:#fff;border:1px solid #edefed;border-radius:3px;outline:none;transform:translate(-50%,-50%);resize:none}.lf-get-text-height{display:inline-block;box-sizing:border-box;word-break:break-all;border:1px solid transparent}.lf-node-text-auto-wrap{display:flex;align-items:center;justify-content:center;box-sizing:border-box}.lf-node-text-auto-wrap-content{width:100%;line-height:1.2;text-align:center;word-break:break-all;background:transparent}.lf-node-text-ellipsis-content{width:100%;line-height:1.2;white-space:nowrap;text-align:center;background:transparent}.lf-node-text-ellipsis-content>div{overflow:hidden;text-overflow:ellipsis}.lf-tool-overlay{position:absolute;top:0;right:0;bottom:0;left:0;z-index:2;overflow:hidden;pointer-events:none}.lf-tool-overlay>*{pointer-events:all}.modification-overlay{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;overflow:hidden;pointer-events:none}.modification-overlay>*{pointer-events:all}.lf-outline,.lf-snapline{pointer-events:none}.lf-keyboard-tips{float:right}.lf-node-select-decorate{position:absolute;border:1px dashed #343435;transform:translate(-50%,-50%);pointer-events:none}.lf-multiple-select{position:absolute;border:2px dashed #4271dfcc;border-radius:12px;box-shadow:0 0 3px #4271df80;cursor:move}.lf-edge-adjust-point{cursor:move}.lf-rotate-control{cursor:grabbing}.lf-resize-control-nw{cursor:nw-resize}.lf-resize-control-n{cursor:n-resize}.lf-resize-control-ne{cursor:ne-resize}.lf-resize-control-e{cursor:e-resize}.lf-resize-control-se{cursor:se-resize}.lf-resize-control-s{cursor:s-resize}.lf-resize-control-sw{cursor:sw-resize}.lf-resize-control-w{cursor:w-resize}.medium-editor-anchor-preview,.medium-editor-toolbar{font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:16px;z-index:2000}@-webkit-keyframes medium-editor-image-loading{0%{-webkit-transform:scale(0);transform:scale(0)}to{-webkit-transform:scale(1);transform:scale(1)}}@keyframes medium-editor-image-loading{0%{-webkit-transform:scale(0);transform:scale(0)}to{-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes medium-editor-pop-upwards{0%{opacity:0;-webkit-transform:matrix(.97,0,0,1,0,12);transform:matrix(.97,0,0,1,0,12)}20%{opacity:.7;-webkit-transform:matrix(.99,0,0,1,0,2);transform:matrix(.99,0,0,1,0,2)}40%{opacity:1;-webkit-transform:matrix(1,0,0,1,0,-1);transform:matrix(1,0,0,1,0,-1)}to{-webkit-transform:matrix(1,0,0,1,0,0);transform:scale(1)}}@keyframes medium-editor-pop-upwards{0%{opacity:0;-webkit-transform:matrix(.97,0,0,1,0,12);transform:matrix(.97,0,0,1,0,12)}20%{opacity:.7;-webkit-transform:matrix(.99,0,0,1,0,2);transform:matrix(.99,0,0,1,0,2)}40%{opacity:1;-webkit-transform:matrix(1,0,0,1,0,-1);transform:matrix(1,0,0,1,0,-1)}to{-webkit-transform:matrix(1,0,0,1,0,0);transform:scale(1)}}.medium-editor-anchor-preview{word-wrap:break-word;left:0;line-height:1.4;max-width:280px;position:absolute;text-align:center;top:0;visibility:hidden;word-break:break-all}.medium-editor-anchor-preview a{color:#fff;display:inline-block;margin:5px 5px 10px}.medium-editor-placeholder-relative:after,.medium-editor-placeholder:after{content:attr(data-placeholder)!important;font-style:italic;margin:inherit;padding:inherit;white-space:pre}.medium-editor-anchor-preview-active{visibility:visible}.medium-editor-dragover{background:#ddd}.medium-editor-image-loading{-webkit-animation:medium-editor-image-loading 1s ease-in-out infinite;animation:medium-editor-image-loading 1s ease-in-out infinite;background-color:#333;border-radius:100%;display:inline-block;height:40px;width:40px}.medium-editor-placeholder{position:relative}.medium-editor-placeholder:after{left:0;position:absolute;top:0}.medium-editor-placeholder-relative,.medium-editor-placeholder-relative:after{position:relative}.medium-toolbar-arrow-over:before,.medium-toolbar-arrow-under:after{border-style:solid;content:"";display:block;height:0;left:50%;margin-left:-8px;position:absolute;width:0}.medium-toolbar-arrow-under:after{border-width:8px 8px 0}.medium-toolbar-arrow-over:before{border-width:0 8px 8px;top:-8px}.medium-editor-toolbar{left:0;position:absolute;top:0;visibility:hidden}.medium-editor-toolbar ul{margin:0;padding:0}.medium-editor-toolbar li{float:left;list-style:none;margin:0;padding:0}.medium-editor-toolbar li button{cursor:pointer;display:block;font-size:14px;line-height:1.33;margin:0;padding:15px;text-decoration:none}.medium-editor-toolbar li button:focus{outline:0}.medium-editor-toolbar li .medium-editor-action-underline{text-decoration:underline}.medium-editor-toolbar li .medium-editor-action-pre{font-family:Consolas,Liberation Mono,Menlo,Courier,monospace;font-size:12px;font-weight:100;padding:15px 0}.medium-editor-toolbar-active{visibility:visible}.medium-editor-sticky-toolbar{position:fixed;top:1px}.medium-editor-relative-toolbar{position:relative}.medium-editor-toolbar-active.medium-editor-stalker-toolbar{-webkit-animation:medium-editor-pop-upwards .16s linear forwards;animation:medium-editor-pop-upwards .16s linear forwards}.medium-editor-action-bold{font-weight:bolder}.medium-editor-action-italic{font-style:italic}.medium-editor-toolbar-form{display:none}.medium-editor-toolbar-form a,.medium-editor-toolbar-form input{font-family:Helvetica Neue,Helvetica,Arial,sans-serif}.medium-editor-toolbar-form .medium-editor-toolbar-form-row{line-height:14px;margin-left:5px;padding-bottom:5px}.medium-editor-toolbar-form .medium-editor-toolbar-input,.medium-editor-toolbar-form label{border:none;box-sizing:border-box;display:inline-block;font-size:14px;margin:0;padding:6px;width:316px}.medium-editor-toolbar-form .medium-editor-toolbar-input:focus,.medium-editor-toolbar-form label:focus{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;box-shadow:none;outline:0}.medium-editor-toolbar-form a{display:inline-block;font-size:24px;font-weight:bolder;margin:0 10px;text-decoration:none}.medium-editor-toolbar-form-active{display:block}.medium-editor-toolbar-actions:after{clear:both;content:"";display:table}.medium-editor-element{word-wrap:break-word;min-height:30px}.medium-editor-element img{max-width:100%}.medium-editor-element sub{vertical-align:sub}.medium-editor-element sup{vertical-align:super}.medium-editor-hidden{display:none}.medium-toolbar-arrow-under:after{border-color:#000 transparent transparent;top:40px}.medium-toolbar-arrow-over:before{border-color:transparent transparent #000}.medium-editor-toolbar{background-color:#000;border:none;border-radius:50px}.medium-editor-toolbar li button{background-color:transparent;border:none;box-sizing:border-box;color:#ccc;height:40px;min-width:40px;padding:5px 12px;-webkit-transition:background-color .2s ease-in,color .2s ease-in;transition:background-color .2s ease-in,color .2s ease-in}.medium-editor-toolbar li .medium-editor-button-active,.medium-editor-toolbar li button:hover{background-color:#000;color:#a2d7c7}.medium-editor-toolbar li .medium-editor-button-first{border-bottom-left-radius:50px;border-top-left-radius:50px;padding-left:24px}.medium-editor-toolbar li .medium-editor-button-last{border-bottom-right-radius:50px;border-right:none;border-top-right-radius:50px;padding-right:24px}.medium-editor-toolbar-form{background:#000;border-radius:50px;color:#ccc;overflow:hidden}.medium-editor-toolbar-form .medium-editor-toolbar-input{background:#000;box-sizing:border-box;color:#ccc;height:40px;padding-left:16px;width:220px}.medium-editor-toolbar-form .medium-editor-toolbar-input::-webkit-input-placeholder{color:#f8f5f3;color:#f7f4f2cc}.medium-editor-toolbar-form .medium-editor-toolbar-input:-moz-placeholder,.medium-editor-toolbar-form .medium-editor-toolbar-input::-moz-placeholder{color:#f8f5f3;color:#f7f4f2cc}.medium-editor-toolbar-form .medium-editor-toolbar-input:-ms-input-placeholder{color:#f8f5f3;color:#f7f4f2cc}.medium-editor-toolbar-form a{color:#ccc;-webkit-transform:translateY(2px);transform:translateY(2px)}.medium-editor-toolbar-form .medium-editor-toolbar-close{margin-right:16px}.medium-editor-toolbar-anchor-preview{background:#000;border-radius:50px;padding:5px 12px}.medium-editor-anchor-preview a{color:#ccc;text-decoration:none}.medium-editor-toolbar-actions button,.medium-editor-toolbar-actions li{border-radius:50px}.picker_wrapper.no_alpha .picker_alpha{display:none}.picker_wrapper.no_editor .picker_editor{opacity:0;position:absolute;z-index:-1}.picker_wrapper.no_cancel .picker_cancel{display:none}.layout_default.picker_wrapper{align-items:stretch;display:flex;flex-flow:row wrap;font-size:10px;justify-content:space-between;padding:.5em;width:25em}.layout_default.picker_wrapper button,.layout_default.picker_wrapper input{font-size:1rem}.layout_default.picker_wrapper>*{margin:.5em}.layout_default.picker_wrapper:before{content:"";display:block;height:0;order:1;width:100%}.layout_default .picker_selector,.layout_default .picker_slider{padding:1em}.layout_default .picker_hue{width:100%}.layout_default .picker_sl{flex:1 1 auto}.layout_default .picker_sl:before{content:"";display:block;padding-bottom:100%}.layout_default .picker_editor{order:1;width:6.5rem}.layout_default .picker_editor input{height:100%;width:100%}.layout_default .picker_sample{flex:1 1 auto;order:1}.layout_default .picker_cancel,.layout_default .picker_done{order:1}.picker_wrapper{background:#f2f2f2;box-shadow:0 0 0 1px silver;box-sizing:border-box;color:#444;cursor:default;font-family:sans-serif;pointer-events:auto}.picker_wrapper:focus{outline:none}.picker_wrapper button,.picker_wrapper input{border:none;box-shadow:0 0 0 1px silver;box-sizing:border-box;outline:none}.picker_wrapper button:active,.picker_wrapper button:focus,.picker_wrapper input:active,.picker_wrapper input:focus{box-shadow:0 0 2px 1px #1e90ff}.picker_wrapper button{background-color:#f5f5f5;background-image:linear-gradient(0deg,#dcdcdc,transparent);cursor:pointer;padding:.4em .6em}.picker_wrapper button:active{background-image:linear-gradient(0deg,transparent,#dcdcdc)}.picker_wrapper button:hover{background-color:#fff}.picker_selector{background:currentColor;border:2px solid #fff;border-radius:100%;box-shadow:0 0 3px 1px #67b9ff;cursor:pointer;display:block;position:absolute;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);z-index:1}.picker_slider .picker_selector{border-radius:2px}.picker_hue{background-image:linear-gradient(90deg,red,#ff0,#0f0,#0ff,#00f,#f0f,red)}.picker_hue,.picker_sl{box-shadow:0 0 0 1px silver;position:relative}.picker_sl{background-image:linear-gradient(180deg,#fff,#fff0 50%),linear-gradient(0deg,#000,transparent 50%),linear-gradient(90deg,gray,#80808000)}.picker_alpha,.picker_sample{background:linear-gradient(45deg,#d3d3d3 25%,transparent 0,transparent 75%,#d3d3d3 0) 0 0/2em 2em,linear-gradient(45deg,#d3d3d3 25%,#fff 0,#fff 75%,#d3d3d3 0) 1em 1em/2em 2em;box-shadow:0 0 0 1px silver;position:relative}.picker_alpha .picker_selector,.picker_sample .picker_selector{background:none}.picker_editor input{font-family:monospace;padding:.2em .4em}.picker_sample:before{background:currentColor;content:"";display:block;height:100%;position:absolute;width:100%}.picker_arrow{position:absolute;z-index:-1}.picker_wrapper.popup{margin:1.5em;position:absolute;z-index:2}.picker_wrapper.popup,.picker_wrapper.popup .picker_arrow:after,.picker_wrapper.popup .picker_arrow:before{background:#f2f2f2;box-shadow:0 0 10px 1px #0006}.picker_wrapper.popup .picker_arrow{height:3em;margin:0;width:3em}.picker_wrapper.popup .picker_arrow:after,.picker_wrapper.popup .picker_arrow:before{content:"";display:block;left:0;position:absolute;top:0;z-index:-99}.picker_wrapper.popup .picker_arrow:before{height:100%;-webkit-transform:skew(45deg);transform:skew(45deg);-webkit-transform-origin:0 100%;transform-origin:0 100%;width:100%}.picker_wrapper.popup .picker_arrow:after{box-shadow:none;height:150%;width:150%}.popup.popup_top{bottom:100%;left:0}.popup.popup_top .picker_arrow{bottom:0;left:0;-webkit-transform:rotate(-90deg);transform:rotate(-90deg)}.popup.popup_bottom{left:0;top:100%}.popup.popup_bottom .picker_arrow{left:0;top:0;-webkit-transform:rotate(90deg) scaleY(-1);transform:rotate(90deg) scaleY(-1)}.popup.popup_left{right:100%;top:0}.popup.popup_left .picker_arrow{right:0;top:0;-webkit-transform:scaleX(-1);transform:scaleX(-1)}.popup.popup_right{left:100%;top:0}.popup.popup_right .picker_arrow{left:0;top:0}.lf-label-overlay{height:0;overflow:visible;width:0}.lf-label-overlay .lf-label-editor{background:#fff;border-radius:5px;padding:4px}.lf-label-overlay .lf-label-editor-container{align-items:center;display:flex;justify-content:center;overflow:visible;position:absolute;text-align:center}.lf-label-overlay .lf-label-editor-container p{margin:0}.lf-label-overlay .lf-label-editor-dragging{cursor:move}.lf-label-overlay .lf-label-editor-editing{cursor:text;outline:2px solid #275dc5}.lf-label-overlay .lf-label-editor-hover{outline:2px dashed #acacac}.lf-label-overlay .lf-label-editor-clip{overflow:hidden;text-overflow:clip;white-space:nowrap;width:100px}.lf-label-overlay .lf-label-editor-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100px}.lf-label-overlay .lf-label-editor-wrap{overflow-wrap:break-word;white-space:normal}.lf-label-overlay .lf-label-editor-nowrap{overflow:visible;white-space:nowrap}.lf-control{background:#fffc;border-radius:8px;box-shadow:0 0 8px #d9d9d9b3;display:flex;flex-wrap:nowrap;margin:5px;max-width:none;overflow:auto hidden;padding:4px 6px;position:absolute;right:10px;top:0;transition:all 3s ease;white-space:nowrap}.lf-control-dark{background:#33353a;color:#fff}.lf-control-item{align-items:center;border-radius:8px;cursor:pointer;display:flex;flex:0 0 auto;flex-direction:column;justify-content:center;margin:0 4px;padding:6px;transition:all .3s ease-in-out}.lf-control-item:hover{background:#efefef}.lf-control-item-colorful,.lf-control-item-default{color:#474747}.lf-control-item-colorful:hover,.lf-control-item-dark:hover,.lf-control-item-default:hover{background:#dadfea48}.lf-control-item.disabled{filter:opacity(.5);pointer-events:none}.lf-control-item.disabled:hover{background:#fff}.lf-control-item.disabled i{pointer-events:none}.lf-control-item i{background-size:cover;display:inline-block;height:20px;vertical-align:middle;width:20px}.lf-control-text{font-size:12px;margin-top:5px}.lf-control-zoomOut{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9Im5vbmUiIHdpZHRoPSIxNS4yNDIiIGhlaWdodD0iMTUuMTI2Ij48cGF0aCBkPSJtMTEuOTIzIDEyLjQ1OCAyLjI0MyAyLjMxcS4wMzQuMDM1LjA3NS4wNjMuMDQuMDI4LjA4Ni4wNDguMDQ1LjAyLjA5NC4wMy4wNDguMDEuMDk4LjAxMi4wNSAwIC4wOTgtLjAwOC4wNS0uMDA4LjA5NS0uMDI2LjA0Ny0uMDE4LjA4OS0uMDQ0LjA0MS0uMDI2LjA3Ny0uMDZ0LjA2NS0uMDc0cS4wMjgtLjA0LjA0OC0uMDg0LjAyLS4wNDUuMDMtLjA5My4wMTEtLjA0Ny4wMTMtLjA5NiAwLS4wNS0uMDA4LS4wOTctLjAwOS0uMDQ4LS4wMjctLjA5NC0uMDE4LS4wNDUtLjA0NC0uMDg3LS4wMjctLjA0LS4wNjEtLjA3NmwtMi4yNDQtMi4zMXEtLjAzNC0uMDM1LS4wNzUtLjA2My0uMDQtLjAyOC0uMDg2LS4wNDgtLjA0NS0uMDItLjA5My0uMDMtLjA0OS0uMDExLS4wOTgtLjAxMi0uMDUtLjAwMS0uMDk5LjAwNy0uMDQ5LjAwOS0uMDk1LjAyNi0uMDQ2LjAxOC0uMDg4LjA0NC0uMDQyLjAyNi0uMDc4LjA2dC0uMDY0LjA3NHEtLjAyOS4wNC0uMDQ5LjA4NS0uMDIuMDQ0LS4wMy4wOTItLjAxMS4wNDgtLjAxMi4wOTctLjAwMS4wNDguMDA3LjA5Ny4wMS4wNDguMDI3LjA5My4wMTguMDQ2LjA0NS4wODcuMDI2LjA0MS4wNi4wNzdaIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiM0NzQ3NDciLz48ZWxsaXBzZSBjeD0iNy4xOTMiIGN5PSI3LjA5MSIgcng9IjYuNjkzIiByeT0iNi41OTEiIHN0cm9rZT0iIzQ3NDc0NyIvPjxwYXRoIGQ9Ik00Ljc4MSA3Ljc1Nmg1LjEzNnEuMDUgMCAuMDk3LS4wMS4wNDktLjAxLjA5NC0uMDI4LjA0Ni0uMDE5LjA4Ny0uMDQ2LjA0LS4wMjguMDc1LS4wNjMuMDM1LS4wMzQuMDYzLS4wNzUuMDI3LS4wNDEuMDQ2LS4wODcuMDE5LS4wNDUuMDI4LS4wOTMuMDEtLjA0OS4wMS0uMDk4IDAtLjA1LS4wMS0uMDk4dC0uMDI4LS4wOTNxLS4wMi0uMDQ2LS4wNDYtLjA4Ny0uMDI4LS4wNC0uMDYzLS4wNzUtLjAzNC0uMDM1LS4wNzUtLjA2My0uMDQxLS4wMjctLjA4Ny0uMDQ2LS4wNDUtLjAxOS0uMDk0LS4wMjgtLjA0OC0uMDEtLjA5Ny0uMDFINC43OHEtLjA1IDAtLjA5Ny4wMS0uMDQ5LjAxLS4wOTQuMDI4LS4wNDYuMDE5LS4wODcuMDQ2LS4wNC4wMjgtLjA3NS4wNjMtLjAzNS4wMzQtLjA2My4wNzUtLjAyNy4wNDEtLjA0Ni4wODctLjAxOS4wNDUtLjAyOC4wOTMtLjAxLjA0OS0uMDEuMDk4IDAgLjA1LjAxLjA5OHQuMDI4LjA5M3EuMDIuMDQ2LjA0Ni4wODcuMDI4LjA0LjA2My4wNzUuMDM0LjAzNS4wNzUuMDYzLjA0MS4wMjcuMDg3LjA0Ni4wNDUuMDE5LjA5NC4wMjguMDQ4LjAxLjA5Ny4wMVoiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZmlsbD0iIzQ3NDc0NyIvPjwvc3ZnPg==)}.lf-control-zoomIn{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9Im5vbmUiIHdpZHRoPSIxNS4wMzgiIGhlaWdodD0iMTUuNDAxIj48cGF0aCBkPSJtMTEuODY1IDEyLjg4MyAyLjA5NyAyLjE2di0uMDAxcS4wMzUuMDM1LjA3NS4wNjMuMDQuMDI4LjA4Ni4wNDguMDQ2LjAyLjA5NC4wMy4wNDkuMDExLjA5OC4wMTIuMDUuMDAxLjA5OS0uMDA3LjA0OS0uMDA5LjA5NS0uMDI2LjA0Ni0uMDE4LjA4OC0uMDQ0LjA0Mi0uMDI2LjA3OC0uMDYuMDM1LS4wMzQuMDY0LS4wNzQuMDI4LS4wNC4wNDgtLjA4NS4wMi0uMDQ0LjAzMS0uMDkyLjAxLS4wNDguMDEyLS4wOTcgMC0uMDQ4LS4wMDgtLjA5Ny0uMDA4LS4wNDgtLjAyNi0uMDkzLS4wMTgtLjA0Ni0uMDQ1LS4wODctLjAyNy0uMDQxLS4wNi0uMDc3bC0yLjA5OC0yLjE1OXEtLjAzNC0uMDM1LS4wNzUtLjA2My0uMDQtLjAyOC0uMDg2LS4wNDgtLjA0NS0uMDItLjA5NC0uMDMtLjA0OC0uMDEtLjA5OC0uMDEyLS4wNS0uMDAxLS4wOTguMDA3LS4wNS4wMDktLjA5NS4wMjctLjA0Ny4wMTctLjA4OC4wNDMtLjA0Mi4wMjctLjA3OC4wNi0uMDM2LjAzNC0uMDY0LjA3NC0uMDI5LjA0LS4wNDkuMDg1LS4wMi4wNDUtLjAzLjA5Mi0uMDExLjA0OC0uMDEyLjA5Ny0uMDAyLjA0OS4wMDcuMDk3LjAwOS4wNDguMDI3LjA5My4wMTguMDQ2LjA0NC4wODcuMDI3LjA0MS4wNjEuMDc3WiIgZmlsbC1ydWxlPSJldmVub2RkIiBmaWxsPSIjNDc0NzQ3Ii8+PGVsbGlwc2UgY3g9IjcuMjQxIiBjeT0iNy4yMiIgcng9IjYuNzQxIiByeT0iNi43MiIgc3Ryb2tlPSIjNDc0NzQ3Ii8+PHBhdGggZD0iTTYuNzQgMy43cTAtLjA1LjAxLS4wOTh0LjAyOS0uMDkzcS4wMTktLjA0Ni4wNDYtLjA4Ny4wMjctLjA0LjA2Mi0uMDc1LjAzNS0uMDM1LjA3Ni0uMDYzLjA0LS4wMjcuMDg2LS4wNDYuMDQ2LS4wMTkuMDk0LS4wMjguMDQ5LS4wMS4wOTgtLjAxdC4wOTcuMDFxLjA0OS4wMS4wOTQuMDI4LjA0Ni4wMTkuMDg2LjA0Ni4wNDEuMDI4LjA3Ni4wNjMuMDM1LjAzNC4wNjIuMDc1LjAyOC4wNDEuMDQ3LjA4Ny4wMTguMDQ1LjAyOC4wOTMuMDEuMDQ5LjAxLjA5OHYzLjAyaDMuMDNxLjA1IDAgLjA5OC4wMXQuMDk0LjAyOHEuMDQ1LjAxOS4wODYuMDQ2LjA0MS4wMjguMDc2LjA2My4wMzUuMDM0LjA2Mi4wNzUuMDI4LjA0MS4wNDYuMDg3LjAyLjA0NS4wMjkuMDkzLjAxLjA0OS4wMS4wOTggMCAuMDUtLjAxLjA5OHQtLjAyOS4wOTNxLS4wMTguMDQ2LS4wNDYuMDg3LS4wMjcuMDQtLjA2Mi4wNzUtLjAzNS4wMzUtLjA3Ni4wNjMtLjA0LjAyNy0uMDg2LjA0Ni0uMDQ2LjAxOS0uMDk0LjAyOC0uMDQ4LjAxLS4wOTcuMDFINy43NHYzLjAycTAgLjA1LS4wMS4wOTh0LS4wMjguMDkzcS0uMDIuMDQ2LS4wNDcuMDg3LS4wMjcuMDQtLjA2Mi4wNzUtLjAzNS4wMzUtLjA3Ni4wNjMtLjA0LjAyNy0uMDg2LjA0Ni0uMDQ1LjAxOS0uMDk0LjAyOC0uMDQ4LjAxLS4wOTcuMDEtLjA1IDAtLjA5OC0uMDF0LS4wOTQtLjAyOHEtLjA0NS0uMDE5LS4wODYtLjA0Ni0uMDQtLjAyOC0uMDc2LS4wNjMtLjAzNS0uMDM0LS4wNjItLjA3NS0uMDI3LS4wNDEtLjA0Ni0uMDg3LS4wMTktLjA0NS0uMDI5LS4wOTMtLjAxLS4wNDktLjAxLS4wOThWNy43MkgzLjcxcS0uMDUgMC0uMDk4LS4wMXQtLjA5My0uMDI4cS0uMDQ2LS4wMTktLjA4Ny0uMDQ2LS4wNC0uMDI4LS4wNzYtLjA2My0uMDM0LS4wMzQtLjA2Mi0uMDc1LS4wMjctLjA0MS0uMDQ2LS4wODctLjAxOS0uMDQ1LS4wMjgtLjA5My0uMDEtLjA0OS0uMDEtLjA5OCAwLS4wNS4wMS0uMDk4dC4wMjgtLjA5M3EuMDE5LS4wNDYuMDQ2LS4wODcuMDI4LS4wNC4wNjItLjA3NS4wMzUtLjAzNS4wNzYtLjA2My4wNDEtLjAyNy4wODctLjA0Ni4wNDUtLjAxOS4wOTMtLjAyOC4wNDktLjAxLjA5OC0uMDFoMy4wM1YzLjdaIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiM0NzQ3NDciLz48L3N2Zz4=)}.lf-control-fit{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9Im5vbmUiIHdpZHRoPSIxNi40MDciIGhlaWdodD0iMTYuMzYiPjxyZWN0IHg9IjIuMTg1IiB5PSIyLjE4MiIgd2lkdGg9IjEyLjAzNyIgaGVpZ2h0PSIxMS45OTciIHJ4PSIzLjUiIHN0cm9rZT0iIzQ3NDc0NyIvPjxyZWN0IHg9Ii41IiB5PSIuNSIgd2lkdGg9IjE1LjQwNyIgaGVpZ2h0PSIxNS4zNiIgcng9IjAiIGZpbGw9Im5vbmUiLz48cGF0aCBkPSJNLjUgMGgzLjg1MnEuMDUgMCAuMDk3LjAxLjA0OS4wMS4wOTQuMDI4LjA0Ni4wMTkuMDg3LjA0Ni4wNC4wMjguMDc1LjA2Mi4wMzUuMDM1LjA2My4wNzYuMDI3LjA0MS4wNDYuMDg3LjAxOS4wNDUuMDI4LjA5My4wMS4wNDkuMDEuMDk4IDAgLjA1LS4wMS4wOThUNC44MTQuNjlxLS4wMi4wNDYtLjA0Ni4wODctLjAyOC4wNC0uMDYzLjA3Ni0uMDM0LjAzNC0uMDc1LjA2Mi0uMDQxLjAyNy0uMDg3LjA0NlE0LjQ5OC45OCA0LjQ1Ljk5IDQuNDAxIDEgNC4zNTIgMUguNVEuNDUgMSAuNDAyLjk5VC4zMS45NjJRLjI2My45NDMuMjIyLjkxNi4xODIuODg4LjE0Ni44NTQuMTEyLjgxOS4wODQuNzc4LjA1Ny43MzcuMDM4LjY5LjAyLjY0Ni4wMS41OTggMCAuNTQ5IDAgLjUgMCAuNDUuMDEuNDAyVC4wMzguMzFRLjA1Ny4yNjMuMDg0LjIyMi4xMTIuMTgyLjE0Ni4xNDYuMTgxLjExMi4yMjIuMDg0LjI2My4wNTcuMzEuMDM4LjM1NC4wMi40MDIuMDEuNDUxIDAgLjUgMFptMTEuNTU2IDBoNC4zNTF2NC4zNHEwIC4wNS0uMDEuMDk4LS4wMDkuMDQ4LS4wMjguMDkzLS4wMTguMDQ2LS4wNDYuMDg3LS4wMjcuMDQtLjA2Mi4wNzYtLjAzNS4wMzQtLjA3Ni4wNjItLjA0LjAyNy0uMDg2LjA0Ni0uMDQ2LjAxOS0uMDk0LjAyOC0uMDQ4LjAxLS4wOTguMDEtLjA0OSAwLS4wOTctLjAxdC0uMDk0LS4wMjhxLS4wNDUtLjAxOS0uMDg2LS4wNDYtLjA0MS0uMDI4LS4wNzYtLjA2Mi0uMDM1LS4wMzUtLjA2Mi0uMDc2LS4wMjgtLjA0MS0uMDQ3LS4wODctLjAxOC0uMDQ1LS4wMjgtLjA5My0uMDEtLjA0OS0uMDEtLjA5OFYuNWguNVYxaC0zLjg1MXEtLjA1IDAtLjA5OC0uMDF0LS4wOTQtLjAyOHEtLjA0NS0uMDE5LS4wODYtLjA0Ni0uMDQxLS4wMjgtLjA3Ni0uMDYyLS4wMzUtLjAzNS0uMDYyLS4wNzYtLjAyOC0uMDQxLS4wNDYtLjA4Ny0uMDItLjA0NS0uMDI5LS4wOTMtLjAxLS4wNDktLjAxLS4wOTggMC0uMDUuMDEtLjA5OHQuMDI5LS4wOTNxLjAxOC0uMDQ2LjA0Ni0uMDg3LjAyNy0uMDQuMDYyLS4wNzYuMDM1LS4wMzQuMDc2LS4wNjIuMDQtLjAyNy4wODYtLjA0Ni4wNDYtLjAxOS4wOTQtLjAyOC4wNDgtLjAxLjA5OC0uMDFabTQuMzUxIDEyLjAydjQuMzRoLTQuMzUxcS0uMDUgMC0uMDk4LS4wMXQtLjA5NC0uMDI4cS0uMDQ1LS4wMTktLjA4Ni0uMDQ2LS4wNDEtLjAyOC0uMDc2LS4wNjItLjAzNS0uMDM1LS4wNjItLjA3Ni0uMDI4LS4wNDEtLjA0Ni0uMDg3LS4wMi0uMDQ1LS4wMjktLjA5My0uMDEtLjA0OS0uMDEtLjA5OCAwLS4wNS4wMS0uMDk4dC4wMjktLjA5M3EuMDE4LS4wNDYuMDQ2LS4wODcuMDI3LS4wNC4wNjItLjA3Ni4wMzUtLjAzNC4wNzYtLjA2Mi4wNC0uMDI3LjA4Ni0uMDQ2LjA0Ni0uMDE5LjA5NC0uMDI4LjA0OC0uMDEuMDk4LS4wMWgzLjg1MXYuNWgtLjV2LTMuODRxMC0uMDUuMDEtLjA5OHQuMDI4LS4wOTNxLjAyLS4wNDYuMDQ3LS4wODcuMDI3LS4wNC4wNjItLjA3Ni4wMzUtLjAzNC4wNzYtLjA2Mi4wNC0uMDI3LjA4Ni0uMDQ2LjA0Ni0uMDE5LjA5NC0uMDI4LjA0OC0uMDEuMDk3LS4wMS4wNSAwIC4wOTguMDF0LjA5NC4wMjhxLjA0NS4wMTkuMDg2LjA0Ni4wNDEuMDI4LjA3Ni4wNjIuMDM1LjAzNS4wNjIuMDc2LjAyOC4wNDEuMDQ2LjA4Ny4wMi4wNDUuMDI5LjA5My4wMS4wNDkuMDEuMDk4Wk00LjM1MiAxNi4zNkgwdi00LjM0cTAtLjA1LjAxLS4wOTh0LjAyOC0uMDkzcS4wMTktLjA0Ni4wNDYtLjA4Ny4wMjgtLjA0LjA2Mi0uMDc2LjAzNS0uMDM0LjA3Ni0uMDYyLjA0MS0uMDI3LjA4Ny0uMDQ2LjA0NS0uMDE5LjA5My0uMDI4LjA0OS0uMDEuMDk4LS4wMS4wNSAwIC4wOTguMDF0LjA5My4wMjhxLjA0Ni4wMTkuMDg3LjA0Ni4wNC4wMjguMDc2LjA2Mi4wMzQuMDM1LjA2Mi4wNzYuMDI3LjA0MS4wNDYuMDg3LjAxOS4wNDUuMDI4LjA5My4wMS4wNDkuMDEuMDk4djMuODRILjV2LS41aDMuODUycS4wNSAwIC4wOTcuMDEuMDQ5LjAxLjA5NC4wMjguMDQ2LjAxOS4wODcuMDQ2LjA0LjAyOC4wNzUuMDYyLjAzNS4wMzUuMDYzLjA3Ni4wMjcuMDQxLjA0Ni4wODcuMDE5LjA0NS4wMjguMDkzLjAxLjA0OS4wMS4wOTggMCAuMDUtLjAxLjA5OHQtLjAyOC4wOTNxLS4wMi4wNDYtLjA0Ni4wODctLjAyOC4wNC0uMDYzLjA3Ni0uMDM0LjAzNC0uMDc1LjA2Mi0uMDQxLjAyNy0uMDg3LjA0Ni0uMDQ1LjAxOS0uMDk0LjAyOC0uMDQ4LjAxLS4wOTcuMDFaTTAgNC4zNFYwaDQuMzUycS4wNSAwIC4wOTcuMDEuMDQ5LjAxLjA5NC4wMjguMDQ2LjAxOS4wODcuMDQ2LjA0LjAyOC4wNzUuMDYyLjAzNS4wMzUuMDYzLjA3Ni4wMjcuMDQxLjA0Ni4wODcuMDE5LjA0NS4wMjguMDkzLjAxLjA0OS4wMS4wOTggMCAuMDUtLjAxLjA5OFQ0LjgxNC42OXEtLjAyLjA0Ni0uMDQ2LjA4Ny0uMDI4LjA0LS4wNjMuMDc2LS4wMzQuMDM0LS4wNzUuMDYyLS4wNDEuMDI3LS4wODcuMDQ2UTQuNDk4Ljk4IDQuNDUuOTkgNC40MDEgMSA0LjM1MiAxSC41Vi41SDF2My44NHEwIC4wNS0uMDEuMDk4dC0uMDI4LjA5M3EtLjAxOS4wNDYtLjA0Ni4wODctLjAyOC4wNC0uMDYyLjA3Ni0uMDM1LjAzNC0uMDc2LjA2Mi0uMDQxLjAyNy0uMDg3LjA0Ni0uMDQ1LjAxOS0uMDkzLjAyOC0uMDQ5LjAxLS4wOTguMDEtLjA1IDAtLjA5OC0uMDFULjMxIDQuODAycS0uMDQ2LS4wMTktLjA4Ny0uMDQ2LS4wNC0uMDI4LS4wNzYtLjA2Mi0uMDM0LS4wMzUtLjA2Mi0uMDc2LS4wMjctLjA0MS0uMDQ2LS4wODdRLjAyIDQuNDg2LjAxIDQuNDM4IDAgNC4zODkgMCA0LjM0WiIgZmlsbD0iIzQ3NDc0NyIvPjwvc3ZnPg==)}.lf-control-undo{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9Im5vbmUiIHdpZHRoPSIxNC4zNTciIGhlaWdodD0iMTUuMDgiPjxwYXRoIGQ9Ik0xMy4zNTggMTMuNjJ2Ljk2cTAgLjA1LjAxLjA5OHQuMDI4LjA5M3EuMDE5LjA0Ni4wNDYuMDg3LjAyNy4wNC4wNjIuMDc1LjAzNS4wMzUuMDc2LjA2My4wNDEuMDI3LjA4Ni4wNDYuMDQ2LjAxOS4wOTQuMDI4LjA0OS4wMS4wOTguMDF0LjA5Ny0uMDFxLjA0OS0uMDEuMDk0LS4wMjguMDQ2LS4wMTkuMDg2LS4wNDYuMDQxLS4wMjguMDc2LS4wNjMuMDM1LS4wMzQuMDYyLS4wNzUuMDI4LS4wNDEuMDQ3LS4wODcuMDE4LS4wNDUuMDI4LS4wOTMuMDEtLjA0OS4wMS0uMDk4di0uOTZxMC0zLjUyLTIuNDktNi4wMS0yLjQ5LTIuNDktNi4wMS0yLjQ5SDQuNTQ5cS0uMDUgMC0uMDk3LjAxLS4wNDkuMDEtLjA5NC4wMjgtLjA0Ni4wMTktLjA4Ny4wNDYtLjA0LjAyOC0uMDc1LjA2My0uMDM1LjAzNC0uMDYzLjA3NS0uMDI3LjA0MS0uMDQ2LjA4Ny0uMDE5LjA0NS0uMDI4LjA5My0uMDEuMDQ5LS4wMS4wOTggMCAuMDUuMDEuMDk4dC4wMjguMDkzcS4wMi4wNDYuMDQ2LjA4Ny4wMjguMDQuMDYzLjA3NS4wMzQuMDM1LjA3NS4wNjMuMDQxLjAyNy4wODcuMDQ2LjA0NS4wMTkuMDk0LjAyOC4wNDguMDEuMDk3LjAxaDEuMzA5cTMuMTA2IDAgNS4zMDMgMi4xOTcgMi4xOTcgMi4xOTYgMi4xOTcgNS4zMDNaIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiM0NzQ3NDciLz48cGF0aCBkPSJNNS44NzYuODQycS4wNjYtLjA3LjEtLjE1OC4wMzYtLjA4OS4wMzYtLjE4NCAwLS4wNS0uMDEtLjA5OFQ1Ljk3NC4zMVE1Ljk1NS4yNjMgNS45MjguMjIyIDUuOS4xODIgNS44NjYuMTQ3IDUuODMuMTEyIDUuNzkuMDg0IDUuNzQ5LjA1NyA1LjcwMy4wMzggNS42NTguMDIgNS42MS4wMSA1LjU2IDAgNS41MTIgMHEtLjEwMyAwLS4xOTguMDQxLS4wOTUuMDQxLS4xNjYuMTE3TDAgNS42M2w1LjE2IDUuMTQzcS4wNy4wNy4xNjEuMTA4LjA5Mi4wMzguMTkxLjAzOC4wNSAwIC4wOTgtLjAxdC4wOTMtLjAyOHEuMDQ2LS4wMTkuMDg3LS4wNDYuMDQtLjAyOC4wNzYtLjA2My4wMzQtLjAzNC4wNjItLjA3NS4wMjctLjA0MS4wNDYtLjA4Ny4wMTktLjA0NS4wMjgtLjA5My4wMS0uMDQ5LjAxLS4wOTggMC0uMS0uMDM4LS4xOTJ0LS4xMDktLjE2MmwtNC40Ny00LjQ1N0w1Ljg3NS44NDNaIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiM0NzQ3NDciLz48L3N2Zz4=)}.lf-control-redo{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9Im5vbmUiIHdpZHRoPSIxNS4yMTgiIGhlaWdodD0iMTYiPjxwYXRoIGQ9Ik0xIDEzLjk1NVYxNS41cTAgLjA1LS4wMS4wOTh0LS4wMjguMDkzcS0uMDE5LjA0Ni0uMDQ2LjA4Ny0uMDI4LjA0LS4wNjIuMDc1LS4wMzUuMDM1LS4wNzYuMDYzLS4wNDEuMDI3LS4wODcuMDQ2LS4wNDUuMDE5LS4wOTMuMDI4US41NDkgMTYgLjUgMTZxLS4wNSAwLS4wOTctLjAxLS4wNDktLjAxLS4wOTQtLjAyOC0uMDQ2LS4wMTktLjA4Ny0uMDQ2LS4wNC0uMDI4LS4wNzUtLjA2My0uMDM1LS4wMzQtLjA2My0uMDc1LS4wMjctLjA0MS0uMDQ2LS4wODctLjAxOS0uMDQ1LS4wMjgtLjA5M1EwIDE1LjU0OSAwIDE1LjV2LTEuNTQ1cTAtMy41MjEgMi40OS02LjAxIDIuNDktMi40OSA2LjAxLTIuNDloMS45MTdxLjA1IDAgLjA5Ny4wMS4wNDkuMDA5LjA5NC4wMjguMDQ2LjAxOS4wODcuMDQ2LjA0LjAyNy4wNzUuMDYyLjAzNS4wMzUuMDYzLjA3Ni4wMjcuMDQuMDQ2LjA4Ni4wMTkuMDQ2LjAyOC4wOTQuMDEuMDQ4LjAxLjA5OCAwIC4wNDktLjAxLjA5N3QtLjAyOC4wOTRxLS4wMTkuMDQ1LS4wNDYuMDg2LS4wMjguMDQxLS4wNjMuMDc2LS4wMzQuMDM1LS4wNzUuMDYyLS4wNDEuMDI4LS4wODcuMDQ2LS4wNDUuMDItLjA5NC4wMjktLjA0OC4wMS0uMDk3LjAxSDguNXEtMy4xMDcgMC01LjMwMyAyLjE5NlExIDEwLjg0OCAxIDEzLjk1NVoiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZmlsbD0iIzQ3NDc0NyIvPjxwYXRoIGQ9Ik05LjAyNy44NDJxLS4wNjUtLjA3LS4xLS4xNThROC44OS41OTUgOC44OS41cTAtLjA1LjAxLS4wOThUOC45MjkuMzFxLjAyLS4wNDYuMDQ2LS4wODcuMDI4LS4wNC4wNjMtLjA3NS4wMzQtLjAzNS4wNzUtLjA2My4wNDEtLjAyNy4wODctLjA0Ni4wNDUtLjAxOS4wOTQtLjAyOFE5LjM0MiAwIDkuMzkgMHEuMTA0IDAgLjE5OC4wNDEuMDk1LjA0MS4xNjYuMTE3bDUuNDYyIDUuODA4LTUuNDczIDUuNDU2cS0uMDcuMDctLjE2Mi4xMDgtLjA5Mi4wMzgtLjE5LjAzOC0uMDUgMC0uMDk4LS4wMS0uMDQ5LS4wMS0uMDk0LS4wMjgtLjA0Ni0uMDE5LS4wODctLjA0Ni0uMDQtLjAyOC0uMDc1LS4wNjItLjAzNS0uMDM1LS4wNjMtLjA3Ni0uMDI3LS4wNDEtLjA0Ni0uMDg3LS4wMTktLjA0NS0uMDI4LS4wOTMtLjAxLS4wNDktLjAxLS4wOTggMC0uMS4wMzgtLjE5MS4wMzktLjA5My4xMS0uMTYzbDQuNzg1LTQuNzdMOS4wMjcuODQyWiIgZmlsbC1ydWxlPSJldmVub2RkIiBmaWxsPSIjNDc0NzQ3Ii8+PC9zdmc+)}.lf-menu{background:#fff;border:1px solid #efefee;border-radius:8px;display:none;margin:0 0 0 10px;padding:6px;position:absolute;width:150px;z-index:999}.lf-menu-dark{background:#33353a;color:#fff}.lf-menu>li{cursor:pointer;font-size:12px;line-height:14px;list-style:none;padding:6px;position:relative;transition:all .12s ease-in-out}.lf-menu-item{align-items:center;border-radius:6px;display:flex;gap:4px;justify-content:flex-start;list-style:none}.lf-menu-item:hover{background:#f3f3f3}.lf-menu-item__disabled{color:#aaa;cursor:not-allowed!important;opacity:.88;pointer-events:inherit!important}.lf-menu-item__disabled:hover{background:#fff}.lf-dndpanel{background:#fffc;border-radius:8px;box-shadow:0 0 4px 1px #d9d9d980;margin:5px;padding:10px 4px;position:absolute;z-index:999}.lf-dnd-item{font-size:14px;margin-top:5px;padding:6px;text-align:center}.lf-dnd-item.disabled>div{color:#a8abb2;cursor:not-allowed}.lf-dnd-shape{background-position:50%;background-repeat:no-repeat;background-size:contain;border-radius:8px;cursor:grab;height:36px;margin:0 auto;opacity:.99;width:36px}.lf-selection-select{border:2px dashed #ffab03;position:absolute}.lf-mini-map{background:#fefefe;border-radius:8px;box-shadow:0 0 10px 1px #b8b8b880;overflow:hidden;padding:28px 8px 8px;position:absolute}.lf-mini-map .lf-graph{height:100%!important;width:100%!important}.lf-mini-map-graph{border-radius:8px;overflow:hidden;position:relative}.lf-minimap-viewport{background-color:#d9d9d980;border-radius:2px;cursor:grab;left:0;position:absolute;top:0}.lf-mini-map-header{left:0;line-height:18px;margin:4px 6px;position:absolute;right:0;top:0}.lf-mini-map-close{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACL0lEQVRoQ+1YT2vUQBT/vS+Smc3u0ZtfwA+hUKEttIIVbMEWrGAL3UItqKCCCipooS3Ynu29ePfqLcnO5Nov0NsrWbc0myxtJpNmGZw9LZk37/3+vCTzQnD8R47jhycwbQe9A94BSwV8C1kKaL3dO2AtoWWC/8+BMJB9ItwHcM6MX0mqtm1EzOU7Y8bvJFV9k3zGDnSFPAVw76oIb8ZavzIpehnbE+Ilg/J7/8Za3THJVYfAHwB3x4owXsSpemNSuCs6zwEu7rl9AmEgt4hQspkIa5FS76uQCKV8RoxSLDP6pi1p7EAGsCvEBkA7ZbC0EuvBp+tI9IR4yqBSDIE3Iq13qwiQj6lFYEgikOsgvC4VJDyJlfo6CUg3kI9BmLBG67EevDUFn8XXJpBt7km5yox3xcIMfpRo/SN/PZRygRhj17J1JqwmSn2oA96awL926iwD/LEIgJjmo3RwMCQadGaZePh/3H5ejrT+XBd8IwSGJKRcAuPLhHZ6mIkMxlFpjbEUp+qbDfjGCGSJQiEWCfS9CiAmLCZK7VWJvSnG6h4oJu8FnTkm3r+uKDHNReng8CZgVdcbJTBqpxkwfk4EQJiJlTquCq5KnCeQV8npFnL6Jnb6Mer0i8zpo4TThzmnj9OjGXardDBrZqDZbmMmdnukdH6oL3xWOTG1vNh6oxn7AYB2PqtUOWC1GdP4Ya5N8I0ONG0Dv6znHZiW8t6BaSvvHfAONKSAf4w2JGTtNBey0xBAkjSEzwAAAABJRU5ErkJggg==);background-size:contain;color:#474747a0;cursor:pointer;height:18px;position:absolute;right:2px;top:6px;width:18px}.lf-mini-map-close:hover{color:#474747}.lf-mini-map-no-header{padding-top:8px}.lf-mini-map-no-close-icon .lf-mini-map-close,.lf-mini-map-no-header .lf-mini-map-header{display:none}.lf-resize-control-0{cursor:nw-resize}.lf-resize-control-1{cursor:ne-resize}.lf-resize-control-2{cursor:se-resize}.lf-resize-control-3{cursor:sw-resize}.lf-inner-context{display:none;flex-flow:column wrap;height:90px;position:absolute}.lf-context-item{box-sizing:content-box;height:20px;margin:0 2px 2px 0;padding:2px 3px;width:20px}.lf-context-item:hover{background:#c9d9d880}.lf-context-img{cursor:pointer;height:20px;width:20px}.lf-mindmap_addIcon{margin-top:10px}.start[data-v-8668dc7e]{width:100%}html.dark .start[data-v-8668dc7e]{background:var(--wf-bg-color, #141414);border-radius:var(--wf-radius-lg, 12px)}.startForm[data-v-8668dc7e]{border-top:0;width:100%}.modern-tabs-wrapper[data-v-8668dc7e]{position:relative;background:transparent;border-radius:0;padding:0;margin-bottom:4px;border-bottom:1px solid var(--wf-border-lighter, #ebeef5)}html.dark .modern-tabs-wrapper[data-v-8668dc7e]{background:transparent;border-bottom-color:var(--wf-border-color, #333333)}.modern-tabs[data-v-8668dc7e]{display:flex;align-items:center;gap:24px;overflow-x:auto}.modern-tabs[data-v-8668dc7e]::-webkit-scrollbar{height:0;display:none}.modern-tab-item[data-v-8668dc7e]{position:relative;display:inline-flex;align-items:center;gap:6px;padding:10px 2px;cursor:pointer;border-radius:0;font-size:14px;font-weight:500;color:var(--wf-text-regular, #606266);transition:color .2s ease;-webkit-user-select:none;user-select:none;white-space:nowrap;flex-shrink:0;border:none}.modern-tab-item[data-v-8668dc7e]:after{content:"";position:absolute;left:0;right:0;bottom:-1px;height:2px;background:var(--wf-primary, #409eff);border-radius:2px;transform:scaleX(0);transition:transform .25s cubic-bezier(.4,0,.2,1)}.modern-tab-item[data-v-8668dc7e]:hover{color:var(--wf-primary, #409eff)}.modern-tab-item.is-active[data-v-8668dc7e]{color:var(--wf-primary, #409eff);font-weight:600}.modern-tab-item.is-active[data-v-8668dc7e]:after{transform:scaleX(1)}.modern-tab-item.is-active.is-ext-tab[data-v-8668dc7e]{color:#67c23a}.modern-tab-item.is-active.is-ext-tab[data-v-8668dc7e]:after{background:#67c23a}.modern-tab-item.is-active.is-ext-tab .tab-label[data-v-8668dc7e]{color:#67c23a}.modern-tab-item.is-ext-tab[data-v-8668dc7e]{color:var(--wf-success, #529b2e)}html.dark .modern-tab-item.is-ext-tab[data-v-8668dc7e]{color:#85ce61}.modern-tab-item.is-ext-tab[data-v-8668dc7e]:hover{color:#3d8b2a}html.dark .modern-tab-item.is-ext-tab[data-v-8668dc7e]:hover{color:#fff}.modern-tab-item.is-ext-tab .tab-ext-tag[data-v-8668dc7e]{font-size:10px;padding:1px 6px;margin-left:6px;background:#67c23a1f;color:var(--wf-success, #67c23a);border-radius:4px;font-weight:600;line-height:1.4;vertical-align:middle}html.dark .modern-tab-item.is-ext-tab .tab-ext-tag[data-v-8668dc7e]{background:#67c23a2e;color:#85ce61}.modern-tab-item .tab-icon[data-v-8668dc7e]{width:16px;height:16px;flex-shrink:0;display:inline-flex}.modern-tab-item .tab-label[data-v-8668dc7e]{position:relative;z-index:1}.tabPane[data-v-8668dc7e]{padding:16px 2px 8px;border:none;background:transparent;animation:fadeIn-8668dc7e .2s ease}.tabPane-full[data-v-8668dc7e]{padding:16px 2px 8px}@keyframes fadeIn-8668dc7e{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.base-settings-section[data-v-8668dc7e]{border:none;background:transparent;box-shadow:none;border-radius:0;overflow:visible;margin-bottom:4px}html.dark .base-settings-section[data-v-8668dc7e]{border:none;background:transparent}.base-settings-header[data-v-8668dc7e]{display:flex;align-items:center;gap:8px;padding:0 0 12px;margin-bottom:20px;background:transparent;border-bottom:1px solid var(--wf-border-lighter, #ebeef5)}html.dark .base-settings-header[data-v-8668dc7e]{background:transparent;border-bottom-color:var(--wf-border-color, #333333)}.ext-icon-base[data-v-8668dc7e]{color:var(--wf-text-regular, #606266)}.ext-icon-base svg[data-v-8668dc7e]{width:16px;height:16px}.base-settings-title[data-v-8668dc7e]{font-size:15px;font-weight:600;color:var(--wf-text-primary, #303133);letter-spacing:.3px}.base-settings-content[data-v-8668dc7e]{padding:0;background:transparent}html.dark .base-settings-content[data-v-8668dc7e]{background:transparent}.section-card[data-v-8668dc7e]{border:none;background:transparent;box-shadow:none;border-radius:0;overflow:visible;margin-bottom:4px}html.dark .section-card[data-v-8668dc7e]{border:none;background:transparent}.section-card[data-v-8668dc7e]:hover{box-shadow:none}.section-card-header[data-v-8668dc7e]{display:flex;align-items:center;gap:8px;padding:0 0 12px;margin-bottom:20px;background:transparent;border-bottom:1px solid var(--wf-border-lighter, #ebeef5)}html.dark .section-card-header[data-v-8668dc7e]{background:transparent;border-bottom-color:var(--wf-border-color, #333333)}.section-card-icon[data-v-8668dc7e]{width:20px;height:20px;display:flex;align-items:center;justify-content:center}.section-card-icon svg[data-v-8668dc7e]{width:16px;height:16px}.section-card-title[data-v-8668dc7e]{font-size:15px;font-weight:600;color:var(--wf-text-primary, #303133);letter-spacing:.3px}.section-card-body[data-v-8668dc7e]{padding:0;background:transparent}html.dark .section-card-body[data-v-8668dc7e]{background:transparent}.action-buttons[data-v-8668dc7e]{display:flex;gap:8px;margin-top:12px}@media (max-width: 1024px) and (min-width: 769px){.modern-tabs-wrapper[data-v-8668dc7e]{padding:4px}.modern-tab-item[data-v-8668dc7e]{padding:7px 12px;font-size:12px}.base-settings-header[data-v-8668dc7e],.base-settings-content[data-v-8668dc7e]{padding:10px 12px}.base-settings-title[data-v-8668dc7e]{font-size:12px}.section-card-header[data-v-8668dc7e],.section-card-body[data-v-8668dc7e]{padding:10px 12px}.section-card-title[data-v-8668dc7e]{font-size:12px}.tabPane[data-v-8668dc7e],.tabPane-full[data-v-8668dc7e]{padding:12px 2px 6px}}@media (max-width: 768px){.modern-tabs-wrapper[data-v-8668dc7e]{padding:4px;border-radius:var(--wf-radius, 8px)}.modern-tabs[data-v-8668dc7e]{gap:3px;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none}.modern-tabs[data-v-8668dc7e]::-webkit-scrollbar{display:none}.modern-tab-item[data-v-8668dc7e]{padding:6px 10px;font-size:12px;border-radius:var(--wf-radius-sm, 6px)}.base-settings-section[data-v-8668dc7e]{border-radius:var(--wf-radius, 8px)}.base-settings-header[data-v-8668dc7e]{padding:8px 10px;gap:6px}.ext-icon-base svg[data-v-8668dc7e]{width:14px;height:14px}.base-settings-title[data-v-8668dc7e]{font-size:12px}.base-settings-content[data-v-8668dc7e]{padding:10px}.section-card[data-v-8668dc7e]{border-radius:var(--wf-radius, 8px)}.section-card-header[data-v-8668dc7e]{padding:8px 10px;gap:6px}.section-card-icon svg[data-v-8668dc7e]{width:14px;height:14px}.section-card-title[data-v-8668dc7e]{font-size:12px}.section-card-body[data-v-8668dc7e]{padding:10px}.action-buttons[data-v-8668dc7e]{flex-direction:column;gap:6px;margin-top:8px}.tabPane[data-v-8668dc7e],.tabPane-full[data-v-8668dc7e]{padding:10px 2px 4px}[data-v-8668dc7e] .el-form-item__label{width:auto!important;min-width:95px!important;max-width:115px!important;padding-right:6px!important;font-size:12px!important;line-height:1.4!important;word-break:break-word!important}[data-v-8668dc7e] .el-table{font-size:12px}[data-v-8668dc7e] .el-table:before{background-color:transparent}[data-v-8668dc7e] .el-table .el-table__header-wrapper,[data-v-8668dc7e] .el-table .el-table__body-wrapper{overflow-x:auto;-webkit-overflow-scrolling:touch}[data-v-8668dc7e] .el-table th,[data-v-8668dc7e] .el-table td{padding:6px 4px}[data-v-8668dc7e] .el-table-column--selection .cell,[data-v-8668dc7e] .el-table .cell{min-width:60px}[data-v-8668dc7e] .el-input,[data-v-8668dc7e] .el-select,[data-v-8668dc7e] .el-textarea{--el-input-height: 32px}[data-v-8668dc7e] .el-input__inner,[data-v-8668dc7e] .el-textarea__inner{font-size:12px}[data-v-8668dc7e] .el-button--small{padding:5px 8px;font-size:12px}.ext-attributes-header[data-v-8668dc7e]{padding:8px 10px;gap:6px}.ext-attributes-title[data-v-8668dc7e]{font-size:12px}.ext-attributes-content[data-v-8668dc7e]{padding:10px}.ext-attributes-icon svg[data-v-8668dc7e]{width:14px;height:14px}}@media (max-width: 480px){.modern-tab-item[data-v-8668dc7e]{padding:5px 8px;font-size:11px}.base-settings-header[data-v-8668dc7e],.section-card-header[data-v-8668dc7e],.ext-attributes-header[data-v-8668dc7e]{padding:6px 8px}.base-settings-content[data-v-8668dc7e],.section-card-body[data-v-8668dc7e],.ext-attributes-content[data-v-8668dc7e]{padding:8px}[data-v-8668dc7e] .el-form-item__label{min-width:80px!important;font-size:11px!important}[data-v-8668dc7e] .el-input__inner,[data-v-8668dc7e] .el-textarea__inner{font-size:11px}}.section-purple .section-purple-header[data-v-8668dc7e]{background:transparent;border-bottom-color:var(--wf-border-lighter, #ebeef5)}html.dark .section-purple .section-purple-header[data-v-8668dc7e]{background:transparent;border-bottom-color:var(--wf-border-color, #333333)}.section-purple .section-purple-icon[data-v-8668dc7e],.section-purple .section-purple-title[data-v-8668dc7e]{color:#8960dc}.action-buttons[data-v-8668dc7e]{margin-top:12px}.add-row-btn[data-v-8668dc7e]{width:100%;border:1.5px dashed var(--wf-primary, #409eff)!important;color:var(--wf-primary, #409eff)!important;background:transparent!important;border-radius:10px;transition:all .3s ease;height:40px;letter-spacing:2px;font-weight:500;display:flex;align-items:center;justify-content:center}.add-row-btn[data-v-8668dc7e]:hover{background:var(--wf-primary-light, #ecf5ff)!important;border-style:solid!important;border-color:var(--wf-primary, #409eff)!important;box-shadow:var(--wf-shadow-primary, 0 2px 8px rgba(64, 158, 255, .3))}[data-v-8668dc7e] .el-table .el-form-item{margin-bottom:0}[data-v-8668dc7e] .el-table .el-form-item .el-form-item__label{display:none!important;width:0!important;min-width:0!important;padding-right:0!important;overflow:hidden!important;visibility:hidden!important;height:0!important}[data-v-8668dc7e] .el-table .el-form-item .el-form-item__content{display:block!important;margin-left:0!important}[data-v-8668dc7e] .listenerItem .el-table .el-form-item{margin-bottom:0}.user-select-wrapper[data-v-5ec51a41]{width:100%;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,sans-serif}html.dark .user-select-wrapper[data-v-5ec51a41]{background:var(--wf-bg-color, #141414);border-radius:var(--wf-radius-lg, 12px);padding:8px}.modern-tabs-wrapper[data-v-5ec51a41]{background:var(--wf-bg-white, #fff);border-radius:var(--wf-radius-lg, 12px);padding:5px;box-shadow:var(--wf-shadow-sm, 0 1px 4px rgba(0, 0, 0, .04));margin-bottom:12px}html.dark .modern-tabs-wrapper[data-v-5ec51a41]{background:var(--wf-bg-color, #141414)}.modern-tabs[data-v-5ec51a41]{display:flex;align-items:center;gap:3px;overflow-x:auto}.modern-tabs[data-v-5ec51a41]::-webkit-scrollbar{height:0;display:none}.modern-tab-item[data-v-5ec51a41]{position:relative;padding:7px 18px;cursor:pointer;border-radius:var(--wf-radius, 8px);font-size:13px;font-weight:500;color:var(--wf-text-secondary, #909399);transition:all .25s cubic-bezier(.4,0,.2,1);-webkit-user-select:none;user-select:none;white-space:nowrap;flex-shrink:0}.modern-tab-item[data-v-5ec51a41]:hover{color:var(--wf-primary, #409eff);background:var(--wf-primary-lighter, #f0f7ff)}html.dark .modern-tab-item[data-v-5ec51a41]:hover{background:#409eff14}.modern-tab-item.is-active[data-v-5ec51a41]{color:#fff;background:linear-gradient(135deg,var(--wf-primary, #409eff),var(--wf-primary-dark, #2b7de9));box-shadow:0 2px 6px #409eff4d;font-weight:600;transform:translateY(-1px)}.modern-tab-item .tab-label[data-v-5ec51a41]{position:relative;z-index:1}.content[data-v-5ec51a41]{margin:0}.section-card[data-v-5ec51a41]{border-radius:var(--wf-radius-lg, 12px);overflow:hidden;border:1px solid var(--wf-border-light, #e4e7ed);background:var(--wf-bg-white, #fff);box-shadow:var(--wf-shadow-sm, 0 1px 4px rgba(0, 0, 0, .04));transition:all .3s ease}html.dark .section-card[data-v-5ec51a41]{border-color:var(--wf-border-color, #333333);background:var(--wf-bg-color, #141414)}.section-card[data-v-5ec51a41]:hover{box-shadow:var(--wf-shadow, 0 2px 12px rgba(0, 0, 0, .06))}html.dark .section-card[data-v-5ec51a41]:hover{box-shadow:0 2px 12px #0000004d}.tree-card[data-v-5ec51a41]{padding-bottom:0;display:flex;flex-direction:column}@media (min-width: 769px){.tree-card[data-v-5ec51a41]{height:560px}}.tree-card.tree-collapsed[data-v-5ec51a41]{height:auto;min-height:auto}.tree-card.tree-collapsed .tree-header[data-v-5ec51a41]{border-bottom:none;border-radius:var(--wf-radius-lg, 12px)}.tree-card .tree-header[data-v-5ec51a41]{display:flex;align-items:center;gap:8px;padding:13px 16px;font-size:13px;font-weight:600;color:var(--wf-text-primary, #303133);letter-spacing:.3px;background:linear-gradient(135deg,#f5f7fa,#ecf1f6);border-bottom:1px solid var(--wf-border-lighter, #ebeef5);flex-shrink:0}html.dark .tree-card .tree-header[data-v-5ec51a41]{background:linear-gradient(135deg,#78808c14,#5058640d);border-bottom-color:var(--wf-border-color, #333333)}.tree-card .tree-header .tree-icon[data-v-5ec51a41]{width:17px;height:17px;color:var(--wf-primary, #409eff);flex-shrink:0}.tree-card .tree-header-clickable[data-v-5ec51a41]{cursor:pointer;-webkit-user-select:none;user-select:none;transition:background .25s ease}.tree-card .tree-header-clickable[data-v-5ec51a41]:hover{background:linear-gradient(135deg,#409eff14,#2b7de90a)}html.dark .tree-card .tree-header-clickable[data-v-5ec51a41]:hover{background:linear-gradient(135deg,#409eff1a,#2b7de90f)}.tree-card .tree-collapse-toggle[data-v-5ec51a41]{margin-left:auto;flex-shrink:0;width:22px;height:22px;display:flex;align-items:center;justify-content:center;color:var(--wf-text-secondary, #909399);opacity:.5;transition:all .25s ease}.tree-card .tree-collapse-toggle .toggle-arrow[data-v-5ec51a41]{width:18px;height:18px;transition:transform .35s cubic-bezier(.4,0,.2,1)}.tree-card .tree-collapse-toggle .toggle-arrow.is-expanded[data-v-5ec51a41]{transform:rotate(180deg)}.tree-header-clickable:hover .tree-card .tree-collapse-toggle[data-v-5ec51a41]{opacity:1;color:var(--wf-primary, #409eff)}.tree-card .tree-content[data-v-5ec51a41]{display:flex;flex-direction:column;flex:1;overflow:hidden}.tree-card .tree-search[data-v-5ec51a41]{padding:12px;border-bottom:1px solid var(--wf-border-lighter, #ebeef5);flex-shrink:0}.tree-card .tree-search[data-v-5ec51a41] .el-input__wrapper{border-radius:8px;transition:all .25s ease;box-shadow:0 0 0 1px var(--wf-border-color, #dcdfe6) inset}.tree-card .tree-search[data-v-5ec51a41] .el-input__wrapper:hover{box-shadow:0 0 0 1px var(--wf-primary, #409eff) inset}.tree-card .tree-search[data-v-5ec51a41] .el-input__wrapper.is-focus{box-shadow:0 0 0 2px #409eff26,0 0 0 1px var(--wf-primary, #409eff) inset!important}.tree-card .tree-body[data-v-5ec51a41]{flex:1;overflow-y:auto;padding:10px 4px}.tree-card .tree-body[data-v-5ec51a41]::-webkit-scrollbar{width:5px}.tree-card .tree-body[data-v-5ec51a41]::-webkit-scrollbar-track{background:transparent}.tree-card .tree-body[data-v-5ec51a41]::-webkit-scrollbar-thumb{background:#00000024;border-radius:5px}.tree-card .tree-body[data-v-5ec51a41]::-webkit-scrollbar-thumb:hover{background:#0000003d}html.dark .tree-card .tree-body[data-v-5ec51a41]::-webkit-scrollbar-thumb{background:#ffffff2e}.tree-card .tree-body[data-v-5ec51a41] .el-tree{background:transparent}.tree-card .tree-body[data-v-5ec51a41] .el-tree-node{display:table;min-width:100%}.tree-card .tree-body[data-v-5ec51a41] .el-tree-node__content:hover,.tree-card .tree-body[data-v-5ec51a41] .el-tree-node.is-current>.el-tree-node__content{color:var(--wf-primary, #409eff);background-color:var(--wf-primary-lighter, #f0f7ff);border-radius:7px}html.dark .tree-card .tree-body[data-v-5ec51a41] .el-tree-node__content:hover,html.dark .tree-card .tree-body[data-v-5ec51a41] .el-tree-node.is-current>.el-tree-node__content{background-color:#409eff1f}.tree-card .tree-body[data-v-5ec51a41] .el-tree-node__expand-icon{color:var(--wf-text-secondary, #909399);transition:transform .2s ease}html.dark .tree-card .tree-body[data-v-5ec51a41] .el-tree-node__content{color:#c0c4cc}.tree-slide-enter-active[data-v-5ec51a41],.tree-slide-leave-active[data-v-5ec51a41]{transition:all .35s cubic-bezier(.4,0,.2,1);overflow:hidden}.tree-slide-enter-from[data-v-5ec51a41],.tree-slide-leave-to[data-v-5ec51a41]{max-height:0;opacity:0;padding-top:0;padding-bottom:0}.tree-slide-enter-to[data-v-5ec51a41],.tree-slide-leave-from[data-v-5ec51a41]{max-height:2000px;opacity:1}.search-card[data-v-5ec51a41]{margin-bottom:12px}.search-card-body[data-v-5ec51a41]{padding:16px 18px;background:var(--wf-bg-white, #fff)}html.dark .search-card-body[data-v-5ec51a41]{background:var(--wf-bg-color, #141414)}.search-card-body .el-form-item[data-v-5ec51a41]{margin-bottom:8px;margin-right:16px}.search-card-body .el-form-item__label[data-v-5ec51a41]{font-weight:500;color:var(--wf-text-regular, #606266);font-size:13px;white-space:nowrap}.search-card-body .el-form-item__label[data-v-5ec51a41]:after{content:":"}.search-card-body[data-v-5ec51a41] .el-input__wrapper,.search-card-body[data-v-5ec51a41] .el-range-editor{border-radius:10px;background-color:var(--wf-bg-white, #fff);box-shadow:none!important;border:1px solid var(--wf-border-color, #dcdfe6);transition:background-color .2s ease,box-shadow .2s ease,border-color .2s ease}.search-card-body[data-v-5ec51a41] .el-input__wrapper:hover,.search-card-body[data-v-5ec51a41] .el-range-editor:hover{border-color:var(--wf-primary, #409eff)}.search-card-body[data-v-5ec51a41] .el-input__wrapper.is-focus,.search-card-body[data-v-5ec51a41] .el-range-editor.is-focus{background-color:var(--wf-bg-white, #fff);border-color:var(--wf-primary, #409eff);box-shadow:0 0 0 4px #409eff1f!important}html.dark .search-card-body[data-v-5ec51a41] .el-input__wrapper,html.dark .search-card-body[data-v-5ec51a41] .el-range-editor{background-color:#ffffff0f}html.dark .search-card-body[data-v-5ec51a41] .el-input__wrapper.is-focus,html.dark .search-card-body[data-v-5ec51a41] .el-range-editor.is-focus{background-color:var(--wf-bg-white, #1f1f1f)}.search-card-body .search-action-row[data-v-5ec51a41]{display:flex;align-items:center;justify-content:space-between;margin-top:10px;padding-top:12px;border-top:1px solid var(--wf-border-lighter, #ebeef5)}html.dark .search-card-body .search-action-row[data-v-5ec51a41]{border-top-color:var(--wf-border-color, #333)}.search-card-body .search-action-left[data-v-5ec51a41]{display:flex;align-items:center;gap:10px}.search-card-body .btn-confirm-search[data-v-5ec51a41]{height:32px;padding:0 24px;font-size:13px;letter-spacing:1px}.btn-action[data-v-5ec51a41]{display:inline-flex;align-items:center;justify-content:center;height:32px;padding:0 16px;border:1.5px solid transparent;border-radius:var(--wf-radius, 8px);font-size:13px;font-weight:500;cursor:pointer;transition:all .25s ease;outline:none}.btn-action+.btn-action[data-v-5ec51a41]{margin-left:10px}.btn-action.btn-primary[data-v-5ec51a41]{color:#fff;background:linear-gradient(135deg,var(--wf-primary, #409eff),var(--wf-primary-dark, #2b7de9))}.btn-action.btn-primary[data-v-5ec51a41]:hover{transform:translateY(-1px);box-shadow:0 2px 8px #409eff59}.btn-action.btn-default[data-v-5ec51a41]{color:var(--wf-text-regular, #606266);background:var(--wf-bg-white, #fff);border-color:var(--wf-border-color, #dcdfe6)}.btn-action.btn-default[data-v-5ec51a41]:hover{border-color:var(--wf-primary, #409eff);color:var(--wf-primary, #409eff);background:var(--wf-primary-lighter, #f0f7ff)}html.dark .btn-action.btn-default[data-v-5ec51a41]{background:var(--wf-bg-color, #1a1a1a);border-color:var(--wf-border-color, #444)}.selected-inline-bar[data-v-5ec51a41]{display:flex;align-items:center;gap:8px;padding:10px 16px;background:linear-gradient(135deg,#67c23a0f,#529b2e08);border-bottom:1px solid rgba(103,194,58,.12);font-size:13px;color:#67c23a;flex-wrap:wrap}.selected-inline-bar .bar-icon[data-v-5ec51a41]{width:16px;height:16px;flex-shrink:0}.selected-inline-bar strong[data-v-5ec51a41]{font-weight:600;margin:0 2px}.selected-inline-bar .selected-mini-tags[data-v-5ec51a41]{display:inline-flex;align-items:center;gap:6px;margin-left:auto}.selected-inline-bar .selected-mini-tags .mini-tag[data-v-5ec51a41]{border-radius:12px;font-size:11px;background:linear-gradient(135deg,#67c23a1a,#67c23a0d);border-color:#67c23a40;color:#529b2e;transition:all .2s ease}.selected-inline-bar .selected-mini-tags .mini-tag[data-v-5ec51a41]:hover{background:linear-gradient(135deg,#67c23a2e,#67c23a1a);box-shadow:0 1px 6px #67c23a26}.selected-inline-bar .selected-mini-tags.selected-overflow[data-v-5ec51a41]{margin-left:auto}.selected-inline-bar .more-tag[data-v-5ec51a41]{cursor:pointer;border-style:dashed!important;font-size:11px!important;color:var(--wf-primary, #409eff)!important;border-color:var(--wf-primary, #409eff)!important;background:linear-gradient(135deg,#409eff14,#409eff0a)!important}.selected-inline-bar .more-tag[data-v-5ec51a41]:hover{background:linear-gradient(135deg,#409eff26,#409eff14)!important;box-shadow:0 1px 6px #409eff26!important}.selected-inline-bar .clear-all-btn[data-v-5ec51a41]{font-size:12px;padding:0 4px;flex-shrink:0}.selected-inline-bar .clear-all-btn[data-v-5ec51a41]:hover{color:#f56c6c!important}.selected-all-tooltip[data-v-5ec51a41]{max-width:260px;padding:10px 14px!important;border-radius:10px!important;border:1px solid rgba(103,194,58,.18)!important;box-shadow:0 4px 16px #0000001f!important}.selected-all-tooltip .tooltip-tag-list[data-v-5ec51a41]{max-height:200px;overflow-y:auto;display:flex;flex-direction:column;gap:5px}.selected-all-tooltip .tooltip-tag-list[data-v-5ec51a41]::-webkit-scrollbar{width:4px}.selected-all-tooltip .tooltip-tag-list[data-v-5ec51a41]::-webkit-scrollbar-thumb{background:#0000001f;border-radius:4px}.selected-all-tooltip .tooltip-item[data-v-5ec51a41]{padding:3px 8px;border-radius:6px;font-size:12px;color:#606266;background:#67c23a0f}.selected-all-tooltip .tooltip-item[data-v-5ec51a41]:nth-child(2n){background:#67c23a05}.table-card .el-table[data-v-5ec51a41]{--el-table-border-color: var(--wf-border-lighter, #ebeef5);--el-table-header-bg-color: var(--wf-bg-white, #fff)}.table-card .el-table th.el-table__cell[data-v-5ec51a41]{background:var(--wf-bg-white, #fff)!important;font-weight:600;font-size:13px;color:var(--wf-text-primary, #303133);padding:12px 0}html.dark .table-card .el-table th.el-table__cell[data-v-5ec51a41]{background:var(--wf-bg-color, #1a1a1a)!important;color:#c0c4cc}.table-card .el-table td.el-table__cell[data-v-5ec51a41]{font-size:13px;padding:10px 0}.table-card .el-table tr:hover>td.el-table__cell[data-v-5ec51a41]{background-color:var(--wf-primary-lighter, #f0f7ff)!important}html.dark .table-card .el-table tr:hover>td.el-table__cell[data-v-5ec51a41]{background-color:#409eff0d!important}.table-card .el-table .el-checkbox__inner[data-v-5ec51a41]{border-radius:4px;transition:all .2s ease}.table-card .el-table .el-table__empty-block[data-v-5ec51a41]{min-height:150px}.table-card .el-table .user-empty[data-v-5ec51a41]{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;color:var(--wf-text-secondary, #909399)}.table-card .el-table .user-empty .user-empty-icon[data-v-5ec51a41]{width:42px;height:42px;opacity:.3}.table-card .el-table .user-empty span[data-v-5ec51a41]{font-size:13px}.table-card[data-v-5ec51a41] .el-table--border,.table-card[data-v-5ec51a41] .el-table--group{border-radius:8px;overflow:hidden}.table-footer[data-v-5ec51a41]{display:flex;align-items:center;justify-content:space-between;padding:18px 16px 14px;margin-top:12px}.table-footer .el-pagination[data-v-5ec51a41]{justify-content:flex-start}.table-footer .el-pagination .el-pagination__rightwrapper[data-v-5ec51a41]{flex:none}.btn-confirm[data-v-5ec51a41]{display:inline-flex;align-items:center;justify-content:center;height:36px;padding:0 28px;border:none;border-radius:var(--wf-radius, 8px);font-size:14px;font-weight:600;color:#fff;background:linear-gradient(135deg,var(--wf-primary, #409eff),var(--wf-primary-dark, #2b7de9));cursor:pointer;transition:all .3s ease;box-shadow:0 2px 8px #409eff40;white-space:nowrap;letter-spacing:1px}.btn-confirm[data-v-5ec51a41]:hover{transform:translateY(-1px);box-shadow:0 4px 14px #409eff59}.btn-confirm[data-v-5ec51a41]:active{transform:translateY(0)}[data-v-5ec51a41]::deep(.el-pagination){--el-pagination-button-bg-color: transparent}html.dark[data-v-5ec51a41] ::deep(.el-pagination){--el-text-color-regular: #c0c4cc;--el-fill-color-blank: #141414;--el-border-color: #414243}::deep(.el-pagination) .btn-prev[data-v-5ec51a41],::deep(.el-pagination) .btn-next[data-v-5ec51a41]{border-radius:6px;border:1px solid var(--wf-border-color, #dcdfe6)}::deep(.el-pagination) .btn-prev[data-v-5ec51a41]:hover,::deep(.el-pagination) .btn-next[data-v-5ec51a41]:hover{color:var(--wf-primary, #409eff)}::deep(.el-pagination) .el-pager li[data-v-5ec51a41]{border-radius:6px;background:transparent!important;color:var(--wf-text-regular, #606266);min-width:28px;line-height:24px}::deep(.el-pagination) .el-pager li.is-active[data-v-5ec51a41]{background:var(--wf-primary, #409eff)!important;color:#fff!important}::deep(.el-pagination) .el-pager li[data-v-5ec51a41]:hover{color:var(--wf-primary, #409eff)}html.dark[data-v-5ec51a41] .el-pager li{background:#1a1a1a!important;color:#c0c4cc!important;border:1px solid #414243;min-width:28px}html.dark[data-v-5ec51a41] .el-pager li.is-active{background:var(--wf-primary, #409eff)!important;color:#fff!important;border-color:transparent}html.dark[data-v-5ec51a41] .el-pager li:hover{color:var(--wf-primary, #409eff)!important;background:#409eff14!important}.mobile-only[data-v-5ec51a41]{display:none!important}@media (max-width: 768px){.user-select-wrapper .search-toggle-row.mobile-only[data-v-5ec51a41],.user-select-wrapper .mobile-card-list.mobile-only[data-v-5ec51a41]{display:flex!important}.user-select-wrapper .btn-confirm-inline.mobile-only[data-v-5ec51a41]{display:inline-flex!important}.user-select-wrapper .content[data-v-5ec51a41]{margin-top:8px;gap:10px}.user-select-wrapper .search-toggle-row[data-v-5ec51a41]{display:flex;align-items:center;justify-content:space-between;padding:4px 0 8px;gap:10px}.user-select-wrapper .search-toggle-row .btn-confirm-inline[data-v-5ec51a41]{flex-shrink:0;height:36px;padding:0 20px;font-size:14px;letter-spacing:1px}.user-select-wrapper .search-toggle-btn[data-v-5ec51a41]{display:inline-flex;align-items:center;gap:5px;flex:1;min-width:0;padding:7px 12px;background:linear-gradient(135deg,#409eff0f,#409eff05);border:1px solid rgba(64,158,255,.18);border-radius:20px;color:var(--wf-primary, #409eff);font-size:13px;cursor:pointer;transition:all .25s ease}.user-select-wrapper .search-toggle-btn[data-v-5ec51a41]:hover{background:#409eff1f;border-color:#409eff59}.user-select-wrapper .search-toggle-btn.is-expanded[data-v-5ec51a41]{background:#67c23a0f;border-color:#67c23a38;color:#67c23a}.user-select-wrapper .search-toggle-btn .search-icon[data-v-5ec51a41]{width:16px;height:16px;opacity:.75;flex-shrink:0}.user-select-wrapper .search-toggle-btn .toggle-arrow-sm[data-v-5ec51a41]{width:16px;height:16px;transition:transform .3s ease;flex-shrink:0}.user-select-wrapper .search-toggle-btn .toggle-arrow-sm.is-rotated[data-v-5ec51a41]{transform:rotate(180deg)}.user-select-wrapper .tree-card[data-v-5ec51a41]{border-radius:10px;overflow:hidden;min-height:48px}.user-select-wrapper .tree-card.tree-collapsed[data-v-5ec51a41]{border-color:var(--wf-border-color, #e4e7ed);background:var(--wf-bg-white, #fff)}html.dark .user-select-wrapper .tree-card.tree-collapsed[data-v-5ec51a41]{background:#1a1a1a;border-color:#333}.user-select-wrapper .tree-card .tree-header[data-v-5ec51a41]{padding:10px 14px;font-size:14px}.user-select-wrapper .tree-card .tree-content[data-v-5ec51a41]{max-height:300px!important;overflow-y:auto;padding:0 10px 10px}.user-select-wrapper .tree-card .tree-content .tree-search[data-v-5ec51a41]{padding:0 0 6px}.user-select-wrapper .search-card[data-v-5ec51a41]{border-radius:10px;animation:searchSlideDown-5ec51a41 .25s ease-out}.user-select-wrapper .search-card-body[data-v-5ec51a41] .el-form{display:flex;flex-direction:column;gap:8px}.user-select-wrapper .search-card-body[data-v-5ec51a41] .el-form-item{margin-right:0;margin-bottom:0}.user-select-wrapper .search-card-body[data-v-5ec51a41] .el-form-item .el-input,.user-select-wrapper .search-card-body[data-v-5ec51a41] .el-form-item .el-date-editor{width:100%!important}.user-select-wrapper .search-card-body[data-v-5ec51a41] .el-form-item:last-child{display:flex;gap:8px}.user-select-wrapper .search-card-body[data-v-5ec51a41] .el-form-item:last-child .btn-action{flex:1;text-align:center;justify-content:center}.user-select-wrapper .selected-inline-bar[data-v-5ec51a41]{flex-wrap:wrap;gap:6px;font-size:13px;padding:10px 12px;border-radius:10px}.user-select-wrapper .pc-only[data-v-5ec51a41]{display:none!important}.user-select-wrapper .mobile-card-list[data-v-5ec51a41]{display:flex;flex-direction:column;gap:8px;min-height:156px;max-height:60vh;overflow-y:auto;padding:2px 2px 6px;-webkit-overflow-scrolling:touch}.user-select-wrapper .mobile-card-list[data-v-5ec51a41]::-webkit-scrollbar{width:3px}.user-select-wrapper .mobile-card-list[data-v-5ec51a41]::-webkit-scrollbar-thumb{background:#0000001f;border-radius:4px}.user-select-wrapper .mobile-card-item[data-v-5ec51a41]{display:flex;align-items:flex-start;justify-content:space-between;padding:11px 14px;background:var(--wf-bg-white, #fff);border:1.5px solid var(--wf-border-lighter, #ebeef5);border-radius:12px;cursor:pointer;transition:all .2s ease;-webkit-tap-highlight-color:transparent}html.dark .user-select-wrapper .mobile-card-item[data-v-5ec51a41]{background:#1a1a1a;border-color:#333}.user-select-wrapper .mobile-card-item[data-v-5ec51a41]:active{transform:scale(.98)}.user-select-wrapper .mobile-card-item.is-checked[data-v-5ec51a41]{border-color:#67c23a;background:linear-gradient(135deg,#67c23a0d,#67c23a05)}html.dark .user-select-wrapper .mobile-card-item.is-checked[data-v-5ec51a41]{background:#67c23a14;border-color:#67c23a80}.user-select-wrapper .card-left[data-v-5ec51a41]{display:flex;align-items:flex-start;gap:10px;flex:1 1 auto;min-width:0}.user-select-wrapper .card-info[data-v-5ec51a41]{display:flex;flex-direction:column;gap:4px;min-width:0;overflow:hidden}.user-select-wrapper .card-name-row[data-v-5ec51a41]{display:flex;align-items:center;justify-content:space-between;gap:8px;width:100%}.user-select-wrapper .card-name[data-v-5ec51a41]{font-size:15px;font-weight:600;color:var(--wf-text-primary, #303133);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:1.3;width:9em;flex-shrink:0}html.dark .user-select-wrapper .card-name[data-v-5ec51a41]{color:#e4e7ed}.user-select-wrapper .card-time[data-v-5ec51a41]{font-size:11px;color:var(--wf-text-placeholder, #c0c4cc);flex-shrink:0;white-space:nowrap;width:152px;text-align:right;overflow:hidden;text-overflow:ellipsis}html.dark .user-select-wrapper .card-time[data-v-5ec51a41]{color:#82848a}.user-select-wrapper .card-sub[data-v-5ec51a41]{display:flex;align-items:center;justify-content:space-between;gap:10px;width:100%}.user-select-wrapper .card-code[data-v-5ec51a41]{font-size:12px;color:var(--wf-text-secondary, #909399);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:9em;flex-shrink:0}.user-select-wrapper .card-group[data-v-5ec51a41]{font-size:11px;color:var(--wf-text-placeholder, #c0c4cc);background:#00000008;padding:1px 8px;border-radius:10px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex-shrink:0;width:80px;text-align:right;box-sizing:border-box}html.dark .user-select-wrapper .card-group[data-v-5ec51a41]{background:#ffffff0f}.user-select-wrapper .card-check-icon[data-v-5ec51a41]{flex-shrink:0;width:22px;height:22px;display:flex;align-items:center;justify-content:center;margin-top:2px}.user-select-wrapper .card-check-icon svg[data-v-5ec51a41]{width:100%;height:100%}.user-select-wrapper .mobile-load-more[data-v-5ec51a41]{display:flex;justify-content:center;padding:10px 0 4px}.user-select-wrapper .mobile-load-more .load-text[data-v-5ec51a41]{font-size:11px;color:var(--wf-text-placeholder, #c0c4cc)}.user-select-wrapper .mobile-load-more .load-text.load-end[data-v-5ec51a41]{opacity:.6}html.dark .user-select-wrapper .mobile-load-more .load-text[data-v-5ec51a41]{color:#6a6c72}.user-select-wrapper .mobile-empty[data-v-5ec51a41]{text-align:center;padding:36px 16px;color:var(--wf-text-placeholder, #c0c4cc);font-size:13px}}@keyframes searchSlideDown-5ec51a41{0%{opacity:0;transform:translateY(-6px);max-height:0}to{opacity:1;transform:translateY(0);max-height:400px}}html.dark .el-pagination--small .el-pager li,html.dark .el-pager li.number{background:#1a1a1a!important;color:#c0c4cc!important;border:1px solid #414243;min-width:28px;line-height:24px}html.dark .el-pagination--small .el-pager li.is-active,html.dark .el-pager li.is-active{background:var(--wf-primary, #409eff)!important;color:#fff!important;border-color:transparent!important}html.dark .el-pagination--small .el-pager li:hover,html.dark .el-pager li.number:hover:not(.is-active){color:var(--wf-primary, #409eff)!important;background:#409eff14!important}html.dark .el-tree{background-color:transparent!important}html.dark .el-tree-node__content{color:#c0c4cc!important}html.dark .el-tree-node__content:hover,html.dark .el-tree-node.is-current>.el-tree-node__content{background-color:#409eff1f!important}html.dark .el-pagination .btn-prev,html.dark .el-pagination .btn-next{background-color:transparent!important;border-color:#414243!important;color:#c0c4cc!important}html.dark .el-pagination .btn-prev:hover,html.dark .el-pagination .btn-next:hover{color:var(--wf-primary, #409eff)!important}.nodeExtForm[data-v-4c38c55d]{padding:8px 16px}html.dark .nodeExtForm[data-v-4c38c55d]{background:var(--wf-bg-color, #141414);border-radius:var(--wf-radius-lg, 12px)}.nodeExtForm[data-v-4c38c55d] .el-form-item{margin-bottom:20px;padding-bottom:16px;border-bottom:1px solid var(--wf-border-lighter, #ebeef5);transition:var(--wf-transition, all .3s ease)}.nodeExtForm[data-v-4c38c55d] .el-form-item:last-child{border-bottom:none;margin-bottom:0;padding-bottom:0}.nodeExtForm[data-v-4c38c55d] .el-form-item__label{font-weight:600;color:var(--wf-text-primary, #303133);letter-spacing:.3px;padding-right:8px;width:132px!important;min-width:132px!important;max-width:132px!important;white-space:nowrap}.nodeExtForm[data-v-4c38c55d] .el-input__wrapper,.nodeExtForm[data-v-4c38c55d] .el-textarea__inner{border-radius:var(--wf-radius, 8px);transition:all .3s ease}html.dark .nodeExtForm .nodeExtForm[data-v-4c38c55d] .el-input__wrapper.is-disabled,html.dark .nodeExtForm .nodeExtForm[data-v-4c38c55d] .el-textarea__inner.is-disabled{background-color:#2a2d35!important;box-shadow:none!important;border-color:#3a3e48!important}.nodeExtForm[data-v-4c38c55d] .el-input__wrapper:hover,.nodeExtForm[data-v-4c38c55d] .el-textarea__inner:hover{box-shadow:0 0 0 1px var(--wf-primary, #409eff) inset}.nodeExtForm[data-v-4c38c55d] .el-input.is-focus .el-input__wrapper,.nodeExtForm[data-v-4c38c55d] .el-textarea__inner:focus{box-shadow:0 0 0 1px var(--wf-primary, #409eff) inset,0 0 0 3px #409eff1a}.nodeExtForm[data-v-4c38c55d] .el-textarea__inner{min-height:80px!important}.nodeExtForm[data-v-4c38c55d] .el-select{width:100%!important}.nodeExtForm[data-v-4c38c55d] .el-select .el-select__tags .el-tag{border-radius:var(--wf-radius-round, 20px);background:var(--wf-primary-light, #ecf5ff);border-color:transparent;color:var(--wf-primary, #409eff)}.nodeExtForm[data-v-4c38c55d] .el-radio-group,.nodeExtForm[data-v-4c38c55d] .el-checkbox-group{width:100%}.nodeExtForm[data-v-4c38c55d] .el-radio-group .el-row,.nodeExtForm[data-v-4c38c55d] .el-checkbox-group .el-row{display:flex;flex-wrap:wrap;gap:8px;margin-left:0!important;margin-right:0!important}.nodeExtForm[data-v-4c38c55d] .el-radio-group .el-col,.nodeExtForm[data-v-4c38c55d] .el-checkbox-group .el-col{flex:0 0 auto;min-width:120px;max-width:100%;padding-left:0!important;padding-right:0!important}.nodeExtForm[data-v-4c38c55d] .el-radio{display:flex;align-items:center;border:1.5px solid var(--wf-border-color, #dcdfe6);border-radius:var(--wf-radius, 8px);padding:8px 16px;margin-right:0;background:var(--wf-bg-white, #ffffff);transition:all .3s ease;height:auto;width:100%;box-sizing:border-box}.nodeExtForm[data-v-4c38c55d] .el-radio:hover{border-color:var(--wf-primary, #409eff);box-shadow:var(--wf-shadow-sm, 0 1px 4px rgba(0, 0, 0, .04))}.nodeExtForm[data-v-4c38c55d] .el-radio.is-checked{border-color:var(--wf-primary, #409eff);background:var(--wf-primary-light, #ecf5ff);box-shadow:var(--wf-shadow-primary, 0 2px 8px rgba(64, 158, 255, .3))}.nodeExtForm[data-v-4c38c55d] .el-radio.is-checked .el-radio__label{color:var(--wf-primary, #409eff)}.nodeExtForm[data-v-4c38c55d] .el-checkbox{display:flex;align-items:center;border:1.5px solid var(--wf-border-color, #dcdfe6);border-radius:var(--wf-radius, 8px);padding:8px 16px;margin-right:0;background:var(--wf-bg-white, #ffffff);transition:all .3s ease;height:auto;width:100%;box-sizing:border-box}.nodeExtForm[data-v-4c38c55d] .el-checkbox:hover{border-color:var(--wf-primary, #409eff);box-shadow:var(--wf-shadow-sm, 0 1px 4px rgba(0, 0, 0, .04))}.nodeExtForm[data-v-4c38c55d] .el-checkbox.is-checked{border-color:var(--wf-primary, #409eff);background:var(--wf-primary-light, #ecf5ff);box-shadow:var(--wf-shadow-primary, 0 2px 8px rgba(64, 158, 255, .3))}.nodeExtForm[data-v-4c38c55d] .el-checkbox.is-checked .el-checkbox__label{color:var(--wf-primary, #409eff)}.nodeExtForm[data-v-4c38c55d] .el-tag{border-radius:var(--wf-radius-round, 20px);background:var(--wf-primary-light, #ecf5ff);color:var(--wf-primary, #409eff);border:none;padding:4px 12px;margin-right:8px!important;margin-bottom:8px!important;box-shadow:0 1px 3px #409eff26;transition:all .3s ease;font-weight:500}.nodeExtForm[data-v-4c38c55d] .el-tag .el-tag__content{color:var(--wf-primary, #409eff)}.nodeExtForm[data-v-4c38c55d] .el-tag .el-tag__close,.nodeExtForm[data-v-4c38c55d] .el-tag .el-icon.el-tag__close{border-radius:50%;background:#409eff26;color:var(--wf-primary, #409eff);transition:all .25s ease}.nodeExtForm[data-v-4c38c55d] .el-tag .el-tag__close:hover,.nodeExtForm[data-v-4c38c55d] .el-tag .el-icon.el-tag__close:hover{background:#f56c6c;color:#fff}.nodeExtForm[data-v-4c38c55d] .el-button--primary{border-radius:var(--wf-radius, 8px);background:linear-gradient(135deg,var(--wf-primary, #409eff),var(--wf-primary-dark, #2b7de9));border:none;box-shadow:var(--wf-shadow-sm, 0 1px 4px rgba(0, 0, 0, .04));transition:all .3s ease;font-weight:500}.nodeExtForm[data-v-4c38c55d] .el-button--primary:hover{transform:translateY(-1px);box-shadow:var(--wf-shadow-primary, 0 2px 8px rgba(64, 158, 255, .3))}.nodeExtForm[data-v-4c38c55d] .el-button--primary:active{transform:translateY(0)}.nodeExtForm[data-v-4c38c55d] .el-input-number{width:100%!important;margin-right:0!important;margin-bottom:0!important}.nodeExtForm[data-v-4c38c55d] .el-input-number .el-input-number__decrease,.nodeExtForm[data-v-4c38c55d] .el-input-number .el-input-number__increase{border-radius:var(--wf-radius-sm, 4px)}.nodeExtForm[data-v-4c38c55d] .el-date-editor,.nodeExtForm[data-v-4c38c55d] .el-time-picker{width:100%}.nodeExtForm[data-v-4c38c55d] .el-date-editor .el-input__wrapper{border-radius:var(--wf-radius, 8px)}.nodeExtForm[data-v-4c38c55d] .el-date-editor .el-input__prefix .el-icon,.nodeExtForm[data-v-4c38c55d] .el-time-picker .el-input__prefix .el-icon{color:var(--wf-primary, #409eff)}.nodeExtForm[data-v-4c38c55d] .el-form-item__label .el-icon{color:var(--wf-text-secondary, #909399);cursor:help;transition:color .25s ease;vertical-align:middle}.nodeExtForm[data-v-4c38c55d] .el-form-item__label .el-icon:hover{color:var(--wf-primary, #409eff)}::global(html.dark) .nodeExtForm[data-v-4c38c55d] .el-input__wrapper,::global(html.dark) .nodeExtForm[data-v-4c38c55d] .el-textarea__inner{background:var(--wf-bg-white)}::global(html.dark) .nodeExtForm[data-v-4c38c55d] .el-radio,::global(html.dark) .nodeExtForm[data-v-4c38c55d] .el-checkbox{background:var(--wf-bg-white);border-color:var(--wf-border-color)}::global(html.dark) .nodeExtForm[data-v-4c38c55d] .el-radio.is-checked,::global(html.dark) .nodeExtForm[data-v-4c38c55d] .el-checkbox.is-checked{background:var(--wf-primary-light);border-color:var(--wf-primary);box-shadow:0 0 8px #409eff40}::global(html.dark) .nodeExtForm[data-v-4c38c55d] .el-tag{background:var(--wf-primary-light);box-shadow:0 1px 3px #0000004d}::global(html.dark) .nodeExtForm[data-v-4c38c55d] .el-select .el-select__tags .el-tag{background:var(--wf-primary-light)}html.dark .nodeExtForm[data-v-4c38c55d] .el-input-number__decrease,html.dark .nodeExtForm[data-v-4c38c55d] .el-input-number__increase{background-color:var(--wf-bg-white, #1f1f1f);color:var(--wf-text-primary, #e0e0e0);border-left-color:var(--wf-border-color, #333333)}html.dark .nodeExtForm[data-v-4c38c55d] .el-input-number__decrease:hover,html.dark .nodeExtForm[data-v-4c38c55d] .el-input-number__increase:hover{background-color:var(--wf-primary-light, rgba(64, 158, 255, .15));color:var(--wf-primary, #409eff)}html.dark .nodeExtForm[data-v-4c38c55d] .el-input-number__decrease.is-disabled,html.dark .nodeExtForm[data-v-4c38c55d] .el-input-number__increase.is-disabled{background-color:var(--wf-bg-white, #1f1f1f);color:var(--wf-text-placeholder, #666)}[data-v-4c38c55d]::deep(.el-dialog__header){background:linear-gradient(135deg,var(--wf-primary-light, #ecf5ff),var(--wf-primary-lighter, #f0f7ff));border-bottom:1px solid var(--wf-border-lighter, #ebeef5);padding:16px 20px;border-radius:var(--wf-radius-lg, 12px) var(--wf-radius-lg, 12px) 0 0}[data-v-4c38c55d]::deep(.el-dialog__title){font-weight:600;color:var(--wf-primary, #409eff);letter-spacing:.5px}[data-v-4c38c55d]::deep(.el-dialog__body){padding:16px 20px}[data-v-4c38c55d]::global(html.dark) .el-dialog__header{background:linear-gradient(135deg,var(--wf-primary-light),#1a2744)}@media (max-width: 768px){.nodeExtForm[data-v-4c38c55d]{padding:6px 10px!important}.nodeExtForm[data-v-4c38c55d] .el-form-item{margin-bottom:14px;padding-bottom:12px}.nodeExtForm[data-v-4c38c55d] .el-form-item__label{min-width:100px!important;max-width:120px!important;font-size:12px!important;word-break:break-word!important;white-space:normal!important}.nodeExtForm[data-v-4c38c55d] .el-select,.nodeExtForm[data-v-4c38c55d] .el-input-number{width:100%!important}.nodeExtForm[data-v-4c38c55d] .el-radio-group .el-col,.nodeExtForm[data-v-4c38c55d] .el-checkbox-group .el-col{flex:0 0 auto;min-width:unset;max-width:none}.nodeExtForm[data-v-4c38c55d] .el-tag{font-size:11px;padding:2px 8px}.nodeExtForm[data-v-4c38c55d] .el-dialog{width:95%!important;margin:10px auto!important}}@media (max-width: 480px){.nodeExtForm[data-v-4c38c55d] .el-form-item__label{min-width:90px!important;font-size:11px!important;white-space:normal!important}.nodeExtForm[data-v-4c38c55d] .el-radio,.nodeExtForm[data-v-4c38c55d] .el-checkbox{padding:6px 10px;font-size:12px}}.between[data-v-24c5e0f1]{width:100%}html.dark .between[data-v-24c5e0f1]{background:var(--wf-bg-color, #141414);border-radius:var(--wf-radius-lg, 12px)}.betweenForm[data-v-24c5e0f1]{border-top:0;width:100%}.modern-tabs-wrapper[data-v-24c5e0f1]{position:relative;background:transparent;border-radius:0;padding:0;margin-bottom:4px;border-bottom:1px solid var(--wf-border-lighter, #ebeef5)}html.dark .modern-tabs-wrapper[data-v-24c5e0f1]{background:transparent;border-bottom-color:var(--wf-border-color, #333333)}.modern-tabs[data-v-24c5e0f1]{display:flex;align-items:center;gap:24px;overflow-x:auto}.modern-tabs[data-v-24c5e0f1]::-webkit-scrollbar{height:0;display:none}.modern-tab-item[data-v-24c5e0f1]{position:relative;display:inline-flex;align-items:center;gap:6px;padding:10px 2px;cursor:pointer;border-radius:0;font-size:14px;font-weight:500;color:var(--wf-text-regular, #606266);transition:color .2s ease;-webkit-user-select:none;user-select:none;white-space:nowrap;flex-shrink:0;border:none}.modern-tab-item[data-v-24c5e0f1]:after{content:"";position:absolute;left:0;right:0;bottom:-1px;height:2px;background:var(--wf-primary, #409eff);border-radius:2px;transform:scaleX(0);transition:transform .25s cubic-bezier(.4,0,.2,1)}.modern-tab-item[data-v-24c5e0f1]:hover{color:var(--wf-primary, #409eff)}.modern-tab-item.is-active[data-v-24c5e0f1]{color:var(--wf-primary, #409eff);font-weight:600}.modern-tab-item.is-active[data-v-24c5e0f1]:after{transform:scaleX(1)}.modern-tab-item.is-active.is-ext-tab[data-v-24c5e0f1]{color:#67c23a}.modern-tab-item.is-active.is-ext-tab[data-v-24c5e0f1]:after{background:#67c23a}.modern-tab-item.is-active.is-ext-tab .tab-label[data-v-24c5e0f1]{color:#67c23a}.modern-tab-item.is-ext-tab[data-v-24c5e0f1]{color:var(--wf-success, #529b2e)}html.dark .modern-tab-item.is-ext-tab[data-v-24c5e0f1]{color:#85ce61}.modern-tab-item.is-ext-tab[data-v-24c5e0f1]:hover{color:#3d8b2a}html.dark .modern-tab-item.is-ext-tab[data-v-24c5e0f1]:hover{color:#fff}.modern-tab-item.is-ext-tab .tab-ext-tag[data-v-24c5e0f1]{font-size:10px;padding:1px 6px;margin-left:6px;background:#67c23a1f;color:var(--wf-success, #67c23a);border-radius:4px;font-weight:600;line-height:1.4;vertical-align:middle}html.dark .modern-tab-item.is-ext-tab .tab-ext-tag[data-v-24c5e0f1]{background:#67c23a2e;color:#85ce61}.modern-tab-item .tab-icon[data-v-24c5e0f1]{width:16px;height:16px;flex-shrink:0;display:inline-flex}.modern-tab-item .tab-label[data-v-24c5e0f1]{position:relative;z-index:1}.tabPane[data-v-24c5e0f1]{padding:16px 2px 8px;border:none;background:transparent;animation:fadeIn-24c5e0f1 .2s ease}.tabPane-full[data-v-24c5e0f1]{padding:16px 2px 8px}@keyframes fadeIn-24c5e0f1{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.base-settings-section[data-v-24c5e0f1]{border:none;background:transparent;box-shadow:none;border-radius:0;overflow:visible;margin-bottom:4px}html.dark .base-settings-section[data-v-24c5e0f1]{border:none;background:transparent}.base-settings-header[data-v-24c5e0f1]{display:flex;align-items:center;gap:8px;padding:0 0 12px;margin-bottom:20px;background:transparent;border-bottom:1px solid var(--wf-border-lighter, #ebeef5)}html.dark .base-settings-header[data-v-24c5e0f1]{background:transparent;border-bottom-color:var(--wf-border-color, #333333)}.ext-icon-base[data-v-24c5e0f1]{color:var(--wf-text-regular, #606266)}.ext-icon-base svg[data-v-24c5e0f1]{width:16px;height:16px}.base-settings-title[data-v-24c5e0f1]{font-size:15px;font-weight:600;color:var(--wf-text-primary, #303133);letter-spacing:.3px}.base-settings-content[data-v-24c5e0f1]{padding:0;background:transparent}html.dark .base-settings-content[data-v-24c5e0f1]{background:transparent}.section-card[data-v-24c5e0f1]{border:none;background:transparent;box-shadow:none;border-radius:0;overflow:visible;margin-bottom:4px}html.dark .section-card[data-v-24c5e0f1]{border:none;background:transparent}.section-card[data-v-24c5e0f1]:hover{box-shadow:none}.section-card-header[data-v-24c5e0f1]{display:flex;align-items:center;gap:8px;padding:0 0 12px;margin-bottom:20px;background:transparent;border-bottom:1px solid var(--wf-border-lighter, #ebeef5)}html.dark .section-card-header[data-v-24c5e0f1]{background:transparent;border-bottom-color:var(--wf-border-color, #333333)}.section-card-icon[data-v-24c5e0f1]{width:20px;height:20px;display:flex;align-items:center;justify-content:center}.section-card-icon svg[data-v-24c5e0f1]{width:16px;height:16px}.section-card-title[data-v-24c5e0f1]{font-size:15px;font-weight:600;color:var(--wf-text-primary, #303133);letter-spacing:.3px}.section-card-body[data-v-24c5e0f1]{padding:0;background:transparent}html.dark .section-card-body[data-v-24c5e0f1]{background:transparent}.action-buttons[data-v-24c5e0f1]{display:flex;gap:8px;margin-top:12px}[data-v-24c5e0f1] .el-table .el-form-item{margin-bottom:0}[data-v-24c5e0f1] .el-table .el-form-item .el-form-item__label{display:none!important;width:0!important;min-width:0!important;padding-right:0!important;overflow:hidden!important;visibility:hidden!important;height:0!important}[data-v-24c5e0f1] .el-table .el-form-item .el-form-item__content{display:block!important;margin-left:0!important}@media (max-width: 1024px) and (min-width: 769px){.modern-tabs-wrapper[data-v-24c5e0f1]{padding:4px}.modern-tab-item[data-v-24c5e0f1]{padding:7px 12px;font-size:12px}.base-settings-header[data-v-24c5e0f1],.base-settings-content[data-v-24c5e0f1]{padding:10px 12px}.base-settings-title[data-v-24c5e0f1]{font-size:12px}.section-card-header[data-v-24c5e0f1],.section-card-body[data-v-24c5e0f1]{padding:10px 12px}.section-card-title[data-v-24c5e0f1]{font-size:12px}.tabPane[data-v-24c5e0f1],.tabPane-full[data-v-24c5e0f1]{padding:12px 2px 6px}}@media (max-width: 768px){.modern-tabs-wrapper[data-v-24c5e0f1]{padding:4px;border-radius:var(--wf-radius, 8px)}.modern-tabs[data-v-24c5e0f1]{gap:3px;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none}.modern-tabs[data-v-24c5e0f1]::-webkit-scrollbar{display:none}.modern-tab-item[data-v-24c5e0f1]{padding:6px 10px;font-size:12px;border-radius:var(--wf-radius-sm, 6px)}.base-settings-section[data-v-24c5e0f1]{border-radius:var(--wf-radius, 8px)}.base-settings-header[data-v-24c5e0f1]{padding:8px 10px;gap:6px}.ext-icon-base svg[data-v-24c5e0f1]{width:14px;height:14px}.base-settings-title[data-v-24c5e0f1]{font-size:12px}.base-settings-content[data-v-24c5e0f1]{padding:10px}.section-card[data-v-24c5e0f1]{border-radius:var(--wf-radius, 8px)}.section-card-header[data-v-24c5e0f1]{padding:8px 10px;gap:6px}.section-card-icon svg[data-v-24c5e0f1]{width:14px;height:14px}.section-card-title[data-v-24c5e0f1]{font-size:12px}.section-card-body[data-v-24c5e0f1]{padding:10px}.action-buttons[data-v-24c5e0f1]{flex-direction:column;gap:6px;margin-top:8px}.tabPane[data-v-24c5e0f1],.tabPane-full[data-v-24c5e0f1]{padding:10px 2px 4px}[data-v-24c5e0f1] .el-form-item__label{width:auto!important;min-width:95px!important;max-width:115px!important;padding-right:6px!important;font-size:12px!important;line-height:1.4!important;word-break:break-word!important}[data-v-24c5e0f1] .el-table{font-size:12px}[data-v-24c5e0f1] .el-table:before{background-color:transparent}[data-v-24c5e0f1] .el-table .el-table__header-wrapper,[data-v-24c5e0f1] .el-table .el-table__body-wrapper{overflow-x:auto;-webkit-overflow-scrolling:touch}[data-v-24c5e0f1] .el-table th,[data-v-24c5e0f1] .el-table td{padding:6px 4px}[data-v-24c5e0f1] .el-table-column--selection .cell,[data-v-24c5e0f1] .el-table .cell{min-width:60px}[data-v-24c5e0f1] .el-input,[data-v-24c5e0f1] .el-select,[data-v-24c5e0f1] .el-textarea{--el-input-height: 32px}[data-v-24c5e0f1] .el-input__inner,[data-v-24c5e0f1] .el-textarea__inner{font-size:12px}[data-v-24c5e0f1] .el-button--small{padding:5px 8px;font-size:12px}.ext-attributes-header[data-v-24c5e0f1]{padding:8px 10px;gap:6px}.ext-attributes-title[data-v-24c5e0f1]{font-size:12px}.ext-attributes-content[data-v-24c5e0f1]{padding:10px}.ext-attributes-icon svg[data-v-24c5e0f1]{width:14px;height:14px}}@media (max-width: 480px){.modern-tab-item[data-v-24c5e0f1]{padding:5px 8px;font-size:11px}.base-settings-header[data-v-24c5e0f1],.section-card-header[data-v-24c5e0f1],.ext-attributes-header[data-v-24c5e0f1]{padding:6px 8px}.base-settings-content[data-v-24c5e0f1],.section-card-body[data-v-24c5e0f1],.ext-attributes-content[data-v-24c5e0f1]{padding:8px}[data-v-24c5e0f1] .el-form-item__label{min-width:80px!important;font-size:11px!important}[data-v-24c5e0f1] .el-input__inner,[data-v-24c5e0f1] .el-textarea__inner{font-size:11px}}@media (max-width: 768px){.radio-card-group[data-v-24c5e0f1]{gap:6px;flex-wrap:nowrap;overflow-x:auto}.radio-card-group[data-v-24c5e0f1]::-webkit-scrollbar{display:none}.radio-card-item[data-v-24c5e0f1]{padding:6px 12px;font-size:12px;white-space:nowrap;flex-shrink:0}.betweenForm[data-v-24c5e0f1] .el-form-item__label{min-width:95px!important;max-width:115px!important;font-size:12px!important;white-space:normal!important;word-break:break-word!important}.betweenForm[data-v-24c5e0f1] .el-form-item .el-form-item__content{display:flex!important;flex-wrap:wrap!important;gap:6px}.betweenForm[data-v-24c5e0f1] .el-form-item .el-select,.betweenForm[data-v-24c5e0f1] .el-form-item .el-input{width:100%!important;margin-left:0!important;min-width:100%}.ext-attributes-section[data-v-24c5e0f1]{margin-top:8px}.handler-table-mobile[data-v-24c5e0f1] .el-table{table-layout:fixed!important;width:100%!important;overflow:hidden}.handler-table-mobile[data-v-24c5e0f1] .el-table__header-wrapper,.handler-table-mobile[data-v-24c5e0f1] .el-table__body-wrapper{overflow:hidden!important}.handler-table-mobile[data-v-24c5e0f1] .el-table__header-wrapper th:nth-child(1){width:calc(50% - 26px)!important;min-width:0!important}.handler-table-mobile[data-v-24c5e0f1] .el-table__header-wrapper th:nth-child(1) .cell{width:100%}.handler-table-mobile[data-v-24c5e0f1] .el-table__header-wrapper th:nth-child(2){width:calc(50% - 26px)!important;min-width:0!important}.handler-table-mobile[data-v-24c5e0f1] .el-table__header-wrapper th:nth-child(2) .cell{width:100%}.handler-table-mobile[data-v-24c5e0f1] .el-table__header-wrapper th:nth-child(3){width:52px!important;min-width:0!important;max-width:none!important}.handler-table-mobile[data-v-24c5e0f1] .el-table__header-wrapper th:nth-child(3) .cell{width:100%;text-align:center;justify-content:center}.handler-table-mobile[data-v-24c5e0f1] .el-table__body-wrapper td:nth-child(1){width:calc(50% - 26px)!important;min-width:0!important}.handler-table-mobile[data-v-24c5e0f1] .el-table__body-wrapper td:nth-child(1) .cell{width:100%}.handler-table-mobile[data-v-24c5e0f1] .el-table__body-wrapper td:nth-child(2){width:calc(50% - 26px)!important;min-width:0!important}.handler-table-mobile[data-v-24c5e0f1] .el-table__body-wrapper td:nth-child(2) .cell{width:100%}.handler-table-mobile[data-v-24c5e0f1] .el-table__body-wrapper td:nth-child(3){width:52px!important;min-width:0!important;max-width:none!important}.handler-table-mobile[data-v-24c5e0f1] .el-table__body-wrapper td:nth-child(3) .cell{width:100%;display:flex;justify-content:center;align-items:center;padding-left:4px;padding-right:4px;box-sizing:border-box}.handler-table-mobile[data-v-24c5e0f1]:not(.is-mobile) .el-table{table-layout:auto!important}.handler-table-mobile[data-v-24c5e0f1]:not(.is-mobile) .el-table__header-wrapper,.handler-table-mobile[data-v-24c5e0f1]:not(.is-mobile) .el-table__body-wrapper{overflow-x:hidden!important}.handler-table-mobile[data-v-24c5e0f1]:not(.is-mobile) .el-table__header-wrapper th:nth-child(3),.handler-table-mobile[data-v-24c5e0f1]:not(.is-mobile) .el-table__header-wrapper td:nth-child(3),.handler-table-mobile[data-v-24c5e0f1]:not(.is-mobile) .el-table__body-wrapper th:nth-child(3),.handler-table-mobile[data-v-24c5e0f1]:not(.is-mobile) .el-table__body-wrapper td:nth-child(3){width:42px!important;min-width:42px!important;max-width:42px!important}.handler-table-mobile[data-v-24c5e0f1]:not(.is-mobile) .el-table__header-wrapper th:nth-child(3) .cell,.handler-table-mobile[data-v-24c5e0f1]:not(.is-mobile) .el-table__body-wrapper th:nth-child(3) .cell{text-align:center;justify-content:center}.handler-table-mobile[data-v-24c5e0f1]:not(.is-mobile) .el-table__header-wrapper td:nth-child(3) .cell,.handler-table-mobile[data-v-24c5e0f1]:not(.is-mobile) .el-table__body-wrapper td:nth-child(3) .cell{display:flex;justify-content:center;align-items:center;padding-left:4px;padding-right:4px;box-sizing:border-box}.action-buttons[data-v-24c5e0f1]{margin-top:10px}.mobile-user-dialog{width:96%!important;max-width:100vw!important;margin:0 auto!important}.mobile-user-dialog{padding:14px 16px}.mobile-user-dialog{font-size:16px}.mobile-user-dialog{top:12px;right:10px}.mobile-user-dialog{padding:12px;max-height:calc(100vh - 56px);overflow-y:auto}}@media (max-width: 480px){.betweenForm[data-v-24c5e0f1] .el-form-item__label{min-width:80px!important;font-size:11px!important;white-space:normal!important}.radio-card-text[data-v-24c5e0f1]{font-size:12px}.radio-card-tip[data-v-24c5e0f1]{display:none}}.placeholder[data-v-24c5e0f1]{color:#828f9e;font-size:12px}.mt5[data-v-24c5e0f1]{margin-top:5px}.mr5[data-v-24c5e0f1]{margin-right:5px}.ml5[data-v-24c5e0f1]{margin-left:5px}.flex-hc[data-v-24c5e0f1]{display:flex;align-items:center}.action-buttons[data-v-24c5e0f1]{margin-top:12px}.add-row-btn[data-v-24c5e0f1]{width:100%;border:1.5px dashed var(--wf-primary, #409eff)!important;color:var(--wf-primary, #409eff)!important;background:transparent!important;border-radius:10px;transition:all .3s ease;height:40px;letter-spacing:2px;font-weight:500;display:flex;align-items:center;justify-content:center}.add-row-btn[data-v-24c5e0f1]:hover{background:var(--wf-primary-light, #ecf5ff)!important;border-style:solid!important;border-color:var(--wf-primary, #409eff)!important;box-shadow:var(--wf-shadow-primary, 0 2px 8px rgba(64, 158, 255, .3))}.add-row-btn.add-row-btn-secondary[data-v-24c5e0f1]{border-color:var(--wf-text-secondary, #909399)!important;color:var(--wf-text-secondary, #909399)!important}.add-row-btn.add-row-btn-secondary[data-v-24c5e0f1]:hover{border-color:var(--wf-primary, #409eff)!important;color:var(--wf-primary, #409eff)!important;background:var(--wf-primary-light, #ecf5ff)!important;border-style:solid!important;box-shadow:var(--wf-shadow-primary, 0 2px 8px rgba(64, 158, 255, .3))}.person-select-dialog{border-radius:16px;overflow:hidden;box-shadow:0 16px 56px #0000002e;background-color:var(--el-dialog-bg-color, #fff)}.person-select-dialog .el-dialog__header{position:relative;margin:0;padding:18px 24px;background-color:var(--el-dialog-bg-color, #fff);border-bottom:1px solid var(--wf-border-lighter, #ebeef5)}.person-select-dialog .el-dialog__title{font-weight:600;font-size:16px;color:var(--wf-text-primary, #303133)}.person-select-dialog .el-dialog__headerbtn{top:50%;right:16px;width:32px;height:32px;margin:0;transform:translateY(-50%)}.person-select-dialog .el-dialog__body{padding:20px 24px;background-color:var(--el-dialog-bg-color, #fff)}.person-select-dialog .el-table th.el-table__cell,.person-select-dialog .el-table__header-wrapper th{background-color:var(--el-dialog-bg-color, #fff)!important}html.dark .person-select-dialog,html.dark .person-select-dialog .el-dialog__header,html.dark .person-select-dialog .el-dialog__body{background:var(--wf-bg-color, #1f1f1f)}html.dark .person-select-dialog .el-dialog__header{border-bottom-color:var(--wf-border-color, #333333)}html.dark .person-select-dialog .el-dialog__title{color:var(--wf-text-primary, #e0e0e0)}html.dark .person-select-dialog .el-table th.el-table__cell,html.dark .person-select-dialog .el-table__header-wrapper th{background-color:var(--wf-bg-color, #1f1f1f)!important;color:#c0c4cc!important}.section-blue .section-card-header[data-v-24c5e0f1]{background:transparent;border-bottom-color:var(--wf-border-lighter, #ebeef5)}html.dark .section-blue .section-card-header[data-v-24c5e0f1]{background:transparent;border-bottom-color:var(--wf-border-color, #333333)}.section-blue .section-card-icon[data-v-24c5e0f1],.section-blue .section-card-title[data-v-24c5e0f1]{color:var(--wf-primary, #409eff)}.section-purple .section-purple-header[data-v-24c5e0f1]{background:transparent;border-bottom-color:var(--wf-border-lighter, #ebeef5)}html.dark .section-purple .section-purple-header[data-v-24c5e0f1]{background:transparent;border-bottom-color:var(--wf-border-color, #333333)}.section-purple .section-purple-icon[data-v-24c5e0f1],.section-purple .section-purple-title[data-v-24c5e0f1]{color:#8960dc}.radio-card-group[data-v-24c5e0f1]{display:flex;gap:10px;flex-wrap:wrap}.radio-card-group.radio-card-sm[data-v-24c5e0f1]{gap:8px}.radio-card-item[data-v-24c5e0f1]{position:relative;display:inline-flex;align-items:center;gap:8px;padding:8px 16px;border-radius:var(--wf-radius, 8px);border:1.5px solid var(--wf-border-color, #dcdfe6);background:var(--wf-bg-white, #fff);cursor:pointer;transition:all .25s cubic-bezier(.4,0,.2,1);-webkit-user-select:none;user-select:none;font-size:13px;color:var(--wf-text-regular, #606266)}html.dark .radio-card-item[data-v-24c5e0f1]{background:var(--wf-bg-color, #1a1a1a);border-color:var(--wf-border-color, #333333);color:var(--wf-text-regular, #b0b0b0)}.radio-card-item[data-v-24c5e0f1]:hover{border-color:var(--wf-primary, #409eff);background:var(--wf-primary-lighter, #f0f7ff);color:var(--wf-primary, #409eff)}html.dark .radio-card-item[data-v-24c5e0f1]:hover{background:#409eff14}.radio-card-item:hover .radio-card-dot[data-v-24c5e0f1]{border-color:var(--wf-primary, #409eff);background:transparent}.radio-card-item.is-checked[data-v-24c5e0f1]{border-color:var(--wf-primary, #409eff);background:var(--wf-primary-light, #ecf5ff);color:var(--wf-primary, #409eff);font-weight:500}html.dark .radio-card-item.is-checked[data-v-24c5e0f1]{background:#409eff1f}.radio-card-item.is-checked .radio-card-dot[data-v-24c5e0f1]{border-color:var(--wf-primary, #409eff);background:var(--wf-primary, #409eff);box-shadow:inset 0 0 0 3px var(--wf-bg-white, #fff)}html.dark .radio-card-item.is-checked .radio-card-dot[data-v-24c5e0f1]{box-shadow:inset 0 0 0 3px var(--wf-bg-color, #141414)}.radio-card-item .radio-card-dot[data-v-24c5e0f1]{width:16px;height:16px;min-width:16px;border-radius:50%;border:2px solid var(--wf-border-color, #dcdfe6);transition:all .25s ease;background:var(--wf-bg-white, #fff)}html.dark .radio-card-item .radio-card-dot[data-v-24c5e0f1]{border-color:var(--wf-border-color, #444444);background:var(--wf-bg-color, #1a1a1a)}.radio-card-item .radio-card-text[data-v-24c5e0f1]{line-height:1}.radio-card-item .radio-card-tip[data-v-24c5e0f1]{color:var(--wf-text-placeholder, #c0c4cc);transition:color .25s ease}.is-checked .radio-card-item .radio-card-tip[data-v-24c5e0f1]{color:var(--wf-primary, #409eff);opacity:.7}.ext-attributes-section[data-v-24c5e0f1]{margin-top:12px;border-radius:var(--wf-radius-lg, 12px);overflow:hidden;border:1px solid var(--wf-border-light, #e4e7ed);background:var(--wf-bg-white, #fff);box-shadow:var(--wf-shadow-sm, 0 1px 4px rgba(0, 0, 0, .04));transition:all .3s ease}html.dark .ext-attributes-section[data-v-24c5e0f1]{border-color:var(--wf-border-color, #333333);background:var(--wf-bg-color, #141414)}.ext-attributes-section[data-v-24c5e0f1]:hover{box-shadow:var(--wf-shadow, 0 2px 12px rgba(0, 0, 0, .06))}html.dark .ext-attributes-section[data-v-24c5e0f1]:hover{box-shadow:0 2px 12px #0000004d}.ext-attributes-header[data-v-24c5e0f1]{display:flex;align-items:center;gap:8px;padding:12px 16px;background:linear-gradient(135deg,var(--wf-primary-light, #ecf5ff) 0%,var(--wf-primary-lighter, #f0f7ff) 100%);border-bottom:1px solid rgba(64,158,255,.12)}html.dark .ext-attributes-header[data-v-24c5e0f1]{background:linear-gradient(135deg,#409eff14,#2b7de90d);border-bottom-color:#409eff1f}.ext-attributes-icon[data-v-24c5e0f1]{width:20px;height:20px;display:flex;align-items:center;justify-content:center;color:var(--wf-primary, #409eff)}.ext-attributes-icon svg[data-v-24c5e0f1]{width:16px;height:16px}.ext-attributes-title[data-v-24c5e0f1]{font-size:13px;font-weight:600;color:var(--wf-primary, #409eff);letter-spacing:.3px}.ext-attributes-badge[data-v-24c5e0f1]{display:inline-flex;align-items:center;justify-content:center;padding:1px 7px;font-size:10px;font-weight:600;color:var(--wf-primary, #409eff);background:#409eff1f;border-radius:8px}html.dark .ext-attributes-badge[data-v-24c5e0f1]{background:#409eff33;color:var(--wf-primary, #409eff)}.ext-attributes-content[data-v-24c5e0f1]{padding:14px 16px;background:var(--wf-bg-color, #fafbfc)}html.dark .ext-attributes-content[data-v-24c5e0f1]{background:var(--wf-bg-color, #141414)}.ext-header-clickable[data-v-24c5e0f1]{cursor:pointer;-webkit-user-select:none;user-select:none;transition:background .25s ease}.ext-header-clickable[data-v-24c5e0f1]:hover{background:linear-gradient(135deg,#409eff1a,#2b7de90f)}html.dark .ext-header-clickable[data-v-24c5e0f1]:hover{background:linear-gradient(135deg,#409eff1f,#2b7de914)}.ext-header-clickable[data-v-24c5e0f1]:active{opacity:.85}.ext-collapse-arrow[data-v-24c5e0f1]{margin-left:auto;width:20px;height:20px;display:flex;align-items:center;justify-content:center;color:var(--wf-primary, #409eff);opacity:.6;transition:opacity .25s ease}.ext-collapse-arrow svg[data-v-24c5e0f1]{width:18px;height:18px}.ext-header-clickable:hover .ext-collapse-arrow[data-v-24c5e0f1]{opacity:1}.arrow-rotated[data-v-24c5e0f1]{transform:rotate(180deg);transition:transform .35s cubic-bezier(.4,0,.2,1)}.is-collapsed[data-v-24c5e0f1]{border-bottom-width:1px!important}.is-collapsed .ext-attributes-header[data-v-24c5e0f1]{border-bottom:none}.ext-collapse-enter-active[data-v-24c5e0f1],.ext-collapse-leave-active[data-v-24c5e0f1]{transition:all .35s cubic-bezier(.4,0,.2,1);overflow:hidden}.ext-collapse-enter-from[data-v-24c5e0f1],.ext-collapse-leave-to[data-v-24c5e0f1]{opacity:0;max-height:0;padding-top:0;padding-bottom:0}.ext-collapse-enter-to[data-v-24c5e0f1],.ext-collapse-leave-from[data-v-24c5e0f1]{opacity:1;max-height:2000px}.ext-secondary[data-v-24c5e0f1]{border-color:#67c23a40}html.dark .ext-secondary[data-v-24c5e0f1]{border-color:#67c23a33}.ext-secondary .ext-secondary-header[data-v-24c5e0f1]{background:linear-gradient(135deg,#67c23a14,#529b2e0a);border-bottom-color:#67c23a1f}html.dark .ext-secondary .ext-secondary-header[data-v-24c5e0f1]{background:linear-gradient(135deg,#67c23a1a,#529b2e0f);border-bottom-color:#67c23a26}.ext-secondary .ext-secondary-title[data-v-24c5e0f1]{color:#67c23a}.ext-secondary .ext-secondary-badge[data-v-24c5e0f1]{color:#67c23a;background:#67c23a1f}html.dark .ext-secondary .ext-secondary-badge[data-v-24c5e0f1]{background:#67c23a33}.ext-secondary .ext-icon-puzzle[data-v-24c5e0f1]{color:#67c23a}.ext-secondary[data-v-24c5e0f1]:hover{box-shadow:0 2px 12px #67c23a1a}html.dark .ext-secondary[data-v-24c5e0f1]:hover{box-shadow:0 2px 12px #0000004d}.section-card-body[data-v-24c5e0f1] .el-table .el-form-item{margin-bottom:0}.section-card-body[data-v-24c5e0f1] .el-table .el-form-item .el-form-item__label{display:none!important;width:0!important;padding-right:0!important;min-height:0!important;height:0!important;overflow:hidden!important}.section-card-body[data-v-24c5e0f1] .el-table .el-form-item .el-form-item__content{display:block!important;margin-left:0!important}[data-v-24c5e0f1] .permissionItem{display:inline-block;width:100%}[data-v-24c5e0f1] .permissionItem .el-form-item__content{display:block}[data-v-24c5e0f1] .permissionItem .inputGroup{display:flex;align-items:center;margin-bottom:10px}[data-v-24c5e0f1] .permissionItem .inputGroup .Icon{width:14px;height:14px;margin-left:5px;cursor:pointer;color:#fff;background:#94979d;border-radius:50%;padding:2px}[data-v-24c5e0f1] .permissionItem .inputGroup .Icon:hover{background:#f0f2f5;color:#94979d}[data-v-24c5e0f1] .permissionItem .inputGroup .btn{height:18px;margin-left:5px;color:#fff;background:#94979d;border-radius:5px;padding:6px;font-size:10px;border:0}[data-v-24c5e0f1] .permissionItem .inputGroup .btn:hover{background:#f0f2f5;color:#94979d}[data-v-24c5e0f1] .listenerItem{display:inline-block;width:100%}[data-v-24c5e0f1] .listenerItem .el-form-item__label{display:none!important;width:0!important;min-height:0!important;height:0!important;overflow:hidden!important;padding-right:0!important}[data-v-24c5e0f1] .listenerItem .el-form-item__content{margin-left:0!important;display:block!important}[data-v-24c5e0f1] .listenerItem .el-table .el-form-item{margin-bottom:0}.gateway-wrapper[data-v-44373521]{width:100%}html.dark .gateway-wrapper[data-v-44373521]{background:var(--wf-bg-color, #141414);border-radius:var(--wf-radius-lg, 12px)}.gatewayForm[data-v-44373521]{border-top:0;width:100%}.base-settings-section[data-v-44373521]{border:none;background:transparent;box-shadow:none;border-radius:0;overflow:visible;margin-bottom:4px}html.dark .base-settings-section[data-v-44373521]{border:none;background:transparent}.base-settings-header[data-v-44373521]{display:flex;align-items:center;gap:8px;padding:0 0 12px;margin-bottom:20px;background:transparent;border-bottom:1px solid var(--wf-border-lighter, #ebeef5)}html.dark .base-settings-header[data-v-44373521]{background:transparent;border-bottom-color:var(--wf-border-color, #333333)}.ext-icon-base[data-v-44373521]{color:var(--wf-text-regular, #606266)}.base-settings-title[data-v-44373521]{font-size:15px;font-weight:600;color:var(--wf-text-primary, #303133);letter-spacing:.3px}.base-settings-content[data-v-44373521]{padding:0;background:transparent}html.dark .base-settings-content[data-v-44373521]{background:transparent}@media (max-width: 1024px) and (min-width: 769px){.modern-tabs-wrapper[data-v-44373521]{padding:4px}.modern-tab-item[data-v-44373521]{padding:7px 12px;font-size:12px}.base-settings-header[data-v-44373521],.base-settings-content[data-v-44373521]{padding:10px 12px}.base-settings-title[data-v-44373521]{font-size:12px}.section-card-header[data-v-44373521],.section-card-body[data-v-44373521]{padding:10px 12px}.section-card-title[data-v-44373521]{font-size:12px}.tabPane[data-v-44373521],.tabPane-full[data-v-44373521]{padding:12px 2px 6px}}@media (max-width: 768px){.modern-tabs-wrapper[data-v-44373521]{padding:4px;border-radius:var(--wf-radius, 8px)}.modern-tabs[data-v-44373521]{gap:3px;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none}.modern-tabs[data-v-44373521]::-webkit-scrollbar{display:none}.modern-tab-item[data-v-44373521]{padding:6px 10px;font-size:12px;border-radius:var(--wf-radius-sm, 6px)}.base-settings-section[data-v-44373521]{border-radius:var(--wf-radius, 8px)}.base-settings-header[data-v-44373521]{padding:8px 10px;gap:6px}.ext-icon-base svg[data-v-44373521]{width:14px;height:14px}.base-settings-title[data-v-44373521]{font-size:12px}.base-settings-content[data-v-44373521]{padding:10px}.section-card[data-v-44373521]{border-radius:var(--wf-radius, 8px)}.section-card-header[data-v-44373521]{padding:8px 10px;gap:6px}.section-card-icon svg[data-v-44373521]{width:14px;height:14px}.section-card-title[data-v-44373521]{font-size:12px}.section-card-body[data-v-44373521]{padding:10px}.action-buttons[data-v-44373521]{flex-direction:column;gap:6px;margin-top:8px}.tabPane[data-v-44373521],.tabPane-full[data-v-44373521]{padding:10px 2px 4px}[data-v-44373521] .el-form-item__label{width:auto!important;min-width:95px!important;max-width:115px!important;padding-right:6px!important;font-size:12px!important;line-height:1.4!important;word-break:break-word!important}[data-v-44373521] .el-table{font-size:12px}[data-v-44373521] .el-table:before{background-color:transparent}[data-v-44373521] .el-table .el-table__header-wrapper,[data-v-44373521] .el-table .el-table__body-wrapper{overflow-x:auto;-webkit-overflow-scrolling:touch}[data-v-44373521] .el-table th,[data-v-44373521] .el-table td{padding:6px 4px}[data-v-44373521] .el-table-column--selection .cell,[data-v-44373521] .el-table .cell{min-width:60px}[data-v-44373521] .el-input,[data-v-44373521] .el-select,[data-v-44373521] .el-textarea{--el-input-height: 32px}[data-v-44373521] .el-input__inner,[data-v-44373521] .el-textarea__inner{font-size:12px}[data-v-44373521] .el-button--small{padding:5px 8px;font-size:12px}.ext-attributes-header[data-v-44373521]{padding:8px 10px;gap:6px}.ext-attributes-title[data-v-44373521]{font-size:12px}.ext-attributes-content[data-v-44373521]{padding:10px}.ext-attributes-icon svg[data-v-44373521]{width:14px;height:14px}}@media (max-width: 480px){.modern-tab-item[data-v-44373521]{padding:5px 8px;font-size:11px}.base-settings-header[data-v-44373521],.section-card-header[data-v-44373521],.ext-attributes-header[data-v-44373521]{padding:6px 8px}.base-settings-content[data-v-44373521],.section-card-body[data-v-44373521],.ext-attributes-content[data-v-44373521]{padding:8px}[data-v-44373521] .el-form-item__label{min-width:80px!important;font-size:11px!important}[data-v-44373521] .el-input__inner,[data-v-44373521] .el-textarea__inner{font-size:11px}}.ext-icon-base[data-v-44373521]{color:var(--wf-primary, #409eff)}.ext-icon-base svg[data-v-44373521]{width:16px;height:16px}.end-wrapper[data-v-586c9db4]{width:100%}html.dark .end-wrapper[data-v-586c9db4]{background:var(--wf-bg-color, #141414);border-radius:var(--wf-radius-lg, 12px)}.endForm[data-v-586c9db4]{border-top:0;width:100%}.base-settings-section[data-v-586c9db4]{border:none;background:transparent;box-shadow:none;border-radius:0;overflow:visible;margin-bottom:4px}html.dark .base-settings-section[data-v-586c9db4]{border:none;background:transparent}.base-settings-header[data-v-586c9db4]{display:flex;align-items:center;gap:8px;padding:0 0 12px;margin-bottom:20px;background:transparent;border-bottom:1px solid var(--wf-border-lighter, #ebeef5)}html.dark .base-settings-header[data-v-586c9db4]{background:transparent;border-bottom-color:var(--wf-border-color, #333333)}.ext-icon-base[data-v-586c9db4]{color:var(--wf-text-regular, #606266)}.ext-icon-base svg[data-v-586c9db4]{width:16px;height:16px}.base-settings-title[data-v-586c9db4]{font-size:15px;font-weight:600;color:var(--wf-text-primary, #303133);letter-spacing:.3px}.base-settings-content[data-v-586c9db4]{padding:0;background:transparent}html.dark .base-settings-content[data-v-586c9db4]{background:transparent}@media (max-width: 1024px) and (min-width: 769px){.modern-tabs-wrapper[data-v-586c9db4]{padding:4px}.modern-tab-item[data-v-586c9db4]{padding:7px 12px;font-size:12px}.base-settings-header[data-v-586c9db4],.base-settings-content[data-v-586c9db4]{padding:10px 12px}.base-settings-title[data-v-586c9db4]{font-size:12px}.section-card-header[data-v-586c9db4],.section-card-body[data-v-586c9db4]{padding:10px 12px}.section-card-title[data-v-586c9db4]{font-size:12px}.tabPane[data-v-586c9db4],.tabPane-full[data-v-586c9db4]{padding:12px 2px 6px}}@media (max-width: 768px){.modern-tabs-wrapper[data-v-586c9db4]{padding:4px;border-radius:var(--wf-radius, 8px)}.modern-tabs[data-v-586c9db4]{gap:3px;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none}.modern-tabs[data-v-586c9db4]::-webkit-scrollbar{display:none}.modern-tab-item[data-v-586c9db4]{padding:6px 10px;font-size:12px;border-radius:var(--wf-radius-sm, 6px)}.base-settings-section[data-v-586c9db4]{border-radius:var(--wf-radius, 8px)}.base-settings-header[data-v-586c9db4]{padding:8px 10px;gap:6px}.ext-icon-base svg[data-v-586c9db4]{width:14px;height:14px}.base-settings-title[data-v-586c9db4]{font-size:12px}.base-settings-content[data-v-586c9db4]{padding:10px}.section-card[data-v-586c9db4]{border-radius:var(--wf-radius, 8px)}.section-card-header[data-v-586c9db4]{padding:8px 10px;gap:6px}.section-card-icon svg[data-v-586c9db4]{width:14px;height:14px}.section-card-title[data-v-586c9db4]{font-size:12px}.section-card-body[data-v-586c9db4]{padding:10px}.action-buttons[data-v-586c9db4]{flex-direction:column;gap:6px;margin-top:8px}.tabPane[data-v-586c9db4],.tabPane-full[data-v-586c9db4]{padding:10px 2px 4px}[data-v-586c9db4] .el-form-item__label{width:auto!important;min-width:95px!important;max-width:115px!important;padding-right:6px!important;font-size:12px!important;line-height:1.4!important;word-break:break-word!important}[data-v-586c9db4] .el-table{font-size:12px}[data-v-586c9db4] .el-table:before{background-color:transparent}[data-v-586c9db4] .el-table .el-table__header-wrapper,[data-v-586c9db4] .el-table .el-table__body-wrapper{overflow-x:auto;-webkit-overflow-scrolling:touch}[data-v-586c9db4] .el-table th,[data-v-586c9db4] .el-table td{padding:6px 4px}[data-v-586c9db4] .el-table-column--selection .cell,[data-v-586c9db4] .el-table .cell{min-width:60px}[data-v-586c9db4] .el-input,[data-v-586c9db4] .el-select,[data-v-586c9db4] .el-textarea{--el-input-height: 32px}[data-v-586c9db4] .el-input__inner,[data-v-586c9db4] .el-textarea__inner{font-size:12px}[data-v-586c9db4] .el-button--small{padding:5px 8px;font-size:12px}.ext-attributes-header[data-v-586c9db4]{padding:8px 10px;gap:6px}.ext-attributes-title[data-v-586c9db4]{font-size:12px}.ext-attributes-content[data-v-586c9db4]{padding:10px}.ext-attributes-icon svg[data-v-586c9db4]{width:14px;height:14px}}@media (max-width: 480px){.modern-tab-item[data-v-586c9db4]{padding:5px 8px;font-size:11px}.base-settings-header[data-v-586c9db4],.section-card-header[data-v-586c9db4],.ext-attributes-header[data-v-586c9db4]{padding:6px 8px}.base-settings-content[data-v-586c9db4],.section-card-body[data-v-586c9db4],.ext-attributes-content[data-v-586c9db4]{padding:8px}[data-v-586c9db4] .el-form-item__label{min-width:80px!important;font-size:11px!important}[data-v-586c9db4] .el-input__inner,[data-v-586c9db4] .el-textarea__inner{font-size:11px}}.skip-wrapper[data-v-69b62192]{width:100%}html.dark .skip-wrapper[data-v-69b62192]{background:var(--wf-bg-color, #141414);border-radius:var(--wf-radius-lg, 12px)}.skipForm[data-v-69b62192]{border-top:0;width:100%}.placeholder[data-v-69b62192]{color:#828f9e;font-size:12px}.base-settings-section[data-v-69b62192]{border:none;background:transparent;box-shadow:none;border-radius:0;overflow:visible;margin-bottom:4px}html.dark .base-settings-section[data-v-69b62192]{border:none;background:transparent}.base-settings-header[data-v-69b62192]{display:flex;align-items:center;gap:8px;padding:0 0 12px;margin-bottom:20px;background:transparent;border-bottom:1px solid var(--wf-border-lighter, #ebeef5)}html.dark .base-settings-header[data-v-69b62192]{background:transparent;border-bottom-color:var(--wf-border-color, #333333)}.ext-icon-base[data-v-69b62192]{color:var(--wf-text-regular, #606266)}.ext-icon-base svg[data-v-69b62192]{width:16px;height:16px}.base-settings-title[data-v-69b62192]{font-size:15px;font-weight:600;color:var(--wf-text-primary, #303133);letter-spacing:.3px}.base-settings-content[data-v-69b62192]{padding:0;background:transparent}html.dark .base-settings-content[data-v-69b62192]{background:transparent}@media (max-width: 1024px) and (min-width: 769px){.modern-tabs-wrapper[data-v-69b62192]{padding:4px}.modern-tab-item[data-v-69b62192]{padding:7px 12px;font-size:12px}.base-settings-header[data-v-69b62192],.base-settings-content[data-v-69b62192]{padding:10px 12px}.base-settings-title[data-v-69b62192]{font-size:12px}.section-card-header[data-v-69b62192],.section-card-body[data-v-69b62192]{padding:10px 12px}.section-card-title[data-v-69b62192]{font-size:12px}.tabPane[data-v-69b62192],.tabPane-full[data-v-69b62192]{padding:12px 2px 6px}}@media (max-width: 768px){.modern-tabs-wrapper[data-v-69b62192]{padding:4px;border-radius:var(--wf-radius, 8px)}.modern-tabs[data-v-69b62192]{gap:3px;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none}.modern-tabs[data-v-69b62192]::-webkit-scrollbar{display:none}.modern-tab-item[data-v-69b62192]{padding:6px 10px;font-size:12px;border-radius:var(--wf-radius-sm, 6px)}.base-settings-section[data-v-69b62192]{border-radius:var(--wf-radius, 8px)}.base-settings-header[data-v-69b62192]{padding:8px 10px;gap:6px}.ext-icon-base svg[data-v-69b62192]{width:14px;height:14px}.base-settings-title[data-v-69b62192]{font-size:12px}.base-settings-content[data-v-69b62192]{padding:10px}.section-card[data-v-69b62192]{border-radius:var(--wf-radius, 8px)}.section-card-header[data-v-69b62192]{padding:8px 10px;gap:6px}.section-card-icon svg[data-v-69b62192]{width:14px;height:14px}.section-card-title[data-v-69b62192]{font-size:12px}.section-card-body[data-v-69b62192]{padding:10px}.action-buttons[data-v-69b62192]{flex-direction:column;gap:6px;margin-top:8px}.tabPane[data-v-69b62192],.tabPane-full[data-v-69b62192]{padding:10px 2px 4px}[data-v-69b62192] .el-form-item__label{width:auto!important;min-width:95px!important;max-width:115px!important;padding-right:6px!important;font-size:12px!important;line-height:1.4!important;word-break:break-word!important}[data-v-69b62192] .el-table{font-size:12px}[data-v-69b62192] .el-table:before{background-color:transparent}[data-v-69b62192] .el-table .el-table__header-wrapper,[data-v-69b62192] .el-table .el-table__body-wrapper{overflow-x:auto;-webkit-overflow-scrolling:touch}[data-v-69b62192] .el-table th,[data-v-69b62192] .el-table td{padding:6px 4px}[data-v-69b62192] .el-table-column--selection .cell,[data-v-69b62192] .el-table .cell{min-width:60px}[data-v-69b62192] .el-input,[data-v-69b62192] .el-select,[data-v-69b62192] .el-textarea{--el-input-height: 32px}[data-v-69b62192] .el-input__inner,[data-v-69b62192] .el-textarea__inner{font-size:12px}[data-v-69b62192] .el-button--small{padding:5px 8px;font-size:12px}.ext-attributes-header[data-v-69b62192]{padding:8px 10px;gap:6px}.ext-attributes-title[data-v-69b62192]{font-size:12px}.ext-attributes-content[data-v-69b62192]{padding:10px}.ext-attributes-icon svg[data-v-69b62192]{width:14px;height:14px}}@media (max-width: 480px){.modern-tab-item[data-v-69b62192]{padding:5px 8px;font-size:11px}.base-settings-header[data-v-69b62192],.section-card-header[data-v-69b62192],.ext-attributes-header[data-v-69b62192]{padding:6px 8px}.base-settings-content[data-v-69b62192],.section-card-body[data-v-69b62192],.ext-attributes-content[data-v-69b62192]{padding:8px}[data-v-69b62192] .el-form-item__label{min-width:80px!important;font-size:11px!important}[data-v-69b62192] .el-input__inner,[data-v-69b62192] .el-textarea__inner{font-size:11px}}.ext-icon-skip[data-v-69b62192]{color:var(--wf-text-regular, #606266)}.ext-icon-skip svg[data-v-69b62192]{width:16px;height:16px}@media (max-width: 768px){.skip-wrapper[data-v-69b62192] .el-form-item .el-form-item__content{flex-wrap:wrap}.skip-wrapper[data-v-69b62192] .el-form-item .el-input,.skip-wrapper[data-v-69b62192] .el-form-item .el-select{width:100%!important;margin-left:0!important;margin-bottom:4px}}.app-container[data-v-2d76fe80]{padding:0;background-color:var(--wf-bg-white, #fff);min-height:100%;font-family:-apple-system,BlinkMacSystemFont,SF Pro Text,PingFang SC,Helvetica Neue,Microsoft YaHei,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}html.dark .app-container[data-v-2d76fe80]{background-color:var(--wf-bg-color, #141414)}.dialogForm[data-v-2d76fe80]{max-width:960px;width:100%;margin:24px auto;padding:0;background:transparent;border-top:0}.form-section[data-v-2d76fe80]{position:relative;background:transparent;padding:0;margin-bottom:32px;overflow:visible}.form-section[data-v-2d76fe80]:last-child{margin-bottom:0}.section-title[data-v-2d76fe80]{font-size:15px;font-weight:600;color:var(--wf-text-primary, #303133);letter-spacing:.3px;padding:0 0 14px;margin-bottom:24px;border-bottom:1px solid var(--wf-border-lighter, #ebeef5);display:flex;align-items:center}[data-v-2d76fe80] .el-form-item{margin-bottom:24px}[data-v-2d76fe80] .el-form-item__label{font-weight:600;color:var(--wf-text-primary, #303133);width:110px!important;min-width:110px!important;box-sizing:border-box;display:flex;align-items:center;justify-content:flex-end;text-align:right;height:32px}[data-v-2d76fe80] .el-form-item__error{padding-top:6px;padding-bottom:4px}[data-v-2d76fe80]::deep(.el-form-item__content){text-align:left;justify-content:flex-start}[data-v-2d76fe80] .el-input__wrapper,[data-v-2d76fe80] .el-select .el-input__wrapper,[data-v-2d76fe80] .el-textarea__inner{transition:background-color .2s ease,box-shadow .2s ease,border-color .2s ease;border-radius:10px;background-color:var(--wf-bg-white, #fff);box-shadow:none;border:1px solid var(--wf-border-light, #dcdfe6);position:relative}[data-v-2d76fe80] .el-input__wrapper:hover,[data-v-2d76fe80] .el-select .el-input__wrapper:hover,[data-v-2d76fe80] .el-textarea__inner:hover{border-color:var(--wf-primary, #409eff)}[data-v-2d76fe80] .el-input__wrapper.is-focus,[data-v-2d76fe80] .el-input__wrapper:focus,[data-v-2d76fe80] .el-select .el-input__wrapper.is-focus,[data-v-2d76fe80] .el-select .el-input__wrapper:focus,[data-v-2d76fe80] .el-textarea__inner.is-focus,[data-v-2d76fe80] .el-textarea__inner:focus{background-color:var(--wf-bg-white, #fff);border-color:var(--wf-primary, #409eff);box-shadow:0 0 0 4px #409eff1f}[data-v-2d76fe80] .el-form-item.is-error .el-input__wrapper,[data-v-2d76fe80] .el-form-item.is-error .el-input__wrapper.is-focus,[data-v-2d76fe80] .el-form-item.is-error .el-select .el-input__wrapper{border-color:var(--wf-danger, #f56c6c);box-shadow:0 0 0 4px #f56c6c1f}html.dark .dialogForm .el-form-item .el-input__wrapper.is-disabled,html.dark .dialogForm .el-form-item .el-textarea__inner.is-disabled,html.dark .dialogForm .el-form-item .el-select .el-input__wrapper.is-disabled{background-color:#2a2d35!important;box-shadow:none!important;border-color:#3a3e48!important}.radio-card-group[data-v-2d76fe80]{display:flex;gap:12px;width:100%}.radio-card-group--compact[data-v-2d76fe80]{gap:10px}[data-v-2d76fe80] .radio-card{position:relative;border:1.5px solid var(--wf-border-color, #dcdfe6);border-radius:var(--wf-radius-lg, 12px);padding:16px;margin-right:0;height:auto;background:var(--wf-bg-white, #fff);box-shadow:var(--wf-shadow-sm, 0 1px 4px rgba(0, 0, 0, .04));transition:all .25s cubic-bezier(.4,0,.2,1);flex:1;min-width:0;overflow:hidden}[data-v-2d76fe80] .radio-card:hover{border-color:var(--wf-primary, #409eff);transform:translateY(-2px);box-shadow:var(--wf-shadow, 0 2px 12px rgba(0, 0, 0, .06))}[data-v-2d76fe80] .radio-card .el-radio__input{position:absolute;top:10px;right:10px}[data-v-2d76fe80] .radio-card .el-radio__input .el-radio__inner{width:16px;height:16px;border-width:1.5px;transition:all .25s ease}[data-v-2d76fe80] .radio-card .el-radio__label{padding-left:0;width:100%;color:var(--wf-text-primary, #303133);font-weight:400}[data-v-2d76fe80] .radio-card.is-checked{border-color:var(--wf-primary, #409eff);background:var(--wf-primary-light, #ecf5ff)}[data-v-2d76fe80] .radio-card.is-checked .el-radio__input .el-radio__inner{background:var(--wf-primary, #409eff);border-color:var(--wf-primary, #409eff)}[data-v-2d76fe80] .radio-card.is-checked .radio-card-title{color:var(--wf-primary, #409eff)}[data-v-2d76fe80] .radio-card.is-checked .radio-card-icon{background:var(--wf-primary, #409eff);color:#fff}[data-v-2d76fe80] .radio-card.is-disabled{opacity:.6;cursor:not-allowed;background:var(--wf-bg-color, #f5f7fa);border-color:var(--wf-border-light, #e4e7ed)}[data-v-2d76fe80] .radio-card.is-disabled:hover{box-shadow:none;border-color:var(--wf-border-light, #e4e7ed);transform:none}[data-v-2d76fe80] .radio-card :global(html.dark) .radio-card.is-disabled{background:#2a2d35!important;border-color:#3a3e48!important}[data-v-2d76fe80] .radio-card--sm{padding:10px 14px}.radio-card-content[data-v-2d76fe80]{display:flex;align-items:center;gap:12px}.radio-card-icon[data-v-2d76fe80]{display:flex;align-items:center;justify-content:center;width:40px;height:40px;border-radius:50%;background:var(--wf-bg-color, #f5f7fa);color:var(--wf-primary, #409eff);flex-shrink:0;transition:all .25s ease;font-size:22px}.model-icon[data-v-2d76fe80]{width:1em;height:1em;vertical-align:-.1em}.radio-card-icon--sm[data-v-2d76fe80]{width:34px;height:34px;border-radius:50%}.radio-card-info[data-v-2d76fe80]{flex:1;min-width:0}.radio-card-title[data-v-2d76fe80]{font-size:14px;font-weight:600;color:var(--wf-text-primary, #303133);line-height:1.4;transition:color .25s ease}.radio-card-desc[data-v-2d76fe80]{font-size:12px;color:var(--wf-text-secondary, #909399);line-height:1.4;margin-top:4px}[data-v-2d76fe80] .el-table{border-radius:var(--wf-radius-lg, 12px);overflow:hidden;border:1px solid var(--wf-border-lighter, #ebeef5)}[data-v-2d76fe80] .el-table .el-table__header-wrapper th{background:var(--wf-bg-white, #fff)!important;color:var(--wf-text-regular, #606266);font-weight:600;font-size:13px}[data-v-2d76fe80] .el-table .el-table__row{transition:background-color .2s ease;position:relative}[data-v-2d76fe80] .el-table .el-table__row>td:first-child{position:relative}[data-v-2d76fe80] .el-table .el-table__row>td:first-child:before{content:"";position:absolute;left:0;top:50%;transform:translateY(-50%);width:3px;height:0;background:var(--wf-primary, #409eff);border-radius:0 2px 2px 0;transition:height .25s ease}[data-v-2d76fe80] .el-table .el-table__row:hover>td:first-child:before{height:60%}[data-v-2d76fe80] .el-table .el-table__row:hover>td{background-color:var(--wf-primary-light, #ecf5ff)!important}[data-v-2d76fe80] .el-table .el-button--danger.is-link{color:var(--wf-danger, #f56c6c);padding:5px;height:auto;border:none;transition:all .2s ease}[data-v-2d76fe80] .el-table .el-button--danger.is-link:hover{color:#e04848;background:#f56c6c1f!important;border-radius:8px}[data-v-2d76fe80] .el-table .el-input__wrapper,[data-v-2d76fe80] .el-table .el-select .el-input__wrapper{background-color:transparent}[data-v-2d76fe80] .el-table .el-input__wrapper:hover,[data-v-2d76fe80] .el-table .el-select .el-input__wrapper:hover{background-color:#76809612}[data-v-2d76fe80] .el-table .el-input__wrapper.is-focus,[data-v-2d76fe80] .el-table .el-select .el-input__wrapper.is-focus{background-color:var(--wf-bg-white, #fff)}.add-row-btn[data-v-2d76fe80]{margin-top:12px;width:100%;border:1.5px dashed var(--wf-primary, #409eff)!important;color:var(--wf-primary, #409eff)!important;background:transparent!important;border-radius:10px;transition:all .3s ease;height:40px;letter-spacing:2px;font-weight:500;display:flex;align-items:center;justify-content:center}.add-row-btn[data-v-2d76fe80]:hover{background:var(--wf-primary-light, #ecf5ff)!important;border-style:solid!important;border-color:var(--wf-primary, #409eff)!important;box-shadow:var(--wf-shadow-primary, 0 2px 8px rgba(64, 158, 255, .3))}[data-v-2d76fe80] .Tabs{margin-top:-20px;box-shadow:none;border-bottom:0}[data-v-2d76fe80] .Tabs .el-tabs__content{display:none}[data-v-2d76fe80] .Tabs .el-tabs__item.is-active{margin-left:0;border-top:1px solid var(--el-border-color);margin-top:0}[data-v-2d76fe80] .listenerItem{margin-bottom:0}[data-v-2d76fe80] .listenerItem .el-form-item__label{float:none;display:inline-block;text-align:left}[data-v-2d76fe80] .listenerItem .el-form-item__content{margin-left:0!important}[data-v-2d76fe80] .listenerItem .el-table .el-form-item{margin-bottom:0}[data-v-2d76fe80] .el-form-item .radio-card-warning{margin-top:8px;padding:6px 10px;background:var(--wf-warning-lighter, #fdf6ec);border-radius:var(--wf-radius-sm, 4px);font-size:12px;color:var(--wf-warning, #e6a23c);line-height:1.5;width:100%}.form-tip[data-v-2d76fe80]{margin-left:12px;font-size:12px;color:var(--wf-text-secondary, #909399);line-height:1.5}html.dark{background-color:var(--wf-bg-color, #141414)!important;background-image:none}html.dark{background-color:#ffffff0f;box-shadow:none;border:1px solid transparent}html.dark{background-color:#ffffff1a}html.dark{background-color:#ffffff0a;border-color:var(--wf-primary, #409eff);box-shadow:0 0 0 4px #409eff2e}html.dark{background:transparent}html.dark{background:linear-gradient(135deg,#1e283cf2,#192337f2)!important}html.dark{background:#1a1a1a;border-color:#444}html.dark{color:#c0c4cc}html.dark{color:#e0e0e0}html.dark{color:#888}html.dark{background:#ffffff0f}html.dark{border-color:#409eff}html.dark{background:#1a2744;border-color:#409eff}html.dark{background:#409eff}html.dark{color:#409eff}html.dark{background:#7878781a;border-color:#3a3a3a}.app-container[data-v-2d76fe80]::-webkit-scrollbar{width:6px;height:6px}.app-container[data-v-2d76fe80]::-webkit-scrollbar-track{background:transparent;border-radius:3px}.app-container[data-v-2d76fe80]::-webkit-scrollbar-thumb{background:#9093994d;border-radius:3px;transition:all .3s ease}.app-container[data-v-2d76fe80]:hover::-webkit-scrollbar-thumb{background:#90939980}.app-container[data-v-2d76fe80]::-webkit-scrollbar-thumb:hover{background:#909399b3;width:8px}@media (max-width: 1024px){.dialogForm[data-v-2d76fe80]{margin:12px auto}.form-section[data-v-2d76fe80]{margin-bottom:24px}}@media (max-width: 768px){.dialogForm[data-v-2d76fe80]{margin:8px 4px}.app-container[data-v-2d76fe80]{overflow-x:hidden}.form-section[data-v-2d76fe80]{margin-bottom:20px}.section-title[data-v-2d76fe80]{font-size:14px;padding-bottom:10px;margin-bottom:16px}[data-v-2d76fe80] .dialogForm .el-form-item__label,[data-v-2d76fe80] .el-form-item__label{width:90px!important;min-width:90px!important;font-size:13px;font-weight:600;text-align:right;justify-content:flex-end}[data-v-2d76fe80]::deep(.el-form-item__error){padding-top:10px;padding-bottom:8px;line-height:1.4}[data-v-2d76fe80] .el-form-item{margin-bottom:18px}[data-v-2d76fe80] .el-input__inner,[data-v-2d76fe80] .el-textarea__inner{font-size:13px!important}.radio-card-group[data-v-2d76fe80]{flex-direction:column;gap:8px;width:100%!important}[data-v-2d76fe80] .el-form-item__content{max-width:100%!important;overflow:visible!important}.radio-card-group--compact[data-v-2d76fe80]{flex-direction:column;gap:8px}[data-v-2d76fe80] .radio-card{width:100%!important;max-width:none!important;padding:10px 14px;box-sizing:border-box!important}[data-v-2d76fe80] .radio-card:hover{transform:none}[data-v-2d76fe80] .radio-card .radio-card-desc{display:block;font-size:10px!important;line-height:1.2!important;margin-top:2px;color:var(--wf-text-placeholder, #c0c4cc)}[data-v-2d76fe80] .radio-card .radio-card-icon{width:28px;height:28px}[data-v-2d76fe80] .radio-card .radio-card-title{font-size:13px;white-space:nowrap;overflow:visible}[data-v-2d76fe80] .radio-card--sm{width:100%!important;max-width:none!important;padding:10px 12px!important;box-sizing:border-box!important}[data-v-2d76fe80] .radio-card--sm .radio-card-desc{display:block!important;font-size:10px!important;line-height:1.2!important;margin-top:2px;color:var(--wf-text-placeholder, #c0c4cc);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.radio-card-content[data-v-2d76fe80]{gap:8px}.radio-card-icon[data-v-2d76fe80]{width:32px;height:32px;font-size:18px}.radio-card-icon--sm[data-v-2d76fe80]{width:28px;height:28px}.radio-card-title[data-v-2d76fe80]{font-size:13px}.radio-card-desc[data-v-2d76fe80]{font-size:10px}[data-v-2d76fe80] .el-form-item .radio-card-warning{margin-top:4px;padding:5px 8px;font-size:11px}[data-v-2d76fe80] .el-form-item .radio-card-warning--mobile{background:var(--wf-primary-lighter, #f0f7ff);border-color:#409eff4d;color:var(--wf-primary, #409eff)}[data-v-2d76fe80] .listenerItem{overflow-x:auto;-webkit-overflow-scrolling:touch}[data-v-2d76fe80] .listenerItem::-webkit-scrollbar{height:4px}[data-v-2d76fe80] .listenerItem::-webkit-scrollbar-thumb{background:#9093994d;border-radius:2px}[data-v-2d76fe80] .el-table{min-width:unset!important}[data-v-2d76fe80] .el-table .el-table__header-wrapper th{font-size:12px}[data-v-2d76fe80] .el-table .el-table__header-wrapper th:first-child,[data-v-2d76fe80] .el-table td:first-child{min-width:60px!important;width:60px!important}[data-v-2d76fe80] .el-table .el-table__header-wrapper th:first-child .cell,[data-v-2d76fe80] .el-table td:first-child .cell{padding-left:4px!important;padding-right:4px!important}[data-v-2d76fe80] .el-table .el-table__header-wrapper th:first-child .el-select,[data-v-2d76fe80] .el-table .el-table__header-wrapper th:first-child .el-select .el-input,[data-v-2d76fe80] .el-table td:first-child .el-select,[data-v-2d76fe80] .el-table td:first-child .el-select .el-input{width:100%!important}[data-v-2d76fe80] .el-table .el-table__header-wrapper th:last-child:not(:first-child),[data-v-2d76fe80] .el-table td:last-child:not(:first-child){min-width:45px!important;width:45px!important;padding:0!important}[data-v-2d76fe80] .el-table .el-table__header-wrapper th:last-child:not(:first-child) .cell,[data-v-2d76fe80] .el-table td:last-child:not(:first-child) .cell{padding:2px!important}[data-v-2d76fe80] .el-table .el-table__header-wrapper th:nth-child(2),[data-v-2d76fe80] .el-table td:nth-child(2){min-width:100px;width:auto}.add-row-btn[data-v-2d76fe80]{height:34px;font-size:13px;letter-spacing:1px;margin-top:8px}}@media (max-width: 480px){.dialogForm[data-v-2d76fe80]{margin:4px 2px}.form-section[data-v-2d76fe80]{margin-bottom:16px}.section-title[data-v-2d76fe80]{font-size:13px;padding-bottom:8px;margin-bottom:12px}[data-v-2d76fe80] .dialogForm .el-form-item__label,[data-v-2d76fe80] .el-form-item__label{width:80px!important;min-width:80px!important;font-size:12px;text-align:right;justify-content:flex-end}[data-v-2d76fe80]::deep(.el-form-item__error){padding-top:6px;padding-bottom:4px}[data-v-2d76fe80] .el-form-item{margin-bottom:12px}[data-v-2d76fe80] .el-input__inner,[data-v-2d76fe80] .el-textarea__inner{font-size:12px!important}.radio-card-group--compact[data-v-2d76fe80]{flex-direction:column;gap:6px}[data-v-2d76fe80] .radio-card{padding:8px 10px}[data-v-2d76fe80] .radio-card .radio-card-desc{display:block!important;font-size:9px!important;line-height:1.2!important;margin-top:1px}[data-v-2d76fe80] .radio-card--sm{width:100%!important;padding:8px 10px!important}[data-v-2d76fe80] .radio-card--sm .radio-card-desc{display:block!important;font-size:9px!important;line-height:1.2!important;margin-top:1px}.radio-card-content[data-v-2d76fe80]{gap:6px}.radio-card-icon[data-v-2d76fe80]{width:26px;height:26px;font-size:16px}.radio-card-icon--sm[data-v-2d76fe80]{width:24px;height:24px}.radio-card-title[data-v-2d76fe80]{font-size:12px}.radio-card-desc[data-v-2d76fe80]{display:none}[data-v-2d76fe80] .el-table{min-width:450px;font-size:12px}[data-v-2d76fe80] .el-table th,[data-v-2d76fe80] .el-table td{padding:4px 0!important}.add-row-btn[data-v-2d76fe80]{height:30px;font-size:12px}}.el-drawer__container[data-v-5f0e3fe9] ::-webkit-scrollbar{display:none}.property-drawer-modern{font-family:-apple-system,BlinkMacSystemFont,SF Pro Text,PingFang SC,Helvetica Neue,Microsoft YaHei,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.property-drawer-modern .el-form-item__label{font-weight:600;color:var(--wf-text-primary, #303133)}.property-drawer-modern .el-drawer__header{background:transparent!important;margin-bottom:0!important;padding-bottom:14px!important;border-bottom:1px solid var(--wf-border-lighter, #ebeef5)}.property-drawer-modern .el-drawer__header>span{color:var(--wf-text-primary, #303133);font-weight:600;font-size:16px}.property-drawer-modern .el-drawer__body{padding-top:12px!important}.property-drawer-modern .el-drawer__body:has(.modern-tabs-wrapper){padding-top:0!important}.property-drawer-modern .el-drawer__close-btn{color:#909399!important;transition:all .25s ease!important}.property-drawer-modern .el-drawer__close-btn:hover{color:#409eff!important;transform:rotate(90deg)}.property-drawer-modern .el-input__wrapper,.property-drawer-modern .el-textarea__inner{border-radius:10px;background-color:var(--wf-bg-white, #fff);box-shadow:none;border:1px solid var(--wf-border-light, #dcdfe6);transition:background-color .2s ease,box-shadow .2s ease,border-color .2s ease}.property-drawer-modern .el-input__wrapper:hover,.property-drawer-modern .el-textarea__inner:hover{border-color:var(--wf-primary, #409eff)}.property-drawer-modern .el-input__wrapper.is-focus,.property-drawer-modern .el-input__wrapper:focus,.property-drawer-modern .el-textarea__inner.is-focus,.property-drawer-modern .el-textarea__inner:focus{background-color:var(--wf-bg-white, #fff);border-color:var(--wf-primary, #409eff);box-shadow:0 0 0 4px #409eff1f}.property-drawer-modern .el-form-item.is-error .el-input__wrapper,.property-drawer-modern .el-form-item.is-error .el-input__wrapper.is-focus{border-color:var(--wf-danger, #f56c6c);box-shadow:0 0 0 4px #f56c6c1f}.property-drawer-modern .el-table{border-radius:var(--wf-radius-lg, 12px);overflow:hidden;border:1px solid var(--wf-border-lighter, #ebeef5)}.property-drawer-modern .el-table .el-table__header-wrapper th{background:var(--wf-bg-white, #fff)!important;color:var(--wf-text-regular, #606266);font-weight:600;font-size:13px}.property-drawer-modern .el-table .el-table__row{transition:background-color .2s ease}.property-drawer-modern .el-table .el-table__row>td:first-child{position:relative}.property-drawer-modern .el-table .el-table__row>td:first-child:before{content:"";position:absolute;left:0;top:50%;transform:translateY(-50%);width:3px;height:0;background:var(--wf-primary, #409eff);border-radius:0 2px 2px 0;transition:height .25s ease}.property-drawer-modern .el-table .el-table__row:hover>td:first-child:before{height:60%}.property-drawer-modern .el-table .el-table__row:hover>td{background-color:var(--wf-primary-light, #ecf5ff)!important}.property-drawer-modern .el-table .el-button--danger.is-link{color:var(--wf-danger, #f56c6c);padding:5px;height:auto;border:none;transition:all .2s ease}.property-drawer-modern .el-table .el-button--danger.is-link:hover{color:#e04848;background:#f56c6c1f!important;border-radius:8px}.property-drawer-modern .el-table .el-input__wrapper,.property-drawer-modern .el-table .el-select .el-input__wrapper{background-color:transparent}.property-drawer-modern .el-table .el-input__wrapper:hover,.property-drawer-modern .el-table .el-select .el-input__wrapper:hover{background-color:#76809612}.property-drawer-modern .el-table .el-input__wrapper.is-focus,.property-drawer-modern .el-table .el-select .el-input__wrapper.is-focus{background-color:var(--wf-bg-white, #fff)}html.dark .property-drawer-modern .el-drawer{--el-drawer-bg-color: var(--wf-bg-color, #141414) !important;--el-bg-color: var(--wf-bg-color, #141414) !important;background-color:var(--wf-bg-color, #141414)!important}html.dark .property-drawer-modern .el-drawer__header{margin-bottom:0!important;padding-bottom:12px!important;background:var(--wf-bg-color, #141414)!important;border-bottom:1px solid var(--wf-border-color, #2a2a2a)!important}html.dark .property-drawer-modern .el-drawer__header>span{color:var(--wf-text-primary, #e0e0e0)!important;font-weight:600}html.dark .property-drawer-modern .el-drawer__body{background-color:var(--wf-bg-color, #141414)!important;margin-top:0!important}html.dark .property-drawer-modern .el-drawer__close-btn{color:var(--wf-text-secondary, #888888)!important}html.dark .property-drawer-modern .el-drawer__close-btn:hover{color:#409eff!important}html.dark .property-drawer-modern.el-drawer,html.dark .property-drawer-modern.el-drawer__wrapper,html.dark .property-drawer-modern .v-modal+.el-overlay .el-drawer{--el-drawer-bg-color: var(--wf-bg-color, #141414) !important;background-color:var(--wf-bg-color, #141414)!important}html.dark .property-drawer-modern .el-input__wrapper,html.dark .property-drawer-modern .el-textarea__inner{background-color:#ffffff0f!important;box-shadow:none!important;border:1px solid transparent!important}html.dark .property-drawer-modern .el-input__wrapper.is-focus{border-color:var(--wf-primary, #409eff)!important;box-shadow:0 0 0 4px #409eff2e!important}html.dark .property-drawer-modern .el-table{border-color:var(--wf-border-color, #333333)}html.dark .property-drawer-modern .el-table .el-table__header-wrapper th{background:#ffffff0a!important;color:var(--wf-text-regular, #b0b0b0)}html.dark .property-drawer-modern .el-table .el-table__row:hover>td{background-color:#409eff1f!important}html.dark .el-dialog{--el-dialog-bg-color: var(--wf-bg-white, #1f1f1f)}html.dark .el-dialog__header{background:linear-gradient(135deg,#409eff14,#2b7de90a);border-bottom:1px solid var(--wf-border-color, #333333)}html.dark .el-dialog__title{color:var(--wf-text-primary, #e0e0e0)}html.dark .el-dialog__body{color:var(--wf-text-regular, #b0b0b0)}html.dark .el-dialog__headerbtn{color:var(--wf-text-secondary, #888888)}html.dark .el-dialog__headerbtn:hover{color:var(--wf-text-primary, #e0e0e0)}.base-node[data-v-91732d9e]{width:100%;height:80px;box-sizing:border-box;border-radius:10px;background:var(--wf-bg-white, #fff);box-shadow:0 6px 18px #0000001a,0 1px 4px #0000000d;overflow:hidden}.top-section[data-v-91732d9e]{position:relative;font-size:13px;padding:10px;height:25px;display:flex;align-items:center;color:#fff}.top-section .edit-icon path[data-v-91732d9e]{fill:#fff}.delete-btn[data-v-91732d9e]{position:absolute;right:8px;top:50%;transform:translateY(-50%);display:block;color:#fff}.bottom-section[data-v-91732d9e]{padding:10px;height:100%;font-size:14px;color:var(--wf-text-primary, #303133)}.edit-icon[data-v-91732d9e]{vertical-align:middle;margin:3px}.tooltip-container[data-v-847b32a6]{display:grid;grid-template-columns:repeat(2,1fr);gap:2px;width:100%}.tooltip-item[data-v-847b32a6]{display:flex;align-items:center;gap:8px;padding:7px 14px 7px 8px;cursor:pointer;border-radius:8px;white-space:nowrap;transition:background-color .18s ease}.tooltip-item[data-v-847b32a6][data-v-847b32a6]:hover{background-color:var(--wf-primary-lighter, #f0f7ff)}html.dark .tooltip-item[data-v-847b32a6][data-v-847b32a6][data-v-847b32a6]:hover,.tooltip-item[data-v-847b32a6] html.dark[data-v-847b32a6]:hover{background-color:#409eff1f}.tooltip-item span[data-v-847b32a6]{font-size:13px;white-space:nowrap}.tooltip-icon[data-v-847b32a6]{flex:0 0 auto;display:flex;align-items:center;justify-content:center;width:30px;height:30px;background:var(--wf-primary-light, #ecf5ff);border-radius:50%;transition:all .18s ease}.tooltip-icon[data-v-847b32a6] svg[data-v-847b32a6]{width:17px;height:17px}html.dark .tooltip-icon[data-v-847b32a6][data-v-847b32a6],.tooltip-icon[data-v-847b32a6] html.dark{background:#409eff29}@media (max-width: 768px){.tooltip-item[data-v-847b32a6]{padding:7px 12px 7px 7px}.tooltip-icon[data-v-847b32a6]{width:28px;height:28px}.tooltip-icon[data-v-847b32a6] svg[data-v-847b32a6]{width:15px;height:15px}}@media (max-width: 480px){.tooltip-container[data-v-847b32a6]{grid-template-columns:1fr}}.diagram-sidebar[data-v-dcaf3788]{position:absolute;left:12px;top:70px;width:76px;border-radius:14px;background:var(--wf-sidebar-bg, rgba(255, 255, 255, .95));backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid var(--wf-border-light, rgba(226, 232, 240, .8));box-shadow:0 4px 24px #0000000f,0 1px 4px #0000000a;display:flex;flex-direction:column;z-index:10;-webkit-user-select:none;user-select:none;overflow:hidden;transition:box-shadow .25s ease}.diagram-sidebar[data-v-dcaf3788]:hover{box-shadow:0 8px 32px #00000014,0 2px 8px #0000000a}.sidebar-header[data-v-dcaf3788]{padding:12px 4px 8px;border-bottom:1px solid var(--wf-border-light, #f1f5f9)}.sidebar-title[data-v-dcaf3788]{font-size:13px;font-weight:600;color:var(--wf-text-primary, #303133);text-align:center;letter-spacing:2px}.sidebar-content[data-v-dcaf3788]{flex:1;overflow-y:auto;overflow-x:hidden;padding:8px 6px 10px}.sidebar-content[data-v-dcaf3788][data-v-dcaf3788]::-webkit-scrollbar{width:3px}.sidebar-content[data-v-dcaf3788][data-v-dcaf3788]::-webkit-scrollbar-thumb{background:#e2e8f0;border-radius:3px}.node-group[data-v-dcaf3788]{display:flex;flex-direction:column;gap:2px}.sidebar-divider[data-v-dcaf3788]{height:1px;margin:8px;background:linear-gradient(90deg,transparent,var(--wf-border-light, #e2e8f0) 30%,var(--wf-border-light, #e2e8f0) 70%,transparent)}.group-header[data-v-dcaf3788]{padding:6px 0 4px}.group-title[data-v-dcaf3788]{font-size:12px;font-weight:600;color:var(--wf-text-primary, #303133);text-align:center;letter-spacing:2px}.sidebar-item[data-v-dcaf3788]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:7px 4px;cursor:grab;border-radius:10px;transition:all .2s cubic-bezier(.4,0,.2,1);position:relative}.sidebar-item[data-v-dcaf3788]:hover{background:linear-gradient(135deg,#3b82f614,#6366f10f);transform:translateY(-1px)}.sidebar-item[data-v-dcaf3788]:hover .item-icon-wrap[data-v-dcaf3788]{transform:scale(1.08)}.sidebar-item[data-v-dcaf3788]:hover .item-label[data-v-dcaf3788]{color:var(--wf-primary, #409eff);font-weight:500}.sidebar-item[data-v-dcaf3788]:active{cursor:grabbing;transform:translateY(0) scale(.97);background:linear-gradient(135deg,#3b82f61f,#6366f114)}.item-icon-wrap[data-v-dcaf3788]{width:34px;height:34px;display:flex;align-items:center;justify-content:center;border-radius:9px;background:#f8fafc;transition:all .2s ease;position:relative}.item-icon-wrap[data-v-dcaf3788] [data-v-dcaf3788] svg{width:100%;height:100%;display:block}.item-start .item-icon-wrap[data-v-dcaf3788]{background:linear-gradient(135deg,#ecfdf5,#d1fae5)}.item-between .item-icon-wrap[data-v-dcaf3788]{background:linear-gradient(135deg,#eff6ff,#dbeafe)}.item-end .item-icon-wrap[data-v-dcaf3788]{background:linear-gradient(135deg,#fef2f2,#fee2e2)}.item-serial .item-icon-wrap[data-v-dcaf3788]{background:linear-gradient(135deg,#fffbeb,#fef3c7)}.item-parallel .item-icon-wrap[data-v-dcaf3788]{background:linear-gradient(135deg,#ecfeff,#cffafe)}.item-inclusive .item-icon-wrap[data-v-dcaf3788]{background:linear-gradient(135deg,#faf5ff,#f3e8ff)}.item-label[data-v-dcaf3788]{font-size:12px;color:var(--wf-text-regular, #606266);text-align:center;margin-top:5px;line-height:1.3;word-break:break-word;max-width:68px;transition:all .2s ease;letter-spacing:.3px}html.dark .diagram-sidebar[data-v-dcaf3788]{background:var(--wf-sidebar-bg, rgba(30, 30, 35, .92));border-color:var(--wf-border-color, rgba(60, 60, 70, .6));box-shadow:0 4px 24px #0000004d,0 1px 4px #0003}html.dark .diagram-sidebar[data-v-dcaf3788]:hover{box-shadow:0 8px 32px #0006,0 2px 8px #0003}html.dark .sidebar-header[data-v-dcaf3788],html.dark .group-header[data-v-dcaf3788]{border-bottom-color:var(--wf-border-color, #333)}html.dark .sidebar-title[data-v-dcaf3788],html.dark .group-title[data-v-dcaf3788]{color:var(--wf-text-primary, #e0e0e0)}html.dark .sidebar-divider[data-v-dcaf3788]{background:linear-gradient(90deg,transparent,var(--wf-border-color, #333) 30%,var(--wf-border-color, #333) 70%,transparent)}html.dark .item-icon-wrap[data-v-dcaf3788]{background:var(--wf-bg-color, #222)!important}html.dark .diagram-sidebar[data-v-dcaf3788]{--wf-icon-bg: #1e2028}html.dark .sidebar-item[data-v-dcaf3788]:hover{background:linear-gradient(135deg,#3b82f626,#6366f11a)}html.dark .item-label[data-v-dcaf3788]{color:var(--wf-text-regular, #c0c4cc)}html.dark .sidebar-item:hover .item-label[data-v-dcaf3788]{color:var(--wf-primary, #409eff)}@media (max-width: 1024px){.diagram-sidebar[data-v-dcaf3788]{left:8px;top:48px;width:72px;border-radius:12px}.sidebar-header[data-v-dcaf3788]{padding:10px 4px 6px}.sidebar-title[data-v-dcaf3788]{font-size:12px;letter-spacing:1.5px}.group-header[data-v-dcaf3788]{padding:5px 0 3px}.group-title[data-v-dcaf3788]{font-size:11px;letter-spacing:1.5px}.sidebar-item[data-v-dcaf3788]{padding:7px 3px}.item-icon-wrap[data-v-dcaf3788]{width:32px;height:32px;border-radius:8px}.item-label[data-v-dcaf3788]{font-size:11px;max-width:64px}}@media (max-width: 768px){.diagram-sidebar[data-v-dcaf3788]{left:6px;top:42px;width:62px;border-radius:10px}.sidebar-header[data-v-dcaf3788]{padding:8px 2px 5px}.sidebar-title[data-v-dcaf3788]{font-size:11px;letter-spacing:1px}.group-header[data-v-dcaf3788]{padding:4px 0 2px}.group-title[data-v-dcaf3788]{font-size:10px;letter-spacing:1px}.sidebar-content[data-v-dcaf3788]{padding:6px 4px 8px}.sidebar-item[data-v-dcaf3788]{padding:6px 2px;border-radius:8px}.item-icon-wrap[data-v-dcaf3788]{width:28px;height:28px;border-radius:7px}.item-label[data-v-dcaf3788]{font-size:10px;max-width:56px;margin-top:4px}.sidebar-divider[data-v-dcaf3788]{margin:6px}}.container{flex:1;width:100%;height:calc(100dvh - 100px);min-height:400px;border-radius:var(--wf-radius, 8px);box-shadow:inset 0 2px 8px #0000000a;overflow:hidden;touch-action:none;position:relative}@supports not (height: 100dvh){.container{height:calc(100vh - 100px);height:calc(-webkit-fill-available - 100px)}}.container :deep(.lf-canvas-overlay),.container :deep(.lf-graph){touch-action:none}.container :deep(svg){display:block!important;width:100%!important;height:100%!important}.container :deep(.lf-container-bg){display:block!important}html.dark .container{background-color:var(--wf-bg-color)!important;box-shadow:inset 0 2px 8px #00000040!important;border:1px solid var(--wf-border-color)!important}.logo-text{position:absolute;font-weight:700;right:50px;bottom:10px;font-size:14px;color:var(--wf-text-placeholder, #c0c4cc);opacity:.5;z-index:1;letter-spacing:1px;-webkit-user-select:none;user-select:none}.design-header{position:relative;display:flex;align-items:center;justify-content:space-between;padding:12px 20px;background:var(--wf-bg-white, #fff);border-bottom:1px solid #e2e8f0;min-height:56px}.header-left{flex:0 0 auto;min-width:180px}.header-center{position:absolute;left:50%;transform:translate(-50%);display:flex;justify-content:center}.header-right{flex:0 0 auto;min-width:120px;display:flex;justify-content:flex-end}.flow-name-wrapper{display:flex;align-items:center}.flow-name{font-weight:600;font-size:15px;max-width:300px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#1e293b;padding:8px 16px;background:var(--wf-bg-white, #fff);border-radius:8px;border:1px solid var(--wf-border-light, #e2e8f0);cursor:default;transition:all .2s ease}html.dark .flow-name{color:var(--wf-text-primary)!important}.flow-name:hover{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61a}.steps-tabs{display:flex;gap:4px;padding:4px;background:var(--wf-bg-white, #fff);border-radius:12px;box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}html.dark .steps-tabs{background:var(--wf-bg-color)!important}.step-tab{display:flex;align-items:center;gap:8px;padding:10px 28px;cursor:pointer;border-radius:8px;font-size:14px;font-weight:500;color:#64748b;background:transparent;border:none;transition:all .25s cubic-bezier(.4,0,.2,1);-webkit-user-select:none;user-select:none}.step-tab:hover{color:var(--wf-primary, #409eff);background:var(--wf-primary-light, #ecf5ff)}.step-tab .tab-icon{width:18px;height:18px;opacity:.7;transition:opacity .2s ease}.step-tab:hover .tab-icon{opacity:1}.step-tab.active{color:#fff;background:var(--wf-primary, #409eff);box-shadow:0 2px 8px #409eff47}.step-tab.active .tab-icon{opacity:1}.step-tab.active:hover{background:var(--wf-primary-dark, #2b7de9)}.save-btn{display:flex;align-items:center;gap:6px;background:var(--wf-primary, #409eff)!important;border:none!important;color:#fff!important;font-weight:500;font-size:14px;padding:9px 22px!important;border-radius:10px!important;box-shadow:0 2px 8px #409eff47;transition:all .2s ease!important}.save-btn:hover{background:var(--wf-primary-dark, #2b7de9)!important}.save-btn>span{display:inline-flex;align-items:center;gap:6px}.save-btn .save-icon{width:16px;height:16px}html.dark .design-header{background:var(--wf-bg-white);border-bottom-color:var(--wf-border-color)}html.dark .save-btn,html.dark .toolbar-save-btn{background:var(--wf-primary, #409eff)!important;box-shadow:none!important}html.dark .save-btn:hover,html.dark .toolbar-save-btn:hover{background:var(--wf-primary-dark, #2b7de9)!important}html.dark .el-header{--el-bg-color: var(--wf-bg-white);background-color:var(--wf-bg-white)}html.dark .toolbar-group{border-right-color:var(--wf-border-color)}html.dark .toolbar-group .el-button{--el-button-bg-color: var(--wf-bg-color);--el-button-text-color: var(--wf-text-primary);--el-border-color: var(--wf-border-color);color:var(--wf-text-primary);background-color:transparent;border-color:var(--wf-border-color)}html.dark .toolbar-group .el-button:hover,html.dark .toolbar-group .el-button:focus{color:var(--wf-primary);background-color:#409eff1f;border-color:var(--wf-primary)}html.dark .steps-tabs{background:var(--wf-bg-color);box-shadow:0 1px 3px #0000004d}html.dark .step-tab{color:var(--wf-text-regular)}html.dark .step-tab:hover{color:var(--wf-primary);background:#60a5fa1a}html.dark .logo-text{color:var(--wf-text-secondary)}.toolbar-group{display:inline-flex;align-items:center;gap:4px;padding-right:12px;margin-right:12px;border-right:1px solid #e2e8f0}.toolbar-group .el-button{padding:6px 8px}.toolbar-group:last-child{border-right:none;padding-right:0;margin-right:0}.toolbar-save-btn{background:var(--wf-primary, #409eff)!important;border:none!important;color:#fff!important;font-weight:500;border-radius:8px!important;box-shadow:none;transition:background-color .2s ease!important}.toolbar-save-btn:hover{background:var(--wf-primary-dark, #2b7de9)!important}@media (max-width: 1024px){.design-header{padding:10px 12px;min-height:50px}.header-left{min-width:120px}.header-right{min-width:80px}.step-tab{padding:8px 18px;font-size:13px;gap:6px}.step-tab .tab-icon{width:16px;height:16px}.steps-tabs{gap:2px;padding:3px}.flow-name{max-width:180px;font-size:14px;padding:6px 12px}.save-btn{padding:8px 16px!important;font-size:13px}.toolbar-group{gap:2px;padding-right:8px;margin-right:8px}.design-toolbar{text-align:right!important;padding-right:8px!important;padding-left:0!important}.logo-text{display:none}}@media (max-width: 768px){.design-header{padding:6px 8px;min-height:44px}.header-left{min-width:auto;flex:0 0 auto;overflow:hidden;max-width:30%}.header-center{position:static;left:auto;transform:none;flex:1 1 auto;justify-content:center}.header-right{min-width:auto;flex:0 0 auto;justify-content:flex-end}.steps-tabs{gap:2px;border-radius:8px}.step-tab{padding:6px 12px;font-size:12px;gap:4px;border-radius:6px}.step-tab .tab-icon{width:15px;height:15px}.step-tab.active{box-shadow:0 2px 6px #3b82f640}.flow-name{max-width:120px;font-size:12px;padding:4px 8px;border-radius:6px}.save-btn{padding:6px 10px!important;font-size:12px;border-radius:8px!important;box-shadow:0 2px 6px #10b98133}.save-btn .save-icon{width:14px;height:14px}.design-toolbar{text-align:right!important;white-space:nowrap!important;display:block!important;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;-ms-overflow-style:none;padding-right:16px!important;padding-left:0!important}.design-toolbar::-webkit-scrollbar{display:none}.toolbar-group{display:inline-flex;flex-wrap:nowrap;gap:0;padding-right:0;margin-right:0;border-right:none;vertical-align:middle}.toolbar-group .el-button{padding:4px!important}.container{height:calc(100dvh - 90px);min-height:300px}}@media (max-width: 480px){.design-header{padding:4px 6px;min-height:36px}.step-tab{padding:4px 10px;font-size:11px;gap:2px;border-radius:5px}.step-tab .tab-icon{width:13px;height:13px}.flow-name{max-width:70px;font-size:11px;padding:3px 5px;border-radius:4px}.flow-name svg{display:none}.save-btn{padding:4px 7px!important;font-size:11px;gap:2px;border-radius:6px!important}.save-btn .save-icon{width:12px;height:12px}.toolbar-group{padding-right:2px;margin-right:2px;border-right:none;gap:2px}.el-header[style*=right]{right:8px!important;left:44px!important}.container{height:calc(100dvh - 75px);min-height:220px}}html.dark{background-color:var(--wf-bg-color)!important}.flow-chart-root[data-v-81f550b3]{width:100%;height:100%;display:flex;flex-direction:column;overflow:hidden}.containerView[data-v-81f550b3]{width:100%;flex:1;min-height:0;touch-action:none}.containerView[data-v-81f550b3] .lf-canvas-overlay,.containerView[data-v-81f550b3] .lf-graph{touch-action:none}.chart-toolbar[data-v-81f550b3]{display:flex;align-items:center;width:100%;padding:5px 0}.toolbar-left[data-v-81f550b3]{flex-shrink:0}.toolbar-center[data-v-81f550b3]{flex:1;display:flex;align-items:center;justify-content:center;gap:4px}.toolbar-right[data-v-81f550b3]{flex-shrink:0;display:flex;align-items:center;gap:4px;margin-right:12px}.flow-name-badge[data-v-81f550b3]{font-weight:600;padding:4px 12px;font-size:14px;white-space:nowrap}.log-text[data-v-81f550b3]{position:absolute;font-weight:700;right:10px;bottom:10px;font-size:15px;color:var(--wf-text-primary, #333);z-index:1}html.dark .log-text[data-v-81f550b3]{color:var(--wf-text-secondary, #888888)}html.dark{background-color:var(--wf-bg-white)}html.dark{--el-button-text-color: #ffffff;--el-button-hover-text-color: #ffffff;--el-button-bg-color: transparent;--el-button-hover-bg-color: transparent;--el-button-border-color: transparent;color:#fff;background-color:transparent;border-color:transparent}html.dark[data-v-81f550b3]:hover,html.dark[data-v-81f550b3]:focus{color:var(--wf-primary);background-color:#409eff14}html.dark{--el-button-bg-color: var(--wf-bg-color);--el-button-text-color: #ffffff;--el-border-color: var(--wf-border-color);color:#fff;background-color:transparent;border-color:var(--wf-border-color)}html.dark .el-icon[data-v-81f550b3],html.dark svg[data-v-81f550b3],html.dark i[data-v-81f550b3]{color:#fff!important}html.dark[data-v-81f550b3]:hover,html.dark[data-v-81f550b3]:focus{color:var(--wf-primary);background-color:#409eff1f;border-color:var(--wf-primary)}html.dark[data-v-81f550b3]:hover .el-icon[data-v-81f550b3],html.dark[data-v-81f550b3]:hover svg[data-v-81f550b3],html.dark[data-v-81f550b3]:hover i[data-v-81f550b3],html.dark[data-v-81f550b3]:focus .el-icon[data-v-81f550b3],html.dark[data-v-81f550b3]:focus svg[data-v-81f550b3],html.dark[data-v-81f550b3]:focus i[data-v-81f550b3]{color:var(--wf-primary)!important}html.dark{background-color:var(--wf-tooltip-bg, #1f1f1f)!important;border-color:var(--wf-tooltip-border, #333333)!important;color:#fff!important}html.dark .el-popper__arrow[data-v-81f550b3]:before{background-color:var(--wf-tooltip-bg, #1f1f1f)!important;border-color:var(--wf-tooltip-border, #333333)!important}html.dark{color:#fff}html.dark{--el-bg-color: var(--wf-bg-white);--el-fill-color-blank: var(--wf-bg-white);background-color:var(--wf-bg-white)}@media (max-width: 768px){.chart-toolbar[data-v-81f550b3]{display:flex!important;align-items:center!important;justify-content:flex-start!important;width:100%!important;padding:0!important;flex-wrap:nowrap!important;gap:6px!important;margin-left:-8px}.toolbar-left[data-v-81f550b3]{margin-left:0!important;padding-left:0!important}.flow-name-badge[data-v-81f550b3]{font-size:12px!important;padding:2px 6px!important;font-weight:400!important}.toolbar-center[data-v-81f550b3]{display:none!important}.toolbar-right[data-v-81f550b3]{margin-left:auto!important;gap:4px!important;margin-right:0!important;flex-shrink:0!important}.toolbar-right[data-v-81f550b3] .el-button{padding:4px 6px!important;min-width:30px!important;min-height:30px!important;display:flex!important;align-items:center!important;justify-content:center!important}.chart-toolbar-mobile-status[data-v-81f550b3]{display:flex!important;justify-content:center;align-items:center;gap:6px;padding:4px 0;border-top:1px solid var(--el-border-color-lighter, #ebeef5)}.chart-toolbar-mobile-status[data-v-81f550b3] html.dark .chart-toolbar-mobile-status[data-v-81f550b3]{border-top-color:#ffffff1a}.chart-toolbar-mobile-status[data-v-81f550b3] .el-button{font-size:11px;padding:3px 8px}.chart-toolbar-mobile-status[data-v-81f550b3] .el-button html.dark .chart-toolbar-mobile-status[data-v-81f550b3] .el-button{--el-button-text-color: #ffffff;color:#fff}}.chart-toolbar-mobile-status[data-v-81f550b3]{display:none}[data-v-fd5df4ef] .container{width:100%}[data-v-fd5df4ef] .container .fcDesigner{height:100vh}[data-v-fd5df4ef] .container .fcDesigner .el-aside{padding:0;background:#fff;height:100%}.sub-el-icon,.nav-icon{display:inline-block;font-size:15px;margin-right:12px;position:relative}.svg-icon{width:1em;height:1em;position:relative;fill:currentColor;vertical-align:-2px} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/warm-flow-ui/ico/favicon-FqvijpIH.ico b/ruoyi-modules/ruoyi-workflow/src/main/resources/warm-flow-ui/ico/favicon-FqvijpIH.ico new file mode 100644 index 000000000..d9c954356 Binary files /dev/null and b/ruoyi-modules/ruoyi-workflow/src/main/resources/warm-flow-ui/ico/favicon-FqvijpIH.ico differ diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/warm-flow-ui/index.html b/ruoyi-modules/ruoyi-workflow/src/main/resources/warm-flow-ui/index.html new file mode 100644 index 000000000..c968184b0 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/warm-flow-ui/index.html @@ -0,0 +1,228 @@ + + + + + + + + + + Warm-Flow设计器 + + + + + + + +

+
+
+
+
+
正在加载设计器中
+
+
+ + + diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/warm-flow-ui/js/index-BTmmNT3K.js b/ruoyi-modules/ruoyi-workflow/src/main/resources/warm-flow-ui/js/index-BTmmNT3K.js new file mode 100644 index 000000000..ffb7b169f --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/warm-flow-ui/js/index-BTmmNT3K.js @@ -0,0 +1,1401 @@ +var _Z=Object.defineProperty;var bZ=(e,t,n)=>t in e?_Z(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var wZ=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var tf=(e,t,n)=>(bZ(e,typeof t!="symbol"?t+"":t,n),n);var amt=wZ((rl,ol)=>{(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))r(o);new MutationObserver(o=>{for(const i of o)if(i.type==="childList")for(const a of i.addedNodes)a.tagName==="LINK"&&a.rel==="modulepreload"&&r(a)}).observe(document,{childList:!0,subtree:!0});function n(o){const i={};return o.integrity&&(i.integrity=o.integrity),o.referrerPolicy&&(i.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?i.credentials="include":o.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function r(o){if(o.ep)return;o.ep=!0;const i=n(o);fetch(o.href,i)}})();function l9(e,t){const n=Object.create(null),r=e.split(",");for(let o=0;o!!n[o.toLowerCase()]:o=>!!n[o]}const Jr={},Vh=[],ur=()=>{},xZ=()=>!1,CZ=/^on[^a-z]/,R4=e=>CZ.test(e),s9=e=>e.startsWith("onUpdate:"),Jo=Object.assign,u9=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},EZ=Object.prototype.hasOwnProperty,On=(e,t)=>EZ.call(e,t),Ot=Array.isArray,Hh=e=>c1(e)==="[object Map]",P4=e=>c1(e)==="[object Set]",Yf=e=>c1(e)==="[object Date]",Kt=e=>typeof e=="function",Qt=e=>typeof e=="string",r0=e=>typeof e=="symbol",yn=e=>e!==null&&typeof e=="object",gg=e=>(yn(e)||Kt(e))&&Kt(e.then)&&Kt(e.catch),PL=Object.prototype.toString,c1=e=>PL.call(e),Iy=e=>c1(e).slice(8,-1),W_=e=>c1(e)==="[object Object]",c9=e=>Qt(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,$y=l9(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),B4=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},AZ=/-(\w)/g,Nl=B4(e=>e.replace(AZ,(t,n)=>n?n.toUpperCase():"")),SZ=/\B([A-Z])/g,Td=B4(e=>e.replace(SZ,"-$1").toLowerCase()),d1=B4(e=>e.charAt(0).toUpperCase()+e.slice(1)),zy=B4(e=>e?`on${d1(e)}`:""),Gf=(e,t)=>!Object.is(e,t),Vy=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},rx=e=>{const t=parseFloat(e);return isNaN(t)?e:t},kZ=e=>{const t=Qt(e)?Number(e):NaN;return isNaN(t)?e:t};let JT;const ox=()=>JT||(JT=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function wt(e){if(Ot(e)){const t={};for(let n=0;n{if(n){const r=n.split(MZ);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function ie(e){let t="";if(Qt(e))t=e;else if(Ot(e))for(let n=0;no0(n,t))}const Re=e=>Qt(e)?e:e==null?"":Ot(e)||yn(e)&&(e.toString===PL||!Kt(e.toString))?JSON.stringify(e,IL,2):String(e),IL=(e,t)=>t&&t.__v_isRef?IL(e,t.value):Hh(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,o])=>(n[`${r} =>`]=o,n),{})}:P4(t)?{[`Set(${t.size})`]:[...t.values()]}:yn(t)&&!Ot(t)&&!W_(t)?String(t):t;let Za;class $L{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this.parent=Za,!t&&Za&&(this.index=(Za.scopes||(Za.scopes=[])).push(this)-1)}get active(){return this._active}run(t){if(this._active){const n=Za;try{return Za=this,t()}finally{Za=n}}}on(){Za=this}off(){Za=this.parent}stop(t){if(this._active){let n,r;for(n=0,r=this.effects.length;n{const t=new Set(e);return t.w=0,t.n=0,t},zL=e=>(e.w&hd)>0,VL=e=>(e.n&hd)>0,BZ=({deps:e})=>{if(e.length)for(let t=0;t{const{deps:t}=e;if(t.length){let n=0;for(let r=0;r{(c==="length"||!r0(c)&&c>=s)&&l.push(u)})}else switch(n!==void 0&&l.push(a.get(n)),t){case"add":Ot(e)?c9(n)&&l.push(a.get("length")):(l.push(a.get(If)),Hh(e)&&l.push(a.get(ax)));break;case"delete":Ot(e)||(l.push(a.get(If)),Hh(e)&&l.push(a.get(ax)));break;case"set":Hh(e)&&l.push(a.get(If));break}if(l.length===1)l[0]&&lx(l[0]);else{const s=[];for(const u of l)u&&s.push(...u);lx(f9(s))}}function lx(e,t){const n=Ot(e)?e:[...e];for(const r of n)r.computed&&tM(r);for(const r of n)r.computed||tM(r)}function tM(e,t){(e!==ss||e.allowRecurse)&&(e.scheduler?e.scheduler():e.run())}function IZ(e,t){var n;return(n=K_.get(e))==null?void 0:n.get(t)}const $Z=l9("__proto__,__v_isRef,__isVue"),WL=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(r0)),nM=zZ();function zZ(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const r=Qn(this);for(let i=0,a=this.length;i{e[t]=function(...n){H0();const r=Qn(this)[t].apply(this,n);return j0(),r}}),e}function VZ(e){const t=Qn(this);return Pa(t,"has",e),t.hasOwnProperty(e)}class UL{constructor(t=!1,n=!1){this._isReadonly=t,this._shallow=n}get(t,n,r){const o=this._isReadonly,i=this._shallow;if(n==="__v_isReactive")return!o;if(n==="__v_isReadonly")return o;if(n==="__v_isShallow")return i;if(n==="__v_raw"&&r===(o?i?eJ:qL:i?GL:YL).get(t))return t;const a=Ot(t);if(!o){if(a&&On(nM,n))return Reflect.get(nM,n,r);if(n==="hasOwnProperty")return VZ}const l=Reflect.get(t,n,r);return(r0(n)?WL.has(n):$Z(n))||(o||Pa(t,"get",n),i)?l:Nn(l)?a&&c9(n)?l:l.value:yn(l)?o?pp(l):gn(l):l}}class KL extends UL{constructor(t=!1){super(!1,t)}set(t,n,r,o){let i=t[n];if(i0(i)&&Nn(i)&&!Nn(r))return!1;if(!this._shallow&&(!Y_(r)&&!i0(r)&&(i=Qn(i),r=Qn(r)),!Ot(t)&&Nn(i)&&!Nn(r)))return i.value=r,!0;const a=Ot(t)&&c9(n)?Number(n)e,$4=e=>Reflect.getPrototypeOf(e);function E2(e,t,n=!1,r=!1){e=e.__v_raw;const o=Qn(e),i=Qn(t);n||(Gf(t,i)&&Pa(o,"get",t),Pa(o,"get",i));const{has:a}=$4(o),l=r?h9:n?g9:yg;if(a.call(o,t))return l(e.get(t));if(a.call(o,i))return l(e.get(i));e!==o&&e.get(t)}function A2(e,t=!1){const n=this.__v_raw,r=Qn(n),o=Qn(e);return t||(Gf(e,o)&&Pa(r,"has",e),Pa(r,"has",o)),e===o?n.has(e):n.has(e)||n.has(o)}function S2(e,t=!1){return e=e.__v_raw,!t&&Pa(Qn(e),"iterate",If),Reflect.get(e,"size",e)}function rM(e){e=Qn(e);const t=Qn(this);return $4(t).has.call(t,e)||(t.add(e),Ku(t,"add",e,e)),this}function oM(e,t){t=Qn(t);const n=Qn(this),{has:r,get:o}=$4(n);let i=r.call(n,e);i||(e=Qn(e),i=r.call(n,e));const a=o.call(n,e);return n.set(e,t),i?Gf(t,a)&&Ku(n,"set",e,t):Ku(n,"add",e,t),this}function iM(e){const t=Qn(this),{has:n,get:r}=$4(t);let o=n.call(t,e);o||(e=Qn(e),o=n.call(t,e)),r&&r.call(t,e);const i=t.delete(e);return o&&Ku(t,"delete",e,void 0),i}function aM(){const e=Qn(this),t=e.size!==0,n=e.clear();return t&&Ku(e,"clear",void 0,void 0),n}function k2(e,t){return function(r,o){const i=this,a=i.__v_raw,l=Qn(a),s=t?h9:e?g9:yg;return!e&&Pa(l,"iterate",If),a.forEach((u,c)=>r.call(o,s(u),s(c),i))}}function T2(e,t,n){return function(...r){const o=this.__v_raw,i=Qn(o),a=Hh(i),l=e==="entries"||e===Symbol.iterator&&a,s=e==="keys"&&a,u=o[e](...r),c=n?h9:t?g9:yg;return!t&&Pa(i,"iterate",s?ax:If),{next(){const{value:d,done:f}=u.next();return f?{value:d,done:f}:{value:l?[c(d[0]),c(d[1])]:c(d),done:f}},[Symbol.iterator](){return this}}}}function Dc(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function KZ(){const e={get(i){return E2(this,i)},get size(){return S2(this)},has:A2,add:rM,set:oM,delete:iM,clear:aM,forEach:k2(!1,!1)},t={get(i){return E2(this,i,!1,!0)},get size(){return S2(this)},has:A2,add:rM,set:oM,delete:iM,clear:aM,forEach:k2(!1,!0)},n={get(i){return E2(this,i,!0)},get size(){return S2(this,!0)},has(i){return A2.call(this,i,!0)},add:Dc("add"),set:Dc("set"),delete:Dc("delete"),clear:Dc("clear"),forEach:k2(!0,!1)},r={get(i){return E2(this,i,!0,!0)},get size(){return S2(this,!0)},has(i){return A2.call(this,i,!0)},add:Dc("add"),set:Dc("set"),delete:Dc("delete"),clear:Dc("clear"),forEach:k2(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(i=>{e[i]=T2(i,!1,!1),n[i]=T2(i,!0,!1),t[i]=T2(i,!1,!0),r[i]=T2(i,!0,!0)}),[e,n,t,r]}const[YZ,GZ,qZ,XZ]=KZ();function v9(e,t){const n=t?e?XZ:qZ:e?GZ:YZ;return(r,o,i)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_raw"?r:Reflect.get(On(n,o)&&o in r?n:r,o,i)}const QZ={get:v9(!1,!1)},ZZ={get:v9(!1,!0)},JZ={get:v9(!0,!1)},YL=new WeakMap,GL=new WeakMap,qL=new WeakMap,eJ=new WeakMap;function tJ(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function nJ(e){return e.__v_skip||!Object.isExtensible(e)?0:tJ(Iy(e))}function gn(e){return i0(e)?e:m9(e,!1,jZ,QZ,YL)}function z4(e){return m9(e,!1,UZ,ZZ,GL)}function pp(e){return m9(e,!0,WZ,JZ,qL)}function m9(e,t,n,r,o){if(!yn(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=o.get(e);if(i)return i;const a=nJ(e);if(a===0)return e;const l=new Proxy(e,a===2?r:n);return o.set(e,l),l}function ad(e){return i0(e)?ad(e.__v_raw):!!(e&&e.__v_isReactive)}function i0(e){return!!(e&&e.__v_isReadonly)}function Y_(e){return!!(e&&e.__v_isShallow)}function XL(e){return ad(e)||i0(e)}function Qn(e){const t=e&&e.__v_raw;return t?Qn(t):e}function eo(e){return U_(e,"__v_skip",!0),e}const yg=e=>yn(e)?gn(e):e,g9=e=>yn(e)?pp(e):e;function QL(e){id&&ss&&(e=Qn(e),jL(e.dep||(e.dep=f9())))}function y9(e,t){e=Qn(e);const n=e.dep;n&&lx(n)}function Nn(e){return!!(e&&e.__v_isRef===!0)}function ue(e){return ZL(e,!1)}function mr(e){return ZL(e,!0)}function ZL(e,t){return Nn(e)?e:new rJ(e,t)}class rJ{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:Qn(t),this._value=n?t:yg(t)}get value(){return QL(this),this._value}set value(t){const n=this.__v_isShallow||Y_(t)||i0(t);t=n?t:Qn(t),Gf(t,this._rawValue)&&(this._rawValue=t,this._value=n?t:yg(t),y9(this))}}function Gv(e){y9(e)}function w(e){return Nn(e)?e.value:e}const oJ={get:(e,t,n)=>w(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const o=e[t];return Nn(o)&&!Nn(n)?(o.value=n,!0):Reflect.set(e,t,n,r)}};function JL(e){return ad(e)?e:new Proxy(e,oJ)}function Kr(e){const t=Ot(e)?new Array(e.length):{};for(const n in e)t[n]=eI(e,n);return t}class iJ{constructor(t,n,r){this._object=t,this._key=n,this._defaultValue=r,this.__v_isRef=!0}get value(){const t=this._object[this._key];return t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return IZ(Qn(this._object),this._key)}}class aJ{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0}get value(){return this._getter()}}function Pn(e,t,n){return Nn(e)?e:Kt(e)?new aJ(e):yn(e)&&arguments.length>1?eI(e,t,n):ue(e)}function eI(e,t,n){const r=e[t];return Nn(r)?r:new iJ(e,t,n)}let lJ=class{constructor(t,n,r,o){this._setter=n,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this._dirty=!0,this.effect=new p9(t,()=>{this._dirty||(this._dirty=!0,y9(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!o,this.__v_isReadonly=r}get value(){const t=Qn(this);return QL(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}};function sJ(e,t,n=!1){let r,o;const i=Kt(e);return i?(r=e,o=ur):(r=e.get,o=e.set),new lJ(r,o,i||!o,n)}function tI(e,...t){}function ld(e,t,n,r){let o;try{o=r?e(...r):e()}catch(i){V4(i,t,n)}return o}function Al(e,t,n,r){if(Kt(e)){const i=ld(e,t,n,r);return i&&gg(i)&&i.catch(a=>{V4(a,t,n)}),i}const o=[];for(let i=0;i>>1,o=Di[r],i=bg(o);iGs&&Di.splice(t,1)}function fJ(e){Ot(e)?jh.push(...e):(!Lu||!Lu.includes(e,e.allowRecurse?_f+1:_f))&&jh.push(e),rI()}function lM(e,t=_g?Gs+1:0){for(;tbg(n)-bg(r)),_f=0;_fe.id==null?1/0:e.id,pJ=(e,t)=>{const n=bg(e)-bg(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function iI(e){sx=!1,_g=!0,Di.sort(pJ);try{for(Gs=0;GsQt(p)?p.trim():p)),d&&(o=n.map(rx))}let l,s=r[l=zy(t)]||r[l=zy(Nl(t))];!s&&i&&(s=r[l=zy(Td(t))]),s&&Al(s,e,6,o);const u=r[l+"Once"];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,Al(u,e,6,o)}}function aI(e,t,n=!1){const r=t.emitsCache,o=r.get(e);if(o!==void 0)return o;const i=e.emits;let a={},l=!1;if(!Kt(e)){const s=u=>{const c=aI(u,t,!0);c&&(l=!0,Jo(a,c))};!n&&t.mixins.length&&t.mixins.forEach(s),e.extends&&s(e.extends),e.mixins&&e.mixins.forEach(s)}return!i&&!l?(yn(e)&&r.set(e,null),null):(Ot(i)?i.forEach(s=>a[s]=null):Jo(a,i),yn(e)&&r.set(e,a),a)}function H4(e,t){return!e||!R4(t)?!1:(t=t.slice(2).replace(/Once$/,""),On(e,t[0].toLowerCase()+t.slice(1))||On(e,Td(t))||On(e,t))}let Zo=null,j4=null;function G_(e){const t=Zo;return Zo=e,j4=e&&e.type.__scopeId||null,t}function hp(e){j4=e}function vp(){j4=null}function Q(e,t=Zo,n){if(!t||e._n)return e;const r=(...o)=>{r._d&&wM(-1);const i=G_(t);let a;try{a=e(...o)}finally{G_(i),r._d&&wM(1)}return a};return r._n=!0,r._c=!0,r._d=!0,r}function sM(e){const{type:t,vnode:n,proxy:r,withProxy:o,props:i,propsOptions:[a],slots:l,attrs:s,emit:u,render:c,renderCache:d,data:f,setupState:p,ctx:v,inheritAttrs:m}=e;let y,g;const _=G_(e);try{if(n.shapeFlag&4){const C=o||r,E=C;y=Us(c.call(E,C,d,i,p,f,v)),g=s}else{const C=t;y=Us(C.length>1?C(i,{attrs:s,slots:l,emit:u}):C(i,null)),g=t.props?s:vJ(s)}}catch(C){Pm.length=0,V4(C,e,1),y=Y(oa)}let x=y;if(g&&m!==!1){const C=Object.keys(g),{shapeFlag:E}=x;C.length&&E&7&&(a&&C.some(s9)&&(g=mJ(g,a)),x=nc(x,g))}return n.dirs&&(x=nc(x),x.dirs=x.dirs?x.dirs.concat(n.dirs):n.dirs),n.transition&&(x.transition=n.transition),y=x,G_(_),y}const vJ=e=>{let t;for(const n in e)(n==="class"||n==="style"||R4(n))&&((t||(t={}))[n]=e[n]);return t},mJ=(e,t)=>{const n={};for(const r in e)(!s9(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function gJ(e,t,n){const{props:r,children:o,component:i}=e,{props:a,children:l,patchFlag:s}=t,u=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&s>=0){if(s&1024)return!0;if(s&16)return r?uM(r,a,u):!!a;if(s&8){const c=t.dynamicProps;for(let d=0;de.__isSuspense;function wJ(e,t){t&&t.pendingBranch?Ot(e)?t.effects.push(...e):t.effects.push(e):fJ(e)}function Oa(e,t){return C9(e,null,t)}const M2={};function Xe(e,t,n){return C9(e,t,n)}function C9(e,t,{immediate:n,deep:r,flush:o,onTrack:i,onTrigger:a}=Jr){var l;const s=L4()===((l=Ko)==null?void 0:l.scope)?Ko:null;let u,c=!1,d=!1;if(Nn(e)?(u=()=>e.value,c=Y_(e)):ad(e)?(u=()=>e,r=!0):Ot(e)?(d=!0,c=e.some(C=>ad(C)||Y_(C)),u=()=>e.map(C=>{if(Nn(C))return C.value;if(ad(C))return Tf(C);if(Kt(C))return ld(C,s,2)})):Kt(e)?t?u=()=>ld(e,s,2):u=()=>{if(!(s&&s.isUnmounted))return f&&f(),Al(e,s,3,[p])}:u=ur,t&&r){const C=u;u=()=>Tf(C())}let f,p=C=>{f=_.onStop=()=>{ld(C,s,4),f=_.onStop=void 0}},v;if(Ag)if(p=ur,t?n&&Al(t,s,3,[u(),d?[]:void 0,p]):u(),o==="sync"){const C=cee();v=C.__watcherHandles||(C.__watcherHandles=[])}else return ur;let m=d?new Array(e.length).fill(M2):M2;const y=()=>{if(_.active)if(t){const C=_.run();(r||c||(d?C.some((E,A)=>Gf(E,m[A])):Gf(C,m)))&&(f&&f(),Al(t,s,3,[C,m===M2?void 0:d&&m[0]===M2?[]:m,p]),m=C)}else _.run()};y.allowRecurse=!!t;let g;o==="sync"?g=y:o==="post"?g=()=>Sa(y,s&&s.suspense):(y.pre=!0,s&&(y.id=s.uid),g=()=>b9(y));const _=new p9(u,g);t?n?y():m=_.run():o==="post"?Sa(_.run.bind(_),s&&s.suspense):_.run();const x=()=>{_.stop(),s&&s.scope&&u9(s.scope.effects,_)};return v&&v.push(x),x}function xJ(e,t,n){const r=this.proxy,o=Qt(e)?e.includes(".")?sI(r,e):()=>r[e]:e.bind(r,r);let i;Kt(t)?i=t:(i=t.handler,n=t);const a=Ko;a0(this);const l=C9(o,i.bind(r),n);return a?a0(a):$f(),l}function sI(e,t){const n=t.split(".");return()=>{let r=e;for(let o=0;o{Tf(n,t)});else if(W_(e))for(const n in e)Tf(e[n],t);return e}function Ft(e,t){const n=Zo;if(n===null)return e;const r=Y4(n)||n.proxy,o=e.dirs||(e.dirs=[]);for(let i=0;i{e.isMounted=!0}),Tr(()=>{e.isUnmounting=!0}),e}const hl=[Function,Array],cI={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:hl,onEnter:hl,onAfterEnter:hl,onEnterCancelled:hl,onBeforeLeave:hl,onLeave:hl,onAfterLeave:hl,onLeaveCancelled:hl,onBeforeAppear:hl,onAppear:hl,onAfterAppear:hl,onAppearCancelled:hl},CJ={name:"BaseTransition",props:cI,setup(e,{slots:t}){const n=Wt(),r=uI();let o;return()=>{const i=t.default&&E9(t.default(),!0);if(!i||!i.length)return;let a=i[0];if(i.length>1){for(const m of i)if(m.type!==oa){a=m;break}}const l=Qn(e),{mode:s}=l;if(r.isLeaving)return dw(a);const u=dM(a);if(!u)return dw(a);const c=wg(u,l,r,n);xg(u,c);const d=n.subTree,f=d&&dM(d);let p=!1;const{getTransitionKey:v}=u.type;if(v){const m=v();o===void 0?o=m:m!==o&&(o=m,p=!0)}if(f&&f.type!==oa&&(!bf(u,f)||p)){const m=wg(f,l,r,n);if(xg(f,m),s==="out-in")return r.isLeaving=!0,m.afterLeave=()=>{r.isLeaving=!1,n.update.active!==!1&&n.update()},dw(a);s==="in-out"&&u.type!==oa&&(m.delayLeave=(y,g,_)=>{const x=dI(r,f);x[String(f.key)]=f,y[zc]=()=>{g(),y[zc]=void 0,delete c.delayedLeave},c.delayedLeave=_})}return a}}},EJ=CJ;function dI(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function wg(e,t,n,r){const{appear:o,mode:i,persisted:a=!1,onBeforeEnter:l,onEnter:s,onAfterEnter:u,onEnterCancelled:c,onBeforeLeave:d,onLeave:f,onAfterLeave:p,onLeaveCancelled:v,onBeforeAppear:m,onAppear:y,onAfterAppear:g,onAppearCancelled:_}=t,x=String(e.key),C=dI(n,e),E=(D,L)=>{D&&Al(D,r,9,L)},A=(D,L)=>{const M=L[1];E(D,L),Ot(D)?D.every(R=>R.length<=1)&&M():D.length<=1&&M()},S={mode:i,persisted:a,beforeEnter(D){let L=l;if(!n.isMounted)if(o)L=m||l;else return;D[zc]&&D[zc](!0);const M=C[x];M&&bf(e,M)&&M.el[zc]&&M.el[zc](),E(L,[D])},enter(D){let L=s,M=u,R=c;if(!n.isMounted)if(o)L=y||s,M=g||u,R=_||c;else return;let I=!1;const F=D[O2]=z=>{I||(I=!0,z?E(R,[D]):E(M,[D]),S.delayedLeave&&S.delayedLeave(),D[O2]=void 0)};L?A(L,[D,F]):F()},leave(D,L){const M=String(e.key);if(D[O2]&&D[O2](!0),n.isUnmounting)return L();E(d,[D]);let R=!1;const I=D[zc]=F=>{R||(R=!0,L(),F?E(v,[D]):E(p,[D]),D[zc]=void 0,C[M]===e&&delete C[M])};C[M]=e,f?A(f,[D,I]):I()},clone(D){return wg(D,t,n,r)}};return S}function dw(e){if(W4(e))return e=nc(e),e.children=null,e}function dM(e){return W4(e)?e.children?e.children[0]:void 0:e}function xg(e,t){e.shapeFlag&6&&e.component?xg(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function E9(e,t=!1,n){let r=[],o=0;for(let i=0;i1)for(let i=0;i!!e.type.__asyncLoader,W4=e=>e.type.__isKeepAlive;function AJ(e,t){pI(e,"a",t)}function fI(e,t){pI(e,"da",t)}function pI(e,t,n=Ko){const r=e.__wdc||(e.__wdc=()=>{let o=n;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(U4(t,r,n),n){let o=n.parent;for(;o&&o.parent;)W4(o.parent.vnode)&&SJ(r,t,n,o),o=o.parent}}function SJ(e,t,n,r){const o=U4(t,e,r,!0);Ts(()=>{u9(r[t],o)},n)}function U4(e,t,n=Ko,r=!1){if(n){const o=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...a)=>{if(n.isUnmounted)return;H0(),a0(n);const l=Al(t,n,e,a);return $f(),j0(),l});return r?o.unshift(i):o.push(i),i}}const uc=e=>(t,n=Ko)=>(!Ag||e==="sp")&&U4(e,(...r)=>t(...r),n),f1=uc("bm"),nn=uc("m"),hI=uc("bu"),pu=uc("u"),Tr=uc("bum"),Ts=uc("um"),kJ=uc("sp"),TJ=uc("rtg"),MJ=uc("rtc");function OJ(e,t=Ko){U4("ec",e,t)}function Mt(e,t,n,r){let o;const i=n;if(Ot(e)||Qt(e)){o=new Array(e.length);for(let a=0,l=e.length;at(a,l,void 0,i));else{const a=Object.keys(e);o=new Array(a.length);for(let l=0,s=a.length;l{const i=r.fn(...o);return i&&(i.key=r.key),i}:r.fn)}return e}function Ze(e,t,n={},r,o){if(Zo.isCE||Zo.parent&&Nm(Zo.parent)&&Zo.parent.isCE)return t!=="default"&&(n.name=t),Y("slot",n,r&&r());let i=e[t];i&&i._c&&(i._d=!1),N();const a=i&&vI(i(n)),l=we(ot,{key:n.key||a&&a.key||`_${t}`},a||(r?r():[]),a&&e._===1?64:-2);return!o&&l.scopeId&&(l.slotScopeIds=[l.scopeId+"-s"]),i&&i._c&&(i._d=!0),l}function vI(e){return e.some(t=>Sr(t)?!(t.type===oa||t.type===ot&&!vI(t.children)):!0)?e:null}function DJ(e,t){const n={};for(const r in e)n[zy(r)]=e[r];return n}const ux=e=>e?TI(e)?Y4(e)||e.proxy:ux(e.parent):null,Fm=Jo(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>ux(e.parent),$root:e=>ux(e.root),$emit:e=>e.emit,$options:e=>yI(e),$forceUpdate:e=>e.f||(e.f=()=>b9(e.update)),$nextTick:e=>e.n||(e.n=yt.bind(e.proxy)),$watch:e=>xJ.bind(e)}),fw=(e,t)=>e!==Jr&&!e.__isScriptSetup&&On(e,t),NJ={get({_:e},t){const{ctx:n,setupState:r,data:o,props:i,accessCache:a,type:l,appContext:s}=e;let u;if(t[0]!=="$"){const p=a[t];if(p!==void 0)switch(p){case 1:return r[t];case 2:return o[t];case 4:return n[t];case 3:return i[t]}else{if(fw(r,t))return a[t]=1,r[t];if(o!==Jr&&On(o,t))return a[t]=2,o[t];if((u=e.propsOptions[0])&&On(u,t))return a[t]=3,i[t];if(n!==Jr&&On(n,t))return a[t]=4,n[t];cx&&(a[t]=0)}}const c=Fm[t];let d,f;if(c)return t==="$attrs"&&Pa(e,"get",t),c(e);if((d=l.__cssModules)&&(d=d[t]))return d;if(n!==Jr&&On(n,t))return a[t]=4,n[t];if(f=s.config.globalProperties,On(f,t))return f[t]},set({_:e},t,n){const{data:r,setupState:o,ctx:i}=e;return fw(o,t)?(o[t]=n,!0):r!==Jr&&On(r,t)?(r[t]=n,!0):On(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:o,propsOptions:i}},a){let l;return!!n[a]||e!==Jr&&On(e,a)||fw(t,a)||(l=i[0])&&On(l,a)||On(r,a)||On(Fm,a)||On(o.config.globalProperties,a)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:On(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function ni(){return mI().slots}function mp(){return mI().attrs}function mI(){const e=Wt();return e.setupContext||(e.setupContext=OI(e))}function fM(e){return Ot(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let cx=!0;function FJ(e){const t=yI(e),n=e.proxy,r=e.ctx;cx=!1,t.beforeCreate&&pM(t.beforeCreate,e,"bc");const{data:o,computed:i,methods:a,watch:l,provide:s,inject:u,created:c,beforeMount:d,mounted:f,beforeUpdate:p,updated:v,activated:m,deactivated:y,beforeDestroy:g,beforeUnmount:_,destroyed:x,unmounted:C,render:E,renderTracked:A,renderTriggered:S,errorCaptured:D,serverPrefetch:L,expose:M,inheritAttrs:R,components:I,directives:F,filters:z}=t;if(u&&RJ(u,r,null),a)for(const U in a){const K=a[U];Kt(K)&&(r[U]=K.bind(n))}if(o){const U=o.call(n,n);yn(U)&&(e.data=gn(U))}if(cx=!0,i)for(const U in i){const K=i[U],$=Kt(K)?K.bind(n,n):Kt(K.get)?K.get.bind(n,n):ur,q=!Kt(K)&&Kt(K.set)?K.set.bind(n):ur,ae=G({get:$,set:q});Object.defineProperty(r,U,{enumerable:!0,configurable:!0,get:()=>ae.value,set:H=>ae.value=H})}if(l)for(const U in l)gI(l[U],r,n,U);if(s){const U=Kt(s)?s.call(n):s;Reflect.ownKeys(U).forEach(K=>{bn(K,U[K])})}c&&pM(c,e,"c");function j(U,K){Ot(K)?K.forEach($=>U($.bind(n))):K&&U(K.bind(n))}if(j(f1,d),j(nn,f),j(hI,p),j(pu,v),j(AJ,m),j(fI,y),j(OJ,D),j(MJ,A),j(TJ,S),j(Tr,_),j(Ts,C),j(kJ,L),Ot(M))if(M.length){const U=e.exposed||(e.exposed={});M.forEach(K=>{Object.defineProperty(U,K,{get:()=>n[K],set:$=>n[K]=$})})}else e.exposed||(e.exposed={});E&&e.render===ur&&(e.render=E),R!=null&&(e.inheritAttrs=R),I&&(e.components=I),F&&(e.directives=F)}function RJ(e,t,n=ur){Ot(e)&&(e=dx(e));for(const r in e){const o=e[r];let i;yn(o)?"default"in o?i=Tt(o.from||r,o.default,!0):i=Tt(o.from||r):i=Tt(o),Nn(i)?Object.defineProperty(t,r,{enumerable:!0,configurable:!0,get:()=>i.value,set:a=>i.value=a}):t[r]=i}}function pM(e,t,n){Al(Ot(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function gI(e,t,n,r){const o=r.includes(".")?sI(n,r):()=>n[r];if(Qt(e)){const i=t[e];Kt(i)&&Xe(o,i)}else if(Kt(e))Xe(o,e.bind(n));else if(yn(e))if(Ot(e))e.forEach(i=>gI(i,t,n,r));else{const i=Kt(e.handler)?e.handler.bind(n):t[e.handler];Kt(i)&&Xe(o,i,e)}}function yI(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:o,optionsCache:i,config:{optionMergeStrategies:a}}=e.appContext,l=i.get(t);let s;return l?s=l:!o.length&&!n&&!r?s=t:(s={},o.length&&o.forEach(u=>q_(s,u,a,!0)),q_(s,t,a)),yn(t)&&i.set(t,s),s}function q_(e,t,n,r=!1){const{mixins:o,extends:i}=t;i&&q_(e,i,n,!0),o&&o.forEach(a=>q_(e,a,n,!0));for(const a in t)if(!(r&&a==="expose")){const l=PJ[a]||n&&n[a];e[a]=l?l(e[a],t[a]):t[a]}return e}const PJ={data:hM,props:vM,emits:vM,methods:_m,computed:_m,beforeCreate:Qi,created:Qi,beforeMount:Qi,mounted:Qi,beforeUpdate:Qi,updated:Qi,beforeDestroy:Qi,beforeUnmount:Qi,destroyed:Qi,unmounted:Qi,activated:Qi,deactivated:Qi,errorCaptured:Qi,serverPrefetch:Qi,components:_m,directives:_m,watch:LJ,provide:hM,inject:BJ};function hM(e,t){return t?e?function(){return Jo(Kt(e)?e.call(this,this):e,Kt(t)?t.call(this,this):t)}:t:e}function BJ(e,t){return _m(dx(e),dx(t))}function dx(e){if(Ot(e)){const t={};for(let n=0;n1)return n&&Kt(t)?t.call(r&&r.proxy):t}}function zJ(){return!!(Ko||Zo||Cg)}function VJ(e,t,n,r=!1){const o={},i={};U_(i,K4,1),e.propsDefaults=Object.create(null),bI(e,t,o,i);for(const a in e.propsOptions[0])a in o||(o[a]=void 0);n?e.props=r?o:z4(o):e.type.props?e.props=o:e.props=i,e.attrs=i}function HJ(e,t,n,r){const{props:o,attrs:i,vnode:{patchFlag:a}}=e,l=Qn(o),[s]=e.propsOptions;let u=!1;if((r||a>0)&&!(a&16)){if(a&8){const c=e.vnode.dynamicProps;for(let d=0;d{s=!0;const[f,p]=wI(d,t,!0);Jo(a,f),p&&l.push(...p)};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}if(!i&&!s)return yn(e)&&r.set(e,Vh),Vh;if(Ot(i))for(let c=0;c-1,p[1]=m<0||v-1||On(p,"default"))&&l.push(d)}}}const u=[a,l];return yn(e)&&r.set(e,u),u}function mM(e){return e[0]!=="$"}function gM(e){const t=e&&e.toString().match(/^\s*(function|class) (\w+)/);return t?t[2]:e===null?"null":""}function yM(e,t){return gM(e)===gM(t)}function _M(e,t){return Ot(t)?t.findIndex(n=>yM(n,e)):Kt(t)&&yM(t,e)?0:-1}const xI=e=>e[0]==="_"||e==="$stable",A9=e=>Ot(e)?e.map(Us):[Us(e)],jJ=(e,t,n)=>{if(t._n)return t;const r=Q((...o)=>A9(t(...o)),n);return r._c=!1,r},CI=(e,t,n)=>{const r=e._ctx;for(const o in e){if(xI(o))continue;const i=e[o];if(Kt(i))t[o]=jJ(o,i,r);else if(i!=null){const a=A9(i);t[o]=()=>a}}},EI=(e,t)=>{const n=A9(t);e.slots.default=()=>n},WJ=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=Qn(t),U_(t,"_",n)):CI(t,e.slots={})}else e.slots={},t&&EI(e,t);U_(e.slots,K4,1)},UJ=(e,t,n)=>{const{vnode:r,slots:o}=e;let i=!0,a=Jr;if(r.shapeFlag&32){const l=t._;l?n&&l===1?i=!1:(Jo(o,t),!n&&l===1&&delete o._):(i=!t.$stable,CI(t,o)),a=t}else t&&(EI(e,t),a={default:1});if(i)for(const l in o)!xI(l)&&a[l]==null&&delete o[l]};function px(e,t,n,r,o=!1){if(Ot(e)){e.forEach((f,p)=>px(f,t&&(Ot(t)?t[p]:t),n,r,o));return}if(Nm(r)&&!o)return;const i=r.shapeFlag&4?Y4(r.component)||r.component.proxy:r.el,a=o?null:i,{i:l,r:s}=e,u=t&&t.r,c=l.refs===Jr?l.refs={}:l.refs,d=l.setupState;if(u!=null&&u!==s&&(Qt(u)?(c[u]=null,On(d,u)&&(d[u]=null)):Nn(u)&&(u.value=null)),Kt(s))ld(s,l,12,[a,c]);else{const f=Qt(s),p=Nn(s);if(f||p){const v=()=>{if(e.f){const m=f?On(d,s)?d[s]:c[s]:s.value;o?Ot(m)&&u9(m,i):Ot(m)?m.includes(i)||m.push(i):f?(c[s]=[i],On(d,s)&&(d[s]=c[s])):(s.value=[i],e.k&&(c[e.k]=s.value))}else f?(c[s]=a,On(d,s)&&(d[s]=a)):p&&(s.value=a,e.k&&(c[e.k]=a))};a?(v.id=-1,Sa(v,n)):v()}}}const Sa=wJ;function KJ(e){return YJ(e)}function YJ(e,t){const n=ox();n.__VUE__=!0;const{insert:r,remove:o,patchProp:i,createElement:a,createText:l,createComment:s,setText:u,setElementText:c,parentNode:d,nextSibling:f,setScopeId:p=ur,insertStaticContent:v}=e,m=(te,de,be,Pe=null,ze=null,Qe=null,qe=!1,$e=null,he=!!de.dynamicChildren)=>{if(te===de)return;te&&!bf(te,de)&&(Pe=Z(te),H(te,ze,Qe,!0),te=null),de.patchFlag===-2&&(he=!1,de.dynamicChildren=null);const{type:me,ref:Se,shapeFlag:Ne}=de;switch(me){case W0:y(te,de,be,Pe);break;case oa:g(te,de,be,Pe);break;case pw:te==null&&_(de,be,Pe,qe);break;case ot:I(te,de,be,Pe,ze,Qe,qe,$e,he);break;default:Ne&1?E(te,de,be,Pe,ze,Qe,qe,$e,he):Ne&6?F(te,de,be,Pe,ze,Qe,qe,$e,he):(Ne&64||Ne&128)&&me.process(te,de,be,Pe,ze,Qe,qe,$e,he,le)}Se!=null&&ze&&px(Se,te&&te.ref,Qe,de||te,!de)},y=(te,de,be,Pe)=>{if(te==null)r(de.el=l(de.children),be,Pe);else{const ze=de.el=te.el;de.children!==te.children&&u(ze,de.children)}},g=(te,de,be,Pe)=>{te==null?r(de.el=s(de.children||""),be,Pe):de.el=te.el},_=(te,de,be,Pe)=>{[te.el,te.anchor]=v(te.children,de,be,Pe,te.el,te.anchor)},x=({el:te,anchor:de},be,Pe)=>{let ze;for(;te&&te!==de;)ze=f(te),r(te,be,Pe),te=ze;r(de,be,Pe)},C=({el:te,anchor:de})=>{let be;for(;te&&te!==de;)be=f(te),o(te),te=be;o(de)},E=(te,de,be,Pe,ze,Qe,qe,$e,he)=>{qe=qe||de.type==="svg",te==null?A(de,be,Pe,ze,Qe,qe,$e,he):L(te,de,ze,Qe,qe,$e,he)},A=(te,de,be,Pe,ze,Qe,qe,$e)=>{let he,me;const{type:Se,props:Ne,shapeFlag:Me,transition:xe,dirs:Ce}=te;if(he=te.el=a(te.type,Qe,Ne&&Ne.is,Ne),Me&8?c(he,te.children):Me&16&&D(te.children,he,null,Pe,ze,Qe&&Se!=="foreignObject",qe,$e),Ce&&nf(te,null,Pe,"created"),S(he,te,te.scopeId,qe,Pe),Ne){for(const rt in Ne)rt!=="value"&&!$y(rt)&&i(he,rt,null,Ne[rt],Qe,te.children,Pe,ze,J);"value"in Ne&&i(he,"value",null,Ne.value),(me=Ne.onVnodeBeforeMount)&&Is(me,Pe,te)}Ce&&nf(te,null,Pe,"beforeMount");const Ve=GJ(ze,xe);Ve&&xe.beforeEnter(he),r(he,de,be),((me=Ne&&Ne.onVnodeMounted)||Ve||Ce)&&Sa(()=>{me&&Is(me,Pe,te),Ve&&xe.enter(he),Ce&&nf(te,null,Pe,"mounted")},ze)},S=(te,de,be,Pe,ze)=>{if(be&&p(te,be),Pe)for(let Qe=0;Qe{for(let me=he;me{const $e=de.el=te.el;let{patchFlag:he,dynamicChildren:me,dirs:Se}=de;he|=te.patchFlag&16;const Ne=te.props||Jr,Me=de.props||Jr;let xe;be&&rf(be,!1),(xe=Me.onVnodeBeforeUpdate)&&Is(xe,be,de,te),Se&&nf(de,te,be,"beforeUpdate"),be&&rf(be,!0);const Ce=ze&&de.type!=="foreignObject";if(me?M(te.dynamicChildren,me,$e,be,Pe,Ce,Qe):qe||K(te,de,$e,null,be,Pe,Ce,Qe,!1),he>0){if(he&16)R($e,de,Ne,Me,be,Pe,ze);else if(he&2&&Ne.class!==Me.class&&i($e,"class",null,Me.class,ze),he&4&&i($e,"style",Ne.style,Me.style,ze),he&8){const Ve=de.dynamicProps;for(let rt=0;rt{xe&&Is(xe,be,de,te),Se&&nf(de,te,be,"updated")},Pe)},M=(te,de,be,Pe,ze,Qe,qe)=>{for(let $e=0;$e{if(be!==Pe){if(be!==Jr)for(const $e in be)!$y($e)&&!($e in Pe)&&i(te,$e,be[$e],null,qe,de.children,ze,Qe,J);for(const $e in Pe){if($y($e))continue;const he=Pe[$e],me=be[$e];he!==me&&$e!=="value"&&i(te,$e,me,he,qe,de.children,ze,Qe,J)}"value"in Pe&&i(te,"value",be.value,Pe.value)}},I=(te,de,be,Pe,ze,Qe,qe,$e,he)=>{const me=de.el=te?te.el:l(""),Se=de.anchor=te?te.anchor:l("");let{patchFlag:Ne,dynamicChildren:Me,slotScopeIds:xe}=de;xe&&($e=$e?$e.concat(xe):xe),te==null?(r(me,be,Pe),r(Se,be,Pe),D(de.children,be,Se,ze,Qe,qe,$e,he)):Ne>0&&Ne&64&&Me&&te.dynamicChildren?(M(te.dynamicChildren,Me,be,ze,Qe,qe,$e),(de.key!=null||ze&&de===ze.subTree)&&S9(te,de,!0)):K(te,de,be,Se,ze,Qe,qe,$e,he)},F=(te,de,be,Pe,ze,Qe,qe,$e,he)=>{de.slotScopeIds=$e,te==null?de.shapeFlag&512?ze.ctx.activate(de,be,Pe,qe,he):z(de,be,Pe,ze,Qe,qe,he):O(te,de,he)},z=(te,de,be,Pe,ze,Qe,qe)=>{const $e=te.component=ree(te,Pe,ze);if(W4(te)&&($e.ctx.renderer=le),oee($e),$e.asyncDep){if(ze&&ze.registerDep($e,j),!te.el){const he=$e.subTree=Y(oa);g(null,he,de,be)}return}j($e,te,de,be,ze,Qe,qe)},O=(te,de,be)=>{const Pe=de.component=te.component;if(gJ(te,de,be))if(Pe.asyncDep&&!Pe.asyncResolved){U(Pe,de,be);return}else Pe.next=de,dJ(Pe.update),Pe.update();else de.el=te.el,Pe.vnode=de},j=(te,de,be,Pe,ze,Qe,qe)=>{const $e=()=>{if(te.isMounted){let{next:Se,bu:Ne,u:Me,parent:xe,vnode:Ce}=te,Ve=Se,rt;rf(te,!1),Se?(Se.el=Ce.el,U(te,Se,qe)):Se=Ce,Ne&&Vy(Ne),(rt=Se.props&&Se.props.onVnodeBeforeUpdate)&&Is(rt,xe,Se,Ce),rf(te,!0);const ht=sM(te),ft=te.subTree;te.subTree=ht,m(ft,ht,d(ft.el),Z(ft),te,ze,Qe),Se.el=ht.el,Ve===null&&yJ(te,ht.el),Me&&Sa(Me,ze),(rt=Se.props&&Se.props.onVnodeUpdated)&&Sa(()=>Is(rt,xe,Se,Ce),ze)}else{let Se;const{el:Ne,props:Me}=de,{bm:xe,m:Ce,parent:Ve}=te,rt=Nm(de);rf(te,!1),xe&&Vy(xe),!rt&&(Se=Me&&Me.onVnodeBeforeMount)&&Is(Se,Ve,de),rf(te,!0);{const ht=te.subTree=sM(te);m(null,ht,be,Pe,te,ze,Qe),de.el=ht.el}if(Ce&&Sa(Ce,ze),!rt&&(Se=Me&&Me.onVnodeMounted)){const ht=de;Sa(()=>Is(Se,Ve,ht),ze)}(de.shapeFlag&256||Ve&&Nm(Ve.vnode)&&Ve.vnode.shapeFlag&256)&&te.a&&Sa(te.a,ze),te.isMounted=!0,de=be=Pe=null}},he=te.effect=new p9($e,()=>b9(me),te.scope),me=te.update=()=>he.run();me.id=te.uid,rf(te,!0),me()},U=(te,de,be)=>{de.component=te;const Pe=te.vnode.props;te.vnode=de,te.next=null,HJ(te,de.props,Pe,be),UJ(te,de.children,be),H0(),lM(),j0()},K=(te,de,be,Pe,ze,Qe,qe,$e,he=!1)=>{const me=te&&te.children,Se=te?te.shapeFlag:0,Ne=de.children,{patchFlag:Me,shapeFlag:xe}=de;if(Me>0){if(Me&128){q(me,Ne,be,Pe,ze,Qe,qe,$e,he);return}else if(Me&256){$(me,Ne,be,Pe,ze,Qe,qe,$e,he);return}}xe&8?(Se&16&&J(me,ze,Qe),Ne!==me&&c(be,Ne)):Se&16?xe&16?q(me,Ne,be,Pe,ze,Qe,qe,$e,he):J(me,ze,Qe,!0):(Se&8&&c(be,""),xe&16&&D(Ne,be,Pe,ze,Qe,qe,$e,he))},$=(te,de,be,Pe,ze,Qe,qe,$e,he)=>{te=te||Vh,de=de||Vh;const me=te.length,Se=de.length,Ne=Math.min(me,Se);let Me;for(Me=0;MeSe?J(te,ze,Qe,!0,!1,Ne):D(de,be,Pe,ze,Qe,qe,$e,he,Ne)},q=(te,de,be,Pe,ze,Qe,qe,$e,he)=>{let me=0;const Se=de.length;let Ne=te.length-1,Me=Se-1;for(;me<=Ne&&me<=Me;){const xe=te[me],Ce=de[me]=he?Vc(de[me]):Us(de[me]);if(bf(xe,Ce))m(xe,Ce,be,null,ze,Qe,qe,$e,he);else break;me++}for(;me<=Ne&&me<=Me;){const xe=te[Ne],Ce=de[Me]=he?Vc(de[Me]):Us(de[Me]);if(bf(xe,Ce))m(xe,Ce,be,null,ze,Qe,qe,$e,he);else break;Ne--,Me--}if(me>Ne){if(me<=Me){const xe=Me+1,Ce=xeMe)for(;me<=Ne;)H(te[me],ze,Qe,!0),me++;else{const xe=me,Ce=me,Ve=new Map;for(me=Ce;me<=Me;me++){const Be=de[me]=he?Vc(de[me]):Us(de[me]);Be.key!=null&&Ve.set(Be.key,me)}let rt,ht=0;const ft=Me-Ce+1;let st=!1,je=0;const Te=new Array(ft);for(me=0;me=ft){H(Be,ze,Qe,!0);continue}let ye;if(Be.key!=null)ye=Ve.get(Be.key);else for(rt=Ce;rt<=Me;rt++)if(Te[rt-Ce]===0&&bf(Be,de[rt])){ye=rt;break}ye===void 0?H(Be,ze,Qe,!0):(Te[ye-Ce]=me+1,ye>=je?je=ye:st=!0,m(Be,de[ye],be,null,ze,Qe,qe,$e,he),ht++)}const ke=st?qJ(Te):Vh;for(rt=ke.length-1,me=ft-1;me>=0;me--){const Be=Ce+me,ye=de[Be],Ye=Be+1{const{el:Qe,type:qe,transition:$e,children:he,shapeFlag:me}=te;if(me&6){ae(te.component.subTree,de,be,Pe);return}if(me&128){te.suspense.move(de,be,Pe);return}if(me&64){qe.move(te,de,be,le);return}if(qe===ot){r(Qe,de,be);for(let Ne=0;Ne$e.enter(Qe),ze);else{const{leave:Ne,delayLeave:Me,afterLeave:xe}=$e,Ce=()=>r(Qe,de,be),Ve=()=>{Ne(Qe,()=>{Ce(),xe&&xe()})};Me?Me(Qe,Ce,Ve):Ve()}else r(Qe,de,be)},H=(te,de,be,Pe=!1,ze=!1)=>{const{type:Qe,props:qe,ref:$e,children:he,dynamicChildren:me,shapeFlag:Se,patchFlag:Ne,dirs:Me}=te;if($e!=null&&px($e,null,be,te,!0),Se&256){de.ctx.deactivate(te);return}const xe=Se&1&&Me,Ce=!Nm(te);let Ve;if(Ce&&(Ve=qe&&qe.onVnodeBeforeUnmount)&&Is(Ve,de,te),Se&6)pe(te.component,be,Pe);else{if(Se&128){te.suspense.unmount(be,Pe);return}xe&&nf(te,null,de,"beforeUnmount"),Se&64?te.type.remove(te,de,be,ze,le,Pe):me&&(Qe!==ot||Ne>0&&Ne&64)?J(me,de,be,!1,!0):(Qe===ot&&Ne&384||!ze&&Se&16)&&J(he,de,be),Pe&&X(te)}(Ce&&(Ve=qe&&qe.onVnodeUnmounted)||xe)&&Sa(()=>{Ve&&Is(Ve,de,te),xe&&nf(te,null,de,"unmounted")},be)},X=te=>{const{type:de,el:be,anchor:Pe,transition:ze}=te;if(de===ot){oe(be,Pe);return}if(de===pw){C(te);return}const Qe=()=>{o(be),ze&&!ze.persisted&&ze.afterLeave&&ze.afterLeave()};if(te.shapeFlag&1&&ze&&!ze.persisted){const{leave:qe,delayLeave:$e}=ze,he=()=>qe(be,Qe);$e?$e(te.el,Qe,he):he()}else Qe()},oe=(te,de)=>{let be;for(;te!==de;)be=f(te),o(te),te=be;o(de)},pe=(te,de,be)=>{const{bum:Pe,scope:ze,update:Qe,subTree:qe,um:$e}=te;Pe&&Vy(Pe),ze.stop(),Qe&&(Qe.active=!1,H(qe,te,de,be)),$e&&Sa($e,de),Sa(()=>{te.isUnmounted=!0},de),de&&de.pendingBranch&&!de.isUnmounted&&te.asyncDep&&!te.asyncResolved&&te.suspenseId===de.pendingId&&(de.deps--,de.deps===0&&de.resolve())},J=(te,de,be,Pe=!1,ze=!1,Qe=0)=>{for(let qe=Qe;qete.shapeFlag&6?Z(te.component.subTree):te.shapeFlag&128?te.suspense.next():f(te.anchor||te.el),ne=(te,de,be)=>{te==null?de._vnode&&H(de._vnode,null,null,!0):m(de._vnode||null,te,de,null,null,null,be),lM(),oI(),de._vnode=te},le={p:m,um:H,m:ae,r:X,mt:z,mc:D,pc:K,pbc:M,n:Z,o:e};return{render:ne,hydrate:void 0,createApp:$J(ne)}}function rf({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function GJ(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function S9(e,t,n=!1){const r=e.children,o=t.children;if(Ot(r)&&Ot(o))for(let i=0;i>1,e[n[l]]0&&(t[r]=n[i-1]),n[i]=r)}}for(i=n.length,a=n[i-1];i-- >0;)n[i]=a,a=t[a];return n}const XJ=e=>e.__isTeleport,Rm=e=>e&&(e.disabled||e.disabled===""),bM=e=>typeof SVGElement<"u"&&e instanceof SVGElement,hx=(e,t)=>{const n=e&&e.to;return Qt(n)?t?t(n):null:n},QJ={name:"Teleport",__isTeleport:!0,process(e,t,n,r,o,i,a,l,s,u){const{mc:c,pc:d,pbc:f,o:{insert:p,querySelector:v,createText:m,createComment:y}}=u,g=Rm(t.props);let{shapeFlag:_,children:x,dynamicChildren:C}=t;if(e==null){const E=t.el=m(""),A=t.anchor=m("");p(E,n,r),p(A,n,r);const S=t.target=hx(t.props,v),D=t.targetAnchor=m("");S&&(p(D,S),a=a||bM(S));const L=(M,R)=>{_&16&&c(x,M,R,o,i,a,l,s)};g?L(n,A):S&&L(S,D)}else{t.el=e.el;const E=t.anchor=e.anchor,A=t.target=e.target,S=t.targetAnchor=e.targetAnchor,D=Rm(e.props),L=D?n:A,M=D?E:S;if(a=a||bM(A),C?(f(e.dynamicChildren,C,L,o,i,a,l),S9(e,t,!0)):s||d(e,t,L,M,o,i,a,l,!1),g)D?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):D2(t,n,E,u,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const R=t.target=hx(t.props,v);R&&D2(t,R,null,u,0)}else D&&D2(t,A,S,u,1)}AI(t)},remove(e,t,n,r,{um:o,o:{remove:i}},a){const{shapeFlag:l,children:s,anchor:u,targetAnchor:c,target:d,props:f}=e;if(d&&i(c),a&&i(u),l&16){const p=a||!Rm(f);for(let v=0;v0?ds||Vh:null,JJ(),Eg>0&&ds&&ds.push(e),e}function V(e,t,n,r,o,i){return SI(B(e,t,n,r,o,i,!0))}function we(e,t,n,r,o){return SI(Y(e,t,n,r,o,!0))}function Sr(e){return e?e.__v_isVNode===!0:!1}function bf(e,t){return e.type===t.type&&e.key===t.key}const K4="__vInternal",kI=({key:e})=>e??null,Hy=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?Qt(e)||Nn(e)||Kt(e)?{i:Zo,r:e,k:t,f:!!n}:e:null);function B(e,t=null,n=null,r=0,o=null,i=e===ot?0:1,a=!1,l=!1){const s={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&kI(t),ref:t&&Hy(t),scopeId:j4,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:r,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:Zo};return l?(k9(s,n),i&128&&e.normalize(s)):n&&(s.shapeFlag|=Qt(n)?8:16),Eg>0&&!a&&ds&&(s.patchFlag>0||i&6)&&s.patchFlag!==32&&ds.push(s),s}const Y=eee;function eee(e,t=null,n=null,r=0,o=null,i=!1){if((!e||e===lI)&&(e=oa),Sr(e)){const l=nc(e,t,!0);return n&&k9(l,n),Eg>0&&!i&&ds&&(l.shapeFlag&6?ds[ds.indexOf(e)]=l:ds.push(l)),l.patchFlag|=-2,l}if(see(e)&&(e=e.__vccOpts),t){t=U0(t);let{class:l,style:s}=t;l&&!Qt(l)&&(t.class=ie(l)),yn(s)&&(XL(s)&&!Ot(s)&&(s=Jo({},s)),t.style=wt(s))}const a=Qt(e)?1:bJ(e)?128:XJ(e)?64:yn(e)?4:Kt(e)?2:0;return B(e,t,n,r,o,a,i,!0)}function U0(e){return e?XL(e)||K4 in e?Jo({},e):e:null}function nc(e,t,n=!1){const{props:r,ref:o,patchFlag:i,children:a}=e,l=t?Gt(r||{},t):r;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&kI(l),ref:t&&t.ref?n&&o?Ot(o)?o.concat(Hy(t)):[o,Hy(t)]:Hy(t):o,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:a,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==ot?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&nc(e.ssContent),ssFallback:e.ssFallback&&nc(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce}}function vt(e=" ",t=0){return Y(W0,null,e,t)}function _e(e="",t=!1){return t?(N(),we(oa,null,e)):Y(oa,null,e)}function Us(e){return e==null||typeof e=="boolean"?Y(oa):Ot(e)?Y(ot,null,e.slice()):typeof e=="object"?Vc(e):Y(W0,null,String(e))}function Vc(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:nc(e)}function k9(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(Ot(t))n=16;else if(typeof t=="object")if(r&65){const o=t.default;o&&(o._c&&(o._d=!1),k9(e,o()),o._c&&(o._d=!0));return}else{n=32;const o=t._;!o&&!(K4 in t)?t._ctx=Zo:o===3&&Zo&&(Zo.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else Kt(t)?(t={default:t,_ctx:Zo},n=32):(t=String(t),r&64?(n=16,t=[vt(t)]):n=8);e.children=t,e.shapeFlag|=n}function Gt(...e){const t={};for(let n=0;nKo||Zo;let T9,qp,xM="__VUE_INSTANCE_SETTERS__";(qp=ox()[xM])||(qp=ox()[xM]=[]),qp.push(e=>Ko=e),T9=e=>{qp.length>1?qp.forEach(t=>t(e)):qp[0](e)};const a0=e=>{T9(e),e.scope.on()},$f=()=>{Ko&&Ko.scope.off(),T9(null)};function TI(e){return e.vnode.shapeFlag&4}let Ag=!1;function oee(e,t=!1){Ag=t;const{props:n,children:r}=e.vnode,o=TI(e);VJ(e,n,o,t),WJ(e,r);const i=o?iee(e,t):void 0;return Ag=!1,i}function iee(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=eo(new Proxy(e.ctx,NJ));const{setup:r}=n;if(r){const o=e.setupContext=r.length>1?OI(e):null;a0(e),H0();const i=ld(r,e,0,[e.props,o]);if(j0(),$f(),gg(i)){if(i.then($f,$f),t)return i.then(a=>{CM(e,a)}).catch(a=>{V4(a,e,0)});e.asyncDep=i}else CM(e,i)}else MI(e)}function CM(e,t,n){Kt(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:yn(t)&&(e.setupState=JL(t)),MI(e)}function MI(e,t,n){const r=e.type;e.render||(e.render=r.render||ur);{a0(e),H0();try{FJ(e)}finally{j0(),$f()}}}function aee(e){return e.attrsProxy||(e.attrsProxy=new Proxy(e.attrs,{get(t,n){return Pa(e,"get","$attrs"),t[n]}}))}function OI(e){const t=n=>{e.exposed=n||{}};return{get attrs(){return aee(e)},slots:e.slots,emit:e.emit,expose:t}}function Y4(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(JL(eo(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Fm)return Fm[n](e)},has(t,n){return n in t||n in Fm}}))}function lee(e,t=!0){return Kt(e)?e.displayName||e.name:e.name||t&&e.__name}function see(e){return Kt(e)&&"__vccOpts"in e}const G=(e,t)=>sJ(e,t,Ag);function Nt(e,t,n){const r=arguments.length;return r===2?yn(t)&&!Ot(t)?Sr(t)?Y(e,null,[t]):Y(e,t):Y(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&Sr(n)&&(n=[n]),Y(e,t,n))}const uee=Symbol.for("v-scx"),cee=()=>Tt(uee),dee="3.3.9",fee="http://www.w3.org/2000/svg",wf=typeof document<"u"?document:null,EM=wf&&wf.createElement("template"),pee={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const o=t?wf.createElementNS(fee,e):wf.createElement(e,n?{is:n}:void 0);return e==="select"&&r&&r.multiple!=null&&o.setAttribute("multiple",r.multiple),o},createText:e=>wf.createTextNode(e),createComment:e=>wf.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>wf.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,o,i){const a=n?n.previousSibling:t.lastChild;if(o&&(o===i||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===i||!(o=o.nextSibling)););else{EM.innerHTML=r?`${e}`:e;const l=EM.content;if(r){const s=l.firstChild;for(;s.firstChild;)l.appendChild(s.firstChild);l.removeChild(s)}t.insertBefore(l,n)}return[a?a.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Nc="transition",qv="animation",l0=Symbol("_vtc"),Yr=(e,{slots:t})=>Nt(EJ,NI(e),t);Yr.displayName="Transition";const DI={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},hee=Yr.props=Jo({},cI,DI),of=(e,t=[])=>{Ot(e)?e.forEach(n=>n(...t)):e&&e(...t)},AM=e=>e?Ot(e)?e.some(t=>t.length>1):e.length>1:!1;function NI(e){const t={};for(const I in e)I in DI||(t[I]=e[I]);if(e.css===!1)return t;const{name:n="v",type:r,duration:o,enterFromClass:i=`${n}-enter-from`,enterActiveClass:a=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:s=i,appearActiveClass:u=a,appearToClass:c=l,leaveFromClass:d=`${n}-leave-from`,leaveActiveClass:f=`${n}-leave-active`,leaveToClass:p=`${n}-leave-to`}=e,v=vee(o),m=v&&v[0],y=v&&v[1],{onBeforeEnter:g,onEnter:_,onEnterCancelled:x,onLeave:C,onLeaveCancelled:E,onBeforeAppear:A=g,onAppear:S=_,onAppearCancelled:D=x}=t,L=(I,F,z)=>{Rc(I,F?c:l),Rc(I,F?u:a),z&&z()},M=(I,F)=>{I._isLeaving=!1,Rc(I,d),Rc(I,p),Rc(I,f),F&&F()},R=I=>(F,z)=>{const O=I?S:_,j=()=>L(F,I,z);of(O,[F,j]),SM(()=>{Rc(F,I?s:i),Ru(F,I?c:l),AM(O)||kM(F,r,m,j)})};return Jo(t,{onBeforeEnter(I){of(g,[I]),Ru(I,i),Ru(I,a)},onBeforeAppear(I){of(A,[I]),Ru(I,s),Ru(I,u)},onEnter:R(!1),onAppear:R(!0),onLeave(I,F){I._isLeaving=!0;const z=()=>M(I,F);Ru(I,d),RI(),Ru(I,f),SM(()=>{I._isLeaving&&(Rc(I,d),Ru(I,p),AM(C)||kM(I,r,y,z))}),of(C,[I,z])},onEnterCancelled(I){L(I,!1),of(x,[I])},onAppearCancelled(I){L(I,!0),of(D,[I])},onLeaveCancelled(I){M(I),of(E,[I])}})}function vee(e){if(e==null)return null;if(yn(e))return[hw(e.enter),hw(e.leave)];{const t=hw(e);return[t,t]}}function hw(e){return kZ(e)}function Ru(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[l0]||(e[l0]=new Set)).add(t)}function Rc(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[l0];n&&(n.delete(t),n.size||(e[l0]=void 0))}function SM(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let mee=0;function kM(e,t,n,r){const o=e._endId=++mee,i=()=>{o===e._endId&&r()};if(n)return setTimeout(i,n);const{type:a,timeout:l,propCount:s}=FI(e,t);if(!a)return r();const u=a+"end";let c=0;const d=()=>{e.removeEventListener(u,f),i()},f=p=>{p.target===e&&++c>=s&&d()};setTimeout(()=>{c(n[v]||"").split(", "),o=r(`${Nc}Delay`),i=r(`${Nc}Duration`),a=TM(o,i),l=r(`${qv}Delay`),s=r(`${qv}Duration`),u=TM(l,s);let c=null,d=0,f=0;t===Nc?a>0&&(c=Nc,d=a,f=i.length):t===qv?u>0&&(c=qv,d=u,f=s.length):(d=Math.max(a,u),c=d>0?a>u?Nc:qv:null,f=c?c===Nc?i.length:s.length:0);const p=c===Nc&&/\b(transform|all)(,|$)/.test(r(`${Nc}Property`).toString());return{type:c,timeout:d,propCount:f,hasTransform:p}}function TM(e,t){for(;e.lengthMM(n)+MM(e[r])))}function MM(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function RI(){return document.body.offsetHeight}function gee(e,t,n){const r=e[l0];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const M9=Symbol("_vod"),Zt={beforeMount(e,{value:t},{transition:n}){e[M9]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):Xv(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),Xv(e,!0),r.enter(e)):r.leave(e,()=>{Xv(e,!1)}):Xv(e,t))},beforeUnmount(e,{value:t}){Xv(e,t)}};function Xv(e,t){e.style.display=t?e[M9]:"none"}function yee(e,t,n){const r=e.style,o=Qt(n);if(n&&!o){if(t&&!Qt(t))for(const i in t)n[i]==null&&vx(r,i,"");for(const i in n)vx(r,i,n[i])}else{const i=r.display;o?t!==n&&(r.cssText=n):t&&e.removeAttribute("style"),M9 in e&&(r.display=i)}}const OM=/\s*!important$/;function vx(e,t,n){if(Ot(n))n.forEach(r=>vx(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=_ee(e,t);OM.test(n)?e.setProperty(Td(r),n.replace(OM,""),"important"):e[r]=n}}const DM=["Webkit","Moz","ms"],vw={};function _ee(e,t){const n=vw[t];if(n)return n;let r=Nl(t);if(r!=="filter"&&r in e)return vw[t]=r;r=d1(r);for(let o=0;omw||(Aee.then(()=>mw=0),mw=Date.now());function kee(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;Al(Tee(r,n.value),t,5,[r])};return n.value=e,n.attached=See(),n}function Tee(e,t){if(Ot(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>o=>!o._stopped&&r&&r(o))}else return t}const PM=/^on[a-z]/,Mee=(e,t,n,r,o=!1,i,a,l,s)=>{t==="class"?gee(e,r,o):t==="style"?yee(e,n,r):R4(t)?s9(t)||Cee(e,t,n,r,a):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Oee(e,t,r,o))?wee(e,t,r,i,a,l,s):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),bee(e,t,r,o))};function Oee(e,t,n,r){return r?!!(t==="innerHTML"||t==="textContent"||t in e&&PM.test(t)&&Kt(n)):t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA"||PM.test(t)&&Qt(n)?!1:t in e}const PI=new WeakMap,BI=new WeakMap,X_=Symbol("_moveCb"),BM=Symbol("_enterCb"),LI={name:"TransitionGroup",props:Jo({},hee,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=Wt(),r=uI();let o,i;return pu(()=>{if(!o.length)return;const a=e.moveClass||`${e.name||"v"}-move`;if(!Pee(o[0].el,n.vnode.el,a))return;o.forEach(Nee),o.forEach(Fee);const l=o.filter(Ree);RI(),l.forEach(s=>{const u=s.el,c=u.style;Ru(u,a),c.transform=c.webkitTransform=c.transitionDuration="";const d=u[X_]=f=>{f&&f.target!==u||(!f||/transform$/.test(f.propertyName))&&(u.removeEventListener("transitionend",d),u[X_]=null,Rc(u,a))};u.addEventListener("transitionend",d)})}),()=>{const a=Qn(e),l=NI(a);let s=a.tag||ot;o=i,i=t.default?E9(t.default()):[];for(let u=0;udelete e.mode;LI.props;const O9=LI;function Nee(e){const t=e.el;t[X_]&&t[X_](),t[BM]&&t[BM]()}function Fee(e){BI.set(e,e.el.getBoundingClientRect())}function Ree(e){const t=PI.get(e),n=BI.get(e),r=t.left-n.left,o=t.top-n.top;if(r||o){const i=e.el.style;return i.transform=i.webkitTransform=`translate(${r}px,${o}px)`,i.transitionDuration="0s",e}}function Pee(e,t,n){const r=e.cloneNode(),o=e[l0];o&&o.forEach(l=>{l.split(/\s+/).forEach(s=>s&&r.classList.remove(s))}),n.split(/\s+/).forEach(l=>l&&r.classList.add(l)),r.style.display="none";const i=t.nodeType===1?t:t.parentNode;i.appendChild(r);const{hasTransform:a}=FI(r);return i.removeChild(r),a}const s0=e=>{const t=e.props["onUpdate:modelValue"]||!1;return Ot(t)?n=>Vy(t,n):t};function Bee(e){e.target.composing=!0}function LM(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Yu=Symbol("_assign"),h1={created(e,{modifiers:{lazy:t,trim:n,number:r}},o){e[Yu]=s0(o);const i=r||o.props&&o.props.type==="number";Gc(e,t?"change":"input",a=>{if(a.target.composing)return;let l=e.value;n&&(l=l.trim()),i&&(l=rx(l)),e[Yu](l)}),n&&Gc(e,"change",()=>{e.value=e.value.trim()}),t||(Gc(e,"compositionstart",Bee),Gc(e,"compositionend",LM),Gc(e,"change",LM))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,modifiers:{lazy:n,trim:r,number:o}},i){if(e[Yu]=s0(i),e.composing)return;const a=o||e.type==="number"?rx(e.value):e.value,l=t??"";a!==l&&(document.activeElement===e&&e.type!=="range"&&(n||r&&e.value.trim()===l)||(e.value=l))}},Q_={deep:!0,created(e,t,n){e[Yu]=s0(n),Gc(e,"change",()=>{const r=e._modelValue,o=$I(e),i=e.checked,a=e[Yu];if(Ot(r)){const l=LL(r,o),s=l!==-1;if(i&&!s)a(r.concat(o));else if(!i&&s){const u=[...r];u.splice(l,1),a(u)}}else if(P4(r)){const l=new Set(r);i?l.add(o):l.delete(o),a(l)}else a(zI(e,i))})},mounted:IM,beforeUpdate(e,t,n){e[Yu]=s0(n),IM(e,t,n)}};function IM(e,{value:t,oldValue:n},r){e._modelValue=t,Ot(t)?e.checked=LL(t,r.props.value)>-1:P4(t)?e.checked=t.has(r.props.value):t!==n&&(e.checked=o0(t,zI(e,!0)))}const II={created(e,{value:t},n){e.checked=o0(t,n.props.value),e[Yu]=s0(n),Gc(e,"change",()=>{e[Yu]($I(e))})},beforeUpdate(e,{value:t,oldValue:n},r){e[Yu]=s0(r),t!==n&&(e.checked=o0(t,r.props.value))}};function $I(e){return"_value"in e?e._value:e.value}function zI(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const Lee=["ctrl","shift","alt","meta"],Iee={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>Lee.some(n=>e[`${n}Key`]&&!t.includes(n))},kt=(e,t)=>(n,...r)=>{for(let o=0;on=>{if(!("key"in n))return;const r=Td(n.key);if(t.some(o=>o===r||$ee[o]===r))return e(n)},zee=Jo({patchProp:Mee},pee);let $M;function VI(){return $M||($M=KJ(zee))}const rc=(...e)=>{VI().render(...e)},G4=(...e)=>{const t=VI().createApp(...e),{mount:n}=t;return t.mount=r=>{const o=Vee(r);if(!o)return;const i=t._component;!Kt(i)&&!i.render&&!i.template&&(i.template=o.innerHTML),o.innerHTML="";const a=n(o,!1,o instanceof SVGElement);return o instanceof Element&&(o.removeAttribute("v-cloak"),o.setAttribute("data-v-app","")),a},t};function Vee(e){return Qt(e)?document.querySelector(e):e}const mx={tab:"Tab",enter:"Enter",space:"Space",left:"ArrowLeft",up:"ArrowUp",right:"ArrowRight",down:"ArrowDown",esc:"Escape",delete:"Delete",backspace:"Backspace",numpadEnter:"NumpadEnter",pageUp:"PageUp",pageDown:"PageDown",home:"Home",end:"End"},Hee=["","default","small","large"];function D9(e){return L4()?(I4(e),!0):!1}function q4(e){return typeof e=="function"?e():w(e)}const gp=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const jee=Object.prototype.toString,Wee=e=>jee.call(e)==="[object Object]",Uee=()=>{};function Kee(e,t,n={}){const{immediate:r=!0}=n,o=ue(!1);let i=null;function a(){i&&(clearTimeout(i),i=null)}function l(){o.value=!1,a()}function s(...u){a(),o.value=!0,i=setTimeout(()=>{o.value=!1,i=null,e(...u)},q4(t))}return r&&(o.value=!0,gp&&s()),D9(l),{isPending:pp(o),start:s,stop:l}}const HI=gp?window:void 0,umt=gp?window.document:void 0;function gx(e){var t;const n=q4(e);return(t=n==null?void 0:n.$el)!=null?t:n}function Yee(...e){let t,n,r,o;if(typeof e[0]=="string"||Array.isArray(e[0])?([n,r,o]=e,t=HI):[t,n,r,o]=e,!t)return Uee;Array.isArray(n)||(n=[n]),Array.isArray(r)||(r=[r]);const i=[],a=()=>{i.forEach(c=>c()),i.length=0},l=(c,d,f,p)=>(c.addEventListener(d,f,p),()=>c.removeEventListener(d,f,p)),s=Xe(()=>[gx(t),q4(o)],([c,d])=>{if(a(),!c)return;const f=Wee(d)?{...d}:d;i.push(...n.flatMap(p=>r.map(v=>l(c,p,v,f))))},{immediate:!0,flush:"post"}),u=()=>{s(),a()};return D9(u),u}function Gee(){const e=ue(!1),t=Wt();return t&&nn(()=>{e.value=!0},t),e}function qee(e){const t=Gee();return G(()=>(t.value,!!e()))}function Xee(e,t,n={}){const{window:r=HI,...o}=n;let i;const a=qee(()=>r&&"ResizeObserver"in r),l=()=>{i&&(i.disconnect(),i=void 0)},s=G(()=>{const d=q4(e);return Array.isArray(d)?d.map(f=>gx(f)):[gx(d)]}),u=Xe(s,d=>{if(l(),a.value&&r){i=new ResizeObserver(t);for(const f of d)f&&i.observe(f,o)}},{immediate:!0,flush:"post"}),c=()=>{l(),u()};return D9(c),{isSupported:a,stop:c}}const Qee=()=>gp&&/android/i.test(window.navigator.userAgent);/** +* @vue/shared v3.5.32 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/const Zee=Object.prototype.hasOwnProperty,Z_=(e,t)=>Zee.call(e,t),jI=Array.isArray,J_=e=>typeof e=="function",K0=e=>typeof e=="string",WI=e=>e!==null&&typeof e=="object",UI=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},Jee=/-\w/g,cmt=UI(e=>e.replace(Jee,t=>t.slice(1).toUpperCase())),dmt=UI(e=>e.charAt(0).toUpperCase()+e.slice(1));var KI=typeof global=="object"&&global&&global.Object===Object&&global,ete=typeof self=="object"&&self&&self.Object===Object&&self,ri=KI||ete||Function("return this")(),Bi=ri.Symbol,YI=Object.prototype,tte=YI.hasOwnProperty,nte=YI.toString,Qv=Bi?Bi.toStringTag:void 0;function rte(e){var t=tte.call(e,Qv),n=e[Qv];try{e[Qv]=void 0;var r=!0}catch{}var o=nte.call(e);return r&&(t?e[Qv]=n:delete e[Qv]),o}var ote=Object.prototype,ite=ote.toString;function ate(e){return ite.call(e)}var lte="[object Null]",ste="[object Undefined]",zM=Bi?Bi.toStringTag:void 0;function da(e){return e==null?e===void 0?ste:lte:zM&&zM in Object(e)?rte(e):ate(e)}function xo(e){return e!=null&&typeof e=="object"}var ute="[object Symbol]";function al(e){return typeof e=="symbol"||xo(e)&&da(e)==ute}var cte=NaN;function VM(e){return typeof e=="number"?e:al(e)?cte:+e}function lo(e,t){for(var n=-1,r=e==null?0:e.length,o=Array(r);++n0){if(++t>=Kte)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}var n$=t$(QI),qte=/\{\n\/\* \[wrapped with (.+)\] \*/,Xte=/,? & /;function Qte(e){var t=e.match(qte);return t?t[1].split(Xte):[]}var Zte=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/;function Jte(e,t){var n=t.length;if(!n)return e;var r=n-1;return t[r]=(n>1?"& ":"")+t[r],t=t.join(n>2?", ":" "),e.replace(Zte,`{ +/* [wrapped with `+t+`] */ +`)}function F9(e){return function(){return e}}var tb=function(){try{var e=_p(Object,"defineProperty");return e({},"",{}),e}catch{}}(),ene=tb?function(e,t){return tb(e,"toString",{configurable:!0,enumerable:!1,value:F9(t),writable:!0})}:$a,R9=t$(ene);function pl(e,t){for(var n=-1,r=e==null?0:e.length;++n-1}var nne=1,rne=2,one=8,ine=16,ane=32,lne=64,sne=128,une=256,cne=512,dne=[["ary",sne],["bind",nne],["bindKey",rne],["curry",one],["curryRight",ine],["flip",cne],["partial",ane],["partialRight",lne],["rearg",une]];function fne(e,t){return pl(dne,function(n){var r="_."+n[0];t&n[1]&&!J4(e,r)&&e.push(r)}),e.sort()}function o$(e,t,n){var r=t+"";return R9(e,Jte(r,fne(Qte(r),n)))}var pne=4,hne=8,GM=32,qM=64;function i$(e,t,n,r,o,i,a,l,s,u){var c=t&hne,d=c?a:void 0,f=c?void 0:a,p=c?i:void 0,v=c?void 0:i;t|=c?GM:qM,t&=~(c?qM:GM),t&pne||(t&=-4);var m=[e,t,o,p,d,v,f,l,s,u],y=n.apply(void 0,m);return yx(e)&&n$(y,m),y.placeholder=r,o$(y,e,t)}function q0(e){var t=e;return t.placeholder}var vne=9007199254740991,mne=/^(?:0|[1-9]\d*)$/;function cc(e,t){var n=typeof e;return t=t??vne,!!t&&(n=="number"||n!="symbol"&&mne.test(e))&&e>-1&&e%1==0&&e1&&_.reverse(),c&&s-1&&e%1==0&&e<=Ine}function za(e){return e!=null&&t6(e.length)&&!Ms(e)}function la(e,t,n){if(!uo(n))return!1;var r=typeof t;return(r=="number"?za(n)&&cc(t,n.length):r=="string"&&t in n)?Os(n[t],e):!1}function X0(e){return or(function(t,n){var r=-1,o=n.length,i=o>1?n[o-1]:void 0,a=o>2?n[2]:void 0;for(i=e.length>3&&typeof i=="function"?(o--,i):void 0,a&&la(n[0],n[1],a)&&(i=o<3?void 0:i,o=1),t=Object(t);++r-1}function qre(e,t){var n=this.__data__,r=n6(n,e);return r<0?(++this.size,n.push([e,t])):n[r][1]=t,this}function fc(e){var t=-1,n=e==null?0:e.length;for(this.clear();++t0&&n(l)?t>1?_i(l,t-1,n,r,o):Od(o,l):r||(o[o.length]=l)}return o}function z9(e){var t=e==null?0:e.length;return t?_i(e,1):[]}function hc(e){return R9(l$(e,void 0,z9),e+"")}var soe=hc($9),o6=f$(Object.getPrototypeOf,Object),uoe="[object Object]",coe=Function.prototype,doe=Object.prototype,h$=coe.toString,foe=doe.hasOwnProperty,poe=h$.call(Object);function Z0(e){if(!xo(e)||da(e)!=uoe)return!1;var t=o6(e);if(t===null)return!0;var n=foe.call(t,"constructor")&&t.constructor;return typeof n=="function"&&n instanceof n&&h$.call(n)==poe}var hoe="[object DOMException]",voe="[object Error]";function V9(e){if(!xo(e))return!1;var t=da(e);return t==voe||t==hoe||typeof e.message=="string"&&typeof e.name=="string"&&!Z0(e)}var v$=or(function(e,t){try{return sl(e,void 0,t)}catch(n){return V9(n)?n:new Error(n)}}),moe="Expected a function";function m$(e,t){var n;if(typeof t!="function")throw new TypeError(moe);return e=tr(e),function(){return--e>0&&(n=t.apply(this,arguments)),e<=1&&(t=void 0),n}}var goe=1,yoe=32,i6=or(function(e,t,n){var r=goe;if(n.length){var o=md(n,q0(i6));r|=yoe}return dc(e,r,t,n,o)});i6.placeholder={};var _oe=hc(function(e,t){return pl(t,function(n){n=Cs(n),hu(e,n,i6(e[n],e))}),e}),boe=1,woe=2,xoe=32,H9=or(function(e,t,n){var r=boe|woe;if(n.length){var o=md(n,q0(H9));r|=xoe}return dc(t,r,e,n,o)});H9.placeholder={};function Pl(e,t,n){var r=-1,o=e.length;t<0&&(t=-t>o?0:o+t),n=n>o?o:n,n<0&&(n+=o),o=t>n?0:n-t>>>0,t>>>=0;for(var i=Array(o);++r=r?e:Pl(e,t,n)}var Coe="\\ud800-\\udfff",Eoe="\\u0300-\\u036f",Aoe="\\ufe20-\\ufe2f",Soe="\\u20d0-\\u20ff",koe=Eoe+Aoe+Soe,Toe="\\ufe0e\\ufe0f",Moe="\\u200d",Ooe=RegExp("["+Moe+Coe+koe+Toe+"]");function J0(e){return Ooe.test(e)}function Doe(e){return e.split("")}var g$="\\ud800-\\udfff",Noe="\\u0300-\\u036f",Foe="\\ufe20-\\ufe2f",Roe="\\u20d0-\\u20ff",Poe=Noe+Foe+Roe,Boe="\\ufe0e\\ufe0f",Loe="["+g$+"]",bx="["+Poe+"]",wx="\\ud83c[\\udffb-\\udfff]",Ioe="(?:"+bx+"|"+wx+")",y$="[^"+g$+"]",_$="(?:\\ud83c[\\udde6-\\uddff]){2}",b$="[\\ud800-\\udbff][\\udc00-\\udfff]",$oe="\\u200d",w$=Ioe+"?",x$="["+Boe+"]?",zoe="(?:"+$oe+"(?:"+[y$,_$,b$].join("|")+")"+x$+w$+")*",Voe=x$+w$+zoe,Hoe="(?:"+[y$+bx+"?",bx,_$,b$,Loe].join("|")+")",joe=RegExp(wx+"(?="+wx+")|"+Hoe+Voe,"g");function Woe(e){return e.match(joe)||[]}function Es(e){return J0(e)?Woe(e):Doe(e)}function C$(e){return function(t){t=Br(t);var n=J0(t)?Es(t):void 0,r=n?n[0]:t.charAt(0),o=n?Dd(n,1).join(""):t.slice(1);return r[e]()+o}}var j9=C$("toUpperCase");function E$(e){return j9(Br(e).toLowerCase())}function W9(e,t,n,r){var o=-1,i=e==null?0:e.length;for(r&&i&&(n=e[++o]);++o=t?e:t)),e}function Bie(e,t,n){return n===void 0&&(n=t,t=void 0),n!==void 0&&(n=Sl(n),n=n===n?n:0),t!==void 0&&(t=Sl(t),t=t===t?t:0),wp(Sl(e),t,n)}function Lie(){this.__data__=new fc,this.size=0}function Iie(e){var t=this.__data__,n=t.delete(e);return this.size=t.size,n}function $ie(e){return this.__data__.get(e)}function zie(e){return this.__data__.has(e)}var Vie=200;function Hie(e,t){var n=this.__data__;if(n instanceof fc){var r=n.__data__;if(!Mg||r.lengthl))return!1;var u=i.get(e),c=i.get(t);if(u&&c)return u==t&&c==e;var d=-1,f=!0,p=n&ble?new Qf:void 0;for(i.set(e,t),i.set(t,e);++d=t||S<0||d&&D>=i}function g(){var A=Uy();if(y(A))return _(A);l=setTimeout(g,m(A))}function _(A){return l=void 0,f&&r?p(A):(r=o=void 0,a)}function x(){l!==void 0&&clearTimeout(l),u=0,r=s=o=l=void 0}function C(){return l===void 0?a:_(Uy())}function E(){var A=Uy(),S=y(A);if(r=arguments,o=this,s=A,S){if(l===void 0)return v(s);if(d)return clearTimeout(l),l=setTimeout(g,t),p(s)}return l===void 0&&(l=setTimeout(g,t)),a}return E.cancel=x,E.flush=C,E}function dse(e,t){return e==null||e!==e?t:e}var uz=Object.prototype,fse=uz.hasOwnProperty,pse=or(function(e,t){e=Object(e);var n=-1,r=t.length,o=r>2?t[2]:void 0;for(o&&la(t[0],t[1],o)&&(r=1);++n=_se&&(i=Og,a=!1,t=new Qf(t));e:for(;++o=0&&e.slice(n,o)==t}function Dse(e,t){return lo(t,function(n){return[n,e[n]]})}function Nse(e){var t=-1,n=Array(e.size);return e.forEach(function(r){n[++t]=[r,r]}),n}var Fse="[object Map]",Rse="[object Set]";function mz(e){return function(t){var n=Oi(t);return n==Fse?Z9(t):n==Rse?Nse(t):Dse(t,e(t))}}var vc=mz(oi),Pse=mz(Va),Bse={"&":"&","<":"<",">":">",'"':""","'":"'"},Lse=U9(Bse),gz=/[&<>"']/g,Ise=RegExp(gz.source);function yz(e){return e=Br(e),e&&Ise.test(e)?e.replace(gz,Lse):e}var _z=/[\\^$.*+?()[\]{}|]/g,$se=RegExp(_z.source);function zse(e){return e=Br(e),e&&$se.test(e)?e.replace(_z,"\\$&"):e}function bz(e,t){for(var n=-1,r=e==null?0:e.length;++no?0:o+n),r=r===void 0||r>o?o:tr(r),r<0&&(r+=o),r=n>r?0:wz(r);n-1?o[i?t[a]:a]:void 0}}var Yse=Math.max;function sA(e,t,n){var r=e==null?0:e.length;if(!r)return-1;var o=n==null?0:tr(n);return o<0&&(o=Yse(r+o,0)),Z4(e,Kn(t),o)}var _d=Cz(sA);function Ez(e,t,n){var r;return n(e,function(o,i,a){if(t(o,i,a))return r=i,!1}),r}function Gse(e,t){return Ez(e,Kn(t),mu)}var qse=Math.max,Xse=Math.min;function uA(e,t,n){var r=e==null?0:e.length;if(!r)return-1;var o=r-1;return n!==void 0&&(o=tr(n),o=n<0?qse(r+o,0):Xse(o,r-1)),Z4(e,Kn(t),o,!0)}var Qse=Cz(uA);function Zse(e,t){return Ez(e,Kn(t),lA)}function Jse(e){return e&&e.length?e[0]:void 0}function Az(e,t){var n=-1,r=za(e)?Array(e.length):[];return Fd(e,function(o,i,a){r[++n]=t(o,i,a)}),r}function dl(e,t){var n=Un(e)?lo:Az;return n(e,Kn(t))}function Sz(e,t){return _i(dl(e,t),1)}var eue=1/0;function tue(e,t){return _i(dl(e,t),eue)}function nue(e,t,n){return n=n===void 0?1:tr(n),_i(dl(e,t),n)}var rue=1/0;function kz(e){var t=e==null?0:e.length;return t?_i(e,rue):[]}function oue(e,t){var n=e==null?0:e.length;return n?(t=t===void 0?1:tr(t),_i(e,t)):[]}var iue=512;function aue(e){return dc(e,iue)}var lue=K9("floor"),sue="Expected a function",uue=8,cue=32,due=128,fue=256;function Tz(e){return hc(function(t){var n=t.length,r=n,o=Fl.prototype.thru;for(e&&t.reverse();r--;){var i=t[r];if(typeof i!="function")throw new TypeError(sue);if(o&&!a&&Wy(i)=="wrapper")var a=new Fl([],!0)}for(r=a?r:n;++rt}function d6(e){return function(t,n){return typeof t=="string"&&typeof n=="string"||(t=Sl(t),n=Sl(n)),e(t,n)}}var Eue=d6(cA),Aue=d6(function(e,t){return e>=t}),Sue=Object.prototype,kue=Sue.hasOwnProperty;function Tue(e,t){return e!=null&&kue.call(e,t)}function rb(e,t){return e!=null&&rz(e,t,Tue)}var Mue=Math.max,Oue=Math.min;function Due(e,t,n){return e>=Oue(t,n)&&e-1:!!o&&G0(e,t,n)>-1}var Bue=Math.max;function Mz(e,t,n){var r=e==null?0:e.length;if(!r)return-1;var o=n==null?0:tr(n);return o<0&&(o=Bue(r+o,0)),G0(e,t,o)}function Lue(e){var t=e==null?0:e.length;return t?Pl(e,0,-1):[]}var Iue=Math.min;function fA(e,t,n){for(var r=n?aA:J4,o=e[0].length,i=e.length,a=i,l=Array(i),s=1/0,u=[];a--;){var c=e[a];a&&t&&(c=lo(c,ul(t))),s=Iue(c.length,s),l[a]=!n&&(t||o>=120&&c.length>=120)?new Qf(a&&c):void 0}c=e[0];var d=-1,f=l[0];e:for(;++d=-PO&&e<=PO}function oc(e){return e===void 0}var Cce="[object WeakMap]";function Ece(e){return xo(e)&&Oi(e)==Cce}var Ace="[object WeakSet]";function Sce(e){return xo(e)&&da(e)==Ace}var kce=1;function Tce(e){return Kn(typeof e=="function"?e:kl(e,kce))}var Mce=Array.prototype,Oce=Mce.join;function Dce(e,t){return e==null?"":Oce.call(e,t)}var Nce=ev(function(e,t,n){return e+(n?"-":"")+t.toLowerCase()}),Fce=l6(function(e,t,n){hu(e,n,t)});function Rce(e,t,n){for(var r=n+1;r--;)if(e[r]===t)return r;return r}var Pce=Math.max,Bce=Math.min;function Lce(e,t,n){var r=e==null?0:e.length;if(!r)return-1;var o=r;return n!==void 0&&(o=tr(n),o=o<0?Pce(r+o,0):Bce(o,r-1)),t===t?Rce(e,t,o):Z4(e,r$,o,!0)}var Ice=ev(function(e,t,n){return e+(n?" ":"")+t.toLowerCase()}),$ce=C$("toLowerCase");function vA(e,t){return e=this.__values__.length,t=e?void 0:this.__values__[this.__index__++];return{done:e,value:t}}function Iz(e,t){var n=e.length;if(n)return t+=t<0?n:0,cc(t,n)?e[t]:void 0}function ude(e,t){return e&&e.length?Iz(e,tr(t)):void 0}function cde(e){return e=tr(e),or(function(t){return Iz(t,e)})}var dde=Object.prototype,fde=dde.hasOwnProperty;function gA(e,t){t=Md(t,e);var n=-1,r=t.length;if(!r)return!0;for(;++n1),i}),vu(e,q9(e),n),r&&(n=kl(n,hde|vde|mde,pde));for(var o=t.length;o--;)gA(n,t[o]);return n});function w1(e,t,n,r){if(!uo(e))return e;t=Md(t,e);for(var o=-1,i=t.length,a=i-1,l=e;l!=null&&++ot||i&&a&&s&&!l&&!u||r&&a&&s||!n&&s||!o)return 1;if(!r&&!i&&!u&&e=l)return s;var u=n[r];return s*(u=="desc"?-1:1)}}return e.index-t.index}function Hz(e,t,n){t.length?t=lo(t,function(i){return Un(i)?function(a){return bp(a,i.length===1?i[0]:i)}:i}):t=[$a];var r=-1;t=lo(t,ul(Kn));var o=Az(e,function(i,a,l){var s=lo(t,function(u){return u(i)});return{criteria:s,index:++r,value:i}});return bde(o,function(i,a){return wde(i,a,n)})}function xde(e,t,n,r){return e==null?[]:(Un(t)||(t=t==null?[]:[t]),n=r?void 0:n,Un(n)||(n=n==null?[]:[n]),Hz(e,t,n))}function yA(e){return hc(function(t){return t=lo(t,ul(Kn)),or(function(n){var r=this;return e(t,function(o){return sl(o,r,n)})})})}var Cde=yA(lo),Ede=or,Ade=Math.min,Sde=Ede(function(e,t){t=t.length==1&&Un(t[0])?lo(t[0],ul(Kn)):lo(_i(t,1),ul(Kn));var n=t.length;return or(function(r){for(var o=-1,i=Ade(r.length,n);++oMde)return n;do t%2&&(n+=e),t=Ode(t/2),t&&(e+=e);while(t);return n}var Dde=nA("length"),jz="\\ud800-\\udfff",Nde="\\u0300-\\u036f",Fde="\\ufe20-\\ufe2f",Rde="\\u20d0-\\u20ff",Pde=Nde+Fde+Rde,Bde="\\ufe0e\\ufe0f",Lde="["+jz+"]",Mx="["+Pde+"]",Ox="\\ud83c[\\udffb-\\udfff]",Ide="(?:"+Mx+"|"+Ox+")",Wz="[^"+jz+"]",Uz="(?:\\ud83c[\\udde6-\\uddff]){2}",Kz="[\\ud800-\\udbff][\\udc00-\\udfff]",$de="\\u200d",Yz=Ide+"?",Gz="["+Bde+"]?",zde="(?:"+$de+"(?:"+[Wz,Uz,Kz].join("|")+")"+Gz+Yz+")*",Vde=Gz+Yz+zde,Hde="(?:"+[Wz+Mx+"?",Mx,Uz,Kz,Lde].join("|")+")",BO=RegExp(Ox+"(?="+Ox+")|"+Hde+Vde,"g");function jde(e){for(var t=BO.lastIndex=0;BO.test(e);)++t;return t}function nv(e){return J0(e)?jde(e):Dde(e)}var Wde=Math.ceil;function ib(e,t){t=t===void 0?" ":ll(t);var n=t.length;if(n<2)return n?Tx(t,e):t;var r=Tx(t,Wde(e/nv(t)));return J0(t)?Dd(Es(r),0,e).join(""):r.slice(0,e)}var Ude=Math.ceil,Kde=Math.floor;function Yde(e,t,n){e=Br(e),t=tr(t);var r=t?nv(e):0;if(!t||r>=t)return e;var o=(t-r)/2;return ib(Kde(o),n)+e+ib(Ude(o),n)}function Gde(e,t,n){e=Br(e),t=tr(t);var r=t?nv(e):0;return t&&r-1;)l!==e&&LO.call(l,s,1),LO.call(e,s,1);return e}function qz(e,t){return e&&e.length&&t&&t.length?bA(e,t):e}var lfe=or(qz);function sfe(e,t,n){return e&&e.length&&t&&t.length?bA(e,t,Kn(n)):e}function ufe(e,t,n){return e&&e.length&&t&&t.length?bA(e,t,void 0,n):e}var cfe=Array.prototype,dfe=cfe.splice;function Xz(e,t){for(var n=e?t.length:0,r=n-1;n--;){var o=t[n];if(n==r||o!==i){var i=o;cc(o)?dfe.call(e,o,1):gA(e,o)}}return e}var ffe=hc(function(e,t){var n=e==null?0:e.length,r=$9(e,t);return Xz(e,lo(t,function(o){return cc(o,n)?+o:o}).sort(Vz)),r}),pfe=Math.floor,hfe=Math.random;function wA(e,t){return e+pfe(hfe()*(t-e+1))}var vfe=parseFloat,mfe=Math.min,gfe=Math.random;function yfe(e,t,n){if(n&&typeof n!="boolean"&&la(e,t,n)&&(t=n=void 0),n===void 0&&(typeof t=="boolean"?(n=t,t=void 0):typeof e=="boolean"&&(n=e,e=void 0)),e===void 0&&t===void 0?(e=0,t=1):(e=Gu(e),t===void 0?(t=e,e=0):t=Gu(t)),e>t){var r=e;e=t,t=r}if(n||e%1||t%1){var o=gfe();return mfe(e+o*(t-e+vfe("1e-"+((o+"").length-1))),t)}return wA(e,t)}var _fe=Math.ceil,bfe=Math.max;function wfe(e,t,n,r){for(var o=-1,i=bfe(_fe((t-e)/(n||1)),0),a=Array(i);i--;)a[r?i:++o]=e,e+=n;return a}function Qz(e){return function(t,n,r){return r&&typeof r!="number"&&la(t,n,r)&&(n=r=void 0),t=Gu(t),n===void 0?(n=t,t=0):n=Gu(n),r=r===void 0?t1&&la(e,t[0],t[1])?t=[]:n>2&&la(t[0],t[1],t[2])&&(t=[t[0]]),Hz(e,_i(t,1),[])}),tpe=4294967295,npe=tpe-1,rpe=Math.floor,ope=Math.min;function CA(e,t,n,r){var o=0,i=e==null?0:e.length;if(i===0)return 0;t=n(t);for(var a=t!==t,l=t===null,s=al(t),u=t===void 0;o>>1;function g6(e,t,n){var r=0,o=e==null?r:e.length;if(typeof t=="number"&&t===t&&o<=ape){for(;r>>1,a=e[i];a!==null&&!al(a)&&(n?a<=t:a>>0,n?(e=Br(e),e&&(typeof t=="string"||t!=null&&!hA(t))&&(t=ll(t),!t&&J0(e))?Dd(Es(e),0,n):e.split(t,n)):[]}var gpe="Expected a function",ype=Math.max;function _pe(e,t){if(typeof e!="function")throw new TypeError(gpe);return t=t==null?0:ype(tr(t),0),or(function(n){var r=n[t],o=Dd(n,0,t);return r&&Od(o,r),sl(e,this,o)})}var bpe=ev(function(e,t,n){return e+(n?" ":"")+j9(t)});function wpe(e,t,n){return e=Br(e),n=n==null?0:wp(tr(n),0,e.length),t=ll(t),e.slice(n,n+t.length)==t}function xpe(){return{}}function Cpe(){return""}function Epe(){return!0}var Ape=X4(function(e,t){return e-t},0);function Spe(e){return e&&e.length?mA(e,$a):0}function kpe(e,t){return e&&e.length?mA(e,Kn(t)):0}function Tpe(e){var t=e==null?0:e.length;return t?Pl(e,1,t):[]}function Mpe(e,t,n){return e&&e.length?(t=n||t===void 0?1:tr(t),Pl(e,0,t<0?0:t)):[]}function Ope(e,t,n){var r=e==null?0:e.length;return r?(t=n||t===void 0?1:tr(t),t=r-t,Pl(e,t<0?0:t,r)):[]}function Dpe(e,t){return e&&e.length?u6(e,Kn(t),!1,!0):[]}function Npe(e,t){return e&&e.length?u6(e,Kn(t)):[]}function Fpe(e,t){return t(e),e}var nV=Object.prototype,Rpe=nV.hasOwnProperty;function IO(e,t,n,r){return e===void 0||Os(e,nV[n])&&!Rpe.call(r,n)?t:e}var Ppe={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"};function Bpe(e){return"\\"+Ppe[e]}var rV=/<%=([\s\S]+?)%>/g,Lpe=/<%-([\s\S]+?)%>/g,Ipe=/<%([\s\S]+?)%>/g,Nx={escape:Lpe,evaluate:Ipe,interpolate:rV,variable:"",imports:{_:{escape:yz}}},$pe="Invalid `variable` option passed into `_.template`",zpe="Invalid `imports` option passed into `_.template`",Vpe=/\b__p \+= '';/g,Hpe=/\b(__p \+=) '' \+/g,jpe=/(__e\(.*?\)|\b__t\)) \+\n'';/g,$O=/[()=,{}\[\]\/\s]/,Wpe=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,F2=/($^)/,Upe=/['\n\r\u2028\u2029\\]/g,Kpe=Object.prototype,zO=Kpe.hasOwnProperty;function Ype(e,t,n){var r=Nx.imports._.templateSettings||Nx;n&&la(e,t,n)&&(t=void 0),e=Br(e),t=_x({},t,r,IO);var o=_x({},t.imports,r.imports,IO),i=oi(o),a=dA(o,i);pl(i,function(y){if($O.test(y))throw new Error(zpe)});var l,s,u=0,c=t.interpolate||F2,d="__p += '",f=RegExp((t.escape||F2).source+"|"+c.source+"|"+(c===rV?Wpe:F2).source+"|"+(t.evaluate||F2).source+"|$","g"),p=zO.call(t,"sourceURL")?"//# sourceURL="+(t.sourceURL+"").replace(/\s/g," ")+` +`:"";e.replace(f,function(y,g,_,x,C,E){return _||(_=x),d+=e.slice(u,E).replace(Upe,Bpe),g&&(l=!0,d+=`' + +__e(`+g+`) + +'`),C&&(s=!0,d+=`'; +`+C+`; +__p += '`),_&&(d+=`' + +((__t = (`+_+`)) == null ? '' : __t) + +'`),u=E+y.length,y}),d+=`'; +`;var v=zO.call(t,"variable")&&t.variable;if(!v)d=`with (obj) { +`+d+` +} +`;else if($O.test(v))throw new Error($pe);d=(s?d.replace(Vpe,""):d).replace(Hpe,"$1").replace(jpe,"$1;"),d="function("+(v||"obj")+`) { +`+(v?"":`obj || (obj = {}); +`)+"var __t, __p = ''"+(l?", __e = _.escape":"")+(s?`, __j = Array.prototype.join; +function print() { __p += __j.call(arguments, '') } +`:`; +`)+d+`return __p +}`;var m=v$(function(){return Function(i,p+"return "+d).apply(void 0,a)});if(m.source=d,V9(m))throw m;return m}var Gpe="Expected a function";function qu(e,t,n){var r=!0,o=!0;if(typeof e!="function")throw new TypeError(Gpe);return uo(n)&&(r="leading"in n?!!n.leading:r,o="trailing"in n?!!n.trailing:o),ei(e,t,{leading:r,maxWait:t,trailing:o})}function y6(e,t){return t(e)}var qpe=9007199254740991,ww=4294967295,Xpe=Math.min;function Qpe(e,t){if(e=tr(e),e<1||e>qpe)return[];var n=ww,r=Xpe(e,ww);t=gu(t),e-=ww;for(var o=P9(r,t);++n-1;);return n}function aV(e,t){for(var n=-1,r=e.length;++n-1;);return n}function ihe(e,t,n){if(e=Br(e),e&&(n||t===void 0))return qI(e);if(!e||!(t=ll(t)))return e;var r=Es(e),o=Es(t),i=aV(r,o),a=iV(r,o)+1;return Dd(r,i,a).join("")}function ahe(e,t,n){if(e=Br(e),e&&(n||t===void 0))return e.slice(0,GI(e)+1);if(!e||!(t=ll(t)))return e;var r=Es(e),o=iV(r,Es(t))+1;return Dd(r,0,o).join("")}var lhe=/^\s+/;function she(e,t,n){if(e=Br(e),e&&(n||t===void 0))return e.replace(lhe,"");if(!e||!(t=ll(t)))return e;var r=Es(e),o=aV(r,Es(t));return Dd(r,o).join("")}var uhe=30,che="...",dhe=/\w*$/;function fhe(e,t){var n=uhe,r=che;if(uo(t)){var o="separator"in t?t.separator:o;n="length"in t?tr(t.length):n,r="omission"in t?ll(t.omission):r}e=Br(e);var i=e.length;if(J0(e)){var a=Es(e);i=a.length}if(n>=i)return e;var l=n-nv(r);if(l<1)return r;var s=a?Dd(a,0,l).join(""):e.slice(0,l);if(o===void 0)return s+r;if(a&&(l+=s.length-l),hA(o)){if(e.slice(l).search(o)){var u,c=s;for(o.global||(o=RegExp(o.source,Br(dhe.exec(o))+"g")),o.lastIndex=0;u=o.exec(c);)var d=u.index;s=s.slice(0,d===void 0?l:d)}}else if(e.indexOf(ll(o),l)!=l){var f=s.lastIndexOf(o);f>-1&&(s=s.slice(0,f))}return s+r}function phe(e){return a$(e,1)}var hhe={"&":"&","<":"<",">":">",""":'"',"'":"'"},vhe=U9(hhe),lV=/&(?:amp|lt|gt|quot|#39);/g,mhe=RegExp(lV.source);function ghe(e){return e=Br(e),e&&mhe.test(e)?e.replace(lV,vhe):e}var yhe=1/0,_he=Kh&&1/a6(new Kh([,-0]))[1]==yhe?function(e){return new Kh(e)}:Wh,bhe=200;function bd(e,t,n){var r=-1,o=J4,i=e.length,a=!0,l=[],s=l;if(n)a=!1,o=aA;else if(i>=bhe){var u=t?null:_he(e);if(u)return a6(u);a=!1,o=Og,s=new Qf}else s=t?[]:l;e:for(;++r1||this.__actions__.length||!(r instanceof pr)||!cc(n)?this.thru(o):(r=r.slice(n,+n+(t?1:0)),r.__actions__.push({func:y6,args:[o],thisArg:void 0}),new Fl(r,this.__chain__).thru(function(i){return t&&!i.length&&i.push(void 0),i}))});function Lhe(){return z$(this)}function Ihe(){var e=this.__wrapped__;if(e instanceof pr){var t=e;return this.__actions__.length&&(t=new pr(this)),t=t.reverse(),t.__actions__.push({func:y6,args:[Dx],thisArg:void 0}),new Fl(t,this.__chain__)}return this.thru(Dx)}function AA(e,t,n){var r=e.length;if(r<2)return r?bd(e[0]):[];for(var o=-1,i=Array(r);++o1?e[t-1]:void 0;return n=typeof n=="function"?(e.pop(),n):void 0,sV(e,n)});const dn={chunk:Pie,compact:hle,concat:vle,difference:bse,differenceBy:wse,differenceWith:xse,drop:Ese,dropRight:Ase,dropRightWhile:Sse,dropWhile:kse,fill:Use,findIndex:sA,findLastIndex:uA,flatten:z9,flattenDeep:kz,flattenDepth:oue,fromPairs:Zf,head:Jse,indexOf:Mz,initial:Lue,intersection:$ue,intersectionBy:zue,intersectionWith:Vue,join:Dce,lastIndexOf:Lce,nth:ude,pull:lfe,pullAll:qz,pullAllBy:sfe,pullAllWith:ufe,pullAt:ffe,remove:Mfe,reverse:Dx,slice:Xfe,sortedIndex:lpe,sortedIndexBy:spe,sortedIndexOf:upe,sortedLastIndex:cpe,sortedLastIndexBy:dpe,sortedLastIndexOf:fpe,sortedUniq:ppe,sortedUniqBy:hpe,tail:Tpe,take:Mpe,takeRight:Ope,takeRightWhile:Dpe,takeWhile:Npe,union:Ky,unionBy:whe,unionWith:xhe,uniq:Che,uniqBy:Ehe,uniqWith:Ahe,unzip:EA,unzipWith:sV,without:Rhe,xor:$he,xorBy:zhe,xorWith:Vhe,zip:Hhe,zipObject:jhe,zipObjectDeep:Whe,zipWith:Uhe},Wr={countBy:ose,every:Hse,filter:Kse,find:_d,findLast:Qse,flatMap:Sz,flatMapDeep:tue,flatMapDepth:nue,forEach:dr,forEachRight:Mse,groupBy:Cue,includes:Pue,invokeMap:Xue,keyBy:Fce,map:dl,orderBy:xde,partition:tfe,reduce:Jz,reduceRight:kfe,reject:Tfe,sample:$fe,sampleSize:Hfe,shuffle:Kfe,size:qfe,some:Jfe,sortBy:epe},Khe={now:Uy},Eo={after:bte,ary:a$,before:m$,bind:i6,bindKey:H9,curry:oA,curryRight:iA,debounce:ei,defer:gse,delay:yse,flip:aue,memoize:g1,once:_de,overArgs:Sde,partial:v6,partialRight:_A,rearg:Afe,rest:Ffe,spread:_pe,throttle:qu,unary:phe,wrap:Phe},kn={castArray:yd,clone:Ax,cloneDeep:mn,cloneDeepWith:cle,cloneWith:fle,conformsTo:Jle,eq:Os,gt:Eue,gte:Aue,isArguments:qf,isArrayBuffer:Jue,isArrayLike:za,isArrayLikeObject:To,isBoolean:ob,isBuffer:gd,isDate:rce,isElement:oce,isEmpty:Dg,isEqual:vi,isEqualWith:uce,isError:V9,isFinite:dce,isFunction:Ms,isInteger:Fz,isLength:t6,isMap:G$,isMatch:fce,isMatchWith:pce,isNaN:vce,isNative:yce,isNil:ar,isNull:_ce,isNumber:Rz,isObjectLike:xo,isPlainObject:Z0,isRegExp:hA,isSafeInteger:xce,isSet:q$,isString:f6,isSymbol:al,isTypedArray:Q0,isUndefined:oc,isWeakMap:Ece,isWeakSet:Sce,lt:zce,lte:Vce,toArray:Lz,toFinite:Gu,toLength:wz,toNumber:Sl,toPlainObject:cz,toSafeInteger:nhe,toString:Br},fa={add:dte,ceil:Nie,divide:Cse,floor:lue,max:Yce,maxBy:Gce,mean:Xce,meanBy:Qce,min:ede,minBy:tde,multiply:rde,round:Lfe,subtract:Ape,sum:Spe,sumBy:kpe},SA={clamp:Bie,inRange:Nue,random:yfe},Hn={assign:lr,assignIn:Tre,assignInWith:Mre,assignWith:_x,at:soe,create:ise,defaults:pse,defaultsDeep:vse,findKey:Gse,findLastKey:Zse,forIn:vue,forInRight:mue,forOwn:gue,forOwnRight:yue,functions:_ue,functionsIn:bue,get:cr,has:rb,hasIn:tA,invert:Uue,invertBy:Gue,invoke:que,keysIn:Va,mapKeys:Pz,mapValues:Hce,merge:vs,mergeWith:fz,omit:gde,omitBy:yde,pick:Fi,pickBy:zz,result:Rfe,set:xA,setWith:jfe,toPairs:vc,toPairsIn:Pse,transform:ohe,unset:The,update:Ohe,updateWith:Dhe,values:tv,valuesIn:Fhe},yu={at:Bhe,chain:z$,commit:ple,next:sde,plant:rfe,reverse:Ihe,tap:Fpe,toIterator:Zpe,value:Jpe,wrapperChain:Lhe},Fr={camelCase:Mie,capitalize:E$,deburr:A$,endsWith:Ose,escape:yz,escapeRegExp:zse,kebabCase:Nce,lowerCase:Ice,lowerFirst:$ce,pad:Yde,padEnd:Gde,padStart:qde,parseInt:Zde,repeat:Ofe,replace:Dfe,snakeCase:Qfe,split:mpe,startCase:bpe,startsWith:wpe,template:Ype,templateSettings:Nx,toLower:ehe,toUpper:rhe,trim:ihe,trimEnd:ahe,trimStart:she,truncate:fhe,unescape:ghe,upperCase:Nhe,upperFirst:j9,words:$$},Ir={attempt:v$,bindAll:_oe,cond:qle,conforms:Zle,constant:F9,defaultTo:dse,flow:pue,flowRight:hue,iteratee:Tce,matches:Wce,matchesProperty:Kce,method:Zce,methodOf:Jce,noop:Wh,nthArg:cde,over:Cde,overEvery:kde,overSome:Tde,property:iz,propertyOf:ofe,range:xfe,rangeRight:Cfe,stubArray:Y9,stubFalse:B9,stubObject:xpe,stubString:Cpe,stubTrue:Epe,times:Qpe,toPath:the,uniqueId:khe};function Yhe(){var e=new pr(this.__wrapped__);return e.__actions__=Da(this.__actions__),e.__dir__=this.__dir__,e.__filtered__=this.__filtered__,e.__iteratees__=Da(this.__iteratees__),e.__takeCount__=this.__takeCount__,e.__views__=Da(this.__views__),e}function Ghe(){if(this.__filtered__){var e=new pr(this);e.__dir__=-1,e.__filtered__=!0}else e=this.clone(),e.__dir__*=-1;return e}var qhe=Math.max,Xhe=Math.min;function Qhe(e,t,n){for(var r=-1,o=n.length;++r + * Build: `lodash modularize exports="es" --repo lodash/lodash#4.18.1 -o ./` + * Copyright OpenJS Foundation and other contributors + * Released under MIT license + * Based on Underscore.js 1.8.3 + * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + */var n0e="4.18.1",r0e=2,o0e=1,i0e=3,dV=4294967295,a0e=Array.prototype,l0e=Object.prototype,fV=l0e.hasOwnProperty,HO=Bi?Bi.iterator:void 0,s0e=Math.max,jO=Math.min,kA=function(e){return function(t,n,r){if(r==null){var o=uo(n),i=o&&oi(n),a=i&&i.length&&c6(n,i);(a?a.length:o)||(r=n,n=t,t=this)}return e(t,n,r)}}(nde);De.after=Eo.after;De.ary=Eo.ary;De.assign=Hn.assign;De.assignIn=Hn.assignIn;De.assignInWith=Hn.assignInWith;De.assignWith=Hn.assignWith;De.at=Hn.at;De.before=Eo.before;De.bind=Eo.bind;De.bindAll=Ir.bindAll;De.bindKey=Eo.bindKey;De.castArray=kn.castArray;De.chain=yu.chain;De.chunk=dn.chunk;De.compact=dn.compact;De.concat=dn.concat;De.cond=Ir.cond;De.conforms=Ir.conforms;De.constant=Ir.constant;De.countBy=Wr.countBy;De.create=Hn.create;De.curry=Eo.curry;De.curryRight=Eo.curryRight;De.debounce=Eo.debounce;De.defaults=Hn.defaults;De.defaultsDeep=Hn.defaultsDeep;De.defer=Eo.defer;De.delay=Eo.delay;De.difference=dn.difference;De.differenceBy=dn.differenceBy;De.differenceWith=dn.differenceWith;De.drop=dn.drop;De.dropRight=dn.dropRight;De.dropRightWhile=dn.dropRightWhile;De.dropWhile=dn.dropWhile;De.fill=dn.fill;De.filter=Wr.filter;De.flatMap=Wr.flatMap;De.flatMapDeep=Wr.flatMapDeep;De.flatMapDepth=Wr.flatMapDepth;De.flatten=dn.flatten;De.flattenDeep=dn.flattenDeep;De.flattenDepth=dn.flattenDepth;De.flip=Eo.flip;De.flow=Ir.flow;De.flowRight=Ir.flowRight;De.fromPairs=dn.fromPairs;De.functions=Hn.functions;De.functionsIn=Hn.functionsIn;De.groupBy=Wr.groupBy;De.initial=dn.initial;De.intersection=dn.intersection;De.intersectionBy=dn.intersectionBy;De.intersectionWith=dn.intersectionWith;De.invert=Hn.invert;De.invertBy=Hn.invertBy;De.invokeMap=Wr.invokeMap;De.iteratee=Ir.iteratee;De.keyBy=Wr.keyBy;De.keys=oi;De.keysIn=Hn.keysIn;De.map=Wr.map;De.mapKeys=Hn.mapKeys;De.mapValues=Hn.mapValues;De.matches=Ir.matches;De.matchesProperty=Ir.matchesProperty;De.memoize=Eo.memoize;De.merge=Hn.merge;De.mergeWith=Hn.mergeWith;De.method=Ir.method;De.methodOf=Ir.methodOf;De.mixin=kA;De.negate=h6;De.nthArg=Ir.nthArg;De.omit=Hn.omit;De.omitBy=Hn.omitBy;De.once=Eo.once;De.orderBy=Wr.orderBy;De.over=Ir.over;De.overArgs=Eo.overArgs;De.overEvery=Ir.overEvery;De.overSome=Ir.overSome;De.partial=Eo.partial;De.partialRight=Eo.partialRight;De.partition=Wr.partition;De.pick=Hn.pick;De.pickBy=Hn.pickBy;De.property=Ir.property;De.propertyOf=Ir.propertyOf;De.pull=dn.pull;De.pullAll=dn.pullAll;De.pullAllBy=dn.pullAllBy;De.pullAllWith=dn.pullAllWith;De.pullAt=dn.pullAt;De.range=Ir.range;De.rangeRight=Ir.rangeRight;De.rearg=Eo.rearg;De.reject=Wr.reject;De.remove=dn.remove;De.rest=Eo.rest;De.reverse=dn.reverse;De.sampleSize=Wr.sampleSize;De.set=Hn.set;De.setWith=Hn.setWith;De.shuffle=Wr.shuffle;De.slice=dn.slice;De.sortBy=Wr.sortBy;De.sortedUniq=dn.sortedUniq;De.sortedUniqBy=dn.sortedUniqBy;De.split=Fr.split;De.spread=Eo.spread;De.tail=dn.tail;De.take=dn.take;De.takeRight=dn.takeRight;De.takeRightWhile=dn.takeRightWhile;De.takeWhile=dn.takeWhile;De.tap=yu.tap;De.throttle=Eo.throttle;De.thru=y6;De.toArray=kn.toArray;De.toPairs=Hn.toPairs;De.toPairsIn=Hn.toPairsIn;De.toPath=Ir.toPath;De.toPlainObject=kn.toPlainObject;De.transform=Hn.transform;De.unary=Eo.unary;De.union=dn.union;De.unionBy=dn.unionBy;De.unionWith=dn.unionWith;De.uniq=dn.uniq;De.uniqBy=dn.uniqBy;De.uniqWith=dn.uniqWith;De.unset=Hn.unset;De.unzip=dn.unzip;De.unzipWith=dn.unzipWith;De.update=Hn.update;De.updateWith=Hn.updateWith;De.values=Hn.values;De.valuesIn=Hn.valuesIn;De.without=dn.without;De.words=Fr.words;De.wrap=Eo.wrap;De.xor=dn.xor;De.xorBy=dn.xorBy;De.xorWith=dn.xorWith;De.zip=dn.zip;De.zipObject=dn.zipObject;De.zipObjectDeep=dn.zipObjectDeep;De.zipWith=dn.zipWith;De.entries=Hn.toPairs;De.entriesIn=Hn.toPairsIn;De.extend=Hn.assignIn;De.extendWith=Hn.assignInWith;kA(De,De);De.add=fa.add;De.attempt=Ir.attempt;De.camelCase=Fr.camelCase;De.capitalize=Fr.capitalize;De.ceil=fa.ceil;De.clamp=SA.clamp;De.clone=kn.clone;De.cloneDeep=kn.cloneDeep;De.cloneDeepWith=kn.cloneDeepWith;De.cloneWith=kn.cloneWith;De.conformsTo=kn.conformsTo;De.deburr=Fr.deburr;De.defaultTo=Ir.defaultTo;De.divide=fa.divide;De.endsWith=Fr.endsWith;De.eq=kn.eq;De.escape=Fr.escape;De.escapeRegExp=Fr.escapeRegExp;De.every=Wr.every;De.find=Wr.find;De.findIndex=dn.findIndex;De.findKey=Hn.findKey;De.findLast=Wr.findLast;De.findLastIndex=dn.findLastIndex;De.findLastKey=Hn.findLastKey;De.floor=fa.floor;De.forEach=Wr.forEach;De.forEachRight=Wr.forEachRight;De.forIn=Hn.forIn;De.forInRight=Hn.forInRight;De.forOwn=Hn.forOwn;De.forOwnRight=Hn.forOwnRight;De.get=Hn.get;De.gt=kn.gt;De.gte=kn.gte;De.has=Hn.has;De.hasIn=Hn.hasIn;De.head=dn.head;De.identity=$a;De.includes=Wr.includes;De.indexOf=dn.indexOf;De.inRange=SA.inRange;De.invoke=Hn.invoke;De.isArguments=kn.isArguments;De.isArray=Un;De.isArrayBuffer=kn.isArrayBuffer;De.isArrayLike=kn.isArrayLike;De.isArrayLikeObject=kn.isArrayLikeObject;De.isBoolean=kn.isBoolean;De.isBuffer=kn.isBuffer;De.isDate=kn.isDate;De.isElement=kn.isElement;De.isEmpty=kn.isEmpty;De.isEqual=kn.isEqual;De.isEqualWith=kn.isEqualWith;De.isError=kn.isError;De.isFinite=kn.isFinite;De.isFunction=kn.isFunction;De.isInteger=kn.isInteger;De.isLength=kn.isLength;De.isMap=kn.isMap;De.isMatch=kn.isMatch;De.isMatchWith=kn.isMatchWith;De.isNaN=kn.isNaN;De.isNative=kn.isNative;De.isNil=kn.isNil;De.isNull=kn.isNull;De.isNumber=kn.isNumber;De.isObject=uo;De.isObjectLike=kn.isObjectLike;De.isPlainObject=kn.isPlainObject;De.isRegExp=kn.isRegExp;De.isSafeInteger=kn.isSafeInteger;De.isSet=kn.isSet;De.isString=kn.isString;De.isSymbol=kn.isSymbol;De.isTypedArray=kn.isTypedArray;De.isUndefined=kn.isUndefined;De.isWeakMap=kn.isWeakMap;De.isWeakSet=kn.isWeakSet;De.join=dn.join;De.kebabCase=Fr.kebabCase;De.last=cl;De.lastIndexOf=dn.lastIndexOf;De.lowerCase=Fr.lowerCase;De.lowerFirst=Fr.lowerFirst;De.lt=kn.lt;De.lte=kn.lte;De.max=fa.max;De.maxBy=fa.maxBy;De.mean=fa.mean;De.meanBy=fa.meanBy;De.min=fa.min;De.minBy=fa.minBy;De.stubArray=Ir.stubArray;De.stubFalse=Ir.stubFalse;De.stubObject=Ir.stubObject;De.stubString=Ir.stubString;De.stubTrue=Ir.stubTrue;De.multiply=fa.multiply;De.nth=dn.nth;De.noop=Ir.noop;De.now=Khe.now;De.pad=Fr.pad;De.padEnd=Fr.padEnd;De.padStart=Fr.padStart;De.parseInt=Fr.parseInt;De.random=SA.random;De.reduce=Wr.reduce;De.reduceRight=Wr.reduceRight;De.repeat=Fr.repeat;De.replace=Fr.replace;De.result=Hn.result;De.round=fa.round;De.sample=Wr.sample;De.size=Wr.size;De.snakeCase=Fr.snakeCase;De.some=Wr.some;De.sortedIndex=dn.sortedIndex;De.sortedIndexBy=dn.sortedIndexBy;De.sortedIndexOf=dn.sortedIndexOf;De.sortedLastIndex=dn.sortedLastIndex;De.sortedLastIndexBy=dn.sortedLastIndexBy;De.sortedLastIndexOf=dn.sortedLastIndexOf;De.startCase=Fr.startCase;De.startsWith=Fr.startsWith;De.subtract=fa.subtract;De.sum=fa.sum;De.sumBy=fa.sumBy;De.template=Fr.template;De.times=Ir.times;De.toFinite=kn.toFinite;De.toInteger=tr;De.toLength=kn.toLength;De.toLower=Fr.toLower;De.toNumber=kn.toNumber;De.toSafeInteger=kn.toSafeInteger;De.toString=kn.toString;De.toUpper=Fr.toUpper;De.trim=Fr.trim;De.trimEnd=Fr.trimEnd;De.trimStart=Fr.trimStart;De.truncate=Fr.truncate;De.unescape=Fr.unescape;De.uniqueId=Ir.uniqueId;De.upperCase=Fr.upperCase;De.upperFirst=Fr.upperFirst;De.each=Wr.forEach;De.eachRight=Wr.forEachRight;De.first=dn.head;kA(De,function(){var e={};return mu(De,function(t,n){fV.call(De.prototype,n)||(e[n]=t)}),e}(),{chain:!1});De.VERSION=n0e;(De.templateSettings=Fr.templateSettings).imports._=De;pl(["bind","bindKey","curry","curryRight","partial","partialRight"],function(e){De[e].placeholder=De});pl(["drop","take"],function(e,t){pr.prototype[e]=function(n){n=n===void 0?1:s0e(tr(n),0);var r=this.__filtered__&&!t?new pr(this):this.clone();return r.__filtered__?r.__takeCount__=jO(n,r.__takeCount__):r.__views__.push({size:jO(n,dV),type:e+(r.__dir__<0?"Right":"")}),r},pr.prototype[e+"Right"]=function(n){return this.reverse()[e](n).reverse()}});pl(["filter","map","takeWhile"],function(e,t){var n=t+1,r=n==o0e||n==i0e;pr.prototype[e]=function(o){var i=this.clone();return i.__iteratees__.push({iteratee:Kn(o),type:n}),i.__filtered__=i.__filtered__||r,i}});pl(["head","last"],function(e,t){var n="take"+(t?"Right":"");pr.prototype[e]=function(){return this[n](1).value()[0]}});pl(["initial","tail"],function(e,t){var n="drop"+(t?"":"Right");pr.prototype[e]=function(){return this.__filtered__?new pr(this):this[n](1)}});pr.prototype.compact=function(){return this.filter($a)};pr.prototype.find=function(e){return this.filter(e).head()};pr.prototype.findLast=function(e){return this.reverse().find(e)};pr.prototype.invokeMap=or(function(e,t){return typeof e=="function"?new pr(this):this.map(function(n){return b1(n,e,t)})});pr.prototype.reject=function(e){return this.filter(h6(Kn(e)))};pr.prototype.slice=function(e,t){e=tr(e);var n=this;return n.__filtered__&&(e>0||t<0)?new pr(n):(e<0?n=n.takeRight(-e):e&&(n=n.drop(e)),t!==void 0&&(t=tr(t),n=t<0?n.dropRight(-t):n.take(t-e)),n)};pr.prototype.takeRightWhile=function(e){return this.reverse().takeWhile(e).reverse()};pr.prototype.toArray=function(){return this.take(dV)};mu(pr.prototype,function(e,t){var n=/^(?:filter|find|map|reject)|While$/.test(t),r=/^(?:head|last)$/.test(t),o=De[r?"take"+(t=="last"?"Right":""):t],i=r||/^find/.test(t);o&&(De.prototype[t]=function(){var a=this.__wrapped__,l=r?[1]:arguments,s=a instanceof pr,u=l[0],c=s||Un(a),d=function(g){var _=o.apply(De,Od([g],l));return r&&f?_[0]:_};c&&n&&typeof u=="function"&&u.length!=1&&(s=c=!1);var f=this.__chain__,p=!!this.__actions__.length,v=i&&!f,m=s&&!p;if(!i&&c){a=m?a:new pr(this);var y=e.apply(a,l);return y.__actions__.push({func:y6,args:[d],thisArg:void 0}),new Fl(y,f)}return v&&m?e.apply(this,l):(y=this.thru(d),v?r?y.value()[0]:y.value():y)})});pl(["pop","push","shift","sort","splice","unshift"],function(e){var t=a0e[e],n=/^(?:push|sort|unshift)$/.test(e)?"tap":"thru",r=/^(?:pop|shift)$/.test(e);De.prototype[e]=function(){var o=arguments;if(r&&!this.__chain__){var i=this.value();return t.apply(Un(i)?i:[],o)}return this[n](function(a){return t.apply(Un(a)?a:[],o)})}});mu(pr.prototype,function(e,t){var n=De[t];if(n){var r=n.name+"";fV.call(Uh,r)||(Uh[r]=[]),Uh[r].push({name:t,func:n})}});Uh[e6(void 0,r0e).name]=[{name:"wrapper",func:void 0}];pr.prototype.clone=Yhe;pr.prototype.reverse=Ghe;pr.prototype.value=t0e;De.prototype.at=yu.at;De.prototype.chain=yu.wrapperChain;De.prototype.commit=yu.commit;De.prototype.next=yu.next;De.prototype.plant=yu.plant;De.prototype.reverse=yu.reverse;De.prototype.toJSON=De.prototype.valueOf=De.prototype.value=yu.value;De.prototype.first=De.prototype.head;HO&&(De.prototype[HO]=yu.toIterator);const xw=e=>typeof e=="boolean",Jf=e=>typeof e=="number",u0e=e=>typeof Element>"u"?!1:e instanceof Element,c0e=e=>K0(e)?!Number.isNaN(Number(e)):!1,d0e=e=>{if(e.code&&e.code!=="Unidentified")return e.code;const t=f0e(e);if(t){if(Object.values(mx).includes(t))return t;switch(t){case" ":return mx.space;default:return""}}return""},f0e=e=>{let t=e.key&&e.key!=="Unidentified"?e.key:"";if(!t&&e.type==="keyup"&&Qee()){const n=e.target;t=n.value.charAt(n.selectionStart-1)}return t};var WO=!1,xf,Fx,Rx,Yy,Gy,pV,qy,Px,Bx,Lx,hV,Ix,$x,vV,mV;function Ca(){if(!WO){WO=!0;var e=navigator.userAgent,t=/(?:MSIE.(\d+\.\d+))|(?:(?:Firefox|GranParadiso|Iceweasel).(\d+\.\d+))|(?:Opera(?:.+Version.|.)(\d+\.\d+))|(?:AppleWebKit.(\d+(?:\.\d+)?))|(?:Trident\/\d+\.\d+.*rv:(\d+\.\d+))/.exec(e),n=/(Mac OS X)|(Windows)|(Linux)/.exec(e);if(Ix=/\b(iPhone|iP[ao]d)/.exec(e),$x=/\b(iP[ao]d)/.exec(e),Lx=/Android/i.exec(e),vV=/FBAN\/\w+;/i.exec(e),mV=/Mobile/i.exec(e),hV=!!/Win64/.exec(e),t){xf=t[1]?parseFloat(t[1]):t[5]?parseFloat(t[5]):NaN,xf&&document&&document.documentMode&&(xf=document.documentMode);var r=/(?:Trident\/(\d+.\d+))/.exec(e);pV=r?parseFloat(r[1])+4:xf,Fx=t[2]?parseFloat(t[2]):NaN,Rx=t[3]?parseFloat(t[3]):NaN,Yy=t[4]?parseFloat(t[4]):NaN,Yy?(t=/(?:Chrome\/(\d+\.\d+))/.exec(e),Gy=t&&t[1]?parseFloat(t[1]):NaN):Gy=NaN}else xf=Fx=Rx=Gy=Yy=NaN;if(n){if(n[1]){var o=/(?:Mac OS X (\d+(?:[._]\d+)?))/.exec(e);qy=o?parseFloat(o[1].replace("_",".")):!0}else qy=!1;Px=!!n[2],Bx=!!n[3]}else qy=Px=Bx=!1}}var zx={ie:function(){return Ca()||xf},ieCompatibilityMode:function(){return Ca()||pV>xf},ie64:function(){return zx.ie()&&hV},firefox:function(){return Ca()||Fx},opera:function(){return Ca()||Rx},webkit:function(){return Ca()||Yy},safari:function(){return zx.webkit()},chrome:function(){return Ca()||Gy},windows:function(){return Ca()||Px},osx:function(){return Ca()||qy},linux:function(){return Ca()||Bx},iphone:function(){return Ca()||Ix},mobile:function(){return Ca()||Ix||$x||Lx||mV},nativeApp:function(){return Ca()||vV},android:function(){return Ca()||Lx},ipad:function(){return Ca()||$x}},p0e=zx,h0e=!!(typeof window<"u"&&window.document&&window.document.createElement),v0e={canUseDOM:h0e},gV=v0e,yV;gV.canUseDOM&&(yV=document.implementation&&document.implementation.hasFeature&&document.implementation.hasFeature("","")!==!0);function m0e(e,t){if(!gV.canUseDOM||t&&!("addEventListener"in document))return!1;var n="on"+e,r=n in document;if(!r){var o=document.createElement("div");o.setAttribute(n,"return;"),r=typeof o[n]=="function"}return!r&&yV&&e==="wheel"&&(r=document.implementation.hasFeature("Events.wheel","3.0")),r}var g0e=m0e,UO=10,KO=40,YO=800;function _V(e){var t=0,n=0,r=0,o=0;return"detail"in e&&(n=e.detail),"wheelDelta"in e&&(n=-e.wheelDelta/120),"wheelDeltaY"in e&&(n=-e.wheelDeltaY/120),"wheelDeltaX"in e&&(t=-e.wheelDeltaX/120),"axis"in e&&e.axis===e.HORIZONTAL_AXIS&&(t=n,n=0),r=t*UO,o=n*UO,"deltaY"in e&&(o=e.deltaY),"deltaX"in e&&(r=e.deltaX),(r||o)&&e.deltaMode&&(e.deltaMode==1?(r*=KO,o*=KO):(r*=YO,o*=YO)),r&&!t&&(t=r<1?-1:1),o&&!n&&(n=o<1?-1:1),{spinX:t,spinY:n,pixelX:r,pixelY:o}}_V.getEventType=function(){return p0e.firefox()?"DOMMouseScroll":g0e("wheel")?"wheel":"mousewheel"};var y0e=_V;/** +* Checks if an event is supported in the current execution environment. +* +* NOTE: This will not work correctly for non-generic events such as `change`, +* `reset`, `load`, `error`, and `select`. +* +* Borrows from Modernizr. +* +* @param {string} eventNameSuffix Event name, e.g. "click". +* @param {?boolean} capture Check if the capture phase is supported. +* @return {boolean} True if the event is supported. +* @internal +* @license Modernizr 3.0.0pre (Custom Build) | MIT +*/const GO=e=>Object.keys(e),bV="__epPropKey",ta=e=>e,_0e=e=>WI(e)&&!!e[bV],wV=(e,t)=>{if(!WI(e)||_0e(e))return e;const{values:n,required:r,default:o,type:i,validator:a}=e,l={type:i,required:!!r,validator:n||a?s=>{let u=!1,c=[];if(n&&(c=Array.from(n),Z_(e,"default")&&c.push(o),u||(u=c.includes(s))),a&&(u||(u=a(s))),!u&&c.length>0){const d=[...new Set(c)].map(f=>JSON.stringify(f)).join(", ");tI(`Invalid prop: validation failed${t?` for prop "${t}"`:""}. Expected one of [${d}], got value ${JSON.stringify(s)}.`)}return u}:void 0,[bV]:!0};return Z_(e,"default")&&(l.default=o),l},x1=e=>Zf(Object.entries(e).map(([t,n])=>[t,wV(n,t)]));var b0e=class extends Error{constructor(t){super(t),this.name="ElementPlusError"}};function C1(e,t){{const n=K0(e)?new b0e(`[${e}] ${t}`):e;console.warn(n)}}const w0e="utils/dom/style";function Vx(e,t="px"){if(!e&&e!==0)return"";if(Jf(e)||c0e(e))return`${e}${t}`;if(K0(e))return e;C1(w0e,"binding value must be a string or number")}var x0e={name:"en",el:{breadcrumb:{label:"Breadcrumb"},colorpicker:{confirm:"OK",clear:"Clear",defaultLabel:"color picker",description:"current color is {color}. press enter to select a new color.",alphaLabel:"pick alpha value",alphaDescription:"alpha {alpha}, current color is {color}",hueLabel:"pick hue value",hueDescription:"hue {hue}, current color is {color}",svLabel:"pick saturation and brightness value",svDescription:"saturation {saturation}, brightness {brightness}, current color is {color}",predefineDescription:"select {value} as the color"},datepicker:{now:"Now",today:"Today",cancel:"Cancel",clear:"Clear",confirm:"OK",dateTablePrompt:"Use the arrow keys and enter to select the day of the month",monthTablePrompt:"Use the arrow keys and enter to select the month",yearTablePrompt:"Use the arrow keys and enter to select the year",selectedDate:"Selected date",selectDate:"Select date",selectTime:"Select time",startDate:"Start Date",startTime:"Start Time",endDate:"End Date",endTime:"End Time",prevYear:"Previous Year",nextYear:"Next Year",prevMonth:"Previous Month",nextMonth:"Next Month",year:"",month1:"January",month2:"February",month3:"March",month4:"April",month5:"May",month6:"June",month7:"July",month8:"August",month9:"September",month10:"October",month11:"November",month12:"December",weeks:{sun:"Sun",mon:"Mon",tue:"Tue",wed:"Wed",thu:"Thu",fri:"Fri",sat:"Sat"},weeksFull:{sun:"Sunday",mon:"Monday",tue:"Tuesday",wed:"Wednesday",thu:"Thursday",fri:"Friday",sat:"Saturday"},months:{jan:"Jan",feb:"Feb",mar:"Mar",apr:"Apr",may:"May",jun:"Jun",jul:"Jul",aug:"Aug",sep:"Sep",oct:"Oct",nov:"Nov",dec:"Dec"}},inputNumber:{decrease:"decrease number",increase:"increase number"},select:{loading:"Loading",noMatch:"No matching data",noData:"No data",placeholder:"Select"},mention:{loading:"Loading"},dropdown:{toggleDropdown:"Toggle Dropdown"},cascader:{noMatch:"No matching data",loading:"Loading",placeholder:"Select",noData:"No data"},pagination:{goto:"Go to",pagesize:"/page",total:"Total {total}",pageClassifier:"",page:"Page",prev:"Go to previous page",next:"Go to next page",currentPage:"page {pager}",prevPages:"Previous {pager} pages",nextPages:"Next {pager} pages",deprecationWarning:"Deprecated usages detected, please refer to the el-pagination documentation for more details"},dialog:{close:"Close this dialog"},drawer:{close:"Close this dialog"},messagebox:{title:"Message",confirm:"OK",cancel:"Cancel",error:"Illegal input",close:"Close this dialog"},upload:{deleteTip:"press delete to remove",delete:"Delete",preview:"Preview",continue:"Continue"},slider:{defaultLabel:"slider between {min} and {max}",defaultRangeStartLabel:"pick start value",defaultRangeEndLabel:"pick end value"},table:{emptyText:"No Data",confirmFilter:"Confirm",resetFilter:"Reset",clearFilter:"All",sumText:"Sum",selectAllLabel:"Select all rows",selectRowLabel:"Select this row",expandRowLabel:"Expand this row",collapseRowLabel:"Collapse this row",sortLabel:"Sort by {column}",filterLabel:"Filter by {column}"},tag:{close:"Close this tag"},tour:{next:"Next",previous:"Previous",finish:"Finish",close:"Close this dialog"},tree:{emptyText:"No Data"},transfer:{noMatch:"No matching data",noData:"No data",titles:["List 1","List 2"],filterPlaceholder:"Enter keyword",noCheckedFormat:"{total} items",hasCheckedFormat:"{checked}/{total} checked"},image:{error:"FAILED"},pageHeader:{title:"Back"},popconfirm:{confirmButtonText:"Yes",cancelButtonText:"No"},carousel:{leftArrow:"Carousel arrow left",rightArrow:"Carousel arrow right",indicator:"Carousel switch to index {index}"}}};const C0e=e=>(t,n)=>E0e(t,n,w(e)),E0e=(e,t,n)=>cr(n,e,e).replace(/\{(\w+)\}/g,(r,o)=>`${(t==null?void 0:t[o])??`{${o}}`}`),A0e=e=>({lang:G(()=>w(e).name),locale:Nn(e)?e:ue(e),t:C0e(e)}),xV=Symbol("localeContextKey"),S0e=e=>{const t=e||Tt(xV,ue());return A0e(G(()=>t.value||x0e))},Xy="el",k0e="is-",af=(e,t,n,r,o)=>{let i=`${e}-${t}`;return n&&(i+=`-${n}`),r&&(i+=`__${r}`),o&&(i+=`--${o}`),i},CV=Symbol("namespaceContextKey"),T0e=e=>{const t=e||(Wt()?Tt(CV,ue(Xy)):ue(Xy));return G(()=>w(t)||Xy)},TA=(e,t)=>{const n=T0e(t);return{namespace:n,b:(m="")=>af(n.value,e,m,"",""),e:m=>m?af(n.value,e,"",m,""):"",m:m=>m?af(n.value,e,"","",m):"",be:(m,y)=>m&&y?af(n.value,e,m,y,""):"",em:(m,y)=>m&&y?af(n.value,e,"",m,y):"",bm:(m,y)=>m&&y?af(n.value,e,m,"",y):"",bem:(m,y,g)=>m&&y&&g?af(n.value,e,m,y,g):"",is:(m,...y)=>{const g=y.length>=1?y[0]:!0;return m&&g?`${k0e}${m}`:""},cssVar:m=>{const y={};for(const g in m)m[g]&&(y[`--${n.value}-${g}`]=m[g]);return y},cssVarName:m=>`--${n.value}-${m}`,cssVarBlock:m=>{const y={};for(const g in m)m[g]&&(y[`--${n.value}-${e}-${g}`]=m[g]);return y},cssVarBlockName:m=>`--${n.value}-${e}-${m}`}};var Na="top",Bl="bottom",Ll="right",Fa="left",MA="auto",E1=[Na,Bl,Ll,Fa],u0="start",Ng="end",M0e="clippingParents",EV="viewport",Jv="popper",O0e="reference",qO=E1.reduce(function(e,t){return e.concat([t+"-"+u0,t+"-"+Ng])},[]),xp=[].concat(E1,[MA]).reduce(function(e,t){return e.concat([t,t+"-"+u0,t+"-"+Ng])},[]),D0e="beforeRead",N0e="read",F0e="afterRead",R0e="beforeMain",P0e="main",B0e="afterMain",L0e="beforeWrite",I0e="write",$0e="afterWrite",z0e=[D0e,N0e,F0e,R0e,P0e,B0e,L0e,I0e,$0e];function au(e){return e?(e.nodeName||"").toLowerCase():null}function fl(e){if(e==null)return window;if(e.toString()!=="[object Window]"){var t=e.ownerDocument;return t&&t.defaultView||window}return e}function ep(e){var t=fl(e).Element;return e instanceof t||e instanceof Element}function Tl(e){var t=fl(e).HTMLElement;return e instanceof t||e instanceof HTMLElement}function OA(e){if(typeof ShadowRoot>"u")return!1;var t=fl(e).ShadowRoot;return e instanceof t||e instanceof ShadowRoot}function V0e(e){var t=e.state;Object.keys(t.elements).forEach(function(n){var r=t.styles[n]||{},o=t.attributes[n]||{},i=t.elements[n];!Tl(i)||!au(i)||(Object.assign(i.style,r),Object.keys(o).forEach(function(a){var l=o[a];l===!1?i.removeAttribute(a):i.setAttribute(a,l===!0?"":l)}))})}function H0e(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow),function(){Object.keys(t.elements).forEach(function(r){var o=t.elements[r],i=t.attributes[r]||{},a=Object.keys(t.styles.hasOwnProperty(r)?t.styles[r]:n[r]),l=a.reduce(function(s,u){return s[u]="",s},{});!Tl(o)||!au(o)||(Object.assign(o.style,l),Object.keys(i).forEach(function(s){o.removeAttribute(s)}))})}}var AV={name:"applyStyles",enabled:!0,phase:"write",fn:V0e,effect:H0e,requires:["computeStyles"]};function Js(e){return e.split("-")[0]}var zf=Math.max,ab=Math.min,c0=Math.round;function Hx(){var e=navigator.userAgentData;return e!=null&&e.brands&&Array.isArray(e.brands)?e.brands.map(function(t){return t.brand+"/"+t.version}).join(" "):navigator.userAgent}function SV(){return!/^((?!chrome|android).)*safari/i.test(Hx())}function d0(e,t,n){t===void 0&&(t=!1),n===void 0&&(n=!1);var r=e.getBoundingClientRect(),o=1,i=1;t&&Tl(e)&&(o=e.offsetWidth>0&&c0(r.width)/e.offsetWidth||1,i=e.offsetHeight>0&&c0(r.height)/e.offsetHeight||1);var a=ep(e)?fl(e):window,l=a.visualViewport,s=!SV()&&n,u=(r.left+(s&&l?l.offsetLeft:0))/o,c=(r.top+(s&&l?l.offsetTop:0))/i,d=r.width/o,f=r.height/i;return{width:d,height:f,top:c,right:u+d,bottom:c+f,left:u,x:u,y:c}}function DA(e){var t=d0(e),n=e.offsetWidth,r=e.offsetHeight;return Math.abs(t.width-n)<=1&&(n=t.width),Math.abs(t.height-r)<=1&&(r=t.height),{x:e.offsetLeft,y:e.offsetTop,width:n,height:r}}function kV(e,t){var n=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(n&&OA(n)){var r=t;do{if(r&&e.isSameNode(r))return!0;r=r.parentNode||r.host}while(r)}return!1}function ic(e){return fl(e).getComputedStyle(e)}function j0e(e){return["table","td","th"].indexOf(au(e))>=0}function Rd(e){return((ep(e)?e.ownerDocument:e.document)||window.document).documentElement}function _6(e){return au(e)==="html"?e:e.assignedSlot||e.parentNode||(OA(e)?e.host:null)||Rd(e)}function XO(e){return!Tl(e)||ic(e).position==="fixed"?null:e.offsetParent}function W0e(e){var t=/firefox/i.test(Hx()),n=/Trident/i.test(Hx());if(n&&Tl(e)){var r=ic(e);if(r.position==="fixed")return null}var o=_6(e);for(OA(o)&&(o=o.host);Tl(o)&&["html","body"].indexOf(au(o))<0;){var i=ic(o);if(i.transform!=="none"||i.perspective!=="none"||i.contain==="paint"||["transform","perspective"].indexOf(i.willChange)!==-1||t&&i.willChange==="filter"||t&&i.filter&&i.filter!=="none")return o;o=o.parentNode}return null}function A1(e){for(var t=fl(e),n=XO(e);n&&j0e(n)&&ic(n).position==="static";)n=XO(n);return n&&(au(n)==="html"||au(n)==="body"&&ic(n).position==="static")?t:n||W0e(e)||t}function NA(e){return["top","bottom"].indexOf(e)>=0?"x":"y"}function Lm(e,t,n){return zf(e,ab(t,n))}function U0e(e,t,n){var r=Lm(e,t,n);return r>n?n:r}function TV(){return{top:0,right:0,bottom:0,left:0}}function MV(e){return Object.assign({},TV(),e)}function OV(e,t){return t.reduce(function(n,r){return n[r]=e,n},{})}var K0e=function(e,t){return e=typeof e=="function"?e(Object.assign({},t.rects,{placement:t.placement})):e,MV(typeof e!="number"?e:OV(e,E1))};function Y0e(e){var t,n=e.state,r=e.name,o=e.options,i=n.elements.arrow,a=n.modifiersData.popperOffsets,l=Js(n.placement),s=NA(l),u=[Fa,Ll].indexOf(l)>=0,c=u?"height":"width";if(!(!i||!a)){var d=K0e(o.padding,n),f=DA(i),p=s==="y"?Na:Fa,v=s==="y"?Bl:Ll,m=n.rects.reference[c]+n.rects.reference[s]-a[s]-n.rects.popper[c],y=a[s]-n.rects.reference[s],g=A1(i),_=g?s==="y"?g.clientHeight||0:g.clientWidth||0:0,x=m/2-y/2,C=d[p],E=_-f[c]-d[v],A=_/2-f[c]/2+x,S=Lm(C,A,E),D=s;n.modifiersData[r]=(t={},t[D]=S,t.centerOffset=S-A,t)}}function G0e(e){var t=e.state,n=e.options,r=n.element,o=r===void 0?"[data-popper-arrow]":r;o!=null&&(typeof o=="string"&&(o=t.elements.popper.querySelector(o),!o)||kV(t.elements.popper,o)&&(t.elements.arrow=o))}var q0e={name:"arrow",enabled:!0,phase:"main",fn:Y0e,effect:G0e,requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function f0(e){return e.split("-")[1]}var X0e={top:"auto",right:"auto",bottom:"auto",left:"auto"};function Q0e(e,t){var n=e.x,r=e.y,o=t.devicePixelRatio||1;return{x:c0(n*o)/o||0,y:c0(r*o)/o||0}}function QO(e){var t,n=e.popper,r=e.popperRect,o=e.placement,i=e.variation,a=e.offsets,l=e.position,s=e.gpuAcceleration,u=e.adaptive,c=e.roundOffsets,d=e.isFixed,f=a.x,p=f===void 0?0:f,v=a.y,m=v===void 0?0:v,y=typeof c=="function"?c({x:p,y:m}):{x:p,y:m};p=y.x,m=y.y;var g=a.hasOwnProperty("x"),_=a.hasOwnProperty("y"),x=Fa,C=Na,E=window;if(u){var A=A1(n),S="clientHeight",D="clientWidth";if(A===fl(n)&&(A=Rd(n),ic(A).position!=="static"&&l==="absolute"&&(S="scrollHeight",D="scrollWidth")),A=A,o===Na||(o===Fa||o===Ll)&&i===Ng){C=Bl;var L=d&&A===E&&E.visualViewport?E.visualViewport.height:A[S];m-=L-r.height,m*=s?1:-1}if(o===Fa||(o===Na||o===Bl)&&i===Ng){x=Ll;var M=d&&A===E&&E.visualViewport?E.visualViewport.width:A[D];p-=M-r.width,p*=s?1:-1}}var R=Object.assign({position:l},u&&X0e),I=c===!0?Q0e({x:p,y:m},fl(n)):{x:p,y:m};if(p=I.x,m=I.y,s){var F;return Object.assign({},R,(F={},F[C]=_?"0":"",F[x]=g?"0":"",F.transform=(E.devicePixelRatio||1)<=1?"translate("+p+"px, "+m+"px)":"translate3d("+p+"px, "+m+"px, 0)",F))}return Object.assign({},R,(t={},t[C]=_?m+"px":"",t[x]=g?p+"px":"",t.transform="",t))}function Z0e(e){var t=e.state,n=e.options,r=n.gpuAcceleration,o=r===void 0?!0:r,i=n.adaptive,a=i===void 0?!0:i,l=n.roundOffsets,s=l===void 0?!0:l,u={placement:Js(t.placement),variation:f0(t.placement),popper:t.elements.popper,popperRect:t.rects.popper,gpuAcceleration:o,isFixed:t.options.strategy==="fixed"};t.modifiersData.popperOffsets!=null&&(t.styles.popper=Object.assign({},t.styles.popper,QO(Object.assign({},u,{offsets:t.modifiersData.popperOffsets,position:t.options.strategy,adaptive:a,roundOffsets:s})))),t.modifiersData.arrow!=null&&(t.styles.arrow=Object.assign({},t.styles.arrow,QO(Object.assign({},u,{offsets:t.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:s})))),t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-placement":t.placement})}var DV={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:Z0e,data:{}},R2={passive:!0};function J0e(e){var t=e.state,n=e.instance,r=e.options,o=r.scroll,i=o===void 0?!0:o,a=r.resize,l=a===void 0?!0:a,s=fl(t.elements.popper),u=[].concat(t.scrollParents.reference,t.scrollParents.popper);return i&&u.forEach(function(c){c.addEventListener("scroll",n.update,R2)}),l&&s.addEventListener("resize",n.update,R2),function(){i&&u.forEach(function(c){c.removeEventListener("scroll",n.update,R2)}),l&&s.removeEventListener("resize",n.update,R2)}}var NV={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:J0e,data:{}},eve={left:"right",right:"left",bottom:"top",top:"bottom"};function Qy(e){return e.replace(/left|right|bottom|top/g,function(t){return eve[t]})}var tve={start:"end",end:"start"};function ZO(e){return e.replace(/start|end/g,function(t){return tve[t]})}function FA(e){var t=fl(e),n=t.pageXOffset,r=t.pageYOffset;return{scrollLeft:n,scrollTop:r}}function RA(e){return d0(Rd(e)).left+FA(e).scrollLeft}function nve(e,t){var n=fl(e),r=Rd(e),o=n.visualViewport,i=r.clientWidth,a=r.clientHeight,l=0,s=0;if(o){i=o.width,a=o.height;var u=SV();(u||!u&&t==="fixed")&&(l=o.offsetLeft,s=o.offsetTop)}return{width:i,height:a,x:l+RA(e),y:s}}function rve(e){var t,n=Rd(e),r=FA(e),o=(t=e.ownerDocument)==null?void 0:t.body,i=zf(n.scrollWidth,n.clientWidth,o?o.scrollWidth:0,o?o.clientWidth:0),a=zf(n.scrollHeight,n.clientHeight,o?o.scrollHeight:0,o?o.clientHeight:0),l=-r.scrollLeft+RA(e),s=-r.scrollTop;return ic(o||n).direction==="rtl"&&(l+=zf(n.clientWidth,o?o.clientWidth:0)-i),{width:i,height:a,x:l,y:s}}function PA(e){var t=ic(e),n=t.overflow,r=t.overflowX,o=t.overflowY;return/auto|scroll|overlay|hidden/.test(n+o+r)}function FV(e){return["html","body","#document"].indexOf(au(e))>=0?e.ownerDocument.body:Tl(e)&&PA(e)?e:FV(_6(e))}function Im(e,t){var n;t===void 0&&(t=[]);var r=FV(e),o=r===((n=e.ownerDocument)==null?void 0:n.body),i=fl(r),a=o?[i].concat(i.visualViewport||[],PA(r)?r:[]):r,l=t.concat(a);return o?l:l.concat(Im(_6(a)))}function jx(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function ove(e,t){var n=d0(e,!1,t==="fixed");return n.top=n.top+e.clientTop,n.left=n.left+e.clientLeft,n.bottom=n.top+e.clientHeight,n.right=n.left+e.clientWidth,n.width=e.clientWidth,n.height=e.clientHeight,n.x=n.left,n.y=n.top,n}function JO(e,t,n){return t===EV?jx(nve(e,n)):ep(t)?ove(t,n):jx(rve(Rd(e)))}function ive(e){var t=Im(_6(e)),n=["absolute","fixed"].indexOf(ic(e).position)>=0,r=n&&Tl(e)?A1(e):e;return ep(r)?t.filter(function(o){return ep(o)&&kV(o,r)&&au(o)!=="body"}):[]}function ave(e,t,n,r){var o=t==="clippingParents"?ive(e):[].concat(t),i=[].concat(o,[n]),a=i[0],l=i.reduce(function(s,u){var c=JO(e,u,r);return s.top=zf(c.top,s.top),s.right=ab(c.right,s.right),s.bottom=ab(c.bottom,s.bottom),s.left=zf(c.left,s.left),s},JO(e,a,r));return l.width=l.right-l.left,l.height=l.bottom-l.top,l.x=l.left,l.y=l.top,l}function RV(e){var t=e.reference,n=e.element,r=e.placement,o=r?Js(r):null,i=r?f0(r):null,a=t.x+t.width/2-n.width/2,l=t.y+t.height/2-n.height/2,s;switch(o){case Na:s={x:a,y:t.y-n.height};break;case Bl:s={x:a,y:t.y+t.height};break;case Ll:s={x:t.x+t.width,y:l};break;case Fa:s={x:t.x-n.width,y:l};break;default:s={x:t.x,y:t.y}}var u=o?NA(o):null;if(u!=null){var c=u==="y"?"height":"width";switch(i){case u0:s[u]=s[u]-(t[c]/2-n[c]/2);break;case Ng:s[u]=s[u]+(t[c]/2-n[c]/2);break}}return s}function Fg(e,t){t===void 0&&(t={});var n=t,r=n.placement,o=r===void 0?e.placement:r,i=n.strategy,a=i===void 0?e.strategy:i,l=n.boundary,s=l===void 0?M0e:l,u=n.rootBoundary,c=u===void 0?EV:u,d=n.elementContext,f=d===void 0?Jv:d,p=n.altBoundary,v=p===void 0?!1:p,m=n.padding,y=m===void 0?0:m,g=MV(typeof y!="number"?y:OV(y,E1)),_=f===Jv?O0e:Jv,x=e.rects.popper,C=e.elements[v?_:f],E=ave(ep(C)?C:C.contextElement||Rd(e.elements.popper),s,c,a),A=d0(e.elements.reference),S=RV({reference:A,element:x,placement:o}),D=jx(Object.assign({},x,S)),L=f===Jv?D:A,M={top:E.top-L.top+g.top,bottom:L.bottom-E.bottom+g.bottom,left:E.left-L.left+g.left,right:L.right-E.right+g.right},R=e.modifiersData.offset;if(f===Jv&&R){var I=R[o];Object.keys(M).forEach(function(F){var z=[Ll,Bl].indexOf(F)>=0?1:-1,O=[Na,Bl].indexOf(F)>=0?"y":"x";M[F]+=I[O]*z})}return M}function lve(e,t){t===void 0&&(t={});var n=t,r=n.placement,o=n.boundary,i=n.rootBoundary,a=n.padding,l=n.flipVariations,s=n.allowedAutoPlacements,u=s===void 0?xp:s,c=f0(r),d=c?l?qO:qO.filter(function(v){return f0(v)===c}):E1,f=d.filter(function(v){return u.indexOf(v)>=0});f.length===0&&(f=d);var p=f.reduce(function(v,m){return v[m]=Fg(e,{placement:m,boundary:o,rootBoundary:i,padding:a})[Js(m)],v},{});return Object.keys(p).sort(function(v,m){return p[v]-p[m]})}function sve(e){if(Js(e)===MA)return[];var t=Qy(e);return[ZO(e),t,ZO(t)]}function uve(e){var t=e.state,n=e.options,r=e.name;if(!t.modifiersData[r]._skip){for(var o=n.mainAxis,i=o===void 0?!0:o,a=n.altAxis,l=a===void 0?!0:a,s=n.fallbackPlacements,u=n.padding,c=n.boundary,d=n.rootBoundary,f=n.altBoundary,p=n.flipVariations,v=p===void 0?!0:p,m=n.allowedAutoPlacements,y=t.options.placement,g=Js(y),_=g===y,x=s||(_||!v?[Qy(y)]:sve(y)),C=[y].concat(x).reduce(function(oe,pe){return oe.concat(Js(pe)===MA?lve(t,{placement:pe,boundary:c,rootBoundary:d,padding:u,flipVariations:v,allowedAutoPlacements:m}):pe)},[]),E=t.rects.reference,A=t.rects.popper,S=new Map,D=!0,L=C[0],M=0;M=0,O=z?"width":"height",j=Fg(t,{placement:R,boundary:c,rootBoundary:d,altBoundary:f,padding:u}),U=z?F?Ll:Fa:F?Bl:Na;E[O]>A[O]&&(U=Qy(U));var K=Qy(U),$=[];if(i&&$.push(j[I]<=0),l&&$.push(j[U]<=0,j[K]<=0),$.every(function(oe){return oe})){L=R,D=!1;break}S.set(R,$)}if(D)for(var q=v?3:1,ae=function(oe){var pe=C.find(function(J){var Z=S.get(J);if(Z)return Z.slice(0,oe).every(function(ne){return ne})});if(pe)return L=pe,"break"},H=q;H>0;H--){var X=ae(H);if(X==="break")break}t.placement!==L&&(t.modifiersData[r]._skip=!0,t.placement=L,t.reset=!0)}}var cve={name:"flip",enabled:!0,phase:"main",fn:uve,requiresIfExists:["offset"],data:{_skip:!1}};function eD(e,t,n){return n===void 0&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function tD(e){return[Na,Ll,Bl,Fa].some(function(t){return e[t]>=0})}function dve(e){var t=e.state,n=e.name,r=t.rects.reference,o=t.rects.popper,i=t.modifiersData.preventOverflow,a=Fg(t,{elementContext:"reference"}),l=Fg(t,{altBoundary:!0}),s=eD(a,r),u=eD(l,o,i),c=tD(s),d=tD(u);t.modifiersData[n]={referenceClippingOffsets:s,popperEscapeOffsets:u,isReferenceHidden:c,hasPopperEscaped:d},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":c,"data-popper-escaped":d})}var fve={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:dve};function pve(e,t,n){var r=Js(e),o=[Fa,Na].indexOf(r)>=0?-1:1,i=typeof n=="function"?n(Object.assign({},t,{placement:e})):n,a=i[0],l=i[1];return a=a||0,l=(l||0)*o,[Fa,Ll].indexOf(r)>=0?{x:l,y:a}:{x:a,y:l}}function hve(e){var t=e.state,n=e.options,r=e.name,o=n.offset,i=o===void 0?[0,0]:o,a=xp.reduce(function(c,d){return c[d]=pve(d,t.rects,i),c},{}),l=a[t.placement],s=l.x,u=l.y;t.modifiersData.popperOffsets!=null&&(t.modifiersData.popperOffsets.x+=s,t.modifiersData.popperOffsets.y+=u),t.modifiersData[r]=a}var vve={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:hve};function mve(e){var t=e.state,n=e.name;t.modifiersData[n]=RV({reference:t.rects.reference,element:t.rects.popper,placement:t.placement})}var PV={name:"popperOffsets",enabled:!0,phase:"read",fn:mve,data:{}};function gve(e){return e==="x"?"y":"x"}function yve(e){var t=e.state,n=e.options,r=e.name,o=n.mainAxis,i=o===void 0?!0:o,a=n.altAxis,l=a===void 0?!1:a,s=n.boundary,u=n.rootBoundary,c=n.altBoundary,d=n.padding,f=n.tether,p=f===void 0?!0:f,v=n.tetherOffset,m=v===void 0?0:v,y=Fg(t,{boundary:s,rootBoundary:u,padding:d,altBoundary:c}),g=Js(t.placement),_=f0(t.placement),x=!_,C=NA(g),E=gve(C),A=t.modifiersData.popperOffsets,S=t.rects.reference,D=t.rects.popper,L=typeof m=="function"?m(Object.assign({},t.rects,{placement:t.placement})):m,M=typeof L=="number"?{mainAxis:L,altAxis:L}:Object.assign({mainAxis:0,altAxis:0},L),R=t.modifiersData.offset?t.modifiersData.offset[t.placement]:null,I={x:0,y:0};if(A){if(i){var F,z=C==="y"?Na:Fa,O=C==="y"?Bl:Ll,j=C==="y"?"height":"width",U=A[C],K=U+y[z],$=U-y[O],q=p?-D[j]/2:0,ae=_===u0?S[j]:D[j],H=_===u0?-D[j]:-S[j],X=t.elements.arrow,oe=p&&X?DA(X):{width:0,height:0},pe=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:TV(),J=pe[z],Z=pe[O],ne=Lm(0,S[j],oe[j]),le=x?S[j]/2-q-ne-J-M.mainAxis:ae-ne-J-M.mainAxis,se=x?-S[j]/2+q+ne+Z+M.mainAxis:H+ne+Z+M.mainAxis,te=t.elements.arrow&&A1(t.elements.arrow),de=te?C==="y"?te.clientTop||0:te.clientLeft||0:0,be=(F=R==null?void 0:R[C])!=null?F:0,Pe=U+le-be-de,ze=U+se-be,Qe=Lm(p?ab(K,Pe):K,U,p?zf($,ze):$);A[C]=Qe,I[C]=Qe-U}if(l){var qe,$e=C==="x"?Na:Fa,he=C==="x"?Bl:Ll,me=A[E],Se=E==="y"?"height":"width",Ne=me+y[$e],Me=me-y[he],xe=[Na,Fa].indexOf(g)!==-1,Ce=(qe=R==null?void 0:R[E])!=null?qe:0,Ve=xe?Ne:me-S[Se]-D[Se]-Ce+M.altAxis,rt=xe?me+S[Se]+D[Se]-Ce-M.altAxis:Me,ht=p&&xe?U0e(Ve,me,rt):Lm(p?Ve:Ne,me,p?rt:Me);A[E]=ht,I[E]=ht-me}t.modifiersData[r]=I}}var _ve={name:"preventOverflow",enabled:!0,phase:"main",fn:yve,requiresIfExists:["offset"]};function bve(e){return{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}}function wve(e){return e===fl(e)||!Tl(e)?FA(e):bve(e)}function xve(e){var t=e.getBoundingClientRect(),n=c0(t.width)/e.offsetWidth||1,r=c0(t.height)/e.offsetHeight||1;return n!==1||r!==1}function Cve(e,t,n){n===void 0&&(n=!1);var r=Tl(t),o=Tl(t)&&xve(t),i=Rd(t),a=d0(e,o,n),l={scrollLeft:0,scrollTop:0},s={x:0,y:0};return(r||!r&&!n)&&((au(t)!=="body"||PA(i))&&(l=wve(t)),Tl(t)?(s=d0(t,!0),s.x+=t.clientLeft,s.y+=t.clientTop):i&&(s.x=RA(i))),{x:a.left+l.scrollLeft-s.x,y:a.top+l.scrollTop-s.y,width:a.width,height:a.height}}function Eve(e){var t=new Map,n=new Set,r=[];e.forEach(function(i){t.set(i.name,i)});function o(i){n.add(i.name);var a=[].concat(i.requires||[],i.requiresIfExists||[]);a.forEach(function(l){if(!n.has(l)){var s=t.get(l);s&&o(s)}}),r.push(i)}return e.forEach(function(i){n.has(i.name)||o(i)}),r}function Ave(e){var t=Eve(e);return z0e.reduce(function(n,r){return n.concat(t.filter(function(o){return o.phase===r}))},[])}function Sve(e){var t;return function(){return t||(t=new Promise(function(n){Promise.resolve().then(function(){t=void 0,n(e())})})),t}}function kve(e){var t=e.reduce(function(n,r){var o=n[r.name];return n[r.name]=o?Object.assign({},o,r,{options:Object.assign({},o.options,r.options),data:Object.assign({},o.data,r.data)}):r,n},{});return Object.keys(t).map(function(n){return t[n]})}var nD={placement:"bottom",modifiers:[],strategy:"absolute"};function rD(){for(var e=arguments.length,t=new Array(e),n=0;n{const t=Wt()?Tt(aD,oD):oD,n=e||(Wt()?Tt(IV,void 0):void 0),r=G(()=>{const a=w(n);return Jf(a)?a:LV}),o=G(()=>r.value+iD.value),i=()=>(t.current++,iD.value=t.current,o.value);return!gp&&!Tt(aD)&&C1("ZIndexInjection",`Looks like you are using server rendering, you must provide a z-index provider to ensure the hydration process to be succeed +usage: app.provide(ZINDEX_INJECTION_KEY, { current: 0 })`),{initialZIndex:r,currentZIndex:o,nextZIndex:i}},Rg=Math.min,Yh=Math.max,lb=Math.round,eu=e=>({x:e,y:e});function Dve(e,t,n){return Yh(e,Rg(t,n))}function LA(e,t){return typeof e=="function"?e(t):e}function $V(e){return e.split("-")[0]}function IA(e){return e.split("-")[1]}function Nve(e){return e==="x"?"y":"x"}function zV(e){return e==="y"?"height":"width"}function $A(e){const t=e[0];return t==="t"||t==="b"?"y":"x"}function VV(e){return Nve($A(e))}function Fve(e){return{top:0,right:0,bottom:0,left:0,...e}}function HV(e){return typeof e!="number"?Fve(e):{top:e,right:e,bottom:e,left:e}}function sb(e){const{x:t,y:n,width:r,height:o}=e;return{width:r,height:o,top:n,left:t,right:t+r,bottom:n+o,x:t,y:n}}function lD(e,t,n){let{reference:r,floating:o}=e;const i=$A(t),a=VV(t),l=zV(a),s=$V(t),u=i==="y",c=r.x+r.width/2-o.width/2,d=r.y+r.height/2-o.height/2,f=r[l]/2-o[l]/2;let p;switch(s){case"top":p={x:c,y:r.y-o.height};break;case"bottom":p={x:c,y:r.y+r.height};break;case"right":p={x:r.x+r.width,y:d};break;case"left":p={x:r.x-o.width,y:d};break;default:p={x:r.x,y:r.y}}switch(IA(t)){case"start":p[a]-=f*(n&&u?-1:1);break;case"end":p[a]+=f*(n&&u?-1:1);break}return p}async function Rve(e,t){var n;t===void 0&&(t={});const{x:r,y:o,platform:i,rects:a,elements:l,strategy:s}=e,{boundary:u="clippingAncestors",rootBoundary:c="viewport",elementContext:d="floating",altBoundary:f=!1,padding:p=0}=LA(t,e),v=HV(p),y=l[f?d==="floating"?"reference":"floating":d],g=sb(await i.getClippingRect({element:(n=await(i.isElement==null?void 0:i.isElement(y)))==null||n?y:y.contextElement||await(i.getDocumentElement==null?void 0:i.getDocumentElement(l.floating)),boundary:u,rootBoundary:c,strategy:s})),_=d==="floating"?{x:r,y:o,width:a.floating.width,height:a.floating.height}:a.reference,x=await(i.getOffsetParent==null?void 0:i.getOffsetParent(l.floating)),C=await(i.isElement==null?void 0:i.isElement(x))?await(i.getScale==null?void 0:i.getScale(x))||{x:1,y:1}:{x:1,y:1},E=sb(i.convertOffsetParentRelativeRectToViewportRelativeRect?await i.convertOffsetParentRelativeRectToViewportRelativeRect({elements:l,rect:_,offsetParent:x,strategy:s}):_);return{top:(g.top-E.top+v.top)/C.y,bottom:(E.bottom-g.bottom+v.bottom)/C.y,left:(g.left-E.left+v.left)/C.x,right:(E.right-g.right+v.right)/C.x}}const Pve=50,Bve=async(e,t,n)=>{const{placement:r="bottom",strategy:o="absolute",middleware:i=[],platform:a}=n,l=a.detectOverflow?a:{...a,detectOverflow:Rve},s=await(a.isRTL==null?void 0:a.isRTL(t));let u=await a.getElementRects({reference:e,floating:t,strategy:o}),{x:c,y:d}=lD(u,r,s),f=r,p=0;const v={};for(let m=0;m({name:"arrow",options:e,async fn(t){const{x:n,y:r,placement:o,rects:i,platform:a,elements:l,middlewareData:s}=t,{element:u,padding:c=0}=LA(e,t)||{};if(u==null)return{};const d=HV(c),f={x:n,y:r},p=VV(o),v=zV(p),m=await a.getDimensions(u),y=p==="y",g=y?"top":"left",_=y?"bottom":"right",x=y?"clientHeight":"clientWidth",C=i.reference[v]+i.reference[p]-f[p]-i.floating[v],E=f[p]-i.reference[p],A=await(a.getOffsetParent==null?void 0:a.getOffsetParent(u));let S=A?A[x]:0;(!S||!await(a.isElement==null?void 0:a.isElement(A)))&&(S=l.floating[x]||i.floating[v]);const D=C/2-E/2,L=S/2-m[v]/2-1,M=Rg(d[g],L),R=Rg(d[_],L),I=M,F=S-m[v]-R,z=S/2-m[v]/2+D,O=Dve(I,z,F),j=!s.arrow&&IA(o)!=null&&z!==O&&i.reference[v]/2-(z"u"?!1:e instanceof ShadowRoot||e instanceof il(e).ShadowRoot}function S1(e){const{overflow:t,overflowX:n,overflowY:r,display:o}=Ss(e);return/auto|scroll|overlay|hidden|clip/.test(t+r+n)&&o!=="inline"&&o!=="contents"}function Vve(e){return/^(table|td|th)$/.test(rv(e))}function w6(e){try{if(e.matches(":popover-open"))return!0}catch{}try{return e.matches(":modal")}catch{return!1}}const Hve=/transform|translate|scale|rotate|perspective|filter/,jve=/paint|layout|strict|content/,lf=e=>!!e&&e!=="none";let Cw;function zA(e){const t=As(e)?Ss(e):e;return lf(t.transform)||lf(t.translate)||lf(t.scale)||lf(t.rotate)||lf(t.perspective)||!VA()&&(lf(t.backdropFilter)||lf(t.filter))||Hve.test(t.willChange||"")||jve.test(t.contain||"")}function Wve(e){let t=wd(e);for(;gc(t)&&!p0(t);){if(zA(t))return t;if(w6(t))return null;t=wd(t)}return null}function VA(){return Cw==null&&(Cw=typeof CSS<"u"&&CSS.supports&&CSS.supports("-webkit-backdrop-filter","none")),Cw}function p0(e){return/^(html|body|#document)$/.test(rv(e))}function Ss(e){return il(e).getComputedStyle(e)}function x6(e){return As(e)?{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}:{scrollLeft:e.scrollX,scrollTop:e.scrollY}}function wd(e){if(rv(e)==="html")return e;const t=e.assignedSlot||e.parentNode||sD(e)&&e.host||mc(e);return sD(t)?t.host:t}function WV(e){const t=wd(e);return p0(t)?e.ownerDocument?e.ownerDocument.body:e.body:gc(t)&&S1(t)?t:WV(t)}function Wx(e,t,n){var r;t===void 0&&(t=[]),n===void 0&&(n=!0);const o=WV(e),i=o===((r=e.ownerDocument)==null?void 0:r.body),a=il(o);if(i){const l=Ux(a);return t.concat(a,a.visualViewport||[],S1(o)?o:[],l&&n?Wx(l):[])}else return t.concat(o,Wx(o,[],n))}function Ux(e){return e.parent&&Object.getPrototypeOf(e.parent)?e.frameElement:null}function UV(e){const t=Ss(e);let n=parseFloat(t.width)||0,r=parseFloat(t.height)||0;const o=gc(e),i=o?e.offsetWidth:n,a=o?e.offsetHeight:r,l=lb(n)!==i||lb(r)!==a;return l&&(n=i,r=a),{width:n,height:r,$:l}}function KV(e){return As(e)?e:e.contextElement}function Gh(e){const t=KV(e);if(!gc(t))return eu(1);const n=t.getBoundingClientRect(),{width:r,height:o,$:i}=UV(t);let a=(i?lb(n.width):n.width)/r,l=(i?lb(n.height):n.height)/o;return(!a||!Number.isFinite(a))&&(a=1),(!l||!Number.isFinite(l))&&(l=1),{x:a,y:l}}const Uve=eu(0);function YV(e){const t=il(e);return!VA()||!t.visualViewport?Uve:{x:t.visualViewport.offsetLeft,y:t.visualViewport.offsetTop}}function Kve(e,t,n){return t===void 0&&(t=!1),!n||t&&n!==il(e)?!1:t}function Pg(e,t,n,r){t===void 0&&(t=!1),n===void 0&&(n=!1);const o=e.getBoundingClientRect(),i=KV(e);let a=eu(1);t&&(r?As(r)&&(a=Gh(r)):a=Gh(e));const l=Kve(i,n,r)?YV(i):eu(0);let s=(o.left+l.x)/a.x,u=(o.top+l.y)/a.y,c=o.width/a.x,d=o.height/a.y;if(i){const f=il(i),p=r&&As(r)?il(r):r;let v=f,m=Ux(v);for(;m&&r&&p!==v;){const y=Gh(m),g=m.getBoundingClientRect(),_=Ss(m),x=g.left+(m.clientLeft+parseFloat(_.paddingLeft))*y.x,C=g.top+(m.clientTop+parseFloat(_.paddingTop))*y.y;s*=y.x,u*=y.y,c*=y.x,d*=y.y,s+=x,u+=C,v=il(m),m=Ux(v)}}return sb({width:c,height:d,x:s,y:u})}function C6(e,t){const n=x6(e).scrollLeft;return t?t.left+n:Pg(mc(e)).left+n}function GV(e,t){const n=e.getBoundingClientRect(),r=n.left+t.scrollLeft-C6(e,n),o=n.top+t.scrollTop;return{x:r,y:o}}function Yve(e){let{elements:t,rect:n,offsetParent:r,strategy:o}=e;const i=o==="fixed",a=mc(r),l=t?w6(t.floating):!1;if(r===a||l&&i)return n;let s={scrollLeft:0,scrollTop:0},u=eu(1);const c=eu(0),d=gc(r);if((d||!d&&!i)&&((rv(r)!=="body"||S1(a))&&(s=x6(r)),d)){const p=Pg(r);u=Gh(r),c.x=p.x+r.clientLeft,c.y=p.y+r.clientTop}const f=a&&!d&&!i?GV(a,s):eu(0);return{width:n.width*u.x,height:n.height*u.y,x:n.x*u.x-s.scrollLeft*u.x+c.x+f.x,y:n.y*u.y-s.scrollTop*u.y+c.y+f.y}}function Gve(e){return Array.from(e.getClientRects())}function qve(e){const t=mc(e),n=x6(e),r=e.ownerDocument.body,o=Yh(t.scrollWidth,t.clientWidth,r.scrollWidth,r.clientWidth),i=Yh(t.scrollHeight,t.clientHeight,r.scrollHeight,r.clientHeight);let a=-n.scrollLeft+C6(e);const l=-n.scrollTop;return Ss(r).direction==="rtl"&&(a+=Yh(t.clientWidth,r.clientWidth)-o),{width:o,height:i,x:a,y:l}}const uD=25;function Xve(e,t){const n=il(e),r=mc(e),o=n.visualViewport;let i=r.clientWidth,a=r.clientHeight,l=0,s=0;if(o){i=o.width,a=o.height;const c=VA();(!c||c&&t==="fixed")&&(l=o.offsetLeft,s=o.offsetTop)}const u=C6(r);if(u<=0){const c=r.ownerDocument,d=c.body,f=getComputedStyle(d),p=c.compatMode==="CSS1Compat"&&parseFloat(f.marginLeft)+parseFloat(f.marginRight)||0,v=Math.abs(r.clientWidth-d.clientWidth-p);v<=uD&&(i-=v)}else u<=uD&&(i+=u);return{width:i,height:a,x:l,y:s}}function Qve(e,t){const n=Pg(e,!0,t==="fixed"),r=n.top+e.clientTop,o=n.left+e.clientLeft,i=gc(e)?Gh(e):eu(1),a=e.clientWidth*i.x,l=e.clientHeight*i.y,s=o*i.x,u=r*i.y;return{width:a,height:l,x:s,y:u}}function cD(e,t,n){let r;if(t==="viewport")r=Xve(e,n);else if(t==="document")r=qve(mc(e));else if(As(t))r=Qve(t,n);else{const o=YV(e);r={x:t.x-o.x,y:t.y-o.y,width:t.width,height:t.height}}return sb(r)}function qV(e,t){const n=wd(e);return n===t||!As(n)||p0(n)?!1:Ss(n).position==="fixed"||qV(n,t)}function Zve(e,t){const n=t.get(e);if(n)return n;let r=Wx(e,[],!1).filter(l=>As(l)&&rv(l)!=="body"),o=null;const i=Ss(e).position==="fixed";let a=i?wd(e):e;for(;As(a)&&!p0(a);){const l=Ss(a),s=zA(a);!s&&l.position==="fixed"&&(o=null),(i?!s&&!o:!s&&l.position==="static"&&!!o&&(o.position==="absolute"||o.position==="fixed")||S1(a)&&!s&&qV(e,a))?r=r.filter(c=>c!==a):o=l,a=wd(a)}return t.set(e,r),r}function Jve(e){let{element:t,boundary:n,rootBoundary:r,strategy:o}=e;const a=[...n==="clippingAncestors"?w6(t)?[]:Zve(t,this._c):[].concat(n),r],l=cD(t,a[0],o);let s=l.top,u=l.right,c=l.bottom,d=l.left;for(let f=1;f{const r=new Map,o={platform:ome,...n},i={...o.platform,_c:r};return Bve(e,t,{...o,platform:i})},sme=wV({type:String,values:Hee,required:!1}),ume=Symbol("size"),cme=Symbol("emptyValuesContextKey"),dme=x1({emptyValues:Array,valueOnClear:{type:ta([String,Number,Boolean,Function]),default:void 0,validator:e=>(e=J_(e)?e():e,jI(e)?e.every(t=>!t):!e)}}),fme=e=>{const t=e.props,n=jI(t)?Zf(t.map(r=>[r,{}])):t;e.setPropsDefaults=r=>{if(n){for(const[o,i]of Object.entries(r)){const a=n[o];if(Z_(n,o)){if(Z0(a)){n[o]={...a,default:i};continue}n[o]={type:a,default:i}}}e.props=n}}},QV=(e,t)=>{if(e.install=n=>{for(const r of[e,...Object.values(t??{})])n.component(r.name,r)},t)for(const[n,r]of Object.entries(t))e[n]=r;return fme(e),e},pme=(e,t)=>(e.install=n=>{e._context=n._context,n.config.globalProperties[t]=e},e);/*! Element Plus Icons Vue v2.3.2 */var hme=ee({name:"CircleCloseFilled",__name:"circle-close-filled",setup(e){return(t,n)=>(N(),V("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[B("path",{fill:"currentColor",d:"M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896m0 393.664L407.936 353.6a38.4 38.4 0 1 0-54.336 54.336L457.664 512 353.6 616.064a38.4 38.4 0 1 0 54.336 54.336L512 566.336 616.064 670.4a38.4 38.4 0 1 0 54.336-54.336L566.336 512 670.4 407.936a38.4 38.4 0 1 0-54.336-54.336z"})]))}}),ZV=hme,vme=ee({name:"Close",__name:"close",setup(e){return(t,n)=>(N(),V("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[B("path",{fill:"currentColor",d:"M764.288 214.592 512 466.88 259.712 214.592a31.936 31.936 0 0 0-45.12 45.12L466.752 512 214.528 764.224a31.936 31.936 0 1 0 45.12 45.184L512 557.184l252.288 252.288a31.936 31.936 0 0 0 45.12-45.12L557.12 512.064l252.288-252.352a31.936 31.936 0 1 0-45.12-45.184z"})]))}}),mme=vme,gme=ee({name:"InfoFilled",__name:"info-filled",setup(e){return(t,n)=>(N(),V("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[B("path",{fill:"currentColor",d:"M512 64a448 448 0 1 1 0 896.064A448 448 0 0 1 512 64m67.2 275.072c33.28 0 60.288-23.104 60.288-57.344s-27.072-57.344-60.288-57.344c-33.28 0-60.16 23.104-60.16 57.344s26.88 57.344 60.16 57.344M590.912 699.2c0-6.848 2.368-24.64 1.024-34.752l-52.608 60.544c-10.88 11.456-24.512 19.392-30.912 17.28a12.99 12.99 0 0 1-8.256-14.72l87.68-276.992c7.168-35.136-12.544-67.2-54.336-71.296-44.096 0-108.992 44.736-148.48 101.504 0 6.784-1.28 23.68.064 33.792l52.544-60.608c10.88-11.328 23.552-19.328 29.952-17.152a12.8 12.8 0 0 1 7.808 16.128L388.48 728.576c-10.048 32.256 8.96 63.872 55.04 71.04 67.84 0 107.904-43.648 147.456-100.416z"})]))}}),Kx=gme,yme=ee({name:"SuccessFilled",__name:"success-filled",setup(e){return(t,n)=>(N(),V("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[B("path",{fill:"currentColor",d:"M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896m-55.808 536.384-99.52-99.584a38.4 38.4 0 1 0-54.336 54.336l126.72 126.72a38.27 38.27 0 0 0 54.336 0l262.4-262.464a38.4 38.4 0 1 0-54.272-54.336z"})]))}}),JV=yme,_me=ee({name:"WarningFilled",__name:"warning-filled",setup(e){return(t,n)=>(N(),V("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[B("path",{fill:"currentColor",d:"M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896m0 192a58.43 58.43 0 0 0-58.24 63.744l23.36 256.384a35.072 35.072 0 0 0 69.76 0l23.296-256.384A58.43 58.43 0 0 0 512 256m0 512a51.2 51.2 0 1 0 0-102.4 51.2 51.2 0 0 0 0 102.4"})]))}}),eH=_me;const bme=ta([String,Object,Function]),wme={Close:mme,SuccessFilled:JV,InfoFilled:Kx,WarningFilled:eH,CircleCloseFilled:ZV},fD={primary:Kx,success:JV,warning:eH,error:ZV,info:Kx},xme=x1({size:{type:ta([Number,String])},color:{type:String}});var Cme=ee({name:"ElIcon",inheritAttrs:!1,__name:"icon",props:xme,setup(e){const t=e,n=TA("icon"),r=G(()=>{const{size:o,color:i}=t,a=Vx(o);return!a&&!i?{}:{fontSize:a,"--color":i}});return(o,i)=>(N(),V("i",Gt({class:w(n).b(),style:r.value},o.$attrs),[Ze(o.$slots,"default")],16))}}),Eme=Cme;const pD=QV(Eme);function Mf(){return Mf=Object.assign?Object.assign.bind():function(e){for(var t=1;t"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch{return!1}}function Zy(e,t,n){return Sme()?Zy=Reflect.construct.bind():Zy=function(o,i,a){var l=[null];l.push.apply(l,i);var s=Function.bind.apply(o,l),u=new s;return a&&Bg(u,a.prototype),u},Zy.apply(null,arguments)}function kme(e){return Function.toString.call(e).indexOf("[native code]")!==-1}function Gx(e){var t=typeof Map=="function"?new Map:void 0;return Gx=function(r){if(r===null||!kme(r))return r;if(typeof r!="function")throw new TypeError("Super expression must either be null or a function");if(typeof t<"u"){if(t.has(r))return t.get(r);t.set(r,o)}function o(){return Zy(r,arguments,Yx(this).constructor)}return o.prototype=Object.create(r.prototype,{constructor:{value:o,enumerable:!1,writable:!0,configurable:!0}}),Bg(o,r)},Gx(e)}var Tme=/%[sdj%]/g,Mme=function(){};function qx(e){if(!e||!e.length)return null;var t={};return e.forEach(function(n){var r=n.field;t[r]=t[r]||[],t[r].push(n)}),t}function nl(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r=i)return l;switch(l){case"%s":return String(n[o++]);case"%d":return Number(n[o++]);case"%j":try{return JSON.stringify(n[o++])}catch{return"[Circular]"}break;default:return l}});return a}return e}function Ome(e){return e==="string"||e==="url"||e==="hex"||e==="email"||e==="date"||e==="pattern"}function Yo(e,t){return!!(e==null||t==="array"&&Array.isArray(e)&&!e.length||Ome(t)&&typeof e=="string"&&!e)}function Dme(e,t,n){var r=[],o=0,i=e.length;function a(l){r.push.apply(r,l||[]),o++,o===i&&n(r)}e.forEach(function(l){t(l,a)})}function hD(e,t,n){var r=0,o=e.length;function i(a){if(a&&a.length){n(a);return}var l=r;r=r+1,l()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+\.)+[a-zA-Z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]{2,}))$/,hex:/^#?([a-f0-9]{6}|[a-f0-9]{3})$/i},bm={integer:function(t){return bm.number(t)&&parseInt(t,10)===t},float:function(t){return bm.number(t)&&!bm.integer(t)},array:function(t){return Array.isArray(t)},regexp:function(t){if(t instanceof RegExp)return!0;try{return!!new RegExp(t)}catch{return!1}},date:function(t){return typeof t.getTime=="function"&&typeof t.getMonth=="function"&&typeof t.getYear=="function"&&!isNaN(t.getTime())},number:function(t){return isNaN(t)?!1:typeof t=="number"},object:function(t){return typeof t=="object"&&!bm.array(t)},method:function(t){return typeof t=="function"},email:function(t){return typeof t=="string"&&t.length<=320&&!!t.match(yD.email)},url:function(t){return typeof t=="string"&&t.length<=2048&&!!t.match(Lme())},hex:function(t){return typeof t=="string"&&!!t.match(yD.hex)}},Ime=function(t,n,r,o,i){if(t.required&&n===void 0){tH(t,n,r,o,i);return}var a=["integer","float","array","regexp","object","method","email","number","date","url","hex"],l=t.type;a.indexOf(l)>-1?bm[l](n)||o.push(nl(i.messages.types[l],t.fullField,t.type)):l&&typeof n!==t.type&&o.push(nl(i.messages.types[l],t.fullField,t.type))},$me=function(t,n,r,o,i){var a=typeof t.len=="number",l=typeof t.min=="number",s=typeof t.max=="number",u=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,c=n,d=null,f=typeof n=="number",p=typeof n=="string",v=Array.isArray(n);if(f?d="number":p?d="string":v&&(d="array"),!d)return!1;v&&(c=n.length),p&&(c=n.replace(u,"_").length),a?c!==t.len&&o.push(nl(i.messages[d].len,t.fullField,t.len)):l&&!s&&ct.max?o.push(nl(i.messages[d].max,t.fullField,t.max)):l&&s&&(ct.max)&&o.push(nl(i.messages[d].range,t.fullField,t.min,t.max))},Xp="enum",zme=function(t,n,r,o,i){t[Xp]=Array.isArray(t[Xp])?t[Xp]:[],t[Xp].indexOf(n)===-1&&o.push(nl(i.messages[Xp],t.fullField,t[Xp].join(", ")))},Vme=function(t,n,r,o,i){if(t.pattern){if(t.pattern instanceof RegExp)t.pattern.lastIndex=0,t.pattern.test(n)||o.push(nl(i.messages.pattern.mismatch,t.fullField,n,t.pattern));else if(typeof t.pattern=="string"){var a=new RegExp(t.pattern);a.test(n)||o.push(nl(i.messages.pattern.mismatch,t.fullField,n,t.pattern))}}},fr={required:tH,whitespace:Bme,type:Ime,range:$me,enum:zme,pattern:Vme},Hme=function(t,n,r,o,i){var a=[],l=t.required||!t.required&&o.hasOwnProperty(t.field);if(l){if(Yo(n,"string")&&!t.required)return r();fr.required(t,n,o,a,i,"string"),Yo(n,"string")||(fr.type(t,n,o,a,i),fr.range(t,n,o,a,i),fr.pattern(t,n,o,a,i),t.whitespace===!0&&fr.whitespace(t,n,o,a,i))}r(a)},jme=function(t,n,r,o,i){var a=[],l=t.required||!t.required&&o.hasOwnProperty(t.field);if(l){if(Yo(n)&&!t.required)return r();fr.required(t,n,o,a,i),n!==void 0&&fr.type(t,n,o,a,i)}r(a)},Wme=function(t,n,r,o,i){var a=[],l=t.required||!t.required&&o.hasOwnProperty(t.field);if(l){if(n===""&&(n=void 0),Yo(n)&&!t.required)return r();fr.required(t,n,o,a,i),n!==void 0&&(fr.type(t,n,o,a,i),fr.range(t,n,o,a,i))}r(a)},Ume=function(t,n,r,o,i){var a=[],l=t.required||!t.required&&o.hasOwnProperty(t.field);if(l){if(Yo(n)&&!t.required)return r();fr.required(t,n,o,a,i),n!==void 0&&fr.type(t,n,o,a,i)}r(a)},Kme=function(t,n,r,o,i){var a=[],l=t.required||!t.required&&o.hasOwnProperty(t.field);if(l){if(Yo(n)&&!t.required)return r();fr.required(t,n,o,a,i),Yo(n)||fr.type(t,n,o,a,i)}r(a)},Yme=function(t,n,r,o,i){var a=[],l=t.required||!t.required&&o.hasOwnProperty(t.field);if(l){if(Yo(n)&&!t.required)return r();fr.required(t,n,o,a,i),n!==void 0&&(fr.type(t,n,o,a,i),fr.range(t,n,o,a,i))}r(a)},Gme=function(t,n,r,o,i){var a=[],l=t.required||!t.required&&o.hasOwnProperty(t.field);if(l){if(Yo(n)&&!t.required)return r();fr.required(t,n,o,a,i),n!==void 0&&(fr.type(t,n,o,a,i),fr.range(t,n,o,a,i))}r(a)},qme=function(t,n,r,o,i){var a=[],l=t.required||!t.required&&o.hasOwnProperty(t.field);if(l){if(n==null&&!t.required)return r();fr.required(t,n,o,a,i,"array"),n!=null&&(fr.type(t,n,o,a,i),fr.range(t,n,o,a,i))}r(a)},Xme=function(t,n,r,o,i){var a=[],l=t.required||!t.required&&o.hasOwnProperty(t.field);if(l){if(Yo(n)&&!t.required)return r();fr.required(t,n,o,a,i),n!==void 0&&fr.type(t,n,o,a,i)}r(a)},Qme="enum",Zme=function(t,n,r,o,i){var a=[],l=t.required||!t.required&&o.hasOwnProperty(t.field);if(l){if(Yo(n)&&!t.required)return r();fr.required(t,n,o,a,i),n!==void 0&&fr[Qme](t,n,o,a,i)}r(a)},Jme=function(t,n,r,o,i){var a=[],l=t.required||!t.required&&o.hasOwnProperty(t.field);if(l){if(Yo(n,"string")&&!t.required)return r();fr.required(t,n,o,a,i),Yo(n,"string")||fr.pattern(t,n,o,a,i)}r(a)},ege=function(t,n,r,o,i){var a=[],l=t.required||!t.required&&o.hasOwnProperty(t.field);if(l){if(Yo(n,"date")&&!t.required)return r();if(fr.required(t,n,o,a,i),!Yo(n,"date")){var s;n instanceof Date?s=n:s=new Date(n),fr.type(t,s,o,a,i),s&&fr.range(t,s.getTime(),o,a,i)}}r(a)},tge=function(t,n,r,o,i){var a=[],l=Array.isArray(n)?"array":typeof n;fr.required(t,n,o,a,i,l),r(a)},Aw=function(t,n,r,o,i){var a=t.type,l=[],s=t.required||!t.required&&o.hasOwnProperty(t.field);if(s){if(Yo(n,a)&&!t.required)return r();fr.required(t,n,o,l,i,a),Yo(n,a)||fr.type(t,n,o,l,i)}r(l)},nge=function(t,n,r,o,i){var a=[],l=t.required||!t.required&&o.hasOwnProperty(t.field);if(l){if(Yo(n)&&!t.required)return r();fr.required(t,n,o,a,i)}r(a)},$m={string:Hme,method:jme,number:Wme,boolean:Ume,regexp:Kme,integer:Yme,float:Gme,array:qme,object:Xme,enum:Zme,pattern:Jme,date:ege,url:Aw,hex:Aw,email:Aw,required:tge,any:nge};function Xx(){return{default:"Validation error on field %s",required:"%s is required",enum:"%s must be one of %s",whitespace:"%s cannot be empty",date:{format:"%s date %s is invalid for format %s",parse:"%s date could not be parsed, %s is invalid ",invalid:"%s date %s is invalid"},types:{string:"%s is not a %s",method:"%s is not a %s (function)",array:"%s is not an %s",object:"%s is not an %s",number:"%s is not a %s",date:"%s is not a %s",boolean:"%s is not a %s",integer:"%s is not an %s",float:"%s is not a %s",regexp:"%s is not a valid %s",email:"%s is not a valid %s",url:"%s is not a valid %s",hex:"%s is not a valid %s"},string:{len:"%s must be exactly %s characters",min:"%s must be at least %s characters",max:"%s cannot be longer than %s characters",range:"%s must be between %s and %s characters"},number:{len:"%s must equal %s",min:"%s cannot be less than %s",max:"%s cannot be greater than %s",range:"%s must be between %s and %s"},array:{len:"%s must be exactly %s in length",min:"%s cannot be less than %s in length",max:"%s cannot be greater than %s in length",range:"%s must be between %s and %s in length"},pattern:{mismatch:"%s value %s does not match pattern %s"},clone:function(){var t=JSON.parse(JSON.stringify(this));return t.clone=this.clone,t}}}var Qx=Xx(),k1=function(){function e(n){this.rules=null,this._messages=Qx,this.define(n)}var t=e.prototype;return t.define=function(r){var o=this;if(!r)throw new Error("Cannot configure a schema with no rules");if(typeof r!="object"||Array.isArray(r))throw new Error("Rules must be an object");this.rules={},Object.keys(r).forEach(function(i){var a=r[i];o.rules[i]=Array.isArray(a)?a:[a]})},t.messages=function(r){return r&&(this._messages=gD(Xx(),r)),this._messages},t.validate=function(r,o,i){var a=this;o===void 0&&(o={}),i===void 0&&(i=function(){});var l=r,s=o,u=i;if(typeof s=="function"&&(u=s,s={}),!this.rules||Object.keys(this.rules).length===0)return u&&u(null,l),Promise.resolve(l);function c(m){var y=[],g={};function _(C){if(Array.isArray(C)){var E;y=(E=y).concat.apply(E,C)}else y.push(C)}for(var x=0;xe,oge=x1({value:{type:[String,Number],default:""},max:{type:Number,default:99},isDot:Boolean,hidden:Boolean,type:{type:String,values:["primary","success","warning","info","danger"],default:"danger"},showZero:{type:Boolean,default:!0},color:String,badgeStyle:{type:ta([String,Object,Array])},offset:{type:ta(Array),default:()=>[0,0]},badgeClass:{type:String}});var ige=ee({name:"ElBadge",__name:"badge",props:oge,setup(e,{expose:t}){const n=e,r=TA("badge"),o=G(()=>n.isDot?"":Jf(n.value)&&Jf(n.max)?n.max[{backgroundColor:n.color,marginRight:Vx(-n.offset[0]),marginTop:Vx(n.offset[1])},n.badgeStyle??{}]);return t({content:o}),(a,l)=>(N(),V("div",{class:ie(w(r).b())},[Ze(a.$slots,"default"),Y(Yr,{name:`${w(r).namespace.value}-zoom-in-center`},{default:Q(()=>[!e.hidden&&(o.value||e.isDot||a.$slots.content)?(N(),V("sup",{key:0,class:ie([w(r).e("content"),w(r).em("content",e.type),w(r).is("fixed",!!a.$slots.default),w(r).is("dot",e.isDot),w(r).is("hide-zero",!e.showZero&&e.value===0),e.badgeClass]),style:wt(i.value)},[Ze(a.$slots,"content",{value:o.value},()=>[vt(Re(o.value),1)])],6)):_e("v-if",!0)]),_:3},8,["name"])],2))}}),age=ige;const lge=QV(age),nH=Symbol(),ub=ue();function rH(e,t=void 0){const n=Wt()?Tt(nH,ub):ub;return e?G(()=>{var r;return((r=n.value)==null?void 0:r[e])??t}):n}function sge(e,t){const n=rH(),r=TA(e,G(()=>{var l;return((l=n.value)==null?void 0:l.namespace)||Xy})),o=S0e(G(()=>{var l;return(l=n.value)==null?void 0:l.locale})),i=Ove(G(()=>{var l;return((l=n.value)==null?void 0:l.zIndex)||LV})),a=G(()=>{var l;return w(t)||((l=n.value)==null?void 0:l.size)||""});return uge(G(()=>w(n)||{})),{ns:r,locale:o,zIndex:i,size:a}}const uge=(e,t,n=!1)=>{const r=!!Wt(),o=r?rH():void 0,i=r?bn:void 0;if(!i){C1("provideGlobalConfig","provideGlobalConfig() can only be used inside setup().");return}const a=G(()=>{const l=w(e);return o!=null&&o.value?cge(o.value,l):l});return i(nH,a),i(xV,G(()=>a.value.locale)),i(CV,G(()=>a.value.namespace)),i(IV,G(()=>a.value.zIndex)),i(ume,{size:G(()=>a.value.size||"")}),i(cme,G(()=>({emptyValues:a.value.emptyValues,valueOnClear:a.value.valueOnClear}))),(n||!ub.value)&&(ub.value=a.value),a},cge=(e,t)=>{const n=[...new Set([...GO(e),...GO(t)])],r={};for(const o of n)r[o]=t[o]!==void 0?t[o]:e[o];return r},pmt=x1({a11y:{type:Boolean,default:!0},locale:{type:ta(Object)},size:sme,button:{type:ta(Object)},card:{type:ta(Object)},dialog:{type:ta(Object)},link:{type:ta(Object)},experimentalFeatures:{type:ta(Object)},keyboardNavigation:{type:Boolean,default:!0},message:{type:ta(Object)},zIndex:Number,namespace:{type:String,default:"el"},table:{type:ta(Object)},...dme}),Ji={placement:"top"};var Ml=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function pa(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var oH={exports:{}};(function(e,t){(function(n,r){e.exports=r()})(Ml,function(){var n=1e3,r=6e4,o=36e5,i="millisecond",a="second",l="minute",s="hour",u="day",c="week",d="month",f="quarter",p="year",v="date",m="Invalid Date",y=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,g=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,_={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:function(z){var O=["th","st","nd","rd"],j=z%100;return"["+z+(O[(j-20)%10]||O[j]||O[0])+"]"}},x=function(z,O,j){var U=String(z);return!U||U.length>=O?z:""+Array(O+1-U.length).join(j)+z},C={s:x,z:function(z){var O=-z.utcOffset(),j=Math.abs(O),U=Math.floor(j/60),K=j%60;return(O<=0?"+":"-")+x(U,2,"0")+":"+x(K,2,"0")},m:function z(O,j){if(O.date()1)return z(q[0])}else{var ae=O.name;A[ae]=O,K=ae}return!U&&K&&(E=K),K||!U&&E},M=function(z,O){if(D(z))return z.clone();var j=typeof O=="object"?O:{};return j.date=z,j.args=arguments,new I(j)},R=C;R.l=L,R.i=D,R.w=function(z,O){return M(z,{locale:O.$L,utc:O.$u,x:O.$x,$offset:O.$offset})};var I=function(){function z(j){this.$L=L(j.locale,null,!0),this.parse(j),this.$x=this.$x||j.x||{},this[S]=!0}var O=z.prototype;return O.parse=function(j){this.$d=function(U){var K=U.date,$=U.utc;if(K===null)return new Date(NaN);if(R.u(K))return new Date;if(K instanceof Date)return new Date(K);if(typeof K=="string"&&!/Z$/i.test(K)){var q=K.match(y);if(q){var ae=q[2]-1||0,H=(q[7]||"0").substring(0,3);return $?new Date(Date.UTC(q[1],ae,q[3]||1,q[4]||0,q[5]||0,q[6]||0,H)):new Date(q[1],ae,q[3]||1,q[4]||0,q[5]||0,q[6]||0,H)}}return new Date(K)}(j),this.init()},O.init=function(){var j=this.$d;this.$y=j.getFullYear(),this.$M=j.getMonth(),this.$D=j.getDate(),this.$W=j.getDay(),this.$H=j.getHours(),this.$m=j.getMinutes(),this.$s=j.getSeconds(),this.$ms=j.getMilliseconds()},O.$utils=function(){return R},O.isValid=function(){return this.$d.toString()!==m},O.isSame=function(j,U){var K=M(j);return this.startOf(U)<=K&&K<=this.endOf(U)},O.isAfter=function(j,U){return M(j)68?1900:2e3)},c=function(y){return function(g){this[y]=+g}},d=[/[+-]\d\d:?(\d\d)?|Z/,function(y){(this.zone||(this.zone={})).offset=function(g){if(!g||g==="Z")return 0;var _=g.match(/([+-]|\d\d)/g),x=60*_[1]+(+_[2]||0);return x===0?0:_[0]==="+"?-x:x}(y)}],f=function(y){var g=s[y];return g&&(g.indexOf?g:g.s.concat(g.f))},p=function(y,g){var _,x=s.meridiem;if(x){for(var C=1;C<=24;C+=1)if(y.indexOf(x(C,0,g))>-1){_=C>12;break}}else _=y===(g?"pm":"PM");return _},v={A:[l,function(y){this.afternoon=p(y,!1)}],a:[l,function(y){this.afternoon=p(y,!0)}],Q:[o,function(y){this.month=3*(y-1)+1}],S:[o,function(y){this.milliseconds=100*+y}],SS:[i,function(y){this.milliseconds=10*+y}],SSS:[/\d{3}/,function(y){this.milliseconds=+y}],s:[a,c("seconds")],ss:[a,c("seconds")],m:[a,c("minutes")],mm:[a,c("minutes")],H:[a,c("hours")],h:[a,c("hours")],HH:[a,c("hours")],hh:[a,c("hours")],D:[a,c("day")],DD:[i,c("day")],Do:[l,function(y){var g=s.ordinal,_=y.match(/\d+/);if(this.day=_[0],g)for(var x=1;x<=31;x+=1)g(x).replace(/\[|\]/g,"")===y&&(this.day=x)}],w:[a,c("week")],ww:[i,c("week")],M:[a,c("month")],MM:[i,c("month")],MMM:[l,function(y){var g=f("months"),_=(f("monthsShort")||g.map(function(x){return x.slice(0,3)})).indexOf(y)+1;if(_<1)throw new Error;this.month=_%12||_}],MMMM:[l,function(y){var g=f("months").indexOf(y)+1;if(g<1)throw new Error;this.month=g%12||g}],Y:[/[+-]?\d+/,c("year")],YY:[i,function(y){this.year=u(y)}],YYYY:[/\d{4}/,c("year")],Z:d,ZZ:d};function m(y){var g,_;g=y,_=s&&s.formats;for(var x=(y=g.replace(/(\[[^\]]+])|(LTS?|l{1,4}|L{1,4})/g,function(M,R,I){var F=I&&I.toUpperCase();return R||_[I]||n[I]||_[F].replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g,function(z,O,j){return O||j.slice(1)})})).match(r),C=x.length,E=0;E-1)return new Date((K==="X"?1e3:1)*U);var ae=m(K)(U),H=ae.year,X=ae.month,oe=ae.day,pe=ae.hours,J=ae.minutes,Z=ae.seconds,ne=ae.milliseconds,le=ae.zone,se=ae.week,te=new Date,de=oe||(H||X?1:te.getDate()),be=H||te.getFullYear(),Pe=0;H&&!X||(Pe=X>0?X-1:te.getMonth());var ze,Qe=pe||0,qe=J||0,$e=Z||0,he=ne||0;return le?new Date(Date.UTC(be,Pe,de,Qe,qe,$e,he+60*le.offset*1e3)):$?new Date(Date.UTC(be,Pe,de,Qe,qe,$e,he)):(ze=new Date(be,Pe,de,Qe,qe,$e,he),se&&(ze=q(ze).week(se).toDate()),ze)}catch{return new Date("")}}(A,L,S,_),this.init(),F&&F!==!0&&(this.$L=this.locale(F).$L),I&&A!=this.format(L)&&(this.$d=new Date("")),s={}}else if(L instanceof Array)for(var z=L.length,O=1;O<=z;O+=1){D[1]=L[O-1];var j=_.apply(this,D);if(j.isValid()){this.$d=j.$d,this.$L=j.$L,this.init();break}O===z&&(this.$d=new Date(""))}else C.call(this,E)}}})})(iH);var fge=iH.exports;const HA=pa(fge);var aH={exports:{}};(function(e,t){(function(n,r){e.exports=r()})(Ml,function(){return function(n,r,o){var i=r.prototype,a=function(d){return d&&(d.indexOf?d:d.s)},l=function(d,f,p,v,m){var y=d.name?d:d.$locale(),g=a(y[f]),_=a(y[p]),x=g||_.map(function(E){return E.slice(0,v)});if(!m)return x;var C=y.weekStart;return x.map(function(E,A){return x[(A+(C||0))%7]})},s=function(){return o.Ls[o.locale()]},u=function(d,f){return d.formats[f]||function(p){return p.replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g,function(v,m,y){return m||y.slice(1)})}(d.formats[f.toUpperCase()])},c=function(){var d=this;return{months:function(f){return f?f.format("MMMM"):l(d,"months")},monthsShort:function(f){return f?f.format("MMM"):l(d,"monthsShort","months",3)},firstDayOfWeek:function(){return d.$locale().weekStart||0},weekdays:function(f){return f?f.format("dddd"):l(d,"weekdays")},weekdaysMin:function(f){return f?f.format("dd"):l(d,"weekdaysMin","weekdays",2)},weekdaysShort:function(f){return f?f.format("ddd"):l(d,"weekdaysShort","weekdays",3)},longDateFormat:function(f){return u(d.$locale(),f)},meridiem:this.$locale().meridiem,ordinal:this.$locale().ordinal}};i.localeData=function(){return c.bind(this)()},o.localeData=function(){var d=s();return{firstDayOfWeek:function(){return d.weekStart||0},weekdays:function(){return o.weekdays()},weekdaysShort:function(){return o.weekdaysShort()},weekdaysMin:function(){return o.weekdaysMin()},months:function(){return o.months()},monthsShort:function(){return o.monthsShort()},longDateFormat:function(f){return u(d,f)},meridiem:d.meridiem,ordinal:d.ordinal}},o.months=function(){return l(s(),"months")},o.monthsShort=function(){return l(s(),"monthsShort","months",3)},o.weekdays=function(d){return l(s(),"weekdays",null,null,d)},o.weekdaysShort=function(d){return l(s(),"weekdaysShort","weekdays",3,d)},o.weekdaysMin=function(d){return l(s(),"weekdaysMin","weekdays",2,d)}}})})(aH);var pge=aH.exports;const lH=pa(pge);var sH={exports:{}};(function(e,t){(function(n,r){e.exports=r()})(Ml,function(){return function(n,r){var o=r.prototype,i=o.format;o.format=function(a){var l=this,s=this.$locale();if(!this.isValid())return i.bind(this)(a);var u=this.$utils(),c=(a||"YYYY-MM-DDTHH:mm:ssZ").replace(/\[([^\]]+)]|Q|wo|ww|w|WW|W|zzz|z|gggg|GGGG|Do|X|x|k{1,2}|S/g,function(d){switch(d){case"Q":return Math.ceil((l.$M+1)/3);case"Do":return s.ordinal(l.$D);case"gggg":return l.weekYear();case"GGGG":return l.isoWeekYear();case"wo":return s.ordinal(l.week(),"W");case"w":case"ww":return u.s(l.week(),d==="w"?1:2,"0");case"W":case"WW":return u.s(l.isoWeek(),d==="W"?1:2,"0");case"k":case"kk":return u.s(String(l.$H===0?24:l.$H),d==="k"?1:2,"0");case"X":return Math.floor(l.$d.getTime()/1e3);case"x":return l.$d.getTime();case"z":return"["+l.offsetName()+"]";case"zzz":return"["+l.offsetName("long")+"]";default:return d}});return i.bind(this)(c)}}})})(sH);var hge=sH.exports;const vge=pa(hge);var uH={exports:{}};(function(e,t){(function(n,r){e.exports=r()})(Ml,function(){var n="week",r="year";return function(o,i,a){var l=i.prototype;l.week=function(s){if(s===void 0&&(s=null),s!==null)return this.add(7*(s-this.week()),"day");var u=this.$locale().yearStart||1;if(this.month()===11&&this.date()>25){var c=a(this).startOf(r).add(1,r).date(u),d=a(this).endOf(n);if(c.isBefore(d))return 1}var f=a(this).startOf(r).date(u).startOf(n).subtract(1,"millisecond"),p=this.diff(f,n,!0);return p<0?a(this).startOf("week").week():Math.ceil(p)},l.weeks=function(s){return s===void 0&&(s=null),this.week(s)}}})})(uH);var mge=uH.exports;const gge=pa(mge);var cH={exports:{}};(function(e,t){(function(n,r){e.exports=r()})(Ml,function(){return function(n,r){r.prototype.weekYear=function(){var o=this.month(),i=this.week(),a=this.year();return i===1&&o===11?a+1:o===0&&i>=52?a-1:a}}})})(cH);var yge=cH.exports;const _ge=pa(yge);var dH={exports:{}};(function(e,t){(function(n,r){e.exports=r()})(Ml,function(){return function(n,r,o){r.prototype.dayOfYear=function(i){var a=Math.round((o(this).startOf("day")-o(this).startOf("year"))/864e5)+1;return i==null?a:this.add(i-a,"day")}}})})(dH);var bge=dH.exports;const wge=pa(bge);var fH={exports:{}};(function(e,t){(function(n,r){e.exports=r()})(Ml,function(){return function(n,r){r.prototype.isSameOrAfter=function(o,i){return this.isSame(o,i)||this.isAfter(o,i)}}})})(fH);var xge=fH.exports;const Cge=pa(xge);var pH={exports:{}};(function(e,t){(function(n,r){e.exports=r()})(Ml,function(){return function(n,r){r.prototype.isSameOrBefore=function(o,i){return this.isSame(o,i)||this.isBefore(o,i)}}})})(pH);var Ege=pH.exports;const Age=pa(Ege);var _D=Number.isNaN||function(t){return typeof t=="number"&&t!==t};function Sge(e,t){return!!(e===t||_D(e)&&_D(t))}function kge(e,t){if(e.length!==t.length)return!1;for(var n=0;n!0},ms=z4({}),Dge=e=>(ms[e]||(ms[e]=z4([])),ms[e]),Nge=(e,t)=>{const n=ms[t]||[],r=n.findIndex(a=>a.id===e),o=n[r];let i;return r>0&&(i=n[r-1]),{current:o,prev:i}},Fge=(e,t)=>{const{prev:n}=Nge(e,t);return n?n.vm.exposed.bottom.value:0},Rge=(e,t,n)=>(ms[n]||[]).findIndex(r=>r.id===e)>0?16:t,Pge=["id"],Bge=["innerHTML"];var Lge=ee({name:"ElMessage",__name:"message",props:Mge,emits:Oge,setup(e,{expose:t,emit:n}){const{Close:r}=wme,o=e,i=n,a=ue(!1),{ns:l,zIndex:s}=sge("message"),{currentZIndex:u,nextZIndex:c}=s,d=ue(),f=ue(!1),p=ue(0);let v;const m=G(()=>o.type?o.type==="error"?"danger":o.type:"info"),y=G(()=>{const F=o.type;return{[l.bm("icon",F)]:F&&fD[F]}}),g=G(()=>o.icon||fD[o.type]||""),_=G(()=>o.placement||qh),x=G(()=>Fge(o.id,_.value)),C=G(()=>Math.max(Rge(o.id,o.offset,_.value)+x.value,o.offset)),E=G(()=>p.value+C.value),A=G(()=>_.value.includes("left")?l.is("left"):_.value.includes("right")?l.is("right"):l.is("center")),S=G(()=>_.value.startsWith("top")?"top":"bottom"),D=G(()=>({[S.value]:`${C.value}px`,zIndex:u.value}));function L(){o.duration!==0&&({stop:v}=Kee(()=>{R()},o.duration))}function M(){v==null||v()}function R(){f.value=!1,yt(()=>{var F;a.value||((F=o.onClose)==null||F.call(o),i("destroy"))})}function I(F){d0e(F)===mx.esc&&R()}return nn(()=>{L(),c(),f.value=!0}),Xe(()=>o.repeatNum,()=>{M(),L()}),Yee(document,"keydown",I),Xee(d,()=>{p.value=d.value.getBoundingClientRect().height}),t({visible:f,bottom:E,close:R}),(F,z)=>(N(),we(Yr,{name:w(l).b("fade"),onBeforeEnter:z[0]||(z[0]=O=>a.value=!0),onBeforeLeave:e.onClose,onAfterLeave:z[1]||(z[1]=O=>F.$emit("destroy")),persisted:""},{default:Q(()=>[Ft(B("div",{id:e.id,ref_key:"messageRef",ref:d,class:ie([w(l).b(),{[w(l).m(e.type)]:e.type},w(l).is("closable",e.showClose),w(l).is("plain",e.plain),w(l).is("bottom",S.value==="bottom"),A.value,e.customClass]),style:wt(D.value),role:"alert",onMouseenter:M,onMouseleave:L},[e.repeatNum>1?(N(),we(w(lge),{key:0,value:e.repeatNum,type:m.value,class:ie(w(l).e("badge"))},null,8,["value","type","class"])):_e("v-if",!0),g.value?(N(),we(w(pD),{key:1,class:ie([w(l).e("icon"),y.value])},{default:Q(()=>[(N(),we(cn(g.value)))]),_:1},8,["class"])):_e("v-if",!0),Ze(F.$slots,"default",{},()=>[e.dangerouslyUseHTMLString?(N(),V(ot,{key:1},[_e(" Caution here, message could've been compromised, never use user's input as message "),B("p",{class:ie(w(l).e("content")),innerHTML:e.message},null,10,Bge)],2112)):(N(),V("p",{key:0,class:ie(w(l).e("content"))},Re(e.message),3))]),e.showClose?(N(),we(w(pD),{key:2,class:ie(w(l).e("closeBtn")),onClick:kt(R,["stop"])},{default:Q(()=>[Y(w(r))]),_:1},8,["class"])):_e("v-if",!0)],46,Pge),[[Zt,f.value]])]),_:3},8,["name","onBeforeLeave"]))}}),Ige=Lge;let $ge=1;const zge=e=>{if(!e.appendTo)e.appendTo=document.body;else if(K0(e.appendTo)){let t=document.querySelector(e.appendTo);u0e(t)||(C1("ElMessage","the appendTo option is not an HTMLElement. Falling back to document.body."),t=document.body),e.appendTo=t}},Vge=e=>{!e.placement&&K0(Ji.placement)&&Ji.placement&&(e.placement=Ji.placement),e.placement||(e.placement=qh),vH.includes(e.placement)||(C1("ElMessage",`Invalid placement: ${e.placement}. Falling back to '${qh}'.`),e.placement=qh)},mH=e=>{const t=!e||K0(e)||Sr(e)||J_(e)?{message:e}:e,n={...ki,...t};return zge(n),Vge(n),xw(Ji.grouping)&&!n.grouping&&(n.grouping=Ji.grouping),Jf(Ji.duration)&&n.duration===3e3&&(n.duration=Ji.duration),Jf(Ji.offset)&&n.offset===16&&(n.offset=Ji.offset),xw(Ji.showClose)&&!n.showClose&&(n.showClose=Ji.showClose),xw(Ji.plain)&&!n.plain&&(n.plain=Ji.plain),n},Hge=e=>{const t=ms[e.props.placement||qh],n=t.indexOf(e);if(n===-1)return;t.splice(n,1);const{handler:r}=e;r.close()},jge=({appendTo:e,...t},n)=>{const r=`message_${$ge++}`,o=t.onClose,i=document.createElement("div"),a={...t,id:r,onClose:()=>{o==null||o(),Hge(u)},onDestroy:()=>{rc(null,i)}},l=Y(Ige,a,J_(a.message)||Sr(a.message)?{default:J_(a.message)?a.message:()=>a.message}:null);l.appContext=n||tp._context,rc(l,i),e.appendChild(i.firstElementChild);const s=l.component,u={id:r,vnode:l,vm:s,handler:{close:()=>{s.exposed.close()}},props:l.component.props};return u},tp=(e={},t)=>{if(!gp)return{close:()=>{}};const n=mH(e),r=Dge(n.placement||qh);if(n.grouping&&r.length){const i=r.find(({vnode:a})=>{var l;return((l=a.props)==null?void 0:l.message)===n.message});if(i)return i.props.repeatNum+=1,i.props.type=n.type,i.handler}if(Jf(Ji.max)&&r.length>=Ji.max)return{close:()=>{}};const o=jge(n,t);return r.push(o),o.handler};hH.forEach(e=>{tp[e]=(t={},n)=>tp({...mH(t),type:e},n)});function Wge(e){for(const t in ms)if(Z_(ms,t)){const n=[...ms[t]];for(const r of n)(!e||e===r.props.type)&&r.handler.close()}}function Uge(e){ms[e]&&[...ms[e]].forEach(t=>t.handler.close())}tp.closeAll=Wge;tp.closeAllByPlacement=Uge;tp._context=null;const Kge=pme(tp,"$message");/*! + * @form-create/element-ui v3.2.41 + * (c) 2018-2026 xaboy + * Github https://github.com/xaboy/form-create + * Released under the MIT License. + */function bD(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(o){return Object.getOwnPropertyDescriptor(e,o).enumerable})),n.push.apply(n,r)}return n}function tn(e){for(var t=1;t"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch{return!1}}function Xge(e){if(e===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function Qge(e,t){if(t&&(typeof t=="object"||typeof t=="function"))return t;if(t!==void 0)throw new TypeError("Derived constructors may only return object or undefined");return Xge(e)}function Zge(e){var t=qge();return function(){var r=cb(e),o;if(t){var i=cb(this).constructor;o=Reflect.construct(r,arguments,i)}else o=r.apply(this,arguments);return Qge(this,o)}}function Jge(e,t){return t1e(e)||r1e(e,t)||gH(e,t)||i1e()}function nr(e){return e1e(e)||n1e(e)||gH(e)||o1e()}function e1e(e){if(Array.isArray(e))return Jx(e)}function t1e(e){if(Array.isArray(e))return e}function n1e(e){if(typeof Symbol<"u"&&e[Symbol.iterator]!=null||e["@@iterator"]!=null)return Array.from(e)}function r1e(e,t){var n=e==null?null:typeof Symbol<"u"&&e[Symbol.iterator]||e["@@iterator"];if(n!=null){var r=[],o=!0,i=!1,a,l;try{for(n=n.call(e);!(o=(a=n.next()).done)&&(r.push(a.value),!(t&&r.length===t));o=!0);}catch(s){i=!0,l=s}finally{try{!o&&n.return!=null&&n.return()}finally{if(i)throw l}}return r}}function gH(e,t){if(e){if(typeof e=="string")return Jx(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if(n==="Object"&&e.constructor&&(n=e.constructor.name),n==="Map"||n==="Set")return Array.from(e);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return Jx(e,t)}}function Jx(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n-1?[]:[e]}var a1e="fcCheckbox",l1e=ee({name:a1e,inheritAttrs:!1,props:{formCreateInject:Object,modelValue:{type:Array,default:function(){return[]}},type:String,options:Array,input:Boolean,inputValue:String},emits:["update:modelValue","fc.el"],setup:function(t,n){var r=Pn(t.formCreateInject,"options",[]),o=Pn(t,"options"),i=Pn(t,"modelValue"),a=Pn(t,"inputValue",""),l=ue(a.value),s=Pn(t,"input",!1),u=function(p){var v=nr(ka(i.value)),m=v.indexOf(l.value);l.value=p,m>-1&&(v.splice(m,1),v.push(p),d(v))};Xe(a,function(f){if(!s.value){l.value=f;return}u(f)});var c=G(function(){var f=r.value||[];return o.value&&(f=o.value||[]),Array.isArray(f)?f:[]});Xe(i,function(f){var p=null;if(!a.value&&f!=null&&Array.isArray(f)&&f.length>0&&s.value){var v=c.value.map(function(m){return m.value});f.forEach(function(m){v.indexOf(m)===-1&&(p=m)})}p!=null&&(l.value=p)},{immediate:!0});var d=function(p){n.emit("update:modelValue",p)};return{options:c,value:i,onInput:d,updateCustomValue:u,makeInput:function(p){if(s.value)return Y(p,{value:l.value||void 0,label:l.value||void 0},{default:function(){return[Y(Ee("ElInput"),{size:"small",modelValue:l.value,"onUpdate:modelValue":u},null)]}})}}},render:function(){var t,n,r=this,o=this.type==="button"?"ElCheckboxButton":"ElCheckbox",i=Ee(o);return Y(Ee("ElCheckboxGroup"),Gt(this.$attrs,{modelValue:this.value===null?void 0:this.value,"onUpdate:modelValue":this.onInput,ref:"el"}),tn({default:function(){return[r.options.map(function(l,s){var u=tn({},l),c=u.value,d=u.label;return delete u.value,delete u.label,Y(i,Gt(u,{label:c,value:c,key:o+s+"-"+c}),{default:function(){return[d||c||""]}})}),(t=(n=r.$slots).default)===null||t===void 0?void 0:t.call(n),r.makeInput(i)]}},jA(this.$slots,["default"])))},mounted:function(){this.$emit("fc.el",this.$refs.el)}});function yH(e){e=e||new Map;var t={$on:function(r,o){var i=e.get(r),a=i&&i.push(o);a||e.set(r,[o])},$once:function(r,o){o._once=!0,t.$on(r,o)},$off:function(r,o){var i=e.get(r);i&&i.splice(i.indexOf(o)>>>0,1)},$emit:function(r){for(var o=arguments.length,i=new Array(o>1?o-1:0),a=1;a"u")){var r=document.head||document.getElementsByTagName("head")[0],o=document.createElement("style");o.type="text/css",n==="top"&&r.firstChild?r.insertBefore(o,r.firstChild):r.appendChild(o),o.styleSheet?o.styleSheet.cssText=e:o.appendChild(document.createTextNode(e))}}var s1e="._fc-frame ._fc-files img{display:inline-block;height:100%;vertical-align:top;width:100%}._fc-frame ._fc-upload-btn{border:1px dashed #c0ccda;cursor:pointer}._fc-frame._fc-disabled ._fc-upload-btn,._fc-frame._fc-disabled .el-button{color:#999;cursor:not-allowed!important}._fc-frame ._fc-upload-cover{background:rgba(0,0,0,.6);bottom:0;left:0;opacity:0;position:absolute;right:0;top:0;-webkit-transition:opacity .3s;-o-transition:opacity .3s;transition:opacity .3s}._fc-frame ._fc-upload-cover i{color:#fff;cursor:pointer;font-size:20px;margin:0 2px}._fc-frame ._fc-files:hover ._fc-upload-cover{opacity:1}._fc-frame .el-upload{display:block}._fc-frame ._fc-upload-icon{cursor:pointer}._fc-files,._fc-frame ._fc-upload-btn{background:#fff;border:1px solid #c0ccda;border-radius:4px;-webkit-box-shadow:2px 2px 5px rgba(0,0,0,.1);box-shadow:2px 2px 5px rgba(0,0,0,.1);-webkit-box-sizing:border-box;box-sizing:border-box;display:inline-block;height:58px;line-height:58px;margin-right:4px;overflow:hidden;position:relative;text-align:center;width:58px}";E6(s1e);var _H={name:"IconCircleClose"},u1e={class:"icon",viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},c1e=B("path",{fill:"currentColor",d:"M466.752 512l-90.496-90.496a32 32 0 0145.248-45.248L512 466.752l90.496-90.496a32 32 0 1145.248 45.248L557.248 512l90.496 90.496a32 32 0 11-45.248 45.248L512 557.248l-90.496 90.496a32 32 0 01-45.248-45.248L466.752 512z"},null,-1),d1e=B("path",{fill:"currentColor",d:"M512 896a384 384 0 100-768 384 384 0 000 768zm0 64a448 448 0 110-896 448 448 0 010 896z"},null,-1),f1e=[c1e,d1e];function p1e(e,t,n,r,o,i){return N(),V("svg",u1e,f1e)}_H.render=p1e;var bH={name:"IconDocument"},h1e={class:"icon",viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},v1e=B("path",{fill:"currentColor",d:"M832 384H576V128H192v768h640V384zm-26.496-64L640 154.496V320h165.504zM160 64h480l256 256v608a32 32 0 01-32 32H160a32 32 0 01-32-32V96a32 32 0 0132-32zm160 448h384v64H320v-64zm0-192h160v64H320v-64zm0 384h384v64H320v-64z"},null,-1),m1e=[v1e];function g1e(e,t,n,r,o,i){return N(),V("svg",h1e,m1e)}bH.render=g1e;var wH={name:"IconDelete"},y1e={class:"icon",viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},_1e=B("path",{fill:"currentColor",d:"M160 256H96a32 32 0 010-64h256V95.936a32 32 0 0132-32h256a32 32 0 0132 32V192h256a32 32 0 110 64h-64v672a32 32 0 01-32 32H192a32 32 0 01-32-32V256zm448-64v-64H416v64h192zM224 896h576V256H224v640zm192-128a32 32 0 01-32-32V416a32 32 0 0164 0v320a32 32 0 01-32 32zm192 0a32 32 0 01-32-32V416a32 32 0 0164 0v320a32 32 0 01-32 32z"},null,-1),b1e=[_1e];function w1e(e,t,n,r,o,i){return N(),V("svg",y1e,b1e)}wH.render=w1e;var xH={name:"IconView"},x1e={class:"icon",viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},C1e=B("path",{fill:"currentColor",d:"M512 160c320 0 512 352 512 352S832 864 512 864 0 512 0 512s192-352 512-352zm0 64c-225.28 0-384.128 208.064-436.8 288 52.608 79.872 211.456 288 436.8 288 225.28 0 384.128-208.064 436.8-288-52.608-79.872-211.456-288-436.8-288zm0 64a224 224 0 110 448 224 224 0 010-448zm0 64a160.192 160.192 0 00-160 160c0 88.192 71.744 160 160 160s160-71.808 160-160-71.744-160-160-160z"},null,-1),E1e=[C1e];function A1e(e,t,n,r,o,i){return N(),V("svg",x1e,E1e)}xH.render=A1e;var CH={name:"IconFolderOpened"},S1e={class:"icon",viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},k1e=B("path",{fill:"currentColor",d:"M878.08 448H241.92l-96 384h636.16l96-384zM832 384v-64H485.76L357.504 192H128v448l57.92-231.744A32 32 0 01216.96 384H832zm-24.96 512H96a32 32 0 01-32-32V160a32 32 0 0132-32h287.872l128.384 128H864a32 32 0 0132 32v96h23.04a32 32 0 0131.04 39.744l-112 448A32 32 0 01807.04 896z"},null,-1),T1e=[k1e];function M1e(e,t,n,r,o,i){return N(),V("svg",S1e,T1e)}CH.render=M1e;var O1e="fcFrame",D1e=ee({name:O1e,props:{type:{type:String,default:"input"},field:String,helper:{type:Boolean,default:!0},disabled:{type:Boolean,default:!1},src:{type:String,required:!0},icon:{type:String,default:"IconFolderOpened"},width:{type:String,default:"500px"},height:{type:String,default:"370px"},maxLength:{type:Number,default:0},okBtnText:{type:String,default:""},closeBtnText:{type:String,default:""},modalTitle:String,handleIcon:{type:[String,Boolean],default:void 0},title:String,allowRemove:{type:Boolean,default:!0},onOpen:{type:Function,default:function(){}},onOk:{type:Function,default:function(){}},onCancel:{type:Function,default:function(){}},onLoad:{type:Function,default:function(){}},onBeforeRemove:{type:Function,default:function(){}},onRemove:{type:Function,default:function(){}},onHandle:Function,modal:{type:Object,default:function(){return{}}},srcKey:[String,Number],modelValue:[Array,String,Number,Object],previewMask:void 0,footer:{type:Boolean,default:!0},reload:{type:Boolean,default:!0},closeBtn:{type:Boolean,default:!0},okBtn:{type:Boolean,default:!0},formCreateInject:Object},emits:["update:modelValue","change"],components:{IconFolderOpened:CH,IconView:xH},data:function(){return{fileList:ka(this.modelValue),previewVisible:!1,frameVisible:!1,previewImage:"",bus:new yH}},watch:{modelValue:function(t){this.fileList=ka(t)}},methods:{close:function(){this.closeModel(!0)},closeModel:function(t){this.bus.$emit(t?"$close":"$ok"),this.reload&&(this.bus.$off("$ok"),this.bus.$off("$close")),this.frameVisible=!1},handleCancel:function(){this.previewVisible=!1},showModel:function(){this.disabled||this.onOpen()===!1||(this.frameVisible=!0)},input:function(){var t=this.fileList,n=this.maxLength===1?t[0]||"":t;this.$emit("update:modelValue",n),this.$emit("change",n)},makeInput:function(){var t=this;return Y(Ee("ElInput"),Gt({type:"text",modelValue:this.fileList.map(function(n){return t.getSrc(n)}).toString(),readonly:!0},{key:1}),{append:function(){return Y(Ee("ElButton"),{icon:Ee(t.icon),onClick:function(){return t.showModel()}},null)},suffix:function(){return t.fileList.length&&!t.disabled?Y(Ee("ElIcon"),{class:"el-input__icon _fc-upload-icon",onClick:function(){t.fileList=[],t.input()}},{default:function(){return[Y(_H,null,null)]}}):null}})},makeGroup:function(t){return(!this.maxLength||this.fileList.length0},Function:function(t){var n=this.getType(t);return n==="Function"||n==="AsyncFunction"},getType:function(t){var n=Object.prototype.toString.call(t);return/^\[object (.*)\]$/.exec(n)[1]},empty:function(t){return t==null||Array.isArray(t)&&Array.isArray(t)&&!t.length?!0:typeof t=="string"&&!t}};["Date","Object","String","Boolean","Array","Number"].forEach(function(e){Pt[e]=function(t){return Pt.type(t,e)}});function fo(e,t){return{}.hasOwnProperty.call(e,t)}var R1e="fcSelect",EH=ee({name:R1e,inheritAttrs:!1,props:{formCreateInject:Object,modelValue:{type:[Array,String,Number,Boolean,Object],default:void 0},type:String},emits:["update:modelValue","fc.el"],setup:function(t,n){var r=n.emit,o=Pn(t.formCreateInject,"options",[]),i=Pn(t,"modelValue"),a=G(function(){return Array.isArray(o.value)?o.value:[]}),l=function(u){r("update:modelValue",u)};return{options:a,value:i,handleUpdate:l,hasProperty:fo,is:Pt}},mounted:function(){this.$emit("fc.el",this.$refs.el)}});function P1e(e,t,n,r,o,i){var a=Ee("el-option"),l=Ee("el-option-group"),s=Ee("el-select");return N(),we(s,Gt(e.$attrs,{"model-value":e.value,"onUpdate:modelValue":e.handleUpdate,ref:"el"}),{default:Q(function(){return[(N(!0),V(ot,null,Mt(e.options,function(u,c){return N(),V(ot,null,[e.hasProperty(u,"options")?(N(),we(l,{label:u.label,key:"".concat(c,"-").concat(u.label)},{default:Q(function(){return[(N(!0),V(ot,null,Mt(e.is.trueArray(u.options)?u.options:[],function(d,f){return N(),we(a,Gt({key:"".concat(f,"-").concat(d.value)},d),null,16)}),128))]}),_:2},1032,["label"])):(N(),we(a,Gt(wo({key:1},"key","".concat(c,"-").concat(u.value)),u),null,16))],64)}),256)),Ze(e.$slots,"default")]}),_:3},16,["model-value","onUpdate:modelValue"])}EH.render=P1e;var B1e="fcTree",L1e=ee({name:B1e,inheritAttrs:!1,formCreateParser:{mergeProp:function(t){var n=t.prop.props;n.nodeKey||(n.nodeKey="id"),n.props||(n.props={label:"title"})}},props:{type:String,modelValue:{type:[Array,String,Number],default:function(){return[]}}},emits:["update:modelValue","fc.el"],watch:{modelValue:function(){this.setValue()}},methods:{updateValue:function(){if(this.$refs.tree){var t;this.type==="selected"?t=this.$refs.tree.getCurrentKey():t=this.$refs.tree.getCheckedKeys(),this.$emit("update:modelValue",t)}},setValue:function(){if(this.$refs.tree){var t=this.type;t==="selected"?this.$refs.tree.setCurrentKey(this.modelValue):this.$refs.tree.setCheckedKeys(ka(this.modelValue))}}},render:function(){return Y(Ee("ElTree"),Gt(this.$attrs,{ref:"tree",onCheck:this.updateValue,onNodeClick:this.updateValue}),this.$slots)},mounted:function(){this.setValue(),this.$emit("fc.el",this.$refs.tree)}}),I1e="._fc-upload{width:100%}._fc-exceed .el-upload{display:none}.el-upload-list.is-disabled .el-upload{cursor:not-allowed!important}";E6(I1e);var AH={name:"IconUpload"},$1e={class:"icon",viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},z1e=B("path",{fill:"currentColor",d:"M160 832h704a32 32 0 110 64H160a32 32 0 110-64zm384-578.304V704h-64V247.296L237.248 490.048 192 444.8 508.8 128l316.8 316.8-45.312 45.248L544 253.696z"},null,-1),V1e=[z1e];function H1e(e,t,n,r,o,i){return N(),V("svg",$1e,V1e)}AH.render=H1e;function wD(e,t){return hr(e)==="object"?e:{url:e,is_string:!0,name:j1e(e),uid:t}}function xD(e){return tn(tn({},e),{},{file:e,value:e})}function j1e(e){return(""+e).split("/").pop()}var W1e="fcUpload",U1e=ee({name:W1e,inheritAttrs:!1,formCreateParser:{toFormValue:function(t){return ka(t)},toValue:function(t,n){return n.prop.props.limit===1?t[0]||"":t}},props:{previewMask:void 0,onPreview:Function,httpRequest:Function,modalTitle:String,listType:String,uploadText:String,formCreateInject:Object,modelValue:[Array,String,Object]},emits:["update:modelValue","change","remove","fc.el"],data:function(){return{previewVisible:!1,previewImage:"",fileList:[]}},created:function(){this.fileList=ka(this.modelValue).map(wD).map(xD)},watch:{modelValue:function(t){this.fileList=ka(t).map(wD).map(xD)}},methods:{handlePreview:function(t){this.onPreview?this.onPreview.apply(this,arguments):this.listType==="text"?window.open(t.url):(this.previewImage=t.url,this.previewVisible=!0)},update:function(t){var n=t.map(function(r){return r.is_string?r.url:r.value||r.url}).filter(function(r){return r!==void 0});this.$emit("update:modelValue",n)},handleCancel:function(){this.previewVisible=!1},handleChange:function(t,n){this.$emit.apply(this,["change"].concat(Array.prototype.slice.call(arguments))),t.status==="success"&&this.update(n)},handleRemove:function(t,n){this.$emit.apply(this,["remove"].concat(Array.prototype.slice.call(arguments))),this.update(n)},doHttpRequest:function(t){if(this.httpRequest)return this.httpRequest(t);t.source="upload",this.formCreateInject.api.fetch(t)}},render:function(){var t,n,r=this,o=ka(this.modelValue).length;return Y("div",{class:"_fc-upload"},[Y(Ee("ElUpload"),Gt({key:o},this.$attrs,{listType:this.listType||"picture-card",class:{"_fc-exceed":this.$attrs.limit?this.$attrs.limit<=o:!1},onPreview:this.handlePreview,onChange:this.handleChange,onRemove:this.handleRemove,httpRequest:this.doHttpRequest,fileList:this.fileList,ref:"upload"}),tn({default:function(){return[((t=(n=r.$slots).default)===null||t===void 0?void 0:t.call(n))||(["text","picture"].indexOf(r.listType)===-1?Y(Ee("ElIcon"),null,{default:function(){return[Y(AH,null,null)]}}):Y(Ee("ElButton"),{type:"primary"},{default:function(){return[r.formCreateInject.t("clickToUpload")||r.uploadText||"点击上传"]}}))]}},jA(this.$slots,["default"]))),Y(Ee("ElDialog"),{appendToBody:!0,modal:this.previewMask,title:this.modalTitle,modelValue:this.previewVisible,onClose:this.handleCancel},{default:function(){return[Y("img",{style:"width: 100%",src:r.previewImage},null)]}})])},mounted:function(){this.$emit("fc.el",this.$refs.upload)}});function bl(e,t,n){e[t]=n}function sf(e,t){delete e[t]}function T1(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},n=arguments.length>2?arguments[2]:void 0,r=!1;for(var o in t)if(Object.prototype.hasOwnProperty.call(t,o)){var i=t[o];if((r=Array.isArray(i))||Pt.Object(i)){var a=e[o]===void 0;if(r)r=!1,a&&bl(e,o,[]);else if(i._clone&&n!==void 0)if(n)i=i.getRule(),a&&bl(e,o,{});else{bl(e,o,i._clone());continue}else a&&bl(e,o,{});e[o]=T1(e[o],i,n)}else bl(e,o,i),Pt.Undef(i)||(Pt.Undef(i.__json)||(e[o].__json=i.__json),Pt.Undef(i.__origin)||(e[o].__origin=i.__origin))}return n!==void 0&&Array.isArray(e)?e.filter(function(l){return!l||!l.__ctrl}):e}function tu(e){return T1({},{value:e}).value}var K1e=Object.assign||function(e){for(var t,n=1;n4){var n=e.trim(),r=!1;try{if(n.indexOf(nC)>0&&n.indexOf(tC)===0)n=n.replace(nC,"").replace(tC,""),r=!0;else if(n.indexOf("$FN:")===0)n=n.substring(4),r=!0;else if(n.indexOf("$EXEC:")===0)n=n.substring(6),r=!0;else if(n.indexOf("$GLOBAL:")===0){var o=n.substring(8);return n=function(){for(var l=arguments.length,s=new Array(l),u=0;u0&&this.expandRule(n)},modelValue:{handler:function(t){var n=this;t=t||[];var r=this.sort,o=r.length,i=o-t.length;if(i<0){for(var a=i;a<0;a++)this.addRule(t.length+a,!0);for(var l=0;l0)for(var s=0;s0,i=tthis.min&&i.push(this.delIcon(n,r)),this.sortBtn){var a=this.sortIcon(n,t);a&&i.push.apply(i,nr(a))}return i},expandRule:function(t){for(var n=0;n0&&this.expandRule(t)},render:function(){var t=this,n=this.sort,r=this.button,o=this.form,i=this.disabled,a=this.type==="card",l=n.length===0?this.$slots.default?this.$slots.default({vm:this,add:this.add}):Y("div",{key:"a_def",class:"_fc-group-plus-minus _fc-group-add fc-clock",onClick:this.add},null):n.map(function(s,u){var c=t.cacheRule[s],d=c.rule,f=c.options,p=r&&!i?t.makeIcon(n.length,u,s):[],v=t.getTitle(u,s);return a?Y("div",{class:"_fc-group-container",key:s},[Y("div",{class:"_fc-group-header"},[v===!1?Y("div",{class:"_fc-group-idx"},[u+1]):null,v!==!1?Y("div",{class:"_fc-group-title"},[v]):null,Y("div",{class:"_fc-group-handle fc-clock"},[p.length?p:null])]),Y("div",{class:"_fc-group-content"},[Y(o,Gt({key:s},tn(tn({},t.$attrs),{},{disabled:i,"onUpdate:modelValue":function(y){return t.formData(s,y)},"onUpdate:api":function(y){return t.add$f(u,s,y)},inFor:!0,modelValue:t.field?wo({},t.field,t._value(t.modelValue[u])):t.modelValue[u],rule:d,option:f,extendOption:!0})),null)])]):Y("div",{class:"_fc-group-container",key:s},[Y(o,Gt({key:s},tn(tn({},t.$attrs),{},{disabled:i,"onUpdate:modelValue":function(y){return t.formData(s,y)},"onUpdate:api":function(y){return t.add$f(u,s,y)},inFor:!0,modelValue:t.field?wo({},t.field,t._value(t.modelValue[u])):t.modelValue[u],rule:d,option:f,extendOption:!0})),null),Y("div",{class:"_fc-group-idx"},[u+1]),p.length?Y("div",{class:"_fc-group-handle fc-clock"},[p]):null])});return Y("div",{key:"con",class:"_fc-group "+(i?"_fc-group-disabled":"")+(a?" _fc-group-card":"")},[l])}}),J1e="fcSubForm",e2e=ee({name:J1e,props:{rule:Array,options:{type:Object,default:function(){return gn({submitBtn:!1,resetBtn:!1})}},modelValue:{type:Object,default:function(){return{}}},disabled:{type:Boolean,default:!1},syncDisabled:{type:Boolean,default:!0},formCreateInject:Object},data:function(){return{cacheValue:{},subApi:{},form:eo(this.formCreateInject.form.$form())}},emits:["fc:subform","update:modelValue","change","itemMounted"],watch:{modelValue:function(t){this.setValue(t)}},methods:{formData:function(t){this.cacheValue=JSON.stringify(t),this.$emit("update:modelValue",t),this.$emit("change",t)},setValue:function(t){var n=JSON.stringify(t);this.cacheValue!==n&&(this.cacheValue=n,this.subApi.coverValue(t||{}))},add$f:function(t){var n=this;this.subApi=t,yt(function(){n.$emit("itemMounted",t)})}},render:function(){var t=this.form;return Y(t,{disabled:this.disabled,"onUpdate:modelValue":this.formData,modelValue:this.modelValue,"onUpdate:api":this.add$f,rule:this.rule,option:this.options,extendOption:!0},null)}}),OH={name:"IconWarning"},t2e={class:"icon",viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},n2e=B("path",{fill:"currentColor",d:"M512 64a448 448 0 110 896 448 448 0 010-896zm0 832a384 384 0 000-768 384 384 0 000 768zm48-176a48 48 0 11-96 0 48 48 0 0196 0zm-48-464a32 32 0 0132 32v288a32 32 0 01-64 0V288a32 32 0 0132-32z"},null,-1),r2e=[n2e];function o2e(e,t,n,r,o,i){return N(),V("svg",t2e,r2e)}OH.render=o2e;var i2e=[l1e,D1e,F1e,EH,L1e,U1e,Z1e,e2e,OH],DH=["props"],NH=["class","style","directives"],FH=["on","hook"],Zc=function e(t){var n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},o=[].concat(DH,nr(r.normal||[])),i=[].concat(NH,nr(r.array||[])),a=[].concat(FH,nr(r.functional||[])),l=r.props||[];return t.reduce(function(s,u){for(var c in u)if(s[c])if(l.indexOf(c)>-1)s[c]=e([u[c]],s[c]);else if(o.indexOf(c)>-1)s[c]=tn(tn({},s[c]),u[c]);else if(i.indexOf(c)>-1){var d=s[c]instanceof Array?s[c]:[s[c]],f=u[c]instanceof Array?u[c]:[u[c]];s[c]=[].concat(nr(d),nr(f))}else if(a.indexOf(c)>-1)for(var p in u[c])if(s[c][p]){var v=s[c][p]instanceof Array?s[c][p]:[s[c][p]],m=u[c][p]instanceof Array?u[c][p]:[u[c][p]];s[c][p]=[].concat(nr(v),nr(m))}else s[c][p]=u[c][p];else if(c==="hook")for(var y in u[c])s[c][y]?s[c][y]=a2e(s[c][y],u[c][y]):s[c][y]=u[c][y];else s[c]=u[c];else o.indexOf(c)>-1||a.indexOf(c)>-1||l.indexOf(c)>-1?s[c]=tn({},u[c]):i.indexOf(c)>-1?s[c]=u[c]instanceof Array?nr(u[c]):hr(u[c])==="object"?tn({},u[c]):u[c]:s[c]=u[c];return s},n)},a2e=function(t,n){return function(){t&&t.apply(this,arguments),n&&n.apply(this,arguments)}},rC=["type","slot","ignore","emitPrefix","value","name","native","hidden","display","inject","options","emit","link","prefix","suffix","update","sync","optionsTo","key","slotUpdate","computed","preview","component","cache","modelEmit"],fb=["validate","children","control"],pb=["effect","deep","renderSlots"];function RH(){return[].concat(rC,nr(DH),nr(NH),nr(FH),fb,pb)}function Ta(e){var t=e.replace(/(-[a-z])/g,function(n){return n.replace("-","").toLocaleUpperCase()});return PH(t)}function PH(e){return e.replace(e[0],e[0].toLowerCase())}function oC(e,t){return{value:e,enumerable:!1,configurable:!1,writable:!0}}function BH(e,t){return LH([e],t||!1)[0]}function LH(e,t){return T1([],nr(e),t||!1)}function Xu(e,t){return Zc(Array.isArray(t)?t:[t],e,{array:fb,normal:pb}),e}function CD(e){var t=Pt.Function(e.getRule)?e.getRule():e;return t.type||(t.type="input"),t}function l2e(e,t){return e?(Object.keys(t||{}).forEach(function(n){t[n]&&(e[n]=Xu(e[n]||{},t[n]))}),e):t}function IH(e,t){Object.defineProperties(e,Object.keys(t).reduce(function(n,r){return n[r]={get:function(){return t[r]()}},n},{}))}function Iu(e){return e.__fc__||(e.__origin__?e.__origin__.__fc__:null)}function Jn(e,t){try{t=e()}catch(n){q1e(n)}return t}function B2(){var e={},t=function(r){return r||"default"};return{setSlot:function(r,o){r=t(r),!(!o||Array.isArray(o)&&o.length)&&(e[r]||(e[r]=[]),e[r].push(o))},getSlot:function(r,o){r=t(r);var i=[];return(e[r]||[]).forEach(function(a){if(Array.isArray(a))i.push.apply(i,nr(a));else if(Pt.Function(a)){var l=a.apply(void 0,nr(o||[]));Array.isArray(l)?i.push.apply(i,nr(l)):i.push(l)}else Pt.Undef(a)||i.push(a)}),i},getSlots:function(){var r=this,o={};return Object.keys(e).forEach(function(i){o[i]=function(){for(var a=arguments.length,l=new Array(a),s=0;s0&&(n=Ta(n));var r="on".concat(kH(n));Array.isArray(t[r])?t[r]=[].concat(nr(t[r]),[e.on[n]]):t[r]?t[r]=[t[r],e.on[n]]:t[r]=e.on[n]}),t.key=e.key,t.ref=e.ref,t.class=e.class,t.id=e.id,t.style=e.style,t.slot&&delete t.slot,t}function L2(e,t){return Object.setPrototypeOf(e,t),e}var AD=function(t,n){return typeof t=="string"?String(n):typeof t=="number"?Number(n):n},Vf={"==":function(t,n){return JSON.stringify(t)===JSON.stringify(AD(t,n))},"!=":function(t,n){return!Vf["=="](t,n)},">":function(t,n){return t>n},">=":function(t,n){return t>=n},"<":function(t,n){return t-1},notOn:function(t,n){return!Vf.on(t,n)},in:function(t,n){return n&&n.indexOf&&n.indexOf(t)>-1},notIn:function(t,n){return!Vf.in(t,n)},between:function(t,n){return t>n[0]&&tn[1]},empty:function(t){return Pt.empty(t)},notEmpty:function(t){return!Pt.empty(t)},pattern:function(t,n){return new RegExp(n,"g").test(t)}};function ea(e,t){return(Array.isArray(t)?t:(t||"").split(".")).forEach(function(n){e!=null&&(e=e[n])}),e}function s2e(e){for(var t=/{{\s*(.*?)\s*}}/g,n,r={};(n=t.exec(e))!==null;)n[1]&&(r[n[1]]=!0);return Object.keys(r)}function SD(e){var t=e.split("."),n=[],r="";return t.forEach(function(o,i){i===0?r=o:r+="."+o,n.push(r)}),n.join(" && ")}function $H(e){for(var t=[],n="",r=0,o=0;o-1&&M.splice(R,1)}else L.subForm()},x=null;f1(function(){Oa(function(){var D="",L=o.option&&o.option.globalClass||{};Object.keys(L).forEach(function(M){var R="";L[M].style&&Object.keys(L[M].style).forEach(function(I){R+=Lg(I)+":"+L[M].style[I]+";"}),L[M].content&&(R+=L[M].content+";"),R&&(D+=".".concat(M,"{").concat(R,"}"))}),o.option&&o.option.style&&(D+=o.option.style),x||(x=document.createElement("style"),x.type="text/css",document.head.appendChild(x)),x.innerHTML=D||""})});var C=sd(function(){v.bus.$emit("$loadData.$topForm")},100),E=sd(function(){v.bus.$emit("$loadData.$scopeForm")},100),A=sd(function(){v.bus.$emit("$loadData.$form")},100),S=function(L){v.bus.$emit("change-$form."+L)};return nn(function(){a&&(m.top.bus.$on("$loadData.$form",C),m.top.bus.$on("change",S)),m!==m.scope&&m.scope.bus.$on("$loadData.$scopeForm",E),v.mounted()}),Tr(function(){a&&(m.top.bus.$off("$loadData.$form",C),m.top.bus.$off("change",S)),m!==m.scope&&m.scope.bus.$off("$loadData.$scopeForm",E),_(),p.destroyed=!0,v.unmount(),x&&(x.parentNode||x.parentElement)&&document.head.removeChild(x)}),pu(function(){v.updated()}),g(),Xe(function(){return o.option},function(){v.initOptions(),m.refresh()},{deep:!0,flush:"sync"}),Xe(function(){return nr(u.value)},function(D){v.$handle.isBreakWatch()||D.length===p.renderRule.length&&D.every(function(L){return p.renderRule.indexOf(L)>-1})||(v.$handle.updateAppendData(),v.$handle.reloadRule(u.value),i.setupState.renderRule())}),Xe(function(){return[o.disabled,o.preview]},function(){m.refresh()}),Xe(c,function(D){Ig(D||{})!==p.updateValue&&(m.config.forceCoverValue?m.coverValue(D||{}):m.setValue(D||{}))},{deep:!0,flush:"post"}),Xe(function(){return o.index},function(){m.coverValue({}),v.$handle.updateAppendData(),yt(function(){yt(function(){m.clearValidateState()})})},{flush:"sync"}),tn(tn({fc:eo(v),parent:a&&eo(a),top:eo(l),fapi:eo(m)},Kr(p)),{},{getGroupInject:function(){return Jy(i,a)},refresh:function(){++p.unique},renderRule:function(){p.renderRule=nr(u.value||[])},updateValue:function(L){if(!p.destroyed){var M=Ig(L);p.updateValue!==M&&(p.updateValue=M,i.emit("update:modelValue",L),yt(function(){A(),a?d.value||E():(C(),E())}))}}})},created:function(){var o=Wt();o.emit("update:api",o.setupState.fapi),o.setupState.fc.init()}})}function zH(){return{props:{},on:{},options:[],children:[],hidden:!1,display:!0,value:void 0}}function Li(e,t){return function(n,r,o){var i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{},a=new UA(e,n,r,o,i);return t&&(Pt.Function(t)?t(a):a.props(t)),a}}function UA(e,t,n,r,o){this._data=Mn(zH(),{type:e,title:t,field:n,value:r,props:o||{}}),this.event=this.on}Mn(UA.prototype,{getRule:function(){return this._data},setProp:function(t,n){return bl(this._data,t,n),this},modelField:function(t){return this._data.modelField=t,this},_clone:function(){var t=new this.constructor;return t._data=BH(this._data),t}});function VH(e){e.forEach(function(t){UA.prototype[t]=function(n){return Xu(this._data,wo({},t,arguments.length<2?n:wo({},n,arguments[1]))),this}})}VH(RH());var c2e=Li("");function d2e(e,t,n){var r=c2e("",t);return r._data.type=e,r._data.title=n,r}function f2e(){return{create:d2e,factory:Li}}function p2e(e,t,n){var r="fail to ".concat(e," ").concat(n.status,"'"),o=new Error(r);return o.status=n.status,o.url=e,o}function kD(e){var t=e.responseText||e.response;if(!t)return t;try{return JSON.parse(t)}catch{return t}}function HH(e){if(!(typeof XMLHttpRequest>"u")){var t=new XMLHttpRequest,n=e.action||"";if(t.upload&&e.onProgress&&t.upload.addEventListener("progress",function(l){l.percent=l.total>0?l.loaded/l.total*100:0,e.onProgress(l)}),e.query){var r=Pt.String(e.query)?e.query:Object.keys(e.query).reduce(function(l,s){return l[s]=e.query[s]===null||e.query[s]===void 0?"":e.query[s],l},{}),o=new URLSearchParams(r).toString();o&&(n.includes("?")?n+="&".concat(o):n+="?".concat(o))}t.onerror=function(s){e.onError(s)},t.onload=function(){if(t.status<200||t.status>=300)return e.onError(p2e(n,e,t),kD(t));e.onSuccess(kD(t))},t.open(e.method||"get",n,!0);var i;(e.data||e.file)&&(e.file||(e.dataType||"").toLowerCase()!=="json"?(i=new FormData,Object.keys(e.data||{}).map(function(l){i.append(l,e.data[l])})):(i=JSON.stringify(e.data||{}),t.setRequestHeader("content-type","application/json"))),e.file&&i.append(e.filename,e.file,e.file.name),e.withCredentials&&"withCredentials"in t&&(t.withCredentials=!0);var a=e.headers||{};Object.keys(a).forEach(function(l){a[l]!=null&&t.setRequestHeader(l,a[l])}),t.send(i)}}function TD(e,t,n){return new Promise(function(r,o){(t||HH)(tn(tn({},e),{},{onSuccess:function(a){var l=function(c){return c},s=lu(e.parse);Pt.Function(s)?l=s:s&&Pt.String(s)&&(l=function(c){return ea(c,s)}),db(l(a,e.targetRule,n)).then(function(u){r(u)})},onError:function(a){o(a)}}))})}function em(e){return tu(e)}function h2e(e){function t(i){return Pt.Undef(i)?i=e.fields():Array.isArray(i)||(i=[i]),i}function n(i,a,l){Pt.Undef(i)?i=Object.keys(tn(tn({},e.fieldCtx),e.nameCtx)):Array.isArray(i)||(i=[i]),i.forEach(function(s){var u=e.fieldCtx[s]||e.nameCtx[s];u&&u.forEach(function(c){bl(c.rule,a,l),e.$render.clearCache(c)})})}function r(){var i=e.subForm;return Object.keys(i).reduce(function(a,l){var s=i[l];return s&&(Array.isArray(s)?a.push.apply(a,nr(s)):a.push(s)),a},[])}var o={get isScope(){return e.vm.props.subForm===!1},get isPreview(){return e.preview},get config(){return e.options},set config(i){e.fc.options.value=i},get options(){return e.options},set options(i){e.fc.options.value=i},get form(){return e.form},get rule(){return e.rules},get parent(){return e.vm.setupState.parent&&e.vm.setupState.parent.setupState.fapi},get top(){return o.parent?o.parent.top:o},get scope(){for(var i=e.vm;i&&i.setupState.fapi;)if(i.props.subForm)i=i.setupState.parent;else return i.setupState.fapi;return o.top},get children(){return r()},get siblings(){var i=e.vm.setupState.getGroupInject();if(i){var a=i.getSubForm();if(Array.isArray(a))return nr(a)}},get index(){var i=o.siblings;if(i){var a=i.indexOf(o);return a>-1?a:void 0}},get formulas(){return tn({},e.fc.formulas)},formData:function(a){if(a==null||typeof a=="boolean"){var l={};return Object.keys(e.form).forEach(function(s){(a===!0||e.ignoreFields.indexOf(s)===-1)&&(l[s]=em(e.form[s]))}),l}else return t(a).reduce(function(s,u){return s[u]=o.getValue(u),s},{})},getValue:function(a){var l=e.getFieldCtx(a);return l?em(l.rule.value):e.options.appendValue!==!1&&fo(e.appendData,a)?em(e.appendData[a]):void 0},coverValue:function(a){var l=tn({},a||{});e.deferSyncValue(function(){e.appendData={},o.fields().forEach(function(s){var u=e.fieldCtx[s];if(u){var c=fo(a,s);u.forEach(function(d){d.rule.value=c?a[s]:void 0}),delete l[s]}}),Mn(e.appendData,l)},!0)},setValue:function(a){var l=a;arguments.length>=2&&(l=wo({},a,arguments[1])),e.deferSyncValue(function(){Object.keys(l).forEach(function(s){var u=e.fieldCtx[s];if(!u)return e.appendData[s]=l[s];u.forEach(function(c){c.rule.value=l[s]})})},!0)},removeField:function(a){var l=e.getCtx(a);return e.deferSyncValue(function(){e.getCtxs(a).forEach(function(s){s.rm()})},!0),l?l.origin:void 0},removeRule:function(a){var l=a&&Iu(a);if(l)return l.rm(),l.origin},fields:function(){return e.fields()},append:function(a,l,s){var u=e.sort.length-1,c,d=e.getCtx(l);if(d)if(s){if(c=d.getPending("children",d.rule.children),!Array.isArray(c))return;u=d.rule.children.length-1}else u=d.root.indexOf(d.origin),c=d.root;else c=e.rules;c.splice(u+1,0,a)},prepend:function(a,l,s){var u=0,c,d=e.getCtx(l);if(d)if(s){if(c=d.getPending("children",d.rule.children),!Array.isArray(c))return}else u=d.root.indexOf(d.origin),c=d.root;else c=e.rules;c.splice(u,0,a)},hidden:function(a,l){n(l,"hidden",!!a),e.refresh()},hiddenStatus:function(a){var l=e.getCtx(a);if(l)return!!l.rule.hidden},display:function(a,l){n(l,"display",!!a),e.refresh()},displayStatus:function(a){var l=e.getCtx(a);if(l)return!!l.rule.display},disabled:function(a,l){t(l).forEach(function(s){e.getCtxs(s).forEach(function(u){bl(u.rule.props,"disabled",!!a)})}),e.refresh()},all:function(a){return Object.keys(e.ctxs).map(function(l){var s=e.ctxs[l];return a?s.origin:s.rule})},model:function(a){return e.fields().reduce(function(l,s){var u=e.fieldCtx[s][0];return l[s]=a?u.origin:u.rule,l},{})},component:function(a){return Object.keys(e.nameCtx).reduce(function(l,s){var u=e.nameCtx[s].map(function(c){return a?c.origin:c.rule});return l[s]=u.length===1?u[0]:u,l},{})},bind:function(){return o.form},reload:function(a){e.reloadRule(a)},updateOptions:function(a){e.fc.updateOptions(a),o.refresh()},onSubmit:function(a){o.updateOptions({onSubmit:a})},sync:function(a){if(Array.isArray(a)){a.forEach(function(s){return o.sync(s)});return}var l=Pt.Object(a)?Iu(a):e.getCtxs(a);l&&(l=Array.isArray(l)?l:[l],l.forEach(function(s){if(!s.deleted){var u=e.subForm[s.id];u&&(Array.isArray(u)?u.forEach(function(c){c.refresh()}):u&&u.refresh()),e.$render.clearCache(s)}}),e.refresh())},refresh:function(){r().forEach(function(a){a.refresh()}),e.$render.clearCacheAll(),e.refresh()},refreshOptions:function(){e.$manager.updateOptions(e.options),o.refresh()},hideForm:function(a){e.vm.setupState.isShow=!a},changeStatus:function(){return e.changeStatus},clearChangeStatus:function(){e.changeStatus=!1},updateRule:function(a,l){e.getCtxs(a).forEach(function(s){Mn(s.rule,l)})},updateRules:function(a){Object.keys(a).forEach(function(l){o.updateRule(l,a[l])})},mergeRule:function(a,l){e.getCtxs(a).forEach(function(s){Xu(s.rule,l)})},mergeRules:function(a){Object.keys(a).forEach(function(l){o.mergeRule(l,a[l])})},getRule:function(a,l){var s=e.getCtx(a);if(s)return l?s.origin:s.rule},findType:function(a,l){var s=void 0;return Object.keys(e.ctxs).forEach(function(u){var c=e.ctxs[u];c.rule.type===a&&(s=l?c.origin:c.rule)}),s},findTypes:function(a,l){var s=[];return Object.keys(e.ctxs).forEach(function(u){var c=e.ctxs[u];c.rule.type===a&&s.push(l?c.origin:c.rule)}),s},getRenderRule:function(a){var l=e.getCtx(a);if(l)return l.prop},getRefRule:function(a){var l=e.getCtxs(a);if(l){var s=l.map(function(u){return u.rule});return s.length===1?s[0]:s}},setEffect:function(a,l,s){var u=e.getCtx(a);u&&l&&(l[0]==="$"&&(l=l.substr(1)),fo(u.rule,"$"+l)&&bl(u.rule,"$"+l,s),fo(u.rule,"effect")||(u.rule.effect={}),bl(u.rule.effect,l,s))},clearEffectData:function(a,l){var s=e.getCtx(a);s&&(l&&l[0]==="$"&&(l=l.substr(1)),s.clearEffectData(l),o.sync(a))},updateValidate:function(a,l,s){s?o.mergeRule(a,{validate:l}):n(a,"validate",l)},updateValidates:function(a,l){Object.keys(a).forEach(function(s){o.updateValidate(s,a[s],l)})},refreshValidate:function(){o.refresh()},resetFields:function(a){t(a).forEach(function(l){e.getCtxs(l).forEach(function(s){e.$render.clearCache(s),s.rule.value=em(s.defaultValue)})}),yt(function(){yt(function(){yt(function(){o.clearValidateState(a)})})}),a==null&&(Pt.Function(e.options.onReset)&&Jn(function(){return e.options.onReset(o)}),e.vm.emit("reset",o))},method:function(a,l){var s=o.el(a);if(!s||!s[l])throw new Error(TH("err","".concat(l," 方法不存在")));return function(){return s[l].apply(s,arguments)}},exec:function(a,l){for(var s=arguments.length,u=new Array(s>2?s-2:0),c=2;c2?u-2:0),d=2;d1?u-1:0),d=1;d1?s-1:0),c=1;c-1&&n.indexOf("}}")>-1){var a=n,l=s2e(n),s=function(f){var p=!1,v;if(o&&f.indexOf("$form.")===0){var m=f.split(".");m.shift(),fo(o.value,m[0])&&(p=!0,v=r?r({id:"$form."+m[0]+"_"+o.rule.__fc__.id,getValue:function(){return ea(o.value,m)}}):ea(o.value,m))}return p||(v=r?r(f):i.fc.getLoadData(f)),v},u=function d(f){var p=[];f.forEach(function(m){m.key?p.push(m.key):m.children&&p.push(d(m.children))});var v=!1;return p.forEach(function(m,y){m!=null&&(m.indexOf("'")===0||m.indexOf('"')===0)&&(p[y]=m.slice(1,-1),v=!0)}),p.length===1&&(v||!isNaN(Number(p[0])))?p[0]:s(p.join("."))},c;if(l.forEach(function(d){var f=d.split("||"),p=f[0].trim();if(p){var v=(f[1]||"").trim(),m=$H(p),y=Jn(function(){return u(m)});(y==null||y==="")&&f.length>1&&(y=v),c=y,n=n.replaceAll("{{".concat(d,"}}"),y??"")}}),l.length===1&&a==="{{".concat(l[0],"}}"))return c}return n},loadFetchVar:function(n,r,o){var i=this,a;o&&o.__fc__&&(a=o.__fc__.getParentGroup()),!a&&n.targetRule&&n.targetRule.__fc__&&(a=n.targetRule.__fc__.getParentGroup());var l=function(u){return i.loadStrVar(u,r,a?{rule:o,value:i.subRuleData[a.id]||{}}:null)};return n.action=l(n.action||""),["headers","data","query"].forEach(function(s){if(n[s]){var u=Array.isArray(n[s])?[]:{};Object.keys(n[s]).forEach(function(c){u[l(c)]=l(n[s][c])}),n[s]=u}}),n}})}var MD=["hook:updated","hook:mounted"];function _2e(e){Mn(e.prototype,{usePage:function(){var n=this,r=this.options.page;if(r){var o=25,i=b2e(this.rules);Pt.Object(r)&&(r.first&&(o=parseInt(r.first,10)||o),r.limit&&(i=parseInt(r.limit,10)||i)),Mn(this,{first:o,limit:i,pageEnd:this.rules.length<=o}),this.bus.$on("page-end",function(){return n.vm.emit("page-end",n.api)}),this.pageLoad()}},pageLoad:function(){var n=this,r=function o(){n.pageEnd?(n.bus.$off(MD,o),n.bus.$emit("page-end")):(n.first+=n.limit,n.pageEnd=n.rules.length<=n.first,n.loadRule(),n.refresh())};this.bus.$on(MD,r)}})}function b2e(e){return e.length<31?31:Math.ceil(e.length/3)}function w2e(e){Mn(e.prototype,{clearNextTick:function(){this.nextTick&&clearTimeout(this.nextTick),this.nextTick=null},bindNextTick:function(n){var r=this;this.clearNextTick(),this.nextTick=setTimeout(function(){n(),r.nextTick=null},10)},render:function(){return++this.loadedId,this.vm.setupState.unique>0?this.$render.render():(this.vm.setupState.unique=1,[])}})}function x2e(e){Object.defineProperties(e.origin,{__fc__:oC(eo(e))}),e.rule!==e.origin&&Object.defineProperties(e.rule,{__fc__:oC(eo(e))})}function jH(e,t,n){var r=A6(),o=!!t.field;Mn(this,{id:r,ref:r,wrapRef:r+"fi",rule:t,origin:t.__origin__||t,name:t.name,pending:{},none:!1,watch:[],linkOn:[],root:[],ctrlRule:[],children:[],parent:null,group:t.subRule?this:null,cacheConfig:null,prop:tn({},t),computed:{},payload:{},refRule:{},input:o,el:void 0,exportEl:void 0,defaultValue:o?tu(n):void 0,field:t.field||void 0}),this.updateKey(),x2e(this),this.update(e,!0)}Mn(jH.prototype,{getParentGroup:function(){for(var t=this.parent;t;){if(t.group)return t;t=t.parent}},loadChildrenPending:function(){var t=this,n=this.rule.children||[];return Array.isArray(n)?n:this.loadPending({key:"children",origin:n,def:[],onLoad:function(o){t.$handle&&t.$handle.loadChildren(o,t)},onUpdate:function(o,i){t.$handle&&(o===i?t.$handle.loadChildren(o,t):t.$handle.updateChildren(t,o,i))},onReload:function(o){t.$handle?t.$handle.updateChildren(t,[],o):delete t.pending.children}})},loadPending:function(t){var n=this,r=t.key,o=t.origin,i=t.def,a=t.onLoad,l=t.onReload,s=t.onUpdate;if(this.pending[r]&&this.pending[r].origin===o)return this.getPending(r,i);delete this.pending[r];var u=o;if(Pt.Function(o)){var c=Jn(function(){return o({rule:n.rule,api:n.$api,update:function(f){var p=f||i,v=n.getPending(r,i);n.setPending(r,o,p),s&&s(p,v)},reload:function(){var f=n.getPending(r,i);delete n.pending[r],l&&l(f),n.$api&&n.$api.sync(n.rule)}})});c&&Pt.Function(c.then)?(c.then(function(d){var f=d||i;n.setPending(r,o,f),a&&a(f),n.$api&&n.$api.sync(n.rule)}).catch(function(d){console.error(d)}),u=i,this.setPending(r,o,u)):(u=c||i,this.setPending(r,o,u),a&&a(u))}return u},getPending:function(t,n){return this.pending[t]&&this.pending[t].value||n},setPending:function(t,n,r){this.pending[t]={origin:n,value:gn(r)}},effectData:function(t){return this.payload[t]||(this.payload[t]={}),this.payload[t]},clearEffectData:function(t){t===void 0?this.payload={}:delete this.payload[t]},updateKey:function(t){this.key=A6(),t&&this.parent&&this.parent.updateKey(t)},updateType:function(){this.originType=this.rule.type,this.type=Ta(this.rule.type),this.trueType=this.$handle.getType(this.originType)},setParser:function(t){this.parser=t,t.init(this)},initProp:function(){var t=this,n,r,o,i=tn({},this.rule);delete i.children,delete i.validate,this.prop=Xu({},[i].concat(nr(Object.keys(this.payload).map(function(a){return t.payload[a]})),[this.computed])),i.col&&((n=i.col)===null||n===void 0?void 0:n.show)!==!1&&(this.prop.col.show=!0),this.prop.validate=[].concat(nr(((r=this.refRule)===null||r===void 0||(o=r.__$validate)===null||o===void 0?void 0:o.value)||[]),nr(this.prop.validate||[]))},initNone:function(){this.none=!(Pt.Undef(this.prop.display)||this.prop.display)},hasHidden:function(){return!!this.rule.hidden||(this.parent?this.parent.hasHidden():!1)},injectValidate:function(){return this.prop.validate},check:function(t){return this.vm===t.vm},unwatch:function(){var t=this;this.watch.forEach(function(n){return n()}),this.watch=[],Object.keys(this.refRule).forEach(function(n){n.indexOf("__$")!==0&&delete t.refRule[n]})},unlink:function(){this.linkOn.forEach(function(t){return t()}),this.linkOn=[]},link:function(){this.unlink(),this.$handle.appendLink(this)},watchTo:function(){this.$handle.watchCtx(this)},delete:function(){this.unwatch(),this.unlink(),this.rmCtrl(),this.parent&&this.parent.children.splice(this.parent.children.indexOf(this)>>>0,1),Mn(this,{deleted:!0,computed:{},parent:null,children:[],cacheConfig:null,none:!1})},rmCtrl:function(){this.ctrlRule.forEach(function(t){return t.__fc__&&t.__fc__.rm()}),this.ctrlRule=[]},rm:function(){var t=this,n=function(){var o=t.root.indexOf(t.origin);o>-1&&(t.root.splice(o,1),t.$handle&&t.$handle.refresh())};if(this.deleted){n();return}this.$handle.noWatch(function(){t.$handle.deferSyncValue(function(){t.rmCtrl(),n(),t.$handle.rmCtx(t),Mn(t,{root:[]})},t.input)})},update:function(t,n){Mn(this,{deleted:!1,$handle:t,$render:t.$render,$api:t.api,vm:t.vm,vNode:t.$render.vNode,updated:!1,cacheValue:this.rule.value}),!n&&this.unwatch(),this.watchTo(),this.link(),this.updateType()}});function C2e(e){Mn(e.prototype,{nextRefresh:function(n){var r=this,o=this.loadedId;yt(function(){o===r.loadedId&&(n?n():r.refresh())})},parseRule:function(n){var r=this,o=CD(n);return Object.defineProperties(o,{__origin__:oC(n)}),E2e(o),this.appendValue(o),[o,o.prefix,o.suffix].forEach(function(i){i&&r.loadFn(i,o)}),this.loadCtrl(o),o.update&&(o.update=lu(o.update)),o},loadFn:function(n,r){var o=this;["on","props","deep"].forEach(function(i){n[i]&&o.parseInjectEvent(r,n[i])})},loadCtrl:function(n){n.control&&n.control.forEach(function(r){r.handle&&(r.handle=lu(r.handle))})},syncProp:function(n){var r=this,o=n.rule;Pt.trueArray(o.sync)&&Zc([{on:o.sync.reduce(function(i,a){return i[hr(a)==="object"&&a.event||"update:".concat(a)]=function(l){o.props[hr(a)==="object"&&a.prop||a]=l,r.vm.emit("sync",a,l,o,r.fapi)},i},{})}],n.computed)},loadRule:function(){var n=this;this.cycleLoad=!1,this.loading=!0,this.pageEnd&&this.bus.$emit("load-start"),this.deferSyncValue(function(){if(n._loadRule(n.rules),n.loading=!1,n.cycleLoad&&n.pageEnd)return n.loadRule();n.syncForm(),n.pageEnd&&n.bus.$emit("load-end"),n.vm.setupState.renderRule()})},loadChildren:function(n,r){if(this.cycleLoad=!1,this.loading=!0,this.bus.$emit("load-start"),this._loadRule(n,r),this.loading=!1,this.cycleLoad)return this.loadRule();this.syncForm(),this.bus.$emit("load-end"),this.$render.clearCache(r)},_loadRule:function(n,r){var o=this,i=function s(u){var c=n[u-1];if(!c||!c.__fc__)return u>0?s(u-1):-1;var d=o.sort.indexOf(c.__fc__.id);return d>-1?d:s(u-1)},a=function(u,c){Pt.trueArray(u)&&o._loadRule(u,c)},l=n.map(function(s,u){if(!(r&&!Pt.Object(s))&&!(!o.pageEnd&&!r&&u>=o.first)){if(s.__fc__&&s.__fc__.root===n&&o.ctxs[s.__fc__.id])return a(s.__fc__.loadChildrenPending(),s.__fc__),s.__fc__;var c=CD(s),d=function(){return!!(c.field&&o.fieldCtx[c.field]&&o.fieldCtx[c.field][0]!==s.__fc__)};o.fc.targetFormDriver("loadRule",{rule:c,api:o.api},o.fc),o.ruleEffect(c,"init",{repeat:d()}),d()&&o.vm.emit("repeat-field",s,o.api);var f,p=!1,v=!!s.__fc__,m=c.value;if(v){if(f=s.__fc__,m=f.defaultValue,f.deleted){if(OD(f))return;f.update(o)}else if(!f.check(o)){if(OD(f))return;n[u]=s=s._clone?s._clone():MH(Ig(s)),f=null,p=!0}}if(f)f.originType!==f.rule.type&&f.updateType(),o.bindParser(f),o.appendValue(f.rule),f.parent&&f.parent!==r&&o.rmSubRuleData(f);else{var y=o.parseRule(s);f=new jH(o,y,m),o.bindParser(f)}o.parseEmit(f),o.syncProp(f),f.parent=r||null,f.root=n,o.setCtx(f),!p&&!v&&(o.effect(f,"load"),o.targetHook(f,"load")),o.effect(f,"created");var g=f.loadChildrenPending();if(f.parser.loadChildren===!1||a(g,f),!r){var _=i(u);_>-1||!u?o.sort.splice(_+1,0,f.id):o.sort.push(f.id)}var x=f.rule;return f.updated||(f.updated=!0,Pt.Function(x.update)&&o.bus.$once("load-end",function(){o.refreshUpdate(f,x.value,"init")}),o.effect(f,"loaded")),o.refreshControl(f)&&(o.cycleLoad=!0),f}}).filter(function(s){return!!s});r&&(r.children=l)},refreshControl:function(n){return n.input&&n.rule.control&&this.useCtrl(n)},useCtrl:function(n){var r=this,o=A2e(n),i=[],a=this.api;if(!o.length)return!1;for(var l=function(p){var v=o[p],m=v.handle||function(g){return(Vf[v.condition||"=="]||Vf["=="])(g,v.value)};if(!Pt.trueArray(v.rule))return"continue";var y=tn(tn({},v),{},{valid:Jn(function(){return m(n.rule.value,a)}),ctrl:S2e(n,v.rule),isHidden:Pt.String(v.rule[0])});if(y.valid&&y.ctrl||!y.valid&&!y.ctrl&&!y.isHidden)return"continue";i.push(y)},s=0;s>>0,1),c[v?"push":"unshift"](function(){C==="disabled"||C==="enabled"?r.api.disabled(!v,m):C==="display"||C==="show"?r.api.display(v,m):C==="required"?(m.forEach(function(S){r.api.setEffect(S,"required",v)}),v||r.api.clearValidateState(m)):r.api.hidden(!v,m)});return}if(v){d=!0;var E={type:"fragment",native:!0,__ctrl:!0,children:m};n.ctrlRule.push(E),r.bus.$once("load-start",function(){y?a.prepend(E,y,_):g||_?a.append(E,g||n.id,_):n.root.splice(n.root.indexOf(n.origin)+1,0,E)})}else{n.ctrlRule.splice(n.ctrlRule.indexOf(x),1);var A=Iu(x);A&&A.rm()}})}),c.length&&(this.loading?c.length&&this.bus.$once("load-end",function(){c.forEach(function(f){return f()})}):c.length&&yt(function(){c.forEach(function(f){return f()})})),this.vm.emit("control",n.origin,this.api),this.effect(n,"control"),d},reloadRule:function(n){return this._reloadRule(n)},_reloadRule:function(n){var r=this;n||(n=this.rules);var o=tn({},this.ctxs);this.clearNextTick(),this.initData(n),this.fc.rules=n,this.deferSyncValue(function(){r.bus.$once("load-end",function(){Object.keys(o).filter(function(i){return r.ctxs[i]===void 0}).forEach(function(i){return r.rmCtx(o[i])}),r.$render.clearCacheAll()}),r.reloading=!0,r.loadRule(),r.reloading=!1,r.refresh(),r.bus.$emit("reloading",r.api)}),this.bus.$off("next-tick",this.nextReload),this.bus.$once("next-tick",this.nextReload),this.bus.$emit("update",this.api)},refresh:function(){this.vm.setupState.refresh()}})}function E2e(e){var t=zH();return Object.keys(t).forEach(function(n){fo(e,n)||(e[n]=t[n])}),e}function A2e(e){var t=e.rule.control||[];return Pt.Object(t)?[t]:t}function S2e(e,t){for(var n=0;n>>0,1).length>0;return a.length||delete this[i][r],l},getFieldCtx:function(n){return(this.fieldCtx[n]||[])[0]},getNameCtx:function(n){return this.nameCtx[n]||[]},setCtx:function(n){var r=n.id,o=n.field,i=n.name,a=n.rule;this.ctxs[r]=n,i&&this.setIdCtx(n,i,"name"),n.input&&(this.setIdCtx(n,o,"field"),this.setFormData(n,n.parser.toFormValue(a.value,n)),this.isMounted&&!this.reloading&&this.vm.emit("change",n.field,a.value,n.origin,this.api,!1,!0))},getParser:function(n){var r=this.fc.parsers,o=this.fc.renderDriver;if(o){var i=o.parsers||{},a=i[n.originType]||i[Ta(n.type)]||i[n.trueType];if(a)return a}return r[n.originType]||r[Ta(n.type)]||r[n.trueType]||wm},bindParser:function(n){n.setParser(this.getParser(n))},getType:function(n){var r=this.fc.CreateNode.aliasMap,o=r[n]||r[Ta(n)]||n;return Ta(o)},noWatch:function(n){this.noWatchFn||(this.noWatchFn=n),Jn(n),this.noWatchFn===n&&(this.noWatchFn=null)},watchCtx:function(n){var r=this,o=RH();if(o.filter(function(a){return a[0]!=="_"&&a[0]!=="$"&&T2e.indexOf(a)===-1}).forEach(function(a){var l=Pn(n.rule,a),s=a==="children";n.refRule[a]=l,n.watch.push(Xe(s?function(){return Pt.Function(l.value)?l.value:nr(l.value||[])}:function(){return l.value},function(u,c){var d=l.value;if(!r.isBreakWatch()){if(s&&n.parser.loadChildren===!1){r.$render.clearCache(n),r.nextRefresh();return}if(r.watching=!0,yt(function(){r.targetHook(n,"watch",{key:a,oldValue:c,newValue:d})}),a==="hidden"&&!!d!=!!c&&(r.$render.clearCacheAll(),yt(function(){r.targetHook(n,"hidden",{value:d})})),a==="ignore"&&n.input||a==="hidden"&&(n.rule.ignore==="hidden"||r.options.ignoreHiddenFields))r.syncForm();else if(a==="link"){n.link();return}else["props","on","deep"].indexOf(a)>-1?(r.parseInjectEvent(n.rule,d||{}),a==="props"&&n.input&&r.setFormData(n,n.parser.toFormValue(n.rule.value,n))):a==="emit"?r.parseEmit(n):["prefix","suffix"].indexOf(a)>-1?d&&r.loadFn(d,n.rule):a==="type"?(n.updateType(),r.bindParser(n)):s&&(Pt.Function(c)&&(c=n.getPending("children",[])),Pt.Function(d)&&(d=n.loadChildrenPending()),r.updateChildren(n,d,c));r.$render.clearCache(n),r.refresh(),r.watching=!1}},{deep:!s}))}),n.refRule.__$title=G(function(){var a=(hr(n.rule.title)==="object"?n.rule.title.title:n.rule.title)||"";if(a){var l=a.match(/^\{\{\s*\$t\.(.+)\s*\}\}$/);l&&(a=r.api.t(l[1]))}return a}),n.refRule.__$info=G(function(){var a=(hr(n.rule.info)==="object"?n.rule.info.info:n.rule.info)||"";if(a){var l=a.match(/^\{\{\s*\$t\.(.+)\s*\}\}$/);l&&(a=r.api.t(l[1]))}return a}),n.refRule.__$validate=G(function(){var a=function(s){var u=s.match(/^\{\{\s*\$t\.(.+)\s*\}\}$/);if(u){var c,d;return r.api.t(u[1],{title:(c=n.refRule)===null||c===void 0||(d=c.__$title)===null||d===void 0?void 0:d.value})}return s};return ka(n.rule.validate).map(function(l){var s=tn({},l);if(s.message&&(s.message=a(s.message)),Pt.Function(s.validator)){var u=n;s.validator=function(){for(var d,f=arguments.length,p=new Array(f),v=0;v-1:s.value!==ea(n.rule,l))&&u(s.value),n.watch.push(Xe(s,function(c){c!==tm&&setTimeout(function(){u(c)})},{deep:!0}))}))}),this.watchEffect(n)},adapterValidate:function(n,r){var o=this,i=function(l,s){var u=n.beforeValidate&&Jn(function(){return n.beforeValidate({value:l,api:o.api,validate:n,rule:r.rule})});if(u===!1)s();else{var c=o.validator(r,l,n);if(c){var f="";hr(n.error)==="object"&&(f=n.error[c]||n.error.default),!f&&typeof n.message=="string"&&(f=n.message),f||(f=o.getValidateMessage(r,{key:c,rule:n[c]})),s(f)}else if(n.validator){var d=n.validator&&Jn(function(){return n.validator(l,s)});d&&Pt.Function(d.then)&&d.then(function(){return s()}).catch(function(p){return s(p)})}else s()}};return this.$manager.adapterValidate({required:n.required,message:n.message,trigger:n.trigger},i)},getValidateMessage:function(n,r){var o,i,a,l=Array.isArray(r.rule)?r.rule.join(","):""+r.rule;return this.api.t(r.key==="required"?r.key:"validate."+r.key,(a={},wo(a,r.key,l),wo(a,"title",(o=n.refRule)===null||o===void 0||(i=o.__$title)===null||i===void 0?void 0:i.value),a))},validator:function(n,r,o){var i=this,a=Pt.empty(r);if(a)return o.required?"required":void 0;for(var l=function(){var f=Jge(u[s],2),p=f[0],v=f[1];switch(p){case"len":case"maxLen":case"minLen":var m=function(S){return p==="len"?S===v:p==="maxLen"?S<=v:S>=v};if(Array.isArray(r)){if(!m(r.length))return{v:p}}else{if(hr(r)==="object")return{v:p};if(!m((""+r).length))return{v:p}}break;case"pattern":var y=typeof v=="string"?new RegExp(v):v;if(!y.test(""+r))return{v:p};break;case"uppercase":if(v&&(typeof r!="string"||!/^[A-Z]*$/.test(r)))return{v:p};break;case"lowercase":if(v&&(typeof r!="string"||!/^[a-z]*$/.test(r)))return{v:p};break;case"min":case"max":case"positive":case"negative":case"integer":case"number":var g=Number(r);if(Number.isNaN(g))return{v:p};if(p==="min"&&gv)return{v:p};if(p==="positive"&&g<=0)return{v:p};if(p==="negative"&&g>=0)return{v:p};if(p==="integer"&&!Number.isInteger(g))return{v:p};break;case"equal":if(r!==v)return{v:p};break;case"enum":if(Array.isArray(v)&&!v.includes(r))return{v:p};break;case"hasKeys":if(hr(r)!=="object"||Array.isArray(v)&&v.some(function(A){return!(A in r)}))return{v:p};break;case"email":var _=/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;if(!_.test(""+r))return{v:p};break;case"url":var x=new RegExp("^(?!mailto:)(?:(?:http|https|ftp)://)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?$","i");if(!x.test(""+r))return{v:p};break;case"ip":var C=/^(2(5[0-5]{1}|[0-4]\d{1})|[0-1]?\d{1,2})(\.(2(5[0-5]{1}|[0-4]\d{1})|[0-1]?\d{1,2})){3}$/;if(!C.test(""+r))return{v:p};break;case"phone":var E=/^(?:(?:\+|00)86)?1[3-9]\d{9}$/;if(!E.test(""+r))return{v:p};break;case"computed":if(!i.compute(n,v))return{v:p};break}},s=0,u=Object.entries(o);s-1&&this.sort.splice(u,1),this.$render.clearCache(n),n.delete(),this.effect(n,"deleted"),this.targetHook(n,"deleted"),a&&!this.fieldCtx[i]&&this.vm.emit("remove-field",i,n.rule,this.api),n.rule.__ctrl||this.vm.emit("remove-rule",n.rule,this.api),n}}})}function O2e(e){Mn(e.prototype,{mounted:function(){var n=this,r=function(){n.isMounted=!0,n.lifecycle("mounted")};this.pageEnd?r():this.bus.$once("page-end",r)},lifecycle:function(n){this.fc.targetFormDriver(n,this.api,this.fc),this.vm.emit(n,this.api),this.emitEvent(n,this.api)},emitEvent:function(n){for(var r,o=arguments.length,i=new Array(o>1?o-1:0),a=1;a-1||(i.push(l),o.bus.$on("p:".concat(r||n.name,":").concat(l,":").concat(n.input?1:0),function(s,u){n[s]&&n[s].apply(n,nr(u))}))}),n._used=i},watchEffect:function(n){var r=this,o={required:function(){var a,l;return(fo(n.rule,"$required")?n.rule.$required:(a=n.rule)===null||a===void 0||(l=a.effect)===null||l===void 0?void 0:l.required)||!1}};Object.keys(n.rule.effect||{}).forEach(function(i){o[i]=function(){return n.rule.effect[i]}}),Object.keys(n.rule).forEach(function(i){i[0]==="$"&&(o[i.substr(1)]=function(){return n.rule[i]})}),Object.keys(o).forEach(function(i){n.watch.push(Xe(o[i],function(a){r.effect(n,"watch",wo({},i,a))},{deep:!0}))})},ruleEffect:function(n,r,o){this.emitEffect({rule:n,input:!!n.field,type:this.getType(n.type)},r,o)},effect:function(n,r,o){this.emitEffect({rule:n.rule,input:n.input,type:n.trueType,ctx:n,custom:o},r)},getEffect:function(n,r){if(fo(n,"$"+r))return n["$"+r];if(fo(n,"effect")&&fo(n.effect,r))return n.effect[r]},emitEffect:function(n,r,o){var i=this,a=n.ctx,l=n.rule,s=n.input,u=n.type,c=n.custom;if(!(!u||["fcFragment","fragment"].indexOf(u)>-1)){var d=c||Object.keys(l).reduce(function(f,p){return p[0]==="$"&&(f[p.substr(1)]=l[p]),f},tn({},l.effect||{}));Object.keys(d).forEach(function(f){var p=i.providers[f];if(!(!p||p.input&&!s)){var v;if(!p._c)v="*";else if(p._used.indexOf(u)>-1)v=u;else return;var m=tn({value:d[f],getValue:function(){return i.getEffect(l,f)}},o||{});a&&(m.getProp=function(){return a.effectData(f)},m.clearProp=function(){return a.clearEffectData(f)},m.mergeProp=function(y){return Xu(m.getProp(),[y])},m.id=a.id),i.bus.$emit("p:".concat(f,":").concat(v,":").concat(p.input?1:0),r,[m,l,i.api])}})}}})}function N2e(e){return e.filter(function(t,n,r){return r.indexOf(t,0)===n})}function F2e(e){var t=e.components;if(Array.isArray(t)){var n=N2e(t.filter(function(r){return r!=="*"}));return n.length?n:!1}else return Pt.String(t)?[t]:!1}function _u(e){var t=this;IH(this,{options:function(){return e.options.value||{}},bus:function(){return e.bus},preview:function(){return e.vm.props.preview!=null?e.vm.props.preview:e.vm.setupState.parent&&e.vm.setupState.parent.props.preview!=null?e.vm.setupState.parent.props.preview:e.options.value.preview||!1}}),Mn(this,{fc:e,vm:e.vm,watching:!1,loading:!1,reloading:!1,noWatchFn:null,deferSyncFn:null,isMounted:!1,formData:gn({}),subRuleData:gn({}),subForm:{},form:gn({}),appendData:{},ignoreFields:[],providers:{},cycleLoad:null,loadedId:1,nextTick:null,changeStatus:!1,pageEnd:!0,nextReload:function(){t.lifecycle("reload")}}),this.initData(e.rules),this.$manager=new e.manager(this),this.$render=new KA(this),this.api=e.extendApiFn.reduce(function(n,r){var o=Jn(function(){return r(n,t)});return o&&o!==n&&Mn(n,o),n},h2e(this))}Mn(_u.prototype,{initData:function(t){Mn(this,{ctxs:{},fieldCtx:{},nameCtx:{},sort:[],rules:t})},init:function(){this.updateAppendData(),this.useProvider(),this.usePage(),this.loadRule(),this.$manager.__init(),this.lifecycle("created")},updateAppendData:function(){this.appendData=tn(tn(tn({},tu(this.options.formData||{})),this.fc.vm.props.modelValue||{}),this.appendData)},isBreakWatch:function(){return this.loading||this.noWatchFn||this.reloading},globalBeforeFetch:function(t){var n=this;return new Promise(function(r,o){var i=n.options.beforeFetch&&Jn(function(){return n.options.beforeFetch(t,{api:n.api})});i&&Pt.Function(i.then)?i.then(r).catch(o):r()})},beforeFetch:function(t){var n=this;return new Promise(function(r,o){var i=t&&t.beforeFetch&&Jn(function(){return t.beforeFetch(t,{api:n.api})});i&&Pt.Function(i.then)?i.then(r).catch(o):i===!1?o():r()}).then(function(){return n.globalBeforeFetch(t)})},beforeSubmit:function(t){var n=this;return new Promise(function(r,o){var i=n.options.beforeSubmit&&Jn(function(){return n.options.beforeSubmit(t,{api:n.api})});i&&Pt.Function(i.then)?i.then(r).catch(o):i===!1?o():r()})}});y2e(_u);_2e(_u);w2e(_u);C2e(_u);k2e(_u);M2e(_u);O2e(_u);D2e(_u);var R2e="fcFragment",kw=ee({name:R2e,inheritAttrs:!1,props:["vnode"],render:function(){return this.vnode}});function P2e(e){return Object.keys(e).map(function(t){var n=e[t],r=vd(t);if(r)return[r,n.value,n.arg,n.modifiers]}).filter(function(t){return!!t})}function ND(e,t){var n=e.directives;return n?(Array.isArray(n)||(n=[n]),Ft(t,n.reduce(function(r,o){return r.concat(P2e(o))},[]))):t}function B2e(){var e={};function t(n){this.vm=n.vm,this.handle=n}return Mn(t.prototype,{make:function(r,o,i){return ND(o,this.h(r,ED(o),i))},makeComponent:function(r,o,i){try{return ND(o,Y(r,ED(o),i))}catch(a){return console.error(a),Y("")}},h:function(r,o,i){var a=this.vm||Wt(),l=a.appContext.config.isNativeTag(r),s=this.handle.fc.prop.components[r];!s&&l&&delete o.formCreateInject;try{return Y(s||(l?r:Ee(r)),o,i)}catch(u){return console.error(u),Y("")}},aliasMap:e}),Mn(t,{aliasMap:e,alias:function(r,o){e[r]=o},use:function(r){Object.keys(r).forEach(function(o){var i=Lg(o),a=SH(o).toLocaleLowerCase(),l=r[o];t.alias(o,l),[o,i,a].forEach(function(s){t.prototype[s]=function(u,c){return this.make(e[o]||s,u,c)}})})}}),t}function L2e(e){var t=function(n){Gge(o,n);var r=Zge(o);function o(){return Yge(this,o),r.apply(this,arguments)}return o}(WH);return Object.assign(t.prototype,e),t}function WH(e){Mn(this,{$handle:e,vm:e.vm,options:{},ref:"fcForm",mergeOptionsRule:{normal:["form","row","info","submitBtn","resetBtn"]}}),this.updateKey(),this.init()}Mn(WH.prototype,{__init:function(){var t=this;this.$render=this.$handle.$render,this.$r=function(){var n;return(n=t.$render).renderRule.apply(n,arguments)}},updateKey:function(){this.key=A6()},init:function(){},update:function(){},beforeRender:function(){},form:function(){return this.vm.refs[this.ref]},adapterValidate:function(t,n){return t.validator=function(r,o,i){return n(o,i)},t},getSlot:function(t){var n=function r(o){if(o){var i=o.slots[t];return i||r(o.setupState.parent)}};return n(this.vm)},mergeOptions:function(t,n){var r=this;return Zc(t.map(function(o){return r.tidyOptions(o)}),n,this.mergeOptionsRule)},updateOptions:function(t){this.$handle.fc.targetFormDriver("updateOptions",t,{handle:this.$handle,api:this.$handle.api}),this.options=this.mergeOptions([t],this.getDefaultOptions()),this.update()},tidyOptions:function(t){return t},tidyRule:function(t){},mergeProp:function(t){},getDefaultOptions:function(){return{}},fieldChange:function(t,n,r,o){},render:function(t){}});var I2e=function(t){var n={name:"loadData",_fn:[],loaded:function(o,i,a){var l=this;this.deleted(o),yt(function(){var s=ka(o.getValue()),u=[];s.forEach(function(c){if(c&&(c.attr||c.template)){var d=function(m){var y;i&&i.__fc__&&(y=i.__fc__.getParentGroup());var g;c.template?g=t.$handle.loadStrVar(c.template,m,y?{rule:i,value:t.$handle.subRuleData[y.id]||{}}:null):c.handler&&Pt.Function(c.handler)?g=c.handler(m,i,a):g=t.$handle.loadStrVar("{{".concat(c.attr,"}}"),m,y?{rule:i,value:t.$handle.subRuleData[y.id]||{}}:null),(g==null||g==="")&&c.default!=null&&(g=c.default),c.copy!==!1&&(g=tu(g));var _=c.modify?i:o.getProp();c.to==="child"?_.children?_.children[0]=g:_.children=[g]:xd(_,c.to||"options",g),a.sync(i)},f=function(m){return d(m)},p=t.watchLoadData(f);d=sd(d,c.wait||300),c.watch!==!1?u.push(p):p()}}),l._fn[o.id]=u})},deleted:function(o){this._fn[o.id]&&(this._fn[o.id].forEach(function(i){i()}),delete this._fn[o.id]),o.clearProp()}};return n.watch=n.loaded,n},$2e=function(t){var n={name:"t",_fn:[],loaded:function(o,i,a){this.deleted(o);var l=o.getValue()||{},s=[];Object.keys(l).forEach(function(u){var c=l[u];if(c){var d=hr(c)==="object",f=function(y){var g=t.t(d?c.attr:c,d?c.params:null,y),_=d&&c.modify?i:o.getProp();u==="child"?_.children?_.children[0]=g:_.children=[g]:xd(_,u,g),a.sync(i)},p=function(y){return f(y)},v=t.watchLoadData(p);f=sd(f,c.wait||300),c.watch!==!1?s.push(v):v()}}),this._fn[o.id]=s},deleted:function(o){this._fn[o.id]&&(this._fn[o.id].forEach(function(i){i()}),delete this._fn[o.id]),o.clearProp()}};return n.watch=n.loaded,n},iC={name:"componentValidate",load:function(t,n,r){var o=t.getValue();if(!o||o.method===!1)t.clearProp(),r.clearValidateState([n.field]);else{Pt.Object(o)||(o={method:o});var i=o.method,a=tn(tn({},o),{},{validator:function(){var s=Iu(n);if(s){for(var u=arguments.length,c=new Array(u),d=0;d1?be-1:0),ze=1;ze1&&arguments[1]!==void 0?arguments[1]:{};return I(qe,$e)};pe(Pe),te.config.globalProperties.$formCreate=Pe;var ze=D();te.component(ze.name,ze),a.forEach(function(Qe){Jn(function(){return Qe(le,te)})})}}})}if(pe(y),J(y),$("$cookie",Y2e),$("$localStorage",G2e),$("$sessionStorage",q2e),v.use({fragment:"fcFragment"}),e.install&&I.use(e),_(function(le,se){se.mixin({props:["formCreateInject"]})}),A(j2e),e.inherit){var Z=e.inherit;Z.components&&Mn(t,Z.components),Z.parsers&&Mn(n,Z.parsers),Z.directives&&Mn(r,Z.directives),Z.modelFields&&Mn(o,Z.modelFields),Z.providers&&Mn(u,Z.providers),Z.useApps&&Mn(a,Z.useApps),Z.maker&&Mn(c,Z.maker),Z.loadData&&Mn(p,Z.loadData),Z.formulas&&Mn(m,Z.formulas)}var ne=D();return L2(ne,y),Object.defineProperties(ne,{fetch:{get:function(){return y.fetch},set:function(se){y.fetch=se}}}),ne.util=y,ne}var RD={date:"YYYY-MM-DD",month:"YYYY-MM",week:"YYYY-wo",datetime:"YYYY-MM-DD HH:mm:ss",timerange:"HH:mm:ss",daterange:"YYYY-MM-DD",monthrange:"YYYY-MM",datetimerange:"YYYY-MM-DD HH:mm:ss",year:"YYYY"},PD="datePicker",eye={name:PD,maker:function(){return["year","month","date","dates","week","datetime","datetimeRange","dateRange","monthRange"].reduce(function(e,t){return e[t]=Li(PD,{type:t.toLowerCase()}),e},{})}(),mergeProp:function(t){var n=t.prop.props;n.valueFormat||(n.valueFormat=RD[n.type]||RD.date)}},Mw="hidden",tye={name:Mw,maker:wo({},Mw,function(e,t){return Li(Mw)("",e,t)}),render:function(){return[]}},Ow="input",nye={name:Ow,maker:function(){var e=["password","url","email","text","textarea"].reduce(function(t,n){return t[n]=Li(Ow,{type:n}),t},{});return e.idate=Li(Ow,{type:"date"}),e}(),mergeProp:function(t){var n=t.prop.props;n&&n.autosize&&n.autosize.minRows&&(n.rows=n.autosize.minRows||2)}},rye="textarea",oye={name:rye,mergeProp:function(t){var n=t.prop.props;n.type="textarea",n&&n.autosize&&n.autosize.minRows&&(n.rows=n.autosize.minRows||2)}},BD="slider",iye={name:BD,maker:{sliderRange:Li(BD,{range:!0})},toFormValue:function(t,n){var r=Array.isArray(t),o=n.prop.props,i=o.min||0,a;return o.range===!0?a=r?t:[i,parseFloat(t)||i]:a=r?parseFloat(t[0])||i:parseFloat(t),a}},Dw="timePicker",aye={name:Dw,maker:{time:Li(Dw,function(e){return e.props.isRange=!1}),timeRange:Li(Dw,function(e){return e.props.isRange=!0})},mergeProp:function(t){var n=t.prop.props;n.valueFormat||(n.valueFormat="HH:mm:ss")}},lye={name:"FcRow",render:function(t,n){return n.vNode.col({props:{span:24}},{default:function(){return[n.vNode.row(n.prop,t)]}})}},sye="select",uye={name:sye,toFormValue:function(t,n){return n.prop.props.multiple&&!Array.isArray(t)?ka(t):t}},cye=[eye,tye,nye,oye,iye,aye,lye,uye],vo="el",dye={button:vo+"-button",icon:vo+"-icon",slider:vo+"-slider",rate:vo+"-rate",upload:"fc-upload",cascader:vo+"-cascader",popover:vo+"-popover",tooltip:vo+"-tooltip",colorPicker:vo+"-colorPicker",timePicker:vo+"-time-picker",timeSelect:vo+"-time-select",datePicker:vo+"-date-picker",switch:vo+"-switch",select:"fc-select",checkbox:"fc-checkbox",radio:"fc-radio",inputNumber:vo+"-input-number",number:vo+"-input-number",input:vo+"-input",textarea:vo+"-input",formItem:vo+"-form-item",form:vo+"-form",frame:"fc-frame",col:vo+"-col",row:vo+"-row",tree:"fc-tree",autoComplete:vo+"-autocomplete",auto:vo+"-autocomplete",group:"fc-group",array:"fc-group",object:"fc-sub-form",subForm:"fc-sub-form"};function fye(){return{form:{inline:!1,labelPosition:"right",labelWidth:"125px",disabled:!1,size:void 0},row:{show:!0,gutter:0},submitBtn:{type:"primary",loading:!1,disabled:!1,innerText:"",show:!0,col:void 0,click:void 0},resetBtn:{type:"default",loading:!1,disabled:!1,innerText:"",show:!1,col:void 0,click:void 0}}}function pye(e){return e.type==="tooltip"}function LD(e,t){if(fo(e,t)&&Pt.String(e[t])){var n;e[t]=(n={},wo(n,t,e[t]),wo(n,"show",!0),n)}}function Du(e){return e===!1}function hye(e,t){fo(e,t)&&!Pt.Object(e[t])&&(e[t]={show:!!e[t]})}function Nw(e){var t=tn({},e);return delete t.children,t}var vye={validate:function(){var t=this.form();return t?t.validate():new Promise(function(n){return n()})},validateField:function(t){var n=this;return new Promise(function(r,o){var i=n.form();i?i.validateField(t,function(a,l){l?o(l):r(a)}):r()})},clearValidateState:function(t){var n=this.vm.refs[t.wrapRef];n&&n.clearValidate()},fieldChange:function(t,n,r,o){if(!o){var i,a;(i=this.vm.refs[t.wrapRef])===null||i===void 0||(a=i.validate("change"))===null||a===void 0||a.catch(function(){})}},tidyOptions:function(t){return["submitBtn","resetBtn","row","info","wrap","col","title"].forEach(function(n){hye(t,n)}),t},tidyRule:function(t){var n=t.prop;return LD(n,"title"),LD(n,"info"),n},mergeProp:function(t){var n=this,r={info:{trigger:"hover",placement:"top-start",icon:!0},title:{},col:{span:24},wrap:{}};["info","wrap","col","title"].forEach(function(o){t.prop[o]=Zc([n.options[o]||{},t.prop[o]||{}],r[o])})},getDefaultOptions:function(){return fye()},update:function(){var t=this.options.form;this.rule={props:tn({},t),on:{submit:function(r){r.preventDefault()}},style:t.style,type:"form"}},beforeRender:function(){var t=this.key,n=this.ref,r=this.$handle,o=this.options.form;Mn(this.rule,{key:t,ref:n,class:[o.className,o.class,"form-create",this.$handle.preview?"is-preview":""]}),Mn(this.rule.props,{model:r.formData})},render:function(t){var n=this;return t.slotLen()&&!this.$handle.preview&&t.setSlot(void 0,function(){return n.makeFormBtn()}),this.$r(this.rule,Du(this.options.row.show)?t.getSlots():[this.makeRow(t)])},makeWrap:function(t,n){var r=this,o=t.prop,i="".concat(this.key).concat(t.key),a=o.col,l=this.isTitle(o)&&o.wrap.title!==!1,s=!a.labelWidth&&!l?0:a.labelWidth,u=this.rule.props,c=u.inline,d=u.col,f=o.wrap.class;delete o.wrap.class,delete o.wrap.title;var p=(Pt.Undef(o.wrap.show)?!t.input:Du(o.wrap.show))?n:this.$r(Zc([o.wrap,{props:tn(tn({labelWidth:s===void 0?s:SH(s),label:l?o.title.title:void 0},Nw(o.wrap||{})),{},{prop:t.id,rules:t.injectValidate()}),class:this.$render.mergeClass(f||o.className,"fc-form-item"),key:"".concat(i,"fi"),ref:t.wrapRef,type:"formItem"}]),tn({default:function(){return n}},l?{label:function(){return r.makeInfo(o,i,t)}}:{}));return c===!0||Du(d)||Du(a.show)?p:this.makeCol(o,i,[p])},isTitle:function(t){if(this.options.form.title===!1)return!1;var n=t.title;return!(!n.title&&!n.native||Du(n.show))},makeInfo:function(t,n,r){var o,i,a,l,s=this,u=tn({},t.title),c=tn({},t.info),d=pye(c),f=this.options.form,p=this.getSlot("title"),v=[p?p({title:(o=r.refRule)===null||o===void 0||(i=o.__$title)===null||i===void 0?void 0:i.value,rule:r.rule,options:this.options}):((a=r.refRule)===null||a===void 0||(l=a.__$title)===null||l===void 0?void 0:l.value)+(f.labelSuffix||f["label-suffix"]||"")];if(!Du(c.show)&&(c.info||c.native)&&!Du(c.icon)){var m={type:c.type||"popover",props:Nw(c),key:"".concat(n,"pop")};delete m.props.icon,delete m.props.show,delete m.props.info,delete m.props.align,delete m.props.native;var y="content";if(c.info&&!fo(m.props,y)){var g,_;m.props[y]=(g=r.refRule)===null||g===void 0||(_=g.__$info)===null||_===void 0?void 0:_.value}v[c.align!=="left"?"unshift":"push"](this.$r(Zc([c,m]),wo({},u.slot||(d?"default":"reference"),function(){return s.$r({type:"ElIcon",style:"top:2px",key:"".concat(n,"i")},{default:function(){return s.$r({type:c.icon===!0?"icon-warning":c.icon})}},!0)})))}var x=Zc([u,{props:Nw(u),key:"".concat(n,"tit"),class:"fc-form-title",type:u.type||"span",on:{click:function(){for(var E=arguments.length,A=new Array(E),S=0;S1&&arguments[1]!==void 0?arguments[1]:!0;e.helper.tidyFields(r).forEach(function(a){i&&o.clearSubValidateState(a),t.getCtxs(a).forEach(function(l){t.$manager.clearValidateState(l)})})},clearSubValidateState:function(r){e.helper.tidyFields(r).forEach(function(o){t.getCtxs(o).forEach(function(i){var a=t.subForm[i.id];a&&(Array.isArray(a)?a.forEach(function(l){l.clearValidateState()}):a&&a.clearValidateState())})})},btn:{loading:function(){var r=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!0;e.submitBtnProps({loading:!!r})},disabled:function(){var r=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!0;e.submitBtnProps({disabled:!!r})},show:function(){var r=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!0;e.submitBtnProps({show:!!r})}},resetBtn:{loading:function(){var r=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!0;e.resetBtnProps({loading:!!r})},disabled:function(){var r=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!0;e.resetBtnProps({disabled:!!r})},show:function(){var r=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!0;e.resetBtnProps({show:!!r})}},submitBtnProps:function(){var r=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},o=ID(t.options.submitBtn,!0);Mn(o,r),t.options.submitBtn=o,e.refreshOptions()},resetBtnProps:function(){var r=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},o=ID(t.options.resetBtn,!1);Mn(o,r),t.options.resetBtn=o,e.refreshOptions()},submit:function(r,o){return new Promise(function(i,a){var l=t.options.validateOnSubmit===!1?Promise.resolve():e.validate();l.then(function(){var s=e.formData();t.beforeSubmit(s).then(function(){Pt.Function(r)&&Jn(function(){return r(s,e)}),Pt.Function(t.options.onSubmit)&&Jn(function(){return t.options.onSubmit(s,e)}),t.vm.emit("submit",s,e),i(s)}).catch(function(u){})}).catch(function(){for(var s=arguments.length,u=new Array(s),c=0;cspan::selection,.cm-fat-cursor .CodeMirror-line>span>span::selection{background:transparent}.cm-fat-cursor .CodeMirror-line::-moz-selection,.cm-fat-cursor .CodeMirror-line>span::-moz-selection,.cm-fat-cursor .CodeMirror-line>span>span::-moz-selection{background:transparent}.cm-fat-cursor{caret-color:transparent}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{bottom:0;left:0;overflow:hidden;position:absolute;right:0;top:-50px}.CodeMirror-ruler{border-left:1px solid #ccc;bottom:0;position:absolute;top:0}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta,.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-invalidchar,.cm-s-default .cm-error{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{background:#fff;overflow:hidden;position:relative}.CodeMirror-scroll{height:100%;margin-bottom:-50px;margin-right:-50px;outline:none;overflow:scroll!important;padding-bottom:50px;position:relative;z-index:0}.CodeMirror-sizer{border-right:50px solid transparent;position:relative}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{display:none;outline:none;position:absolute;z-index:5}.CodeMirror-vscrollbar{overflow-x:hidden;overflow-y:scroll;right:0;top:0}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-x:scroll;overflow-y:hidden}.CodeMirror-scrollbar-filler{bottom:0;right:0}.CodeMirror-gutter-filler{bottom:0;left:0}.CodeMirror-gutters{left:0;min-height:100%;position:absolute;top:0;z-index:3}.CodeMirror-gutter{display:inline-block;height:100%;margin-bottom:-50px;vertical-align:top;white-space:normal}.CodeMirror-gutter-wrapper{background:none!important;border:none!important;position:absolute;z-index:4}.CodeMirror-gutter-background{bottom:0;position:absolute;top:0;z-index:4}.CodeMirror-gutter-elt{cursor:default;position:absolute;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre.CodeMirror-line,.CodeMirror pre.CodeMirror-line-like{word-wrap:normal;-webkit-tap-highlight-color:transparent;background:transparent;border-radius:0;border-width:0;color:inherit;font-family:inherit;font-size:inherit;font-variant-ligatures:contextual;line-height:inherit;margin:0;overflow:visible;position:relative;white-space:pre;z-index:2}.CodeMirror-wrap pre.CodeMirror-line,.CodeMirror-wrap pre.CodeMirror-line-like{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{bottom:0;left:0;position:absolute;right:0;top:0;z-index:0}.CodeMirror-linewidget{padding:.1px;position:relative;z-index:2}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:none}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{box-sizing:content-box}.CodeMirror-measure{height:0;overflow:hidden;position:absolute;visibility:hidden;width:100%}.CodeMirror-cursor{pointer-events:none;position:absolute}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{position:relative;visibility:hidden;z-index:3}.CodeMirror-focused div.CodeMirror-cursors,div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:#ff06}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:""}span.CodeMirror-selectedtext{background:none}.CodeMirror-hints{background:#fff;border:1px solid silver;border-radius:3px;box-shadow:2px 3px 5px #0003;font-family:monospace;font-size:90%;list-style:none;margin:0;max-height:20em;overflow:hidden;overflow-y:auto;padding:2px;position:absolute;z-index:1}.CodeMirror-hint{border-radius:2px;color:#000;cursor:pointer;margin:0;padding:0 4px;white-space:pre}li.CodeMirror-hint-active{background:#08f;color:#fff}._fd-fn{display:flex;flex-direction:column;height:100%;position:relative;width:100%}._fd-fn .el-button{bottom:3px;box-shadow:0 6px 16px #00000014,0 3px 6px -4px #0000001f,0 9px 28px 8px #0000000d;position:absolute;right:5px}._fd-fn-editor{display:flex;flex:1;overflow:auto;width:100%}._fd-fn-editor .CodeMirror{height:100%;width:100%}._fd-fn-tip{color:#000;direction:ltr;font-family:monospace}._fd-fn-tip .cm-keyword{color:#708;line-height:24px;overflow-x:auto;white-space:nowrap}._fd-fn-tip .cm-keyword::-webkit-scrollbar{background-color:transparent;height:0;width:0}._fd-fn-ind{background-color:#f7f7f7;border-right:1px solid #ddd;display:inline-block;float:left;height:24px;margin-right:4px;width:29px}._fd-fn-arg{cursor:pointer;text-decoration:underline}._fd-fn-arg i{color:#3073ff;font-size:12px}._fd-fn-info a{text-decoration:underline}._fd-event .el-button{border-color:#2e73ff;color:#2e73ff;font-weight:400;width:100%}._fd-event .el-badge{width:100%}._fd-event-dialog .el-dialog__body{padding:10px 20px}._fd-event-con .el-main{padding:0}._fd-event-l,._fd-event-r{border:1px solid #ececec;display:flex;flex:1;flex-direction:column;height:100%}._fd-event-dropdown .el-dropdown-menu{max-height:500px;overflow:auto}._fd-event-head{align-items:center;background:#f8f9ff;border-bottom:1px solid #eee;display:flex;padding:5px 15px}._fd-event-head .el-button.is-link{color:#2f73ff}._fd-event-r{border-left:0}._fd-event-r ._fd-event-head{justify-content:space-between}._fd-event-l>.el-main,._fd-event-r>.el-main{box-sizing:border-box;display:flex;flex:1;flex-basis:auto;flex-direction:row;min-width:0;width:100%}._fd-event-item,._fd-event-r>.el-main{flex-direction:column}._fd-event-item{display:flex;font-size:14px;justify-content:center;max-width:250px;overflow:hidden;white-space:pre-wrap}._fd-event-item ._fd-label{color:#aaa;font-size:12px}._fd-event-l .el-menu{border-right:0;border-top:0;overflow:auto;padding:0 10px 5px;width:100%}._fd-event-l .el-menu-item.is-active{background:#e4e7ed;color:#303133}._fd-event-l .el-menu-item{border:1px solid #ececec;border-radius:5px;height:auto;line-height:1em;margin-top:5px;padding:0}._fd-event-method{color:#9d238c;display:flex;flex-direction:column;font-family:monospace;font-size:14px;justify-content:center;overflow:hidden;white-space:pre-wrap;width:225px}._fd-event-method ._fd-label{color:#aaa;font-size:12px;margin-top:4px}._fd-event-method>span:first-child,._fd-fn-list-method>span:first-child{color:#9d238c}._fd-event-method>span:first-child>span,._fd-fn-list-method>span:first-child>span{color:#000;margin-left:10px}._fd-event-title{align-items:center;display:flex;justify-content:space-between;padding:10px 0;width:100%}._fd-event-title .fc-icon{color:#282828;font-size:18px;margin-right:6px}._fd-event-title .el-input{width:200px}._fd-event-title .el-input__wrapper{box-shadow:none}._fd-event-title .el-menu-item.is-active i{color:#282828}._fd-event-con .CodeMirror{height:100%;width:100%}._fd-event-con .CodeMirror-wrap pre.CodeMirror-line{padding-left:20px}._fd-type-select{cursor:pointer}._fd-type-select.is-disabled{cursor:default}._fd-type-select .fc-icon{font-size:14px}._fd-type-select-pop{max-height:500px;overflow:auto}._fd-type-select-pop .fc-icon{font-size:14px}._fd-struct,._fd-struct .el-badge{width:100%}._fd-struct .el-button{border-color:#2e73ff;color:#2e73ff;font-weight:400;width:100%}._fd-struct-con .CodeMirror{height:500px}._fd-struct-con .el-dialog__body{padding:0}._fd-props-input{display:inline-block;width:16px}._fd-props-input .fc-icon{cursor:pointer}._fd-language-config{height:100%;overflow:auto}._fd-lc-body,._fd-lc-header{padding:0 12px}._fd-lc-body{overflow:auto}._fd-lc-header{display:flex;justify-content:flex-end;margin-bottom:12px}._fd-language-config .el-table__cell{height:34px}._fd-language-config ._fc-l-info{margin-bottom:12px}._fd-lc-handle{align-items:center;cursor:pointer;display:flex;justify-content:space-between}._fd-markdown-renderer[data-v-537e7504]{color:#262626;line-height:1.6}._fd-markdown-renderer[data-v-537e7504] h1,._fd-markdown-renderer[data-v-537e7504] h2,._fd-markdown-renderer[data-v-537e7504] h3,._fd-markdown-renderer[data-v-537e7504] h4,._fd-markdown-renderer[data-v-537e7504] h5,._fd-markdown-renderer[data-v-537e7504] h6{color:#262626;font-weight:600;margin:16px 0 8px}._fd-markdown-renderer[data-v-537e7504] h1{font-size:24px}._fd-markdown-renderer[data-v-537e7504] h2{font-size:20px}._fd-markdown-renderer[data-v-537e7504] h3{font-size:18px}._fd-markdown-renderer[data-v-537e7504] h4{font-size:16px}._fd-markdown-renderer[data-v-537e7504] h5{font-size:14px}._fd-markdown-renderer[data-v-537e7504] h6{font-size:12px}._fd-markdown-renderer[data-v-537e7504] p{margin:8px 0}._fd-markdown-renderer[data-v-537e7504] ol,._fd-markdown-renderer[data-v-537e7504] ul{margin:8px 0;padding-left:24px}._fd-markdown-renderer[data-v-537e7504] ul{list-style-type:disc}._fd-markdown-renderer[data-v-537e7504] ol{list-style-type:decimal}._fd-markdown-renderer[data-v-537e7504] li{margin:4px 0}._fd-markdown-renderer[data-v-537e7504] blockquote{background:#f5f5f5;border-left:4px solid #2e73ff;border-radius:0 8px 8px 0;margin:16px 0;padding:12px 16px}._fd-markdown-renderer[data-v-537e7504] blockquote p{color:#666;margin:0}._fd-markdown-renderer[data-v-537e7504] table{border-collapse:collapse;margin:16px 0;width:100%}._fd-markdown-renderer[data-v-537e7504] td,._fd-markdown-renderer[data-v-537e7504] th{border:1px solid #ececec;padding:8px 12px;text-align:left}._fd-markdown-renderer[data-v-537e7504] th{background:#f5f5f5;font-weight:600}._fd-markdown-renderer[data-v-537e7504] code{background:#f5f5f5;border-radius:4px;color:#2e73ff;font-family:Monaco,Menlo,Ubuntu Mono,monospace;font-size:13px;padding:2px 6px}._fd-markdown-renderer[data-v-537e7504] .code-block-container{background:#ececec;border:1px solid #ececec;border-radius:8px;position:relative}._fd-markdown-renderer[data-v-537e7504] .code-block-container pre{background:#ececec;margin:0;max-height:800px;overflow:auto;padding:16px}._fd-markdown-renderer[data-v-537e7504] .code-block-container code{background:none;color:#262626;font-size:13px;line-height:1.5;padding:0}._fd-markdown-renderer[data-v-537e7504] .code-block-header{align-items:center;background:#ececec;border-bottom:1px solid #ececec;border-radius:8px 8px 0 0;box-sizing:border-box;display:flex;gap:8px;height:40px;justify-content:space-between;padding:8px 12px;position:sticky;top:0;z-index:1}._fd-markdown-renderer[data-v-537e7504] .code-block-actions{align-items:center;display:flex;gap:4px}._fd-markdown-renderer[data-v-537e7504] .code-language{color:#666;font-size:12px;font-weight:500;letter-spacing:.5px;text-transform:uppercase}._fd-markdown-renderer[data-v-537e7504] .code-action-item{align-items:center;background:transparent;border:none;border-radius:4px;color:#666;cursor:pointer;display:flex;font-size:12px;gap:4px;padding:2px 8px;transition:all .2s ease}._fd-markdown-renderer[data-v-537e7504] .code-action-item:hover{background:#fff;color:#262626}._fd-markdown-renderer[data-v-537e7504] .code-action-item.is-primary{color:#2e73ff}._fd-markdown-renderer[data-v-537e7504] .code-action-item.is-primary:hover{background:#2e73ff;color:#fff}._fd-markdown-renderer[data-v-537e7504] .code-action-text{font-size:12px;font-weight:500}._fd-markdown-renderer[data-v-537e7504] .hljs{background:#fff!important;color:#262626!important}._fd-markdown-renderer[data-v-537e7504] a{color:#2e73ff;text-decoration:none}._fd-markdown-renderer[data-v-537e7504] a:hover{text-decoration:underline}._fd-markdown-renderer[data-v-537e7504] strong{color:#262626;font-weight:600}._fd-markdown-renderer[data-v-537e7504] em{color:#666;font-style:italic}._fd-markdown-renderer[data-v-537e7504] .diff-lines{font-family:Monaco,Menlo,Ubuntu Mono,monospace;font-size:13px;line-height:1.5}._fd-markdown-renderer[data-v-537e7504] .diff-line{display:flex}._fd-markdown-renderer[data-v-537e7504] .diff-line-number{background:#ececec;border-right:1px solid #ececec;color:#aaa;flex-shrink:0;font-size:11px;padding:4px;text-align:right;width:30px}._fd-markdown-renderer[data-v-537e7504] .diff-line-content{flex:1;word-break:break-all}._fd-markdown-renderer[data-v-537e7504] .diff-old-line{background:rgba(239,68,68,.1);color:#ef4444;padding:2px 4px}._fd-markdown-renderer[data-v-537e7504] .diff-new-line{background:rgba(34,197,94,.1);color:#22c55e;padding:2px 4px}._fd-markdown-renderer[data-v-537e7504] .diff-same-line{color:#262626;padding:2px 4px}._fd-markdown-renderer[data-v-537e7504] .diff-line-added{background:rgba(34,197,94,.05)}._fd-markdown-renderer[data-v-537e7504] .diff-line-removed{background:rgba(239,68,68,.05)}._fd-markdown-renderer[data-v-537e7504] .diff-line-modified{background:rgba(245,158,11,.05)}._fd-markdown-renderer[data-v-537e7504] .diff-line-unchanged{background:transparent}._fd-markdown-renderer[data-v-537e7504] .diff-context{background:hsla(220,9%,46%,.05);opacity:.7}._fd-markdown-renderer[data-v-537e7504] .diff-context .diff-line-number{color:#aaa;opacity:.6}._fd-ai-panel[data-v-23304ea6]{background:#fff;border-radius:8px;display:flex;flex-direction:column;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;height:100%;overflow:hidden}._fd-ai-header[data-v-23304ea6]{background:#fff;border-bottom:1px solid #ececec;height:40px;justify-content:space-between;padding:0 20px}._fd-ai-header[data-v-23304ea6],._fd-ai-title[data-v-23304ea6]{align-items:center;display:flex}._fd-ai-title[data-v-23304ea6]{gap:8px}._fd-ai-name[data-v-23304ea6]{color:#262626;font-size:14px;font-weight:600}._fd-ai-actions[data-v-23304ea6]{display:flex;gap:8px}._fd-ai-action-btn[data-v-23304ea6]{align-items:center;background:transparent;border:none;border-radius:3px;color:#666;cursor:pointer;display:flex;height:24px;justify-content:center;opacity:.8;transition:all .15s ease;width:24px}._fd-ai-action-btn[data-v-23304ea6]:hover{background:#f5f5f5;color:#262626;opacity:1}._fd-ai-content[data-v-23304ea6]{display:flex;flex:1;flex-direction:column;gap:16px;min-height:0;overflow-y:auto;padding:0 20px}._fd-ai-content--centered[data-v-23304ea6]{align-items:center;justify-content:center}._fd-ai-welcome[data-v-23304ea6]{color:#666;margin:0 auto;max-width:600px;padding:20px;text-align:center}._fd-ai-message-avatar[data-v-23304ea6],._fd-ai-welcome-icon[data-v-23304ea6]{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAAXNSR0IArs4c6QAAAJZlWElmTU0AKgAAAAgABQESAAMAAAABAAEAAAEaAAUAAAABAAAASgEbAAUAAAABAAAAUgExAAIAAAARAAAAWodpAAQAAAABAAAAbAAAAAAAAABIAAAAAQAAAEgAAAABQWRvYmUgSW1hZ2VSZWFkeQAAAAOgAQADAAAAAQABAACgAgAEAAAAAQAAADKgAwAEAAAAAQAAADIAAAAA8BXFawAAAAlwSFlzAAALEwAACxMBAJqcGAAAActpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDYuMC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyI+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDx4bXA6Q3JlYXRvclRvb2w+QWRvYmUgSW1hZ2VSZWFkeTwveG1wOkNyZWF0b3JUb29sPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KUVd6EgAAD7xJREFUaAXtWXtwXcV5393zvldXwkLyE09KghtsFcpgN6khSWVCDCY1belc2bFjU6YBT6aQSTOdKe204+syzQwzbZiBTjvQZMDGD5AwbjAvpw6+NnUo1KY1jTxNTVzHBPyQLVnSvfc8d7e/b4+kyG/L0Mcf7Ojc3bPn28f3/u2KsY/LxxL4H5EAP21WrXmFreFszWm9H+lLpVJRp0+oOaswzlYzzdZg7YuV1atBN0LPuT6bXOPj/3oBEx9RySciJjjTD/f9U0nGkcubPBUP1z+SRbxSUdNcVGvhiuS9nw1XOroSBu0zSHTu49qxUtYcDg8q5fFzrin8ZiN5FQ1xEWsdlFrEYP1E8pM/bh8elYNNjcfZHnsVm5cqJ75d2HojU+GAXxT4di7VjQ7NazUiVLMS2lSPb6dpyoTr6iTOPM2yo2x6+6+BJOmsMqvKWCbi6Aml2d1e4B3XTLtM/2LNMRuMIyZoXu5q5mudpdEVTV5xGbp6OivarlZ4Zhg5suZFiU7GlfoBqppbLLRnUcy4oOGnl3yTtNlceGJk87R8rljUhihnCrMymWS6OLmNDx87+daaSb9xqtLb61Y6eDL/7/QMmUbLLdfnSmZTiPYX8zNmmTnHra8yZnk+k1F0wrKz18Z9MYwycsCK3mE/2PqlQYxdb7sOU5mKVJppmWaKNoJaZgmeWKKmJ5OpaY/0j/QZGrRTojW1zKTiaThcZ5KLJ2nxvQcnGQGqNFzqFH1HpxFMLYNCUslVljGV11qlCm2Fxc0DCSW5/Pizb93ffDLXBjNKMBPS5L2sLxeG5huTRng/BsAUSLo816plWwJNDXGPaoOPaiOnM2uQ6VMZ/QVjLGhtZo2B4Z/aU1p30betvzk9pFoIsYyR/XBm597BLW7Buoxe4EJKMq0yWjJXuGauwnxc6GdofN8cUgTPqD3mXKDmKIaZb5/c/mbQXPxMY6gGSQkXTkkcDYIkAZ3I5x1vBvk0o0zkEslNDe0U9FOZ0pW/nPGFvyh3vxf0dM0Mb/7b8PNM2Lu0zGjbYAfb0zrFngawcQu1xDgPdQv6aUolHN9Scbj3X75ZmId3I2UKGNQccwJigszLfGdsI7PQ1IJ2G/stzaj45va25hlSZXNUxmfDXGdreiSbjSXNAx+bTY9f8K8VWs3Oit61suhdp2p6ivOf8ts098GBY0aCQvBlTmCTjDIoOnOKHlhhq2dO9qdDaDe8+YA/FYt/3w48hl0oEqVwwK7FNtA81zx6AANyJuh9zLToZbRYXG+pnxx+CNGmlMUw4DDBXvnCmB0Xlal3HB+lm2g99/E9zt5V89L53x1sZZn+LQiCNimZ5XgyjBqelk/2dHGy+Z8velR7pwT7IuiMQXBh2SqMQoTqblr33f5rSHtj5TRGVrNOGKUWD3J++KHjO161fb+cxpmdNOI0aL3iqv6j7CsY+dSj+mVvKqtl+6vtY6Y5NuO4xpzOTr2/WuWsE51rdqrqkbnGDFzlftku+tPSRiShEW0XLJYOpy9U/6Dp6M0P95V2Iz8MicYKp1CYARoFZjOrgHRTl1vf+Fbh/XK3tkYYHlvtNEbIvB448LKLrzEizHowUVaKg4YnGQUQDucEI/3sE/p1hIeOsWnObowxsXOnqiwgWEJRIHdM2PNyiuxw54QJ7eeaURtpFuczbSYQIBKUyTWNxshyMIMQat3ZK+U9pzFCXUf/tWZseFpb8ZX3jzd+Cq18Ko1iKxys4yv/0p8d3zmrwjsOEG0P/VxKoSiwBvuuMP2Fvx+ejdZCCXMVXAvh+TyLogOFpEA5jFUX8OzmJ+IOodQtmiIU55nwvEDF8YGW7IPtRNNTNrGOmmPlLEZ6urpkRfe6q3hH8ucf7OwBIw/CR2ASPPOaS3Y4OLwKo//oTw/tmqbtJEmExRmAApKoTuoNPr5mVixqNTd+jPMhQBF7LyKPK+wlTsnn8VAUw7ltCw6sUvbcK9/g8fzv6OCNb/HQ0apsl3w7rkUJtGLZsJEklt2vfGNWbMyKGz8aY4IaZzFCnXPYHJNkECLWNwZqD0KgNlxOh6dqEAX/5p+8v3slYAVCRsAsoiwg7GjFRMFnSF2M+wFPJAwm8ybZDlsKii2L76vqvUcQBnm0TMVkVswCcrBkGEuhpckLV13FEsJejMdLjLkxLrklAlmHL9m2cfKDA3thlHkSRD1WqPOs0gWOK3D6h6Z9rlcq9ppbKjH4SmZwlYYKbLcdT5ugx3HbuO2g7aCmPqcNMrzSLhSngKfQbbZeowUqfEG28Or4Nmh4ls4iKSzGbR8piuldP7y36R1igBy4ZMVfdALvWpVQINC27YMvWNzr93rv0DyLj8zNhUwv48o5Gcm/V803pcVaJC4EM7grTB2b08jWip40SQFTCIqgNpAky1ADZKgGmEPuEc883DpvsPyj9wKaE5u+m9ITNkYhFSIxnU/Tt+nwc6ptrleSueE75ReT8ZE7TCCgkFypcLj92eWcpmXIEC6phne8qPuH+gDWCEgiEBgzI0BJlpEzSIQj0ITSNJ4C0AUVYzI9N80M79ykp6dpvEgl0uQFYTm2DMOTrCl4ngi3ruKNzidrUzH2ThkCMQO2MMvlAIh9Lkv+gWjC/rNNivqpnFcjldUVZHotHpl5Uz+q5xHTSSOSzAuS5lmmG1kqT+Dppwegsh8gcUCm8hgAZxIO1f65cZLvZp3aCCvLwrJb8JoJBJK0naJFWGvz9i4+uHDd0SJtxuV2l9vkFxlwC2iY4wti+oVtX2vpJ9MjuE505yrn1wj2+8GevfRdAb5uioYaq8CABxOL3GLRj4brvVrXFzJ2BXTkCjY0aEwmapIwmTbh6oHGY/PmkwZNEoSEl46YFGKqxgGFFKeNWbX4UyLaHJZcTjKHsjngFSeHtwVbe66Nn9lHc5+3lLu7kUG7jJH84aG39iK03hjXGtgCh/CAk1J9w3c+eeO+801w3x7tPDGPp4vXN36dW9YbhP20UqEdBEHWCN9+cUVh7ihsuX1tY74Q9o80op9SOrU934Ep79t2j3/D+eYf339e0yIik1NwCKK20ro7d3puK8Vit9SMUCu/Rt/ooER2h3MNIVhTU3vgYJ64LMGWeiWKUCom2zcOL9gmGlty55LLM9Ascwrwcq0laJQF3AsXNBrr3JGbJ9Gdr1xQIzTovj17INV56f2H3rxaKOvHkGwBtpYh7NoySY/4Tfasv5r6q3ViBAZtzMgsNvK+aP3JZt8K9gs3mJHFYQQz9BHu6pKJ619a7h8k2lu7+1v8xP934QQzZRzGnECkzCJC1q/eExyqVLQ4X7Qya+HnghohImKismOH/Te/9Nn/gtb/0fIL0A5wQ5JlTqk0rVGXdxJdef9+Ez6pTaVzjTlTsMAKFrmlYAbcP4XpWzhSkAP/gJhAljbaLqT+IqcQzNRpiHzLtFNEwOL6JWLCaHo13Oki5aKM0PjeyZMNHVZZizxiZqUEDhODzYuVZo3e3tMSVfucfHGc+e6mCIScgLMmTARUeN1AY/rqh/L1uf5qbm48xjHUhSaIyNDMfQIBZ7ymzWJn/1wSIz1z5hjsL/Sxl3G1cxhmYmnFga0iSpC3fP0/9n2a/Kk84k+jMLvcHV0DYLhQNnALYjCTz2E6PzsVH3uJtlK95+rodzcMzkIYvi0DiMR+BTK/UFF4kLcE24jmk5PmmnxG7QuVS2KEVqDT42Oz7sCtEn8G8APi5lIqJZ1Si4ugv+SMRYwDC6GXeaUAtqQpL2jb48TQc8TA4q26QGMAQpb4zT6gg4yhKQMiob3nty7mjftGYMsZc5/z9dIYMUM7jWQQlTaGA0MIR8JTEsykEuGSlYnRno6OhEIuMBPO+uT8bCmQLY4ctH9mZ2GMw6AykcgPGaAjLIjz5QoB3eIACoAKCMsa/mEi2sAkssJLK5fMSCV3Dfb4p2/cJ6WuOgi/2IWM6yFYCn7l8I/bbqElQ+eYceBlm+sLHc+bjSsf8o/MbQqgGPX6s3c17Vv0svYIIHZtjm51/AAAMQRuwZEc53NobvfzS4tvkyBw7jjtOHshli6Zkdy88ngOr90A2EKI2MF6kRUgknG+jBYK0imQL3i0xHIyJWzMwA3jzBZfS9+aaiPRUqnfGwGIRKcNDc+zfbkHIPISnJzmo3LpjBB1tUq/OKDqrdHg0Anu+jZZUDLcoHPKnSv/7SczKJOv3NqYAS3coRIYIBixXc8FDeGxF2g8tBGWu2tTcdy9QwKHggkgf9tO641Tyi5sJpqO/ey8uIq+n1kmxEils1OWtba+e911x6CNF3FMpahlA84n7hWtk7SQv50vIH/HbwquVFkMbXDm4uBlWWJLT1epj+61iMZ27bvcYjCJ4RaRtOYVHWAstmXLXfwkZfKLJcAPxQipuvbuuwZoIvxuSBsxTBnX3tCKcXou6JYF5m4tJSkjASIJal/GiHE8P1P07X/X2D385StEwwGkoTWHggLcfR2Nb++7eAIkuvFlQhqhgZ+9Jr9PWnf9nO1pnPbC0ZEUuZXUyLz03K/uPvZ1eMaNuA8jvgUyNpB79M6n3var5MDVyoJsxffr84BwPydjc5UroRmBG8R3rt3n76I1znW5QP0XKhNmpMK5Kvfm0AK5ehP8hHIKMgoBS4YrEf7XOEUEuPynA7plIaOAoR4yFTiwT5uBuS0JWnxoTgJE6jx3cPUM0RiAOAEnH2VuwoyYgb09Bo4gem2KTw3ixks4hFaYdLSTFAJukbEheVjCxgVbBBd4lsZB0tEKOkRxVpZ0GKBI5ThOOhyFjm0/RzSd9HMZ5bIYMXAEt30br//lg4hW25ymFoRfnCGigIvEIkwFiCWkW3DJgX/41OKWAw8gd5BqrNbm2xAIPgGoQmHZovtfIIDtTy32D5gkuhMWehnlshihdfraq3BVmJMiIIkDBKklLFAqpoyOP+PgTCi9jujskdwBxu7GQ9qgaGVuEJFXNxLNA68wd6LRisZRuWxGqgjFZobBllej4VOHbV6y7dgLcUDF/THgBxJDUgvfb5oUbCW6R5A77tnWmAkub0U/3edqy7IJRL4nnSZDc7Q2sdxh1h/5uWxGSKQG5S6YjDtWtbk5mAZMZQeWHxBs8oqtlJhZ9yM38XDFtvxywZL63mKbX8AFCi5RHK9ANLi8e/o2XqezCcGW8ZubSPvyGYFzd7TTPpCVpbc+Ozx8At5+QsaNIzC447W+xgDsbR19f3rhlAbVSBSfb/RHNVySHMW/046H/WE/mHqSPmGuy/INGkvFbCRvfrjf339Vt/K47ojmolRDdUt7xfR7t/N+8EseoyvI1j8fql+JwGY27AHcp7opy2k+3Nr/T0YTox++fCST0DZI4mdup4J/EYzvo2TXOb4D7TNpzvj88evHEvi/lsB/A/l20BBYPwTnAAAAAElFTkSuQmCC);background-position:50%;background-repeat:no-repeat;background-size:45px}._fd-ai-welcome-icon[data-v-23304ea6]{align-items:center;background-color:#f5f5f5;border-radius:50%;display:flex;height:64px;justify-content:center;margin:0 auto 20px;width:64px}._fd-ai-welcome h3[data-v-23304ea6]{color:#262626;font-size:24px;font-weight:600;margin:0 0 12px}._fd-ai-welcome p[data-v-23304ea6]{color:#666;font-size:16px;line-height:1.6;margin:0 0 32px}._fd-ai-welcome-suggestions[data-v-23304ea6]{text-align:left}._fd-ai-suggestions-header[data-v-23304ea6]{align-items:center;display:flex;justify-content:space-between;margin-bottom:16px}._fd-ai-suggestions-header span[data-v-23304ea6]{color:#262626;font-size:14px;font-weight:500}._fd-ai-refresh-btn[data-v-23304ea6]{align-items:center;background:transparent;border:none;border-radius:4px;color:#aaa;cursor:pointer;display:flex;font-size:12px;gap:4px;padding:4px 8px;transition:all .2s ease}._fd-ai-refresh-btn[data-v-23304ea6]:hover{background:#f5f5f5;color:#262626}._fd-ai-suggestions-list[data-v-23304ea6]{display:grid;gap:12px;grid-template-columns:repeat(2,1fr)}._fd-ai-suggestion-item[data-v-23304ea6]{background:#f5f5f5;border:1px solid #ececec;border-radius:12px;color:#262626;cursor:pointer;font-size:14px;line-height:1.4;padding:12px 16px;text-align:left;transition:all .2s ease}._fd-ai-suggestion-item[data-v-23304ea6]:hover{background:#fff;border-color:#2e73ff;box-shadow:0 2px 8px #0000001a;transform:translateY(-1px)}._fd-ai-messages[data-v-23304ea6]{margin-top:16px}._fd-ai-message[data-v-23304ea6],._fd-ai-messages[data-v-23304ea6]{display:flex;flex-direction:column}._fd-ai-message-content[data-v-23304ea6]{align-items:flex-start;display:flex;gap:12px;position:relative}._fd-ai-message-content:hover ._fd-ai-message-footer[data-v-23304ea6]{display:flex}._fd-ai-message--user ._fd-ai-message-actions[data-v-23304ea6],._fd-ai-message--user ._fd-ai-message-content[data-v-23304ea6]{flex-direction:row-reverse}._fd-ai-message-avatar[data-v-23304ea6]{align-items:center;background-color:#f5f5f5;background-size:20px;border-radius:50%;display:flex;flex-shrink:0;height:32px;justify-content:center;width:32px}._fd-ai-message-avatar--error[data-v-23304ea6]{background-color:#ff2e2e0d}._fd-ai-message-bubble[data-v-23304ea6]{word-wrap:break-word;border-radius:12px;margin-bottom:35px;max-width:70%;min-height:21px;min-width:40px;padding:12px 16px;position:relative}._fd-ai-message-bubble--user[data-v-23304ea6]{background:#2e73ff;border-bottom-right-radius:4px;color:#fff}._fd-ai-message-bubble--ai[data-v-23304ea6]{background:#f5f5f5;border-bottom-left-radius:4px;color:#262626}._fd-ai-message-bubble--thinking[data-v-23304ea6]{background:rgba(46,115,255,.05);border:1px solid #2e73ff;border-bottom-left-radius:4px}._fd-ai-message-bubble--error[data-v-23304ea6]{background:rgba(255,46,46,.05);border:1px solid #ff2e2e;border-bottom-left-radius:4px;color:#ff2e2e}._fd-ai-message-text[data-v-23304ea6]{font-size:14px;line-height:1.5}._fd-ai-message-text[data-v-23304ea6] pre{background:transparent;border-radius:0;margin:0;overflow:visible;padding:0}._fd-ai-message-text[data-v-23304ea6] code{background:transparent;border-radius:0;font-family:inherit;font-size:inherit;padding:0}._fd-ai-message-actions[data-v-23304ea6]{display:flex;gap:4px}._fd-ai-message-text--error[data-v-23304ea6]{color:#ff2e2e;font-weight:500}._fd-ai-thinking-status[data-v-23304ea6]{align-items:center;display:flex;gap:8px;margin:8px 0;padding:8px 12px}._fd-ai-message-footer[data-v-23304ea6]{align-items:center;bottom:6px;display:none;gap:8px;left:43px;position:absolute}._fd-ai-message--user ._fd-ai-message-footer[data-v-23304ea6]{left:unset;right:0}._fd-ai-thinking-indicator[data-v-23304ea6]{align-items:center;display:flex;gap:3px}._fd-ai-thinking-dot[data-v-23304ea6]{animation:b-23304ea6 1.4s ease-in-out infinite both;background:#666;border-radius:50%;height:4px;width:4px}._fd-ai-thinking-dot[data-v-23304ea6]:first-child{animation-delay:-.32s}._fd-ai-thinking-dot[data-v-23304ea6]:nth-child(2){animation-delay:-.16s}@keyframes b-23304ea6{0%,80%,to{opacity:.5;transform:scale(.8)}40%{opacity:1;transform:scale(1)}}._fd-ai-thinking-section[data-v-23304ea6]{margin:8px 0}._fd-ai-thinking-steps[data-v-23304ea6]{display:flex;flex-direction:column;gap:8px}._fd-ai-thinking-step[data-v-23304ea6]{align-items:center;border:1px solid #ececec;border-radius:8px;color:#aaa;display:flex;font-size:13px;gap:10px;margin:2px 0;overflow:hidden;padding:8px 12px;position:relative;transition:all .3s cubic-bezier(.4,0,.2,1)}._fd-ai-thinking-step--active[data-v-23304ea6]{background:#fff;border:0;box-shadow:0 2px 8px #0000001a;color:#262626;transform:translate(2px)}._fd-ai-thinking-step-text[data-v-23304ea6]{position:relative;z-index:1}._fd-ai-thinking-step-icon[data-v-23304ea6]{align-items:center;background:#ececec;border-radius:50%;color:#aaa;display:flex;flex-shrink:0;height:20px;justify-content:center;position:relative;transition:all .3s ease;width:20px;z-index:1}._fd-ai-thinking-step-icon--executing[data-v-23304ea6]{animation:c-23304ea6 1.5s ease-in-out infinite;background:rgba(59,130,246,.1);border-radius:50%;color:#2e73ff;height:20px;transform:scale(1.1);width:20px}._fd-ai-thinking-step-icon--completed[data-v-23304ea6]{background:rgba(34,197,94,.1);border-radius:50%;color:#00c050;height:20px;width:20px}@keyframes c-23304ea6{0%,to{opacity:1;transform:scale(1.1)}50%{opacity:.8;transform:scale(1.2)}}._fd-ai-thinking-step-loading[data-v-23304ea6]{animation:d-23304ea6 1s linear infinite;border:2px solid #2e73ff;border-radius:50%;border-top-color:transparent;height:10px;width:10px}._fd-ai-thinking-step-pending[data-v-23304ea6]{background:#aaa;border-radius:50%;height:6px;opacity:.5;width:6px}@keyframes d-23304ea6{0%{transform:rotate(0)}to{transform:rotate(1turn)}}._fd-ai-input[data-v-23304ea6]{background:#fff;display:flex;flex-direction:column;gap:16px;padding:20px 24px;position:relative}._fd-ai-input-container[data-v-23304ea6]{align-items:flex-end;background:#f5f5f5;border:1px solid #ececec;border-radius:15px;box-shadow:0 1px 3px #0000001a;display:flex;gap:12px;padding:12px 16px;position:relative;transition:all .2s cubic-bezier(.4,0,.2,1)}._fd-ai-input-container[data-v-23304ea6]:focus-within{border-color:#2e73ff;box-shadow:0 0 0 3px #3b82f61a,0 4px 12px #00000026}._fd-ai-input-field[data-v-23304ea6]{background:transparent;border:none;color:#262626;flex:1;font-family:inherit;font-size:15px;font-weight:400;line-height:1.6;max-height:120px;min-height:24px;outline:none;padding:4px 0;resize:none}._fd-ai-input-field[data-v-23304ea6]::placeholder{color:#aaa;font-weight:400}._fd-ai-send-btn[data-v-23304ea6]{align-items:center;background:#2e73ff;border:none;border-radius:50%;box-shadow:0 2px 4px #0000001a;color:#fff;cursor:pointer;display:flex;flex-shrink:0;height:32px;justify-content:center;transition:all .2s cubic-bezier(.4,0,.2,1);width:32px}._fd-ai-send-btn[data-v-23304ea6]:hover:not(._fd-ai-send-btn--disabled){box-shadow:0 2px 8px #0000001a;transform:translateY(-1px)}._fd-ai-send-btn--disabled[data-v-23304ea6]{background:#aaa;box-shadow:none;cursor:not-allowed;opacity:.5;transform:none}._fd-ai-input-container:focus-within ._fd-ai-send-btn[data-v-23304ea6]{transform:scale(1.02)}._fd-ai-input-field[data-v-23304ea6]:focus::placeholder{opacity:.7;transform:translateY(-1px);transition:all .2s ease}._fd-ai-content[data-v-23304ea6]{scrollbar-color:#ececec transparent;scrollbar-width:thin}._fd-ai-content[data-v-23304ea6]::-webkit-scrollbar{width:6px}._fd-ai-content[data-v-23304ea6]::-webkit-scrollbar-track{background:transparent}._fd-ai-content[data-v-23304ea6]::-webkit-scrollbar-thumb{background:#ececec;border-radius:3px;opacity:0;transition:opacity .3s ease}._fd-ai-content[data-v-23304ea6]:hover::-webkit-scrollbar-thumb{opacity:1}._fd-ai-content[data-v-23304ea6]::-webkit-scrollbar-thumb:hover{background:#aaa}._fd-struct-editor{flex:1;width:100%}._fd-struct-editor>div{height:100%}._fc-json-preview{color:#262626;display:flex;width:100%}._fc-json-preview .CodeMirror{font-size:12px;height:100%}._fd-warning-pop{max-width:400px}._fd-warning-text{cursor:help;text-decoration:underline;text-decoration-style:dashed}._fd-config-item{color:#666;display:flex;flex-direction:column;font-size:12px;margin-bottom:10px;width:100%}._fd-ci-head{justify-content:space-between}._fd-ci-head,._fd-ci-label{align-items:center;display:flex}._fd-ci-label{color:#262626;font-size:12px}._fd-ci-con{align-items:center;display:flex;justify-content:flex-end;min-width:150px}._fd-ci-label.is-arrow{cursor:pointer}._fd-ci-append{background:#f5f5f5;display:flex;flex-direction:column;margin:5px 3px 3px;padding:4px}._fd-ci-label i{font-size:12px;font-weight:600}._fd-ci-label i.down{transform:rotate(-180deg)}._fd-ci-info{font-size:12px;padding-right:5px}._fd-drag-tool{word-wrap:break-word;box-sizing:border-box;display:block;min-height:20px;outline:1px dashed var(--fc-tool-border-color);overflow:hidden;padding:2px;position:relative;word-break:break-all;z-index:0}._fd-drag-tool ._fd-drag-tool{height:calc(100% - 6px);margin:3px}._fd-drag-tool+._fd-drag-tool{margin-top:5px}._fd-drag-tool.active{outline:1px solid #2e73ff}._fd-drag-tool.active>div>._fd-drag-btn{display:flex}._fd-drag-tool:not(.active):hover>div>._fd-drag-btn{display:flex!important;opacity:.7}._fd-drag-tool._fd-drop-hover ._fd-drag-box{padding-bottom:15px!important;padding-top:15px!important}._fd-drag-tool ._fd-drag-btn{display:none}._fd-drag-r{right:2px;top:calc(100% - 20px)}._fd-drag-l,._fd-drag-r{position:absolute;z-index:3}._fd-drag-l{left:0;top:0}._fd-drag-btn{background-color:#2e73ff;color:#fff;cursor:pointer;float:left;height:18px;justify-content:center;line-height:20px;padding-bottom:1px;text-align:center;width:18px}._fd-drag-btn+._fd-drag-btn{margin-left:2px}._fd-drag-danger{background-color:#ff2e2e}._fd-drag-btn i{font-size:14px}._fd-drag-hidden,._fd-drag-mask{bottom:0;left:0;position:absolute;right:0;top:0;z-index:2}._fd-drag-hidden{align-items:center;background:rgba(51,51,51,.7);color:#fff;display:flex;font-size:14px;justify-content:center}._fd-drag-tool.active ._fd-drag-hidden,._fd-drag-tool:has(._fd-drag-tool.active) ._fd-drag-hidden,._fd-drag-tool:hover ._fd-drag-hidden{display:none}._fd-drag-hidden .fc-icon{margin-right:5px}._fd-drag-tool:hover{outline-color:#2e73ff80;outline-style:solid;z-index:1}._fd-drag-tool:has(._fd-drag-tool:not(.active):hover,._fd-drag-tool.active:hover)>div>._fd-drag-btn{display:none!important}._fd-row{box-sizing:border-box;display:flex;flex-wrap:wrap;position:relative;width:100%}._fd-html-editor{width:100%}._fd-html-editor .el-button{border-color:#2e73ff;color:#2e73ff;font-weight:400;width:100%}._fd-html-editor-con .CodeMirror{height:450px}._fd-html-editor-con .CodeMirror-line{font-size:13px!important;line-height:16px!important}._fd-html-editor-con .CodeMirror-lint-tooltip{z-index:1!important}._fd-html-editor-con .el-dialog__body{padding:0 20px}._fd-fn-input,._fd-fn-input .el-badge{width:100%}._fd-fn-input .el-button{border-color:#2e73ff;color:#2e73ff;font-weight:400;width:100%}._fd-fn-input-dialog .CodeMirror-lint-tooltip{z-index:1!important}._fd-fn-input-dialog .el-dialog__body{height:500px;padding:0}._fd-gfc,._fd-gfc .el-badge{width:100%}._fd-gfc .el-button{border-color:#2e73ff;color:#2e73ff;font-weight:400;width:100%}._fd-gfc-dialog .el-tabs__header{margin-bottom:0}._fd-gfc-dialog .form-create{margin-top:15px}._fd-gfc-con .CodeMirror{height:100%;width:100%}._fd-gfc-con .CodeMirror-wrap pre.CodeMirror-line{padding-left:20px}._fd-fetch-preview{background:#fff;border:1px solid #ececec;border-radius:6px;margin-left:15px;margin-top:20px}._fd-fetch-preview-header{align-items:center;background:#f5f5f5;border-bottom:1px solid #ececec;border-radius:6px 6px 0 0;display:flex;justify-content:space-between;padding:12px 15px}._fd-fetch-preview-title{color:#262626;font-size:14px;font-weight:500}._fd-fetch-preview-content{max-height:300px;min-height:120px;overflow-y:auto;padding:15px}._fd-fetch-preview-empty{align-items:center;background:hsla(0,0%,67%,.05);border:1px dashed #ececec;border-radius:4px;color:#aaa;display:flex;font-size:13px;height:90px;justify-content:center}._fd-fetch-preview-result{display:flex;flex-direction:column;gap:10px}._fd-fetch-preview-status{align-items:center;display:flex;gap:10px}._fd-fetch-preview-time{color:#aaa;font-family:monospace;font-size:12px}._fd-fetch-preview-data{background:#f5f5f5;border:1px solid #ececec;border-radius:4px;max-height:200px;overflow-y:auto;padding:10px}._fd-fetch-preview-data pre{color:#666;font-family:Monaco,Menlo,Ubuntu Mono,monospace;font-size:12px;line-height:1.4;margin:0;white-space:pre-wrap;word-break:break-word}._fd-field-input{width:100%}._fd-field-input>.fc-icon{color:#a8abb2;cursor:pointer;height:24px;position:absolute;right:28px;text-align:center;top:1px;width:24px;z-index:1}._fd-field-input>.fc-icon:hover{color:#2e73ff}._fd-field-input .el-input-group__append{color:#606266;cursor:pointer;margin:0;padding:0;width:25px}._fd-fn-list,._fd-fn-list .el-badge{width:100%}._fd-fn-list .el-button{border-color:#2e73ff;color:#2e73ff;font-weight:400;width:100%}._fd-fn-list-dialog .el-dialog__body{padding:10px 20px}._fd-fn-list-con .el-main{padding:0}._fd-fn-list-l,._fd-fn-list-r{border:1px solid #ececec;display:flex;flex:1;flex-direction:column;height:100%}._fd-fn-list-head{align-items:center;background:#f8f9ff;border-bottom:1px solid #eee;display:flex;padding:5px 15px}._fd-fn-list-head .el-button.is-link{color:#2f73ff}._fd-fn-list-r{border-left:0}._fd-fn-list-r ._fd-fn-list-head{justify-content:flex-end}._fd-fn-list-l>.el-main,._fd-fn-list-r>.el-main{box-sizing:border-box;display:flex;flex:1;flex-basis:auto;flex-direction:row;min-width:0;width:100%}._fd-fn-list-r>.el-main{flex-direction:column}._fd-fn-list-l .el-menu{border-right:0;border-top:0;overflow:auto;padding:0 10px 5px;width:100%}._fd-fn-list-l .el-menu-item.is-active{background:#e4e7ed;color:#303133}._fd-fn-list-l .el-menu-item{border:1px solid #ececec;border-radius:5px;height:auto;line-height:1em;margin-top:5px;padding:0}._fd-fn-list-method{box-sizing:border-box;display:flex;flex-direction:column;font-family:monospace;font-size:14px;justify-content:center;line-height:1em;overflow:hidden;padding:10px 20px 10px 0;position:relative;white-space:pre-wrap;width:100%}._fd-fn-list-method ._fd-label{color:#aaa;font-size:12px;margin-top:4px}._fd-fn-list-method ._fd-dot{background:#00c050;border-radius:15px;display:block;height:6px;margin-top:-3px;position:absolute;right:16px;top:50%;width:6px}._fd-fn-list-method-info>span:first-child,._fd-fn-list-method>span:first-child{color:#9d238c}._fd-fn-list-method-info>span:first-child>span,._fd-fn-list-method>span:first-child>span{color:#000;margin-left:10px}._fd-fn-list-con .CodeMirror{height:100%;width:100%}._fd-fn-list-con .CodeMirror-wrap pre.CodeMirror-line{padding-left:20px}._fd-table-view{overflow:auto}._fd-table-view-cell{height:100%;min-height:50px;position:relative}._fd-table-row-handle{bottom:-4px;cursor:row-resize;height:8px;left:0;width:100%}._fd-table-col-handle,._fd-table-row-handle{background-color:transparent;position:absolute;z-index:1}._fd-table-col-handle{cursor:col-resize;height:100%;right:-4px;top:0;width:8px}._fd-table-view-cell.selected>._fd-drag-tool{background-color:#2e73ff0d;outline:1px solid #2e73ff}._fd-table-view-cell>._fd-drag-tool{border:0;height:100%;margin:0;max-height:100%;max-width:100%;min-width:unset;outline:0;width:100%}._fd-table-view ._fd-table-view-cell>._fd-drag-tool>._fd-tableCell-drag{display:flex;flex-direction:row;flex-wrap:wrap;min-height:80px}._fd-table-view ._fd-table-view-cell [class*=_fd-fcTable-slot],._fd-table-view ._fd-table-view-cell>._fd-drag-tool>._fd-tableCell-drag{align-content:center;align-items:center;justify-content:center;text-align:center}._fd-table-view-btn{flex-direction:column;padding:0}._fd-table-view-btn .fc-icon{color:#fff;font-size:16px;width:18px}._fd-table-view>table{border-bottom:1px solid #ebeef5;border-collapse:collapse;border-right:1px solid #ebeef5;border-color:#ebeef5 currentcolor currentcolor #ebeef5;border-style:solid none none solid;border-width:1px 0 0 1px;height:100%;overflow:hidden;table-layout:fixed;width:100%}._fd-table-view tr{min-height:50px}._fd-table-view td{border:1px solid #ebeef5;box-sizing:border-box;min-height:50px;min-width:80px;overflow-wrap:break-word;padding:0;position:relative;white-space:nowrap}._fd-tableCell-drag{height:100%}._fd-table-view.is-mini td{min-height:12px;padding:0}._fd-table-view.is-mini .el-form-item{margin:0;padding:0}._fd-table-context-menu{background-color:#fff;border:1px solid #ddd;border-radius:6px;box-shadow:0 1px 10px #0000001a;color:#666;display:block;font-size:14px;min-width:120px;padding:6px 0;position:fixed;z-index:2}._fd-table-context-menuitem{cursor:pointer;line-height:22px;padding:5px 16px}._fd-table-context-menuitem:hover{background-color:#f0f0f0}._fd-table-context-menu-separator{background-color:#eee;height:1px;margin:6px 0}._fc-table{overflow:auto}._fc-table>table{border-bottom:1px solid #ebeef5;border-collapse:collapse;border-right:1px solid #ebeef5;border-color:#ebeef5 currentcolor currentcolor #ebeef5;border-style:solid none none solid;border-width:1px 0 0 1px;height:100%;overflow:hidden;table-layout:fixed;width:100%}._fc-table td,._fc-table tr{min-height:50px}._fc-table td{border-bottom:0;border-right:0;border-color:currentcolor #ebeef5 #ebeef5 currentcolor;border-style:none solid solid none;border-width:0 1px 1px 0;box-sizing:border-box;min-width:80px;overflow:hidden;overflow-wrap:break-word;padding:5px;position:relative;text-align:center;vertical-align:middle}._fc-table.is-mini td{min-height:12px;padding:0}._fc-table.is-mini .el-form-item{margin:0;padding:0}._fd-language-list{max-height:320px;overflow:auto;padding-top:70px}._fd-language-input .el-input-group__append{color:#aaa;cursor:pointer;margin:0;padding:0;width:25px}._fd-language-input.is-variable input{color:#2e73ff}._fd-language-header,._fd-language-item{border-bottom:1px solid #ececec;display:flex;padding:0 12px}._fd-language-header{background-color:#fff;color:#262626;flex-direction:column;font-weight:500;left:0;overflow:auto;padding-top:10px;position:absolute;right:0;top:0}._fd-language-item>div,._fd-language-name>div{flex:1;font-size:12px;min-width:70px;padding:5px}._fd-language-title{margin:6px 0}._fd-language-title .fc-icon{color:#2e73ff;cursor:pointer;font-size:14px}._fd-language-name{display:flex}._fd-language-name>div{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._fd-language-item{cursor:pointer}._fd-language-item:hover{background-color:#ccdfff;color:#2e73ff}._fd-language-popover{padding:0!important}._fd-validate{display:flex;flex-direction:column;width:100%}._fd-validate-btn{border-color:#2e73ff;color:#2e73ff;font-weight:400;width:100%}._fd-validate-pop .el-dropdown-menu__item{width:248px}._fd-validate-item{border-bottom:1px dashed #ececec;margin-bottom:10px}._fd-validate-item .el-col-12:first-child{padding-right:5px}._fd-validate-item .el-col-12+.el-col-12{padding-left:5px}._fd-validate-item .el-input-number{width:100%}._fd-validate-title{display:flex;flex-direction:row;justify-content:space-between;margin-bottom:10px}._fd-validate-title>div{align-items:center;display:flex}._fd-validate-title>div>span{background:#ececec;border-radius:15px;font-size:12px;height:16px;line-height:16px;margin-right:5px;text-align:center;width:16px}._fd-validate-title i{cursor:pointer}._fd-validate-title i:hover{color:#ff2e2e}._fd-validate .append-msg{cursor:pointer}._fd-validate .el-input-group__append{padding:0 10px}._fd-required{align-items:center;display:flex;width:100%}._fd-required .el-input{margin-left:15px}._fd-required .el-switch{height:28px}._fd-value-input .el-input__validateIcon{display:none}._fd-value-input .el-select,._fd-value-input .el-select__wrapper{height:100%}._td-table-opt[data-v-91131f26]{width:100%}._td-table-opt .el-table[data-v-91131f26]{z-index:1}._td-table-opt-handle[data-v-91131f26]{align-items:center;display:flex;justify-content:space-between;padding-right:5px}._fd-tree-opt ._fd-tree-opt-btn{background-color:#2f73ff;color:#fff;cursor:pointer;float:left;height:19px;justify-content:center;line-height:20px;padding-bottom:1px;text-align:center;width:18px}._fd-tree-opt-node{align-items:center;display:flex}._fd-tree-opt-first{margin-right:5px;width:60px}._fd-tree-opt-last{width:165px}._fd-tree-opt-last._label{width:175px}._fd-tree-opt-last._label .el-input-group__append{width:65px}._fd-tree-opt ._fd-tree-opt-danger{background-color:#ff2d2e;border-radius:0 2px 2px 0}._fd-tree-opt .el-tree-node__content{height:28px;margin-bottom:3px}._fd-tree-opt .el-input__inner{border-right:0}._fd-tree-opt .el-input-group__append{background:#fff;padding-left:1px;padding-right:2px;width:90px}._fd-table-form{background:#fff;border:1px solid #ececec;width:100%}._fc-child-empty,._fd-table-form{min-height:130px}._fd-tf-wrap{display:flex;overflow:auto}._fd-tf-wrap>._fd-drag-tool{display:flex;flex-shrink:0;height:auto;margin:2px;overflow:auto}._fc-table-form{color:#666;overflow:auto}._fc-table-form .form-create td .el-form-item{margin-bottom:1px}._fc-table-form .form-create td .el-form-item.is-error{margin-bottom:22px}._fc-table-form .el-form-item__label,._fc-table-form .van-field__label{display:none!important}._fc-table-form .el-form-item__content{display:flex;margin-left:0!important;width:100%!important}._fc-tf-head-idx,._fc-tf-idx{font-weight:500;min-width:40px;text-align:center;width:40px}._fc-tf-btn,._fc-tf-edit{min-width:70px;text-align:center;width:70px}._fc-tf-btn .fc-icon{cursor:pointer}._fc-table-form._fc-disabled ._fc-tf-btn .fc-icon,._fc-table-form._fc-disabled>.el-button{cursor:not-allowed}._fc-tf-table{border:1px solid #ebeef5;border-bottom:0;height:100%;overflow:hidden;table-layout:fixed;width:100%}._fc-table-form ._fc-tf-table>thead>tr>th{border:0;border-bottom:1px solid #ebeef5;box-sizing:border-box;font-weight:500;height:40px;padding:0 5px}._fc-table-form ._fc-tf-table>thead>tr>th+th{border-left:1px solid #ebeef5}._fc-table-form tr{min-height:50px}._fc-table-form ._fc-read-view{text-align:center;width:100%}._fc-table-form td{border:0;border-bottom:1px solid #ebeef5;box-sizing:border-box;min-height:50px;min-width:80px;overflow:hidden;overflow-wrap:break-word;padding:5px;position:relative}._fc-table-form td+td{border-left:1px solid #ebeef5}._fc-tf-table .el-cascader,._fc-tf-table .el-date-editor,._fc-tf-table .el-input-number,._fc-tf-table .el-select,._fc-tf-table .el-slider{width:100%}._fc-tf-head-required:before{color:#f56c6c;content:"*";margin-right:4px}._fc-signature{width:100%}._fc-signature-btn,._fc-signature-preview{background:#fff;border:1px dashed #d4d7e0;border-radius:4px;box-sizing:border-box;color:#c9ccd8;font-size:14px;height:88px;line-height:88px;min-width:160px;position:relative;text-align:center;width:100%}._fc-signature-btn{cursor:pointer}._fc-signature.disabled ._fc-signature-btn{cursor:not-allowed}._fc-signature-preview>img{display:inline-block;height:88px}._fc-signature-preview .icon-delete2{cursor:pointer;display:inline-block;font-size:14px;line-height:14px;position:absolute;right:9px;top:9px}._fc-signature-btn i{font-size:14px}._fc-signature-dialog .el-dialog__body{text-align:center}._fc-signature-pad{background-image:linear-gradient(#fff 14px,transparent 0),linear-gradient(90deg,#fff 14px,#d4d7e0 0);background-size:15px 15px;border:1px dashed #d4d7e0;border-radius:4px}._fc-title{font-size:16px;font-weight:600;margin-bottom:16px;margin-top:1em;width:100%}._fc-title.h1,._fc-title.h2{border-bottom:1px solid #eee;padding-bottom:.3em}._fc-title.h1{font-size:32px;line-height:1.2}._fc-title.h2{font-size:24px;line-height:1.225}._fc-title.h3{font-size:20px;line-height:1.43}._fc-title.h4{font-size:16px}._fc-title.h5{font-size:14px}._fc-title.h6{font-size:12px}._fd-tf-col ._fd-tf-con .el-form-item{margin-bottom:1px!important}._fd-tf-col{display:flex;flex-direction:column;flex-shrink:0;flex-wrap:wrap;width:180px}._fd-tf-con .el-form-item__label,._fd-tf-con .van-field__label{display:none!important}._fd-tf-con{display:flex;flex:1;width:100%}._fd-tf-con .el-form-item__content{display:flex;margin-left:0!important;width:100%!important}._fd-tf-title{border-bottom:1px solid #ebeef5;box-sizing:border-box;height:40px;margin-bottom:0;padding:0 5px}._fd-tf-required{color:#f56c6c;margin-right:4px}._fd-tf-con ._fc-l-item{display:flex;flex-shrink:0;margin-top:4px;width:100%}._fd-tf-con ._fc-l-item>*{display:none!important}._fd-tf-con .el-cascader,._fd-tf-con .el-date-editor,._fd-tf-con .el-input-number,._fd-tf-con .el-select,._fd-tf-con .el-slider{width:100%}._fd-tf-col:has(._fd-tf-col){width:auto!important}._fd-size-input{align-items:center;display:flex}._fd-size-input .el-input-number--small{width:122px}._fd-size-input .el-button{font-size:12px;margin-left:3px;padding:5px;width:25px}._fd-color-input{width:150px}._fd-color-input .el-input .el-color-picker{margin:0}._fd-color-input .el-input .el-input-group__append{padding:0;width:24px}._fd-color-input .el-input .el-color-picker__trigger{border-left:0;border-radius:0 3px 3px 0}._fd-box-size-input .el-form{grid-column-gap:10px;display:grid;grid-template-columns:repeat(2,1fr);width:100%}._fd-box-size-input .el-radio-group{width:100%}._fd-box-size-input .el-radio-button__inner{padding:4px;width:100%}._fd-box-size-input .el-radio-button{flex:1}._fd-box-size-input ._fd-size-input .el-input-number--small{width:100%}._fd-box-space-input{color:#000}._fd-box-space-input ._margin,._fd-box-space-input ._padding{background-color:#f2cea5;box-sizing:border-box;height:180px;padding:40px 55px;position:relative;width:100%}._fd-box-space-input ._margin,html.dark ._fd-box-space-input ._padding{background-color:#a9855c}._fd-box-space-input ._margin{background-color:#c6cf92;height:100px;width:100%}._fd-box-space-input ._fd-input{background-color:unset;border:0;display:inline-block;font-size:12px;height:20px;margin:0;max-width:40px;outline:0 none;padding:0;text-align:center;text-decoration:underline;width:30%}._fd-box-space-input ._fd-input:focus,._fd-box-space-input ._fd-input:hover{background-color:#ececec;color:#262626;opacity:.9}._fd-box-space-input ._fd-left,._fd-box-space-input ._fd-right{left:7px;margin-top:-10px;position:absolute;top:50%}._fd-box-space-input ._fd-bottom,._fd-box-space-input ._fd-top{left:50%;margin-left:-20px;position:absolute;top:5px}._fd-box-space-input ._fd-bottom{bottom:15px;top:unset}._fd-box-space-input ._fd-right{left:unset;right:2px}._fd-box-space-input ._box{align-items:center;background-color:#94b5c0;display:flex;height:100%;justify-content:center;width:100%}._fd-box-space-input ._margin-title,._fd-box-space-input ._padding-title{left:4px;position:absolute;top:2px}._fd-box-space-input ._fd-help{align-items:center;color:#aaa;display:flex;position:absolute;right:5px;top:5px}._fd-box-space-input ._padding .fc-icon{color:#262626;cursor:pointer;font-size:12px}._fd-box-space-input ._padding .fc-icon+.fc-icon{margin-left:2px}._fd-box-space-input .fc-icon.active{color:#2e73ff}._fd-box-space-input ._fd-x{margin:0 5px}._fd-border-input{display:flex;height:110px;justify-content:center;width:100%}._fd-border-input ._fd-bi-left{align-items:center;display:flex;flex-direction:column;height:115px;justify-content:center;width:115px}._fd-border-input ._fd-bi-right{display:flex;flex-direction:column;justify-content:space-around;padding:5px;width:140px}._fd-border-input ._fd-bi-right ._fd-color-input{width:140px}._fd-bi-opt{align-items:center;display:flex;height:100%;width:100%}._fd-bi-opt ._line{width:100%}._fd-bi-opt .solid{border:1px solid #000}._fd-bi-opt .dashed{border:1px dashed #000}._fd-bi-opt .dotted{border:1px dotted #000}._fd-bi-opt .double{border:1px double #000}._fd-border-input ._fd-bil-row{display:flex;height:38px;justify-content:center}._fd-border-input ._fd-bil-col{align-items:center;cursor:pointer;display:flex;font-size:16px;height:22px;justify-content:center;margin:8px;width:22px}._fd-border-input ._fd-bil-col.active{color:#2e73ff;outline:1px dashed #2e73ff}.line-box{box-sizing:border-box;height:20px;padding:1px;width:150px}.line-box-con{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAD5JREFUOE9jZGBg+M+AChjR+HjlQYqHgQFoXibNS+gBBjKMpDAZHAaQ5GQGBgYUV4+mA7QAgaYokgJ14NMBAK1TIAlUJpxYAAAAAElFTkSuQmCC);height:100%;opacity:.3;width:100%}._fd-radius-input{display:flex;flex-direction:column;width:100%}._fd-radius-con{display:flex;flex-wrap:wrap}._fd-radius-item{box-sizing:border-box;padding:5px 0;width:50%}._fd-radius-item,._fd-radius-item ._fd-radius-icon{align-items:center;display:flex;justify-content:center}._fd-radius-item ._fd-radius-icon{height:24px;width:24px}._fd-radius-item ._fd-size-input .el-input-number--small{width:70px}._fd-font-input{display:flex;justify-content:center;padding:0 5px}._fd-fi-box{overflow:hidden;width:150px}._fd-font-input .el-form{grid-column-gap:10px;display:grid;grid-template-columns:repeat(2,1fr);width:100%}._fd-font-input .el-form--inline .el-form-item{margin:0;padding:0}._fd-font-input ._fd-size-input .el-input-number--small{width:100%}._fd-shadow-content{align-items:center;display:flex;flex-direction:column;justify-content:space-between;padding:0 5px}._fd-sc-form .fc-icon{font-size:12px}._fd-shadow-content .el-form{grid-column-gap:10px;display:grid;grid-template-columns:repeat(2,1fr);width:100%}._fd-shadow-content .el-form-item{display:grid!important;margin:0!important}._fd-shadow-content .el-input__wrapper{flex:1}._fd-shadow-content ._fd-sc-box{border:1px solid #ccc;border-radius:5px;cursor:pointer;height:250px;overflow:hidden;position:relative;width:250px}._fd-shadow-content ._fd-sc-box .spot{border-radius:100%;height:0;position:absolute;width:0}._fd-shadow-content ._fd-sc-box .spot-id{background:#1989fa;border-radius:100%;height:10px;left:-5px;position:absolute;top:-5px;width:10px;z-index:1}._fd-shadow-content ._fd-sc-box.down .spot-id{box-shadow:1px 1px 10px 2px #1989fa}._fd-shadow-content ._fd-sc-box .center-spot{background:#1989fa;border-radius:100%;height:0;left:125px;position:absolute;top:125px;width:0}._fd-shadow-content ._fd-sc-box .x-hr{background:#ccc;height:1px;position:absolute;top:125px;width:100%}._fd-shadow-content ._fd-sc-box .y-hr{background:#ccc;height:100%;left:125px;position:absolute;width:1px}._fd-shadow-content .el-select__placeholder{text-align:center}._fd-shadow-content .el-input-group__append{padding:0;width:55px}._fd-shadow-content ._fd-color-input,._fd-shadow-content .el-input{width:100%}._fd-shadow-content ._fd-sc-right{margin-top:10px}._fd-shadow-content ._fd-sc-radio{width:100%}._fd-shadow-content ._fd-sc-radio .el-radio-button{display:flex;flex:1}._fd-shadow-content ._fd-sc-radio .el-radio-button__inner{width:100%}._fd-shadow-input ._fd-ci-con{width:150px}._fd-shadow-input :focus-visible{outline:0 none}._fd-si-input .el-input-group__append{display:inline-flex;padding:0;width:24px}._fd-si-input .el-input__wrapper{flex:1}._fd-shadow-input ._fd-ci-con .fc-icon{cursor:pointer}._fd-pos-input{display:flex;flex-direction:column;width:100%}._fd-pos-con{display:flex;flex-wrap:wrap}._fd-pos-item{box-sizing:border-box;padding:5px 0;width:50%}._fd-pos-item,._fd-pos-item ._fd-pos-icon{align-items:center;display:flex;justify-content:center}._fd-pos-item ._fd-pos-icon{height:24px;width:24px}._fd-pos-item ._fd-size-input .el-input-number--small{width:70px}._fd-style-config{display:flex;flex-direction:column;width:100%}._fd-opacity-input ._fd-ci-con{align-items:center;display:flex;justify-content:space-between;width:150px}._fd-opacity-input ._fd-ci-con>span{width:32px}._fd-opacity-input .el-slider{flex:1;margin-right:15px}._fc-designer{--fc-drag-empty:"\\62d6\\62fd\\5de6\\4fa7\\5217\\8868\\4e2d\\7684\\7ec4\\4ef6\\5230\\6b64\\5904";--fc-child-empty:"\\70b9\\51fb\\53f3\\4e0b\\89d2 \\e789 \\6309\\94ae\\6dfb\\52a0\\4e00\\5217";--fc-tool-border-color:#2e73ff;background-color:#fff;cursor:default;height:100%;min-height:500px;overflow:hidden;position:relative}._fc-designer>.el-main{bottom:0;left:0;padding:0;position:absolute;right:0;top:0}._fc-l-menu{border-right:1px solid #ececec;border-top:1px solid #ececec;flex-direction:column}._fc-l-menu,._fc-l-menu-item{align-items:center;display:flex}._fc-l-menu-item{box-sizing:border-box;cursor:pointer;height:40px;justify-content:center;width:100%}._fc-l-menu-item.active{color:#2e73ff}._fc-l-menu-form{border-bottom:1px solid #ececec}._fc-l-menu-item i{font-size:22px}._fc-l-menu-item i:hover{color:#2e73ff}._fc-l-menu-item .el-badge__content{--el-badge-size:15px;--el-badge-padding:4px;background-color:#2e73ff}._fc-l-label{color:#262626;font-size:14px;font-weight:500;line-height:17px;margin-top:5px;padding:12px}._fc-l-info{color:#aaa;font-size:12px;font-style:normal;font-weight:400;line-height:17px;padding:0 12px;text-align:left}._fc-l>.el-container{height:100%}._fc-m .form-create ._fc-l-item{align-items:center;background:#f5f5f5;border:1px dashed #000;border-radius:4px;color:#000;display:flex!important;height:30px;justify-content:center;margin:5px 0;overflow:hidden;padding-bottom:0;transition:all .3s ease;width:100%}._fc-m .form-create ._fc-l-item ._fc-l-icon{display:inline-block!important;padding:0 4px}._fc-m .form-create ._fc-l-item ._fc-l-name{display:inline-block!important;font-size:12px}._fc-l,._fc-m,._fc-r{background-color:#fff;border-top:1px solid #ececec;box-sizing:border-box;overflow:unset;position:relative}._fc-l-close,._fc-l-open,._fc-r-close,._fc-r-open{align-items:center;background:#fff;border-radius:0 5px 5px 0;cursor:pointer;display:flex;height:46px;justify-content:center;position:absolute;right:-12px;top:50%;width:12px;z-index:1}._fc-l-open{left:0;right:unset}._fc-r-close{left:-12px;right:unset}._fc-r-close,._fc-r-open{border-radius:5px 0 0 5px}._fc-r-open{right:0}._fc-l-close>i,._fc-r-open>i{display:block;font-size:9px;transform:rotate(-90deg)}._fc-l-open>i,._fc-r-close>i{display:block;font-size:9px;transform:rotate(90deg)}._fc-r{--el-color-primary:#2e73ff}._fc-r-tab-props{padding:0 20px;position:relative}._fc-r-tools-close{color:#666;cursor:pointer;position:absolute;right:24px;top:12px;transform:rotate(45deg)}._fc-r-title{color:#333;font-size:12px;margin:15px 0 5px}._fc-r-sub ._fc-r-title{align-items:center;display:flex;justify-content:space-between}._fc-r-sub .fc-icon{cursor:pointer}._fc-r-sub ._fd-config-item+._fd-config-item{margin-top:8px}._fc-r-sub>._fd-config-item>._fd-ci-head{padding-left:8px;position:relative}._fc-r-sub>._fd-config-item>._fd-ci-head:before{background-color:#333;border-radius:25px;content:" ";height:5px;left:0;position:absolute;width:5px}._fc-r-config{display:grid;grid-template-areas:"a" "b" "c" "d" "e";grid-template-columns:280px}._fc-r-name-input .el-input-group__append{color:#606266;cursor:pointer;margin:0;padding:0;width:25px}._fc-r-name-input .icon-group{cursor:pointer}._fc-r-name-input .icon-group:hover{color:#2e73ff}._fc-r-tab-props>._fd-config-item{margin-top:15px}._fc-r .el-main{padding-bottom:100px}._fc-l .el-main{padding:0}._fc-l .el-tree-node__label{color:#333;font-weight:400;padding:3px}._fc-l .el-tree-node__content{height:30px;margin-top:5px}._fc-l .el-tree-node__content>.el-tree-node__expand-icon{color:#333}._fc-l .el-tree-node__expand-icon.is-leaf{color:transparent}@keyframes a{0%{transform:rotate(0)}to{transform:rotate(1turn)}}._fc-loading{animation:a 2s linear infinite}._fc-tree-node{align-items:center;display:flex;height:26px;justify-content:space-between;line-height:26px;padding-right:5px;width:100%}._fc-tree-node.active,._fc-tree-node.active .icon-more{color:#2e73ff}._fc-tree-label{align-items:center;display:flex}._fc-tree-label>i{font-weight:700;margin-right:5px}._fc-tree-more{align-items:center;display:flex;font-weight:700;padding:0 15px}._fc-l-tabs{border-bottom:1px solid #ececec;display:flex;padding:0}._fc-l-tab{box-sizing:border-box;color:#303133;display:inline-block;flex:1;font-size:14px;font-weight:600;height:40px;line-height:40px;list-style:none;position:relative;text-align:center}._fc-l ._fc-l-tab.active{border-bottom:2px solid #409eff;color:#409eff}._fc-l-group{border:1px solid #eee;margin:12px;padding:0;user-select:none}._fc-l-group ._fc-l-list{align-items:stretch;display:grid;grid-template-columns:repeat(3,1fr)}._fc-l-title{align-items:center;cursor:pointer;display:flex;font-weight:600;justify-content:space-between;margin:0;padding:12px}._fc-l-title,._fc-l-title i{font-size:14px}._fc-l-title i.down{transform:rotate(90deg)}._fc-l-item{background:#fff;color:#000;cursor:pointer;display:inline-block;line-height:1;padding-bottom:10px;text-align:center;transition:all .2s ease}._fc-l-item i{display:inline-block;font-size:21px}._fc-l-item ._fc-l-name{font-size:12px}._fc-l-item ._fc-l-icon{padding:10px 5px 12px}._fc-l-item:hover{background:#2e73ff;color:#fff}._fc-m-tools{border:1px solid #ececec;border-top:0;height:40px;justify-content:space-between;white-space:nowrap}._fc-m-tools,._fc-m-tools-l,._fc-m-tools-r{align-items:center;display:flex}._fc-m-tools-r{overflow:auto}._fc-m-tools-l .devices .fc-icon{cursor:pointer;width:18px}._fc-m-tools-l .devices .fc-icon.active{color:#2e73ff}._fc-m-tools-l .devices .fc-icon+.fc-icon{margin-left:5px}._fc-m-tools .line{background:#d8d8d8;height:24px;margin:0 10px;width:1px}._fc-m-tools .el-button{align-items:center;border-radius:5px;display:flex;padding:5px 10px}._fc-m-tools .el-button>span{align-items:center;display:inline-flex;justify-content:center}._fc-m-tools .el-button+.el-button,._fc-m-tools .el-dropdown{margin-left:10px}._fc-m-tools ._fd-m-extend{background-color:#f1f1f1;border-color:#ccc;border-radius:5px;color:#666;padding:5px}._fc-m-tools ._fd-m-extend .fc-icon{margin-right:0}._fc-m-tools ._fd-input-btn{align-items:center;display:flex;font-size:12px;justify-content:space-between}._fc-m-tools ._fd-input-btn .el-switch__action{height:18px;left:2px;width:18px}._fc-m-tools ._fd-input-btn .is-checked .el-switch__action{--el-color-white:#2e73ff;left:calc(100% - 20px)}._fc-m-tools ._fd-input-btn .el-switch__core,._fc-m-tools ._fd-input-btn .is-checked .el-switch__core{--el-switch-on-color:var(--el-switch-off-color);border-radius:16px;height:24px;width:46px}._fc-m-tools-r .fc-icon{font-size:14px}._fc-m-tools-l .fc-icon{cursor:pointer;font-size:18px}._fc-m-tools-l .fc-icon+.fc-icon{margin-left:10px}._fc-m-tools-l .fc-icon.disabled{color:#999;cursor:not-allowed}._fc-r .el-tabs__nav-wrap:after{background-color:#ececec;height:1px}._fc-r ._fc-r-tabs{border-bottom:1px solid #ececec;display:flex;padding:0}._fc-r .el-button,._fc-r .el-radio-button__inner,._fc-r .el-table__cell .cell{font-weight:400}._fc-r ._fc-r-tab{box-sizing:border-box;color:#303133;display:inline-block;flex:1;font-size:14px;font-weight:600;height:40px;line-height:40px;list-style:none;position:relative;text-align:center}._fc-r ._fc-r-tab.active{border-bottom:2px solid #409eff;color:#409eff}._fc-m-con{background:#f5f5f5;padding:20px 20px 36px;position:relative}._fc-m-drag{box-sizing:border-box;margin:0 auto;overflow:auto;padding:2px}._fc-m-input{padding:5px 5px 80px}._fc-m-input-handle{background:#fff;bottom:16px;box-shadow:0 2px 10px #0000000d;left:0;margin:20px;padding:12px;position:absolute;right:0;text-align:center;z-index:3}._fc-m-drag.mobile{width:400px}._fc-m-drag.pad{width:770px}._fc-m-drag,.draggable-drag{background:#fff;height:100%;position:relative}._fc-m-drag>form,._fc-m-drag>form>.el-row{height:100%}._fc-m-drag .el-tree{width:100%}._fd-drag-box{height:100%;min-height:80px;transition:padding-bottom,padding-top .3s ease;width:100%}._fd-drag-box>div[data-draggable]{margin-bottom:1px}._fc-r ._fc-group-container+._fc-group-container{margin-top:20px}._fc-r ._fc-group-container{margin:0;padding:10px}._fc-r ._fc-group-handle{right:15px}._fc-r .el-form-item{margin-bottom:10px!important}._fc-r .el-form-item__label{color:#333}._fc-upload-preview{border-radius:5px;display:inline-block;height:120px;overflow:hidden;width:120px}._fc-tabs .el-tabs__item{font-weight:400}._fc-tabs .el-tabs__content{overflow:auto}._fc-tabs .el-tabs__nav-scroll{padding:0 15px}._fc-tabs .el-tab-pane{margin-right:15px}._fc-tabs .el-tabs__nav-wrap:after{height:1px}.form-create .fc-none{display:none}._fd-draggable-drag.drag-holder,._fd-elCard-drag.drag-holder,._fd-elCollapseItem-drag.drag-holder,._fd-elTabPane-drag.drag-holder,._fd-group-drag.drag-holder,._fd-subForm-drag.drag-holder,._fd-tableFormColumn-drag.drag-holder{background:#f5f5f5;background-size:0;min-height:90px;position:relative}._fc-child-empty:after,._fd-draggable-drag.drag-holder:after,._fd-elCard-drag.drag-holder:after,._fd-elCollapseItem-drag.drag-holder:after,._fd-elTabPane-drag.drag-holder:after,._fd-group-drag.drag-holder:after,._fd-subForm-drag.drag-holder:after,._fd-tableFormColumn-drag.drag-holder:after{align-items:center;bottom:0;color:#aaa;content:var(--fc-drag-empty);display:flex;font-size:12px;justify-content:center;left:0;position:absolute;right:0;top:0}._fc-designer ._fc-m-drag ._fd-draggable-drag{overflow:auto;padding:2px 2px 100px}._fc-m-drag._fd-drop-hover ._fd-draggable-drag{padding-top:20px}._fd-draggable-drag.drag-holder{background-color:#fff}._fd-draggable-drag.drag-holder:after{font-size:16px}._fc-child-empty:after{content:var(--fc-child-empty);font-family:fc-icon!important}.fc-configured{color:#999;margin-left:5px}._fc-manage-text{color:#2f73ff;cursor:pointer;font-size:12px;margin-left:4px}._fc-manage-text i{font-size:12px}._fc-message-error{background-color:#fff;border-color:#fff;border-radius:8px;box-shadow:0 6px 16px #00000014,0 3px 6px -4px #0000001f,0 9px 28px 8px #0000000d;padding:9px 13px;top:16px;z-index:4}._fc-message-error>.el-icon{font-size:18px}._fc-message-error .el-message__content{color:#000000e0;font-size:14px}._fd-preview-copy{align-items:center;background:#2e73ff33;border-radius:10px;color:#2e73ff;cursor:pointer;display:flex;height:28px;justify-content:center;position:absolute;right:35px;top:65px;width:28px}._fd-preview-dialog{border-radius:6px;min-height:40%;padding-top:0}._fd-preview-dialog .el-dialog__header{float:right;position:absolute;right:0;top:0;z-index:2}._fd-preview-code{margin-top:0;max-height:510px;overflow:auto}._fd-preview-tabs .el-tabs__nav-wrap:after{height:1px}._fd-preview-tabs .el-tabs__item{height:46px}._fd-preview-code>code{white-space:pre-wrap}._fd-row-line{background:#d8d8d8;height:1px;margin:10px 0;width:100%}.CodeMirror-hints{z-index:5}@font-face{font-family:fc-icon;src:url(data:font/woff;base64,d09GRgABAAAAAFWwAAsAAAAAqZwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADsAAABUIIslek9TLzIAAAFEAAAARAAAAGA8FUuJY21hcAAAAYgAAAQqAAAKlumZpyxnbHlmAAAFtAAASCYAAI/QftHWs2hlYWQAAE3cAAAALwAAADYtmfRJaGhlYQAATgwAAAAeAAAAJAghBRRobXR4AABOLAAAAGQAAAKctIAAAGxvY2EAAE6QAAABUAAAAVBzPZgObWF4cAAAT+AAAAAfAAAAIAHLAPxuYW1lAABQAAAAAUUAAAJb1Yvg7HBvc3QAAFFIAAAEZgAABv8mMOl4eJxjYGRgYOBiMGCwY2BycfMJYeDLSSzJY5BiYGGAAJA8MpsxJzM9kYEDxgPKsYBpDiBmg4gCACY7BUgAeJxjYGFRY5zAwMrAwNTJdIaBgaEfQjO+ZjBi5ACKMrAyM2AFAWmuKQwHnjG8mMzc8L+BgYH5DgOQZGBEUcQEAIDyDRt4nO3WBXMcVBiF4TcVCqVYcXd3d2tLS93dFahRd3d3d8fdihV39+J+2n9Rzs1h+BXszJPJbpKZzO59v/sB1YGqdolVgyp7qPB3VOz2qxWVr1elZuXr1SoW+HktDqYK1YTqqYH27V9+4AD4WR3VV8M8++9R4d+uxZHUrmhW+ZejGM0YxjKO8UzgcCYyiclMYSrTmM4MZjKL2cxhLvOYzwIWsojFLGEpy1jOxazwf7OSVaxmDWtZx3o2cBGXchkb2cTlXMhmrmALW9nGdnawk11czw3cyE2cx83cwpXcym3czh3cSR3qchX1uIv6NOBuGtKIq2lME5rSjOa0oCWtaE0b2tKO9nSgI524hs504Vq60o3u9KAnvehNH/rSj3u4l/vozwAGMojB3M8QhnIdwxjOCEZyAedzJmdxNudwLmdwGqf73TmFUzmK2hzNERzDsRzH8ZzAiZzEyRzKYRzCQdTwu17dn0+Vyk/Fn0fFQfz/qFW+1Nj777Nd5RxG+YnqhE8dqhs+fz634ZOI6ofPJGoQPp2oYficokbhE4sah88uahI+xahp+DyjZuGTjZqHzzhqET7tqGX43KNW4QJQ63ALqE24CtQ23AdqFy4FtQ83gzqE60Edwx2hTuGiUOdwW6hLuDLUNdwb6hYuD3UPN4h6hGtEPcNdol7hQlHvcKuoT7ha1DfKlFG/cMnonnDT6N5w3ei+cOeof7h4NCDcPhoYngJoUHgeoMHhyYDuD88INCQ8LdDQ8NxAw8ITBA0PzxI0IjxV0MjwfEGjwpMGjQ7PHDQmPH3Q2PAcQuPCEwmND88mNCE8pdDEqDzDk8KTC00OzzA0JTzN0NTwXEPTwhMOTQ/POjQjPPXQzPD8Q7PCkxDNDs9ENCc8HdHc8JxE88ITE80PSlsLgtLWwvA8RYuC0tni8IxFS4LS3NKgNLcsPIHR8qD0tyIo/a0Mz2e0Kigtrg5Ki2uC0uLaoLS4Ligtrg9KixuC0uLGoLS4KSgtbg5Ki1uC0uLWoLS4LSgtbg9KizuC0uLOoLS4K3yToAeC0uWDQenyofA9gx4OSqOPBKXRR4PS6GNBafTxoDT6RFAafTIojT4VlEafDkqjzwSl0WeD0uhzQWn0+aA0+kJQGt0dlEZfDEqjLwWl0ZeD0ugrQWn01aA0uicojb4WvkPR60Hp9Y2g9PpmUHp9Kyi9vh2+ddE74fsXvRu+idF74TsZvR++ndEH4XsafRi+sdFH4bsbfRy+xdEn4fscfRq+2dFn4TsefR6+7dEX4XsffRneANBX4V0AfR3eCtA34f0AfRveFNB34Z0B7Q1vD+j78B6BfghvFOjH8G6BfgpvGejn8L6BfglvHujX8A6CfgtvI+j38F6C/ghvKOjPKFul/oqyVerv8P6CFGXr1L4om+b+5UHNfwA7aW04AAB4nL29CYAcRdkw3FU93T3Tcx89PbM7d+/M7Dm7c++9m+xuks21G0JCDnJHICEQckDCfSkqcikJgkoAwQDKKQSCAsohvqJ4cb748SqgCOoLqKCImeZ/qrpndmaTTVY//2+3uu6q6Tqfs6oZM8N88gF7BWthQkyMUZh2poPpZfqYUWYpczpzCcOgTAgFkZLPJZRojJecHm8PkpRYCuWduX6UFaJStJhNZ6S0R0nH8ulcD5oqwIbRAMrKdqS0o2JWljyyN1Ms9Gl+gY8lE+CPypKgSNkJO5kv4r83jjTOSCuqS0mnlVgMQmB24FdKjUsT8XjivDj8nUus5ZzSwDUaBgxxrp/7DWfgG3kDl+RM7pNcIodmctyqJRy3ZD3HXclxrKVxuOnQIVIlqXgwOdKI3m0abnx38KF41Z96s+G88wzCIyz7iMBtdxmtVqNrO8dtDzujUWcYfFEuyEUNCXC5RzjGAP35D/YqVmDsTJTJMkMMEy+EEC9wfDKeQv1I5tBEGPfjw8Nxbz9KJOMJgbOhECrG2VUWv8VkUffa7Op14PFb0CpUHWcUkWB3CTTWZzFOxBpteuxh5d/ljb467kFBeJCr8xn5u9BK3uTz8yTCYHPZRWS4m0TJ5Sinw4TYu3fUlrqbYRhTZf5EmTTMm35mLjOPOYFZxmzU5g7MGBuCqZNIZkMoG80UYN7QqSQoMH3kjBcy8CQd4gtZWZGFbFHOJouKUOxBmSDytKBYH8pJUwbo7ACjnllcbJppbAugL9AxPTPQZpxpWlzc4wkGPep+KRiUbloyMNAZ8YPdFf67fZ99koEZAdW4wJqdr4umFfSuko7W5WffE5CgfCAgoRVS4LQLNmYy8Ky1KXa7YrvQHrODuRC8EMHQ8f+AfR76o5NZBetnL8O4eYGsG9mr/UMfFAvafx8SeDviEwOoUASTSya0f+gOAQrJuX4ecod4j430UIqXIAKaTiOg8Sk+XixkwsjrEVClnr1GjBA22oL2evcgWjjorrcHbRB3s8u/JZoWI5wL9fBCJYf6bZpjLjJwvGA0GVDWYDIKPMdizGox6nNajAGV8+zjjEZjOQt4uX3lHHiRXeqWrB6P+rRo2yra2SgW8Uv2es+gOj7oqbcH7AKGPwE8ELfuZhcXEdPRLX43vBMHGeCd9Ay3T3oNU+1P3nH05M/bJXiLHkn9gYijrN281SbCXBW1uYr/yrCMwJhhhboZmalnwrDvJWG2Skpehl2H1d247qKspEThiZMHtjt83kcPn3XWz4iF1xFb3Ts4qL4/OIgjg4Ol3+C1pZvxX//+98Fd6n0ffTTjrIeJhX543p49e74xyPDwDh8bhvCL8D4Wxsc0Mq2w4zJFGGeyUUbJRomkqFPRFwSnLRAY7fICcWaT8CI7+9BpfX3qtX3sF0udLn9Dgx+/Suy/Euv1n/3s9b/+dWdfb28fXjdWuh8SG/wNDyt16lK/ovjRN+uUMfXc5rMZbb6+yj7KhhgHEwQY0KytWlizMTITc2SayjEb8oRQph/lUshdTBdgyglpvh0l0PeWXb9s2fX3L5jb2tbWOnfB8tm7Zs3adeXuWbN2r/T7fB/7fD7/P/xsaNkN912/rK1l3vwH5kPOEZJlZGT3lbtmqS00G7X0tfMEfgPGRWEaSL9U7yBlkMPpcKi8mXCwJCAMXQQhNtYy2tw82lL6c8toCxhsL/05ns/HsR3s0k/CayKRNWH8OuRQx7Uc6D4oMZyPq+MkH7ovnh+LqOdEIuiyCPQPhodhv4RLjAveiTFpiy0GHWNCsJ1jL1cdk8gVMjiDlpjN6rcsEa8ZdavPCDxvgwVxmRZrjsg01ixH8PskSHLKEYhD3YLHY+c446RYKKGNE7zHFfhJ2jfdzNg0+0aDuU4CRyngJRDVWYxnvEGI9sKmEYNhLPSgfK5Q2Uhdmove1QAu2QbT6rBw/HFCm9HYIeSFRng6jEZ0gc3lQwa2gDhcwCzrdeMnGocb1f1ggUErwBqEnXg/rWWFkl7CPf44tO9po/G2cwyGc26DKnqNyG17B7GwJPAQ5t+xuRnGWoEpHpgFs5jZzGLmeGYts445DXCSc5hzmc9Oaj0+cuuTmRA+Eu5Cs+Osm0ycNJ046Vy+OjBdjKapLlVfn6pThzwNATv40WPqkB1GET0GQ34riRz02NUhCNgyGXe83uGoj7sfjbwTIeYmYvZEI5HoiRH4W0l8eBfUog6BRXKix6DySg3oMbvnRRKdyZAg+aVBe6DBgx4jNZd+Rir5HLFuj1T9MWWYRPqzvO8xbtjHyD9yKvR/J+s79DZ58LqL77gYLyHWOi2G9TH63vkqezmbgJ0yzxSYAZiBE6OiY4nwji0on80AYNO6HKLK6CJEEXgPg1GA4fGSYYkixePNFHKJGD8ZD+Cizmh8SpDPRoLpQCAdVBSHJDlK3ye2omhxJw+Hvegab3hYvQrtz4Vaw+HWkN0bDnvVM4iNLob47epTvld8FYNXBdKBt+EZ9trftnupNaxHDTxPSj3/lPouuFDZp6Cip2lFvd7wiPrbV3ycD8xGzanGh2QmXoVNzwV8GiAMwXvoBJWilWkIfYfJTMZK1Enarc1doXo+SlMGMKO+bHVj6Pkm9eXyDMPHlX3qfrRCfQvVwYT5n8gpkUkGvTnotKq/tHlm0NnWRCYsaiL+0j2kBtY3o7QZXuw4m+dqMpe+VrHonHqFPYttBCgmMTlYowyqBhNCjOyFXg/PxmxY0pCfMtqj/edzKcxSdCcPM4OsZg9BenCQbstL6d4MG8cs2DtGLliXWz54UjZhd0mB+mhICUTkOqs9t+7C4Vx6dnN+9rlfOmdOoWlOBz69Zc4JZP8/YU7LXzMjGTDo7vzaC0c+d+mq8SavyWL3yIGQEm9pSWcKRag2XxKU1PDomrXzLpg794J5a9eMDqeYusoYEgzBw0RgFHMw62cwi5glMI7rmQ3MVuYM5jzmfObzzOXMdcyXmVuZ25j7mPuZx8hamIzTStlk9fSNHyvDsWuoBnk9eCKh2i9Ul6gp7q4OVBdB36TI8iGCLH/41lvXiTkRDF5Cwuohkgaxe8WsCEb94Eh5UURsFcFcW3baRDDXit8XwVwrfk8EU5vGWsp1I4MUnFGu6ItHjFV/U/5JZPAEB8vv8kVRvVsU0WJR+wHNfEmr/0var6m/FYtixVA8TBvjMq7RzQxPE6YS4OCkIMCZi2rIUgtyEsxMm/tHBaSlUgj+kKWwogDmmmuWLIkPxuODE7QHLVBN8JJinwmp90Gp8VB+5ZaVeXRFr/qn+MD8gXjVfuOmWGyjPlNnMgun2ZrpE/BHb9c5hB5fUSHFKVF+jFbdM3iwmtRmamAVaU/ndMdEkHlvGAmJpGDDSSCjkVcW+BC4xUIK8Ud98Z8VxSSgh7lIjznVG0pkuMY58+uu50z+WMzH8fW51DEasdOWGDajoq31tWCTzSj2LhwKO4IznTG/yeR31qVsdWW6gyU7ZZxJMBkmC/BzkJkPO8n2I2Ey+LD2oSlRlZoAoggPnY9QVRnkluGwBpfxHkAqKJZRBhIEaykjGB71zMjbEWL2UbOaGOwkWaHYMwRC1LfVP/OMTZJsz0ChyQhLDc5DKlQfIHjNuZFoNHIugRyolWR8BiohuMszUHCGx1aujqnqq/K6LHMVTmBW/hvrk07gckCGFOgKCEBHyF6PneLtQDVnOCCpjrFsg6FQ8O1QMBi6lfgyRuOA0ecklvrZu++e7vItu3uDj4ZCjwaNRr9x0Oj0mQZMnt4yjs/GKW0YgbkyiS6sJvZTmFD7JiQU0bYI/lUkUopH0D8tivUzFot6nslys+ix88iPRXSreo37bLR1lPQ+/pnFcplVsajnG4E2521u8x02ExpW91zsR6eTn+eg///CfoG1MjHo9QWwi5wA2CKBR8VCGBcBGhWzGnSCd2hHAp9IEhCFJqA8rMPJIL4KwCcrKN9XrO7bbTbDP3/qsHBWt2h8z+H4+Ie2EOtGZ7Ys6ot6PUqgoT7glQN18YDilqP9463FpsGW0WVzWwabOue29Le29regN91W9aEVgDZctwmZLS7ssqmvm+zc2UbTdVuMdieHLrK6UXOsb1FLMZ9qiUVkt93uliOx1rZ8EX4mpjYnMmOL2+a3ts5vWzyW+W64hVSs9YM2D8lYKLBi508eDR1tO9qy5foRYXL2oxDmCYcT9iLBBnTj+xH0m0hEhfHo0leWhnBpyFvpHrJ4CNblKf1Xz1UjmZUFg91h5TE3+/rhWGcuIMgSnycrCr9MkbwhqGCCEpih0QYaFfKXDWj9nFFewCa7g1+3Lh0OdZh5qw/oAI2e/K0ON1oAV80yxemuMKfinvQcffX846yzbhwf35VOj2Uyqblz8W8JnbhZpxOvI3RiJqZupvmvi2VWqzvRFbXP4bAhCe87bQjHSR4vrJccELtHhwalFYTmQf0+802ieJPZd6yFPeOil6xW46m8jz/VaNXXz6vsfqCTPLB+M0wPM4e8JVkXFL09nKtC/JTzJ+h8lxTZtuUYry0UtuCVlRTS+KWY2bF+TWd3d+ea9W+VPTvW3LZ69W3fO268vaOjffy4tZT/sZQyQZKdnQs7O5MnP9yzKHv5dZdnF/U8zCZqClPPyOrbHr9tNSn8fVJLZ8voEoJ9gzVYHCuCUX+F1h7f2dvbefxapsIT6cOP0bXBuMmqcNJV4cw9vQ/17tunPr0PP0psEqLj9gY+iQ1RfrHIeKFHJii/6t0aB0ZbelvA1JHG4BdDxN/ybIfq7+hAv++A8oj27xro3zrar8hrw+0ItiOCKpO1hQkrFTOyAzXZUajF8XOg2n4uBgIewSgCbcMmnOrLjpYQsv+idCOh4/CGX4hGwRMIQKpTq/+XdPzo7AI6VWO+5Qo9sG5tLOAUuAg07ACkCTYWUA3WK0OYXUvW7P8Q6/LsVTdcdrzUseXqr1w8LjitnE1CxtVf+c49l/b5Nt5y8K4BiU1oWQOe7i7zgou+fO1pOddxlyxgLR6EvPZV+07y9V5y/8NfXWsbmnUFAEWW9vet+L8YI/S3A96LzRajcpZVWHfWjZxZJ7r0nzt6kLtnx8fntJ5sOBnZtuAflrbf9g18jXoaCquvoy+VtuOrGG28oK4d+AfUb2X80I8JupZygJHMgB2fcVcTF84a9OLfSLmy/cR2MMpOBQzyTh3CP2hX16RS6Jb20qMK/OHho4cZ0hPHaMtCZgVgDScfrU3/2ZQr21Pw166MKGB+lIJQe+qIgVQ7BLXAv9rwwzrCOGU/1LY7Wh2owSijtW34fTsYqJ+66hrlEwUMukVzJ1639jW0MTEc9i61+4OzGoRe2Y4/195e2t2u4JsVpbT2sK4oz9ft+FdHn68VCtZZQ0f/GylXpzdkMhvSmo1smfWZioFQOQFs/Gr612kw6pWai3YcPUxhA7TlDfwQhV9tgNeeME0IZkOCVChKWWd8sjgA4EIWkCsNuAiwm+YVQvQA3FiSmJEAU9qbmBGPz0jgU0t7YTsN4VPBLr3tSHiTdSl0jy8a9b0uR6Pymcl21Ii8LZLD7G22+tEdu4xzrb42fADKqvdodaDjwB1qCan3kJrQcaGWTzlkvs0sv4HqOqOy+hapCNXJ0bnZpmDQ3egyOwKAoCiutK1uoEmfG7/X2z/OnDhdbANQTcmThVBOIWAxmynKvBIjgJSymJRYngRhF87IAkAUj86BZFccpQvUwYQbYaMjdHpuzsJiuxTLdkX65MyGTy8ajEh1wbqGVL+lye5HdR6f6xid8I2TjWbWnAqdNOP0QUd9vSynPn3igpNGQv7mQEPR5wi6W5JOg81JafXH2T+xQ0AHNjEjzBJmFbONOY+5kPmCzhuUKrxBvS+ilf5J53XRaTpJ2twC277marCJCIxgPrAaxCKcI+gBwjkSssWsnC0qUrZQ7Mf5XCJJeRQ6ugFTpgXlk7JSzGS1YFLJ46+py2jb7lCXaT2IT9XaTmK9hEPa0EDs6+2SZG9uJvYYmUjqo2QCrEnOSthHHY0r5/THRKtkcTssNrNTdMh+u1E08u7YXn/6R27OJFpMVqsPH9D7cqjct+W+HtJ69+dSWCrZwAKD/wKW+vuo/Dr8nPyGHF34UHPzQw8hhOxeq91v4CSf24LxyZzFaUGoo3doDJkd4ENNZR72/7JXs26mHujKfsDoNzKnwwicC/1/NYX2MqCJcpSuMRtORnmK1xcoCU3YtkCEoCKRK0ShAwWqo0AEK0RHIRpGgtKOFDtSkgMomqHonh0Rakhbmy0IchFGnpfQRYmkQMckQ3E/96RRIxgrut0dYqEV2eYugtqXbiOUdXfTT39qcUE03mh2Y4dF/X4szUY4rpdrg4dD3YYFXNpgHbVy7dwCDhlaXKKZNWADbzCYRHvA7lzPcevSHWaTRfpfqelHLR1mkTdarnDKslN9idioXv0AWVh3QPos/EBXs7qb8oQReQW8tql7ptNS+prZzSLo1SshB5tRnuIS3N0cmATHviIYmpoMwius395sM7CINXCcrcnp41nuFe7SdmTgnVZT7+AJCc7gheT7Zecah8/nWOOUizPoXg+43ROAex3OyxoDOH7af5yjVSMBivcjGESKQg4gINWKRJZIuNBElkjQ6VpZ4hhrOvT3tY3JZOOnk42NyUuJbyxyYTh8YUT9g6lOvP56wWk3swK/cqXJwLGJljktpffBAoMdYI3k4qX347lcHDviuUdGniaVlB91azgSCS8VWeM553KsYHXa+dFRwWtmCN1WRQMNMcOwjy6CfWS6cIQSF16ZwgxiU5IjkVSA7iBzsgo4S9WBo8sGt5vCEUmKhE1zBLlOFubUBm+LoLVA7N4cKbvHoKl+arcY62N1JqvdYrVa7FZTXazeaLGbbTbz6YSHcbku1tLx4m/gd5gA00XlK6RNZYYsbVFUo6aysHBha5R1bq0SPXaioiX2IKC6VGfINGa0m0x245gpFAsZS7/XQthvDL3gCppQTgurPzEFlRBxbCYwEB36FZTFES259BtS2jRbC802hfA7TrvJDo/N5bJRjx3IE6fdaHfB46x41FcqyZUC2lx4lX3usPXyH1glrJJa2Na2MKXyqQUpMEgtfdLY1dWIEdilxSx7qLS2MuunP7cZne9+py6LNAKVLDFRgiM6FUSeKfHVL6XT+HeZTOluDftCrRpOxlp0ueWlaXVnOo2uSJddSqd+8jH7ffwRzA/C2SCbcQjZcGKCYNT5fzKiO2+/JsaM5ss+wuXCbs5svJznOKvTJYx5AtKYGPSIl4t29VKbx+RwOUz4KZPDbReB0sMfISxcLrjAy/Hj6mcpE/TscdETFD9vRiXWY4esJjC33KK5T1mB5NPnMvTLfp3fFJiENXNUPBhPchkA4c6r96AVe/ao+/ewcrg4mlTPQOiLUmPYyVr2QiQk7n1G3ZkcLYbRcuQMN0roCq0vXmW/D3OlXZshtRyJPMEhNHyC8vAo+07TRUoTxEIgEEqGzkPtiMpyC7hu+waNibDhd+vXdnZ5bFtJa+eZCrnjjv/uwvnNrXy6fWzRapsk8TbPXqtFrLPeYbZ5JjEgdlAyePX8uY1Nllxm/LhHxxa2pTxBzzc9tt8UOH+9hetj3eaPCGuY9tGr7C+gDT4mRjTr3Bq6lJ2EL/lRksqeYRwTFCGq7AkSGfY+VFnb0OxnOxuR+UPVoM139DFM9v0w1zvxk109Ns9OkQyTuBPecac2Yjs96B316nhupDzXydx/D23/KBdfsSKeUzd7bDvJrBB3ku6A8jBBdtLX1+f+Y/oYE1omSOb+1HM+Xl4VDp0cOU+b/Ko/k8FvwYLYNXnS79VWgzbeH7JPswh+JcMw8WyBsL8SMTtyEq6L5EyC7QHkhJs08wsaLiIo2MubhctFT0AckwKecTFAJr36JbtHtLvJnIcucVi5P2Pj5SRpDO0mPHz1c2OkxOXiIY/tKa3vbr6Z8CKfsngo28hdgV9WRmZSgIUNMPMAE1vGLGc+xXya+SJzI7OP+SbzLeZh5iDzNMGLqWScijOakIafFfJsWdChp5SZr0TQQXY4gv5z1QCshsItVoQAsAGyGgmRTLRr2ngaIp0hm0WSbA0xEks2Dug+nfwYgFWQiE9PQM9eMSFPxy+XNjuteKnNEzsG2/dmP1rh96v7/egx/wY/mA1+n8/fEE4kQy6/045Yq1nwucKJRNjlszt5g9Pql4w2XhDMAB2sllvNFgv1CVb1bv/dPt/d/mobDb5T/tl33qHaA/hAjVRGZyOXxTKn+fzk5/2+jH+Dz7fBr17Q2NtkN1sRtggGe2NfIwAnzmAzOVIiy3NGwYTsHpvVaxWtZoM4zw9/80jpucSCOWDW+FlsnAkxYaaFaWU6AX6PMLcwrzFvMe8dW+e4Bk2ZsufjBYJ8UyXjAdRPh5ASkoAjhJAswe4n2SDGBpMK8lEFShhWWBdkwLWNDsY/QdxkPpEr5vsRqYfoSxVlQfLCZiKkBbKI0lS2IVEFB7Kxpot5sqMW00XCcU7De0PpZFrfbGUy4cgkq/B48TebCAdcUXcQHOjAAQ0zckbQAsCXHohEfkENUV2LoG2WoAgIvdlq5g1YDFoabRYOYZcV2yXMsliyY6sLI85ia7QGzYjjLFYLEAbmoDVBMvIu50RGp4snGYcaDIkAwhgFEoYo4gU5KQuCYogHSVwwblB4o5T0CkIh3Nra19oaEm02yWZjGxqHm374QyUDr+1Q0jMIKvc+NONeIu67j6Bo1LpcYOF1DUajwYBNLC8LITvmeKsHY8nGOqPwNh6MkGTleGwPCbJggHcmuTkkGgQvye0IAv0Gb+tQHPDq4A/aWXvIGPIgsyXQYkAWnxUZmoMWM3IjnnM6OcFdTvFbgAQKkBSes9s5fqS1n4h3MjbJbpdsZD+m+OPva3ERpO+60eppVsO3QvHnn0fS88+rixX8y1islFLKLv566VE8XHo0pigx/HklFlMqunu/xD9gTLo+CfwGITIVIC7jFR+q+YlNm6Xw82HUuskLjhqMscZY7NBHMZwIe9Wr0TZveB+Qxe9jhxSGX4O/Cnz8vi57KE5X7kDFikXCSdHVAXO1sL3Y3V1cS8QMa9ZMiBnUZ8SAuP11ggp9LJINfxqCBfVBUdz+BkGG/iFCiUBZpqO9M8FhiRRqetgrS9kaZnJ4AMg0DQpXMNAJ3DOn3nn3WNPjTWN3b5/Nzj4GonqR2rt9O3pa/cMzz1Bewfvs/ewgldk3Mc1MAXp0iFnD7GIump7MnmDY7mqJc7Q6wNZy7mAXyuYVinblElkNzBSKWYmCJsVLmV8JobxzsC6dMn0v0t3m87V1R7Cz9F4iB1uJU6NNzYc+fJZMP5QiU/G9dBfsYqFiwGOJ5Bx2+y+uF9NtzlDx2bbeXJuctOB4OGVqsyzL9nfn62PRrmiUNUP1qgKEr6+1J4xeC/e0+kfycVWhSrKvxfMXjqB+ZXMstlnRbPXTA9l4oi7rs3jjLmeTt8kfCbuiC7M9K7o8bq61t3XxqtGR8URDjxLriVNeDEzYC1jxML7uHCJpreFOy9MLIErTIi+hZ836Bl4kio54QeiDcPiD0EDoQDh8IDQ7dHo4fHpopqYbqO4zAI3FIjdnkmXu7/80eMwGi4nbis5RL8NPhcLh0AGisPNgxYePM4qisbTEIptEMz65dIMoYszJsMn0Vebzd/X5/Cnmymnqr9CVasMEVACWQRERQcpSjhTg5CwBVIRpRwh2mcyGASQQsETE8UQPoODOULk7+MkyhsokL5Qr4zSEyCEIDsycwIR+9GE8jdcbZIlFvM0B9KVotZgtmOfyZgd2WoYHhbaAQckbWYssCYLVabQZeofMsCtbFtlZt9fXYXJCm4x23uo2pdpNGLmtvMMUbzDRmHSrESPXMZZff70/abSTUytGi8/raRIkCdnMnMWlHgomEGZTMYvEmyWzx2H+ECGbyFmcqEucEYioL5iMra1WFiFXvalQNJp5m4u1dXToMd1ZGsMwLl2/InpMedEpzE6dAjsi/shOCRlq1nvNJC7WLP4aPKU6ZVsUXQBA/5IoXhm5MBq9MPJJBF0QjaqXRMrurwlYLf0AkiDDzSRwc/SOSOSOKKJqxPjpsuav+qFuE0WB7ZGDETDqDSTuxEoAkk6MPhyJPBzV5+777FdZM+PQ9ZSOdBaAbFdU06MKgtSwimybD5566sGXVq3IFQq5Fau2rFwwn5wOmL/gQNmj/jaKZsKrPQ7bzKkHXzy4uZBfvuqVE1fkCzPaWuctPLBgXmsq1TpvwYGF81rb1BfIW07oIJO1VR6/eJV+EFPzFjU4Yrxq9XFRwsil6w5V5M4wAtnqANoYQ8FYTH0z9mGMFQDw/iOG34D5qj5FZm5OdbbHjKgPqL3fEtB7JbHYBNloryJeVPq1PsejI2qDkmVzcbSdVFaulLhMmX/znZr2ZCh1Pq2WyNoWom0gWRqg2rdUX2y9ggKKov5W+VDRGqDgN8mO/jQs+78BQRb0eC7USTnPkV/9Xo9NfZMyMIJU3fxNjf4lIV3P4RX2Dv3dA4A3dU2WNh7h5IoTAXEZLXO7YWsj2AbZs/bmf5wHg+8iIvlnifXdb32z9BrGnxNMJqG028J92WD4ssHIJvLqybkcuiEPaNDJUjgsoRuIHvZn0dmlN1l2rsjHBdNcgWNPY83sFhbrstHH8WOH6ZP962dLevCR/Wx4Kj4xQOTS/bk8/OWer3Hwo836YICLevUTKE9T4Nobzw/k1Y/yeWTMT3Ypj/wD/EfKQyC6FASfJOd2CPcvTfVNqnQruIqPnWYcWjO3ta+lpa8VXTEXbPB/dMwI/ESIEgZhzVFvJjpULS1hzYGgRjZoDlPBh6vHZJpywCqO2LH6HP0K+iw+7X7W4fYvYT47ANsbZTZR7FkTiRG9rRzd+/jy5gcLrVDe/lKI6GuXM+aLlKlenacgHyMdt+xYv3bbtrXrf7dhzfbtazZsX3BFvlH2eOTG/BVfBa9XkrzgRQWbR8+EsFTvqkr32KZOYhN1/hNOOcFfpzsjdbJLcoXgkeuqvOoTHltOy5XjrE7sCUzkCHrePlqiphP0yQewN1ugJ02E1wrkO5KFZBGffZ/aeh8++d5l9y4j/pZv45PuO+HeEyr0yh2wSpsB8yf0CmEwKlllYtz7UD8mUyMv1c6NuJz2CohPphNFVECvWl3IZUXPEGIUva+kEWGRG4mQwdFEVMya8EmyLKvEktFXvfgD5K5zaXRrWvmh0W40OYz4h7o8ghCxNj07oJNflXVc9QD+wxHxhlo8wTlloIacLFZDmxsj+GUA6U2RiovmA3R8MIJ+HkEC+P4ReZoC8T9Q0H8aobDRaBnMfzqifgQljJFJe10Lk6I6xksILjOd9YUUQQFySgGckVPyWU2EKcBcFahYmAor8zDhFUKitAC9kuE0sXuRsstkhXCLyRLxUNQgyx91jar+xY7MosKiXCAQQvZTtjY7zWbe7HSJ9nq7q6vTbrTbzRafyW/LdNqRoy6Z6YwEWrrq7aiDNVn9Fq9gj6StAtfOH2OJq8+l3nxz6fLlS9/02Zss0JT6RoePYzf2GYySUzC08CFTdrdvoLMnEkxIXpvZbhalBQmn0RWn8/NldifsCS1A+S2jEgTyP0DPZ2gKF4Bca2d225GT8Ji8ZEUTjWKCwEMqS3lQZJ0LTpqRhT2AsJcIO0pjLyV4AYdcSmv/7Ia4y2RGnM1Zt/pB1mY7sNbvtPEIWYzOaOOs/o64hXcYzV2zB+eYkTlsOu6GLx2XsiPznMHZ3Y1LDRZONiDDLoPF8EtwvZzFwEacDX7FIiBkNqpnGdy+YGjrXGwwzNsaCvo8BnSFUUQICRalrtHCLxXTAR+P1G+HEuKJQ/1LO5oQGkOcP5BWzzwZKnRDxVdxyPAHcKGsQdPFg/l2EM8GGMS46WlI2YQ0ZVcEm93FJp5zemUjWoaWGb1eB88b1cutigX90+iVHbxgVO+ABJ53eL0kwarzyKHO7+IwYEciQDYC1RYQmCYo7qxbm5vO6rlpQzWT8yhzM1aZmMh6hjRzy5xTR+KJJDr589cWfTagd2TZago5JXn+PLfF4zFbLDHX0Dw32hzLz5jX0tA9X/GgAV50Djc2z3CZhH4jauxHKfWX23ft2o5SEXfBaRaM8ZzX7jEYPjPOiQHZxHULTeahm8PHj461xDOBgGRxF0/Kei1yWoeBr+LfMD6mjemm56cyFCh4+DK/RoM6FOe2YU9IUyXGE8obE7qiVQevcG7xotG+rqHhrv7R8dvGR/u7hoe6+kYXLR6Y2Xdyb98pvTPPm9F3Sl/vyX0zB6hs78QFqbaFqXpykLFALPybhkhn/tyTzyl0RhUl2lk45+Rz852RhpH6uqUbl248oS4QqDsBPEvr6rfT0tQa0UuDpbftB7CvBwAjGdVWDmGzarQrNEmGFipaE4GEDSMtkXA8IB9l9ELLte6QPEKSKJIjsrmAN17IyJoULwm4I4pnhpdCc2b0d/YUM+numXNGjxsf7eseXvPfaZcEjfI12zp8Q/G2hW3hzx8/Pre3e2YqXQ8dMXPQ5enpUA+JARGfrQv3Sp8T8RWZ1rPzLRuglbKUyKTqgg1R6IzswN7jO2zNPqhQcqUDYei4xNDfaT/l+uZ0pJKtpDtwt9UniqXP8i6XleMEvFsM6jLq79JxTgK8ONooExX6yvm56gHGkj6m3X0wpovmwJjO7O6dO358rL+9ThuDhW3lEaybcgQfrmvvj6WOMGCVdXcFTun4vHbmjanRk1Mm1GF15SIpi44U99X0KWkwV5LjW6eQw1rL587FK4nnFBJFQm3pj9Jggp6PSAxYg6+iuupQRc/4Pvw0Y6d6hJqQEvZT7QApV4Fd1/td77ksy1gWLXX5D73jd+EnXH70t1tdfusy7Hf1KupVzro6J9rOEBgJeMpZRzhfMn0c9Miihxoa+HUN71D7dRX3J9V+qt7wJKAoajGC5gFUPxCJPBuNPguw2w+E/e+PpRaxlaAA92uMdY0gLuvy/royZlHYS1Kwm8xlFjKrmfWTdCOjRxgr95RakdMd7Svb16VS69rRbe76evd6Yh0/a9aXIAbi1T+l1qfAfJpEr/PU13sWz5qF88SzTs+JTtLUTAPut0nM2+5A30+QSVdBPVtzaTTN0PsTZKwO6Xj7tyi/LQyt7znyOKIoZalGCZWTpFK8Hn2hFcspNMRaNfJXDWsu2qK+QGngVqCZN7xCvK9QOvgi9SYav46GDudslX5CSOyg51FPQKIyYPBo2gJlPsZTbITOwWyVFs9pzPnT5RdOHojaQ15c9dSs0VCOH6Mk23AUpG1LtL09ui+aSkX37SM34ewzWa1qRFmmVAx6LdLeHtlH85FUE8nHRkiP/E3vHlFn/P2NMv7EeG5bKponpfLRVLfFlCcV500WC1EAVj8i9myaRnN1a2kkl04//FLntQ5Nr+fI7R4UBpFQip5XlxTK1KL8kyybPcoFEg/9r91jMXIGk+S2E6+JYwXZfQy+ZulJi0XgzEYFNStusxWQVrOgqC8prvJ5kQ/Yp/W7DshJ8eNoO/C0OMZSChHOMMAQaEK+4JX7cVzXYqoRMLKJcHebbyoZyfah/p72pitvPD8QmduwJNWYnHd9n3/dRepbda1+f2tdsrMzaXW769xu1uJv7Y6oCf3ijFfBIjKBBMW1X43n3/T7WrcMzbatnXtCZyBome2Ktg99qnNPXWu21d+5sHOA1FHn1s/IfLmK7xU8phbEYH5fHgwa01w1PjKCH82V3s/lsCNXdjcfepBhymdw9tbWP7UmfBLqfyBHqs2hV7Xqr5iydm2/uQbqNum3xwD9V+Z0Eamhxu0qa278ZR/hZe1Dj+4jHlWCevfB87mwV13hDZNRCHvRfm9436EH2fmkfkJH/5a9H/aGIN3LKMNfSGEqkg4RzUS5fMqFItokGnCjIk0CfJTEJFG7cuL6JYG0s3f2cN2OkFfqGR8Prmxf2bLtjCXBYBPa0bxjx/GhSPPOqmw7g5LUMzYWWtmOXlKipkxjR7jRJPt3BsfHuyUpdGL7ic3B0PHbtjWjHS2R8PE7djTtrMk2Nt7j8UC2Ctz+Lvp61fmgMmTc2ogPNTaWDI3oFqoQ5qL9+TM6VlbGBv0ZoNK2ItPJjDCz6B0T6wCSkfP2sDe6lQqGBEgvd5QQ+v8h5y/HpHhzXKIW2l8TGPc2tDR4qVX6+n8yG35Z0qMl3Uz2qnv+73Po+N/P0c9rxuFf6O/np25NdeCiY75JGUe7md6h0Qh74gLmJGYX8wXmq9rOSPR+8MQB5x4kTAJhSrz6GHTl5pHaTIfXhI9cEzpmTTcQHWmiN3OPfjz6XnQP0Zy5l2IIX9fvhrlHO3Z9zz1EHYpY6sKacsRTW1AvMLkcayG6OvdWymhHqGmZe/WrPO6FlyDvUZuk7qP5y6o/tIbqknoJ+D1SviqF0e7keRVoOqJbQG4JJOcal9B1eR7zeRiZ25kHptA3cAvaoWCqhpNM2JGuFg8Z4oRDokUni4qkJ0ChuCLp4kySS9FiaYpb06qXpSykcCSQzVMpJ3kEKauXiWosmZieGwB+UqhUP1BxIRcOV45U/q6s9FA0I5vHbcNWj2RH5p7PmuNRI9fR7WAlC7KyFo/B0d3BCbGGn36PFVhbtt3CDZhL6uOWfs6aytogDqHHEeZY6+zZVpbDD1jaszYDz34PmQfU6yACPY4FDInPcv0WyMgbLIUOtID8ppXVftPj9iST9zq60gb4GZG1SD8wQJq5ISbAexxJ1aJ0IWILCcWA4olOAzL6WavLwMU9nLE5ZTKlmo2cJ2EwuKzPubIZp8FZbxTGNvL8xjHBWA/BTNblbm50I9GEwUUyifS1tXmFDWMzSIIj1WbFJtNcYeEGozfVJrOuYNWPsUjYxXniHFTPkp8yJjIm/ec1ncdX2a0wb8p3qRAa5bA7Usi9N2hK1ilbJOdKSu8QG4MLz/1ZHM1mS7/Oll02ATkaaI7/I0c7Sw2sJ5vJZEv+TDab0d7jZnY+u/b/6j3s5Po0NUIvUfuNGkG/Kf22gP5UKKieQtll1yr+QwdJDnaOX+k9dJD9dAH+Dt1F7DL+8CTFWeOAs66ryFh17VTyGgNIP9VD1THJCwoKJb2KOswvKwZgih0W4gSXL59cAAyECPp7MMWFefRlTW73GhAiREPZSLaR1zTlzUP/sHmeFJyEW8E/dTdVBPyEszolViLxmhbzk3dBPPLYIcHhYRNU0/k1uj8x5LjqoQeByKHhTyCM0bDHdveTAsdZXS7+SXL21YM9FsTYPE/XJFh4mvAJQzYXcub2afa/2T6Kw3uzMlFdkLKUM0SVkojKrpTN6KHyjWWC5NH09DQRYhB2Amg7wYJwA0Lncbyw7I9W7jqD4TrO+sdlmMUG9jyDaIAE47I/YsSaDHs5bi9v/cMJRp47jxXZLnQdb/njMgFCWj6oAJF8Wh1/QqQSFrETqVA9i3Td6icpn3iUSjFgwGqlGDkycFJSrsbpcZYjlzlUjeWEIi4qZNDvbC6PFT1fJr5E6HkTQmXSjKjl4G+Iorp7YuCoOBd9TgywCSTVu1GZCnlehJImpwk/X8b+CTkgikEo7aBj5LZ+omnr3gXFGY23+4nKPoA/BgjMlFHNKN3fCflIiUegOqIyVaokQ1JMFFEOxsQB/bsVnbN07uzmVl/EN3DaDPXyLSI2sZao+R4rxlb8JyPH2SVJ2NraPHvu0jfIuaM3Zpw2cKoYMnNmMzTHbdX4ZgYGHwA828o49ZUaLa9RolvFbvIrhz5Q/HhPaQvec+gl9vuHBvEBxV86hA2w8tTO5l5NxqSy32QxEwKoNaidESFIQxlntwHQBwRaqUiptWEjmkWyExKiNIuzUCQnQaiY5KbGWbJvdvKbRNp0fyRrGbBkI98mgW99S7RbTIZvdbVBDLrnm0IkZ27KPcCZLHYWN4TDDbmG0l8acjgRCiVwrgHbGnL9dnPpLyY7VnAY4iCl9HqExXYTtpnt+l7xOMwrF+BjqQmNPkkppDB58X7MSYR8hdHQdDTyWQ+99SZrw/E8IXRhtLC8gyjxjaBZ5934tQsb5kV2fVX94Ob7vCH0je1Ec3941rn7vnZBw3yIR2aID2vwZceiazYmlHWjY7tnLL1jOOQ9WBIJbNwO0fHY+jlju2YuvWMk7D1I9Xl1vXyBarQTfbk2Js3kmS7A3mYwTJG8JLwOEStpV4NkCdWtSVAEcu9mUX/i+hOd9Dw7sLkO9W7atW3d2r5+KzvCIuecOadtv0T9ZIT8sfNHSus3oRiYzZq9e/lIftO+EbaYX3niGZs22S7cfHJvP4tO2Lz54KZNj2zalN+8eWyk8lemWV7Dv2S8BO8lq1AOYRsWiH4fdGg/dhPl+bLWfIZo0yexoX/ruLN7Vc7Qta5bDWaWdVljc9LCwnNfNIfMZzeLYck8ZA6L15rN+BfZE3v5GZ/aub6HTY1vXDVknb1jpvpDM+Qye0OQy3ytGDZXZKLfpXhWkBmYCqdKlAl7wHCkLJVyeKXyGWCydZYvYElgzw4yyF2dVDpMPGs2nO70+WJ+n3FuU2PB68+1piSDu2izooLV7G011y08IoLxbSQ3kGLollTzaCYY62gM+nl3OhwIOxwBr9udtCqpvjkT5xye0HkaBcAURwFXnBZX43Bd1Dhxyud0KAio4W2xMaIBOaWQcQj2uDVryAGFXWLAvEtETWKARARJRBAetaRcFYtdpRyLtaFuFEk5T0DcZRZ3i4EHa4N9ugqufsb7KjZK9UaLuvRD50vho9xVyWl6ex6t1aStMplpVJqq31wSS8JuCwgn1WvsRzL+qGm4UW4qhlRHqNgkNw43ofdVhy4Ez2TUraI4e7borjetMYGp/7A2uBEAOi5gbx21rWyE8KsdoUKzLDcXQlQMPliWkZP6XhbrxDlzTPVucbVI65gUPhlhyapebHWwXiu6EOrW+ZzP6vy5Mq99EeA8ZzKfqbkzckraSp5SaD6d0tOi3m7R7o38ToA4ge98hxxs/o5Dkq6IoTmKoh6MvU3GVj1vimzo3mBHEMx3dEdLAItNkKCeHbwjkqNcaA3RzL0tpj4ci6HRmDpDz6HnH9YqJrmHp0yZOP+o7VkpDbYdtmsR2aAdk4vEs9F+NoXaAc1gD1f4nmojm51b2c1zHe0F62ga/To5M8EqA4m0zb31STEsNp9tDnnpxjV05A1uNL0kl7Faj1s3iBtnLhxu5bj2ocXqE2YzlJTovjhkDmn0/qvsi5SnRmC9l6mjt9EnoEXOKECKqFPJs7KQVOCJw5PNg+WEx+3UrsxkXyitGsF1p3zh7Kavbzq96cvo+hub9kbvbLpoX9OZbGkVXlN6C9fh80ur7joZ1w2rpt1Nt5zWdF0aMv0JMiErZEPzIN+tI6W3yvvXDexM/YboMJMkeuluInnU+ixJl6iAiqgo2+m99kk3OSQErqy7v3e0OPAJdvtJjlZ76U6H4wtjeHC89INtHWcUOjdt6sxu3fTH2MBALDQ08K6vtdUntbeyFjvJ2QpFSMlWe8t46Xvj6Nwz0mdcuamr65T1A114zUAsNtCTiK1vlX2tTfU+XQb/JXwBOVnlJgNbJYCHt9xmabD8Fd1eFr/3WBSr+p4FPWqxfIBuN3Eclb33WK3IaSFHFSgs/yt7M8sc8Y7sFjoitMuTRLmn6oHxaUfakyznYW869AF+jlw9s/uu2F3Z/bHbo/tiNyVuUvZdeXvs9itvit102e3KfpwuXYPTqg39hWUOfcBaBkrbb4Ps39uv3P6LfcpNz0E2tR4CDeCJgItXQv4zBlQbeV9nzfmBw8+Mn8icwmyC/eas8rcMpnMudmqt/RqVXqIDWPYLUyUUa6BV9Ghaa+PkRPmzRBcTtdE95/LY3BiY7x7J+Y4yqoDBfybaL3FdWvUrXfslTrB+9Cuqpd8XI/r5ulFHSfXkuaDGo6/Bbx3Wj0v/E73G0pOj5fPWPYhe3MFajqKJXlqk9QVRSW0l7+ndaDSY3Gb1AY2aLTWLnuC/2vbxTwletxlRKVwL4ARMRQf329BuWb8FbQRmzbYJbGUCZh9+wsMdzcMsz0dRukjPhVUhiHI2Ix8eS4iKI+UtsJ6wdpAjrMbLPvSrSltyubMPvcPK5Cm93MshluXsfHsH5xC5Xk4w8Nw049gEqbj0fvknNEKwRlqlqsPqd4ZRsc9g5Qwc19HBme1cnwGVaiO4Ui9n4Vmeb2/nzXYefgvpeh83492wa4SZVqIRjMpn6vWj9tCDVFelLG+NT63HcsfQ9pkztw+pLw9tGwJD7jdOH58Gg5oyxFW/MUwSPktTacoGYuFdM7dfRkqCNZg+fiOJA2vwiLHVd4236KcQZzHHMYuZNcxaZguzk7mA+RzRPqodd3rJ9WHTo4d1ak0hhGTNyZSpzyjWBBC5+YWI7bQbYEiPVHzoxmcqp0Nt71SOb06cH33m0oiRXAzgXhE5LXJEo96KouqvCXVNXO0OgooP/9hjmziAOqO2bu0+6dKNUAAy45k29yWa5mHZupSqJM4edNe7Lp1B7ye4eNBod9lMVfcoegGekztXlk5w8Y92eleoWicpZMNebaFwRz4O3HT087S3rRcwz5r8xgULeLvDbDDw6wUzZ0boSGdzNf76VGdhf7xe8JoMRqiJ4wwWu4Nbb0To4OTztJPuMR1mNjAbmTNgXzkfZtTl09xTJx1dt2lIrFJhDbopyaDfaKCTSHRrpdhdcXqT7ug3e6y2uTLaTMnQ2QWon9uWdq82mRSFNxisDievKIQGUBRCWYBdtz5ya2SSOYZmy7jLlqYau+WfctW70zaX+pxIauSdDgvH8RM/4Abb9N9k2r1CrLPodSAT9zk7mCjgjtqp4qm/ZTFx62LNTYQVkIWZzQc3bz744qrl5BTL8lWnLr9h+fIbHlgwj5xgmbdgRTrYGATjJD/OWjYffOHhzSTbS6uW5wszln3l2zcsJ9keJPlvloLBpmBwu3btf0Xm/3jNnc3Th7I1+ETkKEcfS2Os8dBHl8QejIEh0LaFkLdUS5aSt7lEmbxN5K4aUd+kp1U1/sOPdTygME1tFCKlFuj5aaoFGkZs21Fe7AxTUMIm9RUxKl7GY97ucvJbjqFDsU/EroBZvd2CLHcLbqcZ88Yv6PTlkXG/1dN7cyKnd09zd6YXBtuQTkh6j4rLqZtGRi6KPRWbZNSP+3i+j7OaBcFsPUaTWw69jecTBGhfxUIn9fEuvs/Acmb+HEHkcJlfdAD6IAgU4KYyVa0zlZV4jAxJoUhUk4lOJTkzxNo0GUEKEexD325bEJ9UYlR16Cifb4jqBDUGCIgeC7QHXo8X2WKjerbVdr3LanUFF8LW02gx1yPeLogurtPotwl70Q7B7RY+wSwO+NBFhAYuXU3sWEwjbfG2YEfAEUxK/4MXwq77ZGfy8y29Rutt7mzOHWTr0Q+TXewIkCn/JbBGIW9kbVHhJr/pYpMfocZfmaS1Xvu7hCp+l9DLHcF3NUL9XSkZdAxPuue9fM/ttFcb+Y/r38iYxr2x9CaaphkHZxxjx/t48ILB/1GHyMXb6DH97pfy/eCT324K3LNIERCFfkwrf4w7vS+rXAt8zOu6X9QuFCZXB8/Qz9xRvdAfTefsw5RXStYEauRrO6P4pWi01ByNfiYS+UwUNUUui4AB9zMkqnRPOR3/iJ5mfLn62ybqKwTv0GmXn+oyRjLKRaaHmad9I2eyfA920CPEocMOq0mHfZuM5nuTnDlT6UdBUFD9K7LeSSO6acRD6gq0H7US/2eIddZJJ2mfHnmdnlRzfALkOlofgjDNHvaGhj9hBZLuDYVIODzyCRquDV9Um50Mh42293s6zVJL8Z7IrGI2M6cyu6dHwdTqs04ZYGtUPeSjhNhIpLvV52vtjpT+XPbVUHbq9hhyKYr6bmyyuylv8wV9Nmrlp/BPg4C5jcCxmyb2zDobKRvw22z+u2zEnuzVZdTkzl+JnkMagJ48nmHilTNHfSgrlTFTtuZuEuqDvYNoFcKUyWfhkYmVzStctkh8ipCkKUXiz7P7y5v+iPa6yyf2fXKlkG1pLrc05+vKd92O6voSbGZlOLQyw/72qhV7gxqkCAZJS4P4ixN+kqL+dMmS11ateq3l299uee2hh177+tdfeyj5WvMDMF/kqj0wDjTOxH07JzHbmR3MhcxFzBXMNUe4e0e7EaqCehLJdFRTnpUI1kTgRDtCGXrmIq9NAAIzAKpUya+1a7Ti1fMpX3OmdXrfNiBqeska5Kc6kK5G3shVZhMsmzpC8nyKUiWASeJFNOiud0OgdO9R0q4uX9JedlHf4ajtqzNmtEdWR6OrI9nIDyLERHSbtUA9n9JIps9YXBiRIKmfBg69fbTUh0kFp1YuuzulYnnVlxX6FQWe6IBHGicMw0z6Fki1bvvx/4Z2OzclJjRB5x4dJL4XQXXQcW9FUKO2u2v2SorrH+tiddK+Z2gPUNpSVp/ROgt1V76Fdg20swp7Ln99im5F4BMUDdfXMRhNVaxGS/+80fPnzj1/dN68zjWdYOatn1dcVwQzb56esLd8Eg9fM3r+nvNHBzvXnrG2c1B3aNT72m2EpioYrung9zCzYaWtKONktO+1r2PpLASh5sJXfYOO1gDRmoBMdErlolxMFpNCUZGTQhhXh+Ty58g2bCDQfMMz6ssUqld9GKoMXjUzMjio/jjodgcDjZYGvoFTLI2n1QbxnYCPqfu1r5ChFYATECxif/nDYyvc8YC9dIX2JQIyTJnSfNQuKYoUFGLOZNIZE4I1obL+yyOV+/GnknAe63b8ak6Ra0LCWfZsX01uq3l8sXZbzeK1c86ePfvsq4k1O7cin1+xiVjTuLJm+eyzryGlwBrJrTxlZS63YvOKHFP9LQIi4yRfcZzWF+kILhnXcclkkiwAInA7jOy+chBlJj4JlPQSgdxhS2Tw0B9YLyI8wcpZkP34L/qZgiKdfSspH2sTYAQ7/gWew6QDHtIR4g4/RSBlJ86TyxNnzI1Hu5vnGoLmPEKQmwfuuYc6xLrnzjvR/OrQHv0zbg/kyRfYWsMa33eFTsvu1/m+Kygtuz+eL4a9mwm+tdkb7l6zNezdRKrZRAI3VAdQUfuim1dz9DPM/83+nW3RzxzS6yLDZS3rsPapAcKQ0j6+olG79E4w8tipKj7Rh8GE3MLJRGEAJ1MoiRc7jGs5yfqSXTYJ5q+ajDiOzb6Q7XvmOsvjtpDPDGGj+BWzYJLtL1kkfq2p2bDI1hE6cKnHzaLw1/0Fv+nWMGd3CZc+VJ+ysRHB+YTFjsPYHQyarzP5rS/YAy4sbBTAAJVsf8HqN11nDgbdkMVuecJjW3VbvcLVXeTO1ZsOLLFis2HJgfq8R7iozhD2lXngb7C/Z5sA+zmBzpftzLnMpxmGiyWVRLLyXyQ3i5e/8SJ56bHghGAjbQZf1lskBzDJ2s3K3iJducm8XpQe05S1+9hkLwtrt5DCfNHjhRUM0wQ8sJbJzKn20BmEjXGJTacb4wGfk51pMiYbLj9h9apTVszq8Luwf6RtrCUZ9IocJyJjwy2GHUHeKDrD/QCi3AFvvavDbfU2981bunDhnG0hhee77B5vKNp4a7AFsLjmUHeoKQTmenhQqCV4p+aGloSbgsHmYMjA13tj/oCH37hl3colFwTCdudo55K2LM9eM9ICc5vzWgJmX5t94ah7SISac+5GDrNIMDk7TkfJ5LyOHpulznfS0LxFq5a7ZU/AJaMeaHqoGZ7LgPaG3wgOeEIhcGYSJxS6ERz47TJd/7jO25jud1ko609X1tIku0fnEL0lBsVHH9U1/V6AwIviMbgSb4riY4+R85Iup/CCKEKZsm4wwZ8nf0N8NeCVNzBfZx4sv7/i/A98R1z7XHhC+3J4iMrxyZFsWVCS+hWNdJ5RbUrI4tUOnZLJSe/308+Wap8czxUnTskUw4jklwT9O6n5It2+Ku2P66Kmcwhf7cTam5/38KJ9PMDHOcR7Of6LkRTiErxkttktrqjX4m5ZkOISHDYYJavRxlssUsjibfx9ixwKyUuJ1eKpq2vy+6/kZnJxjms0DBOHDgWhMcmPlwkE7XTZyJM110VfzH26zlHXrHAcZ5BsZutnOC4W5TibKNoFg5ET7Z3xhgjPmXkT5iwCy7MGwWgPBxqQL3Bq0OcLnhrwtUZ6I2AS7I5tHPc4h8/aQZwq/n2Zsp7mOSvOmXXKkuIEooecuHISGgggHxBGAiGO8kdHHX/W+dK1P+s9AR60676d8HcMdPEkNYueS1+n/m117Dokro51qg29d6O+c3uZCr/1lipYPfnGkSmgtQnJiEWyCYNj0U90uoLFZi850jnp43cPtZXmLUD3pdQxZCHO+LHAd2kHPpAqzUPz0P2QW/0A3demjlPafkJeUn031UZmJ3MmczFzCXPV9CQo07z/1F3m6f1bVR1L8jLFTaYZnQM17VKaUGYvFcqAqzO09pISYB2vXU8K9Wq5AWVtq99brnovQVOrc5evM4W54ZlWf1/NfJX5GnMHcydz4P9930+pWVBdE6r+jJLzPzhC6v7yQRO0gmD+Gh3gUff59/jB/I9/xA9mjHRn6W5yP17oIDH/yfFaXh6vRu3HEBNSfxcMonpwyAf5yjqHmv6Cp+obi9OlLWq+CzjR2SiDDcekLa4j/Ka3Y7cqyq2xaVAUn4p9FAPzka4wyB1Gs3f/G7S6PD2KXO0qU+TP0YvlYYsiO5pGiqB3YYer2aEuJiRdVxXhzUz+/kCZx7BgmjfM1PCAanjC9JpDKEhPMYaO8QnV9yLofGjGpZEIubouggWLcREvGrBhkcFiFo4BKtRPCMV+HiFa1asXGS2C2QLlsEGkNN1f2J+yhMtN7tLqr25VUiBHDQjCkqxpG72RoEjUw4/QRnZJtBgF86MBe4tj5jORQhRHOqN4RWm/NxiSfuaydfeb7fzzUiikGqnSj/p8jLVGO6NqI1io387aZoRzEfRrCM0KS2qjFLb29ZlxWEKveEOqql0wO4F/hSfxfc5iLmA+y1zD3Ku3xI/+IwiYhmtp1/14tEs69LutNGzLCziofrdHUdYwqcMvPYYUimtJHjkLryJL9CqdPkRyZ/8V1OuLDSnW0GFArOC0iWZAoluWec1mQ9qADEav2cQjc0ukvvlFA+QxPJTu6FifTqfd9MThnQY/x/kRQlYTZ5AbrKJkMEj6pzreQyZkPAzx+mjkqcaqP/XsYIPBwPNGo8ibhKAcbHCb6mycwcwZEceaBdHol+uTPYa/G8B09y3u6Vncl67P1YM50dBuiBlOFGDmNRjIdZbuLRBuN1Tu4ngRaPmyPGNA+1LU4RfqHTmu6tiMRp9TTixLKFeibwRgJVuW+uVhxu4i1DIlw++84QbcRTyPkCgIqb9gUT/G/Vi43iAIhuvZ9RBAaCKM/xyWSp+lH9I7WwoPl27HN06OkCG7AfexLNvAGyIGQcGseh+N68d6HN+AWY2n8mv2eTYKe3iK8s8YE6rMVhnRK3FRIRenjDJy1ys9aaN96QOR6XcEHlGWqsnfpT7bllZLxQUeNxDuxfoON2KTJUFwe6yItXlMqCAKgqiWTJ56j0l9VhT+W+mOxbpHiBWzE7Bk98Vi6GlUSC4oqiUorz6bhLrYxNZPrB43KfusVrZEKkIFk8f2pl4erGFHfbjeHuuI6WN7Jv4QVm0d0NtE42gxw7gnqLZEbkI3F+BV5UIl7dR31f1KiVwckYyavybhi7t5p9MKM3O3WO/BPcQWwXKbSj9Fe7QkQT1N9yBvVRxkUj9EIVJAfd0UcKM9KCQ4nUQDQ32DVLZtN1B/FqeL321y15de2S2666FqT70I1VwrGAxWp5NXt/C6552qOMhvQWGSFWpyB9C1KEyrcgo0zOi47636d9er5XjjVK5F+Fhn1XyVcTI/quYLSvI042pRp6kv/Y6Qu2k20OtsxsbwSvr18530C+WXqJ9D0Ack4mUaEVb/iKTDIkqbKH6E+mC7f6riku+fb9Cr7h37QnVgX1BaT34PrJ7xffqPQ3LPGB4MqRygQP8Eh6BAqInUXMGDnq3SZyx/1fWYskDCl4zCg3StRralfLl06c8VeRsR5RFWAFVy2DmCZg+j2drdBez8aQjnRsp51UeImqGm+/06+xrrqZEvdxP9jRrZco2ShrN6xI6EeMhUMhfjBUmXVcl0wyP7R17f9ZLLO3Gmq6v0085LsgczmYNZcloUfzGcDYNR7w3nQqFc+A6HfIrdi2XHKW475yz7PTbWQ1BB1UvOlqI/ZFU5m0XvZD9hqoqiRRA46bCSvFajzgf/cdUdFbXtrbmb9sLKpQnPEaiH7iCwB11AYkgKo/Mu32evp3f3th1R70nrkSrZXbYst0tg8+ZHNm9+hCovkat4t9hcF5MvEl3krndfTIRSF7snX9T7ExJZ776oKpsul3kCf0Lb5GF8k7+YXHVp+5kNsPU3HCo1oG0vb8j+Mbf+5auXG5bNizc0xPGDpeeuvBJn1f1/+5u+X14PMMFRi9f/y/cS15weKbeYNKWQX3HilhULtTuHFz64UFPxWqj+LqJdUhx5nYrzIpsfeeGRzSQz7YDBmszEk1KfJxlvIUVIUf3d38cP1czt2ptO4jXf5KzprUTntk4wqFFz1VAD2xOPH/pBA17Xqd7T2YmO6zy+U+XB83Gn+j6gSHGG+f8AOCOtGQAAeJxjYGRgYABiObVNlfH8Nl8ZuFkYQOCp9A01BP1/AYszcwKQy8HABBIFAAcSCW8AeJxjYGRgYG7438AQw/KGAQhYnBkYGVDBcgBjsgQ/AAB4nGNhYGBgQcYOUPoNlHZBk8emllQM02dPQI0DkloHLOK4MDYz0MXR1djjsMMGTY0NAfcRcqMxkX6wJ0INNneAsAEOf+EKX/R4sMcTN8hm1WOx2x6HWnT3MjBg+hNNHQADvxsdAAAAAACoASABqAJ2ArgDAANGA5AD1ARKBPIFFAWoBhwGigd8B+AISAiyCUgJxgoICowK/AtWC6gMGgwyDFgMiAzSDPgNXg3iDigOUA62DzYPthB2EUYR2BJeEt4TOBNuE8QT9BRWFLYU7BU4FjoXfheyF+YYQBiMGTwZqBp2GwYbVhu+HBwccBzYHTodhB4kHj4ekh7mH44gHiBIILwhKiGwIgQiTiJ4It4jYCO6JF4kwCU6JWolmCXIJiomQCcEJ0ooFCkwKXQpuCpCKqIrDCtMK3ArziwiLIQsyC0qLaguLi7eL0Ivii/gMAgwYDEEMYAyJjKAMzAzrDRkNLo1CDVeNeA2cDbCNxA3YjfaOII48jnmOlo6pDs4O5w75DyGPQI9zD4iPxA/cj/IQIBBZEHAQhhChkLiQ8pERkS4RUZF6EZARrxG5EcmR1BHrkfoeJxjYGRgYFjO8IFBigEEmICYCwgZGP6D+QwAM60CyAB4nF2RzU7CQBSFz8iPERIXmrhwNW6IiaEFluwMCexZ4LqUKT9pO810IGHl0/gEPoFP4BPoS/gCHsrVBNrMne+cuffOTQvgBt9QOD63XEdWuKQ68gX5XrhGfhCukx+FG2gjFG7SHwq38IRn4TY7puyg6ldUHbwKK1zjTfiC/C5cI38I18mfwg3c4Uu4Sf9HuIWZUsJtdNTLyJnIm4We7/U6tnlic5/E3QNOzXKbRk6UbDPjyrXNdT/oiTMxuXF/LcrdcuB9ohNnMz1mL5OmVhfObkzsg5X3xTAME/GD2GYYwcEggmdcQGOOPeMaMSxyJFX03GN0/90pc5fY8kNFrD49O1UzZjqU1Ael0UeA3lnOhDl5lXc+RYkd7xnQPUyguRwrMtJY5jKcISVrFNXZhk5MP8Cqqir4k0O+yVl+UN2d/QI8XWjpAAAAeJxtVIWW3DYU3btje2h302RTZka3zSRlZmbmaqw3M8rKliPJA2VmZuY2/cw+eWbazTn1ObYs6cm6uuCV1ZX51Vn5/+sgVtFAhBgJmmihjQ66WMM6NrADh2EndmETu3E4jsCROApH4xgci+NwPE7AiTgJJ+MUnIrTcDrOwJk4C2fjHJyL85DifFyAC7EHPezFPlyEi3EJLsVluBxX4EpchatxDa7FdbgeN+BG3ISbcQtuxW24HXfgTtyFu3EP7sV9uB8P4EE8hIfxCB7FY3gcT+BJPIWn8QyehUAfGSQIAwwxgsJ+bEEjRwGDEgdg4eBRYYwJppjhOTyPF/AiXsLLeAWv4jW8jjfwJt7C23gH7+I9vI8P8CE+wsf4BJ/iM3yOL/AlvsLX+Abf4jt8jx/wI37Cz/gFv+I3/I4/8Cf+wkH8vdIYVxQ7L7KtmKYZ6Xhilaekb0WRjRJJY5VR4kjYbLReGqe8MkWqaeATmpaikK1c2C1pJkVXCi9SR5oy3x5aJVOtCopLqwofZcrPWtpkIixPDtjMSGqpoqx8qmSiBlbkFItKKtMZGJunOc/r2CuvKXJqWDSFlJacazNSr5xXWbMv6q/EYyXJJGLMu9umq1xJhWxOhC1UMYwcd1qWBrx21FsVqpkZXeXF3kW7b9H2Fu2eRIuZqXzb0TCnwpNshoYxt+dgvRg2vOivZaYYqGFKY55lTFSmAXbiNIOxiVRCm+Hm/oqBDmapK0XGBJqqkElVaiNklJly1vEqp5R5HlLLC7eV8hl3H7KmT35CVCQqL431Xd5YU73R3u4CQF842iU0M8Si5S513pLPRtuHBpqmzEKcjSjbikTlTSsTmkeEXR7D+ZmmHYuOkGOWnuRysrSmdBssB3lKM2UzTb31Q7rJvLdbKsvaB39YM7HMjXW0JpUrmdQaRiStGK4vR/rsh60ouCYmqXwvCs8gdMpibC6rVBFsVNcuEY75dLyMomC7jUMLGzSjNt9ppo2jZskwFE26Yfe0YFSiTAZGs0jd2mfzA7Tr6TAZhdF2PRXYixRvGatcDGnnUplQyy60fmM5kgWn2B3/SjfXIGY4W704V0XlYnZR1YtyYykKry3Nqlf81UYpZJKbvtLUKrmf5mLKZeNlTxUtPkIaHLZaZlEYbC7snFghVeW6TozZFEprkq0DFbk6YS6zRuvQqNI3HXlfp4FLEzcSzFtrLKwKfmrMyK3Nx5hCrgyKUCc8Ft5kNbQoHa+cKD4XZ6wfCOryMWmR95gl4d8I28py1oWVrdptfTNlr7lMhFD0K+9N0an/ErWT4yFHomxKFRJso8DrmqQ5ZD6Di0Y+10kwhbFxHb8oUMrMODcxVsaBANNgryVz7SPLoGOGa2wyxxXtd0xGUeV9snEdqc5/IdqWp14UshhxRdHyNGV1STS9MdqrMnLa+JZnLtyALKd/2J7wPjb896LAQVx/p10bd6S0jPit1+DH5rYUhqAGjJ26rHbdzm3TcwutrPwDSso8HQAA) format("woff")}.fc-icon{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:fc-icon!important;font-size:16px;font-style:normal}.icon-vue:before{content:"\\e6e7"}.icon-stack:before{content:"\\e6e5"}.icon-excel:before{content:"\\e6e6"}.icon-write:before{content:"\\e6e4"}.icon-branch:before{content:"\\e6e3"}.icon-device:before{content:"\\e6e0"}.icon-position-left:before{content:"\\e6e2"}.icon-search:before{content:"\\e6e1"}.icon-expand:before{content:"\\e6df"}.icon-expand-left:before{content:"\\e6df";display:inline-block;transform:rotate(-180deg)}.icon-data-select:before{content:"\\e6dd"}.icon-markdown:before{content:"\\e893"}.icon-grid-line:before{content:"\\e600"}.icon-print:before{content:"\\e6de"}.icon-city:before{content:"\\e64b"}.icon-location:before{content:"\\e6d4"}.icon-qrcode:before{content:"\\e6ce"}.icon-input-id:before{content:"\\e6d1"}.icon-iframe:before{content:"\\e6d2"}.icon-audio:before{content:"\\e6d3"}.icon-form-model:before{content:"\\e6d5"}.icon-title:before{content:"\\e6d6"}.icon-sign:before{content:"\\e6d7"}.icon-address:before{content:"\\e6d8"}.icon-statistic:before{content:"\\e6d9"}.icon-barcode:before{content:"\\e6da"}.icon-video:before{content:"\\e6db"}.icon-avatar:before{content:"\\e6dc"}.icon-suspend:before{content:"\\e6cf"}.icon-warning:before{content:"\\e6d0"}.icon-send:before{content:"\\e6cc"}.icon-refresh2:before{content:"\\e6cd"}.icon-ai:before{content:"\\e6cb"}.icon-ai.bright{-webkit-text-fill-color:transparent;background:linear-gradient(90deg,#328ff7,#62e3a3);-webkit-background-clip:text}.icon-column4:before{content:"\\e6c7"}.icon-column3:before{content:"\\e6c6"}.icon-column2:before{content:"\\e6c8"}.icon-column1:before{content:"\\e6c9"}.icon-layout:before{content:"\\e6ca"}.icon-segmented:before{content:"\\e682"}.icon-mention:before{content:"\\e6c5"}.icon-input-tag:before{content:"\\e6c4"}.icon-up:before{content:"\\e697";display:inline-block;transform:rotate(180deg)}.icon-alignitems-flexstart:before{content:"\\e67f";display:inline-block;transform:rotate(180deg)}.icon-align-center:before{content:"\\e6a5";display:inline-block;transform:rotate(90deg)}.icon-align-flexstart:before{content:"\\e6a4";display:inline-block;transform:rotate(90deg)}.icon-align-spacearound:before{content:"\\e670";display:inline-block;transform:rotate(-90deg)}.icon-align-spacebetween:before{content:"\\e695";display:inline-block;transform:rotate(-90deg)}.icon-align-stretch:before{content:"\\e6a7";display:inline-block;transform:rotate(-90deg)}.icon-align-flexend:before{content:"\\e6a4";display:inline-block;transform:rotate(-90deg)}.icon-justify-flexend:before{content:"\\e6a4";display:inline-block;transform:rotate(180deg)}.icon-direction-row:before{content:"\\e68b";display:inline-block;transform:rotate(180deg)}.icon-direction-column:before{content:"\\e68b";display:inline-block;transform:rotate(-90deg)}.icon-direction-columnreverse:before{content:"\\e68b";display:inline-block;transform:rotate(90deg)}.icon-arrow:before{content:"\\e697";display:inline-block;transform:rotate(180deg)}.icon-cell:before{content:"\\e654"}.icon-table:before{content:"\\eb0a"}.icon-next-step:before{content:"\\e6b4";display:inline-block;transform:rotateY(180deg)}.icon-grid:before{content:"\\e65c";display:inline-block;transform:rotate(90deg)}.icon-alignitems-stretch:before{content:"\\e67e"}.icon-alignitems-flexend:before{content:"\\e67f"}.icon-check:before{content:"\\e680"}.icon-auto:before{content:"\\e681"}.icon-config-event:before{content:"\\e66e"}.icon-calendar:before{content:"\\e683"}.icon-config-style:before{content:"\\e684"}.icon-copy:before{content:"\\e676"}.icon-config-advanced:before{content:"\\e686"}.icon-config-props:before{content:"\\e687"}.icon-delete-circle2:before{content:"\\e688"}.icon-delete-circle:before,.icon-delete2:before{content:"\\e689"}.icon-delete:before{content:"\\e68a"}.icon-direction-rowreverse:before{content:"\\e68b"}.icon-display-flex:before{content:"\\e68c"}.icon-dialog:before{content:"\\e66f"}.icon-drag:before{content:"\\e68e"}.icon-display-block:before{content:"\\e68f"}.icon-data:before{content:"\\e690"}.icon-edit2:before{content:"\\e691"}.icon-edit:before{content:"\\e692"}.icon-add-col:before{content:"\\e693"}.icon-display-inlineblock:before{content:"\\e694"}.icon-config-base:before{content:"\\e6bf"}.icon-config-validate:before{content:"\\e696"}.icon-down:before{content:"\\e697"}.icon-display-inline:before{content:"\\e698"}.icon-eye:before{content:"\\e699"}.icon-eye-close:before{content:"\\e69a"}.icon-import:before{content:"\\e6a6"}.icon-preview:before{content:"\\e69b"}.icon-flex-nowrap:before{content:"\\e69c"}.icon-folder:before{content:"\\e69d"}.icon-form-circle:before{content:"\\e69e"}.icon-flex-wrap:before{content:"\\e69f"}.icon-form:before{content:"\\e6a0"}.icon-form-item:before{content:"\\e6a1"}.icon-icon:before{content:"\\e6a2"}.icon-image:before{content:"\\e6a3"}.icon-justify-flexstart:before{content:"\\e6a4"}.icon-justify-center:before{content:"\\e6a5"}.icon-justify-spacearound:before{content:"\\e670"}.icon-justify-stretch:before{content:"\\e6a7"}.icon-link2:before{content:"\\e6a8"}.icon-justify-spacebetween:before{content:"\\e695"}.icon-minus:before{content:"\\e6aa"}.icon-menu2:before{content:"\\e6ab"}.icon-more:before{content:"\\e6ac"}.icon-menu:before{content:"\\e6ad"}.icon-language:before{content:"\\e6ae"}.icon-pad:before{content:"\\e6af"}.icon-mobile:before{content:"\\e6b0"}.icon-page-max:before{content:"\\e6b1"}.icon-move:before{content:"\\e6b2"}.icon-page-min:before{content:"\\e6b3"}.icon-pre-step:before{content:"\\e6b4"}.icon-pc:before{content:"\\e6b5"}.icon-page:before{content:"\\e6b6"}.icon-refresh:before{content:"\\e6b7"}.icon-radius:before{content:"\\e6b8"}.icon-save-filled:before{content:"\\e6b9"}.icon-question:before{content:"\\e6ba"}.icon-scroll:before{content:"\\e6bb"}.icon-script:before{content:"\\e6bc"}.icon-setting:before{content:"\\e6bd"}.icon-save-online:before,.icon-save:before{content:"\\e6be"}.icon-task-add:before{content:"\\e68d"}.icon-shadow:before{content:"\\e6c0"}.icon-variable:before{content:"\\e6c1"}.icon-yes:before{content:"\\e6c2"}.icon-shadow-inset:before{content:"\\e6c3"}.icon-date:before{content:"\\e642"}.icon-date-range:before{content:"\\e643"}.icon-collapse:before{content:"\\e644"}.icon-slider:before{content:"\\e665"}.icon-switch:before{content:"\\e646"}.icon-subform:before{content:"\\e647"}.icon-time-range:before{content:"\\e685"}.icon-tree-select:before{content:"\\e649"}.icon-value:before{content:"\\e64a"}.icon-table-form3:before{content:"\\e6a9"}.icon-alert:before{content:"\\e64c"}.icon-card:before{content:"\\e64d"}.icon-checkbox:before{content:"\\e64e"}.icon-cascader:before{content:"\\e64f"}.icon-button:before{content:"\\e650"}.icon-data-table:before{content:"\\e651"}.icon-group:before{content:"\\e652"}.icon-divider:before{content:"\\e653"}.icon-flex:before{content:"\\e654"}.icon-descriptions:before{content:"\\e655"}.icon-html:before{content:"\\e656"}.icon-editor:before{content:"\\e657"}.icon-input:before{content:"\\e658"}.icon-link:before{content:"\\e659"}.icon-password:before{content:"\\e65a"}.icon-radio:before{content:"\\e65b"}.icon-row:before{content:"\\e65c"}.icon-inline:before{content:"\\e65d"}.icon-rate:before{content:"\\e65e"}.icon-color:before{content:"\\e65f"}.icon-select:before{content:"\\e660"}.icon-json:before{content:"\\e661"}.icon-number:before{content:"\\e662"}.icon-space:before{content:"\\e664"}.icon-step-form:before{content:"\\e663"}.icon-table-form:before{content:"\\e666"}.icon-table-form2:before{content:"\\e667"}.icon-time:before{content:"\\e668"}.icon-span:before{content:"\\e669"}.icon-textarea:before{content:"\\e66a"}.icon-tooltip:before{content:"\\e66b"}.icon-slot:before{content:"\\e66c"}.icon-transfer:before{content:"\\e66d"}.icon-upload:before{content:"\\e673"}.icon-tag:before{content:"\\e671"}.icon-watermark:before{content:"\\e672"}.icon-tab:before{content:"\\e674"}.icon-tree:before{content:"\\e675"}.icon-table:before{content:"\\e677"}.icon-add-child:before{content:"\\e678"}.icon-add2:before{content:"\\e679"}.icon-add:before{content:"\\e67a"}.icon-alignitems-baseline:before{content:"\\e67b"}.icon-add-circle:before{content:"\\e67c"}.icon-alignitems-center:before{content:"\\e67d"}pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{background:#fff;color:#000}.hljs-subst,.hljs-title{color:#000;font-weight:400}.hljs-title.function_{color:#7a7a43}.hljs-code,.hljs-comment,.hljs-quote{color:#8c8c8c;font-style:italic}.hljs-meta{color:#9e880d}.hljs-section{color:#871094}.hljs-built_in,.hljs-keyword,.hljs-literal,.hljs-meta .hljs-keyword,.hljs-name,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-selector-pseudo,.hljs-selector-tag,.hljs-symbol,.hljs-template-tag,.hljs-type,.hljs-variable.language_{color:#0033b3}.hljs-attr,.hljs-property{color:#871094}.hljs-attribute{color:#174ad4}.hljs-number{color:#1750eb}.hljs-regexp{color:#264eff}.hljs-link{color:#006dcc;text-decoration:underline}.hljs-meta .hljs-string,.hljs-string{color:#067d17}.hljs-char.escape_{color:#0037a6}.hljs-doctag{text-decoration:underline}.hljs-template-variable{color:#248f8f}.hljs-addition{background:#bee6be}.hljs-deletion{background:#d6d6d6}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}')),document.head.appendChild(e)}}catch(t){console.error("vite-plugin-css-injected-by-js",t)}})();var Sye=Object.defineProperty,kye=(e,t,n)=>t in e?Sye(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Ur=(e,t,n)=>(kye(e,typeof t!="symbol"?t+"":t,n),n);const _r={type(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"},Undef(e){return e==null},Element(e){return typeof e=="object"&&e!==null&&e.nodeType===1&&!_r.Object(e)},trueArray(e){return Array.isArray(e)&&e.length>0},Function(e){const t=this.getType(e);return t==="Function"||t==="AsyncFunction"},getType(e){const t=Object.prototype.toString.call(e);return/^\[object (.*)\]$/.exec(t)[1]},empty(e){return e==null||Array.isArray(e)&&Array.isArray(e)&&!e.length?!0:typeof e=="string"&&!e}};["Date","Object","String","Boolean","Array","Number"].forEach(e=>{_r[e]=function(t){return _r.type(t,e)}});function gh(e,t){return{}.hasOwnProperty.call(e,t)}function e_(e,t,n){e[t]=n}function S6(e,t={},n){let r=!1;for(let o in t)if(Object.prototype.hasOwnProperty.call(t,o)){let i=t[o];if((r=Array.isArray(i))||_r.Object(i)){let a=e[o]===void 0;r?(r=!1,a&&e_(e,o,[])):i._clone&&n!==void 0||a&&e_(e,o,{}),e[o]=S6(e[o],i,n)}else e_(e,o,i),_r.Undef(i)||(_r.Undef(i.__json)||(e[o].__json=i.__json),_r.Undef(i.__origin)||(e[o].__origin=i.__origin))}return n!==void 0&&Array.isArray(e)?e.filter(o=>!o||!o.__ctrl):e}function _o(e){return S6({},{value:e}).value}function Tye(e,t,n){return`[form-create ${e}]: ${t}`}function Mye(e,t){console.error(Tye("err",e))}const $D="[[FORM-CREATE-PREFIX-",zD="-FORM-CREATE-SUFFIX]]";function Fw(e){return new Function("return "+e)()}function Oye(e,t){if(e&&_r.String(e)&&e.length>4){let n=e.trim(),r=!1;try{if(n.indexOf(zD)>0&&n.indexOf($D)===0)n=n.replace(zD,"").replace($D,""),r=!0;else if(n.indexOf("$FN:")===0)n=n.substring(4),r=!0;else if(n.indexOf("$EXEC:")===0)n=n.substring(6),r=!0;else if(n.indexOf("$GLOBAL:")===0){const i=n.substring(8);return n=function(...a){const l=a[0].api.getGlobalEvent(i);if(l)return l.call(this,...a)},n.__json=e,n.__inject=!0,n}else{if(n.indexOf("$FNX:")===0)return n=Fw(`function($inject){ +`+n.substring(5)+` +}`),n.__json=e,n.__inject=!0,n;(!t&&n.indexOf("function ")===0&&n!=="function "||!t&&n.indexOf("function(")===0&&n!=="function(")&&(r=!0)}if(!r)return e;let o;try{o=Fw(n)}catch{o=Fw("function "+n)}return o.__json=e,o}catch(o){Mye(`解析失败:${n} + +err: ${o}`);return}}return e}function KH(e){const t=e.replace(/(-[a-z])/g,function(n){return n.replace("-","").toLocaleUpperCase()});return t_(t)}function t_(e){return e.replace(e[0],e[0].toLowerCase())}const YH={name:"zh-cn",form:{field:"字段 ID",title:"字段名称",info:"提示信息",control:"组件联动",labelPosition:"标签的位置",labelStyle:"标签的样式",labelSuffix:"标签的后缀",size:"表单的尺寸",event:"表单事件",labelWidth:"标签的宽度",hideRequiredAsterisk:"隐藏必填字段的标签旁边的红色星号",showMessage:"显示校验错误信息",inlineMessage:"以行内形式展示校验信息",submitBtn:"是否显示表单提交按钮",resetBtn:"是否显示表单重置按钮",appendChild:"添加子级",formMode:"表单模式",formName:"表单名称",componentMode:"生成组件",htmlMode:"生成HTML",document:"帮助文档",controlDocument:"需要更详细的配置方法?请查看{doc}",onSubmit:"表单提交时触发",onReset:"表单重置后触发",onCreated:"表单组件初始化完毕后触发",onMounted:"表单组件渲染完毕后触发",onReload:"表单渲染规则重载后触发",onChange:"表单组件的值发生变化时触发",beforeSubmit:"表单验证通过时触发",beforeFetch:"远程数据请求发送前触发"},ai:{name:"智能助理",welcome:"欢迎使用 AI 助理",info:"我可以帮助您快速生成和修改表单,帮助您轻松高效地完成表单设计。",try:"试着问我",change:"换一换",placeholder:"请描述您的需求...",error:"AI 服务暂时不可用,请稍后重试"},warning:{name:"组件的唯一标识,用于获取和修改该组件的配置规则。通过该标识可以精确定位组件,实现对组件属性和行为的控制。",field:"组件对应的字段名用于与组件的数据进行绑定。字段名需以字母开头,以确保能够正确识别。",fetch:"远程数据通过远程请求加载组件的配置项。配置请求参数后,组件会自动发起请求,获取远程数据并根据返回的结果更新组件。",fetchQuery:"定义请求的 GET 参数,通过 URL 传递数据。",fetchData:"定义请求的 POST 参数,通过请求体传递数据。",fetchDataType:"选择请求体的数据类型,确保数据格式正确。",beforeFetch:"在请求发送前,可通过处理函数修改请求参数;若需终止请求,直接返回 false 或一个拒绝的 Promise。",fetchParse:"请求返回后,可以通过处理函数对返回的结果进行处理,将结果转换为组件所需的数据和结构。",language:"管理页面的多语言数据,在组件中配置不同语言的文本,支持一键切换语言体系,便于在多语言环境下使用和展示内容。"},computed:{fieldUsed:"【{label}】在计算公式中被使用,请先修改对应公式",fieldExist:"【{label}】字段已存在",fieldEmpty:"字段名称不能为空",fieldChar:"字段名称必须以字母开头"},validate:{type:"字段类型",typePlaceholder:"请选择",trigger:"触发方式",mode:"验证方式",modes:{required:"必填",pattern:"正则表达式",validator:"自定义验证",min:"最小值",max:"最大值",len:"长度",maxLen:"最大长度",minLen:"最小长度",uppercase:"全大写",lowercase:"全小写",email:"邮箱格式",url:"URL格式",ip:"IP地址",phone:"手机号",positive:"正数",negative:"负数",integer:"整数",number:"数字"},types:{string:"文本",boolean:"布尔",array:"多选",number:"数字",integer:"整数",float:"小数",object:"合集",date:"日期",url:"URL链接",email:"邮箱地址"},message:"错误信息",auto:"自动获取",autoRequired:"请输入{title}",autoMode:"请输入正确的{title}",requiredPlaceholder:"请输入提示语",required:"是否必填",rule:"验证规则"},tableOptions:{handle:"操作",add:"添加",empty1:"点击右下角",empty2:"按钮添加一列",rmCol:"删除当前列",rmRow:"删除当前行",batchRmCol:"删除列",batchRmRow:"删除行",batchSplit:"拆分单元格",batchMerge:"合并单元格",splitRow:"拆分成行",splitCol:"拆分成列",mergeBottom:"向下合并",mergeRight:"向右合并",addTop:"添加上列",addBottom:"添加下列",addLeft:"添加左列",addRight:"添加右列",keyValue:"键值对"},struct:{title:"编辑数据",only:"【{label}】只允许添加一个",errorMsg:"输入的内容语法错误",configured:"已配置"},event:{title:"设置事件",create:"创建事件",list:"事件列表",placeholder:"请输入事件的名称",saveMsg:"请先保存当前正在编辑的事件",type:"类型",info:"说明",label:"字段",inject:{api:"当前表单的api",rule:"当前表单的生成规则",self:"组件的生成规则",option:"表单的配置",args:"事件的原始参数"}},eventInfo:{blur:"失去焦点时触发",focus:"获得焦点时触发",change:"当绑定值变化时触发",input:"在值改变时触发",clear:"在点击清空按钮时触发",close:"关闭组件时触发",click:"点击组件时触发",add:"增加时触发",delete:"删除时触发",visibleChange:"下拉框出现/隐藏时触发",calendarChange:"在日历所选日期更改时触发",panelChange:"当日期面板改变时触发",open:"打开的回调",opened:"打开动画结束时的回调",closed:"关闭动画结束时的回调",openAutoFocus:"输入焦点聚焦在内容时的回调",closeAutoFocus:"输入焦点从内容失焦时的回调",submit:"表单提交时触发",confirm:"点击确认按钮时触发",validateFail:"表单验证失败时触发",hook_load:"组件规则加载后触发",hook_mounted:"组件挂载后触发",hook_deleted:"组件规则被移除后触发",hook_watch:"组件规则发生变化后触发",hook_value:"组件的值发生变化后触发",hook_hidden:"组件显示状态发生变化后触发",hook_titleClick:"点击组件的标签名称时触发"},fetch:{title:"设置数据源",create:"创建数据源",config:"请求配置",action:"请求链接",actionRequired:"请输入正确的链接",placeholder:"请输入数据源的名称",method:"请求方式",data:"附带数据",dataType:"数据类型",headers:"请求头部",query:"请求参数",parse:"数据处理",response:"接口返回的数据",onError:"错误处理",beforeFetch:"前置处理",remote:"远程数据",static:"静态数据",optionsType:{fetch:"远程数据",struct:"静态数据"},preview:"预览响应数据",test:"测试请求",previewEmpty:'点击"测试请求"按钮预览响应数据',requestFailed:"请求失败"},style:{width:"宽度",height:"高度",color:"颜色",backgroundColor:"背景色",margin:"外边距",padding:"内边距",borderRadius:"圆角",border:"边框",solid:"实线",dashed:"虚线",dotted:"点状虚线",double:"双实线",opacity:"透明度",scale:"缩放",minWidth:"最小宽",minHeight:"最小高",maxWidth:"最大宽",maxHeight:"最大高",overflow:{name:"溢出",visible:"可见",hidden:"隐藏",scroll:"滚动",auto:"溢出后自动滚动"},shadow:{name:"阴影",x:"x轴偏移量",y:"y轴偏移量",vague:"模糊半径",extend:"扩散半径",inset:"向内",external:"向外",mode:"模式",classic:"经典",flat:"扁平",solid:"立体"},font:{name:"文字",size:"大小",family:"字体",align:"对齐方式",height:"行高",spacing:"字间距",preview:"样式预览"},family:{"Microsoft YaHei":"微软雅黑",SimSun:"宋体",SimHei:"黑体",KaiTi:"楷体",FangSong:"仿宋",LiSu:"隶书"},position:{name:"位置",static:"默认定位",relative:"相对定位",absolute:"绝对定位",fixed:"固定定位",sticky:"粘性定位"},decoration:{name:"修饰",underline:"下划线","line-through":"删除线",overline:"上划线"},weight:{name:"粗细",300:"细体",400:"常规体",500:"中黑体",700:"中粗体"}},designer:{component:"组件配置",id:"唯一值",name:"编号",type:"组件类型",form:"表单配置",json:"渲染规则",style:"组件样式配置",rule:"基础配置",advanced:"高级配置",props:"属性配置",customProps:"自定义属性配置",validate:"验证配置",event:"事件配置",clearWarn:"清空后将不能恢复,确定要清空吗?",childEmpty:"点击右下角 \\e789 按钮添加一列",dragEmpty:"拖拽左侧列表中的组件到此处",unload:"确定离开当前页面吗?",comList:"组件列表"},language:{name:"国际化配置",add:"新增词条",batchRemove:"批量删除",select:"选择多语言"},menu:{main:"基础组件",aide:"辅助组件",layout:"布局组件",component:"组件",subform:"子表单组件",tree:"大纲"},props:{success:"成功",error:"失败",disabled:"禁用",time:"时间",size:"尺寸",email:"邮箱",number:"数字",globalData:"全局数据",mobile:"移动端",reactive:"响应式",pc:"电脑端",title:"标题",content:"内容",collection:"合集",group:"分组",custom:"自定义",change:"改变",blur:"失去焦点",preview:"预览",clear:"清空",cancel:"取消",close:"关闭",ok:"确定",save:"保存",refresh:"刷新",submit:"提交",reset:"重置",copy:"复制",import:"导入",delete:"删除",hide:"隐藏",show:"显示",position:"位置",render:"渲染",large:"大",default:"默认",small:"小",always:"常显",never:"不显示",hover:"悬浮",click:"点击",button:"按钮",year:"年份",month:"月份",date:"日期",dates:"日期多选",week:"一周",datetime:"日期时间","datetime-local":"日期时间",datetimerange:"日期时间区间",daterange:"日期区间",monthrange:"月份区间",left:"左对齐",right:"右对齐",top:"顶部",text:"文字",picture:"图片","picture-card":"卡片",center:"居中",vertical:"竖向",horizontal:"横向",manage:"管理",key:"键名",name:"名称",value:"值",inputData:"默认值",append:"插入",options:"选项数据",option:"选项",callback:"回调",style:"样式",card:"卡片",_self:"当前窗口",_blank:"新的窗口",_parent:"父级窗口",_top:"顶级窗口"},com:{cascader:{name:"级联选择器",event:{expandChange:"当展开节点发生变化时触发",removeTag:"在多选模式下,移除Tag时触发"},props:{props:"配置选项",placeholder:"输入框占位文本",disabled:"是否禁用",clearable:"是否支持清空选项",showAllLevels:"输入框中是否显示选中值的完整路径",collapseTags:"多选模式下是否折叠Tag",collapseTagsTooltip:"当鼠标悬停于折叠标签的文本时,是否显示所有选中的标签",separator:"选项分隔符",filterable:"该选项是否可以被搜索",tagType:"标签类型"},propsOpt:{multiple:"是否多选",expandTrigger:"次级菜单的展开方式",checkStrictly:"是否严格的遵守父子节点不互相关联",emitPath:"在选中节点改变时,是否返回由该节点所在的各级菜单的值所组成的数组",value:"指定选项的值为选项对象的某个属性值",label:"指定选项标签为选项对象的某个属性值",children:"指定选项的子选项为选项对象的某个属性值",disabled:"指定选项的禁用为选项对象的某个属性值",leaf:"指定选项的叶子节点的标志位为选项对象的某个属性值"}},checkbox:{name:"多选框",props:{input:"是否可以填写",type:"按钮类型",disabled:"是否禁用",min:"可被勾选的最小数量",max:"可被勾选的最大数量",textColor:"当按钮为活跃状态时的字体颜色",fill:"当按钮为活跃状态时的边框和背景颜色"}},col:{name:"布局格子",props:{span:"栅格占据的列数",offset:"栅格左侧的间隔格数",push:"栅格向右移动格数",pull:"栅格向左移动格数"}},colorPicker:{name:"颜色选择器",event:{activeChange:"面板中当前显示的颜色发生改变时触发"},props:{disabled:"是否禁用",showAlpha:"是否支持透明度选择",colorFormat:"颜色的格式",predefine:"预定义颜色"}},datePicker:{name:"日期",props:{pickerOptions:"当前时间日期选择器特有的选项",readonly:"完全只读",disabled:"禁用",type:"显示类型",editable:"文本框可输入",clearable:"是否显示清除按钮",placeholder:"非范围选择时的占位内容",startPlaceholder:"范围选择时开始日期的占位内容",endPlaceholder:"范围选择时结束日期的占位内容",format:"显示在输入框中的格式",align:"对齐方式",rangeSeparator:"选择范围时的分隔符",unlinkPanels:"在范围选择器里取消两个日期面板之间的联动"}},dateRange:{name:"日期区间"},timeRange:{name:"时间区间"},elAlert:{name:"提示",description:"说明文字",props:{title:"标题",type:"主题",description:"辅助性文字",closable:"是否可关闭",center:"文字是否居中",closeText:"关闭按钮自定义文本",showIcon:"是否显示图标",effect:"选择提供的主题"}},elButton:{name:"按钮",props:{formCreateChild:"内容",size:"尺寸",type:"类型",plain:"是否朴素按钮",round:"是否圆角按钮",circle:"是否圆形按钮",loading:"是否加载中状态",disabled:"是否禁用状态"}},elCard:{name:"卡片",props:{header:"标题",shadow:"阴影显示时机"}},elCollapse:{name:"折叠面板",event:{change:"切换当前活动面板,在手风琴模式下其类型是string,在其他模式下是array"},props:{accordion:"是否手风琴模式"}},elCollapseItem:{name:"面板",props:{title:"面板标题",name:"唯一标志符",disabled:"是否禁用"}},elDivider:{name:"分割线",props:{formCreateChild:"设置分割线文案",contentPosition:"设置分割线文案的位置"}},elTabPane:{name:"选项卡",props:{label:"选项卡标题",disabled:"是否禁用",name:"选项卡的标识符",lazy:"标签是否延迟渲染"}},elTabs:{name:"标签页",event:{tabClick:"tab 被选中时触发",tabChange:"activeName 改变时触发",tabRemove:"点击 tab 移除按钮时触发",tabAdd:"点击 tab 新增按钮时触发",edit:"点击 tab 的新增或移除按钮后触发"},props:{type:"风格类型",closable:"标签是否可关闭",tabPosition:"选项卡所在位置",stretch:"标签的宽度是否自撑开"}},elTag:{name:"标签",props:{formCreateNative:"是否显示标题",formCreateTitle:"标题",formCreateChild:"标签内容",type:"标签的类型",size:"标签的尺寸",effect:"标签的主题",closable:"是否可关闭",disableTransitions:"是否禁用渐变动画",hit:"是否有边框描边",round:"是否为圆形",color:"背景色"}},elTransfer:{name:"穿梭框",event:{leftCheckChange:"左侧列表元素被用户选中 / 取消选中时触发",rightCheckChange:"右侧列表元素被用户选中 / 取消选中时触发"},props:{filterable:"是否可搜索",filterPlaceholder:"搜索框占位符",targetOrder:"右侧列表元素的排序策略",targetOrderInfo:"若为 original,则保持与数据相同的顺序;若为 push,则新加入的元素排在最后;若为 unshift,则新加入的元素排在最前",titles:"自定义列表标题",buttonTexts:"自定义按钮文案",props:"数据源的字段别名"}},elTreeSelect:{name:"树形选择",event:{removeTag:"多选模式下移除tag时触发"},props:{multiple:"是否多选",disabled:"是否禁用",clearable:"是否可以清空选项",collapseTags:"多选时是否将选中值按文字的形式展示",multipleLimit:"多选时用户最多可以选择的项目数,为 0 则不限制",placeholder:"占位符",props:"配置选项",renderAfterExpand:"是否在第一次展开某个树节点后才渲染其子节点",defaultExpandAll:"是否默认展开所有节点",expandOnClickNode:"是否在点击节点的时候展开或者收缩节点",checkOnClickNode:"是否在点击节点的时候选中节点",nodeKey:"每个树节点用来作为唯一标识的属性,整棵树应该是唯一的"}},elImage:{name:"图片",props:{src:"图片链接"}},fcTitle:{name:"标题",props:{title:"标题",size:"尺寸",align:"对齐方式"}},fcEditor:{name:"富文本框",props:{disabled:"是否禁用"}},fcRow:{name:"栅格布局",props:{gutter:"栅格间隔",type:"flex布局模式",justify:"flex布局下的水平排列方式",align:"flex布局下的垂直排列方式"}},fcTable:{name:"表格布局",props:{border:"是否显示边框",borderColor:"边框颜色",borderWidth:"边框宽度"}},fcTableGrid:{name:"格子"},signaturePad:{name:"手写签名",info:"删除签名前的回调函数,返回 false 可阻止删除操作",props:{penColor:"线条的颜色",disabled:"禁用",beforeRemove:"删除前置回调"}},group:{name:"子表单",info:"删除子表单项前的回调函数,返回 false 可阻止删除操作",props:{type:"类型",title:"标题",disabled:"是否禁用",syncDisabled:"是否与子表单强制同步禁用状态",expand:"设置默认展开几项",button:"是否显示操作按钮",sortBtn:"是否显示排序按钮",min:"设置最小添加几项",max:"设置最多添加几项",onBeforeRemove:"删除前置回调"}},html:{name:"HTML",props:{formCreateNative:"是否显示标题",formCreateTitle:"标题",formCreateChild:"内容"}},input:{name:"输入框",event:{change:"当值改变时,当组件失去焦点或用户按Enter时触发"},props:{type:"类型",maxlength:"最大输入长度",minlength:"最小输入长度",placeholder:"输入框占位文本",clearable:"是否显示清除按钮",disabled:"是否禁用",readonly:"是否只读"}},inputNumber:{name:"计数器",props:{precision:"数值精度",min:"设置计数器允许的最小值",max:"设置计数器允许的最大值",step:"计数器步长",stepStrictly:"是否只能输入 step 的倍数",disabled:"是否禁用计数器",controls:"是否使用控制按钮",controlsPosition:"控制按钮位置",placeholder:"输入框占位文本"}},password:{name:"密码输入框",event:{change:"当值改变时,当组件失去焦点或用户按Enter时触发"},props:{disabled:"是否禁用",readonly:"是否只读",maxlength:"最大输入长度",minlength:"最小输入长度",placeholder:"输入框占位文本",clearable:"是否显示清除按钮"}},radio:{name:"单选框",props:{input:"是否可以填写",disabled:"是否禁用",type:"按钮形式",textColor:"按钮形式激活时的文本颜色",fill:"按钮形式激活时的填充色和边框色"}},rate:{name:"评分",props:{max:"最大分值",disabled:"是否禁用",allowHalf:"是否允许半选",voidColor:"未选中时图标的颜色",disabledVoidColor:"只读时未选中时图标的颜色",voidIconClass:"未选中时图标的类名",disabledVoidIconClass:"只读时未选中时图标的类名",showScore:"是否显示当前分数",textColor:"辅助文字的颜色",scoreTemplate:"分数显示模板"}},select:{name:"选择器",event:{removeTag:"多选模式下移除tag时触发"},props:{multiple:"是否多选",disabled:"是否禁用",clearable:"是否可以清空选项",collapseTags:"多选时是否将选中值按文字的形式展示",multipleLimit:"多选时用户最多可以选择的项目数,为 0 则不限制",placeholder:"占位符",filterable:"是否可搜索",allowCreate:"是否允许用户创建新条目",noMatchText:"搜索条件无匹配时显示的文字",noDataText:"选项为空时显示的文字",reserveKeyword:"多选且可搜索时,是否在选中一个选项后保留当前的搜索关键词",defaultFirstOption:"在输入框按下回车,选择第一个匹配项",remote:"其中的选项是否从服务器远程加载",remoteMethod:"自定义远程搜索方法"}},slider:{name:"滑块",props:{min:"最小值",max:"最大值",disabled:"是否禁用",step:"步长",showInput:"是否显示输入框,仅在非范围选择时有效",showInputControls:"在显示输入框的情况下,是否显示输入框的控制按钮",showStops:"是否显示间断点",range:"是否为范围选择",vertical:"是否竖向模式",height:"Slider 高度,竖向模式时必填"}},space:{name:"间距",props:{height:"高度"}},subForm:{name:"分组",props:{disabled:"是否禁用",syncDisabled:"是否与子表单强制同步禁用状态"}},switch:{name:"开关",props:{disabled:"是否禁用",width:"宽度(px)",activeText:"打开时的文字描述",inactiveText:"关闭时的文字描述",activeValue:"打开时的值",inactiveValue:"关闭时的值",activeColor:"打开时的背景色",inactiveColor:"关闭时的背景色"}},tableForm:{name:"表格表单",props:{disabled:"是否禁用",filterEmptyColumn:"是否过滤空行的数据",max:"最多添加几行,为 0 则不限制",min:"最少添加几行",addable:"允许新增",deletable:"允许删除"}},tableFormColumn:{name:"表格格子",label:"自定义名称",props:{align:"对齐方式",label:"标题",width:"宽度",color:"颜色",required:"是否显示必填星号"}},text:{name:"文字",props:{formCreateNative:"是否显示标题",formCreateTitle:"标题",formCreateChild:"内容"}},textarea:{name:"多行输入框",event:{change:"当值改变时,当组件失去焦点或用户按Enter时触发"},props:{disabled:"是否禁用",readonly:"是否只读",maxlength:"最大输入长度",minlength:"最小输入长度",showWordLimit:"是否显示统计字数",placeholder:"输入框占位文本",rows:"输入框行数",autosize:"高度是否自适应"}},timePicker:{name:"时间",props:{pickerOptions:"当前时间日期选择器特有的选项",readonly:"完全只读",disabled:"禁用",editable:"文本框可输入",clearable:"是否显示清除按钮",placeholder:"非范围选择时的占位内容",startPlaceholder:"范围选择时开始日期的占位内容",endPlaceholder:"范围选择时开始日期的占位内容",isRange:"是否为时间范围选择",arrowControl:"是否使用箭头进行时间选择",align:"对齐方式"}},tree:{name:"树形控件",event:{nodeClick:"当节点被点击的时候触发",nodeContextmenu:"当某一节点被鼠标右键点击时会触发该事件",checkChange:"当复选框被点击的时候触发",check:"点击节点复选框之后触发",currentChange:"当前选中节点变化时触发的事件",nodeExpand:"节点被展开时触发的事件",nodeCollapse:"节点被关闭时触发的事件",nodeDragStart:"节点开始拖拽时触发的事件",nodeDragEnter:"拖拽进入其他节点时触发的事件",nodeDragLeave:"拖拽离开某个节点时触发的事件",nodeDragOver:"在拖拽节点时触发的事件(类似浏览器的 mouseover 事件)",nodeDragEnd:"拖拽结束时(可能未成功)触发的事件",nodeDrop:"拖拽成功完成时触发的事件"},props:{emptyText:"内容为空的时候展示的文本",props:"配置选项",renderAfterExpand:"是否在第一次展开某个树节点后才渲染其子节点",defaultExpandAll:"是否默认展开所有节点",expandOnClickNode:"是否在点击节点的时候展开或者收缩节点,如果为 false,则只有点箭头图标的时候才会展开或者收缩节点。",checkOnClickNode:"是否在点击节点的时候选中节点",autoExpandParent:"展开子节点的时候是否自动展开父节点",checkStrictly:"在显示复选框的情况下,是否严格的遵循父子不互相关联的做法",accordion:"是否每次只打开一个同级树节点展开",indent:"相邻级节点间的水平缩进(px)",nodeKey:"每个树节点用来作为唯一标识的属性,整棵树应该是唯一的"}},upload:{name:"上传",info:"上传成功后,将接口返回的 URL 赋值给 file.url,或将返回结果赋值给 file.value,以便在后续的表单提交时获取这些数据。",event:{remove:"文件列表移除文件时触发",preview:"点击文件列表中已上传的文件时触发",error:"文件上传失败时触发",progress:"文件上传时触发",exceed:"当超出限制时触发"},props:{listType:"上传类型",multiple:"是否支持多选文件",action:"上传的地址(必填)",beforeUpload:"上传文件之前触发",onSuccess:"上传成功时触发",beforeRemove:"删除文件之前触发",headers:"设置上传的请求头部",data:"上传时附带的额外参数",name:"上传的文件字段名",withCredentials:"支持发送 cookie 凭证信息",accept:"接受上传的文件类型",autoUpload:"是否在选取文件后立即进行上传",disabled:"是否禁用",limit:"最大允许上传个数"}}}},GH=(e,t)=>Kge({message:e,type:t||"info",customClass:"_fc-message-tip"}),gs=e=>GH(e,"error"),Dye=Object.assign||function(e){for(let t,n=1;n + + + +