diff --git a/src/main/java/com/budwk/app/flow/controller/FlowTodoCenterController.java b/src/main/java/com/budwk/app/flow/controller/FlowTodoCenterController.java index e2b9850a..f0da0ce0 100644 --- a/src/main/java/com/budwk/app/flow/controller/FlowTodoCenterController.java +++ b/src/main/java/com/budwk/app/flow/controller/FlowTodoCenterController.java @@ -12,6 +12,8 @@ import org.nutz.dao.Cnd; import org.nutz.dao.Dao; import org.nutz.dao.Sqls; import org.nutz.dao.sql.Sql; +import org.nutz.dao.util.cri.SqlExpressionGroup; +import org.nutz.dao.util.cri.Static; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.json.Json; @@ -51,7 +53,8 @@ public class FlowTodoCenterController { t.h5FormKey, t.createdAt, t.finishTime, - t.variable, + t.variable AS taskVariable, + ins.variable, ins.state AS instanceState, ins.id AS instanceId, ins.businessNo, @@ -66,7 +69,14 @@ public class FlowTodoCenterController { $condition """); Cnd cnd = Cnd.NEW(); - cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode()); + // 普通待办仍按进行中任务查询;提案进入团长审核后,补充展示尚未附议的已废弃 second 任务。 + SqlExpressionGroup todoTaskGroup = Cnd.exps("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode()); + SqlExpressionGroup proposalSecondGroup = Cnd.exps("t.taskState", "=", ProcessTaskStateEnum.ABANDON.getCode()) + .and("t.taskName", "=", "second") + .and(new Static("EXISTS (SELECT 1 FROM proposal_second ps WHERE ps.proposalId = ins.businessNo AND ps.seconderId = ta.actorId AND ps.isAgree IS NULL)")) + .and(new Static("EXISTS (SELECT 1 FROM wf_process_task dt WHERE dt.processInstanceId = t.processInstanceId AND dt.taskName = 'delegation' AND dt.taskState = 10)")); + todoTaskGroup.or(proposalSecondGroup); + cnd.and(todoTaskGroup); cnd.and("ta.actorId", "=", SecurityUtil.getUserId()); cnd.andEX("def.category", "=", category); if (StrUtil.isNotBlank(searchKeyword)) { @@ -96,7 +106,8 @@ public class FlowTodoCenterController { t.h5FormKey, t.createdAt, t.finishTime, - t.variable, + t.variable AS taskVariable, + ins.variable, ins.state AS instanceState, ins.id AS instanceId, ins.businessNo, @@ -223,7 +234,27 @@ public class FlowTodoCenterController { LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id WHERE ta.actorId = @userId - AND t.taskState = 10 + AND ( + t.taskState = 10 + OR ( + t.taskState = 99 + AND t.taskName = 'second' + AND EXISTS ( + SELECT 1 + FROM proposal_second ps + WHERE ps.proposalId = (SELECT businessNo FROM wf_process_instance WHERE id = t.processInstanceId) + AND ps.seconderId = ta.actorId + AND ps.isAgree IS NULL + ) + AND EXISTS ( + SELECT 1 + FROM wf_process_task dt + WHERE dt.processInstanceId = t.processInstanceId + AND dt.taskName = 'delegation' + AND dt.taskState = 10 + ) + ) + ) """); todoSql.setParam("userId", SecurityUtil.getUserId()); todoSql.setCallback(Sqls.callback.integer()); diff --git a/src/main/java/com/budwk/app/flow/entity/ProcessInstance.java b/src/main/java/com/budwk/app/flow/entity/ProcessInstance.java index 8720fab6..b96aedcf 100644 --- a/src/main/java/com/budwk/app/flow/entity/ProcessInstance.java +++ b/src/main/java/com/budwk/app/flow/entity/ProcessInstance.java @@ -6,7 +6,9 @@ import lombok.Setter; import org.nutz.dao.entity.annotation.Column; import org.nutz.dao.entity.annotation.Comment; import org.nutz.dao.entity.annotation.Id; +import org.nutz.dao.entity.annotation.Index; import org.nutz.dao.entity.annotation.Table; +import org.nutz.dao.entity.annotation.TableIndexes; import java.io.Serializable; import java.util.Date; @@ -22,6 +24,9 @@ import java.util.Date; @Getter @Setter @Table("wf_process_instance") +@TableIndexes({ + @Index(name = "INDEX_WF_PROCESS_INSTANCE_BUSINESS_NO", fields = {"businessNo"}, unique = false) +}) @Comment("流程实例") public class ProcessInstance extends BaseModel { diff --git a/src/main/java/com/budwk/app/flow/entity/ProcessTask.java b/src/main/java/com/budwk/app/flow/entity/ProcessTask.java index 406361b1..b4e634df 100644 --- a/src/main/java/com/budwk/app/flow/entity/ProcessTask.java +++ b/src/main/java/com/budwk/app/flow/entity/ProcessTask.java @@ -6,7 +6,9 @@ import lombok.Setter; import org.nutz.dao.entity.annotation.Column; import org.nutz.dao.entity.annotation.Comment; import org.nutz.dao.entity.annotation.Id; +import org.nutz.dao.entity.annotation.Index; import org.nutz.dao.entity.annotation.Table; +import org.nutz.dao.entity.annotation.TableIndexes; import java.io.Serializable; import java.util.Date; @@ -19,6 +21,9 @@ import java.util.Date; @Getter @Setter @Table("wf_process_task") +@TableIndexes({ + @Index(name = "INDEX_WF_PROCESS_TASK_INSTANCE_STATE", fields = {"processInstanceId", "taskState"}, unique = false) +}) @Comment("流程任务") public class ProcessTask extends BaseModel { diff --git a/src/main/java/com/budwk/app/flow/service/FlowCommonService.java b/src/main/java/com/budwk/app/flow/service/FlowCommonService.java index 5cbb62ee..1230331c 100644 --- a/src/main/java/com/budwk/app/flow/service/FlowCommonService.java +++ b/src/main/java/com/budwk/app/flow/service/FlowCommonService.java @@ -11,6 +11,8 @@ import com.budwk.app.flow.engine.event.ProcessPublisher; import com.budwk.app.flow.entity.ProcessInstance; import com.budwk.app.flow.entity.ProcessTask; import com.budwk.app.flow.enums.*; +import com.budwk.app.sys.models.Sys_unit; +import com.budwk.app.sys.views.View_user; import com.budwk.app.web.commons.auth.utils.SecurityUtil; import org.nutz.aop.interceptor.ioc.TransAop; import org.nutz.dao.Chain; @@ -22,6 +24,7 @@ import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.json.Json; import java.util.List; +import java.util.Optional; @IocBean public class FlowCommonService { @@ -61,11 +64,13 @@ public class FlowCommonService { args.put(FlowConst.SUBMIT_TYPE, submitType); + Sys_unit sysUnit = dao.fetch(Sys_unit.class, Cnd.where("id", "=", SecurityUtil.getUnitId())); + // 设置办理人信息到表单参数 args.put(FlowConst.TASK_FORM_DATA_PREFIX + "userName", SecurityUtil.getUserUsername()); args.put(FlowConst.TASK_FORM_DATA_PREFIX + "loginName", SecurityUtil.getUserLoginname()); args.put(FlowConst.TASK_FORM_DATA_PREFIX + "unitId", SecurityUtil.getUnitId()); - args.put(FlowConst.TASK_FORM_DATA_PREFIX + "unitName", SecurityUtil.getUnitId()); + args.put(FlowConst.TASK_FORM_DATA_PREFIX + "unitName", Optional.of(sysUnit).map(Sys_unit::getName).orElse("")); args.put(FlowConst.TASK_FORM_DATA_PREFIX + "unionId", SecurityUtil.getUnionId()); if (ObjectUtil.equals(submitType, ProcessSubmitTypeEnum.ROLLBACK.getCode())) { diff --git a/src/main/java/com/budwk/app/sys/controller/SysConfController.java b/src/main/java/com/budwk/app/sys/controller/SysConfController.java index d6a0e76e..35788e11 100644 --- a/src/main/java/com/budwk/app/sys/controller/SysConfController.java +++ b/src/main/java/com/budwk/app/sys/controller/SysConfController.java @@ -4,7 +4,6 @@ import cn.dev33.satoken.annotation.SaCheckPermission; import com.budwk.app.base.annotation.SLog; import com.budwk.app.base.constant.RedisConstant; import com.budwk.app.base.result.Result; -import com.budwk.app.base.utils.PageUtil; import com.budwk.app.sys.models.Sys_config; import com.budwk.app.sys.services.SysConfigService; import com.budwk.app.web.commons.auth.utils.SecurityUtil; @@ -139,17 +138,18 @@ public class SysConfController { @At @Ok("json:full") @SaCheckPermission("sys.manager.conf") - public Object data(@Param("pageNumber") int pageNumber, @Param("pageSize") int pageSize, @Param("pageOrderName") String pageOrderName, @Param("pageOrderBy") String pageOrderBy) { + public Object data(@Param("pageNumber") int pageNumber, + @Param("pageSize") int pageSize, + @Param("pageOrderName") String pageOrderName, + @Param("pageOrderBy") String pageOrderBy, + @Param("configKey") String configKey) { try { ensureAppImageConfig("AppHomeImg", "PC首页轮播图"); ensureAppImageConfig("H5AppHomeImg", "移动端首页轮播图"); ensureAppImageConfig("AppFeaturedActivityImg", "精彩活动页顶部图片"); ensureAppImageConfig("AppFestivalBenefitImg", "节日福利页顶部图片"); - Cnd cnd = Cnd.NEW(); - if (Strings.isNotBlank(pageOrderName) && Strings.isNotBlank(pageOrderBy)) { - cnd.orderBy(pageOrderName, PageUtil.getOrder(pageOrderBy)); - } - return Result.success().addData(sysConfigService.listPage(pageNumber, pageSize, cnd)); + return Result.success().addData(sysConfigService.pageData( + pageNumber, pageSize, pageOrderName, pageOrderBy, configKey)); } catch (Exception e) { return Result.error(); } diff --git a/src/main/java/com/budwk/app/sys/controller/SysHomeController.java b/src/main/java/com/budwk/app/sys/controller/SysHomeController.java index ed8a0e9e..13258155 100644 --- a/src/main/java/com/budwk/app/sys/controller/SysHomeController.java +++ b/src/main/java/com/budwk/app/sys/controller/SysHomeController.java @@ -154,10 +154,15 @@ public class SysHomeController { .and(Sys_menu::getPlatform, "=", platform) ); List menus = sysUserService.getMenus(SecurityUtil.getUserId()); - List allMenuIds = menus.stream().map(Sys_menu::getId).toList(); + Set allMenuIds = menus.stream().map(Sys_menu::getId).collect(Collectors.toSet()); + Set allParentMenuIds = menus.stream() + .map(Sys_menu::getParentId) + .filter(StrUtil::isNotBlank) + .collect(Collectors.toSet()); List sysMenus = list.stream() - // 推荐项必须同时属于当前用户已授权菜单,避免首页展示无权限入口。 - .filter(menu -> allMenuIds.contains(menu.getId())) + // 应用有已授权子菜单,或根菜单自身有链接且已授权时,才允许在首页展示入口。 + .filter(menu -> allParentMenuIds.contains(menu.getId()) + || (StrUtil.isNotBlank(menu.getHref()) && allMenuIds.contains(menu.getId()))) .sorted(Comparator.comparing(Sys_menu::getLocation, Comparator.nullsLast(Integer::compareTo)) .thenComparing(Sys_menu::getId)) .toList(); @@ -175,7 +180,7 @@ public class SysHomeController { .and(Sys_menu::getPlatform, "=", platform) ); List menus = sysUserService.getMenus(SecurityUtil.getUserId()); - List allMenuIds = menus.stream().map(Sys_menu::getId).toList(); + Set allMenuIds = menus.stream().map(Sys_menu::getId).collect(Collectors.toSet()); List sysMenus = list.stream() // 推荐项必须同时属于当前用户已授权菜单,避免首页展示无权限入口。 .filter(menu -> allMenuIds.contains(menu.getId())) diff --git a/src/main/java/com/budwk/app/sys/controller/SysRoleController.java b/src/main/java/com/budwk/app/sys/controller/SysRoleController.java index f468276c..83de63fe 100644 --- a/src/main/java/com/budwk/app/sys/controller/SysRoleController.java +++ b/src/main/java/com/budwk/app/sys/controller/SysRoleController.java @@ -8,6 +8,7 @@ import com.budwk.app.base.annotation.SLog; import com.budwk.app.base.result.Result; import com.budwk.app.base.utils.PageUtil; import com.budwk.app.sys.models.Sys_menu; +import com.budwk.app.sys.models.Sys_module; import com.budwk.app.sys.models.Sys_role; import com.budwk.app.sys.models.Sys_unit; import com.budwk.app.sys.models.Sys_user; @@ -23,6 +24,8 @@ import org.nutz.dao.FieldFilter; import org.nutz.dao.Sqls; import org.nutz.dao.sql.Sql; import org.nutz.dao.util.Daos; +import org.nutz.aop.interceptor.ioc.TransAop; +import org.nutz.ioc.aop.Aop; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.lang.Lang; @@ -120,6 +123,7 @@ public class SysRoleController { @Ok("json:full") @SaCheckPermission("sys.manager.role") public Object pageData(@Param("searchUnit") String searchUnit, + @Param("moduleId") String moduleId, @Param("searchName") String searchName, @Param("searchKeyword") String searchKeyword, @Param("searchName2") String searchName2, @@ -130,9 +134,10 @@ public class SysRoleController { try { Sql sql = Sqls.create(""" SELECT - role.* + role.*, module.name AS moduleName FROM sys_role role + LEFT JOIN sys_module module ON module.id = role.moduleId LEFT JOIN sys_user_role ur ON role.id = ur.roleId LEFT JOIN sys_user u ON u.id = ur.userId $condition @@ -163,6 +168,9 @@ public class SysRoleController { if (StrUtil.isAllNotBlank(searchName2, searchKeyword2)) { cnd.and("u." + searchName2, "like", "%" + searchKeyword2 + "%"); } + if (StrUtil.isNotBlank(moduleId)) { + cnd.and("role.moduleId", "=", moduleId); + } if (Strings.isNotBlank(pageOrderName) && Strings.isNotBlank(pageOrderBy)) { cnd.orderBy(pageOrderName, PageUtil.getOrder(pageOrderBy)); } else { @@ -287,8 +295,13 @@ public class SysRoleController { @Ok("json") @SaCheckPermission("sys.manager.role.add") @SLog(tag = "添加角色", msg = "角色名称:${args[1].name}") + @Aop(TransAop.READ_COMMITTED) public Object addDo(@Param("..") Sys_role role, HttpServletRequest req) { try { + // 所属模块只允许选择已配置的 PC 端模块,避免角色关联无效或 H5 模块。 + if (!isPcModule(role.getModuleId())) { + return Result.error("请选择所属模块"); + } int num = sysRoleService.count(Cnd.where("code", "=", role.getCode().trim())); if (num > 0) { return Result.error("角色编码已存在"); @@ -360,8 +373,13 @@ public class SysRoleController { @Ok("json") @SaCheckPermission("sys.manager.role.edit") @SLog(tag = "修改角色", msg = "角色名称:${args[0].name}") + @Aop(TransAop.READ_COMMITTED) public Object editDo(@Param("..") Sys_role role, HttpServletRequest req) { try { + // 编辑时同样校验模块,保证历史角色补录后始终关联有效 PC 模块。 + if (!isPcModule(role.getModuleId())) { + return Result.error("请选择所属模块"); + } Sys_role oldRole = sysRoleService.fetch(role.getId()); if (oldRole != null && !Strings.sBlank(oldRole.getCode()).equalsIgnoreCase(role.getCode())) { int num = sysRoleService.count(Cnd.where("code", "=", role.getCode().trim())); @@ -401,14 +419,13 @@ public class SysRoleController { public Object user(@Param("roleId") String roleId, @Param("searchName") String searchName, @Param("searchKeyword") String searchKeyword, @Param("pageNumber") int pageNumber, @Param("pageSize") int pageSize, @Param("pageOrderName") String pageOrderName, @Param("pageOrderBy") String pageOrderBy) { try { - Sql sql = Sqls.create("SELECT a.*,c.name as unitname FROM sys_user a,sys_user_role b,sys_unit c WHERE a.unitid=c.id and a.id=b.userId and b.roleId=@roleId $s $o"); + Sql sql = Sqls.create("SELECT a.*,c.name as unitname FROM sys_user a,sys_user_role b,sys_unit c WHERE a.unitid=c.id and a.id=b.userId and enable='1' and b.roleId=@roleId $s $o"); sql.params().set("roleId", roleId); if (Strings.isNotBlank(searchName) && Strings.isNotBlank(searchKeyword)) { sql.vars().set("s", " and a." + searchName + " like '%" + searchKeyword + "%'"); } if (Strings.isNotBlank(pageOrderName) && Strings.isNotBlank(pageOrderBy)) { sql.vars().set("o", " order by a." + pageOrderName + " " + PageUtil.getOrder(pageOrderBy)); - } return Result.success().addData(sysUserService.listPage(pageNumber, pageSize, sql)); } catch (Exception e) { @@ -503,24 +520,42 @@ public class SysRoleController { cnd.and(Cnd.exps("parentId", "is", null).or("parentId", "=", "")); return Result.success(Daos.ext(sysRoleService.dao(), fieldFilter).query(Sys_menu.class, cnd)); } + + /** + * 查询角色可选择的 PC 端模块。 + * + * @return PC 端模块列表,按模块排序编号升序返回,元素包含模块 ID 和模块名称 + */ + @At + @Ok("json:full") + @SaCheckPermission("sys.manager.role") + public Result listModule() { + List modules = sysRoleService.dao().query(Sys_module.class, + Cnd.where(Sys_module::getPlatform, "=", "PC").asc(Sys_module::getSortNum)); + return Result.success(modules); + } + + /** + * 校验所属模块是否存在且属于 PC 平台。 + * + * @param moduleId 模块主键,必须来自 sys_module 的 PC 端模块记录 + * @return 模块有效时返回 true,否则返回 false + */ + private boolean isPcModule(String moduleId) { + if (StrUtil.isBlank(moduleId)) { + return false; + } + Sys_module module = sysRoleService.dao().fetch(Sys_module.class, moduleId); + return module != null && "PC".equals(module.getPlatform()); + } + @At @Ok("json:full") @SaCheckLogin public Result getRoleNames(){ - Sql sql = Sqls.create(""" - SELECT - GROUP_CONCAT(DISTINCT sr.`name`) roleNames - FROM - `sys_user_role` sur - LEFT JOIN sys_role sr ON sr.id = sur.roleId - WHERE - sur.userId = @userId - ORDER BY - sr.sort DESC - """).setParam("userId", SecurityUtil.getUserId()); - sql.setCallback(Sqls.callback.map()); - sysRoleService.dao().execute(sql); - return Result.success(sql.getResult()); + // 首页身份与菜单、接口权限使用同一启用角色集合。 + String roleNames = sysUserService.getEnabledRoleNames(SecurityUtil.getUserId()); + return Result.success(NutMap.NEW().addv("roleNames", roleNames)); } diff --git a/src/main/java/com/budwk/app/sys/controller/SysSignatureController.java b/src/main/java/com/budwk/app/sys/controller/SysSignatureController.java index adbcab67..d0c7c8d9 100644 --- a/src/main/java/com/budwk/app/sys/controller/SysSignatureController.java +++ b/src/main/java/com/budwk/app/sys/controller/SysSignatureController.java @@ -131,7 +131,8 @@ public class SysSignatureController { @Aop(TransAop.READ_COMMITTED) public Result update(@Param("file") TempFile tempFile) { String url = sysFileService.uploadReturnUrl(SysFileEngineTypeEnum.MINIO.getValue(), tempFile); - Sys_user_signature sysUserSignature = dao.fetch(Sys_user_signature.class); + // 签字记录必须按当前登录用户读取,避免后续用户更新时覆盖其他用户的签字。 + Sys_user_signature sysUserSignature = dao.fetch(Sys_user_signature.class, Cnd.where(Sys_user_signature::getUserId, "=", SecurityUtil.getUserId())); if (ObjectUtil.isNull(sysUserSignature)) { sysUserSignature = new Sys_user_signature(); } diff --git a/src/main/java/com/budwk/app/sys/controller/SysUnionController.java b/src/main/java/com/budwk/app/sys/controller/SysUnionController.java index 7d09a7fa..e6607b1a 100644 --- a/src/main/java/com/budwk/app/sys/controller/SysUnionController.java +++ b/src/main/java/com/budwk/app/sys/controller/SysUnionController.java @@ -7,6 +7,8 @@ import cn.hutool.core.lang.tree.Tree; import cn.hutool.core.lang.tree.TreeNode; import cn.hutool.core.lang.tree.TreeUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.exception.BaseException; import com.budwk.app.base.page.Pagination; @@ -263,7 +265,7 @@ public class SysUnionController { if (Lang.isEmpty(branchUnionRoles)) { return Result.success(); } - List branchUnionRoleCodes = branchUnionRoles.stream().map(Sys_dict::getCode).toList(); + List branchUnionRoleCodes = getBranchUnionRoleCodes(branchUnionRoles); Sql sql = Sqls.create(""" SELECT @@ -338,7 +340,7 @@ public class SysUnionController { if (Lang.isEmpty(branchUnionRoles)) { return Result.success(List.of()); } - List branchUnionRoleCodes = branchUnionRoles.stream().map(Sys_dict::getCode).toList(); + List branchUnionRoleCodes = getBranchUnionRoleCodes(branchUnionRoles); Sql sql = Sqls.create(""" SELECT DISTINCT @@ -371,6 +373,41 @@ public class SysUnionController { return Result.success(usedJCodes); } + /** + * 查询分工会干部角色选项,并补充按单位授权的二级党委书记角色。 + * + * @return 角色编码和名称 + */ + @At + @SaCheckPermission("sys.manager.union.branchOfficer") + public Result branchUnionRoleOptions() { + List roleOptions = sysDictService.getSubListByCode("BRANCH_UNION_ROLES").stream() + .map(item -> NutMap.NEW().addv("code", item.getCode()).addv("name", item.getName())) + .collect(Collectors.toCollection(ArrayList::new)); + if (sysRoleService.getByCode(RoleConstant.UNIT_PARTY_SECRETARY) != null + && roleOptions.stream().noneMatch(item -> RoleConstant.UNIT_PARTY_SECRETARY.name().equals(item.getString("code")))) { + roleOptions.add(NutMap.NEW().addv("code", RoleConstant.UNIT_PARTY_SECRETARY.name()).addv("name", "二级党委书记")); + } + return Result.success(roleOptions); + } + + /** + * 查询当前分工会可配置二级党委书记的组成单位。 + * + * @param unionId 分工会ID + * @return 当前分工会的二级单位 + */ + @At + @SaCheckPermission("sys.manager.union.branchOfficer") + public Result branchUnionPartySecretaryUnitOptions(String unionId) { + if (StrUtil.isBlank(unionId)) { + return Result.error("分工会参数不能为空"); + } + List units = dao.query(Sys_unit.class, Cnd.where("unionId", "=", unionId) + .and("unitLevel", "=", 2).asc("unitcode")); + return Result.success(units); + } + @At @SaCheckPermission("sys.manager.union.branchOfficer") @ApiOperation("添加分工会人员角色") @@ -419,10 +456,16 @@ public class SysUnionController { unionCadre.setIsJoin(true); dao.insert(unionCadre); - // 去走工作流 + // 校级管理员新增普通干部时直接授权,不生成无实际审核意义的流程数据。 boolean isAdmin = AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name()); + if (isAdmin) { + sysUnionService.assignBranchUnionRole(userId, role.getId(), unionId, List.of()); + return Result.success(); + } + + // 非校级管理员仍按原业务发起基层干部授权审核流程。 Dict args = Dict.create(); - args.set("submit", isAdmin ? "admin" : "branch"); + args.set("submit", "branch"); args.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.APPLY.getCode()); args.set(FlowConst.FORM_DATA, unionCadre); @@ -433,14 +476,83 @@ public class SysUnionController { flowEngine.executeProcessTask(task.getId(), SecurityUtil.getUserId(), args); } - if (isAdmin) { - // 如果是管理员,直接加角色 - sysRoleService.clear("sys_user_role", Cnd.where("roleId", "=", role.getId()).and("userId", "=", userId).and("unionId", "=", unionId)); - sysRoleService.insert("sys_user_role", Chain.make("roleId", role.getId()).add("userId", userId).add("unionId", unionId)); - sysRoleService.clearCache(); - sysUserService.clearCache(); + return Result.success(); + } + + /** + * 新增二级党委书记授权。校级管理员直接按单位授权,其他用户发起审批, + * 审核通过后由流程拦截器按单位写入角色。 + * + * @param userId 人员ID + * @param unionId 分工会ID + * @param unitIds 组成单位ID集合 + * @param j 届次 + * @return 处理结果 + */ + @At + @SaCheckPermission("sys.manager.union.branchOfficer") + @ApiOperation("添加二级党委书记角色") + @Aop(TransAop.READ_COMMITTED) + public Result insertBranchUnionPartySecretaryRole(String userId, String unionId, @Param("unitIds") String[] unitIds, String j) { + if (StrUtil.isBlank(userId) || StrUtil.isBlank(unionId) || Lang.isEmpty(unitIds)) { + return Result.error("人员、分工会和所属单位不能为空"); + } + Sys_role role = sysRoleService.getByCode(RoleConstant.UNIT_PARTY_SECRETARY); + if (role == null) { + return Result.error("未配置二级党委书记角色"); + } + View_user user = dao.fetch(View_user.class, Cnd.where("id", "=", userId)); + if (user == null || !unionId.equals(user.getUnionId())) { + return Result.error("所选人员不属于当前分工会"); + } + List distinctUnitIds = java.util.Arrays.stream(unitIds) + .filter(StrUtil::isNotBlank) + .distinct() + .toList(); + List units = dao.query(Sys_unit.class, Cnd.where("id", "in", distinctUnitIds) + .and("unionId", "=", unionId).and("unitLevel", "=", 2)); + if (units.size() != distinctUnitIds.size()) { + return Result.error("所属单位包含非当前分工会的单位"); + } + int roleCount = dao.count(Sys_user_role.class, Cnd.where("roleId", "=", role.getId()) + .and("userId", "=", userId).and("unionId", "=", unionId)); + if (roleCount > 0) { + return Result.error("该人员已设置二级党委书记,请先删除后再重新设置"); } + Sys_union_cadre unionCadre = new Sys_union_cadre(); + unionCadre.setUserId(userId); + unionCadre.setUnionId(unionId); + unionCadre.setMobile(user.getMobile()); + unionCadre.setUnionName(user.getUnionName()); + unionCadre.setLoginName(user.getLoginname()); + unionCadre.setUserName(user.getUsername()); + unionCadre.setRoleCode(RoleConstant.UNIT_PARTY_SECRETARY.name()); + unionCadre.setJ(j); + unionCadre.setApplyDate(new Date()); + unionCadre.setIsServing(true); + unionCadre.setIsJoin(true); + dao.insert(unionCadre); + + boolean isAdmin = AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name()); + if (isAdmin) { + // 校级管理员直接按所选单位授权,不创建 JCGHWY 流程实例和审核任务。 + sysUnionService.assignBranchUnionRole(userId, role.getId(), unionId, distinctUnitIds); + return Result.success(); + } + + // 非校级管理员保留原审批流程,并将所选单位随表单传给审核通过拦截器。 + JSONObject formData = JSONUtil.parseObj(unionCadre); + formData.set("unitIds", distinctUnitIds); + Dict args = Dict.create(); + args.set("submit", "branch"); + args.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.APPLY.getCode()); + args.set(FlowConst.FORM_DATA, formData.toString()); + ProcessInstance instance = flowEngine.startProcessInstanceByKey("JCGHWY", unionCadre.getId(), SecurityUtil.getUserId(), args); + List doingTaskList = flowEngine.processTaskService().getDoingTaskList(instance.getId(), null); + for (ProcessTask task : doingTaskList) { + flowEngine.executeProcessTask(task.getId(), SecurityUtil.getUserId(), args); + } return Result.success(); } @@ -504,23 +616,34 @@ public class SysUnionController { return Result.success(); } + /** + * 将字典维护的分工会角色与单位级二级党委书记角色合并为列表查询范围。 + */ + private List getBranchUnionRoleCodes(List branchUnionRoles) { + List roleCodes = new ArrayList<>(branchUnionRoles.stream().map(Sys_dict::getCode).toList()); + if (sysRoleService.getByCode(RoleConstant.UNIT_PARTY_SECRETARY) != null + && !roleCodes.contains(RoleConstant.UNIT_PARTY_SECRETARY.name())) { + roleCodes.add(RoleConstant.UNIT_PARTY_SECRETARY.name()); + } + return roleCodes; + } + + /** + * 分页查询当前分工会的组成单位。 + * + * @param pageForm 分页和查询参数;pageNumber 为页码,pageSize 为每页条数,searchKeyword 为单位编码或名称 + * @param unionId 分工会ID,不能为空 + * @return Result;data 为 Pagination,list 是当前页单位列表,totalCount 是符合条件的单位总数 + */ @At @ApiOperation("分工会组成单位分页") @SaCheckPermission("sys.manager.union") - public Result branchUnionPartUnitPageData(PageForm pageForm, String unionId) { - Cnd cnd = Cnd.NEW(); - cnd.and("unionId", "=", unionId); - if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) { - SqlExpressionGroup seg = new SqlExpressionGroup(); - seg.orLike("`name`", pageForm.getSearchKeyword()); - seg.orLike("unitcode", pageForm.getSearchKeyword()); - cnd.and(seg); + public Result branchUnionPartUnitPageData(@Valid PageForm pageForm, String unionId) { + if (StrUtil.isBlank(unionId)) { + return Result.error("分工会参数不能为空"); } - cnd.desc("unitcode"); - - List list = dao.query(Sys_unit.class, cnd); - return Result.success(list); + return Result.success(sysUnitService.pageBranchUnionPartUnits(pageForm, unionId)); } @At diff --git a/src/main/java/com/budwk/app/sys/controller/v4/SysV4MsgController.java b/src/main/java/com/budwk/app/sys/controller/v4/SysV4MsgController.java index 8340f0a3..6b764010 100644 --- a/src/main/java/com/budwk/app/sys/controller/v4/SysV4MsgController.java +++ b/src/main/java/com/budwk/app/sys/controller/v4/SysV4MsgController.java @@ -1,6 +1,7 @@ package com.budwk.app.sys.controller.v4; import cn.dev33.satoken.annotation.SaCheckLogin; +import cn.hutool.core.util.StrUtil; import com.budwk.app.base.page.Pagination; import com.budwk.app.base.param.PageForm; import com.budwk.app.base.result.Result; @@ -50,6 +51,7 @@ public class SysV4MsgController { m.title, m.content, m.type, + m.sendTime, r.isRead, r.readTime FROM @@ -69,6 +71,10 @@ public class SysV4MsgController { cnd.andEX("m.type", "=", type); + if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) { + String keyword = "%" + pageForm.getSearchKeyword() + "%"; + cnd.and(Cnd.exps("m.title", "like", keyword).or("m.content", "like", keyword)); + } cnd.desc("m.sendTime"); sql.setCondition(cnd); diff --git a/src/main/java/com/budwk/app/sys/interceptor/SysUnionSchoolAuditInterceptor.java b/src/main/java/com/budwk/app/sys/interceptor/SysUnionSchoolAuditInterceptor.java index 39de1e1f..560b6ac7 100644 --- a/src/main/java/com/budwk/app/sys/interceptor/SysUnionSchoolAuditInterceptor.java +++ b/src/main/java/com/budwk/app/sys/interceptor/SysUnionSchoolAuditInterceptor.java @@ -1,6 +1,10 @@ package com.budwk.app.sys.interceptor; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; +import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.flow.constant.FlowConst; import com.budwk.app.flow.engine.FlowInterceptor; import com.budwk.app.flow.engine.core.Execution; @@ -13,6 +17,9 @@ import com.budwk.app.sys.services.SysUserService; import org.nutz.dao.Chain; import org.nutz.dao.Cnd; +import java.util.ArrayList; +import java.util.List; + /** * @version 1.0 * @Author FKY @@ -35,14 +42,37 @@ public class SysUnionSchoolAuditInterceptor implements FlowInterceptor { SysUserService sysUserService = ServiceContext.find(SysUserService.class); // 表单数据 - Sys_union_cadre unionBean = JSONUtil.toBean(formDataStr, Sys_union_cadre.class); + JSONObject formData = JSONUtil.parseObj(formDataStr); + Sys_union_cadre unionBean = JSONUtil.toBean(formData, Sys_union_cadre.class); // 清除对应角色然后再新增 Sys_role role = sysRoleService.getByCode(unionBean.getRoleCode()); sysRoleService.clear("sys_user_role", Cnd.where("roleId", "=", role.getId()) .and("userId", "=", unionBean.getUserId()).and("unionId", "=", unionBean.getUnionId())); - sysRoleService.insert("sys_user_role", Chain.make("roleId", role.getId()) - .add("userId", unionBean.getUserId()).add("unionId", unionBean.getUnionId())); + if (RoleConstant.UNIT_PARTY_SECRETARY.name().equals(unionBean.getRoleCode())) { + // 二级党委书记按申请中选定的单位分别授权,保障流程可按申请人所属单位找到办理人。 + JSONArray unitIdArray = formData.getJSONArray("unitIds"); + List unitIds = new ArrayList<>(); + if (unitIdArray != null) { + for (Object unitId : unitIdArray) { + String value = StrUtil.toString(unitId); + if (StrUtil.isNotBlank(value) && !unitIds.contains(value)) { + unitIds.add(value); + } + } + } + if (unitIds.isEmpty()) { + throw new IllegalArgumentException("二级党委书记未选择所属单位"); + } + for (String unitId : unitIds) { + sysRoleService.insert("sys_user_role", Chain.make("roleId", role.getId()) + .add("userId", unionBean.getUserId()).add("unionId", unionBean.getUnionId()).add("unitId", unitId)); + } + } else { + // 其他分工会角色保持原有按分工会单条授权的逻辑。 + sysRoleService.insert("sys_user_role", Chain.make("roleId", role.getId()) + .add("userId", unionBean.getUserId()).add("unionId", unionBean.getUnionId())); + } // 清除缓存 sysRoleService.clearCache(); diff --git a/src/main/java/com/budwk/app/sys/models/Sys_log.java b/src/main/java/com/budwk/app/sys/models/Sys_log.java index 53cea981..7f461db6 100644 --- a/src/main/java/com/budwk/app/sys/models/Sys_log.java +++ b/src/main/java/com/budwk/app/sys/models/Sys_log.java @@ -60,7 +60,7 @@ public class Sys_log extends BaseModel implements Serializable { @Column @Comment("请求结果") - @ColDefine(type = ColType.TEXT) + @ColDefine(customType = "MEDIUMTEXT") private String param; @Column diff --git a/src/main/java/com/budwk/app/sys/models/Sys_role.java b/src/main/java/com/budwk/app/sys/models/Sys_role.java index 75ebe81e..a6bd6d11 100644 --- a/src/main/java/com/budwk/app/sys/models/Sys_role.java +++ b/src/main/java/com/budwk/app/sys/models/Sys_role.java @@ -45,6 +45,11 @@ public class Sys_role extends BaseModel implements Serializable { @ColDefine(type = ColType.VARCHAR, width = 32) private String unitid; + @Column + @ColDefine(type = ColType.VARCHAR, width = 32) + @Comment("所属模块ID") + private String moduleId; + @Column @ColDefine(type = ColType.VARCHAR, width = 255) private String note; diff --git a/src/main/java/com/budwk/app/sys/models/Sys_user.java b/src/main/java/com/budwk/app/sys/models/Sys_user.java index 85a8349c..20985e24 100644 --- a/src/main/java/com/budwk/app/sys/models/Sys_user.java +++ b/src/main/java/com/budwk/app/sys/models/Sys_user.java @@ -211,6 +211,12 @@ public class Sys_user extends BaseModel implements Serializable { @DataCenterColumn(name = "教职工类别码", key = "RYLX", dict = "USER_PERSON_TYPE") private String personType; + @Column + @Comment("待确认状态:0不用确认、1待确认、2已确认") + @ColDefine(type = ColType.INT, width = 1) + @Default("0") + private Integer pendingConfirmStatus; + @Column @Comment("编制类别码") @ColDefine(type = ColType.VARCHAR, width = 30) diff --git a/src/main/java/com/budwk/app/sys/models/Sys_user_role.java b/src/main/java/com/budwk/app/sys/models/Sys_user_role.java index 5da88494..0e8420ee 100644 --- a/src/main/java/com/budwk/app/sys/models/Sys_user_role.java +++ b/src/main/java/com/budwk/app/sys/models/Sys_user_role.java @@ -16,6 +16,15 @@ public class Sys_user_role { @ColDefine(type = ColType.VARCHAR, width = 32) private String userId; + /** + * 用户角色关系是否启用。普通角色默认启用,教代会届次切换时按届次统一刷新。 + */ + @Column + @Comment("是否启用:1启用,0禁用") + @ColDefine(type = ColType.BOOLEAN) + @Default("1") + private Boolean enable = true; + @Column @ColDefine(type = ColType.VARCHAR, width = 32) private String unitId; diff --git a/src/main/java/com/budwk/app/sys/services/SysConfigService.java b/src/main/java/com/budwk/app/sys/services/SysConfigService.java index 017974a9..04490ba7 100644 --- a/src/main/java/com/budwk/app/sys/services/SysConfigService.java +++ b/src/main/java/com/budwk/app/sys/services/SysConfigService.java @@ -1,5 +1,6 @@ package com.budwk.app.sys.services; +import com.budwk.app.base.page.Pagination; import com.budwk.app.sys.models.Sys_config; import com.budwk.app.base.service.BaseService; @@ -16,4 +17,17 @@ public interface SysConfigService extends BaseService { List getAllList(); Sys_config getValueByKey(String key); + + /** + * 分页查询系统参数,支持按参数名模糊查询和安全排序。 + * + * @param pageNumber 页码 + * @param pageSize 每页条数 + * @param pageOrderName 排序字段 + * @param pageOrderBy 排序方向 + * @param configKey 参数名关键字 + * @return 系统参数分页数据 + */ + Pagination pageData(int pageNumber, int pageSize, String pageOrderName, + String pageOrderBy, String configKey); } diff --git a/src/main/java/com/budwk/app/sys/services/SysUnionService.java b/src/main/java/com/budwk/app/sys/services/SysUnionService.java index 302a4769..dcfceb16 100644 --- a/src/main/java/com/budwk/app/sys/services/SysUnionService.java +++ b/src/main/java/com/budwk/app/sys/services/SysUnionService.java @@ -3,5 +3,18 @@ package com.budwk.app.sys.services; import com.budwk.app.base.service.BaseService; import com.budwk.app.sys.models.Sys_union; +import java.util.List; + public interface SysUnionService extends BaseService { + + /** + * 直接分配分工会干部角色。普通干部传空单位集合时按分工会写入一条角色关系; + * 二级党委书记传单位集合时按单位分别写入角色关系。 + * + * @param userId 用户ID + * @param roleId 角色ID + * @param unionId 分工会ID + * @param unitIds 授权单位ID集合,普通干部角色传空集合 + */ + void assignBranchUnionRole(String userId, String roleId, String unionId, List unitIds); } diff --git a/src/main/java/com/budwk/app/sys/services/SysUnitService.java b/src/main/java/com/budwk/app/sys/services/SysUnitService.java index 257cd73c..1214da97 100644 --- a/src/main/java/com/budwk/app/sys/services/SysUnitService.java +++ b/src/main/java/com/budwk/app/sys/services/SysUnitService.java @@ -1,5 +1,7 @@ package com.budwk.app.sys.services; +import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.param.PageForm; import com.budwk.app.base.service.BaseService; import com.budwk.app.sys.models.Sys_unit; @@ -7,6 +9,15 @@ import com.budwk.app.sys.models.Sys_unit; * Created by wizzer on 2016/12/22. */ public interface SysUnitService extends BaseService { + /** + * 分页查询指定分工会的组成单位。 + * + * @param pageForm 分页和查询参数;pageNumber 为页码,pageSize 为每页条数,searchKeyword 为单位编码或名称 + * @param unionId 分工会ID,用于限制只查询当前分工会的组成单位 + * @return 分页结果;list 为当前页单位数据,totalCount 为符合条件的单位总数 + */ + Pagination pageBranchUnionPartUnits(PageForm pageForm, String unionId); + /** * 保存单位 * diff --git a/src/main/java/com/budwk/app/sys/services/SysUserService.java b/src/main/java/com/budwk/app/sys/services/SysUserService.java index 2cce57f7..62746a26 100644 --- a/src/main/java/com/budwk/app/sys/services/SysUserService.java +++ b/src/main/java/com/budwk/app/sys/services/SysUserService.java @@ -6,6 +6,7 @@ import com.budwk.app.base.exception.BaseException; import com.budwk.app.base.exception.UnknownAccountException; import com.budwk.app.base.service.BaseService; import com.budwk.app.sys.models.Sys_menu; +import com.budwk.app.sys.models.Sys_role; import com.budwk.app.sys.models.Sys_user; import javax.servlet.http.HttpServletRequest; @@ -31,6 +32,21 @@ public interface SysUserService extends BaseService { */ List getRoleCodeList(Sys_user user); + /** + * 查询用户当前启用的角色关系对应角色,供菜单、接口权限和首页身份统一使用。 + * + * @param userId 用户ID + * @return 当前启用且角色本身未禁用的角色列表 + */ + List getEnabledRoles(String userId); + + /** + * 查询用户当前启用角色的显示名称。 + * + * @param userId 用户ID + * @return 去重并按角色顺序排列的角色名称 + */ + String getEnabledRoleNames(String userId); /** * 获取用户的菜单 diff --git a/src/main/java/com/budwk/app/sys/services/impl/SysConfigServiceImpl.java b/src/main/java/com/budwk/app/sys/services/impl/SysConfigServiceImpl.java index 74b38ff4..d586bf68 100644 --- a/src/main/java/com/budwk/app/sys/services/impl/SysConfigServiceImpl.java +++ b/src/main/java/com/budwk/app/sys/services/impl/SysConfigServiceImpl.java @@ -1,15 +1,19 @@ package com.budwk.app.sys.services.impl; import com.budwk.app.base.exception.BaseException; +import com.budwk.app.base.page.Pagination; import com.budwk.app.base.service.impl.BaseServiceImpl; +import com.budwk.app.base.utils.PageUtil; import com.budwk.app.sys.models.Sys_config; import com.budwk.app.sys.services.SysConfigService; import org.nutz.dao.Cnd; import org.nutz.dao.Dao; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.lang.Lang; +import org.nutz.lang.Strings; import java.util.List; +import java.util.Set; /** * Created by wizzer on 2016/12/23. @@ -32,4 +36,32 @@ public class SysConfigServiceImpl extends BaseServiceImpl implements } return sys_config; } + + /** + * 分页查询系统参数。参数名使用模糊匹配,排序字段限定在列表可展示字段内, + * 防止未经校验的前端字段直接进入排序 SQL。 + * + * @param pageNumber 页码 + * @param pageSize 每页条数 + * @param pageOrderName 排序字段 + * @param pageOrderBy 排序方向 + * @param configKey 参数名关键字 + * @return 系统参数分页数据 + */ + @Override + @SuppressWarnings("unchecked") + public Pagination pageData(int pageNumber, int pageSize, String pageOrderName, + String pageOrderBy, String configKey) { + Cnd cnd = Cnd.NEW(); + if (Strings.isNotBlank(configKey)) { + cnd.where().andLike("configKey", configKey.trim()); + } + Set sortableColumns = Set.of("configKey", "configValue", "note"); + if (sortableColumns.contains(pageOrderName) && Strings.isNotBlank(pageOrderBy)) { + cnd.orderBy(pageOrderName, PageUtil.getOrder(pageOrderBy)); + } else { + cnd.asc("configKey"); + } + return listPage(pageNumber, pageSize, cnd); + } } diff --git a/src/main/java/com/budwk/app/sys/services/impl/SysDataUserAllUpdateServiceImpl.java b/src/main/java/com/budwk/app/sys/services/impl/SysDataUserAllUpdateServiceImpl.java index fbf37f69..790ad4d7 100644 --- a/src/main/java/com/budwk/app/sys/services/impl/SysDataUserAllUpdateServiceImpl.java +++ b/src/main/java/com/budwk/app/sys/services/impl/SysDataUserAllUpdateServiceImpl.java @@ -23,9 +23,12 @@ import com.budwk.app.zhgh.democratic.proposal.models.ProposalConfig; import com.budwk.app.zhgh.staffmanage.member.constant.MemberChangeOrigin; import com.budwk.app.zhgh.staffmanage.member.constant.MemberChangeType; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.nutz.aop.interceptor.ioc.TransAop; import org.nutz.dao.Cnd; import org.nutz.dao.Dao; +import org.nutz.dao.Sqls; +import org.nutz.dao.sql.Sql; import org.nutz.ioc.aop.Aop; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; @@ -50,6 +53,10 @@ import java.util.stream.Collectors; @IocBean public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService { private static final int BATCH_SIZE = 500; + /** 不需要人工确认。 */ + private static final int PENDING_CONFIRM_STATUS_NONE = 0; + /** 数据源缺失,等待人工确认。 */ + private static final int PENDING_CONFIRM_STATUS_PENDING = 1; @Inject private Dao dao; @@ -154,6 +161,10 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService for (Sys_user_source source : sources) { Sys_user user = userMap.get(source.getLoginname()); source.setMember(null); + String unitId = source.getUnitId(); + if (StringUtils.isNotBlank(unitId) && unitId.length() == 5) { + source.setUnitId(unitId.substring(0, 3)); + } // 创建用户对象 Sys_user u = new Sys_user(); @@ -174,7 +185,7 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService * 全量更新已有用户时置空,避免 updateIgnoreNull 把已迁移的基金会员标识覆盖为非会员。 */ u.setAidFundMember(null); - + u.setPersonType(null); needDoUpdateList.add(u); } @@ -346,6 +357,12 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService RoleEventPublisher.broadcast(new RoleEventMsg(unitId, RoleConstant.PROPOSAL_BRANCH_SCHOOL_LEADER.name(), RoleEventMsg.RENEW_ROLE)); } + /* + * 所有异步用户更新完成后再校正待确认状态,避免主事务提前锁定 sys_user, + * 导致异步更新线程等待主事务释放行锁而形成相互等待。 + */ + reconcilePendingConfirmStatus(updateParam.getPullTime()); + long endTime = System.currentTimeMillis(); log.info("全量更新用户数据完成,耗时: {} 毫秒", (endTime - startTime)); @@ -356,6 +373,49 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService + " 条"; } + /** + * 根据指定批次的完整数据源校正系统用户待确认状态。 + * 已人工确认且仍未重新出现的人员保持已确认状态,避免每次全量更新重复转为待确认。 + * + * @param pullTime 本次全量数据的拉取时间 + */ + private void reconcilePendingConfirmStatus(String pullTime) { + Sql resetStatusSql = Sqls.create(""" + UPDATE sys_user userInfo + SET userInfo.pendingConfirmStatus = @noneStatus + WHERE userInfo.personType IN ('教职工', '劳务派遣人员') + AND userInfo.pendingConfirmStatus <> @noneStatus + AND EXISTS ( + SELECT 1 + FROM sys_user_source sourceInfo + WHERE sourceInfo.pullTime = @pullTime + AND sourceInfo.loginname = userInfo.loginname + AND sourceInfo.personType IN ('教职工', '劳务派遣人员') + ) + """); + resetStatusSql.setParam("noneStatus", PENDING_CONFIRM_STATUS_NONE); + resetStatusSql.setParam("pullTime", pullTime); + dao.execute(resetStatusSql); + + Sql pendingStatusSql = Sqls.create(""" + UPDATE sys_user userInfo + SET userInfo.pendingConfirmStatus = @pendingStatus + WHERE userInfo.personType IN ('教职工', '劳务派遣人员') + AND IFNULL(userInfo.pendingConfirmStatus, @noneStatus) = @noneStatus + AND NOT EXISTS ( + SELECT 1 + FROM sys_user_source sourceInfo + WHERE sourceInfo.pullTime = @pullTime + AND sourceInfo.loginname = userInfo.loginname + AND sourceInfo.personType IN ('教职工', '劳务派遣人员') + ) + """); + pendingStatusSql.setParam("pendingStatus", PENDING_CONFIRM_STATUS_PENDING); + pendingStatusSql.setParam("noneStatus", PENDING_CONFIRM_STATUS_NONE); + pendingStatusSql.setParam("pullTime", pullTime); + dao.execute(pendingStatusSql); + } + /** * 构建变更的历史数据 * diff --git a/src/main/java/com/budwk/app/sys/services/impl/SysRoleServiceImpl.java b/src/main/java/com/budwk/app/sys/services/impl/SysRoleServiceImpl.java index b33dc62e..86e79a79 100644 --- a/src/main/java/com/budwk/app/sys/services/impl/SysRoleServiceImpl.java +++ b/src/main/java/com/budwk/app/sys/services/impl/SysRoleServiceImpl.java @@ -148,6 +148,11 @@ public class SysRoleServiceImpl extends BaseServiceImpl implements Sys @Override @Aop(TransAop.READ_COMMITTED) public void saveMenu(String[] menuIds, String roleId, String platform) { + // 保存前确认权限均属于当前平台,防止PC端与H5端权限混写。 + List menus = sysMenuService.query(Cnd.where("id", "in", menuIds).and("platform", "=", platform)); + if (menus.size() != menuIds.length) { + throw new BaseException("存在不属于当前平台的权限,无法保存"); + } //只清除对应平台的即可 Sql sql = Sqls.queryString(""" SELECT diff --git a/src/main/java/com/budwk/app/sys/services/impl/SysUnionServiceImpl.java b/src/main/java/com/budwk/app/sys/services/impl/SysUnionServiceImpl.java index 71a760ce..7efcc632 100644 --- a/src/main/java/com/budwk/app/sys/services/impl/SysUnionServiceImpl.java +++ b/src/main/java/com/budwk/app/sys/services/impl/SysUnionServiceImpl.java @@ -2,13 +2,65 @@ package com.budwk.app.sys.services.impl; import com.budwk.app.base.service.impl.BaseServiceImpl; import com.budwk.app.sys.models.Sys_union; +import com.budwk.app.sys.models.Sys_user_role; +import com.budwk.app.sys.services.SysRoleService; import com.budwk.app.sys.services.SysUnionService; +import com.budwk.app.sys.services.SysUserService; +import org.nutz.dao.Cnd; import org.nutz.dao.Dao; +import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; +import java.util.List; + @IocBean(args = {"refer:dao"}) public class SysUnionServiceImpl extends BaseServiceImpl implements SysUnionService { + + @Inject + private SysRoleService sysRoleService; + + @Inject + private SysUserService sysUserService; + public SysUnionServiceImpl(Dao dao) { super(dao); } + + /** + * 直接分配分工会干部角色,并在授权完成后统一清理权限缓存。 + * 普通角色按分工会授权一次,包含单位的角色按每个单位分别授权。 + * + * @param userId 用户ID + * @param roleId 角色ID + * @param unionId 分工会ID + * @param unitIds 授权单位ID集合,普通干部角色传空集合 + */ + @Override + public void assignBranchUnionRole(String userId, String roleId, String unionId, List unitIds) { + // 先清理同一用户在当前分工会下的相同角色,保证重新授权后不存在重复关系。 + dao().clear(Sys_user_role.class, Cnd.where(Sys_user_role::getRoleId, "=", roleId) + .and(Sys_user_role::getUserId, "=", userId) + .and(Sys_user_role::getUnionId, "=", unionId)); + + if (unitIds == null || unitIds.isEmpty()) { + Sys_user_role userRole = new Sys_user_role(); + userRole.setRoleId(roleId); + userRole.setUserId(userId); + userRole.setUnionId(unionId); + dao().insert(userRole); + } else { + // 二级党委书记按选中的单位分别生成角色关系,供后续单位级权限判断使用。 + for (String unitId : unitIds) { + Sys_user_role userRole = new Sys_user_role(); + userRole.setRoleId(roleId); + userRole.setUserId(userId); + userRole.setUnionId(unionId); + userRole.setUnitId(unitId); + dao().insert(userRole); + } + } + + sysRoleService.clearCache(); + sysUserService.clearCache(); + } } diff --git a/src/main/java/com/budwk/app/sys/services/impl/SysUnitServiceImpl.java b/src/main/java/com/budwk/app/sys/services/impl/SysUnitServiceImpl.java index 953e0142..f805b307 100644 --- a/src/main/java/com/budwk/app/sys/services/impl/SysUnitServiceImpl.java +++ b/src/main/java/com/budwk/app/sys/services/impl/SysUnitServiceImpl.java @@ -2,6 +2,8 @@ package com.budwk.app.sys.services.impl; import cn.hutool.core.util.StrUtil; import com.budwk.app.base.constant.RedisConstant; +import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.param.PageForm; import com.budwk.app.base.service.impl.BaseServiceImpl; import com.budwk.app.sys.models.Sys_unit; import com.budwk.app.sys.services.SysUnitService; @@ -10,6 +12,7 @@ import org.nutz.dao.Chain; import org.nutz.dao.Cnd; import org.nutz.dao.Dao; import org.nutz.dao.Sqls; +import org.nutz.dao.util.cri.SqlExpressionGroup; import org.nutz.ioc.aop.Aop; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.lang.Strings; @@ -26,6 +29,22 @@ public class SysUnitServiceImpl extends BaseServiceImpl implements Sys super(dao); } + /** + * 按单位编码或名称筛选当前分工会的组成单位,并按单位编码倒序分页。 + */ + @Override + public Pagination pageBranchUnionPartUnits(PageForm pageForm, String unionId) { + Cnd cnd = Cnd.where("unionId", "=", unionId); + if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) { + SqlExpressionGroup keywordCondition = new SqlExpressionGroup(); + keywordCondition.orLike("`name`", pageForm.getSearchKeyword()); + keywordCondition.orLike("unitcode", pageForm.getSearchKeyword()); + cnd.and(keywordCondition); + } + cnd.desc("unitcode"); + return listPage(pageForm.getPageNumber(), pageForm.getPageSize(), Sys_unit.class, cnd); + } + /** * 新增单位 * diff --git a/src/main/java/com/budwk/app/sys/services/impl/SysUserServiceImpl.java b/src/main/java/com/budwk/app/sys/services/impl/SysUserServiceImpl.java index 63a91406..e4141107 100644 --- a/src/main/java/com/budwk/app/sys/services/impl/SysUserServiceImpl.java +++ b/src/main/java/com/budwk/app/sys/services/impl/SysUserServiceImpl.java @@ -67,19 +67,10 @@ public class SysUserServiceImpl extends BaseServiceImpl implements Sys @Override @CacheResult(cacheKey = "${userId}_getPermissionList") public List getPermissionList(String userId) { - Sys_user user = this.fetch(userId); - if (user == null) { - return new ArrayList<>(); - } - this.fetchLinks(user, "roles"); - if (user.getRoles() == null) { - return new ArrayList<>(); - } List permissionList = new ArrayList(); - for (Sys_role role : user.getRoles()) { - if (!role.isDisabled()) { - permissionList.addAll(sysRoleService.getPermissionList(role)); - } + // Sa-Token接口权限只汇总启用的用户角色关系,历史届次角色不再参与鉴权。 + for (Sys_role role : getEnabledRoles(userId)) { + permissionList.addAll(sysRoleService.getPermissionList(role)); } // 追加public公共角色权限 permissionList.addAll(sysRoleService.getPermissionList(sysRoleService.fetch(Cnd.where("code", "=", "public")))); @@ -94,12 +85,63 @@ public class SysUserServiceImpl extends BaseServiceImpl implements Sys */ @CacheResult(cacheKey = "${user.id}_getRoleCodeList") public List getRoleCodeList(Sys_user user) { - dao().fetchLinks(user, "roles"); - List roleNameList = new ArrayList(); - for (Sys_role role : user.getRoles()) { - if (!role.isDisabled()) roleNameList.add(role.getCode()); + if (user == null) { + return new ArrayList<>(); } - return roleNameList; + // AuthUtil.hasRole与Sa-Token角色判断共用启用角色集合。 + return getEnabledRoles(user.getId()).stream() + .map(Sys_role::getCode) + .filter(StrUtil::isNotBlank) + .distinct() + .toList(); + } + + /** + * 查询用户当前启用角色。用户角色关系和角色本身必须同时处于启用状态。 + * + * @param userId 用户ID + * @return 当前启用角色列表 + */ + @Override + @CacheResult(cacheKey = "${userId}_getEnabledRoles") + public List getEnabledRoles(String userId) { + if (StrUtil.isBlank(userId) || fetch(userId) == null) { + return new ArrayList<>(); + } + Sql sql = Sqls.create(""" + SELECT DISTINCT + role.* + FROM + sys_role role + INNER JOIN sys_user_role userRole ON userRole.roleId = role.id + WHERE + userRole.userId = @userId + AND userRole.enable = @t + AND role.disabled = @f + ORDER BY role.sort DESC, role.id + """); + sql.setParam("userId", userId); + sql.setParam("t", true); + sql.setParam("f", false); + sql.setCallback(Sqls.callback.entities()); + sql.setEntity(dao().getEntity(Sys_role.class)); + dao().execute(sql); + return sql.getList(Sys_role.class); + } + + /** + * 汇总用户当前启用角色名称,首页展示与菜单及接口权限保持相同数据口径。 + * + * @param userId 用户ID + * @return 逗号分隔的角色名称 + */ + @Override + public String getEnabledRoleNames(String userId) { + return getEnabledRoles(userId).stream() + .map(Sys_role::getName) + .filter(StrUtil::isNotBlank) + .distinct() + .collect(Collectors.joining(",")); } /** @@ -161,7 +203,8 @@ public class SysUserServiceImpl extends BaseServiceImpl implements Sys */ // @CacheResult(cacheKey = "${userId}_getMenus") public List getMenus(String userId) { - Sql sql = Sqls.create("select distinct a.* from sys_menu a,sys_role_menu b where a.id=b.menuId and " + " b.roleId in(select c.roleId from sys_user_role c,sys_role d where c.roleId=d.id and c.userId=@userId and d.disabled=@f) and a.disabled=@f and a.showit=@t and a.type='menu' order by a.location ASC,a.path asc"); + // 菜单仅使用启用的用户角色关系,普通角色与当前开启届次角色保持原有权限。 + Sql sql = Sqls.create("select distinct a.* from sys_menu a,sys_role_menu b where a.id=b.menuId and " + " b.roleId in(select c.roleId from sys_user_role c,sys_role d where c.roleId=d.id and c.userId=@userId and c.enable=@t and d.disabled=@f) and a.disabled=@f and a.showit=@t and a.type='menu' order by a.location ASC,a.path asc"); sql.params().set("userId", userId); sql.params().set("f", false); sql.params().set("t", true); @@ -176,9 +219,10 @@ public class SysUserServiceImpl extends BaseServiceImpl implements Sys */ // @CacheResult(cacheKey = "${userId}_getMenusAndButtons") public List getMenusAndButtons(String userId) { - Sql sql = Sqls.create("select distinct a.* from sys_menu a,sys_role_menu b where a.id=b.menuId and " + " b.roleId in(select c.roleId from sys_user_role c,sys_role d where c.roleId=d.id and c.userId=@userId and d.disabled=@f) and a.disabled=@f order by a.location ASC,a.path asc"); + Sql sql = Sqls.create("select distinct a.* from sys_menu a,sys_role_menu b where a.id=b.menuId and " + " b.roleId in(select c.roleId from sys_user_role c,sys_role d where c.roleId=d.id and c.userId=@userId and c.enable=@t and d.disabled=@f) and a.disabled=@f order by a.location ASC,a.path asc"); sql.params().set("userId", userId); sql.params().set("f", false); + sql.params().set("t", true); return sysMenuService.listEntity(sql); } @@ -195,9 +239,10 @@ public class SysUserServiceImpl extends BaseServiceImpl implements Sys */ @CacheResult(cacheKey = "${userId}_getDatas") public List getDatas(String userId) { - Sql sql = Sqls.create("select distinct a.* from sys_menu a,sys_role_menu b where a.id=b.menuId and " + " b.roleId in(select c.roleId from sys_user_role c,sys_role d where c.roleId=d.id and c.userId=@userId and d.disabled=@f) and a.disabled=@f and a.type='data' order by a.location ASC,a.path asc"); + Sql sql = Sqls.create("select distinct a.* from sys_menu a,sys_role_menu b where a.id=b.menuId and " + " b.roleId in(select c.roleId from sys_user_role c,sys_role d where c.roleId=d.id and c.userId=@userId and c.enable=@t and d.disabled=@f) and a.disabled=@f and a.type='data' order by a.location ASC,a.path asc"); sql.params().set("userId", userId); sql.params().set("f", false); + sql.params().set("t", true); return sysMenuService.listEntity(sql); } @@ -232,9 +277,10 @@ public class SysUserServiceImpl extends BaseServiceImpl implements Sys */ @CacheResult(cacheKey = "${userId}_${pid}_getRoleMenus") public List getRoleMenus(String userId, String pid) { - Sql sql = Sqls.create("select distinct a.* from sys_menu a,sys_role_menu b where a.id=b.menuId and " + "$m and b.roleId in(select c.roleId from sys_user_role c,sys_role d where c.roleId=d.id and c.userId=@userId and d.disabled=@f) and a.disabled=@f order by a.location ASC,a.path asc"); + Sql sql = Sqls.create("select distinct a.* from sys_menu a,sys_role_menu b where a.id=b.menuId and " + "$m and b.roleId in(select c.roleId from sys_user_role c,sys_role d where c.roleId=d.id and c.userId=@userId and c.enable=@t and d.disabled=@f) and a.disabled=@f order by a.location ASC,a.path asc"); sql.params().set("userId", userId); sql.params().set("f", false); + sql.params().set("t", true); if (Strings.isNotBlank(pid)) { sql.vars().set("m", "a.parentId='" + pid + "'"); } else { @@ -251,9 +297,10 @@ public class SysUserServiceImpl extends BaseServiceImpl implements Sys */ @CacheResult(cacheKey = "${userId}_${pid}_hasChildren") public boolean hasChildren(String userId, String pid) { - Sql sql = Sqls.create("select count(*) from sys_menu a,sys_role_menu b where a.id=b.menuId and " + "$m and b.roleId in(select c.roleId from sys_user_role c,sys_role d where c.roleId=d.id and c.userId=@userId and d.disabled=@f) and a.disabled=@f order by a.location ASC,a.path asc"); + Sql sql = Sqls.create("select count(*) from sys_menu a,sys_role_menu b where a.id=b.menuId and " + "$m and b.roleId in(select c.roleId from sys_user_role c,sys_role d where c.roleId=d.id and c.userId=@userId and c.enable=@t and d.disabled=@f) and a.disabled=@f order by a.location ASC,a.path asc"); sql.params().set("userId", userId); sql.params().set("f", false); + sql.params().set("t", true); if (Strings.isNotBlank(pid)) { sql.vars().set("m", "a.parentId='" + pid + "'"); } else { @@ -387,6 +434,8 @@ public class SysUserServiceImpl extends BaseServiceImpl implements Sys user.setUnion(union); } user = this.fillMenu(user); + // 登录用户返回给前端的角色同样只保留启用关系,避免历史届次角色继续触发页面 hasRole 判断。 + user.setRoles(this.getEnabledRoles(userId)); user.setPermissions(this.getPermissionList(userId)); return user; } diff --git a/src/main/java/com/budwk/app/zhgh/activity/basic/controller/ActivityBasicScopeUserDataController.java b/src/main/java/com/budwk/app/zhgh/activity/basic/controller/ActivityBasicScopeUserDataController.java index de119ce0..556a6467 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/basic/controller/ActivityBasicScopeUserDataController.java +++ b/src/main/java/com/budwk/app/zhgh/activity/basic/controller/ActivityBasicScopeUserDataController.java @@ -133,10 +133,20 @@ public class ActivityBasicScopeUserDataController { /** - * 删除一条记录 + * 删除活动分组人员。 + * id 有值时删除单个人员;id 为空时按当前页面的姓名/工号、工会、单位、人员类别和在职状态筛选后批量删除。 + * groupId 为待删除人员所在的活动分组;existsLoginNameRedisKey 为导入核对名单生成的工号筛选缓存键。 + * 返回 Result,code 为 0 表示删除处理成功。 * - * @param id - * @return + * @param id 单个人员 ID;批量删除时传空 + * @param groupId 当前活动分组 ID + * @param searchKeyword 姓名或工号关键字 + * @param unionId 所属工会 ID + * @param unitId 所属单位 ID + * @param personType 教职工类别 + * @param userState 在职状态 + * @param existsLoginNameRedisKey 导入核对名单的 Redis 缓存键 + * @return 删除结果 */ @At @SLog(tag = "活动人员查询", msg = "删除活动人员") @@ -145,7 +155,6 @@ public class ActivityBasicScopeUserDataController { public Result doDelete(@Param(value = "id") String id, @Param(value = "groupId") Integer groupId, @Param(value = "searchKeyword") String searchKeyword, - @Param(value = "searchName") String searchName, @Param(value = "unionId") String unionId, @Param(value = "unitId") String unitId, @Param(value = "personType") String personType, @@ -160,7 +169,7 @@ public class ActivityBasicScopeUserDataController { } } - List targetUserIds = queryGroupUserIds(groupId, id, searchKeyword, searchName, unionId, unitId, personType, userState, existsLoginNames); + List targetUserIds = queryGroupUserIds(groupId, id, searchKeyword, unionId, unitId, personType, userState, existsLoginNames); if (Lang.isEmpty(targetUserIds)) { return Result.success(); } @@ -282,9 +291,10 @@ public class ActivityBasicScopeUserDataController { } /** - * 删除时需要先按页面当前筛选条件圈定目标人员,再根据分组类型删除对应存储表中的快照数据。 + * 删除时需要先按页面当前筛选条件圈定目标人员。姓名或工号关键字必须与列表查询使用相同的匹配规则, + * 再根据分组类型删除对应存储表中的快照数据。 */ - private List queryGroupUserIds(Integer groupId, String id, String searchKeyword, String searchName, + private List queryGroupUserIds(Integer groupId, String id, String searchKeyword, String unionId, String unitId, String personType, String userState, List existsLoginNames) { Sql sql = Sqls.queryString(""" @@ -296,8 +306,11 @@ public class ActivityBasicScopeUserDataController { """); Cnd cnd = Cnd.NEW(); cnd.and("u.id", "in", activityBasicScopeService.buildGroupUserIdSubSql(groupId)); - if (StrUtil.isNotBlank(searchName) && StrUtil.isNotBlank(searchKeyword)) { - cnd.and(Cnd.likeEX(searchName, searchKeyword)); + if (StrUtil.isNotBlank(searchKeyword)) { + SqlExpressionGroup group = new SqlExpressionGroup(); + group.orLike("u.username", searchKeyword); + group.orLike("u.loginname", searchKeyword); + cnd.and(group); } cnd.andEX("u.unionid", "=", unionId); cnd.andEX("u.unitid", "=", unitId); diff --git a/src/main/java/com/budwk/app/zhgh/activity/culture/controller/ActivityCultureApplyActivityController.java b/src/main/java/com/budwk/app/zhgh/activity/culture/controller/ActivityCultureApplyActivityController.java index d9d212be..b2099079 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/culture/controller/ActivityCultureApplyActivityController.java +++ b/src/main/java/com/budwk/app/zhgh/activity/culture/controller/ActivityCultureApplyActivityController.java @@ -196,6 +196,8 @@ public class ActivityCultureApplyActivityController { } private void cleanNewActivityData(ActivityTissue tissue) { + // 从模板另存或直接新建的活动必须进入活动列表,不能继承来源活动的模板状态。 + tissue.setTemplateStatus(ActivityTissue.TEMPLATE_STATUS_UNSET); tissue.setId(null); tissue.setAuditId(null); tissue.setState(null); diff --git a/src/main/java/com/budwk/app/zhgh/activity/culture/controller/ActivityCultureInfoManageController.java b/src/main/java/com/budwk/app/zhgh/activity/culture/controller/ActivityCultureInfoManageController.java index 72c2b436..14a62d4e 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/culture/controller/ActivityCultureInfoManageController.java +++ b/src/main/java/com/budwk/app/zhgh/activity/culture/controller/ActivityCultureInfoManageController.java @@ -4,6 +4,7 @@ import cn.dev33.satoken.annotation.SaCheckLogin; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaMode; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.budwk.app.base.annotation.SLog; import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.param.PageForm; @@ -69,8 +70,9 @@ public class ActivityCultureInfoManageController { public Result pageData(PageForm page, String year, String name, String unionId, - @Valid Integer activity_type) { - return Result.success(activityCultureService.pageData(page, year, name, unionId, activity_type)); + @Valid Integer activity_type, + Integer templateStatus) { + return Result.success(activityCultureService.pageData(page, year, name, unionId, activity_type, templateStatus)); } @At @@ -90,47 +92,25 @@ public class ActivityCultureInfoManageController { } @At - @Aop(TransAop.READ_COMMITTED) - @SaCheckPermission("activity.culture.infoManage.school") + @SaCheckPermission(value = {"activity.culture.infoManage.school", "activity.culture.infoManage.union"}, mode = SaMode.OR) public Result setTemplate(@Valid String id) { if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) { return Result.error("无权操作"); } - ActivityTissue tissue = activityCultureService.fetch(id); - if (tissue == null) { - return Result.error("活动不存在"); + String errorMessage = activityCultureService.setTemplate(id); + if (StrUtil.isNotBlank(errorMessage)) { + return Result.error(errorMessage); } - if (tissue.getActivity_type() == null || tissue.getActivity_type() != 40001) { - return Result.error("仅校工会文化活动可设为模板"); - } - Sys_home_template oldHomeTemplate = activityCultureService.dao().fetch(Sys_home_template.class, id); - Sys_home_template sysHomeTemplate = tissue.covertToSysHomeTemplate(); - if (oldHomeTemplate != null) { - sysHomeTemplate.setTop(oldHomeTemplate.getTop()); - sysHomeTemplate.setPush(oldHomeTemplate.getPush()); - sysHomeTemplate.setSortNo(oldHomeTemplate.getSortNo()); - if (oldHomeTemplate.getTemplateName() != null) { - sysHomeTemplate.setTemplateName(oldHomeTemplate.getTemplateName()); - } - if (oldHomeTemplate.getTemplateIcon() != null) { - sysHomeTemplate.setTemplateIcon(oldHomeTemplate.getTemplateIcon()); - } - if (oldHomeTemplate.getTemplateFile() != null) { - sysHomeTemplate.setTemplateFile(oldHomeTemplate.getTemplateFile()); - } - } - activityCultureService.dao().insertOrUpdate(sysHomeTemplate); return Result.success(); } @At - @Aop(TransAop.READ_COMMITTED) - @SaCheckPermission("activity.culture.infoManage.school") + @SaCheckPermission(value = {"activity.culture.infoManage.school", "activity.culture.infoManage.union"}, mode = SaMode.OR) public Result cancelTemplate(@Valid String id) { if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) { return Result.error("无权操作"); } - activityCultureService.dao().delete(Sys_home_template.class, id); + activityCultureService.cancelTemplate(id); return Result.success(); } diff --git a/src/main/java/com/budwk/app/zhgh/activity/culture/models/ActivityTissue.java b/src/main/java/com/budwk/app/zhgh/activity/culture/models/ActivityTissue.java index 3acb2ba0..c6e99ede 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/culture/models/ActivityTissue.java +++ b/src/main/java/com/budwk/app/zhgh/activity/culture/models/ActivityTissue.java @@ -28,6 +28,12 @@ import java.util.List; @Table("activity_tissue") public class ActivityTissue extends BaseModel implements Serializable, SysHomeConvert { + /** 未设置为活动模板。 */ + public static final int TEMPLATE_STATUS_UNSET = 0; + + /** 已设置为活动模板。 */ + public static final int TEMPLATE_STATUS_SET = 1; + @Column @Name @Comment("ID") @@ -236,6 +242,12 @@ public class ActivityTissue extends BaseModel implements Serializable, SysHomeCo @ColDefine(type = ColType.BOOLEAN) private Boolean isUnseal; + @Column + @Comment("模板设置状态(0:未设置,1:已设置)") + @ColDefine(type = ColType.INT, width = 1) + @Default("0") + private Integer templateStatus; + @Column @Comment("物品") @ColDefine(type = ColType.MYSQL_JSON) diff --git a/src/main/java/com/budwk/app/zhgh/activity/culture/service/ActivityCultureService.java b/src/main/java/com/budwk/app/zhgh/activity/culture/service/ActivityCultureService.java index e5c86ab5..2d167a62 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/culture/service/ActivityCultureService.java +++ b/src/main/java/com/budwk/app/zhgh/activity/culture/service/ActivityCultureService.java @@ -21,7 +21,33 @@ public interface ActivityCultureService extends BaseService { void doEditActivity(ActivityTissue tissue); - Object pageData(PageForm page, String year, String name, String unionId, Integer activity_type); + /** + * 分页查询文化活动。 + * + * @param page 分页参数 + * @param year 年度 + * @param name 活动名称 + * @param unionId 工会ID + * @param activity_type 活动类型 + * @param templateStatus 模板设置状态,为空时不限制 + * @return 文化活动分页数据 + */ + Object pageData(PageForm page, String year, String name, String unionId, Integer activity_type, Integer templateStatus); + + /** + * 将校工会或分工会文化活动设置为工作模板,并同步模板状态。 + * + * @param id 活动ID + * @return 空字符串表示成功,否则返回业务错误信息 + */ + String setTemplate(String id); + + /** + * 取消校工会或分工会文化活动模板,并同步模板状态。 + * + * @param id 活动ID + */ + void cancelTemplate(String id); NutMap findOne(String id); diff --git a/src/main/java/com/budwk/app/zhgh/activity/culture/service/impl/ActivityCultureServiceImpl.java b/src/main/java/com/budwk/app/zhgh/activity/culture/service/impl/ActivityCultureServiceImpl.java index 762aebcb..d29c9cdc 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/culture/service/impl/ActivityCultureServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/activity/culture/service/impl/ActivityCultureServiceImpl.java @@ -6,6 +6,7 @@ import com.budwk.app.base.model.Audit; import com.budwk.app.base.param.PageForm; import com.budwk.app.base.service.impl.BaseServiceImpl; import com.budwk.app.sys.models.Sys_home_activity; +import com.budwk.app.sys.models.Sys_home_template; import com.budwk.app.web.commons.auth.utils.AuthUtil; import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.zhgh.activity.basic.service.ActivityBasicScopeService; @@ -14,6 +15,8 @@ import com.budwk.app.zhgh.activity.culture.models.ActivityTissuePerson; import com.budwk.app.zhgh.activity.culture.service.ActivityCultureService; import com.budwk.app.zhgh.club.model.SysClub; import com.budwk.app.zhgh.club.service.SysClubService; +import org.nutz.aop.interceptor.ioc.TransAop; +import org.nutz.dao.Chain; import org.nutz.dao.Cnd; import org.nutz.dao.Dao; import org.nutz.dao.Sqls; @@ -21,6 +24,7 @@ import org.nutz.dao.sql.Sql; import org.nutz.dao.util.cri.SqlExpressionGroup; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.ioc.aop.Aop; import org.nutz.lang.Strings; import org.nutz.lang.util.NutMap; @@ -85,7 +89,7 @@ public class ActivityCultureServiceImpl extends BaseServiceImpl } @Override - public Object pageData(PageForm page, String year, String name, String unionId, Integer activity_type) { + public Object pageData(PageForm page, String year, String name, String unionId, Integer activity_type, Integer templateStatus) { Cnd cnd = Cnd.NEW(); Sql sql = Sqls.create(""" @@ -110,7 +114,7 @@ public class ActivityCultureServiceImpl extends BaseServiceImpl t.variable taskVariable, IF((SELECT taskName FROM wf_process_task tt WHERE tt.id = t.taskParentId) = 'startTask', 1, 0) canRevoke, (select MAX(id) from wf_process_task where processInstanceId = ins.id and taskName = 'startTask') AS startTaskId, - IF(sht.id IS NULL, 0, 1) AS isTemplate + tissue.templateStatus AS isTemplate FROM activity_tissue tissue LEFT JOIN sys_union uni ON uni.id = tissue.unionId @@ -119,7 +123,6 @@ public class ActivityCultureServiceImpl extends BaseServiceImpl LEFT JOIN `wf_process_instance` ins ON ins.businessNo = tissue.id LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10 LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id - LEFT JOIN sys_home_template sht ON sht.id = tissue.id $condition """); @@ -127,6 +130,8 @@ public class ActivityCultureServiceImpl extends BaseServiceImpl cnd.andEX("tissue.projectTypeCode", "!=", "50004"); cnd.andEX("tissue.unionId", "=", unionId); cnd.andEX("tissue.activity_type", "=", activity_type); + // 校工会管理页按页签传入模板状态;其他文化活动页面不传时保持原查询范围。 + cnd.andEX("tissue.templateStatus", "=", templateStatus); cnd.groupBy("tissue.id"); if (Strings.isNotBlank(name)) { @@ -159,6 +164,61 @@ public class ActivityCultureServiceImpl extends BaseServiceImpl return this.listPageMap(page.getPageNumber(), page.getPageSize(), sql); } + /** + * 将校工会或分工会文化活动转换为工作模板,并保留模板中心已维护的展示配置。 + * + * @param id 活动ID + * @return 空字符串表示成功,否则返回业务错误信息 + */ + @Override + @Aop(TransAop.READ_COMMITTED) + public String setTemplate(String id) { + ActivityTissue tissue = fetch(id); + if (tissue == null) { + return "活动不存在"; + } + if (tissue.getActivity_type() == null || !List.of(40001, 40002).contains(tissue.getActivity_type())) { + return "仅校工会或分工会文化活动可设为模板"; + } + + Sys_home_template oldHomeTemplate = dao().fetch(Sys_home_template.class, id); + Sys_home_template sysHomeTemplate = tissue.covertToSysHomeTemplate(); + if (oldHomeTemplate != null) { + // 重复设置时保留模板中心人工配置,避免覆盖置顶、推送、排序及模板素材。 + sysHomeTemplate.setTop(oldHomeTemplate.getTop()); + sysHomeTemplate.setPush(oldHomeTemplate.getPush()); + sysHomeTemplate.setSortNo(oldHomeTemplate.getSortNo()); + if (oldHomeTemplate.getTemplateName() != null) { + sysHomeTemplate.setTemplateName(oldHomeTemplate.getTemplateName()); + } + if (oldHomeTemplate.getTemplateIcon() != null) { + sysHomeTemplate.setTemplateIcon(oldHomeTemplate.getTemplateIcon()); + } + if (oldHomeTemplate.getTemplateFile() != null) { + sysHomeTemplate.setTemplateFile(oldHomeTemplate.getTemplateFile()); + } + } + dao().insertOrUpdate(sysHomeTemplate); + dao().update(ActivityTissue.class, + Chain.make("templateStatus", ActivityTissue.TEMPLATE_STATUS_SET), + Cnd.where("id", "=", id)); + return ""; + } + + /** + * 删除模板中心记录并将文化活动恢复为未设置模板状态。 + * + * @param id 活动ID + */ + @Override + @Aop(TransAop.READ_COMMITTED) + public void cancelTemplate(String id) { + dao().delete(Sys_home_template.class, id); + dao().update(ActivityTissue.class, + Chain.make("templateStatus", ActivityTissue.TEMPLATE_STATUS_UNSET), + Cnd.where("id", "=", id)); + } + @Override public NutMap findOne(String id) { Sql sql = Sqls.create(""" diff --git a/src/main/java/com/budwk/app/zhgh/activity/family/controller/manage/FamilyActivityApplyController.java b/src/main/java/com/budwk/app/zhgh/activity/family/controller/manage/FamilyActivityApplyController.java index 8d2004dc..f6fa95eb 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/family/controller/manage/FamilyActivityApplyController.java +++ b/src/main/java/com/budwk/app/zhgh/activity/family/controller/manage/FamilyActivityApplyController.java @@ -87,6 +87,9 @@ public class FamilyActivityApplyController { Cnd cnd = Cnd.NEW(); cnd.andEX("id", "=", id); cnd.andEX("`year`", "=", year); + if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) { + cnd.and("activityName", "like", "%" + pageForm.getSearchKeyword().trim() + "%"); + } //查询报名中 if (activityType == 2) { cnd.and(new Static("now() < activitySignUpEndTime")); @@ -117,6 +120,7 @@ public class FamilyActivityApplyController { @Param(value = "courseTypeId") String courseTypeId, @Param(value = "activityId") String activityId, @Param(value = "assortTypes") String[] assortTypes, + @Param(value = "searchKeyword") String searchKeyword, @Param(value = "dataType") String dataType) { FamilyActivity activity = dao.fetch(FamilyActivity.class, activityId); Sql sql = Sqls.create(""" @@ -131,6 +135,9 @@ public class FamilyActivityApplyController { Cnd cnd = Cnd.NEW(); cnd.andEX("type.id", "=", courseTypeId); cnd.and("tsuc.activityId", "=", activityId); + if (StrUtil.isNotBlank(searchKeyword)) { + cnd.and("tsuc.courseName", "like", "%" + searchKeyword.trim() + "%"); + } if(Lang.isNotEmpty(assortTypes)) { cnd.and("tsuc.assort", "in", assortTypes); } diff --git a/src/main/java/com/budwk/app/zhgh/activity/family/controller/manage/FamilyActivityController.java b/src/main/java/com/budwk/app/zhgh/activity/family/controller/manage/FamilyActivityController.java index 3375b394..78dc5189 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/family/controller/manage/FamilyActivityController.java +++ b/src/main/java/com/budwk/app/zhgh/activity/family/controller/manage/FamilyActivityController.java @@ -6,7 +6,6 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import com.budwk.app.base.annotation.SLog; import com.budwk.app.base.constant.RoleConstant; -import com.budwk.app.base.page.Pagination; import com.budwk.app.base.param.PageForm; import com.budwk.app.base.result.Result; import com.budwk.app.sys.models.Sys_home_activity; @@ -68,20 +67,15 @@ public class FamilyActivityController { @SaCheckPermission("family.manage") public Result pageData(PageForm pageForm, @Param(value = "year") Integer year, - @Param(value = "activityName") String activityName) { + @Param(value = "activityName") String activityName, + @Param(value = "templateStatus") Integer templateStatus) { Cnd cnd = Cnd.NEW(); cnd.andEX("year", "=", year); cnd.and(Cnd.likeEX("activityName", activityName)); + // 有模板管理角色时前端按页签传入状态;普通用户不传时保持原列表范围。 + cnd.andEX("templateStatus", "=", templateStatus); cnd.orderBy("createdAt", "desc"); - Pagination pagination = familyActivityManageService.pageData(pageForm, cnd); - List list = pagination.getList(FamilyActivity.class); - if (list != null && !list.isEmpty()) { - List ids = list.stream().map(FamilyActivity::getId).toList(); - List templateList = dao.query(Sys_home_template.class, Cnd.where("id", "in", ids)); - List templateIds = templateList.stream().map(Sys_home_template::getId).toList(); - list.forEach(activity -> activity.setIsTemplate(templateIds.contains(activity.getId()))); - } - return Result.success().addData(pagination); + return Result.success().addData(familyActivityManageService.pageData(pageForm, cnd)); } @At @@ -91,27 +85,9 @@ public class FamilyActivityController { if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) { return Result.error("无权操作"); } - FamilyActivity activity = familyActivityManageService.fetch(id); - if (activity == null) { + if (!familyActivityManageService.setTemplate(id)) { return Result.error("活动不存在"); } - Sys_home_template oldHomeTemplate = dao.fetch(Sys_home_template.class, id); - Sys_home_template sysHomeTemplate = activity.covertToSysHomeTemplate(); - if (oldHomeTemplate != null) { - sysHomeTemplate.setTop(oldHomeTemplate.getTop()); - sysHomeTemplate.setPush(oldHomeTemplate.getPush()); - sysHomeTemplate.setSortNo(oldHomeTemplate.getSortNo()); - if (oldHomeTemplate.getTemplateName() != null) { - sysHomeTemplate.setTemplateName(oldHomeTemplate.getTemplateName()); - } - if (oldHomeTemplate.getTemplateIcon() != null) { - sysHomeTemplate.setTemplateIcon(oldHomeTemplate.getTemplateIcon()); - } - if (oldHomeTemplate.getTemplateFile() != null) { - sysHomeTemplate.setTemplateFile(oldHomeTemplate.getTemplateFile()); - } - } - dao.insertOrUpdate(sysHomeTemplate); return Result.success(); } @@ -122,7 +98,7 @@ public class FamilyActivityController { if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) { return Result.error("无权操作"); } - dao.delete(Sys_home_template.class, id); + familyActivityManageService.cancelTemplate(id); return Result.success(); } @@ -224,6 +200,8 @@ public class FamilyActivityController { if (activity == null) { return; } + // 直接新建或从模板另存时明确重置状态,防止前端历史字段被带回。 + activity.setTemplateStatus(FamilyActivity.TEMPLATE_STATUS_UNSET); activity.setId(null); activity.setIsTemplate(false); activity.setCreatedBy(null); diff --git a/src/main/java/com/budwk/app/zhgh/activity/family/models/FamilyActivity.java b/src/main/java/com/budwk/app/zhgh/activity/family/models/FamilyActivity.java index 9410d729..aca9c1de 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/family/models/FamilyActivity.java +++ b/src/main/java/com/budwk/app/zhgh/activity/family/models/FamilyActivity.java @@ -25,6 +25,12 @@ import java.util.List; @EqualsAndHashCode(callSuper = false) public class FamilyActivity extends BaseModel implements Serializable, SysHomeConvert { + /** 未设置为活动模板。 */ + public static final int TEMPLATE_STATUS_UNSET = 0; + + /** 已设置为活动模板。 */ + public static final int TEMPLATE_STATUS_SET = 1; + @Name @PrevInsert(uu32 = true) private String id; @@ -114,6 +120,12 @@ public class FamilyActivity extends BaseModel implements Serializable, SysHomeCo private Boolean isTemplate; + @Column + @Comment("模板设置状态(0:未设置,1:已设置)") + @ColDefine(type = ColType.INT, width = 1) + @Default("0") + private Integer templateStatus; + @Column @Comment("活动类型") @ColDefine(type = ColType.VARCHAR, width = 20) diff --git a/src/main/java/com/budwk/app/zhgh/activity/family/service/FamilyActivityService.java b/src/main/java/com/budwk/app/zhgh/activity/family/service/FamilyActivityService.java index 08ffb68d..7ebdd66c 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/family/service/FamilyActivityService.java +++ b/src/main/java/com/budwk/app/zhgh/activity/family/service/FamilyActivityService.java @@ -50,6 +50,21 @@ public interface FamilyActivityService extends BaseService { */ Pagination pageData(PageForm pageForm, Cnd cnd); + /** + * 将亲子活动设置为工作模板,并同步模板状态。 + * + * @param id 活动ID + * @return true 表示活动存在且设置成功,false 表示活动不存在 + */ + boolean setTemplate(String id); + + /** + * 取消亲子活动模板,并同步模板状态。 + * + * @param id 活动ID + */ + void cancelTemplate(String id); + /** * 手机端分页查询 diff --git a/src/main/java/com/budwk/app/zhgh/activity/family/service/impl/FamilyActivityServiceImpl.java b/src/main/java/com/budwk/app/zhgh/activity/family/service/impl/FamilyActivityServiceImpl.java index 50fbbae1..54f2e5d8 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/family/service/impl/FamilyActivityServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/activity/family/service/impl/FamilyActivityServiceImpl.java @@ -6,6 +6,7 @@ import com.budwk.app.base.param.PageForm; import com.budwk.app.base.result.Result; import com.budwk.app.base.service.impl.BaseServiceImpl; import com.budwk.app.sys.models.Sys_home_activity; +import com.budwk.app.sys.models.Sys_home_template; import com.budwk.app.sys.views.View_user; import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.zhgh.activity.family.models.*; @@ -48,7 +49,8 @@ public class FamilyActivityServiceImpl extends BaseServiceImpl i @Override @Aop(TransAop.READ_COMMITTED) public void add(FamilyActivity activity, FamilyCourse course) { - + // 新建活动(包括从模板另存)统一归入活动列表,不能继承来源活动的模板状态。 + activity.setTemplateStatus(FamilyActivity.TEMPLATE_STATUS_UNSET); dao().insert(activity); //插入类型限制 @@ -215,6 +217,57 @@ public class FamilyActivityServiceImpl extends BaseServiceImpl i return pagination; } + /** + * 将亲子活动转换为工作模板,并保留模板中心已维护的展示配置。 + * + * @param id 活动ID + * @return true 表示活动存在且设置成功,false 表示活动不存在 + */ + @Override + @Aop(TransAop.READ_COMMITTED) + public boolean setTemplate(String id) { + FamilyActivity activity = fetch(id); + if (activity == null) { + return false; + } + Sys_home_template oldHomeTemplate = dao().fetch(Sys_home_template.class, id); + Sys_home_template sysHomeTemplate = activity.covertToSysHomeTemplate(); + if (oldHomeTemplate != null) { + // 重复设置时保留模板中心人工配置,避免覆盖置顶、推送、排序及模板素材。 + sysHomeTemplate.setTop(oldHomeTemplate.getTop()); + sysHomeTemplate.setPush(oldHomeTemplate.getPush()); + sysHomeTemplate.setSortNo(oldHomeTemplate.getSortNo()); + if (oldHomeTemplate.getTemplateName() != null) { + sysHomeTemplate.setTemplateName(oldHomeTemplate.getTemplateName()); + } + if (oldHomeTemplate.getTemplateIcon() != null) { + sysHomeTemplate.setTemplateIcon(oldHomeTemplate.getTemplateIcon()); + } + if (oldHomeTemplate.getTemplateFile() != null) { + sysHomeTemplate.setTemplateFile(oldHomeTemplate.getTemplateFile()); + } + } + dao().insertOrUpdate(sysHomeTemplate); + dao().update(FamilyActivity.class, + Chain.make("templateStatus", FamilyActivity.TEMPLATE_STATUS_SET), + Cnd.where("id", "=", id)); + return true; + } + + /** + * 删除模板中心记录并将亲子活动恢复为未设置模板状态。 + * + * @param id 活动ID + */ + @Override + @Aop(TransAop.READ_COMMITTED) + public void cancelTemplate(String id) { + dao().delete(Sys_home_template.class, id); + dao().update(FamilyActivity.class, + Chain.make("templateStatus", FamilyActivity.TEMPLATE_STATUS_UNSET), + Cnd.where("id", "=", id)); + } + @Override public Pagination mPageData(PageForm pageForm, Integer year, int activityStatus, Integer activityType) { Cnd cnd = Cnd.NEW(); diff --git a/src/main/java/com/budwk/app/zhgh/activity/sports/controller/ActivitySportsInfoManageController.java b/src/main/java/com/budwk/app/zhgh/activity/sports/controller/ActivitySportsInfoManageController.java index fb631300..485c20e7 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/sports/controller/ActivitySportsInfoManageController.java +++ b/src/main/java/com/budwk/app/zhgh/activity/sports/controller/ActivitySportsInfoManageController.java @@ -65,7 +65,8 @@ public class ActivitySportsInfoManageController { @Param(value = "gameStyle") String gameStyle, @Param(value = "query") String query, @Param(value = "activityId") String activityId, - @Param(value = "activityLevel") String activityLevel) { + @Param(value = "activityLevel") String activityLevel, + @Param(value = "templateStatus") Integer templateStatus) { Cnd cnd = Cnd.NEW(); Sql sql = Sqls.create(""" SELECT @@ -91,13 +92,12 @@ public class ActivitySportsInfoManageController { school.activityCode, school.foundDate, school.applyType, - IF(sht.id IS NULL, 0, 1) isTemplate, + school.templateStatus isTemplate, (SELECT COUNT(1) FROM activity_school_apply asa WHERE asa.activityId = school.id and status=2) applyNum FROM activity_school school LEFT JOIN activity_basic_settings ba ON ba.`code` = school.activityLevel LEFT JOIN sys_union un ON un.id = school.belongUnionId - LEFT JOIN sys_home_template sht ON sht.id = school.id $condition """); @@ -121,6 +121,8 @@ public class ActivitySportsInfoManageController { cnd.andEX("school.activityLevel", "=", activityLevel); cnd.andEX("school.gameStyle", "=", gameStyle); + // 管理员页签传入模板状态;未展示页签的用户不传该参数,继续查询原完整列表。 + cnd.andEX("school.templateStatus", "=", templateStatus); cnd.andEX("YEAR(school.applyStartTime)", "=", year); if (StrUtil.isNotBlank(name)) { cnd.and(Cnd.likeEX("school.name", name)); @@ -141,27 +143,9 @@ public class ActivitySportsInfoManageController { if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) { return Result.error("无权操作"); } - ActivitySchool activitySchool = activitySportsService.fetch(id); - if (activitySchool == null) { + if (!activitySportsService.setTemplate(id)) { return Result.error("活动不存在"); } - Sys_home_template oldHomeTemplate = dao.fetch(Sys_home_template.class, id); - Sys_home_template sysHomeTemplate = activitySchool.covertToSysHomeTemplate(); - if (oldHomeTemplate != null) { - sysHomeTemplate.setTop(oldHomeTemplate.getTop()); - sysHomeTemplate.setPush(oldHomeTemplate.getPush()); - sysHomeTemplate.setSortNo(oldHomeTemplate.getSortNo()); - if (oldHomeTemplate.getTemplateName() != null) { - sysHomeTemplate.setTemplateName(oldHomeTemplate.getTemplateName()); - } - if (oldHomeTemplate.getTemplateIcon() != null) { - sysHomeTemplate.setTemplateIcon(oldHomeTemplate.getTemplateIcon()); - } - if (oldHomeTemplate.getTemplateFile() != null) { - sysHomeTemplate.setTemplateFile(oldHomeTemplate.getTemplateFile()); - } - } - dao.insertOrUpdate(sysHomeTemplate); return Result.success(); } @@ -172,7 +156,7 @@ public class ActivitySportsInfoManageController { if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) { return Result.error("无权操作"); } - dao.delete(Sys_home_template.class, id); + activitySportsService.cancelTemplate(id); return Result.success(); } diff --git a/src/main/java/com/budwk/app/zhgh/activity/sports/controller/ActivitySportsResultsController.java b/src/main/java/com/budwk/app/zhgh/activity/sports/controller/ActivitySportsResultsController.java index 91d193a4..edce0183 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/sports/controller/ActivitySportsResultsController.java +++ b/src/main/java/com/budwk/app/zhgh/activity/sports/controller/ActivitySportsResultsController.java @@ -17,7 +17,7 @@ import com.budwk.app.zhgh.activity.sports.service.ActivitySportsApplyUserService import org.nutz.dao.Cnd; import org.nutz.dao.Sqls; import org.nutz.dao.sql.Sql; -import org.nutz.dao.util.cri.SqlExpressionGroup; +import org.nutz.dao.util.cri.Static; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.lang.random.R; @@ -26,8 +26,6 @@ import org.nutz.mvc.annotation.Ok; import org.nutz.mvc.annotation.Param; import org.nutz.trans.Trans; -import java.util.Arrays; - /** * @author zhf * @date 2021/5/19 14:58 @@ -57,7 +55,8 @@ public class ActivitySportsResultsController { PageForm page, String activityId, String eventId, - String[] isMenWomen) { + Integer isMenWomen, + Integer projectType) { Cnd cnd = Cnd.NEW(); Sql sql = Sqls.create(""" SELECT @@ -79,22 +78,10 @@ public class ActivitySportsResultsController { cnd.and("ase.activityId", "=", activityId); cnd.andEX("abs.`name`", "=", groupName); cnd.andEX("ae.`id`", "=", eventId); - SqlExpressionGroup sqlExpressionGroup = new SqlExpressionGroup(); - if (Arrays.stream(isMenWomen).anyMatch(a -> a.equals("2"))) { - sqlExpressionGroup.and("ae.isMenWomen", "=", 1); - } - if (Arrays.stream(isMenWomen).anyMatch(a -> a.equals("3"))) { - sqlExpressionGroup.or("ae.isMenWomen", "=", 2); - } - if (Arrays.stream(isMenWomen).anyMatch(a -> a.equals("4"))) { - sqlExpressionGroup.and("ae.projectType", "=", 1); - } - if (Arrays.stream(isMenWomen).anyMatch(a -> a.equals("5"))) { - sqlExpressionGroup.or("ae.projectType", "=", 2); - } - if (sqlExpressionGroup.getExps().size() > 0) { - cnd.and(sqlExpressionGroup); - } + // 页面男子/女子选项值与活动项目性别字段保持一致:1 为男子,2 为女子。 + cnd.andEX("ae.isMenWomen", "=", isMenWomen); + // 页面项目类型选项值与活动项目类型字段保持一致:1 为单项,2 为团体。 + cnd.andEX("ae.projectType", "=", projectType); cnd.desc("allName"); sql.setCondition(cnd); return Result.success(baseService.listPageMap(page.getPageNumber(), page.getPageSize(), sql)); @@ -192,8 +179,9 @@ public class ActivitySportsResultsController { cnd.and("asa.activityId", "=", activityId); cnd.and("asa.eventId", "=", eventId); cnd.and("asa.awardsMode", "=", 1); - if (isMenWomen != null && isMenWomen == 1) cnd.and("u.sex", "=", "男性"); - if (isMenWomen != null && isMenWomen == 2) cnd.and("u.sex", "=", "女性"); + // 兼容历史人员“男性/女性”和临时添加人员“男/女”的性别值。 + if (isMenWomen != null && isMenWomen == 1) cnd.and(new Static("u.sex IN ('男', '男性')")); + if (isMenWomen != null && isMenWomen == 2) cnd.and(new Static("u.sex IN ('女', '女性')")); sql.setCondition(cnd); return Result.success(activitySchoolApplyViService.listMap(sql)); } @@ -268,8 +256,9 @@ public class ActivitySportsResultsController { """); cnd.and("ar.activityId", "=", activityId); cnd.and("ar.eventId", "=", eventId); - if (isMenWomen != null && isMenWomen == 1) cnd.and("u.sex", "=", "男性"); - if (isMenWomen != null && isMenWomen == 2) cnd.and("u.sex", "=", "女性"); + // 兼容历史人员“男性/女性”和临时添加人员“男/女”的性别值。 + if (isMenWomen != null && isMenWomen == 1) cnd.and(new Static("u.sex IN ('男', '男性')")); + if (isMenWomen != null && isMenWomen == 2) cnd.and(new Static("u.sex IN ('女', '女性')")); cnd.asc("ar.ranking"); sql.setCondition(cnd); return Result.success(baseService.listMap(sql)); diff --git a/src/main/java/com/budwk/app/zhgh/activity/sports/h5Controller/H5ActivitySportsApplyUserController.java b/src/main/java/com/budwk/app/zhgh/activity/sports/h5Controller/H5ActivitySportsApplyUserController.java index 5da34115..b96c6be4 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/sports/h5Controller/H5ActivitySportsApplyUserController.java +++ b/src/main/java/com/budwk/app/zhgh/activity/sports/h5Controller/H5ActivitySportsApplyUserController.java @@ -64,8 +64,8 @@ public class H5ActivitySportsApplyUserController { @At @SaCheckPermission("h5.activity.sports.applyUser") - public Result activityData(Integer year, Integer isActivity, Integer applyStatus) { - return Result.success(activitySportsApplyUserService.activityData(year, isActivity, applyStatus)); + public Result activityData(Integer year, Integer isActivity, Integer applyStatus, String searchKeyword) { + return Result.success(activitySportsApplyUserService.activityData(year, isActivity, applyStatus, searchKeyword)); } diff --git a/src/main/java/com/budwk/app/zhgh/activity/sports/models/ActivitySchool.java b/src/main/java/com/budwk/app/zhgh/activity/sports/models/ActivitySchool.java index b9143e94..1e1c1b60 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/sports/models/ActivitySchool.java +++ b/src/main/java/com/budwk/app/zhgh/activity/sports/models/ActivitySchool.java @@ -171,6 +171,18 @@ public class ActivitySchool extends BaseModel implements Serializable , SysHomeC @ColDefine(type = ColType.BOOLEAN) private Integer isSave; + /** 未设置为工作模板。 */ + public static final int TEMPLATE_STATUS_UNSET = 0; + + /** 已设置为工作模板。 */ + public static final int TEMPLATE_STATUS_SET = 1; + + @Column + @Comment("模板设置状态(0:未设置 1:已设置)") + @ColDefine(type = ColType.INT, width = 1) + @Default("0") + private Integer templateStatus; + @Column @Comment("小程序活动封面") @ColDefine(type = ColType.VARCHAR,width = 100) diff --git a/src/main/java/com/budwk/app/zhgh/activity/sports/param/ActivitySportsApplyUserPageParam.java b/src/main/java/com/budwk/app/zhgh/activity/sports/param/ActivitySportsApplyUserPageParam.java index 2182ddb6..dbcb592a 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/sports/param/ActivitySportsApplyUserPageParam.java +++ b/src/main/java/com/budwk/app/zhgh/activity/sports/param/ActivitySportsApplyUserPageParam.java @@ -18,6 +18,7 @@ public class ActivitySportsApplyUserPageParam extends PageForm { private String applyType; private String isAudit; private String groupName; + private String searchKeyword; private String activityId; private String eventId; private String year; diff --git a/src/main/java/com/budwk/app/zhgh/activity/sports/service/ActivitySportsApplyUserService.java b/src/main/java/com/budwk/app/zhgh/activity/sports/service/ActivitySportsApplyUserService.java index 91995f46..23f9b5f8 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/sports/service/ActivitySportsApplyUserService.java +++ b/src/main/java/com/budwk/app/zhgh/activity/sports/service/ActivitySportsApplyUserService.java @@ -19,6 +19,17 @@ public interface ActivitySportsApplyUserService extends BaseService getEvents(String activityId); Object getUnionCoachLeaderHead(String activityId,String unionId); diff --git a/src/main/java/com/budwk/app/zhgh/activity/sports/service/ActivitySportsService.java b/src/main/java/com/budwk/app/zhgh/activity/sports/service/ActivitySportsService.java index 452eb811..071f66b0 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/sports/service/ActivitySportsService.java +++ b/src/main/java/com/budwk/app/zhgh/activity/sports/service/ActivitySportsService.java @@ -18,5 +18,20 @@ public interface ActivitySportsService extends BaseService { void doDelete(String id); + /** + * 将体育活动设置为工作模板,并同步活动表中的模板设置状态。 + * + * @param id 体育活动ID + * @return 活动存在且设置成功时返回 true,活动不存在时返回 false + */ + boolean setTemplate(String id); + + /** + * 取消体育活动的工作模板,并同步活动表中的模板设置状态。 + * + * @param id 体育活动ID + */ + void cancelTemplate(String id); + void exportXlsx(String id, String unionId, HttpServletResponse response); } diff --git a/src/main/java/com/budwk/app/zhgh/activity/sports/service/impl/ActivitySportsApplyUserServiceImpl.java b/src/main/java/com/budwk/app/zhgh/activity/sports/service/impl/ActivitySportsApplyUserServiceImpl.java index dbbb3e1e..6a6b2383 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/sports/service/impl/ActivitySportsApplyUserServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/activity/sports/service/impl/ActivitySportsApplyUserServiceImpl.java @@ -122,6 +122,9 @@ public class ActivitySportsApplyUserServiceImpl extends BaseServiceImpl" : "=")))); } cnd.and("ase.activityId", "=", pageParam.getActivityId()); + if (StrUtil.isNotBlank(pageParam.getSearchKeyword())) { + cnd.and("eve.allName", "like", "%" + pageParam.getSearchKeyword().trim() + "%"); + } cnd.andEX("ase.eventId", "=", pageParam.getEventId()); cnd.andEX("YEAR(school.applyStartTime)", "=", pageParam.getYear()); @@ -144,6 +147,20 @@ public class ActivitySportsApplyUserServiceImpl extends BaseServiceImplapplyStartTime and now() < applyEndTime")); diff --git a/src/main/java/com/budwk/app/zhgh/activity/sports/service/impl/ActivitySportsServiceImpl.java b/src/main/java/com/budwk/app/zhgh/activity/sports/service/impl/ActivitySportsServiceImpl.java index 3a5c5610..dd8ec1af 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/sports/service/impl/ActivitySportsServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/activity/sports/service/impl/ActivitySportsServiceImpl.java @@ -8,6 +8,7 @@ import com.budwk.app.base.service.impl.BaseServiceImpl; import com.budwk.app.base.utils.CommonDownloadUtil; import com.budwk.app.base.utils.DateUtil; import com.budwk.app.sys.models.Sys_home_activity; +import com.budwk.app.sys.models.Sys_home_template; import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.zhgh.activity.basic.models.ActivityBasicUnit; import com.budwk.app.zhgh.activity.basic.models.ActivityBasicUnion; @@ -61,6 +62,8 @@ public class ActivitySportsServiceImpl extends BaseServiceImpl i } activitySchool.setFoundDate(DateUtil.getDate()); activitySchool.setClose(false); + // 新建活动只能从“未设置模板”状态开始,防止客户端提交模板状态造成数据不一致。 + activitySchool.setTemplateStatus(ActivitySchool.TEMPLATE_STATUS_UNSET); ActivitySchool school = insert(activitySchool); addTeam(school.getId(), events); @@ -190,6 +193,59 @@ public class ActivitySportsServiceImpl extends BaseServiceImpl i dao().delete(Sys_home_activity.class, id); } + /** + * 将活动内容转换为首页工作模板,并在同一事务内更新活动模板状态。 + * 重复设置时保留管理员在工作模板管理中维护的名称、图标、文件及排序配置。 + * + * @param id 体育活动ID + * @return 活动存在且设置成功时返回 true,否则返回 false + */ + @Override + @Aop(TransAop.READ_COMMITTED) + public boolean setTemplate(String id) { + ActivitySchool activitySchool = fetch(id); + if (activitySchool == null) { + return false; + } + + Sys_home_template oldHomeTemplate = dao().fetch(Sys_home_template.class, id); + Sys_home_template sysHomeTemplate = activitySchool.covertToSysHomeTemplate(); + if (oldHomeTemplate != null) { + // 模板业务数据随活动刷新,模板管理页面维护的展示配置继续沿用。 + sysHomeTemplate.setTop(oldHomeTemplate.getTop()); + sysHomeTemplate.setPush(oldHomeTemplate.getPush()); + sysHomeTemplate.setSortNo(oldHomeTemplate.getSortNo()); + if (oldHomeTemplate.getTemplateName() != null) { + sysHomeTemplate.setTemplateName(oldHomeTemplate.getTemplateName()); + } + if (oldHomeTemplate.getTemplateIcon() != null) { + sysHomeTemplate.setTemplateIcon(oldHomeTemplate.getTemplateIcon()); + } + if (oldHomeTemplate.getTemplateFile() != null) { + sysHomeTemplate.setTemplateFile(oldHomeTemplate.getTemplateFile()); + } + } + dao().insertOrUpdate(sysHomeTemplate); + dao().update(ActivitySchool.class, + Chain.make("templateStatus", ActivitySchool.TEMPLATE_STATUS_SET), + Cnd.where("id", "=", id)); + return true; + } + + /** + * 删除首页工作模板,并在同一事务内将活动恢复为未设置模板状态。 + * + * @param id 体育活动ID + */ + @Override + @Aop(TransAop.READ_COMMITTED) + public void cancelTemplate(String id) { + dao().delete(Sys_home_template.class, id); + dao().update(ActivitySchool.class, + Chain.make("templateStatus", ActivitySchool.TEMPLATE_STATUS_UNSET), + Cnd.where("id", "=", id)); + } + @Override public void exportXlsx(String id, String unionId, HttpServletResponse response) { try { diff --git a/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/controller/manage/TrainSignUpApplyController.java b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/controller/manage/TrainSignUpApplyController.java index c875314d..7aca142e 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/controller/manage/TrainSignUpApplyController.java +++ b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/controller/manage/TrainSignUpApplyController.java @@ -93,6 +93,9 @@ public class TrainSignUpApplyController { Cnd cnd = Cnd.NEW(); cnd.andEX("id", "=", id); cnd.andEX("`year`", "=", year); + if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) { + cnd.and(Cnd.likeEX("activityName", pageForm.getSearchKeyword())); + } //查询报名中 if (activityType == 2) { cnd.and(new Static("now() < activitySignUpEndTime")); @@ -123,6 +126,7 @@ public class TrainSignUpApplyController { @Param(value = "courseTypeId") String courseTypeId, @Param(value = "activityId") String activityId, @Param(value = "assortTypes") String[] assortTypes, + @Param(value = "searchKeyword") String searchKeyword, @Param(value = "dataType") String dataType) { Sql sql = Sqls.create(""" SELECT @@ -156,6 +160,9 @@ public class TrainSignUpApplyController { Cnd cnd = Cnd.NEW(); cnd.andEX("type.id", "=", courseTypeId); cnd.and("tsuc.activityId", "=", activityId); + if (StrUtil.isNotBlank(searchKeyword)) { + cnd.and("tsuc.courseName", "like", "%" + searchKeyword.trim() + "%"); + } if (Lang.isNotEmpty(assortTypes)) { cnd.and("tsuc.assort", "in", assortTypes); diff --git a/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/controller/manage/TrainSignUpManageController.java b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/controller/manage/TrainSignUpManageController.java index c67fba16..61862dd6 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/controller/manage/TrainSignUpManageController.java +++ b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/controller/manage/TrainSignUpManageController.java @@ -6,7 +6,6 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import com.budwk.app.base.annotation.SLog; import com.budwk.app.base.constant.RoleConstant; -import com.budwk.app.base.page.Pagination; import com.budwk.app.base.param.PageForm; import com.budwk.app.base.result.Result; import com.budwk.app.flow.entity.ProcessInstance; @@ -72,20 +71,15 @@ public class TrainSignUpManageController { @SaCheckPermission("trainSignUp.manage") public Result pageData(PageForm pageForm, @Param(value = "year") Integer year, - @Param(value = "activityName") String activityName) { + @Param(value = "activityName") String activityName, + @Param(value = "templateStatus") Integer templateStatus) { Cnd cnd = Cnd.NEW(); cnd.andEX("year", "=", year); cnd.and(Cnd.likeEX("activityName", activityName)); + // 具备模板管理角色时,前端按页签传入状态;普通用户不传时仍保持原列表范围。 + cnd.andEX("templateStatus", "=", templateStatus); cnd.orderBy("createdAt", "desc"); - Pagination pagination = trainSignUpActivityManageService.pageData(pageForm, cnd); - List list = pagination.getList(TrainSignUpActivity.class); - if (list != null && !list.isEmpty()) { - List ids = list.stream().map(TrainSignUpActivity::getId).toList(); - List templateList = dao.query(Sys_home_template.class, Cnd.where("id", "in", ids)); - List templateIds = templateList.stream().map(Sys_home_template::getId).toList(); - list.forEach(activity -> activity.setIsTemplate(templateIds.contains(activity.getId()))); - } - return Result.success().addData(pagination); + return Result.success().addData(trainSignUpActivityManageService.pageData(pageForm, cnd)); } @At @@ -95,27 +89,9 @@ public class TrainSignUpManageController { if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) { return Result.error("无权操作"); } - TrainSignUpActivity activity = trainSignUpActivityManageService.fetch(id); - if (activity == null) { + if (!trainSignUpActivityManageService.setTemplate(id)) { return Result.error("活动不存在"); } - Sys_home_template oldHomeTemplate = dao.fetch(Sys_home_template.class, id); - Sys_home_template sysHomeTemplate = activity.covertToSysHomeTemplate(); - if (oldHomeTemplate != null) { - sysHomeTemplate.setTop(oldHomeTemplate.getTop()); - sysHomeTemplate.setPush(oldHomeTemplate.getPush()); - sysHomeTemplate.setSortNo(oldHomeTemplate.getSortNo()); - if (oldHomeTemplate.getTemplateName() != null) { - sysHomeTemplate.setTemplateName(oldHomeTemplate.getTemplateName()); - } - if (oldHomeTemplate.getTemplateIcon() != null) { - sysHomeTemplate.setTemplateIcon(oldHomeTemplate.getTemplateIcon()); - } - if (oldHomeTemplate.getTemplateFile() != null) { - sysHomeTemplate.setTemplateFile(oldHomeTemplate.getTemplateFile()); - } - } - dao.insertOrUpdate(sysHomeTemplate); return Result.success(); } @@ -126,7 +102,7 @@ public class TrainSignUpManageController { if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) { return Result.error("无权操作"); } - dao.delete(Sys_home_template.class, id); + trainSignUpActivityManageService.cancelTemplate(id); return Result.success(); } diff --git a/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/models/TrainSignUpActivity.java b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/models/TrainSignUpActivity.java index 37b39285..7165e956 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/models/TrainSignUpActivity.java +++ b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/models/TrainSignUpActivity.java @@ -22,6 +22,12 @@ import java.util.List; @EqualsAndHashCode(callSuper = false) public class TrainSignUpActivity extends BaseModel implements Serializable, SysHomeConvert { + /** 未设置为活动模板。 */ + public static final int TEMPLATE_STATUS_UNSET = 0; + + /** 已设置为活动模板。 */ + public static final int TEMPLATE_STATUS_SET = 1; + @Name @PrevInsert(uu32 = true) private String id; @@ -112,6 +118,12 @@ public class TrainSignUpActivity extends BaseModel implements Serializable, SysH private Boolean isTemplate; + @Column + @Comment("模板设置状态(0:未设置,1:已设置)") + @ColDefine(type = ColType.INT, width = 1) + @Default("0") + private Integer templateStatus; + @Column @Comment("活动类型") @ColDefine(type = ColType.VARCHAR, width = 20) diff --git a/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/service/TrainSignUpActivityService.java b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/service/TrainSignUpActivityService.java index bab6eaea..6a0bdbb6 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/service/TrainSignUpActivityService.java +++ b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/service/TrainSignUpActivityService.java @@ -59,6 +59,21 @@ public interface TrainSignUpActivityService extends BaseService { + + /** + * 分页查询作品征集活动。 + * + * @param pageForm 分页及关键字参数 + * @param year 活动年度 + * @param templateStatus 模板设置状态,为空时不限制 + * @return 作品征集活动分页数据 + */ + Pagination pageData(PageForm pageForm, Long year, Integer templateStatus); + + /** + * 将作品征集活动设置为工作模板,并同步模板状态。 + * + * @param id 活动ID + * @return true 表示设置成功,false 表示活动不存在 + */ + boolean setTemplate(String id); + + /** + * 取消作品征集活动模板,并同步模板状态。 + * + * @param id 活动ID + */ + void cancelTemplate(String id); + + /** + * 校验编辑活动时删除的主题类型、作品类型是否已被投稿引用。 + * + * @param worksCollection 前端提交的活动及其主题、作品类型配置 + * @return 校验通过返回 {@code null};校验不通过返回提示信息 + */ + String validateReferencedTypesBeforeUpdate(Activity_works_collection worksCollection); +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/workscollection/service/impl/ActivityWorksCollectionServiceImpl.java b/src/main/java/com/budwk/app/zhgh/activity/workscollection/service/impl/ActivityWorksCollectionServiceImpl.java new file mode 100644 index 00000000..61b9fef1 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/workscollection/service/impl/ActivityWorksCollectionServiceImpl.java @@ -0,0 +1,213 @@ +package com.budwk.app.zhgh.activity.workscollection.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.param.PageForm; +import com.budwk.app.base.service.impl.BaseServiceImpl; +import com.budwk.app.sys.models.Sys_home_template; +import com.budwk.app.zhgh.activity.workscollection.models.Activity_works_collection; +import com.budwk.app.zhgh.activity.workscollection.models.Activity_works_collection_upload; +import com.budwk.app.zhgh.activity.workscollection.models.Activity_works_subjectType; +import com.budwk.app.zhgh.activity.workscollection.models.Activity_works_worksType; +import com.budwk.app.zhgh.activity.workscollection.service.ActivityWorksCollectionService; +import org.nutz.aop.interceptor.ioc.TransAop; +import org.nutz.dao.Chain; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.dao.Sqls; +import org.nutz.dao.sql.Sql; +import org.nutz.ioc.aop.Aop; +import org.nutz.ioc.loader.annotation.IocBean; + +import java.util.Collections; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * 作品征集活动配置服务实现。 + */ +@IocBean(args = {"refer:dao"}) +public class ActivityWorksCollectionServiceImpl extends BaseServiceImpl implements ActivityWorksCollectionService { + + private final Dao dao; + + public ActivityWorksCollectionServiceImpl(Dao dao) { + super(dao); + this.dao = dao; + } + + /** + * 按年度、关键字及模板状态分页查询作品征集活动。 + */ + @Override + public Pagination pageData(PageForm pageForm, Long year, Integer templateStatus) { + Sql sql = Sqls.create(""" + select + wc.id, + wc.name, + wc.createdAt, + wc.startDateTime, + wc.endDateTime, + wc.enable, + wc.templateStatus, + wc.templateStatus isTemplate, + u.username as userName + from + activity_works_collection wc + LEFT JOIN vw_user u on u.id = wc.createdBy + $condition + """); + Cnd cnd = Cnd.NEW(); + cnd.andEX("year(wc.startDateTime)", "=", year); + cnd.andEX("wc.templateStatus", "=", templateStatus); + if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) { + cnd.where().andLike("wc.name", pageForm.getSearchKeyword()); + } + cnd.desc("wc.createdAt"); + sql.setCondition(cnd); + return listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + } + + /** + * 将作品征集活动转换为工作模板,并保留模板中心已维护的展示配置。 + */ + @Override + @Aop(TransAop.READ_COMMITTED) + public boolean setTemplate(String id) { + Activity_works_collection worksCollection = dao.fetch(Activity_works_collection.class, id); + if (worksCollection == null) { + return false; + } + Sys_home_template oldHomeTemplate = dao.fetch(Sys_home_template.class, id); + Sys_home_template sysHomeTemplate = worksCollection.covertToSysHomeTemplate(); + if (oldHomeTemplate != null) { + // 重复设置时保留模板中心人工配置,避免覆盖置顶、推送、排序及模板素材。 + sysHomeTemplate.setTop(oldHomeTemplate.getTop()); + sysHomeTemplate.setPush(oldHomeTemplate.getPush()); + sysHomeTemplate.setSortNo(oldHomeTemplate.getSortNo()); + if (oldHomeTemplate.getTemplateName() != null) { + sysHomeTemplate.setTemplateName(oldHomeTemplate.getTemplateName()); + } + if (oldHomeTemplate.getTemplateIcon() != null) { + sysHomeTemplate.setTemplateIcon(oldHomeTemplate.getTemplateIcon()); + } + if (oldHomeTemplate.getTemplateFile() != null) { + sysHomeTemplate.setTemplateFile(oldHomeTemplate.getTemplateFile()); + } + } + dao.insertOrUpdate(sysHomeTemplate); + dao.update(Activity_works_collection.class, + Chain.make("templateStatus", Activity_works_collection.TEMPLATE_STATUS_SET), + Cnd.where("id", "=", id)); + return true; + } + + /** + * 删除模板中心记录并将作品征集活动恢复为未设置模板状态。 + */ + @Override + @Aop(TransAop.READ_COMMITTED) + public void cancelTemplate(String id) { + dao.delete(Sys_home_template.class, id); + dao.update(Activity_works_collection.class, + Chain.make("templateStatus", Activity_works_collection.TEMPLATE_STATUS_UNSET), + Cnd.where("id", "=", id)); + } + + @Override + public String validateReferencedTypesBeforeUpdate(Activity_works_collection worksCollection) { + if (worksCollection == null || StrUtil.isBlank(worksCollection.getId())) { + return null; + } + List persistedSubjectTypes = dao.query(Activity_works_subjectType.class, + Cnd.where(Activity_works_subjectType::getActivityId, "=", worksCollection.getId())); + List submittedSubjectTypes = CollUtil.defaultIfEmpty(worksCollection.getSubjectTypes(), Collections.emptyList()); + Set submittedSubjectIds = submittedSubjectTypes.stream() + .map(Activity_works_subjectType::getId) + .filter(StrUtil::isNotBlank) + .collect(Collectors.toSet()); + + List deletedSubjectTypes = persistedSubjectTypes.stream() + .filter(subjectType -> !submittedSubjectIds.contains(subjectType.getId())) + .toList(); + String subjectError = getReferencedSubjectTypeError(worksCollection.getId(), deletedSubjectTypes); + if (subjectError != null) { + return subjectError; + } + + for (Activity_works_subjectType submittedSubjectType : submittedSubjectTypes) { + if (submittedSubjectType == null || StrUtil.isBlank(submittedSubjectType.getId())) { + continue; + } + List persistedWorksTypes = dao.query(Activity_works_worksType.class, + Cnd.where(Activity_works_worksType::getSubjectId, "=", submittedSubjectType.getId())); + List submittedWorksTypes = CollUtil.defaultIfEmpty(submittedSubjectType.getWorksTypes(), Collections.emptyList()); + Set submittedWorksIds = submittedWorksTypes.stream() + .map(Activity_works_worksType::getId) + .filter(StrUtil::isNotBlank) + .collect(Collectors.toSet()); + List deletedWorksTypes = persistedWorksTypes.stream() + .filter(worksType -> !submittedWorksIds.contains(worksType.getId())) + .toList(); + String worksError = getReferencedWorksTypeError(worksCollection.getId(), deletedWorksTypes); + if (worksError != null) { + return worksError; + } + } + return null; + } + + /** + * 校验待删除主题类型是否已有投稿,防止投稿的主题类型关联被清空。 + */ + private String getReferencedSubjectTypeError(String activityId, List deletedSubjectTypes) { + if (CollUtil.isEmpty(deletedSubjectTypes)) { + return null; + } + List deletedSubjectIds = deletedSubjectTypes.stream() + .map(Activity_works_subjectType::getId) + .collect(Collectors.toList()); + List uploads = dao.query(Activity_works_collection_upload.class, + Cnd.where(Activity_works_collection_upload::getActivityId, "=", activityId) + .and(Activity_works_collection_upload::getSubjectId, "in", deletedSubjectIds)); + if (CollUtil.isEmpty(uploads)) { + return null; + } + Set referencedSubjectIds = uploads.stream() + .map(Activity_works_collection_upload::getSubjectId) + .collect(Collectors.toSet()); + String typeNames = deletedSubjectTypes.stream() + .filter(subjectType -> referencedSubjectIds.contains(subjectType.getId())) + .map(Activity_works_subjectType::getTypeName) + .collect(Collectors.joining("、")); + return "主题类型“" + typeNames + "”下已有投稿,不能删除"; + } + + /** + * 校验待删除作品类型是否已有投稿,防止投稿的作品类型关联被清空。 + */ + private String getReferencedWorksTypeError(String activityId, List deletedWorksTypes) { + if (CollUtil.isEmpty(deletedWorksTypes)) { + return null; + } + List deletedWorksIds = deletedWorksTypes.stream() + .map(Activity_works_worksType::getId) + .collect(Collectors.toList()); + List uploads = dao.query(Activity_works_collection_upload.class, + Cnd.where(Activity_works_collection_upload::getActivityId, "=", activityId) + .and(Activity_works_collection_upload::getWorksId, "in", deletedWorksIds)); + if (CollUtil.isEmpty(uploads)) { + return null; + } + Set referencedWorksIds = uploads.stream() + .map(Activity_works_collection_upload::getWorksId) + .collect(Collectors.toSet()); + String typeNames = deletedWorksTypes.stream() + .filter(worksType -> referencedWorksIds.contains(worksType.getId())) + .map(Activity_works_worksType::getWorksTypeName) + .collect(Collectors.joining("、")); + return "作品类型“" + typeNames + "”下已有投稿,不能删除"; + } +} diff --git a/src/main/java/com/budwk/app/zhgh/archive/constant/ArchiveConstant.java b/src/main/java/com/budwk/app/zhgh/archive/constant/ArchiveConstant.java deleted file mode 100644 index fe82916e..00000000 --- a/src/main/java/com/budwk/app/zhgh/archive/constant/ArchiveConstant.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.budwk.app.zhgh.archive.constant; - -import org.nutz.lang.Strings; - -import java.util.List; -import java.util.Map; - -/** - * 活动电子档案常量。 - */ -public final class ArchiveConstant { - - public static final int PROJECT_DRAFT = 0; - public static final int PROJECT_FILING = 1; - public static final int PROJECT_COMPLETED = 2; - - public static final int DOCUMENT_DRAFT = 0; - public static final int DOCUMENT_SUBMITTED = 1; - - public static final String STAGE_PREPARE = "PREPARE"; - public static final String STAGE_PROCESS = "PROCESS"; - public static final String STAGE_SUMMARY = "SUMMARY"; - - public static final Map STAGE_LABELS = Map.of( - STAGE_PREPARE, "筹备阶段", - STAGE_PROCESS, "实施阶段", - STAGE_SUMMARY, "总结阶段" - ); - - private ArchiveConstant() { - } - - public static boolean validStage(String stage) { - return Strings.isNotBlank(stage) && STAGE_LABELS.containsKey(stage); - } - - public static String stageLabel(String stage) { - return STAGE_LABELS.getOrDefault(stage, stage); - } - - public static String projectStatusLabel(Integer status) { - if (status != null && status == PROJECT_COMPLETED) { - return "已完成"; - } - if (status != null && status == PROJECT_FILING) { - return "归档中"; - } - return "草稿"; - } - - public static String documentStatusLabel(Integer status) { - return status != null && status == DOCUMENT_SUBMITTED ? "已提交归档" : "草稿"; - } - - public static List> stageOptions() { - return List.of( - Map.of("value", STAGE_PREPARE, "label", STAGE_LABELS.get(STAGE_PREPARE)), - Map.of("value", STAGE_PROCESS, "label", STAGE_LABELS.get(STAGE_PROCESS)), - Map.of("value", STAGE_SUMMARY, "label", STAGE_LABELS.get(STAGE_SUMMARY)) - ); - } -} diff --git a/src/main/java/com/budwk/app/zhgh/archive/controller/ArchiveController.java b/src/main/java/com/budwk/app/zhgh/archive/controller/ArchiveController.java deleted file mode 100644 index ec1be988..00000000 --- a/src/main/java/com/budwk/app/zhgh/archive/controller/ArchiveController.java +++ /dev/null @@ -1,221 +0,0 @@ -package com.budwk.app.zhgh.archive.controller; - -import cn.dev33.satoken.annotation.SaCheckPermission; -import com.budwk.app.base.annotation.SLog; -import com.budwk.app.base.param.PageForm; -import com.budwk.app.base.result.Result; -import com.budwk.app.zhgh.archive.constant.ArchiveConstant; -import com.budwk.app.zhgh.archive.model.ArchiveDocType; -import com.budwk.app.zhgh.archive.model.ArchiveDocument; -import com.budwk.app.zhgh.archive.model.ArchiveProject; -import com.budwk.app.zhgh.archive.service.ArchiveService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.nutz.dao.Dao; -import org.nutz.ioc.loader.annotation.Inject; -import org.nutz.ioc.loader.annotation.IocBean; -import org.nutz.lang.Strings; -import org.nutz.mvc.annotation.At; -import org.nutz.mvc.annotation.Ok; -import org.nutz.mvc.annotation.Param; - -/** - * 活动电子档案。 - */ -@IocBean -@Ok("json:full") -@At("/platform/archive") -@Api(tags = "活动电子档案") -public class ArchiveController { - - @Inject - private ArchiveService archiveService; - - @Inject - private Dao dao; - - @At("/docType") - @Ok("beetl:/platform/zhgh/archive/docType/index.html") - @SaCheckPermission("archive.docType") - public void docTypeIndex() { - } - - @At("/docType/pageData") - @SaCheckPermission("archive.docType") - public Result docTypePageData(PageForm pageForm, String name, - String projectStage, Boolean requiredFlag) { - return Result.success(archiveService.pageDocTypes( - pageForm, name, projectStage, requiredFlag)); - } - - @At("/docType/listData") - public Result docTypeListData(String projectStage) { - return Result.success(archiveService.listDocTypes(projectStage)); - } - - @At("/docType/fetchOne") - @SaCheckPermission("archive.docType") - public Result docTypeFetchOne(String id) { - return Result.success(dao.fetch(ArchiveDocType.class, id)); - } - - @At("/docType/onSubmit") - @SLog(tag = "活动电子档案-文档类型", msg = "新增或修改文档类型") - @SaCheckPermission("archive.docType") - public Result docTypeOnSubmit(ArchiveDocType docType) { - try { - archiveService.saveDocType(docType); - return Result.success(); - } catch (IllegalArgumentException e) { - return Result.error(e.getMessage()); - } - } - - @At("/docType/onDelete") - @SLog(tag = "活动电子档案-文档类型", msg = "删除文档类型") - @SaCheckPermission("archive.docType") - public Result docTypeOnDelete(String id) { - try { - archiveService.deleteDocType(id); - return Result.success(); - } catch (IllegalArgumentException e) { - return Result.error(e.getMessage()); - } - } - - @At("/project") - @Ok("beetl:/platform/zhgh/archive/project/index.html") - @SaCheckPermission("archive.project") - public void projectIndex() { - } - - @At("/project/pageData") - @SaCheckPermission("archive.project") - public Result projectPageData(PageForm pageForm, Integer year, - String projectName, String unionId, Integer status) { - return Result.success(archiveService.pageProjects( - pageForm, year, projectName, unionId, status)); - } - - @At("/project/listData") - public Result projectListData() { - return Result.success(archiveService.listProjects()); - } - - @At("/project/fetchOne") - @SaCheckPermission("archive.project") - public Result projectFetchOne(String id) { - return Result.success(dao.fetch(ArchiveProject.class, id)); - } - - @At("/project/onSubmit") - @SLog(tag = "活动电子档案-归档项目", msg = "新增或修改归档项目") - @SaCheckPermission("archive.project") - public Result projectOnSubmit(ArchiveProject project) { - try { - archiveService.saveProject(project); - return Result.success(); - } catch (IllegalArgumentException e) { - return Result.error(e.getMessage()); - } - } - - @At("/project/onDelete") - @SLog(tag = "活动电子档案-归档项目", msg = "删除归档项目") - @SaCheckPermission("archive.project") - public Result projectOnDelete(String id) { - try { - archiveService.deleteProject(id); - return Result.success(); - } catch (IllegalArgumentException e) { - return Result.error(e.getMessage()); - } - } - - @At("/filing") - @Ok("beetl:/platform/zhgh/archive/filing/index.html") - @SaCheckPermission("archive.filing") - public void filingIndex() { - } - - @At("/filing/pageData") - @SaCheckPermission("archive.filing") - public Result filingPageData(PageForm pageForm, String projectId, Integer year, - String projectStage, String docTypeId, - String documentName, Integer status) { - return Result.success(archiveService.pageDocuments(pageForm, projectId, year, - projectStage, docTypeId, documentName, status)); - } - - @At("/filing/fetchOne") - @SaCheckPermission("archive.filing") - public Result filingFetchOne(String id) { - return Result.success(archiveService.fetchDocument(id)); - } - - @At("/filing/saveDraft") - @ApiOperation("保存归档文档草稿") - @SLog(tag = "活动电子档案-资料归档", msg = "保存归档文档草稿") - @SaCheckPermission("archive.filing") - public Result filingSaveDraft(ArchiveDocument document) { - return saveDocument(document, false); - } - - @At("/filing/submit") - @ApiOperation("提交归档文档") - @SLog(tag = "活动电子档案-资料归档", msg = "提交归档文档") - @SaCheckPermission("archive.filing") - public Result filingSubmit(ArchiveDocument document) { - return saveDocument(document, true); - } - - @At("/filing/onDelete") - @SLog(tag = "活动电子档案-资料归档", msg = "删除归档文档") - @SaCheckPermission("archive.filing") - public Result filingOnDelete(String id) { - archiveService.deleteDocument(id); - return Result.success(); - } - - @At("/ledger") - @Ok("beetl:/platform/zhgh/archive/ledger/index.html") - @SaCheckPermission("archive.ledger") - public void ledgerIndex() { - } - - @At("/ledger/pageData") - @SaCheckPermission("archive.ledger") - public Result ledgerPageData(PageForm pageForm, Integer year, - String projectName, String unionId, Integer status) { - return Result.success(archiveService.pageProjects( - pageForm, year, projectName, unionId, status)); - } - - @At("/ledger/detail") - @SaCheckPermission("archive.ledger") - public Result ledgerDetail(PageForm pageForm, String projectId, - String projectStage, String docTypeId, - String documentName, Integer status) { - return Result.success(archiveService.pageDocuments(pageForm, projectId, - null, projectStage, docTypeId, documentName, status)); - } - - @At("/common/stageOptions") - public Result stageOptions() { - return Result.success(ArchiveConstant.stageOptions()); - } - - @At("/common/unionOptions") - public Result unionOptions() { - return Result.success(archiveService.listUnions()); - } - - private Result saveDocument(ArchiveDocument document, boolean submit) { - try { - archiveService.saveDocument(document, submit); - return Result.success(); - } catch (IllegalArgumentException e) { - return Result.error(e.getMessage()); - } - } -} diff --git a/src/main/java/com/budwk/app/zhgh/archive/model/ArchiveDocType.java b/src/main/java/com/budwk/app/zhgh/archive/model/ArchiveDocType.java deleted file mode 100644 index 79e36270..00000000 --- a/src/main/java/com/budwk/app/zhgh/archive/model/ArchiveDocType.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.budwk.app.zhgh.archive.model; - -import com.budwk.app.base.model.BaseModel; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; -import org.nutz.dao.entity.annotation.ColDefine; -import org.nutz.dao.entity.annotation.ColType; -import org.nutz.dao.entity.annotation.Column; -import org.nutz.dao.entity.annotation.Comment; -import org.nutz.dao.entity.annotation.Name; -import org.nutz.dao.interceptor.annotation.PrevInsert; -import org.nutz.dao.entity.annotation.Table; -import org.nutz.dao.entity.annotation.TableMeta; - -/** - * 活动电子档案文档类型。 - */ -@Data -@Accessors(chain = true) -@EqualsAndHashCode(callSuper = true) -@Table("act_archive_doc_type") -@TableMeta("{'mysql-charset':'utf8mb4'}") -@Comment("活动电子档案文档类型") -public class ArchiveDocType extends BaseModel { - - @Name - @PrevInsert(uu32 = true) - @ColDefine(type = ColType.VARCHAR, width = 32) - @Comment("主键") - private String id; - - @Column - @ColDefine(type = ColType.VARCHAR, width = 150) - @Comment("类型名称") - private String name; - - @Column - @ColDefine(type = ColType.VARCHAR, width = 32) - @Comment("项目阶段") - private String projectStage; - - @Column - @Comment("排序编号") - private Integer sortNo; - - @Column - @Comment("是否必选") - private Boolean requiredFlag; - - @Column - @ColDefine(type = ColType.VARCHAR, width = 600) - @Comment("备注") - private String remark; -} diff --git a/src/main/java/com/budwk/app/zhgh/archive/model/ArchiveDocument.java b/src/main/java/com/budwk/app/zhgh/archive/model/ArchiveDocument.java deleted file mode 100644 index df0fea9e..00000000 --- a/src/main/java/com/budwk/app/zhgh/archive/model/ArchiveDocument.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.budwk.app.zhgh.archive.model; - -import cn.hutool.json.JSONObject; -import com.budwk.app.base.model.BaseModel; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; -import org.nutz.dao.entity.annotation.ColDefine; -import org.nutz.dao.entity.annotation.ColType; -import org.nutz.dao.entity.annotation.Column; -import org.nutz.dao.entity.annotation.Comment; -import org.nutz.dao.entity.annotation.Name; -import org.nutz.dao.interceptor.annotation.PrevInsert; -import org.nutz.dao.entity.annotation.Table; -import org.nutz.dao.entity.annotation.TableMeta; - -import java.util.List; - -/** - * 活动电子档案归档文档。 - */ -@Data -@Accessors(chain = true) -@EqualsAndHashCode(callSuper = true) -@Table("act_archive_document") -@TableMeta("{'mysql-charset':'utf8mb4'}") -@Comment("活动电子档案归档文档") -public class ArchiveDocument extends BaseModel { - - @Name - @PrevInsert(uu32 = true) - @ColDefine(type = ColType.VARCHAR, width = 32) - @Comment("主键") - private String id; - - @Column - @ColDefine(type = ColType.VARCHAR, width = 32) - @Comment("项目ID") - private String projectId; - - @Column - @ColDefine(type = ColType.VARCHAR, width = 300) - @Comment("文档名称") - private String documentName; - - @Column - @ColDefine(type = ColType.VARCHAR, width = 32) - @Comment("项目阶段") - private String projectStage; - - @Column - @ColDefine(type = ColType.VARCHAR, width = 32) - @Comment("文档类型ID") - private String docTypeId; - - @Column - @Comment("文档状态") - private Integer status; - - @Column - @ColDefine(type = ColType.VARCHAR, width = 100) - @Comment("上传人") - private String uploader; - - @Column - @Comment("上传时间") - private Long uploadTime; - - @Column - @ColDefine(type = ColType.MYSQL_JSON) - @Comment("附件") - private List files; - - @Column - @ColDefine(type = ColType.VARCHAR, width = 600) - @Comment("备注") - private String remark; -} diff --git a/src/main/java/com/budwk/app/zhgh/archive/model/ArchiveProject.java b/src/main/java/com/budwk/app/zhgh/archive/model/ArchiveProject.java deleted file mode 100644 index 3601137e..00000000 --- a/src/main/java/com/budwk/app/zhgh/archive/model/ArchiveProject.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.budwk.app.zhgh.archive.model; - -import com.budwk.app.base.model.BaseModel; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; -import org.nutz.dao.entity.annotation.ColDefine; -import org.nutz.dao.entity.annotation.ColType; -import org.nutz.dao.entity.annotation.Column; -import org.nutz.dao.entity.annotation.Comment; -import org.nutz.dao.entity.annotation.Name; -import org.nutz.dao.interceptor.annotation.PrevInsert; -import org.nutz.dao.entity.annotation.Table; -import org.nutz.dao.entity.annotation.TableMeta; - -/** - * 活动电子档案项目。 - */ -@Data -@Accessors(chain = true) -@EqualsAndHashCode(callSuper = true) -@Table("act_archive_project") -@TableMeta("{'mysql-charset':'utf8mb4'}") -@Comment("活动电子档案项目") -public class ArchiveProject extends BaseModel { - - @Name - @PrevInsert(uu32 = true) - @ColDefine(type = ColType.VARCHAR, width = 32) - @Comment("主键") - private String id; - - @Column - @Comment("年度") - private Integer year; - - @Column - @ColDefine(type = ColType.VARCHAR, width = 300) - @Comment("项目名称") - private String projectName; - - @Column - @Comment("项目状态") - private Integer status; - - @Column - @ColDefine(type = ColType.VARCHAR, width = 32) - @Comment("所属工会ID") - private String unionId; - - @Column - @ColDefine(type = ColType.VARCHAR, width = 150) - @Comment("所属工会名称") - private String unionName; -} diff --git a/src/main/java/com/budwk/app/zhgh/archive/service/ArchiveService.java b/src/main/java/com/budwk/app/zhgh/archive/service/ArchiveService.java deleted file mode 100644 index 19b9a4a6..00000000 --- a/src/main/java/com/budwk/app/zhgh/archive/service/ArchiveService.java +++ /dev/null @@ -1,406 +0,0 @@ -package com.budwk.app.zhgh.archive.service; - -import cn.hutool.core.util.StrUtil; -import com.budwk.app.base.page.Pagination; -import com.budwk.app.base.param.PageForm; -import com.budwk.app.base.service.impl.BaseServiceImpl; -import com.budwk.app.sys.models.Sys_union; -import com.budwk.app.web.commons.auth.utils.SecurityUtil; -import com.budwk.app.zhgh.archive.constant.ArchiveConstant; -import com.budwk.app.zhgh.archive.model.ArchiveDocType; -import com.budwk.app.zhgh.archive.model.ArchiveDocument; -import com.budwk.app.zhgh.archive.model.ArchiveProject; -import org.nutz.aop.interceptor.ioc.TransAop; -import org.nutz.dao.Chain; -import org.nutz.dao.Cnd; -import org.nutz.dao.Dao; -import org.nutz.dao.Sqls; -import org.nutz.dao.sql.Sql; -import org.nutz.ioc.aop.Aop; -import org.nutz.ioc.loader.annotation.IocBean; -import org.nutz.lang.Strings; -import org.nutz.lang.util.NutMap; - -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -/** - * 活动电子档案领域服务。 - */ -@IocBean(args = {"refer:dao"}) -public class ArchiveService extends BaseServiceImpl { - - public ArchiveService(Dao dao) { - super(dao); - } - - public Pagination pageDocTypes(PageForm pageForm, String name, - String projectStage, Boolean requiredFlag) { - Cnd cnd = Cnd.NEW(); - cnd.and(Cnd.likeEX("adt.name", name)); - cnd.andEX("adt.projectStage", "=", projectStage); - cnd.andEX("adt.requiredFlag", "=", requiredFlag); - cnd.and("adt.delFlag", "=", false); - cnd.asc("adt.projectStage").asc("adt.sortNo").asc("adt.createdAt"); - Sql sql = Sqls.create(""" - SELECT adt.*, - (SELECT COUNT(1) - FROM act_archive_document ad - WHERE ad.docTypeId = adt.id - AND ad.delFlag = 0) AS documentCount - FROM act_archive_doc_type adt - $condition - """); - sql.setCondition(cnd); - Pagination page = listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); - page.getList().forEach(this::enrichDocType); - return page; - } - - public List listDocTypes(String projectStage) { - Cnd cnd = Cnd.where("adt.delFlag", "=", false); - cnd.andEX("adt.projectStage", "=", projectStage); - cnd.asc("adt.projectStage").asc("adt.sortNo").asc("adt.createdAt"); - Sql sql = Sqls.create(""" - SELECT adt.*, - (SELECT COUNT(1) - FROM act_archive_document ad - WHERE ad.docTypeId = adt.id - AND ad.delFlag = 0) AS documentCount - FROM act_archive_doc_type adt - $condition - """); - sql.setCondition(cnd); - List list = listMap(sql); - list.forEach(this::enrichDocType); - return list; - } - - @Aop(TransAop.READ_COMMITTED) - public void saveDocType(ArchiveDocType docType) { - if (docType == null || Strings.isBlank(docType.getName())) { - throw new IllegalArgumentException("类型名称不能为空"); - } - if (!ArchiveConstant.validStage(docType.getProjectStage())) { - throw new IllegalArgumentException("项目阶段不正确"); - } - docType.setName(docType.getName().trim()); - if (docType.getSortNo() == null) { - docType.setSortNo(0); - } - if (docType.getRequiredFlag() == null) { - docType.setRequiredFlag(false); - } - Cnd duplicate = Cnd.where("projectStage", "=", docType.getProjectStage()) - .and("name", "=", docType.getName()) - .and("delFlag", "=", false); - if (Strings.isNotBlank(docType.getId())) { - duplicate.and("id", "<>", docType.getId()); - } - if (dao().count(ArchiveDocType.class, duplicate) > 0) { - throw new IllegalArgumentException("同一项目阶段下类型名称不能重复"); - } - if (Strings.isBlank(docType.getId())) { - dao().insert(docType); - } else { - ArchiveDocType old = dao().fetch(ArchiveDocType.class, docType.getId()); - if (old == null) { - throw new IllegalArgumentException("文档类型不存在"); - } - dao().updateIgnoreNull(docType); - } - } - - @Aop(TransAop.READ_COMMITTED) - public void deleteDocType(String id) { - if (Strings.isBlank(id)) { - return; - } - if (dao().count(ArchiveDocument.class, - Cnd.where("docTypeId", "=", id).and("delFlag", "=", false)) > 0) { - throw new IllegalArgumentException("文档类型已被归档文档引用,不能删除"); - } - dao().delete(ArchiveDocType.class, id); - } - - public Pagination pageProjects(PageForm pageForm, Integer year, - String projectName, String unionId, Integer status) { - Cnd cnd = Cnd.NEW(); - cnd.andEX("ap.year", "=", year); - cnd.and(Cnd.likeEX("ap.projectName", projectName)); - cnd.andEX("ap.unionId", "=", unionId); - cnd.andEX("ap.status", "=", status); - cnd.and("ap.delFlag", "=", false); - cnd.desc("ap.year").desc("ap.createdAt"); - Sql sql = Sqls.create(""" - SELECT ap.*, - (SELECT COUNT(1) - FROM act_archive_document ad - WHERE ad.projectId = ap.id - AND ad.delFlag = 0) AS documentCount - FROM act_archive_project ap - $condition - """); - sql.setCondition(cnd); - Pagination page = listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); - page.getList().forEach(this::enrichProject); - return page; - } - - public List listProjects() { - Cnd cnd = Cnd.where("ap.delFlag", "=", false); - cnd.desc("ap.year").desc("ap.createdAt"); - Sql sql = Sqls.create(""" - SELECT ap.*, - (SELECT COUNT(1) - FROM act_archive_document ad - WHERE ad.projectId = ap.id - AND ad.delFlag = 0) AS documentCount - FROM act_archive_project ap - $condition - """); - sql.setCondition(cnd); - List list = listMap(sql); - list.forEach(this::enrichProject); - return list; - } - - @Aop(TransAop.READ_COMMITTED) - public void saveProject(ArchiveProject project) { - if (project == null || project.getYear() == null) { - throw new IllegalArgumentException("年度不能为空"); - } - if (Strings.isBlank(project.getProjectName())) { - throw new IllegalArgumentException("项目名称不能为空"); - } - if (Strings.isBlank(project.getUnionId())) { - throw new IllegalArgumentException("所属工会不能为空"); - } - Sys_union union = dao().fetch(Sys_union.class, project.getUnionId()); - if (union == null) { - throw new IllegalArgumentException("所属工会不存在"); - } - project.setProjectName(project.getProjectName().trim()); - project.setUnionName(union.getName()); - Cnd duplicate = Cnd.where("year", "=", project.getYear()) - .and("projectName", "=", project.getProjectName()) - .and("unionId", "=", project.getUnionId()) - .and("delFlag", "=", false); - if (Strings.isNotBlank(project.getId())) { - duplicate.and("id", "<>", project.getId()); - } - if (dao().count(ArchiveProject.class, duplicate) > 0) { - throw new IllegalArgumentException("同年度同工会下项目名称不能重复"); - } - if (Strings.isBlank(project.getId())) { - project.setStatus(ArchiveConstant.PROJECT_DRAFT); - dao().insert(project); - } else { - ArchiveProject old = dao().fetch(ArchiveProject.class, project.getId()); - if (old == null) { - throw new IllegalArgumentException("归档项目不存在"); - } - project.setStatus(old.getStatus()); - dao().updateIgnoreNull(project); - } - } - - @Aop(TransAop.READ_COMMITTED) - public void deleteProject(String id) { - if (Strings.isBlank(id)) { - return; - } - if (dao().count(ArchiveDocument.class, - Cnd.where("projectId", "=", id).and("delFlag", "=", false)) > 0) { - throw new IllegalArgumentException("项目下已存在归档文档,不能删除"); - } - dao().delete(ArchiveProject.class, id); - } - - public Pagination pageDocuments(PageForm pageForm, String projectId, Integer year, - String projectStage, String docTypeId, - String documentName, Integer status) { - Cnd cnd = Cnd.NEW(); - cnd.andEX("ad.projectId", "=", projectId); - cnd.andEX("ap.year", "=", year); - cnd.andEX("ad.projectStage", "=", projectStage); - cnd.andEX("ad.docTypeId", "=", docTypeId); - cnd.and(Cnd.likeEX("ad.documentName", documentName)); - cnd.andEX("ad.status", "=", status); - cnd.and("ad.delFlag", "=", false); - cnd.and("ap.delFlag", "=", false); - cnd.desc("ap.year").desc("ad.uploadTime").desc("ad.createdAt"); - Sql sql = Sqls.create(""" - SELECT ad.*, ap.year, ap.projectName, ap.unionId, ap.unionName, - adt.name AS docTypeName, adt.requiredFlag AS docTypeRequiredFlag - FROM act_archive_document ad - JOIN act_archive_project ap - ON ap.id = ad.projectId - LEFT JOIN act_archive_doc_type adt - ON adt.id = ad.docTypeId - AND adt.delFlag = 0 - $condition - """); - sql.setCondition(cnd); - Pagination page = listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); - page.getList().forEach(this::enrichDocument); - return page; - } - - public NutMap fetchDocument(String id) { - Sql sql = Sqls.create(""" - SELECT ad.*, ap.year, ap.projectName, ap.unionId, ap.unionName, - adt.name AS docTypeName, adt.requiredFlag AS docTypeRequiredFlag - FROM act_archive_document ad - JOIN act_archive_project ap - ON ap.id = ad.projectId - LEFT JOIN act_archive_doc_type adt - ON adt.id = ad.docTypeId - AND adt.delFlag = 0 - WHERE ad.id = @id - AND ad.delFlag = 0 - AND ap.delFlag = 0 - """); - sql.params().set("id", id); - NutMap map = fetchMap(sql); - if (map != null) { - enrichDocument(map); - } - return map; - } - - @Aop(TransAop.READ_COMMITTED) - public void saveDocument(ArchiveDocument document, boolean submit) { - validateDocument(document, submit); - ArchiveDocument old = Strings.isBlank(document.getId()) - ? null : dao().fetch(ArchiveDocument.class, document.getId()); - if (Strings.isNotBlank(document.getId()) && old == null) { - throw new IllegalArgumentException("归档文档不存在"); - } - int targetStatus = submit ? ArchiveConstant.DOCUMENT_SUBMITTED : ArchiveConstant.DOCUMENT_DRAFT; - if (old != null && old.getStatus() != null - && old.getStatus() == ArchiveConstant.DOCUMENT_SUBMITTED && !submit) { - targetStatus = ArchiveConstant.DOCUMENT_SUBMITTED; - } - document.setStatus(targetStatus); - if (targetStatus == ArchiveConstant.DOCUMENT_SUBMITTED) { - String uploader = SecurityUtil.getUserUsername(); - if (Strings.isBlank(uploader)) { - uploader = SecurityUtil.getUserLoginname(); - } - document.setUploader(uploader); - document.setUploadTime(System.currentTimeMillis()); - } else if (old != null) { - document.setUploader(old.getUploader()); - document.setUploadTime(old.getUploadTime()); - } - String oldProjectId = old == null ? null : old.getProjectId(); - if (old == null) { - dao().insert(document); - } else { - dao().updateIgnoreNull(document); - } - refreshProjectStatus(document.getProjectId()); - if (Strings.isNotBlank(oldProjectId) && !oldProjectId.equals(document.getProjectId())) { - refreshProjectStatus(oldProjectId); - } - } - - @Aop(TransAop.READ_COMMITTED) - public void deleteDocument(String id) { - ArchiveDocument document = dao().fetch(ArchiveDocument.class, id); - if (document == null) { - return; - } - dao().delete(ArchiveDocument.class, id); - refreshProjectStatus(document.getProjectId()); - } - - public List listUnions() { - return dao().query(Sys_union.class, Cnd.where("delFlag", "=", false).asc("unionCode")); - } - - private void validateDocument(ArchiveDocument document, boolean submit) { - if (document == null || Strings.isBlank(document.getProjectId())) { - throw new IllegalArgumentException("归档项目不能为空"); - } - if (Strings.isBlank(document.getDocumentName())) { - throw new IllegalArgumentException("文档名称不能为空"); - } - ArchiveProject project = dao().fetch(ArchiveProject.class, - Cnd.where("id", "=", document.getProjectId()).and("delFlag", "=", false)); - if (project == null) { - throw new IllegalArgumentException("归档项目不存在"); - } - if (!ArchiveConstant.validStage(document.getProjectStage())) { - throw new IllegalArgumentException("项目阶段不正确"); - } - document.setDocumentName(document.getDocumentName().trim()); - if (Strings.isNotBlank(document.getDocTypeId())) { - ArchiveDocType docType = dao().fetch(ArchiveDocType.class, - Cnd.where("id", "=", document.getDocTypeId()).and("delFlag", "=", false)); - if (docType == null) { - throw new IllegalArgumentException("文档类型不存在"); - } - if (!document.getProjectStage().equals(docType.getProjectStage())) { - throw new IllegalArgumentException("文档类型与项目阶段不匹配"); - } - } - if (submit && (document.getFiles() == null || document.getFiles().isEmpty())) { - throw new IllegalArgumentException("提交归档前请先上传附件"); - } - } - - private void refreshProjectStatus(String projectId) { - if (Strings.isBlank(projectId)) { - return; - } - ArchiveProject project = dao().fetch(ArchiveProject.class, projectId); - if (project == null) { - return; - } - List submitted = dao().query(ArchiveDocument.class, - Cnd.where("projectId", "=", projectId) - .and("status", "=", ArchiveConstant.DOCUMENT_SUBMITTED) - .and("delFlag", "=", false)); - int status = ArchiveConstant.PROJECT_DRAFT; - if (!submitted.isEmpty()) { - List requiredTypes = dao().query(ArchiveDocType.class, - Cnd.where("requiredFlag", "=", true).and("delFlag", "=", false)); - if (requiredTypes.isEmpty()) { - status = ArchiveConstant.PROJECT_FILING; - } else { - Set submittedKeys = new HashSet<>(); - submitted.forEach(item -> { - if (Strings.isNotBlank(item.getDocTypeId())) { - submittedKeys.add(item.getProjectStage() + "_" + item.getDocTypeId()); - } - }); - boolean completed = requiredTypes.stream().allMatch(item -> - submittedKeys.contains(item.getProjectStage() + "_" + item.getId())); - status = completed ? ArchiveConstant.PROJECT_COMPLETED : ArchiveConstant.PROJECT_FILING; - } - } - dao().update(ArchiveProject.class, Chain.make("status", status), - Cnd.where("id", "=", projectId)); - } - - private void enrichDocType(NutMap map) { - map.put("projectStageLabel", ArchiveConstant.stageLabel(map.getString("projectStage"))); - } - - private void enrichProject(NutMap map) { - map.put("statusLabel", ArchiveConstant.projectStatusLabel(map.getInt("status"))); - } - - private void enrichDocument(NutMap map) { - map.put("projectStageLabel", ArchiveConstant.stageLabel(map.getString("projectStage"))); - map.put("statusLabel", ArchiveConstant.documentStatusLabel(map.getInt("status"))); - Object files = map.get("files"); - if (files == null || StrUtil.isBlank(String.valueOf(files))) { - map.put("files", Collections.emptyList()); - } - } -} diff --git a/src/main/java/com/budwk/app/zhgh/club/controller/examine/ClubExamineApplyController.java b/src/main/java/com/budwk/app/zhgh/club/controller/examine/ClubExamineApplyController.java index 9cce435e..6f037b99 100644 --- a/src/main/java/com/budwk/app/zhgh/club/controller/examine/ClubExamineApplyController.java +++ b/src/main/java/com/budwk/app/zhgh/club/controller/examine/ClubExamineApplyController.java @@ -76,7 +76,8 @@ public class ClubExamineApplyController { if(year == null) { return Result.error("年份信息为空,请核查"); } - List list = dao.query(SysClubExamineRegister.class, Cnd.where("clubId", "=", clubId).and("year(registerDate)", "=", year).andEX("id", "!=", id)); + // 同一社团的年度重复申请校验以登记年度为准,不能按申请时间判断。 + List list = dao.query(SysClubExamineRegister.class, Cnd.where("clubId", "=", clubId).and("year", "=", year).andEX("id", "!=", id)); List instanceList = dao.query( ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "in", list.stream().map(SysClubExamineRegister::getId).toList()) @@ -146,8 +147,9 @@ public class ClubExamineApplyController { if(StrUtil.isBlank(clubId)) { return Result.error("社团信息为空,请核查"); } + // 上年度结余按登记年度查询,避免申请时间跨年导致取错数据。 SysClubExamineRegister register = dao.fetch(SysClubExamineRegister.class, Cnd.where("clubId", "=", clubId) - .and("YEAR(registerDate)", "=", DateUtil.thisYear() - 1)); + .and("year", "=", DateUtil.thisYear() - 1)); if (Lang.isNotEmpty(register)) { List list = register.getIncomeCensus(); float surplus = list.get(0).getFloat("surplus"); diff --git a/src/main/java/com/budwk/app/zhgh/club/controller/examine/ClubExamineMineController.java b/src/main/java/com/budwk/app/zhgh/club/controller/examine/ClubExamineMineController.java index 52ce8927..045c1569 100644 --- a/src/main/java/com/budwk/app/zhgh/club/controller/examine/ClubExamineMineController.java +++ b/src/main/java/com/budwk/app/zhgh/club/controller/examine/ClubExamineMineController.java @@ -87,7 +87,8 @@ public class ClubExamineMineController { nutMap.setv("clubName", register.getClubName()); nutMap.setv("create_time", register.getFoundTime()); nutMap.setv("dues_standard", register.getDue()); - nutMap.setv("year", register.getRegisterDate().substring(0, 4)); + // 生成材料中的年度与列表展示的登记年度保持一致。 + nutMap.setv("year", register.getYear()); nutMap.setv("registerDate", register.getRegisterDate()); nutMap.setv("incomeCensus", incomeCensus); nutMap.setv("jgUser", jgUser); diff --git a/src/main/java/com/budwk/app/zhgh/club/controller/infoManage/ClubAuditManagerController.java b/src/main/java/com/budwk/app/zhgh/club/controller/infoManage/ClubAuditManagerController.java index 25ab0593..30160fbf 100644 --- a/src/main/java/com/budwk/app/zhgh/club/controller/infoManage/ClubAuditManagerController.java +++ b/src/main/java/com/budwk/app/zhgh/club/controller/infoManage/ClubAuditManagerController.java @@ -90,10 +90,12 @@ public class ClubAuditManagerController { cnd.andEX("year(info.creatTime)", "=", pageForm.getYear()); cnd.and("t.taskName", "=", "ef81777f-22fb-4fe4-9800-909e6c681210"); - cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId())); if (approval) { + // 已审核是全量历史,不能因历史工作流参与人不同而遗漏参考库迁移记录。 cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode())); } else { + // 未审核只展示当前登录人实际可以处理的待办任务。 + cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId())); cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode()); } diff --git a/src/main/java/com/budwk/app/zhgh/club/controller/infoManage/ClubInfoManageController.java b/src/main/java/com/budwk/app/zhgh/club/controller/infoManage/ClubInfoManageController.java index dfe8b67d..d8889a44 100644 --- a/src/main/java/com/budwk/app/zhgh/club/controller/infoManage/ClubInfoManageController.java +++ b/src/main/java/com/budwk/app/zhgh/club/controller/infoManage/ClubInfoManageController.java @@ -200,6 +200,7 @@ public class ClubInfoManageController { @SLog(tag = "社团管理系统-信息管理", msg = "修改身份") public Result updateRoleCode(@Param("id") String id, @Valid String[] roleCodes, @Valid String clubId) { List roleCodeList = Arrays.asList(roleCodes); + ClubUser clubUser = clubInfoManageService.dao().fetch(ClubUser.class, id); //查询社团是否存在会长或者秘书长 if(Arrays.asList(roleCodes).contains(RoleConstant.CLUB_PRESIDENT.name())) { int count = dao.count(ClubUser.class, Cnd.where("clubId", "=", clubId) @@ -210,14 +211,14 @@ public class ClubInfoManageController { } if(Arrays.asList(roleCodes).contains(RoleConstant.CLUB_SECRETARY.name())) { int count = dao.count(ClubUser.class, Cnd.where("clubId", "=", clubId) + .and("id", "!=", id) .and(new Static("JSON_CONTAINS(roleCode, '\"%s\"')".formatted(RoleConstant.CLUB_SECRETARY.name())))); if (count > 0) { // return Result.error("秘书长只能有一位"); + return Result.error("秘书长只能有一位"); } } - ClubUser clubUser = clubInfoManageService.dao().fetch(ClubUser.class, id); - // 先清除所有的角色 dao.clear(Sys_user_role.class, Cnd.where("userId", "=", clubUser.getUserId()).and("clubId", "=", clubUser.getClubId())); // 再根据传过来的赋值 diff --git a/src/main/java/com/budwk/app/zhgh/club/controller/infoManage/ClubSchoolAuditReportController.java b/src/main/java/com/budwk/app/zhgh/club/controller/infoManage/ClubSchoolAuditReportController.java index e302329e..99110ba4 100644 --- a/src/main/java/com/budwk/app/zhgh/club/controller/infoManage/ClubSchoolAuditReportController.java +++ b/src/main/java/com/budwk/app/zhgh/club/controller/infoManage/ClubSchoolAuditReportController.java @@ -2,10 +2,14 @@ package com.budwk.app.zhgh.club.controller.infoManage; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.URLUtil; +import cn.hutool.json.JSONObject; import com.budwk.app.base.page.Pagination; import com.budwk.app.base.result.Result; import com.budwk.app.base.utils.PageUtil; import com.budwk.app.flow.enums.ProcessTaskStateEnum; +import com.budwk.app.sys.models.Sys_file; +import com.budwk.app.sys.utils.SysFileMinIoUtil; import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.zhgh.club.param.ClubUserPageForm; import com.budwk.app.zhgh.club.service.SysClubInfoManageService; @@ -14,12 +18,24 @@ import org.nutz.dao.Sqls; import org.nutz.dao.sql.Sql; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.json.Json; +import org.nutz.lang.util.NutMap; import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.Ok; import org.nutz.mvc.annotation.Param; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; +import java.io.BufferedOutputStream; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; /** * @Author: JyuHsin @@ -32,6 +48,8 @@ import java.util.List; @At("/platform/club/infoManage/schoolAuditReport") public class ClubSchoolAuditReportController { + private static final Logger log = LoggerFactory.getLogger(ClubSchoolAuditReportController.class); + @Inject private SysClubInfoManageService clubInfoManageService; @@ -44,6 +62,71 @@ public class ClubSchoolAuditReportController { @SaCheckPermission("club.infoManage.schoolAuditReport") public Result pageData(@Valid ClubUserPageForm pageForm, @Param(value = "approval") Boolean approval) { + Sql sql = buildPageDataSql(pageForm, approval); + Pagination pagination = clubInfoManageService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + return Result.success(pagination); + } + + /** + * 导出当前筛选范围内的换届报告附件压缩包。 + * + * @param pageForm 页面查询条件 + * @param approval 审核状态,与列表页保持一致 + * @param response HTTP 下载响应 + */ + @At + @Ok("void") + @SaCheckPermission("club.infoManage.schoolAuditReport") + public void exportRefreshReportZip(@Valid ClubUserPageForm pageForm, + @Param(value = "approval") Boolean approval, + HttpServletResponse response) throws IOException { + List reportList = clubInfoManageService.listMap(buildPageDataSql(pageForm, approval)); + response.setContentType("application/zip"); + response.setHeader("Content-Disposition", "attachment;filename=" + URLUtil.encode("换届报告.zip")); + + // 显式指定 UTF-8,确保压缩包内中文目录和文件名正常显示。 + try (ZipOutputStream zipOutputStream = new ZipOutputStream(new BufferedOutputStream(response.getOutputStream()), StandardCharsets.UTF_8)) { + Set entryNames = new HashSet<>(); + for (NutMap report : reportList) { + String filesJson = report.getString("files"); + if (StrUtil.isBlank(filesJson)) { + continue; + } + List files = Json.fromJsonAsList(JSONObject.class, filesJson); + String folderName = buildFolderName(report); + for (int index = 0; index < files.size(); index++) { + JSONObject fileInfo = files.get(index); + Sys_file sysFile = findSysFile(fileInfo); + if (sysFile == null) { + log.warn("换届报告附件不存在,报告ID:{},附件:{}", report.getString("id"), fileInfo); + continue; + } + byte[] fileBytes = SysFileMinIoUtil.getFileBytes(sysFile.getBucket(), sysFile.getStoragePath()); + if (fileBytes == null || fileBytes.length == 0) { + log.warn("换届报告附件内容为空,报告ID:{},附件ID:{}", report.getString("id"), sysFile.getId()); + continue; + } + String fileName = StrUtil.blankToDefault(fileInfo.getStr("name"), fileInfo.getStr("filename")); + if (StrUtil.isBlank(fileName)) { + fileName = sysFile.getName(); + } + String entryName = buildUniqueEntryName(folderName + "/" + sanitizeFileName(fileName), entryNames); + zipOutputStream.putNextEntry(new ZipEntry(entryName)); + zipOutputStream.write(fileBytes); + zipOutputStream.closeEntry(); + } + } + } + } + + /** + * 构建列表与导出共用的换届报告查询,确保“查什么导什么”。 + * + * @param pageForm 页面查询条件 + * @param approval 审核状态 + * @return 已绑定筛选条件的查询对象 + */ + private Sql buildPageDataSql(ClubUserPageForm pageForm, Boolean approval) { Sql sql = Sqls.create(""" SELECT info.*, @@ -79,7 +162,7 @@ public class ClubSchoolAuditReportController { cnd.and("t.taskName", "=", "d4323546-8d09-419e-88d4-7b15862ca29d"); cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId())); - if (approval) { + if (Boolean.TRUE.equals(approval)) { cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode())); } else { cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode()); @@ -96,8 +179,67 @@ public class ClubSchoolAuditReportController { cnd.groupBy("t.id"); sql.setCondition(cnd); + return sql; + } - Pagination pagination = clubInfoManageService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); - return Result.success(pagination); + /** + * 兼容新旧附件 JSON 结构,按附件 ID 或下载地址查找文件元数据。 + * + * @param fileInfo 附件 JSON 信息 + * @return 系统文件记录;未找到时返回 null + */ + private Sys_file findSysFile(JSONObject fileInfo) { + String fileId = fileInfo.getStr("id"); + if (StrUtil.isNotBlank(fileId)) { + return clubInfoManageService.dao().fetch(Sys_file.class, fileId); + } + String fileUrl = fileInfo.getStr("url"); + if (StrUtil.isBlank(fileUrl)) { + return null; + } + return clubInfoManageService.dao().fetch(Sys_file.class, Cnd.where(Sys_file::getDownloadPath, "=", fileUrl)); + } + + /** + * 使用社团名称建立目录,方便按换届报告来源查阅。 + * + * @param report 换届报告记录 + * @return Zip 内目录名称 + */ + private String buildFolderName(NutMap report) { + return sanitizeFileName(report.getString("clubName")); + } + + /** + * 保留附件原始文件名;同一社团目录存在同名文件时追加序号,避免覆盖。 + * + * @param entryName 原始 Zip 条目名称 + * @param entryNames 已写入的 Zip 条目名称 + * @return 唯一的 Zip 条目名称 + */ + private String buildUniqueEntryName(String entryName, Set entryNames) { + if (entryNames.add(entryName)) { + return entryName; + } + int extensionIndex = entryName.lastIndexOf('.'); + String name = extensionIndex > entryName.lastIndexOf('/') ? entryName.substring(0, extensionIndex) : entryName; + String extension = extensionIndex > entryName.lastIndexOf('/') ? entryName.substring(extensionIndex) : ""; + int index = 2; + String uniqueEntryName; + do { + uniqueEntryName = name + "(" + index + ")" + extension; + index++; + } while (!entryNames.add(uniqueEntryName)); + return uniqueEntryName; + } + + /** + * 去除 Zip 条目路径分隔符,避免附件名影响压缩包目录结构。 + * + * @param fileName 原始文件名 + * @return 可安全写入 Zip 的文件名 + */ + private String sanitizeFileName(String fileName) { + return StrUtil.blankToDefault(fileName, "未命名文件").replace("/", "_").replace("\\", "_"); } } diff --git a/src/main/java/com/budwk/app/zhgh/club/model/SysClubExamineRegister.java b/src/main/java/com/budwk/app/zhgh/club/model/SysClubExamineRegister.java index 3b41d961..a672c7b8 100644 --- a/src/main/java/com/budwk/app/zhgh/club/model/SysClubExamineRegister.java +++ b/src/main/java/com/budwk/app/zhgh/club/model/SysClubExamineRegister.java @@ -95,6 +95,14 @@ public class SysClubExamineRegister extends BaseModel { @ColDefine(type = ColType.MYSQL_JSON) private List yearActivityList; + /** + * 旧版年审表保存的年度活动明细,保留该字段用于查看迁移历史数据。 + */ + @Column + @Comment("旧版年度活动明细") + @ColDefine(type = ColType.MYSQL_JSON) + private List yearActivitys; + @Column @Comment("财务收支情况统计json") @ColDefine(type = ColType.MYSQL_JSON) diff --git a/src/main/java/com/budwk/app/zhgh/club/param/ClubUserPageForm.java b/src/main/java/com/budwk/app/zhgh/club/param/ClubUserPageForm.java index 0e69c58f..236b6179 100644 --- a/src/main/java/com/budwk/app/zhgh/club/param/ClubUserPageForm.java +++ b/src/main/java/com/budwk/app/zhgh/club/param/ClubUserPageForm.java @@ -24,6 +24,10 @@ public class ClubUserPageForm extends PageForm { private Integer auditType; private Integer source; private Integer year; + /** 社团评优申报开始年度筛选条件。 */ + private String applyStartYear; + /** 社团评优申报结束年度筛选条件。 */ + private String applyEndYear; private Boolean giveMoney; private Integer radioType; } diff --git a/src/main/java/com/budwk/app/zhgh/club/service/impl/SysClubEvaluateServiceImpl.java b/src/main/java/com/budwk/app/zhgh/club/service/impl/SysClubEvaluateServiceImpl.java index f0372d68..2b293d9e 100644 --- a/src/main/java/com/budwk/app/zhgh/club/service/impl/SysClubEvaluateServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/club/service/impl/SysClubEvaluateServiceImpl.java @@ -71,7 +71,9 @@ public class SysClubEvaluateServiceImpl extends BaseServiceImpl Cnd cnd = Cnd.NEW(); cnd.andEX("info.clubId", "=", pageForm.getClubId()); - cnd.andEX("year(info.applyTime)", "=", pageForm.getYear()); + // 评优年度以申报填写的起止年度为准,不能使用申请提交时间所在年份代替。 + cnd.andEX("info.applyStartYear", "=", pageForm.getApplyStartYear()); + cnd.andEX("info.applyEndYear", "=", pageForm.getApplyEndYear()); cnd.and("info.userId", "=", SecurityUtil.getUserId()); cnd.groupBy("info.id"); @@ -144,7 +146,9 @@ public class SysClubEvaluateServiceImpl extends BaseServiceImpl """); cnd.andEX("ce.clubId", "=", pageForm.getClubId()); - cnd.andEX("year(ce.applyTime)", "=", pageForm.getYear()); + // 审核列表与参考项目保持一致,分别按申报开始年度和申报结束年度筛选。 + cnd.andEX("ce.applyStartYear", "=", pageForm.getApplyStartYear()); + cnd.andEX("ce.applyEndYear", "=", pageForm.getApplyEndYear()); if (pageForm.getAudit()) { cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode())); diff --git a/src/main/java/com/budwk/app/zhgh/club/service/impl/SysClubExamineServiceImpl.java b/src/main/java/com/budwk/app/zhgh/club/service/impl/SysClubExamineServiceImpl.java index e90aca78..505a5b59 100644 --- a/src/main/java/com/budwk/app/zhgh/club/service/impl/SysClubExamineServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/club/service/impl/SysClubExamineServiceImpl.java @@ -8,6 +8,7 @@ import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.page.Pagination; import com.budwk.app.base.service.impl.BaseServiceImpl; import com.budwk.app.base.utils.PageUtil; +import com.budwk.app.flow.entity.ProcessInstance; import com.budwk.app.flow.enums.ProcessInstanceStateEnum; import com.budwk.app.flow.enums.ProcessTaskStateEnum; import com.budwk.app.web.commons.auth.utils.AuthUtil; @@ -33,8 +34,10 @@ import org.nutz.lang.util.NutMap; import java.util.ArrayList; import java.util.Comparator; import java.util.Date; +import java.util.HashSet; import java.util.List; import java.util.Objects; +import java.util.Set; import java.util.stream.Collectors; @IocBean(args = {"refer:dao"}) @@ -119,6 +122,7 @@ public class SysClubExamineServiceImpl extends BaseServiceImpl applications = listMap(applySql); + if (!applications.isEmpty()) { + // 流程状态改为按当前社团申请批量查询,避免相关子查询对流程实例表重复扫描。 + List applicationIds = applications.stream() + .map(application -> application.getString("id")) + .filter(StrUtil::isNotBlank) + .collect(Collectors.toList()); + List finishedInstances = applicationIds.isEmpty() ? new ArrayList<>() + : dao().query(ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "in", applicationIds) + .and(ProcessInstance::getState, "=", ProcessInstanceStateEnum.FINISHED.getCode())); + Set finishedBusinessNos = finishedInstances.stream() + .map(ProcessInstance::getBusinessNo) + .filter(StrUtil::isNotBlank) + .collect(Collectors.toCollection(HashSet::new)); + applications.removeIf(application -> !finishedBusinessNos.contains(application.getString("id"))); + } applications.sort(Comparator.comparing(row -> row.getTime("applyDate"), Comparator.nullsLast(Date::compareTo))); for (NutMap application : applications) { @@ -259,6 +271,10 @@ public class SysClubExamineServiceImpl extends BaseServiceImpl getJgUser(String clubId) { - // 构建社团管理人员查询SQL(排除普通成员,按职务排序) + // 构建社团成员查询SQL,理事机构成员优先展示,普通成员随后展示。 Sql sql = Sqls.create(""" SELECT cl.*, @@ -304,7 +320,6 @@ public class SysClubExamineServiceImpl extends BaseServiceImpl detailedList = dao().query(SysClubExamineRegisterDetailed.class, Cnd.where("registerId", "=", id).asc("location")); clubExamineVo.setDetailedList(detailedList); + // V3年审审核记录已迁入audit表,作为V4工作流历史为空时的详情回显数据。 + Sql legacyAuditSql = Sqls.create(""" + SELECT + a.id, + a.username AS userName, + a.loginname AS loginName, + a.auditTime, + a.auditPass, + a.auditOpinion, + a.auditSign, + CASE + WHEN a.id = scer.clubAuditId THEN '社团审核' + WHEN a.id = scer.clubLeaderAuditId THEN '会长审核' + WHEN a.id = scer.schoolAuditId THEN '校工会审核' + END AS auditName + FROM + sys_club_examine_register scer + INNER JOIN audit a ON a.id IN (scer.clubAuditId, scer.clubLeaderAuditId, scer.schoolAuditId) + WHERE + scer.id = @id + ORDER BY + CASE + WHEN a.id = scer.clubAuditId THEN 1 + WHEN a.id = scer.clubLeaderAuditId THEN 2 + WHEN a.id = scer.schoolAuditId THEN 3 + ELSE 99 + END + """).setParam("id", id); + clubExamineVo.setLegacyAuditRecords(listMap(legacyAuditSql)); } return clubExamineVo; } + /** + * 将旧版年审活动和计划字段转换为查看页统一使用的V4字段,避免历史数据在页面中显示为空。 + * + * @param examineVo 年审详情 + */ + private void normalizeActivityData(ClubExamineVo examineVo) { + examineVo.setSummaryFiles(normalizeSummaryFiles(examineVo.getSummaryFiles())); + examineVo.setChangeUserNum(normalizeChangeUserNum(examineVo.getChangeUserNum())); + List yearActivitySource = examineVo.getYearActivityList(); + if (yearActivitySource == null || yearActivitySource.isEmpty()) { + yearActivitySource = examineVo.getYearActivitys(); + } + examineVo.setYearActivityList(yearActivitySource == null ? new ArrayList<>() + : yearActivitySource.stream() + .map(item -> normalizeActivityItem(item, true)) + .collect(Collectors.toList())); + + List planSource = examineVo.getPlans(); + examineVo.setPlans(planSource == null ? new ArrayList<>() + : planSource.stream() + .map(item -> normalizeActivityItem(item, false)) + .collect(Collectors.toList())); + } + + /** + * 将V3年审记录中的年度减少字段转换为查看页统一使用的V4字段。 + * 历史年审必须展示申请时保存的数据,不能按当前会员状态重新统计。 + * + * @param changeUserNum 年审记录保存的成员变化数据 + * @return 兼容V3、V4字段的成员变化数据 + */ + private List normalizeChangeUserNum(List changeUserNum) { + if (changeUserNum == null || changeUserNum.isEmpty()) { + return new ArrayList<>(); + } + return changeUserNum.stream() + .filter(Objects::nonNull) + .peek(item -> { + if (!item.containsKey("yearReduceNum") && item.containsKey("yearEditNum")) { + item.set("yearReduceNum", item.get("yearEditNum")); + } + }) + .collect(Collectors.toList()); + } + + /** + * 将V3工作总结附件的文件主键包装为V4文件预览组件所需的response.data格式。 + * + * @param summaryFiles 原始工作总结附件 + * @return 可供文件预览组件读取的附件数据 + */ + private List normalizeSummaryFiles(List summaryFiles) { + if (summaryFiles == null || summaryFiles.isEmpty()) { + return new ArrayList<>(); + } + return summaryFiles.stream() + .filter(Objects::nonNull) + .map(file -> { + JSONObject response = file.getJSONObject("response"); + if (response != null && StrUtil.isNotBlank(response.getStr("data"))) { + return file; + } + String fileId = file.getStr("id"); + if (StrUtil.isBlank(fileId)) { + return null; + } + JSONObject normalizedFile = new JSONObject(); + normalizedFile.set("response", new JSONObject().set("data", fileId)); + return normalizedFile; + }) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + } + + /** + * 兼容V3活动字段(hdsj、mc、zbdw、hddd、cjrs、hjqk)和V4活动字段。 + * + * @param source 原始活动或计划数据 + * @param includeResult 是否包含本年度活动的参加人数和获奖情况 + * @return 供查看页使用的统一字段数据 + */ + private JSONObject normalizeActivityItem(JSONObject source, boolean includeResult) { + JSONObject item = new JSONObject(); + item.set("activityName", getActivityValue(source, "activityName", "mc")); + item.set("activityUnit", getActivityValue(source, "activityUnit", "zbdw")); + item.set("activityAddress", getActivityValue(source, "activityAddress", "hddd")); + if (includeResult) { + item.set("activityTime", getActivityValue(source, "activityTime", "hdsj")); + item.set("joinNum", getActivityValue(source, "joinNum", "cjrs")); + item.set("prize", getActivityValue(source, "prize", "hjqk")); + } + return item; + } + + /** + * 优先读取V4字段;历史记录没有该字段时回退读取对应的V3字段。 + * + * @param source 原始JSON数据 + * @param currentField V4字段名 + * @param legacyField V3字段名 + * @return 兼容后的字段值 + */ + private String getActivityValue(JSONObject source, String currentField, String legacyField) { + if (source == null) { + return null; + } + String currentValue = source.getStr(currentField); + return StrUtil.isNotBlank(currentValue) ? currentValue : source.getStr(legacyField); + } + @Override public List getYearActivityExportData(String id) { ClubExamineVo examineVo = this.findOne(id); @@ -591,7 +747,8 @@ public class SysClubExamineServiceImpl extends BaseServiceImpl exitManagePageData(ClubUserPageForm pageForm) { Sql sql = Sqls.create(""" SELECT - COALESCE(info.id, scu.id) AS id, - scu.clubId, - scu.userId, - COALESCE(info.roleCode, scu.roleCode) AS applyRoleCode, - COALESCE(info.clubPosition, scu.position) AS clubPosition, - COALESCE(info.email, scu.email, u.email) AS email, - COALESCE(info.mobile, u.mobile) AS mobile, - COALESCE(info.birthday, u.birthday) AS birthday, - COALESCE(info.avatar, scu.avatar, u.avatar) AS avatar, - COALESCE(info.sameTimeJoinOtherClubSituation, scu.sameTimeJoinOtherClubSituation) AS sameTimeJoinOtherClubSituation, - COALESCE(info.awardsExperience, scu.awardsExperience) AS awardsExperience, - info.signature, - COALESCE( - info.applyDate, - STR_TO_DATE(scu.changeTime, '%Y-%m-%d %H:%i:%s'), - STR_TO_DATE(JSON_UNQUOTE(JSON_EXTRACT(scu.exitAuditList, '$[0].auditTime')), '%Y-%m-%d %H:%i:%s') - ) AS applyDate, + exitInfo.id, + exitInfo.clubId, + exitInfo.userId, + exitInfo.applyRoleCode, + exitInfo.clubPosition, + COALESCE(exitInfo.email, u.email) AS email, + COALESCE(exitInfo.mobile, u.mobile) AS mobile, + COALESCE(exitInfo.birthday, u.birthday) AS birthday, + COALESCE(exitInfo.avatar, u.avatar) AS avatar, + exitInfo.sameTimeJoinOtherClubSituation, + exitInfo.awardsExperience, + exitInfo.signature, + exitInfo.applyDate, u.username AS userName, u.loginname AS loginName, u.sex, @@ -253,32 +249,14 @@ public class SysClubInfoManageServiceImpl extends BaseServiceImpl pagination = listPageVO(pageForm, sql, ClubUserCommonPageVo.class); @@ -307,55 +285,110 @@ public class SysClubInfoManageServiceImpl extends BaseServiceImpl clubManagePersonAuditPageData(ClubUserPageForm pageForm) { Sql sql = Sqls.create(""" diff --git a/src/main/java/com/budwk/app/zhgh/club/vo/ClubEvaluatePageVo.java b/src/main/java/com/budwk/app/zhgh/club/vo/ClubEvaluatePageVo.java index 09654e4c..4bc4206b 100644 --- a/src/main/java/com/budwk/app/zhgh/club/vo/ClubEvaluatePageVo.java +++ b/src/main/java/com/budwk/app/zhgh/club/vo/ClubEvaluatePageVo.java @@ -17,6 +17,10 @@ public class ClubEvaluatePageVo { private String foundTime; private String typeName; private Date applyTime; + /** 社团评优申报开始年度。 */ + private String applyStartYear; + /** 社团评优申报结束年度。 */ + private String applyEndYear; private String instanceId; private String businessNo; diff --git a/src/main/java/com/budwk/app/zhgh/club/vo/ClubExamineVo.java b/src/main/java/com/budwk/app/zhgh/club/vo/ClubExamineVo.java index ec2057b8..16a11dd9 100644 --- a/src/main/java/com/budwk/app/zhgh/club/vo/ClubExamineVo.java +++ b/src/main/java/com/budwk/app/zhgh/club/vo/ClubExamineVo.java @@ -6,6 +6,7 @@ import com.budwk.app.zhgh.club.model.SysClubExamineRegisterDetailed; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; +import org.nutz.lang.util.NutMap; import java.util.List; @@ -18,4 +19,9 @@ public class ClubExamineVo extends SysClubExamineRegister { private String typeName; @ApiModelProperty("节点审批记录") private List nodeTasks; + + /** + * V3年审已迁入但未转换为V4工作流任务的历史审核记录。 + */ + private List legacyAuditRecords; } diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/article/controller/ArticleAnalysisController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/article/controller/ArticleAnalysisController.java index 968fa4c1..621eb158 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/article/controller/ArticleAnalysisController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/article/controller/ArticleAnalysisController.java @@ -11,6 +11,7 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.nutz.dao.Cnd; import org.nutz.dao.Sqls; +import org.nutz.dao.sql.Sql; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.lang.util.NutMap; @@ -43,22 +44,26 @@ public class ArticleAnalysisController { @At @SaCheckPermission("article.analysis") @ApiOperation(value = "统计分析") - public Result overview() { + public Result overview(Date startDate, Date endDate, String unionId, String clubId) { List list = new ArrayList<>(); // 获取总投稿量 list.add(ArticleAnalysisOverviewVO.builder() .label("总投稿量") - .value(articleService.count()) + .value(articleService.count(buildStatisticsCondition(startDate, endDate, unionId, clubId))) .icon("el-icon-document") .bgColor("rgba(24, 103, 176, 0.1)") .trend(null) .build()); // 获取本月投稿量 - long monthlyCount = articleService.count(Cnd.where("MONTH(submitTime)", "=", DateUtil.thisMonth() + 1)); + Cnd monthlyCondition = buildStatisticsCondition(startDate, endDate, unionId, clubId); + monthlyCondition.and("MONTH(submitTime)", "=", DateUtil.thisMonth() + 1); + long monthlyCount = articleService.count(monthlyCondition); //上月投稿量 - long lastMonthCount = articleService.count(Cnd.where("MONTH(submitTime)", "=", DateUtil.offsetMonth(new Date(), -1))); + Cnd lastMonthCondition = buildStatisticsCondition(startDate, endDate, unionId, clubId); + lastMonthCondition.and("MONTH(submitTime)", "=", DateUtil.month(DateUtil.offsetMonth(new Date(), -1)) + 1); + long lastMonthCount = articleService.count(lastMonthCondition); list.add(ArticleAnalysisOverviewVO.builder() .label("本月投稿") @@ -70,7 +75,9 @@ public class ArticleAnalysisController { // 获取活跃投稿人数 DateTime dateTime = DateUtil.offsetMonth(new Date(), -1); - long activeUsers = Math.max(articleService.count(Cnd.where("submitTime", ">=", dateTime).groupBy("userId")), 0L); + Cnd activeUserCondition = buildStatisticsCondition(startDate, endDate, unionId, clubId); + activeUserCondition.and("submitTime", ">=", dateTime).groupBy("userId"); + long activeUsers = Math.max(articleService.count(activeUserCondition), 0L); list.add(ArticleAnalysisOverviewVO.builder() .label("活跃投稿人") .value(activeUsers) @@ -81,7 +88,11 @@ public class ArticleAnalysisController { // 获取参与分工会数量 - long unionCount = articleService.count(Sqls.create("SELECT COUNT(distinct unionId) FROM article WHERE unionId IS NOT NULL")); + Sql unionCountSql = Sqls.create("SELECT COUNT(distinct unionId) FROM article $condition"); + Cnd unionCountCondition = buildStatisticsCondition(startDate, endDate, unionId, clubId); + unionCountCondition.and("unionId", "IS NOT", null); + unionCountSql.setCondition(unionCountCondition); + long unionCount = articleService.count(unionCountSql); list.add(ArticleAnalysisOverviewVO.builder() .label("参与分工会") .value(unionCount) @@ -91,7 +102,11 @@ public class ArticleAnalysisController { .build()); // 获取参与社团数量 - long clubCount = articleService.count(Sqls.create("SELECT COUNT(distinct clubId) FROM article WHERE clubId IS NOT NULL")); + Sql clubCountSql = Sqls.create("SELECT COUNT(distinct clubId) FROM article $condition"); + Cnd clubCountCondition = buildStatisticsCondition(startDate, endDate, unionId, clubId); + clubCountCondition.and("clubId", "IS NOT", null); + clubCountSql.setCondition(clubCountCondition); + long clubCount = articleService.count(clubCountSql); list.add(ArticleAnalysisOverviewVO.builder() .label("参与社团") .value(clubCount) @@ -102,22 +117,43 @@ public class ArticleAnalysisController { return Result.success(list); } + /** + * 构建概览统计的筛选条件,与图表接口保持相同的时间范围、分工会和社团口径。 + */ + private Cnd buildStatisticsCondition(Date startDate, Date endDate, String unionId, String clubId) { + Cnd cnd = Cnd.NEW(); + if (startDate != null && endDate != null) { + cnd.and(Cnd.cri().where().andBetween("submitTime", startDate, endDate)); + } + cnd.andEX("unionId", "=", unionId); + cnd.andEX("clubId", "=", clubId); + return cnd; + } + @At @SaCheckPermission("article.analysis") @ApiOperation(value = "投稿趋势") - public Result trend(@Valid String type, Date startDate, Date endDate) { - List submissionTrend = articleAnalysisService.getSubmissionTrend(type, startDate, endDate); + public Result trend(@Valid String type, Date startDate, Date endDate, String unionId, String clubId) { + List submissionTrend = articleAnalysisService.getSubmissionTrend(type, startDate, endDate, unionId, clubId); return Result.success(submissionTrend); } @At @SaCheckPermission("article.analysis") @ApiOperation(value = "分工会投稿分布") - public Result distribution(Date startDate, Date endDate) { - List unionDistribution = articleAnalysisService.getUnionDistribution(startDate, endDate); + public Result distribution(Date startDate, Date endDate, String unionId, String clubId) { + List unionDistribution = articleAnalysisService.getUnionDistribution(startDate, endDate, unionId, clubId); return Result.success(unionDistribution); } + @At + @SaCheckPermission("article.analysis") + @ApiOperation(value = "社团投稿分布") + public Result clubDistribution(Date startDate, Date endDate, String unionId, String clubId) { + List clubDistribution = articleAnalysisService.getClubDistribution(startDate, endDate, unionId, clubId); + return Result.success(clubDistribution); + } + @At @SaCheckPermission("article.analysis") @ApiOperation(value = "投稿排名") diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/article/controller/ArticleMineController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/article/controller/ArticleMineController.java index 72fa1134..18a76e3d 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/article/controller/ArticleMineController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/article/controller/ArticleMineController.java @@ -52,6 +52,7 @@ public class ArticleMineController { @SaCheckPermission("article.mine") @ApiOperation("分页查询") public Result pageData(@Valid ArticleInfoPageParam pageForm) { + // 每篇投稿仅关联最新的一条待办任务,避免多办理人或并行待办将同一投稿重复展示。 Sql sql = Sqls.create(""" SELECT info.id, @@ -79,8 +80,11 @@ public class ArticleMineController { FROM article info LEFT JOIN `wf_process_instance` ins ON ins.businessNo = info.id - LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10 - LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id + LEFT JOIN wf_process_task t ON t.id = ( + SELECT MAX(currentTask.id) + FROM wf_process_task currentTask + WHERE currentTask.processInstanceId = ins.id AND currentTask.taskState = 10 + ) $condition """); Cnd cnd = Cnd.NEW(); diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/article/controller/ArticleQueryController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/article/controller/ArticleQueryController.java index c191c596..13eac6a0 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/article/controller/ArticleQueryController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/article/controller/ArticleQueryController.java @@ -49,6 +49,7 @@ public class ArticleQueryController { info.loginName, info.unitName, info.unionName, + info.clubName, info.submitTime, info.origin, ins.id AS instanceId, diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/article/service/ArticleAnalysisService.java b/src/main/java/com/budwk/app/zhgh/dayofficework/article/service/ArticleAnalysisService.java index 9dc9ae66..212c9065 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/article/service/ArticleAnalysisService.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/article/service/ArticleAnalysisService.java @@ -13,12 +13,17 @@ public interface ArticleAnalysisService extends BaseService
{ /** * 获取投稿趋势数据 */ - List getSubmissionTrend(String type, Date startDate, Date endDate); + List getSubmissionTrend(String type, Date startDate, Date endDate, String unionId, String clubId); /** * 获取分工会投稿分布 */ - List getUnionDistribution(Date startDate, Date endDate); + List getUnionDistribution(Date startDate, Date endDate, String unionId, String clubId); + + /** + * 获取社团投稿分布 + */ + List getClubDistribution(Date startDate, Date endDate, String unionId, String clubId); /** * 获取排行榜数据 diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/article/service/impl/ArticleAnalysisServiceImpl.java b/src/main/java/com/budwk/app/zhgh/dayofficework/article/service/impl/ArticleAnalysisServiceImpl.java index ed35ad98..d53687e4 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/article/service/impl/ArticleAnalysisServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/article/service/impl/ArticleAnalysisServiceImpl.java @@ -22,7 +22,7 @@ public class ArticleAnalysisServiceImpl extends BaseServiceImpl
impleme } @Override - public List getSubmissionTrend(String type, Date startDate, Date endDate) { + public List getSubmissionTrend(String type, Date startDate, Date endDate, String unionId, String clubId) { String groupFormat = switch (type) { case "week" -> "%Y-%u"; // 按周分组 case "month" -> "%Y-%m"; // 按月分组 @@ -40,10 +40,8 @@ public class ArticleAnalysisServiceImpl extends BaseServiceImpl
impleme """); sql.setParam("groupFormat",groupFormat); - Cnd cnd = Cnd.NEW(); - if(ObjectUtil.isAllNotEmpty(startDate,endDate)){ - cnd.and(Cnd.cri().where().andBetween("submitTime", startDate, endDate)); - } + Cnd cnd = buildStatisticsCondition(startDate, endDate, unionId, clubId); + cnd.groupBy("DATE_FORMAT(submitTime, @groupFormat)"); sql.setCondition(cnd); return listMap(sql); @@ -53,7 +51,7 @@ public class ArticleAnalysisServiceImpl extends BaseServiceImpl
impleme * 获取分工会投稿分布 */ @Override - public List getUnionDistribution(Date startDate, Date endDate) { + public List getUnionDistribution(Date startDate, Date endDate, String unionId, String clubId) { Sql sql = Sqls.create(""" SELECT unionName AS type, @@ -62,10 +60,7 @@ public class ArticleAnalysisServiceImpl extends BaseServiceImpl
impleme article $condition """); - Cnd cnd = Cnd.NEW(); - if(ObjectUtil.isAllNotEmpty(startDate,endDate)){ - cnd.and(Cnd.cri().where().andBetween("submitTime", startDate, endDate)); - } + Cnd cnd = buildStatisticsCondition(startDate, endDate, unionId, clubId); cnd.groupBy("unionId","unionName"); cnd.desc("value"); sql.setCondition(cnd); @@ -73,6 +68,47 @@ public class ArticleAnalysisServiceImpl extends BaseServiceImpl
impleme return listMap(sql); } + /** + * 获取社团投稿分布 + */ + @Override + public List getClubDistribution(Date startDate, Date endDate, String unionId, String clubId) { + Sql sql = Sqls.create(""" + SELECT + clubName AS type, + COUNT(*) AS value + FROM + article + $condition + """); + Cnd cnd = buildStatisticsCondition(startDate, endDate, unionId, clubId); + cnd.and("clubId", "IS NOT", null); + cnd.groupBy("clubId", "clubName"); + cnd.desc("value"); + sql.setCondition(cnd); + + return listMap(sql); + } + + /** + * 为统计图表统一拼接时间范围和分工会筛选条件,保证各图表的查询口径一致。 + * + * @param startDate 查询开始日期,为空时不限制开始时间 + * @param endDate 查询结束日期,为空时不限制结束时间 + * @param unionId 分工会 ID,为空时查询全部分工会 + * @param clubId 社团 ID,为空时查询全部社团 + * @return 可直接设置到统计 SQL 的查询条件 + */ + private Cnd buildStatisticsCondition(Date startDate, Date endDate, String unionId, String clubId) { + Cnd cnd = Cnd.NEW(); + if (ObjectUtil.isAllNotEmpty(startDate, endDate)) { + cnd.and(Cnd.cri().where().andBetween("submitTime", startDate, endDate)); + } + cnd.andEX("unionId", "=", unionId); + cnd.andEX("clubId", "=", clubId); + return cnd; + } + /** * 获取排行榜数据 */ diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/asset/controller/AssetManageController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/asset/controller/AssetManageController.java index e2df45e8..6aa6a0c9 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/asset/controller/AssetManageController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/asset/controller/AssetManageController.java @@ -5,12 +5,15 @@ import cn.afterturn.easypoi.excel.entity.ExportParams; import cn.afterturn.easypoi.excel.entity.enmus.ExcelType; import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaMode; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.budwk.app.base.annotation.SLog; +import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.page.Pagination; import com.budwk.app.base.result.Result; import com.budwk.app.base.utils.CommonDownloadUtil; +import com.budwk.app.web.commons.auth.utils.AuthUtil; import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.zhgh.dayofficework.asset.model.Asset; import com.budwk.app.zhgh.dayofficework.asset.model.AssetDepreciationRecord; @@ -26,6 +29,7 @@ import org.nutz.aop.interceptor.ioc.TransAop; import org.nutz.dao.Cnd; import org.nutz.dao.Sqls; import org.nutz.dao.sql.Sql; +import org.nutz.dao.util.cri.SqlExpressionGroup; import org.nutz.ioc.aop.Aop; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; @@ -153,12 +157,19 @@ public class AssetManageController { @At @ApiOperation("查询责任人") - @SaCheckPermission("asset.manage") + @SaCheckPermission(value = {"asset.manage", "asset.stocktaking", "h5.asset.stocktaking"}, mode = SaMode.OR) public Result searchAssetUseUser(String query) { Cnd cnd = Cnd.NEW(); - cnd.where().orLike("username", query); - cnd.where().orLike("loginname", query); - cnd.where().orLike("id", query); + // 三个关键词条件必须整体分组,避免 OR 条件绕过分工会数据范围。 + SqlExpressionGroup searchGroup = new SqlExpressionGroup(); + searchGroup.orLike("username", query); + searchGroup.orLike("loginname", query); + searchGroup.orLike("id", query); + cnd.and(searchGroup); + // 分工会侧盘点人员只能选择本分工会成员,校工会和系统管理员保留全校查询范围。 + if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) { + cnd.and("unionId", "=", SecurityUtil.getUnionId()); + } Sql sql = Sqls.create(""" SELECT id, diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/birthdayWishes/task/BirthdayWishesTask.java b/src/main/java/com/budwk/app/zhgh/dayofficework/birthdayWishes/task/BirthdayWishesTask.java index cb6d2612..d6d68712 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/birthdayWishes/task/BirthdayWishesTask.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/birthdayWishes/task/BirthdayWishesTask.java @@ -1,12 +1,8 @@ package com.budwk.app.zhgh.dayofficework.birthdayWishes.task; import cn.hutool.core.date.DateUtil; -import com.budwk.app.sys.models.Sys_msg; -import com.budwk.app.sys.services.SysMsgService; +import com.budwk.app.zhgh.staffmanage.birthday.service.UserBirthdayService; import lombok.extern.slf4j.Slf4j; -import org.nutz.dao.Dao; -import org.nutz.dao.Sqls; -import org.nutz.dao.sql.Sql; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.json.Json; @@ -15,16 +11,12 @@ import org.quartz.JobDataMap; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; -import java.util.List; - @IocBean @Slf4j public class BirthdayWishesTask implements Job { @Inject - protected SysMsgService sysMsgService; - @Inject - protected Dao dao; + private UserBirthdayService userBirthdayService; @Override @@ -34,28 +26,12 @@ public class BirthdayWishesTask implements Job { log.info("=================================参数:{}", Json.toJson(dataMap)); String planName = dataMap.getString("name"); - String today = DateUtil.today(); + String title = planName + today; + String content = dataMap.getString("template"); - Sys_msg msg = new Sys_msg(); - msg.setTitle(planName + today); - msg.setType("user"); - msg.setSendType("show"); - msg.setSendAt(DateUtil.current()); - msg.setNote(dataMap.getString("template")); - - // 查询今天生日的会员用户 - Sql sql = Sqls.create("SELECT loginname FROM sys_user WHERE member = 1 AND MONTH(birthday) = MONTH(CURRENT_DATE) AND DAY(birthday) = DAY(CURRENT_DATE)"); - sql.setCallback(Sqls.callback.strList()); - dao.execute(sql); - List users = sql.getList(String.class); - // 转为数组 - String[] userArray = users.toArray(String[]::new); - log.info("=================================查询今天生日会员用户:{}", users); - - if(userArray.length > 0){ - log.info("=================================发送消息:{}", msg); - sysMsgService.saveMsg(msg, userArray, true); - } + // 统一由生日服务查询当天生日会员、生成移动端链接并记录系统推送日志。 + int receiverCount = userBirthdayService.sendTodayBirthdayMessages(title, content); + log.info("=================================当天生日通知进入发送队列人数:{}", receiverCount); } } diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/config/BuildHomeKpiWriteDynamicTableRenderPolicy.java b/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/config/BuildHomeKpiWriteDynamicTableRenderPolicy.java index 1aed9624..af3d48d3 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/config/BuildHomeKpiWriteDynamicTableRenderPolicy.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/config/BuildHomeKpiWriteDynamicTableRenderPolicy.java @@ -58,6 +58,10 @@ public class BuildHomeKpiWriteDynamicTableRenderPolicy extends DynamicTableRende // 处理合并 if(ObjectUtil.isNotEmpty(dataList)){ for (int[] value : groupRanges.values()) { + // 单条明细无需合并;POI 不支持对同一行进行纵向合并。 + if (value[0] == value[1]) { + continue; + } TableTools.mergeCellsVertically(xwpfTable, 0, value[0] + 1, value[1] + 1); TableTools.mergeCellsVertically(xwpfTable, 1, value[0] + 1, value[1] + 1); TableTools.mergeCellsVertically(xwpfTable, 4, value[0] + 1, value[1] + 1); diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/controller/BuildHomeKpiWriteController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/controller/BuildHomeKpiWriteController.java index 7e34fc55..42e19c6e 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/controller/BuildHomeKpiWriteController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/controller/BuildHomeKpiWriteController.java @@ -94,7 +94,7 @@ public class BuildHomeKpiWriteController { buildHomeKpiWriteService.exportDocx(id, os); // 下载生成的文件 CommonDownloadUtil.download( - "南京邮电大学分工会教职工之家建设考核评议自评表.docx", + "中国地质大学分工会教职工之家建设考核评议自评表.docx", os.toByteArray(), response ); diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/controller/BuildHomeLogBookController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/controller/BuildHomeLogBookController.java index a9481d42..b268c108 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/controller/BuildHomeLogBookController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/controller/BuildHomeLogBookController.java @@ -136,7 +136,7 @@ public class BuildHomeLogBookController { template.render(map).writeAndClose(os); // 下载生成的文件 CommonDownloadUtil.download( - "南京邮电大学分工会建家记录册.docx", + "中国地质大学分工会建家记录册.docx", os.toByteArray(), response ); diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/controller/BuildHomeMaterialQueryController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/controller/BuildHomeMaterialQueryController.java index 3fdb3972..a2efd303 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/controller/BuildHomeMaterialQueryController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/controller/BuildHomeMaterialQueryController.java @@ -2,6 +2,7 @@ package com.budwk.app.zhgh.dayofficework.buildHome.controller; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.URLUtil; import com.budwk.app.base.page.Pagination; import com.budwk.app.base.param.PageForm; import com.budwk.app.base.result.Result; @@ -104,8 +105,13 @@ public class BuildHomeMaterialQueryController { } @At + @Ok("void") @SaCheckPermission("buildHome.material.query") public void exportZip(String actId, HttpServletResponse response) throws IOException { + BuildHomeAct act = buildHomeActService.fetch(actId); + if (act == null) { + throw new IllegalArgumentException("未找到评比事项"); + } Sql sql = Sqls.create(""" SELECT t1.id, @@ -123,7 +129,6 @@ public class BuildHomeMaterialQueryController { AND t2.actId = @actId LEFT JOIN build_home_act t3 ON t3.id = t2.actId AND t3.id = @actId - WHERE t1.id = '3742a919fb6847f7a8dbe051a2ef0025' GROUP BY t1.id, t2.unionId @@ -135,7 +140,9 @@ public class BuildHomeMaterialQueryController { // 2. 设置响应头 response.setContentType("application/zip"); - response.setHeader("Content-Disposition", "attachment; filename=\"工会文件汇总.zip\""); + // 使用评比事项名称作为压缩包名称,避免下载文件无法区分来源。 + String zipFileName = sanitizeFileName(act.getName()) + "汇总材料.zip"; + response.setHeader("Content-Disposition", "attachment; filename=" + URLUtil.encode(zipFileName)); // 3. 使用try-with-resources创建ZIP输出流 try (ZipOutputStream zos = new ZipOutputStream(response.getOutputStream())) { @@ -164,6 +171,18 @@ public class BuildHomeMaterialQueryController { } + /** + * 清理评比事项名称中的 Windows 文件名非法字符,确保浏览器可正常保存压缩包。 + * + * @param fileName 原始评比事项名称 + * @return 可用于下载文件名的评比事项名称 + */ + private String sanitizeFileName(String fileName) { + String sanitizedFileName = StrUtil.blankToDefault(fileName, "评比事项"); + return sanitizedFileName.replaceAll("[\\\\/:*?\"<>|]", "_"); + } + + private void processFileList(ZipOutputStream zos, String unionName, String fileType, String filesJson) throws IOException { if (StrUtil.isNotBlank(filesJson)) { List files = Json.fromJsonAsList(NutMap.class, filesJson); diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/cadreTraining/controller/CadreTrainingMineController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/cadreTraining/controller/CadreTrainingMineController.java index 273f1e66..9f52aa23 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/cadreTraining/controller/CadreTrainingMineController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/cadreTraining/controller/CadreTrainingMineController.java @@ -4,12 +4,15 @@ import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaMode; import cn.hutool.core.util.StrUtil; import com.budwk.app.base.annotation.SLog; +import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.page.Pagination; import com.budwk.app.base.param.PageForm; import com.budwk.app.base.result.Result; import com.budwk.app.flow.engine.FlowEngine; +import com.budwk.app.web.commons.auth.utils.AuthUtil; import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.zhgh.dayofficework.cadreTraining.model.CadreTrainingAct; +import com.budwk.app.zhgh.dayofficework.cadreTraining.model.CadreTrainingSignUp; import com.budwk.app.zhgh.dayofficework.cadreTraining.service.CadreTrainingActService; import com.budwk.app.zhgh.dayofficework.cadreTraining.service.CadreTrainingSignUpService; import io.swagger.annotations.Api; @@ -29,6 +32,7 @@ import org.nutz.mvc.annotation.Ok; import org.nutz.mvc.annotation.Param; import javax.validation.Valid; +import java.util.List; /** * @author : hongqiwei @@ -106,12 +110,41 @@ public class CadreTrainingMineController { cnd.where().andLike(CadreTrainingAct::getName, pageForm.getSearchKeyword()); } cnd.desc("info.applyTime"); - cnd.and("info.userId", "=", SecurityUtil.getUserId()); + // 本人报名和本人代他人报名的记录都应在“我的报名”中展示。 + cnd.and(Cnd.exps("info.userId", "=", SecurityUtil.getUserId()) + .or("info.applyUserId", "=", SecurityUtil.getUserId())); sql.setCondition(cnd); Pagination pagination = cadreTrainingSignUpService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); return Result.success(pagination); } + /** + * 查询“我的报名”查看页的报名人员。 + * 管理角色按活动和分工会查看全部报名人员;普通用户仅返回本人记录,避免扩大人员信息可见范围。 + * + * @param activityId 培训活动 ID,对应 cadre_training 表主键 + * @param unionId 当前查看报名记录所属的分工会 ID + * @return 报名记录列表,元素包含人员姓名、工号、单位、分工会、联系方式及备注 + */ + @At + @ApiOperation("查询我的报名活动人员") + @SaCheckPermission(value = {"cadreTraining.mine", "h5.cadreTraining.mine"}, mode = SaMode.OR) + public Result listSignUsers(@Valid String activityId, String unionId) { + Cnd cnd = Cnd.where(CadreTrainingSignUp::getCadreTrainingActId, "=", activityId); + if (AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name(), RoleConstant.BRANCH_UNION_CHAIRMAN.name())) { + // 管理角色必须携带当前报名记录所属的分工会,防止空参数绕过分工会范围。 + if (StrUtil.isBlank(unionId)) { + return Result.error("分工会信息不能为空"); + } + cnd.and(CadreTrainingSignUp::getUnionId, "=", unionId); + } else { + cnd.and(CadreTrainingSignUp::getUserId, "=", SecurityUtil.getUserId()); + } + cnd.asc(CadreTrainingSignUp::getApplyTime); + List signUsers = dao.query(CadreTrainingSignUp.class, cnd); + return Result.success(signUsers); + } + @At @ApiOperation("删除") @Aop(TransAop.READ_COMMITTED) diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/cadreTraining/controller/CadreTrainingSignUpController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/cadreTraining/controller/CadreTrainingSignUpController.java index 7ae9d864..2d3146f4 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/cadreTraining/controller/CadreTrainingSignUpController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/cadreTraining/controller/CadreTrainingSignUpController.java @@ -67,8 +67,9 @@ public class CadreTrainingSignUpController { @SaCheckPermission("cadreTraining.branchUnionSignUp") @ApiOperation("分页查询") public Result pageData(@Valid PageForm pageForm,Integer year, boolean isEnrolled) { + // 同一活动存在多条代报名记录时,活动列表仅展示一次。 Sql sql = Sqls.create(""" - SELECT + SELECT DISTINCT info.*, CASE WHEN cts.id IS NOT NULL THEN 1 ELSE 0 END AS isEnrolled FROM @@ -101,6 +102,9 @@ public class CadreTrainingSignUpController { List instances = new ArrayList<>(); for (CadreTrainingSignUp signUp : cadreTrainingSignUps) { + // 代报名记录必须以当前登录人为报名操作人,供“已报名”和“我的报名”按操作人查询。 + signUp.setApplyUserId(SecurityUtil.getUserId()); + signUp.setApplyUserUserName(SecurityUtil.getUserUsername()); if (StrUtil.isBlank(signUp.getId())) { signUp.setApplyTime(new Date()); } diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/enrollmentRegistration/controller/EnrollmentRegistrationApplyListController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/enrollmentRegistration/controller/EnrollmentRegistrationApplyListController.java index 58612fcc..827ffb36 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/enrollmentRegistration/controller/EnrollmentRegistrationApplyListController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/enrollmentRegistration/controller/EnrollmentRegistrationApplyListController.java @@ -84,6 +84,8 @@ public class EnrollmentRegistrationApplyListController { Cnd cnd = Cnd.NEW(); cnd.andEX("YEAR(info.applyTime)", "=", year); cnd.and("info.userId", "=", SecurityUtil.getUserId()); + // 同一登记可能关联多个流程任务参与人,按业务主表ID分组后仅展示一条申请记录。 + cnd.groupBy("info.id"); sql.setCondition(cnd); Pagination pagination = baseService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); return Result.success(pagination); diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/controller/EvaluateActivityController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/controller/EvaluateActivityController.java index deb8a0ee..4b322b6e 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/controller/EvaluateActivityController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/controller/EvaluateActivityController.java @@ -74,6 +74,7 @@ public class EvaluateActivityController { Cnd cnd = Cnd.NEW(); cnd.andEX("year", "=", year); cnd.and(Cnd.likeEX("eva.name", searchKeyword)); + cnd.groupBy("eva.id"); sql.setCondition(cnd); return Result.success(baseService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql)); } diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/controller/EvaluateApplyController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/controller/EvaluateApplyController.java index 4321534f..0be00358 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/controller/EvaluateApplyController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/controller/EvaluateApplyController.java @@ -83,6 +83,7 @@ public class EvaluateApplyController { Cnd cnd = Cnd.NEW(); cnd.and("enable", "=", 1); cnd.andEX("year", "=", year); + cnd.groupBy("eva.id"); sql.setCondition(cnd); Pagination pagination = evaluateActivityService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); return Result.success(pagination); @@ -108,6 +109,10 @@ public class EvaluateApplyController { @ApiOperation("保存") @SLog(tag = "评优评先申请", msg = "保存申请") public Result save(@Param("data") EvaluateApply evaluateApply) { + String validateMessage = evaluateService.validateCollectiveHonorApply(evaluateApply); + if (validateMessage != null) { + return Result.error(validateMessage); + } evaluateApply.setApplyDateTime(new Date()); evaluateService.insertOrUpdate(evaluateApply); return Result.success(); @@ -119,6 +124,10 @@ public class EvaluateApplyController { @Aop(TransAop.READ_COMMITTED) @SLog( tag = "评优评先申请", msg = "重新提交申请") public Result submitAgain(@Param("data") EvaluateApply evaluateApply, @Param("taskId") Long taskId) { + String validateMessage = evaluateService.validateCollectiveHonorApply(evaluateApply); + if (validateMessage != null) { + return Result.error(validateMessage); + } evaluateService.insertOrUpdate(evaluateApply); Dict dict = Dict.create(); @@ -134,6 +143,10 @@ public class EvaluateApplyController { @Aop(TransAop.READ_COMMITTED) @SLog(tag = "评优评先申请", msg = "提交申请") public Result submit(@Param("data") EvaluateApply evaluateApply) { + String validateMessage = evaluateService.validateCollectiveHonorApply(evaluateApply); + if (validateMessage != null) { + return Result.error(validateMessage); + } evaluateApply.setApplyDateTime(new Date()); evaluateService.insertOrUpdate(evaluateApply); diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/controller/EvaluateMineController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/controller/EvaluateMineController.java index 2550ee8b..f640fbd4 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/controller/EvaluateMineController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/controller/EvaluateMineController.java @@ -80,6 +80,7 @@ public class EvaluateMineController { Cnd cnd = Cnd.NEW(); cnd.andEX("YEAR(info.year)", "=", year); cnd.and("info.loginName", "=", SecurityUtil.getUserLoginname()); + cnd.groupBy("info.id"); cnd.desc("info.createdAt"); sql.setCondition(cnd); Pagination pagination = evaluateService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/service/EvaluateService.java b/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/service/EvaluateService.java index 4f4a6336..026909fb 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/service/EvaluateService.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/service/EvaluateService.java @@ -10,4 +10,12 @@ public interface EvaluateService extends BaseService { Sql getSummarySql(EvaluatePageForm pageForm); + + /** + * 校验集体荣誉是否已由当前分工会申请。 + * + * @param evaluateApply 待保存或提交的申请 + * @return 校验通过返回 {@code null};重复申请时返回提示信息 + */ + String validateCollectiveHonorApply(EvaluateApply evaluateApply); } diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/service/impl/EvaluateServiceImpl.java b/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/service/impl/EvaluateServiceImpl.java index 87b4611a..59fcc01a 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/service/impl/EvaluateServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/service/impl/EvaluateServiceImpl.java @@ -4,9 +4,12 @@ import cn.hutool.core.util.StrUtil; import com.budwk.app.base.service.impl.BaseServiceImpl; import com.budwk.app.base.utils.PageUtil; import com.budwk.app.flow.enums.ProcessTaskStateEnum; +import com.budwk.app.web.commons.auth.utils.SecurityUtil; +import com.budwk.app.zhgh.dayofficework.evaluation.models.EvaluateActivity; import com.budwk.app.zhgh.dayofficework.evaluation.models.EvaluateApply; import com.budwk.app.zhgh.dayofficework.evaluation.service.EvaluateService; import com.budwk.app.zhgh.dayofficework.evaluation.vo.EvaluatePageForm; +import com.budwk.app.zhgh.dayofficework.honor.models.HonorBasicSettings; import org.nutz.dao.Cnd; import org.nutz.dao.Dao; import org.nutz.dao.Sqls; @@ -67,6 +70,7 @@ public class EvaluateServiceImpl extends BaseServiceImpl implemen seg.orLike("info.loginName", pageForm.getSearchKeyword()); cnd.and(seg); } + cnd.groupBy("info.id"); if (StrUtil.isAllBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) { cnd.desc("t.createdAt").desc("info.applyDateTime"); } else { @@ -76,4 +80,30 @@ public class EvaluateServiceImpl extends BaseServiceImpl implemen sql.setCondition(cnd); return sql; } + + @Override + public String validateCollectiveHonorApply(EvaluateApply evaluateApply) { + if (evaluateApply == null || StrUtil.isBlank(evaluateApply.getEvaluateId())) { + return "评优评先活动不能为空"; + } + EvaluateActivity activity = dao().fetch(EvaluateActivity.class, evaluateApply.getEvaluateId()); + if (activity == null) { + return "评优评先活动不存在"; + } + HonorBasicSettings honorType = dao().fetch(HonorBasicSettings.class, activity.getHonorTypeId()); + if (honorType == null || !StrUtil.equals("集体荣誉", honorType.getName())) { + return null; + } + + Cnd cnd = Cnd.where(EvaluateApply::getUnionId, "=", SecurityUtil.getUnionId()) + .and(EvaluateApply::getHonorId, "=", activity.getHonorId()) + .and("YEAR(applyDateTime)", "=", activity.getYear()); + if (StrUtil.isNotBlank(evaluateApply.getId())) { + cnd.and(EvaluateApply::getId, "!=", evaluateApply.getId()); + } + if (dao().count(EvaluateApply.class, cnd) > 0) { + return "本分工会已申请该集体荣誉,同一类型只能申请一次"; + } + return null; + } } diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/ghkh/controller/GhkhKhphController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/ghkh/controller/GhkhKhphController.java index ba4349ff..b10e37e2 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/ghkh/controller/GhkhKhphController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/ghkh/controller/GhkhKhphController.java @@ -141,7 +141,7 @@ public class GhkhKhphController { List exportEntities = new ArrayList<>(); exportEntities.add(new ExcelExportEntity("序号", "index", 10)); exportEntities.add(new ExcelExportEntity("年度", "annual", 10)); - exportEntities.add(new ExcelExportEntity("分工会名称", "unionName", 30)); + exportEntities.add(new ExcelExportEntity("分工会名称", "unionname", 30)); exportEntities.add(new ExcelExportEntity("线上得分", "xgh_score", 20)); exportEntities.add(new ExcelExportEntity("线上最终得分" + (config.getOnLine() != null ? "(" + config.getOnLine() + "%)" : ""), "onLineFinalScore", 20)); exportEntities.add(new ExcelExportEntity("线下得分", "offLineScore", 20)); diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/honor/controller/HonorRegistrationController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/honor/controller/HonorRegistrationController.java index 2e3ddd1d..d438b48f 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/honor/controller/HonorRegistrationController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/honor/controller/HonorRegistrationController.java @@ -3,11 +3,13 @@ package com.budwk.app.zhgh.dayofficework.honor.controller; import cn.dev33.satoken.annotation.SaCheckLogin; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.util.StrUtil; +import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.page.Pagination; import com.budwk.app.base.result.Result; import com.budwk.app.sys.models.Sys_union; import com.budwk.app.sys.services.SysUnionService; import com.budwk.app.sys.services.SysUserService; +import com.budwk.app.web.commons.auth.utils.AuthUtil; import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.zhgh.dayofficework.honor.models.Honor; import com.budwk.app.zhgh.dayofficework.honor.service.HonorCommonService; @@ -90,7 +92,10 @@ public class HonorRegistrationController { seg.orLike("t1.username",keyWord); cnd.and(seg); } - cnd.and("t1.unionId","=", SecurityUtil.getUnionId()); + // 系统管理员可跨分工会查询人员,其他角色仍限定为当前所属分工会。 + if (!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())) { + cnd.and("t1.unionId", "=", SecurityUtil.getUnionId()); + } sql.setCondition(cnd); Pagination pagination = sysUserService.listPageMap(1, 50, sql); return Result.success(pagination.getList()); diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/honor/controller/HonorSummaryController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/honor/controller/HonorSummaryController.java index cf1105cd..fa005714 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/honor/controller/HonorSummaryController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/honor/controller/HonorSummaryController.java @@ -54,8 +54,8 @@ public class HonorSummaryController { @SaCheckPermission("honor.honorLevel.Summary") public Result unionData(HonorPageForm pageForm) { List query = dao.query(HonorBasicSettings.class, Cnd.where("queryTypeCode", "in", List.of(HonorTypeOrigin.HONOR_SINGLE.name(), HonorTypeOrigin.HONOR_LIST.name()))); - String listHonorId = query.stream().filter(v->v.getQueryTypeCode().equals(HonorTypeOrigin.HONOR_LIST.name())).findFirst().orElse(new HonorBasicSettings()).getId(); - String singleHonorId = query.stream().filter(v->v.getQueryTypeCode().equals(HonorTypeOrigin.HONOR_SINGLE.name())).findFirst().orElse(new HonorBasicSettings()).getId(); + String personalHonorId = query.stream().filter(v->v.getQueryTypeCode().equals(HonorTypeOrigin.HONOR_SINGLE.name())).findFirst().orElse(new HonorBasicSettings()).getId(); + String collectiveHonorId = query.stream().filter(v->v.getQueryTypeCode().equals(HonorTypeOrigin.HONOR_LIST.name())).findFirst().orElse(new HonorBasicSettings()).getId(); Cnd cnd = Cnd.NEW(); Sql sql = Sqls.create(""" SELECT @@ -65,7 +65,7 @@ public class HonorSummaryController { ( SELECT COUNT( 1 ) FROM honor h WHERE h.honorType = @collectiveHonor AND h.unionId = un.id $cnd) collectiveHonorNum FROM sys_union un $condition - """).setParam("personalHonor", listHonorId).setParam("collectiveHonor", singleHonorId); + """).setParam("personalHonor", personalHonorId).setParam("collectiveHonor", collectiveHonorId); cnd.andEX("id", "=", pageForm.getUnionId()); if (pageForm.getYear() != null) { sql.setVar("cnd", "and YEAR(grantDate)=" + pageForm.getYear()); @@ -79,21 +79,27 @@ public class HonorSummaryController { @At @SaCheckPermission("honor.honorLevel.Summary") public Result honorLevelData(HonorPageForm pageForm) { - - List query = dao.query(HonorBasicSettings.class, Cnd.where("queryTypeCode", "in", - List.of(HonorTypeOrigin.HONOR_SCHOOL_LEVEL.name(), HonorTypeOrigin.HONOR_PROVINCIAL_LEVEL.name(), HonorTypeOrigin.HONOR_NATIONAL_LEVEL.name()))); - String schoolHonorId = query.stream().filter(v->v.getQueryTypeCode().equals(HonorTypeOrigin.HONOR_SCHOOL_LEVEL.name())).findFirst().orElse(new HonorBasicSettings()).getId(); - String provincialHonorId = query.stream().filter(v->v.getQueryTypeCode().equals(HonorTypeOrigin.HONOR_PROVINCIAL_LEVEL.name())).findFirst().orElse(new HonorBasicSettings()).getId(); - String nationalHonorId = query.stream().filter(v->v.getQueryTypeCode().equals(HonorTypeOrigin.HONOR_NATIONAL_LEVEL.name())).findFirst().orElse(new HonorBasicSettings()).getId(); + HonorBasicSettings levelRoot = dao.fetch(HonorBasicSettings.class, + Cnd.where("queryTypeCode", "=", HonorTypeOrigin.HONOR_LEVEL.name())); + List levelList = levelRoot == null ? List.of() : dao.query(HonorBasicSettings.class, + Cnd.where("parentId", "=", levelRoot.getId())); + String schoolHonorId = levelList.stream().filter(item -> "校内".equals(item.getName())) + .findFirst().orElse(new HonorBasicSettings()).getId(); + String provincialHonorId = levelList.stream().filter(item -> "省部级".equals(item.getName())) + .findFirst().orElse(new HonorBasicSettings()).getId(); + String nationalHonorId = levelList.stream().filter(item -> "国家级".equals(item.getName())) + .findFirst().orElse(new HonorBasicSettings()).getId(); Cnd cnd = Cnd.NEW(); + // honor.honorLevel 直接保存荣誉等级项 ID,按“荣誉等级”下的具体等级项统计。 + // 历史荣誉记录可能未保存 unionId,统计时仅在 unionId 为空时按 unionName 回退关联。 Sql sql = Sqls.create(""" SELECT id, name as unionname, - ( SELECT COUNT( 1 ) FROM honor h WHERE h.honorLevel = @nationalLevel AND h.unionId = un.id $cnd) nationalLevelNum, - ( SELECT COUNT( 1 ) FROM honor h WHERE h.honorLevel = @provincial AND h.unionId = un.id $cnd) provincialNum , - ( SELECT COUNT( 1 ) FROM honor h WHERE h.honorLevel = @schoolLevel AND h.unionId = un.id $cnd) schoolLevelNum + ( SELECT COUNT( 1 ) FROM honor h WHERE h.honorLevel = @nationalLevel AND (h.unionId = un.id OR ((h.unionId IS NULL OR h.unionId = '') AND h.unionName = un.name)) $cnd) nationalLevelNum, + ( SELECT COUNT( 1 ) FROM honor h WHERE h.honorLevel = @provincial AND (h.unionId = un.id OR ((h.unionId IS NULL OR h.unionId = '') AND h.unionName = un.name)) $cnd) provincialNum , + ( SELECT COUNT( 1 ) FROM honor h WHERE h.honorLevel = @schoolLevel AND (h.unionId = un.id OR ((h.unionId IS NULL OR h.unionId = '') AND h.unionName = un.name)) $cnd) schoolLevelNum FROM sys_union un $condition """).setParam("nationalLevel", nationalHonorId).setParam("provincial", provincialHonorId).setParam("schoolLevel", schoolHonorId); diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/meeting/controller/MeetingManageController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/meeting/controller/MeetingManageController.java index 164d499c..d76f0c6f 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/meeting/controller/MeetingManageController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/meeting/controller/MeetingManageController.java @@ -3,11 +3,14 @@ package com.budwk.app.zhgh.dayofficework.meeting.controller; import cn.dev33.satoken.annotation.SaCheckLogin; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.util.StrUtil; +import com.budwk.app.base.annotation.RepeatSubmit; import com.budwk.app.base.annotation.SLog; import com.budwk.app.base.page.Pagination; import com.budwk.app.base.param.PageForm; import com.budwk.app.base.result.Result; import com.budwk.app.base.utils.PageUtil; +import com.budwk.app.sys.models.Sys_module; +import com.budwk.app.sys.models.Sys_role; import com.budwk.app.zhgh.dayofficework.meeting.model.MeetingInfo; import com.budwk.app.zhgh.dayofficework.meeting.model.MeetingTimePeriod; import com.budwk.app.zhgh.dayofficework.meeting.model.MeetingTimePeriodUser; @@ -101,6 +104,7 @@ public class MeetingManageController { @At @ApiOperation("新增/修改会议") @Aop(TransAop.READ_COMMITTED) + @RepeatSubmit @SaCheckPermission("meeting.manage") @SLog(tag = "会议管理系统-会议管理", msg = "新增/修改会议") public Object submit(@Param("data") MeetingInfo info, @@ -159,13 +163,17 @@ public class MeetingManageController { cnd.andEX("u.unitId", "=", unitId); cnd.and(Cnd.likeEX("u.sex", sex)); if (StrUtil.isNotBlank(roleId)) { - cnd.and(new Static("u.id in (select userId from sys_user_role where roleId = '%s')".formatted(roleId))); + cnd.and(new Static("u.id in (select userId from sys_user_role where roleId = '%s' and enable='1')".formatted(roleId))); + } + // 选择届次但未选择角色时,按届次筛选全部相关人员;同时选择角色时限定为同一角色关联记录。 + if (StrUtil.isBlank(roleId) && StrUtil.isNotBlank(teacherCongressSessionId)) { + cnd.and(new Static("u.id in (select userId from sys_user_role where enable='1' and tcSessionId = '%s')".formatted(teacherCongressSessionId))); } if (StrUtil.isNotBlank(roleId) && StrUtil.isNotBlank(teacherCongressSessionId)) { - cnd.and(new Static("u.id in (select userId from sys_user_role where roleId = '%s' and tcSessionId = '%s')".formatted(roleId, teacherCongressSessionId))); + cnd.and(new Static("u.id in (select userId from sys_user_role where roleId = '%s' and enable='1' and tcSessionId = '%s')".formatted(roleId, teacherCongressSessionId))); } if (StrUtil.isNotBlank(roleId) && StrUtil.isNotBlank(workerCongressSessionId)) { - cnd.and(new Static("u.id in (select userId from sys_user_role where roleId = '%s' and wcSessionId = '%s')".formatted(roleId, workerCongressSessionId))); + cnd.and(new Static("u.id in (select userId from sys_user_role where roleId = '%s' and enable='1' and wcSessionId = '%s')".formatted(roleId, workerCongressSessionId))); } if (Strings.isNotBlank(pageForm.getSearchName()) && Strings.isNotBlank(pageForm.getSearchKeyword())) { cnd.and(pageForm.getSearchName(), "like", "%" + pageForm.getSearchKeyword() + "%"); @@ -225,4 +233,40 @@ public class MeetingManageController { List list = dao.query(Worker_congress_session.class, Cnd.where(Teacher_congress_session::getEnable, "=", true).desc("year")); return Result.success(list); } + + /** + * 查询会议选择用户时可筛选的 PC 端模块。 + * + * @return 模块列表,元素包含模块 ID、名称和平台,按排序编号升序返回 + */ + @At + @ApiOperation("查询 PC 端模块") + @SaCheckPermission("meeting.manage") + public Result listModule() { + List modules = dao.query(Sys_module.class, + Cnd.where(Sys_module::getPlatform, "=", "PC").asc(Sys_module::getSortNum)); + return Result.success(modules); + } + + /** + * 按模块查询会议选择用户时可筛选的启用角色。 + * + * @param moduleId PC 端模块 ID,来源于 sys_module 表 + * @return 角色列表,元素包含角色 ID、名称和角色标识,未传模块时返回空列表 + */ + @At + @ApiOperation("按模块查询角色") + @SaCheckPermission("meeting.manage") + public Result listRole(String moduleId) { + if (StrUtil.isBlank(moduleId)) { + return Result.success(List.of()); + } + Sys_module module = dao.fetch(Sys_module.class, moduleId); + if (module == null || !"PC".equals(module.getPlatform())) { + return Result.success(List.of()); + } + List roles = dao.query(Sys_role.class, + Cnd.where(Sys_role::getModuleId, "=", moduleId).and(Sys_role::isDisabled, "=", false).asc(Sys_role::getSort)); + return Result.success(roles); + } } diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/meeting/controller/MeetingMineController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/meeting/controller/MeetingMineController.java index 5d339830..400906c7 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/meeting/controller/MeetingMineController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/meeting/controller/MeetingMineController.java @@ -93,6 +93,10 @@ public class MeetingMineController { List periodUsers = dao.query(MeetingTimePeriodUser.class, Cnd.where(MeetingTimePeriodUser::getUserId, "=", SecurityUtil.getUserId())); List idList = periodUsers.stream().map(MeetingTimePeriodUser::getMeetingId).toList(); + // 当前用户未被安排参会时,直接返回空分页,避免生成空 IN 条件导致数据库语法错误。 + if (idList.isEmpty()) { + return Result.success(new Pagination<>(pageForm.getPageNumber(), pageForm.getPageSize(), 0, List.of())); + } cnd.and("id", "in", idList); cnd.andEX("typeId", "=", type); @@ -217,6 +221,14 @@ public class MeetingMineController { @Aop(TransAop.READ_COMMITTED) @SLog(tag = "会务管理-我的会议-签到", msg = "会议签到") public Result sign(@Valid String periodId) { + MeetingTimePeriod timePeriod = dao.fetch(MeetingTimePeriod.class, periodId); + if (timePeriod == null) { + return Result.error("会议场次不存在!"); + } + // 以服务端时间校验场次开始时间,避免客户端时间或页面状态被绕过。 + if (timePeriod.getStartTime() == null || DateUtil.date().before(timePeriod.getStartTime())) { + return Result.error("会议尚未开始,暂不能签到!"); + } MeetingTimePeriodUser user = dao.fetch( MeetingTimePeriodUser.class, Cnd.where(MeetingTimePeriodUser::getTimePeriodId, "=", periodId) diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/meeting/controller/MeetingOnlineController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/meeting/controller/MeetingOnlineController.java index 13c2f331..207f9301 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/meeting/controller/MeetingOnlineController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/meeting/controller/MeetingOnlineController.java @@ -115,8 +115,10 @@ public class MeetingOnlineController { @At("/getRealTimeData/?") @Ok("json:full") @SaCheckLogin - public Result getRealTimeData(String timePeriodId) { - List signInUser = onlineService.getSignInUser(timePeriodId); + public Result getRealTimeData(String timePeriodId, + @Param(value = "signRankOrder") String signRankOrder) { + // 签到人员排序统一交由Service处理,控制器只负责接收前端排序方向并返回实时数据。 + List signInUser = onlineService.getSignInUser(timePeriodId, signRankOrder); List> countData = onlineService.getRealTimeData(timePeriodId); return Result.success(Map.of("countData", countData, "userData", signInUser)); } diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/meeting/service/MeetingOnlineService.java b/src/main/java/com/budwk/app/zhgh/dayofficework/meeting/service/MeetingOnlineService.java index f4da1c87..5f3cbf22 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/meeting/service/MeetingOnlineService.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/meeting/service/MeetingOnlineService.java @@ -18,6 +18,15 @@ import java.util.Map; public interface MeetingOnlineService extends BaseService { List exportSignature(String timePeriodId); - List getSignInUser(String timePeriodId); + + /** + * 查询指定会议时段的签到人员,并根据签到名次要求排序。 + * + * @param timePeriodId 会议时段ID + * @param signRankOrder 签到名次排序方向,ascending为升序,其他值按降序处理 + * @return 已签到人员列表 + */ + List getSignInUser(String timePeriodId, String signRankOrder); + List> getRealTimeData(String timePeriodId); } diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/meeting/service/impl/MeetingInfoServiceImpl.java b/src/main/java/com/budwk/app/zhgh/dayofficework/meeting/service/impl/MeetingInfoServiceImpl.java index e30b1b52..1711d8c7 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/meeting/service/impl/MeetingInfoServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/meeting/service/impl/MeetingInfoServiceImpl.java @@ -19,6 +19,7 @@ import org.nutz.lang.Lang; import java.util.ArrayList; import java.util.Arrays; +import java.util.LinkedHashMap; import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -44,11 +45,12 @@ public class MeetingInfoServiceImpl extends BaseServiceImpl impleme // 插入会议表和会议场次表 info.setCreateTime(DateUtil.now()); insertWith(info, "timePeriods"); + List uniqueUsers = distinctUsers(users); // 插入参与人员表 - if (Lang.isNotEmpty(info.getTimePeriods()) && Lang.isNotEmpty(users)) { + if (Lang.isNotEmpty(info.getTimePeriods()) && Lang.isNotEmpty(uniqueUsers)) { List relations = info.getTimePeriods() .stream() - .flatMap(period -> Arrays.stream(users).map(user -> buildRelation(info.getId(), period.getId(), user))) + .flatMap(period -> uniqueUsers.stream().map(user -> buildRelation(info.getId(), period.getId(), user))) .toList(); dao().insert(relations); } @@ -58,6 +60,7 @@ public class MeetingInfoServiceImpl extends BaseServiceImpl impleme @Aop(TransAop.READ_COMMITTED) public void edit(MeetingInfo info, MeetingTimePeriodUser[] users) { String meetingId = info.getId(); + List uniqueUsers = distinctUsers(users); // 设置外键并保存场次(含新增和修改) info.getTimePeriods().forEach(p -> p.setMeetingId(meetingId)); @@ -79,7 +82,7 @@ public class MeetingInfoServiceImpl extends BaseServiceImpl impleme .collect(Collectors.toSet()); // 页面传过来的新人员 - Set newUserIds = Arrays.stream(users).map(MeetingTimePeriodUser::getUserId).collect(Collectors.toSet()); + Set newUserIds = uniqueUsers.stream().map(MeetingTimePeriodUser::getUserId).collect(Collectors.toSet()); // 删除废弃场次及其所有关联 Set deletedPeriodIds = Sets.difference(oldPeriodIds, newPeriodIds); @@ -99,7 +102,7 @@ public class MeetingInfoServiceImpl extends BaseServiceImpl impleme List newRelations = new ArrayList<>(); // 新增的用户 → 所有现存场次 - List newUsers = Arrays.stream(users).filter(u -> StrUtil.isBlank(u.getId())).toList(); + List newUsers = uniqueUsers.stream().filter(u -> StrUtil.isBlank(u.getId())).toList(); for (String periodId : newPeriodIds) { for (MeetingTimePeriodUser user : newUsers) { newRelations.add(buildRelation(meetingId, periodId, user)); @@ -109,7 +112,7 @@ public class MeetingInfoServiceImpl extends BaseServiceImpl impleme // 新增的场次 → 所有现存老用户(避免重复插入新用户) Set addedPeriodIds = Sets.difference(newPeriodIds, oldPeriodIds); for (String periodId : addedPeriodIds) { - for (MeetingTimePeriodUser user : users) { + for (MeetingTimePeriodUser user : uniqueUsers) { if (StrUtil.isBlank(user.getId())) continue; newRelations.add(buildRelation(meetingId, periodId, user)); } @@ -131,4 +134,21 @@ public class MeetingInfoServiceImpl extends BaseServiceImpl impleme rel.setJoinStatus(true); return rel; } + + /** + * 按用户 ID 去重会议参会人员,保留首次选择的人员信息。 + * 同一用户在一个会议的每个场次只允许生成一条参会关系,防止重复提交或重复选择产生重复记录。 + * + * @param users 前端提交的参会人员数组,每项必须包含 userId + * @return 去重后的参会人员列表,userId 为空的无效项不会参与保存 + */ + private List distinctUsers(MeetingTimePeriodUser[] users) { + if (users == null || users.length == 0) { + return List.of(); + } + return new ArrayList<>(Arrays.stream(users) + .filter(user -> StrUtil.isNotBlank(user.getUserId())) + .collect(Collectors.toMap(MeetingTimePeriodUser::getUserId, user -> user, (first, duplicate) -> first, LinkedHashMap::new)) + .values()); + } } diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/meeting/service/impl/MeetingOnlineServiceImpl.java b/src/main/java/com/budwk/app/zhgh/dayofficework/meeting/service/impl/MeetingOnlineServiceImpl.java index 34103c5b..94827fc2 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/meeting/service/impl/MeetingOnlineServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/meeting/service/impl/MeetingOnlineServiceImpl.java @@ -70,13 +70,16 @@ public class MeetingOnlineServiceImpl extends BaseServiceImpl imple } @Override - public List getSignInUser(String timePeriodId) { - return dao().query( - MeetingTimePeriodUser.class, - Cnd.where(MeetingTimePeriodUser::getTimePeriodId, "=", timePeriodId) - .and(MeetingTimePeriodUser::getSignStatus, "=", true) - .desc("signTime") - ); + public List getSignInUser(String timePeriodId, String signRankOrder) { + Cnd cnd = Cnd.where(MeetingTimePeriodUser::getTimePeriodId, "=", timePeriodId) + .and(MeetingTimePeriodUser::getSignStatus, "=", true); + // 签到名次由签到时间确定,只识别固定方向参数,禁止将前端排序内容直接拼接到SQL中。 + if ("ascending".equals(signRankOrder)) { + cnd.asc("signTime"); + } else { + cnd.desc("signTime"); + } + return dao().query(MeetingTimePeriodUser.class, cnd); } @Override @@ -133,7 +136,8 @@ public class MeetingOnlineServiceImpl extends BaseServiceImpl imple Sys_role formalRole = roleService.getByCode(formalRoleCode); Sys_role attendanceRole = roleService.getByCode(attendanceRoleCode); - List signedInUserIds = getSignInUser(timePeriodId).stream() + // 代表签到统计只关心已签到人员集合,使用默认降序查询即可。 + List signedInUserIds = getSignInUser(timePeriodId, "descending").stream() .map(MeetingTimePeriodUser::getUserId) .filter(Objects::nonNull) .toList(); diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/outlay/outlayManage/service/OutlayManageUnionStatisticsService.java b/src/main/java/com/budwk/app/zhgh/dayofficework/outlay/outlayManage/service/OutlayManageUnionStatisticsService.java new file mode 100644 index 00000000..eb1bb378 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/outlay/outlayManage/service/OutlayManageUnionStatisticsService.java @@ -0,0 +1,31 @@ +package com.budwk.app.zhgh.dayofficework.outlay.outlayManage.service; + +import com.budwk.app.base.service.BaseService; +import org.nutz.lang.util.NutMap; + +/** + * 分工会预算统计服务。 + * + *

统一封装分工会预算使用情况和经费收支情况的全量汇总查询, + * 汇总口径与列表查询保持一致,不受分页参数影响。

+ */ +public interface OutlayManageUnionStatisticsService extends BaseService { + + /** + * 查询分工会预算使用情况的全量合计。 + * + * @param year 统计年度 + * @param unionId 分工会主键,管理员可为空查询全部 + * @return 包含 totalQuota、usedQuota、surplusQuota 的合计数据 + */ + NutMap queryUseDetailSummary(Integer year, String unionId); + + /** + * 查询分工会经费收支使用情况的全量合计。 + * + * @param year 统计年度 + * @param unionId 分工会主键,管理员可为空查询全部 + * @return 包含各项收入、支出和余额字段的合计数据 + */ + NutMap queryIncomeExpenseSummary(Integer year, String unionId); +} diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/outlay/outlayManage/service/impl/OutlayManageUnionStatisticsServiceImpl.java b/src/main/java/com/budwk/app/zhgh/dayofficework/outlay/outlayManage/service/impl/OutlayManageUnionStatisticsServiceImpl.java new file mode 100644 index 00000000..29a70f56 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/outlay/outlayManage/service/impl/OutlayManageUnionStatisticsServiceImpl.java @@ -0,0 +1,104 @@ +package com.budwk.app.zhgh.dayofficework.outlay.outlayManage.service.impl; + +import cn.hutool.core.date.DateUtil; +import com.budwk.app.base.constant.RoleConstant; +import com.budwk.app.base.service.impl.BaseServiceImpl; +import com.budwk.app.web.commons.auth.utils.AuthUtil; +import com.budwk.app.web.commons.auth.utils.SecurityUtil; +import com.budwk.app.zhgh.dayofficework.outlay.outlayManage.service.OutlayManageUnionStatisticsService; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.dao.Sqls; +import org.nutz.dao.sql.Sql; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.util.NutMap; + +/** + * 分工会预算统计服务实现。 + * + *

汇总查询在数据库端完成,避免只汇总当前分页数据, + * 同时复用列表的年度、分工会和权限过滤条件。

+ */ +@IocBean(args = {"refer:dao"}) +public class OutlayManageUnionStatisticsServiceImpl extends BaseServiceImpl implements OutlayManageUnionStatisticsService { + + public OutlayManageUnionStatisticsServiceImpl(Dao dao) { + super(dao); + } + + @Override + public NutMap queryUseDetailSummary(Integer year, String unionId) { + Cnd cnd = buildUnionManageCondition(year, unionId, false); + Sql sql = Sqls.create(""" + SELECT + COALESCE(SUM(totalQuota), 0) AS totalQuota, + COALESCE(SUM(usedQuota), 0) AS usedQuota, + COALESCE(SUM(COALESCE(totalQuota, 0) - COALESCE(usedQuota, 0)), 0) AS surplusQuota + FROM outlay_manage_union mu $condition + """); + sql.setCondition(cnd); + return executeMap(sql); + } + + @Override + public NutMap queryIncomeExpenseSummary(Integer year, String unionId) { + Cnd cnd = buildUnionManageCondition(year, unionId, true); + Sql sql = Sqls.create(""" + SELECT + COALESCE(SUM(t.beginMoney), 0) AS beginMoney, + COALESCE(SUM(t.feeJanApr), 0) AS feeJanApr, + COALESCE(SUM(t.feeMayAug), 0) AS feeMayAug, + COALESCE(SUM(t.feeSepDec), 0) AS feeSepDec, + COALESCE(SUM(t.awardMoney), 0) AS awardMoney, + COALESCE(SUM(t.usedMoney), 0) AS usedMoney, + COALESCE(SUM(t.remainMoney), 0) AS remainMoney + FROM ( + SELECT + mu.unionId, + COALESCE(SUM(CASE WHEN au.quarterly = 1 THEN au.allocateHeadMoney ELSE 0 END), 0) AS beginMoney, + COALESCE(SUM(CASE WHEN au.quarterly = 1 THEN au.allocateMoney ELSE 0 END), 0) AS feeJanApr, + COALESCE(SUM(CASE WHEN au.quarterly = 2 THEN au.allocateMoney ELSE 0 END), 0) AS feeMayAug, + COALESCE(SUM(CASE WHEN au.quarterly = 3 THEN au.allocateMoney ELSE 0 END), 0) AS feeSepDec, + COALESCE(SUM(CASE WHEN au.quarterly = 4 THEN au.allocateMoney ELSE 0 END), 0) AS awardMoney, + COALESCE(mu.usedQuota, 0) AS usedMoney, + COALESCE(mu.totalQuota, 0) - COALESCE(mu.usedQuota, 0) AS remainMoney + FROM outlay_manage_union mu + LEFT JOIN outlay_allocate_union au ON au.year = mu.year + AND au.unionId = mu.unionId + AND au.delFlag = 0 + LEFT JOIN sys_union su ON su.id = mu.unionId + $condition + GROUP BY mu.year, mu.unionId, mu.usedQuota, mu.totalQuota + ) t + """); + sql.setCondition(cnd); + return executeMap(sql); + } + + /** + * 构造两个列表共用的预算主表过滤条件,保证汇总和分页列表权限口径一致。 + */ + private Cnd buildUnionManageCondition(Integer year, String unionId, boolean includeDelFlag) { + Cnd cnd = Cnd.NEW(); + if (includeDelFlag) { + cnd.and("mu.delFlag", "=", false); + } + cnd.and("mu.year", "=", year == null ? DateUtil.thisYear() : year); + cnd.and("mu.totalQuota", "IS NOT", null); + cnd.andEX("mu.unionId", "=", unionId); + if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) { + cnd.and("mu.unionId", "=", SecurityUtil.getUnionId()); + } + return cnd; + } + + /** + * 执行单行统计查询,并在无数据时返回各字段为零的结果,方便前端直接展示。 + */ + private NutMap executeMap(Sql sql) { + sql.setCallback(Sqls.callback.map()); + dao().execute(sql); + NutMap result = (NutMap) sql.getResult(); + return result == null ? NutMap.NEW() : result; + } +} diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/outlay/outlayManage/union/controller/OutlayManageUnionIncomeExpenseController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/outlay/outlayManage/union/controller/OutlayManageUnionIncomeExpenseController.java index 53e6b90f..e67b7a43 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/outlay/outlayManage/union/controller/OutlayManageUnionIncomeExpenseController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/outlay/outlayManage/union/controller/OutlayManageUnionIncomeExpenseController.java @@ -14,6 +14,7 @@ import com.budwk.app.base.service.BaseService; import com.budwk.app.base.utils.CommonDownloadUtil; import com.budwk.app.web.commons.auth.utils.AuthUtil; import com.budwk.app.web.commons.auth.utils.SecurityUtil; +import com.budwk.app.zhgh.dayofficework.outlay.outlayManage.service.OutlayManageUnionStatisticsService; import com.budwk.app.zhgh.dayofficework.outlay.outlayManage.union.vo.OutlayUnionIncomeExpenseVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -44,6 +45,8 @@ public class OutlayManageUnionIncomeExpenseController { @Inject private BaseService baseService; + @Inject + private OutlayManageUnionStatisticsService outlayManageUnionStatisticsService; @At("") @Ok("beetl:/platform/zhgh/dayofficework/outlay/outlayManage/union/incomeExpense/index.html") @@ -60,6 +63,16 @@ public class OutlayManageUnionIncomeExpenseController { return Result.success(pagination); } + /** + * 查询当前筛选范围内全部分工会经费收支合计,不受分页参数影响。 + */ + @At + @ApiOperation("查询经费收支合计") + @SaCheckPermission("outlay.outlayManage.union.incomeExpense") + public Result summary(Integer year, String unionId) { + return Result.success(outlayManageUnionStatisticsService.queryIncomeExpenseSummary(year, unionId)); + } + @At @Ok("void") @ApiOperation("导出") diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/outlay/outlayManage/union/controller/OutlayManageUnionUseDetailController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/outlay/outlayManage/union/controller/OutlayManageUnionUseDetailController.java index c4948be5..6688cf76 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/outlay/outlayManage/union/controller/OutlayManageUnionUseDetailController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/outlay/outlayManage/union/controller/OutlayManageUnionUseDetailController.java @@ -12,6 +12,7 @@ import com.budwk.app.web.commons.auth.utils.AuthUtil; import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.zhgh.dayofficework.outlay.outlayManage.model.OutlayUseDetail; import com.budwk.app.zhgh.dayofficework.outlay.outlayManage.service.OutlayUseDetailService; +import com.budwk.app.zhgh.dayofficework.outlay.outlayManage.service.OutlayManageUnionStatisticsService; import com.budwk.app.zhgh.dayofficework.outlay.outlayManage.union.model.OutLayAllocateUnion; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -46,6 +47,8 @@ public class OutlayManageUnionUseDetailController { private BaseService baseService; @Inject private OutlayUseDetailService outlayUseDetailService; + @Inject + private OutlayManageUnionStatisticsService outlayManageUnionStatisticsService; @At("") @Ok("beetl:/platform/zhgh/dayofficework/outlay/outlayManage/union/useDetail/index.html") @@ -81,6 +84,16 @@ public class OutlayManageUnionUseDetailController { return Result.success(pagination); } + /** + * 查询当前筛选范围内全部分工会预算使用情况合计,不受分页参数影响。 + */ + @At + @ApiOperation("查询预算使用情况合计") + @SaCheckPermission("outlay.outlayManage.union.useDetail") + public Result summary(Integer year, String unionId) { + return Result.success(outlayManageUnionStatisticsService.queryUseDetailSummary(year, unionId)); + } + @At @ApiOperation("某个分工会预算使用详情") diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/controller/QsvOnlineController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/controller/QsvOnlineController.java index 0d1a4394..f282478f 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/controller/QsvOnlineController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/controller/QsvOnlineController.java @@ -9,7 +9,7 @@ import com.budwk.app.base.page.Pagination; import com.budwk.app.base.param.PageForm; import com.budwk.app.base.result.Result; import com.budwk.app.web.commons.auth.utils.SecurityUtil; -import com.budwk.app.zhgh.activity.basic.models.ActivityUserScope; +import com.budwk.app.zhgh.activity.basic.service.ActivityBasicScopeService; import com.budwk.app.zhgh.dayofficework.qsv.models.QsvActivity; import com.budwk.app.zhgh.dayofficework.qsv.models.QsvOption; import com.budwk.app.zhgh.dayofficework.qsv.models.QsvSubject; @@ -55,6 +55,8 @@ public class QsvOnlineController { private QsvUserAnswerRecordService qsvUserAnswerRecordService; @Inject private QsvQuizService qsvQuizService; + @Inject + private ActivityBasicScopeService activityBasicScopeService; @At("") @Ok("beetl:/platform/zhgh/dayofficework/qsv/online/index.html") @@ -63,27 +65,45 @@ public class QsvOnlineController { } + /** + * 查询当前用户可参与的在线问卷、答题和投票活动。 + * pageForm 传入页码、每页数量与搜索关键字;year 为活动开始年份;title 为标题关键字; + * isAnswered 用于筛选已答或未答活动;activityId 用于首页活动携带 ID 直达指定答题任务。 + * 返回 Pagination,列表数据仅包含当前用户命中活动分组的活动;指定 activityId 时不受已答筛选影响, + * 以便前端根据实际 actionType 自动进入答题、继续答题或查看答题。 + * + * @param pageForm 分页及搜索参数 + * @param year 活动开始年份 + * @param title 活动标题关键字 + * @param isAnswered 是否只查看已答活动 + * @param activityId 指定活动 ID,为空时按普通在线答题列表查询 + * @return 当前用户可参与的在线活动分页结果 + */ @At @SaCheckPermission("qsv.online") @ApiOperation("在线答题任务分页") - public Result pageData(@Valid PageForm pageForm, Integer year, String title, Boolean isAnswered) { - List groupIds = dao.query(ActivityUserScope.class, Cnd.where("userId", "=", SecurityUtil.getUserId())) - .stream().map(ActivityUserScope::getGroupId).collect(Collectors.toList()); - if (groupIds.isEmpty()) { - return Result.success(new Pagination<>(pageForm.getPageNumber(), pageForm.getPageSize(), 0, new ArrayList<>())); - } - + public Result pageData(@Valid PageForm pageForm, Integer year, String title, Boolean isAnswered, String activityId) { Cnd cnd = Cnd.where("enabled", "=", true); - cnd.and("groupId", "in", groupIds); cnd.andEX("YEAR(startTime)", "=", year); cnd.and(Cnd.likeEX("title", title)); + cnd.andEX("id", "=", activityId); cnd.desc("startTime"); - int totalCount = dao.count(QsvActivity.class, cnd); - if (totalCount == 0) { + List activities = dao.query(QsvActivity.class, cnd); + if (activities.isEmpty()) { return Result.success(new Pagination<>(pageForm.getPageNumber(), pageForm.getPageSize(), 0, new ArrayList<>())); } - List activities = dao.query(QsvActivity.class, cnd); + + // SQL条件分组不保存 userId 明细,统一通过分组服务动态判断当前用户是否命中活动分组。 + List visibleGroupIds = activityBasicScopeService.filterGroupIdsByUser( + activities.stream().map(QsvActivity::getGroupId).collect(Collectors.toList()), SecurityUtil.getUserId()); + activities = activities.stream() + .filter(activity -> visibleGroupIds.contains(activity.getGroupId())) + .collect(Collectors.toList()); + if (activities.isEmpty()) { + return Result.success(new Pagination<>(pageForm.getPageNumber(), pageForm.getPageSize(), 0, new ArrayList<>())); + } + List activityIds = activities.stream().map(QsvActivity::getId).collect(Collectors.toList()); Map> recordGroup = dao.query(QsvUserAnswerRecord.class, Cnd.where("userId", "=", SecurityUtil.getUserId()) .and("activityId", "in", activityIds)) @@ -91,6 +111,10 @@ public class QsvOnlineController { List rows = activities.stream() .map((activity) -> buildOnlineRow(activity, recordGroup.getOrDefault(activity.getId(), new ArrayList<>()))) .filter((row) -> { + // 首页携带活动 ID 直达时保留真实答题状态,由前端根据 actionType 决定答题或查看。 + if (ObjectUtil.isNotEmpty(activityId)) { + return true; + } if (Boolean.TRUE.equals(isAnswered)) { return row.getBoolean("isAnswered"); } @@ -248,9 +272,7 @@ public class QsvOnlineController { } private Result checkUserScope(QsvActivity activity) { - int count = dao.count(ActivityUserScope.class, Cnd.where("groupId", "=", activity.getGroupId()) - .and("userId", "=", SecurityUtil.getUserId())); - if (count != 1) { + if (!activityBasicScopeService.isUserInGroup(activity.getGroupId(), SecurityUtil.getUserId())) { return Result.error("您无需参加此次调查,感谢您的关注!"); } return null; diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/h5controller/H5QsvQuizController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/h5controller/H5QsvQuizController.java index fc49d076..c2c8e132 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/h5controller/H5QsvQuizController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/h5controller/H5QsvQuizController.java @@ -8,7 +8,7 @@ import cn.hutool.json.JSONObject; import com.budwk.app.base.annotation.SLog; import com.budwk.app.base.result.Result; import com.budwk.app.web.commons.auth.utils.SecurityUtil; -import com.budwk.app.zhgh.activity.basic.models.ActivityUserScope; +import com.budwk.app.zhgh.activity.basic.service.ActivityBasicScopeService; import com.budwk.app.zhgh.dayofficework.qsv.dto.QsvCheckAnswerResult; import com.budwk.app.zhgh.dayofficework.qsv.models.QsvActivity; import com.budwk.app.zhgh.dayofficework.qsv.models.QsvSubject; @@ -46,6 +46,8 @@ public class H5QsvQuizController { private QsvUserAnswerRecordService qsvUserAnswerRecordService; @Inject private QsvQuizService qsvQuizService; + @Inject + private ActivityBasicScopeService activityBasicScopeService; @At("") @SaCheckLogin @@ -61,18 +63,24 @@ public class H5QsvQuizController { } + /** + * 获取移动端答题活动的题目和当前用户答题记录。 + * activityId 传入 qsv_activity 表中的活动 ID;返回 Result,data 包含活动信息、题目列表和答题记录 ID。 + * 进入前会校验当前登录用户是否命中活动分组,结果分组和 SQL 条件分组均按统一规则判断。 + * + * @param activityId 答题活动 ID + * @return 包含答题题目及答题记录信息的结果 + */ @At @SaCheckLogin @Aop(TransAop.READ_COMMITTED) public Result subjects(@Valid String activityId) { QsvActivity activity = dao.fetch(QsvActivity.class, activityId); - if (activity.getGroupId() != null) { - int count = dao.count(ActivityUserScope.class, Cnd.where("groupId", "=", activity.getGroupId()) - .and("userId", "=", SecurityUtil.getUserId())); - if (count != 1) { - return Result.error("您无需参加此次答题,感谢您的关注!"); - } + // SQL条件分组不保存 userId 明细,统一通过分组服务动态判断当前用户是否属于活动范围。 + if (activity.getGroupId() != null + && !activityBasicScopeService.isUserInGroup(activity.getGroupId(), SecurityUtil.getUserId())) { + return Result.error("您无需参加此次答题,感谢您的关注!"); } String mode = activity.getMode(); diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/h5controller/H5QsvSurveyController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/h5controller/H5QsvSurveyController.java index 264af86d..4b099e22 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/h5controller/H5QsvSurveyController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/h5controller/H5QsvSurveyController.java @@ -4,7 +4,7 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.json.JSONObject; import com.budwk.app.base.result.Result; import com.budwk.app.web.commons.auth.utils.SecurityUtil; -import com.budwk.app.zhgh.activity.basic.models.ActivityUserScope; +import com.budwk.app.zhgh.activity.basic.service.ActivityBasicScopeService; import com.budwk.app.zhgh.dayofficework.qsv.models.QsvActivity; import com.budwk.app.zhgh.dayofficework.qsv.models.QsvSubject; import com.budwk.app.zhgh.dayofficework.qsv.models.QsvUserAnswerRecord; @@ -39,6 +39,8 @@ public class H5QsvSurveyController { private Dao dao; @Inject private QsvUserAnswerRecordService qsvUserAnswerRecordService; + @Inject + private ActivityBasicScopeService activityBasicScopeService; @At("") @Ok("beetl:/platform/zhghh5/dayofficework/qsv/survey/index.html") @@ -54,10 +56,10 @@ public class H5QsvSurveyController { return activityStatusResult; } - int count = dao.count(ActivityUserScope.class, Cnd.where("groupId", "=", activity.getGroupId()) - .and("userId", "=", SecurityUtil.getUserId())); - if (count != 1) { - return Result.error("您无需参加此次投票,感谢您的关注!"); + // SQL 条件分组不保存用户明细,需由分组服务实时判断当前用户是否命中活动范围。 + if (activity.getGroupId() != null + && !activityBasicScopeService.isUserInGroup(activity.getGroupId(), SecurityUtil.getUserId())) { + return Result.error("您无需参加此次调查,感谢您的关注!"); } String answerRecordId = null; diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/h5controller/H5QsvVoteController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/h5controller/H5QsvVoteController.java index d1498afc..3d04e5eb 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/h5controller/H5QsvVoteController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/h5controller/H5QsvVoteController.java @@ -4,7 +4,7 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.json.JSONObject; import com.budwk.app.base.result.Result; import com.budwk.app.web.commons.auth.utils.SecurityUtil; -import com.budwk.app.zhgh.activity.basic.models.ActivityUserScope; +import com.budwk.app.zhgh.activity.basic.service.ActivityBasicScopeService; import com.budwk.app.zhgh.dayofficework.qsv.models.QsvActivity; import com.budwk.app.zhgh.dayofficework.qsv.models.QsvOption; import com.budwk.app.zhgh.dayofficework.qsv.models.QsvSubject; @@ -41,6 +41,8 @@ public class H5QsvVoteController { private Dao dao; @Inject private QsvUserAnswerRecordService qsvUserAnswerRecordService; + @Inject + private ActivityBasicScopeService activityBasicScopeService; @At("") @Ok("beetl:/platform/zhghh5/dayofficework/qsv/vote/index.html") @@ -172,9 +174,8 @@ public class H5QsvVoteController { if (activity.getGroupId() == null) { return null; } - int count = dao.count(ActivityUserScope.class, Cnd.where("groupId", "=", activity.getGroupId()) - .and("userId", "=", SecurityUtil.getUserId())); - if (count != 1) { + // SQL条件分组不保存 userId 明细,统一通过分组服务动态判断当前用户是否属于投票范围。 + if (!activityBasicScopeService.isUserInGroup(activity.getGroupId(), SecurityUtil.getUserId())) { return Result.error("\u60a8\u65e0\u9700\u53c2\u52a0\u6b64\u6b21\u6295\u7968\uff0c\u611f\u8c22\u60a8\u7684\u5173\u6ce8\uff01"); } return null; diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/models/QsvActivity.java b/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/models/QsvActivity.java index ea94a8d9..38cbdf3d 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/models/QsvActivity.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/models/QsvActivity.java @@ -123,7 +123,7 @@ public class QsvActivity extends BaseModel implements Serializable, SysHomeConve sysHomeActivity.setName(this.getTitle()); sysHomeActivity.setCover(this.getCover()); sysHomeActivity.setContent(this.getDescription()); - sysHomeActivity.setUrl("/platform/qsv/activity"); + sysHomeActivity.setUrl("/platform/qsv/online?id=" + this.getId()); sysHomeActivity.setH5Url(getH5Url()); sysHomeActivity.setStartDate(this.getStartTime()); sysHomeActivity.setEndDate(this.getEndTime()); diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/service/impl/QsvSurveyServiceImpl.java b/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/service/impl/QsvSurveyServiceImpl.java index 231be8a3..09089681 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/service/impl/QsvSurveyServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/service/impl/QsvSurveyServiceImpl.java @@ -13,6 +13,7 @@ import com.budwk.app.base.page.Pagination; import com.budwk.app.base.param.PageForm; import com.budwk.app.base.service.impl.BaseServiceImpl; import com.budwk.app.base.utils.CommonDownloadUtil; +import com.budwk.app.sys.views.View_user; import com.budwk.app.zhgh.dayofficework.qsv.models.QsvActivity; import com.budwk.app.zhgh.dayofficework.qsv.models.QsvOption; import com.budwk.app.zhgh.dayofficework.qsv.models.QsvSubject; @@ -31,6 +32,7 @@ import org.nutz.lang.util.NutMap; import javax.servlet.http.HttpServletResponse; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -436,6 +438,9 @@ public class QsvSurveyServiceImpl extends BaseServiceImpl i // .and("isFinish", "=", true) Pagination pagination = listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), cnd); List answerRecords = pagination.getList(); + Map userMobileMap = queryUserMobileMap(answerRecords.stream() + .map(record -> record.getString("userId")) + .toList()); // 查询用户答题记录 // List answerRecords = dao().query(QsvUserAnswerRecord.class, Cnd.where("activityId", "=", activityId) @@ -464,7 +469,8 @@ public class QsvSurveyServiceImpl extends BaseServiceImpl i .addv("loginName", record.getString("loginName")) .addv("userName", record.getString("userName")) .addv("unitName", record.getString("unitName")) - .addv("unionName", record.getString("unionName")); + .addv("unionName", record.getString("unionName")) + .addv("mobile", userMobileMap.get(record.getString("userId"))); JSONObject extJson = record.getAs("extJson", JSONObject.class); if (ObjectUtil.isEmpty(extJson)) { return map; @@ -723,13 +729,17 @@ public class QsvSurveyServiceImpl extends BaseServiceImpl i } private List buildAnswerRecords(List answerRecords, Map subjectMap, Map optionMap) { + Map userMobileMap = queryUserMobileMap(answerRecords.stream() + .map(QsvUserAnswerRecord::getUserId) + .toList()); return answerRecords.stream().map(record -> { NutMap map = NutMap.NEW() .addv("id", record.getId()) .addv("loginName", record.getLoginName()) .addv("userName", record.getUserName()) .addv("unitName", record.getUnitName()) - .addv("unionName", record.getUnionName()); + .addv("unionName", record.getUnionName()) + .addv("mobile", userMobileMap.get(record.getUserId())); JSONObject extJson = record.getExtJson(); if (ObjectUtil.isEmpty(extJson)) { return map; @@ -745,6 +755,26 @@ public class QsvSurveyServiceImpl extends BaseServiceImpl i }).collect(Collectors.toList()); } + /** + * 根据答题记录中的用户ID批量查询当前手机号,供后台查看答卷和导出使用。 + * + * @param userIds 答题用户ID列表,允许包含重复值或空值 + * @return key为用户ID、value为View_user当前手机号的映射;用户不存在时不返回对应项 + */ + private Map queryUserMobileMap(List userIds) { + Map userMobileMap = new HashMap<>(); + List validUserIds = userIds.stream() + .filter(ObjectUtil::isNotEmpty) + .distinct() + .toList(); + if (validUserIds.isEmpty()) { + return userMobileMap; + } + List users = dao().query(View_user.class, Cnd.where("id", "in", validUserIds)); + users.forEach(user -> userMobileMap.put(user.getId(), user.getMobile())); + return userMobileMap; + } + /** * 组装单题答案展示内容。填空题返回填写文本;选择题返回选项文本,若选项配置了补充填写, * 则追加对应补充内容,保证后台查看答卷和导出能看到用户填写的说明。 diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/tour/controller/TourSignupController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/tour/controller/TourSignupController.java index 846ed2dd..57d5f74a 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/tour/controller/TourSignupController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/tour/controller/TourSignupController.java @@ -420,12 +420,32 @@ public class TourSignupController { a.agencyName AS travelAgencyName, IFNULL(lot.allowOverReimbursement, 0) AS allowOverReimbursement, s.allowFamily, - IFNULL(s.fillBedInfo, 1) AS fillBedInfo + IFNULL(s.fillBedInfo, 1) AS fillBedInfo, + IFNULL(sc.signupCount, 0) AS signupCount, + IFNULL(sc.familyCount, 0) AS familyCount FROM tour_matter m INNER JOIN tour_line l ON l.id = m.lineId LEFT JOIN tour_travel_agency a ON a.id = l.travelAgencyId LEFT JOIN tour_setting_lot lot ON lot.id = l.lotId LEFT JOIN tour_setting s ON s.id = m.settingId + LEFT JOIN ( + /* 与PC报名列表保持一致:已报人数包含教职工本人和有效家属。 */ + SELECT + t.matterId, + COUNT(1) + SUM(IFNULL(f.familyCount, 0)) AS signupCount, + SUM(IFNULL(f.familyCount, 0)) AS familyCount + FROM tour_ledger t + LEFT JOIN ( + SELECT ledgerId, COUNT(1) AS familyCount + FROM tour_ledger_family + WHERE delFlag = 0 + GROUP BY ledgerId + ) f ON f.ledgerId = t.id + WHERE t.delFlag = 0 + AND t.matterId IS NOT NULL + AND t.matterId <> '' + GROUP BY t.matterId + ) sc ON sc.matterId = m.id WHERE m.delFlag = 0 AND m.enabled = 1 AND m.id = @matterId diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/unionReimburse/controller/UnionReimburseCollectController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/unionReimburse/controller/UnionReimburseCollectController.java index deeea605..40e77654 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/unionReimburse/controller/UnionReimburseCollectController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/unionReimburse/controller/UnionReimburseCollectController.java @@ -85,9 +85,12 @@ public class UnionReimburseCollectController { @Param(value = "reimburseProject") String reimburseProject) { Sql sql = Sqls.create(""" SELECT - info.* + info.*, + ins.id AS instanceId, + ins.processDefineId AS instanceProcessDefineId FROM union_reimburse info + LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id $condition """); Cnd cnd = Cnd.NEW(); diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/config/ProposalConfigUnitController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/config/ProposalConfigUnitController.java index b5822600..a610c330 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/config/ProposalConfigUnitController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/config/ProposalConfigUnitController.java @@ -84,12 +84,26 @@ public class ProposalConfigUnitController { u2.username AS unitLeader FROM proposal_undertake t1 - LEFT JOIN sys_user_role sur1 ON sur1.underTakeId = t1.id - AND sur1.roleId = ( SELECT r.id FROM sys_role r WHERE r.CODE = @PROPOSAL_BRANCH_SCHOOL_LEADER ) - LEFT JOIN sys_user u1 ON u1.id = sur1.userId - LEFT JOIN sys_user_role sur2 ON sur2.underTakeId = t1.id - AND sur2.roleId = ( SELECT r.id FROM sys_role r WHERE r.CODE = @PROPOSAL_UNIT_LEADER) - LEFT JOIN sys_user u2 ON u2.id = sur2.userId + LEFT JOIN ( + SELECT + sur.underTakeId, + GROUP_CONCAT(DISTINCT u.username ORDER BY u.username SEPARATOR '、') AS username, + GROUP_CONCAT(DISTINCT u.loginname ORDER BY u.loginname SEPARATOR ',') AS loginname + FROM sys_user_role sur + LEFT JOIN sys_user u ON u.id = sur.userId + WHERE sur.roleId = (SELECT r.id FROM sys_role r WHERE r.CODE = @PROPOSAL_BRANCH_SCHOOL_LEADER) + GROUP BY sur.underTakeId + ) u1 ON u1.underTakeId = t1.id + LEFT JOIN ( + SELECT + sur.underTakeId, + GROUP_CONCAT(DISTINCT u.username ORDER BY u.username SEPARATOR '、') AS username, + GROUP_CONCAT(DISTINCT u.loginname ORDER BY u.loginname SEPARATOR ',') AS loginname + FROM sys_user_role sur + LEFT JOIN sys_user u ON u.id = sur.userId + WHERE sur.roleId = (SELECT r.id FROM sys_role r WHERE r.CODE = @PROPOSAL_UNIT_LEADER) + GROUP BY sur.underTakeId + ) u2 ON u2.underTakeId = t1.id $condition """); sql.setParam("PROPOSAL_BRANCH_SCHOOL_LEADER", RoleConstant.PROPOSAL_BRANCH_SCHOOL_LEADER.name()); @@ -121,7 +135,9 @@ public class ProposalConfigUnitController { @SLog(tag = "提案", msg = "承办单位同步系统单位") public Result syncSysUnit() { Sql sql = Sqls.create("select code from proposal_undertake"); - List sysUnits = dao.query(Sys_unit.class, Cnd.where(Sys_unit::getUnitcode, "not in", sql).and(Sys_unit::getUnitTypeCode, "=", 1)); + // 三位单位编号即提案业务使用的二级单位,不再叠加系统单位层级条件。 + List sysUnits = dao.query(Sys_unit.class, Cnd.where(Sys_unit::getUnitcode, "not in", sql) + .and("CHAR_LENGTH(TRIM(unitcode))", "=", 3)); List proposalUndertakes = sysUnits.stream().map(unit -> { ProposalUndertake proposalUndertake = new ProposalUndertake(); proposalUndertake.setId(unit.getId()); diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/dashboard/ProposalDashboardController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/dashboard/ProposalDashboardController.java index f4b5b30b..2cbd8a50 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/dashboard/ProposalDashboardController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/dashboard/ProposalDashboardController.java @@ -79,14 +79,19 @@ public class ProposalDashboardController { // 节点 ProcessDefine define = processDefineService.getLastByName("JDHTA_NC"); ProcessModel processModel = processDefineService.processDefineToModel(define); - List taskModels = processModel.getTasks(); + // 按流程图的连线关系遍历任务节点,保证看板展示顺序与流程图一致。 + List taskModels = processModel.getModels(TaskModel.class); List excludeNodes = new ArrayList<>(3); excludeNodes.add("撰写提案"); excludeNodes.add("邀请附议人"); excludeNodes.add("提案附议"); - List taskNodes = taskModels.stream().filter(taskModel -> !excludeNodes.contains(taskModel.getDisplayName())) + // opinion_unit_reply、two_unit_reply 为临时屏蔽的承办单位答复节点,不在看板展示。 + List hiddenNodeIds = List.of("opinion_unit_reply", "two_unit_reply"); + List taskNodes = new ArrayList<>(taskModels.stream() + .filter(taskModel -> !excludeNodes.contains(taskModel.getDisplayName())) + .filter(taskModel -> !hiddenNodeIds.contains(taskModel.getName())) .map(taskModel -> NutMap.NEW() .addv("name", taskModel.getDisplayName()) .addv("id", taskModel.getName()) @@ -94,40 +99,42 @@ public class ProposalDashboardController { .addv("count", 0) .addv("todoCount", 0) .addv("doneCount", 0) - ).toList(); - nodes.addAll(taskNodes); + ).toList()); // 立案结果 List caseFilingResult = sysDictService.getSubListByCode("PROPOSAL_CASE_FILING_RESULT"); + List caseFilingResultNodes = new ArrayList<>(); for (Sys_dict dict : caseFilingResult) { - nodes.add(NutMap.NEW() + caseFilingResultNodes.add(NutMap.NEW() .addv("name", dict.getName()) .addv("id", dict.getCode()) .addv("type", "caseFilingResult") .addv("count", 0)); } - // 查询待办任务 - Sql todoSql = Sqls.create(""" - SELECT - t.taskName, - t.taskState - FROM - wf_process_task t - INNER JOIN wf_process_instance ins ON ins.id = t.processInstanceId - INNER JOIN proposal_info info ON info.id = ins.businessNo - WHERE - info.sessionId = @sessionId - """); - todoSql.setParam("sessionId", sessionId); - List todoTasks = processDefineService.listMap(todoSql); + // 立案结果需展示在委员会确认承办单位之前,反馈评价统一固定到看板末尾。 + List feedbackNodes = taskNodes.stream() + .filter(taskNode -> "feedback".equals(taskNode.getString("id"))) + .toList(); + taskNodes.removeIf(taskNode -> "feedback".equals(taskNode.getString("id"))); + int committeeFilingUnitIndex = taskNodes.size(); + for (int i = 0; i < taskNodes.size(); i++) { + if ("committeeFilingUnit".equals(taskNodes.get(i).getString("id"))) { + committeeFilingUnitIndex = i; + break; + } + } + taskNodes.addAll(committeeFilingUnitIndex, caseFilingResultNodes); + nodes.addAll(taskNodes); + nodes.addAll(feedbackNodes); + + Map taskProposalCounts = proposalCommonService.countDashboardTaskProposals(sessionId); for (NutMap node : nodes) { if (node.getString("type").equals("task")) { - long todoCount = todoTasks.stream().filter(task -> task.getInt("taskState") == ProcessTaskStateEnum.DOING.getCode() && task.getString("taskName").equals(node.getString("id"))).count(); - node.put("todoCount", todoCount); - long doneCount = todoTasks.stream().filter(task -> task.getInt("taskState") == ProcessTaskStateEnum.FINISHED.getCode() && task.getString("taskName").equals(node.getString("id"))).count(); - node.put("doneCount", doneCount); + NutMap taskCount = taskProposalCounts.get(node.getString("id")); + node.put("todoCount", taskCount == null ? 0 : taskCount.getLong("todoCount", 0L)); + node.put("doneCount", taskCount == null ? 0 : taskCount.getLong("doneCount", 0L)); } else if (node.getString("type").equals("total")) { int count = dao.count(ProposalInfo.class, Cnd.where(ProposalInfo::getSessionId, "=", sessionId)); node.put("count", count); diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryCollectProgressController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryCollectProgressController.java index ab386417..7fe350d7 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryCollectProgressController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryCollectProgressController.java @@ -1,22 +1,14 @@ package com.budwk.app.zhgh.democratic.proposal.controller.query; import cn.dev33.satoken.annotation.SaCheckPermission; -import cn.hutool.core.util.ArrayUtil; +import com.budwk.app.base.param.ExportTableColumns; import com.budwk.app.base.page.Pagination; import com.budwk.app.base.result.Result; -import com.budwk.app.flow.entity.ProcessTask; -import com.budwk.app.flow.enums.ProcessInstanceStateEnum; -import com.budwk.app.flow.enums.ProcessTaskStateEnum; import com.budwk.app.zhgh.democratic.proposal.param.ProposalQueryComprehensiveParam; import com.budwk.app.zhgh.democratic.proposal.service.common.ProposalCommonService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; -import org.nutz.dao.Cnd; -import org.nutz.dao.Dao; -import org.nutz.dao.Sqls; -import org.nutz.dao.sql.Sql; -import org.nutz.dao.util.cri.SqlExpressionGroup; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.lang.util.NutMap; @@ -24,10 +16,10 @@ import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.Ok; import org.nutz.mvc.annotation.Param; +import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.util.ArrayList; import java.util.List; -import java.util.Map; @IocBean @@ -37,20 +29,6 @@ import java.util.Map; @Api(tags = "征集进度查询") public class ProposalQueryCollectProgressController { - /** - * 征集进度表格允许排序的字段映射,值为查询中的真实字段或安全别名。 - */ - private static final Map COLLECT_PROGRESS_ORDER_COLUMNS = Map.ofEntries( - Map.entry("code", "info.code"), - Map.entry("name", "info.name"), - Map.entry("createUserName", "info.createUserName"), - Map.entry("delegationName", "delegationName"), - Map.entry("inviteCount", "inviteCount"), - Map.entry("finishCount", "finishCount"), - Map.entry("curTaskName", "curTaskName"), - Map.entry("instanceState", "instanceState") - ); - static List states = new ArrayList<>() {{ add(NutMap.NEW().addv("code", 10).addv("id", 10).addv("name", "撰写提案")); add(NutMap.NEW().addv("code", 20).addv("id", 20).addv("name", "附议提案")); @@ -60,9 +38,6 @@ public class ProposalQueryCollectProgressController { @Inject private ProposalCommonService proposalCommonService; - @Inject - private Dao dao; - @At("") @Ok("beetl:/platform/zhgh/democratic/proposal/query/collectProgress/index.html") @@ -74,70 +49,27 @@ public class ProposalQueryCollectProgressController { @SaCheckPermission("proposal.query.collectProgress") @ApiOperation(value = "分页列表") public Result pageData(@Valid @Param("pageForm") ProposalQueryComprehensiveParam pageForm) { - Sql sql = Sqls.create(""" - SELECT - info.id, - info.name, - info.code, - info.createUserName, - type.NAME AS typeName, - tcs.fullName AS sessionName, - tcd.`name` AS delegationName, - (SELECT count(1) FROM proposal_second WHERE proposalId = info.id) AS inviteCount, - (SELECT count(1) FROM wf_process_task WHERE processInstanceId = ins.id AND taskName = 'second' AND taskState = 20) finishCount, - ins.id AS instanceId, - ins.state instanceState, - t.displayName curTaskName - FROM - proposal_info info - LEFT JOIN proposal_type type ON type.id = info.typeId - LEFT JOIN teacher_congress_session tcs ON tcs.id = info.sessionId - LEFT JOIN teacher_congress_delegation tcd ON tcd.id = info.delegationId - LEFT JOIN teacher_congress_delegate tcde on tcde.loginName = info.createUserLoginName - LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id - LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10 - $condition - """); - Cnd cnd = Cnd.NEW(); - // 征集进度必须按页面选中的教代会过滤,避免共享参数未处理sessionId导致跨届次查询。 - cnd.andEX("info.sessionId", "=", pageForm.getSessionId()); - ProposalQueryComprehensiveParam.buildSearch(cnd, pageForm); - - SqlExpressionGroup seg = new SqlExpressionGroup(); - if (ArrayUtil.contains(pageForm.getCollectIds(), 10)) { - seg.or("t.taskName", "=", "startTask"); - } - if (ArrayUtil.contains(pageForm.getCollectIds(), 20)) { - seg.or("t.taskName", "=", "second"); - } - if (ArrayUtil.contains(pageForm.getCollectIds(), 30)) { - seg.or("t.taskName", "=", "delegation"); - } - if (ArrayUtil.contains(pageForm.getCollectIds(), 40)) { - seg.or("t.taskName", "not in", List.of("startTask", "second", "delegation")); - seg.and("t.taskName", "is not", null); - seg.or("ins.state","=", ProcessInstanceStateEnum.FINISHED.getCode()); - } - if (!seg.isEmpty()) { - cnd.and(seg); - } - cnd.groupBy("info.id"); - // 征集进度包含关联字段和人数统计别名,只允许白名单字段进入排序条件。 - proposalCommonService.applySafePageOrder(cnd, pageForm, COLLECT_PROGRESS_ORDER_COLUMNS); - sql.setCondition(cnd); - Pagination pagination = proposalCommonService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); - List list = (List) pagination.getList(); -// for (NutMap row : list) { -// int count = dao.count(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "=", row.getString("instanceId")) -// .and(ProcessTask::getTaskName, "=", "second") -// .and(ProcessTask::getTaskState, "=", ProcessTaskStateEnum.FINISHED.getCode()) -// ); -// -// -// } + Pagination pagination = proposalCommonService.queryCollectProgress(pageForm); return Result.success(pagination); } + /** + * 按征集进度页面筛选条件及当前可见字段导出 Excel。 + * + * @param pageForm 页面筛选和排序参数 + * @param tableColumns 当前可见字段,顺序即导出列顺序 + * @param response HTTP 响应,返回 XSSF Excel + */ + @At + @Ok("void") + @SaCheckPermission("proposal.query.collectProgress") + @ApiOperation(value = "自定义导出征集进度") + public void exportCustomAsExcel(@Valid @Param("pageForm") ProposalQueryComprehensiveParam pageForm, + @Param("tableColumns") ExportTableColumns[] tableColumns, + HttpServletResponse response) { + proposalCommonService.exportCollectProgressAsExcel(pageForm, tableColumns, response); + } + @At @ApiOperation(value = "获取征集状态") @SaCheckPermission("proposal.query.collectProgress") diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryComprehensiveController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryComprehensiveController.java index 7c6fbb82..cd682c97 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryComprehensiveController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryComprehensiveController.java @@ -1,21 +1,13 @@ package com.budwk.app.zhgh.democratic.proposal.controller.query; import cn.dev33.satoken.annotation.SaCheckPermission; -import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.StrUtil; -import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.param.ExportTableColumns; import com.budwk.app.base.result.Result; -import com.budwk.app.base.service.BaseService; -import com.budwk.app.zhgh.democratic.proposal.controller.vo.ProposalInfoPageVO; import com.budwk.app.zhgh.democratic.proposal.param.ProposalQueryComprehensiveParam; import com.budwk.app.zhgh.democratic.proposal.service.common.ProposalCommonService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; -import org.nutz.dao.Cnd; -import org.nutz.dao.Sqls; -import org.nutz.dao.sql.Sql; -import org.nutz.dao.util.cri.SqlExpressionGroup; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.mvc.annotation.At; @@ -24,9 +16,6 @@ import org.nutz.mvc.annotation.Param; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; -import java.util.Arrays; -import java.util.Map; - @IocBean @At("/platform/proposal/query/comprehensive") @Slf4j @@ -34,25 +23,6 @@ import java.util.Map; @Api(tags = "提案综合查询") public class ProposalQueryComprehensiveController { - /** - * 综合查询表格允许排序的字段映射,值为查询中的真实字段或安全别名。 - */ - private static final Map COMPREHENSIVE_ORDER_COLUMNS = Map.ofEntries( - Map.entry("code", "info.code"), - Map.entry("name", "info.name"), - Map.entry("createUserName", "info.createUserName"), - Map.entry("typeName", "typeName"), - Map.entry("delegationName", "delegationName"), - Map.entry("caseFilingResult", "info.caseFilingResult"), - Map.entry("caseFilingType", "info.caseFilingType"), - Map.entry("merge", "merge"), - Map.entry("undertakeUnits", "undertakeUnitsOrder"), - Map.entry("curTaskName", "curTaskName"), - Map.entry("instanceState", "instanceState") - ); - - @Inject - private BaseService baseService; @Inject private ProposalCommonService proposalCommonService; @@ -66,84 +36,24 @@ public class ProposalQueryComprehensiveController { @SaCheckPermission("proposal.query.comprehensive") @ApiOperation(value = "分页列表") public Result pageData(@Valid @Param("pageForm") ProposalQueryComprehensiveParam pageForm) { - Sql sql = Sqls.create(""" - SELECT - info.*, - IF(mer.proposalId IS NOT NULL, 1, 0) AS merge, - type.name AS typeName, - tcs.fullName AS sessionName, - tcd.`name` AS delegationName, - ins.id AS instanceId, - ins.businessNo, - ins.state instanceState, - ins.variable instanceVariable, - ins.processDefineId instanceProcessDefineId, - t.displayName curTaskName, - GROUP_CONCAT(DISTINCT CASE WHEN pru.isMaster = 1 THEN pru.unitName END) AS masterUnitName, - GROUP_CONCAT(DISTINCT CASE WHEN pru.isMaster = 0 THEN pru.unitName END) AS slaveUnitNames, - GROUP_CONCAT(DISTINCT pru.unitName ORDER BY pru.isMaster DESC, pru.unitName) AS undertakeUnitsOrder - FROM - proposal_info info - LEFT JOIN proposal_type type on type.id = info.typeId - LEFT JOIN proposal_merge mer ON mer.proposalId = info.id - LEFT JOIN teacher_congress_session tcs on tcs.id = info.sessionId - LEFT JOIN teacher_congress_delegation tcd on tcd.id = info.delegationId - LEFT JOIN teacher_congress_delegate tcde on tcde.loginName = info.createUserLoginName - LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id - LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10 - LEFT JOIN proposal_reply_unit pru ON pru.proposalId = info.id - LEFT JOIN wf_process_task replyTask on replyTask.processInstanceId = ins.id - $condition - """); -// AND replyTask.taskState = 20 AND replyTask.taskName in ('master_reply','slave_reply','opinion_master_reply') - Cnd cnd = Cnd.NEW(); - if (ArrayUtil.isNotEmpty(pageForm.getOrigins()) && StrUtil.isNotBlank(pageForm.getCommonKeyword())) { - SqlExpressionGroup seg = new SqlExpressionGroup(); + return Result.success(proposalCommonService.queryComprehensive(pageForm)); + } - // 案名 - if (ArrayUtil.contains(pageForm.getOrigins(), "name")) { - for (String keyword : pageForm.getCommonKeyword().split(" ")) { - seg.orLike("info.name", keyword); - } - } - - // 案由 - if (ArrayUtil.contains(pageForm.getOrigins(), "brief")) { - for (String keyword : pageForm.getCommonKeyword().split(" ")) { - seg.orLike("info.brief", keyword); - } - } - - // 提案人 - if (ArrayUtil.contains(pageForm.getOrigins(), "createUserName")) { - for (String keyword : pageForm.getCommonKeyword().split(" ")) { - seg.orLike("info.createUserName", keyword); - seg.orLike("info.createUserLoginName", keyword); - } - } - - // 答复内容 - if (ArrayUtil.contains(pageForm.getOrigins(), "answer")) { - for (String keyword : pageForm.getCommonKeyword().split(" ")) { - seg.orLike("JSON_EXTRACT(replyTask.variable,'$.tf_opinion')", keyword); - } - } - - if (!seg.isEmpty()) { - cnd.and(seg); - } - } - - if (StrUtil.isNotBlank(pageForm.getUnderTakeUnitId())) { - cnd.andEX("pru.unitId", "=", pageForm.getUnderTakeUnitId()); - } - ProposalQueryComprehensiveParam.buildSearch(cnd, pageForm); - cnd.groupBy("info.id"); - // 综合查询包含多表字段及聚合别名,只允许白名单字段进入排序条件。 - proposalCommonService.applySafePageOrder(cnd, pageForm, COMPREHENSIVE_ORDER_COLUMNS); - sql.setCondition(cnd); - Pagination pagination = baseService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); - return Result.success(pagination); + /** + * 按综合查询页面当前筛选条件和列设置导出 Excel。 + * + * @param pageForm 页面筛选及排序参数 + * @param tableColumns 列设置中当前可见的字段,顺序即 Excel 列顺序 + * @param response HTTP 响应,返回 XSSF 格式的 Excel 文件 + */ + @At + @Ok("void") + @SaCheckPermission("proposal.query.comprehensive") + @ApiOperation(value = "自定义导出综合查询列表") + public void exportCustomAsExcel(@Valid @Param("pageForm") ProposalQueryComprehensiveParam pageForm, + @Param("tableColumns") ExportTableColumns[] tableColumns, + HttpServletResponse response) { + proposalCommonService.exportComprehensiveAsExcel(pageForm, tableColumns, response); } @At diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryDelegationController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryDelegationController.java index 65fe6e44..862d75be 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryDelegationController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryDelegationController.java @@ -1,14 +1,11 @@ package com.budwk.app.zhgh.democratic.proposal.controller.query; import cn.dev33.satoken.annotation.SaCheckPermission; -import cn.hutool.core.util.StrUtil; import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.param.ExportTableColumns; import com.budwk.app.base.param.PageForm; import com.budwk.app.base.result.Result; import com.budwk.app.base.service.BaseService; -import com.budwk.app.sys.models.Sys_dict; -import com.budwk.app.sys.services.SysDictService; -import com.budwk.app.web.commons.auth.utils.AuthUtil; import com.budwk.app.zhgh.democratic.proposal.param.ProposalSearchParam; import com.budwk.app.zhgh.democratic.proposal.service.common.ProposalCommonService; import io.swagger.annotations.Api; @@ -21,10 +18,10 @@ import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; import java.util.Map; @IocBean @@ -34,15 +31,6 @@ import java.util.Map; @Api(tags = "代表团提案统计") public class ProposalQueryDelegationController { - /** - * 代表团汇总表固定列的安全排序映射,动态立案结果列在查询时追加。 - */ - private static final Map DELEGATION_SUMMARY_ORDER_COLUMNS = Map.of( - "dbtName", "dbt.name", - "TOTAL", "TOTAL", - "caseRate", "caseRateOrder" - ); - /** * 代表团提案明细表允许排序的字段映射。 */ @@ -62,10 +50,6 @@ public class ProposalQueryDelegationController { @Inject private ProposalCommonService proposalCommonService; - @Inject - private SysDictService sysDictService; - - @At("") @Ok("beetl:/platform/zhgh/democratic/proposal/query/delegation/index.html") @SaCheckPermission("proposal.query.delegation") @@ -77,46 +61,26 @@ public class ProposalQueryDelegationController { @ApiOperation("代表团提案统计") @SaCheckPermission("proposal.query.delegation") public Result pageData(PageForm pageForm, String sessionId) { - List dictList = sysDictService.getSubListByCode("PROPOSAL_CASE_FILING_RESULT"); - Sql sql = Sqls.create(""" - SELECT - dbt.id, - dbt.`name` AS dbtName, - (select count(1) from proposal_info info where info.delegationId = dbt.id and info.sessionId = dbt.sessionId ) as TOTAL, - (select count(1) from proposal_info info where info.delegationId = dbt.id and info.sessionId = dbt.sessionId and info.isSubmit = 1 ) as SUBMIT_COUNT - $resultSql, - (select count(1) from proposal_info info where info.delegationId = dbt.id and info.sessionId = dbt.sessionId and info.caseFilingResult = @confirmFiling) - / NULLIF((select count(1) from proposal_info info where info.delegationId = dbt.id and info.sessionId = dbt.sessionId), 0) AS caseRateOrder - FROM - teacher_congress_delegation dbt - $condition - """); - Map summaryOrderColumns = new HashMap<>(DELEGATION_SUMMARY_ORDER_COLUMNS); - List resultSqlParts = new ArrayList<>(); - int resultIndex = 0; - for (Sys_dict dict : dictList) { - String resultCode = dict.getCode(); - // 动态别名仅允许字母、数字和下划线,查询值使用参数绑定,避免字典内容进入SQL结构。 - if (StrUtil.isBlank(resultCode) || !resultCode.matches("[A-Za-z0-9_]+")) { - continue; - } - String paramName = "caseFilingResult" + resultIndex++; - resultSqlParts.add(", (select count(1) from proposal_info info where info.delegationId = dbt.id and info.sessionId = dbt.sessionId and info.caseFilingResult = @" + paramName + ") AS `" + resultCode + "`"); - sql.setParam(paramName, resultCode); - summaryOrderColumns.put(resultCode, "`" + resultCode + "`"); - } - sql.setVar("resultSql", String.join("", resultSqlParts)); - sql.setParam("confirmFiling", "CONFIRM_FILING"); - Cnd cnd = Cnd.NEW(); - cnd.andEX("dbt.sessionId", "=", sessionId); - if (!AuthUtil.hasRoleOr("SYSADMIN", "SCHOOL_UNION_ADMIN")) { - } - // 未选择排序时保留原有代表团编码升序,选择后仅应用白名单字段。 - if (!proposalCommonService.applySafePageOrder(cnd, pageForm, summaryOrderColumns)) { - cnd.asc("dbt.`code`"); - } - sql.setCondition(cnd); - return Result.success(baseService.listMap(sql)); + return Result.success(proposalCommonService.queryDelegationStatistics(pageForm, sessionId)); + } + + /** + * 按当前届次、排序及页面可见字段导出代表团统计。 + * + * @param pageForm 页面排序参数 + * @param sessionId 教代会届次ID + * @param tableColumns 当前可见字段 + * @param response HTTP 响应,返回 XSSF Excel + */ + @At + @Ok("void") + @ApiOperation("自定义导出代表团提案统计") + @SaCheckPermission("proposal.query.delegation") + public void exportCustomAsExcel(@Valid @Param("pageForm") PageForm pageForm, + @Param("sessionId") String sessionId, + @Param("tableColumns") ExportTableColumns[] tableColumns, + HttpServletResponse response) { + proposalCommonService.exportDelegationStatisticsAsExcel(pageForm, sessionId, tableColumns, response); } diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryUnitReplyController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryUnitReplyController.java index d726b185..c1ca80b3 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryUnitReplyController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryUnitReplyController.java @@ -1,28 +1,19 @@ package com.budwk.app.zhgh.democratic.proposal.controller.query; import cn.dev33.satoken.annotation.SaCheckPermission; +import com.budwk.app.base.param.ExportTableColumns; import com.budwk.app.base.param.PageForm; import com.budwk.app.base.result.Result; -import com.budwk.app.flow.engine.util.FlowUtil; -import com.budwk.app.flow.entity.ProcessTask; -import com.budwk.app.flow.enums.ProcessTaskStateEnum; -import com.budwk.app.zhgh.democratic.proposal.models.ProposalConfig; -import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo; -import com.budwk.app.zhgh.democratic.proposal.models.ProposalReplyUnit; import com.budwk.app.zhgh.democratic.proposal.service.common.ProposalCommonService; import lombok.extern.slf4j.Slf4j; -import org.nutz.dao.Cnd; -import org.nutz.dao.Dao; -import org.nutz.dao.Sqls; -import org.nutz.dao.sql.Sql; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; -import org.nutz.lang.util.NutMap; import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; -import java.util.*; -import java.util.stream.Collectors; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; /** * 承办单位办理统计 @@ -33,16 +24,6 @@ import java.util.stream.Collectors; @Ok("json:full") public class ProposalQueryUnitReplyController { - /** - * 承办单位办理统计允许排序的字段白名单。 - */ - private static final Set UNIT_REPLY_ORDER_COLUMNS = Set.of( - "unitName", "sum", "masterSum", "masterReplySum", "masterNoReplySum", - "slaveSum", "slaveReplySum", "slaveNoReplySum" - ); - - @Inject - private Dao dao; @Inject private ProposalCommonService proposalCommonService; @@ -64,94 +45,30 @@ public class ProposalQueryUnitReplyController { * caseFilingResult:立案结果字典值,对应 proposal_info.caseFilingResult,为空时不限制立案结果。 * 返回值:Result.data 中包含 tableData 统计行列表,以及 slaveNeedReply 协办单位是否需要答复配置。 */ - // 提案配置 协办是否需要答复 - ProposalConfig proposalConfig = dao.fetch(ProposalConfig.class, Cnd.NEW()); - boolean slaveNeedReply = proposalConfig.getSlaveUnitNeedReply(); + return Result.success().addData(proposalCommonService.queryUnitReplyStatistics( + pageForm, sessionId, undertakeUnitId, caseFilingResult)); + } - // 当前届次所有的提案ID - Cnd proposalCnd = Cnd.where(ProposalInfo::getSessionId, "=", sessionId); - proposalCnd.andEX(ProposalInfo::getCaseFilingResult, "=", caseFilingResult); - List proposalIds = dao.query(ProposalInfo.class, proposalCnd) - .stream() - .map(ProposalInfo::getId) - .collect(Collectors.toList()); - - if(proposalIds.isEmpty()){ - return Result.success().addData(Map.of("tableData", Collections.EMPTY_LIST, "slaveNeedReply", slaveNeedReply)); - } - - - // 关联所有的实例ID - Sql instSql = Sqls.create("select id from wf_process_instance where businessNo in (@proposalIds)"); - instSql.setParam("proposalIds", proposalIds); - instSql.setCallback(Sqls.callback.strList()); - dao.execute(instSql); - List instIds = instSql.getList(String.class); - - // 提案委员会立案分配的承办单位 - Cnd cnd = Cnd.where(ProposalReplyUnit::getProposalId, "in", proposalIds); - cnd.andEX(ProposalReplyUnit::getUnitId, "=", undertakeUnitId); - List replyUnits = dao.query(ProposalReplyUnit.class, cnd); - - // 承办单位答复记录 - List replyTasks = dao.query(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "in", instIds).and(ProcessTask::getTaskName, "in", List.of("two_unit_reply","unit_reply","master_reply", "slave_reply", "opinion_master_reply")).and(ProcessTask::getTaskState, "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.DOING.getCode()))); - - // 承办单位 - List tableData = new ArrayList<>(); - - replyUnits.stream().collect(Collectors.groupingBy(ProposalReplyUnit::getUnitCode)).forEach((k, v) -> { - NutMap tableRow = NutMap.NEW(); - tableRow.put("id", k); - v.stream().findAny().ifPresent(item -> { - tableRow.put("unitName", item.getUnitName()); - tableRow.put("unitCode", item.getUnitCode()); - }); - - // 提案总数 - tableRow.put("sum", v.size()); - // 主办提案数 - tableRow.put("masterSum", v.stream().filter(unit -> Objects.equals(unit.getUnitCode(), k) && unit.getIsMaster()).count()); - // 协办提案数 - tableRow.put("slaveSum", v.stream().filter(unit -> Objects.equals(unit.getUnitCode(), k) && !unit.getIsMaster()).count()); - - // 主办提案已答复数 - long masterReplySum = replyTasks.stream().filter(x -> - FlowUtil.variableToNutMap(x.getVariable()).getString("underTakeId", "").equals(k) - && FlowUtil.variableToNutMap(x.getVariable()).getBoolean("underTakeIsMaster") - && x.getTaskState().equals(ProcessTaskStateEnum.FINISHED.getCode()) - ).map(ProcessTask::getProcessInstanceId).distinct().count(); - - // 主办提案未答复数 - long masterNoReplySum = replyTasks.stream().filter(x -> - FlowUtil.variableToNutMap(x.getVariable()).getString("underTakeId", "").equals(k) - && FlowUtil.variableToNutMap(x.getVariable()).getBoolean("underTakeIsMaster") - && x.getTaskState().equals(ProcessTaskStateEnum.DOING.getCode()) - ).map(ProcessTask::getProcessInstanceId).distinct().count(); - - // 协办提案已答复数 - long slaveReplySum = replyTasks.stream().filter(x -> - FlowUtil.variableToNutMap(x.getVariable()).getString("underTakeId", "").equals(k) - && !FlowUtil.variableToNutMap(x.getVariable()).getBoolean("underTakeIsMaster") - && x.getTaskState().equals(ProcessTaskStateEnum.FINISHED.getCode()) - ).map(ProcessTask::getProcessInstanceId).distinct().count(); - - // 协办提案未答复数 - long slaveNoReplySum = replyTasks.stream().filter(x -> - FlowUtil.variableToNutMap(x.getVariable()).getString("underTakeId", "").equals(k) - && !FlowUtil.variableToNutMap(x.getVariable()).getBoolean("underTakeIsMaster") - && x.getTaskState().equals(ProcessTaskStateEnum.DOING.getCode()) - ).map(ProcessTask::getProcessInstanceId).distinct().count(); - - tableRow.put("masterReplySum", masterReplySum); - tableRow.put("masterNoReplySum", masterNoReplySum); - tableRow.put("slaveReplySum", slaveReplySum); - tableRow.put("slaveNoReplySum", slaveNoReplySum); - - tableData.add(tableRow); - }); - - // 统计结果生成后在服务层按白名单字段排序,避免前端字段参与任意业务处理。 - proposalCommonService.sortStatisticsRows(tableData, pageForm, UNIT_REPLY_ORDER_COLUMNS); - return Result.success().addData(Map.of("tableData", tableData, "slaveNeedReply", slaveNeedReply)); + /** + * 按当前筛选条件及页面可见字段导出承办单位办理统计。 + * + * @param pageForm 页面排序参数 + * @param sessionId 教代会届次ID + * @param undertakeUnitId 承办单位ID + * @param caseFilingResult 立案结果编码 + * @param tableColumns 当前可见字段 + * @param response HTTP 响应,返回 XSSF Excel + */ + @At + @Ok("void") + @SaCheckPermission("proposal.query.unitReply") + public void exportCustomAsExcel(@Valid @Param("pageForm") PageForm pageForm, + @Param("sessionId") String sessionId, + @Param("undertakeUnitId") String undertakeUnitId, + @Param("caseFilingResult") String caseFilingResult, + @Param("tableColumns") ExportTableColumns[] tableColumns, + HttpServletResponse response) { + proposalCommonService.exportUnitReplyStatisticsAsExcel(pageForm, sessionId, undertakeUnitId, + caseFilingResult, tableColumns, response); } } diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryYearReportController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryYearReportController.java index 2c1e0549..9f5d1c34 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryYearReportController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryYearReportController.java @@ -35,6 +35,7 @@ public class ProposalQueryYearReportController { */ private static final Map YEAR_REPORT_ORDER_COLUMNS = Map.ofEntries( Map.entry("code", "info.code"), + Map.entry("caseFilingCode", "info.caseFilingCode"), Map.entry("name", "info.name"), Map.entry("createUserName", "info.createUserName"), Map.entry("typeName", "typeName"), diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalUnderTakeSatisfactionController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalUnderTakeSatisfactionController.java index 32286e40..e040a830 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalUnderTakeSatisfactionController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalUnderTakeSatisfactionController.java @@ -1,31 +1,19 @@ package com.budwk.app.zhgh.democratic.proposal.controller.query; import cn.dev33.satoken.annotation.SaCheckPermission; -import cn.hutool.core.util.StrUtil; +import com.budwk.app.base.param.ExportTableColumns; import com.budwk.app.base.param.PageForm; import com.budwk.app.base.result.Result; -import com.budwk.app.flow.engine.util.FlowUtil; -import com.budwk.app.flow.entity.ProcessInstance; -import com.budwk.app.flow.entity.ProcessTask; -import com.budwk.app.flow.enums.ProcessTaskStateEnum; -import com.budwk.app.sys.models.Sys_dict; -import com.budwk.app.sys.services.SysDictService; -import com.budwk.app.zhgh.democratic.proposal.models.ProposalConfig; -import com.budwk.app.zhgh.democratic.proposal.models.ProposalReplyUnit; import com.budwk.app.zhgh.democratic.proposal.service.common.ProposalCommonService; import io.swagger.annotations.Api; -import org.nutz.dao.Cnd; -import org.nutz.dao.Dao; -import org.nutz.dao.Sqls; -import org.nutz.dao.sql.Sql; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; -import org.nutz.lang.util.NutMap; import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; -import java.util.*; -import java.util.stream.Collectors; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; @IocBean @At("/platform/proposal/query/underTake/satisfaction") @@ -33,17 +21,6 @@ import java.util.stream.Collectors; @Api(tags = "提案承办单位满意度") public class ProposalUnderTakeSatisfactionController { - /** - * 满意度统计固定列的排序白名单,动态满意度列在查询时追加。 - */ - private static final Set SATISFACTION_ORDER_COLUMNS = Set.of( - "unitName", "sum", "masterSum", "slaveSum" - ); - - @Inject - private Dao dao; - @Inject - private SysDictService sysDictService; @Inject private ProposalCommonService proposalCommonService; @@ -65,80 +42,28 @@ public class ProposalUnderTakeSatisfactionController { @At @SaCheckPermission("proposal.query.underTake.satisfaction") public Result data(PageForm pageForm, String sessionId, String undertakeUnitId) { - List feedbackCodes = sysDictService.getSubListByCode("PROPOSAL_FEEDBACK"); - Set orderColumns = new HashSet<>(SATISFACTION_ORDER_COLUMNS); - // 动态满意度列仅从后端字典加入白名单,不接受前端自行扩展字段。 - feedbackCodes.stream() - .map(Sys_dict::getCode) - .filter(StrUtil::isNotBlank) - .forEach(orderColumns::add); - - // 当前届次所有的提案ID - Sql sql = Sqls.create("select id from proposal_info where sessionId = @sessionId").setParam("sessionId", sessionId); - sql.setCallback(Sqls.callback.strList()); - dao.execute(sql); - List proposalIds = sql.getList(String.class); - - if (proposalIds.isEmpty()) { - return Result.success(Collections.EMPTY_LIST); - } - - // 关联所有的实例ID - Sql instSql = Sqls.create("select id from wf_process_instance where businessNo in (@proposalIds)"); - instSql.setParam("proposalIds", proposalIds); - instSql.setCallback(Sqls.callback.strList()); - dao.execute(instSql); - List instIds = instSql.getList(String.class); - - // 提案委员会立案分配的承办单位 - Cnd cnd = Cnd.where(ProposalReplyUnit::getProposalId, "in", proposalIds); - cnd.andEX(ProposalReplyUnit::getUnitId, "=", undertakeUnitId); - List replyUnits = dao.query(ProposalReplyUnit.class, cnd); - - // 反馈评分记录 -// List feedbackTasks = dao.query(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "in", instIds) -// .and(ProcessTask::getTaskName, "=", "feedback") -// .and(ProcessTask::getTaskState, "=", ProcessTaskStateEnum.FINISHED.getCode())); - - // 承办单位 - List tableData = new ArrayList<>(); - - replyUnits.stream().collect(Collectors.groupingBy(ProposalReplyUnit::getUnitCode)).forEach((k, v) -> { - NutMap tableRow = NutMap.NEW(); - tableRow.put("id", k); - v.stream().findAny().ifPresent(item -> { - tableRow.put("unitName", item.getUnitName()); - tableRow.put("unitCode", item.getUnitCode()); - }); - - // 提案总数 - tableRow.put("sum", v.size()); - // 主办提案数 - tableRow.put("masterSum", v.stream().filter(unit -> Objects.equals(unit.getUnitCode(), k) && unit.getIsMaster()).count()); - // 协办提案数 - tableRow.put("slaveSum", v.stream().filter(unit -> Objects.equals(unit.getUnitCode(), k) && !unit.getIsMaster()).count()); - - // 该单位负责的提案 - List thisUnitProposalIds = v.stream().map(ProposalReplyUnit::getProposalId).toList(); - List instances = dao.query(ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "in", thisUnitProposalIds)); - List thisUnitInstIds = instances.stream().map(ProcessInstance::getId).toList(); - - // 反馈评分记录 - List feedbackTasks = dao.query(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "in", thisUnitInstIds) - .and(ProcessTask::getTaskName, "=", "feedback") - .and(ProcessTask::getTaskState, "=", ProcessTaskStateEnum.FINISHED.getCode())); - - for (Sys_dict code : feedbackCodes) { - long count = feedbackTasks.stream().filter(task -> FlowUtil.variableToNutMap(task.getVariable()).getString("tf_feedback", "").equals(code.getCode())).map(ProcessTask::getProcessInstanceId).distinct().count(); - tableRow.put(code.getCode(), count); - } - tableData.add(tableRow); - }); - - // 汇总完成后在服务层执行白名单排序,数字列按数值顺序处理。 - proposalCommonService.sortStatisticsRows(tableData, pageForm, orderColumns); - return Result.success(tableData); + return Result.success(proposalCommonService.queryUnderTakeSatisfactionStatistics( + pageForm, sessionId, undertakeUnitId)); } - + /** + * 按当前届次、承办单位和页面可见字段导出满意度统计。 + * + * @param pageForm 页面排序参数 + * @param sessionId 教代会届次ID + * @param undertakeUnitId 承办单位ID + * @param tableColumns 当前可见字段 + * @param response HTTP 响应,返回 XSSF Excel + */ + @At + @Ok("void") + @SaCheckPermission("proposal.query.underTake.satisfaction") + public void exportCustomAsExcel(@Valid @Param("pageForm") PageForm pageForm, + @Param("sessionId") String sessionId, + @Param("undertakeUnitId") String undertakeUnitId, + @Param("tableColumns") ExportTableColumns[] tableColumns, + HttpServletResponse response) { + proposalCommonService.exportUnderTakeSatisfactionAsExcel( + pageForm, sessionId, undertakeUnitId, tableColumns, response); + } } diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/senior/ProposalExpeditingController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/senior/ProposalExpeditingController.java index c96630de..c0276759 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/senior/ProposalExpeditingController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/senior/ProposalExpeditingController.java @@ -101,7 +101,8 @@ public class ProposalExpeditingController { $condition """); Cnd cnd = Cnd.NEW(); - cnd.and("t.taskName", "in", List.of("master_reply", "slave_reply", "opinion_master_reply")); + // 催办列表只展示现行 WF 承办答复环节中尚未完成的主办、二次答复及意见答复任务。 + cnd.and("t.taskName", "in", List.of("unit_reply", "two_unit_reply", "opinion_unit_reply")); if (!AuthUtil.hasRole(RoleConstant.SYSADMIN.name()) && !AuthUtil.hasRole(RoleConstant.SCHOOL_UNION_ADMIN.name())) { cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId())); diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/senior/ProposalSeniorBasicController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/senior/ProposalSeniorBasicController.java index 6b44aef9..492b2afb 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/senior/ProposalSeniorBasicController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/senior/ProposalSeniorBasicController.java @@ -97,7 +97,7 @@ public class ProposalSeniorBasicController { return Result.error("提案编号已存在"); } - dao.update(proposalInfo,"^code|name|typeId|brief|measures|excerpt|suggestUnits|files$"); + dao.update(proposalInfo,"^code|caseFilingCode|name|typeId|brief|measures|excerpt|suggestUnits|files$"); return Result.success(); } diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalCaseCheckController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalCaseCheckController.java index 6cd1af9a..7581bcd9 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalCaseCheckController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalCaseCheckController.java @@ -1,6 +1,7 @@ package com.budwk.app.zhgh.democratic.proposal.controller.transact; import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaMode; import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.page.Pagination; import com.budwk.app.base.param.ExportTableColumns; @@ -55,8 +56,17 @@ public class ProposalCaseCheckController { public void index() { } + /** + * 打开提案委员会审查手机端列表页。 + */ + @At("/h5") + @Ok("beetl:/platform/zhghh5/democratic/proposal/transact/caseCheck/index.html") + @SaCheckPermission("h5.proposal.caseCheck") + public void h5Index() { + } + @At - @SaCheckPermission("proposal.caseCheck") + @SaCheckPermission(value = {"proposal.caseCheck", "h5.proposal.caseCheck"}, mode = SaMode.OR) @ApiOperation("分页列表") public Result pageData(@Valid ProposalSearchParam pageForm, boolean approval) { Sql sql = Sqls.create(""" @@ -129,7 +139,7 @@ public class ProposalCaseCheckController { } @At - @SaCheckPermission("proposal.caseCheck") + @SaCheckPermission(value = {"proposal.caseCheck", "h5.proposal.caseCheck"}, mode = SaMode.OR) @ApiOperation("查询当前提案承办单位") public Result listReplyUnits(String proposalId) { return Result.success(proposalCaseCheckService.listReplyUnits(proposalId)); diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalCommissionerController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalCommissionerController.java index 91046e88..c4e11b0a 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalCommissionerController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalCommissionerController.java @@ -49,7 +49,6 @@ public class ProposalCommissionerController { public void h5Index() { } - @At @SaCheckPermission("proposal.commissioner") public Result pageData(@Valid ProposalSearchParam pageForm, boolean approval) { diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalCommitteeFilingController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalCommitteeFilingController.java index f3f487a3..1c28eca4 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalCommitteeFilingController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalCommitteeFilingController.java @@ -125,6 +125,17 @@ public class ProposalCommitteeFilingController { proposalCommonService.exportWorkflowList("committeeFiling", pageForm, approval, tableColumns, response); } + @At + @SaCheckPermission("proposal.committeeFiling") + @ApiOperation("执行单案立案审核任务") + @Aop(TransAop.READ_COMMITTED) + public Result executeTask(@Param("data") String data) { + // data 包含流程任务ID、提交类型、立案结果及主协办单位;Service 校验负责人后执行 WF,成功返回统一 Result。 + Dict args = Json.fromJson(Dict.class, data); + proposalCommitteeFilingService.executeFlowTask(args); + return Result.success(); + } + @At @SaCheckPermission("proposal.committeeFiling") @ApiOperation("并案审核") diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalControlController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalControlController.java index 9f77a5ec..ca93d97a 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalControlController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalControlController.java @@ -47,6 +47,7 @@ public class ProposalControlController { @SaCheckPermission("proposal.control") @ApiOperation("分页列表") public Result pageData(@Valid ProposalSearchParam pageForm) { + // 状态调整属于提案业务,只保留能够关联到 proposal_info 的 WF 任务,排除其他业务流程产生的空白行。 Sql sql = Sqls.create(""" SELECT info.*, @@ -72,7 +73,7 @@ public class ProposalControlController { LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id LEFT JOIN wf_process_task nt ON nt.processInstanceId = ins.id AND nt.taskState = 10 - LEFT JOIN proposal_info info ON info.id = ins.businessNo + INNER JOIN proposal_info info ON info.id = ins.businessNo LEFT JOIN proposal_type type ON type.id = info.typeId LEFT JOIN teacher_congress_session tcs ON tcs.id = info.sessionId LEFT JOIN teacher_congress_delegation tcd ON tcd.id = info.delegationId diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalDelegationController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalDelegationController.java index cd024a5a..d2b11aa5 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalDelegationController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalDelegationController.java @@ -4,7 +4,6 @@ import cn.dev33.satoken.annotation.SaCheckPermission; import com.budwk.app.base.annotation.SLog; import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.page.Pagination; -import com.budwk.app.base.param.ExportTableColumns; import com.budwk.app.base.result.Result; import com.budwk.app.base.service.BaseService; import com.budwk.app.bpm.enums.BpmProcessTaskStatusEnum; @@ -30,10 +29,8 @@ import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.Ok; -import org.nutz.mvc.annotation.Param; import javax.validation.Valid; -import javax.servlet.http.HttpServletResponse; import java.util.List; /** @@ -67,7 +64,6 @@ public class ProposalDelegationController { public void h5Index() { } - @At @SaCheckPermission("proposal.delegation") @ApiOperation("分页列表") @@ -129,13 +125,4 @@ public class ProposalDelegationController { return Result.success(pagination); } - @At - @Ok("void") - @SaCheckPermission("proposal.delegation") - @ApiOperation("导出列表") - public void exportList(@Valid @Param("pageForm") ProposalSearchParam pageForm, boolean approval, - @Param("tableColumns") ExportTableColumns[] tableColumns, HttpServletResponse response) { - proposalCommonService.exportWorkflowList("delegation", pageForm, approval, tableColumns, response); - } - } diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalFeedbackEvaluationController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalFeedbackEvaluationController.java index bef308e3..4b1f27f8 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalFeedbackEvaluationController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalFeedbackEvaluationController.java @@ -5,7 +5,6 @@ import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.page.Pagination; -import com.budwk.app.base.param.ExportTableColumns; import com.budwk.app.base.result.Result; import com.budwk.app.flow.entity.ProcessTask; import com.budwk.app.flow.enums.ProcessTaskStateEnum; @@ -27,7 +26,6 @@ import org.nutz.mvc.annotation.Ok; import org.nutz.mvc.annotation.Param; import javax.validation.Valid; -import javax.servlet.http.HttpServletResponse; import java.util.List; @IocBean @@ -54,7 +52,6 @@ public class ProposalFeedbackEvaluationController { public void h5Index() { } - @At @SaCheckPermission("proposal.feedbackEvaluation") @ApiOperation("分页列表") @@ -118,15 +115,6 @@ public class ProposalFeedbackEvaluationController { return Result.success(pagination); } - @At - @Ok("void") - @SaCheckPermission("proposal.feedbackEvaluation") - @ApiOperation("导出列表") - public void exportList(@Valid @Param("pageForm") ProposalSearchParam pageForm, boolean approval, - @Param("tableColumns") ExportTableColumns[] tableColumns, HttpServletResponse response) { - proposalCommonService.exportWorkflowList("feedbackEvaluation", pageForm, approval, tableColumns, response); - } - @At @SaCheckPermission("proposal.feedbackEvaluation") @ApiOperation("获取立案信息") diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalMineController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalMineController.java index f517360f..d77483ac 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalMineController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalMineController.java @@ -103,7 +103,7 @@ public class ProposalMineController { @At("/h5") @Ok("beetl:/platform/zhghh5/democratic/proposal/transact/mine/index.html") - @SaCheckPermission("proposal.mine") + @SaCheckPermission("h5.proposal.mine") public void h5Index() { } @@ -111,6 +111,18 @@ public class ProposalMineController { @SaCheckPermission("proposal.mine") @Aop(TransAop.READ_COMMITTED) public Result pageData(@Valid ProposalSearchParam pageForm, String sessionId) { + return queryPageData(pageForm, sessionId); + } + + /** + * 查询当前登录人的提案分页数据。 + * PC 与 H5 入口共享同一数据范围和排序规则,避免两个端的列表结果不一致。 + * + * @param pageForm 页面筛选及分页参数 + * @param sessionId 教代会届次ID + * @return 当前登录人的提案分页结果 + */ + private Result queryPageData(ProposalSearchParam pageForm, String sessionId) { Sql sql = Sqls.create(""" SELECT info.*, @@ -158,6 +170,20 @@ public class ProposalMineController { return Result.success(pagination); } + /** + * 我的提案 H5 分页列表。 + * H5 使用独立权限标识,但查询口径与 PC 端保持一致。 + * + * @param pageForm 页面筛选及分页参数 + * @param sessionId 教代会届次ID + * @return 当前登录人的提案分页结果 + */ + @At("/h5/pageData") + @SaCheckPermission("h5.proposal.mine") + public Result h5PageData(@Valid ProposalSearchParam pageForm, String sessionId) { + return queryPageData(pageForm, sessionId); + } + @At @SaCheckPermission("proposal.mine") @Aop(TransAop.READ_COMMITTED) diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalPreAuditController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalPreAuditController.java index a2381d9d..498e08e2 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalPreAuditController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalPreAuditController.java @@ -52,6 +52,11 @@ public class ProposalPreAuditController { public void index() { } + @At("/h5") + @Ok("beetl:/platform/zhghh5/democratic/proposal/transact/preAudit/index.html") + @SaCheckPermission("proposal.preAudit") + public void h5Index() { + } @At @SaCheckPermission("proposal.preAudit") diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalSchoolLeaderApprovalController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalSchoolLeaderApprovalController.java index 7561186b..ef9e6101 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalSchoolLeaderApprovalController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalSchoolLeaderApprovalController.java @@ -74,7 +74,6 @@ public class ProposalSchoolLeaderApprovalController { public void h5Index() { } - @At @SaCheckPermission("proposal.schoolLeaderApproval") @ApiOperation("分页列表") diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalSecondedController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalSecondedController.java index b54cb81a..ddd1f3c3 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalSecondedController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalSecondedController.java @@ -84,13 +84,25 @@ public class ProposalSecondedController { @At("/h5") @Ok("beetl:/platform/zhghh5/democratic/proposal/transact/seconded/index.html") - @SaCheckPermission("proposal.seconded") + @SaCheckPermission("h5.proposal.seconded") public void h5Index() { } @At @SaCheckPermission("proposal.seconded") public Result pageData(@Valid ProposalSearchParam pageForm, boolean approval) { + return queryPageData(pageForm, approval); + } + + /** + * 查询当前登录附议人的提案分页数据。 + * PC 与 H5 入口共享同一待附议、已附议筛选口径。 + * + * @param pageForm 页面筛选及分页参数 + * @param approval 是否查询已附议记录 + * @return 附议提案分页结果 + */ + private Result queryPageData(ProposalSearchParam pageForm, boolean approval) { Sql sql = Sqls.create(""" SELECT info.*, @@ -122,6 +134,9 @@ public class ProposalSecondedController { LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id LEFT JOIN wf_process_task nt ON nt.processInstanceId = ins.id AND nt.taskState = 10 + LEFT JOIN wf_process_task dt ON dt.processInstanceId = ins.id + AND dt.taskName = 'delegation' AND dt.taskState = 20 + AND (dt.variable ->> '$.submitType') IN ('1', '2') LEFT JOIN wf_process_task rt ON rt.processInstanceId = ins.id AND rt.taskParentId = t.id AND rt.taskState = 10 LEFT JOIN proposal_info info ON info.id = ins.businessNo LEFT JOIN proposal_second ps ON ps.proposalId = info.id AND ps.seconderId = @seconderId @@ -145,6 +160,8 @@ public class ProposalSecondedController { } else { // 未附议页签只展示当前登录附议人尚未处理的记录。 cnd.and("ps.isAgree", "is", null); + // 团长选择同意或不同意后均截止附议;退回提案人不视为最终审核结果。 + cnd.and("dt.id", "is", null); // 待附议列表只展示两类任务: // 1. invite / second 节点任务 // 2. delegation / committee 节点,且任务状态必须是已废弃(99) @@ -165,6 +182,20 @@ public class ProposalSecondedController { return Result.success(pagination); } + /** + * 提案附议 H5 分页列表。 + * H5 使用独立权限标识,但查询口径与 PC 端保持一致。 + * + * @param pageForm 页面筛选及分页参数 + * @param approval 是否查询已附议记录 + * @return 附议提案分页结果 + */ + @At("/h5/pageData") + @SaCheckPermission("h5.proposal.seconded") + public Result h5PageData(@Valid ProposalSearchParam pageForm, boolean approval) { + return queryPageData(pageForm, approval); + } + @At @SaCheckPermission("proposal.seconded") @Aop(TransAop.READ_COMMITTED) @@ -190,6 +221,9 @@ public class ProposalSecondedController { if (Strings.isBlank(proposalId) || Strings.isBlank(taskActorUserId) || taskId == null || submitType == null) { return Result.error("参数错误"); } + if (proposalSecondedService.isDelegationReviewed(proposalId)) { + return Result.error("团长已完成审核,当前提案不能继续附议"); + } // 先定位 wf_process_task,确保本次请求能准确命中需要完成的附议任务,再更新两张业务表。 ProcessTask processTask = this.getSecondTask(taskId, taskActorUserId); @@ -268,6 +302,9 @@ public class ProposalSecondedController { if (args.getLong("processTaskId") == null || Strings.isBlank(proposalId) || Strings.isBlank(taskActorUserId) || submitType == null) { return Result.error("参数错误"); } + if (proposalSecondedService.isDelegationReviewed(proposalId)) { + return Result.error("团长已完成审核,当前提案不能继续附议"); + } flowCommonService.executeTask(args); proposalSecondedService.updateSecondRecord(proposalId, taskActorUserId, opinion, submitType); return Result.success(); diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalUnderTakeReplyController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalUnderTakeReplyController.java index 47e4a5d8..53f9cb7c 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalUnderTakeReplyController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalUnderTakeReplyController.java @@ -5,7 +5,6 @@ import cn.hutool.core.lang.Dict; import cn.hutool.core.util.ObjectUtil; import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.page.Pagination; -import com.budwk.app.base.param.ExportTableColumns; import com.budwk.app.base.result.Result; import com.budwk.app.flow.entity.ProcessTask; import com.budwk.app.flow.enums.ProcessTaskStateEnum; @@ -38,7 +37,6 @@ import org.nutz.mvc.annotation.Ok; import org.nutz.mvc.annotation.Param; import javax.validation.Valid; -import javax.servlet.http.HttpServletResponse; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import java.util.List; @@ -172,15 +170,6 @@ public class ProposalUnderTakeReplyController { return Result.success(pagination); } - @At - @Ok("void") - @SaCheckPermission("proposal.unitReply") - @ApiOperation("导出列表") - public void exportList(@Valid @Param("pageForm") ProposalSearchParam pageForm, boolean approval, - @Param("tableColumns") ExportTableColumns[] tableColumns, HttpServletResponse response) { - proposalCommonService.exportWorkflowList("unitReply", pageForm, approval, tableColumns, response); - } - /** * 承办单位答复节点撤回需要基于整组当前节点判断。 * 只有“当前流程正在办理的节点”和“这条列表记录所属节点”完全一致时,才允许撤回; diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/interceptor/ProposalCaseFilingInterceptor.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/interceptor/ProposalCaseFilingInterceptor.java index 5c3a1553..4a5e8767 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/interceptor/ProposalCaseFilingInterceptor.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/interceptor/ProposalCaseFilingInterceptor.java @@ -73,6 +73,10 @@ public class ProposalCaseFilingInterceptor implements FlowInterceptor { Dict dict = JSONUtil.toBean(processTask.getVariable(), Dict.class); dict.set(FlowConst.TASK_FORM_DATA_PREFIX + "helpunitreply", helpUnitReply); processTask.setVariable(JSONUtil.toJsonStr(dict)); - dao.update(processTask); + /* + * 当前任务对象是在任务完成前加载的,其中 finishTime、operator 仍为空。 + * 这里只更新拦截器实际修改的流程变量,避免整行更新覆盖 WF 已写入的办理时间和办理人。 + */ + dao.update(processTask, "variable"); } } diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/models/ProposalReplyUnit.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/models/ProposalReplyUnit.java index 25b72013..f539828a 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/models/ProposalReplyUnit.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/models/ProposalReplyUnit.java @@ -12,6 +12,9 @@ import org.nutz.dao.interceptor.annotation.PrevInsert; @Accessors(chain = true) @Table("proposal_reply_unit") @TableMeta("{'mysql-charset':'utf8mb4'}") +@TableIndexes({ + @Index(name = "INDEX_PROPOSAL_REPLY_UNIT_PROPOSAL_UNIT", fields = {"proposalId", "unitId"}, unique = false) +}) @Comment("提案信息") public class ProposalReplyUnit extends BaseModel { diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/param/ProposalQueryComprehensiveParam.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/param/ProposalQueryComprehensiveParam.java index f3776cfc..db266a56 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/param/ProposalQueryComprehensiveParam.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/param/ProposalQueryComprehensiveParam.java @@ -19,6 +19,8 @@ public class ProposalQueryComprehensiveParam extends PageForm { private String name; @ApiModelProperty(name = "提案编号") private String code; + @ApiModelProperty(name = "立案编号") + private String caseFilingCode; @ApiModelProperty(name = "教代会ID") private String sessionId; @ApiModelProperty(name = "search session id") @@ -61,15 +63,22 @@ public class ProposalQueryComprehensiveParam extends PageForm { @ApiModelProperty(name = "通用关键字") private String commonKeyword; + @ApiModelProperty(name = "提案名称或编号搜索字段,仅支持name、code、caseFilingCode") + private String proposalSearchField; + + @ApiModelProperty(name = "提案名称或编号搜索内容") + private String proposalKeyword; + @ApiModelProperty(name = "搜索关键字") private String createUserKeyword; /** - * 构建通用查询参数 + * 将综合查询参数追加到查询条件中,无返回值,处理结果直接写入 cnd。 * - * @param cnd cnd - * @param searchParam searchParam + * @param cnd 查询条件容器,用于接收届次、名称/编号、提案人、组织及立案条件 + * @param searchParam 页面查询参数;proposalSearchField 传 name、code 或 caseFilingCode, + * proposalKeyword 传对应字段的模糊搜索内容 */ public static void buildSearch(Cnd cnd, ProposalQueryComprehensiveParam searchParam) { if (cnd == null) { @@ -84,6 +93,19 @@ public class ProposalQueryComprehensiveParam extends PageForm { // Isolated single-session filter for pages that should not reuse sessionId semantics. cnd.andEX("info.sessionId", "=", searchParam.getSearchSessionId()); + // 名称/编号组合搜索仅允许三个固定字段,前端提交值不能直接作为SQL字段使用。 + if (StrUtil.isNotBlank(searchParam.getProposalKeyword())) { + String proposalSearchColumn = switch (StrUtil.blankToDefault(searchParam.getProposalSearchField(), "name")) { + case "name" -> "info.name"; + case "code" -> "info.code"; + case "caseFilingCode" -> "info.caseFilingCode"; + default -> null; + }; + if (proposalSearchColumn != null) { + cnd.where().andLike(proposalSearchColumn, searchParam.getProposalKeyword()); + } + } + //提案名称 if (StrUtil.isNotBlank(searchParam.getName())) { cnd.where().andLike("info.name", searchParam.getName()); @@ -92,6 +114,10 @@ public class ProposalQueryComprehensiveParam extends PageForm { if (StrUtil.isNotBlank(searchParam.getCode())) { cnd.where().andLike("info.code", searchParam.getCode()); } + // 立案编号由立案环节生成,支持按已生成编号进行模糊检索。 + if (StrUtil.isNotBlank(searchParam.getCaseFilingCode())) { + cnd.where().andLike("info.caseFilingCode", searchParam.getCaseFilingCode()); + } //代表团ID cnd.andEX("info.delegationId", "=", searchParam.getDelegationId()); if (StrUtil.isNotBlank(searchParam.getCreateUserName())) { diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/param/ProposalSearchParam.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/param/ProposalSearchParam.java index 4694ac8b..0b94239e 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/param/ProposalSearchParam.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/param/ProposalSearchParam.java @@ -24,17 +24,34 @@ public class ProposalSearchParam extends PageForm { private String createUserLoginName; private String createUserKeyword; private String caseFilingResult; + /** 名称/编号组合搜索字段,仅支持 name、code、caseFilingCode。 */ + private String proposalSearchField; + /** 名称/编号组合搜索内容。 */ + private String proposalKeyword; /** - * 构建通用查询参数 + * 将提案列表参数追加到查询条件中,无返回值,处理结果直接写入 cnd。 * - * @param cnd cnd - * @param searchParam searchParam + * @param cnd 查询条件容器,用于接收名称/编号、届次、提案人及立案结果条件 + * @param searchParam 页面查询参数;proposalSearchField 传 name、code 或 caseFilingCode, + * proposalKeyword 传对应字段的模糊搜索内容 */ public static void buildSearch(Cnd cnd, ProposalSearchParam searchParam) { if (cnd == null) { cnd = Cnd.NEW(); } + // 搜索字段通过固定白名单转换,禁止把前端字段名直接用于SQL条件。 + if (StrUtil.isNotBlank(searchParam.getProposalKeyword())) { + String proposalSearchColumn = switch (StrUtil.blankToDefault(searchParam.getProposalSearchField(), "name")) { + case "name" -> "info.name"; + case "code" -> "info.code"; + case "caseFilingCode" -> "info.caseFilingCode"; + default -> null; + }; + if (proposalSearchColumn != null) { + cnd.where().andLike(proposalSearchColumn, searchParam.getProposalKeyword()); + } + } if (StrUtil.isNotBlank(searchParam.getName())) { cnd.where().andLike("info.name", searchParam.getName()); } diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/ProposalCommitteeFilingService.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/ProposalCommitteeFilingService.java index e7402f76..2f3138cb 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/ProposalCommitteeFilingService.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/ProposalCommitteeFilingService.java @@ -6,6 +6,15 @@ import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo; public interface ProposalCommitteeFilingService extends BaseService { + /** + * 提案委员会单案立案审核。 + * 正常提交确认立案或工作建议时,先校验所选承办单位是否均已配置负责人,再执行 WF 流程任务。 + * + * @param args 页面提交的流程参数,包括 processTaskId、submitType、tf_caseFilingResult、 + * tf_masterUnitIds、tf_slaveUnitIds 等字段;方法无返回值,校验失败时抛出业务异常 + */ + void executeFlowTask(Dict args); + /** * 提案委员会并案审核。 * diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/ProposalSecondedService.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/ProposalSecondedService.java index fcef3ce8..4edba6aa 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/ProposalSecondedService.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/ProposalSecondedService.java @@ -5,6 +5,14 @@ import com.budwk.app.zhgh.democratic.proposal.models.ProposalSecond; public interface ProposalSecondedService extends BaseService { + /** + * 判断团长是否已经对当前提案作出同意或不同意的审核结果。 + * + * @param proposalId 提案ID,用于定位当前提案对应的最新工作流实例 + * @return true 表示团长已同意或不同意,不能继续附议;false 表示仍可按原流程附议 + */ + boolean isDelegationReviewed(String proposalId); + /** * 仅更新附议表 proposal_second 中当前附议人的附议结果。 * 参数说明: diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/common/ProposalCommonService.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/common/ProposalCommonService.java index 207a0ade..3ee2de78 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/common/ProposalCommonService.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/common/ProposalCommonService.java @@ -5,7 +5,9 @@ import com.budwk.app.base.param.PageForm; import com.budwk.app.base.param.ExportTableColumns; import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo; import com.budwk.app.zhgh.democratic.proposal.models.ProposalUndertake; +import com.budwk.app.zhgh.democratic.proposal.param.ProposalQueryComprehensiveParam; import com.budwk.app.zhgh.democratic.proposal.param.ProposalSearchParam; +import com.budwk.app.base.page.Pagination; import org.nutz.dao.Cnd; import org.nutz.lang.util.NutMap; @@ -171,4 +173,119 @@ public interface ProposalCommonService extends BaseService { * 修改提案状态码 */ void updateStateCode(String id, Integer stateCode); + + /** + * 分页查询提案综合列表。 + * + * @param pageForm 综合查询页面提交的筛选、排序和分页参数;origins 指定通用关键字的检索范围, + * commonKeyword 为通用关键字,其余字段对应页面各独立筛选项 + * @return Pagination 分页结果,list 中每项包含提案、流程状态、当前节点及承办单位汇总字段 + */ + Pagination queryComprehensive(ProposalQueryComprehensiveParam pageForm); + + /** + * 按综合查询页面当前筛选条件和可见字段导出 Excel。 + * + * @param pageForm 综合查询页面提交的筛选和排序参数;导出全部匹配记录,不受当前分页限制 + * @param tableColumns 列设置中当前可见的字段,数组顺序即 Excel 列顺序 + * @param response HTTP 响应,方法直接输出 XSSF 格式的 Excel 文件 + */ + void exportComprehensiveAsExcel(ProposalQueryComprehensiveParam pageForm, + ExportTableColumns[] tableColumns, HttpServletResponse response); + + /** + * 查询提案征集进度列表。 + * 查询结果与页面既有筛选、排序语义保持一致,内部使用聚合关联避免逐行执行统计子查询。 + * + * @param pageForm 征集进度页面的筛选、排序和分页参数 + * @return 包含征集进度统计字段的分页结果 + */ + Pagination queryCollectProgress(ProposalQueryComprehensiveParam pageForm); + + /** + * 按征集进度页面当前筛选条件和可见字段导出 Excel。 + * + * @param pageForm 征集进度页面筛选及排序参数,导出全部匹配记录 + * @param tableColumns 列设置中当前可见字段,数组顺序即 Excel 列顺序 + * @param response HTTP 响应,方法直接输出 XSSF Excel + */ + void exportCollectProgressAsExcel(ProposalQueryComprehensiveParam pageForm, + ExportTableColumns[] tableColumns, HttpServletResponse response); + + /** + * 查询指定届次的代表团提案统计。 + * + * @param pageForm 排序参数 + * @param sessionId 教代会届次ID + * @return 代表团统计行,包含动态立案结果数量和立案率计算字段 + */ + List queryDelegationStatistics(PageForm pageForm, String sessionId); + + /** + * 导出代表团提案统计。 + * + * @param pageForm 当前排序参数 + * @param sessionId 教代会届次ID + * @param tableColumns 当前可见统计字段 + * @param response HTTP 响应,方法直接输出 XSSF Excel + */ + void exportDelegationStatisticsAsExcel(PageForm pageForm, String sessionId, + ExportTableColumns[] tableColumns, HttpServletResponse response); + + /** + * 查询承办单位办理统计。 + * + * @param pageForm 排序参数 + * @param sessionId 教代会届次ID + * @param undertakeUnitId 承办单位ID,为空时统计全部单位 + * @param caseFilingResult 立案结果编码,为空时不限制 + * @return NutMap,tableData 为统计行,slaveNeedReply 表示协办单位是否需要答复 + */ + NutMap queryUnitReplyStatistics(PageForm pageForm, String sessionId, + String undertakeUnitId, String caseFilingResult); + + /** + * 导出承办单位办理统计。 + * + * @param pageForm 当前排序参数 + * @param sessionId 教代会届次ID + * @param undertakeUnitId 承办单位ID + * @param caseFilingResult 立案结果编码 + * @param tableColumns 当前可见统计字段 + * @param response HTTP 响应,方法直接输出 XSSF Excel + */ + void exportUnitReplyStatisticsAsExcel(PageForm pageForm, String sessionId, String undertakeUnitId, + String caseFilingResult, ExportTableColumns[] tableColumns, + HttpServletResponse response); + + /** + * 查询承办单位满意度统计。 + * + * @param pageForm 排序参数 + * @param sessionId 教代会届次ID + * @param undertakeUnitId 承办单位ID,为空时统计全部单位 + * @return 满意度统计行,动态满意度字段使用字典编码作为键 + */ + List queryUnderTakeSatisfactionStatistics(PageForm pageForm, String sessionId, + String undertakeUnitId); + + /** + * 导出承办单位满意度统计。 + * + * @param pageForm 当前排序参数 + * @param sessionId 教代会届次ID + * @param undertakeUnitId 承办单位ID + * @param tableColumns 当前可见统计字段 + * @param response HTTP 响应,方法直接输出 XSSF Excel + */ + void exportUnderTakeSatisfactionAsExcel(PageForm pageForm, String sessionId, String undertakeUnitId, + ExportTableColumns[] tableColumns, HttpServletResponse response); + + /** + * 按提案去重统计指定届次各流程节点的待办和已办数量。 + * + * @param sessionId 教代会届次ID + * @return 键为流程节点编码、值为待办和已办数量的统计结果 + */ + Map countDashboardTaskProposals(String sessionId); } diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/common/ProposalCommonServiceImpl.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/common/ProposalCommonServiceImpl.java index b19294ff..c7b1ff71 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/common/ProposalCommonServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/common/ProposalCommonServiceImpl.java @@ -3,6 +3,7 @@ package com.budwk.app.zhgh.democratic.proposal.service.common; import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Dict; import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; @@ -15,6 +16,7 @@ import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.exception.BaseException; import com.budwk.app.base.param.ExportTableColumns; import com.budwk.app.base.param.PageForm; +import com.budwk.app.base.page.Pagination; import com.budwk.app.base.service.impl.BaseServiceImpl; import com.budwk.app.base.utils.CommonDownloadUtil; import com.budwk.app.base.utils.PageUtil; @@ -56,6 +58,7 @@ import org.nutz.dao.FieldFilter; import org.nutz.dao.Sqls; import org.nutz.dao.sql.Sql; import org.nutz.dao.util.Daos; +import org.nutz.dao.util.cri.SqlExpressionGroup; import org.nutz.dao.util.cri.Static; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; @@ -79,12 +82,99 @@ import java.util.stream.Collectors; @IocBean(args = {"refer:dao"}) public class ProposalCommonServiceImpl extends BaseServiceImpl implements ProposalCommonService { + /** 确定立案提案的 Word 模板编码。 */ + private static final String PROPOSAL_CONFIRM_FILING_TEMPLATE_CODE = "proposal_confirm_filing"; + + /** 工作建议提案的 Word 模板编码。 */ + private static final String PROPOSAL_SUGGESTION_TEMPLATE_CODE = "proposal_suggestion"; + + /** 不予立案提案的 Word 模板编码。 */ + private static final String PROPOSAL_NOT_TEMPLATE_CODE = "proposal_not"; + + /** 历史提案立案结果为空或无法识别时使用的原 Word 模板编码。 */ + private static final String PROPOSAL_DEFAULT_TEMPLATE_CODE = "proposal"; + /** PC端提案列表页面的排序字段白名单,页面代码由对应Controller固定传入。 */ private static final Map> PROPOSAL_LIST_ORDER_COLUMNS = createProposalListOrderColumns(); /** 办理页面允许导出的列表字段,避免请求参数携带非页面字段。 */ private static final Map> WORKFLOW_EXPORT_COLUMNS = createWorkflowExportColumns(); + /** 征集进度页面允许排序的字段,避免排序参数直接拼接到SQL。 */ + private static final Map COLLECT_PROGRESS_ORDER_COLUMNS = Map.ofEntries( + Map.entry("code", "info.code"), + Map.entry("caseFilingCode", "info.caseFilingCode"), + Map.entry("name", "info.name"), + Map.entry("createUserName", "info.createUserName"), + Map.entry("delegationName", "delegationName"), + Map.entry("inviteCount", "inviteCount"), + Map.entry("finishCount", "finishCount"), + Map.entry("curTaskName", "curTaskName"), + Map.entry("instanceState", "instanceState") + ); + + /** 征集进度页面允许自定义导出的字段及固定表头。 */ + private static final Map COLLECT_PROGRESS_EXPORT_COLUMNS = Map.ofEntries( + Map.entry("code", "提案编号"), + Map.entry("caseFilingCode", "立案编号"), + Map.entry("name", "提案名称"), + Map.entry("createUserName", "提案人"), + Map.entry("delegationName", "代表团"), + Map.entry("inviteCount", "邀请附议人数"), + Map.entry("finishCount", "已附议人数"), + Map.entry("curTaskName", "当前节点"), + Map.entry("instanceState", "流程状态") + ); + + /** 代表团统计固定字段的安全排序映射,动态立案结果字段由后端字典追加。 */ + private static final Map DELEGATION_SUMMARY_ORDER_COLUMNS = Map.of( + "dbtName", "dbt.name", + "TOTAL", "TOTAL", + "caseRate", "caseRateOrder" + ); + + /** 承办单位办理统计允许排序的字段白名单。 */ + private static final Set UNIT_REPLY_ORDER_COLUMNS = Set.of( + "unitName", "sum", "masterSum", "masterReplySum", "masterNoReplySum", + "slaveSum", "slaveReplySum", "slaveNoReplySum" + ); + + /** 满意度统计固定字段的排序白名单,动态满意度字段由后端字典追加。 */ + private static final Set SATISFACTION_ORDER_COLUMNS = Set.of( + "unitName", "sum", "masterSum", "slaveSum" + ); + + /** 综合查询页面允许排序的字段,避免前端排序参数直接进入SQL。 */ + private static final Map COMPREHENSIVE_ORDER_COLUMNS = Map.ofEntries( + Map.entry("code", "info.code"), + Map.entry("caseFilingCode", "info.caseFilingCode"), + Map.entry("name", "info.name"), + Map.entry("createUserName", "info.createUserName"), + Map.entry("typeName", "typeName"), + Map.entry("delegationName", "delegationName"), + Map.entry("caseFilingResult", "info.caseFilingResult"), + Map.entry("caseFilingType", "info.caseFilingType"), + Map.entry("merge", "merge"), + Map.entry("undertakeUnits", "undertakeUnitsOrder"), + Map.entry("curTaskName", "curTaskName"), + Map.entry("instanceState", "instanceState") + ); + + /** 综合查询页面允许自定义导出的字段及固定表头,防止请求伪造页面外字段。 */ + private static final Map COMPREHENSIVE_EXPORT_COLUMNS = Map.ofEntries( + Map.entry("code", "提案编号"), + Map.entry("caseFilingCode", "立案编号"), + Map.entry("name", "提案名称"), + Map.entry("createUserName", "提案人"), + Map.entry("typeName", "提案类别"), + Map.entry("delegationName", "代表团"), + Map.entry("caseFilingResult", "立案结果"), + Map.entry("merge", "是否并案"), + Map.entry("undertakeUnits", "承办单位"), + Map.entry("curTaskName", "当前节点"), + Map.entry("instanceState", "流程状态") + ); + //找出富文本里面上传的图片 static String IMG_SRC_REGEX = "]*src\\s*=\\s*([\"'])(/platform/sys/file/download\\?id=.*?)\\1[^>]*>"; @@ -107,6 +197,671 @@ public class ProposalCommonServiceImpl extends BaseServiceImpl imp super(dao); } + /** + * 分页查询提案综合列表。 + * 普通查询不关联历史任务表;仅在 origins 包含 answer 且 commonKeyword 非空时, + * 才关联答复任务变量,避免每条提案与全部历史任务产生大量中间结果。 + * + * @param pageForm 综合查询页面的筛选、排序和分页参数 + * @return 包含提案基本信息、流程状态和承办单位汇总字段的分页结果 + */ + @Override + public Pagination queryComprehensive(ProposalQueryComprehensiveParam pageForm) { + boolean searchAnswer = ArrayUtil.contains(pageForm.getOrigins(), "answer") + && StrUtil.isNotBlank(pageForm.getCommonKeyword()); + String answerTaskJoin = searchAnswer + ? "LEFT JOIN wf_process_task replyTask ON replyTask.processInstanceId = ins.id" + : ""; + + Sql sql = Sqls.create(""" + SELECT + info.*, + IF(mer.proposalId IS NOT NULL, 1, 0) AS merge, + type.name AS typeName, + tcs.fullName AS sessionName, + tcd.`name` AS delegationName, + ins.id AS instanceId, + ins.businessNo, + ins.state AS instanceState, + ins.variable AS instanceVariable, + ins.processDefineId AS instanceProcessDefineId, + t.displayName AS curTaskName, + GROUP_CONCAT(DISTINCT CASE WHEN pru.isMaster = 1 THEN pru.unitName END) AS masterUnitName, + GROUP_CONCAT(DISTINCT CASE WHEN pru.isMaster = 0 THEN pru.unitName END) AS slaveUnitNames, + GROUP_CONCAT(DISTINCT pru.unitName ORDER BY pru.isMaster DESC, pru.unitName) AS undertakeUnitsOrder + FROM proposal_info info + LEFT JOIN proposal_type type ON type.id = info.typeId + LEFT JOIN proposal_merge mer ON mer.proposalId = info.id + LEFT JOIN teacher_congress_session tcs ON tcs.id = info.sessionId + LEFT JOIN teacher_congress_delegation tcd ON tcd.id = info.delegationId + LEFT JOIN teacher_congress_delegate tcde + ON tcde.loginName = info.createUserLoginName AND tcde.sessionId = info.sessionId + LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id + LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10 + LEFT JOIN proposal_reply_unit pru ON pru.proposalId = info.id + %s + $condition + """.formatted(answerTaskJoin)); + Cnd dataCnd = buildComprehensiveCondition(pageForm, searchAnswer); + dataCnd.groupBy("info.id"); + applySafePageOrder(dataCnd, pageForm, COMPREHENSIVE_ORDER_COLUMNS); + sql.setCondition(dataCnd); + + // 总数查询只保留筛选需要的表,不重复执行列表字段聚合和排序。 + String countDelegateJoin = StrUtil.isNotBlank(pageForm.getUnionId()) || StrUtil.isNotBlank(pageForm.getUnitId()) + ? "LEFT JOIN teacher_congress_delegate tcde ON tcde.loginName = info.createUserLoginName AND tcde.sessionId = info.sessionId" + : ""; + String countInstanceJoin = searchAnswer + ? "LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id" + : ""; + String countReplyUnitJoin = StrUtil.isNotBlank(pageForm.getUnderTakeUnitId()) + ? "LEFT JOIN proposal_reply_unit pru ON pru.proposalId = info.id" + : ""; + Sql countSql = Sqls.create(""" + SELECT COUNT(DISTINCT info.id) + FROM proposal_info info + %s + %s + %s + %s + $condition + """.formatted(countDelegateJoin, countInstanceJoin, countReplyUnitJoin, answerTaskJoin)); + countSql.setCondition(buildComprehensiveCondition(pageForm, searchAnswer)); + return listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql, countSql); + } + + /** + * 按综合查询页面当前筛选条件和列设置导出 Excel。 + * 查询条件与分页列表共用 buildComprehensiveCondition,确保届次、组织及万能搜索口径一致; + * tableColumns 只决定导出字段和顺序,不参与 SQL 字段拼接。 + * + * @param pageForm 综合查询页面筛选及排序参数,导出不受分页参数限制 + * @param tableColumns 列设置中当前可见字段,数组顺序即 Excel 列顺序 + * @param response HTTP 响应,返回 XSSF 格式的 Excel 文件 + */ + @Override + public void exportComprehensiveAsExcel(ProposalQueryComprehensiveParam pageForm, + ExportTableColumns[] tableColumns, HttpServletResponse response) { + List exportColumns = getComprehensiveExportColumns(tableColumns); + if (exportColumns.isEmpty()) { + throw new BaseException("请至少选择一个导出字段"); + } + + boolean searchAnswer = ArrayUtil.contains(pageForm.getOrigins(), "answer") + && StrUtil.isNotBlank(pageForm.getCommonKeyword()); + String answerTaskJoin = searchAnswer + ? "LEFT JOIN wf_process_task replyTask ON replyTask.processInstanceId = ins.id" + : ""; + Sql sql = Sqls.create(""" + SELECT + info.*, + IF(mer.proposalId IS NOT NULL, 1, 0) AS merge, + type.name AS typeName, + tcs.fullName AS sessionName, + tcd.`name` AS delegationName, + ins.state AS instanceState, + t.displayName AS curTaskName, + GROUP_CONCAT(DISTINCT CASE WHEN pru.isMaster = 1 THEN pru.unitName END) AS masterUnitName, + GROUP_CONCAT(DISTINCT CASE WHEN pru.isMaster = 0 THEN pru.unitName END) AS slaveUnitNames, + GROUP_CONCAT(DISTINCT pru.unitName ORDER BY pru.isMaster DESC, pru.unitName) AS undertakeUnitsOrder + FROM proposal_info info + LEFT JOIN proposal_type type ON type.id = info.typeId + LEFT JOIN proposal_merge mer ON mer.proposalId = info.id + LEFT JOIN teacher_congress_session tcs ON tcs.id = info.sessionId + LEFT JOIN teacher_congress_delegation tcd ON tcd.id = info.delegationId + LEFT JOIN teacher_congress_delegate tcde + ON tcde.loginName = info.createUserLoginName AND tcde.sessionId = info.sessionId + LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id + LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10 + LEFT JOIN proposal_reply_unit pru ON pru.proposalId = info.id + %s + $condition + """.formatted(answerTaskJoin)); + Cnd cnd = buildComprehensiveCondition(pageForm, searchAnswer); + cnd.groupBy("info.id"); + applySafePageOrder(cnd, pageForm, COMPREHENSIVE_ORDER_COLUMNS); + sql.setCondition(cnd); + List rows = listMap(sql); + if (rows.isEmpty()) { + throw new BaseException("当前筛选条件下没有可导出的提案数据"); + } + convertComprehensiveExportValues(rows); + + List excelColumns = exportColumns.stream() + .map(column -> new ExcelExportEntity(column.getLabel(), column.getProp(), 20)) + .collect(Collectors.toList()); + ExportParams exportParams = new ExportParams(); + exportParams.setType(ExcelType.XSSF); + exportParams.setTitle("提案综合查询"); + Workbook workbook = ExcelExportUtil.exportExcel(exportParams, excelColumns, rows); + CommonDownloadUtil.download("提案综合查询.xlsx", workbook, response); + } + + /** + * 按页面字段白名单过滤导出列,并使用后端固定表头,避免伪造字段或重复字段进入 Excel。 + * + * @param tableColumns 页面提交的当前可见列 + * @return 校验后的导出列,保持页面列设置顺序 + */ + private List getComprehensiveExportColumns(ExportTableColumns[] tableColumns) { + if (ArrayUtil.isEmpty(tableColumns)) { + return List.of(); + } + List exportColumns = new ArrayList<>(); + Set selectedProps = new HashSet<>(); + for (ExportTableColumns column : tableColumns) { + if (column == null || !COMPREHENSIVE_EXPORT_COLUMNS.containsKey(column.getProp()) + || !selectedProps.add(column.getProp())) { + continue; + } + ExportTableColumns safeColumn = new ExportTableColumns(); + safeColumn.setProp(column.getProp()); + safeColumn.setLabel(COMPREHENSIVE_EXPORT_COLUMNS.get(column.getProp())); + exportColumns.add(safeColumn); + } + return exportColumns; + } + + /** 将字典、枚举及组合字段转换为与综合查询列表一致的展示文本。 */ + private void convertComprehensiveExportValues(List rows) { + Map caseFilingResultMap = sysDictService.getSubListByCode("PROPOSAL_CASE_FILING_RESULT") + .stream().collect(Collectors.toMap(Sys_dict::getCode, Sys_dict::getName)); + Map processStateMap = Arrays.stream(ProcessInstanceStateEnum.values()) + .collect(Collectors.toMap(ProcessInstanceStateEnum::getCode, ProcessInstanceStateEnum::getMessage)); + for (NutMap row : rows) { + // 承办单位必须在立案结果转换为中文前拼接,否则无法判断立案与建议两种展示口径。 + row.put("undertakeUnits", formatUndertakeUnits(row)); + row.put("merge", row.getInt("merge", 0) == 1 ? "是" : "否"); + String caseFilingResult = row.getString("caseFilingResult"); + row.put("caseFilingResult", caseFilingResultMap.getOrDefault(caseFilingResult, caseFilingResult)); + Integer instanceState = row.getInt("instanceState"); + row.put("instanceState", processStateMap.getOrDefault(instanceState, row.getString("instanceState"))); + } + } + + /** + * 构建综合列表和总数查询共用的筛选条件,保证分页总数与列表数据范围一致。 + * 通用关键字中的多个词沿用原页面的 OR 关系;未选择检索范围或关键字为空时不追加条件。 + * + * @param pageForm 综合查询页面筛选参数 + * @param searchAnswer 是否需要检索工作流任务变量中的答复内容 + * @return 不包含分组和排序的查询条件 + */ + private Cnd buildComprehensiveCondition(ProposalQueryComprehensiveParam pageForm, boolean searchAnswer) { + Cnd cnd = Cnd.NEW(); + if (ArrayUtil.isNotEmpty(pageForm.getOrigins()) && StrUtil.isNotBlank(pageForm.getCommonKeyword())) { + SqlExpressionGroup keywordCondition = new SqlExpressionGroup(); + for (String keyword : pageForm.getCommonKeyword().split(" ")) { + if (ArrayUtil.contains(pageForm.getOrigins(), "name")) { + keywordCondition.orLike("info.name", keyword); + } + if (ArrayUtil.contains(pageForm.getOrigins(), "brief")) { + keywordCondition.orLike("info.brief", keyword); + } + if (ArrayUtil.contains(pageForm.getOrigins(), "createUserName")) { + keywordCondition.orLike("info.createUserName", keyword); + keywordCondition.orLike("info.createUserLoginName", keyword); + } + // 立案编号由立案环节生成,选中该搜索来源时按编号进行模糊匹配。 + if (ArrayUtil.contains(pageForm.getOrigins(), "caseFilingCode")) { + keywordCondition.orLike("info.caseFilingCode", keyword); + } + if (searchAnswer) { + keywordCondition.orLike("JSON_EXTRACT(replyTask.variable,'$.tf_opinion')", keyword); + } + } + if (!keywordCondition.isEmpty()) { + cnd.and(keywordCondition); + } + } + ProposalQueryComprehensiveParam.buildSearch(cnd, pageForm); + return cnd; + } + + /** + * 分页查询提案征集进度。 + * 附议人数和已附议人数使用分组结果关联,避免原查询对每一条提案重复执行统计子查询; + * 总数查询只保留筛选所需关联,避免分页统计重复执行列表中的统计计算。 + * + * @param pageForm 页面筛选、排序和分页参数 + * @return 征集进度分页数据 + */ + @Override + public Pagination queryCollectProgress(ProposalQueryComprehensiveParam pageForm) { + Sql sql = buildCollectProgressListSql(pageForm); + + Sql countSql = Sqls.create(""" + SELECT COUNT(DISTINCT info.id) + FROM proposal_info info + LEFT JOIN teacher_congress_delegate tcde ON tcde.loginName = info.createUserLoginName + LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id + LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10 + $condition + """); + countSql.setCondition(buildCollectProgressCondition(pageForm)); + return listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql, countSql); + } + + /** + * 按征集进度页面当前筛选条件和可见字段导出全部匹配数据。 + * + * @param pageForm 页面筛选及排序参数 + * @param tableColumns 当前可见字段,顺序即 Excel 列顺序 + * @param response HTTP 响应,直接输出 XSSF Excel + */ + @Override + public void exportCollectProgressAsExcel(ProposalQueryComprehensiveParam pageForm, + ExportTableColumns[] tableColumns, HttpServletResponse response) { + List rows = listMap(buildCollectProgressListSql(pageForm)); + Map processStateMap = Arrays.stream(ProcessInstanceStateEnum.values()) + .collect(Collectors.toMap(ProcessInstanceStateEnum::getCode, ProcessInstanceStateEnum::getMessage)); + for (NutMap row : rows) { + Integer instanceState = row.getInt("instanceState"); + row.put("instanceState", processStateMap.getOrDefault(instanceState, row.getString("instanceState"))); + } + exportRowsAsExcel("提案征集进度", rows, tableColumns, COLLECT_PROGRESS_EXPORT_COLUMNS, response); + } + + /** 构建征集进度分页和导出共用的数据查询,保证两处筛选、分组及排序口径一致。 */ + private Sql buildCollectProgressListSql(ProposalQueryComprehensiveParam pageForm) { + Sql sql = Sqls.create(""" + SELECT + info.id, + info.name, + info.code, + info.caseFilingCode, + info.createUserName, + type.NAME AS typeName, + tcs.fullName AS sessionName, + tcd.`name` AS delegationName, + COALESCE(secondStat.inviteCount, 0) AS inviteCount, + COALESCE(taskStat.finishCount, 0) AS finishCount, + ins.id AS instanceId, + ins.state AS instanceState, + t.displayName AS curTaskName + FROM proposal_info info + LEFT JOIN proposal_type type ON type.id = info.typeId + LEFT JOIN teacher_congress_session tcs ON tcs.id = info.sessionId + LEFT JOIN teacher_congress_delegation tcd ON tcd.id = info.delegationId + LEFT JOIN teacher_congress_delegate tcde ON tcde.loginName = info.createUserLoginName + LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id + LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10 + LEFT JOIN ( + SELECT proposalId, COUNT(1) AS inviteCount + FROM proposal_second + GROUP BY proposalId + ) secondStat ON secondStat.proposalId = info.id + LEFT JOIN ( + SELECT processInstanceId, COUNT(1) AS finishCount + FROM wf_process_task + WHERE taskName = 'second' AND taskState = 20 + GROUP BY processInstanceId + ) taskStat ON taskStat.processInstanceId = ins.id + $condition + """); + Cnd dataCnd = buildCollectProgressCondition(pageForm); + dataCnd.groupBy("info.id"); + applySafePageOrder(dataCnd, pageForm, COLLECT_PROGRESS_ORDER_COLUMNS); + sql.setCondition(dataCnd); + return sql; + } + + /** + * 按提案ID去重统计数据看板的流程节点数量。 + * 同一提案因撤回、退回等再次经过同一节点时,任务表会保留多条已办记录; + * 此处按提案统计,使看板数量与下方按提案展示的列表保持一致。 + * + * @param sessionId 教代会届次ID + * @return 以流程节点编码为键的待办、已办统计结果 + */ + @Override + public Map countDashboardTaskProposals(String sessionId) { + Sql sql = Sqls.create(""" + SELECT + t.taskName, + COUNT(DISTINCT CASE WHEN t.taskState = @doingState THEN info.id END) AS todoCount, + COUNT(DISTINCT CASE WHEN t.taskState = @finishedState THEN info.id END) AS doneCount + FROM wf_process_task t + INNER JOIN wf_process_instance ins ON ins.id = t.processInstanceId + INNER JOIN proposal_info info ON info.id = ins.businessNo + WHERE info.sessionId = @sessionId + GROUP BY t.taskName + """); + sql.setParam("sessionId", sessionId); + sql.setParam("doingState", ProcessTaskStateEnum.DOING.getCode()); + sql.setParam("finishedState", ProcessTaskStateEnum.FINISHED.getCode()); + List taskCounts = listMap(sql); + return taskCounts.stream().collect(Collectors.toMap(task -> task.getString("taskName"), task -> task)); + } + + /** + * 构建征集进度列表和总数查询共用的筛选条件,确保两次查询返回同一数据范围。 + * 征集阶段条件保持页面原有的布尔组合方式,避免优化时改变既有查询结果。 + * + * @param pageForm 页面筛选参数 + * @return 不含分组和排序的查询条件 + */ + private Cnd buildCollectProgressCondition(ProposalQueryComprehensiveParam pageForm) { + Cnd cnd = Cnd.NEW(); + cnd.andEX("info.sessionId", "=", pageForm.getSessionId()); + ProposalQueryComprehensiveParam.buildSearch(cnd, pageForm); + + SqlExpressionGroup collectStageCondition = new SqlExpressionGroup(); + if (ArrayUtil.contains(pageForm.getCollectIds(), 10)) { + collectStageCondition.or("t.taskName", "=", "startTask"); + } + if (ArrayUtil.contains(pageForm.getCollectIds(), 20)) { + collectStageCondition.or("t.taskName", "=", "second"); + } + if (ArrayUtil.contains(pageForm.getCollectIds(), 30)) { + collectStageCondition.or("t.taskName", "=", "delegation"); + } + if (ArrayUtil.contains(pageForm.getCollectIds(), 40)) { + collectStageCondition.or("t.taskName", "not in", List.of("startTask", "second", "delegation")); + collectStageCondition.and("t.taskName", "is not", null); + collectStageCondition.or("ins.state", "=", ProcessInstanceStateEnum.FINISHED.getCode()); + } + if (!collectStageCondition.isEmpty()) { + cnd.and(collectStageCondition); + } + return cnd; + } + + /** + * 查询指定届次的代表团提案统计,动态立案结果字段仅使用已校验的后端字典编码。 + * + * @param pageForm 排序参数 + * @param sessionId 教代会届次ID;为空时返回空列表,避免跨届次统计 + * @return 代表团统计行,包含各立案结果数量和立案率排序值 + */ + @Override + public List queryDelegationStatistics(PageForm pageForm, String sessionId) { + if (StrUtil.isBlank(sessionId)) { + return List.of(); + } + List dictList = sysDictService.getSubListByCode("PROPOSAL_CASE_FILING_RESULT"); + Sql sql = Sqls.create(""" + SELECT + dbt.id, + dbt.`name` AS dbtName, + (SELECT COUNT(1) FROM proposal_info info WHERE info.delegationId = dbt.id AND info.sessionId = dbt.sessionId) AS TOTAL, + (SELECT COUNT(1) FROM proposal_info info WHERE info.delegationId = dbt.id AND info.sessionId = dbt.sessionId AND info.isSubmit = 1) AS SUBMIT_COUNT + $resultSql, + (SELECT COUNT(1) FROM proposal_info info WHERE info.delegationId = dbt.id AND info.sessionId = dbt.sessionId AND info.caseFilingResult = @confirmFiling) + / NULLIF((SELECT COUNT(1) FROM proposal_info info WHERE info.delegationId = dbt.id AND info.sessionId = dbt.sessionId), 0) AS caseRateOrder + FROM teacher_congress_delegation dbt + $condition + """); + Map orderColumns = new HashMap<>(DELEGATION_SUMMARY_ORDER_COLUMNS); + List resultSqlParts = new ArrayList<>(); + for (Sys_dict dict : dictList) { + String resultCode = dict.getCode(); + // 动态 SQL 别名和字面量只接受字母、数字、下划线,避免字典异常值进入 SQL 结构。 + if (StrUtil.isBlank(resultCode) || !resultCode.matches("[A-Za-z0-9_]+")) { + continue; + } + resultSqlParts.add(", (SELECT COUNT(1) FROM proposal_info info WHERE info.delegationId = dbt.id AND info.sessionId = dbt.sessionId AND info.caseFilingResult = '" + + resultCode + "') AS `" + resultCode + "`"); + orderColumns.put(resultCode, "`" + resultCode + "`"); + } + sql.setVar("resultSql", String.join("", resultSqlParts)); + sql.setParam("confirmFiling", "CONFIRM_FILING"); + Cnd cnd = Cnd.where("dbt.sessionId", "=", sessionId); + if (!applySafePageOrder(cnd, pageForm, orderColumns)) { + cnd.asc("dbt.`code`"); + } + sql.setCondition(cnd); + return listMap(sql); + } + + /** + * 导出代表团统计,导出字段由页面当前可见列决定,字段名称以服务端字典为准。 + * + * @param pageForm 排序参数 + * @param sessionId 教代会届次ID + * @param tableColumns 当前可见字段 + * @param response HTTP 响应,直接输出 XSSF Excel + */ + @Override + public void exportDelegationStatisticsAsExcel(PageForm pageForm, String sessionId, + ExportTableColumns[] tableColumns, HttpServletResponse response) { + List rows = queryDelegationStatistics(pageForm, sessionId); + for (NutMap row : rows) { + int total = row.getInt("TOTAL", 0); + int confirmFiling = row.getInt("CONFIRM_FILING", 0); + row.put("caseRate", total == 0 ? "" : String.format(Locale.ROOT, "%.2f%%", confirmFiling * 100.0 / total)); + } + Map allowedColumns = new LinkedHashMap<>(); + allowedColumns.put("dbtName", "代表团名称"); + allowedColumns.put("TOTAL", "提案总数"); + for (Sys_dict dict : sysDictService.getSubListByCode("PROPOSAL_CASE_FILING_RESULT")) { + if (StrUtil.isNotBlank(dict.getCode()) && dict.getCode().matches("[A-Za-z0-9_]+")) { + allowedColumns.put(dict.getCode(), dict.getName()); + } + } + allowedColumns.put("caseRate", "立案率"); + exportRowsAsExcel("代表团提案统计", rows, tableColumns, allowedColumns, response); + } + + /** + * 查询承办单位办理统计,返回统计行及协办单位是否需要答复的配置。 + * + * @param pageForm 排序参数 + * @param sessionId 教代会届次ID + * @param undertakeUnitId 承办单位ID,为空时统计全部单位 + * @param caseFilingResult 立案结果编码,为空时不限制 + * @return tableData 为统计行,slaveNeedReply 为协办答复配置 + */ + @Override + public NutMap queryUnitReplyStatistics(PageForm pageForm, String sessionId, + String undertakeUnitId, String caseFilingResult) { + ProposalConfig proposalConfig = dao().fetch(ProposalConfig.class, Cnd.NEW()); + boolean slaveNeedReply = proposalConfig != null && Boolean.TRUE.equals(proposalConfig.getSlaveUnitNeedReply()); + Cnd proposalCnd = Cnd.where(ProposalInfo::getSessionId, "=", sessionId); + proposalCnd.andEX(ProposalInfo::getCaseFilingResult, "=", caseFilingResult); + List proposalIds = dao().query(ProposalInfo.class, proposalCnd).stream() + .map(ProposalInfo::getId).collect(Collectors.toList()); + if (proposalIds.isEmpty()) { + return NutMap.NEW().addv("tableData", List.of()).addv("slaveNeedReply", slaveNeedReply); + } + + Sql instanceSql = Sqls.create("SELECT id FROM wf_process_instance WHERE businessNo IN (@proposalIds)"); + instanceSql.setParam("proposalIds", proposalIds); + instanceSql.setCallback(Sqls.callback.strList()); + dao().execute(instanceSql); + List instanceIds = instanceSql.getList(String.class); + + Cnd replyUnitCnd = Cnd.where(ProposalReplyUnit::getProposalId, "in", proposalIds); + replyUnitCnd.andEX(ProposalReplyUnit::getUnitId, "=", undertakeUnitId); + List replyUnits = dao().query(ProposalReplyUnit.class, replyUnitCnd); + List replyTasks = instanceIds.isEmpty() ? List.of() : dao().query(ProcessTask.class, + Cnd.where(ProcessTask::getProcessInstanceId, "in", instanceIds) + .and(ProcessTask::getTaskName, "in", List.of("two_unit_reply", "unit_reply", "master_reply", "slave_reply", "opinion_master_reply")) + .and(ProcessTask::getTaskState, "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.DOING.getCode()))); + + List tableData = new ArrayList<>(); + replyUnits.stream().collect(Collectors.groupingBy(ProposalReplyUnit::getUnitCode)).forEach((unitCode, units) -> { + NutMap tableRow = NutMap.NEW().addv("id", unitCode); + units.stream().findAny().ifPresent(item -> { + tableRow.put("unitName", item.getUnitName()); + tableRow.put("unitCode", item.getUnitCode()); + }); + tableRow.put("sum", units.size()); + tableRow.put("masterSum", units.stream().filter(unit -> Boolean.TRUE.equals(unit.getIsMaster())).count()); + tableRow.put("slaveSum", units.stream().filter(unit -> !Boolean.TRUE.equals(unit.getIsMaster())).count()); + + long masterReplySum = countUnitReplyTasks(replyTasks, unitCode, true, ProcessTaskStateEnum.FINISHED.getCode()); + long masterNoReplySum = countUnitReplyTasks(replyTasks, unitCode, true, ProcessTaskStateEnum.DOING.getCode()); + long slaveReplySum = countUnitReplyTasks(replyTasks, unitCode, false, ProcessTaskStateEnum.FINISHED.getCode()); + long slaveNoReplySum = countUnitReplyTasks(replyTasks, unitCode, false, ProcessTaskStateEnum.DOING.getCode()); + tableRow.put("masterReplySum", masterReplySum); + tableRow.put("masterNoReplySum", masterNoReplySum); + tableRow.put("slaveReplySum", slaveReplySum); + tableRow.put("slaveNoReplySum", slaveNoReplySum); + tableData.add(tableRow); + }); + sortStatisticsRows(tableData, pageForm, UNIT_REPLY_ORDER_COLUMNS); + return NutMap.NEW().addv("tableData", tableData).addv("slaveNeedReply", slaveNeedReply); + } + + /** 按承办单位、主协办标识和任务状态,对流程实例去重统计答复数量。 */ + private long countUnitReplyTasks(List replyTasks, String unitCode, boolean master, int taskState) { + return replyTasks.stream().filter(task -> { + NutMap variables = FlowUtil.variableToNutMap(task.getVariable()); + return Objects.equals(unitCode, variables.getString("underTakeId", "")) + && master == Boolean.TRUE.equals(variables.getBoolean("underTakeIsMaster")) + && Objects.equals(task.getTaskState(), taskState); + }).map(ProcessTask::getProcessInstanceId).distinct().count(); + } + + /** 按承办单位办理统计页面当前可见字段导出全部统计行。 */ + @Override + public void exportUnitReplyStatisticsAsExcel(PageForm pageForm, String sessionId, String undertakeUnitId, + String caseFilingResult, ExportTableColumns[] tableColumns, + HttpServletResponse response) { + NutMap statistics = queryUnitReplyStatistics(pageForm, sessionId, undertakeUnitId, caseFilingResult); + List rows = statistics.getList("tableData", NutMap.class); + Map allowedColumns = new LinkedHashMap<>(); + allowedColumns.put("unitName", "单位名称"); + allowedColumns.put("sum", "提案总数"); + allowedColumns.put("masterSum", "主办提案数量"); + allowedColumns.put("masterReplySum", "主办已答复"); + allowedColumns.put("masterNoReplySum", "主办未答复"); + allowedColumns.put("slaveSum", "协办提案数量"); + if (statistics.getBoolean("slaveNeedReply", false)) { + allowedColumns.put("slaveReplySum", "协办已答复"); + allowedColumns.put("slaveNoReplySum", "协办未答复"); + } + exportRowsAsExcel("承办单位办理统计", rows, tableColumns, allowedColumns, response); + } + + /** + * 查询承办单位满意度统计,动态满意度字段来自 PROPOSAL_FEEDBACK 字典。 + * + * @param pageForm 排序参数 + * @param sessionId 教代会届次ID + * @param undertakeUnitId 承办单位ID,为空时统计全部单位 + * @return 各承办单位的主协办数量及满意度计数 + */ + @Override + public List queryUnderTakeSatisfactionStatistics(PageForm pageForm, String sessionId, + String undertakeUnitId) { + List feedbackCodes = sysDictService.getSubListByCode("PROPOSAL_FEEDBACK"); + Set orderColumns = new HashSet<>(SATISFACTION_ORDER_COLUMNS); + feedbackCodes.stream().map(Sys_dict::getCode).filter(StrUtil::isNotBlank).forEach(orderColumns::add); + + Sql proposalSql = Sqls.create("SELECT id FROM proposal_info WHERE sessionId = @sessionId"); + proposalSql.setParam("sessionId", sessionId); + proposalSql.setCallback(Sqls.callback.strList()); + dao().execute(proposalSql); + List proposalIds = proposalSql.getList(String.class); + if (proposalIds.isEmpty()) { + return List.of(); + } + + Cnd replyUnitCnd = Cnd.where(ProposalReplyUnit::getProposalId, "in", proposalIds); + replyUnitCnd.andEX(ProposalReplyUnit::getUnitId, "=", undertakeUnitId); + List replyUnits = dao().query(ProposalReplyUnit.class, replyUnitCnd); + List tableData = new ArrayList<>(); + replyUnits.stream().collect(Collectors.groupingBy(ProposalReplyUnit::getUnitCode)).forEach((unitCode, units) -> { + NutMap tableRow = NutMap.NEW().addv("id", unitCode); + units.stream().findAny().ifPresent(item -> { + tableRow.put("unitName", item.getUnitName()); + tableRow.put("unitCode", item.getUnitCode()); + }); + tableRow.put("sum", units.size()); + tableRow.put("masterSum", units.stream().filter(unit -> Boolean.TRUE.equals(unit.getIsMaster())).count()); + tableRow.put("slaveSum", units.stream().filter(unit -> !Boolean.TRUE.equals(unit.getIsMaster())).count()); + + List unitProposalIds = units.stream().map(ProposalReplyUnit::getProposalId).toList(); + List unitInstanceIds = dao().query(ProcessInstance.class, + Cnd.where(ProcessInstance::getBusinessNo, "in", unitProposalIds)).stream() + .map(ProcessInstance::getId).toList(); + List feedbackTasks = unitInstanceIds.isEmpty() ? List.of() : dao().query(ProcessTask.class, + Cnd.where(ProcessTask::getProcessInstanceId, "in", unitInstanceIds) + .and(ProcessTask::getTaskName, "=", "feedback") + .and(ProcessTask::getTaskState, "=", ProcessTaskStateEnum.FINISHED.getCode())); + for (Sys_dict feedbackCode : feedbackCodes) { + if (StrUtil.isBlank(feedbackCode.getCode())) { + continue; + } + long count = feedbackTasks.stream().filter(task -> Objects.equals(feedbackCode.getCode(), + FlowUtil.variableToNutMap(task.getVariable()).getString("tf_feedback", ""))) + .map(ProcessTask::getProcessInstanceId).distinct().count(); + tableRow.put(feedbackCode.getCode(), count); + } + tableData.add(tableRow); + }); + sortStatisticsRows(tableData, pageForm, orderColumns); + return tableData; + } + + /** 按满意度统计页面当前可见字段导出全部统计行。 */ + @Override + public void exportUnderTakeSatisfactionAsExcel(PageForm pageForm, String sessionId, String undertakeUnitId, + ExportTableColumns[] tableColumns, HttpServletResponse response) { + List rows = queryUnderTakeSatisfactionStatistics(pageForm, sessionId, undertakeUnitId); + Map allowedColumns = new LinkedHashMap<>(); + allowedColumns.put("unitName", "单位名称"); + allowedColumns.put("sum", "提案总数"); + allowedColumns.put("masterSum", "主办提案数"); + allowedColumns.put("slaveSum", "协办提案数"); + for (Sys_dict feedbackCode : sysDictService.getSubListByCode("PROPOSAL_FEEDBACK")) { + if (StrUtil.isNotBlank(feedbackCode.getCode())) { + allowedColumns.put(feedbackCode.getCode(), feedbackCode.getName()); + } + } + exportRowsAsExcel("承办单位满意度统计", rows, tableColumns, allowedColumns, response); + } + + /** + * 按页面字段白名单校验列定义并输出 Excel,所有统计导出统一使用 XSSF 格式。 + * + * @param title 文件名及工作表标题 + * @param rows 待导出的全部匹配数据 + * @param tableColumns 页面当前可见字段及顺序 + * @param allowedColumns 后端允许字段及规范表头 + * @param response HTTP 响应 + */ + private void exportRowsAsExcel(String title, List rows, ExportTableColumns[] tableColumns, + Map allowedColumns, HttpServletResponse response) { + List exportColumns = getSafeExportColumns(tableColumns, allowedColumns); + if (exportColumns.isEmpty()) { + throw new BaseException("请至少选择一个导出字段"); + } + if (rows == null || rows.isEmpty()) { + throw new BaseException("当前筛选条件下没有可导出的数据"); + } + List excelColumns = exportColumns.stream() + .map(column -> new ExcelExportEntity(column.getLabel(), column.getProp(), 20)) + .collect(Collectors.toList()); + ExportParams exportParams = new ExportParams(); + exportParams.setType(ExcelType.XSSF); + exportParams.setTitle(title); + Workbook workbook = ExcelExportUtil.exportExcel(exportParams, excelColumns, rows); + CommonDownloadUtil.download(title + ".xlsx", workbook, response); + } + + /** 按后端白名单过滤重复或伪造字段,并保留页面列设置顺序。 */ + private List getSafeExportColumns(ExportTableColumns[] tableColumns, + Map allowedColumns) { + if (ArrayUtil.isEmpty(tableColumns)) { + return List.of(); + } + List exportColumns = new ArrayList<>(); + Set selectedProps = new HashSet<>(); + for (ExportTableColumns column : tableColumns) { + if (column == null || !allowedColumns.containsKey(column.getProp()) || !selectedProps.add(column.getProp())) { + continue; + } + ExportTableColumns safeColumn = new ExportTableColumns(); + safeColumn.setProp(column.getProp()); + safeColumn.setLabel(allowedColumns.get(column.getProp())); + exportColumns.add(safeColumn); + } + return exportColumns; + } + /** * 使用业务页面提供的字段白名单构建排序条件,非法字段或非法排序方向将被忽略。 * @@ -121,8 +876,14 @@ public class ProposalCommonServiceImpl extends BaseServiceImpl imp return false; } + // H5 列表首次加载时可能不传排序字段;不可变 Map 不接受 null 键,直接保留页面默认排序。 + String pageOrderName = pageForm.getPageOrderName(); + if (StrUtil.isBlank(pageOrderName)) { + return false; + } + // 仅允许白名单中的字段参与排序,防止构造任意SQL排序字段。 - String orderColumn = allowedOrderColumns.get(pageForm.getPageOrderName()); + String orderColumn = allowedOrderColumns.get(pageOrderName); String orderBy = PageUtil.getOrder(pageForm.getPageOrderBy()); if (StrUtil.isBlank(orderColumn) || StrUtil.isBlank(orderBy)) { return false; @@ -163,7 +924,7 @@ public class ProposalCommonServiceImpl extends BaseServiceImpl imp pages.put("commissioner", orderColumns("code", "info.code", "name", "info.name", "typeName", "type.name", "sessionName", "tcs.fullName", "delegationName", "tcd.name", "CONFIRM_FILING_COUNT", "CONFIRM_FILING_COUNT", "SUGGESTION_COUNT", "SUGGESTION_COUNT", "NOT_COUNT", "NOT_COUNT", "taskName", "taskName", "instanceState", "ins.state")); pages.put("feedbackEvaluation", orderColumns("code", "info.code", "name", "info.name", "typeName", "type.name", "merge", "merge", "curTaskName", "curTaskName", "instanceState", "ins.state")); pages.put("delegation", standardOrderColumns()); - pages.put("control", standardOrderColumns()); + pages.put("control", mergeOrderColumns(standardOrderColumns(), orderColumns("caseFilingCode", "info.caseFilingCode"))); pages.put("schoolLeaderApproval", orderColumns("code", "info.code", "name", "info.name", "typeName", "type.name", "undertakeUnits", "masterUnitName", "merge", "merge", "curTaskName", "curTaskName", "auditUser", "auditUser", "instanceState", "ins.state")); pages.put("committeeFilingUnit", orderColumns("code", "info.code", "name", "info.name", "typeName", "type.name", "sessionName", "tcs.fullName", "caseFilingResult", "info.caseFilingResult", "delegationName", "tcd.name", "curTaskName", "curTaskName", "instanceState", "ins.state")); pages.put("allFinished", orderColumns("code", "info.code", "name", "info.name", "createUserName", "info.createUserName", "typeName", "type.name", "sessionName", "tcs.fullName", "delegationName", "tcd.name", "instanceState", "ins.state")); @@ -175,7 +936,7 @@ public class ProposalCommonServiceImpl extends BaseServiceImpl imp pages.put("configUnit", orderColumns("name", "t1.name", "code", "t1.code", "unitLeader", "u2.username")); pages.put("configType", orderColumns("name", "name", "code", "code")); pages.put("seniorBasic", seniorOrderColumns()); - pages.put("expediting", orderColumns("code", "info.code", "name", "info.name", "typeName", "type.name", "delegationName", "tcd.name", "caseFilingResult", "info.caseFilingResult", "curTaskName", "curTaskName", "underTakeName", "underTakeName", "taskName", "t.displayName", "actorName", "ta.actorName", "instanceState", "ins.state")); + pages.put("expediting", orderColumns("code", "info.code", "caseFilingCode", "info.caseFilingCode", "name", "info.name", "typeName", "type.name", "delegationName", "tcd.name", "caseFilingResult", "info.caseFilingResult", "curTaskName", "curTaskName", "underTakeName", "underTakeName", "taskName", "t.displayName", "actorName", "ta.actorName", "instanceState", "ins.state")); pages.put("seniorDelete", seniorOrderColumns()); pages.put("seniorFeedback", mergeOrderColumns(seniorOrderColumns(), orderColumns("tf_feedback", "tf_feedback"))); pages.put("seniorType", seniorOrderColumns()); @@ -189,7 +950,7 @@ public class ProposalCommonServiceImpl extends BaseServiceImpl imp /** 创建高级管理列表共用的字段映射。 */ private static Map seniorOrderColumns() { - return orderColumns("code", "info.code", "name", "info.name", "createUserName", "info.createUserName", "typeName", "type.name", "delegationName", "tcd.name", "caseFilingResult", "info.caseFilingResult", "isConsolidation", "merge", "curTaskName", "curTaskName", "instanceState", "ins.state"); + return orderColumns("code", "info.code", "caseFilingCode", "info.caseFilingCode", "name", "info.name", "createUserName", "info.createUserName", "typeName", "type.name", "delegationName", "tcd.name", "caseFilingResult", "info.caseFilingResult", "isConsolidation", "merge", "curTaskName", "curTaskName", "instanceState", "ins.state"); } /** @@ -589,6 +1350,7 @@ public class ProposalCommonServiceImpl extends BaseServiceImpl imp SELECT info.name, info.code, + info.caseFilingResult, info.brief, info.measures, info.createUserName, @@ -719,13 +1481,29 @@ public class ProposalCommonServiceImpl extends BaseServiceImpl imp docData.put("secondedList", secondInfos); docData.put("delegationAuditList", delegationAuditList); + String templateCode = getProposalTemplateCode(docData.getString("caseFilingResult")); try { - XWPFTemplate.compile(sysOfficeTemplateUtil.getTemplate("proposal"), config).render(docData).writeAndClose(byteArrayOutputStream); + XWPFTemplate.compile(sysOfficeTemplateUtil.getTemplate(templateCode), config).render(docData).writeAndClose(byteArrayOutputStream); } catch (IOException e) { log.error("提案导出失败{},提案id:{}", e.getMessage(), id); } } + /** + * 根据立案结果选择数据库办公模板编码。 + * + * @param caseFilingResult 立案结果字典编码:CONFIRM_FILING、SUGGESTION 或 NOT + * @return 对应的 Word 模板编码;历史空值或未知编码返回 proposal + */ + private String getProposalTemplateCode(String caseFilingResult) { + return switch (StrUtil.nullToEmpty(caseFilingResult)) { + case "CONFIRM_FILING" -> PROPOSAL_CONFIRM_FILING_TEMPLATE_CODE; + case "SUGGESTION" -> PROPOSAL_SUGGESTION_TEMPLATE_CODE; + case "NOT" -> PROPOSAL_NOT_TEMPLATE_CODE; + default -> PROPOSAL_DEFAULT_TEMPLATE_CODE; + }; + } + /** * 将现行工作流节点映射到历史提案表模板使用的区块名称,并按主协办单位拆分办理答复。 * 模板仍使用旧节点名称时,避免已完成的意见和答复因键名不一致而无法渲染。 @@ -736,28 +1514,52 @@ public class ProposalCommonServiceImpl extends BaseServiceImpl imp */ private void putProposalExportTaskAliases(String proposalId, Map> taskGroups, NutMap docData) { - putTaskAlias(docData, "提案委主任审核", taskGroups.get("校工会预审核")); + /* putTaskAlias(docData, "提案委主任审核", taskGroups.get("校工会预审核")); putTaskAlias(docData, "提案委主任意见", taskGroups.get("提案委员会立案")); - putTaskAlias(docData, "提案委委员审议", taskGroups.get("委员会确认承办单位")); + putTaskAlias(docData, "提案委委员审议", taskGroups.get("委员会确认承办单位"));*/ + putProposalExportFeedbackName(taskGroups.get("反馈评价")); List replyTasks = taskGroups.get("承办单位答复"); if (Lang.isEmpty(replyTasks)) { return; } - Sql masterUnitSql = Sqls.create("SELECT unitName FROM proposal_reply_unit WHERE proposalId = @proposalId AND isMaster = 1") + Sql replyUnitSql = Sqls.create("SELECT unitId, unitName, isMaster FROM proposal_reply_unit WHERE proposalId = @proposalId") .setParam("proposalId", proposalId); - List masterUnitRows = listMap(masterUnitSql); - Set masterUnitNames = masterUnitRows.stream() - .map(row -> row.getString("unitName")) + List replyUnitRows = listMap(replyUnitSql); + Set masterUnitIds = replyUnitRows.stream() + .filter(row -> row.getBoolean("isMaster", false)) + .map(row -> row.getString("unitId")) .filter(StrUtil::isNotBlank) .collect(Collectors.toSet()); + Map replyUnitNameMap = replyUnitRows.stream() + .filter(row -> StrUtil.isNotBlank(row.getString("unitId"))) + .collect(Collectors.toMap(row -> row.getString("unitId"), row -> row.getString("unitName", ""), + (left, right) -> left)); List masterReplyTasks = new ArrayList<>(); List slaveReplyTasks = new ArrayList<>(); for (ProcessTaskVO replyTask : replyTasks) { + Dict taskExt = replyTask.getExt(); Dict taskFormData = replyTask.getTaskFormData(); - String unitName = taskFormData == null ? null : taskFormData.getStr("unitName"); - if (masterUnitNames.contains(unitName)) { + String underTakeId = taskExt == null ? null : taskExt.getStr("underTakeId"); + if (StrUtil.isBlank(underTakeId) && taskFormData != null) { + underTakeId = taskFormData.getStr("unitId"); + } + + /* + * 承办单位名称保存在任务根变量 underTakeName 中,而模板读取 taskFormData.underTakeName。 + * 在本次导出对象中补充 tf_ 前缀字段,由 ProcessTaskVO 转换后即可保持现有模板不变。 + */ + if (taskExt != null) { + String underTakeName = taskExt.getStr("underTakeName"); + if (StrUtil.isBlank(underTakeName)) { + underTakeName = replyUnitNameMap.getOrDefault(underTakeId, ""); + } + taskExt.put("tf_underTakeName", underTakeName); + } + + // 主协办关系按单位ID匹配,避免把任务中的单位ID误当成单位名称后全部归入协办答复。 + if (masterUnitIds.contains(underTakeId)) { masterReplyTasks.add(replyTask); } else { slaveReplyTasks.add(replyTask); @@ -767,6 +1569,28 @@ public class ProposalCommonServiceImpl extends BaseServiceImpl imp putTaskAlias(docData, "协办单位答复", slaveReplyTasks); } + /** + * 将反馈评价字典编码转换为模板使用的中文名称,仅补充本次导出的任务变量。 + * + * @param feedbackTasks 已完成的反馈评价任务;为空时无需处理 + */ + private void putProposalExportFeedbackName(List feedbackTasks) { + if (Lang.isEmpty(feedbackTasks)) { + return; + } + Map feedbackNameMap = sysDictService.getSubListByCode("PROPOSAL_FEEDBACK").stream() + .filter(item -> StrUtil.isNotBlank(item.getCode())) + .collect(Collectors.toMap(Sys_dict::getCode, Sys_dict::getName, (left, right) -> left)); + for (ProcessTaskVO feedbackTask : feedbackTasks) { + Dict taskExt = feedbackTask.getExt(); + if (taskExt == null) { + continue; + } + String feedbackCode = taskExt.getStr("tf_feedback"); + taskExt.put("tf_feedback_name", feedbackNameMap.getOrDefault(feedbackCode, feedbackCode)); + } + } + /** * 仅在存在已完成任务时写入模板区块,空任务不触发 Word 条件标签。 * @@ -814,35 +1638,35 @@ public class ProposalCommonServiceImpl extends BaseServiceImpl imp // 获取流程实例 ProcessInstance processInstance = dao().fetch(ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "=", id)); + if (processInstance != null) { + // 主办办理情况 + ProcessTask masterUnitReplyTask = dao().fetch(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "=", processInstance.getId()) + .and(ProcessTask::getTaskName, "in", List.of("master_reply", "opinion_master_reply")) + .and(ProcessTask::getTaskState, "=", ProcessTaskStateEnum.FINISHED.getCode()) + .desc(ProcessTask::getFinishTime) + ); + if (masterUnitReplyTask != null) { + // 办理解决情况 + String implementState = FlowUtil.variableToDict(masterUnitReplyTask.getVariable()).getStr("tf_implementState"); + info.put(implementState, "√"); + // 承办单位名称 + info.put("underTakeName", FlowUtil.variableToDict(masterUnitReplyTask.getVariable()).getStr("underTakeName")); + } - // 主办办理情况 - ProcessTask masterUnitReplyTask = dao().fetch(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "=", processInstance.getId()) - .and(ProcessTask::getTaskName, "in", List.of("master_reply", "opinion_master_reply")) - .and(ProcessTask::getTaskState, "=", ProcessTaskStateEnum.FINISHED.getCode()) - .desc(ProcessTask::getFinishTime) - ); - if (masterUnitReplyTask != null) { - // 办理解决情况 - String implementState = FlowUtil.variableToDict(masterUnitReplyTask.getVariable()).getStr("tf_implementState"); - info.put(implementState, "√"); - // 承办单位名称 - info.put("underTakeName", FlowUtil.variableToDict(masterUnitReplyTask.getVariable()).getStr("underTakeName")); - } - - - // 反馈评价 - ProcessTask feedbackTask = dao().fetch(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "=", processInstance.getId()) - .and(ProcessTask::getTaskName, "=", "feedback") - .and(ProcessTask::getTaskState, "=", ProcessTaskStateEnum.FINISHED.getCode()) - .desc(ProcessTask::getFinishTime) - ); - if (feedbackTask != null) { - info.put(FlowUtil.variableToDict(feedbackTask.getVariable()).getStr("tf_feedback"), "√"); - info.put("tf_feedback", FlowUtil.variableToDict(feedbackTask.getVariable()).getStr("tf_feedback")); - info.put("tf_opinion", FlowUtil.variableToDict(feedbackTask.getVariable()).getStr("tf_opinion")); - info.put("tf_phone", FlowUtil.variableToDict(feedbackTask.getVariable()).getStr("tf_phone")); - info.put("tf_address", FlowUtil.variableToDict(feedbackTask.getVariable()).getStr("tf_address")); - info.put("tf_postcode", FlowUtil.variableToDict(feedbackTask.getVariable()).getStr("tf_postcode")); + // 反馈评价 + ProcessTask feedbackTask = dao().fetch(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "=", processInstance.getId()) + .and(ProcessTask::getTaskName, "=", "feedback") + .and(ProcessTask::getTaskState, "=", ProcessTaskStateEnum.FINISHED.getCode()) + .desc(ProcessTask::getFinishTime) + ); + if (feedbackTask != null) { + info.put(FlowUtil.variableToDict(feedbackTask.getVariable()).getStr("tf_feedback"), "√"); + info.put("tf_feedback_name", FlowUtil.variableToDict(feedbackTask.getVariable()).getStr("tf_feedback")); + info.put("tf_opinion", FlowUtil.variableToDict(feedbackTask.getVariable()).getStr("tf_opinion")); + info.put("tf_phone", FlowUtil.variableToDict(feedbackTask.getVariable()).getStr("tf_phone")); + info.put("tf_address", FlowUtil.variableToDict(feedbackTask.getVariable()).getStr("tf_address")); + info.put("tf_postcode", FlowUtil.variableToDict(feedbackTask.getVariable()).getStr("tf_postcode")); + } } HtmlRenderPolicy htmlRenderPolicy = new HtmlRenderPolicy(); diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/impl/ProposalCommitteeFilingServiceImpl.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/impl/ProposalCommitteeFilingServiceImpl.java index 34b0f4e5..fd434c19 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/impl/ProposalCommitteeFilingServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/impl/ProposalCommitteeFilingServiceImpl.java @@ -2,14 +2,23 @@ package com.budwk.app.zhgh.democratic.proposal.service.impl; import cn.hutool.core.lang.Dict; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.budwk.app.base.constant.RoleConstant; +import com.budwk.app.base.exception.BaseException; import com.budwk.app.base.service.impl.BaseServiceImpl; import com.budwk.app.flow.constant.FlowConst; import com.budwk.app.flow.entity.ProcessTask; +import com.budwk.app.flow.enums.ProcessSubmitTypeEnum; import com.budwk.app.flow.service.FlowCommonService; import com.budwk.app.flow.service.ProcessTaskService; +import com.budwk.app.sys.models.Sys_role; +import com.budwk.app.sys.models.Sys_user_role; +import com.budwk.app.sys.services.SysRoleService; import com.budwk.app.zhgh.democratic.proposal.models.ProposalConsolidation; import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo; import com.budwk.app.zhgh.democratic.proposal.models.ProposalMerge; +import com.budwk.app.zhgh.democratic.proposal.models.ProposalUndertake; import com.budwk.app.zhgh.democratic.proposal.service.ProposalCommitteeFilingService; import com.budwk.app.zhgh.democratic.proposal.service.common.ProposalCommonService; import org.nutz.aop.interceptor.ioc.TransAop; @@ -20,7 +29,14 @@ import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.lang.random.R; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.LinkedHashSet; import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; @IocBean(args = {"refer:dao"}) public class ProposalCommitteeFilingServiceImpl extends BaseServiceImpl implements ProposalCommitteeFilingService { @@ -31,14 +47,26 @@ public class ProposalCommitteeFilingServiceImpl extends BaseServiceImpl taskIds = (List) args.get("processTaskIds"); List proposalIds = (List) args.get("proposalIds"); @@ -65,6 +93,101 @@ public class ProposalCommitteeFilingServiceImpl extends BaseServiceImpl selectedUnitIds = new LinkedHashSet<>( + getUnitIdList(args, FlowConst.TASK_FORM_DATA_PREFIX + "masterUnitIds")); + if ("CONFIRM_FILING".equals(caseFilingResult)) { + selectedUnitIds.addAll(getUnitIdList(args, FlowConst.TASK_FORM_DATA_PREFIX + "slaveUnitIds")); + } + if (selectedUnitIds.isEmpty()) { + return; + } + + Sys_role unitLeaderRole = sysRoleService.getByCode(RoleConstant.PROPOSAL_UNIT_LEADER); + if (unitLeaderRole == null) { + throw new BaseException("提案承办单位领导角色不存在"); + } + + Map unitMap = dao().query(ProposalUndertake.class, + Cnd.where(ProposalUndertake::getId, "in", selectedUnitIds)) + .stream() + .collect(Collectors.toMap(ProposalUndertake::getId, unit -> unit)); + if (unitMap.size() != selectedUnitIds.size()) { + throw new BaseException("选择的承办单位不存在,请重新选择"); + } + + Set configuredUnitIds = dao().query(Sys_user_role.class, + Cnd.where(Sys_user_role::getRoleId, "=", unitLeaderRole.getId()) + .and(Sys_user_role::getUnderTakeId, "in", selectedUnitIds)) + .stream() + .map(Sys_user_role::getUnderTakeId) + .filter(StrUtil::isNotBlank) + .collect(Collectors.toSet()); + List missingUnitNames = selectedUnitIds.stream() + .filter(unitId -> !configuredUnitIds.contains(unitId)) + .map(unitMap::get) + .map(ProposalUndertake::getName) + .toList(); + if (!missingUnitNames.isEmpty()) { + throw new BaseException(String.join("、", missingUnitNames) + "没有设置负责人!"); + } + } + + /** + * 将页面单位字段统一转换为去空、去重后的单位ID列表,兼容数组、JSON数组字符串和逗号分隔字符串。 + * + * @param args 页面流程参数 + * @param key 需要读取的单位字段名 + * @return 规范化后的单位ID列表 + */ + private List getUnitIdList(Dict args, String key) { + Object value = args.get(key); + if (ObjectUtil.isEmpty(value)) { + return List.of(); + } + + List unitIds = new ArrayList<>(); + if (value instanceof Collection collection) { + collection.forEach(item -> { + if (ObjectUtil.isNotEmpty(item)) { + unitIds.add(String.valueOf(item)); + } + }); + } else if (value instanceof String stringValue) { + if (StrUtil.isBlank(stringValue)) { + return List.of(); + } + if (JSONUtil.isTypeJSONArray(stringValue)) { + unitIds.addAll(JSONUtil.parseArray(stringValue).toList(String.class)); + } else { + Arrays.stream(stringValue.split(",")) + .map(String::trim) + .filter(StrUtil::isNotBlank) + .forEach(unitIds::add); + } + } else { + unitIds.add(String.valueOf(value)); + } + return new ArrayList<>(new LinkedHashSet<>(unitIds)); + } + @Override @Aop(TransAop.READ_COMMITTED) public void revokeTask(Long taskId, String proposalId) { diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/impl/ProposalCommitteeFilingUnitServiceImpl.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/impl/ProposalCommitteeFilingUnitServiceImpl.java index 8266ada4..30ab80c3 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/impl/ProposalCommitteeFilingUnitServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/impl/ProposalCommitteeFilingUnitServiceImpl.java @@ -16,6 +16,7 @@ import com.budwk.app.bpm.models.BpmProcessTask; import com.budwk.app.bpm.service.BpmService; import com.budwk.app.flow.constant.FlowConst; import com.budwk.app.flow.entity.ProcessTask; +import com.budwk.app.flow.enums.ProcessSubmitTypeEnum; import com.budwk.app.flow.service.FlowCommonService; import com.budwk.app.flow.service.ProcessTaskService; import com.budwk.app.sys.models.Sys_user_role; @@ -34,6 +35,8 @@ import org.nutz.aop.interceptor.ioc.TransAop; import org.nutz.dao.Chain; import org.nutz.dao.Cnd; import org.nutz.dao.Dao; +import org.nutz.dao.Sqls; +import org.nutz.dao.sql.Sql; import org.nutz.dao.util.cri.Static; import org.nutz.ioc.aop.Aop; import org.nutz.ioc.loader.annotation.Inject; @@ -82,12 +85,12 @@ public class ProposalCommitteeFilingUnitServiceImpl extends BaseServiceImpl proposalIds = proposalCommonService.mergeProposal(proposalId); if (ObjectUtil.isEmpty(proposalIds)) { proposalIds = List.of(proposalId); } + generateAndNormalizeCaseFilingCode(args, proposalIds); /* * 先同步 proposal_info 和承办单位,再执行 WF 流转,使查看页面及下一节点读取到的都是本次最新数据。 @@ -111,31 +114,114 @@ public class ProposalCommitteeFilingUnitServiceImpl extends BaseServiceImpl proposalIds) { String caseFilingResultKey = FlowConst.TASK_FORM_DATA_PREFIX + "caseFilingResult"; String caseFilingCodeKey = FlowConst.TASK_FORM_DATA_PREFIX + "caseFilingCode"; String caseFilingTypeKey = FlowConst.TASK_FORM_DATA_PREFIX + "caseFilingType"; - if (!"CONFIRM_FILING".equals(args.getStr(caseFilingResultKey))) { - args.put(caseFilingCodeKey, ""); + String caseFilingResult = args.getStr(caseFilingResultKey); + if (!"CONFIRM_FILING".equals(caseFilingResult)) { + // 立案类型仅适用于确定立案,切换为其他结果时同步清理历史值。 args.put(caseFilingTypeKey, ""); + } + + Integer submitType = args.getInt(FlowConst.SUBMIT_TYPE); + if (submitType == null) { + submitType = ProcessSubmitTypeEnum.AGREE.getCode(); + args.put(FlowConst.SUBMIT_TYPE, submitType); + } + if (!ProcessSubmitTypeEnum.AGREE.getCode().equals(submitType)) { + args.put(caseFilingCodeKey, ""); return; } - String caseFilingCode = StrUtil.trim(args.getStr(caseFilingCodeKey)); - if (StrUtil.isBlank(caseFilingCode)) { - throw new BaseException("立案编号不能为空"); + String codePrefix = resolveCaseFilingCodePrefix(caseFilingResult); + int currentYear = java.time.LocalDate.now().getYear(); + String codeHead = currentYear + codePrefix; + + /* + * proposal_config 当前是单行配置表,锁定该行可让所有应用实例串行生成流水号。 + * 行锁一直持有到本次 WF 提交事务结束,避免两个审核请求同时读到相同最大值。 + */ + Sql lockSql = Sqls.create("SELECT id FROM proposal_config ORDER BY id LIMIT 1 FOR UPDATE"); + lockSql.setCallback(Sqls.callback.map()); + dao().execute(lockSql); + Map configRow = lockSql.getObject(Map.class); + if (ObjectUtil.isEmpty(configRow)) { + throw new BaseException("提案配置不存在,无法生成立案编号"); } - if (caseFilingCode.length() > 20) { - throw new BaseException("立案编号不能超过20个字符"); + + String reusableCode = findReusableCaseFilingCode(proposalIds, caseFilingResult, codeHead); + if (StrUtil.isNotBlank(reusableCode)) { + args.put(caseFilingCodeKey, reusableCode); + return; } + + Sql maxSequenceSql = Sqls.create(""" + SELECT COALESCE(MAX(CAST(SUBSTRING(caseFilingCode, 6) AS UNSIGNED)), 0) + FROM proposal_info + WHERE caseFilingCode REGEXP @codePattern + """); + maxSequenceSql.setParam("codePattern", "^" + codeHead + "[0-9]{3,}$"); + maxSequenceSql.setCallback(Sqls.callback.integer()); + dao().execute(maxSequenceSql); + int nextSequence = maxSequenceSql.getInt() + 1; + String caseFilingCode = codeHead + String.format("%03d", nextSequence); args.put(caseFilingCodeKey, caseFilingCode); } + /** + * 将立案结果转换成编号前缀,未知结果直接阻止流程提交,避免生成无业务含义的编号。 + * + * @param caseFilingResult 立案结果编码 + * @return 确定立案返回 A、工作建议返回 B、不予立案返回 C + */ + private String resolveCaseFilingCodePrefix(String caseFilingResult) { + return switch (StrUtil.nullToEmpty(caseFilingResult)) { + case "CONFIRM_FILING" -> "A"; + case "SUGGESTION" -> "B"; + case "NOT" -> "C"; + default -> throw new BaseException("立案结果不正确,无法生成立案编号"); + }; + } + + /** + * 流程撤回或重新提交时,复用同一批提案已有的本年同类型编号,避免流水号无意义增长。 + * 只有全部提案的结果和编号完全一致且符合新编号格式时才允许复用。 + * + * @param proposalIds 当前单案或并案提案主键集合 + * @param caseFilingResult 本次选择的立案结果 + * @param codeHead 年份和编号前缀,例如 2026A + * @return 可复用的编号;不存在时返回空字符串 + */ + private String findReusableCaseFilingCode(List proposalIds, String caseFilingResult, String codeHead) { + List proposalInfos = dao().query(ProposalInfo.class, + Cnd.where(ProposalInfo::getId, "in", proposalIds)); + if (proposalInfos.size() != new LinkedHashSet<>(proposalIds).size()) { + return ""; + } + boolean allProposalsMatch = proposalInfos.stream().allMatch(proposalInfo -> + Objects.equals(caseFilingResult, proposalInfo.getCaseFilingResult()) + && StrUtil.isNotBlank(proposalInfo.getCaseFilingCode())); + if (!allProposalsMatch) { + return ""; + } + LinkedHashSet existingCodes = proposalInfos.stream() + .map(ProposalInfo::getCaseFilingCode) + .map(StrUtil::trim) + .collect(Collectors.toCollection(LinkedHashSet::new)); + if (existingCodes.size() != 1) { + return ""; + } + String existingCode = existingCodes.iterator().next(); + return existingCode.matches(codeHead + "\\d{3,}") ? existingCode : ""; + } + /** * old-flow 页面提交后,需要把立案编号、立案结果以及主协办单位同步落业务表。 * 若这次改成“不予立案”等无需承办单位的结果,也要先清掉旧的承办单位记录,避免脏数据残留。 diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/impl/ProposalExportServiceImpl.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/impl/ProposalExportServiceImpl.java index 721fdc83..03eaa739 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/impl/ProposalExportServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/impl/ProposalExportServiceImpl.java @@ -29,6 +29,7 @@ import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy; import lombok.extern.slf4j.Slf4j; +import org.apache.poi.ss.usermodel.BorderStyle; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.Font; @@ -74,7 +75,8 @@ import java.util.zip.ZipOutputStream; public class ProposalExportServiceImpl extends BaseServiceImpl implements ProposalExportService { private static final String WORK_SUGGESTION_SECTION_MARKER = "__WORK_SUGGESTION_SECTION__"; - private static final int UNDERTAKE_UNIT_EXPORT_COLUMN_COUNT = 8; + private static final int UNDERTAKE_UNIT_EXPORT_COLUMN_COUNT = 6; + private static final int UNDERTAKE_UNIT_SECOND_TITLE_ROW_INDEX = 1; @Inject private ProposalCommonService proposalCommonService; @@ -187,6 +189,9 @@ public class ProposalExportServiceImpl extends BaseServiceImpl imp info.id, info.name, info.code, + info.caseFilingCode, + info.caseFilingResult, + info.caseFilingType, info.researchFindings, info.brief, info.measures, @@ -194,6 +199,10 @@ public class ProposalExportServiceImpl extends BaseServiceImpl imp tcde.unitName, tcde.mobile, type.name AS typeName, + caseFilingResultDict.name AS caseFilingResultName, + caseFilingTypeDict.name AS caseFilingTypeName, + EXISTS (SELECT 1 FROM proposal_consolidation consolidation + WHERE JSON_CONTAINS(consolidation.consolidationIds, JSON_QUOTE(info.id))) AS isConsolidation, tcs.j, tcs.c, tcs.fullName AS sessionName, @@ -204,6 +213,10 @@ public class ProposalExportServiceImpl extends BaseServiceImpl imp LEFT JOIN teacher_congress_session tcs on tcs.id = info.sessionId LEFT JOIN teacher_congress_delegation tcd on tcd.id = info.delegationId LEFT JOIN teacher_congress_delegate tcde on tcde.loginName = info.createUserLoginName + LEFT JOIN sys_dict caseFilingResultDict ON caseFilingResultDict.code = info.caseFilingResult + AND caseFilingResultDict.parentId = (SELECT id FROM sys_dict WHERE code = 'PROPOSAL_CASE_FILING_RESULT' LIMIT 1) + LEFT JOIN sys_dict caseFilingTypeDict ON caseFilingTypeDict.code = info.caseFilingType + AND caseFilingTypeDict.parentId = (SELECT id FROM sys_dict WHERE code = 'PROPOSAL_CASE_FILING_TYPE' LIMIT 1) $condition """); Cnd cnd = Cnd.NEW(); @@ -217,23 +230,28 @@ public class ProposalExportServiceImpl extends BaseServiceImpl imp list.get(i).put("index", i + 1); list.get(i).put("brief", HtmlUtil.cleanHtmlTag(list.get(i).getString("brief"))); list.get(i).put("measures", HtmlUtil.cleanHtmlTag(list.get(i).getString("measures"))); + // Excel 汇总表使用中文并案标识,避免直接输出数据库布尔值。 + list.get(i).put("isConsolidationName", Boolean.TRUE.equals(list.get(i).getBoolean("isConsolidation")) ? "是" : "否"); // 流程实例 ProcessInstance instance = dao().fetch(ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "=", list.get(i).getString("id"))); - // 查询附议人信息 - ProcessTask inviteTask = dao().fetch(ProcessTask.class, - Cnd.where(ProcessTask::getProcessInstanceId, "=", instance.getId()) - .and(ProcessTask::getTaskName, "=", "invite") - .and(ProcessTask::getTaskState, "in", - List.of(ProcessTaskStateEnum.DOING.getCode(), ProcessTaskStateEnum.FINISHED.getCode())) - .desc(ProcessTask::getCreatedAt)); + // 历史提案可能没有迁移流程实例,此时仅不导出附议人,避免影响汇总表其他数据。 + if (instance != null) { + // 查询附议人信息 + ProcessTask inviteTask = dao().fetch(ProcessTask.class, + Cnd.where(ProcessTask::getProcessInstanceId, "=", instance.getId()) + .and(ProcessTask::getTaskName, "=", "invite") + .and(ProcessTask::getTaskState, "in", + List.of(ProcessTaskStateEnum.DOING.getCode(), ProcessTaskStateEnum.FINISHED.getCode())) + .desc(ProcessTask::getCreatedAt)); - if (inviteTask != null) { - NutMap variable = Json.fromJson(NutMap.class, inviteTask.getVariable()); - List seconders = variable.getAsList(FlowConst.TASK_FORM_DATA_PREFIX + "seconder", NutMap.class); - if (Lang.isNotEmpty(seconders)) { - list.get(i).put("secondedUserNames", seconders.stream().map(v -> v.getString("userName")).collect(Collectors.joining(","))); + if (inviteTask != null) { + NutMap variable = Json.fromJson(NutMap.class, inviteTask.getVariable()); + List seconders = variable.getAsList(FlowConst.TASK_FORM_DATA_PREFIX + "seconder", NutMap.class); + if (Lang.isNotEmpty(seconders)) { + list.get(i).put("secondedUserNames", seconders.stream().map(v -> v.getString("userName")).collect(Collectors.joining(","))); + } } } } @@ -241,6 +259,10 @@ public class ProposalExportServiceImpl extends BaseServiceImpl imp List exportEntities = new ArrayList<>(); exportEntities.add(new ExcelExportEntity("序号", "index", 10)); exportEntities.add(new ExcelExportEntity("提案编号", "code", 20)); + exportEntities.add(new ExcelExportEntity("立案编号", "caseFilingCode", 20)); + exportEntities.add(new ExcelExportEntity("立案结果", "caseFilingResultName", 15)); + exportEntities.add(new ExcelExportEntity("立案类型", "caseFilingTypeName", 15)); + exportEntities.add(new ExcelExportEntity("是否并案", "isConsolidationName", 12)); exportEntities.add(new ExcelExportEntity("提案名称", "name", 20)); exportEntities.add(new ExcelExportEntity("提案案由", "brief", 40)); exportEntities.add(new ExcelExportEntity("代表调研情况", "researchFindings", 40)); @@ -391,14 +413,14 @@ public class ProposalExportServiceImpl extends BaseServiceImpl imp LinkedHashSet masterUnitNames = getUnitNameSet(proposalRow, "masterUnitNames"); LinkedHashSet slaveUnitNames = getUnitNameSet(proposalRow, "slaveUnitNames"); NutMap excelRow = NutMap.NEW() - .addv("code", proposalRow.getString("code")) - .addv("caseFilingCode", proposalRow.getString("caseFilingCode")) + // 承办单位表统一展示为“立案编号”;未生成立案编号的工作建议回退显示提案编号。 + .addv("caseFilingCode", StrUtil.blankToDefault(proposalRow.getString("caseFilingCode"), + proposalRow.getString("code"))) .addv("name", proposalRow.getString("name")) .addv("createUserName", proposalRow.getString("createUserName")) .addv("masterUnitNames", "") .addv("slaveUnitNames", "") - .addv("workSuggestionUnitNames", "") - .addv("remark", ""); + .addv("workSuggestionUnitNames", ""); if ("CONFIRM_FILING".equals(proposalRow.getString("caseFilingResult"))) { excelRow.put("masterUnitNames", String.join(",", masterUnitNames)); excelRow.put("slaveUnitNames", String.join(",", slaveUnitNames)); @@ -412,14 +434,12 @@ public class ProposalExportServiceImpl extends BaseServiceImpl imp } if (!suggestionRows.isEmpty()) { filingRows.add(NutMap.NEW() - .addv("code", WORK_SUGGESTION_SECTION_MARKER) - .addv("caseFilingCode", "") + .addv("caseFilingCode", WORK_SUGGESTION_SECTION_MARKER) .addv("name", "") .addv("createUserName", "") .addv("masterUnitNames", "") .addv("slaveUnitNames", "") - .addv("workSuggestionUnitNames", "") - .addv("remark", "")); + .addv("workSuggestionUnitNames", "")); filingRows.addAll(suggestionRows); } return filingRows; @@ -430,14 +450,12 @@ public class ProposalExportServiceImpl extends BaseServiceImpl imp */ private Workbook buildUndertakeUnitWorkbook(String title, String unitName, List excelRows) { List exportEntities = new ArrayList<>(); - exportEntities.add(new ExcelExportEntity("提案编号", "code", 18)); - exportEntities.add(new ExcelExportEntity("立案编号", "caseFilingCode", 18)); - exportEntities.add(new ExcelExportEntity("提案名称", "name", 45)); - exportEntities.add(new ExcelExportEntity("提案人", "createUserName", 15)); - exportEntities.add(new ExcelExportEntity("主办单位", "masterUnitNames", 28)); - exportEntities.add(new ExcelExportEntity("协办单位", "slaveUnitNames", 28)); - exportEntities.add(new ExcelExportEntity("工作建议送达单位", "workSuggestionUnitNames", 32)); - exportEntities.add(new ExcelExportEntity("备注", "remark", 20)); + exportEntities.add(new ExcelExportEntity("立案编号", "caseFilingCode", 11)); + exportEntities.add(new ExcelExportEntity("提案名称", "name", 43)); + exportEntities.add(new ExcelExportEntity("提案人", "createUserName", 13)); + exportEntities.add(new ExcelExportEntity("主办单位", "masterUnitNames", 19)); + exportEntities.add(new ExcelExportEntity("协办单位", "slaveUnitNames", 25)); + exportEntities.add(new ExcelExportEntity("工作建议送达单位", "workSuggestionUnitNames", 17)); for (ExcelExportEntity exportEntity : exportEntities) { exportEntity.setWrap(true); } @@ -448,14 +466,59 @@ public class ProposalExportServiceImpl extends BaseServiceImpl imp exportParams.setSecondTitle("(" + unitName + ")"); exportParams.setSheetName("提案承办单位表"); exportParams.setHeaderHeight(30); - exportParams.setHeight((short) 24); + exportParams.setHeight((short) 13); Workbook workbook = ExcelExportUtil.exportExcel(exportParams, exportEntities, excelRows); mergeWorkSuggestionSection(workbook); + applyUndertakeUnitWorkbookStyle(workbook); return workbook; } /** - * 查找工作建议标记行,将八个单元格合并并设置为居中的分组标题。 + * 为承办单位表的全部有效单元格设置细实线边框,并保证第二行承办单位名称加粗且水平、垂直居中。 + * 相同原始样式复用同一个克隆样式,避免按单元格重复创建样式导致工作簿样式数量过多。 + */ + private void applyUndertakeUnitWorkbookStyle(Workbook workbook) { + Sheet sheet = workbook.getSheetAt(0); + Map borderedStyles = new HashMap<>(); + Font unitNameFont = workbook.createFont(); + unitNameFont.setFontName("宋体"); + unitNameFont.setFontHeightInPoints((short) 11); + unitNameFont.setBold(true); + for (int rowIndex = 0; rowIndex <= sheet.getLastRowNum(); rowIndex++) { + Row row = sheet.getRow(rowIndex); + if (row == null) { + continue; + } + boolean centerUnitName = rowIndex == UNDERTAKE_UNIT_SECOND_TITLE_ROW_INDEX; + for (int columnIndex = 0; columnIndex < UNDERTAKE_UNIT_EXPORT_COLUMN_COUNT; columnIndex++) { + Cell cell = row.getCell(columnIndex); + if (cell == null) { + cell = row.createCell(columnIndex); + } + CellStyle sourceStyle = cell.getCellStyle(); + String styleKey = sourceStyle.getIndex() + ":" + centerUnitName; + CellStyle borderedStyle = borderedStyles.get(styleKey); + if (borderedStyle == null) { + borderedStyle = workbook.createCellStyle(); + borderedStyle.cloneStyleFrom(sourceStyle); + borderedStyle.setBorderTop(BorderStyle.THIN); + borderedStyle.setBorderRight(BorderStyle.THIN); + borderedStyle.setBorderBottom(BorderStyle.THIN); + borderedStyle.setBorderLeft(BorderStyle.THIN); + if (centerUnitName) { + borderedStyle.setAlignment(HorizontalAlignment.CENTER); + borderedStyle.setVerticalAlignment(VerticalAlignment.CENTER); + borderedStyle.setFont(unitNameFont); + } + borderedStyles.put(styleKey, borderedStyle); + } + cell.setCellStyle(borderedStyle); + } + } + } + + /** + * 查找工作建议标记行,将承办单位表的全部单元格合并并设置为居中的分组标题。 */ private void mergeWorkSuggestionSection(Workbook workbook) { Sheet sheet = workbook.getSheetAt(0); @@ -557,47 +620,37 @@ public class ProposalExportServiceImpl extends BaseServiceImpl imp @Override public void exportProposalStatisticsAsZip(ProposalQueryComprehensiveParam pageForm, HttpServletResponse response) { - Sql sql = Sqls.create(""" - SELECT - info.id, - info.code, - info.name - FROM - proposal_info info - LEFT JOIN proposal_type type on type.id = info.typeId - LEFT JOIN teacher_congress_session tcs on tcs.id = info.sessionId - LEFT JOIN teacher_congress_delegation tcd on tcd.id = info.delegationId - LEFT JOIN teacher_congress_delegate tcde on tcde.loginName = info.createUserLoginName - $condition - """); - Cnd cnd = Cnd.NEW(); - ProposalQueryComprehensiveParam.buildSearch(cnd, pageForm); - sql.setCondition(cnd); - List list = listMap(sql); + List list = queryProposalBaseList(pageForm); + if (Lang.isEmpty(list)) { + throw new BaseException("当前筛选条件下没有可导出的提案数据"); + } - try { - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - ZipOutputStream zipOutputStream = new ZipOutputStream(bos); + try (ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ZipOutputStream zipOutputStream = new ZipOutputStream(bos)) { + Map entryNameCounts = new HashMap<>(); for (NutMap proposalRow : list) { try (ByteArrayOutputStream docxByteArrayOutputStream = new ByteArrayOutputStream()) { proposalCommonService.exportProposalAsDocx(proposalRow.getString("id"), docxByteArrayOutputStream); - ZipEntry zipEntry = new ZipEntry(proposalRow.getString("code") + "-" + sanitizeZipFileName(proposalRow.getString("name")) + ".docx"); + if (docxByteArrayOutputStream.size() == 0) { + throw new BaseException("提案【{}】Word生成失败", proposalRow.getString("code")); + } + ZipEntry zipEntry = new ZipEntry(createUniqueZipDocxEntryName("", proposalRow, entryNameCounts)); zipOutputStream.putNextEntry(zipEntry); docxByteArrayOutputStream.writeTo(zipOutputStream); zipOutputStream.closeEntry(); } catch (IOException e) { - // 处理单个文件生成失败的情况 - throw new RuntimeException("zip entry write failed, proposalId=" + proposalRow.getString("id"), e); + throw new BaseException("提案【{}】写入压缩包失败", proposalRow.getString("code")); } } zipOutputStream.finish(); - zipOutputStream.close(); CommonDownloadUtil.download("提案汇总压缩包.zip", bos.toByteArray(), response); } catch (Exception e) { - e.printStackTrace(); + log.error("批量导出提案表压缩包失败", e); + if (e instanceof BaseException) { + throw (BaseException) e; + } + throw new BaseException("批量导出提案表压缩包失败:{}", e.getMessage()); } - - } @@ -653,10 +706,14 @@ public class ProposalExportServiceImpl extends BaseServiceImpl imp LEFT JOIN proposal_type type on type.id = info.typeId LEFT JOIN teacher_congress_session tcs on tcs.id = info.sessionId LEFT JOIN teacher_congress_delegation tcd on tcd.id = info.delegationId - LEFT JOIN teacher_congress_delegate tcde on tcde.loginName = info.createUserLoginName + LEFT JOIN teacher_congress_delegate tcde + ON tcde.loginName = info.createUserLoginName AND tcde.sessionId = info.sessionId + LEFT JOIN proposal_reply_unit pru ON pru.proposalId = info.id $condition """); Cnd cnd = Cnd.NEW(); + // 综合导出页面按当前选择的届次导出,避免公共查询参数的跨届次场景影响导出范围。 + cnd.andEX("info.sessionId", "=", pageForm.getSessionId()); ProposalQueryComprehensiveParam.buildSearch(cnd, pageForm); cnd.groupBy("info.id"); cnd.asc("info.code"); @@ -687,46 +744,46 @@ public class ProposalExportServiceImpl extends BaseServiceImpl imp return StrUtil.blankToDefault(name, "unnamed").replaceAll("[\\\\/:*?\"<>|\\r\\n]+", "_"); } + /** + * 生成 ZIP 内唯一且合法的 Word 文件名,避免提案名称中的非法字符或重名条目导致整个压缩包缺文件。 + * + * @param prefix 文档类型前缀;为空时直接使用提案编号和名称 + * @param proposalRow 提案基础信息 + * @param entryNameCounts 已生成的基础文件名及其出现次数 + * @return 可以直接用于 ZipEntry 的文件名 + */ + private String createUniqueZipDocxEntryName(String prefix, NutMap proposalRow, Map entryNameCounts) { + String prefixText = StrUtil.isBlank(prefix) ? "" : prefix + "-"; + String baseName = sanitizeZipFileName(prefixText + proposalRow.getString("code", "未编号") + "-" + proposalRow.getString("name", "未命名提案")); + int sameNameCount = entryNameCounts.merge(baseName, 1, Integer::sum); + return baseName + (sameNameCount > 1 ? "-" + sameNameCount : "") + ".docx"; + } + @Override public void exportFeedBackAsZip(ProposalQueryComprehensiveParam pageForm, HttpServletResponse response) { - Sql sql = Sqls.create(""" - SELECT - info.id, - info.code, - info.name - FROM - proposal_info info - LEFT JOIN proposal_type type on type.id = info.typeId - LEFT JOIN teacher_congress_session tcs on tcs.id = info.sessionId - LEFT JOIN teacher_congress_delegation tcd on tcd.id = info.delegationId - LEFT JOIN teacher_congress_delegate tcde on tcde.loginName = info.createUserLoginName - $condition - """); - Cnd cnd = Cnd.NEW(); - cnd.groupBy("info.id"); - ProposalQueryComprehensiveParam.buildSearch(cnd, pageForm); - sql.setCondition(cnd); - List list = listMap(sql); - - try { - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - ZipOutputStream zipOutputStream = new ZipOutputStream(bos); + List list = queryProposalBaseList(pageForm); + try (ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ZipOutputStream zipOutputStream = new ZipOutputStream(bos)) { + Map entryNameCounts = new HashMap<>(); for (NutMap proposalRow : list) { try (ByteArrayOutputStream docxByteArrayOutputStream = new ByteArrayOutputStream()) { proposalCommonService.exportProposalFeedBackAsDocx(proposalRow.getString("id"), docxByteArrayOutputStream); - ZipEntry zipEntry = new ZipEntry("反馈表-" + proposalRow.getString("code") + "-" + proposalRow.getString("name") + ".docx"); + if (docxByteArrayOutputStream.size() == 0) { + throw new BaseException("提案【{}】反馈表生成失败", proposalRow.getString("code")); + } + ZipEntry zipEntry = new ZipEntry(createUniqueZipDocxEntryName("反馈表", proposalRow, entryNameCounts)); zipOutputStream.putNextEntry(zipEntry); docxByteArrayOutputStream.writeTo(zipOutputStream); zipOutputStream.closeEntry(); } catch (IOException e) { - // 处理单个文件生成失败的情况 - e.printStackTrace(); + throw new BaseException("提案【{}】反馈表写入压缩包失败", proposalRow.getString("code")); } } - zipOutputStream.close(); + zipOutputStream.finish(); CommonDownloadUtil.download("提案反馈表压缩包.zip", bos.toByteArray(), response); } catch (Exception e) { - e.printStackTrace(); + log.error("导出提案反馈表压缩包失败", e); + throw new BaseException("导出提案反馈表压缩包失败:{}", e.getMessage()); } } @@ -834,43 +891,29 @@ public class ProposalExportServiceImpl extends BaseServiceImpl imp @Override public void exportCollectZip(ProposalQueryComprehensiveParam pageForm, HttpServletResponse response) { - Sql sql = Sqls.create(""" - SELECT - info.id, - info.code, - info.name - FROM - proposal_info info - LEFT JOIN teacher_congress_session tcs on tcs.id = info.sessionId - LEFT JOIN teacher_congress_delegation tcd on tcd.id = info.delegationId - LEFT JOIN teacher_congress_delegate tcde on tcde.loginName = info.createUserLoginName - $condition - """); - Cnd cnd = Cnd.NEW(); - cnd.groupBy("info.id"); - ProposalQueryComprehensiveParam.buildSearch(cnd, pageForm); - sql.setCondition(cnd); - List list = listMap(sql); - - try { - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - ZipOutputStream zipOutputStream = new ZipOutputStream(bos); + List list = queryProposalBaseList(pageForm); + try (ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ZipOutputStream zipOutputStream = new ZipOutputStream(bos)) { + Map entryNameCounts = new HashMap<>(); for (NutMap proposalRow : list) { try (ByteArrayOutputStream docxByteArrayOutputStream = new ByteArrayOutputStream()) { exportCollectDocx(proposalRow.getString("id"), docxByteArrayOutputStream); - ZipEntry zipEntry = new ZipEntry("征集表-" + proposalRow.getString("code") + "-" + proposalRow.getString("name") + ".docx"); + if (docxByteArrayOutputStream.size() == 0) { + throw new BaseException("提案【{}】征集表生成失败", proposalRow.getString("code")); + } + ZipEntry zipEntry = new ZipEntry(createUniqueZipDocxEntryName("征集表", proposalRow, entryNameCounts)); zipOutputStream.putNextEntry(zipEntry); docxByteArrayOutputStream.writeTo(zipOutputStream); zipOutputStream.closeEntry(); } catch (IOException e) { - // 处理单个文件生成失败的情况 - e.printStackTrace(); + throw new BaseException("提案【{}】征集表写入压缩包失败", proposalRow.getString("code")); } } - zipOutputStream.close(); + zipOutputStream.finish(); CommonDownloadUtil.download("提案征集表压缩包.zip", bos.toByteArray(), response); } catch (Exception e) { - e.printStackTrace(); + log.error("导出提案征集表压缩包失败", e); + throw new BaseException("导出提案征集表压缩包失败:{}", e.getMessage()); } } @@ -882,18 +925,23 @@ public class ProposalExportServiceImpl extends BaseServiceImpl imp info.id, info.name, info.code, + info.caseFilingCode, + info.caseFilingResult, + info.caseFilingType, info.researchFindings, info.brief, info.measures, info.createUserName, tcde.unitName, tcde.mobile, - IF(mer.proposalId IS NOT NULL, '是', '') AS merge, + IF(mer.proposalId IS NOT NULL, '是', '否') AS merge, type.name AS typeName, tcs.j, tcs.c, tcs.fullName AS sessionName, tcd.`name` AS delegationName, + ins.state AS instanceState, + t.displayName AS curTaskName, GROUP_CONCAT(DISTINCT CASE WHEN pru.isMaster = 1 THEN pru.unitName END) AS masterUnitName, GROUP_CONCAT(DISTINCT CASE WHEN pru.isMaster = 0 THEN pru.unitName END) AS slaveUnitNames FROM @@ -903,6 +951,8 @@ public class ProposalExportServiceImpl extends BaseServiceImpl imp LEFT JOIN teacher_congress_session tcs on tcs.id = info.sessionId LEFT JOIN teacher_congress_delegation tcd on tcd.id = info.delegationId LEFT JOIN teacher_congress_delegate tcde on tcde.loginName = info.createUserLoginName + LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id + LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10 LEFT JOIN proposal_reply_unit pru ON pru.proposalId = info.id $condition """); @@ -947,6 +997,24 @@ public class ProposalExportServiceImpl extends BaseServiceImpl imp Map processInstanceStateMap = processInstanceState.stream().collect(Collectors.toMap(Sys_dict::getCode, Sys_dict::getName)); for (NutMap row : list) { + String caseFilingResultCode = row.getString("caseFilingResult"); + String masterUnitName = StrUtil.blankToDefault(row.getString("masterUnitName"), ""); + String slaveUnitNames = StrUtil.blankToDefault(row.getString("slaveUnitNames"), ""); + // 自定义导出没有前端单元格渲染,需要按列表相同规则生成承办单位文本。 + if ("SUGGESTION".equals(caseFilingResultCode)) { + row.put("undertakeUnits", StrUtil.isNotBlank(masterUnitName) ? masterUnitName : slaveUnitNames); + } else if ("CONFIRM_FILING".equals(caseFilingResultCode)) { + List undertakeUnitTexts = new ArrayList<>(); + if (StrUtil.isNotBlank(masterUnitName)) { + undertakeUnitTexts.add("主办:" + masterUnitName); + } + if (StrUtil.isNotBlank(slaveUnitNames)) { + undertakeUnitTexts.add("协办:" + slaveUnitNames); + } + row.put("undertakeUnits", String.join(";", undertakeUnitTexts)); + } else { + row.put("undertakeUnits", ""); + } row.put("caseFilingResult", caseFilingResultMap.get(row.getString("caseFilingResult"))); row.put("caseFilingType", caseFilingTypeMap.get(row.getString("caseFilingType"))); row.put("instanceState", processInstanceStateMap.get(row.getString("instanceState"))); diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/impl/ProposalSecondedServiceImpl.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/impl/ProposalSecondedServiceImpl.java index 5f1b204a..06b7f49a 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/impl/ProposalSecondedServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/impl/ProposalSecondedServiceImpl.java @@ -3,11 +3,17 @@ package com.budwk.app.zhgh.democratic.proposal.service.impl; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; import com.budwk.app.base.service.impl.BaseServiceImpl; +import com.budwk.app.flow.entity.ProcessInstance; +import com.budwk.app.flow.entity.ProcessTask; +import com.budwk.app.flow.engine.util.FlowUtil; import com.budwk.app.flow.enums.ProcessSubmitTypeEnum; +import com.budwk.app.flow.enums.ProcessTaskStateEnum; import com.budwk.app.zhgh.democratic.proposal.models.ProposalSecond; import com.budwk.app.zhgh.democratic.proposal.service.ProposalSecondedService; +import org.nutz.aop.interceptor.ioc.TransAop; import org.nutz.dao.Cnd; import org.nutz.dao.Dao; +import org.nutz.ioc.aop.Aop; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.lang.Strings; @@ -19,6 +25,31 @@ public class ProposalSecondedServiceImpl extends BaseServiceImpl } @Override + public boolean isDelegationReviewed(String proposalId) { + if (Strings.isBlank(proposalId)) { + return false; + } + // 以提案最新一次流程实例为准;团长同意或不同意均截止附议,退回提案人则允许后续重新邀请附议。 + ProcessInstance processInstance = this.dao().fetch(ProcessInstance.class, + Cnd.where(ProcessInstance::getBusinessNo, "=", proposalId) + .desc(ProcessInstance::getCreatedAt)); + if (processInstance == null) { + return false; + } + return this.dao().query(ProcessTask.class, + Cnd.where(ProcessTask::getProcessInstanceId, "=", processInstance.getId()) + .and(ProcessTask::getTaskName, "=", "delegation") + .and(ProcessTask::getTaskState, "=", ProcessTaskStateEnum.FINISHED.getCode())) + .stream() + .anyMatch(task -> { + Integer submitType = FlowUtil.variableToDict(task.getVariable()).getInt("submitType"); + return ObjectUtil.equals(submitType, ProcessSubmitTypeEnum.AGREE.getCode()) + || ObjectUtil.equals(submitType, ProcessSubmitTypeEnum.REJECT.getCode()); + }); + } + + @Override + @Aop(TransAop.READ_COMMITTED) public void updateSecondRecord(String proposalId, String taskActorUserId, String opinion, Integer submitType) { if (Strings.isBlank(proposalId) || Strings.isBlank(taskActorUserId) || submitType == null) { return; diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/RepresentativeChangeRecordController.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/RepresentativeChangeRecordController.java new file mode 100644 index 00000000..03a412b8 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/RepresentativeChangeRecordController.java @@ -0,0 +1,49 @@ +package com.budwk.app.zhgh.democratic.teachercongress.delegate.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.result.Result; +import com.budwk.app.zhgh.democratic.teachercongress.delegate.param.RepresentativeChangeRecordPageParam; +import com.budwk.app.zhgh.democratic.teachercongress.delegate.service.RepresentativeChangeRecordService; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.util.NutMap; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; + +import javax.validation.Valid; + +/** + * 教代会代表变动记录页面及查询接口。 + */ +@IocBean +@At("/platform/jdh/db/changeRecord") +@Ok("json:full") +public class RepresentativeChangeRecordController { + + @Inject + private RepresentativeChangeRecordService representativeChangeRecordService; + + /** + * 打开代表变动记录页面。 + */ + @At("") + @Ok("beetl:/platform/zhgh/democratic/teachercongress/delegate/changeRecord/index.html") + @SaCheckPermission("sys.jdh.db.changeRecord") + public void index() { + } + + /** + * 分页查询代表变动记录。 + * + * @param pageForm 分页、关键字及组织筛选参数 + * @return 代表变动记录分页结果 + */ + @At + @SaCheckPermission("sys.jdh.db.changeRecord") + public Result pageData(@Valid @Param("pageForm") RepresentativeChangeRecordPageParam pageForm) { + Pagination pagination = representativeChangeRecordService.pageData(pageForm); + return Result.success(pagination); + } +} diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegateManageController.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegateManageController.java index 98f21e8b..9411a930 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegateManageController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegateManageController.java @@ -27,6 +27,7 @@ import com.budwk.app.zhgh.democratic.teachercongress.delegate.service.TeacherCon import com.budwk.app.zhgh.democratic.teachercongress.delegation.models.Teacher_congress_delegation; import com.budwk.app.zhgh.democratic.teachercongress.delegation.models.Teacher_congress_delegation_union; import com.budwk.app.zhgh.democratic.teachercongress.delegation.models.Teacher_congress_delegation_unit; +import com.budwk.app.zhgh.democratic.teachercongress.prepare.service.TeacherCongressSessionService; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.apache.poi.ss.usermodel.*; @@ -68,6 +69,8 @@ public class TeacherCongressDelegateManageController { private SysRoleService sysRoleService; @Inject private TeacherCongressDelegateService teacherDelegateService; + @Inject + private TeacherCongressSessionService teacherCongressSessionService; @At("") @Ok("beetl:/platform/zhgh/democratic/teachercongress/delegate/manage/index.html") @@ -123,12 +126,14 @@ public class TeacherCongressDelegateManageController { .and(Sys_user_role::getTcSessionId, "=", param.getSessionId()) .and(Sys_user_role::getRoleId, "=", param.getRoleId())); + boolean roleEnable = teacherCongressSessionService.isSessionRoleEnabled(param.getSessionId()); List userRoles = userIds.stream().map(userId -> { Sys_user_role role = new Sys_user_role(); role.setUserId(userId); role.setTcSessionId(param.getSessionId()); role.setTcDelegationId(param.getDelegationId()); role.setRoleId(param.getRoleId()); + role.setEnable(roleEnable); return role; }).toList(); dao.insert(userRoles); @@ -160,6 +165,7 @@ public class TeacherCongressDelegateManageController { role.setTcSessionId(param.getSessionId()); role.setTcDelegationId(param.getDelegationId()); role.setRoleId(param.getRoleId()); + teacherCongressSessionService.prepareSessionRole(role); dao.insert(role); sysUserService.clearCache(); @@ -191,34 +197,7 @@ public class TeacherCongressDelegateManageController { @At @SaCheckPermission("tc.delegate.manage") public Result publicUser(@Valid TeacherCongressDelegateManagePublicUserParam param) { - List units = dao.query(Teacher_congress_delegation_unit.class, Cnd.where("sessionId", "=", param.getSessionId()).and("delegationId", "=", param.getDelegationId())); - List unitIds = units.stream().map(Teacher_congress_delegation_unit::getUnitId).toList(); - if (ObjectUtil.isEmpty(unitIds)) { - return Result.error("代表团没有组成单位"); - } - - Sql sql = Sqls.create(""" - SELECT - t1.id, - t1.username AS userName, - t1.loginName AS loginName, - t2.NAME AS unitName - FROM - `sys_user` t1 - LEFT JOIN sys_unit t2 ON t2.id = t1.unitId - WHERE - t1.id NOT IN ( SELECT userId FROM teacher_congress_delegate WHERE sessionId = @sessionId AND delegationId = @delegationId ) - AND - t1.unitId in (@unitIds) - AND - (t1.loginname like @keyWord or username like @keyWord) - """); - sql.setParam("sessionId", param.getSessionId()); - sql.setParam("delegationId", param.getDelegationId()); - sql.setParam("unitIds", unitIds); - sql.setParam("keyWord", "%" + param.getKeyWord() + "%"); - Pagination pagination = sysUserService.listPageMap(1, 50, sql); - return Result.success(pagination.getList()); + return Result.success(teacherDelegateService.listPublicUsers(param)); } /** @@ -330,12 +309,14 @@ public class TeacherCongressDelegateManageController { dao.insert(delegates); //插入权限 + boolean roleEnable = teacherCongressSessionService.isSessionRoleEnabled(sessionId); List sysUserRoles = delegates.stream().map(delegate -> { Sys_user_role sysUserRole = new Sys_user_role(); sysUserRole.setUserId(delegate.getUserId()); sysUserRole.setRoleId(delegate.getRoleId()); sysUserRole.setTcSessionId(sessionId); sysUserRole.setTcDelegationId(delegate.getDelegationId()); + sysUserRole.setEnable(roleEnable); return sysUserRole; }).toList(); dao.insert(sysUserRoles); @@ -464,7 +445,12 @@ public class TeacherCongressDelegateManageController { try { dao.insert(delegate); - dao.insert("sys_user_role", Chain.make("userId", delegate.getUserId()).add("roleId", delegate.getRoleId()).add("tcSessionId", sessionId).add("tcDelegationId", delegate.getDelegationId())); + // Excel导入也必须继承届次启用状态,避免向历史届次导入代表后恢复旧权限。 + dao.insert("sys_user_role", Chain.make("userId", delegate.getUserId()) + .add("roleId", delegate.getRoleId()) + .add("tcSessionId", sessionId) + .add("tcDelegationId", delegate.getDelegationId()) + .add("enable", teacherCongressSessionService.isSessionRoleEnabled(sessionId))); sysUserService.clearCache(); } catch (Exception e) { log.error("导入代表失败:{}", e.getMessage()); @@ -484,39 +470,7 @@ public class TeacherCongressDelegateManageController { @Aop(TransAop.READ_COMMITTED) @SaCheckPermission("tc.delegate.manage") public Result doAllocateDelegation(String sessionId) { - List delegateList = dao.query(Teacher_congress_delegate.class, - Cnd.where(Teacher_congress_delegate::getSessionId, "=", sessionId) - .and(Teacher_congress_delegate::getDelegationId, "is", null)); - - for (Teacher_congress_delegate delegate : delegateList) { - Teacher_congress_delegation_unit delegation_unit = dao.fetch(Teacher_congress_delegation_unit.class, - Cnd.where(Teacher_congress_delegation_unit::getUnitId, "=", delegate.getUnitId()) - .and(Teacher_congress_delegation_unit::getSessionId, "=", sessionId)); - if (ObjectUtil.isNotEmpty(delegation_unit)) { - delegate.setDelegationId(delegation_unit.getDelegationId()); - dao.update(delegate); - Sys_user_role userRole = new Sys_user_role(); - userRole.setTcDelegationId(delegation_unit.getDelegationId()); - userRole.setUserId(delegate.getUserId()); - userRole.setTcSessionId(sessionId); - Sys_role sys_role = dao.fetch(Sys_role.class, Cnd.where(Sys_role::getCode, "=", RoleConstant.TEACHER_CONGRESS_DELEGATE_FORMAL.name())); - - if (sys_role.getId().equals(delegate.getRoleId())) { - delegate.setRoleId(sys_role.getId()); - userRole.setRoleId(sys_role.getId()); - } - - Sys_role sys_role2 = dao.fetch(Sys_role.class, Cnd.where(Sys_role::getCode, "=", RoleConstant.TEACHER_CONGRESS_DELEGATE_ATTENDANCE.name())); - if (sys_role2.getId().equals(delegate.getRoleId())) { - delegate.setRoleId(sys_role2.getId()); - userRole.setRoleId(sys_role2.getId()); - } - userRole.setTcDelegationId(delegate.getDelegationId()); - dao.insert(userRole); - } - sysUserService.clearCache(); - } - return Result.success(); + return Result.success(teacherDelegateService.allocateDelegations(sessionId)); } diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/listener/TeacherCongressDelegateListener.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/listener/TeacherCongressDelegateListener.java index 75aa26f9..77597c84 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/listener/TeacherCongressDelegateListener.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/listener/TeacherCongressDelegateListener.java @@ -1,27 +1,14 @@ package com.budwk.app.zhgh.democratic.teachercongress.delegate.listener; -import cn.hutool.core.util.StrUtil; -import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.event.user.SysUserEvent; import com.budwk.app.base.event.user.SysUserEventListener; -import com.budwk.app.sys.models.Sys_role; -import com.budwk.app.sys.models.Sys_user_role; -import com.budwk.app.sys.services.SysRoleService; -import com.budwk.app.sys.services.SysUserService; -import com.budwk.app.sys.views.View_user; -import com.budwk.app.zhgh.democratic.proposal.models.ProposalConfig; -import com.budwk.app.zhgh.democratic.teachercongress.delegate.models.Teacher_congress_delegate; -import com.budwk.app.zhgh.democratic.teachercongress.delegation.models.Teacher_congress_delegation_unit; -import com.budwk.app.zhgh.democratic.teachercongress.prepare.models.Teacher_congress_session; +import com.budwk.app.zhgh.democratic.teachercongress.delegate.service.TeacherCongressDelegateService; import com.budwk.app.zhgh.staffmanage.member.constant.MemberChangeType; +import lombok.extern.slf4j.Slf4j; import org.nutz.aop.interceptor.async.Async; -import org.nutz.dao.Cnd; -import org.nutz.dao.Dao; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; -import java.util.List; - /** * @version 1.0 * @Author zzr @@ -30,14 +17,11 @@ import java.util.List; * @注释 */ @IocBean +@Slf4j public class TeacherCongressDelegateListener implements SysUserEventListener { @Inject - private Dao dao; - @Inject - private SysUserService sysUserService; - @Inject - private SysRoleService sysRoleService; + private TeacherCongressDelegateService teacherCongressDelegateService; @Override @Async @@ -46,65 +30,11 @@ public class TeacherCongressDelegateListener implements SysUserEventListener { return; } - //查询当前最新届次 - Teacher_congress_session session = dao.fetch(Teacher_congress_session.class, Cnd.NEW().desc(Teacher_congress_session::getStartDate)); - if (session == null) { - return; + try { + // 保持原有事件范围,仅将监听器内部归团逻辑下沉到事务服务。 + teacherCongressDelegateService.refreshCurrentDelegateOrganization(event.getUserId()); + } catch (Exception e) { + log.error("刷新教代会代表组织信息失败,userId={}", event.getUserId(), e); } - String userId = event.getUserId(); - //查询校领导的单位 - ProposalConfig config = dao.fetch(ProposalConfig.class, Cnd.NEW()); - List schoolLeaderUnitIds = config.getSchoolLeaderUnitIds(); - - View_user user = dao.fetch(View_user.class, Cnd.where(View_user::getId, "=", userId)); - - //校领导排除在外 - if (StrUtil.isNotBlank(user.getUnitId()) && schoolLeaderUnitIds.contains(user.getUnitId())) { - return; - } - - //查询当前代表的信息 - Teacher_congress_delegate currentDelegate = dao.fetch(Teacher_congress_delegate.class, Cnd.where(Teacher_congress_delegate::getSessionId, "=", session.getId())); - if(currentDelegate == null){ - return; - } - - //查询当前分配的单位属于哪个代表团 - String unitId = user.getUnitId(); - Teacher_congress_delegation_unit unit = dao.fetch(Teacher_congress_delegation_unit.class, Cnd.where(Teacher_congress_delegation_unit::getSessionId, "=", session) - .and(Teacher_congress_delegation_unit::getUnitId, "=", unitId)); - String delegationId = unit.getDelegationId(); - - currentDelegate.setDelegationId(delegationId); - currentDelegate.setUnitId(user.getUnitId()); - currentDelegate.setUnitName(user.getUnitName()); - currentDelegate.setUnionId(user.getUnionId()); - currentDelegate.setUnionName(user.getUnionName()); - dao.updateIgnoreNull(currentDelegate); - - - //角色数据 - Sys_role delegateFormalRole = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_DELEGATE_FORMAL.name()); - Sys_role delegateAttendanceRole = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_DELEGATE_ATTENDANCE.name()); - Sys_role delegateSpeciallyInviteRole = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_DELEGATE_SPECIALLY_INVITE.name()); - Sys_role delegationHeadRole = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_DELEGATION_HEAD.name()); - - //删除权限 - //删除角色数据 - dao.clear(Sys_user_role.class, Cnd.where(Sys_user_role::getUserId, "=", userId) - .and(Sys_user_role::getRoleId, "in", List.of(delegateFormalRole.getId(), delegateAttendanceRole.getId(), delegateSpeciallyInviteRole.getId(), delegationHeadRole.getId())) - .and(Sys_user_role::getTcSessionId, "=", session.getId()) - ); - - //再加权限 - Sys_user_role sysUserRole = new Sys_user_role(); - sysUserRole.setUserId(userId); - sysUserRole.setTcSessionId(session.getId()); - sysUserRole.setTcDelegationId(currentDelegate.getDelegationId()); - sysUserRole.setRoleId(currentDelegate.getRoleId()); - dao.insert(sysUserRole); - - sysUserService.clearCache(); - sysRoleService.clearCache(); } } diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/models/RepresentativeChangeRecord.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/models/RepresentativeChangeRecord.java new file mode 100644 index 00000000..46983fe4 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/models/RepresentativeChangeRecord.java @@ -0,0 +1,106 @@ +package com.budwk.app.zhgh.democratic.teachercongress.delegate.models; + +import com.budwk.app.base.model.BaseModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.nutz.dao.entity.annotation.ColDefine; +import org.nutz.dao.entity.annotation.ColType; +import org.nutz.dao.entity.annotation.Column; +import org.nutz.dao.entity.annotation.Comment; +import org.nutz.dao.entity.annotation.Name; +import org.nutz.dao.entity.annotation.Table; +import org.nutz.dao.entity.annotation.TableMeta; +import org.nutz.dao.interceptor.annotation.PrevInsert; + +/** + * 教代会届次延用时产生的代表异动记录。 + * 记录代表在上一届与新一届之间单位、分工会及代表团的对应关系,供后续异动查询使用。 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Table("representative_change_record") +@TableMeta("{'mysql-charset':'utf8mb4'}") +@Comment("教代会代表异动记录") +public class RepresentativeChangeRecord extends BaseModel { + + @Name + @Comment("ID") + @ColDefine(type = ColType.VARCHAR, width = 32) + @PrevInsert(uu32 = true) + private String id; + + @Column + @Comment("用户ID") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String userId; + + @Column + @Comment("原教代会届次") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String oldJdhSession; + + @Column + @Comment("新教代会届次") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String newJdhSession; + + @Column + @Comment("原单位ID") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String oldUnitId; + + @Column + @Comment("原单位名称") + @ColDefine(type = ColType.VARCHAR, width = 500) + private String oldUnitName; + + @Column + @Comment("原工会ID") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String oldUnionId; + + @Column + @Comment("原工会名称") + @ColDefine(type = ColType.VARCHAR, width = 100) + private String oldUnionName; + + @Column + @Comment("原代表团ID") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String oldDbtId; + + @Column + @Comment("原代表团名称") + @ColDefine(type = ColType.VARCHAR, width = 100) + private String oldDbtName; + + @Column + @Comment("新单位ID") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String newUnitId; + + @Column + @Comment("新单位名称") + @ColDefine(type = ColType.VARCHAR, width = 500) + private String newUnitName; + + @Column + @Comment("新工会ID") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String newUnionId; + + @Column + @Comment("新工会名称") + @ColDefine(type = ColType.VARCHAR, width = 100) + private String newUnionName; + + @Column + @Comment("新代表团ID") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String newDbtId; + + @Column + @Comment("新代表团名称") + @ColDefine(type = ColType.VARCHAR, width = 100) + private String newDbtName; +} diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/models/Teacher_congress_delegate.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/models/Teacher_congress_delegate.java index e40c91b8..8649906f 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/models/Teacher_congress_delegate.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/models/Teacher_congress_delegate.java @@ -12,6 +12,9 @@ import org.nutz.dao.interceptor.annotation.PrevInsert; @EqualsAndHashCode(callSuper = true) @Table("teacher_congress_delegate") @TableMeta("{'mysql-charset':'utf8mb4'}") +@TableIndexes({ + @Index(name = "INDEX_TEACHER_CONGRESS_DELEGATE_LOGIN_SESSION", fields = {"loginName", "sessionId"}, unique = false) +}) @Comment("教代会代表") public class Teacher_congress_delegate extends BaseModel { diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/param/RepresentativeChangeRecordPageParam.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/param/RepresentativeChangeRecordPageParam.java new file mode 100644 index 00000000..697eacab --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/param/RepresentativeChangeRecordPageParam.java @@ -0,0 +1,22 @@ +package com.budwk.app.zhgh.democratic.teachercongress.delegate.param; + +import com.budwk.app.base.param.PageForm; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 代表变动记录分页查询参数。 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class RepresentativeChangeRecordPageParam extends PageForm { + + /** 新教代会届次ID。 */ + private String sessionId; + + /** 代表变动后的所属单位ID。 */ + private String unitId; + + /** 代表变动后的所属分工会ID。 */ + private String unionId; +} diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/service/RepresentativeChangeRecordService.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/service/RepresentativeChangeRecordService.java new file mode 100644 index 00000000..d532c499 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/service/RepresentativeChangeRecordService.java @@ -0,0 +1,21 @@ +package com.budwk.app.zhgh.democratic.teachercongress.delegate.service; + +import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.service.BaseService; +import com.budwk.app.zhgh.democratic.teachercongress.delegate.models.RepresentativeChangeRecord; +import com.budwk.app.zhgh.democratic.teachercongress.delegate.param.RepresentativeChangeRecordPageParam; +import org.nutz.lang.util.NutMap; + +/** + * 教代会代表变动记录服务。 + */ +public interface RepresentativeChangeRecordService extends BaseService { + + /** + * 分页查询代表变动记录,并关联人员及新旧届次名称。 + * + * @param pageForm 分页、关键字及组织筛选条件 + * @return 代表变动记录分页数据 + */ + Pagination pageData(RepresentativeChangeRecordPageParam pageForm); +} diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/service/TeacherCongressDelegateService.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/service/TeacherCongressDelegateService.java index 26918d6b..2d1f2366 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/service/TeacherCongressDelegateService.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/service/TeacherCongressDelegateService.java @@ -4,6 +4,8 @@ import com.budwk.app.base.page.Pagination; import com.budwk.app.base.service.BaseService; import com.budwk.app.zhgh.democratic.teachercongress.delegate.models.Teacher_congress_delegate; import com.budwk.app.zhgh.democratic.teachercongress.delegate.param.TeacherCongressDelegateManagePageParam; +import com.budwk.app.zhgh.democratic.teachercongress.delegate.param.TeacherCongressDelegateManagePublicUserParam; +import org.nutz.lang.util.NutMap; import javax.servlet.http.HttpServletResponse; import java.util.List; @@ -20,4 +22,27 @@ public interface TeacherCongressDelegateService extends BaseService listPublicUsers(TeacherCongressDelegateManagePublicUserParam param); + + /** + * 根据系统配置的单位或分工会组成关系,为尚未归团的代表自动分配代表团。 + * + * @param sessionId 届次ID + * @return 已分配、未分配数量及未分配人员名称 + */ + NutMap allocateDelegations(String sessionId); + + /** + * 人员组织变化后,按当前组成模式刷新其当前届次代表及角色归团信息。 + * + * @param userId 用户ID + */ + void refreshCurrentDelegateOrganization(String userId); } diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/service/TeacherCongressDelegateServiceImpl.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/service/TeacherCongressDelegateServiceImpl.java index 42a9bf19..ec3df4ae 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/service/TeacherCongressDelegateServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/service/TeacherCongressDelegateServiceImpl.java @@ -12,13 +12,24 @@ import com.budwk.app.base.utils.CommonDownloadUtil; import com.budwk.app.base.utils.PageUtil; import com.budwk.app.base.utils.SysOfficeTemplateUtil; import com.budwk.app.sys.models.Sys_role; +import com.budwk.app.sys.models.Sys_user_role; import com.budwk.app.sys.services.SysRoleService; +import com.budwk.app.sys.services.SysUserService; +import com.budwk.app.sys.views.View_user; import com.budwk.app.web.commons.auth.utils.AuthUtil; import com.budwk.app.zhgh.democratic.proposal.service.common.ProposalCommonService; import com.budwk.app.zhgh.democratic.teachercongress.delegate.models.Teacher_congress_delegate; import com.budwk.app.zhgh.democratic.teachercongress.delegate.param.TeacherCongressDelegateManagePageParam; +import com.budwk.app.zhgh.democratic.teachercongress.delegate.param.TeacherCongressDelegateManagePublicUserParam; import com.budwk.app.zhgh.democratic.teachercongress.delegate.vo.TeacherCongressDelegateExcelVO; import com.budwk.app.zhgh.democratic.teachercongress.prepare.models.Teacher_congress_session; +import com.budwk.app.zhgh.democratic.teachercongress.prepare.service.TeacherCongressSessionService; +import com.budwk.app.zhgh.democratic.teachercongress.delegation.constant.TeacherCongressDelegationCompositionMode; +import com.budwk.app.zhgh.democratic.teachercongress.delegation.models.Teacher_congress_delegation_union; +import com.budwk.app.zhgh.democratic.teachercongress.delegation.models.Teacher_congress_delegation_unit; +import com.budwk.app.zhgh.democratic.teachercongress.delegation.service.TeacherCongressDelegationService; +import com.budwk.app.zhgh.democratic.proposal.models.ProposalConfig; +import com.budwk.app.base.exception.BaseException; import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy; @@ -30,6 +41,8 @@ import org.nutz.dao.sql.Sql; import org.nutz.dao.util.cri.SqlExpressionGroup; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.ioc.aop.Aop; +import org.nutz.aop.interceptor.ioc.TransAop; import org.nutz.lang.util.NutMap; import javax.servlet.http.HttpServletResponse; @@ -39,6 +52,8 @@ import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Set; +import java.util.HashSet; @IocBean(args = {"refer:dao"}) public class TeacherCongressDelegateServiceImpl extends BaseServiceImpl implements TeacherCongressDelegateService { @@ -52,6 +67,139 @@ public class TeacherCongressDelegateServiceImpl extends BaseServiceImpl listPublicUsers(TeacherCongressDelegateManagePublicUserParam param) { + TeacherCongressDelegationCompositionMode mode = teacherCongressDelegationService.getCompositionMode(); + List organizationIds; + if (mode == TeacherCongressDelegationCompositionMode.UNION) { + organizationIds = dao().query(Teacher_congress_delegation_union.class, + Cnd.where(Teacher_congress_delegation_union::getSessionId, "=", param.getSessionId()) + .and(Teacher_congress_delegation_union::getDelegationId, "=", param.getDelegationId())) + .stream().map(Teacher_congress_delegation_union::getUnionId).toList(); + } else { + organizationIds = dao().query(Teacher_congress_delegation_unit.class, + Cnd.where(Teacher_congress_delegation_unit::getSessionId, "=", param.getSessionId()) + .and(Teacher_congress_delegation_unit::getDelegationId, "=", param.getDelegationId())) + .stream().map(Teacher_congress_delegation_unit::getUnitId).toList(); + } + if (organizationIds.isEmpty()) { + throw new BaseException("代表团没有组成" + mode.getLabel()); + } + + String organizationColumn = mode == TeacherCongressDelegationCompositionMode.UNION ? "u.unionId" : "u.unitId"; + Sql sql = Sqls.create("SELECT u.id,u.username AS userName,u.loginname AS loginName,u.unitName,u.unionName " + + "FROM vw_user u WHERE u.id NOT IN (SELECT userId FROM teacher_congress_delegate WHERE sessionId=@sessionId) " + + "AND " + organizationColumn + " IN (@organizationIds) " + + "AND (u.loginname LIKE @keyword OR u.username LIKE @keyword) ORDER BY u.loginname LIMIT 50"); + sql.setParam("sessionId", param.getSessionId()); + sql.setParam("organizationIds", organizationIds); + sql.setParam("keyword", "%" + param.getKeyWord() + "%"); + return listMap(sql); + } + + /** + * 为当前届次未归团代表批量解析代表团,同时刷新其届次代表角色,避免重复生成角色关系。 + */ + @Override + @Aop(TransAop.READ_COMMITTED) + public NutMap allocateDelegations(String sessionId) { + List delegates = query(Cnd.where(Teacher_congress_delegate::getSessionId, "=", sessionId) + .and(Teacher_congress_delegate::getDelegationId, "is", null)); + List unassignedNames = new ArrayList<>(); + int assignedCount = 0; + for (Teacher_congress_delegate delegate : delegates) { + String delegationId = teacherCongressDelegationService.resolveDelegationId(sessionId, delegate.getUnitId(), delegate.getUnionId()); + if (StrUtil.isBlank(delegationId)) { + unassignedNames.add(delegate.getUserName() + "(" + delegate.getLoginName() + ")"); + continue; + } + delegate.setDelegationId(delegationId); + updateIgnoreNull(delegate); + replaceDelegateRole(delegate); + assignedCount++; + } + sysUserService.clearCache(); + return NutMap.NEW().addv("assignedCount", assignedCount) + .addv("unassignedCount", unassignedNames.size()).addv("unassignedNames", unassignedNames); + } + + /** + * 人员组织变更事件只处理当前开启届次;代表身份保留,代表团负责人角色在跨团时清理。 + */ + @Override + @Aop(TransAop.READ_COMMITTED) + public void refreshCurrentDelegateOrganization(String userId) { + Teacher_congress_session session = dao().fetch(Teacher_congress_session.class, + Cnd.where(Teacher_congress_session::getEnable, "=", true).desc(Teacher_congress_session::getStartDate)); + if (session == null) { + return; + } + View_user user = dao().fetch(View_user.class, Cnd.where(View_user::getId, "=", userId)); + if (user == null) { + return; + } + ProposalConfig config = dao().fetch(ProposalConfig.class, Cnd.NEW()); + if (config != null && config.getSchoolLeaderUnitIds() != null + && StrUtil.isNotBlank(user.getUnitId()) && config.getSchoolLeaderUnitIds().contains(user.getUnitId())) { + return; + } + Teacher_congress_delegate delegate = fetch(Cnd.where(Teacher_congress_delegate::getSessionId, "=", session.getId()) + .and(Teacher_congress_delegate::getUserId, "=", userId)); + if (delegate == null) { + return; + } + + String oldDelegationId = delegate.getDelegationId(); + String newDelegationId = teacherCongressDelegationService.resolveDelegationId(session.getId(), user.getUnitId(), user.getUnionId()); + delegate.setDelegationId(newDelegationId); + delegate.setUnitId(user.getUnitId()); + delegate.setUnitName(user.getUnitName()); + delegate.setUnionId(user.getUnionId()); + delegate.setUnionName(user.getUnionName()); + delegate.setMobile(user.getMobile()); + update(delegate); + replaceDelegateRole(delegate); + if (!java.util.Objects.equals(oldDelegationId, newDelegationId)) { + clearDelegationManagerRoles(userId, session.getId()); + } + sysUserService.clearCache(); + sysRoleService.clearCache(); + } + + /** 替换代表本届次的同一身份角色,确保角色中的代表团ID与代表表一致。 */ + private void replaceDelegateRole(Teacher_congress_delegate delegate) { + dao().clear(Sys_user_role.class, Cnd.where(Sys_user_role::getUserId, "=", delegate.getUserId()) + .and(Sys_user_role::getRoleId, "=", delegate.getRoleId()) + .and(Sys_user_role::getTcSessionId, "=", delegate.getSessionId())); + Sys_user_role role = new Sys_user_role(); + role.setUserId(delegate.getUserId()); + role.setRoleId(delegate.getRoleId()); + role.setTcSessionId(delegate.getSessionId()); + role.setTcDelegationId(delegate.getDelegationId()); + teacherCongressSessionService.prepareSessionRole(role); + dao().insert(role); + } + + /** 跨代表团后清理团长、副团长及联络人角色,避免保留原代表团管理权限。 */ + private void clearDelegationManagerRoles(String userId, String sessionId) { + Set roleIds = new HashSet<>(); + roleIds.add(sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_DELEGATION_HEAD).getId()); + roleIds.add(sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_VICE_DELEGATION_HEAD).getId()); + roleIds.add(sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_DELEGATION_CONTACT).getId()); + dao().clear(Sys_user_role.class, Cnd.where(Sys_user_role::getUserId, "=", userId) + .and(Sys_user_role::getTcSessionId, "=", sessionId) + .and(Sys_user_role::getRoleId, "in", roleIds)); + } @Override public Pagination pageData(TeacherCongressDelegateManagePageParam pageForm) { diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/service/impl/RepresentativeChangeRecordServiceImpl.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/service/impl/RepresentativeChangeRecordServiceImpl.java new file mode 100644 index 00000000..47080468 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/service/impl/RepresentativeChangeRecordServiceImpl.java @@ -0,0 +1,96 @@ +package com.budwk.app.zhgh.democratic.teachercongress.delegate.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.service.impl.BaseServiceImpl; +import com.budwk.app.zhgh.democratic.teachercongress.delegate.models.RepresentativeChangeRecord; +import com.budwk.app.zhgh.democratic.teachercongress.delegate.param.RepresentativeChangeRecordPageParam; +import com.budwk.app.zhgh.democratic.teachercongress.delegate.service.RepresentativeChangeRecordService; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.dao.Sqls; +import org.nutz.dao.sql.Sql; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.util.NutMap; + +import java.util.Map; + +/** + * 教代会代表变动记录服务实现。 + */ +@IocBean(args = {"refer:dao"}) +public class RepresentativeChangeRecordServiceImpl extends BaseServiceImpl + implements RepresentativeChangeRecordService { + + /** 前端排序字段与查询字段映射,避免将未校验字段直接拼入 SQL。 */ + private static final Map SORT_COLUMNS = Map.of( + "username", "u.username", + "loginname", "u.loginname", + "oldJdhName", "oldSession.fullName", + "newJdhName", "newSession.fullName", + "oldUnitName", "c.oldUnitName", + "newUnitName", "c.newUnitName", + "oldDbtName", "c.oldDbtName", + "newDbtName", "c.newDbtName" + ); + + public RepresentativeChangeRecordServiceImpl(Dao dao) { + super(dao); + } + + /** + * 分页查询代表变动记录,并关联当前人员姓名、工号及新旧届次名称。 + * + * @param pageForm 分页、关键字及组织筛选条件 + * @return 可直接供列表展示的分页 Map 数据 + */ + @Override + @SuppressWarnings("unchecked") + public Pagination pageData(RepresentativeChangeRecordPageParam pageForm) { + Sql sql = Sqls.create(""" + SELECT + c.*, + u.username, + u.loginname, + oldSession.fullName AS oldJdhName, + newSession.fullName AS newJdhName + FROM representative_change_record c + LEFT JOIN sys_user u ON c.userId = u.id + LEFT JOIN teacher_congress_session oldSession ON oldSession.id = c.oldJdhSession + LEFT JOIN teacher_congress_session newSession ON newSession.id = c.newJdhSession + $condition + """); + sql.setCondition(buildCondition(pageForm)); + return listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + } + + /** + * 组装代表变动记录查询条件。单位和分工会均按变动后的组织信息筛选,保持与原系统口径一致。 + * + * @param pageForm 页面查询参数 + * @return SQL 查询条件及安全排序规则 + */ + private Cnd buildCondition(RepresentativeChangeRecordPageParam pageForm) { + Cnd cnd = Cnd.NEW(); + cnd.andEX("c.newJdhSession", "=", pageForm.getSessionId()); + cnd.andEX("c.newUnionId", "=", pageForm.getUnionId()); + cnd.andEX("c.newUnitId", "=", pageForm.getUnitId()); + if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) { + String keyword = "%" + pageForm.getSearchKeyword().trim() + "%"; + cnd.and(Cnd.exps("u.username", "like", keyword) + .or("u.loginname", "like", keyword)); + } + + String sortColumn = SORT_COLUMNS.get(pageForm.getPageOrderName()); + if (StrUtil.isNotBlank(sortColumn)) { + if ("ascending".equalsIgnoreCase(pageForm.getPageOrderBy())) { + cnd.asc(sortColumn); + } else { + cnd.desc(sortColumn); + } + } else { + cnd.desc("c.createdAt"); + } + return cnd; + } +} diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegation/constant/TeacherCongressDelegationCompositionMode.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegation/constant/TeacherCongressDelegationCompositionMode.java new file mode 100644 index 00000000..ef0f6995 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegation/constant/TeacherCongressDelegationCompositionMode.java @@ -0,0 +1,41 @@ +package com.budwk.app.zhgh.democratic.teachercongress.delegation.constant; + +/** + * 代表团组成模式。 + * + *

系统参数 {@code dbtzc} 为 {@code unit} 时按单位组成, + * 为 {@code union} 时按分工会组成;空值或非法值统一兼容为单位模式。

+ */ +public enum TeacherCongressDelegationCompositionMode { + UNIT("unit", "单位"), + UNION("union", "分工会"); + + private final String code; + private final String label; + + TeacherCongressDelegationCompositionMode(String code, String label) { + this.code = code; + this.label = label; + } + + public String getCode() { + return code; + } + + public String getLabel() { + return label; + } + + /** + * 将系统参数转换为组成模式,非法配置按历史默认行为使用单位模式。 + * + * @param value 系统参数值 + * @return 有效组成模式 + */ + public static TeacherCongressDelegationCompositionMode from(String value) { + if (UNION.code.equalsIgnoreCase(value)) { + return UNION; + } + return UNIT; + } +} diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegation/controller/TeacherCongressDelegationController.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegation/controller/TeacherCongressDelegationController.java index a86d1a43..b2d138be 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegation/controller/TeacherCongressDelegationController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegation/controller/TeacherCongressDelegationController.java @@ -170,45 +170,18 @@ public class TeacherCongressDelegationController { @At @SaCheckPermission("tc.delegation") public Result partUnitTransferData(@Valid String delegationId, @Valid String sessionId) { - //找出本届次已经设置了代表团的所有单位 - List delegationUnits = dao.query(Teacher_congress_delegation_unit.class, Cnd.where("sessionId", "=", sessionId)); - List unitIds = delegationUnits.stream().map(Teacher_congress_delegation_unit::getUnitId).toList(); - - //找出本代表团的单位 - List selectUnitIds = delegationUnits.stream().filter(unit -> unit.getDelegationId().equals(delegationId)).map(Teacher_congress_delegation_unit::getUnitId).toList(); - - SqlExpressionGroup seg = new SqlExpressionGroup(); - seg.orEX("id", "not in", unitIds); - seg.orEX("id", "in", selectUnitIds); - -// Cnd cnd = Cnd.where("unitLevel", "=", 2); - Cnd cnd = Cnd.where("unitTypeCode", "=", "1"); - if (!seg.isEmpty()) { - cnd.and(seg); - } - cnd.asc("unitcode"); - - List units = dao.query(Sys_unit.class, cnd); - - NutMap transferData = NutMap.NEW().addv("selectUnitIds", selectUnitIds).addv("allUnits", units); - return Result.success(transferData); + NutMap data = teacherCongressDelegationService.getCompositionTransferData(sessionId, delegationId); + // 保留旧接口字段,兼容未同步更新的历史页面调用。 + data.put("selectUnitIds", data.get("selectedIds")); + data.put("allUnits", data.get("allItems")); + return Result.success(data); } @At @SaCheckPermission("tc.delegation") @Aop(TransAop.READ_COMMITTED) public Result partUnitSet(@Valid String delegationId, @Valid String sessionId, @Param("unitIds") String[] unitIds) { - dao.clear(Teacher_congress_delegation_unit.class, Cnd.where("delegationId", "=", delegationId).and("sessionId", "=", sessionId)); - - List insertData = Arrays.stream(unitIds).map(unitId -> { - Teacher_congress_delegation_unit delegationUnit = new Teacher_congress_delegation_unit(); - delegationUnit.setUnitId(unitId); - delegationUnit.setDelegationId(delegationId); - delegationUnit.setSessionId(sessionId); - return delegationUnit; - }).toList(); - - dao.insert(insertData); + teacherCongressDelegationService.saveComposition(sessionId, delegationId, unitIds); return Result.success(); } @@ -222,24 +195,35 @@ public class TeacherCongressDelegationController { @At @SaCheckPermission("tc.delegation") public Result partUnitPageData(@Valid PageForm pageForm, @Valid String sessionId, @Valid String delegationId) { - Sql sql = Sqls.create(""" - SELECT - t2.id, - t2.`name` - FROM - teacher_congress_delegation_unit t1 - LEFT JOIN sys_unit t2 ON t2.id = t1.unitId - $condition - """); - Cnd cnd = Cnd.NEW(); - cnd.and("t1.delegationId", "=", delegationId); - cnd.and("t1.sessionId", "=", sessionId); - if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) { - cnd.where().andLike("t2.name", pageForm.getSearchKeyword()); - } - sql.setCondition(cnd); - Pagination pagination = baseService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); - return Result.success(pagination); + return Result.success(teacherCongressDelegationService.pageComposition(pageForm, sessionId, delegationId)); + } + + /** + * 获取当前配置模式下的代表团组成选择数据。 + */ + @At + @SaCheckPermission("tc.delegation") + public Result compositionTransferData(@Valid String delegationId, @Valid String sessionId) { + return Result.success(teacherCongressDelegationService.getCompositionTransferData(sessionId, delegationId)); + } + + /** + * 保存当前配置模式下的代表团组成关系。 + */ + @At + @SaCheckPermission("tc.delegation") + public Result compositionSet(@Valid String delegationId, @Valid String sessionId, @Param("itemIds") String[] itemIds) { + teacherCongressDelegationService.saveComposition(sessionId, delegationId, itemIds); + return Result.success(); + } + + /** + * 分页查询当前配置模式下的代表团组成关系。 + */ + @At + @SaCheckPermission("tc.delegation") + public Result compositionPageData(@Valid PageForm pageForm, @Valid String sessionId, @Valid String delegationId) { + return Result.success(teacherCongressDelegationService.pageComposition(pageForm, sessionId, delegationId)); } /** diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegation/service/TeacherCongressDelegationService.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegation/service/TeacherCongressDelegationService.java index 7d47a167..99b0a7e5 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegation/service/TeacherCongressDelegationService.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegation/service/TeacherCongressDelegationService.java @@ -1,6 +1,9 @@ package com.budwk.app.zhgh.democratic.teachercongress.delegation.service; import com.budwk.app.base.service.BaseService; +import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.param.PageForm; +import com.budwk.app.zhgh.democratic.teachercongress.delegation.constant.TeacherCongressDelegationCompositionMode; import com.budwk.app.zhgh.democratic.teachercongress.delegation.models.Teacher_congress_delegation; import org.nutz.lang.util.NutMap; @@ -11,6 +14,51 @@ import java.util.List; */ public interface TeacherCongressDelegationService extends BaseService { + /** + * 获取当前代表团组成模式。 + * + * @return 单位或分工会模式 + */ + TeacherCongressDelegationCompositionMode getCompositionMode(); + + /** + * 获取代表团组成选择器数据,已被其他代表团占用的数据不会返回。 + * + * @param sessionId 届次ID + * @param delegationId 代表团ID + * @return 组成模式、当前选中ID及可选项 + */ + NutMap getCompositionTransferData(String sessionId, String delegationId); + + /** + * 保存当前模式下的代表团组成关系。 + * + * @param sessionId 届次ID + * @param delegationId 代表团ID + * @param itemIds 单位ID或分工会ID + */ + void saveComposition(String sessionId, String delegationId, String[] itemIds); + + /** + * 分页查询当前模式下的代表团组成数据。 + * + * @param pageForm 分页查询参数 + * @param sessionId 届次ID + * @param delegationId 代表团ID + * @return 组成数据分页结果 + */ + Pagination pageComposition(PageForm pageForm, String sessionId, String delegationId); + + /** + * 按当前组成模式解析人员所属代表团。 + * + * @param sessionId 届次ID + * @param unitId 人员单位ID + * @param unionId 人员分工会ID + * @return 代表团ID,未配置时返回空 + */ + String resolveDelegationId(String sessionId, String unitId, String unionId); + /** * 按角色查询代表团负责人信息。 * @@ -41,4 +89,4 @@ public interface TeacherCongressDelegationService extends BaseService occupiedIds = new ArrayList<>(); + List selectedIds = new ArrayList<>(); + List allItems = new ArrayList<>(); + + if (mode == TeacherCongressDelegationCompositionMode.UNION) { + List relations = dao().query(Teacher_congress_delegation_union.class, + Cnd.where(Teacher_congress_delegation_union::getSessionId, "=", sessionId)); + relations.forEach(relation -> { + occupiedIds.add(relation.getUnionId()); + if (delegationId.equals(relation.getDelegationId())) { + selectedIds.add(relation.getUnionId()); + } + }); + Cnd cnd = buildAvailableCondition(occupiedIds, selectedIds); + cnd.asc(Sys_union::getUnionCode); + dao().query(Sys_union.class, cnd).forEach(item -> allItems.add(NutMap.NEW() + .addv("id", item.getId()).addv("name", item.getName()).addv("code", item.getUnionCode()))); + } else { + List relations = dao().query(Teacher_congress_delegation_unit.class, + Cnd.where(Teacher_congress_delegation_unit::getSessionId, "=", sessionId)); + relations.forEach(relation -> { + occupiedIds.add(relation.getUnitId()); + if (delegationId.equals(relation.getDelegationId())) { + selectedIds.add(relation.getUnitId()); + } + }); + Cnd cnd = Cnd.where(Sys_unit::getUnitTypeCode, "=", "1"); + appendAvailableCondition(cnd, occupiedIds, selectedIds); + cnd.asc(Sys_unit::getUnitcode); + dao().query(Sys_unit.class, cnd).forEach(item -> allItems.add(NutMap.NEW() + .addv("id", item.getId()).addv("name", item.getName()).addv("code", item.getUnitcode()))); + } + return NutMap.NEW().addv("mode", mode.getCode()).addv("label", mode.getLabel()) + .addv("selectedIds", selectedIds).addv("allItems", allItems); + } + + /** + * 保存当前组成模式对应的关联表,并在写入前校验跨代表团重复占用。 + */ + @Override + @Aop(TransAop.READ_COMMITTED) + public void saveComposition(String sessionId, String delegationId, String[] itemIds) { + validateDelegation(sessionId, delegationId); + List normalizedIds = itemIds == null ? Collections.emptyList() : Arrays.stream(itemIds) + .filter(StrUtil::isNotBlank).distinct().toList(); + TeacherCongressDelegationCompositionMode mode = getCompositionMode(); + if (mode == TeacherCongressDelegationCompositionMode.UNION) { + validateUnionIds(normalizedIds); + int occupied = normalizedIds.isEmpty() ? 0 : dao().count(Teacher_congress_delegation_union.class, + Cnd.where(Teacher_congress_delegation_union::getSessionId, "=", sessionId) + .and(Teacher_congress_delegation_union::getDelegationId, "!=", delegationId) + .and(Teacher_congress_delegation_union::getUnionId, "in", normalizedIds)); + if (occupied > 0) { + throw new BaseException("所选分工会已被其他代表团使用,请刷新后重试"); + } + dao().clear(Teacher_congress_delegation_union.class, Cnd.where(Teacher_congress_delegation_union::getSessionId, "=", sessionId) + .and(Teacher_congress_delegation_union::getDelegationId, "=", delegationId)); + normalizedIds.forEach(itemId -> { + Teacher_congress_delegation_union relation = new Teacher_congress_delegation_union(); + relation.setSessionId(sessionId); + relation.setDelegationId(delegationId); + relation.setUnionId(itemId); + dao().insert(relation); + }); + return; + } + + validateUnitIds(normalizedIds); + int occupied = normalizedIds.isEmpty() ? 0 : dao().count(Teacher_congress_delegation_unit.class, + Cnd.where(Teacher_congress_delegation_unit::getSessionId, "=", sessionId) + .and(Teacher_congress_delegation_unit::getDelegationId, "!=", delegationId) + .and(Teacher_congress_delegation_unit::getUnitId, "in", normalizedIds)); + if (occupied > 0) { + throw new BaseException("所选单位已被其他代表团使用,请刷新后重试"); + } + dao().clear(Teacher_congress_delegation_unit.class, Cnd.where(Teacher_congress_delegation_unit::getSessionId, "=", sessionId) + .and(Teacher_congress_delegation_unit::getDelegationId, "=", delegationId)); + normalizedIds.forEach(itemId -> { + Teacher_congress_delegation_unit relation = new Teacher_congress_delegation_unit(); + relation.setSessionId(sessionId); + relation.setDelegationId(delegationId); + relation.setUnitId(itemId); + dao().insert(relation); + }); + } + + /** + * 分页查询当前模式下的组成关系,统一向前端返回 id、name、code 字段。 + */ + @Override + public Pagination pageComposition(PageForm pageForm, String sessionId, String delegationId) { + validateDelegation(sessionId, delegationId); + boolean unionMode = getCompositionMode() == TeacherCongressDelegationCompositionMode.UNION; + String sqlText = unionMode + ? "SELECT t2.id,t2.name,t2.unionCode AS code FROM teacher_congress_delegation_union t1 LEFT JOIN sys_union t2 ON t2.id=t1.unionId $condition" + : "SELECT t2.id,t2.name,t2.unitcode AS code FROM teacher_congress_delegation_unit t1 LEFT JOIN sys_unit t2 ON t2.id=t1.unitId $condition"; + Sql sql = Sqls.create(sqlText); + Cnd cnd = Cnd.where("t1.sessionId", "=", sessionId).and("t1.delegationId", "=", delegationId); + if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) { + cnd.where().andLike("t2.name", pageForm.getSearchKeyword()); + } + cnd.asc("code"); + sql.setCondition(cnd); + return listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + } + + /** + * 按当前模式精确解析代表团;同一组织存在多条关系时拒绝随机匹配,避免代表被错误归团。 + */ + @Override + public String resolveDelegationId(String sessionId, String unitId, String unionId) { + TeacherCongressDelegationCompositionMode mode = getCompositionMode(); + if (mode == TeacherCongressDelegationCompositionMode.UNION) { + if (StrUtil.isBlank(unionId)) { + return null; + } + List relations = dao().query(Teacher_congress_delegation_union.class, + Cnd.where(Teacher_congress_delegation_union::getSessionId, "=", sessionId) + .and(Teacher_congress_delegation_union::getUnionId, "=", unionId)); + return resolveUniqueDelegation(relations.stream().map(Teacher_congress_delegation_union::getDelegationId).toList(), "分工会"); + } + if (StrUtil.isBlank(unitId)) { + return null; + } + List relations = dao().query(Teacher_congress_delegation_unit.class, + Cnd.where(Teacher_congress_delegation_unit::getSessionId, "=", sessionId) + .and(Teacher_congress_delegation_unit::getUnitId, "=", unitId)); + return resolveUniqueDelegation(relations.stream().map(Teacher_congress_delegation_unit::getDelegationId).toList(), "单位"); + } + + private Cnd buildAvailableCondition(List occupiedIds, List selectedIds) { + Cnd cnd = Cnd.NEW(); + appendAvailableCondition(cnd, occupiedIds, selectedIds); + return cnd; + } + + /** 当前代表团已选项允许继续显示,其余已占用项从选择器中排除。 */ + private void appendAvailableCondition(Cnd cnd, List occupiedIds, List selectedIds) { + if (occupiedIds.isEmpty()) { + return; + } + if (selectedIds.isEmpty()) { + cnd.and("id", "not in", occupiedIds); + return; + } + cnd.and(Cnd.exps("id", "not in", occupiedIds).or("id", "in", selectedIds)); + } + + /** 校验代表团确实属于当前届次,防止跨届次写入组成关系。 */ + private void validateDelegation(String sessionId, String delegationId) { + if (dao().count(Teacher_congress_delegation.class, Cnd.where(Teacher_congress_delegation::getId, "=", delegationId) + .and(Teacher_congress_delegation::getSessionId, "=", sessionId)) != 1) { + throw new BaseException("代表团或届次参数错误"); + } + } + + /** 校验提交的分工会ID均真实存在。 */ + private void validateUnionIds(List ids) { + if (!ids.isEmpty() && dao().count(Sys_union.class, Cnd.where(Sys_union::getId, "in", ids)) != ids.size()) { + throw new BaseException("所选分工会数据不存在,请刷新后重试"); + } + } + + /** 校验提交的单位ID均真实存在且属于代表团可用的单位类型。 */ + private void validateUnitIds(List ids) { + if (!ids.isEmpty() && dao().count(Sys_unit.class, Cnd.where(Sys_unit::getId, "in", ids) + .and(Sys_unit::getUnitTypeCode, "=", "1")) != ids.size()) { + throw new BaseException("所选单位数据不存在,请刷新后重试"); + } + } + + /** 对组织与代表团关系执行唯一性校验。 */ + private String resolveUniqueDelegation(List delegationIds, String label) { + if (delegationIds.isEmpty()) { + return null; + } + if (delegationIds.size() > 1) { + throw new BaseException(label + "存在重复代表团关系,请先检查代表团组成配置"); + } + return delegationIds.get(0); + } + /** * 按角色查询代表团负责人信息,副团长允许返回多条记录以兼容V3多副团长数据。 * @@ -86,17 +302,23 @@ public class TeacherCongressDelegationServiceImpl extends BaseServiceImpl delegates = dao().query(Teacher_congress_delegate.class, + Cnd.where(Teacher_congress_delegate::getSessionId, "=", sessionId) + .and(Teacher_congress_delegate::getDelegationId, "=", delegationId) + .and(Teacher_congress_delegate::getRoleId, "=", formalDelegateRole.getId()) + .and(Teacher_congress_delegate::getUserId, "in", viceUserIds)); + Set validUserIds = delegates.stream() + .map(Teacher_congress_delegate::getUserId) + .collect(Collectors.toSet()); + if (validUserIds.size() != viceUserIds.length) { + throw new BaseException("副团长必须从当前届次、当前代表团的正式代表中选择"); + } + } + + /** + * 校验角色关系的实际保存数量,防止接口在数据未完整写入时返回成功。 + * + * @param sessionId 届次ID + * @param delegationId 代表团ID + * @param roleId 角色ID + * @param expected 预期保存数量 + */ + private void validateRoleUserCount(String sessionId, String delegationId, String roleId, int expected) { + int actual = dao().count(Sys_user_role.class, + Cnd.where(Sys_user_role::getTcSessionId, "=", sessionId) + .and(Sys_user_role::getTcDelegationId, "=", delegationId) + .and(Sys_user_role::getRoleId, "=", roleId)); + if (actual != expected) { + throw new BaseException("副团长设置失败,请刷新页面后重试"); + } + } +} diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/controller/GuildHallMeetingController.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/controller/GuildHallMeetingController.java index 8034a468..6f9b3dae 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/controller/GuildHallMeetingController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/controller/GuildHallMeetingController.java @@ -7,6 +7,8 @@ import com.budwk.app.base.annotation.SLog; import com.budwk.app.base.page.Pagination; import com.budwk.app.base.param.PageForm; import com.budwk.app.base.result.Result; +import com.budwk.app.web.commons.auth.utils.SecurityUtil; +import com.budwk.app.zhgh.activity.basic.service.ActivityBasicScopeService; import com.budwk.app.zhgh.democratic.teachercongress.guildhall.models.GuildHall; import com.budwk.app.zhgh.democratic.teachercongress.guildhall.models.GuildHallMeeting; import com.budwk.app.zhgh.democratic.teachercongress.guildhall.models.GuildHallSeat; @@ -40,6 +42,9 @@ public class GuildHallMeetingController { @Inject private GuildHallMeetingService guildHallMeetingService; + @Inject + private ActivityBasicScopeService activityBasicScopeService; + @At("") @SaCheckPermission("guildHall.meeting") @Ok("beetl:/platform/zhgh/democratic/teachercongress/guildhall/meeting/index.html") @@ -109,6 +114,11 @@ public class GuildHallMeetingController { if(DateUtil.compare(DateUtil.date(), meeting.getEndTime()) > 0) { continue; } + // 配置参与组别后,仅向组内用户返回可选会议;未配置组别时默认全员可见。 + if (meeting.getGroupId() != null + && !activityBasicScopeService.isUserInGroup(meeting.getGroupId(), SecurityUtil.getUserId())) { + continue; + } NutMap nutMap = Lang.obj2nutmap(meeting); GuildHall hall = dao.fetch(GuildHall.class, meeting.getHallId()); nutMap.put("address", hall.getAddress()); diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/controller/GuildHallSelectSeatController.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/controller/GuildHallSelectSeatController.java index 8e44d0a1..9ddf6cb3 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/controller/GuildHallSelectSeatController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/controller/GuildHallSelectSeatController.java @@ -3,13 +3,16 @@ package com.budwk.app.zhgh.democratic.teachercongress.guildhall.controller; import cn.dev33.satoken.annotation.SaCheckPermission; import com.budwk.app.base.result.Result; import com.budwk.app.web.commons.auth.utils.SecurityUtil; +import com.budwk.app.zhgh.activity.basic.service.ActivityBasicScopeService; import com.budwk.app.zhgh.democratic.teachercongress.guildhall.models.GuildHallMeeting; import com.budwk.app.zhgh.democratic.teachercongress.guildhall.models.GuildHallSeat; import com.budwk.app.zhgh.democratic.teachercongress.guildhall.models.GuildHallSeatSelect; import com.budwk.app.zhgh.democratic.teachercongress.guildhall.service.GuildHallService; import io.swagger.annotations.Api; +import org.nutz.aop.interceptor.ioc.TransAop; import org.nutz.dao.Cnd; import org.nutz.dao.Dao; +import org.nutz.ioc.aop.Aop; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.mvc.annotation.At; @@ -36,6 +39,8 @@ public class GuildHallSelectSeatController { private Dao dao; @Inject private GuildHallService guildHallService; + @Inject + private ActivityBasicScopeService activityBasicScopeService; @At("") @SaCheckPermission("guildHall.selectSeat") @@ -52,6 +57,11 @@ public class GuildHallSelectSeatController { @At @SaCheckPermission("guildHall.selectSeat") public Result loadSeats(@Param("meetingId") String meetingId) { + Result permissionResult = checkMeetingPermission(meetingId); + if (permissionResult != null) { + return permissionResult; + } + // 已选择情况 List selectedSeats = dao.query(GuildHallSeatSelect.class, Cnd.where("meetingId", "=", meetingId)); @@ -79,7 +89,13 @@ public class GuildHallSelectSeatController { @At @SaCheckPermission("guildHall.selectSeat") + @Aop(TransAop.READ_COMMITTED) public Result doSelect(@Param("meetingId") String meetingId, Integer rowNumber, Integer colNumber) { + Result permissionResult = checkMeetingPermission(meetingId); + if (permissionResult != null) { + return permissionResult; + } + GuildHallSeatSelect oldSeat = dao.fetch(GuildHallSeatSelect.class, Cnd.where("meetingId", "=", meetingId).and("userId", "=", SecurityUtil.getUserId())); if(oldSeat != null){ oldSeat.setUserId(null); @@ -94,4 +110,22 @@ public class GuildHallSelectSeatController { return Result.success(); } + + /** + * 校验当前用户是否可参与指定会议;未配置参与组别的会议默认允许选座。 + * + * @param meetingId 会议主键,用于查询会议的参与组别配置 + * @return 校验通过时返回 {@code null};会议不存在或用户不在参与组别时返回错误结果 + */ + private Result checkMeetingPermission(String meetingId) { + GuildHallMeeting meeting = dao.fetch(GuildHallMeeting.class, meetingId); + if (meeting == null) { + return Result.error("会议不存在或已删除"); + } + if (meeting.getGroupId() != null + && !activityBasicScopeService.isUserInGroup(meeting.getGroupId(), SecurityUtil.getUserId())) { + return Result.error("您不在本次会议参与组别内"); + } + return null; + } } diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/institution/service/impl/TeacherCongressInstitutionUserServiceImpl.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/institution/service/impl/TeacherCongressInstitutionUserServiceImpl.java index 5c466297..24048d7b 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/institution/service/impl/TeacherCongressInstitutionUserServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/institution/service/impl/TeacherCongressInstitutionUserServiceImpl.java @@ -10,6 +10,7 @@ import com.budwk.app.sys.services.SysUserService; import com.budwk.app.zhgh.democratic.teachercongress.institution.models.Teacher_congress_institution; import com.budwk.app.zhgh.democratic.teachercongress.institution.models.Teacher_congress_institution_user; import com.budwk.app.zhgh.democratic.teachercongress.institution.service.TeacherCongressInstitutionUserService; +import com.budwk.app.zhgh.democratic.teachercongress.prepare.service.TeacherCongressSessionService; import org.nutz.aop.interceptor.ioc.TransAop; import org.nutz.dao.Cnd; import org.nutz.dao.Dao; @@ -17,12 +18,16 @@ import org.nutz.ioc.aop.Aop; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; +import java.util.List; + @IocBean(args = {"refer:dao"}) public class TeacherCongressInstitutionUserServiceImpl extends BaseServiceImpl implements TeacherCongressInstitutionUserService { @Inject private SysRoleService sysRoleService; @Inject private SysUserService sysUserService; + @Inject + private TeacherCongressSessionService teacherCongressSessionService; public TeacherCongressInstitutionUserServiceImpl(Dao dao) { super(dao); @@ -49,21 +54,9 @@ public class TeacherCongressInstitutionUserServiceImpl extends BaseServiceImpl dao().fetch(Teacher_congress_institution.class, institutionUser.getInstitutionId())) + .anyMatch(this::isProposalReviewCommittee); + if (stillDirector) { + return; + } + Sys_role sysRole = sysRoleService.getByCode(RoleConstant.PROPOSAL_COMMITTEE_DIRECTOR); + if (sysRole == null) { + return; + } + dao().clear(Sys_user_role.class, Cnd.where(Sys_user_role::getUserId, "=", userId) + .and(Sys_user_role::getTcSessionId, "=", sessionId) + .and(Sys_user_role::getRoleId, "=", sysRole.getId())); + sysRoleService.clearCache(); + sysUserService.clearCache(); } } diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/prepare/service/TeacherCongressSessionService.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/prepare/service/TeacherCongressSessionService.java index 8e61c20a..be2ee0e4 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/prepare/service/TeacherCongressSessionService.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/prepare/service/TeacherCongressSessionService.java @@ -1,6 +1,7 @@ package com.budwk.app.zhgh.democratic.teachercongress.prepare.service; import com.budwk.app.base.service.BaseService; +import com.budwk.app.sys.models.Sys_user_role; import com.budwk.app.zhgh.democratic.teachercongress.prepare.controller.vo.TeacherCongressSessionProposalTypeVO; import com.budwk.app.zhgh.democratic.teachercongress.prepare.models.Teacher_congress_session; @@ -28,4 +29,28 @@ public interface TeacherCongressSessionService extends BaseService implements TeacherCongressSessionService { @@ -54,6 +58,8 @@ public class TeacherCongressSessionServiceImpl extends BaseServiceImpl lastInstitutions = dao().query(Teacher_congress_institution.class, Cnd.where(Teacher_congress_institution::getSessionId, "=", lastSession.getId())); @@ -125,6 +137,9 @@ public class TeacherCongressSessionServiceImpl extends BaseServiceImpl lastDelegations = dao().query(Teacher_congress_delegation.class, Cnd.where("sessionId", "=", lastSession.getId())); + // 保留上一届代表团ID与实体的对应关系,用于代表延用完成后判断代表团是否发生异动。 + Map lastDelegationsMap = lastDelegations.stream() + .collect(Collectors.toMap(Teacher_congress_delegation::getId, delegation -> delegation)); for (Teacher_congress_delegation lastDelegation : lastDelegations) { //代表团继承 Teacher_congress_delegation newDelegation = BeanUtil.copyProperties(lastDelegation, Teacher_congress_delegation.class); @@ -139,6 +154,7 @@ public class TeacherCongressSessionServiceImpl extends BaseServiceImpl newSessionDelegations = dao().query(Teacher_congress_delegation.class, + Cnd.where(Teacher_congress_delegation::getSessionId, "=", session.getId())); + Map newDelegationsMap = newSessionDelegations.stream() + .collect(Collectors.toMap(Teacher_congress_delegation::getId, delegation -> delegation)); + //代表数据 单位 分工会 要根据最新的设置来调整 //代表数据 List lastDelegates = dao().query(Teacher_congress_delegate.class, Cnd.where(Teacher_congress_delegate::getSessionId, "=", lastSession.getId())); + List changeRecords = new ArrayList<>(); List newDelegates = lastDelegates.stream().map(lastDelegate -> { Teacher_congress_delegate newDelegate = BeanUtil.copyProperties(lastDelegate, Teacher_congress_delegate.class); newDelegate.setId(R.UU32()); @@ -215,26 +240,24 @@ public class TeacherCongressSessionServiceImpl extends BaseServiceImpl oldDelegationsMap, + Map newDelegationsMap) { + Teacher_congress_delegation oldDelegation = oldDelegationsMap.get(oldDelegate.getDelegationId()); + Teacher_congress_delegation newDelegation = newDelegationsMap.get(newDelegate.getDelegationId()); + if (oldDelegation == null || newDelegation == null + || Objects.equals(oldDelegation.getCode(), newDelegation.getCode())) { + return null; + } + + RepresentativeChangeRecord record = new RepresentativeChangeRecord(); + record.setOldJdhSession(oldSessionId); + record.setNewJdhSession(newSessionId); + record.setUserId(oldDelegate.getUserId()); + record.setOldUnitId(oldDelegate.getUnitId()); + record.setOldUnitName(oldDelegate.getUnitName()); + record.setOldUnionId(oldDelegate.getUnionId()); + record.setOldUnionName(oldDelegate.getUnionName()); + record.setOldDbtId(oldDelegate.getDelegationId()); + record.setOldDbtName(oldDelegation.getName()); + record.setNewUnitId(newDelegate.getUnitId()); + record.setNewUnitName(newDelegate.getUnitName()); + record.setNewUnionId(newDelegate.getUnionId()); + record.setNewUnionName(newDelegate.getUnionName()); + record.setNewDbtId(newDelegate.getDelegationId()); + record.setNewDbtName(newDelegation.getName()); + return record; } /** @@ -290,6 +359,84 @@ public class TeacherCongressSessionServiceImpl extends BaseServiceImpl { + + List listCategories(boolean visibleOnly); + + List categoryTree(boolean visibleOnly); + + void saveCategory(SpreadCategory category); + + void updateCategory(SpreadCategory category); + + void deleteCategory(String id); + + void setVisible(String id, Integer visible); +} diff --git a/src/main/java/com/budwk/app/zhgh/spread/service/SpreadContentService.java b/src/main/java/com/budwk/app/zhgh/spread/service/SpreadContentService.java new file mode 100644 index 00000000..d99f5641 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/spread/service/SpreadContentService.java @@ -0,0 +1,61 @@ +package com.budwk.app.zhgh.spread.service; + +import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.param.PageForm; +import com.budwk.app.base.service.BaseService; +import com.budwk.app.zhgh.spread.models.SpreadContent; +import com.budwk.app.zhgh.spread.param.SpreadContentQuery; +import com.budwk.app.sys.models.Sys_union; +import org.nutz.lang.util.NutMap; + +import java.util.List; + +public interface SpreadContentService extends BaseService { + + Pagination pageContent(PageForm pageForm, SpreadContentQuery query); + + Pagination pagePublished(PageForm pageForm, String categoryId); + + /** + * 分页查询指定栏目中标题匹配的已发布内容。 + * + * @param pageForm 分页参数 + * @param categoryId 栏目 ID,查询时包含该栏目的直接子栏目 + * @param title 标题模糊查询条件 + * @return 已发布内容分页数据 + */ + Pagination pagePublished(PageForm pageForm, String categoryId, String title); + + /** + * 按 H5 筛选条件分页查询已发布内容。 + * + * @param pageForm 分页参数 + * @param categoryId 栏目 ID,查询时包含该栏目的直接子栏目 + * @param title 标题模糊查询条件 + * @param sortType 排序方式:comprehensive、latest、views + * @param publishDays 发布时间范围天数,空或 0 表示不限 + * @param contentFlag 内容属性:all、recommend、headline、top + * @return 已发布内容分页数据 + */ + Pagination pagePublished(PageForm pageForm, String categoryId, String title, + String sortType, Integer publishDays, String contentFlag); + + SpreadContent getContent(String id); + + void saveContent(SpreadContent content); + + void updateContent(SpreadContent content); + + void deleteContent(String id); + + void publishContent(String id, Integer status); + + void addViewCount(String id); + + List sliderContent(); + + /** + * 查询当前登录人员可选择的工会。 + */ + List selectableUnions(); +} diff --git a/src/main/java/com/budwk/app/zhgh/spread/service/SpreadStatisticsService.java b/src/main/java/com/budwk/app/zhgh/spread/service/SpreadStatisticsService.java new file mode 100644 index 00000000..08b9002f --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/spread/service/SpreadStatisticsService.java @@ -0,0 +1,15 @@ +package com.budwk.app.zhgh.spread.service; + +import com.budwk.app.zhgh.spread.param.SpreadStatisticsQuery; +import org.nutz.lang.util.NutMap; + +import java.util.List; + +public interface SpreadStatisticsService { + + NutMap summary(SpreadStatisticsQuery query); + + List top10(SpreadStatisticsQuery query); + + List categoryStatistics(SpreadStatisticsQuery query); +} diff --git a/src/main/java/com/budwk/app/zhgh/spread/service/impl/SpreadCategoryServiceImpl.java b/src/main/java/com/budwk/app/zhgh/spread/service/impl/SpreadCategoryServiceImpl.java new file mode 100644 index 00000000..b4670347 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/spread/service/impl/SpreadCategoryServiceImpl.java @@ -0,0 +1,183 @@ +package com.budwk.app.zhgh.spread.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.budwk.app.base.service.impl.BaseServiceImpl; +import com.budwk.app.zhgh.spread.models.SpreadCategory; +import com.budwk.app.zhgh.spread.models.SpreadContent; +import com.budwk.app.zhgh.spread.service.SpreadCategoryService; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.util.NutMap; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +@IocBean(args = {"refer:dao"}) +public class SpreadCategoryServiceImpl extends BaseServiceImpl implements SpreadCategoryService { + + public SpreadCategoryServiceImpl(Dao dao) { + super(dao); + } + + @Override + public List listCategories(boolean visibleOnly) { + Cnd cnd = Cnd.where("delFlag", "=", false); + if (visibleOnly) { + cnd.and("visible", "=", 1); + } + cnd.asc("sortOrder").asc("createdAt"); + return query(cnd); + } + + @Override + public List categoryTree(boolean visibleOnly) { + List categories = listCategories(visibleOnly); + Map nodeMap = new LinkedHashMap<>(); + Map> childrenMap = new LinkedHashMap<>(); + for (SpreadCategory category : categories) { + List children = new ArrayList<>(); + nodeMap.put(category.getId(), NutMap.NEW() + .addv("id", category.getId()) + .addv("parentId", category.getParentId()) + .addv("name", category.getName()) + .addv("code", category.getCode()) + .addv("sortOrder", category.getSortOrder()) + .addv("visible", category.getVisible()) + .addv("slider", category.getSlider()) + .addv("children", children)); + childrenMap.put(category.getId(), children); + } + List roots = new ArrayList<>(); + for (NutMap node : nodeMap.values()) { + String parentId = node.getString("parentId"); + if ("0".equals(parentId) || !nodeMap.containsKey(parentId)) { + roots.add(node); + } else { + // 直接向节点持有的原始集合追加,避免 NutMap 类型转换后子节点没有写回。 + childrenMap.get(parentId).add(node); + } + } + // 叶子栏目不返回空 children,避免级联选择器误判为仍有下一级。 + nodeMap.forEach((id, node) -> { + if (childrenMap.get(id).isEmpty()) { + node.remove("children"); + } + }); + return roots; + } + + @Override + public void saveCategory(SpreadCategory category) { + validateCategory(category, null); + applyDefaults(category); + insert(category); + syncParentSlider(category); + } + + @Override + public void updateCategory(SpreadCategory category) { + if (category == null || StrUtil.isBlank(category.getId())) { + throw new RuntimeException("请选择要编辑的栏目"); + } + SpreadCategory dbCategory = fetch(category.getId()); + if (dbCategory == null || Boolean.TRUE.equals(dbCategory.getDelFlag())) { + throw new RuntimeException("栏目不存在"); + } + validateCategory(category, category.getId()); + if (!dbCategory.getParentId().equals(category.getParentId()) + && count(Cnd.where("parentId", "=", category.getId()).and("delFlag", "=", false)) > 0) { + throw new RuntimeException("该栏目下存在子栏目,不能移动"); + } + applyDefaults(category); + updateIgnoreNull(category); + syncParentSlider(category); + if ("0".equals(category.getParentId()) && Integer.valueOf(0).equals(category.getSlider())) { + SpreadCategory child = new SpreadCategory(); + child.setSlider(0); + dao().update(SpreadCategory.class, org.nutz.dao.Chain.make("slider", 0), + Cnd.where("parentId", "=", category.getId()).and("delFlag", "=", false)); + } + } + + @Override + public void deleteCategory(String id) { + if (StrUtil.isBlank(id)) { + throw new RuntimeException("请选择要删除的栏目"); + } + List children = query(Cnd.where("parentId", "=", id).and("delFlag", "=", false)); + List ids = new ArrayList<>(); + ids.add(id); + children.forEach(item -> ids.add(item.getId())); + if (dao().count(SpreadContent.class, + Cnd.where("categoryId", "in", ids).and("delFlag", "=", false)) > 0) { + throw new RuntimeException("栏目下存在内容,请先删除相关内容"); + } + dao().clear(SpreadCategory.class, Cnd.where("id", "in", ids)); + } + + @Override + public void setVisible(String id, Integer visible) { + if (StrUtil.isBlank(id) || (visible == null || (visible != 0 && visible != 1))) { + throw new RuntimeException("栏目或显示状态不正确"); + } + dao().update(SpreadCategory.class, org.nutz.dao.Chain.make("visible", visible), + Cnd.where("id", "=", id).and("delFlag", "=", false)); + if (visible == 0) { + dao().update(SpreadCategory.class, org.nutz.dao.Chain.make("visible", 0), + Cnd.where("parentId", "=", id).and("delFlag", "=", false)); + } + } + + private void validateCategory(SpreadCategory category, String excludeId) { + if (category == null || StrUtil.isBlank(category.getName())) { + throw new RuntimeException("栏目名称不能为空"); + } + category.setName(category.getName().trim()); + // 参考模块不要求用户维护栏目编码,空值统一保存为 NULL。 + category.setCode(StrUtil.isBlank(category.getCode()) ? null : category.getCode().trim()); + category.setParentId(StrUtil.blankToDefault(category.getParentId(), "0")); + if (category.getId() != null && category.getId().equals(category.getParentId())) { + throw new RuntimeException("上级栏目不能选择自身"); + } + if (!"0".equals(category.getParentId())) { + SpreadCategory parent = fetch(category.getParentId()); + if (parent == null || Boolean.TRUE.equals(parent.getDelFlag())) { + throw new RuntimeException("上级栏目不存在"); + } + if (!"0".equals(parent.getParentId())) { + throw new RuntimeException("风采墙栏目最多支持两级"); + } + } + Cnd nameCnd = Cnd.where("name", "=", category.getName()) + .and("parentId", "=", category.getParentId()) + .and("delFlag", "=", false); + if (StrUtil.isNotBlank(excludeId)) { + nameCnd.and("id", "!=", excludeId); + } + if (count(nameCnd) > 0) { + throw new RuntimeException("同级栏目名称已存在"); + } + } + + private void applyDefaults(SpreadCategory category) { + if (category.getSortOrder() == null) { + category.setSortOrder(255); + } + if (category.getVisible() == null) { + category.setVisible(1); + } + if (category.getSlider() == null) { + category.setSlider(0); + } + } + + private void syncParentSlider(SpreadCategory category) { + if (!"0".equals(category.getParentId()) && Integer.valueOf(1).equals(category.getSlider())) { + dao().update(SpreadCategory.class, org.nutz.dao.Chain.make("slider", 1), + Cnd.where("id", "=", category.getParentId()).and("delFlag", "=", false)); + } + } +} diff --git a/src/main/java/com/budwk/app/zhgh/spread/service/impl/SpreadContentServiceImpl.java b/src/main/java/com/budwk/app/zhgh/spread/service/impl/SpreadContentServiceImpl.java new file mode 100644 index 00000000..c1f806e5 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/spread/service/impl/SpreadContentServiceImpl.java @@ -0,0 +1,377 @@ +package com.budwk.app.zhgh.spread.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.budwk.app.base.constant.RoleConstant; +import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.param.PageForm; +import com.budwk.app.base.service.impl.BaseServiceImpl; +import com.budwk.app.sys.models.Sys_union; +import com.budwk.app.web.commons.auth.utils.AuthUtil; +import com.budwk.app.web.commons.auth.utils.SecurityUtil; +import com.budwk.app.zhgh.spread.models.SpreadCategory; +import com.budwk.app.zhgh.spread.models.SpreadContent; +import com.budwk.app.zhgh.spread.param.SpreadContentQuery; +import com.budwk.app.zhgh.spread.service.SpreadContentService; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.dao.Sqls; +import org.nutz.dao.sql.Sql; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.util.NutMap; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +@IocBean(args = {"refer:dao"}) +public class SpreadContentServiceImpl extends BaseServiceImpl implements SpreadContentService { + + public SpreadContentServiceImpl(Dao dao) { + super(dao); + } + + @Override + public Pagination pageContent(PageForm pageForm, SpreadContentQuery query) { + Cnd cnd = buildCondition(query); + Sql countSql = Sqls.create(""" + SELECT COUNT(1) + FROM spread_content c + $condition + """); + countSql.setCondition(cnd); + countSql.setCallback(Sqls.callback.integer()); + dao().execute(countSql); + + Sql listSql = Sqls.create(""" + SELECT c.* + FROM spread_content c + $condition + ORDER BY c.isTop DESC, c.sortOrder ASC, c.createdAt DESC + """); + listSql.setCondition(cnd); + listSql.setPager(dao().createPager(pageForm.getPageNumber(), pageForm.getPageSize())); + listSql.setCallback(Sqls.callback.maps()); + dao().execute(listSql); + return new Pagination<>(pageForm.getPageNumber(), pageForm.getPageSize(), + countSql.getInt(), listSql.getList(NutMap.class)); + } + + @Override + public Pagination pagePublished(PageForm pageForm, String categoryId) { + return pagePublished(pageForm, categoryId, null, null, null, null); + } + + /** + * 分页查询指定栏目中标题匹配的已发布内容。 + * + * @param pageForm 分页参数 + * @param categoryId 栏目 ID,查询时包含该栏目的直接子栏目 + * @param title 标题模糊查询条件 + * @return 已发布内容分页数据 + */ + @Override + public Pagination pagePublished(PageForm pageForm, String categoryId, String title) { + return pagePublished(pageForm, categoryId, title, null, null, null); + } + + /** + * 按 H5 筛选条件分页查询已发布内容。 + * + * @param pageForm 分页参数 + * @param categoryId 栏目 ID,查询时包含该栏目的直接子栏目 + * @param title 标题模糊查询条件 + * @param sortType 排序方式 + * @param publishDays 发布时间范围天数 + * @param contentFlag 内容属性筛选 + * @return 已发布内容分页数据 + */ + @Override + public Pagination pagePublished(PageForm pageForm, String categoryId, String title, + String sortType, Integer publishDays, String contentFlag) { + SpreadContentQuery query = new SpreadContentQuery(); + query.setCategoryId(categoryId); + query.setTitle(title); + query.setIsPublished(1); + Cnd cnd = buildCondition(query); + if (publishDays != null && publishDays > 0) { + cnd.and("c.publishedAt", ">=", System.currentTimeMillis() - publishDays * 24L * 60L * 60L * 1000L); + } + if ("recommend".equals(contentFlag)) { + cnd.and("c.isRecommend", "=", 1); + } else if ("headline".equals(contentFlag)) { + cnd.and("c.isHeadline", "=", 1); + } else if ("top".equals(contentFlag)) { + cnd.and("c.isTop", "=", 1); + } + Sql countSql = Sqls.create("SELECT COUNT(1) FROM spread_content c $condition"); + countSql.setCondition(cnd); + countSql.setCallback(Sqls.callback.integer()); + dao().execute(countSql); + + String orderBy = resolvePublishedOrder(sortType); + Sql listSql = Sqls.create(""" + SELECT c.*, + CASE WHEN child.parentId = '0' OR parent.id IS NULL THEN child.name ELSE parent.name END AS parentCategoryName, + CASE WHEN child.parentId = '0' OR parent.id IS NULL THEN NULL ELSE child.name END AS childCategoryName + FROM spread_content c + LEFT JOIN spread_category child ON child.id = c.categoryId AND child.delFlag = 0 + LEFT JOIN spread_category parent ON parent.id = child.parentId AND parent.delFlag = 0 + $condition + ORDER BY + """ + orderBy); + listSql.setCondition(cnd); + listSql.setPager(dao().createPager(pageForm.getPageNumber(), pageForm.getPageSize())); + listSql.setCallback(Sqls.callback.maps()); + dao().execute(listSql); + return new Pagination<>(pageForm.getPageNumber(), pageForm.getPageSize(), + countSql.getInt(), listSql.getList(NutMap.class)); + } + + /** + * 将前端排序标识转换为固定 SQL 排序片段,避免客户端直接控制排序字段。 + */ + private String resolvePublishedOrder(String sortType) { + if ("latest".equals(sortType)) { + return "c.publishedAt DESC, c.createdAt DESC"; + } + if ("views".equals(sortType)) { + return "c.viewCount DESC, c.publishedAt DESC, c.createdAt DESC"; + } + return "c.isTop DESC, c.publishedAt DESC, c.sortOrder ASC, c.createdAt DESC"; + } + + @Override + public SpreadContent getContent(String id) { + if (StrUtil.isBlank(id)) { + throw new RuntimeException("请选择内容"); + } + SpreadContent content = fetch(Cnd.where("id", "=", id).and("delFlag", "=", false)); + if (content == null) { + throw new RuntimeException("内容不存在"); + } + return content; + } + + @Override + public void saveContent(SpreadContent content) { + validateContent(content); + applyDefaults(content); + if (Integer.valueOf(1).equals(content.getIsPublished())) { + content.setPublishedAt(System.currentTimeMillis()); + } + insert(content); + } + + @Override + public void updateContent(SpreadContent content) { + if (content == null || StrUtil.isBlank(content.getId())) { + throw new RuntimeException("请选择要编辑的内容"); + } + SpreadContent dbContent = getContent(content.getId()); + validateContent(content); + applyDefaults(content); + if (Integer.valueOf(1).equals(content.getIsPublished()) && !Integer.valueOf(1).equals(dbContent.getIsPublished())) { + content.setPublishedAt(System.currentTimeMillis()); + } + updateIgnoreNull(content); + } + + @Override + public void deleteContent(String id) { + getContent(id); + dao().clear(SpreadContent.class, Cnd.where("id", "=", id)); + } + + @Override + public void publishContent(String id, Integer status) { + getContent(id); + if (status == null || (status != 0 && status != 1)) { + throw new RuntimeException("发布状态不正确"); + } + org.nutz.dao.Chain chain = org.nutz.dao.Chain.make("isPublished", status); + if (status == 1) { + chain.add("publishedAt", System.currentTimeMillis()); + } + dao().update(SpreadContent.class, chain, Cnd.where("id", "=", id).and("delFlag", "=", false)); + } + + @Override + public void addViewCount(String id) { + getContent(id); + Sql sql = Sqls.create(""" + UPDATE spread_content + SET viewCount = IFNULL(viewCount, 0) + 1, + updatedAt = @updatedAt + WHERE id = @id AND delFlag = 0 + """); + sql.params().set("id", id); + sql.params().set("updatedAt", System.currentTimeMillis()); + dao().execute(sql); + } + + @Override + public List sliderContent() { + Sql sql = Sqls.create(""" + SELECT c.id, c.title, c.summary, c.thumbUrl, c.sliderImages, c.categoryId, c.categoryName, c.unionId, c.unionName + FROM spread_content c + INNER JOIN spread_category child ON child.id = c.categoryId + LEFT JOIN spread_category parent ON parent.id = child.parentId + WHERE c.delFlag = 0 + AND c.isPublished = 1 + AND child.delFlag = 0 + AND child.visible = 1 + AND child.slider = 1 + AND (child.parentId = '0' OR (parent.delFlag = 0 AND parent.visible = 1 AND parent.slider = 1)) + ORDER BY c.isTop DESC, c.publishedAt DESC, c.createdAt DESC + LIMIT 10 + """); + sql.setCallback(Sqls.callback.maps()); + dao().execute(sql); + return sql.getList(NutMap.class); + } + + @Override + public List selectableUnions() { + Cnd cnd = Cnd.NEW(); + if (!canSelectAllUnions()) { + String currentUnionId = SecurityUtil.getUnionId(); + if (StrUtil.isBlank(currentUnionId)) { + return Collections.emptyList(); + } + cnd.and("id", "=", currentUnionId); + } + cnd.asc("unionCode"); + return dao().query(Sys_union.class, cnd); + } + + /** + * 校工会管理员和系统管理员可选择全部工会,其他人员只能选择登录人员自己的分工会。 + */ + private boolean canSelectAllUnions() { + return AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name()); + } + + /** + * 校验工会是否存在且在当前登录人员的可选择范围内。 + */ + private Sys_union requireSelectableUnion(String unionId) { + if (StrUtil.isBlank(unionId)) { + throw new RuntimeException("请选择所属工会"); + } + Sys_union union = dao().fetch(Sys_union.class, unionId); + if (union == null) { + throw new RuntimeException("所属工会不存在"); + } + if (!canSelectAllUnions() && !unionId.equals(SecurityUtil.getUnionId())) { + throw new RuntimeException("无权选择该所属工会"); + } + return union; + } + + /** + * 校验并规范每张轮播图的标题,轮播图统一继承内容所属工会。 + */ + private void validateSliderImages(SpreadContent content) { + if (StrUtil.isBlank(content.getSliderImages())) { + return; + } + JSONArray sliderArray; + try { + sliderArray = JSONUtil.parseArray(content.getSliderImages()); + } catch (RuntimeException e) { + throw new RuntimeException("轮播图片数据格式不正确"); + } + JSONArray normalizedArray = new JSONArray(); + for (int i = 0; i < sliderArray.size(); i++) { + Object rawItem = sliderArray.get(i); + if (!(rawItem instanceof JSONObject)) { + throw new RuntimeException("请完善第" + (i + 1) + "张轮播图标题"); + } + JSONObject item = (JSONObject) rawItem; + if (StrUtil.isBlank(item.getStr("src"))) { + throw new RuntimeException("第" + (i + 1) + "张轮播图地址不能为空"); + } + if (StrUtil.isBlank(item.getStr("title"))) { + throw new RuntimeException("请输入第" + (i + 1) + "张轮播图标题"); + } + JSONObject normalizedItem = new JSONObject(); + normalizedItem.set("src", item.getStr("src")); + normalizedItem.set("title", item.getStr("title").trim()); + normalizedArray.add(normalizedItem); + } + content.setSliderImages(JSONUtil.toJsonStr(normalizedArray)); + } + private Cnd buildCondition(SpreadContentQuery query) { + Cnd cnd = Cnd.where("c.delFlag", "=", false); + if (query == null) { + return cnd; + } + if (StrUtil.isNotBlank(query.getCategoryId())) { + List categoryIds = new ArrayList<>(); + categoryIds.add(query.getCategoryId()); + List children = dao().query(SpreadCategory.class, + Cnd.where("parentId", "=", query.getCategoryId()).and("delFlag", "=", false)); + children.forEach(item -> categoryIds.add(item.getId())); + cnd.and("c.categoryId", "in", categoryIds); + } + cnd.and(Cnd.likeEX("c.title", query.getTitle())); + cnd.andEX("c.isPublished", "=", query.getIsPublished()); + if (StrUtil.isNotBlank(query.getBeginTime())) { + cnd.and("c.createdAt", ">=", DateUtil.parse(query.getBeginTime()).getTime()); + } + if (StrUtil.isNotBlank(query.getEndTime())) { + cnd.and("c.createdAt", "<=", DateUtil.parse(query.getEndTime()).getTime()); + } + return cnd; + } + + private void validateContent(SpreadContent content) { + if (content == null || StrUtil.isBlank(content.getCategoryId())) { + throw new RuntimeException("请选择栏目"); + } + SpreadCategory category = dao().fetch(SpreadCategory.class, + Cnd.where("id", "=", content.getCategoryId()).and("delFlag", "=", false)); + if (category == null) { + throw new RuntimeException("栏目不存在"); + } + if (dao().count(SpreadCategory.class, + Cnd.where("parentId", "=", category.getId()).and("delFlag", "=", false)) > 0) { + throw new RuntimeException("内容只能发布到末级栏目"); + } + + Sys_union union = requireSelectableUnion(content.getUnionId()); + if (StrUtil.isBlank(content.getTitle())) { + throw new RuntimeException("标题不能为空"); + } + content.setTitle(content.getTitle().trim()); + content.setCategoryName(category.getName()); + content.setUnionName(union.getName()); + validateSliderImages(content); + + } + + private void applyDefaults(SpreadContent content) { + if (content.getIsTop() == null) { + content.setIsTop(0); + } + if (content.getIsRecommend() == null) { + content.setIsRecommend(0); + } + if (content.getIsHeadline() == null) { + content.setIsHeadline(0); + } + if (content.getViewCount() == null) { + content.setViewCount(0); + } + if (content.getSortOrder() == null) { + content.setSortOrder(255); + } + if (content.getIsPublished() == null) { + content.setIsPublished(0); + } + } +} diff --git a/src/main/java/com/budwk/app/zhgh/spread/service/impl/SpreadStatisticsServiceImpl.java b/src/main/java/com/budwk/app/zhgh/spread/service/impl/SpreadStatisticsServiceImpl.java new file mode 100644 index 00000000..6ed7e0fb --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/spread/service/impl/SpreadStatisticsServiceImpl.java @@ -0,0 +1,115 @@ +package com.budwk.app.zhgh.spread.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.budwk.app.zhgh.spread.param.SpreadStatisticsQuery; +import com.budwk.app.zhgh.spread.service.SpreadStatisticsService; +import org.nutz.dao.Dao; +import org.nutz.dao.Sqls; +import org.nutz.dao.sql.Sql; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.util.NutMap; + +import java.util.List; + +@IocBean +public class SpreadStatisticsServiceImpl implements SpreadStatisticsService { + + @Inject + private Dao dao; + + @Override + public NutMap summary(SpreadStatisticsQuery query) { + String condition = buildContentCondition(query, "c"); + Sql sql = Sqls.create(""" + SELECT + (SELECT COUNT(1) FROM spread_category cg WHERE cg.delFlag = 0) AS categoryCount, + COUNT(1) AS contentCount, + IFNULL(SUM(CASE WHEN c.isPublished = 1 THEN 1 ELSE 0 END), 0) AS publishedCount, + IFNULL(SUM(c.viewCount), 0) AS viewCount, + IFNULL(ROUND(AVG(c.viewCount)), 0) AS avgViewCount + FROM spread_content c + WHERE c.delFlag = 0 + $condition + """); + sql.setVar("condition", condition); + setParams(sql, query); + sql.setCallback(Sqls.callback.map()); + dao.execute(sql); + NutMap result = sql.getObject(NutMap.class); + return result == null ? NutMap.NEW() : result; + } + + @Override + public List top10(SpreadStatisticsQuery query) { + Sql sql = Sqls.create(""" + SELECT c.id, c.title, c.summary, c.categoryName, c.unionId, c.unionName, c.viewCount, c.isPublished, c.publishedAt + FROM spread_content c + WHERE c.delFlag = 0 + AND c.isPublished = 1 + $condition + ORDER BY c.viewCount DESC, c.updatedAt DESC + LIMIT 10 + """); + sql.setVar("condition", buildContentCondition(query, "c")); + setParams(sql, query); + sql.setCallback(Sqls.callback.maps()); + dao.execute(sql); + return sql.getList(NutMap.class); + } + + @Override + public List categoryStatistics(SpreadStatisticsQuery query) { + Sql sql = Sqls.create(""" + SELECT c.categoryId, c.categoryName, COUNT(1) AS contentCount, + IFNULL(SUM(c.viewCount), 0) AS viewCount + FROM spread_content c + WHERE c.delFlag = 0 + AND c.isPublished = 1 + $condition + GROUP BY c.categoryId, c.categoryName + ORDER BY viewCount DESC, contentCount DESC + """); + sql.setVar("condition", buildContentCondition(query, "c")); + setParams(sql, query); + sql.setCallback(Sqls.callback.maps()); + dao.execute(sql); + return sql.getList(NutMap.class); + } + + private String buildContentCondition(SpreadStatisticsQuery query, String alias) { + if (query == null) { + return ""; + } + StringBuilder condition = new StringBuilder(); + if (StrUtil.isNotBlank(query.getCategoryId())) { + condition.append(" AND ").append(alias) + .append(".categoryId IN (SELECT id FROM spread_category WHERE id = @categoryId OR parentId = @categoryId)"); + } + if (query.getIsPublished() != null) { + condition.append(" AND ").append(alias).append(".isPublished = @isPublished"); + } + if (StrUtil.isNotBlank(query.getBeginTime())) { + condition.append(" AND ").append(alias).append(".createdAt >= @beginAt"); + } + if (StrUtil.isNotBlank(query.getEndTime())) { + condition.append(" AND ").append(alias).append(".createdAt <= @endAt"); + } + return condition.toString(); + } + + private void setParams(Sql sql, SpreadStatisticsQuery query) { + if (query == null) { + return; + } + sql.params().set("categoryId", query.getCategoryId()); + sql.params().set("isPublished", query.getIsPublished()); + if (StrUtil.isNotBlank(query.getBeginTime())) { + sql.params().set("beginAt", DateUtil.parse(query.getBeginTime()).getTime()); + } + if (StrUtil.isNotBlank(query.getEndTime())) { + sql.params().set("endAt", DateUtil.parse(query.getEndTime()).getTime()); + } + } +} diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/birthday/controller/UserBirthdayManageController.java b/src/main/java/com/budwk/app/zhgh/staffmanage/birthday/controller/UserBirthdayManageController.java new file mode 100644 index 00000000..f745412a --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/birthday/controller/UserBirthdayManageController.java @@ -0,0 +1,142 @@ +package com.budwk.app.zhgh.staffmanage.birthday.controller; + +import cn.dev33.satoken.annotation.SaCheckLogin; +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.util.StrUtil; +import com.budwk.app.base.result.Result; +import com.budwk.app.web.commons.auth.utils.SecurityUtil; +import com.budwk.app.zhgh.staffmanage.birthday.models.UserBirthdayConfig; +import com.budwk.app.zhgh.staffmanage.birthday.param.UserBirthdayPageForm; +import com.budwk.app.zhgh.staffmanage.birthday.param.UserBirthdaySendMsgForm; +import com.budwk.app.zhgh.staffmanage.birthday.service.UserBirthdayService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.nutz.aop.interceptor.ioc.TransAop; +import org.nutz.ioc.aop.Aop; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@IocBean +@At("/platform/staffManage/birthday/manage") +@Ok("json:full") +@Api(tags = "生日祝福管理") +public class UserBirthdayManageController { + + @Inject + private UserBirthdayService userBirthdayService; + + @At("") + @Ok("beetl:/platform/zhgh/staffmanage/birthday/manage/index.html") + @SaCheckPermission("staff.birthday.manage") + public void index() { + } + + @At("/h5") + @Ok("beetl:/platform/zhghh5/staffmanage/birthday/index.html") + @SaCheckLogin + public void h5(String id, HttpServletRequest request) { + request.setAttribute("fileId", StrUtil.blankToDefault(id, "")); + request.setAttribute("userName", SecurityUtil.getUserUsername()); + } + + /** + * 查询生日人员。 + * + * @param pageForm 分页、姓名/工号、工会、单位、人员状态及生日日期条件 + * @return Result.data 为 Pagination,list 是人员数据,totalCount 是总数 + */ + @At + @ApiOperation("分页查询生日人员") + @SaCheckPermission("staff.birthday.manage") + public Result pageData(UserBirthdayPageForm pageForm) { + return Result.success(userBirthdayService.pageData(pageForm)); + } + + /** + * 导出生日人员 Excel。 + * + * @param pageForm 与列表查询一致的筛选条件 + * @param response 返回 XSSF 格式的 xlsx 文件流 + */ + @At + @Ok("void") + @ApiOperation("导出生日人员") + @SaCheckPermission("staff.birthday.manage") + public void doExport(UserBirthdayPageForm pageForm, HttpServletResponse response) { + userBirthdayService.exportXlsx(pageForm, response); + } + + /** + * 按查询条件批量发送通知。 + * form.title 为标题,form.content 为正文,其余字段为人员筛选条件;返回 data 为接收人数。 + */ + @At + @Aop(TransAop.READ_COMMITTED) + @ApiOperation("按查询条件发送生日通知") + @SaCheckPermission("staff.birthday.manage") + public Result sendMsgByQueryUsers(UserBirthdaySendMsgForm form) { + Result validation = validateMessage(form); + if (validation != null) { + return validation; + } + int count = userBirthdayService.sendByQuery(form, SecurityUtil.getUserId(), SecurityUtil.getUserUsername()); + if (count == 0) { + return Result.error("当前条件下没有可发送的人员"); + } + return Result.success("已提交发送,共" + count + "人", count); + } + + /** + * 向单个用户发送通知。 + * form.userId 为接收人用户ID,title、content 为消息内容;返回 data 为发送人数 1。 + */ + @At + @Aop(TransAop.READ_COMMITTED) + @ApiOperation("向单个用户发送生日通知") + @SaCheckPermission("staff.birthday.manage") + public Result sendMsgByUser(UserBirthdaySendMsgForm form) { + Result validation = validateMessage(form); + if (validation != null) { + return validation; + } + if (StrUtil.isBlank(form.getUserId())) { + return Result.error("未获取到消息接收人"); + } + boolean sent = userBirthdayService.sendByUser(form, SecurityUtil.getUserId(), SecurityUtil.getUserUsername()); + return sent ? Result.success("已提交发送", 1) : Result.error("未获取到消息接收人"); + } + + @At + @ApiOperation("获取生日页面配置") + @SaCheckLogin + public Result getConfig() { + return Result.success(userBirthdayService.getConfig()); + } + + /** + * 保存生日页面图片配置。 + * config.picUrl 为背景图片文件ID,config.birthdayUrl 为福利贺卡文件ID;返回保存后的配置对象。 + */ + @At + @Aop(TransAop.READ_COMMITTED) + @ApiOperation("保存生日页面配置") + @SaCheckPermission("staff.birthday.manage") + public Result saveOrModifyConfig(UserBirthdayConfig config) { + return Result.success("保存成功", userBirthdayService.saveConfig(config)); + } + + private Result validateMessage(UserBirthdaySendMsgForm form) { + if (form == null || StrUtil.isBlank(form.getTitle())) { + return Result.error("请输入发送标题"); + } + if (StrUtil.isBlank(form.getContent())) { + return Result.error("请输入发送内容"); + } + return null; + } +} diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/birthday/controller/UserBirthdayMsgLogController.java b/src/main/java/com/budwk/app/zhgh/staffmanage/birthday/controller/UserBirthdayMsgLogController.java new file mode 100644 index 00000000..70dff811 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/birthday/controller/UserBirthdayMsgLogController.java @@ -0,0 +1,41 @@ +package com.budwk.app.zhgh.staffmanage.birthday.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import com.budwk.app.base.result.Result; +import com.budwk.app.zhgh.staffmanage.birthday.param.UserBirthdayMsgLogPageForm; +import com.budwk.app.zhgh.staffmanage.birthday.service.UserBirthdayMsgLogService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; + +@IocBean +@At("/platform/staffManage/birthday/msgLog") +@Ok("json:full") +@Api(tags = "生日消息记录") +public class UserBirthdayMsgLogController { + + @Inject + private UserBirthdayMsgLogService userBirthdayMsgLogService; + + @At("") + @Ok("beetl:/platform/zhgh/staffmanage/birthday/msglog/index.html") + @SaCheckPermission("staff.birthday.msgLog") + public void index() { + } + + /** + * 查询生日消息记录。 + * + * @param pageForm 分页、姓名/工号、工会和单位查询条件 + * @return Result.data 为 Pagination,list 是发送记录,totalCount 是总数 + */ + @At + @ApiOperation("分页查询生日消息记录") + @SaCheckPermission("staff.birthday.msgLog") + public Result pageData(UserBirthdayMsgLogPageForm pageForm) { + return Result.success(userBirthdayMsgLogService.pageData(pageForm)); + } +} diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/birthday/models/UserBirthdayConfig.java b/src/main/java/com/budwk/app/zhgh/staffmanage/birthday/models/UserBirthdayConfig.java new file mode 100644 index 00000000..6bbdb6ea --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/birthday/models/UserBirthdayConfig.java @@ -0,0 +1,41 @@ +package com.budwk.app.zhgh.staffmanage.birthday.models; + +import com.budwk.app.base.model.BaseModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.nutz.dao.entity.annotation.ColDefine; +import org.nutz.dao.entity.annotation.ColType; +import org.nutz.dao.entity.annotation.Column; +import org.nutz.dao.entity.annotation.Comment; +import org.nutz.dao.entity.annotation.Name; +import org.nutz.dao.entity.annotation.Table; +import org.nutz.dao.entity.annotation.TableMeta; +import org.nutz.dao.interceptor.annotation.PrevInsert; + +/** + * 生日祝福页面配置。 + * picUrl、birthdayUrl 保存 sys_file 文件 ID,由移动端按文件 ID 获取图片。 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Table("user_birthday_config") +@TableMeta("{'mysql-charset':'utf8mb4'}") +@Comment("生日祝福页面配置") +public class UserBirthdayConfig extends BaseModel { + + @Name + @Comment("ID") + @PrevInsert(uu32 = true) + @ColDefine(type = ColType.VARCHAR, width = 32) + private String id; + + @Column + @Comment("移动端背景图片文件ID") + @ColDefine(type = ColType.VARCHAR, width = 100) + private String picUrl; + + @Column + @Comment("生日福利贺卡图片文件ID") + @ColDefine(type = ColType.VARCHAR, width = 100) + private String birthdayUrl; +} diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/birthday/models/UserBirthdayMsgLog.java b/src/main/java/com/budwk/app/zhgh/staffmanage/birthday/models/UserBirthdayMsgLog.java new file mode 100644 index 00000000..0d141af8 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/birthday/models/UserBirthdayMsgLog.java @@ -0,0 +1,76 @@ +package com.budwk.app.zhgh.staffmanage.birthday.models; + +import com.budwk.app.base.model.BaseModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.nutz.dao.entity.annotation.ColDefine; +import org.nutz.dao.entity.annotation.ColType; +import org.nutz.dao.entity.annotation.Column; +import org.nutz.dao.entity.annotation.Comment; +import org.nutz.dao.entity.annotation.Name; +import org.nutz.dao.entity.annotation.Table; +import org.nutz.dao.entity.annotation.TableMeta; +import org.nutz.dao.interceptor.annotation.PrevInsert; + +/** + * 生日祝福消息发送记录。 + * 每个接收人保存一条记录,便于按人员、单位和工会追溯发送情况。 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Table("user_birthday_msg_log") +@TableMeta("{'mysql-charset':'utf8mb4'}") +@Comment("生日祝福消息发送记录") +public class UserBirthdayMsgLog extends BaseModel { + + @Name + @Comment("ID") + @PrevInsert(uu32 = true) + @ColDefine(type = ColType.VARCHAR, width = 32) + private String id; + + @Column + @Comment("推送时间") + @ColDefine(type = ColType.VARCHAR, width = 50) + private String pushTime; + + @Column + @Comment("消息标题") + @ColDefine(type = ColType.VARCHAR, width = 255) + private String msgTitle; + + @Column + @Comment("消息内容") + @ColDefine(type = ColType.TEXT) + private String msgContent; + + @Column + @Comment("接收人用户ID") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String receiveBy; + + @Column + @Comment("接收人姓名") + @ColDefine(type = ColType.VARCHAR, width = 100) + private String receiveName; + + @Column + @Comment("推送人用户ID") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String pushBy; + + @Column + @Comment("推送人姓名") + @ColDefine(type = ColType.VARCHAR, width = 100) + private String pushByName; + + @Column + @Comment("推送类型") + @ColDefine(type = ColType.VARCHAR, width = 50) + private String pushType; + + @Column + @Comment("生日祝福页面链接") + @ColDefine(type = ColType.VARCHAR, width = 500) + private String link; +} diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/birthday/param/UserBirthdayMsgLogPageForm.java b/src/main/java/com/budwk/app/zhgh/staffmanage/birthday/param/UserBirthdayMsgLogPageForm.java new file mode 100644 index 00000000..b82b7994 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/birthday/param/UserBirthdayMsgLogPageForm.java @@ -0,0 +1,15 @@ +package com.budwk.app.zhgh.staffmanage.birthday.param; + +import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberInfoPageForm; +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 生日消息记录分页查询参数,复用人员模块的工会、单位及数据范围条件。 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@ApiModel("生日消息记录分页查询参数") +public class UserBirthdayMsgLogPageForm extends MemberInfoPageForm { +} diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/birthday/param/UserBirthdayPageForm.java b/src/main/java/com/budwk/app/zhgh/staffmanage/birthday/param/UserBirthdayPageForm.java new file mode 100644 index 00000000..0fc7779e --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/birthday/param/UserBirthdayPageForm.java @@ -0,0 +1,65 @@ +package com.budwk.app.zhgh.staffmanage.birthday.param; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberInfoPageForm; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.nutz.dao.Cnd; +import org.nutz.dao.util.cri.Static; + +/** + * 生日人员分页查询参数。 + * startDate、endDate 接收 yyyy-MM-dd;生日比较只使用月日,允许查询跨年区间。 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@ApiModel("生日人员分页查询参数") +public class UserBirthdayPageForm extends MemberInfoPageForm { + + @ApiModelProperty("生日开始日期,格式 yyyy-MM-dd") + private String startDate; + + @ApiModelProperty("生日结束日期,格式 yyyy-MM-dd") + private String endDate; + + /** + * 将生日日期条件追加到已有人员查询条件。 + * 未传日期时默认查询今天起十五天内的生日,跨年时自动使用 OR 条件。 + * + * @param cnd 已包含人员范围和会员状态的查询条件 + */ + public void buildBirthdaySearch(Cnd cnd) { + String start = normalizeMonthDay(startDate); + String end = normalizeMonthDay(endDate); + if (StrUtil.isAllBlank(start, end)) { + start = DateUtil.format(DateUtil.date(), "MM-dd"); + end = DateUtil.format(DateUtil.offsetDay(DateUtil.date(), 15), "MM-dd"); + } + + if (StrUtil.isAllNotBlank(start, end)) { + if (start.compareTo(end) > 0) { + cnd.and(new Static(String.format( + "(DATE_FORMAT(u.birthday, '%%m-%%d') >= '%s' OR DATE_FORMAT(u.birthday, '%%m-%%d') <= '%s')", + start, end))); + } else { + cnd.and(new Static(String.format( + "DATE_FORMAT(u.birthday, '%%m-%%d') >= '%s' AND DATE_FORMAT(u.birthday, '%%m-%%d') <= '%s'", + start, end))); + } + } else if (StrUtil.isNotBlank(start)) { + cnd.and(new Static(String.format("DATE_FORMAT(u.birthday, '%%m-%%d') >= '%s'", start))); + } else { + cnd.and(new Static(String.format("DATE_FORMAT(u.birthday, '%%m-%%d') <= '%s'", end))); + } + } + + private String normalizeMonthDay(String value) { + if (StrUtil.isBlank(value)) { + return null; + } + return DateUtil.format(DateUtil.parse(value), "MM-dd"); + } +} diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/birthday/param/UserBirthdaySendMsgForm.java b/src/main/java/com/budwk/app/zhgh/staffmanage/birthday/param/UserBirthdaySendMsgForm.java new file mode 100644 index 00000000..d898dfb7 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/birthday/param/UserBirthdaySendMsgForm.java @@ -0,0 +1,25 @@ +package com.budwk.app.zhgh.staffmanage.birthday.param; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 生日祝福发送参数。 + * 查询条件用于批量确定接收人;userId 用于单人发送;title、content 为消息标题和正文。 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@ApiModel("生日祝福发送参数") +public class UserBirthdaySendMsgForm extends UserBirthdayPageForm { + + @ApiModelProperty("消息标题") + private String title; + + @ApiModelProperty("消息正文") + private String content; + + @ApiModelProperty("单人发送时的用户ID") + private String userId; +} diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/birthday/service/UserBirthdayMsgLogService.java b/src/main/java/com/budwk/app/zhgh/staffmanage/birthday/service/UserBirthdayMsgLogService.java new file mode 100644 index 00000000..8d58a2fa --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/birthday/service/UserBirthdayMsgLogService.java @@ -0,0 +1,36 @@ +package com.budwk.app.zhgh.staffmanage.birthday.service; + +import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.service.BaseService; +import com.budwk.app.zhgh.staffmanage.birthday.models.UserBirthdayMsgLog; +import com.budwk.app.zhgh.staffmanage.birthday.param.UserBirthdayMsgLogPageForm; + +import java.util.List; + +/** + * 生日祝福消息记录服务。 + */ +public interface UserBirthdayMsgLogService extends BaseService { + + /** + * 查询生日消息记录。 + * + * @param pageForm 人员、工会、单位及分页条件 + * @return 当前页发送记录及总数 + */ + Pagination pageData(UserBirthdayMsgLogPageForm pageForm); + + /** + * 为每个接收人写入一条发送记录。 + * + * @param loginNames 接收人工号集合 + * @param title 消息标题 + * @param content 消息正文 + * @param link 移动端生日祝福完整链接 + * @param pushBy 推送人用户ID + * @param pushByName 推送人姓名 + * @param pushType 手动推送或系统推送 + */ + void insertLogs(List loginNames, String title, String content, String link, + String pushBy, String pushByName, String pushType); +} diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/birthday/service/UserBirthdayService.java b/src/main/java/com/budwk/app/zhgh/staffmanage/birthday/service/UserBirthdayService.java new file mode 100644 index 00000000..fe4306b7 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/birthday/service/UserBirthdayService.java @@ -0,0 +1,74 @@ +package com.budwk.app.zhgh.staffmanage.birthday.service; + +import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.service.BaseService; +import com.budwk.app.sys.models.Sys_user; +import com.budwk.app.zhgh.staffmanage.birthday.models.UserBirthdayConfig; +import com.budwk.app.zhgh.staffmanage.birthday.param.UserBirthdayPageForm; +import com.budwk.app.zhgh.staffmanage.birthday.param.UserBirthdaySendMsgForm; + +import javax.servlet.http.HttpServletResponse; + +/** + * 生日祝福业务服务。 + */ +public interface UserBirthdayService extends BaseService { + + /** + * 分页查询生日会员。 + * + * @param pageForm 人员、组织和生日日期查询条件 + * @return 当前页人员列表及总数 + */ + Pagination pageData(UserBirthdayPageForm pageForm); + + /** + * 导出符合查询条件的生日会员。 + * + * @param pageForm 查询条件 + * @param response Excel 文件响应 + */ + void exportXlsx(UserBirthdayPageForm pageForm, HttpServletResponse response); + + /** + * 按当前查询条件批量发送生日通知。 + * + * @param form 查询条件、标题和正文 + * @param pushBy 推送人用户ID + * @param pushByName 推送人姓名 + * @return 实际进入发送队列的接收人数 + */ + int sendByQuery(UserBirthdaySendMsgForm form, String pushBy, String pushByName); + + /** + * 向指定用户发送生日通知。 + * + * @param form userId、标题和正文 + * @param pushBy 推送人用户ID + * @param pushByName 推送人姓名 + * @return 是否找到接收人并进入发送队列 + */ + boolean sendByUser(UserBirthdaySendMsgForm form, String pushBy, String pushByName); + + /** + * 向当天生日的会员发送系统生日通知,供 Quartz 任务调用。 + * + * @param title 消息标题 + * @param content 消息正文 + * @return 实际进入发送队列的接收人数 + */ + int sendTodayBirthdayMessages(String title, String content); + + /** + * 获取最新生日页面配置;未配置时返回空配置对象。 + */ + UserBirthdayConfig getConfig(); + + /** + * 新增或更新生日页面配置。 + * + * @param config 背景图片和福利贺卡文件ID + * @return 保存后的配置 + */ + UserBirthdayConfig saveConfig(UserBirthdayConfig config); +} diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/birthday/service/impl/UserBirthdayMsgLogServiceImpl.java b/src/main/java/com/budwk/app/zhgh/staffmanage/birthday/service/impl/UserBirthdayMsgLogServiceImpl.java new file mode 100644 index 00000000..082c3d3c --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/birthday/service/impl/UserBirthdayMsgLogServiceImpl.java @@ -0,0 +1,85 @@ +package com.budwk.app.zhgh.staffmanage.birthday.service.impl; + +import cn.hutool.core.date.DateUtil; +import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.service.impl.BaseServiceImpl; +import com.budwk.app.zhgh.staffmanage.birthday.models.UserBirthdayMsgLog; +import com.budwk.app.zhgh.staffmanage.birthday.param.UserBirthdayMsgLogPageForm; +import com.budwk.app.zhgh.staffmanage.birthday.service.UserBirthdayMsgLogService; +import org.nutz.aop.interceptor.ioc.TransAop; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.dao.Sqls; +import org.nutz.dao.sql.Sql; +import org.nutz.ioc.aop.Aop; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Lang; +import org.nutz.lang.random.R; +import org.nutz.lang.util.NutMap; + +import java.util.List; + +@IocBean(args = {"refer:dao"}) +public class UserBirthdayMsgLogServiceImpl extends BaseServiceImpl + implements UserBirthdayMsgLogService { + + public UserBirthdayMsgLogServiceImpl(Dao dao) { + super(dao); + } + + @Override + public Pagination pageData(UserBirthdayMsgLogPageForm pageForm) { + Sql sql = Sqls.create(""" + SELECT + log.*, + u.loginname AS loginname, + u.username AS username, + u.unitName AS unitName, + u.unionName AS unionName + FROM user_birthday_msg_log log + LEFT JOIN vw_user u ON u.id = log.receiveBy + $condition + """); + Cnd cnd = Cnd.NEW(); + pageForm.buildSearch(cnd, "u."); + cnd.desc("log.pushTime"); + sql.setCondition(cnd); + return listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + } + + @Override + @Aop(TransAop.READ_COMMITTED) + public void insertLogs(List loginNames, String title, String content, String link, + String pushBy, String pushByName, String pushType) { + if (Lang.isEmpty(loginNames)) { + return; + } + + // 只根据当前批次的工号读取接收人,日志中的用户ID和姓名保持发送当时快照。 + Sql sql = Sqls.create(""" + SELECT id, loginname, username + FROM vw_user + $condition + """); + sql.setCondition(Cnd.where("loginname", "in", loginNames)); + List users = listMap(sql); + String pushTime = DateUtil.now(); + List logs = users.stream().map(user -> { + UserBirthdayMsgLog log = new UserBirthdayMsgLog(); + log.setId(R.UU32()); + log.setReceiveBy(user.getString("id")); + log.setReceiveName(user.getString("username")); + log.setMsgTitle(title); + log.setMsgContent(content); + log.setPushBy(pushBy); + log.setPushByName(pushByName); + log.setPushType(pushType); + log.setPushTime(pushTime); + log.setLink(link); + return log; + }).toList(); + if (!logs.isEmpty()) { + dao().fastInsert(logs); + } + } +} diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/birthday/service/impl/UserBirthdayServiceImpl.java b/src/main/java/com/budwk/app/zhgh/staffmanage/birthday/service/impl/UserBirthdayServiceImpl.java new file mode 100644 index 00000000..ac63ed03 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/birthday/service/impl/UserBirthdayServiceImpl.java @@ -0,0 +1,211 @@ +package com.budwk.app.zhgh.staffmanage.birthday.service.impl; + +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.ExportParams; +import cn.afterturn.easypoi.excel.entity.enmus.ExcelType; +import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; +import cn.hutool.core.util.StrUtil; +import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.service.impl.BaseServiceImpl; +import com.budwk.app.base.utils.CommonDownloadUtil; +import com.budwk.app.sys.models.Sys_msg; +import com.budwk.app.sys.models.Sys_user; +import com.budwk.app.sys.services.SysMsgService; +import com.budwk.app.web.commons.base.Globals; +import com.budwk.app.zhgh.staffmanage.birthday.models.UserBirthdayConfig; +import com.budwk.app.zhgh.staffmanage.birthday.param.UserBirthdayPageForm; +import com.budwk.app.zhgh.staffmanage.birthday.param.UserBirthdaySendMsgForm; +import com.budwk.app.zhgh.staffmanage.birthday.service.UserBirthdayMsgLogService; +import com.budwk.app.zhgh.staffmanage.birthday.service.UserBirthdayService; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.ss.usermodel.Workbook; +import org.nutz.aop.interceptor.ioc.TransAop; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.dao.Sqls; +import org.nutz.dao.sql.Sql; +import org.nutz.ioc.aop.Aop; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Times; +import org.nutz.lang.util.NutMap; + +import javax.servlet.http.HttpServletResponse; +import java.util.ArrayList; +import java.util.List; + +@Slf4j +@IocBean(args = {"refer:dao"}) +public class UserBirthdayServiceImpl extends BaseServiceImpl implements UserBirthdayService { + + @Inject + private SysMsgService sysMsgService; + + @Inject + private UserBirthdayMsgLogService userBirthdayMsgLogService; + + public UserBirthdayServiceImpl(Dao dao) { + super(dao); + } + + @Override + public Pagination pageData(UserBirthdayPageForm pageForm) { + return listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), buildBirthdaySql(pageForm)); + } + + @Override + public void exportXlsx(UserBirthdayPageForm pageForm, HttpServletResponse response) { + try { + List list = listMap(buildBirthdaySql(pageForm)); + List columns = new ArrayList<>(); + columns.add(new ExcelExportEntity("工号", "loginname", 20)); + columns.add(new ExcelExportEntity("姓名", "username", 20)); + columns.add(new ExcelExportEntity("性别", "sex", 10)); + columns.add(new ExcelExportEntity("联系方式", "mobile", 20)); + columns.add(new ExcelExportEntity("出生日期", "birthday", 20)); + columns.add(new ExcelExportEntity("生日倒计时(天)", "daysUntilBirthday", 20)); + columns.add(new ExcelExportEntity("在职状态", "userState", 20)); + columns.add(new ExcelExportEntity("人员类型", "personType", 20)); + columns.add(new ExcelExportEntity("人员性质", "preparedBy", 20)); + columns.add(new ExcelExportEntity("所属工会", "unionName", 25)); + columns.add(new ExcelExportEntity("所属单位", "unitName", 25)); + + ExportParams exportParams = new ExportParams(); + exportParams.setType(ExcelType.XSSF); + try (Workbook workbook = ExcelExportUtil.exportExcel(exportParams, columns, list)) { + CommonDownloadUtil.download("生日人员名单.xlsx", workbook, response); + } + } catch (Exception e) { + log.error("导出生日人员名单失败", e); + throw new RuntimeException("导出生日人员名单失败", e); + } + } + + @Override + @Aop(TransAop.READ_COMMITTED) + public int sendByQuery(UserBirthdaySendMsgForm form, String pushBy, String pushByName) { + List loginNames = listMap(buildBirthdaySql(form)).stream() + .map(user -> user.getString("loginname")) + .filter(StrUtil::isNotBlank) + .distinct() + .toList(); + return sendMessages(loginNames, form.getTitle(), form.getContent(), pushBy, pushByName, "手动推送"); + } + + @Override + @Aop(TransAop.READ_COMMITTED) + public boolean sendByUser(UserBirthdaySendMsgForm form, String pushBy, String pushByName) { + Sys_user user = dao().fetch(Sys_user.class, form.getUserId()); + if (user == null || StrUtil.isBlank(user.getLoginname())) { + return false; + } + sendMessages(List.of(user.getLoginname()), form.getTitle(), form.getContent(), + pushBy, pushByName, "手动推送"); + return true; + } + + @Override + @Aop(TransAop.READ_COMMITTED) + public int sendTodayBirthdayMessages(String title, String content) { + Sql sql = Sqls.create(""" + SELECT loginname + FROM vw_user + WHERE member = 1 + AND birthday IS NOT NULL + AND MONTH(birthday) = MONTH(CURRENT_DATE) + AND DAY(birthday) = DAY(CURRENT_DATE) + """); + sql.setCallback(Sqls.callback.strList()); + dao().execute(sql); + List loginNames = sql.getList(String.class); + return sendMessages(loginNames, title, content, "system", "系统推送", "系统推送"); + } + + @Override + public UserBirthdayConfig getConfig() { + UserBirthdayConfig config = dao().fetch(UserBirthdayConfig.class, Cnd.NEW().desc("updatedAt")); + return config == null ? new UserBirthdayConfig() : config; + } + + @Override + @Aop(TransAop.READ_COMMITTED) + public UserBirthdayConfig saveConfig(UserBirthdayConfig config) { + dao().insertOrUpdate(config); + return config; + } + + /** + * 构建生日人员公共查询。 + * 查询参数包含姓名/工号、组织、人员状态和生日区间;返回字段供列表、导出和批量发送共用。 + */ + private Sql buildBirthdaySql(UserBirthdayPageForm pageForm) { + Sql sql = Sqls.create(""" + SELECT + u.id AS id, + u.loginname AS loginname, + u.username AS username, + u.sex AS sex, + u.birthday AS birthday, + u.mobile AS mobile, + u.unitName AS unitName, + u.unionName AS unionName, + u.userState AS userState, + u.personType AS personType, + u.preparedBy AS preparedBy, + DATEDIFF( + CASE + WHEN DATE_FORMAT(u.birthday, '%m-%d') >= DATE_FORMAT(NOW(), '%m-%d') + THEN CONCAT(YEAR(NOW()), '-', DATE_FORMAT(u.birthday, '%m-%d')) + ELSE CONCAT(YEAR(NOW()) + 1, '-', DATE_FORMAT(u.birthday, '%m-%d')) + END, + CURDATE() + ) AS daysUntilBirthday + FROM vw_user u + $condition + """); + Cnd cnd = Cnd.NEW(); + cnd.and("u.birthday", "is not", null); + cnd.and("u.member", "=", 1); + pageForm.buildSearch(cnd, "u."); + pageForm.buildBirthdaySearch(cnd); + cnd.asc("daysUntilBirthday"); + sql.setCondition(cnd); + return sql; + } + + /** + * 将生日消息写入当前项目消息中心并生成发送记录。 + * Sys_msg.url 用于站内消息点击,正文中的完整链接供外部短信/微信渠道访问。 + */ + private int sendMessages(List loginNames, String title, String content, + String pushBy, String pushByName, String pushType) { + List recipients = loginNames == null ? List.of() : loginNames.stream() + .filter(StrUtil::isNotBlank) + .distinct() + .toList(); + if (recipients.isEmpty()) { + return 0; + } + + UserBirthdayConfig config = getConfig(); + String pagePath = "/platform/staffManage/birthday/manage/h5"; + if (StrUtil.isNotBlank(config.getBirthdayUrl())) { + pagePath = pagePath + "?id=" + config.getBirthdayUrl(); + } + String fullLink = Globals.AppDomain + pagePath; + + Sys_msg message = new Sys_msg(); + message.setTitle(title); + message.setNote(content + "\n" + fullLink); + message.setUrl(pagePath); + message.setType("user"); + message.setSendType("show"); + message.setSendAt(Times.getTS()); + message.setCreatedBy(pushBy); + sysMsgService.saveMsg(message, recipients.toArray(String[]::new), true); + + userBirthdayMsgLogService.insertLogs(recipients, title, content, fullLink, + pushBy, pushByName, pushType); + return recipients.size(); + } +} diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/change/MemberChangeApplyController.java b/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/change/MemberChangeApplyController.java index e813fca0..9135d09e 100644 --- a/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/change/MemberChangeApplyController.java +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/change/MemberChangeApplyController.java @@ -156,7 +156,12 @@ public class MemberChangeApplyController { * @return */ @At - @SaCheckPermission(value = {"member.change.branchUnion.audit","member.change.schoolUnion.audit", "member.change.unionGroup.audit"}, mode = SaMode.OR) + @SaCheckPermission(value = { + "member.change.branchUnion.audit", + "member.change.schoolUnion.audit", + "member.change.unionGroup.audit", + "staff.sourcechange.pending" + }, mode = SaMode.OR) public Result getUserByIdForMemberChange(String userId){ View_user user = dao.fetch(View_user.class, Cnd.where("id", "=", userId)); NutMap nutMap = Lang.obj2nutmap(user); diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/change/MemberChangeManageController.java b/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/change/MemberChangeManageController.java index 809b5354..29fa21a3 100644 --- a/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/change/MemberChangeManageController.java +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/change/MemberChangeManageController.java @@ -101,7 +101,10 @@ public class MemberChangeManageController { @RepeatSubmit @Aop(TransAop.READ_COMMITTED) @SLog(tag = "会员高级管理-会员变更", msg = "分工会/校工会会员管理员提交变更") - @SaCheckPermission(value = {"member.change.mange", "staff.member.change.mange"}, mode = SaMode.OR) + @SaCheckPermission(value = { + "member.change.mange", + "staff.member.change.mange" + }, mode = SaMode.OR) public Result doSubmitChange(MemberChangeRecord record){ // 检验是否有变更 if (Lang.isEmpty(record)) { @@ -168,17 +171,22 @@ public class MemberChangeManageController { @At @ApiOperation("获取该人员所有的变更信息") - @SaCheckPermission(value = {"member.change.mange", "staff.member.change.mange"}, mode = SaMode.OR) + @SaCheckPermission(value = { + "member.change.mange", + "staff.member.change.mange", + "staff.sourcechange.manage" + }, mode = SaMode.OR) public Result getAllChangeMemberInfo(String userId){ List mapList = memberCommonService.getAllChangeInfo(userId); - if (Lang.isEmpty(mapList)) { - return Result.error("未获取到异动数据"); + View_user user = dao.fetch(View_user.class, Cnd.where("id", "=", userId)); + if (user == null) { + return Result.error("未获取到人员基础信息"); } - View_user user = dao.fetch(View_user.class, Cnd.where("id", "=", userId)); + // 基础信息与历史异动相互独立;即使没有字段异动明细,也必须允许页面展示人员基础信息。 NutMap map = Lang.obj2nutmap(user); map.put("user",user); - map.put("allChangeInfo", mapList); + map.put("allChangeInfo", Lang.isEmpty(mapList) ? null : mapList); return Result.success(map); } diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/info/MemberBatchMakeController.java b/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/info/MemberBatchMakeController.java index ad49212a..98b3043e 100644 --- a/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/info/MemberBatchMakeController.java +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/info/MemberBatchMakeController.java @@ -5,6 +5,7 @@ import cn.afterturn.easypoi.excel.entity.ExportParams; import cn.afterturn.easypoi.excel.entity.enmus.ExcelType; import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.DesensitizedUtil; import cn.hutool.core.util.StrUtil; @@ -16,10 +17,13 @@ import com.budwk.app.base.result.Result; import com.budwk.app.base.utils.CommonDownloadUtil; import com.budwk.app.sys.models.Sys_role; import com.budwk.app.sys.models.Sys_user; +import com.budwk.app.sys.models.Sys_user_history; import com.budwk.app.sys.models.Sys_user_role; import com.budwk.app.sys.services.SysRoleService; import com.budwk.app.web.commons.auth.utils.AuthUtil; import com.budwk.app.web.commons.auth.utils.SecurityUtil; +import com.budwk.app.zhgh.staffmanage.member.constant.MemberChangeOrigin; +import com.budwk.app.zhgh.staffmanage.member.constant.MemberChangeType; import com.budwk.app.zhgh.staffmanage.member.param.MemberBatchMakeParam; import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberInfoPageForm; import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberStatisticsPageForm; @@ -42,11 +46,9 @@ import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.Ok; import javax.servlet.http.HttpServletResponse; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Optional; +import java.util.*; import java.util.stream.Collectors; +import java.util.stream.Stream; /** * @version 1.0 @@ -132,6 +134,25 @@ public class MemberBatchMakeController { }).toList(); dao.insert(roleList); + // 添加人员变更记录 + String MemberChangeTypeName = MemberChangeType.RESTORE.name(); + final Date date = new Date(); + List sysUsers = dao.query(Sys_user.class, Cnd.where("id", "in", userIds)); + List sysUserHistoryStream = sysUsers.stream().map(e -> { + Sys_user_history sysUserHistory = new Sys_user_history(); + BeanUtil.copyProperties(e, sysUserHistory); + sysUserHistory.setChangeTypes(List.of(MemberChangeTypeName)); + sysUserHistory.setChangeTime(date); + NutMap change = NutMap.NEW(); + change.put("fieldName", "会员状态"); + change.put("field", "member"); + change.put("sourceValue", "否"); + change.put("newValue", "是"); + sysUserHistory.setChangeInfos(List.of(change)); + sysUserHistory.setChangeOrigin(MemberChangeOrigin.HAND_MOVEMENT.name()); + return sysUserHistory; + }).collect(Collectors.toList()); + dao.insert(sysUserHistoryStream); return Result.success(); } diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/statistics/MemberPersonTypeStatisticsController.java b/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/statistics/MemberPersonTypeStatisticsController.java new file mode 100644 index 00000000..34fabf19 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/statistics/MemberPersonTypeStatisticsController.java @@ -0,0 +1,73 @@ +package com.budwk.app.zhgh.staffmanage.member.controller.statistics; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import com.budwk.app.base.result.Result; +import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberPersonTypeStatisticsPageForm; +import com.budwk.app.zhgh.staffmanage.member.service.MemberStatisticsService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.apache.poi.ss.usermodel.Workbook; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; + +import javax.servlet.http.HttpServletResponse; + +/** + * 人员类型统计控制器。 + * 统计业务统一由 MemberStatisticsService 处理,控制器仅负责参数接收和结果输出。 + */ +@IocBean +@At("/platform/member/statistics/personType") +@Ok("json:full") +@Api(tags = "人员类型统计") +public class MemberPersonTypeStatisticsController { + + @Inject + private MemberStatisticsService memberStatisticsService; + + /** 进入人员类型统计页面。 */ + @At("") + @Ok("beetl:/platform/zhgh/staffmanage/member/statistics/personType/index.html") + @SaCheckPermission("member.statistics.personType") + public void index() { + } + + /** + * 查询按分工会或单位汇总的人员类型数据。 + * + * @param pageForm 分页、统计维度及机构查询条件 + * @return 人员类型统计结果 + */ + @At + @ApiOperation("查询人员类型统计") + @SaCheckPermission("member.statistics.personType") + public Result pageData(@Param("..") MemberPersonTypeStatisticsPageForm pageForm) { + return Result.success(memberStatisticsService.getPersonTypeStatistics(pageForm)); + } + + /** + * 导出人员类型统计结果。 + * + * @param pageForm 统计维度及机构查询条件 + * @param response HTTP 响应 + */ + @At + @Ok("void") + @ApiOperation("导出人员类型统计") + @SaCheckPermission("member.statistics.personType") + public void doExport(@Param("..") MemberPersonTypeStatisticsPageForm pageForm, HttpServletResponse response) { + try { + response.setContentType("application/octet-stream"); + response.setHeader("Content-Disposition", "attachment;filename=" + + new String("人员类型统计.xlsx".getBytes("UTF-8"), "ISO8859-1")); + Workbook workbook = memberStatisticsService.exportPersonTypeStatistics(pageForm); + workbook.write(response.getOutputStream()); + workbook.close(); + } catch (Exception e) { + throw new RuntimeException("人员类型统计导出失败", e); + } + } +} diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/member/param/pageform/MemberPersonTypeStatisticsPageForm.java b/src/main/java/com/budwk/app/zhgh/staffmanage/member/param/pageform/MemberPersonTypeStatisticsPageForm.java new file mode 100644 index 00000000..826abeb3 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/member/param/pageform/MemberPersonTypeStatisticsPageForm.java @@ -0,0 +1,22 @@ +package com.budwk.app.zhgh.staffmanage.member.param.pageform; + +import com.budwk.app.base.param.PageForm; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 人员类型统计分页查询参数。 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class MemberPersonTypeStatisticsPageForm extends PageForm { + + /** 统计维度:union 按分工会统计,unit 按单位统计。 */ + private String queryType; + + /** 所属分工会ID。 */ + private String unionId; + + /** 所属单位ID。 */ + private String unitId; +} diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/member/service/MemberStatisticsService.java b/src/main/java/com/budwk/app/zhgh/staffmanage/member/service/MemberStatisticsService.java index 9acb34db..f7b3ab77 100644 --- a/src/main/java/com/budwk/app/zhgh/staffmanage/member/service/MemberStatisticsService.java +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/member/service/MemberStatisticsService.java @@ -3,6 +3,7 @@ package com.budwk.app.zhgh.staffmanage.member.service; import com.budwk.app.base.service.BaseService; import com.budwk.app.sys.models.Sys_user; import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberStatisticsPageForm; +import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberPersonTypeStatisticsPageForm; import org.apache.poi.ss.usermodel.Workbook; import org.nutz.dao.Cnd; import org.nutz.dao.sql.Sql; @@ -96,4 +97,20 @@ public interface MemberStatisticsService extends BaseService { * @return */ Workbook exportStatisticsExcel(List list, String queryType); + + /** + * 按分工会或单位统计各人员类型的会员数量。 + * + * @param pageForm 分页、统计维度及机构查询条件 + * @return 统计数据、人员类型动态列及实际统计维度 + */ + NutMap getPersonTypeStatistics(MemberPersonTypeStatisticsPageForm pageForm); + + /** + * 导出人员类型统计结果。 + * + * @param pageForm 统计维度及机构查询条件 + * @return XSSF 格式工作簿 + */ + Workbook exportPersonTypeStatistics(MemberPersonTypeStatisticsPageForm pageForm); } diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/member/service/impl/MemberStatisticsServiceImpl.java b/src/main/java/com/budwk/app/zhgh/staffmanage/member/service/impl/MemberStatisticsServiceImpl.java index 3eff9365..0b9007e3 100644 --- a/src/main/java/com/budwk/app/zhgh/staffmanage/member/service/impl/MemberStatisticsServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/member/service/impl/MemberStatisticsServiceImpl.java @@ -8,11 +8,15 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.StrUtil; import com.budwk.app.base.constant.RoleConstant; +import com.budwk.app.base.page.Pagination; import com.budwk.app.base.service.impl.BaseServiceImpl; +import com.budwk.app.sys.models.Sys_dict; import com.budwk.app.web.commons.auth.utils.AuthUtil; import com.budwk.app.sys.models.Sys_user; +import com.budwk.app.sys.services.SysDictService; import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberStatisticsPageForm; +import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberPersonTypeStatisticsPageForm; import com.budwk.app.zhgh.staffmanage.member.service.MemberStatisticsService; import org.apache.poi.ss.usermodel.Workbook; import org.nutz.dao.Cnd; @@ -22,6 +26,7 @@ import org.nutz.dao.sql.Sql; import org.nutz.dao.util.cri.SqlExpressionGroup; import org.nutz.dao.util.cri.Static; import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.ioc.loader.annotation.Inject; import org.nutz.lang.Lang; import org.nutz.lang.Strings; import org.nutz.lang.util.NutMap; @@ -41,6 +46,11 @@ import java.util.stream.Collectors; @IocBean(args = {"refer:dao"}) public class MemberStatisticsServiceImpl extends BaseServiceImpl implements MemberStatisticsService { + private static final String PERSON_TYPE_DICT_CODE = "USER_PERSON_TYPE"; + + @Inject + private SysDictService sysDictService; + public MemberStatisticsServiceImpl(Dao dao) { super(dao); } @@ -574,4 +584,221 @@ public class MemberStatisticsServiceImpl extends BaseServiceImpl imple exportParams.setHeight((short) 10); return ExcelExportUtil.exportExcel(exportParams, exportEntities, list); } + + /** + * 使用 V4 人员视图 vw_user 动态统计 USER_PERSON_TYPE 字典中的各类会员人数。 + * 非校级管理员固定按当前所属工会下的单位统计,防止通过请求参数越权查询全校数据。 + * + * @param pageForm 分页、统计维度及机构查询条件 + * @return 统计列表、动态列配置及实际查询维度 + */ + @Override + public NutMap getPersonTypeStatistics(MemberPersonTypeStatisticsPageForm pageForm) { + boolean schoolAdmin = isPersonTypeStatisticsSchoolAdmin(); + String actualQueryType = schoolAdmin && "union".equals(pageForm.getQueryType()) ? "union" : "unit"; + List personTypes = sysDictService.getSubListByCode(PERSON_TYPE_DICT_CODE); + String personTypeColumns = buildPersonTypeColumns(personTypes.size()); + + // 分页查询只返回当前页机构数据,避免机构数量增加后一次加载全部列表。 + Sql pageSql = createPersonTypeStatisticsSql(actualQueryType, personTypeColumns, schoolAdmin, pageForm); + setPersonTypeParams(pageSql, personTypes); + Sql countSql = createPersonTypeStatisticsCountSql(actualQueryType, schoolAdmin, pageForm); + Pagination pagination = listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), pageSql, countSql); + List pageList = pagination.getList(NutMap.class); + pageList.forEach(row -> row.setv("totalNum", calculatePersonTypeTotal(row, personTypes.size()))); + + // 合计重新查询当前权限和筛选范围内的全部机构,不受当前页码及每页条数影响。 + Sql allSql = createPersonTypeStatisticsSql(actualQueryType, personTypeColumns, schoolAdmin, pageForm); + setPersonTypeParams(allSql, personTypes); + List allList = listMap(allSql); + allList.forEach(row -> row.setv("totalNum", calculatePersonTypeTotal(row, personTypes.size()))); + + return NutMap.NEW() + .setv("pageData", pagination) + .setv("summary", buildPersonTypeSummary(allList, personTypes.size())) + .setv("personTypeOptions", buildPersonTypeOptions(personTypes)) + .setv("queryType", actualQueryType) + .setv("schoolAdmin", schoolAdmin); + } + + /** + * 根据人员类型统计结果生成动态列 Excel,表头与 USER_PERSON_TYPE 当前启用字典保持一致。 + * + * @param pageForm 统计维度及机构查询条件 + * @return XSSF 格式工作簿 + */ + @Override + public Workbook exportPersonTypeStatistics(MemberPersonTypeStatisticsPageForm pageForm) { + boolean schoolAdmin = isPersonTypeStatisticsSchoolAdmin(); + String actualQueryType = schoolAdmin && "union".equals(pageForm.getQueryType()) ? "union" : "unit"; + List personTypes = sysDictService.getSubListByCode(PERSON_TYPE_DICT_CODE); + Sql sql = createPersonTypeStatisticsSql( + actualQueryType, buildPersonTypeColumns(personTypes.size()), schoolAdmin, pageForm); + setPersonTypeParams(sql, personTypes); + List statisticsList = listMap(sql); + statisticsList.forEach(row -> row.setv("totalNum", calculatePersonTypeTotal(row, personTypes.size()))); + List personTypeOptions = buildPersonTypeOptions(personTypes); + + List exportEntities = new ArrayList<>(); + if ("union".equals(actualQueryType)) { + exportEntities.add(new ExcelExportEntity("分工会代码", "unionCode", 20)); + exportEntities.add(new ExcelExportEntity("分工会名称", "unionName", 25)); + } else { + exportEntities.add(new ExcelExportEntity("单位代码", "unitCode", 20)); + exportEntities.add(new ExcelExportEntity("单位名称", "unitName", 25)); + if (schoolAdmin) { + exportEntities.add(new ExcelExportEntity("所属分工会", "unionName", 25)); + } + } + exportEntities.add(new ExcelExportEntity("小计", "totalNum", 15)); + personTypeOptions.forEach(option -> exportEntities.add( + new ExcelExportEntity(option.getString("name"), option.getString("prop"), 20))); + + NutMap sumRow = buildPersonTypeSummary(statisticsList, personTypes.size()); + sumRow.setv("union".equals(actualQueryType) ? "unionName" : "unitName", "合计"); + statisticsList.add(sumRow); + + ExportParams exportParams = new ExportParams(); + exportParams.setType(ExcelType.XSSF); + exportParams.setHeight((short) 10); + return ExcelExportUtil.exportExcel(exportParams, exportEntities, statisticsList); + } + + /** + * 构建人员类型统计 SQL。动态部分只包含后端生成的固定别名,字典值全部通过参数绑定传入。 + */ + private Sql createPersonTypeStatisticsSql(String queryType, String personTypeColumns, boolean schoolAdmin, + MemberPersonTypeStatisticsPageForm pageForm) { + Sql sql; + Cnd cnd = Cnd.NEW(); + if ("union".equals(queryType)) { + // 动态列必须先写入完整源 SQL,再由 Sqls.create 解析其中的 @personTypeN 参数。 + String sqlSource = """ + SELECT + un.id AS unionId, + un.unionCode, + un.name AS unionName + %s + FROM sys_union un + LEFT JOIN vw_user u ON u.unionId = un.id AND u.member = 1 + $condition + """.formatted(personTypeColumns); + sql = Sqls.create(sqlSource); + cnd.andEX("un.id", "=", pageForm.getUnionId()); + cnd.groupBy("un.id", "un.unionCode", "un.name"); + cnd.asc("un.unionCode"); + } else { + // 单位统计同样在创建 Sql 对象前完成动态列拼装,避免参数被当作 MySQL 会话变量。 + String sqlSource = """ + SELECT + unit.id AS unitId, + unit.unitcode AS unitCode, + unit.name AS unitName, + un.id AS unionId, + un.unionCode, + un.name AS unionName + %s + FROM sys_unit unit + LEFT JOIN sys_union un ON un.id = unit.unionId + LEFT JOIN vw_user u ON u.unitId = unit.id AND u.member = 1 + $condition + """.formatted(personTypeColumns); + sql = Sqls.create(sqlSource); + cnd.and("unit.unitLevel", "=", 2); + if (!schoolAdmin) { + cnd.and("unit.unionId", "=", SecurityUtil.getUnionId()); + } else { + cnd.andEX("unit.unionId", "=", pageForm.getUnionId()); + } + cnd.andEX("unit.id", "=", pageForm.getUnitId()); + cnd.groupBy("unit.id", "unit.unitcode", "unit.name", "un.id", "un.unionCode", "un.name"); + cnd.asc("unit.unitcode"); + } + sql.setCondition(cnd); + return sql; + } + + /** + * 构建机构分页总数 SQL。分组统计 SQL 不直接用于计数,避免 GROUP BY 导致分页总数取值不准确。 + */ + private Sql createPersonTypeStatisticsCountSql(String queryType, boolean schoolAdmin, + MemberPersonTypeStatisticsPageForm pageForm) { + Sql countSql; + Cnd cnd = Cnd.NEW(); + if ("union".equals(queryType)) { + countSql = Sqls.create("SELECT COUNT(1) FROM sys_union un $condition"); + cnd.andEX("un.id", "=", pageForm.getUnionId()); + } else { + countSql = Sqls.create("SELECT COUNT(1) FROM sys_unit unit $condition"); + cnd.and("unit.unitLevel", "=", 2); + if (!schoolAdmin) { + cnd.and("unit.unionId", "=", SecurityUtil.getUnionId()); + } else { + cnd.andEX("unit.unionId", "=", pageForm.getUnionId()); + } + cnd.andEX("unit.id", "=", pageForm.getUnitId()); + } + countSql.setCondition(cnd); + return countSql; + } + + /** 构建人员类型动态统计列,参数名称在 Sqls.create 前写入完整 SQL。 */ + private String buildPersonTypeColumns(int personTypeCount) { + StringBuilder columns = new StringBuilder(); + for (int i = 0; i < personTypeCount; i++) { + columns.append(", SUM(CASE WHEN u.personType = @personType") + .append(i) + .append(" THEN 1 ELSE 0 END) AS personType") + .append(i); + } + return columns.toString(); + } + + /** 将 USER_PERSON_TYPE 字典编码填充到已经完成参数解析的 SQL 对象。 */ + private void setPersonTypeParams(Sql sql, List personTypes) { + for (int i = 0; i < personTypes.size(); i++) { + sql.setParam("personType" + i, personTypes.get(i).getCode()); + } + } + + /** 将人员类型字典转换为前端动态列定义。 */ + private List buildPersonTypeOptions(List personTypes) { + List options = new ArrayList<>(); + for (int i = 0; i < personTypes.size(); i++) { + Sys_dict personType = personTypes.get(i); + options.add(NutMap.NEW() + .setv("code", personType.getCode()) + .setv("name", personType.getName()) + .setv("prop", "personType" + i)); + } + return options; + } + + /** 计算当前权限及筛选范围内全部机构的人员类型合计。 */ + private NutMap buildPersonTypeSummary(List statisticsList, int personTypeCount) { + NutMap summary = NutMap.NEW(); + summary.setv("totalNum", statisticsList.stream().mapToInt(row -> row.getInt("totalNum", 0)).sum()); + for (int i = 0; i < personTypeCount; i++) { + String prop = "personType" + i; + summary.setv(prop, statisticsList.stream().mapToInt(row -> row.getInt(prop, 0)).sum()); + } + return summary; + } + + /** 计算一行中所有人员类型数量的小计。 */ + private int calculatePersonTypeTotal(NutMap row, int personTypeCount) { + int total = 0; + for (int i = 0; i < personTypeCount; i++) { + total += row.getInt("personType" + i, 0); + } + return total; + } + + /** 判断当前用户是否具备查看全校人员类型统计的校级角色。 */ + private boolean isPersonTypeStatisticsSchoolAdmin() { + return AuthUtil.hasRoleOr( + RoleConstant.SYSADMIN.name(), + RoleConstant.SCHOOL_UNION_ADMIN.name(), + RoleConstant.SCHOOL_UNION_MEMBER_ADMIN.name()); + } } diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/sourcechange/controller/PendingConfirmUserController.java b/src/main/java/com/budwk/app/zhgh/staffmanage/sourcechange/controller/PendingConfirmUserController.java new file mode 100644 index 00000000..7629df7f --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/sourcechange/controller/PendingConfirmUserController.java @@ -0,0 +1,85 @@ +package com.budwk.app.zhgh.staffmanage.sourcechange.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import com.budwk.app.base.result.Result; +import com.budwk.app.base.annotation.RepeatSubmit; +import com.budwk.app.base.annotation.SLog; +import com.budwk.app.zhgh.staffmanage.member.models.MemberChangeRecord; +import com.budwk.app.zhgh.staffmanage.sourcechange.param.PendingConfirmUserBatchChangeParam; +import com.budwk.app.zhgh.staffmanage.sourcechange.param.PendingConfirmUserPageForm; +import com.budwk.app.zhgh.staffmanage.sourcechange.service.PendingConfirmUserService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; + +/** + * 待确认人员记录页面及查询接口。 + */ +@Api(tags = "待确认人员记录") +@IocBean +@At("/platform/sourcechange/pending") +public class PendingConfirmUserController { + + @Inject + private PendingConfirmUserService pendingConfirmUserService; + + /** + * 打开待确认人员记录页面。 + */ + @At("") + @Ok("beetl:/platform/zhgh/staffmanage/sourcechange/pending/index.html") + @SaCheckPermission("staff.sourcechange.pending") + public void index() { + } + + /** + * 分页查询待确认或已确认人员。 + * + * @param pageForm 查询条件 + * @return 人员分页数据 + */ + @At + @Ok("json") + @ApiOperation("分页查询待确认人员记录") + @SaCheckPermission("staff.sourcechange.pending") + public Result pageData(PendingConfirmUserPageForm pageForm) { + return Result.success(pendingConfirmUserService.pageData(pageForm)); + } + + /** + * 直接提交待确认人员变更,不创建会员变更申请及审批流程。 + * + * @param record 待确认人员变更内容 + * @return 提交结果 + */ + @At + @Ok("json") + @RepeatSubmit + @SLog(tag = "待确认人员记录", msg = "直接提交人员变更") + @ApiOperation("直接提交待确认人员变更") + @SaCheckPermission("staff.sourcechange.pending") + public Result submitChange(MemberChangeRecord record) { + boolean changed = pendingConfirmUserService.submitChange(record); + return Result.success(changed ? "变更成功" : "确认成功"); + } + + /** + * 批量修改勾选人员的人员类型并完成确认。 + * + * @param changeParam 用户ID集合及目标人员类型 + * @return 批量处理结果 + */ + @At + @Ok("json") + @RepeatSubmit + @SLog(tag = "待确认人员记录", msg = "批量变更人员类型") + @ApiOperation("批量变更待确认人员类型") + @SaCheckPermission("staff.sourcechange.pending") + public Result batchChange(PendingConfirmUserBatchChangeParam changeParam) { + int changedCount = pendingConfirmUserService.batchChangePersonType(changeParam); + return Result.success("已成功变更" + changedCount + "人"); + } +} diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/sourcechange/param/PendingConfirmUserBatchChangeParam.java b/src/main/java/com/budwk/app/zhgh/staffmanage/sourcechange/param/PendingConfirmUserBatchChangeParam.java new file mode 100644 index 00000000..9c4fef01 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/sourcechange/param/PendingConfirmUserBatchChangeParam.java @@ -0,0 +1,20 @@ +package com.budwk.app.zhgh.staffmanage.sourcechange.param; + +import lombok.Data; + +/** + * 待确认人员批量变更参数。 + */ +@Data +public class PendingConfirmUserBatchChangeParam { + + /** + * 前端勾选的用户ID JSON数组。 + */ + private String userIds; + + /** + * 批量设置的人员类型。 + */ + private String personType; +} diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/sourcechange/param/PendingConfirmUserPageForm.java b/src/main/java/com/budwk/app/zhgh/staffmanage/sourcechange/param/PendingConfirmUserPageForm.java new file mode 100644 index 00000000..7c210f6a --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/sourcechange/param/PendingConfirmUserPageForm.java @@ -0,0 +1,28 @@ +package com.budwk.app.zhgh.staffmanage.sourcechange.param; + +import com.budwk.app.base.param.PageForm; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 待确认人员记录分页查询参数。 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class PendingConfirmUserPageForm extends PageForm { + + /** 所属工会ID。 */ + private String unionId; + + /** 所属单位ID。 */ + private String unitId; + + /** 人员类型。 */ + private String personType; + + /** 在职状态。 */ + private String userState; + + /** 确认状态:1待确认、2已确认,默认查询待确认。 */ + private Integer pendingConfirmStatus = 1; +} diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/sourcechange/service/PendingConfirmUserService.java b/src/main/java/com/budwk/app/zhgh/staffmanage/sourcechange/service/PendingConfirmUserService.java new file mode 100644 index 00000000..85c37013 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/sourcechange/service/PendingConfirmUserService.java @@ -0,0 +1,45 @@ +package com.budwk.app.zhgh.staffmanage.sourcechange.service; + +import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.service.BaseService; +import com.budwk.app.sys.models.Sys_user; +import com.budwk.app.zhgh.staffmanage.member.models.MemberChangeRecord; +import com.budwk.app.zhgh.staffmanage.sourcechange.param.PendingConfirmUserBatchChangeParam; +import com.budwk.app.zhgh.staffmanage.sourcechange.param.PendingConfirmUserPageForm; + +/** + * 待确认人员记录业务服务。 + */ +public interface PendingConfirmUserService extends BaseService { + + /** + * 分页查询待确认或已确认人员。 + * + * @param pageForm 查询条件 + * @return 人员分页数据 + */ + Pagination pageData(PendingConfirmUserPageForm pageForm); + + /** + * 直接提交待确认人员变更,不生成会员变更申请及流程数据。 + * + * @param record 待确认人员变更内容 + * @return true 表示人员字段发生变化,false 表示仅完成确认 + */ + boolean submitChange(MemberChangeRecord record); + + /** + * 批量修改待确认人员的人员类型,并将处理成功的人员标记为已确认。 + * + * @param changeParam 批量勾选的用户ID及目标人员类型 + * @return 实际完成确认的人员数量 + */ + int batchChangePersonType(PendingConfirmUserBatchChangeParam changeParam); + + /** + * 人员变更提交成功后,将待确认状态更新为已确认。 + * + * @param userId 系统用户ID + */ + void markConfirmed(String userId); +} diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/sourcechange/service/impl/PendingConfirmUserServiceImpl.java b/src/main/java/com/budwk/app/zhgh/staffmanage/sourcechange/service/impl/PendingConfirmUserServiceImpl.java new file mode 100644 index 00000000..8dfecbfb --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/sourcechange/service/impl/PendingConfirmUserServiceImpl.java @@ -0,0 +1,272 @@ +package com.budwk.app.zhgh.staffmanage.sourcechange.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.json.JSONUtil; +import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.exception.BaseException; +import com.budwk.app.base.service.impl.BaseServiceImpl; +import com.budwk.app.base.utils.PageUtil; +import com.budwk.app.sys.models.Sys_dict; +import com.budwk.app.sys.models.Sys_user; +import com.budwk.app.sys.services.SysDictService; +import com.budwk.app.sys.views.View_user; +import com.budwk.app.zhgh.staffmanage.member.constant.MemberChangeOrigin; +import com.budwk.app.zhgh.staffmanage.member.models.MemberChangeRecord; +import com.budwk.app.zhgh.staffmanage.member.service.MemberCommonService; +import com.budwk.app.zhgh.staffmanage.sourcechange.param.PendingConfirmUserBatchChangeParam; +import com.budwk.app.zhgh.staffmanage.sourcechange.param.PendingConfirmUserPageForm; +import com.budwk.app.zhgh.staffmanage.sourcechange.service.PendingConfirmUserService; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.dao.Sqls; +import org.nutz.dao.sql.Sql; +import org.nutz.dao.util.cri.SqlExpressionGroup; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.aop.interceptor.ioc.TransAop; +import org.nutz.ioc.aop.Aop; + +import java.util.ArrayList; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * 待确认人员记录业务实现。 + */ +@IocBean(args = {"refer:dao"}) +public class PendingConfirmUserServiceImpl extends BaseServiceImpl implements PendingConfirmUserService { + + private static final int STATUS_PENDING = 1; + private static final int STATUS_CONFIRMED = 2; + /** 待确认人员只允许转为以下两个字典名称对应的编码。 */ + private static final Set ALLOWED_PERSON_TYPE_NAMES = Set.of("离退休人员", "其他"); + + @Inject + private MemberCommonService memberCommonService; + + @Inject + private SysDictService sysDictService; + + public PendingConfirmUserServiceImpl(Dao dao) { + super(dao); + } + + /** + * 从系统用户表查询确认状态为待确认或已确认的人员。 + * + * @param pageForm 查询条件 + * @return 人员分页数据 + */ + @Override + public Pagination pageData(PendingConfirmUserPageForm pageForm) { + Sql sql = Sqls.create(""" + SELECT + userInfo.id, + userInfo.loginname, + userInfo.username, + userInfo.sex, + userInfo.userState, + userInfo.personType, + userInfo.unitId, + unitInfo.name AS unitName, + unionInfo.id unionId, + unionInfo.name AS unionName, + userInfo.pendingConfirmStatus + FROM sys_user userInfo + LEFT JOIN sys_unit unitInfo ON unitInfo.id = userInfo.unitId + LEFT JOIN sys_union unionInfo ON unionInfo.id = unitInfo.unionId + $condition + """); + Cnd cnd = Cnd.NEW(); + int status = Integer.valueOf(STATUS_CONFIRMED).equals(pageForm.getPendingConfirmStatus()) + ? STATUS_CONFIRMED : STATUS_PENDING; + cnd.and("userInfo.pendingConfirmStatus", "=", status); + + if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) { + SqlExpressionGroup keywordGroup = new SqlExpressionGroup(); + keywordGroup.orLike("userInfo.loginname", pageForm.getSearchKeyword()); + keywordGroup.orLike("userInfo.username", pageForm.getSearchKeyword()); + cnd.and(keywordGroup); + } + cnd.andEX("userInfo.unionId", "=", pageForm.getUnionId()); + cnd.andEX("userInfo.unitId", "=", pageForm.getUnitId()); + cnd.andEX("userInfo.personType", "=", pageForm.getPersonType()); + cnd.andEX("userInfo.userState", "=", pageForm.getUserState()); + + String orderColumn = resolveOrderColumn(pageForm.getPageOrderName()); + if (StrUtil.isAllNotBlank(orderColumn, pageForm.getPageOrderBy())) { + cnd.orderBy(orderColumn, PageUtil.getOrder(pageForm.getPageOrderBy())); + } else { + cnd.asc("userInfo.loginname"); + } + sql.setCondition(cnd); + return listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + } + + /** + * 直接更新待确认人员及历史记录,不写会员变更记录,也不创建任何流程实例或任务。 + * + * @param record 待确认人员变更内容 + * @return true 表示人员字段发生变化,false 表示仅完成确认 + */ + @Override + @Aop(TransAop.READ_COMMITTED) + public boolean submitChange(MemberChangeRecord record) { + if (record == null || StrUtil.isBlank(record.getUserId())) { + throw new BaseException("未获取到待确认人员数据"); + } + if (StrUtil.isBlank(record.getPersonType())) { + throw new BaseException("请选择人员类型"); + } + validatePersonType(record.getPersonType()); + // 单人页面虽然提交完整表单,服务层只采用用户ID和人员类型,防止请求篡改其他只读字段。 + return changePersonType(record.getUserId(), record.getPersonType()); + } + + /** + * 在同一事务内批量处理选中人员;任意人员状态异常时整体回滚,避免出现部分成功。 + * + * @param changeParam 批量用户ID及目标人员类型 + * @return 完成确认的人员数量 + */ + @Override + @Aop(TransAop.READ_COMMITTED) + public int batchChangePersonType(PendingConfirmUserBatchChangeParam changeParam) { + if (changeParam == null || StrUtil.isBlank(changeParam.getUserIds())) { + throw new BaseException("请选择需要变更的人员"); + } + if (StrUtil.isBlank(changeParam.getPersonType())) { + throw new BaseException("请选择人员类型"); + } + validatePersonType(changeParam.getPersonType()); + + List userIds; + try { + userIds = JSONUtil.parseArray(changeParam.getUserIds()).toList(String.class); + } catch (Exception e) { + throw new BaseException("批量变更人员参数格式不正确"); + } + // 去除空ID和重复ID,防止同一人员在一次请求内被重复处理。 + LinkedHashSet normalizedUserIds = new LinkedHashSet<>(); + for (String userId : userIds) { + if (StrUtil.isNotBlank(userId)) { + normalizedUserIds.add(userId); + } + } + if (normalizedUserIds.isEmpty()) { + throw new BaseException("请选择需要变更的人员"); + } + + for (String userId : new ArrayList<>(normalizedUserIds)) { + changePersonType(userId, changeParam.getPersonType()); + } + return normalizedUserIds.size(); + } + + /** + * 仅修改指定待确认人员的人员类型,并复用会员公共服务生成用户历史记录。 + * + * @param userId 用户ID + * @param personType 目标人员类型 + * @return true 表示人员类型发生变化,false 表示类型未变化但已完成确认 + */ + private boolean changePersonType(String userId, String personType) { + Sys_user user = dao().fetch(Sys_user.class, userId); + if (user == null || !Integer.valueOf(STATUS_PENDING).equals(user.getPendingConfirmStatus())) { + throw new BaseException("当前人员不属于待确认人员记录"); + } + + // View_user 是数据库视图且未声明 @Name,必须使用条件查询,不能调用主键值重载。 + View_user userView = dao().fetch(View_user.class, Cnd.where("id", "=", userId)); + if (userView == null) { + throw new BaseException("未获取到人员基础信息"); + } + // 从数据库当前值重建完整变更对象,除人员类型外不信任前端提交的任何人员字段。 + MemberChangeRecord safeRecord = new MemberChangeRecord(); + BeanUtil.copyProperties(userView, safeRecord); + safeRecord.setUserId(userId); + safeRecord.setPersonType(StrUtil.trim(personType)); + safeRecord.setMember(Integer.valueOf(1).equals(userView.getMember())); + safeRecord.setWelfareMember(Integer.valueOf(1).equals(userView.getWelfareMember())); + safeRecord.setArrivalAtSchoolDate(userView.getArrivalAtSchoolDate() == null + ? null : DateUtil.formatDate(userView.getArrivalAtSchoolDate())); + safeRecord.setWelfareStopDate(userView.getWelfareStopDate() == null + ? null : DateUtil.formatDate(userView.getWelfareStopDate())); + + try { + // 复用公共校验和历史记录生成口径,确保单人、批量变更结果保持一致。 + memberCommonService.validateChangeAndSetBasicData(safeRecord, MemberChangeOrigin.SYSTEM); + } catch (BaseException e) { + // 人员类型与当前值相同时允许直接完成确认;其他业务异常必须继续抛出并触发事务回滚。 + if ("未获取到异动数据".equals(e.getMessage())) { + markConfirmed(userId); + return false; + } + throw e; + } + + memberCommonService.compareChangeInfoAndUpdateMember(safeRecord); + markConfirmed(userId); + return true; + } + + /** + * 校验待确认人员允许变更的目标人员类型。 + * + * @param personType 目标人员类型 + */ + private void validatePersonType(String personType) { + String targetPersonType = StrUtil.trim(personType); + List personTypeDicts = sysDictService.getSubListByCode("USER_PERSON_TYPE"); + boolean allowed = personTypeDicts != null && personTypeDicts.stream().anyMatch(dict -> + ALLOWED_PERSON_TYPE_NAMES.contains(dict.getName()) + && StrUtil.equals(targetPersonType, dict.getCode())); + if (!allowed) { + throw new BaseException("人员类型只能选择离退休人员或其他"); + } + } + + /** + * 变更提交成功后仅把待确认人员更新为已确认,重复调用不会改变其他状态。 + * + * @param userId 系统用户ID + */ + @Override + public void markConfirmed(String userId) { + if (StrUtil.isBlank(userId)) { + return; + } + Sql sql = Sqls.create(""" + UPDATE sys_user + SET pendingConfirmStatus = @confirmedStatus + WHERE id = @userId + AND pendingConfirmStatus = @pendingStatus + """); + sql.setParam("confirmedStatus", STATUS_CONFIRMED); + sql.setParam("pendingStatus", STATUS_PENDING); + sql.setParam("userId", userId); + dao().execute(sql); + } + + /** + * 将前端排序字段转换为固定数据库字段,避免排序参数直接拼接到 SQL。 + * + * @param pageOrderName 前端排序字段 + * @return 允许排序的数据库字段,不支持时返回空字符串 + */ + private String resolveOrderColumn(String pageOrderName) { + Map orderColumns = Map.of( + "loginname", "userInfo.loginname", + "username", "userInfo.username", + "unionName", "unionInfo.name", + "unitName", "unitInfo.name", + "personType", "userInfo.personType", + "userState", "userInfo.userState" + ); + return orderColumns.getOrDefault(StrUtil.nullToEmpty(pageOrderName), ""); + } +} diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/thirtyTeach/controller/ThirtyTeachController.java b/src/main/java/com/budwk/app/zhgh/staffmanage/thirtyTeach/controller/ThirtyTeachController.java index 3ffa505e..aee97061 100644 --- a/src/main/java/com/budwk/app/zhgh/staffmanage/thirtyTeach/controller/ThirtyTeachController.java +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/thirtyTeach/controller/ThirtyTeachController.java @@ -87,6 +87,7 @@ public class ThirtyTeachController { @ApiOperation("一键设置三十龄教工") @SaCheckPermission("thirtyTeach.manage") @SLog(type = "30龄教工-教职工管理", tag = "设置三十龄教工",msg = "设置三十龄教工设置教龄${args[0]}") + @Aop(TransAop.READ_COMMITTED) public Result setThirtyTeach(Integer setNum, boolean isFlag){ if (isFlag) { sysUserService.update(Chain.make("isThirtyTeach", 0), Cnd.NEW()); @@ -95,6 +96,8 @@ public class ThirtyTeachController { cnd.and("arrivalAtSchoolDate", "is not", null); cnd.and("arrivalAtSchoolDate", "!=", ""); cnd.and(TEACH_NUM_SQL, ">", setNum); + // 一键设置只标记已确认会员,确保设置范围与管理列表保持一致。 + cnd.and("member", "=", true); sysUserService.update(Chain.make("isThirtyTeach", 1), cnd); return Result.success(); } diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/thirtyTeach/service/impl/ThirtyTeachServiceImpl.java b/src/main/java/com/budwk/app/zhgh/staffmanage/thirtyTeach/service/impl/ThirtyTeachServiceImpl.java index 796b395f..7c522dc5 100644 --- a/src/main/java/com/budwk/app/zhgh/staffmanage/thirtyTeach/service/impl/ThirtyTeachServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/thirtyTeach/service/impl/ThirtyTeachServiceImpl.java @@ -55,6 +55,8 @@ public class ThirtyTeachServiceImpl extends BaseServiceImpl implements ThirtyTea sql.setVar("teachNumSql", new Static(TEACH_NUM_SQL)); Cnd cnd = Cnd.NEW(); cnd.and("isThirtyTeach", "=", 1); + // 三十年教龄名单仅展示已确认会员,避免非会员进入管理及导出范围。 + cnd.and("member", "=", true); if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) { SqlExpressionGroup seg = new SqlExpressionGroup(); seg.orLike("loginname", pageForm.getSearchKeyword()); diff --git a/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareListController.java b/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareListController.java index d071875a..635be843 100644 --- a/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareListController.java +++ b/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareListController.java @@ -92,6 +92,55 @@ public class WelfareListController { return Result.success(); } + /** + * 统计当前搜索条件下的福利名单人数,用于批量删除前二次确认。 + * + * @param pageForm 福利名单搜索条件 + * @return 命中人数 + */ + @At + @SaCheckPermission("welfare.list.mange") + public Result countByPageForm(@Valid @Param("pageForm") WelfareListPageForm pageForm) { + if (StrUtil.isBlank(pageForm.getProjectId())) { + return Result.error("请选择福利项目"); + } + return Result.success(welfareListService.countByPageForm(pageForm)); + } + + /** + * 按当前搜索条件删除福利名单及对应的用户已选福利记录。 + * + * @param pageForm 福利名单搜索条件 + * @return 删除结果 + */ + @At + @Aop(TransAop.READ_COMMITTED) + @ApiOperation("按搜索条件删除福利名单人员") + @SaCheckPermission("welfare.list.mange") + @SLog(tag = "福利名单管理", msg = "按搜索条件批量删除福利名单人员") + public Result deleteByPageForm(@Valid @Param("pageForm") WelfareListPageForm pageForm) { + if (StrUtil.isBlank(pageForm.getProjectId())) { + return Result.error("请选择福利项目"); + } + int deletedCount = welfareListService.deleteByPageForm(pageForm); + return Result.success("成功删除" + deletedCount + "人"); + } + + /** + * 根据人员当前所属单位同步指定福利项目名单的单位和工会快照。 + * + * @param projectId 福利项目 ID + * @return 同步结果 + */ + @At + @Aop(TransAop.READ_COMMITTED) + @ApiOperation("同步福利名单工会") + @SaCheckPermission("welfare.list.mange") + @SLog(tag = "福利名单管理", msg = "同步了福利名单单位和工会") + public Result syncWelfareListUnitAndUnion(String projectId) { + return welfareListService.syncWelfareListUnitAndUnion(projectId); + } + @At @SaCheckPermission("welfare.list.mange") @ApiOperation("分页查询非福利会员") diff --git a/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareMineController.java b/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareMineController.java index fc8645bb..70abf43b 100644 --- a/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareMineController.java +++ b/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareMineController.java @@ -48,7 +48,8 @@ public class WelfareMineController { @At @SaCheckPermission("welfare.mine") public Result pageData(PageForm pageForm, - Integer year) { + Integer year, + String name) { Sql sql = Sqls.create(""" SELECT wp.*, @@ -57,13 +58,14 @@ public class WelfareMineController { WHEN wus.selectUserId IS NOT NULL THEN 1 ELSE 0 END AS isChoose, - GROUP_CONCAT(DISTINCT wuso.optionName ,'(',wus.selectNum,'份)') AS gist_list, - wus.receiveAddress, + GROUP_CONCAT(DISTINCT wuso.optionName ,'(',wus.selectNum,'份)') AS gist_list, + MAX(wus.selectTime) AS selectTime, + wus.receiveAddress, wl.userId FROM welfare_list wl LEFT JOIN welfare_project wp ON wp.id = wl.projectId - LEFT JOIN welfare_project_user_selection wus ON wl.projectId = wus.welfareId + INNER JOIN welfare_project_user_selection wus ON wl.projectId = wus.welfareId AND wus.selectUserId = @selectUserId LEFT JOIN welfare_project_subject_option wuso ON wus.selectOptionId = wuso.id $condition @@ -73,6 +75,9 @@ public class WelfareMineController { cnd.and("wp.isDisabled", "=", 0); cnd.andEX("YEAR(wp.choiceTimeStart)", "=", year); cnd.andEX("wl.userId", "=", SecurityUtil.getUserId()); + if (StrUtil.isNotBlank(name)) { + cnd.and("wp.name", "like", "%" + name.trim() + "%"); + } cnd.desc("wp.choiceTimeStart"); cnd.groupBy("wl.id"); sql.setCondition(cnd); diff --git a/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareProjectMangeController.java b/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareProjectMangeController.java index 6fad271e..36daca99 100644 --- a/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareProjectMangeController.java +++ b/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareProjectMangeController.java @@ -97,6 +97,17 @@ public class WelfareProjectMangeController { return Result.success(projectService.projectInfo(id)); } + /** + * 查询可沿用的往期福利项目。 + * + * @return 往期福利项目列表 + */ + @At + @SaCheckPermission("welfare.project.mange") + public Result historyProjectList() { + return Result.success(projectService.listHistoryProject()); + } + @At @SaCheckPermission("welfare.project.mange") @@ -117,6 +128,24 @@ public class WelfareProjectMangeController { return Result.success(); } + /** + * 清空指定福利项目的名单及用户已选福利记录。 + * + * @param id 福利项目 ID + * @return 清空结果 + */ + @At + @Aop(TransAop.READ_COMMITTED) + @SLog(tag = "福利", msg = "清空了福利名单") + @SaCheckPermission("welfare.project.mange") + public Result clearWelfareList(String id) { + if (StrUtil.isBlank(id) || projectService.fetch(id) == null) { + return Result.error("福利项目不存在"); + } + projectService.clearWelfareList(id); + return Result.success("福利名单已清空"); + } + @At @SaCheckPermission("welfare.mine") public Result getWelfareList(Integer year) { diff --git a/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareUserSelectController.java b/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareUserSelectController.java index 9a7e6e1a..6bf72b60 100644 --- a/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareUserSelectController.java +++ b/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareUserSelectController.java @@ -1,6 +1,7 @@ package com.budwk.app.zhgh.welfare.controller; import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.util.StrUtil; import com.budwk.app.base.annotation.SLog; import com.budwk.app.base.page.Pagination; import com.budwk.app.base.param.PageForm; @@ -47,7 +48,7 @@ public class WelfareUserSelectController { @At @SaCheckPermission("welfare.user.select") @ApiOperation("获取用户选择列表分页") - public Result pageData(PageForm pageForm, Integer year) { + public Result pageData(PageForm pageForm, Integer year, String name) { Sql sql = Sqls.create(""" SELECT wp.*, @@ -71,6 +72,9 @@ public class WelfareUserSelectController { cnd.and("wp.provideMode", "in", "2,3"); cnd.andEX("YEAR(wp.choiceTimeStart)", "in", year); cnd.and("wp.isDisabled", "=", 0); + if (StrUtil.isNotBlank(name)) { + cnd.and("wp.name", "like", "%" + name.trim() + "%"); + } cnd.groupBy("wp.id"); cnd.desc("wp.choiceTimeStart"); sql.setCondition(cnd); diff --git a/src/main/java/com/budwk/app/zhgh/welfare/param/WelfareListPageForm.java b/src/main/java/com/budwk/app/zhgh/welfare/param/WelfareListPageForm.java index 1ba712dc..2b07edb9 100644 --- a/src/main/java/com/budwk/app/zhgh/welfare/param/WelfareListPageForm.java +++ b/src/main/java/com/budwk/app/zhgh/welfare/param/WelfareListPageForm.java @@ -43,6 +43,9 @@ public class WelfareListPageForm extends PageForm { @ApiModelProperty("单位id") private String[] unitIds; + @ApiModelProperty("三级单位id") + private String[] threeUnitIds; + @ApiModelProperty("单位名称") private String unitName; @@ -59,6 +62,6 @@ public class WelfareListPageForm extends PageForm { private String aidFundMemberUserType; @ApiModelProperty("人员属性") - private String userAttribute; + private String[] userAttributes; } diff --git a/src/main/java/com/budwk/app/zhgh/welfare/service/WelfareListService.java b/src/main/java/com/budwk/app/zhgh/welfare/service/WelfareListService.java index 6b231b34..04eb36b2 100644 --- a/src/main/java/com/budwk/app/zhgh/welfare/service/WelfareListService.java +++ b/src/main/java/com/budwk/app/zhgh/welfare/service/WelfareListService.java @@ -33,6 +33,30 @@ public interface WelfareListService extends BaseService { */ Pagination pageData(WelfareListPageForm pageForm); + /** + * 统计当前搜索条件命中的福利名单人数。 + * + * @param pageForm 福利名单搜索条件 + * @return 命中人数 + */ + int countByPageForm(WelfareListPageForm pageForm); + + /** + * 按当前搜索条件删除福利名单及对应的用户已选福利记录。 + * + * @param pageForm 福利名单搜索条件 + * @return 删除的名单人数 + */ + int deleteByPageForm(WelfareListPageForm pageForm); + + /** + * 根据人员当前所属单位同步福利名单的单位和工会快照。 + * + * @param projectId 福利项目 ID + * @return 同步结果及变更人数 + */ + Result syncWelfareListUnitAndUnion(String projectId); + /** * 查询非福利会员用户 * @param pageForm diff --git a/src/main/java/com/budwk/app/zhgh/welfare/service/WelfareProjectService.java b/src/main/java/com/budwk/app/zhgh/welfare/service/WelfareProjectService.java index a061f95a..389a53a0 100644 --- a/src/main/java/com/budwk/app/zhgh/welfare/service/WelfareProjectService.java +++ b/src/main/java/com/budwk/app/zhgh/welfare/service/WelfareProjectService.java @@ -17,6 +17,13 @@ public interface WelfareProjectService extends BaseService { */ WelfareProject projectInfo(String projectId); + /** + * 查询可用于沿用配置的历史福利项目。 + * + * @return 历史福利项目列表 + */ + List listHistoryProject(); + /** * 校验福利选择是否保留系统默认福利。 * @@ -44,6 +51,13 @@ public interface WelfareProjectService extends BaseService { */ void deleteWelfare(String id); + /** + * 清空指定福利项目的名单及用户已选福利记录,保留项目配置。 + * + * @param projectId 福利项目 ID + */ + void clearWelfareList(String projectId); + /** * 创建福利名单 * @param projectId diff --git a/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareListServiceImpl.java b/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareListServiceImpl.java index 3574af35..0d065412 100644 --- a/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareListServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareListServiceImpl.java @@ -28,11 +28,13 @@ import com.budwk.app.zhgh.welfare.service.WelfareListService; import lombok.extern.slf4j.Slf4j; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.nutz.aop.interceptor.ioc.TransAop; import org.nutz.dao.Chain; import org.nutz.dao.Cnd; import org.nutz.dao.Dao; import org.nutz.dao.Sqls; import org.nutz.dao.sql.Sql; +import org.nutz.ioc.aop.Aop; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.json.Json; import org.nutz.lang.Lang; @@ -390,12 +392,130 @@ public class WelfareListServiceImpl extends BaseServiceImpl impleme t2.loginname, t2.username, t2.sex, - t2.birthday + t2.birthday, + threeUnit.name AS threeUnitName FROM `welfare_list` t1 LEFT JOIN `vw_user` t2 ON t2.id = t1.userId + LEFT JOIN sys_unit threeUnit ON threeUnit.id = t2.threeUnitId $condition """); + Cnd cnd = buildPageDataCnd(pageForm); + if (StrUtil.isAllBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) { + cnd.asc("t1.welfareUnionName"); + cnd.asc("t1.welfareUnitName"); + } else { + cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy())); + } + sql.setCondition(cnd); + Pagination pagination = listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + return pagination; + } + + @Override + public int countByPageForm(WelfareListPageForm pageForm) { + Sql sql = Sqls.create("SELECT COUNT(1) FROM welfare_list t1 LEFT JOIN vw_user t2 ON t2.id = t1.userId $condition"); + sql.setCondition(buildPageDataCnd(pageForm)); + sql.setCallback(Sqls.callback.integer()); + dao().execute(sql); + return sql.getInt(); + } + + @Override + @Aop(TransAop.READ_COMMITTED) + public int deleteByPageForm(WelfareListPageForm pageForm) { + Sql sql = Sqls.create("SELECT t1.id, t1.userId FROM welfare_list t1 LEFT JOIN vw_user t2 ON t2.id = t1.userId $condition"); + sql.setCondition(buildPageDataCnd(pageForm)); + List welfareLists = listMap(sql); + if (welfareLists.isEmpty()) { + return 0; + } + + List welfareListIds = welfareLists.stream().map(item -> item.getString("id")).collect(Collectors.toList()); + List userIds = welfareLists.stream().map(item -> item.getString("userId")).filter(StrUtil::isNotBlank).distinct().collect(Collectors.toList()); + // 先清理当前项目中这些人员的已选福利记录,确保名单与选择数据保持一致。 + if (!userIds.isEmpty()) { + dao().clear(WelfareUserSelection.class, Cnd.where("welfareId", "=", pageForm.getProjectId()).and("selectUserId", "in", userIds)); + } + dao().clear(WelfareList.class, Cnd.where("id", "in", welfareListIds)); + return welfareListIds.size(); + } + + @Override + @Aop(TransAop.READ_COMMITTED) + public Result syncWelfareListUnitAndUnion(String projectId) { + if (StrUtil.isBlank(projectId)) { + return Result.error("请选择福利项目"); + } + WelfareProject project = dao().fetch(WelfareProject.class, projectId); + if (project == null) { + return Result.error("福利项目不存在"); + } + Date currentTime = new Date(); + if (project.getChoiceTimeStart() == null || project.getChoiceTimeEnd() == null + || currentTime.before(project.getChoiceTimeStart()) || currentTime.after(project.getChoiceTimeEnd())) { + return Result.error("仅可在福利项目选择时间内同步工会"); + } + + String unionScopeSql = ""; + boolean branchUnionRole = AuthUtil.hasRole(RoleConstant.BRANCH_UNION_CHAIRMAN.name()) + || AuthUtil.hasRole(RoleConstant.BRANCH_UNION_ADMIN.name()) + || AuthUtil.hasRole(RoleConstant.BRANCH_UNION_WENTI_SPORTS.name()); + if (branchUnionRole) { + unionScopeSql = " AND unit.unionId = @currentUnionId"; + } + + String changedConditionSql = """ + (IFNULL(wl.welfareUnitId, '') <> IFNULL(currentUser.unitId, '') + OR IFNULL(wl.welfareUnitName, '') <> IFNULL(unit.name, '') + OR IFNULL(wl.welfareUnionId, '') <> IFNULL(unionInfo.id, '') + OR IFNULL(wl.welfareUnionName, '') <> IFNULL(unionInfo.name, '')) + """; + Sql countSql = Sqls.create(""" + SELECT COUNT(1) + FROM welfare_list wl + INNER JOIN vw_user currentUser ON currentUser.id = wl.userId + LEFT JOIN sys_unit unit ON unit.id = currentUser.unitId + LEFT JOIN sys_union unionInfo ON unionInfo.id = unit.unionId + WHERE wl.projectId = @projectId + AND """ + changedConditionSql + unionScopeSql); + countSql.setParam("projectId", projectId); + if (branchUnionRole) { + countSql.setParam("currentUnionId", SecurityUtil.getUnionId()); + } + countSql.setCallback(Sqls.callback.integer()); + dao().execute(countSql); + int changedCount = countSql.getInt(); + if (changedCount == 0) { + return Result.success("没有需要同步的人员"); + } + + Sql updateSql = Sqls.create(""" + UPDATE welfare_list wl + INNER JOIN vw_user currentUser ON currentUser.id = wl.userId + LEFT JOIN sys_unit unit ON unit.id = currentUser.unitId + LEFT JOIN sys_union unionInfo ON unionInfo.id = unit.unionId + SET wl.welfareUnitId = currentUser.unitId, + wl.welfareUnitName = unit.name, + wl.welfareUnionId = unionInfo.id, + wl.welfareUnionName = unionInfo.name + WHERE wl.projectId = @projectId + AND """ + changedConditionSql + unionScopeSql); + updateSql.setParam("projectId", projectId); + if (branchUnionRole) { + updateSql.setParam("currentUnionId", SecurityUtil.getUnionId()); + } + dao().execute(updateSql); + return Result.success("成功同步" + changedCount + "人"); + } + + /** + * 构建福利名单分页、统计和批量删除共用的筛选条件,确保三种操作范围一致。 + * + * @param pageForm 福利名单搜索条件 + * @return 数据库查询条件 + */ + private Cnd buildPageDataCnd(WelfareListPageForm pageForm) { Cnd cnd = Cnd.NEW(); cnd.and("t1.projectId", "=", pageForm.getProjectId()); if (StrUtil.isNotBlank(pageForm.getUserName())) { @@ -413,21 +533,14 @@ public class WelfareListServiceImpl extends BaseServiceImpl impleme cnd.and("t2.unionId", "=", SecurityUtil.getUnionId()); } cnd.andEX("t1.welfareUnitId", "in", pageForm.getUnitIds()); + cnd.andEX("t2.threeUnitId", "in", pageForm.getThreeUnitIds()); cnd.andEX("t1.welfareUnionId", "=", pageForm.getUnionId()); cnd.andEX("t1.personType", "in", pageForm.getPersonTypes()); cnd.andEX("t1.preparedBy", "in", pageForm.getPreparedBys()); cnd.andEX("t1.userState", "in", pageForm.getUserStates()); cnd.andEX("t2.aidFundMemberUserType", "=", pageForm.getAidFundMemberUserType()); - cnd.andEX("t2.userAttribute", "=", pageForm.getUserAttribute()); - if (StrUtil.isAllBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) { - cnd.asc("t1.welfareUnionName"); - cnd.asc("t1.welfareUnitName"); - } else { - cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy())); - } - sql.setCondition(cnd); - Pagination pagination = listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); - return pagination; + cnd.andEX("t2.userAttribute", "in", pageForm.getUserAttributes()); + return cnd; } @Override @@ -572,10 +685,12 @@ public class WelfareListServiceImpl extends BaseServiceImpl impleme t2.loginname, t2.username, t2.sex, - DATE_FORMAT(t2.birthday, '%Y-%m-%d') AS birthday + DATE_FORMAT(t2.birthday, '%Y-%m-%d') AS birthday, + threeUnit.name AS threeUnitName FROM `welfare_list` t1 LEFT JOIN sys_user t2 ON t2.id = t1.userId + LEFT JOIN sys_unit threeUnit ON threeUnit.id = t2.threeUnitId $condition """); Cnd cnd = Cnd.NEW(); @@ -592,10 +707,13 @@ public class WelfareListServiceImpl extends BaseServiceImpl impleme cnd.andEX("MONTH(t2.birthday)", "in", pageForm.getBirthMonths()); } cnd.andEX("t1.welfareUnitId", "in", pageForm.getUnitIds()); + cnd.andEX("t2.threeUnitId", "in", pageForm.getThreeUnitIds()); cnd.andEX("t1.welfareUnionId", "=", pageForm.getUnionId()); cnd.andEX("t1.personType", "in", pageForm.getPersonTypes()); cnd.andEX("t1.preparedBy", "in", pageForm.getPreparedBys()); cnd.andEX("t1.userState", "in", pageForm.getUserStates()); + cnd.andEX("t2.aidFundMemberUserType", "=", pageForm.getAidFundMemberUserType()); + cnd.andEX("t2.userAttribute", "in", pageForm.getUserAttributes()); if (StrUtil.isAllBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) { cnd.asc("t1.welfareUnionName"); @@ -617,6 +735,7 @@ public class WelfareListServiceImpl extends BaseServiceImpl impleme entities.add(new ExcelExportEntity("在职状态", "userState", 20)); entities.add(new ExcelExportEntity("所属工会", "welfareUnionName", 20)); entities.add(new ExcelExportEntity("所属单位", "welfareUnitName", 20)); + entities.add(new ExcelExportEntity("三级单位", "threeUnitName", 20)); entities.add(new ExcelExportEntity("备注", "remark", 20)); // 设置导出参数 diff --git a/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareProjectServiceImpl.java b/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareProjectServiceImpl.java index cae1c2b5..da2c6b73 100644 --- a/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareProjectServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareProjectServiceImpl.java @@ -49,6 +49,11 @@ public class WelfareProjectServiceImpl extends BaseServiceImpl i return project; } + @Override + public List listHistoryProject() { + return dao().query(WelfareProject.class, Cnd.NEW().desc(WelfareProject::getYear).desc(WelfareProject::getChoiceTimeStart)); + } + @Override public String validateSystemDefaultOptionSelection(String projectId, WelfareUserSelection[] selections) { List systemDefaultOptions = dao().query(WelfareProjectSubjectOption.class, @@ -164,6 +169,14 @@ public class WelfareProjectServiceImpl extends BaseServiceImpl i dao().clear(Sys_home_activity.class, Cnd.where("id", "=", id)); } + @Override + @Aop(TransAop.READ_COMMITTED) + public void clearWelfareList(String projectId) { + // 先清空用户选择记录,避免名单清空后保留无归属的福利选择数据。 + dao().clear(WelfareUserSelection.class, Cnd.where(WelfareUserSelection::getWelfareId, "=", projectId)); + dao().clear(WelfareList.class, Cnd.where(WelfareList::getProjectId, "=", projectId)); + } + @Override public void createList(String projectId, boolean created) { WelfareProject project = projectInfo(projectId); diff --git a/src/main/resources/application-dev.yaml b/src/main/resources/application-dev.yaml index 49351962..52398357 100644 --- a/src/main/resources/application-dev.yaml +++ b/src/main/resources/application-dev.yaml @@ -5,7 +5,7 @@ nutz: ignore: ^(.+[.])(jsp|png|gif|jpg|js|css|jspx|jpeg|html|mp3|mp4|ico|svg|vue)$ exclusions: /favicon/*,/assets/*,/druid/*,/upload/*,/components/* server: - port: 80 + port: 8080 host: 0.0.0.0 jetty: diff --git a/src/main/resources/db/activity_school_add_template_status.sql b/src/main/resources/db/activity_school_add_template_status.sql new file mode 100644 index 00000000..f8a19c77 --- /dev/null +++ b/src/main/resources/db/activity_school_add_template_status.sql @@ -0,0 +1,7 @@ +-- 体育活动增加模板设置状态,并根据现有工作模板回填历史数据。 +ALTER TABLE `activity_school` + ADD COLUMN `templateStatus` tinyint(1) NOT NULL DEFAULT 0 COMMENT '模板设置状态 0.未设置 1.已设置' AFTER `isSave`; + +UPDATE `activity_school` school +INNER JOIN `sys_home_template` template ON template.`id` = school.`id` +SET school.`templateStatus` = 1; diff --git a/src/main/resources/db/activity_tissue_add_template_status.sql b/src/main/resources/db/activity_tissue_add_template_status.sql new file mode 100644 index 00000000..56daf802 --- /dev/null +++ b/src/main/resources/db/activity_tissue_add_template_status.sql @@ -0,0 +1,8 @@ +-- 文化活动增加模板设置状态,并只回填校工会文化活动的历史模板数据。 +ALTER TABLE `activity_tissue` + ADD COLUMN `templateStatus` tinyint(1) NOT NULL DEFAULT 0 COMMENT '模板设置状态 0.未设置 1.已设置'; + +UPDATE `activity_tissue` tissue +INNER JOIN `sys_home_template` template ON template.`id` = tissue.`id` +SET tissue.`templateStatus` = 1 +WHERE tissue.`activity_type` = 40001; diff --git a/src/main/resources/db/activity_tissue_backfill_union_template_status.sql b/src/main/resources/db/activity_tissue_backfill_union_template_status.sql new file mode 100644 index 00000000..0110bedb --- /dev/null +++ b/src/main/resources/db/activity_tissue_backfill_union_template_status.sql @@ -0,0 +1,5 @@ +-- 使用现有模板设置状态字段,回填分工会文化活动的历史模板数据。 +UPDATE `activity_tissue` tissue +INNER JOIN `sys_home_template` template ON template.`id` = tissue.`id` +SET tissue.`templateStatus` = 1 +WHERE tissue.`activity_type` = 40002; diff --git a/src/main/resources/db/activity_works_collection_add_template_status.sql b/src/main/resources/db/activity_works_collection_add_template_status.sql new file mode 100644 index 00000000..06813968 --- /dev/null +++ b/src/main/resources/db/activity_works_collection_add_template_status.sql @@ -0,0 +1,7 @@ +-- 作品征集活动增加模板设置状态,并根据现有工作模板回填历史数据。 +ALTER TABLE `activity_works_collection` + ADD COLUMN `templateStatus` tinyint(1) NOT NULL DEFAULT 0 COMMENT '模板设置状态 0.未设置 1.已设置'; + +UPDATE `activity_works_collection` activity +INNER JOIN `sys_home_template` template ON template.`id` = activity.`id` +SET activity.`templateStatus` = 1; diff --git a/src/main/resources/db/archive_init.sql b/src/main/resources/db/archive_init.sql deleted file mode 100644 index b41bb77d..00000000 --- a/src/main/resources/db/archive_init.sql +++ /dev/null @@ -1,192 +0,0 @@ --- 活动电子档案模块初始化脚本(MySQL 8)。 --- 表结构、索引和菜单均可独立部署,不包含数据库名限定。 - -CREATE TABLE IF NOT EXISTS act_archive_doc_type ( - id VARCHAR(32) NOT NULL COMMENT '主键', - name VARCHAR(150) NOT NULL COMMENT '类型名称', - projectStage VARCHAR(32) NOT NULL COMMENT '项目阶段:PREPARE/PROCESS/SUMMARY', - sortNo INT NOT NULL DEFAULT 0 COMMENT '排序编号', - requiredFlag TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否必选', - remark VARCHAR(600) NULL COMMENT '备注', - createdBy VARCHAR(32) NULL COMMENT '创建人', - createdAt BIGINT NULL COMMENT '创建时间', - updatedBy VARCHAR(32) NULL COMMENT '修改人', - updatedAt BIGINT NULL COMMENT '修改时间', - delFlag TINYINT(1) NOT NULL DEFAULT 0 COMMENT '删除标记', - PRIMARY KEY (id), - UNIQUE KEY uk_archive_doc_type_stage_name (projectStage, name), - KEY idx_archive_doc_type_stage_sort (projectStage, sortNo, createdAt) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='活动电子档案文档类型'; - -CREATE TABLE IF NOT EXISTS act_archive_project ( - id VARCHAR(32) NOT NULL COMMENT '主键', - year INT NOT NULL COMMENT '年度', - projectName VARCHAR(300) NOT NULL COMMENT '项目名称', - status TINYINT NOT NULL DEFAULT 0 COMMENT '状态:0草稿、1归档中、2已完成', - unionId VARCHAR(32) NOT NULL COMMENT '所属工会ID', - unionName VARCHAR(150) NOT NULL COMMENT '所属工会名称', - createdBy VARCHAR(32) NULL COMMENT '创建人', - createdAt BIGINT NULL COMMENT '创建时间', - updatedBy VARCHAR(32) NULL COMMENT '修改人', - updatedAt BIGINT NULL COMMENT '修改时间', - delFlag TINYINT(1) NOT NULL DEFAULT 0 COMMENT '删除标记', - PRIMARY KEY (id), - UNIQUE KEY uk_archive_project_year_name_union (year, projectName, unionId), - KEY idx_archive_project_year_created (year, createdAt), - KEY idx_archive_project_union (unionId) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='活动电子档案项目'; - -CREATE TABLE IF NOT EXISTS act_archive_document ( - id VARCHAR(32) NOT NULL COMMENT '主键', - projectId VARCHAR(32) NOT NULL COMMENT '归档项目ID', - documentName VARCHAR(300) NOT NULL COMMENT '文档名称', - projectStage VARCHAR(32) NOT NULL COMMENT '项目阶段:PREPARE/PROCESS/SUMMARY', - docTypeId VARCHAR(32) NULL COMMENT '文档类型ID', - status TINYINT NOT NULL DEFAULT 0 COMMENT '状态:0草稿、1已提交归档', - uploader VARCHAR(100) NULL COMMENT '上传人', - uploadTime BIGINT NULL COMMENT '上传时间', - files JSON NULL COMMENT '附件上传结果', - remark VARCHAR(600) NULL COMMENT '备注', - createdBy VARCHAR(32) NULL COMMENT '创建人', - createdAt BIGINT NULL COMMENT '创建时间', - updatedBy VARCHAR(32) NULL COMMENT '修改人', - updatedAt BIGINT NULL COMMENT '修改时间', - delFlag TINYINT(1) NOT NULL DEFAULT 0 COMMENT '删除标记', - PRIMARY KEY (id), - KEY idx_archive_document_query (projectId, projectStage, docTypeId, uploadTime), - KEY idx_archive_document_project_status (projectId, status), - CONSTRAINT fk_archive_document_project - FOREIGN KEY (projectId) REFERENCES act_archive_project (id) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='活动电子档案归档文档'; - --- 一级菜单。 -INSERT INTO sys_menu ( - id, parentId, path, name, aliasName, type, href, target, icon, showit, - disabled, permission, note, location, hasChildren, createdBy, createdAt, - updatedBy, updatedAt, delFlag, platform, moduleId, picIcon, - initialPinyinName, isRecommendApp, isRecommendService -) -SELECT - '9a7d8d84b14f4d6e8ab2000000000001', - '', - LPAD(IFNULL(MAX(CAST(path AS UNSIGNED)), 0) + 1, 4, '0'), - '活动电子档案', - 'Archive', - 'menu', - '', - '', - 'ti-folder', - 1, - 0, - 'archive', - NULL, - 992, - 1, - '', - UNIX_TIMESTAMP(NOW()) * 1000, - '', - UNIX_TIMESTAMP(NOW()) * 1000, - 0, - 'PC', - NULL, - NULL, - 'h', - 0, - 0 -FROM sys_menu -WHERE (parentId = '' OR parentId IS NULL) - AND CHAR_LENGTH(path) = 4 -HAVING NOT EXISTS ( - SELECT 1 FROM (SELECT id FROM sys_menu WHERE permission = 'archive') t -); - --- 文档类型设置。 -INSERT INTO sys_menu ( - id, parentId, path, name, aliasName, type, href, target, icon, showit, - disabled, permission, note, location, hasChildren, createdBy, createdAt, - updatedBy, updatedAt, delFlag, platform, moduleId, picIcon, - initialPinyinName, isRecommendApp, isRecommendService -) -SELECT - '9a7d8d84b14f4d6e8ab2000000000002', p.id, CONCAT(p.path, '0001'), - '文档类型设置', 'Archive Doc Type', 'menu', '/platform/archive/docType', - 'data-pjax', '', 1, 0, 'archive.docType', NULL, 1, 0, '', - UNIX_TIMESTAMP(NOW()) * 1000, '', UNIX_TIMESTAMP(NOW()) * 1000, 0, - 'PC', NULL, NULL, 'w', 0, 0 -FROM sys_menu p -WHERE p.permission = 'archive' - AND NOT EXISTS ( - SELECT 1 FROM (SELECT id FROM sys_menu WHERE permission = 'archive.docType') t -); - --- 创建项目。 -INSERT INTO sys_menu ( - id, parentId, path, name, aliasName, type, href, target, icon, showit, - disabled, permission, note, location, hasChildren, createdBy, createdAt, - updatedBy, updatedAt, delFlag, platform, moduleId, picIcon, - initialPinyinName, isRecommendApp, isRecommendService -) -SELECT - '9a7d8d84b14f4d6e8ab2000000000003', p.id, CONCAT(p.path, '0002'), - '创建项目', 'Archive Project', 'menu', '/platform/archive/project', - 'data-pjax', '', 1, 0, 'archive.project', NULL, 2, 0, '', - UNIX_TIMESTAMP(NOW()) * 1000, '', UNIX_TIMESTAMP(NOW()) * 1000, 0, - 'PC', NULL, NULL, 'c', 0, 0 -FROM sys_menu p -WHERE p.permission = 'archive' - AND NOT EXISTS ( - SELECT 1 FROM (SELECT id FROM sys_menu WHERE permission = 'archive.project') t -); - --- 资料归档。 -INSERT INTO sys_menu ( - id, parentId, path, name, aliasName, type, href, target, icon, showit, - disabled, permission, note, location, hasChildren, createdBy, createdAt, - updatedBy, updatedAt, delFlag, platform, moduleId, picIcon, - initialPinyinName, isRecommendApp, isRecommendService -) -SELECT - '9a7d8d84b14f4d6e8ab2000000000004', p.id, CONCAT(p.path, '0003'), - '资料归档', 'Archive Filing', 'menu', '/platform/archive/filing', - 'data-pjax', '', 1, 0, 'archive.filing', NULL, 3, 0, '', - UNIX_TIMESTAMP(NOW()) * 1000, '', UNIX_TIMESTAMP(NOW()) * 1000, 0, - 'PC', NULL, NULL, 'z', 0, 0 -FROM sys_menu p -WHERE p.permission = 'archive' - AND NOT EXISTS ( - SELECT 1 FROM (SELECT id FROM sys_menu WHERE permission = 'archive.filing') t -); - --- 档案台账。 -INSERT INTO sys_menu ( - id, parentId, path, name, aliasName, type, href, target, icon, showit, - disabled, permission, note, location, hasChildren, createdBy, createdAt, - updatedBy, updatedAt, delFlag, platform, moduleId, picIcon, - initialPinyinName, isRecommendApp, isRecommendService -) -SELECT - '9a7d8d84b14f4d6e8ab2000000000005', p.id, CONCAT(p.path, '0004'), - '档案台账', 'Archive Ledger', 'menu', '/platform/archive/ledger', - 'data-pjax', '', 1, 0, 'archive.ledger', NULL, 4, 0, '', - UNIX_TIMESTAMP(NOW()) * 1000, '', UNIX_TIMESTAMP(NOW()) * 1000, 0, - 'PC', NULL, NULL, 'd', 0, 0 -FROM sys_menu p -WHERE p.permission = 'archive' - AND NOT EXISTS ( - SELECT 1 FROM (SELECT id FROM sys_menu WHERE permission = 'archive.ledger') t -); - --- 系统管理员默认授权,其他角色可在角色管理中按需分配。 -INSERT INTO sys_role_menu (roleId, menuId) -SELECT r.id, m.id -FROM sys_role r -JOIN sys_menu m ON m.permission IN ( - 'archive', - 'archive.docType', - 'archive.project', - 'archive.filing', - 'archive.ledger' -) -LEFT JOIN sys_role_menu rm ON rm.roleId = r.id AND rm.menuId = m.id -WHERE r.code = 'SYSADMIN' - AND rm.roleId IS NULL; diff --git a/src/main/resources/db/family_activity_add_template_status.sql b/src/main/resources/db/family_activity_add_template_status.sql new file mode 100644 index 00000000..0f67e36c --- /dev/null +++ b/src/main/resources/db/family_activity_add_template_status.sql @@ -0,0 +1,7 @@ +-- 亲子活动增加模板设置状态,并根据现有工作模板回填历史数据。 +ALTER TABLE `family_activity` + ADD COLUMN `templateStatus` tinyint(1) NOT NULL DEFAULT 0 COMMENT '模板设置状态 0.未设置 1.已设置'; + +UPDATE `family_activity` activity +INNER JOIN `sys_home_template` template ON template.`id` = activity.`id` +SET activity.`templateStatus` = 1; diff --git a/src/main/resources/db/menu/init_pending_source_change_menu.sql b/src/main/resources/db/menu/init_pending_source_change_menu.sql new file mode 100644 index 00000000..d0b09792 --- /dev/null +++ b/src/main/resources/db/menu/init_pending_source_change_menu.sql @@ -0,0 +1,64 @@ +-- 待确认人员记录菜单。以“变更记录”为同级菜单,并复制原变更记录菜单的角色授权。 +INSERT INTO sys_menu ( + id, parentId, path, name, aliasName, type, href, target, icon, showit, disabled, + permission, note, location, hasChildren, createdBy, createdAt, updatedBy, updatedAt, + delFlag, platform, moduleId, picIcon, initialPinyinName, isRecommendApp, isRecommendService +) +SELECT + '76a21e7d35df4ffbaecce44b3a659901', + source_menu.parentId, + CONCAT( + LEFT(source_menu.path, CHAR_LENGTH(source_menu.path) - 4), + LPAD( + IFNULL(( + SELECT MAX(CAST(RIGHT(child.path, 4) AS UNSIGNED)) + FROM sys_menu child + WHERE child.parentId = source_menu.parentId + ), 0) + 1, + 4, + '0' + ) + ), + '待确认人员记录', + 'Pending Personnel', + 'menu', + '/platform/sourcechange/pending', + 'data-pjax', + '', + 1, + 0, + 'staff.sourcechange.pending', + '系统用户待确认和已确认人员记录', + source_menu.location + 1, + 0, + '', + UNIX_TIMESTAMP(NOW()) * 1000, + '', + UNIX_TIMESTAMP(NOW()) * 1000, + 0, + 'PC', + source_menu.moduleId, + NULL, + 'd', + 0, + 0 +FROM sys_menu source_menu +WHERE source_menu.permission = 'staff.sourcechange.manage' + AND NOT EXISTS ( + SELECT 1 + FROM (SELECT id FROM sys_menu WHERE permission = 'staff.sourcechange.pending') existing_menu + ); + +-- 原先能够查看“变更记录”的角色默认拥有待确认人员记录权限。 +INSERT INTO sys_role_menu (roleId, menuId) +SELECT source_role.roleId, pending_menu.id +FROM sys_role_menu source_role +JOIN sys_menu source_menu + ON source_menu.id = source_role.menuId + AND source_menu.permission = 'staff.sourcechange.manage' +JOIN sys_menu pending_menu + ON pending_menu.permission = 'staff.sourcechange.pending' +LEFT JOIN sys_role_menu existing_role + ON existing_role.roleId = source_role.roleId + AND existing_role.menuId = pending_menu.id +WHERE existing_role.roleId IS NULL; diff --git a/src/main/resources/db/menu/init_spread_menu.sql b/src/main/resources/db/menu/init_spread_menu.sql new file mode 100644 index 00000000..26b52596 --- /dev/null +++ b/src/main/resources/db/menu/init_spread_menu.sql @@ -0,0 +1,79 @@ +-- 风采墙电脑端菜单。使用 permission 做幂等判断,脚本可重复执行。 +INSERT INTO sys_menu (id, parentId, path, name, aliasName, type, href, target, icon, showit, disabled, permission, note, location, hasChildren, createdBy, createdAt, updatedBy, updatedAt, delFlag, platform, moduleId, picIcon, initialPinyinName, isRecommendApp, isRecommendService) +SELECT + '9f5c0200000000000000000000000001', + '', + LPAD(IFNULL(MAX(CAST(path AS UNSIGNED)), 0) + 1, 4, '0'), + '风采墙', + 'Style Wall', + 'menu', + '', + '', + 'ti-medall', + 1, + 0, + 'spread', + NULL, + 992, + 1, + '', + UNIX_TIMESTAMP(NOW()) * 1000, + '', + UNIX_TIMESTAMP(NOW()) * 1000, + 0, + 'PC', + NULL, + NULL, + 'f', + 0, + 0 +FROM sys_menu +WHERE (parentId = '' OR parentId IS NULL) + AND CHAR_LENGTH(path) = 4 +HAVING NOT EXISTS (SELECT 1 FROM (SELECT id FROM sys_menu WHERE permission = 'spread') t); + +INSERT INTO sys_menu (id, parentId, path, name, aliasName, type, href, target, icon, showit, disabled, permission, note, location, hasChildren, createdBy, createdAt, updatedBy, updatedAt, delFlag, platform, moduleId, picIcon, initialPinyinName, isRecommendApp, isRecommendService) +SELECT '9f5c0200000000000000000000000002', p.id, CONCAT(p.path, '0001'), '风采展示', 'Style Display', 'menu', '/platform/spread/display', 'data-pjax', '', 1, 0, 'spread.display', NULL, 1, 0, '', UNIX_TIMESTAMP(NOW()) * 1000, '', UNIX_TIMESTAMP(NOW()) * 1000, 0, 'PC', NULL, NULL, 'f', 0, 0 +FROM sys_menu p +WHERE p.permission = 'spread' + AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM sys_menu WHERE permission = 'spread.display') t); + +INSERT INTO sys_menu (id, parentId, path, name, aliasName, type, href, target, icon, showit, disabled, permission, note, location, hasChildren, createdBy, createdAt, updatedBy, updatedAt, delFlag, platform, moduleId, picIcon, initialPinyinName, isRecommendApp, isRecommendService) +SELECT '9f5c0200000000000000000000000003', p.id, CONCAT(p.path, '0002'), '内容发布', 'Content Creation', 'menu', '/platform/spread/creation', 'data-pjax', '', 1, 0, 'spread.creation', NULL, 2, 0, '', UNIX_TIMESTAMP(NOW()) * 1000, '', UNIX_TIMESTAMP(NOW()) * 1000, 0, 'PC', NULL, NULL, 'n', 0, 0 +FROM sys_menu p +WHERE p.permission = 'spread' + AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM sys_menu WHERE permission = 'spread.creation') t); + +INSERT INTO sys_menu (id, parentId, path, name, aliasName, type, href, target, icon, showit, disabled, permission, note, location, hasChildren, createdBy, createdAt, updatedBy, updatedAt, delFlag, platform, moduleId, picIcon, initialPinyinName, isRecommendApp, isRecommendService) +SELECT '9f5c0200000000000000000000000004', p.id, CONCAT(p.path, '0003'), '内容管理', 'Content Manage', 'menu', '/platform/spread/manage', 'data-pjax', '', 1, 0, 'spread.manage', NULL, 3, 0, '', UNIX_TIMESTAMP(NOW()) * 1000, '', UNIX_TIMESTAMP(NOW()) * 1000, 0, 'PC', NULL, NULL, 'n', 0, 0 +FROM sys_menu p +WHERE p.permission = 'spread' + AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM sys_menu WHERE permission = 'spread.manage') t); + +INSERT INTO sys_menu (id, parentId, path, name, aliasName, type, href, target, icon, showit, disabled, permission, note, location, hasChildren, createdBy, createdAt, updatedBy, updatedAt, delFlag, platform, moduleId, picIcon, initialPinyinName, isRecommendApp, isRecommendService) +SELECT '9f5c0200000000000000000000000005', p.id, CONCAT(p.path, '0004'), '栏目管理', 'Category Manage', 'menu', '/platform/spread/category', 'data-pjax', '', 1, 0, 'spread.category', NULL, 4, 0, '', UNIX_TIMESTAMP(NOW()) * 1000, '', UNIX_TIMESTAMP(NOW()) * 1000, 0, 'PC', NULL, NULL, 'l', 0, 0 +FROM sys_menu p +WHERE p.permission = 'spread' + AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM sys_menu WHERE permission = 'spread.category') t); + +INSERT INTO sys_menu (id, parentId, path, name, aliasName, type, href, target, icon, showit, disabled, permission, note, location, hasChildren, createdBy, createdAt, updatedBy, updatedAt, delFlag, platform, moduleId, picIcon, initialPinyinName, isRecommendApp, isRecommendService) +SELECT '9f5c0200000000000000000000000006', p.id, CONCAT(p.path, '0005'), '统计分析', 'Statistics', 'menu', '/platform/spread/statistics', 'data-pjax', '', 1, 0, 'spread.statistics', NULL, 5, 0, '', UNIX_TIMESTAMP(NOW()) * 1000, '', UNIX_TIMESTAMP(NOW()) * 1000, 0, 'PC', NULL, NULL, 't', 0, 0 +FROM sys_menu p +WHERE p.permission = 'spread' + AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM sys_menu WHERE permission = 'spread.statistics') t); + +-- 系统管理员默认拥有风采墙全部权限,其他角色可在角色管理中按需分配。 +INSERT INTO sys_role_menu (roleId, menuId) +SELECT r.id, m.id +FROM sys_role r +JOIN sys_menu m ON m.permission IN ( + 'spread', + 'spread.display', + 'spread.creation', + 'spread.manage', + 'spread.category', + 'spread.statistics' +) +LEFT JOIN sys_role_menu rm ON rm.roleId = r.id AND rm.menuId = m.id +WHERE r.code = 'SYSADMIN' + AND rm.roleId IS NULL; diff --git a/src/main/resources/db/menu/update_sys_menu_pic_icons_flat_skeuomorphic_blue_minio.sql b/src/main/resources/db/menu/update_sys_menu_pic_icons_flat_skeuomorphic_blue_minio.sql new file mode 100644 index 00000000..59121404 --- /dev/null +++ b/src/main/resources/db/menu/update_sys_menu_pic_icons_flat_skeuomorphic_blue_minio.sql @@ -0,0 +1,479 @@ +-- 工会系统H5全新扁平拟物化菜单图标MinIO文件记录及菜单图标更新脚本 +-- 图标对象目录: menu-icons/v5-flat-skeuomorphic-blue/ +SET NAMES utf8mb4; +START TRANSACTION; + +INSERT INTO `sys_file` (`id`, `engine`, `bucket`, `name`, `suffix`, `sizeKb`, `sizeInfo`, `objName`, `storagePath`, `downloadPath`, `thumbnail`, `extJson`, `createdBy`, `createdAt`, `updatedBy`, `updatedAt`, `delFlag`) VALUES +('d4239ab512e02e319bde38b07d4776a0', 'MINIO', 'cug', '001_教代会管理_2e6f3930.png', 'png', '37', '36.8 kB', 'd4239ab512e02e319bde38b07d4776a0.png', '/menu-icons/v5-flat-skeuomorphic-blue/d4239ab512e02e319bde38b07d4776a0.png', '/platform/sys/file/download?id=d4239ab512e02e319bde38b07d4776a0', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('50988a1ded823d35c0d854afb2692b57', 'MINIO', 'cug', '002_子女信息管理_64ace209.png', 'png', '41', '40.8 kB', '50988a1ded823d35c0d854afb2692b57.png', '/menu-icons/v5-flat-skeuomorphic-blue/50988a1ded823d35c0d854afb2692b57.png', '/platform/sys/file/download?id=50988a1ded823d35c0d854afb2692b57', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('8a67dd727502fecf8855e4e913cf8e1e', 'MINIO', 'cug', '003_信息填写_eb18aa57.png', 'png', '39', '39.1 kB', '8a67dd727502fecf8855e4e913cf8e1e.png', '/menu-icons/v5-flat-skeuomorphic-blue/8a67dd727502fecf8855e4e913cf8e1e.png', '/platform/sys/file/download?id=8a67dd727502fecf8855e4e913cf8e1e', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('59955c44f86d8d0f45fd8f3e0d614612', 'MINIO', 'cug', '004_我的子女_835cb68e.png', 'png', '39', '38.8 kB', '59955c44f86d8d0f45fd8f3e0d614612.png', '/menu-icons/v5-flat-skeuomorphic-blue/59955c44f86d8d0f45fd8f3e0d614612.png', '/platform/sys/file/download?id=59955c44f86d8d0f45fd8f3e0d614612', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('d2f23637ecfd8f39cb46c25876223eeb', 'MINIO', 'cug', '005_信息管理_10ebaa5b.png', 'png', '39', '38.6 kB', 'd2f23637ecfd8f39cb46c25876223eeb.png', '/menu-icons/v5-flat-skeuomorphic-blue/d2f23637ecfd8f39cb46c25876223eeb.png', '/platform/sys/file/download?id=d2f23637ecfd8f39cb46c25876223eeb', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('9a7df21c6bd1f87d9eda769f00b40d89', 'MINIO', 'cug', '006_子女入学_e7cf2f56.png', 'png', '48', '48.2 kB', '9a7df21c6bd1f87d9eda769f00b40d89.png', '/menu-icons/v5-flat-skeuomorphic-blue/9a7df21c6bd1f87d9eda769f00b40d89.png', '/platform/sys/file/download?id=9a7df21c6bd1f87d9eda769f00b40d89', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('b41ca4fa2c2462254bb6d7efffc285a4', 'MINIO', 'cug', '007_入学申报_40a293cc.png', 'png', '39', '39.5 kB', 'b41ca4fa2c2462254bb6d7efffc285a4.png', '/menu-icons/v5-flat-skeuomorphic-blue/b41ca4fa2c2462254bb6d7efffc285a4.png', '/platform/sys/file/download?id=b41ca4fa2c2462254bb6d7efffc285a4', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('3b0245e70916a36073e0fef16f2e1f32', 'MINIO', 'cug', '008_我的申报_2666d0ae.png', 'png', '34', '33.5 kB', '3b0245e70916a36073e0fef16f2e1f32.png', '/menu-icons/v5-flat-skeuomorphic-blue/3b0245e70916a36073e0fef16f2e1f32.png', '/platform/sys/file/download?id=3b0245e70916a36073e0fef16f2e1f32', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('202d0ae8211611a6947ff7caecbe7e2b', 'MINIO', 'cug', '009_分工会审核_ea574347.png', 'png', '40', '39.5 kB', '202d0ae8211611a6947ff7caecbe7e2b.png', '/menu-icons/v5-flat-skeuomorphic-blue/202d0ae8211611a6947ff7caecbe7e2b.png', '/platform/sys/file/download?id=202d0ae8211611a6947ff7caecbe7e2b', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('4e2070b1c0908d460dbf67f01818d29c', 'MINIO', 'cug', '010_校工会审核_9441d18c.png', 'png', '40', '39.7 kB', '4e2070b1c0908d460dbf67f01818d29c.png', '/menu-icons/v5-flat-skeuomorphic-blue/4e2070b1c0908d460dbf67f01818d29c.png', '/platform/sys/file/download?id=4e2070b1c0908d460dbf67f01818d29c', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('7b10699834f961eda7a12df20a6e1ce7', 'MINIO', 'cug', '011_教代会_44a59a2b.png', 'png', '39', '39.3 kB', '7b10699834f961eda7a12df20a6e1ce7.png', '/menu-icons/v5-flat-skeuomorphic-blue/7b10699834f961eda7a12df20a6e1ce7.png', '/platform/sys/file/download?id=7b10699834f961eda7a12df20a6e1ce7', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('662b152a6a5d2b7b694a4076cdd218e3', 'MINIO', 'cug', '012_代表阅览_1c2aee7d.png', 'png', '45', '45.0 kB', '662b152a6a5d2b7b694a4076cdd218e3.png', '/menu-icons/v5-flat-skeuomorphic-blue/662b152a6a5d2b7b694a4076cdd218e3.png', '/platform/sys/file/download?id=662b152a6a5d2b7b694a4076cdd218e3', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('39325d6ef536fa6413c6a9e2edb98425', 'MINIO', 'cug', '013_提案管理_11db6856.png', 'png', '41', '41.1 kB', '39325d6ef536fa6413c6a9e2edb98425.png', '/menu-icons/v5-flat-skeuomorphic-blue/39325d6ef536fa6413c6a9e2edb98425.png', '/platform/sys/file/download?id=39325d6ef536fa6413c6a9e2edb98425', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('4084d4436cbfa13f84a9dca9177ce6ab', 'MINIO', 'cug', '014_撰写提案_d5d7964e.png', 'png', '41', '40.8 kB', '4084d4436cbfa13f84a9dca9177ce6ab.png', '/menu-icons/v5-flat-skeuomorphic-blue/4084d4436cbfa13f84a9dca9177ce6ab.png', '/platform/sys/file/download?id=4084d4436cbfa13f84a9dca9177ce6ab', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('7339d3c16569a5c925794378a300fa9e', 'MINIO', 'cug', '015_我的提案_c4411525.png', 'png', '41', '41.2 kB', '7339d3c16569a5c925794378a300fa9e.png', '/menu-icons/v5-flat-skeuomorphic-blue/7339d3c16569a5c925794378a300fa9e.png', '/platform/sys/file/download?id=7339d3c16569a5c925794378a300fa9e', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('99eca55c6eea6eb0451aeb4fdcdd0942', 'MINIO', 'cug', '016_提案附议_eb4ed857.png', 'png', '47', '46.7 kB', '99eca55c6eea6eb0451aeb4fdcdd0942.png', '/menu-icons/v5-flat-skeuomorphic-blue/99eca55c6eea6eb0451aeb4fdcdd0942.png', '/platform/sys/file/download?id=99eca55c6eea6eb0451aeb4fdcdd0942', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('0532afa3620e20113505b03755959ee0', 'MINIO', 'cug', '017_团长审核_c4b99724.png', 'png', '40', '39.7 kB', '0532afa3620e20113505b03755959ee0.png', '/menu-icons/v5-flat-skeuomorphic-blue/0532afa3620e20113505b03755959ee0.png', '/platform/sys/file/download?id=0532afa3620e20113505b03755959ee0', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('3d7c1a8b6778409f063cfd5197649d99', 'MINIO', 'cug', '018_承办单位答复_56835d07.png', 'png', '40', '40.3 kB', '3d7c1a8b6778409f063cfd5197649d99.png', '/menu-icons/v5-flat-skeuomorphic-blue/3d7c1a8b6778409f063cfd5197649d99.png', '/platform/sys/file/download?id=3d7c1a8b6778409f063cfd5197649d99', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('7cd72e99031df0c21431ad64d0ac72a8', 'MINIO', 'cug', '019_分管校领导审批_304278a0.png', 'png', '40', '40.2 kB', '7cd72e99031df0c21431ad64d0ac72a8.png', '/menu-icons/v5-flat-skeuomorphic-blue/7cd72e99031df0c21431ad64d0ac72a8.png', '/platform/sys/file/download?id=7cd72e99031df0c21431ad64d0ac72a8', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('d2a477739ecf817c425e3113d66b0a01', 'MINIO', 'cug', '020_反馈评价_2b9b7227.png', 'png', '40', '40.2 kB', 'd2a477739ecf817c425e3113d66b0a01.png', '/menu-icons/v5-flat-skeuomorphic-blue/d2a477739ecf817c425e3113d66b0a01.png', '/platform/sys/file/download?id=d2a477739ecf817c425e3113d66b0a01', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('d608ed7f50b2fda7c9228372ba8012b0', 'MINIO', 'cug', '021_提案管理_ff182281.png', 'png', '41', '41.1 kB', 'd608ed7f50b2fda7c9228372ba8012b0.png', '/menu-icons/v5-flat-skeuomorphic-blue/d608ed7f50b2fda7c9228372ba8012b0.png', '/platform/sys/file/download?id=d608ed7f50b2fda7c9228372ba8012b0', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('2b16431101b09760db12387a3714d3c6', 'MINIO', 'cug', '022_承办单位意见_7c79171d.png', 'png', '40', '40.3 kB', '2b16431101b09760db12387a3714d3c6.png', '/menu-icons/v5-flat-skeuomorphic-blue/2b16431101b09760db12387a3714d3c6.png', '/platform/sys/file/download?id=2b16431101b09760db12387a3714d3c6', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('e0d5aa775264eae8d49114a8f3bf82e9', 'MINIO', 'cug', '023_费用报销管理_32a51579.png', 'png', '39', '39.0 kB', 'e0d5aa775264eae8d49114a8f3bf82e9.png', '/menu-icons/v5-flat-skeuomorphic-blue/e0d5aa775264eae8d49114a8f3bf82e9.png', '/platform/sys/file/download?id=e0d5aa775264eae8d49114a8f3bf82e9', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('1fda43541284c86b8d5f406ee5ebf1e0', 'MINIO', 'cug', '024_报销申请_6bdef282.png', 'png', '45', '44.8 kB', '1fda43541284c86b8d5f406ee5ebf1e0.png', '/menu-icons/v5-flat-skeuomorphic-blue/1fda43541284c86b8d5f406ee5ebf1e0.png', '/platform/sys/file/download?id=1fda43541284c86b8d5f406ee5ebf1e0', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('f9b7a26ef993a9808b09c67f73d2d296', 'MINIO', 'cug', '025_撰写提案_eeaf3366.png', 'png', '41', '40.8 kB', 'f9b7a26ef993a9808b09c67f73d2d296.png', '/menu-icons/v5-flat-skeuomorphic-blue/f9b7a26ef993a9808b09c67f73d2d296.png', '/platform/sys/file/download?id=f9b7a26ef993a9808b09c67f73d2d296', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('b83956a3a3162f17513333e8dfe91f49', 'MINIO', 'cug', '026_我的申请_b27178ff.png', 'png', '42', '41.8 kB', 'b83956a3a3162f17513333e8dfe91f49.png', '/menu-icons/v5-flat-skeuomorphic-blue/b83956a3a3162f17513333e8dfe91f49.png', '/platform/sys/file/download?id=b83956a3a3162f17513333e8dfe91f49', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('969f3bc275bbd917b3e3444752d9de38', 'MINIO', 'cug', '027_社团审核_87611b6d.png', 'png', '39', '39.5 kB', '969f3bc275bbd917b3e3444752d9de38.png', '/menu-icons/v5-flat-skeuomorphic-blue/969f3bc275bbd917b3e3444752d9de38.png', '/platform/sys/file/download?id=969f3bc275bbd917b3e3444752d9de38', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('d54945a79bce326c126a17ffa7dedd86', 'MINIO', 'cug', '028_社团分管主席审核_d0ee5ab9.png', 'png', '39', '38.7 kB', 'd54945a79bce326c126a17ffa7dedd86.png', '/menu-icons/v5-flat-skeuomorphic-blue/d54945a79bce326c126a17ffa7dedd86.png', '/platform/sys/file/download?id=d54945a79bce326c126a17ffa7dedd86', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('012f4e24cb99feeae830b9e5956f730a', 'MINIO', 'cug', '029_分工会审核_af963d19.png', 'png', '40', '39.5 kB', '012f4e24cb99feeae830b9e5956f730a.png', '/menu-icons/v5-flat-skeuomorphic-blue/012f4e24cb99feeae830b9e5956f730a.png', '/platform/sys/file/download?id=012f4e24cb99feeae830b9e5956f730a', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('71f1a5bdd53422a302d50565ed6d8ca7', 'MINIO', 'cug', '030_校工会出纳审核_f7a890c7.png', 'png', '40', '39.9 kB', '71f1a5bdd53422a302d50565ed6d8ca7.png', '/menu-icons/v5-flat-skeuomorphic-blue/71f1a5bdd53422a302d50565ed6d8ca7.png', '/platform/sys/file/download?id=71f1a5bdd53422a302d50565ed6d8ca7', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('01ac13ee1b86635f406704686b2826cb', 'MINIO', 'cug', '031_校工会会计审核_41410dbe.png', 'png', '40', '40.0 kB', '01ac13ee1b86635f406704686b2826cb.png', '/menu-icons/v5-flat-skeuomorphic-blue/01ac13ee1b86635f406704686b2826cb.png', '/platform/sys/file/download?id=01ac13ee1b86635f406704686b2826cb', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('ff390faffeed11c872ff43c268fc42c8', 'MINIO', 'cug', '032_校工会主席终审_5e0c5335.png', 'png', '40', '39.6 kB', 'ff390faffeed11c872ff43c268fc42c8.png', '/menu-icons/v5-flat-skeuomorphic-blue/ff390faffeed11c872ff43c268fc42c8.png', '/platform/sys/file/download?id=ff390faffeed11c872ff43c268fc42c8', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('b077d67b5add801672329f19deedef51', 'MINIO', 'cug', '033_社团组织管理_b8bcaa94.png', 'png', '54', '54.2 kB', 'b077d67b5add801672329f19deedef51.png', '/menu-icons/v5-flat-skeuomorphic-blue/b077d67b5add801672329f19deedef51.png', '/platform/sys/file/download?id=b077d67b5add801672329f19deedef51', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('0784cad3fc2147bafafc22cdb00b32b8', 'MINIO', 'cug', '034_社团入会_7af124e1.png', 'png', '44', '43.6 kB', '0784cad3fc2147bafafc22cdb00b32b8.png', '/menu-icons/v5-flat-skeuomorphic-blue/0784cad3fc2147bafafc22cdb00b32b8.png', '/platform/sys/file/download?id=0784cad3fc2147bafafc22cdb00b32b8', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('ca4ddf8871ab60754812c61781e3820a', 'MINIO', 'cug', '035_我的申请_2de433e4.png', 'png', '42', '41.8 kB', 'ca4ddf8871ab60754812c61781e3820a.png', '/menu-icons/v5-flat-skeuomorphic-blue/ca4ddf8871ab60754812c61781e3820a.png', '/platform/sys/file/download?id=ca4ddf8871ab60754812c61781e3820a', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('92251f17382d770a99d6399a9245fed2', 'MINIO', 'cug', '036_社团审核_84064805.png', 'png', '39', '39.5 kB', '92251f17382d770a99d6399a9245fed2.png', '/menu-icons/v5-flat-skeuomorphic-blue/92251f17382d770a99d6399a9245fed2.png', '/platform/sys/file/download?id=92251f17382d770a99d6399a9245fed2', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('9b5bf30597169d4b597ec15c64746589', 'MINIO', 'cug', '037_校工会审核_dbd21f6b.png', 'png', '40', '39.7 kB', '9b5bf30597169d4b597ec15c64746589.png', '/menu-icons/v5-flat-skeuomorphic-blue/9b5bf30597169d4b597ec15c64746589.png', '/platform/sys/file/download?id=9b5bf30597169d4b597ec15c64746589', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('bff0da0374934156eaf7008420281877', 'MINIO', 'cug', '038_我的社团_e585d2ca.png', 'png', '55', '54.9 kB', 'bff0da0374934156eaf7008420281877.png', '/menu-icons/v5-flat-skeuomorphic-blue/bff0da0374934156eaf7008420281877.png', '/platform/sys/file/download?id=bff0da0374934156eaf7008420281877', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('9ff5f7ccbf1584cc09c8b0b0b547907b', 'MINIO', 'cug', '039_会员管理_7e2b850c.png', 'png', '37', '37.2 kB', '9ff5f7ccbf1584cc09c8b0b0b547907b.png', '/menu-icons/v5-flat-skeuomorphic-blue/9ff5f7ccbf1584cc09c8b0b0b547907b.png', '/platform/sys/file/download?id=9ff5f7ccbf1584cc09c8b0b0b547907b', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('fe79030ce09863147010927ef79d4804', 'MINIO', 'cug', '040_会员入会_8f27ac9f.png', 'png', '45', '44.7 kB', 'fe79030ce09863147010927ef79d4804.png', '/menu-icons/v5-flat-skeuomorphic-blue/fe79030ce09863147010927ef79d4804.png', '/platform/sys/file/download?id=fe79030ce09863147010927ef79d4804', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('46ca54df1bb66aaec8d89be47ed888d9', 'MINIO', 'cug', '041_我的入会_313842fc.png', 'png', '49', '49.4 kB', '46ca54df1bb66aaec8d89be47ed888d9.png', '/menu-icons/v5-flat-skeuomorphic-blue/46ca54df1bb66aaec8d89be47ed888d9.png', '/platform/sys/file/download?id=46ca54df1bb66aaec8d89be47ed888d9', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('7650a2a028223ae8380c946d96551b56', 'MINIO', 'cug', '042_分工会审核_dcf6c190.png', 'png', '40', '39.5 kB', '7650a2a028223ae8380c946d96551b56.png', '/menu-icons/v5-flat-skeuomorphic-blue/7650a2a028223ae8380c946d96551b56.png', '/platform/sys/file/download?id=7650a2a028223ae8380c946d96551b56', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('128a3ca23138c341b259ef88521818c8', 'MINIO', 'cug', '043_校工会审核_13d50644.png', 'png', '40', '39.7 kB', '128a3ca23138c341b259ef88521818c8.png', '/menu-icons/v5-flat-skeuomorphic-blue/128a3ca23138c341b259ef88521818c8.png', '/platform/sys/file/download?id=128a3ca23138c341b259ef88521818c8', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('111f52a632d37ba3029d768a70e59426', 'MINIO', 'cug', '044_会员档案_c547be26.png', 'png', '35', '34.5 kB', '111f52a632d37ba3029d768a70e59426.png', '/menu-icons/v5-flat-skeuomorphic-blue/111f52a632d37ba3029d768a70e59426.png', '/platform/sys/file/download?id=111f52a632d37ba3029d768a70e59426', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('a5b94ab758eb078c51a68bd8b74d0b63', 'MINIO', 'cug', '045_数据看板_f3ae0a07.png', 'png', '42', '42.1 kB', 'a5b94ab758eb078c51a68bd8b74d0b63.png', '/menu-icons/v5-flat-skeuomorphic-blue/a5b94ab758eb078c51a68bd8b74d0b63.png', '/platform/sys/file/download?id=a5b94ab758eb078c51a68bd8b74d0b63', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('f56d0ebb12e367095873a4a2bafa362e', 'MINIO', 'cug', '046_工会小组审核_00448f69.png', 'png', '39', '39.1 kB', 'f56d0ebb12e367095873a4a2bafa362e.png', '/menu-icons/v5-flat-skeuomorphic-blue/f56d0ebb12e367095873a4a2bafa362e.png', '/platform/sys/file/download?id=f56d0ebb12e367095873a4a2bafa362e', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('e85273b4715e551e7a0be1e4c237e9db', 'MINIO', 'cug', '047_职工慰问_024811fd.png', 'png', '41', '41.3 kB', 'e85273b4715e551e7a0be1e4c237e9db.png', '/menu-icons/v5-flat-skeuomorphic-blue/e85273b4715e551e7a0be1e4c237e9db.png', '/platform/sys/file/download?id=e85273b4715e551e7a0be1e4c237e9db', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('e7d21d8058319281fc750720196338b3', 'MINIO', 'cug', '048_慰问申请_9bfd257e.png', 'png', '33', '33.0 kB', 'e7d21d8058319281fc750720196338b3.png', '/menu-icons/v5-flat-skeuomorphic-blue/e7d21d8058319281fc750720196338b3.png', '/platform/sys/file/download?id=e7d21d8058319281fc750720196338b3', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('e229c7c88be79c83cbb204273e1e837a', 'MINIO', 'cug', '049_我的申请_7492992b.png', 'png', '42', '41.8 kB', 'e229c7c88be79c83cbb204273e1e837a.png', '/menu-icons/v5-flat-skeuomorphic-blue/e229c7c88be79c83cbb204273e1e837a.png', '/platform/sys/file/download?id=e229c7c88be79c83cbb204273e1e837a', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('64e9baf4931fd5414ca105cbe6771346', 'MINIO', 'cug', '050_分工会审核_330e42e0.png', 'png', '40', '39.5 kB', '64e9baf4931fd5414ca105cbe6771346.png', '/menu-icons/v5-flat-skeuomorphic-blue/64e9baf4931fd5414ca105cbe6771346.png', '/platform/sys/file/download?id=64e9baf4931fd5414ca105cbe6771346', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('dfe30264324d45f30e36a5209c7a3b67', 'MINIO', 'cug', '051_校工会预审_87a2dcfa.png', 'png', '40', '39.7 kB', 'dfe30264324d45f30e36a5209c7a3b67.png', '/menu-icons/v5-flat-skeuomorphic-blue/dfe30264324d45f30e36a5209c7a3b67.png', '/platform/sys/file/download?id=dfe30264324d45f30e36a5209c7a3b67', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('d2095854e67dcf28dea1a4a975e90aba', 'MINIO', 'cug', '052_校工会审核_c269f94a.png', 'png', '40', '39.7 kB', 'd2095854e67dcf28dea1a4a975e90aba.png', '/menu-icons/v5-flat-skeuomorphic-blue/d2095854e67dcf28dea1a4a975e90aba.png', '/platform/sys/file/download?id=d2095854e67dcf28dea1a4a975e90aba', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('5c823bf5486ec8ae26e3233b0fe7f493', 'MINIO', 'cug', '053_困难帮扶_6ddda191.png', 'png', '40', '39.8 kB', '5c823bf5486ec8ae26e3233b0fe7f493.png', '/menu-icons/v5-flat-skeuomorphic-blue/5c823bf5486ec8ae26e3233b0fe7f493.png', '/platform/sys/file/download?id=5c823bf5486ec8ae26e3233b0fe7f493', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('14ee697a9f479076eb3a113aaa025bcb', 'MINIO', 'cug', '054_帮扶申请_3cf7ee61.png', 'png', '39', '39.4 kB', '14ee697a9f479076eb3a113aaa025bcb.png', '/menu-icons/v5-flat-skeuomorphic-blue/14ee697a9f479076eb3a113aaa025bcb.png', '/platform/sys/file/download?id=14ee697a9f479076eb3a113aaa025bcb', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('4dee1a7937ccbffde68a358d05179e10', 'MINIO', 'cug', '055_帮扶申请记录_51b21e97.png', 'png', '40', '39.9 kB', '4dee1a7937ccbffde68a358d05179e10.png', '/menu-icons/v5-flat-skeuomorphic-blue/4dee1a7937ccbffde68a358d05179e10.png', '/platform/sys/file/download?id=4dee1a7937ccbffde68a358d05179e10', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('8e867f31615a067757139cb0f37a2c3a', 'MINIO', 'cug', '056_分工会审核_23d30124.png', 'png', '40', '39.5 kB', '8e867f31615a067757139cb0f37a2c3a.png', '/menu-icons/v5-flat-skeuomorphic-blue/8e867f31615a067757139cb0f37a2c3a.png', '/platform/sys/file/download?id=8e867f31615a067757139cb0f37a2c3a', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('0cc926265e46a20bd7750bd23ef64ea7', 'MINIO', 'cug', '057_二级党组织审核_d736e4d7.png', 'png', '40', '39.9 kB', '0cc926265e46a20bd7750bd23ef64ea7.png', '/menu-icons/v5-flat-skeuomorphic-blue/0cc926265e46a20bd7750bd23ef64ea7.png', '/platform/sys/file/download?id=0cc926265e46a20bd7750bd23ef64ea7', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('b20526ea21e6d034a1335123e4db2440', 'MINIO', 'cug', '058_校工会审核_35a9239d.png', 'png', '40', '39.7 kB', 'b20526ea21e6d034a1335123e4db2440.png', '/menu-icons/v5-flat-skeuomorphic-blue/b20526ea21e6d034a1335123e4db2440.png', '/platform/sys/file/download?id=b20526ea21e6d034a1335123e4db2440', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('a4bc152d86f817fa2cf87ee142996d48', 'MINIO', 'cug', '059_体检管理_d4cab4ba.png', 'png', '48', '47.7 kB', 'a4bc152d86f817fa2cf87ee142996d48.png', '/menu-icons/v5-flat-skeuomorphic-blue/a4bc152d86f817fa2cf87ee142996d48.png', '/platform/sys/file/download?id=a4bc152d86f817fa2cf87ee142996d48', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('febd687b512a37aa151284d0d6249a9c', 'MINIO', 'cug', '060_体检项目_0a2bfc85.png', 'png', '52', '51.8 kB', 'febd687b512a37aa151284d0d6249a9c.png', '/menu-icons/v5-flat-skeuomorphic-blue/febd687b512a37aa151284d0d6249a9c.png', '/platform/sys/file/download?id=febd687b512a37aa151284d0d6249a9c', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('414f0d597613854fb20d316c9471b32e', 'MINIO', 'cug', '061_我的体检_c03fbf17.png', 'png', '50', '50.0 kB', '414f0d597613854fb20d316c9471b32e.png', '/menu-icons/v5-flat-skeuomorphic-blue/414f0d597613854fb20d316c9471b32e.png', '/platform/sys/file/download?id=414f0d597613854fb20d316c9471b32e', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('5b82cabae27a69bb71daa26cbc010965', 'MINIO', 'cug', '062_心理咨询_56620c51.png', 'png', '38', '38.5 kB', '5b82cabae27a69bb71daa26cbc010965.png', '/menu-icons/v5-flat-skeuomorphic-blue/5b82cabae27a69bb71daa26cbc010965.png', '/platform/sys/file/download?id=5b82cabae27a69bb71daa26cbc010965', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('5e63cc5c28e869fdae9d7209e0e34316', 'MINIO', 'cug', '063_我要预约_ef46a587.png', 'png', '43', '43.2 kB', '5e63cc5c28e869fdae9d7209e0e34316.png', '/menu-icons/v5-flat-skeuomorphic-blue/5e63cc5c28e869fdae9d7209e0e34316.png', '/platform/sys/file/download?id=5e63cc5c28e869fdae9d7209e0e34316', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('1e663ad85c938f9dc3591306efa12ef2', 'MINIO', 'cug', '064_预约记录_c6a2ec8d.png', 'png', '43', '42.5 kB', '1e663ad85c938f9dc3591306efa12ef2.png', '/menu-icons/v5-flat-skeuomorphic-blue/1e663ad85c938f9dc3591306efa12ef2.png', '/platform/sys/file/download?id=1e663ad85c938f9dc3591306efa12ef2', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('50ed9525a58d1f55a53dc58aa2dffc1d', 'MINIO', 'cug', '065_发帖咨询_7b21d468.png', 'png', '43', '42.8 kB', '50ed9525a58d1f55a53dc58aa2dffc1d.png', '/menu-icons/v5-flat-skeuomorphic-blue/50ed9525a58d1f55a53dc58aa2dffc1d.png', '/platform/sys/file/download?id=50ed9525a58d1f55a53dc58aa2dffc1d', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('04528f30323c0f89065ea88bfa5e1767', 'MINIO', 'cug', '066_咨询回复_43f06636.png', 'png', '40', '40.3 kB', '04528f30323c0f89065ea88bfa5e1767.png', '/menu-icons/v5-flat-skeuomorphic-blue/04528f30323c0f89065ea88bfa5e1767.png', '/platform/sys/file/download?id=04528f30323c0f89065ea88bfa5e1767', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('835a6cb3de7045d78f7eb9dda0f3ba24', 'MINIO', 'cug', '067_基层双代会_b6c224df.png', 'png', '45', '44.5 kB', '835a6cb3de7045d78f7eb9dda0f3ba24.png', '/menu-icons/v5-flat-skeuomorphic-blue/835a6cb3de7045d78f7eb9dda0f3ba24.png', '/platform/sys/file/download?id=835a6cb3de7045d78f7eb9dda0f3ba24', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('7fcea2eb85b32c7e08fe2d7838cf9f74', 'MINIO', 'cug', '068_法律援助_297400c8.png', 'png', '55', '54.9 kB', '7fcea2eb85b32c7e08fe2d7838cf9f74.png', '/menu-icons/v5-flat-skeuomorphic-blue/7fcea2eb85b32c7e08fe2d7838cf9f74.png', '/platform/sys/file/download?id=7fcea2eb85b32c7e08fe2d7838cf9f74', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('b5afef9259f3abae7b1bbb1d05b2fe5c', 'MINIO', 'cug', '069_我要预约_aa0ffd36.png', 'png', '43', '43.2 kB', 'b5afef9259f3abae7b1bbb1d05b2fe5c.png', '/menu-icons/v5-flat-skeuomorphic-blue/b5afef9259f3abae7b1bbb1d05b2fe5c.png', '/platform/sys/file/download?id=b5afef9259f3abae7b1bbb1d05b2fe5c', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('3fc3d984a41e9225e1f7710280fdac19', 'MINIO', 'cug', '070_预约记录_7dc21dca.png', 'png', '43', '42.5 kB', '3fc3d984a41e9225e1f7710280fdac19.png', '/menu-icons/v5-flat-skeuomorphic-blue/3fc3d984a41e9225e1f7710280fdac19.png', '/platform/sys/file/download?id=3fc3d984a41e9225e1f7710280fdac19', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('47fe77b9ff74053f555c339157e5e497', 'MINIO', 'cug', '071_发帖咨询_939595b4.png', 'png', '43', '42.8 kB', '47fe77b9ff74053f555c339157e5e497.png', '/menu-icons/v5-flat-skeuomorphic-blue/47fe77b9ff74053f555c339157e5e497.png', '/platform/sys/file/download?id=47fe77b9ff74053f555c339157e5e497', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('d45efe5411e254dc940f6e10f7c8f383', 'MINIO', 'cug', '072_咨询回复_d073c1d8.png', 'png', '40', '40.3 kB', 'd45efe5411e254dc940f6e10f7c8f383.png', '/menu-icons/v5-flat-skeuomorphic-blue/d45efe5411e254dc940f6e10f7c8f383.png', '/platform/sys/file/download?id=d45efe5411e254dc940f6e10f7c8f383', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('d964d19857c59f3e5dd282620f1a213e', 'MINIO', 'cug', '073_基金会员_3f88a4f6.png', 'png', '41', '41.4 kB', 'd964d19857c59f3e5dd282620f1a213e.png', '/menu-icons/v5-flat-skeuomorphic-blue/d964d19857c59f3e5dd282620f1a213e.png', '/platform/sys/file/download?id=d964d19857c59f3e5dd282620f1a213e', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('141fc4d6a9168b862aa5918726d0924a', 'MINIO', 'cug', '074_会员申请_8a77d32c.png', 'png', '39', '39.1 kB', '141fc4d6a9168b862aa5918726d0924a.png', '/menu-icons/v5-flat-skeuomorphic-blue/141fc4d6a9168b862aa5918726d0924a.png', '/platform/sys/file/download?id=141fc4d6a9168b862aa5918726d0924a', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('185b9668345c1775c8b34642f6108872', 'MINIO', 'cug', '075_我的申请_44423a17.png', 'png', '42', '41.8 kB', '185b9668345c1775c8b34642f6108872.png', '/menu-icons/v5-flat-skeuomorphic-blue/185b9668345c1775c8b34642f6108872.png', '/platform/sys/file/download?id=185b9668345c1775c8b34642f6108872', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('ce06d45189f54739dc25a391b6c2fe85', 'MINIO', 'cug', '076_分工会审核_3e102653.png', 'png', '40', '39.5 kB', 'ce06d45189f54739dc25a391b6c2fe85.png', '/menu-icons/v5-flat-skeuomorphic-blue/ce06d45189f54739dc25a391b6c2fe85.png', '/platform/sys/file/download?id=ce06d45189f54739dc25a391b6c2fe85', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('0738309559b2647c5ef8b38ed8f39080', 'MINIO', 'cug', '077_会员管理_ac2516a6.png', 'png', '37', '37.2 kB', '0738309559b2647c5ef8b38ed8f39080.png', '/menu-icons/v5-flat-skeuomorphic-blue/0738309559b2647c5ef8b38ed8f39080.png', '/platform/sys/file/download?id=0738309559b2647c5ef8b38ed8f39080', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('0f2717dd006be9e5db67442377679f91', 'MINIO', 'cug', '078_数据看板_59d6ba7c.png', 'png', '42', '42.1 kB', '0f2717dd006be9e5db67442377679f91.png', '/menu-icons/v5-flat-skeuomorphic-blue/0f2717dd006be9e5db67442377679f91.png', '/platform/sys/file/download?id=0f2717dd006be9e5db67442377679f91', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('91e5dc12db888366c17e61c9121ff69c', 'MINIO', 'cug', '079_互管会审核_6b5adca7.png', 'png', '39', '39.5 kB', '91e5dc12db888366c17e61c9121ff69c.png', '/menu-icons/v5-flat-skeuomorphic-blue/91e5dc12db888366c17e61c9121ff69c.png', '/platform/sys/file/download?id=91e5dc12db888366c17e61c9121ff69c', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('81ac98687f68e252042807a459a988df', 'MINIO', 'cug', '080_离退休审核_57566021.png', 'png', '40', '40.0 kB', '81ac98687f68e252042807a459a988df.png', '/menu-icons/v5-flat-skeuomorphic-blue/81ac98687f68e252042807a459a988df.png', '/platform/sys/file/download?id=81ac98687f68e252042807a459a988df', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('7a61acfc8a2896f36ca0f140a8c00f93', 'MINIO', 'cug', '081_会员入会_1375120f.png', 'png', '45', '44.7 kB', '7a61acfc8a2896f36ca0f140a8c00f93.png', '/menu-icons/v5-flat-skeuomorphic-blue/7a61acfc8a2896f36ca0f140a8c00f93.png', '/platform/sys/file/download?id=7a61acfc8a2896f36ca0f140a8c00f93', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('24565ab537cc29fdc1f8398d57cba2c9', 'MINIO', 'cug', '082_会务管理_2c61ac06.png', 'png', '42', '41.8 kB', '24565ab537cc29fdc1f8398d57cba2c9.png', '/menu-icons/v5-flat-skeuomorphic-blue/24565ab537cc29fdc1f8398d57cba2c9.png', '/platform/sys/file/download?id=24565ab537cc29fdc1f8398d57cba2c9', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('024f728cf7476458d372d9c13bd9f937', 'MINIO', 'cug', '083_体育活动_893016b4.png', 'png', '60', '59.9 kB', '024f728cf7476458d372d9c13bd9f937.png', '/menu-icons/v5-flat-skeuomorphic-blue/024f728cf7476458d372d9c13bd9f937.png', '/platform/sys/file/download?id=024f728cf7476458d372d9c13bd9f937', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('08e92fd1ea7f5e1d6c3f0ff4ae9650f8', 'MINIO', 'cug', '084_活动报名_dbaba7b3.png', 'png', '35', '35.2 kB', '08e92fd1ea7f5e1d6c3f0ff4ae9650f8.png', '/menu-icons/v5-flat-skeuomorphic-blue/08e92fd1ea7f5e1d6c3f0ff4ae9650f8.png', '/platform/sys/file/download?id=08e92fd1ea7f5e1d6c3f0ff4ae9650f8', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('8060ce47970cadcf7dc3bd41c0ed20d9', 'MINIO', 'cug', '085_文化活动_898f95af.png', 'png', '63', '62.5 kB', '8060ce47970cadcf7dc3bd41c0ed20d9.png', '/menu-icons/v5-flat-skeuomorphic-blue/8060ce47970cadcf7dc3bd41c0ed20d9.png', '/platform/sys/file/download?id=8060ce47970cadcf7dc3bd41c0ed20d9', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('ddd9c5c2fb28db177956a849ff2352df', 'MINIO', 'cug', '086_品牌活动_fb16e44e.png', 'png', '47', '47.3 kB', 'ddd9c5c2fb28db177956a849ff2352df.png', '/menu-icons/v5-flat-skeuomorphic-blue/ddd9c5c2fb28db177956a849ff2352df.png', '/platform/sys/file/download?id=ddd9c5c2fb28db177956a849ff2352df', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('da2e93c2a9491893ebd5d166f47bc545', 'MINIO', 'cug', '087_活动报名_42d1b0cc.png', 'png', '35', '35.2 kB', 'da2e93c2a9491893ebd5d166f47bc545.png', '/menu-icons/v5-flat-skeuomorphic-blue/da2e93c2a9491893ebd5d166f47bc545.png', '/platform/sys/file/download?id=da2e93c2a9491893ebd5d166f47bc545', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('bcb91e996ad91fc133ce2432203556bf', 'MINIO', 'cug', '088_我的活动_811cf28c.png', 'png', '41', '40.6 kB', 'bcb91e996ad91fc133ce2432203556bf.png', '/menu-icons/v5-flat-skeuomorphic-blue/bcb91e996ad91fc133ce2432203556bf.png', '/platform/sys/file/download?id=bcb91e996ad91fc133ce2432203556bf', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('0467db4198d856e2180f89796c1ad62e', 'MINIO', 'cug', '089_惠民服务_57accf35.png', 'png', '46', '46.1 kB', '0467db4198d856e2180f89796c1ad62e.png', '/menu-icons/v5-flat-skeuomorphic-blue/0467db4198d856e2180f89796c1ad62e.png', '/platform/sys/file/download?id=0467db4198d856e2180f89796c1ad62e', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('f27149a8370b2e9e0849ca9028d6cb66', 'MINIO', 'cug', '090_我的惠民_05f829da.png', 'png', '41', '40.6 kB', 'f27149a8370b2e9e0849ca9028d6cb66.png', '/menu-icons/v5-flat-skeuomorphic-blue/f27149a8370b2e9e0849ca9028d6cb66.png', '/platform/sys/file/download?id=f27149a8370b2e9e0849ca9028d6cb66', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('1d9097f1ddf8ea04323327354a010ae9', 'MINIO', 'cug', '091_理论学习_a8966b0e.png', 'png', '36', '36.5 kB', '1d9097f1ddf8ea04323327354a010ae9.png', '/menu-icons/v5-flat-skeuomorphic-blue/1d9097f1ddf8ea04323327354a010ae9.png', '/platform/sys/file/download?id=1d9097f1ddf8ea04323327354a010ae9', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('be4c7a2b027046b129bed6a27049d841', 'MINIO', 'cug', '092_课程列表_893a216d.png', 'png', '39', '39.5 kB', 'be4c7a2b027046b129bed6a27049d841.png', '/menu-icons/v5-flat-skeuomorphic-blue/be4c7a2b027046b129bed6a27049d841.png', '/platform/sys/file/download?id=be4c7a2b027046b129bed6a27049d841', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('07e12bf38d38c4ab75dd01b46ae03963', 'MINIO', 'cug', '093_慈善捐助_0c4ccaec.png', 'png', '33', '33.0 kB', '07e12bf38d38c4ab75dd01b46ae03963.png', '/menu-icons/v5-flat-skeuomorphic-blue/07e12bf38d38c4ab75dd01b46ae03963.png', '/platform/sys/file/download?id=07e12bf38d38c4ab75dd01b46ae03963', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('e93b9ec54bd39a242c9c81067eb64b61', 'MINIO', 'cug', '094_慈善捐助_a112c7db.png', 'png', '33', '33.0 kB', 'e93b9ec54bd39a242c9c81067eb64b61.png', '/menu-icons/v5-flat-skeuomorphic-blue/e93b9ec54bd39a242c9c81067eb64b61.png', '/platform/sys/file/download?id=e93b9ec54bd39a242c9c81067eb64b61', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('e61bb788e312c599a4f1d4c583ec56e9', 'MINIO', 'cug', '095_我的捐助_23883f9a.png', 'png', '39', '38.6 kB', 'e61bb788e312c599a4f1d4c583ec56e9.png', '/menu-icons/v5-flat-skeuomorphic-blue/e61bb788e312c599a4f1d4c583ec56e9.png', '/platform/sys/file/download?id=e61bb788e312c599a4f1d4c583ec56e9', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('dd8b8a073342b416ff6f46cec3d1a6cf', 'MINIO', 'cug', '096_生育休假_e5851cdf.png', 'png', '38', '38.2 kB', 'dd8b8a073342b416ff6f46cec3d1a6cf.png', '/menu-icons/v5-flat-skeuomorphic-blue/dd8b8a073342b416ff6f46cec3d1a6cf.png', '/platform/sys/file/download?id=dd8b8a073342b416ff6f46cec3d1a6cf', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('d4d985afcccd436885d1cdf4b9c0c956', 'MINIO', 'cug', '097_休假申请_abfbd5db.png', 'png', '41', '40.5 kB', 'd4d985afcccd436885d1cdf4b9c0c956.png', '/menu-icons/v5-flat-skeuomorphic-blue/d4d985afcccd436885d1cdf4b9c0c956.png', '/platform/sys/file/download?id=d4d985afcccd436885d1cdf4b9c0c956', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('30a17bd43525a7d8b7f73648253b2353', 'MINIO', 'cug', '098_我的申请_99252619.png', 'png', '42', '41.8 kB', '30a17bd43525a7d8b7f73648253b2353.png', '/menu-icons/v5-flat-skeuomorphic-blue/30a17bd43525a7d8b7f73648253b2353.png', '/platform/sys/file/download?id=30a17bd43525a7d8b7f73648253b2353', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('0e9014e6360d1953ddd1fe0121f09d02', 'MINIO', 'cug', '099_分工会审核_6a548614.png', 'png', '40', '39.5 kB', '0e9014e6360d1953ddd1fe0121f09d02.png', '/menu-icons/v5-flat-skeuomorphic-blue/0e9014e6360d1953ddd1fe0121f09d02.png', '/platform/sys/file/download?id=0e9014e6360d1953ddd1fe0121f09d02', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('90320751d0f5de5ddc71974b0259f468', 'MINIO', 'cug', '100_校工会审核_4a764f7d.png', 'png', '40', '39.7 kB', '90320751d0f5de5ddc71974b0259f468.png', '/menu-icons/v5-flat-skeuomorphic-blue/90320751d0f5de5ddc71974b0259f468.png', '/platform/sys/file/download?id=90320751d0f5de5ddc71974b0259f468', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('c31947c4e4f9f0064f1a987bbdae3548', 'MINIO', 'cug', '101_查询统计_c13558b0.png', 'png', '48', '47.9 kB', 'c31947c4e4f9f0064f1a987bbdae3548.png', '/menu-icons/v5-flat-skeuomorphic-blue/c31947c4e4f9f0064f1a987bbdae3548.png', '/platform/sys/file/download?id=c31947c4e4f9f0064f1a987bbdae3548', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('b3ca619e943008ec66c87ff3ea54caf0', 'MINIO', 'cug', '102_独生子女父母退休_f808e1e1.png', 'png', '47', '47.2 kB', 'b3ca619e943008ec66c87ff3ea54caf0.png', '/menu-icons/v5-flat-skeuomorphic-blue/b3ca619e943008ec66c87ff3ea54caf0.png', '/platform/sys/file/download?id=b3ca619e943008ec66c87ff3ea54caf0', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('30052dd19f6e69faa6a546e3692f4477', 'MINIO', 'cug', '103_独生子女父母退休申请_6c3fcd1a.png', 'png', '41', '40.6 kB', '30052dd19f6e69faa6a546e3692f4477.png', '/menu-icons/v5-flat-skeuomorphic-blue/30052dd19f6e69faa6a546e3692f4477.png', '/platform/sys/file/download?id=30052dd19f6e69faa6a546e3692f4477', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('786d70bd8e118fbae8efebbb8df64762', 'MINIO', 'cug', '104_我的申请_16388b3d.png', 'png', '42', '41.8 kB', '786d70bd8e118fbae8efebbb8df64762.png', '/menu-icons/v5-flat-skeuomorphic-blue/786d70bd8e118fbae8efebbb8df64762.png', '/platform/sys/file/download?id=786d70bd8e118fbae8efebbb8df64762', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('375d5bf016d1183211557873fcd5de57', 'MINIO', 'cug', '105_分工会审核_dc276392.png', 'png', '40', '39.5 kB', '375d5bf016d1183211557873fcd5de57.png', '/menu-icons/v5-flat-skeuomorphic-blue/375d5bf016d1183211557873fcd5de57.png', '/platform/sys/file/download?id=375d5bf016d1183211557873fcd5de57', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('8e50b6ef905bec105c038826fd1e1dd6', 'MINIO', 'cug', '106_校工会审核_50bf62d0.png', 'png', '40', '39.7 kB', '8e50b6ef905bec105c038826fd1e1dd6.png', '/menu-icons/v5-flat-skeuomorphic-blue/8e50b6ef905bec105c038826fd1e1dd6.png', '/platform/sys/file/download?id=8e50b6ef905bec105c038826fd1e1dd6', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('1dfe6590295b676e1a6f2796b4c93d70', 'MINIO', 'cug', '107_查询统计_05f308a2.png', 'png', '48', '47.9 kB', '1dfe6590295b676e1a6f2796b4c93d70.png', '/menu-icons/v5-flat-skeuomorphic-blue/1dfe6590295b676e1a6f2796b4c93d70.png', '/platform/sys/file/download?id=1dfe6590295b676e1a6f2796b4c93d70', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('a9df7e58e16784a38f33e7de7f841462', 'MINIO', 'cug', '108_工会报销_d54c4078.png', 'png', '45', '45.5 kB', 'a9df7e58e16784a38f33e7de7f841462.png', '/menu-icons/v5-flat-skeuomorphic-blue/a9df7e58e16784a38f33e7de7f841462.png', '/platform/sys/file/download?id=a9df7e58e16784a38f33e7de7f841462', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('e71f6cdfab618af4e1f579c12acf7da4', 'MINIO', 'cug', '109_报销申请_e04f9463.png', 'png', '45', '44.8 kB', 'e71f6cdfab618af4e1f579c12acf7da4.png', '/menu-icons/v5-flat-skeuomorphic-blue/e71f6cdfab618af4e1f579c12acf7da4.png', '/platform/sys/file/download?id=e71f6cdfab618af4e1f579c12acf7da4', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('e6ea330dc1f4a9ecc13b79e0070af510', 'MINIO', 'cug', '110_我的报销_5a994c0f.png', 'png', '37', '37.4 kB', 'e6ea330dc1f4a9ecc13b79e0070af510.png', '/menu-icons/v5-flat-skeuomorphic-blue/e6ea330dc1f4a9ecc13b79e0070af510.png', '/platform/sys/file/download?id=e6ea330dc1f4a9ecc13b79e0070af510', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('d81c6cf64003517afbca47bdb083e355', 'MINIO', 'cug', '111_单身教工管理_bfd9983c.png', 'png', '36', '36.3 kB', 'd81c6cf64003517afbca47bdb083e355.png', '/menu-icons/v5-flat-skeuomorphic-blue/d81c6cf64003517afbca47bdb083e355.png', '/platform/sys/file/download?id=d81c6cf64003517afbca47bdb083e355', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('80542cb6b1b00e417e7257fe3c11f333', 'MINIO', 'cug', '112_报销审核_d1abc76f.png', 'png', '40', '39.9 kB', '80542cb6b1b00e417e7257fe3c11f333.png', '/menu-icons/v5-flat-skeuomorphic-blue/80542cb6b1b00e417e7257fe3c11f333.png', '/platform/sys/file/download?id=80542cb6b1b00e417e7257fe3c11f333', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('04ddef4f8d79b825bc19774d9137e835', 'MINIO', 'cug', '113_报销汇总_0d6c8aac.png', 'png', '39', '39.1 kB', '04ddef4f8d79b825bc19774d9137e835.png', '/menu-icons/v5-flat-skeuomorphic-blue/04ddef4f8d79b825bc19774d9137e835.png', '/platform/sys/file/download?id=04ddef4f8d79b825bc19774d9137e835', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('d3ec6bccb26ff4c9fb79232e5f02ef17', 'MINIO', 'cug', '114_问卷调查_17c32edb.png', 'png', '40', '40.1 kB', 'd3ec6bccb26ff4c9fb79232e5f02ef17.png', '/menu-icons/v5-flat-skeuomorphic-blue/d3ec6bccb26ff4c9fb79232e5f02ef17.png', '/platform/sys/file/download?id=d3ec6bccb26ff4c9fb79232e5f02ef17', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('aa1a120e2814b4928c50dc8d8ed64c10', 'MINIO', 'cug', '115_其他人员管理_62b1effb.png', 'png', '40', '39.8 kB', 'aa1a120e2814b4928c50dc8d8ed64c10.png', '/menu-icons/v5-flat-skeuomorphic-blue/aa1a120e2814b4928c50dc8d8ed64c10.png', '/platform/sys/file/download?id=aa1a120e2814b4928c50dc8d8ed64c10', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('72d78f2e581b4774d683c6247ba8ba82', 'MINIO', 'cug', '116_场地预约old_ed6f15a0.png', 'png', '59', '59.0 kB', '72d78f2e581b4774d683c6247ba8ba82.png', '/menu-icons/v5-flat-skeuomorphic-blue/72d78f2e581b4774d683c6247ba8ba82.png', '/platform/sys/file/download?id=72d78f2e581b4774d683c6247ba8ba82', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('0b35ac8df36d0307cccd3a7abead9bbd', 'MINIO', 'cug', '117_场地预约_3f09df78.png', 'png', '58', '58.0 kB', '0b35ac8df36d0307cccd3a7abead9bbd.png', '/menu-icons/v5-flat-skeuomorphic-blue/0b35ac8df36d0307cccd3a7abead9bbd.png', '/platform/sys/file/download?id=0b35ac8df36d0307cccd3a7abead9bbd', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('f0752418a1fa85076043d8b30a8162a9', 'MINIO', 'cug', '118_人员变更记录_70b4f9a1.png', 'png', '37', '36.8 kB', 'f0752418a1fa85076043d8b30a8162a9.png', '/menu-icons/v5-flat-skeuomorphic-blue/f0752418a1fa85076043d8b30a8162a9.png', '/platform/sys/file/download?id=f0752418a1fa85076043d8b30a8162a9', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('b445e5fbe073d6fec6821bfa2d00d0ad', 'MINIO', 'cug', '119_我的预约_8f752c50.png', 'png', '41', '41.3 kB', 'b445e5fbe073d6fec6821bfa2d00d0ad.png', '/menu-icons/v5-flat-skeuomorphic-blue/b445e5fbe073d6fec6821bfa2d00d0ad.png', '/platform/sys/file/download?id=b445e5fbe073d6fec6821bfa2d00d0ad', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('c099744c28258127c82c9d90a506280a', 'MINIO', 'cug', '120_30教龄教职工管理_22847e55.png', 'png', '54', '54.3 kB', 'c099744c28258127c82c9d90a506280a.png', '/menu-icons/v5-flat-skeuomorphic-blue/c099744c28258127c82c9d90a506280a.png', '/platform/sys/file/download?id=c099744c28258127c82c9d90a506280a', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('9b293ef36ad342406317aa5ddb25de1e', 'MINIO', 'cug', '121_校工会审核_ef93e3b9.png', 'png', '40', '39.7 kB', '9b293ef36ad342406317aa5ddb25de1e.png', '/menu-icons/v5-flat-skeuomorphic-blue/9b293ef36ad342406317aa5ddb25de1e.png', '/platform/sys/file/download?id=9b293ef36ad342406317aa5ddb25de1e', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('80167705b15e822ef298da8bf0e6238c', 'MINIO', 'cug', '122_职工福利_d34fa735.png', 'png', '42', '42.3 kB', '80167705b15e822ef298da8bf0e6238c.png', '/menu-icons/v5-flat-skeuomorphic-blue/80167705b15e822ef298da8bf0e6238c.png', '/platform/sys/file/download?id=80167705b15e822ef298da8bf0e6238c', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('9c9ed841146ead12774e305127c70655', 'MINIO', 'cug', '123_选择福利_94b69599.png', 'png', '42', '42.4 kB', '9c9ed841146ead12774e305127c70655.png', '/menu-icons/v5-flat-skeuomorphic-blue/9c9ed841146ead12774e305127c70655.png', '/platform/sys/file/download?id=9c9ed841146ead12774e305127c70655', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('c15e09dd7448821d331443c415818e00', 'MINIO', 'cug', '124_收货地址_15156ec9.png', 'png', '49', '49.1 kB', 'c15e09dd7448821d331443c415818e00.png', '/menu-icons/v5-flat-skeuomorphic-blue/c15e09dd7448821d331443c415818e00.png', '/platform/sys/file/download?id=c15e09dd7448821d331443c415818e00', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('7663b86e0083ccec5451e4ad753e323a', 'MINIO', 'cug', '125_职工慰问_3b49290f.png', 'png', '41', '41.3 kB', '7663b86e0083ccec5451e4ad753e323a.png', '/menu-icons/v5-flat-skeuomorphic-blue/7663b86e0083ccec5451e4ad753e323a.png', '/platform/sys/file/download?id=7663b86e0083ccec5451e4ad753e323a', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('dc3a4487ca0708d62662e7f03aa031fa', 'MINIO', 'cug', '126_慰问申请_5e024c74.png', 'png', '33', '33.0 kB', 'dc3a4487ca0708d62662e7f03aa031fa.png', '/menu-icons/v5-flat-skeuomorphic-blue/dc3a4487ca0708d62662e7f03aa031fa.png', '/platform/sys/file/download?id=dc3a4487ca0708d62662e7f03aa031fa', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('215f19af8b2ba2773c07e8f804541697', 'MINIO', 'cug', '127_我的福利_c08d8543.png', 'png', '42', '41.8 kB', '215f19af8b2ba2773c07e8f804541697.png', '/menu-icons/v5-flat-skeuomorphic-blue/215f19af8b2ba2773c07e8f804541697.png', '/platform/sys/file/download?id=215f19af8b2ba2773c07e8f804541697', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('f487372d9c3c26c8cea86040602436b7', 'MINIO', 'cug', '128_建言献策_261dd7f7.png', 'png', '39', '39.2 kB', 'f487372d9c3c26c8cea86040602436b7.png', '/menu-icons/v5-flat-skeuomorphic-blue/f487372d9c3c26c8cea86040602436b7.png', '/platform/sys/file/download?id=f487372d9c3c26c8cea86040602436b7', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('5d35429b46c062cc376896db6abffed9', 'MINIO', 'cug', '129_填写申请_9e0070b7.png', 'png', '42', '41.8 kB', '5d35429b46c062cc376896db6abffed9.png', '/menu-icons/v5-flat-skeuomorphic-blue/5d35429b46c062cc376896db6abffed9.png', '/platform/sys/file/download?id=5d35429b46c062cc376896db6abffed9', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('82fd6812dc635f7ea8221cedbc680d3c', 'MINIO', 'cug', '130_我的申请_360f1c3f.png', 'png', '42', '41.8 kB', '82fd6812dc635f7ea8221cedbc680d3c.png', '/menu-icons/v5-flat-skeuomorphic-blue/82fd6812dc635f7ea8221cedbc680d3c.png', '/platform/sys/file/download?id=82fd6812dc635f7ea8221cedbc680d3c', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('5e12d18fabe9153c13a11bdee1131a54', 'MINIO', 'cug', '131_校工会审核_a9d5ff11.png', 'png', '40', '39.7 kB', '5e12d18fabe9153c13a11bdee1131a54.png', '/menu-icons/v5-flat-skeuomorphic-blue/5e12d18fabe9153c13a11bdee1131a54.png', '/platform/sys/file/download?id=5e12d18fabe9153c13a11bdee1131a54', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('b8175cc96b7b6a5a785820997ce6ed05', 'MINIO', 'cug', '132_查询统计_5f2c0218.png', 'png', '48', '47.9 kB', 'b8175cc96b7b6a5a785820997ce6ed05.png', '/menu-icons/v5-flat-skeuomorphic-blue/b8175cc96b7b6a5a785820997ce6ed05.png', '/platform/sys/file/download?id=b8175cc96b7b6a5a785820997ce6ed05', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('9104a4f38f453f420cf456abf10bc5f8', 'MINIO', 'cug', '133_作品征集_10ecb801.png', 'png', '45', '45.4 kB', '9104a4f38f453f420cf456abf10bc5f8.png', '/menu-icons/v5-flat-skeuomorphic-blue/9104a4f38f453f420cf456abf10bc5f8.png', '/platform/sys/file/download?id=9104a4f38f453f420cf456abf10bc5f8', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('0654d117a3fb0fe061064096744bc6b0', 'MINIO', 'cug', '134_作品上传_5ae60a2c.png', 'png', '41', '40.7 kB', '0654d117a3fb0fe061064096744bc6b0.png', '/menu-icons/v5-flat-skeuomorphic-blue/0654d117a3fb0fe061064096744bc6b0.png', '/platform/sys/file/download?id=0654d117a3fb0fe061064096744bc6b0', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('d5dd0484ed5b8baa66d75d3ada43e955', 'MINIO', 'cug', '135_困难帮扶_ca437578.png', 'png', '40', '39.8 kB', 'd5dd0484ed5b8baa66d75d3ada43e955.png', '/menu-icons/v5-flat-skeuomorphic-blue/d5dd0484ed5b8baa66d75d3ada43e955.png', '/platform/sys/file/download?id=d5dd0484ed5b8baa66d75d3ada43e955', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('8517a2b51288572a7616218682da26cc', 'MINIO', 'cug', '136_我的作品_b0febdbf.png', 'png', '41', '41.0 kB', '8517a2b51288572a7616218682da26cc.png', '/menu-icons/v5-flat-skeuomorphic-blue/8517a2b51288572a7616218682da26cc.png', '/platform/sys/file/download?id=8517a2b51288572a7616218682da26cc', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('7307bab899c6747ad89a0b351c2e306e', 'MINIO', 'cug', '137_困难帮扶申请_d11cf9fe.png', 'png', '38', '37.9 kB', '7307bab899c6747ad89a0b351c2e306e.png', '/menu-icons/v5-flat-skeuomorphic-blue/7307bab899c6747ad89a0b351c2e306e.png', '/platform/sys/file/download?id=7307bab899c6747ad89a0b351c2e306e', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('458502126d65e18c89bf84e1242a0e6c', 'MINIO', 'cug', '138_作品阅览_04fd4ddf.png', 'png', '42', '42.0 kB', '458502126d65e18c89bf84e1242a0e6c.png', '/menu-icons/v5-flat-skeuomorphic-blue/458502126d65e18c89bf84e1242a0e6c.png', '/platform/sys/file/download?id=458502126d65e18c89bf84e1242a0e6c', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('605b72241fa221e989eda7c14bb41373', 'MINIO', 'cug', '139_会议选座_0c08a2e7.png', 'png', '61', '61.4 kB', '605b72241fa221e989eda7c14bb41373.png', '/menu-icons/v5-flat-skeuomorphic-blue/605b72241fa221e989eda7c14bb41373.png', '/platform/sys/file/download?id=605b72241fa221e989eda7c14bb41373', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('b905d8fd3e85338117038ff726278f3d', 'MINIO', 'cug', '140_亲子活动_871f822c.png', 'png', '39', '38.6 kB', 'b905d8fd3e85338117038ff726278f3d.png', '/menu-icons/v5-flat-skeuomorphic-blue/b905d8fd3e85338117038ff726278f3d.png', '/platform/sys/file/download?id=b905d8fd3e85338117038ff726278f3d', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('64c7b517599ba0099ce7a853e85738b2', 'MINIO', 'cug', '141_活动报名_612a4fa1.png', 'png', '35', '35.2 kB', '64c7b517599ba0099ce7a853e85738b2.png', '/menu-icons/v5-flat-skeuomorphic-blue/64c7b517599ba0099ce7a853e85738b2.png', '/platform/sys/file/download?id=64c7b517599ba0099ce7a853e85738b2', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('161ee1a6787b0aba72f46ab181e4ab53', 'MINIO', 'cug', '142_心理咨询_c8d0855a.png', 'png', '38', '38.5 kB', '161ee1a6787b0aba72f46ab181e4ab53.png', '/menu-icons/v5-flat-skeuomorphic-blue/161ee1a6787b0aba72f46ab181e4ab53.png', '/platform/sys/file/download?id=161ee1a6787b0aba72f46ab181e4ab53', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('7cad7841948398a495bd6d535ec35baf', 'MINIO', 'cug', '143_我的报名_c0ba4f08.png', 'png', '36', '36.4 kB', '7cad7841948398a495bd6d535ec35baf.png', '/menu-icons/v5-flat-skeuomorphic-blue/7cad7841948398a495bd6d535ec35baf.png', '/platform/sys/file/download?id=7cad7841948398a495bd6d535ec35baf', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('780975e27c40decf02a0ad9a58406b48', 'MINIO', 'cug', '144_法律援助_f148c76e.png', 'png', '55', '54.9 kB', '780975e27c40decf02a0ad9a58406b48.png', '/menu-icons/v5-flat-skeuomorphic-blue/780975e27c40decf02a0ad9a58406b48.png', '/platform/sys/file/download?id=780975e27c40decf02a0ad9a58406b48', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('7d9b1dbd86a892b96268f5cc0458093a', 'MINIO', 'cug', '145_医疗补助系统_b0cc1987.png', 'png', '43', '42.5 kB', '7d9b1dbd86a892b96268f5cc0458093a.png', '/menu-icons/v5-flat-skeuomorphic-blue/7d9b1dbd86a892b96268f5cc0458093a.png', '/platform/sys/file/download?id=7d9b1dbd86a892b96268f5cc0458093a', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('4bfe67d3bce0536922b83aaf998ff8bf', 'MINIO', 'cug', '146_职工福利_ca9e5652.png', 'png', '42', '42.3 kB', '4bfe67d3bce0536922b83aaf998ff8bf.png', '/menu-icons/v5-flat-skeuomorphic-blue/4bfe67d3bce0536922b83aaf998ff8bf.png', '/platform/sys/file/download?id=4bfe67d3bce0536922b83aaf998ff8bf', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('653f431f3f68e5529e7c746648ee3f17', 'MINIO', 'cug', '147_职工福利_093e1e29.png', 'png', '42', '42.3 kB', '653f431f3f68e5529e7c746648ee3f17.png', '/menu-icons/v5-flat-skeuomorphic-blue/653f431f3f68e5529e7c746648ee3f17.png', '/platform/sys/file/download?id=653f431f3f68e5529e7c746648ee3f17', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('69b7a9902bb48a6e668bd9207f3ad900', 'MINIO', 'cug', '148_福利选择_519c8f5a.png', 'png', '48', '47.7 kB', '69b7a9902bb48a6e668bd9207f3ad900.png', '/menu-icons/v5-flat-skeuomorphic-blue/69b7a9902bb48a6e668bd9207f3ad900.png', '/platform/sys/file/download?id=69b7a9902bb48a6e668bd9207f3ad900', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('e549fd7fa363215d798460f1ad7b9542', 'MINIO', 'cug', '149_福利日常核对_73df1dda.png', 'png', '40', '39.8 kB', 'e549fd7fa363215d798460f1ad7b9542.png', '/menu-icons/v5-flat-skeuomorphic-blue/e549fd7fa363215d798460f1ad7b9542.png', '/platform/sys/file/download?id=e549fd7fa363215d798460f1ad7b9542', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('0d0f799d5d6e7635020d5345c78a64ae', 'MINIO', 'cug', '150_体检管理_cf47b9d6.png', 'png', '48', '47.7 kB', '0d0f799d5d6e7635020d5345c78a64ae.png', '/menu-icons/v5-flat-skeuomorphic-blue/0d0f799d5d6e7635020d5345c78a64ae.png', '/platform/sys/file/download?id=0d0f799d5d6e7635020d5345c78a64ae', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('e574d0f9924e2d12d1c3d214f0a59761', 'MINIO', 'cug', '151_体育活动管理_e08ff179.png', 'png', '63', '63.2 kB', 'e574d0f9924e2d12d1c3d214f0a59761.png', '/menu-icons/v5-flat-skeuomorphic-blue/e574d0f9924e2d12d1c3d214f0a59761.png', '/platform/sys/file/download?id=e574d0f9924e2d12d1c3d214f0a59761', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('fca1fa026b15d8e7106271ce4ca7e5ef', 'MINIO', 'cug', '152_体育活动报名_69280dbb.png', 'png', '45', '45.2 kB', 'fca1fa026b15d8e7106271ce4ca7e5ef.png', '/menu-icons/v5-flat-skeuomorphic-blue/fca1fa026b15d8e7106271ce4ca7e5ef.png', '/platform/sys/file/download?id=fca1fa026b15d8e7106271ce4ca7e5ef', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('72e88557e860fe349597c9100a4029a7', 'MINIO', 'cug', '153_品牌活动_0868f8b6.png', 'png', '47', '47.3 kB', '72e88557e860fe349597c9100a4029a7.png', '/menu-icons/v5-flat-skeuomorphic-blue/72e88557e860fe349597c9100a4029a7.png', '/platform/sys/file/download?id=72e88557e860fe349597c9100a4029a7', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('350e456eb0b9c091519e1733ff69cda1', 'MINIO', 'cug', '154_品牌活动报名_c97ad132.png', 'png', '41', '40.8 kB', '350e456eb0b9c091519e1733ff69cda1.png', '/menu-icons/v5-flat-skeuomorphic-blue/350e456eb0b9c091519e1733ff69cda1.png', '/platform/sys/file/download?id=350e456eb0b9c091519e1733ff69cda1', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('7866849789d36e812e6eb0cffe8e75aa', 'MINIO', 'cug', '155_校工会文化活动_788400d0.png', 'png', '53', '53.3 kB', '7866849789d36e812e6eb0cffe8e75aa.png', '/menu-icons/v5-flat-skeuomorphic-blue/7866849789d36e812e6eb0cffe8e75aa.png', '/platform/sys/file/download?id=7866849789d36e812e6eb0cffe8e75aa', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('f7f2b1cc448c75bb410d8ce4b0d75d4f', 'MINIO', 'cug', '156_校文化活动报名_c1709519.png', 'png', '44', '43.9 kB', 'f7f2b1cc448c75bb410d8ce4b0d75d4f.png', '/menu-icons/v5-flat-skeuomorphic-blue/f7f2b1cc448c75bb410d8ce4b0d75d4f.png', '/platform/sys/file/download?id=f7f2b1cc448c75bb410d8ce4b0d75d4f', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('aaa4b2b3fcc9daf1154dbcf878209b70', 'MINIO', 'cug', '157_分工会文化活动_b759a93a.png', 'png', '51', '50.6 kB', 'aaa4b2b3fcc9daf1154dbcf878209b70.png', '/menu-icons/v5-flat-skeuomorphic-blue/aaa4b2b3fcc9daf1154dbcf878209b70.png', '/platform/sys/file/download?id=aaa4b2b3fcc9daf1154dbcf878209b70', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('447d5fedecfd3e3121854954142cebf4', 'MINIO', 'cug', '158_作品征集_91d79e0f.png', 'png', '45', '45.4 kB', '447d5fedecfd3e3121854954142cebf4.png', '/menu-icons/v5-flat-skeuomorphic-blue/447d5fedecfd3e3121854954142cebf4.png', '/platform/sys/file/download?id=447d5fedecfd3e3121854954142cebf4', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('1d9e13caf37aa95665f63ad4e545e0a6', 'MINIO', 'cug', '159_亲子活动_737e57a3.png', 'png', '39', '38.6 kB', '1d9e13caf37aa95665f63ad4e545e0a6.png', '/menu-icons/v5-flat-skeuomorphic-blue/1d9e13caf37aa95665f63ad4e545e0a6.png', '/platform/sys/file/download?id=1d9e13caf37aa95665f63ad4e545e0a6', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('398cfe57b1c727a434cd7c690d721217', 'MINIO', 'cug', '160_教工健身走_33e81fa0.png', 'png', '48', '47.7 kB', '398cfe57b1c727a434cd7c690d721217.png', '/menu-icons/v5-flat-skeuomorphic-blue/398cfe57b1c727a434cd7c690d721217.png', '/platform/sys/file/download?id=398cfe57b1c727a434cd7c690d721217', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('184782319d588117534eda54be0ca540', 'MINIO', 'cug', '161_活动基础管理_77c8af32.png', 'png', '46', '45.5 kB', '184782319d588117534eda54be0ca540.png', '/menu-icons/v5-flat-skeuomorphic-blue/184782319d588117534eda54be0ca540.png', '/platform/sys/file/download?id=184782319d588117534eda54be0ca540', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('ba437ff0da2e7759d35c2afddb15f698', 'MINIO', 'cug', '162_工会报销_1f917af2.png', 'png', '45', '45.5 kB', 'ba437ff0da2e7759d35c2afddb15f698.png', '/menu-icons/v5-flat-skeuomorphic-blue/ba437ff0da2e7759d35c2afddb15f698.png', '/platform/sys/file/download?id=ba437ff0da2e7759d35c2afddb15f698', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('7fb287d723da5ea7adab9f4426d02a59', 'MINIO', 'cug', '163_报销申请_d6132ff0.png', 'png', '45', '44.8 kB', '7fb287d723da5ea7adab9f4426d02a59.png', '/menu-icons/v5-flat-skeuomorphic-blue/7fb287d723da5ea7adab9f4426d02a59.png', '/platform/sys/file/download?id=7fb287d723da5ea7adab9f4426d02a59', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('38427f0f41908eb51ad8842aed240242', 'MINIO', 'cug', '164_问卷服务_1c643efa.png', 'png', '39', '39.0 kB', '38427f0f41908eb51ad8842aed240242.png', '/menu-icons/v5-flat-skeuomorphic-blue/38427f0f41908eb51ad8842aed240242.png', '/platform/sys/file/download?id=38427f0f41908eb51ad8842aed240242', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('e7fc89824875e92c475e6fd3704ea9f1', 'MINIO', 'cug', '165_场地预约(old)_e9e46237.png', 'png', '51', '51.0 kB', 'e7fc89824875e92c475e6fd3704ea9f1.png', '/menu-icons/v5-flat-skeuomorphic-blue/e7fc89824875e92c475e6fd3704ea9f1.png', '/platform/sys/file/download?id=e7fc89824875e92c475e6fd3704ea9f1', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('cd64e36bf08bb4a2c1f3fd8c38e90fec', 'MINIO', 'cug', '166_场地预约_82356ff2.png', 'png', '58', '58.0 kB', 'cd64e36bf08bb4a2c1f3fd8c38e90fec.png', '/menu-icons/v5-flat-skeuomorphic-blue/cd64e36bf08bb4a2c1f3fd8c38e90fec.png', '/platform/sys/file/download?id=cd64e36bf08bb4a2c1f3fd8c38e90fec', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('ae2d6d77ea2ba8922d37ab6c88429008', 'MINIO', 'cug', '167_消息中心_40266809.png', 'png', '36', '36.2 kB', 'ae2d6d77ea2ba8922d37ab6c88429008.png', '/menu-icons/v5-flat-skeuomorphic-blue/ae2d6d77ea2ba8922d37ab6c88429008.png', '/platform/sys/file/download?id=ae2d6d77ea2ba8922d37ab6c88429008', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('a6357c304caae142f552f268e5966d57', 'MINIO', 'cug', '168_工会大数据_09abd6b8.png', 'png', '54', '53.6 kB', 'a6357c304caae142f552f268e5966d57.png', '/menu-icons/v5-flat-skeuomorphic-blue/a6357c304caae142f552f268e5966d57.png', '/platform/sys/file/download?id=a6357c304caae142f552f268e5966d57', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('b7f8ca64b4ca70ee14aa3e9bd0649e47', 'MINIO', 'cug', '169_年度预算申报_396309f2.png', 'png', '39', '38.9 kB', 'b7f8ca64b4ca70ee14aa3e9bd0649e47.png', '/menu-icons/v5-flat-skeuomorphic-blue/b7f8ca64b4ca70ee14aa3e9bd0649e47.png', '/platform/sys/file/download?id=b7f8ca64b4ca70ee14aa3e9bd0649e47', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('1f7a5cbdca6547a95bbb69eade8851f1', 'MINIO', 'cug', '170_预算申报_6be01be5.png', 'png', '39', '38.9 kB', '1f7a5cbdca6547a95bbb69eade8851f1.png', '/menu-icons/v5-flat-skeuomorphic-blue/1f7a5cbdca6547a95bbb69eade8851f1.png', '/platform/sys/file/download?id=1f7a5cbdca6547a95bbb69eade8851f1', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('e42a7995bf42d089133a483c9daaff4f', 'MINIO', 'cug', '171_经费预算管理_fe0ae2a7.png', 'png', '52', '51.6 kB', 'e42a7995bf42d089133a483c9daaff4f.png', '/menu-icons/v5-flat-skeuomorphic-blue/e42a7995bf42d089133a483c9daaff4f.png', '/platform/sys/file/download?id=e42a7995bf42d089133a483c9daaff4f', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('e406f644d922b0efa2c50580ef4dca87', 'MINIO', 'cug', '172_荣誉管理_31078d88.png', 'png', '45', '44.9 kB', 'e406f644d922b0efa2c50580ef4dca87.png', '/menu-icons/v5-flat-skeuomorphic-blue/e406f644d922b0efa2c50580ef4dca87.png', '/platform/sys/file/download?id=e406f644d922b0efa2c50580ef4dca87', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('a745dacec0cda95f849e4f21e31e8566', 'MINIO', 'cug', '173_评优评先_32bd9853.png', 'png', '40', '40.2 kB', 'a745dacec0cda95f849e4f21e31e8566.png', '/menu-icons/v5-flat-skeuomorphic-blue/a745dacec0cda95f849e4f21e31e8566.png', '/platform/sys/file/download?id=a745dacec0cda95f849e4f21e31e8566', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('d5ad8b087c6d12646a2d324370bbb08e', 'MINIO', 'cug', '174_新闻投稿_a4cfdc91.png', 'png', '38', '38.4 kB', 'd5ad8b087c6d12646a2d324370bbb08e.png', '/menu-icons/v5-flat-skeuomorphic-blue/d5ad8b087c6d12646a2d324370bbb08e.png', '/platform/sys/file/download?id=d5ad8b087c6d12646a2d324370bbb08e', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('f93ad109e30417aae741ee76d1845798', 'MINIO', 'cug', '175_职工建家_fac7e9f5.png', 'png', '40', '39.7 kB', 'f93ad109e30417aae741ee76d1845798.png', '/menu-icons/v5-flat-skeuomorphic-blue/f93ad109e30417aae741ee76d1845798.png', '/platform/sys/file/download?id=f93ad109e30417aae741ee76d1845798', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('3beb1065aefe8d0991c81ee094c8d4a1', 'MINIO', 'cug', '176_资产管理_d7c6c17e.png', 'png', '43', '43.5 kB', '3beb1065aefe8d0991c81ee094c8d4a1.png', '/menu-icons/v5-flat-skeuomorphic-blue/3beb1065aefe8d0991c81ee094c8d4a1.png', '/platform/sys/file/download?id=3beb1065aefe8d0991c81ee094c8d4a1', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('ebcddcbc72ce2961b4ba7e67b0bc64d0', 'MINIO', 'cug', '177_注册社团_946104dc.png', 'png', '49', '48.9 kB', 'ebcddcbc72ce2961b4ba7e67b0bc64d0.png', '/menu-icons/v5-flat-skeuomorphic-blue/ebcddcbc72ce2961b4ba7e67b0bc64d0.png', '/platform/sys/file/download?id=ebcddcbc72ce2961b4ba7e67b0bc64d0', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('ddd801157bf58265dd9e641482fe972b', 'MINIO', 'cug', '178_社团信息维护_f6485820.png', 'png', '37', '36.6 kB', 'ddd801157bf58265dd9e641482fe972b.png', '/menu-icons/v5-flat-skeuomorphic-blue/ddd801157bf58265dd9e641482fe972b.png', '/platform/sys/file/download?id=ddd801157bf58265dd9e641482fe972b', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('7acaa1e469e1ba6450f8563eb4b639fe', 'MINIO', 'cug', '179_社团入会_1287eb24.png', 'png', '44', '43.6 kB', '7acaa1e469e1ba6450f8563eb4b639fe.png', '/menu-icons/v5-flat-skeuomorphic-blue/7acaa1e469e1ba6450f8563eb4b639fe.png', '/platform/sys/file/download?id=7acaa1e469e1ba6450f8563eb4b639fe', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('46c041705eaec632dfa73d81b3dcc7b5', 'MINIO', 'cug', '180_社团入会_321fa0c8.png', 'png', '44', '43.6 kB', '46c041705eaec632dfa73d81b3dcc7b5.png', '/menu-icons/v5-flat-skeuomorphic-blue/46c041705eaec632dfa73d81b3dcc7b5.png', '/platform/sys/file/download?id=46c041705eaec632dfa73d81b3dcc7b5', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('0c1ca1983d4bbf604bce1f308cdf0920', 'MINIO', 'cug', '181_年度考核_1ddecada.png', 'png', '45', '45.2 kB', '0c1ca1983d4bbf604bce1f308cdf0920.png', '/menu-icons/v5-flat-skeuomorphic-blue/0c1ca1983d4bbf604bce1f308cdf0920.png', '/platform/sys/file/download?id=0c1ca1983d4bbf604bce1f308cdf0920', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('649ca2608f994767fb3d99e17cd646c3', 'MINIO', 'cug', '182_社团评优_3f09f8a9.png', 'png', '49', '49.5 kB', '649ca2608f994767fb3d99e17cd646c3.png', '/menu-icons/v5-flat-skeuomorphic-blue/649ca2608f994767fb3d99e17cd646c3.png', '/platform/sys/file/download?id=649ca2608f994767fb3d99e17cd646c3', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('f9185ffb5188272249a80d0985a8a078', 'MINIO', 'cug', '183_社团统计_b8817cce.png', 'png', '38', '37.9 kB', 'f9185ffb5188272249a80d0985a8a078.png', '/menu-icons/v5-flat-skeuomorphic-blue/f9185ffb5188272249a80d0985a8a078.png', '/platform/sys/file/download?id=f9185ffb5188272249a80d0985a8a078', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('b03b7789697fa8ceac4f6a3a8b07652d', 'MINIO', 'cug', '184_社团文化活动_509423f4.png', 'png', '49', '48.6 kB', 'b03b7789697fa8ceac4f6a3a8b07652d.png', '/menu-icons/v5-flat-skeuomorphic-blue/b03b7789697fa8ceac4f6a3a8b07652d.png', '/platform/sys/file/download?id=b03b7789697fa8ceac4f6a3a8b07652d', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('0335b1721abc858c9ee85cd724173142', 'MINIO', 'cug', '185_年度计划总结_e658f630.png', 'png', '53', '52.6 kB', '0335b1721abc858c9ee85cd724173142.png', '/menu-icons/v5-flat-skeuomorphic-blue/0335b1721abc858c9ee85cd724173142.png', '/platform/sys/file/download?id=0335b1721abc858c9ee85cd724173142', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('544e4eb6c6407beb92e0a338c48dfe4c', 'MINIO', 'cug', '186_活动申报_895089b9.png', 'png', '37', '36.9 kB', '544e4eb6c6407beb92e0a338c48dfe4c.png', '/menu-icons/v5-flat-skeuomorphic-blue/544e4eb6c6407beb92e0a338c48dfe4c.png', '/platform/sys/file/download?id=544e4eb6c6407beb92e0a338c48dfe4c', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('760c3374e24ee833b84f461e48adcc49', 'MINIO', 'cug', '187_活动申报_6bb151be.png', 'png', '37', '36.9 kB', '760c3374e24ee833b84f461e48adcc49.png', '/menu-icons/v5-flat-skeuomorphic-blue/760c3374e24ee833b84f461e48adcc49.png', '/platform/sys/file/download?id=760c3374e24ee833b84f461e48adcc49', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('2e98608b16f6af5fe12fe6684c7eb3de', 'MINIO', 'cug', '188_费用报销管理_e8d1ced0.png', 'png', '39', '39.0 kB', '2e98608b16f6af5fe12fe6684c7eb3de.png', '/menu-icons/v5-flat-skeuomorphic-blue/2e98608b16f6af5fe12fe6684c7eb3de.png', '/platform/sys/file/download?id=2e98608b16f6af5fe12fe6684c7eb3de', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('20126926855d26ff593f0b7c75a23d4c', 'MINIO', 'cug', '189_报销申请_6784436e.png', 'png', '45', '44.8 kB', '20126926855d26ff593f0b7c75a23d4c.png', '/menu-icons/v5-flat-skeuomorphic-blue/20126926855d26ff593f0b7c75a23d4c.png', '/platform/sys/file/download?id=20126926855d26ff593f0b7c75a23d4c', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('861a2cef9f874ad8cec926e9f2bc0f5e', 'MINIO', 'cug', '190_子女入学管理_36e59aa2.png', 'png', '51', '51.0 kB', '861a2cef9f874ad8cec926e9f2bc0f5e.png', '/menu-icons/v5-flat-skeuomorphic-blue/861a2cef9f874ad8cec926e9f2bc0f5e.png', '/platform/sys/file/download?id=861a2cef9f874ad8cec926e9f2bc0f5e', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('c519b7d6c7eb9078e9d3e57c0369015b', 'MINIO', 'cug', '191_建言献策_5a90e1f8.png', 'png', '39', '39.2 kB', 'c519b7d6c7eb9078e9d3e57c0369015b.png', '/menu-icons/v5-flat-skeuomorphic-blue/c519b7d6c7eb9078e9d3e57c0369015b.png', '/platform/sys/file/download?id=c519b7d6c7eb9078e9d3e57c0369015b', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('2f4992fd672f09fc3393643edb903a40', 'MINIO', 'cug', '192_两委委员推选_c3886b5f.png', 'png', '39', '38.6 kB', '2f4992fd672f09fc3393643edb903a40.png', '/menu-icons/v5-flat-skeuomorphic-blue/2f4992fd672f09fc3393643edb903a40.png', '/platform/sys/file/download?id=2f4992fd672f09fc3393643edb903a40', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('67d562a574ba049712ca28a01d147dae', 'MINIO', 'cug', '193_理论学习_6d2535e3.png', 'png', '36', '36.5 kB', '67d562a574ba049712ca28a01d147dae.png', '/menu-icons/v5-flat-skeuomorphic-blue/67d562a574ba049712ca28a01d147dae.png', '/platform/sys/file/download?id=67d562a574ba049712ca28a01d147dae', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('4de59e0b1190a5d6d23e45a3c4481c15', 'MINIO', 'cug', '194_会务管理_fbe27890.png', 'png', '42', '41.8 kB', '4de59e0b1190a5d6d23e45a3c4481c15.png', '/menu-icons/v5-flat-skeuomorphic-blue/4de59e0b1190a5d6d23e45a3c4481c15.png', '/platform/sys/file/download?id=4de59e0b1190a5d6d23e45a3c4481c15', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('3f68b9240e81d25e81a08f90e946e1e9', 'MINIO', 'cug', '195_职工素养培训_81567260.png', 'png', '46', '46.1 kB', '3f68b9240e81d25e81a08f90e946e1e9.png', '/menu-icons/v5-flat-skeuomorphic-blue/3f68b9240e81d25e81a08f90e946e1e9.png', '/platform/sys/file/download?id=3f68b9240e81d25e81a08f90e946e1e9', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('6cf1760ca5f6478dcea7f33c9d724b32', 'MINIO', 'cug', '196_生日祝福_f12f0f8d.png', 'png', '40', '40.3 kB', '6cf1760ca5f6478dcea7f33c9d724b32.png', '/menu-icons/v5-flat-skeuomorphic-blue/6cf1760ca5f6478dcea7f33c9d724b32.png', '/platform/sys/file/download?id=6cf1760ca5f6478dcea7f33c9d724b32', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('4243c9823d380bf6fac1e01fe784c192', 'MINIO', 'cug', '197_会议厅_ac32facf.png', 'png', '55', '54.9 kB', '4243c9823d380bf6fac1e01fe784c192.png', '/menu-icons/v5-flat-skeuomorphic-blue/4243c9823d380bf6fac1e01fe784c192.png', '/platform/sys/file/download?id=4243c9823d380bf6fac1e01fe784c192', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('d6dec563549f40d539687601c45baf49', 'MINIO', 'cug', '198_人员核对_1f9e482c.png', 'png', '35', '35.3 kB', 'd6dec563549f40d539687601c45baf49.png', '/menu-icons/v5-flat-skeuomorphic-blue/d6dec563549f40d539687601c45baf49.png', '/platform/sys/file/download?id=d6dec563549f40d539687601c45baf49', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('84d4236d18b2c3ef37f452ef2bb111d9', 'MINIO', 'cug', '199_健身卡_3d6a88f3.png', 'png', '37', '37.1 kB', '84d4236d18b2c3ef37f452ef2bb111d9.png', '/menu-icons/v5-flat-skeuomorphic-blue/84d4236d18b2c3ef37f452ef2bb111d9.png', '/platform/sys/file/download?id=84d4236d18b2c3ef37f452ef2bb111d9', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('d12598f3a2893e7054ece31c517d467d', 'MINIO', 'cug', '200_量化考核_fd9a298a.png', 'png', '48', '47.7 kB', 'd12598f3a2893e7054ece31c517d467d.png', '/menu-icons/v5-flat-skeuomorphic-blue/d12598f3a2893e7054ece31c517d467d.png', '/platform/sys/file/download?id=d12598f3a2893e7054ece31c517d467d', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('2084a6a74acc26ffdacee69688fe351f', 'MINIO', 'cug', '201_分工会自评_7a5c41f2.png', 'png', '40', '39.5 kB', '2084a6a74acc26ffdacee69688fe351f.png', '/menu-icons/v5-flat-skeuomorphic-blue/2084a6a74acc26ffdacee69688fe351f.png', '/platform/sys/file/download?id=2084a6a74acc26ffdacee69688fe351f', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('b8e1e78de95c5deb0d68927e6456044b', 'MINIO', 'cug', '202_生日祝福_93487f22.png', 'png', '40', '40.3 kB', 'b8e1e78de95c5deb0d68927e6456044b.png', '/menu-icons/v5-flat-skeuomorphic-blue/b8e1e78de95c5deb0d68927e6456044b.png', '/platform/sys/file/download?id=b8e1e78de95c5deb0d68927e6456044b', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('86e65c679e20f6d534d6bf17636cc229', 'MINIO', 'cug', '203_单位管理_c2f9569e.png', 'png', '33', '33.0 kB', '86e65c679e20f6d534d6bf17636cc229.png', '/menu-icons/v5-flat-skeuomorphic-blue/86e65c679e20f6d534d6bf17636cc229.png', '/platform/sys/file/download?id=86e65c679e20f6d534d6bf17636cc229', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('d087820cc083371731515adc4e41cb73', 'MINIO', 'cug', '204_工会管理_51b1e376.png', 'png', '37', '36.6 kB', 'd087820cc083371731515adc4e41cb73.png', '/menu-icons/v5-flat-skeuomorphic-blue/d087820cc083371731515adc4e41cb73.png', '/platform/sys/file/download?id=d087820cc083371731515adc4e41cb73', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('5e298a0010b66ac5b6c3dc5aeb5b440d', 'MINIO', 'cug', '205_系统设置_72e8f153.png', 'png', '37', '37.3 kB', '5e298a0010b66ac5b6c3dc5aeb5b440d.png', '/menu-icons/v5-flat-skeuomorphic-blue/5e298a0010b66ac5b6c3dc5aeb5b440d.png', '/platform/sys/file/download?id=5e298a0010b66ac5b6c3dc5aeb5b440d', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('a79e1c5d38a350f5bde62b5d0f9b44fe', 'MINIO', 'cug', '206_基础管理_a993711d.png', 'png', '39', '39.2 kB', 'a79e1c5d38a350f5bde62b5d0f9b44fe.png', '/menu-icons/v5-flat-skeuomorphic-blue/a79e1c5d38a350f5bde62b5d0f9b44fe.png', '/platform/sys/file/download?id=a79e1c5d38a350f5bde62b5d0f9b44fe', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('a84e2883602abd6be8677595c0d67def', 'MINIO', 'cug', '207_活动报名_5cc02dac.png', 'png', '35', '35.2 kB', 'a84e2883602abd6be8677595c0d67def.png', '/menu-icons/v5-flat-skeuomorphic-blue/a84e2883602abd6be8677595c0d67def.png', '/platform/sys/file/download?id=a84e2883602abd6be8677595c0d67def', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('f9a1009a28d370c76df7f05b141612bb', 'MINIO', 'cug', '208_问卷调查_86dda8e2.png', 'png', '40', '40.1 kB', 'f9a1009a28d370c76df7f05b141612bb.png', '/menu-icons/v5-flat-skeuomorphic-blue/f9a1009a28d370c76df7f05b141612bb.png', '/platform/sys/file/download?id=f9a1009a28d370c76df7f05b141612bb', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('d9acd88c47bd8c575996a7fb85d550b4', 'MINIO', 'cug', '209_系统配置_3668daf0.png', 'png', '41', '40.6 kB', 'd9acd88c47bd8c575996a7fb85d550b4.png', '/menu-icons/v5-flat-skeuomorphic-blue/d9acd88c47bd8c575996a7fb85d550b4.png', '/platform/sys/file/download?id=d9acd88c47bd8c575996a7fb85d550b4', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('2170938bae373c66f8f51eceeed6982b', 'MINIO', 'cug', '210_数据管理_5ba85827.png', 'png', '41', '40.6 kB', '2170938bae373c66f8f51eceeed6982b.png', '/menu-icons/v5-flat-skeuomorphic-blue/2170938bae373c66f8f51eceeed6982b.png', '/platform/sys/file/download?id=2170938bae373c66f8f51eceeed6982b', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('880641f8e562ed8577fb8d49d9df4bf3', 'MINIO', 'cug', '211_场地预约_0a9fab6f.png', 'png', '58', '58.0 kB', '880641f8e562ed8577fb8d49d9df4bf3.png', '/menu-icons/v5-flat-skeuomorphic-blue/880641f8e562ed8577fb8d49d9df4bf3.png', '/platform/sys/file/download?id=880641f8e562ed8577fb8d49d9df4bf3', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('4f355a9c8b6294fbb2ad2e6064b03a33', 'MINIO', 'cug', '212_场地预约_e3399da9.png', 'png', '58', '58.0 kB', '4f355a9c8b6294fbb2ad2e6064b03a33.png', '/menu-icons/v5-flat-skeuomorphic-blue/4f355a9c8b6294fbb2ad2e6064b03a33.png', '/platform/sys/file/download?id=4f355a9c8b6294fbb2ad2e6064b03a33', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('44099a250bf70bd2f054ef0b81d4b099', 'MINIO', 'cug', '213_流程管理_8bfae2e4.png', 'png', '37', '37.0 kB', '44099a250bf70bd2f054ef0b81d4b099.png', '/menu-icons/v5-flat-skeuomorphic-blue/44099a250bf70bd2f054ef0b81d4b099.png', '/platform/sys/file/download?id=44099a250bf70bd2f054ef0b81d4b099', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('5567ec9af0df645c587da7643ec43c56', 'MINIO', 'cug', '214_我的预约_a58a5431.png', 'png', '41', '41.3 kB', '5567ec9af0df645c587da7643ec43c56.png', '/menu-icons/v5-flat-skeuomorphic-blue/5567ec9af0df645c587da7643ec43c56.png', '/platform/sys/file/download?id=5567ec9af0df645c587da7643ec43c56', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('0442c4741e1fad06e916c9a3e3ff6d33', 'MINIO', 'cug', '215_校工会审核_f3c752d1.png', 'png', '40', '39.7 kB', '0442c4741e1fad06e916c9a3e3ff6d33.png', '/menu-icons/v5-flat-skeuomorphic-blue/0442c4741e1fad06e916c9a3e3ff6d33.png', '/platform/sys/file/download?id=0442c4741e1fad06e916c9a3e3ff6d33', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('c6754f1997880df46a8fae7d038b6a38', 'MINIO', 'cug', '216_场地预约_26e7dc9c.png', 'png', '58', '58.0 kB', 'c6754f1997880df46a8fae7d038b6a38.png', '/menu-icons/v5-flat-skeuomorphic-blue/c6754f1997880df46a8fae7d038b6a38.png', '/platform/sys/file/download?id=c6754f1997880df46a8fae7d038b6a38', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('53d254c917da9222f61ef9e198de80a5', 'MINIO', 'cug', '217_普惠疗休养_68ac8d18.png', 'png', '49', '48.7 kB', '53d254c917da9222f61ef9e198de80a5.png', '/menu-icons/v5-flat-skeuomorphic-blue/53d254c917da9222f61ef9e198de80a5.png', '/platform/sys/file/download?id=53d254c917da9222f61ef9e198de80a5', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('863a32cfe3e2441b11d7ef582efe19a9', 'MINIO', 'cug', '218_疗休养报名_f30cfea5.png', 'png', '46', '46.0 kB', '863a32cfe3e2441b11d7ef582efe19a9.png', '/menu-icons/v5-flat-skeuomorphic-blue/863a32cfe3e2441b11d7ef582efe19a9.png', '/platform/sys/file/download?id=863a32cfe3e2441b11d7ef582efe19a9', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('7575966ac094d6e6b89d09dd4e875885', 'MINIO', 'cug', '219_场地预约_f50b3389.png', 'png', '58', '58.0 kB', '7575966ac094d6e6b89d09dd4e875885.png', '/menu-icons/v5-flat-skeuomorphic-blue/7575966ac094d6e6b89d09dd4e875885.png', '/platform/sys/file/download?id=7575966ac094d6e6b89d09dd4e875885', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('69a76d56735635ec225b70051e073309', 'MINIO', 'cug', '220_学习教育平台_a0f47f6a.png', 'png', '40', '39.7 kB', '69a76d56735635ec225b70051e073309.png', '/menu-icons/v5-flat-skeuomorphic-blue/69a76d56735635ec225b70051e073309.png', '/platform/sys/file/download?id=69a76d56735635ec225b70051e073309', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('68d074dea722443c5150fe3b832be738', 'MINIO', 'cug', '221_普惠疗休养_b7c63f0c.png', 'png', '49', '48.7 kB', '68d074dea722443c5150fe3b832be738.png', '/menu-icons/v5-flat-skeuomorphic-blue/68d074dea722443c5150fe3b832be738.png', '/platform/sys/file/download?id=68d074dea722443c5150fe3b832be738', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('f4397f0e4af50a213f4789e8c0510af6', 'MINIO', 'cug', '222_疗休养报名_b7c63f0c.png', 'png', '46', '46.0 kB', 'f4397f0e4af50a213f4789e8c0510af6.png', '/menu-icons/v5-flat-skeuomorphic-blue/f4397f0e4af50a213f4789e8c0510af6.png', '/platform/sys/file/download?id=f4397f0e4af50a213f4789e8c0510af6', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('f6607e7d1aa359689d64f4cd45383cb5', 'MINIO', 'cug', '223_我的疗休养_d3020be8.png', 'png', '47', '46.8 kB', 'f6607e7d1aa359689d64f4cd45383cb5.png', '/menu-icons/v5-flat-skeuomorphic-blue/f6607e7d1aa359689d64f4cd45383cb5.png', '/platform/sys/file/download?id=f6607e7d1aa359689d64f4cd45383cb5', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('4bd725febe3e8105556959f7af988987', 'MINIO', 'cug', '224_分工会审核_80734d95.png', 'png', '40', '39.5 kB', '4bd725febe3e8105556959f7af988987.png', '/menu-icons/v5-flat-skeuomorphic-blue/4bd725febe3e8105556959f7af988987.png', '/platform/sys/file/download?id=4bd725febe3e8105556959f7af988987', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('9bfe408b11963fc3da990e0edbbc4250', 'MINIO', 'cug', '225_校工会审核_08793469.png', 'png', '40', '39.7 kB', '9bfe408b11963fc3da990e0edbbc4250.png', '/menu-icons/v5-flat-skeuomorphic-blue/9bfe408b11963fc3da990e0edbbc4250.png', '/platform/sys/file/download?id=9bfe408b11963fc3da990e0edbbc4250', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('d5cc82d4fdeba1c97bfaa1f2ba0ff48e', 'MINIO', 'cug', '226_学习教育平台_3af0f040.png', 'png', '40', '39.7 kB', 'd5cc82d4fdeba1c97bfaa1f2ba0ff48e.png', '/menu-icons/v5-flat-skeuomorphic-blue/d5cc82d4fdeba1c97bfaa1f2ba0ff48e.png', '/platform/sys/file/download?id=d5cc82d4fdeba1c97bfaa1f2ba0ff48e', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('a2e470e73fba0a9029f062ca161aaabe', 'MINIO', 'cug', '227_学习教育首页_82946217.png', 'png', '40', '40.4 kB', 'a2e470e73fba0a9029f062ca161aaabe.png', '/menu-icons/v5-flat-skeuomorphic-blue/a2e470e73fba0a9029f062ca161aaabe.png', '/platform/sys/file/download?id=a2e470e73fba0a9029f062ca161aaabe', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('2adf711e5009bf7a2b74245ffba749bf', 'MINIO', 'cug', '228_我的学习_3e9a7611.png', 'png', '44', '44.4 kB', '2adf711e5009bf7a2b74245ffba749bf.png', '/menu-icons/v5-flat-skeuomorphic-blue/2adf711e5009bf7a2b74245ffba749bf.png', '/platform/sys/file/download?id=2adf711e5009bf7a2b74245ffba749bf', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('d390359d7c76b5a7406e2634b77031aa', 'MINIO', 'cug', '229_荣誉台账_47a997dc.png', 'png', '42', '41.9 kB', 'd390359d7c76b5a7406e2634b77031aa.png', '/menu-icons/v5-flat-skeuomorphic-blue/d390359d7c76b5a7406e2634b77031aa.png', '/platform/sys/file/download?id=d390359d7c76b5a7406e2634b77031aa', NULL, NULL, '', 1785994967344, '', 1785994967344, 0), +('f695e0abe3121d36242fd899c693c49b', 'MINIO', 'cug', '230_荣誉展示_2a93542d.png', 'png', '49', '49.5 kB', 'f695e0abe3121d36242fd899c693c49b.png', '/menu-icons/v5-flat-skeuomorphic-blue/f695e0abe3121d36242fd899c693c49b.png', '/platform/sys/file/download?id=f695e0abe3121d36242fd899c693c49b', NULL, NULL, '', 1785994967344, '', 1785994967344, 0) +ON DUPLICATE KEY UPDATE + `bucket` = VALUES(`bucket`), + `name` = VALUES(`name`), + `sizeKb` = VALUES(`sizeKb`), + `sizeInfo` = VALUES(`sizeInfo`), + `objName` = VALUES(`objName`), + `storagePath` = VALUES(`storagePath`), + `downloadPath` = VALUES(`downloadPath`), + `updatedAt` = VALUES(`updatedAt`), + `delFlag` = 0; + +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=d4239ab512e02e319bde38b07d4776a0' WHERE `id` = '2e6f393072904de3a80b10a00d3eeea5'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=50988a1ded823d35c0d854afb2692b57' WHERE `id` = '64ace2097a0341c8ba2da1961cda671f'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=8a67dd727502fecf8855e4e913cf8e1e' WHERE `id` = 'eb18aa5741e64ce0bcaa824119d720a8'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=59955c44f86d8d0f45fd8f3e0d614612' WHERE `id` = '835cb68e14e74f7bbf6cf5a1e0659a26'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=d2f23637ecfd8f39cb46c25876223eeb' WHERE `id` = '10ebaa5b633f42bf9f8768a942c53fb5'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=9a7df21c6bd1f87d9eda769f00b40d89' WHERE `id` = 'e7cf2f56415f4e1dacfb415b42045d4c'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=b41ca4fa2c2462254bb6d7efffc285a4' WHERE `id` = '40a293cce5474cb58503435cb5a2fb14'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=3b0245e70916a36073e0fef16f2e1f32' WHERE `id` = '2666d0aeb0a84c15bcbb7802433e0070'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=202d0ae8211611a6947ff7caecbe7e2b' WHERE `id` = 'ea574347b35a4c68bd02dc1cd2eb9e5f'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=4e2070b1c0908d460dbf67f01818d29c' WHERE `id` = '9441d18cd87f48d0b9f49d9f7103e55b'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=7b10699834f961eda7a12df20a6e1ce7' WHERE `id` = '44a59a2b8a6b48efa35eda8b16558a26'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=662b152a6a5d2b7b694a4076cdd218e3' WHERE `id` = '1c2aee7dc9cc4ef1b2977d1f1013cc16'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=39325d6ef536fa6413c6a9e2edb98425' WHERE `id` = '11db68564eba499da35d9d5fbdf63874'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=4084d4436cbfa13f84a9dca9177ce6ab' WHERE `id` = 'd5d7964e86c54a8e993f59fa78186e9d'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=7339d3c16569a5c925794378a300fa9e' WHERE `id` = 'c44115254326463682aba8ddd7f58c5b'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=99eca55c6eea6eb0451aeb4fdcdd0942' WHERE `id` = 'eb4ed857e2da407981f60e29206b25f8'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=0532afa3620e20113505b03755959ee0' WHERE `id` = 'c4b99724f4bc46be97608a10d84d7020'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=3d7c1a8b6778409f063cfd5197649d99' WHERE `id` = '56835d074f3243f4b89b5cbb6cb92dfc'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=7cd72e99031df0c21431ad64d0ac72a8' WHERE `id` = '304278a0ce2e49ac94758e49ce863170'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=d2a477739ecf817c425e3113d66b0a01' WHERE `id` = '2b9b7227466c4889a314a8bc0236fd84'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=d608ed7f50b2fda7c9228372ba8012b0' WHERE `id` = 'ff182281b3284863b13135f08407b5aa'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=2b16431101b09760db12387a3714d3c6' WHERE `id` = '7c79171d88654fc996b2d1eeb93b75d9'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=e0d5aa775264eae8d49114a8f3bf82e9' WHERE `id` = '32a51579ed594d3d9c272e3377110635'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=1fda43541284c86b8d5f406ee5ebf1e0' WHERE `id` = '6bdef282dac0405e9738fb159e1a2d46'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=f9b7a26ef993a9808b09c67f73d2d296' WHERE `id` = 'eeaf336622364a178392c20cfbd6bb0b'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=b83956a3a3162f17513333e8dfe91f49' WHERE `id` = 'b27178ff03df4fdbab5feeea0224a992'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=969f3bc275bbd917b3e3444752d9de38' WHERE `id` = '87611b6d78bb490080f3456c53a99e07'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=d54945a79bce326c126a17ffa7dedd86' WHERE `id` = 'd0ee5ab9fa3247cf813514a88437536f'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=012f4e24cb99feeae830b9e5956f730a' WHERE `id` = 'af963d19d77a452db436174332231cb3'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=71f1a5bdd53422a302d50565ed6d8ca7' WHERE `id` = 'f7a890c73c4545aeb8009de7b552f5e6'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=01ac13ee1b86635f406704686b2826cb' WHERE `id` = '41410dbe4ae34a82b982bae5b11665a8'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=ff390faffeed11c872ff43c268fc42c8' WHERE `id` = '5e0c533552d94e189f3e9ed0b847eb97'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=b077d67b5add801672329f19deedef51' WHERE `id` = 'b8bcaa94ac2d45b88c796626bb42cf99'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=0784cad3fc2147bafafc22cdb00b32b8' WHERE `id` = '7af124e126044917920a39382666d488'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=ca4ddf8871ab60754812c61781e3820a' WHERE `id` = '2de433e4f8494cd3bcd86a4d5f7931e2'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=92251f17382d770a99d6399a9245fed2' WHERE `id` = '840648058ebf48e3a294fdbdb9b3453a'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=9b5bf30597169d4b597ec15c64746589' WHERE `id` = 'dbd21f6b79434b34b7369df7a48589a4'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=bff0da0374934156eaf7008420281877' WHERE `id` = 'e585d2cac7ef4b6ba7ca61a1ad663c59'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=9ff5f7ccbf1584cc09c8b0b0b547907b' WHERE `id` = '7e2b850c0934472282805f5fddaefa87'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=fe79030ce09863147010927ef79d4804' WHERE `id` = '8f27ac9fd7f644edba46868204b5ede2'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=46ca54df1bb66aaec8d89be47ed888d9' WHERE `id` = '313842fc6f5c4d589658a9d0fc0f25b7'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=7650a2a028223ae8380c946d96551b56' WHERE `id` = 'dcf6c19011a9481898eb5277f24e885a'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=128a3ca23138c341b259ef88521818c8' WHERE `id` = '13d50644bc8141ae8e32a0b11e90045d'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=111f52a632d37ba3029d768a70e59426' WHERE `id` = 'c547be26c12c41199dfff259a4c039ca'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=a5b94ab758eb078c51a68bd8b74d0b63' WHERE `id` = 'f3ae0a075cd94d24b0bc1d4aec5565f7'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=f56d0ebb12e367095873a4a2bafa362e' WHERE `id` = '00448f6955cd441c8677dc2eca12006b'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=e85273b4715e551e7a0be1e4c237e9db' WHERE `id` = '024811fd168e44948e6ab84911fc26bb'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=e7d21d8058319281fc750720196338b3' WHERE `id` = '9bfd257eb7974763a1035a5c82b966f7'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=e229c7c88be79c83cbb204273e1e837a' WHERE `id` = '7492992ba3564d35938d133d7191bb0e'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=64e9baf4931fd5414ca105cbe6771346' WHERE `id` = '330e42e0ae914f5392b96fb933f17b5b'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=dfe30264324d45f30e36a5209c7a3b67' WHERE `id` = '87a2dcfac0da4ec4870b65693807a4d1'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=d2095854e67dcf28dea1a4a975e90aba' WHERE `id` = 'c269f94a5c8a4a4a8c8de0bb8f8f9f9a'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=5c823bf5486ec8ae26e3233b0fe7f493' WHERE `id` = '6ddda19192c04f48ad76a507cd2e2c39'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=14ee697a9f479076eb3a113aaa025bcb' WHERE `id` = '3cf7ee61f2ed44d6838d92dea22d857b'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=4dee1a7937ccbffde68a358d05179e10' WHERE `id` = '51b21e9744614be8805113293902a7ce'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=8e867f31615a067757139cb0f37a2c3a' WHERE `id` = '23d30124199b486d8af79aba62440b15'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=0cc926265e46a20bd7750bd23ef64ea7' WHERE `id` = 'd736e4d7e8644cf38f248e7ad87ed6ad'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=b20526ea21e6d034a1335123e4db2440' WHERE `id` = '35a9239d754c47b9afccce173cb72d64'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=a4bc152d86f817fa2cf87ee142996d48' WHERE `id` = 'd4cab4ba599041e4b2b89cb74e7e4f35'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=febd687b512a37aa151284d0d6249a9c' WHERE `id` = '0a2bfc8579034908baf6d035a7b14e0a'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=414f0d597613854fb20d316c9471b32e' WHERE `id` = 'c03fbf17e7094f5f9d174f694dc93131'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=5b82cabae27a69bb71daa26cbc010965' WHERE `id` = '56620c51729f4c59a69c03ba8f5a80fc'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=5e63cc5c28e869fdae9d7209e0e34316' WHERE `id` = 'ef46a58794044c73a0d1197c7b6fe41c'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=1e663ad85c938f9dc3591306efa12ef2' WHERE `id` = 'c6a2ec8dc2f84f2fbba9673797e10faa'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=50ed9525a58d1f55a53dc58aa2dffc1d' WHERE `id` = '7b21d46827e9451c84809b53c1c08e2b'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=04528f30323c0f89065ea88bfa5e1767' WHERE `id` = '43f06636029a4f16b4a8a1007312d422'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=835a6cb3de7045d78f7eb9dda0f3ba24' WHERE `id` = 'b6c224df9e6c4f678f931c9006a718f0'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=7fcea2eb85b32c7e08fe2d7838cf9f74' WHERE `id` = '297400c803404aa2a34f38d276eaced0'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=b5afef9259f3abae7b1bbb1d05b2fe5c' WHERE `id` = 'aa0ffd36239f4a13b61419744fd3fbbb'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=3fc3d984a41e9225e1f7710280fdac19' WHERE `id` = '7dc21dca53184791b587d9c654dccfa3'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=47fe77b9ff74053f555c339157e5e497' WHERE `id` = '939595b4c6754cb483a7d65227844c6e'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=d45efe5411e254dc940f6e10f7c8f383' WHERE `id` = 'd073c1d866c0463ca571a658ee5c9760'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=d964d19857c59f3e5dd282620f1a213e' WHERE `id` = '3f88a4f679fc4d78b9557055cc4bc1ae'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=141fc4d6a9168b862aa5918726d0924a' WHERE `id` = '8a77d32c8f9145f48f376e0886cefc59'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=185b9668345c1775c8b34642f6108872' WHERE `id` = '44423a17da734e318e69aa99560c81c0'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=ce06d45189f54739dc25a391b6c2fe85' WHERE `id` = '3e10265306224ac18c4b4c7e3d7c92d0'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=0738309559b2647c5ef8b38ed8f39080' WHERE `id` = 'ac2516a6788a4be98ffa44c5842568bb'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=0f2717dd006be9e5db67442377679f91' WHERE `id` = '59d6ba7c321a43548f04120ed1936d32'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=91e5dc12db888366c17e61c9121ff69c' WHERE `id` = '6b5adca77c454fffbe112da4096a25d6'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=81ac98687f68e252042807a459a988df' WHERE `id` = '575660216c844b23a1fb9ae526ec180c'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=7a61acfc8a2896f36ca0f140a8c00f93' WHERE `id` = '1375120f807e4c5996f91ff77f043c59'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=24565ab537cc29fdc1f8398d57cba2c9' WHERE `id` = '2c61ac06b95d4b34a0e300782b4ac267'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=024f728cf7476458d372d9c13bd9f937' WHERE `id` = '893016b4db414bdb83eb33484c62f23a'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=08e92fd1ea7f5e1d6c3f0ff4ae9650f8' WHERE `id` = 'dbaba7b31ae9484492c766286371a0be'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=8060ce47970cadcf7dc3bd41c0ed20d9' WHERE `id` = '898f95af62dc47f08ea29bbbfdf89337'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=ddd9c5c2fb28db177956a849ff2352df' WHERE `id` = 'fb16e44eff3f4ce5b5ecccaa2c0f9528'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=da2e93c2a9491893ebd5d166f47bc545' WHERE `id` = '42d1b0ccbf254dfba7513d713c1f1489'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=bcb91e996ad91fc133ce2432203556bf' WHERE `id` = '811cf28ce73c478e8f6f22827ed8f2aa'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=0467db4198d856e2180f89796c1ad62e' WHERE `id` = '57accf35655f40cb897917167bcad496'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=f27149a8370b2e9e0849ca9028d6cb66' WHERE `id` = '05f829da70c541929e993968cf802a1c'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=1d9097f1ddf8ea04323327354a010ae9' WHERE `id` = 'a8966b0e0e174a8480a474979b6257b4'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=be4c7a2b027046b129bed6a27049d841' WHERE `id` = '893a216d09b0443bb736708961cf2eeb'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=07e12bf38d38c4ab75dd01b46ae03963' WHERE `id` = '0c4ccaece05f45f8b0533cedb5ea0630'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=e93b9ec54bd39a242c9c81067eb64b61' WHERE `id` = 'a112c7db9e554a39b73ca00fd3964d9e'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=e61bb788e312c599a4f1d4c583ec56e9' WHERE `id` = '23883f9ae2394684999611698f34c3d8'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=dd8b8a073342b416ff6f46cec3d1a6cf' WHERE `id` = 'e5851cdfc62b4623886b9608c42f2666'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=d4d985afcccd436885d1cdf4b9c0c956' WHERE `id` = 'abfbd5db63f14be0a51356e50f0bbe30'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=30a17bd43525a7d8b7f73648253b2353' WHERE `id` = '99252619ec5e4072a98ac503fd869774'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=0e9014e6360d1953ddd1fe0121f09d02' WHERE `id` = '6a54861491554fdc9cd83a49a580ad4f'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=90320751d0f5de5ddc71974b0259f468' WHERE `id` = '4a764f7db2e7429ab5e348a6d81621db'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=c31947c4e4f9f0064f1a987bbdae3548' WHERE `id` = 'c13558b09136482187b4725d4ed6936e'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=b3ca619e943008ec66c87ff3ea54caf0' WHERE `id` = 'f808e1e1453347e8a38cb4aa79a9e865'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=30052dd19f6e69faa6a546e3692f4477' WHERE `id` = '6c3fcd1a66f44d8980214673959e46fe'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=786d70bd8e118fbae8efebbb8df64762' WHERE `id` = '16388b3dd01440a180eca20da23bbcd9'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=375d5bf016d1183211557873fcd5de57' WHERE `id` = 'dc2763927e3a4733a08969ab7bbd1390'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=8e50b6ef905bec105c038826fd1e1dd6' WHERE `id` = '50bf62d0b7da4c58a60884aeaa140fc2'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=1dfe6590295b676e1a6f2796b4c93d70' WHERE `id` = '05f308a2897b424d9deb9aa6b713c779'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=a9df7e58e16784a38f33e7de7f841462' WHERE `id` = 'd54c4078b7b748b9a19d49ac5f6aacfa'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=e71f6cdfab618af4e1f579c12acf7da4' WHERE `id` = 'e04f9463a00e403eb0428f79c65d9ddc'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=e6ea330dc1f4a9ecc13b79e0070af510' WHERE `id` = '5a994c0fceca4cdd9255ddbd8c902e93'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=d81c6cf64003517afbca47bdb083e355' WHERE `id` = 'bfd9983cd5924d189eef17ff250052bf'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=80542cb6b1b00e417e7257fe3c11f333' WHERE `id` = 'd1abc76f12d44dae98dd3bb37945a205'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=04ddef4f8d79b825bc19774d9137e835' WHERE `id` = '0d6c8aacf875487fb89a1ec0cbf76c52'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=d3ec6bccb26ff4c9fb79232e5f02ef17' WHERE `id` = '17c32edb450c4a8e8faf5c1fcf27684c'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=aa1a120e2814b4928c50dc8d8ed64c10' WHERE `id` = '62b1effb0c0d4f48b2b3449fe3183626'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=72d78f2e581b4774d683c6247ba8ba82' WHERE `id` = 'ed6f15a03f5240ffb142f4435b67d6cc'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=0b35ac8df36d0307cccd3a7abead9bbd' WHERE `id` = '3f09df78e9c746569a0e6e62ea8beea4'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=f0752418a1fa85076043d8b30a8162a9' WHERE `id` = '70b4f9a163e644b9a900612586b7d2e8'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=b445e5fbe073d6fec6821bfa2d00d0ad' WHERE `id` = '8f752c502e374ded8419fdbb16362814'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=c099744c28258127c82c9d90a506280a' WHERE `id` = '22847e5583744d2298736b9d2a0e7211'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=9b293ef36ad342406317aa5ddb25de1e' WHERE `id` = 'ef93e3b96c57416c851c8a69bd220869'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=80167705b15e822ef298da8bf0e6238c' WHERE `id` = 'd34fa7359f974f5c81e21d2746fcca7e'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=9c9ed841146ead12774e305127c70655' WHERE `id` = '94b6959991c74058b952f8bd0e0ebf81'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=c15e09dd7448821d331443c415818e00' WHERE `id` = '15156ec9f7364944aabea48475e1da80'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=7663b86e0083ccec5451e4ad753e323a' WHERE `id` = '3b49290f7db44130b9f6394a8212321f'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=dc3a4487ca0708d62662e7f03aa031fa' WHERE `id` = '5e024c7466c5462a80fe94f2fc89f129'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=215f19af8b2ba2773c07e8f804541697' WHERE `id` = 'c08d85433007462db7efc429fe508a46'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=f487372d9c3c26c8cea86040602436b7' WHERE `id` = '261dd7f7fa3245c3937054e9792d8df0'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=5d35429b46c062cc376896db6abffed9' WHERE `id` = '9e0070b7abc84aa3a4577042e0b7c3e1'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=82fd6812dc635f7ea8221cedbc680d3c' WHERE `id` = '360f1c3f03764c47a852caf04216d7d1'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=5e12d18fabe9153c13a11bdee1131a54' WHERE `id` = 'a9d5ff1158c346769db5edd3f74bb3ba'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=b8175cc96b7b6a5a785820997ce6ed05' WHERE `id` = '5f2c021818d54988b10b065a6ddd3d0b'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=9104a4f38f453f420cf456abf10bc5f8' WHERE `id` = '10ecb801ca664453bcfdb6a1bd9fd04d'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=0654d117a3fb0fe061064096744bc6b0' WHERE `id` = '5ae60a2c86e741ea92898945ad7f62b4'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=d5dd0484ed5b8baa66d75d3ada43e955' WHERE `id` = 'ca43757872164c3eabd43692f7102fba'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=8517a2b51288572a7616218682da26cc' WHERE `id` = 'b0febdbf99634bb388f65f2b8d9d6b42'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=7307bab899c6747ad89a0b351c2e306e' WHERE `id` = 'd11cf9fe9eed4a338d7caa0af2071ea7'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=458502126d65e18c89bf84e1242a0e6c' WHERE `id` = '04fd4ddf2cff4091aa64926350a60437'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=605b72241fa221e989eda7c14bb41373' WHERE `id` = '0c08a2e7690940d9a46044cfc3470d92'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=b905d8fd3e85338117038ff726278f3d' WHERE `id` = '871f822c2884401498278b0a78b69da3'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=64c7b517599ba0099ce7a853e85738b2' WHERE `id` = '612a4fa1142d426699ddb81c5b7e4e76'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=161ee1a6787b0aba72f46ab181e4ab53' WHERE `id` = 'c8d0855a2aac4ca386d36976d0431cdd'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=7cad7841948398a495bd6d535ec35baf' WHERE `id` = 'c0ba4f08ed2e42f0887ea20d122757fb'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=780975e27c40decf02a0ad9a58406b48' WHERE `id` = 'f148c76e8f2942dc86be645fdb7ab09c'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=7d9b1dbd86a892b96268f5cc0458093a' WHERE `id` = 'b0cc19870a994b748f8d260088f7ffe7'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=4bfe67d3bce0536922b83aaf998ff8bf' WHERE `id` = 'ca9e5652184e4c6aab3a8b953ef63e2a'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=653f431f3f68e5529e7c746648ee3f17' WHERE `id` = '093e1e2980544d288938b8a8da57d7f0'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=69b7a9902bb48a6e668bd9207f3ad900' WHERE `id` = '519c8f5ab43840c7903b4d80ac41ac51'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=e549fd7fa363215d798460f1ad7b9542' WHERE `id` = '73df1dda0e7a4188b9fa4522fc6ef888'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=0d0f799d5d6e7635020d5345c78a64ae' WHERE `id` = 'cf47b9d67dd34b94b8424a62371ed966'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=e574d0f9924e2d12d1c3d214f0a59761' WHERE `id` = 'e08ff1792e7849d1b97981f3583a0abe'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=fca1fa026b15d8e7106271ce4ca7e5ef' WHERE `id` = '69280dbb3e024e558e22b834fa8249c7'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=72e88557e860fe349597c9100a4029a7' WHERE `id` = '0868f8b6f0a44fb7951c2c323ee1cd63'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=350e456eb0b9c091519e1733ff69cda1' WHERE `id` = 'c97ad132a4374e01ad39e5e089d08c43'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=7866849789d36e812e6eb0cffe8e75aa' WHERE `id` = '788400d0f7eb47edb795d41c460b14b8'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=f7f2b1cc448c75bb410d8ce4b0d75d4f' WHERE `id` = 'c1709519e07946389a026905a1db5900'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=aaa4b2b3fcc9daf1154dbcf878209b70' WHERE `id` = 'b759a93a16ef4037880efa23d48f49b5'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=447d5fedecfd3e3121854954142cebf4' WHERE `id` = '91d79e0f4e464f298e7a6b37217386d3'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=1d9e13caf37aa95665f63ad4e545e0a6' WHERE `id` = '737e57a39bae490e9c877d6e7453b046'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=398cfe57b1c727a434cd7c690d721217' WHERE `id` = '33e81fa045e248b19381abaee38f45ee'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=184782319d588117534eda54be0ca540' WHERE `id` = '77c8af32767644af914d16689e98948b'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=ba437ff0da2e7759d35c2afddb15f698' WHERE `id` = '1f917af28825403385cb385fc7e7bca0'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=7fb287d723da5ea7adab9f4426d02a59' WHERE `id` = 'd6132ff0c9534f7783cfda81ff60b5fd'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=38427f0f41908eb51ad8842aed240242' WHERE `id` = '1c643efa45d148d0b519938b2b282436'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=e7fc89824875e92c475e6fd3704ea9f1' WHERE `id` = 'e9e46237b841469585a77f8432edd55d'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=cd64e36bf08bb4a2c1f3fd8c38e90fec' WHERE `id` = '82356ff2bacf4821916cb42406f2552e'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=ae2d6d77ea2ba8922d37ab6c88429008' WHERE `id` = '4026680943ef441082a363de91927390'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=a6357c304caae142f552f268e5966d57' WHERE `id` = '09abd6b8afbc48349490717c3d05707e'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=b7f8ca64b4ca70ee14aa3e9bd0649e47' WHERE `id` = '396309f21f5441b78b42de12aaa4c273'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=1f7a5cbdca6547a95bbb69eade8851f1' WHERE `id` = '6be01be55b4347c599e43e66dfbef173'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=e42a7995bf42d089133a483c9daaff4f' WHERE `id` = 'fe0ae2a7d5fc4432996e3b8c369f0a18'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=e406f644d922b0efa2c50580ef4dca87' WHERE `id` = '31078d880fed42209331c69c580458c5'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=a745dacec0cda95f849e4f21e31e8566' WHERE `id` = '32bd9853db494301bb59757a55dc1c5d'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=d5ad8b087c6d12646a2d324370bbb08e' WHERE `id` = 'a4cfdc91e93d4f16aeddaf27176955c5'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=f93ad109e30417aae741ee76d1845798' WHERE `id` = 'fac7e9f536f94033805173e16fb6f259'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=3beb1065aefe8d0991c81ee094c8d4a1' WHERE `id` = 'd7c6c17eb29142b38133984ee90dacb2'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=ebcddcbc72ce2961b4ba7e67b0bc64d0' WHERE `id` = '946104dc00ba4709acb9ec3d1abd3239'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=ddd801157bf58265dd9e641482fe972b' WHERE `id` = 'f6485820d6b54204a35c9a5ef9e5d0dc'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=7acaa1e469e1ba6450f8563eb4b639fe' WHERE `id` = '1287eb24e288460ab2651ba9c29ace32'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=46c041705eaec632dfa73d81b3dcc7b5' WHERE `id` = '321fa0c856f54a14993bed58cc1a95bc'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=0c1ca1983d4bbf604bce1f308cdf0920' WHERE `id` = '1ddecadaa25c47beaef2998c278d928a'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=649ca2608f994767fb3d99e17cd646c3' WHERE `id` = '3f09f8a9beb644229094e6aa1bce52b6'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=f9185ffb5188272249a80d0985a8a078' WHERE `id` = 'b8817cce3ae34d49844a7ea8d8b15f3f'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=b03b7789697fa8ceac4f6a3a8b07652d' WHERE `id` = '509423f4ae6e48a884ac55fa9be0b7ec'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=0335b1721abc858c9ee85cd724173142' WHERE `id` = 'e658f630b96e4774881abcf49d6780e7'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=544e4eb6c6407beb92e0a338c48dfe4c' WHERE `id` = '895089b920a548a9902d120c6b912d2c'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=760c3374e24ee833b84f461e48adcc49' WHERE `id` = '6bb151be653e49d696e385fe34fc5a17'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=2e98608b16f6af5fe12fe6684c7eb3de' WHERE `id` = 'e8d1ced00a1c480eaf0db5f4573763c4'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=20126926855d26ff593f0b7c75a23d4c' WHERE `id` = '6784436e45124205a465dcb9f0326b1d'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=861a2cef9f874ad8cec926e9f2bc0f5e' WHERE `id` = '36e59aa2bca64ffb99b7445c14f03489'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=c519b7d6c7eb9078e9d3e57c0369015b' WHERE `id` = '5a90e1f8263c49f5970389fc19b741ea'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=2f4992fd672f09fc3393643edb903a40' WHERE `id` = 'c3886b5f4e24430ea05cf1851f8b8f2c'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=67d562a574ba049712ca28a01d147dae' WHERE `id` = '6d2535e3117942808813ea213163c47c'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=4de59e0b1190a5d6d23e45a3c4481c15' WHERE `id` = 'fbe27890530743598216d902b2a0c915'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=3f68b9240e81d25e81a08f90e946e1e9' WHERE `id` = '81567260a1ef4efd85bcbc6618766e76'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=6cf1760ca5f6478dcea7f33c9d724b32' WHERE `id` = 'f12f0f8d012143d38c0080272ed887ff'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=4243c9823d380bf6fac1e01fe784c192' WHERE `id` = 'ac32facf5b0c4c6485599a5be90350ed'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=d6dec563549f40d539687601c45baf49' WHERE `id` = '1f9e482ccebd41c182f6dca84f14f668'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=84d4236d18b2c3ef37f452ef2bb111d9' WHERE `id` = '3d6a88f3d9de4cc7b7862c2881b7963b'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=d12598f3a2893e7054ece31c517d467d' WHERE `id` = 'fd9a298afb7f46aab3d2796c42da8e68'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=2084a6a74acc26ffdacee69688fe351f' WHERE `id` = '7a5c41f2e76a4d5ebfb6b19df7983fd2'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=b8e1e78de95c5deb0d68927e6456044b' WHERE `id` = '93487f22face4e18887d90154b70094a'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=86e65c679e20f6d534d6bf17636cc229' WHERE `id` = 'c2f9569ea8f742f8869e2a2faf8666a7'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=d087820cc083371731515adc4e41cb73' WHERE `id` = '51b1e376ee6644eb8629b30857f96f27'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=5e298a0010b66ac5b6c3dc5aeb5b440d' WHERE `id` = '72e8f153e0ed40439c97e0bef43afb1e'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=a79e1c5d38a350f5bde62b5d0f9b44fe' WHERE `id` = 'a993711d11e444f1a7c08589a4497690'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=a84e2883602abd6be8677595c0d67def' WHERE `id` = '5cc02dac08c746bf965b4c441f5b7fb5'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=f9a1009a28d370c76df7f05b141612bb' WHERE `id` = '86dda8e2d0ab4703b6933c45b6705cf4'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=d9acd88c47bd8c575996a7fb85d550b4' WHERE `id` = '3668daf0338a479985f455c8e61d6558'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=2170938bae373c66f8f51eceeed6982b' WHERE `id` = '5ba858277fa44aaf958b32055468f52a'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=880641f8e562ed8577fb8d49d9df4bf3' WHERE `id` = '0a9fab6f3ac84d8c95b08a05aa8a19fc'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=4f355a9c8b6294fbb2ad2e6064b03a33' WHERE `id` = 'e3399da9b2a64b28846e4f50df3cc4dd'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=44099a250bf70bd2f054ef0b81d4b099' WHERE `id` = '8bfae2e4dabb48528ee64963b7112d61'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=5567ec9af0df645c587da7643ec43c56' WHERE `id` = 'a58a5431a08e402eb6adc5e14eec1cb5'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=0442c4741e1fad06e916c9a3e3ff6d33' WHERE `id` = 'f3c752d16ca74e06acf859b9a3a08188'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=c6754f1997880df46a8fae7d038b6a38' WHERE `id` = '26e7dc9c76694fb0837237b071bc4a03'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=53d254c917da9222f61ef9e198de80a5' WHERE `id` = '68ac8d18e53b43e1829274c17836df6d'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=863a32cfe3e2441b11d7ef582efe19a9' WHERE `id` = 'f30cfea57bc44aac88824ee6fa0803ee'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=7575966ac094d6e6b89d09dd4e875885' WHERE `id` = 'f50b3389bbed484ebe3098745371e511'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=69a76d56735635ec225b70051e073309' WHERE `id` = 'a0f47f6a6d734c8b9c6ce5c0dfd80001'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=68d074dea722443c5150fe3b832be738' WHERE `id` = 'b7c63f0c73a44a9a8c4f3d3bb1a10001'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=f4397f0e4af50a213f4789e8c0510af6' WHERE `id` = 'b7c63f0c73a44a9a8c4f3d3bb1a10006'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=f6607e7d1aa359689d64f4cd45383cb5' WHERE `id` = 'd3020be8291342538d40aa8f1ae7813f'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=4bd725febe3e8105556959f7af988987' WHERE `id` = '80734d9573e34285859c5fcd70d60fe1'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=9bfe408b11963fc3da990e0edbbc4250' WHERE `id` = '08793469d707454eb7a692b13609230b'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=d5cc82d4fdeba1c97bfaa1f2ba0ff48e' WHERE `id` = '3af0f040336741ff9dd754ccd83ab325'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=a2e470e73fba0a9029f062ca161aaabe' WHERE `id` = '82946217f37e466d87f123c6987991e1'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=2adf711e5009bf7a2b74245ffba749bf' WHERE `id` = '3e9a7611fa96490d8adc393387b1d65a'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=d390359d7c76b5a7406e2634b77031aa' WHERE `id` = '47a997dcc93945b293f725d7171ff418'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=f695e0abe3121d36242fd899c693c49b' WHERE `id` = '2a93542d26c140e79e615edaa4ddda58'; + +COMMIT; diff --git a/src/main/resources/db/menu/update_sys_menu_pic_icons_minio.sql b/src/main/resources/db/menu/update_sys_menu_pic_icons_minio.sql new file mode 100644 index 00000000..1935ed2b --- /dev/null +++ b/src/main/resources/db/menu/update_sys_menu_pic_icons_minio.sql @@ -0,0 +1,481 @@ +-- 工会系统H5菜单图标MinIO文件记录及菜单图标更新脚本 +-- 图标对象目录: menu-icons/v4/ +SET NAMES utf8mb4; +START TRANSACTION; + +INSERT INTO `sys_file` (`id`, `engine`, `bucket`, `name`, `suffix`, `sizeKb`, `sizeInfo`, `objName`, `storagePath`, `downloadPath`, `thumbnail`, `extJson`, `createdBy`, `createdAt`, `updatedBy`, `updatedAt`, `delFlag`) VALUES +('57ef8603692af334526e191c1e81301e', 'MINIO', 'cug', '001_教代会管理_2e6f3930.png', 'png', '44', '44.3 kB', '57ef8603692af334526e191c1e81301e.png', '/menu-icons/v4/57ef8603692af334526e191c1e81301e.png', '/platform/sys/file/download?id=57ef8603692af334526e191c1e81301e', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('8b152a98cf83bc6c20d2bb488fc48515', 'MINIO', 'cug', '002_子女信息管理_64ace209.png', 'png', '45', '45.3 kB', '8b152a98cf83bc6c20d2bb488fc48515.png', '/menu-icons/v4/8b152a98cf83bc6c20d2bb488fc48515.png', '/platform/sys/file/download?id=8b152a98cf83bc6c20d2bb488fc48515', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('e4cf62b0ac16798727612b74fbabac4d', 'MINIO', 'cug', '003_信息填写_eb18aa57.png', 'png', '40', '40.3 kB', 'e4cf62b0ac16798727612b74fbabac4d.png', '/menu-icons/v4/e4cf62b0ac16798727612b74fbabac4d.png', '/platform/sys/file/download?id=e4cf62b0ac16798727612b74fbabac4d', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('a8c6f9352f56519b4914ca02ab274242', 'MINIO', 'cug', '004_我的子女_835cb68e.png', 'png', '44', '44.2 kB', 'a8c6f9352f56519b4914ca02ab274242.png', '/menu-icons/v4/a8c6f9352f56519b4914ca02ab274242.png', '/platform/sys/file/download?id=a8c6f9352f56519b4914ca02ab274242', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('2b74945f5c0741be5a67be574c4eb3d3', 'MINIO', 'cug', '005_信息管理_10ebaa5b.png', 'png', '58', '58.3 kB', '2b74945f5c0741be5a67be574c4eb3d3.png', '/menu-icons/v4/2b74945f5c0741be5a67be574c4eb3d3.png', '/platform/sys/file/download?id=2b74945f5c0741be5a67be574c4eb3d3', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('c4817a606d8e722e939811cdb8bb0208', 'MINIO', 'cug', '006_子女入学_e7cf2f56.png', 'png', '45', '45.3 kB', 'c4817a606d8e722e939811cdb8bb0208.png', '/menu-icons/v4/c4817a606d8e722e939811cdb8bb0208.png', '/platform/sys/file/download?id=c4817a606d8e722e939811cdb8bb0208', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('7d0d5d3f95faf51875c8cebf5ef23181', 'MINIO', 'cug', '007_入学申报_40a293cc.png', 'png', '40', '40.2 kB', '7d0d5d3f95faf51875c8cebf5ef23181.png', '/menu-icons/v4/7d0d5d3f95faf51875c8cebf5ef23181.png', '/platform/sys/file/download?id=7d0d5d3f95faf51875c8cebf5ef23181', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('a472973503af14a20ae0f8f1c7d03634', 'MINIO', 'cug', '008_我的申报_2666d0ae.png', 'png', '41', '41.1 kB', 'a472973503af14a20ae0f8f1c7d03634.png', '/menu-icons/v4/a472973503af14a20ae0f8f1c7d03634.png', '/platform/sys/file/download?id=a472973503af14a20ae0f8f1c7d03634', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('8462dbea71f06a7257864c9bb77c7f9e', 'MINIO', 'cug', '009_分工会审核_ea574347.png', 'png', '44', '44.0 kB', '8462dbea71f06a7257864c9bb77c7f9e.png', '/menu-icons/v4/8462dbea71f06a7257864c9bb77c7f9e.png', '/platform/sys/file/download?id=8462dbea71f06a7257864c9bb77c7f9e', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('823b3b7f7707774625bb7fe9f5ebc416', 'MINIO', 'cug', '010_校工会审核_9441d18c.png', 'png', '44', '44.2 kB', '823b3b7f7707774625bb7fe9f5ebc416.png', '/menu-icons/v4/823b3b7f7707774625bb7fe9f5ebc416.png', '/platform/sys/file/download?id=823b3b7f7707774625bb7fe9f5ebc416', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('4b0a707d816c0f3abc6ff7fc3092e819', 'MINIO', 'cug', '011_教代会_44a59a2b.png', 'png', '44', '44.3 kB', '4b0a707d816c0f3abc6ff7fc3092e819.png', '/menu-icons/v4/4b0a707d816c0f3abc6ff7fc3092e819.png', '/platform/sys/file/download?id=4b0a707d816c0f3abc6ff7fc3092e819', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('3ea367f14cfd98eddb8e3fd685371fad', 'MINIO', 'cug', '012_代表阅览_1c2aee7d.png', 'png', '44', '43.5 kB', '3ea367f14cfd98eddb8e3fd685371fad.png', '/menu-icons/v4/3ea367f14cfd98eddb8e3fd685371fad.png', '/platform/sys/file/download?id=3ea367f14cfd98eddb8e3fd685371fad', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('6f35cd276d38e408522f4411a972ba9f', 'MINIO', 'cug', '013_提案管理_11db6856.png', 'png', '46', '46.3 kB', '6f35cd276d38e408522f4411a972ba9f.png', '/menu-icons/v4/6f35cd276d38e408522f4411a972ba9f.png', '/platform/sys/file/download?id=6f35cd276d38e408522f4411a972ba9f', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('efe85251bd9233d4c8d7e7f0fd17c17d', 'MINIO', 'cug', '014_撰写提案_d5d7964e.png', 'png', '45', '44.8 kB', 'efe85251bd9233d4c8d7e7f0fd17c17d.png', '/menu-icons/v4/efe85251bd9233d4c8d7e7f0fd17c17d.png', '/platform/sys/file/download?id=efe85251bd9233d4c8d7e7f0fd17c17d', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('827b20f69981eadcab0af82c6853e899', 'MINIO', 'cug', '015_我的提案_c4411525.png', 'png', '45', '45.3 kB', '827b20f69981eadcab0af82c6853e899.png', '/menu-icons/v4/827b20f69981eadcab0af82c6853e899.png', '/platform/sys/file/download?id=827b20f69981eadcab0af82c6853e899', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('b054908747aa76d3bbc2f94072ecdea9', 'MINIO', 'cug', '016_提案附议_eb4ed857.png', 'png', '46', '46.3 kB', 'b054908747aa76d3bbc2f94072ecdea9.png', '/menu-icons/v4/b054908747aa76d3bbc2f94072ecdea9.png', '/platform/sys/file/download?id=b054908747aa76d3bbc2f94072ecdea9', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('4a7ed34b91ecfa20f52055d031beac71', 'MINIO', 'cug', '017_团长审核_c4b99724.png', 'png', '45', '44.8 kB', '4a7ed34b91ecfa20f52055d031beac71.png', '/menu-icons/v4/4a7ed34b91ecfa20f52055d031beac71.png', '/platform/sys/file/download?id=4a7ed34b91ecfa20f52055d031beac71', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('81ffd7b1eb7b13353557efdce30a7ee2', 'MINIO', 'cug', '018_承办单位答复_56835d07.png', 'png', '45', '45.5 kB', '81ffd7b1eb7b13353557efdce30a7ee2.png', '/menu-icons/v4/81ffd7b1eb7b13353557efdce30a7ee2.png', '/platform/sys/file/download?id=81ffd7b1eb7b13353557efdce30a7ee2', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('5221f202257e65e39602d70d218c41b7', 'MINIO', 'cug', '019_分管校领导审批_304278a0.png', 'png', '45', '44.8 kB', '5221f202257e65e39602d70d218c41b7.png', '/menu-icons/v4/5221f202257e65e39602d70d218c41b7.png', '/platform/sys/file/download?id=5221f202257e65e39602d70d218c41b7', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('d60339858c907ede5bce05d675de9819', 'MINIO', 'cug', '020_反馈评价_2b9b7227.png', 'png', '45', '45.5 kB', 'd60339858c907ede5bce05d675de9819.png', '/menu-icons/v4/d60339858c907ede5bce05d675de9819.png', '/platform/sys/file/download?id=d60339858c907ede5bce05d675de9819', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('0718d029aeaf7fbf5fbf7442f885c116', 'MINIO', 'cug', '021_提案管理_ff182281.png', 'png', '46', '46.3 kB', '0718d029aeaf7fbf5fbf7442f885c116.png', '/menu-icons/v4/0718d029aeaf7fbf5fbf7442f885c116.png', '/platform/sys/file/download?id=0718d029aeaf7fbf5fbf7442f885c116', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('8370b80ebdf5dd5b85a8ba065a6b2133', 'MINIO', 'cug', '022_承办单位意见_7c79171d.png', 'png', '45', '45.5 kB', '8370b80ebdf5dd5b85a8ba065a6b2133.png', '/menu-icons/v4/8370b80ebdf5dd5b85a8ba065a6b2133.png', '/platform/sys/file/download?id=8370b80ebdf5dd5b85a8ba065a6b2133', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('9d3927e91ed007875a001344f061039a', 'MINIO', 'cug', '023_费用报销管理_32a51579.png', 'png', '53', '52.8 kB', '9d3927e91ed007875a001344f061039a.png', '/menu-icons/v4/9d3927e91ed007875a001344f061039a.png', '/platform/sys/file/download?id=9d3927e91ed007875a001344f061039a', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('d030abf3da1bf8c00d93e78586f4a9bc', 'MINIO', 'cug', '024_报销申请_6bdef282.png', 'png', '50', '50.0 kB', 'd030abf3da1bf8c00d93e78586f4a9bc.png', '/menu-icons/v4/d030abf3da1bf8c00d93e78586f4a9bc.png', '/platform/sys/file/download?id=d030abf3da1bf8c00d93e78586f4a9bc', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('822abad93728db1326baa27b4f2dbe04', 'MINIO', 'cug', '025_撰写提案_eeaf3366.png', 'png', '45', '44.8 kB', '822abad93728db1326baa27b4f2dbe04.png', '/menu-icons/v4/822abad93728db1326baa27b4f2dbe04.png', '/platform/sys/file/download?id=822abad93728db1326baa27b4f2dbe04', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('541f9d25077780099d4e4594bea2bb4e', 'MINIO', 'cug', '026_我的申请_b27178ff.png', 'png', '41', '41.1 kB', '541f9d25077780099d4e4594bea2bb4e.png', '/menu-icons/v4/541f9d25077780099d4e4594bea2bb4e.png', '/platform/sys/file/download?id=541f9d25077780099d4e4594bea2bb4e', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('47148702a76cc6ea8e7807ac5d5eb6e1', 'MINIO', 'cug', '027_社团审核_87611b6d.png', 'png', '45', '44.7 kB', '47148702a76cc6ea8e7807ac5d5eb6e1.png', '/menu-icons/v4/47148702a76cc6ea8e7807ac5d5eb6e1.png', '/platform/sys/file/download?id=47148702a76cc6ea8e7807ac5d5eb6e1', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('d4e6b7275313903fb7ff9f40046f9ed6', 'MINIO', 'cug', '028_社团分管主席审核_d0ee5ab9.png', 'png', '42', '42.2 kB', 'd4e6b7275313903fb7ff9f40046f9ed6.png', '/menu-icons/v4/d4e6b7275313903fb7ff9f40046f9ed6.png', '/platform/sys/file/download?id=d4e6b7275313903fb7ff9f40046f9ed6', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('153ee7433a7b441bcf0df449a93cf07a', 'MINIO', 'cug', '029_分工会审核_af963d19.png', 'png', '44', '44.0 kB', '153ee7433a7b441bcf0df449a93cf07a.png', '/menu-icons/v4/153ee7433a7b441bcf0df449a93cf07a.png', '/platform/sys/file/download?id=153ee7433a7b441bcf0df449a93cf07a', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('88d0311f37bd0d4afb15d3e7e1321dae', 'MINIO', 'cug', '030_校工会出纳审核_f7a890c7.png', 'png', '44', '44.4 kB', '88d0311f37bd0d4afb15d3e7e1321dae.png', '/menu-icons/v4/88d0311f37bd0d4afb15d3e7e1321dae.png', '/platform/sys/file/download?id=88d0311f37bd0d4afb15d3e7e1321dae', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('481b4f5262903cbc2a4c4be16144356d', 'MINIO', 'cug', '031_校工会会计审核_41410dbe.png', 'png', '45', '44.5 kB', '481b4f5262903cbc2a4c4be16144356d.png', '/menu-icons/v4/481b4f5262903cbc2a4c4be16144356d.png', '/platform/sys/file/download?id=481b4f5262903cbc2a4c4be16144356d', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('43edf5cc953088145c381e89d1a2dbe5', 'MINIO', 'cug', '032_校工会主席终审_5e0c5335.png', 'png', '44', '44.1 kB', '43edf5cc953088145c381e89d1a2dbe5.png', '/menu-icons/v4/43edf5cc953088145c381e89d1a2dbe5.png', '/platform/sys/file/download?id=43edf5cc953088145c381e89d1a2dbe5', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('00a707dc661b56698cfa957da4d635e3', 'MINIO', 'cug', '033_社团组织管理_b8bcaa94.png', 'png', '44', '44.3 kB', '00a707dc661b56698cfa957da4d635e3.png', '/menu-icons/v4/00a707dc661b56698cfa957da4d635e3.png', '/platform/sys/file/download?id=00a707dc661b56698cfa957da4d635e3', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('d8cf0cffdced461cc4ba8fa4314b35de', 'MINIO', 'cug', '034_社团入会_7af124e1.png', 'png', '44', '44.3 kB', 'd8cf0cffdced461cc4ba8fa4314b35de.png', '/menu-icons/v4/d8cf0cffdced461cc4ba8fa4314b35de.png', '/platform/sys/file/download?id=d8cf0cffdced461cc4ba8fa4314b35de', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('b269cb65dc856cd4fe21fa05de4fd27e', 'MINIO', 'cug', '035_我的申请_2de433e4.png', 'png', '41', '41.1 kB', 'b269cb65dc856cd4fe21fa05de4fd27e.png', '/menu-icons/v4/b269cb65dc856cd4fe21fa05de4fd27e.png', '/platform/sys/file/download?id=b269cb65dc856cd4fe21fa05de4fd27e', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('67dc9fac0d11849f8648dae234270135', 'MINIO', 'cug', '036_社团审核_84064805.png', 'png', '45', '44.7 kB', '67dc9fac0d11849f8648dae234270135.png', '/menu-icons/v4/67dc9fac0d11849f8648dae234270135.png', '/platform/sys/file/download?id=67dc9fac0d11849f8648dae234270135', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('a34ed81f00b2edf70da74dbb8d6b8c99', 'MINIO', 'cug', '037_校工会审核_dbd21f6b.png', 'png', '44', '44.2 kB', 'a34ed81f00b2edf70da74dbb8d6b8c99.png', '/menu-icons/v4/a34ed81f00b2edf70da74dbb8d6b8c99.png', '/platform/sys/file/download?id=a34ed81f00b2edf70da74dbb8d6b8c99', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('fcbef87b9f75c924b06fff2a03246b42', 'MINIO', 'cug', '038_我的社团_e585d2ca.png', 'png', '44', '43.9 kB', 'fcbef87b9f75c924b06fff2a03246b42.png', '/menu-icons/v4/fcbef87b9f75c924b06fff2a03246b42.png', '/platform/sys/file/download?id=fcbef87b9f75c924b06fff2a03246b42', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('ba467095d0ccc678e34979ba679ea020', 'MINIO', 'cug', '039_会员管理_7e2b850c.png', 'png', '44', '44.3 kB', 'ba467095d0ccc678e34979ba679ea020.png', '/menu-icons/v4/ba467095d0ccc678e34979ba679ea020.png', '/platform/sys/file/download?id=ba467095d0ccc678e34979ba679ea020', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('b189ac3e64ea6b43a86324a2a57b0595', 'MINIO', 'cug', '040_会员入会_8f27ac9f.png', 'png', '44', '44.3 kB', 'b189ac3e64ea6b43a86324a2a57b0595.png', '/menu-icons/v4/b189ac3e64ea6b43a86324a2a57b0595.png', '/platform/sys/file/download?id=b189ac3e64ea6b43a86324a2a57b0595', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('0e14db530463cbcdeb4f23712ce75226', 'MINIO', 'cug', '041_我的入会_313842fc.png', 'png', '44', '43.9 kB', '0e14db530463cbcdeb4f23712ce75226.png', '/menu-icons/v4/0e14db530463cbcdeb4f23712ce75226.png', '/platform/sys/file/download?id=0e14db530463cbcdeb4f23712ce75226', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('e05e3b438130ad43908f64bca84ccd4f', 'MINIO', 'cug', '042_分工会审核_dcf6c190.png', 'png', '44', '44.0 kB', 'e05e3b438130ad43908f64bca84ccd4f.png', '/menu-icons/v4/e05e3b438130ad43908f64bca84ccd4f.png', '/platform/sys/file/download?id=e05e3b438130ad43908f64bca84ccd4f', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('9436a2f85765993e4c11c53564d3d57f', 'MINIO', 'cug', '043_校工会审核_13d50644.png', 'png', '44', '44.2 kB', '9436a2f85765993e4c11c53564d3d57f.png', '/menu-icons/v4/9436a2f85765993e4c11c53564d3d57f.png', '/platform/sys/file/download?id=9436a2f85765993e4c11c53564d3d57f', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('5ab1059bf731e1a99e5821b16b60f815', 'MINIO', 'cug', '044_会员档案_c547be26.png', 'png', '44', '43.7 kB', '5ab1059bf731e1a99e5821b16b60f815.png', '/menu-icons/v4/5ab1059bf731e1a99e5821b16b60f815.png', '/platform/sys/file/download?id=5ab1059bf731e1a99e5821b16b60f815', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('e10382c1b724f394a34d2ee7f4c1a4b3', 'MINIO', 'cug', '045_数据看板_f3ae0a07.png', 'png', '56', '55.7 kB', 'e10382c1b724f394a34d2ee7f4c1a4b3.png', '/menu-icons/v4/e10382c1b724f394a34d2ee7f4c1a4b3.png', '/platform/sys/file/download?id=e10382c1b724f394a34d2ee7f4c1a4b3', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('ec82746b31fc662da299baa4e4546323', 'MINIO', 'cug', '046_工会小组审核_00448f69.png', 'png', '43', '42.7 kB', 'ec82746b31fc662da299baa4e4546323.png', '/menu-icons/v4/ec82746b31fc662da299baa4e4546323.png', '/platform/sys/file/download?id=ec82746b31fc662da299baa4e4546323', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('fad8a880d74a74d77cd4f5a5dfab809b', 'MINIO', 'cug', '047_职工慰问_024811fd.png', 'png', '41', '41.4 kB', 'fad8a880d74a74d77cd4f5a5dfab809b.png', '/menu-icons/v4/fad8a880d74a74d77cd4f5a5dfab809b.png', '/platform/sys/file/download?id=fad8a880d74a74d77cd4f5a5dfab809b', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('a14e00ff8a03f307243ce45bcb5b8c5d', 'MINIO', 'cug', '048_慰问申请_9bfd257e.png', 'png', '39', '39.3 kB', 'a14e00ff8a03f307243ce45bcb5b8c5d.png', '/menu-icons/v4/a14e00ff8a03f307243ce45bcb5b8c5d.png', '/platform/sys/file/download?id=a14e00ff8a03f307243ce45bcb5b8c5d', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('67e6671dc1f2220c7e10bfc62e3675b1', 'MINIO', 'cug', '049_我的申请_7492992b.png', 'png', '41', '41.1 kB', '67e6671dc1f2220c7e10bfc62e3675b1.png', '/menu-icons/v4/67e6671dc1f2220c7e10bfc62e3675b1.png', '/platform/sys/file/download?id=67e6671dc1f2220c7e10bfc62e3675b1', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('b3e5125f364f35a8dabaa5e7dcc46516', 'MINIO', 'cug', '050_分工会审核_330e42e0.png', 'png', '44', '44.0 kB', 'b3e5125f364f35a8dabaa5e7dcc46516.png', '/menu-icons/v4/b3e5125f364f35a8dabaa5e7dcc46516.png', '/platform/sys/file/download?id=b3e5125f364f35a8dabaa5e7dcc46516', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('d04a2c47e9c184a4d044abd7526013cb', 'MINIO', 'cug', '051_校工会预审_87a2dcfa.png', 'png', '44', '44.2 kB', 'd04a2c47e9c184a4d044abd7526013cb.png', '/menu-icons/v4/d04a2c47e9c184a4d044abd7526013cb.png', '/platform/sys/file/download?id=d04a2c47e9c184a4d044abd7526013cb', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('2acd67f07be21392efbd9951243d438d', 'MINIO', 'cug', '052_校工会审核_c269f94a.png', 'png', '44', '44.2 kB', '2acd67f07be21392efbd9951243d438d.png', '/menu-icons/v4/2acd67f07be21392efbd9951243d438d.png', '/platform/sys/file/download?id=2acd67f07be21392efbd9951243d438d', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('036d3ba76739b6e8263087ec7a4fe0f5', 'MINIO', 'cug', '053_困难帮扶_6ddda191.png', 'png', '41', '41.4 kB', '036d3ba76739b6e8263087ec7a4fe0f5.png', '/menu-icons/v4/036d3ba76739b6e8263087ec7a4fe0f5.png', '/platform/sys/file/download?id=036d3ba76739b6e8263087ec7a4fe0f5', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('34d7aa98a4e1bed661d925e6c6010045', 'MINIO', 'cug', '054_帮扶申请_3cf7ee61.png', 'png', '39', '39.3 kB', '34d7aa98a4e1bed661d925e6c6010045.png', '/menu-icons/v4/34d7aa98a4e1bed661d925e6c6010045.png', '/platform/sys/file/download?id=34d7aa98a4e1bed661d925e6c6010045', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('d450c3676e3934d873f00c938a44c20b', 'MINIO', 'cug', '055_帮扶申请记录_51b21e97.png', 'png', '39', '39.3 kB', 'd450c3676e3934d873f00c938a44c20b.png', '/menu-icons/v4/d450c3676e3934d873f00c938a44c20b.png', '/platform/sys/file/download?id=d450c3676e3934d873f00c938a44c20b', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('d8d831521cae0d54bbe75360cc6db970', 'MINIO', 'cug', '056_分工会审核_23d30124.png', 'png', '44', '44.0 kB', 'd8d831521cae0d54bbe75360cc6db970.png', '/menu-icons/v4/d8d831521cae0d54bbe75360cc6db970.png', '/platform/sys/file/download?id=d8d831521cae0d54bbe75360cc6db970', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('839524da718e966329e94e5db57e751f', 'MINIO', 'cug', '057_二级党组织审核_d736e4d7.png', 'png', '45', '44.6 kB', '839524da718e966329e94e5db57e751f.png', '/menu-icons/v4/839524da718e966329e94e5db57e751f.png', '/platform/sys/file/download?id=839524da718e966329e94e5db57e751f', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('487eb6c9241caeacd5dbe198b2fc29f5', 'MINIO', 'cug', '058_校工会审核_35a9239d.png', 'png', '44', '44.2 kB', '487eb6c9241caeacd5dbe198b2fc29f5.png', '/menu-icons/v4/487eb6c9241caeacd5dbe198b2fc29f5.png', '/platform/sys/file/download?id=487eb6c9241caeacd5dbe198b2fc29f5', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('1df1f8c9847f2f2f3fdbb031f5b9b49d', 'MINIO', 'cug', '059_体检管理_d4cab4ba.png', 'png', '45', '44.5 kB', '1df1f8c9847f2f2f3fdbb031f5b9b49d.png', '/menu-icons/v4/1df1f8c9847f2f2f3fdbb031f5b9b49d.png', '/platform/sys/file/download?id=1df1f8c9847f2f2f3fdbb031f5b9b49d', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('e3fbc1ce067437cce9ced286d053fb88', 'MINIO', 'cug', '060_体检项目_0a2bfc85.png', 'png', '45', '44.5 kB', 'e3fbc1ce067437cce9ced286d053fb88.png', '/menu-icons/v4/e3fbc1ce067437cce9ced286d053fb88.png', '/platform/sys/file/download?id=e3fbc1ce067437cce9ced286d053fb88', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('5f5a11d2aabd670855a205115a132223', 'MINIO', 'cug', '061_我的体检_c03fbf17.png', 'png', '43', '42.8 kB', '5f5a11d2aabd670855a205115a132223.png', '/menu-icons/v4/5f5a11d2aabd670855a205115a132223.png', '/platform/sys/file/download?id=5f5a11d2aabd670855a205115a132223', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('f7093003078726bb6143f7ee3099ceef', 'MINIO', 'cug', '062_心理咨询_56620c51.png', 'png', '45', '44.5 kB', 'f7093003078726bb6143f7ee3099ceef.png', '/menu-icons/v4/f7093003078726bb6143f7ee3099ceef.png', '/platform/sys/file/download?id=f7093003078726bb6143f7ee3099ceef', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('ebf8e926d86c3328ea6da6b6bb377344', 'MINIO', 'cug', '063_我要预约_ef46a587.png', 'png', '53', '53.2 kB', 'ebf8e926d86c3328ea6da6b6bb377344.png', '/menu-icons/v4/ebf8e926d86c3328ea6da6b6bb377344.png', '/platform/sys/file/download?id=ebf8e926d86c3328ea6da6b6bb377344', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('1068cd8f373106ef19dd0e6f7ed5e0c5', 'MINIO', 'cug', '064_预约记录_c6a2ec8d.png', 'png', '53', '53.2 kB', '1068cd8f373106ef19dd0e6f7ed5e0c5.png', '/menu-icons/v4/1068cd8f373106ef19dd0e6f7ed5e0c5.png', '/platform/sys/file/download?id=1068cd8f373106ef19dd0e6f7ed5e0c5', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('2d4f07ed1e1ebb4f095cbbbcabe13963', 'MINIO', 'cug', '065_发帖咨询_7b21d468.png', 'png', '46', '46.3 kB', '2d4f07ed1e1ebb4f095cbbbcabe13963.png', '/menu-icons/v4/2d4f07ed1e1ebb4f095cbbbcabe13963.png', '/platform/sys/file/download?id=2d4f07ed1e1ebb4f095cbbbcabe13963', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('63db1069887f9acf02edeaccb2a8c9ed', 'MINIO', 'cug', '066_咨询回复_43f06636.png', 'png', '46', '46.3 kB', '63db1069887f9acf02edeaccb2a8c9ed.png', '/menu-icons/v4/63db1069887f9acf02edeaccb2a8c9ed.png', '/platform/sys/file/download?id=63db1069887f9acf02edeaccb2a8c9ed', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('698e1fc9c201e611e8e7cebe9dadd8ef', 'MINIO', 'cug', '067_基层双代会_b6c224df.png', 'png', '44', '44.3 kB', '698e1fc9c201e611e8e7cebe9dadd8ef.png', '/menu-icons/v4/698e1fc9c201e611e8e7cebe9dadd8ef.png', '/platform/sys/file/download?id=698e1fc9c201e611e8e7cebe9dadd8ef', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('360b8b91280de12276c110201c8d7425', 'MINIO', 'cug', '068_法律援助_297400c8.png', 'png', '46', '46.3 kB', '360b8b91280de12276c110201c8d7425.png', '/menu-icons/v4/360b8b91280de12276c110201c8d7425.png', '/platform/sys/file/download?id=360b8b91280de12276c110201c8d7425', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('25454e316e3d9cf3f1520797b507efd8', 'MINIO', 'cug', '069_我要预约_aa0ffd36.png', 'png', '53', '53.2 kB', '25454e316e3d9cf3f1520797b507efd8.png', '/menu-icons/v4/25454e316e3d9cf3f1520797b507efd8.png', '/platform/sys/file/download?id=25454e316e3d9cf3f1520797b507efd8', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('cb46561b1e37852cbc90815ac66c3351', 'MINIO', 'cug', '070_预约记录_7dc21dca.png', 'png', '53', '53.2 kB', 'cb46561b1e37852cbc90815ac66c3351.png', '/menu-icons/v4/cb46561b1e37852cbc90815ac66c3351.png', '/platform/sys/file/download?id=cb46561b1e37852cbc90815ac66c3351', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('e12a96173d033e50aafbcc9356c811c4', 'MINIO', 'cug', '071_发帖咨询_939595b4.png', 'png', '46', '46.3 kB', 'e12a96173d033e50aafbcc9356c811c4.png', '/menu-icons/v4/e12a96173d033e50aafbcc9356c811c4.png', '/platform/sys/file/download?id=e12a96173d033e50aafbcc9356c811c4', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('d5d5832a552bf8d434b1c6debd777da4', 'MINIO', 'cug', '072_咨询回复_d073c1d8.png', 'png', '46', '46.3 kB', 'd5d5832a552bf8d434b1c6debd777da4.png', '/menu-icons/v4/d5d5832a552bf8d434b1c6debd777da4.png', '/platform/sys/file/download?id=d5d5832a552bf8d434b1c6debd777da4', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('7d27b774e627b02cda5df9f9970016f7', 'MINIO', 'cug', '073_基金会员_3f88a4f6.png', 'png', '53', '52.8 kB', '7d27b774e627b02cda5df9f9970016f7.png', '/menu-icons/v4/7d27b774e627b02cda5df9f9970016f7.png', '/platform/sys/file/download?id=7d27b774e627b02cda5df9f9970016f7', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('fdbf15abdefc00b3388e5fadf9bd8740', 'MINIO', 'cug', '074_会员申请_8a77d32c.png', 'png', '43', '42.8 kB', 'fdbf15abdefc00b3388e5fadf9bd8740.png', '/menu-icons/v4/fdbf15abdefc00b3388e5fadf9bd8740.png', '/platform/sys/file/download?id=fdbf15abdefc00b3388e5fadf9bd8740', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('00147780b5ad42a6b07c1ac54569792f', 'MINIO', 'cug', '075_我的申请_44423a17.png', 'png', '41', '41.1 kB', '00147780b5ad42a6b07c1ac54569792f.png', '/menu-icons/v4/00147780b5ad42a6b07c1ac54569792f.png', '/platform/sys/file/download?id=00147780b5ad42a6b07c1ac54569792f', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('c42ada04526004c863e50d3d17b6e408', 'MINIO', 'cug', '076_分工会审核_3e102653.png', 'png', '44', '44.0 kB', 'c42ada04526004c863e50d3d17b6e408.png', '/menu-icons/v4/c42ada04526004c863e50d3d17b6e408.png', '/platform/sys/file/download?id=c42ada04526004c863e50d3d17b6e408', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('3b9f9415e36b57b73d02ef674a9c7616', 'MINIO', 'cug', '077_会员管理_ac2516a6.png', 'png', '44', '44.3 kB', '3b9f9415e36b57b73d02ef674a9c7616.png', '/menu-icons/v4/3b9f9415e36b57b73d02ef674a9c7616.png', '/platform/sys/file/download?id=3b9f9415e36b57b73d02ef674a9c7616', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('09e04f045df284eaaf281c701a61ce65', 'MINIO', 'cug', '078_数据看板_59d6ba7c.png', 'png', '56', '55.7 kB', '09e04f045df284eaaf281c701a61ce65.png', '/menu-icons/v4/09e04f045df284eaaf281c701a61ce65.png', '/platform/sys/file/download?id=09e04f045df284eaaf281c701a61ce65', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('28c9f1b52e47184a9cba0dd3720fb9aa', 'MINIO', 'cug', '079_互管会审核_6b5adca7.png', 'png', '44', '44.0 kB', '28c9f1b52e47184a9cba0dd3720fb9aa.png', '/menu-icons/v4/28c9f1b52e47184a9cba0dd3720fb9aa.png', '/platform/sys/file/download?id=28c9f1b52e47184a9cba0dd3720fb9aa', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('07ef4713927c1ff868c766c723ed1acc', 'MINIO', 'cug', '080_离退休审核_57566021.png', 'png', '45', '44.5 kB', '07ef4713927c1ff868c766c723ed1acc.png', '/menu-icons/v4/07ef4713927c1ff868c766c723ed1acc.png', '/platform/sys/file/download?id=07ef4713927c1ff868c766c723ed1acc', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('76e0dd9b54251141b235975d31c05d12', 'MINIO', 'cug', '081_会员入会_1375120f.png', 'png', '44', '44.3 kB', '76e0dd9b54251141b235975d31c05d12.png', '/menu-icons/v4/76e0dd9b54251141b235975d31c05d12.png', '/platform/sys/file/download?id=76e0dd9b54251141b235975d31c05d12', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('857956ba68605f43198123ed76e46f34', 'MINIO', 'cug', '082_会务管理_2c61ac06.png', 'png', '55', '54.8 kB', '857956ba68605f43198123ed76e46f34.png', '/menu-icons/v4/857956ba68605f43198123ed76e46f34.png', '/platform/sys/file/download?id=857956ba68605f43198123ed76e46f34', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('9d67a619eff5b7b45fe8676cb32091fe', 'MINIO', 'cug', '083_体育活动_893016b4.png', 'png', '42', '41.8 kB', '9d67a619eff5b7b45fe8676cb32091fe.png', '/menu-icons/v4/9d67a619eff5b7b45fe8676cb32091fe.png', '/platform/sys/file/download?id=9d67a619eff5b7b45fe8676cb32091fe', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('12f9ae93e7b07a9b0f20f2556050ed6c', 'MINIO', 'cug', '084_活动报名_dbaba7b3.png', 'png', '42', '41.8 kB', '12f9ae93e7b07a9b0f20f2556050ed6c.png', '/menu-icons/v4/12f9ae93e7b07a9b0f20f2556050ed6c.png', '/platform/sys/file/download?id=12f9ae93e7b07a9b0f20f2556050ed6c', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('d52462ba5ec9b1373d739433de2da30c', 'MINIO', 'cug', '085_文化活动_898f95af.png', 'png', '42', '42.0 kB', 'd52462ba5ec9b1373d739433de2da30c.png', '/menu-icons/v4/d52462ba5ec9b1373d739433de2da30c.png', '/platform/sys/file/download?id=d52462ba5ec9b1373d739433de2da30c', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('3419504fe535f6888355d9275a72630b', 'MINIO', 'cug', '086_品牌活动_fb16e44e.png', 'png', '41', '41.1 kB', '3419504fe535f6888355d9275a72630b.png', '/menu-icons/v4/3419504fe535f6888355d9275a72630b.png', '/platform/sys/file/download?id=3419504fe535f6888355d9275a72630b', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('0a244bf26674a5598cd3add153438045', 'MINIO', 'cug', '087_活动报名_42d1b0cc.png', 'png', '42', '41.8 kB', '0a244bf26674a5598cd3add153438045.png', '/menu-icons/v4/0a244bf26674a5598cd3add153438045.png', '/platform/sys/file/download?id=0a244bf26674a5598cd3add153438045', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('58f339cfa0455455027c304a61262293', 'MINIO', 'cug', '088_我的活动_811cf28c.png', 'png', '42', '42.3 kB', '58f339cfa0455455027c304a61262293.png', '/menu-icons/v4/58f339cfa0455455027c304a61262293.png', '/platform/sys/file/download?id=58f339cfa0455455027c304a61262293', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('d3133639fcd76e0afc139536433f4082', 'MINIO', 'cug', '089_惠民服务_57accf35.png', 'png', '46', '45.7 kB', 'd3133639fcd76e0afc139536433f4082.png', '/menu-icons/v4/d3133639fcd76e0afc139536433f4082.png', '/platform/sys/file/download?id=d3133639fcd76e0afc139536433f4082', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('cef1ccb8a9cc8804e9c7ebe9a77228e3', 'MINIO', 'cug', '090_我的惠民_05f829da.png', 'png', '44', '43.7 kB', 'cef1ccb8a9cc8804e9c7ebe9a77228e3.png', '/menu-icons/v4/cef1ccb8a9cc8804e9c7ebe9a77228e3.png', '/platform/sys/file/download?id=cef1ccb8a9cc8804e9c7ebe9a77228e3', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('221eb720d89330b020831977901ffb01', 'MINIO', 'cug', '091_理论学习_a8966b0e.png', 'png', '43', '43.3 kB', '221eb720d89330b020831977901ffb01.png', '/menu-icons/v4/221eb720d89330b020831977901ffb01.png', '/platform/sys/file/download?id=221eb720d89330b020831977901ffb01', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('0ad363ca5afe42974bfadfedce3884ad', 'MINIO', 'cug', '092_课程列表_893a216d.png', 'png', '42', '41.7 kB', '0ad363ca5afe42974bfadfedce3884ad.png', '/menu-icons/v4/0ad363ca5afe42974bfadfedce3884ad.png', '/platform/sys/file/download?id=0ad363ca5afe42974bfadfedce3884ad', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('900335e540cc289670acc56a3f4efdc6', 'MINIO', 'cug', '093_慈善捐助_0c4ccaec.png', 'png', '53', '52.8 kB', '900335e540cc289670acc56a3f4efdc6.png', '/menu-icons/v4/900335e540cc289670acc56a3f4efdc6.png', '/platform/sys/file/download?id=900335e540cc289670acc56a3f4efdc6', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('17d93eabe5550904da837191e873727c', 'MINIO', 'cug', '094_慈善捐助_a112c7db.png', 'png', '53', '52.8 kB', '17d93eabe5550904da837191e873727c.png', '/menu-icons/v4/17d93eabe5550904da837191e873727c.png', '/platform/sys/file/download?id=17d93eabe5550904da837191e873727c', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('fe57d48708f2d5775a4caf6ae9810885', 'MINIO', 'cug', '095_我的捐助_23883f9a.png', 'png', '51', '51.1 kB', 'fe57d48708f2d5775a4caf6ae9810885.png', '/menu-icons/v4/fe57d48708f2d5775a4caf6ae9810885.png', '/platform/sys/file/download?id=fe57d48708f2d5775a4caf6ae9810885', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('9eb136427ad27c9d7dcb3c8707722197', 'MINIO', 'cug', '096_生育休假_e5851cdf.png', 'png', '45', '45.3 kB', '9eb136427ad27c9d7dcb3c8707722197.png', '/menu-icons/v4/9eb136427ad27c9d7dcb3c8707722197.png', '/platform/sys/file/download?id=9eb136427ad27c9d7dcb3c8707722197', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('c6a18ba7ab1cced5ff8a143b508ac232', 'MINIO', 'cug', '097_休假申请_abfbd5db.png', 'png', '40', '39.9 kB', 'c6a18ba7ab1cced5ff8a143b508ac232.png', '/menu-icons/v4/c6a18ba7ab1cced5ff8a143b508ac232.png', '/platform/sys/file/download?id=c6a18ba7ab1cced5ff8a143b508ac232', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('39ad45823ce67503b15d0e80baac5a90', 'MINIO', 'cug', '098_我的申请_99252619.png', 'png', '41', '41.1 kB', '39ad45823ce67503b15d0e80baac5a90.png', '/menu-icons/v4/39ad45823ce67503b15d0e80baac5a90.png', '/platform/sys/file/download?id=39ad45823ce67503b15d0e80baac5a90', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('ac6ece2322ded47882503379cbdb11e4', 'MINIO', 'cug', '099_分工会审核_6a548614.png', 'png', '44', '44.0 kB', 'ac6ece2322ded47882503379cbdb11e4.png', '/menu-icons/v4/ac6ece2322ded47882503379cbdb11e4.png', '/platform/sys/file/download?id=ac6ece2322ded47882503379cbdb11e4', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('ca34d08cc7be228497903791476a021c', 'MINIO', 'cug', '100_校工会审核_4a764f7d.png', 'png', '44', '44.2 kB', 'ca34d08cc7be228497903791476a021c.png', '/menu-icons/v4/ca34d08cc7be228497903791476a021c.png', '/platform/sys/file/download?id=ca34d08cc7be228497903791476a021c', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('023abe62c4dcba439ae559a117453f66', 'MINIO', 'cug', '101_查询统计_c13558b0.png', 'png', '41', '40.9 kB', '023abe62c4dcba439ae559a117453f66.png', '/menu-icons/v4/023abe62c4dcba439ae559a117453f66.png', '/platform/sys/file/download?id=023abe62c4dcba439ae559a117453f66', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('f1455ca7fd4317263281ac6cf41fc1ad', 'MINIO', 'cug', '102_独生子女父母退休_f808e1e1.png', 'png', '45', '45.3 kB', 'f1455ca7fd4317263281ac6cf41fc1ad.png', '/menu-icons/v4/f1455ca7fd4317263281ac6cf41fc1ad.png', '/platform/sys/file/download?id=f1455ca7fd4317263281ac6cf41fc1ad', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('3f8884bf81ae83404e13cde55dcf79ed', 'MINIO', 'cug', '103_独生子女父母退休申请_6c3fcd1a.png', 'png', '43', '43.1 kB', '3f8884bf81ae83404e13cde55dcf79ed.png', '/menu-icons/v4/3f8884bf81ae83404e13cde55dcf79ed.png', '/platform/sys/file/download?id=3f8884bf81ae83404e13cde55dcf79ed', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('c23849106f7cd6b4ebdd38ab7c736404', 'MINIO', 'cug', '104_我的申请_16388b3d.png', 'png', '41', '41.1 kB', 'c23849106f7cd6b4ebdd38ab7c736404.png', '/menu-icons/v4/c23849106f7cd6b4ebdd38ab7c736404.png', '/platform/sys/file/download?id=c23849106f7cd6b4ebdd38ab7c736404', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('e83e7cc6d1c9579d0c90d846123d4781', 'MINIO', 'cug', '105_分工会审核_dc276392.png', 'png', '44', '44.0 kB', 'e83e7cc6d1c9579d0c90d846123d4781.png', '/menu-icons/v4/e83e7cc6d1c9579d0c90d846123d4781.png', '/platform/sys/file/download?id=e83e7cc6d1c9579d0c90d846123d4781', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('e614a2a418affa90b4604d854bbe8f4f', 'MINIO', 'cug', '106_校工会审核_50bf62d0.png', 'png', '44', '44.2 kB', 'e614a2a418affa90b4604d854bbe8f4f.png', '/menu-icons/v4/e614a2a418affa90b4604d854bbe8f4f.png', '/platform/sys/file/download?id=e614a2a418affa90b4604d854bbe8f4f', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('256e79961efba17f049992fa79c44ddd', 'MINIO', 'cug', '107_查询统计_05f308a2.png', 'png', '41', '40.9 kB', '256e79961efba17f049992fa79c44ddd.png', '/menu-icons/v4/256e79961efba17f049992fa79c44ddd.png', '/platform/sys/file/download?id=256e79961efba17f049992fa79c44ddd', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('5327c3f6de7725c98b4a847c820363fd', 'MINIO', 'cug', '108_工会报销_d54c4078.png', 'png', '53', '52.8 kB', '5327c3f6de7725c98b4a847c820363fd.png', '/menu-icons/v4/5327c3f6de7725c98b4a847c820363fd.png', '/platform/sys/file/download?id=5327c3f6de7725c98b4a847c820363fd', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('0e4100d9c4ea5176698a2345787c198c', 'MINIO', 'cug', '109_报销申请_e04f9463.png', 'png', '50', '50.0 kB', '0e4100d9c4ea5176698a2345787c198c.png', '/menu-icons/v4/0e4100d9c4ea5176698a2345787c198c.png', '/platform/sys/file/download?id=0e4100d9c4ea5176698a2345787c198c', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('b8f169e5778223784b9135af8a311524', 'MINIO', 'cug', '110_我的报销_5a994c0f.png', 'png', '51', '51.1 kB', 'b8f169e5778223784b9135af8a311524.png', '/menu-icons/v4/b8f169e5778223784b9135af8a311524.png', '/platform/sys/file/download?id=b8f169e5778223784b9135af8a311524', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('0543f3f83e09ad659b9abcaefd08b94a', 'MINIO', 'cug', '111_单身教工管理_bfd9983c.png', 'png', '58', '58.3 kB', '0543f3f83e09ad659b9abcaefd08b94a.png', '/menu-icons/v4/0543f3f83e09ad659b9abcaefd08b94a.png', '/platform/sys/file/download?id=0543f3f83e09ad659b9abcaefd08b94a', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('6a190139c0642e5364294b90a864858b', 'MINIO', 'cug', '112_报销审核_d1abc76f.png', 'png', '45', '45.1 kB', '6a190139c0642e5364294b90a864858b.png', '/menu-icons/v4/6a190139c0642e5364294b90a864858b.png', '/platform/sys/file/download?id=6a190139c0642e5364294b90a864858b', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('337ecc73f2d4b46217a0037c2e7bb986', 'MINIO', 'cug', '113_报销汇总_0d6c8aac.png', 'png', '53', '52.8 kB', '337ecc73f2d4b46217a0037c2e7bb986.png', '/menu-icons/v4/337ecc73f2d4b46217a0037c2e7bb986.png', '/platform/sys/file/download?id=337ecc73f2d4b46217a0037c2e7bb986', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('98db42fa3b4eede3f6502aaaec1e8117', 'MINIO', 'cug', '114_问卷调查_17c32edb.png', 'png', '46', '46.3 kB', '98db42fa3b4eede3f6502aaaec1e8117.png', '/menu-icons/v4/98db42fa3b4eede3f6502aaaec1e8117.png', '/platform/sys/file/download?id=98db42fa3b4eede3f6502aaaec1e8117', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('d91ad1c8f455cc80e03380f2c55b5e7a', 'MINIO', 'cug', '115_其他人员管理_62b1effb.png', 'png', '44', '44.3 kB', 'd91ad1c8f455cc80e03380f2c55b5e7a.png', '/menu-icons/v4/d91ad1c8f455cc80e03380f2c55b5e7a.png', '/platform/sys/file/download?id=d91ad1c8f455cc80e03380f2c55b5e7a', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('8a129812d0f083d933bed9f7362ce3c2', 'MINIO', 'cug', '116_场地预约old_ed6f15a0.png', 'png', '53', '53.2 kB', '8a129812d0f083d933bed9f7362ce3c2.png', '/menu-icons/v4/8a129812d0f083d933bed9f7362ce3c2.png', '/platform/sys/file/download?id=8a129812d0f083d933bed9f7362ce3c2', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('3c8e7767270938e6bedabb675947d36c', 'MINIO', 'cug', '117_场地预约_3f09df78.png', 'png', '53', '53.2 kB', '3c8e7767270938e6bedabb675947d36c.png', '/menu-icons/v4/3c8e7767270938e6bedabb675947d36c.png', '/platform/sys/file/download?id=3c8e7767270938e6bedabb675947d36c', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('d9e86cfc1eba51102cc2a5067f669ce9', 'MINIO', 'cug', '118_人员变更记录_70b4f9a1.png', 'png', '43', '43.5 kB', 'd9e86cfc1eba51102cc2a5067f669ce9.png', '/menu-icons/v4/d9e86cfc1eba51102cc2a5067f669ce9.png', '/platform/sys/file/download?id=d9e86cfc1eba51102cc2a5067f669ce9', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('31b67a1b095a3e1e5dec07bb4377e87c', 'MINIO', 'cug', '119_我的预约_8f752c50.png', 'png', '53', '53.0 kB', '31b67a1b095a3e1e5dec07bb4377e87c.png', '/menu-icons/v4/31b67a1b095a3e1e5dec07bb4377e87c.png', '/platform/sys/file/download?id=31b67a1b095a3e1e5dec07bb4377e87c', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('29f151188867dd0b541b2998832e609d', 'MINIO', 'cug', '120_30教龄教职工管理_22847e55.png', 'png', '58', '58.3 kB', '29f151188867dd0b541b2998832e609d.png', '/menu-icons/v4/29f151188867dd0b541b2998832e609d.png', '/platform/sys/file/download?id=29f151188867dd0b541b2998832e609d', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('c1f86c180293b8d8a33b733335c95d92', 'MINIO', 'cug', '121_校工会审核_ef93e3b9.png', 'png', '44', '44.2 kB', 'c1f86c180293b8d8a33b733335c95d92.png', '/menu-icons/v4/c1f86c180293b8d8a33b733335c95d92.png', '/platform/sys/file/download?id=c1f86c180293b8d8a33b733335c95d92', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('4a2284606c913e81a4a8ae4a30907fa1', 'MINIO', 'cug', '122_职工福利_d34fa735.png', 'png', '46', '45.7 kB', '4a2284606c913e81a4a8ae4a30907fa1.png', '/menu-icons/v4/4a2284606c913e81a4a8ae4a30907fa1.png', '/platform/sys/file/download?id=4a2284606c913e81a4a8ae4a30907fa1', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('750049c8122e723f2c05b07487dfcc41', 'MINIO', 'cug', '123_选择福利_94b69599.png', 'png', '44', '43.6 kB', '750049c8122e723f2c05b07487dfcc41.png', '/menu-icons/v4/750049c8122e723f2c05b07487dfcc41.png', '/platform/sys/file/download?id=750049c8122e723f2c05b07487dfcc41', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('7396484da3d72534752452bfcbcb0069', 'MINIO', 'cug', '124_收货地址_15156ec9.png', 'png', '42', '41.9 kB', '7396484da3d72534752452bfcbcb0069.png', '/menu-icons/v4/7396484da3d72534752452bfcbcb0069.png', '/platform/sys/file/download?id=7396484da3d72534752452bfcbcb0069', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('c3dec28fc2456aac00b232004a37772b', 'MINIO', 'cug', '125_职工慰问_3b49290f.png', 'png', '41', '41.4 kB', 'c3dec28fc2456aac00b232004a37772b.png', '/menu-icons/v4/c3dec28fc2456aac00b232004a37772b.png', '/platform/sys/file/download?id=c3dec28fc2456aac00b232004a37772b', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('eb7fbff546395e60c8175bea83b23ca5', 'MINIO', 'cug', '126_慰问申请_5e024c74.png', 'png', '39', '39.3 kB', 'eb7fbff546395e60c8175bea83b23ca5.png', '/menu-icons/v4/eb7fbff546395e60c8175bea83b23ca5.png', '/platform/sys/file/download?id=eb7fbff546395e60c8175bea83b23ca5', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('c23fadfac6813aa9658850d21afe0522', 'MINIO', 'cug', '127_我的福利_c08d8543.png', 'png', '44', '43.7 kB', 'c23fadfac6813aa9658850d21afe0522.png', '/menu-icons/v4/c23fadfac6813aa9658850d21afe0522.png', '/platform/sys/file/download?id=c23fadfac6813aa9658850d21afe0522', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('78cdcfded40ace970a47d5d3ee266cb4', 'MINIO', 'cug', '128_建言献策_261dd7f7.png', 'png', '46', '46.3 kB', '78cdcfded40ace970a47d5d3ee266cb4.png', '/menu-icons/v4/78cdcfded40ace970a47d5d3ee266cb4.png', '/platform/sys/file/download?id=78cdcfded40ace970a47d5d3ee266cb4', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('355393c56fa8dfec6ca72e5bb3afb44e', 'MINIO', 'cug', '129_填写申请_9e0070b7.png', 'png', '40', '40.3 kB', '355393c56fa8dfec6ca72e5bb3afb44e.png', '/menu-icons/v4/355393c56fa8dfec6ca72e5bb3afb44e.png', '/platform/sys/file/download?id=355393c56fa8dfec6ca72e5bb3afb44e', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('d3f4bdad1fea1e72a254a76bf0031b5f', 'MINIO', 'cug', '130_我的申请_360f1c3f.png', 'png', '41', '41.1 kB', 'd3f4bdad1fea1e72a254a76bf0031b5f.png', '/menu-icons/v4/d3f4bdad1fea1e72a254a76bf0031b5f.png', '/platform/sys/file/download?id=d3f4bdad1fea1e72a254a76bf0031b5f', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('a19a061c9150542eaf2c606b6ce7d5db', 'MINIO', 'cug', '131_校工会审核_a9d5ff11.png', 'png', '44', '44.2 kB', 'a19a061c9150542eaf2c606b6ce7d5db.png', '/menu-icons/v4/a19a061c9150542eaf2c606b6ce7d5db.png', '/platform/sys/file/download?id=a19a061c9150542eaf2c606b6ce7d5db', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('73173ed918d2432883a2fc7ce7860acf', 'MINIO', 'cug', '132_查询统计_5f2c0218.png', 'png', '41', '40.9 kB', '73173ed918d2432883a2fc7ce7860acf.png', '/menu-icons/v4/73173ed918d2432883a2fc7ce7860acf.png', '/platform/sys/file/download?id=73173ed918d2432883a2fc7ce7860acf', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('0cb7972d868debcea8cbaaec8c031ecd', 'MINIO', 'cug', '133_作品征集_10ecb801.png', 'png', '41', '41.1 kB', '0cb7972d868debcea8cbaaec8c031ecd.png', '/menu-icons/v4/0cb7972d868debcea8cbaaec8c031ecd.png', '/platform/sys/file/download?id=0cb7972d868debcea8cbaaec8c031ecd', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('1bab0b87dda87cce3b9d2e399834cbd4', 'MINIO', 'cug', '134_作品上传_5ae60a2c.png', 'png', '41', '41.2 kB', '1bab0b87dda87cce3b9d2e399834cbd4.png', '/menu-icons/v4/1bab0b87dda87cce3b9d2e399834cbd4.png', '/platform/sys/file/download?id=1bab0b87dda87cce3b9d2e399834cbd4', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('247977f8981b0d1ba3f66d5281758af3', 'MINIO', 'cug', '135_困难帮扶_ca437578.png', 'png', '41', '41.4 kB', '247977f8981b0d1ba3f66d5281758af3.png', '/menu-icons/v4/247977f8981b0d1ba3f66d5281758af3.png', '/platform/sys/file/download?id=247977f8981b0d1ba3f66d5281758af3', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('25a37b6731412687cc139354516af951', 'MINIO', 'cug', '136_我的作品_b0febdbf.png', 'png', '42', '42.3 kB', '25a37b6731412687cc139354516af951.png', '/menu-icons/v4/25a37b6731412687cc139354516af951.png', '/platform/sys/file/download?id=25a37b6731412687cc139354516af951', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('09e1b869c29991070515f5fb1decb1d5', 'MINIO', 'cug', '137_困难帮扶申请_d11cf9fe.png', 'png', '39', '39.3 kB', '09e1b869c29991070515f5fb1decb1d5.png', '/menu-icons/v4/09e1b869c29991070515f5fb1decb1d5.png', '/platform/sys/file/download?id=09e1b869c29991070515f5fb1decb1d5', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('72997cecb2555f50d1ea0bd52e2d82ae', 'MINIO', 'cug', '138_作品阅览_04fd4ddf.png', 'png', '42', '41.9 kB', '72997cecb2555f50d1ea0bd52e2d82ae.png', '/menu-icons/v4/72997cecb2555f50d1ea0bd52e2d82ae.png', '/platform/sys/file/download?id=72997cecb2555f50d1ea0bd52e2d82ae', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('26a79287dbf7e1ca3c79332fb6285862', 'MINIO', 'cug', '139_会议选座_0c08a2e7.png', 'png', '54', '54.4 kB', '26a79287dbf7e1ca3c79332fb6285862.png', '/menu-icons/v4/26a79287dbf7e1ca3c79332fb6285862.png', '/platform/sys/file/download?id=26a79287dbf7e1ca3c79332fb6285862', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('4830086adc28e0bf629d0ff9e2857f27', 'MINIO', 'cug', '140_亲子活动_871f822c.png', 'png', '45', '45.3 kB', '4830086adc28e0bf629d0ff9e2857f27.png', '/menu-icons/v4/4830086adc28e0bf629d0ff9e2857f27.png', '/platform/sys/file/download?id=4830086adc28e0bf629d0ff9e2857f27', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('644a0d084ac071002407b4a0c2f53af0', 'MINIO', 'cug', '141_活动报名_612a4fa1.png', 'png', '42', '41.8 kB', '644a0d084ac071002407b4a0c2f53af0.png', '/menu-icons/v4/644a0d084ac071002407b4a0c2f53af0.png', '/platform/sys/file/download?id=644a0d084ac071002407b4a0c2f53af0', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('979bfcd302f91267653322b34656a0fe', 'MINIO', 'cug', '142_心理咨询_c8d0855a.png', 'png', '45', '44.5 kB', '979bfcd302f91267653322b34656a0fe.png', '/menu-icons/v4/979bfcd302f91267653322b34656a0fe.png', '/platform/sys/file/download?id=979bfcd302f91267653322b34656a0fe', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('667e2023287032849e9eed37bd96ffab', 'MINIO', 'cug', '143_我的报名_c0ba4f08.png', 'png', '41', '41.1 kB', '667e2023287032849e9eed37bd96ffab.png', '/menu-icons/v4/667e2023287032849e9eed37bd96ffab.png', '/platform/sys/file/download?id=667e2023287032849e9eed37bd96ffab', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('784f730e392bf97e3c8e9eb78d57e200', 'MINIO', 'cug', '144_法律援助_f148c76e.png', 'png', '46', '46.3 kB', '784f730e392bf97e3c8e9eb78d57e200.png', '/menu-icons/v4/784f730e392bf97e3c8e9eb78d57e200.png', '/platform/sys/file/download?id=784f730e392bf97e3c8e9eb78d57e200', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('1d7a71bdce09c3edc0a1e0b5b116ee0f', 'MINIO', 'cug', '145_医疗补助系统_b0cc1987.png', 'png', '53', '52.8 kB', '1d7a71bdce09c3edc0a1e0b5b116ee0f.png', '/menu-icons/v4/1d7a71bdce09c3edc0a1e0b5b116ee0f.png', '/platform/sys/file/download?id=1d7a71bdce09c3edc0a1e0b5b116ee0f', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('c7d5a756835c5896d7d8c43cd02e77f5', 'MINIO', 'cug', '146_职工福利_ca9e5652.png', 'png', '46', '45.7 kB', 'c7d5a756835c5896d7d8c43cd02e77f5.png', '/menu-icons/v4/c7d5a756835c5896d7d8c43cd02e77f5.png', '/platform/sys/file/download?id=c7d5a756835c5896d7d8c43cd02e77f5', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('ef15dcff1a44c021f83b87de5ba67c3e', 'MINIO', 'cug', '147_职工福利_093e1e29.png', 'png', '46', '45.7 kB', 'ef15dcff1a44c021f83b87de5ba67c3e.png', '/menu-icons/v4/ef15dcff1a44c021f83b87de5ba67c3e.png', '/platform/sys/file/download?id=ef15dcff1a44c021f83b87de5ba67c3e', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('9c004bc15efc7133ecdc2fdeade39757', 'MINIO', 'cug', '148_福利选择_519c8f5a.png', 'png', '44', '43.6 kB', '9c004bc15efc7133ecdc2fdeade39757.png', '/menu-icons/v4/9c004bc15efc7133ecdc2fdeade39757.png', '/platform/sys/file/download?id=9c004bc15efc7133ecdc2fdeade39757', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('3f74d543dd457b89ff633f9758534a13', 'MINIO', 'cug', '149_福利日常核对_73df1dda.png', 'png', '44', '43.8 kB', '3f74d543dd457b89ff633f9758534a13.png', '/menu-icons/v4/3f74d543dd457b89ff633f9758534a13.png', '/platform/sys/file/download?id=3f74d543dd457b89ff633f9758534a13', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('9be265f40e1fe24bf426c101f91c372e', 'MINIO', 'cug', '150_体检管理_cf47b9d6.png', 'png', '45', '44.5 kB', '9be265f40e1fe24bf426c101f91c372e.png', '/menu-icons/v4/9be265f40e1fe24bf426c101f91c372e.png', '/platform/sys/file/download?id=9be265f40e1fe24bf426c101f91c372e', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('f56d4722eba8c35c7ad17eaee09957da', 'MINIO', 'cug', '151_体育活动管理_e08ff179.png', 'png', '42', '41.8 kB', 'f56d4722eba8c35c7ad17eaee09957da.png', '/menu-icons/v4/f56d4722eba8c35c7ad17eaee09957da.png', '/platform/sys/file/download?id=f56d4722eba8c35c7ad17eaee09957da', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('1773284fda8bb61676c591a12fe59cc0', 'MINIO', 'cug', '152_体育活动报名_69280dbb.png', 'png', '42', '41.8 kB', '1773284fda8bb61676c591a12fe59cc0.png', '/menu-icons/v4/1773284fda8bb61676c591a12fe59cc0.png', '/platform/sys/file/download?id=1773284fda8bb61676c591a12fe59cc0', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('1f362f5b49109756b1cd3e98e0d51cf2', 'MINIO', 'cug', '153_品牌活动_0868f8b6.png', 'png', '41', '41.1 kB', '1f362f5b49109756b1cd3e98e0d51cf2.png', '/menu-icons/v4/1f362f5b49109756b1cd3e98e0d51cf2.png', '/platform/sys/file/download?id=1f362f5b49109756b1cd3e98e0d51cf2', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('50ab45f2d7b1159dd41452711b69b12e', 'MINIO', 'cug', '154_品牌活动报名_c97ad132.png', 'png', '42', '41.8 kB', '50ab45f2d7b1159dd41452711b69b12e.png', '/menu-icons/v4/50ab45f2d7b1159dd41452711b69b12e.png', '/platform/sys/file/download?id=50ab45f2d7b1159dd41452711b69b12e', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('3cc65760857ae6336d9c3556af831096', 'MINIO', 'cug', '155_校工会文化活动_788400d0.png', 'png', '42', '42.0 kB', '3cc65760857ae6336d9c3556af831096.png', '/menu-icons/v4/3cc65760857ae6336d9c3556af831096.png', '/platform/sys/file/download?id=3cc65760857ae6336d9c3556af831096', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('58b5c2e00fe8a4cc907a9319638c455b', 'MINIO', 'cug', '156_校文化活动报名_c1709519.png', 'png', '42', '41.8 kB', '58b5c2e00fe8a4cc907a9319638c455b.png', '/menu-icons/v4/58b5c2e00fe8a4cc907a9319638c455b.png', '/platform/sys/file/download?id=58b5c2e00fe8a4cc907a9319638c455b', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('8aba95b4264509993101f56165c5230e', 'MINIO', 'cug', '157_分工会文化活动_b759a93a.png', 'png', '42', '42.0 kB', '8aba95b4264509993101f56165c5230e.png', '/menu-icons/v4/8aba95b4264509993101f56165c5230e.png', '/platform/sys/file/download?id=8aba95b4264509993101f56165c5230e', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('694bf29f0b31bb6cc39fe628596fcf10', 'MINIO', 'cug', '158_作品征集_91d79e0f.png', 'png', '41', '41.1 kB', '694bf29f0b31bb6cc39fe628596fcf10.png', '/menu-icons/v4/694bf29f0b31bb6cc39fe628596fcf10.png', '/platform/sys/file/download?id=694bf29f0b31bb6cc39fe628596fcf10', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('2096b1f5b2dd220708caa011807e760b', 'MINIO', 'cug', '159_亲子活动_737e57a3.png', 'png', '45', '45.3 kB', '2096b1f5b2dd220708caa011807e760b.png', '/menu-icons/v4/2096b1f5b2dd220708caa011807e760b.png', '/platform/sys/file/download?id=2096b1f5b2dd220708caa011807e760b', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('58e2294be4fc14f163dfa8648e1d7766', 'MINIO', 'cug', '160_教工健身走_33e81fa0.png', 'png', '44', '43.6 kB', '58e2294be4fc14f163dfa8648e1d7766.png', '/menu-icons/v4/58e2294be4fc14f163dfa8648e1d7766.png', '/platform/sys/file/download?id=58e2294be4fc14f163dfa8648e1d7766', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('c8f85b0da4d6934b6c4daa3bfaf6b4fe', 'MINIO', 'cug', '161_活动基础管理_77c8af32.png', 'png', '44', '43.6 kB', 'c8f85b0da4d6934b6c4daa3bfaf6b4fe.png', '/menu-icons/v4/c8f85b0da4d6934b6c4daa3bfaf6b4fe.png', '/platform/sys/file/download?id=c8f85b0da4d6934b6c4daa3bfaf6b4fe', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('5aa7fee7e955f392f4348ed76dec3a96', 'MINIO', 'cug', '162_工会报销_1f917af2.png', 'png', '53', '52.8 kB', '5aa7fee7e955f392f4348ed76dec3a96.png', '/menu-icons/v4/5aa7fee7e955f392f4348ed76dec3a96.png', '/platform/sys/file/download?id=5aa7fee7e955f392f4348ed76dec3a96', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('3993212bfb4c32fd116309ac74a02caf', 'MINIO', 'cug', '163_报销申请_d6132ff0.png', 'png', '50', '50.0 kB', '3993212bfb4c32fd116309ac74a02caf.png', '/menu-icons/v4/3993212bfb4c32fd116309ac74a02caf.png', '/platform/sys/file/download?id=3993212bfb4c32fd116309ac74a02caf', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('8e01489dd693caea1c6ad1605a8b9496', 'MINIO', 'cug', '164_问卷服务_1c643efa.png', 'png', '46', '46.3 kB', '8e01489dd693caea1c6ad1605a8b9496.png', '/menu-icons/v4/8e01489dd693caea1c6ad1605a8b9496.png', '/platform/sys/file/download?id=8e01489dd693caea1c6ad1605a8b9496', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('7e99bec530b0d1c4a23060ab2f46ba10', 'MINIO', 'cug', '165_场地预约(old)_e9e46237.png', 'png', '53', '53.2 kB', '7e99bec530b0d1c4a23060ab2f46ba10.png', '/menu-icons/v4/7e99bec530b0d1c4a23060ab2f46ba10.png', '/platform/sys/file/download?id=7e99bec530b0d1c4a23060ab2f46ba10', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('f2fe436890ce5f92128f3520780ca3a8', 'MINIO', 'cug', '166_场地预约_82356ff2.png', 'png', '53', '53.2 kB', 'f2fe436890ce5f92128f3520780ca3a8.png', '/menu-icons/v4/f2fe436890ce5f92128f3520780ca3a8.png', '/platform/sys/file/download?id=f2fe436890ce5f92128f3520780ca3a8', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('39ba4b1f22b31ef85b10125cb1745d0f', 'MINIO', 'cug', '167_消息中心_40266809.png', 'png', '58', '58.3 kB', '39ba4b1f22b31ef85b10125cb1745d0f.png', '/menu-icons/v4/39ba4b1f22b31ef85b10125cb1745d0f.png', '/platform/sys/file/download?id=39ba4b1f22b31ef85b10125cb1745d0f', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('459acd2ff8c33f855a77a03d1994854e', 'MINIO', 'cug', '168_工会大数据_09abd6b8.png', 'png', '44', '44.3 kB', '459acd2ff8c33f855a77a03d1994854e.png', '/menu-icons/v4/459acd2ff8c33f855a77a03d1994854e.png', '/platform/sys/file/download?id=459acd2ff8c33f855a77a03d1994854e', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('d592100d662b25fe14c546725a7eaf3b', 'MINIO', 'cug', '169_年度预算申报_396309f2.png', 'png', '50', '50.2 kB', 'd592100d662b25fe14c546725a7eaf3b.png', '/menu-icons/v4/d592100d662b25fe14c546725a7eaf3b.png', '/platform/sys/file/download?id=d592100d662b25fe14c546725a7eaf3b', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('39dc023de0c0ef3df9035b84246c35fc', 'MINIO', 'cug', '170_预算申报_6be01be5.png', 'png', '50', '50.2 kB', '39dc023de0c0ef3df9035b84246c35fc.png', '/menu-icons/v4/39dc023de0c0ef3df9035b84246c35fc.png', '/platform/sys/file/download?id=39dc023de0c0ef3df9035b84246c35fc', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('d4c3f3f8efe2ce8c8ea3beb4409918e3', 'MINIO', 'cug', '171_经费预算管理_fe0ae2a7.png', 'png', '53', '52.8 kB', 'd4c3f3f8efe2ce8c8ea3beb4409918e3.png', '/menu-icons/v4/d4c3f3f8efe2ce8c8ea3beb4409918e3.png', '/platform/sys/file/download?id=d4c3f3f8efe2ce8c8ea3beb4409918e3', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('21267a6fa768ee7eeedf7dba980616f4', 'MINIO', 'cug', '172_荣誉管理_31078d88.png', 'png', '47', '47.0 kB', '21267a6fa768ee7eeedf7dba980616f4.png', '/menu-icons/v4/21267a6fa768ee7eeedf7dba980616f4.png', '/platform/sys/file/download?id=21267a6fa768ee7eeedf7dba980616f4', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('0199cc2d1f8eff511c2038571f2bbb8b', 'MINIO', 'cug', '173_评优评先_32bd9853.png', 'png', '51', '51.0 kB', '0199cc2d1f8eff511c2038571f2bbb8b.png', '/menu-icons/v4/0199cc2d1f8eff511c2038571f2bbb8b.png', '/platform/sys/file/download?id=0199cc2d1f8eff511c2038571f2bbb8b', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('837a9b8aad0e1eadceaa693dfa8e19e1', 'MINIO', 'cug', '174_新闻投稿_a4cfdc91.png', 'png', '42', '41.9 kB', '837a9b8aad0e1eadceaa693dfa8e19e1.png', '/menu-icons/v4/837a9b8aad0e1eadceaa693dfa8e19e1.png', '/platform/sys/file/download?id=837a9b8aad0e1eadceaa693dfa8e19e1', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('a7d265dfed93cf79fca45e88bd4248ff', 'MINIO', 'cug', '175_职工建家_fac7e9f5.png', 'png', '44', '44.3 kB', 'a7d265dfed93cf79fca45e88bd4248ff.png', '/menu-icons/v4/a7d265dfed93cf79fca45e88bd4248ff.png', '/platform/sys/file/download?id=a7d265dfed93cf79fca45e88bd4248ff', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('cc24c0a16a35354f332aff2b2023f0e5', 'MINIO', 'cug', '176_资产管理_d7c6c17e.png', 'png', '58', '58.3 kB', 'cc24c0a16a35354f332aff2b2023f0e5.png', '/menu-icons/v4/cc24c0a16a35354f332aff2b2023f0e5.png', '/platform/sys/file/download?id=cc24c0a16a35354f332aff2b2023f0e5', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('648d406bbbf0e32c082f02cf317bc48c', 'MINIO', 'cug', '177_注册社团_946104dc.png', 'png', '44', '44.3 kB', '648d406bbbf0e32c082f02cf317bc48c.png', '/menu-icons/v4/648d406bbbf0e32c082f02cf317bc48c.png', '/platform/sys/file/download?id=648d406bbbf0e32c082f02cf317bc48c', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('49c4c2480f2027792674edaf6f40fed4', 'MINIO', 'cug', '178_社团信息维护_f6485820.png', 'png', '44', '43.5 kB', '49c4c2480f2027792674edaf6f40fed4.png', '/menu-icons/v4/49c4c2480f2027792674edaf6f40fed4.png', '/platform/sys/file/download?id=49c4c2480f2027792674edaf6f40fed4', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('10903a2e44417f9d20c548e3424dd457', 'MINIO', 'cug', '179_社团入会_1287eb24.png', 'png', '44', '44.3 kB', '10903a2e44417f9d20c548e3424dd457.png', '/menu-icons/v4/10903a2e44417f9d20c548e3424dd457.png', '/platform/sys/file/download?id=10903a2e44417f9d20c548e3424dd457', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('486385e3da464ace8cf812de8a460761', 'MINIO', 'cug', '180_社团入会_321fa0c8.png', 'png', '44', '44.3 kB', '486385e3da464ace8cf812de8a460761.png', '/menu-icons/v4/486385e3da464ace8cf812de8a460761.png', '/platform/sys/file/download?id=486385e3da464ace8cf812de8a460761', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('88e8b7b022ed0c2929615bfedd231e45', 'MINIO', 'cug', '181_年度考核_1ddecada.png', 'png', '46', '45.7 kB', '88e8b7b022ed0c2929615bfedd231e45.png', '/menu-icons/v4/88e8b7b022ed0c2929615bfedd231e45.png', '/platform/sys/file/download?id=88e8b7b022ed0c2929615bfedd231e45', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('1a174db6bdd59b2d7e98dadf52f7f854', 'MINIO', 'cug', '182_社团评优_3f09f8a9.png', 'png', '51', '51.0 kB', '1a174db6bdd59b2d7e98dadf52f7f854.png', '/menu-icons/v4/1a174db6bdd59b2d7e98dadf52f7f854.png', '/platform/sys/file/download?id=1a174db6bdd59b2d7e98dadf52f7f854', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('d7cb87646b1579a51daff50de1c4747c', 'MINIO', 'cug', '183_社团统计_b8817cce.png', 'png', '44', '43.7 kB', 'd7cb87646b1579a51daff50de1c4747c.png', '/menu-icons/v4/d7cb87646b1579a51daff50de1c4747c.png', '/platform/sys/file/download?id=d7cb87646b1579a51daff50de1c4747c', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('5edf99eb06031a98bc0f23b03f89bde1', 'MINIO', 'cug', '184_社团文化活动_509423f4.png', 'png', '42', '42.0 kB', '5edf99eb06031a98bc0f23b03f89bde1.png', '/menu-icons/v4/5edf99eb06031a98bc0f23b03f89bde1.png', '/platform/sys/file/download?id=5edf99eb06031a98bc0f23b03f89bde1', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('2b9fa4f9ab358355cbaf7aa9835556ef', 'MINIO', 'cug', '185_年度计划总结_e658f630.png', 'png', '42', '41.9 kB', '2b9fa4f9ab358355cbaf7aa9835556ef.png', '/menu-icons/v4/2b9fa4f9ab358355cbaf7aa9835556ef.png', '/platform/sys/file/download?id=2b9fa4f9ab358355cbaf7aa9835556ef', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('c88694f42e0203e48d3e49f6e5e066a8', 'MINIO', 'cug', '186_活动申报_895089b9.png', 'png', '41', '41.3 kB', 'c88694f42e0203e48d3e49f6e5e066a8.png', '/menu-icons/v4/c88694f42e0203e48d3e49f6e5e066a8.png', '/platform/sys/file/download?id=c88694f42e0203e48d3e49f6e5e066a8', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('7fec918647b9b82d4b37e2ded5cc3273', 'MINIO', 'cug', '187_活动申报_6bb151be.png', 'png', '41', '41.3 kB', '7fec918647b9b82d4b37e2ded5cc3273.png', '/menu-icons/v4/7fec918647b9b82d4b37e2ded5cc3273.png', '/platform/sys/file/download?id=7fec918647b9b82d4b37e2ded5cc3273', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('2589108c8f9cdb1a6bf2d3c82dbd153d', 'MINIO', 'cug', '188_费用报销管理_e8d1ced0.png', 'png', '53', '52.8 kB', '2589108c8f9cdb1a6bf2d3c82dbd153d.png', '/menu-icons/v4/2589108c8f9cdb1a6bf2d3c82dbd153d.png', '/platform/sys/file/download?id=2589108c8f9cdb1a6bf2d3c82dbd153d', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('76bf9528e92883a0aacb4400b5d7898b', 'MINIO', 'cug', '189_报销申请_6784436e.png', 'png', '50', '50.0 kB', '76bf9528e92883a0aacb4400b5d7898b.png', '/menu-icons/v4/76bf9528e92883a0aacb4400b5d7898b.png', '/platform/sys/file/download?id=76bf9528e92883a0aacb4400b5d7898b', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('1db9ddb3a212eb2438b5aa68b4aa4f98', 'MINIO', 'cug', '190_子女入学管理_36e59aa2.png', 'png', '45', '45.3 kB', '1db9ddb3a212eb2438b5aa68b4aa4f98.png', '/menu-icons/v4/1db9ddb3a212eb2438b5aa68b4aa4f98.png', '/platform/sys/file/download?id=1db9ddb3a212eb2438b5aa68b4aa4f98', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('56942a1f6017780c63c8a46b9d465730', 'MINIO', 'cug', '191_建言献策_5a90e1f8.png', 'png', '46', '46.3 kB', '56942a1f6017780c63c8a46b9d465730.png', '/menu-icons/v4/56942a1f6017780c63c8a46b9d465730.png', '/platform/sys/file/download?id=56942a1f6017780c63c8a46b9d465730', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('289c29aa7f973929396074fb0a68ee7b', 'MINIO', 'cug', '192_两委委员推选_c3886b5f.png', 'png', '44', '43.6 kB', '289c29aa7f973929396074fb0a68ee7b.png', '/menu-icons/v4/289c29aa7f973929396074fb0a68ee7b.png', '/platform/sys/file/download?id=289c29aa7f973929396074fb0a68ee7b', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('e538eee29c37357a259c7064eca89482', 'MINIO', 'cug', '193_理论学习_6d2535e3.png', 'png', '43', '43.3 kB', 'e538eee29c37357a259c7064eca89482.png', '/menu-icons/v4/e538eee29c37357a259c7064eca89482.png', '/platform/sys/file/download?id=e538eee29c37357a259c7064eca89482', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('df0c51dbe984b21bf17c2b70b7a0953b', 'MINIO', 'cug', '194_会务管理_fbe27890.png', 'png', '55', '54.8 kB', 'df0c51dbe984b21bf17c2b70b7a0953b.png', '/menu-icons/v4/df0c51dbe984b21bf17c2b70b7a0953b.png', '/platform/sys/file/download?id=df0c51dbe984b21bf17c2b70b7a0953b', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('d127deb847eb5c3ddb66546452457d56', 'MINIO', 'cug', '195_职工素养培训_81567260.png', 'png', '43', '43.3 kB', 'd127deb847eb5c3ddb66546452457d56.png', '/menu-icons/v4/d127deb847eb5c3ddb66546452457d56.png', '/platform/sys/file/download?id=d127deb847eb5c3ddb66546452457d56', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('91cdf49b7528eec7344a52c556bbbac1', 'MINIO', 'cug', '196_生日祝福_f12f0f8d.png', 'png', '46', '45.7 kB', '91cdf49b7528eec7344a52c556bbbac1.png', '/menu-icons/v4/91cdf49b7528eec7344a52c556bbbac1.png', '/platform/sys/file/download?id=91cdf49b7528eec7344a52c556bbbac1', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('62c85d34b7c83331fdc622b82ee31305', 'MINIO', 'cug', '197_会议厅_ac32facf.png', 'png', '54', '54.4 kB', '62c85d34b7c83331fdc622b82ee31305.png', '/menu-icons/v4/62c85d34b7c83331fdc622b82ee31305.png', '/platform/sys/file/download?id=62c85d34b7c83331fdc622b82ee31305', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('84786acc1aa4752f9ed27d6ae05b9845', 'MINIO', 'cug', '198_人员核对_1f9e482c.png', 'png', '44', '43.9 kB', '84786acc1aa4752f9ed27d6ae05b9845.png', '/menu-icons/v4/84786acc1aa4752f9ed27d6ae05b9845.png', '/platform/sys/file/download?id=84786acc1aa4752f9ed27d6ae05b9845', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('d164401cedd27b5e988a6728b167ebf9', 'MINIO', 'cug', '199_健身卡_3d6a88f3.png', 'png', '45', '44.5 kB', 'd164401cedd27b5e988a6728b167ebf9.png', '/menu-icons/v4/d164401cedd27b5e988a6728b167ebf9.png', '/platform/sys/file/download?id=d164401cedd27b5e988a6728b167ebf9', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('d15593858ee9e3e4740752796f0f094d', 'MINIO', 'cug', '200_量化考核_fd9a298a.png', 'png', '46', '45.7 kB', 'd15593858ee9e3e4740752796f0f094d.png', '/menu-icons/v4/d15593858ee9e3e4740752796f0f094d.png', '/platform/sys/file/download?id=d15593858ee9e3e4740752796f0f094d', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('98049319f4d8dfd8f1600693df033a92', 'MINIO', 'cug', '201_分工会自评_7a5c41f2.png', 'png', '44', '44.0 kB', '98049319f4d8dfd8f1600693df033a92.png', '/menu-icons/v4/98049319f4d8dfd8f1600693df033a92.png', '/platform/sys/file/download?id=98049319f4d8dfd8f1600693df033a92', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('e0be9482d60c2ce23d45dccf7b92b4ac', 'MINIO', 'cug', '202_生日祝福_93487f22.png', 'png', '46', '45.7 kB', 'e0be9482d60c2ce23d45dccf7b92b4ac.png', '/menu-icons/v4/e0be9482d60c2ce23d45dccf7b92b4ac.png', '/platform/sys/file/download?id=e0be9482d60c2ce23d45dccf7b92b4ac', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('c1d91269cb25ca1cdeec60480ed2bf17', 'MINIO', 'cug', '203_单位管理_c2f9569e.png', 'png', '44', '44.3 kB', 'c1d91269cb25ca1cdeec60480ed2bf17.png', '/menu-icons/v4/c1d91269cb25ca1cdeec60480ed2bf17.png', '/platform/sys/file/download?id=c1d91269cb25ca1cdeec60480ed2bf17', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('81537f82c536315f07c123f0648f0520', 'MINIO', 'cug', '204_工会管理_51b1e376.png', 'png', '44', '44.3 kB', '81537f82c536315f07c123f0648f0520.png', '/menu-icons/v4/81537f82c536315f07c123f0648f0520.png', '/platform/sys/file/download?id=81537f82c536315f07c123f0648f0520', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('43d984e35c070aeef9e02a6948ce0f13', 'MINIO', 'cug', '205_系统设置_72e8f153.png', 'png', '58', '58.3 kB', '43d984e35c070aeef9e02a6948ce0f13.png', '/menu-icons/v4/43d984e35c070aeef9e02a6948ce0f13.png', '/platform/sys/file/download?id=43d984e35c070aeef9e02a6948ce0f13', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('d89c1c55b52118f5383ac8556041a192', 'MINIO', 'cug', '206_基础管理_a993711d.png', 'png', '58', '58.3 kB', 'd89c1c55b52118f5383ac8556041a192.png', '/menu-icons/v4/d89c1c55b52118f5383ac8556041a192.png', '/platform/sys/file/download?id=d89c1c55b52118f5383ac8556041a192', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('651318033c80de8942937333a27bd181', 'MINIO', 'cug', '207_活动报名_5cc02dac.png', 'png', '42', '41.8 kB', '651318033c80de8942937333a27bd181.png', '/menu-icons/v4/651318033c80de8942937333a27bd181.png', '/platform/sys/file/download?id=651318033c80de8942937333a27bd181', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('9098831f78c6f63f34c47f50601cbf28', 'MINIO', 'cug', '208_问卷调查_86dda8e2.png', 'png', '46', '46.3 kB', '9098831f78c6f63f34c47f50601cbf28.png', '/menu-icons/v4/9098831f78c6f63f34c47f50601cbf28.png', '/platform/sys/file/download?id=9098831f78c6f63f34c47f50601cbf28', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('25f386be14f1bd2ff927466933513668', 'MINIO', 'cug', '209_系统配置_3668daf0.png', 'png', '58', '58.3 kB', '25f386be14f1bd2ff927466933513668.png', '/menu-icons/v4/25f386be14f1bd2ff927466933513668.png', '/platform/sys/file/download?id=25f386be14f1bd2ff927466933513668', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('a9d83741ede7ab47a93e60f19805d47c', 'MINIO', 'cug', '210_数据管理_5ba85827.png', 'png', '58', '58.3 kB', 'a9d83741ede7ab47a93e60f19805d47c.png', '/menu-icons/v4/a9d83741ede7ab47a93e60f19805d47c.png', '/platform/sys/file/download?id=a9d83741ede7ab47a93e60f19805d47c', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('7bba23aa9d61198c66cd8977dbdf0ae2', 'MINIO', 'cug', '211_场地预约_0a9fab6f.png', 'png', '53', '53.2 kB', '7bba23aa9d61198c66cd8977dbdf0ae2.png', '/menu-icons/v4/7bba23aa9d61198c66cd8977dbdf0ae2.png', '/platform/sys/file/download?id=7bba23aa9d61198c66cd8977dbdf0ae2', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('fde27ef077ff704c35dc2f7502ebfa9e', 'MINIO', 'cug', '212_场地预约_e3399da9.png', 'png', '53', '53.2 kB', 'fde27ef077ff704c35dc2f7502ebfa9e.png', '/menu-icons/v4/fde27ef077ff704c35dc2f7502ebfa9e.png', '/platform/sys/file/download?id=fde27ef077ff704c35dc2f7502ebfa9e', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('0fe41721790a452cec7765a8442d25bc', 'MINIO', 'cug', '213_流程管理_8bfae2e4.png', 'png', '58', '58.3 kB', '0fe41721790a452cec7765a8442d25bc.png', '/menu-icons/v4/0fe41721790a452cec7765a8442d25bc.png', '/platform/sys/file/download?id=0fe41721790a452cec7765a8442d25bc', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('964516a2efab750738d553a978f14e9e', 'MINIO', 'cug', '214_我的预约_a58a5431.png', 'png', '53', '53.0 kB', '964516a2efab750738d553a978f14e9e.png', '/menu-icons/v4/964516a2efab750738d553a978f14e9e.png', '/platform/sys/file/download?id=964516a2efab750738d553a978f14e9e', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('3b7caee281e29c602c60d25f0dbb6a2f', 'MINIO', 'cug', '215_校工会审核_f3c752d1.png', 'png', '44', '44.2 kB', '3b7caee281e29c602c60d25f0dbb6a2f.png', '/menu-icons/v4/3b7caee281e29c602c60d25f0dbb6a2f.png', '/platform/sys/file/download?id=3b7caee281e29c602c60d25f0dbb6a2f', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('4a97b1a9396b26c445ef930f29493015', 'MINIO', 'cug', '216_场地预约_26e7dc9c.png', 'png', '53', '53.2 kB', '4a97b1a9396b26c445ef930f29493015.png', '/menu-icons/v4/4a97b1a9396b26c445ef930f29493015.png', '/platform/sys/file/download?id=4a97b1a9396b26c445ef930f29493015', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('0a4136ea1398e76edef2aaae2fcf13a8', 'MINIO', 'cug', '217_普惠疗休养_68ac8d18.png', 'png', '45', '44.5 kB', '0a4136ea1398e76edef2aaae2fcf13a8.png', '/menu-icons/v4/0a4136ea1398e76edef2aaae2fcf13a8.png', '/platform/sys/file/download?id=0a4136ea1398e76edef2aaae2fcf13a8', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('842e0dce2c45f44751675860bb859d63', 'MINIO', 'cug', '218_疗休养报名_f30cfea5.png', 'png', '42', '42.4 kB', '842e0dce2c45f44751675860bb859d63.png', '/menu-icons/v4/842e0dce2c45f44751675860bb859d63.png', '/platform/sys/file/download?id=842e0dce2c45f44751675860bb859d63', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('69d455afdb1d6bee4d316344e52b8d18', 'MINIO', 'cug', '219_场地预约_f50b3389.png', 'png', '53', '53.2 kB', '69d455afdb1d6bee4d316344e52b8d18.png', '/menu-icons/v4/69d455afdb1d6bee4d316344e52b8d18.png', '/platform/sys/file/download?id=69d455afdb1d6bee4d316344e52b8d18', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('ab10e2a86d3e360f210464535ec12629', 'MINIO', 'cug', '220_学习教育平台_a0f47f6a.png', 'png', '43', '43.3 kB', 'ab10e2a86d3e360f210464535ec12629.png', '/menu-icons/v4/ab10e2a86d3e360f210464535ec12629.png', '/platform/sys/file/download?id=ab10e2a86d3e360f210464535ec12629', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('43448e1d37a564fb05d7fc3eb2651dfe', 'MINIO', 'cug', '221_普惠疗休养_b7c63f0c.png', 'png', '45', '44.5 kB', '43448e1d37a564fb05d7fc3eb2651dfe.png', '/menu-icons/v4/43448e1d37a564fb05d7fc3eb2651dfe.png', '/platform/sys/file/download?id=43448e1d37a564fb05d7fc3eb2651dfe', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('a8ee468acd66c5486f58d4593c46ac64', 'MINIO', 'cug', '222_疗休养报名_b7c63f0c.png', 'png', '42', '42.4 kB', 'a8ee468acd66c5486f58d4593c46ac64.png', '/menu-icons/v4/a8ee468acd66c5486f58d4593c46ac64.png', '/platform/sys/file/download?id=a8ee468acd66c5486f58d4593c46ac64', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('755643ca253b6fe42953aeac9b6f910b', 'MINIO', 'cug', '223_我的疗休养_d3020be8.png', 'png', '43', '42.8 kB', '755643ca253b6fe42953aeac9b6f910b.png', '/menu-icons/v4/755643ca253b6fe42953aeac9b6f910b.png', '/platform/sys/file/download?id=755643ca253b6fe42953aeac9b6f910b', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('000c9c07dc2f9b4013aab7cdc092b593', 'MINIO', 'cug', '224_分工会审核_80734d95.png', 'png', '44', '44.0 kB', '000c9c07dc2f9b4013aab7cdc092b593.png', '/menu-icons/v4/000c9c07dc2f9b4013aab7cdc092b593.png', '/platform/sys/file/download?id=000c9c07dc2f9b4013aab7cdc092b593', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('1a6d2f1a594ab7860c0f15008c60c314', 'MINIO', 'cug', '225_校工会审核_08793469.png', 'png', '44', '44.2 kB', '1a6d2f1a594ab7860c0f15008c60c314.png', '/menu-icons/v4/1a6d2f1a594ab7860c0f15008c60c314.png', '/platform/sys/file/download?id=1a6d2f1a594ab7860c0f15008c60c314', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('d44ecddd34378a79f7da58e23cd3c8a6', 'MINIO', 'cug', '226_学习教育平台_3af0f040.png', 'png', '43', '43.3 kB', 'd44ecddd34378a79f7da58e23cd3c8a6.png', '/menu-icons/v4/d44ecddd34378a79f7da58e23cd3c8a6.png', '/platform/sys/file/download?id=d44ecddd34378a79f7da58e23cd3c8a6', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('f8482973e06e66b0db234cf6380b7d95', 'MINIO', 'cug', '227_学习教育首页_82946217.png', 'png', '43', '43.3 kB', 'f8482973e06e66b0db234cf6380b7d95.png', '/menu-icons/v4/f8482973e06e66b0db234cf6380b7d95.png', '/platform/sys/file/download?id=f8482973e06e66b0db234cf6380b7d95', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('b84d1af3a4484c1b39365979fae6c585', 'MINIO', 'cug', '228_我的学习_3e9a7611.png', 'png', '42', '42.0 kB', 'b84d1af3a4484c1b39365979fae6c585.png', '/menu-icons/v4/b84d1af3a4484c1b39365979fae6c585.png', '/platform/sys/file/download?id=b84d1af3a4484c1b39365979fae6c585', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('68ac60361c0f193cc355110c0b0f2b6d', 'MINIO', 'cug', '229_荣誉台账_47a997dc.png', 'png', '47', '47.0 kB', '68ac60361c0f193cc355110c0b0f2b6d.png', '/menu-icons/v4/68ac60361c0f193cc355110c0b0f2b6d.png', '/platform/sys/file/download?id=68ac60361c0f193cc355110c0b0f2b6d', NULL, NULL, '', 1785921322195, '', 1785921322195, 0), +('ca3fececdab634c789e2f1d162ec62ba', 'MINIO', 'cug', '230_荣誉展示_2a93542d.png', 'png', '47', '47.0 kB', 'ca3fececdab634c789e2f1d162ec62ba.png', '/menu-icons/v4/ca3fececdab634c789e2f1d162ec62ba.png', '/platform/sys/file/download?id=ca3fececdab634c789e2f1d162ec62ba', NULL, NULL, '', 1785921322195, '', 1785921322195, 0) +ON DUPLICATE KEY UPDATE + `engine` = VALUES(`engine`), + `bucket` = VALUES(`bucket`), + `name` = VALUES(`name`), + `suffix` = VALUES(`suffix`), + `sizeKb` = VALUES(`sizeKb`), + `sizeInfo` = VALUES(`sizeInfo`), + `objName` = VALUES(`objName`), + `storagePath` = VALUES(`storagePath`), + `downloadPath` = VALUES(`downloadPath`), + `updatedAt` = VALUES(`updatedAt`), + `delFlag` = 0; + +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=57ef8603692af334526e191c1e81301e', `updatedAt` = 1785921322195 WHERE `id` = '2e6f393072904de3a80b10a00d3eeea5'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=8b152a98cf83bc6c20d2bb488fc48515', `updatedAt` = 1785921322195 WHERE `id` = '64ace2097a0341c8ba2da1961cda671f'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=e4cf62b0ac16798727612b74fbabac4d', `updatedAt` = 1785921322195 WHERE `id` = 'eb18aa5741e64ce0bcaa824119d720a8'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=a8c6f9352f56519b4914ca02ab274242', `updatedAt` = 1785921322195 WHERE `id` = '835cb68e14e74f7bbf6cf5a1e0659a26'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=2b74945f5c0741be5a67be574c4eb3d3', `updatedAt` = 1785921322195 WHERE `id` = '10ebaa5b633f42bf9f8768a942c53fb5'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=c4817a606d8e722e939811cdb8bb0208', `updatedAt` = 1785921322195 WHERE `id` = 'e7cf2f56415f4e1dacfb415b42045d4c'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=7d0d5d3f95faf51875c8cebf5ef23181', `updatedAt` = 1785921322195 WHERE `id` = '40a293cce5474cb58503435cb5a2fb14'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=a472973503af14a20ae0f8f1c7d03634', `updatedAt` = 1785921322195 WHERE `id` = '2666d0aeb0a84c15bcbb7802433e0070'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=8462dbea71f06a7257864c9bb77c7f9e', `updatedAt` = 1785921322195 WHERE `id` = 'ea574347b35a4c68bd02dc1cd2eb9e5f'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=823b3b7f7707774625bb7fe9f5ebc416', `updatedAt` = 1785921322195 WHERE `id` = '9441d18cd87f48d0b9f49d9f7103e55b'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=4b0a707d816c0f3abc6ff7fc3092e819', `updatedAt` = 1785921322195 WHERE `id` = '44a59a2b8a6b48efa35eda8b16558a26'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=3ea367f14cfd98eddb8e3fd685371fad', `updatedAt` = 1785921322195 WHERE `id` = '1c2aee7dc9cc4ef1b2977d1f1013cc16'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=6f35cd276d38e408522f4411a972ba9f', `updatedAt` = 1785921322195 WHERE `id` = '11db68564eba499da35d9d5fbdf63874'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=efe85251bd9233d4c8d7e7f0fd17c17d', `updatedAt` = 1785921322195 WHERE `id` = 'd5d7964e86c54a8e993f59fa78186e9d'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=827b20f69981eadcab0af82c6853e899', `updatedAt` = 1785921322195 WHERE `id` = 'c44115254326463682aba8ddd7f58c5b'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=b054908747aa76d3bbc2f94072ecdea9', `updatedAt` = 1785921322195 WHERE `id` = 'eb4ed857e2da407981f60e29206b25f8'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=4a7ed34b91ecfa20f52055d031beac71', `updatedAt` = 1785921322195 WHERE `id` = 'c4b99724f4bc46be97608a10d84d7020'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=81ffd7b1eb7b13353557efdce30a7ee2', `updatedAt` = 1785921322195 WHERE `id` = '56835d074f3243f4b89b5cbb6cb92dfc'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=5221f202257e65e39602d70d218c41b7', `updatedAt` = 1785921322195 WHERE `id` = '304278a0ce2e49ac94758e49ce863170'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=d60339858c907ede5bce05d675de9819', `updatedAt` = 1785921322195 WHERE `id` = '2b9b7227466c4889a314a8bc0236fd84'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=0718d029aeaf7fbf5fbf7442f885c116', `updatedAt` = 1785921322195 WHERE `id` = 'ff182281b3284863b13135f08407b5aa'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=8370b80ebdf5dd5b85a8ba065a6b2133', `updatedAt` = 1785921322195 WHERE `id` = '7c79171d88654fc996b2d1eeb93b75d9'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=9d3927e91ed007875a001344f061039a', `updatedAt` = 1785921322195 WHERE `id` = '32a51579ed594d3d9c272e3377110635'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=d030abf3da1bf8c00d93e78586f4a9bc', `updatedAt` = 1785921322195 WHERE `id` = '6bdef282dac0405e9738fb159e1a2d46'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=822abad93728db1326baa27b4f2dbe04', `updatedAt` = 1785921322195 WHERE `id` = 'eeaf336622364a178392c20cfbd6bb0b'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=541f9d25077780099d4e4594bea2bb4e', `updatedAt` = 1785921322195 WHERE `id` = 'b27178ff03df4fdbab5feeea0224a992'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=47148702a76cc6ea8e7807ac5d5eb6e1', `updatedAt` = 1785921322195 WHERE `id` = '87611b6d78bb490080f3456c53a99e07'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=d4e6b7275313903fb7ff9f40046f9ed6', `updatedAt` = 1785921322195 WHERE `id` = 'd0ee5ab9fa3247cf813514a88437536f'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=153ee7433a7b441bcf0df449a93cf07a', `updatedAt` = 1785921322195 WHERE `id` = 'af963d19d77a452db436174332231cb3'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=88d0311f37bd0d4afb15d3e7e1321dae', `updatedAt` = 1785921322195 WHERE `id` = 'f7a890c73c4545aeb8009de7b552f5e6'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=481b4f5262903cbc2a4c4be16144356d', `updatedAt` = 1785921322195 WHERE `id` = '41410dbe4ae34a82b982bae5b11665a8'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=43edf5cc953088145c381e89d1a2dbe5', `updatedAt` = 1785921322195 WHERE `id` = '5e0c533552d94e189f3e9ed0b847eb97'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=00a707dc661b56698cfa957da4d635e3', `updatedAt` = 1785921322195 WHERE `id` = 'b8bcaa94ac2d45b88c796626bb42cf99'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=d8cf0cffdced461cc4ba8fa4314b35de', `updatedAt` = 1785921322195 WHERE `id` = '7af124e126044917920a39382666d488'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=b269cb65dc856cd4fe21fa05de4fd27e', `updatedAt` = 1785921322195 WHERE `id` = '2de433e4f8494cd3bcd86a4d5f7931e2'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=67dc9fac0d11849f8648dae234270135', `updatedAt` = 1785921322195 WHERE `id` = '840648058ebf48e3a294fdbdb9b3453a'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=a34ed81f00b2edf70da74dbb8d6b8c99', `updatedAt` = 1785921322195 WHERE `id` = 'dbd21f6b79434b34b7369df7a48589a4'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=fcbef87b9f75c924b06fff2a03246b42', `updatedAt` = 1785921322195 WHERE `id` = 'e585d2cac7ef4b6ba7ca61a1ad663c59'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=ba467095d0ccc678e34979ba679ea020', `updatedAt` = 1785921322195 WHERE `id` = '7e2b850c0934472282805f5fddaefa87'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=b189ac3e64ea6b43a86324a2a57b0595', `updatedAt` = 1785921322195 WHERE `id` = '8f27ac9fd7f644edba46868204b5ede2'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=0e14db530463cbcdeb4f23712ce75226', `updatedAt` = 1785921322195 WHERE `id` = '313842fc6f5c4d589658a9d0fc0f25b7'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=e05e3b438130ad43908f64bca84ccd4f', `updatedAt` = 1785921322195 WHERE `id` = 'dcf6c19011a9481898eb5277f24e885a'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=9436a2f85765993e4c11c53564d3d57f', `updatedAt` = 1785921322195 WHERE `id` = '13d50644bc8141ae8e32a0b11e90045d'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=5ab1059bf731e1a99e5821b16b60f815', `updatedAt` = 1785921322195 WHERE `id` = 'c547be26c12c41199dfff259a4c039ca'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=e10382c1b724f394a34d2ee7f4c1a4b3', `updatedAt` = 1785921322195 WHERE `id` = 'f3ae0a075cd94d24b0bc1d4aec5565f7'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=ec82746b31fc662da299baa4e4546323', `updatedAt` = 1785921322195 WHERE `id` = '00448f6955cd441c8677dc2eca12006b'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=fad8a880d74a74d77cd4f5a5dfab809b', `updatedAt` = 1785921322195 WHERE `id` = '024811fd168e44948e6ab84911fc26bb'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=a14e00ff8a03f307243ce45bcb5b8c5d', `updatedAt` = 1785921322195 WHERE `id` = '9bfd257eb7974763a1035a5c82b966f7'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=67e6671dc1f2220c7e10bfc62e3675b1', `updatedAt` = 1785921322195 WHERE `id` = '7492992ba3564d35938d133d7191bb0e'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=b3e5125f364f35a8dabaa5e7dcc46516', `updatedAt` = 1785921322195 WHERE `id` = '330e42e0ae914f5392b96fb933f17b5b'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=d04a2c47e9c184a4d044abd7526013cb', `updatedAt` = 1785921322195 WHERE `id` = '87a2dcfac0da4ec4870b65693807a4d1'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=2acd67f07be21392efbd9951243d438d', `updatedAt` = 1785921322195 WHERE `id` = 'c269f94a5c8a4a4a8c8de0bb8f8f9f9a'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=036d3ba76739b6e8263087ec7a4fe0f5', `updatedAt` = 1785921322195 WHERE `id` = '6ddda19192c04f48ad76a507cd2e2c39'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=34d7aa98a4e1bed661d925e6c6010045', `updatedAt` = 1785921322195 WHERE `id` = '3cf7ee61f2ed44d6838d92dea22d857b'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=d450c3676e3934d873f00c938a44c20b', `updatedAt` = 1785921322195 WHERE `id` = '51b21e9744614be8805113293902a7ce'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=d8d831521cae0d54bbe75360cc6db970', `updatedAt` = 1785921322195 WHERE `id` = '23d30124199b486d8af79aba62440b15'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=839524da718e966329e94e5db57e751f', `updatedAt` = 1785921322195 WHERE `id` = 'd736e4d7e8644cf38f248e7ad87ed6ad'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=487eb6c9241caeacd5dbe198b2fc29f5', `updatedAt` = 1785921322195 WHERE `id` = '35a9239d754c47b9afccce173cb72d64'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=1df1f8c9847f2f2f3fdbb031f5b9b49d', `updatedAt` = 1785921322195 WHERE `id` = 'd4cab4ba599041e4b2b89cb74e7e4f35'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=e3fbc1ce067437cce9ced286d053fb88', `updatedAt` = 1785921322195 WHERE `id` = '0a2bfc8579034908baf6d035a7b14e0a'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=5f5a11d2aabd670855a205115a132223', `updatedAt` = 1785921322195 WHERE `id` = 'c03fbf17e7094f5f9d174f694dc93131'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=f7093003078726bb6143f7ee3099ceef', `updatedAt` = 1785921322195 WHERE `id` = '56620c51729f4c59a69c03ba8f5a80fc'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=ebf8e926d86c3328ea6da6b6bb377344', `updatedAt` = 1785921322195 WHERE `id` = 'ef46a58794044c73a0d1197c7b6fe41c'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=1068cd8f373106ef19dd0e6f7ed5e0c5', `updatedAt` = 1785921322195 WHERE `id` = 'c6a2ec8dc2f84f2fbba9673797e10faa'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=2d4f07ed1e1ebb4f095cbbbcabe13963', `updatedAt` = 1785921322195 WHERE `id` = '7b21d46827e9451c84809b53c1c08e2b'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=63db1069887f9acf02edeaccb2a8c9ed', `updatedAt` = 1785921322195 WHERE `id` = '43f06636029a4f16b4a8a1007312d422'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=698e1fc9c201e611e8e7cebe9dadd8ef', `updatedAt` = 1785921322195 WHERE `id` = 'b6c224df9e6c4f678f931c9006a718f0'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=360b8b91280de12276c110201c8d7425', `updatedAt` = 1785921322195 WHERE `id` = '297400c803404aa2a34f38d276eaced0'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=25454e316e3d9cf3f1520797b507efd8', `updatedAt` = 1785921322195 WHERE `id` = 'aa0ffd36239f4a13b61419744fd3fbbb'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=cb46561b1e37852cbc90815ac66c3351', `updatedAt` = 1785921322195 WHERE `id` = '7dc21dca53184791b587d9c654dccfa3'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=e12a96173d033e50aafbcc9356c811c4', `updatedAt` = 1785921322195 WHERE `id` = '939595b4c6754cb483a7d65227844c6e'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=d5d5832a552bf8d434b1c6debd777da4', `updatedAt` = 1785921322195 WHERE `id` = 'd073c1d866c0463ca571a658ee5c9760'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=7d27b774e627b02cda5df9f9970016f7', `updatedAt` = 1785921322195 WHERE `id` = '3f88a4f679fc4d78b9557055cc4bc1ae'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=fdbf15abdefc00b3388e5fadf9bd8740', `updatedAt` = 1785921322195 WHERE `id` = '8a77d32c8f9145f48f376e0886cefc59'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=00147780b5ad42a6b07c1ac54569792f', `updatedAt` = 1785921322195 WHERE `id` = '44423a17da734e318e69aa99560c81c0'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=c42ada04526004c863e50d3d17b6e408', `updatedAt` = 1785921322195 WHERE `id` = '3e10265306224ac18c4b4c7e3d7c92d0'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=3b9f9415e36b57b73d02ef674a9c7616', `updatedAt` = 1785921322195 WHERE `id` = 'ac2516a6788a4be98ffa44c5842568bb'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=09e04f045df284eaaf281c701a61ce65', `updatedAt` = 1785921322195 WHERE `id` = '59d6ba7c321a43548f04120ed1936d32'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=28c9f1b52e47184a9cba0dd3720fb9aa', `updatedAt` = 1785921322195 WHERE `id` = '6b5adca77c454fffbe112da4096a25d6'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=07ef4713927c1ff868c766c723ed1acc', `updatedAt` = 1785921322195 WHERE `id` = '575660216c844b23a1fb9ae526ec180c'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=76e0dd9b54251141b235975d31c05d12', `updatedAt` = 1785921322195 WHERE `id` = '1375120f807e4c5996f91ff77f043c59'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=857956ba68605f43198123ed76e46f34', `updatedAt` = 1785921322195 WHERE `id` = '2c61ac06b95d4b34a0e300782b4ac267'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=9d67a619eff5b7b45fe8676cb32091fe', `updatedAt` = 1785921322195 WHERE `id` = '893016b4db414bdb83eb33484c62f23a'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=12f9ae93e7b07a9b0f20f2556050ed6c', `updatedAt` = 1785921322195 WHERE `id` = 'dbaba7b31ae9484492c766286371a0be'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=d52462ba5ec9b1373d739433de2da30c', `updatedAt` = 1785921322195 WHERE `id` = '898f95af62dc47f08ea29bbbfdf89337'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=3419504fe535f6888355d9275a72630b', `updatedAt` = 1785921322195 WHERE `id` = 'fb16e44eff3f4ce5b5ecccaa2c0f9528'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=0a244bf26674a5598cd3add153438045', `updatedAt` = 1785921322195 WHERE `id` = '42d1b0ccbf254dfba7513d713c1f1489'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=58f339cfa0455455027c304a61262293', `updatedAt` = 1785921322195 WHERE `id` = '811cf28ce73c478e8f6f22827ed8f2aa'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=d3133639fcd76e0afc139536433f4082', `updatedAt` = 1785921322195 WHERE `id` = '57accf35655f40cb897917167bcad496'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=cef1ccb8a9cc8804e9c7ebe9a77228e3', `updatedAt` = 1785921322195 WHERE `id` = '05f829da70c541929e993968cf802a1c'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=221eb720d89330b020831977901ffb01', `updatedAt` = 1785921322195 WHERE `id` = 'a8966b0e0e174a8480a474979b6257b4'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=0ad363ca5afe42974bfadfedce3884ad', `updatedAt` = 1785921322195 WHERE `id` = '893a216d09b0443bb736708961cf2eeb'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=900335e540cc289670acc56a3f4efdc6', `updatedAt` = 1785921322195 WHERE `id` = '0c4ccaece05f45f8b0533cedb5ea0630'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=17d93eabe5550904da837191e873727c', `updatedAt` = 1785921322195 WHERE `id` = 'a112c7db9e554a39b73ca00fd3964d9e'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=fe57d48708f2d5775a4caf6ae9810885', `updatedAt` = 1785921322195 WHERE `id` = '23883f9ae2394684999611698f34c3d8'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=9eb136427ad27c9d7dcb3c8707722197', `updatedAt` = 1785921322195 WHERE `id` = 'e5851cdfc62b4623886b9608c42f2666'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=c6a18ba7ab1cced5ff8a143b508ac232', `updatedAt` = 1785921322195 WHERE `id` = 'abfbd5db63f14be0a51356e50f0bbe30'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=39ad45823ce67503b15d0e80baac5a90', `updatedAt` = 1785921322195 WHERE `id` = '99252619ec5e4072a98ac503fd869774'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=ac6ece2322ded47882503379cbdb11e4', `updatedAt` = 1785921322195 WHERE `id` = '6a54861491554fdc9cd83a49a580ad4f'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=ca34d08cc7be228497903791476a021c', `updatedAt` = 1785921322195 WHERE `id` = '4a764f7db2e7429ab5e348a6d81621db'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=023abe62c4dcba439ae559a117453f66', `updatedAt` = 1785921322195 WHERE `id` = 'c13558b09136482187b4725d4ed6936e'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=f1455ca7fd4317263281ac6cf41fc1ad', `updatedAt` = 1785921322195 WHERE `id` = 'f808e1e1453347e8a38cb4aa79a9e865'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=3f8884bf81ae83404e13cde55dcf79ed', `updatedAt` = 1785921322195 WHERE `id` = '6c3fcd1a66f44d8980214673959e46fe'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=c23849106f7cd6b4ebdd38ab7c736404', `updatedAt` = 1785921322195 WHERE `id` = '16388b3dd01440a180eca20da23bbcd9'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=e83e7cc6d1c9579d0c90d846123d4781', `updatedAt` = 1785921322195 WHERE `id` = 'dc2763927e3a4733a08969ab7bbd1390'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=e614a2a418affa90b4604d854bbe8f4f', `updatedAt` = 1785921322195 WHERE `id` = '50bf62d0b7da4c58a60884aeaa140fc2'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=256e79961efba17f049992fa79c44ddd', `updatedAt` = 1785921322195 WHERE `id` = '05f308a2897b424d9deb9aa6b713c779'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=5327c3f6de7725c98b4a847c820363fd', `updatedAt` = 1785921322195 WHERE `id` = 'd54c4078b7b748b9a19d49ac5f6aacfa'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=0e4100d9c4ea5176698a2345787c198c', `updatedAt` = 1785921322195 WHERE `id` = 'e04f9463a00e403eb0428f79c65d9ddc'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=b8f169e5778223784b9135af8a311524', `updatedAt` = 1785921322195 WHERE `id` = '5a994c0fceca4cdd9255ddbd8c902e93'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=0543f3f83e09ad659b9abcaefd08b94a', `updatedAt` = 1785921322195 WHERE `id` = 'bfd9983cd5924d189eef17ff250052bf'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=6a190139c0642e5364294b90a864858b', `updatedAt` = 1785921322195 WHERE `id` = 'd1abc76f12d44dae98dd3bb37945a205'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=337ecc73f2d4b46217a0037c2e7bb986', `updatedAt` = 1785921322195 WHERE `id` = '0d6c8aacf875487fb89a1ec0cbf76c52'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=98db42fa3b4eede3f6502aaaec1e8117', `updatedAt` = 1785921322195 WHERE `id` = '17c32edb450c4a8e8faf5c1fcf27684c'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=d91ad1c8f455cc80e03380f2c55b5e7a', `updatedAt` = 1785921322195 WHERE `id` = '62b1effb0c0d4f48b2b3449fe3183626'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=8a129812d0f083d933bed9f7362ce3c2', `updatedAt` = 1785921322195 WHERE `id` = 'ed6f15a03f5240ffb142f4435b67d6cc'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=3c8e7767270938e6bedabb675947d36c', `updatedAt` = 1785921322195 WHERE `id` = '3f09df78e9c746569a0e6e62ea8beea4'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=d9e86cfc1eba51102cc2a5067f669ce9', `updatedAt` = 1785921322195 WHERE `id` = '70b4f9a163e644b9a900612586b7d2e8'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=31b67a1b095a3e1e5dec07bb4377e87c', `updatedAt` = 1785921322195 WHERE `id` = '8f752c502e374ded8419fdbb16362814'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=29f151188867dd0b541b2998832e609d', `updatedAt` = 1785921322195 WHERE `id` = '22847e5583744d2298736b9d2a0e7211'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=c1f86c180293b8d8a33b733335c95d92', `updatedAt` = 1785921322195 WHERE `id` = 'ef93e3b96c57416c851c8a69bd220869'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=4a2284606c913e81a4a8ae4a30907fa1', `updatedAt` = 1785921322195 WHERE `id` = 'd34fa7359f974f5c81e21d2746fcca7e'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=750049c8122e723f2c05b07487dfcc41', `updatedAt` = 1785921322195 WHERE `id` = '94b6959991c74058b952f8bd0e0ebf81'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=7396484da3d72534752452bfcbcb0069', `updatedAt` = 1785921322195 WHERE `id` = '15156ec9f7364944aabea48475e1da80'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=c3dec28fc2456aac00b232004a37772b', `updatedAt` = 1785921322195 WHERE `id` = '3b49290f7db44130b9f6394a8212321f'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=eb7fbff546395e60c8175bea83b23ca5', `updatedAt` = 1785921322195 WHERE `id` = '5e024c7466c5462a80fe94f2fc89f129'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=c23fadfac6813aa9658850d21afe0522', `updatedAt` = 1785921322195 WHERE `id` = 'c08d85433007462db7efc429fe508a46'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=78cdcfded40ace970a47d5d3ee266cb4', `updatedAt` = 1785921322195 WHERE `id` = '261dd7f7fa3245c3937054e9792d8df0'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=355393c56fa8dfec6ca72e5bb3afb44e', `updatedAt` = 1785921322195 WHERE `id` = '9e0070b7abc84aa3a4577042e0b7c3e1'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=d3f4bdad1fea1e72a254a76bf0031b5f', `updatedAt` = 1785921322195 WHERE `id` = '360f1c3f03764c47a852caf04216d7d1'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=a19a061c9150542eaf2c606b6ce7d5db', `updatedAt` = 1785921322195 WHERE `id` = 'a9d5ff1158c346769db5edd3f74bb3ba'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=73173ed918d2432883a2fc7ce7860acf', `updatedAt` = 1785921322195 WHERE `id` = '5f2c021818d54988b10b065a6ddd3d0b'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=0cb7972d868debcea8cbaaec8c031ecd', `updatedAt` = 1785921322195 WHERE `id` = '10ecb801ca664453bcfdb6a1bd9fd04d'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=1bab0b87dda87cce3b9d2e399834cbd4', `updatedAt` = 1785921322195 WHERE `id` = '5ae60a2c86e741ea92898945ad7f62b4'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=247977f8981b0d1ba3f66d5281758af3', `updatedAt` = 1785921322195 WHERE `id` = 'ca43757872164c3eabd43692f7102fba'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=25a37b6731412687cc139354516af951', `updatedAt` = 1785921322195 WHERE `id` = 'b0febdbf99634bb388f65f2b8d9d6b42'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=09e1b869c29991070515f5fb1decb1d5', `updatedAt` = 1785921322195 WHERE `id` = 'd11cf9fe9eed4a338d7caa0af2071ea7'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=72997cecb2555f50d1ea0bd52e2d82ae', `updatedAt` = 1785921322195 WHERE `id` = '04fd4ddf2cff4091aa64926350a60437'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=26a79287dbf7e1ca3c79332fb6285862', `updatedAt` = 1785921322195 WHERE `id` = '0c08a2e7690940d9a46044cfc3470d92'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=4830086adc28e0bf629d0ff9e2857f27', `updatedAt` = 1785921322195 WHERE `id` = '871f822c2884401498278b0a78b69da3'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=644a0d084ac071002407b4a0c2f53af0', `updatedAt` = 1785921322195 WHERE `id` = '612a4fa1142d426699ddb81c5b7e4e76'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=979bfcd302f91267653322b34656a0fe', `updatedAt` = 1785921322195 WHERE `id` = 'c8d0855a2aac4ca386d36976d0431cdd'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=667e2023287032849e9eed37bd96ffab', `updatedAt` = 1785921322195 WHERE `id` = 'c0ba4f08ed2e42f0887ea20d122757fb'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=784f730e392bf97e3c8e9eb78d57e200', `updatedAt` = 1785921322195 WHERE `id` = 'f148c76e8f2942dc86be645fdb7ab09c'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=1d7a71bdce09c3edc0a1e0b5b116ee0f', `updatedAt` = 1785921322195 WHERE `id` = 'b0cc19870a994b748f8d260088f7ffe7'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=c7d5a756835c5896d7d8c43cd02e77f5', `updatedAt` = 1785921322195 WHERE `id` = 'ca9e5652184e4c6aab3a8b953ef63e2a'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=ef15dcff1a44c021f83b87de5ba67c3e', `updatedAt` = 1785921322195 WHERE `id` = '093e1e2980544d288938b8a8da57d7f0'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=9c004bc15efc7133ecdc2fdeade39757', `updatedAt` = 1785921322195 WHERE `id` = '519c8f5ab43840c7903b4d80ac41ac51'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=3f74d543dd457b89ff633f9758534a13', `updatedAt` = 1785921322195 WHERE `id` = '73df1dda0e7a4188b9fa4522fc6ef888'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=9be265f40e1fe24bf426c101f91c372e', `updatedAt` = 1785921322195 WHERE `id` = 'cf47b9d67dd34b94b8424a62371ed966'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=f56d4722eba8c35c7ad17eaee09957da', `updatedAt` = 1785921322195 WHERE `id` = 'e08ff1792e7849d1b97981f3583a0abe'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=1773284fda8bb61676c591a12fe59cc0', `updatedAt` = 1785921322195 WHERE `id` = '69280dbb3e024e558e22b834fa8249c7'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=1f362f5b49109756b1cd3e98e0d51cf2', `updatedAt` = 1785921322195 WHERE `id` = '0868f8b6f0a44fb7951c2c323ee1cd63'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=50ab45f2d7b1159dd41452711b69b12e', `updatedAt` = 1785921322195 WHERE `id` = 'c97ad132a4374e01ad39e5e089d08c43'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=3cc65760857ae6336d9c3556af831096', `updatedAt` = 1785921322195 WHERE `id` = '788400d0f7eb47edb795d41c460b14b8'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=58b5c2e00fe8a4cc907a9319638c455b', `updatedAt` = 1785921322195 WHERE `id` = 'c1709519e07946389a026905a1db5900'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=8aba95b4264509993101f56165c5230e', `updatedAt` = 1785921322195 WHERE `id` = 'b759a93a16ef4037880efa23d48f49b5'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=694bf29f0b31bb6cc39fe628596fcf10', `updatedAt` = 1785921322195 WHERE `id` = '91d79e0f4e464f298e7a6b37217386d3'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=2096b1f5b2dd220708caa011807e760b', `updatedAt` = 1785921322195 WHERE `id` = '737e57a39bae490e9c877d6e7453b046'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=58e2294be4fc14f163dfa8648e1d7766', `updatedAt` = 1785921322195 WHERE `id` = '33e81fa045e248b19381abaee38f45ee'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=c8f85b0da4d6934b6c4daa3bfaf6b4fe', `updatedAt` = 1785921322195 WHERE `id` = '77c8af32767644af914d16689e98948b'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=5aa7fee7e955f392f4348ed76dec3a96', `updatedAt` = 1785921322195 WHERE `id` = '1f917af28825403385cb385fc7e7bca0'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=3993212bfb4c32fd116309ac74a02caf', `updatedAt` = 1785921322195 WHERE `id` = 'd6132ff0c9534f7783cfda81ff60b5fd'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=8e01489dd693caea1c6ad1605a8b9496', `updatedAt` = 1785921322195 WHERE `id` = '1c643efa45d148d0b519938b2b282436'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=7e99bec530b0d1c4a23060ab2f46ba10', `updatedAt` = 1785921322195 WHERE `id` = 'e9e46237b841469585a77f8432edd55d'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=f2fe436890ce5f92128f3520780ca3a8', `updatedAt` = 1785921322195 WHERE `id` = '82356ff2bacf4821916cb42406f2552e'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=39ba4b1f22b31ef85b10125cb1745d0f', `updatedAt` = 1785921322195 WHERE `id` = '4026680943ef441082a363de91927390'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=459acd2ff8c33f855a77a03d1994854e', `updatedAt` = 1785921322195 WHERE `id` = '09abd6b8afbc48349490717c3d05707e'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=d592100d662b25fe14c546725a7eaf3b', `updatedAt` = 1785921322195 WHERE `id` = '396309f21f5441b78b42de12aaa4c273'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=39dc023de0c0ef3df9035b84246c35fc', `updatedAt` = 1785921322195 WHERE `id` = '6be01be55b4347c599e43e66dfbef173'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=d4c3f3f8efe2ce8c8ea3beb4409918e3', `updatedAt` = 1785921322195 WHERE `id` = 'fe0ae2a7d5fc4432996e3b8c369f0a18'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=21267a6fa768ee7eeedf7dba980616f4', `updatedAt` = 1785921322195 WHERE `id` = '31078d880fed42209331c69c580458c5'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=0199cc2d1f8eff511c2038571f2bbb8b', `updatedAt` = 1785921322195 WHERE `id` = '32bd9853db494301bb59757a55dc1c5d'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=837a9b8aad0e1eadceaa693dfa8e19e1', `updatedAt` = 1785921322195 WHERE `id` = 'a4cfdc91e93d4f16aeddaf27176955c5'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=a7d265dfed93cf79fca45e88bd4248ff', `updatedAt` = 1785921322195 WHERE `id` = 'fac7e9f536f94033805173e16fb6f259'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=cc24c0a16a35354f332aff2b2023f0e5', `updatedAt` = 1785921322195 WHERE `id` = 'd7c6c17eb29142b38133984ee90dacb2'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=648d406bbbf0e32c082f02cf317bc48c', `updatedAt` = 1785921322195 WHERE `id` = '946104dc00ba4709acb9ec3d1abd3239'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=49c4c2480f2027792674edaf6f40fed4', `updatedAt` = 1785921322195 WHERE `id` = 'f6485820d6b54204a35c9a5ef9e5d0dc'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=10903a2e44417f9d20c548e3424dd457', `updatedAt` = 1785921322195 WHERE `id` = '1287eb24e288460ab2651ba9c29ace32'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=486385e3da464ace8cf812de8a460761', `updatedAt` = 1785921322195 WHERE `id` = '321fa0c856f54a14993bed58cc1a95bc'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=88e8b7b022ed0c2929615bfedd231e45', `updatedAt` = 1785921322195 WHERE `id` = '1ddecadaa25c47beaef2998c278d928a'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=1a174db6bdd59b2d7e98dadf52f7f854', `updatedAt` = 1785921322195 WHERE `id` = '3f09f8a9beb644229094e6aa1bce52b6'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=d7cb87646b1579a51daff50de1c4747c', `updatedAt` = 1785921322195 WHERE `id` = 'b8817cce3ae34d49844a7ea8d8b15f3f'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=5edf99eb06031a98bc0f23b03f89bde1', `updatedAt` = 1785921322195 WHERE `id` = '509423f4ae6e48a884ac55fa9be0b7ec'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=2b9fa4f9ab358355cbaf7aa9835556ef', `updatedAt` = 1785921322195 WHERE `id` = 'e658f630b96e4774881abcf49d6780e7'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=c88694f42e0203e48d3e49f6e5e066a8', `updatedAt` = 1785921322195 WHERE `id` = '895089b920a548a9902d120c6b912d2c'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=7fec918647b9b82d4b37e2ded5cc3273', `updatedAt` = 1785921322195 WHERE `id` = '6bb151be653e49d696e385fe34fc5a17'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=2589108c8f9cdb1a6bf2d3c82dbd153d', `updatedAt` = 1785921322195 WHERE `id` = 'e8d1ced00a1c480eaf0db5f4573763c4'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=76bf9528e92883a0aacb4400b5d7898b', `updatedAt` = 1785921322195 WHERE `id` = '6784436e45124205a465dcb9f0326b1d'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=1db9ddb3a212eb2438b5aa68b4aa4f98', `updatedAt` = 1785921322195 WHERE `id` = '36e59aa2bca64ffb99b7445c14f03489'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=56942a1f6017780c63c8a46b9d465730', `updatedAt` = 1785921322195 WHERE `id` = '5a90e1f8263c49f5970389fc19b741ea'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=289c29aa7f973929396074fb0a68ee7b', `updatedAt` = 1785921322195 WHERE `id` = 'c3886b5f4e24430ea05cf1851f8b8f2c'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=e538eee29c37357a259c7064eca89482', `updatedAt` = 1785921322195 WHERE `id` = '6d2535e3117942808813ea213163c47c'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=df0c51dbe984b21bf17c2b70b7a0953b', `updatedAt` = 1785921322195 WHERE `id` = 'fbe27890530743598216d902b2a0c915'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=d127deb847eb5c3ddb66546452457d56', `updatedAt` = 1785921322195 WHERE `id` = '81567260a1ef4efd85bcbc6618766e76'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=91cdf49b7528eec7344a52c556bbbac1', `updatedAt` = 1785921322195 WHERE `id` = 'f12f0f8d012143d38c0080272ed887ff'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=62c85d34b7c83331fdc622b82ee31305', `updatedAt` = 1785921322195 WHERE `id` = 'ac32facf5b0c4c6485599a5be90350ed'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=84786acc1aa4752f9ed27d6ae05b9845', `updatedAt` = 1785921322195 WHERE `id` = '1f9e482ccebd41c182f6dca84f14f668'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=d164401cedd27b5e988a6728b167ebf9', `updatedAt` = 1785921322195 WHERE `id` = '3d6a88f3d9de4cc7b7862c2881b7963b'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=d15593858ee9e3e4740752796f0f094d', `updatedAt` = 1785921322195 WHERE `id` = 'fd9a298afb7f46aab3d2796c42da8e68'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=98049319f4d8dfd8f1600693df033a92', `updatedAt` = 1785921322195 WHERE `id` = '7a5c41f2e76a4d5ebfb6b19df7983fd2'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=e0be9482d60c2ce23d45dccf7b92b4ac', `updatedAt` = 1785921322195 WHERE `id` = '93487f22face4e18887d90154b70094a'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=c1d91269cb25ca1cdeec60480ed2bf17', `updatedAt` = 1785921322195 WHERE `id` = 'c2f9569ea8f742f8869e2a2faf8666a7'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=81537f82c536315f07c123f0648f0520', `updatedAt` = 1785921322195 WHERE `id` = '51b1e376ee6644eb8629b30857f96f27'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=43d984e35c070aeef9e02a6948ce0f13', `updatedAt` = 1785921322195 WHERE `id` = '72e8f153e0ed40439c97e0bef43afb1e'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=d89c1c55b52118f5383ac8556041a192', `updatedAt` = 1785921322195 WHERE `id` = 'a993711d11e444f1a7c08589a4497690'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=651318033c80de8942937333a27bd181', `updatedAt` = 1785921322195 WHERE `id` = '5cc02dac08c746bf965b4c441f5b7fb5'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=9098831f78c6f63f34c47f50601cbf28', `updatedAt` = 1785921322195 WHERE `id` = '86dda8e2d0ab4703b6933c45b6705cf4'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=25f386be14f1bd2ff927466933513668', `updatedAt` = 1785921322195 WHERE `id` = '3668daf0338a479985f455c8e61d6558'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=a9d83741ede7ab47a93e60f19805d47c', `updatedAt` = 1785921322195 WHERE `id` = '5ba858277fa44aaf958b32055468f52a'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=7bba23aa9d61198c66cd8977dbdf0ae2', `updatedAt` = 1785921322195 WHERE `id` = '0a9fab6f3ac84d8c95b08a05aa8a19fc'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=fde27ef077ff704c35dc2f7502ebfa9e', `updatedAt` = 1785921322195 WHERE `id` = 'e3399da9b2a64b28846e4f50df3cc4dd'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=0fe41721790a452cec7765a8442d25bc', `updatedAt` = 1785921322195 WHERE `id` = '8bfae2e4dabb48528ee64963b7112d61'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=964516a2efab750738d553a978f14e9e', `updatedAt` = 1785921322195 WHERE `id` = 'a58a5431a08e402eb6adc5e14eec1cb5'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=3b7caee281e29c602c60d25f0dbb6a2f', `updatedAt` = 1785921322195 WHERE `id` = 'f3c752d16ca74e06acf859b9a3a08188'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=4a97b1a9396b26c445ef930f29493015', `updatedAt` = 1785921322195 WHERE `id` = '26e7dc9c76694fb0837237b071bc4a03'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=0a4136ea1398e76edef2aaae2fcf13a8', `updatedAt` = 1785921322195 WHERE `id` = '68ac8d18e53b43e1829274c17836df6d'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=842e0dce2c45f44751675860bb859d63', `updatedAt` = 1785921322195 WHERE `id` = 'f30cfea57bc44aac88824ee6fa0803ee'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=69d455afdb1d6bee4d316344e52b8d18', `updatedAt` = 1785921322195 WHERE `id` = 'f50b3389bbed484ebe3098745371e511'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=ab10e2a86d3e360f210464535ec12629', `updatedAt` = 1785921322195 WHERE `id` = 'a0f47f6a6d734c8b9c6ce5c0dfd80001'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=43448e1d37a564fb05d7fc3eb2651dfe', `updatedAt` = 1785921322195 WHERE `id` = 'b7c63f0c73a44a9a8c4f3d3bb1a10001'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=a8ee468acd66c5486f58d4593c46ac64', `updatedAt` = 1785921322195 WHERE `id` = 'b7c63f0c73a44a9a8c4f3d3bb1a10006'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=755643ca253b6fe42953aeac9b6f910b', `updatedAt` = 1785921322195 WHERE `id` = 'd3020be8291342538d40aa8f1ae7813f'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=000c9c07dc2f9b4013aab7cdc092b593', `updatedAt` = 1785921322195 WHERE `id` = '80734d9573e34285859c5fcd70d60fe1'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=1a6d2f1a594ab7860c0f15008c60c314', `updatedAt` = 1785921322195 WHERE `id` = '08793469d707454eb7a692b13609230b'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=d44ecddd34378a79f7da58e23cd3c8a6', `updatedAt` = 1785921322195 WHERE `id` = '3af0f040336741ff9dd754ccd83ab325'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=f8482973e06e66b0db234cf6380b7d95', `updatedAt` = 1785921322195 WHERE `id` = '82946217f37e466d87f123c6987991e1'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=b84d1af3a4484c1b39365979fae6c585', `updatedAt` = 1785921322195 WHERE `id` = '3e9a7611fa96490d8adc393387b1d65a'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=68ac60361c0f193cc355110c0b0f2b6d', `updatedAt` = 1785921322195 WHERE `id` = '47a997dcc93945b293f725d7171ff418'; +UPDATE `sys_menu` SET `picIcon` = '/platform/sys/file/download?id=ca3fececdab634c789e2f1d162ec62ba', `updatedAt` = 1785921322195 WHERE `id` = '2a93542d26c140e79e615edaa4ddda58'; + +COMMIT; diff --git a/src/main/resources/db/menu/update_tour_service_unit_menu.sql b/src/main/resources/db/menu/update_tour_service_unit_menu.sql new file mode 100644 index 00000000..ed496c58 --- /dev/null +++ b/src/main/resources/db/menu/update_tour_service_unit_menu.sql @@ -0,0 +1,8 @@ +-- 已初始化环境通过权限标识定位菜单,仅更新展示信息,不改变权限和访问路径。 +UPDATE sys_menu +SET name = '服务单位管理', + aliasName = 'Service Unit', + initialPinyinName = 'f', + updatedAt = UNIX_TIMESTAMP(NOW()) * 1000 +WHERE permission = 'tour.travelAgency' + AND delFlag = 0; diff --git a/src/main/resources/db/spread_create.sql b/src/main/resources/db/spread_create.sql new file mode 100644 index 00000000..91a6b6f5 --- /dev/null +++ b/src/main/resources/db/spread_create.sql @@ -0,0 +1,79 @@ +-- 风采墙栏目表,适用于 MySQL 8。 +CREATE TABLE IF NOT EXISTS `spread_category` ( + `id` varchar(32) NOT NULL COMMENT 'ID', + `parentId` varchar(32) NOT NULL DEFAULT '0' COMMENT '父栏目ID,0表示顶级栏目', + `name` varchar(100) NOT NULL COMMENT '栏目名称', + `code` varchar(50) DEFAULT NULL COMMENT '栏目编码(兼容预置数据,页面无需维护)', + `sortOrder` int NOT NULL DEFAULT 255 COMMENT '排序,数值越小越靠前', + `visible` tinyint NOT NULL DEFAULT 1 COMMENT '是否可见:0否,1是', + `slider` tinyint NOT NULL DEFAULT 0 COMMENT '是否参与轮播:0否,1是', + `createdBy` varchar(32) DEFAULT NULL COMMENT '创建人', + `createdAt` bigint DEFAULT NULL COMMENT '创建时间', + `updatedBy` varchar(32) DEFAULT NULL COMMENT '修改人', + `updatedAt` bigint DEFAULT NULL COMMENT '修改时间', + `delFlag` tinyint NOT NULL DEFAULT 0 COMMENT '删除标记', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_spread_category_code` (`code`), + KEY `idx_spread_category_parent` (`parentId`), + KEY `idx_spread_category_visible_sort` (`visible`, `sortOrder`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='风采墙栏目'; + +-- 风采墙内容表。 +CREATE TABLE IF NOT EXISTS `spread_content` ( + `id` varchar(32) NOT NULL COMMENT 'ID', + `categoryId` varchar(32) NOT NULL COMMENT '栏目ID', + `categoryName` varchar(100) NOT NULL COMMENT '栏目名称', + `unionId` varchar(32) DEFAULT NULL COMMENT '所属工会ID', + `unionName` varchar(100) DEFAULT NULL COMMENT '所属工会名称', + `title` varchar(300) NOT NULL COMMENT '标题', + `subTitle` varchar(255) DEFAULT NULL COMMENT '副标题', + `summary` varchar(1000) DEFAULT NULL COMMENT '摘要', + `contentBody` longtext COMMENT 'HTML正文', + `thumbUrl` varchar(1000) DEFAULT NULL COMMENT '封面图', + `sliderImages` longtext COMMENT '轮播图片JSON', + `isTop` tinyint NOT NULL DEFAULT 0 COMMENT '是否置顶', + `isRecommend` tinyint NOT NULL DEFAULT 0 COMMENT '是否推荐', + `isHeadline` tinyint NOT NULL DEFAULT 0 COMMENT '是否头条', + `viewCount` int NOT NULL DEFAULT 0 COMMENT '浏览量', + `sortOrder` int NOT NULL DEFAULT 255 COMMENT '排序', + `isPublished` tinyint NOT NULL DEFAULT 0 COMMENT '是否发布', + `publishedAt` bigint DEFAULT NULL COMMENT '发布时间', + `createdBy` varchar(32) DEFAULT NULL COMMENT '创建人', + `createdAt` bigint DEFAULT NULL COMMENT '创建时间', + `updatedBy` varchar(32) DEFAULT NULL COMMENT '修改人', + `updatedAt` bigint DEFAULT NULL COMMENT '修改时间', + `delFlag` tinyint NOT NULL DEFAULT 0 COMMENT '删除标记', + PRIMARY KEY (`id`), + KEY `idx_spread_content_category` (`categoryId`), + KEY `idx_spread_content_union` (`unionId`), + KEY `idx_spread_content_publish` (`isPublished`, `publishedAt`), + KEY `idx_spread_content_top_sort` (`isTop`, `sortOrder`), + KEY `idx_spread_content_created` (`createdAt`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='风采墙内容'; + +-- 初始化栏目,仅在对应编码不存在时插入,脚本可重复执行。 +INSERT INTO `spread_category` +(`id`, `parentId`, `name`, `code`, `sortOrder`, `visible`, `slider`, `createdBy`, `createdAt`, `updatedBy`, `updatedAt`, `delFlag`) +SELECT '9f5c0100000000000000000000000001', '0', '风采展示', 'style_wall', 1, 1, 1, '', UNIX_TIMESTAMP(NOW()) * 1000, '', UNIX_TIMESTAMP(NOW()) * 1000, 0 +WHERE NOT EXISTS (SELECT 1 FROM `spread_category` WHERE `code` = 'style_wall'); + +INSERT INTO `spread_category` +(`id`, `parentId`, `name`, `code`, `sortOrder`, `visible`, `slider`, `createdBy`, `createdAt`, `updatedBy`, `updatedAt`, `delFlag`) +SELECT '9f5c0100000000000000000000000002', p.id, '劳模风采', 'model_worker_style', 1, 1, 1, '', UNIX_TIMESTAMP(NOW()) * 1000, '', UNIX_TIMESTAMP(NOW()) * 1000, 0 +FROM `spread_category` p +WHERE p.code = 'style_wall' + AND NOT EXISTS (SELECT 1 FROM `spread_category` WHERE `code` = 'model_worker_style'); + +INSERT INTO `spread_category` +(`id`, `parentId`, `name`, `code`, `sortOrder`, `visible`, `slider`, `createdBy`, `createdAt`, `updatedBy`, `updatedAt`, `delFlag`) +SELECT '9f5c0100000000000000000000000003', p.id, '巾帼风采', 'women_style', 2, 1, 1, '', UNIX_TIMESTAMP(NOW()) * 1000, '', UNIX_TIMESTAMP(NOW()) * 1000, 0 +FROM `spread_category` p +WHERE p.code = 'style_wall' + AND NOT EXISTS (SELECT 1 FROM `spread_category` WHERE `code` = 'women_style'); + +INSERT INTO `spread_category` +(`id`, `parentId`, `name`, `code`, `sortOrder`, `visible`, `slider`, `createdBy`, `createdAt`, `updatedBy`, `updatedAt`, `delFlag`) +SELECT '9f5c0100000000000000000000000004', p.id, '教工风采', 'faculty_style', 3, 1, 1, '', UNIX_TIMESTAMP(NOW()) * 1000, '', UNIX_TIMESTAMP(NOW()) * 1000, 0 +FROM `spread_category` p +WHERE p.code = 'style_wall' + AND NOT EXISTS (SELECT 1 FROM `spread_category` WHERE `code` = 'faculty_style'); diff --git a/src/main/resources/db/sys_user_add_pending_confirm_status.sql b/src/main/resources/db/sys_user_add_pending_confirm_status.sql new file mode 100644 index 00000000..10a2a8dd --- /dev/null +++ b/src/main/resources/db/sys_user_add_pending_confirm_status.sql @@ -0,0 +1,19 @@ +-- 系统用户增加人员待确认状态:0不用确认、1待确认、2已确认。 +-- 脚本支持重复执行,字段已存在时不再修改表结构。 +SET @pending_confirm_status_column_count = ( + SELECT COUNT(*) + FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'sys_user' + AND COLUMN_NAME = 'pendingConfirmStatus' +); + +SET @pending_confirm_status_ddl = IF( + @pending_confirm_status_column_count = 0, + 'ALTER TABLE sys_user ADD COLUMN pendingConfirmStatus TINYINT NOT NULL DEFAULT 0 COMMENT ''待确认状态:0不用确认、1待确认、2已确认'' AFTER personType', + 'SELECT 1' +); + +PREPARE pending_confirm_status_stmt FROM @pending_confirm_status_ddl; +EXECUTE pending_confirm_status_stmt; +DEALLOCATE PREPARE pending_confirm_status_stmt; diff --git a/src/main/resources/db/sys_user_role_add_enable.sql b/src/main/resources/db/sys_user_role_add_enable.sql new file mode 100644 index 00000000..775cfbe5 --- /dev/null +++ b/src/main/resources/db/sys_user_role_add_enable.sql @@ -0,0 +1,41 @@ +-- 用户角色关系增加启用状态,并按当前开启的教代会届次初始化历史数据。 +-- 脚本支持重复执行:字段已存在时不再重复修改表结构。 +SET @sys_user_role_enable_column_count = ( + SELECT COUNT(*) + FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'sys_user_role' + AND COLUMN_NAME = 'enable' +); + +SET @sys_user_role_enable_ddl = IF( + @sys_user_role_enable_column_count = 0, + 'ALTER TABLE sys_user_role ADD COLUMN enable TINYINT(1) NOT NULL DEFAULT 1 COMMENT ''是否启用:1启用,0禁用'' AFTER userId', + 'SELECT 1' +); + +PREPARE sys_user_role_enable_stmt FROM @sys_user_role_enable_ddl; +EXECUTE sys_user_role_enable_stmt; +DEALLOCATE PREPARE sys_user_role_enable_stmt; + +-- 普通角色不受教代会届次切换影响,历史数据统一保持启用。 +UPDATE sys_user_role +SET enable = 1 +WHERE tcSessionId IS NULL OR tcSessionId = ''; + +-- 历史教代会届次角色先全部禁用,再只启用当前开启的最新届次。 +UPDATE sys_user_role +SET enable = 0 +WHERE tcSessionId IS NOT NULL AND tcSessionId <> ''; + +SET @current_teacher_congress_session_id = ( + SELECT id + FROM teacher_congress_session + WHERE enable = 1 + ORDER BY startDate DESC, createdAt DESC, id DESC + LIMIT 1 +); + +UPDATE sys_user_role +SET enable = 1 +WHERE tcSessionId = @current_teacher_congress_session_id; diff --git a/src/main/resources/db/tour_ledger_add_in_province_check_index.sql b/src/main/resources/db/tour_ledger_add_in_province_check_index.sql new file mode 100644 index 00000000..340f6e4c --- /dev/null +++ b/src/main/resources/db/tour_ledger_add_in_province_check_index.sql @@ -0,0 +1,3 @@ +-- 省内参加间隔按工号、年度、线路类型和参加状态查询,补充联合索引降低报名校验耗时。 +ALTER TABLE `tour_ledger` + ADD KEY `idx_tour_ledger_in_province_check` (`jobNo`, `joined`, `delFlag`, `lineType`, `year`); diff --git a/src/main/resources/db/tour_ledger_add_union_quota_index.sql b/src/main/resources/db/tour_ledger_add_union_quota_index.sql new file mode 100644 index 00000000..dcc1243f --- /dev/null +++ b/src/main/resources/db/tour_ledger_add_union_quota_index.sql @@ -0,0 +1,3 @@ +-- 分工会名额校验按事项、分工会和删除状态统计报名人数,补充联合索引降低抢票时锁内查询耗时。 +ALTER TABLE `tour_ledger` + ADD KEY `idx_tour_ledger_matter_union_del` (`matterId`, `unionId`, `delFlag`); diff --git a/src/main/resources/db/tour_setting_add_in_province_years.sql b/src/main/resources/db/tour_setting_add_in_province_years.sql new file mode 100644 index 00000000..d38c2cd4 --- /dev/null +++ b/src/main/resources/db/tour_setting_add_in_province_years.sql @@ -0,0 +1,3 @@ +-- 疗休养配置增加省内参加间隔年限,历史配置默认不限制。 +ALTER TABLE `tour_setting` + ADD COLUMN `inProvinceYears` int DEFAULT 0 COMMENT '省内几年去一次' AFTER `maxGroupPeople`; diff --git a/src/main/resources/db/train_sign_up_activity_add_template_status.sql b/src/main/resources/db/train_sign_up_activity_add_template_status.sql new file mode 100644 index 00000000..548b70ba --- /dev/null +++ b/src/main/resources/db/train_sign_up_activity_add_template_status.sql @@ -0,0 +1,7 @@ +-- 品牌活动增加模板设置状态,并根据现有工作模板回填历史数据。 +ALTER TABLE `train_sign_up_activity` + ADD COLUMN `templateStatus` tinyint(1) NOT NULL DEFAULT 0 COMMENT '模板设置状态 0.未设置 1.已设置'; + +UPDATE `train_sign_up_activity` activity +INNER JOIN `sys_home_template` template ON template.`id` = activity.`id` +SET activity.`templateStatus` = 1; diff --git a/src/main/resources/static/assets/mobile/img/activity/culture-empty.png b/src/main/resources/static/assets/mobile/img/activity/culture-empty.png new file mode 100644 index 00000000..7363ec6f Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/activity/culture-empty.png differ diff --git a/src/main/resources/static/assets/mobile/img/activity/family-empty.png b/src/main/resources/static/assets/mobile/img/activity/family-empty.png new file mode 100644 index 00000000..0a6d35c7 Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/activity/family-empty.png differ diff --git a/src/main/resources/static/assets/mobile/img/activity/hero/brand-hero-v2.png b/src/main/resources/static/assets/mobile/img/activity/hero/brand-hero-v2.png new file mode 100644 index 00000000..cf56618c Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/activity/hero/brand-hero-v2.png differ diff --git a/src/main/resources/static/assets/mobile/img/activity/hero/culture-hero-v2.png b/src/main/resources/static/assets/mobile/img/activity/hero/culture-hero-v2.png new file mode 100644 index 00000000..1b690574 Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/activity/hero/culture-hero-v2.png differ diff --git a/src/main/resources/static/assets/mobile/img/activity/hero/culture-hero-v3.png b/src/main/resources/static/assets/mobile/img/activity/hero/culture-hero-v3.png new file mode 100644 index 00000000..a9b3777c Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/activity/hero/culture-hero-v3.png differ diff --git a/src/main/resources/static/assets/mobile/img/activity/hero/family-hero-v2.png b/src/main/resources/static/assets/mobile/img/activity/hero/family-hero-v2.png new file mode 100644 index 00000000..21468506 Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/activity/hero/family-hero-v2.png differ diff --git a/src/main/resources/static/assets/mobile/img/activity/hero/family-hero-v3.png b/src/main/resources/static/assets/mobile/img/activity/hero/family-hero-v3.png new file mode 100644 index 00000000..41b2d42a Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/activity/hero/family-hero-v3.png differ diff --git a/src/main/resources/static/assets/mobile/img/activity/hero/sports-hero-v2.png b/src/main/resources/static/assets/mobile/img/activity/hero/sports-hero-v2.png new file mode 100644 index 00000000..1384656e Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/activity/hero/sports-hero-v2.png differ diff --git a/src/main/resources/static/assets/mobile/img/activity/schedule-empty.png b/src/main/resources/static/assets/mobile/img/activity/schedule-empty.png new file mode 100644 index 00000000..c3a5a471 Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/activity/schedule-empty.png differ diff --git a/src/main/resources/static/assets/mobile/img/activity/sports-empty.png b/src/main/resources/static/assets/mobile/img/activity/sports-empty.png new file mode 100644 index 00000000..dd556d04 Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/activity/sports-empty.png differ diff --git a/src/main/resources/static/assets/mobile/img/benefit/welfare-empty.png b/src/main/resources/static/assets/mobile/img/benefit/welfare-empty.png new file mode 100644 index 00000000..dbe0c4fc Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/benefit/welfare-empty.png differ diff --git a/src/main/resources/static/assets/mobile/img/benefit/welfare-selection-hero-v2.png b/src/main/resources/static/assets/mobile/img/benefit/welfare-selection-hero-v2.png new file mode 100644 index 00000000..d9fbe6f7 Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/benefit/welfare-selection-hero-v2.png differ diff --git a/src/main/resources/static/assets/mobile/img/birthday/custom-bg.png b/src/main/resources/static/assets/mobile/img/birthday/custom-bg.png new file mode 100644 index 00000000..f94869d4 Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/birthday/custom-bg.png differ diff --git a/src/main/resources/static/assets/mobile/img/common/smart-union-loading-red.svg b/src/main/resources/static/assets/mobile/img/common/smart-union-loading-red.svg new file mode 100644 index 00000000..25c2a727 --- /dev/null +++ b/src/main/resources/static/assets/mobile/img/common/smart-union-loading-red.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/main/resources/static/assets/mobile/img/common/smart-union-loading.png b/src/main/resources/static/assets/mobile/img/common/smart-union-loading.png new file mode 100644 index 00000000..57833012 Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/common/smart-union-loading.png differ diff --git a/src/main/resources/static/assets/mobile/img/condolence/condolence-empty.png b/src/main/resources/static/assets/mobile/img/condolence/condolence-empty.png new file mode 100644 index 00000000..0dd32328 Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/condolence/condolence-empty.png differ diff --git a/src/main/resources/static/assets/mobile/img/home/v4/app-center-empty-v4.png b/src/main/resources/static/assets/mobile/img/home/v4/app-center-empty-v4.png new file mode 100644 index 00000000..34375bf8 Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/home/v4/app-center-empty-v4.png differ diff --git a/src/main/resources/static/assets/mobile/img/home/v4/apps-guide-banner.png b/src/main/resources/static/assets/mobile/img/home/v4/apps-guide-banner.png new file mode 100644 index 00000000..15402a95 Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/home/v4/apps-guide-banner.png differ diff --git a/src/main/resources/static/assets/mobile/img/home/v4/feature-activity-v2.png b/src/main/resources/static/assets/mobile/img/home/v4/feature-activity-v2.png new file mode 100644 index 00000000..016c82b9 Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/home/v4/feature-activity-v2.png differ diff --git a/src/main/resources/static/assets/mobile/img/home/v4/feature-activity-v3.png b/src/main/resources/static/assets/mobile/img/home/v4/feature-activity-v3.png new file mode 100644 index 00000000..9b7ec1cb Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/home/v4/feature-activity-v3.png differ diff --git a/src/main/resources/static/assets/mobile/img/home/v4/feature-activity-v4.png b/src/main/resources/static/assets/mobile/img/home/v4/feature-activity-v4.png new file mode 100644 index 00000000..0178d17d Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/home/v4/feature-activity-v4.png differ diff --git a/src/main/resources/static/assets/mobile/img/home/v4/feature-activity-v5.png b/src/main/resources/static/assets/mobile/img/home/v4/feature-activity-v5.png new file mode 100644 index 00000000..9724d80e Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/home/v4/feature-activity-v5.png differ diff --git a/src/main/resources/static/assets/mobile/img/home/v4/feature-activity.png b/src/main/resources/static/assets/mobile/img/home/v4/feature-activity.png new file mode 100644 index 00000000..fe5a8be7 Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/home/v4/feature-activity.png differ diff --git a/src/main/resources/static/assets/mobile/img/home/v4/feature-benefit-v2.png b/src/main/resources/static/assets/mobile/img/home/v4/feature-benefit-v2.png new file mode 100644 index 00000000..d917fb4b Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/home/v4/feature-benefit-v2.png differ diff --git a/src/main/resources/static/assets/mobile/img/home/v4/feature-benefit-v3.png b/src/main/resources/static/assets/mobile/img/home/v4/feature-benefit-v3.png new file mode 100644 index 00000000..01b89191 Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/home/v4/feature-benefit-v3.png differ diff --git a/src/main/resources/static/assets/mobile/img/home/v4/feature-benefit-v4.png b/src/main/resources/static/assets/mobile/img/home/v4/feature-benefit-v4.png new file mode 100644 index 00000000..c4451a12 Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/home/v4/feature-benefit-v4.png differ diff --git a/src/main/resources/static/assets/mobile/img/home/v4/feature-benefit-v5.png b/src/main/resources/static/assets/mobile/img/home/v4/feature-benefit-v5.png new file mode 100644 index 00000000..7098f633 Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/home/v4/feature-benefit-v5.png differ diff --git a/src/main/resources/static/assets/mobile/img/home/v4/feature-benefit.png b/src/main/resources/static/assets/mobile/img/home/v4/feature-benefit.png new file mode 100644 index 00000000..ab093462 Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/home/v4/feature-benefit.png differ diff --git a/src/main/resources/static/assets/mobile/img/home/v4/feature-inclusive-v2.png b/src/main/resources/static/assets/mobile/img/home/v4/feature-inclusive-v2.png new file mode 100644 index 00000000..2a73111d Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/home/v4/feature-inclusive-v2.png differ diff --git a/src/main/resources/static/assets/mobile/img/home/v4/feature-inclusive-v3.png b/src/main/resources/static/assets/mobile/img/home/v4/feature-inclusive-v3.png new file mode 100644 index 00000000..d43df616 Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/home/v4/feature-inclusive-v3.png differ diff --git a/src/main/resources/static/assets/mobile/img/home/v4/feature-inclusive-v4.png b/src/main/resources/static/assets/mobile/img/home/v4/feature-inclusive-v4.png new file mode 100644 index 00000000..1520d577 Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/home/v4/feature-inclusive-v4.png differ diff --git a/src/main/resources/static/assets/mobile/img/home/v4/feature-inclusive-v5.png b/src/main/resources/static/assets/mobile/img/home/v4/feature-inclusive-v5.png new file mode 100644 index 00000000..532b1ad1 Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/home/v4/feature-inclusive-v5.png differ diff --git a/src/main/resources/static/assets/mobile/img/home/v4/feature-inclusive-v6.png b/src/main/resources/static/assets/mobile/img/home/v4/feature-inclusive-v6.png new file mode 100644 index 00000000..d9e68e7c Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/home/v4/feature-inclusive-v6.png differ diff --git a/src/main/resources/static/assets/mobile/img/home/v4/feature-inclusive-v7.png b/src/main/resources/static/assets/mobile/img/home/v4/feature-inclusive-v7.png new file mode 100644 index 00000000..6e6b9872 Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/home/v4/feature-inclusive-v7.png differ diff --git a/src/main/resources/static/assets/mobile/img/home/v4/feature-inclusive-v8.png b/src/main/resources/static/assets/mobile/img/home/v4/feature-inclusive-v8.png new file mode 100644 index 00000000..3faed4d3 Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/home/v4/feature-inclusive-v8.png differ diff --git a/src/main/resources/static/assets/mobile/img/home/v4/feature-inclusive.png b/src/main/resources/static/assets/mobile/img/home/v4/feature-inclusive.png new file mode 100644 index 00000000..ca554012 Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/home/v4/feature-inclusive.png differ diff --git a/src/main/resources/static/assets/mobile/img/home/v4/feature-model-v2.png b/src/main/resources/static/assets/mobile/img/home/v4/feature-model-v2.png new file mode 100644 index 00000000..d2720632 Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/home/v4/feature-model-v2.png differ diff --git a/src/main/resources/static/assets/mobile/img/home/v4/feature-model-v3.png b/src/main/resources/static/assets/mobile/img/home/v4/feature-model-v3.png new file mode 100644 index 00000000..bb1f60a6 Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/home/v4/feature-model-v3.png differ diff --git a/src/main/resources/static/assets/mobile/img/home/v4/feature-model-v4.png b/src/main/resources/static/assets/mobile/img/home/v4/feature-model-v4.png new file mode 100644 index 00000000..22532c68 Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/home/v4/feature-model-v4.png differ diff --git a/src/main/resources/static/assets/mobile/img/home/v4/feature-model-v5.png b/src/main/resources/static/assets/mobile/img/home/v4/feature-model-v5.png new file mode 100644 index 00000000..92999376 Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/home/v4/feature-model-v5.png differ diff --git a/src/main/resources/static/assets/mobile/img/home/v4/feature-model.png b/src/main/resources/static/assets/mobile/img/home/v4/feature-model.png new file mode 100644 index 00000000..3f9b9928 Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/home/v4/feature-model.png differ diff --git a/src/main/resources/static/assets/mobile/img/home/v4/hero-campus.png b/src/main/resources/static/assets/mobile/img/home/v4/hero-campus.png new file mode 100644 index 00000000..d93173b4 Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/home/v4/hero-campus.png differ diff --git a/src/main/resources/static/assets/mobile/img/home/v4/recommend/会员入会.png b/src/main/resources/static/assets/mobile/img/home/v4/recommend/会员入会.png new file mode 100644 index 00000000..18bf7441 Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/home/v4/recommend/会员入会.png differ diff --git a/src/main/resources/static/assets/mobile/img/home/v4/recommend/帮扶申请.png b/src/main/resources/static/assets/mobile/img/home/v4/recommend/帮扶申请.png new file mode 100644 index 00000000..912ef80a Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/home/v4/recommend/帮扶申请.png differ diff --git a/src/main/resources/static/assets/mobile/img/home/v4/recommend/慰问申请.png b/src/main/resources/static/assets/mobile/img/home/v4/recommend/慰问申请.png new file mode 100644 index 00000000..5b6f104a Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/home/v4/recommend/慰问申请.png differ diff --git a/src/main/resources/static/assets/mobile/img/home/v4/recommend/撰写提案.png b/src/main/resources/static/assets/mobile/img/home/v4/recommend/撰写提案.png new file mode 100644 index 00000000..555b2b7e Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/home/v4/recommend/撰写提案.png differ diff --git a/src/main/resources/static/assets/mobile/img/home/v4/recommend/疗休养报名.png b/src/main/resources/static/assets/mobile/img/home/v4/recommend/疗休养报名.png new file mode 100644 index 00000000..aed9ba49 Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/home/v4/recommend/疗休养报名.png differ diff --git a/src/main/resources/static/assets/mobile/img/home/v4/recommend/社团入会.png b/src/main/resources/static/assets/mobile/img/home/v4/recommend/社团入会.png new file mode 100644 index 00000000..0ec2a833 Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/home/v4/recommend/社团入会.png differ diff --git a/src/main/resources/static/assets/mobile/img/home/v4/recommend/问卷调查.png b/src/main/resources/static/assets/mobile/img/home/v4/recommend/问卷调查.png new file mode 100644 index 00000000..80631ca7 Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/home/v4/recommend/问卷调查.png differ diff --git a/src/main/resources/static/assets/mobile/img/home/v4/union-news-empty-v2.png b/src/main/resources/static/assets/mobile/img/home/v4/union-news-empty-v2.png new file mode 100644 index 00000000..821a1060 Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/home/v4/union-news-empty-v2.png differ diff --git a/src/main/resources/static/assets/mobile/img/home/v4/union-news-empty-v3.png b/src/main/resources/static/assets/mobile/img/home/v4/union-news-empty-v3.png new file mode 100644 index 00000000..1fe8c2c9 Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/home/v4/union-news-empty-v3.png differ diff --git a/src/main/resources/static/assets/mobile/img/home/v4/union-news-empty-v4.png b/src/main/resources/static/assets/mobile/img/home/v4/union-news-empty-v4.png new file mode 100644 index 00000000..3bcbbf79 Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/home/v4/union-news-empty-v4.png differ diff --git a/src/main/resources/static/assets/mobile/img/home/v4/union-news-empty.png b/src/main/resources/static/assets/mobile/img/home/v4/union-news-empty.png new file mode 100644 index 00000000..2b6e9a76 Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/home/v4/union-news-empty.png differ diff --git a/src/main/resources/static/assets/mobile/img/home/v4/中国地质大学-logo.png b/src/main/resources/static/assets/mobile/img/home/v4/中国地质大学-logo.png new file mode 100644 index 00000000..bff3e78b Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/home/v4/中国地质大学-logo.png differ diff --git a/src/main/resources/static/assets/mobile/img/proposal/proposal-empty.png b/src/main/resources/static/assets/mobile/img/proposal/proposal-empty.png new file mode 100644 index 00000000..f43bd511 Binary files /dev/null and b/src/main/resources/static/assets/mobile/img/proposal/proposal-empty.png differ diff --git a/src/main/resources/static/assets/mobile/lottie/birthday/happyBirthday.json b/src/main/resources/static/assets/mobile/lottie/birthday/happyBirthday.json new file mode 100644 index 00000000..7a9eb4d2 --- /dev/null +++ b/src/main/resources/static/assets/mobile/lottie/birthday/happyBirthday.json @@ -0,0 +1 @@ +{"v":"4.8.0","meta":{"g":"LottieFiles AE ","a":"","k":"","d":"","tc":""},"fr":23.9759979248047,"ip":0,"op":134.999988315342,"w":1080,"h":747,"nm":"Base","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":23,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":6,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":13,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":14,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":18,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":21,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":32,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":38,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":39,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":46,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":47,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":48,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":49,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":50,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":51,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":52,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":53,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":54,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":55,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":56,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":57,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":58,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":59,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":61,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":62,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":63,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":64,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":65,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":66,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":67,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":68,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":69,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":70,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":71,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":72,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":73,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":74,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":75,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":76,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":77,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":78,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":79,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":80,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":81,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":82,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":83,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":84,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":85,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":86,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":87,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":88,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":89,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":90,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":91,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":92,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":93,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":94,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":95,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":96,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":97,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":98,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":99,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":100,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":101,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":102,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":103,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":104,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":105,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":106,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":107,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":108,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":109,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":110,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":111,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":112,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":113,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":114,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":115,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":116,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":117,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":118,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":119,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":120,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":121,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":122,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":123,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":124,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":125,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":126,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":127,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":128,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":129,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":130,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":131,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":132,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":133,"s":[0]},{"t":133.999988401895,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":2,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":5,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":7,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":9,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":19,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":23,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":24,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":27,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":28,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":29,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":32,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":33,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":36,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":37,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":39,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":44,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":45,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":47,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":48,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":49,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":51,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":52,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":53,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":54,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":55,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":56,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":57,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":58,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":59,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":60,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":61,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":62,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":63,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":64,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":65,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":66,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":67,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":68,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":69,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":70,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":71,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":72,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":73,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":74,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":75,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":76,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":77,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":78,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":79,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":80,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":81,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":82,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":83,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":84,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":85,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":86,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":87,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":88,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":89,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":90,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":91,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":92,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":93,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":94,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":95,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":96,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":97,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":98,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":99,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":100,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":101,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":102,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":103,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":104,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":105,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":106,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":107,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":108,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":109,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":110,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":111,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":112,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":113,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":114,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":115,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":116,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":117,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":118,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":119,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":120,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":121,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":122,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":123,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":124,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":125,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":126,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":127,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":128,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":129,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":130,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":131,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":132,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":133,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"t":133.999988401895,"s":[540,373.5,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":1,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":2,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":3,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":4,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":5,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":6,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":7,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":8,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":9,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":10,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":11,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":12,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":13,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":14,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":15,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":16,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":17,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":18,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":19,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":20,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":21,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":22,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":23,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":24,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":25,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":26,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":27,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":28,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":29,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":30,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":31,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":33,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":34,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":35,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":36,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":37,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":38,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":39,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":40,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":41,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":42,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":43,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":44,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":45,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":46,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":47,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":48,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":49,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":50,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":51,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":52,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":53,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":54,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":55,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":56,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":57,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":58,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":59,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":60,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":61,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":62,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":63,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":64,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":65,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":66,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":67,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":68,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":69,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":70,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":71,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":72,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":73,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":74,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":75,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":76,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":77,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":78,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":79,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":80,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":81,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":82,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":83,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":84,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":85,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":86,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":87,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":88,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":89,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":90,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":91,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":92,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":93,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":94,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":95,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":96,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":97,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":98,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":99,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":100,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":101,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":102,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":103,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":104,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":105,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":106,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":107,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":108,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":109,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":110,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":111,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":112,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":113,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":114,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":115,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":116,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":117,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":118,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":119,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":120,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":121,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":122,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":123,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":124,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":125,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":126,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":127,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":128,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":129,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":130,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":131,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":132,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":133,"s":[100,100,100]},{"t":133.999988401895,"s":[100,100,100]}],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Shape Layer 1: Path 1 [17.1.0]","np":3,"mn":"ADBE Layer Control","ix":1,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":175,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [17.1.0][In]","np":3,"mn":"ADBE Layer Control","ix":2,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":177,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [17.1.0][Out]","np":3,"mn":"ADBE Layer Control","ix":3,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":176,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [17.1.1]","np":3,"mn":"ADBE Layer Control","ix":4,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":172,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [17.1.1][In]","np":3,"mn":"ADBE Layer Control","ix":5,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":174,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [17.1.1][Out]","np":3,"mn":"ADBE Layer Control","ix":6,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":173,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [17.1.2]","np":3,"mn":"ADBE Layer Control","ix":7,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":169,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [17.1.2][In]","np":3,"mn":"ADBE Layer Control","ix":8,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":171,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [17.1.2][Out]","np":3,"mn":"ADBE Layer Control","ix":9,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":170,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [17.1.3]","np":3,"mn":"ADBE Layer Control","ix":10,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":166,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [17.1.3][In]","np":3,"mn":"ADBE Layer Control","ix":11,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":168,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [17.1.3][Out]","np":3,"mn":"ADBE Layer Control","ix":12,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":167,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [16.1.0]","np":3,"mn":"ADBE Layer Control","ix":13,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":163,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [16.1.0][In]","np":3,"mn":"ADBE Layer Control","ix":14,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":165,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [16.1.0][Out]","np":3,"mn":"ADBE Layer Control","ix":15,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":164,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [16.1.1]","np":3,"mn":"ADBE Layer Control","ix":16,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":160,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [16.1.1][In]","np":3,"mn":"ADBE Layer Control","ix":17,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":162,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [16.1.1][Out]","np":3,"mn":"ADBE Layer Control","ix":18,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":161,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [16.1.2]","np":3,"mn":"ADBE Layer Control","ix":19,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":157,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [16.1.2][In]","np":3,"mn":"ADBE Layer Control","ix":20,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":159,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [16.1.2][Out]","np":3,"mn":"ADBE Layer Control","ix":21,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":158,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [15.1.0]","np":3,"mn":"ADBE Layer Control","ix":22,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":154,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [15.1.0][In]","np":3,"mn":"ADBE Layer Control","ix":23,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":156,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [15.1.0][Out]","np":3,"mn":"ADBE Layer Control","ix":24,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":155,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [15.1.1]","np":3,"mn":"ADBE Layer Control","ix":25,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":151,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [15.1.1][In]","np":3,"mn":"ADBE Layer Control","ix":26,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":153,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [15.1.1][Out]","np":3,"mn":"ADBE Layer Control","ix":27,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":152,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [14.1.0]","np":3,"mn":"ADBE Layer Control","ix":28,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":148,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [14.1.0][In]","np":3,"mn":"ADBE Layer Control","ix":29,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":150,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [14.1.0][Out]","np":3,"mn":"ADBE Layer Control","ix":30,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":149,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [14.1.1]","np":3,"mn":"ADBE Layer Control","ix":31,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":145,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [14.1.1][In]","np":3,"mn":"ADBE Layer Control","ix":32,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":147,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [14.1.1][Out]","np":3,"mn":"ADBE Layer Control","ix":33,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":146,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [14.1.2]","np":3,"mn":"ADBE Layer Control","ix":34,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":142,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [14.1.2][In]","np":3,"mn":"ADBE Layer Control","ix":35,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":144,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [14.1.2][Out]","np":3,"mn":"ADBE Layer Control","ix":36,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":143,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [14.1.3]","np":3,"mn":"ADBE Layer Control","ix":37,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":139,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [14.1.3][In]","np":3,"mn":"ADBE Layer Control","ix":38,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":141,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [14.1.3][Out]","np":3,"mn":"ADBE Layer Control","ix":39,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":140,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [13.1.0]","np":3,"mn":"ADBE Layer Control","ix":40,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":136,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [13.1.0][In]","np":3,"mn":"ADBE Layer Control","ix":41,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":138,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [13.1.0][Out]","np":3,"mn":"ADBE Layer Control","ix":42,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":137,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [13.1.1]","np":3,"mn":"ADBE Layer Control","ix":43,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":133,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [13.1.1][In]","np":3,"mn":"ADBE Layer Control","ix":44,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":135,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [13.1.1][Out]","np":3,"mn":"ADBE Layer Control","ix":45,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":134,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [13.1.2]","np":3,"mn":"ADBE Layer Control","ix":46,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":130,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [13.1.2][In]","np":3,"mn":"ADBE Layer Control","ix":47,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":132,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [13.1.2][Out]","np":3,"mn":"ADBE Layer Control","ix":48,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":131,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [13.1.3]","np":3,"mn":"ADBE Layer Control","ix":49,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":127,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [13.1.3][In]","np":3,"mn":"ADBE Layer Control","ix":50,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":129,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [13.1.3][Out]","np":3,"mn":"ADBE Layer Control","ix":51,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":128,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [11.1.0]","np":3,"mn":"ADBE Layer Control","ix":52,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":124,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [11.1.0][In]","np":3,"mn":"ADBE Layer Control","ix":53,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":126,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [11.1.0][Out]","np":3,"mn":"ADBE Layer Control","ix":54,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":125,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [11.1.1]","np":3,"mn":"ADBE Layer Control","ix":55,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":121,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [11.1.1][In]","np":3,"mn":"ADBE Layer Control","ix":56,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":123,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [11.1.1][Out]","np":3,"mn":"ADBE Layer Control","ix":57,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":122,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [11.1.2]","np":3,"mn":"ADBE Layer Control","ix":58,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":118,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [11.1.2][In]","np":3,"mn":"ADBE Layer Control","ix":59,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":120,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [11.1.2][Out]","np":3,"mn":"ADBE Layer Control","ix":60,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":119,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [11.1.3]","np":3,"mn":"ADBE Layer Control","ix":61,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":115,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [11.1.3][In]","np":3,"mn":"ADBE Layer Control","ix":62,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":117,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [11.1.3][Out]","np":3,"mn":"ADBE Layer Control","ix":63,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":116,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [9.1.0]","np":3,"mn":"ADBE Layer Control","ix":64,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":112,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [9.1.0][In]","np":3,"mn":"ADBE Layer Control","ix":65,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":114,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [9.1.0][Out]","np":3,"mn":"ADBE Layer Control","ix":66,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":113,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [9.1.1]","np":3,"mn":"ADBE Layer Control","ix":67,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":109,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [9.1.1][In]","np":3,"mn":"ADBE Layer Control","ix":68,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":111,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [9.1.1][Out]","np":3,"mn":"ADBE Layer Control","ix":69,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":110,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [9.1.2]","np":3,"mn":"ADBE Layer Control","ix":70,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":106,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [9.1.2][In]","np":3,"mn":"ADBE Layer Control","ix":71,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":108,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [9.1.2][Out]","np":3,"mn":"ADBE Layer Control","ix":72,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":107,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [10.1.0]","np":3,"mn":"ADBE Layer Control","ix":73,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":103,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [10.1.0][In]","np":3,"mn":"ADBE Layer Control","ix":74,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":105,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [10.1.0][Out]","np":3,"mn":"ADBE Layer Control","ix":75,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":104,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [10.1.1]","np":3,"mn":"ADBE Layer Control","ix":76,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":100,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [10.1.1][In]","np":3,"mn":"ADBE Layer Control","ix":77,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":102,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [10.1.1][Out]","np":3,"mn":"ADBE Layer Control","ix":78,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":101,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [10.1.2]","np":3,"mn":"ADBE Layer Control","ix":79,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":97,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [10.1.2][In]","np":3,"mn":"ADBE Layer Control","ix":80,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":99,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [10.1.2][Out]","np":3,"mn":"ADBE Layer Control","ix":81,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":98,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [10.1.3]","np":3,"mn":"ADBE Layer Control","ix":82,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":94,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [10.1.3][In]","np":3,"mn":"ADBE Layer Control","ix":83,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":96,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [10.1.3][Out]","np":3,"mn":"ADBE Layer Control","ix":84,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":95,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [10.1.4]","np":3,"mn":"ADBE Layer Control","ix":85,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":91,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [10.1.4][In]","np":3,"mn":"ADBE Layer Control","ix":86,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":93,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [10.1.4][Out]","np":3,"mn":"ADBE Layer Control","ix":87,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":92,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.0]","np":3,"mn":"ADBE Layer Control","ix":88,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":88,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.0][In]","np":3,"mn":"ADBE Layer Control","ix":89,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":90,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.0][Out]","np":3,"mn":"ADBE Layer Control","ix":90,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":89,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.1]","np":3,"mn":"ADBE Layer Control","ix":91,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":85,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.1][In]","np":3,"mn":"ADBE Layer Control","ix":92,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":87,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.1][Out]","np":3,"mn":"ADBE Layer Control","ix":93,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":86,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.2]","np":3,"mn":"ADBE Layer Control","ix":94,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":82,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.2][In]","np":3,"mn":"ADBE Layer Control","ix":95,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":84,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.2][Out]","np":3,"mn":"ADBE Layer Control","ix":96,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":83,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.3]","np":3,"mn":"ADBE Layer Control","ix":97,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":79,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.3][In]","np":3,"mn":"ADBE Layer Control","ix":98,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":81,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.3][Out]","np":3,"mn":"ADBE Layer Control","ix":99,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":80,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.4]","np":3,"mn":"ADBE Layer Control","ix":100,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":76,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.4][In]","np":3,"mn":"ADBE Layer Control","ix":101,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":78,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.4][Out]","np":3,"mn":"ADBE Layer Control","ix":102,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":77,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.5]","np":3,"mn":"ADBE Layer Control","ix":103,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":73,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.5][In]","np":3,"mn":"ADBE Layer Control","ix":104,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":75,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.5][Out]","np":3,"mn":"ADBE Layer Control","ix":105,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":74,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [7.1.0]","np":3,"mn":"ADBE Layer Control","ix":106,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":70,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [7.1.0][In]","np":3,"mn":"ADBE Layer Control","ix":107,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":72,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [7.1.0][Out]","np":3,"mn":"ADBE Layer Control","ix":108,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":71,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [7.1.1]","np":3,"mn":"ADBE Layer Control","ix":109,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":67,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [7.1.1][In]","np":3,"mn":"ADBE Layer Control","ix":110,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":69,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [7.1.1][Out]","np":3,"mn":"ADBE Layer Control","ix":111,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":68,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [7.1.2]","np":3,"mn":"ADBE Layer Control","ix":112,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":64,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [7.1.2][In]","np":3,"mn":"ADBE Layer Control","ix":113,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":66,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [7.1.2][Out]","np":3,"mn":"ADBE Layer Control","ix":114,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":65,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [6.1.0]","np":3,"mn":"ADBE Layer Control","ix":115,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":61,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [6.1.0][In]","np":3,"mn":"ADBE Layer Control","ix":116,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":63,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [6.1.0][Out]","np":3,"mn":"ADBE Layer Control","ix":117,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":62,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [6.1.1]","np":3,"mn":"ADBE Layer Control","ix":118,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":58,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [6.1.1][In]","np":3,"mn":"ADBE Layer Control","ix":119,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":60,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [6.1.1][Out]","np":3,"mn":"ADBE Layer Control","ix":120,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":59,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [5.1.0]","np":3,"mn":"ADBE Layer Control","ix":121,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":55,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [5.1.0][In]","np":3,"mn":"ADBE Layer Control","ix":122,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":57,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [5.1.0][Out]","np":3,"mn":"ADBE Layer Control","ix":123,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":56,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [5.1.1]","np":3,"mn":"ADBE Layer Control","ix":124,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":52,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [5.1.1][In]","np":3,"mn":"ADBE Layer Control","ix":125,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":54,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [5.1.1][Out]","np":3,"mn":"ADBE Layer Control","ix":126,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":53,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [5.1.2]","np":3,"mn":"ADBE Layer Control","ix":127,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":49,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [5.1.2][In]","np":3,"mn":"ADBE Layer Control","ix":128,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":51,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [5.1.2][Out]","np":3,"mn":"ADBE Layer Control","ix":129,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":50,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [5.1.3]","np":3,"mn":"ADBE Layer Control","ix":130,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":46,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [5.1.3][In]","np":3,"mn":"ADBE Layer Control","ix":131,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":48,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [5.1.3][Out]","np":3,"mn":"ADBE Layer Control","ix":132,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":47,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [5.1.4]","np":3,"mn":"ADBE Layer Control","ix":133,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":43,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [5.1.4][In]","np":3,"mn":"ADBE Layer Control","ix":134,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":45,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [5.1.4][Out]","np":3,"mn":"ADBE Layer Control","ix":135,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":44,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [4.1.0]","np":3,"mn":"ADBE Layer Control","ix":136,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":40,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [4.1.0][In]","np":3,"mn":"ADBE Layer Control","ix":137,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":42,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [4.1.0][Out]","np":3,"mn":"ADBE Layer Control","ix":138,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":41,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [4.1.1]","np":3,"mn":"ADBE Layer Control","ix":139,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":37,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [4.1.1][In]","np":3,"mn":"ADBE Layer Control","ix":140,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":39,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [4.1.1][Out]","np":3,"mn":"ADBE Layer Control","ix":141,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":38,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [4.1.2]","np":3,"mn":"ADBE Layer Control","ix":142,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":34,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [4.1.2][In]","np":3,"mn":"ADBE Layer Control","ix":143,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":36,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [4.1.2][Out]","np":3,"mn":"ADBE Layer Control","ix":144,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":35,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [4.1.3]","np":3,"mn":"ADBE Layer Control","ix":145,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":31,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [4.1.3][In]","np":3,"mn":"ADBE Layer Control","ix":146,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":33,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [4.1.3][Out]","np":3,"mn":"ADBE Layer Control","ix":147,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":32,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [4.1.4]","np":3,"mn":"ADBE Layer Control","ix":148,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":28,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [4.1.4][In]","np":3,"mn":"ADBE Layer Control","ix":149,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":30,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [4.1.4][Out]","np":3,"mn":"ADBE Layer Control","ix":150,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":29,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [2.1.0]","np":3,"mn":"ADBE Layer Control","ix":151,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":22,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [2.1.0][In]","np":3,"mn":"ADBE Layer Control","ix":152,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":27,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [2.1.0][Out]","np":3,"mn":"ADBE Layer Control","ix":153,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":26,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [2.1.1]","np":3,"mn":"ADBE Layer Control","ix":154,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":19,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [2.1.1][In]","np":3,"mn":"ADBE Layer Control","ix":155,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":21,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [2.1.1][Out]","np":3,"mn":"ADBE Layer Control","ix":156,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":20,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [2.1.2]","np":3,"mn":"ADBE Layer Control","ix":157,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":16,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [2.1.2][In]","np":3,"mn":"ADBE Layer Control","ix":158,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":18,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [2.1.2][Out]","np":3,"mn":"ADBE Layer Control","ix":159,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":17,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [2.1.3]","np":3,"mn":"ADBE Layer Control","ix":160,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":13,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [2.1.3][In]","np":3,"mn":"ADBE Layer Control","ix":161,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":15,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [2.1.3][Out]","np":3,"mn":"ADBE Layer Control","ix":162,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":14,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [1.1.0]","np":3,"mn":"ADBE Layer Control","ix":163,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":10,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [1.1.0][In]","np":3,"mn":"ADBE Layer Control","ix":164,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":12,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [1.1.0][Out]","np":3,"mn":"ADBE Layer Control","ix":165,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":11,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [1.1.1]","np":3,"mn":"ADBE Layer Control","ix":166,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":7,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [1.1.1][In]","np":3,"mn":"ADBE Layer Control","ix":167,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":9,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [1.1.1][Out]","np":3,"mn":"ADBE Layer Control","ix":168,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":8,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [1.1.2]","np":3,"mn":"ADBE Layer Control","ix":169,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":4,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [1.1.2][In]","np":3,"mn":"ADBE Layer Control","ix":170,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":6,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [1.1.2][Out]","np":3,"mn":"ADBE Layer Control","ix":171,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":5,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [1.1.3]","np":3,"mn":"ADBE Layer Control","ix":172,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":1,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [1.1.3][In]","np":3,"mn":"ADBE Layer Control","ix":173,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":3,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [1.1.3][Out]","np":3,"mn":"ADBE Layer Control","ix":174,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":2,"ix":1}}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[90.5,-65],[-22,-1.5],[-3,17],[-3.5,11.5]],"o":[[-90.5,65],[22,1.5],[-34,51.5],[3.5,-11.5]],"v":[[398.5,-134],[320.5,12],[364,-136],[342.5,-139]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [1.1.0]',\n 'Shape Layer 1: Path 1 [1.1.1]',\n 'Shape Layer 1: Path 1 [1.1.2]',\n 'Shape Layer 1: Path 1 [1.1.3]'\n ];\nvar nullLayerNamesIn = [\n 'Shape Layer 1: Path 1 [1.1.0][In]',\n 'Shape Layer 1: Path 1 [1.1.1][In]',\n 'Shape Layer 1: Path 1 [1.1.2][In]',\n 'Shape Layer 1: Path 1 [1.1.3][In]'\n ];\nvar nullLayerNamesOut = [\n 'Shape Layer 1: Path 1 [1.1.0][Out]',\n 'Shape Layer 1: Path 1 [1.1.1][Out]',\n 'Shape Layer 1: Path 1 [1.1.2][Out]',\n 'Shape Layer 1: Path 1 [1.1.3][Out]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nvar getNullLayersIn = [];\nvar getNullLayersOut = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n getNullLayersIn.push(effect(nullLayerNamesIn[i])('ADBE Layer Control-0001'));\n getNullLayersOut.push(effect(nullLayerNamesOut[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n origInTang[i] = $bm_sub(fromCompToSurface(getNullLayersIn[i].toComp(getNullLayersIn[i].anchorPoint)), origPoints[i]);\n origOutTang[i] = $bm_sub(fromCompToSurface(getNullLayersOut[i].toComp(getNullLayersOut[i].anchorPoint)), origPoints[i]);\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.9,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 17","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[38,-62.5],[1,12],[-13.5,32],[-3,-2]],"o":[[-38,62.5],[-6.5,15.5],[13.5,-32],[3,2]],"v":[[340.5,-129.5],[305,-123.5],[284,-114.5],[311,-130]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [2.1.0]',\n 'Shape Layer 1: Path 1 [2.1.1]',\n 'Shape Layer 1: Path 1 [2.1.2]',\n 'Shape Layer 1: Path 1 [2.1.3]'\n ];\nvar nullLayerNamesIn = [\n 'Shape Layer 1: Path 1 [2.1.0][In]',\n 'Shape Layer 1: Path 1 [2.1.1][In]',\n 'Shape Layer 1: Path 1 [2.1.2][In]',\n 'Shape Layer 1: Path 1 [2.1.3][In]'\n ];\nvar nullLayerNamesOut = [\n 'Shape Layer 1: Path 1 [2.1.0][Out]',\n 'Shape Layer 1: Path 1 [2.1.1][Out]',\n 'Shape Layer 1: Path 1 [2.1.2][Out]',\n 'Shape Layer 1: Path 1 [2.1.3][Out]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nvar getNullLayersIn = [];\nvar getNullLayersOut = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n getNullLayersIn.push(effect(nullLayerNamesIn[i])('ADBE Layer Control-0001'));\n getNullLayersOut.push(effect(nullLayerNamesOut[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n origInTang[i] = $bm_sub(fromCompToSurface(getNullLayersIn[i].toComp(getNullLayersIn[i].anchorPoint)), origPoints[i]);\n origOutTang[i] = $bm_sub(fromCompToSurface(getNullLayersOut[i].toComp(getNullLayersOut[i].anchorPoint)), origPoints[i]);\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.9,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 16","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-3,-4]],"o":[[3,4]],"v":[[309.5,-129.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.9,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 15","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[6,1],[-10.5,-14.5],[-7.5,43.5],[0,-11]],"o":[[0,0],[-2,-32.5],[10.5,14.5],[7.5,-43.5],[0,11]],"v":[[265,-48],[257,-37],[295.5,-199.5],[239,-94],[264.5,-120.5]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [4.1.0]',\n 'Shape Layer 1: Path 1 [4.1.1]',\n 'Shape Layer 1: Path 1 [4.1.2]',\n 'Shape Layer 1: Path 1 [4.1.3]',\n 'Shape Layer 1: Path 1 [4.1.4]'\n ];\nvar nullLayerNamesIn = [\n 'Shape Layer 1: Path 1 [4.1.0][In]',\n 'Shape Layer 1: Path 1 [4.1.1][In]',\n 'Shape Layer 1: Path 1 [4.1.2][In]',\n 'Shape Layer 1: Path 1 [4.1.3][In]',\n 'Shape Layer 1: Path 1 [4.1.4][In]'\n ];\nvar nullLayerNamesOut = [\n 'Shape Layer 1: Path 1 [4.1.0][Out]',\n 'Shape Layer 1: Path 1 [4.1.1][Out]',\n 'Shape Layer 1: Path 1 [4.1.2][Out]',\n 'Shape Layer 1: Path 1 [4.1.3][Out]',\n 'Shape Layer 1: Path 1 [4.1.4][Out]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nvar getNullLayersIn = [];\nvar getNullLayersOut = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n getNullLayersIn.push(effect(nullLayerNamesIn[i])('ADBE Layer Control-0001'));\n getNullLayersOut.push(effect(nullLayerNamesOut[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n origInTang[i] = $bm_sub(fromCompToSurface(getNullLayersIn[i].toComp(getNullLayersIn[i].anchorPoint)), origPoints[i]);\n origOutTang[i] = $bm_sub(fromCompToSurface(getNullLayersOut[i].toComp(getNullLayersOut[i].anchorPoint)), origPoints[i]);\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.9,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 14","np":3,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[40,-57.5],[3.5,10],[13,-37],[-8,0],[0,0]],"o":[[-40,57.5],[-3.5,-10],[5.5,-57.5],[8,0],[0,0]],"v":[[243.5,-116.5],[211,-104.5],[181.5,-55],[223.5,-207.5],[199,-145.5]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [5.1.0]',\n 'Shape Layer 1: Path 1 [5.1.1]',\n 'Shape Layer 1: Path 1 [5.1.2]',\n 'Shape Layer 1: Path 1 [5.1.3]',\n 'Shape Layer 1: Path 1 [5.1.4]'\n ];\nvar nullLayerNamesIn = [\n 'Shape Layer 1: Path 1 [5.1.0][In]',\n 'Shape Layer 1: Path 1 [5.1.1][In]',\n 'Shape Layer 1: Path 1 [5.1.2][In]',\n 'Shape Layer 1: Path 1 [5.1.3][In]',\n 'Shape Layer 1: Path 1 [5.1.4][In]'\n ];\nvar nullLayerNamesOut = [\n 'Shape Layer 1: Path 1 [5.1.0][Out]',\n 'Shape Layer 1: Path 1 [5.1.1][Out]',\n 'Shape Layer 1: Path 1 [5.1.2][Out]',\n 'Shape Layer 1: Path 1 [5.1.3][Out]',\n 'Shape Layer 1: Path 1 [5.1.4][Out]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nvar getNullLayersIn = [];\nvar getNullLayersOut = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n getNullLayersIn.push(effect(nullLayerNamesIn[i])('ADBE Layer Control-0001'));\n getNullLayersOut.push(effect(nullLayerNamesOut[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n origInTang[i] = $bm_sub(fromCompToSurface(getNullLayersIn[i].toComp(getNullLayersIn[i].anchorPoint)), origPoints[i]);\n origOutTang[i] = $bm_sub(fromCompToSurface(getNullLayersOut[i].toComp(getNullLayersOut[i].anchorPoint)), origPoints[i]);\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.9,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 13","np":3,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,4.5],[0,0]],"o":[[0,-4.5],[0,0]],"v":[[272,-165],[133,-153]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [6.1.0]',\n 'Shape Layer 1: Path 1 [6.1.1]'\n ];\nvar nullLayerNamesIn = [\n 'Shape Layer 1: Path 1 [6.1.0][In]',\n 'Shape Layer 1: Path 1 [6.1.1][In]'\n ];\nvar nullLayerNamesOut = [\n 'Shape Layer 1: Path 1 [6.1.0][Out]',\n 'Shape Layer 1: Path 1 [6.1.1][Out]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nvar getNullLayersIn = [];\nvar getNullLayersOut = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n getNullLayersIn.push(effect(nullLayerNamesIn[i])('ADBE Layer Control-0001'));\n getNullLayersOut.push(effect(nullLayerNamesOut[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n origInTang[i] = $bm_sub(fromCompToSurface(getNullLayersIn[i].toComp(getNullLayersIn[i].anchorPoint)), origPoints[i]);\n origOutTang[i] = $bm_sub(fromCompToSurface(getNullLayersOut[i].toComp(getNullLayersOut[i].anchorPoint)), origPoints[i]);\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.9,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 12","np":3,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[7,-4.5],[-5,20]],"o":[[0,0],[-7,4.5],[5,-20]],"v":[[163,-17.5],[153.5,-6.5],[191,-192]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [7.1.0]',\n 'Shape Layer 1: Path 1 [7.1.1]',\n 'Shape Layer 1: Path 1 [7.1.2]'\n ];\nvar nullLayerNamesIn = [\n 'Shape Layer 1: Path 1 [7.1.0][In]',\n 'Shape Layer 1: Path 1 [7.1.1][In]',\n 'Shape Layer 1: Path 1 [7.1.2][In]'\n ];\nvar nullLayerNamesOut = [\n 'Shape Layer 1: Path 1 [7.1.0][Out]',\n 'Shape Layer 1: Path 1 [7.1.1][Out]',\n 'Shape Layer 1: Path 1 [7.1.2][Out]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nvar getNullLayersIn = [];\nvar getNullLayersOut = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n getNullLayersIn.push(effect(nullLayerNamesIn[i])('ADBE Layer Control-0001'));\n getNullLayersOut.push(effect(nullLayerNamesOut[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n origInTang[i] = $bm_sub(fromCompToSurface(getNullLayersIn[i].toComp(getNullLayersIn[i].anchorPoint)), origPoints[i]);\n origOutTang[i] = $bm_sub(fromCompToSurface(getNullLayersOut[i].toComp(getNullLayersOut[i].anchorPoint)), origPoints[i]);\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.9,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 11","np":3,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[14,-9.5],[-2,8],[-15.5,20],[35,-42],[-6,16.5]],"o":[[0,0],[-14,9.5],[-18.5,13.5],[15.5,-20],[-35,42],[6,-16.5]],"v":[[172,-115.5],[134,-62.5],[141.5,-114.5],[118.5,-127],[111,-95.5],[86,-105.5]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [8.1.0]',\n 'Shape Layer 1: Path 1 [8.1.1]',\n 'Shape Layer 1: Path 1 [8.1.2]',\n 'Shape Layer 1: Path 1 [8.1.3]',\n 'Shape Layer 1: Path 1 [8.1.4]',\n 'Shape Layer 1: Path 1 [8.1.5]'\n ];\nvar nullLayerNamesIn = [\n 'Shape Layer 1: Path 1 [8.1.0][In]',\n 'Shape Layer 1: Path 1 [8.1.1][In]',\n 'Shape Layer 1: Path 1 [8.1.2][In]',\n 'Shape Layer 1: Path 1 [8.1.3][In]',\n 'Shape Layer 1: Path 1 [8.1.4][In]',\n 'Shape Layer 1: Path 1 [8.1.5][In]'\n ];\nvar nullLayerNamesOut = [\n 'Shape Layer 1: Path 1 [8.1.0][Out]',\n 'Shape Layer 1: Path 1 [8.1.1][Out]',\n 'Shape Layer 1: Path 1 [8.1.2][Out]',\n 'Shape Layer 1: Path 1 [8.1.3][Out]',\n 'Shape Layer 1: Path 1 [8.1.4][Out]',\n 'Shape Layer 1: Path 1 [8.1.5][Out]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nvar getNullLayersIn = [];\nvar getNullLayersOut = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n getNullLayersIn.push(effect(nullLayerNamesIn[i])('ADBE Layer Control-0001'));\n getNullLayersOut.push(effect(nullLayerNamesOut[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n origInTang[i] = $bm_sub(fromCompToSurface(getNullLayersIn[i].toComp(getNullLayersIn[i].anchorPoint)), origPoints[i]);\n origOutTang[i] = $bm_sub(fromCompToSurface(getNullLayersOut[i].toComp(getNullLayersOut[i].anchorPoint)), origPoints[i]);\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.9,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 10","np":3,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[3.5,-2.5],[0,0]],"o":[[0,0],[-3.5,2.5],[0,0]],"v":[[-22,-7.5],[-31,4.5],[5,-203.5]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [9.1.0]',\n 'Shape Layer 1: Path 1 [9.1.1]',\n 'Shape Layer 1: Path 1 [9.1.2]'\n ];\nvar nullLayerNamesIn = [\n 'Shape Layer 1: Path 1 [9.1.0][In]',\n 'Shape Layer 1: Path 1 [9.1.1][In]',\n 'Shape Layer 1: Path 1 [9.1.2][In]'\n ];\nvar nullLayerNamesOut = [\n 'Shape Layer 1: Path 1 [9.1.0][Out]',\n 'Shape Layer 1: Path 1 [9.1.1][Out]',\n 'Shape Layer 1: Path 1 [9.1.2][Out]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nvar getNullLayersIn = [];\nvar getNullLayersOut = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n getNullLayersIn.push(effect(nullLayerNamesIn[i])('ADBE Layer Control-0001'));\n getNullLayersOut.push(effect(nullLayerNamesOut[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n origInTang[i] = $bm_sub(fromCompToSurface(getNullLayersIn[i].toComp(getNullLayersIn[i].anchorPoint)), origPoints[i]);\n origOutTang[i] = $bm_sub(fromCompToSurface(getNullLayersOut[i].toComp(getNullLayersOut[i].anchorPoint)), origPoints[i]);\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.9,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 9","np":3,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-129.5,39.5],[64.181,-31.033],[-24.445,17.232],[59,-3],[-2.5,-20.5]],"o":[[129.5,-39.5],[-45.5,22],[30.5,-21.5],[-59,3],[2.5,20.5]],"v":[[-15,-22],[6.5,-127],[16.5,-113.5],[23.5,-192.5],[-33.5,-132]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [10.1.0]',\n 'Shape Layer 1: Path 1 [10.1.1]',\n 'Shape Layer 1: Path 1 [10.1.2]',\n 'Shape Layer 1: Path 1 [10.1.3]',\n 'Shape Layer 1: Path 1 [10.1.4]'\n ];\nvar nullLayerNamesIn = [\n 'Shape Layer 1: Path 1 [10.1.0][In]',\n 'Shape Layer 1: Path 1 [10.1.1][In]',\n 'Shape Layer 1: Path 1 [10.1.2][In]',\n 'Shape Layer 1: Path 1 [10.1.3][In]',\n 'Shape Layer 1: Path 1 [10.1.4][In]'\n ];\nvar nullLayerNamesOut = [\n 'Shape Layer 1: Path 1 [10.1.0][Out]',\n 'Shape Layer 1: Path 1 [10.1.1][Out]',\n 'Shape Layer 1: Path 1 [10.1.2][Out]',\n 'Shape Layer 1: Path 1 [10.1.3][Out]',\n 'Shape Layer 1: Path 1 [10.1.4][Out]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nvar getNullLayersIn = [];\nvar getNullLayersOut = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n getNullLayersIn.push(effect(nullLayerNamesIn[i])('ADBE Layer Control-0001'));\n getNullLayersOut.push(effect(nullLayerNamesOut[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n origInTang[i] = $bm_sub(fromCompToSurface(getNullLayersIn[i].toComp(getNullLayersIn[i].anchorPoint)), origPoints[i]);\n origOutTang[i] = $bm_sub(fromCompToSurface(getNullLayersOut[i].toComp(getNullLayersOut[i].anchorPoint)), origPoints[i]);\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.9,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 8","np":3,"cix":2,"bm":0,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[90.5,-65],[-22,-1.5],[-3,17],[-3.5,11.5]],"o":[[-90.5,65],[22,1.5],[-34,51.5],[3.5,-11.5]],"v":[[-82,-91],[-160,55],[-116.5,-93],[-138,-96]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [11.1.0]',\n 'Shape Layer 1: Path 1 [11.1.1]',\n 'Shape Layer 1: Path 1 [11.1.2]',\n 'Shape Layer 1: Path 1 [11.1.3]'\n ];\nvar nullLayerNamesIn = [\n 'Shape Layer 1: Path 1 [11.1.0][In]',\n 'Shape Layer 1: Path 1 [11.1.1][In]',\n 'Shape Layer 1: Path 1 [11.1.2][In]',\n 'Shape Layer 1: Path 1 [11.1.3][In]'\n ];\nvar nullLayerNamesOut = [\n 'Shape Layer 1: Path 1 [11.1.0][Out]',\n 'Shape Layer 1: Path 1 [11.1.1][Out]',\n 'Shape Layer 1: Path 1 [11.1.2][Out]',\n 'Shape Layer 1: Path 1 [11.1.3][Out]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nvar getNullLayersIn = [];\nvar getNullLayersOut = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n getNullLayersIn.push(effect(nullLayerNamesIn[i])('ADBE Layer Control-0001'));\n getNullLayersOut.push(effect(nullLayerNamesOut[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n origInTang[i] = $bm_sub(fromCompToSurface(getNullLayersIn[i].toComp(getNullLayersIn[i].anchorPoint)), origPoints[i]);\n origOutTang[i] = $bm_sub(fromCompToSurface(getNullLayersOut[i].toComp(getNullLayersOut[i].anchorPoint)), origPoints[i]);\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.9,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 7","np":3,"cix":2,"bm":0,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-20,3],[22,4],[0,0],[0,0]],"o":[[20,-3],[-22,-4],[0,0],[0,0]],"v":[[-235.5,-50.5],[-202.5,-96.5],[-244.5,42],[-219,-109.5]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [13.1.0]',\n 'Shape Layer 1: Path 1 [13.1.1]',\n 'Shape Layer 1: Path 1 [13.1.2]',\n 'Shape Layer 1: Path 1 [13.1.3]'\n ];\nvar nullLayerNamesIn = [\n 'Shape Layer 1: Path 1 [13.1.0][In]',\n 'Shape Layer 1: Path 1 [13.1.1][In]',\n 'Shape Layer 1: Path 1 [13.1.2][In]',\n 'Shape Layer 1: Path 1 [13.1.3][In]'\n ];\nvar nullLayerNamesOut = [\n 'Shape Layer 1: Path 1 [13.1.0][Out]',\n 'Shape Layer 1: Path 1 [13.1.1][Out]',\n 'Shape Layer 1: Path 1 [13.1.2][Out]',\n 'Shape Layer 1: Path 1 [13.1.3][Out]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nvar getNullLayersIn = [];\nvar getNullLayersOut = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n getNullLayersIn.push(effect(nullLayerNamesIn[i])('ADBE Layer Control-0001'));\n getNullLayersOut.push(effect(nullLayerNamesOut[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n origInTang[i] = $bm_sub(fromCompToSurface(getNullLayersIn[i].toComp(getNullLayersIn[i].anchorPoint)), origPoints[i]);\n origOutTang[i] = $bm_sub(fromCompToSurface(getNullLayersOut[i].toComp(getNullLayersOut[i].anchorPoint)), origPoints[i]);\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.9,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[40,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 6","np":3,"cix":2,"bm":0,"ix":12,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-20,3],[22,4],[0,0],[0,0]],"o":[[20,-3],[-22,-4],[0,0],[0,0]],"v":[[-235.5,-50.5],[-202.5,-96.5],[-244.5,42],[-219,-109.5]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [13.1.0]',\n 'Shape Layer 1: Path 1 [13.1.1]',\n 'Shape Layer 1: Path 1 [13.1.2]',\n 'Shape Layer 1: Path 1 [13.1.3]'\n ];\nvar nullLayerNamesIn = [\n 'Shape Layer 1: Path 1 [13.1.0][In]',\n 'Shape Layer 1: Path 1 [13.1.1][In]',\n 'Shape Layer 1: Path 1 [13.1.2][In]',\n 'Shape Layer 1: Path 1 [13.1.3][In]'\n ];\nvar nullLayerNamesOut = [\n 'Shape Layer 1: Path 1 [13.1.0][Out]',\n 'Shape Layer 1: Path 1 [13.1.1][Out]',\n 'Shape Layer 1: Path 1 [13.1.2][Out]',\n 'Shape Layer 1: Path 1 [13.1.3][Out]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nvar getNullLayersIn = [];\nvar getNullLayersOut = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n getNullLayersIn.push(effect(nullLayerNamesIn[i])('ADBE Layer Control-0001'));\n getNullLayersOut.push(effect(nullLayerNamesOut[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n origInTang[i] = $bm_sub(fromCompToSurface(getNullLayersIn[i].toComp(getNullLayersIn[i].anchorPoint)), origPoints[i]);\n origOutTang[i] = $bm_sub(fromCompToSurface(getNullLayersOut[i].toComp(getNullLayersOut[i].anchorPoint)), origPoints[i]);\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.9,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 5","np":3,"cix":2,"bm":0,"ix":13,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[38,-62.5],[1,12],[-13.5,32],[-3,-2]],"o":[[-38,62.5],[-6.5,15.5],[13.5,-32],[3,2]],"v":[[-221.5,-80.5],[-257,-74.5],[-278,-65.5],[-251,-81]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [14.1.0]',\n 'Shape Layer 1: Path 1 [14.1.1]',\n 'Shape Layer 1: Path 1 [14.1.2]',\n 'Shape Layer 1: Path 1 [14.1.3]'\n ];\nvar nullLayerNamesIn = [\n 'Shape Layer 1: Path 1 [14.1.0][In]',\n 'Shape Layer 1: Path 1 [14.1.1][In]',\n 'Shape Layer 1: Path 1 [14.1.2][In]',\n 'Shape Layer 1: Path 1 [14.1.3][In]'\n ];\nvar nullLayerNamesOut = [\n 'Shape Layer 1: Path 1 [14.1.0][Out]',\n 'Shape Layer 1: Path 1 [14.1.1][Out]',\n 'Shape Layer 1: Path 1 [14.1.2][Out]',\n 'Shape Layer 1: Path 1 [14.1.3][Out]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nvar getNullLayersIn = [];\nvar getNullLayersOut = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n getNullLayersIn.push(effect(nullLayerNamesIn[i])('ADBE Layer Control-0001'));\n getNullLayersOut.push(effect(nullLayerNamesOut[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n origInTang[i] = $bm_sub(fromCompToSurface(getNullLayersIn[i].toComp(getNullLayersIn[i].anchorPoint)), origPoints[i]);\n origOutTang[i] = $bm_sub(fromCompToSurface(getNullLayersOut[i].toComp(getNullLayersOut[i].anchorPoint)), origPoints[i]);\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.9,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 4","np":3,"cix":2,"bm":0,"ix":14,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-324.5,-6],[-292,-169]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [15.1.0]',\n 'Shape Layer 1: Path 1 [15.1.1]'\n ];\nvar nullLayerNamesIn = [\n 'Shape Layer 1: Path 1 [15.1.0][In]',\n 'Shape Layer 1: Path 1 [15.1.1][In]'\n ];\nvar nullLayerNamesOut = [\n 'Shape Layer 1: Path 1 [15.1.0][Out]',\n 'Shape Layer 1: Path 1 [15.1.1][Out]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nvar getNullLayersIn = [];\nvar getNullLayersOut = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n getNullLayersIn.push(effect(nullLayerNamesIn[i])('ADBE Layer Control-0001'));\n getNullLayersOut.push(effect(nullLayerNamesOut[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n origInTang[i] = $bm_sub(fromCompToSurface(getNullLayersIn[i].toComp(getNullLayersIn[i].anchorPoint)), origPoints[i]);\n origOutTang[i] = $bm_sub(fromCompToSurface(getNullLayersOut[i].toComp(getNullLayersOut[i].anchorPoint)), origPoints[i]);\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.9,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 3","np":3,"cix":2,"bm":0,"ix":15,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[29.5,-13],[-3,-3]],"o":[[0,0],[-29.5,13],[3,3]],"v":[[-274.5,-95],[-417,-38.5],[-431,-23.5]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [16.1.0]',\n 'Shape Layer 1: Path 1 [16.1.1]',\n 'Shape Layer 1: Path 1 [16.1.2]'\n ];\nvar nullLayerNamesIn = [\n 'Shape Layer 1: Path 1 [16.1.0][In]',\n 'Shape Layer 1: Path 1 [16.1.1][In]',\n 'Shape Layer 1: Path 1 [16.1.2][In]'\n ];\nvar nullLayerNamesOut = [\n 'Shape Layer 1: Path 1 [16.1.0][Out]',\n 'Shape Layer 1: Path 1 [16.1.1][Out]',\n 'Shape Layer 1: Path 1 [16.1.2][Out]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nvar getNullLayersIn = [];\nvar getNullLayersOut = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n getNullLayersIn.push(effect(nullLayerNamesIn[i])('ADBE Layer Control-0001'));\n getNullLayersOut.push(effect(nullLayerNamesOut[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n origInTang[i] = $bm_sub(fromCompToSurface(getNullLayersIn[i].toComp(getNullLayersIn[i].anchorPoint)), origPoints[i]);\n origOutTang[i] = $bm_sub(fromCompToSurface(getNullLayersOut[i].toComp(getNullLayersOut[i].anchorPoint)), origPoints[i]);\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.9,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 2","np":3,"cix":2,"bm":0,"ix":16,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[8,-4.5],[0,5],[16.5,-26.5],[0,0]],"o":[[-8,4.5],[0,-5],[-16.5,26.5],[0,0]],"v":[[-383.5,39.5],[-352,-149.5],[-381.5,-118],[-375,-91]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [17.1.0]',\n 'Shape Layer 1: Path 1 [17.1.1]',\n 'Shape Layer 1: Path 1 [17.1.2]',\n 'Shape Layer 1: Path 1 [17.1.3]'\n ];\nvar nullLayerNamesIn = [\n 'Shape Layer 1: Path 1 [17.1.0][In]',\n 'Shape Layer 1: Path 1 [17.1.1][In]',\n 'Shape Layer 1: Path 1 [17.1.2][In]',\n 'Shape Layer 1: Path 1 [17.1.3][In]'\n ];\nvar nullLayerNamesOut = [\n 'Shape Layer 1: Path 1 [17.1.0][Out]',\n 'Shape Layer 1: Path 1 [17.1.1][Out]',\n 'Shape Layer 1: Path 1 [17.1.2][Out]',\n 'Shape Layer 1: Path 1 [17.1.3][Out]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nvar getNullLayersIn = [];\nvar getNullLayersOut = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n getNullLayersIn.push(effect(nullLayerNamesIn[i])('ADBE Layer Control-0001'));\n getNullLayersOut.push(effect(nullLayerNamesOut[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n origInTang[i] = $bm_sub(fromCompToSurface(getNullLayersIn[i].toComp(getNullLayersIn[i].anchorPoint)), origPoints[i]);\n origOutTang[i] = $bm_sub(fromCompToSurface(getNullLayersOut[i].toComp(getNullLayersOut[i].anchorPoint)), origPoints[i]);\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.9,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":17,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":100,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":13,"s":[100]},{"t":107.999990652273,"s":[0]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":2,"ix":18,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":134.999988315342,"st":-34.9999969706441,"bm":0},{"ddd":0,"ind":24,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":6,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":13,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":14,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":18,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":21,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":32,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":38,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":39,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":46,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":47,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":48,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":49,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":50,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":51,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":52,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":53,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":54,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":55,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":56,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":57,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":58,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":59,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":61,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":62,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":63,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":64,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":65,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":66,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":67,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":68,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":69,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":70,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":71,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":72,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":73,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":74,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":75,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":76,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":77,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":78,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":79,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":80,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":81,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":82,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":83,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":84,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":85,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":86,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":87,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":88,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":89,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":90,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":91,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":92,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":93,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":94,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":95,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":96,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":97,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":98,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":99,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":100,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":101,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":102,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":103,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":104,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":105,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":106,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":107,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":108,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":109,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":110,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":111,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":112,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":113,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":114,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":115,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":116,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":117,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":118,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":119,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":120,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":121,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":122,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":123,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":124,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":125,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":126,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":127,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":128,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":129,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":130,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":131,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":132,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":133,"s":[0]},{"t":133.999988401895,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":2,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":5,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":7,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":9,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":19,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":23,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":24,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":27,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":28,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":29,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":32,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":33,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":36,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":37,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":39,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":44,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":45,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":47,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":48,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":49,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":51,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":52,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":53,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":54,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":55,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":56,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":57,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":58,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":59,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":60,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":61,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":62,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":63,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":64,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":65,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":66,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":67,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":68,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":69,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":70,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":71,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":72,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":73,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":74,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":75,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":76,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":77,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":78,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":79,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":80,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":81,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":82,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":83,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":84,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":85,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":86,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":87,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":88,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":89,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":90,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":91,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":92,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":93,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":94,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":95,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":96,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":97,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":98,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":99,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":100,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":101,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":102,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":103,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":104,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":105,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":106,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":107,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":108,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":109,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":110,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":111,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":112,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":113,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":114,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":115,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":116,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":117,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":118,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":119,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":120,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":121,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":122,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":123,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":124,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":125,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":126,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":127,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":128,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":129,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":130,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":131,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":132,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":133,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"t":133.999988401895,"s":[540,373.5,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":1,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":2,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":3,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":4,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":5,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":6,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":7,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":8,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":9,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":10,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":11,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":12,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":13,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":14,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":15,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":16,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":17,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":18,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":19,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":20,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":21,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":22,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":23,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":24,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":25,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":26,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":27,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":28,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":29,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":30,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":31,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":33,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":34,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":35,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":36,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":37,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":38,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":39,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":40,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":41,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":42,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":43,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":44,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":45,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":46,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":47,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":48,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":49,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":50,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":51,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":52,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":53,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":54,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":55,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":56,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":57,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":58,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":59,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":60,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":61,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":62,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":63,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":64,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":65,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":66,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":67,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":68,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":69,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":70,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":71,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":72,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":73,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":74,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":75,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":76,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":77,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":78,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":79,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":80,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":81,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":82,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":83,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":84,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":85,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":86,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":87,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":88,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":89,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":90,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":91,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":92,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":93,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":94,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":95,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":96,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":97,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":98,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":99,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":100,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":101,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":102,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":103,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":104,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":105,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":106,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":107,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":108,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":109,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":110,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":111,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":112,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":113,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":114,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":115,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":116,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":117,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":118,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":119,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":120,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":121,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":122,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":123,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":124,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":125,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":126,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":127,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":128,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":129,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":130,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":131,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":132,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":133,"s":[100,100,100]},{"t":133.999988401895,"s":[100,100,100]}],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Shape Layer 1: Path 1 [17.1.0]","np":3,"mn":"ADBE Layer Control","ix":1,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":175,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [17.1.0][In]","np":3,"mn":"ADBE Layer Control","ix":2,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":177,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [17.1.0][Out]","np":3,"mn":"ADBE Layer Control","ix":3,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":176,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [17.1.1]","np":3,"mn":"ADBE Layer Control","ix":4,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":172,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [17.1.1][In]","np":3,"mn":"ADBE Layer Control","ix":5,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":174,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [17.1.1][Out]","np":3,"mn":"ADBE Layer Control","ix":6,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":173,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [17.1.2]","np":3,"mn":"ADBE Layer Control","ix":7,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":169,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [17.1.2][In]","np":3,"mn":"ADBE Layer Control","ix":8,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":171,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [17.1.2][Out]","np":3,"mn":"ADBE Layer Control","ix":9,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":170,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [17.1.3]","np":3,"mn":"ADBE Layer Control","ix":10,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":166,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [17.1.3][In]","np":3,"mn":"ADBE Layer Control","ix":11,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":168,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [17.1.3][Out]","np":3,"mn":"ADBE Layer Control","ix":12,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":167,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [16.1.0]","np":3,"mn":"ADBE Layer Control","ix":13,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":163,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [16.1.0][In]","np":3,"mn":"ADBE Layer Control","ix":14,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":165,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [16.1.0][Out]","np":3,"mn":"ADBE Layer Control","ix":15,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":164,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [16.1.1]","np":3,"mn":"ADBE Layer Control","ix":16,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":160,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [16.1.1][In]","np":3,"mn":"ADBE Layer Control","ix":17,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":162,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [16.1.1][Out]","np":3,"mn":"ADBE Layer Control","ix":18,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":161,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [16.1.2]","np":3,"mn":"ADBE Layer Control","ix":19,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":157,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [16.1.2][In]","np":3,"mn":"ADBE Layer Control","ix":20,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":159,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [16.1.2][Out]","np":3,"mn":"ADBE Layer Control","ix":21,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":158,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [15.1.0]","np":3,"mn":"ADBE Layer Control","ix":22,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":154,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [15.1.0][In]","np":3,"mn":"ADBE Layer Control","ix":23,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":156,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [15.1.0][Out]","np":3,"mn":"ADBE Layer Control","ix":24,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":155,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [15.1.1]","np":3,"mn":"ADBE Layer Control","ix":25,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":151,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [15.1.1][In]","np":3,"mn":"ADBE Layer Control","ix":26,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":153,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [15.1.1][Out]","np":3,"mn":"ADBE Layer Control","ix":27,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":152,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [14.1.0]","np":3,"mn":"ADBE Layer Control","ix":28,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":148,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [14.1.0][In]","np":3,"mn":"ADBE Layer Control","ix":29,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":150,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [14.1.0][Out]","np":3,"mn":"ADBE Layer Control","ix":30,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":149,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [14.1.1]","np":3,"mn":"ADBE Layer Control","ix":31,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":145,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [14.1.1][In]","np":3,"mn":"ADBE Layer Control","ix":32,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":147,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [14.1.1][Out]","np":3,"mn":"ADBE Layer Control","ix":33,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":146,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [14.1.2]","np":3,"mn":"ADBE Layer Control","ix":34,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":142,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [14.1.2][In]","np":3,"mn":"ADBE Layer Control","ix":35,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":144,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [14.1.2][Out]","np":3,"mn":"ADBE Layer Control","ix":36,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":143,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [14.1.3]","np":3,"mn":"ADBE Layer Control","ix":37,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":139,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [14.1.3][In]","np":3,"mn":"ADBE Layer Control","ix":38,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":141,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [14.1.3][Out]","np":3,"mn":"ADBE Layer Control","ix":39,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":140,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [13.1.0]","np":3,"mn":"ADBE Layer Control","ix":40,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":136,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [13.1.0][In]","np":3,"mn":"ADBE Layer Control","ix":41,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":138,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [13.1.0][Out]","np":3,"mn":"ADBE Layer Control","ix":42,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":137,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [13.1.1]","np":3,"mn":"ADBE Layer Control","ix":43,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":133,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [13.1.1][In]","np":3,"mn":"ADBE Layer Control","ix":44,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":135,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [13.1.1][Out]","np":3,"mn":"ADBE Layer Control","ix":45,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":134,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [13.1.2]","np":3,"mn":"ADBE Layer Control","ix":46,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":130,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [13.1.2][In]","np":3,"mn":"ADBE Layer Control","ix":47,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":132,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [13.1.2][Out]","np":3,"mn":"ADBE Layer Control","ix":48,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":131,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [13.1.3]","np":3,"mn":"ADBE Layer Control","ix":49,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":127,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [13.1.3][In]","np":3,"mn":"ADBE Layer Control","ix":50,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":129,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [13.1.3][Out]","np":3,"mn":"ADBE Layer Control","ix":51,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":128,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [11.1.0]","np":3,"mn":"ADBE Layer Control","ix":52,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":124,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [11.1.0][In]","np":3,"mn":"ADBE Layer Control","ix":53,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":126,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [11.1.0][Out]","np":3,"mn":"ADBE Layer Control","ix":54,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":125,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [11.1.1]","np":3,"mn":"ADBE Layer Control","ix":55,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":121,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [11.1.1][In]","np":3,"mn":"ADBE Layer Control","ix":56,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":123,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [11.1.1][Out]","np":3,"mn":"ADBE Layer Control","ix":57,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":122,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [11.1.2]","np":3,"mn":"ADBE Layer Control","ix":58,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":118,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [11.1.2][In]","np":3,"mn":"ADBE Layer Control","ix":59,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":120,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [11.1.2][Out]","np":3,"mn":"ADBE Layer Control","ix":60,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":119,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [11.1.3]","np":3,"mn":"ADBE Layer Control","ix":61,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":115,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [11.1.3][In]","np":3,"mn":"ADBE Layer Control","ix":62,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":117,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [11.1.3][Out]","np":3,"mn":"ADBE Layer Control","ix":63,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":116,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [9.1.0]","np":3,"mn":"ADBE Layer Control","ix":64,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":112,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [9.1.0][In]","np":3,"mn":"ADBE Layer Control","ix":65,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":114,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [9.1.0][Out]","np":3,"mn":"ADBE Layer Control","ix":66,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":113,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [9.1.1]","np":3,"mn":"ADBE Layer Control","ix":67,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":109,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [9.1.1][In]","np":3,"mn":"ADBE Layer Control","ix":68,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":111,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [9.1.1][Out]","np":3,"mn":"ADBE Layer Control","ix":69,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":110,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [9.1.2]","np":3,"mn":"ADBE Layer Control","ix":70,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":106,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [9.1.2][In]","np":3,"mn":"ADBE Layer Control","ix":71,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":108,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [9.1.2][Out]","np":3,"mn":"ADBE Layer Control","ix":72,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":107,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [10.1.0]","np":3,"mn":"ADBE Layer Control","ix":73,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":103,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [10.1.0][In]","np":3,"mn":"ADBE Layer Control","ix":74,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":105,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [10.1.0][Out]","np":3,"mn":"ADBE Layer Control","ix":75,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":104,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [10.1.1]","np":3,"mn":"ADBE Layer Control","ix":76,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":100,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [10.1.1][In]","np":3,"mn":"ADBE Layer Control","ix":77,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":102,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [10.1.1][Out]","np":3,"mn":"ADBE Layer Control","ix":78,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":101,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [10.1.2]","np":3,"mn":"ADBE Layer Control","ix":79,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":97,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [10.1.2][In]","np":3,"mn":"ADBE Layer Control","ix":80,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":99,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [10.1.2][Out]","np":3,"mn":"ADBE Layer Control","ix":81,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":98,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [10.1.3]","np":3,"mn":"ADBE Layer Control","ix":82,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":94,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [10.1.3][In]","np":3,"mn":"ADBE Layer Control","ix":83,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":96,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [10.1.3][Out]","np":3,"mn":"ADBE Layer Control","ix":84,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":95,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [10.1.4]","np":3,"mn":"ADBE Layer Control","ix":85,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":91,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [10.1.4][In]","np":3,"mn":"ADBE Layer Control","ix":86,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":93,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [10.1.4][Out]","np":3,"mn":"ADBE Layer Control","ix":87,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":92,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.0]","np":3,"mn":"ADBE Layer Control","ix":88,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":88,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.0][In]","np":3,"mn":"ADBE Layer Control","ix":89,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":90,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.0][Out]","np":3,"mn":"ADBE Layer Control","ix":90,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":89,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.1]","np":3,"mn":"ADBE Layer Control","ix":91,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":85,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.1][In]","np":3,"mn":"ADBE Layer Control","ix":92,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":87,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.1][Out]","np":3,"mn":"ADBE Layer Control","ix":93,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":86,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.2]","np":3,"mn":"ADBE Layer Control","ix":94,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":82,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.2][In]","np":3,"mn":"ADBE Layer Control","ix":95,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":84,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.2][Out]","np":3,"mn":"ADBE Layer Control","ix":96,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":83,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.3]","np":3,"mn":"ADBE Layer Control","ix":97,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":79,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.3][In]","np":3,"mn":"ADBE Layer Control","ix":98,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":81,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.3][Out]","np":3,"mn":"ADBE Layer Control","ix":99,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":80,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.4]","np":3,"mn":"ADBE Layer Control","ix":100,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":76,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.4][In]","np":3,"mn":"ADBE Layer Control","ix":101,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":78,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.4][Out]","np":3,"mn":"ADBE Layer Control","ix":102,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":77,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.5]","np":3,"mn":"ADBE Layer Control","ix":103,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":73,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.5][In]","np":3,"mn":"ADBE Layer Control","ix":104,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":75,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.5][Out]","np":3,"mn":"ADBE Layer Control","ix":105,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":74,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [7.1.0]","np":3,"mn":"ADBE Layer Control","ix":106,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":70,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [7.1.0][In]","np":3,"mn":"ADBE Layer Control","ix":107,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":72,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [7.1.0][Out]","np":3,"mn":"ADBE Layer Control","ix":108,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":71,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [7.1.1]","np":3,"mn":"ADBE Layer Control","ix":109,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":67,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [7.1.1][In]","np":3,"mn":"ADBE Layer Control","ix":110,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":69,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [7.1.1][Out]","np":3,"mn":"ADBE Layer Control","ix":111,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":68,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [7.1.2]","np":3,"mn":"ADBE Layer Control","ix":112,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":64,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [7.1.2][In]","np":3,"mn":"ADBE Layer Control","ix":113,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":66,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [7.1.2][Out]","np":3,"mn":"ADBE Layer Control","ix":114,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":65,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [6.1.0]","np":3,"mn":"ADBE Layer Control","ix":115,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":61,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [6.1.0][In]","np":3,"mn":"ADBE Layer Control","ix":116,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":63,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [6.1.0][Out]","np":3,"mn":"ADBE Layer Control","ix":117,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":62,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [6.1.1]","np":3,"mn":"ADBE Layer Control","ix":118,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":58,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [6.1.1][In]","np":3,"mn":"ADBE Layer Control","ix":119,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":60,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [6.1.1][Out]","np":3,"mn":"ADBE Layer Control","ix":120,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":59,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [5.1.0]","np":3,"mn":"ADBE Layer Control","ix":121,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":55,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [5.1.0][In]","np":3,"mn":"ADBE Layer Control","ix":122,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":57,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [5.1.0][Out]","np":3,"mn":"ADBE Layer Control","ix":123,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":56,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [5.1.1]","np":3,"mn":"ADBE Layer Control","ix":124,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":52,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [5.1.1][In]","np":3,"mn":"ADBE Layer Control","ix":125,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":54,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [5.1.1][Out]","np":3,"mn":"ADBE Layer Control","ix":126,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":53,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [5.1.2]","np":3,"mn":"ADBE Layer Control","ix":127,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":49,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [5.1.2][In]","np":3,"mn":"ADBE Layer Control","ix":128,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":51,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [5.1.2][Out]","np":3,"mn":"ADBE Layer Control","ix":129,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":50,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [5.1.3]","np":3,"mn":"ADBE Layer Control","ix":130,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":46,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [5.1.3][In]","np":3,"mn":"ADBE Layer Control","ix":131,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":48,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [5.1.3][Out]","np":3,"mn":"ADBE Layer Control","ix":132,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":47,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [5.1.4]","np":3,"mn":"ADBE Layer Control","ix":133,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":43,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [5.1.4][In]","np":3,"mn":"ADBE Layer Control","ix":134,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":45,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [5.1.4][Out]","np":3,"mn":"ADBE Layer Control","ix":135,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":44,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [4.1.0]","np":3,"mn":"ADBE Layer Control","ix":136,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":40,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [4.1.0][In]","np":3,"mn":"ADBE Layer Control","ix":137,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":42,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [4.1.0][Out]","np":3,"mn":"ADBE Layer Control","ix":138,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":41,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [4.1.1]","np":3,"mn":"ADBE Layer Control","ix":139,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":37,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [4.1.1][In]","np":3,"mn":"ADBE Layer Control","ix":140,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":39,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [4.1.1][Out]","np":3,"mn":"ADBE Layer Control","ix":141,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":38,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [4.1.2]","np":3,"mn":"ADBE Layer Control","ix":142,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":34,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [4.1.2][In]","np":3,"mn":"ADBE Layer Control","ix":143,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":36,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [4.1.2][Out]","np":3,"mn":"ADBE Layer Control","ix":144,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":35,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [4.1.3]","np":3,"mn":"ADBE Layer Control","ix":145,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":31,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [4.1.3][In]","np":3,"mn":"ADBE Layer Control","ix":146,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":33,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [4.1.3][Out]","np":3,"mn":"ADBE Layer Control","ix":147,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":32,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [4.1.4]","np":3,"mn":"ADBE Layer Control","ix":148,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":28,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [4.1.4][In]","np":3,"mn":"ADBE Layer Control","ix":149,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":30,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [4.1.4][Out]","np":3,"mn":"ADBE Layer Control","ix":150,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":29,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [2.1.0]","np":3,"mn":"ADBE Layer Control","ix":151,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":22,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [2.1.0][In]","np":3,"mn":"ADBE Layer Control","ix":152,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":27,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [2.1.0][Out]","np":3,"mn":"ADBE Layer Control","ix":153,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":26,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [2.1.1]","np":3,"mn":"ADBE Layer Control","ix":154,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":19,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [2.1.1][In]","np":3,"mn":"ADBE Layer Control","ix":155,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":21,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [2.1.1][Out]","np":3,"mn":"ADBE Layer Control","ix":156,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":20,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [2.1.2]","np":3,"mn":"ADBE Layer Control","ix":157,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":16,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [2.1.2][In]","np":3,"mn":"ADBE Layer Control","ix":158,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":18,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [2.1.2][Out]","np":3,"mn":"ADBE Layer Control","ix":159,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":17,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [2.1.3]","np":3,"mn":"ADBE Layer Control","ix":160,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":13,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [2.1.3][In]","np":3,"mn":"ADBE Layer Control","ix":161,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":15,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [2.1.3][Out]","np":3,"mn":"ADBE Layer Control","ix":162,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":14,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [1.1.0]","np":3,"mn":"ADBE Layer Control","ix":163,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":10,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [1.1.0][In]","np":3,"mn":"ADBE Layer Control","ix":164,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":12,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [1.1.0][Out]","np":3,"mn":"ADBE Layer Control","ix":165,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":11,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [1.1.1]","np":3,"mn":"ADBE Layer Control","ix":166,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":7,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [1.1.1][In]","np":3,"mn":"ADBE Layer Control","ix":167,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":9,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [1.1.1][Out]","np":3,"mn":"ADBE Layer Control","ix":168,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":8,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [1.1.2]","np":3,"mn":"ADBE Layer Control","ix":169,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":4,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [1.1.2][In]","np":3,"mn":"ADBE Layer Control","ix":170,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":6,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [1.1.2][Out]","np":3,"mn":"ADBE Layer Control","ix":171,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":5,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [1.1.3]","np":3,"mn":"ADBE Layer Control","ix":172,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":1,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [1.1.3][In]","np":3,"mn":"ADBE Layer Control","ix":173,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":3,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [1.1.3][Out]","np":3,"mn":"ADBE Layer Control","ix":174,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":2,"ix":1}}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[90.5,-65],[-22,-1.5],[-3,17],[-3.5,11.5]],"o":[[-90.5,65],[22,1.5],[-34,51.5],[3.5,-11.5]],"v":[[398.5,-134],[320.5,12],[364,-136],[342.5,-139]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [1.1.0]',\n 'Shape Layer 1: Path 1 [1.1.1]',\n 'Shape Layer 1: Path 1 [1.1.2]',\n 'Shape Layer 1: Path 1 [1.1.3]'\n ];\nvar nullLayerNamesIn = [\n 'Shape Layer 1: Path 1 [1.1.0][In]',\n 'Shape Layer 1: Path 1 [1.1.1][In]',\n 'Shape Layer 1: Path 1 [1.1.2][In]',\n 'Shape Layer 1: Path 1 [1.1.3][In]'\n ];\nvar nullLayerNamesOut = [\n 'Shape Layer 1: Path 1 [1.1.0][Out]',\n 'Shape Layer 1: Path 1 [1.1.1][Out]',\n 'Shape Layer 1: Path 1 [1.1.2][Out]',\n 'Shape Layer 1: Path 1 [1.1.3][Out]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nvar getNullLayersIn = [];\nvar getNullLayersOut = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n getNullLayersIn.push(effect(nullLayerNamesIn[i])('ADBE Layer Control-0001'));\n getNullLayersOut.push(effect(nullLayerNamesOut[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n origInTang[i] = $bm_sub(fromCompToSurface(getNullLayersIn[i].toComp(getNullLayersIn[i].anchorPoint)), origPoints[i]);\n origOutTang[i] = $bm_sub(fromCompToSurface(getNullLayersOut[i].toComp(getNullLayersOut[i].anchorPoint)), origPoints[i]);\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.8902,0.7961,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 17","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[38,-62.5],[1,12],[-13.5,32],[-3,-2]],"o":[[-38,62.5],[-6.5,15.5],[13.5,-32],[3,2]],"v":[[340.5,-129.5],[305,-123.5],[284,-114.5],[311,-130]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [2.1.0]',\n 'Shape Layer 1: Path 1 [2.1.1]',\n 'Shape Layer 1: Path 1 [2.1.2]',\n 'Shape Layer 1: Path 1 [2.1.3]'\n ];\nvar nullLayerNamesIn = [\n 'Shape Layer 1: Path 1 [2.1.0][In]',\n 'Shape Layer 1: Path 1 [2.1.1][In]',\n 'Shape Layer 1: Path 1 [2.1.2][In]',\n 'Shape Layer 1: Path 1 [2.1.3][In]'\n ];\nvar nullLayerNamesOut = [\n 'Shape Layer 1: Path 1 [2.1.0][Out]',\n 'Shape Layer 1: Path 1 [2.1.1][Out]',\n 'Shape Layer 1: Path 1 [2.1.2][Out]',\n 'Shape Layer 1: Path 1 [2.1.3][Out]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nvar getNullLayersIn = [];\nvar getNullLayersOut = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n getNullLayersIn.push(effect(nullLayerNamesIn[i])('ADBE Layer Control-0001'));\n getNullLayersOut.push(effect(nullLayerNamesOut[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n origInTang[i] = $bm_sub(fromCompToSurface(getNullLayersIn[i].toComp(getNullLayersIn[i].anchorPoint)), origPoints[i]);\n origOutTang[i] = $bm_sub(fromCompToSurface(getNullLayersOut[i].toComp(getNullLayersOut[i].anchorPoint)), origPoints[i]);\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.8902,0.7961,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 16","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-3,-4]],"o":[[3,4]],"v":[[309.5,-129.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.8902,0.7961,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 15","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[6,1],[-10.5,-14.5],[-7.5,43.5],[0,-11]],"o":[[0,0],[-2,-32.5],[10.5,14.5],[7.5,-43.5],[0,11]],"v":[[265,-48],[257,-37],[295.5,-199.5],[239,-94],[264.5,-120.5]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [4.1.0]',\n 'Shape Layer 1: Path 1 [4.1.1]',\n 'Shape Layer 1: Path 1 [4.1.2]',\n 'Shape Layer 1: Path 1 [4.1.3]',\n 'Shape Layer 1: Path 1 [4.1.4]'\n ];\nvar nullLayerNamesIn = [\n 'Shape Layer 1: Path 1 [4.1.0][In]',\n 'Shape Layer 1: Path 1 [4.1.1][In]',\n 'Shape Layer 1: Path 1 [4.1.2][In]',\n 'Shape Layer 1: Path 1 [4.1.3][In]',\n 'Shape Layer 1: Path 1 [4.1.4][In]'\n ];\nvar nullLayerNamesOut = [\n 'Shape Layer 1: Path 1 [4.1.0][Out]',\n 'Shape Layer 1: Path 1 [4.1.1][Out]',\n 'Shape Layer 1: Path 1 [4.1.2][Out]',\n 'Shape Layer 1: Path 1 [4.1.3][Out]',\n 'Shape Layer 1: Path 1 [4.1.4][Out]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nvar getNullLayersIn = [];\nvar getNullLayersOut = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n getNullLayersIn.push(effect(nullLayerNamesIn[i])('ADBE Layer Control-0001'));\n getNullLayersOut.push(effect(nullLayerNamesOut[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n origInTang[i] = $bm_sub(fromCompToSurface(getNullLayersIn[i].toComp(getNullLayersIn[i].anchorPoint)), origPoints[i]);\n origOutTang[i] = $bm_sub(fromCompToSurface(getNullLayersOut[i].toComp(getNullLayersOut[i].anchorPoint)), origPoints[i]);\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.8902,0.7961,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 14","np":3,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[40,-57.5],[3.5,10],[13,-37],[-8,0],[0,0]],"o":[[-40,57.5],[-3.5,-10],[5.5,-57.5],[8,0],[0,0]],"v":[[243.5,-116.5],[211,-104.5],[181.5,-55],[223.5,-207.5],[199,-145.5]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [5.1.0]',\n 'Shape Layer 1: Path 1 [5.1.1]',\n 'Shape Layer 1: Path 1 [5.1.2]',\n 'Shape Layer 1: Path 1 [5.1.3]',\n 'Shape Layer 1: Path 1 [5.1.4]'\n ];\nvar nullLayerNamesIn = [\n 'Shape Layer 1: Path 1 [5.1.0][In]',\n 'Shape Layer 1: Path 1 [5.1.1][In]',\n 'Shape Layer 1: Path 1 [5.1.2][In]',\n 'Shape Layer 1: Path 1 [5.1.3][In]',\n 'Shape Layer 1: Path 1 [5.1.4][In]'\n ];\nvar nullLayerNamesOut = [\n 'Shape Layer 1: Path 1 [5.1.0][Out]',\n 'Shape Layer 1: Path 1 [5.1.1][Out]',\n 'Shape Layer 1: Path 1 [5.1.2][Out]',\n 'Shape Layer 1: Path 1 [5.1.3][Out]',\n 'Shape Layer 1: Path 1 [5.1.4][Out]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nvar getNullLayersIn = [];\nvar getNullLayersOut = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n getNullLayersIn.push(effect(nullLayerNamesIn[i])('ADBE Layer Control-0001'));\n getNullLayersOut.push(effect(nullLayerNamesOut[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n origInTang[i] = $bm_sub(fromCompToSurface(getNullLayersIn[i].toComp(getNullLayersIn[i].anchorPoint)), origPoints[i]);\n origOutTang[i] = $bm_sub(fromCompToSurface(getNullLayersOut[i].toComp(getNullLayersOut[i].anchorPoint)), origPoints[i]);\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.8902,0.7961,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 13","np":3,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,4.5],[0,0]],"o":[[0,-4.5],[0,0]],"v":[[272,-165],[133,-153]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [6.1.0]',\n 'Shape Layer 1: Path 1 [6.1.1]'\n ];\nvar nullLayerNamesIn = [\n 'Shape Layer 1: Path 1 [6.1.0][In]',\n 'Shape Layer 1: Path 1 [6.1.1][In]'\n ];\nvar nullLayerNamesOut = [\n 'Shape Layer 1: Path 1 [6.1.0][Out]',\n 'Shape Layer 1: Path 1 [6.1.1][Out]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nvar getNullLayersIn = [];\nvar getNullLayersOut = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n getNullLayersIn.push(effect(nullLayerNamesIn[i])('ADBE Layer Control-0001'));\n getNullLayersOut.push(effect(nullLayerNamesOut[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n origInTang[i] = $bm_sub(fromCompToSurface(getNullLayersIn[i].toComp(getNullLayersIn[i].anchorPoint)), origPoints[i]);\n origOutTang[i] = $bm_sub(fromCompToSurface(getNullLayersOut[i].toComp(getNullLayersOut[i].anchorPoint)), origPoints[i]);\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.8902,0.7961,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 12","np":3,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[7,-4.5],[-5,20]],"o":[[0,0],[-7,4.5],[5,-20]],"v":[[163,-17.5],[153.5,-6.5],[191,-192]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [7.1.0]',\n 'Shape Layer 1: Path 1 [7.1.1]',\n 'Shape Layer 1: Path 1 [7.1.2]'\n ];\nvar nullLayerNamesIn = [\n 'Shape Layer 1: Path 1 [7.1.0][In]',\n 'Shape Layer 1: Path 1 [7.1.1][In]',\n 'Shape Layer 1: Path 1 [7.1.2][In]'\n ];\nvar nullLayerNamesOut = [\n 'Shape Layer 1: Path 1 [7.1.0][Out]',\n 'Shape Layer 1: Path 1 [7.1.1][Out]',\n 'Shape Layer 1: Path 1 [7.1.2][Out]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nvar getNullLayersIn = [];\nvar getNullLayersOut = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n getNullLayersIn.push(effect(nullLayerNamesIn[i])('ADBE Layer Control-0001'));\n getNullLayersOut.push(effect(nullLayerNamesOut[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n origInTang[i] = $bm_sub(fromCompToSurface(getNullLayersIn[i].toComp(getNullLayersIn[i].anchorPoint)), origPoints[i]);\n origOutTang[i] = $bm_sub(fromCompToSurface(getNullLayersOut[i].toComp(getNullLayersOut[i].anchorPoint)), origPoints[i]);\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.8902,0.7961,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 11","np":3,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[14,-9.5],[-2,8],[-15.5,20],[35,-42],[-6,16.5]],"o":[[0,0],[-14,9.5],[-18.5,13.5],[15.5,-20],[-35,42],[6,-16.5]],"v":[[172,-115.5],[134,-62.5],[141.5,-114.5],[118.5,-127],[111,-95.5],[86,-105.5]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [8.1.0]',\n 'Shape Layer 1: Path 1 [8.1.1]',\n 'Shape Layer 1: Path 1 [8.1.2]',\n 'Shape Layer 1: Path 1 [8.1.3]',\n 'Shape Layer 1: Path 1 [8.1.4]',\n 'Shape Layer 1: Path 1 [8.1.5]'\n ];\nvar nullLayerNamesIn = [\n 'Shape Layer 1: Path 1 [8.1.0][In]',\n 'Shape Layer 1: Path 1 [8.1.1][In]',\n 'Shape Layer 1: Path 1 [8.1.2][In]',\n 'Shape Layer 1: Path 1 [8.1.3][In]',\n 'Shape Layer 1: Path 1 [8.1.4][In]',\n 'Shape Layer 1: Path 1 [8.1.5][In]'\n ];\nvar nullLayerNamesOut = [\n 'Shape Layer 1: Path 1 [8.1.0][Out]',\n 'Shape Layer 1: Path 1 [8.1.1][Out]',\n 'Shape Layer 1: Path 1 [8.1.2][Out]',\n 'Shape Layer 1: Path 1 [8.1.3][Out]',\n 'Shape Layer 1: Path 1 [8.1.4][Out]',\n 'Shape Layer 1: Path 1 [8.1.5][Out]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nvar getNullLayersIn = [];\nvar getNullLayersOut = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n getNullLayersIn.push(effect(nullLayerNamesIn[i])('ADBE Layer Control-0001'));\n getNullLayersOut.push(effect(nullLayerNamesOut[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n origInTang[i] = $bm_sub(fromCompToSurface(getNullLayersIn[i].toComp(getNullLayersIn[i].anchorPoint)), origPoints[i]);\n origOutTang[i] = $bm_sub(fromCompToSurface(getNullLayersOut[i].toComp(getNullLayersOut[i].anchorPoint)), origPoints[i]);\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.8902,0.7961,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 10","np":3,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[3.5,-2.5],[0,0]],"o":[[0,0],[-3.5,2.5],[0,0]],"v":[[-22,-7.5],[-31,4.5],[5,-203.5]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [9.1.0]',\n 'Shape Layer 1: Path 1 [9.1.1]',\n 'Shape Layer 1: Path 1 [9.1.2]'\n ];\nvar nullLayerNamesIn = [\n 'Shape Layer 1: Path 1 [9.1.0][In]',\n 'Shape Layer 1: Path 1 [9.1.1][In]',\n 'Shape Layer 1: Path 1 [9.1.2][In]'\n ];\nvar nullLayerNamesOut = [\n 'Shape Layer 1: Path 1 [9.1.0][Out]',\n 'Shape Layer 1: Path 1 [9.1.1][Out]',\n 'Shape Layer 1: Path 1 [9.1.2][Out]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nvar getNullLayersIn = [];\nvar getNullLayersOut = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n getNullLayersIn.push(effect(nullLayerNamesIn[i])('ADBE Layer Control-0001'));\n getNullLayersOut.push(effect(nullLayerNamesOut[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n origInTang[i] = $bm_sub(fromCompToSurface(getNullLayersIn[i].toComp(getNullLayersIn[i].anchorPoint)), origPoints[i]);\n origOutTang[i] = $bm_sub(fromCompToSurface(getNullLayersOut[i].toComp(getNullLayersOut[i].anchorPoint)), origPoints[i]);\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.8902,0.7961,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 9","np":3,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-129.5,39.5],[64.181,-31.033],[-24.445,17.232],[59,-3],[-2.5,-20.5]],"o":[[129.5,-39.5],[-45.5,22],[30.5,-21.5],[-59,3],[2.5,20.5]],"v":[[-15,-22],[6.5,-127],[16.5,-113.5],[23.5,-192.5],[-33.5,-132]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [10.1.0]',\n 'Shape Layer 1: Path 1 [10.1.1]',\n 'Shape Layer 1: Path 1 [10.1.2]',\n 'Shape Layer 1: Path 1 [10.1.3]',\n 'Shape Layer 1: Path 1 [10.1.4]'\n ];\nvar nullLayerNamesIn = [\n 'Shape Layer 1: Path 1 [10.1.0][In]',\n 'Shape Layer 1: Path 1 [10.1.1][In]',\n 'Shape Layer 1: Path 1 [10.1.2][In]',\n 'Shape Layer 1: Path 1 [10.1.3][In]',\n 'Shape Layer 1: Path 1 [10.1.4][In]'\n ];\nvar nullLayerNamesOut = [\n 'Shape Layer 1: Path 1 [10.1.0][Out]',\n 'Shape Layer 1: Path 1 [10.1.1][Out]',\n 'Shape Layer 1: Path 1 [10.1.2][Out]',\n 'Shape Layer 1: Path 1 [10.1.3][Out]',\n 'Shape Layer 1: Path 1 [10.1.4][Out]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nvar getNullLayersIn = [];\nvar getNullLayersOut = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n getNullLayersIn.push(effect(nullLayerNamesIn[i])('ADBE Layer Control-0001'));\n getNullLayersOut.push(effect(nullLayerNamesOut[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n origInTang[i] = $bm_sub(fromCompToSurface(getNullLayersIn[i].toComp(getNullLayersIn[i].anchorPoint)), origPoints[i]);\n origOutTang[i] = $bm_sub(fromCompToSurface(getNullLayersOut[i].toComp(getNullLayersOut[i].anchorPoint)), origPoints[i]);\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.8902,0.7961,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 8","np":3,"cix":2,"bm":0,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[90.5,-65],[-22,-1.5],[-3,17],[-3.5,11.5]],"o":[[-90.5,65],[22,1.5],[-34,51.5],[3.5,-11.5]],"v":[[-82,-91],[-160,55],[-116.5,-93],[-138,-96]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [11.1.0]',\n 'Shape Layer 1: Path 1 [11.1.1]',\n 'Shape Layer 1: Path 1 [11.1.2]',\n 'Shape Layer 1: Path 1 [11.1.3]'\n ];\nvar nullLayerNamesIn = [\n 'Shape Layer 1: Path 1 [11.1.0][In]',\n 'Shape Layer 1: Path 1 [11.1.1][In]',\n 'Shape Layer 1: Path 1 [11.1.2][In]',\n 'Shape Layer 1: Path 1 [11.1.3][In]'\n ];\nvar nullLayerNamesOut = [\n 'Shape Layer 1: Path 1 [11.1.0][Out]',\n 'Shape Layer 1: Path 1 [11.1.1][Out]',\n 'Shape Layer 1: Path 1 [11.1.2][Out]',\n 'Shape Layer 1: Path 1 [11.1.3][Out]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nvar getNullLayersIn = [];\nvar getNullLayersOut = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n getNullLayersIn.push(effect(nullLayerNamesIn[i])('ADBE Layer Control-0001'));\n getNullLayersOut.push(effect(nullLayerNamesOut[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n origInTang[i] = $bm_sub(fromCompToSurface(getNullLayersIn[i].toComp(getNullLayersIn[i].anchorPoint)), origPoints[i]);\n origOutTang[i] = $bm_sub(fromCompToSurface(getNullLayersOut[i].toComp(getNullLayersOut[i].anchorPoint)), origPoints[i]);\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.8902,0.7961,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 7","np":3,"cix":2,"bm":0,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-20,3],[22,4],[0,0],[0,0]],"o":[[20,-3],[-22,-4],[0,0],[0,0]],"v":[[-235.5,-50.5],[-202.5,-96.5],[-244.5,42],[-219,-109.5]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [13.1.0]',\n 'Shape Layer 1: Path 1 [13.1.1]',\n 'Shape Layer 1: Path 1 [13.1.2]',\n 'Shape Layer 1: Path 1 [13.1.3]'\n ];\nvar nullLayerNamesIn = [\n 'Shape Layer 1: Path 1 [13.1.0][In]',\n 'Shape Layer 1: Path 1 [13.1.1][In]',\n 'Shape Layer 1: Path 1 [13.1.2][In]',\n 'Shape Layer 1: Path 1 [13.1.3][In]'\n ];\nvar nullLayerNamesOut = [\n 'Shape Layer 1: Path 1 [13.1.0][Out]',\n 'Shape Layer 1: Path 1 [13.1.1][Out]',\n 'Shape Layer 1: Path 1 [13.1.2][Out]',\n 'Shape Layer 1: Path 1 [13.1.3][Out]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nvar getNullLayersIn = [];\nvar getNullLayersOut = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n getNullLayersIn.push(effect(nullLayerNamesIn[i])('ADBE Layer Control-0001'));\n getNullLayersOut.push(effect(nullLayerNamesOut[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n origInTang[i] = $bm_sub(fromCompToSurface(getNullLayersIn[i].toComp(getNullLayersIn[i].anchorPoint)), origPoints[i]);\n origOutTang[i] = $bm_sub(fromCompToSurface(getNullLayersOut[i].toComp(getNullLayersOut[i].anchorPoint)), origPoints[i]);\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.8902,0.7961,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[40,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 6","np":3,"cix":2,"bm":0,"ix":12,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-20,3],[22,4],[0,0],[0,0]],"o":[[20,-3],[-22,-4],[0,0],[0,0]],"v":[[-235.5,-50.5],[-202.5,-96.5],[-244.5,42],[-219,-109.5]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [13.1.0]',\n 'Shape Layer 1: Path 1 [13.1.1]',\n 'Shape Layer 1: Path 1 [13.1.2]',\n 'Shape Layer 1: Path 1 [13.1.3]'\n ];\nvar nullLayerNamesIn = [\n 'Shape Layer 1: Path 1 [13.1.0][In]',\n 'Shape Layer 1: Path 1 [13.1.1][In]',\n 'Shape Layer 1: Path 1 [13.1.2][In]',\n 'Shape Layer 1: Path 1 [13.1.3][In]'\n ];\nvar nullLayerNamesOut = [\n 'Shape Layer 1: Path 1 [13.1.0][Out]',\n 'Shape Layer 1: Path 1 [13.1.1][Out]',\n 'Shape Layer 1: Path 1 [13.1.2][Out]',\n 'Shape Layer 1: Path 1 [13.1.3][Out]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nvar getNullLayersIn = [];\nvar getNullLayersOut = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n getNullLayersIn.push(effect(nullLayerNamesIn[i])('ADBE Layer Control-0001'));\n getNullLayersOut.push(effect(nullLayerNamesOut[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n origInTang[i] = $bm_sub(fromCompToSurface(getNullLayersIn[i].toComp(getNullLayersIn[i].anchorPoint)), origPoints[i]);\n origOutTang[i] = $bm_sub(fromCompToSurface(getNullLayersOut[i].toComp(getNullLayersOut[i].anchorPoint)), origPoints[i]);\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.8902,0.7961,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 5","np":3,"cix":2,"bm":0,"ix":13,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[38,-62.5],[1,12],[-13.5,32],[-3,-2]],"o":[[-38,62.5],[-6.5,15.5],[13.5,-32],[3,2]],"v":[[-221.5,-80.5],[-257,-74.5],[-278,-65.5],[-251,-81]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [14.1.0]',\n 'Shape Layer 1: Path 1 [14.1.1]',\n 'Shape Layer 1: Path 1 [14.1.2]',\n 'Shape Layer 1: Path 1 [14.1.3]'\n ];\nvar nullLayerNamesIn = [\n 'Shape Layer 1: Path 1 [14.1.0][In]',\n 'Shape Layer 1: Path 1 [14.1.1][In]',\n 'Shape Layer 1: Path 1 [14.1.2][In]',\n 'Shape Layer 1: Path 1 [14.1.3][In]'\n ];\nvar nullLayerNamesOut = [\n 'Shape Layer 1: Path 1 [14.1.0][Out]',\n 'Shape Layer 1: Path 1 [14.1.1][Out]',\n 'Shape Layer 1: Path 1 [14.1.2][Out]',\n 'Shape Layer 1: Path 1 [14.1.3][Out]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nvar getNullLayersIn = [];\nvar getNullLayersOut = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n getNullLayersIn.push(effect(nullLayerNamesIn[i])('ADBE Layer Control-0001'));\n getNullLayersOut.push(effect(nullLayerNamesOut[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n origInTang[i] = $bm_sub(fromCompToSurface(getNullLayersIn[i].toComp(getNullLayersIn[i].anchorPoint)), origPoints[i]);\n origOutTang[i] = $bm_sub(fromCompToSurface(getNullLayersOut[i].toComp(getNullLayersOut[i].anchorPoint)), origPoints[i]);\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.8902,0.7961,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 4","np":3,"cix":2,"bm":0,"ix":14,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-324.5,-6],[-292,-169]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [15.1.0]',\n 'Shape Layer 1: Path 1 [15.1.1]'\n ];\nvar nullLayerNamesIn = [\n 'Shape Layer 1: Path 1 [15.1.0][In]',\n 'Shape Layer 1: Path 1 [15.1.1][In]'\n ];\nvar nullLayerNamesOut = [\n 'Shape Layer 1: Path 1 [15.1.0][Out]',\n 'Shape Layer 1: Path 1 [15.1.1][Out]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nvar getNullLayersIn = [];\nvar getNullLayersOut = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n getNullLayersIn.push(effect(nullLayerNamesIn[i])('ADBE Layer Control-0001'));\n getNullLayersOut.push(effect(nullLayerNamesOut[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n origInTang[i] = $bm_sub(fromCompToSurface(getNullLayersIn[i].toComp(getNullLayersIn[i].anchorPoint)), origPoints[i]);\n origOutTang[i] = $bm_sub(fromCompToSurface(getNullLayersOut[i].toComp(getNullLayersOut[i].anchorPoint)), origPoints[i]);\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.8902,0.7961,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 3","np":3,"cix":2,"bm":0,"ix":15,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[29.5,-13],[-3,-3]],"o":[[0,0],[-29.5,13],[3,3]],"v":[[-274.5,-95],[-417,-38.5],[-431,-23.5]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [16.1.0]',\n 'Shape Layer 1: Path 1 [16.1.1]',\n 'Shape Layer 1: Path 1 [16.1.2]'\n ];\nvar nullLayerNamesIn = [\n 'Shape Layer 1: Path 1 [16.1.0][In]',\n 'Shape Layer 1: Path 1 [16.1.1][In]',\n 'Shape Layer 1: Path 1 [16.1.2][In]'\n ];\nvar nullLayerNamesOut = [\n 'Shape Layer 1: Path 1 [16.1.0][Out]',\n 'Shape Layer 1: Path 1 [16.1.1][Out]',\n 'Shape Layer 1: Path 1 [16.1.2][Out]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nvar getNullLayersIn = [];\nvar getNullLayersOut = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n getNullLayersIn.push(effect(nullLayerNamesIn[i])('ADBE Layer Control-0001'));\n getNullLayersOut.push(effect(nullLayerNamesOut[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n origInTang[i] = $bm_sub(fromCompToSurface(getNullLayersIn[i].toComp(getNullLayersIn[i].anchorPoint)), origPoints[i]);\n origOutTang[i] = $bm_sub(fromCompToSurface(getNullLayersOut[i].toComp(getNullLayersOut[i].anchorPoint)), origPoints[i]);\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.8902,0.7961,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 2","np":3,"cix":2,"bm":0,"ix":16,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[8,-4.5],[0,5],[16.5,-26.5],[0,0]],"o":[[-8,4.5],[0,-5],[-16.5,26.5],[0,0]],"v":[[-383.5,39.5],[-352,-149.5],[-381.5,-118],[-375,-91]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [17.1.0]',\n 'Shape Layer 1: Path 1 [17.1.1]',\n 'Shape Layer 1: Path 1 [17.1.2]',\n 'Shape Layer 1: Path 1 [17.1.3]'\n ];\nvar nullLayerNamesIn = [\n 'Shape Layer 1: Path 1 [17.1.0][In]',\n 'Shape Layer 1: Path 1 [17.1.1][In]',\n 'Shape Layer 1: Path 1 [17.1.2][In]',\n 'Shape Layer 1: Path 1 [17.1.3][In]'\n ];\nvar nullLayerNamesOut = [\n 'Shape Layer 1: Path 1 [17.1.0][Out]',\n 'Shape Layer 1: Path 1 [17.1.1][Out]',\n 'Shape Layer 1: Path 1 [17.1.2][Out]',\n 'Shape Layer 1: Path 1 [17.1.3][Out]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nvar getNullLayersIn = [];\nvar getNullLayersOut = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n getNullLayersIn.push(effect(nullLayerNamesIn[i])('ADBE Layer Control-0001'));\n getNullLayersOut.push(effect(nullLayerNamesOut[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n origInTang[i] = $bm_sub(fromCompToSurface(getNullLayersIn[i].toComp(getNullLayersIn[i].anchorPoint)), origPoints[i]);\n origOutTang[i] = $bm_sub(fromCompToSurface(getNullLayersOut[i].toComp(getNullLayersOut[i].anchorPoint)), origPoints[i]);\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.8902,0.7961,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":17,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":100,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":8,"s":[100]},{"t":102.999991085038,"s":[0]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":2,"ix":18,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":134.999988315342,"st":-39.999996537879,"bm":0},{"ddd":0,"ind":25,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":6,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":13,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":14,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":18,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":21,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":32,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":38,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":39,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":46,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":47,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":48,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":49,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":50,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":51,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":52,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":53,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":54,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":55,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":56,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":57,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":58,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":59,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":61,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":62,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":63,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":64,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":65,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":66,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":67,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":68,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":69,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":70,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":71,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":72,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":73,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":74,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":75,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":76,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":77,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":78,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":79,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":80,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":81,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":82,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":83,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":84,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":85,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":86,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":87,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":88,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":89,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":90,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":91,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":92,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":93,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":94,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":95,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":96,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":97,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":98,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":99,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":100,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":101,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":102,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":103,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":104,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":105,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":106,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":107,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":108,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":109,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":110,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":111,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":112,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":113,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":114,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":115,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":116,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":117,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":118,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":119,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":120,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":121,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":122,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":123,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":124,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":125,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":126,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":127,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":128,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":129,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":130,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":131,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":132,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":133,"s":[0]},{"t":133.999988401895,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":2,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":5,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":7,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":9,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":19,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":23,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":24,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":27,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":28,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":29,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":32,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":33,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":36,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":37,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":39,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":44,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":45,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":47,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":48,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":49,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":51,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":52,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":53,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":54,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":55,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":56,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":57,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":58,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":59,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":60,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":61,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":62,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":63,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":64,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":65,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":66,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":67,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":68,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":69,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":70,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":71,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":72,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":73,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":74,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":75,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":76,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":77,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":78,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":79,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":80,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":81,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":82,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":83,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":84,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":85,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":86,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":87,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":88,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":89,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":90,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":91,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":92,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":93,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":94,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":95,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":96,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":97,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":98,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":99,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":100,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":101,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":102,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":103,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":104,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":105,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":106,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":107,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":108,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":109,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":110,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":111,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":112,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":113,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":114,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":115,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":116,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":117,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":118,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":119,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":120,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":121,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":122,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":123,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":124,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":125,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":126,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":127,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":128,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":129,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":130,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":131,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":132,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":133,"s":[540,373.5,0],"to":[0,0,0],"ti":[0,0,0]},{"t":133.999988401895,"s":[540,373.5,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":1,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":2,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":3,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":4,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":5,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":6,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":7,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":8,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":9,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":10,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":11,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":12,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":13,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":14,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":15,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":16,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":17,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":18,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":19,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":20,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":21,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":22,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":23,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":24,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":25,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":26,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":27,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":28,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":29,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":30,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":31,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":33,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":34,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":35,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":36,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":37,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":38,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":39,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":40,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":41,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":42,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":43,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":44,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":45,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":46,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":47,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":48,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":49,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":50,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":51,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":52,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":53,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":54,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":55,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":56,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":57,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":58,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":59,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":60,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":61,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":62,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":63,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":64,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":65,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":66,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":67,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":68,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":69,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":70,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":71,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":72,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":73,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":74,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":75,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":76,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":77,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":78,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":79,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":80,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":81,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":82,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":83,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":84,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":85,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":86,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":87,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":88,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":89,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":90,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":91,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":92,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":93,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":94,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":95,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":96,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":97,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":98,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":99,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":100,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":101,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":102,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":103,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":104,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":105,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":106,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":107,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":108,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":109,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":110,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":111,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":112,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":113,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":114,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":115,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":116,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":117,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":118,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":119,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":120,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":121,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":122,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":123,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":124,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":125,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":126,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":127,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":128,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":129,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":130,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":131,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":132,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":133,"s":[100,100,100]},{"t":133.999988401895,"s":[100,100,100]}],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Shape Layer 1: Path 1 [17.1.0]","np":3,"mn":"ADBE Layer Control","ix":1,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":175,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [17.1.0][In]","np":3,"mn":"ADBE Layer Control","ix":2,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":177,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [17.1.0][Out]","np":3,"mn":"ADBE Layer Control","ix":3,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":176,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [17.1.1]","np":3,"mn":"ADBE Layer Control","ix":4,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":172,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [17.1.1][In]","np":3,"mn":"ADBE Layer Control","ix":5,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":174,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [17.1.1][Out]","np":3,"mn":"ADBE Layer Control","ix":6,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":173,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [17.1.2]","np":3,"mn":"ADBE Layer Control","ix":7,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":169,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [17.1.2][In]","np":3,"mn":"ADBE Layer Control","ix":8,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":171,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [17.1.2][Out]","np":3,"mn":"ADBE Layer Control","ix":9,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":170,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [17.1.3]","np":3,"mn":"ADBE Layer Control","ix":10,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":166,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [17.1.3][In]","np":3,"mn":"ADBE Layer Control","ix":11,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":168,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [17.1.3][Out]","np":3,"mn":"ADBE Layer Control","ix":12,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":167,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [16.1.0]","np":3,"mn":"ADBE Layer Control","ix":13,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":163,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [16.1.0][In]","np":3,"mn":"ADBE Layer Control","ix":14,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":165,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [16.1.0][Out]","np":3,"mn":"ADBE Layer Control","ix":15,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":164,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [16.1.1]","np":3,"mn":"ADBE Layer Control","ix":16,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":160,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [16.1.1][In]","np":3,"mn":"ADBE Layer Control","ix":17,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":162,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [16.1.1][Out]","np":3,"mn":"ADBE Layer Control","ix":18,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":161,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [16.1.2]","np":3,"mn":"ADBE Layer Control","ix":19,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":157,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [16.1.2][In]","np":3,"mn":"ADBE Layer Control","ix":20,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":159,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [16.1.2][Out]","np":3,"mn":"ADBE Layer Control","ix":21,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":158,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [15.1.0]","np":3,"mn":"ADBE Layer Control","ix":22,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":154,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [15.1.0][In]","np":3,"mn":"ADBE Layer Control","ix":23,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":156,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [15.1.0][Out]","np":3,"mn":"ADBE Layer Control","ix":24,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":155,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [15.1.1]","np":3,"mn":"ADBE Layer Control","ix":25,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":151,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [15.1.1][In]","np":3,"mn":"ADBE Layer Control","ix":26,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":153,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [15.1.1][Out]","np":3,"mn":"ADBE Layer Control","ix":27,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":152,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [14.1.0]","np":3,"mn":"ADBE Layer Control","ix":28,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":148,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [14.1.0][In]","np":3,"mn":"ADBE Layer Control","ix":29,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":150,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [14.1.0][Out]","np":3,"mn":"ADBE Layer Control","ix":30,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":149,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [14.1.1]","np":3,"mn":"ADBE Layer Control","ix":31,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":145,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [14.1.1][In]","np":3,"mn":"ADBE Layer Control","ix":32,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":147,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [14.1.1][Out]","np":3,"mn":"ADBE Layer Control","ix":33,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":146,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [14.1.2]","np":3,"mn":"ADBE Layer Control","ix":34,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":142,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [14.1.2][In]","np":3,"mn":"ADBE Layer Control","ix":35,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":144,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [14.1.2][Out]","np":3,"mn":"ADBE Layer Control","ix":36,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":143,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [14.1.3]","np":3,"mn":"ADBE Layer Control","ix":37,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":139,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [14.1.3][In]","np":3,"mn":"ADBE Layer Control","ix":38,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":141,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [14.1.3][Out]","np":3,"mn":"ADBE Layer Control","ix":39,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":140,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [13.1.0]","np":3,"mn":"ADBE Layer Control","ix":40,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":136,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [13.1.0][In]","np":3,"mn":"ADBE Layer Control","ix":41,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":138,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [13.1.0][Out]","np":3,"mn":"ADBE Layer Control","ix":42,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":137,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [13.1.1]","np":3,"mn":"ADBE Layer Control","ix":43,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":133,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [13.1.1][In]","np":3,"mn":"ADBE Layer Control","ix":44,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":135,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [13.1.1][Out]","np":3,"mn":"ADBE Layer Control","ix":45,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":134,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [13.1.2]","np":3,"mn":"ADBE Layer Control","ix":46,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":130,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [13.1.2][In]","np":3,"mn":"ADBE Layer Control","ix":47,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":132,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [13.1.2][Out]","np":3,"mn":"ADBE Layer Control","ix":48,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":131,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [13.1.3]","np":3,"mn":"ADBE Layer Control","ix":49,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":127,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [13.1.3][In]","np":3,"mn":"ADBE Layer Control","ix":50,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":129,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [13.1.3][Out]","np":3,"mn":"ADBE Layer Control","ix":51,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":128,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [11.1.0]","np":3,"mn":"ADBE Layer Control","ix":52,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":124,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [11.1.0][In]","np":3,"mn":"ADBE Layer Control","ix":53,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":126,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [11.1.0][Out]","np":3,"mn":"ADBE Layer Control","ix":54,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":125,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [11.1.1]","np":3,"mn":"ADBE Layer Control","ix":55,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":121,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [11.1.1][In]","np":3,"mn":"ADBE Layer Control","ix":56,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":123,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [11.1.1][Out]","np":3,"mn":"ADBE Layer Control","ix":57,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":122,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [11.1.2]","np":3,"mn":"ADBE Layer Control","ix":58,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":118,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [11.1.2][In]","np":3,"mn":"ADBE Layer Control","ix":59,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":120,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [11.1.2][Out]","np":3,"mn":"ADBE Layer Control","ix":60,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":119,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [11.1.3]","np":3,"mn":"ADBE Layer Control","ix":61,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":115,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [11.1.3][In]","np":3,"mn":"ADBE Layer Control","ix":62,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":117,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [11.1.3][Out]","np":3,"mn":"ADBE Layer Control","ix":63,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":116,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [9.1.0]","np":3,"mn":"ADBE Layer Control","ix":64,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":112,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [9.1.0][In]","np":3,"mn":"ADBE Layer Control","ix":65,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":114,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [9.1.0][Out]","np":3,"mn":"ADBE Layer Control","ix":66,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":113,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [9.1.1]","np":3,"mn":"ADBE Layer Control","ix":67,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":109,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [9.1.1][In]","np":3,"mn":"ADBE Layer Control","ix":68,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":111,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [9.1.1][Out]","np":3,"mn":"ADBE Layer Control","ix":69,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":110,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [9.1.2]","np":3,"mn":"ADBE Layer Control","ix":70,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":106,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [9.1.2][In]","np":3,"mn":"ADBE Layer Control","ix":71,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":108,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [9.1.2][Out]","np":3,"mn":"ADBE Layer Control","ix":72,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":107,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [10.1.0]","np":3,"mn":"ADBE Layer Control","ix":73,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":103,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [10.1.0][In]","np":3,"mn":"ADBE Layer Control","ix":74,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":105,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [10.1.0][Out]","np":3,"mn":"ADBE Layer Control","ix":75,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":104,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [10.1.1]","np":3,"mn":"ADBE Layer Control","ix":76,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":100,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [10.1.1][In]","np":3,"mn":"ADBE Layer Control","ix":77,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":102,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [10.1.1][Out]","np":3,"mn":"ADBE Layer Control","ix":78,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":101,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [10.1.2]","np":3,"mn":"ADBE Layer Control","ix":79,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":97,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [10.1.2][In]","np":3,"mn":"ADBE Layer Control","ix":80,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":99,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [10.1.2][Out]","np":3,"mn":"ADBE Layer Control","ix":81,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":98,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [10.1.3]","np":3,"mn":"ADBE Layer Control","ix":82,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":94,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [10.1.3][In]","np":3,"mn":"ADBE Layer Control","ix":83,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":96,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [10.1.3][Out]","np":3,"mn":"ADBE Layer Control","ix":84,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":95,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [10.1.4]","np":3,"mn":"ADBE Layer Control","ix":85,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":91,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [10.1.4][In]","np":3,"mn":"ADBE Layer Control","ix":86,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":93,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [10.1.4][Out]","np":3,"mn":"ADBE Layer Control","ix":87,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":92,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.0]","np":3,"mn":"ADBE Layer Control","ix":88,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":88,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.0][In]","np":3,"mn":"ADBE Layer Control","ix":89,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":90,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.0][Out]","np":3,"mn":"ADBE Layer Control","ix":90,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":89,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.1]","np":3,"mn":"ADBE Layer Control","ix":91,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":85,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.1][In]","np":3,"mn":"ADBE Layer Control","ix":92,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":87,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.1][Out]","np":3,"mn":"ADBE Layer Control","ix":93,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":86,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.2]","np":3,"mn":"ADBE Layer Control","ix":94,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":82,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.2][In]","np":3,"mn":"ADBE Layer Control","ix":95,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":84,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.2][Out]","np":3,"mn":"ADBE Layer Control","ix":96,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":83,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.3]","np":3,"mn":"ADBE Layer Control","ix":97,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":79,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.3][In]","np":3,"mn":"ADBE Layer Control","ix":98,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":81,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.3][Out]","np":3,"mn":"ADBE Layer Control","ix":99,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":80,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.4]","np":3,"mn":"ADBE Layer Control","ix":100,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":76,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.4][In]","np":3,"mn":"ADBE Layer Control","ix":101,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":78,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.4][Out]","np":3,"mn":"ADBE Layer Control","ix":102,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":77,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.5]","np":3,"mn":"ADBE Layer Control","ix":103,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":73,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.5][In]","np":3,"mn":"ADBE Layer Control","ix":104,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":75,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [8.1.5][Out]","np":3,"mn":"ADBE Layer Control","ix":105,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":74,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [7.1.0]","np":3,"mn":"ADBE Layer Control","ix":106,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":70,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [7.1.0][In]","np":3,"mn":"ADBE Layer Control","ix":107,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":72,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [7.1.0][Out]","np":3,"mn":"ADBE Layer Control","ix":108,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":71,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [7.1.1]","np":3,"mn":"ADBE Layer Control","ix":109,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":67,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [7.1.1][In]","np":3,"mn":"ADBE Layer Control","ix":110,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":69,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [7.1.1][Out]","np":3,"mn":"ADBE Layer Control","ix":111,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":68,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [7.1.2]","np":3,"mn":"ADBE Layer Control","ix":112,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":64,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [7.1.2][In]","np":3,"mn":"ADBE Layer Control","ix":113,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":66,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [7.1.2][Out]","np":3,"mn":"ADBE Layer Control","ix":114,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":65,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [6.1.0]","np":3,"mn":"ADBE Layer Control","ix":115,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":61,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [6.1.0][In]","np":3,"mn":"ADBE Layer Control","ix":116,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":63,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [6.1.0][Out]","np":3,"mn":"ADBE Layer Control","ix":117,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":62,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [6.1.1]","np":3,"mn":"ADBE Layer Control","ix":118,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":58,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [6.1.1][In]","np":3,"mn":"ADBE Layer Control","ix":119,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":60,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [6.1.1][Out]","np":3,"mn":"ADBE Layer Control","ix":120,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":59,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [5.1.0]","np":3,"mn":"ADBE Layer Control","ix":121,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":55,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [5.1.0][In]","np":3,"mn":"ADBE Layer Control","ix":122,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":57,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [5.1.0][Out]","np":3,"mn":"ADBE Layer Control","ix":123,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":56,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [5.1.1]","np":3,"mn":"ADBE Layer Control","ix":124,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":52,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [5.1.1][In]","np":3,"mn":"ADBE Layer Control","ix":125,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":54,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [5.1.1][Out]","np":3,"mn":"ADBE Layer Control","ix":126,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":53,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [5.1.2]","np":3,"mn":"ADBE Layer Control","ix":127,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":49,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [5.1.2][In]","np":3,"mn":"ADBE Layer Control","ix":128,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":51,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [5.1.2][Out]","np":3,"mn":"ADBE Layer Control","ix":129,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":50,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [5.1.3]","np":3,"mn":"ADBE Layer Control","ix":130,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":46,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [5.1.3][In]","np":3,"mn":"ADBE Layer Control","ix":131,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":48,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [5.1.3][Out]","np":3,"mn":"ADBE Layer Control","ix":132,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":47,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [5.1.4]","np":3,"mn":"ADBE Layer Control","ix":133,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":43,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [5.1.4][In]","np":3,"mn":"ADBE Layer Control","ix":134,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":45,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [5.1.4][Out]","np":3,"mn":"ADBE Layer Control","ix":135,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":44,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [4.1.0]","np":3,"mn":"ADBE Layer Control","ix":136,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":40,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [4.1.0][In]","np":3,"mn":"ADBE Layer Control","ix":137,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":42,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [4.1.0][Out]","np":3,"mn":"ADBE Layer Control","ix":138,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":41,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [4.1.1]","np":3,"mn":"ADBE Layer Control","ix":139,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":37,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [4.1.1][In]","np":3,"mn":"ADBE Layer Control","ix":140,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":39,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [4.1.1][Out]","np":3,"mn":"ADBE Layer Control","ix":141,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":38,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [4.1.2]","np":3,"mn":"ADBE Layer Control","ix":142,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":34,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [4.1.2][In]","np":3,"mn":"ADBE Layer Control","ix":143,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":36,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [4.1.2][Out]","np":3,"mn":"ADBE Layer Control","ix":144,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":35,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [4.1.3]","np":3,"mn":"ADBE Layer Control","ix":145,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":31,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [4.1.3][In]","np":3,"mn":"ADBE Layer Control","ix":146,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":33,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [4.1.3][Out]","np":3,"mn":"ADBE Layer Control","ix":147,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":32,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [4.1.4]","np":3,"mn":"ADBE Layer Control","ix":148,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":28,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [4.1.4][In]","np":3,"mn":"ADBE Layer Control","ix":149,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":30,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [4.1.4][Out]","np":3,"mn":"ADBE Layer Control","ix":150,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":29,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [2.1.0]","np":3,"mn":"ADBE Layer Control","ix":151,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":22,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [2.1.0][In]","np":3,"mn":"ADBE Layer Control","ix":152,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":27,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [2.1.0][Out]","np":3,"mn":"ADBE Layer Control","ix":153,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":26,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [2.1.1]","np":3,"mn":"ADBE Layer Control","ix":154,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":19,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [2.1.1][In]","np":3,"mn":"ADBE Layer Control","ix":155,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":21,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [2.1.1][Out]","np":3,"mn":"ADBE Layer Control","ix":156,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":20,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [2.1.2]","np":3,"mn":"ADBE Layer Control","ix":157,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":16,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [2.1.2][In]","np":3,"mn":"ADBE Layer Control","ix":158,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":18,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [2.1.2][Out]","np":3,"mn":"ADBE Layer Control","ix":159,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":17,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [2.1.3]","np":3,"mn":"ADBE Layer Control","ix":160,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":13,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [2.1.3][In]","np":3,"mn":"ADBE Layer Control","ix":161,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":15,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [2.1.3][Out]","np":3,"mn":"ADBE Layer Control","ix":162,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":14,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [1.1.0]","np":3,"mn":"ADBE Layer Control","ix":163,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":10,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [1.1.0][In]","np":3,"mn":"ADBE Layer Control","ix":164,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":12,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [1.1.0][Out]","np":3,"mn":"ADBE Layer Control","ix":165,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":11,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [1.1.1]","np":3,"mn":"ADBE Layer Control","ix":166,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":7,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [1.1.1][In]","np":3,"mn":"ADBE Layer Control","ix":167,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":9,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [1.1.1][Out]","np":3,"mn":"ADBE Layer Control","ix":168,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":8,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [1.1.2]","np":3,"mn":"ADBE Layer Control","ix":169,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":4,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [1.1.2][In]","np":3,"mn":"ADBE Layer Control","ix":170,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":6,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [1.1.2][Out]","np":3,"mn":"ADBE Layer Control","ix":171,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":5,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [1.1.3]","np":3,"mn":"ADBE Layer Control","ix":172,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":1,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [1.1.3][In]","np":3,"mn":"ADBE Layer Control","ix":173,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":3,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [1.1.3][Out]","np":3,"mn":"ADBE Layer Control","ix":174,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":2,"ix":1}}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[90.5,-65],[-22,-1.5],[-3,17],[-3.5,11.5]],"o":[[-90.5,65],[22,1.5],[-34,51.5],[3.5,-11.5]],"v":[[398.5,-134],[320.5,12],[364,-136],[342.5,-139]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [1.1.0]',\n 'Shape Layer 1: Path 1 [1.1.1]',\n 'Shape Layer 1: Path 1 [1.1.2]',\n 'Shape Layer 1: Path 1 [1.1.3]'\n ];\nvar nullLayerNamesIn = [\n 'Shape Layer 1: Path 1 [1.1.0][In]',\n 'Shape Layer 1: Path 1 [1.1.1][In]',\n 'Shape Layer 1: Path 1 [1.1.2][In]',\n 'Shape Layer 1: Path 1 [1.1.3][In]'\n ];\nvar nullLayerNamesOut = [\n 'Shape Layer 1: Path 1 [1.1.0][Out]',\n 'Shape Layer 1: Path 1 [1.1.1][Out]',\n 'Shape Layer 1: Path 1 [1.1.2][Out]',\n 'Shape Layer 1: Path 1 [1.1.3][Out]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nvar getNullLayersIn = [];\nvar getNullLayersOut = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n getNullLayersIn.push(effect(nullLayerNamesIn[i])('ADBE Layer Control-0001'));\n getNullLayersOut.push(effect(nullLayerNamesOut[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n origInTang[i] = $bm_sub(fromCompToSurface(getNullLayersIn[i].toComp(getNullLayersIn[i].anchorPoint)), origPoints[i]);\n origOutTang[i] = $bm_sub(fromCompToSurface(getNullLayersOut[i].toComp(getNullLayersOut[i].anchorPoint)), origPoints[i]);\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.4,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 17","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[38,-62.5],[1,12],[-13.5,32],[-3,-2]],"o":[[-38,62.5],[-6.5,15.5],[13.5,-32],[3,2]],"v":[[340.5,-129.5],[305,-123.5],[284,-114.5],[311,-130]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [2.1.0]',\n 'Shape Layer 1: Path 1 [2.1.1]',\n 'Shape Layer 1: Path 1 [2.1.2]',\n 'Shape Layer 1: Path 1 [2.1.3]'\n ];\nvar nullLayerNamesIn = [\n 'Shape Layer 1: Path 1 [2.1.0][In]',\n 'Shape Layer 1: Path 1 [2.1.1][In]',\n 'Shape Layer 1: Path 1 [2.1.2][In]',\n 'Shape Layer 1: Path 1 [2.1.3][In]'\n ];\nvar nullLayerNamesOut = [\n 'Shape Layer 1: Path 1 [2.1.0][Out]',\n 'Shape Layer 1: Path 1 [2.1.1][Out]',\n 'Shape Layer 1: Path 1 [2.1.2][Out]',\n 'Shape Layer 1: Path 1 [2.1.3][Out]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nvar getNullLayersIn = [];\nvar getNullLayersOut = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n getNullLayersIn.push(effect(nullLayerNamesIn[i])('ADBE Layer Control-0001'));\n getNullLayersOut.push(effect(nullLayerNamesOut[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n origInTang[i] = $bm_sub(fromCompToSurface(getNullLayersIn[i].toComp(getNullLayersIn[i].anchorPoint)), origPoints[i]);\n origOutTang[i] = $bm_sub(fromCompToSurface(getNullLayersOut[i].toComp(getNullLayersOut[i].anchorPoint)), origPoints[i]);\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.4,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 16","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-3,-4]],"o":[[3,4]],"v":[[309.5,-129.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.4,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 15","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[6,1],[-10.5,-14.5],[-7.5,43.5],[0,-11]],"o":[[0,0],[-2,-32.5],[10.5,14.5],[7.5,-43.5],[0,11]],"v":[[265,-48],[257,-37],[295.5,-199.5],[239,-94],[264.5,-120.5]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [4.1.0]',\n 'Shape Layer 1: Path 1 [4.1.1]',\n 'Shape Layer 1: Path 1 [4.1.2]',\n 'Shape Layer 1: Path 1 [4.1.3]',\n 'Shape Layer 1: Path 1 [4.1.4]'\n ];\nvar nullLayerNamesIn = [\n 'Shape Layer 1: Path 1 [4.1.0][In]',\n 'Shape Layer 1: Path 1 [4.1.1][In]',\n 'Shape Layer 1: Path 1 [4.1.2][In]',\n 'Shape Layer 1: Path 1 [4.1.3][In]',\n 'Shape Layer 1: Path 1 [4.1.4][In]'\n ];\nvar nullLayerNamesOut = [\n 'Shape Layer 1: Path 1 [4.1.0][Out]',\n 'Shape Layer 1: Path 1 [4.1.1][Out]',\n 'Shape Layer 1: Path 1 [4.1.2][Out]',\n 'Shape Layer 1: Path 1 [4.1.3][Out]',\n 'Shape Layer 1: Path 1 [4.1.4][Out]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nvar getNullLayersIn = [];\nvar getNullLayersOut = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n getNullLayersIn.push(effect(nullLayerNamesIn[i])('ADBE Layer Control-0001'));\n getNullLayersOut.push(effect(nullLayerNamesOut[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n origInTang[i] = $bm_sub(fromCompToSurface(getNullLayersIn[i].toComp(getNullLayersIn[i].anchorPoint)), origPoints[i]);\n origOutTang[i] = $bm_sub(fromCompToSurface(getNullLayersOut[i].toComp(getNullLayersOut[i].anchorPoint)), origPoints[i]);\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.4,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 14","np":3,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[40,-57.5],[3.5,10],[13,-37],[-8,0],[0,0]],"o":[[-40,57.5],[-3.5,-10],[5.5,-57.5],[8,0],[0,0]],"v":[[243.5,-116.5],[211,-104.5],[181.5,-55],[223.5,-207.5],[199,-145.5]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [5.1.0]',\n 'Shape Layer 1: Path 1 [5.1.1]',\n 'Shape Layer 1: Path 1 [5.1.2]',\n 'Shape Layer 1: Path 1 [5.1.3]',\n 'Shape Layer 1: Path 1 [5.1.4]'\n ];\nvar nullLayerNamesIn = [\n 'Shape Layer 1: Path 1 [5.1.0][In]',\n 'Shape Layer 1: Path 1 [5.1.1][In]',\n 'Shape Layer 1: Path 1 [5.1.2][In]',\n 'Shape Layer 1: Path 1 [5.1.3][In]',\n 'Shape Layer 1: Path 1 [5.1.4][In]'\n ];\nvar nullLayerNamesOut = [\n 'Shape Layer 1: Path 1 [5.1.0][Out]',\n 'Shape Layer 1: Path 1 [5.1.1][Out]',\n 'Shape Layer 1: Path 1 [5.1.2][Out]',\n 'Shape Layer 1: Path 1 [5.1.3][Out]',\n 'Shape Layer 1: Path 1 [5.1.4][Out]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nvar getNullLayersIn = [];\nvar getNullLayersOut = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n getNullLayersIn.push(effect(nullLayerNamesIn[i])('ADBE Layer Control-0001'));\n getNullLayersOut.push(effect(nullLayerNamesOut[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n origInTang[i] = $bm_sub(fromCompToSurface(getNullLayersIn[i].toComp(getNullLayersIn[i].anchorPoint)), origPoints[i]);\n origOutTang[i] = $bm_sub(fromCompToSurface(getNullLayersOut[i].toComp(getNullLayersOut[i].anchorPoint)), origPoints[i]);\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.4,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 13","np":3,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,4.5],[0,0]],"o":[[0,-4.5],[0,0]],"v":[[272,-165],[133,-153]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [6.1.0]',\n 'Shape Layer 1: Path 1 [6.1.1]'\n ];\nvar nullLayerNamesIn = [\n 'Shape Layer 1: Path 1 [6.1.0][In]',\n 'Shape Layer 1: Path 1 [6.1.1][In]'\n ];\nvar nullLayerNamesOut = [\n 'Shape Layer 1: Path 1 [6.1.0][Out]',\n 'Shape Layer 1: Path 1 [6.1.1][Out]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nvar getNullLayersIn = [];\nvar getNullLayersOut = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n getNullLayersIn.push(effect(nullLayerNamesIn[i])('ADBE Layer Control-0001'));\n getNullLayersOut.push(effect(nullLayerNamesOut[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n origInTang[i] = $bm_sub(fromCompToSurface(getNullLayersIn[i].toComp(getNullLayersIn[i].anchorPoint)), origPoints[i]);\n origOutTang[i] = $bm_sub(fromCompToSurface(getNullLayersOut[i].toComp(getNullLayersOut[i].anchorPoint)), origPoints[i]);\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.4,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 12","np":3,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[7,-4.5],[-5,20]],"o":[[0,0],[-7,4.5],[5,-20]],"v":[[163,-17.5],[153.5,-6.5],[191,-192]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [7.1.0]',\n 'Shape Layer 1: Path 1 [7.1.1]',\n 'Shape Layer 1: Path 1 [7.1.2]'\n ];\nvar nullLayerNamesIn = [\n 'Shape Layer 1: Path 1 [7.1.0][In]',\n 'Shape Layer 1: Path 1 [7.1.1][In]',\n 'Shape Layer 1: Path 1 [7.1.2][In]'\n ];\nvar nullLayerNamesOut = [\n 'Shape Layer 1: Path 1 [7.1.0][Out]',\n 'Shape Layer 1: Path 1 [7.1.1][Out]',\n 'Shape Layer 1: Path 1 [7.1.2][Out]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nvar getNullLayersIn = [];\nvar getNullLayersOut = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n getNullLayersIn.push(effect(nullLayerNamesIn[i])('ADBE Layer Control-0001'));\n getNullLayersOut.push(effect(nullLayerNamesOut[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n origInTang[i] = $bm_sub(fromCompToSurface(getNullLayersIn[i].toComp(getNullLayersIn[i].anchorPoint)), origPoints[i]);\n origOutTang[i] = $bm_sub(fromCompToSurface(getNullLayersOut[i].toComp(getNullLayersOut[i].anchorPoint)), origPoints[i]);\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.4,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 11","np":3,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[14,-9.5],[-2,8],[-15.5,20],[35,-42],[-6,16.5]],"o":[[0,0],[-14,9.5],[-18.5,13.5],[15.5,-20],[-35,42],[6,-16.5]],"v":[[172,-115.5],[134,-62.5],[141.5,-114.5],[118.5,-127],[111,-95.5],[86,-105.5]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [8.1.0]',\n 'Shape Layer 1: Path 1 [8.1.1]',\n 'Shape Layer 1: Path 1 [8.1.2]',\n 'Shape Layer 1: Path 1 [8.1.3]',\n 'Shape Layer 1: Path 1 [8.1.4]',\n 'Shape Layer 1: Path 1 [8.1.5]'\n ];\nvar nullLayerNamesIn = [\n 'Shape Layer 1: Path 1 [8.1.0][In]',\n 'Shape Layer 1: Path 1 [8.1.1][In]',\n 'Shape Layer 1: Path 1 [8.1.2][In]',\n 'Shape Layer 1: Path 1 [8.1.3][In]',\n 'Shape Layer 1: Path 1 [8.1.4][In]',\n 'Shape Layer 1: Path 1 [8.1.5][In]'\n ];\nvar nullLayerNamesOut = [\n 'Shape Layer 1: Path 1 [8.1.0][Out]',\n 'Shape Layer 1: Path 1 [8.1.1][Out]',\n 'Shape Layer 1: Path 1 [8.1.2][Out]',\n 'Shape Layer 1: Path 1 [8.1.3][Out]',\n 'Shape Layer 1: Path 1 [8.1.4][Out]',\n 'Shape Layer 1: Path 1 [8.1.5][Out]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nvar getNullLayersIn = [];\nvar getNullLayersOut = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n getNullLayersIn.push(effect(nullLayerNamesIn[i])('ADBE Layer Control-0001'));\n getNullLayersOut.push(effect(nullLayerNamesOut[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n origInTang[i] = $bm_sub(fromCompToSurface(getNullLayersIn[i].toComp(getNullLayersIn[i].anchorPoint)), origPoints[i]);\n origOutTang[i] = $bm_sub(fromCompToSurface(getNullLayersOut[i].toComp(getNullLayersOut[i].anchorPoint)), origPoints[i]);\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.4,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 10","np":3,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[3.5,-2.5],[0,0]],"o":[[0,0],[-3.5,2.5],[0,0]],"v":[[-22,-7.5],[-31,4.5],[5,-203.5]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [9.1.0]',\n 'Shape Layer 1: Path 1 [9.1.1]',\n 'Shape Layer 1: Path 1 [9.1.2]'\n ];\nvar nullLayerNamesIn = [\n 'Shape Layer 1: Path 1 [9.1.0][In]',\n 'Shape Layer 1: Path 1 [9.1.1][In]',\n 'Shape Layer 1: Path 1 [9.1.2][In]'\n ];\nvar nullLayerNamesOut = [\n 'Shape Layer 1: Path 1 [9.1.0][Out]',\n 'Shape Layer 1: Path 1 [9.1.1][Out]',\n 'Shape Layer 1: Path 1 [9.1.2][Out]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nvar getNullLayersIn = [];\nvar getNullLayersOut = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n getNullLayersIn.push(effect(nullLayerNamesIn[i])('ADBE Layer Control-0001'));\n getNullLayersOut.push(effect(nullLayerNamesOut[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n origInTang[i] = $bm_sub(fromCompToSurface(getNullLayersIn[i].toComp(getNullLayersIn[i].anchorPoint)), origPoints[i]);\n origOutTang[i] = $bm_sub(fromCompToSurface(getNullLayersOut[i].toComp(getNullLayersOut[i].anchorPoint)), origPoints[i]);\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.4,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 9","np":3,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-129.5,39.5],[64.181,-31.033],[-24.445,17.232],[59,-3],[-2.5,-20.5]],"o":[[129.5,-39.5],[-45.5,22],[30.5,-21.5],[-59,3],[2.5,20.5]],"v":[[-15,-22],[6.5,-127],[16.5,-113.5],[23.5,-192.5],[-33.5,-132]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [10.1.0]',\n 'Shape Layer 1: Path 1 [10.1.1]',\n 'Shape Layer 1: Path 1 [10.1.2]',\n 'Shape Layer 1: Path 1 [10.1.3]',\n 'Shape Layer 1: Path 1 [10.1.4]'\n ];\nvar nullLayerNamesIn = [\n 'Shape Layer 1: Path 1 [10.1.0][In]',\n 'Shape Layer 1: Path 1 [10.1.1][In]',\n 'Shape Layer 1: Path 1 [10.1.2][In]',\n 'Shape Layer 1: Path 1 [10.1.3][In]',\n 'Shape Layer 1: Path 1 [10.1.4][In]'\n ];\nvar nullLayerNamesOut = [\n 'Shape Layer 1: Path 1 [10.1.0][Out]',\n 'Shape Layer 1: Path 1 [10.1.1][Out]',\n 'Shape Layer 1: Path 1 [10.1.2][Out]',\n 'Shape Layer 1: Path 1 [10.1.3][Out]',\n 'Shape Layer 1: Path 1 [10.1.4][Out]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nvar getNullLayersIn = [];\nvar getNullLayersOut = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n getNullLayersIn.push(effect(nullLayerNamesIn[i])('ADBE Layer Control-0001'));\n getNullLayersOut.push(effect(nullLayerNamesOut[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n origInTang[i] = $bm_sub(fromCompToSurface(getNullLayersIn[i].toComp(getNullLayersIn[i].anchorPoint)), origPoints[i]);\n origOutTang[i] = $bm_sub(fromCompToSurface(getNullLayersOut[i].toComp(getNullLayersOut[i].anchorPoint)), origPoints[i]);\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.4,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 8","np":3,"cix":2,"bm":0,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[90.5,-65],[-22,-1.5],[-3,17],[-3.5,11.5]],"o":[[-90.5,65],[22,1.5],[-34,51.5],[3.5,-11.5]],"v":[[-82,-91],[-160,55],[-116.5,-93],[-138,-96]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [11.1.0]',\n 'Shape Layer 1: Path 1 [11.1.1]',\n 'Shape Layer 1: Path 1 [11.1.2]',\n 'Shape Layer 1: Path 1 [11.1.3]'\n ];\nvar nullLayerNamesIn = [\n 'Shape Layer 1: Path 1 [11.1.0][In]',\n 'Shape Layer 1: Path 1 [11.1.1][In]',\n 'Shape Layer 1: Path 1 [11.1.2][In]',\n 'Shape Layer 1: Path 1 [11.1.3][In]'\n ];\nvar nullLayerNamesOut = [\n 'Shape Layer 1: Path 1 [11.1.0][Out]',\n 'Shape Layer 1: Path 1 [11.1.1][Out]',\n 'Shape Layer 1: Path 1 [11.1.2][Out]',\n 'Shape Layer 1: Path 1 [11.1.3][Out]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nvar getNullLayersIn = [];\nvar getNullLayersOut = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n getNullLayersIn.push(effect(nullLayerNamesIn[i])('ADBE Layer Control-0001'));\n getNullLayersOut.push(effect(nullLayerNamesOut[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n origInTang[i] = $bm_sub(fromCompToSurface(getNullLayersIn[i].toComp(getNullLayersIn[i].anchorPoint)), origPoints[i]);\n origOutTang[i] = $bm_sub(fromCompToSurface(getNullLayersOut[i].toComp(getNullLayersOut[i].anchorPoint)), origPoints[i]);\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.4,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 7","np":3,"cix":2,"bm":0,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-20,3],[22,4],[0,0],[0,0]],"o":[[20,-3],[-22,-4],[0,0],[0,0]],"v":[[-235.5,-50.5],[-202.5,-96.5],[-244.5,42],[-219,-109.5]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [13.1.0]',\n 'Shape Layer 1: Path 1 [13.1.1]',\n 'Shape Layer 1: Path 1 [13.1.2]',\n 'Shape Layer 1: Path 1 [13.1.3]'\n ];\nvar nullLayerNamesIn = [\n 'Shape Layer 1: Path 1 [13.1.0][In]',\n 'Shape Layer 1: Path 1 [13.1.1][In]',\n 'Shape Layer 1: Path 1 [13.1.2][In]',\n 'Shape Layer 1: Path 1 [13.1.3][In]'\n ];\nvar nullLayerNamesOut = [\n 'Shape Layer 1: Path 1 [13.1.0][Out]',\n 'Shape Layer 1: Path 1 [13.1.1][Out]',\n 'Shape Layer 1: Path 1 [13.1.2][Out]',\n 'Shape Layer 1: Path 1 [13.1.3][Out]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nvar getNullLayersIn = [];\nvar getNullLayersOut = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n getNullLayersIn.push(effect(nullLayerNamesIn[i])('ADBE Layer Control-0001'));\n getNullLayersOut.push(effect(nullLayerNamesOut[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n origInTang[i] = $bm_sub(fromCompToSurface(getNullLayersIn[i].toComp(getNullLayersIn[i].anchorPoint)), origPoints[i]);\n origOutTang[i] = $bm_sub(fromCompToSurface(getNullLayersOut[i].toComp(getNullLayersOut[i].anchorPoint)), origPoints[i]);\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.4,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[40,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 6","np":3,"cix":2,"bm":0,"ix":12,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-20,3],[22,4],[0,0],[0,0]],"o":[[20,-3],[-22,-4],[0,0],[0,0]],"v":[[-235.5,-50.5],[-202.5,-96.5],[-244.5,42],[-219,-109.5]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [13.1.0]',\n 'Shape Layer 1: Path 1 [13.1.1]',\n 'Shape Layer 1: Path 1 [13.1.2]',\n 'Shape Layer 1: Path 1 [13.1.3]'\n ];\nvar nullLayerNamesIn = [\n 'Shape Layer 1: Path 1 [13.1.0][In]',\n 'Shape Layer 1: Path 1 [13.1.1][In]',\n 'Shape Layer 1: Path 1 [13.1.2][In]',\n 'Shape Layer 1: Path 1 [13.1.3][In]'\n ];\nvar nullLayerNamesOut = [\n 'Shape Layer 1: Path 1 [13.1.0][Out]',\n 'Shape Layer 1: Path 1 [13.1.1][Out]',\n 'Shape Layer 1: Path 1 [13.1.2][Out]',\n 'Shape Layer 1: Path 1 [13.1.3][Out]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nvar getNullLayersIn = [];\nvar getNullLayersOut = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n getNullLayersIn.push(effect(nullLayerNamesIn[i])('ADBE Layer Control-0001'));\n getNullLayersOut.push(effect(nullLayerNamesOut[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n origInTang[i] = $bm_sub(fromCompToSurface(getNullLayersIn[i].toComp(getNullLayersIn[i].anchorPoint)), origPoints[i]);\n origOutTang[i] = $bm_sub(fromCompToSurface(getNullLayersOut[i].toComp(getNullLayersOut[i].anchorPoint)), origPoints[i]);\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.4,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 5","np":3,"cix":2,"bm":0,"ix":13,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[38,-62.5],[1,12],[-13.5,32],[-3,-2]],"o":[[-38,62.5],[-6.5,15.5],[13.5,-32],[3,2]],"v":[[-221.5,-80.5],[-257,-74.5],[-278,-65.5],[-251,-81]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [14.1.0]',\n 'Shape Layer 1: Path 1 [14.1.1]',\n 'Shape Layer 1: Path 1 [14.1.2]',\n 'Shape Layer 1: Path 1 [14.1.3]'\n ];\nvar nullLayerNamesIn = [\n 'Shape Layer 1: Path 1 [14.1.0][In]',\n 'Shape Layer 1: Path 1 [14.1.1][In]',\n 'Shape Layer 1: Path 1 [14.1.2][In]',\n 'Shape Layer 1: Path 1 [14.1.3][In]'\n ];\nvar nullLayerNamesOut = [\n 'Shape Layer 1: Path 1 [14.1.0][Out]',\n 'Shape Layer 1: Path 1 [14.1.1][Out]',\n 'Shape Layer 1: Path 1 [14.1.2][Out]',\n 'Shape Layer 1: Path 1 [14.1.3][Out]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nvar getNullLayersIn = [];\nvar getNullLayersOut = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n getNullLayersIn.push(effect(nullLayerNamesIn[i])('ADBE Layer Control-0001'));\n getNullLayersOut.push(effect(nullLayerNamesOut[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n origInTang[i] = $bm_sub(fromCompToSurface(getNullLayersIn[i].toComp(getNullLayersIn[i].anchorPoint)), origPoints[i]);\n origOutTang[i] = $bm_sub(fromCompToSurface(getNullLayersOut[i].toComp(getNullLayersOut[i].anchorPoint)), origPoints[i]);\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.4,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 4","np":3,"cix":2,"bm":0,"ix":14,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-324.5,-6],[-292,-169]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [15.1.0]',\n 'Shape Layer 1: Path 1 [15.1.1]'\n ];\nvar nullLayerNamesIn = [\n 'Shape Layer 1: Path 1 [15.1.0][In]',\n 'Shape Layer 1: Path 1 [15.1.1][In]'\n ];\nvar nullLayerNamesOut = [\n 'Shape Layer 1: Path 1 [15.1.0][Out]',\n 'Shape Layer 1: Path 1 [15.1.1][Out]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nvar getNullLayersIn = [];\nvar getNullLayersOut = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n getNullLayersIn.push(effect(nullLayerNamesIn[i])('ADBE Layer Control-0001'));\n getNullLayersOut.push(effect(nullLayerNamesOut[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n origInTang[i] = $bm_sub(fromCompToSurface(getNullLayersIn[i].toComp(getNullLayersIn[i].anchorPoint)), origPoints[i]);\n origOutTang[i] = $bm_sub(fromCompToSurface(getNullLayersOut[i].toComp(getNullLayersOut[i].anchorPoint)), origPoints[i]);\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.4,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 3","np":3,"cix":2,"bm":0,"ix":15,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[29.5,-13],[-3,-3]],"o":[[0,0],[-29.5,13],[3,3]],"v":[[-274.5,-95],[-417,-38.5],[-431,-23.5]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [16.1.0]',\n 'Shape Layer 1: Path 1 [16.1.1]',\n 'Shape Layer 1: Path 1 [16.1.2]'\n ];\nvar nullLayerNamesIn = [\n 'Shape Layer 1: Path 1 [16.1.0][In]',\n 'Shape Layer 1: Path 1 [16.1.1][In]',\n 'Shape Layer 1: Path 1 [16.1.2][In]'\n ];\nvar nullLayerNamesOut = [\n 'Shape Layer 1: Path 1 [16.1.0][Out]',\n 'Shape Layer 1: Path 1 [16.1.1][Out]',\n 'Shape Layer 1: Path 1 [16.1.2][Out]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nvar getNullLayersIn = [];\nvar getNullLayersOut = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n getNullLayersIn.push(effect(nullLayerNamesIn[i])('ADBE Layer Control-0001'));\n getNullLayersOut.push(effect(nullLayerNamesOut[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n origInTang[i] = $bm_sub(fromCompToSurface(getNullLayersIn[i].toComp(getNullLayersIn[i].anchorPoint)), origPoints[i]);\n origOutTang[i] = $bm_sub(fromCompToSurface(getNullLayersOut[i].toComp(getNullLayersOut[i].anchorPoint)), origPoints[i]);\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.4,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 2","np":3,"cix":2,"bm":0,"ix":16,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[8,-4.5],[0,5],[16.5,-26.5],[0,0]],"o":[[-8,4.5],[0,-5],[-16.5,26.5],[0,0]],"v":[[-383.5,39.5],[-352,-149.5],[-381.5,-118],[-375,-91]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [17.1.0]',\n 'Shape Layer 1: Path 1 [17.1.1]',\n 'Shape Layer 1: Path 1 [17.1.2]',\n 'Shape Layer 1: Path 1 [17.1.3]'\n ];\nvar nullLayerNamesIn = [\n 'Shape Layer 1: Path 1 [17.1.0][In]',\n 'Shape Layer 1: Path 1 [17.1.1][In]',\n 'Shape Layer 1: Path 1 [17.1.2][In]',\n 'Shape Layer 1: Path 1 [17.1.3][In]'\n ];\nvar nullLayerNamesOut = [\n 'Shape Layer 1: Path 1 [17.1.0][Out]',\n 'Shape Layer 1: Path 1 [17.1.1][Out]',\n 'Shape Layer 1: Path 1 [17.1.2][Out]',\n 'Shape Layer 1: Path 1 [17.1.3][Out]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nvar getNullLayersIn = [];\nvar getNullLayersOut = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n getNullLayersIn.push(effect(nullLayerNamesIn[i])('ADBE Layer Control-0001'));\n getNullLayersOut.push(effect(nullLayerNamesOut[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n origInTang[i] = $bm_sub(fromCompToSurface(getNullLayersIn[i].toComp(getNullLayersIn[i].anchorPoint)), origPoints[i]);\n origOutTang[i] = $bm_sub(fromCompToSurface(getNullLayersOut[i].toComp(getNullLayersOut[i].anchorPoint)), origPoints[i]);\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.4,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":17,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":100,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":4,"s":[100]},{"t":98.9999914312506,"s":[0]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":2,"ix":18,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":134.999988315342,"st":-43.9999961916669,"bm":0},{"ddd":0,"ind":37,"ty":3,"nm":"Shape Layer 1: Path 1 [4.1.1]","cl":"1 1","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":73,"s":[774,294.5,0],"to":[0.833,-2.5,0],"ti":[-0.833,2.5,0]},{"t":80.999992989205,"s":[779,279.5,0]}],"ix":2,"x":"var $bm_rt;\nvar amp, freq, decay, n, n, t, t, v;\ntry {\n amp = $bm_div(effect('Elastic: Position')(1), 200);\n freq = $bm_div(effect('Elastic: Position')(2), 30);\n decay = $bm_div(effect('Elastic: Position')(3), 10);\n $bm_rt = n = 0;\n if (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n if (n == 0) {\n $bm_rt = t = 0;\n } else {\n $bm_rt = t = $bm_sub(time, key(n).time);\n }\n if (n > 0) {\n v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10)));\n $bm_rt = $bm_sum(value, $bm_div($bm_mul($bm_mul(v, amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))));\n } else {\n $bm_rt = value;\n }\n} catch (e$$4) {\n $bm_rt = value = value;\n}"},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Elastic: Position","np":5,"mn":"Pseudo/MDS Elastic Controller","ix":1,"en":1,"ef":[{"ty":0,"nm":"Amplitude","mn":"Pseudo/MDS Elastic Controller-0001","ix":1,"v":{"a":0,"k":20,"ix":1}},{"ty":0,"nm":"Frequency","mn":"Pseudo/MDS Elastic Controller-0002","ix":2,"v":{"a":0,"k":40,"ix":2}},{"ty":0,"nm":"Decay","mn":"Pseudo/MDS Elastic Controller-0003","ix":3,"v":{"a":0,"k":60,"ix":3}}]}],"ip":0,"op":134.999988315342,"st":-43.9999961916669,"bm":0},{"ddd":0,"ind":38,"ty":3,"nm":"Shape Layer 1: Path 1 [4.1.1][Out]","cl":"1 1","parent":37,"sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-7.5,43.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[50,50,100],"ix":6}},"ao":0,"ip":0,"op":134.999988315342,"st":-43.9999961916669,"bm":0},{"ddd":0,"ind":39,"ty":3,"nm":"Shape Layer 1: Path 1 [4.1.1][In]","cl":"1 1","parent":37,"sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[7.5,-43.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[50,50,100],"ix":6}},"ao":0,"ip":0,"op":134.999988315342,"st":-43.9999961916669,"bm":0},{"ddd":0,"ind":40,"ty":3,"nm":"Shape Layer 1: Path 1 [4.1.0]","cl":"1 0","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":72,"s":[814.5,262,0],"to":[-1.667,-1.5,0],"ti":[1.667,1.5,0]},{"t":79.999993075758,"s":[804.5,253,0]}],"ix":2,"x":"var $bm_rt;\nvar amp, freq, decay, n, n, t, t, v;\ntry {\n amp = $bm_div(effect('Elastic: Position')(1), 200);\n freq = $bm_div(effect('Elastic: Position')(2), 30);\n decay = $bm_div(effect('Elastic: Position')(3), 10);\n $bm_rt = n = 0;\n if (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n if (n == 0) {\n $bm_rt = t = 0;\n } else {\n $bm_rt = t = $bm_sub(time, key(n).time);\n }\n if (n > 0) {\n v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10)));\n $bm_rt = $bm_sum(value, $bm_div($bm_mul($bm_mul(v, amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))));\n } else {\n $bm_rt = value;\n }\n} catch (e$$4) {\n $bm_rt = value = value;\n}"},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Elastic: Position","np":5,"mn":"Pseudo/MDS Elastic Controller","ix":1,"en":1,"ef":[{"ty":0,"nm":"Amplitude","mn":"Pseudo/MDS Elastic Controller-0001","ix":1,"v":{"a":0,"k":20,"ix":1}},{"ty":0,"nm":"Frequency","mn":"Pseudo/MDS Elastic Controller-0002","ix":2,"v":{"a":0,"k":40,"ix":2}},{"ty":0,"nm":"Decay","mn":"Pseudo/MDS Elastic Controller-0003","ix":3,"v":{"a":0,"k":60,"ix":3}}]}],"ip":0,"op":134.999988315342,"st":-43.9999961916669,"bm":0},{"ddd":0,"ind":41,"ty":3,"nm":"Shape Layer 1: Path 1 [4.1.0][Out]","cl":"1 0","parent":40,"sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,-11,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[50,50,100],"ix":6}},"ao":0,"ip":0,"op":134.999988315342,"st":-43.9999961916669,"bm":0},{"ddd":0,"ind":42,"ty":3,"nm":"Shape Layer 1: Path 1 [4.1.0][In]","cl":"1 0","parent":40,"sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,11,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[50,50,100],"ix":6}},"ao":0,"ip":0,"op":134.999988315342,"st":-43.9999961916669,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/src/main/resources/static/assets/mobile/lottie/birthday/lihua.json b/src/main/resources/static/assets/mobile/lottie/birthday/lihua.json new file mode 100644 index 00000000..b4e1e23c --- /dev/null +++ b/src/main/resources/static/assets/mobile/lottie/birthday/lihua.json @@ -0,0 +1 @@ +{"v":"5.5.7","meta":{"g":"LottieFiles AE 0.1.20","a":"","k":"","d":"","tc":""},"fr":25,"ip":0,"op":126,"w":1920,"h":1080,"nm":"ConfettiAnimation","ddd":1,"assets":[{"id":"comp_0","layers":[{"ddd":1,"ind":1,"ty":4,"nm":"Shape Layer 16","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"rx":{"a":0,"k":0,"ix":8,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 500);"},"ry":{"a":0,"k":0,"ix":9,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 300);"},"rz":{"a":0,"k":0,"ix":10,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 100);"},"or":{"a":0,"k":[0,0,0],"ix":7},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":29,"s":[1664,-23,0],"to":[92,254.667,0],"ti":[168,-414.667,0]},{"t":104,"s":[1792,1185,0]}],"ix":2},"a":{"a":0,"k":[-248,-39,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-248,-52],[-247.885,-20.203]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.270588235294,0.909803981407,0.639215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":29,"op":105,"st":29,"bm":0},{"ddd":1,"ind":2,"ty":4,"nm":"Shape Layer 15","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"rx":{"a":0,"k":0,"ix":8,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 500);"},"ry":{"a":0,"k":0,"ix":9,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 300);"},"rz":{"a":0,"k":0,"ix":10,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 100);"},"or":{"a":0,"k":[0,0,0],"ix":7},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":12,"s":[1235,-59,0],"to":[96,526.667,0],"ti":[-104,-486.667,0]},{"t":87,"s":[1039,1237,0]}],"ix":2},"a":{"a":0,"k":[-248,-39,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-248,-52],[-247.885,-20.203]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.239215701234,0.419607873056,0.709803921569,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":12,"op":88,"st":12,"bm":0},{"ddd":1,"ind":3,"ty":4,"nm":"Shape Layer 14","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"rx":{"a":0,"k":0,"ix":8,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 500);"},"ry":{"a":0,"k":0,"ix":9,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 300);"},"rz":{"a":0,"k":0,"ix":10,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 100);"},"or":{"a":0,"k":[0,0,0],"ix":7},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":18,"s":[528,-59,0],"to":[288,686.667,0],"ti":[-180,-406.667,0]},{"t":93,"s":[708,1377,0]}],"ix":2},"a":{"a":0,"k":[-248,-39,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-248,-52],[-247.885,-20.203]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.270588235294,0.909803981407,0.639215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":18,"op":94,"st":18,"bm":0},{"ddd":1,"ind":4,"ty":4,"nm":"Shape Layer 13","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"rx":{"a":0,"k":0,"ix":8,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 500);"},"ry":{"a":0,"k":0,"ix":9,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 300);"},"rz":{"a":0,"k":0,"ix":10,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 100);"},"or":{"a":0,"k":[0,0,0],"ix":7},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":15,"s":[292,-147,0],"to":[-90,314.667,0],"ti":[194,-532.667,0]},{"t":90,"s":[292,1213,0]}],"ix":2},"a":{"a":0,"k":[-248,-39,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-248,-52],[-248,-26]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.098039223166,0.694117647059,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":91,"st":15,"bm":0},{"ddd":1,"ind":5,"ty":4,"nm":"Shape Layer 12","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"rx":{"a":0,"k":0,"ix":8,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 500);"},"ry":{"a":0,"k":0,"ix":9,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 300);"},"rz":{"a":0,"k":0,"ix":10,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 100);"},"or":{"a":0,"k":[0,0,0],"ix":7},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":28,"s":[1128,-59,0],"to":[180,310.667,0],"ti":[-112,-490.667,0]},{"t":103,"s":[1088,1137,0]}],"ix":2},"a":{"a":0,"k":[-248,-39,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-248,-52],[-247.885,-20.203]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.290196078431,0.952941236309,0.968627510819,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":28,"op":104,"st":28,"bm":0},{"ddd":1,"ind":6,"ty":4,"nm":"Shape Layer 11","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"rx":{"a":0,"k":0,"ix":8,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 500);"},"ry":{"a":0,"k":0,"ix":9,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 300);"},"rz":{"a":0,"k":0,"ix":10,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 100);"},"or":{"a":0,"k":[0,0,0],"ix":7},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":19,"s":[1455,-59,0],"to":[-184,406.667,0],"ti":[112,-438.667,0]},{"t":94,"s":[1459,1213,0]}],"ix":2},"a":{"a":0,"k":[-248,-39,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-248,-52],[-247.885,-20.203]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.705882352941,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":19,"op":95,"st":19,"bm":0},{"ddd":1,"ind":7,"ty":4,"nm":"Shape Layer 10","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"rx":{"a":0,"k":0,"ix":8,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 500);"},"ry":{"a":0,"k":0,"ix":9,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 300);"},"rz":{"a":0,"k":0,"ix":10,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 100);"},"or":{"a":0,"k":[0,0,0],"ix":7},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":24,"s":[728,-59,0],"to":[388,434.667,0],"ti":[-584,-762.667,0]},{"t":99,"s":[732,1413,0]}],"ix":2},"a":{"a":0,"k":[-248,-39,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-248,-52],[-247.885,-20.203]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.282352941176,0.282352941176,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":24,"op":100,"st":24,"bm":0},{"ddd":1,"ind":8,"ty":4,"nm":"Shape Layer 9","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"rx":{"a":0,"k":0,"ix":8,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 500);"},"ry":{"a":0,"k":0,"ix":9,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 300);"},"rz":{"a":0,"k":0,"ix":10,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 100);"},"or":{"a":0,"k":[0,0,0],"ix":7},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":19,"s":[232,-147,0],"to":[-200,554.667,0],"ti":[560,-378.667,0]},{"t":94,"s":[232,1213,0]}],"ix":2},"a":{"a":0,"k":[-248,-39,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-248,-52],[-248,-26]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.156862745098,0.215686289469,0.470588265213,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":19,"op":95,"st":19,"bm":0},{"ddd":1,"ind":9,"ty":4,"nm":"Shape Layer 8","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"rx":{"a":0,"k":0,"ix":8,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 500);"},"ry":{"a":0,"k":0,"ix":9,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 300);"},"rz":{"a":0,"k":0,"ix":10,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 100);"},"or":{"a":0,"k":[0,0,0],"ix":7},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":21,"s":[1664,-23,0],"to":[108,234.667,0],"ti":[-336,-306.667,0]},{"t":96,"s":[1772,1177,0]}],"ix":2},"a":{"a":0,"k":[-248,-39,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-248,-52],[-247.885,-20.203]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.490196108351,0.231372563979,0.752941236309,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":21,"op":97,"st":21,"bm":0},{"ddd":1,"ind":10,"ty":4,"nm":"Shape Layer 7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"rx":{"a":0,"k":0,"ix":8,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 500);"},"ry":{"a":0,"k":0,"ix":9,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 300);"},"rz":{"a":0,"k":0,"ix":10,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 100);"},"or":{"a":0,"k":[0,0,0],"ix":7},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":0,"s":[1235,-59,0],"to":[96,526.667,0],"ti":[-104,-486.667,0]},{"t":75,"s":[1039,1237,0]}],"ix":2},"a":{"a":0,"k":[-248,-39,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-248,-52],[-247.885,-20.203]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.239215701234,0.419607873056,0.709803921569,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":76,"st":0,"bm":0},{"ddd":1,"ind":11,"ty":4,"nm":"Shape Layer 6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"rx":{"a":0,"k":0,"ix":8,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 500);"},"ry":{"a":0,"k":0,"ix":9,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 300);"},"rz":{"a":0,"k":0,"ix":10,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 100);"},"or":{"a":0,"k":[0,0,0],"ix":7},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":6,"s":[528,-59,0],"to":[-208,742.667,0],"ti":[216,-566.667,0]},{"t":81,"s":[532,1413,0]}],"ix":2},"a":{"a":0,"k":[-248,-39,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-248,-52],[-247.885,-20.203]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.270588235294,0.909803981407,0.639215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":6,"op":82,"st":6,"bm":0},{"ddd":1,"ind":12,"ty":4,"nm":"Shape Layer 5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"rx":{"a":0,"k":0,"ix":8,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 500);"},"ry":{"a":0,"k":0,"ix":9,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 300);"},"rz":{"a":0,"k":0,"ix":10,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 100);"},"or":{"a":0,"k":[0,0,0],"ix":7},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":2,"s":[92,-147,0],"to":[-90,314.667,0],"ti":[194,-532.667,0]},{"t":77,"s":[92,1213,0]}],"ix":2},"a":{"a":0,"k":[-248,-39,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-248,-52],[-248,-26]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.098039223166,0.694117647059,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":2,"op":78,"st":2,"bm":0},{"ddd":1,"ind":13,"ty":4,"nm":"Shape Layer 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"rx":{"a":0,"k":0,"ix":8,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 500);"},"ry":{"a":0,"k":0,"ix":9,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 300);"},"rz":{"a":0,"k":0,"ix":10,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 100);"},"or":{"a":0,"k":[0,0,0],"ix":7},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":16,"s":[1128,-59,0],"to":[-208,358.667,0],"ti":[-112,-490.667,0]},{"t":91,"s":[1088,1137,0]}],"ix":2},"a":{"a":0,"k":[-248,-39,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-248,-52],[-247.885,-20.203]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.490196108351,0.231372563979,0.752941236309,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":16,"op":92,"st":16,"bm":0},{"ddd":1,"ind":14,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"rx":{"a":0,"k":0,"ix":8,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 500);"},"ry":{"a":0,"k":0,"ix":9,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 300);"},"rz":{"a":0,"k":0,"ix":10,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 100);"},"or":{"a":0,"k":[0,0,0],"ix":7},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":7,"s":[1455,-59,0],"to":[-184,406.667,0],"ti":[112,-438.667,0]},{"t":82,"s":[1459,1213,0]}],"ix":2},"a":{"a":0,"k":[-248,-39,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-248,-52],[-247.885,-20.203]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.705882352941,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":7,"op":83,"st":7,"bm":0},{"ddd":1,"ind":15,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"rx":{"a":0,"k":0,"ix":8,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 500);"},"ry":{"a":0,"k":0,"ix":9,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 300);"},"rz":{"a":0,"k":0,"ix":10,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 100);"},"or":{"a":0,"k":[0,0,0],"ix":7},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":13,"s":[728,-59,0],"to":[388,434.667,0],"ti":[-584,-762.667,0]},{"t":88,"s":[732,1413,0]}],"ix":2},"a":{"a":0,"k":[-248,-39,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-248,-52],[-247.885,-20.203]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.282352941176,0.282352941176,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":13,"op":89,"st":13,"bm":0},{"ddd":1,"ind":16,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"rx":{"a":0,"k":0,"ix":8,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 500);"},"ry":{"a":0,"k":0,"ix":9,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 300);"},"rz":{"a":0,"k":0,"ix":10,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 100);"},"or":{"a":0,"k":[0,0,0],"ix":7},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":9,"s":[232,-147,0],"to":[368,422.667,0],"ti":[20,-326.667,0]},{"t":84,"s":[232,1213,0]}],"ix":2},"a":{"a":0,"k":[-248,-39,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-248,-52],[-248,-26]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.156862745098,0.215686289469,0.470588265213,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":9,"op":85,"st":9,"bm":0}]},{"id":"comp_1","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"blueCircle03","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":32,"s":[1453,-59,0],"to":[-116,296,0],"ti":[168,-388,0]},{"t":93,"s":[1413,1213,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[45.849,45.849,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[30,30],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.098039223166,0.694117647059,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":32,"op":93,"st":32,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"redCircle04","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[1132,-305,0],"to":[244,436,0],"ti":[-304,-272,0]},{"t":101,"s":[1200,1211,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[48.744,48.744,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[30,30],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.282352941176,0.282352941176,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":35,"op":101,"st":35,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"yellowCircle03","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[600,-110,0],"to":[-200,428,0],"ti":[244,-308,0]},{"t":101,"s":[600,1210,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[68.326,68.326,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[30,30],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.705882352941,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":31,"op":101,"st":31,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"purpleCircle04","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":28,"s":[926,-55,0],"to":[184,256,0],"ti":[-344,-344,0]},{"t":78,"s":[1054,1253,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[48,48,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[30,30],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.490196078431,0.23137254902,0.752941176471,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":28,"op":79,"st":28,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"triangleComp01","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":27,"s":[1654,-58,0],"to":[-124,373.333,0],"ti":[168,-557.333,0]},{"t":99,"s":[1654,1222,0]}],"ix":2},"a":{"a":0,"k":[50,50,0],"ix":1},"s":{"a":0,"k":[60,60,100],"ix":6}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"mn":"ADBE Fill","ix":1,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","mn":"ADBE Fill-0001","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":7,"nm":"All Masks","mn":"ADBE Fill-0007","ix":2,"v":{"a":0,"k":0,"ix":2}},{"ty":2,"nm":"Color","mn":"ADBE Fill-0002","ix":3,"v":{"a":0,"k":[1,0.705882370472,0,1],"ix":3}},{"ty":7,"nm":"Invert","mn":"ADBE Fill-0006","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Horizontal Feather","mn":"ADBE Fill-0003","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":0,"nm":"Vertical Feather","mn":"ADBE Fill-0004","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Opacity","mn":"ADBE Fill-0005","ix":7,"v":{"a":0,"k":1,"ix":7}}]}],"w":100,"h":100,"ip":27,"op":115,"st":27,"bm":0},{"ddd":0,"ind":6,"ty":0,"nm":"triangleComp01","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":23,"s":[1414,-58,0],"to":[248,409.333,0],"ti":[-236,-493.333,0]},{"t":100,"s":[1414,1222,0]}],"ix":2},"a":{"a":0,"k":[50,50,0],"ix":1},"s":{"a":0,"k":[60,60,100],"ix":6}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"mn":"ADBE Fill","ix":1,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","mn":"ADBE Fill-0001","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":7,"nm":"All Masks","mn":"ADBE Fill-0007","ix":2,"v":{"a":0,"k":0,"ix":2}},{"ty":2,"nm":"Color","mn":"ADBE Fill-0002","ix":3,"v":{"a":0,"k":[0.490196108818,0.231372565031,0.752941250801,1],"ix":3}},{"ty":7,"nm":"Invert","mn":"ADBE Fill-0006","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Horizontal Feather","mn":"ADBE Fill-0003","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":0,"nm":"Vertical Feather","mn":"ADBE Fill-0004","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Opacity","mn":"ADBE Fill-0005","ix":7,"v":{"a":0,"k":1,"ix":7}}]}],"w":100,"h":100,"ip":23,"op":111,"st":23,"bm":0},{"ddd":0,"ind":7,"ty":0,"nm":"triangleComp01","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[1924,1216,0],"to":[0,0,0],"ti":[396,250.667,0]},{"t":18,"s":[1416,-248,0]}],"ix":2},"a":{"a":0,"k":[50,50,0],"ix":1},"s":{"a":0,"k":[90.321,90.321,100],"ix":6}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"mn":"ADBE Fill","ix":1,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","mn":"ADBE Fill-0001","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":7,"nm":"All Masks","mn":"ADBE Fill-0007","ix":2,"v":{"a":0,"k":0,"ix":2}},{"ty":2,"nm":"Color","mn":"ADBE Fill-0002","ix":3,"v":{"a":0,"k":[0.098039224744,0.694117665291,1,1],"ix":3}},{"ty":7,"nm":"Invert","mn":"ADBE Fill-0006","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Horizontal Feather","mn":"ADBE Fill-0003","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":0,"nm":"Vertical Feather","mn":"ADBE Fill-0004","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Opacity","mn":"ADBE Fill-0005","ix":7,"v":{"a":0,"k":1,"ix":7}}]}],"w":100,"h":100,"ip":8,"op":19,"st":8,"bm":0},{"ddd":0,"ind":8,"ty":0,"nm":"triangleComp01","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.17,"y":0.772},"o":{"x":0.167,"y":0.167},"t":26,"s":[1930,1130,0],"to":[-52.667,-198,0],"ti":[122.667,-28.333,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.72,"y":0.278},"t":51,"s":[1496,196,0],"to":[-122.667,28.333,0],"ti":[29.333,-462.667,0]},{"t":90,"s":[1194,1300,0]}],"ix":2},"a":{"a":0,"k":[50,50,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,1.111]},"t":26,"s":[30,30,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.695,0.695,0.333],"y":[0,0,0]},"t":51,"s":[50,50,100]},{"t":101,"s":[15,15,100]}],"ix":6}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"mn":"ADBE Fill","ix":1,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","mn":"ADBE Fill-0001","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":7,"nm":"All Masks","mn":"ADBE Fill-0007","ix":2,"v":{"a":0,"k":0,"ix":2}},{"ty":2,"nm":"Color","mn":"ADBE Fill-0002","ix":3,"v":{"a":0,"k":[0.098039224744,0.694117665291,1,1],"ix":3}},{"ty":7,"nm":"Invert","mn":"ADBE Fill-0006","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Horizontal Feather","mn":"ADBE Fill-0003","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":0,"nm":"Vertical Feather","mn":"ADBE Fill-0004","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Opacity","mn":"ADBE Fill-0005","ix":7,"v":{"a":0,"k":1,"ix":7}}]}],"w":100,"h":100,"ip":26,"op":101,"st":26,"bm":0},{"ddd":0,"ind":9,"ty":0,"nm":"triangleComp01","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.17,"y":0.801},"o":{"x":0.167,"y":0.167},"t":12,"s":[1940,1124,0],"to":[-108.333,-166,0],"ti":[149.333,-4,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.72,"y":0.297},"t":37,"s":[1290,128,0],"to":[-149.333,4,0],"ti":[-48.667,-412.667,0]},{"t":76,"s":[1044,1148,0]}],"ix":2},"a":{"a":0,"k":[50,50,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,-10]},"t":12,"s":[80,80,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.695,0.695,0.333],"y":[0,0,0]},"t":37,"s":[100,100,100]},{"t":87,"s":[50,50,100]}],"ix":6}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"mn":"ADBE Fill","ix":1,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","mn":"ADBE Fill-0001","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":7,"nm":"All Masks","mn":"ADBE Fill-0007","ix":2,"v":{"a":0,"k":0,"ix":2}},{"ty":2,"nm":"Color","mn":"ADBE Fill-0002","ix":3,"v":{"a":0,"k":[1,0.705882370472,0,1],"ix":3}},{"ty":7,"nm":"Invert","mn":"ADBE Fill-0006","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Horizontal Feather","mn":"ADBE Fill-0003","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":0,"nm":"Vertical Feather","mn":"ADBE Fill-0004","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Opacity","mn":"ADBE Fill-0005","ix":7,"v":{"a":0,"k":1,"ix":7}}]}],"w":100,"h":100,"ip":12,"op":88,"st":12,"bm":0},{"ddd":0,"ind":10,"ty":0,"nm":"triangleComp01","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[2004,1152,0],"to":[0,0,0],"ti":[98.667,749.333,0]},{"t":10,"s":[1060,-120,0]}],"ix":2},"a":{"a":0,"k":[50,50,0],"ix":1},"s":{"a":0,"k":[80,80,100],"ix":6}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"mn":"ADBE Fill","ix":1,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","mn":"ADBE Fill-0001","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":7,"nm":"All Masks","mn":"ADBE Fill-0007","ix":2,"v":{"a":0,"k":0,"ix":2}},{"ty":2,"nm":"Color","mn":"ADBE Fill-0002","ix":3,"v":{"a":0,"k":[0.098039224744,0.694117665291,1,1],"ix":3}},{"ty":7,"nm":"Invert","mn":"ADBE Fill-0006","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Horizontal Feather","mn":"ADBE Fill-0003","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":0,"nm":"Vertical Feather","mn":"ADBE Fill-0004","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Opacity","mn":"ADBE Fill-0005","ix":7,"v":{"a":0,"k":1,"ix":7}}]}],"w":100,"h":100,"ip":0,"op":11,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":0,"nm":"triangleComp01","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.17,"y":0.756},"o":{"x":0.167,"y":0.167},"t":13,"s":[1930,1130,0],"to":[-52.667,-198,0],"ti":[140,-6.333,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.72,"y":0.386},"t":38,"s":[1308,398,0],"to":[-140,6.333,0],"ti":[13.333,-434.667,0]},{"t":77,"s":[1090,1168,0]}],"ix":2},"a":{"a":0,"k":[50,50,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,2.083]},"t":13,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.695,0.695,0.333],"y":[0,0,0]},"t":38,"s":[75,75,100]},{"t":88,"s":[30,30,100]}],"ix":6}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"mn":"ADBE Fill","ix":1,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","mn":"ADBE Fill-0001","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":7,"nm":"All Masks","mn":"ADBE Fill-0007","ix":2,"v":{"a":0,"k":0,"ix":2}},{"ty":2,"nm":"Color","mn":"ADBE Fill-0002","ix":3,"v":{"a":0,"k":[0.490196108818,0.231372565031,0.752941250801,1],"ix":3}},{"ty":7,"nm":"Invert","mn":"ADBE Fill-0006","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Horizontal Feather","mn":"ADBE Fill-0003","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":0,"nm":"Vertical Feather","mn":"ADBE Fill-0004","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Opacity","mn":"ADBE Fill-0005","ix":7,"v":{"a":0,"k":1,"ix":7}}]}],"w":100,"h":100,"ip":13,"op":89,"st":13,"bm":0},{"ddd":0,"ind":12,"ty":0,"nm":"triangleComp01","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.17,"y":0.819},"o":{"x":0.167,"y":0.167},"t":3,"s":[1924,1148,0],"to":[-72.667,-550,0],"ti":[137.333,-0.667,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.72,"y":0.293},"t":28,"s":[1216,80,0],"to":[-137.333,0.667,0],"ti":[-12.667,-380.667,0]},{"t":67,"s":[1100,1152,0]}],"ix":2},"a":{"a":0,"k":[50,50,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.833]},"t":3,"s":[60,60,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.695,0.695,0.333],"y":[0,0,0]},"t":28,"s":[80,80,100]},{"t":78,"s":[20,20,100]}],"ix":6}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"mn":"ADBE Fill","ix":1,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","mn":"ADBE Fill-0001","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":7,"nm":"All Masks","mn":"ADBE Fill-0007","ix":2,"v":{"a":0,"k":0,"ix":2}},{"ty":2,"nm":"Color","mn":"ADBE Fill-0002","ix":3,"v":{"a":0,"k":[1,0.282352954149,0.282352954149,1],"ix":3}},{"ty":7,"nm":"Invert","mn":"ADBE Fill-0006","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Horizontal Feather","mn":"ADBE Fill-0003","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":0,"nm":"Vertical Feather","mn":"ADBE Fill-0004","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Opacity","mn":"ADBE Fill-0005","ix":7,"v":{"a":0,"k":1,"ix":7}}]}],"w":100,"h":100,"ip":3,"op":79,"st":3,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"redCircle01","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":2,"s":[1920,1124,0],"to":[-156.667,-332.667,0],"ti":[0,0,0]},{"t":14,"s":[1652,-32,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[30,30],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.282352941176,0.282352941176,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":2,"op":15,"st":2,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"blueCircle02","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.17,"y":0.783},"o":{"x":0.167,"y":0.167},"t":6,"s":[1840,1196,0],"to":[-77.333,-182,0],"ti":[133.798,40.438,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.72,"y":0.359},"t":20,"s":[1410,770,0],"to":[-137.2,-41.466,0],"ti":[19.333,-100.667,0]},{"t":41,"s":[1208,1168,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,1.667]},"t":6,"s":[20,20,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.695,0.695,0.333],"y":[0,0,0]},"t":20,"s":[50,50,100]},{"t":41,"s":[30,30,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[30,30],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.098039223166,0.694117647059,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":6,"op":42,"st":6,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"redCircle03","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.17,"y":0.782},"o":{"x":0.167,"y":0.167},"t":15,"s":[1940,1168,0],"to":[-23.667,-194.667,0],"ti":[128.339,4.912,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.72,"y":0.29},"t":36,"s":[1606,328,0],"to":[-69.797,-2.671,0],"ti":[19.333,-210.667,0]},{"t":67,"s":[1410,1186,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.794]},"t":15,"s":[20,20,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.695,0.695,0.333],"y":[0,0,0]},"t":36,"s":[50,50,100]},{"t":67,"s":[20,20,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[30,30],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.282352941176,0.282352941176,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":68,"st":15,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"yellowCircle02","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.17,"y":0.674},"o":{"x":0.167,"y":0.167},"t":11,"s":[1904,1140,0],"to":[3.333,-94,0],"ti":[163,8,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.72,"y":0.443},"t":32,"s":[1660,608,0],"to":[-71.027,-3.486,0],"ti":[-12.667,-150.667,0]},{"t":63,"s":[1530,1160,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,1.667]},"t":11,"s":[30,30,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.695,0.695,0.333],"y":[0,0,0]},"t":32,"s":[70,70,100]},{"t":63,"s":[50,50,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[30,30],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.490196108351,0.231372563979,0.752941236309,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":11,"op":64,"st":11,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"purpleCircle03","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.17,"y":0.77},"o":{"x":0.167,"y":0.167},"t":6,"s":[1908,1116,0],"to":[-9.333,-174,0],"ti":[154.699,0.945,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.72,"y":0.302},"t":31,"s":[1588,152,0],"to":[-126.052,-0.77,0],"ti":[3.333,-368.667,0]},{"t":70,"s":[1392,1184,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,8.333]},"t":6,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.695,0.695,0.333],"y":[0,0,0]},"t":31,"s":[100,100,100]},{"t":81,"s":[50,50,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[20,20],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.705882352941,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":6,"op":71,"st":6,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"blueCircle01","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.17,"y":0.796},"o":{"x":0.167,"y":0.167},"t":0,"s":[1920,1160,0],"to":[6.667,-266,0],"ti":[131.904,-46.241,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.72,"y":0.326},"t":25,"s":[1300,212,0],"to":[-201.2,70.534,0],"ti":[-4.667,-388.667,0]},{"t":64,"s":[1144,1156,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,1.667]},"t":0,"s":[20,20,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.695,0.695,0.333],"y":[0,0,0]},"t":25,"s":[50,50,100]},{"t":64,"s":[30,30,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[30,30],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.098039223166,0.694117647059,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":65,"st":0,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"redCircle02","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.17,"y":0.79},"o":{"x":0.167,"y":0.167},"t":7,"s":[2072,1216,0],"to":[-99,-124.667,0],"ti":[111.667,12.667,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.72,"y":0.368},"t":28,"s":[1478,468,0],"to":[-111.667,-12.667,0],"ti":[-0.667,-122.667,0]},{"t":59,"s":[1402,1140,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.794]},"t":7,"s":[20,20,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.695,0.695,0.333],"y":[0,0,0]},"t":28,"s":[50,50,100]},{"t":59,"s":[20,20,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[30,30],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.282352941176,0.282352941176,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":7,"op":72,"st":7,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"yellowCircle01","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.17,"y":0.716},"o":{"x":0.167,"y":0.167},"t":3,"s":[1972,1216,0],"to":[-72,-110.667,0],"ti":[136.12,-24.434,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.72,"y":0.457},"t":21.8,"s":[1540,552,0],"to":[-163.485,29.346,0],"ti":[-20.667,-116.667,0]},{"t":50,"s":[1336,1140,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,1.667]},"t":3,"s":[30,30,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.695,0.695,0.333],"y":[0,0,0]},"t":21.8,"s":[70,70,100]},{"t":50,"s":[50,50,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[30,30],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.705882352941,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":3,"op":51,"st":3,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"purpleCircle01","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.17,"y":0.777},"o":{"x":0.167,"y":0.167},"t":0,"s":[1640,1140,0],"to":[-32.667,-164,0],"ti":[117.335,-17.843,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.72,"y":0.342},"t":25,"s":[1104,228,0],"to":[-144.667,22,0],"ti":[-24.667,-180.667,0]},{"t":64,"s":[1032,1148,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,-5.556]},"t":0,"s":[80,80,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.695,0.695,0.333],"y":[0,0,0]},"t":25,"s":[100,100,100]},{"t":75,"s":[50,50,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[15,15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.490196078431,0.23137254902,0.752941176471,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":65,"st":0,"bm":0}]},{"id":"comp_2","layers":[{"ddd":1,"ind":1,"ty":4,"nm":"triangle","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"rx":{"a":0,"k":0,"ix":8,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 150);"},"ry":{"a":0,"k":0,"ix":9,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 50);"},"rz":{"a":0,"k":0,"ix":10,"x":"var $bm_rt;\n$bm_rt = $bm_mul(time, 10);"},"or":{"a":0,"k":[0,0,0],"ix":7},"p":{"a":0,"k":[50,57,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[80,80,80],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"sr","sy":2,"d":1,"pt":{"a":0,"k":3,"ix":3},"p":{"a":0,"k":[0,0],"ix":4},"r":{"a":0,"k":0,"ix":5},"or":{"a":0,"k":30,"ix":7},"os":{"a":0,"k":0,"ix":9},"ix":1,"nm":"Polystar Path 1","mn":"ADBE Vector Shape - Star","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Polystar 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":375,"st":0,"bm":0}]},{"id":"comp_3","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"blueCircle03","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[1773,-59,0],"to":[-116,296,0],"ti":[168,-388,0]},{"t":101,"s":[1733,1213,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[45.849,45.849,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[30,30],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.098039223166,0.694117647059,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":40,"op":101,"st":40,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"redCircle04","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[1452,-305,0],"to":[244,436,0],"ti":[-304,-272,0]},{"t":101,"s":[1520,1211,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[48.744,48.744,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[30,30],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.282352941176,0.282352941176,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":35,"op":101,"st":35,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"yellowCircle03","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[920,-110,0],"to":[-200,428,0],"ti":[244,-308,0]},{"t":101,"s":[920,1210,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[68.326,68.326,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[30,30],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.705882352941,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":31,"op":101,"st":31,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"purpleCircle04","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[1246,-55,0],"to":[184,256,0],"ti":[-344,-344,0]},{"t":76,"s":[1374,1253,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[48,48,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[30,30],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.490196078431,0.23137254902,0.752941176471,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":26,"op":77,"st":26,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"triangleComp01","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":27,"s":[1654,-58,0],"to":[-124,373.333,0],"ti":[168,-557.333,0]},{"t":99,"s":[1654,1222,0]}],"ix":2},"a":{"a":0,"k":[50,50,0],"ix":1},"s":{"a":0,"k":[60,60,100],"ix":6}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"mn":"ADBE Fill","ix":1,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","mn":"ADBE Fill-0001","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":7,"nm":"All Masks","mn":"ADBE Fill-0007","ix":2,"v":{"a":0,"k":0,"ix":2}},{"ty":2,"nm":"Color","mn":"ADBE Fill-0002","ix":3,"v":{"a":0,"k":[1,0.705882370472,0,1],"ix":3}},{"ty":7,"nm":"Invert","mn":"ADBE Fill-0006","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Horizontal Feather","mn":"ADBE Fill-0003","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":0,"nm":"Vertical Feather","mn":"ADBE Fill-0004","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Opacity","mn":"ADBE Fill-0005","ix":7,"v":{"a":0,"k":1,"ix":7}}]}],"w":100,"h":100,"ip":27,"op":115,"st":27,"bm":0},{"ddd":0,"ind":6,"ty":0,"nm":"triangleComp01","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":23,"s":[1414,-58,0],"to":[248,409.333,0],"ti":[-236,-493.333,0]},{"t":100,"s":[1414,1222,0]}],"ix":2},"a":{"a":0,"k":[50,50,0],"ix":1},"s":{"a":0,"k":[60,60,100],"ix":6}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"mn":"ADBE Fill","ix":1,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","mn":"ADBE Fill-0001","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":7,"nm":"All Masks","mn":"ADBE Fill-0007","ix":2,"v":{"a":0,"k":0,"ix":2}},{"ty":2,"nm":"Color","mn":"ADBE Fill-0002","ix":3,"v":{"a":0,"k":[0.490196108818,0.231372565031,0.752941250801,1],"ix":3}},{"ty":7,"nm":"Invert","mn":"ADBE Fill-0006","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Horizontal Feather","mn":"ADBE Fill-0003","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":0,"nm":"Vertical Feather","mn":"ADBE Fill-0004","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Opacity","mn":"ADBE Fill-0005","ix":7,"v":{"a":0,"k":1,"ix":7}}]}],"w":100,"h":100,"ip":23,"op":111,"st":23,"bm":0},{"ddd":0,"ind":7,"ty":0,"nm":"triangleComp01","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[1988,1208,0],"to":[0,0,0],"ti":[95.333,242.667,0]},{"t":23,"s":[1416,-248,0]}],"ix":2},"a":{"a":0,"k":[50,50,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,-10]},"t":13,"s":[80,80,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.695,0.695,0.333],"y":[0,0,0]},"t":38,"s":[100,100,100]},{"t":88,"s":[50,50,100]}],"ix":6}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"mn":"ADBE Fill","ix":1,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","mn":"ADBE Fill-0001","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":7,"nm":"All Masks","mn":"ADBE Fill-0007","ix":2,"v":{"a":0,"k":0,"ix":2}},{"ty":2,"nm":"Color","mn":"ADBE Fill-0002","ix":3,"v":{"a":0,"k":[0.098039224744,0.694117665291,1,1],"ix":3}},{"ty":7,"nm":"Invert","mn":"ADBE Fill-0006","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Horizontal Feather","mn":"ADBE Fill-0003","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":0,"nm":"Vertical Feather","mn":"ADBE Fill-0004","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Opacity","mn":"ADBE Fill-0005","ix":7,"v":{"a":0,"k":1,"ix":7}}]}],"w":100,"h":100,"ip":13,"op":101,"st":13,"bm":0},{"ddd":0,"ind":8,"ty":0,"nm":"triangleComp01","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.17,"y":0.81},"o":{"x":0.167,"y":0.167},"t":26,"s":[1930,1130,0],"to":[-52.667,-198,0],"ti":[171.333,-3,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.72,"y":0.262},"t":51,"s":[1360,32,0],"to":[-171.333,3,0],"ti":[61.333,-430.667,0]},{"t":90,"s":[902,1148,0]}],"ix":2},"a":{"a":0,"k":[50,50,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,1.111]},"t":26,"s":[30,30,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.695,0.695,0.333],"y":[0,0,0]},"t":51,"s":[50,50,100]},{"t":101,"s":[15,15,100]}],"ix":6}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"mn":"ADBE Fill","ix":1,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","mn":"ADBE Fill-0001","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":7,"nm":"All Masks","mn":"ADBE Fill-0007","ix":2,"v":{"a":0,"k":0,"ix":2}},{"ty":2,"nm":"Color","mn":"ADBE Fill-0002","ix":3,"v":{"a":0,"k":[0.098039224744,0.694117665291,1,1],"ix":3}},{"ty":7,"nm":"Invert","mn":"ADBE Fill-0006","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Horizontal Feather","mn":"ADBE Fill-0003","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":0,"nm":"Vertical Feather","mn":"ADBE Fill-0004","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Opacity","mn":"ADBE Fill-0005","ix":7,"v":{"a":0,"k":1,"ix":7}}]}],"w":100,"h":100,"ip":26,"op":101,"st":26,"bm":0},{"ddd":0,"ind":9,"ty":0,"nm":"triangleComp01","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.17,"y":0.801},"o":{"x":0.167,"y":0.167},"t":16,"s":[1940,1124,0],"to":[-108.333,-166,0],"ti":[149.333,-4,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.72,"y":0.297},"t":41,"s":[1290,128,0],"to":[-149.333,4,0],"ti":[-48.667,-412.667,0]},{"t":80,"s":[1044,1148,0]}],"ix":2},"a":{"a":0,"k":[50,50,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,-10]},"t":16,"s":[80,80,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.695,0.695,0.333],"y":[0,0,0]},"t":41,"s":[100,100,100]},{"t":91,"s":[50,50,100]}],"ix":6}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"mn":"ADBE Fill","ix":1,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","mn":"ADBE Fill-0001","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":7,"nm":"All Masks","mn":"ADBE Fill-0007","ix":2,"v":{"a":0,"k":0,"ix":2}},{"ty":2,"nm":"Color","mn":"ADBE Fill-0002","ix":3,"v":{"a":0,"k":[1,0.705882370472,0,1],"ix":3}},{"ty":7,"nm":"Invert","mn":"ADBE Fill-0006","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Horizontal Feather","mn":"ADBE Fill-0003","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":0,"nm":"Vertical Feather","mn":"ADBE Fill-0004","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Opacity","mn":"ADBE Fill-0005","ix":7,"v":{"a":0,"k":1,"ix":7}}]}],"w":100,"h":100,"ip":16,"op":101,"st":16,"bm":0},{"ddd":0,"ind":10,"ty":0,"nm":"triangleComp01","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[1988,1208,0],"to":[0,0,0],"ti":[154.667,221.333,0]},{"t":10,"s":[1060,-120,0]}],"ix":2},"a":{"a":0,"k":[50,50,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,-10]},"t":0,"s":[80,80,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.695,0.695,0.333],"y":[0,0,0]},"t":25,"s":[100,100,100]},{"t":75,"s":[50,50,100]}],"ix":6}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"mn":"ADBE Fill","ix":1,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","mn":"ADBE Fill-0001","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":7,"nm":"All Masks","mn":"ADBE Fill-0007","ix":2,"v":{"a":0,"k":0,"ix":2}},{"ty":2,"nm":"Color","mn":"ADBE Fill-0002","ix":3,"v":{"a":0,"k":[0.098039224744,0.694117665291,1,1],"ix":3}},{"ty":7,"nm":"Invert","mn":"ADBE Fill-0006","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Horizontal Feather","mn":"ADBE Fill-0003","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":0,"nm":"Vertical Feather","mn":"ADBE Fill-0004","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Opacity","mn":"ADBE Fill-0005","ix":7,"v":{"a":0,"k":1,"ix":7}}]}],"w":100,"h":100,"ip":0,"op":101,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":0,"nm":"triangleComp01","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.17,"y":0.754},"o":{"x":0.167,"y":0.167},"t":13,"s":[1930,1130,0],"to":[-52.667,-198,0],"ti":[171.333,-3,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.72,"y":0.328},"t":38,"s":[1396,346,0],"to":[-171.333,3,0],"ti":[61.333,-430.667,0]},{"t":77,"s":[902,1148,0]}],"ix":2},"a":{"a":0,"k":[50,50,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,2.083]},"t":13,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.695,0.695,0.333],"y":[0,0,0]},"t":38,"s":[75,75,100]},{"t":88,"s":[30,30,100]}],"ix":6}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"mn":"ADBE Fill","ix":1,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","mn":"ADBE Fill-0001","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":7,"nm":"All Masks","mn":"ADBE Fill-0007","ix":2,"v":{"a":0,"k":0,"ix":2}},{"ty":2,"nm":"Color","mn":"ADBE Fill-0002","ix":3,"v":{"a":0,"k":[0.490196108818,0.231372565031,0.752941250801,1],"ix":3}},{"ty":7,"nm":"Invert","mn":"ADBE Fill-0006","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Horizontal Feather","mn":"ADBE Fill-0003","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":0,"nm":"Vertical Feather","mn":"ADBE Fill-0004","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Opacity","mn":"ADBE Fill-0005","ix":7,"v":{"a":0,"k":1,"ix":7}}]}],"w":100,"h":100,"ip":13,"op":101,"st":13,"bm":0},{"ddd":0,"ind":12,"ty":0,"nm":"triangleComp01","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.17,"y":0.816},"o":{"x":0.167,"y":0.167},"t":3,"s":[1940,1124,0],"to":[-120.667,-178,0],"ti":[149.333,-4,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.72,"y":0.284},"t":28,"s":[1216,56,0],"to":[-149.333,4,0],"ti":[-48.667,-412.667,0]},{"t":67,"s":[1044,1148,0]}],"ix":2},"a":{"a":0,"k":[50,50,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.833]},"t":3,"s":[60,60,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.695,0.695,0.333],"y":[0,0,0]},"t":28,"s":[80,80,100]},{"t":78,"s":[20,20,100]}],"ix":6}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"mn":"ADBE Fill","ix":1,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","mn":"ADBE Fill-0001","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":7,"nm":"All Masks","mn":"ADBE Fill-0007","ix":2,"v":{"a":0,"k":0,"ix":2}},{"ty":2,"nm":"Color","mn":"ADBE Fill-0002","ix":3,"v":{"a":0,"k":[1,0.282352954149,0.282352954149,1],"ix":3}},{"ty":7,"nm":"Invert","mn":"ADBE Fill-0006","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Horizontal Feather","mn":"ADBE Fill-0003","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":0,"nm":"Vertical Feather","mn":"ADBE Fill-0004","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Opacity","mn":"ADBE Fill-0005","ix":7,"v":{"a":0,"k":1,"ix":7}}]}],"w":100,"h":100,"ip":3,"op":79,"st":3,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"redCircle01","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1,"s":[1920,1124,0],"to":[-121.333,-216.667,0],"ti":[0,0,0]},{"t":13,"s":[1192,-176,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[30,30],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.282352941176,0.282352941176,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":1,"op":14,"st":1,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"blueCircle02","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.17,"y":0.779},"o":{"x":0.167,"y":0.167},"t":6,"s":[1920,1160,0],"to":[6.667,-266,0],"ti":[131.904,-46.241,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.72,"y":0.326},"t":31,"s":[1434,234,0],"to":[-201.2,70.534,0],"ti":[39.333,-396.667,0]},{"t":70,"s":[1208,1168,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,1.667]},"t":6,"s":[20,20,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.695,0.695,0.333],"y":[0,0,0]},"t":31,"s":[50,50,100]},{"t":70,"s":[30,30,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[30,30],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.098039223166,0.694117647059,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":6,"op":71,"st":6,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"redCircle03","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.17,"y":0.761},"o":{"x":0.167,"y":0.167},"t":15,"s":[1992,1216,0],"to":[-89,-107.333,0],"ti":[106.333,12.333,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.72,"y":0.427},"t":36,"s":[1458,572,0],"to":[-106.333,-12.333,0],"ti":[-0.667,-122.667,0]},{"t":67,"s":[1354,1142,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.794]},"t":15,"s":[20,20,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.695,0.695,0.333],"y":[0,0,0]},"t":36,"s":[50,50,100]},{"t":67,"s":[20,20,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[30,30],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.282352941176,0.282352941176,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":80,"st":15,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"yellowCircle02","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.17,"y":0.711},"o":{"x":0.167,"y":0.167},"t":11,"s":[1820,1152,0],"to":[-69.333,-91.333,0],"ti":[97,-0.667,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.72,"y":0.436},"t":32,"s":[1404,604,0],"to":[-97,0.667,0],"ti":[27.333,-98.667,0]},{"t":63,"s":[1238,1156,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,1.667]},"t":11,"s":[30,30,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.695,0.695,0.333],"y":[0,0,0]},"t":32,"s":[70,70,100]},{"t":63,"s":[50,50,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[30,30],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.490196108351,0.231372563979,0.752941236309,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":11,"op":76,"st":11,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"purpleCircle03","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.17,"y":0.824},"o":{"x":0.167,"y":0.167},"t":6,"s":[1944,1104,0],"to":[-154,-164.667,0],"ti":[169.333,-8,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.72,"y":0.302},"t":31,"s":[1020,116,0],"to":[-169.333,8,0],"ti":[175.333,-340.667,0]},{"t":70,"s":[928,1152,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,8.333]},"t":6,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.695,0.695,0.333],"y":[0,0,0]},"t":31,"s":[100,100,100]},{"t":81,"s":[50,50,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[20,20],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.705882352941,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":6,"op":71,"st":6,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"blueCircle01","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.17,"y":0.796},"o":{"x":0.167,"y":0.167},"t":0,"s":[1920,1160,0],"to":[6.667,-266,0],"ti":[131.904,-46.241,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.72,"y":0.326},"t":25,"s":[1300,212,0],"to":[-201.2,70.534,0],"ti":[-4.667,-388.667,0]},{"t":64,"s":[1144,1156,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,1.667]},"t":0,"s":[20,20,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.695,0.695,0.333],"y":[0,0,0]},"t":25,"s":[50,50,100]},{"t":64,"s":[30,30,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[30,30],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.098039223166,0.694117647059,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":65,"st":0,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"redCircle02","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.17,"y":0.79},"o":{"x":0.167,"y":0.167},"t":9,"s":[1992,1216,0],"to":[-99,-124.667,0],"ti":[111.667,12.667,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.72,"y":0.368},"t":30,"s":[1398,468,0],"to":[-111.667,-12.667,0],"ti":[-0.667,-122.667,0]},{"t":61,"s":[1322,1140,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.794]},"t":9,"s":[20,20,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.695,0.695,0.333],"y":[0,0,0]},"t":30,"s":[50,50,100]},{"t":61,"s":[20,20,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[30,30],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.282352941176,0.282352941176,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":9,"op":74,"st":9,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"yellowCircle01","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.17,"y":0.748},"o":{"x":0.167,"y":0.167},"t":5,"s":[1732,1216,0],"to":[-72,-110.667,0],"ti":[106,12.667,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.72,"y":0.398},"t":26,"s":[1300,552,0],"to":[-106,-12.667,0],"ti":[-20.667,-116.667,0]},{"t":57,"s":[1096,1140,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,1.667]},"t":5,"s":[30,30,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.695,0.695,0.333],"y":[0,0,0]},"t":26,"s":[70,70,100]},{"t":57,"s":[50,50,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[30,30],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.705882352941,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":70,"st":5,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"purpleCircle01","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.17,"y":0.824},"o":{"x":0.167,"y":0.167},"t":0,"s":[1944,1104,0],"to":[-154,-164.667,0],"ti":[169.333,-8,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.72,"y":0.302},"t":25,"s":[1020,116,0],"to":[-169.333,8,0],"ti":[175.333,-340.667,0]},{"t":64,"s":[928,1152,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,8.333]},"t":0,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.695,0.695,0.333],"y":[0,0,0]},"t":25,"s":[100,100,100]},{"t":75,"s":[50,50,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[15,15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.490196078431,0.23137254902,0.752941176471,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":65,"st":0,"bm":0}]},{"id":"comp_4","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"ribbonRed02","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":8.9,"ix":10},"p":{"a":0,"k":[655.204,920.201,0],"ix":2},"a":{"a":0,"k":[787.204,316.201,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[65.331,101.626],[52.275,60.987],[18,-36],[-30,-2],[100.811,137.103],[-12,136],[-54,80]],"o":[[0,0],[-54,-84],[-24,-28],[-26.593,53.186],[147.726,9.848],[-100,-136],[10.968,-124.305],[51.52,-76.326]],"v":[[736,520],[810,346],[830,138],[716,140],[780,226],[836,-92],[656,-334],[887.095,-676.42]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.156862745098,0.215686289469,0.470588265213,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":15,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.18],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":11,"s":[0]},{"t":44,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.18],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":4,"s":[0]},{"t":37,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":4,"op":45,"st":4,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"ribbonPurple02","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[960,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-7.674,145.812],[-56.367,71.74],[-43.907,167.129],[8,194],[-62,210]],"o":[[0,0],[8,-151.999],[110,-140.001],[62,-236],[-13.292,-322.34],[26.075,-88.318]],"v":[[524,624],[370,412],[544,236.001],[462,-40],[48,-256],[-174,-752]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.270588235294,0.909803981407,0.639215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[3.615]},"t":10,"s":[20]},{"t":39,"s":[15]}],"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.18],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":10,"s":[0]},{"t":43,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.18],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":3,"s":[0]},{"t":36,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":3,"op":44,"st":3,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"ribbonRed01","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[960,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[65.331,101.626],[-26,76],[32,-58],[-148,4],[100.811,137.103],[16,156],[-92,4]],"o":[[0,0],[-54,-84],[36.079,-105.462],[-42.346,76.752],[148,-4],[-100,-136],[-16,-156],[92,-4]],"v":[[1006,496],[688,340],[704,96],[568,46],[738,200],[832,-158],[600,-414],[832,-664]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.282352911257,0.282352911257,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":15,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.18],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":9,"s":[0]},{"t":42,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.18],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":2,"s":[0]},{"t":35,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":2,"op":43,"st":2,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"ribbonBlue01","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[960,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-140,200],[-170.503,113.669],[-133.881,0],[41.726,121.7],[-224,52]],"o":[[0,0],[140,-200],[138,-92],[178,0],[-24,-70],[224,-52]],"v":[[-1072,420],[-688,316],[-484,-136],[18,-62],[178,-370],[308,-692]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.239215701234,0.823529471603,0.976470648074,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[2]},"t":12,"s":[25]},{"t":28,"s":[15]}],"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.18],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":8,"s":[0]},{"t":41,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.18],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":1,"s":[0]},{"t":34,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":1,"op":42,"st":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"ribbonPurple01","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[960,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-92,162],[-114.383,228.764],[-106,-10],[56.871,70.411],[-98,116],[-28.331,59.644],[-90,44],[182,50]],"o":[[112.375,-197.878],[56,-111.999],[155.323,14.654],[-42,-52],[79.909,-94.586],[38,-80],[92.11,-45.031],[-107.186,-29.447]],"v":[[-596,612],[-704,247.999],[-446,120],[-298,-16],[-430,-158],[-482,-330],[-246,-366],[-308,-652]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.488552078546,0.230311404957,0.752941176471,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.17],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":8,"s":[35]},{"t":38,"s":[10]}],"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.18],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":8,"s":[0]},{"t":41,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.18],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":5,"s":[0]},{"t":38,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":42,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"ribbonYellow01","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[960,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-15.347,130.161],[-186.562,101.072],[112.01,0.14],[-68.075,42.572],[-51.603,62.412],[43.211,79.208],[219.412,-10.282]],"o":[[0,0],[15.347,-130.162],[180.162,-97.604],[-112.01,-0.142],[88.184,-55.147],[57.188,-69.166],[-43.211,-79.208],[-190.794,8.941]],"v":[[-996.479,553.827],[-814.281,359.159],[-768.857,64.753],[-717.951,160.649],[-716.405,-79.549],[-503.734,-159.43],[-491.038,-358.543],[-963.412,-597.718]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.706519751455,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.17],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[25]},{"t":33,"s":[10]}],"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.18],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":7,"s":[0]},{"t":40,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.18],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"t":33,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":41,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"frills","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[960,540,0],"ix":2},"a":{"a":0,"k":[960,540,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":1920,"h":1080,"ip":16,"op":166,"st":16,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"blueCircle04","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":32,"s":[1186.352,-230.499,0],"to":[-144,723.333,0],"ti":[272,-583.333,0]},{"t":83,"s":[1186.352,1205.501,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[45.849,45.849,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[30,30],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.098039223166,0.694117647059,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":32,"op":83,"st":32,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"redCircle05","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":19,"s":[794.727,-24.984,0],"to":[224,403.333,0],"ti":[-284,-435.333,0]},{"t":76,"s":[794.727,1411.016,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[48.744,48.744,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[30,30],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.282352941176,0.282352941176,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":19,"op":77,"st":19,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"yellowCircle04","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":26,"s":[108.041,-39.458,0],"to":[-76,411.333,0],"ti":[184,-591.333,0]},{"t":71,"s":[108.041,1396.542,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[68.326,68.326,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[30,30],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.705882352941,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":26,"op":73,"st":26,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"purpleCircle05","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":32,"s":[448.767,-228.23,0],"to":[236,683.333,0],"ti":[-160,-439.333,0]},{"t":89,"s":[448.767,1207.77,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[48,48,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[30,30],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.490196078431,0.23137254902,0.752941176471,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":32,"op":90,"st":32,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"blueCircle03","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":39,"s":[1430.352,-242.499,0],"to":[-144,723.333,0],"ti":[272,-583.333,0]},{"t":88,"s":[1430.352,1193.501,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[45.849,45.849,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[30,30],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.098039223166,0.694117647059,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":39,"op":90,"st":39,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"redCircle04","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":16,"s":[1038.727,-36.984,0],"to":[224,403.333,0],"ti":[-284,-435.333,0]},{"t":73,"s":[1038.727,1399.016,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[48.744,48.744,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[30,30],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.282352941176,0.282352941176,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":16,"op":74,"st":16,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"yellowCircle03","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":30,"s":[352.041,-51.458,0],"to":[-76,411.333,0],"ti":[184,-591.333,0]},{"t":87,"s":[352.041,1384.542,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[68.326,68.326,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[30,30],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.705882352941,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":88,"st":30,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"purpleCircle04","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":23,"s":[692.767,-240.23,0],"to":[236,683.333,0],"ti":[-160,-439.333,0]},{"t":80,"s":[692.767,1195.77,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[48,48,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[30,30],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.490196078431,0.23137254902,0.752941176471,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":23,"op":81,"st":23,"bm":0},{"ddd":0,"ind":10,"ty":0,"nm":"Particles02","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[960,540,0],"ix":2},"a":{"a":0,"k":[960,540,0],"ix":1},"s":{"a":0,"k":[-100,100,100],"ix":6}},"ao":0,"w":1920,"h":1080,"ip":0,"op":101,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":0,"nm":"Particles02","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[960,540,0],"ix":2},"a":{"a":0,"k":[960,540,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":1920,"h":1080,"ip":3,"op":104,"st":3,"bm":0},{"ddd":0,"ind":12,"ty":0,"nm":"Particles01","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[960,540,0],"ix":2},"a":{"a":0,"k":[960,540,0],"ix":1},"s":{"a":0,"k":[-100,100,100],"ix":6}},"ao":0,"w":1920,"h":1080,"ip":7,"op":108,"st":7,"bm":0},{"ddd":0,"ind":13,"ty":0,"nm":"Particles01","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[960,540,0],"ix":2},"a":{"a":0,"k":[960,540,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":1920,"h":1080,"ip":14,"op":115,"st":14,"bm":0},{"ddd":0,"ind":14,"ty":0,"nm":"ribbons","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[960,540,0],"ix":2},"a":{"a":0,"k":[960,540,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":1920,"h":1080,"ip":0,"op":44,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/src/main/resources/static/assets/mobile/music/birthday/birthdaySong.mp3 b/src/main/resources/static/assets/mobile/music/birthday/birthdaySong.mp3 new file mode 100644 index 00000000..e19e73c9 Binary files /dev/null and b/src/main/resources/static/assets/mobile/music/birthday/birthdaySong.mp3 differ diff --git a/src/main/resources/static/assets/platform/css/h5.css b/src/main/resources/static/assets/platform/css/h5.css index f129def1..2bed6967 100644 --- a/src/main/resources/static/assets/platform/css/h5.css +++ b/src/main/resources/static/assets/platform/css/h5.css @@ -124,11 +124,71 @@ body { } .custom-list-loading { - background-color: unset; + min-width: 132px; + padding: 15px 12px 12px; + border-radius: 14px; + color: #666; + background-color: rgba(255, 255, 255, 0.98); + box-shadow: 0 6px 22px rgba(128, 72, 72, 0.08); } .custom-list-loading .van-icon { - font-size: 108px; + position: relative; + width: 88px; + height: 88px; + overflow: visible; + font-size: 88px; +} + +.custom-list-loading .van-icon::before { + position: absolute; + inset: 6px; + border: 1px solid rgba(255, 112, 103, 0.24); + border-radius: 50%; + content: ""; +} + +.custom-list-loading .van-icon::after { + position: absolute; + top: 2px; + left: 41px; + width: 6px; + height: 6px; + border-radius: 50%; + background: #ff8c83; + box-shadow: 33px 37px 0 #ff6f68, -35px 21px 0 #ffb0a9; + content: ""; + transform-origin: 3px 42px; + animation: smart-union-loading-orbit 1.8s linear infinite; +} + +.custom-list-loading .van-icon__image { + position: absolute; + top: 50%; + left: 50%; + box-sizing: border-box; + width: 54px; + height: 54px; + padding: 5px; + border-radius: 50%; + background: rgba(255, 238, 236, 0.92); + object-fit: contain; + transform: translate(-50%, -50%); +} + +@keyframes smart-union-loading-orbit { + to { + transform: rotate(360deg); + } +} + +.custom-list-loading .van-toast__text { + margin-top: 4px; + color: #707070; + font-size: 11px; + font-weight: 500; + line-height: 18px; + white-space: pre-line; } .list-card { diff --git a/src/main/resources/static/assets/platform/css/meeting-list-layout.css b/src/main/resources/static/assets/platform/css/meeting-list-layout.css new file mode 100644 index 00000000..46f4e137 --- /dev/null +++ b/src/main/resources/static/assets/platform/css/meeting-list-layout.css @@ -0,0 +1,75 @@ +/* + * 会务管理列表页统一满屏布局:查询区和分页区固定,表格使用剩余高度并在内部滚动。 + */ +.meeting-list-layout { + height: calc(100vh - 84px); + min-height: 0; + overflow: hidden; +} + +.meeting-list-layout > .transition-item { + height: 100%; + min-height: 0; + display: flex; + flex-direction: column; + gap: 20px; + overflow: hidden; +} + +.meeting-list-layout > .transition-item > .meeting-search-card { + flex: 0 0 auto; +} + +.meeting-list-layout > .transition-item > .meeting-table-card { + flex: 1 1 0; + min-height: 0; + margin-top: 0 !important; + overflow: hidden; +} + +.meeting-list-layout > .transition-item > .meeting-table-card > .el-card__body { + height: 100%; + min-height: 0; + display: flex; + flex-direction: column; + box-sizing: border-box; + overflow: hidden; +} + +.meeting-list-layout .meeting-table-card .ele-table-tool { + flex: 0 0 auto; +} + +.meeting-list-layout .meeting-table-card .meeting-main-table { + flex: 1 1 0; + min-height: 0; +} + +.meeting-list-layout .meeting-table-card .el-pagination-container { + flex: 0 0 52px; + min-height: 52px; + margin-top: 12px !important; + margin-bottom: 0 !important; + overflow: visible; +} + +.meeting-list-layout .meeting-main-table .el-table__body-wrapper { + overflow-y: auto; +} + +@media (max-height: 760px) { + .meeting-list-layout > .transition-item { + gap: 12px; + } + + .meeting-list-layout > .transition-item > .meeting-table-card > .el-card__body { + padding-top: 14px; + padding-bottom: 10px; + } + + .meeting-list-layout .meeting-table-card .el-pagination-container { + flex-basis: 48px; + min-height: 48px; + margin-top: 8px !important; + } +} diff --git a/src/main/resources/static/assets/platform/img/spread-bg.png b/src/main/resources/static/assets/platform/img/spread-bg.png new file mode 100644 index 00000000..ac3ce630 Binary files /dev/null and b/src/main/resources/static/assets/platform/img/spread-bg.png differ diff --git a/src/main/resources/static/assets/platform/js/util/commonUtil.js b/src/main/resources/static/assets/platform/js/util/commonUtil.js index 02b9bf4b..af6f72a5 100644 --- a/src/main/resources/static/assets/platform/js/util/commonUtil.js +++ b/src/main/resources/static/assets/platform/js/util/commonUtil.js @@ -8,6 +8,10 @@ const commonUtil = { "x-requested-with": "XMLHttpRequest" } }) + // H5 页面按需注入统一的 Loading 与请求延迟处理,其他端保持原有行为。 + if (typeof window !== "undefined" && typeof window.bindH5AxiosLoading === "function") { + window.bindH5AxiosLoading(axiosService) + } //axios拦截器 axiosService.interceptors.response.use( (response) => { diff --git a/src/main/resources/static/assets/platform/js/util/h5PopupHistory.js b/src/main/resources/static/assets/platform/js/util/h5PopupHistory.js new file mode 100644 index 00000000..674cd828 --- /dev/null +++ b/src/main/resources/static/assets/platform/js/util/h5PopupHistory.js @@ -0,0 +1,79 @@ +/** + * H5 弹框浏览器历史栈管理器。 + * 页面只注册关闭回调;本文件全局统一监听 popstate,避免每个页面重复绑定返回事件。 + */ +;((global) => { + const callbacks = new Map() + const popupStack = [] + let tokenSeed = 0 + let stateSeed = 0 + let pendingClear = null + + const invokeClose = (entry) => { + const callback = callbacks.get(entry.token) + if (callback) callback(entry.popupKey) + } + + global.addEventListener("popstate", (event) => { + if (pendingClear) { + event.stopImmediatePropagation() + const clear = pendingClear + pendingClear = null + clear.resolve() + return + } + if (!popupStack.length) return + + // 有弹框历史时消费本次返回事件,阻止 PJAX 将页面直接切回上一个业务页面。 + event.stopImmediatePropagation() + const entry = popupStack.pop() + invokeClose(entry) + }, true) + + global.h5PopupHistory = { + register(closeCallback) { + tokenSeed += 1 + const token = "h5-popup-page-" + tokenSeed + callbacks.set(token, closeCallback) + return token + }, + unregister(token) { + callbacks.delete(token) + for (let index = popupStack.length - 1; index >= 0; index -= 1) { + if (popupStack[index].token === token) popupStack.splice(index, 1) + } + }, + open(token, popupKey) { + if (!callbacks.has(token)) return + const current = popupStack[popupStack.length - 1] + if (current && current.token === token && current.popupKey === popupKey) return + + stateSeed += 1 + const entry = {token:token,popupKey:popupKey,stateId:stateSeed} + popupStack.push(entry) + const state = Object.assign({}, global.history.state || {}, { + __h5PopupHistory: {token:token,popupKey:popupKey,stateId:stateSeed} + }) + global.history.pushState(state, global.document.title, global.location.href) + }, + close(token, popupKey) { + const current = popupStack[popupStack.length - 1] + if (!current || current.token !== token || current.popupKey !== popupKey) return false + global.history.back() + return true + }, + clear(token) { + const entries = popupStack.filter((entry) => entry.token === token) + if (!entries.length) return Promise.resolve() + + entries.forEach((entry) => invokeClose(entry)) + for (let index = popupStack.length - 1; index >= 0; index -= 1) { + if (popupStack[index].token === token) popupStack.splice(index, 1) + } + return new Promise((resolve) => { + pendingClear = {resolve:resolve} + global.history.go(-entries.length) + }) + } + } +})(window) diff --git a/src/main/resources/static/assets/platform/plugins/lottie/lottie.min.js b/src/main/resources/static/assets/platform/plugins/lottie/lottie.min.js new file mode 100644 index 00000000..be2618ec --- /dev/null +++ b/src/main/resources/static/assets/platform/plugins/lottie/lottie.min.js @@ -0,0 +1 @@ +"undefined"!=typeof navigator&&function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).lottie=e()}(this,(function(){"use strict";var svgNS="http://www.w3.org/2000/svg",locationHref="",_useWebWorker=!1,initialDefaultFrame=-999999,setWebWorker=function(t){_useWebWorker=!!t},getWebWorker=function(){return _useWebWorker},setLocationHref=function(t){locationHref=t},getLocationHref=function(){return locationHref};function createTag(t){return document.createElement(t)}function extendPrototype(t,e){var r,i,s=t.length;for(r=0;r1?r[1]=1:r[1]<=0&&(r[1]=0),HSVtoRGB(r[0],r[1],r[2])}function addBrightnessToRGB(t,e){var r=RGBtoHSV(255*t[0],255*t[1],255*t[2]);return r[2]+=e,r[2]>1?r[2]=1:r[2]<0&&(r[2]=0),HSVtoRGB(r[0],r[1],r[2])}function addHueToRGB(t,e){var r=RGBtoHSV(255*t[0],255*t[1],255*t[2]);return r[0]+=e/360,r[0]>1?r[0]-=1:r[0]<0&&(r[0]+=1),HSVtoRGB(r[0],r[1],r[2])}var rgbToHex=function(){var t,e,r=[];for(t=0;t<256;t+=1)e=t.toString(16),r[t]=1===e.length?"0"+e:e;return function(t,e,i){return t<0&&(t=0),e<0&&(e=0),i<0&&(i=0),"#"+r[t]+r[e]+r[i]}}(),setSubframeEnabled=function(t){subframeEnabled=!!t},getSubframeEnabled=function(){return subframeEnabled},setExpressionsPlugin=function(t){expressionsPlugin=t},getExpressionsPlugin=function(){return expressionsPlugin},setDefaultCurveSegments=function(t){defaultCurveSegments=t},getDefaultCurveSegments=function(){return defaultCurveSegments},setIdPrefix=function(t){idPrefix=t},getIdPrefix=function(){return idPrefix};function createNS(t){return document.createElementNS(svgNS,t)}function _typeof$5(t){return _typeof$5="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},_typeof$5(t)}var dataManager=function(){var t,e,r=1,i=[],s={onmessage:function(){},postMessage:function(e){t({data:e})}},a={postMessage:function(t){s.onmessage({data:t})}};function n(){e||(e=function(e){if(window.Worker&&window.Blob&&getWebWorker()){var r=new Blob(["var _workerSelf = self; self.onmessage = ",e.toString()],{type:"text/javascript"}),i=URL.createObjectURL(r);return new Worker(i)}return t=e,s}((function(t){if(a.dataManager||(a.dataManager=function(){function t(s,a){var n,o,h,l,p,m,c=s.length;for(o=0;o=0;e-=1)if("sh"===t[e].ty)if(t[e].ks.k.i)i(t[e].ks.k);else for(a=t[e].ks.k.length,s=0;sr[0]||!(r[0]>t[0])&&(t[1]>r[1]||!(r[1]>t[1])&&(t[2]>r[2]||!(r[2]>t[2])&&null))}var a,n=function(){var t=[4,4,14];function e(t){var e,r,i,s=t.length;for(e=0;e=0;r-=1)if("sh"===t[r].ty)if(t[r].ks.k.i)t[r].ks.k.c=t[r].closed;else for(s=t[r].ks.k.length,i=0;i500)&&(this._imageLoaded(),clearInterval(r)),e+=1}.bind(this),50)}function a(t){var e={assetData:t},r=i(t,this.assetsPath,this.path);return dataManager.loadData(r,function(t){e.img=t,this._footageLoaded()}.bind(this),function(){e.img={},this._footageLoaded()}.bind(this)),e}function n(){this._imageLoaded=e.bind(this),this._footageLoaded=r.bind(this),this.testImageLoaded=s.bind(this),this.createFootageData=a.bind(this),this.assetsPath="",this.path="",this.totalImages=0,this.totalFootages=0,this.loadedAssets=0,this.loadedFootagesCount=0,this.imagesLoadedCb=null,this.images=[]}return n.prototype={loadAssets:function(t,e){var r;this.imagesLoadedCb=e;var i=t.length;for(r=0;rthis.animationData.op&&(this.animationData.op=t.op,this.totalFrames=Math.floor(t.op-this.animationData.ip));var e,r,i=this.animationData.layers,s=i.length,a=t.layers,n=a.length;for(r=0;rthis.timeCompleted&&(this.currentFrame=this.timeCompleted),this.trigger("enterFrame"),this.renderFrame(),this.trigger("drawnFrame")},AnimationItem.prototype.renderFrame=function(){if(!1!==this.isLoaded&&this.renderer)try{this.renderer.renderFrame(this.currentFrame+this.firstFrame)}catch(t){this.triggerRenderFrameError(t)}},AnimationItem.prototype.play=function(t){t&&this.name!==t||!0===this.isPaused&&(this.isPaused=!1,this.audioController.resume(),this._idle&&(this._idle=!1,this.trigger("_active")))},AnimationItem.prototype.pause=function(t){t&&this.name!==t||!1===this.isPaused&&(this.isPaused=!0,this._idle=!0,this.trigger("_idle"),this.audioController.pause())},AnimationItem.prototype.togglePause=function(t){t&&this.name!==t||(!0===this.isPaused?this.play():this.pause())},AnimationItem.prototype.stop=function(t){t&&this.name!==t||(this.pause(),this.playCount=0,this._completedLoop=!1,this.setCurrentRawFrameValue(0))},AnimationItem.prototype.getMarkerData=function(t){for(var e,r=0;r=this.totalFrames-1&&this.frameModifier>0?this.loop&&this.playCount!==this.loop?e>=this.totalFrames?(this.playCount+=1,this.checkSegments(e%this.totalFrames)||(this.setCurrentRawFrameValue(e%this.totalFrames),this._completedLoop=!0,this.trigger("loopComplete"))):this.setCurrentRawFrameValue(e):this.checkSegments(e>this.totalFrames?e%this.totalFrames:0)||(r=!0,e=this.totalFrames-1):e<0?this.checkSegments(e%this.totalFrames)||(!this.loop||this.playCount--<=0&&!0!==this.loop?(r=!0,e=0):(this.setCurrentRawFrameValue(this.totalFrames+e%this.totalFrames),this._completedLoop?this.trigger("loopComplete"):this._completedLoop=!0)):this.setCurrentRawFrameValue(e),r&&(this.setCurrentRawFrameValue(e),this.pause(),this.trigger("complete"))}},AnimationItem.prototype.adjustSegment=function(t,e){this.playCount=0,t[1]0&&(this.playSpeed<0?this.setSpeed(-this.playSpeed):this.setDirection(-1)),this.totalFrames=t[0]-t[1],this.timeCompleted=this.totalFrames,this.firstFrame=t[1],this.setCurrentRawFrameValue(this.totalFrames-.001-e)):t[1]>t[0]&&(this.frameModifier<0&&(this.playSpeed<0?this.setSpeed(-this.playSpeed):this.setDirection(1)),this.totalFrames=t[1]-t[0],this.timeCompleted=this.totalFrames,this.firstFrame=t[0],this.setCurrentRawFrameValue(.001+e)),this.trigger("segmentStart")},AnimationItem.prototype.setSegment=function(t,e){var r=-1;this.isPaused&&(this.currentRawFrame+this.firstFramee&&(r=e-t)),this.firstFrame=t,this.totalFrames=e-t,this.timeCompleted=this.totalFrames,-1!==r&&this.goToAndStop(r,!0)},AnimationItem.prototype.playSegments=function(t,e){if(e&&(this.segments.length=0),"object"===_typeof$4(t[0])){var r,i=t.length;for(r=0;r=0;r-=1)e[r].animation.destroy(t)},t.freeze=function(){n=!0},t.unfreeze=function(){n=!1,d()},t.setVolume=function(t,r){var s;for(s=0;s=.001?function(t,e,r,i){for(var s=0;s<4;++s){var a=h(e,r,i);if(0===a)return e;e-=(o(e,r,i)-t)/a}return e}(t,l,e,i):0===p?l:function(t,e,r,i,s){var a,n,h=0;do{(a=o(n=e+(r-e)/2,i,s)-t)>0?r=n:e=n}while(Math.abs(a)>1e-7&&++h<10);return n}(t,a,a+r,e,i)}},t}(),pooling={double:function(t){return t.concat(createSizedArray(t.length))}},poolFactory=function(t,e,r){var i=0,s=t,a=createSizedArray(s);return{newElement:function(){return i?a[i-=1]:e()},release:function(t){i===s&&(a=pooling.double(a),s*=2),r&&r(t),a[i]=t,i+=1}}},bezierLengthPool=poolFactory(8,(function(){return{addedLength:0,percents:createTypedArray("float32",getDefaultCurveSegments()),lengths:createTypedArray("float32",getDefaultCurveSegments())}})),segmentsLengthPool=poolFactory(8,(function(){return{lengths:[],totalLength:0}}),(function(t){var e,r=t.lengths.length;for(e=0;e-.001&&n<.001}var r=function(t,e,r,i){var s,a,n,o,h,l,p=getDefaultCurveSegments(),f=0,m=[],c=[],d=bezierLengthPool.newElement();for(n=r.length,s=0;sn?-1:1,l=!0;l;)if(i[a]<=n&&i[a+1]>n?(o=(n-i[a])/(i[a+1]-i[a]),l=!1):a+=h,a<0||a>=s-1){if(a===s-1)return r[a];l=!1}return r[a]+(r[a+1]-r[a])*o}var h=createTypedArray("float32",8);return{getSegmentsLength:function(t){var e,i=segmentsLengthPool.newElement(),s=t.c,a=t.v,n=t.o,o=t.i,h=t._length,l=i.lengths,p=0;for(e=0;e1&&(a=1);var p,f=o(a,l),m=o(n=n>1?1:n,l),c=e.length,d=1-f,u=1-m,y=d*d*d,g=f*d*d*3,v=f*f*d*3,b=f*f*f,P=d*d*u,E=f*d*u+d*f*u+d*d*m,x=f*f*u+d*f*m+f*d*m,S=f*f*m,C=d*u*u,A=f*u*u+d*m*u+d*u*m,_=f*m*u+d*m*m+f*u*m,T=f*m*m,k=u*u*u,D=m*u*u+u*m*u+u*u*m,M=m*m*u+u*m*m+m*u*m,F=m*m*m;for(p=0;pc?m>d?m-c-d:d-c-m:d>c?d-c-m:c-m-d)>-1e-4&&f<1e-4}}}var bez=bezFunction(),PropertyFactory=function(){var t=initialDefaultFrame,e=Math.abs;function r(t,e){var r,s=this.offsetTime;"multidimensional"===this.propType&&(r=createTypedArray("float32",this.pv.length));for(var a,n,o,h,l,p,f,m,c,d=e.lastIndex,u=d,y=this.keyframes.length-1,g=!0;g;){if(a=this.keyframes[u],n=this.keyframes[u+1],u===y-1&&t>=n.t-s){a.h&&(a=n),d=0;break}if(n.t-s>t){d=u;break}u=k||t=k?M.points.length-1:0;for(l=M.points[F].point.length,h=0;h=V&&I=k)r[0]=v[0],r[1]=v[1],r[2]=v[2];else if(t<=D)r[0]=a.s[0],r[1]=a.s[1],r[2]=a.s[2];else{var N=i(a.s),O=i(v);b=r,P=function(t,e,r){var i,s,a,n,o,h=[],l=t[0],p=t[1],f=t[2],m=t[3],c=e[0],d=e[1],u=e[2],y=e[3];return(s=l*c+p*d+f*u+m*y)<0&&(s=-s,c=-c,d=-d,u=-u,y=-y),1-s>1e-6?(i=Math.acos(s),a=Math.sin(i),n=Math.sin((1-r)*i)/a,o=Math.sin(r*i)/a):(n=1-r,o=r),h[0]=n*l+o*c,h[1]=n*p+o*d,h[2]=n*f+o*u,h[3]=n*m+o*y,h}(N,O,(t-D)/(k-D)),E=P[0],x=P[1],S=P[2],C=P[3],A=Math.atan2(2*x*C-2*E*S,1-2*x*x-2*S*S),_=Math.asin(2*E*x+2*S*C),T=Math.atan2(2*E*C-2*x*S,1-2*E*E-2*S*S),b[0]=A/degToRads,b[1]=_/degToRads,b[2]=T/degToRads}else for(u=0;u=k?p=1:t=i&&e>=i||this._caching.lastFrame=e&&(this._caching._lastKeyframeIndex=-1,this._caching.lastIndex=0);var s=this.interpolateValue(e,this._caching);this.pv=s}return this._caching.lastFrame=e,this.pv}function a(t){var r;if("unidimensional"===this.propType)r=t*this.mult,e(this.v-r)>1e-5&&(this.v=r,this._mdf=!0);else for(var i=0,s=this.v.length;i1e-5&&(this.v[i]=r,this._mdf=!0),i+=1}function n(){if(this.elem.globalData.frameId!==this.frameId&&this.effectsSequence.length)if(this.lock)this.setVValue(this.pv);else{var t;this.lock=!0,this._mdf=this._isFirstFrame;var e=this.effectsSequence.length,r=this.kf?this.pv:this.data.k;for(t=0;t=this._maxLength&&this.doubleArrayLength(),r){case"v":a=this.v;break;case"i":a=this.i;break;case"o":a=this.o;break;default:a=[]}(!a[i]||a[i]&&!s)&&(a[i]=pointPool.newElement()),a[i][0]=t,a[i][1]=e},ShapePath.prototype.setTripleAt=function(t,e,r,i,s,a,n,o){this.setXYAt(t,e,"v",n,o),this.setXYAt(r,i,"o",n,o),this.setXYAt(s,a,"i",n,o)},ShapePath.prototype.reverse=function(){var t=new ShapePath;t.setPathData(this.c,this._length);var e=this.v,r=this.o,i=this.i,s=0;this.c&&(t.setTripleAt(e[0][0],e[0][1],i[0][0],i[0][1],r[0][0],r[0][1],0,!1),s=1);var a,n=this._length-1,o=this._length;for(a=s;a=c[c.length-1].t-this.offsetTime)i=c[c.length-1].s?c[c.length-1].s[0]:c[c.length-2].e[0],a=!0;else{for(var d,u,y,g=m,v=c.length-1,b=!0;b&&(d=c[g],!((u=c[g+1]).t-this.offsetTime>t));)g=u.t-this.offsetTime)p=1;else if(ti&&e>i)||(this._caching.lastIndex=s0||t>-1e-6&&t<0?i(1e4*t)/1e4:t}function w(){var t=this.props;return"matrix("+F(t[0])+","+F(t[1])+","+F(t[4])+","+F(t[5])+","+F(t[12])+","+F(t[13])+")"}return function(){this.reset=s,this.rotate=a,this.rotateX=n,this.rotateY=o,this.rotateZ=h,this.skew=p,this.skewFromAxis=f,this.shear=l,this.scale=m,this.setTransform=c,this.translate=d,this.transform=u,this.applyToPoint=P,this.applyToX=E,this.applyToY=x,this.applyToZ=S,this.applyToPointArray=k,this.applyToTriplePoints=T,this.applyToPointStringified=D,this.toCSS=M,this.to2dCSS=w,this.clone=v,this.cloneFromProps=b,this.equals=g,this.inversePoints=_,this.inversePoint=A,this.getInverseMatrix=C,this._t=this.transform,this.isIdentity=y,this._identity=!0,this._identityCalculated=!1,this.props=createTypedArray("float32",16),this.reset()}}();function _typeof$3(t){return _typeof$3="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},_typeof$3(t)}var lottie={},standalone="__[STANDALONE]__",animationData="__[ANIMATIONDATA]__",renderer="",queryString;function setLocation(t){setLocationHref(t)}function searchAnimations(){!0===standalone?animationManager.searchAnimations(animationData,standalone,renderer):animationManager.searchAnimations()}function setSubframeRendering(t){setSubframeEnabled(t)}function setPrefix(t){setIdPrefix(t)}function loadAnimation(t){return!0===standalone&&(t.animationData=JSON.parse(animationData)),animationManager.loadAnimation(t)}function setQuality(t){if("string"==typeof t)switch(t){case"high":setDefaultCurveSegments(200);break;default:case"medium":setDefaultCurveSegments(50);break;case"low":setDefaultCurveSegments(10)}else!isNaN(t)&&t>1&&setDefaultCurveSegments(t);getDefaultCurveSegments()>=50?roundValues(!1):roundValues(!0)}function inBrowser(){return"undefined"!=typeof navigator}function installPlugin(t,e){"expressions"===t&&setExpressionsPlugin(e)}function getFactory(t){switch(t){case"propertyFactory":return PropertyFactory;case"shapePropertyFactory":return ShapePropertyFactory;case"matrix":return Matrix;default:return null}}function checkReady(){"complete"===document.readyState&&(clearInterval(readyStateCheckInterval),searchAnimations())}function getQueryVariable(t){for(var e=queryString.split("&"),r=0;r=1?a.push({s:t-1,e:e-1}):(a.push({s:t,e:1}),a.push({s:0,e:e-1}));var n,o,h=[],l=a.length;for(n=0;ni+r))p=o.s*s<=i?0:(o.s*s-i)/r,f=o.e*s>=i+r?1:(o.e*s-i)/r,h.push([p,f])}return h.length||h.push([0,0]),h},TrimModifier.prototype.releasePathsData=function(t){var e,r=t.length;for(e=0;e1?1+a:this.s.v<0?0+a:this.s.v+a)>(r=this.e.v>1?1+a:this.e.v<0?0+a:this.e.v+a)){var n=e;e=r,r=n}e=1e-4*Math.round(1e4*e),r=1e-4*Math.round(1e4*r),this.sValue=e,this.eValue=r}else e=this.sValue,r=this.eValue;var o,h,l,p,f,m=this.shapes.length,c=0;if(r===e)for(s=0;s=0;s-=1)if((d=this.shapes[s]).shape._mdf){for((u=d.localShapeCollection).releaseShapes(),2===this.m&&m>1?(g=this.calculateShapeEdges(e,r,d.totalShapeLength,P,c),P+=d.totalShapeLength):g=[[v,b]],h=g.length,o=0;o=1?y.push({s:d.totalShapeLength*(v-1),e:d.totalShapeLength*(b-1)}):(y.push({s:d.totalShapeLength*v,e:d.totalShapeLength}),y.push({s:0,e:d.totalShapeLength*(b-1)}));var E=this.addShapes(d,y[0]);if(y[0].s!==y[0].e){if(y.length>1)if(d.shape.paths.shapes[d.shape.paths._length-1].c){var x=E.pop();this.addPaths(E,u),E=this.addShapes(d,y[1],x)}else this.addPaths(E,u),E=this.addShapes(d,y[1]);this.addPaths(E,u)}}d.shape.paths=u}}},TrimModifier.prototype.addPaths=function(t,e){var r,i=t.length;for(r=0;re.e){r.c=!1;break}e.s<=d&&e.e>=d+n.addedLength?(this.addSegment(m[i].v[s-1],m[i].o[s-1],m[i].i[s],m[i].v[s],r,o,y),y=!1):(l=bez.getNewSegment(m[i].v[s-1],m[i].v[s],m[i].o[s-1],m[i].i[s],(e.s-d)/n.addedLength,(e.e-d)/n.addedLength,h[s-1]),this.addSegmentFromArray(l,r,o,y),y=!1,r.c=!1),d+=n.addedLength,o+=1}if(m[i].c&&h.length){if(n=h[s-1],d<=e.e){var g=h[s-1].addedLength;e.s<=d&&e.e>=d+g?(this.addSegment(m[i].v[s-1],m[i].o[s-1],m[i].i[0],m[i].v[0],r,o,y),y=!1):(l=bez.getNewSegment(m[i].v[s-1],m[i].v[0],m[i].o[s-1],m[i].i[0],(e.s-d)/g,(e.e-d)/g,h[s-1]),this.addSegmentFromArray(l,r,o,y),y=!1,r.c=!1)}else r.c=!1;d+=n.addedLength,o+=1}if(r._length&&(r.setXYAt(r.v[p][0],r.v[p][1],"i",p),r.setXYAt(r.v[r._length-1][0],r.v[r._length-1][1],"o",r._length-1)),d>e.e)break;i=this.p.keyframes[this.p.keyframes.length-1].t?(i=this.p.getValueAtTime(this.p.keyframes[this.p.keyframes.length-1].t/r,0),s=this.p.getValueAtTime((this.p.keyframes[this.p.keyframes.length-1].t-.05)/r,0)):(i=this.p.pv,s=this.p.getValueAtTime((this.p._caching.lastFrame+this.p.offsetTime-.01)/r,this.p.offsetTime));else if(this.px&&this.px.keyframes&&this.py.keyframes&&this.px.getValueAtTime&&this.py.getValueAtTime){i=[],s=[];var a=this.px,n=this.py;a._caching.lastFrame+a.offsetTime<=a.keyframes[0].t?(i[0]=a.getValueAtTime((a.keyframes[0].t+.01)/r,0),i[1]=n.getValueAtTime((n.keyframes[0].t+.01)/r,0),s[0]=a.getValueAtTime(a.keyframes[0].t/r,0),s[1]=n.getValueAtTime(n.keyframes[0].t/r,0)):a._caching.lastFrame+a.offsetTime>=a.keyframes[a.keyframes.length-1].t?(i[0]=a.getValueAtTime(a.keyframes[a.keyframes.length-1].t/r,0),i[1]=n.getValueAtTime(n.keyframes[n.keyframes.length-1].t/r,0),s[0]=a.getValueAtTime((a.keyframes[a.keyframes.length-1].t-.01)/r,0),s[1]=n.getValueAtTime((n.keyframes[n.keyframes.length-1].t-.01)/r,0)):(i=[a.pv,n.pv],s[0]=a.getValueAtTime((a._caching.lastFrame+a.offsetTime-.01)/r,a.offsetTime),s[1]=n.getValueAtTime((n._caching.lastFrame+n.offsetTime-.01)/r,n.offsetTime))}else i=s=t;this.v.rotate(-Math.atan2(i[1]-s[1],i[0]-s[0]))}this.data.p&&this.data.p.s?this.data.p.z?this.v.translate(this.px.v,this.py.v,-this.pz.v):this.v.translate(this.px.v,this.py.v,0):this.v.translate(this.p.v[0],this.p.v[1],-this.p.v[2])}this.frameId=this.elem.globalData.frameId}},precalculateMatrix:function(){if(!this.a.k&&(this.pre.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.appliedTransformations=1,!this.s.effectsSequence.length)){if(this.pre.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.appliedTransformations=2,this.sk){if(this.sk.effectsSequence.length||this.sa.effectsSequence.length)return;this.pre.skewFromAxis(-this.sk.v,this.sa.v),this.appliedTransformations=3}this.r?this.r.effectsSequence.length||(this.pre.rotate(-this.r.v),this.appliedTransformations=4):this.rz.effectsSequence.length||this.ry.effectsSequence.length||this.rx.effectsSequence.length||this.or.effectsSequence.length||(this.pre.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.appliedTransformations=4)}},autoOrient:function(){}},extendPrototype([DynamicPropertyContainer],e),e.prototype.addDynamicProperty=function(t){this._addDynamicProperty(t),this.elem.addDynamicProperty(t),this._isDirty=!0},e.prototype._addDynamicProperty=DynamicPropertyContainer.prototype.addDynamicProperty,{getTransformProperty:function(t,r,i){return new e(t,r,i)}}}();function RepeaterModifier(){}function RoundCornersModifier(){}function getFontProperties(t){for(var e=t.fStyle?t.fStyle.split(" "):[],r="normal",i="normal",s=e.length,a=0;a0;)r-=1,this._elements.unshift(e[r]);this.dynamicProperties.length?this.k=!0:this.getValue(!0)},RepeaterModifier.prototype.resetElements=function(t){var e,r=t.length;for(e=0;e0?Math.floor(m):Math.ceil(m),u=this.pMatrix.props,y=this.rMatrix.props,g=this.sMatrix.props;this.pMatrix.reset(),this.rMatrix.reset(),this.sMatrix.reset(),this.tMatrix.reset(),this.matrix.reset();var v,b,P=0;if(m>0){for(;Pd;)this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!0),P-=1;c&&(this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,-c,!0),P-=c)}for(i=1===this.data.m?0:this._currentCopies-1,s=1===this.data.m?1:-1,a=this._currentCopies;a;){if(b=(r=(e=this.elemsData[i].it)[e.length-1].transform.mProps.v.props).length,e[e.length-1].transform.mProps._mdf=!0,e[e.length-1].transform.op._mdf=!0,e[e.length-1].transform.op.v=1===this._currentCopies?this.so.v:this.so.v+(this.eo.v-this.so.v)*(i/(this._currentCopies-1)),0!==P){for((0!==i&&1===s||i!==this._currentCopies-1&&-1===s)&&this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!1),this.matrix.transform(y[0],y[1],y[2],y[3],y[4],y[5],y[6],y[7],y[8],y[9],y[10],y[11],y[12],y[13],y[14],y[15]),this.matrix.transform(g[0],g[1],g[2],g[3],g[4],g[5],g[6],g[7],g[8],g[9],g[10],g[11],g[12],g[13],g[14],g[15]),this.matrix.transform(u[0],u[1],u[2],u[3],u[4],u[5],u[6],u[7],u[8],u[9],u[10],u[11],u[12],u[13],u[14],u[15]),v=0;v0&&(p=!1),p){var f=createTag("style");f.setAttribute("f-forigin",i[r].fOrigin),f.setAttribute("f-origin",i[r].origin),f.setAttribute("f-family",i[r].fFamily),f.type="text/css",f.innerText="@font-face {font-family: "+i[r].fFamily+"; font-style: normal; src: url('"+i[r].fPath+"');}",e.appendChild(f)}}else if("g"===i[r].fOrigin||1===i[r].origin){for(h=document.querySelectorAll('link[f-forigin="g"], link[f-origin="1"]'),l=0;lt?!0!==this.isInRange&&(this.globalData._mdf=!0,this._mdf=!0,this.isInRange=!0,this.show()):!1!==this.isInRange&&(this.globalData._mdf=!0,this.isInRange=!1,this.hide())},renderRenderable:function(){var t,e=this.renderableComponents.length;for(t=0;t0&&(this.maskElement.setAttribute("id",y),this.element.maskedElement.setAttribute(v,"url("+getLocationHref()+"#"+y+")"),a.appendChild(this.maskElement)),this.viewData.length&&this.element.addRenderableComponent(this)}FootageElement.prototype.prepareFrame=function(){},extendPrototype([RenderableElement,BaseElement,FrameElement],FootageElement),FootageElement.prototype.getBaseElement=function(){return null},FootageElement.prototype.renderFrame=function(){},FootageElement.prototype.destroy=function(){},FootageElement.prototype.initExpressions=function(){this.layerInterface=FootageInterface(this)},FootageElement.prototype.getFootageData=function(){return this.footageData},AudioElement.prototype.prepareFrame=function(t){if(this.prepareRenderableFrame(t,!0),this.prepareProperties(t,!0),this.tm._placeholder)this._currentTime=t/this.data.sr;else{var e=this.tm.v;this._currentTime=e}},extendPrototype([RenderableElement,BaseElement,FrameElement],AudioElement),AudioElement.prototype.renderFrame=function(){this.isInRange&&this._canPlay&&(this._isPlaying?(!this.audio.playing()||Math.abs(this._currentTime/this.globalData.frameRate-this.audio.seek())>.1)&&this.audio.seek(this._currentTime/this.globalData.frameRate):(this.audio.play(),this.audio.seek(this._currentTime/this.globalData.frameRate),this._isPlaying=!0))},AudioElement.prototype.show=function(){},AudioElement.prototype.hide=function(){this.audio.pause(),this._isPlaying=!1},AudioElement.prototype.pause=function(){this.audio.pause(),this._isPlaying=!1,this._canPlay=!1},AudioElement.prototype.resume=function(){this._canPlay=!0},AudioElement.prototype.setRate=function(t){this.audio.rate(t)},AudioElement.prototype.volume=function(t){this.audio.volume(t)},AudioElement.prototype.getBaseElement=function(){return null},AudioElement.prototype.destroy=function(){},AudioElement.prototype.sourceRectAtTime=function(){},AudioElement.prototype.initExpressions=function(){},BaseRenderer.prototype.checkLayers=function(t){var e,r,i=this.layers.length;for(this.completeLayers=!0,e=i-1;e>=0;e-=1)this.elements[e]||(r=this.layers[e]).ip-r.st<=t-this.layers[e].st&&r.op-r.st>t-this.layers[e].st&&this.buildItem(e),this.completeLayers=!!this.elements[e]&&this.completeLayers;this.checkPendingElements()},BaseRenderer.prototype.createItem=function(t){switch(t.ty){case 2:return this.createImage(t);case 0:return this.createComp(t);case 1:return this.createSolid(t);case 3:default:return this.createNull(t);case 4:return this.createShape(t);case 5:return this.createText(t);case 6:return this.createAudio(t);case 13:return this.createCamera(t);case 15:return this.createFootage(t)}},BaseRenderer.prototype.createCamera=function(){throw new Error("You're using a 3d camera. Try the html renderer.")},BaseRenderer.prototype.createAudio=function(t){return new AudioElement(t,this.globalData,this)},BaseRenderer.prototype.createFootage=function(t){return new FootageElement(t,this.globalData,this)},BaseRenderer.prototype.buildAllItems=function(){var t,e=this.layers.length;for(t=0;t1&&(a+=" C"+e.o[i-1][0]+","+e.o[i-1][1]+" "+e.i[0][0]+","+e.i[0][1]+" "+e.v[0][0]+","+e.v[0][1]),r.lastPath!==a){var n="";r.elem&&(e.c&&(n=t.inv?this.solidPath+a:a),r.elem.setAttribute("d",n)),r.lastPath=a}},MaskElement.prototype.destroy=function(){this.element=null,this.globalData=null,this.maskElement=null,this.data=null,this.masksProperties=null};var filtersFactory=function(){var t={};return t.createFilter=function(t,e){var r=createNS("filter");r.setAttribute("id",t),!0!==e&&(r.setAttribute("filterUnits","objectBoundingBox"),r.setAttribute("x","0%"),r.setAttribute("y","0%"),r.setAttribute("width","100%"),r.setAttribute("height","100%"));return r},t.createAlphaToLuminanceFilter=function(){var t=createNS("feColorMatrix");return t.setAttribute("type","matrix"),t.setAttribute("color-interpolation-filters","sRGB"),t.setAttribute("values","0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1"),t},t}(),featureSupport=function(){var t={maskType:!0};return(/MSIE 10/i.test(navigator.userAgent)||/MSIE 9/i.test(navigator.userAgent)||/rv:11.0/i.test(navigator.userAgent)||/Edge\/\d./i.test(navigator.userAgent))&&(t.maskType=!1),t}();function SVGTintFilter(t,e){this.filterManager=e;var r=createNS("feColorMatrix");if(r.setAttribute("type","matrix"),r.setAttribute("color-interpolation-filters","linearRGB"),r.setAttribute("values","0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0"),r.setAttribute("result","f1"),t.appendChild(r),(r=createNS("feColorMatrix")).setAttribute("type","matrix"),r.setAttribute("color-interpolation-filters","sRGB"),r.setAttribute("values","1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0"),r.setAttribute("result","f2"),t.appendChild(r),this.matrixFilter=r,100!==e.effectElements[2].p.v||e.effectElements[2].p.k){var i,s=createNS("feMerge");t.appendChild(s),(i=createNS("feMergeNode")).setAttribute("in","SourceGraphic"),s.appendChild(i),(i=createNS("feMergeNode")).setAttribute("in","f2"),s.appendChild(i)}}function SVGFillFilter(t,e){this.filterManager=e;var r=createNS("feColorMatrix");r.setAttribute("type","matrix"),r.setAttribute("color-interpolation-filters","sRGB"),r.setAttribute("values","1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0"),t.appendChild(r),this.matrixFilter=r}function SVGStrokeEffect(t,e){this.initialized=!1,this.filterManager=e,this.elem=t,this.paths=[]}function SVGTritoneFilter(t,e){this.filterManager=e;var r=createNS("feColorMatrix");r.setAttribute("type","matrix"),r.setAttribute("color-interpolation-filters","linearRGB"),r.setAttribute("values","0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0"),r.setAttribute("result","f1"),t.appendChild(r);var i=createNS("feComponentTransfer");i.setAttribute("color-interpolation-filters","sRGB"),t.appendChild(i),this.matrixFilter=i;var s=createNS("feFuncR");s.setAttribute("type","table"),i.appendChild(s),this.feFuncR=s;var a=createNS("feFuncG");a.setAttribute("type","table"),i.appendChild(a),this.feFuncG=a;var n=createNS("feFuncB");n.setAttribute("type","table"),i.appendChild(n),this.feFuncB=n}function SVGProLevelsFilter(t,e){this.filterManager=e;var r=this.filterManager.effectElements,i=createNS("feComponentTransfer");(r[10].p.k||0!==r[10].p.v||r[11].p.k||1!==r[11].p.v||r[12].p.k||1!==r[12].p.v||r[13].p.k||0!==r[13].p.v||r[14].p.k||1!==r[14].p.v)&&(this.feFuncR=this.createFeFunc("feFuncR",i)),(r[17].p.k||0!==r[17].p.v||r[18].p.k||1!==r[18].p.v||r[19].p.k||1!==r[19].p.v||r[20].p.k||0!==r[20].p.v||r[21].p.k||1!==r[21].p.v)&&(this.feFuncG=this.createFeFunc("feFuncG",i)),(r[24].p.k||0!==r[24].p.v||r[25].p.k||1!==r[25].p.v||r[26].p.k||1!==r[26].p.v||r[27].p.k||0!==r[27].p.v||r[28].p.k||1!==r[28].p.v)&&(this.feFuncB=this.createFeFunc("feFuncB",i)),(r[31].p.k||0!==r[31].p.v||r[32].p.k||1!==r[32].p.v||r[33].p.k||1!==r[33].p.v||r[34].p.k||0!==r[34].p.v||r[35].p.k||1!==r[35].p.v)&&(this.feFuncA=this.createFeFunc("feFuncA",i)),(this.feFuncR||this.feFuncG||this.feFuncB||this.feFuncA)&&(i.setAttribute("color-interpolation-filters","sRGB"),t.appendChild(i),i=createNS("feComponentTransfer")),(r[3].p.k||0!==r[3].p.v||r[4].p.k||1!==r[4].p.v||r[5].p.k||1!==r[5].p.v||r[6].p.k||0!==r[6].p.v||r[7].p.k||1!==r[7].p.v)&&(i.setAttribute("color-interpolation-filters","sRGB"),t.appendChild(i),this.feFuncRComposed=this.createFeFunc("feFuncR",i),this.feFuncGComposed=this.createFeFunc("feFuncG",i),this.feFuncBComposed=this.createFeFunc("feFuncB",i))}function SVGDropShadowEffect(t,e){var r=e.container.globalData.renderConfig.filterSize;t.setAttribute("x",r.x),t.setAttribute("y",r.y),t.setAttribute("width",r.width),t.setAttribute("height",r.height),this.filterManager=e;var i=createNS("feGaussianBlur");i.setAttribute("in","SourceAlpha"),i.setAttribute("result","drop_shadow_1"),i.setAttribute("stdDeviation","0"),this.feGaussianBlur=i,t.appendChild(i);var s=createNS("feOffset");s.setAttribute("dx","25"),s.setAttribute("dy","0"),s.setAttribute("in","drop_shadow_1"),s.setAttribute("result","drop_shadow_2"),this.feOffset=s,t.appendChild(s);var a=createNS("feFlood");a.setAttribute("flood-color","#00ff00"),a.setAttribute("flood-opacity","1"),a.setAttribute("result","drop_shadow_3"),this.feFlood=a,t.appendChild(a);var n=createNS("feComposite");n.setAttribute("in","drop_shadow_3"),n.setAttribute("in2","drop_shadow_2"),n.setAttribute("operator","in"),n.setAttribute("result","drop_shadow_4"),t.appendChild(n);var o,h=createNS("feMerge");t.appendChild(h),o=createNS("feMergeNode"),h.appendChild(o),(o=createNS("feMergeNode")).setAttribute("in","SourceGraphic"),this.feMergeNode=o,this.feMerge=h,this.originalNodeAdded=!1,h.appendChild(o)}SVGTintFilter.prototype.renderFrame=function(t){if(t||this.filterManager._mdf){var e=this.filterManager.effectElements[0].p.v,r=this.filterManager.effectElements[1].p.v,i=this.filterManager.effectElements[2].p.v/100;this.matrixFilter.setAttribute("values",r[0]-e[0]+" 0 0 0 "+e[0]+" "+(r[1]-e[1])+" 0 0 0 "+e[1]+" "+(r[2]-e[2])+" 0 0 0 "+e[2]+" 0 0 0 "+i+" 0")}},SVGFillFilter.prototype.renderFrame=function(t){if(t||this.filterManager._mdf){var e=this.filterManager.effectElements[2].p.v,r=this.filterManager.effectElements[6].p.v;this.matrixFilter.setAttribute("values","0 0 0 0 "+e[0]+" 0 0 0 0 "+e[1]+" 0 0 0 0 "+e[2]+" 0 0 0 "+r+" 0")}},SVGStrokeEffect.prototype.initialize=function(){var t,e,r,i,s=this.elem.layerElement.children||this.elem.layerElement.childNodes;for(1===this.filterManager.effectElements[1].p.v?(i=this.elem.maskManager.masksProperties.length,r=0):i=(r=this.filterManager.effectElements[0].p.v-1)+1,(e=createNS("g")).setAttribute("fill","none"),e.setAttribute("stroke-linecap","round"),e.setAttribute("stroke-dashoffset",1);r=l?c<0?i:s:i+m*Math.pow((a-t)/c,1/r),p[f]=n,f+=1,o+=256/255;return p.join(" ")},SVGProLevelsFilter.prototype.renderFrame=function(t){if(t||this.filterManager._mdf){var e,r=this.filterManager.effectElements;this.feFuncRComposed&&(t||r[3].p._mdf||r[4].p._mdf||r[5].p._mdf||r[6].p._mdf||r[7].p._mdf)&&(e=this.getTableValue(r[3].p.v,r[4].p.v,r[5].p.v,r[6].p.v,r[7].p.v),this.feFuncRComposed.setAttribute("tableValues",e),this.feFuncGComposed.setAttribute("tableValues",e),this.feFuncBComposed.setAttribute("tableValues",e)),this.feFuncR&&(t||r[10].p._mdf||r[11].p._mdf||r[12].p._mdf||r[13].p._mdf||r[14].p._mdf)&&(e=this.getTableValue(r[10].p.v,r[11].p.v,r[12].p.v,r[13].p.v,r[14].p.v),this.feFuncR.setAttribute("tableValues",e)),this.feFuncG&&(t||r[17].p._mdf||r[18].p._mdf||r[19].p._mdf||r[20].p._mdf||r[21].p._mdf)&&(e=this.getTableValue(r[17].p.v,r[18].p.v,r[19].p.v,r[20].p.v,r[21].p.v),this.feFuncG.setAttribute("tableValues",e)),this.feFuncB&&(t||r[24].p._mdf||r[25].p._mdf||r[26].p._mdf||r[27].p._mdf||r[28].p._mdf)&&(e=this.getTableValue(r[24].p.v,r[25].p.v,r[26].p.v,r[27].p.v,r[28].p.v),this.feFuncB.setAttribute("tableValues",e)),this.feFuncA&&(t||r[31].p._mdf||r[32].p._mdf||r[33].p._mdf||r[34].p._mdf||r[35].p._mdf)&&(e=this.getTableValue(r[31].p.v,r[32].p.v,r[33].p.v,r[34].p.v,r[35].p.v),this.feFuncA.setAttribute("tableValues",e))}},SVGDropShadowEffect.prototype.renderFrame=function(t){if(t||this.filterManager._mdf){if((t||this.filterManager.effectElements[4].p._mdf)&&this.feGaussianBlur.setAttribute("stdDeviation",this.filterManager.effectElements[4].p.v/4),t||this.filterManager.effectElements[0].p._mdf){var e=this.filterManager.effectElements[0].p.v;this.feFlood.setAttribute("flood-color",rgbToHex(Math.round(255*e[0]),Math.round(255*e[1]),Math.round(255*e[2])))}if((t||this.filterManager.effectElements[1].p._mdf)&&this.feFlood.setAttribute("flood-opacity",this.filterManager.effectElements[1].p.v/255),t||this.filterManager.effectElements[2].p._mdf||this.filterManager.effectElements[3].p._mdf){var r=this.filterManager.effectElements[3].p.v,i=(this.filterManager.effectElements[2].p.v-90)*degToRads,s=r*Math.cos(i),a=r*Math.sin(i);this.feOffset.setAttribute("dx",s),this.feOffset.setAttribute("dy",a)}}};var _svgMatteSymbols=[];function SVGMatte3Effect(t,e,r){this.initialized=!1,this.filterManager=e,this.filterElem=t,this.elem=r,r.matteElement=createNS("g"),r.matteElement.appendChild(r.layerElement),r.matteElement.appendChild(r.transformedElement),r.baseElement=r.matteElement}function SVGGaussianBlurEffect(t,e){t.setAttribute("x","-100%"),t.setAttribute("y","-100%"),t.setAttribute("width","300%"),t.setAttribute("height","300%"),this.filterManager=e;var r=createNS("feGaussianBlur");t.appendChild(r),this.feGaussianBlur=r}SVGMatte3Effect.prototype.findSymbol=function(t){for(var e=0,r=_svgMatteSymbols.length;e=0&&!this.shapeModifiers[t].processShapes(this._isFirstFrame);t-=1);}},searchProcessedElement:function(t){for(var e=this.processedElements,r=0,i=e.length;r.01)return!1;r+=1}return!0},GradientProperty.prototype.checkCollapsable=function(){if(this.o.length/2!=this.c.length/4)return!1;if(this.data.k.k[0].s)for(var t=0,e=this.data.k.k.length;t0;)h=i.transformers[u].mProps._mdf||h,d-=1,u-=1;if(h)for(d=g-i.styles[p].lvl,u=i.transformers.length-1;d>0;)c=i.transformers[u].mProps.v.props,m.transform(c[0],c[1],c[2],c[3],c[4],c[5],c[6],c[7],c[8],c[9],c[10],c[11],c[12],c[13],c[14],c[15]),d-=1,u-=1}else m=t;if(n=(f=i.sh.paths)._length,h){for(o="",a=0;a=1?v=.99:v<=-1&&(v=-.99);var b=o*v,P=Math.cos(g+e.a.v)*b+p[0],E=Math.sin(g+e.a.v)*b+p[1];h.setAttribute("fx",P),h.setAttribute("fy",E),l&&!e.g._collapsable&&(e.of.setAttribute("fx",P),e.of.setAttribute("fy",E))}}function h(t,e,r){var i=e.style,s=e.d;s&&(s._mdf||r)&&s.dashStr&&(i.pElem.setAttribute("stroke-dasharray",s.dashStr),i.pElem.setAttribute("stroke-dashoffset",s.dashoffset[0])),e.c&&(e.c._mdf||r)&&i.pElem.setAttribute("stroke","rgb("+bmFloor(e.c.v[0])+","+bmFloor(e.c.v[1])+","+bmFloor(e.c.v[2])+")"),(e.o._mdf||r)&&i.pElem.setAttribute("stroke-opacity",e.o.v),(e.w._mdf||r)&&(i.pElem.setAttribute("stroke-width",e.w.v),i.msElem&&i.msElem.setAttribute("stroke-width",e.w.v))}return{createRenderFunction:function(t){switch(t.ty){case"fl":return a;case"gf":return o;case"gs":return n;case"st":return h;case"sh":case"el":case"rc":case"sr":return s;case"tr":return r;case"no":return i;default:return null}}}}();function SVGShapeElement(t,e,r){this.shapes=[],this.shapesData=t.shapes,this.stylesList=[],this.shapeModifiers=[],this.itemsData=[],this.processedElements=[],this.animatedContents=[],this.initElement(t,e,r),this.prevViewData=[]}function LetterProps(t,e,r,i,s,a){this.o=t,this.sw=e,this.sc=r,this.fc=i,this.m=s,this.p=a,this._mdf={o:!0,sw:!!e,sc:!!r,fc:!!i,m:!0,p:!0}}function TextProperty(t,e){this._frameId=initialDefaultFrame,this.pv="",this.v="",this.kf=!1,this._isFirstFrame=!0,this._mdf=!1,this.data=e,this.elem=t,this.comp=this.elem.comp,this.keysIndex=0,this.canResize=!1,this.minimumFontSize=1,this.effectsSequence=[],this.currentData={ascent:0,boxWidth:this.defaultBoxWidth,f:"",fStyle:"",fWeight:"",fc:"",j:"",justifyOffset:"",l:[],lh:0,lineWidths:[],ls:"",of:"",s:"",sc:"",sw:0,t:0,tr:0,sz:0,ps:null,fillColorAnim:!1,strokeColorAnim:!1,strokeWidthAnim:!1,yOffset:0,finalSize:0,finalText:[],finalLineHeight:0,__complete:!1},this.copyData(this.currentData,this.data.d.k[0].s),this.searchProperty()||this.completeTextData(this.currentData)}extendPrototype([BaseElement,TransformElement,SVGBaseElement,IShapeElement,HierarchyElement,FrameElement,RenderableDOMElement],SVGShapeElement),SVGShapeElement.prototype.initSecondaryElement=function(){},SVGShapeElement.prototype.identityMatrix=new Matrix,SVGShapeElement.prototype.buildExpressionInterface=function(){},SVGShapeElement.prototype.createContent=function(){this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.layerElement,0,[],!0),this.filterUniqueShapes()},SVGShapeElement.prototype.filterUniqueShapes=function(){var t,e,r,i,s=this.shapes.length,a=this.stylesList.length,n=[],o=!1;for(r=0;r1&&o&&this.setShapesAsAnimated(n)}},SVGShapeElement.prototype.setShapesAsAnimated=function(t){var e,r=t.length;for(e=0;e=0;o-=1){if((m=this.searchProcessedElement(t[o]))?e[o]=r[m-1]:t[o]._render=n,"fl"===t[o].ty||"st"===t[o].ty||"gf"===t[o].ty||"gs"===t[o].ty||"no"===t[o].ty)m?e[o].style.closed=!1:e[o]=this.createStyleElement(t[o],s),t[o]._render&&e[o].style.pElem.parentNode!==i&&i.appendChild(e[o].style.pElem),u.push(e[o].style);else if("gr"===t[o].ty){if(m)for(l=e[o].it.length,h=0;h1,this.kf&&this.addEffect(this.getKeyframeValue.bind(this)),this.kf},TextProperty.prototype.addEffect=function(t){this.effectsSequence.push(t),this.elem.addDynamicProperty(this)},TextProperty.prototype.getValue=function(t){if(this.elem.globalData.frameId!==this.frameId&&this.effectsSequence.length||t){this.currentData.t=this.data.d.k[this.keysIndex].s.t;var e=this.currentData,r=this.keysIndex;if(this.lock)this.setCurrentData(this.currentData);else{var i;this.lock=!0,this._mdf=!1;var s=this.effectsSequence.length,a=t||this.data.d.k[this.keysIndex].s;for(i=0;ie);)r+=1;return this.keysIndex!==r&&(this.keysIndex=r),this.data.d.k[this.keysIndex].s},TextProperty.prototype.buildFinalText=function(t){for(var e,r,i=[],s=0,a=t.length,n=!1;s=55296&&e<=56319?(r=t.charCodeAt(s+1))>=56320&&r<=57343?(n||FontManager.isModifier(e,r)?(i[i.length-1]+=t.substr(s,2),n=!1):i.push(t.substr(s,2)),s+=1):i.push(t.charAt(s)):e>56319?(r=t.charCodeAt(s+1),FontManager.isZeroWidthJoiner(e,r)?(n=!0,i[i.length-1]+=t.substr(s,2),s+=1):i.push(t.charAt(s))):FontManager.isZeroWidthJoiner(e)?(i[i.length-1]+=t.charAt(s),n=!0):i.push(t.charAt(s)),s+=1;return i},TextProperty.prototype.completeTextData=function(t){t.__complete=!0;var e,r,i,s,a,n,o,h=this.elem.globalData.fontManager,l=this.data,p=[],f=0,m=l.m.g,c=0,d=0,u=0,y=[],g=0,v=0,b=h.getFontByName(t.f),P=0,E=getFontProperties(b);t.fWeight=E.weight,t.fStyle=E.style,t.finalSize=t.s,t.finalText=this.buildFinalText(t.t),r=t.finalText.length,t.finalLineHeight=t.lh;var x,S=t.tr/1e3*t.finalSize;if(t.sz)for(var C,A,_=!0,T=t.sz[0],k=t.sz[1];_;){C=0,g=0,r=(A=this.buildFinalText(t.t)).length,S=t.tr/1e3*t.finalSize;var D=-1;for(e=0;eT&&" "!==A[e]?(-1===D?r+=1:e=D,C+=t.finalLineHeight||1.2*t.finalSize,A.splice(e,D===e?1:0,"\r"),D=-1,g=0):(g+=P,g+=S);C+=b.ascent*t.finalSize/100,this.canResize&&t.finalSize>this.minimumFontSize&&kv?g:v,g=-2*S,s="",i=!0,u+=1):s=M,h.chars?(o=h.getCharData(M,b.fStyle,h.getFontByName(t.f).fFamily),P=i?0:o.w*t.finalSize/100):P=h.measureText(s,t.f,t.finalSize)," "===M?F+=P+S:(g+=P+S+F,F=0),p.push({l:P,an:P,add:c,n:i,anIndexes:[],val:s,line:u,animatorJustifyOffset:0}),2==m){if(c+=P,""===s||" "===s||e===r-1){for(""!==s&&" "!==s||(c-=P);d<=e;)p[d].an=c,p[d].ind=f,p[d].extra=P,d+=1;f+=1,c=0}}else if(3==m){if(c+=P,""===s||e===r-1){for(""===s&&(c-=P);d<=e;)p[d].an=c,p[d].ind=f,p[d].extra=P,d+=1;c=0,f+=1}}else p[f].ind=f,p[f].extra=0,f+=1;if(t.l=p,v=g>v?g:v,y.push(g),t.sz)t.boxWidth=t.sz[0],t.justifyOffset=0;else switch(t.boxWidth=v,t.j){case 1:t.justifyOffset=-t.boxWidth;break;case 2:t.justifyOffset=-t.boxWidth/2;break;default:t.justifyOffset=0}t.lineWidths=y;var w,I,V,B,R=l.a;n=R.length;var L=[];for(a=0;a0?s=this.ne.v/100:a=-this.ne.v/100,this.xe.v>0?n=1-this.xe.v/100:o=1+this.xe.v/100;var h=BezierFactory.getBezierEasing(s,a,n,o).get,l=0,p=this.finalS,f=this.finalE,m=this.data.sh;if(2===m)l=h(l=f===p?i>=f?1:0:t(0,e(.5/(f-p)+(i-p)/(f-p),1)));else if(3===m)l=h(l=f===p?i>=f?0:1:1-t(0,e(.5/(f-p)+(i-p)/(f-p),1)));else if(4===m)f===p?l=0:(l=t(0,e(.5/(f-p)+(i-p)/(f-p),1)))<.5?l*=2:l=1-2*(l-.5),l=h(l);else if(5===m){if(f===p)l=0;else{var c=f-p,d=-c/2+(i=e(t(0,i+.5-p),f-p)),u=c/2;l=Math.sqrt(1-d*d/(u*u))}l=h(l)}else 6===m?(f===p?l=0:(i=e(t(0,i+.5-p),f-p),l=(1+Math.cos(Math.PI+2*Math.PI*i/(f-p)))/2),l=h(l)):(i>=r(p)&&(l=t(0,e(i-p<0?e(f,1)-(p-i):f-i,1))),l=h(l));if(100!==this.sm.v){var y=.01*this.sm.v;0===y&&(y=1e-8);var g=.5-.5*y;l1&&(l=1)}return l*this.a.v},getValue:function(t){this.iterateDynamicProperties(),this._mdf=t||this._mdf,this._currentTextLength=this.elem.textProperty.currentData.l.length||0,t&&2===this.data.r&&(this.e.v=this._currentTextLength);var e=2===this.data.r?1:100/this.data.totalChars,r=this.o.v/e,i=this.s.v/e+r,s=this.e.v/e+r;if(i>s){var a=i;i=s,s=a}this.finalS=i,this.finalE=s}},extendPrototype([DynamicPropertyContainer],i),{getTextSelectorProp:function(t,e,r){return new i(t,e,r)}}}();function TextAnimatorDataProperty(t,e,r){var i={propType:!1},s=PropertyFactory.getProp,a=e.a;this.a={r:a.r?s(t,a.r,0,degToRads,r):i,rx:a.rx?s(t,a.rx,0,degToRads,r):i,ry:a.ry?s(t,a.ry,0,degToRads,r):i,sk:a.sk?s(t,a.sk,0,degToRads,r):i,sa:a.sa?s(t,a.sa,0,degToRads,r):i,s:a.s?s(t,a.s,1,.01,r):i,a:a.a?s(t,a.a,1,0,r):i,o:a.o?s(t,a.o,0,.01,r):i,p:a.p?s(t,a.p,1,0,r):i,sw:a.sw?s(t,a.sw,0,0,r):i,sc:a.sc?s(t,a.sc,1,0,r):i,fc:a.fc?s(t,a.fc,1,0,r):i,fh:a.fh?s(t,a.fh,0,0,r):i,fs:a.fs?s(t,a.fs,0,.01,r):i,fb:a.fb?s(t,a.fb,0,.01,r):i,t:a.t?s(t,a.t,0,0,r):i},this.s=TextSelectorProp.getTextSelectorProp(t,e.s,r),this.s.t=e.s.t}function TextAnimatorProperty(t,e,r){this._isFirstFrame=!0,this._hasMaskedPath=!1,this._frameId=-1,this._textData=t,this._renderType=e,this._elem=r,this._animatorsData=createSizedArray(this._textData.a.length),this._pathData={},this._moreOptions={alignment:{}},this.renderedLetters=[],this.lettersChangedFlag=!1,this.initDynamicPropertyContainer(r)}function ITextElement(){}TextAnimatorProperty.prototype.searchProperties=function(){var t,e,r=this._textData.a.length,i=PropertyFactory.getProp;for(t=0;t=o+ot||!d?(v=(o+ot-l)/h.partialLength,G=c.point[0]+(h.point[0]-c.point[0])*v,z=c.point[1]+(h.point[1]-c.point[1])*v,C.translate(-E[0]*T[s].an*.005,-E[1]*B*.01),p=!1):d&&(l+=h.partialLength,(f+=1)>=d.length&&(f=0,u[m+=1]?d=u[m].points:P.v.c?(f=0,d=u[m=0].points):(l-=h.partialLength,d=null)),d&&(c=h,y=(h=d[f]).partialLength));L=T[s].an/2-T[s].add,C.translate(-L,0,0)}else L=T[s].an/2-T[s].add,C.translate(-L,0,0),C.translate(-E[0]*T[s].an*.005,-E[1]*B*.01,0);for(F=0;Ft?this.textSpans[t].span:createNS(h?"g":"text"),y<=t){if(n.setAttribute("stroke-linecap","butt"),n.setAttribute("stroke-linejoin","round"),n.setAttribute("stroke-miterlimit","4"),this.textSpans[t].span=n,h){var g=createNS("g");n.appendChild(g),this.textSpans[t].childSpan=g}this.textSpans[t].span=n,this.layerElement.appendChild(n)}n.style.display="inherit"}if(l.reset(),l.scale(r.finalSize/100,r.finalSize/100),p&&(o[t].n&&(f=-d,m+=r.yOffset,m+=c?1:0,c=!1),this.applyTextPropertiesToMatrix(r,l,o[t].line,f,m),f+=o[t].l||0,f+=d),h){var v;if(1===(u=this.globalData.fontManager.getCharData(r.finalText[t],i.fStyle,this.globalData.fontManager.getFontByName(r.f).fFamily)).t)v=new SVGCompElement(u.data,this.globalData,this);else{var b=emptyShapeData;u.data&&u.data.shapes&&(b=u.data),v=new SVGShapeElement(b,this.globalData,this)}this.textSpans[t].glyph=v,v._debug=!0,v.prepareFrame(0),v.renderFrame(),this.textSpans[t].childSpan.appendChild(v.layerElement),this.textSpans[t].childSpan.setAttribute("transform","scale("+r.finalSize/100+","+r.finalSize/100+")")}else p&&n.setAttribute("transform","translate("+l.props[12]+","+l.props[13]+")"),n.textContent=o[t].val,n.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve")}p&&n&&n.setAttribute("d","")}else{var P=this.textContainer,E="start";switch(r.j){case 1:E="end";break;case 2:E="middle";break;default:E="start"}P.setAttribute("text-anchor",E),P.setAttribute("letter-spacing",d);var x=this.buildTextContents(r.finalText);for(e=x.length,m=r.ps?r.ps[1]+r.ascent:0,t=0;t=0;e-=1)(this.completeLayers||this.elements[e])&&this.elements[e].prepareFrame(t-this.layers[e].st);if(this.globalData._mdf)for(e=0;e=0;r-=1)(this.completeLayers||this.elements[r])&&(this.elements[r].prepareFrame(this.renderedFrame-this.layers[r].st),this.elements[r]._mdf&&(this._mdf=!0))}},ICompElement.prototype.renderInnerContent=function(){var t,e=this.layers.length;for(t=0;t=0;i-=1)r=t.transforms[i].transform.mProps.v.props,t.finalTransform.transform(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8],r[9],r[10],r[11],r[12],r[13],r[14],r[15]);t._mdf=a},processSequences:function(t){var e,r=this.sequenceList.length;for(e=0;e=0;a-=1){if((h=this.searchProcessedElement(t[a]))?e[a]=r[h-1]:t[a]._shouldRender=i,"fl"===t[a].ty||"st"===t[a].ty||"gf"===t[a].ty||"gs"===t[a].ty)h?e[a].style.closed=!1:e[a]=this.createStyleElement(t[a],d),m.push(e[a].style);else if("gr"===t[a].ty){if(h)for(o=e[a].it.length,n=0;n=0;s-=1)"tr"===e[s].ty?(a=r[s].transform,this.renderShapeTransform(t,a)):"sh"===e[s].ty||"el"===e[s].ty||"rc"===e[s].ty||"sr"===e[s].ty?this.renderPath(e[s],r[s]):"fl"===e[s].ty?this.renderFill(e[s],r[s],a):"st"===e[s].ty?this.renderStroke(e[s],r[s],a):"gf"===e[s].ty||"gs"===e[s].ty?this.renderGradientFill(e[s],r[s],a):"gr"===e[s].ty?this.renderShape(a,e[s].it,r[s].it):e[s].ty;i&&this.drawLayer()},CVShapeElement.prototype.renderStyledShape=function(t,e){if(this._isFirstFrame||e._mdf||t.transforms._mdf){var r,i,s,a=t.trNodes,n=e.paths,o=n._length;a.length=0;var h=t.transforms.finalTransform;for(s=0;s=1?f=.99:f<=-1&&(f=-.99);var m=l*f,c=Math.cos(p+e.a.v)*m+o[0],d=Math.sin(p+e.a.v)*m+o[1];i=n.createRadialGradient(c,d,0,o[0],o[1],l)}var u=t.g.p,y=e.g.c,g=1;for(a=0;ao&&"xMidYMid slice"===h||nr&&"meet"===a||ir&&"slice"===a)?(t-this.transformCanvas.w*(e/this.transformCanvas.h))/2*this.renderConfig.dpr:"xMax"===o&&(ir&&"slice"===a)?(t-this.transformCanvas.w*(e/this.transformCanvas.h))*this.renderConfig.dpr:0,this.transformCanvas.ty="YMid"===h&&(i>r&&"meet"===a||ir&&"meet"===a||i=0;t-=1)this.elements[t]&&this.elements[t].destroy();this.elements.length=0,this.globalData.canvasContext=null,this.animationItem.container=null,this.destroyed=!0},CanvasRendererBase.prototype.renderFrame=function(t,e){if((this.renderedFrame!==t||!0!==this.renderConfig.clearCanvas||e)&&!this.destroyed&&-1!==t){var r;this.renderedFrame=t,this.globalData.frameNum=t-this.animationItem._isFirstFrame,this.globalData.frameId+=1,this.globalData._mdf=!this.renderConfig.clearCanvas||e,this.globalData.projectInterface.currentFrame=t;var i=this.layers.length;for(this.completeLayers||this.checkLayers(t),r=0;r=0;r-=1)(this.completeLayers||this.elements[r])&&this.elements[r].renderFrame();!0!==this.renderConfig.clearCanvas&&this.restore()}}},CanvasRendererBase.prototype.buildItem=function(t){var e=this.elements;if(!e[t]&&99!==this.layers[t].ty){var r=this.createItem(this.layers[t],this,this.globalData);e[t]=r,r.initExpressions()}},CanvasRendererBase.prototype.checkPendingElements=function(){for(;this.pendingElements.length;){this.pendingElements.pop().checkParenting()}},CanvasRendererBase.prototype.hide=function(){this.animationItem.container.style.display="none"},CanvasRendererBase.prototype.show=function(){this.animationItem.container.style.display="block"},extendPrototype([CanvasRendererBase,ICompElement,CVBaseElement],CVCompElement),CVCompElement.prototype.renderInnerContent=function(){var t,e=this.canvasContext;for(e.beginPath(),e.moveTo(0,0),e.lineTo(this.data.w,0),e.lineTo(this.data.w,this.data.h),e.lineTo(0,this.data.h),e.lineTo(0,0),e.clip(),t=this.layers.length-1;t>=0;t-=1)(this.completeLayers||this.elements[t])&&this.elements[t].renderFrame()},CVCompElement.prototype.destroy=function(){var t;for(t=this.layers.length-1;t>=0;t-=1)this.elements[t]&&this.elements[t].destroy();this.layers=null,this.elements=null},CVCompElement.prototype.createComp=function(t){return new CVCompElement(t,this.globalData,this)},extendPrototype([CanvasRendererBase],CanvasRenderer),CanvasRenderer.prototype.createComp=function(t){return new CVCompElement(t,this.globalData,this)},HBaseElement.prototype={checkBlendMode:function(){},initRendererElement:function(){this.baseElement=createTag(this.data.tg||"div"),this.data.hasMask?(this.svgElement=createNS("svg"),this.layerElement=createNS("g"),this.maskedElement=this.layerElement,this.svgElement.appendChild(this.layerElement),this.baseElement.appendChild(this.svgElement)):this.layerElement=this.baseElement,styleDiv(this.baseElement)},createContainerElements:function(){this.renderableEffectsManager=new CVEffects(this),this.transformedElement=this.baseElement,this.maskedElement=this.layerElement,this.data.ln&&this.layerElement.setAttribute("id",this.data.ln),this.data.cl&&this.layerElement.setAttribute("class",this.data.cl),0!==this.data.bm&&this.setBlendMode()},renderElement:function(){var t=this.transformedElement?this.transformedElement.style:{};if(this.finalTransform._matMdf){var e=this.finalTransform.mat.toCSS();t.transform=e,t.webkitTransform=e}this.finalTransform._opMdf&&(t.opacity=this.finalTransform.mProp.o.v)},renderFrame:function(){this.data.hd||this.hidden||(this.renderTransform(),this.renderRenderable(),this.renderElement(),this.renderInnerContent(),this._isFirstFrame&&(this._isFirstFrame=!1))},destroy:function(){this.layerElement=null,this.transformedElement=null,this.matteElement&&(this.matteElement=null),this.maskManager&&(this.maskManager.destroy(),this.maskManager=null)},createRenderableComponents:function(){this.maskManager=new MaskElement(this.data,this,this.globalData)},addEffects:function(){},setMatte:function(){}},HBaseElement.prototype.getBaseElement=SVGBaseElement.prototype.getBaseElement,HBaseElement.prototype.destroyBaseElement=HBaseElement.prototype.destroy,HBaseElement.prototype.buildElementParenting=BaseRenderer.prototype.buildElementParenting,extendPrototype([BaseElement,TransformElement,HBaseElement,HierarchyElement,FrameElement,RenderableDOMElement],HSolidElement),HSolidElement.prototype.createContent=function(){var t;this.data.hasMask?((t=createNS("rect")).setAttribute("width",this.data.sw),t.setAttribute("height",this.data.sh),t.setAttribute("fill",this.data.sc),this.svgElement.setAttribute("width",this.data.sw),this.svgElement.setAttribute("height",this.data.sh)):((t=createTag("div")).style.width=this.data.sw+"px",t.style.height=this.data.sh+"px",t.style.backgroundColor=this.data.sc),this.layerElement.appendChild(t)},extendPrototype([BaseElement,TransformElement,HSolidElement,SVGShapeElement,HBaseElement,HierarchyElement,FrameElement,RenderableElement],HShapeElement),HShapeElement.prototype._renderShapeFrame=HShapeElement.prototype.renderInnerContent,HShapeElement.prototype.createContent=function(){var t;if(this.baseElement.style.fontSize=0,this.data.hasMask)this.layerElement.appendChild(this.shapesContainer),t=this.svgElement;else{t=createNS("svg");var e=this.comp.data?this.comp.data:this.globalData.compSize;t.setAttribute("width",e.w),t.setAttribute("height",e.h),t.appendChild(this.shapesContainer),this.layerElement.appendChild(t)}this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.shapesContainer,0,[],!0),this.filterUniqueShapes(),this.shapeCont=t},HShapeElement.prototype.getTransformedPoint=function(t,e){var r,i=t.length;for(r=0;r0&&o<1&&f[m].push(this.calculateF(o,t,e,r,i,m)):(h=a*a-4*n*s)>=0&&((l=(-a+bmSqrt(h))/(2*s))>0&&l<1&&f[m].push(this.calculateF(l,t,e,r,i,m)),(p=(-a-bmSqrt(h))/(2*s))>0&&p<1&&f[m].push(this.calculateF(p,t,e,r,i,m))));this.shapeBoundingBox.left=bmMin.apply(null,f[0]),this.shapeBoundingBox.top=bmMin.apply(null,f[1]),this.shapeBoundingBox.right=bmMax.apply(null,f[0]),this.shapeBoundingBox.bottom=bmMax.apply(null,f[1])},HShapeElement.prototype.calculateF=function(t,e,r,i,s,a){return bmPow(1-t,3)*e[a]+3*bmPow(1-t,2)*t*r[a]+3*(1-t)*bmPow(t,2)*i[a]+bmPow(t,3)*s[a]},HShapeElement.prototype.calculateBoundingBox=function(t,e){var r,i=t.length;for(r=0;r=t.x+t.width&&this.currentBBox.height+this.currentBBox.y>=t.y+t.height},HShapeElement.prototype.renderInnerContent=function(){if(this._renderShapeFrame(),!this.hidden&&(this._isFirstFrame||this._mdf)){var t=this.tempBoundingBox,e=999999;if(t.x=e,t.xMax=-e,t.y=e,t.yMax=-e,this.calculateBoundingBox(this.itemsData,t),t.width=t.xMax=0;t-=1){var i=this.hierarchy[t].finalTransform.mProp;this.mat.translate(-i.p.v[0],-i.p.v[1],i.p.v[2]),this.mat.rotateX(-i.or.v[0]).rotateY(-i.or.v[1]).rotateZ(i.or.v[2]),this.mat.rotateX(-i.rx.v).rotateY(-i.ry.v).rotateZ(i.rz.v),this.mat.scale(1/i.s.v[0],1/i.s.v[1],1/i.s.v[2]),this.mat.translate(i.a.v[0],i.a.v[1],i.a.v[2])}if(this.p?this.mat.translate(-this.p.v[0],-this.p.v[1],this.p.v[2]):this.mat.translate(-this.px.v,-this.py.v,this.pz.v),this.a){var s;s=this.p?[this.p.v[0]-this.a.v[0],this.p.v[1]-this.a.v[1],this.p.v[2]-this.a.v[2]]:[this.px.v-this.a.v[0],this.py.v-this.a.v[1],this.pz.v-this.a.v[2]];var a=Math.sqrt(Math.pow(s[0],2)+Math.pow(s[1],2)+Math.pow(s[2],2)),n=[s[0]/a,s[1]/a,s[2]/a],o=Math.sqrt(n[2]*n[2]+n[0]*n[0]),h=Math.atan2(n[1],o),l=Math.atan2(n[0],-n[2]);this.mat.rotateY(l).rotateX(-h)}this.mat.rotateX(-this.rx.v).rotateY(-this.ry.v).rotateZ(this.rz.v),this.mat.rotateX(-this.or.v[0]).rotateY(-this.or.v[1]).rotateZ(this.or.v[2]),this.mat.translate(this.globalData.compSize.w/2,this.globalData.compSize.h/2,0),this.mat.translate(0,0,this.pe.v);var p=!this._prevMat.equals(this.mat);if((p||this.pe._mdf)&&this.comp.threeDElements){var f,m,c;for(e=this.comp.threeDElements.length,t=0;t=t)return this.threeDElements[e].perspectiveElem;e+=1}return null},HybridRendererBase.prototype.createThreeDContainer=function(t,e){var r,i,s=createTag("div");styleDiv(s);var a=createTag("div");if(styleDiv(a),"3d"===e){(r=s.style).width=this.globalData.compSize.w+"px",r.height=this.globalData.compSize.h+"px";var n="50% 50%";r.webkitTransformOrigin=n,r.mozTransformOrigin=n,r.transformOrigin=n;var o="matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)";(i=a.style).transform=o,i.webkitTransform=o}s.appendChild(a);var h={container:a,perspectiveElem:s,startPos:t,endPos:t,type:e};return this.threeDElements.push(h),h},HybridRendererBase.prototype.build3dContainers=function(){var t,e,r=this.layers.length,i="";for(t=0;t=0;t-=1)this.resizerElem.appendChild(this.threeDElements[t].perspectiveElem)},HybridRendererBase.prototype.addTo3dContainer=function(t,e){for(var r=0,i=this.threeDElements.length;rn?(t=s/this.globalData.compSize.w,e=s/this.globalData.compSize.w,r=0,i=(a-this.globalData.compSize.h*(s/this.globalData.compSize.w))/2):(t=a/this.globalData.compSize.h,e=a/this.globalData.compSize.h,r=(s-this.globalData.compSize.w*(a/this.globalData.compSize.h))/2,i=0);var o=this.resizerElem.style;o.webkitTransform="matrix3d("+t+",0,0,0,0,"+e+",0,0,0,0,1,0,"+r+","+i+",0,1)",o.transform=o.webkitTransform},HybridRendererBase.prototype.renderFrame=SVGRenderer.prototype.renderFrame,HybridRendererBase.prototype.hide=function(){this.resizerElem.style.display="none"},HybridRendererBase.prototype.show=function(){this.resizerElem.style.display="block"},HybridRendererBase.prototype.initItems=function(){if(this.buildAllItems(),this.camera)this.camera.setup();else{var t,e=this.globalData.compSize.w,r=this.globalData.compSize.h,i=this.threeDElements.length;for(t=0;t=o;)t/=2,e/=2,r>>>=1;return(t+r)/e};return b.int32=function(){return 0|v.g(4)},b.quick=function(){return v.g(4)/4294967296},b.double=b,m(c(v.S),t),(d.pass||u||function(t,r,i,s){return s&&(s.S&&p(s,v),t.state=function(){return p(v,{})}),i?(e.random=t,r):t})(b,g,"global"in d?d.global:this==e,d.state)},m(e.random(),t)}function initialize$2(t){seedRandom([],t)}var propTypes={SHAPE:"shape"};function _typeof(t){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},_typeof(t)}var ExpressionManager=function(){var ob={},Math=BMMath,window=null,document=null,XMLHttpRequest=null,fetch=null,frames=null;function $bm_isInstanceOfArray(t){return t.constructor===Array||t.constructor===Float32Array}function isNumerable(t,e){return"number"===t||"boolean"===t||"string"===t||e instanceof Number}function $bm_neg(t){var e=_typeof(t);if("number"===e||"boolean"===e||t instanceof Number)return-t;if($bm_isInstanceOfArray(t)){var r,i=t.length,s=[];for(r=0;rr){var i=r;r=e,e=i}return Math.min(Math.max(t,e),r)}function radiansToDegrees(t){return t/degToRads}var radians_to_degrees=radiansToDegrees;function degreesToRadians(t){return t*degToRads}var degrees_to_radians=radiansToDegrees,helperLengthArray=[0,0,0,0,0,0];function length(t,e){if("number"==typeof t||t instanceof Number)return e=e||0,Math.abs(t-e);var r;e||(e=helperLengthArray);var i=Math.min(t.length,e.length),s=0;for(r=0;r.5?l/(2-n-o):l/(n+o),n){case i:e=(s-a)/l+(s1&&(r-=1),r<1/6?t+6*(e-t)*r:r<.5?e:r<2/3?t+(e-t)*(2/3-r)*6:t}function hslToRgb(t){var e,r,i,s=t[0],a=t[1],n=t[2];if(0===a)e=n,i=n,r=n;else{var o=n<.5?n*(1+a):n+a-n*a,h=2*n-o;e=hue2rgb(h,o,s+1/3),r=hue2rgb(h,o,s),i=hue2rgb(h,o,s-1/3)}return[e,r,i,t[3]]}function linear(t,e,r,i,s){if(void 0!==i&&void 0!==s||(i=e,s=r,e=0,r=1),r=r)return s;var n,o=r===e?0:(t-e)/(r-e);if(!i.length)return i+(s-i)*o;var h=i.length,l=createTypedArray("float32",h);for(n=0;n1){for(i=0;i1?e=1:e<0&&(e=0);var n=t(e);if($bm_isInstanceOfArray(s)){var o,h=s.length,l=createTypedArray("float32",h);for(o=0;odata.k[e].t&&tdata.k[e+1].t-t?(r=e+2,i=data.k[e+1].t):(r=e+1,i=data.k[e].t);break}}-1===r&&(r=e+1,i=data.k[e].t)}else r=0,i=0;var a={};return a.index=r,a.time=i/elem.comp.globalData.frameRate,a}function key(t){var e,r,i;if(!data.k.length||"number"==typeof data.k[0])throw new Error("The property has no keyframe at index "+t);t-=1,e={time:data.k[t].t/elem.comp.globalData.frameRate,value:[]};var s=Object.prototype.hasOwnProperty.call(data.k[t],"s")?data.k[t].s:data.k[t-1].e;for(i=s.length,r=0;rl.length-1)&&(e=l.length-1),i=p-(s=l[l.length-1-e].t)),"pingpong"===t){if(Math.floor((h-s)/i)%2!=0)return this.getValueAtTime((i-(h-s)%i+s)/this.comp.globalData.frameRate,0)}else{if("offset"===t){var f=this.getValueAtTime(s/this.comp.globalData.frameRate,0),m=this.getValueAtTime(p/this.comp.globalData.frameRate,0),c=this.getValueAtTime(((h-s)%i+s)/this.comp.globalData.frameRate,0),d=Math.floor((h-s)/i);if(this.pv.length){for(n=(o=new Array(f.length)).length,a=0;a=p)return this.pv;if(r?s=p+(i=e?Math.abs(this.elem.comp.globalData.frameRate*e):Math.max(0,this.elem.data.op-p)):((!e||e>l.length-1)&&(e=l.length-1),i=(s=l[e].t)-p),"pingpong"===t){if(Math.floor((p-h)/i)%2==0)return this.getValueAtTime(((p-h)%i+p)/this.comp.globalData.frameRate,0)}else{if("offset"===t){var f=this.getValueAtTime(p/this.comp.globalData.frameRate,0),m=this.getValueAtTime(s/this.comp.globalData.frameRate,0),c=this.getValueAtTime((i-(p-h)%i+p)/this.comp.globalData.frameRate,0),d=Math.floor((p-h)/i)+1;if(this.pv.length){for(n=(o=new Array(f.length)).length,a=0;a1?(s+t-a)/(e-1):1,o=0,h=0;for(r=this.pv.length?createTypedArray("float32",this.pv.length):0;on){var p=o,f=r.c&&o===h-1?0:o+1,m=(n-l)/a[o].addedLength;i=bez.getPointInSegment(r.v[p],r.v[f],r.o[p],r.i[f],m,a[o]);break}l+=a[o].addedLength,o+=1}return i||(i=r.c?[r.v[0][0],r.v[0][1]]:[r.v[r._length-1][0],r.v[r._length-1][1]]),i},vectorOnPath:function(t,e,r){1==t?t=this.v.c:0==t&&(t=.999);var i=this.pointOnPath(t,e),s=this.pointOnPath(t+.001,e),a=s[0]-i[0],n=s[1]-i[1],o=Math.sqrt(Math.pow(a,2)+Math.pow(n,2));return 0===o?[0,0]:"tangent"===r?[a/o,n/o]:[-n/o,a/o]},tangentOnPath:function(t,e){return this.vectorOnPath(t,e,"tangent")},normalOnPath:function(t,e){return this.vectorOnPath(t,e,"normal")},setGroupProperty:expressionHelpers.setGroupProperty,getValueAtTime:expressionHelpers.getStaticValueAtTime},extendPrototype([l],o),extendPrototype([l],h),h.prototype.getValueAtTime=function(t){return this._cachingAtTime||(this._cachingAtTime={shapeValue:shapePool.clone(this.pv),lastIndex:0,lastTime:initialDefaultFrame}),t*=this.elem.globalData.frameRate,(t-=this.offsetTime)!==this._cachingAtTime.lastTime&&(this._cachingAtTime.lastIndex=this._cachingAtTime.lastTime +
+ +
+
+ +
{{ currentYear }}年{{ currentMonth }}月
+ +
+ +
+ {{ item }} +
+
+ +
+ +
+ 已签到 + 可签到 + 未开始 +
+ +
+ +
+
+ {{ selectedDate ? selectedDate + ' 的活动时段' : '活动时段' }} +
+
+
+
+ +
+
+ {{ formatTime(item.courseStartTime) }} - {{ formatTime(item.courseEndTime) }} +
+
+ + {{ row.courseLocation }} +
+
+
+ 已签到 + + + {{ getScheduleStatus(item) }} + +
+
+
+ +
当天暂无签到时段
+
当前日期没有需要签到的活动安排
+
+
+
+
+ + + + +
+ + + + + diff --git a/src/main/resources/static/components/module/activity/UserDataScope.vue b/src/main/resources/static/components/module/activity/UserDataScope.vue index 1786fce5..a187fed9 100644 --- a/src/main/resources/static/components/module/activity/UserDataScope.vue +++ b/src/main/resources/static/components/module/activity/UserDataScope.vue @@ -114,7 +114,7 @@
- 搜索 + 搜索
@@ -133,7 +133,8 @@ 删除{{ currentGroupName }} - + @@ -224,8 +224,8 @@ layout("/layouts/platform.html"){ - 取消 提交 + 取消 diff --git a/src/main/resources/views/platform/zhgh/democratic/suggestion/tc/transact/delegation/index.html b/src/main/resources/views/platform/zhgh/democratic/suggestion/tc/transact/delegation/index.html index 44f5d0b6..f8fc2914 100644 --- a/src/main/resources/views/platform/zhgh/democratic/suggestion/tc/transact/delegation/index.html +++ b/src/main/resources/views/platform/zhgh/democratic/suggestion/tc/transact/delegation/index.html @@ -100,10 +100,10 @@ layout("/layouts/platform.html"){ - 取消 - 退回重新填写 - 建议撤销 同意 + 建议撤销 + 退回重新填写 + 取消 diff --git a/src/main/resources/views/platform/zhgh/democratic/suggestion/tc/transact/schoolLeaderApproval/index.html b/src/main/resources/views/platform/zhgh/democratic/suggestion/tc/transact/schoolLeaderApproval/index.html index 50577e91..1ee807e7 100644 --- a/src/main/resources/views/platform/zhgh/democratic/suggestion/tc/transact/schoolLeaderApproval/index.html +++ b/src/main/resources/views/platform/zhgh/democratic/suggestion/tc/transact/schoolLeaderApproval/index.html @@ -127,9 +127,9 @@ layout("/layouts/platform.html"){ - 取消 - 退回重新答复 同意 + 退回重新答复 + 取消 diff --git a/src/main/resources/views/platform/zhgh/democratic/suggestion/tc/transact/seconded/index.html b/src/main/resources/views/platform/zhgh/democratic/suggestion/tc/transact/seconded/index.html index 3ea98315..13aec51e 100644 --- a/src/main/resources/views/platform/zhgh/democratic/suggestion/tc/transact/seconded/index.html +++ b/src/main/resources/views/platform/zhgh/democratic/suggestion/tc/transact/seconded/index.html @@ -95,9 +95,9 @@ layout("/layouts/platform.html"){ - 取消 - 拒绝 同意 + 拒绝 + 取消 diff --git a/src/main/resources/views/platform/zhgh/democratic/suggestion/tc/transact/unitRead/index.html b/src/main/resources/views/platform/zhgh/democratic/suggestion/tc/transact/unitRead/index.html index f0a52dc3..fbb67690 100644 --- a/src/main/resources/views/platform/zhgh/democratic/suggestion/tc/transact/unitRead/index.html +++ b/src/main/resources/views/platform/zhgh/democratic/suggestion/tc/transact/unitRead/index.html @@ -132,8 +132,8 @@ layout("/layouts/platform.html"){ - 取消 提交 + 取消 diff --git a/src/main/resources/views/platform/zhgh/democratic/suggestion/tc/transact/unitReply/index.html b/src/main/resources/views/platform/zhgh/democratic/suggestion/tc/transact/unitReply/index.html index ed7793e1..c6116ce6 100644 --- a/src/main/resources/views/platform/zhgh/democratic/suggestion/tc/transact/unitReply/index.html +++ b/src/main/resources/views/platform/zhgh/democratic/suggestion/tc/transact/unitReply/index.html @@ -149,8 +149,8 @@ layout("/layouts/platform.html"){ - 取消 提交 + 取消 diff --git a/src/main/resources/views/platform/zhgh/democratic/suggestion/wc/transact/committeeFiling/index.html b/src/main/resources/views/platform/zhgh/democratic/suggestion/wc/transact/committeeFiling/index.html index e8b8d8ba..318d2a0c 100644 --- a/src/main/resources/views/platform/zhgh/democratic/suggestion/wc/transact/committeeFiling/index.html +++ b/src/main/resources/views/platform/zhgh/democratic/suggestion/wc/transact/committeeFiling/index.html @@ -143,9 +143,9 @@ layout("/layouts/platform.html"){ --> - 取消 - 退回重新填写 提交 + 退回重新填写 + 取消 @@ -217,8 +217,8 @@ layout("/layouts/platform.html"){ --> - 取消 提交 + 取消 diff --git a/src/main/resources/views/platform/zhgh/democratic/suggestion/wc/transact/committeeFilingUnit/index.html b/src/main/resources/views/platform/zhgh/democratic/suggestion/wc/transact/committeeFilingUnit/index.html index 8be8d806..c25da370 100644 --- a/src/main/resources/views/platform/zhgh/democratic/suggestion/wc/transact/committeeFilingUnit/index.html +++ b/src/main/resources/views/platform/zhgh/democratic/suggestion/wc/transact/committeeFilingUnit/index.html @@ -151,8 +151,8 @@ layout("/layouts/platform.html"){ --> - 取消 提交 + 取消 @@ -224,8 +224,8 @@ layout("/layouts/platform.html"){ --> - 取消 提交 + 取消 diff --git a/src/main/resources/views/platform/zhgh/democratic/suggestion/wc/transact/delegation/index.html b/src/main/resources/views/platform/zhgh/democratic/suggestion/wc/transact/delegation/index.html index f738d236..e2e6092d 100644 --- a/src/main/resources/views/platform/zhgh/democratic/suggestion/wc/transact/delegation/index.html +++ b/src/main/resources/views/platform/zhgh/democratic/suggestion/wc/transact/delegation/index.html @@ -100,10 +100,10 @@ layout("/layouts/platform.html"){ - 取消 - 退回重新填写 - 建议撤销 同意 + 建议撤销 + 退回重新填写 + 取消 diff --git a/src/main/resources/views/platform/zhgh/democratic/suggestion/wc/transact/schoolLeaderApproval/index.html b/src/main/resources/views/platform/zhgh/democratic/suggestion/wc/transact/schoolLeaderApproval/index.html index 72ee58a9..6157f31f 100644 --- a/src/main/resources/views/platform/zhgh/democratic/suggestion/wc/transact/schoolLeaderApproval/index.html +++ b/src/main/resources/views/platform/zhgh/democratic/suggestion/wc/transact/schoolLeaderApproval/index.html @@ -127,9 +127,9 @@ layout("/layouts/platform.html"){ --> - 取消 - 退回重新答复 同意 + 退回重新答复 + 取消 diff --git a/src/main/resources/views/platform/zhgh/democratic/suggestion/wc/transact/seconded/index.html b/src/main/resources/views/platform/zhgh/democratic/suggestion/wc/transact/seconded/index.html index ced43d5b..56a45822 100644 --- a/src/main/resources/views/platform/zhgh/democratic/suggestion/wc/transact/seconded/index.html +++ b/src/main/resources/views/platform/zhgh/democratic/suggestion/wc/transact/seconded/index.html @@ -94,9 +94,9 @@ layout("/layouts/platform.html"){ - 取消 - 拒绝 同意 + 拒绝 + 取消 diff --git a/src/main/resources/views/platform/zhgh/democratic/suggestion/wc/transact/unitRead/index.html b/src/main/resources/views/platform/zhgh/democratic/suggestion/wc/transact/unitRead/index.html index bc9cd85c..e15a4c96 100644 --- a/src/main/resources/views/platform/zhgh/democratic/suggestion/wc/transact/unitRead/index.html +++ b/src/main/resources/views/platform/zhgh/democratic/suggestion/wc/transact/unitRead/index.html @@ -132,8 +132,8 @@ layout("/layouts/platform.html"){ - 取消 提交 + 取消 diff --git a/src/main/resources/views/platform/zhgh/democratic/suggestion/wc/transact/unitReply/index.html b/src/main/resources/views/platform/zhgh/democratic/suggestion/wc/transact/unitReply/index.html index 0d3c5e41..cb1acfb3 100644 --- a/src/main/resources/views/platform/zhgh/democratic/suggestion/wc/transact/unitReply/index.html +++ b/src/main/resources/views/platform/zhgh/democratic/suggestion/wc/transact/unitReply/index.html @@ -149,8 +149,8 @@ layout("/layouts/platform.html"){ --> - 取消 提交 + 取消 diff --git a/src/main/resources/views/platform/zhgh/democratic/suggestionBox/xgh/index.html b/src/main/resources/views/platform/zhgh/democratic/suggestionBox/xgh/index.html index 2ead1007..7f0351a4 100644 --- a/src/main/resources/views/platform/zhgh/democratic/suggestionBox/xgh/index.html +++ b/src/main/resources/views/platform/zhgh/democratic/suggestionBox/xgh/index.html @@ -83,10 +83,10 @@ layout("/layouts/platform.html"){ - 取消 - 退回到发起人 - 拒绝申请 同意申请 + 拒绝申请 + 退回到发起人 + 取消 diff --git a/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/changeRecord/index.html b/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/changeRecord/index.html new file mode 100644 index 00000000..528c71f4 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/changeRecord/index.html @@ -0,0 +1,155 @@ + + +
+ + + +
+ + + + diff --git a/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/manage/index.html b/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/manage/index.html index be2588bb..a96b065a 100644 --- a/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/manage/index.html +++ b/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/manage/index.html @@ -39,7 +39,7 @@ layout("/layouts/platform.html"){ - 根据单位分配代表团 + {{ allocateButtonText }} 导入代表 新增代表 @@ -138,19 +138,34 @@ layout("/layouts/platform.html"){ roleOptions: [], formRules: {}, - excelImportDialog: false + excelImportDialog: false, + compositionMode: "${config.dbtzc!'unit'}" + } + }, + computed: { + compositionLabel() { + return this.compositionMode === "union" ? "分工会" : "单位" + }, + allocateButtonText() { + return "根据" + this.compositionLabel + "分配代表团" } }, methods: { doAllocateDelegation() { - this.$confirm("确定要一键给没有代表团的代表,根据单位所在代表团设置代表团吗?", "提示", { + this.$confirm("确定要给尚未归团的代表,根据" + this.compositionLabel + "组成关系设置代表团吗?", "提示", { confirmButtonText: "确定", cancelButtonText: "取消", type: "info" }).then(() => { this.$axios.post(loc() + "/doAllocateDelegation", {sessionId: this.pageForm.sessionId}).then((res) => { if (res.code === 0) { - this.$message.success(res.msg) + let message = "已分配" + res.data.assignedCount + "人" + if (res.data.unassignedCount > 0) { + message += ",另有" + res.data.unassignedCount + "人未找到对应代表团" + this.$message.warning(message) + } else { + this.$message.success(message) + } this.doSearch() } }) diff --git a/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/push/dwSjAudit.html b/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/push/dwSjAudit.html index 76589605..33040f8c 100644 --- a/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/push/dwSjAudit.html +++ b/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/push/dwSjAudit.html @@ -147,9 +147,9 @@ layout("/layouts/platform.html"){ - 取消 - 退回修改 同意 + 退回修改 + 取消 diff --git a/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/push/push-attendance-dialog.js b/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/push/push-attendance-dialog.js index 355a0fa9..677d1300 100644 --- a/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/push/push-attendance-dialog.js +++ b/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/push/push-attendance-dialog.js @@ -62,7 +62,10 @@ const pushAttendanceDialog = { } }, filterMethod(query, item) { - return item.userName.indexOf(query) > -1 + // 代表预选支持按姓名或工号筛选,兼容人员信息字段为空的情况。 + const userName = item.userName || "" + const loginName = item.loginName || "" + return userName.indexOf(query) > -1 || loginName.indexOf(query) > -1 }, async onConfirm() { const loading = createLoading('正在提交中') diff --git a/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/push/push-formal-dialog.js b/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/push/push-formal-dialog.js index 485f676f..6c5ae3aa 100644 --- a/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/push/push-formal-dialog.js +++ b/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/push/push-formal-dialog.js @@ -79,7 +79,10 @@ const pushFormalDialog = { } }, filterMethod(query, item) { - return item.userName.indexOf(query) > -1 + // 代表预选支持按姓名或工号筛选,兼容人员信息字段为空的情况。 + const userName = item.userName || "" + const loginName = item.loginName || "" + return userName.indexOf(query) > -1 || loginName.indexOf(query) > -1 }, async onConfirm() { const loading = createLoading('正在提交中') diff --git a/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegation/headForm.js b/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegation/headForm.js index 27ba148c..8c31612f 100644 --- a/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegation/headForm.js +++ b/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegation/headForm.js @@ -131,7 +131,19 @@ const HEAD_FORM_TEMPLATE = { doSubmitHead() { this.$refs.headFormRef.validate((valid) => { if (valid) { - this.$axios.post("/platform/teacherCongress/delegation/insertHead", this.formData).then((res) => { + // 多选数组必须使用同名参数重复提交,确保后端 String[] 能正确接收全部副团长ID。 + const submitData = new URLSearchParams() + submitData.append("delegationId", this.formData.delegationId) + submitData.append("sessionId", this.formData.sessionId) + submitData.append("userId", this.formData.userId) + if (this.formData.contactUserId) { + submitData.append("contactUserId", this.formData.contactUserId) + } + const viceUserIds = this.formData.viceUserIds || [] + viceUserIds.forEach((viceUserId) => { + submitData.append("viceUserIds", viceUserId) + }) + this.$axios.post("/platform/teacherCongress/delegation/insertHead", submitData).then((res) => { if (res.code === 0) { this.headDialogFormVisible = false this.$message.success(res.msg) diff --git a/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegation/index.html b/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegation/index.html index 735c3a3d..b1ce9208 100644 --- a/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegation/index.html +++ b/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegation/index.html @@ -35,7 +35,7 @@ layout("/layouts/platform.html"){ 设置团长 - 设置组成单位 + {{ compositionButtonText }} 删除 @@ -46,11 +46,12 @@ layout("/layouts/platform.html"){ diff --git a/src/main/resources/views/platform/zhgh/staffmanage/member/change/branchunionaudit/index.html b/src/main/resources/views/platform/zhgh/staffmanage/member/change/branchunionaudit/index.html index b53e2637..d78a8428 100644 --- a/src/main/resources/views/platform/zhgh/staffmanage/member/change/branchunionaudit/index.html +++ b/src/main/resources/views/platform/zhgh/staffmanage/member/change/branchunionaudit/index.html @@ -63,10 +63,10 @@ layout("/layouts/platform.html"){ - 取消 - 退回到发起人 - 拒绝申请 同意申请 + 拒绝申请 + 退回到发起人 + 取消 diff --git a/src/main/resources/views/platform/zhgh/staffmanage/member/change/common/memberAllChangeInfo.js b/src/main/resources/views/platform/zhgh/staffmanage/member/change/common/memberAllChangeInfo.js index daa4343f..63643007 100644 --- a/src/main/resources/views/platform/zhgh/staffmanage/member/change/common/memberAllChangeInfo.js +++ b/src/main/resources/views/platform/zhgh/staffmanage/member/change/common/memberAllChangeInfo.js @@ -8,16 +8,16 @@ const MEMBER_ALL_CHANGE_INFO = { {{ viewData.sex }} {{ viewData.nation }} - {{ $moment(viewData.birthday).format("YYYY年MM月DD日") }} + {{ viewData.birthday ? $moment(viewData.birthday).format("YYYY年MM月DD日") : "" }} {{ viewData.political }} {{ viewData.education }} {{ viewData.academicDegree }} {{ viewData.position }} - {{ viewData.unitname }} - {{ viewData.unionname }} - {{ viewData.campus }} + {{ viewData.unitName }} + {{ viewData.unionName }} + {{ viewData.campusName }} {{ viewData.idCard }} {{ viewData.mobile }} diff --git a/src/main/resources/views/platform/zhgh/staffmanage/member/change/common/memberChange.js b/src/main/resources/views/platform/zhgh/staffmanage/member/change/common/memberChange.js index a321f2f0..fae0f786 100644 --- a/src/main/resources/views/platform/zhgh/staffmanage/member/change/common/memberChange.js +++ b/src/main/resources/views/platform/zhgh/staffmanage/member/change/common/memberChange.js @@ -155,12 +155,12 @@ const MEMBER_CHANGE = { style="width: 100%"> - - - - - + + + + + + diff --git a/src/main/resources/views/platform/zhgh/staffmanage/member/statistics/personType/index.html b/src/main/resources/views/platform/zhgh/staffmanage/member/statistics/personType/index.html new file mode 100644 index 00000000..f55c8b99 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/staffmanage/member/statistics/personType/index.html @@ -0,0 +1,296 @@ + + +
+ + + +
+ + + diff --git a/src/main/resources/views/platform/zhgh/staffmanage/sourcechange/pending/index.html b/src/main/resources/views/platform/zhgh/staffmanage/sourcechange/pending/index.html new file mode 100644 index 00000000..f1dbf793 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/staffmanage/sourcechange/pending/index.html @@ -0,0 +1,450 @@ + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 批量变更 + + 待确认 + 已确认 + +
+
+ + + + + + + + + + + + + + + + + + + +
+
+ + +
+ + + + + + + + + + + +
+ + + diff --git a/src/main/resources/views/platform/zhgh/staffmanage/sourcechange/pending/memberChange.html b/src/main/resources/views/platform/zhgh/staffmanage/sourcechange/pending/memberChange.html new file mode 100644 index 00000000..0fb8eaa1 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/staffmanage/sourcechange/pending/memberChange.html @@ -0,0 +1,232 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 会员 + 非会员 + + + + + + + 福利会员 + 非福利会员 + + + + + + + + + + + + + + 返回 + 提交变更 + + diff --git a/src/main/resources/views/platform/zhgh/staffmanage/sourcechange/pending/memberChange.js b/src/main/resources/views/platform/zhgh/staffmanage/sourcechange/pending/memberChange.js new file mode 100644 index 00000000..f1703c7d --- /dev/null +++ b/src/main/resources/views/platform/zhgh/staffmanage/sourcechange/pending/memberChange.js @@ -0,0 +1,141 @@ +/** + * 待确认人员变更页面逻辑。 + * 该对象作为页面 mixin 使用,不注册 Vue 子组件,也不包含审批流程相关处理。 + */ +const PENDING_MEMBER_CHANGE = { + data() { + return { + pendingChangeUser: {}, + pendingChangeForm: { + families: [] + }, + pendingChangeRules: { + username: [{required: false, message: "必填", trigger: ["change", "blur"]}], + sex: [{required: false, message: "必填", trigger: ["change", "blur"]}] + }, + pendingPersonTypeOptions: [], + pendingThreeUnits: [], + pendingChangeReadonly: false, + pendingChangeLoading: false, + pendingChangeLoadingUserId: "" + } + }, + methods: { + /** 编辑模式仅允许修改人员类型;查看模式下所有字段均为只读。 */ + pendingAllowFields(prop) { + return this.pendingChangeReadonly || prop !== "personType" + }, + + /** 从人员类型字典中仅保留待确认业务允许变更的两种类型。 */ + loadPendingPersonTypeOptions() { + return this.$businessTool.getDictOptions("USER_PERSON_TYPE").then((options) => { + const allowedNames = ["离退休人员", "其他"] + this.pendingPersonTypeOptions = (options || []).filter((item) => allowedNames.includes(item.name)) + }) + }, + + /** 初始化人员详情数据;已确认记录进入只读模式,不再提供编辑能力。 */ + async initPendingMemberChange(userId, readonly) { + this.pendingChangeReadonly = readonly === true + const resp = await $.post("/platform/member/change/apply/getUserByIdForMemberChange", {userId: userId}) + if (resp.code !== 0 || !resp.data) { + throw new Error(resp.msg || "未获取到人员基础信息") + } + + this.pendingChangeUser = resp.data + this.fillPendingChangeForm(resp.data) + await this.loadPendingThreeUnits() + }, + + /** 清理待确认人员变更页面状态,避免返回后残留上一次请求数据。 */ + resetPendingMemberChange() { + this.pendingChangeUser = {} + this.pendingChangeForm = {families: []} + this.pendingThreeUnits = [] + this.pendingChangeReadonly = false + this.pendingChangeLoading = false + this.pendingChangeLoadingUserId = "" + if (this.$refs.pendingChangeFormRef) { + this.$refs.pendingChangeFormRef.clearValidate() + } + }, + + /** 将人员基础信息转换为待确认变更表单数据。 */ + fillPendingChangeForm(user) { + const unit = user.unit || {} + const union = user.union || {} + const form = { + userId: user.id, + username: user.username, + loginname: user.loginname, + sex: user.sex, + member: user.member === 1 || user.member === true, + welfareMember: user.welfareMember === 1 || user.welfareMember === true, + nation: user.nation, + birthday: user.birthday, + political: user.political, + education: user.education, + academicDegree: user.academicDegree, + position: user.position, + unitId: unit.id ? String(unit.id) : null, + unitName: unit.name || null, + unionId: union.id || null, + unionName: union.name || null, + campus: user.campus, + threeUnitId: user.threeUnitId, + idCard: user.idCard, + mobile: user.mobile, + email: user.email, + userState: user.userState, + personType: user.personType, + preparedBy: user.preparedBy, + userAttribute: user.userAttribute, + aidFundMemberUserType: user.aidFundMemberUserType, + retireDate: user.retireDate, + welfareStopDate: user.welfareStopDate, + arrivalAtSchoolDate: user.arrivalAtSchoolDate, + families: user.families || [], + personalData: user.personalData + } + this.pendingChangeForm = form + }, + + /** 查询人员所属二级单位下的三级单位。 */ + loadPendingThreeUnits() { + this.pendingThreeUnits = [] + if (!this.pendingChangeForm.unitId) { + this.$message.warning("当前人员未配置所属单位,无法查询三级单位") + return Promise.resolve() + } + return this.$axios.post("/platform/sys/unit/child", {pid: this.pendingChangeForm.unitId}) + .then((resp) => { + if (resp.code === 0) { + this.pendingThreeUnits = resp.data || [] + } else { + this.$message.error(resp.msg || "三级单位查询失败") + } + }) + .catch(() => { + this.$message.error("三级单位查询失败,请稍后重试") + }) + }, + + /** 校验表单后调用待确认人员专用接口直接完成变更。 */ + submitPendingMemberChange() { + this.$refs.pendingChangeFormRef.validate((valid) => { + if (!valid) { + return + } + this.$confirm("提交后将直接更新人员信息,确定提交本次变更吗?", "提示", {type: "warning"}) + .then(() => { + const submitData = Object.assign({}, this.pendingChangeForm) + if (submitData.families) { + submitData.families = JSON.stringify(submitData.families) + } + this.doSubmitPendingMemberChange(submitData) + }) + .catch(() => {}) + }) + } + } +} diff --git a/src/main/resources/views/platform/zhgh/welfare/projectMange/index.html b/src/main/resources/views/platform/zhgh/welfare/projectMange/index.html index f6c89a5a..99ddf416 100644 --- a/src/main/resources/views/platform/zhgh/welfare/projectMange/index.html +++ b/src/main/resources/views/platform/zhgh/welfare/projectMange/index.html @@ -75,6 +75,7 @@ layout("/layouts/platform.html"){ 生成福利名单 + 清空福利名单 编辑 删除 @@ -88,6 +89,14 @@ layout("/layouts/platform.html"){