diff --git a/config/db/V3.0__fuse_add_table.sql b/config/db/V3.0__fuse_add_table.sql new file mode 100644 index 00000000..8b9b18e0 --- /dev/null +++ b/config/db/V3.0__fuse_add_table.sql @@ -0,0 +1,33 @@ +CREATE TABLE `tb_fuse` ( + `id` bigint(20) NOT NULL COMMENT '主键', + `name` varchar(128) DEFAULT NULL COMMENT '融合服务名称', + `description` varchar(128) DEFAULT NULL COMMENT '融合服务描述', + `application_area` varchar(128) DEFAULT NULL COMMENT '应用领域', + `dept_id` bigint(20) DEFAULT NULL COMMENT '所属部门', + `dept_user` varchar(128) DEFAULT NULL COMMENT '部门联系人', + `mobile` varchar(20) DEFAULT NULL COMMENT '部门联系人电话', + `provider` varchar(128) DEFAULT NULL COMMENT '服务商', + `provider_user` varchar(128) DEFAULT NULL COMMENT '服务商联系人', + `provider_mobile` varchar(20) DEFAULT NULL COMMENT '服务商联系人电话', + `creator` bigint(20) DEFAULT NULL COMMENT '创建人', + `create_date` datetime DEFAULT NULL COMMENT '创建时间', + `updater` bigint(20) DEFAULT NULL COMMENT '修改人', + `update_date` datetime DEFAULT NULL COMMENT '修改时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='融合服务表'; + +CREATE TABLE `tb_fuse_resource` ( + `id` bigint(20) NOT NULL COMMENT '主键', + `fuse_id` bigint(20) NOT NULL COMMENT '融合id', + `resource_id` bigint(20) NOT NULL COMMENT '资源id', + `sequence` varchar(10) DEFAULT NULL COMMENT '顺序', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='资源融合关系表'; + +CREATE TABLE `tb_fuse_attr` ( + `id` bigint(20) NOT NULL COMMENT '主键', + `fuse_id` bigint(20) DEFAULT NULL COMMENT '融合id', + `attr_type` varchar(128) DEFAULT NULL COMMENT '属性类型', + `attr_value` varchar(128) DEFAULT NULL COMMENT '属性值', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='融合资源属性表'; \ No newline at end of file diff --git a/doc/能力超市版本更新日志.md b/doc/能力超市版本更新日志.md new file mode 100644 index 00000000..ae98ae05 --- /dev/null +++ b/doc/能力超市版本更新日志.md @@ -0,0 +1,149 @@ +- v0.8.0 + +更新内容: + +1. 新增能力云图模块;平台自有数据对接完毕,外部对接内容以西海岸项目提供接口对接。 +2. 新增区市站点模块; +3. 新增赋能案例模块; +4. 更新能力上架模块;更新智能算法与应用资源上架页。 +5. 更新能力详情模块;更新智能算法与应用资源详情页。 +6. 更新导航栏;依据模块新增调整导航栏,个人中心通过点击用户名打开,后台管理通过点击齿轮图标打开。 +7. 更新底部栏;支持通过读取配置文件,更改底部栏信息。 +8. 更新单点登录配置;支持通过配置关闭单点登录功能。 + + + +------------------ + + + +- v0.8.0.1 + +更新内容: + +1. 修复登录白屏问题 +2. 修复平台弱口令问题 + + + + + +--------------- + + + +- v0.8.1.dev + +更新内容: + +1. 新增数据资源对接 +2. 新增消息中心模块 +3. 新增算法比对模块 +4. 新增我的浏览模块 +5. 更新能力申请模块 +6. 更新能力集市-基础设施模块 +7. 更新区市站点模块,增加统计数据可配置功能。 +8. 更新赋能案例,新增后台赋能案例增删改查,门户读取后台管理中的相关模块数据。 +9. 更新申购车模块 + + + +----------------- + + + +- v0.8.1.1.release(本地测试环境测试) + +更新内容: + +1. 新增数据资源对接,市局对接合作伙伴列表查询页 +2. 新增消息中心模块,模块入口为导航栏“铃铛按钮”内,点击“查看更多” +3. 新增算法比对模块,模块入口为能力集市中的PK按钮。 +4. 新增我的浏览模块,模块入口为个人中心-我的浏览 +5. 更新能力申请模块,入口有三个:1).能力查询页 2).能力详情页3).申购车 +6. 更新能力集市-基础设施模块,新增视频资源模块、云资源模块、感知资源模块,目前视频资源进行对接,提供按组织机构、按模糊查询、按地图地理位置、按视频标签四个维度进行视频资源筛选,新增视频资源添加至购物车、一键申请功能。 +7. 更新区市站点模块,增加统计数据可配置功能。 +8. 更新赋能案例,新增后台赋能案例增删改查,门户读取后台管理中的相关模块数据。 +9. 更新申购车模块,样式与功能均有更新。 + +-------------------- + + + + + +- v0.8.1.2.release(西海岸部署修复) + +1. 修复本地测试P1、P2问题 +2. 修复云图调用市局接口的问题 + + + +--------------- + + + +- v0.8.1.3.release(市局部署修复) + +1. 修复市局接口报错问题 +2. 修复市局配置数据不全问题 +3. 修复审核流程字段验证bug +4. 其他旧数据格式导致的展示类问题 + + + +------------ + + + + + + + +## 后续内容 + + + +- v0.8.1.4 + +1. 新增数据资源对接 +2. 新增消息中心模块 +3. 新增算法比对模块,模块入口为能力集市中的PK按钮。 +4. 新增我的浏览模块 +5. 更新能力申请模块 +6. 更新能力集市-基础设施模块 +7. 更新区市站点模块,增加统计数据可配置功能。 +8. 更新赋能案例,新增后台赋能案例增删改查,门户读取后台管理中的相关模块数据。 +9. 更新申购车模块 + + + +------------------- + + + +- v0.8.2.dev + +更新内容: + +1. 新增工作台 + +2. 新增后台能力统计 + + + + + + + + + + + + + + + + + +|| 新增、修改、删除、解决的重点bug; \ No newline at end of file diff --git a/renren-admin/src/main/java/io/renren/common/aspect/ActivitiNoticeAspect.java b/renren-admin/src/main/java/io/renren/common/aspect/ActivitiNoticeAspect.java index f8b1ed1e..8d0aba13 100644 --- a/renren-admin/src/main/java/io/renren/common/aspect/ActivitiNoticeAspect.java +++ b/renren-admin/src/main/java/io/renren/common/aspect/ActivitiNoticeAspect.java @@ -34,6 +34,8 @@ import java.lang.reflect.Method; import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CopyOnWriteArraySet; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; /** * 流程流转消息通知切面 @@ -41,6 +43,8 @@ import java.util.concurrent.CopyOnWriteArraySet; @Aspect @Component public class ActivitiNoticeAspect { + private static Integer cpuNUm = Runtime.getRuntime().availableProcessors(); + private static final ExecutorService executor = Executors.newFixedThreadPool(cpuNUm); private static Logger logger = LoggerFactory.getLogger(ActivitiNoticeAspect.class); @Autowired private SysNoticeService sysNoticeService; @@ -175,21 +179,20 @@ public class ActivitiNoticeAspect { dto.setCreateDate(new Date()); dto.setFrom("通知"); sysNoticeService.save(dto); - }).thenRunAsync(() -> { - // 防止重放 - new Thread(() -> { - try { - Thread.sleep(200); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } finally { - work_.remove(TaskListener.EVENTNAME_COMPLETE + kv.get("id").toString()); - } - }).start(); - }); - + }, executor); } catch (Exception e) { - + logger.error("发送通知消息异常", e); + } finally { + // 防止重放 + new Thread(() -> { + try { + Thread.sleep(200); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } finally { + work_.remove(TaskListener.EVENTNAME_COMPLETE + kv.get("id").toString()); + } + }).start(); } } @@ -254,8 +257,9 @@ public class ActivitiNoticeAspect { dto.setSenderDate(new Date()); dto.setCreator(sysUserService.getByUsername("admin").getId()); dto.setCreateDate(new Date()); + dto.setFrom("通知"); sysNoticeService.save(dto); - }).thenRunAsync(() -> { + }, executor).thenRunAsync(() -> { logger.error("大数据局名称:" + bigDateDeptName); SysDeptDTO deptDTO = sysDeptService.getByName(bigDateDeptName); logger.error("deptDTOId:" + deptDTO.getId()); @@ -276,22 +280,23 @@ public class ActivitiNoticeAspect { dto.setSenderDate(new Date()); dto.setCreator(sysUserService.getByUsername("admin").getId()); dto.setCreateDate(new Date()); + dto.setFrom("通知"); sysNoticeService.save(dto); }); - }).thenRunAsync(() -> { - // 防止重放 - new Thread(() -> { - try { - Thread.sleep(200); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } finally { - work_.remove(ExecutionListener.EVENTNAME_END + kv.get("id").toString()); - } - }).start(); - }); + }, executor); } catch (Exception exception) { logger.error("发送通知消息异常", exception); + } finally { + // 防止重放 + new Thread(() -> { + try { + Thread.sleep(200); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } finally { + work_.remove(ExecutionListener.EVENTNAME_END + kv.get("id").toString()); + } + }).start(); } } @@ -339,7 +344,7 @@ public class ActivitiNoticeAspect { dto.setCreateDate(new Date()); dto.setFrom("通知"); sysNoticeService.save(dto); - }).thenRunAsync(() -> { // 审批者 + }, executor).thenRunAsync(() -> { // 审批者 SysUserDTO owner = sysUserService.get(Long.valueOf(finalCreator)); String content = "【通知】" + owner.getRealName() + "发起的流程" + activitiNoticeOperation.process() + "已进入审核节点:" + activitiNoticeOperation.value() + ";当前审核人指派为您"; SysNoticeDTO dto = new SysNoticeDTO(); @@ -355,7 +360,7 @@ public class ActivitiNoticeAspect { dto.setCreateDate(new Date()); dto.setFrom("通知"); sysNoticeService.save(dto); - }); + }, executor); } catch (Exception e) { logger.error("发送通知消息异常", e); } finally { diff --git a/renren-admin/src/main/java/io/renren/common/config/RestTemplateConfig.java b/renren-admin/src/main/java/io/renren/common/config/RestTemplateConfig.java index 6b49e6aa..c68a171f 100644 --- a/renren-admin/src/main/java/io/renren/common/config/RestTemplateConfig.java +++ b/renren-admin/src/main/java/io/renren/common/config/RestTemplateConfig.java @@ -30,6 +30,7 @@ public class RestTemplateConfig { SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); factory.setReadTimeout(2000);//单位为ms factory.setConnectTimeout(500);//单位为ms + factory.setOutputStreaming(false); // SocketAddress address = new InetSocketAddress("127.0.0.1", 8888); // Proxy proxy = new Proxy(Proxy.Type.HTTP, address); diff --git a/renren-admin/src/main/java/io/renren/common/config/TomcatConfig.java b/renren-admin/src/main/java/io/renren/common/config/TomcatConfig.java index a0acb657..860cbd37 100644 --- a/renren-admin/src/main/java/io/renren/common/config/TomcatConfig.java +++ b/renren-admin/src/main/java/io/renren/common/config/TomcatConfig.java @@ -24,7 +24,7 @@ public class TomcatConfig { factory.addConnectorCustomizers(new TomcatConnectorCustomizer() { @Override public void customize(Connector connector) { - connector.setProperty("relaxedQueryChars", "|{}[]"); + connector.setProperty("relaxedQueryChars", "^|{}[]"); } }); return factory; diff --git a/renren-admin/src/main/java/io/renren/common/controller/AbilityCenterController.java b/renren-admin/src/main/java/io/renren/common/controller/AbilityCenterController.java index 9769db0c..0dabf868 100644 --- a/renren-admin/src/main/java/io/renren/common/controller/AbilityCenterController.java +++ b/renren-admin/src/main/java/io/renren/common/controller/AbilityCenterController.java @@ -31,6 +31,8 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import java.util.stream.Collectors; @@ -42,6 +44,8 @@ import java.util.stream.Collectors; @RestController @RequestMapping("/ability/center") public class AbilityCenterController { + private static Integer cpuNUm = Runtime.getRuntime().availableProcessors(); + private static final ExecutorService executor = Executors.newFixedThreadPool(cpuNUm); private static final Logger logger = LoggerFactory.getLogger(AbilityCenterController.class); @@ -125,7 +129,7 @@ public class AbilityCenterController { if (Long.valueOf(dto.getBusinessKey()) != null) { tAbilityApplicationService.updateInstanceId(dto.getProcessInstanceId(), Long.valueOf(dto.getBusinessKey())); } - }); + }, executor); return dto; }).filter(index -> ObjectUtil.isNotNull(index)).collect(Collectors.toList())); } diff --git a/renren-admin/src/main/java/io/renren/common/controller/AbilityCenterControllerV2.java b/renren-admin/src/main/java/io/renren/common/controller/AbilityCenterControllerV2.java index 487ae938..7dd1f3af 100644 --- a/renren-admin/src/main/java/io/renren/common/controller/AbilityCenterControllerV2.java +++ b/renren-admin/src/main/java/io/renren/common/controller/AbilityCenterControllerV2.java @@ -38,6 +38,8 @@ import org.springframework.web.bind.annotation.RestController; import java.time.LocalDateTime; import java.util.*; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import java.util.stream.Collectors; /** @@ -48,6 +50,8 @@ import java.util.stream.Collectors; @RestController @RequestMapping("/ability/center/v2") public class AbilityCenterControllerV2 { + private static Integer cpuNUm = Runtime.getRuntime().availableProcessors(); + private static final ExecutorService executor = Executors.newFixedThreadPool(cpuNUm); private static final Logger logger = LoggerFactory.getLogger(AbilityCenterController.class); private static final ObjectMapper oMapper = new ObjectMapper(); @Autowired @@ -191,7 +195,7 @@ public class AbilityCenterControllerV2 { .collect(Collectors.toList()).toArray(new String[dtoList.size()]); jdbcTemplate.batchUpdate(sqls); } - }); + }, executor); }); } return new Result().ok(LocalDateTime.now().toString()); diff --git a/renren-admin/src/main/java/io/renren/common/controller/CensusController.java b/renren-admin/src/main/java/io/renren/common/controller/CensusController.java index 0a5a7be4..f911b3da 100644 --- a/renren-admin/src/main/java/io/renren/common/controller/CensusController.java +++ b/renren-admin/src/main/java/io/renren/common/controller/CensusController.java @@ -23,6 +23,8 @@ import org.springframework.web.bind.annotation.*; import java.util.*; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import java.util.stream.Collectors; /** @@ -32,8 +34,9 @@ import java.util.stream.Collectors; @RestController @RequestMapping("/census/center") public class CensusController { - private static final Logger logger = LoggerFactory.getLogger(CensusController.class); + private static Integer cpuNUm = Runtime.getRuntime().availableProcessors(); + private static final ExecutorService executor = Executors.newFixedThreadPool(cpuNUm); @Autowired private ResourceService resourceService; @@ -95,7 +98,7 @@ public class CensusController { List> dbAmount = (List>) map.get("total"); Long sum = dbAmount.stream().mapToLong(index -> Long.parseLong(index.get("count").toString())).sum(); return sum; - }).thenAccept(sum -> { + }, executor).thenAccept(sum -> { result.add(new HashMap() { { put("amount", sum); @@ -105,7 +108,7 @@ public class CensusController { }); CompletableFuture userAmount = CompletableFuture.supplyAsync(() -> { // 获取平台用户总数 return sysUserService.countAllUser(); - }).thenAccept(sum -> { + }, executor).thenAccept(sum -> { result.add(new HashMap() { { put("amount", sum); @@ -116,7 +119,7 @@ public class CensusController { CompletableFuture applyAmount = CompletableFuture.supplyAsync(() -> { // 资源申请量 return tAbilityApplicationService.countApplyAll(); - }).thenAccept(sum -> { + }, executor).thenAccept(sum -> { result.add(new HashMap() { { put("amount", sum); @@ -127,7 +130,7 @@ public class CensusController { CompletableFuture deptAmount = CompletableFuture.supplyAsync(() -> { // 覆盖部门量 return resourceService.countAllDept(); - }).thenAccept(sum -> { + }, executor).thenAccept(sum -> { result.add(new HashMap() { { put("amount", sum); @@ -138,7 +141,7 @@ public class CensusController { CompletableFuture pvAmount = CompletableFuture.supplyAsync(() -> { // 平台访问量 return resourceService.countAllVisits(); - }).thenAccept(sum -> { + }, executor).thenAccept(sum -> { result.add(new HashMap() { { put("amount", sum); @@ -209,7 +212,7 @@ public class CensusController { .filter(index_ -> !"其他".equals(index_)) .collect(Collectors.toSet()); return type; - }).thenAccept(type -> { + }, executor).thenAccept(type -> { SysDeptDTO deptDTO = sysDeptService.get(deptId); result.add(new HashMap() { { @@ -277,7 +280,7 @@ public class CensusController { Set type = db.stream().flatMap(index_ -> Arrays.stream(index_.split(";"))).filter(index_ -> StringUtils.isNotEmpty(index_)).filter(index_ -> !"其他".equals(index_)).collect(Collectors.toSet()); return type; - }).thenAccept(type -> { + }, executor).thenAccept(type -> { SysDeptDTO deptDTO = sysDeptService.get(deptId); result.add(new HashMap() { { diff --git a/renren-admin/src/main/java/io/renren/common/controller/CensusControllerV2.java b/renren-admin/src/main/java/io/renren/common/controller/CensusControllerV2.java index 3dc11df1..59c8c9a1 100644 --- a/renren-admin/src/main/java/io/renren/common/controller/CensusControllerV2.java +++ b/renren-admin/src/main/java/io/renren/common/controller/CensusControllerV2.java @@ -33,6 +33,8 @@ import org.springframework.web.bind.annotation.*; import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import java.util.stream.Collectors; @@ -43,7 +45,8 @@ import java.util.stream.Collectors; @RestController @RequestMapping("/census/center/v2") public class CensusControllerV2 { - + private static final Integer cpuNUm = Runtime.getRuntime().availableProcessors(); + private static final ExecutorService executor = Executors.newFixedThreadPool(cpuNUm * 2); @Value("${project.place}") private Integer projectPlace; @Value("${project.higher}") @@ -78,7 +81,7 @@ public class CensusControllerV2 { CompletableFuture userAmount = CompletableFuture.supplyAsync(() -> { // 获取平台用户总数 return sysUserService.countAllUser(); - }).thenAccept(sum -> { + }, executor).thenAccept(sum -> { result.add(new HashMap() { { put("amount", sum); @@ -89,7 +92,7 @@ public class CensusControllerV2 { CompletableFuture pvAmount = CompletableFuture.supplyAsync(() -> { // 平台访问量 return resourceService.countAllVisits(); - }).thenAccept(sum -> { + }, executor).thenAccept(sum -> { result.add(new HashMap() { { put("amount", sum); @@ -125,7 +128,7 @@ public class CensusControllerV2 { CompletableFuture allApplicationAmount = CompletableFuture.supplyAsync(() -> { // 获取平台总应用数目 return jdbcTemplate.queryForObject("SELECT COUNT(id) FROM tb_data_resource WHERE type ='应用资源' AND del_flag = 0;", Long.class); - }).thenAccept(sum -> { + }, executor).thenAccept(sum -> { result.add(new HashMap() { { put("amount", sum); @@ -135,7 +138,7 @@ public class CensusControllerV2 { }); CompletableFuture buildingApplicationAmount = CompletableFuture.supplyAsync(() -> { // 获取平台建设中数目 return jdbcTemplate.queryForObject("SELECT COUNT(DISTINCT data_resource_id) FROM tb_data_attr WHERE attr_type = '应用状态' AND attr_value = '建设中';", Long.class); - }).thenAccept(sum -> { + }, executor).thenAccept(sum -> { result.add(new HashMap() { { put("amount", sum); @@ -145,7 +148,7 @@ public class CensusControllerV2 { }); CompletableFuture endApplicationAmount = CompletableFuture.supplyAsync(() -> { // 获取平台建设中数目 return jdbcTemplate.queryForObject("SELECT COUNT(DISTINCT data_resource_id) FROM tb_data_attr WHERE attr_type = '应用状态' AND attr_value = '停用';", Long.class); - }).thenAccept(sum -> { + }, executor).thenAccept(sum -> { result.add(new HashMap() { { put("amount", sum); @@ -183,7 +186,7 @@ public class CensusControllerV2 { String sql = String.format("SELECT COUNT(id) FROM tb_data_resource WHERE dept_id = %s AND type = '应用资源' AND del_flag = 0;", index.get("id").toString()); logger.info(sql); Long count = jdbcTemplate.queryForObject(sql, Long.class); - if (!"0" .equals(index.get("pid").toString()) && higher) { // 有上级部门 且 配置资源归属上级 + if (!"0".equals(index.get("pid").toString()) && higher) { // 有上级部门 且 配置资源归属上级 Optional sysDeptDTO = Optional.ofNullable(sysDeptService.get(Long.valueOf(index.get("pid").toString()))); if (sysDeptDTO.isPresent() && sysDeptDTO.get().getType() != null && sysDeptDTO.get().getType() >= 2) { @@ -225,7 +228,7 @@ public class CensusControllerV2 { List> result = new CopyOnWriteArrayList<>(); CompletableFuture allAssemblyAmount = CompletableFuture.supplyAsync(() -> { // 获取平台总组件服务数目 return jdbcTemplate.queryForObject("SELECT COUNT(id) FROM tb_data_resource WHERE type ='组件服务' AND del_flag = 0;", Long.class); - }).thenAccept(sum -> { + }, executor).thenAccept(sum -> { result.add(new HashMap() { { put("amount", sum); @@ -235,7 +238,7 @@ public class CensusControllerV2 { }); CompletableFuture aiAssemblyAmount = CompletableFuture.supplyAsync(() -> { // 获取平台智能算法组件服务数目 return jdbcTemplate.queryForObject("SELECT COUNT(DISTINCT tb_data_resource.id) FROM tb_data_resource WHERE tb_data_resource.del_flag = 0 AND EXISTS(SELECT tb_data_attr.id FROM tb_data_attr WHERE tb_data_attr.data_resource_id = tb_data_resource.id AND tb_data_attr.attr_value = '智能算法' AND attr_type = '组件类型')", Long.class); - }).thenAccept(sum -> { + }, executor).thenAccept(sum -> { result.add(new HashMap() { { put("amount", sum); @@ -245,7 +248,7 @@ public class CensusControllerV2 { }); CompletableFuture gisAssemblyAmount = CompletableFuture.supplyAsync(() -> { // 获取平台图层服务组件服务数目 return jdbcTemplate.queryForObject("SELECT COUNT(DISTINCT tb_data_resource.id) FROM tb_data_resource WHERE tb_data_resource.del_flag = 0 AND EXISTS(SELECT tb_data_attr.id FROM tb_data_attr WHERE tb_data_attr.data_resource_id = tb_data_resource.id AND tb_data_attr.attr_value = '图层服务' AND attr_type = '组件类型')", Long.class); - }).thenAccept(sum -> { + }, executor).thenAccept(sum -> { result.add(new HashMap() { { put("amount", sum); @@ -255,7 +258,7 @@ public class CensusControllerV2 { }); CompletableFuture busAssemblyAmount = CompletableFuture.supplyAsync(() -> { // 获取平台业务组件组件服务数目 return jdbcTemplate.queryForObject("SELECT COUNT(DISTINCT tb_data_resource.id) FROM tb_data_resource WHERE tb_data_resource.del_flag = 0 AND EXISTS(SELECT tb_data_attr.id FROM tb_data_attr WHERE tb_data_attr.data_resource_id = tb_data_resource.id AND tb_data_attr.attr_value = '业务组件' AND attr_type = '组件类型')", Long.class); - }).thenAccept(sum -> { + }, executor).thenAccept(sum -> { result.add(new HashMap() { { put("amount", sum); @@ -265,7 +268,7 @@ public class CensusControllerV2 { }); CompletableFuture devAssemblyAmount = CompletableFuture.supplyAsync(() -> { // 获取平台业务组件组件服务数目 return jdbcTemplate.queryForObject("SELECT COUNT(DISTINCT tb_data_resource.id) FROM tb_data_resource WHERE tb_data_resource.del_flag = 0 AND EXISTS(SELECT tb_data_attr.id FROM tb_data_attr WHERE tb_data_attr.data_resource_id = tb_data_resource.id AND tb_data_attr.attr_value = '开发组件' AND attr_type = '组件类型')", Long.class); - }).thenAccept(sum -> { + }, executor).thenAccept(sum -> { result.add(new HashMap() { { put("amount", sum); @@ -285,7 +288,7 @@ public class CensusControllerV2 { List> result = new CopyOnWriteArrayList<>(); CompletableFuture allKnowledgeAmount = CompletableFuture.supplyAsync(() -> { // 获取平台总知识库数目 return jdbcTemplate.queryForObject("SELECT COUNT(id) FROM tb_data_resource WHERE type ='知识库' AND del_flag = 0;", Long.class); - }).thenAccept(sum -> { + }, executor).thenAccept(sum -> { result.add(new HashMap() { { put("amount", sum); @@ -295,7 +298,7 @@ public class CensusControllerV2 { }); CompletableFuture allKnowledgeVisitsAmount = CompletableFuture.supplyAsync(() -> { // 获取平台知识库浏览量 return jdbcTemplate.queryForObject("SELECT IFNULL(SUM(visits),0) visits FROM tb_data_resource WHERE type ='知识库' AND del_flag = 0;", Long.class); - }).thenAccept(sum -> { + }, executor).thenAccept(sum -> { result.add(new HashMap() { { put("amount", sum == null ? 0L : sum); @@ -326,8 +329,10 @@ public class CensusControllerV2 { allAmount = CompletableFuture.supplyAsync(() -> { // 获取平台总基础设施数目 Map map = (Map) resourceService.selectTotal(); List> dbAmount = (List>) map.get("total"); - return dbAmount.stream().mapToLong(index -> Long.parseLong(index.get("count").toString())).sum(); - }).thenAccept(sum -> { + + return dbAmount.stream().filter(index -> "基础设施".equals(index.get("type").toString())) + .mapToLong(index -> Long.parseLong(index.get("count").toString())).sum(); + }, executor).thenAccept(sum -> { result.add(new HashMap() { { put("amount", sum); @@ -340,7 +345,7 @@ public class CensusControllerV2 { case BAOTOU: { // 包头 allAmount = CompletableFuture.supplyAsync(() -> { // 获取平台总基础设施数目 return jdbcTemplate.queryForObject("SELECT COUNT(id) FROM tb_data_resource WHERE type = '基础设施' AND del_flag = 0", Long.class); - }).thenAccept(sum -> { + }, executor).thenAccept(sum -> { result.add(new HashMap() { { put("amount", sum); @@ -370,7 +375,7 @@ public class CensusControllerV2 { logger.error("青岛西海岸失败", exception); } return result_.stream().filter(index -> index != null).findAny().orElse(0l); - }).thenAccept(sum -> { + }, executor).thenAccept(sum -> { result.add(new HashMap() { { put("amount", sum); diff --git a/renren-admin/src/main/java/io/renren/common/controller/CensusControllerV3.java b/renren-admin/src/main/java/io/renren/common/controller/CensusControllerV3.java index d4cd6186..537d5c41 100644 --- a/renren-admin/src/main/java/io/renren/common/controller/CensusControllerV3.java +++ b/renren-admin/src/main/java/io/renren/common/controller/CensusControllerV3.java @@ -17,19 +17,19 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import springfox.documentation.annotations.ApiIgnore; -import java.util.*; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.CopyOnWriteArrayList; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; /** * 全局统计中心 V3,对应2022-06-23能力统计列表和详情切图 + * * @author ytl * @Date 2022/6/23 14:04 **/ @@ -49,6 +49,7 @@ public class CensusControllerV3 { /** * 五大资源之发布情况统计 * 组件服务 应用资源 基础设施 数据资源 知识库 + * * @param * @return */ @@ -58,27 +59,27 @@ public class CensusControllerV3 { @ApiImplicitParams({ @ApiImplicitParam(name = Constant.PAGE, value = "当前页码,从1开始", paramType = "query", required = true, dataType = "int"), @ApiImplicitParam(name = Constant.LIMIT, value = "每页显示记录数", paramType = "query", required = true, dataType = "int"), - @ApiImplicitParam(name = "resourceType",value = "资源类型(组件服务、应用资源、基础设施、数据资源、知识库)", paramType = "query", dataType = "String"), + @ApiImplicitParam(name = "resourceType", value = "资源类型(组件服务、应用资源、基础设施、数据资源、知识库)", paramType = "query", dataType = "String"), }) - public Result>> resourceAssemblerDetails(@ApiIgnore @RequestParam Map params){ + public Result>> resourceAssemblerDetails(@ApiIgnore @RequestParam Map params) { UserDetail user = SecurityUser.getUser(); - if(StringUtils.equals(user.getUsername(),"admin")){ - params.put("id",0); - }else{ + if (StringUtils.equals(user.getUsername(), "admin")) { + params.put("id", 0); + } else { SysDeptDTO sysDeptDTO = sysDeptService.get(user.getDeptId()); - if(StringUtils.equals(sysDeptDTO.getName(),qddsjj)){ - params.put("id",0); - }else if(StringUtils.contains(sysDeptDTO.getName(),"大数据") && sysDeptDTO.getType() == 3){ - params.put("id",sysDeptDTO.getPid()); - }else{ - params.put("id",sysDeptDTO.getId()); + if (StringUtils.equals(sysDeptDTO.getName(), qddsjj)) { + params.put("id", 0); + } else if (StringUtils.contains(sysDeptDTO.getName(), "大数据") && sysDeptDTO.getType() == 3) { + params.put("id", sysDeptDTO.getPid()); + } else { + params.put("id", sysDeptDTO.getId()); } } String type = params.get("resourceType").toString(); - List> list = new ArrayList<>(); + List> list = new ArrayList<>(); - switch (type){ + switch (type) { case "组件服务": PageData> pageData = resourceService.resourceBusinessDetails(params); return new Result>>().ok(pageData); @@ -105,27 +106,27 @@ public class CensusControllerV3 { @ApiImplicitParams({ @ApiImplicitParam(name = Constant.PAGE, value = "当前页码,从1开始", paramType = "query", required = true, dataType = "int"), @ApiImplicitParam(name = Constant.LIMIT, value = "每页显示记录数", paramType = "query", required = true, dataType = "int"), - @ApiImplicitParam(name = "resourceType",value = "资源类型(组件服务、应用资源、基础设施、数据资源、知识库)", paramType = "query", dataType = "String"), + @ApiImplicitParam(name = "resourceType", value = "资源类型(组件服务、应用资源、基础设施、数据资源、知识库)", paramType = "query", dataType = "String"), }) - public Result>> resourceUsedDetails(@ApiIgnore @RequestParam Map params){ + public Result>> resourceUsedDetails(@ApiIgnore @RequestParam Map params) { UserDetail user = SecurityUser.getUser(); - if(StringUtils.equals(user.getUsername(),"admin")){ - params.put("id",0); - }else{ + if (StringUtils.equals(user.getUsername(), "admin")) { + params.put("id", 0); + } else { SysDeptDTO sysDeptDTO = sysDeptService.get(user.getDeptId()); - if(StringUtils.equals(sysDeptDTO.getName(),qddsjj)){ - params.put("id",0); - }else if(StringUtils.contains(sysDeptDTO.getName(),"大数据") && sysDeptDTO.getType() == 3){ - params.put("id",sysDeptDTO.getPid()); - }else{ - params.put("id",sysDeptDTO.getId()); + if (StringUtils.equals(sysDeptDTO.getName(), qddsjj)) { + params.put("id", 0); + } else if (StringUtils.contains(sysDeptDTO.getName(), "大数据") && sysDeptDTO.getType() == 3) { + params.put("id", sysDeptDTO.getPid()); + } else { + params.put("id", sysDeptDTO.getId()); } } String type = params.get("resourceType").toString(); - List> list = new ArrayList<>(); + List> list = new ArrayList<>(); - switch (type){ + switch (type) { case "组件服务": PageData> pageData = resourceService.resourceBusinessUseDetails(params); return new Result>>().ok(pageData); @@ -149,6 +150,7 @@ public class CensusControllerV3 { /** * 发布组件评分情况 1 2 3 4 5评分分布 + * * @param * @return */ @@ -157,10 +159,10 @@ public class CensusControllerV3 { @LogOperation("组件评分情况") @ApiImplicitParams({ @ApiImplicitParam(name = "id", value = "部门id", paramType = "query", required = true, dataType = "long"), - @ApiImplicitParam(name = "resourceType",value = "资源类型(组件服务、应用资源、基础设施、数据资源、知识库)", paramType = "query", dataType = "String") - }) - public Result>> assemblerScoreInfo(@ApiIgnore @RequestParam Map params){ - Object[] args = {params.get("resourceType"),params.get("id"),params.get("id")}; + @ApiImplicitParam(name = "resourceType", value = "资源类型(组件服务、应用资源、基础设施、数据资源、知识库)", paramType = "query", dataType = "String") + }) + public Result>> assemblerScoreInfo(@ApiIgnore @RequestParam Map params) { + Object[] args = {params.get("resourceType"), params.get("id"), params.get("id")}; List> maps = jdbcTemplate.queryForList("SELECT COUNT(a.score) as scoreNum,a.score FROM tb_resource_score a INNER JOIN tb_data_resource b\n" + "ON a.resource_id = b.id INNER JOIN sys_dept c ON b.dept_id = c.id\n" + "WHERE a.del_flag = 0 AND a.score is not null AND b.type = ? AND b.del_flag = 0\n" + @@ -173,7 +175,7 @@ public class CensusControllerV3 { @ApiOperation("TOP5被调用的组件和数量") @LogOperation("TOP5被调用的组件和数量") @ApiImplicitParam(name = "id", value = "部门id", paramType = "query", required = true, dataType = "long") - public Result>> assemblerUsedTopInfo(Long id){ + public Result>> assemblerUsedTopInfo(Long id) { return null; } @@ -183,10 +185,10 @@ public class CensusControllerV3 { @LogOperation("TOP5被申请的组件和数量") @ApiImplicitParams({ @ApiImplicitParam(name = "id", value = "部门id", paramType = "query", required = true, dataType = "long"), - @ApiImplicitParam(name = "resourceType",value = "资源类型(组件服务、应用资源、基础设施、数据资源、知识库)", paramType = "query", dataType = "String") + @ApiImplicitParam(name = "resourceType", value = "资源类型(组件服务、应用资源、基础设施、数据资源、知识库)", paramType = "query", dataType = "String") }) - public Result>> assemblerCaredTopInfo(@ApiIgnore @RequestParam Map params){ - Object[] args = {params.get("id"),params.get("id"),params.get("resourceType")}; + public Result>> assemblerCaredTopInfo(@ApiIgnore @RequestParam Map params) { + Object[] args = {params.get("id"), params.get("id"), params.get("resourceType")}; List> maps = jdbcTemplate.queryForList("SELECT a.resource_id,b.name,COUNT(a.id) AS resourceCarNum FROM tb_resource_car a \n" + " INNER JOIN tb_data_resource b ON a.resource_id = b.id\n" + @@ -206,16 +208,16 @@ public class CensusControllerV3 { @LogOperation("算法、图层、开发、业务发布量情况分布") @ApiImplicitParams({ @ApiImplicitParam(name = "id", value = "部门id", paramType = "query", required = true, dataType = "long"), - @ApiImplicitParam(name = "resourceType",value = "资源类型(组件服务、应用资源、基础设施、数据资源、知识库)", paramType = "query", dataType = "String") + @ApiImplicitParam(name = "resourceType", value = "资源类型(组件服务、应用资源、基础设施、数据资源、知识库)", paramType = "query", dataType = "String") }) - public Result>> assemblerUsedInfo(@ApiIgnore @RequestParam Map params){ - Object[] ps = {params.get("id"),params.get("id"),params.get("resourceType")}; + public Result>> assemblerUsedInfo(@ApiIgnore @RequestParam Map params) { + Object[] ps = {params.get("id"), params.get("id"), params.get("resourceType")}; List> maps = jdbcTemplate.queryForList("SELECT count(b.attr_value) as nums,b.attr_value FROM tb_data_resource a INNER JOIN tb_data_attr b ON a.id = b.data_resource_id\n" + "INNER JOIN sys_dept c ON a.dept_id = c.id \n" + - "WHERE (c.id = ? OR INSTR(c.pids,?)) and a.type = ? and b.attr_type = '组件类型'\n" + + "WHERE a.del_flag = 0 AND b.del_flag = 0 AND (c.id = ? OR INSTR(c.pids,?)) and a.type = ? and b.attr_type = '组件类型'\n" + "GROUP BY b.attr_value", ps); - return new Result>>().ok(maps); + return new Result>>().ok(maps); } @@ -223,6 +225,7 @@ public class CensusControllerV3 { /** * 使用次数是去tb_data_resource_rel查 + * * @param params * @return */ @@ -231,10 +234,10 @@ public class CensusControllerV3 { @LogOperation("TOP5使用组件") @ApiImplicitParams({ @ApiImplicitParam(name = "id", value = "部门id", paramType = "query", required = true, dataType = "long"), - @ApiImplicitParam(name = "resourceType",value = "资源类型(组件服务、应用资源、基础设施、数据资源、知识库)", paramType = "query", dataType = "String") + @ApiImplicitParam(name = "resourceType", value = "资源类型(组件服务、应用资源、基础设施、数据资源、知识库)", paramType = "query", dataType = "String") }) - public Result>> assemblerUseTopInfo(@ApiIgnore @RequestParam Map params){ - Object[] ps = {params.get("id"),params.get("id"),params.get("resourceType")}; + public Result>> assemblerUseTopInfo(@ApiIgnore @RequestParam Map params) { + Object[] ps = {params.get("id"), params.get("id"), params.get("resourceType")}; List> maps = jdbcTemplate.queryForList("SELECT COUNT(c.id) as useNum,c.name FROM \n" + "(\n" + "\tSELECT a.id FROM tb_data_resource a INNER JOIN sys_dept b ON a.dept_id = b.id \n" + @@ -243,7 +246,7 @@ public class CensusControllerV3 { "INNER JOIN tb_data_resource_rel b ON a.id = b.key_id INNER JOIN tb_data_resource c ON b.reference_id = c.id\n" + "WHERE b.del_flag = 0 AND c.type = ? AND c.del_flag = 0 GROUP BY c.name ORDER BY useNum desc limit 5", ps); - return new Result>>().ok(maps); + return new Result>>().ok(maps); } @GetMapping("/assemblerUseInfo") @@ -251,10 +254,10 @@ public class CensusControllerV3 { @LogOperation("使用组件数量分布(算法、图层、开发、业务") @ApiImplicitParams({ @ApiImplicitParam(name = "id", value = "部门id", paramType = "query", required = true, dataType = "long"), - @ApiImplicitParam(name = "resourceType",value = "资源类型(组件服务、应用资源、基础设施、数据资源、知识库)", paramType = "query", dataType = "String") + @ApiImplicitParam(name = "resourceType", value = "资源类型(组件服务、应用资源、基础设施、数据资源、知识库)", paramType = "query", dataType = "String") }) - public Result>> assemblerUseInfo(@ApiIgnore @RequestParam Map params){ - Object[] ps = {params.get("id"),params.get("id"),params.get("resourceType")}; + public Result>> assemblerUseInfo(@ApiIgnore @RequestParam Map params) { + Object[] ps = {params.get("id"), params.get("id"), params.get("resourceType")}; List> maps = jdbcTemplate.queryForList("SELECT COUNT(n.id) AS num,n.attr_value FROM\n" + "(\n" + "\tSELECT DISTINCT(c.id) AS id,c.name FROM \n" + @@ -267,15 +270,15 @@ public class CensusControllerV3 { "\t \n" + ") m INNER JOIN tb_data_attr n ON m.id = n.data_resource_id WHERE n.del_flag = 0 AND n.attr_type = '组件类型' GROUP BY n.attr_value", ps); - return new Result>>().ok(maps); + return new Result>>().ok(maps); } @GetMapping("/assemblerUseProjectInfo") @ApiOperation("应用贡献组件数量分布(算法、图层、开发、业务)") @LogOperation("应用贡献组件数量分布(算法、图层、开发、业务)") @ApiImplicitParam(name = "id", value = "部门的id", paramType = "query", required = true, dataType = "long") - public Result>> assemblerUseProjectInfo(Long id){ - Object[] ps = {id,id}; + public Result>> assemblerUseProjectInfo(Long id) { + Object[] ps = {id, id}; List> maps = jdbcTemplate.queryForList("SELECT count(c.id) as num,c.attr_value FROM \n" + "(SELECT a.id,a.name FROM tb_data_resource a INNER JOIN sys_dept b ON a.dept_id = b.id WHERE (b.id = ? OR INSTR(b.pids,?))\n" + "AND a.type = '应用资源' AND a.del_flag = 0) a \n" + @@ -283,15 +286,15 @@ public class CensusControllerV3 { "INNER JOIN tb_data_attr c ON b.reference_id = c.data_resource_id\n" + "WHERE c.attr_type = '应用类型' AND b.del_flag = 0 AND c.del_flag = 0 group by c.attr_value ", ps); - return new Result>>().ok(maps); + return new Result>>().ok(maps); } @GetMapping("/assemblerUseNumProjectInfo") @ApiOperation("应用贡献组件数量分布") @LogOperation("应用贡献组件数量分布") @ApiImplicitParam(name = "id", value = "部门的id", paramType = "query", required = true, dataType = "long") - public Result>> assemblerUseNumProjectInfo(Long id){ - Object[] ps = {id,id}; + public Result>> assemblerUseNumProjectInfo(Long id) { + Object[] ps = {id, id}; List> maps = jdbcTemplate.queryForList("SELECT count(distinct(b.reference_id)) as num,c.name FROM \n" + "(SELECT m.id,m.name FROM tb_data_resource m INNER JOIN sys_dept n ON m.dept_id = n.id WHERE (n.id = ? OR INSTR(n.pids,?)) AND m.type = '应用资源' AND m.del_flag = 0) a \n" + "INNER JOIN tb_data_resource_rel b ON a.id = b.key_id \n" + @@ -299,7 +302,7 @@ public class CensusControllerV3 { "WHERE b.del_flag = 0 AND c.del_flag = 0 AND c.type='组件服务'\n" + "group by c.name", ps); - return new Result>>().ok(maps); + return new Result>>().ok(maps); } @GetMapping("/assemblerUseScoreTopInfo") @@ -307,10 +310,10 @@ public class CensusControllerV3 { @LogOperation("使用组件评分top5") @ApiImplicitParams({ @ApiImplicitParam(name = "id", value = "部门id", paramType = "query", required = true, dataType = "long"), - @ApiImplicitParam(name = "resourceType",value = "资源类型(组件服务、应用资源、基础设施、数据资源、知识库)", paramType = "query", dataType = "String") + @ApiImplicitParam(name = "resourceType", value = "资源类型(组件服务、应用资源、基础设施、数据资源、知识库)", paramType = "query", dataType = "String") }) - public Result>> assemblerUseScoreTopInfo(@ApiIgnore @RequestParam Map params){ - Object[] ps = {params.get("resourceType"),params.get("id"),params.get("id")}; + public Result>> assemblerUseScoreTopInfo(@ApiIgnore @RequestParam Map params) { + Object[] ps = {params.get("resourceType"), params.get("id"), params.get("id")}; List> maps = jdbcTemplate.queryForList("SELECT SUM(IFNULL(b.score,0)) as score,a.name FROM \n" + "(\n" + "\tSELECT DISTINCT(c.id) AS id,c.name FROM \n" + @@ -323,7 +326,7 @@ public class CensusControllerV3 { ")\ta \n" + "INNER JOIN tb_resource_score b ON a.id = b.resource_id AND b.del_flag = 0 GROUP BY a.name ORDER BY score DESC LIMIT 5", ps); - return new Result>>().ok(maps); + return new Result>>().ok(maps); } @@ -332,10 +335,10 @@ public class CensusControllerV3 { @LogOperation("应用领域分布情况") @ApiImplicitParams({ @ApiImplicitParam(name = "id", value = "部门id", paramType = "query", required = true, dataType = "long"), - @ApiImplicitParam(name = "resourceType",value = "资源类型(组件服务、应用资源、基础设施、数据资源、知识库)", paramType = "query", dataType = "String") + @ApiImplicitParam(name = "resourceType", value = "资源类型(组件服务、应用资源、基础设施、数据资源、知识库)", paramType = "query", dataType = "String") }) - public Result>> applicationAreaCapabilityList(@ApiIgnore @RequestParam Map params) { - return new Result>>().ok(resourceService.applicationAreaCapabilityList(params)); + public Result>> applicationAreaCapabilityList(@ApiIgnore @RequestParam Map params) { + return new Result>>().ok(resourceService.applicationAreaCapabilityList(params)); } @@ -344,32 +347,31 @@ public class CensusControllerV3 { @LogOperation("使用组件应用领域分布情况") @ApiImplicitParams({ @ApiImplicitParam(name = "id", value = "部门id", paramType = "query", required = true, dataType = "long"), - @ApiImplicitParam(name = "resourceType",value = "资源类型(组件服务、应用资源、基础设施、数据资源、知识库)", paramType = "query", dataType = "String") + @ApiImplicitParam(name = "resourceType", value = "资源类型(组件服务、应用资源、基础设施、数据资源、知识库)", paramType = "query", dataType = "String") }) - public Result>> applicationUsedAreaCapabilityList(@ApiIgnore @RequestParam Map params) { + public Result>> applicationUsedAreaCapabilityList(@ApiIgnore @RequestParam Map params) { List> maps = resourceService.applicationAreaCapabilityUseList(params); - return new Result>>().ok(maps); + return new Result>>().ok(maps); } - //以下是应用资源点击详情显示 @GetMapping("/applicationStateCapabilitySet") @ApiOperation("应用状态分布情况") @LogOperation("应用状态分布情况") @ApiImplicitParams({ @ApiImplicitParam(name = "id", value = "部门id", paramType = "query", required = true, dataType = "long"), - @ApiImplicitParam(name = "resourceType",value = "资源类型(组件服务、应用资源、基础设施、数据资源、知识库)", paramType = "query", dataType = "String") + @ApiImplicitParam(name = "resourceType", value = "资源类型(组件服务、应用资源、基础设施、数据资源、知识库)", paramType = "query", dataType = "String") }) - public Result>> applicationStateCapabilitySet(@ApiIgnore @RequestParam Map params){ - Object[] ps = {params.get("id"),params.get("resourceType")}; + public Result>> applicationStateCapabilitySet(@ApiIgnore @RequestParam Map params) { + Object[] ps = {params.get("id"), params.get("resourceType")}; List> result = jdbcTemplate.queryForList("SELECT COUNT(b.id) as num,b.attr_value as state from tb_data_resource a inner join tb_data_attr b\n" + "on a.id = b.data_resource_id \n" + "where a.del_flag = 0 and a.dept_id = ? and a.type = ? and b.attr_type = '应用状态'\n" + "group by b.attr_value", ps); - return new Result>>().ok(result); + return new Result>>().ok(result); } @GetMapping("/applicationReleaseCapabilitySet") @@ -377,10 +379,10 @@ public class CensusControllerV3 { @LogOperation("发布端应用分布情况") @ApiImplicitParams({ @ApiImplicitParam(name = "id", value = "部门id", paramType = "query", required = true, dataType = "long"), - @ApiImplicitParam(name = "resourceType",value = "资源类型(组件服务、应用资源、基础设施、数据资源、知识库)", paramType = "query", dataType = "String") + @ApiImplicitParam(name = "resourceType", value = "资源类型(组件服务、应用资源、基础设施、数据资源、知识库)", paramType = "query", dataType = "String") }) - public Result>> applicationReleaseCapabilitySet(@ApiIgnore @RequestParam Map params){ - Object[] ps = {params.get("resourceType"),params.get("id"),params.get("id")}; + public Result>> applicationReleaseCapabilitySet(@ApiIgnore @RequestParam Map params) { + Object[] ps = {params.get("resourceType"), params.get("id"), params.get("id")}; List> result = jdbcTemplate.queryForList("select m.attr_value as publisher,count(m.id) as num from \n" + "(\n" + "SELECT a.id,substring_index( a.attr_value, ';', b.help_topic_id +1 ),substring_index( substring_index( a.attr_value, ';', b.help_topic_id+1 ), ';',- 1 ) AS attr_value FROM \n" + @@ -393,21 +395,22 @@ public class CensusControllerV3 { "\n" + ") m GROUP BY m.attr_value", ps); - return new Result>>().ok(result); + return new Result>>().ok(result); } + @GetMapping("/applicationUsedCapabilityNum") @ApiOperation("贡献组件分别被多少应用使用") @LogOperation("贡献组件分别被多少应用使用") @ApiImplicitParam(name = "id", value = "部门id", paramType = "query", required = true, dataType = "long") - public Result>> applicationUsedCapabilityNum(Long id){ - Object[] ps = {id,id}; + public Result>> applicationUsedCapabilityNum(Long id) { + Object[] ps = {id, id}; List> maps = jdbcTemplate.queryForList("SELECT COUNT(distinct(a.key_id)) as appNum,c.attr_value FROM (\n" + "SELECT a.key_id ,a.reference_id FROM tb_data_resource_rel a INNER JOIN tb_data_resource b ON a.key_id = b.id INNER JOIN sys_dept c on b.dept_id = c.id WHERE a.del_flag = 0 AND (c.id = ? OR INSTR(c.pids,?)) ORDER BY a.key_id \n" + ") a \n" + "INNER JOIN tb_data_resource b ON a.reference_id = b.id INNER JOIN tb_data_attr c ON a.reference_id = c.data_resource_id \n" + "WHERE c.attr_type = '组件类型' GROUP BY c.attr_value", ps); - return new Result>>().ok(maps); + return new Result>>().ok(maps); } //以下是基础设施和数据资源使用情况点击详情(申请明细) @@ -417,40 +420,42 @@ public class CensusControllerV3 { @ApiImplicitParams({ @ApiImplicitParam(name = Constant.PAGE, value = "当前页码,从1开始", paramType = "query", required = true, dataType = "int"), @ApiImplicitParam(name = Constant.LIMIT, value = "每页显示记录数", paramType = "query", required = true, dataType = "int"), - @ApiImplicitParam(name = "id",value = "行政部门编号", paramType = "query", dataType = "Long"), - @ApiImplicitParam(name = "resourceType",value = "资源类型(组件服务、应用资源、基础设施、数据资源、知识库)", paramType = "query", dataType = "String"), + @ApiImplicitParam(name = "id", value = "行政部门编号", paramType = "query", dataType = "Long"), + @ApiImplicitParam(name = "resourceType", value = "资源类型(组件服务、应用资源、基础设施、数据资源、知识库)", paramType = "query", dataType = "String"), }) - public Result>> assemblerCarDetail(@ApiIgnore @RequestParam Map params){ - List> result = resourceService.assemblerCarDetail(params); + public Result>> assemblerCarDetail(@ApiIgnore @RequestParam Map params) { + List> result = resourceService.assemblerCarDetail(params); - return new Result>>().ok(result); + return new Result>>().ok(result); } //以下是知识库点击详情展示 @GetMapping("/knowledgeBaseDistriDetail") @ApiOperation("知识库分布情况") @LogOperation("知识库分布情况") - @ApiImplicitParam(name = "id",value = "行政部门编号", paramType = "query", dataType = "Long") - public Result>> knowledgeBaseDistriDetail(Long id){ - List> result = new ArrayList<>(); - Object[] ps = {id,id}; + @ApiImplicitParam(name = "id", value = "行政部门编号", paramType = "query", dataType = "Long") + public Result>> knowledgeBaseDistriDetail(Long id) { + List> result = new ArrayList<>(); + Object[] ps = {id, id}; result = jdbcTemplate.queryForList("SELECT COUNT(a.id) AS num,a.attr_value FROM tb_data_attr a INNER JOIN tb_data_resource b ON a.data_resource_id = b.id\n" + - "INNER JOIN sys_dept c on b.dept_id = c.id WHERE a.attr_type = '文件类型' AND b.type = '知识库' AND b.del_flag = 0 AND \n" + - "(c.ID = ? OR INSTR(c.pids,?)) GROUP BY a.attr_value",ps); + "INNER JOIN sys_dept c on b.dept_id = c.id WHERE a.attr_type = '文件类型' AND a.del_flag = 0 AND b.type = '知识库' AND b.del_flag = 0 AND \n" + + "(c.ID = ? OR INSTR(c.pids,?)) GROUP BY a.attr_value", ps); - return new Result>>().ok(result); + return new Result>>().ok(result); } @GetMapping("knowledgeBaseReleaseDetail") @ApiOperation("知识库发布时间统计(按月)") @LogOperation("知识库发布时间统计(按月)") - public Result>> knowledgeBaseReleaseDetail(Long id){ - Object[] ps = {id}; - List> result = jdbcTemplate.queryForList("SELECT COUNT(id) as num, MONTH(create_date) AS time FROM tb_data_resource \n" + - "WHERE type = '知识库' AND YEAR(create_date) = YEAR(CURDATE()) AND del_flag = 0 AND dept_id = ?\n" + - "GROUP BY YEAR(create_date),MONTH(create_date) ORDER BY MONTH(create_date)\n", ps); + public Result>> knowledgeBaseReleaseDetail(Long id) { + Object[] ps = {id, id}; + List> result = jdbcTemplate.queryForList("SELECT COUNT(a.id) as num, MONTH(a.create_date) AS time FROM tb_data_resource a INNER JOIN sys_dept b \n" + + "ON a.dept_id = b.id \n" + + "WHERE a.type = '知识库' AND YEAR(a.create_date) = YEAR(CURDATE()) AND a.del_flag = 0 \n" + + "AND (b.id = ? OR INSTR(b.pids,?))\n" + + "GROUP BY YEAR(a.create_date),MONTH(a.create_date) ORDER BY MONTH(a.create_date)", ps); - return new Result>>().ok(result); + return new Result>>().ok(result); } } diff --git a/renren-admin/src/main/java/io/renren/common/controller/CommentController.java b/renren-admin/src/main/java/io/renren/common/controller/CommentController.java index 1ac10b68..dfcb385a 100644 --- a/renren-admin/src/main/java/io/renren/common/controller/CommentController.java +++ b/renren-admin/src/main/java/io/renren/common/controller/CommentController.java @@ -26,11 +26,15 @@ import org.springframework.web.bind.annotation.RestController; import java.util.HashMap; import java.util.Map; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; @Api(tags = "评论审核") @RestController @RequestMapping("/comment/center") public class CommentController { + private static Integer cpuNUm = Runtime.getRuntime().availableProcessors(); + private static final ExecutorService executor = Executors.newFixedThreadPool(cpuNUm); private static final ObjectMapper oMapper = new ObjectMapper(); @Autowired @@ -97,7 +101,7 @@ public class CommentController { if (Long.valueOf(dto.getBusinessKey()) != null) { jdbcTemplate.update(String.format("UPDATE t_demand_comment SET instance_id = '%s' WHERE id = %s", dto.getProcessInstanceId(), dto.getBusinessKey())); } - }); + }, executor); return new Result().ok(dto); } } diff --git a/renren-admin/src/main/java/io/renren/modules/activiti/dto/ProcessInstanceDTO.java b/renren-admin/src/main/java/io/renren/modules/activiti/dto/ProcessInstanceDTO.java index d58106be..46bf6fdd 100644 --- a/renren-admin/src/main/java/io/renren/modules/activiti/dto/ProcessInstanceDTO.java +++ b/renren-admin/src/main/java/io/renren/modules/activiti/dto/ProcessInstanceDTO.java @@ -70,4 +70,11 @@ public class ProcessInstanceDTO { @ApiModelProperty(value = "流程被驳回到第一个用户任务?") private Boolean backToFirst = Boolean.FALSE; + + @ApiModelProperty(value = "流程中是否存在拒绝?") + private Boolean reject = Boolean.FALSE; + + + @ApiModelProperty(value = "流程直接被终止?") + private Boolean termination = Boolean.FALSE; } diff --git a/renren-admin/src/main/java/io/renren/modules/activiti/dto/TaskDTO.java b/renren-admin/src/main/java/io/renren/modules/activiti/dto/TaskDTO.java index 31ed15e7..39235b4f 100644 --- a/renren-admin/src/main/java/io/renren/modules/activiti/dto/TaskDTO.java +++ b/renren-admin/src/main/java/io/renren/modules/activiti/dto/TaskDTO.java @@ -79,4 +79,11 @@ public class TaskDTO { @ApiModelProperty(value = "流程被驳回到第一个用户任务?") private Boolean backToFirst = null; + @ApiModelProperty(value = "流程中是否存在拒绝?") + private Boolean reject = null; + + + @ApiModelProperty(value = "流程直接被终止?") + private Boolean termination = null; + } diff --git a/renren-admin/src/main/java/io/renren/modules/activiti/service/ActHistoryService.java b/renren-admin/src/main/java/io/renren/modules/activiti/service/ActHistoryService.java index 6aa66d84..570e89e9 100644 --- a/renren-admin/src/main/java/io/renren/modules/activiti/service/ActHistoryService.java +++ b/renren-admin/src/main/java/io/renren/modules/activiti/service/ActHistoryService.java @@ -338,6 +338,8 @@ public class ActHistoryService { } taskDTOList.add(taskDTO); dto.setBackToFirst(taskDTO.getBackToFirst()); + dto.setReject(taskDTO.getReject()); + dto.setTermination(taskDTO.getTermination()); } dto.setCurrentTaskList(taskDTOList); } @@ -373,6 +375,12 @@ public class ActHistoryService { if (dto.getParams() != null && dto.getParams().containsKey("backToFirst") && dto.getParams().get("backToFirst") != null) { dto.setBackToFirst(Boolean.valueOf(dto.getParams().get("backToFirst").toString())); } + if (dto.getParams() != null && dto.getParams().containsKey("reject") && dto.getParams().get("reject") != null) { + dto.setReject(Boolean.valueOf(dto.getParams().get("reject").toString())); + } + if (dto.getParams() != null && dto.getParams().containsKey("termination") && dto.getParams().get("termination") != null) { + dto.setTermination(Boolean.valueOf(dto.getParams().get("backToFirst").toString())); + } } public ProcessInstanceDTO getHistoryProcessInstanceByBusinessKey(String procDefKey, String businessKey) { diff --git a/renren-admin/src/main/java/io/renren/modules/category/service/impl/CategoryServiceImpl.java b/renren-admin/src/main/java/io/renren/modules/category/service/impl/CategoryServiceImpl.java index f31abfc3..b1d97bd2 100644 --- a/renren-admin/src/main/java/io/renren/modules/category/service/impl/CategoryServiceImpl.java +++ b/renren-admin/src/main/java/io/renren/modules/category/service/impl/CategoryServiceImpl.java @@ -20,9 +20,13 @@ import java.util.List; import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; @Service public class CategoryServiceImpl extends CrudServiceImpl implements CategoryService { + private static Integer cpuNUm = Runtime.getRuntime().availableProcessors(); + private static final ExecutorService executor = Executors.newFixedThreadPool(cpuNUm); @Autowired private CategoryDao categoryDao; @@ -44,7 +48,7 @@ public class CategoryServiceImpl extends CrudServiceImpl implements TDemandCommentService { + private static Integer cpuNUm = Runtime.getRuntime().availableProcessors(); + private static final ExecutorService executor = Executors.newFixedThreadPool(cpuNUm); @Autowired private TDemandDataService tDemandDataService; @Autowired @@ -88,9 +92,8 @@ public class TDemandCommentServiceImpl extends CrudServiceImpl { // 发起人 Optional tDemandDataDTO = Optional.ofNullable(tDemandDataService.get(tDemandCommentDTO.getTargetId())); Optional sysUserDTO = Optional.ofNullable(sysUserService.get(tDemandDataDTO.isPresent() ? tDemandDataDTO.get().getCreator() : null)); - String content = "【评论】" + (sysUserDTO.isPresent() ? sysUserDTO.get().getRealName() : "") + "您发起的需求 " + tDemandDataDTO.orElse(new TDemandDataDTO()).getDemandSubject() -// + "有新的评论,请前往查看详情" - ; + String content = "【评论】" + (sysUserDTO.isPresent() ? sysUserDTO.get().getRealName() : "") + " 您发起的需求 " + tDemandDataDTO.orElse(new TDemandDataDTO()).getDemandSubject() + + "有新的评论"; SysNoticeDTO dto = new SysNoticeDTO(); dto.setType(2); dto.setTitle("需求评论系统通知"); @@ -104,7 +107,7 @@ public class TDemandCommentServiceImpl extends CrudServiceImpl> page(@ApiIgnore @RequestParam Map params){ + PageData page = tbFuseService.page(params); + return new Result>().ok(page); + } + + @GetMapping("{id}") + @ApiOperation("信息") + public Result get(@PathVariable("id") Long id){ + return new Result().ok(tbFuseService.getFuseById(id)); + } + + @PostMapping + @ApiOperation("保存") + @LogOperation("保存") + public Result save(@RequestBody TbFuseDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class); + return new Result().ok(tbFuseService.addFuse(dto)); + } + + @PutMapping + @ApiOperation("修改") + @LogOperation("修改") + public Result update(@RequestBody TbFuseDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class); + return new Result().ok(tbFuseService.updateFuse(dto)); + } + + @DeleteMapping + @ApiOperation("删除") + @LogOperation("删除") + public Result delete(@RequestBody Long id){ + return new Result().ok(tbFuseService.deleteFuse(id)); + } +} diff --git a/renren-admin/src/main/java/io/renren/modules/fuse/dao/TbFuseAttrDao.java b/renren-admin/src/main/java/io/renren/modules/fuse/dao/TbFuseAttrDao.java new file mode 100644 index 00000000..1db852f1 --- /dev/null +++ b/renren-admin/src/main/java/io/renren/modules/fuse/dao/TbFuseAttrDao.java @@ -0,0 +1,23 @@ +package io.renren.modules.fuse.dao; + +import io.renren.common.dao.BaseDao; +import io.renren.modules.fuse.dto.TbFuseAttrDTO; +import io.renren.modules.fuse.entity.TbFuseAttrEntity; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Auther:lizhicheng2@hisense.com + * @date:2022/7/3 + * @des + */ +@Mapper +public interface TbFuseAttrDao extends BaseDao { + + int insertBatch(List list); + + int deleteByFuseId(@Param(value = "fuseId") Long fuseId); + +} diff --git a/renren-admin/src/main/java/io/renren/modules/fuse/dao/TbFuseDao.java b/renren-admin/src/main/java/io/renren/modules/fuse/dao/TbFuseDao.java new file mode 100644 index 00000000..4c594e4f --- /dev/null +++ b/renren-admin/src/main/java/io/renren/modules/fuse/dao/TbFuseDao.java @@ -0,0 +1,15 @@ +package io.renren.modules.fuse.dao; + +import io.renren.common.dao.BaseDao; +import io.renren.modules.fuse.entity.TbFuseEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * @Auther:lizhicheng2@hisense.com + * @date:2022/6/30 + * @des + */ +@Mapper +public interface TbFuseDao extends BaseDao { + +} diff --git a/renren-admin/src/main/java/io/renren/modules/fuse/dao/TbFuseResourceDao.java b/renren-admin/src/main/java/io/renren/modules/fuse/dao/TbFuseResourceDao.java new file mode 100644 index 00000000..5f0fa664 --- /dev/null +++ b/renren-admin/src/main/java/io/renren/modules/fuse/dao/TbFuseResourceDao.java @@ -0,0 +1,24 @@ +package io.renren.modules.fuse.dao; + +import io.renren.common.dao.BaseDao; +import io.renren.modules.fuse.dto.TbFuseResourceDTO; +import io.renren.modules.fuse.entity.TbFuseResourceEntity; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Auther:lizhicheng2@hisense.com + * @date:2022/6/30 + * @des + */ +@Mapper +public interface TbFuseResourceDao extends BaseDao { + + int insertBatch(List list); + + int deleteByFuseId(@Param(value = "fuseId") Long fuseId); + + +} diff --git a/renren-admin/src/main/java/io/renren/modules/fuse/dto/TbFuseAttrDTO.java b/renren-admin/src/main/java/io/renren/modules/fuse/dto/TbFuseAttrDTO.java new file mode 100644 index 00000000..62c2e54a --- /dev/null +++ b/renren-admin/src/main/java/io/renren/modules/fuse/dto/TbFuseAttrDTO.java @@ -0,0 +1,26 @@ +package io.renren.modules.fuse.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Auther:lizhicheng2@hisense.com + * @date:2022/7/3 + * @des + */ +@Data +@ApiModel(value = "融合资源属性表") +public class TbFuseAttrDTO { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键ID") + private Long id; + @ApiModelProperty(value = "融合服务id") + private Long fuseId; + @ApiModelProperty(value = "属性类型") + private String attrType; + @ApiModelProperty(value = "属性值") + private String attrValue; + +} diff --git a/renren-admin/src/main/java/io/renren/modules/fuse/dto/TbFuseDTO.java b/renren-admin/src/main/java/io/renren/modules/fuse/dto/TbFuseDTO.java new file mode 100644 index 00000000..b9b5352f --- /dev/null +++ b/renren-admin/src/main/java/io/renren/modules/fuse/dto/TbFuseDTO.java @@ -0,0 +1,52 @@ +package io.renren.modules.fuse.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; +import java.util.List; + +/** + * @Auther:lizhicheng2@hisense.com + * @date:2022/6/30 + * @des + */ +@Data +@ApiModel(value = "融合服务表") +public class TbFuseDTO { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键ID") + private Long id; + @ApiModelProperty(value = "融合服务名称") + private String name; + @ApiModelProperty(value = "融合服务描述") + private String description; + @ApiModelProperty(value = "应用领域") + private String applicationArea; + @ApiModelProperty(value = "所属部门") + private Long deptId; + @ApiModelProperty(value = "部门联系人") + private String deptUser; + @ApiModelProperty(value = "部门联系人电话") + private String mobile; + @ApiModelProperty(value = "服务商") + private String provider; + @ApiModelProperty(value = "服务商联系人") + private String providerUser; + @ApiModelProperty(value = "服务商联系人电话") + private String providerMobile; + @ApiModelProperty(value = "创建人") + private Long creator; + @ApiModelProperty(value = "创建时间") + private Date createDate; + @ApiModelProperty(value = "修改人") + private Long updater; + @ApiModelProperty(value = "更新时间") + private Date updateDate; + @ApiModelProperty(value = "资源融合关系") + private List fuseResourceList; + @ApiModelProperty(value = "融合资源属性") + private List fuseAttrList; +} diff --git a/renren-admin/src/main/java/io/renren/modules/fuse/dto/TbFuseResourceDTO.java b/renren-admin/src/main/java/io/renren/modules/fuse/dto/TbFuseResourceDTO.java new file mode 100644 index 00000000..fc3b986b --- /dev/null +++ b/renren-admin/src/main/java/io/renren/modules/fuse/dto/TbFuseResourceDTO.java @@ -0,0 +1,26 @@ +package io.renren.modules.fuse.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Auther:lizhicheng2@hisense.com + * @date:2022/7/3 + * @des + */ +@Data +@ApiModel(value = "资源融合关系表") +public class TbFuseResourceDTO { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键ID") + private Long id; + @ApiModelProperty(value = "融合服务id") + private Long fuseId; + @ApiModelProperty(value = "资源id") + private Long resourceId; + @ApiModelProperty(value = "资源挂载顺序") + private String sequence; + +} diff --git a/renren-admin/src/main/java/io/renren/modules/fuse/entity/TbFuseAttrEntity.java b/renren-admin/src/main/java/io/renren/modules/fuse/entity/TbFuseAttrEntity.java new file mode 100644 index 00000000..c8f28cbc --- /dev/null +++ b/renren-admin/src/main/java/io/renren/modules/fuse/entity/TbFuseAttrEntity.java @@ -0,0 +1,36 @@ +package io.renren.modules.fuse.entity; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 融合资源属性表 + * + * @Auther:lizhicheng2@hisense.com + * @date:2022/7/3 + * @des + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("tb_fuse_attr") +public class TbFuseAttrEntity { + private static final long serialVersionUID = 1L; + + @TableId + private Long id; + /** + * 融合服务id + */ + private Long fuseId; + /** + * 属性类型 + */ + private String attrType; + /** + * 属性值 + */ + private String attrValue; + +} diff --git a/renren-admin/src/main/java/io/renren/modules/fuse/entity/TbFuseEntity.java b/renren-admin/src/main/java/io/renren/modules/fuse/entity/TbFuseEntity.java new file mode 100644 index 00000000..5948af97 --- /dev/null +++ b/renren-admin/src/main/java/io/renren/modules/fuse/entity/TbFuseEntity.java @@ -0,0 +1,81 @@ +package io.renren.modules.fuse.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import io.renren.common.entity.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +/** + * 融合服务表 + * + * @Auther:lizhicheng2@hisense.com + * @date:2022/6/30 + * @des + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("tb_fuse") +public class TbFuseEntity extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** + * 融合服务名称 + */ + private String name; + /** + * 融合服务描述 + */ + private String description; + /** + * 应用领域 + */ + private String applicationArea; + /** + * 所属部门 + */ + private Long deptId; + /** + * 部门联系人 + */ + private String deptUser; + /** + * 部门联系人电话 + */ + private String mobile; + /** + * 服务商 + */ + private String provider; + /** + * 服务商联系人 + */ + private String providerUser; + /** + * 服务商联系人电话 + */ + private String providerMobile; + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + private Long creator; + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private Date createDate; + /** + * 修改人 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private Long updater; + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateDate; +} diff --git a/renren-admin/src/main/java/io/renren/modules/fuse/entity/TbFuseResourceEntity.java b/renren-admin/src/main/java/io/renren/modules/fuse/entity/TbFuseResourceEntity.java new file mode 100644 index 00000000..f1b1a932 --- /dev/null +++ b/renren-admin/src/main/java/io/renren/modules/fuse/entity/TbFuseResourceEntity.java @@ -0,0 +1,36 @@ +package io.renren.modules.fuse.entity; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.renren.common.entity.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 资源融合关系表 + * + * @Auther:lizhicheng2@hisense.com + * @date:2022/6/30 + * @des + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("tb_fuse_resource") +public class TbFuseResourceEntity { + private static final long serialVersionUID = 1L; + + @TableId + private Long id; + /** + * 融合服务id + */ + private Long fuseId; + /** + * 资源id + */ + private Long resourceId; + /** + * 顺序 + */ + private String sequence; +} diff --git a/renren-admin/src/main/java/io/renren/modules/fuse/service/TbFuseService.java b/renren-admin/src/main/java/io/renren/modules/fuse/service/TbFuseService.java new file mode 100644 index 00000000..d731cc86 --- /dev/null +++ b/renren-admin/src/main/java/io/renren/modules/fuse/service/TbFuseService.java @@ -0,0 +1,24 @@ +package io.renren.modules.fuse.service; + +import io.renren.common.service.CrudService; +import io.renren.modules.fuse.dto.TbFuseDTO; +import io.renren.modules.fuse.entity.TbFuseEntity; + +import java.util.Map; + +/** + * @Auther:lizhicheng2@hisense.com + * @date:2022/6/30 + * @des + */ +public interface TbFuseService extends CrudService { + + TbFuseDTO getFuseById(Long id); + + Integer addFuse(TbFuseDTO dto); + + Integer updateFuse(TbFuseDTO dto); + + Integer deleteFuse(Long id); + +} diff --git a/renren-admin/src/main/java/io/renren/modules/fuse/service/impl/TbFuseServiceImpl.java b/renren-admin/src/main/java/io/renren/modules/fuse/service/impl/TbFuseServiceImpl.java new file mode 100644 index 00000000..848d2165 --- /dev/null +++ b/renren-admin/src/main/java/io/renren/modules/fuse/service/impl/TbFuseServiceImpl.java @@ -0,0 +1,200 @@ +package io.renren.modules.fuse.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.IdWorker; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import io.renren.common.page.PageData; +import io.renren.common.service.impl.CrudServiceImpl; +import io.renren.modules.fuse.dao.TbFuseAttrDao; +import io.renren.modules.fuse.dao.TbFuseDao; +import io.renren.modules.fuse.dao.TbFuseResourceDao; +import io.renren.modules.fuse.dto.TbFuseAttrDTO; +import io.renren.modules.fuse.dto.TbFuseDTO; +import io.renren.modules.fuse.dto.TbFuseResourceDTO; +import io.renren.modules.fuse.entity.TbFuseAttrEntity; +import io.renren.modules.fuse.entity.TbFuseEntity; +import io.renren.modules.fuse.entity.TbFuseResourceEntity; +import io.renren.modules.fuse.service.TbFuseService; +import io.renren.modules.resource.service.impl.ResourceServiceImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @Auther:lizhicheng2@hisense.com + * @date:2022/6/30 + * @des + */ +@Service +public class TbFuseServiceImpl extends CrudServiceImpl implements TbFuseService { + + private static final Logger logger = LoggerFactory.getLogger(ResourceServiceImpl.class); + + @Autowired + private TbFuseDao fuseDao; + @Autowired + private TbFuseResourceDao fuseResourceDao; + @Autowired + private TbFuseAttrDao fuseAttrDao; + + @Override + public QueryWrapper getWrapper(Map params) { + QueryWrapper wrapper = new QueryWrapper<>(); + params.keySet().stream().filter(index -> null != params.get(index)).forEach(index -> { + switch (index) { + case "name": + wrapper.like(StringUtils.isNotBlank(params.get("name").toString()), "name", params.get("name").toString()); + break; + case "description": + wrapper.like(StringUtils.isNotBlank(params.get("description").toString()), "description", params.get("description").toString()); + break; + case "applicationArea": + wrapper.like(StringUtils.isNotBlank(params.get("applicationArea").toString()), "application_area", params.get("applicationArea").toString()); + break; + case "deptId": + wrapper.eq(StringUtils.isNotBlank(params.get("deptId").toString()), "dept_id", params.get("deptId").toString()); + break; + case "deptUser": + wrapper.like(StringUtils.isNotBlank(params.get("deptUser").toString()), "dept_user", params.get("deptUser").toString()); + break; + case "mobile": + wrapper.like(StringUtils.isNotBlank(params.get("mobile").toString()), "mobile", params.get("mobile").toString()); + break; + case "provider": + wrapper.like(StringUtils.isNotBlank(params.get("provider").toString()), "provider", params.get("provider").toString()); + break; + case "providerUser": + wrapper.like(StringUtils.isNotBlank(params.get("providerUser").toString()), "provider_user", params.get("providerUser").toString()); + break; + case "providerMobile": + wrapper.like(StringUtils.isNotBlank(params.get("providerMobile").toString()), "provider_mobile", params.get("providerMobile").toString()); + break; + case "creator": + wrapper.eq(StringUtils.isNotBlank(params.get("creator").toString()), "creator", params.get("creator").toString()); + break; + case "createDate": + wrapper.eq(StringUtils.isNotBlank(params.get("createDate").toString()), "create_date", params.get("createDate").toString()); + break; + case "updater": + wrapper.eq(StringUtils.isNotBlank(params.get("updater").toString()), "updater", params.get("updater").toString()); + break; + case "updateDate": + wrapper.eq(StringUtils.isNotBlank(params.get("updateDate").toString()), "update_date", params.get("updateDate").toString()); + break; + } + }); + return wrapper; + } + + @Override + public PageData page(Map params){ + IPage page = baseDao.selectPage( + getPage(params, null, false), + getWrapper(params) + ); + List result=page.getRecords().stream().map(entity->{ + TbFuseDTO dto=new TbFuseDTO(); + BeanUtils.copyProperties(entity, dto); + dto.setFuseResourceList(getFuseResourceByFuseId(dto.getId())); + dto.setFuseAttrList(getAttrByFuseId(dto.getId())); + return dto; + }).collect(Collectors.toList()); + return new PageData(result, page.getTotal()); + } + + @Override + public TbFuseDTO getFuseById(Long id) { + TbFuseEntity fuseEntity = fuseDao.selectById(id); + TbFuseDTO fuseDTO = new TbFuseDTO(); + BeanUtils.copyProperties(fuseEntity, fuseDTO); + fuseDTO.setFuseAttrList(getAttrByFuseId(id)); + fuseDTO.setFuseResourceList(getFuseResourceByFuseId(id)); + return fuseDTO; + } + + private List getAttrByFuseId(Long fuseId) { + QueryWrapper wrapper = new QueryWrapper(); + wrapper.eq("fuse_id", fuseId); + List list = fuseAttrDao.selectList(wrapper); + return list.stream().map(attr -> { + TbFuseAttrDTO dto = new TbFuseAttrDTO(); + BeanUtils.copyProperties(attr, dto); + return dto; + }).collect(Collectors.toList()); + } + + private List getFuseResourceByFuseId(Long fuseId) { + QueryWrapper wrapper = new QueryWrapper(); + wrapper.eq("fuse_id", fuseId); + List list = fuseResourceDao.selectList(wrapper); + return list.stream().map(attr -> { + TbFuseResourceDTO dto = new TbFuseResourceDTO(); + BeanUtils.copyProperties(attr, dto); + return dto; + }).collect(Collectors.toList()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer addFuse(TbFuseDTO dto) { + TbFuseEntity fuseEntity = new TbFuseEntity(); + BeanUtils.copyProperties(dto, fuseEntity); + int result=fuseDao.insert(fuseEntity); + dto.getFuseResourceList().forEach(fuseResourceDTO->{ + fuseResourceDTO.setId(IdWorker.getId(fuseResourceDTO)); + fuseResourceDTO.setFuseId(fuseEntity.getId()); + TbFuseResourceEntity entity=new TbFuseResourceEntity(); + BeanUtils.copyProperties(fuseResourceDTO, entity); + fuseResourceDao.insert(entity); + }); + dto.getFuseAttrList().forEach(fuseAttrDTO -> { + fuseAttrDTO.setId(IdWorker.getId(fuseAttrDTO)); + fuseAttrDTO.setFuseId(fuseEntity.getId()); + TbFuseAttrEntity entity=new TbFuseAttrEntity(); + BeanUtils.copyProperties(fuseAttrDTO, entity); + fuseAttrDao.insert(entity); + }); + return result; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer updateFuse(TbFuseDTO dto) { + TbFuseEntity fuseEntity = new TbFuseEntity(); + BeanUtils.copyProperties(dto, fuseEntity); + fuseResourceDao.deleteByFuseId(fuseEntity.getId()); + dto.getFuseResourceList().forEach(fuseResourceDTO->{ + fuseResourceDTO.setId(IdWorker.getId(fuseResourceDTO)); + fuseResourceDTO.setFuseId(fuseEntity.getId()); + TbFuseResourceEntity entity=new TbFuseResourceEntity(); + BeanUtils.copyProperties(fuseResourceDTO, entity); + fuseResourceDao.insert(entity); + }); + fuseAttrDao.deleteByFuseId(fuseEntity.getId()); + dto.getFuseAttrList().forEach(fuseAttrDTO -> { + fuseAttrDTO.setId(IdWorker.getId(fuseAttrDTO)); + fuseAttrDTO.setFuseId(fuseEntity.getId()); + TbFuseAttrEntity entity=new TbFuseAttrEntity(); + BeanUtils.copyProperties(fuseAttrDTO, entity); + fuseAttrDao.insert(entity); + }); + return fuseDao.updateById(fuseEntity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer deleteFuse(Long id) { + fuseResourceDao.deleteByFuseId(id); + fuseAttrDao.deleteByFuseId(id); + return fuseDao.deleteById(id); + } + +} diff --git a/renren-admin/src/main/java/io/renren/modules/gateway/controller/MonitorController.java b/renren-admin/src/main/java/io/renren/modules/gateway/controller/MonitorController.java index 72fc22ea..df3f1689 100644 --- a/renren-admin/src/main/java/io/renren/modules/gateway/controller/MonitorController.java +++ b/renren-admin/src/main/java/io/renren/modules/gateway/controller/MonitorController.java @@ -2,27 +2,30 @@ package io.renren.modules.gateway.controller; import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; import lombok.extern.log4j.Log4j2; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.*; import org.springframework.http.converter.ByteArrayHttpMessageConverter; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.HttpMessageConverterExtractor; import org.springframework.web.client.RequestCallback; import org.springframework.web.client.RestTemplate; +import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; -import java.util.Collections; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.List; +import java.net.URL; +import java.net.URLConnection; +import java.util.*; @Controller @Api(tags = "网关统计") @@ -38,14 +41,17 @@ public class MonitorController { @Value("${server.servlet.context-path}") private String context_path; - @RequestMapping("/metrics/**") +// @RequestMapping("/metrics/**") void forward(HttpServletRequest request, HttpServletResponse response) throws IOException { //类似nginx匹配前缀 String location = "/juapi"; String requestURI = request.getRequestURI(); requestURI = requestURI.replace( context_path,""); - String url = gatewayDomain + location + requestURI + "?" + request.getQueryString() ; + String url = gatewayDomain + location + requestURI ; + if (StringUtils.isNotBlank(request.getQueryString())) { + url = url + "?" + request.getQueryString(); + } HttpMethod httpMethod = HttpMethod.valueOf(request.getMethod()); HttpHeaders headers = new HttpHeaders(); @@ -71,13 +77,6 @@ public class MonitorController { }else { httpEntity = new HttpEntity(headers); } -// RequestCallback requestCallback = restTemplate.httpEntityCallback(httpEntity, byte[].class); -// HttpMessageConverterExtractor responseExtractor = -// new HttpMessageConverterExtractor<>(byte[].class, Collections.singletonList(new ByteArrayHttpMessageConverter())); -// -// byte[] body = restTemplate.execute(url, httpMethod, requestCallback, responseExtractor); - - ResponseEntity responseEntity = restTemplate.exchange(url, httpMethod, httpEntity, byte[].class, new HashMap()); @@ -90,7 +89,51 @@ public class MonitorController { byte[] body = responseEntity.getBody(); response.getOutputStream().write(body); + } + @GetMapping("/metrics/**") + @ApiOperation("前端访问图片请求转发") + public void ford(HttpServletRequest request, HttpServletResponse response){ + String location = "/juapi"; + + String requestURI = request.getRequestURI(); + requestURI = requestURI.replace( context_path,""); + String fordUrl = gatewayDomain + location + requestURI ; + if (StringUtils.isNotBlank(request.getQueryString())) { + fordUrl = fordUrl + "?" + request.getQueryString(); + } + + URLConnection con; + + try { + URL url = new URL(fordUrl); + con = url.openConnection(); + + //允许写出 + con.setDoOutput(true); + //允许读入 + con.setDoInput(true); + //不使用缓存 + con.setUseCaches(false); + //得到响应流 + InputStream inputStream = con.getInputStream(); + Map> headerFields = con.getHeaderFields(); + headerFields.forEach((key, heads) -> { + if (headerFields.isEmpty()) return; + response.setHeader(key, heads.get(0)); + }); + + ServletOutputStream outputStream = response.getOutputStream(); + byte[] buffer = new byte[1024]; + int len = inputStream.read(buffer); + while (len != -1) { + outputStream.write(buffer, 0, len); + len = inputStream.read(buffer); + } + inputStream.close(); + }catch(Exception e) { + e.printStackTrace(); + } } } diff --git a/renren-admin/src/main/java/io/renren/modules/monitor/service/MonitorService.java b/renren-admin/src/main/java/io/renren/modules/monitor/service/MonitorService.java index ca25a32e..9327b970 100644 --- a/renren-admin/src/main/java/io/renren/modules/monitor/service/MonitorService.java +++ b/renren-admin/src/main/java/io/renren/modules/monitor/service/MonitorService.java @@ -37,10 +37,14 @@ import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; @Service @Log4j2 public class MonitorService { + private static Integer cpuNUm = Runtime.getRuntime().availableProcessors(); + private static final ExecutorService executor = Executors.newFixedThreadPool(cpuNUm); @Autowired private RestTemplate restTemplate; @@ -92,7 +96,7 @@ public class MonitorService { log.warn("摄像头登录异常,跳过", e); } return null; - }); + }, executor); } public String monitorLogin() { @@ -768,15 +772,15 @@ public class MonitorService { cameraOrgenMapper.insert(cameraOrganization); videoService((String) result.get("id"), path + sep + result.get("name")); } else if (result.get("channelId") != null) { - CameraChannel cameraChannel = JSONObject.parseObject(JSONObject.toJSONString(result), CameraChannel.class); - String id = (String) result.get("orgCode"); - if (path != null && path.startsWith(sep)) { - path = path.substring(sep.length()); - } - cameraChannel.setNodeName(path); - cameraChannel.setParentId(id); - cameraChannelMapper.insert(cameraChannel); + CameraChannel cameraChannel = JSONObject.parseObject(JSONObject.toJSONString(result), CameraChannel.class); + String id = (String) result.get("orgCode"); + if (path != null && path.startsWith(sep)) { + path = path.substring(sep.length()); } + cameraChannel.setNodeName(path); + cameraChannel.setParentId(id); + cameraChannelMapper.insert(cameraChannel); + } } } diff --git a/renren-admin/src/main/java/io/renren/modules/processForm/listener/CorrectionListener.java b/renren-admin/src/main/java/io/renren/modules/processForm/listener/CorrectionListener.java index a7516d56..92d3dfab 100644 --- a/renren-admin/src/main/java/io/renren/modules/processForm/listener/CorrectionListener.java +++ b/renren-admin/src/main/java/io/renren/modules/processForm/listener/CorrectionListener.java @@ -36,7 +36,6 @@ import java.util.Date; import java.util.Map; import java.util.Optional; import java.util.UUID; -import java.util.concurrent.CompletableFuture; /** * 部门动态审批人 @@ -140,11 +139,10 @@ public class CorrectionListener implements TaskListener, ExecutionListener, Acti abilityApplicationDTO.setApproveStatus("通过"); tAbilityApplicationService.update(abilityApplicationDTO); logger.error("审批通过!申请id:" + abilityApplicationDTO.getId()); - CompletableFuture.runAsync(() -> { - jdbcTemplate.update("update tb_data_resource,\n" + - "tb_data_resource_assignmark\n" + - "SET tb_data_resource.total = round(tb_data_resource_assignmark.total) WHERE tb_data_resource.id =" + abilityApplicationDTO.getResourceId()); - }); + jdbcTemplate.update("update tb_data_resource,\n" + + "tb_data_resource_assignmark\n" + + "SET tb_data_resource.total = round(tb_data_resource_assignmark.total) WHERE tb_data_resource.id =" + abilityApplicationDTO.getResourceId()); + } } } diff --git a/renren-admin/src/main/java/io/renren/modules/resource/controller/ResourceController.java b/renren-admin/src/main/java/io/renren/modules/resource/controller/ResourceController.java index fd59a927..9fc6b568 100644 --- a/renren-admin/src/main/java/io/renren/modules/resource/controller/ResourceController.java +++ b/renren-admin/src/main/java/io/renren/modules/resource/controller/ResourceController.java @@ -45,6 +45,8 @@ import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.util.*; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import java.util.stream.Collectors; /** @@ -57,6 +59,7 @@ import java.util.stream.Collectors; @RequestMapping("/resource") @Api(tags = "资源表") public class ResourceController { + private Integer cpuNUm = Runtime.getRuntime().availableProcessors(); @Value("${big_date.name}") private String bigDateDeptName; // 大数据局名称 @@ -162,13 +165,14 @@ public class ResourceController { */ @GetMapping("/updateTest") public Result updateTest() { + final ExecutorService executor = Executors.newFixedThreadPool(cpuNUm); CompletableFuture.runAsync(() -> { List ids = jdbcTemplate.queryForList("SELECT id FROM tb_data_resource", Long.class); ids.stream().forEach(id -> { ResourceDTO data = resourceService.selectWithAttrs(id); resourceService.update(data); }); - }); + }, executor); return new Result().ok(LocalDateTime.now().toString()); } diff --git a/renren-admin/src/main/java/io/renren/modules/resource/service/ResourceService.java b/renren-admin/src/main/java/io/renren/modules/resource/service/ResourceService.java index 9f8c8709..0175ab01 100644 --- a/renren-admin/src/main/java/io/renren/modules/resource/service/ResourceService.java +++ b/renren-admin/src/main/java/io/renren/modules/resource/service/ResourceService.java @@ -127,4 +127,7 @@ public interface ResourceService extends CrudService implements ResourceService { + private Integer cpuNUm = Runtime.getRuntime().availableProcessors(); private static final Logger logger = LoggerFactory.getLogger(ResourceServiceImpl.class); @@ -171,6 +172,9 @@ public class ResourceServiceImpl extends CrudServiceImpl getWrapper(Map params) { QueryWrapper wrapper = new QueryWrapper<>(); @@ -224,6 +228,86 @@ public class ResourceServiceImpl extends CrudServiceImpl resourceRels = new ArrayList<>(); + for (String keyid : ids) { + TbDataResourceRelEntity resourceRel = new TbDataResourceRelEntity(); + resourceRel.setKeyId(Long.valueOf(keyid)); + resourceRel.setReferenceId(resourceID); + tbDataResourceRelDao.insert(resourceRel); + } + } + } + } + if ("关联组件信息".equalsIgnoreCase(attrEntity.getAttrType())) { + if (StringUtils.isNotBlank(attrEntity.getAttrValue())) { + String[] ids = attrEntity.getAttrValue().split(","); + if (ids.length != 0) { + List resourceRels = new ArrayList<>(); + for (String keyid : ids) { + TbDataResourceRelEntity resourceRel = new TbDataResourceRelEntity(); + resourceRel.setKeyId(resourceID); + resourceRel.setReferenceId(Long.valueOf(keyid)); + tbDataResourceRelDao.insert(resourceRel); + } + } + } + } + + } + } + resourceEntity.setInfoList(attrEntities_); + resourceDao.updateById(resourceEntity); + } + + + @Override + @Transactional + @CacheEvict(cacheNames = {selectDeptListKey, selectDTOPageSpecilTotalKey}, allEntries = true) + public void createMixAbility(ResourceDTO dto) { + ResourceEntity resourceEntity = new ResourceEntity(); + BeanUtils.copyProperties(dto, resourceEntity); + Long resourceID = IdWorker.getId(resourceEntity); + resourceEntity.setId(resourceID); + resourceEntity.setVisits(0L); + if (dto.getDelFlag() == null) { + resourceEntity.setDelFlag(ResourceEntityDelFlag.NORMAL.getFlag()); + } + resourceDao.insert(resourceEntity); + BeanUtils.copyProperties(resourceEntity, dto); + List attrEntities = dto.getInfoList(); + List attrEntities_ = new ArrayList<>(); + if (attrEntities != null) { + attrEntities.forEach(item -> { + item.setDelFlag(ResourceEntityDelFlag.NORMAL.getFlag()); + item.setDataResourceId(resourceID); + attrDao.insert(item); + attrEntities_.add(item); + }); + } + for (AttrEntity attrEntity : resourceEntity.getInfoList()) { + if ("融合服务".equalsIgnoreCase(attrEntity.getAttrType())) { + if (StringUtils.isNotBlank(attrEntity.getAttrValue())) { + String[] ids = attrEntity.getAttrValue().split(","); + if (ids.length != 0) { + List resourceRels = new ArrayList<>(); + for (String keyid : ids) { + TbDataResourceRelEntity resourceRel = new TbDataResourceRelEntity(); + resourceRel.setKeyId(Long.valueOf(keyid)); + resourceRel.setReferenceId(resourceID); + tbDataResourceRelDao.insert(resourceRel); + } + } + } + } + } resourceEntity.setInfoList(attrEntities_); resourceDao.updateById(resourceEntity); } @@ -608,11 +692,10 @@ public class ResourceServiceImpl extends CrudServiceImpl { - jdbcTemplate.update("update tb_data_resource,\n" + - "tb_data_resource_assignmark\n" + - "SET tb_data_resource.total = round(tb_data_resource_assignmark.total) WHERE tb_data_resource.id =" + id); - }); + jdbcTemplate.update("update tb_data_resource,\n" + + "tb_data_resource_assignmark\n" + + "SET tb_data_resource.total = round(tb_data_resource_assignmark.total) WHERE tb_data_resource.id =" + id); + } @Override @@ -671,6 +754,7 @@ public class ResourceServiceImpl extends CrudServiceImpl resultList = new CopyOnWriteArrayList<>(); HashMap resourceMap = new HashMap<>(); resourceMap.put("type", "全部能力目录"); @@ -696,7 +780,7 @@ public class ResourceServiceImpl extends CrudServiceImpl item1.remove("type")); map.put("dataList", value); areaListTemp.add(map); - }); + }, executor); tasksArea.add(task); }); CompletableFuture.allOf(tasksArea.toArray(new CompletableFuture[tasksArea.size()])).join(); @@ -1251,7 +1335,7 @@ public class ResourceServiceImpl extends CrudServiceImpl(list, list.size()); } - Map paraMap = new ConcurrentHashMap<>(); - paraMap.put("resourceType", params.get("resourceType")); + Map paraMap = new ConcurrentHashMap<>(); + paraMap.put("resourceType", params.get("resourceType")); //分别根据部门获取组件使用总数和调用数 //申请数 // CompletableFuture voidCompletableFuture01 = CompletableFuture.runAsync(() -> { @@ -1442,7 +1526,7 @@ public class ResourceServiceImpl extends CrudServiceImpl voidCompletableFuture01 = CompletableFuture.runAsync(() -> { maps.forEach(m -> { - m.put("resourceCallNum",0); + m.put("resourceCallNum", 0); }); }); diff --git a/renren-admin/src/main/java/io/renren/modules/resourceCollection/service/impl/ResourceCollectionServiceImpl.java b/renren-admin/src/main/java/io/renren/modules/resourceCollection/service/impl/ResourceCollectionServiceImpl.java index 0a246cf5..8e8c0e99 100644 --- a/renren-admin/src/main/java/io/renren/modules/resourceCollection/service/impl/ResourceCollectionServiceImpl.java +++ b/renren-admin/src/main/java/io/renren/modules/resourceCollection/service/impl/ResourceCollectionServiceImpl.java @@ -19,7 +19,6 @@ import org.springframework.transaction.annotation.Transactional; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.concurrent.CompletableFuture; /** * 能力收藏表 diff --git a/renren-admin/src/main/java/io/renren/modules/resourceScore/service/impl/ResourceScoreServiceImpl.java b/renren-admin/src/main/java/io/renren/modules/resourceScore/service/impl/ResourceScoreServiceImpl.java index 6a32e146..aaeac2b0 100644 --- a/renren-admin/src/main/java/io/renren/modules/resourceScore/service/impl/ResourceScoreServiceImpl.java +++ b/renren-admin/src/main/java/io/renren/modules/resourceScore/service/impl/ResourceScoreServiceImpl.java @@ -15,7 +15,6 @@ import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; import java.util.Map; -import java.util.concurrent.CompletableFuture; /** * 能力评分表 @@ -34,11 +33,9 @@ public class ResourceScoreServiceImpl extends CrudServiceImpl { - jdbcTemplate.update("update tb_data_resource,\n" + - "tb_data_resource_assignmark\n" + - "SET tb_data_resource.total = round(tb_data_resource_assignmark.total) WHERE tb_data_resource.id =" + dto.getResourceId()); - }); + jdbcTemplate.update("update tb_data_resource,\n" + + "tb_data_resource_assignmark\n" + + "SET tb_data_resource.total = round(tb_data_resource_assignmark.total) WHERE tb_data_resource.id =" + dto.getResourceId()); } diff --git a/renren-admin/src/main/java/io/renren/modules/security/controller/LoginController.java b/renren-admin/src/main/java/io/renren/modules/security/controller/LoginController.java index eb976614..8ca7443b 100644 --- a/renren-admin/src/main/java/io/renren/modules/security/controller/LoginController.java +++ b/renren-admin/src/main/java/io/renren/modules/security/controller/LoginController.java @@ -160,14 +160,6 @@ public class LoginController { //退出 sysUserTokenService.logout(user.getId()); - try { - if (yaweiEnable) { - //清理亚威登录状态 - YaWeiCookieManage.clearnTicket(request, response); - } - } catch (Exception e) { - logger.error("清理亚威登录状态失败", e); - } //用户信息 SysLogLoginEntity log = new SysLogLoginEntity(); log.setOperation(LoginOperationEnum.LOGOUT.value()); diff --git a/renren-admin/src/main/resources/db/V3.0__fuse_add_table.sql b/renren-admin/src/main/resources/db/V3.0__fuse_add_table.sql new file mode 100644 index 00000000..8b9b18e0 --- /dev/null +++ b/renren-admin/src/main/resources/db/V3.0__fuse_add_table.sql @@ -0,0 +1,33 @@ +CREATE TABLE `tb_fuse` ( + `id` bigint(20) NOT NULL COMMENT '主键', + `name` varchar(128) DEFAULT NULL COMMENT '融合服务名称', + `description` varchar(128) DEFAULT NULL COMMENT '融合服务描述', + `application_area` varchar(128) DEFAULT NULL COMMENT '应用领域', + `dept_id` bigint(20) DEFAULT NULL COMMENT '所属部门', + `dept_user` varchar(128) DEFAULT NULL COMMENT '部门联系人', + `mobile` varchar(20) DEFAULT NULL COMMENT '部门联系人电话', + `provider` varchar(128) DEFAULT NULL COMMENT '服务商', + `provider_user` varchar(128) DEFAULT NULL COMMENT '服务商联系人', + `provider_mobile` varchar(20) DEFAULT NULL COMMENT '服务商联系人电话', + `creator` bigint(20) DEFAULT NULL COMMENT '创建人', + `create_date` datetime DEFAULT NULL COMMENT '创建时间', + `updater` bigint(20) DEFAULT NULL COMMENT '修改人', + `update_date` datetime DEFAULT NULL COMMENT '修改时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='融合服务表'; + +CREATE TABLE `tb_fuse_resource` ( + `id` bigint(20) NOT NULL COMMENT '主键', + `fuse_id` bigint(20) NOT NULL COMMENT '融合id', + `resource_id` bigint(20) NOT NULL COMMENT '资源id', + `sequence` varchar(10) DEFAULT NULL COMMENT '顺序', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='资源融合关系表'; + +CREATE TABLE `tb_fuse_attr` ( + `id` bigint(20) NOT NULL COMMENT '主键', + `fuse_id` bigint(20) DEFAULT NULL COMMENT '融合id', + `attr_type` varchar(128) DEFAULT NULL COMMENT '属性类型', + `attr_value` varchar(128) DEFAULT NULL COMMENT '属性值', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='融合资源属性表'; \ No newline at end of file diff --git a/renren-admin/src/main/resources/db/V3.1__add_model.sql b/renren-admin/src/main/resources/db/V3.1__add_model.sql new file mode 100644 index 00000000..d3e6d40a --- /dev/null +++ b/renren-admin/src/main/resources/db/V3.1__add_model.sql @@ -0,0 +1,4 @@ +INSERT INTO `act_ge_bytearray` VALUES ('857502', 16, 'source', NULL, 0x7B227265736F757263654964223A22383537353031222C2270726F70657274696573223A7B2270726F636573735F6964223A226162696C69747970726F636573735F7632222C226E616D65223A22E883BDE58A9BE794B3E8AFB7222C22646F63756D656E746174696F6E223A22E883BDE58A9BE794B3E8AFB77632EFBC9B5C6EE694AFE68C81E689B9E9878FE794B3E8AFB7E68B86E58886E4BE9BE8B584E6BA90E68980E5B19EE983A8E997A8E5AEA1E6A0B8222C2270726F636573735F617574686F72223A22222C2270726F636573735F76657273696F6E223A22222C2270726F636573735F6E616D657370616365223A22687474703A2F2F7777772E61637469766974692E6F72672F70726F63657373646566222C22657865637574696F6E6C697374656E657273223A22222C226576656E746C697374656E657273223A22222C227369676E616C646566696E6974696F6E73223A22222C226D657373616765646566696E6974696F6E73223A22227D2C227374656E63696C223A7B226964223A2242504D4E4469616772616D227D2C226368696C64536861706573223A5B7B227265736F757263654964223A227369642D34314233314336302D353835332D343637412D383632312D453035364541343738343743222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E58F91E8B5B7E794B3E8AFB7222C22646F63756D656E746174696F6E223A22222C22657865637574696F6E6C697374656E657273223A22222C22696E69746961746F72223A22222C22666F726D6B6579646566696E6974696F6E223A22222C22666F726D70726F70657274696573223A22227D2C227374656E63696C223A7B226964223A2253746172744E6F6E654576656E74227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D38323536343646312D393041312D343039362D423832412D423732414532424231423746227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A34352C2279223A3136337D2C2275707065724C656674223A7B2278223A31352C2279223A3133337D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D46384136453641462D364634452D343045412D423533452D463931323633323741453831222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E794B3E8AFB7E4BABAE5BD95E585A5E794B3E8AFB7E8A1A8E58D95222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C22657865637574696F6E6C697374656E657273223A22222C226D756C7469696E7374616E63655F74797065223A224E6F6E65222C226D756C7469696E7374616E63655F63617264696E616C697479223A22222C226D756C7469696E7374616E63655F636F6C6C656374696F6E223A22222C226D756C7469696E7374616E63655F7661726961626C65223A22222C226D756C7469696E7374616E63655F636F6E646974696F6E223A22222C226973666F72636F6D70656E736174696F6E223A2266616C7365222C22757365727461736B61737369676E6D656E74223A22222C22666F726D6B6579646566696E6974696F6E223A22222C2264756564617465646566696E6974696F6E223A22222C227072696F72697479646566696E6974696F6E223A22222C22666F726D70726F70657274696573223A22222C227461736B6C697374656E657273223A7B227461736B4C697374656E657273223A5B7B226576656E74223A2261737369676E6D656E74222C22696D706C656D656E746174696F6E223A22247B696E69746961746F7244617461456E7472794C697374656E65727D222C22636C6173734E616D65223A22222C2265787072657373696F6E223A22222C2264656C656761746545787072657373696F6E223A22247B696E69746961746F7244617461456E7472794C697374656E65727D227D2C7B226576656E74223A22637265617465222C22696D706C656D656E746174696F6E223A22247B696E69746961746F7244617461456E7472794C697374656E65727D222C22636C6173734E616D65223A22222C2265787072657373696F6E223A22222C2264656C656761746545787072657373696F6E223A22247B696E69746961746F7244617461456E7472794C697374656E65727D227D5D7D7D2C227374656E63696C223A7B226964223A22557365725461736B227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D31343846443644312D394544462D343431412D424431452D314144463036464342423630227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3235302C2279223A3138387D2C2275707065724C656674223A7B2278223A3135302C2279223A3130387D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D38323536343646312D393041312D343039362D423832412D423732414532424231423746222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D46384136453641462D364634452D343045412D423533452D463931323633323741453831227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3134392E3835393337352C2279223A3134387D2C2275707065724C656674223A7B2278223A34352E3630393337352C2279223A3134387D7D2C22646F636B657273223A5B7B2278223A31352C2279223A31357D2C7B2278223A34392E39393939393939393939393939392C2279223A34307D5D2C22746172676574223A7B227265736F757263654964223A227369642D46384136453641462D364634452D343045412D423533452D463931323633323741453831227D7D2C7B227265736F757263654964223A227369642D32303245393938322D363442362D343338352D423035462D333746444446334233333444222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E5A4A7E695B0E68DAEE983A8E997A8E8B49FE8B4A3E4BABAE5AEA1E689B9222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C22657865637574696F6E6C697374656E657273223A22222C226D756C7469696E7374616E63655F74797065223A224E6F6E65222C226D756C7469696E7374616E63655F63617264696E616C697479223A22222C226D756C7469696E7374616E63655F636F6C6C656374696F6E223A22222C226D756C7469696E7374616E63655F7661726961626C65223A22222C226D756C7469696E7374616E63655F636F6E646974696F6E223A22222C226973666F72636F6D70656E736174696F6E223A2266616C7365222C22757365727461736B61737369676E6D656E74223A22222C22666F726D6B6579646566696E6974696F6E223A22222C2264756564617465646566696E6974696F6E223A22222C227072696F72697479646566696E6974696F6E223A22222C22666F726D70726F70657274696573223A22222C227461736B6C697374656E657273223A7B227461736B4C697374656E657273223A5B7B226576656E74223A22637265617465222C22696D706C656D656E746174696F6E223A22247B6461746143656E7465724C697374656E657256327D222C22636C6173734E616D65223A22222C2265787072657373696F6E223A22222C2264656C656761746545787072657373696F6E223A22247B6461746143656E7465724C697374656E657256327D227D2C7B226576656E74223A2261737369676E6D656E74222C22696D706C656D656E746174696F6E223A22247B6461746143656E7465724C697374656E657256327D222C22636C6173734E616D65223A22222C2265787072657373696F6E223A22222C2264656C656761746545787072657373696F6E223A22247B6461746143656E7465724C697374656E657256327D227D2C7B226576656E74223A22636F6D706C657465222C22696D706C656D656E746174696F6E223A22247B6461746143656E7465724C697374656E657256327D222C22636C6173734E616D65223A22222C2265787072657373696F6E223A22222C2264656C656761746545787072657373696F6E223A22247B6461746143656E7465724C697374656E657256327D227D5D7D7D2C227374656E63696C223A7B226964223A22557365725461736B227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D41384545444644392D344345332D344634462D384638302D454639433934314632303434227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3434352C2279223A3138387D2C2275707065724C656674223A7B2278223A3334352C2279223A3130387D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D37383738383730372D304139332D343544322D414545452D394641443339414641313536222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E8B584E6BA90E68980E5B19EE983A8E997A8E8B49FE8B4A3E4BABAE5AEA1E689B9222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C22657865637574696F6E6C697374656E657273223A22222C226D756C7469696E7374616E63655F74797065223A224E6F6E65222C226D756C7469696E7374616E63655F63617264696E616C697479223A22222C226D756C7469696E7374616E63655F636F6C6C656374696F6E223A22222C226D756C7469696E7374616E63655F7661726961626C65223A22222C226D756C7469696E7374616E63655F636F6E646974696F6E223A22222C226973666F72636F6D70656E736174696F6E223A2266616C7365222C22757365727461736B61737369676E6D656E74223A22222C22666F726D6B6579646566696E6974696F6E223A22222C2264756564617465646566696E6974696F6E223A22222C227072696F72697479646566696E6974696F6E223A22222C22666F726D70726F70657274696573223A22222C227461736B6C697374656E657273223A7B227461736B4C697374656E657273223A5B7B226576656E74223A22637265617465222C22696D706C656D656E746174696F6E223A22247B636F7272656374696F6E4C697374656E657256327D222C22636C6173734E616D65223A22222C2265787072657373696F6E223A22222C2264656C656761746545787072657373696F6E223A22247B636F7272656374696F6E4C697374656E657256327D227D2C7B226576656E74223A2261737369676E6D656E74222C22696D706C656D656E746174696F6E223A22247B636F7272656374696F6E4C697374656E657256327D222C22636C6173734E616D65223A22222C2265787072657373696F6E223A22222C2264656C656761746545787072657373696F6E223A22247B636F7272656374696F6E4C697374656E657256327D227D2C7B226576656E74223A22636F6D706C657465222C22696D706C656D656E746174696F6E223A22247B636F7272656374696F6E4C697374656E657256327D222C22636C6173734E616D65223A22222C2265787072657373696F6E223A22222C2264656C656761746545787072657373696F6E223A22247B636F7272656374696F6E4C697374656E657256327D227D5D7D7D2C227374656E63696C223A7B226964223A22557365725461736B227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D32444135433035352D314641392D343636362D393536462D303631364635463734334632227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3734352C2279223A3132357D2C2275707065724C656674223A7B2278223A3634352C2279223A34357D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D30374344324131382D464241462D344542392D423538342D463337323943324444453330222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E6B581E7A88BE7BB93E69D9F222C22646F63756D656E746174696F6E223A22222C22657865637574696F6E6C697374656E657273223A7B22657865637574696F6E4C697374656E657273223A5B7B226576656E74223A22656E64222C22696D706C656D656E746174696F6E223A22247B636F7272656374696F6E4C697374656E657256327D222C22636C6173734E616D65223A22222C2265787072657373696F6E223A22222C2264656C656761746545787072657373696F6E223A22247B636F7272656374696F6E4C697374656E657256327D227D5D7D7D2C227374656E63696C223A7B226964223A22456E644E6F6E654576656E74227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3730392C2279223A3233387D2C2275707065724C656674223A7B2278223A3638312C2279223A3231307D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D31343846443644312D394544462D343431412D424431452D314144463036464342423630222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D32303245393938322D363442362D343338352D423035462D333746444446334233333444227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3334342E34383832383132352C2279223A3134387D2C2275707065724C656674223A7B2278223A3235302E35313137313837352C2279223A3134387D7D2C22646F636B657273223A5B7B2278223A34392E39393939393939393939393939392C2279223A34307D2C7B2278223A35302C2279223A34307D5D2C22746172676574223A7B227265736F757263654964223A227369642D32303245393938322D363442362D343338352D423035462D333746444446334233333444227D7D2C7B227265736F757263654964223A227369642D35333943353441332D383536322D344242452D423742322D423031364334393833363731222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22E588A4E696ADE698AFE590A6E4B8BAE59FBAE7A180E8AEBEE696BDE8B584E6BA90222C2273657175656E6365666C6F776F72646572223A7B2273657175656E6365466C6F774F72646572223A5B227369642D44393433374232302D354445332D343446312D393035412D364643323834413037383335222C227369642D33433635364336422D313044362D343931382D424441452D364542323446303543374337225D7D7D2C227374656E63696C223A7B226964223A224578636C757369766547617465776179227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D33433635364336422D313044362D343931382D424441452D364542323446303543374337227D2C7B227265736F757263654964223A227369642D44393433374232302D354445332D343446312D393035412D364643323834413037383335227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3535302E352C2279223A3136387D2C2275707065724C656674223A7B2278223A3531302E352C2279223A3132387D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D41384545444644392D344345332D344634462D384638302D454639433934314632303434222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D35333943353441332D383536322D344242452D423742322D423031364334393833363731227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3531302E343435333132352C2279223A3134387D2C2275707065724C656674223A7B2278223A3434352E37353339303632352C2279223A3134387D7D2C22646F636B657273223A5B7B2278223A35302C2279223A34307D2C7B2278223A32302C2279223A32307D5D2C22746172676574223A7B227265736F757263654964223A227369642D35333943353441332D383536322D344242452D423742322D423031364334393833363731227D7D2C7B227265736F757263654964223A227369642D33433635364336422D313044362D343931382D424441452D364542323446303543374337222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E99D9EE59FBAE7A180E8AEBEE696BD222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22247B62617369635F666163696C6974696573203D3D2066616C73657D222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A66616C73657D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D37383738383730372D304139332D343544322D414545452D394641443339414641313536227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3634342E303938373132373830343434392C2279223A3134322E363831383934383837353530337D2C2275707065724C656674223A7B2278223A3534362E303236323837323139353535312C2279223A3130342E373038373330313132343439377D7D2C22646F636B657273223A5B7B2278223A32302E352C2279223A32302E357D2C7B2278223A35302C2279223A34307D5D2C22746172676574223A7B227265736F757263654964223A227369642D37383738383730372D304139332D343544322D414545452D394641443339414641313536227D7D2C7B227265736F757263654964223A227369642D32444135433035352D314641392D343636362D393536462D303631364635463734334632222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D30374344324131382D464241462D344542392D423538342D463337323943324444453330227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3639352C2279223A3230392E39363837357D2C2275707065724C656674223A7B2278223A3639352C2279223A3132352E30393337357D7D2C22646F636B657273223A5B7B2278223A35302C2279223A34307D2C7B2278223A31342C2279223A31347D5D2C22746172676574223A7B227265736F757263654964223A227369642D30374344324131382D464241462D344542392D423538342D463337323943324444453330227D7D2C7B227265736F757263654964223A227369642D44393433374232302D354445332D343446312D393035412D364643323834413037383335222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E4B8BAE59FBAE7A180E8AEBEE696BDE8B584E6BA90222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22247B62617369635F666163696C6974696573203D3D20747275657D222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A66616C73657D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D30374344324131382D464241462D344542392D423538342D463337323943324444453330227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3638312E393139373630373631363032322C2279223A3231372E393738333034343936393537317D2C2275707065724C656674223A7B2278223A3534342E373230383634323338333937382C2279223A3135342E383136363137333738303432397D7D2C22646F636B657273223A5B7B2278223A32302E352C2279223A32302E357D2C7B2278223A31342C2279223A31347D5D2C22746172676574223A7B227265736F757263654964223A227369642D30374344324131382D464241462D344542392D423538342D463337323943324444453330227D7D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A313230302C2279223A313035307D2C2275707065724C656674223A7B2278223A302C2279223A307D7D2C227374656E63696C736574223A7B2275726C223A227374656E63696C736574732F62706D6E322E302F62706D6E322E302E6A736F6E222C226E616D657370616365223A22687474703A2F2F62336D6E2E6F72672F7374656E63696C7365742F62706D6E322E3023227D2C227373657874656E73696F6E73223A5B5D7D, NULL); +INSERT INTO `act_ge_bytearray` VALUES ('857503', 11, 'source-extra', NULL, 0x89504E470D0A1A0A0000000D494844520000031B000001200806000000DCFC6E8E000000206348524D00007A26000080840000FA00000080E8000075300000EA6000003A98000017709CBA513C0000000467414D410000B18E7CFB5193000000017352474200AECE1CE900000006624B474400FF00FF00FFA0BDA793000000097048597300000EC400000EC401952B0E1B000020004944415478DAEDDD097C94D5BDFFF133930412081891252C2A22B62C01970B16D46ABCB229B66AAF6912901A442BB6F2C7AD558B088AA854B94A9522B752830A49C48DAA55400A220A565028A02808019504054C5813B2CCFFF7CB7306863893CC64CFE4F37EBD0EB33F33F3CC3CE17CE76CC60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061C8C52E000000803F1E8F27323B3B7BD4C183077F77E4C891EE478F1E6D59545414555C5CCCCEA9A2888888D266CD9A15C8E96EB7DBFDD6E1C387A75D7AE9A5DF1036000000D064ECDCB9F386BD7BF73E919F9FDFBA7DFBF6E6E4934F36D1D1D1462ACA263232921D54451AD40A0B0B4D414181D9B76F9FF9FEFBEF8B659F2E9420375642C71EC206000000C2966DCD787EC78E1DA99D3B77365DBA74316EB79B1D538BE143F675696E6EEE7E393F78C890216BC2E9FDF1CD010000C0311234B276EEDC99DAAB572F73DA69A711346A99B6129D79E699EE9E3D7BC64544442C5DBC7871BF707A7F117CC4000000505F7FFDF5F8EDDBB7DF9E9090605AB76EFDA3DB8B8EEC33DF7DF996D9B36DA9D9B7E30373F4D06E13735217E38E68C6CEABA6989818131B1B1BB977EFDE5F8D1E3DFAB9B973E71E0E87F7455405000080769F8ACECDCD7D585B335AB56AF5A3DB0B0FEE36D9FF9E65F273D6959DD7E091F7ED1AB3FDA3BF9AA2823C76600D68D3A64D44FBF6ED8BC5A470794F840D000000E8B8813F151616B6E8D4A993DFDBF376AD352545477E747D71E17EB337FB7D76600DE9D6AD5B4797CB356AD9B2655D081B000000080BF9F9F9233A74E860A4A2EBF7F603B9EB033EB6207F273BB086E8188EB8B8B8AF8B8A8AFE87B001000080B070F0E0C1D3DAB46913F0F6E2A38702DEE6AFC50355D7AE5DBB08097D83081B000000080B858585513A4819F52F3636F62439E91A0EEF851559000000604A4A4A7475EB80B7BB5C6EE3F19406B891DFAF6B527474B40E9C69110EEF856F060000002AD5AC65BB80B735AFE03684CEAED01E47D80000004093D0A1C72FFDAEA711D12CD6B43F6B183B08840D000000544D8BB8D34D74EBCE3FBA3EB6ED4F2A6CF5006103000000A85469C9D11F5F575CC88E01610300000055A32B84EF5C3BC714ECFFF647B71DF86E93F9F63F19154E8D8BA68BD9A80000001050DE371F99EFB62CF2DBAAE11B388EE465978DEB68D5BE373B0D840D00000004A6AD19399B5E31877FD81ED4FDB565435B38346C68E8886CD6929D08BA51010000E0C7B6AFFA4BD041C397B67264AFFE0B3B10840D000000F85751B7A9CA307E035E74A3020000C08FF418F4103B01D546CB0600000000C20600000000C20600000000C2060000000010360000000010360000000010360000000080B001000000A03160513F00000004A579F3E6A6B0B0F047E783BD7F20E5B7E3BD6F65D757B4CD40DBF6F7DACB6FA7FC6D953D9FBFD759D9BE216C00000000E52AD5A154BECBDF3F5025BEA290E1FB1CFE2AF01555EA7D1F5BFEB5060A18FEAEF7BED640C1A5B2E7AEEC751236000000D0A4F90681402D1CFECE070A1481C2457502452841C9F73556141802858C8A5E4F65A18AB001000000F8A9ACFB56FE7D2BEBE52BE5FE2AF7FEC243452D0EC154D2430922BEAF2950CB4A758281F7F902BDA7A6183A081B000000A852C5BA7C77A9F215EA405D938219BF515117A88A5A4B820935FE42414D048D8A0256B02D30840D0000003449E5BB1C05332EC15F57A58A5A362A0B20C1B49454A52B56454121D87D5351206BAA081B000000A8918A75B02ABA6F555A0082ED8AE56FDBC176FD02610300000075A8A28A79A0710AA1B45254250055365B56A8AD2AA81E16F5030000408DAB2C8454B7B25FBE7B969E063A1FECF650F368D900000040C821A2A299A82A0A06A1745B0AB64B53456336821D9C5E535DA8CA0F966FCA3351113600000010347F63212A1AFC1D2868F8ABF057777D0A7F334B85DA8DAAAACF1768DF940F674D3174B8386C000000B064C912CFC5175FCC8E682056AC5861060F1EDCE8EBEA8CD900000040BD0A75BC446DDC3FD05812C672540FDDA800000050EFC1A2B22E4F0D65FB206C000000A081AA8BC5EF028D1BF1173E68C5206C000000208C041A205E592809366884B2FD60D7E760B13FC2060000001A81605A1E6AF2392A9B0ED75F28F137BB15081B00000068C0EA6A4C45B0EB6BF80B3DE55B39081A840D00000034029555E22BABDC075A20B0A2A012EC427F840AC206000000C24C6DB41E04DBB251D10280A83ED6D900000040A30B25950504BDDD5BFC5DF6BD5F3081853042D80000004023116816A840957F7FB7050A1C95B59204D38AC2588D9A41372A000000D4998AA6B82D1F1E7C2F07AAF807739F505E4FF9D74517ABEA71B10B000000B064C912CFC5175FCC8E682056AC5861060F1EDCE8EBEA74A30200000040D80000000040D80000000040D80000000000C20600004043D6564A2CBB017030F52D000040CD992565A694D552864BB952CA54295B1BC28B4B4D4D6DEBF17862BDA1C8E5729D22A7674939C44707C206000040C33140CA7F499923A5C05EA7A162BC94315232A5DC24A5B8B65F487272F278090E71E678CB8ADF53091A273CCEF7F2975F7E6998FA16358D6E5400000055B3474A0F29AFD9CB5D6CC5FE011B3EF2A55C2FE5EEDA7E2159595933E464B2945BA5A419A74525514A8294AEA6F2AE5DBBCE3CF34C3E511036000000EA41AC0D16BEB415E35E29EF48F99B71BA4D69C55E5B185E364E972A6D51B8AE21BF3197CB35233737F7F48888083E65D438BA5101000004A65DA5B47522DE068EC1F67A0D14536C00D96C9CEE52DD8DD392F098947552A2A5CCB0F7B94CCAD206F6DE0E793C9E919999990BF5C2840913F8B441D840E3257FD022B3B3B3471D3C78F077478E1CE97EF4E8D19645454551C5C5C5EC9C2A8A8888286DD6AC59819CEE76BBDD6F1D3E7C78DAA5975EFA0D7B8663816381630135A2AB9437A4F497922D659971BA4AE9774BBB49DD6B03C52A29CF19A7DB527FFB18ED62F5A2946429736D60A9D5B021A1C1959292E209F2EFD0BAD2D2D2A4050B166CE5630661038DDECE9D3B6F58B76EDD13F9F9F9ADDBB76F6F4E3DF554131D1D6DA472602223F91A5695544EDD8585852D0A0A0ACED8B76FDFAD52C11AFBC1071F2C94CAEB58A968ED610F712C702C702C20247136383C6A0382068C35F67AF58C94A76CFDE9657B9F83C669C5986B03C655526EB1E1E3175216D8FB3C6B9C168F3FD4F48B4E4B4B8B96EFFF7009103706F99074091AE324681CE4230761038D9AFD05F7F96DDBB6A576EEDCD9F4E8D1C3B8DD0C15AAB103582AA75A5AB66C694E39E51473C6196744EED8B1E39ADCDCDCCB162F5E3C78C890216BD84B1C0B1C0B1C0B085807D26E51793ED7E9F96B8CD33DEA23E3748F5A2EE56C1B28B26CA0D0C72EF2799C06099D7D4AA7B8D5B11B3A3BD546E3B48CE8788E69C66909B9D638DDB1726BE20D24272727B85CAEEB2564A719676C48658E4AF95D6666E61C3E7ED415FEA743AD92CA55D6CE9D3B537BF7EE6D4E3BED342A577550E13AF3CC33DD3D7BF68C8B8888582A95AC7EEC158E058E058E05F8A52D1093ECF991C6E91E656CC048B2A74AC76068B7291DBBA103BEEFB1C5D7527BBBB74B520F1B386E36CECC54E798E383C5AB25292929362525658C9455123436C85577E976B55B949CDE2AD7B50BF0D0AFE5EFCECF081AA88F540FD48AAFBFFE7AFC575F7DF5AB848404D3AA55AB1FDD5E74649FD9B3ED5FA6E0408E292D29322DDB7433EDCE1C64229AB1F06A75B569D3C6F4EAD5ABE5679F7DF6CF65CB96F5A21B09C702C702C7027E4407454FB67521ED26F53FC619CCAD63307456293D00D7DB10E20D17A3EDF54F94DB960EB8DA684386B672E8F80C1DCFA1EB6DBC6F9C05FE66DAFB54497272F20009121A5EAEB5AF415B4CF3E43A5DCB634E5656D6B1D63B0922A5E6C41F94DF898E8E4E4D4F4FCFE3630761036141FE0046AF59B3E661FD05D75FE5AAF0E06EB373EDB3A6A4E8C8B1EBF2BEDD670EEEF9D29CDEFFB7262A3A8E9D58FD4A5644FBF6ED8B737373F597BB71EC118E058E058E85264E2BE8DA82F19E3D5D6E9C2E4EDAC2314FCA121B36B405422BEEBA5E451FE3CC3EA50164810D211A5837FBD9BE56E42F31CE34B7CFDAEBAEA9CE0BD6D5BE35B8D8B118BED3EE2E9790912E01224B0244819F8796050DB94FA93CF64F999999D3F8F8515F68C747ADD8B163C79F74B066A74E9DFCDE9EB76BED09952BAFE2C2FD666FF6FBECC01AD2AD5BB78EF29FCDA865CB9675616F702C702C702C3451DABD490766EBC06FEF388CB7A468055EBB14A519A79B938EA5B8C838AD17DA0AF1AE94A1C6F961568B0EF6EE6A9C41E2793680F8D2AE7ADA5AF207BBDD2A494C4C8C4C4949192E658104851C298FDBA0912BDFE1474B4A4ACE92F070694646C6DC0041A36C562A39F9411E3B84A081FA46CB066A457E7EFE880E1D3AE8AF2A7E6F3F90BB3EE0630BF277B2036BEA008F8C347171715FEFDBB7CFDB3D001C0B1C0B1C0BE14CA799D519967618A75B948E97D02E4E136DE85867EFA7DD9A9EB2F7D180B15CCACF8D3336C34B6797F28EE9D026466DFDD001E2C3ECE58FEDA9768DD2168CDBECE3AB34E5B2840B0D32636CF8F186627DED6F6AC0C9CDCD5DB47CF9F2A0E7C79650D26BC18205B97C251A27F9FCBE959393081B4000070F1E3CAD4B97C03F20161F3D14F800F3F32B2FAAAE5DBB76113FFCF0C3202A581C0B1C0B1C0B61A88B0D17DAD2A0DDA47430B7B658E8D4B533ED7DD694ABF374B581E00FF6542BE4DA5D29DB3863315E91B2D23E2EDE56FEFF60CFBF609CC5FB56FB792D21AFA1A153D61614145CE572B96EF4783C837C6ED2D69774A970CEAD6A60A8CAE3DC6EB7A7B4B4D4C50416F5EFC89123DA5DEF00610308A0B0B0302A2626861DD100C4C6C69E64FF7305C702C702C742B8D181D8DABAA05D9A0A6C5048B4A7E52703D0FBE8B4B4DD6D1859644386B65668172BED6EB4D06E73A57D4CBA71667B8AB341637280A011921123469C2395FA3152A1BC4E82469C040D635FBF0EF69E9B9999B9BC3E76665454D461794D2D750A69D4AFFDFBF76B58F484C37B216CA056949494E88ABE016F77B9DCC6E3290D7023BFA8D4A4E8E8681D2CD0823DC1B1C0B1C0B11046B49561A40D8F1A2E061AA74B940EF6DE6C6F9BE6A7CEA3A141C764E8188E7C29771BA70BD46ABB1DADE46BF72A6D2539688348BCBDFF2D3E21246469696971858585C93AD85B82463FE7F82FEB5EB9464E9F6DDEBC79567DCF16D5AC59B34FF3F2F22E226CD4BF9C9C9CC372B296B00154F50F5ACB7665B3F0F8D3BC653B76504D1EE4CEAAD44C69C4B1C0B1C0B1D018792BFDE5698B840EF29E2EE50DE38CADD06E531F18A765E23A1B36B49B95CE2035DB382D1D71767BBADDAD3648E8B67440B74E53ABE32FB26D58F13E666275DE404A4A8A8698310505053A65AD7750B96E375382C7ECACACAC8D0D65679794943C9E9B9B3BA073E7CED40FEB9184D12F0E1D3A34503E8F3F1236802AEAD0E397E69B4FE79AD292A3275CAFEB0AB43F6B183B081C0B1C0B68DABADA4ABF06899BCCF1C5F2B40B54813971BD0A9D1D4A07678FB1D76BC8D0D9A5328CD3CAE19D194A0757A7DB30F262B9537D9C0E20BFDB6EAF5AA1342929293E222242B77BA37DCD655C2ED7BB12309E8D8E8E5E186826A9FA74E185172E5CB162C58EDDBB779FA9135BA07EFCE73FFFF9B77C575CC3860DDB4AD800AAA845DCE926BA756773F887ED275C1FDBF62765BFF4021C0B1C0B68B2B4D541D7BCE869C38186089D45EA4AE30CE69E59EEFE3AF642C760E86C513A1B553F1B4EDADA10116BC38B77BD0C1D9FF1AE0D173A9DAD8EC5F8C63E5F9503804E592B15F4E13AD8DB38335679EB58BA6D5D77636E4646467643DFF9050505295BB76E5DD9AA55ABE62D5AD0EBB0AE49D09BBB7FFFFEE1C5C5C5FDC3E53D1136506FCAFF925B765D71213B061C0B1C0B68DAB49B932EB6A76B5CE898891C29638D33D6A2D84F3019691FA38BF1692B888EDB986A03C6DD36A4E8588B39364CACB6C1444B9E0D1C55969A9AAA6B60E8C27B69C6E99665ECEB7CD9ED763FBB6BD7AEA5A14C595BDF860C19B2465EEF1D1B366C78A46FDFBEAD99E0A2EE7CFFFDF72F6EDEBCF93209ACD75D7EF9E5D9E1F2BE081BA8734505792667D32BA660FFB73FBAEDC0779BCCB7FFC928EB5A12D98C016AE058E058401353B662B671BA1E69C0D071199936146885BD87BD7DA20D13BFB7A1A1ADBD5D5B3274A5EF385BC7D17117DA2AE2BB00DF2DD57D913A65AD1DEC9D2625D1E7A68DBAB2B7715A31F634D60F213131F1AFEFBEFB6EE1DAB56B9FECDEBDBB273E3EBE155FCDDA23DFA11D9F7DF6D9F2BD7BF76ACB58DAE0C1831785D3FB236CA04EE57DF391F96ECB22BFBFE4FA56B28EE4659755B25AB5EFCD4E03C702C7029A864936346878D081DFDADD495B0AB445426788BAD186893936586857A9DBCDF16969B5923FCB868B6CE374B7EA61B71B6FEF5BAD7112292929DA454B077BEB00F4587BF541A92C6A209A939595B53A5C3E8C418306CD59BC78F1FA2D5BB63C959D9DDD5902C79176EDDAB589898969DBD0D7E1D8B973A739EDB4D31AF46BD445FB0E1E3CF8E5D75F7FBDEF871F7E3847BE43A7C87503C3659C06610375CEFB0B6EF97EE981E84267FAABAE56B0F865171C0B1C0B68121E287759C755682B860EF8D6968971C619B3E1D5C55ED6A0718F71A609FDC65EAF633E7481BFCD367454B995213535B5AD5404752CC858BB4DAFD52E97EB99E2E2E257162C5870301C3F10ED5225270325745C2695E214A9C45F64435674437DCDDBB66D33CB962D33975E7AA9E9D6AD5B43DEBDBAEE8F0ECC5B2FE5F1C18307AF0ED7039BB0813AB17DD55F2AFC053710EF2FBBDD2FBE979D088E058E05843F6DD9D031185AA9D58A6E8A0D1BE9F6FA2C7BAA2D0C2F1B67AA5B3DD5C5F874C0F778BB1D1DDF51ADCADB88112386DA6E52579B13A7AC4D979031272323637353F9502474E8EAE84B1BC36B4D4949D196ACC9123826DF7CF3CD0F70481136D04454A572E5A5BFEC021C0B1C0B68B87426A61A1A04AD5DA23E9232C35ED6968444E374ADFADC38AD1673CD890BF6CDB52143C77568E5B2CAAD0C23478EEC525252A2B35FA595969676F51E7A52DED4B1183939390B1BD3606F80B08126A3C7A087D80900C702C2D0E2C58B67646464FCBA63C78E97D6C0AFFD5BCDF135357AD87A8A76A5D2960AED56A52D1BEBFC3C6E46559FD00EF61EAE2B7B4BD0F05DDC265BD7C4888C8C9C3B6FDEBC6FF8A401C2060000A8439999997F5FB060C1E8A1438796FEF39FFF5C959494D45F2E577780AB7693D24ABF56F075D6A9D78CD3E2912EE56653CDEE515EC9C9C9092E97EBFA82828234E374DF520572DDEB1A32E4BD2DE51306081B0000A09E82C68A152B46DF79E79DE6A73FFDA9BB55AB56AD2568FC4B02C7F9729A5B8D4D7F654E5C5323D306109DC6F69CEABC66796DB191919123ED9A1803BCD7CBE57512327465EF79E9E9E9797CBA0061030000D493E79E7B6E9E048D1113264C309D3A752ABBEE8A2BAE704BA5BDFD4B2FBDB45A2AF503AA1138CAB75CE8988CEE367C4CABCA06939393074898D056916BE535C6DA809127D779A7AC5DC3A70A10360000403D7BFAE9A75FFDE8A38FAE993871E2B1A0E1357CF8F0E6F9F9F91D972C59B24202C779353425EC37B684449E3FDEB662E8FA1C3D7C6E5AAEDDA46262625E494F4F2FE01305C2206C7CFCF1C7895BB76E1DF7CD37DFFC575E5EDEC9070F1E8C292E2E76C91F81A32D5AB438181D1DBDBDA4A4E485CF3FFF7C6EB8CE550D004038048D6DDBB65D3375EA54D3A64D1BBFF719316244B3C2C2C22EEFBDF7DE72A9F027D6E5FFEB3A2B567C7CFC50399B26E56A0915DE7A4EAECE2625758F393530A6044043081B7A802F59B264FA471F7DF4DB59B36645F7E9D3C79C7BEEB9A663C78E262E2ECE44454599828282C8FCFCFC16BB76ED6AFFC9279FFCAC65CB9633EEB8E38E4FBEFDF6DB1BB2B2B236F2F10000D0303CF4D0434B2568FCB7B668E8FFE315193D7A74CCD1A3477BAE5AB56A795A5ADA45B5DD82909292D2554EC6D890D1C55E5D2C7591D7752C466E6EEE22A6AC05C2286CAC5CB972ECA38F3EFAB8848896D75E7BADB9FBEEBBCBC2853FA79E7AAA494848D00563347C442C5BB6ACFF6BAFBDF6C9B871E3DE953F0E37547390190000A8A6071F7C70F9E1C3872F09266878DD78E38D2D0E1C38D0FBF3CF3F7F353131F197355DD9D7296BA5DE70957156F64EF4B949A7DF4D2F2929994B1D0208C3B0B168D1A2B92FBEF8E26FAEBCF24AA33354040A19FE4447479BCB2FBFDC5C72C925510B172E1CBA64C9920D23468C183C7FFEFC757C540000D42DED9674F1C5172F978AFB851A34F4FFE96045444498DB6FBF3D7AFAF4E917C9E35F936D5D53138143EA05E79496968E3972E4C8752E97CB9B7CB4E544077BCFCDCCCC5CCE2707341CEE9ADA90769B7AF5D557D7BCF6DA6BBF19376E9C0E120B2968F86AD1A285494D4D75DF74D34D6D9B376FBE32252565381F55F893CFBA4AB757F6B850EEA7F709542A7B4C437BBF08CF63C1F736EFF9F2A7C13C2E98EF78F9EB2ABA7F4D6CBFA68E1DD45CD038FFFCF3D74885FEC27BEEB927A4A0E11B38EEBCF3CE569D3B77BEAC6BD7AEE9557D2D696969715217F8BD948F25687C2A57DD6A8386BEBEB11266DA49C8184DD0001A9E1A6BD958B468D1F3EFBEFBEE7F4D9A34C9C4C7C7D7C836070E1C68DAB66DDB72EAD4A9F3468C1891480B47D35658585856C9F09E06AA7CE8EDD5798E502B37DEC7785F5B637ABF68DCC74175BE77E51F1328B094BFECFBBC815E97BFD7136C780EF4BA82D91EC742CD078D8E1D3B9EFDFBDFFFBECA3F1E7A03C7C48913631E7CF0C1AB468D1AF5F40B2FBC706BB08F9570912827630A0A0AAE95536FDAD92325D3E3F1CC667C27D044C2C6CA952B6F9F3B776EAA769BAAA9A0E175D6596799DFFEF6B7B1B367CF7E3B2929E95CFA5F868F607EE90C5479F0BDBE262BF9B5F98B69437CBF68BCC74DF996047F21A07C500DE6FB5D3ECCF86EBFA28A7FA09051D1FB08E67B1D28B8700CD41E5DF84EFE2FFF54824677EDA9A061A1BAB455E4FEFBEF8F9D3469D26F44F1F3CF3F7F5BA0FB8E1C39B24B4949892EE2A753D676F7B9E91D29E9B2AD854C590B34A1B0E1F178A2274F9EFC687272B2AE205A2B2FF2820B2E88F8E28B2F5C8B172F7EC438AB8A224C5454D9A8EC974B7F95A8EA5640AAD2B2D198DF2F1A66E8AEE8FB503E54F8BBECFBDDF2D7025259D7BFF2AD6AFE5A1BAAF3DDABAC152598D68D60833A420F1AEDDBB75FDFAB57AF6E37DD745359D0D8B2658B79E081078C048063F7D3EB9F7CF249ED7D70C2E33FFFFC733365CA14AD1B9C1034FEFCE73F9B76EDDA997BEFBDB795848EDF5E7FFDF5DFCC9D3BF771EF7DB425A543870EC35D2ED78DF23CC37CEA27BABEC6B3C6198B91CD270434C1B0F1CE3BEFFCEDC08103CDE40F45ADBE5009331DDE7BEFBD6BE4743ACDA6E15BD10AA6E2555125AAA62B7CC154847C5F4365AFA5A1BC5F34CCC01D6C65DEF7FBE6DBAA5095EF7145A1B7B25694AA1E6B151D2BC1748FE218A8B5A0112F41E383F3CF3FBFDB6F7EF39B63D76B0F039DF465EDDAB5E69B6F9CB5F53478E85A1B4F3CF1C4B1FBE975D3A74F3F2168E8A27F575C714559D0503A93D5830F3E183361C284FB478C1851327FFEFC275253531F91C7A4C9CDDEAE11DA6AF1BADBED7E76D7AE5D4B99B21668C261435B35EEBDF75EF93B915A23CDAC15D141E3575F7D7581048D49FA37918FAE76A5A4A424CB7F1C6B6B7BF1A3607FE92FFFEB6D4D8F6108F4EB6F4D775F6A28EF170DEF5808B5B2EEFBF907FBDD2C1F52FC059060434E55BF77A1862BC66CD4CDF75283C649279DB44E824607DFA0E173BBF9F4D34FCB5A32F6ECD953765D6E6EAE79FDF5D7F5FFE6B2CBB366CD32870E1D3AF69833CE38C39C7CF2C9E6B2CB2E3B615B1A38A64C99D2EA8F7FFCE3C3527F385DEA12E3ED4D1B75E13D399D9B9191B12788977D8E71A6B9A54B1510AE6163D9B265BFDEBF7F7F44BF7EFDEAE4C50E1B36ACC34B2FBD34449B795969BCD6656A8094FFD076C87F04734B4B4B5F6848ABAE56D4AFBC3A95A440836F83D976A815BFDA7CBFA89563618B3D16B26AF35808F63B575965DCDFFDCB879440DFA3CA2AF2B5F53D0FF6878060830ADFCBD0828684860E3A93A43FFA5CBFFBDDEFCA5A33F4BCB74BD52BAFBC622EBCF042B377EF5EB36AD5AA63F7D71F08F7EDDB67EEBAEB2EBFDBD3D5C71F7CF0C1E8891327DE28016586BE9FACACACD521BEF4C7A43C2A65A9715A45740079367FB280300A1BD9D9D963CF3BEFBC3A7BB1DAEFB363C78EB939393943F56F1C1F5F9D38DDE572DD2FFFB9DC5F1BC123D86E45C13EBE262BF6B551A96A88EF17413B4B8E8587E45878A8AE82473095EF50BA5C551658FC859186F8BD2368D7DCF7323535B587ECCF55BFFAD5AFE2749DAB0AFF3338FD7473D5555799B7DE7ACBFCF0C30F65D71517179B471E79C41C3870C0C8F31EBB6FB366CD7415F1B250118876B19A32654ACBFBEEBBEFC6C3870F2F0BE13DEB0AE1DA9FEB4D29836CD8B8D35E3783AF0410466163E7CE9DBD7EF9CB5FD6E90B3EFFFCF30FBDFEFAEB83081BE1113C421D305DD9E32BAB9804FB8B71B081C3DFF515DDBF2EDE2F1A6FF008F6BB1AE8B3F7F7988A5A2DAAF27DA2A21F3EDF4B6FD0B8EEBAEBE2CA77750A64D8B061E6A38F3E32050505E6C8912365D769772A5FDA75AA67CF9EFAFF75A5DBD3C071F7DD77B79C366DDA3C793DC33232325656F2905829B38C33FDEDBBF654D7DBD0BE5C7DF80A00611636F6EDDBD7B263C78E75FA82BB75EB16257F4CBBF3D135FEE051598525986E4BC12C8C174C18A86C76A7F2E1A3B24A573095BEDA78BF68BCC12394E05AD9B8A2CAD6E1086630792881A6AA3F34040AF7151D1F35B1C608DFCBB2311FFD64FF2DB9E5965BE28209055EDA854AA7C3958070EC3ADF01E16EB7BBAC8563CC9831416F5367B2D4C0F1C8238FBC25816378258143BB50FFC238E335C6DBA0A1B357BD6818BB01845FD8D8BF7F7FA40EF4AA4BEDDAB56B237FD84E923F9493F8F81A5EF0484E4ECE97F36FD5E69305D3D523D4F0106A9FF5602A39355929ABECFD5666DBB66D8663A66E2B78722CEC93F36F04428040730000200049444154133242F9AE56B48E86BF56918AA6B10D66B14A7FF70B753D8D4097038D21F17739D063429D2CA1891E0BE5BF97FF8E8C8CBC4482464C2841C3E7FF615D0BC3CC9F3FDF1C3E7CF884DBB4BBB38EEDD0311BA1D0C071C71D77B47EECB1C7164BE0384F02C7E64A1EA28BFCEA54F8436DD0D0FBEB4C950BA5F8CE5E156D038936BF74B7A78CF904EA90AB3A0F963FD81EF98350A72FF8830F3ED8FBF4D34F9FC247D7B0E97F60BAEA2CEADFE6CD9BCBFA54836381638163C16BC0800166FCF8F1D5DAC6D8B1634D7E7EFEF10A85CB65BA76ED6A1E7EF8E12A6F53079CBFF1C61BDFEED8B1A36B1053DEEAA0F025527414FA4752F440D3568E4C29B36DE8D08540EEB4A16380945B6C504198B23F264CD6929999F9007BA4FE55AB65233232D2535454E48A8A8AAAB317DCB973671D005624E5193EBE5A3539C8FBE99424C7E63DF6783C87E53F9C55BD7BF7BEACB1BCD150A70D0DF571F5AD478F1E65B3C548509FCCD7BAD68E85525BB169D6188E8550BFBBC1DC3F50F7A686749C84D9B150E5EFA59C7CF5C9279FFCE48B2FBE685ED5C578D7AC59F3A3CF55BB53E5E4E494B51E75EBD62DE46DEAE281FFF8C73F0AA55E911244D0D0E0F03729DAE5EA56298BA44C95A22DEBCF499969EFA7633AEE9592689CC1E4374B992B65B5DDC6567B1F000D316CB46AD5AA282F2FAF9977B19EBAB07BF7EE0372F20369B5D67F19A8E83F32FD1FC6DB774183C61EF94FE675A95865CAE7F39EFE273166CC184F430E17955D176870774DAC33505F95AC71E3C671CCD4E0B120DFF962B7DB5D28A72DE5A2DB56E81AD5B110ECF111E8FAC6385E225C8E85EA7E2FE5F1C3A74D9B96A56325420D1C3AF3D4ECD9B3CB0689FF28DD94969ABFFCE52FE6B1C71E33A1FC10B96BD72E23AFE7A0048DB40AC66C6877A84BA4A419A75563947166A0DAE0731F6DDD78DCCF636FB6C1443F7B9DDF5707955C24E552FECA010D386CB46EDD7A4F4E4E4EA7BA0C1B9B376FCE933F9AB97C7475CE376034F7FDCF2B3737F7BDC6B4C26BA8AB1107EA73CEC27A4D8F6F454EBEFB91721AD9988F85EA1C2381561747E3F85E666666EA60EC613A287BFCF8F1ADCF3DF7DCA09FEF996702772C387AF4A891C060B48BB5BFC50103058DFBEFBFFFE0E1C3873568F89B695283C5A752F28CD322A12F60916FD5C0D667DADA00A15DA5747CC61EFB98AE9A33A55C6E43875A67AF9F62B7A9AD1DAC540E34B4B0D1A2458B651B366C18D9B76FDF3A7BC11F7EF8A1F6BB5CCE475727B409DE1D0E0123D8001128385477CA5A347A65DD05C33960F87ED74369FD0BD475CADFE309E50DEB7BA92D083AFBD3FFFEEFFF2E1E376E5C5083C557AC5861BEFAEA2B73F0E0F131D6279D7452592B87F7F3D5C5FCDE7FFF7DA30BFEF6EAD5ABC2EDE5E5E57983C65D018286D21F182B9AFAD2DB3A31DE0691625B26D8530D2BAF4BB9DB860C0D2ABA02E160E374A31A60EF77910D1E840EA0A1840DF9E3F0D78F3FFE78C4C891235D75F1628F1E3DFA6D7E7E7E3FB7DB9DCA475727DCE15AA90A75EC457517E343A31711CE0123D463A4A2EF7FA0160F8246C3FC5EDAC071DE5FFFFAD70F653BAD7FF6B39F4504BAEFF7DF7F6FE6CD9B77C20C543A15AE4E83FBDD77DF95759FF22EEC1719196966CD9AA55DA302CE4CB57EFD7A3373E6CC3C092E93B3B2B26657735F6817AB14293DEDE56C297F90F23F52D28D3368DC3B8EE3311B3ABCD353FBAE5CFE8239DED291C7570CA8E7B0217F443EBCF9E69B7FF8ECB3CFDA54F6EB454D983F7FFE7BF207B58DFC71643057EDBB47CA9A70AB5455B53F3A2D1B1C0B4D216054376007BBCE071AD6F752A79995C07181048E557BF7EE6D7DC51557B8FDDD4FBB4FC5C4C4E8B4F7C7AE1B34689039E38C33CA4AEFDEBDCD860DCEF0096DB1D041E2CF3FFF7CD9AC55E569CB873C9F76018BD5B5B3929292BA5771514CEDED30CB0603EF5A1B3AE598B656E84AE33A1DAE2EF8F79594EBED755DA5DCEE675BDA82D2C386139DD1E8019FC0719571562A67DA5CA02EC386923F12F74808F8EB430F3D14599B2FF4E8D1A35F2D5EBCF84279BEEBF8D86A5F6666E6B4707C5F81FAA2575639A2658363219C424430931C8412B02B5B2B040DFF7B6903C7C0975F7E5957E56E2F81E384D1DD6FBFFD7659F7A8DDBB771FBB4EBB4F8D1A35EAD8E53BEEB8C3DC7CF3CD65E336D48E1D3BCA8289CE5CA55DAABCB4CBD5ABAFBE9A63676C3B53AEBA352222626C7272F29B7279AABCB73521860D0D293A5EC3BB4FF4540358AC0D0D7AAA5DA8DED18026E536E30C24D7CBAF98E35DAD74762BED39A1634016D9E071B7DDDE64E3CC7405A0AEC3C633CF3CF337F9E332E9DFFFFE77E7AA2C0E14ACE9D3A7AF282D2D3D392B2B6B251F1B6AB2D255D975A10E2807C2E5F8082660FB8617346E1A38929292FAC9FFB3AB0F1D3AD451CE974D99AB03B875C0B70EFCF6D23535EEB9E79EB26E54C76AFDD1D165AD18DA9D4A959494983D7BF698FFFBBFFF2B5BB4AF55AB566541E3DE7BEFDD959393F3923CCFED12707A48E8D00A7D8A6C535B20AE4E4949592EA78FEB20F6205EB6B63C4C2D779D4E37ADDDAAE61967B0B8CE3CA53F54AEB6E142C3C6687B3FEFF4B7CB8C33B395AFF13690683079D6D699B4B05239509761A3EC48CFCBBB76D6AC59CBBA74E912DDA953A71A7F914B972E4DFFCF7FFE73B9848D9FF391A1362A52817EE90DF76940D174037665AD1BC1B66C043B931B21BD7158B06041AE848C016FBEF9A6068E4E69696951FAFFBA76870AC6C08103CB8A3F1A3E264D9A94BD7BF7EED51A34BC01472BFEF29CF74646468E97FFE7C74AE84894EB12939393D7B9DDEE272598CC0BB1AB98060A6D4A79C206096DB5D0B538B42B9577BC86B7C5A2870D1A5A1FD26E53DA256B9C7166B2D26DE8EB9CAC6F4D4AB2BDFFBDF679DE90729371BA5F01A8CDB0A1BF828C1E3D7ADCC30F3FFCD4238F3C12ADBF5ED494EDDBB7BFF3ECB3CFEA8AA0D755B13F27F0A3CA8FEF2FB1DE4A90BFCA97BFCA11952634F6A05159C8AEECFB1DCA2298B47834DAC091B062C58AF7A5F27FD60D37DCD0B2BADBD4A03179F2E42D3B77EE5C9F9B9B3BCADF736A255EC2CDB423478E5CAF5DB4A59CE3F178D2E3E3E31F95E0F1684C4CCCDCF4F4F460076DAFB145A7C0D515C4138C33E6E2165BF7C930CED88DD3A5DC27E546E3749F523ACEA38B0D257A3F6DDDD0D60C1D7C728DCF73641B672CC76CBE35402D870DF5DC73CF3D3B6AD4A8D3FFF8C73FFEBF891327B6AE89160EF9433777D6AC59DACC795F6666E6523E2E5457655DA27C2B47040A845BC00E744C54E73B1F284C946F4141A30B1C072570FC5CFE1F5EBE6FDFBEDEB7DF7E7BB46F97A95069D0D8BA75EB171234522B6AA5B06162466262E2CC8E1D3B8E94B0739B860E294F4A08999C9A9AFA4C7171F10C1B4E82B1D5060C6DDDD03536B47B95CE3495E41318B405441702D4EE524F1A6706AB0F8CD36AB1C16E23C3860FDF096AB2A478839876C7D2569147CDF1712000448D4F592B7F08AE8F8A8A9A79CB2DB79801030654E9D790929292DC993367BEB96AD5AAABDD6EF775F3E7CF5FC447D5B82C59B2C473F1C517B3231A089D1B7FF0E0C12EF604C702C702C742282470C4B66EDDFA8D9FFEF4A7FDEFB8E38E9655091C8F3FFEF8A76BD7AE3D24FFB75FAE2126D4C7EB6AE772729794447B95B632644A009966BB6185420794EBAC54736C2088B381425B36261B67E13F5D834357391C6A9F53BB52690BC6175274B9756DE178DA9C3860FC35E38CEBD05093626F5FC837A8EEC9F76592FD2C276766663EC01EA97FEE9ADEA01CF8730B0B0B073DF5D453DB6EBBEDB69C4D9B361D0DE1E1790B172ECC1C356A54BE048DEEF287E4E7040D0000EA878683AFBEFA6AB0FC5FBEECCF7FFEF3011DE05D974143E9407129BA705F7F5D53C438BD32D2E4FCE7C9C9C9AFA5A6A65E14C2E6F40DCC36C75B1EB49B958EE7B8D63853DE6A1079C6DE4F038EAECD116BEFBFD906086D2979D25EAF65BC3D7DCB86187D9FF97C7B0047AD4C57AB6338E4A4AFFC11183975EAD4FB9B376FDEEADC73CFDD3B70E0C098D34E3BAD759B366DDA4545459923478E7CBB67CF9E7D9B376FFEE6EDB7DF2ECEC9C9394F0F7CB7DB3D5E420B210300807AA6DD9E12131375ACC26B53A64CB96CE2C489313AF3546566CD9AF5A1048D3612342EAE6AD028173A740CC635BA264744448456F06FD419AC2474E80C562BE5F471A97F84DA9AE01DDBA1AFEF23E3B46AE8643489C6999D6AAB0D1371E6784B8606126DB9D001E4DA75EA4D737C2C47771B3C96977B1EED6675A194E97CA340D8A8D9D0A1D3CECD1B3162C4391F7EF8E1F0D5AB5727CA1F033D107504B9FEA53A49CA1153368B9EEB3DF983740783C00100689881C3ED763FFDC0030FA44E9A34A9754581E3B9E79E7B6FC58A151DE4FFF54B6B2268F8B2F58471123AA64AE8B859EA153AAEE3222D123AF4B647E5B5CD4B4F4F0FA51966A9AD136957289DB14A679D1A67AFD3697307DBFBE99BD65690FEC669FDD0711DBA3E870E2AD73ACFD936A044DBDBBBF884960CC206081BB564FEFCF93AA84ACB54763900008D337048193B6AD4A8E27BEEB967F4E4C9935BC4C5C5FDE87ECF3FFFFCB2C58B179F2A41E3E7210CE4AE4AE8D06D3F6067B0BA59C2867687D21F349F2D2828784882C793123A668730839576959A61EB463A487CBCBD6EB939BE92B8AED9F1B294738C33E5AD0609EF22843A15EE3BB6BEB3C03883D0C7D8C0A1DDAB9E2CF77CDA42926558B70361CECD2E000000C17AE185176ECDCBCB7B7AE2C48987E4F484DBDE78E38D37DF7EFBEDB3A4E2FF8BDA0C1ABEB405232B2B6B466E6E6E4FB998E2F178B4B2AF03B51F95D0F1757272F21323478EEC12C2268B6D08D085FF7AD800626C08D1050113A50CB701448B7786AB178D33785CBB72FDC286081DA0ACAB9BEB1A1D3AFDEE55765B1A64AE34CC5A05C2469DD2954A439DE6228A8F100080BA3577EEDCBBF7EDDB3771C2840907A4927F2C68CC9F3F5FA7A91D5C8559A2AA4D5B5E323333257764E94C5283E475BC2BA7B1727A5B4949C9F6949494E7B45B77889BD581E9DE95C5352CECB12164A24FD8D020F38294347B7FDF90D5DD86131D94EE5DE343BB69A5D8EDB6E5DB8470174A37AA387B5069DF459D6541074A5D2065A59FFB9E6DD3FB83C619977185148FBD6D8994BD7E1E3341CAA7525EF7739B3667961A676AB9663E21E91F5246D9D7E3B2BF2278F8580100A85D122C9E90CABBB9EFBEFB1EBEECB2CBDE5FB870E14511111197CAF59BEBFBB5D9B5B9966AB8282D2DBDD356EED3E47C9A840E1DD03D5DEEB33C884DF9B63C688B8976937ADF3863308C0D1A3A203CD3D647CAD3E7BEC7060C7DBEABA56808D241E893ECEDB1368CACB3E14383CBE57CC3D0D4C246671B027440D42029CF1B6790B7CEC6F0800D01BE340C78D7D8D0A96FBF945222E5FF1967019DBDF600F59DAE4E9B3F638C33A8CAEB55FB783D409749F950CACFA49C6F6FD7953F6FB3DBD6B0A1FD21BFE7630500A06E028754DE7749D078C6ED76FFC28ED16C48AF4F5FCF28798D133D1ECF7897CBA5DD9CB4FBD295C9C9C9EBE4353F949393B3B0A28506CBD13ACF545B8731B64EA37519FDC1745AB9FBC6DBDB749D0E1D4FA23FD26A10D301E6C36DC8D0DBF4C7DC04FB983DF6FAEE36D044DA7AD141BE6D68AC82ED46F53B737C6093068E4F8CD39A30CC38D3B9F9D2D60C1D10A5AD1E538C33DBD45A9BD8BFF3B99F3EEE527B60693964B7E9BDAC21A2B5BDAF8613EDDFD8C638AD19D1F60074D9D328FB9A081A0000D421EDBA14131373464646C6CA06FC1AB3B3B2B26E8F8E8EEE28A1E33EB92A57572697F32FC7C7C77F2E61E4F7696969D1416EAED8868C6C7B59DFB7F6FCB8BBDCFD9E32CE8AE21A2C56DBF091691FEF5D005067A8EA614EEC2572BBADDB682B870E3ABF9E6F191AB3605A36B442DF514A5729A9C6E916F574B9FBBC680F081D5075BF716669D0264BEDD3A8AD22DE29E3FA9813BB4915FAA4753D5FE073D9F757066DF1D0B9AF8BA4F4B2CFA7B49543677CF02E1C789A949D7CAC0000D49D10667C6A08AF73AA048BE9858585D74BD8D085FBB415E1E9828282C9123A9E9610325382D39E1037AD53E03E67B7A563319EB0751A9D0EF7635B7FD2168C77ED75DA7AA1DDAE74F5726FB733AD67DD69838B06197D6DDA6D6B80BDCF52BE6908D7B0A163206EB0E7F5D780CF8CD38DCA6B9F945DF67C379BC035ADF7364ECBC62A1B10FE6E937DB6CF63F57EDEA6C30E36347857DD6CE5733F6DD5D0AE53FF344EEB483BE30C269F2FA5AFBDCF21BB6DC2060000A8287494AD249E989838A743870EC3256068FD4617E99B2C01E49EE4E4E4674A4B4B6786B0F697FE509A64EB55DA5AA1D3E1EA8FA6379BE3EB6C6897F3E936506877AC91C6F901D63BA395DE7E8BBDAF3E6EA071BA6B3D66EB4A69367C641966B14298850D2F4DE13A955B913DAF95FAC1F64BFF7FF63EDB6CA0386C9CC14DDAB231C438DD9BBCC97D923DC8D4BF8DD394E80D1EDAD5EA4D7BF96A9FE77ED41E64FA7AFF610FB615C619346EECAF03179AE3F36003000054C88ED5D0A96A17A6A4A424DA711D57EB0C56111111B7A6A6A6BE2CE7A7853016A5D8860EA55DCAB555E20FC669B5D040916D9CAEE01A26128DD39DDCD8FA8B76539F608B5E7EDB9C38B5AE9E4E96F295AD6B6900196A582810611436B4EFE1C33671EB2F003AA64267897AB5DCFD7E639C99142EB261435B36DC3ECFF75F3EF7D503B2873DAF5DAF7EEE1332FA56F29AB53B9777E629A6C0050000556667A75A9E9C9C9C2001435B1FAE93F0A1EB76480E4959EE76BB1F95D0B128844DCEB14525DB80A0AD1CBFB021417FACF59D26D7BB3AF91E1B327E61CF8FB1F52D1DD731D51C6FD5D86A03C94C737CA572160844A30D1B77DA8360A1BDAC095FA77E7BD61E08BE748C477B7B5068372A1DB3A1AD193A5E435B4436D8FB69CB84B66C78BB3DDD674E6CD9D0E973F3CB6D5BFB428EB7E7337C0EB8FE7C940000A0BAB2B2B236CAC9E8A4A4A47B2560E8A0EF34091F89A5A5A5893A83955C7E7CF7EEDD5921CC60A55E314E4B84CEACA9E35E97DAA070B939717572AD57E922823AA8FC311B28E6D93ACF35B6DEA33D41B465447B893C6E9C168FE76C1D4A03C7DC72210668F061430F346DE6F3AE7AD949CA79C6E94EA52D113AD8E92B9FFBB7B7E122D35EFED6DEAFBCEF2A79DEF5E52EEB180DEDBF789971BA6F9D6B5F833A898F120000D414BB02FAED6969690F1416168ED1C1E43A83955CF7627C7CFC43123C9E94003247EE17CCB4B41A1226DA60A0635B755DB17B7C8286FEA0ABD3E3F6B7F779C8D67334A0E8FA64A36D38D1FA8FFEC8AB6B9ECDB4C1E4221B4AC6D920A22125DB868EAD7C92680C6143BFE47F31CEB808EDF6A4D3D16A33DE9BF64BAF0BD1E8F46C171B6710B70E20BFCB068E576D68D001E47A30EA34B8DAC4F7819403E59E27AA92D7A307D95BF680D5FBBD6CB771BDBD7C988F130000D4243B83D574091D33257424EB0072B9DC4382C7936EB7BB6C06AB92929299369C5426CF0684193ED76917AB2F8C33A3D58536843C646FBBC438AD1DDA5BE4529F70A2BD41B40788B690DC6983CCEF6DD8E861EB69DA554B7B83FCC1D0BD0A0D3C6C7C624FDFB1C16347B920A2455B1D7461BD2D52FE2465BF715A423484E8D88B2E36A977B4E9FD5D3FCFA349BCA882D7B1CBE7FC7D3E078E3EA7F6653CCAC70900006A297468BD435B0BE62627275FA583C8B57B95D649222222EE92D0912EA1637A083358797535CEBA654A038BB6503C65EB5B379A1307917BBD679C1F75BFB57539FD417790ADAB79D7F49869EB5C040D34F8B0E1F54D05B795D8D31DE5AED7A6BE7F05B9FD5056C75CED73FE433E46A08283B3A444FF33A2AB21381638165043B2B2B2CA66B092D0A1B34DDDAD3358C9E958091D63E53A9DCE769ADC6775909B9BE6E73A6D8DD0C97652CD8F67DAD420A1EB78DC644389CE4635DED6B9B4E7C81CFBD8E65216F169A1BEB9D905A8952F96DBED292D2D65473400478E1CD953C98F05E058E05800AA163A564BB94682EC591E8F47BB3B15D8A97357A5A4A42CD316902A6E5A838A6EEF4E3F4143078BEB2AE35D6CD1A505B4EB94AED1A1337EEAD4B96D091A682822D905A80D51515187E53FF696829D51CFF6EFDFAFCDF21EF604C702C702C7026A87ED3A75535252D2C4888888DF4BF0B855BB586991D0B1514E1F6FDEBC7996ED8A152C6DB178C1068C5C1B28F4B2B668686F9005F6BCCEF4B9DC38AD1DB3EDE5743E153414B46CA056346BD6ECD3BC3CD6586C0872727274F28495EC098E058E058E05D47AE8C8CDCCCC9C585A5A7AAA040E5D8F4C5BD212E47C7A4141C1F6D4D4D43BD3D2D2E242D8E428737C1A5B0D13BAC8F129C6994277B271A6C8D50974B45B97AE80AE33766A97AE57F83440D840582B2929793C3737B7983D51BFE43FBC2F0E1D3A34503E8F2CF606C702C702C702EA2C741CCCCACA9A21C7FE1912347471405D03235E4E1F3F72E4C8F6949494C7929292E243DCAC2EF2A76332AE34CE8CA01A3C7400B84E97AB335A3D6D0387CE14CAA070341811EC02D486BFFFFDEF5F5C2F9A356BD686EE23F567FDFAF56F1F3D7A74FB902143E6B03738163816381650B7B2B3B34B376DDAB441CAECBE7DFBAE96B0D1C5E5726977A80BDC6EF76D090909DD7AF7EEFD95DCFE5D109BD3C15FDA7D4AC762AC35CE6C533A23A7769BD2E972757C479A94CF4D135ED44FF669A29C6859BE71E3C6F7F816D63F5A36506B0A0A0A52B66CD95278E4C81176463DF8FEFBEF9FDBBF7FFFE545454513D91B1C0B1C0B1C0BA85FF3E7CF5F94999979A9840C5DACEF657BB5AE4EBE213939F9B5949494C41036E79DC1530782FFCD38AD1CDA82AA4B0B5CC2DE464342CB066ACD0B2FBCB06BF4E8D1FBBEFBEEBB9F9F72CA29CDA3A2A2D8297557B97AF1B3CF3EBB4CFE134B1B3A74E85AF608C702C702C7021A860D1B36E46EDCB87141CF9E3D33E47B59AAAB924BD195C2D312121286F5EEDD7B4FBB76EDBED256912036A72D223A68FC0B7B79B7947CD384675DA36583B08126263D3DFDE39123477E9F9393F3DFCD9A352B8C8D8D6DCE5EA93D1E8F678754AC16EEDCB9F30AF9CFEBC6C18307BFCD5EE158E058E05840C323DFCF7D9B366D5AD4A74F1F9D414A272FD0C0F113F9BEA6C8DF871172FDD17EFDFA6D5AB76E5D2863BEF24C139FDE99B041D84013F4FCF3CF7F7ADD75D72DF9E1871FFA4945CB535C5CBC3B2A2ACA131919D942FEA8B283AA49172A3B70E0C0DAAD5BB77EF2E5975FB63F7CF8F021B92E69E8D0A11FB177381638163816D0B04985F8B0568A25583C555454B447FE167497ABB55C297F236EECDDBB7774FFFEFD3748E860D03761A351E27F37D4A9C58B175FE676BB533C1ECF4572B1AB7166D240F568DFDD6CE3F4D5CD1A3C78F06A7609C702C702C7021AA7C4C4C4C88E1D3B5E555A5A7A9F76B1F27EB775D140B93C233333339BBD14584A4ACA24E34C0B3C59F6D503EC11C206000000FC579C13E5E46E29C3EC55DAA52AD3ED764F9F3F7FFE3AF61061A331A01B1500004003B471E3C66C29F3FAF6EDBBD0E3F168EB675F29E7C8F9B109090903A4E860F3EDECA9E3E84645D80000004008EC0C560BCF3EFBECE74A4B4BDD76F6AA5E527ED3BB77EFABFBF4E993D7B66DDB2F829CC18AB001C2060000007E143AF6EB0C56FDFAF59B555454745042472F3BA0FC5A9DC14A8287BB7FFFFEEB439CC18AB001C2060000001C3A3395848EF72574CC2C2E2ECE364E2B4777091EC3E4B276B16AD1B367CF2F3EFBECB383840DD43706880300003472C9C9C95749D8B847CE0EB057E954B9CF969494CC58B060C1D6707CCFA9A9A9777A3C9EC783BD7F666626F5DE7A40CB0600004023B769D3A62F366EDC38A74F9F3E4BA502DEC68EEB38DFED76FF2E2121A1AF94ED72FBAE707ACFBD7BF76EAF8B20067B7F79FFCC4E45D8000000405549857AA7048F2C091D597231D6385DAC7416ABDF6A1723297BE43E5BC2E1BDF6EFDF7F477171F1DD41D667B7CAFB7E8A6F086103000000D50F1D1A2A16F6ECD9738EDBED361E8F470793F7909B7420F9D57DFBF62D68DBB6EDA6C63C83950E8497F0A40BA39E19C4DDFF2AFB6319DF0CC2060000006A880E12974AF692FEFDFBCF2E2A2ACAD555C9ED0C5657C7C6C6DE20C1A3546EFB42079D37C6F727AFFF40255DA98AB4BE2B816BBC4E21CC3782B0010000801A6667B0FAA86DDBB6335AB56AB54DAED2C0513683958490B17DFBF68DEBD9B3E7A6C6368355105DA9F4FAAD19191913F816D40F46E50300003441292929C3E5E42EE34C15AB0A3C1ECF8B6EB77BBA54CE3737A2F7B1484E865470978732333327F289D70F5A360000009A201D282E656E4242C25B12327466A71E52FAC94DB7F6EEDDFB9CBE7DFB7EAB03CE1BFAFBA8A02B155DA8081B000000A8E7D0B14B67B0EAD9B3678654CC9BC9550976EADC1B24880C92CAFC3E9D5AB7A1BEFE0ABA52D185AA01A01B150000008E494A4A8A8F8888B8D9E3F1DC26A123CE5EADDDAA1E8F8E8E9E979E9EDEE0069357D0958A2E54F58C960D0000001C6367B07AAF7FFFFE338A8A8AF6D829737540F92F8B8B8B6F4C484888ECD7AFDFA6863483959FAE543AA5AF8B2E54840D0000003440BA8E859DC16A66CB962DBF94ABBAD9697307E90C56123AE27BF5EAB5BE21CC60E5A72B95F6DEA10B1561030000000D992EFC27A1638394D91230564AE0E82457EB228103DC6EF76D725DB7BE7DFBEE08B605212929295602CAD19A0E467E16F863213FC2060000001A0BA9BC6F97F282848B857251C773F492729EC7E3D1968E7E5272E4F6EC8AB6D1A74F9F7FC9E3FF21F73B5C93AFAD7C572ABA501136000000D00869255EC2C22B122E5E90A0617465721B3CD2E4BA2B2550EC6BDBB6ED166D15F17D5C4A4A8A47EE7B9A3CE6AA5EBD7ABD5C935DB06C57AA7B356748D997919171079F54FD63362A000000544B5A5A5A5C4141C178393B564ABCBD7AAB9427A3A3A3E77867B0D2B0E1F3B0DD123C12ABB380606A6A6ADBD2D2D2A17236D18E271928A5B99C3F20A71F49A8D92AE7DF9510B268C1820507F9A4081B00000068BCA1235A42C718397B9B7166B052DA95E9192993FD3C64AF8481AB2570AC0C31645C244162823C76B09C06D35347C3CE9B72DF07B2B2B236F2491136000000D0482526264676E8D061B88481FBE462BF4AEE7E484A726666E65B956D372929A9BBDBED7E4C034A155F5AB194174B4A4AEE5DB06001E339081B00000068CC52525212E5A4B259A18A3D1E4F5A5656D6BC0AB67399048D05A5A5A5277BAF8B888830DDBB77D7F11AE68C33CE30717171262A2ACA14141498FCFC7CB365CB16B366CD1AB36DDBB6F29BCB966D5D337FFEFC757C42840D00000034EEC0E109E67EBA6AB9048E197E1E3FC6E572CDF67699D29071D14517995FFFFAD7A64D9B36956E77D7114E5AE2000008D249444154AE5D262323A32C78F8D0311C29C1B4A8A0EA988D0A000000F51E3494048A61BD7BF78EDBB469D322EF7523468CD001E019DEA0A1E162C2840966F0E0C126262626A8EDB66AD5CA5C70C105E6273FF989F9E4934F4C5151915EDD4CCA2FFBF6EDFB3653E41236000000D0082524244C0EE5FEBA58A03CE6A76DDBB65D3870E0C09FC8558B256894A58AB3CE3ACBDC77DF7DA663C78E557A2D1D3A7428EB72B571E34673E0C081B2C021DB1ED6B367CFAC86B0127A3872B30B000000D0C0A4C6C7C77F26A7DA75AAB55ED1AE5D3B73C71D77948DCBA88E4E9D3A993BEFBCD3B468D1C27B55D788888847D8E5B583960D000000D48AE4E4E4275C2E97AEA3A1DD94BE31CE6C50FB8DB3FA78654E91727A59853522C2DC7FFFFD652D133541BB55E980F2952B8FCDB89BD0BB77EFD7366DDAF41D9F5ACD8A6417000000A036646565DD1EE8369D1E373E3EBE8B8491688FC7A30B01B694F3BA485F9CDBED4ED055C6E5BA767ADF21438698534F3DB5465F5BDFBE7D4DBF7EFDBC83C623E5B927C969129F1A61030000008DDCF2E5CBB59523DB5E3C6115715D4F232222E2463D1F1D1D6DAEB9E69A5A790DA9A9A9BE33545D29CF1BCB4AE3358B311B0000006850222323AFF29E3FFBECB3CBBA3DD5061DBFD1AD5B37EFC56879DEA1EC7DC206000000C298C7E319E43DAF5D9D6A93EFF67D9F17840D00000084A7EEC7CE74EF5EAB4FA4D3E97AB95CAEEEEC7AC206000000C25BBCF74C75A7BAADCC49279D74ECBC1DA80EC206000000C258ACF78C0E10AF4D2D5BB6F4BD18C7AE276C00000020BC1578CF141515D5EE131514F85E64262AC206000000C25CAEF74C5E5E5EAD3E51B9EDE7B2EB091B00000008632E976BABF7FCF6EDDB6BF5B97CB7EFF178B6B2F7091B0000000863A5A5A5CBBDE73FFEF8E35A7DAE72DB5FCEDE276C000000208C454444BCE53DBF7EFDFAF2E32A6ACCBE7DFBCC962D5B3CF662B1DBED5EC4DE276C000000208CCD9F3F7F9D9C6CD6F3070E1C306FBDF556AD3CCF4B2FBDA4AD282E7BF1DD8C8C8C3DEC7DC206000000C29CC7E379C87BFECD37DF2C6B85A849DBB66D33EFBFFFBEB75543C7894C65AF1336000000D004646565CD93C0A12D1C65DDA8FEFCE73FD758772A9D81EAB1C71E2BF1B66AC8F3BC9E9191B192BD4ED80000004013E172B96E3276CD8D1D3B7698A79E7AAADA814383C6F4E9D33D721A61AFDA23CF733B7BBB7644B00B000000D0106DDCB871579F3E7DBE91B357EBE59C9C1CB36EDD3A73DE79E79998989890B7F7F5D75F9B2953A6947CFBEDB7DE1FDC8B75DB9999999FB2B7091B000000687A81637D4242829E4DD47FF2F3F3CDBFFEF52F53525262BA75EB662223232BDD860E32CFCACA32B367CFF61C3E7CD837688C95A0F10A7BB9F6B8D80500000068E8525353AFF7783CCFC8D968EF75AD5AB532679F7DB6E9DFBFBF39E38C334C5C5C9C898A8A2AEB6AA5DDA5B66EDD6AD6AC59A3AD21A5858585C7860FC876F222222252E6CF9FCF54B7840D000000C098E4E4E4017232CBE5729D538DCD2C97C7DF929191B1993D4AD800000000CA878E911218EE93B33D4278D81AB7DB7D1FAD19840D000000A05223468C38A7A4A464B88488448FC7D35DAE8A374E37AB835272A56C9550F26E7171F1C2050B166C658F0100000000000000801AA5534BB5ADC5ED37ABA1FB20482CEA07000080FA324DCAA93E977B49592CA575258F6B619CE100913EC57749872829FFEBE7712B82784DFFE663A9D9F408000000D4877F4A794BCAEFA5FCD286082D7FB2B76B80785E8A47CA2D52DAD820B157CA2A29974BD960EF3B54CACFEDF91BA4FC60CF3737CE0FECBA8D23C667EA5CE3ACB5F18C3DF58AB7D7F9D697C796BB0F0000008006EC4C1B1CE27DAE9B226584940BA40C2E777F0D1E8F4A19642FA74949F1B9FD1D7B1A2BE55F524E96729794CBA43C64CB769FF3BFB6F78F2AF73C2BCB5D8EE2A3AA3A5A36000000501F7E6183C3B5F672A20D08FF90D253CA6C7BFB3629374B394DCA25C6E9763544CA6752AE94D2C53EBE853D7D524ABE9417A52CF5294AD7E9B8AFDCEB2892B249CAFB3E21C8DBB2719194FF96F21D1F57D544B00B000000500F564B2991D257CA3E29B74BC993922025C6386337B43BD442296B6D18B85BCAEBC669012995F29EBDFD43290552364AD92565BD0D0AFF4F4A07290F1BA78543BB530D9472850D1039F6B5FCDA869E37A55C23E557F6FCC552745D8E837C5C5543CB06000000EA4B9694C7A4BC609CAE4F6BA4A44A7949CA835246FBDC575B373AD9C091634384B6849C2E6587716691D2AE54EB8CD33AF25B1B2E72ED73B4F4D99606936C9FCBDA6AF2B43DDFCDE7FC797C44840D000000344E1A00BC3D6DB4EB942EBCA75D9DB4D5E2673EF73BC986877429CBA47C2525D3DEF64EB950A2E33A74DCC66D520E48992CE5391B604AED7DB4C5E4029FC7BC6C9C41E9DA75ABA3715A5D74FB7F9452C8C744D800000040E3A35D97BCD3D1EA6C512536106829B2D7EB0C543A45EE0352FA1BA7CBD55A1B18B4A5435B22741C86B662686BC83D3EDBD7A97463ECF9BF9BE3334A5D57EE7568A8B8DB9ED7A96F75662CED66F5301F51F5B0CE06000000EA8B768D7AD79EEF679C960D5FADA43C6B9CD68A57CADDA6E1416795DA664F1FB4D7DF28658E9427A49C6F2A9EB256BB5EE9F4B94B8CD31A72930D39BF91F23FF639B42B958B8FAA6A68D9000000407DD0A96D8F1A67C570ADD4EB80EC7D3600E874B33AAE425B16FE639C6E53DEBAAB76BBFA8994E1C6690DD1311BB7D9DBBF94F2A90D263F94ABF3EAB88D127BD9BBD6C6EFA49C2DE50E737CBD8E18FBDC1A84B4ABD59D52A64BF9848F0C000000681C3434C4DBCAFDB93ED75F64C3812EC6F753E38CD7F0D281DC713690E82AE3B1E54ACB00CF95684E9C85756005AF6B081F0D00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000843FF1F97142CFAF33FA32C0000000049454E44AE426082, NULL); + +INSERT INTO `act_re_model` VALUES ('857501', 22, '能力申请', 'abilityprocess_v2', NULL, '2022-06-24 15:59:57.665', '2022-07-01 10:14:47.589', 1, '{\"name\":\"能力申请\",\"description\":\"支持批量申请内拆分给多部门审核\",\"revision\":1}', NULL, '857502', '857503', ''); diff --git a/renren-admin/src/main/resources/ehcache.xml b/renren-admin/src/main/resources/ehcache.xml index 1bb993cb..746310c3 100644 --- a/renren-admin/src/main/resources/ehcache.xml +++ b/renren-admin/src/main/resources/ehcache.xml @@ -57,4 +57,13 @@ overflowToDisk="false" memoryStoreEvictionPolicy="LRU"/> + + + \ No newline at end of file diff --git a/renren-admin/src/main/resources/mapper/fuse/TbFuseAttrDao.xml b/renren-admin/src/main/resources/mapper/fuse/TbFuseAttrDao.xml new file mode 100644 index 00000000..c3b16f92 --- /dev/null +++ b/renren-admin/src/main/resources/mapper/fuse/TbFuseAttrDao.xml @@ -0,0 +1,20 @@ + + + + + + + insert into tb_fuse_attr(id, fuse_id, attr_type, attr_value) + values + + (#{item.id}, #{item.fuseId}, #{attrType}, #{attrType}) + + + + + delete + from tb_fuse_attr + where fuse_id = #{fuseId}; + + + \ No newline at end of file diff --git a/renren-admin/src/main/resources/mapper/fuse/TbFuseDao.xml b/renren-admin/src/main/resources/mapper/fuse/TbFuseDao.xml new file mode 100644 index 00000000..f776af9a --- /dev/null +++ b/renren-admin/src/main/resources/mapper/fuse/TbFuseDao.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/renren-admin/src/main/resources/mapper/fuse/TbFuseResourceDao.xml b/renren-admin/src/main/resources/mapper/fuse/TbFuseResourceDao.xml new file mode 100644 index 00000000..c648e021 --- /dev/null +++ b/renren-admin/src/main/resources/mapper/fuse/TbFuseResourceDao.xml @@ -0,0 +1,20 @@ + + + + + + + insert into tb_fuse_resource(id, fuse_id, resource_id, sequence) + values + + (#{item.id}, #{item.fuseId}, #{item.resourceId}, #{item.sequence}) + + + + + delete + from tb_fuse_resource + where fuse_id = #{fuseId}; + + + \ No newline at end of file diff --git a/renren-admin/src/main/resources/mapper/resourceCar/ResourceCarDao.xml b/renren-admin/src/main/resources/mapper/resourceCar/ResourceCarDao.xml index 27707402..7c061865 100644 --- a/renren-admin/src/main/resources/mapper/resourceCar/ResourceCarDao.xml +++ b/renren-admin/src/main/resources/mapper/resourceCar/ResourceCarDao.xml @@ -104,7 +104,7 @@ AND car.user_id = #{userId} AND res.dept_id = #{deptId} AND car.del_flag = 0 - UNION + UNION ( SELECT car.id AS "id", res.id AS "resourceId", @@ -123,8 +123,8 @@ AND car.resource_id = res.id AND car.resource_id = 8888888880000000001 AND car.user_id = #{userId} - AND res.dept_id = #{deptId} - AND car.del_flag = 0 + AND res.dept_id = 1067246875800000066 + AND car.del_flag = 0) LIMIT ${pageNum}, ${pageSize} diff --git a/renren-admin/src/test/java/io/renren/RedisTest.java b/renren-admin/src/test/java/io/renren/RedisTest.java index 8c8a8dae..1eec0538 100644 --- a/renren-admin/src/test/java/io/renren/RedisTest.java +++ b/renren-admin/src/test/java/io/renren/RedisTest.java @@ -19,7 +19,7 @@ public class RedisTest { @Test public void contextLoads() { - System.out.println(PasswordUtils.encode("admin")); + System.out.println(PasswordUtils.encode("hx12345.")); } } \ No newline at end of file diff --git a/renren-api/src/main/java/io/renren/service/impl/TokenServiceImpl.java b/renren-api/src/main/java/io/renren/service/impl/TokenServiceImpl.java index f5c87ed5..77c930aa 100644 --- a/renren-api/src/main/java/io/renren/service/impl/TokenServiceImpl.java +++ b/renren-api/src/main/java/io/renren/service/impl/TokenServiceImpl.java @@ -4,6 +4,8 @@ import io.renren.common.service.impl.BaseServiceImpl; import io.renren.dao.TokenDao; import io.renren.entity.TokenEntity; import io.renren.service.TokenService; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import java.util.Date; @@ -12,73 +14,76 @@ import java.util.UUID; @Service public class TokenServiceImpl extends BaseServiceImpl implements TokenService { - /** - * 12小时后过期 - */ - private final static int EXPIRE = 3600 * 12; + private static final String getByTokenKey = "getByToken"; + /** + * 12小时后过期 + */ + private final static int EXPIRE = 3600 * 12; - @Override - public TokenEntity getByToken(String token) { - return baseDao.getByToken(token); - } + @Override + @Cacheable(value = getByTokenKey, key = "#p1") + public TokenEntity getByToken(String token) { + return baseDao.getByToken(token); + } - @Override - public TokenEntity createToken(Long userId) { - //当前时间 - Date now = new Date(); - //过期时间 - Date expireTime = new Date(now.getTime() + EXPIRE * 1000); + @Override + @CacheEvict(key = getByTokenKey, allEntries = true) + public TokenEntity createToken(Long userId) { + //当前时间 + Date now = new Date(); + //过期时间 + Date expireTime = new Date(now.getTime() + EXPIRE * 1000); - //用户token - String token; + //用户token + String token; - //判断是否生成过token - TokenEntity tokenEntity = baseDao.getByUserId(userId); - if(tokenEntity == null){ - //生成一个token - token = generateToken(); + //判断是否生成过token + TokenEntity tokenEntity = baseDao.getByUserId(userId); + if (tokenEntity == null) { + //生成一个token + token = generateToken(); - tokenEntity = new TokenEntity(); - tokenEntity.setUserId(userId); - tokenEntity.setToken(token); - tokenEntity.setUpdateDate(now); - tokenEntity.setExpireDate(expireTime); + tokenEntity = new TokenEntity(); + tokenEntity.setUserId(userId); + tokenEntity.setToken(token); + tokenEntity.setUpdateDate(now); + tokenEntity.setExpireDate(expireTime); - //保存token - this.insert(tokenEntity); - }else{ - //判断token是否过期 - if(tokenEntity.getExpireDate().getTime() < System.currentTimeMillis()){ - //token过期,重新生成token - token = generateToken(); - }else { - token = tokenEntity.getToken(); - } + //保存token + this.insert(tokenEntity); + } else { + //判断token是否过期 + if (tokenEntity.getExpireDate().getTime() < System.currentTimeMillis()) { + //token过期,重新生成token + token = generateToken(); + } else { + token = tokenEntity.getToken(); + } - tokenEntity.setToken(token); - tokenEntity.setUpdateDate(now); - tokenEntity.setExpireDate(expireTime); + tokenEntity.setToken(token); + tokenEntity.setUpdateDate(now); + tokenEntity.setExpireDate(expireTime); - //更新token - this.updateById(tokenEntity); - } + //更新token + this.updateById(tokenEntity); + } - return tokenEntity; - } + return tokenEntity; + } - @Override - public void expireToken(Long userId){ - Date now = new Date(); + @Override + public void expireToken(Long userId) { + Date now = new Date(); - TokenEntity tokenEntity = new TokenEntity(); - tokenEntity.setUserId(userId); - tokenEntity.setUpdateDate(now); - tokenEntity.setExpireDate(now); + TokenEntity tokenEntity = new TokenEntity(); + tokenEntity.setUserId(userId); + tokenEntity.setUpdateDate(now); + tokenEntity.setExpireDate(now); - this.updateById(tokenEntity); - } + this.updateById(tokenEntity); + } - private String generateToken(){ - return UUID.randomUUID().toString().replace("-", ""); - } + private String generateToken() { + return UUID.randomUUID().toString().replace("-", ""); + } }