From df8bda53e867f5c4d5b8b55157ca5b8163d661a6 Mon Sep 17 00:00:00 2001 From: zefeng_java <986510453@qq.com> Date: Wed, 27 Jan 2021 13:52:44 +0800 Subject: [PATCH 001/126] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=9F=AD=E4=BF=A1?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 12 ++ sql/ruoyi-vue-pro.sql | 73 ++++++++++ .../dashboard/DashboardApplication.java | 30 ++-- .../common/enums/SmsChannelEnum.java | 33 +++++ .../dashboard/framework/msg/sms/SmsBody.java | 28 ++++ .../framework/msg/sms/SmsResult.java | 27 ++++ .../framework/msg/sms/SmsSender.java | 67 +++++++++ .../msg/sms/config/SmsConfiguration.java | 48 ++++++ .../sms/factory/DefaultSmsSenderFactory.java | 137 ++++++++++++++++++ .../msg/sms/impl/ali/AliSmsSender.java | 86 +++++++++++ .../AbstractSmsIntercepterChain.java | 38 +++++ .../DefaultSmsIntercepterChain.java | 20 +++ .../msg/sms/intercepter/SmsIntercepter.java | 41 ++++++ .../sms/intercepter/SmsLogIntercepter.java | 46 ++++++ .../msg/sms/proxy/DefaultSmsSenderProxy.java | 41 ++++++ .../msg/sms/proxy/SmsSenderProxy.java | 34 +++++ .../framework/redis/core/RedisKeyDefine.java | 42 ++---- .../redis/core/RedisKeyRegistry.java | 25 ---- .../controller/sms/SmsChannelController.java | 54 +++++++ .../controller/sms/SmsTemplateController.java | 84 +++++++++++ .../controller/sms/vo/SmsChannelAllVO.java | 58 ++++++++ .../msg/controller/sms/vo/SmsTemplateVO.java | 30 ++++ .../sms/vo/req/SmsChannelCreateReqVO.java | 44 ++++++ .../sms/vo/req/SmsChannelPageReqVO.java | 29 ++++ .../sms/vo/resp/SmsChannelEnumRespVO.java | 21 +++ .../sms/vo/resp/SmsChannelPageRespVO.java | 43 ++++++ .../msg/convert/sms/SmsChannelConvert.java | 34 +++++ .../msg/convert/sms/SmsTemplateConvert.java | 26 ++++ .../dal/mysql/dao/sms/SmsChannelMapper.java | 31 ++++ .../msg/dal/mysql/dao/sms/SmsLogMapper.java | 10 ++ .../dal/mysql/dao/sms/SmsTemplateMapper.java | 39 +++++ .../dal/mysql/daoobject/sms/SmsChannelDO.java | 65 +++++++++ .../msg/dal/mysql/daoobject/sms/SmsLog.java | 71 +++++++++ .../mysql/daoobject/sms/SmsTemplateDO.java | 81 +++++++++++ .../dashboard/modules/msg/package-info.java | 6 + .../msg/service/sms/SmsChannelService.java | 34 +++++ .../msg/service/sms/SmsLogService.java | 10 ++ .../msg/service/sms/SmsTemplateService.java | 10 ++ .../sms/impl/SmsChannelServiceImpl.java | 88 +++++++++++ .../service/sms/impl/SmsLogServiceImpl.java | 15 ++ .../sms/impl/SmsTemplateServiceImpl.java | 14 ++ .../system/enums/SysErrorCodeConstants.java | 7 + 42 files changed, 1660 insertions(+), 72 deletions(-) create mode 100644 src/main/java/cn/iocoder/dashboard/common/enums/SmsChannelEnum.java create mode 100644 src/main/java/cn/iocoder/dashboard/framework/msg/sms/SmsBody.java create mode 100644 src/main/java/cn/iocoder/dashboard/framework/msg/sms/SmsResult.java create mode 100644 src/main/java/cn/iocoder/dashboard/framework/msg/sms/SmsSender.java create mode 100644 src/main/java/cn/iocoder/dashboard/framework/msg/sms/config/SmsConfiguration.java create mode 100644 src/main/java/cn/iocoder/dashboard/framework/msg/sms/factory/DefaultSmsSenderFactory.java create mode 100644 src/main/java/cn/iocoder/dashboard/framework/msg/sms/impl/ali/AliSmsSender.java create mode 100644 src/main/java/cn/iocoder/dashboard/framework/msg/sms/intercepter/AbstractSmsIntercepterChain.java create mode 100644 src/main/java/cn/iocoder/dashboard/framework/msg/sms/intercepter/DefaultSmsIntercepterChain.java create mode 100644 src/main/java/cn/iocoder/dashboard/framework/msg/sms/intercepter/SmsIntercepter.java create mode 100644 src/main/java/cn/iocoder/dashboard/framework/msg/sms/intercepter/SmsLogIntercepter.java create mode 100644 src/main/java/cn/iocoder/dashboard/framework/msg/sms/proxy/DefaultSmsSenderProxy.java create mode 100644 src/main/java/cn/iocoder/dashboard/framework/msg/sms/proxy/SmsSenderProxy.java delete mode 100644 src/main/java/cn/iocoder/dashboard/framework/redis/core/RedisKeyRegistry.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/SmsChannelController.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/SmsTemplateController.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/vo/SmsChannelAllVO.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/vo/SmsTemplateVO.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/vo/req/SmsChannelCreateReqVO.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/vo/req/SmsChannelPageReqVO.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/vo/resp/SmsChannelEnumRespVO.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/vo/resp/SmsChannelPageRespVO.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/msg/convert/sms/SmsChannelConvert.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/msg/convert/sms/SmsTemplateConvert.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/msg/dal/mysql/dao/sms/SmsChannelMapper.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/msg/dal/mysql/dao/sms/SmsLogMapper.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/msg/dal/mysql/dao/sms/SmsTemplateMapper.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/msg/dal/mysql/daoobject/sms/SmsChannelDO.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/msg/dal/mysql/daoobject/sms/SmsLog.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/msg/dal/mysql/daoobject/sms/SmsTemplateDO.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/msg/package-info.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/msg/service/sms/SmsChannelService.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/msg/service/sms/SmsLogService.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/msg/service/sms/SmsTemplateService.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/msg/service/sms/impl/SmsChannelServiceImpl.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/msg/service/sms/impl/SmsLogServiceImpl.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/msg/service/sms/impl/SmsTemplateServiceImpl.java diff --git a/pom.xml b/pom.xml index 39f97ab43..163aa1941 100644 --- a/pom.xml +++ b/pom.xml @@ -222,6 +222,18 @@ ${easyexcel.verion} + + com.aliyun + aliyun-java-sdk-core + 4.5.18 + + + + com.aliyun + aliyun-java-sdk-dysmsapi + 2.1.0 + + diff --git a/sql/ruoyi-vue-pro.sql b/sql/ruoyi-vue-pro.sql index af7f492f9..edba4204c 100644 --- a/sql/ruoyi-vue-pro.sql +++ b/sql/ruoyi-vue-pro.sql @@ -884,4 +884,77 @@ INSERT INTO `sys_user_role` VALUES (5, 100, 1, '', NULL, '', NULL, b'0'); INSERT INTO `sys_user_role` VALUES (6, 100, 2, '', NULL, '', NULL, b'0'); COMMIT; + +-- ---------------------------- +-- Table structure for sms_channel +-- ---------------------------- +DROP TABLE IF EXISTS `sms_channel`; +CREATE TABLE `sms_channel` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增编号', + `code` varchar(50) not null COMMENT '编码(来自枚举类 阿里、华为、七牛等)', + `api_key` varchar(100) NOT NULL COMMENT '账号id', -- add + `api_secret` varchar(100) NOT NULL COMMENT '账号秘钥', -- add + `priority` tinyint(8) NOT NULL default 1 COMMENT '优先级(存在多个签名时,选择值最小的,渠道不可用时,按优先级从小到大切换)', -- add + `api_signature_id` varchar(100) NOT NULL COMMENT '实际渠道签名唯一标识', + `name` varchar(50) not null COMMENT '名称', + `signature` varchar(50) not null COMMENT '签名值', + `remark` varchar(200) NOT NULL COMMENT '备注', + + `status` tinyint(4) NOT NULL default 0 COMMENT '启用状态(0正常 1停用)', + `create_by` varchar(64) not null DEFAULT '' COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) DEFAULT '' COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `deleted` bit(1) DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='短信渠道'; +/* + 优先级值一样时,按照id顺序取值 +*/ + +-- ---------------------------- +-- Table structure for sms_template +-- ---------------------------- +DROP TABLE IF EXISTS `sms_template`; +CREATE TABLE `sms_template` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增编号', + `channel_code` varchar(50) not null COMMENT '短信渠道编码(来自枚举类)', + `channel_id` bigint(20) not null COMMENT '短信渠道id (对于前端来说就是绑定一个签名)', -- add + `type` tinyint(4) NOT NULL default 1 COMMENT '消息类型 [0验证码 1短信通知 2推广短信 3国际/港澳台消息]', + `biz_code` varchar(50) not null COMMENT '业务编码(来自数据字典, 用户自定义业务场景 一个场景可以有多个模板)', -- add + `priority` tinyint(8) NOT NULL default 1 COMMENT '优先级(默认直接继承渠道表的,逻辑也与渠道表的一致,可以针对每个biz_code进行修改)',-- add + `code` varchar(50) not null COMMENT '编码', + `name` varchar(50) not null COMMENT '名称', + `api_template_id` varchar(100) NOT NULL COMMENT '实际渠道模板唯一标识', + `content` varchar(1000) NOT NULL DEFAULT '' COMMENT '内容', + `params` varchar(200) NOT NULL DEFAULT '' COMMENT '参数数组(自动根据内容生成)', -- add + `remark` varchar(200) NOT NULL COMMENT '备注', + + `status` tinyint(4) NOT NULL default 0 COMMENT '启用状态(0正常 1停用)', + `create_by` varchar(64) not null DEFAULT '' COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) DEFAULT '' COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `deleted` bit(1) DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='短信模板'; + +-- ---------------------------- +-- Table structure for sms_log +-- ---------------------------- +DROP TABLE IF EXISTS `sms_log`; +CREATE TABLE `sms_log` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增编号', + `channel_code` varchar(50) not null COMMENT '短信渠道编码(来自枚举类)', + `api_sms_id` varchar(50) not null COMMENT '实际渠道短信唯一标识', + `template_id` bigint(20) NOT NULL COMMENT '模板id', + `phone` char(11) not null COMMENT '手机号', + `content` varchar(1000) NOT NULL DEFAULT '' COMMENT '内容', + `remark` varchar(200) NOT NULL COMMENT '备注', + `send_status` tinyint(4) NOT NULL default 0 COMMENT '发送状态(0发送中 1成功 2失败)', + `create_by` varchar(64) not null DEFAULT '' COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='短信日志'; + SET FOREIGN_KEY_CHECKS = 1; diff --git a/src/main/java/cn/iocoder/dashboard/DashboardApplication.java b/src/main/java/cn/iocoder/dashboard/DashboardApplication.java index 32783aa8c..498bf63c7 100644 --- a/src/main/java/cn/iocoder/dashboard/DashboardApplication.java +++ b/src/main/java/cn/iocoder/dashboard/DashboardApplication.java @@ -1,15 +1,15 @@ -package cn.iocoder.dashboard; - -import de.codecentric.boot.admin.server.config.EnableAdminServer; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -@EnableAdminServer -public class DashboardApplication { - - public static void main(String[] args) { - SpringApplication.run(DashboardApplication.class, args); - } - -} +//package cn.iocoder.dashboard; +// +//import de.codecentric.boot.admin.server.config.EnableAdminServer; +//import org.springframework.boot.SpringApplication; +//import org.springframework.boot.autoconfigure.SpringBootApplication; +// +//@SpringBootApplication +//@EnableAdminServer +//public class DashboardApplication { +// +// public static void main(String[] args) { +// SpringApplication.run(DashboardApplication.class, args); +// } +// +//} diff --git a/src/main/java/cn/iocoder/dashboard/common/enums/SmsChannelEnum.java b/src/main/java/cn/iocoder/dashboard/common/enums/SmsChannelEnum.java new file mode 100644 index 000000000..fdb80387d --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/common/enums/SmsChannelEnum.java @@ -0,0 +1,33 @@ +package cn.iocoder.dashboard.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 短信渠道枚举 + * + * @author zzf + * @date 2021/1/25 10:56 + */ +@Getter +@AllArgsConstructor +public enum SmsChannelEnum { + + ALI("ALI", "阿里"), + HUA_WEI("HUA_WEI", "华为"), + QI_NIU("QI_NIU", "七牛"), + TEN_XUN("TEN_XUN", "腾讯"); + + private final String code; + + private final String name; + + public static SmsChannelEnum getByCode(String code) { + for (SmsChannelEnum value : SmsChannelEnum.values()) { + if (value.getCode().equals(code)) { + return value; + } + } + return null; + } +} diff --git a/src/main/java/cn/iocoder/dashboard/framework/msg/sms/SmsBody.java b/src/main/java/cn/iocoder/dashboard/framework/msg/sms/SmsBody.java new file mode 100644 index 000000000..693838d4a --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/framework/msg/sms/SmsBody.java @@ -0,0 +1,28 @@ +package cn.iocoder.dashboard.framework.msg.sms; + +import cn.iocoder.dashboard.util.json.JsonUtils; +import lombok.Data; + +import java.util.Map; + +/** + * 消息内容实体类 + */ +@Data +public class SmsBody { + + /** + * 模板编码 + */ + private String code; + + /** + * 参数列表 + */ + private Map params; + + public String getParamsStr() { + return JsonUtils.toJsonString(params); + } + +} diff --git a/src/main/java/cn/iocoder/dashboard/framework/msg/sms/SmsResult.java b/src/main/java/cn/iocoder/dashboard/framework/msg/sms/SmsResult.java new file mode 100644 index 000000000..8a8741839 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/framework/msg/sms/SmsResult.java @@ -0,0 +1,27 @@ +package cn.iocoder.dashboard.framework.msg.sms; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 消息内容实体类 + */ +@Data +public class SmsResult implements Serializable { + + /** + * 是否成功 + */ + private Boolean success; + + /** + * 提示 + */ + private String message; + + /** + * 返回值 + */ + private T result; +} diff --git a/src/main/java/cn/iocoder/dashboard/framework/msg/sms/SmsSender.java b/src/main/java/cn/iocoder/dashboard/framework/msg/sms/SmsSender.java new file mode 100644 index 000000000..30b10df61 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/framework/msg/sms/SmsSender.java @@ -0,0 +1,67 @@ +package cn.iocoder.dashboard.framework.msg.sms; + +import org.apache.commons.lang3.StringUtils; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; + +/** + * 短信父接口 + * + * @author zzf + * @date 2021/1/25 14:14 + */ +public interface SmsSender { + + /** + * 发送通知 + * + * @param msgBody 通知内容 + * @param targets 发送对象列表 + * @return 是否发送成功 + */ + SmsResult send(SmsBody msgBody, Collection targets); + + /** + * 发送通知 + * + * @param msgBody 通知内容 + * @param target 发送对象列表 + * @return 是否发送成功 + */ + default SmsResult send(SmsBody msgBody, String target) { + if (StringUtils.isBlank(target)) { + return failResult(); + } + + return send(msgBody, Collections.singletonList(target)); + } + + /** + * 发送通知 + * + * @param msgBody 通知内容 + * @param targets 发送对象列表 + * @return 是否发送成功 + */ + default SmsResult send(SmsBody msgBody, String... targets) { + if (targets == null) { + return failResult(); + } + + return send(msgBody, Arrays.asList(targets)); + } + + default SmsResult failResult() { + SmsResult resultBody = new SmsResult<>(); + resultBody.setSuccess(false); + return resultBody; + } + + default SmsResult failResult(String message) { + SmsResult resultBody = failResult(); + resultBody.setMessage(message); + return resultBody; + } +} \ No newline at end of file diff --git a/src/main/java/cn/iocoder/dashboard/framework/msg/sms/config/SmsConfiguration.java b/src/main/java/cn/iocoder/dashboard/framework/msg/sms/config/SmsConfiguration.java new file mode 100644 index 000000000..7b5b26a5b --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/framework/msg/sms/config/SmsConfiguration.java @@ -0,0 +1,48 @@ +package cn.iocoder.dashboard.framework.msg.sms.config; + +import cn.iocoder.dashboard.framework.msg.sms.factory.DefaultSmsSenderFactory; +import cn.iocoder.dashboard.framework.msg.sms.intercepter.AbstractSmsIntercepterChain; +import cn.iocoder.dashboard.framework.msg.sms.intercepter.DefaultSmsIntercepterChain; +import cn.iocoder.dashboard.framework.msg.sms.intercepter.SmsLogIntercepter; +import cn.iocoder.dashboard.modules.msg.controller.sms.vo.SmsChannelAllVO; +import cn.iocoder.dashboard.modules.msg.service.sms.SmsChannelService; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 短信服务配置 + * + * @author guer + */ +@Configuration +@ConditionalOnProperty("sms.enabled") +public class SmsConfiguration { + + @Resource + private SmsChannelService channelService; + + + @Bean + public AbstractSmsIntercepterChain smsIntercepterChain() { + DefaultSmsIntercepterChain intercepterChain = new DefaultSmsIntercepterChain(); + //添加拦截器 + intercepterChain.addSmsIntercepter(new SmsLogIntercepter()); + return intercepterChain; + } + + @Bean + public DefaultSmsSenderFactory smsSenderFactory(AbstractSmsIntercepterChain intercepterChain) { + DefaultSmsSenderFactory defaultSmsSenderFactory = new DefaultSmsSenderFactory(); + List smsChannelAllVOList = channelService.listChannelAllEnabledInfo(); + //初始化渠道、模板信息 + defaultSmsSenderFactory.init(smsChannelAllVOList); + //注入拦截器链 + defaultSmsSenderFactory.setIntercepterChain(intercepterChain); + return defaultSmsSenderFactory; + } + +} diff --git a/src/main/java/cn/iocoder/dashboard/framework/msg/sms/factory/DefaultSmsSenderFactory.java b/src/main/java/cn/iocoder/dashboard/framework/msg/sms/factory/DefaultSmsSenderFactory.java new file mode 100644 index 000000000..123943a3d --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/framework/msg/sms/factory/DefaultSmsSenderFactory.java @@ -0,0 +1,137 @@ +package cn.iocoder.dashboard.framework.msg.sms.factory; + +import cn.hutool.core.util.ObjectUtil; +import cn.iocoder.dashboard.common.enums.SmsChannelEnum; +import cn.iocoder.dashboard.common.exception.ServiceException; +import cn.iocoder.dashboard.framework.msg.sms.SmsSender; +import cn.iocoder.dashboard.framework.msg.sms.impl.ali.AliSmsSender; +import cn.iocoder.dashboard.framework.msg.sms.intercepter.AbstractSmsIntercepterChain; +import cn.iocoder.dashboard.framework.msg.sms.proxy.DefaultSmsSenderProxy; +import cn.iocoder.dashboard.modules.msg.controller.sms.vo.SmsChannelAllVO; +import cn.iocoder.dashboard.modules.msg.controller.sms.vo.SmsTemplateVO; +import lombok.Setter; + +import java.util.List; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock; + +import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; + +/** + * 短信发送者工厂 + * + * @author zzf + * @date 2021/1/25 16:18 + */ +public class DefaultSmsSenderFactory { + + /** + * sender索引 + * key: {@link SmsTemplateVO#getBizCode()} + * value: {@link SmsSender} + */ + private final ConcurrentHashMap> bizCode2SenderMap = new ConcurrentHashMap<>(8); + + /** + * sender索引 + * key: {@link SmsTemplateVO#getCode()} + * value: {@link SmsSender} + */ + private final ConcurrentHashMap> templateCode2SenderMap = new ConcurrentHashMap<>(8); + + + @Setter + private AbstractSmsIntercepterChain intercepterChain; + + /** + * 读写锁 + */ + private final ReadWriteLock lock = new ReentrantReadWriteLock(); + private final Lock readLock = lock.readLock(); + private final Lock writeLock = lock.writeLock(); + + + public void init(List smsChannelAllVOList) { + if (ObjectUtil.isEmpty(smsChannelAllVOList)) { + throw new ServiceException(SMS_CHANNEL_NOT_FOUND); + } + try { + writeLock.lock(); + addSender(smsChannelAllVOList); + } finally { + writeLock.unlock(); + } + } + + public SmsSender getSenderByBizCode(String bizCode) { + return getSmsSender(bizCode, bizCode2SenderMap); + } + + public SmsSender getSenderByTemplateCode(String templateCode) { + return getSmsSender(templateCode, templateCode2SenderMap); + } + + private SmsSender getSmsSender(String templateCode, ConcurrentHashMap> cacheMap) { + try { + readLock.lock(); + SmsSender smsSender = cacheMap.get(templateCode); + if (smsSender == null) { + throw new ServiceException(SMS_SENDER_NOT_FOUND); + } + return smsSender; + } finally { + readLock.unlock(); + } + } + + public void flush(List smsChannelAllVOList) { + try { + writeLock.lock(); + bizCode2SenderMap.clear(); + templateCode2SenderMap.clear(); + addSender(smsChannelAllVOList); + } finally { + writeLock.unlock(); + } + } + + + private void addSender(List smsChannelAllVOList) { + smsChannelAllVOList.forEach(channelAllVO -> addSender(SmsChannelEnum.getByCode(channelAllVO.getCode()), channelAllVO)); + } + + private void addSender(SmsChannelEnum channelEnum, SmsChannelAllVO channelAllVO) { + if (channelEnum == null) { + throw new ServiceException(INVALID_CHANNEL_CODE); + } + List templateList = channelAllVO.getTemplateList(); + if (ObjectUtil.isEmpty(templateList)) { + throw new ServiceException(SMS_TEMPLATE_NOT_FOUND); + } + + SmsSender aliSmsSender = getSender(channelEnum, channelAllVO); + + + templateList.forEach(smsTemplateVO -> { + bizCode2SenderMap.put(smsTemplateVO.getBizCode(), aliSmsSender); + templateCode2SenderMap.put(smsTemplateVO.getCode(), aliSmsSender); + }); + } + + private SmsSender getSender(SmsChannelEnum channelEnum, SmsChannelAllVO channelAllVO) { + switch (channelEnum) { + case ALI: + return new DefaultSmsSenderProxy<>(new AliSmsSender(channelAllVO), intercepterChain); + // TODO fill more channel + default: + break; + } + throw new ServiceException(SMS_SENDER_NOT_FOUND); + } + + + + +} diff --git a/src/main/java/cn/iocoder/dashboard/framework/msg/sms/impl/ali/AliSmsSender.java b/src/main/java/cn/iocoder/dashboard/framework/msg/sms/impl/ali/AliSmsSender.java new file mode 100644 index 000000000..fbf6aeceb --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/framework/msg/sms/impl/ali/AliSmsSender.java @@ -0,0 +1,86 @@ +package cn.iocoder.dashboard.framework.msg.sms.impl.ali; + +import cn.iocoder.dashboard.framework.msg.sms.SmsBody; +import cn.iocoder.dashboard.framework.msg.sms.SmsResult; +import cn.iocoder.dashboard.framework.msg.sms.SmsSender; +import cn.iocoder.dashboard.modules.msg.controller.sms.vo.SmsChannelAllVO; +import com.aliyuncs.DefaultAcsClient; +import com.aliyuncs.IAcsClient; +import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest; +import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse; +import com.aliyuncs.http.MethodType; +import com.aliyuncs.profile.DefaultProfile; +import com.aliyuncs.profile.IClientProfile; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.Collection; + +/** + * 阿里短信实现类 + * + * @author zzf + * @date 2021/1/25 14:17 + */ +@Slf4j +public class AliSmsSender implements SmsSender { + + private static final String OK = "OK"; + + private static final String PRODUCT = "Dysmsapi"; + + private static final String DOMAIN = "dysmsapi.aliyuncs.com"; + + private static final String ENDPOINT = "cn-hangzhou"; + + private final SmsChannelAllVO channelVO; + + private final IAcsClient acsClient; + + /** + * 构造阿里云短信发送处理 + * + * @param channelVO 阿里云短信配置 + */ + public AliSmsSender(SmsChannelAllVO channelVO) { + + this.channelVO = channelVO; + + String accessKeyId = channelVO.getApiKey(); + String accessKeySecret = channelVO.getApiSecret(); + + IClientProfile profile = DefaultProfile.getProfile(ENDPOINT, accessKeyId, accessKeySecret); + DefaultProfile.addEndpoint(ENDPOINT, PRODUCT, DOMAIN); + + acsClient = new DefaultAcsClient(profile); + } + + + @Override + public SmsResult send(SmsBody msgBody, Collection targets) { + SendSmsRequest request = new SendSmsRequest(); + request.setSysMethod(MethodType.POST); + request.setPhoneNumbers(StringUtils.join(targets, ",")); + request.setSignName(channelVO.getApiSignatureId()); + request.setTemplateCode(channelVO.getTemplateByTemplateCode(msgBody.getCode()).getApiTemplateId()); + request.setTemplateParam(msgBody.getParamsStr()); + + try { + SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request); + + boolean result = OK.equals(sendSmsResponse.getCode()); + if (!result) { + log.debug("send fail[code={}, message={}]", sendSmsResponse.getCode(), sendSmsResponse.getMessage()); + } + SmsResult resultBody = new SmsResult<>(); + resultBody.setSuccess(result); + resultBody.setResult(sendSmsResponse); + return resultBody; + } catch (Exception e) { + log.debug(e.getMessage(), e); + } + + return failResult(); + } + +} diff --git a/src/main/java/cn/iocoder/dashboard/framework/msg/sms/intercepter/AbstractSmsIntercepterChain.java b/src/main/java/cn/iocoder/dashboard/framework/msg/sms/intercepter/AbstractSmsIntercepterChain.java new file mode 100644 index 000000000..f95de7128 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/framework/msg/sms/intercepter/AbstractSmsIntercepterChain.java @@ -0,0 +1,38 @@ +package cn.iocoder.dashboard.framework.msg.sms.intercepter; + +import lombok.Getter; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * 消息父接口 + * + * @author zzf + * @date 2021/1/22 15:46 + */ +public abstract class AbstractSmsIntercepterChain { + + @Getter + protected final List intercepterList = new ArrayList<>(8); + + + /** + * 添加短信拦截器 + * + * @param smsIntercepter 短信拦截器 + */ + public void addSmsIntercepter(SmsIntercepter smsIntercepter) { + addSmsIntercepter(Collections.singletonList(smsIntercepter)); + } + + /** + * 添加短信拦截器 + * + * @param smsIntercepterList 短信拦截器数组 + */ + abstract void addSmsIntercepter(List smsIntercepterList); + + +} diff --git a/src/main/java/cn/iocoder/dashboard/framework/msg/sms/intercepter/DefaultSmsIntercepterChain.java b/src/main/java/cn/iocoder/dashboard/framework/msg/sms/intercepter/DefaultSmsIntercepterChain.java new file mode 100644 index 000000000..76d31906d --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/framework/msg/sms/intercepter/DefaultSmsIntercepterChain.java @@ -0,0 +1,20 @@ +package cn.iocoder.dashboard.framework.msg.sms.intercepter; + +import java.util.Comparator; +import java.util.List; + +/** + * 消息父接口 + * + * @author zzf + * @date 2021/1/22 15:46 + */ +public class DefaultSmsIntercepterChain extends AbstractSmsIntercepterChain { + + @Override + public void addSmsIntercepter(List smsIntercepterList) { + intercepterList.addAll(smsIntercepterList); + //排序 + intercepterList.sort(Comparator.comparingInt(SmsIntercepter::getOrder)); + } +} diff --git a/src/main/java/cn/iocoder/dashboard/framework/msg/sms/intercepter/SmsIntercepter.java b/src/main/java/cn/iocoder/dashboard/framework/msg/sms/intercepter/SmsIntercepter.java new file mode 100644 index 000000000..df83c8d6a --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/framework/msg/sms/intercepter/SmsIntercepter.java @@ -0,0 +1,41 @@ +package cn.iocoder.dashboard.framework.msg.sms.intercepter; + +import cn.iocoder.dashboard.framework.msg.sms.SmsBody; +import cn.iocoder.dashboard.framework.msg.sms.SmsResult; + +import java.util.Collection; + +/** + * 消息父接口 + * + * @author zzf + * @date 2021/1/22 15:46 + */ +public interface SmsIntercepter { + + /** + * 监听发送前 + * + * @param msgBody 消息体 + * @param targets 发送对象数组 + */ + void beforeSender(SmsBody msgBody, Collection targets); + + /** + * 监听发送后 + * + * @param msgBody 消息体 + * @param targets 发送对象数组 + * @param resultBody 返回对象 + */ + void afterSender(SmsBody msgBody, Collection targets, SmsResult resultBody); + + /** + * 排序值,拦截器根据order值顺序执行 + *

+ * 值越小,越早执行 + * + * @return 排序值 + */ + int getOrder(); +} diff --git a/src/main/java/cn/iocoder/dashboard/framework/msg/sms/intercepter/SmsLogIntercepter.java b/src/main/java/cn/iocoder/dashboard/framework/msg/sms/intercepter/SmsLogIntercepter.java new file mode 100644 index 000000000..9a7effd95 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/framework/msg/sms/intercepter/SmsLogIntercepter.java @@ -0,0 +1,46 @@ +package cn.iocoder.dashboard.framework.msg.sms.intercepter; + +import cn.iocoder.dashboard.framework.msg.sms.SmsBody; +import cn.iocoder.dashboard.framework.msg.sms.SmsResult; +import cn.iocoder.dashboard.modules.msg.dal.mysql.dao.sms.SmsLogMapper; +import cn.iocoder.dashboard.util.json.JsonUtils; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; + +import java.util.Collection; + +/** + * 短信日志拦截器 + * + * @author zzf + * @date 2021/1/22 15:46 + */ +@Slf4j +public class SmsLogIntercepter implements SmsIntercepter { + + + @Override + public void beforeSender(SmsBody msgBody, Collection targets) { + log.debug("ready send sms, body: {}, target: {}", JsonUtils.toJsonString(msgBody), targets); + + } + + @Override + public void afterSender(SmsBody msgBody, Collection targets, SmsResult resultBody) { + if (resultBody.getSuccess()) { + // + } else { + log.warn("send sms fail, body: {}, target: {}, resultBody: {}", + JsonUtils.toJsonString(msgBody), + targets, + JsonUtils.toJsonString(resultBody) + ); + } + + } + + @Override + public int getOrder() { + return 0; + } +} diff --git a/src/main/java/cn/iocoder/dashboard/framework/msg/sms/proxy/DefaultSmsSenderProxy.java b/src/main/java/cn/iocoder/dashboard/framework/msg/sms/proxy/DefaultSmsSenderProxy.java new file mode 100644 index 000000000..f9d7e566f --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/framework/msg/sms/proxy/DefaultSmsSenderProxy.java @@ -0,0 +1,41 @@ +package cn.iocoder.dashboard.framework.msg.sms.proxy; + +import cn.hutool.core.util.ObjectUtil; +import cn.iocoder.dashboard.framework.msg.sms.SmsBody; +import cn.iocoder.dashboard.framework.msg.sms.SmsResult; +import cn.iocoder.dashboard.framework.msg.sms.SmsSender; +import cn.iocoder.dashboard.framework.msg.sms.intercepter.AbstractSmsIntercepterChain; + +import java.util.Collection; + +/** + * 消息父接口 + * + * @author zzf + * @date 2021/1/22 15:46 + */ +public class DefaultSmsSenderProxy implements SmsSender { + + private final SmsSender smsSender; + private final AbstractSmsIntercepterChain chain; + + @Override + public SmsResult send(SmsBody msgBody, Collection targets) { + if (ObjectUtil.isNotNull(chain) && ObjectUtil.isNotEmpty(chain.getIntercepterList())) { + chain.getIntercepterList().forEach(s -> s.beforeSender(msgBody, targets)); + } + + SmsResult resultBody = smsSender.send(msgBody, targets); + + if (ObjectUtil.isNotNull(chain) && ObjectUtil.isNotEmpty(chain.getIntercepterList())) { + chain.getIntercepterList().forEach(s -> s.afterSender(msgBody, targets, resultBody)); + } + return resultBody; + } + + public DefaultSmsSenderProxy(SmsSender smsSender, + AbstractSmsIntercepterChain chain) { + this.smsSender = smsSender; + this.chain = chain; + } +} diff --git a/src/main/java/cn/iocoder/dashboard/framework/msg/sms/proxy/SmsSenderProxy.java b/src/main/java/cn/iocoder/dashboard/framework/msg/sms/proxy/SmsSenderProxy.java new file mode 100644 index 000000000..069916e2a --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/framework/msg/sms/proxy/SmsSenderProxy.java @@ -0,0 +1,34 @@ +package cn.iocoder.dashboard.framework.msg.sms.proxy; + +import cn.iocoder.dashboard.framework.msg.sms.SmsSender; +import cn.iocoder.dashboard.framework.msg.sms.intercepter.SmsIntercepter; + +import java.util.Collections; +import java.util.List; + +/** + * 消息父接口 + * + * @author zzf + * @date 2021/1/22 15:46 + */ +public interface SmsSenderProxy extends SmsSender { + + /** + * 添加短信拦截器 + * + * @param smsIntercepter 短信拦截器 + */ + default void addSmsIntercepter(SmsIntercepter smsIntercepter) { + addSmsIntercepter(Collections.singletonList(smsIntercepter)); + } + + /** + * 添加短信拦截器 + * + * @param smsIntercepterList 短信拦截器数组 + */ + void addSmsIntercepter(List smsIntercepterList); + + +} diff --git a/src/main/java/cn/iocoder/dashboard/framework/redis/core/RedisKeyDefine.java b/src/main/java/cn/iocoder/dashboard/framework/redis/core/RedisKeyDefine.java index b9adcc3f1..ee3a342a0 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/redis/core/RedisKeyDefine.java +++ b/src/main/java/cn/iocoder/dashboard/framework/redis/core/RedisKeyDefine.java @@ -1,8 +1,6 @@ package cn.iocoder.dashboard.framework.redis.core; -import lombok.AllArgsConstructor; import lombok.Data; -import lombok.Getter; import java.time.Duration; @@ -26,20 +24,15 @@ public class RedisKeyDefine { } - @Getter - @AllArgsConstructor - public enum TimeoutTypeEnum { + /** + * 过期时间 - 永不过期 + */ + public static final Duration TIMEOUT_FOREVER = null; - FOREVER(1), // 永不超时 - DYNAMIC(2), // 动态超时 - FIXED(3); // 固定超时 - - /** - * 类型 - */ - private final Integer type; - - } + /** + * 过期时间 - 动态,通过参数传入 + */ + public static final Duration TIMEOUT_DYNAMIC = null; /** * Key 模板 @@ -55,12 +48,10 @@ public class RedisKeyDefine { * 如果是使用分布式锁,设置为 {@link java.util.concurrent.locks.Lock} 类型 */ private final Class valueType; - /** - * 超时类型 - */ - private final TimeoutTypeEnum timeoutType; /** * 过期时间 + * + * 为空时,表示永不过期 {@link #TIMEOUT_FOREVER} */ private final Duration timeout; @@ -68,20 +59,7 @@ public class RedisKeyDefine { this.keyTemplate = keyTemplate; this.keyType = keyType; this.valueType = valueType; - this.timeoutType = TimeoutTypeEnum.FIXED; this.timeout = timeout; - // 添加注册表 - RedisKeyRegistry.add(this); - } - - public RedisKeyDefine(String keyTemplate, KeyTypeEnum keyType, Class valueType, TimeoutTypeEnum timeoutType) { - this.keyTemplate = keyTemplate; - this.keyType = keyType; - this.valueType = valueType; - this.timeoutType = timeoutType; - this.timeout = Duration.ZERO; - // 添加注册表 - RedisKeyRegistry.add(this); } } diff --git a/src/main/java/cn/iocoder/dashboard/framework/redis/core/RedisKeyRegistry.java b/src/main/java/cn/iocoder/dashboard/framework/redis/core/RedisKeyRegistry.java deleted file mode 100644 index 4a220fbd0..000000000 --- a/src/main/java/cn/iocoder/dashboard/framework/redis/core/RedisKeyRegistry.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.iocoder.dashboard.framework.redis.core; - -import java.util.ArrayList; -import java.util.List; - -/** - * {@link RedisKeyDefine} 注册表 - */ -public class RedisKeyRegistry { - - private static final List defines = new ArrayList<>(); - - public static void add(RedisKeyDefine define) { - defines.add(define); - } - - public static List list() { - return defines; - } - - public static int size() { - return defines.size(); - } - -} diff --git a/src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/SmsChannelController.java b/src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/SmsChannelController.java new file mode 100644 index 000000000..c28d9b862 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/SmsChannelController.java @@ -0,0 +1,54 @@ +package cn.iocoder.dashboard.modules.msg.controller.sms; + +import cn.iocoder.dashboard.common.pojo.CommonResult; +import cn.iocoder.dashboard.common.pojo.PageResult; +import cn.iocoder.dashboard.modules.msg.controller.sms.vo.req.SmsChannelCreateReqVO; +import cn.iocoder.dashboard.modules.msg.controller.sms.vo.req.SmsChannelPageReqVO; +import cn.iocoder.dashboard.modules.msg.controller.sms.vo.resp.SmsChannelEnumRespVO; +import cn.iocoder.dashboard.modules.msg.dal.mysql.daoobject.sms.SmsChannelDO; +import cn.iocoder.dashboard.modules.msg.service.sms.SmsChannelService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +import static cn.iocoder.dashboard.common.pojo.CommonResult.success; + +@Api("短信 渠道/签名 API") +@RestController +@RequestMapping("/sms/channel") +public class SmsChannelController { + + @Resource + private SmsChannelService service; + + @ApiOperation("获取渠道/签名分页") + @GetMapping("/page") + public CommonResult> getPermissionInfo(@Validated SmsChannelPageReqVO reqVO) { + return success(service.pageChannels(reqVO)); + } + + @ApiOperation("获取渠道枚举") + @GetMapping("/list/channel-enum") + public CommonResult> getChannelEnums() { + return success(service.getChannelEnums()); + } + + + @ApiOperation("添加消息渠道") + @PostMapping("/create") + public CommonResult add(@Validated @RequestBody SmsChannelCreateReqVO reqVO) { + return success(service.createChannel(reqVO)); + } + + @ApiOperation("刷新消息渠道信息") + @PutMapping("/flush") + public CommonResult flushChannel() { + return success(service.flushChannel()); + } + + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/SmsTemplateController.java b/src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/SmsTemplateController.java new file mode 100644 index 000000000..8bd73b12e --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/SmsTemplateController.java @@ -0,0 +1,84 @@ +package cn.iocoder.dashboard.modules.msg.controller.sms; + +import cn.iocoder.dashboard.common.enums.CommonStatusEnum; +import cn.iocoder.dashboard.common.pojo.CommonResult; +import cn.iocoder.dashboard.framework.logger.operatelog.core.annotations.OperateLog; +import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthLoginReqVO; +import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthLoginRespVO; +import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthMenuRespVO; +import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthPermissionInfoRespVO; +import cn.iocoder.dashboard.modules.system.convert.auth.SysAuthConvert; +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysMenuDO; +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDO; +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO; +import cn.iocoder.dashboard.modules.system.enums.permission.MenuTypeEnum; +import cn.iocoder.dashboard.modules.system.service.auth.SysAuthService; +import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService; +import cn.iocoder.dashboard.modules.system.service.permission.SysRoleService; +import cn.iocoder.dashboard.modules.system.service.user.SysUserService; +import cn.iocoder.dashboard.util.collection.SetUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.List; + +import static cn.iocoder.dashboard.common.pojo.CommonResult.success; +import static cn.iocoder.dashboard.framework.security.core.util.SecurityUtils.getLoginUserId; +import static cn.iocoder.dashboard.framework.security.core.util.SecurityUtils.getLoginUserRoleIds; + +@Api("认证 API") +@RestController +@RequestMapping("/sms/template") +public class SmsTemplateController { + + @Resource + private SysAuthService authService; + @Resource + private SysUserService userService; + @Resource + private SysRoleService roleService; + @Resource + private SysPermissionService permissionService; + + @ApiOperation("使用账号密码登录") + @PostMapping("/login") + @OperateLog(enable = false) // 避免 Post 请求被记录操作日志 + public CommonResult login(@RequestBody @Valid SysAuthLoginReqVO reqVO) { + String token = authService.login(reqVO.getUsername(), reqVO.getPassword(), reqVO.getUuid(), reqVO.getCode()); + // 返回结果 + return success(SysAuthLoginRespVO.builder().token(token).build()); + } + + @ApiOperation("获取登陆用户的权限信息") + @GetMapping("/get-permission-info") + public CommonResult getPermissionInfo() { + // 获得用户信息 + SysUserDO user = userService.getUser(getLoginUserId()); + if (user == null) { + return null; + } + // 获得角色列表 + List roleList = roleService.listRolesFromCache(getLoginUserRoleIds()); + // 获得菜单列表 + List menuList = permissionService.listRoleMenusFromCache(getLoginUserRoleIds(), + SetUtils.asSet(MenuTypeEnum.DIR.getType(), MenuTypeEnum.MENU.getType(), MenuTypeEnum.BUTTON.getType()), + SetUtils.asSet(CommonStatusEnum.ENABLE.getStatus())); + // 拼接结果返回 + return success(SysAuthConvert.INSTANCE.convert(user, roleList, menuList)); + } + + @ApiOperation("获得登陆用户的菜单列表") + @GetMapping("list-menus") + public CommonResult> listMenus() { + // 获得用户拥有的菜单列表 + List menuList = permissionService.listRoleMenusFromCache(getLoginUserRoleIds(), + SetUtils.asSet(MenuTypeEnum.DIR.getType(), MenuTypeEnum.MENU.getType()), // 只要目录和菜单类型 + SetUtils.asSet(CommonStatusEnum.ENABLE.getStatus())); // 只要开启的 + // 转换成 Tree 结构返回 + return success(SysAuthConvert.INSTANCE.buildMenuTree(menuList)); + } + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/vo/SmsChannelAllVO.java b/src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/vo/SmsChannelAllVO.java new file mode 100644 index 000000000..bac72c959 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/vo/SmsChannelAllVO.java @@ -0,0 +1,58 @@ +package cn.iocoder.dashboard.modules.msg.controller.sms.vo; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.List; + +/** + * 渠道(包含模板)信息VO类 + * + * @author zzf + * @date 2021/1/25 17:01 + */ +@Data +@EqualsAndHashCode +public class SmsChannelAllVO implements Serializable { + + /** + * id + */ + private Long id; + + /** + * 编码(来自枚举类 阿里、华为、七牛等) + */ + private String code; + + /** + * 渠道账号id + */ + private String apiKey; + + /** + * 渠道账号秘钥 + */ + private String apiSecret; + + /** + * 实际渠道签名唯一标识 + */ + private String apiSignatureId; + + /** + * 签名值 + */ + private String signature; + + /** + * 该渠道名下的短信模板集合 + */ + private List templateList; + + public SmsTemplateVO getTemplateByTemplateCode(String tempCode) { + return templateList.stream().filter(s -> s.getCode().equals(tempCode)).findFirst().get(); + } + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/vo/SmsTemplateVO.java b/src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/vo/SmsTemplateVO.java new file mode 100644 index 000000000..04bfe9a62 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/vo/SmsTemplateVO.java @@ -0,0 +1,30 @@ +package cn.iocoder.dashboard.modules.msg.controller.sms.vo; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 渠道模板VO类 + * + * @author zzf + * @date 2021/1/25 17:03 + */ +@Data +@EqualsAndHashCode +public class SmsTemplateVO { + + /** + * 业务编码(来自数据字典, 用户自定义业务场景 一个场景可以有多个模板) + */ + private String bizCode; + /** + * 编码 + */ + private String code; + + /** + * 实际渠道模板唯一标识 + */ + private String apiTemplateId; + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/vo/req/SmsChannelCreateReqVO.java b/src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/vo/req/SmsChannelCreateReqVO.java new file mode 100644 index 000000000..729088b65 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/vo/req/SmsChannelCreateReqVO.java @@ -0,0 +1,44 @@ +package cn.iocoder.dashboard.modules.msg.controller.sms.vo.req; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + + +@ApiModel("消息渠道创建 Request VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode +public class SmsChannelCreateReqVO implements Serializable { + + @ApiModelProperty("编码(来自枚举类 阿里、华为、七牛等)") + private String code; + + @ApiModelProperty("渠道账号id") + private String apiKey; + + @ApiModelProperty("渠道账号秘钥") + private String apiSecret; + + @ApiModelProperty("优先级(存在多个签名时,选择值最小的,渠道不可用时,按优先级从小到大切换)") + private Integer priority; + + @ApiModelProperty("名称") + private String name; + + @ApiModelProperty("签名值") + private String signature; + + @ApiModelProperty("备注") + private String remark; + + @ApiModelProperty("启用状态(0正常 1停用)") + private Integer status; + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/vo/req/SmsChannelPageReqVO.java b/src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/vo/req/SmsChannelPageReqVO.java new file mode 100644 index 000000000..dd2df146e --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/vo/req/SmsChannelPageReqVO.java @@ -0,0 +1,29 @@ +package cn.iocoder.dashboard.modules.msg.controller.sms.vo.req; + +import cn.iocoder.dashboard.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static cn.iocoder.dashboard.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("消息渠道分页 Request VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class SmsChannelPageReqVO extends PageParam { + + @ApiModelProperty(value = "渠道名", example = "阿里", notes = "模糊匹配") + private String name; + + @ApiModelProperty(value = "签名值", example = "源码", notes = "模糊匹配") + private String signature; + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/vo/resp/SmsChannelEnumRespVO.java b/src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/vo/resp/SmsChannelEnumRespVO.java new file mode 100644 index 000000000..a3e56e0ca --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/vo/resp/SmsChannelEnumRespVO.java @@ -0,0 +1,21 @@ +package cn.iocoder.dashboard.modules.msg.controller.sms.vo.resp; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + + +@ApiModel("用户分页 Request VO") +@Data +@NoArgsConstructor +@EqualsAndHashCode +public class SmsChannelEnumRespVO implements Serializable { + + private String code; + + private String name; + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/vo/resp/SmsChannelPageRespVO.java b/src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/vo/resp/SmsChannelPageRespVO.java new file mode 100644 index 000000000..603f13e07 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/vo/resp/SmsChannelPageRespVO.java @@ -0,0 +1,43 @@ +package cn.iocoder.dashboard.modules.msg.controller.sms.vo.resp; + +import cn.iocoder.dashboard.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static cn.iocoder.dashboard.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("用户分页 Request VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class SmsChannelPageRespVO extends PageParam { + + @ApiModelProperty(value = "用户账号", example = "yudao", notes = "模糊匹配") + private String username; + + @ApiModelProperty(value = "手机号码", example = "yudao", notes = "模糊匹配") + private String mobile; + + @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") + private Integer status; + + @ApiModelProperty(value = "开始时间", example = "2020-10-24") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date beginTime; + + @ApiModelProperty(value = "结束时间", example = "2020-10-24") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date endTime; + + @ApiModelProperty(value = "部门编号", example = "1024", notes = "同时筛选子部门") + private Long deptId; + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/msg/convert/sms/SmsChannelConvert.java b/src/main/java/cn/iocoder/dashboard/modules/msg/convert/sms/SmsChannelConvert.java new file mode 100644 index 000000000..4728586a3 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/msg/convert/sms/SmsChannelConvert.java @@ -0,0 +1,34 @@ +package cn.iocoder.dashboard.modules.msg.convert.sms; + +import cn.iocoder.dashboard.common.enums.SmsChannelEnum; +import cn.iocoder.dashboard.common.pojo.PageResult; +import cn.iocoder.dashboard.modules.msg.controller.sms.vo.SmsChannelAllVO; +import cn.iocoder.dashboard.modules.msg.controller.sms.vo.req.SmsChannelCreateReqVO; +import cn.iocoder.dashboard.modules.msg.controller.sms.vo.resp.SmsChannelEnumRespVO; +import cn.iocoder.dashboard.modules.msg.dal.mysql.daoobject.sms.SmsChannelDO; +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserUpdateReqVO; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface SmsChannelConvert { + + SmsChannelConvert INSTANCE = Mappers.getMapper(SmsChannelConvert.class); + + @Mapping(source = "records", target = "list") + PageResult convertPage(IPage page); + + SmsChannelDO convert(SmsChannelCreateReqVO bean); + + SmsChannelDO convert(SysUserUpdateReqVO bean); + + List convertEnum(List bean); + + List convert(List bean); + + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/msg/convert/sms/SmsTemplateConvert.java b/src/main/java/cn/iocoder/dashboard/modules/msg/convert/sms/SmsTemplateConvert.java new file mode 100644 index 000000000..313e06c92 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/msg/convert/sms/SmsTemplateConvert.java @@ -0,0 +1,26 @@ +package cn.iocoder.dashboard.modules.msg.convert.sms; + +import cn.iocoder.dashboard.common.pojo.PageResult; +import cn.iocoder.dashboard.modules.msg.controller.sms.vo.SmsTemplateVO; +import cn.iocoder.dashboard.modules.msg.dal.mysql.daoobject.sms.SmsChannelDO; +import cn.iocoder.dashboard.modules.msg.dal.mysql.daoobject.sms.SmsTemplateDO; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface SmsTemplateConvert { + + SmsTemplateConvert INSTANCE = Mappers.getMapper(SmsTemplateConvert.class); + + @Mapping(source = "records", target = "list") + PageResult convertPage(IPage page); + + List convert(List bean); + + SmsTemplateVO convert(SmsTemplateDO bean); + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/msg/dal/mysql/dao/sms/SmsChannelMapper.java b/src/main/java/cn/iocoder/dashboard/modules/msg/dal/mysql/dao/sms/SmsChannelMapper.java new file mode 100644 index 000000000..f7ede3502 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/msg/dal/mysql/dao/sms/SmsChannelMapper.java @@ -0,0 +1,31 @@ +package cn.iocoder.dashboard.modules.msg.dal.mysql.dao.sms; + +import cn.hutool.core.util.StrUtil; +import cn.iocoder.dashboard.common.enums.CommonStatusEnum; +import cn.iocoder.dashboard.framework.mybatis.core.util.MyBatisUtils; +import cn.iocoder.dashboard.modules.msg.controller.sms.vo.req.SmsChannelPageReqVO; +import cn.iocoder.dashboard.modules.msg.dal.mysql.daoobject.sms.SmsChannelDO; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface SmsChannelMapper extends BaseMapper { + + default IPage selectChannelPage(SmsChannelPageReqVO reqVO) { + return selectPage(MyBatisUtils.buildPage(reqVO), new LambdaQueryWrapper() + .like(StrUtil.isNotBlank(reqVO.getName()), SmsChannelDO::getName, reqVO.getName()) + .like(StrUtil.isNotBlank(reqVO.getSignature()), SmsChannelDO::getName, reqVO.getSignature()) + ); + } + + default List selectEnabledList() { + return selectList(new LambdaQueryWrapper() + .eq(SmsChannelDO::getStatus, CommonStatusEnum.ENABLE.getStatus()) + .orderByAsc(SmsChannelDO::getId) + ); + } +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/msg/dal/mysql/dao/sms/SmsLogMapper.java b/src/main/java/cn/iocoder/dashboard/modules/msg/dal/mysql/dao/sms/SmsLogMapper.java new file mode 100644 index 000000000..263783b47 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/msg/dal/mysql/dao/sms/SmsLogMapper.java @@ -0,0 +1,10 @@ +package cn.iocoder.dashboard.modules.msg.dal.mysql.dao.sms; + +import cn.iocoder.dashboard.modules.msg.dal.mysql.daoobject.sms.SmsLog; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface SmsLogMapper extends BaseMapper { + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/msg/dal/mysql/dao/sms/SmsTemplateMapper.java b/src/main/java/cn/iocoder/dashboard/modules/msg/dal/mysql/dao/sms/SmsTemplateMapper.java new file mode 100644 index 000000000..f2d2fb21b --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/msg/dal/mysql/dao/sms/SmsTemplateMapper.java @@ -0,0 +1,39 @@ +package cn.iocoder.dashboard.modules.msg.dal.mysql.dao.sms; + +import cn.iocoder.dashboard.common.enums.CommonStatusEnum; +import cn.iocoder.dashboard.modules.msg.dal.mysql.daoobject.sms.SmsTemplateDO; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface SmsTemplateMapper extends BaseMapper { + + /** + * 根据短信渠道id查询短信模板集合 + * + * @param channelId 渠道id + * @return 模板集合 + */ + default List selectListByChannelId(Long channelId) { + return selectList(new LambdaQueryWrapper() + .eq(SmsTemplateDO::getChannelId, channelId) + .eq(SmsTemplateDO::getStatus, CommonStatusEnum.ENABLE.getStatus()) + .orderByAsc(SmsTemplateDO::getId) + ); + } + + /** + * 查询有效短信模板集合 + * + * @return 有效短信模板集合 + */ + default List selectEnabledList() { + return selectList(new LambdaQueryWrapper() + .eq(SmsTemplateDO::getStatus, CommonStatusEnum.ENABLE.getStatus()) + .orderByAsc(SmsTemplateDO::getId) + ); + } +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/msg/dal/mysql/daoobject/sms/SmsChannelDO.java b/src/main/java/cn/iocoder/dashboard/modules/msg/dal/mysql/daoobject/sms/SmsChannelDO.java new file mode 100644 index 000000000..3c0b5f396 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/msg/dal/mysql/daoobject/sms/SmsChannelDO.java @@ -0,0 +1,65 @@ +package cn.iocoder.dashboard.modules.msg.dal.mysql.daoobject.sms; + +import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + + +/** + * 短信渠道 + * + * @author zzf + * @since 2021-01-25 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName(value = "sms_channel", autoResultMap = true) +public class SmsChannelDO extends BaseDO { + + /** + * 自增编号 + */ + private Long id; + + /** + * 编码(来自枚举类 阿里、华为、七牛等) + */ + private String code; + + /** + * 渠道账号id + */ + private String apiKey; + + /** + * 渠道账号秘钥 + */ + private String apiSecret; + + /** + * 实际渠道签名唯一标识 + */ + private String apiSignatureId; + + /** + * 名称 + */ + private String name; + + /** + * 签名值 + */ + private String signature; + + /** + * 备注 + */ + private String remark; + + /** + * 启用状态(0正常 1停用) + */ + private Integer status; + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/msg/dal/mysql/daoobject/sms/SmsLog.java b/src/main/java/cn/iocoder/dashboard/modules/msg/dal/mysql/daoobject/sms/SmsLog.java new file mode 100644 index 000000000..e5af0471e --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/msg/dal/mysql/daoobject/sms/SmsLog.java @@ -0,0 +1,71 @@ +package cn.iocoder.dashboard.modules.msg.dal.mysql.daoobject.sms; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; + +/** + * 短信日志 + * + * @author zzf + * @since 2021-01-25 + */ +@Data +@EqualsAndHashCode +@TableName(value = "sms_log", autoResultMap = true) +public class SmsLog implements Serializable { + + /** + * 自增编号 + */ + private Long id; + + /** + * 短信渠道编码(来自枚举类) + */ + private String channelCode; + + /** + * 实际渠道短信唯一标识 + */ + private String apiSmsId; + + /** + * 模板id + */ + private Long templateId; + + /** + * 手机号 + */ + private String phone; + + /** + * 内容 + */ + private String content; + + /** + * 备注 + */ + private String remark; + + /** + * 发送状态(0发送中 1成功 2失败) + */ + private Integer sendStatus; + + /** + * 创建者 + */ + private String createBy; + + /** + * 创建时间 + */ + private Date createTime; + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/msg/dal/mysql/daoobject/sms/SmsTemplateDO.java b/src/main/java/cn/iocoder/dashboard/modules/msg/dal/mysql/daoobject/sms/SmsTemplateDO.java new file mode 100644 index 000000000..39257a71d --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/msg/dal/mysql/daoobject/sms/SmsTemplateDO.java @@ -0,0 +1,81 @@ +package cn.iocoder.dashboard.modules.msg.dal.mysql.daoobject.sms; + +import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +/** + * 短信模板 + * + * @author zzf + * @since 2021-01-25 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName(value = "sms_template", autoResultMap = true) +public class SmsTemplateDO extends BaseDO { + + /** + * 自增编号 + */ + private Long id; + + /** + * 短信渠道编码(来自枚举类) + */ + private String channelCode; + + /** + * 短信渠道id (对于前端来说就是绑定一个签名) + */ + private Long channelId; + + /** + * 消息类型 [0验证码 1短信通知 2推广短信 3国际/港澳台消息] + */ + private Integer type; + + /** + * 业务编码(来自数据字典, 用户自定义业务场景 一个场景可以有多个模板) + */ + private String bizCode; + + /** + * 编码 + */ + private String code; + + /** + * 名称 + */ + private String name; + + /** + * 实际渠道模板唯一标识 + */ + private String apiTemplateId; + + /** + * 内容 + */ + private String content; + + /** + * 参数数组(自动根据内容生成) + */ + private String params; + + /** + * 备注 + */ + private String remark; + + /** + * 启用状态(0正常 1停用) + */ + private Integer status; + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/msg/package-info.java b/src/main/java/cn/iocoder/dashboard/modules/msg/package-info.java new file mode 100644 index 000000000..3a0e7635c --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/msg/package-info.java @@ -0,0 +1,6 @@ +/** + * msg 包,专门专门用于发送消息的功能,支撑上层的通用与核心业务。 + * 例如说:短信、邮件、app通知等等 + * + */ +package cn.iocoder.dashboard.modules.msg; diff --git a/src/main/java/cn/iocoder/dashboard/modules/msg/service/sms/SmsChannelService.java b/src/main/java/cn/iocoder/dashboard/modules/msg/service/sms/SmsChannelService.java new file mode 100644 index 000000000..ed2c047e8 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/msg/service/sms/SmsChannelService.java @@ -0,0 +1,34 @@ +package cn.iocoder.dashboard.modules.msg.service.sms; + +import cn.iocoder.dashboard.common.pojo.PageResult; +import cn.iocoder.dashboard.modules.msg.controller.sms.vo.SmsChannelAllVO; +import cn.iocoder.dashboard.modules.msg.controller.sms.vo.req.SmsChannelCreateReqVO; +import cn.iocoder.dashboard.modules.msg.controller.sms.vo.req.SmsChannelPageReqVO; +import cn.iocoder.dashboard.modules.msg.controller.sms.vo.resp.SmsChannelEnumRespVO; +import cn.iocoder.dashboard.modules.msg.dal.mysql.daoobject.sms.SmsChannelDO; + +import java.util.List; + +/** + * 短信渠道Service接口 + * + * @author zzf + * @date 2021/1/25 9:24 + */ +public interface SmsChannelService { + + PageResult pageChannels(SmsChannelPageReqVO reqVO); + + Long createChannel(SmsChannelCreateReqVO reqVO); + + List getChannelEnums(); + + /** + * 查询渠道(包含名下模块)信息集合 + * + * @return 渠道(包含名下模块)信息集合 + */ + List listChannelAllEnabledInfo(); + + boolean flushChannel(); +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/msg/service/sms/SmsLogService.java b/src/main/java/cn/iocoder/dashboard/modules/msg/service/sms/SmsLogService.java new file mode 100644 index 000000000..70f4d9eeb --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/msg/service/sms/SmsLogService.java @@ -0,0 +1,10 @@ +package cn.iocoder.dashboard.modules.msg.service.sms; + +/** + * 短信渠道Service接口 + * + * @author zzf + * @date 2021/1/25 9:24 + */ +public interface SmsLogService { +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/msg/service/sms/SmsTemplateService.java b/src/main/java/cn/iocoder/dashboard/modules/msg/service/sms/SmsTemplateService.java new file mode 100644 index 000000000..2c1364934 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/msg/service/sms/SmsTemplateService.java @@ -0,0 +1,10 @@ +package cn.iocoder.dashboard.modules.msg.service.sms; + +/** + * 短信渠道Service接口 + * + * @author zzf + * @date 2021/1/25 9:24 + */ +public interface SmsTemplateService { +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/msg/service/sms/impl/SmsChannelServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/msg/service/sms/impl/SmsChannelServiceImpl.java new file mode 100644 index 000000000..e5202f491 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/msg/service/sms/impl/SmsChannelServiceImpl.java @@ -0,0 +1,88 @@ +package cn.iocoder.dashboard.modules.msg.service.sms.impl; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.extra.spring.SpringUtil; +import cn.iocoder.dashboard.common.enums.SmsChannelEnum; +import cn.iocoder.dashboard.common.pojo.PageResult; +import cn.iocoder.dashboard.framework.msg.sms.factory.AbstractSmsSenderFactory; +import cn.iocoder.dashboard.modules.msg.controller.sms.vo.SmsChannelAllVO; +import cn.iocoder.dashboard.modules.msg.controller.sms.vo.req.SmsChannelCreateReqVO; +import cn.iocoder.dashboard.modules.msg.controller.sms.vo.req.SmsChannelPageReqVO; +import cn.iocoder.dashboard.modules.msg.controller.sms.vo.resp.SmsChannelEnumRespVO; +import cn.iocoder.dashboard.modules.msg.convert.sms.SmsChannelConvert; +import cn.iocoder.dashboard.modules.msg.convert.sms.SmsTemplateConvert; +import cn.iocoder.dashboard.modules.msg.dal.mysql.dao.sms.SmsChannelMapper; +import cn.iocoder.dashboard.modules.msg.dal.mysql.dao.sms.SmsTemplateMapper; +import cn.iocoder.dashboard.modules.msg.dal.mysql.daoobject.sms.SmsChannelDO; +import cn.iocoder.dashboard.modules.msg.dal.mysql.daoobject.sms.SmsTemplateDO; +import cn.iocoder.dashboard.modules.msg.service.sms.SmsChannelService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * 短信渠道Service实现类 + * + * @author zzf + * @date 2021/1/25 9:25 + */ +@Service +public class SmsChannelServiceImpl implements SmsChannelService { + + @Resource + private SmsChannelMapper mapper; + + @Resource + private SmsTemplateMapper templateMapper; + + @Override + public PageResult pageChannels(SmsChannelPageReqVO reqVO) { + return SmsChannelConvert.INSTANCE.convertPage(mapper.selectChannelPage(reqVO)); + } + + @Override + public Long createChannel(SmsChannelCreateReqVO reqVO) { + SmsChannelDO channelDO = SmsChannelConvert.INSTANCE.convert(reqVO); + mapper.insert(channelDO); + return channelDO.getId(); + } + + @Override + public List getChannelEnums() { + return SmsChannelConvert.INSTANCE.convertEnum(Arrays.asList(SmsChannelEnum.values())); + } + + @Override + public List listChannelAllEnabledInfo() { + List channelDOList = mapper.selectEnabledList(); + if (ObjectUtil.isNull(channelDOList)) { + return null; + } + List channelAllVOList = SmsChannelConvert.INSTANCE.convert(channelDOList); + + channelAllVOList.forEach(smsChannelDO -> { + + List templateDOList = templateMapper.selectListByChannelId(smsChannelDO.getId()); + if (ObjectUtil.isNull(templateDOList)) { + templateDOList = new ArrayList<>(); + } + smsChannelDO.setTemplateList(SmsTemplateConvert.INSTANCE.convert(templateDOList)); + }); + return channelAllVOList; + } + + @Override + public boolean flushChannel() { + AbstractSmsSenderFactory smsSenderFactory = SpringUtil.getBean(AbstractSmsSenderFactory.class); + if (smsSenderFactory == null) { + return false; + } + + smsSenderFactory.flush(listChannelAllEnabledInfo()); + + return true; + } +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/msg/service/sms/impl/SmsLogServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/msg/service/sms/impl/SmsLogServiceImpl.java new file mode 100644 index 000000000..f7e348a4d --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/msg/service/sms/impl/SmsLogServiceImpl.java @@ -0,0 +1,15 @@ +package cn.iocoder.dashboard.modules.msg.service.sms.impl; + +import cn.iocoder.dashboard.modules.msg.service.sms.SmsLogService; +import org.springframework.stereotype.Service; + +/** + * 短信日志Service实现类 + * + * @author zzf + * @date 2021/1/25 9:25 + */ +@Service +public class SmsLogServiceImpl implements SmsLogService { + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/msg/service/sms/impl/SmsTemplateServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/msg/service/sms/impl/SmsTemplateServiceImpl.java new file mode 100644 index 000000000..caf6d8e1c --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/msg/service/sms/impl/SmsTemplateServiceImpl.java @@ -0,0 +1,14 @@ +package cn.iocoder.dashboard.modules.msg.service.sms.impl; + +import cn.iocoder.dashboard.modules.msg.service.sms.SmsTemplateService; +import org.springframework.stereotype.Service; + +/** + * 短信模板Service实现类 + * + * @author zzf + * @date 2021/1/25 9:25 + */ +@Service +public class SmsTemplateServiceImpl implements SmsTemplateService { +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java b/src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java index 1bbde5784..5aa257a97 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java @@ -75,4 +75,11 @@ public interface SysErrorCodeConstants { // ========== 文件 1002009000 ========== ErrorCode FILE_PATH_EXISTS = new ErrorCode(1002009001, "文件路径已经存在"); + + // ========== 消息 1003001000 ========== + ErrorCode SMS_CHANNEL_NOT_FOUND = new ErrorCode(1003001001, "没有短信渠道信息, 请初始化sms_channel表数据。"); + ErrorCode SMS_TEMPLATE_NOT_FOUND = new ErrorCode(1003001002, "没有短信模板信息, 请初始化sms_template表数据。"); + ErrorCode SMS_SENDER_NOT_FOUND = new ErrorCode(1003001003, "没有找到对应的短信发送对象,请检查sms_channel表和sms_template表数据"); + ErrorCode INVALID_CHANNEL_CODE = new ErrorCode(1003001004, "非法的短信渠道code,请检查sms_channel表的code值是否与SmsChannelEnum中的code值一致。"); + } From 37c39365ec4e0e7a5f043943d6ea854da6f7d6f6 Mon Sep 17 00:00:00 2001 From: zengzefeng <986510453@qq.com> Date: Thu, 28 Jan 2021 16:45:25 +0800 Subject: [PATCH 002/126] =?UTF-8?q?=E9=87=8D=E6=9E=84=E7=9F=AD=E4=BF=A1?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sql/ruoyi-vue-pro.sql | 12 +- .../framework/msg/sms/SmsSender.java | 67 -------- .../msg/sms/config/SmsConfiguration.java | 48 ------ .../sms/factory/DefaultSmsSenderFactory.java | 137 ----------------- .../AbstractSmsIntercepterChain.java | 38 ----- .../DefaultSmsIntercepterChain.java | 20 --- .../msg/sms/intercepter/SmsIntercepter.java | 41 ----- .../sms/intercepter/SmsLogIntercepter.java | 46 ------ .../msg/sms/proxy/DefaultSmsSenderProxy.java | 41 ----- .../msg/sms/proxy/SmsSenderProxy.java | 34 ----- .../framework/{msg => }/sms/SmsBody.java | 2 +- .../dashboard/framework/sms/SmsClient.java | 107 +++++++++++++ .../framework/sms/SmsClientAdapter.java | 42 +++++ .../framework/{msg => }/sms/SmsResult.java | 2 +- .../dashboard/modules/msg/package-info.java | 6 - .../controller/sms/SmsChannelController.java | 12 +- .../controller/sms/SmsTemplateController.java | 2 +- .../controller/sms/vo/SmsChannelAllVO.java | 2 +- .../controller/sms/vo/SmsTemplateVO.java | 2 +- .../sms/vo/req/SmsChannelCreateReqVO.java | 2 +- .../sms/vo/req/SmsChannelPageReqVO.java | 7 +- .../sms/vo/resp/SmsChannelEnumRespVO.java | 2 +- .../sms/vo/resp/SmsChannelPageRespVO.java | 2 +- .../convert/sms/SmsChannelConvert.java | 10 +- .../convert/sms/SmsTemplateConvert.java | 8 +- .../dal/mysql/dao/sms/SmsChannelMapper.java | 6 +- .../dal/mysql/dao/sms/SmsLogMapper.java | 4 +- .../dal/mysql/dao/sms/SmsTemplateMapper.java | 4 +- .../mysql/dataobject}/sms/SmsChannelDO.java | 2 +- .../dal/mysql/dataobject}/sms/SmsLog.java | 2 +- .../mysql/dataobject}/sms/SmsTemplateDO.java | 2 +- .../system/enums/SysErrorCodeConstants.java | 10 +- .../service/sms/SmsChannelService.java | 12 +- .../service/sms/SmsLogService.java | 2 +- .../service/sms/SmsTemplateService.java | 2 +- .../sms/impl/SmsChannelServiceImpl.java | 32 ++-- .../service/sms/impl/SmsLogServiceImpl.java | 4 +- .../sms/impl/SmsTemplateServiceImpl.java | 4 +- .../modules/system/sms/SmsConfiguration.java | 34 +++++ .../modules/system/sms/SmsSenderUtils.java | 143 ++++++++++++++++++ .../system/sms/client/AliSmsClient.java} | 19 ++- .../system/sms/proxy/SmsClientLogProxy.java | 48 ++++++ 42 files changed, 455 insertions(+), 567 deletions(-) delete mode 100644 src/main/java/cn/iocoder/dashboard/framework/msg/sms/SmsSender.java delete mode 100644 src/main/java/cn/iocoder/dashboard/framework/msg/sms/config/SmsConfiguration.java delete mode 100644 src/main/java/cn/iocoder/dashboard/framework/msg/sms/factory/DefaultSmsSenderFactory.java delete mode 100644 src/main/java/cn/iocoder/dashboard/framework/msg/sms/intercepter/AbstractSmsIntercepterChain.java delete mode 100644 src/main/java/cn/iocoder/dashboard/framework/msg/sms/intercepter/DefaultSmsIntercepterChain.java delete mode 100644 src/main/java/cn/iocoder/dashboard/framework/msg/sms/intercepter/SmsIntercepter.java delete mode 100644 src/main/java/cn/iocoder/dashboard/framework/msg/sms/intercepter/SmsLogIntercepter.java delete mode 100644 src/main/java/cn/iocoder/dashboard/framework/msg/sms/proxy/DefaultSmsSenderProxy.java delete mode 100644 src/main/java/cn/iocoder/dashboard/framework/msg/sms/proxy/SmsSenderProxy.java rename src/main/java/cn/iocoder/dashboard/framework/{msg => }/sms/SmsBody.java (88%) create mode 100644 src/main/java/cn/iocoder/dashboard/framework/sms/SmsClient.java create mode 100644 src/main/java/cn/iocoder/dashboard/framework/sms/SmsClientAdapter.java rename src/main/java/cn/iocoder/dashboard/framework/{msg => }/sms/SmsResult.java (87%) delete mode 100644 src/main/java/cn/iocoder/dashboard/modules/msg/package-info.java rename src/main/java/cn/iocoder/dashboard/modules/{msg => system}/controller/sms/SmsChannelController.java (75%) rename src/main/java/cn/iocoder/dashboard/modules/{msg => system}/controller/sms/SmsTemplateController.java (98%) rename src/main/java/cn/iocoder/dashboard/modules/{msg => system}/controller/sms/vo/SmsChannelAllVO.java (94%) rename src/main/java/cn/iocoder/dashboard/modules/{msg => system}/controller/sms/vo/SmsTemplateVO.java (88%) rename src/main/java/cn/iocoder/dashboard/modules/{msg => system}/controller/sms/vo/req/SmsChannelCreateReqVO.java (94%) rename src/main/java/cn/iocoder/dashboard/modules/{msg => system}/controller/sms/vo/req/SmsChannelPageReqVO.java (73%) rename src/main/java/cn/iocoder/dashboard/modules/{msg => system}/controller/sms/vo/resp/SmsChannelEnumRespVO.java (83%) rename src/main/java/cn/iocoder/dashboard/modules/{msg => system}/controller/sms/vo/resp/SmsChannelPageRespVO.java (95%) rename src/main/java/cn/iocoder/dashboard/modules/{msg => system}/convert/sms/SmsChannelConvert.java (68%) rename src/main/java/cn/iocoder/dashboard/modules/{msg => system}/convert/sms/SmsTemplateConvert.java (66%) rename src/main/java/cn/iocoder/dashboard/modules/{msg => system}/dal/mysql/dao/sms/SmsChannelMapper.java (83%) rename src/main/java/cn/iocoder/dashboard/modules/{msg => system}/dal/mysql/dao/sms/SmsLogMapper.java (55%) rename src/main/java/cn/iocoder/dashboard/modules/{msg => system}/dal/mysql/dao/sms/SmsTemplateMapper.java (89%) rename src/main/java/cn/iocoder/dashboard/modules/{msg/dal/mysql/daoobject => system/dal/mysql/dataobject}/sms/SmsChannelDO.java (93%) rename src/main/java/cn/iocoder/dashboard/modules/{msg/dal/mysql/daoobject => system/dal/mysql/dataobject}/sms/SmsLog.java (93%) rename src/main/java/cn/iocoder/dashboard/modules/{msg/dal/mysql/daoobject => system/dal/mysql/dataobject}/sms/SmsTemplateDO.java (95%) rename src/main/java/cn/iocoder/dashboard/modules/{msg => system}/service/sms/SmsChannelService.java (55%) rename src/main/java/cn/iocoder/dashboard/modules/{msg => system}/service/sms/SmsLogService.java (66%) rename src/main/java/cn/iocoder/dashboard/modules/{msg => system}/service/sms/SmsTemplateService.java (67%) rename src/main/java/cn/iocoder/dashboard/modules/{msg => system}/service/sms/impl/SmsChannelServiceImpl.java (61%) rename src/main/java/cn/iocoder/dashboard/modules/{msg => system}/service/sms/impl/SmsLogServiceImpl.java (60%) rename src/main/java/cn/iocoder/dashboard/modules/{msg => system}/service/sms/impl/SmsTemplateServiceImpl.java (60%) create mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/sms/SmsConfiguration.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/sms/SmsSenderUtils.java rename src/main/java/cn/iocoder/dashboard/{framework/msg/sms/impl/ali/AliSmsSender.java => modules/system/sms/client/AliSmsClient.java} (81%) create mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/sms/proxy/SmsClientLogProxy.java diff --git a/sql/ruoyi-vue-pro.sql b/sql/ruoyi-vue-pro.sql index edba4204c..9355fab64 100644 --- a/sql/ruoyi-vue-pro.sql +++ b/sql/ruoyi-vue-pro.sql @@ -892,9 +892,8 @@ DROP TABLE IF EXISTS `sms_channel`; CREATE TABLE `sms_channel` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增编号', `code` varchar(50) not null COMMENT '编码(来自枚举类 阿里、华为、七牛等)', - `api_key` varchar(100) NOT NULL COMMENT '账号id', -- add - `api_secret` varchar(100) NOT NULL COMMENT '账号秘钥', -- add - `priority` tinyint(8) NOT NULL default 1 COMMENT '优先级(存在多个签名时,选择值最小的,渠道不可用时,按优先级从小到大切换)', -- add + `api_key` varchar(100) NOT NULL COMMENT '账号id', + `api_secret` varchar(100) NOT NULL COMMENT '账号秘钥', `api_signature_id` varchar(100) NOT NULL COMMENT '实际渠道签名唯一标识', `name` varchar(50) not null COMMENT '名称', `signature` varchar(50) not null COMMENT '签名值', @@ -919,15 +918,14 @@ DROP TABLE IF EXISTS `sms_template`; CREATE TABLE `sms_template` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增编号', `channel_code` varchar(50) not null COMMENT '短信渠道编码(来自枚举类)', - `channel_id` bigint(20) not null COMMENT '短信渠道id (对于前端来说就是绑定一个签名)', -- add + `channel_id` bigint(20) not null COMMENT '短信渠道id (对于前端来说就是绑定一个签名)', `type` tinyint(4) NOT NULL default 1 COMMENT '消息类型 [0验证码 1短信通知 2推广短信 3国际/港澳台消息]', - `biz_code` varchar(50) not null COMMENT '业务编码(来自数据字典, 用户自定义业务场景 一个场景可以有多个模板)', -- add - `priority` tinyint(8) NOT NULL default 1 COMMENT '优先级(默认直接继承渠道表的,逻辑也与渠道表的一致,可以针对每个biz_code进行修改)',-- add + `biz_code` varchar(50) not null COMMENT '业务编码(来自数据字典, 用户自定义业务场景 一个场景可以有多个模板)', `code` varchar(50) not null COMMENT '编码', `name` varchar(50) not null COMMENT '名称', `api_template_id` varchar(100) NOT NULL COMMENT '实际渠道模板唯一标识', `content` varchar(1000) NOT NULL DEFAULT '' COMMENT '内容', - `params` varchar(200) NOT NULL DEFAULT '' COMMENT '参数数组(自动根据内容生成)', -- add + `params` varchar(200) NOT NULL DEFAULT '' COMMENT '参数数组(自动根据内容生成)', `remark` varchar(200) NOT NULL COMMENT '备注', `status` tinyint(4) NOT NULL default 0 COMMENT '启用状态(0正常 1停用)', diff --git a/src/main/java/cn/iocoder/dashboard/framework/msg/sms/SmsSender.java b/src/main/java/cn/iocoder/dashboard/framework/msg/sms/SmsSender.java deleted file mode 100644 index 30b10df61..000000000 --- a/src/main/java/cn/iocoder/dashboard/framework/msg/sms/SmsSender.java +++ /dev/null @@ -1,67 +0,0 @@ -package cn.iocoder.dashboard.framework.msg.sms; - -import org.apache.commons.lang3.StringUtils; - -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; - -/** - * 短信父接口 - * - * @author zzf - * @date 2021/1/25 14:14 - */ -public interface SmsSender { - - /** - * 发送通知 - * - * @param msgBody 通知内容 - * @param targets 发送对象列表 - * @return 是否发送成功 - */ - SmsResult send(SmsBody msgBody, Collection targets); - - /** - * 发送通知 - * - * @param msgBody 通知内容 - * @param target 发送对象列表 - * @return 是否发送成功 - */ - default SmsResult send(SmsBody msgBody, String target) { - if (StringUtils.isBlank(target)) { - return failResult(); - } - - return send(msgBody, Collections.singletonList(target)); - } - - /** - * 发送通知 - * - * @param msgBody 通知内容 - * @param targets 发送对象列表 - * @return 是否发送成功 - */ - default SmsResult send(SmsBody msgBody, String... targets) { - if (targets == null) { - return failResult(); - } - - return send(msgBody, Arrays.asList(targets)); - } - - default SmsResult failResult() { - SmsResult resultBody = new SmsResult<>(); - resultBody.setSuccess(false); - return resultBody; - } - - default SmsResult failResult(String message) { - SmsResult resultBody = failResult(); - resultBody.setMessage(message); - return resultBody; - } -} \ No newline at end of file diff --git a/src/main/java/cn/iocoder/dashboard/framework/msg/sms/config/SmsConfiguration.java b/src/main/java/cn/iocoder/dashboard/framework/msg/sms/config/SmsConfiguration.java deleted file mode 100644 index 7b5b26a5b..000000000 --- a/src/main/java/cn/iocoder/dashboard/framework/msg/sms/config/SmsConfiguration.java +++ /dev/null @@ -1,48 +0,0 @@ -package cn.iocoder.dashboard.framework.msg.sms.config; - -import cn.iocoder.dashboard.framework.msg.sms.factory.DefaultSmsSenderFactory; -import cn.iocoder.dashboard.framework.msg.sms.intercepter.AbstractSmsIntercepterChain; -import cn.iocoder.dashboard.framework.msg.sms.intercepter.DefaultSmsIntercepterChain; -import cn.iocoder.dashboard.framework.msg.sms.intercepter.SmsLogIntercepter; -import cn.iocoder.dashboard.modules.msg.controller.sms.vo.SmsChannelAllVO; -import cn.iocoder.dashboard.modules.msg.service.sms.SmsChannelService; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import javax.annotation.Resource; -import java.util.List; - -/** - * 短信服务配置 - * - * @author guer - */ -@Configuration -@ConditionalOnProperty("sms.enabled") -public class SmsConfiguration { - - @Resource - private SmsChannelService channelService; - - - @Bean - public AbstractSmsIntercepterChain smsIntercepterChain() { - DefaultSmsIntercepterChain intercepterChain = new DefaultSmsIntercepterChain(); - //添加拦截器 - intercepterChain.addSmsIntercepter(new SmsLogIntercepter()); - return intercepterChain; - } - - @Bean - public DefaultSmsSenderFactory smsSenderFactory(AbstractSmsIntercepterChain intercepterChain) { - DefaultSmsSenderFactory defaultSmsSenderFactory = new DefaultSmsSenderFactory(); - List smsChannelAllVOList = channelService.listChannelAllEnabledInfo(); - //初始化渠道、模板信息 - defaultSmsSenderFactory.init(smsChannelAllVOList); - //注入拦截器链 - defaultSmsSenderFactory.setIntercepterChain(intercepterChain); - return defaultSmsSenderFactory; - } - -} diff --git a/src/main/java/cn/iocoder/dashboard/framework/msg/sms/factory/DefaultSmsSenderFactory.java b/src/main/java/cn/iocoder/dashboard/framework/msg/sms/factory/DefaultSmsSenderFactory.java deleted file mode 100644 index 123943a3d..000000000 --- a/src/main/java/cn/iocoder/dashboard/framework/msg/sms/factory/DefaultSmsSenderFactory.java +++ /dev/null @@ -1,137 +0,0 @@ -package cn.iocoder.dashboard.framework.msg.sms.factory; - -import cn.hutool.core.util.ObjectUtil; -import cn.iocoder.dashboard.common.enums.SmsChannelEnum; -import cn.iocoder.dashboard.common.exception.ServiceException; -import cn.iocoder.dashboard.framework.msg.sms.SmsSender; -import cn.iocoder.dashboard.framework.msg.sms.impl.ali.AliSmsSender; -import cn.iocoder.dashboard.framework.msg.sms.intercepter.AbstractSmsIntercepterChain; -import cn.iocoder.dashboard.framework.msg.sms.proxy.DefaultSmsSenderProxy; -import cn.iocoder.dashboard.modules.msg.controller.sms.vo.SmsChannelAllVO; -import cn.iocoder.dashboard.modules.msg.controller.sms.vo.SmsTemplateVO; -import lombok.Setter; - -import java.util.List; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReadWriteLock; -import java.util.concurrent.locks.ReentrantReadWriteLock; - -import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; - -/** - * 短信发送者工厂 - * - * @author zzf - * @date 2021/1/25 16:18 - */ -public class DefaultSmsSenderFactory { - - /** - * sender索引 - * key: {@link SmsTemplateVO#getBizCode()} - * value: {@link SmsSender} - */ - private final ConcurrentHashMap> bizCode2SenderMap = new ConcurrentHashMap<>(8); - - /** - * sender索引 - * key: {@link SmsTemplateVO#getCode()} - * value: {@link SmsSender} - */ - private final ConcurrentHashMap> templateCode2SenderMap = new ConcurrentHashMap<>(8); - - - @Setter - private AbstractSmsIntercepterChain intercepterChain; - - /** - * 读写锁 - */ - private final ReadWriteLock lock = new ReentrantReadWriteLock(); - private final Lock readLock = lock.readLock(); - private final Lock writeLock = lock.writeLock(); - - - public void init(List smsChannelAllVOList) { - if (ObjectUtil.isEmpty(smsChannelAllVOList)) { - throw new ServiceException(SMS_CHANNEL_NOT_FOUND); - } - try { - writeLock.lock(); - addSender(smsChannelAllVOList); - } finally { - writeLock.unlock(); - } - } - - public SmsSender getSenderByBizCode(String bizCode) { - return getSmsSender(bizCode, bizCode2SenderMap); - } - - public SmsSender getSenderByTemplateCode(String templateCode) { - return getSmsSender(templateCode, templateCode2SenderMap); - } - - private SmsSender getSmsSender(String templateCode, ConcurrentHashMap> cacheMap) { - try { - readLock.lock(); - SmsSender smsSender = cacheMap.get(templateCode); - if (smsSender == null) { - throw new ServiceException(SMS_SENDER_NOT_FOUND); - } - return smsSender; - } finally { - readLock.unlock(); - } - } - - public void flush(List smsChannelAllVOList) { - try { - writeLock.lock(); - bizCode2SenderMap.clear(); - templateCode2SenderMap.clear(); - addSender(smsChannelAllVOList); - } finally { - writeLock.unlock(); - } - } - - - private void addSender(List smsChannelAllVOList) { - smsChannelAllVOList.forEach(channelAllVO -> addSender(SmsChannelEnum.getByCode(channelAllVO.getCode()), channelAllVO)); - } - - private void addSender(SmsChannelEnum channelEnum, SmsChannelAllVO channelAllVO) { - if (channelEnum == null) { - throw new ServiceException(INVALID_CHANNEL_CODE); - } - List templateList = channelAllVO.getTemplateList(); - if (ObjectUtil.isEmpty(templateList)) { - throw new ServiceException(SMS_TEMPLATE_NOT_FOUND); - } - - SmsSender aliSmsSender = getSender(channelEnum, channelAllVO); - - - templateList.forEach(smsTemplateVO -> { - bizCode2SenderMap.put(smsTemplateVO.getBizCode(), aliSmsSender); - templateCode2SenderMap.put(smsTemplateVO.getCode(), aliSmsSender); - }); - } - - private SmsSender getSender(SmsChannelEnum channelEnum, SmsChannelAllVO channelAllVO) { - switch (channelEnum) { - case ALI: - return new DefaultSmsSenderProxy<>(new AliSmsSender(channelAllVO), intercepterChain); - // TODO fill more channel - default: - break; - } - throw new ServiceException(SMS_SENDER_NOT_FOUND); - } - - - - -} diff --git a/src/main/java/cn/iocoder/dashboard/framework/msg/sms/intercepter/AbstractSmsIntercepterChain.java b/src/main/java/cn/iocoder/dashboard/framework/msg/sms/intercepter/AbstractSmsIntercepterChain.java deleted file mode 100644 index f95de7128..000000000 --- a/src/main/java/cn/iocoder/dashboard/framework/msg/sms/intercepter/AbstractSmsIntercepterChain.java +++ /dev/null @@ -1,38 +0,0 @@ -package cn.iocoder.dashboard.framework.msg.sms.intercepter; - -import lombok.Getter; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -/** - * 消息父接口 - * - * @author zzf - * @date 2021/1/22 15:46 - */ -public abstract class AbstractSmsIntercepterChain { - - @Getter - protected final List intercepterList = new ArrayList<>(8); - - - /** - * 添加短信拦截器 - * - * @param smsIntercepter 短信拦截器 - */ - public void addSmsIntercepter(SmsIntercepter smsIntercepter) { - addSmsIntercepter(Collections.singletonList(smsIntercepter)); - } - - /** - * 添加短信拦截器 - * - * @param smsIntercepterList 短信拦截器数组 - */ - abstract void addSmsIntercepter(List smsIntercepterList); - - -} diff --git a/src/main/java/cn/iocoder/dashboard/framework/msg/sms/intercepter/DefaultSmsIntercepterChain.java b/src/main/java/cn/iocoder/dashboard/framework/msg/sms/intercepter/DefaultSmsIntercepterChain.java deleted file mode 100644 index 76d31906d..000000000 --- a/src/main/java/cn/iocoder/dashboard/framework/msg/sms/intercepter/DefaultSmsIntercepterChain.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.iocoder.dashboard.framework.msg.sms.intercepter; - -import java.util.Comparator; -import java.util.List; - -/** - * 消息父接口 - * - * @author zzf - * @date 2021/1/22 15:46 - */ -public class DefaultSmsIntercepterChain extends AbstractSmsIntercepterChain { - - @Override - public void addSmsIntercepter(List smsIntercepterList) { - intercepterList.addAll(smsIntercepterList); - //排序 - intercepterList.sort(Comparator.comparingInt(SmsIntercepter::getOrder)); - } -} diff --git a/src/main/java/cn/iocoder/dashboard/framework/msg/sms/intercepter/SmsIntercepter.java b/src/main/java/cn/iocoder/dashboard/framework/msg/sms/intercepter/SmsIntercepter.java deleted file mode 100644 index df83c8d6a..000000000 --- a/src/main/java/cn/iocoder/dashboard/framework/msg/sms/intercepter/SmsIntercepter.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.iocoder.dashboard.framework.msg.sms.intercepter; - -import cn.iocoder.dashboard.framework.msg.sms.SmsBody; -import cn.iocoder.dashboard.framework.msg.sms.SmsResult; - -import java.util.Collection; - -/** - * 消息父接口 - * - * @author zzf - * @date 2021/1/22 15:46 - */ -public interface SmsIntercepter { - - /** - * 监听发送前 - * - * @param msgBody 消息体 - * @param targets 发送对象数组 - */ - void beforeSender(SmsBody msgBody, Collection targets); - - /** - * 监听发送后 - * - * @param msgBody 消息体 - * @param targets 发送对象数组 - * @param resultBody 返回对象 - */ - void afterSender(SmsBody msgBody, Collection targets, SmsResult resultBody); - - /** - * 排序值,拦截器根据order值顺序执行 - *

- * 值越小,越早执行 - * - * @return 排序值 - */ - int getOrder(); -} diff --git a/src/main/java/cn/iocoder/dashboard/framework/msg/sms/intercepter/SmsLogIntercepter.java b/src/main/java/cn/iocoder/dashboard/framework/msg/sms/intercepter/SmsLogIntercepter.java deleted file mode 100644 index 9a7effd95..000000000 --- a/src/main/java/cn/iocoder/dashboard/framework/msg/sms/intercepter/SmsLogIntercepter.java +++ /dev/null @@ -1,46 +0,0 @@ -package cn.iocoder.dashboard.framework.msg.sms.intercepter; - -import cn.iocoder.dashboard.framework.msg.sms.SmsBody; -import cn.iocoder.dashboard.framework.msg.sms.SmsResult; -import cn.iocoder.dashboard.modules.msg.dal.mysql.dao.sms.SmsLogMapper; -import cn.iocoder.dashboard.util.json.JsonUtils; -import lombok.Setter; -import lombok.extern.slf4j.Slf4j; - -import java.util.Collection; - -/** - * 短信日志拦截器 - * - * @author zzf - * @date 2021/1/22 15:46 - */ -@Slf4j -public class SmsLogIntercepter implements SmsIntercepter { - - - @Override - public void beforeSender(SmsBody msgBody, Collection targets) { - log.debug("ready send sms, body: {}, target: {}", JsonUtils.toJsonString(msgBody), targets); - - } - - @Override - public void afterSender(SmsBody msgBody, Collection targets, SmsResult resultBody) { - if (resultBody.getSuccess()) { - // - } else { - log.warn("send sms fail, body: {}, target: {}, resultBody: {}", - JsonUtils.toJsonString(msgBody), - targets, - JsonUtils.toJsonString(resultBody) - ); - } - - } - - @Override - public int getOrder() { - return 0; - } -} diff --git a/src/main/java/cn/iocoder/dashboard/framework/msg/sms/proxy/DefaultSmsSenderProxy.java b/src/main/java/cn/iocoder/dashboard/framework/msg/sms/proxy/DefaultSmsSenderProxy.java deleted file mode 100644 index f9d7e566f..000000000 --- a/src/main/java/cn/iocoder/dashboard/framework/msg/sms/proxy/DefaultSmsSenderProxy.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.iocoder.dashboard.framework.msg.sms.proxy; - -import cn.hutool.core.util.ObjectUtil; -import cn.iocoder.dashboard.framework.msg.sms.SmsBody; -import cn.iocoder.dashboard.framework.msg.sms.SmsResult; -import cn.iocoder.dashboard.framework.msg.sms.SmsSender; -import cn.iocoder.dashboard.framework.msg.sms.intercepter.AbstractSmsIntercepterChain; - -import java.util.Collection; - -/** - * 消息父接口 - * - * @author zzf - * @date 2021/1/22 15:46 - */ -public class DefaultSmsSenderProxy implements SmsSender { - - private final SmsSender smsSender; - private final AbstractSmsIntercepterChain chain; - - @Override - public SmsResult send(SmsBody msgBody, Collection targets) { - if (ObjectUtil.isNotNull(chain) && ObjectUtil.isNotEmpty(chain.getIntercepterList())) { - chain.getIntercepterList().forEach(s -> s.beforeSender(msgBody, targets)); - } - - SmsResult resultBody = smsSender.send(msgBody, targets); - - if (ObjectUtil.isNotNull(chain) && ObjectUtil.isNotEmpty(chain.getIntercepterList())) { - chain.getIntercepterList().forEach(s -> s.afterSender(msgBody, targets, resultBody)); - } - return resultBody; - } - - public DefaultSmsSenderProxy(SmsSender smsSender, - AbstractSmsIntercepterChain chain) { - this.smsSender = smsSender; - this.chain = chain; - } -} diff --git a/src/main/java/cn/iocoder/dashboard/framework/msg/sms/proxy/SmsSenderProxy.java b/src/main/java/cn/iocoder/dashboard/framework/msg/sms/proxy/SmsSenderProxy.java deleted file mode 100644 index 069916e2a..000000000 --- a/src/main/java/cn/iocoder/dashboard/framework/msg/sms/proxy/SmsSenderProxy.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.iocoder.dashboard.framework.msg.sms.proxy; - -import cn.iocoder.dashboard.framework.msg.sms.SmsSender; -import cn.iocoder.dashboard.framework.msg.sms.intercepter.SmsIntercepter; - -import java.util.Collections; -import java.util.List; - -/** - * 消息父接口 - * - * @author zzf - * @date 2021/1/22 15:46 - */ -public interface SmsSenderProxy extends SmsSender { - - /** - * 添加短信拦截器 - * - * @param smsIntercepter 短信拦截器 - */ - default void addSmsIntercepter(SmsIntercepter smsIntercepter) { - addSmsIntercepter(Collections.singletonList(smsIntercepter)); - } - - /** - * 添加短信拦截器 - * - * @param smsIntercepterList 短信拦截器数组 - */ - void addSmsIntercepter(List smsIntercepterList); - - -} diff --git a/src/main/java/cn/iocoder/dashboard/framework/msg/sms/SmsBody.java b/src/main/java/cn/iocoder/dashboard/framework/sms/SmsBody.java similarity index 88% rename from src/main/java/cn/iocoder/dashboard/framework/msg/sms/SmsBody.java rename to src/main/java/cn/iocoder/dashboard/framework/sms/SmsBody.java index 693838d4a..48fb2253b 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/msg/sms/SmsBody.java +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/SmsBody.java @@ -1,4 +1,4 @@ -package cn.iocoder.dashboard.framework.msg.sms; +package cn.iocoder.dashboard.framework.sms; import cn.iocoder.dashboard.util.json.JsonUtils; import lombok.Data; diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/SmsClient.java b/src/main/java/cn/iocoder/dashboard/framework/sms/SmsClient.java new file mode 100644 index 000000000..bf1a44f57 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/SmsClient.java @@ -0,0 +1,107 @@ +package cn.iocoder.dashboard.framework.sms; + +import org.apache.commons.lang3.StringUtils; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; + +/** + * 短信父接口 + * + * @author zzf + * @date 2021/1/25 14:14 + */ +public interface SmsClient { + + /** + * 发送消息 + * + * @param msgBody 消息内容 + * @param targets 发送对象列表 + * @return 是否发送成功 + */ + SmsResult send(SmsBody msgBody, Collection targets); + + /** + * 发送消息 + * + * @param msgBody 消息内容 + * @param target 发送对象 + * @return 是否发送成功 + */ + default SmsResult send(SmsBody msgBody, String target) { + if (StringUtils.isBlank(target)) { + return failResult(); + } + + return send(msgBody, Collections.singletonList(target)); + } + + /** + * 发送消息 + * + * @param msgBody 消息内容 + * @param targets 发送对象列表 + * @return 是否发送成功 + */ + default SmsResult send(SmsBody msgBody, String... targets) { + if (targets == null) { + return failResult(); + } + + return send(msgBody, Arrays.asList(targets)); + } + + + /** + * 异步发送消息 + * + * @param msgBody 消息内容 + * @param targets 发送对象列表 + * @return 是否发送成功 + */ + SmsResult sendAsync(SmsBody msgBody, Collection targets); + + /** + * 异步发送消息 + * + * @param msgBody 消息内容 + * @param target 发送对象 + * @return 是否发送成功 + */ + default SmsResult sendAsync(SmsBody msgBody, String target) { + if (StringUtils.isBlank(target)) { + return failResult("target must not null."); + } + + return sendAsync(msgBody, Collections.singletonList(target)); + } + + /** + * 异步发送消息 + * + * @param msgBody 消息内容 + * @param targets 发送对象列表 + * @return 是否发送成功 + */ + default SmsResult sendAsync(SmsBody msgBody, String... targets) { + if (targets == null) { + return failResult("targets must not null."); + } + + return sendAsync(msgBody, Arrays.asList(targets)); + } + + default SmsResult failResult() { + SmsResult resultBody = new SmsResult<>(); + resultBody.setSuccess(false); + return resultBody; + } + + default SmsResult failResult(String message) { + SmsResult resultBody = failResult(); + resultBody.setMessage(message); + return resultBody; + } +} \ No newline at end of file diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/SmsClientAdapter.java b/src/main/java/cn/iocoder/dashboard/framework/sms/SmsClientAdapter.java new file mode 100644 index 000000000..6edf7646f --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/SmsClientAdapter.java @@ -0,0 +1,42 @@ +package cn.iocoder.dashboard.framework.sms; + +import cn.hutool.core.util.ObjectUtil; +import cn.iocoder.dashboard.common.exception.ServiceException; + +import java.util.Collection; +import java.util.Collections; +import java.util.Map; + +import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.SMS_CHANNEL_NOT_INIT; + +/** + * 抽象短信客户端工厂 + * + * @author zzf + * @date 2021/1/28 14:01 + */ +public class SmsClientAdapter { + + private final Map> smsSenderMap; + + public SmsClientAdapter(Map> smsSenderMap) { + if (ObjectUtil.isEmpty(smsSenderMap)) { + throw new ServiceException(SMS_CHANNEL_NOT_INIT); + } + this.smsSenderMap = smsSenderMap; + } + + public void flushClient(Map> smsSenderMap) { + this.smsSenderMap.clear(); + smsSenderMap.putAll(Collections.unmodifiableMap(smsSenderMap)); + } + + public SmsResult send(Long channelId, SmsBody smsBody, Collection targetPhone) { + SmsClient smsClient = getSmsSender(channelId); + return smsClient.send(smsBody, targetPhone); + } + + private SmsClient getSmsSender(Long channelId) { + return smsSenderMap.get(channelId); + } +} diff --git a/src/main/java/cn/iocoder/dashboard/framework/msg/sms/SmsResult.java b/src/main/java/cn/iocoder/dashboard/framework/sms/SmsResult.java similarity index 87% rename from src/main/java/cn/iocoder/dashboard/framework/msg/sms/SmsResult.java rename to src/main/java/cn/iocoder/dashboard/framework/sms/SmsResult.java index 8a8741839..b994514b6 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/msg/sms/SmsResult.java +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/SmsResult.java @@ -1,4 +1,4 @@ -package cn.iocoder.dashboard.framework.msg.sms; +package cn.iocoder.dashboard.framework.sms; import lombok.Data; diff --git a/src/main/java/cn/iocoder/dashboard/modules/msg/package-info.java b/src/main/java/cn/iocoder/dashboard/modules/msg/package-info.java deleted file mode 100644 index 3a0e7635c..000000000 --- a/src/main/java/cn/iocoder/dashboard/modules/msg/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * msg 包,专门专门用于发送消息的功能,支撑上层的通用与核心业务。 - * 例如说:短信、邮件、app通知等等 - * - */ -package cn.iocoder.dashboard.modules.msg; diff --git a/src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/SmsChannelController.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SmsChannelController.java similarity index 75% rename from src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/SmsChannelController.java rename to src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SmsChannelController.java index c28d9b862..a75f9e2eb 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/SmsChannelController.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SmsChannelController.java @@ -1,12 +1,12 @@ -package cn.iocoder.dashboard.modules.msg.controller.sms; +package cn.iocoder.dashboard.modules.system.controller.sms; import cn.iocoder.dashboard.common.pojo.CommonResult; import cn.iocoder.dashboard.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.msg.controller.sms.vo.req.SmsChannelCreateReqVO; -import cn.iocoder.dashboard.modules.msg.controller.sms.vo.req.SmsChannelPageReqVO; -import cn.iocoder.dashboard.modules.msg.controller.sms.vo.resp.SmsChannelEnumRespVO; -import cn.iocoder.dashboard.modules.msg.dal.mysql.daoobject.sms.SmsChannelDO; -import cn.iocoder.dashboard.modules.msg.service.sms.SmsChannelService; +import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelCreateReqVO; +import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelPageReqVO; +import cn.iocoder.dashboard.modules.system.controller.sms.vo.resp.SmsChannelEnumRespVO; +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SmsChannelDO; +import cn.iocoder.dashboard.modules.system.service.sms.SmsChannelService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.validation.annotation.Validated; diff --git a/src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/SmsTemplateController.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SmsTemplateController.java similarity index 98% rename from src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/SmsTemplateController.java rename to src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SmsTemplateController.java index 8bd73b12e..9fdf98440 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/SmsTemplateController.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SmsTemplateController.java @@ -1,4 +1,4 @@ -package cn.iocoder.dashboard.modules.msg.controller.sms; +package cn.iocoder.dashboard.modules.system.controller.sms; import cn.iocoder.dashboard.common.enums.CommonStatusEnum; import cn.iocoder.dashboard.common.pojo.CommonResult; diff --git a/src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/vo/SmsChannelAllVO.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/SmsChannelAllVO.java similarity index 94% rename from src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/vo/SmsChannelAllVO.java rename to src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/SmsChannelAllVO.java index bac72c959..042cddaa2 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/vo/SmsChannelAllVO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/SmsChannelAllVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.dashboard.modules.msg.controller.sms.vo; +package cn.iocoder.dashboard.modules.system.controller.sms.vo; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/vo/SmsTemplateVO.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/SmsTemplateVO.java similarity index 88% rename from src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/vo/SmsTemplateVO.java rename to src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/SmsTemplateVO.java index 04bfe9a62..c5156a6ae 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/vo/SmsTemplateVO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/SmsTemplateVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.dashboard.modules.msg.controller.sms.vo; +package cn.iocoder.dashboard.modules.system.controller.sms.vo; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/vo/req/SmsChannelCreateReqVO.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/req/SmsChannelCreateReqVO.java similarity index 94% rename from src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/vo/req/SmsChannelCreateReqVO.java rename to src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/req/SmsChannelCreateReqVO.java index 729088b65..b38f7c832 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/vo/req/SmsChannelCreateReqVO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/req/SmsChannelCreateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.dashboard.modules.msg.controller.sms.vo.req; +package cn.iocoder.dashboard.modules.system.controller.sms.vo.req; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/vo/req/SmsChannelPageReqVO.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/req/SmsChannelPageReqVO.java similarity index 73% rename from src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/vo/req/SmsChannelPageReqVO.java rename to src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/req/SmsChannelPageReqVO.java index dd2df146e..19e2987fe 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/vo/req/SmsChannelPageReqVO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/req/SmsChannelPageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.dashboard.modules.msg.controller.sms.vo.req; +package cn.iocoder.dashboard.modules.system.controller.sms.vo.req; import cn.iocoder.dashboard.common.pojo.PageParam; import io.swagger.annotations.ApiModel; @@ -7,11 +7,6 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; -import org.springframework.format.annotation.DateTimeFormat; - -import java.util.Date; - -import static cn.iocoder.dashboard.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; @ApiModel("消息渠道分页 Request VO") @Data diff --git a/src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/vo/resp/SmsChannelEnumRespVO.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/resp/SmsChannelEnumRespVO.java similarity index 83% rename from src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/vo/resp/SmsChannelEnumRespVO.java rename to src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/resp/SmsChannelEnumRespVO.java index a3e56e0ca..cb156781d 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/vo/resp/SmsChannelEnumRespVO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/resp/SmsChannelEnumRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.dashboard.modules.msg.controller.sms.vo.resp; +package cn.iocoder.dashboard.modules.system.controller.sms.vo.resp; import io.swagger.annotations.ApiModel; import lombok.Data; diff --git a/src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/vo/resp/SmsChannelPageRespVO.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/resp/SmsChannelPageRespVO.java similarity index 95% rename from src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/vo/resp/SmsChannelPageRespVO.java rename to src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/resp/SmsChannelPageRespVO.java index 603f13e07..2ad1ce357 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/msg/controller/sms/vo/resp/SmsChannelPageRespVO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/resp/SmsChannelPageRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.dashboard.modules.msg.controller.sms.vo.resp; +package cn.iocoder.dashboard.modules.system.controller.sms.vo.resp; import cn.iocoder.dashboard.common.pojo.PageParam; import io.swagger.annotations.ApiModel; diff --git a/src/main/java/cn/iocoder/dashboard/modules/msg/convert/sms/SmsChannelConvert.java b/src/main/java/cn/iocoder/dashboard/modules/system/convert/sms/SmsChannelConvert.java similarity index 68% rename from src/main/java/cn/iocoder/dashboard/modules/msg/convert/sms/SmsChannelConvert.java rename to src/main/java/cn/iocoder/dashboard/modules/system/convert/sms/SmsChannelConvert.java index 4728586a3..af87d2253 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/msg/convert/sms/SmsChannelConvert.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/convert/sms/SmsChannelConvert.java @@ -1,11 +1,11 @@ -package cn.iocoder.dashboard.modules.msg.convert.sms; +package cn.iocoder.dashboard.modules.system.convert.sms; import cn.iocoder.dashboard.common.enums.SmsChannelEnum; import cn.iocoder.dashboard.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.msg.controller.sms.vo.SmsChannelAllVO; -import cn.iocoder.dashboard.modules.msg.controller.sms.vo.req.SmsChannelCreateReqVO; -import cn.iocoder.dashboard.modules.msg.controller.sms.vo.resp.SmsChannelEnumRespVO; -import cn.iocoder.dashboard.modules.msg.dal.mysql.daoobject.sms.SmsChannelDO; +import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsChannelAllVO; +import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelCreateReqVO; +import cn.iocoder.dashboard.modules.system.controller.sms.vo.resp.SmsChannelEnumRespVO; +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SmsChannelDO; import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserUpdateReqVO; import com.baomidou.mybatisplus.core.metadata.IPage; import org.mapstruct.Mapper; diff --git a/src/main/java/cn/iocoder/dashboard/modules/msg/convert/sms/SmsTemplateConvert.java b/src/main/java/cn/iocoder/dashboard/modules/system/convert/sms/SmsTemplateConvert.java similarity index 66% rename from src/main/java/cn/iocoder/dashboard/modules/msg/convert/sms/SmsTemplateConvert.java rename to src/main/java/cn/iocoder/dashboard/modules/system/convert/sms/SmsTemplateConvert.java index 313e06c92..476b96e0e 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/msg/convert/sms/SmsTemplateConvert.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/convert/sms/SmsTemplateConvert.java @@ -1,9 +1,9 @@ -package cn.iocoder.dashboard.modules.msg.convert.sms; +package cn.iocoder.dashboard.modules.system.convert.sms; import cn.iocoder.dashboard.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.msg.controller.sms.vo.SmsTemplateVO; -import cn.iocoder.dashboard.modules.msg.dal.mysql.daoobject.sms.SmsChannelDO; -import cn.iocoder.dashboard.modules.msg.dal.mysql.daoobject.sms.SmsTemplateDO; +import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsTemplateVO; +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SmsChannelDO; +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SmsTemplateDO; import com.baomidou.mybatisplus.core.metadata.IPage; import org.mapstruct.Mapper; import org.mapstruct.Mapping; diff --git a/src/main/java/cn/iocoder/dashboard/modules/msg/dal/mysql/dao/sms/SmsChannelMapper.java b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/SmsChannelMapper.java similarity index 83% rename from src/main/java/cn/iocoder/dashboard/modules/msg/dal/mysql/dao/sms/SmsChannelMapper.java rename to src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/SmsChannelMapper.java index f7ede3502..d1ce95c62 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/msg/dal/mysql/dao/sms/SmsChannelMapper.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/SmsChannelMapper.java @@ -1,10 +1,10 @@ -package cn.iocoder.dashboard.modules.msg.dal.mysql.dao.sms; +package cn.iocoder.dashboard.modules.system.dal.mysql.dao.sms; import cn.hutool.core.util.StrUtil; import cn.iocoder.dashboard.common.enums.CommonStatusEnum; import cn.iocoder.dashboard.framework.mybatis.core.util.MyBatisUtils; -import cn.iocoder.dashboard.modules.msg.controller.sms.vo.req.SmsChannelPageReqVO; -import cn.iocoder.dashboard.modules.msg.dal.mysql.daoobject.sms.SmsChannelDO; +import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelPageReqVO; +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SmsChannelDO; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; diff --git a/src/main/java/cn/iocoder/dashboard/modules/msg/dal/mysql/dao/sms/SmsLogMapper.java b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/SmsLogMapper.java similarity index 55% rename from src/main/java/cn/iocoder/dashboard/modules/msg/dal/mysql/dao/sms/SmsLogMapper.java rename to src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/SmsLogMapper.java index 263783b47..a5dce01de 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/msg/dal/mysql/dao/sms/SmsLogMapper.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/SmsLogMapper.java @@ -1,6 +1,6 @@ -package cn.iocoder.dashboard.modules.msg.dal.mysql.dao.sms; +package cn.iocoder.dashboard.modules.system.dal.mysql.dao.sms; -import cn.iocoder.dashboard.modules.msg.dal.mysql.daoobject.sms.SmsLog; +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SmsLog; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; diff --git a/src/main/java/cn/iocoder/dashboard/modules/msg/dal/mysql/dao/sms/SmsTemplateMapper.java b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/SmsTemplateMapper.java similarity index 89% rename from src/main/java/cn/iocoder/dashboard/modules/msg/dal/mysql/dao/sms/SmsTemplateMapper.java rename to src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/SmsTemplateMapper.java index f2d2fb21b..fd941ae7a 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/msg/dal/mysql/dao/sms/SmsTemplateMapper.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/SmsTemplateMapper.java @@ -1,7 +1,7 @@ -package cn.iocoder.dashboard.modules.msg.dal.mysql.dao.sms; +package cn.iocoder.dashboard.modules.system.dal.mysql.dao.sms; import cn.iocoder.dashboard.common.enums.CommonStatusEnum; -import cn.iocoder.dashboard.modules.msg.dal.mysql.daoobject.sms.SmsTemplateDO; +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SmsTemplateDO; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; diff --git a/src/main/java/cn/iocoder/dashboard/modules/msg/dal/mysql/daoobject/sms/SmsChannelDO.java b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SmsChannelDO.java similarity index 93% rename from src/main/java/cn/iocoder/dashboard/modules/msg/dal/mysql/daoobject/sms/SmsChannelDO.java rename to src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SmsChannelDO.java index 3c0b5f396..5cce2ffa4 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/msg/dal/mysql/daoobject/sms/SmsChannelDO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SmsChannelDO.java @@ -1,4 +1,4 @@ -package cn.iocoder.dashboard.modules.msg.dal.mysql.daoobject.sms; +package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms; import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; import com.baomidou.mybatisplus.annotation.TableName; diff --git a/src/main/java/cn/iocoder/dashboard/modules/msg/dal/mysql/daoobject/sms/SmsLog.java b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SmsLog.java similarity index 93% rename from src/main/java/cn/iocoder/dashboard/modules/msg/dal/mysql/daoobject/sms/SmsLog.java rename to src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SmsLog.java index e5af0471e..169369b1e 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/msg/dal/mysql/daoobject/sms/SmsLog.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SmsLog.java @@ -1,4 +1,4 @@ -package cn.iocoder.dashboard.modules.msg.dal.mysql.daoobject.sms; +package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; diff --git a/src/main/java/cn/iocoder/dashboard/modules/msg/dal/mysql/daoobject/sms/SmsTemplateDO.java b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SmsTemplateDO.java similarity index 95% rename from src/main/java/cn/iocoder/dashboard/modules/msg/dal/mysql/daoobject/sms/SmsTemplateDO.java rename to src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SmsTemplateDO.java index 39257a71d..360999838 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/msg/dal/mysql/daoobject/sms/SmsTemplateDO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SmsTemplateDO.java @@ -1,4 +1,4 @@ -package cn.iocoder.dashboard.modules.msg.dal.mysql.daoobject.sms; +package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms; import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; import com.baomidou.mybatisplus.annotation.TableName; diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java b/src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java index 5aa257a97..05e9e6393 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java @@ -77,9 +77,11 @@ public interface SysErrorCodeConstants { // ========== 消息 1003001000 ========== - ErrorCode SMS_CHANNEL_NOT_FOUND = new ErrorCode(1003001001, "没有短信渠道信息, 请初始化sms_channel表数据。"); - ErrorCode SMS_TEMPLATE_NOT_FOUND = new ErrorCode(1003001002, "没有短信模板信息, 请初始化sms_template表数据。"); - ErrorCode SMS_SENDER_NOT_FOUND = new ErrorCode(1003001003, "没有找到对应的短信发送对象,请检查sms_channel表和sms_template表数据"); - ErrorCode INVALID_CHANNEL_CODE = new ErrorCode(1003001004, "非法的短信渠道code,请检查sms_channel表的code值是否与SmsChannelEnum中的code值一致。"); + ErrorCode SMS_CHANNEL_NOT_INIT = new ErrorCode(1003001001, + "短信渠道没有初始化, 请调用SmsClientWrapper#initSmsClient()或SmsClientWrapper#addSmsClient"); + ErrorCode SMS_CHANNEL_NOT_FOUND = new ErrorCode(1003001002, "没有短信渠道信息, 请初始化sms_channel表数据。"); + ErrorCode SMS_TEMPLATE_NOT_FOUND = new ErrorCode(1003001003, "没有短信模板信息, 请初始化sms_template表数据。"); + ErrorCode SMS_SENDER_NOT_FOUND = new ErrorCode(1003001004, "没有找到对应的短信发送对象,请检查sms_channel表和sms_template表数据"); + ErrorCode INVALID_CHANNEL_CODE = new ErrorCode(1003001005, "非法的短信渠道code,请检查sms_channel表的code值是否与SmsChannelEnum中的code值一致。"); } diff --git a/src/main/java/cn/iocoder/dashboard/modules/msg/service/sms/SmsChannelService.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SmsChannelService.java similarity index 55% rename from src/main/java/cn/iocoder/dashboard/modules/msg/service/sms/SmsChannelService.java rename to src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SmsChannelService.java index ed2c047e8..3040f3bdb 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/msg/service/sms/SmsChannelService.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SmsChannelService.java @@ -1,11 +1,11 @@ -package cn.iocoder.dashboard.modules.msg.service.sms; +package cn.iocoder.dashboard.modules.system.service.sms; import cn.iocoder.dashboard.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.msg.controller.sms.vo.SmsChannelAllVO; -import cn.iocoder.dashboard.modules.msg.controller.sms.vo.req.SmsChannelCreateReqVO; -import cn.iocoder.dashboard.modules.msg.controller.sms.vo.req.SmsChannelPageReqVO; -import cn.iocoder.dashboard.modules.msg.controller.sms.vo.resp.SmsChannelEnumRespVO; -import cn.iocoder.dashboard.modules.msg.dal.mysql.daoobject.sms.SmsChannelDO; +import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsChannelAllVO; +import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelCreateReqVO; +import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelPageReqVO; +import cn.iocoder.dashboard.modules.system.controller.sms.vo.resp.SmsChannelEnumRespVO; +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SmsChannelDO; import java.util.List; diff --git a/src/main/java/cn/iocoder/dashboard/modules/msg/service/sms/SmsLogService.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SmsLogService.java similarity index 66% rename from src/main/java/cn/iocoder/dashboard/modules/msg/service/sms/SmsLogService.java rename to src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SmsLogService.java index 70f4d9eeb..d29d7f884 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/msg/service/sms/SmsLogService.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SmsLogService.java @@ -1,4 +1,4 @@ -package cn.iocoder.dashboard.modules.msg.service.sms; +package cn.iocoder.dashboard.modules.system.service.sms; /** * 短信渠道Service接口 diff --git a/src/main/java/cn/iocoder/dashboard/modules/msg/service/sms/SmsTemplateService.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SmsTemplateService.java similarity index 67% rename from src/main/java/cn/iocoder/dashboard/modules/msg/service/sms/SmsTemplateService.java rename to src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SmsTemplateService.java index 2c1364934..585a22a57 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/msg/service/sms/SmsTemplateService.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SmsTemplateService.java @@ -1,4 +1,4 @@ -package cn.iocoder.dashboard.modules.msg.service.sms; +package cn.iocoder.dashboard.modules.system.service.sms; /** * 短信渠道Service接口 diff --git a/src/main/java/cn/iocoder/dashboard/modules/msg/service/sms/impl/SmsChannelServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsChannelServiceImpl.java similarity index 61% rename from src/main/java/cn/iocoder/dashboard/modules/msg/service/sms/impl/SmsChannelServiceImpl.java rename to src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsChannelServiceImpl.java index e5202f491..ccc47af3c 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/msg/service/sms/impl/SmsChannelServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsChannelServiceImpl.java @@ -1,21 +1,19 @@ -package cn.iocoder.dashboard.modules.msg.service.sms.impl; +package cn.iocoder.dashboard.modules.system.service.sms.impl; import cn.hutool.core.util.ObjectUtil; -import cn.hutool.extra.spring.SpringUtil; import cn.iocoder.dashboard.common.enums.SmsChannelEnum; import cn.iocoder.dashboard.common.pojo.PageResult; -import cn.iocoder.dashboard.framework.msg.sms.factory.AbstractSmsSenderFactory; -import cn.iocoder.dashboard.modules.msg.controller.sms.vo.SmsChannelAllVO; -import cn.iocoder.dashboard.modules.msg.controller.sms.vo.req.SmsChannelCreateReqVO; -import cn.iocoder.dashboard.modules.msg.controller.sms.vo.req.SmsChannelPageReqVO; -import cn.iocoder.dashboard.modules.msg.controller.sms.vo.resp.SmsChannelEnumRespVO; -import cn.iocoder.dashboard.modules.msg.convert.sms.SmsChannelConvert; -import cn.iocoder.dashboard.modules.msg.convert.sms.SmsTemplateConvert; -import cn.iocoder.dashboard.modules.msg.dal.mysql.dao.sms.SmsChannelMapper; -import cn.iocoder.dashboard.modules.msg.dal.mysql.dao.sms.SmsTemplateMapper; -import cn.iocoder.dashboard.modules.msg.dal.mysql.daoobject.sms.SmsChannelDO; -import cn.iocoder.dashboard.modules.msg.dal.mysql.daoobject.sms.SmsTemplateDO; -import cn.iocoder.dashboard.modules.msg.service.sms.SmsChannelService; +import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsChannelAllVO; +import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelCreateReqVO; +import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelPageReqVO; +import cn.iocoder.dashboard.modules.system.controller.sms.vo.resp.SmsChannelEnumRespVO; +import cn.iocoder.dashboard.modules.system.convert.sms.SmsChannelConvert; +import cn.iocoder.dashboard.modules.system.convert.sms.SmsTemplateConvert; +import cn.iocoder.dashboard.modules.system.dal.mysql.dao.sms.SmsChannelMapper; +import cn.iocoder.dashboard.modules.system.dal.mysql.dao.sms.SmsTemplateMapper; +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SmsChannelDO; +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SmsTemplateDO; +import cn.iocoder.dashboard.modules.system.service.sms.SmsChannelService; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -76,12 +74,6 @@ public class SmsChannelServiceImpl implements SmsChannelService { @Override public boolean flushChannel() { - AbstractSmsSenderFactory smsSenderFactory = SpringUtil.getBean(AbstractSmsSenderFactory.class); - if (smsSenderFactory == null) { - return false; - } - - smsSenderFactory.flush(listChannelAllEnabledInfo()); return true; } diff --git a/src/main/java/cn/iocoder/dashboard/modules/msg/service/sms/impl/SmsLogServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsLogServiceImpl.java similarity index 60% rename from src/main/java/cn/iocoder/dashboard/modules/msg/service/sms/impl/SmsLogServiceImpl.java rename to src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsLogServiceImpl.java index f7e348a4d..e54d265c6 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/msg/service/sms/impl/SmsLogServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsLogServiceImpl.java @@ -1,6 +1,6 @@ -package cn.iocoder.dashboard.modules.msg.service.sms.impl; +package cn.iocoder.dashboard.modules.system.service.sms.impl; -import cn.iocoder.dashboard.modules.msg.service.sms.SmsLogService; +import cn.iocoder.dashboard.modules.system.service.sms.SmsLogService; import org.springframework.stereotype.Service; /** diff --git a/src/main/java/cn/iocoder/dashboard/modules/msg/service/sms/impl/SmsTemplateServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsTemplateServiceImpl.java similarity index 60% rename from src/main/java/cn/iocoder/dashboard/modules/msg/service/sms/impl/SmsTemplateServiceImpl.java rename to src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsTemplateServiceImpl.java index caf6d8e1c..2826d7fca 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/msg/service/sms/impl/SmsTemplateServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsTemplateServiceImpl.java @@ -1,6 +1,6 @@ -package cn.iocoder.dashboard.modules.msg.service.sms.impl; +package cn.iocoder.dashboard.modules.system.service.sms.impl; -import cn.iocoder.dashboard.modules.msg.service.sms.SmsTemplateService; +import cn.iocoder.dashboard.modules.system.service.sms.SmsTemplateService; import org.springframework.stereotype.Service; /** diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/sms/SmsConfiguration.java b/src/main/java/cn/iocoder/dashboard/modules/system/sms/SmsConfiguration.java new file mode 100644 index 000000000..ffb5887bd --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/system/sms/SmsConfiguration.java @@ -0,0 +1,34 @@ +package cn.iocoder.dashboard.modules.system.sms; + +import cn.iocoder.dashboard.framework.sms.SmsClient; +import cn.iocoder.dashboard.framework.sms.SmsClientAdapter; +import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsChannelAllVO; +import cn.iocoder.dashboard.modules.system.service.sms.SmsChannelService; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Map; + +/** + * 短信服务配置 + * + * @author guer + */ +@Configuration +@ConditionalOnProperty("sms.enabled") +public class SmsConfiguration { + + @Resource + private SmsChannelService channelService; + + @Bean + public SmsClientAdapter smsClientWrapper() { + List smsChannelAllVOList = channelService.listChannelAllEnabledInfo(); + Map> channelId2SmsClientMap = SmsSenderUtils.init(smsChannelAllVOList); + return new SmsClientAdapter(channelId2SmsClientMap); + } + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/sms/SmsSenderUtils.java b/src/main/java/cn/iocoder/dashboard/modules/system/sms/SmsSenderUtils.java new file mode 100644 index 000000000..ea9c24489 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/system/sms/SmsSenderUtils.java @@ -0,0 +1,143 @@ +package cn.iocoder.dashboard.modules.system.sms; + +import cn.hutool.core.util.ObjectUtil; +import cn.iocoder.dashboard.common.enums.SmsChannelEnum; +import cn.iocoder.dashboard.common.exception.ServiceException; +import cn.iocoder.dashboard.framework.sms.SmsBody; +import cn.iocoder.dashboard.framework.sms.SmsClient; +import cn.iocoder.dashboard.framework.sms.SmsClientAdapter; +import cn.iocoder.dashboard.framework.sms.SmsResult; +import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsChannelAllVO; +import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsTemplateVO; +import cn.iocoder.dashboard.modules.system.sms.client.AliSmsClient; +import cn.iocoder.dashboard.modules.system.sms.proxy.SmsClientLogProxy; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + +import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; + +/** + * 短信发送者工厂 + * + * @author zzf + * @date 2021/1/25 16:18 + */ +public class SmsSenderUtils { + + /** + * 短信渠道id:短信客户端map + * key: channelId + * val: SmsClient + */ + private static final Map> smsSenderMap = new ConcurrentHashMap<>(8); + + /** + * 短信模板code: 短信渠道id map + * key: templateCode + * val: channelId + */ + private static final Map templateCode2ChannelIdMap = new HashMap<>(); + + /** + * 将短信渠道信息初始化成短信客户端 + * + * @param smsChannelAllVOList 短信渠道信息 + * @return 短信渠道id:短信客户端map + */ + public synchronized static Map> init(List smsChannelAllVOList) { + if (ObjectUtil.isEmpty(smsChannelAllVOList)) { + throw new ServiceException(SMS_CHANNEL_NOT_FOUND); + } + addSender(smsChannelAllVOList); + return smsSenderMap; + } + + /** + * 重置短信客户端信息 + * + * @param smsClientAdapter 短信客户端适配器 + * @param smsChannelAllVOList 短信渠道信息集合 + */ + public synchronized static void flush(SmsClientAdapter smsClientAdapter, List smsChannelAllVOList) { + smsSenderMap.clear(); + smsClientAdapter.flushClient(init(smsChannelAllVOList)); + } + + /** + * 发送短信 + * + * @param smsClientAdapter 短信客户端适配器 + * @param smsBody 短信内容 + * @param targetPhones 对象手机集合 + * @return 短信发送结果 + */ + public static SmsResult send(SmsClientAdapter smsClientAdapter, SmsBody smsBody, Collection targetPhones) { + Long channelId = templateCode2ChannelIdMap.get(smsBody.getCode()); + if (channelId == null) { + throw new ServiceException(SMS_SENDER_NOT_FOUND); + } + return smsClientAdapter.send(channelId, smsBody, targetPhones); + } + + /** + * 发送短信 + * + * @param smsClientAdapter 短信客户端适配器 + * @param smsBody 短信内容 + * @param targetPhone 对象手机 + * @return 短信发送结果 + */ + public static SmsResult send(SmsClientAdapter smsClientAdapter, SmsBody smsBody, String targetPhone) { + Long channelId = templateCode2ChannelIdMap.get(smsBody.getCode()); + if (channelId == null) { + throw new ServiceException(SMS_SENDER_NOT_FOUND); + } + return smsClientAdapter.send(channelId, smsBody, Collections.singletonList(targetPhone)); + } + + /** + * 发送短信 + * + * @param smsClientAdapter 短信客户端适配器 + * @param smsBody 短信内容 + * @param targetPhones 对象手机数组 + * @return 短信发送结果 + */ + public static SmsResult send(SmsClientAdapter smsClientAdapter, SmsBody smsBody, String... targetPhones) { + Long channelId = templateCode2ChannelIdMap.get(smsBody.getCode()); + if (channelId == null) { + throw new ServiceException(SMS_SENDER_NOT_FOUND); + } + return smsClientAdapter.send(channelId, smsBody, Arrays.asList(targetPhones)); + } + + + private static void addSender(List smsChannelAllVOList) { + smsChannelAllVOList.forEach(channelAllVO -> addSender(SmsChannelEnum.getByCode(channelAllVO.getCode()), channelAllVO)); + } + + private static void addSender(SmsChannelEnum channelEnum, SmsChannelAllVO channelAllVO) { + if (channelEnum == null) { + throw new ServiceException(INVALID_CHANNEL_CODE); + } + List templateList = channelAllVO.getTemplateList(); + if (ObjectUtil.isEmpty(templateList)) { + throw new ServiceException(SMS_TEMPLATE_NOT_FOUND); + } + SmsClient aliSmsClient = getSender(channelEnum, channelAllVO); + templateList.forEach(smsTemplateVO -> templateCode2ChannelIdMap.put(smsTemplateVO.getCode(), channelAllVO.getId())); + smsSenderMap.put(channelAllVO.getId(), aliSmsClient); + } + + private static SmsClient getSender(SmsChannelEnum channelEnum, SmsChannelAllVO channelAllVO) { + switch (channelEnum) { + case ALI: + return new SmsClientLogProxy<>(new AliSmsClient(channelAllVO)); + // TODO fill more channel + default: + break; + } + throw new ServiceException(SMS_SENDER_NOT_FOUND); + } +} diff --git a/src/main/java/cn/iocoder/dashboard/framework/msg/sms/impl/ali/AliSmsSender.java b/src/main/java/cn/iocoder/dashboard/modules/system/sms/client/AliSmsClient.java similarity index 81% rename from src/main/java/cn/iocoder/dashboard/framework/msg/sms/impl/ali/AliSmsSender.java rename to src/main/java/cn/iocoder/dashboard/modules/system/sms/client/AliSmsClient.java index fbf6aeceb..f144ec380 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/msg/sms/impl/ali/AliSmsSender.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/sms/client/AliSmsClient.java @@ -1,9 +1,9 @@ -package cn.iocoder.dashboard.framework.msg.sms.impl.ali; +package cn.iocoder.dashboard.modules.system.sms.client; -import cn.iocoder.dashboard.framework.msg.sms.SmsBody; -import cn.iocoder.dashboard.framework.msg.sms.SmsResult; -import cn.iocoder.dashboard.framework.msg.sms.SmsSender; -import cn.iocoder.dashboard.modules.msg.controller.sms.vo.SmsChannelAllVO; +import cn.iocoder.dashboard.framework.sms.SmsBody; +import cn.iocoder.dashboard.framework.sms.SmsClient; +import cn.iocoder.dashboard.framework.sms.SmsResult; +import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsChannelAllVO; import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.IAcsClient; import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest; @@ -23,7 +23,7 @@ import java.util.Collection; * @date 2021/1/25 14:17 */ @Slf4j -public class AliSmsSender implements SmsSender { +public class AliSmsClient implements SmsClient { private static final String OK = "OK"; @@ -42,7 +42,7 @@ public class AliSmsSender implements SmsSender { * * @param channelVO 阿里云短信配置 */ - public AliSmsSender(SmsChannelAllVO channelVO) { + public AliSmsClient(SmsChannelAllVO channelVO) { this.channelVO = channelVO; @@ -83,4 +83,9 @@ public class AliSmsSender implements SmsSender { return failResult(); } + @Override + public SmsResult sendAsync(SmsBody msgBody, Collection targets) { + return null; + } + } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/sms/proxy/SmsClientLogProxy.java b/src/main/java/cn/iocoder/dashboard/modules/system/sms/proxy/SmsClientLogProxy.java new file mode 100644 index 000000000..a7d201e6f --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/system/sms/proxy/SmsClientLogProxy.java @@ -0,0 +1,48 @@ +package cn.iocoder.dashboard.modules.system.sms.proxy; + +import cn.iocoder.dashboard.framework.sms.SmsBody; +import cn.iocoder.dashboard.framework.sms.SmsClient; +import cn.iocoder.dashboard.framework.sms.SmsResult; +import cn.iocoder.dashboard.util.json.JsonUtils; +import lombok.extern.slf4j.Slf4j; + +import java.util.Collection; + +/** + * 消息父接口 + * + * @author zzf + * @date 2021/1/22 15:46 + */ +@Slf4j +public class SmsClientLogProxy implements SmsClient { + + private final SmsClient smsClient; + + @Override + public SmsResult send(SmsBody msgBody, Collection targets) { + log.debug("ready send sms, body: {}, target: {}", JsonUtils.toJsonString(msgBody), targets); + + SmsResult resultBody = smsClient.send(msgBody, targets); + + if (resultBody.getSuccess()) { + // + } else { + log.warn("send sms fail, body: {}, target: {}, resultBody: {}", + JsonUtils.toJsonString(msgBody), + targets, + JsonUtils.toJsonString(resultBody) + ); + } + return resultBody; + } + + @Override + public SmsResult sendAsync(SmsBody msgBody, Collection targets) { + return send(msgBody, targets); + } + + public SmsClientLogProxy(SmsClient smsClient) { + this.smsClient = smsClient; + } +} From 009f33210680bb77a727636732ce23ab5c8c5fb5 Mon Sep 17 00:00:00 2001 From: zengzefeng <986510453@qq.com> Date: Mon, 1 Feb 2021 14:25:22 +0800 Subject: [PATCH 003/126] =?UTF-8?q?=E9=87=8D=E6=9E=84=E7=9F=AD=E4=BF=A1?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sql/ruoyi-vue-pro.sql | 71 --------- sql/sms.sql | 82 ++++++++++ .../dashboard/framework/sms/SmsClient.java | 107 ------------- .../framework/sms/SmsClientAdapter.java | 42 ----- .../sms/client/AbstractSmsClient.java | 32 ++++ .../sms/client/AliyunSmsClient.java} | 35 ++--- .../framework/sms/client/SmsClient.java | 25 +++ .../framework/sms/{ => core}/SmsBody.java | 10 +- .../framework/sms/core/SmsClientFactory.java | 71 +++++++++ .../framework/sms/{ => core}/SmsResult.java | 2 +- .../controller/sms/SmsChannelController.java | 6 - ...elAllVO.java => SmsChannelPropertyVO.java} | 2 +- .../controller/sms/vo/SmsTemplateVO.java | 8 + .../system/convert/sms/SmsChannelConvert.java | 4 +- .../dal/mysql/dao/sms/SmsLogMapper.java | 4 +- .../sms/{SmsLog.java => SmsLogDO.java} | 16 +- .../system/enums/SysErrorCodeConstants.java | 1 + .../system/enums/sms/SmsSendStatusEnum.java | 30 ++++ .../mq/consumer/sms/SmsSendConsumer.java | 31 ++++ .../system/mq/message/sms/SmsSendMessage.java | 25 +++ .../system/mq/producer/sms/SmsProducer.java | 31 ++++ .../system/service/sms/SmsChannelService.java | 37 ++++- .../system/service/sms/SmsLogService.java | 25 +++ .../system/service/sms/SmsService.java | 101 +++++++++++++ .../sms/impl/SmsChannelServiceImpl.java | 47 ++++-- .../service/sms/impl/SmsLogServiceImpl.java | 57 +++++++ .../service/sms/impl/SmsServiceImpl.java | 51 +++++++ .../modules/system/sms/SmsConfiguration.java | 34 ----- .../modules/system/sms/SmsSenderUtils.java | 143 ------------------ .../system/sms/proxy/SmsClientLogProxy.java | 48 ------ .../dashboard/util/string/StrUtils.java | 21 +++ 31 files changed, 701 insertions(+), 498 deletions(-) create mode 100644 sql/sms.sql delete mode 100644 src/main/java/cn/iocoder/dashboard/framework/sms/SmsClient.java delete mode 100644 src/main/java/cn/iocoder/dashboard/framework/sms/SmsClientAdapter.java create mode 100644 src/main/java/cn/iocoder/dashboard/framework/sms/client/AbstractSmsClient.java rename src/main/java/cn/iocoder/dashboard/{modules/system/sms/client/AliSmsClient.java => framework/sms/client/AliyunSmsClient.java} (73%) create mode 100644 src/main/java/cn/iocoder/dashboard/framework/sms/client/SmsClient.java rename src/main/java/cn/iocoder/dashboard/framework/sms/{ => core}/SmsBody.java (67%) create mode 100644 src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsClientFactory.java rename src/main/java/cn/iocoder/dashboard/framework/sms/{ => core}/SmsResult.java (86%) rename src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/{SmsChannelAllVO.java => SmsChannelPropertyVO.java} (94%) rename src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/{SmsLog.java => SmsLogDO.java} (73%) create mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/enums/sms/SmsSendStatusEnum.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/sms/SmsSendConsumer.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/mq/message/sms/SmsSendMessage.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/sms/SmsProducer.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SmsService.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsServiceImpl.java delete mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/sms/SmsConfiguration.java delete mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/sms/SmsSenderUtils.java delete mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/sms/proxy/SmsClientLogProxy.java diff --git a/sql/ruoyi-vue-pro.sql b/sql/ruoyi-vue-pro.sql index 9355fab64..af7f492f9 100644 --- a/sql/ruoyi-vue-pro.sql +++ b/sql/ruoyi-vue-pro.sql @@ -884,75 +884,4 @@ INSERT INTO `sys_user_role` VALUES (5, 100, 1, '', NULL, '', NULL, b'0'); INSERT INTO `sys_user_role` VALUES (6, 100, 2, '', NULL, '', NULL, b'0'); COMMIT; - --- ---------------------------- --- Table structure for sms_channel --- ---------------------------- -DROP TABLE IF EXISTS `sms_channel`; -CREATE TABLE `sms_channel` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增编号', - `code` varchar(50) not null COMMENT '编码(来自枚举类 阿里、华为、七牛等)', - `api_key` varchar(100) NOT NULL COMMENT '账号id', - `api_secret` varchar(100) NOT NULL COMMENT '账号秘钥', - `api_signature_id` varchar(100) NOT NULL COMMENT '实际渠道签名唯一标识', - `name` varchar(50) not null COMMENT '名称', - `signature` varchar(50) not null COMMENT '签名值', - `remark` varchar(200) NOT NULL COMMENT '备注', - - `status` tinyint(4) NOT NULL default 0 COMMENT '启用状态(0正常 1停用)', - `create_by` varchar(64) not null DEFAULT '' COMMENT '创建者', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_by` varchar(64) DEFAULT '' COMMENT '更新者', - `update_time` datetime DEFAULT NULL COMMENT '更新时间', - `deleted` bit(1) DEFAULT b'0' COMMENT '是否删除', - PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='短信渠道'; -/* - 优先级值一样时,按照id顺序取值 -*/ - --- ---------------------------- --- Table structure for sms_template --- ---------------------------- -DROP TABLE IF EXISTS `sms_template`; -CREATE TABLE `sms_template` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增编号', - `channel_code` varchar(50) not null COMMENT '短信渠道编码(来自枚举类)', - `channel_id` bigint(20) not null COMMENT '短信渠道id (对于前端来说就是绑定一个签名)', - `type` tinyint(4) NOT NULL default 1 COMMENT '消息类型 [0验证码 1短信通知 2推广短信 3国际/港澳台消息]', - `biz_code` varchar(50) not null COMMENT '业务编码(来自数据字典, 用户自定义业务场景 一个场景可以有多个模板)', - `code` varchar(50) not null COMMENT '编码', - `name` varchar(50) not null COMMENT '名称', - `api_template_id` varchar(100) NOT NULL COMMENT '实际渠道模板唯一标识', - `content` varchar(1000) NOT NULL DEFAULT '' COMMENT '内容', - `params` varchar(200) NOT NULL DEFAULT '' COMMENT '参数数组(自动根据内容生成)', - `remark` varchar(200) NOT NULL COMMENT '备注', - - `status` tinyint(4) NOT NULL default 0 COMMENT '启用状态(0正常 1停用)', - `create_by` varchar(64) not null DEFAULT '' COMMENT '创建者', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_by` varchar(64) DEFAULT '' COMMENT '更新者', - `update_time` datetime DEFAULT NULL COMMENT '更新时间', - `deleted` bit(1) DEFAULT b'0' COMMENT '是否删除', - PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='短信模板'; - --- ---------------------------- --- Table structure for sms_log --- ---------------------------- -DROP TABLE IF EXISTS `sms_log`; -CREATE TABLE `sms_log` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增编号', - `channel_code` varchar(50) not null COMMENT '短信渠道编码(来自枚举类)', - `api_sms_id` varchar(50) not null COMMENT '实际渠道短信唯一标识', - `template_id` bigint(20) NOT NULL COMMENT '模板id', - `phone` char(11) not null COMMENT '手机号', - `content` varchar(1000) NOT NULL DEFAULT '' COMMENT '内容', - `remark` varchar(200) NOT NULL COMMENT '备注', - `send_status` tinyint(4) NOT NULL default 0 COMMENT '发送状态(0发送中 1成功 2失败)', - `create_by` varchar(64) not null DEFAULT '' COMMENT '创建者', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='短信日志'; - SET FOREIGN_KEY_CHECKS = 1; diff --git a/sql/sms.sql b/sql/sms.sql new file mode 100644 index 000000000..82d854155 --- /dev/null +++ b/sql/sms.sql @@ -0,0 +1,82 @@ +/* + --2021.02.01 by fight, sms about table info +*/ + +-- ---------------------------- +-- Table structure for sms_channel +-- ---------------------------- +DROP TABLE IF EXISTS `sms_channel`; +CREATE TABLE `sms_channel` +( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增编号', + `code` varchar(50) NOT NULL COMMENT '编码(来自枚举类 阿里、华为、七牛等)', + `api_key` varchar(100) NOT NULL COMMENT '账号id', + `api_secret` varchar(100) NOT NULL COMMENT '账号秘钥', + `api_signature_id` varchar(100) NOT NULL COMMENT '实际渠道签名唯一标识', + `name` varchar(50) NOT NULL COMMENT '名称', + `signature` varchar(50) NOT NULL COMMENT '签名值', + `remark` varchar(200) NOT NULL COMMENT '备注', + + `status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '启用状态(0正常 1停用)', + `create_by` varchar(64) NOT NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) DEFAULT '' COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `deleted` bit(1) DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB + AUTO_INCREMENT = 1 + DEFAULT CHARSET = utf8mb4 COMMENT ='短信渠道'; +/* + 优先级值一样时,按照id顺序取值 +*/ + +-- ---------------------------- +-- Table structure for sms_template +-- ---------------------------- +DROP TABLE IF EXISTS `sms_template`; +CREATE TABLE `sms_template` +( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增编号', + `channel_code` varchar(50) NOT NULL COMMENT '短信渠道编码(来自枚举类)', + `channel_id` bigint(20) NOT NULL COMMENT '短信渠道id (对于前端来说就是绑定一个签名)', + `type` tinyint(4) NOT NULL DEFAULT 1 COMMENT '消息类型 [0验证码 1短信通知 2推广短信 3国际/港澳台消息]', + `biz_code` varchar(50) NOT NULL COMMENT '业务编码(来自数据字典, 用户自定义业务场景 一个场景可以有多个模板)', + `code` varchar(50) NOT NULL COMMENT '编码', + `name` varchar(50) NOT NULL COMMENT '名称', + `api_template_id` varchar(100) NOT NULL COMMENT '实际渠道模板唯一标识', + `content` varchar(1000) NOT NULL DEFAULT '' COMMENT '内容', + `params` varchar(200) NOT NULL DEFAULT '' COMMENT '参数数组(自动根据内容生成)', + `remark` varchar(200) NOT NULL COMMENT '备注', + + `status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '启用状态(0正常 1停用)', + `create_by` varchar(64) NOT NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) DEFAULT '' COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `deleted` bit(1) DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB + AUTO_INCREMENT = 1 + DEFAULT CHARSET = utf8mb4 COMMENT ='短信模板'; + +-- ---------------------------- +-- Table structure for sms_log +-- ---------------------------- +DROP TABLE IF EXISTS `sms_log`; +CREATE TABLE `sms_log` +( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增编号', + `channel_code` varchar(50) NOT NULL COMMENT '短信渠道编码(来自枚举类)', + `channel_id` bigint(20) NOT NULL COMMENT '短信渠道id', + `template_code` varchar(50) NOT NULL COMMENT '渠道编码', + `phones` char(11) NOT NULL COMMENT '手机号(数组json字符串)', + `content` varchar(1000) NOT NULL DEFAULT '' COMMENT '内容', + `remark` varchar(200) DEFAULT NULL COMMENT '备注', + `send_status` tinyint(4) NOT NULL DEFAULT 2 COMMENT '发送状态(1异步推送中 2发送中 3失败 4成功)', + `create_by` varchar(64) NOT NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB + AUTO_INCREMENT = 1 + DEFAULT CHARSET = utf8mb4 COMMENT ='短信日志'; diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/SmsClient.java b/src/main/java/cn/iocoder/dashboard/framework/sms/SmsClient.java deleted file mode 100644 index bf1a44f57..000000000 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/SmsClient.java +++ /dev/null @@ -1,107 +0,0 @@ -package cn.iocoder.dashboard.framework.sms; - -import org.apache.commons.lang3.StringUtils; - -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; - -/** - * 短信父接口 - * - * @author zzf - * @date 2021/1/25 14:14 - */ -public interface SmsClient { - - /** - * 发送消息 - * - * @param msgBody 消息内容 - * @param targets 发送对象列表 - * @return 是否发送成功 - */ - SmsResult send(SmsBody msgBody, Collection targets); - - /** - * 发送消息 - * - * @param msgBody 消息内容 - * @param target 发送对象 - * @return 是否发送成功 - */ - default SmsResult send(SmsBody msgBody, String target) { - if (StringUtils.isBlank(target)) { - return failResult(); - } - - return send(msgBody, Collections.singletonList(target)); - } - - /** - * 发送消息 - * - * @param msgBody 消息内容 - * @param targets 发送对象列表 - * @return 是否发送成功 - */ - default SmsResult send(SmsBody msgBody, String... targets) { - if (targets == null) { - return failResult(); - } - - return send(msgBody, Arrays.asList(targets)); - } - - - /** - * 异步发送消息 - * - * @param msgBody 消息内容 - * @param targets 发送对象列表 - * @return 是否发送成功 - */ - SmsResult sendAsync(SmsBody msgBody, Collection targets); - - /** - * 异步发送消息 - * - * @param msgBody 消息内容 - * @param target 发送对象 - * @return 是否发送成功 - */ - default SmsResult sendAsync(SmsBody msgBody, String target) { - if (StringUtils.isBlank(target)) { - return failResult("target must not null."); - } - - return sendAsync(msgBody, Collections.singletonList(target)); - } - - /** - * 异步发送消息 - * - * @param msgBody 消息内容 - * @param targets 发送对象列表 - * @return 是否发送成功 - */ - default SmsResult sendAsync(SmsBody msgBody, String... targets) { - if (targets == null) { - return failResult("targets must not null."); - } - - return sendAsync(msgBody, Arrays.asList(targets)); - } - - default SmsResult failResult() { - SmsResult resultBody = new SmsResult<>(); - resultBody.setSuccess(false); - return resultBody; - } - - default SmsResult failResult(String message) { - SmsResult resultBody = failResult(); - resultBody.setMessage(message); - return resultBody; - } -} \ No newline at end of file diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/SmsClientAdapter.java b/src/main/java/cn/iocoder/dashboard/framework/sms/SmsClientAdapter.java deleted file mode 100644 index 6edf7646f..000000000 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/SmsClientAdapter.java +++ /dev/null @@ -1,42 +0,0 @@ -package cn.iocoder.dashboard.framework.sms; - -import cn.hutool.core.util.ObjectUtil; -import cn.iocoder.dashboard.common.exception.ServiceException; - -import java.util.Collection; -import java.util.Collections; -import java.util.Map; - -import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.SMS_CHANNEL_NOT_INIT; - -/** - * 抽象短信客户端工厂 - * - * @author zzf - * @date 2021/1/28 14:01 - */ -public class SmsClientAdapter { - - private final Map> smsSenderMap; - - public SmsClientAdapter(Map> smsSenderMap) { - if (ObjectUtil.isEmpty(smsSenderMap)) { - throw new ServiceException(SMS_CHANNEL_NOT_INIT); - } - this.smsSenderMap = smsSenderMap; - } - - public void flushClient(Map> smsSenderMap) { - this.smsSenderMap.clear(); - smsSenderMap.putAll(Collections.unmodifiableMap(smsSenderMap)); - } - - public SmsResult send(Long channelId, SmsBody smsBody, Collection targetPhone) { - SmsClient smsClient = getSmsSender(channelId); - return smsClient.send(smsBody, targetPhone); - } - - private SmsClient getSmsSender(Long channelId) { - return smsSenderMap.get(channelId); - } -} diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/client/AbstractSmsClient.java b/src/main/java/cn/iocoder/dashboard/framework/sms/client/AbstractSmsClient.java new file mode 100644 index 000000000..043dd2a50 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/client/AbstractSmsClient.java @@ -0,0 +1,32 @@ +package cn.iocoder.dashboard.framework.sms.client; + +import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsChannelPropertyVO; + +/** + * 抽象短息客户端 + * + * @author zzf + * @date 2021/2/1 9:28 + */ +public abstract class AbstractSmsClient implements SmsClient { + + /** + * 短信渠道参数 + */ + protected final SmsChannelPropertyVO channelVO; + + /** + * 构造阿里云短信发送处理 + * + * @param channelVO 阿里云短信配置 + */ + public AbstractSmsClient(SmsChannelPropertyVO channelVO) { + this.channelVO = channelVO; + } + + + public SmsChannelPropertyVO getProperty() { + return channelVO; + } + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/sms/client/AliSmsClient.java b/src/main/java/cn/iocoder/dashboard/framework/sms/client/AliyunSmsClient.java similarity index 73% rename from src/main/java/cn/iocoder/dashboard/modules/system/sms/client/AliSmsClient.java rename to src/main/java/cn/iocoder/dashboard/framework/sms/client/AliyunSmsClient.java index f144ec380..39d359449 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/sms/client/AliSmsClient.java +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/client/AliyunSmsClient.java @@ -1,9 +1,8 @@ -package cn.iocoder.dashboard.modules.system.sms.client; +package cn.iocoder.dashboard.framework.sms.client; -import cn.iocoder.dashboard.framework.sms.SmsBody; -import cn.iocoder.dashboard.framework.sms.SmsClient; -import cn.iocoder.dashboard.framework.sms.SmsResult; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsChannelAllVO; +import cn.iocoder.dashboard.framework.sms.core.SmsBody; +import cn.iocoder.dashboard.framework.sms.core.SmsResult; +import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsChannelPropertyVO; import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.IAcsClient; import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest; @@ -23,7 +22,7 @@ import java.util.Collection; * @date 2021/1/25 14:17 */ @Slf4j -public class AliSmsClient implements SmsClient { +public class AliyunSmsClient extends AbstractSmsClient { private static final String OK = "OK"; @@ -33,8 +32,6 @@ public class AliSmsClient implements SmsClient { private static final String ENDPOINT = "cn-hangzhou"; - private final SmsChannelAllVO channelVO; - private final IAcsClient acsClient; /** @@ -42,9 +39,8 @@ public class AliSmsClient implements SmsClient { * * @param channelVO 阿里云短信配置 */ - public AliSmsClient(SmsChannelAllVO channelVO) { - - this.channelVO = channelVO; + public AliyunSmsClient(SmsChannelPropertyVO channelVO) { + super(channelVO); String accessKeyId = channelVO.getApiKey(); String accessKeySecret = channelVO.getApiSecret(); @@ -57,13 +53,13 @@ public class AliSmsClient implements SmsClient { @Override - public SmsResult send(SmsBody msgBody, Collection targets) { + public SmsResult send(SmsBody smsBody, Collection targets) { SendSmsRequest request = new SendSmsRequest(); request.setSysMethod(MethodType.POST); request.setPhoneNumbers(StringUtils.join(targets, ",")); request.setSignName(channelVO.getApiSignatureId()); - request.setTemplateCode(channelVO.getTemplateByTemplateCode(msgBody.getCode()).getApiTemplateId()); - request.setTemplateParam(msgBody.getParamsStr()); + request.setTemplateCode(channelVO.getTemplateByTemplateCode(smsBody.getTemplateCode()).getApiTemplateId()); + request.setTemplateParam(smsBody.getParamsStr()); try { SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request); @@ -78,14 +74,15 @@ public class AliSmsClient implements SmsClient { return resultBody; } catch (Exception e) { log.debug(e.getMessage(), e); + return failResult("发送异常: " + e.getMessage()); } - - return failResult(); } - @Override - public SmsResult sendAsync(SmsBody msgBody, Collection targets) { - return null; + SmsResult failResult(String message) { + SmsResult resultBody = new SmsResult<>(); + resultBody.setSuccess(false); + resultBody.setMessage(message); + return resultBody; } } diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/client/SmsClient.java b/src/main/java/cn/iocoder/dashboard/framework/sms/client/SmsClient.java new file mode 100644 index 000000000..290d21712 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/client/SmsClient.java @@ -0,0 +1,25 @@ +package cn.iocoder.dashboard.framework.sms.client; + +import cn.iocoder.dashboard.framework.sms.core.SmsBody; +import cn.iocoder.dashboard.framework.sms.core.SmsResult; + +import java.util.Collection; + +/** + * 短信父接口 + * + * @author zzf + * @date 2021/1/25 14:14 + */ +public interface SmsClient { + + /** + * 发送消息 + * + * @param smsBody 消息内容 + * @param targets 发送对象列表 + * @return 是否发送成功 + */ + SmsResult send(SmsBody smsBody, Collection targets); + +} \ No newline at end of file diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/SmsBody.java b/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsBody.java similarity index 67% rename from src/main/java/cn/iocoder/dashboard/framework/sms/SmsBody.java rename to src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsBody.java index 48fb2253b..9b132431e 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/SmsBody.java +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsBody.java @@ -1,9 +1,10 @@ -package cn.iocoder.dashboard.framework.sms; +package cn.iocoder.dashboard.framework.sms.core; import cn.iocoder.dashboard.util.json.JsonUtils; import lombok.Data; import java.util.Map; +import java.util.UUID; /** * 消息内容实体类 @@ -11,10 +12,15 @@ import java.util.Map; @Data public class SmsBody { + /** + * 消息日志id + */ + private Long smsLogId; + /** * 模板编码 */ - private String code; + private String templateCode; /** * 参数列表 diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsClientFactory.java b/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsClientFactory.java new file mode 100644 index 000000000..6c1eaf07c --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsClientFactory.java @@ -0,0 +1,71 @@ +package cn.iocoder.dashboard.framework.sms.core; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.iocoder.dashboard.common.enums.SmsChannelEnum; +import cn.iocoder.dashboard.common.exception.ServiceException; +import cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil; +import cn.iocoder.dashboard.framework.sms.client.AbstractSmsClient; +import cn.iocoder.dashboard.framework.sms.client.AliyunSmsClient; +import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsChannelPropertyVO; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; + +/** + * 短信客户端工厂 + * + * @author zzf + * @date 2021/1/28 14:01 + */ +@Component +public class SmsClientFactory { + + private final Map> smsSenderMap = new ConcurrentHashMap<>(8); + + /** + * 创建短信客户端 + * + * @param propertyVO 参数对象 + * @return 客户端id(默认channelId) + */ + public Long createClient(SmsChannelPropertyVO propertyVO) { + if (StrUtil.isBlank(propertyVO.getCode())) { + throw ServiceExceptionUtil.exception(PARAM_VALUE_IS_NULL, "短信渠道编码"); + } + if (ObjectUtil.isNull(propertyVO.getId())) { + throw ServiceExceptionUtil.exception(PARAM_VALUE_IS_NULL, "短信渠道ID"); + } + + AbstractSmsClient sender = createClient(SmsChannelEnum.getByCode(propertyVO.getCode()), propertyVO); + smsSenderMap.put(propertyVO.getId(), sender); + return propertyVO.getId(); + } + + private AbstractSmsClient createClient(SmsChannelEnum channelEnum, SmsChannelPropertyVO channelVO) { + if (channelEnum == null) { + throw new ServiceException(INVALID_CHANNEL_CODE); + } + switch (channelEnum) { + case ALI: + return new AliyunSmsClient(channelVO); + // TODO fill more channel + default: + break; + } + throw new ServiceException(SMS_SENDER_NOT_FOUND); + } + + /** + * 获取短信客户端 + * + * @param channelId 渠道id + * @return 短信id + */ + public AbstractSmsClient getClient(Long channelId) { + return smsSenderMap.get(channelId); + } +} diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/SmsResult.java b/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResult.java similarity index 86% rename from src/main/java/cn/iocoder/dashboard/framework/sms/SmsResult.java rename to src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResult.java index b994514b6..a626bb759 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/SmsResult.java +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResult.java @@ -1,4 +1,4 @@ -package cn.iocoder.dashboard.framework.sms; +package cn.iocoder.dashboard.framework.sms.core; import lombok.Data; diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SmsChannelController.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SmsChannelController.java index a75f9e2eb..932097514 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SmsChannelController.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SmsChannelController.java @@ -44,11 +44,5 @@ public class SmsChannelController { return success(service.createChannel(reqVO)); } - @ApiOperation("刷新消息渠道信息") - @PutMapping("/flush") - public CommonResult flushChannel() { - return success(service.flushChannel()); - } - } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/SmsChannelAllVO.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/SmsChannelPropertyVO.java similarity index 94% rename from src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/SmsChannelAllVO.java rename to src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/SmsChannelPropertyVO.java index 042cddaa2..ab4d73594 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/SmsChannelAllVO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/SmsChannelPropertyVO.java @@ -14,7 +14,7 @@ import java.util.List; */ @Data @EqualsAndHashCode -public class SmsChannelAllVO implements Serializable { +public class SmsChannelPropertyVO implements Serializable { /** * id diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/SmsTemplateVO.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/SmsTemplateVO.java index c5156a6ae..d9daf7578 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/SmsTemplateVO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/SmsTemplateVO.java @@ -17,6 +17,7 @@ public class SmsTemplateVO { * 业务编码(来自数据字典, 用户自定义业务场景 一个场景可以有多个模板) */ private String bizCode; + /** * 编码 */ @@ -27,4 +28,11 @@ public class SmsTemplateVO { */ private String apiTemplateId; + /** + * 内容 + */ + private String content; + + + } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/convert/sms/SmsChannelConvert.java b/src/main/java/cn/iocoder/dashboard/modules/system/convert/sms/SmsChannelConvert.java index af87d2253..985de7576 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/convert/sms/SmsChannelConvert.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/convert/sms/SmsChannelConvert.java @@ -2,7 +2,7 @@ package cn.iocoder.dashboard.modules.system.convert.sms; import cn.iocoder.dashboard.common.enums.SmsChannelEnum; import cn.iocoder.dashboard.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsChannelAllVO; +import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsChannelPropertyVO; import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelCreateReqVO; import cn.iocoder.dashboard.modules.system.controller.sms.vo.resp.SmsChannelEnumRespVO; import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SmsChannelDO; @@ -28,7 +28,7 @@ public interface SmsChannelConvert { List convertEnum(List bean); - List convert(List bean); + List convert(List bean); } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/SmsLogMapper.java b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/SmsLogMapper.java index a5dce01de..2e52b070e 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/SmsLogMapper.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/SmsLogMapper.java @@ -1,10 +1,10 @@ package cn.iocoder.dashboard.modules.system.dal.mysql.dao.sms; -import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SmsLog; +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SmsLogDO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; @Mapper -public interface SmsLogMapper extends BaseMapper { +public interface SmsLogMapper extends BaseMapper { } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SmsLog.java b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SmsLogDO.java similarity index 73% rename from src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SmsLog.java rename to src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SmsLogDO.java index 169369b1e..10ffef478 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SmsLog.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SmsLogDO.java @@ -3,6 +3,7 @@ package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; import java.io.Serializable; import java.util.Date; @@ -15,8 +16,9 @@ import java.util.Date; */ @Data @EqualsAndHashCode +@Accessors(chain = true) @TableName(value = "sms_log", autoResultMap = true) -public class SmsLog implements Serializable { +public class SmsLogDO implements Serializable { /** * 自增编号 @@ -29,19 +31,19 @@ public class SmsLog implements Serializable { private String channelCode; /** - * 实际渠道短信唯一标识 + * 短信渠道id */ - private String apiSmsId; + private Long channelId; /** * 模板id */ - private Long templateId; + private String templateCode; /** - * 手机号 + * 手机号(数组json字符串) */ - private String phone; + private String phones; /** * 内容 @@ -54,7 +56,7 @@ public class SmsLog implements Serializable { private String remark; /** - * 发送状态(0发送中 1成功 2失败) + * 发送状态(1异步推送中 2发送中 3失败 4成功) */ private Integer sendStatus; diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java b/src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java index 05e9e6393..a1fc081c5 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java @@ -83,5 +83,6 @@ public interface SysErrorCodeConstants { ErrorCode SMS_TEMPLATE_NOT_FOUND = new ErrorCode(1003001003, "没有短信模板信息, 请初始化sms_template表数据。"); ErrorCode SMS_SENDER_NOT_FOUND = new ErrorCode(1003001004, "没有找到对应的短信发送对象,请检查sms_channel表和sms_template表数据"); ErrorCode INVALID_CHANNEL_CODE = new ErrorCode(1003001005, "非法的短信渠道code,请检查sms_channel表的code值是否与SmsChannelEnum中的code值一致。"); + ErrorCode PARAM_VALUE_IS_NULL = new ErrorCode(1003001006, "参数【{}】不能为空"); } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/enums/sms/SmsSendStatusEnum.java b/src/main/java/cn/iocoder/dashboard/modules/system/enums/sms/SmsSendStatusEnum.java new file mode 100644 index 000000000..426e4cb80 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/system/enums/sms/SmsSendStatusEnum.java @@ -0,0 +1,30 @@ +package cn.iocoder.dashboard.modules.system.enums.sms; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 短信发送状态 + * + * @author zzf + * @date 2021/2/1 13:39 + */ +@Getter +@AllArgsConstructor +public enum SmsSendStatusEnum { + + //异步转发中 + ASYNC(1), + + //发送中 + SENDING(2), + + //失败 + FAIL(3), + + //成功 + SUCCESS(4); + + private final int status; + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/sms/SmsSendConsumer.java b/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/sms/SmsSendConsumer.java new file mode 100644 index 000000000..5da9703ca --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/sms/SmsSendConsumer.java @@ -0,0 +1,31 @@ +package cn.iocoder.dashboard.modules.system.mq.consumer.sms; + +import cn.iocoder.dashboard.framework.redis.core.pubsub.AbstractChannelMessageListener; +import cn.iocoder.dashboard.framework.sms.core.SmsResult; +import cn.iocoder.dashboard.modules.system.mq.message.dept.SysDeptRefreshMessage; +import cn.iocoder.dashboard.modules.system.mq.message.sms.SmsSendMessage; +import cn.iocoder.dashboard.modules.system.service.sms.SmsService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * 针对 {@link SysDeptRefreshMessage} 的消费者 + * + * @author 芋道源码 + */ +@Component +@Slf4j +public class SmsSendConsumer extends AbstractChannelMessageListener { + + @Resource + private SmsService smsService; + + @Override + public void onMessage(SmsSendMessage message) { + log.info("[onMessage][收到 发送短信 消息]"); + SmsResult send = smsService.send(message.getSmsBody(), message.getTargetPhones()); + } + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/sms/SmsSendMessage.java b/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/sms/SmsSendMessage.java new file mode 100644 index 000000000..8ca1207fa --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/sms/SmsSendMessage.java @@ -0,0 +1,25 @@ +package cn.iocoder.dashboard.modules.system.mq.message.sms; + +import cn.iocoder.dashboard.framework.redis.core.pubsub.ChannelMessage; +import cn.iocoder.dashboard.framework.sms.core.SmsBody; +import lombok.Data; + +import java.util.Collection; +import java.util.List; + +/** + * 部门数据刷新 Message + */ +@Data +public class SmsSendMessage implements ChannelMessage { + + private SmsBody smsBody; + + private List targetPhones; + + @Override + public String getChannel() { + return "sms.send"; + } + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/sms/SmsProducer.java b/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/sms/SmsProducer.java new file mode 100644 index 000000000..892b333cf --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/sms/SmsProducer.java @@ -0,0 +1,31 @@ +package cn.iocoder.dashboard.modules.system.mq.producer.sms; + +import cn.iocoder.dashboard.framework.redis.core.util.RedisMessageUtils; +import cn.iocoder.dashboard.framework.sms.core.SmsBody; +import cn.iocoder.dashboard.modules.system.mq.message.sms.SmsSendMessage; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 短信的 Producer + */ +@Component +public class SmsProducer { + + @Resource + private StringRedisTemplate stringRedisTemplate; + + /** + * 发送 {@link SmsSendMessage} 消息 + */ + public void sendSmsSendMessage(SmsBody smsBody, List targetPhoneList) { + SmsSendMessage message = new SmsSendMessage(); + message.setSmsBody(smsBody); + message.setTargetPhones(targetPhoneList); + RedisMessageUtils.sendChannelMessage(stringRedisTemplate, message); + } + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SmsChannelService.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SmsChannelService.java index 3040f3bdb..5fd39c2cf 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SmsChannelService.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SmsChannelService.java @@ -1,7 +1,8 @@ package cn.iocoder.dashboard.modules.system.service.sms; import cn.iocoder.dashboard.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsChannelAllVO; +import cn.iocoder.dashboard.framework.sms.client.AbstractSmsClient; +import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsChannelPropertyVO; import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelCreateReqVO; import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelPageReqVO; import cn.iocoder.dashboard.modules.system.controller.sms.vo.resp.SmsChannelEnumRespVO; @@ -17,18 +18,46 @@ import java.util.List; */ public interface SmsChannelService { + /** + * 初始化短信渠道 + */ + void initSmsClient(); + + /** + * 分页查询短信渠道信息 + * + * @param reqVO 参数对象 + * @return 短信渠道分页对象 + */ PageResult pageChannels(SmsChannelPageReqVO reqVO); + /** + * 创建新的渠道信息 + * + * @param reqVO 参数对象 + * @return 渠道id + */ Long createChannel(SmsChannelCreateReqVO reqVO); + /** + * 获取短信渠道枚举/渠道编码 + * + * @return 短信渠道枚举/渠道编码 + */ List getChannelEnums(); + /** + * 根据短信模板编码获取短信客户端 + * + * @param templateCode 短信模板编码 + * @return 短信客户端 + */ + AbstractSmsClient getClient(String templateCode); + /** * 查询渠道(包含名下模块)信息集合 * * @return 渠道(包含名下模块)信息集合 */ - List listChannelAllEnabledInfo(); - - boolean flushChannel(); + List listChannelAllEnabledInfo(); } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SmsLogService.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SmsLogService.java index d29d7f884..2646dcbfa 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SmsLogService.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SmsLogService.java @@ -1,5 +1,11 @@ package cn.iocoder.dashboard.modules.system.service.sms; +import cn.iocoder.dashboard.framework.sms.client.AbstractSmsClient; +import cn.iocoder.dashboard.framework.sms.core.SmsBody; +import cn.iocoder.dashboard.framework.sms.core.SmsResult; + +import java.util.List; + /** * 短信渠道Service接口 * @@ -7,4 +13,23 @@ package cn.iocoder.dashboard.modules.system.service.sms; * @date 2021/1/25 9:24 */ public interface SmsLogService { + /** + * 发送短信前的日志处理 + * + * @param smsBody 短信内容 + * @param targetPhones 发送对象手机号集合 + * @param client 短信客户端 + * @param isAsync 是否异步发送 + * @return 生成的日志id + */ + Long beforeSendLog(SmsBody smsBody, List targetPhones, AbstractSmsClient client, Boolean isAsync); + + /** + * 发送消息后的日志处理 + * + * @param logId 日志id + * @param result 消息结果 + */ + void afterSendLog(Long logId, SmsResult result); + } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SmsService.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SmsService.java new file mode 100644 index 000000000..56dc2dfa9 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SmsService.java @@ -0,0 +1,101 @@ +package cn.iocoder.dashboard.modules.system.service.sms; + +import cn.iocoder.dashboard.framework.sms.core.SmsBody; +import cn.iocoder.dashboard.framework.sms.core.SmsResult; +import org.apache.commons.lang3.StringUtils; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +/** + * 短信Service接口 + * + * @author zzf + * @date 2021/1/25 9:24 + */ +public interface SmsService { + + /** + * 发送消息 + * + * @param smsBody 消息内容 + * @param targetPhones 发送对象手机号列表 + * @return 是否发送成功 + */ + SmsResult send(SmsBody smsBody, List targetPhones); + + /** + * 发送消息 + * + * @param smsBody 消息内容 + * @param targetPhone 发送对象手机号 + * @return 是否发送成功 + */ + default SmsResult send(SmsBody smsBody, String targetPhone) { + if (StringUtils.isBlank(targetPhone)) { + return failResult("targetPhone must not null."); + } + + return send(smsBody, Collections.singletonList(targetPhone)); + } + + /** + * 发送消息 + * + * @param smsBody 消息内容 + * @param targetPhones 发送对象手机号数组 + * @return 是否发送成功 + */ + default SmsResult send(SmsBody smsBody, String... targetPhones) { + if (targetPhones == null) { + return failResult("targetPhones must not null."); + } + + return send(smsBody, Arrays.asList(targetPhones)); + } + + + /** + * 异步发送消息 + * + * @param msgBody 消息内容 + * @param targetPhones 发送对象列表 + */ + void sendAsync(SmsBody msgBody, List targetPhones); + + /** + * 异步发送消息 + * + * @param msgBody 消息内容 + * @param targetPhone 发送对象 + */ + default void sendAsync(SmsBody msgBody, String targetPhone) { + if (StringUtils.isBlank(targetPhone)) { + return; + } + sendAsync(msgBody, Collections.singletonList(targetPhone)); + } + + /** + * 异步发送消息 + * + * @param msgBody 消息内容 + * @param targetPhones 发送对象列表 + */ + default void sendAsync(SmsBody msgBody, String... targetPhones) { + if (targetPhones == null) { + return; + } + sendAsync(msgBody, Arrays.asList(targetPhones)); + } + + + default SmsResult failResult(String message) { + SmsResult resultBody = new SmsResult<>(); + resultBody.setSuccess(false); + resultBody.setMessage(message); + return resultBody; + } + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsChannelServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsChannelServiceImpl.java index ccc47af3c..044a4e561 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsChannelServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsChannelServiceImpl.java @@ -3,7 +3,9 @@ package cn.iocoder.dashboard.modules.system.service.sms.impl; import cn.hutool.core.util.ObjectUtil; import cn.iocoder.dashboard.common.enums.SmsChannelEnum; import cn.iocoder.dashboard.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsChannelAllVO; +import cn.iocoder.dashboard.framework.sms.client.AbstractSmsClient; +import cn.iocoder.dashboard.framework.sms.core.SmsClientFactory; +import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsChannelPropertyVO; import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelCreateReqVO; import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelPageReqVO; import cn.iocoder.dashboard.modules.system.controller.sms.vo.resp.SmsChannelEnumRespVO; @@ -14,12 +16,16 @@ import cn.iocoder.dashboard.modules.system.dal.mysql.dao.sms.SmsTemplateMapper; import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SmsChannelDO; import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SmsTemplateDO; import cn.iocoder.dashboard.modules.system.service.sms.SmsChannelService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import javax.annotation.PostConstruct; import javax.annotation.Resource; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; /** * 短信渠道Service实现类 @@ -30,6 +36,30 @@ import java.util.List; @Service public class SmsChannelServiceImpl implements SmsChannelService { + private final Map templateCode2ChannelIdMap = new ConcurrentHashMap<>(32); + + @Autowired + private SmsClientFactory smsClientFactory; + + /** + * 初始化短信客户端 + */ + @PostConstruct + @Override + public void initSmsClient() { + List smsChannelPropertyVOList = listChannelAllEnabledInfo(); + if (ObjectUtil.isEmpty(smsChannelPropertyVOList)) { + return; + } + smsChannelPropertyVOList.forEach(smsChannelPropertyVO -> { + Long clientId = smsClientFactory.createClient(smsChannelPropertyVO); + smsChannelPropertyVO.getTemplateList().forEach(smsTemplateVO -> { + templateCode2ChannelIdMap.put(smsTemplateVO.getCode(), clientId); + }); + }); + } + + @Resource private SmsChannelMapper mapper; @@ -54,12 +84,17 @@ public class SmsChannelServiceImpl implements SmsChannelService { } @Override - public List listChannelAllEnabledInfo() { + public AbstractSmsClient getClient(String templateCode) { + return smsClientFactory.getClient(templateCode2ChannelIdMap.get(templateCode)); + } + + @Override + public List listChannelAllEnabledInfo() { List channelDOList = mapper.selectEnabledList(); if (ObjectUtil.isNull(channelDOList)) { return null; } - List channelAllVOList = SmsChannelConvert.INSTANCE.convert(channelDOList); + List channelAllVOList = SmsChannelConvert.INSTANCE.convert(channelDOList); channelAllVOList.forEach(smsChannelDO -> { @@ -71,10 +106,4 @@ public class SmsChannelServiceImpl implements SmsChannelService { }); return channelAllVOList; } - - @Override - public boolean flushChannel() { - - return true; - } } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsLogServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsLogServiceImpl.java index e54d265c6..651917259 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsLogServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsLogServiceImpl.java @@ -1,8 +1,21 @@ package cn.iocoder.dashboard.modules.system.service.sms.impl; +import cn.iocoder.dashboard.framework.sms.client.AbstractSmsClient; +import cn.iocoder.dashboard.framework.sms.core.SmsBody; +import cn.iocoder.dashboard.framework.sms.core.SmsResult; +import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsChannelPropertyVO; +import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsTemplateVO; +import cn.iocoder.dashboard.modules.system.dal.mysql.dao.sms.SmsLogMapper; +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SmsLogDO; +import cn.iocoder.dashboard.modules.system.enums.sms.SmsSendStatusEnum; import cn.iocoder.dashboard.modules.system.service.sms.SmsLogService; +import cn.iocoder.dashboard.util.json.JsonUtils; +import cn.iocoder.dashboard.util.string.StrUtils; import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import java.util.List; + /** * 短信日志Service实现类 * @@ -12,4 +25,48 @@ import org.springframework.stereotype.Service; @Service public class SmsLogServiceImpl implements SmsLogService { + @Resource + private SmsLogMapper smsLogMapper; + + @Override + public Long beforeSendLog(SmsBody smsBody, List targetPhones, AbstractSmsClient client, Boolean isAsync) { + SmsLogDO smsLog = new SmsLogDO(); + if (smsBody.getSmsLogId() != null) { + smsLog.setId(smsBody.getSmsLogId()); + smsLog.setSendStatus(SmsSendStatusEnum.SENDING.getStatus()); + smsLogMapper.updateById(smsLog); + return smsBody.getSmsLogId(); + } else { + SmsChannelPropertyVO property = client.getProperty(); + SmsTemplateVO smsTemplate = property.getTemplateByTemplateCode(smsBody.getTemplateCode()); + + smsLog.setChannelCode(property.getCode()) + .setChannelId(property.getId()) + .setTemplateCode(smsTemplate.getCode()) + .setPhones(JsonUtils.toJsonString(targetPhones)) + .setContent(StrUtils.replace(smsTemplate.getContent(), smsBody.getParams())); + + if (isAsync) { + smsLog.setSendStatus(SmsSendStatusEnum.ASYNC.getStatus()); + } else { + smsLog.setSendStatus(SmsSendStatusEnum.SENDING.getStatus()); + } + smsLogMapper.insert(smsLog); + return smsLog.getId(); + } + } + + @Override + public void afterSendLog(Long logId, SmsResult result) { + SmsLogDO smsLog = new SmsLogDO(); + smsLog.setId(logId); + if (result.getSuccess()) { + smsLog.setSendStatus(SmsSendStatusEnum.SUCCESS.getStatus()); + } else { + smsLog.setSendStatus(SmsSendStatusEnum.FAIL.getStatus()); + smsLog.setRemark(result.getMessage() + JsonUtils.toJsonString(result.getResult())); + } + smsLogMapper.updateById(smsLog); + } + } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsServiceImpl.java new file mode 100644 index 000000000..4dc090242 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsServiceImpl.java @@ -0,0 +1,51 @@ +package cn.iocoder.dashboard.modules.system.service.sms.impl; + +import cn.iocoder.dashboard.framework.sms.client.AbstractSmsClient; +import cn.iocoder.dashboard.framework.sms.core.SmsBody; +import cn.iocoder.dashboard.framework.sms.core.SmsResult; +import cn.iocoder.dashboard.modules.system.mq.producer.sms.SmsProducer; +import cn.iocoder.dashboard.modules.system.service.sms.SmsChannelService; +import cn.iocoder.dashboard.modules.system.service.sms.SmsLogService; +import cn.iocoder.dashboard.modules.system.service.sms.SmsService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 短信日志Service实现类 + * + * @author zzf + * @date 2021/1/25 9:25 + */ +@Service +public class SmsServiceImpl implements SmsService { + + @Resource + private SmsChannelService channelService; + + @Resource + private SmsLogService smsLogService; + + @Resource + private SmsProducer smsProducer; + + @Override + public SmsResult send(SmsBody smsBody, List targetPhones) { + AbstractSmsClient client = channelService.getClient(smsBody.getTemplateCode()); + Long logId = smsLogService.beforeSendLog(smsBody, targetPhones, client, false); + + SmsResult result = client.send(smsBody, targetPhones); + + smsLogService.afterSendLog(logId, result); + + return result; + } + + @Override + public void sendAsync(SmsBody smsBody, List targetPhones) { + AbstractSmsClient client = channelService.getClient(smsBody.getTemplateCode()); + smsLogService.beforeSendLog(smsBody, targetPhones, client, true); + smsProducer.sendSmsSendMessage(smsBody, targetPhones); + } +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/sms/SmsConfiguration.java b/src/main/java/cn/iocoder/dashboard/modules/system/sms/SmsConfiguration.java deleted file mode 100644 index ffb5887bd..000000000 --- a/src/main/java/cn/iocoder/dashboard/modules/system/sms/SmsConfiguration.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.iocoder.dashboard.modules.system.sms; - -import cn.iocoder.dashboard.framework.sms.SmsClient; -import cn.iocoder.dashboard.framework.sms.SmsClientAdapter; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsChannelAllVO; -import cn.iocoder.dashboard.modules.system.service.sms.SmsChannelService; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Map; - -/** - * 短信服务配置 - * - * @author guer - */ -@Configuration -@ConditionalOnProperty("sms.enabled") -public class SmsConfiguration { - - @Resource - private SmsChannelService channelService; - - @Bean - public SmsClientAdapter smsClientWrapper() { - List smsChannelAllVOList = channelService.listChannelAllEnabledInfo(); - Map> channelId2SmsClientMap = SmsSenderUtils.init(smsChannelAllVOList); - return new SmsClientAdapter(channelId2SmsClientMap); - } - -} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/sms/SmsSenderUtils.java b/src/main/java/cn/iocoder/dashboard/modules/system/sms/SmsSenderUtils.java deleted file mode 100644 index ea9c24489..000000000 --- a/src/main/java/cn/iocoder/dashboard/modules/system/sms/SmsSenderUtils.java +++ /dev/null @@ -1,143 +0,0 @@ -package cn.iocoder.dashboard.modules.system.sms; - -import cn.hutool.core.util.ObjectUtil; -import cn.iocoder.dashboard.common.enums.SmsChannelEnum; -import cn.iocoder.dashboard.common.exception.ServiceException; -import cn.iocoder.dashboard.framework.sms.SmsBody; -import cn.iocoder.dashboard.framework.sms.SmsClient; -import cn.iocoder.dashboard.framework.sms.SmsClientAdapter; -import cn.iocoder.dashboard.framework.sms.SmsResult; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsChannelAllVO; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsTemplateVO; -import cn.iocoder.dashboard.modules.system.sms.client.AliSmsClient; -import cn.iocoder.dashboard.modules.system.sms.proxy.SmsClientLogProxy; - -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; - -import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; - -/** - * 短信发送者工厂 - * - * @author zzf - * @date 2021/1/25 16:18 - */ -public class SmsSenderUtils { - - /** - * 短信渠道id:短信客户端map - * key: channelId - * val: SmsClient - */ - private static final Map> smsSenderMap = new ConcurrentHashMap<>(8); - - /** - * 短信模板code: 短信渠道id map - * key: templateCode - * val: channelId - */ - private static final Map templateCode2ChannelIdMap = new HashMap<>(); - - /** - * 将短信渠道信息初始化成短信客户端 - * - * @param smsChannelAllVOList 短信渠道信息 - * @return 短信渠道id:短信客户端map - */ - public synchronized static Map> init(List smsChannelAllVOList) { - if (ObjectUtil.isEmpty(smsChannelAllVOList)) { - throw new ServiceException(SMS_CHANNEL_NOT_FOUND); - } - addSender(smsChannelAllVOList); - return smsSenderMap; - } - - /** - * 重置短信客户端信息 - * - * @param smsClientAdapter 短信客户端适配器 - * @param smsChannelAllVOList 短信渠道信息集合 - */ - public synchronized static void flush(SmsClientAdapter smsClientAdapter, List smsChannelAllVOList) { - smsSenderMap.clear(); - smsClientAdapter.flushClient(init(smsChannelAllVOList)); - } - - /** - * 发送短信 - * - * @param smsClientAdapter 短信客户端适配器 - * @param smsBody 短信内容 - * @param targetPhones 对象手机集合 - * @return 短信发送结果 - */ - public static SmsResult send(SmsClientAdapter smsClientAdapter, SmsBody smsBody, Collection targetPhones) { - Long channelId = templateCode2ChannelIdMap.get(smsBody.getCode()); - if (channelId == null) { - throw new ServiceException(SMS_SENDER_NOT_FOUND); - } - return smsClientAdapter.send(channelId, smsBody, targetPhones); - } - - /** - * 发送短信 - * - * @param smsClientAdapter 短信客户端适配器 - * @param smsBody 短信内容 - * @param targetPhone 对象手机 - * @return 短信发送结果 - */ - public static SmsResult send(SmsClientAdapter smsClientAdapter, SmsBody smsBody, String targetPhone) { - Long channelId = templateCode2ChannelIdMap.get(smsBody.getCode()); - if (channelId == null) { - throw new ServiceException(SMS_SENDER_NOT_FOUND); - } - return smsClientAdapter.send(channelId, smsBody, Collections.singletonList(targetPhone)); - } - - /** - * 发送短信 - * - * @param smsClientAdapter 短信客户端适配器 - * @param smsBody 短信内容 - * @param targetPhones 对象手机数组 - * @return 短信发送结果 - */ - public static SmsResult send(SmsClientAdapter smsClientAdapter, SmsBody smsBody, String... targetPhones) { - Long channelId = templateCode2ChannelIdMap.get(smsBody.getCode()); - if (channelId == null) { - throw new ServiceException(SMS_SENDER_NOT_FOUND); - } - return smsClientAdapter.send(channelId, smsBody, Arrays.asList(targetPhones)); - } - - - private static void addSender(List smsChannelAllVOList) { - smsChannelAllVOList.forEach(channelAllVO -> addSender(SmsChannelEnum.getByCode(channelAllVO.getCode()), channelAllVO)); - } - - private static void addSender(SmsChannelEnum channelEnum, SmsChannelAllVO channelAllVO) { - if (channelEnum == null) { - throw new ServiceException(INVALID_CHANNEL_CODE); - } - List templateList = channelAllVO.getTemplateList(); - if (ObjectUtil.isEmpty(templateList)) { - throw new ServiceException(SMS_TEMPLATE_NOT_FOUND); - } - SmsClient aliSmsClient = getSender(channelEnum, channelAllVO); - templateList.forEach(smsTemplateVO -> templateCode2ChannelIdMap.put(smsTemplateVO.getCode(), channelAllVO.getId())); - smsSenderMap.put(channelAllVO.getId(), aliSmsClient); - } - - private static SmsClient getSender(SmsChannelEnum channelEnum, SmsChannelAllVO channelAllVO) { - switch (channelEnum) { - case ALI: - return new SmsClientLogProxy<>(new AliSmsClient(channelAllVO)); - // TODO fill more channel - default: - break; - } - throw new ServiceException(SMS_SENDER_NOT_FOUND); - } -} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/sms/proxy/SmsClientLogProxy.java b/src/main/java/cn/iocoder/dashboard/modules/system/sms/proxy/SmsClientLogProxy.java deleted file mode 100644 index a7d201e6f..000000000 --- a/src/main/java/cn/iocoder/dashboard/modules/system/sms/proxy/SmsClientLogProxy.java +++ /dev/null @@ -1,48 +0,0 @@ -package cn.iocoder.dashboard.modules.system.sms.proxy; - -import cn.iocoder.dashboard.framework.sms.SmsBody; -import cn.iocoder.dashboard.framework.sms.SmsClient; -import cn.iocoder.dashboard.framework.sms.SmsResult; -import cn.iocoder.dashboard.util.json.JsonUtils; -import lombok.extern.slf4j.Slf4j; - -import java.util.Collection; - -/** - * 消息父接口 - * - * @author zzf - * @date 2021/1/22 15:46 - */ -@Slf4j -public class SmsClientLogProxy implements SmsClient { - - private final SmsClient smsClient; - - @Override - public SmsResult send(SmsBody msgBody, Collection targets) { - log.debug("ready send sms, body: {}, target: {}", JsonUtils.toJsonString(msgBody), targets); - - SmsResult resultBody = smsClient.send(msgBody, targets); - - if (resultBody.getSuccess()) { - // - } else { - log.warn("send sms fail, body: {}, target: {}, resultBody: {}", - JsonUtils.toJsonString(msgBody), - targets, - JsonUtils.toJsonString(resultBody) - ); - } - return resultBody; - } - - @Override - public SmsResult sendAsync(SmsBody msgBody, Collection targets) { - return send(msgBody, targets); - } - - public SmsClientLogProxy(SmsClient smsClient) { - this.smsClient = smsClient; - } -} diff --git a/src/main/java/cn/iocoder/dashboard/util/string/StrUtils.java b/src/main/java/cn/iocoder/dashboard/util/string/StrUtils.java index 5e98d915b..e0ca605a4 100644 --- a/src/main/java/cn/iocoder/dashboard/util/string/StrUtils.java +++ b/src/main/java/cn/iocoder/dashboard/util/string/StrUtils.java @@ -1,7 +1,10 @@ package cn.iocoder.dashboard.util.string; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import java.util.Map; + /** * 字符串工具类 * @@ -13,4 +16,22 @@ public class StrUtils { return StrUtil.maxLength(str, maxLength - 3); // -3 的原因,是该方法会补充 ... 恰好 } + /** + * 指定字符串的 + * @param str + * @param replaceMap + * @return + */ + public static String replace(String str, Map replaceMap) { + assert StrUtil.isNotBlank(str); + if (ObjectUtil.isEmpty(replaceMap)) { + return str; + } + String result = null; + for (String key : replaceMap.keySet()) { + result = str.replace(key, replaceMap.get(key)); + } + return result; + } + } From 0fd757fbbd74b3e068012c25b1b9cdbf4ba14445 Mon Sep 17 00:00:00 2001 From: zengzefeng <986510453@qq.com> Date: Thu, 4 Feb 2021 09:42:50 +0800 Subject: [PATCH 004/126] =?UTF-8?q?=E5=A2=9E=E5=8A=A0SmsProperty=E7=B1=BB?= =?UTF-8?q?=EF=BC=8C=E8=A7=A3=E9=99=A4smsFactory=E5=AF=B9module=E5=B1=82vo?= =?UTF-8?q?=E7=B1=BB=E7=9A=84=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sms/client/AbstractSmsClient.java | 12 ++-- .../framework/sms/client/AliyunSmsClient.java | 4 +- .../framework/sms/core/SmsClientFactory.java | 6 +- .../sms/core/property/SmsChannelProperty.java | 58 +++++++++++++++++++ .../core/property/SmsTemplateProperty.java | 38 ++++++++++++ ...elPropertyVO.java => SmsChannelAllVO.java} | 2 +- .../system/convert/sms/SmsChannelConvert.java | 9 ++- .../system/service/sms/SmsChannelService.java | 4 +- .../sms/impl/SmsChannelServiceImpl.java | 18 +++--- .../service/sms/impl/SmsLogServiceImpl.java | 4 +- 10 files changed, 128 insertions(+), 27 deletions(-) create mode 100644 src/main/java/cn/iocoder/dashboard/framework/sms/core/property/SmsChannelProperty.java create mode 100644 src/main/java/cn/iocoder/dashboard/framework/sms/core/property/SmsTemplateProperty.java rename src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/{SmsChannelPropertyVO.java => SmsChannelAllVO.java} (94%) diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/client/AbstractSmsClient.java b/src/main/java/cn/iocoder/dashboard/framework/sms/client/AbstractSmsClient.java index 043dd2a50..0b4907fa2 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/client/AbstractSmsClient.java +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/client/AbstractSmsClient.java @@ -1,6 +1,6 @@ package cn.iocoder.dashboard.framework.sms.client; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsChannelPropertyVO; +import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperty; /** * 抽象短息客户端 @@ -13,19 +13,19 @@ public abstract class AbstractSmsClient implements SmsClient { /** * 短信渠道参数 */ - protected final SmsChannelPropertyVO channelVO; + protected final SmsChannelProperty channelVO; /** * 构造阿里云短信发送处理 * - * @param channelVO 阿里云短信配置 + * @param property 阿里云短信配置 */ - public AbstractSmsClient(SmsChannelPropertyVO channelVO) { - this.channelVO = channelVO; + public AbstractSmsClient(SmsChannelProperty property) { + this.channelVO = property; } - public SmsChannelPropertyVO getProperty() { + public SmsChannelProperty getProperty() { return channelVO; } diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/client/AliyunSmsClient.java b/src/main/java/cn/iocoder/dashboard/framework/sms/client/AliyunSmsClient.java index 39d359449..4a2ee6d70 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/client/AliyunSmsClient.java +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/client/AliyunSmsClient.java @@ -2,7 +2,7 @@ package cn.iocoder.dashboard.framework.sms.client; import cn.iocoder.dashboard.framework.sms.core.SmsBody; import cn.iocoder.dashboard.framework.sms.core.SmsResult; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsChannelPropertyVO; +import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperty; import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.IAcsClient; import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest; @@ -39,7 +39,7 @@ public class AliyunSmsClient extends AbstractSmsClient { * * @param channelVO 阿里云短信配置 */ - public AliyunSmsClient(SmsChannelPropertyVO channelVO) { + public AliyunSmsClient(SmsChannelProperty channelVO) { super(channelVO); String accessKeyId = channelVO.getApiKey(); diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsClientFactory.java b/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsClientFactory.java index 6c1eaf07c..35f87bb98 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsClientFactory.java +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsClientFactory.java @@ -7,7 +7,7 @@ import cn.iocoder.dashboard.common.exception.ServiceException; import cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil; import cn.iocoder.dashboard.framework.sms.client.AbstractSmsClient; import cn.iocoder.dashboard.framework.sms.client.AliyunSmsClient; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsChannelPropertyVO; +import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperty; import org.springframework.stereotype.Component; import java.util.Map; @@ -32,7 +32,7 @@ public class SmsClientFactory { * @param propertyVO 参数对象 * @return 客户端id(默认channelId) */ - public Long createClient(SmsChannelPropertyVO propertyVO) { + public Long createClient(SmsChannelProperty propertyVO) { if (StrUtil.isBlank(propertyVO.getCode())) { throw ServiceExceptionUtil.exception(PARAM_VALUE_IS_NULL, "短信渠道编码"); } @@ -45,7 +45,7 @@ public class SmsClientFactory { return propertyVO.getId(); } - private AbstractSmsClient createClient(SmsChannelEnum channelEnum, SmsChannelPropertyVO channelVO) { + private AbstractSmsClient createClient(SmsChannelEnum channelEnum, SmsChannelProperty channelVO) { if (channelEnum == null) { throw new ServiceException(INVALID_CHANNEL_CODE); } diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/core/property/SmsChannelProperty.java b/src/main/java/cn/iocoder/dashboard/framework/sms/core/property/SmsChannelProperty.java new file mode 100644 index 000000000..402b0d7e7 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/core/property/SmsChannelProperty.java @@ -0,0 +1,58 @@ +package cn.iocoder.dashboard.framework.sms.core.property; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.List; + +/** + * 渠道(包含模板)信息VO类 + * + * @author zzf + * @date 2021/1/25 17:01 + */ +@Data +@EqualsAndHashCode +public class SmsChannelProperty implements Serializable { + + /** + * id + */ + private Long id; + + /** + * 编码(来自枚举类 阿里、华为、七牛等) + */ + private String code; + + /** + * 渠道账号id + */ + private String apiKey; + + /** + * 渠道账号秘钥 + */ + private String apiSecret; + + /** + * 实际渠道签名唯一标识 + */ + private String apiSignatureId; + + /** + * 签名值 + */ + private String signature; + + /** + * 该渠道名下的短信模板集合 + */ + private List templateList; + + public SmsTemplateProperty getTemplateByTemplateCode(String tempCode) { + return templateList.stream().filter(s -> s.getCode().equals(tempCode)).findFirst().get(); + } + +} diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/core/property/SmsTemplateProperty.java b/src/main/java/cn/iocoder/dashboard/framework/sms/core/property/SmsTemplateProperty.java new file mode 100644 index 000000000..8cfb20ba6 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/core/property/SmsTemplateProperty.java @@ -0,0 +1,38 @@ +package cn.iocoder.dashboard.framework.sms.core.property; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 渠道模板VO类 + * + * @author zzf + * @date 2021/1/25 17:03 + */ +@Data +@EqualsAndHashCode +public class SmsTemplateProperty { + + /** + * 业务编码(来自数据字典, 用户自定义业务场景 一个场景可以有多个模板) + */ + private String bizCode; + + /** + * 编码 + */ + private String code; + + /** + * 实际渠道模板唯一标识 + */ + private String apiTemplateId; + + /** + * 内容 + */ + private String content; + + + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/SmsChannelPropertyVO.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/SmsChannelAllVO.java similarity index 94% rename from src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/SmsChannelPropertyVO.java rename to src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/SmsChannelAllVO.java index ab4d73594..042cddaa2 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/SmsChannelPropertyVO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/SmsChannelAllVO.java @@ -14,7 +14,7 @@ import java.util.List; */ @Data @EqualsAndHashCode -public class SmsChannelPropertyVO implements Serializable { +public class SmsChannelAllVO implements Serializable { /** * id diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/convert/sms/SmsChannelConvert.java b/src/main/java/cn/iocoder/dashboard/modules/system/convert/sms/SmsChannelConvert.java index 985de7576..b52167ef7 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/convert/sms/SmsChannelConvert.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/convert/sms/SmsChannelConvert.java @@ -2,11 +2,12 @@ package cn.iocoder.dashboard.modules.system.convert.sms; import cn.iocoder.dashboard.common.enums.SmsChannelEnum; import cn.iocoder.dashboard.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsChannelPropertyVO; +import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperty; +import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsChannelAllVO; import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelCreateReqVO; import cn.iocoder.dashboard.modules.system.controller.sms.vo.resp.SmsChannelEnumRespVO; -import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SmsChannelDO; import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserUpdateReqVO; +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SmsChannelDO; import com.baomidou.mybatisplus.core.metadata.IPage; import org.mapstruct.Mapper; import org.mapstruct.Mapping; @@ -28,7 +29,9 @@ public interface SmsChannelConvert { List convertEnum(List bean); - List convert(List bean); + List convert(List bean); + + List convertProperty(List list); } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SmsChannelService.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SmsChannelService.java index 5fd39c2cf..f30ea2b88 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SmsChannelService.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SmsChannelService.java @@ -2,7 +2,7 @@ package cn.iocoder.dashboard.modules.system.service.sms; import cn.iocoder.dashboard.common.pojo.PageResult; import cn.iocoder.dashboard.framework.sms.client.AbstractSmsClient; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsChannelPropertyVO; +import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsChannelAllVO; import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelCreateReqVO; import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelPageReqVO; import cn.iocoder.dashboard.modules.system.controller.sms.vo.resp.SmsChannelEnumRespVO; @@ -59,5 +59,5 @@ public interface SmsChannelService { * * @return 渠道(包含名下模块)信息集合 */ - List listChannelAllEnabledInfo(); + List listChannelAllEnabledInfo(); } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsChannelServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsChannelServiceImpl.java index 044a4e561..db36b86f4 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsChannelServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsChannelServiceImpl.java @@ -5,7 +5,8 @@ import cn.iocoder.dashboard.common.enums.SmsChannelEnum; import cn.iocoder.dashboard.common.pojo.PageResult; import cn.iocoder.dashboard.framework.sms.client.AbstractSmsClient; import cn.iocoder.dashboard.framework.sms.core.SmsClientFactory; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsChannelPropertyVO; +import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperty; +import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsChannelAllVO; import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelCreateReqVO; import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelPageReqVO; import cn.iocoder.dashboard.modules.system.controller.sms.vo.resp.SmsChannelEnumRespVO; @@ -47,13 +48,14 @@ public class SmsChannelServiceImpl implements SmsChannelService { @PostConstruct @Override public void initSmsClient() { - List smsChannelPropertyVOList = listChannelAllEnabledInfo(); - if (ObjectUtil.isEmpty(smsChannelPropertyVOList)) { + List smsChannelAllVOList = listChannelAllEnabledInfo(); + if (ObjectUtil.isEmpty(smsChannelAllVOList)) { return; } - smsChannelPropertyVOList.forEach(smsChannelPropertyVO -> { - Long clientId = smsClientFactory.createClient(smsChannelPropertyVO); - smsChannelPropertyVO.getTemplateList().forEach(smsTemplateVO -> { + List channelPropertyList = SmsChannelConvert.INSTANCE.convertProperty(smsChannelAllVOList); + channelPropertyList.forEach(smsChannelProperty -> { + Long clientId = smsClientFactory.createClient(smsChannelProperty); + smsChannelProperty.getTemplateList().forEach(smsTemplateVO -> { templateCode2ChannelIdMap.put(smsTemplateVO.getCode(), clientId); }); }); @@ -89,12 +91,12 @@ public class SmsChannelServiceImpl implements SmsChannelService { } @Override - public List listChannelAllEnabledInfo() { + public List listChannelAllEnabledInfo() { List channelDOList = mapper.selectEnabledList(); if (ObjectUtil.isNull(channelDOList)) { return null; } - List channelAllVOList = SmsChannelConvert.INSTANCE.convert(channelDOList); + List channelAllVOList = SmsChannelConvert.INSTANCE.convert(channelDOList); channelAllVOList.forEach(smsChannelDO -> { diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsLogServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsLogServiceImpl.java index 651917259..5853463e8 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsLogServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsLogServiceImpl.java @@ -3,7 +3,7 @@ package cn.iocoder.dashboard.modules.system.service.sms.impl; import cn.iocoder.dashboard.framework.sms.client.AbstractSmsClient; import cn.iocoder.dashboard.framework.sms.core.SmsBody; import cn.iocoder.dashboard.framework.sms.core.SmsResult; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsChannelPropertyVO; +import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsChannelAllVO; import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsTemplateVO; import cn.iocoder.dashboard.modules.system.dal.mysql.dao.sms.SmsLogMapper; import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SmsLogDO; @@ -37,7 +37,7 @@ public class SmsLogServiceImpl implements SmsLogService { smsLogMapper.updateById(smsLog); return smsBody.getSmsLogId(); } else { - SmsChannelPropertyVO property = client.getProperty(); + SmsChannelAllVO property = client.getProperty(); SmsTemplateVO smsTemplate = property.getTemplateByTemplateCode(smsBody.getTemplateCode()); smsLog.setChannelCode(property.getCode()) From a50db6bf7ff76dc3b323adedea3ef9ab979b3cd6 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 22 Feb 2021 09:44:31 +0800 Subject: [PATCH 005/126] =?UTF-8?q?=E7=9F=AD=E4=BF=A1=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E7=9A=84=20code=20review=202020-02-22?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/iocoder/dashboard/common/enums/SmsChannelEnum.java | 7 +++++-- .../dashboard/framework/sms/client/AliyunSmsClient.java | 2 +- .../dashboard/framework/sms/core/SmsClientFactory.java | 1 + .../cn/iocoder/dashboard/framework/sms/core/SmsResult.java | 4 ++-- .../framework/sms/core/property/SmsTemplateProperty.java | 2 +- .../modules/system/mq/producer/sms/SmsProducer.java | 1 + .../modules/system/service/sms/SmsChannelService.java | 3 +++ .../modules/system/service/sms/SmsLogService.java | 2 ++ .../system/service/sms/impl/SmsChannelServiceImpl.java | 2 +- .../modules/system/service/sms/impl/SmsServiceImpl.java | 1 + 10 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/main/java/cn/iocoder/dashboard/common/enums/SmsChannelEnum.java b/src/main/java/cn/iocoder/dashboard/common/enums/SmsChannelEnum.java index fdb80387d..0e6fb6602 100644 --- a/src/main/java/cn/iocoder/dashboard/common/enums/SmsChannelEnum.java +++ b/src/main/java/cn/iocoder/dashboard/common/enums/SmsChannelEnum.java @@ -3,8 +3,11 @@ package cn.iocoder.dashboard.common.enums; import lombok.AllArgsConstructor; import lombok.Getter; +import java.util.function.Predicate; +import java.util.stream.Stream; + /** - * 短信渠道枚举 + * 短信渠道枚举 TODO FROM 芋艿 TO zzf:属于短信的枚举类,可以放到 framework/sms 下 * * @author zzf * @date 2021/1/25 10:56 @@ -16,7 +19,7 @@ public enum SmsChannelEnum { ALI("ALI", "阿里"), HUA_WEI("HUA_WEI", "华为"), QI_NIU("QI_NIU", "七牛"), - TEN_XUN("TEN_XUN", "腾讯"); + TEN_XUN("TEN_XUN", "腾讯"); // TODO FROM 芋艿 to zzf:TEN 有后鼻音哈,要被马爸爸打了。。。 private final String code; diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/client/AliyunSmsClient.java b/src/main/java/cn/iocoder/dashboard/framework/sms/client/AliyunSmsClient.java index 4a2ee6d70..60f12f575 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/client/AliyunSmsClient.java +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/client/AliyunSmsClient.java @@ -60,7 +60,7 @@ public class AliyunSmsClient extends AbstractSmsClient { request.setSignName(channelVO.getApiSignatureId()); request.setTemplateCode(channelVO.getTemplateByTemplateCode(smsBody.getTemplateCode()).getApiTemplateId()); request.setTemplateParam(smsBody.getParamsStr()); - + // TODO FROM 芋艿 TO zzf:try catch 咱是不是可以交给 abstract 来做。这样,异常处理,重试,限流等等,都可以酱紫 try { SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request); diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsClientFactory.java b/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsClientFactory.java index 35f87bb98..68864db11 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsClientFactory.java +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsClientFactory.java @@ -33,6 +33,7 @@ public class SmsClientFactory { * @return 客户端id(默认channelId) */ public Long createClient(SmsChannelProperty propertyVO) { + // TODO FROM 芋艿 TO zzf:参数的校验,可以考虑统一使用 validation。 if (StrUtil.isBlank(propertyVO.getCode())) { throw ServiceExceptionUtil.exception(PARAM_VALUE_IS_NULL, "短信渠道编码"); } diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResult.java b/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResult.java index a626bb759..101a1af4a 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResult.java +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResult.java @@ -13,7 +13,7 @@ public class SmsResult implements Serializable { /** * 是否成功 */ - private Boolean success; + private Boolean success; // TODO FROM 芋艿 to zzf:未来要加一个 code,将不同平台的短信失败的情况,做一次统一的收敛。 /** * 提示 @@ -23,5 +23,5 @@ public class SmsResult implements Serializable { /** * 返回值 */ - private T result; + private T result; // TODO FROM 芋艿 to zzf:是不是统一各个平台的返回结果,这样对调用方来说统一。因为作为统一的短信客户端,最好让上层不太需要知道太具体。黑河诶 } diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/core/property/SmsTemplateProperty.java b/src/main/java/cn/iocoder/dashboard/framework/sms/core/property/SmsTemplateProperty.java index 8cfb20ba6..aa0a8c461 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/core/property/SmsTemplateProperty.java +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/core/property/SmsTemplateProperty.java @@ -4,7 +4,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; /** - * 渠道模板VO类 + * 渠道模板VO类 TODO FROM 芋艿 TO zzf:模板是不是不要提供到 client 里面,而是交给 factory 统一维护就好。不然,模板修改时候,刷新 client 会比较麻烦。 * * @author zzf * @date 2021/1/25 17:03 diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/sms/SmsProducer.java b/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/sms/SmsProducer.java index 892b333cf..c758a4a15 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/sms/SmsProducer.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/sms/SmsProducer.java @@ -25,6 +25,7 @@ public class SmsProducer { SmsSendMessage message = new SmsSendMessage(); message.setSmsBody(smsBody); message.setTargetPhones(targetPhoneList); + // TODO FROM 芋艿 TO ZZF:这块等未来改哈。这个方法目前是广播消费,会导致每个节点都发送一次。等后续封装出 redis stream 消息 RedisMessageUtils.sendChannelMessage(stringRedisTemplate, message); } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SmsChannelService.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SmsChannelService.java index f30ea2b88..5cb34a24e 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SmsChannelService.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SmsChannelService.java @@ -18,6 +18,9 @@ import java.util.List; */ public interface SmsChannelService { + // TODO FROM 芋艿 to ZZF:SmsChannelService=》SysSmsChannelService,增加 Sys 前缀,算在系统模块里 + // TODO FROM 芋艿 to ZZF:方法名,保持不去掉 Sms 前缀。虽然长点,嘿嘿 + /** * 初始化短信渠道 */ diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SmsLogService.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SmsLogService.java index 2646dcbfa..bbc50773f 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SmsLogService.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SmsLogService.java @@ -22,6 +22,8 @@ public interface SmsLogService { * @param isAsync 是否异步发送 * @return 生成的日志id */ + // TODO FROM 芋艿 to ZZF: async 是针对发送的方式,对于日志不一定需要关心。这样,短信日志,实际就发送前插入,发送后更新结果 + // TODO FROM 芋艿 to ZZF:短信日志,群发的情况,应该是每个手机一条哈。虽然是群发,但是可能部分成功,部分失败;对应到短信平台,实际也是多条。 Long beforeSendLog(SmsBody smsBody, List targetPhones, AbstractSmsClient client, Boolean isAsync); /** diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsChannelServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsChannelServiceImpl.java index db36b86f4..1bc8f7136 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsChannelServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsChannelServiceImpl.java @@ -61,7 +61,7 @@ public class SmsChannelServiceImpl implements SmsChannelService { }); } - + // TODO FROM 芋艿 to ZZF:channelMapper 嘿,保持命名统一。 @Resource private SmsChannelMapper mapper; diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsServiceImpl.java index 4dc090242..999649b8f 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsServiceImpl.java @@ -42,6 +42,7 @@ public class SmsServiceImpl implements SmsService { return result; } + // TODO FROM 芋艿 to ZZF:可能要讨论下,对于短信发送来说,貌似只提供异步发送即可。对于业务来说,一定不能依赖短信的发送结果。 @Override public void sendAsync(SmsBody smsBody, List targetPhones) { AbstractSmsClient client = channelService.getClient(smsBody.getTemplateCode()); From b4be8e987a3dfbee6a830ff90733de7cf6d29f6c Mon Sep 17 00:00:00 2001 From: zengzefeng <986510453@qq.com> Date: Tue, 23 Feb 2021 15:33:05 +0800 Subject: [PATCH 006/126] =?UTF-8?q?=E4=B8=B4=E6=97=B6=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sms/client/AbstractSmsClient.java | 47 +++++++++++- .../framework/sms/client/AliyunSmsClient.java | 51 +++++++------ .../framework/sms/client/SmsClient.java | 11 +-- .../framework/sms/core/SmsClientFactory.java | 65 +++++++++++++---- .../framework/sms/core/SmsResult.java | 15 +++- .../framework/sms/core/SmsResultDetail.java | 33 +++++++++ .../sms/core}/enums/SmsChannelEnum.java | 9 +-- .../sms/core/property/SmsChannelProperty.java | 17 ++--- .../core/property/SmsTemplateProperty.java | 17 ++++- .../controller/sms/SmsChannelController.java | 14 ++-- .../system/convert/sms/SmsChannelConvert.java | 14 ++-- .../convert/sms/SmsTemplateConvert.java | 10 +-- .../dal/mysql/dao/sms/SmsTemplateMapper.java | 39 ---------- ...elMapper.java => SysSmsChannelMapper.java} | 20 ++--- ...SmsLogMapper.java => SysSmsLogMapper.java} | 4 +- .../mysql/dao/sms/SysSmsTemplateMapper.java | 39 ++++++++++ ...SmsChannelDO.java => SysSmsChannelDO.java} | 2 +- .../sms/{SmsLogDO.java => SysSmsLogDO.java} | 2 +- ...sTemplateDO.java => SysSmsTemplateDO.java} | 2 +- .../mq/consumer/sms/SmsSendConsumer.java | 6 +- ...Service.java => SysSmsChannelService.java} | 22 ++++-- ...sLogService.java => SysSmsLogService.java} | 10 ++- .../{SmsService.java => SysSmsService.java} | 12 +-- ...ervice.java => SysSmsTemplateService.java} | 2 +- .../service/sms/impl/SmsServiceImpl.java | 52 ------------- ...mpl.java => SysSmsChannelServiceImpl.java} | 73 +++++++++++-------- ...iceImpl.java => SysSmsLogServiceImpl.java} | 35 ++++----- .../service/sms/impl/SysSmsServiceImpl.java | 54 ++++++++++++++ ...pl.java => SysSmsTemplateServiceImpl.java} | 4 +- 29 files changed, 418 insertions(+), 263 deletions(-) create mode 100644 src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResultDetail.java rename src/main/java/cn/iocoder/dashboard/{common => framework/sms/core}/enums/SmsChannelEnum.java (70%) delete mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/SmsTemplateMapper.java rename src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/{SmsChannelMapper.java => SysSmsChannelMapper.java} (56%) rename src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/{SmsLogMapper.java => SysSmsLogMapper.java} (74%) create mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/SysSmsTemplateMapper.java rename src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/{SmsChannelDO.java => SysSmsChannelDO.java} (95%) rename src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/{SmsLogDO.java => SysSmsLogDO.java} (95%) rename src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/{SmsTemplateDO.java => SysSmsTemplateDO.java} (96%) rename src/main/java/cn/iocoder/dashboard/modules/system/service/sms/{SmsChannelService.java => SysSmsChannelService.java} (73%) rename src/main/java/cn/iocoder/dashboard/modules/system/service/sms/{SmsLogService.java => SysSmsLogService.java} (79%) rename src/main/java/cn/iocoder/dashboard/modules/system/service/sms/{SmsService.java => SysSmsService.java} (86%) rename src/main/java/cn/iocoder/dashboard/modules/system/service/sms/{SmsTemplateService.java => SysSmsTemplateService.java} (77%) delete mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsServiceImpl.java rename src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/{SmsChannelServiceImpl.java => SysSmsChannelServiceImpl.java} (50%) rename src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/{SmsLogServiceImpl.java => SysSmsLogServiceImpl.java} (60%) create mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsServiceImpl.java rename src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/{SmsTemplateServiceImpl.java => SysSmsTemplateServiceImpl.java} (57%) diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/client/AbstractSmsClient.java b/src/main/java/cn/iocoder/dashboard/framework/sms/client/AbstractSmsClient.java index 0b4907fa2..14ef40d2c 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/client/AbstractSmsClient.java +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/client/AbstractSmsClient.java @@ -1,6 +1,11 @@ package cn.iocoder.dashboard.framework.sms.client; +import cn.iocoder.dashboard.framework.sms.core.SmsBody; +import cn.iocoder.dashboard.framework.sms.core.SmsResult; import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperty; +import lombok.extern.slf4j.Slf4j; + +import java.util.Collection; /** * 抽象短息客户端 @@ -8,7 +13,8 @@ import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperty; * @author zzf * @date 2021/2/1 9:28 */ -public abstract class AbstractSmsClient implements SmsClient { +@Slf4j +public abstract class AbstractSmsClient implements SmsClient { /** * 短信渠道参数 @@ -29,4 +35,43 @@ public abstract class AbstractSmsClient implements SmsClient { return channelVO; } + @Override + public SmsResult send(String templateApiId, SmsBody smsBody, Collection targets) { + SmsResult result; + try { + beforeSend(templateApiId, smsBody, targets); + result = doSend(templateApiId, smsBody, targets); + afterSend(templateApiId, smsBody, targets, result); + } catch (Exception e) { + // exception handle + log.debug(e.getMessage(), e); + return failResult("发送异常: " + e.getMessage()); + } + return result; + } + + + /** + * 发送消息 + * + * @param templateApiId 短信模板唯一标识 + * @param smsBody 消息内容 + * @param targets 发送对象列表 + * @return 短信发送结果 + */ + public abstract SmsResult doSend(String templateApiId, SmsBody smsBody, Collection targets) throws Exception; + + protected void beforeSend(String templateApiId, SmsBody smsBody, Collection targets) throws Exception { + } + + protected void afterSend(String templateApiId, SmsBody smsBody, Collection targets, SmsResult result) throws Exception { + } + + + SmsResult failResult(String message) { + SmsResult resultBody = new SmsResult(); + resultBody.setSuccess(false); + resultBody.setMessage(message); + return resultBody; + } } diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/client/AliyunSmsClient.java b/src/main/java/cn/iocoder/dashboard/framework/sms/client/AliyunSmsClient.java index 60f12f575..f1976589c 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/client/AliyunSmsClient.java +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/client/AliyunSmsClient.java @@ -1,10 +1,14 @@ package cn.iocoder.dashboard.framework.sms.client; +import cn.hutool.core.date.DateUtil; import cn.iocoder.dashboard.framework.sms.core.SmsBody; import cn.iocoder.dashboard.framework.sms.core.SmsResult; +import cn.iocoder.dashboard.framework.sms.core.SmsResultDetail; import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperty; import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.IAcsClient; +import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsRequest; +import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsResponse; import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest; import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse; import com.aliyuncs.http.MethodType; @@ -13,7 +17,9 @@ import com.aliyuncs.profile.IClientProfile; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import java.util.ArrayList; import java.util.Collection; +import java.util.List; /** * 阿里短信实现类 @@ -22,7 +28,7 @@ import java.util.Collection; * @date 2021/1/25 14:17 */ @Slf4j -public class AliyunSmsClient extends AbstractSmsClient { +public class AliyunSmsClient extends AbstractSmsClient { private static final String OK = "OK"; @@ -53,35 +59,36 @@ public class AliyunSmsClient extends AbstractSmsClient { @Override - public SmsResult send(SmsBody smsBody, Collection targets) { + public SmsResult doSend(String templateApiId, SmsBody smsBody, Collection targets) throws Exception { SendSmsRequest request = new SendSmsRequest(); request.setSysMethod(MethodType.POST); request.setPhoneNumbers(StringUtils.join(targets, ",")); request.setSignName(channelVO.getApiSignatureId()); - request.setTemplateCode(channelVO.getTemplateByTemplateCode(smsBody.getTemplateCode()).getApiTemplateId()); + request.setTemplateCode(templateApiId); request.setTemplateParam(smsBody.getParamsStr()); - // TODO FROM 芋艿 TO zzf:try catch 咱是不是可以交给 abstract 来做。这样,异常处理,重试,限流等等,都可以酱紫 - try { - SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request); + // TODO FROM 芋艿 TO zzf:try catch 咱是不是可以交给 abstract 来做。这样,异常处理,重试,限流等等,都可以酱紫 DONE + SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request); - boolean result = OK.equals(sendSmsResponse.getCode()); - if (!result) { - log.debug("send fail[code={}, message={}]", sendSmsResponse.getCode(), sendSmsResponse.getMessage()); - } - SmsResult resultBody = new SmsResult<>(); - resultBody.setSuccess(result); - resultBody.setResult(sendSmsResponse); - return resultBody; - } catch (Exception e) { - log.debug(e.getMessage(), e); - return failResult("发送异常: " + e.getMessage()); + boolean result = OK.equals(sendSmsResponse.getCode()); + if (!result) { + log.debug("send fail[code={}, message={}]", sendSmsResponse.getCode(), sendSmsResponse.getMessage()); } - } + SmsResult resultBody = new SmsResult(); + resultBody.setSuccess(result); + QuerySendDetailsRequest querySendDetailsRequest = new QuerySendDetailsRequest(); + querySendDetailsRequest.setBizId(sendSmsResponse.getBizId()); - SmsResult failResult(String message) { - SmsResult resultBody = new SmsResult<>(); - resultBody.setSuccess(false); - resultBody.setMessage(message); + QuerySendDetailsResponse acsResponse = acsClient.getAcsResponse(querySendDetailsRequest); + List resultDetailList = new ArrayList<>(Integer.parseInt(acsResponse.getTotalCount())); + acsResponse.getSmsSendDetailDTOs().forEach(s -> { + SmsResultDetail resultDetail = new SmsResultDetail(); + resultDetail.setCreateTime(DateUtil.parseDateTime(s.getSendDate())); + resultDetail.setMessage(s.getContent()); + resultDetail.setPhone(s.getPhoneNum()); + resultDetail.setStatus(Math.toIntExact(s.getSendStatus())); + resultDetailList.add(resultDetail); + }); + resultBody.setResult(resultDetailList); return resultBody; } diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/client/SmsClient.java b/src/main/java/cn/iocoder/dashboard/framework/sms/client/SmsClient.java index 290d21712..94a6de933 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/client/SmsClient.java +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/client/SmsClient.java @@ -11,15 +11,16 @@ import java.util.Collection; * @author zzf * @date 2021/1/25 14:14 */ -public interface SmsClient { +public interface SmsClient { /** * 发送消息 * - * @param smsBody 消息内容 - * @param targets 发送对象列表 - * @return 是否发送成功 + * @param templateApiId 短信模板唯一标识 + * @param smsBody 消息内容 + * @param targets 发送对象列表 + * @return 短信发送结果 */ - SmsResult send(SmsBody smsBody, Collection targets); + SmsResult send(String templateApiId, SmsBody smsBody, Collection targets); } \ No newline at end of file diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsClientFactory.java b/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsClientFactory.java index 68864db11..4cd8e0f89 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsClientFactory.java +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsClientFactory.java @@ -1,15 +1,14 @@ package cn.iocoder.dashboard.framework.sms.core; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import cn.iocoder.dashboard.common.enums.SmsChannelEnum; import cn.iocoder.dashboard.common.exception.ServiceException; -import cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil; import cn.iocoder.dashboard.framework.sms.client.AbstractSmsClient; import cn.iocoder.dashboard.framework.sms.client.AliyunSmsClient; +import cn.iocoder.dashboard.framework.sms.core.enums.SmsChannelEnum; import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperty; +import cn.iocoder.dashboard.framework.sms.core.property.SmsTemplateProperty; import org.springframework.stereotype.Component; +import java.util.Collection; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -24,7 +23,17 @@ import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; @Component public class SmsClientFactory { - private final Map> smsSenderMap = new ConcurrentHashMap<>(8); + /** + * channelId: client map + * 保存 渠道id: 对应短信客户端 的map + */ + private final Map smsSenderMap = new ConcurrentHashMap<>(8); + + /** + * templateCode: TemplateProperty map + * 保存 模板编码:模板信息 的map + */ + private final Map templatePropertyMap = new ConcurrentHashMap<>(16); /** * 创建短信客户端 @@ -33,20 +42,13 @@ public class SmsClientFactory { * @return 客户端id(默认channelId) */ public Long createClient(SmsChannelProperty propertyVO) { - // TODO FROM 芋艿 TO zzf:参数的校验,可以考虑统一使用 validation。 - if (StrUtil.isBlank(propertyVO.getCode())) { - throw ServiceExceptionUtil.exception(PARAM_VALUE_IS_NULL, "短信渠道编码"); - } - if (ObjectUtil.isNull(propertyVO.getId())) { - throw ServiceExceptionUtil.exception(PARAM_VALUE_IS_NULL, "短信渠道ID"); - } - - AbstractSmsClient sender = createClient(SmsChannelEnum.getByCode(propertyVO.getCode()), propertyVO); + // TODO FROM 芋艿 TO zzf:参数的校验,可以考虑统一使用 validation。 DONE + AbstractSmsClient sender = createClient(SmsChannelEnum.getByCode(propertyVO.getCode()), propertyVO); smsSenderMap.put(propertyVO.getId(), sender); return propertyVO.getId(); } - private AbstractSmsClient createClient(SmsChannelEnum channelEnum, SmsChannelProperty channelVO) { + private AbstractSmsClient createClient(SmsChannelEnum channelEnum, SmsChannelProperty channelVO) { if (channelEnum == null) { throw new ServiceException(INVALID_CHANNEL_CODE); } @@ -66,7 +68,38 @@ public class SmsClientFactory { * @param channelId 渠道id * @return 短信id */ - public AbstractSmsClient getClient(Long channelId) { + public AbstractSmsClient getClient(Long channelId) { return smsSenderMap.get(channelId); } + + + /** + * 添加或修改短信模板信息缓存 + */ + public void addOrUpdateTemplateCache(Collection templateProperties) { + templateProperties.forEach(s -> templatePropertyMap.put(s.getCode(), s)); + } + + + /** + * 添加或修改短信模板信息缓存 + */ + public void addOrUpdateTemplateCache(SmsTemplateProperty templateProperty) { + templatePropertyMap.put(templateProperty.getCode(), templateProperty); + } + + + /** + * 根据短信模板编码获取模板唯一标识 + * + * @param templateCode 短信模板编码 + * @return 短信id + */ + public String getTemplateApiIdByCode(String templateCode) { + SmsTemplateProperty smsTemplateProperty = templatePropertyMap.get(templateCode); + if (smsTemplateProperty == null) { + throw new ServiceException(SMS_TEMPLATE_NOT_FOUND); + } + return smsTemplateProperty.getApiTemplateId(); + } } diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResult.java b/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResult.java index 101a1af4a..64bbd1e4b 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResult.java +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResult.java @@ -3,17 +3,24 @@ package cn.iocoder.dashboard.framework.sms.core; import lombok.Data; import java.io.Serializable; +import java.util.List; /** * 消息内容实体类 */ @Data -public class SmsResult implements Serializable { +public class SmsResult implements Serializable { /** * 是否成功 */ - private Boolean success; // TODO FROM 芋艿 to zzf:未来要加一个 code,将不同平台的短信失败的情况,做一次统一的收敛。 + // TODO FROM 芋艿 to zzf:未来要加一个 code,将不同平台的短信失败的情况,做一次统一的收敛。 DONE + private Boolean success; + + /** + * 状态码 + */ + private String code; /** * 提示 @@ -23,5 +30,7 @@ public class SmsResult implements Serializable { /** * 返回值 */ - private T result; // TODO FROM 芋艿 to zzf:是不是统一各个平台的返回结果,这样对调用方来说统一。因为作为统一的短信客户端,最好让上层不太需要知道太具体。黑河诶 + // TODO FROM 芋艿 to zzf:是不是统一各个平台的返回结果,这样对调用方来说统一。因为作为统一的短信客户端,最好让上层不太需要知道太具体。黑河诶 DONE + private List result; + } diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResultDetail.java b/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResultDetail.java new file mode 100644 index 000000000..6ed9fbcae --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResultDetail.java @@ -0,0 +1,33 @@ +package cn.iocoder.dashboard.framework.sms.core; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 消息内容实体类 + */ +@Data +public class SmsResultDetail implements Serializable { + + /** + * 状态 1成功 2失败 3等待回执 + */ + private Integer status; + + /** + * 接收手机号 + */ + private String phone; + + /** + * 提示 + */ + private String message; + + /** + * 时间 + */ + private Date createTime; +} diff --git a/src/main/java/cn/iocoder/dashboard/common/enums/SmsChannelEnum.java b/src/main/java/cn/iocoder/dashboard/framework/sms/core/enums/SmsChannelEnum.java similarity index 70% rename from src/main/java/cn/iocoder/dashboard/common/enums/SmsChannelEnum.java rename to src/main/java/cn/iocoder/dashboard/framework/sms/core/enums/SmsChannelEnum.java index 0e6fb6602..5aebdfa6d 100644 --- a/src/main/java/cn/iocoder/dashboard/common/enums/SmsChannelEnum.java +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/core/enums/SmsChannelEnum.java @@ -1,13 +1,10 @@ -package cn.iocoder.dashboard.common.enums; +package cn.iocoder.dashboard.framework.sms.core.enums; import lombok.AllArgsConstructor; import lombok.Getter; -import java.util.function.Predicate; -import java.util.stream.Stream; - /** - * 短信渠道枚举 TODO FROM 芋艿 TO zzf:属于短信的枚举类,可以放到 framework/sms 下 + * 短信渠道枚举 TODO FROM 芋艿 TO zzf:属于短信的枚举类,可以放到 framework/sms 下 DONE * * @author zzf * @date 2021/1/25 10:56 @@ -19,7 +16,7 @@ public enum SmsChannelEnum { ALI("ALI", "阿里"), HUA_WEI("HUA_WEI", "华为"), QI_NIU("QI_NIU", "七牛"), - TEN_XUN("TEN_XUN", "腾讯"); // TODO FROM 芋艿 to zzf:TEN 有后鼻音哈,要被马爸爸打了。。。 + TENCENT("TENCENT", "腾讯"); // TODO FROM 芋艿 to zzf:TEN 有后鼻音哈,要被马爸爸打了。。。 DONE private final String code; diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/core/property/SmsChannelProperty.java b/src/main/java/cn/iocoder/dashboard/framework/sms/core/property/SmsChannelProperty.java index 402b0d7e7..95f2a8ce7 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/core/property/SmsChannelProperty.java +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/core/property/SmsChannelProperty.java @@ -3,6 +3,8 @@ package cn.iocoder.dashboard.framework.sms.core.property; import lombok.Data; import lombok.EqualsAndHashCode; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; import java.io.Serializable; import java.util.List; @@ -19,40 +21,37 @@ public class SmsChannelProperty implements Serializable { /** * id */ + @NotNull(message = "短信渠道ID不能为空") private Long id; /** * 编码(来自枚举类 阿里、华为、七牛等) */ + @NotEmpty(message = "短信渠道编码不能为空") private String code; /** * 渠道账号id */ + @NotEmpty(message = "渠道账号id不能为空") private String apiKey; /** * 渠道账号秘钥 */ + @NotEmpty(message = "渠道账号秘钥不能为空") private String apiSecret; /** * 实际渠道签名唯一标识 */ + @NotEmpty(message = "实际渠道签名唯一标识不能为空") private String apiSignatureId; /** * 签名值 */ + @NotEmpty(message = "签名值不能为空") private String signature; - /** - * 该渠道名下的短信模板集合 - */ - private List templateList; - - public SmsTemplateProperty getTemplateByTemplateCode(String tempCode) { - return templateList.stream().filter(s -> s.getCode().equals(tempCode)).findFirst().get(); - } - } diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/core/property/SmsTemplateProperty.java b/src/main/java/cn/iocoder/dashboard/framework/sms/core/property/SmsTemplateProperty.java index aa0a8c461..a613a5453 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/core/property/SmsTemplateProperty.java +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/core/property/SmsTemplateProperty.java @@ -3,8 +3,12 @@ package cn.iocoder.dashboard.framework.sms.core.property; import lombok.Data; import lombok.EqualsAndHashCode; +import javax.validation.constraints.NotEmpty; + /** - * 渠道模板VO类 TODO FROM 芋艿 TO zzf:模板是不是不要提供到 client 里面,而是交给 factory 统一维护就好。不然,模板修改时候,刷新 client 会比较麻烦。 + * 渠道模板VO类 + * TODO FROM 芋艿 TO zzf:模板是不是不要提供到 client 里面,而是交给 factory 统一维护就好。不然,模板修改时候,刷新 client 会比较麻烦。 + * * * @author zzf * @date 2021/1/25 17:03 @@ -13,6 +17,12 @@ import lombok.EqualsAndHashCode; @EqualsAndHashCode public class SmsTemplateProperty { + /** + * 渠道id + */ + @NotEmpty(message = "短信渠道编码不能为空") + private Long channelId; + /** * 业务编码(来自数据字典, 用户自定义业务场景 一个场景可以有多个模板) */ @@ -21,18 +31,19 @@ public class SmsTemplateProperty { /** * 编码 */ + @NotEmpty(message = "短信模板编码不能为空") private String code; /** * 实际渠道模板唯一标识 */ + @NotEmpty(message = "短信模板唯一标识不能为空") private String apiTemplateId; /** * 内容 */ + @NotEmpty(message = "短信模板内容不能为空") private String content; - - } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SmsChannelController.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SmsChannelController.java index 932097514..f32074cbf 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SmsChannelController.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SmsChannelController.java @@ -5,8 +5,8 @@ import cn.iocoder.dashboard.common.pojo.PageResult; import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelCreateReqVO; import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelPageReqVO; import cn.iocoder.dashboard.modules.system.controller.sms.vo.resp.SmsChannelEnumRespVO; -import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SmsChannelDO; -import cn.iocoder.dashboard.modules.system.service.sms.SmsChannelService; +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SysSmsChannelDO; +import cn.iocoder.dashboard.modules.system.service.sms.SysSmsChannelService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.validation.annotation.Validated; @@ -23,25 +23,25 @@ import static cn.iocoder.dashboard.common.pojo.CommonResult.success; public class SmsChannelController { @Resource - private SmsChannelService service; + private SysSmsChannelService service; @ApiOperation("获取渠道/签名分页") @GetMapping("/page") - public CommonResult> getPermissionInfo(@Validated SmsChannelPageReqVO reqVO) { - return success(service.pageChannels(reqVO)); + public CommonResult> getPermissionInfo(@Validated SmsChannelPageReqVO reqVO) { + return success(service.pageSmsChannels(reqVO)); } @ApiOperation("获取渠道枚举") @GetMapping("/list/channel-enum") public CommonResult> getChannelEnums() { - return success(service.getChannelEnums()); + return success(service.getSmsChannelEnums()); } @ApiOperation("添加消息渠道") @PostMapping("/create") public CommonResult add(@Validated @RequestBody SmsChannelCreateReqVO reqVO) { - return success(service.createChannel(reqVO)); + return success(service.createSmsChannel(reqVO)); } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/convert/sms/SmsChannelConvert.java b/src/main/java/cn/iocoder/dashboard/modules/system/convert/sms/SmsChannelConvert.java index b52167ef7..ad272218e 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/convert/sms/SmsChannelConvert.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/convert/sms/SmsChannelConvert.java @@ -1,13 +1,13 @@ package cn.iocoder.dashboard.modules.system.convert.sms; -import cn.iocoder.dashboard.common.enums.SmsChannelEnum; +import cn.iocoder.dashboard.framework.sms.core.enums.SmsChannelEnum; import cn.iocoder.dashboard.common.pojo.PageResult; import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperty; import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsChannelAllVO; import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelCreateReqVO; import cn.iocoder.dashboard.modules.system.controller.sms.vo.resp.SmsChannelEnumRespVO; import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserUpdateReqVO; -import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SmsChannelDO; +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SysSmsChannelDO; import com.baomidou.mybatisplus.core.metadata.IPage; import org.mapstruct.Mapper; import org.mapstruct.Mapping; @@ -21,17 +21,19 @@ public interface SmsChannelConvert { SmsChannelConvert INSTANCE = Mappers.getMapper(SmsChannelConvert.class); @Mapping(source = "records", target = "list") - PageResult convertPage(IPage page); + PageResult convertPage(IPage page); - SmsChannelDO convert(SmsChannelCreateReqVO bean); + SysSmsChannelDO convert(SmsChannelCreateReqVO bean); - SmsChannelDO convert(SysUserUpdateReqVO bean); + SysSmsChannelDO convert(SysUserUpdateReqVO bean); List convertEnum(List bean); - List convert(List bean); + List convert(List bean); List convertProperty(List list); + List convertProperties(List list); + } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/convert/sms/SmsTemplateConvert.java b/src/main/java/cn/iocoder/dashboard/modules/system/convert/sms/SmsTemplateConvert.java index 476b96e0e..aaac0abdf 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/convert/sms/SmsTemplateConvert.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/convert/sms/SmsTemplateConvert.java @@ -2,8 +2,8 @@ package cn.iocoder.dashboard.modules.system.convert.sms; import cn.iocoder.dashboard.common.pojo.PageResult; import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsTemplateVO; -import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SmsChannelDO; -import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SmsTemplateDO; +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SysSmsChannelDO; +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SysSmsTemplateDO; import com.baomidou.mybatisplus.core.metadata.IPage; import org.mapstruct.Mapper; import org.mapstruct.Mapping; @@ -17,10 +17,10 @@ public interface SmsTemplateConvert { SmsTemplateConvert INSTANCE = Mappers.getMapper(SmsTemplateConvert.class); @Mapping(source = "records", target = "list") - PageResult convertPage(IPage page); + PageResult convertPage(IPage page); - List convert(List bean); + List convert(List bean); - SmsTemplateVO convert(SmsTemplateDO bean); + SmsTemplateVO convert(SysSmsTemplateDO bean); } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/SmsTemplateMapper.java b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/SmsTemplateMapper.java deleted file mode 100644 index fd941ae7a..000000000 --- a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/SmsTemplateMapper.java +++ /dev/null @@ -1,39 +0,0 @@ -package cn.iocoder.dashboard.modules.system.dal.mysql.dao.sms; - -import cn.iocoder.dashboard.common.enums.CommonStatusEnum; -import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SmsTemplateDO; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -@Mapper -public interface SmsTemplateMapper extends BaseMapper { - - /** - * 根据短信渠道id查询短信模板集合 - * - * @param channelId 渠道id - * @return 模板集合 - */ - default List selectListByChannelId(Long channelId) { - return selectList(new LambdaQueryWrapper() - .eq(SmsTemplateDO::getChannelId, channelId) - .eq(SmsTemplateDO::getStatus, CommonStatusEnum.ENABLE.getStatus()) - .orderByAsc(SmsTemplateDO::getId) - ); - } - - /** - * 查询有效短信模板集合 - * - * @return 有效短信模板集合 - */ - default List selectEnabledList() { - return selectList(new LambdaQueryWrapper() - .eq(SmsTemplateDO::getStatus, CommonStatusEnum.ENABLE.getStatus()) - .orderByAsc(SmsTemplateDO::getId) - ); - } -} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/SmsChannelMapper.java b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/SysSmsChannelMapper.java similarity index 56% rename from src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/SmsChannelMapper.java rename to src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/SysSmsChannelMapper.java index d1ce95c62..43b7fe743 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/SmsChannelMapper.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/SysSmsChannelMapper.java @@ -4,7 +4,7 @@ import cn.hutool.core.util.StrUtil; import cn.iocoder.dashboard.common.enums.CommonStatusEnum; import cn.iocoder.dashboard.framework.mybatis.core.util.MyBatisUtils; import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelPageReqVO; -import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SmsChannelDO; +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SysSmsChannelDO; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -13,19 +13,19 @@ import org.apache.ibatis.annotations.Mapper; import java.util.List; @Mapper -public interface SmsChannelMapper extends BaseMapper { +public interface SysSmsChannelMapper extends BaseMapper { - default IPage selectChannelPage(SmsChannelPageReqVO reqVO) { - return selectPage(MyBatisUtils.buildPage(reqVO), new LambdaQueryWrapper() - .like(StrUtil.isNotBlank(reqVO.getName()), SmsChannelDO::getName, reqVO.getName()) - .like(StrUtil.isNotBlank(reqVO.getSignature()), SmsChannelDO::getName, reqVO.getSignature()) + default IPage selectChannelPage(SmsChannelPageReqVO reqVO) { + return selectPage(MyBatisUtils.buildPage(reqVO), new LambdaQueryWrapper() + .like(StrUtil.isNotBlank(reqVO.getName()), SysSmsChannelDO::getName, reqVO.getName()) + .like(StrUtil.isNotBlank(reqVO.getSignature()), SysSmsChannelDO::getName, reqVO.getSignature()) ); } - default List selectEnabledList() { - return selectList(new LambdaQueryWrapper() - .eq(SmsChannelDO::getStatus, CommonStatusEnum.ENABLE.getStatus()) - .orderByAsc(SmsChannelDO::getId) + default List selectEnabledList() { + return selectList(new LambdaQueryWrapper() + .eq(SysSmsChannelDO::getStatus, CommonStatusEnum.ENABLE.getStatus()) + .orderByAsc(SysSmsChannelDO::getId) ); } } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/SmsLogMapper.java b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/SysSmsLogMapper.java similarity index 74% rename from src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/SmsLogMapper.java rename to src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/SysSmsLogMapper.java index 2e52b070e..cdb6df40b 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/SmsLogMapper.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/SysSmsLogMapper.java @@ -1,10 +1,10 @@ package cn.iocoder.dashboard.modules.system.dal.mysql.dao.sms; -import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SmsLogDO; +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SysSmsLogDO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; @Mapper -public interface SmsLogMapper extends BaseMapper { +public interface SysSmsLogMapper extends BaseMapper { } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/SysSmsTemplateMapper.java b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/SysSmsTemplateMapper.java new file mode 100644 index 000000000..b24c630d4 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/SysSmsTemplateMapper.java @@ -0,0 +1,39 @@ +package cn.iocoder.dashboard.modules.system.dal.mysql.dao.sms; + +import cn.iocoder.dashboard.common.enums.CommonStatusEnum; +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SysSmsTemplateDO; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface SysSmsTemplateMapper extends BaseMapper { + + /** + * 根据短信渠道id查询短信模板集合 + * + * @param channelId 渠道id + * @return 模板集合 + */ + default List selectListByChannelId(Long channelId) { + return selectList(new LambdaQueryWrapper() + .eq(SysSmsTemplateDO::getChannelId, channelId) + .eq(SysSmsTemplateDO::getStatus, CommonStatusEnum.ENABLE.getStatus()) + .orderByAsc(SysSmsTemplateDO::getId) + ); + } + + /** + * 查询有效短信模板集合 + * + * @return 有效短信模板集合 + */ + default List selectEnabledList() { + return selectList(new LambdaQueryWrapper() + .eq(SysSmsTemplateDO::getStatus, CommonStatusEnum.ENABLE.getStatus()) + .orderByAsc(SysSmsTemplateDO::getId) + ); + } +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SmsChannelDO.java b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SysSmsChannelDO.java similarity index 95% rename from src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SmsChannelDO.java rename to src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SysSmsChannelDO.java index 5cce2ffa4..3e9422e79 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SmsChannelDO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SysSmsChannelDO.java @@ -15,7 +15,7 @@ import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = true) @TableName(value = "sms_channel", autoResultMap = true) -public class SmsChannelDO extends BaseDO { +public class SysSmsChannelDO extends BaseDO { /** * 自增编号 diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SmsLogDO.java b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SysSmsLogDO.java similarity index 95% rename from src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SmsLogDO.java rename to src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SysSmsLogDO.java index 10ffef478..97ec6c02e 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SmsLogDO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SysSmsLogDO.java @@ -18,7 +18,7 @@ import java.util.Date; @EqualsAndHashCode @Accessors(chain = true) @TableName(value = "sms_log", autoResultMap = true) -public class SmsLogDO implements Serializable { +public class SysSmsLogDO implements Serializable { /** * 自增编号 diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SmsTemplateDO.java b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SysSmsTemplateDO.java similarity index 96% rename from src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SmsTemplateDO.java rename to src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SysSmsTemplateDO.java index 360999838..3e8cdc25c 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SmsTemplateDO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SysSmsTemplateDO.java @@ -16,7 +16,7 @@ import java.util.Date; @Data @EqualsAndHashCode(callSuper = true) @TableName(value = "sms_template", autoResultMap = true) -public class SmsTemplateDO extends BaseDO { +public class SysSmsTemplateDO extends BaseDO { /** * 自增编号 diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/sms/SmsSendConsumer.java b/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/sms/SmsSendConsumer.java index 5da9703ca..53cce0bc2 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/sms/SmsSendConsumer.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/sms/SmsSendConsumer.java @@ -4,7 +4,7 @@ import cn.iocoder.dashboard.framework.redis.core.pubsub.AbstractChannelMessageLi import cn.iocoder.dashboard.framework.sms.core.SmsResult; import cn.iocoder.dashboard.modules.system.mq.message.dept.SysDeptRefreshMessage; import cn.iocoder.dashboard.modules.system.mq.message.sms.SmsSendMessage; -import cn.iocoder.dashboard.modules.system.service.sms.SmsService; +import cn.iocoder.dashboard.modules.system.service.sms.SysSmsService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -20,12 +20,12 @@ import javax.annotation.Resource; public class SmsSendConsumer extends AbstractChannelMessageListener { @Resource - private SmsService smsService; + private SysSmsService sysSmsService; @Override public void onMessage(SmsSendMessage message) { log.info("[onMessage][收到 发送短信 消息]"); - SmsResult send = smsService.send(message.getSmsBody(), message.getTargetPhones()); + SmsResult send = sysSmsService.send(message.getSmsBody(), message.getTargetPhones()); } } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SmsChannelService.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsChannelService.java similarity index 73% rename from src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SmsChannelService.java rename to src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsChannelService.java index 5cb34a24e..d9200f96c 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SmsChannelService.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsChannelService.java @@ -6,7 +6,7 @@ import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsChannelAllVO; import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelCreateReqVO; import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelPageReqVO; import cn.iocoder.dashboard.modules.system.controller.sms.vo.resp.SmsChannelEnumRespVO; -import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SmsChannelDO; +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SysSmsChannelDO; import java.util.List; @@ -16,7 +16,7 @@ import java.util.List; * @author zzf * @date 2021/1/25 9:24 */ -public interface SmsChannelService { +public interface SysSmsChannelService { // TODO FROM 芋艿 to ZZF:SmsChannelService=》SysSmsChannelService,增加 Sys 前缀,算在系统模块里 // TODO FROM 芋艿 to ZZF:方法名,保持不去掉 Sms 前缀。虽然长点,嘿嘿 @@ -32,7 +32,7 @@ public interface SmsChannelService { * @param reqVO 参数对象 * @return 短信渠道分页对象 */ - PageResult pageChannels(SmsChannelPageReqVO reqVO); + PageResult pageSmsChannels(SmsChannelPageReqVO reqVO); /** * 创建新的渠道信息 @@ -40,14 +40,14 @@ public interface SmsChannelService { * @param reqVO 参数对象 * @return 渠道id */ - Long createChannel(SmsChannelCreateReqVO reqVO); + Long createSmsChannel(SmsChannelCreateReqVO reqVO); /** * 获取短信渠道枚举/渠道编码 * * @return 短信渠道枚举/渠道编码 */ - List getChannelEnums(); + List getSmsChannelEnums(); /** * 根据短信模板编码获取短信客户端 @@ -55,12 +55,20 @@ public interface SmsChannelService { * @param templateCode 短信模板编码 * @return 短信客户端 */ - AbstractSmsClient getClient(String templateCode); + AbstractSmsClient getSmsClient(String templateCode); + + /** + * 根据短信模板编码获取模板唯一标识 + * + * @param templateCode 短信模板编码 + * @return 短信客户端 + */ + String getSmsTemplateApiIdByCode(String templateCode); /** * 查询渠道(包含名下模块)信息集合 * * @return 渠道(包含名下模块)信息集合 */ - List listChannelAllEnabledInfo(); + List listSmsChannelAllEnabledInfo(); } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SmsLogService.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsLogService.java similarity index 79% rename from src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SmsLogService.java rename to src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsLogService.java index bbc50773f..431737912 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SmsLogService.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsLogService.java @@ -12,7 +12,7 @@ import java.util.List; * @author zzf * @date 2021/1/25 9:24 */ -public interface SmsLogService { +public interface SysSmsLogService { /** * 发送短信前的日志处理 * @@ -22,9 +22,11 @@ public interface SmsLogService { * @param isAsync 是否异步发送 * @return 生成的日志id */ - // TODO FROM 芋艿 to ZZF: async 是针对发送的方式,对于日志不一定需要关心。这样,短信日志,实际就发送前插入,发送后更新结果 + // TODO FROM 芋艿 to ZZF: async 是针对发送的方式,对于日志不一定需要关心。这样,短信日志,实际就发送前插入,发送后更新结果. + // 这里只用于记录状态,毕竟异步可能推送失败,此时日志可记录该状态。 + // TODO FROM 芋艿 to ZZF:短信日志,群发的情况,应该是每个手机一条哈。虽然是群发,但是可能部分成功,部分失败;对应到短信平台,实际也是多条。 - Long beforeSendLog(SmsBody smsBody, List targetPhones, AbstractSmsClient client, Boolean isAsync); + Long beforeSendLog(SmsBody smsBody, List targetPhones, AbstractSmsClient client, Boolean isAsync); /** * 发送消息后的日志处理 @@ -32,6 +34,6 @@ public interface SmsLogService { * @param logId 日志id * @param result 消息结果 */ - void afterSendLog(Long logId, SmsResult result); + void afterSendLog(Long logId, SmsResult result); } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SmsService.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsService.java similarity index 86% rename from src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SmsService.java rename to src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsService.java index 56dc2dfa9..5b403cb5e 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SmsService.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsService.java @@ -14,7 +14,7 @@ import java.util.List; * @author zzf * @date 2021/1/25 9:24 */ -public interface SmsService { +public interface SysSmsService { /** * 发送消息 @@ -23,7 +23,7 @@ public interface SmsService { * @param targetPhones 发送对象手机号列表 * @return 是否发送成功 */ - SmsResult send(SmsBody smsBody, List targetPhones); + SmsResult send(SmsBody smsBody, List targetPhones); /** * 发送消息 @@ -32,7 +32,7 @@ public interface SmsService { * @param targetPhone 发送对象手机号 * @return 是否发送成功 */ - default SmsResult send(SmsBody smsBody, String targetPhone) { + default SmsResult send(SmsBody smsBody, String targetPhone) { if (StringUtils.isBlank(targetPhone)) { return failResult("targetPhone must not null."); } @@ -47,7 +47,7 @@ public interface SmsService { * @param targetPhones 发送对象手机号数组 * @return 是否发送成功 */ - default SmsResult send(SmsBody smsBody, String... targetPhones) { + default SmsResult send(SmsBody smsBody, String... targetPhones) { if (targetPhones == null) { return failResult("targetPhones must not null."); } @@ -91,8 +91,8 @@ public interface SmsService { } - default SmsResult failResult(String message) { - SmsResult resultBody = new SmsResult<>(); + default SmsResult failResult(String message) { + SmsResult resultBody = new SmsResult(); resultBody.setSuccess(false); resultBody.setMessage(message); return resultBody; diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SmsTemplateService.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsTemplateService.java similarity index 77% rename from src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SmsTemplateService.java rename to src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsTemplateService.java index 585a22a57..8ba74b2f6 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SmsTemplateService.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsTemplateService.java @@ -6,5 +6,5 @@ package cn.iocoder.dashboard.modules.system.service.sms; * @author zzf * @date 2021/1/25 9:24 */ -public interface SmsTemplateService { +public interface SysSmsTemplateService { } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsServiceImpl.java deleted file mode 100644 index 999649b8f..000000000 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsServiceImpl.java +++ /dev/null @@ -1,52 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.sms.impl; - -import cn.iocoder.dashboard.framework.sms.client.AbstractSmsClient; -import cn.iocoder.dashboard.framework.sms.core.SmsBody; -import cn.iocoder.dashboard.framework.sms.core.SmsResult; -import cn.iocoder.dashboard.modules.system.mq.producer.sms.SmsProducer; -import cn.iocoder.dashboard.modules.system.service.sms.SmsChannelService; -import cn.iocoder.dashboard.modules.system.service.sms.SmsLogService; -import cn.iocoder.dashboard.modules.system.service.sms.SmsService; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.List; - -/** - * 短信日志Service实现类 - * - * @author zzf - * @date 2021/1/25 9:25 - */ -@Service -public class SmsServiceImpl implements SmsService { - - @Resource - private SmsChannelService channelService; - - @Resource - private SmsLogService smsLogService; - - @Resource - private SmsProducer smsProducer; - - @Override - public SmsResult send(SmsBody smsBody, List targetPhones) { - AbstractSmsClient client = channelService.getClient(smsBody.getTemplateCode()); - Long logId = smsLogService.beforeSendLog(smsBody, targetPhones, client, false); - - SmsResult result = client.send(smsBody, targetPhones); - - smsLogService.afterSendLog(logId, result); - - return result; - } - - // TODO FROM 芋艿 to ZZF:可能要讨论下,对于短信发送来说,貌似只提供异步发送即可。对于业务来说,一定不能依赖短信的发送结果。 - @Override - public void sendAsync(SmsBody smsBody, List targetPhones) { - AbstractSmsClient client = channelService.getClient(smsBody.getTemplateCode()); - smsLogService.beforeSendLog(smsBody, targetPhones, client, true); - smsProducer.sendSmsSendMessage(smsBody, targetPhones); - } -} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsChannelServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsChannelServiceImpl.java similarity index 50% rename from src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsChannelServiceImpl.java rename to src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsChannelServiceImpl.java index 1bc8f7136..b59ed5619 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsChannelServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsChannelServiceImpl.java @@ -1,10 +1,10 @@ package cn.iocoder.dashboard.modules.system.service.sms.impl; import cn.hutool.core.util.ObjectUtil; -import cn.iocoder.dashboard.common.enums.SmsChannelEnum; import cn.iocoder.dashboard.common.pojo.PageResult; import cn.iocoder.dashboard.framework.sms.client.AbstractSmsClient; import cn.iocoder.dashboard.framework.sms.core.SmsClientFactory; +import cn.iocoder.dashboard.framework.sms.core.enums.SmsChannelEnum; import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperty; import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsChannelAllVO; import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelCreateReqVO; @@ -12,11 +12,11 @@ import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelPageR import cn.iocoder.dashboard.modules.system.controller.sms.vo.resp.SmsChannelEnumRespVO; import cn.iocoder.dashboard.modules.system.convert.sms.SmsChannelConvert; import cn.iocoder.dashboard.modules.system.convert.sms.SmsTemplateConvert; -import cn.iocoder.dashboard.modules.system.dal.mysql.dao.sms.SmsChannelMapper; -import cn.iocoder.dashboard.modules.system.dal.mysql.dao.sms.SmsTemplateMapper; -import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SmsChannelDO; -import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SmsTemplateDO; -import cn.iocoder.dashboard.modules.system.service.sms.SmsChannelService; +import cn.iocoder.dashboard.modules.system.dal.mysql.dao.sms.SysSmsChannelMapper; +import cn.iocoder.dashboard.modules.system.dal.mysql.dao.sms.SysSmsTemplateMapper; +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SysSmsChannelDO; +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SysSmsTemplateDO; +import cn.iocoder.dashboard.modules.system.service.sms.SysSmsChannelService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -35,12 +35,12 @@ import java.util.concurrent.ConcurrentHashMap; * @date 2021/1/25 9:25 */ @Service -public class SmsChannelServiceImpl implements SmsChannelService { +public class SysSmsChannelServiceImpl implements SysSmsChannelService { private final Map templateCode2ChannelIdMap = new ConcurrentHashMap<>(32); @Autowired - private SmsClientFactory smsClientFactory; + private SmsClientFactory clientFactory; /** * 初始化短信客户端 @@ -48,51 +48,60 @@ public class SmsChannelServiceImpl implements SmsChannelService { @PostConstruct @Override public void initSmsClient() { - List smsChannelAllVOList = listChannelAllEnabledInfo(); - if (ObjectUtil.isEmpty(smsChannelAllVOList)) { - return; - } - List channelPropertyList = SmsChannelConvert.INSTANCE.convertProperty(smsChannelAllVOList); - channelPropertyList.forEach(smsChannelProperty -> { - Long clientId = smsClientFactory.createClient(smsChannelProperty); - smsChannelProperty.getTemplateList().forEach(smsTemplateVO -> { - templateCode2ChannelIdMap.put(smsTemplateVO.getCode(), clientId); - }); + // 查询有效渠道信息 + List channelDOList = channelMapper.selectEnabledList(); + List propertyList = SmsChannelConvert.INSTANCE.convertProperties(channelDOList); + + // 遍历渠道生成client并获取模板缓存 + propertyList.forEach(channelProperty -> { + Long clientId = clientFactory.createClient(channelProperty); + List templateDOList = templateMapper.selectListByChannelId(channelProperty.getId()); + if (ObjectUtil.isNotEmpty(templateDOList)) { + templateDOList.forEach(template -> { + templateCode2ChannelIdMap.put(template.getCode(), clientId); + }); + SmsTemplateConvert.INSTANCE.convert(templateDOList); + } }); } - // TODO FROM 芋艿 to ZZF:channelMapper 嘿,保持命名统一。 + // TODO FROM 芋艿 to ZZF:channelMapper 嘿,保持命名统一。 DONE @Resource - private SmsChannelMapper mapper; + private SysSmsChannelMapper channelMapper; @Resource - private SmsTemplateMapper templateMapper; + private SysSmsTemplateMapper templateMapper; @Override - public PageResult pageChannels(SmsChannelPageReqVO reqVO) { - return SmsChannelConvert.INSTANCE.convertPage(mapper.selectChannelPage(reqVO)); + public PageResult pageSmsChannels(SmsChannelPageReqVO reqVO) { + return SmsChannelConvert.INSTANCE.convertPage(channelMapper.selectChannelPage(reqVO)); } @Override - public Long createChannel(SmsChannelCreateReqVO reqVO) { - SmsChannelDO channelDO = SmsChannelConvert.INSTANCE.convert(reqVO); - mapper.insert(channelDO); + public Long createSmsChannel(SmsChannelCreateReqVO reqVO) { + SysSmsChannelDO channelDO = SmsChannelConvert.INSTANCE.convert(reqVO); + channelMapper.insert(channelDO); return channelDO.getId(); } @Override - public List getChannelEnums() { + public List getSmsChannelEnums() { return SmsChannelConvert.INSTANCE.convertEnum(Arrays.asList(SmsChannelEnum.values())); } @Override - public AbstractSmsClient getClient(String templateCode) { - return smsClientFactory.getClient(templateCode2ChannelIdMap.get(templateCode)); + public AbstractSmsClient getSmsClient(String templateCode) { + return clientFactory.getClient(templateCode2ChannelIdMap.get(templateCode)); } @Override - public List listChannelAllEnabledInfo() { - List channelDOList = mapper.selectEnabledList(); + public String getSmsTemplateApiIdByCode(String templateCode) { + return clientFactory.getTemplateApiIdByCode(templateCode); + } + + @Override + public List listSmsChannelAllEnabledInfo() { + List channelDOList = channelMapper.selectEnabledList(); if (ObjectUtil.isNull(channelDOList)) { return null; } @@ -100,7 +109,7 @@ public class SmsChannelServiceImpl implements SmsChannelService { channelAllVOList.forEach(smsChannelDO -> { - List templateDOList = templateMapper.selectListByChannelId(smsChannelDO.getId()); + List templateDOList = templateMapper.selectListByChannelId(smsChannelDO.getId()); if (ObjectUtil.isNull(templateDOList)) { templateDOList = new ArrayList<>(); } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsLogServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsLogServiceImpl.java similarity index 60% rename from src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsLogServiceImpl.java rename to src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsLogServiceImpl.java index 5853463e8..7accf76db 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsLogServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsLogServiceImpl.java @@ -3,14 +3,12 @@ package cn.iocoder.dashboard.modules.system.service.sms.impl; import cn.iocoder.dashboard.framework.sms.client.AbstractSmsClient; import cn.iocoder.dashboard.framework.sms.core.SmsBody; import cn.iocoder.dashboard.framework.sms.core.SmsResult; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsChannelAllVO; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsTemplateVO; -import cn.iocoder.dashboard.modules.system.dal.mysql.dao.sms.SmsLogMapper; -import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SmsLogDO; +import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperty; +import cn.iocoder.dashboard.modules.system.dal.mysql.dao.sms.SysSmsLogMapper; +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SysSmsLogDO; import cn.iocoder.dashboard.modules.system.enums.sms.SmsSendStatusEnum; -import cn.iocoder.dashboard.modules.system.service.sms.SmsLogService; +import cn.iocoder.dashboard.modules.system.service.sms.SysSmsLogService; import cn.iocoder.dashboard.util.json.JsonUtils; -import cn.iocoder.dashboard.util.string.StrUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -23,42 +21,41 @@ import java.util.List; * @date 2021/1/25 9:25 */ @Service -public class SmsLogServiceImpl implements SmsLogService { +public class SysSmsLogServiceImpl implements SysSmsLogService { @Resource - private SmsLogMapper smsLogMapper; + private SysSmsLogMapper logMapper; @Override - public Long beforeSendLog(SmsBody smsBody, List targetPhones, AbstractSmsClient client, Boolean isAsync) { - SmsLogDO smsLog = new SmsLogDO(); + public Long beforeSendLog(SmsBody smsBody, List targetPhones, AbstractSmsClient client, Boolean isAsync) { + SysSmsLogDO smsLog = new SysSmsLogDO(); if (smsBody.getSmsLogId() != null) { smsLog.setId(smsBody.getSmsLogId()); smsLog.setSendStatus(SmsSendStatusEnum.SENDING.getStatus()); - smsLogMapper.updateById(smsLog); + logMapper.updateById(smsLog); return smsBody.getSmsLogId(); } else { - SmsChannelAllVO property = client.getProperty(); - SmsTemplateVO smsTemplate = property.getTemplateByTemplateCode(smsBody.getTemplateCode()); + SmsChannelProperty property = client.getProperty(); smsLog.setChannelCode(property.getCode()) .setChannelId(property.getId()) - .setTemplateCode(smsTemplate.getCode()) + .setTemplateCode(smsBody.getTemplateCode()) .setPhones(JsonUtils.toJsonString(targetPhones)) - .setContent(StrUtils.replace(smsTemplate.getContent(), smsBody.getParams())); + .setContent(smsBody.getParams().toString()); if (isAsync) { smsLog.setSendStatus(SmsSendStatusEnum.ASYNC.getStatus()); } else { smsLog.setSendStatus(SmsSendStatusEnum.SENDING.getStatus()); } - smsLogMapper.insert(smsLog); + logMapper.insert(smsLog); return smsLog.getId(); } } @Override - public void afterSendLog(Long logId, SmsResult result) { - SmsLogDO smsLog = new SmsLogDO(); + public void afterSendLog(Long logId, SmsResult result) { + SysSmsLogDO smsLog = new SysSmsLogDO(); smsLog.setId(logId); if (result.getSuccess()) { smsLog.setSendStatus(SmsSendStatusEnum.SUCCESS.getStatus()); @@ -66,7 +63,7 @@ public class SmsLogServiceImpl implements SmsLogService { smsLog.setSendStatus(SmsSendStatusEnum.FAIL.getStatus()); smsLog.setRemark(result.getMessage() + JsonUtils.toJsonString(result.getResult())); } - smsLogMapper.updateById(smsLog); + logMapper.updateById(smsLog); } } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsServiceImpl.java new file mode 100644 index 000000000..eb4019fee --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsServiceImpl.java @@ -0,0 +1,54 @@ +package cn.iocoder.dashboard.modules.system.service.sms.impl; + +import cn.iocoder.dashboard.framework.sms.client.AbstractSmsClient; +import cn.iocoder.dashboard.framework.sms.core.SmsBody; +import cn.iocoder.dashboard.framework.sms.core.SmsResult; +import cn.iocoder.dashboard.modules.system.mq.producer.sms.SmsProducer; +import cn.iocoder.dashboard.modules.system.service.sms.SysSmsChannelService; +import cn.iocoder.dashboard.modules.system.service.sms.SysSmsLogService; +import cn.iocoder.dashboard.modules.system.service.sms.SysSmsService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 短信日志Service实现类 + * + * @author zzf + * @date 2021/1/25 9:25 + */ +@Service +public class SysSmsServiceImpl implements SysSmsService { + + @Resource + private SysSmsChannelService channelService; + + @Resource + private SysSmsLogService logService; + + @Resource + private SmsProducer smsProducer; + + @Override + public SmsResult send(SmsBody smsBody, List targetPhones) { + AbstractSmsClient client = channelService.getSmsClient(smsBody.getTemplateCode()); + String templateApiId = channelService.getSmsTemplateApiIdByCode(smsBody.getTemplateCode()); + Long logId = logService.beforeSendLog(smsBody, targetPhones, client, false); + + SmsResult result = client.send(templateApiId, smsBody, targetPhones); + + logService.afterSendLog(logId, result); + + return result; + } + + // TODO FROM 芋艿 to ZZF:可能要讨论下,对于短信发送来说,貌似只提供异步发送即可。对于业务来说,一定不能依赖短信的发送结果。 + // 我的想法是1、很多短信,比如验证码,总还是需要知道是否发送成功的。2、别人可以不用,我们不能没有。3、实现挺简单的,个人觉得无需纠结。 + @Override + public void sendAsync(SmsBody smsBody, List targetPhones) { + AbstractSmsClient client = channelService.getSmsClient(smsBody.getTemplateCode()); + logService.beforeSendLog(smsBody, targetPhones, client, true); + smsProducer.sendSmsSendMessage(smsBody, targetPhones); + } +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsTemplateServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsTemplateServiceImpl.java similarity index 57% rename from src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsTemplateServiceImpl.java rename to src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsTemplateServiceImpl.java index 2826d7fca..0bf7ca1a0 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsTemplateServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsTemplateServiceImpl.java @@ -1,6 +1,6 @@ package cn.iocoder.dashboard.modules.system.service.sms.impl; -import cn.iocoder.dashboard.modules.system.service.sms.SmsTemplateService; +import cn.iocoder.dashboard.modules.system.service.sms.SysSmsTemplateService; import org.springframework.stereotype.Service; /** @@ -10,5 +10,5 @@ import org.springframework.stereotype.Service; * @date 2021/1/25 9:25 */ @Service -public class SmsTemplateServiceImpl implements SmsTemplateService { +public class SysSmsTemplateServiceImpl implements SysSmsTemplateService { } From 2a4d9f43eb57d78f6dbabb9956aa393644730f29 Mon Sep 17 00:00:00 2001 From: zengzefeng <986510453@qq.com> Date: Wed, 24 Feb 2021 14:59:28 +0800 Subject: [PATCH 007/126] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=9F=AD=E4=BF=A1?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E7=9B=B8=E5=85=B3=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../framework/sms/client/AliyunSmsClient.java | 13 ++++++++++++- .../dashboard/framework/sms/core/SmsResult.java | 2 +- .../framework/sms/core/SmsResultDetail.java | 2 +- .../sms/core/property/SmsTemplateProperty.java | 2 +- .../modules/system/enums/sms/SmsSendStatusEnum.java | 5 ++++- .../service/sms/impl/SysSmsLogServiceImpl.java | 8 ++++++++ 6 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/client/AliyunSmsClient.java b/src/main/java/cn/iocoder/dashboard/framework/sms/client/AliyunSmsClient.java index f1976589c..ef6ed73f3 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/client/AliyunSmsClient.java +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/client/AliyunSmsClient.java @@ -5,6 +5,7 @@ import cn.iocoder.dashboard.framework.sms.core.SmsBody; import cn.iocoder.dashboard.framework.sms.core.SmsResult; import cn.iocoder.dashboard.framework.sms.core.SmsResultDetail; import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperty; +import cn.iocoder.dashboard.modules.system.enums.sms.SmsSendStatusEnum; import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.IAcsClient; import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsRequest; @@ -85,11 +86,21 @@ public class AliyunSmsClient extends AbstractSmsClient { resultDetail.setCreateTime(DateUtil.parseDateTime(s.getSendDate())); resultDetail.setMessage(s.getContent()); resultDetail.setPhone(s.getPhoneNum()); - resultDetail.setStatus(Math.toIntExact(s.getSendStatus())); + resultDetail.setStatus(statusConvert(s.getSendStatus())); resultDetailList.add(resultDetail); }); resultBody.setResult(resultDetailList); return resultBody; } + private int statusConvert(Long aliSendStatus) { + if (aliSendStatus == 1L) { + return SmsSendStatusEnum.SUCCESS.getStatus(); + } + if (aliSendStatus == 2L) { + return SmsSendStatusEnum.FAIL.getStatus(); + } + return SmsSendStatusEnum.WAITING.getStatus(); + } + } diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResult.java b/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResult.java index 64bbd1e4b..9abffa4e8 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResult.java +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResult.java @@ -12,7 +12,7 @@ import java.util.List; public class SmsResult implements Serializable { /** - * 是否成功 + * 是否成功(发送短信的请求是否成功) */ // TODO FROM 芋艿 to zzf:未来要加一个 code,将不同平台的短信失败的情况,做一次统一的收敛。 DONE private Boolean success; diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResultDetail.java b/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResultDetail.java index 6ed9fbcae..67de28938 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResultDetail.java +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResultDetail.java @@ -12,7 +12,7 @@ import java.util.Date; public class SmsResultDetail implements Serializable { /** - * 状态 1成功 2失败 3等待回执 + * 短信发送状态 {@link cn.iocoder.dashboard.modules.system.enums.sms.SmsSendStatusEnum} */ private Integer status; diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/core/property/SmsTemplateProperty.java b/src/main/java/cn/iocoder/dashboard/framework/sms/core/property/SmsTemplateProperty.java index a613a5453..961863cc9 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/core/property/SmsTemplateProperty.java +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/core/property/SmsTemplateProperty.java @@ -7,7 +7,7 @@ import javax.validation.constraints.NotEmpty; /** * 渠道模板VO类 - * TODO FROM 芋艿 TO zzf:模板是不是不要提供到 client 里面,而是交给 factory 统一维护就好。不然,模板修改时候,刷新 client 会比较麻烦。 + * TODO FROM 芋艿 TO zzf:模板是不是不要提供到 client 里面,而是交给 factory 统一维护就好。不然,模板修改时候,刷新 client 会比较麻烦。 DONE * * * @author zzf diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/enums/sms/SmsSendStatusEnum.java b/src/main/java/cn/iocoder/dashboard/modules/system/enums/sms/SmsSendStatusEnum.java index 426e4cb80..846c70967 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/enums/sms/SmsSendStatusEnum.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/enums/sms/SmsSendStatusEnum.java @@ -22,8 +22,11 @@ public enum SmsSendStatusEnum { //失败 FAIL(3), + //等待回执 + WAITING(4), + //成功 - SUCCESS(4); + SUCCESS(5); private final int status; diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsLogServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsLogServiceImpl.java index 7accf76db..a89f80ff7 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsLogServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsLogServiceImpl.java @@ -59,6 +59,14 @@ public class SysSmsLogServiceImpl implements SysSmsLogService { smsLog.setId(logId); if (result.getSuccess()) { smsLog.setSendStatus(SmsSendStatusEnum.SUCCESS.getStatus()); + SysSmsLogDO smsLogDO = logMapper.selectById(logId); + result.getResult().forEach(s -> { + smsLogDO.setPhones(s.getPhone()); + smsLogDO.setSendStatus(s.getStatus()); + smsLogDO.setRemark(s.getMessage()); + smsLogDO.setCreateTime(s.getCreateTime()); + logMapper.insert(smsLogDO); + }); } else { smsLog.setSendStatus(SmsSendStatusEnum.FAIL.getStatus()); smsLog.setRemark(result.getMessage() + JsonUtils.toJsonString(result.getResult())); From cd2a01819b98cd43bcee34db0e48d23f9d3b810a Mon Sep 17 00:00:00 2001 From: YunaiV Date: Thu, 25 Feb 2021 01:24:06 +0800 Subject: [PATCH 008/126] =?UTF-8?q?=E7=9F=AD=E4=BF=A1=20code=20review=2020?= =?UTF-8?q?20-02-25?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../framework/sms/client/AbstractSmsClient.java | 9 ++++----- .../dashboard/framework/sms/client/AliyunSmsClient.java | 6 ++---- .../dashboard/framework/sms/core/SmsClientFactory.java | 4 ++-- .../iocoder/dashboard/framework/sms/core/SmsResult.java | 2 -- .../framework/sms/core/enums/SmsChannelEnum.java | 5 +++-- .../framework/sms/core/property/SmsTemplateProperty.java | 2 -- .../system/controller/sms/SmsChannelController.java | 2 -- .../modules/system/mq/consumer/sms/SmsSendConsumer.java | 2 +- .../modules/system/service/sms/SysSmsChannelService.java | 3 --- .../service/sms/impl/SysSmsChannelServiceImpl.java | 2 +- 10 files changed, 13 insertions(+), 24 deletions(-) diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/client/AbstractSmsClient.java b/src/main/java/cn/iocoder/dashboard/framework/sms/client/AbstractSmsClient.java index 14ef40d2c..b5e2dbdb9 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/client/AbstractSmsClient.java +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/client/AbstractSmsClient.java @@ -22,7 +22,7 @@ public abstract class AbstractSmsClient implements SmsClient { protected final SmsChannelProperty channelVO; /** - * 构造阿里云短信发送处理 + * 构造阿里云短信发送处理 TODO FROM 芋艿 to zzf:貌似注释不对 * * @param property 阿里云短信配置 */ @@ -30,13 +30,12 @@ public abstract class AbstractSmsClient implements SmsClient { this.channelVO = property; } - public SmsChannelProperty getProperty() { return channelVO; } @Override - public SmsResult send(String templateApiId, SmsBody smsBody, Collection targets) { + public final SmsResult send(String templateApiId, SmsBody smsBody, Collection targets) { SmsResult result; try { beforeSend(templateApiId, smsBody, targets); @@ -50,13 +49,13 @@ public abstract class AbstractSmsClient implements SmsClient { return result; } - /** * 发送消息 * * @param templateApiId 短信模板唯一标识 * @param smsBody 消息内容 * @param targets 发送对象列表 + * @throws Exception 调用发送失败,抛出异常 * @return 短信发送结果 */ public abstract SmsResult doSend(String templateApiId, SmsBody smsBody, Collection targets) throws Exception; @@ -67,7 +66,7 @@ public abstract class AbstractSmsClient implements SmsClient { protected void afterSend(String templateApiId, SmsBody smsBody, Collection targets, SmsResult result) throws Exception { } - + // TODO FROM 芋艿 to zzf:可以考虑抽到 SmsResult 里 SmsResult failResult(String message) { SmsResult resultBody = new SmsResult(); resultBody.setSuccess(false); diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/client/AliyunSmsClient.java b/src/main/java/cn/iocoder/dashboard/framework/sms/client/AliyunSmsClient.java index ef6ed73f3..a2cbbdfd5 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/client/AliyunSmsClient.java +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/client/AliyunSmsClient.java @@ -58,16 +58,14 @@ public class AliyunSmsClient extends AbstractSmsClient { acsClient = new DefaultAcsClient(profile); } - @Override public SmsResult doSend(String templateApiId, SmsBody smsBody, Collection targets) throws Exception { SendSmsRequest request = new SendSmsRequest(); request.setSysMethod(MethodType.POST); - request.setPhoneNumbers(StringUtils.join(targets, ",")); + request.setPhoneNumbers(StringUtils.join(targets, ",")); // TODO FROM 芋艿 to zzf:统一使用 Hutool 工具类嘿。 request.setSignName(channelVO.getApiSignatureId()); request.setTemplateCode(templateApiId); request.setTemplateParam(smsBody.getParamsStr()); - // TODO FROM 芋艿 TO zzf:try catch 咱是不是可以交给 abstract 来做。这样,异常处理,重试,限流等等,都可以酱紫 DONE SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request); boolean result = OK.equals(sendSmsResponse.getCode()); @@ -78,7 +76,7 @@ public class AliyunSmsClient extends AbstractSmsClient { resultBody.setSuccess(result); QuerySendDetailsRequest querySendDetailsRequest = new QuerySendDetailsRequest(); querySendDetailsRequest.setBizId(sendSmsResponse.getBizId()); - + // TODO FROM 芋艿 to zzf:发送完之后,基于短信平台回调,去更新回执状态。短信发送是否成功,和最终用户收到,是两个维度。这块有困惑,可以微信,我给个截图哈。 QuerySendDetailsResponse acsResponse = acsClient.getAcsResponse(querySendDetailsRequest); List resultDetailList = new ArrayList<>(Integer.parseInt(acsResponse.getTotalCount())); acsResponse.getSmsSendDetailDTOs().forEach(s -> { diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsClientFactory.java b/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsClientFactory.java index 4cd8e0f89..a54952701 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsClientFactory.java +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsClientFactory.java @@ -42,7 +42,6 @@ public class SmsClientFactory { * @return 客户端id(默认channelId) */ public Long createClient(SmsChannelProperty propertyVO) { - // TODO FROM 芋艿 TO zzf:参数的校验,可以考虑统一使用 validation。 DONE AbstractSmsClient sender = createClient(SmsChannelEnum.getByCode(propertyVO.getCode()), propertyVO); smsSenderMap.put(propertyVO.getId(), sender); return propertyVO.getId(); @@ -77,7 +76,7 @@ public class SmsClientFactory { * 添加或修改短信模板信息缓存 */ public void addOrUpdateTemplateCache(Collection templateProperties) { - templateProperties.forEach(s -> templatePropertyMap.put(s.getCode(), s)); + templateProperties.forEach(s -> addOrUpdateTemplateCache(templateProperties)); } @@ -102,4 +101,5 @@ public class SmsClientFactory { } return smsTemplateProperty.getApiTemplateId(); } + } diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResult.java b/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResult.java index 9abffa4e8..dbc976421 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResult.java +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResult.java @@ -14,7 +14,6 @@ public class SmsResult implements Serializable { /** * 是否成功(发送短信的请求是否成功) */ - // TODO FROM 芋艿 to zzf:未来要加一个 code,将不同平台的短信失败的情况,做一次统一的收敛。 DONE private Boolean success; /** @@ -30,7 +29,6 @@ public class SmsResult implements Serializable { /** * 返回值 */ - // TODO FROM 芋艿 to zzf:是不是统一各个平台的返回结果,这样对调用方来说统一。因为作为统一的短信客户端,最好让上层不太需要知道太具体。黑河诶 DONE private List result; } diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/core/enums/SmsChannelEnum.java b/src/main/java/cn/iocoder/dashboard/framework/sms/core/enums/SmsChannelEnum.java index 5aebdfa6d..255a705fd 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/core/enums/SmsChannelEnum.java +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/core/enums/SmsChannelEnum.java @@ -4,7 +4,7 @@ import lombok.AllArgsConstructor; import lombok.Getter; /** - * 短信渠道枚举 TODO FROM 芋艿 TO zzf:属于短信的枚举类,可以放到 framework/sms 下 DONE + * 短信渠道枚举 * * @author zzf * @date 2021/1/25 10:56 @@ -16,7 +16,7 @@ public enum SmsChannelEnum { ALI("ALI", "阿里"), HUA_WEI("HUA_WEI", "华为"), QI_NIU("QI_NIU", "七牛"), - TENCENT("TENCENT", "腾讯"); // TODO FROM 芋艿 to zzf:TEN 有后鼻音哈,要被马爸爸打了。。。 DONE + TENCENT("TENCENT", "腾讯"); private final String code; @@ -30,4 +30,5 @@ public enum SmsChannelEnum { } return null; } + } diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/core/property/SmsTemplateProperty.java b/src/main/java/cn/iocoder/dashboard/framework/sms/core/property/SmsTemplateProperty.java index 961863cc9..ebd3a7a95 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/core/property/SmsTemplateProperty.java +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/core/property/SmsTemplateProperty.java @@ -7,8 +7,6 @@ import javax.validation.constraints.NotEmpty; /** * 渠道模板VO类 - * TODO FROM 芋艿 TO zzf:模板是不是不要提供到 client 里面,而是交给 factory 统一维护就好。不然,模板修改时候,刷新 client 会比较麻烦。 DONE - * * * @author zzf * @date 2021/1/25 17:03 diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SmsChannelController.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SmsChannelController.java index f32074cbf..ddc492c23 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SmsChannelController.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SmsChannelController.java @@ -37,12 +37,10 @@ public class SmsChannelController { return success(service.getSmsChannelEnums()); } - @ApiOperation("添加消息渠道") @PostMapping("/create") public CommonResult add(@Validated @RequestBody SmsChannelCreateReqVO reqVO) { return success(service.createSmsChannel(reqVO)); } - } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/sms/SmsSendConsumer.java b/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/sms/SmsSendConsumer.java index 53cce0bc2..61c81f54c 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/sms/SmsSendConsumer.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/sms/SmsSendConsumer.java @@ -24,7 +24,7 @@ public class SmsSendConsumer extends AbstractChannelMessageListener Date: Fri, 26 Feb 2021 11:30:37 +0800 Subject: [PATCH 009/126] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=83=A8=E5=88=86?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sms/client/AbstractSmsClient.java | 15 ++---- .../framework/sms/client/AliyunSmsClient.java | 4 +- .../framework/sms/core/SmsClientFactory.java | 2 +- .../framework/sms/core/SmsResult.java | 7 +++ .../convert/sms/SmsTemplateConvert.java | 3 ++ .../mq/consumer/sms/SmsSendConsumer.java | 2 +- .../service/sms/SysSmsChannelService.java | 4 +- .../sms/impl/SysSmsChannelServiceImpl.java | 51 +++++++++---------- 8 files changed, 45 insertions(+), 43 deletions(-) diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/client/AbstractSmsClient.java b/src/main/java/cn/iocoder/dashboard/framework/sms/client/AbstractSmsClient.java index b5e2dbdb9..d40d636e4 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/client/AbstractSmsClient.java +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/client/AbstractSmsClient.java @@ -22,9 +22,9 @@ public abstract class AbstractSmsClient implements SmsClient { protected final SmsChannelProperty channelVO; /** - * 构造阿里云短信发送处理 TODO FROM 芋艿 to zzf:貌似注释不对 + * 短信客户端有参构造函数 * - * @param property 阿里云短信配置 + * @param property 短信配置 */ public AbstractSmsClient(SmsChannelProperty property) { this.channelVO = property; @@ -44,7 +44,7 @@ public abstract class AbstractSmsClient implements SmsClient { } catch (Exception e) { // exception handle log.debug(e.getMessage(), e); - return failResult("发送异常: " + e.getMessage()); + return SmsResult.failResult("发送异常: " + e.getMessage()); } return result; } @@ -55,8 +55,8 @@ public abstract class AbstractSmsClient implements SmsClient { * @param templateApiId 短信模板唯一标识 * @param smsBody 消息内容 * @param targets 发送对象列表 - * @throws Exception 调用发送失败,抛出异常 * @return 短信发送结果 + * @throws Exception 调用发送失败,抛出异常 */ public abstract SmsResult doSend(String templateApiId, SmsBody smsBody, Collection targets) throws Exception; @@ -66,11 +66,4 @@ public abstract class AbstractSmsClient implements SmsClient { protected void afterSend(String templateApiId, SmsBody smsBody, Collection targets, SmsResult result) throws Exception { } - // TODO FROM 芋艿 to zzf:可以考虑抽到 SmsResult 里 - SmsResult failResult(String message) { - SmsResult resultBody = new SmsResult(); - resultBody.setSuccess(false); - resultBody.setMessage(message); - return resultBody; - } } diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/client/AliyunSmsClient.java b/src/main/java/cn/iocoder/dashboard/framework/sms/client/AliyunSmsClient.java index a2cbbdfd5..f88d6f291 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/client/AliyunSmsClient.java +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/client/AliyunSmsClient.java @@ -1,6 +1,8 @@ package cn.iocoder.dashboard.framework.sms.client; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; import cn.iocoder.dashboard.framework.sms.core.SmsBody; import cn.iocoder.dashboard.framework.sms.core.SmsResult; import cn.iocoder.dashboard.framework.sms.core.SmsResultDetail; @@ -62,7 +64,7 @@ public class AliyunSmsClient extends AbstractSmsClient { public SmsResult doSend(String templateApiId, SmsBody smsBody, Collection targets) throws Exception { SendSmsRequest request = new SendSmsRequest(); request.setSysMethod(MethodType.POST); - request.setPhoneNumbers(StringUtils.join(targets, ",")); // TODO FROM 芋艿 to zzf:统一使用 Hutool 工具类嘿。 + request.setPhoneNumbers(ArrayUtil.join(targets, ",")); request.setSignName(channelVO.getApiSignatureId()); request.setTemplateCode(templateApiId); request.setTemplateParam(smsBody.getParamsStr()); diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsClientFactory.java b/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsClientFactory.java index a54952701..88c02cb87 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsClientFactory.java +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsClientFactory.java @@ -76,7 +76,7 @@ public class SmsClientFactory { * 添加或修改短信模板信息缓存 */ public void addOrUpdateTemplateCache(Collection templateProperties) { - templateProperties.forEach(s -> addOrUpdateTemplateCache(templateProperties)); + templateProperties.forEach(this::addOrUpdateTemplateCache); } diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResult.java b/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResult.java index dbc976421..46306322d 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResult.java +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResult.java @@ -31,4 +31,11 @@ public class SmsResult implements Serializable { */ private List result; + + public static SmsResult failResult(String message) { + SmsResult resultBody = new SmsResult(); + resultBody.setSuccess(false); + resultBody.setMessage(message); + return resultBody; + } } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/convert/sms/SmsTemplateConvert.java b/src/main/java/cn/iocoder/dashboard/modules/system/convert/sms/SmsTemplateConvert.java index aaac0abdf..febac15fc 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/convert/sms/SmsTemplateConvert.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/convert/sms/SmsTemplateConvert.java @@ -1,6 +1,7 @@ package cn.iocoder.dashboard.modules.system.convert.sms; import cn.iocoder.dashboard.common.pojo.PageResult; +import cn.iocoder.dashboard.framework.sms.core.property.SmsTemplateProperty; import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsTemplateVO; import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SysSmsChannelDO; import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SysSmsTemplateDO; @@ -23,4 +24,6 @@ public interface SmsTemplateConvert { SmsTemplateVO convert(SysSmsTemplateDO bean); + List convertProperty(List bean); + } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/sms/SmsSendConsumer.java b/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/sms/SmsSendConsumer.java index 61c81f54c..f5f9109e2 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/sms/SmsSendConsumer.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/sms/SmsSendConsumer.java @@ -24,7 +24,7 @@ public class SmsSendConsumer extends AbstractChannelMessageListener templateCode2ChannelIdMap = new ConcurrentHashMap<>(32); - @Autowired + @Resource private SmsClientFactory clientFactory; - // TODO FROM 芋艿 to zzf:方法要放在成员变量下面; - /** - * 初始化短信客户端 - */ - @PostConstruct - @Override - public void initSmsClient() { - // 查询有效渠道信息 - List channelDOList = channelMapper.selectEnabledList(); - List propertyList = SmsChannelConvert.INSTANCE.convertProperties(channelDOList); - - // 遍历渠道生成client并获取模板缓存 - propertyList.forEach(channelProperty -> { - Long clientId = clientFactory.createClient(channelProperty); - List templateDOList = templateMapper.selectListByChannelId(channelProperty.getId()); - if (ObjectUtil.isNotEmpty(templateDOList)) { - templateDOList.forEach(template -> { - templateCode2ChannelIdMap.put(template.getCode(), clientId); - }); - SmsTemplateConvert.INSTANCE.convert(templateDOList); - } - }); - } - @Resource private SysSmsChannelMapper channelMapper; @Resource private SysSmsTemplateMapper templateMapper; + + @PostConstruct + @Override + public void initSmsClientAndCacheSmsTemplate() { + // 查询有效渠道信息 + List channelDOList = channelMapper.selectEnabledList(); + List propertyList = SmsChannelConvert.INSTANCE.convertProperties(channelDOList); + + // 遍历渠道生成client、获取模板并缓存 + propertyList.forEach(channelProperty -> { + List templateDOList = templateMapper.selectListByChannelId(channelProperty.getId()); + if (ObjectUtil.isNotEmpty(templateDOList)) { + Long clientId = clientFactory.createClient(channelProperty); + templateDOList.forEach(template -> templateCode2ChannelIdMap.put(template.getCode(), clientId)); + + List templatePropertyList = SmsTemplateConvert.INSTANCE.convertProperty(templateDOList); + clientFactory.addOrUpdateTemplateCache(templatePropertyList); + } + }); + } + @Override public PageResult pageSmsChannels(SmsChannelPageReqVO reqVO) { return SmsChannelConvert.INSTANCE.convertPage(channelMapper.selectChannelPage(reqVO)); @@ -106,9 +105,7 @@ public class SysSmsChannelServiceImpl implements SysSmsChannelService { return null; } List channelAllVOList = SmsChannelConvert.INSTANCE.convert(channelDOList); - channelAllVOList.forEach(smsChannelDO -> { - List templateDOList = templateMapper.selectListByChannelId(smsChannelDO.getId()); if (ObjectUtil.isNull(templateDOList)) { templateDOList = new ArrayList<>(); From 4438b6d4aba6a9cf7b8643a42881e41e89902b1b Mon Sep 17 00:00:00 2001 From: budliang Date: Sat, 6 Mar 2021 19:57:39 +0800 Subject: [PATCH 010/126] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=80=9A=E7=9F=A5?= =?UTF-8?q?=E5=85=AC=E5=91=8A=E6=A8=A1=E5=9D=97=E5=8D=95=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../notice/SysNoticeServiceImplTest.java | 111 ++++++++++++++++++ src/test/resources/sql/create_tables.sql | 14 +++ 2 files changed, 125 insertions(+) create mode 100644 src/test/java/cn/iocoder/dashboard/modules/system/service/notice/SysNoticeServiceImplTest.java diff --git a/src/test/java/cn/iocoder/dashboard/modules/system/service/notice/SysNoticeServiceImplTest.java b/src/test/java/cn/iocoder/dashboard/modules/system/service/notice/SysNoticeServiceImplTest.java new file mode 100644 index 000000000..065c07e37 --- /dev/null +++ b/src/test/java/cn/iocoder/dashboard/modules/system/service/notice/SysNoticeServiceImplTest.java @@ -0,0 +1,111 @@ +package cn.iocoder.dashboard.modules.system.service.notice; + +import cn.iocoder.dashboard.BaseSpringBootUnitTest; +import cn.iocoder.dashboard.common.enums.CommonStatusEnum; +import cn.iocoder.dashboard.modules.system.controller.notice.vo.SysNoticeCreateReqVO; +import cn.iocoder.dashboard.modules.system.controller.notice.vo.SysNoticeUpdateReqVO; +import cn.iocoder.dashboard.modules.system.dal.dataobject.notice.SysNoticeDO; +import cn.iocoder.dashboard.modules.system.dal.mysql.notice.SysNoticeMapper; +import cn.iocoder.dashboard.modules.system.enums.notice.SysNoticeTypeEnum; +import org.junit.jupiter.api.Test; + +import javax.annotation.Resource; + +import java.util.function.Consumer; + +import static cn.hutool.core.util.RandomUtil.randomEle; +import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.dashboard.util.RandomUtils.randomPojo; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; + + +class SysNoticeServiceImplTest extends BaseSpringBootUnitTest { + + @Resource + private SysNoticeService sysNoticeService; + + @Resource + private SysNoticeMapper sysNoticeMapper; + + @Test + void testPageNotices_success() { + // todo: 待更新 + } + + @Test + void testGetNotice_success() { + // 插入前置数据 + int noticeId = sysNoticeMapper.insert(randomSysNoticeDO()); + + // 查询 + assertNotNull(sysNoticeService.getNotice(new Long(noticeId))); + } + + @Test + void testCreateNotice_success() { + // 准备参数 + SysNoticeCreateReqVO reqVO = randomSysNoticeCreateReqVO(); + + // 校验插入是否成功 + Long noticeId = sysNoticeService.createNotice(reqVO); + assertNotNull(noticeId); + + // 校验插入属性是否正确 + SysNoticeDO notice = sysNoticeMapper.selectById(noticeId); + assertPojoEquals(reqVO, notice); + } + + @Test + void testUpdateNotice_success() { + // 插入前置数据 + int noticeId = sysNoticeMapper.insert(randomSysNoticeDO()); + + // 准备更新参数 + SysNoticeUpdateReqVO reqVO = randomSysNoticeUpdateReqVO(o -> o.setId(new Long(noticeId))); + + // 更新 + sysNoticeService.updateNotice(reqVO); + + // 检验是否更新成功 + SysNoticeDO notice = sysNoticeMapper.selectById(noticeId); + assertPojoEquals(reqVO, notice); + } + + @Test + void testDeleteNotice_success() { + // 插入前置数据 + int noticeId = sysNoticeMapper.insert(randomSysNoticeDO()); + + // 删除 + sysNoticeService.deleteNotice(new Long(noticeId)); + + // 检查是否删除成功 + assertNull(sysNoticeMapper.selectById(noticeId)); + } + + @SafeVarargs + private static SysNoticeDO randomSysNoticeDO(Consumer... consumers) { + SysNoticeDO notice = randomPojo(SysNoticeDO.class, consumers); + notice.setType(randomEle(SysNoticeTypeEnum.values()).getType()); + notice.setStatus(CommonStatusEnum.ENABLE.getStatus()); + return notice; + } + + @SafeVarargs + private static SysNoticeUpdateReqVO randomSysNoticeUpdateReqVO(Consumer... consumers) { + SysNoticeUpdateReqVO reqVO = randomPojo(SysNoticeUpdateReqVO.class, consumers); + reqVO.setType(randomEle(SysNoticeTypeEnum.values()).getType()); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + return reqVO; + } + + private static SysNoticeCreateReqVO randomSysNoticeCreateReqVO() { + SysNoticeCreateReqVO reqVO = randomPojo(SysNoticeCreateReqVO.class); + reqVO.setType(randomEle(SysNoticeTypeEnum.values()).getType()); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + return reqVO; + } + + +} \ No newline at end of file diff --git a/src/test/resources/sql/create_tables.sql b/src/test/resources/sql/create_tables.sql index 183554519..611e38d99 100644 --- a/src/test/resources/sql/create_tables.sql +++ b/src/test/resources/sql/create_tables.sql @@ -100,3 +100,17 @@ CREATE TABLE IF NOT EXISTS "sys_menu" ( "deleted" bit NOT NULL DEFAULT FALSE, PRIMARY KEY ("id") ) COMMENT '菜单权限表'; + +CREATE TABLE IF NOT EXISTS "sys_notice" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "title" varchar(50) NOT NULL, + "content" text NOT NULL, + "notice_type" tinyint(4) NOT NULL, + "status" tinyint(4) NOT NULL DEFAULT '0', + "create_by" varchar(64) DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "update_by" varchar(64) DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT '0', + PRIMARY KEY ("id") +) COMMENT='通知公告表'; From 9b54b58ec378054df16031c9508b82549147e5b1 Mon Sep 17 00:00:00 2001 From: wangkai Date: Sat, 6 Mar 2021 20:05:57 +0800 Subject: [PATCH 011/126] =?UTF-8?q?system=E6=A8=A1=E5=9D=97=20logger=20?= =?UTF-8?q?=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../logger/SysLoginLogServiceImplTest.java | 171 ++++++++++++++ .../logger/SysOperateLogServiceImplTest.java | 216 ++++++++++++++++++ src/test/resources/sql/clean.sql | 3 + src/test/resources/sql/create_tables.sql | 68 ++++++ 4 files changed, 458 insertions(+) create mode 100644 src/test/java/cn/iocoder/dashboard/modules/system/service/logger/SysLoginLogServiceImplTest.java create mode 100644 src/test/java/cn/iocoder/dashboard/modules/system/service/logger/SysOperateLogServiceImplTest.java diff --git a/src/test/java/cn/iocoder/dashboard/modules/system/service/logger/SysLoginLogServiceImplTest.java b/src/test/java/cn/iocoder/dashboard/modules/system/service/logger/SysLoginLogServiceImplTest.java new file mode 100644 index 000000000..11937f1a7 --- /dev/null +++ b/src/test/java/cn/iocoder/dashboard/modules/system/service/logger/SysLoginLogServiceImplTest.java @@ -0,0 +1,171 @@ +package cn.iocoder.dashboard.modules.system.service.logger; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.ReflectUtil; +import cn.iocoder.dashboard.BaseSpringBootUnitTest; +import cn.iocoder.dashboard.common.pojo.PageResult; +import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.dashboard.framework.tracer.core.util.TracerUtils; +import cn.iocoder.dashboard.modules.system.controller.logger.vo.loginlog.SysLoginLogCreateReqVO; +import cn.iocoder.dashboard.modules.system.controller.logger.vo.loginlog.SysLoginLogExportReqVO; +import cn.iocoder.dashboard.modules.system.controller.logger.vo.loginlog.SysLoginLogPageReqVO; +import cn.iocoder.dashboard.modules.system.convert.logger.SysLoginLogConvert; +import cn.iocoder.dashboard.modules.system.dal.dataobject.logger.SysLoginLogDO; +import cn.iocoder.dashboard.modules.system.dal.mysql.logger.SysLoginLogMapper; +import cn.iocoder.dashboard.modules.system.enums.logger.SysLoginLogTypeEnum; +import cn.iocoder.dashboard.modules.system.enums.logger.SysLoginResultEnum; +import cn.iocoder.dashboard.modules.system.service.logger.impl.SysLoginLogServiceImpl; +import cn.iocoder.dashboard.util.RandomUtils; +import cn.iocoder.dashboard.util.object.ObjectUtils; +import org.junit.jupiter.api.Test; + +import javax.annotation.Resource; +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.dashboard.util.date.DateUtils.buildTime; +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class SysLoginLogServiceImplTest extends BaseSpringBootUnitTest { + + @Resource + private SysLoginLogServiceImpl sysLoginLogService; + + @Resource + private SysLoginLogMapper loginLogMapper; + + @Test + public void testCreateLoginLog() { + + String traceId = TracerUtils.getTraceId(); + SysLoginLogCreateReqVO reqVO = RandomUtils.randomPojo(SysLoginLogCreateReqVO.class, vo -> { + // 指定随机的范围,避免超出范围入库失败 + vo.setLogType(RandomUtil.randomEle(SysLoginLogTypeEnum.values()).getType()); + vo.setResult(RandomUtil.randomEle(SysLoginResultEnum.values()).getResult()); + // 使用TracerUtils生成的TraceId + vo.setTraceId(traceId); + }); + + + // 执行service方法 + sysLoginLogService.createLoginLog(reqVO); + + // 查询插入的数据 + SysLoginLogDO sysLoginLogDO = loginLogMapper.selectOne("trace_id", traceId); + + // 断言,忽略基本字段 + assertPojoEquals( + SysLoginLogConvert.INSTANCE.convert(reqVO), + sysLoginLogDO, + getBaseDOFields() + ); + } + + + @Test + public void testGetLoginLogPage() { + + // 构造测试数据 + + // 登录成功的 + SysLoginLogDO loginLogDO = RandomUtils.randomPojo(SysLoginLogDO.class, logDO -> { + logDO.setLogType(RandomUtil.randomEle(SysLoginLogTypeEnum.values()).getType()); + logDO.setTraceId(TracerUtils.getTraceId()); + + logDO.setUserIp("192.168.199.16"); + logDO.setUsername("wangkai"); + logDO.setCreateTime(buildTime(2021, 3, 6)); + logDO.setResult(SysLoginResultEnum.SUCCESS.getResult()); + }); + loginLogMapper.insert(loginLogDO); + + // 下面几个都是不匹配的数据 + // 登录失败的 + loginLogMapper.insert(ObjectUtils.clone(loginLogDO, logDO -> logDO.setResult(SysLoginResultEnum.CAPTCHA_CODE_ERROR.getResult()))); + // 不同ip段的 + loginLogMapper.insert(ObjectUtils.clone(loginLogDO, logDO -> logDO.setUserIp("192.168.128.18"))); + // 不同username + loginLogMapper.insert(ObjectUtils.clone(loginLogDO, logDO -> logDO.setUsername("yunai"))); + // 构造一个早期时间 2021-02-06 00:00:00 + loginLogMapper.insert(ObjectUtils.clone(loginLogDO, logDO -> logDO.setCreateTime(buildTime(2021, 2, 6)))); + + + // 构造调用参数 + SysLoginLogPageReqVO reqVO = new SysLoginLogPageReqVO(); + reqVO.setUsername("wangkai"); + reqVO.setUserIp("192.168.199"); + reqVO.setStatus(true); + reqVO.setBeginTime(buildTime(2021, 3, 5)); + reqVO.setEndTime(buildTime(2021, 3, 7)); + + // 调用service方法 + PageResult pageResult = sysLoginLogService.getLoginLogPage(reqVO); + + // 断言,只查到了一条符合条件的 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(loginLogDO, pageResult.getList().get(0)); + } + + @Test + public void testGetLoginLogList() { + + // 构造测试数据 + + // 登录成功的 + SysLoginLogDO loginLogDO = RandomUtils.randomPojo(SysLoginLogDO.class, logDO -> { + logDO.setLogType(RandomUtil.randomEle(SysLoginLogTypeEnum.values()).getType()); + logDO.setTraceId(TracerUtils.getTraceId()); + + logDO.setUserIp("192.168.111.16"); + logDO.setUsername("wangxiaokai"); + logDO.setCreateTime(buildTime(2021, 3, 6)); + logDO.setResult(SysLoginResultEnum.SUCCESS.getResult()); + }); + loginLogMapper.insert(loginLogDO); + + // 下面几个都是不匹配的数据 + // 登录失败的 + loginLogMapper.insert(ObjectUtils.clone(loginLogDO, logDO -> logDO.setResult(SysLoginResultEnum.CAPTCHA_CODE_ERROR.getResult()))); + // 不同ip段的 + loginLogMapper.insert(ObjectUtils.clone(loginLogDO, logDO -> logDO.setUserIp("192.168.128.18"))); + // 不同username + loginLogMapper.insert(ObjectUtils.clone(loginLogDO, logDO -> logDO.setUsername("yunai"))); + // 构造一个早期时间 2021-02-06 00:00:00 + loginLogMapper.insert(ObjectUtils.clone(loginLogDO, logDO -> logDO.setCreateTime(buildTime(2021, 2, 6)))); + + + // 构造调用参数 + SysLoginLogExportReqVO reqVO = new SysLoginLogExportReqVO(); + reqVO.setUsername("wangxiaokai"); + reqVO.setUserIp("192.168.111"); + reqVO.setStatus(true); + reqVO.setBeginTime(buildTime(2021, 3, 5)); + reqVO.setEndTime(buildTime(2021, 3, 7)); + + + // 调用service方法 + List loginLogList = sysLoginLogService.getLoginLogList(reqVO); + + // 断言 + assertEquals(1, loginLogList.size()); + assertPojoEquals(loginLogDO, loginLogList.get(0)); + } + + + private static String[] getBaseDOFields() { + Field[] fields = ReflectUtil.getFields(BaseDO.class); + + List collect = Arrays.stream(fields) + .map(Field::getName) + .collect(Collectors.toList()); + collect.add("id"); + + return ArrayUtil.toArray(collect, String.class); + } + +} diff --git a/src/test/java/cn/iocoder/dashboard/modules/system/service/logger/SysOperateLogServiceImplTest.java b/src/test/java/cn/iocoder/dashboard/modules/system/service/logger/SysOperateLogServiceImplTest.java new file mode 100644 index 000000000..86e03bba5 --- /dev/null +++ b/src/test/java/cn/iocoder/dashboard/modules/system/service/logger/SysOperateLogServiceImplTest.java @@ -0,0 +1,216 @@ +package cn.iocoder.dashboard.modules.system.service.logger; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.ReflectUtil; +import cn.iocoder.dashboard.BaseSpringBootUnitTest; +import cn.iocoder.dashboard.common.enums.CommonStatusEnum; +import cn.iocoder.dashboard.common.exception.enums.GlobalErrorCodeConstants; +import cn.iocoder.dashboard.common.pojo.PageResult; +import cn.iocoder.dashboard.framework.logger.operatelog.core.enums.OperateTypeEnum; +import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.dashboard.framework.tracer.core.util.TracerUtils; +import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogCreateReqVO; +import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogExportReqVO; +import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogPageReqVO; +import cn.iocoder.dashboard.modules.system.convert.logger.SysOperateLogConvert; +import cn.iocoder.dashboard.modules.system.dal.dataobject.logger.SysOperateLogDO; +import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.dashboard.modules.system.dal.mysql.logger.SysOperateLogMapper; +import cn.iocoder.dashboard.modules.system.dal.mysql.user.SysUserMapper; +import cn.iocoder.dashboard.modules.system.enums.common.SysSexEnum; +import cn.iocoder.dashboard.util.RandomUtils; +import cn.iocoder.dashboard.util.object.ObjectUtils; +import org.junit.jupiter.api.Test; + +import javax.annotation.Resource; +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.dashboard.util.date.DateUtils.buildTime; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +public class SysOperateLogServiceImplTest extends BaseSpringBootUnitTest { + + @Resource + private SysOperateLogService sysOperateLogServiceImpl; + + @Resource + private SysOperateLogMapper sysOperateLogMapper; + + @Resource + private SysUserMapper sysUserMapper; + + @Test + public void testCreateOperateLogAsync() throws InterruptedException { + + String traceId = TracerUtils.getTraceId(); + SysOperateLogCreateReqVO reqVO = RandomUtils.randomPojo(SysOperateLogCreateReqVO.class, vo -> { + vo.setTraceId(traceId); + vo.setUserId(RandomUtil.randomLong(1, Long.MAX_VALUE)); + + Map map = new HashMap<>(); + map.put("orderId", 1); + vo.setExts(map); + }); + + // 执行service方法 + sysOperateLogServiceImpl.createOperateLogAsync(reqVO); + + // 等异步执行完 + Thread.sleep(2000); + + // 查询插入的数据 + SysOperateLogDO sysOperateLogDO = sysOperateLogMapper.selectOne("trace_id", traceId); + + // 断言 + assertNotNull(sysOperateLogDO); + // 断言,忽略基本字段 + assertPojoEquals( + SysOperateLogConvert.INSTANCE.convert(reqVO), + sysOperateLogDO, + getBaseDOFields() + ); + } + + + @Test + public void testPageOperateLog() { + + // 构造测试数据 + + // 先构造用户 + SysUserDO user = RandomUtils.randomPojo(SysUserDO.class, sysUserDO -> { + sysUserDO.setNickname("wangkai"); + sysUserDO.setSex(SysSexEnum.MALE.getSEX()); + sysUserDO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + }); + sysUserMapper.insert(user); + Long userId = user.getId(); + + + // 构造操作日志 + SysOperateLogDO sysOperateLogDO = RandomUtils.randomPojo(SysOperateLogDO.class, entity -> { + entity.setTraceId(TracerUtils.getTraceId()); + entity.setUserId(userId); + entity.setModule("order"); + entity.setType(OperateTypeEnum.CREATE.getType()); + entity.setStartTime(buildTime(2021, 3, 6)); + entity.setResultCode(GlobalErrorCodeConstants.SUCCESS.getCode()); + + Map map = new HashMap<>(); + map.put("orderId", 1); + entity.setExts(map); + }); + + sysOperateLogMapper.insert(sysOperateLogDO); + + // 下面几个是不匹配的数据 + // 随机userId + sysOperateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setUserId(userId + 1))); + // module不同 + sysOperateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setModule("user"))); + // type不同 + sysOperateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setType(OperateTypeEnum.IMPORT.getType()))); + // createTime不同 + sysOperateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setStartTime(buildTime(2021, 2, 6)))); + // resultCode不同 + sysOperateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setResultCode(GlobalErrorCodeConstants.BAD_REQUEST.getCode()))); + + // 构造调用参数 + SysOperateLogPageReqVO reqVO = new SysOperateLogPageReqVO(); + reqVO.setUserNickname("wangkai"); + reqVO.setModule("order"); + reqVO.setType(OperateTypeEnum.CREATE.getType()); + reqVO.setBeginTime(buildTime(2021, 3, 5)); + reqVO.setEndTime(buildTime(2021, 3, 7)); + reqVO.setSuccess(true); + + // 调用service方法 + PageResult pageResult = sysOperateLogServiceImpl.pageOperateLog(reqVO); + + // 断言,只查到了一条符合条件的 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(sysOperateLogDO, pageResult.getList().get(0)); + } + + @Test + public void testListOperateLogs() { + + // 构造测试数据 + + // 先构造用户 + SysUserDO user = RandomUtils.randomPojo(SysUserDO.class, sysUserDO -> { + sysUserDO.setNickname("wangkai"); + sysUserDO.setSex(SysSexEnum.MALE.getSEX()); + sysUserDO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + }); + sysUserMapper.insert(user); + Long userId = user.getId(); + + + // 构造操作日志 + SysOperateLogDO sysOperateLogDO = RandomUtils.randomPojo(SysOperateLogDO.class, entity -> { + entity.setTraceId(TracerUtils.getTraceId()); + entity.setUserId(userId); + entity.setModule("order"); + entity.setType(OperateTypeEnum.CREATE.getType()); + entity.setStartTime(buildTime(2021, 3, 6)); + entity.setResultCode(GlobalErrorCodeConstants.SUCCESS.getCode()); + + Map map = new HashMap<>(); + map.put("orderId", 1); + entity.setExts(map); + }); + + sysOperateLogMapper.insert(sysOperateLogDO); + + // 下面几个是不匹配的数据 + // 随机userId + sysOperateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setUserId(userId + 1))); + // module不同 + sysOperateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setModule("user"))); + // type不同 + sysOperateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setType(OperateTypeEnum.IMPORT.getType()))); + // createTime不同 + sysOperateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setStartTime(buildTime(2021, 2, 6)))); + // resultCode不同 + sysOperateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setResultCode(GlobalErrorCodeConstants.BAD_REQUEST.getCode()))); + + // 构造调用参数 + SysOperateLogExportReqVO reqVO = new SysOperateLogExportReqVO(); + reqVO.setUserNickname("wangkai"); + reqVO.setModule("order"); + reqVO.setType(OperateTypeEnum.CREATE.getType()); + reqVO.setBeginTime(buildTime(2021, 3, 5)); + reqVO.setEndTime(buildTime(2021, 3, 7)); + reqVO.setSuccess(true); + + // 调用service方法 + List list = sysOperateLogServiceImpl.listOperateLogs(reqVO); + + // 断言,只查到了一条符合条件的 + assertEquals(1, list.size()); + assertPojoEquals(sysOperateLogDO, list.get(0)); + } + + + private static String[] getBaseDOFields() { + Field[] fields = ReflectUtil.getFields(BaseDO.class); + + List collect = Arrays.stream(fields) + .map(Field::getName) + .collect(Collectors.toList()); + collect.add("id"); + + return ArrayUtil.toArray(collect, String.class); + } + +} diff --git a/src/test/resources/sql/clean.sql b/src/test/resources/sql/clean.sql index 2887b4e9d..e23b555a1 100644 --- a/src/test/resources/sql/clean.sql +++ b/src/test/resources/sql/clean.sql @@ -7,3 +7,6 @@ DELETE FROM "sys_dict_data"; DELETE FROM "sys_role"; DELETE FROM "sys_role_menu"; DELETE FROM "sys_menu"; +DELETE FROM "sys_login_log"; +DELETE FROM "sys_operate_log"; +DELETE FROM "sys_user"; diff --git a/src/test/resources/sql/create_tables.sql b/src/test/resources/sql/create_tables.sql index 183554519..e8f20cfde 100644 --- a/src/test/resources/sql/create_tables.sql +++ b/src/test/resources/sql/create_tables.sql @@ -100,3 +100,71 @@ CREATE TABLE IF NOT EXISTS "sys_menu" ( "deleted" bit NOT NULL DEFAULT FALSE, PRIMARY KEY ("id") ) COMMENT '菜单权限表'; + +CREATE TABLE IF NOT EXISTS `sys_login_log` ( + `id` bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY, + `log_type` bigint(4) NOT NULL, + `trace_id` varchar(64) NOT NULL DEFAULT '', + `username` varchar(50) NOT NULL DEFAULT '', + `result` tinyint(4) NOT NULL, + `user_ip` varchar(50) NOT NULL, + `user_agent` varchar(512) NOT NULL, + `create_by` varchar(64) DEFAULT '', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `update_by` varchar(64) DEFAULT '', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `deleted` bit(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) COMMENT ='系统访问记录'; + + +CREATE TABLE `sys_operate_log` ( + `id` bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY, + `trace_id` varchar(64) NOT NULL DEFAULT '', + `user_id` bigint(20) NOT NULL, + `module` varchar(50) NOT NULL, + `name` varchar(50) NOT NULL, + `operate_type` bigint(4) NOT NULL DEFAULT '0', + `content` varchar(2000) NOT NULL DEFAULT '', + `exts` varchar(512) NOT NULL DEFAULT '', + `request_method` varchar(16) DEFAULT '', + `request_url` varchar(255) DEFAULT '', + `user_ip` varchar(50) DEFAULT NULL, + `user_agent` varchar(200) DEFAULT NULL, + `java_method` varchar(512) NOT NULL DEFAULT '', + `java_method_args` varchar(8000) DEFAULT '', + `start_time` datetime NOT NULL, + `duration` int(11) NOT NULL, + `result_code` int(11) NOT NULL DEFAULT '0', + `result_msg` varchar(512) DEFAULT '', + `result_data` varchar(4000) DEFAULT '', + `create_by` varchar(64) DEFAULT '', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `update_by` varchar(64) DEFAULT '', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `deleted` bit(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) COMMENT ='操作日志记录'; + +create table "sys_user" ( + "id" bigint not null GENERATED BY DEFAULT AS IDENTITY, + "username" varchar(30) not null, + "password" varchar(100) not null default '', + "nickname" varchar(30) not null, + "remark" varchar(500) default null, + "dept_id" bigint default null, + "post_ids" varchar(255) default null, + "email" varchar(50) default '', + "mobile" varchar(11) default '', + "sex" tinyint default '0', + "avatar" varchar(100) default '', + "status" tinyint not null default '0', + "login_ip" varchar(50) default '', + "login_date" timestamp default null, + "create_by" varchar(64) default '', + "create_time" timestamp not null default current_timestamp, + "update_by" varchar(64) default '', + "update_time" timestamp not null default current_timestamp, + "deleted" bit not null default false, + primary key ("id") +) comment '用户信息表'; \ No newline at end of file From a9b6d18da97a53985021a072afe0607c26bba061 Mon Sep 17 00:00:00 2001 From: niudehua <657563945@qq.com> Date: Sat, 6 Mar 2021 14:22:28 +0800 Subject: [PATCH 012/126] =?UTF-8?q?=E5=A4=84=E7=90=86=20pom=20=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E4=BE=9D=E8=B5=96=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/pom.xml b/pom.xml index 4fe238cb9..bab83344e 100644 --- a/pom.xml +++ b/pom.xml @@ -100,6 +100,10 @@ mapstruct org.mapstruct + + guava + com.google.guava + @@ -144,6 +148,12 @@ com.baomidou lock4j-redisson-spring-boot-starter ${lock4j.version} + + + redisson-spring-boot-starter + org.redisson + + @@ -175,6 +185,12 @@ org.springframework.boot spring-boot-starter-test test + + + asm + org.ow2.asm + + From 7342095eb248fe805f0c1cf3e0aab07771e3dfe6 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 6 Mar 2021 20:06:43 +0800 Subject: [PATCH 013/126] =?UTF-8?q?1.=20=E8=B0=83=E6=95=B4=20codegen=20?= =?UTF-8?q?=E7=9A=84=E6=A8=A1=E6=9D=BF=202.=20=E7=BC=96=E5=86=99=20ut=20?= =?UTF-8?q?=E7=9A=84=E4=BB=A3=E7=A0=81=E7=94=9F=E6=88=90=E5=99=A8=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../codegen/impl/ToolCodegenEngine.java | 13 +- src/main/resources/application-dev.yaml | 2 +- src/main/resources/application-local.yaml | 2 +- .../codegen/java/controller/controller.vm | 10 +- .../codegen/java/controller/vo/baseVO.vm | 2 +- .../codegen/java/controller/vo/createReqVO.vm | 2 +- .../codegen/java/controller/vo/excelVO.vm | 2 +- .../codegen/java/controller/vo/exportReqVO.vm | 2 +- .../codegen/java/controller/vo/pageReqVO.vm | 2 +- .../codegen/java/controller/vo/respVO.vm | 2 +- .../codegen/java/controller/vo/updateReqVO.vm | 2 +- .../resources/codegen/java/convert/convert.vm | 6 +- src/main/resources/codegen/java/dal/do.vm | 2 +- src/main/resources/codegen/java/dal/mapper.vm | 6 +- .../resources/codegen/java/service/service.vm | 6 +- .../codegen/java/service/serviceImpl.vm | 14 +-- .../codegen/java/test/serviceTest.vm | 111 ++++++++++++++++++ ...mplTest.java => InfConfigServiceTest.java} | 29 +++-- .../service/job/InfConfigServiceTest.java | 97 +++++++++++++++ .../service/auth/SysAuthServiceImplTest.java | 4 +- .../iocoder/dashboard/util/RandomUtils.java | 2 +- 21 files changed, 270 insertions(+), 48 deletions(-) create mode 100644 src/main/resources/codegen/java/test/serviceTest.vm rename src/test/java/cn/iocoder/dashboard/modules/infra/service/config/{InfConfigServiceImplTest.java => InfConfigServiceTest.java} (92%) create mode 100644 src/test/java/cn/iocoder/dashboard/modules/infra/service/job/InfConfigServiceTest.java diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java b/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java index 927c9775a..7ccf26001 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java @@ -53,9 +53,7 @@ public class ToolCodegenEngine { * value:生成的路径 */ private static final Map TEMPLATES = MapUtil.builder(new LinkedHashMap<>()) // 有序 - // Java - .put(javaTemplatePath("controller/controller"), - javaFilePath("controller/${table.businessName}/${table.className}Controller")) + // Java Main .put(javaTemplatePath("controller/vo/baseVO"), javaFilePath("controller/${table.businessName}/vo/${table.className}BaseVO")) .put(javaTemplatePath("controller/vo/createReqVO"), @@ -70,6 +68,8 @@ public class ToolCodegenEngine { javaFilePath("controller/${table.businessName}/vo/${table.className}ExportReqVO")) .put(javaTemplatePath("controller/vo/excelVO"), javaFilePath("controller/${table.businessName}/vo/${table.className}ExcelVO")) + .put(javaTemplatePath("controller/controller"), + javaFilePath("controller/${table.businessName}/${table.className}Controller")) .put(javaTemplatePath("convert/convert"), javaFilePath("convert/${table.businessName}/${table.className}Convert")) .put(javaTemplatePath("dal/do"), @@ -78,10 +78,13 @@ public class ToolCodegenEngine { javaFilePath("dal/mysql/${table.businessName}/${table.className}Mapper")) .put(javaTemplatePath("enums/errorcode"), javaFilePath("enums/${simpleModuleName_upperFirst}ErrorCodeConstants")) - .put(javaTemplatePath("service/service"), - javaFilePath("service/${table.businessName}/${table.className}Service")) .put(javaTemplatePath("service/serviceImpl"), javaFilePath("service/${table.businessName}/impl/${table.className}ServiceImpl")) + .put(javaTemplatePath("service/service"), + javaFilePath("service/${table.businessName}/${table.className}Service")) + // Java Test + .put(javaTemplatePath("test/serviceTest"), + javaFilePath("service/${table.businessName}/${table.className}ServiceTest")) // Vue .put(vueTemplatePath("views/index.vue"), vueFilePath("views/${table.moduleName}/${classNameVar}/index.vue")) diff --git a/src/main/resources/application-dev.yaml b/src/main/resources/application-dev.yaml index 6e4dfb3de..dbf2ad53b 100644 --- a/src/main/resources/application-dev.yaml +++ b/src/main/resources/application-dev.yaml @@ -154,7 +154,7 @@ yudao: file: base-path: http://127.0.0.1:${server.port}/${yudao.web.api-prefix}/file/get/ codegen: - base-package: ${yudao.info.base-package}.modules + base-package: ${yudao.info.base-package} db-schemas: ${spring.datasource.name} xss: enable: false diff --git a/src/main/resources/application-local.yaml b/src/main/resources/application-local.yaml index 5019cd18d..537156cf7 100644 --- a/src/main/resources/application-local.yaml +++ b/src/main/resources/application-local.yaml @@ -154,7 +154,7 @@ yudao: file: base-path: http://127.0.0.1:${server.port}/${yudao.web.api-prefix}/file/get/ codegen: - base-package: ${yudao.info.base-package}.modules + base-package: ${yudao.info.base-package} db-schemas: ${spring.datasource.name} xss: enable: false diff --git a/src/main/resources/codegen/java/controller/controller.vm b/src/main/resources/codegen/java/controller/controller.vm index 9cb416928..664d7c55b 100644 --- a/src/main/resources/codegen/java/controller/controller.vm +++ b/src/main/resources/codegen/java/controller/controller.vm @@ -1,4 +1,4 @@ -package ${basePackage}.${table.moduleName}.controller.${table.businessName}; +package ${basePackage}.modules.${table.moduleName}.controller.${table.businessName}; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @@ -22,10 +22,10 @@ import ${ExcelUtilsClassName}; import ${OperateLogClassName}; import static ${OperateTypeEnumClassName}.*; -import ${basePackage}.${table.moduleName}.controller.${table.businessName}.vo.*; -import ${basePackage}.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; -import ${basePackage}.${table.moduleName}.convert.${table.businessName}.${table.className}Convert; -import ${basePackage}.${table.moduleName}.service.${table.businessName}.${table.className}Service; +import ${basePackage}.modules.${table.moduleName}.controller.${table.businessName}.vo.*; +import ${basePackage}.modules.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; +import ${basePackage}.modules.${table.moduleName}.convert.${table.businessName}.${table.className}Convert; +import ${basePackage}.modules.${table.moduleName}.service.${table.businessName}.${table.className}Service; @Api(tags = "${table.classComment}") @RestController diff --git a/src/main/resources/codegen/java/controller/vo/baseVO.vm b/src/main/resources/codegen/java/controller/vo/baseVO.vm index 8e8586550..705869a8d 100644 --- a/src/main/resources/codegen/java/controller/vo/baseVO.vm +++ b/src/main/resources/codegen/java/controller/vo/baseVO.vm @@ -1,4 +1,4 @@ -package ${basePackage}.${table.moduleName}.controller.${table.businessName}.vo; +package ${basePackage}.modules.${table.moduleName}.controller.${table.businessName}.vo; import lombok.*; import java.util.*; diff --git a/src/main/resources/codegen/java/controller/vo/createReqVO.vm b/src/main/resources/codegen/java/controller/vo/createReqVO.vm index 3ef3618cd..cfb288241 100644 --- a/src/main/resources/codegen/java/controller/vo/createReqVO.vm +++ b/src/main/resources/codegen/java/controller/vo/createReqVO.vm @@ -1,4 +1,4 @@ -package ${basePackage}.${table.moduleName}.controller.${table.businessName}.vo; +package ${basePackage}.modules.${table.moduleName}.controller.${table.businessName}.vo; import lombok.*; import java.util.*; diff --git a/src/main/resources/codegen/java/controller/vo/excelVO.vm b/src/main/resources/codegen/java/controller/vo/excelVO.vm index 8eb035027..29f777190 100644 --- a/src/main/resources/codegen/java/controller/vo/excelVO.vm +++ b/src/main/resources/codegen/java/controller/vo/excelVO.vm @@ -1,4 +1,4 @@ -package ${basePackage}.${table.moduleName}.controller.${table.businessName}.vo; +package ${basePackage}.modules.${table.moduleName}.controller.${table.businessName}.vo; import lombok.*; import java.util.*; diff --git a/src/main/resources/codegen/java/controller/vo/exportReqVO.vm b/src/main/resources/codegen/java/controller/vo/exportReqVO.vm index 6a5dbc0e6..cd0e340e8 100644 --- a/src/main/resources/codegen/java/controller/vo/exportReqVO.vm +++ b/src/main/resources/codegen/java/controller/vo/exportReqVO.vm @@ -1,4 +1,4 @@ -package ${basePackage}.${table.moduleName}.controller.${table.businessName}.vo; +package ${basePackage}.modules.${table.moduleName}.controller.${table.businessName}.vo; import lombok.*; import java.util.*; diff --git a/src/main/resources/codegen/java/controller/vo/pageReqVO.vm b/src/main/resources/codegen/java/controller/vo/pageReqVO.vm index 71630742e..0ac69e94d 100644 --- a/src/main/resources/codegen/java/controller/vo/pageReqVO.vm +++ b/src/main/resources/codegen/java/controller/vo/pageReqVO.vm @@ -1,4 +1,4 @@ -package ${basePackage}.${table.moduleName}.controller.${table.businessName}.vo; +package ${basePackage}.modules.${table.moduleName}.controller.${table.businessName}.vo; import lombok.*; import java.util.*; diff --git a/src/main/resources/codegen/java/controller/vo/respVO.vm b/src/main/resources/codegen/java/controller/vo/respVO.vm index 9176c073f..a100dd16c 100644 --- a/src/main/resources/codegen/java/controller/vo/respVO.vm +++ b/src/main/resources/codegen/java/controller/vo/respVO.vm @@ -1,4 +1,4 @@ -package ${basePackage}.${table.moduleName}.controller.${table.businessName}.vo; +package ${basePackage}.modules.${table.moduleName}.controller.${table.businessName}.vo; import lombok.*; import java.util.*; diff --git a/src/main/resources/codegen/java/controller/vo/updateReqVO.vm b/src/main/resources/codegen/java/controller/vo/updateReqVO.vm index 173b8dbcf..a05ae8d66 100644 --- a/src/main/resources/codegen/java/controller/vo/updateReqVO.vm +++ b/src/main/resources/codegen/java/controller/vo/updateReqVO.vm @@ -1,4 +1,4 @@ -package ${basePackage}.${table.moduleName}.controller.${table.businessName}.vo; +package ${basePackage}.modules.${table.moduleName}.controller.${table.businessName}.vo; import lombok.*; import java.util.*; diff --git a/src/main/resources/codegen/java/convert/convert.vm b/src/main/resources/codegen/java/convert/convert.vm index 0ec103181..4302bd2c5 100644 --- a/src/main/resources/codegen/java/convert/convert.vm +++ b/src/main/resources/codegen/java/convert/convert.vm @@ -1,4 +1,4 @@ -package ${basePackage}.${table.moduleName}.convert.${table.businessName}; +package ${basePackage}.modules.${table.moduleName}.convert.${table.businessName}; import java.util.*; @@ -6,8 +6,8 @@ import ${PageResultClassName}; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; -import ${basePackage}.${table.moduleName}.controller.${table.businessName}.vo.*; -import ${basePackage}.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; +import ${basePackage}.modules.${table.moduleName}.controller.${table.businessName}.vo.*; +import ${basePackage}.modules.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; /** * ${table.classComment} Convert diff --git a/src/main/resources/codegen/java/dal/do.vm b/src/main/resources/codegen/java/dal/do.vm index b70d01d18..8f10fd5e4 100644 --- a/src/main/resources/codegen/java/dal/do.vm +++ b/src/main/resources/codegen/java/dal/do.vm @@ -1,4 +1,4 @@ -package ${basePackage}.${table.moduleName}.dal.dataobject.${table.businessName}; +package ${basePackage}.modules.${table.moduleName}.dal.dataobject.${table.businessName}; import lombok.*; import java.util.*; diff --git a/src/main/resources/codegen/java/dal/mapper.vm b/src/main/resources/codegen/java/dal/mapper.vm index cc1c2ae7e..2452ca8f6 100644 --- a/src/main/resources/codegen/java/dal/mapper.vm +++ b/src/main/resources/codegen/java/dal/mapper.vm @@ -1,13 +1,13 @@ -package ${basePackage}.${table.moduleName}.dal.mysql.${table.businessName}; +package ${basePackage}.modules.${table.moduleName}.dal.mysql.${table.businessName}; import java.util.*; import ${PageResultClassName}; import ${QueryWrapperClassName}; import ${BaseMapperClassName}; -import ${basePackage}.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; +import ${basePackage}.modules.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; import org.apache.ibatis.annotations.Mapper; -import ${basePackage}.${table.moduleName}.controller.${table.businessName}.vo.*; +import ${basePackage}.modules.${table.moduleName}.controller.${table.businessName}.vo.*; ## 字段模板 #macro(listCondition) diff --git a/src/main/resources/codegen/java/service/service.vm b/src/main/resources/codegen/java/service/service.vm index 31cba1cca..04499314e 100644 --- a/src/main/resources/codegen/java/service/service.vm +++ b/src/main/resources/codegen/java/service/service.vm @@ -1,9 +1,9 @@ -package ${basePackage}.${table.moduleName}.service.${table.businessName}; +package ${basePackage}.modules.${table.moduleName}.service.${table.businessName}; import java.util.*; import javax.validation.*; -import ${basePackage}.${table.moduleName}.controller.${table.businessName}.vo.*; -import ${basePackage}.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; +import ${basePackage}.modules.${table.moduleName}.controller.${table.businessName}.vo.*; +import ${basePackage}.modules.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; import ${PageResultClassName}; /** diff --git a/src/main/resources/codegen/java/service/serviceImpl.vm b/src/main/resources/codegen/java/service/serviceImpl.vm index 7bd61c8c9..0889f0ce0 100644 --- a/src/main/resources/codegen/java/service/serviceImpl.vm +++ b/src/main/resources/codegen/java/service/serviceImpl.vm @@ -1,4 +1,4 @@ -package ${basePackage}.${table.moduleName}.service.${table.businessName}.impl; +package ${basePackage}.modules.${table.moduleName}.service.${table.businessName}.impl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -6,17 +6,17 @@ import javax.annotation.Resource; import org.springframework.validation.annotation.Validated; import java.util.*; -import ${basePackage}.${table.moduleName}.controller.${table.businessName}.vo.*; -import ${basePackage}.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; +import ${basePackage}.modules.${table.moduleName}.controller.${table.businessName}.vo.*; +import ${basePackage}.modules.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; import ${PageResultClassName}; -import ${basePackage}.${table.moduleName}.convert.${table.businessName}.${table.className}Convert; -import ${basePackage}.${table.moduleName}.dal.mysql.${table.businessName}.${table.className}Mapper; -import ${basePackage}.${table.moduleName}.service.${table.businessName}.${table.className}Service; +import ${basePackage}.modules.${table.moduleName}.convert.${table.businessName}.${table.className}Convert; +import ${basePackage}.modules.${table.moduleName}.dal.mysql.${table.businessName}.${table.className}Mapper; +import ${basePackage}.modules.${table.moduleName}.service.${table.businessName}.${table.className}Service; import ${ServiceExceptionUtilClassName}; -import static ${basePackage}.${table.moduleName}.enums.${simpleModuleName_upperFirst}ErrorCodeConstants.*; +import static ${basePackage}.modules.${table.moduleName}.enums.${simpleModuleName_upperFirst}ErrorCodeConstants.*; /** * ${table.classComment} Service 实现类 diff --git a/src/main/resources/codegen/java/test/serviceTest.vm b/src/main/resources/codegen/java/test/serviceTest.vm new file mode 100644 index 000000000..8713db421 --- /dev/null +++ b/src/main/resources/codegen/java/test/serviceTest.vm @@ -0,0 +1,111 @@ +package ${basePackage}.modules.${table.moduleName}.service.${table.businessName}; + +import ${basePackage}.BaseSpringBootUnitTest; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; + +import javax.annotation.Resource; + +import cn.iocoder.dashboard.BaseSpringBootUnitTest; +import ${basePackage}.modules.${table.moduleName}.service.${table.businessName}.impl.${table.className}ServiceImpl; +import ${basePackage}.modules.${table.moduleName}.controller.${table.businessName}.vo.*; +import ${basePackage}.modules.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; +import ${basePackage}.modules.${table.moduleName}.dal.mysql.${table.businessName}.${table.className}Mapper; + +import javax.annotation.Resource; + +import static cn.hutool.core.util.RandomUtil.*; +import static ${basePackage}.modules.${table.moduleName}.enums.${simpleModuleName_upperFirst}ErrorCodeConstants.*; +import static cn.iocoder.dashboard.util.AssertUtils.*; +import static cn.iocoder.dashboard.util.RandomUtils.*; +import static cn.iocoder.dashboard.util.date.DateUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +/** +* {@link ${table.className}ServiceImpl} 的单元测试类 +* +* @author ${table.author} +*/ +public class ${table.className}ServiceTest extends BaseSpringBootUnitTest { + + @Resource + private ${table.className}ServiceImpl ${classNameVar}Service; + + @Resource + private ${table.className}Mapper ${classNameVar}Mapper; + + @Test + public void testCreate${simpleClassName}_success() { + // 准备参数 + ${table.className}CreateReqVO reqVO = randomPojo(${table.className}CreateReqVO.class); + + // 调用 + Long ${classNameVar}Id = ${classNameVar}Service.create${simpleClassName}(reqVO); + // 断言 + assertNotNull(${classNameVar}Id); + // 校验记录的属性是否正确 + ${table.className}DO ${classNameVar} = ${classNameVar}Mapper.selectById(${classNameVar}Id); + assertPojoEquals(reqVO, ${classNameVar}); + } + + @Test + public void testUpdate${simpleClassName}_success() { + // mock 数据 + ${table.className}DO db${simpleClassName} = randomPojo(${table.className}DO.class); + ${classNameVar}Mapper.insert(db${simpleClassName});// @Sql: 先插入出一条存在的数据 + // 准备参数 + ${table.className}UpdateReqVO reqVO = randomPojo(${table.className}UpdateReqVO.class, o -> { + o.setId(db${simpleClassName}.getId()); // 设置更新的 ID + }); + + // 调用 + ${classNameVar}Service.update${simpleClassName}(reqVO); + // 校验是否更新正确 + ${table.className}DO ${classNameVar} = ${classNameVar}Mapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, ${classNameVar}); + } + + @Test + public void testUpdate${simpleClassName}_notExists() { + // 准备参数 + ${table.className}UpdateReqVO reqVO = randomPojo(${table.className}UpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> ${classNameVar}Service.update${simpleClassName}(reqVO), ${simpleClassName_underlineCase.toUpperCase()}_NOT_EXISTS); + } + + @Test + public void testDelete${simpleClassName}_success() { + // mock 数据 + ${table.className}DO db${simpleClassName} = randomPojo(${table.className}DO.class); + ${classNameVar}Mapper.insert(db${simpleClassName});// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = db${simpleClassName}.getId(); + + // 调用 + ${classNameVar}Service.delete${simpleClassName}(id); + // 校验数据不存在了 + assertNull(configMapper.selectById(id)); + } + + @Test + public void testDelete${simpleClassName}_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> ${classNameVar}Service.delete${simpleClassName}(id), ${simpleClassName_underlineCase.toUpperCase()}_NOT_EXISTS); + } + + @Test + public void testGet${simpleClassName}Page() { + // mock 数据 + ${table.className}DO db${simpleClassName} = randomPojo(${table.className}DO.class, o -> {); // 等会查询到 + + }); + ${classNameVar}Mapper.insert(db${simpleClassName}); + } + +} diff --git a/src/test/java/cn/iocoder/dashboard/modules/infra/service/config/InfConfigServiceImplTest.java b/src/test/java/cn/iocoder/dashboard/modules/infra/service/config/InfConfigServiceTest.java similarity index 92% rename from src/test/java/cn/iocoder/dashboard/modules/infra/service/config/InfConfigServiceImplTest.java rename to src/test/java/cn/iocoder/dashboard/modules/infra/service/config/InfConfigServiceTest.java index d56aabf69..6f95f5ad0 100644 --- a/src/test/java/cn/iocoder/dashboard/modules/infra/service/config/InfConfigServiceImplTest.java +++ b/src/test/java/cn/iocoder/dashboard/modules/infra/service/config/InfConfigServiceTest.java @@ -20,24 +20,26 @@ import javax.annotation.Resource; import java.util.List; import java.util.function.Consumer; -import static cn.hutool.core.util.RandomUtil.randomEle; +import static cn.hutool.core.util.RandomUtil.*; import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.*; -import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals; -import static cn.iocoder.dashboard.util.AssertUtils.assertServiceException; -import static cn.iocoder.dashboard.util.RandomUtils.randomPojo; -import static cn.iocoder.dashboard.util.date.DateUtils.buildTime; +import static cn.iocoder.dashboard.util.AssertUtils.*; +import static cn.iocoder.dashboard.util.RandomUtils.*; +import static cn.iocoder.dashboard.util.date.DateUtils.*; import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.*; -public class InfConfigServiceImplTest extends BaseSpringBootUnitTest { +/** + * {@link InfConfigServiceImpl} 的单元测试类 + * + * @author 芋道源码 + */ +public class InfConfigServiceTest extends BaseSpringBootUnitTest { @Resource private InfConfigServiceImpl configService; @Resource private InfConfigMapper configMapper; - @MockBean private InfConfigProducer configProducer; @@ -213,6 +215,15 @@ public class InfConfigServiceImplTest extends BaseSpringBootUnitTest { assertServiceException(() -> configService.deleteConfig(id), CONFIG_CAN_NOT_DELETE_SYSTEM_TYPE); } + @Test + public void testDeleteConfig_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> configService.deleteConfig(id), CONFIG_NOT_EXISTS); + } + // ========== 随机对象 ========== @SafeVarargs diff --git a/src/test/java/cn/iocoder/dashboard/modules/infra/service/job/InfConfigServiceTest.java b/src/test/java/cn/iocoder/dashboard/modules/infra/service/job/InfConfigServiceTest.java new file mode 100644 index 000000000..d5fdf5cb9 --- /dev/null +++ b/src/test/java/cn/iocoder/dashboard/modules/infra/service/job/InfConfigServiceTest.java @@ -0,0 +1,97 @@ +package cn.iocoder.dashboard.modules.infra.service.job; + +import cn.iocoder.dashboard.BaseSpringBootUnitTest; +import cn.iocoder.dashboard.modules.infra.controller.config.vo.InfConfigCreateReqVO; +import cn.iocoder.dashboard.modules.infra.controller.config.vo.InfConfigUpdateReqVO; +import cn.iocoder.dashboard.modules.infra.dal.dataobject.config.InfConfigDO; +import cn.iocoder.dashboard.modules.infra.dal.mysql.config.InfConfigMapper; +import cn.iocoder.dashboard.modules.infra.service.config.impl.InfConfigServiceImpl; +import org.junit.jupiter.api.Test; + +import javax.annotation.Resource; + +import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.CONFIG_NOT_EXISTS; +import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.dashboard.util.AssertUtils.assertServiceException; +import static cn.iocoder.dashboard.util.RandomUtils.randomLongId; +import static cn.iocoder.dashboard.util.RandomUtils.randomPojo; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; + +/** +* {@link InfConfigServiceImpl} 的单元测试类 +* +* @author 芋艿 +*/ +public class InfConfigServiceTest extends BaseSpringBootUnitTest { + + @Resource + private InfConfigServiceImpl configService; + + @Resource + private InfConfigMapper configMapper; + + @Test + public void testCreateConfig_success() { + // 准备参数 + InfConfigCreateReqVO reqVO = randomPojo(InfConfigCreateReqVO.class); + + // 调用 + Long configId = configService.createConfig(reqVO); + // 断言 + assertNotNull(configId); + // 校验记录的属性是否正确 + InfConfigDO config = configMapper.selectById(configId); + assertPojoEquals(reqVO, config); + } + + @Test + public void testUpdateConfig_success() { + // mock 数据 + InfConfigDO dbConfig = randomPojo(InfConfigDO.class); + configMapper.insert(dbConfig);// @Sql: 先插入出一条存在的数据 + // 准备参数 + InfConfigUpdateReqVO reqVO = randomPojo(InfConfigUpdateReqVO.class, o -> { + o.setId(dbConfig.getId()); // 设置更新的 ID + }); + + // 调用 + configService.updateConfig(reqVO); + // 校验是否更新正确 + InfConfigDO config = configMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, config); + } + + @Test + public void testUpdateConfig_notExists() { + // 准备参数 + InfConfigUpdateReqVO reqVO = randomPojo(InfConfigUpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> configService.updateConfig(reqVO), CONFIG_NOT_EXISTS); + } + + @Test + public void testDeleteConfig_success() { + // mock 数据 + InfConfigDO dbConfig = randomPojo(InfConfigDO.class); + configMapper.insert(dbConfig);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbConfig.getId(); + + // 调用 + configService.deleteConfig(id); + // 校验数据不存在了 + assertNull(configMapper.selectById(id)); + } + + @Test + public void testDeleteConfig_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> configService.deleteConfig(id), CONFIG_NOT_EXISTS); + } + +} diff --git a/src/test/java/cn/iocoder/dashboard/modules/system/service/auth/SysAuthServiceImplTest.java b/src/test/java/cn/iocoder/dashboard/modules/system/service/auth/SysAuthServiceImplTest.java index 5e79a0cf5..5d9ac58a7 100644 --- a/src/test/java/cn/iocoder/dashboard/modules/system/service/auth/SysAuthServiceImplTest.java +++ b/src/test/java/cn/iocoder/dashboard/modules/system/service/auth/SysAuthServiceImplTest.java @@ -61,7 +61,7 @@ public class SysAuthServiceImplTest extends BaseSpringBootUnitTest { @Test public void testMockLogin_success() { // 准备参数 - Long userId = randomLong(); + Long userId = randomLongId(); // mock 方法 01 SysUserDO user = randomUserDO(o -> o.setId(userId)); when(userService.getUser(eq(userId))).thenReturn(user); @@ -80,7 +80,7 @@ public class SysAuthServiceImplTest extends BaseSpringBootUnitTest { @Test public void testMockLogin_userNotFound() { // 准备参数 - Long userId = randomLong(); + Long userId = randomLongId(); // mock 方法 // 调用, 并断言异常 diff --git a/src/test/java/cn/iocoder/dashboard/util/RandomUtils.java b/src/test/java/cn/iocoder/dashboard/util/RandomUtils.java index 36d58271f..572668647 100644 --- a/src/test/java/cn/iocoder/dashboard/util/RandomUtils.java +++ b/src/test/java/cn/iocoder/dashboard/util/RandomUtils.java @@ -46,7 +46,7 @@ public class RandomUtils { return RandomUtil.randomString(RANDOM_STRING_LENGTH); } - public static Long randomLong() { + public static Long randomLongId() { return RandomUtil.randomLong(0, Long.MAX_VALUE); } From 9177c1ab58ac27a3e52f35904da9615605660435 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 6 Mar 2021 21:21:56 +0800 Subject: [PATCH 014/126] =?UTF-8?q?=E8=BF=9B=E4=B8=80=E6=AD=A5=E5=AE=8C?= =?UTF-8?q?=E5=96=84=20ut=20=E7=9A=84=20vm=20=E6=A8=A1=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../codegen/java/test/serviceTest.vm | 68 +++++++++++-- .../service/job/InfConfigServiceTest.java | 97 ------------------- 2 files changed, 59 insertions(+), 106 deletions(-) delete mode 100644 src/test/java/cn/iocoder/dashboard/modules/infra/service/job/InfConfigServiceTest.java diff --git a/src/main/resources/codegen/java/test/serviceTest.vm b/src/main/resources/codegen/java/test/serviceTest.vm index 8713db421..c51a59bf1 100644 --- a/src/main/resources/codegen/java/test/serviceTest.vm +++ b/src/main/resources/codegen/java/test/serviceTest.vm @@ -12,17 +12,53 @@ import ${basePackage}.modules.${table.moduleName}.service.${table.businessName}. import ${basePackage}.modules.${table.moduleName}.controller.${table.businessName}.vo.*; import ${basePackage}.modules.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; import ${basePackage}.modules.${table.moduleName}.dal.mysql.${table.businessName}.${table.className}Mapper; +import ${basePackage}.util.object.ObjectUtils; +import ${PageResultClassName}; import javax.annotation.Resource; +import java.util.*; import static cn.hutool.core.util.RandomUtil.*; import static ${basePackage}.modules.${table.moduleName}.enums.${simpleModuleName_upperFirst}ErrorCodeConstants.*; -import static cn.iocoder.dashboard.util.AssertUtils.*; -import static cn.iocoder.dashboard.util.RandomUtils.*; -import static cn.iocoder.dashboard.util.date.DateUtils.*; +import static ${basePackage}.util.AssertUtils.*; +import static ${basePackage}.util.RandomUtils.*; +import static ${basePackage}.util.date.DateUtils.*; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; +## 字段模板 +#macro(getPageCondition $VO) + // mock 数据 + ${table.className}DO db${simpleClassName} = randomPojo(${table.className}DO.class, o -> {); // 等会查询到 + #foreach ($column in $columns) + #if (${column.listOperation}) + #set ($JavaField = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})##首字母大写 + o.set$JavaField(null); + #end + #end + }); + ${classNameVar}Mapper.insert(db${simpleClassName}); + #foreach ($column in $columns) + #if (${column.listOperation}) + #set ($JavaField = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})##首字母大写 + // 测试 ${column.javaField} 不匹配 + ${classNameVar}Mapper.insert(ObjectUtils.clone(db${simpleClassName}, o -> o.set$JavaField(null))); + #end + #end + // 准备参数 + ${table.className}${VO} reqVO = new ${table.className}${VO}(); + #foreach ($column in $columns) + #if (${column.listOperation}) + #set ($JavaField = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})##首字母大写 + #if (${column.listOperationCondition} == "BETWEEN")## BETWEEN 的情况 + reqVO.setBegin${JavaField}(null); + reqVO.setEnd${JavaField}(null); + #else + reqVO.set$JavaField(null); + #end + #end + #end +#end /** * {@link ${table.className}ServiceImpl} 的单元测试类 * @@ -97,15 +133,29 @@ public class ${table.className}ServiceTest extends BaseSpringBootUnitTest { // 调用, 并断言异常 assertServiceException(() -> ${classNameVar}Service.delete${simpleClassName}(id), ${simpleClassName_underlineCase.toUpperCase()}_NOT_EXISTS); - } + } - @Test + @Test // TODO 请修改 null 为需要的值 public void testGet${simpleClassName}Page() { - // mock 数据 - ${table.className}DO db${simpleClassName} = randomPojo(${table.className}DO.class, o -> {); // 等会查询到 + #getPageCondition("PageReqVO") - }); - ${classNameVar}Mapper.insert(db${simpleClassName}); + // 调用 + PageResult<${table.className}DO> pageResult = configService.getConfigPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(db${simpleClassName}, pageResult.getList().get(0)); + } + + @Test // TODO 请修改 null 为需要的值 + public void testGet${simpleClassName}List() { + #getPageCondition("ExportReqVO") + + // 调用 + PageResult<${table.className}DO> list = configService.getConfigPage(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(db${simpleClassName}, list.get(0)); } } diff --git a/src/test/java/cn/iocoder/dashboard/modules/infra/service/job/InfConfigServiceTest.java b/src/test/java/cn/iocoder/dashboard/modules/infra/service/job/InfConfigServiceTest.java deleted file mode 100644 index d5fdf5cb9..000000000 --- a/src/test/java/cn/iocoder/dashboard/modules/infra/service/job/InfConfigServiceTest.java +++ /dev/null @@ -1,97 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.service.job; - -import cn.iocoder.dashboard.BaseSpringBootUnitTest; -import cn.iocoder.dashboard.modules.infra.controller.config.vo.InfConfigCreateReqVO; -import cn.iocoder.dashboard.modules.infra.controller.config.vo.InfConfigUpdateReqVO; -import cn.iocoder.dashboard.modules.infra.dal.dataobject.config.InfConfigDO; -import cn.iocoder.dashboard.modules.infra.dal.mysql.config.InfConfigMapper; -import cn.iocoder.dashboard.modules.infra.service.config.impl.InfConfigServiceImpl; -import org.junit.jupiter.api.Test; - -import javax.annotation.Resource; - -import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.CONFIG_NOT_EXISTS; -import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals; -import static cn.iocoder.dashboard.util.AssertUtils.assertServiceException; -import static cn.iocoder.dashboard.util.RandomUtils.randomLongId; -import static cn.iocoder.dashboard.util.RandomUtils.randomPojo; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; - -/** -* {@link InfConfigServiceImpl} 的单元测试类 -* -* @author 芋艿 -*/ -public class InfConfigServiceTest extends BaseSpringBootUnitTest { - - @Resource - private InfConfigServiceImpl configService; - - @Resource - private InfConfigMapper configMapper; - - @Test - public void testCreateConfig_success() { - // 准备参数 - InfConfigCreateReqVO reqVO = randomPojo(InfConfigCreateReqVO.class); - - // 调用 - Long configId = configService.createConfig(reqVO); - // 断言 - assertNotNull(configId); - // 校验记录的属性是否正确 - InfConfigDO config = configMapper.selectById(configId); - assertPojoEquals(reqVO, config); - } - - @Test - public void testUpdateConfig_success() { - // mock 数据 - InfConfigDO dbConfig = randomPojo(InfConfigDO.class); - configMapper.insert(dbConfig);// @Sql: 先插入出一条存在的数据 - // 准备参数 - InfConfigUpdateReqVO reqVO = randomPojo(InfConfigUpdateReqVO.class, o -> { - o.setId(dbConfig.getId()); // 设置更新的 ID - }); - - // 调用 - configService.updateConfig(reqVO); - // 校验是否更新正确 - InfConfigDO config = configMapper.selectById(reqVO.getId()); // 获取最新的 - assertPojoEquals(reqVO, config); - } - - @Test - public void testUpdateConfig_notExists() { - // 准备参数 - InfConfigUpdateReqVO reqVO = randomPojo(InfConfigUpdateReqVO.class); - - // 调用, 并断言异常 - assertServiceException(() -> configService.updateConfig(reqVO), CONFIG_NOT_EXISTS); - } - - @Test - public void testDeleteConfig_success() { - // mock 数据 - InfConfigDO dbConfig = randomPojo(InfConfigDO.class); - configMapper.insert(dbConfig);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbConfig.getId(); - - // 调用 - configService.deleteConfig(id); - // 校验数据不存在了 - assertNull(configMapper.selectById(id)); - } - - @Test - public void testDeleteConfig_notExists() { - // 准备参数 - Long id = randomLongId(); - - // 调用, 并断言异常 - assertServiceException(() -> configService.deleteConfig(id), CONFIG_NOT_EXISTS); - } - -} From 00aa082a5d41ec9ace0204aba4645c8af6d0fe00 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 7 Mar 2021 00:47:55 +0800 Subject: [PATCH 015/126] =?UTF-8?q?=E5=AE=8C=E6=88=90=20dict=20type=20?= =?UTF-8?q?=E7=9A=84=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-ui/src/views/system/dict/index.vue | 52 +- sql/ruoyi-vue-pro.sql | 2761 +---------------- .../mybatis/core/mapper/BaseMapperX.java | 8 +- .../dict/SysDictTypeController.java | 6 +- .../dict/vo/type/SysDictTypeExportReqVO.java | 10 +- .../dict/vo/type/SysDictTypePageReqVO.java | 8 +- .../dal/dataobject/dict/SysDictTypeDO.java | 2 +- .../dal/mysql/dict/SysDictTypeMapper.java | 15 +- .../system/enums/SysErrorCodeConstants.java | 2 +- .../service/dict/SysDictTypeService.java | 6 +- .../dict/impl/SysDictDataServiceImpl.java | 2 +- .../dict/impl/SysDictTypeServiceImpl.java | 22 +- .../dashboard/util/collection/ArrayUtils.java | 31 + .../codegen/java/test/serviceTest.vm | 8 +- .../service/config/InfConfigServiceTest.java | 18 +- .../service/dict/SysDictTypeServiceTest.java | 263 ++ .../modules/system/service/package-info.java | 1 - src/test/resources/sql/clean.sql | 1 + src/test/resources/sql/create_tables.sql | 14 + 19 files changed, 437 insertions(+), 2793 deletions(-) create mode 100644 src/main/java/cn/iocoder/dashboard/util/collection/ArrayUtils.java create mode 100644 src/test/java/cn/iocoder/dashboard/modules/system/service/dict/SysDictTypeServiceTest.java delete mode 100644 src/test/java/cn/iocoder/dashboard/modules/system/service/package-info.java diff --git a/ruoyi-ui/src/views/system/dict/index.vue b/ruoyi-ui/src/views/system/dict/index.vue index 0e775eaf6..4f92859a0 100644 --- a/ruoyi-ui/src/views/system/dict/index.vue +++ b/ruoyi-ui/src/views/system/dict/index.vue @@ -39,7 +39,7 @@ { - this.typeList = response.data.list; - this.total = response.data.total; - this.loading = false; - } - ); + // 处理查询参数 + let params = {...this.queryParams}; + this.addBeginAndEndTime(params, this.dateRangeCreateTime, 'createTime'); + // 执行查询 + listType(params).then(response => { + this.typeList = response.data.list; + this.total = response.data.total; + this.loading = false; + }); }, // 字典状态字典翻译 statusFormat(row, column) { @@ -248,7 +248,7 @@ export default { }, /** 重置按钮操作 */ resetQuery() { - this.dateRange = []; + this.dateRangeCreateTime = []; this.resetForm("queryForm"); this.handleQuery(); }, @@ -304,19 +304,21 @@ export default { }, /** 导出按钮操作 */ handleExport() { - const queryParams = this.addDateRange(this.queryParams, [ - this.dateRange[0] ? this.dateRange[0] + ' 00:00:00' : undefined, - this.dateRange[1] ? this.dateRange[1] + ' 23:59:59' : undefined, - ]); - this.$confirm('是否确认导出所有类型数据项?', "警告", { - confirmButtonText: "确定", - cancelButtonText: "取消", - type: "warning" - }).then(function() { - return exportType(queryParams); - }).then(response => { - this.downloadExcel(response, '数据类型.xls'); - }) + // 处理查询参数 + let params = {...this.queryParams}; + params.pageNo = undefined; + params.pageSize = undefined; + this.addBeginAndEndTime(params, this.dateRangeCreateTime, 'createTime'); + // 执行导出 + this.$confirm('是否确认导出所有字典类型数据项?', "警告", { + confirmButtonText: "确定", + cancelButtonText: "取消", + type: "warning" + }).then(function() { + return exportType(params); + }).then(response => { + this.downloadExcel(response, '字典类型.xls'); + }) } } }; diff --git a/sql/ruoyi-vue-pro.sql b/sql/ruoyi-vue-pro.sql index 354069931..56a3a98bf 100644 --- a/sql/ruoyi-vue-pro.sql +++ b/sql/ruoyi-vue-pro.sql @@ -1,7 +1,7 @@ /* Navicat Premium Data Transfer - Source Server : local-mysql001 + Source Server : 127.0.0.1 Source Server Type : MySQL Source Server Version : 50718 Source Host : localhost:3306 @@ -11,7 +11,7 @@ Target Server Version : 50718 File Encoding : 65001 - Date: 27/02/2021 23:17:17 + Date: 07/03/2021 00:43:34 */ SET NAMES utf8mb4; @@ -43,7 +43,7 @@ CREATE TABLE `inf_api_access_log` ( `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=1228 DEFAULT CHARSET=utf8mb4 COMMENT='API 访问日志表'; +) ENGINE=InnoDB AUTO_INCREMENT=1822 DEFAULT CHARSET=utf8mb4 COMMENT='API 访问日志表'; -- ---------------------------- -- Records of inf_api_access_log @@ -84,7 +84,7 @@ CREATE TABLE `inf_api_error_log` ( `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=1019 DEFAULT CHARSET=utf8mb4 COMMENT='系统异常日志'; +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COMMENT='系统异常日志'; -- ---------------------------- -- Records of inf_api_error_log @@ -175,2709 +175,12 @@ CREATE TABLE `inf_job_log` ( `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=4181 DEFAULT CHARSET=utf8mb4 COMMENT='定时任务日志表'; +) ENGINE=InnoDB AUTO_INCREMENT=4458 DEFAULT CHARSET=utf8mb4 COMMENT='定时任务日志表'; -- ---------------------------- -- Records of inf_job_log -- ---------------------------- BEGIN; -INSERT INTO `inf_job_log` VALUES (1484, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:19:52', '2021-02-18 19:19:52', 26, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:10:52', '', '2021-02-08 04:10:52', b'0'); -INSERT INTO `inf_job_log` VALUES (1485, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:19:55', '2021-02-18 19:19:55', 6, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:10:55', '', '2021-02-08 04:10:55', b'0'); -INSERT INTO `inf_job_log` VALUES (1486, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:20:00', '2021-02-18 19:20:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:11:00', '', '2021-02-08 04:11:00', b'0'); -INSERT INTO `inf_job_log` VALUES (1487, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:20:05', '2021-02-18 19:20:05', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:11:05', '', '2021-02-08 04:11:05', b'0'); -INSERT INTO `inf_job_log` VALUES (1488, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:20:10', '2021-02-18 19:20:10', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:11:10', '', '2021-02-08 04:11:10', b'0'); -INSERT INTO `inf_job_log` VALUES (1489, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:26:02', '2021-02-18 19:26:02', 34, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:17:02', '', '2021-02-08 04:17:02', b'0'); -INSERT INTO `inf_job_log` VALUES (1490, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:26:05', '2021-02-18 19:26:05', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:17:06', '', '2021-02-08 04:17:06', b'0'); -INSERT INTO `inf_job_log` VALUES (1491, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:26:10', '2021-02-18 19:26:10', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:17:11', '', '2021-02-08 04:17:11', b'0'); -INSERT INTO `inf_job_log` VALUES (1492, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:26:15', '2021-02-18 19:26:15', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:17:16', '', '2021-02-08 04:17:16', b'0'); -INSERT INTO `inf_job_log` VALUES (1493, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:26:20', '2021-02-18 19:26:20', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:17:21', '', '2021-02-08 04:17:21', b'0'); -INSERT INTO `inf_job_log` VALUES (1494, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:26:25', '2021-02-18 19:26:25', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:17:26', '', '2021-02-08 04:17:26', b'0'); -INSERT INTO `inf_job_log` VALUES (1495, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:26:30', '2021-02-18 19:26:30', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:17:31', '', '2021-02-08 04:17:31', b'0'); -INSERT INTO `inf_job_log` VALUES (1496, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:26:35', '2021-02-18 19:26:35', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:17:36', '', '2021-02-08 04:17:36', b'0'); -INSERT INTO `inf_job_log` VALUES (1497, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:26:40', '2021-02-18 19:26:40', 6, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:17:41', '', '2021-02-08 04:17:41', b'0'); -INSERT INTO `inf_job_log` VALUES (1498, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:26:45', '2021-02-18 19:26:45', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:17:46', '', '2021-02-08 04:17:46', b'0'); -INSERT INTO `inf_job_log` VALUES (1499, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:26:50', '2021-02-18 19:26:50', 257, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:17:51', '', '2021-02-08 04:17:51', b'0'); -INSERT INTO `inf_job_log` VALUES (1500, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:26:55', '2021-02-18 19:26:55', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:17:56', '', '2021-02-08 04:17:56', b'0'); -INSERT INTO `inf_job_log` VALUES (1501, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:27:00', '2021-02-18 19:27:00', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:18:01', '', '2021-02-08 04:18:01', b'0'); -INSERT INTO `inf_job_log` VALUES (1502, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:27:05', '2021-02-18 19:27:05', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:18:06', '', '2021-02-08 04:18:06', b'0'); -INSERT INTO `inf_job_log` VALUES (1503, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:27:10', '2021-02-18 19:27:10', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:18:11', '', '2021-02-08 04:18:11', b'0'); -INSERT INTO `inf_job_log` VALUES (1504, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:27:15', '2021-02-18 19:27:15', 6, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:18:16', '', '2021-02-08 04:18:16', b'0'); -INSERT INTO `inf_job_log` VALUES (1505, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:27:20', '2021-02-18 19:27:20', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:18:21', '', '2021-02-08 04:18:21', b'0'); -INSERT INTO `inf_job_log` VALUES (1506, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:27:25', '2021-02-18 19:27:25', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:18:26', '', '2021-02-08 04:18:26', b'0'); -INSERT INTO `inf_job_log` VALUES (1507, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:27:30', '2021-02-18 19:27:30', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:18:31', '', '2021-02-08 04:18:31', b'0'); -INSERT INTO `inf_job_log` VALUES (1508, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:27:35', '2021-02-18 19:27:35', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:18:36', '', '2021-02-08 04:18:36', b'0'); -INSERT INTO `inf_job_log` VALUES (1509, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:27:40', '2021-02-18 19:27:40', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:18:41', '', '2021-02-08 04:18:41', b'0'); -INSERT INTO `inf_job_log` VALUES (1510, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:27:45', '2021-02-18 19:27:45', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:18:46', '', '2021-02-08 04:18:46', b'0'); -INSERT INTO `inf_job_log` VALUES (1511, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:27:50', '2021-02-18 19:27:50', 6, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:18:51', '', '2021-02-08 04:18:51', b'0'); -INSERT INTO `inf_job_log` VALUES (1512, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:27:55', '2021-02-18 19:27:55', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:18:56', '', '2021-02-08 04:18:56', b'0'); -INSERT INTO `inf_job_log` VALUES (1513, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:28:00', '2021-02-18 19:28:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:19:01', '', '2021-02-08 04:19:01', b'0'); -INSERT INTO `inf_job_log` VALUES (1514, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:28:05', '2021-02-18 19:28:05', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:19:06', '', '2021-02-08 04:19:06', b'0'); -INSERT INTO `inf_job_log` VALUES (1515, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:38:52', '2021-02-18 19:38:52', 34, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:29:52', '', '2021-02-08 04:29:52', b'0'); -INSERT INTO `inf_job_log` VALUES (1516, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:38:55', '2021-02-18 19:38:55', 6, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:29:55', '', '2021-02-08 04:29:55', b'0'); -INSERT INTO `inf_job_log` VALUES (1517, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:39:00', '2021-02-18 19:39:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:30:00', '', '2021-02-08 04:30:00', b'0'); -INSERT INTO `inf_job_log` VALUES (1518, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:39:05', '2021-02-18 19:39:05', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:30:05', '', '2021-02-08 04:30:05', b'0'); -INSERT INTO `inf_job_log` VALUES (1519, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:39:10', '2021-02-18 19:39:10', 7, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:30:10', '', '2021-02-08 04:30:10', b'0'); -INSERT INTO `inf_job_log` VALUES (1520, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:39:15', '2021-02-18 19:39:15', 6, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:30:15', '', '2021-02-08 04:30:15', b'0'); -INSERT INTO `inf_job_log` VALUES (1521, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:39:20', '2021-02-18 19:39:20', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:30:20', '', '2021-02-08 04:30:20', b'0'); -INSERT INTO `inf_job_log` VALUES (1522, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:39:25', '2021-02-18 19:39:25', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:30:25', '', '2021-02-08 04:30:25', b'0'); -INSERT INTO `inf_job_log` VALUES (1523, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:39:30', '2021-02-18 19:39:30', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:30:30', '', '2021-02-08 04:30:30', b'0'); -INSERT INTO `inf_job_log` VALUES (1524, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:39:35', '2021-02-18 19:39:35', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:30:35', '', '2021-02-08 04:30:35', b'0'); -INSERT INTO `inf_job_log` VALUES (1525, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:39:40', '2021-02-18 19:39:40', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:30:40', '', '2021-02-08 04:30:40', b'0'); -INSERT INTO `inf_job_log` VALUES (1526, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:39:45', '2021-02-18 19:39:45', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:30:45', '', '2021-02-08 04:30:45', b'0'); -INSERT INTO `inf_job_log` VALUES (1527, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:39:50', '2021-02-18 19:39:50', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:30:50', '', '2021-02-08 04:30:50', b'0'); -INSERT INTO `inf_job_log` VALUES (1528, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:39:55', '2021-02-18 19:39:55', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:30:55', '', '2021-02-08 04:30:55', b'0'); -INSERT INTO `inf_job_log` VALUES (1529, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:40:00', '2021-02-18 19:40:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:31:00', '', '2021-02-08 04:31:00', b'0'); -INSERT INTO `inf_job_log` VALUES (1530, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:40:05', '2021-02-18 19:40:05', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:31:05', '', '2021-02-08 04:31:05', b'0'); -INSERT INTO `inf_job_log` VALUES (1531, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:40:10', '2021-02-18 19:40:10', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:31:10', '', '2021-02-08 04:31:10', b'0'); -INSERT INTO `inf_job_log` VALUES (1532, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:40:15', '2021-02-18 19:40:15', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:31:15', '', '2021-02-08 04:31:15', b'0'); -INSERT INTO `inf_job_log` VALUES (1533, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:40:20', '2021-02-18 19:40:20', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:31:20', '', '2021-02-08 04:31:20', b'0'); -INSERT INTO `inf_job_log` VALUES (1534, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:40:25', '2021-02-18 19:40:25', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:31:25', '', '2021-02-08 04:31:25', b'0'); -INSERT INTO `inf_job_log` VALUES (1535, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:40:30', '2021-02-18 19:40:30', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:31:30', '', '2021-02-08 04:31:30', b'0'); -INSERT INTO `inf_job_log` VALUES (1536, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:40:35', '2021-02-18 19:40:35', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:31:35', '', '2021-02-08 04:31:35', b'0'); -INSERT INTO `inf_job_log` VALUES (1537, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:40:40', '2021-02-18 19:40:40', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:31:40', '', '2021-02-08 04:31:40', b'0'); -INSERT INTO `inf_job_log` VALUES (1538, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:40:45', '2021-02-18 19:40:45', 7, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:31:45', '', '2021-02-08 04:31:45', b'0'); -INSERT INTO `inf_job_log` VALUES (1539, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:40:50', '2021-02-18 19:40:50', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:31:50', '', '2021-02-08 04:31:50', b'0'); -INSERT INTO `inf_job_log` VALUES (1540, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:40:55', '2021-02-18 19:40:55', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:31:55', '', '2021-02-08 04:31:55', b'0'); -INSERT INTO `inf_job_log` VALUES (1541, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:41:00', '2021-02-18 19:41:00', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:32:00', '', '2021-02-08 04:32:00', b'0'); -INSERT INTO `inf_job_log` VALUES (1542, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:41:05', '2021-02-18 19:41:05', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:32:05', '', '2021-02-08 04:32:05', b'0'); -INSERT INTO `inf_job_log` VALUES (1543, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:41:10', '2021-02-18 19:41:10', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:32:10', '', '2021-02-08 04:32:10', b'0'); -INSERT INTO `inf_job_log` VALUES (1544, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:41:15', '2021-02-18 19:41:15', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:32:15', '', '2021-02-08 04:32:15', b'0'); -INSERT INTO `inf_job_log` VALUES (1545, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:41:20', '2021-02-18 19:41:20', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:32:20', '', '2021-02-08 04:32:20', b'0'); -INSERT INTO `inf_job_log` VALUES (1546, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:41:25', '2021-02-18 19:41:25', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:32:25', '', '2021-02-08 04:32:25', b'0'); -INSERT INTO `inf_job_log` VALUES (1547, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:41:30', '2021-02-18 19:41:30', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:32:30', '', '2021-02-08 04:32:30', b'0'); -INSERT INTO `inf_job_log` VALUES (1548, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:41:35', '2021-02-18 19:41:35', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:32:35', '', '2021-02-08 04:32:35', b'0'); -INSERT INTO `inf_job_log` VALUES (1549, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:41:40', '2021-02-18 19:41:40', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:32:40', '', '2021-02-08 04:32:40', b'0'); -INSERT INTO `inf_job_log` VALUES (1550, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:41:45', '2021-02-18 19:41:45', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:32:45', '', '2021-02-08 04:32:45', b'0'); -INSERT INTO `inf_job_log` VALUES (1551, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:41:50', '2021-02-18 19:41:50', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:32:50', '', '2021-02-08 04:32:50', b'0'); -INSERT INTO `inf_job_log` VALUES (1552, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:41:55', '2021-02-18 19:41:55', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:32:55', '', '2021-02-08 04:32:55', b'0'); -INSERT INTO `inf_job_log` VALUES (1553, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:42:00', '2021-02-18 19:42:00', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:33:00', '', '2021-02-08 04:33:00', b'0'); -INSERT INTO `inf_job_log` VALUES (1554, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:42:05', '2021-02-18 19:42:05', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:33:05', '', '2021-02-08 04:33:05', b'0'); -INSERT INTO `inf_job_log` VALUES (1555, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:42:10', '2021-02-18 19:42:10', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:33:10', '', '2021-02-08 04:33:10', b'0'); -INSERT INTO `inf_job_log` VALUES (1556, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:42:15', '2021-02-18 19:42:15', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:33:15', '', '2021-02-08 04:33:15', b'0'); -INSERT INTO `inf_job_log` VALUES (1557, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:42:20', '2021-02-18 19:42:20', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:33:20', '', '2021-02-08 04:33:20', b'0'); -INSERT INTO `inf_job_log` VALUES (1558, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:42:25', '2021-02-18 19:42:25', 12, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:33:25', '', '2021-02-08 04:33:25', b'0'); -INSERT INTO `inf_job_log` VALUES (1559, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:42:30', '2021-02-18 19:42:30', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:33:30', '', '2021-02-08 04:33:30', b'0'); -INSERT INTO `inf_job_log` VALUES (1560, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:42:35', '2021-02-18 19:42:35', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:33:35', '', '2021-02-08 04:33:35', b'0'); -INSERT INTO `inf_job_log` VALUES (1561, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:42:40', '2021-02-18 19:42:40', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:33:40', '', '2021-02-08 04:33:40', b'0'); -INSERT INTO `inf_job_log` VALUES (1562, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:42:45', '2021-02-18 19:42:45', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:33:45', '', '2021-02-08 04:33:45', b'0'); -INSERT INTO `inf_job_log` VALUES (1563, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:42:50', '2021-02-18 19:42:50', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:33:50', '', '2021-02-08 04:33:50', b'0'); -INSERT INTO `inf_job_log` VALUES (1564, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:42:55', '2021-02-18 19:42:55', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:33:55', '', '2021-02-08 04:33:55', b'0'); -INSERT INTO `inf_job_log` VALUES (1565, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:43:00', '2021-02-18 19:43:00', 6, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:34:00', '', '2021-02-08 04:34:00', b'0'); -INSERT INTO `inf_job_log` VALUES (1566, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:43:05', '2021-02-18 19:43:05', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:34:05', '', '2021-02-08 04:34:05', b'0'); -INSERT INTO `inf_job_log` VALUES (1567, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:43:10', '2021-02-18 19:43:10', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:34:10', '', '2021-02-08 04:34:10', b'0'); -INSERT INTO `inf_job_log` VALUES (1568, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:43:15', '2021-02-18 19:43:15', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:34:15', '', '2021-02-08 04:34:15', b'0'); -INSERT INTO `inf_job_log` VALUES (1569, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:43:20', '2021-02-18 19:43:20', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:34:20', '', '2021-02-08 04:34:20', b'0'); -INSERT INTO `inf_job_log` VALUES (1570, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:43:25', '2021-02-18 19:43:25', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:34:25', '', '2021-02-08 04:34:25', b'0'); -INSERT INTO `inf_job_log` VALUES (1571, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:43:30', '2021-02-18 19:43:30', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:34:30', '', '2021-02-08 04:34:30', b'0'); -INSERT INTO `inf_job_log` VALUES (1572, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:43:35', '2021-02-18 19:43:35', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:34:35', '', '2021-02-08 04:34:35', b'0'); -INSERT INTO `inf_job_log` VALUES (1573, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:43:40', '2021-02-18 19:43:40', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:34:40', '', '2021-02-08 04:34:40', b'0'); -INSERT INTO `inf_job_log` VALUES (1574, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:43:45', '2021-02-18 19:43:45', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:34:45', '', '2021-02-08 04:34:45', b'0'); -INSERT INTO `inf_job_log` VALUES (1575, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:43:50', '2021-02-18 19:43:50', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:34:50', '', '2021-02-08 04:34:50', b'0'); -INSERT INTO `inf_job_log` VALUES (1576, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:43:55', '2021-02-18 19:43:55', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:34:55', '', '2021-02-08 04:34:55', b'0'); -INSERT INTO `inf_job_log` VALUES (1577, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:44:00', '2021-02-18 19:44:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:35:00', '', '2021-02-08 04:35:00', b'0'); -INSERT INTO `inf_job_log` VALUES (1578, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:44:05', '2021-02-18 19:44:05', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:35:05', '', '2021-02-08 04:35:05', b'0'); -INSERT INTO `inf_job_log` VALUES (1579, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:44:10', '2021-02-18 19:44:10', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:35:10', '', '2021-02-08 04:35:10', b'0'); -INSERT INTO `inf_job_log` VALUES (1580, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:44:15', '2021-02-18 19:44:15', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:35:15', '', '2021-02-08 04:35:15', b'0'); -INSERT INTO `inf_job_log` VALUES (1581, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:44:20', '2021-02-18 19:44:20', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:35:20', '', '2021-02-08 04:35:20', b'0'); -INSERT INTO `inf_job_log` VALUES (1582, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:44:25', '2021-02-18 19:44:25', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:35:25', '', '2021-02-08 04:35:25', b'0'); -INSERT INTO `inf_job_log` VALUES (1583, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:44:30', '2021-02-18 19:44:30', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:35:30', '', '2021-02-08 04:35:30', b'0'); -INSERT INTO `inf_job_log` VALUES (1584, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:44:35', '2021-02-18 19:44:35', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:35:35', '', '2021-02-08 04:35:35', b'0'); -INSERT INTO `inf_job_log` VALUES (1585, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:44:40', '2021-02-18 19:44:40', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:35:40', '', '2021-02-08 04:35:40', b'0'); -INSERT INTO `inf_job_log` VALUES (1586, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:44:45', '2021-02-18 19:44:45', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:35:45', '', '2021-02-08 04:35:45', b'0'); -INSERT INTO `inf_job_log` VALUES (1587, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:44:50', '2021-02-18 19:44:50', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:35:50', '', '2021-02-08 04:35:50', b'0'); -INSERT INTO `inf_job_log` VALUES (1588, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:44:55', '2021-02-18 19:44:55', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:35:55', '', '2021-02-08 04:35:55', b'0'); -INSERT INTO `inf_job_log` VALUES (1589, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:45:00', '2021-02-18 19:45:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:36:00', '', '2021-02-08 04:36:00', b'0'); -INSERT INTO `inf_job_log` VALUES (1590, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:45:05', '2021-02-18 19:45:05', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:36:05', '', '2021-02-08 04:36:05', b'0'); -INSERT INTO `inf_job_log` VALUES (1591, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:45:10', '2021-02-18 19:45:10', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:36:11', '', '2021-02-08 04:36:11', b'0'); -INSERT INTO `inf_job_log` VALUES (1592, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:45:15', '2021-02-18 19:45:15', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:36:16', '', '2021-02-08 04:36:16', b'0'); -INSERT INTO `inf_job_log` VALUES (1593, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:45:20', '2021-02-18 19:45:20', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:36:21', '', '2021-02-08 04:36:21', b'0'); -INSERT INTO `inf_job_log` VALUES (1594, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:45:25', '2021-02-18 19:45:25', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:36:26', '', '2021-02-08 04:36:26', b'0'); -INSERT INTO `inf_job_log` VALUES (1595, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:45:30', '2021-02-18 19:45:30', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:36:31', '', '2021-02-08 04:36:31', b'0'); -INSERT INTO `inf_job_log` VALUES (1596, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:45:35', '2021-02-18 19:45:35', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:36:36', '', '2021-02-08 04:36:36', b'0'); -INSERT INTO `inf_job_log` VALUES (1597, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:45:40', '2021-02-18 19:45:40', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:36:41', '', '2021-02-08 04:36:41', b'0'); -INSERT INTO `inf_job_log` VALUES (1598, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:45:45', '2021-02-18 19:45:45', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:36:46', '', '2021-02-08 04:36:46', b'0'); -INSERT INTO `inf_job_log` VALUES (1599, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:45:50', '2021-02-18 19:45:50', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:36:51', '', '2021-02-08 04:36:51', b'0'); -INSERT INTO `inf_job_log` VALUES (1600, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:45:55', '2021-02-18 19:45:55', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:36:56', '', '2021-02-08 04:36:56', b'0'); -INSERT INTO `inf_job_log` VALUES (1601, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:46:00', '2021-02-18 19:46:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:37:01', '', '2021-02-08 04:37:01', b'0'); -INSERT INTO `inf_job_log` VALUES (1602, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 19:46:00', '2021-02-18 19:46:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:37:01', '', '2021-02-08 04:37:01', b'0'); -INSERT INTO `inf_job_log` VALUES (1603, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 19:46:00', '2021-02-18 19:46:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:37:01', '', '2021-02-08 04:37:01', b'0'); -INSERT INTO `inf_job_log` VALUES (1604, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 19:46:00', '2021-02-18 19:46:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:37:01', '', '2021-02-08 04:37:01', b'0'); -INSERT INTO `inf_job_log` VALUES (1605, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:46:10', '2021-02-18 19:46:10', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:37:11', '', '2021-02-08 04:37:11', b'0'); -INSERT INTO `inf_job_log` VALUES (1606, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 19:46:10', '2021-02-18 19:46:10', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:37:11', '', '2021-02-08 04:37:11', b'0'); -INSERT INTO `inf_job_log` VALUES (1607, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 19:46:10', '2021-02-18 19:46:10', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:37:11', '', '2021-02-08 04:37:11', b'0'); -INSERT INTO `inf_job_log` VALUES (1608, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 19:46:10', '2021-02-18 19:46:10', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:37:11', '', '2021-02-08 04:37:11', b'0'); -INSERT INTO `inf_job_log` VALUES (1609, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:46:20', '2021-02-18 19:46:20', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:37:21', '', '2021-02-08 04:37:21', b'0'); -INSERT INTO `inf_job_log` VALUES (1610, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 19:46:20', '2021-02-18 19:46:20', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:37:21', '', '2021-02-08 04:37:21', b'0'); -INSERT INTO `inf_job_log` VALUES (1611, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 19:46:20', '2021-02-18 19:46:20', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:37:21', '', '2021-02-08 04:37:21', b'0'); -INSERT INTO `inf_job_log` VALUES (1612, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 19:46:20', '2021-02-18 19:46:20', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:37:21', '', '2021-02-08 04:37:21', b'0'); -INSERT INTO `inf_job_log` VALUES (1613, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:46:30', '2021-02-18 19:46:30', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:37:31', '', '2021-02-08 04:38:13', b'0'); -INSERT INTO `inf_job_log` VALUES (1614, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 19:47:12', '2021-02-18 19:47:12', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:38:13', '', '2021-02-08 04:38:13', b'0'); -INSERT INTO `inf_job_log` VALUES (1615, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 19:47:12', '2021-02-18 19:47:12', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:38:13', '', '2021-02-08 04:38:14', b'0'); -INSERT INTO `inf_job_log` VALUES (1616, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 19:47:13', '2021-02-18 19:47:13', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:38:14', '', '2021-02-08 04:38:14', b'0'); -INSERT INTO `inf_job_log` VALUES (1617, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:47:13', '2021-02-18 19:47:13', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:38:14', '', '2021-02-08 04:38:14', b'0'); -INSERT INTO `inf_job_log` VALUES (1618, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 19:47:13', '2021-02-18 19:47:13', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:38:14', '', '2021-02-08 04:38:14', b'0'); -INSERT INTO `inf_job_log` VALUES (1619, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 19:47:13', '2021-02-18 19:47:13', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:38:14', '', '2021-02-08 04:38:14', b'0'); -INSERT INTO `inf_job_log` VALUES (1620, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 19:47:13', '2021-02-18 19:47:13', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:38:14', '', '2021-02-08 04:38:14', b'0'); -INSERT INTO `inf_job_log` VALUES (1621, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:47:13', '2021-02-18 19:47:13', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:38:14', '', '2021-02-08 04:38:14', b'0'); -INSERT INTO `inf_job_log` VALUES (1622, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 19:47:13', '2021-02-18 19:47:13', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:38:14', '', '2021-02-08 04:38:14', b'0'); -INSERT INTO `inf_job_log` VALUES (1623, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 19:47:13', '2021-02-18 19:47:13', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:38:14', '', '2021-02-08 04:38:14', b'0'); -INSERT INTO `inf_job_log` VALUES (1624, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 19:47:13', '2021-02-18 19:47:13', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:38:14', '', '2021-02-08 04:38:14', b'0'); -INSERT INTO `inf_job_log` VALUES (1625, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:47:27', '2021-02-18 19:47:27', 26, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:38:27', '', '2021-02-08 04:38:45', b'0'); -INSERT INTO `inf_job_log` VALUES (1626, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 19:47:49', '2021-02-18 19:47:49', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:38:49', '', '2021-02-08 04:38:53', b'0'); -INSERT INTO `inf_job_log` VALUES (1627, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 19:47:56', '2021-02-18 19:47:56', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:38:57', '', '2021-02-08 04:39:00', b'0'); -INSERT INTO `inf_job_log` VALUES (1628, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 19:48:11', '2021-02-18 19:48:11', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:39:12', '', '2021-02-08 04:39:15', b'0'); -INSERT INTO `inf_job_log` VALUES (1629, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:51:43', '2021-02-18 19:51:43', 31, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:42:44', '', '2021-02-08 04:42:44', b'0'); -INSERT INTO `inf_job_log` VALUES (1630, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 19:51:45', '2021-02-18 19:51:45', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:42:46', '', '2021-02-08 04:42:46', b'0'); -INSERT INTO `inf_job_log` VALUES (1631, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 19:51:47', '2021-02-18 19:51:47', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:42:48', '', '2021-02-08 04:42:48', b'0'); -INSERT INTO `inf_job_log` VALUES (1632, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 19:51:49', '2021-02-18 19:51:49', 6, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:42:50', '', '2021-02-08 04:42:50', b'0'); -INSERT INTO `inf_job_log` VALUES (1633, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:51:50', '2021-02-18 19:51:50', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:42:51', '', '2021-02-08 04:42:51', b'0'); -INSERT INTO `inf_job_log` VALUES (1634, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 19:51:52', '2021-02-18 19:51:52', 7, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:42:53', '', '2021-02-08 04:42:53', b'0'); -INSERT INTO `inf_job_log` VALUES (1635, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 19:51:54', '2021-02-18 19:51:54', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:42:55', '', '2021-02-08 04:42:55', b'0'); -INSERT INTO `inf_job_log` VALUES (1636, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 19:51:56', '2021-02-18 19:51:56', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:42:57', '', '2021-02-08 04:42:57', b'0'); -INSERT INTO `inf_job_log` VALUES (1637, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:52:00', '2021-02-18 19:52:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:43:01', '', '2021-02-08 04:43:01', b'0'); -INSERT INTO `inf_job_log` VALUES (1638, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 19:52:02', '2021-02-18 19:52:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:43:03', '', '2021-02-08 04:43:03', b'0'); -INSERT INTO `inf_job_log` VALUES (1639, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 19:52:04', '2021-02-18 19:52:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:43:05', '', '2021-02-08 04:43:05', b'0'); -INSERT INTO `inf_job_log` VALUES (1640, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 19:52:06', '2021-02-18 19:52:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:43:07', '', '2021-02-08 04:43:07', b'0'); -INSERT INTO `inf_job_log` VALUES (1641, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:52:10', '2021-02-18 19:52:10', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:43:11', '', '2021-02-08 04:43:11', b'0'); -INSERT INTO `inf_job_log` VALUES (1642, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 19:52:12', '2021-02-18 19:52:12', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:43:13', '', '2021-02-08 04:43:13', b'0'); -INSERT INTO `inf_job_log` VALUES (1643, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 19:52:14', '2021-02-18 19:52:14', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:43:15', '', '2021-02-08 04:43:15', b'0'); -INSERT INTO `inf_job_log` VALUES (1644, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 19:52:16', '2021-02-18 19:52:16', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:43:17', '', '2021-02-08 04:43:17', b'0'); -INSERT INTO `inf_job_log` VALUES (1645, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:52:20', '2021-02-18 19:52:20', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:43:21', '', '2021-02-08 04:43:21', b'0'); -INSERT INTO `inf_job_log` VALUES (1646, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 19:52:22', '2021-02-18 19:52:22', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:43:23', '', '2021-02-08 04:43:23', b'0'); -INSERT INTO `inf_job_log` VALUES (1647, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 19:52:24', '2021-02-18 19:52:24', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:43:25', '', '2021-02-08 04:43:25', b'0'); -INSERT INTO `inf_job_log` VALUES (1648, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 19:52:26', '2021-02-18 19:52:26', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:43:27', '', '2021-02-08 04:43:27', b'0'); -INSERT INTO `inf_job_log` VALUES (1649, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:52:37', '2021-02-18 19:52:37', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:43:38', '', '2021-02-08 04:43:38', b'0'); -INSERT INTO `inf_job_log` VALUES (1650, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 19:52:39', '2021-02-18 19:52:39', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:43:40', '', '2021-02-08 04:43:40', b'0'); -INSERT INTO `inf_job_log` VALUES (1651, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 19:52:41', '2021-02-18 19:52:41', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:43:42', '', '2021-02-08 04:43:42', b'0'); -INSERT INTO `inf_job_log` VALUES (1652, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 19:52:43', '2021-02-18 19:52:43', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:43:44', '', '2021-02-08 04:43:44', b'0'); -INSERT INTO `inf_job_log` VALUES (1653, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:52:43', '2021-02-18 19:52:43', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:43:44', '', '2021-02-08 04:43:44', b'0'); -INSERT INTO `inf_job_log` VALUES (1654, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 19:52:45', '2021-02-18 19:52:45', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:43:46', '', '2021-02-08 04:43:46', b'0'); -INSERT INTO `inf_job_log` VALUES (1655, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 19:52:47', '2021-02-18 19:52:47', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:43:48', '', '2021-02-08 04:43:48', b'0'); -INSERT INTO `inf_job_log` VALUES (1656, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 19:52:49', '2021-02-18 19:52:49', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:43:50', '', '2021-02-08 04:43:50', b'0'); -INSERT INTO `inf_job_log` VALUES (1657, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:52:50', '2021-02-18 19:52:50', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:43:51', '', '2021-02-08 04:43:51', b'0'); -INSERT INTO `inf_job_log` VALUES (1658, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 19:52:52', '2021-02-18 19:52:52', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:43:53', '', '2021-02-08 04:43:53', b'0'); -INSERT INTO `inf_job_log` VALUES (1659, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 19:52:54', '2021-02-18 19:52:54', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:43:55', '', '2021-02-08 04:43:55', b'0'); -INSERT INTO `inf_job_log` VALUES (1660, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 19:52:56', '2021-02-18 19:52:56', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:43:57', '', '2021-02-08 04:43:57', b'0'); -INSERT INTO `inf_job_log` VALUES (1661, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:53:00', '2021-02-18 19:53:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:44:01', '', '2021-02-08 04:44:01', b'0'); -INSERT INTO `inf_job_log` VALUES (1662, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 19:53:02', '2021-02-18 19:53:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:44:03', '', '2021-02-08 04:44:03', b'0'); -INSERT INTO `inf_job_log` VALUES (1663, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 19:53:04', '2021-02-18 19:53:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:44:05', '', '2021-02-08 04:44:05', b'0'); -INSERT INTO `inf_job_log` VALUES (1664, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 19:53:06', '2021-02-18 19:53:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:44:07', '', '2021-02-08 04:44:07', b'0'); -INSERT INTO `inf_job_log` VALUES (1665, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:53:10', '2021-02-18 19:53:10', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:44:11', '', '2021-02-08 04:44:11', b'0'); -INSERT INTO `inf_job_log` VALUES (1666, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 19:53:12', '2021-02-18 19:53:12', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:44:13', '', '2021-02-08 04:44:13', b'0'); -INSERT INTO `inf_job_log` VALUES (1667, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 19:53:14', '2021-02-18 19:53:14', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:44:15', '', '2021-02-08 04:44:15', b'0'); -INSERT INTO `inf_job_log` VALUES (1668, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 19:53:16', '2021-02-18 19:53:16', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:44:17', '', '2021-02-08 04:44:17', b'0'); -INSERT INTO `inf_job_log` VALUES (1669, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:53:20', '2021-02-18 19:53:20', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:44:21', '', '2021-02-08 04:44:21', b'0'); -INSERT INTO `inf_job_log` VALUES (1670, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 19:53:22', '2021-02-18 19:53:22', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:44:23', '', '2021-02-08 04:44:23', b'0'); -INSERT INTO `inf_job_log` VALUES (1671, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 19:53:24', '2021-02-18 19:53:24', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:44:25', '', '2021-02-08 04:44:25', b'0'); -INSERT INTO `inf_job_log` VALUES (1672, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 19:53:26', '2021-02-18 19:53:26', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:44:27', '', '2021-02-08 04:44:27', b'0'); -INSERT INTO `inf_job_log` VALUES (1673, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:53:30', '2021-02-18 19:53:30', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:44:31', '', '2021-02-08 04:44:31', b'0'); -INSERT INTO `inf_job_log` VALUES (1674, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 19:53:32', '2021-02-18 19:53:32', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:44:33', '', '2021-02-08 04:44:33', b'0'); -INSERT INTO `inf_job_log` VALUES (1675, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 19:53:34', '2021-02-18 19:53:34', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:44:35', '', '2021-02-08 04:44:35', b'0'); -INSERT INTO `inf_job_log` VALUES (1676, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 19:53:36', '2021-02-18 19:53:36', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:44:37', '', '2021-02-08 04:44:37', b'0'); -INSERT INTO `inf_job_log` VALUES (1677, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:53:40', '2021-02-18 19:53:40', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:44:41', '', '2021-02-08 04:44:41', b'0'); -INSERT INTO `inf_job_log` VALUES (1678, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 19:53:42', '2021-02-18 19:53:42', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:44:43', '', '2021-02-08 04:44:43', b'0'); -INSERT INTO `inf_job_log` VALUES (1679, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 19:53:44', '2021-02-18 19:53:44', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:44:45', '', '2021-02-08 04:44:45', b'0'); -INSERT INTO `inf_job_log` VALUES (1680, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 19:53:46', '2021-02-18 19:53:46', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:44:47', '', '2021-02-08 04:44:47', b'0'); -INSERT INTO `inf_job_log` VALUES (1681, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:53:50', '2021-02-18 19:53:50', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:44:51', '', '2021-02-08 04:44:51', b'0'); -INSERT INTO `inf_job_log` VALUES (1682, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 19:53:52', '2021-02-18 19:53:52', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:44:53', '', '2021-02-08 04:44:53', b'0'); -INSERT INTO `inf_job_log` VALUES (1683, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 19:53:54', '2021-02-18 19:53:54', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:44:55', '', '2021-02-08 04:44:55', b'0'); -INSERT INTO `inf_job_log` VALUES (1684, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 19:53:56', '2021-02-18 19:53:56', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:44:57', '', '2021-02-08 04:44:57', b'0'); -INSERT INTO `inf_job_log` VALUES (1685, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:54:00', '2021-02-18 19:54:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:45:01', '', '2021-02-08 04:45:01', b'0'); -INSERT INTO `inf_job_log` VALUES (1686, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 19:54:02', '2021-02-18 19:54:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:45:03', '', '2021-02-08 04:45:03', b'0'); -INSERT INTO `inf_job_log` VALUES (1687, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 19:54:04', '2021-02-18 19:54:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:45:05', '', '2021-02-08 04:45:05', b'0'); -INSERT INTO `inf_job_log` VALUES (1688, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 19:54:06', '2021-02-18 19:54:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:45:07', '', '2021-02-08 04:45:07', b'0'); -INSERT INTO `inf_job_log` VALUES (1689, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:55:00', '2021-02-18 19:55:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:46:01', '', '2021-02-08 04:46:01', b'0'); -INSERT INTO `inf_job_log` VALUES (1690, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 19:55:02', '2021-02-18 19:55:02', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:46:03', '', '2021-02-08 04:46:03', b'0'); -INSERT INTO `inf_job_log` VALUES (1691, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 19:55:04', '2021-02-18 19:55:04', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:46:05', '', '2021-02-08 04:46:05', b'0'); -INSERT INTO `inf_job_log` VALUES (1692, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 19:55:06', '2021-02-18 19:55:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:46:07', '', '2021-02-08 04:46:07', b'0'); -INSERT INTO `inf_job_log` VALUES (1693, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:56:00', '2021-02-18 19:56:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:47:01', '', '2021-02-08 04:47:01', b'0'); -INSERT INTO `inf_job_log` VALUES (1694, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 19:56:02', '2021-02-18 19:56:02', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:47:03', '', '2021-02-08 04:47:03', b'0'); -INSERT INTO `inf_job_log` VALUES (1695, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 19:56:04', '2021-02-18 19:56:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:47:05', '', '2021-02-08 04:47:05', b'0'); -INSERT INTO `inf_job_log` VALUES (1696, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 19:56:06', '2021-02-18 19:56:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:47:07', '', '2021-02-08 04:47:07', b'0'); -INSERT INTO `inf_job_log` VALUES (1697, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:57:00', '2021-02-18 19:57:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:48:01', '', '2021-02-08 04:48:01', b'0'); -INSERT INTO `inf_job_log` VALUES (1698, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 19:57:02', '2021-02-18 19:57:02', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:48:03', '', '2021-02-08 04:48:03', b'0'); -INSERT INTO `inf_job_log` VALUES (1699, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 19:57:04', '2021-02-18 19:57:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:48:05', '', '2021-02-08 04:48:05', b'0'); -INSERT INTO `inf_job_log` VALUES (1700, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 19:57:06', '2021-02-18 19:57:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:48:07', '', '2021-02-08 04:48:07', b'0'); -INSERT INTO `inf_job_log` VALUES (1701, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:58:00', '2021-02-18 19:58:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:49:01', '', '2021-02-08 04:49:01', b'0'); -INSERT INTO `inf_job_log` VALUES (1702, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 19:58:02', '2021-02-18 19:58:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:49:03', '', '2021-02-08 04:49:03', b'0'); -INSERT INTO `inf_job_log` VALUES (1703, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 19:58:04', '2021-02-18 19:58:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:49:05', '', '2021-02-08 04:49:05', b'0'); -INSERT INTO `inf_job_log` VALUES (1704, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 19:58:06', '2021-02-18 19:58:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:49:07', '', '2021-02-08 04:49:07', b'0'); -INSERT INTO `inf_job_log` VALUES (1705, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 19:59:00', '2021-02-18 19:59:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:50:01', '', '2021-02-08 04:50:01', b'0'); -INSERT INTO `inf_job_log` VALUES (1706, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 19:59:02', '2021-02-18 19:59:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:50:03', '', '2021-02-08 04:50:03', b'0'); -INSERT INTO `inf_job_log` VALUES (1707, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 19:59:04', '2021-02-18 19:59:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:50:05', '', '2021-02-08 04:50:05', b'0'); -INSERT INTO `inf_job_log` VALUES (1708, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 19:59:06', '2021-02-18 19:59:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:50:07', '', '2021-02-08 04:50:07', b'0'); -INSERT INTO `inf_job_log` VALUES (1709, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 20:00:00', '2021-02-18 20:00:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:51:02', '', '2021-02-08 04:51:02', b'0'); -INSERT INTO `inf_job_log` VALUES (1710, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 20:00:02', '2021-02-18 20:00:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:51:04', '', '2021-02-08 04:51:04', b'0'); -INSERT INTO `inf_job_log` VALUES (1711, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 20:00:04', '2021-02-18 20:00:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:51:06', '', '2021-02-08 04:51:06', b'0'); -INSERT INTO `inf_job_log` VALUES (1712, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 20:00:06', '2021-02-18 20:00:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:51:08', '', '2021-02-08 04:51:08', b'0'); -INSERT INTO `inf_job_log` VALUES (1713, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 20:01:00', '2021-02-18 20:01:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:52:02', '', '2021-02-08 04:52:02', b'0'); -INSERT INTO `inf_job_log` VALUES (1714, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 20:01:02', '2021-02-18 20:01:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:52:04', '', '2021-02-08 04:52:04', b'0'); -INSERT INTO `inf_job_log` VALUES (1715, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 20:01:04', '2021-02-18 20:01:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:52:06', '', '2021-02-08 04:52:06', b'0'); -INSERT INTO `inf_job_log` VALUES (1716, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 20:01:06', '2021-02-18 20:01:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:52:08', '', '2021-02-08 04:52:08', b'0'); -INSERT INTO `inf_job_log` VALUES (1717, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 20:02:00', '2021-02-18 20:02:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:53:02', '', '2021-02-08 04:53:02', b'0'); -INSERT INTO `inf_job_log` VALUES (1718, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 20:02:02', '2021-02-18 20:02:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:53:04', '', '2021-02-08 04:53:04', b'0'); -INSERT INTO `inf_job_log` VALUES (1719, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 20:02:04', '2021-02-18 20:02:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:53:06', '', '2021-02-08 04:53:06', b'0'); -INSERT INTO `inf_job_log` VALUES (1720, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 20:02:06', '2021-02-18 20:02:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:53:08', '', '2021-02-08 04:53:08', b'0'); -INSERT INTO `inf_job_log` VALUES (1721, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 20:03:00', '2021-02-18 20:03:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:54:02', '', '2021-02-08 04:54:02', b'0'); -INSERT INTO `inf_job_log` VALUES (1722, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 20:03:02', '2021-02-18 20:03:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:54:04', '', '2021-02-08 04:54:04', b'0'); -INSERT INTO `inf_job_log` VALUES (1723, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 20:03:04', '2021-02-18 20:03:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:54:06', '', '2021-02-08 04:54:06', b'0'); -INSERT INTO `inf_job_log` VALUES (1724, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 20:03:06', '2021-02-18 20:03:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:54:08', '', '2021-02-08 04:54:08', b'0'); -INSERT INTO `inf_job_log` VALUES (1725, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 20:04:00', '2021-02-18 20:04:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:55:02', '', '2021-02-08 04:55:02', b'0'); -INSERT INTO `inf_job_log` VALUES (1726, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 20:04:02', '2021-02-18 20:04:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:55:04', '', '2021-02-08 04:55:04', b'0'); -INSERT INTO `inf_job_log` VALUES (1727, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 20:04:04', '2021-02-18 20:04:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:55:06', '', '2021-02-08 04:55:06', b'0'); -INSERT INTO `inf_job_log` VALUES (1728, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 20:04:06', '2021-02-18 20:04:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:55:08', '', '2021-02-08 04:55:08', b'0'); -INSERT INTO `inf_job_log` VALUES (1729, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 20:05:00', '2021-02-18 20:05:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:56:02', '', '2021-02-08 04:56:02', b'0'); -INSERT INTO `inf_job_log` VALUES (1730, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 20:05:02', '2021-02-18 20:05:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:56:04', '', '2021-02-08 04:56:04', b'0'); -INSERT INTO `inf_job_log` VALUES (1731, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 20:05:04', '2021-02-18 20:05:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:56:06', '', '2021-02-08 04:56:06', b'0'); -INSERT INTO `inf_job_log` VALUES (1732, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 20:05:06', '2021-02-18 20:05:06', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:56:08', '', '2021-02-08 04:56:08', b'0'); -INSERT INTO `inf_job_log` VALUES (1733, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 20:06:00', '2021-02-18 20:06:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:57:02', '', '2021-02-08 04:57:02', b'0'); -INSERT INTO `inf_job_log` VALUES (1734, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 20:06:02', '2021-02-18 20:06:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:57:04', '', '2021-02-08 04:57:04', b'0'); -INSERT INTO `inf_job_log` VALUES (1735, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 20:06:04', '2021-02-18 20:06:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:57:06', '', '2021-02-08 04:57:06', b'0'); -INSERT INTO `inf_job_log` VALUES (1736, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 20:06:06', '2021-02-18 20:06:06', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:57:08', '', '2021-02-08 04:57:08', b'0'); -INSERT INTO `inf_job_log` VALUES (1737, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 20:07:00', '2021-02-18 20:07:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:58:02', '', '2021-02-08 04:58:02', b'0'); -INSERT INTO `inf_job_log` VALUES (1738, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 20:07:02', '2021-02-18 20:07:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:58:04', '', '2021-02-08 04:58:04', b'0'); -INSERT INTO `inf_job_log` VALUES (1739, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 20:07:04', '2021-02-18 20:07:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:58:06', '', '2021-02-08 04:58:06', b'0'); -INSERT INTO `inf_job_log` VALUES (1740, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 20:07:06', '2021-02-18 20:07:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:58:08', '', '2021-02-08 04:58:08', b'0'); -INSERT INTO `inf_job_log` VALUES (1741, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 20:08:00', '2021-02-18 20:08:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:59:02', '', '2021-02-08 04:59:02', b'0'); -INSERT INTO `inf_job_log` VALUES (1742, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 20:08:02', '2021-02-18 20:08:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:59:04', '', '2021-02-08 04:59:04', b'0'); -INSERT INTO `inf_job_log` VALUES (1743, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 20:08:04', '2021-02-18 20:08:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:59:06', '', '2021-02-08 04:59:06', b'0'); -INSERT INTO `inf_job_log` VALUES (1744, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 20:08:06', '2021-02-18 20:08:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 04:59:08', '', '2021-02-08 04:59:08', b'0'); -INSERT INTO `inf_job_log` VALUES (1745, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 20:09:00', '2021-02-18 20:09:00', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:00:02', '', '2021-02-08 05:00:02', b'0'); -INSERT INTO `inf_job_log` VALUES (1746, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 20:09:02', '2021-02-18 20:09:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:00:04', '', '2021-02-08 05:00:04', b'0'); -INSERT INTO `inf_job_log` VALUES (1747, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 20:09:04', '2021-02-18 20:09:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:00:06', '', '2021-02-08 05:00:06', b'0'); -INSERT INTO `inf_job_log` VALUES (1748, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 20:09:06', '2021-02-18 20:09:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:00:08', '', '2021-02-08 05:00:08', b'0'); -INSERT INTO `inf_job_log` VALUES (1749, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 20:10:00', '2021-02-18 20:10:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:01:02', '', '2021-02-08 05:01:02', b'0'); -INSERT INTO `inf_job_log` VALUES (1750, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 20:10:02', '2021-02-18 20:10:02', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:01:04', '', '2021-02-08 05:01:04', b'0'); -INSERT INTO `inf_job_log` VALUES (1751, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 20:10:04', '2021-02-18 20:10:04', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:01:06', '', '2021-02-08 05:01:06', b'0'); -INSERT INTO `inf_job_log` VALUES (1752, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 20:10:06', '2021-02-18 20:10:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:01:08', '', '2021-02-08 05:01:08', b'0'); -INSERT INTO `inf_job_log` VALUES (1753, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 20:11:00', '2021-02-18 20:11:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:02:02', '', '2021-02-08 05:02:02', b'0'); -INSERT INTO `inf_job_log` VALUES (1754, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 20:11:02', '2021-02-18 20:11:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:02:04', '', '2021-02-08 05:02:04', b'0'); -INSERT INTO `inf_job_log` VALUES (1755, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 20:11:04', '2021-02-18 20:11:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:02:06', '', '2021-02-08 05:02:06', b'0'); -INSERT INTO `inf_job_log` VALUES (1756, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 20:11:06', '2021-02-18 20:11:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:02:08', '', '2021-02-08 05:02:08', b'0'); -INSERT INTO `inf_job_log` VALUES (1757, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 20:12:00', '2021-02-18 20:12:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:03:02', '', '2021-02-08 05:03:02', b'0'); -INSERT INTO `inf_job_log` VALUES (1758, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 20:12:02', '2021-02-18 20:12:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:03:04', '', '2021-02-08 05:03:04', b'0'); -INSERT INTO `inf_job_log` VALUES (1759, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 20:12:04', '2021-02-18 20:12:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:03:06', '', '2021-02-08 05:03:06', b'0'); -INSERT INTO `inf_job_log` VALUES (1760, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 20:12:06', '2021-02-18 20:12:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:03:08', '', '2021-02-08 05:03:08', b'0'); -INSERT INTO `inf_job_log` VALUES (1761, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 20:13:00', '2021-02-18 20:13:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:04:02', '', '2021-02-08 05:04:02', b'0'); -INSERT INTO `inf_job_log` VALUES (1762, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 20:13:02', '2021-02-18 20:13:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:04:04', '', '2021-02-08 05:04:04', b'0'); -INSERT INTO `inf_job_log` VALUES (1763, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 20:13:04', '2021-02-18 20:13:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:04:06', '', '2021-02-08 05:04:06', b'0'); -INSERT INTO `inf_job_log` VALUES (1764, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 20:13:06', '2021-02-18 20:13:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:04:08', '', '2021-02-08 05:04:08', b'0'); -INSERT INTO `inf_job_log` VALUES (1765, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 20:14:00', '2021-02-18 20:14:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:05:02', '', '2021-02-08 05:05:02', b'0'); -INSERT INTO `inf_job_log` VALUES (1766, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 20:14:02', '2021-02-18 20:14:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:05:04', '', '2021-02-08 05:05:04', b'0'); -INSERT INTO `inf_job_log` VALUES (1767, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 20:14:04', '2021-02-18 20:14:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:05:06', '', '2021-02-08 05:05:06', b'0'); -INSERT INTO `inf_job_log` VALUES (1768, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 20:14:06', '2021-02-18 20:14:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:05:09', '', '2021-02-08 05:05:09', b'0'); -INSERT INTO `inf_job_log` VALUES (1769, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 20:15:00', '2021-02-18 20:15:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:06:03', '', '2021-02-08 05:06:03', b'0'); -INSERT INTO `inf_job_log` VALUES (1770, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 20:15:02', '2021-02-18 20:15:02', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:06:05', '', '2021-02-08 05:06:05', b'0'); -INSERT INTO `inf_job_log` VALUES (1771, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 20:15:04', '2021-02-18 20:15:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:06:07', '', '2021-02-08 05:06:07', b'0'); -INSERT INTO `inf_job_log` VALUES (1772, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 20:15:06', '2021-02-18 20:15:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:06:09', '', '2021-02-08 05:06:09', b'0'); -INSERT INTO `inf_job_log` VALUES (1773, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 20:16:00', '2021-02-18 20:16:00', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:07:03', '', '2021-02-08 05:07:03', b'0'); -INSERT INTO `inf_job_log` VALUES (1774, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 20:16:02', '2021-02-18 20:16:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:07:05', '', '2021-02-08 05:07:05', b'0'); -INSERT INTO `inf_job_log` VALUES (1775, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 20:16:04', '2021-02-18 20:16:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:07:07', '', '2021-02-08 05:07:07', b'0'); -INSERT INTO `inf_job_log` VALUES (1776, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 20:16:06', '2021-02-18 20:16:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:07:09', '', '2021-02-08 05:07:09', b'0'); -INSERT INTO `inf_job_log` VALUES (1777, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 20:17:00', '2021-02-18 20:17:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:08:03', '', '2021-02-08 05:08:03', b'0'); -INSERT INTO `inf_job_log` VALUES (1778, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 20:17:02', '2021-02-18 20:17:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:08:05', '', '2021-02-08 05:08:05', b'0'); -INSERT INTO `inf_job_log` VALUES (1779, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 20:17:04', '2021-02-18 20:17:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:08:07', '', '2021-02-08 05:08:07', b'0'); -INSERT INTO `inf_job_log` VALUES (1780, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 20:17:06', '2021-02-18 20:17:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:08:09', '', '2021-02-08 05:08:09', b'0'); -INSERT INTO `inf_job_log` VALUES (1781, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 20:18:00', '2021-02-18 20:18:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:09:03', '', '2021-02-08 05:09:03', b'0'); -INSERT INTO `inf_job_log` VALUES (1782, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 20:18:02', '2021-02-18 20:18:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:09:05', '', '2021-02-08 05:09:05', b'0'); -INSERT INTO `inf_job_log` VALUES (1783, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 20:18:04', '2021-02-18 20:18:04', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:09:07', '', '2021-02-08 05:09:07', b'0'); -INSERT INTO `inf_job_log` VALUES (1784, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 20:18:06', '2021-02-18 20:18:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:09:09', '', '2021-02-08 05:09:09', b'0'); -INSERT INTO `inf_job_log` VALUES (1785, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 20:19:12', '2021-02-18 20:19:12', 24, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:10:15', '', '2021-02-08 05:10:15', b'0'); -INSERT INTO `inf_job_log` VALUES (1786, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 20:19:14', '2021-02-18 20:19:14', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:10:17', '', '2021-02-08 05:10:17', b'0'); -INSERT INTO `inf_job_log` VALUES (1787, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 20:19:16', '2021-02-18 20:19:16', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:10:19', '', '2021-02-08 05:10:19', b'0'); -INSERT INTO `inf_job_log` VALUES (1788, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 20:19:18', '2021-02-18 20:19:18', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:10:21', '', '2021-02-08 05:10:21', b'0'); -INSERT INTO `inf_job_log` VALUES (1789, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 20:20:00', '2021-02-18 20:20:00', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:11:03', '', '2021-02-08 05:11:03', b'0'); -INSERT INTO `inf_job_log` VALUES (1790, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 20:20:02', '2021-02-18 20:20:02', 6, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:11:05', '', '2021-02-08 05:11:05', b'0'); -INSERT INTO `inf_job_log` VALUES (1791, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 20:20:04', '2021-02-18 20:20:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:11:07', '', '2021-02-08 05:11:07', b'0'); -INSERT INTO `inf_job_log` VALUES (1792, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 20:20:06', '2021-02-18 20:20:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:11:09', '', '2021-02-08 05:11:09', b'0'); -INSERT INTO `inf_job_log` VALUES (1793, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 20:21:00', '2021-02-18 20:21:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:12:03', '', '2021-02-08 05:12:03', b'0'); -INSERT INTO `inf_job_log` VALUES (1794, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 20:21:02', '2021-02-18 20:21:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:12:05', '', '2021-02-08 05:12:05', b'0'); -INSERT INTO `inf_job_log` VALUES (1795, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 20:21:04', '2021-02-18 20:21:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:12:07', '', '2021-02-08 05:12:07', b'0'); -INSERT INTO `inf_job_log` VALUES (1796, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 20:21:06', '2021-02-18 20:21:06', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:12:09', '', '2021-02-08 05:12:09', b'0'); -INSERT INTO `inf_job_log` VALUES (1797, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 20:22:00', '2021-02-18 20:22:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:13:03', '', '2021-02-08 05:13:03', b'0'); -INSERT INTO `inf_job_log` VALUES (1798, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 20:22:02', '2021-02-18 20:22:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:13:05', '', '2021-02-08 05:13:05', b'0'); -INSERT INTO `inf_job_log` VALUES (1799, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 20:22:04', '2021-02-18 20:22:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:13:07', '', '2021-02-08 05:13:07', b'0'); -INSERT INTO `inf_job_log` VALUES (1800, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 20:22:06', '2021-02-18 20:22:06', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:13:09', '', '2021-02-08 05:13:09', b'0'); -INSERT INTO `inf_job_log` VALUES (1801, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 20:23:00', '2021-02-18 20:23:00', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:14:03', '', '2021-02-08 05:14:03', b'0'); -INSERT INTO `inf_job_log` VALUES (1802, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 20:23:02', '2021-02-18 20:23:02', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:14:05', '', '2021-02-08 05:14:05', b'0'); -INSERT INTO `inf_job_log` VALUES (1803, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 20:23:04', '2021-02-18 20:23:04', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:14:07', '', '2021-02-08 05:14:07', b'0'); -INSERT INTO `inf_job_log` VALUES (1804, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 20:23:06', '2021-02-18 20:23:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:14:09', '', '2021-02-08 05:14:09', b'0'); -INSERT INTO `inf_job_log` VALUES (1805, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 20:24:00', '2021-02-18 20:24:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:15:03', '', '2021-02-08 05:15:03', b'0'); -INSERT INTO `inf_job_log` VALUES (1806, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 20:24:02', '2021-02-18 20:24:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:15:05', '', '2021-02-08 05:15:05', b'0'); -INSERT INTO `inf_job_log` VALUES (1807, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 20:24:04', '2021-02-18 20:24:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:15:07', '', '2021-02-08 05:15:07', b'0'); -INSERT INTO `inf_job_log` VALUES (1808, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 20:24:06', '2021-02-18 20:24:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:15:09', '', '2021-02-08 05:15:09', b'0'); -INSERT INTO `inf_job_log` VALUES (1809, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 20:25:00', '2021-02-18 20:25:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:16:03', '', '2021-02-08 05:16:03', b'0'); -INSERT INTO `inf_job_log` VALUES (1810, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 20:25:02', '2021-02-18 20:25:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:16:05', '', '2021-02-08 05:16:05', b'0'); -INSERT INTO `inf_job_log` VALUES (1811, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 20:25:04', '2021-02-18 20:25:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:16:07', '', '2021-02-08 05:16:07', b'0'); -INSERT INTO `inf_job_log` VALUES (1812, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 20:25:06', '2021-02-18 20:25:06', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:16:09', '', '2021-02-08 05:16:09', b'0'); -INSERT INTO `inf_job_log` VALUES (1813, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 20:26:00', '2021-02-18 20:26:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:17:03', '', '2021-02-08 05:17:03', b'0'); -INSERT INTO `inf_job_log` VALUES (1814, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 20:26:02', '2021-02-18 20:26:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:17:05', '', '2021-02-08 05:17:05', b'0'); -INSERT INTO `inf_job_log` VALUES (1815, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 20:26:04', '2021-02-18 20:26:04', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:17:07', '', '2021-02-08 05:17:07', b'0'); -INSERT INTO `inf_job_log` VALUES (1816, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 20:26:06', '2021-02-18 20:26:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:17:09', '', '2021-02-08 05:17:09', b'0'); -INSERT INTO `inf_job_log` VALUES (1817, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 20:27:00', '2021-02-18 20:27:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:18:03', '', '2021-02-08 05:18:03', b'0'); -INSERT INTO `inf_job_log` VALUES (1818, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 20:27:02', '2021-02-18 20:27:02', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:18:05', '', '2021-02-08 05:18:05', b'0'); -INSERT INTO `inf_job_log` VALUES (1819, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 20:27:04', '2021-02-18 20:27:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:18:07', '', '2021-02-08 05:18:07', b'0'); -INSERT INTO `inf_job_log` VALUES (1820, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 20:27:06', '2021-02-18 20:27:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:18:09', '', '2021-02-08 05:18:09', b'0'); -INSERT INTO `inf_job_log` VALUES (1821, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 20:28:00', '2021-02-18 20:28:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:19:03', '', '2021-02-08 05:19:03', b'0'); -INSERT INTO `inf_job_log` VALUES (1822, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 20:28:02', '2021-02-18 20:28:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:19:05', '', '2021-02-08 05:19:05', b'0'); -INSERT INTO `inf_job_log` VALUES (1823, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 20:28:04', '2021-02-18 20:28:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:19:07', '', '2021-02-08 05:19:07', b'0'); -INSERT INTO `inf_job_log` VALUES (1824, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 20:28:06', '2021-02-18 20:28:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:19:09', '', '2021-02-08 05:19:09', b'0'); -INSERT INTO `inf_job_log` VALUES (1825, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 20:29:00', '2021-02-18 20:29:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:20:04', '', '2021-02-08 05:20:04', b'0'); -INSERT INTO `inf_job_log` VALUES (1826, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 20:29:02', '2021-02-18 20:29:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:20:06', '', '2021-02-08 05:20:06', b'0'); -INSERT INTO `inf_job_log` VALUES (1827, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 20:29:04', '2021-02-18 20:29:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:20:08', '', '2021-02-08 05:20:08', b'0'); -INSERT INTO `inf_job_log` VALUES (1828, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 20:29:06', '2021-02-18 20:29:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:20:10', '', '2021-02-08 05:20:10', b'0'); -INSERT INTO `inf_job_log` VALUES (1829, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 20:30:00', '2021-02-18 20:30:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:21:04', '', '2021-02-08 05:21:04', b'0'); -INSERT INTO `inf_job_log` VALUES (1830, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 20:30:02', '2021-02-18 20:30:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:21:06', '', '2021-02-08 05:21:06', b'0'); -INSERT INTO `inf_job_log` VALUES (1831, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 20:30:04', '2021-02-18 20:30:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:21:08', '', '2021-02-08 05:21:08', b'0'); -INSERT INTO `inf_job_log` VALUES (1832, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 20:30:06', '2021-02-18 20:30:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:21:10', '', '2021-02-08 05:21:10', b'0'); -INSERT INTO `inf_job_log` VALUES (1833, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 20:31:00', '2021-02-18 20:31:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:22:04', '', '2021-02-08 05:22:04', b'0'); -INSERT INTO `inf_job_log` VALUES (1834, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 20:31:02', '2021-02-18 20:31:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:22:06', '', '2021-02-08 05:22:06', b'0'); -INSERT INTO `inf_job_log` VALUES (1835, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 20:31:04', '2021-02-18 20:31:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:22:08', '', '2021-02-08 05:22:08', b'0'); -INSERT INTO `inf_job_log` VALUES (1836, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 20:31:06', '2021-02-18 20:31:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:22:10', '', '2021-02-08 05:22:10', b'0'); -INSERT INTO `inf_job_log` VALUES (1837, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 20:32:00', '2021-02-18 20:32:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:23:04', '', '2021-02-08 05:23:04', b'0'); -INSERT INTO `inf_job_log` VALUES (1838, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 20:32:02', '2021-02-18 20:32:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:23:06', '', '2021-02-08 05:23:06', b'0'); -INSERT INTO `inf_job_log` VALUES (1839, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 20:32:04', '2021-02-18 20:32:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:23:08', '', '2021-02-08 05:23:08', b'0'); -INSERT INTO `inf_job_log` VALUES (1840, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 20:32:06', '2021-02-18 20:32:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:23:10', '', '2021-02-08 05:23:10', b'0'); -INSERT INTO `inf_job_log` VALUES (1841, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 20:33:00', '2021-02-18 20:33:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:24:04', '', '2021-02-08 05:24:04', b'0'); -INSERT INTO `inf_job_log` VALUES (1842, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 20:33:02', '2021-02-18 20:33:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:24:06', '', '2021-02-08 05:24:06', b'0'); -INSERT INTO `inf_job_log` VALUES (1843, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 20:33:04', '2021-02-18 20:33:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:24:08', '', '2021-02-08 05:24:08', b'0'); -INSERT INTO `inf_job_log` VALUES (1844, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 20:33:06', '2021-02-18 20:33:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:24:10', '', '2021-02-08 05:24:10', b'0'); -INSERT INTO `inf_job_log` VALUES (1845, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 20:34:00', '2021-02-18 20:34:00', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:25:04', '', '2021-02-08 05:25:04', b'0'); -INSERT INTO `inf_job_log` VALUES (1846, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 20:34:02', '2021-02-18 20:34:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:25:06', '', '2021-02-08 05:25:06', b'0'); -INSERT INTO `inf_job_log` VALUES (1847, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 20:34:04', '2021-02-18 20:34:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:25:08', '', '2021-02-08 05:25:08', b'0'); -INSERT INTO `inf_job_log` VALUES (1848, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 20:34:06', '2021-02-18 20:34:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:25:10', '', '2021-02-08 05:25:10', b'0'); -INSERT INTO `inf_job_log` VALUES (1849, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 20:35:00', '2021-02-18 20:35:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:26:04', '', '2021-02-08 05:26:04', b'0'); -INSERT INTO `inf_job_log` VALUES (1850, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 20:35:02', '2021-02-18 20:35:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:26:06', '', '2021-02-08 05:26:06', b'0'); -INSERT INTO `inf_job_log` VALUES (1851, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 20:35:04', '2021-02-18 20:35:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:26:08', '', '2021-02-08 05:26:08', b'0'); -INSERT INTO `inf_job_log` VALUES (1852, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 20:35:06', '2021-02-18 20:35:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:26:10', '', '2021-02-08 05:26:10', b'0'); -INSERT INTO `inf_job_log` VALUES (1853, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 20:36:00', '2021-02-18 20:36:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:27:04', '', '2021-02-08 05:27:04', b'0'); -INSERT INTO `inf_job_log` VALUES (1854, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 20:36:02', '2021-02-18 20:36:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:27:06', '', '2021-02-08 05:27:06', b'0'); -INSERT INTO `inf_job_log` VALUES (1855, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 20:36:04', '2021-02-18 20:36:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:27:08', '', '2021-02-08 05:27:08', b'0'); -INSERT INTO `inf_job_log` VALUES (1856, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 20:36:06', '2021-02-18 20:36:06', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:27:10', '', '2021-02-08 05:27:10', b'0'); -INSERT INTO `inf_job_log` VALUES (1857, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 20:37:00', '2021-02-18 20:37:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:28:04', '', '2021-02-08 05:28:04', b'0'); -INSERT INTO `inf_job_log` VALUES (1858, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 20:37:02', '2021-02-18 20:37:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:28:06', '', '2021-02-08 05:28:06', b'0'); -INSERT INTO `inf_job_log` VALUES (1859, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 20:37:04', '2021-02-18 20:37:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:28:08', '', '2021-02-08 05:28:08', b'0'); -INSERT INTO `inf_job_log` VALUES (1860, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 20:37:06', '2021-02-18 20:37:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:28:10', '', '2021-02-08 05:28:10', b'0'); -INSERT INTO `inf_job_log` VALUES (1861, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 21:02:45', '2021-02-18 21:02:45', 7, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:29:04', '', '2021-02-08 05:29:04', b'0'); -INSERT INTO `inf_job_log` VALUES (1862, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 21:02:47', '2021-02-18 21:02:47', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:29:06', '', '2021-02-08 05:29:06', b'0'); -INSERT INTO `inf_job_log` VALUES (1863, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 21:02:49', '2021-02-18 21:02:49', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:29:08', '', '2021-02-08 05:29:08', b'0'); -INSERT INTO `inf_job_log` VALUES (1864, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 21:02:51', '2021-02-18 21:02:51', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:29:10', '', '2021-02-08 05:29:10', b'0'); -INSERT INTO `inf_job_log` VALUES (1865, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 21:02:57', '2021-02-18 21:02:57', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:29:16', '', '2021-02-08 05:29:16', b'0'); -INSERT INTO `inf_job_log` VALUES (1866, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 21:02:59', '2021-02-18 21:02:59', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:29:18', '', '2021-02-08 05:29:18', b'0'); -INSERT INTO `inf_job_log` VALUES (1867, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 21:03:01', '2021-02-18 21:03:01', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:29:20', '', '2021-02-08 05:29:20', b'0'); -INSERT INTO `inf_job_log` VALUES (1868, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 21:03:03', '2021-02-18 21:03:03', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:29:22', '', '2021-02-08 05:29:22', b'0'); -INSERT INTO `inf_job_log` VALUES (1869, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 21:03:03', '2021-02-18 21:03:03', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:29:22', '', '2021-02-08 05:29:22', b'0'); -INSERT INTO `inf_job_log` VALUES (1870, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 21:03:05', '2021-02-18 21:03:05', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:29:24', '', '2021-02-08 05:29:24', b'0'); -INSERT INTO `inf_job_log` VALUES (1871, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 21:03:07', '2021-02-18 21:03:07', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:29:26', '', '2021-02-08 05:29:26', b'0'); -INSERT INTO `inf_job_log` VALUES (1872, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 21:03:09', '2021-02-18 21:03:09', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:29:28', '', '2021-02-08 05:29:28', b'0'); -INSERT INTO `inf_job_log` VALUES (1873, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 21:04:00', '2021-02-18 21:04:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:30:19', '', '2021-02-08 05:30:19', b'0'); -INSERT INTO `inf_job_log` VALUES (1874, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 21:04:02', '2021-02-18 21:04:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:30:21', '', '2021-02-08 05:30:21', b'0'); -INSERT INTO `inf_job_log` VALUES (1875, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 21:04:04', '2021-02-18 21:04:04', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:30:23', '', '2021-02-08 05:30:23', b'0'); -INSERT INTO `inf_job_log` VALUES (1876, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 21:04:06', '2021-02-18 21:04:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:30:25', '', '2021-02-08 05:30:25', b'0'); -INSERT INTO `inf_job_log` VALUES (1877, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 21:05:00', '2021-02-18 21:05:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:31:19', '', '2021-02-08 05:31:19', b'0'); -INSERT INTO `inf_job_log` VALUES (1878, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 21:05:02', '2021-02-18 21:05:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:31:21', '', '2021-02-08 05:31:21', b'0'); -INSERT INTO `inf_job_log` VALUES (1879, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 21:05:04', '2021-02-18 21:05:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:31:23', '', '2021-02-08 05:31:23', b'0'); -INSERT INTO `inf_job_log` VALUES (1880, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 21:05:06', '2021-02-18 21:05:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:31:25', '', '2021-02-08 05:31:25', b'0'); -INSERT INTO `inf_job_log` VALUES (1881, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 21:06:00', '2021-02-18 21:06:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:32:19', '', '2021-02-08 05:32:19', b'0'); -INSERT INTO `inf_job_log` VALUES (1882, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 21:06:02', '2021-02-18 21:06:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:32:21', '', '2021-02-08 05:32:21', b'0'); -INSERT INTO `inf_job_log` VALUES (1883, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 21:06:04', '2021-02-18 21:06:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:32:23', '', '2021-02-08 05:32:23', b'0'); -INSERT INTO `inf_job_log` VALUES (1884, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 21:06:06', '2021-02-18 21:06:06', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:32:25', '', '2021-02-08 05:32:25', b'0'); -INSERT INTO `inf_job_log` VALUES (1885, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 21:07:00', '2021-02-18 21:07:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:33:19', '', '2021-02-08 05:33:19', b'0'); -INSERT INTO `inf_job_log` VALUES (1886, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 21:07:02', '2021-02-18 21:07:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:33:21', '', '2021-02-08 05:33:21', b'0'); -INSERT INTO `inf_job_log` VALUES (1887, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 21:07:04', '2021-02-18 21:07:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:33:23', '', '2021-02-08 05:33:23', b'0'); -INSERT INTO `inf_job_log` VALUES (1888, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 21:07:06', '2021-02-18 21:07:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:33:25', '', '2021-02-08 05:33:25', b'0'); -INSERT INTO `inf_job_log` VALUES (1889, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 21:08:00', '2021-02-18 21:08:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:34:19', '', '2021-02-08 05:34:19', b'0'); -INSERT INTO `inf_job_log` VALUES (1890, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 21:08:02', '2021-02-18 21:08:02', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:34:21', '', '2021-02-08 05:34:21', b'0'); -INSERT INTO `inf_job_log` VALUES (1891, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 21:08:04', '2021-02-18 21:08:04', 97, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:34:23', '', '2021-02-08 05:34:23', b'0'); -INSERT INTO `inf_job_log` VALUES (1892, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 21:08:06', '2021-02-18 21:08:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:34:25', '', '2021-02-08 05:34:25', b'0'); -INSERT INTO `inf_job_log` VALUES (1893, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 21:09:00', '2021-02-18 21:09:00', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:35:19', '', '2021-02-08 05:35:19', b'0'); -INSERT INTO `inf_job_log` VALUES (1894, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 21:09:02', '2021-02-18 21:09:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:35:21', '', '2021-02-08 05:35:21', b'0'); -INSERT INTO `inf_job_log` VALUES (1895, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 21:09:04', '2021-02-18 21:09:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:35:23', '', '2021-02-08 05:35:23', b'0'); -INSERT INTO `inf_job_log` VALUES (1896, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 21:09:06', '2021-02-18 21:09:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:35:25', '', '2021-02-08 05:35:25', b'0'); -INSERT INTO `inf_job_log` VALUES (1897, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 21:10:00', '2021-02-18 21:10:00', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:36:19', '', '2021-02-08 05:36:19', b'0'); -INSERT INTO `inf_job_log` VALUES (1898, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 21:10:02', '2021-02-18 21:10:02', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:36:21', '', '2021-02-08 05:36:21', b'0'); -INSERT INTO `inf_job_log` VALUES (1899, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 21:10:04', '2021-02-18 21:10:04', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:36:23', '', '2021-02-08 05:36:23', b'0'); -INSERT INTO `inf_job_log` VALUES (1900, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 21:10:06', '2021-02-18 21:10:06', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:36:25', '', '2021-02-08 05:36:25', b'0'); -INSERT INTO `inf_job_log` VALUES (1901, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 21:11:00', '2021-02-18 21:11:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:37:19', '', '2021-02-08 05:37:19', b'0'); -INSERT INTO `inf_job_log` VALUES (1902, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 21:11:02', '2021-02-18 21:11:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:37:21', '', '2021-02-08 05:37:21', b'0'); -INSERT INTO `inf_job_log` VALUES (1903, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 21:11:04', '2021-02-18 21:11:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:37:23', '', '2021-02-08 05:37:23', b'0'); -INSERT INTO `inf_job_log` VALUES (1904, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 21:11:06', '2021-02-18 21:11:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:37:25', '', '2021-02-08 05:37:25', b'0'); -INSERT INTO `inf_job_log` VALUES (1905, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 21:12:00', '2021-02-18 21:12:00', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:38:20', '', '2021-02-08 05:38:20', b'0'); -INSERT INTO `inf_job_log` VALUES (1906, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 21:12:02', '2021-02-18 21:12:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:38:22', '', '2021-02-08 05:38:22', b'0'); -INSERT INTO `inf_job_log` VALUES (1907, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 21:12:04', '2021-02-18 21:12:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:38:24', '', '2021-02-08 05:38:24', b'0'); -INSERT INTO `inf_job_log` VALUES (1908, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 21:12:06', '2021-02-18 21:12:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:38:26', '', '2021-02-08 05:38:26', b'0'); -INSERT INTO `inf_job_log` VALUES (1909, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 21:13:00', '2021-02-18 21:13:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:39:20', '', '2021-02-08 05:39:20', b'0'); -INSERT INTO `inf_job_log` VALUES (1910, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 21:13:02', '2021-02-18 21:13:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:39:22', '', '2021-02-08 05:39:22', b'0'); -INSERT INTO `inf_job_log` VALUES (1911, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 21:13:04', '2021-02-18 21:13:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:39:24', '', '2021-02-08 05:39:24', b'0'); -INSERT INTO `inf_job_log` VALUES (1912, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 21:13:06', '2021-02-18 21:13:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:39:26', '', '2021-02-08 05:39:26', b'0'); -INSERT INTO `inf_job_log` VALUES (1913, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 21:14:00', '2021-02-18 21:14:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:40:20', '', '2021-02-08 05:40:20', b'0'); -INSERT INTO `inf_job_log` VALUES (1914, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 21:14:02', '2021-02-18 21:14:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:40:22', '', '2021-02-08 05:40:22', b'0'); -INSERT INTO `inf_job_log` VALUES (1915, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 21:14:04', '2021-02-18 21:14:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:40:24', '', '2021-02-08 05:40:24', b'0'); -INSERT INTO `inf_job_log` VALUES (1916, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 21:14:06', '2021-02-18 21:14:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:40:26', '', '2021-02-08 05:40:26', b'0'); -INSERT INTO `inf_job_log` VALUES (1917, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 21:15:00', '2021-02-18 21:15:00', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:41:20', '', '2021-02-08 05:41:20', b'0'); -INSERT INTO `inf_job_log` VALUES (1918, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 21:15:02', '2021-02-18 21:15:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:41:22', '', '2021-02-08 05:41:22', b'0'); -INSERT INTO `inf_job_log` VALUES (1919, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 21:15:04', '2021-02-18 21:15:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:41:24', '', '2021-02-08 05:41:24', b'0'); -INSERT INTO `inf_job_log` VALUES (1920, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 21:15:06', '2021-02-18 21:15:06', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:41:26', '', '2021-02-08 05:41:26', b'0'); -INSERT INTO `inf_job_log` VALUES (1921, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 21:16:00', '2021-02-18 21:16:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:42:20', '', '2021-02-08 05:42:20', b'0'); -INSERT INTO `inf_job_log` VALUES (1922, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 21:16:02', '2021-02-18 21:16:02', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:42:22', '', '2021-02-08 05:42:22', b'0'); -INSERT INTO `inf_job_log` VALUES (1923, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 21:16:04', '2021-02-18 21:16:04', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:42:24', '', '2021-02-08 05:42:24', b'0'); -INSERT INTO `inf_job_log` VALUES (1924, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 21:16:06', '2021-02-18 21:16:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:42:26', '', '2021-02-08 05:42:26', b'0'); -INSERT INTO `inf_job_log` VALUES (1925, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 21:17:00', '2021-02-18 21:17:00', 6, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:43:20', '', '2021-02-08 05:43:20', b'0'); -INSERT INTO `inf_job_log` VALUES (1926, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 21:17:02', '2021-02-18 21:17:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:43:22', '', '2021-02-08 05:43:22', b'0'); -INSERT INTO `inf_job_log` VALUES (1927, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 21:17:04', '2021-02-18 21:17:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:43:24', '', '2021-02-08 05:43:24', b'0'); -INSERT INTO `inf_job_log` VALUES (1928, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 21:17:06', '2021-02-18 21:17:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:43:26', '', '2021-02-08 05:43:26', b'0'); -INSERT INTO `inf_job_log` VALUES (1929, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 21:18:00', '2021-02-18 21:18:00', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:44:20', '', '2021-02-08 05:44:20', b'0'); -INSERT INTO `inf_job_log` VALUES (1930, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 21:18:02', '2021-02-18 21:18:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:44:22', '', '2021-02-08 05:44:22', b'0'); -INSERT INTO `inf_job_log` VALUES (1931, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 21:18:04', '2021-02-18 21:18:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:44:24', '', '2021-02-08 05:44:24', b'0'); -INSERT INTO `inf_job_log` VALUES (1932, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 21:18:06', '2021-02-18 21:18:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:44:26', '', '2021-02-08 05:44:26', b'0'); -INSERT INTO `inf_job_log` VALUES (1933, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 21:19:00', '2021-02-18 21:19:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:45:20', '', '2021-02-08 05:45:20', b'0'); -INSERT INTO `inf_job_log` VALUES (1934, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 21:19:02', '2021-02-18 21:19:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:45:22', '', '2021-02-08 05:45:22', b'0'); -INSERT INTO `inf_job_log` VALUES (1935, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 21:19:04', '2021-02-18 21:19:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:45:24', '', '2021-02-08 05:45:24', b'0'); -INSERT INTO `inf_job_log` VALUES (1936, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 21:19:06', '2021-02-18 21:19:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:45:26', '', '2021-02-08 05:45:26', b'0'); -INSERT INTO `inf_job_log` VALUES (1937, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 21:20:00', '2021-02-18 21:20:00', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:46:20', '', '2021-02-08 05:46:20', b'0'); -INSERT INTO `inf_job_log` VALUES (1938, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 21:20:02', '2021-02-18 21:20:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:46:22', '', '2021-02-08 05:46:22', b'0'); -INSERT INTO `inf_job_log` VALUES (1939, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 21:20:04', '2021-02-18 21:20:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:46:24', '', '2021-02-08 05:46:24', b'0'); -INSERT INTO `inf_job_log` VALUES (1940, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 21:20:06', '2021-02-18 21:20:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:46:26', '', '2021-02-08 05:46:26', b'0'); -INSERT INTO `inf_job_log` VALUES (1941, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 21:21:00', '2021-02-18 21:21:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:47:20', '', '2021-02-08 05:47:20', b'0'); -INSERT INTO `inf_job_log` VALUES (1942, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 21:21:02', '2021-02-18 21:21:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:47:22', '', '2021-02-08 05:47:22', b'0'); -INSERT INTO `inf_job_log` VALUES (1943, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 21:21:04', '2021-02-18 21:21:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:47:24', '', '2021-02-08 05:47:24', b'0'); -INSERT INTO `inf_job_log` VALUES (1944, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 21:21:06', '2021-02-18 21:21:06', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:47:26', '', '2021-02-08 05:47:26', b'0'); -INSERT INTO `inf_job_log` VALUES (1945, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 21:22:00', '2021-02-18 21:22:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:48:20', '', '2021-02-08 05:48:20', b'0'); -INSERT INTO `inf_job_log` VALUES (1946, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 21:22:02', '2021-02-18 21:22:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:48:22', '', '2021-02-08 05:48:22', b'0'); -INSERT INTO `inf_job_log` VALUES (1947, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 21:22:04', '2021-02-18 21:22:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:48:24', '', '2021-02-08 05:48:24', b'0'); -INSERT INTO `inf_job_log` VALUES (1948, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 21:22:06', '2021-02-18 21:22:06', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:48:26', '', '2021-02-08 05:48:26', b'0'); -INSERT INTO `inf_job_log` VALUES (1949, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 21:23:00', '2021-02-18 21:23:00', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:49:20', '', '2021-02-08 05:49:20', b'0'); -INSERT INTO `inf_job_log` VALUES (1950, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 21:23:02', '2021-02-18 21:23:02', 6, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:49:22', '', '2021-02-08 05:49:22', b'0'); -INSERT INTO `inf_job_log` VALUES (1951, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 21:23:04', '2021-02-18 21:23:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:49:24', '', '2021-02-08 05:49:24', b'0'); -INSERT INTO `inf_job_log` VALUES (1952, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 21:23:06', '2021-02-18 21:23:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:49:26', '', '2021-02-08 05:49:26', b'0'); -INSERT INTO `inf_job_log` VALUES (1953, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 21:24:00', '2021-02-18 21:24:00', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:50:20', '', '2021-02-08 05:50:20', b'0'); -INSERT INTO `inf_job_log` VALUES (1954, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 21:24:02', '2021-02-18 21:24:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:50:22', '', '2021-02-08 05:50:22', b'0'); -INSERT INTO `inf_job_log` VALUES (1955, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 21:24:04', '2021-02-18 21:24:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:50:24', '', '2021-02-08 05:50:24', b'0'); -INSERT INTO `inf_job_log` VALUES (1956, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 21:24:06', '2021-02-18 21:24:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:50:26', '', '2021-02-08 05:50:26', b'0'); -INSERT INTO `inf_job_log` VALUES (1957, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 21:25:00', '2021-02-18 21:25:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:51:20', '', '2021-02-08 05:51:20', b'0'); -INSERT INTO `inf_job_log` VALUES (1958, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 21:25:02', '2021-02-18 21:25:02', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:51:22', '', '2021-02-08 05:51:22', b'0'); -INSERT INTO `inf_job_log` VALUES (1959, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 21:25:04', '2021-02-18 21:25:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:51:24', '', '2021-02-08 05:51:24', b'0'); -INSERT INTO `inf_job_log` VALUES (1960, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 21:25:06', '2021-02-18 21:25:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:51:26', '', '2021-02-08 05:51:26', b'0'); -INSERT INTO `inf_job_log` VALUES (1961, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 21:26:00', '2021-02-18 21:26:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:52:21', '', '2021-02-08 05:52:21', b'0'); -INSERT INTO `inf_job_log` VALUES (1962, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 21:26:02', '2021-02-18 21:26:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:52:23', '', '2021-02-08 05:52:23', b'0'); -INSERT INTO `inf_job_log` VALUES (1963, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 21:26:04', '2021-02-18 21:26:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:52:25', '', '2021-02-08 05:52:25', b'0'); -INSERT INTO `inf_job_log` VALUES (1964, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 21:26:06', '2021-02-18 21:26:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:52:27', '', '2021-02-08 05:52:27', b'0'); -INSERT INTO `inf_job_log` VALUES (1965, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 21:27:00', '2021-02-18 21:27:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:53:21', '', '2021-02-08 05:53:21', b'0'); -INSERT INTO `inf_job_log` VALUES (1966, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 21:27:02', '2021-02-18 21:27:02', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:53:23', '', '2021-02-08 05:53:23', b'0'); -INSERT INTO `inf_job_log` VALUES (1967, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 21:27:04', '2021-02-18 21:27:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:53:25', '', '2021-02-08 05:53:25', b'0'); -INSERT INTO `inf_job_log` VALUES (1968, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 21:27:06', '2021-02-18 21:27:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:53:27', '', '2021-02-08 05:53:27', b'0'); -INSERT INTO `inf_job_log` VALUES (1969, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 21:28:00', '2021-02-18 21:28:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:54:21', '', '2021-02-08 05:54:21', b'0'); -INSERT INTO `inf_job_log` VALUES (1970, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 21:28:02', '2021-02-18 21:28:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:54:23', '', '2021-02-08 05:54:23', b'0'); -INSERT INTO `inf_job_log` VALUES (1971, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 21:28:04', '2021-02-18 21:28:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:54:25', '', '2021-02-08 05:54:25', b'0'); -INSERT INTO `inf_job_log` VALUES (1972, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 21:28:06', '2021-02-18 21:28:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:54:27', '', '2021-02-08 05:54:27', b'0'); -INSERT INTO `inf_job_log` VALUES (1973, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 21:29:00', '2021-02-18 21:29:00', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:55:21', '', '2021-02-08 05:55:21', b'0'); -INSERT INTO `inf_job_log` VALUES (1974, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 21:29:02', '2021-02-18 21:29:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:55:23', '', '2021-02-08 05:55:23', b'0'); -INSERT INTO `inf_job_log` VALUES (1975, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 21:29:04', '2021-02-18 21:29:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:55:25', '', '2021-02-08 05:55:25', b'0'); -INSERT INTO `inf_job_log` VALUES (1976, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 21:29:06', '2021-02-18 21:29:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:55:27', '', '2021-02-08 05:55:27', b'0'); -INSERT INTO `inf_job_log` VALUES (1977, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 21:30:00', '2021-02-18 21:30:00', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:56:21', '', '2021-02-08 05:56:21', b'0'); -INSERT INTO `inf_job_log` VALUES (1978, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 21:30:02', '2021-02-18 21:30:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:56:23', '', '2021-02-08 05:56:23', b'0'); -INSERT INTO `inf_job_log` VALUES (1979, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 21:30:04', '2021-02-18 21:30:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:56:25', '', '2021-02-08 05:56:25', b'0'); -INSERT INTO `inf_job_log` VALUES (1980, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 21:30:06', '2021-02-18 21:30:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:56:27', '', '2021-02-08 05:56:27', b'0'); -INSERT INTO `inf_job_log` VALUES (1981, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 21:31:00', '2021-02-18 21:31:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:57:21', '', '2021-02-08 05:57:21', b'0'); -INSERT INTO `inf_job_log` VALUES (1982, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 21:31:02', '2021-02-18 21:31:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:57:23', '', '2021-02-08 05:57:23', b'0'); -INSERT INTO `inf_job_log` VALUES (1983, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 21:31:04', '2021-02-18 21:31:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:57:25', '', '2021-02-08 05:57:25', b'0'); -INSERT INTO `inf_job_log` VALUES (1984, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 21:31:06', '2021-02-18 21:31:06', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:57:27', '', '2021-02-08 05:57:27', b'0'); -INSERT INTO `inf_job_log` VALUES (1985, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 21:32:00', '2021-02-18 21:32:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:58:21', '', '2021-02-08 05:58:21', b'0'); -INSERT INTO `inf_job_log` VALUES (1986, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 21:32:02', '2021-02-18 21:32:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:58:23', '', '2021-02-08 05:58:23', b'0'); -INSERT INTO `inf_job_log` VALUES (1987, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 21:32:04', '2021-02-18 21:32:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:58:25', '', '2021-02-08 05:58:25', b'0'); -INSERT INTO `inf_job_log` VALUES (1988, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 21:32:06', '2021-02-18 21:32:06', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:58:27', '', '2021-02-08 05:58:27', b'0'); -INSERT INTO `inf_job_log` VALUES (1989, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 21:33:00', '2021-02-18 21:33:00', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:59:21', '', '2021-02-08 05:59:21', b'0'); -INSERT INTO `inf_job_log` VALUES (1990, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 21:33:02', '2021-02-18 21:33:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:59:23', '', '2021-02-08 05:59:23', b'0'); -INSERT INTO `inf_job_log` VALUES (1991, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 21:33:04', '2021-02-18 21:33:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:59:25', '', '2021-02-08 05:59:25', b'0'); -INSERT INTO `inf_job_log` VALUES (1992, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 21:33:06', '2021-02-18 21:33:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 05:59:27', '', '2021-02-08 05:59:27', b'0'); -INSERT INTO `inf_job_log` VALUES (1993, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 21:34:00', '2021-02-18 21:34:00', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:00:21', '', '2021-02-08 06:00:21', b'0'); -INSERT INTO `inf_job_log` VALUES (1994, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 21:34:02', '2021-02-18 21:34:02', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:00:23', '', '2021-02-08 06:00:23', b'0'); -INSERT INTO `inf_job_log` VALUES (1995, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 21:34:04', '2021-02-18 21:34:04', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:00:25', '', '2021-02-08 06:00:25', b'0'); -INSERT INTO `inf_job_log` VALUES (1996, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 21:34:06', '2021-02-18 21:34:06', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:00:27', '', '2021-02-08 06:00:27', b'0'); -INSERT INTO `inf_job_log` VALUES (1997, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 21:35:00', '2021-02-18 21:35:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:01:21', '', '2021-02-08 06:01:21', b'0'); -INSERT INTO `inf_job_log` VALUES (1998, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 21:35:02', '2021-02-18 21:35:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:01:23', '', '2021-02-08 06:01:23', b'0'); -INSERT INTO `inf_job_log` VALUES (1999, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 21:35:04', '2021-02-18 21:35:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:01:25', '', '2021-02-08 06:01:25', b'0'); -INSERT INTO `inf_job_log` VALUES (2000, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 21:35:06', '2021-02-18 21:35:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:01:27', '', '2021-02-08 06:01:27', b'0'); -INSERT INTO `inf_job_log` VALUES (2001, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 21:50:25', '2021-02-18 21:50:25', 6, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:02:21', '', '2021-02-08 06:02:21', b'0'); -INSERT INTO `inf_job_log` VALUES (2002, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 21:50:27', '2021-02-18 21:50:27', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:02:23', '', '2021-02-08 06:02:23', b'0'); -INSERT INTO `inf_job_log` VALUES (2003, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 21:50:29', '2021-02-18 21:50:29', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:02:25', '', '2021-02-08 06:02:25', b'0'); -INSERT INTO `inf_job_log` VALUES (2004, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 21:50:31', '2021-02-18 21:50:31', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:02:27', '', '2021-02-08 06:02:27', b'0'); -INSERT INTO `inf_job_log` VALUES (2005, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 21:51:22', '2021-02-18 21:51:22', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:03:18', '', '2021-02-08 06:03:18', b'0'); -INSERT INTO `inf_job_log` VALUES (2006, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 21:51:24', '2021-02-18 21:51:24', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:03:20', '', '2021-02-08 06:03:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2007, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 21:51:26', '2021-02-18 21:51:26', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:03:22', '', '2021-02-08 06:03:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2008, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 21:51:28', '2021-02-18 21:51:28', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:03:24', '', '2021-02-08 06:03:24', b'0'); -INSERT INTO `inf_job_log` VALUES (2009, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 21:52:00', '2021-02-18 21:52:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:03:56', '', '2021-02-08 06:03:56', b'0'); -INSERT INTO `inf_job_log` VALUES (2010, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 21:52:02', '2021-02-18 21:52:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:03:58', '', '2021-02-08 06:03:58', b'0'); -INSERT INTO `inf_job_log` VALUES (2011, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 21:52:04', '2021-02-18 21:52:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:04:00', '', '2021-02-08 06:04:00', b'0'); -INSERT INTO `inf_job_log` VALUES (2012, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 21:52:06', '2021-02-18 21:52:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:04:02', '', '2021-02-08 06:04:02', b'0'); -INSERT INTO `inf_job_log` VALUES (2013, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 21:53:00', '2021-02-18 21:53:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:04:57', '', '2021-02-08 06:04:57', b'0'); -INSERT INTO `inf_job_log` VALUES (2014, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 21:53:02', '2021-02-18 21:53:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:04:59', '', '2021-02-08 06:04:59', b'0'); -INSERT INTO `inf_job_log` VALUES (2015, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 21:53:04', '2021-02-18 21:53:04', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:05:01', '', '2021-02-08 06:05:01', b'0'); -INSERT INTO `inf_job_log` VALUES (2016, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 21:53:06', '2021-02-18 21:53:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:05:03', '', '2021-02-08 06:05:03', b'0'); -INSERT INTO `inf_job_log` VALUES (2017, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 21:54:00', '2021-02-18 21:54:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:05:57', '', '2021-02-08 06:05:57', b'0'); -INSERT INTO `inf_job_log` VALUES (2018, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 21:54:02', '2021-02-18 21:54:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:05:59', '', '2021-02-08 06:05:59', b'0'); -INSERT INTO `inf_job_log` VALUES (2019, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 21:54:04', '2021-02-18 21:54:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:06:01', '', '2021-02-08 06:06:01', b'0'); -INSERT INTO `inf_job_log` VALUES (2020, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 21:54:06', '2021-02-18 21:54:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:06:03', '', '2021-02-08 06:06:03', b'0'); -INSERT INTO `inf_job_log` VALUES (2021, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 21:55:00', '2021-02-18 21:55:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:06:57', '', '2021-02-08 06:06:57', b'0'); -INSERT INTO `inf_job_log` VALUES (2022, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 21:55:02', '2021-02-18 21:55:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:06:59', '', '2021-02-08 06:06:59', b'0'); -INSERT INTO `inf_job_log` VALUES (2023, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 21:55:04', '2021-02-18 21:55:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:07:01', '', '2021-02-08 06:07:01', b'0'); -INSERT INTO `inf_job_log` VALUES (2024, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 21:55:06', '2021-02-18 21:55:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:07:03', '', '2021-02-08 06:07:03', b'0'); -INSERT INTO `inf_job_log` VALUES (2025, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 21:56:00', '2021-02-18 21:56:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:07:57', '', '2021-02-08 06:07:57', b'0'); -INSERT INTO `inf_job_log` VALUES (2026, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 21:56:02', '2021-02-18 21:56:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:07:59', '', '2021-02-08 06:07:59', b'0'); -INSERT INTO `inf_job_log` VALUES (2027, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 21:56:04', '2021-02-18 21:56:04', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:08:01', '', '2021-02-08 06:08:01', b'0'); -INSERT INTO `inf_job_log` VALUES (2028, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 21:56:06', '2021-02-18 21:56:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:08:03', '', '2021-02-08 06:08:03', b'0'); -INSERT INTO `inf_job_log` VALUES (2029, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 21:57:00', '2021-02-18 21:57:00', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:08:57', '', '2021-02-08 06:08:57', b'0'); -INSERT INTO `inf_job_log` VALUES (2030, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 21:57:02', '2021-02-18 21:57:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:08:59', '', '2021-02-08 06:08:59', b'0'); -INSERT INTO `inf_job_log` VALUES (2031, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 21:57:04', '2021-02-18 21:57:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:09:01', '', '2021-02-08 06:09:01', b'0'); -INSERT INTO `inf_job_log` VALUES (2032, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 21:57:06', '2021-02-18 21:57:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:09:03', '', '2021-02-08 06:09:03', b'0'); -INSERT INTO `inf_job_log` VALUES (2033, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 21:58:00', '2021-02-18 21:58:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:09:57', '', '2021-02-08 06:09:57', b'0'); -INSERT INTO `inf_job_log` VALUES (2034, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 21:58:02', '2021-02-18 21:58:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:09:59', '', '2021-02-08 06:09:59', b'0'); -INSERT INTO `inf_job_log` VALUES (2035, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 21:58:04', '2021-02-18 21:58:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:10:01', '', '2021-02-08 06:10:01', b'0'); -INSERT INTO `inf_job_log` VALUES (2036, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 21:58:06', '2021-02-18 21:58:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:10:03', '', '2021-02-08 06:10:03', b'0'); -INSERT INTO `inf_job_log` VALUES (2037, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 21:59:00', '2021-02-18 21:59:00', 17, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:10:57', '', '2021-02-08 06:10:57', b'0'); -INSERT INTO `inf_job_log` VALUES (2038, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 21:59:02', '2021-02-18 21:59:02', 6, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:10:59', '', '2021-02-08 06:10:59', b'0'); -INSERT INTO `inf_job_log` VALUES (2039, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 21:59:04', '2021-02-18 21:59:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:11:01', '', '2021-02-08 06:11:01', b'0'); -INSERT INTO `inf_job_log` VALUES (2040, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 21:59:06', '2021-02-18 21:59:06', 30, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:11:03', '', '2021-02-08 06:11:03', b'0'); -INSERT INTO `inf_job_log` VALUES (2041, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 22:00:00', '2021-02-18 22:00:00', 7, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:11:57', '', '2021-02-08 06:11:57', b'0'); -INSERT INTO `inf_job_log` VALUES (2042, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 22:00:02', '2021-02-18 22:00:02', 10, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:11:59', '', '2021-02-08 06:11:59', b'0'); -INSERT INTO `inf_job_log` VALUES (2043, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 22:00:04', '2021-02-18 22:00:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:12:01', '', '2021-02-08 06:12:01', b'0'); -INSERT INTO `inf_job_log` VALUES (2044, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 22:00:06', '2021-02-18 22:00:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:12:03', '', '2021-02-08 06:12:03', b'0'); -INSERT INTO `inf_job_log` VALUES (2045, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 22:01:00', '2021-02-18 22:01:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:12:57', '', '2021-02-08 06:12:57', b'0'); -INSERT INTO `inf_job_log` VALUES (2046, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 22:01:02', '2021-02-18 22:01:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:12:59', '', '2021-02-08 06:12:59', b'0'); -INSERT INTO `inf_job_log` VALUES (2047, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 22:01:04', '2021-02-18 22:01:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:13:01', '', '2021-02-08 06:13:01', b'0'); -INSERT INTO `inf_job_log` VALUES (2048, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 22:01:06', '2021-02-18 22:01:06', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:13:03', '', '2021-02-08 06:13:03', b'0'); -INSERT INTO `inf_job_log` VALUES (2049, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 22:02:00', '2021-02-18 22:02:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:13:57', '', '2021-02-08 06:13:57', b'0'); -INSERT INTO `inf_job_log` VALUES (2050, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 22:02:02', '2021-02-18 22:02:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:13:59', '', '2021-02-08 06:13:59', b'0'); -INSERT INTO `inf_job_log` VALUES (2051, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 22:02:04', '2021-02-18 22:02:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:14:01', '', '2021-02-08 06:14:01', b'0'); -INSERT INTO `inf_job_log` VALUES (2052, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 22:02:06', '2021-02-18 22:02:06', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:14:03', '', '2021-02-08 06:14:03', b'0'); -INSERT INTO `inf_job_log` VALUES (2053, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 22:03:00', '2021-02-18 22:03:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:14:57', '', '2021-02-08 06:14:57', b'0'); -INSERT INTO `inf_job_log` VALUES (2054, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 22:03:02', '2021-02-18 22:03:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:14:59', '', '2021-02-08 06:14:59', b'0'); -INSERT INTO `inf_job_log` VALUES (2055, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 22:03:04', '2021-02-18 22:03:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:15:01', '', '2021-02-08 06:15:01', b'0'); -INSERT INTO `inf_job_log` VALUES (2056, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 22:03:06', '2021-02-18 22:03:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:15:03', '', '2021-02-08 06:15:03', b'0'); -INSERT INTO `inf_job_log` VALUES (2057, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 22:04:00', '2021-02-18 22:04:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:15:57', '', '2021-02-08 06:15:57', b'0'); -INSERT INTO `inf_job_log` VALUES (2058, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 22:04:02', '2021-02-18 22:04:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:15:59', '', '2021-02-08 06:15:59', b'0'); -INSERT INTO `inf_job_log` VALUES (2059, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 22:04:04', '2021-02-18 22:04:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:16:01', '', '2021-02-08 06:16:01', b'0'); -INSERT INTO `inf_job_log` VALUES (2060, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 22:04:06', '2021-02-18 22:04:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:16:03', '', '2021-02-08 06:16:03', b'0'); -INSERT INTO `inf_job_log` VALUES (2061, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 22:05:00', '2021-02-18 22:05:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:16:57', '', '2021-02-08 06:16:57', b'0'); -INSERT INTO `inf_job_log` VALUES (2062, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 22:05:02', '2021-02-18 22:05:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:16:59', '', '2021-02-08 06:16:59', b'0'); -INSERT INTO `inf_job_log` VALUES (2063, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 22:05:04', '2021-02-18 22:05:04', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:17:01', '', '2021-02-08 06:17:01', b'0'); -INSERT INTO `inf_job_log` VALUES (2064, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 22:05:06', '2021-02-18 22:05:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:17:03', '', '2021-02-08 06:17:03', b'0'); -INSERT INTO `inf_job_log` VALUES (2065, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 22:06:00', '2021-02-18 22:06:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:17:57', '', '2021-02-08 06:17:57', b'0'); -INSERT INTO `inf_job_log` VALUES (2066, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 22:06:02', '2021-02-18 22:06:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:17:59', '', '2021-02-08 06:17:59', b'0'); -INSERT INTO `inf_job_log` VALUES (2067, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 22:06:04', '2021-02-18 22:06:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:18:01', '', '2021-02-08 06:18:01', b'0'); -INSERT INTO `inf_job_log` VALUES (2068, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 22:06:06', '2021-02-18 22:06:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:18:03', '', '2021-02-08 06:18:03', b'0'); -INSERT INTO `inf_job_log` VALUES (2069, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 22:07:00', '2021-02-18 22:07:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:18:57', '', '2021-02-08 06:18:57', b'0'); -INSERT INTO `inf_job_log` VALUES (2070, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 22:07:02', '2021-02-18 22:07:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:18:59', '', '2021-02-08 06:18:59', b'0'); -INSERT INTO `inf_job_log` VALUES (2071, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 22:07:04', '2021-02-18 22:07:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:19:02', '', '2021-02-08 06:19:02', b'0'); -INSERT INTO `inf_job_log` VALUES (2072, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 22:07:06', '2021-02-18 22:07:06', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:19:04', '', '2021-02-08 06:19:04', b'0'); -INSERT INTO `inf_job_log` VALUES (2073, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 22:08:00', '2021-02-18 22:08:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:19:58', '', '2021-02-08 06:19:58', b'0'); -INSERT INTO `inf_job_log` VALUES (2074, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 22:08:02', '2021-02-18 22:08:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:20:00', '', '2021-02-08 06:20:00', b'0'); -INSERT INTO `inf_job_log` VALUES (2075, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 22:08:04', '2021-02-18 22:08:04', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:20:02', '', '2021-02-08 06:20:02', b'0'); -INSERT INTO `inf_job_log` VALUES (2076, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 22:08:06', '2021-02-18 22:08:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:20:04', '', '2021-02-08 06:20:04', b'0'); -INSERT INTO `inf_job_log` VALUES (2077, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 22:09:00', '2021-02-18 22:09:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:20:58', '', '2021-02-08 06:20:58', b'0'); -INSERT INTO `inf_job_log` VALUES (2078, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 22:09:02', '2021-02-18 22:09:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:21:00', '', '2021-02-08 06:21:00', b'0'); -INSERT INTO `inf_job_log` VALUES (2079, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 22:09:04', '2021-02-18 22:09:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:21:02', '', '2021-02-08 06:21:02', b'0'); -INSERT INTO `inf_job_log` VALUES (2080, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 22:09:06', '2021-02-18 22:09:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:21:04', '', '2021-02-08 06:21:04', b'0'); -INSERT INTO `inf_job_log` VALUES (2081, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 22:10:00', '2021-02-18 22:10:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:21:58', '', '2021-02-08 06:21:58', b'0'); -INSERT INTO `inf_job_log` VALUES (2082, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 22:10:02', '2021-02-18 22:10:02', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:22:00', '', '2021-02-08 06:22:00', b'0'); -INSERT INTO `inf_job_log` VALUES (2083, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 22:10:04', '2021-02-18 22:10:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:22:02', '', '2021-02-08 06:22:02', b'0'); -INSERT INTO `inf_job_log` VALUES (2084, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 22:10:06', '2021-02-18 22:10:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:22:04', '', '2021-02-08 06:22:04', b'0'); -INSERT INTO `inf_job_log` VALUES (2085, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 22:11:00', '2021-02-18 22:11:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:22:58', '', '2021-02-08 06:22:58', b'0'); -INSERT INTO `inf_job_log` VALUES (2086, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 22:11:02', '2021-02-18 22:11:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:23:00', '', '2021-02-08 06:23:00', b'0'); -INSERT INTO `inf_job_log` VALUES (2087, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 22:11:04', '2021-02-18 22:11:04', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:23:02', '', '2021-02-08 06:23:02', b'0'); -INSERT INTO `inf_job_log` VALUES (2088, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 22:11:06', '2021-02-18 22:11:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:23:04', '', '2021-02-08 06:23:04', b'0'); -INSERT INTO `inf_job_log` VALUES (2089, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 22:12:00', '2021-02-18 22:12:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:23:58', '', '2021-02-08 06:23:58', b'0'); -INSERT INTO `inf_job_log` VALUES (2090, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 22:12:02', '2021-02-18 22:12:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:24:00', '', '2021-02-08 06:24:00', b'0'); -INSERT INTO `inf_job_log` VALUES (2091, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 22:12:04', '2021-02-18 22:12:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:24:02', '', '2021-02-08 06:24:02', b'0'); -INSERT INTO `inf_job_log` VALUES (2092, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 22:12:06', '2021-02-18 22:12:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:24:04', '', '2021-02-08 06:24:04', b'0'); -INSERT INTO `inf_job_log` VALUES (2093, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 22:13:00', '2021-02-18 22:13:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:24:58', '', '2021-02-08 06:24:58', b'0'); -INSERT INTO `inf_job_log` VALUES (2094, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 22:13:02', '2021-02-18 22:13:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:25:00', '', '2021-02-08 06:25:00', b'0'); -INSERT INTO `inf_job_log` VALUES (2095, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 22:13:04', '2021-02-18 22:13:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:25:02', '', '2021-02-08 06:25:02', b'0'); -INSERT INTO `inf_job_log` VALUES (2096, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 22:13:06', '2021-02-18 22:13:06', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:25:04', '', '2021-02-08 06:25:04', b'0'); -INSERT INTO `inf_job_log` VALUES (2097, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 22:14:00', '2021-02-18 22:14:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:25:58', '', '2021-02-08 06:25:58', b'0'); -INSERT INTO `inf_job_log` VALUES (2098, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 22:14:02', '2021-02-18 22:14:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:26:00', '', '2021-02-08 06:26:00', b'0'); -INSERT INTO `inf_job_log` VALUES (2099, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 22:14:04', '2021-02-18 22:14:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:26:02', '', '2021-02-08 06:26:02', b'0'); -INSERT INTO `inf_job_log` VALUES (2100, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 22:14:06', '2021-02-18 22:14:06', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:26:04', '', '2021-02-08 06:26:04', b'0'); -INSERT INTO `inf_job_log` VALUES (2101, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 22:15:00', '2021-02-18 22:15:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:26:58', '', '2021-02-08 06:26:58', b'0'); -INSERT INTO `inf_job_log` VALUES (2102, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 22:15:02', '2021-02-18 22:15:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:27:00', '', '2021-02-08 06:27:00', b'0'); -INSERT INTO `inf_job_log` VALUES (2103, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 22:15:04', '2021-02-18 22:15:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:27:02', '', '2021-02-08 06:27:02', b'0'); -INSERT INTO `inf_job_log` VALUES (2104, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 22:15:06', '2021-02-18 22:15:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:27:04', '', '2021-02-08 06:27:04', b'0'); -INSERT INTO `inf_job_log` VALUES (2105, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 22:16:00', '2021-02-18 22:16:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:27:58', '', '2021-02-08 06:27:58', b'0'); -INSERT INTO `inf_job_log` VALUES (2106, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 22:16:02', '2021-02-18 22:16:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:28:00', '', '2021-02-08 06:28:00', b'0'); -INSERT INTO `inf_job_log` VALUES (2107, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 22:16:04', '2021-02-18 22:16:04', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:28:02', '', '2021-02-08 06:28:02', b'0'); -INSERT INTO `inf_job_log` VALUES (2108, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 22:16:06', '2021-02-18 22:16:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:28:04', '', '2021-02-08 06:28:04', b'0'); -INSERT INTO `inf_job_log` VALUES (2109, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 22:17:00', '2021-02-18 22:17:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:28:58', '', '2021-02-08 06:28:58', b'0'); -INSERT INTO `inf_job_log` VALUES (2110, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 22:17:02', '2021-02-18 22:17:02', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:29:00', '', '2021-02-08 06:29:00', b'0'); -INSERT INTO `inf_job_log` VALUES (2111, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 22:17:04', '2021-02-18 22:17:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:29:02', '', '2021-02-08 06:29:02', b'0'); -INSERT INTO `inf_job_log` VALUES (2112, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 22:17:06', '2021-02-18 22:17:06', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:29:04', '', '2021-02-08 06:29:04', b'0'); -INSERT INTO `inf_job_log` VALUES (2113, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 22:18:00', '2021-02-18 22:18:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:29:58', '', '2021-02-08 06:29:58', b'0'); -INSERT INTO `inf_job_log` VALUES (2114, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 22:18:02', '2021-02-18 22:18:02', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:30:00', '', '2021-02-08 06:30:00', b'0'); -INSERT INTO `inf_job_log` VALUES (2115, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 22:18:04', '2021-02-18 22:18:04', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:30:02', '', '2021-02-08 06:30:02', b'0'); -INSERT INTO `inf_job_log` VALUES (2116, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 22:18:06', '2021-02-18 22:18:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:30:04', '', '2021-02-08 06:30:04', b'0'); -INSERT INTO `inf_job_log` VALUES (2117, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 22:19:00', '2021-02-18 22:19:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:30:58', '', '2021-02-08 06:30:58', b'0'); -INSERT INTO `inf_job_log` VALUES (2118, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 22:19:02', '2021-02-18 22:19:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:31:00', '', '2021-02-08 06:31:00', b'0'); -INSERT INTO `inf_job_log` VALUES (2119, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 22:19:04', '2021-02-18 22:19:04', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:31:02', '', '2021-02-08 06:31:02', b'0'); -INSERT INTO `inf_job_log` VALUES (2120, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 22:19:06', '2021-02-18 22:19:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:31:04', '', '2021-02-08 06:31:04', b'0'); -INSERT INTO `inf_job_log` VALUES (2121, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 22:20:00', '2021-02-18 22:20:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:31:58', '', '2021-02-08 06:31:58', b'0'); -INSERT INTO `inf_job_log` VALUES (2122, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 22:20:02', '2021-02-18 22:20:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:32:00', '', '2021-02-08 06:32:00', b'0'); -INSERT INTO `inf_job_log` VALUES (2123, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 22:20:04', '2021-02-18 22:20:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:32:02', '', '2021-02-08 06:32:02', b'0'); -INSERT INTO `inf_job_log` VALUES (2124, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 22:20:06', '2021-02-18 22:20:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:32:04', '', '2021-02-08 06:32:04', b'0'); -INSERT INTO `inf_job_log` VALUES (2125, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 22:21:00', '2021-02-18 22:21:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:32:58', '', '2021-02-08 06:32:58', b'0'); -INSERT INTO `inf_job_log` VALUES (2126, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 22:21:02', '2021-02-18 22:21:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:33:00', '', '2021-02-08 06:33:00', b'0'); -INSERT INTO `inf_job_log` VALUES (2127, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 22:21:04', '2021-02-18 22:21:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:33:02', '', '2021-02-08 06:33:02', b'0'); -INSERT INTO `inf_job_log` VALUES (2128, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 22:21:06', '2021-02-18 22:21:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:33:04', '', '2021-02-08 06:33:04', b'0'); -INSERT INTO `inf_job_log` VALUES (2129, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 22:22:00', '2021-02-18 22:22:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:33:59', '', '2021-02-08 06:33:59', b'0'); -INSERT INTO `inf_job_log` VALUES (2130, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 22:22:02', '2021-02-18 22:22:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:34:01', '', '2021-02-08 06:34:01', b'0'); -INSERT INTO `inf_job_log` VALUES (2131, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 22:22:04', '2021-02-18 22:22:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:34:03', '', '2021-02-08 06:34:03', b'0'); -INSERT INTO `inf_job_log` VALUES (2132, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 22:22:06', '2021-02-18 22:22:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:34:05', '', '2021-02-08 06:34:05', b'0'); -INSERT INTO `inf_job_log` VALUES (2133, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 22:23:00', '2021-02-18 22:23:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:34:59', '', '2021-02-08 06:34:59', b'0'); -INSERT INTO `inf_job_log` VALUES (2134, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 22:23:02', '2021-02-18 22:23:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:35:01', '', '2021-02-08 06:35:01', b'0'); -INSERT INTO `inf_job_log` VALUES (2135, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 22:23:04', '2021-02-18 22:23:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:35:03', '', '2021-02-08 06:35:03', b'0'); -INSERT INTO `inf_job_log` VALUES (2136, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 22:23:06', '2021-02-18 22:23:06', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:35:05', '', '2021-02-08 06:35:05', b'0'); -INSERT INTO `inf_job_log` VALUES (2137, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 22:24:00', '2021-02-18 22:24:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:35:59', '', '2021-02-08 06:35:59', b'0'); -INSERT INTO `inf_job_log` VALUES (2138, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 22:24:02', '2021-02-18 22:24:02', 37, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:36:01', '', '2021-02-08 06:36:01', b'0'); -INSERT INTO `inf_job_log` VALUES (2139, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 22:36:52', '2021-02-18 22:36:52', 17, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:36:06', '', '2021-02-08 06:36:06', b'0'); -INSERT INTO `inf_job_log` VALUES (2140, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 22:36:54', '2021-02-18 22:36:54', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:36:08', '', '2021-02-08 06:36:08', b'0'); -INSERT INTO `inf_job_log` VALUES (2141, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 22:37:06', '2021-02-18 22:37:06', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:36:21', '', '2021-02-08 06:36:21', b'0'); -INSERT INTO `inf_job_log` VALUES (2142, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 22:37:08', '2021-02-18 22:37:08', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:36:23', '', '2021-02-08 06:36:23', b'0'); -INSERT INTO `inf_job_log` VALUES (2143, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 22:37:10', '2021-02-18 22:37:10', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:36:25', '', '2021-02-08 06:36:25', b'0'); -INSERT INTO `inf_job_log` VALUES (2144, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 22:37:12', '2021-02-18 22:37:12', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:36:27', '', '2021-02-08 06:36:27', b'0'); -INSERT INTO `inf_job_log` VALUES (2145, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 22:38:00', '2021-02-18 22:38:00', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:37:15', '', '2021-02-08 06:37:15', b'0'); -INSERT INTO `inf_job_log` VALUES (2146, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 22:38:02', '2021-02-18 22:38:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:37:17', '', '2021-02-08 06:37:17', b'0'); -INSERT INTO `inf_job_log` VALUES (2147, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 22:38:04', '2021-02-18 22:38:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:37:19', '', '2021-02-08 06:37:19', b'0'); -INSERT INTO `inf_job_log` VALUES (2148, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 22:38:06', '2021-02-18 22:38:06', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:37:21', '', '2021-02-08 06:37:21', b'0'); -INSERT INTO `inf_job_log` VALUES (2149, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 22:39:00', '2021-02-18 22:39:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:38:15', '', '2021-02-08 06:38:15', b'0'); -INSERT INTO `inf_job_log` VALUES (2150, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 22:39:02', '2021-02-18 22:39:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:38:17', '', '2021-02-08 06:38:17', b'0'); -INSERT INTO `inf_job_log` VALUES (2151, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 22:39:04', '2021-02-18 22:39:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:38:19', '', '2021-02-08 06:38:19', b'0'); -INSERT INTO `inf_job_log` VALUES (2152, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 22:39:06', '2021-02-18 22:39:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:38:21', '', '2021-02-08 06:38:21', b'0'); -INSERT INTO `inf_job_log` VALUES (2153, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 22:40:00', '2021-02-18 22:40:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:39:15', '', '2021-02-08 06:39:15', b'0'); -INSERT INTO `inf_job_log` VALUES (2154, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 22:40:02', '2021-02-18 22:40:02', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:39:17', '', '2021-02-08 06:39:17', b'0'); -INSERT INTO `inf_job_log` VALUES (2155, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 22:40:04', '2021-02-18 22:40:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:39:19', '', '2021-02-08 06:39:19', b'0'); -INSERT INTO `inf_job_log` VALUES (2156, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 22:40:06', '2021-02-18 22:40:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:39:21', '', '2021-02-08 06:39:21', b'0'); -INSERT INTO `inf_job_log` VALUES (2157, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 22:41:00', '2021-02-18 22:41:00', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:40:15', '', '2021-02-08 06:40:15', b'0'); -INSERT INTO `inf_job_log` VALUES (2158, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 22:41:02', '2021-02-18 22:41:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:40:17', '', '2021-02-08 06:40:17', b'0'); -INSERT INTO `inf_job_log` VALUES (2159, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 22:41:04', '2021-02-18 22:41:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:40:19', '', '2021-02-08 06:40:19', b'0'); -INSERT INTO `inf_job_log` VALUES (2160, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 22:41:06', '2021-02-18 22:41:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:40:21', '', '2021-02-08 06:40:21', b'0'); -INSERT INTO `inf_job_log` VALUES (2161, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 22:42:00', '2021-02-18 22:42:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:41:15', '', '2021-02-08 06:41:15', b'0'); -INSERT INTO `inf_job_log` VALUES (2162, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 22:42:02', '2021-02-18 22:42:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:41:17', '', '2021-02-08 06:41:17', b'0'); -INSERT INTO `inf_job_log` VALUES (2163, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 22:42:04', '2021-02-18 22:42:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:41:19', '', '2021-02-08 06:41:19', b'0'); -INSERT INTO `inf_job_log` VALUES (2164, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 22:42:06', '2021-02-18 22:42:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:41:21', '', '2021-02-08 06:41:21', b'0'); -INSERT INTO `inf_job_log` VALUES (2165, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 22:43:00', '2021-02-18 22:43:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:42:15', '', '2021-02-08 06:42:15', b'0'); -INSERT INTO `inf_job_log` VALUES (2166, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 22:43:02', '2021-02-18 22:43:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:42:17', '', '2021-02-08 06:42:17', b'0'); -INSERT INTO `inf_job_log` VALUES (2167, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 22:43:04', '2021-02-18 22:43:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:42:19', '', '2021-02-08 06:42:19', b'0'); -INSERT INTO `inf_job_log` VALUES (2168, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 22:43:06', '2021-02-18 22:43:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:42:21', '', '2021-02-08 06:42:21', b'0'); -INSERT INTO `inf_job_log` VALUES (2169, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 22:44:00', '2021-02-18 22:44:00', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:43:15', '', '2021-02-08 06:43:15', b'0'); -INSERT INTO `inf_job_log` VALUES (2170, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 22:44:02', '2021-02-18 22:44:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:43:17', '', '2021-02-08 06:43:17', b'0'); -INSERT INTO `inf_job_log` VALUES (2171, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 22:44:04', '2021-02-18 22:44:04', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:43:19', '', '2021-02-08 06:43:19', b'0'); -INSERT INTO `inf_job_log` VALUES (2172, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 22:44:06', '2021-02-18 22:44:06', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:43:21', '', '2021-02-08 06:43:21', b'0'); -INSERT INTO `inf_job_log` VALUES (2173, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 22:45:00', '2021-02-18 22:45:00', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:44:15', '', '2021-02-08 06:44:15', b'0'); -INSERT INTO `inf_job_log` VALUES (2174, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 22:45:02', '2021-02-18 22:45:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:44:17', '', '2021-02-08 06:44:17', b'0'); -INSERT INTO `inf_job_log` VALUES (2175, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 22:45:04', '2021-02-18 22:45:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:44:19', '', '2021-02-08 06:44:19', b'0'); -INSERT INTO `inf_job_log` VALUES (2176, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 22:45:06', '2021-02-18 22:45:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:44:21', '', '2021-02-08 06:44:21', b'0'); -INSERT INTO `inf_job_log` VALUES (2177, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 22:46:00', '2021-02-18 22:46:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:45:15', '', '2021-02-08 06:45:15', b'0'); -INSERT INTO `inf_job_log` VALUES (2178, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 22:46:02', '2021-02-18 22:46:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:45:17', '', '2021-02-08 06:45:17', b'0'); -INSERT INTO `inf_job_log` VALUES (2179, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 22:46:04', '2021-02-18 22:46:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:45:19', '', '2021-02-08 06:45:19', b'0'); -INSERT INTO `inf_job_log` VALUES (2180, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 22:46:06', '2021-02-18 22:46:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:45:21', '', '2021-02-08 06:45:21', b'0'); -INSERT INTO `inf_job_log` VALUES (2181, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 22:47:00', '2021-02-18 22:47:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:46:15', '', '2021-02-08 06:46:15', b'0'); -INSERT INTO `inf_job_log` VALUES (2182, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 22:47:02', '2021-02-18 22:47:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:46:17', '', '2021-02-08 06:46:17', b'0'); -INSERT INTO `inf_job_log` VALUES (2183, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 22:47:04', '2021-02-18 22:47:04', 6, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:46:19', '', '2021-02-08 06:46:19', b'0'); -INSERT INTO `inf_job_log` VALUES (2184, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 22:47:06', '2021-02-18 22:47:06', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:46:21', '', '2021-02-08 06:46:21', b'0'); -INSERT INTO `inf_job_log` VALUES (2185, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 22:48:00', '2021-02-18 22:48:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:47:15', '', '2021-02-08 06:47:15', b'0'); -INSERT INTO `inf_job_log` VALUES (2186, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 22:48:02', '2021-02-18 22:48:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:47:17', '', '2021-02-08 06:47:17', b'0'); -INSERT INTO `inf_job_log` VALUES (2187, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 22:48:04', '2021-02-18 22:48:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:47:19', '', '2021-02-08 06:47:19', b'0'); -INSERT INTO `inf_job_log` VALUES (2188, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 22:48:06', '2021-02-18 22:48:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:47:21', '', '2021-02-08 06:47:21', b'0'); -INSERT INTO `inf_job_log` VALUES (2189, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 22:49:00', '2021-02-18 22:49:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:48:16', '', '2021-02-08 06:48:16', b'0'); -INSERT INTO `inf_job_log` VALUES (2190, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 22:49:02', '2021-02-18 22:49:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:48:18', '', '2021-02-08 06:48:18', b'0'); -INSERT INTO `inf_job_log` VALUES (2191, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 22:49:04', '2021-02-18 22:49:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:48:20', '', '2021-02-08 06:48:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2192, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 22:49:06', '2021-02-18 22:49:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:48:22', '', '2021-02-08 06:48:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2193, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 22:50:00', '2021-02-18 22:50:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:49:16', '', '2021-02-08 06:49:16', b'0'); -INSERT INTO `inf_job_log` VALUES (2194, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 22:50:02', '2021-02-18 22:50:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:49:18', '', '2021-02-08 06:49:18', b'0'); -INSERT INTO `inf_job_log` VALUES (2195, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 22:50:04', '2021-02-18 22:50:04', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:49:20', '', '2021-02-08 06:49:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2196, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 22:50:06', '2021-02-18 22:50:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:49:22', '', '2021-02-08 06:49:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2197, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 22:51:00', '2021-02-18 22:51:00', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:50:16', '', '2021-02-08 06:50:16', b'0'); -INSERT INTO `inf_job_log` VALUES (2198, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 22:51:02', '2021-02-18 22:51:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:50:18', '', '2021-02-08 06:50:18', b'0'); -INSERT INTO `inf_job_log` VALUES (2199, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 22:51:04', '2021-02-18 22:51:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:50:20', '', '2021-02-08 06:50:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2200, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 22:51:06', '2021-02-18 22:51:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:50:22', '', '2021-02-08 06:50:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2201, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 22:52:00', '2021-02-18 22:52:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:51:16', '', '2021-02-08 06:51:16', b'0'); -INSERT INTO `inf_job_log` VALUES (2202, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 22:52:02', '2021-02-18 22:52:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:51:18', '', '2021-02-08 06:51:18', b'0'); -INSERT INTO `inf_job_log` VALUES (2203, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 22:52:04', '2021-02-18 22:52:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:51:20', '', '2021-02-08 06:51:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2204, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 22:52:06', '2021-02-18 22:52:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:51:22', '', '2021-02-08 06:51:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2205, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 22:53:00', '2021-02-18 22:53:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:52:16', '', '2021-02-08 06:52:16', b'0'); -INSERT INTO `inf_job_log` VALUES (2206, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 22:53:02', '2021-02-18 22:53:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:52:18', '', '2021-02-08 06:52:18', b'0'); -INSERT INTO `inf_job_log` VALUES (2207, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 22:53:04', '2021-02-18 22:53:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:52:20', '', '2021-02-08 06:52:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2208, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 22:53:06', '2021-02-18 22:53:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:52:22', '', '2021-02-08 06:52:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2209, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 22:54:00', '2021-02-18 22:54:00', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:53:16', '', '2021-02-08 06:53:16', b'0'); -INSERT INTO `inf_job_log` VALUES (2210, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 22:54:02', '2021-02-18 22:54:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:53:18', '', '2021-02-08 06:53:18', b'0'); -INSERT INTO `inf_job_log` VALUES (2211, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 22:54:04', '2021-02-18 22:54:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:53:20', '', '2021-02-08 06:53:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2212, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 22:54:06', '2021-02-18 22:54:06', 34, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:53:22', '', '2021-02-08 06:53:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2213, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 22:55:00', '2021-02-18 22:55:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:54:16', '', '2021-02-08 06:54:16', b'0'); -INSERT INTO `inf_job_log` VALUES (2214, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 22:55:02', '2021-02-18 22:55:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:54:18', '', '2021-02-08 06:54:18', b'0'); -INSERT INTO `inf_job_log` VALUES (2215, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 22:55:04', '2021-02-18 22:55:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:54:20', '', '2021-02-08 06:54:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2216, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 22:55:06', '2021-02-18 22:55:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:54:22', '', '2021-02-08 06:54:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2217, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 22:56:00', '2021-02-18 22:56:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:55:16', '', '2021-02-08 06:55:16', b'0'); -INSERT INTO `inf_job_log` VALUES (2218, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 22:56:02', '2021-02-18 22:56:02', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:55:18', '', '2021-02-08 06:55:18', b'0'); -INSERT INTO `inf_job_log` VALUES (2219, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 22:56:04', '2021-02-18 22:56:04', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:55:20', '', '2021-02-08 06:55:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2220, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 22:56:06', '2021-02-18 22:56:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:55:22', '', '2021-02-08 06:55:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2221, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 22:57:00', '2021-02-18 22:57:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:56:16', '', '2021-02-08 06:56:16', b'0'); -INSERT INTO `inf_job_log` VALUES (2222, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 22:57:02', '2021-02-18 22:57:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:56:18', '', '2021-02-08 06:56:18', b'0'); -INSERT INTO `inf_job_log` VALUES (2223, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 22:57:04', '2021-02-18 22:57:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:56:20', '', '2021-02-08 06:56:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2224, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 22:57:06', '2021-02-18 22:57:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:56:22', '', '2021-02-08 06:56:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2225, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 22:58:00', '2021-02-18 22:58:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:57:16', '', '2021-02-08 06:57:16', b'0'); -INSERT INTO `inf_job_log` VALUES (2226, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 22:58:02', '2021-02-18 22:58:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:57:18', '', '2021-02-08 06:57:18', b'0'); -INSERT INTO `inf_job_log` VALUES (2227, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 22:58:04', '2021-02-18 22:58:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:57:20', '', '2021-02-08 06:57:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2228, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 22:58:06', '2021-02-18 22:58:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:57:22', '', '2021-02-08 06:57:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2229, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 22:59:00', '2021-02-18 22:59:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:58:16', '', '2021-02-08 06:58:16', b'0'); -INSERT INTO `inf_job_log` VALUES (2230, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 22:59:02', '2021-02-18 22:59:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:58:18', '', '2021-02-08 06:58:18', b'0'); -INSERT INTO `inf_job_log` VALUES (2231, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 22:59:04', '2021-02-18 22:59:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:58:20', '', '2021-02-08 06:58:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2232, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 22:59:06', '2021-02-18 22:59:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:58:22', '', '2021-02-08 06:58:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2233, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:00:00', '2021-02-18 23:00:00', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:59:16', '', '2021-02-08 06:59:16', b'0'); -INSERT INTO `inf_job_log` VALUES (2234, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:00:02', '2021-02-18 23:00:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:59:18', '', '2021-02-08 06:59:18', b'0'); -INSERT INTO `inf_job_log` VALUES (2235, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:00:04', '2021-02-18 23:00:04', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:59:20', '', '2021-02-08 06:59:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2236, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:00:06', '2021-02-18 23:00:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 06:59:22', '', '2021-02-08 06:59:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2237, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:01:00', '2021-02-18 23:01:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:00:16', '', '2021-02-08 07:00:16', b'0'); -INSERT INTO `inf_job_log` VALUES (2238, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:01:02', '2021-02-18 23:01:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:00:18', '', '2021-02-08 07:00:18', b'0'); -INSERT INTO `inf_job_log` VALUES (2239, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:01:04', '2021-02-18 23:01:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:00:20', '', '2021-02-08 07:00:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2240, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:01:06', '2021-02-18 23:01:06', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:00:22', '', '2021-02-08 07:00:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2241, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:02:00', '2021-02-18 23:02:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:01:16', '', '2021-02-08 07:01:16', b'0'); -INSERT INTO `inf_job_log` VALUES (2242, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:02:02', '2021-02-18 23:02:02', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:01:18', '', '2021-02-08 07:01:18', b'0'); -INSERT INTO `inf_job_log` VALUES (2243, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:02:04', '2021-02-18 23:02:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:01:20', '', '2021-02-08 07:01:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2244, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:02:06', '2021-02-18 23:02:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:01:22', '', '2021-02-08 07:01:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2245, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:03:00', '2021-02-18 23:03:00', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:02:16', '', '2021-02-08 07:02:16', b'0'); -INSERT INTO `inf_job_log` VALUES (2246, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:03:02', '2021-02-18 23:03:02', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:02:19', '', '2021-02-08 07:02:19', b'0'); -INSERT INTO `inf_job_log` VALUES (2247, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:03:04', '2021-02-18 23:03:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:02:21', '', '2021-02-08 07:02:21', b'0'); -INSERT INTO `inf_job_log` VALUES (2248, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:03:06', '2021-02-18 23:03:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:02:23', '', '2021-02-08 07:02:23', b'0'); -INSERT INTO `inf_job_log` VALUES (2249, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:04:00', '2021-02-18 23:04:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:03:17', '', '2021-02-08 07:03:17', b'0'); -INSERT INTO `inf_job_log` VALUES (2250, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:04:02', '2021-02-18 23:04:02', 10, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:03:19', '', '2021-02-08 07:03:19', b'0'); -INSERT INTO `inf_job_log` VALUES (2251, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:04:04', '2021-02-18 23:04:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:03:21', '', '2021-02-08 07:03:21', b'0'); -INSERT INTO `inf_job_log` VALUES (2252, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:04:06', '2021-02-18 23:04:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:03:23', '', '2021-02-08 07:03:23', b'0'); -INSERT INTO `inf_job_log` VALUES (2253, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:05:00', '2021-02-18 23:05:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:04:17', '', '2021-02-08 07:04:17', b'0'); -INSERT INTO `inf_job_log` VALUES (2254, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:05:02', '2021-02-18 23:05:02', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:04:19', '', '2021-02-08 07:04:19', b'0'); -INSERT INTO `inf_job_log` VALUES (2255, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:05:04', '2021-02-18 23:05:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:04:21', '', '2021-02-08 07:04:21', b'0'); -INSERT INTO `inf_job_log` VALUES (2256, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:05:06', '2021-02-18 23:05:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:04:23', '', '2021-02-08 07:04:23', b'0'); -INSERT INTO `inf_job_log` VALUES (2257, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:06:00', '2021-02-18 23:06:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:05:17', '', '2021-02-08 07:05:17', b'0'); -INSERT INTO `inf_job_log` VALUES (2258, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:06:02', '2021-02-18 23:06:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:05:19', '', '2021-02-08 07:05:19', b'0'); -INSERT INTO `inf_job_log` VALUES (2259, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:06:04', '2021-02-18 23:06:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:05:21', '', '2021-02-08 07:05:21', b'0'); -INSERT INTO `inf_job_log` VALUES (2260, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:06:06', '2021-02-18 23:06:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:05:23', '', '2021-02-08 07:05:23', b'0'); -INSERT INTO `inf_job_log` VALUES (2261, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:07:00', '2021-02-18 23:07:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:06:17', '', '2021-02-08 07:06:17', b'0'); -INSERT INTO `inf_job_log` VALUES (2262, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:07:02', '2021-02-18 23:07:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:06:19', '', '2021-02-08 07:06:19', b'0'); -INSERT INTO `inf_job_log` VALUES (2263, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:07:04', '2021-02-18 23:07:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:06:21', '', '2021-02-08 07:06:21', b'0'); -INSERT INTO `inf_job_log` VALUES (2264, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:07:06', '2021-02-18 23:07:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:06:23', '', '2021-02-08 07:06:23', b'0'); -INSERT INTO `inf_job_log` VALUES (2265, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:08:00', '2021-02-18 23:08:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:07:17', '', '2021-02-08 07:07:17', b'0'); -INSERT INTO `inf_job_log` VALUES (2266, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:08:02', '2021-02-18 23:08:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:07:19', '', '2021-02-08 07:07:19', b'0'); -INSERT INTO `inf_job_log` VALUES (2267, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:08:04', '2021-02-18 23:08:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:07:21', '', '2021-02-08 07:07:21', b'0'); -INSERT INTO `inf_job_log` VALUES (2268, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:08:06', '2021-02-18 23:08:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:07:23', '', '2021-02-08 07:07:23', b'0'); -INSERT INTO `inf_job_log` VALUES (2269, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:09:00', '2021-02-18 23:09:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:08:17', '', '2021-02-08 07:08:17', b'0'); -INSERT INTO `inf_job_log` VALUES (2270, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:09:02', '2021-02-18 23:09:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:08:19', '', '2021-02-08 07:08:19', b'0'); -INSERT INTO `inf_job_log` VALUES (2271, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:09:04', '2021-02-18 23:09:04', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:08:21', '', '2021-02-08 07:08:21', b'0'); -INSERT INTO `inf_job_log` VALUES (2272, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:09:06', '2021-02-18 23:09:06', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:08:23', '', '2021-02-08 07:08:23', b'0'); -INSERT INTO `inf_job_log` VALUES (2273, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:10:00', '2021-02-18 23:10:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:09:17', '', '2021-02-08 07:09:17', b'0'); -INSERT INTO `inf_job_log` VALUES (2274, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:10:02', '2021-02-18 23:10:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:09:19', '', '2021-02-08 07:09:19', b'0'); -INSERT INTO `inf_job_log` VALUES (2275, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:10:04', '2021-02-18 23:10:04', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:09:21', '', '2021-02-08 07:09:21', b'0'); -INSERT INTO `inf_job_log` VALUES (2276, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:10:06', '2021-02-18 23:10:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:09:23', '', '2021-02-08 07:09:23', b'0'); -INSERT INTO `inf_job_log` VALUES (2277, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:11:00', '2021-02-18 23:11:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:10:17', '', '2021-02-08 07:10:17', b'0'); -INSERT INTO `inf_job_log` VALUES (2278, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:11:02', '2021-02-18 23:11:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:10:19', '', '2021-02-08 07:10:19', b'0'); -INSERT INTO `inf_job_log` VALUES (2279, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:11:04', '2021-02-18 23:11:04', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:10:21', '', '2021-02-08 07:10:21', b'0'); -INSERT INTO `inf_job_log` VALUES (2280, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:11:06', '2021-02-18 23:11:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:10:23', '', '2021-02-08 07:10:23', b'0'); -INSERT INTO `inf_job_log` VALUES (2281, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:12:00', '2021-02-18 23:12:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:11:17', '', '2021-02-08 07:11:17', b'0'); -INSERT INTO `inf_job_log` VALUES (2282, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:12:02', '2021-02-18 23:12:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:11:19', '', '2021-02-08 07:11:19', b'0'); -INSERT INTO `inf_job_log` VALUES (2283, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:12:04', '2021-02-18 23:12:04', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:11:21', '', '2021-02-08 07:11:21', b'0'); -INSERT INTO `inf_job_log` VALUES (2284, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:12:06', '2021-02-18 23:12:06', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:11:23', '', '2021-02-08 07:11:23', b'0'); -INSERT INTO `inf_job_log` VALUES (2285, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:13:00', '2021-02-18 23:13:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:12:17', '', '2021-02-08 07:12:17', b'0'); -INSERT INTO `inf_job_log` VALUES (2286, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:13:02', '2021-02-18 23:13:02', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:12:19', '', '2021-02-08 07:12:19', b'0'); -INSERT INTO `inf_job_log` VALUES (2287, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:13:04', '2021-02-18 23:13:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:12:21', '', '2021-02-08 07:12:21', b'0'); -INSERT INTO `inf_job_log` VALUES (2288, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:13:06', '2021-02-18 23:13:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:12:23', '', '2021-02-08 07:12:23', b'0'); -INSERT INTO `inf_job_log` VALUES (2289, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:14:00', '2021-02-18 23:14:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:13:17', '', '2021-02-08 07:13:17', b'0'); -INSERT INTO `inf_job_log` VALUES (2290, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:14:02', '2021-02-18 23:14:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:13:19', '', '2021-02-08 07:13:19', b'0'); -INSERT INTO `inf_job_log` VALUES (2291, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:14:04', '2021-02-18 23:14:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:13:21', '', '2021-02-08 07:13:21', b'0'); -INSERT INTO `inf_job_log` VALUES (2292, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:14:06', '2021-02-18 23:14:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:13:23', '', '2021-02-08 07:13:23', b'0'); -INSERT INTO `inf_job_log` VALUES (2293, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:15:00', '2021-02-18 23:15:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:14:17', '', '2021-02-08 07:14:17', b'0'); -INSERT INTO `inf_job_log` VALUES (2294, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:15:02', '2021-02-18 23:15:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:14:19', '', '2021-02-08 07:14:19', b'0'); -INSERT INTO `inf_job_log` VALUES (2295, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:15:04', '2021-02-18 23:15:04', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:14:21', '', '2021-02-08 07:14:21', b'0'); -INSERT INTO `inf_job_log` VALUES (2296, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:15:06', '2021-02-18 23:15:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:14:23', '', '2021-02-08 07:14:23', b'0'); -INSERT INTO `inf_job_log` VALUES (2297, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:16:00', '2021-02-18 23:16:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:15:17', '', '2021-02-08 07:15:17', b'0'); -INSERT INTO `inf_job_log` VALUES (2298, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:16:02', '2021-02-18 23:16:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:15:19', '', '2021-02-08 07:15:19', b'0'); -INSERT INTO `inf_job_log` VALUES (2299, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:16:04', '2021-02-18 23:16:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:15:21', '', '2021-02-08 07:15:21', b'0'); -INSERT INTO `inf_job_log` VALUES (2300, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:16:06', '2021-02-18 23:16:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:15:23', '', '2021-02-08 07:15:23', b'0'); -INSERT INTO `inf_job_log` VALUES (2301, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:17:00', '2021-02-18 23:17:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:16:17', '', '2021-02-08 07:16:17', b'0'); -INSERT INTO `inf_job_log` VALUES (2302, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:17:02', '2021-02-18 23:17:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:16:19', '', '2021-02-08 07:16:19', b'0'); -INSERT INTO `inf_job_log` VALUES (2303, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:17:04', '2021-02-18 23:17:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:16:21', '', '2021-02-08 07:16:21', b'0'); -INSERT INTO `inf_job_log` VALUES (2304, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:17:06', '2021-02-18 23:17:06', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:16:23', '', '2021-02-08 07:16:23', b'0'); -INSERT INTO `inf_job_log` VALUES (2305, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:18:00', '2021-02-18 23:18:00', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:17:18', '', '2021-02-08 07:17:18', b'0'); -INSERT INTO `inf_job_log` VALUES (2306, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:18:02', '2021-02-18 23:18:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:17:20', '', '2021-02-08 07:17:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2307, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:18:04', '2021-02-18 23:18:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:17:22', '', '2021-02-08 07:17:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2308, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:18:06', '2021-02-18 23:18:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:17:24', '', '2021-02-08 07:17:24', b'0'); -INSERT INTO `inf_job_log` VALUES (2309, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:19:00', '2021-02-18 23:19:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:18:18', '', '2021-02-08 07:18:18', b'0'); -INSERT INTO `inf_job_log` VALUES (2310, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:19:02', '2021-02-18 23:19:02', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:18:20', '', '2021-02-08 07:18:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2311, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:19:04', '2021-02-18 23:19:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:18:22', '', '2021-02-08 07:18:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2312, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:19:06', '2021-02-18 23:19:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:18:24', '', '2021-02-08 07:18:24', b'0'); -INSERT INTO `inf_job_log` VALUES (2313, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:20:00', '2021-02-18 23:20:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:19:18', '', '2021-02-08 07:19:18', b'0'); -INSERT INTO `inf_job_log` VALUES (2314, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:20:02', '2021-02-18 23:20:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:19:20', '', '2021-02-08 07:19:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2315, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:20:04', '2021-02-18 23:20:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:19:22', '', '2021-02-08 07:19:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2316, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:20:06', '2021-02-18 23:20:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:19:24', '', '2021-02-08 07:19:24', b'0'); -INSERT INTO `inf_job_log` VALUES (2317, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:21:00', '2021-02-18 23:21:00', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:20:18', '', '2021-02-08 07:20:18', b'0'); -INSERT INTO `inf_job_log` VALUES (2318, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:21:02', '2021-02-18 23:21:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:20:20', '', '2021-02-08 07:20:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2319, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:21:04', '2021-02-18 23:21:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:20:22', '', '2021-02-08 07:20:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2320, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:21:06', '2021-02-18 23:21:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:20:24', '', '2021-02-08 07:20:24', b'0'); -INSERT INTO `inf_job_log` VALUES (2321, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:22:00', '2021-02-18 23:22:00', 6, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:21:18', '', '2021-02-08 07:21:18', b'0'); -INSERT INTO `inf_job_log` VALUES (2322, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:22:02', '2021-02-18 23:22:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:21:20', '', '2021-02-08 07:21:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2323, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:22:04', '2021-02-18 23:22:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:21:22', '', '2021-02-08 07:21:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2324, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:22:06', '2021-02-18 23:22:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:21:24', '', '2021-02-08 07:21:24', b'0'); -INSERT INTO `inf_job_log` VALUES (2325, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:23:00', '2021-02-18 23:23:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:22:18', '', '2021-02-08 07:22:18', b'0'); -INSERT INTO `inf_job_log` VALUES (2326, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:23:02', '2021-02-18 23:23:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:22:20', '', '2021-02-08 07:22:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2327, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:23:04', '2021-02-18 23:23:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:22:22', '', '2021-02-08 07:22:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2328, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:23:06', '2021-02-18 23:23:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:22:24', '', '2021-02-08 07:22:24', b'0'); -INSERT INTO `inf_job_log` VALUES (2329, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:24:00', '2021-02-18 23:24:00', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:23:18', '', '2021-02-08 07:23:18', b'0'); -INSERT INTO `inf_job_log` VALUES (2330, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:24:02', '2021-02-18 23:24:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:23:20', '', '2021-02-08 07:23:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2331, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:24:04', '2021-02-18 23:24:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:23:22', '', '2021-02-08 07:23:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2332, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:24:06', '2021-02-18 23:24:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:23:24', '', '2021-02-08 07:23:24', b'0'); -INSERT INTO `inf_job_log` VALUES (2333, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:25:00', '2021-02-18 23:25:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:24:18', '', '2021-02-08 07:24:18', b'0'); -INSERT INTO `inf_job_log` VALUES (2334, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:25:02', '2021-02-18 23:25:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:24:20', '', '2021-02-08 07:24:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2335, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:25:04', '2021-02-18 23:25:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:24:22', '', '2021-02-08 07:24:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2336, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:25:06', '2021-02-18 23:25:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:24:24', '', '2021-02-08 07:24:24', b'0'); -INSERT INTO `inf_job_log` VALUES (2337, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:26:00', '2021-02-18 23:26:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:25:18', '', '2021-02-08 07:25:18', b'0'); -INSERT INTO `inf_job_log` VALUES (2338, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:26:02', '2021-02-18 23:26:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:25:20', '', '2021-02-08 07:25:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2339, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:26:04', '2021-02-18 23:26:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:25:22', '', '2021-02-08 07:25:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2340, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:26:06', '2021-02-18 23:26:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:25:24', '', '2021-02-08 07:25:24', b'0'); -INSERT INTO `inf_job_log` VALUES (2341, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:27:00', '2021-02-18 23:27:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:26:18', '', '2021-02-08 07:26:18', b'0'); -INSERT INTO `inf_job_log` VALUES (2342, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:27:02', '2021-02-18 23:27:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:26:20', '', '2021-02-08 07:26:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2343, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:27:04', '2021-02-18 23:27:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:26:22', '', '2021-02-08 07:26:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2344, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:27:06', '2021-02-18 23:27:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:26:24', '', '2021-02-08 07:26:24', b'0'); -INSERT INTO `inf_job_log` VALUES (2345, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:28:00', '2021-02-18 23:28:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:27:18', '', '2021-02-08 07:27:18', b'0'); -INSERT INTO `inf_job_log` VALUES (2346, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:28:02', '2021-02-18 23:28:02', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:27:20', '', '2021-02-08 07:27:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2347, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:28:04', '2021-02-18 23:28:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:27:22', '', '2021-02-08 07:27:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2348, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:28:06', '2021-02-18 23:28:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:27:24', '', '2021-02-08 07:27:24', b'0'); -INSERT INTO `inf_job_log` VALUES (2349, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:29:00', '2021-02-18 23:29:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:28:18', '', '2021-02-08 07:28:18', b'0'); -INSERT INTO `inf_job_log` VALUES (2350, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:29:02', '2021-02-18 23:29:02', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:28:20', '', '2021-02-08 07:28:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2351, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:29:04', '2021-02-18 23:29:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:28:22', '', '2021-02-08 07:28:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2352, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:29:06', '2021-02-18 23:29:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:28:24', '', '2021-02-08 07:28:24', b'0'); -INSERT INTO `inf_job_log` VALUES (2353, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:30:00', '2021-02-18 23:30:00', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:29:18', '', '2021-02-08 07:29:18', b'0'); -INSERT INTO `inf_job_log` VALUES (2354, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:30:02', '2021-02-18 23:30:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:29:20', '', '2021-02-08 07:29:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2355, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:30:04', '2021-02-18 23:30:04', 6, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:29:22', '', '2021-02-08 07:29:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2356, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:30:06', '2021-02-18 23:30:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:29:24', '', '2021-02-08 07:29:24', b'0'); -INSERT INTO `inf_job_log` VALUES (2357, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:31:00', '2021-02-18 23:31:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:30:18', '', '2021-02-08 07:30:18', b'0'); -INSERT INTO `inf_job_log` VALUES (2358, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:31:02', '2021-02-18 23:31:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:30:20', '', '2021-02-08 07:30:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2359, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:31:04', '2021-02-18 23:31:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:30:22', '', '2021-02-08 07:30:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2360, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:31:06', '2021-02-18 23:31:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:30:24', '', '2021-02-08 07:30:24', b'0'); -INSERT INTO `inf_job_log` VALUES (2361, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:32:00', '2021-02-18 23:32:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:31:18', '', '2021-02-08 07:31:18', b'0'); -INSERT INTO `inf_job_log` VALUES (2362, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:32:02', '2021-02-18 23:32:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:31:20', '', '2021-02-08 07:31:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2363, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:32:04', '2021-02-18 23:32:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:31:23', '', '2021-02-08 07:31:23', b'0'); -INSERT INTO `inf_job_log` VALUES (2364, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:32:06', '2021-02-18 23:32:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:31:25', '', '2021-02-08 07:31:25', b'0'); -INSERT INTO `inf_job_log` VALUES (2365, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:33:00', '2021-02-18 23:33:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:32:19', '', '2021-02-08 07:32:19', b'0'); -INSERT INTO `inf_job_log` VALUES (2366, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:33:02', '2021-02-18 23:33:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:32:21', '', '2021-02-08 07:32:21', b'0'); -INSERT INTO `inf_job_log` VALUES (2367, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:33:04', '2021-02-18 23:33:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:32:23', '', '2021-02-08 07:32:23', b'0'); -INSERT INTO `inf_job_log` VALUES (2368, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:33:06', '2021-02-18 23:33:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:32:25', '', '2021-02-08 07:32:25', b'0'); -INSERT INTO `inf_job_log` VALUES (2369, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:34:00', '2021-02-18 23:34:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:33:19', '', '2021-02-08 07:33:19', b'0'); -INSERT INTO `inf_job_log` VALUES (2370, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:34:02', '2021-02-18 23:34:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:33:21', '', '2021-02-08 07:33:21', b'0'); -INSERT INTO `inf_job_log` VALUES (2371, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:34:04', '2021-02-18 23:34:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:33:23', '', '2021-02-08 07:33:23', b'0'); -INSERT INTO `inf_job_log` VALUES (2372, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:34:06', '2021-02-18 23:34:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:33:25', '', '2021-02-08 07:33:25', b'0'); -INSERT INTO `inf_job_log` VALUES (2373, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:35:00', '2021-02-18 23:35:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:34:19', '', '2021-02-08 07:34:19', b'0'); -INSERT INTO `inf_job_log` VALUES (2374, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:35:02', '2021-02-18 23:35:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:34:21', '', '2021-02-08 07:34:21', b'0'); -INSERT INTO `inf_job_log` VALUES (2375, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:35:04', '2021-02-18 23:35:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:34:23', '', '2021-02-08 07:34:23', b'0'); -INSERT INTO `inf_job_log` VALUES (2376, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:35:06', '2021-02-18 23:35:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:34:25', '', '2021-02-08 07:34:25', b'0'); -INSERT INTO `inf_job_log` VALUES (2377, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:36:00', '2021-02-18 23:36:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:35:19', '', '2021-02-08 07:35:19', b'0'); -INSERT INTO `inf_job_log` VALUES (2378, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:36:02', '2021-02-18 23:36:02', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:35:21', '', '2021-02-08 07:35:21', b'0'); -INSERT INTO `inf_job_log` VALUES (2379, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:36:04', '2021-02-18 23:36:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:35:23', '', '2021-02-08 07:35:23', b'0'); -INSERT INTO `inf_job_log` VALUES (2380, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:36:06', '2021-02-18 23:36:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:35:25', '', '2021-02-08 07:35:25', b'0'); -INSERT INTO `inf_job_log` VALUES (2381, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:37:00', '2021-02-18 23:37:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:36:19', '', '2021-02-08 07:36:19', b'0'); -INSERT INTO `inf_job_log` VALUES (2382, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:37:02', '2021-02-18 23:37:02', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:36:21', '', '2021-02-08 07:36:21', b'0'); -INSERT INTO `inf_job_log` VALUES (2383, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:37:04', '2021-02-18 23:37:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:36:23', '', '2021-02-08 07:36:23', b'0'); -INSERT INTO `inf_job_log` VALUES (2384, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:37:06', '2021-02-18 23:37:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:36:25', '', '2021-02-08 07:36:25', b'0'); -INSERT INTO `inf_job_log` VALUES (2385, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:38:00', '2021-02-18 23:38:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:37:19', '', '2021-02-08 07:37:19', b'0'); -INSERT INTO `inf_job_log` VALUES (2386, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:38:02', '2021-02-18 23:38:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:37:21', '', '2021-02-08 07:37:21', b'0'); -INSERT INTO `inf_job_log` VALUES (2387, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:38:04', '2021-02-18 23:38:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:37:23', '', '2021-02-08 07:37:23', b'0'); -INSERT INTO `inf_job_log` VALUES (2388, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:38:06', '2021-02-18 23:38:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:37:25', '', '2021-02-08 07:37:25', b'0'); -INSERT INTO `inf_job_log` VALUES (2389, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:39:00', '2021-02-18 23:39:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:38:19', '', '2021-02-08 07:38:19', b'0'); -INSERT INTO `inf_job_log` VALUES (2390, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:39:02', '2021-02-18 23:39:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:38:21', '', '2021-02-08 07:38:21', b'0'); -INSERT INTO `inf_job_log` VALUES (2391, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:39:04', '2021-02-18 23:39:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:38:23', '', '2021-02-08 07:38:23', b'0'); -INSERT INTO `inf_job_log` VALUES (2392, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:39:06', '2021-02-18 23:39:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:38:25', '', '2021-02-08 07:38:25', b'0'); -INSERT INTO `inf_job_log` VALUES (2393, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:40:00', '2021-02-18 23:40:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:39:19', '', '2021-02-08 07:39:19', b'0'); -INSERT INTO `inf_job_log` VALUES (2394, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:40:02', '2021-02-18 23:40:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:39:21', '', '2021-02-08 07:39:21', b'0'); -INSERT INTO `inf_job_log` VALUES (2395, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:40:04', '2021-02-18 23:40:04', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:39:23', '', '2021-02-08 07:39:23', b'0'); -INSERT INTO `inf_job_log` VALUES (2396, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:40:06', '2021-02-18 23:40:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:39:25', '', '2021-02-08 07:39:25', b'0'); -INSERT INTO `inf_job_log` VALUES (2397, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:41:00', '2021-02-18 23:41:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:40:19', '', '2021-02-08 07:40:19', b'0'); -INSERT INTO `inf_job_log` VALUES (2398, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:41:02', '2021-02-18 23:41:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:40:21', '', '2021-02-08 07:40:21', b'0'); -INSERT INTO `inf_job_log` VALUES (2399, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:41:04', '2021-02-18 23:41:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:40:23', '', '2021-02-08 07:40:23', b'0'); -INSERT INTO `inf_job_log` VALUES (2400, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:41:06', '2021-02-18 23:41:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:40:25', '', '2021-02-08 07:40:25', b'0'); -INSERT INTO `inf_job_log` VALUES (2401, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:42:00', '2021-02-18 23:42:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:41:19', '', '2021-02-08 07:41:19', b'0'); -INSERT INTO `inf_job_log` VALUES (2402, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:42:02', '2021-02-18 23:42:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:41:21', '', '2021-02-08 07:41:21', b'0'); -INSERT INTO `inf_job_log` VALUES (2403, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:42:04', '2021-02-18 23:42:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:41:23', '', '2021-02-08 07:41:23', b'0'); -INSERT INTO `inf_job_log` VALUES (2404, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:42:06', '2021-02-18 23:42:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:41:25', '', '2021-02-08 07:41:25', b'0'); -INSERT INTO `inf_job_log` VALUES (2405, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:43:00', '2021-02-18 23:43:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:42:19', '', '2021-02-08 07:42:19', b'0'); -INSERT INTO `inf_job_log` VALUES (2406, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:43:02', '2021-02-18 23:43:02', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:42:21', '', '2021-02-08 07:42:21', b'0'); -INSERT INTO `inf_job_log` VALUES (2407, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:43:04', '2021-02-18 23:43:04', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:42:23', '', '2021-02-08 07:42:23', b'0'); -INSERT INTO `inf_job_log` VALUES (2408, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:43:06', '2021-02-18 23:43:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:42:25', '', '2021-02-08 07:42:25', b'0'); -INSERT INTO `inf_job_log` VALUES (2409, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:44:00', '2021-02-18 23:44:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:43:19', '', '2021-02-08 07:43:19', b'0'); -INSERT INTO `inf_job_log` VALUES (2410, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:44:02', '2021-02-18 23:44:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:43:21', '', '2021-02-08 07:43:21', b'0'); -INSERT INTO `inf_job_log` VALUES (2411, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:44:04', '2021-02-18 23:44:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:43:23', '', '2021-02-08 07:43:23', b'0'); -INSERT INTO `inf_job_log` VALUES (2412, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:44:06', '2021-02-18 23:44:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:43:25', '', '2021-02-08 07:43:25', b'0'); -INSERT INTO `inf_job_log` VALUES (2413, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:45:00', '2021-02-18 23:45:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:44:19', '', '2021-02-08 07:44:19', b'0'); -INSERT INTO `inf_job_log` VALUES (2414, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:45:02', '2021-02-18 23:45:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:44:21', '', '2021-02-08 07:44:21', b'0'); -INSERT INTO `inf_job_log` VALUES (2415, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:45:04', '2021-02-18 23:45:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:44:23', '', '2021-02-08 07:44:23', b'0'); -INSERT INTO `inf_job_log` VALUES (2416, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:45:06', '2021-02-18 23:45:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:44:25', '', '2021-02-08 07:44:25', b'0'); -INSERT INTO `inf_job_log` VALUES (2417, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:46:00', '2021-02-18 23:46:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:45:19', '', '2021-02-08 07:45:19', b'0'); -INSERT INTO `inf_job_log` VALUES (2418, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:46:02', '2021-02-18 23:46:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:45:21', '', '2021-02-08 07:45:21', b'0'); -INSERT INTO `inf_job_log` VALUES (2419, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:46:04', '2021-02-18 23:46:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:45:23', '', '2021-02-08 07:45:23', b'0'); -INSERT INTO `inf_job_log` VALUES (2420, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:46:06', '2021-02-18 23:46:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:45:25', '', '2021-02-08 07:45:25', b'0'); -INSERT INTO `inf_job_log` VALUES (2421, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:47:00', '2021-02-18 23:47:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:46:20', '', '2021-02-08 07:46:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2422, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:47:02', '2021-02-18 23:47:02', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:46:22', '', '2021-02-08 07:46:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2423, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:47:04', '2021-02-18 23:47:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:46:24', '', '2021-02-08 07:46:24', b'0'); -INSERT INTO `inf_job_log` VALUES (2424, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:47:06', '2021-02-18 23:47:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:46:26', '', '2021-02-08 07:46:26', b'0'); -INSERT INTO `inf_job_log` VALUES (2425, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:48:00', '2021-02-18 23:48:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:47:20', '', '2021-02-08 07:47:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2426, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:48:02', '2021-02-18 23:48:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:47:22', '', '2021-02-08 07:47:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2427, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:48:04', '2021-02-18 23:48:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:47:24', '', '2021-02-08 07:47:24', b'0'); -INSERT INTO `inf_job_log` VALUES (2428, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:48:06', '2021-02-18 23:48:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:47:26', '', '2021-02-08 07:47:26', b'0'); -INSERT INTO `inf_job_log` VALUES (2429, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:49:00', '2021-02-18 23:49:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:48:20', '', '2021-02-08 07:48:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2430, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:49:02', '2021-02-18 23:49:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:48:22', '', '2021-02-08 07:48:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2431, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:49:04', '2021-02-18 23:49:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:48:24', '', '2021-02-08 07:48:24', b'0'); -INSERT INTO `inf_job_log` VALUES (2432, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:49:06', '2021-02-18 23:49:06', 6, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:48:26', '', '2021-02-08 07:48:26', b'0'); -INSERT INTO `inf_job_log` VALUES (2433, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:50:00', '2021-02-18 23:50:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:49:20', '', '2021-02-08 07:49:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2434, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:50:02', '2021-02-18 23:50:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:49:22', '', '2021-02-08 07:49:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2435, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:50:04', '2021-02-18 23:50:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:49:24', '', '2021-02-08 07:49:24', b'0'); -INSERT INTO `inf_job_log` VALUES (2436, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:50:06', '2021-02-18 23:50:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:49:26', '', '2021-02-08 07:49:26', b'0'); -INSERT INTO `inf_job_log` VALUES (2437, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:51:00', '2021-02-18 23:51:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:50:20', '', '2021-02-08 07:50:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2438, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:51:02', '2021-02-18 23:51:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:50:22', '', '2021-02-08 07:50:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2439, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:51:04', '2021-02-18 23:51:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:50:24', '', '2021-02-08 07:50:24', b'0'); -INSERT INTO `inf_job_log` VALUES (2440, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:51:06', '2021-02-18 23:51:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:50:26', '', '2021-02-08 07:50:26', b'0'); -INSERT INTO `inf_job_log` VALUES (2441, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:52:00', '2021-02-18 23:52:00', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:51:20', '', '2021-02-08 07:51:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2442, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:52:02', '2021-02-18 23:52:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:51:22', '', '2021-02-08 07:51:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2443, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:52:04', '2021-02-18 23:52:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:51:24', '', '2021-02-08 07:51:24', b'0'); -INSERT INTO `inf_job_log` VALUES (2444, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:52:06', '2021-02-18 23:52:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:51:26', '', '2021-02-08 07:51:26', b'0'); -INSERT INTO `inf_job_log` VALUES (2445, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:53:00', '2021-02-18 23:53:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:52:20', '', '2021-02-08 07:52:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2446, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:53:02', '2021-02-18 23:53:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:52:22', '', '2021-02-08 07:52:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2447, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:53:04', '2021-02-18 23:53:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:52:24', '', '2021-02-08 07:52:24', b'0'); -INSERT INTO `inf_job_log` VALUES (2448, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:53:06', '2021-02-18 23:53:06', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:52:26', '', '2021-02-08 07:52:26', b'0'); -INSERT INTO `inf_job_log` VALUES (2449, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:54:00', '2021-02-18 23:54:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:53:20', '', '2021-02-08 07:53:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2450, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:54:02', '2021-02-18 23:54:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:53:22', '', '2021-02-08 07:53:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2451, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:54:04', '2021-02-18 23:54:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:53:24', '', '2021-02-08 07:53:24', b'0'); -INSERT INTO `inf_job_log` VALUES (2452, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:54:06', '2021-02-18 23:54:06', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:53:26', '', '2021-02-08 07:53:26', b'0'); -INSERT INTO `inf_job_log` VALUES (2453, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:55:00', '2021-02-18 23:55:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:54:20', '', '2021-02-08 07:54:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2454, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:55:02', '2021-02-18 23:55:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:54:22', '', '2021-02-08 07:54:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2455, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:55:04', '2021-02-18 23:55:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:54:24', '', '2021-02-08 07:54:24', b'0'); -INSERT INTO `inf_job_log` VALUES (2456, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:55:06', '2021-02-18 23:55:06', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:54:26', '', '2021-02-08 07:54:26', b'0'); -INSERT INTO `inf_job_log` VALUES (2457, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:56:00', '2021-02-18 23:56:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:55:20', '', '2021-02-08 07:55:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2458, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:56:02', '2021-02-18 23:56:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:55:22', '', '2021-02-08 07:55:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2459, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:56:04', '2021-02-18 23:56:04', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:55:24', '', '2021-02-08 07:55:24', b'0'); -INSERT INTO `inf_job_log` VALUES (2460, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:56:06', '2021-02-18 23:56:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:55:26', '', '2021-02-08 07:55:26', b'0'); -INSERT INTO `inf_job_log` VALUES (2461, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:57:00', '2021-02-18 23:57:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:56:20', '', '2021-02-08 07:56:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2462, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:57:02', '2021-02-18 23:57:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:56:22', '', '2021-02-08 07:56:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2463, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:57:04', '2021-02-18 23:57:04', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:56:24', '', '2021-02-08 07:56:24', b'0'); -INSERT INTO `inf_job_log` VALUES (2464, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:57:06', '2021-02-18 23:57:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:56:26', '', '2021-02-08 07:56:26', b'0'); -INSERT INTO `inf_job_log` VALUES (2465, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:58:00', '2021-02-18 23:58:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:57:20', '', '2021-02-08 07:57:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2466, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:58:02', '2021-02-18 23:58:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:57:22', '', '2021-02-08 07:57:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2467, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:58:04', '2021-02-18 23:58:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:57:24', '', '2021-02-08 07:57:24', b'0'); -INSERT INTO `inf_job_log` VALUES (2468, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:58:06', '2021-02-18 23:58:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:57:26', '', '2021-02-08 07:57:26', b'0'); -INSERT INTO `inf_job_log` VALUES (2469, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-18 23:59:00', '2021-02-18 23:59:00', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:58:20', '', '2021-02-08 07:58:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2470, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-18 23:59:02', '2021-02-18 23:59:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:58:22', '', '2021-02-08 07:58:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2471, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-18 23:59:04', '2021-02-18 23:59:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:58:24', '', '2021-02-08 07:58:24', b'0'); -INSERT INTO `inf_job_log` VALUES (2472, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-18 23:59:06', '2021-02-18 23:59:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:58:26', '', '2021-02-08 07:58:26', b'0'); -INSERT INTO `inf_job_log` VALUES (2473, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 00:00:00', '2021-02-19 00:00:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:59:20', '', '2021-02-08 07:59:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2474, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 00:00:02', '2021-02-19 00:00:02', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:59:22', '', '2021-02-08 07:59:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2475, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 00:00:04', '2021-02-19 00:00:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:59:24', '', '2021-02-08 07:59:24', b'0'); -INSERT INTO `inf_job_log` VALUES (2476, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 00:00:06', '2021-02-19 00:00:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 07:59:26', '', '2021-02-08 07:59:26', b'0'); -INSERT INTO `inf_job_log` VALUES (2477, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 00:01:00', '2021-02-19 00:01:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:00:20', '', '2021-02-08 08:00:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2478, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 00:01:02', '2021-02-19 00:01:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:00:22', '', '2021-02-08 08:00:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2479, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 00:01:04', '2021-02-19 00:01:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:00:24', '', '2021-02-08 08:00:24', b'0'); -INSERT INTO `inf_job_log` VALUES (2480, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 00:01:06', '2021-02-19 00:01:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:00:26', '', '2021-02-08 08:00:26', b'0'); -INSERT INTO `inf_job_log` VALUES (2481, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 00:02:00', '2021-02-19 00:02:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:01:21', '', '2021-02-08 08:01:21', b'0'); -INSERT INTO `inf_job_log` VALUES (2482, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 00:02:02', '2021-02-19 00:02:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:01:23', '', '2021-02-08 08:01:23', b'0'); -INSERT INTO `inf_job_log` VALUES (2483, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 00:02:04', '2021-02-19 00:02:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:01:25', '', '2021-02-08 08:01:25', b'0'); -INSERT INTO `inf_job_log` VALUES (2484, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 00:02:06', '2021-02-19 00:02:06', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:01:27', '', '2021-02-08 08:01:27', b'0'); -INSERT INTO `inf_job_log` VALUES (2485, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 00:03:00', '2021-02-19 00:03:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:02:21', '', '2021-02-08 08:02:21', b'0'); -INSERT INTO `inf_job_log` VALUES (2486, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 00:03:02', '2021-02-19 00:03:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:02:23', '', '2021-02-08 08:02:23', b'0'); -INSERT INTO `inf_job_log` VALUES (2487, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 00:03:04', '2021-02-19 00:03:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:02:25', '', '2021-02-08 08:02:25', b'0'); -INSERT INTO `inf_job_log` VALUES (2488, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 00:03:06', '2021-02-19 00:03:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:02:27', '', '2021-02-08 08:02:27', b'0'); -INSERT INTO `inf_job_log` VALUES (2489, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 00:04:00', '2021-02-19 00:04:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:03:21', '', '2021-02-08 08:03:21', b'0'); -INSERT INTO `inf_job_log` VALUES (2490, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 00:04:02', '2021-02-19 00:04:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:03:23', '', '2021-02-08 08:03:23', b'0'); -INSERT INTO `inf_job_log` VALUES (2491, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 00:04:04', '2021-02-19 00:04:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:03:25', '', '2021-02-08 08:03:25', b'0'); -INSERT INTO `inf_job_log` VALUES (2492, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 00:04:06', '2021-02-19 00:04:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:03:27', '', '2021-02-08 08:03:27', b'0'); -INSERT INTO `inf_job_log` VALUES (2493, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 00:27:59', '2021-02-19 00:27:59', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:04:27', '', '2021-02-08 08:04:27', b'0'); -INSERT INTO `inf_job_log` VALUES (2494, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 00:28:01', '2021-02-19 00:28:01', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:04:29', '', '2021-02-08 08:04:29', b'0'); -INSERT INTO `inf_job_log` VALUES (2495, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 00:28:03', '2021-02-19 00:28:03', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:04:31', '', '2021-02-08 08:04:31', b'0'); -INSERT INTO `inf_job_log` VALUES (2496, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 00:28:05', '2021-02-19 00:28:05', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:04:33', '', '2021-02-08 08:04:33', b'0'); -INSERT INTO `inf_job_log` VALUES (2497, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 00:28:05', '2021-02-19 00:28:05', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:04:33', '', '2021-02-08 08:04:33', b'0'); -INSERT INTO `inf_job_log` VALUES (2498, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 00:28:07', '2021-02-19 00:28:07', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:04:35', '', '2021-02-08 08:04:35', b'0'); -INSERT INTO `inf_job_log` VALUES (2499, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 00:28:09', '2021-02-19 00:28:09', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:04:37', '', '2021-02-08 08:04:37', b'0'); -INSERT INTO `inf_job_log` VALUES (2500, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 00:28:11', '2021-02-19 00:28:11', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:04:39', '', '2021-02-08 08:04:39', b'0'); -INSERT INTO `inf_job_log` VALUES (2501, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 00:29:00', '2021-02-19 00:29:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:05:29', '', '2021-02-08 08:05:29', b'0'); -INSERT INTO `inf_job_log` VALUES (2502, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 00:29:02', '2021-02-19 00:29:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:05:31', '', '2021-02-08 08:05:31', b'0'); -INSERT INTO `inf_job_log` VALUES (2503, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 00:29:04', '2021-02-19 00:29:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:05:33', '', '2021-02-08 08:05:33', b'0'); -INSERT INTO `inf_job_log` VALUES (2504, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 00:29:06', '2021-02-19 00:29:06', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:05:35', '', '2021-02-08 08:05:35', b'0'); -INSERT INTO `inf_job_log` VALUES (2505, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 00:30:00', '2021-02-19 00:30:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:06:29', '', '2021-02-08 08:06:29', b'0'); -INSERT INTO `inf_job_log` VALUES (2506, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 00:30:02', '2021-02-19 00:30:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:06:31', '', '2021-02-08 08:06:31', b'0'); -INSERT INTO `inf_job_log` VALUES (2507, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 00:30:04', '2021-02-19 00:30:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:06:33', '', '2021-02-08 08:06:33', b'0'); -INSERT INTO `inf_job_log` VALUES (2508, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 00:30:06', '2021-02-19 00:30:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:06:35', '', '2021-02-08 08:06:35', b'0'); -INSERT INTO `inf_job_log` VALUES (2509, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 00:31:00', '2021-02-19 00:31:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:07:29', '', '2021-02-08 08:07:29', b'0'); -INSERT INTO `inf_job_log` VALUES (2510, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 00:31:02', '2021-02-19 00:31:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:07:31', '', '2021-02-08 08:07:31', b'0'); -INSERT INTO `inf_job_log` VALUES (2511, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 00:31:04', '2021-02-19 00:31:04', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:07:33', '', '2021-02-08 08:07:33', b'0'); -INSERT INTO `inf_job_log` VALUES (2512, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 00:31:06', '2021-02-19 00:31:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:07:35', '', '2021-02-08 08:07:35', b'0'); -INSERT INTO `inf_job_log` VALUES (2513, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 00:32:00', '2021-02-19 00:32:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:08:29', '', '2021-02-08 08:08:29', b'0'); -INSERT INTO `inf_job_log` VALUES (2514, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 00:32:02', '2021-02-19 00:32:02', 10, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:08:31', '', '2021-02-08 08:08:31', b'0'); -INSERT INTO `inf_job_log` VALUES (2515, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 00:32:04', '2021-02-19 00:32:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:08:33', '', '2021-02-08 08:08:33', b'0'); -INSERT INTO `inf_job_log` VALUES (2516, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 00:32:06', '2021-02-19 00:32:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:08:35', '', '2021-02-08 08:08:35', b'0'); -INSERT INTO `inf_job_log` VALUES (2517, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 00:33:00', '2021-02-19 00:33:00', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:09:29', '', '2021-02-08 08:09:29', b'0'); -INSERT INTO `inf_job_log` VALUES (2518, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 00:33:02', '2021-02-19 00:33:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:09:31', '', '2021-02-08 08:09:31', b'0'); -INSERT INTO `inf_job_log` VALUES (2519, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 00:33:04', '2021-02-19 00:33:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:09:33', '', '2021-02-08 08:09:33', b'0'); -INSERT INTO `inf_job_log` VALUES (2520, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 00:33:06', '2021-02-19 00:33:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:09:35', '', '2021-02-08 08:09:35', b'0'); -INSERT INTO `inf_job_log` VALUES (2521, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 00:34:00', '2021-02-19 00:34:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:10:29', '', '2021-02-08 08:10:29', b'0'); -INSERT INTO `inf_job_log` VALUES (2522, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 00:34:02', '2021-02-19 00:34:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:10:31', '', '2021-02-08 08:10:31', b'0'); -INSERT INTO `inf_job_log` VALUES (2523, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 00:34:04', '2021-02-19 00:34:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:10:33', '', '2021-02-08 08:10:33', b'0'); -INSERT INTO `inf_job_log` VALUES (2524, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 00:34:06', '2021-02-19 00:34:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:10:35', '', '2021-02-08 08:10:35', b'0'); -INSERT INTO `inf_job_log` VALUES (2525, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 00:35:00', '2021-02-19 00:35:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:11:29', '', '2021-02-08 08:11:29', b'0'); -INSERT INTO `inf_job_log` VALUES (2526, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 00:35:02', '2021-02-19 00:35:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:11:31', '', '2021-02-08 08:11:31', b'0'); -INSERT INTO `inf_job_log` VALUES (2527, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 00:35:04', '2021-02-19 00:35:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:11:33', '', '2021-02-08 08:11:33', b'0'); -INSERT INTO `inf_job_log` VALUES (2528, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 00:35:06', '2021-02-19 00:35:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:11:35', '', '2021-02-08 08:11:35', b'0'); -INSERT INTO `inf_job_log` VALUES (2529, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 00:36:00', '2021-02-19 00:36:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:12:29', '', '2021-02-08 08:12:29', b'0'); -INSERT INTO `inf_job_log` VALUES (2530, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 00:36:02', '2021-02-19 00:36:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:12:31', '', '2021-02-08 08:12:31', b'0'); -INSERT INTO `inf_job_log` VALUES (2531, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 00:36:04', '2021-02-19 00:36:04', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:12:33', '', '2021-02-08 08:12:33', b'0'); -INSERT INTO `inf_job_log` VALUES (2532, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 00:36:06', '2021-02-19 00:36:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:12:35', '', '2021-02-08 08:12:35', b'0'); -INSERT INTO `inf_job_log` VALUES (2533, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 00:37:00', '2021-02-19 00:37:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:13:29', '', '2021-02-08 08:13:29', b'0'); -INSERT INTO `inf_job_log` VALUES (2534, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 00:37:02', '2021-02-19 00:37:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:13:31', '', '2021-02-08 08:13:31', b'0'); -INSERT INTO `inf_job_log` VALUES (2535, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 00:37:04', '2021-02-19 00:37:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:13:33', '', '2021-02-08 08:13:33', b'0'); -INSERT INTO `inf_job_log` VALUES (2536, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 00:37:06', '2021-02-19 00:37:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:13:35', '', '2021-02-08 08:13:35', b'0'); -INSERT INTO `inf_job_log` VALUES (2537, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 00:38:00', '2021-02-19 00:38:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:14:29', '', '2021-02-08 08:14:29', b'0'); -INSERT INTO `inf_job_log` VALUES (2538, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 00:38:02', '2021-02-19 00:38:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:14:31', '', '2021-02-08 08:14:31', b'0'); -INSERT INTO `inf_job_log` VALUES (2539, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 00:38:04', '2021-02-19 00:38:04', 9, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:14:33', '', '2021-02-08 08:14:33', b'0'); -INSERT INTO `inf_job_log` VALUES (2540, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 00:38:06', '2021-02-19 00:38:06', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:14:35', '', '2021-02-08 08:14:35', b'0'); -INSERT INTO `inf_job_log` VALUES (2541, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 00:39:00', '2021-02-19 00:39:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:15:29', '', '2021-02-08 08:15:29', b'0'); -INSERT INTO `inf_job_log` VALUES (2542, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 00:39:02', '2021-02-19 00:39:02', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:15:31', '', '2021-02-08 08:15:31', b'0'); -INSERT INTO `inf_job_log` VALUES (2543, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 00:39:04', '2021-02-19 00:39:04', 7, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:15:33', '', '2021-02-08 08:15:33', b'0'); -INSERT INTO `inf_job_log` VALUES (2544, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 00:39:06', '2021-02-19 00:39:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:15:35', '', '2021-02-08 08:15:35', b'0'); -INSERT INTO `inf_job_log` VALUES (2545, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 00:40:00', '2021-02-19 00:40:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:16:29', '', '2021-02-08 08:16:29', b'0'); -INSERT INTO `inf_job_log` VALUES (2546, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 00:40:02', '2021-02-19 00:40:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:16:31', '', '2021-02-08 08:16:31', b'0'); -INSERT INTO `inf_job_log` VALUES (2547, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 00:40:04', '2021-02-19 00:40:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:16:33', '', '2021-02-08 08:16:33', b'0'); -INSERT INTO `inf_job_log` VALUES (2548, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 00:40:06', '2021-02-19 00:40:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:16:35', '', '2021-02-08 08:16:35', b'0'); -INSERT INTO `inf_job_log` VALUES (2549, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 00:41:00', '2021-02-19 00:41:00', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:17:29', '', '2021-02-08 08:17:29', b'0'); -INSERT INTO `inf_job_log` VALUES (2550, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 00:41:02', '2021-02-19 00:41:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:17:31', '', '2021-02-08 08:17:31', b'0'); -INSERT INTO `inf_job_log` VALUES (2551, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 00:41:04', '2021-02-19 00:41:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:17:33', '', '2021-02-08 08:17:33', b'0'); -INSERT INTO `inf_job_log` VALUES (2552, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 00:41:06', '2021-02-19 00:41:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:17:35', '', '2021-02-08 08:17:35', b'0'); -INSERT INTO `inf_job_log` VALUES (2553, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 00:42:00', '2021-02-19 00:42:00', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:18:29', '', '2021-02-08 08:18:29', b'0'); -INSERT INTO `inf_job_log` VALUES (2554, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 00:42:02', '2021-02-19 00:42:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:18:31', '', '2021-02-08 08:18:31', b'0'); -INSERT INTO `inf_job_log` VALUES (2555, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 00:42:04', '2021-02-19 00:42:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:18:33', '', '2021-02-08 08:18:33', b'0'); -INSERT INTO `inf_job_log` VALUES (2556, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 00:42:06', '2021-02-19 00:42:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:18:35', '', '2021-02-08 08:18:35', b'0'); -INSERT INTO `inf_job_log` VALUES (2557, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 00:43:00', '2021-02-19 00:43:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:19:30', '', '2021-02-08 08:19:30', b'0'); -INSERT INTO `inf_job_log` VALUES (2558, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 00:43:02', '2021-02-19 00:43:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:19:32', '', '2021-02-08 08:19:32', b'0'); -INSERT INTO `inf_job_log` VALUES (2559, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 00:43:04', '2021-02-19 00:43:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:19:34', '', '2021-02-08 08:19:34', b'0'); -INSERT INTO `inf_job_log` VALUES (2560, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 00:43:06', '2021-02-19 00:43:06', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:19:36', '', '2021-02-08 08:19:36', b'0'); -INSERT INTO `inf_job_log` VALUES (2561, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 00:44:00', '2021-02-19 00:44:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:20:30', '', '2021-02-08 08:20:30', b'0'); -INSERT INTO `inf_job_log` VALUES (2562, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 00:44:02', '2021-02-19 00:44:02', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:20:32', '', '2021-02-08 08:20:32', b'0'); -INSERT INTO `inf_job_log` VALUES (2563, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 00:44:04', '2021-02-19 00:44:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:20:34', '', '2021-02-08 08:20:34', b'0'); -INSERT INTO `inf_job_log` VALUES (2564, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 00:44:06', '2021-02-19 00:44:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:20:36', '', '2021-02-08 08:20:36', b'0'); -INSERT INTO `inf_job_log` VALUES (2565, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 00:45:00', '2021-02-19 00:45:00', 6, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:21:30', '', '2021-02-08 08:21:30', b'0'); -INSERT INTO `inf_job_log` VALUES (2566, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 00:45:02', '2021-02-19 00:45:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:21:32', '', '2021-02-08 08:21:32', b'0'); -INSERT INTO `inf_job_log` VALUES (2567, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 00:45:04', '2021-02-19 00:45:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:21:34', '', '2021-02-08 08:21:34', b'0'); -INSERT INTO `inf_job_log` VALUES (2568, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 00:45:06', '2021-02-19 00:45:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:21:36', '', '2021-02-08 08:21:36', b'0'); -INSERT INTO `inf_job_log` VALUES (2569, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 00:46:39', '2021-02-19 00:46:39', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:22:00', '', '2021-02-08 08:22:00', b'0'); -INSERT INTO `inf_job_log` VALUES (2570, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 00:46:41', '2021-02-19 00:46:41', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:22:02', '', '2021-02-08 08:22:02', b'0'); -INSERT INTO `inf_job_log` VALUES (2571, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 00:46:43', '2021-02-19 00:46:43', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:22:04', '', '2021-02-08 08:22:04', b'0'); -INSERT INTO `inf_job_log` VALUES (2572, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 00:46:45', '2021-02-19 00:46:45', 13, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:22:06', '', '2021-02-08 08:22:07', b'0'); -INSERT INTO `inf_job_log` VALUES (2573, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 00:47:00', '2021-02-19 00:47:00', 7, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:22:21', '', '2021-02-08 08:22:21', b'0'); -INSERT INTO `inf_job_log` VALUES (2574, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 00:47:02', '2021-02-19 00:47:02', 11, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:22:23', '', '2021-02-08 08:22:23', b'0'); -INSERT INTO `inf_job_log` VALUES (2575, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 00:47:04', '2021-02-19 00:47:04', 8, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:22:25', '', '2021-02-08 08:22:25', b'0'); -INSERT INTO `inf_job_log` VALUES (2576, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 00:47:06', '2021-02-19 00:47:06', 8, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:22:27', '', '2021-02-08 08:22:27', b'0'); -INSERT INTO `inf_job_log` VALUES (2577, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 01:21:24', '2021-02-19 01:21:24', 16, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:23:29', '', '2021-02-08 08:23:29', b'0'); -INSERT INTO `inf_job_log` VALUES (2578, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 01:21:26', '2021-02-19 01:21:26', 8, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:23:31', '', '2021-02-08 08:23:31', b'0'); -INSERT INTO `inf_job_log` VALUES (2579, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 01:21:28', '2021-02-19 01:21:28', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:23:33', '', '2021-02-08 08:23:33', b'0'); -INSERT INTO `inf_job_log` VALUES (2580, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 01:21:30', '2021-02-19 01:21:30', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:23:35', '', '2021-02-08 08:23:35', b'0'); -INSERT INTO `inf_job_log` VALUES (2581, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 01:22:00', '2021-02-19 01:22:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:24:05', '', '2021-02-08 08:24:05', b'0'); -INSERT INTO `inf_job_log` VALUES (2582, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 02:00:15', '2021-02-19 02:00:15', 26, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:24:08', '', '2021-02-08 08:24:08', b'0'); -INSERT INTO `inf_job_log` VALUES (2583, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 02:00:17', '2021-02-19 02:00:17', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:24:10', '', '2021-02-08 08:24:10', b'0'); -INSERT INTO `inf_job_log` VALUES (2584, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 02:00:19', '2021-02-19 02:00:19', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:24:12', '', '2021-02-08 08:24:12', b'0'); -INSERT INTO `inf_job_log` VALUES (2585, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 02:00:36', '2021-02-19 02:00:36', 20, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:24:29', '', '2021-02-08 08:24:29', b'0'); -INSERT INTO `inf_job_log` VALUES (2586, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 02:00:38', '2021-02-19 02:00:38', 9, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:24:31', '', '2021-02-08 08:24:31', b'0'); -INSERT INTO `inf_job_log` VALUES (2587, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 02:00:40', '2021-02-19 02:00:40', 20, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:24:33', '', '2021-02-08 08:24:33', b'0'); -INSERT INTO `inf_job_log` VALUES (2588, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 02:00:42', '2021-02-19 02:00:42', 8, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:24:35', '', '2021-02-08 08:24:35', b'0'); -INSERT INTO `inf_job_log` VALUES (2589, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 02:01:00', '2021-02-19 02:01:00', 16, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:24:53', '', '2021-02-08 08:24:53', b'0'); -INSERT INTO `inf_job_log` VALUES (2590, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 02:01:02', '2021-02-19 02:01:02', 15, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:24:55', '', '2021-02-08 08:24:55', b'0'); -INSERT INTO `inf_job_log` VALUES (2591, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 02:01:04', '2021-02-19 02:01:04', 9, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:24:57', '', '2021-02-08 08:24:57', b'0'); -INSERT INTO `inf_job_log` VALUES (2592, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 02:01:06', '2021-02-19 02:01:06', 15, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:24:59', '', '2021-02-08 08:24:59', b'0'); -INSERT INTO `inf_job_log` VALUES (2593, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 02:02:00', '2021-02-19 02:02:00', 9, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:25:53', '', '2021-02-08 08:25:53', b'0'); -INSERT INTO `inf_job_log` VALUES (2594, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 02:02:02', '2021-02-19 02:02:02', 9, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:25:55', '', '2021-02-08 08:25:55', b'0'); -INSERT INTO `inf_job_log` VALUES (2595, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 02:36:00', '2021-02-19 02:36:00', 18, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:25:58', '', '2021-02-08 08:25:58', b'0'); -INSERT INTO `inf_job_log` VALUES (2596, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 02:36:02', '2021-02-19 02:36:02', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:26:00', '', '2021-02-08 08:26:00', b'0'); -INSERT INTO `inf_job_log` VALUES (2597, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 02:36:31', '2021-02-19 02:36:31', 12, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:26:29', '', '2021-02-08 08:26:29', b'0'); -INSERT INTO `inf_job_log` VALUES (2598, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 02:36:33', '2021-02-19 02:36:33', 8, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:26:31', '', '2021-02-08 08:26:31', b'0'); -INSERT INTO `inf_job_log` VALUES (2599, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 02:36:35', '2021-02-19 02:36:35', 8, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:26:33', '', '2021-02-08 08:26:33', b'0'); -INSERT INTO `inf_job_log` VALUES (2600, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 02:36:37', '2021-02-19 02:36:37', 7, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:26:35', '', '2021-02-08 08:26:35', b'0'); -INSERT INTO `inf_job_log` VALUES (2601, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 02:37:00', '2021-02-19 02:37:00', 9, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:26:58', '', '2021-02-08 08:26:58', b'0'); -INSERT INTO `inf_job_log` VALUES (2602, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 02:37:02', '2021-02-19 02:37:02', 114, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:27:00', '', '2021-02-08 08:27:00', b'0'); -INSERT INTO `inf_job_log` VALUES (2603, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 02:37:04', '2021-02-19 02:37:04', 50, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:27:02', '', '2021-02-08 08:27:02', b'0'); -INSERT INTO `inf_job_log` VALUES (2604, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 02:37:06', '2021-02-19 02:37:06', 34, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:27:04', '', '2021-02-08 08:27:04', b'0'); -INSERT INTO `inf_job_log` VALUES (2605, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 02:38:00', '2021-02-19 02:38:00', 7, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:27:58', '', '2021-02-08 08:27:58', b'0'); -INSERT INTO `inf_job_log` VALUES (2606, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 02:38:02', '2021-02-19 02:38:02', 8, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:28:00', '', '2021-02-08 08:28:00', b'0'); -INSERT INTO `inf_job_log` VALUES (2607, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 02:38:04', '2021-02-19 02:38:04', 9, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:28:02', '', '2021-02-08 08:28:02', b'0'); -INSERT INTO `inf_job_log` VALUES (2608, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 02:38:06', '2021-02-19 02:38:06', 8, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:28:04', '', '2021-02-08 08:28:04', b'0'); -INSERT INTO `inf_job_log` VALUES (2609, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 02:56:17', '2021-02-19 02:56:17', 9, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:28:29', '', '2021-02-08 08:28:29', b'0'); -INSERT INTO `inf_job_log` VALUES (2610, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 02:56:19', '2021-02-19 02:56:19', 9, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:28:31', '', '2021-02-08 08:28:31', b'0'); -INSERT INTO `inf_job_log` VALUES (2611, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 02:56:21', '2021-02-19 02:56:21', 9, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:28:33', '', '2021-02-08 08:28:33', b'0'); -INSERT INTO `inf_job_log` VALUES (2612, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 02:56:23', '2021-02-19 02:56:23', 8, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:28:35', '', '2021-02-08 08:28:35', b'0'); -INSERT INTO `inf_job_log` VALUES (2613, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 03:41:13', '2021-02-19 03:41:13', 13, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:29:29', '', '2021-02-08 08:29:29', b'0'); -INSERT INTO `inf_job_log` VALUES (2614, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 03:41:15', '2021-02-19 03:41:15', 9, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:29:31', '', '2021-02-08 08:29:31', b'0'); -INSERT INTO `inf_job_log` VALUES (2615, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 03:41:17', '2021-02-19 03:41:17', 12, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:29:33', '', '2021-02-08 08:29:33', b'0'); -INSERT INTO `inf_job_log` VALUES (2616, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 03:41:19', '2021-02-19 03:41:19', 10, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:29:35', '', '2021-02-08 08:29:35', b'0'); -INSERT INTO `inf_job_log` VALUES (2617, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 06:40:56', '2021-02-19 06:40:56', 24, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:30:16', '', '2021-02-08 08:30:16', b'0'); -INSERT INTO `inf_job_log` VALUES (2618, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 06:40:58', '2021-02-19 06:40:58', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:30:18', '', '2021-02-08 08:30:18', b'0'); -INSERT INTO `inf_job_log` VALUES (2619, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 06:41:00', '2021-02-19 06:41:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:30:20', '', '2021-02-08 08:30:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2620, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 06:41:02', '2021-02-19 06:41:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:30:22', '', '2021-02-08 08:30:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2621, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 06:41:09', '2021-02-19 06:41:09', 9, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:30:29', '', '2021-02-08 08:30:29', b'0'); -INSERT INTO `inf_job_log` VALUES (2622, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 06:41:11', '2021-02-19 06:41:11', 9, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:30:31', '', '2021-02-08 08:30:31', b'0'); -INSERT INTO `inf_job_log` VALUES (2623, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 06:41:13', '2021-02-19 06:41:13', 42, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:30:33', '', '2021-02-08 08:30:33', b'0'); -INSERT INTO `inf_job_log` VALUES (2624, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 06:41:15', '2021-02-19 06:41:15', 8, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:30:35', '', '2021-02-08 08:30:35', b'0'); -INSERT INTO `inf_job_log` VALUES (2625, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 06:50:52', '2021-02-19 06:50:52', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:31:20', '', '2021-02-08 08:31:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2626, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 06:50:54', '2021-02-19 06:50:54', 10, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:31:22', '', '2021-02-08 08:31:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2627, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 06:50:56', '2021-02-19 06:50:56', 8, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:31:24', '', '2021-02-08 08:31:24', b'0'); -INSERT INTO `inf_job_log` VALUES (2628, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 06:50:58', '2021-02-19 06:50:58', 8, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:31:26', '', '2021-02-08 08:31:26', b'0'); -INSERT INTO `inf_job_log` VALUES (2629, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 06:51:01', '2021-02-19 06:51:01', 8, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:31:29', '', '2021-02-08 08:31:29', b'0'); -INSERT INTO `inf_job_log` VALUES (2630, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 06:51:03', '2021-02-19 06:51:03', 8, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:31:31', '', '2021-02-08 08:31:31', b'0'); -INSERT INTO `inf_job_log` VALUES (2631, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 06:51:05', '2021-02-19 06:51:05', 8, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:31:33', '', '2021-02-08 08:31:33', b'0'); -INSERT INTO `inf_job_log` VALUES (2632, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 06:51:07', '2021-02-19 06:51:07', 8, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:31:35', '', '2021-02-08 08:31:35', b'0'); -INSERT INTO `inf_job_log` VALUES (2633, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 07:25:13', '2021-02-19 07:25:13', 11, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:32:29', '', '2021-02-08 08:32:29', b'0'); -INSERT INTO `inf_job_log` VALUES (2634, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 07:25:15', '2021-02-19 07:25:15', 8, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:32:31', '', '2021-02-08 08:32:31', b'0'); -INSERT INTO `inf_job_log` VALUES (2635, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 07:25:17', '2021-02-19 07:25:17', 9, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:32:33', '', '2021-02-08 08:32:33', b'0'); -INSERT INTO `inf_job_log` VALUES (2636, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 07:25:19', '2021-02-19 07:25:19', 9, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:32:35', '', '2021-02-08 08:32:35', b'0'); -INSERT INTO `inf_job_log` VALUES (2637, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 07:26:00', '2021-02-19 07:26:00', 11, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:33:16', '', '2021-02-08 08:33:16', b'0'); -INSERT INTO `inf_job_log` VALUES (2638, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 07:26:02', '2021-02-19 07:26:02', 8, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:33:18', '', '2021-02-08 08:33:18', b'0'); -INSERT INTO `inf_job_log` VALUES (2639, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 07:26:04', '2021-02-19 07:26:04', 9, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:33:20', '', '2021-02-08 08:33:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2640, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 07:26:06', '2021-02-19 07:26:06', 9, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:33:22', '', '2021-02-08 08:33:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2641, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 07:27:00', '2021-02-19 07:27:00', 16, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:34:16', '', '2021-02-08 08:34:16', b'0'); -INSERT INTO `inf_job_log` VALUES (2642, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 07:27:02', '2021-02-19 07:27:02', 9, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:34:18', '', '2021-02-08 08:34:18', b'0'); -INSERT INTO `inf_job_log` VALUES (2643, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 07:27:04', '2021-02-19 07:27:04', 7, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:34:20', '', '2021-02-08 08:34:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2644, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 07:27:06', '2021-02-19 07:27:06', 8, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:34:22', '', '2021-02-08 08:34:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2645, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 07:28:14', '2021-02-19 07:28:14', 15, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:35:16', '', '2021-02-08 08:35:16', b'0'); -INSERT INTO `inf_job_log` VALUES (2646, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 07:28:16', '2021-02-19 07:28:16', 9, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:35:18', '', '2021-02-08 08:35:18', b'0'); -INSERT INTO `inf_job_log` VALUES (2647, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 07:28:18', '2021-02-19 07:28:18', 9, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:35:20', '', '2021-02-08 08:35:20', b'0'); -INSERT INTO `inf_job_log` VALUES (2648, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 07:28:20', '2021-02-19 07:28:20', 10, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:35:22', '', '2021-02-08 08:35:22', b'0'); -INSERT INTO `inf_job_log` VALUES (2649, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 08:30:50', '2021-02-19 08:30:50', 15, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:36:30', '', '2021-02-08 08:36:30', b'0'); -INSERT INTO `inf_job_log` VALUES (2650, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 08:30:52', '2021-02-19 08:30:52', 11, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:36:32', '', '2021-02-08 08:36:32', b'0'); -INSERT INTO `inf_job_log` VALUES (2651, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 08:30:54', '2021-02-19 08:30:54', 9, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:36:34', '', '2021-02-08 08:36:34', b'0'); -INSERT INTO `inf_job_log` VALUES (2652, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 08:30:56', '2021-02-19 08:30:56', 11, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:36:36', '', '2021-02-08 08:36:36', b'0'); -INSERT INTO `inf_job_log` VALUES (2653, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 08:31:00', '2021-02-19 08:31:00', 9, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:36:39', '', '2021-02-08 08:36:39', b'0'); -INSERT INTO `inf_job_log` VALUES (2654, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 08:31:02', '2021-02-19 08:31:02', 8, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:36:41', '', '2021-02-08 08:36:41', b'0'); -INSERT INTO `inf_job_log` VALUES (2655, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 08:31:04', '2021-02-19 08:31:04', 8, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:36:44', '', '2021-02-08 08:36:44', b'0'); -INSERT INTO `inf_job_log` VALUES (2656, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 08:31:06', '2021-02-19 08:31:06', 8, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:36:46', '', '2021-02-08 08:36:46', b'0'); -INSERT INTO `inf_job_log` VALUES (2657, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 08:32:00', '2021-02-19 08:32:00', 8, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:37:40', '', '2021-02-08 08:37:40', b'0'); -INSERT INTO `inf_job_log` VALUES (2658, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 08:32:02', '2021-02-19 08:32:02', 11, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:37:42', '', '2021-02-08 08:37:42', b'0'); -INSERT INTO `inf_job_log` VALUES (2659, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 08:32:04', '2021-02-19 08:32:04', 7, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:37:44', '', '2021-02-08 08:37:44', b'0'); -INSERT INTO `inf_job_log` VALUES (2660, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 08:32:06', '2021-02-19 08:32:06', 7, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:37:46', '', '2021-02-08 08:37:46', b'0'); -INSERT INTO `inf_job_log` VALUES (2661, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 08:33:00', '2021-02-19 08:33:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:38:40', '', '2021-02-08 08:38:40', b'0'); -INSERT INTO `inf_job_log` VALUES (2662, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 08:33:02', '2021-02-19 08:33:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:38:42', '', '2021-02-08 08:38:42', b'0'); -INSERT INTO `inf_job_log` VALUES (2663, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 08:33:04', '2021-02-19 08:33:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:38:44', '', '2021-02-08 08:38:44', b'0'); -INSERT INTO `inf_job_log` VALUES (2664, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 08:33:06', '2021-02-19 08:33:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:38:46', '', '2021-02-08 08:38:46', b'0'); -INSERT INTO `inf_job_log` VALUES (2665, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 08:34:00', '2021-02-19 08:34:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:39:40', '', '2021-02-08 08:39:40', b'0'); -INSERT INTO `inf_job_log` VALUES (2666, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 08:34:02', '2021-02-19 08:34:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:39:42', '', '2021-02-08 08:39:42', b'0'); -INSERT INTO `inf_job_log` VALUES (2667, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 08:34:04', '2021-02-19 08:34:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:39:44', '', '2021-02-08 08:39:44', b'0'); -INSERT INTO `inf_job_log` VALUES (2668, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 08:34:06', '2021-02-19 08:34:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:39:46', '', '2021-02-08 08:39:46', b'0'); -INSERT INTO `inf_job_log` VALUES (2669, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 08:35:00', '2021-02-19 08:35:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:40:40', '', '2021-02-08 08:40:40', b'0'); -INSERT INTO `inf_job_log` VALUES (2670, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 08:35:02', '2021-02-19 08:35:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:40:42', '', '2021-02-08 08:40:42', b'0'); -INSERT INTO `inf_job_log` VALUES (2671, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 08:35:04', '2021-02-19 08:35:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:40:44', '', '2021-02-08 08:40:44', b'0'); -INSERT INTO `inf_job_log` VALUES (2672, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 08:35:06', '2021-02-19 08:35:06', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:40:46', '', '2021-02-08 08:40:46', b'0'); -INSERT INTO `inf_job_log` VALUES (2673, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 08:36:00', '2021-02-19 08:36:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:41:40', '', '2021-02-08 08:41:40', b'0'); -INSERT INTO `inf_job_log` VALUES (2674, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 08:36:02', '2021-02-19 08:36:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:41:42', '', '2021-02-08 08:41:42', b'0'); -INSERT INTO `inf_job_log` VALUES (2675, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 08:36:04', '2021-02-19 08:36:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:41:44', '', '2021-02-08 08:41:44', b'0'); -INSERT INTO `inf_job_log` VALUES (2676, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 08:36:06', '2021-02-19 08:36:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:41:46', '', '2021-02-08 08:41:46', b'0'); -INSERT INTO `inf_job_log` VALUES (2677, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 08:37:00', '2021-02-19 08:37:00', 1, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:42:40', '', '2021-02-08 08:42:40', b'0'); -INSERT INTO `inf_job_log` VALUES (2678, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 08:37:02', '2021-02-19 08:37:02', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:42:42', '', '2021-02-08 08:42:42', b'0'); -INSERT INTO `inf_job_log` VALUES (2679, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 08:37:04', '2021-02-19 08:37:04', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:42:44', '', '2021-02-08 08:42:44', b'0'); -INSERT INTO `inf_job_log` VALUES (2680, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 08:37:06', '2021-02-19 08:37:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:42:46', '', '2021-02-08 08:42:46', b'0'); -INSERT INTO `inf_job_log` VALUES (2681, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 08:38:00', '2021-02-19 08:38:00', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:43:40', '', '2021-02-08 08:43:40', b'0'); -INSERT INTO `inf_job_log` VALUES (2682, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 08:38:02', '2021-02-19 08:38:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:43:42', '', '2021-02-08 08:43:42', b'0'); -INSERT INTO `inf_job_log` VALUES (2683, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 08:38:04', '2021-02-19 08:38:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:43:44', '', '2021-02-08 08:43:44', b'0'); -INSERT INTO `inf_job_log` VALUES (2684, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 08:38:06', '2021-02-19 08:38:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:43:46', '', '2021-02-08 08:43:46', b'0'); -INSERT INTO `inf_job_log` VALUES (2685, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 08:39:00', '2021-02-19 08:39:00', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:44:40', '', '2021-02-08 08:44:40', b'0'); -INSERT INTO `inf_job_log` VALUES (2686, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 08:39:02', '2021-02-19 08:39:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:44:42', '', '2021-02-08 08:44:42', b'0'); -INSERT INTO `inf_job_log` VALUES (2687, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 08:39:04', '2021-02-19 08:39:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:44:44', '', '2021-02-08 08:44:44', b'0'); -INSERT INTO `inf_job_log` VALUES (2688, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 08:39:06', '2021-02-19 08:39:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:44:46', '', '2021-02-08 08:44:46', b'0'); -INSERT INTO `inf_job_log` VALUES (2689, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 08:40:00', '2021-02-19 08:40:00', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:45:40', '', '2021-02-08 08:45:40', b'0'); -INSERT INTO `inf_job_log` VALUES (2690, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 08:40:02', '2021-02-19 08:40:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:45:42', '', '2021-02-08 08:45:42', b'0'); -INSERT INTO `inf_job_log` VALUES (2691, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 08:40:04', '2021-02-19 08:40:04', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:45:44', '', '2021-02-08 08:45:44', b'0'); -INSERT INTO `inf_job_log` VALUES (2692, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 08:40:06', '2021-02-19 08:40:06', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:45:46', '', '2021-02-08 08:45:46', b'0'); -INSERT INTO `inf_job_log` VALUES (2693, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 08:41:00', '2021-02-19 08:41:00', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:46:40', '', '2021-02-08 08:46:40', b'0'); -INSERT INTO `inf_job_log` VALUES (2694, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 08:41:02', '2021-02-19 08:41:02', 6, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:46:42', '', '2021-02-08 08:46:42', b'0'); -INSERT INTO `inf_job_log` VALUES (2695, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 08:41:04', '2021-02-19 08:41:04', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:46:44', '', '2021-02-08 08:46:44', b'0'); -INSERT INTO `inf_job_log` VALUES (2696, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 08:41:06', '2021-02-19 08:41:06', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:46:46', '', '2021-02-08 08:46:46', b'0'); -INSERT INTO `inf_job_log` VALUES (2697, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 08:42:00', '2021-02-19 08:42:00', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:47:40', '', '2021-02-08 08:47:40', b'0'); -INSERT INTO `inf_job_log` VALUES (2698, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 08:42:02', '2021-02-19 08:42:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:47:42', '', '2021-02-08 08:47:42', b'0'); -INSERT INTO `inf_job_log` VALUES (2699, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 08:42:04', '2021-02-19 08:42:04', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:47:44', '', '2021-02-08 08:47:44', b'0'); -INSERT INTO `inf_job_log` VALUES (2700, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 08:42:06', '2021-02-19 08:42:06', 6, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:47:46', '', '2021-02-08 08:47:46', b'0'); -INSERT INTO `inf_job_log` VALUES (2701, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 08:43:00', '2021-02-19 08:43:00', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:48:40', '', '2021-02-08 08:48:40', b'0'); -INSERT INTO `inf_job_log` VALUES (2702, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 08:43:02', '2021-02-19 08:43:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:48:42', '', '2021-02-08 08:48:42', b'0'); -INSERT INTO `inf_job_log` VALUES (2703, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 08:43:04', '2021-02-19 08:43:04', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:48:44', '', '2021-02-08 08:48:44', b'0'); -INSERT INTO `inf_job_log` VALUES (2704, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 08:43:06', '2021-02-19 08:43:06', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:48:46', '', '2021-02-08 08:48:46', b'0'); -INSERT INTO `inf_job_log` VALUES (2705, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 08:44:00', '2021-02-19 08:44:00', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:49:40', '', '2021-02-08 08:49:40', b'0'); -INSERT INTO `inf_job_log` VALUES (2706, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 08:44:02', '2021-02-19 08:44:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:49:42', '', '2021-02-08 08:49:42', b'0'); -INSERT INTO `inf_job_log` VALUES (2707, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 08:44:04', '2021-02-19 08:44:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:49:44', '', '2021-02-08 08:49:44', b'0'); -INSERT INTO `inf_job_log` VALUES (2708, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 08:44:06', '2021-02-19 08:44:06', 6, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:49:46', '', '2021-02-08 08:49:46', b'0'); -INSERT INTO `inf_job_log` VALUES (2709, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 08:45:00', '2021-02-19 08:45:00', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:50:40', '', '2021-02-08 08:50:40', b'0'); -INSERT INTO `inf_job_log` VALUES (2710, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 08:45:02', '2021-02-19 08:45:02', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:50:42', '', '2021-02-08 08:50:42', b'0'); -INSERT INTO `inf_job_log` VALUES (2711, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 08:45:04', '2021-02-19 08:45:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:50:44', '', '2021-02-08 08:50:44', b'0'); -INSERT INTO `inf_job_log` VALUES (2712, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 08:45:06', '2021-02-19 08:45:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:50:46', '', '2021-02-08 08:50:46', b'0'); -INSERT INTO `inf_job_log` VALUES (2713, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 08:46:00', '2021-02-19 08:46:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:51:40', '', '2021-02-08 08:51:40', b'0'); -INSERT INTO `inf_job_log` VALUES (2714, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 08:46:02', '2021-02-19 08:46:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:51:42', '', '2021-02-08 08:51:42', b'0'); -INSERT INTO `inf_job_log` VALUES (2715, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 08:46:04', '2021-02-19 08:46:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:51:44', '', '2021-02-08 08:51:44', b'0'); -INSERT INTO `inf_job_log` VALUES (2716, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 08:46:06', '2021-02-19 08:46:06', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:51:47', '', '2021-02-08 08:51:47', b'0'); -INSERT INTO `inf_job_log` VALUES (2717, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 08:47:00', '2021-02-19 08:47:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:52:41', '', '2021-02-08 08:52:41', b'0'); -INSERT INTO `inf_job_log` VALUES (2718, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 08:47:02', '2021-02-19 08:47:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:52:43', '', '2021-02-08 08:52:43', b'0'); -INSERT INTO `inf_job_log` VALUES (2719, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 08:47:04', '2021-02-19 08:47:04', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:52:45', '', '2021-02-08 08:52:45', b'0'); -INSERT INTO `inf_job_log` VALUES (2720, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 08:47:06', '2021-02-19 08:47:06', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:52:47', '', '2021-02-08 08:52:47', b'0'); -INSERT INTO `inf_job_log` VALUES (2721, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 08:48:00', '2021-02-19 08:48:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:53:41', '', '2021-02-08 08:53:41', b'0'); -INSERT INTO `inf_job_log` VALUES (2722, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 08:48:02', '2021-02-19 08:48:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:53:43', '', '2021-02-08 08:53:43', b'0'); -INSERT INTO `inf_job_log` VALUES (2723, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 08:48:04', '2021-02-19 08:48:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:53:45', '', '2021-02-08 08:53:45', b'0'); -INSERT INTO `inf_job_log` VALUES (2724, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 08:48:06', '2021-02-19 08:48:06', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:53:47', '', '2021-02-08 08:53:47', b'0'); -INSERT INTO `inf_job_log` VALUES (2725, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 08:49:00', '2021-02-19 08:49:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:54:41', '', '2021-02-08 08:54:41', b'0'); -INSERT INTO `inf_job_log` VALUES (2726, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 08:49:02', '2021-02-19 08:49:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:54:43', '', '2021-02-08 08:54:43', b'0'); -INSERT INTO `inf_job_log` VALUES (2727, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 08:49:04', '2021-02-19 08:49:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:54:45', '', '2021-02-08 08:54:45', b'0'); -INSERT INTO `inf_job_log` VALUES (2728, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 08:49:06', '2021-02-19 08:49:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:54:47', '', '2021-02-08 08:54:47', b'0'); -INSERT INTO `inf_job_log` VALUES (2729, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 08:50:00', '2021-02-19 08:50:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:55:41', '', '2021-02-08 08:55:41', b'0'); -INSERT INTO `inf_job_log` VALUES (2730, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 08:50:02', '2021-02-19 08:50:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:55:43', '', '2021-02-08 08:55:43', b'0'); -INSERT INTO `inf_job_log` VALUES (2731, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 08:50:04', '2021-02-19 08:50:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:55:45', '', '2021-02-08 08:55:45', b'0'); -INSERT INTO `inf_job_log` VALUES (2732, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 08:50:06', '2021-02-19 08:50:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:55:47', '', '2021-02-08 08:55:47', b'0'); -INSERT INTO `inf_job_log` VALUES (2733, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 08:51:00', '2021-02-19 08:51:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:56:41', '', '2021-02-08 08:56:41', b'0'); -INSERT INTO `inf_job_log` VALUES (2734, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 08:51:02', '2021-02-19 08:51:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:56:43', '', '2021-02-08 08:56:43', b'0'); -INSERT INTO `inf_job_log` VALUES (2735, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 08:51:04', '2021-02-19 08:51:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:56:45', '', '2021-02-08 08:56:45', b'0'); -INSERT INTO `inf_job_log` VALUES (2736, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 08:51:06', '2021-02-19 08:51:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:56:47', '', '2021-02-08 08:56:47', b'0'); -INSERT INTO `inf_job_log` VALUES (2737, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 08:52:00', '2021-02-19 08:52:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:57:41', '', '2021-02-08 08:57:41', b'0'); -INSERT INTO `inf_job_log` VALUES (2738, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 08:52:02', '2021-02-19 08:52:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:57:43', '', '2021-02-08 08:57:43', b'0'); -INSERT INTO `inf_job_log` VALUES (2739, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 08:52:04', '2021-02-19 08:52:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:57:45', '', '2021-02-08 08:57:45', b'0'); -INSERT INTO `inf_job_log` VALUES (2740, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 08:52:06', '2021-02-19 08:52:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:57:47', '', '2021-02-08 08:57:47', b'0'); -INSERT INTO `inf_job_log` VALUES (2741, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 08:53:00', '2021-02-19 08:53:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:58:41', '', '2021-02-08 08:58:41', b'0'); -INSERT INTO `inf_job_log` VALUES (2742, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 08:53:02', '2021-02-19 08:53:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:58:43', '', '2021-02-08 08:58:43', b'0'); -INSERT INTO `inf_job_log` VALUES (2743, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 08:53:04', '2021-02-19 08:53:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:58:45', '', '2021-02-08 08:58:45', b'0'); -INSERT INTO `inf_job_log` VALUES (2744, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 08:53:06', '2021-02-19 08:53:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:58:47', '', '2021-02-08 08:58:47', b'0'); -INSERT INTO `inf_job_log` VALUES (2745, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 08:54:00', '2021-02-19 08:54:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:59:41', '', '2021-02-08 08:59:41', b'0'); -INSERT INTO `inf_job_log` VALUES (2746, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 08:54:02', '2021-02-19 08:54:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:59:43', '', '2021-02-08 08:59:43', b'0'); -INSERT INTO `inf_job_log` VALUES (2747, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 08:54:04', '2021-02-19 08:54:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:59:45', '', '2021-02-08 08:59:45', b'0'); -INSERT INTO `inf_job_log` VALUES (2748, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 08:54:06', '2021-02-19 08:54:06', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 08:59:47', '', '2021-02-08 08:59:47', b'0'); -INSERT INTO `inf_job_log` VALUES (2749, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 08:55:00', '2021-02-19 08:55:00', 8, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:00:41', '', '2021-02-08 09:00:41', b'0'); -INSERT INTO `inf_job_log` VALUES (2750, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 08:55:02', '2021-02-19 08:55:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:00:43', '', '2021-02-08 09:00:43', b'0'); -INSERT INTO `inf_job_log` VALUES (2751, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 08:55:04', '2021-02-19 08:55:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:00:45', '', '2021-02-08 09:00:45', b'0'); -INSERT INTO `inf_job_log` VALUES (2752, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 08:55:06', '2021-02-19 08:55:06', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:00:47', '', '2021-02-08 09:00:47', b'0'); -INSERT INTO `inf_job_log` VALUES (2753, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 09:05:42', '2021-02-19 09:05:42', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:01:31', '', '2021-02-08 09:01:31', b'0'); -INSERT INTO `inf_job_log` VALUES (2754, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 09:05:44', '2021-02-19 09:05:44', 9, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:01:33', '', '2021-02-08 09:01:33', b'0'); -INSERT INTO `inf_job_log` VALUES (2755, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 09:05:46', '2021-02-19 09:05:46', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:01:35', '', '2021-02-08 09:01:35', b'0'); -INSERT INTO `inf_job_log` VALUES (2756, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 09:05:48', '2021-02-19 09:05:48', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:01:37', '', '2021-02-08 09:01:37', b'0'); -INSERT INTO `inf_job_log` VALUES (2757, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 09:06:00', '2021-02-19 09:06:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:01:49', '', '2021-02-08 09:01:49', b'0'); -INSERT INTO `inf_job_log` VALUES (2758, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 09:06:02', '2021-02-19 09:06:02', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:01:51', '', '2021-02-08 09:01:51', b'0'); -INSERT INTO `inf_job_log` VALUES (2759, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 09:06:04', '2021-02-19 09:06:04', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:01:53', '', '2021-02-08 09:01:53', b'0'); -INSERT INTO `inf_job_log` VALUES (2760, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 09:06:06', '2021-02-19 09:06:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:01:55', '', '2021-02-08 09:01:55', b'0'); -INSERT INTO `inf_job_log` VALUES (2761, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 09:07:00', '2021-02-19 09:07:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:02:49', '', '2021-02-08 09:02:49', b'0'); -INSERT INTO `inf_job_log` VALUES (2762, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 09:07:02', '2021-02-19 09:07:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:02:51', '', '2021-02-08 09:02:51', b'0'); -INSERT INTO `inf_job_log` VALUES (2763, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 09:07:04', '2021-02-19 09:07:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:02:53', '', '2021-02-08 09:02:53', b'0'); -INSERT INTO `inf_job_log` VALUES (2764, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 09:07:06', '2021-02-19 09:07:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:02:55', '', '2021-02-08 09:02:55', b'0'); -INSERT INTO `inf_job_log` VALUES (2765, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 09:08:00', '2021-02-19 09:08:00', 6, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:03:49', '', '2021-02-08 09:03:49', b'0'); -INSERT INTO `inf_job_log` VALUES (2766, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 09:08:02', '2021-02-19 09:08:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:03:51', '', '2021-02-08 09:03:51', b'0'); -INSERT INTO `inf_job_log` VALUES (2767, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 09:08:04', '2021-02-19 09:08:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:03:53', '', '2021-02-08 09:03:53', b'0'); -INSERT INTO `inf_job_log` VALUES (2768, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 09:08:06', '2021-02-19 09:08:06', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:03:55', '', '2021-02-08 09:03:55', b'0'); -INSERT INTO `inf_job_log` VALUES (2769, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 09:09:00', '2021-02-19 09:09:00', 6, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:04:49', '', '2021-02-08 09:04:49', b'0'); -INSERT INTO `inf_job_log` VALUES (2770, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 09:09:02', '2021-02-19 09:09:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:04:51', '', '2021-02-08 09:04:51', b'0'); -INSERT INTO `inf_job_log` VALUES (2771, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 09:09:04', '2021-02-19 09:09:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:04:53', '', '2021-02-08 09:04:53', b'0'); -INSERT INTO `inf_job_log` VALUES (2772, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 09:09:06', '2021-02-19 09:09:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:04:55', '', '2021-02-08 09:04:55', b'0'); -INSERT INTO `inf_job_log` VALUES (2773, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 09:10:00', '2021-02-19 09:10:00', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:05:49', '', '2021-02-08 09:05:49', b'0'); -INSERT INTO `inf_job_log` VALUES (2774, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 09:10:02', '2021-02-19 09:10:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:05:51', '', '2021-02-08 09:05:51', b'0'); -INSERT INTO `inf_job_log` VALUES (2775, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 09:10:04', '2021-02-19 09:10:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:05:53', '', '2021-02-08 09:05:53', b'0'); -INSERT INTO `inf_job_log` VALUES (2776, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 09:10:06', '2021-02-19 09:10:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:05:55', '', '2021-02-08 09:05:55', b'0'); -INSERT INTO `inf_job_log` VALUES (2777, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 09:11:00', '2021-02-19 09:11:00', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:06:49', '', '2021-02-08 09:06:49', b'0'); -INSERT INTO `inf_job_log` VALUES (2778, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 09:11:02', '2021-02-19 09:11:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:06:51', '', '2021-02-08 09:06:51', b'0'); -INSERT INTO `inf_job_log` VALUES (2779, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 09:11:04', '2021-02-19 09:11:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:06:53', '', '2021-02-08 09:06:53', b'0'); -INSERT INTO `inf_job_log` VALUES (2780, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 09:11:06', '2021-02-19 09:11:06', 6, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:06:55', '', '2021-02-08 09:06:55', b'0'); -INSERT INTO `inf_job_log` VALUES (2781, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 09:12:00', '2021-02-19 09:12:00', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:07:49', '', '2021-02-08 09:07:49', b'0'); -INSERT INTO `inf_job_log` VALUES (2782, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 09:12:02', '2021-02-19 09:12:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:07:51', '', '2021-02-08 09:07:51', b'0'); -INSERT INTO `inf_job_log` VALUES (2783, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 09:12:04', '2021-02-19 09:12:04', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:07:53', '', '2021-02-08 09:07:53', b'0'); -INSERT INTO `inf_job_log` VALUES (2784, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 09:12:06', '2021-02-19 09:12:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:07:55', '', '2021-02-08 09:07:55', b'0'); -INSERT INTO `inf_job_log` VALUES (2785, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 09:13:00', '2021-02-19 09:13:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:08:49', '', '2021-02-08 09:08:49', b'0'); -INSERT INTO `inf_job_log` VALUES (2786, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 09:13:02', '2021-02-19 09:13:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:08:51', '', '2021-02-08 09:08:51', b'0'); -INSERT INTO `inf_job_log` VALUES (2787, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 09:13:04', '2021-02-19 09:13:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:08:53', '', '2021-02-08 09:08:53', b'0'); -INSERT INTO `inf_job_log` VALUES (2788, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 09:13:06', '2021-02-19 09:13:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:08:56', '', '2021-02-08 09:08:56', b'0'); -INSERT INTO `inf_job_log` VALUES (2789, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 09:14:00', '2021-02-19 09:14:00', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:09:35', '', '2021-02-08 09:09:35', b'0'); -INSERT INTO `inf_job_log` VALUES (2790, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 09:14:02', '2021-02-19 09:14:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:09:37', '', '2021-02-08 09:09:37', b'0'); -INSERT INTO `inf_job_log` VALUES (2791, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 09:14:04', '2021-02-19 09:14:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:09:39', '', '2021-02-08 09:09:39', b'0'); -INSERT INTO `inf_job_log` VALUES (2792, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 09:14:06', '2021-02-19 09:14:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:09:41', '', '2021-02-08 09:09:41', b'0'); -INSERT INTO `inf_job_log` VALUES (2793, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 09:15:00', '2021-02-19 09:15:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:10:35', '', '2021-02-08 09:10:35', b'0'); -INSERT INTO `inf_job_log` VALUES (2794, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 09:15:02', '2021-02-19 09:15:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:10:37', '', '2021-02-08 09:10:37', b'0'); -INSERT INTO `inf_job_log` VALUES (2795, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 09:39:02', '2021-02-19 09:39:02', 58, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:34:39', '', '2021-02-08 09:34:39', b'0'); -INSERT INTO `inf_job_log` VALUES (2796, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 09:39:04', '2021-02-19 09:39:04', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:34:41', '', '2021-02-08 09:34:41', b'0'); -INSERT INTO `inf_job_log` VALUES (2797, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 09:39:06', '2021-02-19 09:39:06', 6, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:34:43', '', '2021-02-08 09:34:43', b'0'); -INSERT INTO `inf_job_log` VALUES (2798, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 09:39:08', '2021-02-19 09:39:08', 8, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:34:45', '', '2021-02-08 09:34:45', b'0'); -INSERT INTO `inf_job_log` VALUES (2799, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 09:40:00', '2021-02-19 09:40:00', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:35:37', '', '2021-02-08 09:35:37', b'0'); -INSERT INTO `inf_job_log` VALUES (2800, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 09:40:02', '2021-02-19 09:40:02', 17, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:35:39', '', '2021-02-08 09:35:39', b'0'); -INSERT INTO `inf_job_log` VALUES (2801, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 09:40:04', '2021-02-19 09:40:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:35:41', '', '2021-02-08 09:35:41', b'0'); -INSERT INTO `inf_job_log` VALUES (2802, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 09:40:06', '2021-02-19 09:40:06', 8, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:35:43', '', '2021-02-08 09:35:43', b'0'); -INSERT INTO `inf_job_log` VALUES (2803, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 09:41:00', '2021-02-19 09:41:00', 6, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:36:37', '', '2021-02-08 09:36:37', b'0'); -INSERT INTO `inf_job_log` VALUES (2804, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 09:41:02', '2021-02-19 09:41:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:36:39', '', '2021-02-08 09:36:39', b'0'); -INSERT INTO `inf_job_log` VALUES (2805, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 09:41:04', '2021-02-19 09:41:04', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:36:41', '', '2021-02-08 09:36:41', b'0'); -INSERT INTO `inf_job_log` VALUES (2806, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 09:41:06', '2021-02-19 09:41:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:36:43', '', '2021-02-08 09:36:43', b'0'); -INSERT INTO `inf_job_log` VALUES (2807, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 09:42:00', '2021-02-19 09:42:00', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:37:37', '', '2021-02-08 09:37:37', b'0'); -INSERT INTO `inf_job_log` VALUES (2808, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 09:42:02', '2021-02-19 09:42:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:37:39', '', '2021-02-08 09:37:39', b'0'); -INSERT INTO `inf_job_log` VALUES (2809, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 09:42:04', '2021-02-19 09:42:04', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:37:41', '', '2021-02-08 09:37:41', b'0'); -INSERT INTO `inf_job_log` VALUES (2810, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 09:42:06', '2021-02-19 09:42:06', 8, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:37:43', '', '2021-02-08 09:37:43', b'0'); -INSERT INTO `inf_job_log` VALUES (2811, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 09:43:00', '2021-02-19 09:43:00', 6, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:38:37', '', '2021-02-08 09:38:37', b'0'); -INSERT INTO `inf_job_log` VALUES (2812, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 09:43:02', '2021-02-19 09:43:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:38:39', '', '2021-02-08 09:38:39', b'0'); -INSERT INTO `inf_job_log` VALUES (2813, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 09:43:04', '2021-02-19 09:43:04', 17, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:38:41', '', '2021-02-08 09:38:41', b'0'); -INSERT INTO `inf_job_log` VALUES (2814, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 09:43:06', '2021-02-19 09:43:06', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:38:43', '', '2021-02-08 09:38:43', b'0'); -INSERT INTO `inf_job_log` VALUES (2815, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 09:44:00', '2021-02-19 09:44:00', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:39:37', '', '2021-02-08 09:39:37', b'0'); -INSERT INTO `inf_job_log` VALUES (2816, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 09:44:02', '2021-02-19 09:44:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:39:39', '', '2021-02-08 09:39:39', b'0'); -INSERT INTO `inf_job_log` VALUES (2817, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 09:44:04', '2021-02-19 09:44:04', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:39:41', '', '2021-02-08 09:39:41', b'0'); -INSERT INTO `inf_job_log` VALUES (2818, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 09:44:06', '2021-02-19 09:44:06', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:39:43', '', '2021-02-08 09:39:43', b'0'); -INSERT INTO `inf_job_log` VALUES (2819, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 09:45:00', '2021-02-19 09:45:00', 9, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:40:37', '', '2021-02-08 09:40:37', b'0'); -INSERT INTO `inf_job_log` VALUES (2820, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 09:45:02', '2021-02-19 09:45:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:40:39', '', '2021-02-08 09:40:39', b'0'); -INSERT INTO `inf_job_log` VALUES (2821, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 09:45:04', '2021-02-19 09:45:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:40:41', '', '2021-02-08 09:40:41', b'0'); -INSERT INTO `inf_job_log` VALUES (2822, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 09:45:06', '2021-02-19 09:45:06', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:40:43', '', '2021-02-08 09:40:43', b'0'); -INSERT INTO `inf_job_log` VALUES (2823, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 09:46:00', '2021-02-19 09:46:00', 6, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:41:37', '', '2021-02-08 09:41:37', b'0'); -INSERT INTO `inf_job_log` VALUES (2824, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 09:46:02', '2021-02-19 09:46:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:41:39', '', '2021-02-08 09:41:39', b'0'); -INSERT INTO `inf_job_log` VALUES (2825, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 09:46:04', '2021-02-19 09:46:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:41:41', '', '2021-02-08 09:41:41', b'0'); -INSERT INTO `inf_job_log` VALUES (2826, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 09:46:06', '2021-02-19 09:46:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:41:43', '', '2021-02-08 09:41:43', b'0'); -INSERT INTO `inf_job_log` VALUES (2827, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 09:47:00', '2021-02-19 09:47:00', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:42:37', '', '2021-02-08 09:42:37', b'0'); -INSERT INTO `inf_job_log` VALUES (2828, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 09:47:02', '2021-02-19 09:47:02', 8, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:42:39', '', '2021-02-08 09:42:39', b'0'); -INSERT INTO `inf_job_log` VALUES (2829, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 09:47:04', '2021-02-19 09:47:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:42:41', '', '2021-02-08 09:42:41', b'0'); -INSERT INTO `inf_job_log` VALUES (2830, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 09:47:06', '2021-02-19 09:47:06', 6, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:42:43', '', '2021-02-08 09:42:43', b'0'); -INSERT INTO `inf_job_log` VALUES (2831, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 09:48:00', '2021-02-19 09:48:00', 9, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:43:37', '', '2021-02-08 09:43:37', b'0'); -INSERT INTO `inf_job_log` VALUES (2832, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 09:48:02', '2021-02-19 09:48:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:43:39', '', '2021-02-08 09:43:39', b'0'); -INSERT INTO `inf_job_log` VALUES (2833, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 09:48:04', '2021-02-19 09:48:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:43:41', '', '2021-02-08 09:43:41', b'0'); -INSERT INTO `inf_job_log` VALUES (2834, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 09:48:06', '2021-02-19 09:48:06', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:43:43', '', '2021-02-08 09:43:43', b'0'); -INSERT INTO `inf_job_log` VALUES (2835, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 09:55:37', '2021-02-19 09:55:37', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:44:37', '', '2021-02-08 09:44:37', b'0'); -INSERT INTO `inf_job_log` VALUES (2836, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 09:55:39', '2021-02-19 09:55:39', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:44:39', '', '2021-02-08 09:44:39', b'0'); -INSERT INTO `inf_job_log` VALUES (2837, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 09:55:41', '2021-02-19 09:55:41', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:44:41', '', '2021-02-08 09:44:41', b'0'); -INSERT INTO `inf_job_log` VALUES (2838, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 09:55:43', '2021-02-19 09:55:43', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:44:43', '', '2021-02-08 09:44:43', b'0'); -INSERT INTO `inf_job_log` VALUES (2839, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 09:56:39', '2021-02-19 09:56:39', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:45:39', '', '2021-02-08 09:45:39', b'0'); -INSERT INTO `inf_job_log` VALUES (2840, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 09:56:41', '2021-02-19 09:56:41', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:45:41', '', '2021-02-08 09:45:41', b'0'); -INSERT INTO `inf_job_log` VALUES (2841, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 09:56:43', '2021-02-19 09:56:43', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:45:43', '', '2021-02-08 09:45:43', b'0'); -INSERT INTO `inf_job_log` VALUES (2842, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 09:56:45', '2021-02-19 09:56:45', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:45:45', '', '2021-02-08 09:45:45', b'0'); -INSERT INTO `inf_job_log` VALUES (2843, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 09:57:00', '2021-02-19 09:57:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:46:01', '', '2021-02-08 09:46:01', b'0'); -INSERT INTO `inf_job_log` VALUES (2844, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 09:57:02', '2021-02-19 09:57:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:46:03', '', '2021-02-08 09:46:03', b'0'); -INSERT INTO `inf_job_log` VALUES (2845, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 09:57:04', '2021-02-19 09:57:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:46:05', '', '2021-02-08 09:46:05', b'0'); -INSERT INTO `inf_job_log` VALUES (2846, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 09:57:06', '2021-02-19 09:57:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:46:07', '', '2021-02-08 09:46:07', b'0'); -INSERT INTO `inf_job_log` VALUES (2847, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 09:58:00', '2021-02-19 09:58:00', 9, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:47:01', '', '2021-02-08 09:47:01', b'0'); -INSERT INTO `inf_job_log` VALUES (2848, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 09:58:02', '2021-02-19 09:58:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:47:03', '', '2021-02-08 09:47:03', b'0'); -INSERT INTO `inf_job_log` VALUES (2849, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 09:58:04', '2021-02-19 09:58:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:47:05', '', '2021-02-08 09:47:05', b'0'); -INSERT INTO `inf_job_log` VALUES (2850, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 09:58:06', '2021-02-19 09:58:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:47:07', '', '2021-02-08 09:47:07', b'0'); -INSERT INTO `inf_job_log` VALUES (2851, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 09:59:00', '2021-02-19 09:59:00', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:48:01', '', '2021-02-08 09:48:01', b'0'); -INSERT INTO `inf_job_log` VALUES (2852, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 09:59:02', '2021-02-19 09:59:02', 178, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:48:03', '', '2021-02-08 09:48:03', b'0'); -INSERT INTO `inf_job_log` VALUES (2853, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 12:59:06', '2021-02-19 12:59:06', 21, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:48:06', '', '2021-02-08 09:48:06', b'0'); -INSERT INTO `inf_job_log` VALUES (2854, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 12:59:08', '2021-02-19 12:59:08', 14, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:48:08', '', '2021-02-08 09:48:08', b'0'); -INSERT INTO `inf_job_log` VALUES (2855, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 18:18:07', '2021-02-19 18:18:07', 99, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:49:32', '', '2021-02-08 09:49:32', b'0'); -INSERT INTO `inf_job_log` VALUES (2856, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 18:18:09', '2021-02-19 18:18:09', 73, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:49:34', '', '2021-02-08 09:49:34', b'0'); -INSERT INTO `inf_job_log` VALUES (2857, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 18:18:11', '2021-02-19 18:18:11', 419, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:49:36', '', '2021-02-08 09:49:36', b'0'); -INSERT INTO `inf_job_log` VALUES (2858, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 18:18:13', '2021-02-19 18:18:13', 9, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:49:38', '', '2021-02-08 09:49:38', b'0'); -INSERT INTO `inf_job_log` VALUES (2859, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 18:19:00', '2021-02-19 18:19:00', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:50:25', '', '2021-02-08 09:50:25', b'0'); -INSERT INTO `inf_job_log` VALUES (2860, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 18:19:02', '2021-02-19 18:19:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:50:27', '', '2021-02-08 09:50:27', b'0'); -INSERT INTO `inf_job_log` VALUES (2861, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 18:19:04', '2021-02-19 18:19:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:50:29', '', '2021-02-08 09:50:29', b'0'); -INSERT INTO `inf_job_log` VALUES (2862, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 18:19:06', '2021-02-19 18:19:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:50:31', '', '2021-02-08 09:50:31', b'0'); -INSERT INTO `inf_job_log` VALUES (2863, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 18:20:00', '2021-02-19 18:20:00', 7, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:51:25', '', '2021-02-08 09:51:25', b'0'); -INSERT INTO `inf_job_log` VALUES (2864, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 18:20:02', '2021-02-19 18:20:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:51:27', '', '2021-02-08 09:51:27', b'0'); -INSERT INTO `inf_job_log` VALUES (2865, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 18:20:04', '2021-02-19 18:20:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:51:29', '', '2021-02-08 09:51:29', b'0'); -INSERT INTO `inf_job_log` VALUES (2866, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 18:20:06', '2021-02-19 18:20:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:51:31', '', '2021-02-08 09:51:31', b'0'); -INSERT INTO `inf_job_log` VALUES (2867, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 18:24:19', '2021-02-19 18:24:19', 50, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:55:44', '', '2021-02-08 09:55:44', b'0'); -INSERT INTO `inf_job_log` VALUES (2868, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 18:24:21', '2021-02-19 18:24:21', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:55:46', '', '2021-02-08 09:55:46', b'0'); -INSERT INTO `inf_job_log` VALUES (2869, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 18:24:23', '2021-02-19 18:24:23', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:55:48', '', '2021-02-08 09:55:48', b'0'); -INSERT INTO `inf_job_log` VALUES (2870, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 18:24:25', '2021-02-19 18:24:25', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:55:50', '', '2021-02-08 09:55:50', b'0'); -INSERT INTO `inf_job_log` VALUES (2871, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 18:25:00', '2021-02-19 18:25:00', 6, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:56:25', '', '2021-02-08 09:56:25', b'0'); -INSERT INTO `inf_job_log` VALUES (2872, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 18:25:02', '2021-02-19 18:25:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:56:27', '', '2021-02-08 09:56:27', b'0'); -INSERT INTO `inf_job_log` VALUES (2873, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 18:25:04', '2021-02-19 18:25:04', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:56:29', '', '2021-02-08 09:56:29', b'0'); -INSERT INTO `inf_job_log` VALUES (2874, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 18:25:06', '2021-02-19 18:25:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:56:31', '', '2021-02-08 09:56:31', b'0'); -INSERT INTO `inf_job_log` VALUES (2875, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 18:26:00', '2021-02-19 18:26:00', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:57:25', '', '2021-02-08 09:57:25', b'0'); -INSERT INTO `inf_job_log` VALUES (2876, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 18:26:02', '2021-02-19 18:26:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:57:27', '', '2021-02-08 09:57:27', b'0'); -INSERT INTO `inf_job_log` VALUES (2877, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 18:26:04', '2021-02-19 18:26:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:57:29', '', '2021-02-08 09:57:29', b'0'); -INSERT INTO `inf_job_log` VALUES (2878, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 18:26:06', '2021-02-19 18:26:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:57:31', '', '2021-02-08 09:57:31', b'0'); -INSERT INTO `inf_job_log` VALUES (2879, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 18:27:00', '2021-02-19 18:27:00', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:58:25', '', '2021-02-08 09:58:25', b'0'); -INSERT INTO `inf_job_log` VALUES (2880, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 18:27:02', '2021-02-19 18:27:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:58:28', '', '2021-02-08 09:58:28', b'0'); -INSERT INTO `inf_job_log` VALUES (2881, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 18:27:04', '2021-02-19 18:27:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:58:30', '', '2021-02-08 09:58:30', b'0'); -INSERT INTO `inf_job_log` VALUES (2882, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 18:27:06', '2021-02-19 18:27:06', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:58:32', '', '2021-02-08 09:58:32', b'0'); -INSERT INTO `inf_job_log` VALUES (2883, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 18:28:00', '2021-02-19 18:28:00', 13, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:59:26', '', '2021-02-08 09:59:26', b'0'); -INSERT INTO `inf_job_log` VALUES (2884, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 18:28:02', '2021-02-19 18:28:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:59:28', '', '2021-02-08 09:59:28', b'0'); -INSERT INTO `inf_job_log` VALUES (2885, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 18:28:04', '2021-02-19 18:28:04', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:59:30', '', '2021-02-08 09:59:30', b'0'); -INSERT INTO `inf_job_log` VALUES (2886, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 18:28:06', '2021-02-19 18:28:06', 7, 2, 'RuntimeException: 测试异常', '', '2021-02-08 09:59:32', '', '2021-02-08 09:59:32', b'0'); -INSERT INTO `inf_job_log` VALUES (2887, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 18:29:00', '2021-02-19 18:29:00', 9, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:00:26', '', '2021-02-08 10:00:26', b'0'); -INSERT INTO `inf_job_log` VALUES (2888, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 18:29:02', '2021-02-19 18:29:02', 6, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:00:28', '', '2021-02-08 10:00:28', b'0'); -INSERT INTO `inf_job_log` VALUES (2889, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 18:29:04', '2021-02-19 18:29:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:00:30', '', '2021-02-08 10:00:30', b'0'); -INSERT INTO `inf_job_log` VALUES (2890, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 18:29:06', '2021-02-19 18:29:06', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:00:32', '', '2021-02-08 10:00:32', b'0'); -INSERT INTO `inf_job_log` VALUES (2891, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 18:30:00', '2021-02-19 18:30:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:01:26', '', '2021-02-08 10:01:26', b'0'); -INSERT INTO `inf_job_log` VALUES (2892, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 18:30:02', '2021-02-19 18:30:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:01:28', '', '2021-02-08 10:01:28', b'0'); -INSERT INTO `inf_job_log` VALUES (2893, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 18:30:04', '2021-02-19 18:30:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:01:30', '', '2021-02-08 10:01:30', b'0'); -INSERT INTO `inf_job_log` VALUES (2894, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 18:30:06', '2021-02-19 18:30:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:01:32', '', '2021-02-08 10:01:32', b'0'); -INSERT INTO `inf_job_log` VALUES (2895, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 18:31:00', '2021-02-19 18:31:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:02:26', '', '2021-02-08 10:02:26', b'0'); -INSERT INTO `inf_job_log` VALUES (2896, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 18:31:02', '2021-02-19 18:31:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:02:28', '', '2021-02-08 10:02:28', b'0'); -INSERT INTO `inf_job_log` VALUES (2897, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 18:31:04', '2021-02-19 18:31:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:02:30', '', '2021-02-08 10:02:30', b'0'); -INSERT INTO `inf_job_log` VALUES (2898, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 18:31:06', '2021-02-19 18:31:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:02:32', '', '2021-02-08 10:02:32', b'0'); -INSERT INTO `inf_job_log` VALUES (2899, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 18:32:00', '2021-02-19 18:32:00', 6, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:03:26', '', '2021-02-08 10:03:26', b'0'); -INSERT INTO `inf_job_log` VALUES (2900, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 18:32:02', '2021-02-19 18:32:02', 7, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:03:28', '', '2021-02-08 10:03:28', b'0'); -INSERT INTO `inf_job_log` VALUES (2901, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 18:32:04', '2021-02-19 18:32:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:03:30', '', '2021-02-08 10:03:30', b'0'); -INSERT INTO `inf_job_log` VALUES (2902, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 18:32:06', '2021-02-19 18:32:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:03:32', '', '2021-02-08 10:03:32', b'0'); -INSERT INTO `inf_job_log` VALUES (2903, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 18:33:00', '2021-02-19 18:33:00', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:04:26', '', '2021-02-08 10:04:26', b'0'); -INSERT INTO `inf_job_log` VALUES (2904, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 18:33:02', '2021-02-19 18:33:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:04:28', '', '2021-02-08 10:04:28', b'0'); -INSERT INTO `inf_job_log` VALUES (2905, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 18:33:04', '2021-02-19 18:33:04', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:04:30', '', '2021-02-08 10:04:30', b'0'); -INSERT INTO `inf_job_log` VALUES (2906, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 18:33:06', '2021-02-19 18:33:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:04:32', '', '2021-02-08 10:04:32', b'0'); -INSERT INTO `inf_job_log` VALUES (2907, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 18:34:00', '2021-02-19 18:34:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:05:26', '', '2021-02-08 10:05:26', b'0'); -INSERT INTO `inf_job_log` VALUES (2908, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 18:34:02', '2021-02-19 18:34:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:05:28', '', '2021-02-08 10:05:28', b'0'); -INSERT INTO `inf_job_log` VALUES (2909, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 18:34:04', '2021-02-19 18:34:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:05:30', '', '2021-02-08 10:05:30', b'0'); -INSERT INTO `inf_job_log` VALUES (2910, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 18:34:06', '2021-02-19 18:34:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:05:32', '', '2021-02-08 10:05:32', b'0'); -INSERT INTO `inf_job_log` VALUES (2911, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 18:35:20', '2021-02-19 18:35:20', 38, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:06:46', '', '2021-02-08 10:06:46', b'0'); -INSERT INTO `inf_job_log` VALUES (2912, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 18:35:22', '2021-02-19 18:35:22', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:06:48', '', '2021-02-08 10:06:48', b'0'); -INSERT INTO `inf_job_log` VALUES (2913, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 18:35:24', '2021-02-19 18:35:24', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:06:50', '', '2021-02-08 10:06:50', b'0'); -INSERT INTO `inf_job_log` VALUES (2914, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 18:35:26', '2021-02-19 18:35:26', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:06:52', '', '2021-02-08 10:06:52', b'0'); -INSERT INTO `inf_job_log` VALUES (2915, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 18:36:10', '2021-02-19 18:36:10', 41, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:07:36', '', '2021-02-08 10:07:36', b'0'); -INSERT INTO `inf_job_log` VALUES (2916, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 18:36:12', '2021-02-19 18:36:12', 6, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:07:38', '', '2021-02-08 10:07:38', b'0'); -INSERT INTO `inf_job_log` VALUES (2917, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 18:36:14', '2021-02-19 18:36:14', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:07:40', '', '2021-02-08 10:07:40', b'0'); -INSERT INTO `inf_job_log` VALUES (2918, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 18:36:16', '2021-02-19 18:36:16', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:07:42', '', '2021-02-08 10:07:42', b'0'); -INSERT INTO `inf_job_log` VALUES (2919, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 18:37:00', '2021-02-19 18:37:00', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:08:26', '', '2021-02-08 10:08:26', b'0'); -INSERT INTO `inf_job_log` VALUES (2920, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 18:37:02', '2021-02-19 18:37:02', 6, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:08:28', '', '2021-02-08 10:08:28', b'0'); -INSERT INTO `inf_job_log` VALUES (2921, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 18:37:04', '2021-02-19 18:37:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:08:30', '', '2021-02-08 10:08:30', b'0'); -INSERT INTO `inf_job_log` VALUES (2922, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 18:37:06', '2021-02-19 18:37:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:08:32', '', '2021-02-08 10:08:32', b'0'); -INSERT INTO `inf_job_log` VALUES (2923, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 18:38:00', '2021-02-19 18:38:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:09:26', '', '2021-02-08 10:09:26', b'0'); -INSERT INTO `inf_job_log` VALUES (2924, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 18:38:02', '2021-02-19 18:38:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:09:28', '', '2021-02-08 10:09:28', b'0'); -INSERT INTO `inf_job_log` VALUES (2925, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 18:38:04', '2021-02-19 18:38:04', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:09:30', '', '2021-02-08 10:09:30', b'0'); -INSERT INTO `inf_job_log` VALUES (2926, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 18:38:06', '2021-02-19 18:38:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:09:32', '', '2021-02-08 10:09:32', b'0'); -INSERT INTO `inf_job_log` VALUES (2927, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 18:39:00', '2021-02-19 18:39:00', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:10:26', '', '2021-02-08 10:10:26', b'0'); -INSERT INTO `inf_job_log` VALUES (2928, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 18:39:02', '2021-02-19 18:39:02', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:10:28', '', '2021-02-08 10:10:28', b'0'); -INSERT INTO `inf_job_log` VALUES (2929, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 18:39:04', '2021-02-19 18:39:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:10:30', '', '2021-02-08 10:10:30', b'0'); -INSERT INTO `inf_job_log` VALUES (2930, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 18:39:06', '2021-02-19 18:39:06', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:10:32', '', '2021-02-08 10:10:32', b'0'); -INSERT INTO `inf_job_log` VALUES (2931, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 18:40:00', '2021-02-19 18:40:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:11:26', '', '2021-02-08 10:11:26', b'0'); -INSERT INTO `inf_job_log` VALUES (2932, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 18:40:02', '2021-02-19 18:40:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:11:28', '', '2021-02-08 10:11:28', b'0'); -INSERT INTO `inf_job_log` VALUES (2933, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 18:40:04', '2021-02-19 18:40:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:11:30', '', '2021-02-08 10:11:30', b'0'); -INSERT INTO `inf_job_log` VALUES (2934, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 18:40:06', '2021-02-19 18:40:06', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:11:32', '', '2021-02-08 10:11:32', b'0'); -INSERT INTO `inf_job_log` VALUES (2935, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 18:41:00', '2021-02-19 18:41:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:12:26', '', '2021-02-08 10:12:26', b'0'); -INSERT INTO `inf_job_log` VALUES (2936, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 18:41:02', '2021-02-19 18:41:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:12:28', '', '2021-02-08 10:12:28', b'0'); -INSERT INTO `inf_job_log` VALUES (2937, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 18:41:04', '2021-02-19 18:41:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:12:30', '', '2021-02-08 10:12:30', b'0'); -INSERT INTO `inf_job_log` VALUES (2938, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 18:41:06', '2021-02-19 18:41:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:12:32', '', '2021-02-08 10:12:32', b'0'); -INSERT INTO `inf_job_log` VALUES (2939, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 18:42:00', '2021-02-19 18:42:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:13:27', '', '2021-02-08 10:13:27', b'0'); -INSERT INTO `inf_job_log` VALUES (2940, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 18:42:02', '2021-02-19 18:42:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:13:29', '', '2021-02-08 10:13:29', b'0'); -INSERT INTO `inf_job_log` VALUES (2941, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 18:42:04', '2021-02-19 18:42:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:13:31', '', '2021-02-08 10:13:31', b'0'); -INSERT INTO `inf_job_log` VALUES (2942, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 18:42:06', '2021-02-19 18:42:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:13:33', '', '2021-02-08 10:13:33', b'0'); -INSERT INTO `inf_job_log` VALUES (2943, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 18:43:00', '2021-02-19 18:43:00', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:14:27', '', '2021-02-08 10:14:27', b'0'); -INSERT INTO `inf_job_log` VALUES (2944, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 18:43:02', '2021-02-19 18:43:02', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:14:29', '', '2021-02-08 10:14:29', b'0'); -INSERT INTO `inf_job_log` VALUES (2945, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 18:43:04', '2021-02-19 18:43:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:14:31', '', '2021-02-08 10:14:31', b'0'); -INSERT INTO `inf_job_log` VALUES (2946, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 18:43:06', '2021-02-19 18:43:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:14:33', '', '2021-02-08 10:14:33', b'0'); -INSERT INTO `inf_job_log` VALUES (2947, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 18:44:00', '2021-02-19 18:44:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:15:27', '', '2021-02-08 10:15:27', b'0'); -INSERT INTO `inf_job_log` VALUES (2948, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 18:44:02', '2021-02-19 18:44:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:15:29', '', '2021-02-08 10:15:29', b'0'); -INSERT INTO `inf_job_log` VALUES (2949, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 18:44:04', '2021-02-19 18:44:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:15:31', '', '2021-02-08 10:15:31', b'0'); -INSERT INTO `inf_job_log` VALUES (2950, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 18:44:06', '2021-02-19 18:44:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:15:33', '', '2021-02-08 10:15:33', b'0'); -INSERT INTO `inf_job_log` VALUES (2951, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 18:45:00', '2021-02-19 18:45:00', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:16:27', '', '2021-02-08 10:16:27', b'0'); -INSERT INTO `inf_job_log` VALUES (2952, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 18:45:02', '2021-02-19 18:45:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:16:29', '', '2021-02-08 10:16:29', b'0'); -INSERT INTO `inf_job_log` VALUES (2953, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 18:45:04', '2021-02-19 18:45:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:16:31', '', '2021-02-08 10:16:31', b'0'); -INSERT INTO `inf_job_log` VALUES (2954, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 18:45:06', '2021-02-19 18:45:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:16:33', '', '2021-02-08 10:16:33', b'0'); -INSERT INTO `inf_job_log` VALUES (2955, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 18:46:00', '2021-02-19 18:46:00', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:17:27', '', '2021-02-08 10:17:27', b'0'); -INSERT INTO `inf_job_log` VALUES (2956, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 18:46:02', '2021-02-19 18:46:02', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:17:29', '', '2021-02-08 10:17:29', b'0'); -INSERT INTO `inf_job_log` VALUES (2957, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 18:46:04', '2021-02-19 18:46:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:17:31', '', '2021-02-08 10:17:31', b'0'); -INSERT INTO `inf_job_log` VALUES (2958, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 18:46:06', '2021-02-19 18:46:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:17:33', '', '2021-02-08 10:17:33', b'0'); -INSERT INTO `inf_job_log` VALUES (2959, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 18:47:00', '2021-02-19 18:47:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:18:27', '', '2021-02-08 10:18:27', b'0'); -INSERT INTO `inf_job_log` VALUES (2960, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 18:47:02', '2021-02-19 18:47:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:18:29', '', '2021-02-08 10:18:29', b'0'); -INSERT INTO `inf_job_log` VALUES (2961, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 18:47:04', '2021-02-19 18:47:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:18:31', '', '2021-02-08 10:18:31', b'0'); -INSERT INTO `inf_job_log` VALUES (2962, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 18:47:06', '2021-02-19 18:47:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:18:33', '', '2021-02-08 10:18:33', b'0'); -INSERT INTO `inf_job_log` VALUES (2963, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 18:48:00', '2021-02-19 18:48:00', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:19:27', '', '2021-02-08 10:19:27', b'0'); -INSERT INTO `inf_job_log` VALUES (2964, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 18:48:02', '2021-02-19 18:48:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:19:29', '', '2021-02-08 10:19:29', b'0'); -INSERT INTO `inf_job_log` VALUES (2965, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 18:48:04', '2021-02-19 18:48:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:19:31', '', '2021-02-08 10:19:31', b'0'); -INSERT INTO `inf_job_log` VALUES (2966, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 18:48:06', '2021-02-19 18:48:06', 18, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:19:33', '', '2021-02-08 10:19:33', b'0'); -INSERT INTO `inf_job_log` VALUES (2967, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 18:49:00', '2021-02-19 18:49:00', 8, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:20:27', '', '2021-02-08 10:20:27', b'0'); -INSERT INTO `inf_job_log` VALUES (2968, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 18:49:02', '2021-02-19 18:49:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:20:29', '', '2021-02-08 10:20:29', b'0'); -INSERT INTO `inf_job_log` VALUES (2969, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 18:49:04', '2021-02-19 18:49:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:20:31', '', '2021-02-08 10:20:31', b'0'); -INSERT INTO `inf_job_log` VALUES (2970, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 18:49:06', '2021-02-19 18:49:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:20:33', '', '2021-02-08 10:20:33', b'0'); -INSERT INTO `inf_job_log` VALUES (2971, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 18:50:00', '2021-02-19 18:50:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:21:27', '', '2021-02-08 10:21:27', b'0'); -INSERT INTO `inf_job_log` VALUES (2972, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 18:50:02', '2021-02-19 18:50:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:21:29', '', '2021-02-08 10:21:29', b'0'); -INSERT INTO `inf_job_log` VALUES (2973, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 18:50:04', '2021-02-19 18:50:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:21:31', '', '2021-02-08 10:21:31', b'0'); -INSERT INTO `inf_job_log` VALUES (2974, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 18:50:06', '2021-02-19 18:50:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:21:33', '', '2021-02-08 10:21:33', b'0'); -INSERT INTO `inf_job_log` VALUES (2975, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 18:51:00', '2021-02-19 18:51:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:22:27', '', '2021-02-08 10:22:27', b'0'); -INSERT INTO `inf_job_log` VALUES (2976, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 18:51:02', '2021-02-19 18:51:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:22:29', '', '2021-02-08 10:22:29', b'0'); -INSERT INTO `inf_job_log` VALUES (2977, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 18:51:04', '2021-02-19 18:51:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:22:31', '', '2021-02-08 10:22:31', b'0'); -INSERT INTO `inf_job_log` VALUES (2978, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 18:51:06', '2021-02-19 18:51:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:22:33', '', '2021-02-08 10:22:33', b'0'); -INSERT INTO `inf_job_log` VALUES (2979, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 18:52:00', '2021-02-19 18:52:00', 2, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:23:27', '', '2021-02-08 10:23:27', b'0'); -INSERT INTO `inf_job_log` VALUES (2980, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 18:52:02', '2021-02-19 18:52:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:23:29', '', '2021-02-08 10:23:29', b'0'); -INSERT INTO `inf_job_log` VALUES (2981, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 18:52:04', '2021-02-19 18:52:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:23:31', '', '2021-02-08 10:23:31', b'0'); -INSERT INTO `inf_job_log` VALUES (2982, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 18:52:06', '2021-02-19 18:52:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:23:33', '', '2021-02-08 10:23:33', b'0'); -INSERT INTO `inf_job_log` VALUES (2983, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 18:53:00', '2021-02-19 18:53:00', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:24:27', '', '2021-02-08 10:24:27', b'0'); -INSERT INTO `inf_job_log` VALUES (2984, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 18:53:02', '2021-02-19 18:53:02', 6, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:24:29', '', '2021-02-08 10:24:29', b'0'); -INSERT INTO `inf_job_log` VALUES (2985, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 18:53:04', '2021-02-19 18:53:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:24:31', '', '2021-02-08 10:24:31', b'0'); -INSERT INTO `inf_job_log` VALUES (2986, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 18:53:06', '2021-02-19 18:53:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:24:33', '', '2021-02-08 10:24:33', b'0'); -INSERT INTO `inf_job_log` VALUES (2987, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 18:54:00', '2021-02-19 18:54:00', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:25:27', '', '2021-02-08 10:25:27', b'0'); -INSERT INTO `inf_job_log` VALUES (2988, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 18:54:02', '2021-02-19 18:54:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:25:29', '', '2021-02-08 10:25:29', b'0'); -INSERT INTO `inf_job_log` VALUES (2989, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 18:54:04', '2021-02-19 18:54:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:25:31', '', '2021-02-08 10:25:31', b'0'); -INSERT INTO `inf_job_log` VALUES (2990, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 18:54:06', '2021-02-19 18:54:06', 5, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:25:33', '', '2021-02-08 10:25:33', b'0'); -INSERT INTO `inf_job_log` VALUES (2991, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 18:55:00', '2021-02-19 18:55:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:26:27', '', '2021-02-08 10:26:27', b'0'); -INSERT INTO `inf_job_log` VALUES (2992, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 18:55:02', '2021-02-19 18:55:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:26:29', '', '2021-02-08 10:26:29', b'0'); -INSERT INTO `inf_job_log` VALUES (2993, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 18:55:04', '2021-02-19 18:55:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:26:31', '', '2021-02-08 10:26:31', b'0'); -INSERT INTO `inf_job_log` VALUES (2994, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 18:55:06', '2021-02-19 18:55:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:26:33', '', '2021-02-08 10:26:33', b'0'); -INSERT INTO `inf_job_log` VALUES (2995, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 18:56:00', '2021-02-19 18:56:00', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:27:28', '', '2021-02-08 10:27:28', b'0'); -INSERT INTO `inf_job_log` VALUES (2996, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 18:56:02', '2021-02-19 18:56:02', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:27:30', '', '2021-02-08 10:27:30', b'0'); -INSERT INTO `inf_job_log` VALUES (2997, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 18:56:04', '2021-02-19 18:56:04', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:27:32', '', '2021-02-08 10:27:32', b'0'); -INSERT INTO `inf_job_log` VALUES (2998, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 18:56:06', '2021-02-19 18:56:06', 4, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:27:34', '', '2021-02-08 10:27:34', b'0'); -INSERT INTO `inf_job_log` VALUES (2999, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 18:57:00', '2021-02-19 18:57:00', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:28:28', '', '2021-02-08 10:28:28', b'0'); -INSERT INTO `inf_job_log` VALUES (3000, 3, 'sysUserSessionTimeoutJob', NULL, 2, '2021-02-19 18:57:02', '2021-02-19 18:57:02', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:28:30', '', '2021-02-08 10:28:30', b'0'); -INSERT INTO `inf_job_log` VALUES (3001, 3, 'sysUserSessionTimeoutJob', NULL, 3, '2021-02-19 18:57:04', '2021-02-19 18:57:04', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:28:32', '', '2021-02-08 10:28:32', b'0'); -INSERT INTO `inf_job_log` VALUES (3002, 3, 'sysUserSessionTimeoutJob', NULL, 4, '2021-02-19 18:57:06', '2021-02-19 18:57:06', 3, 2, 'RuntimeException: 测试异常', '', '2021-02-08 10:28:34', '', '2021-02-08 10:28:34', b'0'); -INSERT INTO `inf_job_log` VALUES (3003, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 18:58:43', '2021-02-19 18:58:43', 35, 1, '', '', '2021-02-08 10:30:10', '', '2021-02-08 10:30:10', b'0'); -INSERT INTO `inf_job_log` VALUES (3004, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 18:59:00', '2021-02-19 18:59:00', 11, 1, '', '', '2021-02-08 10:30:28', '', '2021-02-08 10:30:28', b'0'); -INSERT INTO `inf_job_log` VALUES (3005, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 19:00:00', '2021-02-19 19:00:00', 5, 1, '', '', '2021-02-08 10:31:28', '', '2021-02-08 10:31:28', b'0'); -INSERT INTO `inf_job_log` VALUES (3006, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 19:01:00', '2021-02-19 19:01:00', 6, 1, '', '', '2021-02-08 10:32:28', '', '2021-02-08 10:32:28', b'0'); -INSERT INTO `inf_job_log` VALUES (3007, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 19:02:00', '2021-02-19 19:02:00', 7, 1, '', '', '2021-02-08 10:33:28', '', '2021-02-08 10:33:28', b'0'); -INSERT INTO `inf_job_log` VALUES (3008, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 19:03:00', '2021-02-19 19:03:00', 5, 1, '', '', '2021-02-08 10:34:28', '', '2021-02-08 10:34:28', b'0'); -INSERT INTO `inf_job_log` VALUES (3009, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 19:04:00', '2021-02-19 19:04:00', 6, 1, '', '', '2021-02-08 10:35:28', '', '2021-02-08 10:35:28', b'0'); -INSERT INTO `inf_job_log` VALUES (3010, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 19:05:00', '2021-02-19 19:05:00', 5, 1, '', '', '2021-02-08 10:36:28', '', '2021-02-08 10:36:28', b'0'); -INSERT INTO `inf_job_log` VALUES (3011, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 19:06:00', '2021-02-19 19:06:00', 5, 1, '', '', '2021-02-08 10:37:28', '', '2021-02-08 10:37:28', b'0'); -INSERT INTO `inf_job_log` VALUES (3012, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 19:07:00', '2021-02-19 19:07:00', 4, 1, '', '', '2021-02-08 10:38:28', '', '2021-02-08 10:38:28', b'0'); -INSERT INTO `inf_job_log` VALUES (3013, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 19:08:17', '2021-02-19 19:08:17', 50, 1, '', '', '2021-02-08 10:39:45', '', '2021-02-08 10:39:45', b'0'); -INSERT INTO `inf_job_log` VALUES (3014, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 19:09:00', '2021-02-19 19:09:00', 4, 1, '', '', '2021-02-08 10:40:28', '', '2021-02-08 10:40:28', b'0'); -INSERT INTO `inf_job_log` VALUES (3015, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 19:10:00', '2021-02-19 19:10:00', 4, 1, '', '', '2021-02-08 10:41:28', '', '2021-02-08 10:41:28', b'0'); -INSERT INTO `inf_job_log` VALUES (3016, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 19:11:00', '2021-02-19 19:11:00', 7, 1, '', '', '2021-02-08 10:42:29', '', '2021-02-08 10:42:29', b'0'); -INSERT INTO `inf_job_log` VALUES (3017, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 19:12:00', '2021-02-19 19:12:00', 6, 1, '', '', '2021-02-08 10:43:29', '', '2021-02-08 10:43:29', b'0'); -INSERT INTO `inf_job_log` VALUES (3018, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 19:13:00', '2021-02-19 19:13:00', 6, 1, '', '', '2021-02-08 10:44:29', '', '2021-02-08 10:44:29', b'0'); -INSERT INTO `inf_job_log` VALUES (3019, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 19:14:00', '2021-02-19 19:14:00', 4, 1, '', '', '2021-02-08 10:45:29', '', '2021-02-08 10:45:29', b'0'); -INSERT INTO `inf_job_log` VALUES (3020, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 19:15:00', '2021-02-19 19:15:00', 18, 1, '', '', '2021-02-08 10:46:29', '', '2021-02-08 10:46:29', b'0'); -INSERT INTO `inf_job_log` VALUES (3021, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 19:16:00', '2021-02-19 19:16:00', 3, 1, '', '', '2021-02-08 10:47:29', '', '2021-02-08 10:47:29', b'0'); -INSERT INTO `inf_job_log` VALUES (3022, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 19:17:00', '2021-02-19 19:17:00', 9, 1, '', '', '2021-02-08 10:48:29', '', '2021-02-08 10:48:29', b'0'); -INSERT INTO `inf_job_log` VALUES (3023, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 19:18:00', '2021-02-19 19:18:00', 5, 1, '', '', '2021-02-08 10:49:29', '', '2021-02-08 10:49:29', b'0'); -INSERT INTO `inf_job_log` VALUES (3024, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 19:19:00', '2021-02-19 19:19:00', 4, 1, '', '', '2021-02-08 10:50:29', '', '2021-02-08 10:50:29', b'0'); -INSERT INTO `inf_job_log` VALUES (3025, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 19:20:00', '2021-02-19 19:20:00', 7, 1, '', '', '2021-02-08 10:51:29', '', '2021-02-08 10:51:29', b'0'); -INSERT INTO `inf_job_log` VALUES (3026, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 19:21:00', '2021-02-19 19:21:00', 5, 1, '', '', '2021-02-08 10:52:29', '', '2021-02-08 10:52:29', b'0'); -INSERT INTO `inf_job_log` VALUES (3027, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 19:22:00', '2021-02-19 19:22:00', 4, 1, '', '', '2021-02-08 10:53:29', '', '2021-02-08 10:53:29', b'0'); -INSERT INTO `inf_job_log` VALUES (3028, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 19:23:00', '2021-02-19 19:23:00', 3, 1, '', '', '2021-02-08 10:54:29', '', '2021-02-08 10:54:29', b'0'); -INSERT INTO `inf_job_log` VALUES (3029, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 19:24:00', '2021-02-19 19:24:00', 3, 1, '', '', '2021-02-08 10:55:29', '', '2021-02-08 10:55:29', b'0'); -INSERT INTO `inf_job_log` VALUES (3030, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 19:25:00', '2021-02-19 19:25:00', 3, 1, '', '', '2021-02-08 10:56:29', '', '2021-02-08 10:56:29', b'0'); -INSERT INTO `inf_job_log` VALUES (3031, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 19:26:00', '2021-02-19 19:26:00', 3, 1, '', '', '2021-02-08 10:57:30', '', '2021-02-08 10:57:30', b'0'); -INSERT INTO `inf_job_log` VALUES (3032, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 19:27:00', '2021-02-19 19:27:00', 3, 1, '', '', '2021-02-08 10:58:30', '', '2021-02-08 10:58:30', b'0'); -INSERT INTO `inf_job_log` VALUES (3033, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 19:36:36', '2021-02-19 19:36:36', 36, 1, '', '', '2021-02-08 11:08:06', '', '2021-02-08 11:08:06', b'0'); -INSERT INTO `inf_job_log` VALUES (3034, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 19:37:13', '2021-02-19 19:37:13', 23, 1, '', '', '2021-02-08 11:08:43', '', '2021-02-08 11:08:43', b'0'); -INSERT INTO `inf_job_log` VALUES (3035, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 19:38:00', '2021-02-19 19:38:00', 5, 1, '', '', '2021-02-08 11:09:30', '', '2021-02-08 11:09:30', b'0'); -INSERT INTO `inf_job_log` VALUES (3036, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 19:39:00', '2021-02-19 19:39:00', 24, 1, '', '', '2021-02-08 11:10:30', '', '2021-02-08 11:10:31', b'0'); -INSERT INTO `inf_job_log` VALUES (3037, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 22:39:03', '2021-02-19 22:39:03', 47, 1, '', '', '2021-02-08 13:16:56', '', '2021-02-08 13:16:56', b'0'); -INSERT INTO `inf_job_log` VALUES (3038, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 22:40:10', '2021-02-19 22:40:10', 34, 1, '', '', '2021-02-08 13:18:04', '', '2021-02-08 13:18:04', b'0'); -INSERT INTO `inf_job_log` VALUES (3039, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 22:41:00', '2021-02-19 22:41:00', 5, 1, '', '', '2021-02-08 13:18:54', '', '2021-02-08 13:18:54', b'0'); -INSERT INTO `inf_job_log` VALUES (3040, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 22:42:00', '2021-02-19 22:42:00', 5, 1, '', '', '2021-02-08 13:19:54', '', '2021-02-08 13:19:54', b'0'); -INSERT INTO `inf_job_log` VALUES (3041, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 22:43:00', '2021-02-19 22:43:00', 6, 1, '', '', '2021-02-08 13:20:54', '', '2021-02-08 13:20:54', b'0'); -INSERT INTO `inf_job_log` VALUES (3042, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 22:46:47', '2021-02-19 22:46:47', 41, 1, '', '', '2021-02-08 13:24:41', '', '2021-02-08 13:24:41', b'0'); -INSERT INTO `inf_job_log` VALUES (3043, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 22:47:00', '2021-02-19 22:47:00', 8, 1, '', '', '2021-02-08 13:24:54', '', '2021-02-08 13:24:54', b'0'); -INSERT INTO `inf_job_log` VALUES (3044, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 22:48:12', '2021-02-19 22:48:12', 36, 1, '', '', '2021-02-08 13:26:06', '', '2021-02-08 13:26:06', b'0'); -INSERT INTO `inf_job_log` VALUES (3045, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 22:49:00', '2021-02-19 22:49:00', 8, 1, '', '', '2021-02-08 13:26:55', '', '2021-02-08 13:26:55', b'0'); -INSERT INTO `inf_job_log` VALUES (3046, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 22:51:05', '2021-02-19 22:51:05', 45, 1, '', '', '2021-02-08 13:29:00', '', '2021-02-08 13:29:00', b'0'); -INSERT INTO `inf_job_log` VALUES (3047, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 22:52:00', '2021-02-19 22:52:00', 6, 1, '', '', '2021-02-08 13:29:55', '', '2021-02-08 13:29:55', b'0'); -INSERT INTO `inf_job_log` VALUES (3048, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 22:53:00', '2021-02-19 22:53:00', 32, 1, '', '', '2021-02-08 13:30:55', '', '2021-02-08 13:30:55', b'0'); -INSERT INTO `inf_job_log` VALUES (3049, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 22:54:00', '2021-02-19 22:54:00', 42, 1, '', '', '2021-02-08 13:31:55', '', '2021-02-08 13:31:55', b'0'); -INSERT INTO `inf_job_log` VALUES (3050, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 22:55:00', '2021-02-19 22:55:00', 5, 1, '', '', '2021-02-08 13:32:55', '', '2021-02-08 13:32:55', b'0'); -INSERT INTO `inf_job_log` VALUES (3051, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 22:56:00', '2021-02-19 22:56:00', 5, 1, '', '', '2021-02-08 13:33:55', '', '2021-02-08 13:33:55', b'0'); -INSERT INTO `inf_job_log` VALUES (3052, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 22:57:00', '2021-02-19 22:57:00', 8, 1, '', '', '2021-02-08 13:34:55', '', '2021-02-08 13:34:55', b'0'); -INSERT INTO `inf_job_log` VALUES (3053, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 22:58:00', '2021-02-19 22:58:00', 4, 1, '', '', '2021-02-08 13:35:55', '', '2021-02-08 13:35:55', b'0'); -INSERT INTO `inf_job_log` VALUES (3054, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 22:59:00', '2021-02-19 22:59:00', 7, 1, '', '', '2021-02-08 13:36:55', '', '2021-02-08 13:36:55', b'0'); -INSERT INTO `inf_job_log` VALUES (3055, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 23:00:00', '2021-02-19 23:00:00', 4, 1, '', '', '2021-02-08 13:37:55', '', '2021-02-08 13:37:55', b'0'); -INSERT INTO `inf_job_log` VALUES (3056, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 23:01:00', '2021-02-19 23:01:00', 4, 1, '', '', '2021-02-08 13:38:55', '', '2021-02-08 13:38:55', b'0'); -INSERT INTO `inf_job_log` VALUES (3057, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 23:02:00', '2021-02-19 23:02:00', 3, 1, '', '', '2021-02-08 13:39:55', '', '2021-02-08 13:39:55', b'0'); -INSERT INTO `inf_job_log` VALUES (3058, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 23:03:00', '2021-02-19 23:03:00', 4, 1, '', '', '2021-02-08 13:40:56', '', '2021-02-08 13:40:56', b'0'); -INSERT INTO `inf_job_log` VALUES (3059, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 23:04:04', '2021-02-19 23:04:04', 32, 1, '', '', '2021-02-08 13:42:00', '', '2021-02-08 13:42:00', b'0'); -INSERT INTO `inf_job_log` VALUES (3060, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 23:07:50', '2021-02-19 23:07:50', 44, 1, '', '', '2021-02-08 13:45:46', '', '2021-02-08 13:45:46', b'0'); -INSERT INTO `inf_job_log` VALUES (3061, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 23:10:33', '2021-02-19 23:10:33', 34, 1, '', '', '2021-02-08 13:48:29', '', '2021-02-08 13:48:29', b'0'); -INSERT INTO `inf_job_log` VALUES (3062, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 23:11:00', '2021-02-19 23:11:00', 9, 1, '', '', '2021-02-08 13:48:56', '', '2021-02-08 13:48:56', b'0'); -INSERT INTO `inf_job_log` VALUES (3063, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 23:12:00', '2021-02-19 23:12:00', 5, 1, '', '', '2021-02-08 13:49:56', '', '2021-02-08 13:49:56', b'0'); -INSERT INTO `inf_job_log` VALUES (3064, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 23:15:40', '2021-02-19 23:15:40', 35, 1, '', '', '2021-02-08 13:53:37', '', '2021-02-08 13:53:37', b'0'); -INSERT INTO `inf_job_log` VALUES (3065, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 23:30:02', '2021-02-19 23:30:02', 42, 1, '', '', '2021-02-08 14:07:59', '', '2021-02-08 14:07:59', b'0'); -INSERT INTO `inf_job_log` VALUES (3066, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-19 23:45:34', '2021-02-19 23:45:34', 36, 1, '', '', '2021-02-08 14:23:32', '', '2021-02-08 14:23:32', b'0'); -INSERT INTO `inf_job_log` VALUES (3067, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 14:28:09', '2021-02-20 14:28:09', 43, 1, '', '', '2021-02-08 17:23:39', '', '2021-02-08 17:23:39', b'0'); -INSERT INTO `inf_job_log` VALUES (3068, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 14:29:00', '2021-02-20 14:29:00', 6, 1, '', '', '2021-02-08 17:24:30', '', '2021-02-08 17:24:30', b'0'); -INSERT INTO `inf_job_log` VALUES (3069, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 14:30:00', '2021-02-20 14:30:00', 10, 1, '', '', '2021-02-08 17:25:30', '', '2021-02-08 17:25:30', b'0'); -INSERT INTO `inf_job_log` VALUES (3070, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 14:48:45', '2021-02-20 14:48:45', 37, 1, '', '', '2021-02-08 17:44:16', '', '2021-02-08 17:44:16', b'0'); -INSERT INTO `inf_job_log` VALUES (3071, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 14:49:00', '2021-02-20 14:49:00', 11, 1, '', '', '2021-02-08 17:44:31', '', '2021-02-08 17:44:31', b'0'); -INSERT INTO `inf_job_log` VALUES (3072, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 14:50:00', '2021-02-20 14:50:00', 9, 1, '', '', '2021-02-08 17:45:31', '', '2021-02-08 17:45:31', b'0'); -INSERT INTO `inf_job_log` VALUES (3073, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 14:51:00', '2021-02-20 14:51:00', 9, 1, '', '', '2021-02-08 17:46:31', '', '2021-02-08 17:46:31', b'0'); -INSERT INTO `inf_job_log` VALUES (3074, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 14:52:00', '2021-02-20 14:52:00', 5, 1, '', '', '2021-02-08 17:47:32', '', '2021-02-08 17:47:32', b'0'); -INSERT INTO `inf_job_log` VALUES (3075, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 14:53:00', '2021-02-20 14:53:00', 5, 1, '', '', '2021-02-08 17:48:32', '', '2021-02-08 17:48:32', b'0'); -INSERT INTO `inf_job_log` VALUES (3076, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 14:54:00', '2021-02-20 14:54:00', 3, 1, '', '', '2021-02-08 17:49:32', '', '2021-02-08 17:49:32', b'0'); -INSERT INTO `inf_job_log` VALUES (3077, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 14:55:00', '2021-02-20 14:55:00', 6, 1, '', '', '2021-02-08 17:50:32', '', '2021-02-08 17:50:32', b'0'); -INSERT INTO `inf_job_log` VALUES (3078, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 14:56:00', '2021-02-20 14:56:00', 4, 1, '', '', '2021-02-08 17:51:32', '', '2021-02-08 17:51:32', b'0'); -INSERT INTO `inf_job_log` VALUES (3079, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 14:57:00', '2021-02-20 14:57:00', 3, 1, '', '', '2021-02-08 17:52:32', '', '2021-02-08 17:52:32', b'0'); -INSERT INTO `inf_job_log` VALUES (3080, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 14:58:00', '2021-02-20 14:58:00', 3, 1, '', '', '2021-02-08 17:53:32', '', '2021-02-08 17:53:32', b'0'); -INSERT INTO `inf_job_log` VALUES (3081, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 14:59:00', '2021-02-20 14:59:00', 5, 1, '', '', '2021-02-08 17:54:32', '', '2021-02-08 17:54:32', b'0'); -INSERT INTO `inf_job_log` VALUES (3082, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:00:00', '2021-02-20 15:00:00', 6, 1, '', '', '2021-02-08 17:55:32', '', '2021-02-08 17:55:32', b'0'); -INSERT INTO `inf_job_log` VALUES (3083, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:01:00', '2021-02-20 15:01:00', 4, 1, '', '', '2021-02-08 17:56:32', '', '2021-02-08 17:56:32', b'0'); -INSERT INTO `inf_job_log` VALUES (3084, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:02:00', '2021-02-20 15:02:00', 4, 1, '', '', '2021-02-08 17:57:32', '', '2021-02-08 17:57:32', b'0'); -INSERT INTO `inf_job_log` VALUES (3085, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:03:00', '2021-02-20 15:03:00', 6, 1, '', '', '2021-02-08 17:58:32', '', '2021-02-08 17:58:32', b'0'); -INSERT INTO `inf_job_log` VALUES (3086, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:04:00', '2021-02-20 15:04:00', 4, 1, '', '', '2021-02-08 17:59:32', '', '2021-02-08 17:59:32', b'0'); -INSERT INTO `inf_job_log` VALUES (3087, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:05:00', '2021-02-20 15:05:00', 3, 1, '', '', '2021-02-08 18:00:32', '', '2021-02-08 18:00:32', b'0'); -INSERT INTO `inf_job_log` VALUES (3088, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:06:00', '2021-02-20 15:06:00', 4, 1, '', '', '2021-02-08 18:01:32', '', '2021-02-08 18:01:32', b'0'); -INSERT INTO `inf_job_log` VALUES (3089, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:07:00', '2021-02-20 15:07:00', 3, 1, '', '', '2021-02-08 18:02:33', '', '2021-02-08 18:02:33', b'0'); -INSERT INTO `inf_job_log` VALUES (3090, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:08:00', '2021-02-20 15:08:00', 5, 1, '', '', '2021-02-08 18:03:33', '', '2021-02-08 18:03:33', b'0'); -INSERT INTO `inf_job_log` VALUES (3091, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:09:00', '2021-02-20 15:09:00', 4, 1, '', '', '2021-02-08 18:04:33', '', '2021-02-08 18:04:33', b'0'); -INSERT INTO `inf_job_log` VALUES (3092, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:10:00', '2021-02-20 15:10:00', 4, 1, '', '', '2021-02-08 18:05:33', '', '2021-02-08 18:05:33', b'0'); -INSERT INTO `inf_job_log` VALUES (3093, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:11:00', '2021-02-20 15:11:00', 3, 1, '', '', '2021-02-08 18:06:33', '', '2021-02-08 18:06:33', b'0'); -INSERT INTO `inf_job_log` VALUES (3094, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:12:00', '2021-02-20 15:12:00', 4, 1, '', '', '2021-02-08 18:07:33', '', '2021-02-08 18:07:33', b'0'); -INSERT INTO `inf_job_log` VALUES (3095, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:13:00', '2021-02-20 15:13:00', 3, 1, '', '', '2021-02-08 18:08:33', '', '2021-02-08 18:08:33', b'0'); -INSERT INTO `inf_job_log` VALUES (3096, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:14:00', '2021-02-20 15:14:00', 3, 1, '', '', '2021-02-08 18:09:33', '', '2021-02-08 18:09:33', b'0'); -INSERT INTO `inf_job_log` VALUES (3097, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:15:00', '2021-02-20 15:15:00', 4, 1, '', '', '2021-02-08 18:10:33', '', '2021-02-08 18:10:33', b'0'); -INSERT INTO `inf_job_log` VALUES (3098, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:22:28', '2021-02-20 15:22:28', 31, 1, '', '', '2021-02-08 18:18:01', '', '2021-02-08 18:18:02', b'0'); -INSERT INTO `inf_job_log` VALUES (3099, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:23:00', '2021-02-20 15:23:00', 6, 1, '', '', '2021-02-08 18:18:34', '', '2021-02-08 18:18:34', b'0'); -INSERT INTO `inf_job_log` VALUES (3100, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:24:00', '2021-02-20 15:24:00', 7, 1, '', '', '2021-02-08 18:19:34', '', '2021-02-08 18:19:34', b'0'); -INSERT INTO `inf_job_log` VALUES (3101, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:25:00', '2021-02-20 15:25:00', 7, 1, '', '', '2021-02-08 18:20:34', '', '2021-02-08 18:20:34', b'0'); -INSERT INTO `inf_job_log` VALUES (3102, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:26:15', '2021-02-20 15:26:16', 34, 1, '', '', '2021-02-08 18:21:49', '', '2021-02-08 18:21:49', b'0'); -INSERT INTO `inf_job_log` VALUES (3103, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:27:00', '2021-02-20 15:27:00', 4, 1, '', '', '2021-02-08 18:22:34', '', '2021-02-08 18:22:34', b'0'); -INSERT INTO `inf_job_log` VALUES (3104, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:28:00', '2021-02-20 15:28:00', 4, 1, '', '', '2021-02-08 18:23:34', '', '2021-02-08 18:23:34', b'0'); -INSERT INTO `inf_job_log` VALUES (3105, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:29:00', '2021-02-20 15:29:00', 6, 1, '', '', '2021-02-08 18:24:34', '', '2021-02-08 18:24:34', b'0'); -INSERT INTO `inf_job_log` VALUES (3106, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:30:00', '2021-02-20 15:30:00', 4, 1, '', '', '2021-02-08 18:25:34', '', '2021-02-08 18:25:34', b'0'); -INSERT INTO `inf_job_log` VALUES (3107, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:31:00', '2021-02-20 15:31:00', 7, 1, '', '', '2021-02-08 18:26:34', '', '2021-02-08 18:26:34', b'0'); -INSERT INTO `inf_job_log` VALUES (3108, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:32:00', '2021-02-20 15:32:00', 4, 1, '', '', '2021-02-08 18:27:34', '', '2021-02-08 18:27:34', b'0'); -INSERT INTO `inf_job_log` VALUES (3109, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:33:00', '2021-02-20 15:33:00', 5, 1, '', '', '2021-02-08 18:28:34', '', '2021-02-08 18:28:34', b'0'); -INSERT INTO `inf_job_log` VALUES (3110, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:34:00', '2021-02-20 15:34:00', 5, 1, '', '', '2021-02-08 18:29:34', '', '2021-02-08 18:29:34', b'0'); -INSERT INTO `inf_job_log` VALUES (3111, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:35:00', '2021-02-20 15:35:00', 6, 1, '', '', '2021-02-08 18:30:34', '', '2021-02-08 18:30:34', b'0'); -INSERT INTO `inf_job_log` VALUES (3112, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:36:00', '2021-02-20 15:36:00', 7, 1, '', '', '2021-02-08 18:31:35', '', '2021-02-08 18:31:35', b'0'); -INSERT INTO `inf_job_log` VALUES (3113, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:37:00', '2021-02-20 15:37:00', 4, 1, '', '', '2021-02-08 18:32:35', '', '2021-02-08 18:32:35', b'0'); -INSERT INTO `inf_job_log` VALUES (3114, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:38:00', '2021-02-20 15:38:00', 5, 1, '', '', '2021-02-08 18:33:35', '', '2021-02-08 18:33:35', b'0'); -INSERT INTO `inf_job_log` VALUES (3115, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:39:00', '2021-02-20 15:39:00', 4, 1, '', '', '2021-02-08 18:34:35', '', '2021-02-08 18:34:35', b'0'); -INSERT INTO `inf_job_log` VALUES (3116, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:40:00', '2021-02-20 15:40:00', 4, 1, '', '', '2021-02-08 18:35:35', '', '2021-02-08 18:35:35', b'0'); -INSERT INTO `inf_job_log` VALUES (3117, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:41:00', '2021-02-20 15:41:00', 5, 1, '', '', '2021-02-08 18:36:35', '', '2021-02-08 18:36:35', b'0'); -INSERT INTO `inf_job_log` VALUES (3118, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:42:00', '2021-02-20 15:42:00', 4, 1, '', '', '2021-02-08 18:37:35', '', '2021-02-08 18:37:35', b'0'); -INSERT INTO `inf_job_log` VALUES (3119, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:43:00', '2021-02-20 15:43:00', 4, 1, '', '', '2021-02-08 18:38:35', '', '2021-02-08 18:38:35', b'0'); -INSERT INTO `inf_job_log` VALUES (3120, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:44:00', '2021-02-20 15:44:00', 5, 1, '', '', '2021-02-08 18:39:35', '', '2021-02-08 18:39:35', b'0'); -INSERT INTO `inf_job_log` VALUES (3121, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:45:00', '2021-02-20 15:45:00', 5, 1, '', '', '2021-02-08 18:40:35', '', '2021-02-08 18:40:35', b'0'); -INSERT INTO `inf_job_log` VALUES (3122, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:46:00', '2021-02-20 15:46:00', 4, 1, '', '', '2021-02-08 18:41:35', '', '2021-02-08 18:41:35', b'0'); -INSERT INTO `inf_job_log` VALUES (3123, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:47:00', '2021-02-20 15:47:00', 4, 1, '', '', '2021-02-08 18:42:35', '', '2021-02-08 18:42:35', b'0'); -INSERT INTO `inf_job_log` VALUES (3124, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:48:00', '2021-02-20 15:48:00', 5, 1, '', '', '2021-02-08 18:43:35', '', '2021-02-08 18:43:35', b'0'); -INSERT INTO `inf_job_log` VALUES (3125, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:49:17', '2021-02-20 15:49:17', 55, 1, '', '', '2021-02-08 18:44:52', '', '2021-02-08 18:44:52', b'0'); -INSERT INTO `inf_job_log` VALUES (3126, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:50:32', '2021-02-20 15:50:32', 33, 1, '', '', '2021-02-08 18:46:08', '', '2021-02-08 18:46:08', b'0'); -INSERT INTO `inf_job_log` VALUES (3127, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:51:00', '2021-02-20 15:51:00', 7, 1, '', '', '2021-02-08 18:46:36', '', '2021-02-08 18:46:36', b'0'); -INSERT INTO `inf_job_log` VALUES (3128, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:52:00', '2021-02-20 15:52:00', 9, 1, '', '', '2021-02-08 18:47:36', '', '2021-02-08 18:47:36', b'0'); -INSERT INTO `inf_job_log` VALUES (3129, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:53:00', '2021-02-20 15:53:00', 6, 1, '', '', '2021-02-08 18:48:36', '', '2021-02-08 18:48:36', b'0'); -INSERT INTO `inf_job_log` VALUES (3130, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:54:00', '2021-02-20 15:54:00', 4, 1, '', '', '2021-02-08 18:49:36', '', '2021-02-08 18:49:36', b'0'); -INSERT INTO `inf_job_log` VALUES (3131, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:55:00', '2021-02-20 15:55:00', 8, 1, '', '', '2021-02-08 18:50:36', '', '2021-02-08 18:50:36', b'0'); -INSERT INTO `inf_job_log` VALUES (3132, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:56:00', '2021-02-20 15:56:00', 5, 1, '', '', '2021-02-08 18:51:36', '', '2021-02-08 18:51:36', b'0'); -INSERT INTO `inf_job_log` VALUES (3133, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:57:00', '2021-02-20 15:57:00', 7, 1, '', '', '2021-02-08 18:52:36', '', '2021-02-08 18:52:36', b'0'); -INSERT INTO `inf_job_log` VALUES (3134, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:58:00', '2021-02-20 15:58:00', 6, 1, '', '', '2021-02-08 18:53:36', '', '2021-02-08 18:53:36', b'0'); -INSERT INTO `inf_job_log` VALUES (3135, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 15:59:00', '2021-02-20 15:59:00', 5, 1, '', '', '2021-02-08 18:54:36', '', '2021-02-08 18:54:36', b'0'); -INSERT INTO `inf_job_log` VALUES (3136, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 16:00:00', '2021-02-20 16:00:00', 4, 1, '', '', '2021-02-08 18:55:36', '', '2021-02-08 18:55:36', b'0'); -INSERT INTO `inf_job_log` VALUES (3137, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 16:01:00', '2021-02-20 16:01:00', 6, 1, '', '', '2021-02-08 18:56:36', '', '2021-02-08 18:56:36', b'0'); -INSERT INTO `inf_job_log` VALUES (3138, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 16:02:00', '2021-02-20 16:02:00', 8, 1, '', '', '2021-02-08 18:57:36', '', '2021-02-08 18:57:36', b'0'); -INSERT INTO `inf_job_log` VALUES (3139, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 16:03:00', '2021-02-20 16:03:00', 4, 1, '', '', '2021-02-08 18:58:36', '', '2021-02-08 18:58:36', b'0'); -INSERT INTO `inf_job_log` VALUES (3140, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 16:04:00', '2021-02-20 16:04:00', 3, 1, '', '', '2021-02-08 18:59:36', '', '2021-02-08 18:59:36', b'0'); -INSERT INTO `inf_job_log` VALUES (3141, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 16:05:00', '2021-02-20 16:05:00', 5, 1, '', '', '2021-02-08 19:00:36', '', '2021-02-08 19:00:37', b'0'); -INSERT INTO `inf_job_log` VALUES (3142, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 16:06:00', '2021-02-20 16:06:00', 6, 1, '', '', '2021-02-08 19:01:37', '', '2021-02-08 19:01:37', b'0'); -INSERT INTO `inf_job_log` VALUES (3143, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 16:07:00', '2021-02-20 16:07:00', 7, 1, '', '', '2021-02-08 19:02:37', '', '2021-02-08 19:02:37', b'0'); -INSERT INTO `inf_job_log` VALUES (3144, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 16:08:00', '2021-02-20 16:08:00', 5, 1, '', '', '2021-02-08 19:03:37', '', '2021-02-08 19:03:37', b'0'); -INSERT INTO `inf_job_log` VALUES (3145, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 16:09:00', '2021-02-20 16:09:00', 5, 1, '', '', '2021-02-08 19:04:37', '', '2021-02-08 19:04:37', b'0'); -INSERT INTO `inf_job_log` VALUES (3146, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 16:10:00', '2021-02-20 16:10:00', 5, 1, '', '', '2021-02-08 19:05:37', '', '2021-02-08 19:05:37', b'0'); -INSERT INTO `inf_job_log` VALUES (3147, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 16:11:00', '2021-02-20 16:11:00', 6, 1, '', '', '2021-02-08 19:06:37', '', '2021-02-08 19:06:37', b'0'); -INSERT INTO `inf_job_log` VALUES (3148, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 16:12:00', '2021-02-20 16:12:00', 5, 1, '', '', '2021-02-08 19:07:37', '', '2021-02-08 19:07:37', b'0'); -INSERT INTO `inf_job_log` VALUES (3149, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 16:13:00', '2021-02-20 16:13:00', 5, 1, '', '', '2021-02-08 19:08:37', '', '2021-02-08 19:08:37', b'0'); -INSERT INTO `inf_job_log` VALUES (3150, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 16:14:00', '2021-02-20 16:14:00', 6, 1, '', '', '2021-02-08 19:09:37', '', '2021-02-08 19:09:37', b'0'); -INSERT INTO `inf_job_log` VALUES (3151, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 16:15:00', '2021-02-20 16:15:00', 4, 1, '', '', '2021-02-08 19:10:37', '', '2021-02-08 19:10:37', b'0'); -INSERT INTO `inf_job_log` VALUES (3152, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 16:56:55', '2021-02-20 16:56:55', 46, 1, '', '', '2021-02-08 19:52:35', '', '2021-02-08 19:52:35', b'0'); -INSERT INTO `inf_job_log` VALUES (3153, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 16:57:00', '2021-02-20 16:57:00', 7, 1, '', '', '2021-02-08 19:52:40', '', '2021-02-08 19:52:40', b'0'); -INSERT INTO `inf_job_log` VALUES (3154, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 16:58:00', '2021-02-20 16:58:00', 6, 1, '', '', '2021-02-08 19:53:40', '', '2021-02-08 19:53:40', b'0'); -INSERT INTO `inf_job_log` VALUES (3155, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 16:59:00', '2021-02-20 16:59:00', 6, 1, '', '', '2021-02-08 19:54:40', '', '2021-02-08 19:54:40', b'0'); -INSERT INTO `inf_job_log` VALUES (3156, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 17:00:00', '2021-02-20 17:00:00', 47, 1, '', '', '2021-02-08 19:55:40', '', '2021-02-08 19:55:40', b'0'); -INSERT INTO `inf_job_log` VALUES (3157, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 17:05:54', '2021-02-20 17:05:54', 38, 1, '', '', '2021-02-08 20:01:34', '', '2021-02-08 20:01:34', b'0'); -INSERT INTO `inf_job_log` VALUES (3158, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 17:06:00', '2021-02-20 17:06:00', 7, 1, '', '', '2021-02-08 20:01:41', '', '2021-02-08 20:01:41', b'0'); -INSERT INTO `inf_job_log` VALUES (3159, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 17:07:00', '2021-02-20 17:07:00', 7, 1, '', '', '2021-02-08 20:02:41', '', '2021-02-08 20:02:41', b'0'); -INSERT INTO `inf_job_log` VALUES (3160, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 17:08:00', '2021-02-20 17:08:00', 13, 1, '', '', '2021-02-08 20:03:41', '', '2021-02-08 20:03:41', b'0'); -INSERT INTO `inf_job_log` VALUES (3161, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 17:09:00', '2021-02-20 17:09:00', 4, 1, '', '', '2021-02-08 20:04:41', '', '2021-02-08 20:04:41', b'0'); -INSERT INTO `inf_job_log` VALUES (3162, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 17:10:00', '2021-02-20 17:10:00', 5, 1, '', '', '2021-02-08 20:05:41', '', '2021-02-08 20:05:41', b'0'); -INSERT INTO `inf_job_log` VALUES (3163, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 17:11:00', '2021-02-20 17:11:00', 5, 1, '', '', '2021-02-08 20:06:41', '', '2021-02-08 20:06:41', b'0'); -INSERT INTO `inf_job_log` VALUES (3164, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 17:12:00', '2021-02-20 17:12:00', 4, 1, '', '', '2021-02-08 20:07:41', '', '2021-02-08 20:07:41', b'0'); -INSERT INTO `inf_job_log` VALUES (3165, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 17:13:00', '2021-02-20 17:13:00', 4, 1, '', '', '2021-02-08 20:08:41', '', '2021-02-08 20:08:41', b'0'); -INSERT INTO `inf_job_log` VALUES (3166, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 17:14:00', '2021-02-20 17:14:00', 4, 1, '', '', '2021-02-08 20:09:41', '', '2021-02-08 20:09:41', b'0'); -INSERT INTO `inf_job_log` VALUES (3167, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 17:15:00', '2021-02-20 17:15:00', 6, 1, '', '', '2021-02-08 20:10:41', '', '2021-02-08 20:10:41', b'0'); -INSERT INTO `inf_job_log` VALUES (3168, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 17:16:00', '2021-02-20 17:16:00', 4, 1, '', '', '2021-02-08 20:11:41', '', '2021-02-08 20:11:41', b'0'); -INSERT INTO `inf_job_log` VALUES (3169, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 17:17:00', '2021-02-20 17:17:00', 5, 1, '', '', '2021-02-08 20:12:41', '', '2021-02-08 20:12:41', b'0'); -INSERT INTO `inf_job_log` VALUES (3170, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 17:18:00', '2021-02-20 17:18:00', 5, 1, '', '', '2021-02-08 20:13:42', '', '2021-02-08 20:13:42', b'0'); -INSERT INTO `inf_job_log` VALUES (3171, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 17:19:00', '2021-02-20 17:19:00', 10, 1, '', '', '2021-02-08 20:14:42', '', '2021-02-08 20:14:42', b'0'); -INSERT INTO `inf_job_log` VALUES (3172, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 17:20:00', '2021-02-20 17:20:00', 5, 1, '', '', '2021-02-08 20:15:42', '', '2021-02-08 20:15:42', b'0'); -INSERT INTO `inf_job_log` VALUES (3173, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 17:21:00', '2021-02-20 17:21:00', 5, 1, '', '', '2021-02-08 20:16:42', '', '2021-02-08 20:16:42', b'0'); -INSERT INTO `inf_job_log` VALUES (3174, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 17:22:00', '2021-02-20 17:22:00', 7, 1, '', '', '2021-02-08 20:17:42', '', '2021-02-08 20:17:42', b'0'); -INSERT INTO `inf_job_log` VALUES (3175, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 17:23:00', '2021-02-20 17:23:00', 5, 1, '', '', '2021-02-08 20:18:42', '', '2021-02-08 20:18:42', b'0'); -INSERT INTO `inf_job_log` VALUES (3176, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 17:24:00', '2021-02-20 17:24:00', 6, 1, '', '', '2021-02-08 20:19:42', '', '2021-02-08 20:19:42', b'0'); -INSERT INTO `inf_job_log` VALUES (3177, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 17:25:00', '2021-02-20 17:25:00', 7, 1, '', '', '2021-02-08 20:20:42', '', '2021-02-08 20:20:42', b'0'); -INSERT INTO `inf_job_log` VALUES (3178, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 17:26:00', '2021-02-20 17:26:00', 4, 1, '', '', '2021-02-08 20:21:42', '', '2021-02-08 20:21:42', b'0'); -INSERT INTO `inf_job_log` VALUES (3179, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 17:27:00', '2021-02-20 17:27:00', 4, 1, '', '', '2021-02-08 20:22:42', '', '2021-02-08 20:22:42', b'0'); -INSERT INTO `inf_job_log` VALUES (3180, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 17:28:00', '2021-02-20 17:28:00', 4, 1, '', '', '2021-02-08 20:23:42', '', '2021-02-08 20:23:42', b'0'); -INSERT INTO `inf_job_log` VALUES (3181, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 17:29:00', '2021-02-20 17:29:00', 7, 1, '', '', '2021-02-08 20:24:42', '', '2021-02-08 20:24:42', b'0'); -INSERT INTO `inf_job_log` VALUES (3182, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 17:30:00', '2021-02-20 17:30:00', 3, 1, '', '', '2021-02-08 20:25:42', '', '2021-02-08 20:25:42', b'0'); -INSERT INTO `inf_job_log` VALUES (3183, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 17:31:00', '2021-02-20 17:31:00', 3, 1, '', '', '2021-02-08 20:26:42', '', '2021-02-08 20:26:42', b'0'); -INSERT INTO `inf_job_log` VALUES (3184, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 17:32:00', '2021-02-20 17:32:00', 4, 1, '', '', '2021-02-08 20:27:42', '', '2021-02-08 20:27:42', b'0'); -INSERT INTO `inf_job_log` VALUES (3185, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 17:33:00', '2021-02-20 17:33:00', 4, 1, '', '', '2021-02-08 20:28:43', '', '2021-02-08 20:28:43', b'0'); -INSERT INTO `inf_job_log` VALUES (3186, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 17:34:00', '2021-02-20 17:34:00', 6, 1, '', '', '2021-02-08 20:29:43', '', '2021-02-08 20:29:43', b'0'); -INSERT INTO `inf_job_log` VALUES (3187, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 17:35:01', '2021-02-20 17:35:01', 5, 1, '', '', '2021-02-08 20:30:42', '', '2021-02-08 20:30:42', b'0'); -INSERT INTO `inf_job_log` VALUES (3188, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 17:36:00', '2021-02-20 17:36:00', 6, 1, '', '', '2021-02-08 20:31:41', '', '2021-02-08 20:31:41', b'0'); -INSERT INTO `inf_job_log` VALUES (3189, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 17:37:00', '2021-02-20 17:37:00', 4, 1, '', '', '2021-02-08 20:32:41', '', '2021-02-08 20:32:41', b'0'); -INSERT INTO `inf_job_log` VALUES (3190, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 17:38:00', '2021-02-20 17:38:00', 4, 1, '', '', '2021-02-08 20:33:42', '', '2021-02-08 20:33:42', b'0'); -INSERT INTO `inf_job_log` VALUES (3191, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 17:39:00', '2021-02-20 17:39:00', 3, 1, '', '', '2021-02-08 20:34:42', '', '2021-02-08 20:34:42', b'0'); -INSERT INTO `inf_job_log` VALUES (3192, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 17:40:00', '2021-02-20 17:40:00', 4, 1, '', '', '2021-02-08 20:35:42', '', '2021-02-08 20:35:42', b'0'); -INSERT INTO `inf_job_log` VALUES (3193, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 17:41:00', '2021-02-20 17:41:00', 5, 1, '', '', '2021-02-08 20:36:42', '', '2021-02-08 20:36:42', b'0'); -INSERT INTO `inf_job_log` VALUES (3194, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 17:42:00', '2021-02-20 17:42:00', 4, 1, '', '', '2021-02-08 20:37:42', '', '2021-02-08 20:37:42', b'0'); -INSERT INTO `inf_job_log` VALUES (3195, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 17:43:00', '2021-02-20 17:43:00', 4, 1, '', '', '2021-02-08 20:38:42', '', '2021-02-08 20:38:42', b'0'); -INSERT INTO `inf_job_log` VALUES (3196, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 17:44:00', '2021-02-20 17:44:00', 4, 1, '', '', '2021-02-08 20:39:42', '', '2021-02-08 20:39:42', b'0'); -INSERT INTO `inf_job_log` VALUES (3197, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 17:45:00', '2021-02-20 17:45:00', 6, 1, '', '', '2021-02-08 20:40:42', '', '2021-02-08 20:40:42', b'0'); -INSERT INTO `inf_job_log` VALUES (3198, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 17:46:00', '2021-02-20 17:46:00', 4, 1, '', '', '2021-02-08 20:41:42', '', '2021-02-08 20:41:42', b'0'); -INSERT INTO `inf_job_log` VALUES (3199, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 17:47:00', '2021-02-20 17:47:00', 6, 1, '', '', '2021-02-08 20:42:42', '', '2021-02-08 20:42:42', b'0'); -INSERT INTO `inf_job_log` VALUES (3200, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 17:48:00', '2021-02-20 17:48:00', 4, 1, '', '', '2021-02-08 20:43:42', '', '2021-02-08 20:43:42', b'0'); -INSERT INTO `inf_job_log` VALUES (3201, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 17:49:00', '2021-02-20 17:49:00', 18, 1, '', '', '2021-02-08 20:44:42', '', '2021-02-08 20:44:42', b'0'); -INSERT INTO `inf_job_log` VALUES (3202, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 20:13:34', '2021-02-20 20:13:34', 36, 1, '', '', '2021-02-08 23:09:26', '', '2021-02-08 23:09:26', b'0'); -INSERT INTO `inf_job_log` VALUES (3203, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 20:14:00', '2021-02-20 20:14:00', 10, 1, '', '', '2021-02-08 23:09:52', '', '2021-02-08 23:09:52', b'0'); -INSERT INTO `inf_job_log` VALUES (3204, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 20:15:12', '2021-02-20 20:15:12', 6, 1, '', '', '2021-02-08 23:11:04', '', '2021-02-08 23:11:04', b'0'); -INSERT INTO `inf_job_log` VALUES (3205, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 20:16:52', '2021-02-20 20:16:52', 7, 1, '', '', '2021-02-08 23:12:45', '', '2021-02-08 23:12:45', b'0'); -INSERT INTO `inf_job_log` VALUES (3206, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 20:17:00', '2021-02-20 20:17:00', 8, 1, '', '', '2021-02-08 23:12:52', '', '2021-02-08 23:12:52', b'0'); -INSERT INTO `inf_job_log` VALUES (3207, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 22:07:00', '2021-02-20 22:07:00', 61, 1, '', '', '2021-02-09 00:02:51', '', '2021-02-09 00:02:51', b'0'); -INSERT INTO `inf_job_log` VALUES (3208, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 22:07:00', '2021-02-20 22:07:00', 7, 1, '', '', '2021-02-09 00:02:51', '', '2021-02-09 00:02:52', b'0'); -INSERT INTO `inf_job_log` VALUES (3209, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 22:08:00', '2021-02-20 22:08:00', 7, 1, '', '', '2021-02-09 00:03:52', '', '2021-02-09 00:03:52', b'0'); -INSERT INTO `inf_job_log` VALUES (3210, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 22:09:00', '2021-02-20 22:09:00', 5, 1, '', '', '2021-02-09 00:04:52', '', '2021-02-09 00:04:52', b'0'); -INSERT INTO `inf_job_log` VALUES (3211, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 22:10:00', '2021-02-20 22:10:00', 5, 1, '', '', '2021-02-09 00:05:52', '', '2021-02-09 00:05:52', b'0'); -INSERT INTO `inf_job_log` VALUES (3212, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 22:11:00', '2021-02-20 22:11:00', 7, 1, '', '', '2021-02-09 00:06:52', '', '2021-02-09 00:06:52', b'0'); -INSERT INTO `inf_job_log` VALUES (3213, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-20 22:12:00', '2021-02-20 22:12:00', 4, 1, '', '', '2021-02-09 00:07:52', '', '2021-02-09 00:07:52', b'0'); -INSERT INTO `inf_job_log` VALUES (3214, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 11:15:13', '2021-02-21 11:15:13', 47, 1, '', '', '2021-02-09 05:16:39', '', '2021-02-09 05:16:39', b'0'); -INSERT INTO `inf_job_log` VALUES (3215, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 11:17:05', '2021-02-21 11:17:05', 6, 1, '', '', '2021-02-09 05:18:31', '', '2021-02-09 05:18:31', b'0'); -INSERT INTO `inf_job_log` VALUES (3216, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 11:17:05', '2021-02-21 11:17:05', 6, 1, '', '', '2021-02-09 05:18:31', '', '2021-02-09 05:18:31', b'0'); -INSERT INTO `inf_job_log` VALUES (3217, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 11:24:38', '2021-02-21 11:24:38', 40, 1, '', '', '2021-02-09 05:26:05', '', '2021-02-09 05:26:05', b'0'); -INSERT INTO `inf_job_log` VALUES (3218, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 11:25:00', '2021-02-21 11:25:00', 7, 1, '', '', '2021-02-09 05:26:27', '', '2021-02-09 05:26:27', b'0'); -INSERT INTO `inf_job_log` VALUES (3219, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 11:26:00', '2021-02-21 11:26:00', 6, 1, '', '', '2021-02-09 05:27:27', '', '2021-02-09 05:27:27', b'0'); -INSERT INTO `inf_job_log` VALUES (3220, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 11:27:00', '2021-02-21 11:27:00', 40, 1, '', '', '2021-02-09 05:28:27', '', '2021-02-09 05:28:27', b'0'); -INSERT INTO `inf_job_log` VALUES (3221, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 11:28:00', '2021-02-21 11:28:00', 5, 1, '', '', '2021-02-09 05:29:27', '', '2021-02-09 05:29:27', b'0'); -INSERT INTO `inf_job_log` VALUES (3222, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 11:29:00', '2021-02-21 11:29:00', 13, 1, '', '', '2021-02-09 05:30:27', '', '2021-02-09 05:30:27', b'0'); -INSERT INTO `inf_job_log` VALUES (3223, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 11:30:00', '2021-02-21 11:30:00', 5, 1, '', '', '2021-02-09 05:31:27', '', '2021-02-09 05:31:27', b'0'); -INSERT INTO `inf_job_log` VALUES (3224, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 11:31:21', '2021-02-21 11:31:21', 54, 1, '', '', '2021-02-09 05:32:49', '', '2021-02-09 05:32:49', b'0'); -INSERT INTO `inf_job_log` VALUES (3225, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 11:45:33', '2021-02-21 11:45:33', 7, 1, '', '', '2021-02-09 05:47:01', '', '2021-02-09 05:47:01', b'0'); -INSERT INTO `inf_job_log` VALUES (3226, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 11:46:00', '2021-02-21 11:46:00', 10, 1, '', '', '2021-02-09 05:47:28', '', '2021-02-09 05:47:28', b'0'); -INSERT INTO `inf_job_log` VALUES (3227, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 11:52:13', '2021-02-21 11:52:13', 43, 1, '', '', '2021-02-09 05:53:42', '', '2021-02-09 05:53:42', b'0'); -INSERT INTO `inf_job_log` VALUES (3228, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 11:53:00', '2021-02-21 11:53:00', 5, 1, '', '', '2021-02-09 05:54:29', '', '2021-02-09 05:54:29', b'0'); -INSERT INTO `inf_job_log` VALUES (3229, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 13:09:32', '2021-02-21 13:09:32', 47, 1, '', '', '2021-02-09 06:37:44', '', '2021-02-09 06:37:44', b'0'); -INSERT INTO `inf_job_log` VALUES (3230, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 13:10:29', '2021-02-21 13:10:29', 6, 1, '', '', '2021-02-09 06:38:41', '', '2021-02-09 06:38:41', b'0'); -INSERT INTO `inf_job_log` VALUES (3231, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 13:11:00', '2021-02-21 13:11:00', 34, 1, '', '', '2021-02-09 06:39:12', '', '2021-02-09 06:39:12', b'0'); -INSERT INTO `inf_job_log` VALUES (3232, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 13:28:37', '2021-02-21 13:28:37', 38, 1, '', '', '2021-02-09 06:56:50', '', '2021-02-09 06:56:50', b'0'); -INSERT INTO `inf_job_log` VALUES (3233, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 13:29:03', '2021-02-21 13:29:03', 7, 1, '', '', '2021-02-09 06:57:16', '', '2021-02-09 06:57:16', b'0'); -INSERT INTO `inf_job_log` VALUES (3234, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 21:27:48', '2021-02-21 21:27:48', 30, 1, '', '', '2021-02-09 10:32:57', '', '2021-02-09 10:32:57', b'0'); -INSERT INTO `inf_job_log` VALUES (3235, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 21:28:00', '2021-02-21 21:28:00', 6, 1, '', '', '2021-02-09 10:33:09', '', '2021-02-09 10:33:09', b'0'); -INSERT INTO `inf_job_log` VALUES (3236, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 21:29:00', '2021-02-21 21:29:00', 5, 1, '', '', '2021-02-09 10:34:09', '', '2021-02-09 10:34:09', b'0'); -INSERT INTO `inf_job_log` VALUES (3237, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 21:30:00', '2021-02-21 21:30:00', 6, 1, '', '', '2021-02-09 10:35:09', '', '2021-02-09 10:35:09', b'0'); -INSERT INTO `inf_job_log` VALUES (3238, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 21:31:00', '2021-02-21 21:31:00', 5, 1, '', '', '2021-02-09 10:36:09', '', '2021-02-09 10:36:09', b'0'); -INSERT INTO `inf_job_log` VALUES (3239, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 21:32:00', '2021-02-21 21:32:00', 7, 1, '', '', '2021-02-09 10:37:09', '', '2021-02-09 10:37:09', b'0'); -INSERT INTO `inf_job_log` VALUES (3240, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 21:33:00', '2021-02-21 21:33:00', 6, 1, '', '', '2021-02-09 10:38:09', '', '2021-02-09 10:38:09', b'0'); -INSERT INTO `inf_job_log` VALUES (3241, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 21:34:00', '2021-02-21 21:34:00', 7, 1, '', '', '2021-02-09 10:39:09', '', '2021-02-09 10:39:09', b'0'); -INSERT INTO `inf_job_log` VALUES (3242, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 21:35:00', '2021-02-21 21:35:00', 4, 1, '', '', '2021-02-09 10:40:09', '', '2021-02-09 10:40:10', b'0'); -INSERT INTO `inf_job_log` VALUES (3243, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 21:36:00', '2021-02-21 21:36:00', 14, 1, '', '', '2021-02-09 10:41:10', '', '2021-02-09 10:41:10', b'0'); -INSERT INTO `inf_job_log` VALUES (3244, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 21:37:00', '2021-02-21 21:37:00', 6, 1, '', '', '2021-02-09 10:42:10', '', '2021-02-09 10:42:10', b'0'); -INSERT INTO `inf_job_log` VALUES (3245, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 21:38:00', '2021-02-21 21:38:00', 5, 1, '', '', '2021-02-09 10:43:10', '', '2021-02-09 10:43:10', b'0'); -INSERT INTO `inf_job_log` VALUES (3246, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 21:39:00', '2021-02-21 21:39:00', 4, 1, '', '', '2021-02-09 10:44:10', '', '2021-02-09 10:44:10', b'0'); -INSERT INTO `inf_job_log` VALUES (3247, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 21:40:00', '2021-02-21 21:40:00', 5, 1, '', '', '2021-02-09 10:45:10', '', '2021-02-09 10:45:10', b'0'); -INSERT INTO `inf_job_log` VALUES (3248, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 21:41:00', '2021-02-21 21:41:00', 8, 1, '', '', '2021-02-09 10:46:10', '', '2021-02-09 10:46:10', b'0'); -INSERT INTO `inf_job_log` VALUES (3249, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 21:42:00', '2021-02-21 21:42:00', 6, 1, '', '', '2021-02-09 10:47:10', '', '2021-02-09 10:47:10', b'0'); -INSERT INTO `inf_job_log` VALUES (3250, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 21:43:00', '2021-02-21 21:43:00', 5, 1, '', '', '2021-02-09 10:48:10', '', '2021-02-09 10:48:10', b'0'); -INSERT INTO `inf_job_log` VALUES (3251, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 21:44:00', '2021-02-21 21:44:00', 2, 1, '', '', '2021-02-09 10:49:10', '', '2021-02-09 10:49:10', b'0'); -INSERT INTO `inf_job_log` VALUES (3252, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 21:45:00', '2021-02-21 21:45:00', 5, 1, '', '', '2021-02-09 10:50:10', '', '2021-02-09 10:50:10', b'0'); -INSERT INTO `inf_job_log` VALUES (3253, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 21:46:00', '2021-02-21 21:46:00', 5, 1, '', '', '2021-02-09 10:51:10', '', '2021-02-09 10:51:10', b'0'); -INSERT INTO `inf_job_log` VALUES (3254, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 21:47:00', '2021-02-21 21:47:00', 5, 1, '', '', '2021-02-09 10:52:10', '', '2021-02-09 10:52:10', b'0'); -INSERT INTO `inf_job_log` VALUES (3255, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 21:48:00', '2021-02-21 21:48:00', 5, 1, '', '', '2021-02-09 10:53:10', '', '2021-02-09 10:53:10', b'0'); -INSERT INTO `inf_job_log` VALUES (3256, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 21:49:00', '2021-02-21 21:49:00', 3, 1, '', '', '2021-02-09 10:54:10', '', '2021-02-09 10:54:10', b'0'); -INSERT INTO `inf_job_log` VALUES (3257, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 21:50:00', '2021-02-21 21:50:00', 3, 1, '', '', '2021-02-09 10:55:11', '', '2021-02-09 10:55:11', b'0'); -INSERT INTO `inf_job_log` VALUES (3258, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 21:51:00', '2021-02-21 21:51:00', 4, 1, '', '', '2021-02-09 10:56:11', '', '2021-02-09 10:56:11', b'0'); -INSERT INTO `inf_job_log` VALUES (3259, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 21:52:00', '2021-02-21 21:52:00', 4, 1, '', '', '2021-02-09 10:57:11', '', '2021-02-09 10:57:11', b'0'); -INSERT INTO `inf_job_log` VALUES (3260, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 21:53:00', '2021-02-21 21:53:00', 3, 1, '', '', '2021-02-09 10:58:11', '', '2021-02-09 10:58:11', b'0'); -INSERT INTO `inf_job_log` VALUES (3261, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 21:54:00', '2021-02-21 21:54:00', 4, 1, '', '', '2021-02-09 10:59:11', '', '2021-02-09 10:59:11', b'0'); -INSERT INTO `inf_job_log` VALUES (3262, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 21:55:00', '2021-02-21 21:55:00', 3, 1, '', '', '2021-02-09 11:00:11', '', '2021-02-09 11:00:11', b'0'); -INSERT INTO `inf_job_log` VALUES (3263, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 21:56:00', '2021-02-21 21:56:00', 5, 1, '', '', '2021-02-09 11:01:11', '', '2021-02-09 11:01:11', b'0'); -INSERT INTO `inf_job_log` VALUES (3264, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 21:57:00', '2021-02-21 21:57:00', 4, 1, '', '', '2021-02-09 11:02:11', '', '2021-02-09 11:02:11', b'0'); -INSERT INTO `inf_job_log` VALUES (3265, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 21:58:00', '2021-02-21 21:58:00', 5, 1, '', '', '2021-02-09 11:03:11', '', '2021-02-09 11:03:11', b'0'); -INSERT INTO `inf_job_log` VALUES (3266, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 21:59:00', '2021-02-21 21:59:00', 4, 1, '', '', '2021-02-09 11:04:11', '', '2021-02-09 11:04:11', b'0'); -INSERT INTO `inf_job_log` VALUES (3267, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:00:00', '2021-02-21 22:00:00', 7, 1, '', '', '2021-02-09 11:05:11', '', '2021-02-09 11:05:11', b'0'); -INSERT INTO `inf_job_log` VALUES (3268, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:01:00', '2021-02-21 22:01:00', 3, 1, '', '', '2021-02-09 11:06:11', '', '2021-02-09 11:06:11', b'0'); -INSERT INTO `inf_job_log` VALUES (3269, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:02:00', '2021-02-21 22:02:00', 5, 1, '', '', '2021-02-09 11:07:11', '', '2021-02-09 11:07:11', b'0'); -INSERT INTO `inf_job_log` VALUES (3270, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:03:00', '2021-02-21 22:03:00', 5, 1, '', '', '2021-02-09 11:08:11', '', '2021-02-09 11:08:11', b'0'); -INSERT INTO `inf_job_log` VALUES (3271, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:04:00', '2021-02-21 22:04:00', 4, 1, '', '', '2021-02-09 11:09:11', '', '2021-02-09 11:09:11', b'0'); -INSERT INTO `inf_job_log` VALUES (3272, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:05:00', '2021-02-21 22:05:00', 5, 1, '', '', '2021-02-09 11:10:12', '', '2021-02-09 11:10:12', b'0'); -INSERT INTO `inf_job_log` VALUES (3273, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:06:00', '2021-02-21 22:06:00', 4, 1, '', '', '2021-02-09 11:11:12', '', '2021-02-09 11:11:12', b'0'); -INSERT INTO `inf_job_log` VALUES (3274, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:07:00', '2021-02-21 22:07:00', 3, 1, '', '', '2021-02-09 11:12:12', '', '2021-02-09 11:12:12', b'0'); -INSERT INTO `inf_job_log` VALUES (3275, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:08:00', '2021-02-21 22:08:00', 5, 1, '', '', '2021-02-09 11:13:12', '', '2021-02-09 11:13:12', b'0'); -INSERT INTO `inf_job_log` VALUES (3276, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:09:00', '2021-02-21 22:09:00', 6, 1, '', '', '2021-02-09 11:14:12', '', '2021-02-09 11:14:12', b'0'); -INSERT INTO `inf_job_log` VALUES (3277, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:10:00', '2021-02-21 22:10:00', 4, 1, '', '', '2021-02-09 11:15:12', '', '2021-02-09 11:15:12', b'0'); -INSERT INTO `inf_job_log` VALUES (3278, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:11:00', '2021-02-21 22:11:00', 4, 1, '', '', '2021-02-09 11:16:12', '', '2021-02-09 11:16:12', b'0'); -INSERT INTO `inf_job_log` VALUES (3279, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:12:00', '2021-02-21 22:12:00', 3, 1, '', '', '2021-02-09 11:17:12', '', '2021-02-09 11:17:12', b'0'); -INSERT INTO `inf_job_log` VALUES (3280, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:13:00', '2021-02-21 22:13:00', 4, 1, '', '', '2021-02-09 11:18:12', '', '2021-02-09 11:18:12', b'0'); -INSERT INTO `inf_job_log` VALUES (3281, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:14:00', '2021-02-21 22:14:00', 3, 1, '', '', '2021-02-09 11:19:12', '', '2021-02-09 11:19:12', b'0'); -INSERT INTO `inf_job_log` VALUES (3282, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:15:00', '2021-02-21 22:15:00', 5, 1, '', '', '2021-02-09 11:20:12', '', '2021-02-09 11:20:12', b'0'); -INSERT INTO `inf_job_log` VALUES (3283, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:16:00', '2021-02-21 22:16:00', 6, 1, '', '', '2021-02-09 11:21:12', '', '2021-02-09 11:21:12', b'0'); -INSERT INTO `inf_job_log` VALUES (3284, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:17:00', '2021-02-21 22:17:00', 3, 1, '', '', '2021-02-09 11:22:12', '', '2021-02-09 11:22:12', b'0'); -INSERT INTO `inf_job_log` VALUES (3285, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:18:00', '2021-02-21 22:18:00', 5, 1, '', '', '2021-02-09 11:23:12', '', '2021-02-09 11:23:12', b'0'); -INSERT INTO `inf_job_log` VALUES (3286, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:19:00', '2021-02-21 22:19:00', 5, 1, '', '', '2021-02-09 11:24:13', '', '2021-02-09 11:24:13', b'0'); -INSERT INTO `inf_job_log` VALUES (3287, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:20:00', '2021-02-21 22:20:00', 8, 1, '', '', '2021-02-09 11:25:13', '', '2021-02-09 11:25:13', b'0'); -INSERT INTO `inf_job_log` VALUES (3288, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:21:00', '2021-02-21 22:21:00', 8, 1, '', '', '2021-02-09 11:26:13', '', '2021-02-09 11:26:13', b'0'); -INSERT INTO `inf_job_log` VALUES (3289, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:22:00', '2021-02-21 22:22:00', 8, 1, '', '', '2021-02-09 11:27:13', '', '2021-02-09 11:27:13', b'0'); -INSERT INTO `inf_job_log` VALUES (3290, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:23:00', '2021-02-21 22:23:00', 5, 1, '', '', '2021-02-09 11:28:13', '', '2021-02-09 11:28:13', b'0'); -INSERT INTO `inf_job_log` VALUES (3291, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:24:00', '2021-02-21 22:24:00', 11, 1, '', '', '2021-02-09 11:29:13', '', '2021-02-09 11:29:13', b'0'); -INSERT INTO `inf_job_log` VALUES (3292, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:25:00', '2021-02-21 22:25:00', 7, 1, '', '', '2021-02-09 11:30:13', '', '2021-02-09 11:30:13', b'0'); -INSERT INTO `inf_job_log` VALUES (3293, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:26:00', '2021-02-21 22:26:00', 8, 1, '', '', '2021-02-09 11:31:13', '', '2021-02-09 11:31:13', b'0'); -INSERT INTO `inf_job_log` VALUES (3294, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:27:00', '2021-02-21 22:27:00', 4, 1, '', '', '2021-02-09 11:32:13', '', '2021-02-09 11:32:13', b'0'); -INSERT INTO `inf_job_log` VALUES (3295, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:28:00', '2021-02-21 22:28:00', 6, 1, '', '', '2021-02-09 11:33:13', '', '2021-02-09 11:33:13', b'0'); -INSERT INTO `inf_job_log` VALUES (3296, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:29:00', '2021-02-21 22:29:00', 5, 1, '', '', '2021-02-09 11:34:13', '', '2021-02-09 11:34:13', b'0'); -INSERT INTO `inf_job_log` VALUES (3297, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:30:00', '2021-02-21 22:30:00', 8, 1, '', '', '2021-02-09 11:35:13', '', '2021-02-09 11:35:13', b'0'); -INSERT INTO `inf_job_log` VALUES (3298, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:31:00', '2021-02-21 22:31:00', 5, 1, '', '', '2021-02-09 11:36:13', '', '2021-02-09 11:36:13', b'0'); -INSERT INTO `inf_job_log` VALUES (3299, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:32:00', '2021-02-21 22:32:00', 6, 1, '', '', '2021-02-09 11:37:13', '', '2021-02-09 11:37:13', b'0'); -INSERT INTO `inf_job_log` VALUES (3300, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:33:00', '2021-02-21 22:33:00', 4, 1, '', '', '2021-02-09 11:38:13', '', '2021-02-09 11:38:13', b'0'); -INSERT INTO `inf_job_log` VALUES (3301, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:34:00', '2021-02-21 22:34:00', 8, 1, '', '', '2021-02-09 11:39:14', '', '2021-02-09 11:39:14', b'0'); -INSERT INTO `inf_job_log` VALUES (3302, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:35:00', '2021-02-21 22:35:00', 4, 1, '', '', '2021-02-09 11:40:14', '', '2021-02-09 11:40:14', b'0'); -INSERT INTO `inf_job_log` VALUES (3303, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:36:00', '2021-02-21 22:36:00', 6, 1, '', '', '2021-02-09 11:41:14', '', '2021-02-09 11:41:14', b'0'); -INSERT INTO `inf_job_log` VALUES (3304, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:37:00', '2021-02-21 22:37:00', 6, 1, '', '', '2021-02-09 11:42:14', '', '2021-02-09 11:42:14', b'0'); -INSERT INTO `inf_job_log` VALUES (3305, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:38:00', '2021-02-21 22:38:00', 6, 1, '', '', '2021-02-09 11:43:14', '', '2021-02-09 11:43:14', b'0'); -INSERT INTO `inf_job_log` VALUES (3306, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:39:00', '2021-02-21 22:39:00', 8, 1, '', '', '2021-02-09 11:44:14', '', '2021-02-09 11:44:14', b'0'); -INSERT INTO `inf_job_log` VALUES (3307, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:40:00', '2021-02-21 22:40:00', 4, 1, '', '', '2021-02-09 11:45:14', '', '2021-02-09 11:45:14', b'0'); -INSERT INTO `inf_job_log` VALUES (3308, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:41:00', '2021-02-21 22:41:00', 4, 1, '', '', '2021-02-09 11:46:14', '', '2021-02-09 11:46:14', b'0'); -INSERT INTO `inf_job_log` VALUES (3309, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:42:00', '2021-02-21 22:42:00', 4, 1, '', '', '2021-02-09 11:47:14', '', '2021-02-09 11:47:14', b'0'); -INSERT INTO `inf_job_log` VALUES (3310, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:43:00', '2021-02-21 22:43:00', 4, 1, '', '', '2021-02-09 11:48:14', '', '2021-02-09 11:48:14', b'0'); -INSERT INTO `inf_job_log` VALUES (3311, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:44:00', '2021-02-21 22:44:00', 3, 1, '', '', '2021-02-09 11:49:14', '', '2021-02-09 11:49:14', b'0'); -INSERT INTO `inf_job_log` VALUES (3312, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:45:00', '2021-02-21 22:45:00', 3, 1, '', '', '2021-02-09 11:50:14', '', '2021-02-09 11:50:14', b'0'); -INSERT INTO `inf_job_log` VALUES (3313, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:46:00', '2021-02-21 22:46:00', 3, 1, '', '', '2021-02-09 11:51:14', '', '2021-02-09 11:51:14', b'0'); -INSERT INTO `inf_job_log` VALUES (3314, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:47:00', '2021-02-21 22:47:00', 3, 1, '', '', '2021-02-09 11:52:14', '', '2021-02-09 11:52:14', b'0'); -INSERT INTO `inf_job_log` VALUES (3315, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:48:00', '2021-02-21 22:48:00', 4, 1, '', '', '2021-02-09 11:53:15', '', '2021-02-09 11:53:15', b'0'); -INSERT INTO `inf_job_log` VALUES (3316, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:49:00', '2021-02-21 22:49:00', 4, 1, '', '', '2021-02-09 11:54:15', '', '2021-02-09 11:54:15', b'0'); -INSERT INTO `inf_job_log` VALUES (3317, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:50:00', '2021-02-21 22:50:00', 4, 1, '', '', '2021-02-09 11:55:15', '', '2021-02-09 11:55:15', b'0'); -INSERT INTO `inf_job_log` VALUES (3318, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:51:00', '2021-02-21 22:51:00', 4, 1, '', '', '2021-02-09 11:56:15', '', '2021-02-09 11:56:15', b'0'); -INSERT INTO `inf_job_log` VALUES (3319, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:52:00', '2021-02-21 22:52:00', 5, 1, '', '', '2021-02-09 11:57:15', '', '2021-02-09 11:57:15', b'0'); -INSERT INTO `inf_job_log` VALUES (3320, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:53:00', '2021-02-21 22:53:00', 3, 1, '', '', '2021-02-09 11:58:15', '', '2021-02-09 11:58:15', b'0'); -INSERT INTO `inf_job_log` VALUES (3321, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:54:00', '2021-02-21 22:54:00', 6, 1, '', '', '2021-02-09 11:59:15', '', '2021-02-09 11:59:15', b'0'); -INSERT INTO `inf_job_log` VALUES (3322, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:55:00', '2021-02-21 22:55:00', 6, 1, '', '', '2021-02-09 12:00:15', '', '2021-02-09 12:00:15', b'0'); -INSERT INTO `inf_job_log` VALUES (3323, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:56:00', '2021-02-21 22:56:00', 3, 1, '', '', '2021-02-09 12:01:15', '', '2021-02-09 12:01:15', b'0'); -INSERT INTO `inf_job_log` VALUES (3324, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:57:00', '2021-02-21 22:57:00', 4, 1, '', '', '2021-02-09 12:02:15', '', '2021-02-09 12:02:15', b'0'); -INSERT INTO `inf_job_log` VALUES (3325, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:58:00', '2021-02-21 22:58:00', 3, 1, '', '', '2021-02-09 12:03:15', '', '2021-02-09 12:03:15', b'0'); -INSERT INTO `inf_job_log` VALUES (3326, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 22:59:00', '2021-02-21 22:59:00', 4, 1, '', '', '2021-02-09 12:04:15', '', '2021-02-09 12:04:15', b'0'); -INSERT INTO `inf_job_log` VALUES (3327, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:00:00', '2021-02-21 23:00:00', 3, 1, '', '', '2021-02-09 12:05:15', '', '2021-02-09 12:05:15', b'0'); -INSERT INTO `inf_job_log` VALUES (3328, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:01:00', '2021-02-21 23:01:00', 3, 1, '', '', '2021-02-09 12:06:15', '', '2021-02-09 12:06:15', b'0'); -INSERT INTO `inf_job_log` VALUES (3329, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:02:00', '2021-02-21 23:02:00', 3, 1, '', '', '2021-02-09 12:07:15', '', '2021-02-09 12:07:15', b'0'); -INSERT INTO `inf_job_log` VALUES (3330, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:03:00', '2021-02-21 23:03:00', 3, 1, '', '', '2021-02-09 12:08:16', '', '2021-02-09 12:08:16', b'0'); -INSERT INTO `inf_job_log` VALUES (3331, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:04:00', '2021-02-21 23:04:00', 3, 1, '', '', '2021-02-09 12:09:16', '', '2021-02-09 12:09:16', b'0'); -INSERT INTO `inf_job_log` VALUES (3332, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:05:00', '2021-02-21 23:05:00', 3, 1, '', '', '2021-02-09 12:10:16', '', '2021-02-09 12:10:16', b'0'); -INSERT INTO `inf_job_log` VALUES (3333, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:06:00', '2021-02-21 23:06:00', 4, 1, '', '', '2021-02-09 12:11:16', '', '2021-02-09 12:11:16', b'0'); -INSERT INTO `inf_job_log` VALUES (3334, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:07:00', '2021-02-21 23:07:00', 3, 1, '', '', '2021-02-09 12:12:16', '', '2021-02-09 12:12:16', b'0'); -INSERT INTO `inf_job_log` VALUES (3335, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:08:00', '2021-02-21 23:08:00', 3, 1, '', '', '2021-02-09 12:13:16', '', '2021-02-09 12:13:16', b'0'); -INSERT INTO `inf_job_log` VALUES (3336, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:09:00', '2021-02-21 23:09:00', 4, 1, '', '', '2021-02-09 12:14:16', '', '2021-02-09 12:14:16', b'0'); -INSERT INTO `inf_job_log` VALUES (3337, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:10:00', '2021-02-21 23:10:00', 2, 1, '', '', '2021-02-09 12:15:16', '', '2021-02-09 12:15:16', b'0'); -INSERT INTO `inf_job_log` VALUES (3338, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:11:00', '2021-02-21 23:11:00', 3, 1, '', '', '2021-02-09 12:16:16', '', '2021-02-09 12:16:16', b'0'); -INSERT INTO `inf_job_log` VALUES (3339, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:12:00', '2021-02-21 23:12:00', 4, 1, '', '', '2021-02-09 12:17:16', '', '2021-02-09 12:17:16', b'0'); -INSERT INTO `inf_job_log` VALUES (3340, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:13:00', '2021-02-21 23:13:00', 3, 1, '', '', '2021-02-09 12:18:16', '', '2021-02-09 12:18:16', b'0'); -INSERT INTO `inf_job_log` VALUES (3341, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:14:00', '2021-02-21 23:14:00', 4, 1, '', '', '2021-02-09 12:19:16', '', '2021-02-09 12:19:16', b'0'); -INSERT INTO `inf_job_log` VALUES (3342, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:15:00', '2021-02-21 23:15:00', 4, 1, '', '', '2021-02-09 12:20:16', '', '2021-02-09 12:20:16', b'0'); -INSERT INTO `inf_job_log` VALUES (3343, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:16:00', '2021-02-21 23:16:00', 4, 1, '', '', '2021-02-09 12:21:16', '', '2021-02-09 12:21:16', b'0'); -INSERT INTO `inf_job_log` VALUES (3344, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:17:00', '2021-02-21 23:17:00', 3, 1, '', '', '2021-02-09 12:22:16', '', '2021-02-09 12:22:16', b'0'); -INSERT INTO `inf_job_log` VALUES (3345, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:18:00', '2021-02-21 23:18:00', 4, 1, '', '', '2021-02-09 12:23:17', '', '2021-02-09 12:23:17', b'0'); -INSERT INTO `inf_job_log` VALUES (3346, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:19:00', '2021-02-21 23:19:00', 4, 1, '', '', '2021-02-09 12:24:17', '', '2021-02-09 12:24:17', b'0'); -INSERT INTO `inf_job_log` VALUES (3347, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:20:00', '2021-02-21 23:20:00', 2, 1, '', '', '2021-02-09 12:25:17', '', '2021-02-09 12:25:17', b'0'); -INSERT INTO `inf_job_log` VALUES (3348, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:21:00', '2021-02-21 23:21:00', 3, 1, '', '', '2021-02-09 12:26:17', '', '2021-02-09 12:26:17', b'0'); -INSERT INTO `inf_job_log` VALUES (3349, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:22:00', '2021-02-21 23:22:00', 4, 1, '', '', '2021-02-09 12:27:17', '', '2021-02-09 12:27:17', b'0'); -INSERT INTO `inf_job_log` VALUES (3350, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:23:00', '2021-02-21 23:23:00', 6, 1, '', '', '2021-02-09 12:28:17', '', '2021-02-09 12:28:17', b'0'); -INSERT INTO `inf_job_log` VALUES (3351, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:24:00', '2021-02-21 23:24:00', 3, 1, '', '', '2021-02-09 12:29:17', '', '2021-02-09 12:29:17', b'0'); -INSERT INTO `inf_job_log` VALUES (3352, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:25:00', '2021-02-21 23:25:00', 5, 1, '', '', '2021-02-09 12:30:17', '', '2021-02-09 12:30:17', b'0'); -INSERT INTO `inf_job_log` VALUES (3353, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:26:00', '2021-02-21 23:26:00', 4, 1, '', '', '2021-02-09 12:31:17', '', '2021-02-09 12:31:17', b'0'); -INSERT INTO `inf_job_log` VALUES (3354, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:27:00', '2021-02-21 23:27:00', 4, 1, '', '', '2021-02-09 12:32:17', '', '2021-02-09 12:32:17', b'0'); -INSERT INTO `inf_job_log` VALUES (3355, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:28:00', '2021-02-21 23:28:00', 4, 1, '', '', '2021-02-09 12:33:17', '', '2021-02-09 12:33:17', b'0'); -INSERT INTO `inf_job_log` VALUES (3356, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:29:00', '2021-02-21 23:29:00', 3, 1, '', '', '2021-02-09 12:34:17', '', '2021-02-09 12:34:17', b'0'); -INSERT INTO `inf_job_log` VALUES (3357, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:30:00', '2021-02-21 23:30:00', 7, 1, '', '', '2021-02-09 12:35:17', '', '2021-02-09 12:35:17', b'0'); -INSERT INTO `inf_job_log` VALUES (3358, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:31:00', '2021-02-21 23:31:00', 3, 1, '', '', '2021-02-09 12:36:17', '', '2021-02-09 12:36:17', b'0'); -INSERT INTO `inf_job_log` VALUES (3359, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:32:00', '2021-02-21 23:32:00', 3, 1, '', '', '2021-02-09 12:37:18', '', '2021-02-09 12:37:18', b'0'); -INSERT INTO `inf_job_log` VALUES (3360, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:33:00', '2021-02-21 23:33:00', 3, 1, '', '', '2021-02-09 12:38:18', '', '2021-02-09 12:38:18', b'0'); -INSERT INTO `inf_job_log` VALUES (3361, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:34:00', '2021-02-21 23:34:00', 4, 1, '', '', '2021-02-09 12:39:18', '', '2021-02-09 12:39:18', b'0'); -INSERT INTO `inf_job_log` VALUES (3362, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:35:00', '2021-02-21 23:35:00', 6, 1, '', '', '2021-02-09 12:40:18', '', '2021-02-09 12:40:18', b'0'); -INSERT INTO `inf_job_log` VALUES (3363, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:36:00', '2021-02-21 23:36:00', 4, 1, '', '', '2021-02-09 12:41:18', '', '2021-02-09 12:41:18', b'0'); -INSERT INTO `inf_job_log` VALUES (3364, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:37:00', '2021-02-21 23:37:00', 7, 1, '', '', '2021-02-09 12:42:18', '', '2021-02-09 12:42:18', b'0'); -INSERT INTO `inf_job_log` VALUES (3365, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:38:00', '2021-02-21 23:38:00', 3, 1, '', '', '2021-02-09 12:43:18', '', '2021-02-09 12:43:18', b'0'); -INSERT INTO `inf_job_log` VALUES (3366, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:39:00', '2021-02-21 23:39:00', 4, 1, '', '', '2021-02-09 12:44:18', '', '2021-02-09 12:44:18', b'0'); -INSERT INTO `inf_job_log` VALUES (3367, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:40:00', '2021-02-21 23:40:00', 4, 1, '', '', '2021-02-09 12:45:18', '', '2021-02-09 12:45:18', b'0'); -INSERT INTO `inf_job_log` VALUES (3368, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:41:00', '2021-02-21 23:41:00', 6, 1, '', '', '2021-02-09 12:46:18', '', '2021-02-09 12:46:18', b'0'); -INSERT INTO `inf_job_log` VALUES (3369, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:42:00', '2021-02-21 23:42:00', 4, 1, '', '', '2021-02-09 12:47:18', '', '2021-02-09 12:47:18', b'0'); -INSERT INTO `inf_job_log` VALUES (3370, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:43:00', '2021-02-21 23:43:00', 4, 1, '', '', '2021-02-09 12:48:18', '', '2021-02-09 12:48:18', b'0'); -INSERT INTO `inf_job_log` VALUES (3371, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:44:00', '2021-02-21 23:44:00', 3, 1, '', '', '2021-02-09 12:49:18', '', '2021-02-09 12:49:18', b'0'); -INSERT INTO `inf_job_log` VALUES (3372, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:45:00', '2021-02-21 23:45:00', 4, 1, '', '', '2021-02-09 12:50:18', '', '2021-02-09 12:50:18', b'0'); -INSERT INTO `inf_job_log` VALUES (3373, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:46:00', '2021-02-21 23:46:00', 4, 1, '', '', '2021-02-09 12:51:18', '', '2021-02-09 12:51:18', b'0'); -INSERT INTO `inf_job_log` VALUES (3374, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:47:00', '2021-02-21 23:47:00', 3, 1, '', '', '2021-02-09 12:52:19', '', '2021-02-09 12:52:19', b'0'); -INSERT INTO `inf_job_log` VALUES (3375, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:48:00', '2021-02-21 23:48:00', 5, 1, '', '', '2021-02-09 12:53:19', '', '2021-02-09 12:53:19', b'0'); -INSERT INTO `inf_job_log` VALUES (3376, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:49:00', '2021-02-21 23:49:00', 4, 1, '', '', '2021-02-09 12:54:19', '', '2021-02-09 12:54:19', b'0'); -INSERT INTO `inf_job_log` VALUES (3377, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:50:00', '2021-02-21 23:50:00', 4, 1, '', '', '2021-02-09 12:55:19', '', '2021-02-09 12:55:19', b'0'); -INSERT INTO `inf_job_log` VALUES (3378, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:51:00', '2021-02-21 23:51:00', 3, 1, '', '', '2021-02-09 12:56:19', '', '2021-02-09 12:56:19', b'0'); -INSERT INTO `inf_job_log` VALUES (3379, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:52:00', '2021-02-21 23:52:00', 3, 1, '', '', '2021-02-09 12:57:19', '', '2021-02-09 12:57:19', b'0'); -INSERT INTO `inf_job_log` VALUES (3380, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:53:00', '2021-02-21 23:53:00', 10, 1, '', '', '2021-02-09 12:58:19', '', '2021-02-09 12:58:19', b'0'); -INSERT INTO `inf_job_log` VALUES (3381, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:54:00', '2021-02-21 23:54:00', 4, 1, '', '', '2021-02-09 12:59:19', '', '2021-02-09 12:59:19', b'0'); -INSERT INTO `inf_job_log` VALUES (3382, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:55:00', '2021-02-21 23:55:00', 3, 1, '', '', '2021-02-09 13:00:19', '', '2021-02-09 13:00:19', b'0'); -INSERT INTO `inf_job_log` VALUES (3383, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:56:00', '2021-02-21 23:56:00', 5, 1, '', '', '2021-02-09 13:01:19', '', '2021-02-09 13:01:19', b'0'); -INSERT INTO `inf_job_log` VALUES (3384, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:57:00', '2021-02-21 23:57:00', 3, 1, '', '', '2021-02-09 13:02:19', '', '2021-02-09 13:02:19', b'0'); -INSERT INTO `inf_job_log` VALUES (3385, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:58:00', '2021-02-21 23:58:00', 2, 1, '', '', '2021-02-09 13:03:19', '', '2021-02-09 13:03:19', b'0'); -INSERT INTO `inf_job_log` VALUES (3386, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-21 23:59:00', '2021-02-21 23:59:00', 3, 1, '', '', '2021-02-09 13:04:19', '', '2021-02-09 13:04:19', b'0'); -INSERT INTO `inf_job_log` VALUES (3387, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 00:00:00', '2021-02-22 00:00:00', 4, 1, '', '', '2021-02-09 13:05:19', '', '2021-02-09 13:05:19', b'0'); -INSERT INTO `inf_job_log` VALUES (3388, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 00:01:00', '2021-02-22 00:01:00', 9, 1, '', '', '2021-02-09 13:06:19', '', '2021-02-09 13:06:20', b'0'); -INSERT INTO `inf_job_log` VALUES (3389, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 00:02:00', '2021-02-22 00:02:00', 4, 1, '', '', '2021-02-09 13:07:20', '', '2021-02-09 13:07:20', b'0'); -INSERT INTO `inf_job_log` VALUES (3390, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 00:03:00', '2021-02-22 00:03:00', 3, 1, '', '', '2021-02-09 13:08:20', '', '2021-02-09 13:08:20', b'0'); -INSERT INTO `inf_job_log` VALUES (3391, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 00:04:00', '2021-02-22 00:04:00', 3, 1, '', '', '2021-02-09 13:09:20', '', '2021-02-09 13:09:20', b'0'); -INSERT INTO `inf_job_log` VALUES (3392, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 00:05:00', '2021-02-22 00:05:00', 2, 1, '', '', '2021-02-09 13:10:20', '', '2021-02-09 13:10:20', b'0'); -INSERT INTO `inf_job_log` VALUES (3393, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 00:06:00', '2021-02-22 00:06:00', 11, 1, '', '', '2021-02-09 13:11:20', '', '2021-02-09 13:11:20', b'0'); -INSERT INTO `inf_job_log` VALUES (3394, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 00:07:00', '2021-02-22 00:07:00', 7, 1, '', '', '2021-02-09 13:12:20', '', '2021-02-09 13:12:20', b'0'); -INSERT INTO `inf_job_log` VALUES (3395, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 00:08:00', '2021-02-22 00:08:00', 5, 1, '', '', '2021-02-09 13:13:20', '', '2021-02-09 13:13:20', b'0'); -INSERT INTO `inf_job_log` VALUES (3396, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 00:09:00', '2021-02-22 00:09:00', 3, 1, '', '', '2021-02-09 13:14:20', '', '2021-02-09 13:14:20', b'0'); -INSERT INTO `inf_job_log` VALUES (3397, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 00:10:00', '2021-02-22 00:10:00', 3, 1, '', '', '2021-02-09 13:15:20', '', '2021-02-09 13:15:20', b'0'); -INSERT INTO `inf_job_log` VALUES (3398, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 00:11:00', '2021-02-22 00:11:00', 8, 1, '', '', '2021-02-09 13:16:20', '', '2021-02-09 13:16:20', b'0'); -INSERT INTO `inf_job_log` VALUES (3399, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 00:12:00', '2021-02-22 00:12:00', 5, 1, '', '', '2021-02-09 13:17:20', '', '2021-02-09 13:17:20', b'0'); -INSERT INTO `inf_job_log` VALUES (3400, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 00:13:00', '2021-02-22 00:13:00', 3, 1, '', '', '2021-02-09 13:18:20', '', '2021-02-09 13:18:20', b'0'); -INSERT INTO `inf_job_log` VALUES (3401, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 00:14:00', '2021-02-22 00:14:00', 4, 1, '', '', '2021-02-09 13:19:20', '', '2021-02-09 13:19:20', b'0'); -INSERT INTO `inf_job_log` VALUES (3402, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 00:15:00', '2021-02-22 00:15:00', 5, 1, '', '', '2021-02-09 13:20:20', '', '2021-02-09 13:20:20', b'0'); -INSERT INTO `inf_job_log` VALUES (3403, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 00:16:00', '2021-02-22 00:16:00', 4, 1, '', '', '2021-02-09 13:21:21', '', '2021-02-09 13:21:21', b'0'); -INSERT INTO `inf_job_log` VALUES (3404, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 00:17:00', '2021-02-22 00:17:00', 6, 1, '', '', '2021-02-09 13:22:21', '', '2021-02-09 13:22:21', b'0'); -INSERT INTO `inf_job_log` VALUES (3405, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 00:18:00', '2021-02-22 00:18:00', 7, 1, '', '', '2021-02-09 13:23:21', '', '2021-02-09 13:23:21', b'0'); -INSERT INTO `inf_job_log` VALUES (3406, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 00:19:00', '2021-02-22 00:19:00', 4, 1, '', '', '2021-02-09 13:24:21', '', '2021-02-09 13:24:21', b'0'); -INSERT INTO `inf_job_log` VALUES (3407, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 00:20:00', '2021-02-22 00:20:00', 3, 1, '', '', '2021-02-09 13:25:21', '', '2021-02-09 13:25:21', b'0'); -INSERT INTO `inf_job_log` VALUES (3408, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 00:21:00', '2021-02-22 00:21:00', 4, 1, '', '', '2021-02-09 13:26:21', '', '2021-02-09 13:26:21', b'0'); -INSERT INTO `inf_job_log` VALUES (3409, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 00:22:00', '2021-02-22 00:22:00', 4, 1, '', '', '2021-02-09 13:27:21', '', '2021-02-09 13:27:21', b'0'); -INSERT INTO `inf_job_log` VALUES (3410, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 00:23:00', '2021-02-22 00:23:00', 3, 1, '', '', '2021-02-09 13:28:21', '', '2021-02-09 13:28:21', b'0'); -INSERT INTO `inf_job_log` VALUES (3411, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 00:24:00', '2021-02-22 00:24:00', 4, 1, '', '', '2021-02-09 13:29:21', '', '2021-02-09 13:29:21', b'0'); -INSERT INTO `inf_job_log` VALUES (3412, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 00:25:00', '2021-02-22 00:25:00', 3, 1, '', '', '2021-02-09 13:30:21', '', '2021-02-09 13:30:21', b'0'); -INSERT INTO `inf_job_log` VALUES (3413, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 00:26:00', '2021-02-22 00:26:00', 4, 1, '', '', '2021-02-09 13:31:21', '', '2021-02-09 13:31:21', b'0'); -INSERT INTO `inf_job_log` VALUES (3414, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 00:27:00', '2021-02-22 00:27:00', 4, 1, '', '', '2021-02-09 13:32:21', '', '2021-02-09 13:32:21', b'0'); -INSERT INTO `inf_job_log` VALUES (3415, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 00:28:00', '2021-02-22 00:28:00', 3, 1, '', '', '2021-02-09 13:33:21', '', '2021-02-09 13:33:21', b'0'); -INSERT INTO `inf_job_log` VALUES (3416, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 00:29:00', '2021-02-22 00:29:00', 3, 1, '', '', '2021-02-09 13:34:21', '', '2021-02-09 13:34:21', b'0'); -INSERT INTO `inf_job_log` VALUES (3417, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 00:30:14', '2021-02-22 00:30:14', 31, 1, '', '', '2021-02-09 13:35:35', '', '2021-02-09 13:35:35', b'0'); -INSERT INTO `inf_job_log` VALUES (3418, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 00:31:42', '2021-02-22 00:31:42', 35, 1, '', '', '2021-02-09 13:37:04', '', '2021-02-09 13:37:04', b'0'); -INSERT INTO `inf_job_log` VALUES (3419, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 00:32:04', '2021-02-22 00:32:04', 6, 1, '', '', '2021-02-09 13:37:26', '', '2021-02-09 13:37:26', b'0'); -INSERT INTO `inf_job_log` VALUES (3420, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 00:33:07', '2021-02-22 00:33:07', 36, 1, '', '', '2021-02-09 13:38:29', '', '2021-02-09 13:38:29', b'0'); -INSERT INTO `inf_job_log` VALUES (3421, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 00:34:35', '2021-02-22 00:34:35', 33, 1, '', '', '2021-02-09 13:39:57', '', '2021-02-09 13:39:57', b'0'); -INSERT INTO `inf_job_log` VALUES (3422, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 00:35:06', '2021-02-22 00:35:06', 6, 1, '', '', '2021-02-09 13:40:28', '', '2021-02-09 13:40:28', b'0'); -INSERT INTO `inf_job_log` VALUES (3423, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 00:37:11', '2021-02-22 00:37:11', 31, 1, '', '', '2021-02-09 13:42:33', '', '2021-02-09 13:42:33', b'0'); -INSERT INTO `inf_job_log` VALUES (3424, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 00:38:10', '2021-02-22 00:38:10', 43, 1, '', '', '2021-02-09 13:43:32', '', '2021-02-09 13:43:32', b'0'); -INSERT INTO `inf_job_log` VALUES (3425, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 00:39:00', '2021-02-22 00:39:00', 6, 1, '', '', '2021-02-09 13:44:22', '', '2021-02-09 13:44:22', b'0'); -INSERT INTO `inf_job_log` VALUES (3426, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 00:51:01', '2021-02-22 00:51:01', 49, 1, '', '', '2021-02-09 13:56:24', '', '2021-02-09 13:56:24', b'0'); -INSERT INTO `inf_job_log` VALUES (3427, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 00:54:53', '2021-02-22 00:54:53', 41, 1, '', '', '2021-02-09 14:00:16', '', '2021-02-09 14:00:16', b'0'); -INSERT INTO `inf_job_log` VALUES (3428, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 00:55:00', '2021-02-22 00:55:00', 5, 1, '', '', '2021-02-09 14:00:23', '', '2021-02-09 14:00:23', b'0'); -INSERT INTO `inf_job_log` VALUES (3429, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 00:56:00', '2021-02-22 00:56:00', 5, 1, '', '', '2021-02-09 14:01:23', '', '2021-02-09 14:01:23', b'0'); -INSERT INTO `inf_job_log` VALUES (3430, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 00:57:00', '2021-02-22 00:57:00', 5, 1, '', '', '2021-02-09 14:02:23', '', '2021-02-09 14:02:23', b'0'); -INSERT INTO `inf_job_log` VALUES (3431, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 00:58:00', '2021-02-22 00:58:00', 4, 1, '', '', '2021-02-09 14:03:23', '', '2021-02-09 14:03:23', b'0'); -INSERT INTO `inf_job_log` VALUES (3432, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 00:59:00', '2021-02-22 00:59:00', 6, 1, '', '', '2021-02-09 14:04:24', '', '2021-02-09 14:04:24', b'0'); -INSERT INTO `inf_job_log` VALUES (3433, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 01:00:00', '2021-02-22 01:00:00', 5, 1, '', '', '2021-02-09 14:05:24', '', '2021-02-09 14:05:24', b'0'); -INSERT INTO `inf_job_log` VALUES (3434, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 01:01:00', '2021-02-22 01:01:00', 4, 1, '', '', '2021-02-09 14:06:24', '', '2021-02-09 14:06:24', b'0'); -INSERT INTO `inf_job_log` VALUES (3435, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 01:02:00', '2021-02-22 01:02:00', 4, 1, '', '', '2021-02-09 14:07:24', '', '2021-02-09 14:07:24', b'0'); -INSERT INTO `inf_job_log` VALUES (3436, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 01:03:00', '2021-02-22 01:03:00', 4, 1, '', '', '2021-02-09 14:08:24', '', '2021-02-09 14:08:24', b'0'); -INSERT INTO `inf_job_log` VALUES (3437, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 01:04:00', '2021-02-22 01:04:00', 4, 1, '', '', '2021-02-09 14:09:24', '', '2021-02-09 14:09:24', b'0'); -INSERT INTO `inf_job_log` VALUES (3438, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 01:05:00', '2021-02-22 01:05:00', 4, 1, '', '', '2021-02-09 14:10:24', '', '2021-02-09 14:10:24', b'0'); -INSERT INTO `inf_job_log` VALUES (3439, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 01:06:00', '2021-02-22 01:06:00', 3, 1, '', '', '2021-02-09 14:11:24', '', '2021-02-09 14:11:24', b'0'); -INSERT INTO `inf_job_log` VALUES (3440, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 01:07:00', '2021-02-22 01:07:00', 4, 1, '', '', '2021-02-09 14:12:24', '', '2021-02-09 14:12:24', b'0'); -INSERT INTO `inf_job_log` VALUES (3441, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 01:08:00', '2021-02-22 01:08:00', 4, 1, '', '', '2021-02-09 14:13:24', '', '2021-02-09 14:13:24', b'0'); -INSERT INTO `inf_job_log` VALUES (3442, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 01:09:00', '2021-02-22 01:09:00', 4, 1, '', '', '2021-02-09 14:14:24', '', '2021-02-09 14:14:24', b'0'); -INSERT INTO `inf_job_log` VALUES (3443, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 20:09:12', '2021-02-22 20:09:12', 48, 1, '', '', '2021-02-09 17:02:29', '', '2021-02-09 17:02:29', b'0'); -INSERT INTO `inf_job_log` VALUES (3444, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 20:12:03', '2021-02-22 20:12:03', 42, 1, '', '', '2021-02-09 17:05:20', '', '2021-02-09 17:05:20', b'0'); -INSERT INTO `inf_job_log` VALUES (3445, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 20:13:00', '2021-02-22 20:13:00', 7, 1, '', '', '2021-02-09 17:06:17', '', '2021-02-09 17:06:17', b'0'); -INSERT INTO `inf_job_log` VALUES (3446, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 20:14:00', '2021-02-22 20:14:00', 29, 1, '', '', '2021-02-09 17:07:17', '', '2021-02-09 17:07:17', b'0'); -INSERT INTO `inf_job_log` VALUES (3447, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 20:15:02', '2021-02-22 20:15:02', 11, 1, '', '', '2021-02-09 17:08:19', '', '2021-02-09 17:08:19', b'0'); -INSERT INTO `inf_job_log` VALUES (3448, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 20:17:05', '2021-02-22 20:17:05', 5, 1, '', '', '2021-02-09 17:10:22', '', '2021-02-09 17:10:22', b'0'); -INSERT INTO `inf_job_log` VALUES (3449, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 20:18:00', '2021-02-22 20:18:00', 5, 1, '', '', '2021-02-09 17:11:17', '', '2021-02-09 17:11:17', b'0'); -INSERT INTO `inf_job_log` VALUES (3450, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 20:19:00', '2021-02-22 20:19:00', 33, 1, '', '', '2021-02-09 17:12:17', '', '2021-02-09 17:12:17', b'0'); -INSERT INTO `inf_job_log` VALUES (3451, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 20:20:00', '2021-02-22 20:20:00', 6, 1, '', '', '2021-02-09 17:13:17', '', '2021-02-09 17:13:17', b'0'); -INSERT INTO `inf_job_log` VALUES (3452, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 20:21:00', '2021-02-22 20:21:00', 4, 1, '', '', '2021-02-09 17:14:17', '', '2021-02-09 17:14:17', b'0'); -INSERT INTO `inf_job_log` VALUES (3453, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 20:22:00', '2021-02-22 20:22:00', 5, 1, '', '', '2021-02-09 17:15:17', '', '2021-02-09 17:15:17', b'0'); -INSERT INTO `inf_job_log` VALUES (3454, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 20:24:21', '2021-02-22 20:24:21', 13, 1, '', '', '2021-02-09 17:17:39', '', '2021-02-09 17:17:39', b'0'); -INSERT INTO `inf_job_log` VALUES (3455, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 20:24:21', '2021-02-22 20:24:21', 6, 1, '', '', '2021-02-09 17:17:39', '', '2021-02-09 17:17:39', b'0'); -INSERT INTO `inf_job_log` VALUES (3456, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 20:25:00', '2021-02-22 20:25:00', 40, 1, '', '', '2021-02-09 17:18:18', '', '2021-02-09 17:18:18', b'0'); -INSERT INTO `inf_job_log` VALUES (3457, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 20:26:34', '2021-02-22 20:26:34', 6, 1, '', '', '2021-02-09 17:19:51', '', '2021-02-09 17:19:51', b'0'); -INSERT INTO `inf_job_log` VALUES (3458, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 20:27:00', '2021-02-22 20:27:00', 32, 1, '', '', '2021-02-09 17:20:18', '', '2021-02-09 17:20:18', b'0'); -INSERT INTO `inf_job_log` VALUES (3459, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 20:28:00', '2021-02-22 20:28:00', 40, 1, '', '', '2021-02-09 17:21:18', '', '2021-02-09 17:21:18', b'0'); -INSERT INTO `inf_job_log` VALUES (3460, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 20:29:02', '2021-02-22 20:29:02', 40, 1, '', '', '2021-02-09 17:22:20', '', '2021-02-09 17:22:20', b'0'); -INSERT INTO `inf_job_log` VALUES (3461, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 20:31:46', '2021-02-22 20:31:46', 7, 1, '', '', '2021-02-09 17:25:04', '', '2021-02-09 17:25:04', b'0'); -INSERT INTO `inf_job_log` VALUES (3462, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 20:32:00', '2021-02-22 20:32:00', 8, 1, '', '', '2021-02-09 17:25:18', '', '2021-02-09 17:25:18', b'0'); -INSERT INTO `inf_job_log` VALUES (3463, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 20:33:01', '2021-02-22 20:33:01', 8, 1, '', '', '2021-02-09 17:26:19', '', '2021-02-09 17:26:19', b'0'); -INSERT INTO `inf_job_log` VALUES (3464, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 20:34:00', '2021-02-22 20:34:00', 20, 1, '', '', '2021-02-09 17:27:18', '', '2021-02-09 17:27:18', b'0'); -INSERT INTO `inf_job_log` VALUES (3465, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 20:35:52', '2021-02-22 20:35:52', 6, 1, '', '', '2021-02-09 17:29:11', '', '2021-02-09 17:29:11', b'0'); -INSERT INTO `inf_job_log` VALUES (3466, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 20:36:12', '2021-02-22 20:36:12', 34, 1, '', '', '2021-02-09 17:29:30', '', '2021-02-09 17:29:30', b'0'); -INSERT INTO `inf_job_log` VALUES (3467, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 20:37:00', '2021-02-22 20:37:00', 5, 1, '', '', '2021-02-09 17:30:18', '', '2021-02-09 17:30:18', b'0'); -INSERT INTO `inf_job_log` VALUES (3468, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-22 20:54:31', '2021-02-22 20:54:31', 44, 1, '', '', '2021-02-09 17:47:51', '', '2021-02-09 17:47:51', b'0'); -INSERT INTO `inf_job_log` VALUES (3469, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 00:05:57', '2021-02-23 00:05:58', 53, 1, '', '', '2021-02-09 20:05:18', '', '2021-02-09 20:05:18', b'0'); -INSERT INTO `inf_job_log` VALUES (3470, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 00:06:00', '2021-02-23 00:06:00', 9, 1, '', '', '2021-02-09 20:05:21', '', '2021-02-09 20:05:21', b'0'); -INSERT INTO `inf_job_log` VALUES (3471, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 00:07:00', '2021-02-23 00:07:00', 4, 1, '', '', '2021-02-09 20:06:21', '', '2021-02-09 20:06:21', b'0'); -INSERT INTO `inf_job_log` VALUES (3472, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 00:18:53', '2021-02-23 00:18:53', 65, 1, '', '', '2021-02-09 20:18:14', '', '2021-02-09 20:18:14', b'0'); -INSERT INTO `inf_job_log` VALUES (3473, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 00:19:00', '2021-02-23 00:19:00', 10, 1, '', '', '2021-02-09 20:18:22', '', '2021-02-09 20:18:22', b'0'); -INSERT INTO `inf_job_log` VALUES (3474, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 00:20:00', '2021-02-23 00:20:00', 6, 1, '', '', '2021-02-09 20:19:22', '', '2021-02-09 20:19:22', b'0'); -INSERT INTO `inf_job_log` VALUES (3475, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 00:21:00', '2021-02-23 00:21:00', 7, 1, '', '', '2021-02-09 20:20:22', '', '2021-02-09 20:20:22', b'0'); -INSERT INTO `inf_job_log` VALUES (3476, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 00:22:00', '2021-02-23 00:22:00', 7, 1, '', '', '2021-02-09 20:21:22', '', '2021-02-09 20:21:22', b'0'); -INSERT INTO `inf_job_log` VALUES (3477, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 00:23:00', '2021-02-23 00:23:00', 6, 1, '', '', '2021-02-09 20:22:22', '', '2021-02-09 20:22:22', b'0'); -INSERT INTO `inf_job_log` VALUES (3478, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 00:24:00', '2021-02-23 00:24:00', 7, 1, '', '', '2021-02-09 20:23:22', '', '2021-02-09 20:23:22', b'0'); -INSERT INTO `inf_job_log` VALUES (3479, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 00:25:00', '2021-02-23 00:25:00', 6, 1, '', '', '2021-02-09 20:24:22', '', '2021-02-09 20:24:22', b'0'); -INSERT INTO `inf_job_log` VALUES (3480, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 00:26:00', '2021-02-23 00:26:00', 6, 1, '', '', '2021-02-09 20:25:22', '', '2021-02-09 20:25:22', b'0'); -INSERT INTO `inf_job_log` VALUES (3481, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 00:27:00', '2021-02-23 00:27:00', 4, 1, '', '', '2021-02-09 20:26:22', '', '2021-02-09 20:26:22', b'0'); -INSERT INTO `inf_job_log` VALUES (3482, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 00:28:00', '2021-02-23 00:28:00', 3, 1, '', '', '2021-02-09 20:27:22', '', '2021-02-09 20:27:22', b'0'); -INSERT INTO `inf_job_log` VALUES (3483, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 00:29:00', '2021-02-23 00:29:00', 4, 1, '', '', '2021-02-09 20:28:22', '', '2021-02-09 20:28:22', b'0'); -INSERT INTO `inf_job_log` VALUES (3484, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 00:30:00', '2021-02-23 00:30:00', 6, 1, '', '', '2021-02-09 20:29:22', '', '2021-02-09 20:29:22', b'0'); -INSERT INTO `inf_job_log` VALUES (3485, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 00:31:00', '2021-02-23 00:31:00', 6, 1, '', '', '2021-02-09 20:30:23', '', '2021-02-09 20:30:23', b'0'); -INSERT INTO `inf_job_log` VALUES (3486, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 00:32:00', '2021-02-23 00:32:00', 5, 1, '', '', '2021-02-09 20:31:23', '', '2021-02-09 20:31:23', b'0'); -INSERT INTO `inf_job_log` VALUES (3487, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 00:33:00', '2021-02-23 00:33:00', 5, 1, '', '', '2021-02-09 20:32:23', '', '2021-02-09 20:32:23', b'0'); -INSERT INTO `inf_job_log` VALUES (3488, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 00:34:00', '2021-02-23 00:34:00', 5, 1, '', '', '2021-02-09 20:33:23', '', '2021-02-09 20:33:23', b'0'); -INSERT INTO `inf_job_log` VALUES (3489, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 00:35:00', '2021-02-23 00:35:00', 5, 1, '', '', '2021-02-09 20:34:23', '', '2021-02-09 20:34:23', b'0'); -INSERT INTO `inf_job_log` VALUES (3490, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 00:36:00', '2021-02-23 00:36:00', 4, 1, '', '', '2021-02-09 20:35:23', '', '2021-02-09 20:35:23', b'0'); -INSERT INTO `inf_job_log` VALUES (3491, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 00:37:00', '2021-02-23 00:37:00', 5, 1, '', '', '2021-02-09 20:36:23', '', '2021-02-09 20:36:23', b'0'); -INSERT INTO `inf_job_log` VALUES (3492, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 00:38:00', '2021-02-23 00:38:00', 7, 1, '', '', '2021-02-09 20:37:23', '', '2021-02-09 20:37:23', b'0'); -INSERT INTO `inf_job_log` VALUES (3493, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 00:39:00', '2021-02-23 00:39:00', 5, 1, '', '', '2021-02-09 20:38:23', '', '2021-02-09 20:38:23', b'0'); -INSERT INTO `inf_job_log` VALUES (3494, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 00:40:00', '2021-02-23 00:40:00', 4, 1, '', '', '2021-02-09 20:39:23', '', '2021-02-09 20:39:23', b'0'); -INSERT INTO `inf_job_log` VALUES (3495, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 00:41:00', '2021-02-23 00:41:00', 6, 1, '', '', '2021-02-09 20:40:23', '', '2021-02-09 20:40:23', b'0'); -INSERT INTO `inf_job_log` VALUES (3496, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 00:42:00', '2021-02-23 00:42:00', 3, 1, '', '', '2021-02-09 20:41:23', '', '2021-02-09 20:41:23', b'0'); -INSERT INTO `inf_job_log` VALUES (3497, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 00:43:00', '2021-02-23 00:43:00', 8, 1, '', '', '2021-02-09 20:42:23', '', '2021-02-09 20:42:23', b'0'); -INSERT INTO `inf_job_log` VALUES (3498, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 00:44:00', '2021-02-23 00:44:00', 4, 1, '', '', '2021-02-09 20:43:23', '', '2021-02-09 20:43:23', b'0'); -INSERT INTO `inf_job_log` VALUES (3499, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 00:45:00', '2021-02-23 00:45:00', 3, 1, '', '', '2021-02-09 20:44:23', '', '2021-02-09 20:44:23', b'0'); -INSERT INTO `inf_job_log` VALUES (3500, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 00:46:00', '2021-02-23 00:46:00', 5, 1, '', '', '2021-02-09 20:45:24', '', '2021-02-09 20:45:24', b'0'); -INSERT INTO `inf_job_log` VALUES (3501, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 00:47:00', '2021-02-23 00:47:00', 4, 1, '', '', '2021-02-09 20:46:24', '', '2021-02-09 20:46:24', b'0'); -INSERT INTO `inf_job_log` VALUES (3502, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 00:48:00', '2021-02-23 00:48:00', 4, 1, '', '', '2021-02-09 20:47:24', '', '2021-02-09 20:47:24', b'0'); -INSERT INTO `inf_job_log` VALUES (3503, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 00:49:00', '2021-02-23 00:49:00', 4, 1, '', '', '2021-02-09 20:48:24', '', '2021-02-09 20:48:24', b'0'); -INSERT INTO `inf_job_log` VALUES (3504, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 00:50:00', '2021-02-23 00:50:00', 3, 1, '', '', '2021-02-09 20:49:24', '', '2021-02-09 20:49:24', b'0'); -INSERT INTO `inf_job_log` VALUES (3505, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 00:51:00', '2021-02-23 00:51:00', 4, 1, '', '', '2021-02-09 20:50:24', '', '2021-02-09 20:50:24', b'0'); -INSERT INTO `inf_job_log` VALUES (3506, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 00:52:00', '2021-02-23 00:52:00', 4, 1, '', '', '2021-02-09 20:51:24', '', '2021-02-09 20:51:24', b'0'); -INSERT INTO `inf_job_log` VALUES (3507, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 00:53:00', '2021-02-23 00:53:00', 4, 1, '', '', '2021-02-09 20:52:24', '', '2021-02-09 20:52:24', b'0'); -INSERT INTO `inf_job_log` VALUES (3508, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 00:54:00', '2021-02-23 00:54:00', 3, 1, '', '', '2021-02-09 20:53:24', '', '2021-02-09 20:53:24', b'0'); -INSERT INTO `inf_job_log` VALUES (3509, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 00:55:00', '2021-02-23 00:55:00', 4, 1, '', '', '2021-02-09 20:54:24', '', '2021-02-09 20:54:24', b'0'); -INSERT INTO `inf_job_log` VALUES (3510, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 00:56:00', '2021-02-23 00:56:00', 4, 1, '', '', '2021-02-09 20:55:24', '', '2021-02-09 20:55:24', b'0'); -INSERT INTO `inf_job_log` VALUES (3511, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 00:57:00', '2021-02-23 00:57:00', 4, 1, '', '', '2021-02-09 20:56:24', '', '2021-02-09 20:56:24', b'0'); -INSERT INTO `inf_job_log` VALUES (3512, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 00:58:00', '2021-02-23 00:58:00', 5, 1, '', '', '2021-02-09 20:57:24', '', '2021-02-09 20:57:24', b'0'); -INSERT INTO `inf_job_log` VALUES (3513, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 00:59:00', '2021-02-23 00:59:00', 5, 1, '', '', '2021-02-09 20:58:24', '', '2021-02-09 20:58:24', b'0'); -INSERT INTO `inf_job_log` VALUES (3514, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:00:00', '2021-02-23 01:00:00', 3, 1, '', '', '2021-02-09 20:59:25', '', '2021-02-09 20:59:25', b'0'); -INSERT INTO `inf_job_log` VALUES (3515, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:01:00', '2021-02-23 01:01:00', 4, 1, '', '', '2021-02-09 21:00:25', '', '2021-02-09 21:00:25', b'0'); -INSERT INTO `inf_job_log` VALUES (3516, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:02:00', '2021-02-23 01:02:00', 4, 1, '', '', '2021-02-09 21:01:25', '', '2021-02-09 21:01:25', b'0'); -INSERT INTO `inf_job_log` VALUES (3517, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:03:00', '2021-02-23 01:03:00', 3, 1, '', '', '2021-02-09 21:02:25', '', '2021-02-09 21:02:25', b'0'); -INSERT INTO `inf_job_log` VALUES (3518, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:04:00', '2021-02-23 01:04:00', 6, 1, '', '', '2021-02-09 21:03:25', '', '2021-02-09 21:03:25', b'0'); -INSERT INTO `inf_job_log` VALUES (3519, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:05:00', '2021-02-23 01:05:00', 4, 1, '', '', '2021-02-09 21:04:25', '', '2021-02-09 21:04:25', b'0'); -INSERT INTO `inf_job_log` VALUES (3520, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:06:00', '2021-02-23 01:06:00', 3, 1, '', '', '2021-02-09 21:05:25', '', '2021-02-09 21:05:25', b'0'); -INSERT INTO `inf_job_log` VALUES (3521, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:07:00', '2021-02-23 01:07:00', 3, 1, '', '', '2021-02-09 21:06:25', '', '2021-02-09 21:06:25', b'0'); -INSERT INTO `inf_job_log` VALUES (3522, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:08:00', '2021-02-23 01:08:00', 6, 1, '', '', '2021-02-09 21:07:25', '', '2021-02-09 21:07:25', b'0'); -INSERT INTO `inf_job_log` VALUES (3523, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:09:00', '2021-02-23 01:09:00', 6, 1, '', '', '2021-02-09 21:08:25', '', '2021-02-09 21:08:25', b'0'); -INSERT INTO `inf_job_log` VALUES (3524, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:10:00', '2021-02-23 01:10:00', 5, 1, '', '', '2021-02-09 21:09:25', '', '2021-02-09 21:09:25', b'0'); -INSERT INTO `inf_job_log` VALUES (3525, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:11:00', '2021-02-23 01:11:00', 4, 1, '', '', '2021-02-09 21:10:25', '', '2021-02-09 21:10:25', b'0'); -INSERT INTO `inf_job_log` VALUES (3526, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:12:00', '2021-02-23 01:12:00', 3, 1, '', '', '2021-02-09 21:11:25', '', '2021-02-09 21:11:25', b'0'); -INSERT INTO `inf_job_log` VALUES (3527, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:13:00', '2021-02-23 01:13:00', 6, 1, '', '', '2021-02-09 21:12:25', '', '2021-02-09 21:12:25', b'0'); -INSERT INTO `inf_job_log` VALUES (3528, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:14:00', '2021-02-23 01:14:00', 9, 1, '', '', '2021-02-09 21:13:25', '', '2021-02-09 21:13:25', b'0'); -INSERT INTO `inf_job_log` VALUES (3529, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:15:00', '2021-02-23 01:15:00', 4, 1, '', '', '2021-02-09 21:14:26', '', '2021-02-09 21:14:26', b'0'); -INSERT INTO `inf_job_log` VALUES (3530, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:16:00', '2021-02-23 01:16:00', 3, 1, '', '', '2021-02-09 21:15:26', '', '2021-02-09 21:15:26', b'0'); -INSERT INTO `inf_job_log` VALUES (3531, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:17:00', '2021-02-23 01:17:00', 4, 1, '', '', '2021-02-09 21:16:26', '', '2021-02-09 21:16:26', b'0'); -INSERT INTO `inf_job_log` VALUES (3532, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:18:00', '2021-02-23 01:18:00', 4, 1, '', '', '2021-02-09 21:17:26', '', '2021-02-09 21:17:26', b'0'); -INSERT INTO `inf_job_log` VALUES (3533, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:19:00', '2021-02-23 01:19:00', 5, 1, '', '', '2021-02-09 21:18:26', '', '2021-02-09 21:18:26', b'0'); -INSERT INTO `inf_job_log` VALUES (3534, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:20:00', '2021-02-23 01:20:00', 5, 1, '', '', '2021-02-09 21:19:26', '', '2021-02-09 21:19:26', b'0'); -INSERT INTO `inf_job_log` VALUES (3535, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:21:00', '2021-02-23 01:21:00', 4, 1, '', '', '2021-02-09 21:20:26', '', '2021-02-09 21:20:26', b'0'); -INSERT INTO `inf_job_log` VALUES (3536, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:22:00', '2021-02-23 01:22:00', 5, 1, '', '', '2021-02-09 21:21:26', '', '2021-02-09 21:21:26', b'0'); -INSERT INTO `inf_job_log` VALUES (3537, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:23:00', '2021-02-23 01:23:00', 4, 1, '', '', '2021-02-09 21:22:26', '', '2021-02-09 21:22:26', b'0'); -INSERT INTO `inf_job_log` VALUES (3538, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:24:00', '2021-02-23 01:24:00', 4, 1, '', '', '2021-02-09 21:23:26', '', '2021-02-09 21:23:26', b'0'); -INSERT INTO `inf_job_log` VALUES (3539, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:25:00', '2021-02-23 01:25:00', 6, 1, '', '', '2021-02-09 21:24:26', '', '2021-02-09 21:24:26', b'0'); -INSERT INTO `inf_job_log` VALUES (3540, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:26:00', '2021-02-23 01:26:00', 3, 1, '', '', '2021-02-09 21:25:26', '', '2021-02-09 21:25:26', b'0'); -INSERT INTO `inf_job_log` VALUES (3541, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:27:00', '2021-02-23 01:27:00', 6, 1, '', '', '2021-02-09 21:26:26', '', '2021-02-09 21:26:26', b'0'); -INSERT INTO `inf_job_log` VALUES (3542, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:28:00', '2021-02-23 01:28:00', 4, 1, '', '', '2021-02-09 21:27:26', '', '2021-02-09 21:27:26', b'0'); -INSERT INTO `inf_job_log` VALUES (3543, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:29:00', '2021-02-23 01:29:00', 4, 1, '', '', '2021-02-09 21:28:27', '', '2021-02-09 21:28:27', b'0'); -INSERT INTO `inf_job_log` VALUES (3544, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:30:00', '2021-02-23 01:30:00', 5, 1, '', '', '2021-02-09 21:29:27', '', '2021-02-09 21:29:27', b'0'); -INSERT INTO `inf_job_log` VALUES (3545, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:31:00', '2021-02-23 01:31:00', 3, 1, '', '', '2021-02-09 21:30:27', '', '2021-02-09 21:30:27', b'0'); -INSERT INTO `inf_job_log` VALUES (3546, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:32:00', '2021-02-23 01:32:00', 5, 1, '', '', '2021-02-09 21:31:27', '', '2021-02-09 21:31:27', b'0'); -INSERT INTO `inf_job_log` VALUES (3547, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:33:00', '2021-02-23 01:33:00', 4, 1, '', '', '2021-02-09 21:32:27', '', '2021-02-09 21:32:27', b'0'); -INSERT INTO `inf_job_log` VALUES (3548, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:34:00', '2021-02-23 01:34:00', 3, 1, '', '', '2021-02-09 21:33:27', '', '2021-02-09 21:33:27', b'0'); -INSERT INTO `inf_job_log` VALUES (3549, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:35:00', '2021-02-23 01:35:00', 5, 1, '', '', '2021-02-09 21:34:27', '', '2021-02-09 21:34:27', b'0'); -INSERT INTO `inf_job_log` VALUES (3550, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:36:00', '2021-02-23 01:36:00', 3, 1, '', '', '2021-02-09 21:35:27', '', '2021-02-09 21:35:27', b'0'); -INSERT INTO `inf_job_log` VALUES (3551, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:37:00', '2021-02-23 01:37:00', 4, 1, '', '', '2021-02-09 21:36:27', '', '2021-02-09 21:36:27', b'0'); -INSERT INTO `inf_job_log` VALUES (3552, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:38:00', '2021-02-23 01:38:00', 3, 1, '', '', '2021-02-09 21:37:27', '', '2021-02-09 21:37:27', b'0'); -INSERT INTO `inf_job_log` VALUES (3553, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:39:00', '2021-02-23 01:39:00', 5, 1, '', '', '2021-02-09 21:38:27', '', '2021-02-09 21:38:27', b'0'); -INSERT INTO `inf_job_log` VALUES (3554, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:40:00', '2021-02-23 01:40:00', 6, 1, '', '', '2021-02-09 21:39:27', '', '2021-02-09 21:39:27', b'0'); -INSERT INTO `inf_job_log` VALUES (3555, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:41:00', '2021-02-23 01:41:00', 6, 1, '', '', '2021-02-09 21:40:27', '', '2021-02-09 21:40:27', b'0'); -INSERT INTO `inf_job_log` VALUES (3556, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:42:00', '2021-02-23 01:42:00', 3, 1, '', '', '2021-02-09 21:41:27', '', '2021-02-09 21:41:27', b'0'); -INSERT INTO `inf_job_log` VALUES (3557, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:43:00', '2021-02-23 01:43:00', 5, 1, '', '', '2021-02-09 21:42:27', '', '2021-02-09 21:42:27', b'0'); -INSERT INTO `inf_job_log` VALUES (3558, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:44:00', '2021-02-23 01:44:00', 3, 1, '', '', '2021-02-09 21:43:28', '', '2021-02-09 21:43:28', b'0'); -INSERT INTO `inf_job_log` VALUES (3559, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:45:00', '2021-02-23 01:45:00', 9, 1, '', '', '2021-02-09 21:44:28', '', '2021-02-09 21:44:28', b'0'); -INSERT INTO `inf_job_log` VALUES (3560, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:46:00', '2021-02-23 01:46:00', 3, 1, '', '', '2021-02-09 21:45:28', '', '2021-02-09 21:45:28', b'0'); -INSERT INTO `inf_job_log` VALUES (3561, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:47:00', '2021-02-23 01:47:00', 4, 1, '', '', '2021-02-09 21:46:28', '', '2021-02-09 21:46:28', b'0'); -INSERT INTO `inf_job_log` VALUES (3562, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:48:00', '2021-02-23 01:48:00', 4, 1, '', '', '2021-02-09 21:47:28', '', '2021-02-09 21:47:28', b'0'); -INSERT INTO `inf_job_log` VALUES (3563, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:49:00', '2021-02-23 01:49:00', 3, 1, '', '', '2021-02-09 21:48:28', '', '2021-02-09 21:48:28', b'0'); -INSERT INTO `inf_job_log` VALUES (3564, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:50:00', '2021-02-23 01:50:00', 3, 1, '', '', '2021-02-09 21:49:28', '', '2021-02-09 21:49:28', b'0'); -INSERT INTO `inf_job_log` VALUES (3565, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:51:00', '2021-02-23 01:51:00', 4, 1, '', '', '2021-02-09 21:50:28', '', '2021-02-09 21:50:28', b'0'); -INSERT INTO `inf_job_log` VALUES (3566, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:52:00', '2021-02-23 01:52:00', 4, 1, '', '', '2021-02-09 21:51:28', '', '2021-02-09 21:51:28', b'0'); -INSERT INTO `inf_job_log` VALUES (3567, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:53:00', '2021-02-23 01:53:00', 4, 1, '', '', '2021-02-09 21:52:28', '', '2021-02-09 21:52:28', b'0'); -INSERT INTO `inf_job_log` VALUES (3568, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:54:00', '2021-02-23 01:54:00', 3, 1, '', '', '2021-02-09 21:53:28', '', '2021-02-09 21:53:28', b'0'); -INSERT INTO `inf_job_log` VALUES (3569, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:55:00', '2021-02-23 01:55:00', 4, 1, '', '', '2021-02-09 21:54:28', '', '2021-02-09 21:54:28', b'0'); -INSERT INTO `inf_job_log` VALUES (3570, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:56:00', '2021-02-23 01:56:00', 3, 1, '', '', '2021-02-09 21:55:28', '', '2021-02-09 21:55:28', b'0'); -INSERT INTO `inf_job_log` VALUES (3571, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:57:00', '2021-02-23 01:57:00', 3, 1, '', '', '2021-02-09 21:56:28', '', '2021-02-09 21:56:28', b'0'); -INSERT INTO `inf_job_log` VALUES (3572, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:58:00', '2021-02-23 01:58:00', 3, 1, '', '', '2021-02-09 21:57:28', '', '2021-02-09 21:57:29', b'0'); -INSERT INTO `inf_job_log` VALUES (3573, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 01:59:00', '2021-02-23 01:59:00', 3, 1, '', '', '2021-02-09 21:58:29', '', '2021-02-09 21:58:29', b'0'); -INSERT INTO `inf_job_log` VALUES (3574, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 02:00:00', '2021-02-23 02:00:00', 4, 1, '', '', '2021-02-09 21:59:29', '', '2021-02-09 21:59:29', b'0'); -INSERT INTO `inf_job_log` VALUES (3575, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 02:01:00', '2021-02-23 02:01:00', 4, 1, '', '', '2021-02-09 22:00:29', '', '2021-02-09 22:00:29', b'0'); -INSERT INTO `inf_job_log` VALUES (3576, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 02:02:00', '2021-02-23 02:02:00', 3, 1, '', '', '2021-02-09 22:01:29', '', '2021-02-09 22:01:29', b'0'); -INSERT INTO `inf_job_log` VALUES (3577, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 02:03:00', '2021-02-23 02:03:00', 4, 1, '', '', '2021-02-09 22:02:29', '', '2021-02-09 22:02:29', b'0'); -INSERT INTO `inf_job_log` VALUES (3578, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 02:04:00', '2021-02-23 02:04:00', 3, 1, '', '', '2021-02-09 22:03:29', '', '2021-02-09 22:03:29', b'0'); -INSERT INTO `inf_job_log` VALUES (3579, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 02:05:00', '2021-02-23 02:05:00', 2, 1, '', '', '2021-02-09 22:04:29', '', '2021-02-09 22:04:29', b'0'); -INSERT INTO `inf_job_log` VALUES (3580, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 09:13:04', '2021-02-23 09:13:04', 13, 1, '', '', '2021-02-09 22:05:22', '', '2021-02-09 22:05:22', b'0'); -INSERT INTO `inf_job_log` VALUES (3581, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 09:14:00', '2021-02-23 09:14:00', 8, 1, '', '', '2021-02-09 22:06:17', '', '2021-02-09 22:06:17', b'0'); -INSERT INTO `inf_job_log` VALUES (3582, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 09:15:00', '2021-02-23 09:15:00', 3, 1, '', '', '2021-02-09 22:07:17', '', '2021-02-09 22:07:17', b'0'); -INSERT INTO `inf_job_log` VALUES (3583, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 09:16:00', '2021-02-23 09:16:00', 3, 1, '', '', '2021-02-09 22:08:17', '', '2021-02-09 22:08:17', b'0'); -INSERT INTO `inf_job_log` VALUES (3584, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 09:17:00', '2021-02-23 09:17:00', 4, 1, '', '', '2021-02-09 22:09:17', '', '2021-02-09 22:09:17', b'0'); -INSERT INTO `inf_job_log` VALUES (3585, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 09:18:00', '2021-02-23 09:18:00', 3, 1, '', '', '2021-02-09 22:10:17', '', '2021-02-09 22:10:17', b'0'); -INSERT INTO `inf_job_log` VALUES (3586, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 09:19:00', '2021-02-23 09:19:00', 4, 1, '', '', '2021-02-09 22:11:17', '', '2021-02-09 22:11:17', b'0'); -INSERT INTO `inf_job_log` VALUES (3587, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 09:20:00', '2021-02-23 09:20:00', 3, 1, '', '', '2021-02-09 22:12:17', '', '2021-02-09 22:12:17', b'0'); -INSERT INTO `inf_job_log` VALUES (3588, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 09:21:00', '2021-02-23 09:21:00', 4, 1, '', '', '2021-02-09 22:13:17', '', '2021-02-09 22:13:17', b'0'); -INSERT INTO `inf_job_log` VALUES (3589, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 09:22:00', '2021-02-23 09:22:00', 4, 1, '', '', '2021-02-09 22:14:17', '', '2021-02-09 22:14:17', b'0'); -INSERT INTO `inf_job_log` VALUES (3590, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 09:23:00', '2021-02-23 09:23:00', 4, 1, '', '', '2021-02-09 22:15:17', '', '2021-02-09 22:15:17', b'0'); -INSERT INTO `inf_job_log` VALUES (3591, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 09:24:00', '2021-02-23 09:24:00', 4, 1, '', '', '2021-02-09 22:16:17', '', '2021-02-09 22:16:17', b'0'); -INSERT INTO `inf_job_log` VALUES (3592, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 09:25:00', '2021-02-23 09:25:00', 4, 1, '', '', '2021-02-09 22:17:17', '', '2021-02-09 22:17:17', b'0'); -INSERT INTO `inf_job_log` VALUES (3593, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 09:26:00', '2021-02-23 09:26:00', 5, 1, '', '', '2021-02-09 22:18:17', '', '2021-02-09 22:18:17', b'0'); -INSERT INTO `inf_job_log` VALUES (3594, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 09:27:00', '2021-02-23 09:27:00', 2, 1, '', '', '2021-02-09 22:19:18', '', '2021-02-09 22:19:18', b'0'); -INSERT INTO `inf_job_log` VALUES (3595, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 09:28:00', '2021-02-23 09:28:00', 3, 1, '', '', '2021-02-09 22:20:18', '', '2021-02-09 22:20:18', b'0'); -INSERT INTO `inf_job_log` VALUES (3596, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 09:29:00', '2021-02-23 09:29:00', 3, 1, '', '', '2021-02-09 22:21:18', '', '2021-02-09 22:21:18', b'0'); -INSERT INTO `inf_job_log` VALUES (3597, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 09:30:00', '2021-02-23 09:30:00', 4, 1, '', '', '2021-02-09 22:22:18', '', '2021-02-09 22:22:18', b'0'); -INSERT INTO `inf_job_log` VALUES (3598, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 09:31:00', '2021-02-23 09:31:00', 4, 1, '', '', '2021-02-09 22:23:18', '', '2021-02-09 22:23:18', b'0'); -INSERT INTO `inf_job_log` VALUES (3599, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 09:32:00', '2021-02-23 09:32:00', 3, 1, '', '', '2021-02-09 22:24:19', '', '2021-02-09 22:24:19', b'0'); -INSERT INTO `inf_job_log` VALUES (3600, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 09:33:00', '2021-02-23 09:33:00', 2, 1, '', '', '2021-02-09 22:25:19', '', '2021-02-09 22:25:19', b'0'); -INSERT INTO `inf_job_log` VALUES (3601, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 09:34:00', '2021-02-23 09:34:00', 3, 1, '', '', '2021-02-09 22:26:19', '', '2021-02-09 22:26:19', b'0'); -INSERT INTO `inf_job_log` VALUES (3602, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 09:35:00', '2021-02-23 09:35:00', 3, 1, '', '', '2021-02-09 22:27:19', '', '2021-02-09 22:27:19', b'0'); -INSERT INTO `inf_job_log` VALUES (3603, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 09:36:00', '2021-02-23 09:36:00', 3, 1, '', '', '2021-02-09 22:28:19', '', '2021-02-09 22:28:19', b'0'); -INSERT INTO `inf_job_log` VALUES (3604, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 09:37:00', '2021-02-23 09:37:00', 5, 1, '', '', '2021-02-09 22:29:19', '', '2021-02-09 22:29:19', b'0'); -INSERT INTO `inf_job_log` VALUES (3605, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 09:38:00', '2021-02-23 09:38:00', 3, 1, '', '', '2021-02-09 22:30:19', '', '2021-02-09 22:30:19', b'0'); -INSERT INTO `inf_job_log` VALUES (3606, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 09:39:00', '2021-02-23 09:39:00', 6, 1, '', '', '2021-02-09 22:31:19', '', '2021-02-09 22:31:19', b'0'); -INSERT INTO `inf_job_log` VALUES (3607, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 09:40:00', '2021-02-23 09:40:00', 3, 1, '', '', '2021-02-09 22:32:19', '', '2021-02-09 22:32:19', b'0'); -INSERT INTO `inf_job_log` VALUES (3608, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 09:41:00', '2021-02-23 09:41:00', 3, 1, '', '', '2021-02-09 22:33:19', '', '2021-02-09 22:33:19', b'0'); -INSERT INTO `inf_job_log` VALUES (3609, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 09:42:00', '2021-02-23 09:42:00', 3, 1, '', '', '2021-02-09 22:34:19', '', '2021-02-09 22:34:19', b'0'); -INSERT INTO `inf_job_log` VALUES (3610, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 09:43:00', '2021-02-23 09:43:00', 4, 1, '', '', '2021-02-09 22:35:19', '', '2021-02-09 22:35:19', b'0'); -INSERT INTO `inf_job_log` VALUES (3611, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 09:44:00', '2021-02-23 09:44:00', 3, 1, '', '', '2021-02-09 22:36:19', '', '2021-02-09 22:36:19', b'0'); -INSERT INTO `inf_job_log` VALUES (3612, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 09:45:00', '2021-02-23 09:45:00', 2, 1, '', '', '2021-02-09 22:37:19', '', '2021-02-09 22:37:19', b'0'); -INSERT INTO `inf_job_log` VALUES (3613, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 09:46:00', '2021-02-23 09:46:00', 4, 1, '', '', '2021-02-09 22:38:19', '', '2021-02-09 22:38:19', b'0'); -INSERT INTO `inf_job_log` VALUES (3614, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 09:47:00', '2021-02-23 09:47:00', 3, 1, '', '', '2021-02-09 22:39:20', '', '2021-02-09 22:39:20', b'0'); -INSERT INTO `inf_job_log` VALUES (3615, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 09:48:00', '2021-02-23 09:48:00', 4, 1, '', '', '2021-02-09 22:40:20', '', '2021-02-09 22:40:20', b'0'); -INSERT INTO `inf_job_log` VALUES (3616, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 09:49:00', '2021-02-23 09:49:00', 4, 1, '', '', '2021-02-09 22:41:20', '', '2021-02-09 22:41:20', b'0'); -INSERT INTO `inf_job_log` VALUES (3617, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 09:57:40', '2021-02-23 09:57:40', 7, 1, '', '', '2021-02-09 22:42:24', '', '2021-02-09 22:42:24', b'0'); -INSERT INTO `inf_job_log` VALUES (3618, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 09:58:00', '2021-02-23 09:58:00', 6, 1, '', '', '2021-02-09 22:42:45', '', '2021-02-09 22:42:45', b'0'); -INSERT INTO `inf_job_log` VALUES (3619, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 09:59:00', '2021-02-23 09:59:00', 4, 1, '', '', '2021-02-09 22:43:45', '', '2021-02-09 22:43:45', b'0'); -INSERT INTO `inf_job_log` VALUES (3620, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 10:00:00', '2021-02-23 10:00:00', 3, 1, '', '', '2021-02-09 22:44:45', '', '2021-02-09 22:44:45', b'0'); -INSERT INTO `inf_job_log` VALUES (3621, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 10:01:00', '2021-02-23 10:01:00', 4, 1, '', '', '2021-02-09 22:45:45', '', '2021-02-09 22:45:45', b'0'); -INSERT INTO `inf_job_log` VALUES (3622, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 13:01:23', '2021-02-23 13:01:23', 10, 1, '', '', '2021-02-09 22:46:25', '', '2021-02-09 22:46:25', b'0'); -INSERT INTO `inf_job_log` VALUES (3623, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 21:36:41', '2021-02-23 21:36:41', 45, 1, '', '', '2021-02-09 22:47:41', '', '2021-02-09 22:47:41', b'0'); -INSERT INTO `inf_job_log` VALUES (3624, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 21:37:00', '2021-02-23 21:37:00', 4, 1, '', '', '2021-02-09 22:48:01', '', '2021-02-09 22:48:01', b'0'); -INSERT INTO `inf_job_log` VALUES (3625, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 21:38:00', '2021-02-23 21:38:00', 3, 1, '', '', '2021-02-09 22:49:01', '', '2021-02-09 22:49:01', b'0'); -INSERT INTO `inf_job_log` VALUES (3626, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 21:39:00', '2021-02-23 21:39:00', 4, 1, '', '', '2021-02-09 22:50:01', '', '2021-02-09 22:50:01', b'0'); -INSERT INTO `inf_job_log` VALUES (3627, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 21:40:00', '2021-02-23 21:40:00', 3, 1, '', '', '2021-02-09 22:51:01', '', '2021-02-09 22:51:01', b'0'); -INSERT INTO `inf_job_log` VALUES (3628, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 21:41:00', '2021-02-23 21:41:00', 4, 1, '', '', '2021-02-09 22:52:01', '', '2021-02-09 22:52:01', b'0'); -INSERT INTO `inf_job_log` VALUES (3629, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 21:42:00', '2021-02-23 21:42:00', 4, 1, '', '', '2021-02-09 22:53:01', '', '2021-02-09 22:53:01', b'0'); -INSERT INTO `inf_job_log` VALUES (3630, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 21:43:00', '2021-02-23 21:43:00', 4, 1, '', '', '2021-02-09 22:54:01', '', '2021-02-09 22:54:01', b'0'); -INSERT INTO `inf_job_log` VALUES (3631, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 21:44:00', '2021-02-23 21:44:00', 3, 1, '', '', '2021-02-09 22:55:01', '', '2021-02-09 22:55:01', b'0'); -INSERT INTO `inf_job_log` VALUES (3632, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 21:45:00', '2021-02-23 21:45:00', 3, 1, '', '', '2021-02-09 22:56:01', '', '2021-02-09 22:56:01', b'0'); -INSERT INTO `inf_job_log` VALUES (3633, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 21:46:00', '2021-02-23 21:46:00', 3, 1, '', '', '2021-02-09 22:57:01', '', '2021-02-09 22:57:01', b'0'); -INSERT INTO `inf_job_log` VALUES (3634, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 21:47:00', '2021-02-23 21:47:00', 4, 1, '', '', '2021-02-09 22:58:01', '', '2021-02-09 22:58:01', b'0'); -INSERT INTO `inf_job_log` VALUES (3635, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 21:48:00', '2021-02-23 21:48:00', 4, 1, '', '', '2021-02-09 22:59:02', '', '2021-02-09 22:59:02', b'0'); -INSERT INTO `inf_job_log` VALUES (3636, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 21:49:00', '2021-02-23 21:49:00', 2, 1, '', '', '2021-02-09 23:00:02', '', '2021-02-09 23:00:02', b'0'); -INSERT INTO `inf_job_log` VALUES (3637, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 21:50:00', '2021-02-23 21:50:00', 4, 1, '', '', '2021-02-09 23:01:02', '', '2021-02-09 23:01:02', b'0'); -INSERT INTO `inf_job_log` VALUES (3638, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 21:51:00', '2021-02-23 21:51:00', 4, 1, '', '', '2021-02-09 23:02:02', '', '2021-02-09 23:02:02', b'0'); -INSERT INTO `inf_job_log` VALUES (3639, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 21:52:00', '2021-02-23 21:52:00', 4, 1, '', '', '2021-02-09 23:03:02', '', '2021-02-09 23:03:02', b'0'); -INSERT INTO `inf_job_log` VALUES (3640, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 21:53:00', '2021-02-23 21:53:00', 4, 1, '', '', '2021-02-09 23:04:02', '', '2021-02-09 23:04:02', b'0'); -INSERT INTO `inf_job_log` VALUES (3641, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 21:54:00', '2021-02-23 21:54:00', 3, 1, '', '', '2021-02-09 23:05:02', '', '2021-02-09 23:05:02', b'0'); -INSERT INTO `inf_job_log` VALUES (3642, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 21:55:00', '2021-02-23 21:55:00', 4, 1, '', '', '2021-02-09 23:06:02', '', '2021-02-09 23:06:02', b'0'); -INSERT INTO `inf_job_log` VALUES (3643, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 21:56:00', '2021-02-23 21:56:00', 3, 1, '', '', '2021-02-09 23:07:02', '', '2021-02-09 23:07:02', b'0'); -INSERT INTO `inf_job_log` VALUES (3644, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 21:57:00', '2021-02-23 21:57:00', 3, 1, '', '', '2021-02-09 23:08:02', '', '2021-02-09 23:08:02', b'0'); -INSERT INTO `inf_job_log` VALUES (3645, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 21:58:00', '2021-02-23 21:58:00', 3, 1, '', '', '2021-02-09 23:09:02', '', '2021-02-09 23:09:02', b'0'); -INSERT INTO `inf_job_log` VALUES (3646, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 21:59:00', '2021-02-23 21:59:00', 4, 1, '', '', '2021-02-09 23:10:02', '', '2021-02-09 23:10:02', b'0'); -INSERT INTO `inf_job_log` VALUES (3647, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 22:00:00', '2021-02-23 22:00:00', 3, 1, '', '', '2021-02-09 23:11:02', '', '2021-02-09 23:11:02', b'0'); -INSERT INTO `inf_job_log` VALUES (3648, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 22:01:00', '2021-02-23 22:01:00', 3, 1, '', '', '2021-02-09 23:12:02', '', '2021-02-09 23:12:02', b'0'); -INSERT INTO `inf_job_log` VALUES (3649, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 22:02:00', '2021-02-23 22:02:00', 3, 1, '', '', '2021-02-09 23:13:02', '', '2021-02-09 23:13:02', b'0'); -INSERT INTO `inf_job_log` VALUES (3650, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 22:03:00', '2021-02-23 22:03:00', 5, 1, '', '', '2021-02-09 23:14:02', '', '2021-02-09 23:14:02', b'0'); -INSERT INTO `inf_job_log` VALUES (3651, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 22:04:00', '2021-02-23 22:04:00', 4, 1, '', '', '2021-02-09 23:15:02', '', '2021-02-09 23:15:02', b'0'); -INSERT INTO `inf_job_log` VALUES (3652, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 22:05:00', '2021-02-23 22:05:00', 3, 1, '', '', '2021-02-09 23:16:03', '', '2021-02-09 23:16:03', b'0'); -INSERT INTO `inf_job_log` VALUES (3653, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 22:50:35', '2021-02-23 22:50:35', 4, 1, '', '', '2021-02-09 23:16:40', '', '2021-02-09 23:16:40', b'0'); -INSERT INTO `inf_job_log` VALUES (3654, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 22:51:00', '2021-02-23 22:51:00', 3, 1, '', '', '2021-02-09 23:17:06', '', '2021-02-09 23:17:06', b'0'); -INSERT INTO `inf_job_log` VALUES (3655, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 22:52:00', '2021-02-23 22:52:00', 4, 1, '', '', '2021-02-09 23:18:06', '', '2021-02-09 23:18:06', b'0'); -INSERT INTO `inf_job_log` VALUES (3656, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 22:53:00', '2021-02-23 22:53:00', 3, 1, '', '', '2021-02-09 23:19:06', '', '2021-02-09 23:19:06', b'0'); -INSERT INTO `inf_job_log` VALUES (3657, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 22:54:00', '2021-02-23 22:54:00', 4, 1, '', '', '2021-02-09 23:20:06', '', '2021-02-09 23:20:06', b'0'); -INSERT INTO `inf_job_log` VALUES (3658, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 22:55:00', '2021-02-23 22:55:00', 3, 1, '', '', '2021-02-09 23:21:06', '', '2021-02-09 23:21:06', b'0'); -INSERT INTO `inf_job_log` VALUES (3659, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 22:56:00', '2021-02-23 22:56:00', 4, 1, '', '', '2021-02-09 23:22:06', '', '2021-02-09 23:22:06', b'0'); -INSERT INTO `inf_job_log` VALUES (3660, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 22:57:00', '2021-02-23 22:57:00', 3, 1, '', '', '2021-02-09 23:23:06', '', '2021-02-09 23:23:06', b'0'); -INSERT INTO `inf_job_log` VALUES (3661, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 22:58:00', '2021-02-23 22:58:00', 4, 1, '', '', '2021-02-09 23:24:06', '', '2021-02-09 23:24:06', b'0'); -INSERT INTO `inf_job_log` VALUES (3662, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 22:59:00', '2021-02-23 22:59:00', 4, 1, '', '', '2021-02-09 23:25:06', '', '2021-02-09 23:25:06', b'0'); -INSERT INTO `inf_job_log` VALUES (3663, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:00:00', '2021-02-23 23:00:00', 3, 1, '', '', '2021-02-09 23:26:06', '', '2021-02-09 23:26:06', b'0'); -INSERT INTO `inf_job_log` VALUES (3664, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:01:00', '2021-02-23 23:01:00', 4, 1, '', '', '2021-02-09 23:27:06', '', '2021-02-09 23:27:06', b'0'); -INSERT INTO `inf_job_log` VALUES (3665, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:02:00', '2021-02-23 23:02:00', 3, 1, '', '', '2021-02-09 23:28:06', '', '2021-02-09 23:28:06', b'0'); -INSERT INTO `inf_job_log` VALUES (3666, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:03:00', '2021-02-23 23:03:00', 3, 1, '', '', '2021-02-09 23:29:06', '', '2021-02-09 23:29:06', b'0'); -INSERT INTO `inf_job_log` VALUES (3667, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:04:00', '2021-02-23 23:04:00', 3, 1, '', '', '2021-02-09 23:30:07', '', '2021-02-09 23:30:07', b'0'); -INSERT INTO `inf_job_log` VALUES (3668, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:05:00', '2021-02-23 23:05:00', 4, 1, '', '', '2021-02-09 23:31:07', '', '2021-02-09 23:31:07', b'0'); -INSERT INTO `inf_job_log` VALUES (3669, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:06:00', '2021-02-23 23:06:00', 3, 1, '', '', '2021-02-09 23:32:07', '', '2021-02-09 23:32:07', b'0'); -INSERT INTO `inf_job_log` VALUES (3670, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:07:00', '2021-02-23 23:07:00', 4, 1, '', '', '2021-02-09 23:33:07', '', '2021-02-09 23:33:07', b'0'); -INSERT INTO `inf_job_log` VALUES (3671, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:08:00', '2021-02-23 23:08:00', 3, 1, '', '', '2021-02-09 23:34:07', '', '2021-02-09 23:34:07', b'0'); -INSERT INTO `inf_job_log` VALUES (3672, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:09:00', '2021-02-23 23:09:00', 3, 1, '', '', '2021-02-09 23:35:07', '', '2021-02-09 23:35:07', b'0'); -INSERT INTO `inf_job_log` VALUES (3673, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:10:00', '2021-02-23 23:10:00', 2, 1, '', '', '2021-02-09 23:36:07', '', '2021-02-09 23:36:07', b'0'); -INSERT INTO `inf_job_log` VALUES (3674, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:11:00', '2021-02-23 23:11:00', 5, 1, '', '', '2021-02-09 23:37:07', '', '2021-02-09 23:37:07', b'0'); -INSERT INTO `inf_job_log` VALUES (3675, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:12:00', '2021-02-23 23:12:00', 4, 1, '', '', '2021-02-09 23:38:07', '', '2021-02-09 23:38:07', b'0'); -INSERT INTO `inf_job_log` VALUES (3676, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:13:00', '2021-02-23 23:13:00', 3, 1, '', '', '2021-02-09 23:39:07', '', '2021-02-09 23:39:07', b'0'); -INSERT INTO `inf_job_log` VALUES (3677, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:14:00', '2021-02-23 23:14:00', 2, 1, '', '', '2021-02-09 23:40:07', '', '2021-02-09 23:40:07', b'0'); -INSERT INTO `inf_job_log` VALUES (3678, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:15:00', '2021-02-23 23:15:00', 6, 1, '', '', '2021-02-09 23:41:07', '', '2021-02-09 23:41:07', b'0'); -INSERT INTO `inf_job_log` VALUES (3679, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:16:00', '2021-02-23 23:16:00', 2, 1, '', '', '2021-02-09 23:42:07', '', '2021-02-09 23:42:07', b'0'); -INSERT INTO `inf_job_log` VALUES (3680, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:17:00', '2021-02-23 23:17:00', 4, 1, '', '', '2021-02-09 23:43:07', '', '2021-02-09 23:43:07', b'0'); -INSERT INTO `inf_job_log` VALUES (3681, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:18:00', '2021-02-23 23:18:00', 2, 1, '', '', '2021-02-09 23:44:07', '', '2021-02-09 23:44:07', b'0'); -INSERT INTO `inf_job_log` VALUES (3682, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:19:00', '2021-02-23 23:19:00', 4, 1, '', '', '2021-02-09 23:45:08', '', '2021-02-09 23:45:08', b'0'); -INSERT INTO `inf_job_log` VALUES (3683, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:20:00', '2021-02-23 23:20:00', 2, 1, '', '', '2021-02-09 23:46:08', '', '2021-02-09 23:46:08', b'0'); -INSERT INTO `inf_job_log` VALUES (3684, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:21:00', '2021-02-23 23:21:00', 3, 1, '', '', '2021-02-09 23:47:08', '', '2021-02-09 23:47:08', b'0'); -INSERT INTO `inf_job_log` VALUES (3685, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:22:00', '2021-02-23 23:22:00', 4, 1, '', '', '2021-02-09 23:48:08', '', '2021-02-09 23:48:08', b'0'); -INSERT INTO `inf_job_log` VALUES (3686, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:23:00', '2021-02-23 23:23:00', 4, 1, '', '', '2021-02-09 23:49:08', '', '2021-02-09 23:49:08', b'0'); -INSERT INTO `inf_job_log` VALUES (3687, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:24:00', '2021-02-23 23:24:00', 2, 1, '', '', '2021-02-09 23:50:08', '', '2021-02-09 23:50:08', b'0'); -INSERT INTO `inf_job_log` VALUES (3688, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:25:00', '2021-02-23 23:25:00', 4, 1, '', '', '2021-02-09 23:51:08', '', '2021-02-09 23:51:08', b'0'); -INSERT INTO `inf_job_log` VALUES (3689, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:26:00', '2021-02-23 23:26:00', 2, 1, '', '', '2021-02-09 23:52:08', '', '2021-02-09 23:52:08', b'0'); -INSERT INTO `inf_job_log` VALUES (3690, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:27:00', '2021-02-23 23:27:00', 4, 1, '', '', '2021-02-09 23:53:08', '', '2021-02-09 23:53:08', b'0'); -INSERT INTO `inf_job_log` VALUES (3691, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:28:00', '2021-02-23 23:28:00', 3, 1, '', '', '2021-02-09 23:54:08', '', '2021-02-09 23:54:08', b'0'); -INSERT INTO `inf_job_log` VALUES (3692, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:29:00', '2021-02-23 23:29:00', 3, 1, '', '', '2021-02-09 23:55:08', '', '2021-02-09 23:55:08', b'0'); -INSERT INTO `inf_job_log` VALUES (3693, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:30:00', '2021-02-23 23:30:00', 3, 1, '', '', '2021-02-09 23:56:08', '', '2021-02-09 23:56:08', b'0'); -INSERT INTO `inf_job_log` VALUES (3694, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:31:00', '2021-02-23 23:31:00', 4, 1, '', '', '2021-02-09 23:57:08', '', '2021-02-09 23:57:08', b'0'); -INSERT INTO `inf_job_log` VALUES (3695, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:32:00', '2021-02-23 23:32:00', 3, 1, '', '', '2021-02-09 23:58:08', '', '2021-02-09 23:58:08', b'0'); -INSERT INTO `inf_job_log` VALUES (3696, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:33:00', '2021-02-23 23:33:00', 3, 1, '', '', '2021-02-09 23:59:09', '', '2021-02-09 23:59:09', b'0'); -INSERT INTO `inf_job_log` VALUES (3697, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:34:00', '2021-02-23 23:34:00', 2, 1, '', '', '2021-02-10 00:00:09', '', '2021-02-10 00:00:09', b'0'); -INSERT INTO `inf_job_log` VALUES (3698, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:35:00', '2021-02-23 23:35:00', 2, 1, '', '', '2021-02-10 00:01:09', '', '2021-02-10 00:01:09', b'0'); -INSERT INTO `inf_job_log` VALUES (3699, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:36:00', '2021-02-23 23:36:00', 3, 1, '', '', '2021-02-10 00:02:09', '', '2021-02-10 00:02:09', b'0'); -INSERT INTO `inf_job_log` VALUES (3700, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:37:00', '2021-02-23 23:37:00', 3, 1, '', '', '2021-02-10 00:03:09', '', '2021-02-10 00:03:09', b'0'); -INSERT INTO `inf_job_log` VALUES (3701, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:38:00', '2021-02-23 23:38:00', 3, 1, '', '', '2021-02-10 00:04:09', '', '2021-02-10 00:04:09', b'0'); -INSERT INTO `inf_job_log` VALUES (3702, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:39:00', '2021-02-23 23:39:00', 3, 1, '', '', '2021-02-10 00:05:09', '', '2021-02-10 00:05:09', b'0'); -INSERT INTO `inf_job_log` VALUES (3703, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:40:00', '2021-02-23 23:40:00', 3, 1, '', '', '2021-02-10 00:06:09', '', '2021-02-10 00:06:09', b'0'); -INSERT INTO `inf_job_log` VALUES (3704, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:41:00', '2021-02-23 23:41:00', 2, 1, '', '', '2021-02-10 00:07:09', '', '2021-02-10 00:07:09', b'0'); -INSERT INTO `inf_job_log` VALUES (3705, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:42:00', '2021-02-23 23:42:00', 4, 1, '', '', '2021-02-10 00:08:09', '', '2021-02-10 00:08:09', b'0'); -INSERT INTO `inf_job_log` VALUES (3706, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:43:00', '2021-02-23 23:43:00', 2, 1, '', '', '2021-02-10 00:09:09', '', '2021-02-10 00:09:09', b'0'); -INSERT INTO `inf_job_log` VALUES (3707, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:44:00', '2021-02-23 23:44:00', 3, 1, '', '', '2021-02-10 00:10:09', '', '2021-02-10 00:10:09', b'0'); -INSERT INTO `inf_job_log` VALUES (3708, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:45:00', '2021-02-23 23:45:00', 3, 1, '', '', '2021-02-10 00:11:09', '', '2021-02-10 00:11:09', b'0'); -INSERT INTO `inf_job_log` VALUES (3709, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:46:00', '2021-02-23 23:46:00', 3, 1, '', '', '2021-02-10 00:12:09', '', '2021-02-10 00:12:09', b'0'); -INSERT INTO `inf_job_log` VALUES (3710, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:47:00', '2021-02-23 23:47:00', 3, 1, '', '', '2021-02-10 00:13:09', '', '2021-02-10 00:13:09', b'0'); -INSERT INTO `inf_job_log` VALUES (3711, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:48:00', '2021-02-23 23:48:00', 3, 1, '', '', '2021-02-10 00:14:10', '', '2021-02-10 00:14:10', b'0'); -INSERT INTO `inf_job_log` VALUES (3712, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:49:00', '2021-02-23 23:49:00', 3, 1, '', '', '2021-02-10 00:15:10', '', '2021-02-10 00:15:10', b'0'); -INSERT INTO `inf_job_log` VALUES (3713, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:50:00', '2021-02-23 23:50:00', 2, 1, '', '', '2021-02-10 00:16:10', '', '2021-02-10 00:16:10', b'0'); -INSERT INTO `inf_job_log` VALUES (3714, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:51:00', '2021-02-23 23:51:00', 3, 1, '', '', '2021-02-10 00:17:10', '', '2021-02-10 00:17:10', b'0'); -INSERT INTO `inf_job_log` VALUES (3715, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:52:00', '2021-02-23 23:52:00', 4, 1, '', '', '2021-02-10 00:18:10', '', '2021-02-10 00:18:10', b'0'); -INSERT INTO `inf_job_log` VALUES (3716, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:53:00', '2021-02-23 23:53:00', 4, 1, '', '', '2021-02-10 00:19:10', '', '2021-02-10 00:19:10', b'0'); -INSERT INTO `inf_job_log` VALUES (3717, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:54:00', '2021-02-23 23:54:00', 3, 1, '', '', '2021-02-10 00:20:10', '', '2021-02-10 00:20:10', b'0'); -INSERT INTO `inf_job_log` VALUES (3718, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:55:00', '2021-02-23 23:55:00', 3, 1, '', '', '2021-02-10 00:21:10', '', '2021-02-10 00:21:10', b'0'); -INSERT INTO `inf_job_log` VALUES (3719, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:56:00', '2021-02-23 23:56:00', 3, 1, '', '', '2021-02-10 00:22:10', '', '2021-02-10 00:22:10', b'0'); -INSERT INTO `inf_job_log` VALUES (3720, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:57:00', '2021-02-23 23:57:00', 3, 1, '', '', '2021-02-10 00:23:10', '', '2021-02-10 00:23:10', b'0'); -INSERT INTO `inf_job_log` VALUES (3721, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:58:00', '2021-02-23 23:58:00', 5, 1, '', '', '2021-02-10 00:24:10', '', '2021-02-10 00:24:10', b'0'); -INSERT INTO `inf_job_log` VALUES (3722, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-23 23:59:00', '2021-02-23 23:59:00', 3, 1, '', '', '2021-02-10 00:25:10', '', '2021-02-10 00:25:10', b'0'); -INSERT INTO `inf_job_log` VALUES (3723, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:00:00', '2021-02-24 00:00:00', 4, 1, '', '', '2021-02-10 00:26:10', '', '2021-02-10 00:26:10', b'0'); -INSERT INTO `inf_job_log` VALUES (3724, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:01:00', '2021-02-24 00:01:00', 3, 1, '', '', '2021-02-10 00:27:10', '', '2021-02-10 00:27:10', b'0'); -INSERT INTO `inf_job_log` VALUES (3725, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:02:00', '2021-02-24 00:02:00', 3, 1, '', '', '2021-02-10 00:28:10', '', '2021-02-10 00:28:10', b'0'); -INSERT INTO `inf_job_log` VALUES (3726, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:03:00', '2021-02-24 00:03:00', 2, 1, '', '', '2021-02-10 00:29:11', '', '2021-02-10 00:29:11', b'0'); -INSERT INTO `inf_job_log` VALUES (3727, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:04:00', '2021-02-24 00:04:00', 3, 1, '', '', '2021-02-10 00:30:11', '', '2021-02-10 00:30:11', b'0'); -INSERT INTO `inf_job_log` VALUES (3728, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:05:00', '2021-02-24 00:05:00', 4, 1, '', '', '2021-02-10 00:31:11', '', '2021-02-10 00:31:11', b'0'); -INSERT INTO `inf_job_log` VALUES (3729, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:06:00', '2021-02-24 00:06:00', 3, 1, '', '', '2021-02-10 00:32:11', '', '2021-02-10 00:32:11', b'0'); -INSERT INTO `inf_job_log` VALUES (3730, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:07:00', '2021-02-24 00:07:00', 3, 1, '', '', '2021-02-10 00:33:11', '', '2021-02-10 00:33:11', b'0'); -INSERT INTO `inf_job_log` VALUES (3731, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:08:00', '2021-02-24 00:08:00', 3, 1, '', '', '2021-02-10 00:34:11', '', '2021-02-10 00:34:11', b'0'); -INSERT INTO `inf_job_log` VALUES (3732, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:09:00', '2021-02-24 00:09:00', 3, 1, '', '', '2021-02-10 00:35:11', '', '2021-02-10 00:35:11', b'0'); -INSERT INTO `inf_job_log` VALUES (3733, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:10:00', '2021-02-24 00:10:00', 4, 1, '', '', '2021-02-10 00:36:11', '', '2021-02-10 00:36:11', b'0'); -INSERT INTO `inf_job_log` VALUES (3734, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:11:00', '2021-02-24 00:11:00', 3, 1, '', '', '2021-02-10 00:37:11', '', '2021-02-10 00:37:11', b'0'); -INSERT INTO `inf_job_log` VALUES (3735, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:12:00', '2021-02-24 00:12:00', 3, 1, '', '', '2021-02-10 00:38:11', '', '2021-02-10 00:38:11', b'0'); -INSERT INTO `inf_job_log` VALUES (3736, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:13:00', '2021-02-24 00:13:00', 4, 1, '', '', '2021-02-10 00:39:11', '', '2021-02-10 00:39:11', b'0'); -INSERT INTO `inf_job_log` VALUES (3737, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:14:00', '2021-02-24 00:14:00', 3, 1, '', '', '2021-02-10 00:40:11', '', '2021-02-10 00:40:11', b'0'); -INSERT INTO `inf_job_log` VALUES (3738, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:15:00', '2021-02-24 00:15:00', 10, 1, '', '', '2021-02-10 00:41:11', '', '2021-02-10 00:41:11', b'0'); -INSERT INTO `inf_job_log` VALUES (3739, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:16:00', '2021-02-24 00:16:00', 3, 1, '', '', '2021-02-10 00:42:11', '', '2021-02-10 00:42:11', b'0'); -INSERT INTO `inf_job_log` VALUES (3740, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:17:00', '2021-02-24 00:17:00', 4, 1, '', '', '2021-02-10 00:43:12', '', '2021-02-10 00:43:12', b'0'); -INSERT INTO `inf_job_log` VALUES (3741, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:18:00', '2021-02-24 00:18:00', 3, 1, '', '', '2021-02-10 00:44:12', '', '2021-02-10 00:44:12', b'0'); -INSERT INTO `inf_job_log` VALUES (3742, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:19:00', '2021-02-24 00:19:00', 3, 1, '', '', '2021-02-10 00:45:12', '', '2021-02-10 00:45:12', b'0'); -INSERT INTO `inf_job_log` VALUES (3743, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:20:00', '2021-02-24 00:20:00', 3, 1, '', '', '2021-02-10 00:46:12', '', '2021-02-10 00:46:12', b'0'); -INSERT INTO `inf_job_log` VALUES (3744, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:21:00', '2021-02-24 00:21:00', 4, 1, '', '', '2021-02-10 00:47:12', '', '2021-02-10 00:47:12', b'0'); -INSERT INTO `inf_job_log` VALUES (3745, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:22:00', '2021-02-24 00:22:00', 5, 1, '', '', '2021-02-10 00:48:12', '', '2021-02-10 00:48:12', b'0'); -INSERT INTO `inf_job_log` VALUES (3746, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:23:00', '2021-02-24 00:23:00', 4, 1, '', '', '2021-02-10 00:49:12', '', '2021-02-10 00:49:12', b'0'); -INSERT INTO `inf_job_log` VALUES (3747, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:24:00', '2021-02-24 00:24:00', 3, 1, '', '', '2021-02-10 00:50:12', '', '2021-02-10 00:50:12', b'0'); -INSERT INTO `inf_job_log` VALUES (3748, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:25:00', '2021-02-24 00:25:00', 4, 1, '', '', '2021-02-10 00:51:12', '', '2021-02-10 00:51:12', b'0'); -INSERT INTO `inf_job_log` VALUES (3749, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:26:00', '2021-02-24 00:26:00', 3, 1, '', '', '2021-02-10 00:52:12', '', '2021-02-10 00:52:12', b'0'); -INSERT INTO `inf_job_log` VALUES (3750, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:27:00', '2021-02-24 00:27:00', 4, 1, '', '', '2021-02-10 00:53:12', '', '2021-02-10 00:53:12', b'0'); -INSERT INTO `inf_job_log` VALUES (3751, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:28:00', '2021-02-24 00:28:00', 4, 1, '', '', '2021-02-10 00:54:12', '', '2021-02-10 00:54:12', b'0'); -INSERT INTO `inf_job_log` VALUES (3752, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:29:00', '2021-02-24 00:29:00', 4, 1, '', '', '2021-02-10 00:55:12', '', '2021-02-10 00:55:12', b'0'); -INSERT INTO `inf_job_log` VALUES (3753, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:30:00', '2021-02-24 00:30:00', 4, 1, '', '', '2021-02-10 00:56:12', '', '2021-02-10 00:56:12', b'0'); -INSERT INTO `inf_job_log` VALUES (3754, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:31:00', '2021-02-24 00:31:00', 3, 1, '', '', '2021-02-10 00:57:12', '', '2021-02-10 00:57:12', b'0'); -INSERT INTO `inf_job_log` VALUES (3755, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:32:00', '2021-02-24 00:32:00', 3, 1, '', '', '2021-02-10 00:58:13', '', '2021-02-10 00:58:13', b'0'); -INSERT INTO `inf_job_log` VALUES (3756, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:33:00', '2021-02-24 00:33:00', 2, 1, '', '', '2021-02-10 00:59:13', '', '2021-02-10 00:59:13', b'0'); -INSERT INTO `inf_job_log` VALUES (3757, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:34:00', '2021-02-24 00:34:00', 3, 1, '', '', '2021-02-10 01:00:13', '', '2021-02-10 01:00:13', b'0'); -INSERT INTO `inf_job_log` VALUES (3758, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:35:00', '2021-02-24 00:35:00', 3, 1, '', '', '2021-02-10 01:01:13', '', '2021-02-10 01:01:13', b'0'); -INSERT INTO `inf_job_log` VALUES (3759, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:36:00', '2021-02-24 00:36:00', 3, 1, '', '', '2021-02-10 01:02:13', '', '2021-02-10 01:02:13', b'0'); -INSERT INTO `inf_job_log` VALUES (3760, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:37:00', '2021-02-24 00:37:00', 2, 1, '', '', '2021-02-10 01:03:13', '', '2021-02-10 01:03:13', b'0'); -INSERT INTO `inf_job_log` VALUES (3761, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:38:00', '2021-02-24 00:38:00', 3, 1, '', '', '2021-02-10 01:04:13', '', '2021-02-10 01:04:13', b'0'); -INSERT INTO `inf_job_log` VALUES (3762, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:39:00', '2021-02-24 00:39:00', 4, 1, '', '', '2021-02-10 01:05:13', '', '2021-02-10 01:05:13', b'0'); -INSERT INTO `inf_job_log` VALUES (3763, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:40:00', '2021-02-24 00:40:00', 5, 1, '', '', '2021-02-10 01:06:13', '', '2021-02-10 01:06:13', b'0'); -INSERT INTO `inf_job_log` VALUES (3764, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:41:00', '2021-02-24 00:41:00', 4, 1, '', '', '2021-02-10 01:07:13', '', '2021-02-10 01:07:13', b'0'); -INSERT INTO `inf_job_log` VALUES (3765, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:42:00', '2021-02-24 00:42:00', 3, 1, '', '', '2021-02-10 01:08:13', '', '2021-02-10 01:08:13', b'0'); -INSERT INTO `inf_job_log` VALUES (3766, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:43:00', '2021-02-24 00:43:00', 3, 1, '', '', '2021-02-10 01:09:13', '', '2021-02-10 01:09:13', b'0'); -INSERT INTO `inf_job_log` VALUES (3767, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:44:00', '2021-02-24 00:44:00', 4, 1, '', '', '2021-02-10 01:10:13', '', '2021-02-10 01:10:13', b'0'); -INSERT INTO `inf_job_log` VALUES (3768, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:45:00', '2021-02-24 00:45:00', 2, 1, '', '', '2021-02-10 01:11:13', '', '2021-02-10 01:11:13', b'0'); -INSERT INTO `inf_job_log` VALUES (3769, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:46:00', '2021-02-24 00:46:00', 3, 1, '', '', '2021-02-10 01:12:14', '', '2021-02-10 01:12:14', b'0'); -INSERT INTO `inf_job_log` VALUES (3770, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:47:00', '2021-02-24 00:47:00', 4, 1, '', '', '2021-02-10 01:13:14', '', '2021-02-10 01:13:14', b'0'); -INSERT INTO `inf_job_log` VALUES (3771, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:48:00', '2021-02-24 00:48:00', 4, 1, '', '', '2021-02-10 01:14:14', '', '2021-02-10 01:14:14', b'0'); -INSERT INTO `inf_job_log` VALUES (3772, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:49:00', '2021-02-24 00:49:00', 3, 1, '', '', '2021-02-10 01:15:14', '', '2021-02-10 01:15:14', b'0'); -INSERT INTO `inf_job_log` VALUES (3773, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:50:00', '2021-02-24 00:50:00', 3, 1, '', '', '2021-02-10 01:16:14', '', '2021-02-10 01:16:14', b'0'); -INSERT INTO `inf_job_log` VALUES (3774, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 00:51:00', '2021-02-24 00:51:00', 4, 1, '', '', '2021-02-10 01:17:14', '', '2021-02-10 01:17:14', b'0'); -INSERT INTO `inf_job_log` VALUES (3775, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 01:11:53', '2021-02-24 01:11:53', 44, 1, '', '', '2021-02-10 01:38:09', '', '2021-02-10 01:38:09', b'0'); -INSERT INTO `inf_job_log` VALUES (3776, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 01:12:00', '2021-02-24 01:12:00', 6, 1, '', '', '2021-02-10 01:38:15', '', '2021-02-10 01:38:15', b'0'); -INSERT INTO `inf_job_log` VALUES (3777, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 01:13:00', '2021-02-24 01:13:00', 4, 1, '', '', '2021-02-10 01:39:15', '', '2021-02-10 01:39:15', b'0'); -INSERT INTO `inf_job_log` VALUES (3778, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 01:14:00', '2021-02-24 01:14:00', 5, 1, '', '', '2021-02-10 01:40:15', '', '2021-02-10 01:40:15', b'0'); -INSERT INTO `inf_job_log` VALUES (3779, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 01:15:00', '2021-02-24 01:15:00', 4, 1, '', '', '2021-02-10 01:41:15', '', '2021-02-10 01:41:16', b'0'); -INSERT INTO `inf_job_log` VALUES (3780, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 01:16:00', '2021-02-24 01:16:00', 5, 1, '', '', '2021-02-10 01:42:16', '', '2021-02-10 01:42:16', b'0'); -INSERT INTO `inf_job_log` VALUES (3781, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 01:17:00', '2021-02-24 01:17:00', 5, 1, '', '', '2021-02-10 01:43:16', '', '2021-02-10 01:43:16', b'0'); -INSERT INTO `inf_job_log` VALUES (3782, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 01:18:00', '2021-02-24 01:18:00', 6, 1, '', '', '2021-02-10 01:44:16', '', '2021-02-10 01:44:16', b'0'); -INSERT INTO `inf_job_log` VALUES (3783, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 01:19:00', '2021-02-24 01:19:00', 3, 1, '', '', '2021-02-10 01:45:16', '', '2021-02-10 01:45:16', b'0'); -INSERT INTO `inf_job_log` VALUES (3784, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 01:20:00', '2021-02-24 01:20:00', 7, 1, '', '', '2021-02-10 01:46:16', '', '2021-02-10 01:46:16', b'0'); -INSERT INTO `inf_job_log` VALUES (3785, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 01:21:00', '2021-02-24 01:21:00', 5, 1, '', '', '2021-02-10 01:47:16', '', '2021-02-10 01:47:16', b'0'); -INSERT INTO `inf_job_log` VALUES (3786, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 01:22:00', '2021-02-24 01:22:00', 5, 1, '', '', '2021-02-10 01:48:16', '', '2021-02-10 01:48:16', b'0'); -INSERT INTO `inf_job_log` VALUES (3787, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 01:23:00', '2021-02-24 01:23:00', 4, 1, '', '', '2021-02-10 01:49:16', '', '2021-02-10 01:49:16', b'0'); -INSERT INTO `inf_job_log` VALUES (3788, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 01:24:00', '2021-02-24 01:24:00', 36, 1, '', '', '2021-02-10 01:50:16', '', '2021-02-10 01:50:16', b'0'); -INSERT INTO `inf_job_log` VALUES (3789, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 01:29:34', '2021-02-24 01:29:34', 33, 1, '', '', '2021-02-10 01:55:51', '', '2021-02-10 01:55:51', b'0'); -INSERT INTO `inf_job_log` VALUES (3790, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 01:30:00', '2021-02-24 01:30:00', 8, 1, '', '', '2021-02-10 01:56:17', '', '2021-02-10 01:56:17', b'0'); -INSERT INTO `inf_job_log` VALUES (3791, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 01:34:06', '2021-02-24 01:34:06', 126, 1, '', '', '2021-02-10 02:00:23', '', '2021-02-10 02:00:23', b'0'); -INSERT INTO `inf_job_log` VALUES (3792, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 19:39:31', '2021-02-24 19:39:32', 41, 1, '', '', '2021-02-24 11:39:31', '', '2021-02-24 11:39:31', b'0'); -INSERT INTO `inf_job_log` VALUES (3793, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 19:40:00', '2021-02-24 19:40:00', 7, 1, '', '', '2021-02-24 11:39:59', '', '2021-02-24 11:39:59', b'0'); -INSERT INTO `inf_job_log` VALUES (3794, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 19:41:00', '2021-02-24 19:41:00', 4, 1, '', '', '2021-02-24 11:40:59', '', '2021-02-24 11:40:59', b'0'); -INSERT INTO `inf_job_log` VALUES (3795, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 19:42:00', '2021-02-24 19:42:00', 5, 1, '', '', '2021-02-24 11:41:59', '', '2021-02-24 11:41:59', b'0'); -INSERT INTO `inf_job_log` VALUES (3796, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 19:43:00', '2021-02-24 19:43:00', 4, 1, '', '', '2021-02-24 11:42:59', '', '2021-02-24 11:42:59', b'0'); -INSERT INTO `inf_job_log` VALUES (3797, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 19:44:00', '2021-02-24 19:44:00', 5, 1, '', '', '2021-02-24 11:43:59', '', '2021-02-24 11:43:59', b'0'); -INSERT INTO `inf_job_log` VALUES (3798, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 19:45:00', '2021-02-24 19:45:00', 6, 1, '', '', '2021-02-24 11:44:59', '', '2021-02-24 11:44:59', b'0'); -INSERT INTO `inf_job_log` VALUES (3799, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 19:46:00', '2021-02-24 19:46:00', 3, 1, '', '', '2021-02-24 11:45:59', '', '2021-02-24 11:45:59', b'0'); -INSERT INTO `inf_job_log` VALUES (3800, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 19:47:00', '2021-02-24 19:47:00', 4, 1, '', '', '2021-02-24 11:46:59', '', '2021-02-24 11:46:59', b'0'); -INSERT INTO `inf_job_log` VALUES (3801, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 19:48:11', '2021-02-24 19:48:11', 4, 1, '', '', '2021-02-24 11:48:11', '', '2021-02-24 11:48:11', b'0'); -INSERT INTO `inf_job_log` VALUES (3802, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 19:56:42', '2021-02-24 19:56:42', 57, 1, '', '', '2021-02-24 11:56:42', '', '2021-02-24 11:56:42', b'0'); -INSERT INTO `inf_job_log` VALUES (3803, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 19:57:00', '2021-02-24 19:57:00', 9, 1, '', '', '2021-02-24 11:57:00', '', '2021-02-24 11:57:00', b'0'); -INSERT INTO `inf_job_log` VALUES (3804, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 19:58:00', '2021-02-24 19:58:00', 4, 1, '', '', '2021-02-24 11:58:00', '', '2021-02-24 11:58:00', b'0'); -INSERT INTO `inf_job_log` VALUES (3805, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 19:59:00', '2021-02-24 19:59:00', 48, 1, '', '', '2021-02-24 11:59:00', '', '2021-02-24 11:59:00', b'0'); -INSERT INTO `inf_job_log` VALUES (3806, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 20:00:00', '2021-02-24 20:00:00', 6, 1, '', '', '2021-02-24 12:00:00', '', '2021-02-24 12:00:00', b'0'); -INSERT INTO `inf_job_log` VALUES (3807, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 20:01:00', '2021-02-24 20:01:00', 5, 1, '', '', '2021-02-24 12:01:00', '', '2021-02-24 12:01:00', b'0'); -INSERT INTO `inf_job_log` VALUES (3808, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 20:02:00', '2021-02-24 20:02:00', 5, 1, '', '', '2021-02-24 12:02:00', '', '2021-02-24 12:02:00', b'0'); -INSERT INTO `inf_job_log` VALUES (3809, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 20:03:00', '2021-02-24 20:03:00', 4, 1, '', '', '2021-02-24 12:03:00', '', '2021-02-24 12:03:00', b'0'); -INSERT INTO `inf_job_log` VALUES (3810, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 20:04:00', '2021-02-24 20:04:00', 8, 1, '', '', '2021-02-24 12:04:00', '', '2021-02-24 12:04:00', b'0'); -INSERT INTO `inf_job_log` VALUES (3811, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-24 20:55:54', '2021-02-24 20:55:54', 54, 1, '', '', '2021-02-24 12:55:56', '', '2021-02-24 12:55:56', b'0'); -INSERT INTO `inf_job_log` VALUES (3812, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-25 18:50:45', '2021-02-25 18:50:45', 54, 1, '', '', '2021-02-25 10:50:45', '', '2021-02-25 10:50:45', b'0'); -INSERT INTO `inf_job_log` VALUES (3813, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-25 18:51:00', '2021-02-25 18:51:00', 7, 1, '', '', '2021-02-25 10:50:59', '', '2021-02-25 10:51:00', b'0'); -INSERT INTO `inf_job_log` VALUES (3814, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-25 18:54:14', '2021-02-25 18:54:14', 52, 1, '', '', '2021-02-25 10:54:14', '', '2021-02-25 10:54:14', b'0'); -INSERT INTO `inf_job_log` VALUES (3815, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-25 18:55:48', '2021-02-25 18:55:48', 36, 1, '', '', '2021-02-25 10:55:48', '', '2021-02-25 10:55:48', b'0'); -INSERT INTO `inf_job_log` VALUES (3816, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-25 18:56:00', '2021-02-25 18:56:00', 5, 1, '', '', '2021-02-25 10:56:00', '', '2021-02-25 10:56:00', b'0'); -INSERT INTO `inf_job_log` VALUES (3817, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-25 18:57:00', '2021-02-25 18:57:00', 6, 1, '', '', '2021-02-25 10:57:00', '', '2021-02-25 10:57:00', b'0'); -INSERT INTO `inf_job_log` VALUES (3818, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-25 18:58:10', '2021-02-25 18:58:10', 40, 1, '', '', '2021-02-25 10:58:10', '', '2021-02-25 10:58:10', b'0'); -INSERT INTO `inf_job_log` VALUES (3819, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-25 18:59:00', '2021-02-25 18:59:00', 9, 1, '', '', '2021-02-25 10:59:00', '', '2021-02-25 10:59:00', b'0'); -INSERT INTO `inf_job_log` VALUES (3820, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-25 19:00:00', '2021-02-25 19:00:00', 5, 1, '', '', '2021-02-25 11:00:00', '', '2021-02-25 11:00:00', b'0'); -INSERT INTO `inf_job_log` VALUES (3821, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-25 19:01:10', '2021-02-25 19:01:10', 42, 1, '', '', '2021-02-25 11:01:10', '', '2021-02-25 11:01:10', b'0'); -INSERT INTO `inf_job_log` VALUES (3822, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-25 19:02:00', '2021-02-25 19:02:00', 9, 1, '', '', '2021-02-25 11:02:00', '', '2021-02-25 11:02:00', b'0'); -INSERT INTO `inf_job_log` VALUES (3823, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-25 19:03:00', '2021-02-25 19:03:00', 5, 1, '', '', '2021-02-25 11:03:00', '', '2021-02-25 11:03:00', b'0'); -INSERT INTO `inf_job_log` VALUES (3824, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-25 19:04:00', '2021-02-25 19:04:00', 5, 1, '', '', '2021-02-25 11:04:00', '', '2021-02-25 11:04:00', b'0'); -INSERT INTO `inf_job_log` VALUES (3825, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-25 19:05:01', '2021-02-25 19:05:01', 44, 1, '', '', '2021-02-25 11:05:01', '', '2021-02-25 11:05:01', b'0'); -INSERT INTO `inf_job_log` VALUES (3826, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-25 19:06:25', '2021-02-25 19:06:25', 56, 1, '', '', '2021-02-25 11:06:25', '', '2021-02-25 11:06:25', b'0'); -INSERT INTO `inf_job_log` VALUES (3827, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-25 20:51:38', '2021-02-25 20:51:38', 55, 1, '', '', '2021-02-25 12:51:42', '', '2021-02-25 12:51:42', b'0'); -INSERT INTO `inf_job_log` VALUES (3828, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-26 00:20:07', '2021-02-26 00:20:07', 42, 1, '', '', '2021-02-25 15:35:17', '', '2021-02-25 15:35:17', b'0'); -INSERT INTO `inf_job_log` VALUES (3829, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-26 00:21:09', '2021-02-26 00:21:09', 39, 1, '', '', '2021-02-25 15:36:19', '', '2021-02-25 15:36:19', b'0'); -INSERT INTO `inf_job_log` VALUES (3830, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-26 00:22:00', '2021-02-26 00:22:00', 6, 1, '', '', '2021-02-25 15:37:11', '', '2021-02-25 15:37:11', b'0'); -INSERT INTO `inf_job_log` VALUES (3831, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-26 00:23:01', '2021-02-26 00:23:01', 7, 1, '', '', '2021-02-25 15:38:11', '', '2021-02-25 15:38:11', b'0'); -INSERT INTO `inf_job_log` VALUES (3832, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-26 00:34:19', '2021-02-26 00:34:19', 11, 1, '', '', '2021-02-25 15:49:31', '', '2021-02-25 15:49:31', b'0'); -INSERT INTO `inf_job_log` VALUES (3833, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-26 00:35:44', '2021-02-26 00:35:44', 38, 1, '', '', '2021-02-25 15:50:55', '', '2021-02-25 15:50:55', b'0'); -INSERT INTO `inf_job_log` VALUES (3834, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-26 00:40:39', '2021-02-26 00:40:39', 7, 1, '', '', '2021-02-25 15:55:51', '', '2021-02-25 15:55:51', b'0'); -INSERT INTO `inf_job_log` VALUES (3835, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-26 00:55:22', '2021-02-26 00:55:22', 40, 1, '', '', '2021-02-25 16:10:35', '', '2021-02-25 16:10:35', b'0'); -INSERT INTO `inf_job_log` VALUES (3836, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-26 00:56:05', '2021-02-26 00:56:06', 6, 1, '', '', '2021-02-25 16:11:19', '', '2021-02-25 16:11:19', b'0'); -INSERT INTO `inf_job_log` VALUES (3837, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-26 00:57:22', '2021-02-26 00:57:22', 39, 1, '', '', '2021-02-25 16:12:35', '', '2021-02-25 16:12:35', b'0'); -INSERT INTO `inf_job_log` VALUES (3838, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-26 00:59:12', '2021-02-26 00:59:12', 7, 1, '', '', '2021-02-25 16:14:25', '', '2021-02-25 16:14:25', b'0'); -INSERT INTO `inf_job_log` VALUES (3839, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-26 01:02:10', '2021-02-26 01:02:10', 32, 1, '', '', '2021-02-25 16:17:23', '', '2021-02-25 16:17:23', b'0'); -INSERT INTO `inf_job_log` VALUES (3840, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-26 01:03:55', '2021-02-26 01:03:55', 7, 1, '', '', '2021-02-25 16:19:08', '', '2021-02-25 16:19:08', b'0'); -INSERT INTO `inf_job_log` VALUES (3841, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-26 01:04:18', '2021-02-26 01:04:18', 32, 1, '', '', '2021-02-25 16:19:32', '', '2021-02-25 16:19:32', b'0'); -INSERT INTO `inf_job_log` VALUES (3842, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-26 01:05:08', '2021-02-26 01:05:08', 43, 1, '', '', '2021-02-25 16:20:21', '', '2021-02-25 16:20:21', b'0'); -INSERT INTO `inf_job_log` VALUES (3843, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-26 19:47:25', '2021-02-26 19:47:25', 39, 1, '', '', '2021-02-25 20:33:38', '', '2021-02-25 20:33:38', b'0'); -INSERT INTO `inf_job_log` VALUES (3844, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-26 19:48:00', '2021-02-26 19:48:00', 5, 1, '', '', '2021-02-25 20:34:13', '', '2021-02-25 20:34:13', b'0'); -INSERT INTO `inf_job_log` VALUES (3845, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-26 19:49:00', '2021-02-26 19:49:00', 7, 1, '', '', '2021-02-25 20:35:13', '', '2021-02-25 20:35:13', b'0'); -INSERT INTO `inf_job_log` VALUES (3846, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-26 19:50:00', '2021-02-26 19:50:00', 4, 1, '', '', '2021-02-25 20:36:13', '', '2021-02-25 20:36:13', b'0'); -INSERT INTO `inf_job_log` VALUES (3847, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-26 19:51:00', '2021-02-26 19:51:00', 5, 1, '', '', '2021-02-25 20:37:13', '', '2021-02-25 20:37:13', b'0'); -INSERT INTO `inf_job_log` VALUES (3848, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-26 19:52:03', '2021-02-26 19:52:03', 9, 1, '', '', '2021-02-25 20:38:16', '', '2021-02-25 20:38:16', b'0'); -INSERT INTO `inf_job_log` VALUES (3849, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-26 19:53:00', '2021-02-26 19:53:00', 5, 1, '', '', '2021-02-25 20:39:13', '', '2021-02-25 20:39:13', b'0'); -INSERT INTO `inf_job_log` VALUES (3850, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-26 19:54:10', '2021-02-26 19:54:10', 6, 1, '', '', '2021-02-25 20:40:23', '', '2021-02-25 20:40:23', b'0'); -INSERT INTO `inf_job_log` VALUES (3851, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-26 19:55:14', '2021-02-26 19:55:14', 36, 1, '', '', '2021-02-25 20:41:28', '', '2021-02-25 20:41:28', b'0'); -INSERT INTO `inf_job_log` VALUES (3852, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-26 19:56:00', '2021-02-26 19:56:00', 4, 1, '', '', '2021-02-25 20:42:13', '', '2021-02-25 20:42:13', b'0'); -INSERT INTO `inf_job_log` VALUES (3853, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-26 19:57:26', '2021-02-26 19:57:27', 37, 1, '', '', '2021-02-25 20:43:40', '', '2021-02-25 20:43:40', b'0'); -INSERT INTO `inf_job_log` VALUES (3854, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-26 19:58:00', '2021-02-26 19:58:00', 4, 1, '', '', '2021-02-25 20:44:13', '', '2021-02-25 20:44:13', b'0'); -INSERT INTO `inf_job_log` VALUES (3855, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-26 19:59:00', '2021-02-26 19:59:00', 33, 1, '', '', '2021-02-25 20:45:13', '', '2021-02-25 20:45:13', b'0'); -INSERT INTO `inf_job_log` VALUES (3856, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-26 20:02:23', '2021-02-26 20:02:23', 42, 1, '', '', '2021-02-25 20:48:37', '', '2021-02-25 20:48:37', b'0'); -INSERT INTO `inf_job_log` VALUES (3857, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-26 20:06:57', '2021-02-26 20:06:57', 33, 1, '', '', '2021-02-25 20:53:10', '', '2021-02-25 20:53:10', b'0'); -INSERT INTO `inf_job_log` VALUES (3858, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-26 20:07:00', '2021-02-26 20:07:00', 7, 1, '', '', '2021-02-25 20:53:14', '', '2021-02-25 20:53:14', b'0'); -INSERT INTO `inf_job_log` VALUES (3859, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-26 20:08:15', '2021-02-26 20:08:15', 49, 1, '', '', '2021-02-25 20:54:29', '', '2021-02-25 20:54:29', b'0'); -INSERT INTO `inf_job_log` VALUES (3860, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-26 20:10:32', '2021-02-26 20:10:32', 8, 1, '', '', '2021-02-25 20:56:46', '', '2021-02-25 20:56:46', b'0'); -INSERT INTO `inf_job_log` VALUES (3861, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-26 20:10:32', '2021-02-26 20:10:32', 7, 1, '', '', '2021-02-25 20:56:46', '', '2021-02-25 20:56:46', b'0'); -INSERT INTO `inf_job_log` VALUES (3862, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-26 20:11:25', '2021-02-26 20:11:25', 6, 1, '', '', '2021-02-25 20:57:39', '', '2021-02-25 20:57:39', b'0'); -INSERT INTO `inf_job_log` VALUES (3863, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-26 20:15:45', '2021-02-26 20:15:45', 40, 1, '', '', '2021-02-25 21:01:59', '', '2021-02-25 21:01:59', b'0'); -INSERT INTO `inf_job_log` VALUES (3864, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-26 20:16:10', '2021-02-26 20:16:10', 6, 1, '', '', '2021-02-25 21:02:24', '', '2021-02-25 21:02:24', b'0'); -INSERT INTO `inf_job_log` VALUES (3865, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-26 20:18:07', '2021-02-26 20:18:07', 7, 1, '', '', '2021-02-25 21:04:22', '', '2021-02-25 21:04:22', b'0'); -INSERT INTO `inf_job_log` VALUES (3866, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-26 20:18:15', '2021-02-26 20:18:15', 6, 1, '', '', '2021-02-25 21:04:29', '', '2021-02-25 21:04:29', b'0'); -INSERT INTO `inf_job_log` VALUES (3867, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-26 20:19:28', '2021-02-26 20:19:28', 6, 1, '', '', '2021-02-25 21:05:43', '', '2021-02-25 21:05:43', b'0'); -INSERT INTO `inf_job_log` VALUES (3868, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-26 20:20:03', '2021-02-26 20:20:04', 32, 1, '', '', '2021-02-25 21:06:18', '', '2021-02-25 21:06:18', b'0'); -INSERT INTO `inf_job_log` VALUES (3869, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-26 20:40:12', '2021-02-26 20:40:12', 45, 1, '', '', '2021-02-25 21:26:28', '', '2021-02-25 21:26:28', b'0'); -INSERT INTO `inf_job_log` VALUES (3870, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-26 20:42:05', '2021-02-26 20:42:05', 35, 1, '', '', '2021-02-25 21:28:21', '', '2021-02-25 21:28:21', b'0'); -INSERT INTO `inf_job_log` VALUES (3871, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-26 20:43:00', '2021-02-26 20:43:00', 7, 1, '', '', '2021-02-25 21:29:16', '', '2021-02-25 21:29:16', b'0'); -INSERT INTO `inf_job_log` VALUES (3872, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 00:37:56', '2021-02-27 00:37:56', 34, 1, '', '', '2021-02-26 00:09:23', '', '2021-02-26 00:09:23', b'0'); -INSERT INTO `inf_job_log` VALUES (3873, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 00:38:00', '2021-02-27 00:38:00', 8, 1, '', '', '2021-02-26 00:09:27', '', '2021-02-26 00:09:27', b'0'); -INSERT INTO `inf_job_log` VALUES (3874, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 00:39:12', '2021-02-27 00:39:12', 6, 1, '', '', '2021-02-26 00:10:39', '', '2021-02-26 00:10:39', b'0'); -INSERT INTO `inf_job_log` VALUES (3875, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 00:40:50', '2021-02-27 00:40:50', 30, 1, '', '', '2021-02-26 00:12:17', '', '2021-02-26 00:12:17', b'0'); -INSERT INTO `inf_job_log` VALUES (3876, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 00:41:00', '2021-02-27 00:41:00', 6, 1, '', '', '2021-02-26 00:12:27', '', '2021-02-26 00:12:27', b'0'); -INSERT INTO `inf_job_log` VALUES (3877, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 00:42:00', '2021-02-27 00:42:00', 7, 1, '', '', '2021-02-26 00:13:27', '', '2021-02-26 00:13:27', b'0'); -INSERT INTO `inf_job_log` VALUES (3878, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 00:43:00', '2021-02-27 00:43:00', 4, 1, '', '', '2021-02-26 00:14:27', '', '2021-02-26 00:14:27', b'0'); -INSERT INTO `inf_job_log` VALUES (3879, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 00:44:00', '2021-02-27 00:44:00', 4, 1, '', '', '2021-02-26 00:15:27', '', '2021-02-26 00:15:27', b'0'); -INSERT INTO `inf_job_log` VALUES (3880, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 00:45:00', '2021-02-27 00:45:00', 5, 1, '', '', '2021-02-26 00:16:28', '', '2021-02-26 00:16:28', b'0'); -INSERT INTO `inf_job_log` VALUES (3881, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 00:46:00', '2021-02-27 00:46:00', 3, 1, '', '', '2021-02-26 00:17:28', '', '2021-02-26 00:17:28', b'0'); -INSERT INTO `inf_job_log` VALUES (3882, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 00:47:00', '2021-02-27 00:47:00', 5, 1, '', '', '2021-02-26 00:18:28', '', '2021-02-26 00:18:28', b'0'); -INSERT INTO `inf_job_log` VALUES (3883, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 00:48:00', '2021-02-27 00:48:00', 6, 1, '', '', '2021-02-26 00:19:28', '', '2021-02-26 00:19:28', b'0'); -INSERT INTO `inf_job_log` VALUES (3884, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 00:49:00', '2021-02-27 00:49:00', 4, 1, '', '', '2021-02-26 00:20:28', '', '2021-02-26 00:20:28', b'0'); -INSERT INTO `inf_job_log` VALUES (3885, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 00:50:00', '2021-02-27 00:50:00', 5, 1, '', '', '2021-02-26 00:21:28', '', '2021-02-26 00:21:28', b'0'); -INSERT INTO `inf_job_log` VALUES (3886, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 00:51:00', '2021-02-27 00:51:00', 3, 1, '', '', '2021-02-26 00:22:28', '', '2021-02-26 00:22:28', b'0'); -INSERT INTO `inf_job_log` VALUES (3887, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 00:52:00', '2021-02-27 00:52:00', 3, 1, '', '', '2021-02-26 00:23:28', '', '2021-02-26 00:23:28', b'0'); -INSERT INTO `inf_job_log` VALUES (3888, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 00:53:00', '2021-02-27 00:53:00', 9, 1, '', '', '2021-02-26 00:24:28', '', '2021-02-26 00:24:28', b'0'); -INSERT INTO `inf_job_log` VALUES (3889, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 00:54:00', '2021-02-27 00:54:00', 4, 1, '', '', '2021-02-26 00:25:28', '', '2021-02-26 00:25:28', b'0'); -INSERT INTO `inf_job_log` VALUES (3890, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 00:55:12', '2021-02-27 00:55:12', 6, 1, '', '', '2021-02-26 00:26:40', '', '2021-02-26 00:26:40', b'0'); -INSERT INTO `inf_job_log` VALUES (3891, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 00:56:46', '2021-02-27 00:56:46', 4, 1, '', '', '2021-02-26 00:28:14', '', '2021-02-26 00:28:14', b'0'); -INSERT INTO `inf_job_log` VALUES (3892, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 00:57:06', '2021-02-27 00:57:06', 5, 1, '', '', '2021-02-26 00:28:34', '', '2021-02-26 00:28:34', b'0'); -INSERT INTO `inf_job_log` VALUES (3893, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 00:58:00', '2021-02-27 00:58:00', 15, 1, '', '', '2021-02-26 00:29:28', '', '2021-02-26 00:29:28', b'0'); -INSERT INTO `inf_job_log` VALUES (3894, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 00:59:00', '2021-02-27 00:59:00', 5, 1, '', '', '2021-02-26 00:30:29', '', '2021-02-26 00:30:29', b'0'); -INSERT INTO `inf_job_log` VALUES (3895, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 01:00:18', '2021-02-27 01:00:18', 32, 1, '', '', '2021-02-26 00:31:46', '', '2021-02-26 00:31:46', b'0'); -INSERT INTO `inf_job_log` VALUES (3896, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 01:01:00', '2021-02-27 01:01:00', 4, 1, '', '', '2021-02-26 00:32:29', '', '2021-02-26 00:32:29', b'0'); -INSERT INTO `inf_job_log` VALUES (3897, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 01:02:00', '2021-02-27 01:02:00', 5, 1, '', '', '2021-02-26 00:33:29', '', '2021-02-26 00:33:29', b'0'); -INSERT INTO `inf_job_log` VALUES (3898, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 01:03:00', '2021-02-27 01:03:00', 5, 1, '', '', '2021-02-26 00:34:29', '', '2021-02-26 00:34:29', b'0'); -INSERT INTO `inf_job_log` VALUES (3899, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 01:04:00', '2021-02-27 01:04:00', 4, 1, '', '', '2021-02-26 00:35:29', '', '2021-02-26 00:35:29', b'0'); -INSERT INTO `inf_job_log` VALUES (3900, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 01:05:00', '2021-02-27 01:05:00', 7, 1, '', '', '2021-02-26 00:36:29', '', '2021-02-26 00:36:29', b'0'); -INSERT INTO `inf_job_log` VALUES (3901, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 01:06:00', '2021-02-27 01:06:00', 5, 1, '', '', '2021-02-26 00:37:29', '', '2021-02-26 00:37:29', b'0'); -INSERT INTO `inf_job_log` VALUES (3902, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 01:07:00', '2021-02-27 01:07:00', 6, 1, '', '', '2021-02-26 00:38:29', '', '2021-02-26 00:38:29', b'0'); -INSERT INTO `inf_job_log` VALUES (3903, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 01:08:00', '2021-02-27 01:08:00', 4, 1, '', '', '2021-02-26 00:39:29', '', '2021-02-26 00:39:29', b'0'); -INSERT INTO `inf_job_log` VALUES (3904, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 01:09:00', '2021-02-27 01:09:00', 4, 1, '', '', '2021-02-26 00:40:29', '', '2021-02-26 00:40:29', b'0'); -INSERT INTO `inf_job_log` VALUES (3905, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 01:10:00', '2021-02-27 01:10:00', 6, 1, '', '', '2021-02-26 00:41:29', '', '2021-02-26 00:41:29', b'0'); -INSERT INTO `inf_job_log` VALUES (3906, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 01:11:00', '2021-02-27 01:11:00', 5, 1, '', '', '2021-02-26 00:42:29', '', '2021-02-26 00:42:29', b'0'); -INSERT INTO `inf_job_log` VALUES (3907, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 01:12:00', '2021-02-27 01:12:00', 4, 1, '', '', '2021-02-26 00:43:29', '', '2021-02-26 00:43:29', b'0'); -INSERT INTO `inf_job_log` VALUES (3908, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 01:13:00', '2021-02-27 01:13:00', 4, 1, '', '', '2021-02-26 00:44:29', '', '2021-02-26 00:44:29', b'0'); -INSERT INTO `inf_job_log` VALUES (3909, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 01:14:00', '2021-02-27 01:14:00', 4, 1, '', '', '2021-02-26 00:45:30', '', '2021-02-26 00:45:30', b'0'); -INSERT INTO `inf_job_log` VALUES (3910, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 01:15:00', '2021-02-27 01:15:00', 5, 1, '', '', '2021-02-26 00:46:30', '', '2021-02-26 00:46:30', b'0'); -INSERT INTO `inf_job_log` VALUES (3911, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 01:16:00', '2021-02-27 01:16:00', 4, 1, '', '', '2021-02-26 00:47:30', '', '2021-02-26 00:47:30', b'0'); -INSERT INTO `inf_job_log` VALUES (3912, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 01:17:00', '2021-02-27 01:17:00', 6, 1, '', '', '2021-02-26 00:48:30', '', '2021-02-26 00:48:30', b'0'); -INSERT INTO `inf_job_log` VALUES (3913, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 01:18:00', '2021-02-27 01:18:00', 4, 1, '', '', '2021-02-26 00:49:30', '', '2021-02-26 00:49:30', b'0'); -INSERT INTO `inf_job_log` VALUES (3914, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 01:19:00', '2021-02-27 01:19:00', 4, 1, '', '', '2021-02-26 00:50:30', '', '2021-02-26 00:50:30', b'0'); -INSERT INTO `inf_job_log` VALUES (3915, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 01:20:00', '2021-02-27 01:20:00', 4, 1, '', '', '2021-02-26 00:51:30', '', '2021-02-26 00:51:30', b'0'); -INSERT INTO `inf_job_log` VALUES (3916, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 01:21:00', '2021-02-27 01:21:00', 5, 1, '', '', '2021-02-26 00:52:30', '', '2021-02-26 00:52:30', b'0'); -INSERT INTO `inf_job_log` VALUES (3917, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 01:22:00', '2021-02-27 01:22:00', 9, 1, '', '', '2021-02-26 00:53:30', '', '2021-02-26 00:53:30', b'0'); -INSERT INTO `inf_job_log` VALUES (3918, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 01:23:00', '2021-02-27 01:23:00', 4, 1, '', '', '2021-02-26 00:54:30', '', '2021-02-26 00:54:30', b'0'); -INSERT INTO `inf_job_log` VALUES (3919, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 01:24:00', '2021-02-27 01:24:00', 5, 1, '', '', '2021-02-26 00:55:30', '', '2021-02-26 00:55:30', b'0'); -INSERT INTO `inf_job_log` VALUES (3920, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 01:25:00', '2021-02-27 01:25:00', 5, 1, '', '', '2021-02-26 00:56:30', '', '2021-02-26 00:56:30', b'0'); -INSERT INTO `inf_job_log` VALUES (3921, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 01:26:00', '2021-02-27 01:26:00', 3, 1, '', '', '2021-02-26 00:57:30', '', '2021-02-26 00:57:30', b'0'); -INSERT INTO `inf_job_log` VALUES (3922, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 01:27:21', '2021-02-27 01:27:21', 19, 1, '', '', '2021-02-26 00:58:52', '', '2021-02-26 00:58:52', b'0'); -INSERT INTO `inf_job_log` VALUES (3923, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 01:28:00', '2021-02-27 01:28:00', 6, 1, '', '', '2021-02-26 00:59:31', '', '2021-02-26 00:59:31', b'0'); -INSERT INTO `inf_job_log` VALUES (3924, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 10:16:57', '2021-02-27 10:16:57', 39, 1, '', '', '2021-02-26 01:22:00', '', '2021-02-26 01:22:00', b'0'); -INSERT INTO `inf_job_log` VALUES (3925, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 10:17:00', '2021-02-27 10:17:00', 6, 1, '', '', '2021-02-26 01:22:03', '', '2021-02-26 01:22:03', b'0'); -INSERT INTO `inf_job_log` VALUES (3926, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 10:18:00', '2021-02-27 10:18:00', 7, 1, '', '', '2021-02-26 01:23:03', '', '2021-02-26 01:23:03', b'0'); -INSERT INTO `inf_job_log` VALUES (3927, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 10:19:00', '2021-02-27 10:19:00', 7, 1, '', '', '2021-02-26 01:24:03', '', '2021-02-26 01:24:03', b'0'); -INSERT INTO `inf_job_log` VALUES (3928, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 10:20:00', '2021-02-27 10:20:00', 6, 1, '', '', '2021-02-26 01:25:03', '', '2021-02-26 01:25:03', b'0'); -INSERT INTO `inf_job_log` VALUES (3929, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 10:21:00', '2021-02-27 10:21:00', 386, 1, '', '', '2021-02-26 01:26:04', '', '2021-02-26 01:26:04', b'0'); -INSERT INTO `inf_job_log` VALUES (3930, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 10:22:00', '2021-02-27 10:22:00', 6, 1, '', '', '2021-02-26 01:27:03', '', '2021-02-26 01:27:03', b'0'); -INSERT INTO `inf_job_log` VALUES (3931, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 10:23:00', '2021-02-27 10:23:00', 5, 1, '', '', '2021-02-26 01:28:04', '', '2021-02-26 01:28:04', b'0'); -INSERT INTO `inf_job_log` VALUES (3932, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 10:24:00', '2021-02-27 10:24:00', 4, 1, '', '', '2021-02-26 01:29:04', '', '2021-02-26 01:29:04', b'0'); -INSERT INTO `inf_job_log` VALUES (3933, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 10:25:00', '2021-02-27 10:25:00', 4, 1, '', '', '2021-02-26 01:30:04', '', '2021-02-26 01:30:04', b'0'); -INSERT INTO `inf_job_log` VALUES (3934, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 10:26:00', '2021-02-27 10:26:00', 4, 1, '', '', '2021-02-26 01:31:04', '', '2021-02-26 01:31:04', b'0'); -INSERT INTO `inf_job_log` VALUES (3935, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 10:27:00', '2021-02-27 10:27:00', 4, 1, '', '', '2021-02-26 01:32:04', '', '2021-02-26 01:32:04', b'0'); -INSERT INTO `inf_job_log` VALUES (3936, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 10:28:00', '2021-02-27 10:28:00', 3, 1, '', '', '2021-02-26 01:33:04', '', '2021-02-26 01:33:04', b'0'); -INSERT INTO `inf_job_log` VALUES (3937, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 10:29:00', '2021-02-27 10:29:00', 4, 1, '', '', '2021-02-26 01:34:04', '', '2021-02-26 01:34:04', b'0'); -INSERT INTO `inf_job_log` VALUES (3938, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 10:30:00', '2021-02-27 10:30:00', 4, 1, '', '', '2021-02-26 01:35:04', '', '2021-02-26 01:35:04', b'0'); -INSERT INTO `inf_job_log` VALUES (3939, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 10:31:00', '2021-02-27 10:31:00', 6, 1, '', '', '2021-02-26 01:36:04', '', '2021-02-26 01:36:04', b'0'); -INSERT INTO `inf_job_log` VALUES (3940, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 10:32:00', '2021-02-27 10:32:00', 4, 1, '', '', '2021-02-26 01:37:04', '', '2021-02-26 01:37:04', b'0'); -INSERT INTO `inf_job_log` VALUES (3941, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 10:33:00', '2021-02-27 10:33:00', 4, 1, '', '', '2021-02-26 01:38:04', '', '2021-02-26 01:38:04', b'0'); -INSERT INTO `inf_job_log` VALUES (3942, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 10:34:00', '2021-02-27 10:34:00', 4, 1, '', '', '2021-02-26 01:39:04', '', '2021-02-26 01:39:04', b'0'); -INSERT INTO `inf_job_log` VALUES (3943, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 10:35:00', '2021-02-27 10:35:00', 3, 1, '', '', '2021-02-26 01:40:04', '', '2021-02-26 01:40:04', b'0'); -INSERT INTO `inf_job_log` VALUES (3944, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 10:36:00', '2021-02-27 10:36:00', 4, 1, '', '', '2021-02-26 01:41:04', '', '2021-02-26 01:41:04', b'0'); -INSERT INTO `inf_job_log` VALUES (3945, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:08:38', '2021-02-27 11:08:38', 45, 1, '', '', '2021-02-26 02:13:44', '', '2021-02-26 02:13:44', b'0'); -INSERT INTO `inf_job_log` VALUES (3946, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:09:00', '2021-02-27 11:09:00', 9, 1, '', '', '2021-02-26 02:14:07', '', '2021-02-26 02:14:07', b'0'); -INSERT INTO `inf_job_log` VALUES (3947, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:10:00', '2021-02-27 11:10:00', 6, 1, '', '', '2021-02-26 02:15:07', '', '2021-02-26 02:15:07', b'0'); -INSERT INTO `inf_job_log` VALUES (3948, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:11:00', '2021-02-27 11:11:00', 5, 1, '', '', '2021-02-26 02:16:07', '', '2021-02-26 02:16:07', b'0'); -INSERT INTO `inf_job_log` VALUES (3949, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:12:00', '2021-02-27 11:12:00', 10, 1, '', '', '2021-02-26 02:17:07', '', '2021-02-26 02:17:07', b'0'); -INSERT INTO `inf_job_log` VALUES (3950, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:13:00', '2021-02-27 11:13:00', 5, 1, '', '', '2021-02-26 02:18:07', '', '2021-02-26 02:18:07', b'0'); -INSERT INTO `inf_job_log` VALUES (3951, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:14:00', '2021-02-27 11:14:00', 4, 1, '', '', '2021-02-26 02:19:07', '', '2021-02-26 02:19:07', b'0'); -INSERT INTO `inf_job_log` VALUES (3952, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:15:00', '2021-02-27 11:15:00', 6, 1, '', '', '2021-02-26 02:20:07', '', '2021-02-26 02:20:07', b'0'); -INSERT INTO `inf_job_log` VALUES (3953, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:16:00', '2021-02-27 11:16:00', 3, 1, '', '', '2021-02-26 02:21:07', '', '2021-02-26 02:21:07', b'0'); -INSERT INTO `inf_job_log` VALUES (3954, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:17:00', '2021-02-27 11:17:00', 4, 1, '', '', '2021-02-26 02:22:07', '', '2021-02-26 02:22:07', b'0'); -INSERT INTO `inf_job_log` VALUES (3955, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:18:00', '2021-02-27 11:18:00', 6, 1, '', '', '2021-02-26 02:23:07', '', '2021-02-26 02:23:07', b'0'); -INSERT INTO `inf_job_log` VALUES (3956, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:19:00', '2021-02-27 11:19:00', 3, 1, '', '', '2021-02-26 02:24:07', '', '2021-02-26 02:24:07', b'0'); -INSERT INTO `inf_job_log` VALUES (3957, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:20:00', '2021-02-27 11:20:00', 4, 1, '', '', '2021-02-26 02:25:07', '', '2021-02-26 02:25:07', b'0'); -INSERT INTO `inf_job_log` VALUES (3958, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:21:00', '2021-02-27 11:21:00', 4, 1, '', '', '2021-02-26 02:26:07', '', '2021-02-26 02:26:07', b'0'); -INSERT INTO `inf_job_log` VALUES (3959, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:22:00', '2021-02-27 11:22:00', 2, 1, '', '', '2021-02-26 02:27:08', '', '2021-02-26 02:27:08', b'0'); -INSERT INTO `inf_job_log` VALUES (3960, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:23:00', '2021-02-27 11:23:00', 5, 1, '', '', '2021-02-26 02:28:08', '', '2021-02-26 02:28:08', b'0'); -INSERT INTO `inf_job_log` VALUES (3961, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:24:00', '2021-02-27 11:24:00', 4, 1, '', '', '2021-02-26 02:29:08', '', '2021-02-26 02:29:08', b'0'); -INSERT INTO `inf_job_log` VALUES (3962, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:25:00', '2021-02-27 11:25:00', 5, 1, '', '', '2021-02-26 02:30:08', '', '2021-02-26 02:30:08', b'0'); -INSERT INTO `inf_job_log` VALUES (3963, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:26:00', '2021-02-27 11:26:00', 3, 1, '', '', '2021-02-26 02:31:08', '', '2021-02-26 02:31:08', b'0'); -INSERT INTO `inf_job_log` VALUES (3964, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:27:00', '2021-02-27 11:27:00', 5, 1, '', '', '2021-02-26 02:32:08', '', '2021-02-26 02:32:08', b'0'); -INSERT INTO `inf_job_log` VALUES (3965, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:28:00', '2021-02-27 11:28:00', 3, 1, '', '', '2021-02-26 02:33:08', '', '2021-02-26 02:33:08', b'0'); -INSERT INTO `inf_job_log` VALUES (3966, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:29:00', '2021-02-27 11:29:00', 4, 1, '', '', '2021-02-26 02:34:08', '', '2021-02-26 02:34:08', b'0'); -INSERT INTO `inf_job_log` VALUES (3967, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:30:00', '2021-02-27 11:30:00', 4, 1, '', '', '2021-02-26 02:35:08', '', '2021-02-26 02:35:08', b'0'); -INSERT INTO `inf_job_log` VALUES (3968, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:31:00', '2021-02-27 11:31:00', 4, 1, '', '', '2021-02-26 02:36:08', '', '2021-02-26 02:36:08', b'0'); -INSERT INTO `inf_job_log` VALUES (3969, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:32:00', '2021-02-27 11:32:00', 3, 1, '', '', '2021-02-26 02:37:08', '', '2021-02-26 02:37:08', b'0'); -INSERT INTO `inf_job_log` VALUES (3970, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:33:00', '2021-02-27 11:33:00', 4, 1, '', '', '2021-02-26 02:38:08', '', '2021-02-26 02:38:08', b'0'); -INSERT INTO `inf_job_log` VALUES (3971, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:34:00', '2021-02-27 11:34:00', 4, 1, '', '', '2021-02-26 02:39:08', '', '2021-02-26 02:39:08', b'0'); -INSERT INTO `inf_job_log` VALUES (3972, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:35:00', '2021-02-27 11:35:00', 5, 1, '', '', '2021-02-26 02:40:08', '', '2021-02-26 02:40:08', b'0'); -INSERT INTO `inf_job_log` VALUES (3973, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:36:00', '2021-02-27 11:36:00', 3, 1, '', '', '2021-02-26 02:41:08', '', '2021-02-26 02:41:08', b'0'); -INSERT INTO `inf_job_log` VALUES (3974, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:37:00', '2021-02-27 11:37:00', 3, 1, '', '', '2021-02-26 02:42:09', '', '2021-02-26 02:42:09', b'0'); -INSERT INTO `inf_job_log` VALUES (3975, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:38:00', '2021-02-27 11:38:00', 5, 1, '', '', '2021-02-26 02:43:09', '', '2021-02-26 02:43:09', b'0'); -INSERT INTO `inf_job_log` VALUES (3976, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:39:00', '2021-02-27 11:39:00', 204, 1, '', '', '2021-02-26 02:44:09', '', '2021-02-26 02:44:09', b'0'); -INSERT INTO `inf_job_log` VALUES (3977, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:40:00', '2021-02-27 11:40:00', 4, 1, '', '', '2021-02-26 02:45:09', '', '2021-02-26 02:45:09', b'0'); -INSERT INTO `inf_job_log` VALUES (3978, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:41:00', '2021-02-27 11:41:00', 4, 1, '', '', '2021-02-26 02:46:09', '', '2021-02-26 02:46:09', b'0'); -INSERT INTO `inf_job_log` VALUES (3979, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:42:00', '2021-02-27 11:42:00', 3, 1, '', '', '2021-02-26 02:47:09', '', '2021-02-26 02:47:09', b'0'); -INSERT INTO `inf_job_log` VALUES (3980, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:43:00', '2021-02-27 11:43:00', 3, 1, '', '', '2021-02-26 02:48:09', '', '2021-02-26 02:48:09', b'0'); -INSERT INTO `inf_job_log` VALUES (3981, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:44:00', '2021-02-27 11:44:00', 4, 1, '', '', '2021-02-26 02:49:09', '', '2021-02-26 02:49:09', b'0'); -INSERT INTO `inf_job_log` VALUES (3982, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:45:00', '2021-02-27 11:45:00', 3, 1, '', '', '2021-02-26 02:50:09', '', '2021-02-26 02:50:09', b'0'); -INSERT INTO `inf_job_log` VALUES (3983, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:46:00', '2021-02-27 11:46:00', 4, 1, '', '', '2021-02-26 02:51:09', '', '2021-02-26 02:51:09', b'0'); -INSERT INTO `inf_job_log` VALUES (3984, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:47:00', '2021-02-27 11:47:00', 2, 1, '', '', '2021-02-26 02:52:09', '', '2021-02-26 02:52:09', b'0'); -INSERT INTO `inf_job_log` VALUES (3985, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:48:00', '2021-02-27 11:48:00', 3, 1, '', '', '2021-02-26 02:53:09', '', '2021-02-26 02:53:09', b'0'); -INSERT INTO `inf_job_log` VALUES (3986, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:49:00', '2021-02-27 11:49:00', 3, 1, '', '', '2021-02-26 02:54:09', '', '2021-02-26 02:54:09', b'0'); -INSERT INTO `inf_job_log` VALUES (3987, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:50:00', '2021-02-27 11:50:00', 3, 1, '', '', '2021-02-26 02:55:09', '', '2021-02-26 02:55:09', b'0'); -INSERT INTO `inf_job_log` VALUES (3988, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:51:00', '2021-02-27 11:51:00', 3, 1, '', '', '2021-02-26 02:56:10', '', '2021-02-26 02:56:10', b'0'); -INSERT INTO `inf_job_log` VALUES (3989, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:52:00', '2021-02-27 11:52:00', 3, 1, '', '', '2021-02-26 02:57:10', '', '2021-02-26 02:57:10', b'0'); -INSERT INTO `inf_job_log` VALUES (3990, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:53:00', '2021-02-27 11:53:00', 4, 1, '', '', '2021-02-26 02:58:10', '', '2021-02-26 02:58:10', b'0'); -INSERT INTO `inf_job_log` VALUES (3991, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:54:00', '2021-02-27 11:54:00', 3, 1, '', '', '2021-02-26 02:59:10', '', '2021-02-26 02:59:10', b'0'); -INSERT INTO `inf_job_log` VALUES (3992, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:55:00', '2021-02-27 11:55:00', 3, 1, '', '', '2021-02-26 03:00:10', '', '2021-02-26 03:00:10', b'0'); -INSERT INTO `inf_job_log` VALUES (3993, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:56:00', '2021-02-27 11:56:00', 4, 1, '', '', '2021-02-26 03:01:10', '', '2021-02-26 03:01:10', b'0'); -INSERT INTO `inf_job_log` VALUES (3994, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:57:00', '2021-02-27 11:57:00', 4, 1, '', '', '2021-02-26 03:02:10', '', '2021-02-26 03:02:10', b'0'); -INSERT INTO `inf_job_log` VALUES (3995, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:58:00', '2021-02-27 11:58:00', 5, 1, '', '', '2021-02-26 03:03:10', '', '2021-02-26 03:03:10', b'0'); -INSERT INTO `inf_job_log` VALUES (3996, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 11:59:00', '2021-02-27 11:59:00', 3, 1, '', '', '2021-02-26 03:04:10', '', '2021-02-26 03:04:10', b'0'); -INSERT INTO `inf_job_log` VALUES (3997, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:00:00', '2021-02-27 12:00:00', 4, 1, '', '', '2021-02-26 03:05:10', '', '2021-02-26 03:05:10', b'0'); -INSERT INTO `inf_job_log` VALUES (3998, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:01:00', '2021-02-27 12:01:00', 4, 1, '', '', '2021-02-26 03:06:10', '', '2021-02-26 03:06:10', b'0'); -INSERT INTO `inf_job_log` VALUES (3999, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:02:00', '2021-02-27 12:02:00', 3, 1, '', '', '2021-02-26 03:07:10', '', '2021-02-26 03:07:10', b'0'); -INSERT INTO `inf_job_log` VALUES (4000, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:03:00', '2021-02-27 12:03:00', 4, 1, '', '', '2021-02-26 03:08:10', '', '2021-02-26 03:08:10', b'0'); -INSERT INTO `inf_job_log` VALUES (4001, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:04:00', '2021-02-27 12:04:00', 5, 1, '', '', '2021-02-26 03:09:10', '', '2021-02-26 03:09:10', b'0'); -INSERT INTO `inf_job_log` VALUES (4002, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:05:00', '2021-02-27 12:05:00', 3, 1, '', '', '2021-02-26 03:10:10', '', '2021-02-26 03:10:10', b'0'); -INSERT INTO `inf_job_log` VALUES (4003, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:06:00', '2021-02-27 12:06:00', 4, 1, '', '', '2021-02-26 03:11:11', '', '2021-02-26 03:11:11', b'0'); -INSERT INTO `inf_job_log` VALUES (4004, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:07:00', '2021-02-27 12:07:00', 5, 1, '', '', '2021-02-26 03:12:11', '', '2021-02-26 03:12:11', b'0'); -INSERT INTO `inf_job_log` VALUES (4005, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:08:00', '2021-02-27 12:08:00', 3, 1, '', '', '2021-02-26 03:13:11', '', '2021-02-26 03:13:11', b'0'); -INSERT INTO `inf_job_log` VALUES (4006, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:09:00', '2021-02-27 12:09:00', 4, 1, '', '', '2021-02-26 03:14:11', '', '2021-02-26 03:14:11', b'0'); -INSERT INTO `inf_job_log` VALUES (4007, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:10:00', '2021-02-27 12:10:00', 2, 1, '', '', '2021-02-26 03:15:11', '', '2021-02-26 03:15:11', b'0'); -INSERT INTO `inf_job_log` VALUES (4008, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:11:00', '2021-02-27 12:11:00', 5, 1, '', '', '2021-02-26 03:16:11', '', '2021-02-26 03:16:11', b'0'); -INSERT INTO `inf_job_log` VALUES (4009, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:12:00', '2021-02-27 12:12:00', 3, 1, '', '', '2021-02-26 03:17:11', '', '2021-02-26 03:17:11', b'0'); -INSERT INTO `inf_job_log` VALUES (4010, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:13:00', '2021-02-27 12:13:00', 4, 1, '', '', '2021-02-26 03:18:11', '', '2021-02-26 03:18:11', b'0'); -INSERT INTO `inf_job_log` VALUES (4011, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:14:00', '2021-02-27 12:14:00', 3, 1, '', '', '2021-02-26 03:19:11', '', '2021-02-26 03:19:11', b'0'); -INSERT INTO `inf_job_log` VALUES (4012, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:15:00', '2021-02-27 12:15:00', 3, 1, '', '', '2021-02-26 03:20:11', '', '2021-02-26 03:20:11', b'0'); -INSERT INTO `inf_job_log` VALUES (4013, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:16:00', '2021-02-27 12:16:00', 3, 1, '', '', '2021-02-26 03:21:11', '', '2021-02-26 03:21:11', b'0'); -INSERT INTO `inf_job_log` VALUES (4014, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:17:00', '2021-02-27 12:17:00', 4, 1, '', '', '2021-02-26 03:22:11', '', '2021-02-26 03:22:11', b'0'); -INSERT INTO `inf_job_log` VALUES (4015, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:18:00', '2021-02-27 12:18:00', 3, 1, '', '', '2021-02-26 03:23:11', '', '2021-02-26 03:23:11', b'0'); -INSERT INTO `inf_job_log` VALUES (4016, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:19:00', '2021-02-27 12:19:00', 4, 1, '', '', '2021-02-26 03:24:11', '', '2021-02-26 03:24:11', b'0'); -INSERT INTO `inf_job_log` VALUES (4017, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:20:00', '2021-02-27 12:20:00', 3, 1, '', '', '2021-02-26 03:25:11', '', '2021-02-26 03:25:12', b'0'); -INSERT INTO `inf_job_log` VALUES (4018, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:21:00', '2021-02-27 12:21:00', 3, 1, '', '', '2021-02-26 03:26:12', '', '2021-02-26 03:26:12', b'0'); -INSERT INTO `inf_job_log` VALUES (4019, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:22:00', '2021-02-27 12:22:00', 4, 1, '', '', '2021-02-26 03:27:12', '', '2021-02-26 03:27:12', b'0'); -INSERT INTO `inf_job_log` VALUES (4020, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:23:00', '2021-02-27 12:23:00', 4, 1, '', '', '2021-02-26 03:28:12', '', '2021-02-26 03:28:12', b'0'); -INSERT INTO `inf_job_log` VALUES (4021, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:24:00', '2021-02-27 12:24:00', 4, 1, '', '', '2021-02-26 03:29:12', '', '2021-02-26 03:29:12', b'0'); -INSERT INTO `inf_job_log` VALUES (4022, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:25:00', '2021-02-27 12:25:00', 3, 1, '', '', '2021-02-26 03:30:12', '', '2021-02-26 03:30:12', b'0'); -INSERT INTO `inf_job_log` VALUES (4023, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:26:00', '2021-02-27 12:26:00', 4, 1, '', '', '2021-02-26 03:31:12', '', '2021-02-26 03:31:12', b'0'); -INSERT INTO `inf_job_log` VALUES (4024, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:27:00', '2021-02-27 12:27:00', 4, 1, '', '', '2021-02-26 03:32:12', '', '2021-02-26 03:32:12', b'0'); -INSERT INTO `inf_job_log` VALUES (4025, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:28:00', '2021-02-27 12:28:00', 4, 1, '', '', '2021-02-26 03:33:12', '', '2021-02-26 03:33:12', b'0'); -INSERT INTO `inf_job_log` VALUES (4026, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:29:00', '2021-02-27 12:29:00', 3, 1, '', '', '2021-02-26 03:34:12', '', '2021-02-26 03:34:12', b'0'); -INSERT INTO `inf_job_log` VALUES (4027, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:30:00', '2021-02-27 12:30:00', 3, 1, '', '', '2021-02-26 03:35:12', '', '2021-02-26 03:35:12', b'0'); -INSERT INTO `inf_job_log` VALUES (4028, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:31:00', '2021-02-27 12:31:00', 4, 1, '', '', '2021-02-26 03:36:12', '', '2021-02-26 03:36:12', b'0'); -INSERT INTO `inf_job_log` VALUES (4029, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:32:00', '2021-02-27 12:32:00', 4, 1, '', '', '2021-02-26 03:37:12', '', '2021-02-26 03:37:12', b'0'); -INSERT INTO `inf_job_log` VALUES (4030, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:33:00', '2021-02-27 12:33:00', 4, 1, '', '', '2021-02-26 03:38:12', '', '2021-02-26 03:38:12', b'0'); -INSERT INTO `inf_job_log` VALUES (4031, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:34:00', '2021-02-27 12:34:00', 5, 1, '', '', '2021-02-26 03:39:12', '', '2021-02-26 03:39:12', b'0'); -INSERT INTO `inf_job_log` VALUES (4032, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:35:00', '2021-02-27 12:35:00', 4, 1, '', '', '2021-02-26 03:40:13', '', '2021-02-26 03:40:13', b'0'); -INSERT INTO `inf_job_log` VALUES (4033, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:36:00', '2021-02-27 12:36:00', 3, 1, '', '', '2021-02-26 03:41:13', '', '2021-02-26 03:41:13', b'0'); -INSERT INTO `inf_job_log` VALUES (4034, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:37:00', '2021-02-27 12:37:00', 4, 1, '', '', '2021-02-26 03:42:13', '', '2021-02-26 03:42:13', b'0'); -INSERT INTO `inf_job_log` VALUES (4035, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:38:00', '2021-02-27 12:38:00', 2, 1, '', '', '2021-02-26 03:43:13', '', '2021-02-26 03:43:13', b'0'); -INSERT INTO `inf_job_log` VALUES (4036, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:39:00', '2021-02-27 12:39:00', 4, 1, '', '', '2021-02-26 03:44:13', '', '2021-02-26 03:44:13', b'0'); -INSERT INTO `inf_job_log` VALUES (4037, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:40:00', '2021-02-27 12:40:00', 3, 1, '', '', '2021-02-26 03:45:13', '', '2021-02-26 03:45:13', b'0'); -INSERT INTO `inf_job_log` VALUES (4038, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:41:00', '2021-02-27 12:41:00', 4, 1, '', '', '2021-02-26 03:46:13', '', '2021-02-26 03:46:13', b'0'); -INSERT INTO `inf_job_log` VALUES (4039, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:42:00', '2021-02-27 12:42:00', 5, 1, '', '', '2021-02-26 03:47:13', '', '2021-02-26 03:47:13', b'0'); -INSERT INTO `inf_job_log` VALUES (4040, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:43:00', '2021-02-27 12:43:00', 6, 1, '', '', '2021-02-26 03:48:13', '', '2021-02-26 03:48:13', b'0'); -INSERT INTO `inf_job_log` VALUES (4041, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:44:00', '2021-02-27 12:44:00', 3, 1, '', '', '2021-02-26 03:49:13', '', '2021-02-26 03:49:13', b'0'); -INSERT INTO `inf_job_log` VALUES (4042, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:45:00', '2021-02-27 12:45:00', 3, 1, '', '', '2021-02-26 03:50:13', '', '2021-02-26 03:50:13', b'0'); -INSERT INTO `inf_job_log` VALUES (4043, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:46:00', '2021-02-27 12:46:00', 4, 1, '', '', '2021-02-26 03:51:13', '', '2021-02-26 03:51:13', b'0'); -INSERT INTO `inf_job_log` VALUES (4044, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:47:00', '2021-02-27 12:47:00', 4, 1, '', '', '2021-02-26 03:52:13', '', '2021-02-26 03:52:13', b'0'); -INSERT INTO `inf_job_log` VALUES (4045, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:48:00', '2021-02-27 12:48:00', 5, 1, '', '', '2021-02-26 03:53:13', '', '2021-02-26 03:53:13', b'0'); -INSERT INTO `inf_job_log` VALUES (4046, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:49:00', '2021-02-27 12:49:00', 4, 1, '', '', '2021-02-26 03:54:13', '', '2021-02-26 03:54:13', b'0'); -INSERT INTO `inf_job_log` VALUES (4047, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:50:00', '2021-02-27 12:50:00', 3, 1, '', '', '2021-02-26 03:55:14', '', '2021-02-26 03:55:14', b'0'); -INSERT INTO `inf_job_log` VALUES (4048, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 12:51:00', '2021-02-27 12:51:00', 3, 1, '', '', '2021-02-26 03:56:14', '', '2021-02-26 03:56:14', b'0'); -INSERT INTO `inf_job_log` VALUES (4049, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 20:29:50', '2021-02-27 20:29:50', 37, 1, '', '', '2021-02-26 06:15:54', '', '2021-02-26 06:15:55', b'0'); -INSERT INTO `inf_job_log` VALUES (4050, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 20:54:15', '2021-02-27 20:54:15', 35, 1, '', '', '2021-02-26 06:40:21', '', '2021-02-26 06:40:21', b'0'); -INSERT INTO `inf_job_log` VALUES (4051, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 20:55:00', '2021-02-27 20:55:00', 9, 1, '', '', '2021-02-26 06:41:06', '', '2021-02-26 06:41:06', b'0'); -INSERT INTO `inf_job_log` VALUES (4052, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 20:56:00', '2021-02-27 20:56:00', 6, 1, '', '', '2021-02-26 06:42:06', '', '2021-02-26 06:42:06', b'0'); -INSERT INTO `inf_job_log` VALUES (4053, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 20:57:00', '2021-02-27 20:57:00', 5, 1, '', '', '2021-02-26 06:43:07', '', '2021-02-26 06:43:07', b'0'); -INSERT INTO `inf_job_log` VALUES (4054, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 20:58:00', '2021-02-27 20:58:00', 11, 1, '', '', '2021-02-26 06:44:07', '', '2021-02-26 06:44:07', b'0'); -INSERT INTO `inf_job_log` VALUES (4055, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 20:59:00', '2021-02-27 20:59:00', 8, 1, '', '', '2021-02-26 06:45:07', '', '2021-02-26 06:45:07', b'0'); -INSERT INTO `inf_job_log` VALUES (4056, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:00:00', '2021-02-27 21:00:00', 19, 1, '', '', '2021-02-26 06:46:07', '', '2021-02-26 06:46:07', b'0'); -INSERT INTO `inf_job_log` VALUES (4057, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:01:00', '2021-02-27 21:01:00', 6, 1, '', '', '2021-02-26 06:47:07', '', '2021-02-26 06:47:07', b'0'); -INSERT INTO `inf_job_log` VALUES (4058, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:04:19', '2021-02-27 21:04:19', 38, 1, '', '', '2021-02-26 06:50:26', '', '2021-02-26 06:50:26', b'0'); -INSERT INTO `inf_job_log` VALUES (4059, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:05:55', '2021-02-27 21:05:55', 12, 1, '', '', '2021-02-26 06:52:03', '', '2021-02-26 06:52:03', b'0'); -INSERT INTO `inf_job_log` VALUES (4060, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:06:01', '2021-02-27 21:06:01', 6, 1, '', '', '2021-02-26 06:52:08', '', '2021-02-26 06:52:08', b'0'); -INSERT INTO `inf_job_log` VALUES (4061, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:07:06', '2021-02-27 21:07:06', 6, 1, '', '', '2021-02-26 06:53:14', '', '2021-02-26 06:53:14', b'0'); -INSERT INTO `inf_job_log` VALUES (4062, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:08:21', '2021-02-27 21:08:21', 45, 1, '', '', '2021-02-26 06:54:29', '', '2021-02-26 06:54:29', b'0'); -INSERT INTO `inf_job_log` VALUES (4063, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:09:00', '2021-02-27 21:09:00', 5, 1, '', '', '2021-02-26 06:55:07', '', '2021-02-26 06:55:07', b'0'); -INSERT INTO `inf_job_log` VALUES (4064, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:10:00', '2021-02-27 21:10:00', 5, 1, '', '', '2021-02-26 06:56:07', '', '2021-02-26 06:56:07', b'0'); -INSERT INTO `inf_job_log` VALUES (4065, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:11:00', '2021-02-27 21:11:00', 6, 1, '', '', '2021-02-26 06:57:07', '', '2021-02-26 06:57:07', b'0'); -INSERT INTO `inf_job_log` VALUES (4066, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:12:00', '2021-02-27 21:12:00', 5, 1, '', '', '2021-02-26 06:58:08', '', '2021-02-26 06:58:08', b'0'); -INSERT INTO `inf_job_log` VALUES (4067, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:13:00', '2021-02-27 21:13:00', 4, 1, '', '', '2021-02-26 06:59:08', '', '2021-02-26 06:59:08', b'0'); -INSERT INTO `inf_job_log` VALUES (4068, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:14:00', '2021-02-27 21:14:00', 4, 1, '', '', '2021-02-26 07:00:08', '', '2021-02-26 07:00:08', b'0'); -INSERT INTO `inf_job_log` VALUES (4069, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:15:00', '2021-02-27 21:15:00', 5, 1, '', '', '2021-02-26 07:01:08', '', '2021-02-26 07:01:08', b'0'); -INSERT INTO `inf_job_log` VALUES (4070, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:16:00', '2021-02-27 21:16:00', 6, 1, '', '', '2021-02-26 07:02:08', '', '2021-02-26 07:02:08', b'0'); -INSERT INTO `inf_job_log` VALUES (4071, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:17:00', '2021-02-27 21:17:00', 5, 1, '', '', '2021-02-26 07:03:08', '', '2021-02-26 07:03:08', b'0'); -INSERT INTO `inf_job_log` VALUES (4072, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:18:00', '2021-02-27 21:18:00', 4, 1, '', '', '2021-02-26 07:04:08', '', '2021-02-26 07:04:08', b'0'); -INSERT INTO `inf_job_log` VALUES (4073, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:19:00', '2021-02-27 21:19:00', 4, 1, '', '', '2021-02-26 07:05:08', '', '2021-02-26 07:05:08', b'0'); -INSERT INTO `inf_job_log` VALUES (4074, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:20:00', '2021-02-27 21:20:00', 6, 1, '', '', '2021-02-26 07:06:08', '', '2021-02-26 07:06:08', b'0'); -INSERT INTO `inf_job_log` VALUES (4075, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:21:00', '2021-02-27 21:21:00', 5, 1, '', '', '2021-02-26 07:07:08', '', '2021-02-26 07:07:08', b'0'); -INSERT INTO `inf_job_log` VALUES (4076, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:22:00', '2021-02-27 21:22:00', 8, 1, '', '', '2021-02-26 07:08:08', '', '2021-02-26 07:08:08', b'0'); -INSERT INTO `inf_job_log` VALUES (4077, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:23:00', '2021-02-27 21:23:00', 6, 1, '', '', '2021-02-26 07:09:08', '', '2021-02-26 07:09:08', b'0'); -INSERT INTO `inf_job_log` VALUES (4078, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:24:00', '2021-02-27 21:24:00', 6, 1, '', '', '2021-02-26 07:10:08', '', '2021-02-26 07:10:08', b'0'); -INSERT INTO `inf_job_log` VALUES (4079, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:25:00', '2021-02-27 21:25:00', 10, 1, '', '', '2021-02-26 07:11:08', '', '2021-02-26 07:11:08', b'0'); -INSERT INTO `inf_job_log` VALUES (4080, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:26:00', '2021-02-27 21:26:00', 4, 1, '', '', '2021-02-26 07:12:09', '', '2021-02-26 07:12:09', b'0'); -INSERT INTO `inf_job_log` VALUES (4081, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:27:00', '2021-02-27 21:27:00', 7, 1, '', '', '2021-02-26 07:13:09', '', '2021-02-26 07:13:09', b'0'); -INSERT INTO `inf_job_log` VALUES (4082, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:28:00', '2021-02-27 21:28:00', 4, 1, '', '', '2021-02-26 07:14:09', '', '2021-02-26 07:14:09', b'0'); -INSERT INTO `inf_job_log` VALUES (4083, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:29:00', '2021-02-27 21:29:00', 4, 1, '', '', '2021-02-26 07:15:09', '', '2021-02-26 07:15:09', b'0'); -INSERT INTO `inf_job_log` VALUES (4084, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:30:17', '2021-02-27 21:30:18', 48, 1, '', '', '2021-02-26 07:16:26', '', '2021-02-26 07:16:27', b'0'); -INSERT INTO `inf_job_log` VALUES (4085, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:31:00', '2021-02-27 21:31:00', 10, 1, '', '', '2021-02-26 07:17:09', '', '2021-02-26 07:17:09', b'0'); -INSERT INTO `inf_job_log` VALUES (4086, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:32:00', '2021-02-27 21:32:00', 7, 1, '', '', '2021-02-26 07:18:09', '', '2021-02-26 07:18:09', b'0'); -INSERT INTO `inf_job_log` VALUES (4087, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:33:00', '2021-02-27 21:33:00', 6, 1, '', '', '2021-02-26 07:19:09', '', '2021-02-26 07:19:09', b'0'); -INSERT INTO `inf_job_log` VALUES (4088, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:34:00', '2021-02-27 21:34:00', 32, 1, '', '', '2021-02-26 07:20:09', '', '2021-02-26 07:20:09', b'0'); -INSERT INTO `inf_job_log` VALUES (4089, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:35:00', '2021-02-27 21:35:00', 6, 1, '', '', '2021-02-26 07:21:09', '', '2021-02-26 07:21:09', b'0'); -INSERT INTO `inf_job_log` VALUES (4090, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:36:00', '2021-02-27 21:36:00', 393, 1, '', '', '2021-02-26 07:22:10', '', '2021-02-26 07:22:10', b'0'); -INSERT INTO `inf_job_log` VALUES (4091, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:37:00', '2021-02-27 21:37:00', 7, 1, '', '', '2021-02-26 07:23:09', '', '2021-02-26 07:23:09', b'0'); -INSERT INTO `inf_job_log` VALUES (4092, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:38:00', '2021-02-27 21:38:00', 5, 1, '', '', '2021-02-26 07:24:09', '', '2021-02-26 07:24:09', b'0'); -INSERT INTO `inf_job_log` VALUES (4093, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:39:00', '2021-02-27 21:39:00', 8, 1, '', '', '2021-02-26 07:25:09', '', '2021-02-26 07:25:09', b'0'); -INSERT INTO `inf_job_log` VALUES (4094, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:40:00', '2021-02-27 21:40:00', 14, 1, '', '', '2021-02-26 07:26:09', '', '2021-02-26 07:26:09', b'0'); -INSERT INTO `inf_job_log` VALUES (4095, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:41:00', '2021-02-27 21:41:00', 6, 1, '', '', '2021-02-26 07:27:10', '', '2021-02-26 07:27:10', b'0'); -INSERT INTO `inf_job_log` VALUES (4096, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:42:00', '2021-02-27 21:42:00', 15, 1, '', '', '2021-02-26 07:28:10', '', '2021-02-26 07:28:10', b'0'); -INSERT INTO `inf_job_log` VALUES (4097, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:43:00', '2021-02-27 21:43:00', 8, 1, '', '', '2021-02-26 07:29:10', '', '2021-02-26 07:29:10', b'0'); -INSERT INTO `inf_job_log` VALUES (4098, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:44:00', '2021-02-27 21:44:00', 6, 1, '', '', '2021-02-26 07:30:10', '', '2021-02-26 07:30:10', b'0'); -INSERT INTO `inf_job_log` VALUES (4099, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:45:00', '2021-02-27 21:45:00', 6, 1, '', '', '2021-02-26 07:31:10', '', '2021-02-26 07:31:10', b'0'); -INSERT INTO `inf_job_log` VALUES (4100, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:46:00', '2021-02-27 21:46:00', 8, 1, '', '', '2021-02-26 07:32:10', '', '2021-02-26 07:32:10', b'0'); -INSERT INTO `inf_job_log` VALUES (4101, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:47:00', '2021-02-27 21:47:00', 6, 1, '', '', '2021-02-26 07:33:10', '', '2021-02-26 07:33:10', b'0'); -INSERT INTO `inf_job_log` VALUES (4102, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:48:00', '2021-02-27 21:48:00', 4, 1, '', '', '2021-02-26 07:34:10', '', '2021-02-26 07:34:10', b'0'); -INSERT INTO `inf_job_log` VALUES (4103, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:49:00', '2021-02-27 21:49:00', 7, 1, '', '', '2021-02-26 07:35:10', '', '2021-02-26 07:35:10', b'0'); -INSERT INTO `inf_job_log` VALUES (4104, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:50:00', '2021-02-27 21:50:00', 10, 1, '', '', '2021-02-26 07:36:10', '', '2021-02-26 07:36:10', b'0'); -INSERT INTO `inf_job_log` VALUES (4105, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:51:00', '2021-02-27 21:51:00', 4, 1, '', '', '2021-02-26 07:37:10', '', '2021-02-26 07:37:10', b'0'); -INSERT INTO `inf_job_log` VALUES (4106, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:52:00', '2021-02-27 21:52:00', 6, 1, '', '', '2021-02-26 07:38:10', '', '2021-02-26 07:38:10', b'0'); -INSERT INTO `inf_job_log` VALUES (4107, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 21:53:20', '2021-02-27 21:53:20', 31, 1, '', '', '2021-02-26 07:39:30', '', '2021-02-26 07:39:30', b'0'); -INSERT INTO `inf_job_log` VALUES (4108, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:00:09', '2021-02-27 22:00:09', 47, 1, '', '', '2021-02-26 07:46:20', '', '2021-02-26 07:46:20', b'0'); -INSERT INTO `inf_job_log` VALUES (4109, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:01:00', '2021-02-27 22:01:00', 5, 1, '', '', '2021-02-26 07:47:11', '', '2021-02-26 07:47:11', b'0'); -INSERT INTO `inf_job_log` VALUES (4110, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:02:00', '2021-02-27 22:02:00', 6, 1, '', '', '2021-02-26 07:48:11', '', '2021-02-26 07:48:11', b'0'); -INSERT INTO `inf_job_log` VALUES (4111, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:03:00', '2021-02-27 22:03:00', 4, 1, '', '', '2021-02-26 07:49:11', '', '2021-02-26 07:49:11', b'0'); -INSERT INTO `inf_job_log` VALUES (4112, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:04:00', '2021-02-27 22:04:00', 4, 1, '', '', '2021-02-26 07:50:11', '', '2021-02-26 07:50:11', b'0'); -INSERT INTO `inf_job_log` VALUES (4113, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:05:00', '2021-02-27 22:05:00', 19, 1, '', '', '2021-02-26 07:51:11', '', '2021-02-26 07:51:11', b'0'); -INSERT INTO `inf_job_log` VALUES (4114, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:06:00', '2021-02-27 22:06:00', 10, 1, '', '', '2021-02-26 07:52:11', '', '2021-02-26 07:52:11', b'0'); -INSERT INTO `inf_job_log` VALUES (4115, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:07:00', '2021-02-27 22:07:00', 6, 1, '', '', '2021-02-26 07:53:11', '', '2021-02-26 07:53:11', b'0'); -INSERT INTO `inf_job_log` VALUES (4116, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:08:00', '2021-02-27 22:08:00', 5, 1, '', '', '2021-02-26 07:54:11', '', '2021-02-26 07:54:11', b'0'); -INSERT INTO `inf_job_log` VALUES (4117, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:09:00', '2021-02-27 22:09:00', 4, 1, '', '', '2021-02-26 07:55:11', '', '2021-02-26 07:55:11', b'0'); -INSERT INTO `inf_job_log` VALUES (4118, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:10:00', '2021-02-27 22:10:00', 5, 1, '', '', '2021-02-26 07:56:12', '', '2021-02-26 07:56:12', b'0'); -INSERT INTO `inf_job_log` VALUES (4119, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:11:00', '2021-02-27 22:11:00', 6, 1, '', '', '2021-02-26 07:57:12', '', '2021-02-26 07:57:12', b'0'); -INSERT INTO `inf_job_log` VALUES (4120, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:12:00', '2021-02-27 22:12:00', 6, 1, '', '', '2021-02-26 07:58:12', '', '2021-02-26 07:58:12', b'0'); -INSERT INTO `inf_job_log` VALUES (4121, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:13:00', '2021-02-27 22:13:00', 4, 1, '', '', '2021-02-26 07:59:12', '', '2021-02-26 07:59:12', b'0'); -INSERT INTO `inf_job_log` VALUES (4122, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:14:00', '2021-02-27 22:14:00', 5, 1, '', '', '2021-02-26 08:00:12', '', '2021-02-26 08:00:12', b'0'); -INSERT INTO `inf_job_log` VALUES (4123, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:15:00', '2021-02-27 22:15:00', 4, 1, '', '', '2021-02-26 08:01:12', '', '2021-02-26 08:01:12', b'0'); -INSERT INTO `inf_job_log` VALUES (4124, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:16:00', '2021-02-27 22:16:00', 6, 1, '', '', '2021-02-26 08:02:12', '', '2021-02-26 08:02:12', b'0'); -INSERT INTO `inf_job_log` VALUES (4125, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:17:00', '2021-02-27 22:17:00', 4, 1, '', '', '2021-02-26 08:03:12', '', '2021-02-26 08:03:12', b'0'); -INSERT INTO `inf_job_log` VALUES (4126, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:18:00', '2021-02-27 22:18:00', 5, 1, '', '', '2021-02-26 08:04:12', '', '2021-02-26 08:04:12', b'0'); -INSERT INTO `inf_job_log` VALUES (4127, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:19:00', '2021-02-27 22:19:00', 4, 1, '', '', '2021-02-26 08:05:12', '', '2021-02-26 08:05:12', b'0'); -INSERT INTO `inf_job_log` VALUES (4128, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:20:00', '2021-02-27 22:20:00', 4, 1, '', '', '2021-02-26 08:06:12', '', '2021-02-26 08:06:12', b'0'); -INSERT INTO `inf_job_log` VALUES (4129, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:21:00', '2021-02-27 22:21:00', 5, 1, '', '', '2021-02-26 08:07:12', '', '2021-02-26 08:07:12', b'0'); -INSERT INTO `inf_job_log` VALUES (4130, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:22:00', '2021-02-27 22:22:00', 4, 1, '', '', '2021-02-26 08:08:12', '', '2021-02-26 08:08:12', b'0'); -INSERT INTO `inf_job_log` VALUES (4131, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:23:00', '2021-02-27 22:23:00', 9, 1, '', '', '2021-02-26 08:09:12', '', '2021-02-26 08:09:12', b'0'); -INSERT INTO `inf_job_log` VALUES (4132, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:24:00', '2021-02-27 22:24:00', 5, 1, '', '', '2021-02-26 08:10:12', '', '2021-02-26 08:10:12', b'0'); -INSERT INTO `inf_job_log` VALUES (4133, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:25:00', '2021-02-27 22:25:00', 5, 1, '', '', '2021-02-26 08:11:13', '', '2021-02-26 08:11:13', b'0'); -INSERT INTO `inf_job_log` VALUES (4134, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:26:00', '2021-02-27 22:26:00', 5, 1, '', '', '2021-02-26 08:12:13', '', '2021-02-26 08:12:13', b'0'); -INSERT INTO `inf_job_log` VALUES (4135, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:27:00', '2021-02-27 22:27:00', 4, 1, '', '', '2021-02-26 08:13:13', '', '2021-02-26 08:13:13', b'0'); -INSERT INTO `inf_job_log` VALUES (4136, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:28:00', '2021-02-27 22:28:00', 5, 1, '', '', '2021-02-26 08:14:13', '', '2021-02-26 08:14:13', b'0'); -INSERT INTO `inf_job_log` VALUES (4137, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:29:00', '2021-02-27 22:29:00', 5, 1, '', '', '2021-02-26 08:15:13', '', '2021-02-26 08:15:13', b'0'); -INSERT INTO `inf_job_log` VALUES (4138, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:30:00', '2021-02-27 22:30:00', 3, 1, '', '', '2021-02-26 08:16:13', '', '2021-02-26 08:16:13', b'0'); -INSERT INTO `inf_job_log` VALUES (4139, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:31:00', '2021-02-27 22:31:00', 6, 1, '', '', '2021-02-26 08:17:13', '', '2021-02-26 08:17:13', b'0'); -INSERT INTO `inf_job_log` VALUES (4140, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:32:00', '2021-02-27 22:32:00', 3, 1, '', '', '2021-02-26 08:18:13', '', '2021-02-26 08:18:13', b'0'); -INSERT INTO `inf_job_log` VALUES (4141, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:33:00', '2021-02-27 22:33:00', 3, 1, '', '', '2021-02-26 08:19:13', '', '2021-02-26 08:19:13', b'0'); -INSERT INTO `inf_job_log` VALUES (4142, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:34:00', '2021-02-27 22:34:00', 7, 1, '', '', '2021-02-26 08:20:13', '', '2021-02-26 08:20:13', b'0'); -INSERT INTO `inf_job_log` VALUES (4143, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:35:00', '2021-02-27 22:35:00', 3, 1, '', '', '2021-02-26 08:21:13', '', '2021-02-26 08:21:13', b'0'); -INSERT INTO `inf_job_log` VALUES (4144, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:36:00', '2021-02-27 22:36:00', 4, 1, '', '', '2021-02-26 08:22:13', '', '2021-02-26 08:22:13', b'0'); -INSERT INTO `inf_job_log` VALUES (4145, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:37:00', '2021-02-27 22:37:00', 7, 1, '', '', '2021-02-26 08:23:13', '', '2021-02-26 08:23:13', b'0'); -INSERT INTO `inf_job_log` VALUES (4146, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:38:00', '2021-02-27 22:38:00', 6, 1, '', '', '2021-02-26 08:24:13', '', '2021-02-26 08:24:13', b'0'); -INSERT INTO `inf_job_log` VALUES (4147, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:39:00', '2021-02-27 22:39:00', 8, 1, '', '', '2021-02-26 08:25:13', '', '2021-02-26 08:25:14', b'0'); -INSERT INTO `inf_job_log` VALUES (4148, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:40:00', '2021-02-27 22:40:00', 3, 1, '', '', '2021-02-26 08:26:14', '', '2021-02-26 08:26:14', b'0'); -INSERT INTO `inf_job_log` VALUES (4149, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:41:00', '2021-02-27 22:41:00', 5, 1, '', '', '2021-02-26 08:27:14', '', '2021-02-26 08:27:14', b'0'); -INSERT INTO `inf_job_log` VALUES (4150, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:42:00', '2021-02-27 22:42:00', 18, 1, '', '', '2021-02-26 08:28:14', '', '2021-02-26 08:28:14', b'0'); -INSERT INTO `inf_job_log` VALUES (4151, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:43:00', '2021-02-27 22:43:00', 9, 1, '', '', '2021-02-26 08:29:14', '', '2021-02-26 08:29:14', b'0'); -INSERT INTO `inf_job_log` VALUES (4152, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:44:00', '2021-02-27 22:44:00', 6, 1, '', '', '2021-02-26 08:30:14', '', '2021-02-26 08:30:14', b'0'); -INSERT INTO `inf_job_log` VALUES (4153, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:45:00', '2021-02-27 22:45:00', 6, 1, '', '', '2021-02-26 08:31:14', '', '2021-02-26 08:31:14', b'0'); -INSERT INTO `inf_job_log` VALUES (4154, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:46:00', '2021-02-27 22:46:00', 15, 1, '', '', '2021-02-26 08:32:14', '', '2021-02-26 08:32:14', b'0'); -INSERT INTO `inf_job_log` VALUES (4155, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:47:00', '2021-02-27 22:47:00', 5, 1, '', '', '2021-02-26 08:33:14', '', '2021-02-26 08:33:14', b'0'); -INSERT INTO `inf_job_log` VALUES (4156, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:48:00', '2021-02-27 22:48:00', 5, 1, '', '', '2021-02-26 08:34:14', '', '2021-02-26 08:34:14', b'0'); -INSERT INTO `inf_job_log` VALUES (4157, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:49:00', '2021-02-27 22:49:00', 5, 1, '', '', '2021-02-26 08:35:14', '', '2021-02-26 08:35:14', b'0'); -INSERT INTO `inf_job_log` VALUES (4158, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:50:00', '2021-02-27 22:50:00', 5, 1, '', '', '2021-02-26 08:36:14', '', '2021-02-26 08:36:14', b'0'); -INSERT INTO `inf_job_log` VALUES (4159, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:51:00', '2021-02-27 22:51:00', 4, 1, '', '', '2021-02-26 08:37:14', '', '2021-02-26 08:37:14', b'0'); -INSERT INTO `inf_job_log` VALUES (4160, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:52:00', '2021-02-27 22:52:00', 5, 1, '', '', '2021-02-26 08:38:14', '', '2021-02-26 08:38:14', b'0'); -INSERT INTO `inf_job_log` VALUES (4161, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:53:00', '2021-02-27 22:53:00', 6, 1, '', '', '2021-02-26 08:39:14', '', '2021-02-26 08:39:14', b'0'); -INSERT INTO `inf_job_log` VALUES (4162, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:54:00', '2021-02-27 22:54:00', 9, 1, '', '', '2021-02-26 08:40:15', '', '2021-02-26 08:40:15', b'0'); -INSERT INTO `inf_job_log` VALUES (4163, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:55:00', '2021-02-27 22:55:00', 5, 1, '', '', '2021-02-26 08:41:15', '', '2021-02-26 08:41:15', b'0'); -INSERT INTO `inf_job_log` VALUES (4164, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:56:00', '2021-02-27 22:56:00', 3, 1, '', '', '2021-02-26 08:42:15', '', '2021-02-26 08:42:15', b'0'); -INSERT INTO `inf_job_log` VALUES (4165, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:57:00', '2021-02-27 22:57:00', 6, 1, '', '', '2021-02-26 08:43:15', '', '2021-02-26 08:43:15', b'0'); -INSERT INTO `inf_job_log` VALUES (4166, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:58:00', '2021-02-27 22:58:00', 7, 1, '', '', '2021-02-26 08:44:15', '', '2021-02-26 08:44:15', b'0'); -INSERT INTO `inf_job_log` VALUES (4167, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 22:59:00', '2021-02-27 22:59:00', 5, 1, '', '', '2021-02-26 08:45:15', '', '2021-02-26 08:45:15', b'0'); -INSERT INTO `inf_job_log` VALUES (4168, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 23:00:00', '2021-02-27 23:00:00', 5, 1, '', '', '2021-02-26 08:46:15', '', '2021-02-26 08:46:15', b'0'); -INSERT INTO `inf_job_log` VALUES (4169, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 23:01:00', '2021-02-27 23:01:00', 4, 1, '', '', '2021-02-26 08:47:15', '', '2021-02-26 08:47:15', b'0'); -INSERT INTO `inf_job_log` VALUES (4170, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 23:02:00', '2021-02-27 23:02:00', 4, 1, '', '', '2021-02-26 08:48:15', '', '2021-02-26 08:48:15', b'0'); -INSERT INTO `inf_job_log` VALUES (4171, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 23:03:00', '2021-02-27 23:03:00', 4, 1, '', '', '2021-02-26 08:49:15', '', '2021-02-26 08:49:15', b'0'); -INSERT INTO `inf_job_log` VALUES (4172, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 23:04:00', '2021-02-27 23:04:00', 4, 1, '', '', '2021-02-26 08:50:15', '', '2021-02-26 08:50:15', b'0'); -INSERT INTO `inf_job_log` VALUES (4173, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 23:05:00', '2021-02-27 23:05:00', 4, 1, '', '', '2021-02-26 08:51:15', '', '2021-02-26 08:51:15', b'0'); -INSERT INTO `inf_job_log` VALUES (4174, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 23:06:00', '2021-02-27 23:06:00', 5, 1, '', '', '2021-02-26 08:52:15', '', '2021-02-26 08:52:15', b'0'); -INSERT INTO `inf_job_log` VALUES (4175, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 23:07:00', '2021-02-27 23:07:00', 5, 1, '', '', '2021-02-26 08:53:15', '', '2021-02-26 08:53:15', b'0'); -INSERT INTO `inf_job_log` VALUES (4176, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 23:08:00', '2021-02-27 23:08:00', 4, 1, '', '', '2021-02-26 08:54:15', '', '2021-02-26 08:54:15', b'0'); -INSERT INTO `inf_job_log` VALUES (4177, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 23:09:00', '2021-02-27 23:09:00', 4, 1, '', '', '2021-02-26 08:55:16', '', '2021-02-26 08:55:16', b'0'); -INSERT INTO `inf_job_log` VALUES (4178, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 23:10:14', '2021-02-27 23:10:14', 38, 1, '', '', '2021-02-26 08:56:30', '', '2021-02-26 08:56:30', b'0'); -INSERT INTO `inf_job_log` VALUES (4179, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 23:11:00', '2021-02-27 23:11:00', 7, 1, '', '', '2021-02-26 08:57:16', '', '2021-02-26 08:57:16', b'0'); -INSERT INTO `inf_job_log` VALUES (4180, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-02-27 23:12:00', '2021-02-27 23:12:00', 4, 1, '', '', '2021-02-26 08:58:16', '', '2021-02-26 08:58:16', b'0'); COMMIT; -- ---------------------------- @@ -3004,7 +307,7 @@ DROP TABLE IF EXISTS `sys_dict_type`; CREATE TABLE `sys_dict_type` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '字典主键', `name` varchar(100) NOT NULL DEFAULT '' COMMENT '字典名称', - `dict_type` varchar(100) NOT NULL DEFAULT '' COMMENT '字典类型', + `type` varchar(100) NOT NULL DEFAULT '' COMMENT '字典类型', `status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '状态(0正常 1停用)', `remark` varchar(500) DEFAULT NULL COMMENT '备注', `create_by` varchar(64) DEFAULT '' COMMENT '创建者', @@ -3013,7 +316,7 @@ CREATE TABLE `sys_dict_type` ( `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE, - UNIQUE KEY `dict_type` (`dict_type`) + UNIQUE KEY `dict_type` (`type`) ) ENGINE=InnoDB AUTO_INCREMENT=111 DEFAULT CHARSET=utf8mb4 COMMENT='字典类型表'; -- ---------------------------- @@ -3079,7 +382,7 @@ CREATE TABLE `sys_login_log` ( `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=113 DEFAULT CHARSET=utf8mb4 COMMENT='系统访问记录'; +) ENGINE=InnoDB AUTO_INCREMENT=127 DEFAULT CHARSET=utf8mb4 COMMENT='系统访问记录'; -- ---------------------------- -- Records of sys_login_log @@ -3133,7 +436,7 @@ INSERT INTO `sys_menu` VALUES (111, 'MySQL 监控', '', 2, 4, 2, 'druid', 'druid INSERT INTO `sys_menu` VALUES (112, 'Java 监控', '', 2, 6, 2, 'admin-server', 'server', 'infra/server', 0, 'admin', '2021-01-05 17:03:48', '', '2021-02-26 02:18:41', b'0'); INSERT INTO `sys_menu` VALUES (113, 'Redis 监控', '', 2, 5, 2, 'redis', 'redis', 'infra/redis/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-02-26 02:18:37', b'0'); INSERT INTO `sys_menu` VALUES (114, '表单构建', 'tool:build:list', 2, 1, 3, 'build', 'build', 'tool/build/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:45', b'0'); -INSERT INTO `sys_menu` VALUES (115, '代码生成', 'tool:codegen:query', 2, 2, 3, 'codegen', 'code', 'tool/codegen/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-02-07 06:48:08', b'0'); +INSERT INTO `sys_menu` VALUES (115, '代码生成', 'tool:codegen:query', 2, 0, 3, 'codegen', 'code', 'tool/codegen/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-03-06 03:43:14', b'0'); INSERT INTO `sys_menu` VALUES (116, '系统接口', 'tool:swagger:list', 2, 3, 3, 'swagger', 'swagger', 'tool/swagger/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:45', b'0'); INSERT INTO `sys_menu` VALUES (500, '操作日志', 'system:operate-log:list', 2, 1, 108, 'operate-log', 'form', 'system/operatelog/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-16 18:25:45', b'0'); INSERT INTO `sys_menu` VALUES (501, '登录日志', 'system:login-log:list', 2, 2, 108, 'login-log', 'logininfor', 'system/loginlog/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-18 05:29:58', b'0'); @@ -3200,7 +503,7 @@ INSERT INTO `sys_menu` VALUES (1064, '设置角色数据权限', 'system:permiss INSERT INTO `sys_menu` VALUES (1065, '设置用户角色', 'system:permission:assign-user-role', 3, 8, 101, '', '', '', 0, '', '2021-01-07 10:23:28', '', '2021-01-07 10:23:28', b'0'); INSERT INTO `sys_menu` VALUES (1066, '获得 Redis 监控信息', 'infra:redis:get-monitor-info', 3, 1, 113, '', '', '', 0, '', '2021-01-26 01:02:31', '', '2021-01-26 01:02:31', b'0'); INSERT INTO `sys_menu` VALUES (1067, '获得 Redis Key 列表', 'infra:redis:get-key-list', 3, 2, 113, '', '', '', 0, '', '2021-01-26 01:02:52', '', '2021-01-26 01:02:52', b'0'); -INSERT INTO `sys_menu` VALUES (1070, '测试示例', 'tool:test-demo:query', 2, 0, 3, 'test-demo', '', 'tool/testDemo/index', 0, '', '2021-02-06 12:42:49', '', '2021-02-06 13:12:13', b'0'); +INSERT INTO `sys_menu` VALUES (1070, '代码生成示例', 'tool:test-demo:query', 2, 0, 3, 'test-demo', 'validCode', 'tool/testDemo/index', 0, '', '2021-02-06 12:42:49', '', '2021-03-06 03:45:22', b'0'); INSERT INTO `sys_menu` VALUES (1071, '测试示例表创建', 'tool:test-demo:create', 3, 1, 1070, '', '', '', 0, '', '2021-02-06 12:42:49', '', '2021-02-06 12:53:47', b'0'); INSERT INTO `sys_menu` VALUES (1072, '测试示例表更新', 'tool:test-demo:update', 3, 2, 1070, '', '', '', 0, '', '2021-02-06 12:42:49', '', '2021-02-06 12:53:51', b'0'); INSERT INTO `sys_menu` VALUES (1073, '测试示例表删除', 'tool:test-demo:delete', 3, 3, 1070, '', '', '', 0, '', '2021-02-06 12:42:49', '', '2021-02-06 12:53:58', b'0'); @@ -3276,7 +579,7 @@ CREATE TABLE `sys_operate_log` ( `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=378 DEFAULT CHARSET=utf8mb4 COMMENT='操作日志记录'; +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COMMENT='操作日志记录'; -- ---------------------------- -- Records of sys_operate_log @@ -3613,22 +916,28 @@ INSERT INTO `sys_user_session` VALUES ('015797486c564c01b128cb2662bfa1f9', 1, '1 INSERT INTO `sys_user_session` VALUES ('019f009268e24cc1957c46763eef1fd4', 1, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-02-07 08:36:48', '', '2021-02-14 20:04:33', b'0'); INSERT INTO `sys_user_session` VALUES ('037f130370a744a4b1db19aef205b8ae', 1, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-02-08 20:38:37', '', '2021-02-08 20:38:37', b'0'); INSERT INTO `sys_user_session` VALUES ('04d51ff81ad54d05ab2f29e66b2a02f2', 1, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-02-05 17:46:10', '', '2021-02-11 00:58:19', b'0'); +INSERT INTO `sys_user_session` VALUES ('055057e3356b4c249d56a6627ca057a7', 1, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-03-04 16:54:24', '', '2021-03-05 01:25:51', b'0'); INSERT INTO `sys_user_session` VALUES ('064ba2d647704f57bdf36a1803a724d7', 1, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-02-26 02:17:35', '', '2021-02-27 12:04:09', b'0'); INSERT INTO `sys_user_session` VALUES ('0df60899301d4080bd4164f24bccf18b', 1, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-02-07 13:05:42', '', '2021-02-14 22:57:44', b'0'); INSERT INTO `sys_user_session` VALUES ('1127b5eb9b0c4f9fa382d4d98a8a4a38', 1, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-02-05 06:49:00', '', '2021-02-10 11:10:31', b'0'); INSERT INTO `sys_user_session` VALUES ('11aa2d7861d445349790804fa8676754', 1, '127.0.0.1', 'Mozilla/5.0 (Linux; Android 10; PCT-AL10 Build/HUAWEIPCT-AL10; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045513 Mobile Safari/537.36 MMWEBID/2883 MicroMessenger/8.0.1.1841(0x28000159) Process/tools WeChat/arm64 Weixin NetType/4G Language/zh_CN ABI/arm64', '', '2021-02-09 00:06:03', '', '2021-02-09 00:06:03', b'0'); +INSERT INTO `sys_user_session` VALUES ('135db2c6d88a4f41aaf4df46f3a3e0ea', 1, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-03-06 01:44:25', '', '2021-03-06 01:44:25', b'0'); INSERT INTO `sys_user_session` VALUES ('1bcac32d34b94422893f10718f643320', 1, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-02-09 12:14:10', '', '2021-02-09 12:14:10', b'0'); INSERT INTO `sys_user_session` VALUES ('20109910c52e4b02bbc0531212bff8cb', 1, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-02-06 02:39:48', '', '2021-02-06 02:39:48', b'0'); INSERT INTO `sys_user_session` VALUES ('2024509755b3444690c2a1dddaebd812', 1, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-02-05 06:22:30', '', '2021-02-05 06:22:30', b'0'); INSERT INTO `sys_user_session` VALUES ('260facb728964db7a3df8461b4eebe86', 1, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-02-08 23:10:08', '', '2021-02-08 23:10:08', b'0'); INSERT INTO `sys_user_session` VALUES ('27858c1f13c64a2a8889063932419885', 1, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-02-08 18:27:13', '', '2021-02-20 16:11:21', b'0'); INSERT INTO `sys_user_session` VALUES ('27d6db8abb3b4ed88d446ad489b9db23', 1, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-02-07 06:38:34', '', '2021-02-14 10:57:34', b'0'); +INSERT INTO `sys_user_session` VALUES ('27dbe0b1051b41eb9efe6558af7cd681', 1, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-03-06 00:51:14', '', '2021-03-06 19:10:23', b'0'); INSERT INTO `sys_user_session` VALUES ('285af833677642448bbd19c40a279825', 1, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-02-08 04:17:09', '', '2021-02-18 20:23:05', b'0'); INSERT INTO `sys_user_session` VALUES ('31e5ff8584794ca58460ecf68a177c3f', 1, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-02-06 11:48:57', '', '2021-02-12 20:56:44', b'0'); INSERT INTO `sys_user_session` VALUES ('39cdef31685d4e93931a053d88ff0279', 1, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-02-05 08:09:33', '', '2021-02-05 08:09:33', b'0'); INSERT INTO `sys_user_session` VALUES ('3e111c66356d47da8ffc2755bfa3db52', 1, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-02-09 14:00:25', '', '2021-02-09 14:00:25', b'0'); INSERT INTO `sys_user_session` VALUES ('3f308ac8ff26481e829261dd14babbbb', 1, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-02-08 01:33:07', '', '2021-02-17 22:01:24', b'0'); +INSERT INTO `sys_user_session` VALUES ('452d44e0616c4dca93485ce67ac946df', 1, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-03-06 03:41:56', '', '2021-03-06 21:59:07', b'0'); +INSERT INTO `sys_user_session` VALUES ('50274d6c400f42f7bd5391a12858e262', 1, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-02-26 11:45:04', '', '2021-02-26 11:45:04', b'0'); INSERT INTO `sys_user_session` VALUES ('5636ae58b9644ea1b4ed934b025b76ea', 1, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-02-05 04:24:59', '', '2021-02-09 18:40:06', b'0'); +INSERT INTO `sys_user_session` VALUES ('5891c4873bf746989a132929449d5f2b', 1, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-03-06 01:55:18', '', '2021-03-06 20:55:38', b'0'); INSERT INTO `sys_user_session` VALUES ('597956fbc5b34363981530b24e1b5327', 1, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-02-06 13:47:15', '', '2021-02-12 20:36:16', b'0'); INSERT INTO `sys_user_session` VALUES ('599102a1e8414ab59eddaf5492f98dad', 1, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-02-26 06:40:37', '', '2021-02-27 21:25:52', b'0'); INSERT INTO `sys_user_session` VALUES ('5a9b736ccaa8452394c57ac82bd0815e', 1, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-02-05 10:57:52', '', '2021-02-10 16:52:48', b'0'); @@ -3642,9 +951,11 @@ INSERT INTO `sys_user_session` VALUES ('6acbf1f210ff4c6594acb3505f0c3738', 1, '1 INSERT INTO `sys_user_session` VALUES ('6e7e89c4948f45658eb74878457ac611', 1, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-02-09 21:29:20', '', '2021-02-23 01:54:44', b'0'); INSERT INTO `sys_user_session` VALUES ('73c66b705ed94e18bc53df61abc2d102', 1, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-02-06 15:00:55', '', '2021-02-06 15:00:55', b'0'); INSERT INTO `sys_user_session` VALUES ('73cc914671034f3190f09f520d1b39e9', 1, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-01-26 08:29:27', '', '2021-01-26 08:29:50', b'1'); +INSERT INTO `sys_user_session` VALUES ('7b008d71139f48a4903aeaab0bbbef2e', 1, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-03-06 04:38:15', '', '2021-03-06 04:38:15', b'0'); INSERT INTO `sys_user_session` VALUES ('7cbd0fdfb9304f298abb9ee2f58f7230', 1, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-02-08 20:02:24', '', '2021-02-08 20:02:24', b'0'); INSERT INTO `sys_user_session` VALUES ('830a1687977b44969025177ad3b6d051', 1, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-02-10 01:56:00', '', '2021-02-10 01:56:00', b'0'); INSERT INTO `sys_user_session` VALUES ('8331dbbca7be4348a3d2d02bf559b65e', 1, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-02-05 13:29:04', '', '2021-02-10 19:06:26', b'0'); +INSERT INTO `sys_user_session` VALUES ('897714de63634dba9ac235247f9860c2', 1, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-03-06 06:27:27', '', '2021-03-06 06:27:27', b'0'); INSERT INTO `sys_user_session` VALUES ('8d7668c1276344ecbffaf7e4420595d7', 1, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-02-08 09:56:09', '', '2021-02-19 19:17:42', b'0'); INSERT INTO `sys_user_session` VALUES ('9a3a5b8dee1841b69d70454ce23a53a3', 1, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-02-26 00:09:49', '', '2021-02-27 01:27:20', b'0'); INSERT INTO `sys_user_session` VALUES ('9cc71dc2d7a24b978db1bfe0e4bae349', 1, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-01-26 08:30:01', '', '2021-01-26 08:30:01', b'0'); @@ -3695,7 +1006,7 @@ CREATE TABLE `tool_codegen_column` ( `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=349 DEFAULT CHARSET=utf8mb4 COMMENT='代码生成表字段定义'; +) ENGINE=InnoDB AUTO_INCREMENT=369 DEFAULT CHARSET=utf8mb4 COMMENT='代码生成表字段定义'; -- ---------------------------- -- Records of tool_codegen_column @@ -3713,13 +1024,13 @@ INSERT INTO `tool_codegen_column` VALUES (240, 20, 'update_by', 'varchar(64)', ' INSERT INTO `tool_codegen_column` VALUES (241, 20, 'update_time', 'datetime', '更新时间', b'0', b'0', '0', 10, 'Date', 'updateTime', '', NULL, b'0', b'0', b'0', '=', b'0', 'datetime', '', '2021-02-06 01:33:25', '', '2021-02-06 08:02:20', b'0'); INSERT INTO `tool_codegen_column` VALUES (242, 20, 'deleted', 'bit(1)', '是否删除', b'0', b'0', '0', 11, 'Boolean', 'deleted', '', NULL, b'0', b'0', b'1', '=', b'0', 'radio', '', '2021-02-06 01:33:25', '', '2021-02-06 07:52:14', b'0'); INSERT INTO `tool_codegen_column` VALUES (243, 21, 'id', 'int(5)', '参数主键', b'0', b'1', '1', 1, 'Integer', 'id', '', NULL, b'0', b'1', b'0', '=', b'1', 'input', '', '2021-02-06 19:51:35', '', '2021-02-06 19:51:35', b'0'); -INSERT INTO `tool_codegen_column` VALUES (244, 21, 'group', 'varchar(50)', '参数分组', b'0', b'0', '0', 2, 'String', 'group', '', NULL, b'1', b'1', b'1', '=', b'1', 'input', '', '2021-02-06 19:51:35', '', '2021-02-06 19:51:35', b'0'); +INSERT INTO `tool_codegen_column` VALUES (244, 21, 'group', 'varchar(50)', '参数分组', b'0', b'0', '0', 2, 'String', 'group', '', NULL, b'1', b'1', b'0', '=', b'1', 'input', '', '2021-02-06 19:51:35', '', '2021-03-06 02:20:02', b'0'); INSERT INTO `tool_codegen_column` VALUES (245, 21, 'type', 'tinyint(4)', '参数类型', b'0', b'0', '0', 3, 'Integer', 'type', '', NULL, b'1', b'1', b'1', '=', b'1', 'select', '', '2021-02-06 19:51:35', '', '2021-02-06 19:51:35', b'0'); INSERT INTO `tool_codegen_column` VALUES (246, 21, 'name', 'varchar(100)', '参数名称', b'0', b'0', '0', 4, 'String', 'name', '', NULL, b'1', b'1', b'1', 'LIKE', b'1', 'input', '', '2021-02-06 19:51:35', '', '2021-02-06 19:51:35', b'0'); INSERT INTO `tool_codegen_column` VALUES (247, 21, 'key', 'varchar(100)', '参数键名', b'0', b'0', '0', 5, 'String', 'key', '', NULL, b'1', b'1', b'1', '=', b'1', 'input', '', '2021-02-06 19:51:35', '', '2021-02-06 19:51:35', b'0'); -INSERT INTO `tool_codegen_column` VALUES (248, 21, 'value', 'varchar(500)', '参数键值', b'0', b'0', '0', 6, 'String', 'value', '', NULL, b'1', b'1', b'1', '=', b'1', 'input', '', '2021-02-06 19:51:35', '', '2021-02-06 19:51:35', b'0'); -INSERT INTO `tool_codegen_column` VALUES (249, 21, 'sensitive', 'bit(1)', '是否敏感', b'0', b'0', '0', 7, 'Boolean', 'sensitive', '', NULL, b'1', b'1', b'1', '=', b'1', 'radio', '', '2021-02-06 19:51:35', '', '2021-02-06 19:51:35', b'0'); -INSERT INTO `tool_codegen_column` VALUES (250, 21, 'remark', 'varchar(500)', '备注', b'1', b'0', '0', 8, 'String', 'remark', '', NULL, b'1', b'1', b'1', '=', b'1', 'input', '', '2021-02-06 19:51:35', '', '2021-02-06 19:51:35', b'0'); +INSERT INTO `tool_codegen_column` VALUES (248, 21, 'value', 'varchar(500)', '参数键值', b'0', b'0', '0', 6, 'String', 'value', '', NULL, b'1', b'1', b'0', '=', b'1', 'input', '', '2021-02-06 19:51:35', '', '2021-03-06 02:20:02', b'0'); +INSERT INTO `tool_codegen_column` VALUES (249, 21, 'sensitive', 'bit(1)', '是否敏感', b'0', b'0', '0', 7, 'Boolean', 'sensitive', '', NULL, b'1', b'1', b'0', '=', b'1', 'radio', '', '2021-02-06 19:51:35', '', '2021-03-06 02:20:02', b'0'); +INSERT INTO `tool_codegen_column` VALUES (250, 21, 'remark', 'varchar(500)', '备注', b'1', b'0', '0', 8, 'String', 'remark', '', NULL, b'1', b'1', b'0', '=', b'1', 'input', '', '2021-02-06 19:51:35', '', '2021-03-06 02:20:02', b'0'); INSERT INTO `tool_codegen_column` VALUES (251, 21, 'create_by', 'varchar(64)', '创建者', b'1', b'0', '0', 9, 'String', 'createBy', '', NULL, b'0', b'0', b'0', '=', b'0', 'input', '', '2021-02-06 19:51:35', '', '2021-02-06 19:51:35', b'0'); INSERT INTO `tool_codegen_column` VALUES (252, 21, 'create_time', 'datetime', '创建时间', b'0', b'0', '0', 10, 'Date', 'createTime', '', NULL, b'0', b'0', b'1', 'BETWEEN', b'1', 'datetime', '', '2021-02-06 19:51:35', '', '2021-02-06 19:51:35', b'0'); INSERT INTO `tool_codegen_column` VALUES (253, 21, 'update_by', 'varchar(64)', '更新者', b'1', b'0', '0', 11, 'String', 'updateBy', '', NULL, b'0', b'0', b'0', '=', b'0', 'input', '', '2021-02-06 19:51:35', '', '2021-02-06 19:51:35', b'0'); @@ -3817,6 +1128,26 @@ INSERT INTO `tool_codegen_column` VALUES (345, 27, 'deleted', 'bit(1)', '是否 INSERT INTO `tool_codegen_column` VALUES (346, 27, 'process_status', 'tinyint(4)', '处理状态', b'0', b'0', '0', 20, 'Integer', 'processStatus', 'inf_api_error_log_process_status', '0', b'1', b'1', b'1', '=', b'1', 'radio', '', '2021-02-26 07:01:49', '', '2021-02-26 07:11:29', b'0'); INSERT INTO `tool_codegen_column` VALUES (347, 27, 'process_time', 'datetime', '处理时间', b'0', b'0', '0', 21, 'Date', 'processTime', '', NULL, b'0', b'0', b'0', 'BETWEEN', b'1', 'datetime', '', '2021-02-26 07:01:49', '', '2021-02-26 07:08:15', b'0'); INSERT INTO `tool_codegen_column` VALUES (348, 27, 'process_user_id', 'int(11)', '处理用户编号', b'1', b'0', '0', 22, 'Integer', 'processUserId', '', '233', b'0', b'0', b'0', '=', b'1', 'input', '', '2021-02-26 07:01:49', '', '2021-02-26 07:12:52', b'0'); +INSERT INTO `tool_codegen_column` VALUES (349, 28, 'id', 'bigint(20)', '字典主键', b'0', b'1', '1', 1, 'Long', 'id', '', NULL, b'0', b'1', b'0', '=', b'1', 'input', '', '2021-03-06 03:45:55', '', '2021-03-06 03:51:02', b'1'); +INSERT INTO `tool_codegen_column` VALUES (350, 28, 'name', 'varchar(100)', '字典名称', b'0', b'0', '0', 2, 'String', 'name', '', NULL, b'1', b'1', b'1', 'LIKE', b'1', 'input', '', '2021-03-06 03:45:55', '', '2021-03-06 03:51:02', b'1'); +INSERT INTO `tool_codegen_column` VALUES (351, 28, 'dict_type', 'varchar(100)', '字典类型', b'0', b'0', '0', 3, 'String', 'dictType', '', NULL, b'1', b'1', b'1', '=', b'1', 'select', '', '2021-03-06 03:45:55', '', '2021-03-06 03:51:02', b'1'); +INSERT INTO `tool_codegen_column` VALUES (352, 28, 'status', 'tinyint(4)', '状态(0正常 1停用)', b'0', b'0', '0', 4, 'Integer', 'status', '', NULL, b'1', b'1', b'1', '=', b'1', 'radio', '', '2021-03-06 03:45:55', '', '2021-03-06 03:51:02', b'1'); +INSERT INTO `tool_codegen_column` VALUES (353, 28, 'remark', 'varchar(500)', '备注', b'1', b'0', '0', 5, 'String', 'remark', '', NULL, b'1', b'1', b'1', '=', b'1', 'input', '', '2021-03-06 03:45:55', '', '2021-03-06 03:51:02', b'1'); +INSERT INTO `tool_codegen_column` VALUES (354, 28, 'create_by', 'varchar(64)', '创建者', b'1', b'0', '0', 6, 'String', 'createBy', '', NULL, b'0', b'0', b'0', '=', b'0', 'input', '', '2021-03-06 03:45:55', '', '2021-03-06 03:51:02', b'1'); +INSERT INTO `tool_codegen_column` VALUES (355, 28, 'create_time', 'datetime', '创建时间', b'0', b'0', '0', 7, 'Date', 'createTime', '', NULL, b'0', b'0', b'1', 'BETWEEN', b'1', 'datetime', '', '2021-03-06 03:45:55', '', '2021-03-06 03:51:02', b'1'); +INSERT INTO `tool_codegen_column` VALUES (356, 28, 'update_by', 'varchar(64)', '更新者', b'1', b'0', '0', 8, 'String', 'updateBy', '', NULL, b'0', b'0', b'0', '=', b'0', 'input', '', '2021-03-06 03:45:55', '', '2021-03-06 03:51:02', b'1'); +INSERT INTO `tool_codegen_column` VALUES (357, 28, 'update_time', 'datetime', '更新时间', b'0', b'0', '0', 9, 'Date', 'updateTime', '', NULL, b'0', b'0', b'0', 'BETWEEN', b'0', 'datetime', '', '2021-03-06 03:45:55', '', '2021-03-06 03:51:02', b'1'); +INSERT INTO `tool_codegen_column` VALUES (358, 28, 'deleted', 'bit(1)', '是否删除', b'0', b'0', '0', 10, 'Boolean', 'deleted', '', NULL, b'0', b'0', b'0', '=', b'0', 'radio', '', '2021-03-06 03:45:55', '', '2021-03-06 03:51:02', b'1'); +INSERT INTO `tool_codegen_column` VALUES (359, 29, 'id', 'bigint(20)', '字典主键', b'0', b'1', '1', 1, 'Long', 'id', '', NULL, b'0', b'1', b'0', '=', b'1', 'input', '', '2021-03-06 03:52:57', '', '2021-03-06 03:52:57', b'0'); +INSERT INTO `tool_codegen_column` VALUES (360, 29, 'name', 'varchar(100)', '字典名称', b'0', b'0', '0', 2, 'String', 'name', '', NULL, b'1', b'1', b'1', 'LIKE', b'1', 'input', '', '2021-03-06 03:52:57', '', '2021-03-06 03:52:57', b'0'); +INSERT INTO `tool_codegen_column` VALUES (361, 29, 'type', 'varchar(100)', '字典类型', b'0', b'0', '0', 3, 'String', 'type', '', NULL, b'1', b'1', b'1', 'LIKE', b'1', 'select', '', '2021-03-06 03:52:57', '', '2021-03-06 03:54:48', b'0'); +INSERT INTO `tool_codegen_column` VALUES (362, 29, 'status', 'tinyint(4)', '状态(0正常 1停用)', b'0', b'0', '0', 4, 'Integer', 'status', '', NULL, b'1', b'1', b'1', '=', b'1', 'radio', '', '2021-03-06 03:52:57', '', '2021-03-06 03:52:57', b'0'); +INSERT INTO `tool_codegen_column` VALUES (363, 29, 'remark', 'varchar(500)', '备注', b'1', b'0', '0', 5, 'String', 'remark', '', NULL, b'1', b'1', b'0', '=', b'1', 'input', '', '2021-03-06 03:52:57', '', '2021-03-06 03:54:48', b'0'); +INSERT INTO `tool_codegen_column` VALUES (364, 29, 'create_by', 'varchar(64)', '创建者', b'1', b'0', '0', 6, 'String', 'createBy', '', NULL, b'0', b'0', b'0', '=', b'0', 'input', '', '2021-03-06 03:52:57', '', '2021-03-06 03:52:57', b'0'); +INSERT INTO `tool_codegen_column` VALUES (365, 29, 'create_time', 'datetime', '创建时间', b'0', b'0', '0', 7, 'Date', 'createTime', '', NULL, b'0', b'0', b'1', 'BETWEEN', b'1', 'datetime', '', '2021-03-06 03:52:57', '', '2021-03-06 03:52:57', b'0'); +INSERT INTO `tool_codegen_column` VALUES (366, 29, 'update_by', 'varchar(64)', '更新者', b'1', b'0', '0', 8, 'String', 'updateBy', '', NULL, b'0', b'0', b'0', '=', b'0', 'input', '', '2021-03-06 03:52:57', '', '2021-03-06 03:52:57', b'0'); +INSERT INTO `tool_codegen_column` VALUES (367, 29, 'update_time', 'datetime', '更新时间', b'0', b'0', '0', 9, 'Date', 'updateTime', '', NULL, b'0', b'0', b'0', 'BETWEEN', b'0', 'datetime', '', '2021-03-06 03:52:57', '', '2021-03-06 03:52:57', b'0'); +INSERT INTO `tool_codegen_column` VALUES (368, 29, 'deleted', 'bit(1)', '是否删除', b'0', b'0', '0', 10, 'Boolean', 'deleted', '', NULL, b'0', b'0', b'0', '=', b'0', 'radio', '', '2021-03-06 03:52:57', '', '2021-03-06 03:52:57', b'0'); COMMIT; -- ---------------------------- @@ -3842,7 +1173,7 @@ CREATE TABLE `tool_codegen_table` ( `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8mb4 COMMENT='代码生成表定义'; +) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=utf8mb4 COMMENT='代码生成表定义'; -- ---------------------------- -- Records of tool_codegen_table @@ -3856,6 +1187,8 @@ INSERT INTO `tool_codegen_table` VALUES (24, 1, 'inf_job', '定时任务表', NU INSERT INTO `tool_codegen_table` VALUES (25, 1, 'inf_job_log', '定时任务日志表', NULL, 'infra', 'jobLog', 'InfJobLog', '定时任务', '芋艿', 1, NULL, '', '2021-02-08 04:58:41', '', '2021-02-08 10:09:52', b'0'); INSERT INTO `tool_codegen_table` VALUES (26, 1, 'inf_api_access_log', 'API 访问日志表', NULL, 'system', 'logger', 'InfApiAccessLog', 'API 访问日志', '芋道源码', 1, 108, '', '2021-02-26 00:13:35', '', '2021-02-26 06:55:14', b'0'); INSERT INTO `tool_codegen_table` VALUES (27, 1, 'inf_api_error_log', 'API 错误日志', NULL, 'infra', 'apiErrorLog', 'InfApiErrorLog', 'API 错误日志', '芋道源码', 1, 1083, '', '2021-02-26 06:54:49', '', '2021-02-26 07:53:03', b'0'); +INSERT INTO `tool_codegen_table` VALUES (28, 1, 'sys_dict_type', '字典类型表', NULL, 'system', 'dictType', 'SysDictType', '字典类型', '芋艿', 1, NULL, '', '2021-03-06 03:45:55', '', '2021-03-06 03:51:02', b'1'); +INSERT INTO `tool_codegen_table` VALUES (29, 1, 'sys_dict_type', '字典类型表', NULL, 'system', 'dict', 'SysDictType', '字典类型', '芋艿', 1, NULL, '', '2021-03-06 03:52:57', '', '2021-03-06 04:03:52', b'0'); COMMIT; -- ---------------------------- diff --git a/src/main/java/cn/iocoder/dashboard/framework/mybatis/core/mapper/BaseMapperX.java b/src/main/java/cn/iocoder/dashboard/framework/mybatis/core/mapper/BaseMapperX.java index 8c8615096..eace96a26 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/mybatis/core/mapper/BaseMapperX.java +++ b/src/main/java/cn/iocoder/dashboard/framework/mybatis/core/mapper/BaseMapperX.java @@ -24,12 +24,12 @@ public interface BaseMapperX extends BaseMapper { return new PageResult<>(mpPage.getRecords(), mpPage.getTotal()); } - default List selectList() { - return selectList(new QueryWrapper<>()); - } - default T selectOne(String field, Object value) { return selectOne(new QueryWrapper().eq(field, value)); } + default List selectList() { + return selectList(new QueryWrapper<>()); + } + } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/SysDictTypeController.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/SysDictTypeController.java index f00997376..d75059fbc 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/SysDictTypeController.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/SysDictTypeController.java @@ -32,7 +32,7 @@ public class SysDictTypeController { @GetMapping("/page") // @PreAuthorize("@ss.hasPermi('system:dict:list')") public CommonResult> pageDictTypes(@Validated SysDictTypePageReqVO reqVO) { - return success(SysDictTypeConvert.INSTANCE.convertPage(dictTypeService.pageDictTypes(reqVO))); + return success(SysDictTypeConvert.INSTANCE.convertPage(dictTypeService.getDictTypePage(reqVO))); } @ApiOperation("/查询字典类型详细") @@ -75,7 +75,7 @@ public class SysDictTypeController { @ApiOperation(value = "获得全部字典类型列表", notes = "包括开启 + 禁用的字典类型,主要用于前端的下拉选项") // 无需添加权限认证,因为前端全局都需要 public CommonResult> listSimpleDictTypes() { - List list = dictTypeService.listDictTypes(); + List list = dictTypeService.getDictTypeList(); return success(SysDictTypeConvert.INSTANCE.convertList(list)); } @@ -84,7 +84,7 @@ public class SysDictTypeController { // @Log(title = "字典类型", businessType = BusinessType.EXPORT) // @PreAuthorize("@ss.hasPermi('system:dict:export')") public void export(HttpServletResponse response, @Validated SysDictTypeExportReqVO reqVO) throws IOException { - List list = dictTypeService.listDictTypes(reqVO); + List list = dictTypeService.getDictTypeList(reqVO); List excelTypeList = SysDictTypeConvert.INSTANCE.convertList02(list); // 输出 ExcelUtils.write(response, "字典类型.xls", "类型列表", diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/type/SysDictTypeExportReqVO.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/type/SysDictTypeExportReqVO.java index 66b429f6a..19730c7c4 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/type/SysDictTypeExportReqVO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/type/SysDictTypeExportReqVO.java @@ -5,7 +5,6 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; -import javax.validation.constraints.Size; import java.util.Date; import static cn.iocoder.dashboard.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; @@ -18,18 +17,17 @@ public class SysDictTypeExportReqVO { private String name; @ApiModelProperty(value = "字典类型", example = "sys_common_sex", notes = "模糊匹配") - @Size(max = 100, message = "字典类型类型长度不能超过100个字符") private String type; @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") private Integer status; - @ApiModelProperty(value = "开始时间", example = "2020-10-24") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private Date beginTime; + @ApiModelProperty(value = "开始创建时间") + private Date beginCreateTime; - @ApiModelProperty(value = "结束时间", example = "2020-10-24") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private Date endTime; + @ApiModelProperty(value = "结束创建时间") + private Date endCreateTime; } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/type/SysDictTypePageReqVO.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/type/SysDictTypePageReqVO.java index 29437aa9c..32c6d42df 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/type/SysDictTypePageReqVO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/type/SysDictTypePageReqVO.java @@ -27,12 +27,12 @@ public class SysDictTypePageReqVO extends PageParam { @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") private Integer status; - @ApiModelProperty(value = "开始时间", example = "2020-10-24") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private Date beginTime; + @ApiModelProperty(value = "开始创建时间") + private Date beginCreateTime; - @ApiModelProperty(value = "结束时间", example = "2020-10-24") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private Date endTime; + @ApiModelProperty(value = "结束创建时间") + private Date endCreateTime; } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/dict/SysDictTypeDO.java b/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/dict/SysDictTypeDO.java index 739eb649a..164bb7120 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/dict/SysDictTypeDO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/dict/SysDictTypeDO.java @@ -33,7 +33,7 @@ public class SysDictTypeDO extends BaseDO { /** * 字典类型 */ - @TableField("dict_type") + @TableField("`type`") private String type; /** * 状态 diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dict/SysDictTypeMapper.java b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dict/SysDictTypeMapper.java index 7c764224e..0320457c4 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dict/SysDictTypeMapper.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dict/SysDictTypeMapper.java @@ -16,20 +16,21 @@ public interface SysDictTypeMapper extends BaseMapperX { default PageResult selectPage(SysDictTypePageReqVO reqVO) { return selectPage(reqVO, new QueryWrapperX() .likeIfPresent("name", reqVO.getName()) - .likeIfPresent("dict_type", reqVO.getType()) + .likeIfPresent("`type`", reqVO.getType()) .eqIfPresent("status", reqVO.getStatus()) - .betweenIfPresent("create_time", reqVO.getBeginTime(), reqVO.getEndTime())); + .betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())); } default List selectList(SysDictTypeExportReqVO reqVO) { - return selectList(new QueryWrapperX().likeIfPresent("name", reqVO.getName()) - .likeIfPresent("dict_type", reqVO.getType()) - .eqIfPresent("status", reqVO.getStatus()) - .betweenIfPresent("create_time", reqVO.getBeginTime(), reqVO.getEndTime())); + return selectList(new QueryWrapperX() + .likeIfPresent("name", reqVO.getName()) + .likeIfPresent("`type`", reqVO.getType()) + .eqIfPresent("status", reqVO.getStatus()) + .betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())); } default SysDictTypeDO selectByType(String type) { - return selectOne(new QueryWrapperX().eq("dict_type", type)); + return selectOne(new QueryWrapperX().eq("`type`", type)); } default SysDictTypeDO selectByName(String name) { diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java b/src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java index 1bbde5784..cc572033d 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java @@ -58,7 +58,7 @@ public interface SysErrorCodeConstants { ErrorCode POST_CODE_DUPLICATE = new ErrorCode(1002005001, "已经存在该标识的岗位"); // ========== 字典类型 1002006000 ========== - ErrorCode DICT_TYPE_NOT_FOUND = new ErrorCode(1002006001, "当前字典类型不存在"); + ErrorCode DICT_TYPE_NOT_EXISTS = new ErrorCode(1002006001, "当前字典类型不存在"); ErrorCode DICT_TYPE_NOT_ENABLE = new ErrorCode(1002006002, "字典类型不处于开启状态,不允许选择"); ErrorCode DICT_TYPE_NAME_DUPLICATE = new ErrorCode(1002006003, "已经存在该名字的字典类型"); ErrorCode DICT_TYPE_TYPE_DUPLICATE = new ErrorCode(1002006004, "已经存在该类型的字典类型"); diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/SysDictTypeService.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/SysDictTypeService.java index bfaae3f2f..14fe9f7cd 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/SysDictTypeService.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/SysDictTypeService.java @@ -22,7 +22,7 @@ public interface SysDictTypeService { * @param reqVO 分页请求 * @return 字典类型分页列表 */ - PageResult pageDictTypes(SysDictTypePageReqVO reqVO); + PageResult getDictTypePage(SysDictTypePageReqVO reqVO); /** * 获得字典类型列表 @@ -30,7 +30,7 @@ public interface SysDictTypeService { * @param reqVO 列表请求 * @return 字典类型列表 */ - List listDictTypes(SysDictTypeExportReqVO reqVO); + List getDictTypeList(SysDictTypeExportReqVO reqVO); /** * 获得字典类型详情 @@ -75,6 +75,6 @@ public interface SysDictTypeService { * * @return 字典类型列表 */ - List listDictTypes(); + List getDictTypeList(); } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/impl/SysDictDataServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/impl/SysDictDataServiceImpl.java index 1ec82d6c4..8ddd1c776 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/impl/SysDictDataServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/impl/SysDictDataServiceImpl.java @@ -227,7 +227,7 @@ public class SysDictDataServiceImpl implements SysDictDataService { private void checkDictTypeValid(String type) { SysDictTypeDO dictType = dictTypeService.getDictType(type); if (dictType == null) { - throw ServiceExceptionUtil.exception(DICT_TYPE_NOT_FOUND); + throw ServiceExceptionUtil.exception(DICT_TYPE_NOT_EXISTS); } if (!CommonStatusEnum.ENABLE.getStatus().equals(dictType.getStatus())) { throw ServiceExceptionUtil.exception(DICT_TYPE_NOT_ENABLE); diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/impl/SysDictTypeServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/impl/SysDictTypeServiceImpl.java index f1dbdfc31..24b6be5e0 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/impl/SysDictTypeServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/impl/SysDictTypeServiceImpl.java @@ -1,14 +1,13 @@ package cn.iocoder.dashboard.modules.system.service.dict.impl; -import cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil; import cn.iocoder.dashboard.common.pojo.PageResult; import cn.iocoder.dashboard.modules.system.controller.dict.vo.type.SysDictTypeCreateReqVO; import cn.iocoder.dashboard.modules.system.controller.dict.vo.type.SysDictTypeExportReqVO; import cn.iocoder.dashboard.modules.system.controller.dict.vo.type.SysDictTypePageReqVO; import cn.iocoder.dashboard.modules.system.controller.dict.vo.type.SysDictTypeUpdateReqVO; import cn.iocoder.dashboard.modules.system.convert.dict.SysDictTypeConvert; -import cn.iocoder.dashboard.modules.system.dal.mysql.dict.SysDictTypeMapper; import cn.iocoder.dashboard.modules.system.dal.dataobject.dict.SysDictTypeDO; +import cn.iocoder.dashboard.modules.system.dal.mysql.dict.SysDictTypeMapper; import cn.iocoder.dashboard.modules.system.service.dict.SysDictDataService; import cn.iocoder.dashboard.modules.system.service.dict.SysDictTypeService; import org.springframework.stereotype.Service; @@ -16,6 +15,7 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.List; +import static cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; /** @@ -33,12 +33,12 @@ public class SysDictTypeServiceImpl implements SysDictTypeService { private SysDictTypeMapper dictTypeMapper; @Override - public PageResult pageDictTypes(SysDictTypePageReqVO reqVO) { + public PageResult getDictTypePage(SysDictTypePageReqVO reqVO) { return dictTypeMapper.selectPage(reqVO); } @Override - public List listDictTypes(SysDictTypeExportReqVO reqVO) { + public List getDictTypeList(SysDictTypeExportReqVO reqVO) { return dictTypeMapper.selectList(reqVO); } @@ -77,14 +77,14 @@ public class SysDictTypeServiceImpl implements SysDictTypeService { SysDictTypeDO dictType = this.checkDictTypeExists(id); // 校验是否有字典数据 if (dictDataService.countByDictType(dictType.getType()) > 0) { - throw ServiceExceptionUtil.exception(DICT_TYPE_HAS_CHILDREN); + throw exception(DICT_TYPE_HAS_CHILDREN); } // 删除字典类型 dictTypeMapper.deleteById(id); } @Override - public List listDictTypes() { + public List getDictTypeList() { return dictTypeMapper.selectList(); } @@ -104,10 +104,10 @@ public class SysDictTypeServiceImpl implements SysDictTypeService { } // 如果 id 为空,说明不用比较是否为相同 id 的字典类型 if (id == null) { - throw ServiceExceptionUtil.exception(DICT_TYPE_NAME_DUPLICATE); + throw exception(DICT_TYPE_NAME_DUPLICATE); } if (!dictType.getId().equals(id)) { - throw ServiceExceptionUtil.exception(DICT_TYPE_NAME_DUPLICATE); + throw exception(DICT_TYPE_NAME_DUPLICATE); } } @@ -118,10 +118,10 @@ public class SysDictTypeServiceImpl implements SysDictTypeService { } // 如果 id 为空,说明不用比较是否为相同 id 的字典类型 if (id == null) { - throw ServiceExceptionUtil.exception(DICT_TYPE_TYPE_DUPLICATE); + throw exception(DICT_TYPE_TYPE_DUPLICATE); } if (!dictType.getId().equals(id)) { - throw ServiceExceptionUtil.exception(DICT_TYPE_TYPE_DUPLICATE); + throw exception(DICT_TYPE_TYPE_DUPLICATE); } } @@ -131,7 +131,7 @@ public class SysDictTypeServiceImpl implements SysDictTypeService { } SysDictTypeDO dictType = dictTypeMapper.selectById(id); if (dictType == null) { - throw ServiceExceptionUtil.exception(DICT_TYPE_NOT_FOUND); + throw exception(DICT_TYPE_NOT_EXISTS); } return dictType; } diff --git a/src/main/java/cn/iocoder/dashboard/util/collection/ArrayUtils.java b/src/main/java/cn/iocoder/dashboard/util/collection/ArrayUtils.java new file mode 100644 index 000000000..7dc9fb654 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/util/collection/ArrayUtils.java @@ -0,0 +1,31 @@ +package cn.iocoder.dashboard.util.collection; + +import cn.hutool.core.util.ArrayUtil; + +/** + * Array 工具类 + * + * @author 芋道源码 + */ +public class ArrayUtils { + + /** + * 将 object 和 newElements 合并成一个数组 + * + * @param object 对象 + * @param newElements 数组 + * @param 泛型 + * @return 结果数组 + */ + @SafeVarargs + public static T[] append(T object, T... newElements) { + if (object == null) { + return newElements; + } + T[] result = ArrayUtil.newArray(object.getClass(), 1 + newElements.length); + result[0] = object; + System.arraycopy(newElements, 0, result, 1, newElements.length); + return result; + } + +} diff --git a/src/main/resources/codegen/java/test/serviceTest.vm b/src/main/resources/codegen/java/test/serviceTest.vm index c51a59bf1..692b60d6f 100644 --- a/src/main/resources/codegen/java/test/serviceTest.vm +++ b/src/main/resources/codegen/java/test/serviceTest.vm @@ -29,7 +29,7 @@ import static org.mockito.Mockito.*; ## 字段模板 #macro(getPageCondition $VO) // mock 数据 - ${table.className}DO db${simpleClassName} = randomPojo(${table.className}DO.class, o -> {); // 等会查询到 + ${table.className}DO db${simpleClassName} = randomPojo(${table.className}DO.class, o -> { // 等会查询到 #foreach ($column in $columns) #if (${column.listOperation}) #set ($JavaField = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})##首字母大写 @@ -123,7 +123,7 @@ public class ${table.className}ServiceTest extends BaseSpringBootUnitTest { // 调用 ${classNameVar}Service.delete${simpleClassName}(id); // 校验数据不存在了 - assertNull(configMapper.selectById(id)); + assertNull(${classNameVar}Mapper.selectById(id)); } @Test @@ -140,7 +140,7 @@ public class ${table.className}ServiceTest extends BaseSpringBootUnitTest { #getPageCondition("PageReqVO") // 调用 - PageResult<${table.className}DO> pageResult = configService.getConfigPage(reqVO); + PageResult<${table.className}DO> pageResult = ${classNameVar}Service.get${simpleClassName}Page(reqVO); // 断言 assertEquals(1, pageResult.getTotal()); assertEquals(1, pageResult.getList().size()); @@ -152,7 +152,7 @@ public class ${table.className}ServiceTest extends BaseSpringBootUnitTest { #getPageCondition("ExportReqVO") // 调用 - PageResult<${table.className}DO> list = configService.getConfigPage(reqVO); + List<${table.className}DO> list = ${classNameVar}Service.get${simpleClassName}List(reqVO); // 断言 assertEquals(1, list.size()); assertPojoEquals(db${simpleClassName}, list.get(0)); diff --git a/src/test/java/cn/iocoder/dashboard/modules/infra/service/config/InfConfigServiceTest.java b/src/test/java/cn/iocoder/dashboard/modules/infra/service/config/InfConfigServiceTest.java index 6f95f5ad0..07691ba00 100644 --- a/src/test/java/cn/iocoder/dashboard/modules/infra/service/config/InfConfigServiceTest.java +++ b/src/test/java/cn/iocoder/dashboard/modules/infra/service/config/InfConfigServiceTest.java @@ -1,6 +1,5 @@ package cn.iocoder.dashboard.modules.infra.service.config; -import cn.hutool.core.util.ArrayUtil; import cn.iocoder.dashboard.BaseSpringBootUnitTest; import cn.iocoder.dashboard.common.pojo.PageResult; import cn.iocoder.dashboard.modules.infra.controller.config.vo.InfConfigCreateReqVO; @@ -12,6 +11,7 @@ import cn.iocoder.dashboard.modules.infra.dal.mysql.config.InfConfigMapper; import cn.iocoder.dashboard.modules.infra.enums.config.InfConfigTypeEnum; import cn.iocoder.dashboard.modules.infra.mq.producer.config.InfConfigProducer; import cn.iocoder.dashboard.modules.infra.service.config.impl.InfConfigServiceImpl; +import cn.iocoder.dashboard.util.collection.ArrayUtils; import cn.iocoder.dashboard.util.object.ObjectUtils; import org.junit.jupiter.api.Test; import org.springframework.boot.test.mock.mockito.MockBean; @@ -20,13 +20,16 @@ import javax.annotation.Resource; import java.util.List; import java.util.function.Consumer; -import static cn.hutool.core.util.RandomUtil.*; +import static cn.hutool.core.util.RandomUtil.randomEle; import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.*; -import static cn.iocoder.dashboard.util.AssertUtils.*; -import static cn.iocoder.dashboard.util.RandomUtils.*; -import static cn.iocoder.dashboard.util.date.DateUtils.*; +import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.dashboard.util.AssertUtils.assertServiceException; +import static cn.iocoder.dashboard.util.RandomUtils.randomLongId; +import static cn.iocoder.dashboard.util.RandomUtils.randomPojo; +import static cn.iocoder.dashboard.util.date.DateUtils.buildTime; import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; /** * {@link InfConfigServiceImpl} 的单元测试类 @@ -227,12 +230,11 @@ public class InfConfigServiceTest extends BaseSpringBootUnitTest { // ========== 随机对象 ========== @SafeVarargs - @SuppressWarnings("unchecked") private static InfConfigDO randomInfConfigDO(Consumer... consumers) { Consumer consumer = (o) -> { o.setType(randomEle(InfConfigTypeEnum.values()).getType()); // 保证 key 的范围 }; - return randomPojo(InfConfigDO.class, ArrayUtil.append(new Consumer[]{consumer}, consumers)); + return randomPojo(InfConfigDO.class, ArrayUtils.append(consumer, consumers)); } } diff --git a/src/test/java/cn/iocoder/dashboard/modules/system/service/dict/SysDictTypeServiceTest.java b/src/test/java/cn/iocoder/dashboard/modules/system/service/dict/SysDictTypeServiceTest.java new file mode 100644 index 000000000..0e1affa64 --- /dev/null +++ b/src/test/java/cn/iocoder/dashboard/modules/system/service/dict/SysDictTypeServiceTest.java @@ -0,0 +1,263 @@ +package cn.iocoder.dashboard.modules.system.service.dict; + +import cn.iocoder.dashboard.BaseSpringBootUnitTest; +import cn.iocoder.dashboard.common.enums.CommonStatusEnum; +import cn.iocoder.dashboard.common.pojo.PageResult; +import cn.iocoder.dashboard.modules.system.controller.dict.vo.type.SysDictTypeCreateReqVO; +import cn.iocoder.dashboard.modules.system.controller.dict.vo.type.SysDictTypeExportReqVO; +import cn.iocoder.dashboard.modules.system.controller.dict.vo.type.SysDictTypePageReqVO; +import cn.iocoder.dashboard.modules.system.controller.dict.vo.type.SysDictTypeUpdateReqVO; +import cn.iocoder.dashboard.modules.system.dal.dataobject.dict.SysDictTypeDO; +import cn.iocoder.dashboard.modules.system.dal.mysql.dict.SysDictTypeMapper; +import cn.iocoder.dashboard.modules.system.service.dict.impl.SysDictTypeServiceImpl; +import cn.iocoder.dashboard.util.collection.ArrayUtils; +import cn.iocoder.dashboard.util.object.ObjectUtils; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; + +import javax.annotation.Resource; +import java.util.List; +import java.util.function.Consumer; + +import static cn.hutool.core.util.RandomUtil.randomEle; +import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.dashboard.util.AssertUtils.assertServiceException; +import static cn.iocoder.dashboard.util.RandomUtils.randomLongId; +import static cn.iocoder.dashboard.util.RandomUtils.randomPojo; +import static cn.iocoder.dashboard.util.date.DateUtils.buildTime; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.when; + +/** +* {@link SysDictTypeServiceImpl} 的单元测试类 +* +* @author 芋艿 +*/ +public class SysDictTypeServiceTest extends BaseSpringBootUnitTest { + + @Resource + private SysDictTypeServiceImpl dictTypeService; + + @Resource + private SysDictTypeMapper dictTypeMapper; + @MockBean + private SysDictDataService dictDataService; + + @Test + public void testGetDictTypePage() { + // mock 数据 + SysDictTypeDO dbDictType = randomPojo(SysDictTypeDO.class, o -> { // 等会查询到 + o.setName("yunai"); + o.setType("芋艿"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setCreateTime(buildTime(2021, 1, 15)); + }); + dictTypeMapper.insert(dbDictType); + // 测试 name 不匹配 + dictTypeMapper.insert(ObjectUtils.clone(dbDictType, o -> o.setName("tudou"))); + // 测试 type 不匹配 + dictTypeMapper.insert(ObjectUtils.clone(dbDictType, o -> o.setType("土豆"))); + // 测试 status 不匹配 + dictTypeMapper.insert(ObjectUtils.clone(dbDictType, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + // 测试 createTime 不匹配 + dictTypeMapper.insert(ObjectUtils.clone(dbDictType, o -> o.setCreateTime(buildTime(2021, 1, 1)))); + // 准备参数 + SysDictTypePageReqVO reqVO = new SysDictTypePageReqVO(); + reqVO.setName("nai"); + reqVO.setType("艿"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + reqVO.setBeginCreateTime(buildTime(2021, 1, 10)); + reqVO.setEndCreateTime(buildTime(2021, 1, 20)); + + // 调用 + PageResult pageResult = dictTypeService.getDictTypePage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbDictType, pageResult.getList().get(0)); + } + + @Test + public void testGetDictTypeList() { + // mock 数据 + SysDictTypeDO dbDictType = randomPojo(SysDictTypeDO.class, o -> { // 等会查询到 + o.setName("yunai"); + o.setType("芋艿"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setCreateTime(buildTime(2021, 1, 15)); + }); + dictTypeMapper.insert(dbDictType); + // 测试 name 不匹配 + dictTypeMapper.insert(ObjectUtils.clone(dbDictType, o -> o.setName("tudou"))); + // 测试 type 不匹配 + dictTypeMapper.insert(ObjectUtils.clone(dbDictType, o -> o.setType("土豆"))); + // 测试 status 不匹配 + dictTypeMapper.insert(ObjectUtils.clone(dbDictType, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + // 测试 createTime 不匹配 + dictTypeMapper.insert(ObjectUtils.clone(dbDictType, o -> o.setCreateTime(buildTime(2021, 1, 1)))); + // 准备参数 + SysDictTypeExportReqVO reqVO = new SysDictTypeExportReqVO(); + reqVO.setName("nai"); + reqVO.setType("艿"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + reqVO.setBeginCreateTime(buildTime(2021, 1, 10)); + reqVO.setEndCreateTime(buildTime(2021, 1, 20)); + + // 调用 + List list = dictTypeService.getDictTypeList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbDictType, list.get(0)); + } + + @Test + public void testGetDictType() { + // mock 数据 + SysDictTypeDO dbDictType = randomDictTypeDO(); + dictTypeMapper.insert(dbDictType); + // 准备参数 + String type = dbDictType.getType(); + + // 调用 + SysDictTypeDO dictType = dictTypeService.getDictType(type); + // 断言 + assertNotNull(dictType); + assertPojoEquals(dbDictType, dictType); + } + + @Test + public void testCreateDictType_success() { + // 准备参数 + SysDictTypeCreateReqVO reqVO = randomPojo(SysDictTypeCreateReqVO.class, + o -> o.setStatus(randomEle(CommonStatusEnum.values()).getStatus())); + + // 调用 + Long dictTypeId = dictTypeService.createDictType(reqVO); + // 断言 + assertNotNull(dictTypeId); + // 校验记录的属性是否正确 + SysDictTypeDO dictType = dictTypeMapper.selectById(dictTypeId); + assertPojoEquals(reqVO, dictType); + } + + @Test + public void testCreateDictType_nameDuplicate() { + // mock 数据 + SysDictTypeDO dbDictType = randomDictTypeDO(); + dictTypeMapper.insert(dbDictType);// @Sql: 先插入出一条存在的数据 + // 准备参数 + SysDictTypeCreateReqVO reqVO = randomPojo(SysDictTypeCreateReqVO.class, + o -> o.setName(dbDictType.getName())); // 模拟 name 重复 + + // 调用, 并断言异常 + assertServiceException(() -> dictTypeService.createDictType(reqVO), DICT_TYPE_NAME_DUPLICATE); + } + + @Test + public void testCreateDictType_typeDuplicate() { + // mock 数据 + SysDictTypeDO dbDictType = randomDictTypeDO(); + dictTypeMapper.insert(dbDictType);// @Sql: 先插入出一条存在的数据 + // 准备参数 + SysDictTypeCreateReqVO reqVO = randomPojo(SysDictTypeCreateReqVO.class, + o -> o.setType(dbDictType.getType())); // 模拟 type 重复 + + // 调用, 并断言异常 + assertServiceException(() -> dictTypeService.createDictType(reqVO), DICT_TYPE_TYPE_DUPLICATE); + } + + @Test + public void testUpdateDictType_success() { + // mock 数据 + SysDictTypeDO dbDictType = randomDictTypeDO(); + dictTypeMapper.insert(dbDictType);// @Sql: 先插入出一条存在的数据 + // 准备参数 + SysDictTypeUpdateReqVO reqVO = randomPojo(SysDictTypeUpdateReqVO.class, o -> { + o.setId(dbDictType.getId()); // 设置更新的 ID + o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); + }); + + // 调用 + dictTypeService.updateDictType(reqVO); + // 校验是否更新正确 + SysDictTypeDO dictType = dictTypeMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, dictType); + } + + @Test + public void testUpdateDictType_notExists() { + // 准备参数 + SysDictTypeUpdateReqVO reqVO = randomPojo(SysDictTypeUpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> dictTypeService.updateDictType(reqVO), DICT_TYPE_NOT_EXISTS); + } + + @Test + public void testUpdateDictType_nameDuplicate() { + // mock 数据,稍后更新它 + SysDictTypeDO dbDictType = randomDictTypeDO(); + dictTypeMapper.insert(dbDictType); + // mock 数据,ks稍后模拟重复它的名字 + SysDictTypeDO nameDictType = randomDictTypeDO(); + dictTypeMapper.insert(nameDictType); + // 准备参数 + SysDictTypeUpdateReqVO reqVO = randomPojo(SysDictTypeUpdateReqVO.class, o -> { + o.setId(dbDictType.getId()); // 设置更新的 ID + o.setName(nameDictType.getName()); // 模拟 name 重复 + }); + + // 调用, 并断言异常 + assertServiceException(() -> dictTypeService.updateDictType(reqVO), DICT_TYPE_NAME_DUPLICATE); + } + + @Test + public void testDeleteDictType_success() { + // mock 数据 + SysDictTypeDO dbDictType = randomDictTypeDO(); + dictTypeMapper.insert(dbDictType);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbDictType.getId(); + + // 调用 + dictTypeService.deleteDictType(id); + // 校验数据不存在了 + assertNull(dictTypeMapper.selectById(id)); + } + + @Test + public void testDeleteDictType_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> dictTypeService.deleteDictType(id), DICT_TYPE_NOT_EXISTS); + } + + @Test + public void testDeleteDictType_hasChildren() { + // mock 数据 + SysDictTypeDO dbDictType = randomDictTypeDO(); + dictTypeMapper.insert(dbDictType);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbDictType.getId(); + // mock 方法 + when(dictDataService.countByDictType(eq(dbDictType.getType()))).thenReturn(1); + + // 调用, 并断言异常 + assertServiceException(() -> dictTypeService.deleteDictType(id), DICT_TYPE_HAS_CHILDREN); + } + + // ========== 随机对象 ========== + + @SafeVarargs + private static SysDictTypeDO randomDictTypeDO(Consumer... consumers) { + Consumer consumer = (o) -> { + o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 + }; + return randomPojo(SysDictTypeDO.class, ArrayUtils.append(consumer, consumers)); + } + +} diff --git a/src/test/java/cn/iocoder/dashboard/modules/system/service/package-info.java b/src/test/java/cn/iocoder/dashboard/modules/system/service/package-info.java deleted file mode 100644 index 09c1d9d14..000000000 --- a/src/test/java/cn/iocoder/dashboard/modules/system/service/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service; diff --git a/src/test/resources/sql/clean.sql b/src/test/resources/sql/clean.sql index e23b555a1..e2f726ec4 100644 --- a/src/test/resources/sql/clean.sql +++ b/src/test/resources/sql/clean.sql @@ -7,6 +7,7 @@ DELETE FROM "sys_dict_data"; DELETE FROM "sys_role"; DELETE FROM "sys_role_menu"; DELETE FROM "sys_menu"; +DELETE FROM "sys_dict_type"; DELETE FROM "sys_login_log"; DELETE FROM "sys_operate_log"; DELETE FROM "sys_user"; diff --git a/src/test/resources/sql/create_tables.sql b/src/test/resources/sql/create_tables.sql index e8f20cfde..dfd0ba959 100644 --- a/src/test/resources/sql/create_tables.sql +++ b/src/test/resources/sql/create_tables.sql @@ -101,6 +101,20 @@ CREATE TABLE IF NOT EXISTS "sys_menu" ( PRIMARY KEY ("id") ) COMMENT '菜单权限表'; +CREATE TABLE "sys_dict_type" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(100) NOT NULL DEFAULT '', + "type" varchar(100) NOT NULL DEFAULT '', + "status" tinyint NOT NULL DEFAULT '0', + "remark" varchar(500) DEFAULT NULL, + "create_by" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "update_by" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '字典类型表'; + CREATE TABLE IF NOT EXISTS `sys_login_log` ( `id` bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY, `log_type` bigint(4) NOT NULL, From 84fe818c1ca59d80ebd782f606775d6c38870f0b Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 7 Mar 2021 01:30:29 +0800 Subject: [PATCH 016/126] =?UTF-8?q?=E5=AE=8C=E6=88=90=E9=83=A8=E5=88=86=20?= =?UTF-8?q?dict=20data=20=E7=9A=84=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dict/SysDictDataController.java | 6 +- .../dict/vo/data/SysDictDataBaseVO.java | 2 +- .../system/enums/SysErrorCodeConstants.java | 2 +- .../service/dict/SysDictDataService.java | 6 +- .../dict/impl/SysDictDataServiceImpl.java | 12 +- .../service/dict/SysDictDataServiceTest.java | 173 ++++++++++++++++++ .../service/dict/SysDictTypeServiceTest.java | 2 +- .../iocoder/dashboard/util/RandomUtils.java | 5 + 8 files changed, 193 insertions(+), 15 deletions(-) create mode 100644 src/test/java/cn/iocoder/dashboard/modules/system/service/dict/SysDictDataServiceTest.java diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/SysDictDataController.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/SysDictDataController.java index 1f37c62b7..baeb68342 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/SysDictDataController.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/SysDictDataController.java @@ -32,7 +32,7 @@ public class SysDictDataController { @GetMapping("/list-all-simple") // 无需添加权限认证,因为前端全局都需要 public CommonResult> listSimpleDictDatas() { - List list = dictDataService.listDictDatas(); + List list = dictDataService.getDictDataList(); return success(SysDictDataConvert.INSTANCE.convertList(list)); } @@ -40,7 +40,7 @@ public class SysDictDataController { @GetMapping("/page") // @PreAuthorize("@ss.hasPermi('system:dict:list')") public CommonResult> pageDictTypes(@Validated SysDictDataPageReqVO reqVO) { - return success(SysDictDataConvert.INSTANCE.convertPage(dictDataService.pageDictDatas(reqVO))); + return success(SysDictDataConvert.INSTANCE.convertPage(dictDataService.getDictDataPage(reqVO))); } @ApiOperation("/查询字典数据详细") @@ -83,7 +83,7 @@ public class SysDictDataController { // @Log(title = "字典类型", businessType = BusinessType.EXPORT) // @PreAuthorize("@ss.hasPermi('system:dict:export')") public void export(HttpServletResponse response, @Validated SysDictDataExportReqVO reqVO) throws IOException { - List list = dictDataService.listDictDatas(reqVO); + List list = dictDataService.getDictDataList(reqVO); List excelDataList = SysDictDataConvert.INSTANCE.convertList02(list); // 输出 ExcelUtils.write(response, "字典数据.xls", "数据列表", diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataBaseVO.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataBaseVO.java index bfcdf570d..702eba0ef 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataBaseVO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataBaseVO.java @@ -16,7 +16,7 @@ public class SysDictDataBaseVO { @ApiModelProperty(value = "显示顺序不能为空", required = true, example = "1024") @NotBlank(message = "显示顺序不能为空") - private String sort; + private Integer sort; @ApiModelProperty(value = "字典标签", required = true, example = "芋道") @NotBlank(message = "字典标签不能为空") diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java b/src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java index cc572033d..21d3e8910 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java @@ -65,7 +65,7 @@ public interface SysErrorCodeConstants { ErrorCode DICT_TYPE_HAS_CHILDREN = new ErrorCode(1002006004, "无法删除,该字典类型还有字典数据"); // ========== 字典数据 1002007000 ========== - ErrorCode DICT_DATA_NOT_FOUND = new ErrorCode(1002007001, "当前字典数据不存在"); + ErrorCode DICT_DATA_NOT_EXISTS = new ErrorCode(1002007001, "当前字典数据不存在"); ErrorCode DICT_DATA_NOT_ENABLE = new ErrorCode(1002007002, "字典数据不处于开启状态,不允许选择"); ErrorCode DICT_DATA_VALUE_DUPLICATE = new ErrorCode(1002007003, "已经存在该值的字典数据"); diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/SysDictDataService.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/SysDictDataService.java index 800236dfa..3969e420f 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/SysDictDataService.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/SysDictDataService.java @@ -27,7 +27,7 @@ public interface SysDictDataService extends DictDataFrameworkService { * * @return 字典数据全列表 */ - List listDictDatas(); + List getDictDataList(); /** * 获得字典数据分页列表 @@ -35,7 +35,7 @@ public interface SysDictDataService extends DictDataFrameworkService { * @param reqVO 分页请求 * @return 字典数据分页列表 */ - PageResult pageDictDatas(SysDictDataPageReqVO reqVO); + PageResult getDictDataPage(SysDictDataPageReqVO reqVO); /** * 获得字典数据列表 @@ -43,7 +43,7 @@ public interface SysDictDataService extends DictDataFrameworkService { * @param reqVO 列表请求 * @return 字典数据列表 */ - List listDictDatas(SysDictDataExportReqVO reqVO); + List getDictDataList(SysDictDataExportReqVO reqVO); /** * 获得字典数据详情 diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/impl/SysDictDataServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/impl/SysDictDataServiceImpl.java index 8ddd1c776..e8ebb82dc 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/impl/SysDictDataServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/impl/SysDictDataServiceImpl.java @@ -130,19 +130,19 @@ public class SysDictDataServiceImpl implements SysDictDataService { } @Override - public List listDictDatas() { + public List getDictDataList() { List list = dictDataMapper.selectList(); list.sort(COMPARATOR_TYPE_AND_SORT); return list; } @Override - public PageResult pageDictDatas(SysDictDataPageReqVO reqVO) { + public PageResult getDictDataPage(SysDictDataPageReqVO reqVO) { return dictDataMapper.selectPage(reqVO); } @Override - public List listDictDatas(SysDictDataExportReqVO reqVO) { + public List getDictDataList(SysDictDataExportReqVO reqVO) { List list = dictDataMapper.selectList(reqVO); list.sort(COMPARATOR_TYPE_AND_SORT); return list; @@ -194,10 +194,10 @@ public class SysDictDataServiceImpl implements SysDictDataService { private void checkCreateOrUpdate(Long id, String label, String dictType) { // 校验自己存在 checkDictDataExists(id); - // 校验字典数据的值的唯一性 - checkDictDataValueUnique(id, dictType, label); // 校验字典类型有效 checkDictTypeValid(dictType); + // 校验字典数据的值的唯一性 + checkDictDataValueUnique(id, dictType, label); } private void checkDictDataValueUnique(Long id, String dictType, String label) { @@ -220,7 +220,7 @@ public class SysDictDataServiceImpl implements SysDictDataService { } SysDictDataDO dictData = dictDataMapper.selectById(id); if (dictData == null) { - throw ServiceExceptionUtil.exception(DICT_DATA_NOT_FOUND); + throw ServiceExceptionUtil.exception(DICT_DATA_NOT_EXISTS); } } diff --git a/src/test/java/cn/iocoder/dashboard/modules/system/service/dict/SysDictDataServiceTest.java b/src/test/java/cn/iocoder/dashboard/modules/system/service/dict/SysDictDataServiceTest.java new file mode 100644 index 000000000..318a4afca --- /dev/null +++ b/src/test/java/cn/iocoder/dashboard/modules/system/service/dict/SysDictDataServiceTest.java @@ -0,0 +1,173 @@ +package cn.iocoder.dashboard.modules.system.service.dict; + +import cn.iocoder.dashboard.BaseSpringBootUnitTest; +import cn.iocoder.dashboard.common.enums.CommonStatusEnum; +import cn.iocoder.dashboard.common.pojo.PageResult; +import cn.iocoder.dashboard.modules.system.controller.dict.vo.data.SysDictDataCreateReqVO; +import cn.iocoder.dashboard.modules.system.controller.dict.vo.data.SysDictDataExportReqVO; +import cn.iocoder.dashboard.modules.system.controller.dict.vo.data.SysDictDataPageReqVO; +import cn.iocoder.dashboard.modules.system.controller.dict.vo.data.SysDictDataUpdateReqVO; +import cn.iocoder.dashboard.modules.system.dal.dataobject.dict.SysDictDataDO; +import cn.iocoder.dashboard.modules.system.dal.dataobject.dict.SysDictTypeDO; +import cn.iocoder.dashboard.modules.system.dal.mysql.dict.SysDictDataMapper; +import cn.iocoder.dashboard.modules.system.mq.producer.dict.SysDictDataProducer; +import cn.iocoder.dashboard.modules.system.service.dict.impl.SysDictDataServiceImpl; +import cn.iocoder.dashboard.util.object.ObjectUtils; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; + +import javax.annotation.Resource; +import java.util.List; + +import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.DICT_DATA_NOT_EXISTS; +import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.dashboard.util.AssertUtils.assertServiceException; +import static cn.iocoder.dashboard.util.RandomUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.*; + +/** +* {@link SysDictDataServiceImpl} 的单元测试类 +* +* @author 芋道源码 +*/ +public class SysDictDataServiceTest extends BaseSpringBootUnitTest { + + @Resource + private SysDictDataServiceImpl dictDataService; + + @Resource + private SysDictDataMapper dictDataMapper; + @MockBean + private SysDictTypeService dictTypeService; + @MockBean + private SysDictDataProducer dictDataProducer; + + @Test + public void testGetDictDataPage() { + // mock 数据 + SysDictDataDO dbDictData = randomPojo(SysDictDataDO.class, o -> { // 等会查询到 + o.setLabel("芋艿"); + o.setDictType("yunai"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + }); + dictDataMapper.insert(dbDictData); + // 测试 label 不匹配 + dictDataMapper.insert(ObjectUtils.clone(dbDictData, o -> o.setLabel("艿"))); + // 测试 dictType 不匹配 + dictDataMapper.insert(ObjectUtils.clone(dbDictData, o -> o.setDictType("nai"))); + // 测试 status 不匹配 + dictDataMapper.insert(ObjectUtils.clone(dbDictData, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + // 准备参数 + SysDictDataPageReqVO reqVO = new SysDictDataPageReqVO(); + reqVO.setLabel("芋"); + reqVO.setDictType("yu"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + + // 调用 + PageResult pageResult = dictDataService.getDictDataPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbDictData, pageResult.getList().get(0)); + } + + @Test + public void testGetDictDataList() { + // mock 数据 + SysDictDataDO dbDictData = randomPojo(SysDictDataDO.class, o -> { // 等会查询到 + o.setLabel("芋艿"); + o.setDictType("yunai"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + }); + dictDataMapper.insert(dbDictData); + // 测试 label 不匹配 + dictDataMapper.insert(ObjectUtils.clone(dbDictData, o -> o.setLabel("艿"))); + // 测试 dictType 不匹配 + dictDataMapper.insert(ObjectUtils.clone(dbDictData, o -> o.setDictType("nai"))); + // 测试 status 不匹配 + dictDataMapper.insert(ObjectUtils.clone(dbDictData, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + // 准备参数 + SysDictDataExportReqVO reqVO = new SysDictDataExportReqVO(); + reqVO.setLabel("芋"); + reqVO.setDictType("yu"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + + // 调用 + List list = dictDataService.getDictDataList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbDictData, list.get(0)); + } + + @Test + public void testCreateDictData_success() { + // 准备参数 + SysDictDataCreateReqVO reqVO = randomPojo(SysDictDataCreateReqVO.class, + o -> o.setStatus(randomCommonStatus())); + // mock 方法 + when(dictTypeService.getDictType(eq(reqVO.getDictType()))) + .thenReturn(randomPojo(SysDictTypeDO.class, o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus()))); + + // 调用 + Long dictDataId = dictDataService.createDictData(reqVO); + // 断言 + assertNotNull(dictDataId); + // 校验记录的属性是否正确 + SysDictDataDO dictData = dictDataMapper.selectById(dictDataId); + assertPojoEquals(reqVO, dictData); + // 校验调用 + verify(dictDataProducer, times(1)).sendDictDataRefreshMessage(); + } + + @Test + public void testUpdateDictData_success() { + // mock 数据 + SysDictDataDO dbDictData = randomPojo(SysDictDataDO.class); + dictDataMapper.insert(dbDictData);// @Sql: 先插入出一条存在的数据 + // 准备参数 + SysDictDataUpdateReqVO reqVO = randomPojo(SysDictDataUpdateReqVO.class, o -> { + o.setId(dbDictData.getId()); // 设置更新的 ID + }); + + // 调用 + dictDataService.updateDictData(reqVO); + // 校验是否更新正确 + SysDictDataDO dictData = dictDataMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, dictData); + } + + @Test + public void testUpdateDictData_notExists() { + // 准备参数 + SysDictDataUpdateReqVO reqVO = randomPojo(SysDictDataUpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> dictDataService.updateDictData(reqVO), DICT_DATA_NOT_EXISTS); + } + + @Test + public void testDeleteDictData_success() { + // mock 数据 + SysDictDataDO dbDictData = randomPojo(SysDictDataDO.class); + dictDataMapper.insert(dbDictData);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbDictData.getId(); + + // 调用 + dictDataService.deleteDictData(id); + // 校验数据不存在了 + assertNull(dictDataMapper.selectById(id)); + } + + @Test + public void testDeleteDictData_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> dictDataService.deleteDictData(id), DICT_DATA_NOT_EXISTS); + } + +} diff --git a/src/test/java/cn/iocoder/dashboard/modules/system/service/dict/SysDictTypeServiceTest.java b/src/test/java/cn/iocoder/dashboard/modules/system/service/dict/SysDictTypeServiceTest.java index 0e1affa64..e25fe2577 100644 --- a/src/test/java/cn/iocoder/dashboard/modules/system/service/dict/SysDictTypeServiceTest.java +++ b/src/test/java/cn/iocoder/dashboard/modules/system/service/dict/SysDictTypeServiceTest.java @@ -33,7 +33,7 @@ import static org.mockito.Mockito.when; /** * {@link SysDictTypeServiceImpl} 的单元测试类 * -* @author 芋艿 +* @author 芋道源码 */ public class SysDictTypeServiceTest extends BaseSpringBootUnitTest { diff --git a/src/test/java/cn/iocoder/dashboard/util/RandomUtils.java b/src/test/java/cn/iocoder/dashboard/util/RandomUtils.java index 572668647..c668f980c 100644 --- a/src/test/java/cn/iocoder/dashboard/util/RandomUtils.java +++ b/src/test/java/cn/iocoder/dashboard/util/RandomUtils.java @@ -2,6 +2,7 @@ package cn.iocoder.dashboard.util; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.RandomUtil; +import cn.iocoder.dashboard.common.enums.CommonStatusEnum; import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; import uk.co.jemos.podam.api.PodamFactory; import uk.co.jemos.podam.api.PodamFactoryImpl; @@ -67,6 +68,10 @@ public class RandomUtils { .map(i -> randomPojo(clazz)).collect(Collectors.toSet()); } + public static Integer randomCommonStatus() { + return RandomUtil.randomEle(CommonStatusEnum.values()).getStatus(); + } + @SafeVarargs public static SysUserDO randomUserDO(Consumer... consumers) { return randomPojo(SysUserDO.class, consumers); From 2c869354a7b07dcccf76b289b7100872d0d2db32 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 7 Mar 2021 11:45:16 +0800 Subject: [PATCH 017/126] =?UTF-8?q?README=20=E5=A2=9E=E5=8A=A0=E5=8D=95?= =?UTF-8?q?=E5=85=83=E6=B5=8B=E8=AF=95=E7=9A=84=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 4597c708f..0bc06b7ed 100644 --- a/README.md +++ b/README.md @@ -43,11 +43,12 @@ 1. 幂等组件:基于 Redis 实现幂等组件,解决重复请求问题 1. 服务保障:基于 Resilience4j 实现服务的稳定性,包括限流、熔断等功能 1. 日志服务:轻量级日志中心,查看远程服务器的日志 +1. 单元测试:基于 JUnit + Mockito 实现单元测试,保证功能的正确性、代码的质量等 ### 研发工具 1. 表单构建:拖动表单元素生成相应的 HTML 代码 -1. 代码生成:前后端代码的生成(Java、Vue、SQL),支持 CRUD 下载 +1. 代码生成:前后端代码的生成(Java、Vue、SQL、单元测试),支持 CRUD 下载 1. 系统接口:基于 Swagger 自动生成相关的 RESTful API 接口文档 1. 数据库文档:基于 Screw 自动生成数据库文档 @@ -83,7 +84,9 @@ | [Spring Boot Admin](https://github.com/skywalking) | Spring Boot 监控平台 | 8.6.0 | [文档](http://www.iocoder.cn/Spring-Boot/Admin/?yudao) | | [Jackson](https://github.com/FasterXML/jackson) | JSON 工具库 | 2.11.4 | | | [MapStruct](https://mapstruct.org/) | Java Bean 转换 | 1.4.1 | [文档](http://www.iocoder.cn/Spring-Boot/MapStruct/?yudao) | -| [Lombok](https://projectlombok.org/) | 消除冗长的 Java 代码| 1.16.14 | [文档](http://www.iocoder.cn/Spring-Boot/Lombok/?yudao) | +| [Lombok](https://projectlombok.org/) | 消除冗长的 Java 代码 | 1.16.14 | [文档](http://www.iocoder.cn/Spring-Boot/Lombok/?yudao) | +| [JUnit](https://junit.org/junit5/) | Java 单元测试框架 | 5.7.0 | - | +| [Mockito](https://junit.org/junit5/) | Java Mock 框架 | 3.6.28 | - | **前端** @@ -125,7 +128,7 @@ - + - From 767cd90279e2247e704156f7c028b0b97560f663 Mon Sep 17 00:00:00 2001 From: zengzefeng <986510453@qq.com> Date: Mon, 8 Mar 2021 09:15:52 +0800 Subject: [PATCH 018/126] =?UTF-8?q?=E6=89=B9=E9=87=8F=E5=8F=91=E9=80=81?= =?UTF-8?q?=E5=8D=8A=E6=88=90=E5=93=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 16 ++- sql/sms.sql | 42 ++++-- .../common/enums/DefaultBitFieldEnum.java | 27 ++++ .../sms/client/AbstractSmsClient.java | 2 +- .../framework/sms/client/AliyunSmsClient.java | 37 +++-- .../sms/client/HadCallbackSmsClient.java | 25 ++++ .../client/NeedQuerySendResultSmsClient.java | 24 ++++ .../framework/sms/client/SmsClient.java | 5 + .../sms/client/YunpianSmsClient.java | 132 ++++++++++++++++++ .../dashboard/framework/sms/core/SmsBody.java | 6 +- .../framework/sms/core/SmsConstants.java | 18 +++ .../framework/sms/core/SmsResult.java | 13 +- .../framework/sms/core/SmsResultDetail.java | 4 +- .../sms/core/property/SmsChannelProperty.java | 11 ++ .../sms/SmsDefaultCallbackController.java | 27 ++++ .../mysql/dao/sms/SysSmsQueryLogMapper.java | 27 ++++ ...ogMapper.java => SysSmsSendLogMapper.java} | 4 +- .../mysql/dataobject/sms/SysSmsChannelDO.java | 10 ++ .../dataobject/sms/SysSmsQueryLogDO.java | 94 +++++++++++++ ...{SysSmsLogDO.java => SysSmsSendLogDO.java} | 27 ++-- .../system/enums/sms/SmsSendStatusEnum.java | 24 ++-- .../mq/consumer/sms/SmsSendConsumer.java | 18 ++- ...ervice.java => SysSmsQueryLogService.java} | 7 +- .../service/sms/SysSmsSendLogService.java | 13 ++ .../system/service/sms/SysSmsService.java | 69 ++------- .../sms/impl/SysSmsLogServiceImpl.java | 77 ---------- .../sms/impl/SysSmsQueryLogServiceImpl.java | 59 ++++++++ .../sms/impl/SysSmsSendLogServiceImpl.java | 109 +++++++++++++++ .../service/sms/impl/SysSmsServiceImpl.java | 28 ++-- .../dashboard/util/json/JsonUtils.java | 10 +- 30 files changed, 735 insertions(+), 230 deletions(-) create mode 100644 src/main/java/cn/iocoder/dashboard/common/enums/DefaultBitFieldEnum.java create mode 100644 src/main/java/cn/iocoder/dashboard/framework/sms/client/HadCallbackSmsClient.java create mode 100644 src/main/java/cn/iocoder/dashboard/framework/sms/client/NeedQuerySendResultSmsClient.java create mode 100644 src/main/java/cn/iocoder/dashboard/framework/sms/client/YunpianSmsClient.java create mode 100644 src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsConstants.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SmsDefaultCallbackController.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/SysSmsQueryLogMapper.java rename src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/{SysSmsLogMapper.java => SysSmsSendLogMapper.java} (71%) create mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SysSmsQueryLogDO.java rename src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/{SysSmsLogDO.java => SysSmsSendLogDO.java} (66%) rename src/main/java/cn/iocoder/dashboard/modules/system/service/sms/{SysSmsLogService.java => SysSmsQueryLogService.java} (84%) create mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsSendLogService.java delete mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsLogServiceImpl.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsQueryLogServiceImpl.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsSendLogServiceImpl.java diff --git a/pom.xml b/pom.xml index 163aa1941..52c3e85dc 100644 --- a/pom.xml +++ b/pom.xml @@ -183,12 +183,6 @@ ${jjwt.version} - - org.projectlombok - lombok - ${lombok.version} - - org.mapstruct mapstruct @@ -222,17 +216,25 @@ ${easyexcel.verion} + + + + com.yunpian.sdk + yunpian-java-sdk + 1.2.7 + + com.aliyun aliyun-java-sdk-core 4.5.18 - com.aliyun aliyun-java-sdk-dysmsapi 2.1.0 + diff --git a/sql/sms.sql b/sql/sms.sql index 82d854155..027052779 100644 --- a/sql/sms.sql +++ b/sql/sms.sql @@ -12,6 +12,8 @@ CREATE TABLE `sms_channel` `code` varchar(50) NOT NULL COMMENT '编码(来自枚举类 阿里、华为、七牛等)', `api_key` varchar(100) NOT NULL COMMENT '账号id', `api_secret` varchar(100) NOT NULL COMMENT '账号秘钥', + `had_callback` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否拥有回调函数', + `callback_url` varchar(100) NOT NULL default '' COMMENT '回调请求路径', `api_signature_id` varchar(100) NOT NULL COMMENT '实际渠道签名唯一标识', `name` varchar(50) NOT NULL COMMENT '名称', `signature` varchar(50) NOT NULL COMMENT '签名值', @@ -60,23 +62,47 @@ CREATE TABLE `sms_template` AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8mb4 COMMENT ='短信模板'; +-- ---------------------------- +-- Table structure for sms_query_log +-- ---------------------------- +DROP TABLE IF EXISTS `sms_query_log`; +CREATE TABLE `sms_query_log` +( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增编号', + `api_id` varchar(100) NOT NULL COMMENT '第三方唯一标识', + `channel_code` varchar(50) NOT NULL COMMENT '短信渠道编码(来自枚举类)', + `channel_id` bigint(20) NOT NULL COMMENT '短信渠道id', + `template_code` varchar(50) NOT NULL COMMENT '渠道编码', + `phones` varchar(2000) NOT NULL COMMENT '手机号(数组json字符串)', + `content` varchar(1000) NOT NULL DEFAULT '' COMMENT '内容', + `send_result_param` varchar(200) NOT NULL DEFAULT '' COMMENT '查询短信发送结果的参数', + `send_status` tinyint(1) NOT NULL DEFAULT 2 COMMENT '发送状态(0本地异步中 1发送请求失败 2发送请求成功)', + `got_result` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否获取发送结果', + `had_callback` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否拥有回调函数', + `create_by` varchar(64) NOT NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB + AUTO_INCREMENT = 1 + DEFAULT CHARSET = utf8mb4 COMMENT ='短信请求日志'; + -- ---------------------------- -- Table structure for sms_log -- ---------------------------- -DROP TABLE IF EXISTS `sms_log`; -CREATE TABLE `sms_log` +DROP TABLE IF EXISTS `sms_send_log`; +CREATE TABLE `sms_send_log` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增编号', `channel_code` varchar(50) NOT NULL COMMENT '短信渠道编码(来自枚举类)', `channel_id` bigint(20) NOT NULL COMMENT '短信渠道id', `template_code` varchar(50) NOT NULL COMMENT '渠道编码', - `phones` char(11) NOT NULL COMMENT '手机号(数组json字符串)', + `query_log_id` bigint(20) NOT NULL COMMENT '请求日志id', + `phone` char(11) NOT NULL COMMENT '手机号', `content` varchar(1000) NOT NULL DEFAULT '' COMMENT '内容', - `remark` varchar(200) DEFAULT NULL COMMENT '备注', - `send_status` tinyint(4) NOT NULL DEFAULT 2 COMMENT '发送状态(1异步推送中 2发送中 3失败 4成功)', - `create_by` varchar(64) NOT NULL DEFAULT '' COMMENT '创建者', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `remark` varchar(200) DEFAULT NULL COMMENT '备注', + `success` tinyint(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `send_time` datetime DEFAULT NULL COMMENT '创建时间', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 1 - DEFAULT CHARSET = utf8mb4 COMMENT ='短信日志'; + DEFAULT CHARSET = utf8mb4 COMMENT ='短信发送日志'; diff --git a/src/main/java/cn/iocoder/dashboard/common/enums/DefaultBitFieldEnum.java b/src/main/java/cn/iocoder/dashboard/common/enums/DefaultBitFieldEnum.java new file mode 100644 index 000000000..7738d40a2 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/common/enums/DefaultBitFieldEnum.java @@ -0,0 +1,27 @@ +package cn.iocoder.dashboard.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 通用状态枚举 + * + * @author 芋道源码 + */ +@Getter +@AllArgsConstructor +public enum DefaultBitFieldEnum { + + NO(0, "否"), + YES(1, "是"); + + /** + * 状态值 + */ + private final Integer val; + /** + * 状态名 + */ + private final String name; + +} diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/client/AbstractSmsClient.java b/src/main/java/cn/iocoder/dashboard/framework/sms/client/AbstractSmsClient.java index d40d636e4..150b994bb 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/client/AbstractSmsClient.java +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/client/AbstractSmsClient.java @@ -58,7 +58,7 @@ public abstract class AbstractSmsClient implements SmsClient { * @return 短信发送结果 * @throws Exception 调用发送失败,抛出异常 */ - public abstract SmsResult doSend(String templateApiId, SmsBody smsBody, Collection targets) throws Exception; + protected abstract SmsResult doSend(String templateApiId, SmsBody smsBody, Collection targets) throws Exception; protected void beforeSend(String templateApiId, SmsBody smsBody, Collection targets) throws Exception { } diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/client/AliyunSmsClient.java b/src/main/java/cn/iocoder/dashboard/framework/sms/client/AliyunSmsClient.java index f88d6f291..fff2d162d 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/client/AliyunSmsClient.java +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/client/AliyunSmsClient.java @@ -2,7 +2,6 @@ package cn.iocoder.dashboard.framework.sms.client; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.StrUtil; import cn.iocoder.dashboard.framework.sms.core.SmsBody; import cn.iocoder.dashboard.framework.sms.core.SmsResult; import cn.iocoder.dashboard.framework.sms.core.SmsResultDetail; @@ -14,11 +13,11 @@ import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsRequest; import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsResponse; import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest; import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse; +import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.http.MethodType; import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.profile.IClientProfile; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; import java.util.ArrayList; import java.util.Collection; @@ -31,7 +30,7 @@ import java.util.List; * @date 2021/1/25 14:17 */ @Slf4j -public class AliyunSmsClient extends AbstractSmsClient { +public class AliyunSmsClient extends AbstractSmsClient implements NeedQuerySendResultSmsClient { private static final String OK = "OK"; @@ -70,35 +69,43 @@ public class AliyunSmsClient extends AbstractSmsClient { request.setTemplateParam(smsBody.getParamsStr()); SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request); - boolean result = OK.equals(sendSmsResponse.getCode()); - if (!result) { + boolean success = OK.equals(sendSmsResponse.getCode()); + if (!success) { log.debug("send fail[code={}, message={}]", sendSmsResponse.getCode(), sendSmsResponse.getMessage()); } - SmsResult resultBody = new SmsResult(); - resultBody.setSuccess(result); + return new SmsResult() + .setSuccess(success) + .setMessage(sendSmsResponse.getMessage()) + .setCode(sendSmsResponse.getCode()) + .setApiId(sendSmsResponse.getBizId()) + .setSendResultParam(sendSmsResponse.getBizId()); + } + + + @Override + public List getSmsSendResult(String param) throws ClientException { QuerySendDetailsRequest querySendDetailsRequest = new QuerySendDetailsRequest(); - querySendDetailsRequest.setBizId(sendSmsResponse.getBizId()); - // TODO FROM 芋艿 to zzf:发送完之后,基于短信平台回调,去更新回执状态。短信发送是否成功,和最终用户收到,是两个维度。这块有困惑,可以微信,我给个截图哈。 + querySendDetailsRequest.setBizId(param); + // TODO FROM 芋艿 to zzf:发送完之后,基于短信平台回调,去更新回执状态。短信发送是否成功,和最终用户收到,是两个维度。这块有困惑,可以微信,我给个截图哈。 DONE QuerySendDetailsResponse acsResponse = acsClient.getAcsResponse(querySendDetailsRequest); List resultDetailList = new ArrayList<>(Integer.parseInt(acsResponse.getTotalCount())); acsResponse.getSmsSendDetailDTOs().forEach(s -> { SmsResultDetail resultDetail = new SmsResultDetail(); - resultDetail.setCreateTime(DateUtil.parseDateTime(s.getSendDate())); + resultDetail.setSendTime(DateUtil.parseDateTime(s.getSendDate())); resultDetail.setMessage(s.getContent()); resultDetail.setPhone(s.getPhoneNum()); - resultDetail.setStatus(statusConvert(s.getSendStatus())); + resultDetail.setSendStatus(statusConvert(s.getSendStatus())); resultDetailList.add(resultDetail); }); - resultBody.setResult(resultDetailList); - return resultBody; + return resultDetailList; } private int statusConvert(Long aliSendStatus) { if (aliSendStatus == 1L) { - return SmsSendStatusEnum.SUCCESS.getStatus(); + return SmsSendStatusEnum.SEND_SUCCESS.getStatus(); } if (aliSendStatus == 2L) { - return SmsSendStatusEnum.FAIL.getStatus(); + return SmsSendStatusEnum.SEND_FAIL.getStatus(); } return SmsSendStatusEnum.WAITING.getStatus(); } diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/client/HadCallbackSmsClient.java b/src/main/java/cn/iocoder/dashboard/framework/sms/client/HadCallbackSmsClient.java new file mode 100644 index 000000000..1df4261d3 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/client/HadCallbackSmsClient.java @@ -0,0 +1,25 @@ +package cn.iocoder.dashboard.framework.sms.client; + +import cn.iocoder.dashboard.framework.sms.core.SmsResultDetail; + +import javax.servlet.ServletRequest; +import java.io.UnsupportedEncodingException; +import java.util.List; + +/** + * 需要发送请求获取短信发送结果的短信客户端 + * + * @author zzf + * @date 2021/3/4 17:20 + */ +public interface HadCallbackSmsClient { + + /** + * 获取短信发送结果 + * + * @param request 请求 + * @return 短信发送结果 + */ + List getSmsSendResult(ServletRequest request) throws Exception; + +} diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/client/NeedQuerySendResultSmsClient.java b/src/main/java/cn/iocoder/dashboard/framework/sms/client/NeedQuerySendResultSmsClient.java new file mode 100644 index 000000000..37352235f --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/client/NeedQuerySendResultSmsClient.java @@ -0,0 +1,24 @@ +package cn.iocoder.dashboard.framework.sms.client; + +import cn.iocoder.dashboard.framework.sms.core.SmsResultDetail; +import com.aliyuncs.exceptions.ClientException; + +import java.util.List; + +/** + * 需要发送请求获取短信发送结果的短信客户端 + * + * @author zzf + * @date 2021/3/4 17:20 + */ +public interface NeedQuerySendResultSmsClient { + + /** + * 获取短信发送结果 + * + * @param param 参数 + * @return 短信发送结果 + */ + List getSmsSendResult(String param) throws Exception; + +} diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/client/SmsClient.java b/src/main/java/cn/iocoder/dashboard/framework/sms/client/SmsClient.java index 94a6de933..803e3b16f 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/client/SmsClient.java +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/client/SmsClient.java @@ -2,8 +2,10 @@ package cn.iocoder.dashboard.framework.sms.client; import cn.iocoder.dashboard.framework.sms.core.SmsBody; import cn.iocoder.dashboard.framework.sms.core.SmsResult; +import cn.iocoder.dashboard.framework.sms.core.SmsResultDetail; import java.util.Collection; +import java.util.List; /** * 短信父接口 @@ -23,4 +25,7 @@ public interface SmsClient { */ SmsResult send(String templateApiId, SmsBody smsBody, Collection targets); + + //List getSmsSendResult(String jsonObjectParam); + } \ No newline at end of file diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/client/YunpianSmsClient.java b/src/main/java/cn/iocoder/dashboard/framework/sms/client/YunpianSmsClient.java new file mode 100644 index 000000000..77cd45f06 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/client/YunpianSmsClient.java @@ -0,0 +1,132 @@ +package cn.iocoder.dashboard.framework.sms.client; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.CharsetUtil; +import cn.iocoder.dashboard.framework.sms.core.SmsBody; +import cn.iocoder.dashboard.framework.sms.core.SmsConstants; +import cn.iocoder.dashboard.framework.sms.core.SmsResult; +import cn.iocoder.dashboard.framework.sms.core.SmsResultDetail; +import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperty; +import cn.iocoder.dashboard.modules.system.enums.sms.SmsSendStatusEnum; +import cn.iocoder.dashboard.util.json.JsonUtils; +import com.fasterxml.jackson.core.type.TypeReference; +import com.yunpian.sdk.YunpianClient; +import com.yunpian.sdk.constant.Code; +import com.yunpian.sdk.constant.YunpianConstant; +import com.yunpian.sdk.model.Result; +import com.yunpian.sdk.model.SmsBatchSend; +import lombok.extern.slf4j.Slf4j; + +import javax.servlet.ServletRequest; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.*; + +/** + * 云片短信实现类 + * + * @author zzf + * @date 9:48 2021/3/5 + */ +@Slf4j +public class YunpianSmsClient extends AbstractSmsClient implements HadCallbackSmsClient { + + private final YunpianClient client; + + private final TypeReference>> callbackType = new TypeReference>>() { + }; + + /** + * 构造云片短信发送处理 + * + * @param channelVO 阿里云短信配置 + */ + public YunpianSmsClient(SmsChannelProperty channelVO) { + super(channelVO); + client = new YunpianClient(channelVO.getApiKey()); + } + + @Override + public SmsResult doSend(String templateApiId, SmsBody smsBody, Collection targets) { + Map paramMap = new HashMap<>(); + paramMap.put("apikey", getProperty().getApiKey()); + paramMap.put("mobile", String.join(SmsConstants.COMMA, targets)); + paramMap.put("text", formatContent(smsBody)); + paramMap.put("callback", getProperty().getCallbackUrl()); + + Result sendResult = client.sms().batch_send(paramMap); + boolean success = sendResult.getCode().equals(Code.OK); + + if (!success) { + log.debug("send fail[code={}, message={}]", sendResult.getCode(), sendResult.getDetail()); + } + return new SmsResult() + .setSuccess(success) + .setMessage(sendResult.getDetail()) + .setCode(sendResult.getCode().toString()) + .setApiId(sendResult.getData().getData().get(0).getSid().toString()); + } + + + /** + * 格式化短信内容,将参数注入到模板中 + * + * @param smsBody 短信信息 + * @return 格式化后的短信内容 + */ + private String formatContent(SmsBody smsBody) { + StringBuilder result = new StringBuilder(smsBody.getTemplateContent()); + smsBody.getParams().forEach((key, val) -> { + String param = parseParamToPlaceholder(key); + result.replace(result.indexOf(param), result.indexOf(param + param.length()), val); + }); + return result.toString(); + } + + /** + * 将指定参数改成对应的占位字符 + *

+ * 云片的是 #param# 的形式作为占位符 + * + * @param key 参数名 + * @return 对应的占位字符 + */ + private String parseParamToPlaceholder(String key) { + return SmsConstants.JING_HAO + key + SmsConstants.JING_HAO; + } + + + @Override + public List getSmsSendResult(ServletRequest request) throws UnsupportedEncodingException { + List> stringStringMap = getSendResult(request); + List resultDetailList = new ArrayList<>(stringStringMap.size()); + stringStringMap.forEach(map -> { + SmsResultDetail detail = new SmsResultDetail(); + + detail.setPhone(map.get("mobile")); + detail.setMessage(map.get("error_msg")); + detail.setSendTime(DateUtil.parseTime(map.get("user_receive_time"))); + String reportStatus = map.get("report_status"); + detail.setSendStatus(reportStatus.equals(SmsConstants.SUCCESS) + ? SmsSendStatusEnum.SEND_SUCCESS.getStatus() + : SmsSendStatusEnum.SEND_FAIL.getStatus() + ); + resultDetailList.add(detail); + }); + return resultDetailList; + } + + /** + * 从 request 中获取请求中传入的短信发送结果信息 + * + * @param request 回调请求 + * @return 短信发送结果信息 + * @throws UnsupportedEncodingException 解码异常 + */ + private List> getSendResult(ServletRequest request) throws UnsupportedEncodingException { + Map parameterMap = request.getParameterMap(); + String[] smsStatuses = parameterMap.get(YunpianConstant.SMS_STATUS); + String encode = URLEncoder.encode(smsStatuses[0], CharsetUtil.UTF_8); + return JsonUtils.parseByType(encode, callbackType); + } +} diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsBody.java b/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsBody.java index 9b132431e..f82f0e142 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsBody.java +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsBody.java @@ -4,7 +4,6 @@ import cn.iocoder.dashboard.util.json.JsonUtils; import lombok.Data; import java.util.Map; -import java.util.UUID; /** * 消息内容实体类 @@ -22,6 +21,11 @@ public class SmsBody { */ private String templateCode; + /** + * 模板编码 + */ + private String templateContent; + /** * 参数列表 */ diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsConstants.java b/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsConstants.java new file mode 100644 index 000000000..e519306f3 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsConstants.java @@ -0,0 +1,18 @@ +package cn.iocoder.dashboard.framework.sms.core; + +/** + * 短信相关常量类 + * + * @author zzf + * @date 2021/3/5 10:42 + */ +public interface SmsConstants { + + String OK = "OK"; + + String JING_HAO = "#"; + + String COMMA = ","; + + String SUCCESS = "SUCCESS"; +} diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResult.java b/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResult.java index 46306322d..694005482 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResult.java +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResult.java @@ -1,14 +1,15 @@ package cn.iocoder.dashboard.framework.sms.core; import lombok.Data; +import lombok.experimental.Accessors; import java.io.Serializable; -import java.util.List; /** * 消息内容实体类 */ @Data +@Accessors(chain = true) public class SmsResult implements Serializable { /** @@ -16,6 +17,11 @@ public class SmsResult implements Serializable { */ private Boolean success; + /** + * 第三方唯一标识 + */ + private String apiId; + /** * 状态码 */ @@ -27,10 +33,9 @@ public class SmsResult implements Serializable { private String message; /** - * 返回值 + * 用于查询发送结果的参数 */ - private List result; - + private String sendResultParam; public static SmsResult failResult(String message) { SmsResult resultBody = new SmsResult(); diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResultDetail.java b/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResultDetail.java index 67de28938..fcca0a0be 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResultDetail.java +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResultDetail.java @@ -14,7 +14,7 @@ public class SmsResultDetail implements Serializable { /** * 短信发送状态 {@link cn.iocoder.dashboard.modules.system.enums.sms.SmsSendStatusEnum} */ - private Integer status; + private Integer sendStatus; /** * 接收手机号 @@ -29,5 +29,5 @@ public class SmsResultDetail implements Serializable { /** * 时间 */ - private Date createTime; + private Date sendTime; } diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/core/property/SmsChannelProperty.java b/src/main/java/cn/iocoder/dashboard/framework/sms/core/property/SmsChannelProperty.java index 95f2a8ce7..1c7ff2305 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/core/property/SmsChannelProperty.java +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/core/property/SmsChannelProperty.java @@ -54,4 +54,15 @@ public class SmsChannelProperty implements Serializable { @NotEmpty(message = "签名值不能为空") private String signature; + /** + * 是否拥有回调函数(0否 1是) + */ + @NotNull(message = "是否拥有回调函数不能为空") + private Integer hadCallback; + + /** + * 短信发送回调url + */ + private String callbackUrl; + } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SmsDefaultCallbackController.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SmsDefaultCallbackController.java new file mode 100644 index 000000000..94f0fc81d --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SmsDefaultCallbackController.java @@ -0,0 +1,27 @@ +package cn.iocoder.dashboard.modules.system.controller.sms; + +import cn.iocoder.dashboard.modules.system.service.sms.SysSmsService; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.ServletRequest; + +/** + * 短信默认回调接口 + * + * @author zzf + * @date 2021/3/5 8:59 + */ +@RestController("/sms/callback") +public class SmsDefaultCallbackController { + + @Resource + private SysSmsService smsService; + + @RequestMapping("/sms-send") + public Object sendSmsCallback(ServletRequest request){ + return smsService.smsSendCallbackHandle(request); + } + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/SysSmsQueryLogMapper.java b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/SysSmsQueryLogMapper.java new file mode 100644 index 000000000..7472f481e --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/SysSmsQueryLogMapper.java @@ -0,0 +1,27 @@ +package cn.iocoder.dashboard.modules.system.dal.mysql.dao.sms; + +import cn.iocoder.dashboard.common.enums.DefaultBitFieldEnum; +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SysSmsQueryLogDO; +import cn.iocoder.dashboard.modules.system.enums.sms.SmsSendStatusEnum; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface SysSmsQueryLogMapper extends BaseMapper { + + /** + * 查询还没有获取发送结果的短信请求信息 + * + * @return + */ + default List selectNoResultQueryLogList() { + return this.selectList(new LambdaQueryWrapper() + .eq(SysSmsQueryLogDO::getSendStatus, SmsSendStatusEnum.QUERY_SUCCESS) + .eq(SysSmsQueryLogDO::getGotResult, DefaultBitFieldEnum.NO) + .eq(SysSmsQueryLogDO::getHadCallback, DefaultBitFieldEnum.NO) + ); + } +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/SysSmsLogMapper.java b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/SysSmsSendLogMapper.java similarity index 71% rename from src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/SysSmsLogMapper.java rename to src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/SysSmsSendLogMapper.java index cdb6df40b..eebb48fcc 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/SysSmsLogMapper.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/SysSmsSendLogMapper.java @@ -1,10 +1,10 @@ package cn.iocoder.dashboard.modules.system.dal.mysql.dao.sms; -import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SysSmsLogDO; +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SysSmsSendLogDO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; @Mapper -public interface SysSmsLogMapper extends BaseMapper { +public interface SysSmsSendLogMapper extends BaseMapper { } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SysSmsChannelDO.java b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SysSmsChannelDO.java index 3e9422e79..3f212dbda 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SysSmsChannelDO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SysSmsChannelDO.java @@ -27,6 +27,16 @@ public class SysSmsChannelDO extends BaseDO { */ private String code; + /** + * 是否拥有回答(0否 1是) + */ + private Integer had_callback; + + /** + * 短信发送回调url + */ + private String callback_url; + /** * 渠道账号id */ diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SysSmsQueryLogDO.java b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SysSmsQueryLogDO.java new file mode 100644 index 000000000..fce137d2c --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SysSmsQueryLogDO.java @@ -0,0 +1,94 @@ +package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 短信日志 + * + * @author zzf + * @since 2021-01-25 + */ +@Data +@EqualsAndHashCode +@Accessors(chain = true) +@TableName(value = "sms_query_log", autoResultMap = true) +public class SysSmsQueryLogDO implements Serializable { + + /** + * 自增编号 + */ + private Long id; + + /** + * 短信渠道编码(来自枚举类) + */ + private String channelCode; + + /** + * 短信渠道id + */ + private Long channelId; + + /** + * 模板id + */ + private String templateCode; + + /** + * 手机号 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List phones; + + /** + * 内容 + */ + private String content; + + /** + * 发送状态 + * + * @see cn.iocoder.dashboard.modules.system.enums.sms.SmsSendStatusEnum + */ + private Integer sendStatus; + + /** + * 是否获取过结果[0否 1是] + */ + private Integer gotResult; + + /** + * 是否拥有回调函数(0否 1是) + */ + private Integer hadCallback; + + /** + * 结果(对象json字符串) + */ + private String sendResultParam; + + /** + * 备注 + */ + private String remark; + + /** + * 创建人 + */ + private String createBy; + + /** + * 创建时间 + */ + private Date createTime; + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SysSmsLogDO.java b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SysSmsSendLogDO.java similarity index 66% rename from src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SysSmsLogDO.java rename to src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SysSmsSendLogDO.java index 97ec6c02e..f85416dba 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SysSmsLogDO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SysSmsSendLogDO.java @@ -1,5 +1,6 @@ package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms; +import cn.iocoder.dashboard.modules.system.enums.sms.SmsSendStatusEnum; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import lombok.EqualsAndHashCode; @@ -17,8 +18,8 @@ import java.util.Date; @Data @EqualsAndHashCode @Accessors(chain = true) -@TableName(value = "sms_log", autoResultMap = true) -public class SysSmsLogDO implements Serializable { +@TableName(value = "sms_send_log", autoResultMap = true) +public class SysSmsSendLogDO implements Serializable { /** * 自增编号 @@ -41,14 +42,9 @@ public class SysSmsLogDO implements Serializable { private String templateCode; /** - * 手机号(数组json字符串) + * 手机号 */ - private String phones; - - /** - * 内容 - */ - private String content; + private String phone; /** * 备注 @@ -56,18 +52,15 @@ public class SysSmsLogDO implements Serializable { private String remark; /** - * 发送状态(1异步推送中 2发送中 3失败 4成功) + * 发送状态 + * + * @see SmsSendStatusEnum */ private Integer sendStatus; /** - * 创建者 + * 发送时间 */ - private String createBy; - - /** - * 创建时间 - */ - private Date createTime; + private Date sendTime; } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/enums/sms/SmsSendStatusEnum.java b/src/main/java/cn/iocoder/dashboard/modules/system/enums/sms/SmsSendStatusEnum.java index 846c70967..4e4121083 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/enums/sms/SmsSendStatusEnum.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/enums/sms/SmsSendStatusEnum.java @@ -13,20 +13,26 @@ import lombok.Getter; @AllArgsConstructor public enum SmsSendStatusEnum { + //请求发送结果时失败 + QUERY_SEND_FAIL(-3), + + //短信发送失败 + SEND_FAIL(-2), + + //短信请求失败 + QUERY_FAIL(-1), + //异步转发中 - ASYNC(1), + ASYNC(0), - //发送中 - SENDING(2), + //请求成功 + QUERY_SUCCESS(1), - //失败 - FAIL(3), + //短信成功 + SEND_SUCCESS(2), //等待回执 - WAITING(4), - - //成功 - SUCCESS(5); + WAITING(3); private final int status; diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/sms/SmsSendConsumer.java b/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/sms/SmsSendConsumer.java index f5f9109e2..f962bf372 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/sms/SmsSendConsumer.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/sms/SmsSendConsumer.java @@ -1,10 +1,12 @@ package cn.iocoder.dashboard.modules.system.mq.consumer.sms; import cn.iocoder.dashboard.framework.redis.core.pubsub.AbstractChannelMessageListener; +import cn.iocoder.dashboard.framework.sms.client.AbstractSmsClient; import cn.iocoder.dashboard.framework.sms.core.SmsResult; import cn.iocoder.dashboard.modules.system.mq.message.dept.SysDeptRefreshMessage; import cn.iocoder.dashboard.modules.system.mq.message.sms.SmsSendMessage; -import cn.iocoder.dashboard.modules.system.service.sms.SysSmsService; +import cn.iocoder.dashboard.modules.system.service.sms.SysSmsChannelService; +import cn.iocoder.dashboard.modules.system.service.sms.SysSmsQueryLogService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -20,12 +22,20 @@ import javax.annotation.Resource; public class SmsSendConsumer extends AbstractChannelMessageListener { @Resource - private SysSmsService sysSmsService; + private SysSmsChannelService smsChannelService; + + @Resource + private SysSmsQueryLogService smsQueryLogService; @Override public void onMessage(SmsSendMessage message) { - log.info("[onMessage][收到 发送短信 消息], content: " + message.toString()); - SmsResult send = sysSmsService.send(message.getSmsBody(), message.getTargetPhones()); + log.info("[onMessage][收到 发送短信 消息], content: " + message.toString()); + AbstractSmsClient smsClient = smsChannelService.getSmsClient(message.getSmsBody().getTemplateCode()); + String templateApiId = smsChannelService.getSmsTemplateApiIdByCode(message.getSmsBody().getTemplateCode()); + + SmsResult result = smsClient.send(templateApiId, message.getSmsBody(), message.getTargetPhones()); + + smsQueryLogService.afterSendLog(message.getSmsBody().getSmsLogId(), result); } } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsLogService.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsQueryLogService.java similarity index 84% rename from src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsLogService.java rename to src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsQueryLogService.java index 431737912..7312e2355 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsLogService.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsQueryLogService.java @@ -7,26 +7,25 @@ import cn.iocoder.dashboard.framework.sms.core.SmsResult; import java.util.List; /** - * 短信渠道Service接口 + * 短信请求日志服务接口 * * @author zzf * @date 2021/1/25 9:24 */ -public interface SysSmsLogService { +public interface SysSmsQueryLogService { /** * 发送短信前的日志处理 * * @param smsBody 短信内容 * @param targetPhones 发送对象手机号集合 * @param client 短信客户端 - * @param isAsync 是否异步发送 * @return 生成的日志id */ // TODO FROM 芋艿 to ZZF: async 是针对发送的方式,对于日志不一定需要关心。这样,短信日志,实际就发送前插入,发送后更新结果. // 这里只用于记录状态,毕竟异步可能推送失败,此时日志可记录该状态。 // TODO FROM 芋艿 to ZZF:短信日志,群发的情况,应该是每个手机一条哈。虽然是群发,但是可能部分成功,部分失败;对应到短信平台,实际也是多条。 - Long beforeSendLog(SmsBody smsBody, List targetPhones, AbstractSmsClient client, Boolean isAsync); + void beforeSendLog(SmsBody smsBody, List targetPhones, AbstractSmsClient client); /** * 发送消息后的日志处理 diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsSendLogService.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsSendLogService.java new file mode 100644 index 000000000..fe6f5e973 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsSendLogService.java @@ -0,0 +1,13 @@ +package cn.iocoder.dashboard.modules.system.service.sms; + +/** + * 短信发送日志服务接口 + * + * @author zzf + * @date 13:48 2021/3/2 + */ +public interface SysSmsSendLogService { + + void getAndSaveSmsSendLog(); + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsService.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsService.java index 5b403cb5e..6d851d4f6 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsService.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsService.java @@ -1,15 +1,15 @@ package cn.iocoder.dashboard.modules.system.service.sms; import cn.iocoder.dashboard.framework.sms.core.SmsBody; -import cn.iocoder.dashboard.framework.sms.core.SmsResult; -import org.apache.commons.lang3.StringUtils; +import javax.servlet.ServletRequest; import java.util.Arrays; import java.util.Collections; import java.util.List; /** * 短信Service接口 + * 只支持异步,因此没有返回值 * * @author zzf * @date 2021/1/25 9:24 @@ -21,23 +21,17 @@ public interface SysSmsService { * * @param smsBody 消息内容 * @param targetPhones 发送对象手机号列表 - * @return 是否发送成功 */ - SmsResult send(SmsBody smsBody, List targetPhones); + void send(SmsBody smsBody, List targetPhones); /** * 发送消息 * * @param smsBody 消息内容 * @param targetPhone 发送对象手机号 - * @return 是否发送成功 */ - default SmsResult send(SmsBody smsBody, String targetPhone) { - if (StringUtils.isBlank(targetPhone)) { - return failResult("targetPhone must not null."); - } - - return send(smsBody, Collections.singletonList(targetPhone)); + default void send(SmsBody smsBody, String targetPhone) { + send(smsBody, Collections.singletonList(targetPhone)); } /** @@ -45,57 +39,16 @@ public interface SysSmsService { * * @param smsBody 消息内容 * @param targetPhones 发送对象手机号数组 - * @return 是否发送成功 */ - default SmsResult send(SmsBody smsBody, String... targetPhones) { - if (targetPhones == null) { - return failResult("targetPhones must not null."); - } - - return send(smsBody, Arrays.asList(targetPhones)); - } - - - /** - * 异步发送消息 - * - * @param msgBody 消息内容 - * @param targetPhones 发送对象列表 - */ - void sendAsync(SmsBody msgBody, List targetPhones); - - /** - * 异步发送消息 - * - * @param msgBody 消息内容 - * @param targetPhone 发送对象 - */ - default void sendAsync(SmsBody msgBody, String targetPhone) { - if (StringUtils.isBlank(targetPhone)) { - return; - } - sendAsync(msgBody, Collections.singletonList(targetPhone)); + default void send(SmsBody smsBody, String... targetPhones) { + send(smsBody, Arrays.asList(targetPhones)); } /** - * 异步发送消息 + * 处理短信发送回调函数 * - * @param msgBody 消息内容 - * @param targetPhones 发送对象列表 + * @param request 请求 + * @return 响应数据 */ - default void sendAsync(SmsBody msgBody, String... targetPhones) { - if (targetPhones == null) { - return; - } - sendAsync(msgBody, Arrays.asList(targetPhones)); - } - - - default SmsResult failResult(String message) { - SmsResult resultBody = new SmsResult(); - resultBody.setSuccess(false); - resultBody.setMessage(message); - return resultBody; - } - + Object smsSendCallbackHandle(ServletRequest request); } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsLogServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsLogServiceImpl.java deleted file mode 100644 index a89f80ff7..000000000 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsLogServiceImpl.java +++ /dev/null @@ -1,77 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.sms.impl; - -import cn.iocoder.dashboard.framework.sms.client.AbstractSmsClient; -import cn.iocoder.dashboard.framework.sms.core.SmsBody; -import cn.iocoder.dashboard.framework.sms.core.SmsResult; -import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperty; -import cn.iocoder.dashboard.modules.system.dal.mysql.dao.sms.SysSmsLogMapper; -import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SysSmsLogDO; -import cn.iocoder.dashboard.modules.system.enums.sms.SmsSendStatusEnum; -import cn.iocoder.dashboard.modules.system.service.sms.SysSmsLogService; -import cn.iocoder.dashboard.util.json.JsonUtils; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.List; - -/** - * 短信日志Service实现类 - * - * @author zzf - * @date 2021/1/25 9:25 - */ -@Service -public class SysSmsLogServiceImpl implements SysSmsLogService { - - @Resource - private SysSmsLogMapper logMapper; - - @Override - public Long beforeSendLog(SmsBody smsBody, List targetPhones, AbstractSmsClient client, Boolean isAsync) { - SysSmsLogDO smsLog = new SysSmsLogDO(); - if (smsBody.getSmsLogId() != null) { - smsLog.setId(smsBody.getSmsLogId()); - smsLog.setSendStatus(SmsSendStatusEnum.SENDING.getStatus()); - logMapper.updateById(smsLog); - return smsBody.getSmsLogId(); - } else { - SmsChannelProperty property = client.getProperty(); - - smsLog.setChannelCode(property.getCode()) - .setChannelId(property.getId()) - .setTemplateCode(smsBody.getTemplateCode()) - .setPhones(JsonUtils.toJsonString(targetPhones)) - .setContent(smsBody.getParams().toString()); - - if (isAsync) { - smsLog.setSendStatus(SmsSendStatusEnum.ASYNC.getStatus()); - } else { - smsLog.setSendStatus(SmsSendStatusEnum.SENDING.getStatus()); - } - logMapper.insert(smsLog); - return smsLog.getId(); - } - } - - @Override - public void afterSendLog(Long logId, SmsResult result) { - SysSmsLogDO smsLog = new SysSmsLogDO(); - smsLog.setId(logId); - if (result.getSuccess()) { - smsLog.setSendStatus(SmsSendStatusEnum.SUCCESS.getStatus()); - SysSmsLogDO smsLogDO = logMapper.selectById(logId); - result.getResult().forEach(s -> { - smsLogDO.setPhones(s.getPhone()); - smsLogDO.setSendStatus(s.getStatus()); - smsLogDO.setRemark(s.getMessage()); - smsLogDO.setCreateTime(s.getCreateTime()); - logMapper.insert(smsLogDO); - }); - } else { - smsLog.setSendStatus(SmsSendStatusEnum.FAIL.getStatus()); - smsLog.setRemark(result.getMessage() + JsonUtils.toJsonString(result.getResult())); - } - logMapper.updateById(smsLog); - } - -} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsQueryLogServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsQueryLogServiceImpl.java new file mode 100644 index 000000000..7264f550c --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsQueryLogServiceImpl.java @@ -0,0 +1,59 @@ +package cn.iocoder.dashboard.modules.system.service.sms.impl; + +import cn.iocoder.dashboard.framework.sms.client.AbstractSmsClient; +import cn.iocoder.dashboard.framework.sms.core.SmsBody; +import cn.iocoder.dashboard.framework.sms.core.SmsResult; +import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperty; +import cn.iocoder.dashboard.modules.system.dal.mysql.dao.sms.SysSmsQueryLogMapper; +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SysSmsQueryLogDO; +import cn.iocoder.dashboard.modules.system.enums.sms.SmsSendStatusEnum; +import cn.iocoder.dashboard.modules.system.service.sms.SysSmsQueryLogService; +import cn.iocoder.dashboard.util.json.JsonUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 短信请求日志服务实现类 + * + * @author zzf + * @date 13:50 2021/3/2 + */ +@Service +public class SysSmsQueryLogServiceImpl implements SysSmsQueryLogService { + + @Resource + private SysSmsQueryLogMapper logMapper; + + @Override + public void beforeSendLog(SmsBody smsBody, List targetPhones, AbstractSmsClient client) { + SysSmsQueryLogDO smsLog = new SysSmsQueryLogDO(); + SmsChannelProperty property = client.getProperty(); + + smsLog.setChannelCode(property.getCode()) + .setChannelId(property.getId()) + .setTemplateCode(smsBody.getTemplateCode()) + .setPhones(targetPhones) + .setContent(smsBody.getParams().toString()); + + smsLog.setSendStatus(SmsSendStatusEnum.ASYNC.getStatus()); + logMapper.insert(smsLog); + smsBody.setSmsLogId(smsLog.getId()); + } + + @Override + public void afterSendLog(Long logId, SmsResult result) { + SysSmsQueryLogDO smsLog = new SysSmsQueryLogDO(); + smsLog.setId(logId); + if (result.getSuccess()) { + smsLog.setSendStatus(SmsSendStatusEnum.QUERY_SUCCESS.getStatus()); + smsLog.setSendResultParam(result.getSendResultParam()); + } else { + smsLog.setSendStatus(SmsSendStatusEnum.QUERY_FAIL.getStatus()); + smsLog.setRemark(result.getMessage()); + } + logMapper.updateById(smsLog); + } + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsSendLogServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsSendLogServiceImpl.java new file mode 100644 index 000000000..03ef5575d --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsSendLogServiceImpl.java @@ -0,0 +1,109 @@ +package cn.iocoder.dashboard.modules.system.service.sms.impl; + +import cn.hutool.core.collection.CollectionUtil; +import cn.iocoder.dashboard.framework.sms.client.AbstractSmsClient; +import cn.iocoder.dashboard.framework.sms.client.NeedQuerySendResultSmsClient; +import cn.iocoder.dashboard.framework.sms.core.SmsResultDetail; +import cn.iocoder.dashboard.modules.system.dal.mysql.dao.sms.SysSmsQueryLogMapper; +import cn.iocoder.dashboard.modules.system.dal.mysql.dao.sms.SysSmsSendLogMapper; +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SysSmsQueryLogDO; +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SysSmsSendLogDO; +import cn.iocoder.dashboard.modules.system.enums.sms.SmsSendStatusEnum; +import cn.iocoder.dashboard.modules.system.service.sms.SysSmsChannelService; +import cn.iocoder.dashboard.modules.system.service.sms.SysSmsSendLogService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 短信发送日志服务实现类 + * + * @author zzf + * @date 2021/1/25 9:25 + */ +@Slf4j +@Service +public class SysSmsSendLogServiceImpl implements SysSmsSendLogService { + + @Resource + private SysSmsQueryLogMapper smsQueryLogMapper; + + @Resource + private SysSmsSendLogMapper smsSendLogMapper; + + @Resource + private SysSmsChannelService smsChannelService; + + /** + * 定时执行 {@link #getSmsSendResultJob()} 的周期 + */ + private static final long SCHEDULER_PERIOD = 5 * 60 * 1000L; + + + @Override + public void getAndSaveSmsSendLog() { + + List noResultQueryLogList = smsQueryLogMapper.selectNoResultQueryLogList(); + + if (CollectionUtil.isEmpty(noResultQueryLogList)) { + return; + } + //用于添加的发送日志对象 + SysSmsSendLogDO insertSendLog = new SysSmsSendLogDO(); + //用于修改状态的请求日志对象 + SysSmsQueryLogDO updateQueryLog = new SysSmsQueryLogDO(); + + noResultQueryLogList.forEach(queryLog -> { + AbstractSmsClient smsClient = smsChannelService.getSmsClient(queryLog.getTemplateCode()); + + updateQueryLog.setId(queryLog.getId()); + + // 只处理实现了获取发送结果方法的短信客户端,理论上这里都是满足条件的,以防万一加个判断。 + if (smsClient instanceof NeedQuerySendResultSmsClient) { + //初始化点字段值 + queryLog2SendLong(insertSendLog, queryLog); + + NeedQuerySendResultSmsClient querySendResultSmsClient = (NeedQuerySendResultSmsClient) smsClient; + try { + List smsSendResult = querySendResultSmsClient.getSmsSendResult(queryLog.getRemark()); + smsSendResult.forEach(resultDetail -> { + insertSendLog.setPhone(resultDetail.getPhone()); + insertSendLog.setSendStatus(resultDetail.getSendStatus()); + insertSendLog.setSendTime(resultDetail.getSendTime()); + insertSendLog.setRemark(resultDetail.getMessage()); + smsSendLogMapper.insert(insertSendLog); + }); + } catch (Exception e) { + //exception handle + log.error("query send result fail, exception: " + e.getMessage()); + + updateQueryLog.setSendStatus(SmsSendStatusEnum.QUERY_SEND_FAIL.getStatus()); + updateQueryLog.setRemark(e.getMessage()); + smsQueryLogMapper.updateById(updateQueryLog); + return; + } + } else { + //理论上这里都是满足条件的,以防万一加个判断。 + updateQueryLog.setSendStatus(SmsSendStatusEnum.QUERY_SEND_FAIL.getStatus()); + smsQueryLogMapper.updateById(updateQueryLog); + } + updateQueryLog.setSendStatus(SmsSendStatusEnum.SEND_SUCCESS.getStatus()); + updateQueryLog.setRemark(String.format("日志(id = %s)对应的客户端没有继承NeedQuerySendResultSmsClient, 不能获取短信结果。", queryLog.getId())); + smsQueryLogMapper.updateById(updateQueryLog); + }); + } + + private void queryLog2SendLong(SysSmsSendLogDO insertSendLog, SysSmsQueryLogDO queryLog) { + insertSendLog.setChannelCode(queryLog.getChannelCode()); + insertSendLog.setChannelId(queryLog.getChannelId()); + insertSendLog.setTemplateCode(queryLog.getTemplateCode()); + } + + @Scheduled(fixedDelay = SCHEDULER_PERIOD, initialDelay = SCHEDULER_PERIOD) + public void getSmsSendResultJob() { + getAndSaveSmsSendLog(); + } +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsServiceImpl.java index eb4019fee..81371e575 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsServiceImpl.java @@ -2,11 +2,11 @@ package cn.iocoder.dashboard.modules.system.service.sms.impl; import cn.iocoder.dashboard.framework.sms.client.AbstractSmsClient; import cn.iocoder.dashboard.framework.sms.core.SmsBody; -import cn.iocoder.dashboard.framework.sms.core.SmsResult; import cn.iocoder.dashboard.modules.system.mq.producer.sms.SmsProducer; import cn.iocoder.dashboard.modules.system.service.sms.SysSmsChannelService; -import cn.iocoder.dashboard.modules.system.service.sms.SysSmsLogService; +import cn.iocoder.dashboard.modules.system.service.sms.SysSmsQueryLogService; import cn.iocoder.dashboard.modules.system.service.sms.SysSmsService; +import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -25,30 +25,18 @@ public class SysSmsServiceImpl implements SysSmsService { private SysSmsChannelService channelService; @Resource - private SysSmsLogService logService; + private SysSmsQueryLogService logService; @Resource private SmsProducer smsProducer; @Override - public SmsResult send(SmsBody smsBody, List targetPhones) { + public void send(SmsBody smsBody, List targetPhones) { AbstractSmsClient client = channelService.getSmsClient(smsBody.getTemplateCode()); - String templateApiId = channelService.getSmsTemplateApiIdByCode(smsBody.getTemplateCode()); - Long logId = logService.beforeSendLog(smsBody, targetPhones, client, false); - - SmsResult result = client.send(templateApiId, smsBody, targetPhones); - - logService.afterSendLog(logId, result); - - return result; - } - - // TODO FROM 芋艿 to ZZF:可能要讨论下,对于短信发送来说,貌似只提供异步发送即可。对于业务来说,一定不能依赖短信的发送结果。 - // 我的想法是1、很多短信,比如验证码,总还是需要知道是否发送成功的。2、别人可以不用,我们不能没有。3、实现挺简单的,个人觉得无需纠结。 - @Override - public void sendAsync(SmsBody smsBody, List targetPhones) { - AbstractSmsClient client = channelService.getSmsClient(smsBody.getTemplateCode()); - logService.beforeSendLog(smsBody, targetPhones, client, true); + logService.beforeSendLog(smsBody, targetPhones, client); smsProducer.sendSmsSendMessage(smsBody, targetPhones); } + + // TODO FROM 芋艿 to ZZF:可能要讨论下,对于短信发送来说,貌似只提供异步发送即可。对于业务来说,一定不能依赖短信的发送结果. + } diff --git a/src/main/java/cn/iocoder/dashboard/util/json/JsonUtils.java b/src/main/java/cn/iocoder/dashboard/util/json/JsonUtils.java index f6727459c..2a735e214 100644 --- a/src/main/java/cn/iocoder/dashboard/util/json/JsonUtils.java +++ b/src/main/java/cn/iocoder/dashboard/util/json/JsonUtils.java @@ -20,7 +20,7 @@ public class JsonUtils { /** * 初始化 objectMapper 属性 - * + *

* 通过这样的方式,使用 Spring 创建的 ObjectMapper Bean * * @param objectMapper ObjectMapper 对象 @@ -67,4 +67,12 @@ public class JsonUtils { } } + public static T parseByType(String text, TypeReference typeReference) { + try { + return objectMapper.readValue(text, typeReference); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } From 5a7e2f6327fe20229a9ec2ee3289a3c7df0c3adb Mon Sep 17 00:00:00 2001 From: niudehua <657563945@qq.com> Date: Tue, 9 Mar 2021 23:44:25 +0800 Subject: [PATCH 019/126] =?UTF-8?q?unit=5Fsystem=5Fdept=20service=20?= =?UTF-8?q?=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/handler/DefaultDBFieldHandler.java | 2 +- .../dept/vo/dept/SysDeptBaseVO.java | 2 +- .../dept/vo/post/SysPostBaseVO.java | 3 +- .../dict/vo/data/SysDictDataBaseVO.java | 2 +- .../permission/vo/menu/SysMenuBaseVO.java | 2 +- .../permission/vo/role/SysRoleBaseVO.java | 3 +- .../service/dept/SysDeptServiceTest.java | 274 ++++++++++++++++++ .../service/dept/SysPostServiceTest.java | 200 +++++++++++++ src/test/resources/sql/clean.sql | 1 + src/test/resources/sql/create_tables.sql | 17 ++ 10 files changed, 500 insertions(+), 6 deletions(-) create mode 100644 src/test/java/cn/iocoder/dashboard/modules/system/service/dept/SysDeptServiceTest.java create mode 100644 src/test/java/cn/iocoder/dashboard/modules/system/service/dept/SysPostServiceTest.java diff --git a/src/main/java/cn/iocoder/dashboard/framework/mybatis/core/handler/DefaultDBFieldHandler.java b/src/main/java/cn/iocoder/dashboard/framework/mybatis/core/handler/DefaultDBFieldHandler.java index 06a7a6b38..f87d14b1d 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/mybatis/core/handler/DefaultDBFieldHandler.java +++ b/src/main/java/cn/iocoder/dashboard/framework/mybatis/core/handler/DefaultDBFieldHandler.java @@ -57,7 +57,7 @@ public class DefaultDBFieldHandler implements MetaObjectHandler { } // 当前登录用户不为空,更新人为空,则当前登录用户为更新人 if (Objects.nonNull(loginUser) && Objects.isNull(modifier)) { - setFieldValByName("updater", loginUser.getId(), metaObject); + setFieldValByName("updater", loginUser.getId().toString(), metaObject); } } } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/dept/SysDeptBaseVO.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/dept/SysDeptBaseVO.java index 922c395fd..9c54c163f 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/dept/SysDeptBaseVO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/dept/SysDeptBaseVO.java @@ -25,7 +25,7 @@ public class SysDeptBaseVO { private Long parentId; @ApiModelProperty(value = "显示顺序不能为空", required = true, example = "1024") - @NotBlank(message = "显示顺序不能为空") + @NotNull(message = "显示顺序不能为空") private Integer sort; @ApiModelProperty(value = "负责人", example = "芋道") diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostBaseVO.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostBaseVO.java index 9a7943b0f..2b90c1024 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostBaseVO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostBaseVO.java @@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; /** @@ -24,7 +25,7 @@ public class SysPostBaseVO { private String code; @ApiModelProperty(value = "显示顺序不能为空", required = true, example = "1024") - @NotBlank(message = "显示顺序不能为空") + @NotNull(message = "显示顺序不能为空") private Integer sort; @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 SysCommonStatusEnum 枚举类") diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataBaseVO.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataBaseVO.java index 702eba0ef..b034d9540 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataBaseVO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataBaseVO.java @@ -15,7 +15,7 @@ import javax.validation.constraints.Size; public class SysDictDataBaseVO { @ApiModelProperty(value = "显示顺序不能为空", required = true, example = "1024") - @NotBlank(message = "显示顺序不能为空") + @NotNull(message = "显示顺序不能为空") private Integer sort; @ApiModelProperty(value = "字典标签", required = true, example = "芋道") diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/menu/SysMenuBaseVO.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/menu/SysMenuBaseVO.java index 5882f825c..c69cec51b 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/menu/SysMenuBaseVO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/menu/SysMenuBaseVO.java @@ -28,7 +28,7 @@ public class SysMenuBaseVO { private Integer type; @ApiModelProperty(value = "显示顺序不能为空", required = true, example = "1024") - @NotBlank(message = "显示顺序不能为空") + @NotNull(message = "显示顺序不能为空") private Integer sort; @ApiModelProperty(value = "父菜单 ID", required = true, example = "1024") diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleBaseVO.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleBaseVO.java index bf9a1b141..ade6991fc 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleBaseVO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleBaseVO.java @@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; /** @@ -24,7 +25,7 @@ public class SysRoleBaseVO { private String code; @ApiModelProperty(value = "显示顺序不能为空", required = true, example = "1024") - @NotBlank(message = "显示顺序不能为空") + @NotNull(message = "显示顺序不能为空") private Integer sort; @ApiModelProperty(value = "角色类型", required = true, example = "1", notes = "见 SysRoleTypeEnum 枚举") diff --git a/src/test/java/cn/iocoder/dashboard/modules/system/service/dept/SysDeptServiceTest.java b/src/test/java/cn/iocoder/dashboard/modules/system/service/dept/SysDeptServiceTest.java new file mode 100644 index 000000000..ca0165c0f --- /dev/null +++ b/src/test/java/cn/iocoder/dashboard/modules/system/service/dept/SysDeptServiceTest.java @@ -0,0 +1,274 @@ +package cn.iocoder.dashboard.modules.system.service.dept; + +import cn.iocoder.dashboard.BaseDbUnitTest; +import cn.iocoder.dashboard.common.enums.CommonStatusEnum; +import cn.iocoder.dashboard.modules.system.controller.dept.vo.dept.SysDeptCreateReqVO; +import cn.iocoder.dashboard.modules.system.controller.dept.vo.dept.SysDeptListReqVO; +import cn.iocoder.dashboard.modules.system.controller.dept.vo.dept.SysDeptUpdateReqVO; +import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.dashboard.modules.system.dal.mysql.dept.SysDeptMapper; +import cn.iocoder.dashboard.modules.system.enums.dept.DeptIdEnum; +import cn.iocoder.dashboard.modules.system.mq.producer.dept.SysDeptProducer; +import cn.iocoder.dashboard.modules.system.service.dept.impl.SysDeptServiceImpl; +import cn.iocoder.dashboard.util.collection.ArrayUtils; +import cn.iocoder.dashboard.util.object.ObjectUtils; +import com.google.common.collect.Multimap; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; + +import static cn.hutool.core.bean.BeanUtil.getFieldValue; +import static cn.hutool.core.util.RandomUtil.randomEle; +import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.dashboard.util.AssertUtils.assertServiceException; +import static cn.iocoder.dashboard.util.RandomUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +/** + * {@link SysDeptServiceImpl} 的单元测试类 + * + * @author niudehua + */ +@Import(SysDeptServiceImpl.class) +class SysDeptServiceTest extends BaseDbUnitTest { + + @Resource + private SysDeptServiceImpl deptService; + @Resource + private SysDeptMapper deptMapper; + @MockBean + private SysDeptProducer deptProducer; + + @Test + @SuppressWarnings("unchecked") + void testInitLocalCache() { + // mock 数据 + SysDeptDO deptDO1 = randomDeptDO(); + deptMapper.insert(deptDO1); + SysDeptDO deptDO2 = randomDeptDO(); + deptMapper.insert(deptDO2); + + // 调用 + deptService.initLocalCache(); + // 断言 deptCache 缓存 + Map deptCache = (Map) getFieldValue(deptService, "deptCache"); + assertEquals(2, deptCache.size()); + assertPojoEquals(deptDO1, deptCache.get(deptDO1.getId())); + assertPojoEquals(deptDO2, deptCache.get(deptDO2.getId())); + // 断言 parentDeptCache 缓存 + Multimap parentDeptCache = (Multimap) getFieldValue(deptService, "parentDeptCache"); + assertEquals(2, parentDeptCache.size()); + assertPojoEquals(deptDO1, parentDeptCache.get(deptDO1.getParentId())); + assertPojoEquals(deptDO2, parentDeptCache.get(deptDO2.getParentId())); + // 断言 maxUpdateTime 缓存 + Date maxUpdateTime = (Date) getFieldValue(deptService, "maxUpdateTime"); + assertEquals(ObjectUtils.max(deptDO1.getUpdateTime(), deptDO2.getUpdateTime()), maxUpdateTime); + + } + + @Test + void testListDepts() { + // mock 数据 + SysDeptDO dept = randomPojo(SysDeptDO.class, o -> { // 等会查询到 + o.setName("开发部"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + }); + deptMapper.insert(dept); + // 测试 name 不匹配 + deptMapper.insert(ObjectUtils.clone(dept, o -> o.setName("发"))); + // 测试 status 不匹配 + deptMapper.insert(ObjectUtils.clone(dept, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + // 准备参数 + SysDeptListReqVO reqVO = new SysDeptListReqVO(); + reqVO.setName("开"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + // 调用 + List sysDeptDOS = deptService.listDepts(reqVO); + // 断言 + assertEquals(1, sysDeptDOS.size()); + assertPojoEquals(dept, sysDeptDOS.get(0)); + } + + @Test + void testCreateDept_success() { + // 准备参数 + SysDeptCreateReqVO reqVO = randomPojo(SysDeptCreateReqVO.class, + o -> { + o.setParentId(DeptIdEnum.ROOT.getId()); + o.setStatus(randomCommonStatus()); + }); + // 调用 + Long deptId = deptService.createDept(reqVO); + // 断言 + assertNotNull(deptId); + // 校验记录的属性是否正确 + SysDeptDO deptDO = deptMapper.selectById(deptId); + assertPojoEquals(reqVO, deptDO); + // 校验调用 + verify(deptProducer, times(1)).sendDeptRefreshMessage(); + } + + @Test + void testUpdateDept_success() { + // mock 数据 + SysDeptDO dbDeptDO = randomPojo(SysDeptDO.class, o -> o.setStatus(randomCommonStatus())); + deptMapper.insert(dbDeptDO);// @Sql: 先插入出一条存在的数据 + // 准备参数 + SysDeptUpdateReqVO reqVO = randomPojo(SysDeptUpdateReqVO.class, o -> { + // 设置更新的 ID + o.setParentId(DeptIdEnum.ROOT.getId()); + o.setId(dbDeptDO.getId()); + o.setStatus(randomCommonStatus()); + }); + // 调用 + deptService.updateDept(reqVO); + // 校验是否更新正确 + SysDeptDO deptDO = deptMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, deptDO); + } + + @Test + void testDeleteDept_success() { + // mock 数据 + SysDeptDO dbDeptDO = randomPojo(SysDeptDO.class, o -> o.setStatus(randomCommonStatus())); + deptMapper.insert(dbDeptDO);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbDeptDO.getId(); + // 调用 + deptService.deleteDept(id); + // 校验数据不存在了 + assertNull(deptMapper.selectById(id)); + } + + @Test + void testCheckDept_nameDuplicateForUpdate() { + // mock 数据 + SysDeptDO deptDO = randomDeptDO(); + // 设置根节点部门 + deptDO.setParentId(DeptIdEnum.ROOT.getId()); + deptMapper.insert(deptDO); + // mock 数据 稍后模拟重复它的 name + SysDeptDO nameDeptDO = randomDeptDO(); + // 设置根节点部门 + nameDeptDO.setParentId(DeptIdEnum.ROOT.getId()); + deptMapper.insert(nameDeptDO); + // 准备参数 + SysDeptUpdateReqVO reqVO = randomPojo(SysDeptUpdateReqVO.class, + o -> { + // 设置根节点部门 + o.setParentId(DeptIdEnum.ROOT.getId()); + // 设置更新的 ID + o.setId(deptDO.getId()); + // 模拟 name 重复 + o.setName(nameDeptDO.getName()); + }); + // 调用, 并断言异常 + assertServiceException(() -> deptService.updateDept(reqVO), DEPT_NAME_DUPLICATE); + + } + + @Test + void testCheckDept_parentNotExitsForCreate() { + SysDeptCreateReqVO reqVO = randomPojo(SysDeptCreateReqVO.class, + o -> o.setStatus(randomCommonStatus())); + // 调用,并断言异常 + assertServiceException(() -> deptService.createDept(reqVO), DEPT_PARENT_NOT_EXITS); + } + + @Test + void testCheckDept_notFoundForDelete() { + // 准备参数 + Long id = randomLongId(); + // 调用, 并断言异常 + assertServiceException(() -> deptService.deleteDept(id), DEPT_NOT_FOUND); + } + + @Test + void testCheckDept_exitsChildrenForDelete() { + // mock 数据 + SysDeptDO parentDept = randomPojo(SysDeptDO.class, o -> o.setStatus(randomCommonStatus())); + deptMapper.insert(parentDept);// @Sql: 先插入出一条存在的数据 + // 准备参数 + SysDeptDO childrenDeptDO = randomPojo(SysDeptDO.class, o -> { + o.setParentId(parentDept.getId()); + o.setStatus(randomCommonStatus()); + }); + // 插入子部门 + deptMapper.insert(childrenDeptDO); + // 调用, 并断言异常 + assertServiceException(() -> deptService.deleteDept(parentDept.getId()), DEPT_EXITS_CHILDREN); + } + + @Test + void testCheckDept_parentErrorForUpdate() { + // mock 数据 + SysDeptDO dbDeptDO = randomPojo(SysDeptDO.class, o -> o.setStatus(randomCommonStatus())); + deptMapper.insert(dbDeptDO); + // 准备参数 + SysDeptUpdateReqVO reqVO = randomPojo(SysDeptUpdateReqVO.class, + o -> { + // 设置自己为父部门 + o.setParentId(dbDeptDO.getId()); + // 设置更新的 ID + o.setId(dbDeptDO.getId()); + }); + // 调用, 并断言异常 + assertServiceException(() -> deptService.updateDept(reqVO), DEPT_PARENT_ERROR); + } + + @Test + void testCheckDept_notEnableForCreate() { + // mock 数据 + SysDeptDO deptDO = randomPojo(SysDeptDO.class, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus())); + deptMapper.insert(deptDO); + // 准备参数 + SysDeptCreateReqVO reqVO = randomPojo(SysDeptCreateReqVO.class, + o -> { + // 设置未启用的部门为副部门 + o.setParentId(deptDO.getId()); + }); + // 调用, 并断言异常 + assertServiceException(() -> deptService.createDept(reqVO), DEPT_NOT_ENABLE); + } + + @Test + void testCheckDept_parentIsChildForUpdate() { + // mock 数据 + SysDeptDO parentDept = randomPojo(SysDeptDO.class, o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus())); + deptMapper.insert(parentDept); + SysDeptDO childDept = randomPojo(SysDeptDO.class, o -> { + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setParentId(parentDept.getId()); + }); + deptMapper.insert(childDept); + // 初始化本地缓存 + deptService.initLocalCache(); + // 准备参数 + SysDeptUpdateReqVO reqVO = randomPojo(SysDeptUpdateReqVO.class, + o -> { + // 设置自己的子部门为父部门 + o.setParentId(childDept.getId()); + // 设置更新的 ID + o.setId(parentDept.getId()); + }); + // 调用, 并断言异常 + assertServiceException(() -> deptService.updateDept(reqVO), DEPT_PARENT_IS_CHILD); + } + + @SafeVarargs + private static SysDeptDO randomDeptDO(Consumer... consumers) { + Consumer consumer = (o) -> { + o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 + }; + return randomPojo(SysDeptDO.class, ArrayUtils.append(consumer, consumers)); + } +} diff --git a/src/test/java/cn/iocoder/dashboard/modules/system/service/dept/SysPostServiceTest.java b/src/test/java/cn/iocoder/dashboard/modules/system/service/dept/SysPostServiceTest.java new file mode 100644 index 000000000..bf3478989 --- /dev/null +++ b/src/test/java/cn/iocoder/dashboard/modules/system/service/dept/SysPostServiceTest.java @@ -0,0 +1,200 @@ +package cn.iocoder.dashboard.modules.system.service.dept; + +import cn.iocoder.dashboard.BaseDbUnitTest; +import cn.iocoder.dashboard.common.enums.CommonStatusEnum; +import cn.iocoder.dashboard.common.pojo.PageResult; +import cn.iocoder.dashboard.modules.system.controller.dept.vo.post.SysPostCreateReqVO; +import cn.iocoder.dashboard.modules.system.controller.dept.vo.post.SysPostExportReqVO; +import cn.iocoder.dashboard.modules.system.controller.dept.vo.post.SysPostPageReqVO; +import cn.iocoder.dashboard.modules.system.controller.dept.vo.post.SysPostUpdateReqVO; +import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysPostDO; +import cn.iocoder.dashboard.modules.system.dal.mysql.dept.SysPostMapper; +import cn.iocoder.dashboard.modules.system.service.dept.impl.SysPostServiceImpl; +import cn.iocoder.dashboard.util.collection.ArrayUtils; +import cn.iocoder.dashboard.util.object.ObjectUtils; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.List; +import java.util.function.Consumer; + +import static cn.hutool.core.util.RandomUtil.randomEle; +import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.dashboard.util.AssertUtils.assertServiceException; +import static cn.iocoder.dashboard.util.RandomUtils.randomLongId; +import static cn.iocoder.dashboard.util.RandomUtils.randomPojo; +import static org.junit.jupiter.api.Assertions.*; + +/** + * {@link SysPostServiceImpl} 的单元测试类 + * + * @author niudehua + */ +@Import(SysPostServiceImpl.class) +class SysPostServiceTest extends BaseDbUnitTest { + + @Resource + private SysPostServiceImpl postService; + @Resource + private SysPostMapper postMapper; + + @Test + void testPagePosts() { + // mock 数据 + SysPostDO postDO = randomPojo(SysPostDO.class, o -> { + o.setName("码仔"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + }); + postMapper.insert(postDO); + // 测试 name 不匹配 + postMapper.insert(ObjectUtils.clone(postDO, o -> o.setName("程序员"))); + // 测试 status 不匹配 + postMapper.insert(ObjectUtils.clone(postDO, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + + // 准备参数 + SysPostPageReqVO reqVO = new SysPostPageReqVO(); + reqVO.setName("码"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + + // 调用 + PageResult pageResult = postService.pagePosts(reqVO); + + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(postDO, pageResult.getList().get(0)); + } + + @Test + void testListPosts() { + // mock 数据 + SysPostDO postDO = randomPojo(SysPostDO.class, o -> { + o.setName("码仔"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + }); + postMapper.insert(postDO); + // 测试 name 不匹配 + postMapper.insert(ObjectUtils.clone(postDO, o -> o.setName("程序员"))); + // 测试 status 不匹配 + postMapper.insert(ObjectUtils.clone(postDO, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + // 准备参数 + SysPostExportReqVO reqVO = new SysPostExportReqVO(); + reqVO.setName("码"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + + // 调用 + List list = postService.listPosts(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(postDO, list.get(0)); + } + + @Test + void testGetPost() { + // mock 数据 + SysPostDO dbPostDO = randomPostDO(); + postMapper.insert(dbPostDO); + // 准备参数 + Long id = dbPostDO.getId(); + // 调用 + SysPostDO post = postService.getPost(id); + // 断言 + assertNotNull(post); + assertPojoEquals(dbPostDO, post); + } + + @Test + void testCreatePost_success() { + // 准备参数 + SysPostCreateReqVO reqVO = randomPojo(SysPostCreateReqVO.class, + o -> o.setStatus(randomEle(CommonStatusEnum.values()).getStatus())); + // 调用 + Long postId = postService.createPost(reqVO); + // 断言 + assertNotNull(postId); + // 校验记录的属性是否正确 + SysPostDO post = postMapper.selectById(postId); + assertPojoEquals(reqVO, post); + } + + @Test + void testUpdatePost_success() { + // mock 数据 + SysPostDO postDO = randomPostDO(); + postMapper.insert(postDO);// @Sql: 先插入出一条存在的数据 + // 准备参数 + SysPostUpdateReqVO reqVO = randomPojo(SysPostUpdateReqVO.class, + o -> { + // 设置更新的 ID + o.setId(postDO.getId()); + o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); + }); + // 调用 + postService.updatePost(reqVO); + // 校验是否更新正确 + SysPostDO post = postMapper.selectById(reqVO.getId());// 获取最新的 + assertPojoEquals(reqVO, post); + } + + @Test + void testDeletePost_success() { + // mock 数据 + SysPostDO postDO = randomPostDO(); + postMapper.insert(postDO); + // 准备参数 + Long id = postDO.getId(); + // 调用 + postService.deletePost(id); + assertNull(postMapper.selectById(id)); + } + + @Test + void testCheckPost_notFoundForDelete() { + // 准备参数 + Long id = randomLongId(); + // 调用, 并断言异常 + assertServiceException(() -> postService.deletePost(id), POST_NOT_FOUND); + } + + @Test + void testCheckPost_nameDuplicateForCreate() { + // mock 数据 + SysPostDO postDO = randomPostDO(); + postMapper.insert(postDO);// @Sql: 先插入出一条存在的数据 + // 准备参数 + SysPostCreateReqVO reqVO = randomPojo(SysPostCreateReqVO.class, + // 模拟 name 重复 + o -> o.setName(postDO.getName())); + assertServiceException(() -> postService.createPost(reqVO), POST_NAME_DUPLICATE); + } + + @Test + void testCheckPost_codeDuplicateForUpdate() { + // mock 数据 + SysPostDO postDO = randomPostDO(); + postMapper.insert(postDO); + // mock 数据 稍后模拟重复它的 code + SysPostDO codePostDO = randomPostDO(); + postMapper.insert(codePostDO); + // 准备参数 + SysPostUpdateReqVO reqVO = randomPojo(SysPostUpdateReqVO.class, + o -> { + // 设置更新的 ID + o.setId(postDO.getId()); + // 模拟 code 重复 + o.setCode(codePostDO.getCode()); + }); + // 调用, 并断言异常 + assertServiceException(() -> postService.updatePost(reqVO), POST_CODE_DUPLICATE); + } + + @SafeVarargs + private static SysPostDO randomPostDO(Consumer... consumers) { + Consumer consumer = (o) -> { + o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 + }; + return randomPojo(SysPostDO.class, ArrayUtils.append(consumer, consumers)); + } +} diff --git a/src/test/resources/sql/clean.sql b/src/test/resources/sql/clean.sql index 110625b54..af50ad635 100644 --- a/src/test/resources/sql/clean.sql +++ b/src/test/resources/sql/clean.sql @@ -9,3 +9,4 @@ DELETE FROM "sys_role_menu"; DELETE FROM "sys_menu"; DELETE FROM "sys_dict_type"; DELETE FROM "sys_user_session"; +DELETE FROM "sys_post"; diff --git a/src/test/resources/sql/create_tables.sql b/src/test/resources/sql/create_tables.sql index 8675ef978..4b1bc78c1 100644 --- a/src/test/resources/sql/create_tables.sql +++ b/src/test/resources/sql/create_tables.sql @@ -129,3 +129,20 @@ CREATE TABLE `sys_user_session` ( "deleted" bit NOT NULL DEFAULT FALSE, PRIMARY KEY (`id`) ) COMMENT '用户在线 Session'; + +CREATE TABLE IF NOT EXISTS "sys_post" +( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "code" varchar(64) NOT NULL, + "name" varchar(50) NOT NULL, + "sort" integer NOT NULL, + "status" tinyint NOT NULL, + "remark" varchar(500) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '岗位信息表'; + From ccba513f3bcfb4ec64029c810e2641f7795f4431 Mon Sep 17 00:00:00 2001 From: budliang Date: Wed, 10 Mar 2021 00:43:15 +0800 Subject: [PATCH 020/126] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=80=9A=E7=9F=A5?= =?UTF-8?q?=E5=85=AC=E5=91=8A=E6=A8=A1=E5=9D=97=E5=8D=95=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../notice/impl/SysNoticeServiceImpl.java | 4 +- .../notice/SysNoticeServiceImplTest.java | 99 ++++++++++++++----- src/test/resources/sql/create_tables.sql | 15 +++ 3 files changed, 94 insertions(+), 24 deletions(-) diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/notice/impl/SysNoticeServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/notice/impl/SysNoticeServiceImpl.java index 4f157269d..b2e083f78 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/notice/impl/SysNoticeServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/notice/impl/SysNoticeServiceImpl.java @@ -9,6 +9,7 @@ import cn.iocoder.dashboard.modules.system.convert.notice.SysNoticeConvert; import cn.iocoder.dashboard.modules.system.dal.mysql.notice.SysNoticeMapper; import cn.iocoder.dashboard.modules.system.dal.dataobject.notice.SysNoticeDO; import cn.iocoder.dashboard.modules.system.service.notice.SysNoticeService; +import com.google.common.annotations.VisibleForTesting; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -60,7 +61,8 @@ public class SysNoticeServiceImpl implements SysNoticeService { noticeMapper.deleteById(id); } - private void checkNoticeExists(Long id) { + @VisibleForTesting + public void checkNoticeExists(Long id) { if (id == null) { return; } diff --git a/src/test/java/cn/iocoder/dashboard/modules/system/service/notice/SysNoticeServiceImplTest.java b/src/test/java/cn/iocoder/dashboard/modules/system/service/notice/SysNoticeServiceImplTest.java index 065c07e37..801ecea8c 100644 --- a/src/test/java/cn/iocoder/dashboard/modules/system/service/notice/SysNoticeServiceImplTest.java +++ b/src/test/java/cn/iocoder/dashboard/modules/system/service/notice/SysNoticeServiceImplTest.java @@ -1,49 +1,85 @@ package cn.iocoder.dashboard.modules.system.service.notice; -import cn.iocoder.dashboard.BaseSpringBootUnitTest; +import cn.iocoder.dashboard.BaseDbUnitTest; import cn.iocoder.dashboard.common.enums.CommonStatusEnum; +import cn.iocoder.dashboard.common.pojo.PageResult; import cn.iocoder.dashboard.modules.system.controller.notice.vo.SysNoticeCreateReqVO; +import cn.iocoder.dashboard.modules.system.controller.notice.vo.SysNoticePageReqVO; import cn.iocoder.dashboard.modules.system.controller.notice.vo.SysNoticeUpdateReqVO; import cn.iocoder.dashboard.modules.system.dal.dataobject.notice.SysNoticeDO; import cn.iocoder.dashboard.modules.system.dal.mysql.notice.SysNoticeMapper; import cn.iocoder.dashboard.modules.system.enums.notice.SysNoticeTypeEnum; +import cn.iocoder.dashboard.modules.system.service.notice.impl.SysNoticeServiceImpl; +import cn.iocoder.dashboard.util.object.ObjectUtils; import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; import javax.annotation.Resource; import java.util.function.Consumer; import static cn.hutool.core.util.RandomUtil.randomEle; +import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.NOTICE_NOT_FOUND; import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.dashboard.util.AssertUtils.assertServiceException; +import static cn.iocoder.dashboard.util.RandomUtils.randomLongId; import static cn.iocoder.dashboard.util.RandomUtils.randomPojo; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.*; - -class SysNoticeServiceImplTest extends BaseSpringBootUnitTest { +@Import(SysNoticeServiceImpl.class) +class SysNoticeServiceImplTest extends BaseDbUnitTest { @Resource - private SysNoticeService sysNoticeService; + private SysNoticeServiceImpl sysNoticeService; @Resource private SysNoticeMapper sysNoticeMapper; @Test - void testPageNotices_success() { - // todo: 待更新 - } - - @Test - void testGetNotice_success() { + public void testPageNotices_success() { // 插入前置数据 - int noticeId = sysNoticeMapper.insert(randomSysNoticeDO()); + SysNoticeDO dbNotice = randomPojo(SysNoticeDO.class, o -> { + o.setTitle("尼古拉斯赵四来啦!"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setType(randomEle(SysNoticeTypeEnum.values()).getType()); + }); + sysNoticeMapper.insert(dbNotice); + + // 测试 title 不匹配 + sysNoticeMapper.insert(ObjectUtils.clone(dbNotice, o -> o.setTitle("尼古拉斯凯奇也来啦!"))); + // 测试 status 不匹配 + sysNoticeMapper.insert(ObjectUtils.clone(dbNotice, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + // 查询 - assertNotNull(sysNoticeService.getNotice(new Long(noticeId))); + SysNoticePageReqVO reqVO = new SysNoticePageReqVO(); + reqVO.setTitle("尼古拉斯赵四来啦!"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + PageResult pageResult = sysNoticeService.pageNotices(reqVO); + + // 验证查询结果经过筛选 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbNotice, pageResult.getList().get(0)); + } @Test - void testCreateNotice_success() { + public void testGetNotice_success() { + // 插入前置数据 + SysNoticeDO dbNotice = randomSysNoticeDO(); + sysNoticeMapper.insert(dbNotice); + + // 查询 + SysNoticeDO notice = sysNoticeService.getNotice(dbNotice.getId()); + + // 验证插入与读取对象是否一致 + assertNotNull(notice); + assertPojoEquals(dbNotice, notice); + } + + @Test + public void testCreateNotice_success() { // 准备参数 SysNoticeCreateReqVO reqVO = randomSysNoticeCreateReqVO(); @@ -57,31 +93,48 @@ class SysNoticeServiceImplTest extends BaseSpringBootUnitTest { } @Test - void testUpdateNotice_success() { + public void testUpdateNotice_success() { // 插入前置数据 - int noticeId = sysNoticeMapper.insert(randomSysNoticeDO()); + SysNoticeDO dbNoticeDO = randomSysNoticeDO(); + sysNoticeMapper.insert(dbNoticeDO); // 准备更新参数 - SysNoticeUpdateReqVO reqVO = randomSysNoticeUpdateReqVO(o -> o.setId(new Long(noticeId))); + SysNoticeUpdateReqVO reqVO = randomSysNoticeUpdateReqVO(o -> o.setId(dbNoticeDO.getId())); // 更新 sysNoticeService.updateNotice(reqVO); // 检验是否更新成功 - SysNoticeDO notice = sysNoticeMapper.selectById(noticeId); + SysNoticeDO notice = sysNoticeMapper.selectById(reqVO.getId()); assertPojoEquals(reqVO, notice); } @Test - void testDeleteNotice_success() { + public void testDeleteNotice_success() { // 插入前置数据 - int noticeId = sysNoticeMapper.insert(randomSysNoticeDO()); + SysNoticeDO dbNotice = randomSysNoticeDO(); + sysNoticeMapper.insert(dbNotice); // 删除 - sysNoticeService.deleteNotice(new Long(noticeId)); + sysNoticeService.deleteNotice(dbNotice.getId()); // 检查是否删除成功 - assertNull(sysNoticeMapper.selectById(noticeId)); + assertNull(sysNoticeMapper.selectById(dbNotice.getId())); + } + + @Test + public void checkNoticeExists_success() { + // 插入前置数据 + SysNoticeDO dbNotice = randomSysNoticeDO(); + sysNoticeMapper.insert(dbNotice); + + // 成功调用 + sysNoticeService.checkNoticeExists(dbNotice.getId()); + } + + @Test + public void checkNoticeExists_noExists() { + assertServiceException(() -> sysNoticeService.checkNoticeExists(randomLongId()), NOTICE_NOT_FOUND); } @SafeVarargs diff --git a/src/test/resources/sql/create_tables.sql b/src/test/resources/sql/create_tables.sql index 8675ef978..2bfced6ff 100644 --- a/src/test/resources/sql/create_tables.sql +++ b/src/test/resources/sql/create_tables.sql @@ -129,3 +129,18 @@ CREATE TABLE `sys_user_session` ( "deleted" bit NOT NULL DEFAULT FALSE, PRIMARY KEY (`id`) ) COMMENT '用户在线 Session'; + +CREATE TABLE IF NOT EXISTS "sys_notice" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "title" varchar(50) NOT NULL COMMENT '公告标题', + "content" text NOT NULL COMMENT '公告内容', + "notice_type" tinyint NOT NULL COMMENT '公告类型(1通知 2公告)', + "status" tinyint NOT NULL DEFAULT '0' COMMENT '公告状态(0正常 1关闭)', + "creator" varchar(64) DEFAULT '' COMMENT '创建者', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + "updater" varchar(64) DEFAULT '' COMMENT '更新者', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + "deleted" bit NOT NULL DEFAULT 0 COMMENT '是否删除', + PRIMARY KEY("id") +) COMMENT '通知公告表'; + From 0e28ab169c31cc79572832d6366cb5ea414e9197 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Wed, 10 Mar 2021 01:23:34 +0800 Subject: [PATCH 021/126] =?UTF-8?q?1.=20=E4=BC=98=E5=8C=96=20config=20?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-ui/src/views/infra/config/index.vue | 48 ++--- .../config/InfConfigController.java | 9 +- .../dal/mysql/config/InfConfigMapper.java | 19 +- .../service/config/InfConfigService.java | 44 ++--- .../config/impl/InfConfigServiceImpl.java | 42 ++--- .../service/config/InfConfigServiceTest.java | 164 +++++++++--------- 6 files changed, 150 insertions(+), 176 deletions(-) diff --git a/ruoyi-ui/src/views/infra/config/index.vue b/ruoyi-ui/src/views/infra/config/index.vue index 592a40f6b..6b880d24c 100644 --- a/ruoyi-ui/src/views/infra/config/index.vue +++ b/ruoyi-ui/src/views/infra/config/index.vue @@ -2,24 +2,12 @@

- + - + @@ -56,7 +44,7 @@ icon="el-icon-plus" size="mini" @click="handleAdd" - v-hasPermi="['infra:config:add']" + v-hasPermi="['infra:config:create']" >新增 @@ -95,31 +83,15 @@ - + diff --git a/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/InfConfigController.java b/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/InfConfigController.java index 7731d3b9a..a0a9ec62f 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/InfConfigController.java +++ b/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/InfConfigController.java @@ -3,7 +3,6 @@ package cn.iocoder.dashboard.modules.infra.controller.config; import cn.iocoder.dashboard.common.pojo.CommonResult; import cn.iocoder.dashboard.common.pojo.PageResult; import cn.iocoder.dashboard.framework.excel.core.util.ExcelUtils; -import cn.iocoder.dashboard.framework.idempotent.core.annotation.Idempotent; import cn.iocoder.dashboard.framework.logger.operatelog.core.annotations.OperateLog; import cn.iocoder.dashboard.modules.infra.controller.config.vo.*; import cn.iocoder.dashboard.modules.infra.convert.config.InfConfigConvert; @@ -19,7 +18,6 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; - import java.io.IOException; import java.util.List; @@ -44,18 +42,17 @@ public class InfConfigController { return success(configService.createConfig(reqVO)); } - @ApiOperation("修改参数配置") @PutMapping("/update") + @ApiOperation("修改参数配置") @PreAuthorize("@ss.hasPermission('infra:config:update')") - @Idempotent(timeout = 60) public CommonResult updateConfig(@Valid @RequestBody InfConfigUpdateReqVO reqVO) { configService.updateConfig(reqVO); return success(true); } + @DeleteMapping("/delete") @ApiOperation("删除参数配置") @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) - @DeleteMapping("/delete") @PreAuthorize("@ss.hasPermission('infra:config:delete')") public CommonResult deleteConfig(@RequestParam("id") Long id) { configService.deleteConfig(id); @@ -70,9 +67,9 @@ public class InfConfigController { return success(InfConfigConvert.INSTANCE.convert(configService.getConfig(id))); } + @GetMapping(value = "/get-value-by-key") @ApiOperation(value = "根据参数键名查询参数值", notes = "敏感配置,不允许返回给前端") @ApiImplicitParam(name = "key", value = "参数键", required = true, example = "yunai.biz.username", dataTypeClass = String.class) - @GetMapping(value = "/get-value-by-key") public CommonResult getConfigKey(@RequestParam("key") String key) { InfConfigDO config = configService.getConfigByKey(key); if (config == null) { diff --git a/src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/config/InfConfigMapper.java b/src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/config/InfConfigMapper.java index 6a984448d..9357f9cce 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/config/InfConfigMapper.java +++ b/src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/config/InfConfigMapper.java @@ -14,20 +14,21 @@ import java.util.List; @Mapper public interface InfConfigMapper extends BaseMapperX { - default PageResult selectPage(InfConfigPageReqVO reqVO) { - return selectPage(reqVO, - new QueryWrapperX().likeIfPresent("name", reqVO.getName()) - .likeIfPresent("`key`", reqVO.getKey()) - .eqIfPresent("`type`", reqVO.getType()) - .betweenIfPresent("create_time", reqVO.getBeginTime(), reqVO.getEndTime())); - } - default InfConfigDO selectByKey(String key) { return selectOne(new QueryWrapper().eq("`key`", key)); } + default PageResult selectPage(InfConfigPageReqVO reqVO) { + return selectPage(reqVO, new QueryWrapperX() + .likeIfPresent("name", reqVO.getName()) + .likeIfPresent("`key`", reqVO.getKey()) + .eqIfPresent("`type`", reqVO.getType()) + .betweenIfPresent("create_time", reqVO.getBeginTime(), reqVO.getEndTime())); + } + default List selectList(InfConfigExportReqVO reqVO) { - return selectList(new QueryWrapperX().likeIfPresent("name", reqVO.getName()) + return selectList(new QueryWrapperX() + .likeIfPresent("name", reqVO.getName()) .likeIfPresent("`key`", reqVO.getKey()) .eqIfPresent("`type`", reqVO.getType()) .betweenIfPresent("create_time", reqVO.getBeginTime(), reqVO.getEndTime())); diff --git a/src/main/java/cn/iocoder/dashboard/modules/infra/service/config/InfConfigService.java b/src/main/java/cn/iocoder/dashboard/modules/infra/service/config/InfConfigService.java index 9f768da4d..d7d120c19 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/infra/service/config/InfConfigService.java +++ b/src/main/java/cn/iocoder/dashboard/modules/infra/service/config/InfConfigService.java @@ -7,6 +7,7 @@ import cn.iocoder.dashboard.modules.infra.controller.config.vo.InfConfigPageReqV import cn.iocoder.dashboard.modules.infra.controller.config.vo.InfConfigUpdateReqVO; import cn.iocoder.dashboard.modules.infra.dal.dataobject.config.InfConfigDO; +import javax.validation.Valid; import java.util.List; /** @@ -17,20 +18,26 @@ import java.util.List; public interface InfConfigService { /** - * 获得参数配置分页列表 + * 创建参数配置 * - * @param reqVO 分页条件 - * @return 分页列表 + * @param reqVO 创建信息 + * @return 配置编号 */ - PageResult getConfigPage(InfConfigPageReqVO reqVO); + Long createConfig(@Valid InfConfigCreateReqVO reqVO); /** - * 获得参数配置列表 + * 更新参数配置 * - * @param reqVO 列表 - * @return 列表 + * @param reqVO 更新信息 */ - List getConfigList(InfConfigExportReqVO reqVO); + void updateConfig(@Valid InfConfigUpdateReqVO reqVO); + + /** + * 删除参数配置 + * + * @param id 配置编号 + */ + void deleteConfig(Long id); /** * 获得参数配置 @@ -49,25 +56,20 @@ public interface InfConfigService { InfConfigDO getConfigByKey(String key); /** - * 创建参数配置 + * 获得参数配置分页列表 * - * @param reqVO 创建信息 - * @return 配置编号 + * @param reqVO 分页条件 + * @return 分页列表 */ - Long createConfig(InfConfigCreateReqVO reqVO); + PageResult getConfigPage(@Valid InfConfigPageReqVO reqVO); /** - * 更新参数配置 + * 获得参数配置列表 * - * @param reqVO 更新信息 + * @param reqVO 列表 + * @return 列表 */ - void updateConfig(InfConfigUpdateReqVO reqVO); + List getConfigList(@Valid InfConfigExportReqVO reqVO); - /** - * 删除参数配置 - * - * @param id 配置编号 - */ - void deleteConfig(Long id); } diff --git a/src/main/java/cn/iocoder/dashboard/modules/infra/service/config/impl/InfConfigServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/infra/service/config/impl/InfConfigServiceImpl.java index 27e49771d..211ec52d2 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/infra/service/config/impl/InfConfigServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/infra/service/config/impl/InfConfigServiceImpl.java @@ -15,6 +15,7 @@ import cn.iocoder.dashboard.modules.infra.service.config.InfConfigService; import com.google.common.annotations.VisibleForTesting; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; @@ -27,6 +28,7 @@ import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.*; */ @Service @Slf4j +@Validated public class InfConfigServiceImpl implements InfConfigService { @Resource @@ -35,26 +37,6 @@ public class InfConfigServiceImpl implements InfConfigService { @Resource private InfConfigProducer configProducer; - @Override - public PageResult getConfigPage(InfConfigPageReqVO reqVO) { - return configMapper.selectPage(reqVO); - } - - @Override - public List getConfigList(InfConfigExportReqVO reqVO) { - return configMapper.selectList(reqVO); - } - - @Override - public InfConfigDO getConfig(Long id) { - return configMapper.selectById(id); - } - - @Override - public InfConfigDO getConfigByKey(String key) { - return configMapper.selectByKey(key); - } - @Override public Long createConfig(InfConfigCreateReqVO reqVO) { // 校验正确性 @@ -93,6 +75,26 @@ public class InfConfigServiceImpl implements InfConfigService { configProducer.sendConfigRefreshMessage(); } + @Override + public InfConfigDO getConfig(Long id) { + return configMapper.selectById(id); + } + + @Override + public InfConfigDO getConfigByKey(String key) { + return configMapper.selectByKey(key); + } + + @Override + public PageResult getConfigPage(InfConfigPageReqVO reqVO) { + return configMapper.selectPage(reqVO); + } + + @Override + public List getConfigList(InfConfigExportReqVO reqVO) { + return configMapper.selectList(reqVO); + } + private void checkCreateOrUpdate(Long id, String key) { // 校验自己存在 checkConfigExists(id); diff --git a/src/test/java/cn/iocoder/dashboard/modules/infra/service/config/InfConfigServiceTest.java b/src/test/java/cn/iocoder/dashboard/modules/infra/service/config/InfConfigServiceTest.java index a01330527..12bcce62e 100644 --- a/src/test/java/cn/iocoder/dashboard/modules/infra/service/config/InfConfigServiceTest.java +++ b/src/test/java/cn/iocoder/dashboard/modules/infra/service/config/InfConfigServiceTest.java @@ -47,88 +47,6 @@ public class InfConfigServiceTest extends BaseDbUnitTest { @MockBean private InfConfigProducer configProducer; - @Test - public void testGetConfigPage() { - // mock 数据 - InfConfigDO dbConfig = randomInfConfigDO(o -> { // 等会查询到 - o.setName("芋艿"); - o.setKey("yunai"); - o.setType(InfConfigTypeEnum.SYSTEM.getType()); - o.setCreateTime(buildTime(2021, 2, 1)); - }); - configMapper.insert(dbConfig); - // 测试 name 不匹配 - configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setName("土豆"))); - // 测试 key 不匹配 - configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setKey("tudou"))); - // 测试 type 不匹配 - configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setType(InfConfigTypeEnum.CUSTOM.getType()))); - // 测试 createTime 不匹配 - configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setCreateTime(buildTime(2021, 1, 1)))); - // 准备参数 - InfConfigPageReqVO reqVO = new InfConfigPageReqVO(); - reqVO.setName("艿"); - reqVO.setKey("nai"); - reqVO.setType(InfConfigTypeEnum.SYSTEM.getType()); - reqVO.setBeginTime(buildTime(2021, 1, 15)); - reqVO.setEndTime(buildTime(2021, 2, 15)); - - // 调用 - PageResult pageResult = configService.getConfigPage(reqVO); - // 断言 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(dbConfig, pageResult.getList().get(0)); - } - - @Test - public void testGetConfigList() { - // mock 数据 - InfConfigDO dbConfig = randomInfConfigDO(o -> { // 等会查询到 - o.setName("芋艿"); - o.setKey("yunai"); - o.setType(InfConfigTypeEnum.SYSTEM.getType()); - o.setCreateTime(buildTime(2021, 2, 1)); - }); - configMapper.insert(dbConfig); - // 测试 name 不匹配 - configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setName("土豆"))); - // 测试 key 不匹配 - configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setKey("tudou"))); - // 测试 type 不匹配 - configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setType(InfConfigTypeEnum.CUSTOM.getType()))); - // 测试 createTime 不匹配 - configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setCreateTime(buildTime(2021, 1, 1)))); - // 准备参数 - InfConfigExportReqVO reqVO = new InfConfigExportReqVO(); - reqVO.setName("艿"); - reqVO.setKey("nai"); - reqVO.setType(InfConfigTypeEnum.SYSTEM.getType()); - reqVO.setBeginTime(buildTime(2021, 1, 15)); - reqVO.setEndTime(buildTime(2021, 2, 15)); - - // 调用 - List list = configService.getConfigList(reqVO); - // 断言 - assertEquals(1, list.size()); - assertPojoEquals(dbConfig, list.get(0)); - } - - @Test - public void testGetConfigByKey() { - // mock 数据 - InfConfigDO dbConfig = randomInfConfigDO(); - configMapper.insert(dbConfig);// @Sql: 先插入出一条存在的数据 - // 准备参数 - String key = dbConfig.getKey(); - - // 调用 - InfConfigDO config = configService.getConfigByKey(key); - // 断言 - assertNotNull(config); - assertPojoEquals(dbConfig, config); - } - @Test public void testCreateConfig_success() { // 准备参数 @@ -243,6 +161,88 @@ public class InfConfigServiceTest extends BaseDbUnitTest { CONFIG_KEY_DUPLICATE); } + @Test + public void testGetConfigPage() { + // mock 数据 + InfConfigDO dbConfig = randomInfConfigDO(o -> { // 等会查询到 + o.setName("芋艿"); + o.setKey("yunai"); + o.setType(InfConfigTypeEnum.SYSTEM.getType()); + o.setCreateTime(buildTime(2021, 2, 1)); + }); + configMapper.insert(dbConfig); + // 测试 name 不匹配 + configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setName("土豆"))); + // 测试 key 不匹配 + configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setKey("tudou"))); + // 测试 type 不匹配 + configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setType(InfConfigTypeEnum.CUSTOM.getType()))); + // 测试 createTime 不匹配 + configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setCreateTime(buildTime(2021, 1, 1)))); + // 准备参数 + InfConfigPageReqVO reqVO = new InfConfigPageReqVO(); + reqVO.setName("艿"); + reqVO.setKey("nai"); + reqVO.setType(InfConfigTypeEnum.SYSTEM.getType()); + reqVO.setBeginTime(buildTime(2021, 1, 15)); + reqVO.setEndTime(buildTime(2021, 2, 15)); + + // 调用 + PageResult pageResult = configService.getConfigPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbConfig, pageResult.getList().get(0)); + } + + @Test + public void testGetConfigList() { + // mock 数据 + InfConfigDO dbConfig = randomInfConfigDO(o -> { // 等会查询到 + o.setName("芋艿"); + o.setKey("yunai"); + o.setType(InfConfigTypeEnum.SYSTEM.getType()); + o.setCreateTime(buildTime(2021, 2, 1)); + }); + configMapper.insert(dbConfig); + // 测试 name 不匹配 + configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setName("土豆"))); + // 测试 key 不匹配 + configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setKey("tudou"))); + // 测试 type 不匹配 + configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setType(InfConfigTypeEnum.CUSTOM.getType()))); + // 测试 createTime 不匹配 + configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setCreateTime(buildTime(2021, 1, 1)))); + // 准备参数 + InfConfigExportReqVO reqVO = new InfConfigExportReqVO(); + reqVO.setName("艿"); + reqVO.setKey("nai"); + reqVO.setType(InfConfigTypeEnum.SYSTEM.getType()); + reqVO.setBeginTime(buildTime(2021, 1, 15)); + reqVO.setEndTime(buildTime(2021, 2, 15)); + + // 调用 + List list = configService.getConfigList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbConfig, list.get(0)); + } + + @Test + public void testGetConfigByKey() { + // mock 数据 + InfConfigDO dbConfig = randomInfConfigDO(); + configMapper.insert(dbConfig);// @Sql: 先插入出一条存在的数据 + // 准备参数 + String key = dbConfig.getKey(); + + // 调用 + InfConfigDO config = configService.getConfigByKey(key); + // 断言 + assertNotNull(config); + assertPojoEquals(dbConfig, config); + } + // ========== 随机对象 ========== @SafeVarargs From 28d9ecee3be16d8772c71371061dee83ea9da1fa Mon Sep 17 00:00:00 2001 From: YunaiV Date: Wed, 10 Mar 2021 01:32:11 +0800 Subject: [PATCH 022/126] =?UTF-8?q?1.=20=E5=A4=84=E7=90=86=20Job=20?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E5=AF=BC=E5=87=BA=E7=9A=84=20excel=20?= =?UTF-8?q?=E5=90=8D=E5=AD=97=E9=94=99=E8=AF=AF=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sql/ruoyi-vue-pro.sql | 175 ++++++++++++++++-- .../controller/job/InfJobLogController.java | 2 +- 2 files changed, 161 insertions(+), 16 deletions(-) diff --git a/sql/ruoyi-vue-pro.sql b/sql/ruoyi-vue-pro.sql index 58d6d960e..9074a4aa7 100644 --- a/sql/ruoyi-vue-pro.sql +++ b/sql/ruoyi-vue-pro.sql @@ -11,7 +11,7 @@ Target Server Version : 50718 File Encoding : 65001 - Date: 09/03/2021 20:39:41 + Date: 10/03/2021 01:31:28 */ SET NAMES utf8mb4; @@ -43,12 +43,87 @@ CREATE TABLE `inf_api_access_log` ( `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='API 访问日志表'; +) ENGINE=InnoDB AUTO_INCREMENT=76 DEFAULT CHARSET=utf8mb4 COMMENT='API 访问日志表'; -- ---------------------------- -- Records of inf_api_access_log -- ---------------------------- BEGIN; +INSERT INTO `inf_api_access_log` VALUES (1, 'd8909966-2abb-43b1-998f-850779178463', 0, 2, 'dashboard', 'GET', '/api/get-permission-info', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:11:46', '2021-03-10 01:11:47', 127, 0, '', NULL, '2021-03-10 01:11:47', NULL, '2021-03-10 01:11:47', b'0'); +INSERT INTO `inf_api_access_log` VALUES (2, 'f40ee1af-4b8e-4351-ba77-c0ca41865d01', 0, 2, 'dashboard', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:11:46', '2021-03-10 01:11:47', 127, 0, '', NULL, '2021-03-10 01:11:47', NULL, '2021-03-10 01:11:47', b'0'); +INSERT INTO `inf_api_access_log` VALUES (3, '38657f93-449b-4c92-a412-d76c32c3ba74', 0, 2, 'dashboard', 'POST', '/api/logout', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:11:47', '2021-03-10 01:11:47', 3, 0, '', NULL, '2021-03-10 01:11:47', NULL, '2021-03-10 01:11:47', b'0'); +INSERT INTO `inf_api_access_log` VALUES (4, '24303cdb-dae9-4f09-b316-e9eb38023ddf', 0, 2, 'dashboard', 'POST', '/api/logout', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:11:48', '2021-03-10 01:11:48', 2, 0, '', NULL, '2021-03-10 01:11:48', NULL, '2021-03-10 01:11:48', b'0'); +INSERT INTO `inf_api_access_log` VALUES (5, 'fe324978-a665-4e25-8e16-ee78750de461', 0, 2, 'dashboard', 'GET', '/api/system/captcha/get-image', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:11:47', '2021-03-10 01:11:50', 2698, 0, '', NULL, '2021-03-10 01:11:50', NULL, '2021-03-10 01:11:50', b'0'); +INSERT INTO `inf_api_access_log` VALUES (6, '205b39bd-471c-4e0c-bbeb-f9ad836d47c7', 0, 2, 'dashboard', 'GET', '/api/system/captcha/get-image', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:11:49', '2021-03-10 01:11:50', 1157, 0, '', NULL, '2021-03-10 01:11:50', NULL, '2021-03-10 01:11:50', b'0'); +INSERT INTO `inf_api_access_log` VALUES (7, 'aff42e1b-73d9-431d-95b9-7a7d18595a5b', 0, 2, 'dashboard', 'POST', '/api/login', '{\"query\":{},\"body\":\"{\\\"username\\\":\\\"admin\\\",\\\"password\\\":\\\"admin123\\\",\\\"code\\\":\\\"1nfjj\\\",\\\"uuid\\\":\\\"8466085c41534a948632f82140e8d9e1\\\"}\"}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:11:53', '2021-03-10 01:11:53', 35, 1002000003, '验证码不存在', NULL, '2021-03-10 01:11:53', NULL, '2021-03-10 01:11:53', b'0'); +INSERT INTO `inf_api_access_log` VALUES (8, '25f0e932-cf92-4b95-b3fb-5a4896bd9241', 0, 2, 'dashboard', 'GET', '/api/system/captcha/get-image', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:11:53', '2021-03-10 01:11:53', 13, 0, '', NULL, '2021-03-10 01:11:53', NULL, '2021-03-10 01:11:53', b'0'); +INSERT INTO `inf_api_access_log` VALUES (9, 'ad750e4c-5310-4e42-9e41-0871033ca55d', 0, 2, 'dashboard', 'POST', '/api/login', '{\"query\":{},\"body\":\"{\\\"username\\\":\\\"admin\\\",\\\"password\\\":\\\"admin123\\\",\\\"code\\\":\\\"1nfjj\\\",\\\"uuid\\\":\\\"8466085c41534a948632f82140e8d9e1\\\"}\"}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:11:53', '2021-03-10 01:11:53', 273, 0, '', NULL, '2021-03-10 01:11:53', NULL, '2021-03-10 01:11:53', b'0'); +INSERT INTO `inf_api_access_log` VALUES (10, '0e1a7560-d447-4e95-935a-e3f6cf4a222d', 1, 2, 'dashboard', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:11:53', '2021-03-10 01:11:53', 31, 0, '', NULL, '2021-03-10 01:11:53', NULL, '2021-03-10 01:11:53', b'0'); +INSERT INTO `inf_api_access_log` VALUES (11, '0bf76082-8584-4725-ad8e-d23b44f1a886', 1, 2, 'dashboard', 'GET', '/api/get-permission-info', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:11:53', '2021-03-10 01:11:53', 34, 0, '', NULL, '2021-03-10 01:11:53', NULL, '2021-03-10 01:11:53', b'0'); +INSERT INTO `inf_api_access_log` VALUES (12, 'f9aed1f8-5a1d-4175-946a-e58e2772e4a3', 1, 2, 'dashboard', 'GET', '/api/list-menus', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:11:53', '2021-03-10 01:11:53', 12, 0, '', NULL, '2021-03-10 01:11:53', NULL, '2021-03-10 01:11:53', b'0'); +INSERT INTO `inf_api_access_log` VALUES (13, '2feeb4ff-e8a6-48a9-8370-9a1b8b1dea5e', 0, 2, 'dashboard', 'GET', '/api/system/file/get/add5ec1891a7d97d2cc1d60847e16294.jpg', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:11:54', '2021-03-10 01:11:54', 26, 0, '', NULL, '2021-03-10 01:11:54', NULL, '2021-03-10 01:11:54', b'0'); +INSERT INTO `inf_api_access_log` VALUES (14, '36b77d6f-30d3-483e-ad79-196975d8fe0b', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:12:02', '2021-03-10 01:12:02', 31, 0, '', NULL, '2021-03-10 01:12:02', NULL, '2021-03-10 01:12:02', b'0'); +INSERT INTO `inf_api_access_log` VALUES (15, 'e50a5433-90b7-4e8f-9d1a-59f15c1a4e0a', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:12:07', '2021-03-10 01:12:07', 16, 0, '', NULL, '2021-03-10 01:12:07', NULL, '2021-03-10 01:12:07', b'0'); +INSERT INTO `inf_api_access_log` VALUES (16, 'b1ef7809-57f1-4aad-99cb-f53d1c85ae8a', 1, 2, 'dashboard', 'GET', '/api/system/menu/get', '{\"query\":{\"id\":\"106\"},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:12:07', '2021-03-10 01:12:07', 11, 0, '', NULL, '2021-03-10 01:12:07', NULL, '2021-03-10 01:12:07', b'0'); +INSERT INTO `inf_api_access_log` VALUES (17, '18c41274-8fc2-4012-8d63-14fe72a0cc64', 1, 2, 'dashboard', 'POST', '/api/system/menu/update', '{\"query\":{},\"body\":\"{\\\"id\\\":106,\\\"status\\\":0,\\\"createTime\\\":1609837428000,\\\"name\\\":\\\"配置管理\\\",\\\"permission\\\":\\\"\\\",\\\"type\\\":2,\\\"sort\\\":1,\\\"parentId\\\":2,\\\"path\\\":\\\"config\\\",\\\"icon\\\":\\\"edit\\\",\\\"component\\\":\\\"infra/config/index\\\"}\"}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:12:09', '2021-03-10 01:12:10', 54, 0, '', NULL, '2021-03-10 01:12:10', NULL, '2021-03-10 01:12:10', b'0'); +INSERT INTO `inf_api_access_log` VALUES (18, '3ec30780-7d9e-40fd-b9e1-df0758530bc9', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:12:10', '2021-03-10 01:12:10', 15, 0, '', NULL, '2021-03-10 01:12:10', NULL, '2021-03-10 01:12:10', b'0'); +INSERT INTO `inf_api_access_log` VALUES (19, '3a0dd3e6-60e8-43cc-82aa-d63d332dcd74', 1, 2, 'dashboard', 'GET', '/api/system/menu/get', '{\"query\":{\"id\":\"1032\"},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:12:12', '2021-03-10 01:12:12', 7, 0, '', NULL, '2021-03-10 01:12:12', NULL, '2021-03-10 01:12:12', b'0'); +INSERT INTO `inf_api_access_log` VALUES (20, '3dc6e855-0aff-48f2-a236-a5255385de82', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:12:12', '2021-03-10 01:12:12', 15, 0, '', NULL, '2021-03-10 01:12:12', NULL, '2021-03-10 01:12:12', b'0'); +INSERT INTO `inf_api_access_log` VALUES (21, '0eab1e77-e039-4924-b6f5-cdcd73ad9897', 1, 2, 'dashboard', 'POST', '/api/system/menu/update', '{\"query\":{},\"body\":\"{\\\"id\\\":1032,\\\"status\\\":0,\\\"createTime\\\":1609837428000,\\\"name\\\":\\\"配置新增\\\",\\\"permission\\\":\\\"infra:config:create\\\",\\\"type\\\":3,\\\"sort\\\":2,\\\"parentId\\\":106,\\\"path\\\":\\\"\\\",\\\"icon\\\":\\\"\\\",\\\"component\\\":\\\"\\\"}\"}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:12:18', '2021-03-10 01:12:18', 18, 0, '', NULL, '2021-03-10 01:12:18', NULL, '2021-03-10 01:12:18', b'0'); +INSERT INTO `inf_api_access_log` VALUES (22, '5d309b5e-76be-4776-be3c-e961e3144269', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:12:18', '2021-03-10 01:12:18', 14, 0, '', NULL, '2021-03-10 01:12:18', NULL, '2021-03-10 01:12:18', b'0'); +INSERT INTO `inf_api_access_log` VALUES (23, '359ddde9-67d2-427c-8738-17fb0773f3ca', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:12:25', '2021-03-10 01:12:25', 13, 0, '', NULL, '2021-03-10 01:12:25', NULL, '2021-03-10 01:12:25', b'0'); +INSERT INTO `inf_api_access_log` VALUES (24, 'cab05ea8-98e4-4b81-a629-696e6c47c680', 1, 2, 'dashboard', 'GET', '/api/system/menu/get', '{\"query\":{\"id\":\"1033\"},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:12:25', '2021-03-10 01:12:25', 5, 0, '', NULL, '2021-03-10 01:12:25', NULL, '2021-03-10 01:12:25', b'0'); +INSERT INTO `inf_api_access_log` VALUES (25, '291cb66f-21d9-4798-a3c1-d3b0270d3850', 1, 2, 'dashboard', 'POST', '/api/system/menu/update', '{\"query\":{},\"body\":\"{\\\"id\\\":1033,\\\"status\\\":0,\\\"createTime\\\":1609837428000,\\\"name\\\":\\\"配置修改\\\",\\\"permission\\\":\\\"infra:config:update\\\",\\\"type\\\":3,\\\"sort\\\":3,\\\"parentId\\\":106,\\\"path\\\":\\\"\\\",\\\"icon\\\":\\\"\\\",\\\"component\\\":\\\"\\\"}\"}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:12:30', '2021-03-10 01:12:30', 19, 0, '', NULL, '2021-03-10 01:12:30', NULL, '2021-03-10 01:12:30', b'0'); +INSERT INTO `inf_api_access_log` VALUES (26, '5cf67e7f-8b32-4b17-96a6-325dfcba865f', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:12:30', '2021-03-10 01:12:30', 14, 0, '', NULL, '2021-03-10 01:12:30', NULL, '2021-03-10 01:12:30', b'0'); +INSERT INTO `inf_api_access_log` VALUES (27, '869bcc0c-2d7c-4a80-9fda-11b412162c0d', 1, 2, 'dashboard', 'GET', '/api/system/menu/get', '{\"query\":{\"id\":\"1034\"},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:12:31', '2021-03-10 01:12:31', 7, 0, '', NULL, '2021-03-10 01:12:31', NULL, '2021-03-10 01:12:31', b'0'); +INSERT INTO `inf_api_access_log` VALUES (28, '5c110575-2d45-4353-a653-50796f3ffc36', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:12:31', '2021-03-10 01:12:31', 14, 0, '', NULL, '2021-03-10 01:12:31', NULL, '2021-03-10 01:12:31', b'0'); +INSERT INTO `inf_api_access_log` VALUES (29, '4bd68903-d159-4728-aaa0-cfcc810bf65d', 1, 2, 'dashboard', 'POST', '/api/system/menu/update', '{\"query\":{},\"body\":\"{\\\"id\\\":1034,\\\"status\\\":0,\\\"createTime\\\":1609837428000,\\\"name\\\":\\\"配置删除\\\",\\\"permission\\\":\\\"infra:config:delete\\\",\\\"type\\\":3,\\\"sort\\\":4,\\\"parentId\\\":106,\\\"path\\\":\\\"\\\",\\\"icon\\\":\\\"\\\",\\\"component\\\":\\\"\\\"}\"}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:12:36', '2021-03-10 01:12:36', 18, 0, '', NULL, '2021-03-10 01:12:36', NULL, '2021-03-10 01:12:36', b'0'); +INSERT INTO `inf_api_access_log` VALUES (30, 'f42d28d1-1442-44f6-aaa9-b200307e0755', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:12:36', '2021-03-10 01:12:36', 13, 0, '', NULL, '2021-03-10 01:12:36', NULL, '2021-03-10 01:12:36', b'0'); +INSERT INTO `inf_api_access_log` VALUES (31, 'c2ad9fea-1e4f-4f19-8ad3-8ffac3a2ad6a', 1, 2, 'dashboard', 'GET', '/api/infra/config/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:12:40', '2021-03-10 01:12:40', 119, 0, '', NULL, '2021-03-10 01:12:40', NULL, '2021-03-10 01:12:40', b'0'); +INSERT INTO `inf_api_access_log` VALUES (32, 'a3ce04b6-103e-4567-9f3a-22a516957122', 1, 2, 'dashboard', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:25:41', '2021-03-10 01:25:41', 225, 0, '', NULL, '2021-03-10 01:25:41', NULL, '2021-03-10 01:25:41', b'0'); +INSERT INTO `inf_api_access_log` VALUES (33, '82f37563-862a-4f50-9e5b-1c15b3b672d5', 1, 2, 'dashboard', 'GET', '/api/get-permission-info', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:25:41', '2021-03-10 01:25:41', 225, 0, '', NULL, '2021-03-10 01:25:41', NULL, '2021-03-10 01:25:41', b'0'); +INSERT INTO `inf_api_access_log` VALUES (34, '8469ee76-cdf6-4cf2-ae6b-91573e06d0c9', 1, 2, 'dashboard', 'GET', '/api/list-menus', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:25:41', '2021-03-10 01:25:41', 16, 0, '', NULL, '2021-03-10 01:25:41', NULL, '2021-03-10 01:25:41', b'0'); +INSERT INTO `inf_api_access_log` VALUES (35, '27f7ffa8-7ce3-42d4-8e65-1a6996dde9d4', 0, 2, 'dashboard', 'GET', '/api/system/file/get/add5ec1891a7d97d2cc1d60847e16294.jpg', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:25:42', '2021-03-10 01:25:42', 28, 0, '', NULL, '2021-03-10 01:25:42', NULL, '2021-03-10 01:25:42', b'0'); +INSERT INTO `inf_api_access_log` VALUES (36, '23254cf0-c51f-4a52-8838-fc7ebbce3042', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:25:42', '2021-03-10 01:25:42', 47, 0, '', NULL, '2021-03-10 01:25:42', NULL, '2021-03-10 01:25:42', b'0'); +INSERT INTO `inf_api_access_log` VALUES (37, '215c6c13-12e7-442a-805f-3efc0bf646e4', 1, 2, 'dashboard', 'GET', '/api/system/menu/get', '{\"query\":{\"id\":\"110\"},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:25:49', '2021-03-10 01:25:49', 13, 0, '', NULL, '2021-03-10 01:25:49', NULL, '2021-03-10 01:25:49', b'0'); +INSERT INTO `inf_api_access_log` VALUES (38, '56ee2e75-5775-4a26-a9e7-972876ed891e', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:25:49', '2021-03-10 01:25:49', 20, 0, '', NULL, '2021-03-10 01:25:49', NULL, '2021-03-10 01:25:49', b'0'); +INSERT INTO `inf_api_access_log` VALUES (39, '680c28fa-764e-4de5-8dc0-909ab842eb43', 1, 2, 'dashboard', 'POST', '/api/system/menu/update', '{\"query\":{},\"body\":\"{\\\"id\\\":110,\\\"status\\\":0,\\\"createTime\\\":1609837428000,\\\"name\\\":\\\"定时任务\\\",\\\"permission\\\":\\\"\\\",\\\"type\\\":2,\\\"sort\\\":2,\\\"parentId\\\":2,\\\"path\\\":\\\"job\\\",\\\"icon\\\":\\\"job\\\",\\\"component\\\":\\\"infra/job/index\\\"}\"}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:25:51', '2021-03-10 01:25:51', 56, 0, '', NULL, '2021-03-10 01:25:51', NULL, '2021-03-10 01:25:51', b'0'); +INSERT INTO `inf_api_access_log` VALUES (40, '74a051a8-4150-442c-8986-6b22ae166ae6', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:25:51', '2021-03-10 01:25:51', 22, 0, '', NULL, '2021-03-10 01:25:51', NULL, '2021-03-10 01:25:51', b'0'); +INSERT INTO `inf_api_access_log` VALUES (41, '5228cabc-3ff5-4c3a-a9d0-a7c14a9e92a5', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:26:02', '2021-03-10 01:26:02', 17, 0, '', NULL, '2021-03-10 01:26:02', NULL, '2021-03-10 01:26:02', b'0'); +INSERT INTO `inf_api_access_log` VALUES (42, 'c659072d-1d29-469b-b84b-b6ed4b6c964e', 1, 2, 'dashboard', 'POST', '/api/system/menu/create', '{\"query\":{},\"body\":\"{\\\"parentId\\\":110,\\\"name\\\":\\\"任务查询\\\",\\\"type\\\":3,\\\"sort\\\":1,\\\"status\\\":0,\\\"permission\\\":\\\"infra:job:query\\\"}\"}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:26:19', '2021-03-10 01:26:19', 29, 0, '', NULL, '2021-03-10 01:26:19', NULL, '2021-03-10 01:26:19', b'0'); +INSERT INTO `inf_api_access_log` VALUES (43, '1627b483-95b0-4ddc-b4f8-c27f931fde1a', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:26:19', '2021-03-10 01:26:19', 17, 0, '', NULL, '2021-03-10 01:26:19', NULL, '2021-03-10 01:26:19', b'0'); +INSERT INTO `inf_api_access_log` VALUES (44, '6c497f1e-da23-4ca6-bb04-1a5c0bb768ad', 1, 2, 'dashboard', 'GET', '/api/system/menu/get', '{\"query\":{\"id\":\"1078\"},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:27:42', '2021-03-10 01:27:43', 188, 0, '', NULL, '2021-03-10 01:27:43', NULL, '2021-03-10 01:27:43', b'0'); +INSERT INTO `inf_api_access_log` VALUES (45, 'ba231b78-1b76-4116-b54d-a42abc10ac9b', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:27:42', '2021-03-10 01:27:43', 188, 0, '', NULL, '2021-03-10 01:27:43', NULL, '2021-03-10 01:27:43', b'0'); +INSERT INTO `inf_api_access_log` VALUES (46, '1440ae67-0972-4d04-9efe-9080acc615bb', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:27:45', '2021-03-10 01:27:46', 20, 0, '', NULL, '2021-03-10 01:27:46', NULL, '2021-03-10 01:27:46', b'0'); +INSERT INTO `inf_api_access_log` VALUES (47, '391845d4-1e42-492d-bc44-4ef878be4b41', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:27:50', '2021-03-10 01:27:50', 21, 0, '', NULL, '2021-03-10 01:27:50', NULL, '2021-03-10 01:27:50', b'0'); +INSERT INTO `inf_api_access_log` VALUES (48, 'dd2b9b7e-df39-497c-bd1a-456a5af54799', 1, 2, 'dashboard', 'POST', '/api/system/menu/create', '{\"query\":{},\"body\":\"{\\\"parentId\\\":1078,\\\"name\\\":\\\"日志查询\\\",\\\"type\\\":3,\\\"sort\\\":1,\\\"status\\\":0,\\\"permission\\\":\\\"infra:api-error-log:query\\\"}\"}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:28:04', '2021-03-10 01:28:04', 45, 0, '', NULL, '2021-03-10 01:28:04', NULL, '2021-03-10 01:28:04', b'0'); +INSERT INTO `inf_api_access_log` VALUES (49, '292da48c-21a0-4066-8a3a-40ddd0e9c759', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:28:04', '2021-03-10 01:28:04', 23, 0, '', NULL, '2021-03-10 01:28:04', NULL, '2021-03-10 01:28:04', b'0'); +INSERT INTO `inf_api_access_log` VALUES (50, '13432c7e-35c4-451f-9aa7-438f7f5c646a', 1, 2, 'dashboard', 'GET', '/api/system/menu/get', '{\"query\":{\"id\":\"1078\"},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:28:07', '2021-03-10 01:28:07', 13, 0, '', NULL, '2021-03-10 01:28:07', NULL, '2021-03-10 01:28:07', b'0'); +INSERT INTO `inf_api_access_log` VALUES (51, 'f06ad98f-7136-4157-83d6-9ff18b76c701', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:28:07', '2021-03-10 01:28:07', 20, 0, '', NULL, '2021-03-10 01:28:07', NULL, '2021-03-10 01:28:07', b'0'); +INSERT INTO `inf_api_access_log` VALUES (52, '255cc516-6b95-404c-ae2c-38d713ca3a59', 1, 2, 'dashboard', 'POST', '/api/system/menu/update', '{\"query\":{},\"body\":\"{\\\"id\\\":1078,\\\"status\\\":0,\\\"createTime\\\":1614274379000,\\\"name\\\":\\\"访问日志\\\",\\\"permission\\\":\\\"\\\",\\\"type\\\":2,\\\"sort\\\":1,\\\"parentId\\\":1083,\\\"path\\\":\\\"api-access-log\\\",\\\"icon\\\":\\\"log\\\",\\\"component\\\":\\\"infra/apiAccessLog/index\\\"}\"}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:28:09', '2021-03-10 01:28:09', 33, 0, '', NULL, '2021-03-10 01:28:09', NULL, '2021-03-10 01:28:09', b'0'); +INSERT INTO `inf_api_access_log` VALUES (53, '0b75788a-e1cb-43f7-959e-4f8cbb40b3cc', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:28:09', '2021-03-10 01:28:09', 18, 0, '', NULL, '2021-03-10 01:28:09', NULL, '2021-03-10 01:28:09', b'0'); +INSERT INTO `inf_api_access_log` VALUES (54, 'aebfea9a-ae91-4746-bf71-d315da4f5d49', 1, 2, 'dashboard', 'GET', '/api/system/menu/get', '{\"query\":{\"id\":\"1082\"},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:28:11', '2021-03-10 01:28:11', 8, 0, '', NULL, '2021-03-10 01:28:11', NULL, '2021-03-10 01:28:11', b'0'); +INSERT INTO `inf_api_access_log` VALUES (55, '149f2f74-9d4b-491f-b016-19c5b381fcc7', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:28:11', '2021-03-10 01:28:11', 15, 0, '', NULL, '2021-03-10 01:28:11', NULL, '2021-03-10 01:28:11', b'0'); +INSERT INTO `inf_api_access_log` VALUES (56, 'aeec1ebf-5aeb-4888-a2dd-60c473ae6b78', 1, 2, 'dashboard', 'POST', '/api/system/menu/update', '{\"query\":{},\"body\":\"{\\\"id\\\":1082,\\\"status\\\":0,\\\"createTime\\\":1614274379000,\\\"name\\\":\\\"日志导出\\\",\\\"permission\\\":\\\"infra:api-access-log:export\\\",\\\"type\\\":3,\\\"sort\\\":2,\\\"parentId\\\":1078,\\\"path\\\":\\\"\\\",\\\"icon\\\":\\\"\\\",\\\"component\\\":\\\"\\\"}\"}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:28:13', '2021-03-10 01:28:13', 23, 0, '', NULL, '2021-03-10 01:28:13', NULL, '2021-03-10 01:28:13', b'0'); +INSERT INTO `inf_api_access_log` VALUES (57, 'd2cc4ee9-d289-4886-be34-0f93edb52bc0', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:28:13', '2021-03-10 01:28:13', 16, 0, '', NULL, '2021-03-10 01:28:13', NULL, '2021-03-10 01:28:13', b'0'); +INSERT INTO `inf_api_access_log` VALUES (58, '73efd4a2-fe8b-4819-a657-6aca7425e7c0', 1, 2, 'dashboard', 'GET', '/api/system/menu/get', '{\"query\":{\"id\":\"1085\"},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:28:15', '2021-03-10 01:28:15', 9, 0, '', NULL, '2021-03-10 01:28:15', NULL, '2021-03-10 01:28:15', b'0'); +INSERT INTO `inf_api_access_log` VALUES (59, 'f222df67-e4c0-419f-a022-4bc304319f4d', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:28:15', '2021-03-10 01:28:15', 17, 0, '', NULL, '2021-03-10 01:28:15', NULL, '2021-03-10 01:28:15', b'0'); +INSERT INTO `inf_api_access_log` VALUES (60, 'd304f696-6bd3-4218-b73a-7cff04565b54', 1, 2, 'dashboard', 'POST', '/api/system/menu/update', '{\"query\":{},\"body\":\"{\\\"id\\\":1085,\\\"status\\\":0,\\\"createTime\\\":1614297200000,\\\"name\\\":\\\"日志处理\\\",\\\"permission\\\":\\\"infra:api-error-log:update-status\\\",\\\"type\\\":3,\\\"sort\\\":2,\\\"parentId\\\":1084,\\\"path\\\":\\\"\\\",\\\"icon\\\":\\\"\\\",\\\"component\\\":\\\"\\\"}\"}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:28:18', '2021-03-10 01:28:18', 23, 0, '', NULL, '2021-03-10 01:28:18', NULL, '2021-03-10 01:28:18', b'0'); +INSERT INTO `inf_api_access_log` VALUES (61, '224f263e-0e4f-49a8-8205-2de44ba8e045', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:28:18', '2021-03-10 01:28:18', 16, 0, '', NULL, '2021-03-10 01:28:18', NULL, '2021-03-10 01:28:18', b'0'); +INSERT INTO `inf_api_access_log` VALUES (62, '9fd2373f-a641-4865-ae3f-259b4386d816', 1, 2, 'dashboard', 'GET', '/api/system/menu/get', '{\"query\":{\"id\":\"1086\"},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:28:19', '2021-03-10 01:28:19', 7, 0, '', NULL, '2021-03-10 01:28:19', NULL, '2021-03-10 01:28:19', b'0'); +INSERT INTO `inf_api_access_log` VALUES (63, 'a97c2b96-9486-4bde-a532-bbb8f077a393', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:28:19', '2021-03-10 01:28:19', 15, 0, '', NULL, '2021-03-10 01:28:19', NULL, '2021-03-10 01:28:19', b'0'); +INSERT INTO `inf_api_access_log` VALUES (64, '1cbb3fa8-9a84-4568-8089-c74c2ff38d80', 1, 2, 'dashboard', 'POST', '/api/system/menu/update', '{\"query\":{},\"body\":\"{\\\"id\\\":1086,\\\"status\\\":0,\\\"createTime\\\":1614297200000,\\\"name\\\":\\\"日志导出\\\",\\\"permission\\\":\\\"infra:api-error-log:export\\\",\\\"type\\\":3,\\\"sort\\\":3,\\\"parentId\\\":1084,\\\"path\\\":\\\"\\\",\\\"icon\\\":\\\"\\\",\\\"component\\\":\\\"\\\"}\"}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:28:21', '2021-03-10 01:28:21', 21, 0, '', NULL, '2021-03-10 01:28:21', NULL, '2021-03-10 01:28:21', b'0'); +INSERT INTO `inf_api_access_log` VALUES (65, '7f913e0c-0dfd-45cc-bb7d-eb55e7eb653d', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:28:21', '2021-03-10 01:28:21', 16, 0, '', NULL, '2021-03-10 01:28:21', NULL, '2021-03-10 01:28:21', b'0'); +INSERT INTO `inf_api_access_log` VALUES (66, '6b39ec06-2bf5-4d92-9245-18223625251f', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:28:34', '2021-03-10 01:28:34', 13, 0, '', NULL, '2021-03-10 01:28:34', NULL, '2021-03-10 01:28:34', b'0'); +INSERT INTO `inf_api_access_log` VALUES (67, '74045997-4753-48b6-98ee-1de5106d8633', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:28:47', '2021-03-10 01:28:47', 14, 0, '', NULL, '2021-03-10 01:28:47', NULL, '2021-03-10 01:28:47', b'0'); +INSERT INTO `inf_api_access_log` VALUES (68, '14dcf39c-9b29-4cd0-8c08-9a17cd0234f6', 1, 2, 'dashboard', 'POST', '/api/system/menu/create', '{\"query\":{},\"body\":\"{\\\"parentId\\\":1084,\\\"name\\\":\\\"日志查询\\\",\\\"type\\\":3,\\\"sort\\\":1,\\\"status\\\":0,\\\"permission\\\":\\\"infra:api-error-log:query\\\"}\"}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:29:09', '2021-03-10 01:29:09', 19, 0, '', NULL, '2021-03-10 01:29:09', NULL, '2021-03-10 01:29:09', b'0'); +INSERT INTO `inf_api_access_log` VALUES (69, '6ed66070-c685-4871-9321-372161cb71f7', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:29:09', '2021-03-10 01:29:09', 15, 0, '', NULL, '2021-03-10 01:29:09', NULL, '2021-03-10 01:29:09', b'0'); +INSERT INTO `inf_api_access_log` VALUES (70, 'f47ae56b-6de3-40b2-9da8-b86f38491645', 1, 2, 'dashboard', 'GET', '/api/system/menu/get', '{\"query\":{\"id\":\"1088\"},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:29:24', '2021-03-10 01:29:24', 8, 0, '', NULL, '2021-03-10 01:29:24', NULL, '2021-03-10 01:29:24', b'0'); +INSERT INTO `inf_api_access_log` VALUES (71, 'c498e660-4608-4051-bda3-3d980e6873f0', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:29:24', '2021-03-10 01:29:24', 18, 0, '', NULL, '2021-03-10 01:29:24', NULL, '2021-03-10 01:29:24', b'0'); +INSERT INTO `inf_api_access_log` VALUES (72, '7a9be5f0-16b7-4924-9352-c8c6bdb36f6d', 1, 2, 'dashboard', 'GET', '/api/system/menu/get', '{\"query\":{\"id\":\"1088\"},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:29:32', '2021-03-10 01:29:32', 7, 0, '', NULL, '2021-03-10 01:29:32', NULL, '2021-03-10 01:29:32', b'0'); +INSERT INTO `inf_api_access_log` VALUES (73, '7dcc44ce-63f0-4013-b4ee-332de28e473d', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:29:32', '2021-03-10 01:29:32', 16, 0, '', NULL, '2021-03-10 01:29:32', NULL, '2021-03-10 01:29:32', b'0'); +INSERT INTO `inf_api_access_log` VALUES (74, 'a7541572-c68d-443e-95f6-69d1f6f55fab', 1, 2, 'dashboard', 'POST', '/api/system/menu/update', '{\"query\":{},\"body\":\"{\\\"id\\\":1088,\\\"status\\\":0,\\\"createTime\\\":1615310884000,\\\"name\\\":\\\"日志查询\\\",\\\"permission\\\":\\\"infra:api-access-log:query\\\",\\\"type\\\":3,\\\"sort\\\":1,\\\"parentId\\\":1078,\\\"path\\\":\\\"\\\",\\\"icon\\\":\\\"\\\",\\\"component\\\":\\\"\\\"}\"}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:29:38', '2021-03-10 01:29:38', 22, 0, '', NULL, '2021-03-10 01:29:38', NULL, '2021-03-10 01:29:38', b'0'); +INSERT INTO `inf_api_access_log` VALUES (75, '822a488f-fc4a-4981-924c-40deba7b8a25', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:29:38', '2021-03-10 01:29:38', 14, 0, '', NULL, '2021-03-10 01:29:38', NULL, '2021-03-10 01:29:38', b'0'); COMMIT; -- ---------------------------- @@ -175,12 +250,63 @@ CREATE TABLE `inf_job_log` ( `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='定时任务日志表'; +) ENGINE=InnoDB AUTO_INCREMENT=52 DEFAULT CHARSET=utf8mb4 COMMENT='定时任务日志表'; -- ---------------------------- -- Records of inf_job_log -- ---------------------------- BEGIN; +INSERT INTO `inf_job_log` VALUES (1, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-09 21:17:51', '2021-03-09 21:17:51', 61, 1, '移除在线会话数量为 0 个', NULL, '2021-03-09 21:17:51', NULL, '2021-03-09 21:17:51', b'0'); +INSERT INTO `inf_job_log` VALUES (2, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-09 21:18:00', '2021-03-09 21:18:00', 16, 1, '移除在线会话数量为 0 个', NULL, '2021-03-09 21:18:00', NULL, '2021-03-09 21:18:00', b'0'); +INSERT INTO `inf_job_log` VALUES (3, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-09 21:19:00', '2021-03-09 21:19:00', 10, 1, '移除在线会话数量为 0 个', NULL, '2021-03-09 21:19:00', NULL, '2021-03-09 21:19:00', b'0'); +INSERT INTO `inf_job_log` VALUES (4, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-09 21:20:00', '2021-03-09 21:20:00', 12, 1, '移除在线会话数量为 0 个', NULL, '2021-03-09 21:20:00', NULL, '2021-03-09 21:20:00', b'0'); +INSERT INTO `inf_job_log` VALUES (5, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-09 21:21:00', '2021-03-09 21:21:00', 7, 1, '移除在线会话数量为 0 个', NULL, '2021-03-09 21:21:00', NULL, '2021-03-09 21:21:00', b'0'); +INSERT INTO `inf_job_log` VALUES (6, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-09 21:22:00', '2021-03-09 21:22:00', 9, 1, '移除在线会话数量为 0 个', NULL, '2021-03-09 21:22:00', NULL, '2021-03-09 21:22:00', b'0'); +INSERT INTO `inf_job_log` VALUES (7, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-09 21:23:00', '2021-03-09 21:23:00', 10, 1, '移除在线会话数量为 0 个', NULL, '2021-03-09 21:23:00', NULL, '2021-03-09 21:23:00', b'0'); +INSERT INTO `inf_job_log` VALUES (8, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-09 21:24:00', '2021-03-09 21:24:00', 11, 1, '移除在线会话数量为 0 个', NULL, '2021-03-09 21:24:00', NULL, '2021-03-09 21:24:00', b'0'); +INSERT INTO `inf_job_log` VALUES (9, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-09 21:25:00', '2021-03-09 21:25:00', 7, 1, '移除在线会话数量为 0 个', NULL, '2021-03-09 21:25:00', NULL, '2021-03-09 21:25:00', b'0'); +INSERT INTO `inf_job_log` VALUES (10, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-09 21:26:00', '2021-03-09 21:26:00', 11, 1, '移除在线会话数量为 0 个', NULL, '2021-03-09 21:26:00', NULL, '2021-03-09 21:26:00', b'0'); +INSERT INTO `inf_job_log` VALUES (11, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-09 21:27:00', '2021-03-09 21:27:00', 12, 1, '移除在线会话数量为 0 个', NULL, '2021-03-09 21:27:00', NULL, '2021-03-09 21:27:00', b'0'); +INSERT INTO `inf_job_log` VALUES (12, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-09 21:28:00', '2021-03-09 21:28:00', 6, 1, '移除在线会话数量为 0 个', NULL, '2021-03-09 21:28:00', NULL, '2021-03-09 21:28:00', b'0'); +INSERT INTO `inf_job_log` VALUES (13, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-09 21:29:00', '2021-03-09 21:29:00', 9, 1, '移除在线会话数量为 0 个', NULL, '2021-03-09 21:29:00', NULL, '2021-03-09 21:29:00', b'0'); +INSERT INTO `inf_job_log` VALUES (14, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-09 21:30:00', '2021-03-09 21:30:00', 6, 1, '移除在线会话数量为 0 个', NULL, '2021-03-09 21:30:00', NULL, '2021-03-09 21:30:00', b'0'); +INSERT INTO `inf_job_log` VALUES (15, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-09 21:31:00', '2021-03-09 21:31:00', 7, 1, '移除在线会话数量为 0 个', NULL, '2021-03-09 21:31:00', NULL, '2021-03-09 21:31:00', b'0'); +INSERT INTO `inf_job_log` VALUES (16, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-09 21:32:00', '2021-03-09 21:32:00', 8, 1, '移除在线会话数量为 0 个', NULL, '2021-03-09 21:32:00', NULL, '2021-03-09 21:32:00', b'0'); +INSERT INTO `inf_job_log` VALUES (17, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-09 21:49:02', '2021-03-09 21:49:02', 87, 1, '移除在线会话数量为 0 个', NULL, '2021-03-09 21:49:02', NULL, '2021-03-09 21:49:02', b'0'); +INSERT INTO `inf_job_log` VALUES (18, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 00:55:34', '2021-03-10 00:55:34', 60, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 00:55:34', NULL, '2021-03-10 00:55:34', b'0'); +INSERT INTO `inf_job_log` VALUES (19, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 00:56:00', '2021-03-10 00:56:00', 16, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 00:56:00', NULL, '2021-03-10 00:56:00', b'0'); +INSERT INTO `inf_job_log` VALUES (20, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 00:57:00', '2021-03-10 00:57:00', 9, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 00:57:00', NULL, '2021-03-10 00:57:00', b'0'); +INSERT INTO `inf_job_log` VALUES (21, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 00:58:00', '2021-03-10 00:58:00', 17, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 00:58:00', NULL, '2021-03-10 00:58:00', b'0'); +INSERT INTO `inf_job_log` VALUES (22, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 00:59:00', '2021-03-10 00:59:00', 8, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 00:59:00', NULL, '2021-03-10 00:59:00', b'0'); +INSERT INTO `inf_job_log` VALUES (23, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:00:00', '2021-03-10 01:00:00', 10, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:00:00', NULL, '2021-03-10 01:00:00', b'0'); +INSERT INTO `inf_job_log` VALUES (24, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:01:00', '2021-03-10 01:01:00', 8, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:01:00', NULL, '2021-03-10 01:01:00', b'0'); +INSERT INTO `inf_job_log` VALUES (25, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:02:00', '2021-03-10 01:02:00', 9, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:02:00', NULL, '2021-03-10 01:02:00', b'0'); +INSERT INTO `inf_job_log` VALUES (26, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:03:00', '2021-03-10 01:03:00', 7, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:03:00', NULL, '2021-03-10 01:03:00', b'0'); +INSERT INTO `inf_job_log` VALUES (27, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:04:00', '2021-03-10 01:04:00', 8, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:04:00', NULL, '2021-03-10 01:04:00', b'0'); +INSERT INTO `inf_job_log` VALUES (28, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:05:00', '2021-03-10 01:05:00', 16, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:05:00', NULL, '2021-03-10 01:05:00', b'0'); +INSERT INTO `inf_job_log` VALUES (29, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:06:00', '2021-03-10 01:06:00', 15, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:06:00', NULL, '2021-03-10 01:06:00', b'0'); +INSERT INTO `inf_job_log` VALUES (30, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:07:00', '2021-03-10 01:07:00', 7, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:07:00', NULL, '2021-03-10 01:07:00', b'0'); +INSERT INTO `inf_job_log` VALUES (31, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:08:00', '2021-03-10 01:08:00', 7, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:08:00', NULL, '2021-03-10 01:08:00', b'0'); +INSERT INTO `inf_job_log` VALUES (32, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:09:00', '2021-03-10 01:09:00', 8, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:09:00', NULL, '2021-03-10 01:09:00', b'0'); +INSERT INTO `inf_job_log` VALUES (33, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:10:00', '2021-03-10 01:10:00', 16, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:10:00', NULL, '2021-03-10 01:10:00', b'0'); +INSERT INTO `inf_job_log` VALUES (34, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:11:00', '2021-03-10 01:11:00', 7, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:11:00', NULL, '2021-03-10 01:11:00', b'0'); +INSERT INTO `inf_job_log` VALUES (35, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:12:00', '2021-03-10 01:12:00', 7, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:12:00', NULL, '2021-03-10 01:12:00', b'0'); +INSERT INTO `inf_job_log` VALUES (36, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:13:00', '2021-03-10 01:13:00', 8, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:13:00', NULL, '2021-03-10 01:13:00', b'0'); +INSERT INTO `inf_job_log` VALUES (37, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:14:00', '2021-03-10 01:14:00', 6, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:14:00', NULL, '2021-03-10 01:14:00', b'0'); +INSERT INTO `inf_job_log` VALUES (38, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:15:00', '2021-03-10 01:15:00', 5, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:15:00', NULL, '2021-03-10 01:15:00', b'0'); +INSERT INTO `inf_job_log` VALUES (39, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:16:00', '2021-03-10 01:16:00', 8, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:16:00', NULL, '2021-03-10 01:16:00', b'0'); +INSERT INTO `inf_job_log` VALUES (40, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:17:00', '2021-03-10 01:17:00', 9, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:17:00', NULL, '2021-03-10 01:17:00', b'0'); +INSERT INTO `inf_job_log` VALUES (41, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:18:00', '2021-03-10 01:18:00', 6, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:18:00', NULL, '2021-03-10 01:18:00', b'0'); +INSERT INTO `inf_job_log` VALUES (42, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:19:00', '2021-03-10 01:19:00', 6, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:19:00', NULL, '2021-03-10 01:19:00', b'0'); +INSERT INTO `inf_job_log` VALUES (43, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:20:00', '2021-03-10 01:20:00', 7, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:20:00', NULL, '2021-03-10 01:20:00', b'0'); +INSERT INTO `inf_job_log` VALUES (44, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:21:00', '2021-03-10 01:21:00', 5, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:21:00', NULL, '2021-03-10 01:21:00', b'0'); +INSERT INTO `inf_job_log` VALUES (45, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:23:09', '2021-03-10 01:23:09', 60, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:23:09', NULL, '2021-03-10 01:23:09', b'0'); +INSERT INTO `inf_job_log` VALUES (46, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:25:41', '2021-03-10 01:25:41', 92, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:25:41', NULL, '2021-03-10 01:25:41', b'0'); +INSERT INTO `inf_job_log` VALUES (47, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:26:00', '2021-03-10 01:26:00', 10, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:26:00', NULL, '2021-03-10 01:26:00', b'0'); +INSERT INTO `inf_job_log` VALUES (48, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:27:42', '2021-03-10 01:27:42', 61, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:27:42', NULL, '2021-03-10 01:27:42', b'0'); +INSERT INTO `inf_job_log` VALUES (49, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:28:00', '2021-03-10 01:28:00', 14, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:28:00', NULL, '2021-03-10 01:28:00', b'0'); +INSERT INTO `inf_job_log` VALUES (50, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:29:00', '2021-03-10 01:29:00', 8, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:29:00', NULL, '2021-03-10 01:29:00', b'0'); +INSERT INTO `inf_job_log` VALUES (51, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:30:00', '2021-03-10 01:30:00', 8, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:30:00', NULL, '2021-03-10 01:30:00', b'0'); COMMIT; -- ---------------------------- @@ -382,12 +508,14 @@ CREATE TABLE `sys_login_log` ( `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统访问记录'; +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COMMENT='系统访问记录'; -- ---------------------------- -- Records of sys_login_log -- ---------------------------- BEGIN; +INSERT INTO `sys_login_log` VALUES (1, 100, '4143cdab-ff1d-46ec-8333-bc48483c4c4b', 'admin', 30, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', NULL, '2021-03-10 01:11:53', NULL, '2021-03-10 01:11:53', b'0'); +INSERT INTO `sys_login_log` VALUES (2, 100, '783e9c51-4a58-46aa-85f1-66cac5512465', 'admin', 0, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', NULL, '2021-03-10 01:11:53', NULL, '2021-03-10 01:11:53', b'0'); COMMIT; -- ---------------------------- @@ -411,7 +539,7 @@ CREATE TABLE `sys_menu` ( `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=1087 DEFAULT CHARSET=utf8mb4 COMMENT='菜单权限表'; +) ENGINE=InnoDB AUTO_INCREMENT=1090 DEFAULT CHARSET=utf8mb4 COMMENT='菜单权限表'; -- ---------------------------- -- Records of sys_menu @@ -427,11 +555,11 @@ INSERT INTO `sys_menu` VALUES (102, '菜单管理', 'system:menu:list', 2, 3, 1, INSERT INTO `sys_menu` VALUES (103, '部门管理', 'system:dept:list', 2, 4, 1, 'dept', 'tree', 'system/dept/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:45', b'0'); INSERT INTO `sys_menu` VALUES (104, '岗位管理', 'system:post:list', 2, 5, 1, 'post', 'post', 'system/post/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:45', b'0'); INSERT INTO `sys_menu` VALUES (105, '字典管理', 'system:dict:list', 2, 6, 1, 'dict', 'dict', 'system/dict/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:45', b'0'); -INSERT INTO `sys_menu` VALUES (106, '配置管理', 'infra:config:list', 2, 1, 2, 'config', 'edit', 'infra/config/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-02-08 20:03:57', b'0'); +INSERT INTO `sys_menu` VALUES (106, '配置管理', '', 2, 1, 2, 'config', 'edit', 'infra/config/index', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-10 01:12:10', b'0'); INSERT INTO `sys_menu` VALUES (107, '通知公告', 'system:notice:list', 2, 8, 1, 'notice', 'message', 'system/notice/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:45', b'0'); INSERT INTO `sys_menu` VALUES (108, '日志管理', '', 1, 9, 1, 'log', 'log', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:34:28', b'0'); INSERT INTO `sys_menu` VALUES (109, '在线用户', 'system:user-session:list', 2, 10, 1, 'user-session', 'online', 'system/session/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-26 08:21:20', b'0'); -INSERT INTO `sys_menu` VALUES (110, '定时任务', 'infra:job:query', 2, 2, 2, 'job', 'job', 'infra/job/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-02-07 13:01:36', b'0'); +INSERT INTO `sys_menu` VALUES (110, '定时任务', '', 2, 2, 2, 'job', 'job', 'infra/job/index', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-10 01:25:51', b'0'); INSERT INTO `sys_menu` VALUES (111, 'MySQL 监控', '', 2, 4, 2, 'druid', 'druid', 'infra/druid/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-02-26 02:18:32', b'0'); INSERT INTO `sys_menu` VALUES (112, 'Java 监控', '', 2, 6, 2, 'admin-server', 'server', 'infra/server', 0, 'admin', '2021-01-05 17:03:48', '', '2021-02-26 02:18:41', b'0'); INSERT INTO `sys_menu` VALUES (113, 'Redis 监控', '', 2, 5, 2, 'redis', 'redis', 'infra/redis/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-02-26 02:18:37', b'0'); @@ -471,9 +599,9 @@ INSERT INTO `sys_menu` VALUES (1028, '字典修改', 'system:dict:edit', 3, 3, 1 INSERT INTO `sys_menu` VALUES (1029, '字典删除', 'system:dict:remove', 3, 4, 105, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0'); INSERT INTO `sys_menu` VALUES (1030, '字典导出', 'system:dict:export', 3, 5, 105, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0'); INSERT INTO `sys_menu` VALUES (1031, '配置查询', 'infra:config:query', 3, 1, 106, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-20 14:34:00', b'0'); -INSERT INTO `sys_menu` VALUES (1032, '配置新增', 'infra:config:add', 3, 2, 106, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-20 14:34:05', b'0'); -INSERT INTO `sys_menu` VALUES (1033, '配置修改', 'infra:config:edit', 3, 3, 106, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-20 14:33:52', b'0'); -INSERT INTO `sys_menu` VALUES (1034, '配置删除', 'infra:config:remove', 3, 4, 106, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-20 14:34:12', b'0'); +INSERT INTO `sys_menu` VALUES (1032, '配置新增', 'infra:config:create', 3, 2, 106, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-10 01:12:18', b'0'); +INSERT INTO `sys_menu` VALUES (1033, '配置修改', 'infra:config:update', 3, 3, 106, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-10 01:12:30', b'0'); +INSERT INTO `sys_menu` VALUES (1034, '配置删除', 'infra:config:delete', 3, 4, 106, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-10 01:12:36', b'0'); INSERT INTO `sys_menu` VALUES (1035, '配置导出', 'infra:config:export', 3, 5, 106, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-20 14:34:19', b'0'); INSERT INTO `sys_menu` VALUES (1036, '公告查询', 'system:notice:query', 3, 1, 107, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0'); INSERT INTO `sys_menu` VALUES (1037, '公告新增', 'system:notice:add', 3, 2, 107, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0'); @@ -511,15 +639,18 @@ INSERT INTO `sys_menu` VALUES (1074, '测试示例表导出', 'tool:test-demo:ex INSERT INTO `sys_menu` VALUES (1075, '任务触发', 'infra:job:trigger', 3, 8, 110, '', '', '', 0, '', '2021-02-07 13:03:10', '', '2021-02-07 13:03:10', b'0'); INSERT INTO `sys_menu` VALUES (1076, '数据库文档', '', 2, 5, 3, 'db-doc', 'table', 'tool/dbDoc/index', 0, '', '2021-02-08 01:41:47', '', '2021-02-08 01:49:00', b'0'); INSERT INTO `sys_menu` VALUES (1077, '链路追踪', '', 2, 7, 2, 'skywalking', 'eye-open', 'infra/skywalking', 0, '', '2021-02-08 20:41:31', '', '2021-02-26 02:18:45', b'0'); -INSERT INTO `sys_menu` VALUES (1078, '访问日志', 'infra:api-access-log:query', 2, 1, 1083, 'api-access-log', 'log', 'infra/apiAccessLog/index', 0, '', '2021-02-26 01:32:59', '', '2021-02-26 07:53:46', b'0'); +INSERT INTO `sys_menu` VALUES (1078, '访问日志', '', 2, 1, 1083, 'api-access-log', 'log', 'infra/apiAccessLog/index', 0, '', '2021-02-26 01:32:59', '1', '2021-03-10 01:28:09', b'0'); INSERT INTO `sys_menu` VALUES (1079, 'API 访问日志表创建', 'system:api-access-log:create', 3, 1, 1078, '', '', '', 1, '', '2021-02-26 01:32:59', '', '2021-02-26 02:21:00', b'1'); INSERT INTO `sys_menu` VALUES (1080, 'API 访问日志表更新', 'system:api-access-log:update', 3, 2, 1078, '', '', '', 1, '', '2021-02-26 01:32:59', '', '2021-02-26 02:21:08', b'1'); INSERT INTO `sys_menu` VALUES (1081, 'API 访问日志表删除', 'system:api-access-log:delete', 3, 3, 1078, '', '', '', 1, '', '2021-02-26 01:32:59', '', '2021-02-26 02:21:27', b'1'); -INSERT INTO `sys_menu` VALUES (1082, '日志导出', 'infra:api-access-log:export', 3, 4, 1078, '', '', '', 0, '', '2021-02-26 01:32:59', '', '2021-02-26 02:23:22', b'0'); +INSERT INTO `sys_menu` VALUES (1082, '日志导出', 'infra:api-access-log:export', 3, 2, 1078, '', '', '', 0, '', '2021-02-26 01:32:59', '1', '2021-03-10 01:28:13', b'0'); INSERT INTO `sys_menu` VALUES (1083, 'API 日志', '', 2, 3, 2, 'log', 'log', NULL, 0, '', '2021-02-26 02:18:24', '', '2021-02-26 02:20:17', b'0'); INSERT INTO `sys_menu` VALUES (1084, '错误日志', 'infra:api-error-log:query', 2, 2, 1083, 'api-error-log', 'log', 'infra/apiErrorLog/index', 0, '', '2021-02-26 07:53:20', '', '2021-02-26 07:54:40', b'0'); -INSERT INTO `sys_menu` VALUES (1085, '日志处理', 'infra:api-error-log:update-status', 3, 1, 1084, '', '', '', 0, '', '2021-02-26 07:53:20', '', '2021-02-26 07:53:20', b'0'); -INSERT INTO `sys_menu` VALUES (1086, '日志导出', 'infra:api-error-log:export', 3, 4, 1084, '', '', '', 0, '', '2021-02-26 07:53:20', '', '2021-02-26 07:53:20', b'0'); +INSERT INTO `sys_menu` VALUES (1085, '日志处理', 'infra:api-error-log:update-status', 3, 2, 1084, '', '', '', 0, '', '2021-02-26 07:53:20', '1', '2021-03-10 01:28:18', b'0'); +INSERT INTO `sys_menu` VALUES (1086, '日志导出', 'infra:api-error-log:export', 3, 3, 1084, '', '', '', 0, '', '2021-02-26 07:53:20', '1', '2021-03-10 01:28:21', b'0'); +INSERT INTO `sys_menu` VALUES (1087, '任务查询', 'infra:job:query', 3, 1, 110, '', '', '', 0, '1', '2021-03-10 01:26:19', '1', '2021-03-10 01:26:19', b'0'); +INSERT INTO `sys_menu` VALUES (1088, '日志查询', 'infra:api-access-log:query', 3, 1, 1078, '', '', '', 0, '1', '2021-03-10 01:28:04', '1', '2021-03-10 01:29:38', b'0'); +INSERT INTO `sys_menu` VALUES (1089, '日志查询', 'infra:api-error-log:query', 3, 1, 1084, '', '', '', 0, '1', '2021-03-10 01:29:09', '1', '2021-03-10 01:29:09', b'0'); COMMIT; -- ---------------------------- @@ -579,12 +710,25 @@ CREATE TABLE `sys_operate_log` ( `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='操作日志记录'; +) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4 COMMENT='操作日志记录'; -- ---------------------------- -- Records of sys_operate_log -- ---------------------------- BEGIN; +INSERT INTO `sys_operate_log` VALUES (1, 'de0ba312-0b69-4362-b674-7da54cacfb06', 1, '菜单', '修改菜单', 2, '', '', 'POST', '/api/system/menu/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.updateMenu(SysMenuUpdateReqVO)', '{\"reqVO\":{\"name\":\"配置管理\",\"permission\":\"\",\"type\":2,\"sort\":1,\"parentId\":2,\"path\":\"config\",\"icon\":\"edit\",\"component\":\"infra/config/index\",\"status\":0,\"id\":106}}', '2021-03-10 01:12:09', 27, 0, '', 'true', NULL, '2021-03-10 01:12:10', NULL, '2021-03-10 01:12:10', b'0'); +INSERT INTO `sys_operate_log` VALUES (2, '17138b71-73b5-40c0-b735-57a1aab63a8d', 1, '菜单', '修改菜单', 2, '', '', 'POST', '/api/system/menu/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.updateMenu(SysMenuUpdateReqVO)', '{\"reqVO\":{\"name\":\"配置新增\",\"permission\":\"infra:config:create\",\"type\":3,\"sort\":2,\"parentId\":106,\"path\":\"\",\"icon\":\"\",\"component\":\"\",\"status\":0,\"id\":1032}}', '2021-03-10 01:12:18', 16, 0, '', 'true', NULL, '2021-03-10 01:12:18', NULL, '2021-03-10 01:12:18', b'0'); +INSERT INTO `sys_operate_log` VALUES (3, '74aff106-7785-4b36-b48f-0ff46d7af074', 1, '菜单', '修改菜单', 2, '', '', 'POST', '/api/system/menu/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.updateMenu(SysMenuUpdateReqVO)', '{\"reqVO\":{\"name\":\"配置修改\",\"permission\":\"infra:config:update\",\"type\":3,\"sort\":3,\"parentId\":106,\"path\":\"\",\"icon\":\"\",\"component\":\"\",\"status\":0,\"id\":1033}}', '2021-03-10 01:12:30', 16, 0, '', 'true', NULL, '2021-03-10 01:12:30', NULL, '2021-03-10 01:12:30', b'0'); +INSERT INTO `sys_operate_log` VALUES (4, '2cdfcdb3-2059-426b-8d18-4f08ac3d685b', 1, '菜单', '修改菜单', 2, '', '', 'POST', '/api/system/menu/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.updateMenu(SysMenuUpdateReqVO)', '{\"reqVO\":{\"name\":\"配置删除\",\"permission\":\"infra:config:delete\",\"type\":3,\"sort\":4,\"parentId\":106,\"path\":\"\",\"icon\":\"\",\"component\":\"\",\"status\":0,\"id\":1034}}', '2021-03-10 01:12:36', 14, 0, '', 'true', NULL, '2021-03-10 01:12:36', NULL, '2021-03-10 01:12:36', b'0'); +INSERT INTO `sys_operate_log` VALUES (5, '72652932-6219-4298-b057-86afde0ce065', 1, '菜单', '修改菜单', 2, '', '', 'POST', '/api/system/menu/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.updateMenu(SysMenuUpdateReqVO)', '{\"reqVO\":{\"name\":\"定时任务\",\"permission\":\"\",\"type\":2,\"sort\":2,\"parentId\":2,\"path\":\"job\",\"icon\":\"job\",\"component\":\"infra/job/index\",\"status\":0,\"id\":110}}', '2021-03-10 01:25:51', 28, 0, '', 'true', NULL, '2021-03-10 01:25:51', NULL, '2021-03-10 01:25:51', b'0'); +INSERT INTO `sys_operate_log` VALUES (6, '9160878f-9a8d-47d9-bb54-271263dbc63c', 1, '菜单', '创建菜单', 2, '', '', 'POST', '/api/system/menu/create', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.createMenu(SysMenuCreateReqVO)', '{\"reqVO\":{\"name\":\"任务查询\",\"permission\":\"infra:job:query\",\"type\":3,\"sort\":1,\"parentId\":110,\"path\":null,\"icon\":null,\"component\":null,\"status\":0}}', '2021-03-10 01:26:19', 16, 0, '', '1087', NULL, '2021-03-10 01:26:19', NULL, '2021-03-10 01:26:19', b'0'); +INSERT INTO `sys_operate_log` VALUES (7, 'b6e1fbd8-1a2d-4d83-8cab-306dbdecb062', 1, '菜单', '创建菜单', 2, '', '', 'POST', '/api/system/menu/create', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.createMenu(SysMenuCreateReqVO)', '{\"reqVO\":{\"name\":\"日志查询\",\"permission\":\"infra:api-error-log:query\",\"type\":3,\"sort\":1,\"parentId\":1078,\"path\":null,\"icon\":null,\"component\":null,\"status\":0}}', '2021-03-10 01:28:04', 24, 0, '', '1088', NULL, '2021-03-10 01:28:04', NULL, '2021-03-10 01:28:04', b'0'); +INSERT INTO `sys_operate_log` VALUES (8, 'be86e04e-0dc9-4a68-8df0-b03ef0ed25cb', 1, '菜单', '修改菜单', 2, '', '', 'POST', '/api/system/menu/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.updateMenu(SysMenuUpdateReqVO)', '{\"reqVO\":{\"name\":\"访问日志\",\"permission\":\"\",\"type\":2,\"sort\":1,\"parentId\":1083,\"path\":\"api-access-log\",\"icon\":\"log\",\"component\":\"infra/apiAccessLog/index\",\"status\":0,\"id\":1078}}', '2021-03-10 01:28:09', 21, 0, '', 'true', NULL, '2021-03-10 01:28:09', NULL, '2021-03-10 01:28:09', b'0'); +INSERT INTO `sys_operate_log` VALUES (9, 'f744da18-ddc7-43ed-a85c-f88104734dbc', 1, '菜单', '修改菜单', 2, '', '', 'POST', '/api/system/menu/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.updateMenu(SysMenuUpdateReqVO)', '{\"reqVO\":{\"name\":\"日志导出\",\"permission\":\"infra:api-access-log:export\",\"type\":3,\"sort\":2,\"parentId\":1078,\"path\":\"\",\"icon\":\"\",\"component\":\"\",\"status\":0,\"id\":1082}}', '2021-03-10 01:28:13', 18, 0, '', 'true', NULL, '2021-03-10 01:28:13', NULL, '2021-03-10 01:28:13', b'0'); +INSERT INTO `sys_operate_log` VALUES (10, '3ebdb770-e942-4574-85b5-77f641a3ec54', 1, '菜单', '修改菜单', 2, '', '', 'POST', '/api/system/menu/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.updateMenu(SysMenuUpdateReqVO)', '{\"reqVO\":{\"name\":\"日志处理\",\"permission\":\"infra:api-error-log:update-status\",\"type\":3,\"sort\":2,\"parentId\":1084,\"path\":\"\",\"icon\":\"\",\"component\":\"\",\"status\":0,\"id\":1085}}', '2021-03-10 01:28:18', 18, 0, '', 'true', NULL, '2021-03-10 01:28:18', NULL, '2021-03-10 01:28:18', b'0'); +INSERT INTO `sys_operate_log` VALUES (11, '51d05bc9-b8a1-44a8-a141-f139b1843f0c', 1, '菜单', '修改菜单', 2, '', '', 'POST', '/api/system/menu/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.updateMenu(SysMenuUpdateReqVO)', '{\"reqVO\":{\"name\":\"日志导出\",\"permission\":\"infra:api-error-log:export\",\"type\":3,\"sort\":3,\"parentId\":1084,\"path\":\"\",\"icon\":\"\",\"component\":\"\",\"status\":0,\"id\":1086}}', '2021-03-10 01:28:21', 16, 0, '', 'true', NULL, '2021-03-10 01:28:21', NULL, '2021-03-10 01:28:21', b'0'); +INSERT INTO `sys_operate_log` VALUES (12, 'b5829295-81a5-47e1-9755-328f020d7037', 1, '菜单', '创建菜单', 2, '', '', 'POST', '/api/system/menu/create', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.createMenu(SysMenuCreateReqVO)', '{\"reqVO\":{\"name\":\"日志查询\",\"permission\":\"infra:api-error-log:query\",\"type\":3,\"sort\":1,\"parentId\":1084,\"path\":null,\"icon\":null,\"component\":null,\"status\":0}}', '2021-03-10 01:29:09', 14, 0, '', '1089', NULL, '2021-03-10 01:29:09', NULL, '2021-03-10 01:29:09', b'0'); +INSERT INTO `sys_operate_log` VALUES (13, 'f8797735-d948-43f9-9701-dac4533cee31', 1, '菜单', '修改菜单', 2, '', '', 'POST', '/api/system/menu/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.updateMenu(SysMenuUpdateReqVO)', '{\"reqVO\":{\"name\":\"日志查询\",\"permission\":\"infra:api-access-log:query\",\"type\":3,\"sort\":1,\"parentId\":1078,\"path\":\"\",\"icon\":\"\",\"component\":\"\",\"status\":0,\"id\":1088}}', '2021-03-10 01:29:38', 17, 0, '', 'true', NULL, '2021-03-10 01:29:38', NULL, '2021-03-10 01:29:38', b'0'); COMMIT; -- ---------------------------- @@ -914,6 +1058,7 @@ CREATE TABLE `sys_user_session` ( -- Records of sys_user_session -- ---------------------------- BEGIN; +INSERT INTO `sys_user_session` VALUES ('f853b50d064340a581e9a49bba9411fc', 1, '2021-03-10 01:55:41', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', NULL, '2021-03-10 01:11:53', NULL, '2021-03-10 01:25:41', b'0'); COMMIT; -- ---------------------------- diff --git a/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/InfJobLogController.java b/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/InfJobLogController.java index c7fee7a69..704e951d9 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/InfJobLogController.java +++ b/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/InfJobLogController.java @@ -75,7 +75,7 @@ public class InfJobLogController { List list = jobLogService.getJobLogList(exportReqVO); // 导出 Excel List datas = InfJobLogConvert.INSTANCE.convertList02(list); - ExcelUtils.write(response, "定时任务.xls", "数据", InfJobLogExcelVO.class, datas); + ExcelUtils.write(response, "任务日志.xls", "数据", InfJobLogExcelVO.class, datas); } } From c197417d92d7ebe0038f08bd393b867ab40f3b66 Mon Sep 17 00:00:00 2001 From: wangkai Date: Wed, 10 Mar 2021 22:37:06 +0800 Subject: [PATCH 023/126] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20system=20logger=20?= =?UTF-8?q?junit=20review=20=E5=90=8E=E6=8F=90=E5=87=BA=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/OperateLogFrameworkService.java | 7 ++- .../logger/impl/SysOperateLogServiceImpl.java | 10 ++-- .../logger/SysLoginLogServiceImplTest.java | 32 +++---------- .../logger/SysOperateLogServiceImplTest.java | 48 ++++++++----------- src/test/resources/sql/create_tables.sql | 12 ++--- 5 files changed, 44 insertions(+), 65 deletions(-) diff --git a/src/main/java/cn/iocoder/dashboard/framework/logger/operatelog/core/service/OperateLogFrameworkService.java b/src/main/java/cn/iocoder/dashboard/framework/logger/operatelog/core/service/OperateLogFrameworkService.java index c02e4038a..d16ecf804 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/logger/operatelog/core/service/OperateLogFrameworkService.java +++ b/src/main/java/cn/iocoder/dashboard/framework/logger/operatelog/core/service/OperateLogFrameworkService.java @@ -2,13 +2,16 @@ package cn.iocoder.dashboard.framework.logger.operatelog.core.service; import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogCreateReqVO; +import java.util.concurrent.Future; + public interface OperateLogFrameworkService { /** - * 要不记录操作日志 + * 异步记录操作日志 * * @param reqVO 操作日志请求 + * @return true: 记录成功,false: 记录失败 */ - void createOperateLogAsync(SysOperateLogCreateReqVO reqVO); + Future createOperateLogAsync(SysOperateLogCreateReqVO reqVO); } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/logger/impl/SysOperateLogServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/logger/impl/SysOperateLogServiceImpl.java index ab68f25b7..a27bf0246 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/logger/impl/SysOperateLogServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/logger/impl/SysOperateLogServiceImpl.java @@ -7,20 +7,22 @@ import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOp import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogExportReqVO; import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogPageReqVO; import cn.iocoder.dashboard.modules.system.convert.logger.SysOperateLogConvert; -import cn.iocoder.dashboard.modules.system.dal.mysql.logger.SysOperateLogMapper; import cn.iocoder.dashboard.modules.system.dal.dataobject.logger.SysOperateLogDO; import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.dashboard.modules.system.dal.mysql.logger.SysOperateLogMapper; import cn.iocoder.dashboard.modules.system.service.logger.SysOperateLogService; import cn.iocoder.dashboard.modules.system.service.user.SysUserService; import cn.iocoder.dashboard.util.string.StrUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Async; +import org.springframework.scheduling.annotation.AsyncResult; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.concurrent.Future; import static cn.iocoder.dashboard.modules.system.dal.dataobject.logger.SysOperateLogDO.JAVA_METHOD_ARGS_MAX_LENGTH; import static cn.iocoder.dashboard.modules.system.dal.dataobject.logger.SysOperateLogDO.RESULT_MAX_LENGTH; @@ -38,16 +40,18 @@ public class SysOperateLogServiceImpl implements SysOperateLogService { @Override @Async - public void createOperateLogAsync(SysOperateLogCreateReqVO reqVO) { + public Future createOperateLogAsync(SysOperateLogCreateReqVO reqVO) { + boolean success = false; try { SysOperateLogDO logDO = SysOperateLogConvert.INSTANCE.convert(reqVO); logDO.setJavaMethodArgs(StrUtils.maxLength(logDO.getJavaMethodArgs(), JAVA_METHOD_ARGS_MAX_LENGTH)); logDO.setResultData(StrUtils.maxLength(logDO.getResultData(), RESULT_MAX_LENGTH)); - operateLogMapper.insert(logDO); + success = operateLogMapper.insert(logDO) == 1; } catch (Throwable throwable) { // 仅仅打印日志,不对外抛出。原因是,还是要保留现场数据。 log.error("[createOperateLogAsync][记录操作日志异常,日志为 ({})]", reqVO, throwable); } + return new AsyncResult<>(success); } @Override diff --git a/src/test/java/cn/iocoder/dashboard/modules/system/service/logger/SysLoginLogServiceImplTest.java b/src/test/java/cn/iocoder/dashboard/modules/system/service/logger/SysLoginLogServiceImplTest.java index 11937f1a7..95f2d1985 100644 --- a/src/test/java/cn/iocoder/dashboard/modules/system/service/logger/SysLoginLogServiceImplTest.java +++ b/src/test/java/cn/iocoder/dashboard/modules/system/service/logger/SysLoginLogServiceImplTest.java @@ -3,14 +3,13 @@ package cn.iocoder.dashboard.modules.system.service.logger; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.ReflectUtil; -import cn.iocoder.dashboard.BaseSpringBootUnitTest; +import cn.iocoder.dashboard.BaseDbUnitTest; import cn.iocoder.dashboard.common.pojo.PageResult; import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.dashboard.framework.tracer.core.util.TracerUtils; import cn.iocoder.dashboard.modules.system.controller.logger.vo.loginlog.SysLoginLogCreateReqVO; import cn.iocoder.dashboard.modules.system.controller.logger.vo.loginlog.SysLoginLogExportReqVO; import cn.iocoder.dashboard.modules.system.controller.logger.vo.loginlog.SysLoginLogPageReqVO; -import cn.iocoder.dashboard.modules.system.convert.logger.SysLoginLogConvert; import cn.iocoder.dashboard.modules.system.dal.dataobject.logger.SysLoginLogDO; import cn.iocoder.dashboard.modules.system.dal.mysql.logger.SysLoginLogMapper; import cn.iocoder.dashboard.modules.system.enums.logger.SysLoginLogTypeEnum; @@ -19,6 +18,7 @@ import cn.iocoder.dashboard.modules.system.service.logger.impl.SysLoginLogServic import cn.iocoder.dashboard.util.RandomUtils; import cn.iocoder.dashboard.util.object.ObjectUtils; import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; import javax.annotation.Resource; import java.lang.reflect.Field; @@ -30,7 +30,8 @@ import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals; import static cn.iocoder.dashboard.util.date.DateUtils.buildTime; import static org.junit.jupiter.api.Assertions.assertEquals; -public class SysLoginLogServiceImplTest extends BaseSpringBootUnitTest { +@Import(SysLoginLogServiceImpl.class) +public class SysLoginLogServiceImplTest extends BaseDbUnitTest { @Resource private SysLoginLogServiceImpl sysLoginLogService; @@ -40,7 +41,6 @@ public class SysLoginLogServiceImplTest extends BaseSpringBootUnitTest { @Test public void testCreateLoginLog() { - String traceId = TracerUtils.getTraceId(); SysLoginLogCreateReqVO reqVO = RandomUtils.randomPojo(SysLoginLogCreateReqVO.class, vo -> { // 指定随机的范围,避免超出范围入库失败 @@ -50,19 +50,12 @@ public class SysLoginLogServiceImplTest extends BaseSpringBootUnitTest { vo.setTraceId(traceId); }); - // 执行service方法 sysLoginLogService.createLoginLog(reqVO); - // 查询插入的数据 - SysLoginLogDO sysLoginLogDO = loginLogMapper.selectOne("trace_id", traceId); - // 断言,忽略基本字段 - assertPojoEquals( - SysLoginLogConvert.INSTANCE.convert(reqVO), - sysLoginLogDO, - getBaseDOFields() - ); + SysLoginLogDO sysLoginLogDO = loginLogMapper.selectOne(null); + assertPojoEquals(reqVO, sysLoginLogDO); } @@ -155,17 +148,4 @@ public class SysLoginLogServiceImplTest extends BaseSpringBootUnitTest { assertEquals(1, loginLogList.size()); assertPojoEquals(loginLogDO, loginLogList.get(0)); } - - - private static String[] getBaseDOFields() { - Field[] fields = ReflectUtil.getFields(BaseDO.class); - - List collect = Arrays.stream(fields) - .map(Field::getName) - .collect(Collectors.toList()); - collect.add("id"); - - return ArrayUtil.toArray(collect, String.class); - } - } diff --git a/src/test/java/cn/iocoder/dashboard/modules/system/service/logger/SysOperateLogServiceImplTest.java b/src/test/java/cn/iocoder/dashboard/modules/system/service/logger/SysOperateLogServiceImplTest.java index 86e03bba5..0f071ea7b 100644 --- a/src/test/java/cn/iocoder/dashboard/modules/system/service/logger/SysOperateLogServiceImplTest.java +++ b/src/test/java/cn/iocoder/dashboard/modules/system/service/logger/SysOperateLogServiceImplTest.java @@ -1,9 +1,10 @@ package cn.iocoder.dashboard.modules.system.service.logger; +import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.ReflectUtil; -import cn.iocoder.dashboard.BaseSpringBootUnitTest; +import cn.iocoder.dashboard.BaseDbUnitTest; import cn.iocoder.dashboard.common.enums.CommonStatusEnum; import cn.iocoder.dashboard.common.exception.enums.GlobalErrorCodeConstants; import cn.iocoder.dashboard.common.pojo.PageResult; @@ -13,15 +14,18 @@ import cn.iocoder.dashboard.framework.tracer.core.util.TracerUtils; import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogCreateReqVO; import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogExportReqVO; import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogPageReqVO; -import cn.iocoder.dashboard.modules.system.convert.logger.SysOperateLogConvert; import cn.iocoder.dashboard.modules.system.dal.dataobject.logger.SysOperateLogDO; import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.dashboard.modules.system.dal.mysql.logger.SysOperateLogMapper; import cn.iocoder.dashboard.modules.system.dal.mysql.user.SysUserMapper; import cn.iocoder.dashboard.modules.system.enums.common.SysSexEnum; +import cn.iocoder.dashboard.modules.system.service.logger.impl.SysOperateLogServiceImpl; +import cn.iocoder.dashboard.modules.system.service.user.SysUserService; import cn.iocoder.dashboard.util.RandomUtils; import cn.iocoder.dashboard.util.object.ObjectUtils; import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; import javax.annotation.Resource; import java.lang.reflect.Field; @@ -29,6 +33,8 @@ import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; import java.util.stream.Collectors; import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals; @@ -36,7 +42,8 @@ import static cn.iocoder.dashboard.util.date.DateUtils.buildTime; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; -public class SysOperateLogServiceImplTest extends BaseSpringBootUnitTest { +@Import({SysOperateLogServiceImpl.class}) +public class SysOperateLogServiceImplTest extends BaseDbUnitTest { @Resource private SysOperateLogService sysOperateLogServiceImpl; @@ -47,24 +54,26 @@ public class SysOperateLogServiceImplTest extends BaseSpringBootUnitTest { @Resource private SysUserMapper sysUserMapper; + @MockBean + private SysUserService sysUserService; + @Test - public void testCreateOperateLogAsync() throws InterruptedException { + public void testCreateOperateLogAsync() throws InterruptedException, ExecutionException { String traceId = TracerUtils.getTraceId(); SysOperateLogCreateReqVO reqVO = RandomUtils.randomPojo(SysOperateLogCreateReqVO.class, vo -> { vo.setTraceId(traceId); vo.setUserId(RandomUtil.randomLong(1, Long.MAX_VALUE)); - Map map = new HashMap<>(); - map.put("orderId", 1); + Map map = MapUtil.builder("orderId", (Object) 1).build(); vo.setExts(map); }); // 执行service方法 - sysOperateLogServiceImpl.createOperateLogAsync(reqVO); + Future future = sysOperateLogServiceImpl.createOperateLogAsync(reqVO); // 等异步执行完 - Thread.sleep(2000); + future.get(); // 查询插入的数据 SysOperateLogDO sysOperateLogDO = sysOperateLogMapper.selectOne("trace_id", traceId); @@ -72,11 +81,7 @@ public class SysOperateLogServiceImplTest extends BaseSpringBootUnitTest { // 断言 assertNotNull(sysOperateLogDO); // 断言,忽略基本字段 - assertPojoEquals( - SysOperateLogConvert.INSTANCE.convert(reqVO), - sysOperateLogDO, - getBaseDOFields() - ); + assertPojoEquals(reqVO, sysOperateLogDO); } @@ -165,8 +170,8 @@ public class SysOperateLogServiceImplTest extends BaseSpringBootUnitTest { entity.setStartTime(buildTime(2021, 3, 6)); entity.setResultCode(GlobalErrorCodeConstants.SUCCESS.getCode()); - Map map = new HashMap<>(); - map.put("orderId", 1); + + Map map = MapUtil.builder("orderId", (Object) 1).build(); entity.setExts(map); }); @@ -200,17 +205,4 @@ public class SysOperateLogServiceImplTest extends BaseSpringBootUnitTest { assertEquals(1, list.size()); assertPojoEquals(sysOperateLogDO, list.get(0)); } - - - private static String[] getBaseDOFields() { - Field[] fields = ReflectUtil.getFields(BaseDO.class); - - List collect = Arrays.stream(fields) - .map(Field::getName) - .collect(Collectors.toList()); - collect.add("id"); - - return ArrayUtil.toArray(collect, String.class); - } - } diff --git a/src/test/resources/sql/create_tables.sql b/src/test/resources/sql/create_tables.sql index f4302b4b1..96ac8088a 100644 --- a/src/test/resources/sql/create_tables.sql +++ b/src/test/resources/sql/create_tables.sql @@ -170,9 +170,9 @@ CREATE TABLE IF NOT EXISTS `sys_login_log` ( `result` tinyint(4) NOT NULL, `user_ip` varchar(50) NOT NULL, `user_agent` varchar(512) NOT NULL, - `create_by` varchar(64) DEFAULT '', + `creator` varchar(64) DEFAULT '', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - `update_by` varchar(64) DEFAULT '', + `updater` varchar(64) DEFAULT '', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `deleted` bit(1) NOT NULL DEFAULT '0', PRIMARY KEY (`id`) @@ -199,9 +199,9 @@ CREATE TABLE `sys_operate_log` ( `result_code` int(11) NOT NULL DEFAULT '0', `result_msg` varchar(512) DEFAULT '', `result_data` varchar(4000) DEFAULT '', - `create_by` varchar(64) DEFAULT '', + `creator` varchar(64) DEFAULT '', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - `update_by` varchar(64) DEFAULT '', + `updater` varchar(64) DEFAULT '', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `deleted` bit(1) NOT NULL DEFAULT '0', PRIMARY KEY (`id`) @@ -222,9 +222,9 @@ create table "sys_user" ( "status" tinyint not null default '0', "login_ip" varchar(50) default '', "login_date" timestamp default null, - "create_by" varchar(64) default '', + "creator" varchar(64) default '', "create_time" timestamp not null default current_timestamp, - "update_by" varchar(64) default '', + "updater" varchar(64) default '', "update_time" timestamp not null default current_timestamp, "deleted" bit not null default false, primary key ("id") From 25b0f0b6cb9e4a30932a9596b3693b3d20555bd1 Mon Sep 17 00:00:00 2001 From: zxl Date: Thu, 11 Mar 2021 13:37:42 +0800 Subject: [PATCH 024/126] =?UTF-8?q?user=E7=9A=84h2=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=8C=96sql;user=E6=A8=A1=E5=9D=97service=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/user/SysUserServiceImplTest.java | 170 ++++++++++++++++++ src/test/resources/sql/clean.sql | 1 + src/test/resources/sql/create_tables.sql | 23 +++ 3 files changed, 194 insertions(+) create mode 100644 src/test/java/cn/iocoder/dashboard/modules/system/service/user/SysUserServiceImplTest.java diff --git a/src/test/java/cn/iocoder/dashboard/modules/system/service/user/SysUserServiceImplTest.java b/src/test/java/cn/iocoder/dashboard/modules/system/service/user/SysUserServiceImplTest.java new file mode 100644 index 000000000..ddb8832e3 --- /dev/null +++ b/src/test/java/cn/iocoder/dashboard/modules/system/service/user/SysUserServiceImplTest.java @@ -0,0 +1,170 @@ +package cn.iocoder.dashboard.modules.system.service.user; + +import cn.hutool.core.util.RandomUtil; +import cn.iocoder.dashboard.BaseSpringBootUnitTest; +import cn.iocoder.dashboard.common.enums.CommonStatusEnum; +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserCreateReqVO; +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserImportExcelVO; +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserImportRespVO; +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserUpdateReqVO; +import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.dashboard.modules.system.dal.mysql.dept.SysDeptMapper; +import cn.iocoder.dashboard.modules.system.service.dept.SysDeptService; +import cn.iocoder.dashboard.util.RandomUtils; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Import; +import org.springframework.security.crypto.password.PasswordEncoder; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import static cn.iocoder.dashboard.util.RandomUtils.randomPojo; +import static cn.iocoder.dashboard.util.RandomUtils.randomString; +import static org.junit.jupiter.api.Assertions.*; + +/** + * @Author zxl + * @Date 2021/3/6 14:28 + * @Desc + */ +@Import(PasswordEncoder.class) +public class SysUserServiceImplTest extends BaseSpringBootUnitTest { + + @Autowired + private SysUserService userService; + @Autowired + private PasswordEncoder passwordEncoder; + @Autowired + private SysDeptService deptService; + @Resource + private SysDeptMapper deptMapper; + + + @Test + public void test_creatUser(){ + // 准备参数 + SysUserCreateReqVO reqVO = randomPojo(SysUserCreateReqVO.class,o->{ + o.setDeptId(null); + o.setPostIds(Collections.emptySet()); + o.setSex(1); + o.setPassword(randomString()); + }); + // 调用方法 + Long userId = userService.createUser(reqVO); + // 校验数据是否存在 + assertNotNull(userService.getUser(userId)); + } + + @Test + public void test_updateUser(){ + // 准备参数 + SysUserCreateReqVO reqVO = randomPojo(SysUserCreateReqVO.class,o->{ + o.setDeptId(null); + o.setPostIds(Collections.emptySet()); + o.setSex(1); + o.setPassword(randomString()); + }); + // 先插入一条 + Long userId = userService.createUser(reqVO); + // 准备更新参数:更新手机号 + SysUserUpdateReqVO updateVo = new SysUserUpdateReqVO(); + updateVo.setId(userId); + updateVo.setMobile(RandomUtil.randomNumbers(11)); + // 调用方法、 + userService.updateUser(updateVo); + // 校验结果 + assertEquals(userService.getUser(userId).getMobile(),updateVo.getMobile()); + + } + + @Test + public void test_deleteUser(){ + // 准备参数 + SysUserCreateReqVO reqVO = randomPojo(SysUserCreateReqVO.class,o->{ + o.setDeptId(null); + o.setPostIds(Collections.emptySet()); + o.setSex(1); + o.setPassword(randomString()); + }); + // 先插入一条 + Long userId = userService.createUser(reqVO); + // 调用数据 + userService.deleteUser(userId); + // 校验结果 + assertNull(userService.getUser(userId)); + } + + @Test + public void test_updateUserPassword(){ + // 准备参数 + SysUserCreateReqVO reqVO = randomPojo(SysUserCreateReqVO.class,o->{ + o.setDeptId(null); + o.setPostIds(Collections.emptySet()); + o.setSex(1); + o.setPassword("123"); + }); + // 先插入一条 + Long userId = userService.createUser(reqVO); + String newPassword = RandomUtils.randomString(); + // 调用 + userService.updateUserPassword(userId,newPassword); + // 校验结果 + assertNotEquals(passwordEncoder.encode(newPassword),userService.getUser(userId).getPassword()); + } + + @Test + public void test_importUsers(){ + SysDeptDO dept = randomPojo(SysDeptDO.class, o -> { // 等会查询到 + o.setName("开发部"); + o.setSort("1"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + }); + int depId = deptMapper.insert(dept); + // 准备参数 + List list = new ArrayList<>(); + list.add(randomPojo(SysUserImportExcelVO.class, o->{ + o.setDeptId(dept.getId()); + o.setSex(1); + o.setStatus(1); + })); + list.add(randomPojo(SysUserImportExcelVO.class, o->{ + o.setDeptId(dept.getId()); + o.setSex(1); + o.setStatus(1); + })); + list.add(randomPojo(SysUserImportExcelVO.class, o->{ + o.setDeptId(dept.getId()); + o.setSex(1); + o.setStatus(1); + })); + // 批量插入 + SysUserImportRespVO respVO = userService.importUsers(list,false); + System.out.println(respVO.getCreateUsernames().size()); + // 校验结果 + assertEquals(respVO.getCreateUsernames().size(),3); + // 批量更新 + list.get(0).setSex(0); + SysUserImportRespVO respVOUpdate = userService.importUsers(list,true); + System.out.println(respVOUpdate.getUpdateUsernames().size()); + // 校验结果 + assertEquals(respVOUpdate.getUpdateUsernames().size(),3); + } + + public SysUserCreateReqVO randomUserVO(){ + + SysUserCreateReqVO userVO = new SysUserCreateReqVO(); + userVO.setUsername(RandomUtils.randomString()); + userVO.setNickname(RandomUtils.randomString()); + userVO.setMobile(RandomUtil.randomNumbers(11)); + userVO.setEmail(RandomUtils.randomString()+"@ruoyi.com"); + userVO.setDeptId(null); + userVO.setPostIds(Collections.emptySet()); + + userVO.setPassword(RandomUtils.randomString()); + return userVO; + + } +} diff --git a/src/test/resources/sql/clean.sql b/src/test/resources/sql/clean.sql index 2887b4e9d..9319845ff 100644 --- a/src/test/resources/sql/clean.sql +++ b/src/test/resources/sql/clean.sql @@ -7,3 +7,4 @@ DELETE FROM "sys_dict_data"; DELETE FROM "sys_role"; DELETE FROM "sys_role_menu"; DELETE FROM "sys_menu"; +delete from "sys_user" \ No newline at end of file diff --git a/src/test/resources/sql/create_tables.sql b/src/test/resources/sql/create_tables.sql index 183554519..dae945874 100644 --- a/src/test/resources/sql/create_tables.sql +++ b/src/test/resources/sql/create_tables.sql @@ -100,3 +100,26 @@ CREATE TABLE IF NOT EXISTS "sys_menu" ( "deleted" bit NOT NULL DEFAULT FALSE, PRIMARY KEY ("id") ) COMMENT '菜单权限表'; + +CREATE TABLE IF NOT EXISTS `sys_user` ( +`id` bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY COMMENT '用户ID', +`username` varchar(30) NOT NULL COMMENT '用户账号', +`password` varchar(100) NOT NULL DEFAULT '' COMMENT '密码', +`nickname` varchar(30) NOT NULL COMMENT '用户昵称', +`remark` varchar(500) DEFAULT NULL COMMENT '备注', +`dept_id` bigint(20) DEFAULT NULL COMMENT '部门ID', +`post_ids` varchar(255) DEFAULT NULL COMMENT '岗位编号数组', +`email` varchar(50) DEFAULT '' COMMENT '用户邮箱', +`mobile` varchar(11) DEFAULT '' COMMENT '手机号码', +`sex` tinyint(4) DEFAULT '0' COMMENT '用户性别', +`avatar` varchar(100) DEFAULT '' COMMENT '头像地址', +`status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '帐号状态(0正常 1停用)', +`login_ip` varchar(50) DEFAULT '' COMMENT '最后登录IP', +`login_date` datetime DEFAULT NULL COMMENT '最后登录时间', +`create_by` varchar(64) DEFAULT '' COMMENT '创建者', +`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', +`update_by` varchar(64) DEFAULT '' COMMENT '更新者', +`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', +`deleted` bit NOT NULL DEFAULT FALSE, +PRIMARY KEY (`id`) +) COMMENT='用户信息表'; \ No newline at end of file From 98917630154af5664b5d1cc506144fa82d75358c Mon Sep 17 00:00:00 2001 From: timfruit Date: Fri, 12 Mar 2021 00:01:37 +0800 Subject: [PATCH 025/126] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/doc/InfDbDocController.java | 81 ++++++++++++++----- 1 file changed, 63 insertions(+), 18 deletions(-) diff --git a/src/main/java/cn/iocoder/dashboard/modules/infra/controller/doc/InfDbDocController.java b/src/main/java/cn/iocoder/dashboard/modules/infra/controller/doc/InfDbDocController.java index 0735c4d54..47f748433 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/infra/controller/doc/InfDbDocController.java +++ b/src/main/java/cn/iocoder/dashboard/modules/infra/controller/doc/InfDbDocController.java @@ -1,6 +1,7 @@ package cn.iocoder.dashboard.modules.infra.controller.doc; -import cn.hutool.extra.servlet.ServletUtil; +import cn.hutool.core.lang.UUID; +import cn.iocoder.dashboard.util.servlet.ServletUtils; import cn.smallbun.screw.core.Configuration; import cn.smallbun.screw.core.engine.EngineConfig; import cn.smallbun.screw.core.engine.EngineFileType; @@ -11,17 +12,15 @@ import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; import io.swagger.annotations.Api; import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; -import org.springframework.http.MediaType; +import org.springframework.util.StreamUtils; 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 javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import javax.sql.DataSource; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; +import java.io.*; import java.util.Collections; @Api(tags = "数据库文档") @@ -34,36 +33,82 @@ public class InfDbDocController { private static final String FILE_OUTPUT_DIR = System.getProperty("java.io.tmpdir") + File.separator + "db-doc"; - private static final EngineFileType FILE_OUTPUT_TYPE = EngineFileType.HTML; // 可以设置 Word 或者 Markdown 格式 private static final String DOC_FILE_NAME = "数据库文档"; private static final String DOC_VERSION = "1.0.0"; private static final String DOC_DESCRIPTION = "文档描述"; - @Resource - private DataSource dataSource; @GetMapping("/export-html") - public synchronized void exportHtml(HttpServletResponse response) throws FileNotFoundException { + public void exportHtml(@RequestParam(defaultValue = "true") Boolean deleteFile, + HttpServletResponse response) throws IOException { + EngineFileType fileOutputType=EngineFileType.HTML; + doExportFile(fileOutputType,deleteFile,response); + } + + + + @GetMapping("/export-word") + public void exportWord(@RequestParam(defaultValue = "true") Boolean deleteFile, + HttpServletResponse response) throws IOException { + EngineFileType fileOutputType=EngineFileType.WORD; + doExportFile(fileOutputType,deleteFile,response); + } + + + @GetMapping("/export-markdown") + public void exportMarkdown(@RequestParam(defaultValue = "true") Boolean deleteFile, + HttpServletResponse response) throws IOException { + EngineFileType fileOutputType=EngineFileType.MD; + doExportFile(fileOutputType,deleteFile,response); + } + + private void doExportFile(EngineFileType fileOutputType, Boolean deleteFile, + HttpServletResponse response) throws IOException { + String docFileName=DOC_FILE_NAME+"_"+ UUID.fastUUID().toString(true); + String filePath= doExportFile(fileOutputType,docFileName); + String downloadFileName=DOC_FILE_NAME+fileOutputType.getFileSuffix(); //下载后的文件名 + // 读取,返回 + try (InputStream is=new FileInputStream(filePath)){//处理后关闭文件流才能删除 + ServletUtils.writeAttachment(response,downloadFileName, StreamUtils.copyToByteArray(is)); + } + handleDeleteFile(deleteFile,filePath); + } + + + /** + * 输出文件,返回文件路径 + * @param fileOutputType + * @param fileName + * @return + */ + private String doExportFile(EngineFileType fileOutputType, String fileName){ try (HikariDataSource dataSource = buildDataSource()) { // 创建 screw 的配置 Configuration config = Configuration.builder() .version(DOC_VERSION) // 版本 .description(DOC_DESCRIPTION) // 描述 .dataSource(dataSource) // 数据源 - .engineConfig(buildEngineConfig()) // 引擎配置 + .engineConfig(buildEngineConfig(fileOutputType,fileName)) // 引擎配置 .produceConfig(buildProcessConfig()) // 处理配置 .build(); // 执行 screw,生成数据库文档 new DocumentationExecute(config).execute(); - // 读取,返回 - ServletUtil.write(response, - new FileInputStream(FILE_OUTPUT_DIR + File.separator + DOC_FILE_NAME + FILE_OUTPUT_TYPE.getFileSuffix()), - MediaType.TEXT_HTML_VALUE); + + String filePath=FILE_OUTPUT_DIR + File.separator + fileName + fileOutputType.getFileSuffix(); + return filePath; } } + private void handleDeleteFile(Boolean deleteFile,String filePath){ + if(!deleteFile){ + return; + } + File file=new File(filePath); + file.delete(); + } + /** * 创建数据源 */ @@ -83,13 +128,13 @@ public class InfDbDocController { /** * 创建 screw 的引擎配置 */ - private static EngineConfig buildEngineConfig() { + private static EngineConfig buildEngineConfig(EngineFileType fileOutputType,String docFileName) { return EngineConfig.builder() .fileOutputDir(FILE_OUTPUT_DIR) // 生成文件路径 .openOutputDir(false) // 打开目录 - .fileType(FILE_OUTPUT_TYPE) // 文件类型 + .fileType(fileOutputType) // 文件类型 .produceType(EngineTemplateType.freemarker) // 文件类型 - .fileName(DOC_FILE_NAME) // 自定义文件名称 + .fileName(docFileName) // 自定义文件名称 .build(); } From 0181baa72ba2d983a873c392514944989575659b Mon Sep 17 00:00:00 2001 From: niudehua <657563945@qq.com> Date: Fri, 12 Mar 2021 00:31:23 +0800 Subject: [PATCH 026/126] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20=E4=B8=AA=E4=BA=BA?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E8=AE=BE=E7=BD=AE=20=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/SysUserProfileController.java | 179 +++++++++--------- .../user/vo/user/SysUserProfileRespVO.java | 42 ++++ .../vo/user/SysUserProfileUpdateReqVO.java | 25 +++ .../system/convert/auth/SysAuthConvert.java | 24 ++- .../system/convert/user/SysUserConvert.java | 17 +- .../system/enums/SysErrorCodeConstants.java | 2 + .../system/service/user/SysUserService.java | 32 +++- .../service/user/SysUserServiceImpl.java | 84 +++++++- src/main/resources/application-dev.yaml | 2 +- src/main/resources/application-local.yaml | 2 +- 10 files changed, 300 insertions(+), 109 deletions(-) create mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserProfileRespVO.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserProfileUpdateReqVO.java diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserProfileController.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserProfileController.java index bd84ba60c..40a99910f 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserProfileController.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserProfileController.java @@ -1,92 +1,99 @@ package cn.iocoder.dashboard.modules.system.controller.user; +import cn.iocoder.dashboard.common.pojo.CommonResult; +import cn.iocoder.dashboard.framework.security.core.LoginUser; +import cn.iocoder.dashboard.framework.security.core.util.SecurityFrameworkUtils; +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserProfileRespVO; +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserProfileUpdateReqVO; +import cn.iocoder.dashboard.modules.system.convert.auth.SysAuthConvert; +import cn.iocoder.dashboard.modules.system.convert.user.SysUserConvert; +import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysRoleDO; +import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService; +import cn.iocoder.dashboard.modules.system.service.permission.SysRoleService; +import cn.iocoder.dashboard.modules.system.service.user.SysUserService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author niudehua + */ +@Api(tags = "用户个人中心") +@RestController +@RequestMapping("/system/user/profile") public class SysUserProfileController { -// /** -// * 个人信息 -// */ -// @GetMapping -// public AjaxResult profile() -// { -// LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest()); -// SysUser user = loginUser.getUser(); -// AjaxResult ajax = AjaxResult.success(user); -// ajax.put("roleGroup", userService.selectUserRoleGroup(loginUser.getUsername())); -// ajax.put("postGroup", userService.selectUserPostGroup(loginUser.getUsername())); -// return ajax; -// } -// -// /** -// * 修改用户 -// */ -// @Log(title = "个人信息", businessType = BusinessType.UPDATE) -// @PutMapping -// public AjaxResult updateProfile(@RequestBody SysUser user) -// { -// if (userService.updateUserProfile(user) > 0) -// { -// LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest()); -// // 更新缓存用户信息 -// loginUser.getUser().setNickName(user.getNickName()); -// loginUser.getUser().setPhonenumber(user.getPhonenumber()); -// loginUser.getUser().setEmail(user.getEmail()); -// loginUser.getUser().setSex(user.getSex()); -// tokenService.setLoginUser(loginUser); -// return AjaxResult.success(); -// } -// return AjaxResult.error("修改个人信息异常,请联系管理员"); -// } -// -// /** -// * 重置密码 -// */ -// @Log(title = "个人信息", businessType = BusinessType.UPDATE) -// @PutMapping("/updatePwd") -// public AjaxResult updatePwd(String oldPassword, String newPassword) -// { -// LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest()); -// String userName = loginUser.getUsername(); -// String password = loginUser.getPassword(); -// if (!SecurityUtils.matchesPassword(oldPassword, password)) -// { -// return AjaxResult.error("修改密码失败,旧密码错误"); -// } -// if (SecurityUtils.matchesPassword(newPassword, password)) -// { -// return AjaxResult.error("新密码不能与旧密码相同"); -// } -// if (userService.resetUserPwd(userName, SecurityUtils.encryptPassword(newPassword)) > 0) -// { -// // 更新缓存用户密码 -// loginUser.getUser().setPassword(SecurityUtils.encryptPassword(newPassword)); -// tokenService.setLoginUser(loginUser); -// return AjaxResult.success(); -// } -// return AjaxResult.error("修改密码异常,请联系管理员"); -// } -// -// /** -// * 头像上传 -// */ -// @Log(title = "用户头像", businessType = BusinessType.UPDATE) -// @PostMapping("/avatar") -// public AjaxResult avatar(@RequestParam("avatarfile") MultipartFile file) throws IOException -// { -// if (!file.isEmpty()) -// { -// LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest()); -// String avatar = FileUploadUtils.upload(RuoYiConfig.getAvatarPath(), file); -// if (userService.updateUserAvatar(loginUser.getUsername(), avatar)) -// { -// AjaxResult ajax = AjaxResult.success(); -// ajax.put("imgUrl", avatar); -// // 更新缓存用户头像 -// loginUser.getUser().setAvatar(avatar); -// tokenService.setLoginUser(loginUser); -// return ajax; -// } -// } -// return AjaxResult.error("上传图片异常,请联系管理员"); -// } + @Resource + private SysUserService userService; + @Resource + private SysPermissionService permissionService; + @Resource + private SysRoleService roleService; + /** + * 个人信息 + * + * @return 个人信息详情 + */ + @ApiOperation("获得登录用户信息") + @GetMapping("/get") + public CommonResult profile() { + LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); + // 获取用户信息 + assert loginUser != null; + Long userId = loginUser.getId(); + SysUserDO user = userService.getUser(userId); + SysUserProfileRespVO userProfileRespVO = SysUserConvert.INSTANCE.convert03(user); + List userRoles = roleService.listRolesFromCache(permissionService.listUserRoleIs(userId)); + userProfileRespVO.setRoles(userRoles.stream().map(SysUserConvert.INSTANCE::convert).collect(Collectors.toSet())); + return CommonResult.success(userProfileRespVO); + } + + /** + * 修改个人信息 + * + * @param reqVO 个人信息更新 reqVO + * @param request HttpServletRequest + * @return 修改结果 + */ + @ApiOperation("修改用户个人信息") + @PostMapping("/update") + public CommonResult updateProfile(@RequestBody SysUserProfileUpdateReqVO reqVO, HttpServletRequest request) { + if (userService.updateUserProfile(reqVO) > 0) { + SecurityFrameworkUtils.setLoginUser(SysAuthConvert.INSTANCE.convert(reqVO), request); + return CommonResult.success(true); + } + return CommonResult.success(false); + } + + /** + * 上传用户个人头像 + * + * @param file 头像文件 + * @return 上传结果 + */ + @ApiOperation("上传用户个人头像") + @PostMapping("/uploadAvatar") + public CommonResult uploadAvatar(@RequestParam("avatarFile") MultipartFile file) { + if (!file.isEmpty()) { + LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); + assert loginUser != null; + if (userService.updateAvatar(loginUser.getId(), file) > 0) { + return CommonResult.success(true); + } + } + return CommonResult.success(false); + } } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserProfileRespVO.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserProfileRespVO.java new file mode 100644 index 000000000..a081dea65 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserProfileRespVO.java @@ -0,0 +1,42 @@ +package cn.iocoder.dashboard.modules.system.controller.user.vo.user; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.util.Set; + + +@ApiModel("用户个人中心信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class SysUserProfileRespVO extends SysUserRespVO { + + @ApiModelProperty(value = "旧密码", required = true, example = "123456") + private String oldPassword; + + @ApiModelProperty(value = "新密码", required = true, example = "123456") + private String newPassword; + /** + * 所属角色 + */ + @ApiModelProperty(value = "所属角色", required = true, example = "123456") + private Set roles; + + @ApiModel("角色") + @Data + public static class Role { + + @ApiModelProperty(value = "角色编号", required = true, example = "1") + private Long id; + + @ApiModelProperty(value = "角色名称", required = true, example = "普通角色") + private String name; + + } +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserProfileUpdateReqVO.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserProfileUpdateReqVO.java new file mode 100644 index 000000000..d3185b242 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserProfileUpdateReqVO.java @@ -0,0 +1,25 @@ +package cn.iocoder.dashboard.modules.system.controller.user.vo.user; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotNull; + +@ApiModel("用户更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class SysUserProfileUpdateReqVO extends SysUserBaseVO { + + @ApiModelProperty(value = "用户编号", required = true, example = "1024") + @NotNull(message = "用户编号不能为空") + private Long id; + + @ApiModelProperty(value = "旧密码", required = true, example = "123456") + private String oldPassword; + + @ApiModelProperty(value = "新密码", required = true, example = "654321") + private String newPassword; + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/convert/auth/SysAuthConvert.java b/src/main/java/cn/iocoder/dashboard/modules/system/convert/auth/SysAuthConvert.java index 1c34fe407..e474ce7b1 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/convert/auth/SysAuthConvert.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/convert/auth/SysAuthConvert.java @@ -3,6 +3,7 @@ package cn.iocoder.dashboard.modules.system.convert.auth; import cn.iocoder.dashboard.framework.security.core.LoginUser; import cn.iocoder.dashboard.modules.system.controller.auth.vo.auth.SysAuthMenuRespVO; import cn.iocoder.dashboard.modules.system.controller.auth.vo.auth.SysAuthPermissionInfoRespVO; +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserProfileUpdateReqVO; import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysMenuDO; import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysRoleDO; import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; @@ -13,26 +14,33 @@ import org.mapstruct.Mapping; import org.mapstruct.factory.Mappers; import org.slf4j.LoggerFactory; -import java.util.*; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; @Mapper public interface SysAuthConvert { SysAuthConvert INSTANCE = Mappers.getMapper(SysAuthConvert.class); - @Mapping(source = "updateTime", target = "updateTime", ignore = true) // 字段相同,但是含义不同,忽略 + @Mapping(source = "updateTime", target = "updateTime", ignore = true) + // 字段相同,但是含义不同,忽略 LoginUser convert(SysUserDO bean); default SysAuthPermissionInfoRespVO convert(SysUserDO user, List roleList, List menuList) { return SysAuthPermissionInfoRespVO.builder() - .user(SysAuthPermissionInfoRespVO.UserVO.builder().nickname(user.getNickname()).avatar(user.getAvatar()).build()) - .roles(CollectionUtils.convertSet(roleList, SysRoleDO::getCode)) - .permissions(CollectionUtils.convertSet(menuList, SysMenuDO::getPermission)) - .build(); + .user(SysAuthPermissionInfoRespVO.UserVO.builder().nickname(user.getNickname()).avatar(user.getAvatar()).build()) + .roles(CollectionUtils.convertSet(roleList, SysRoleDO::getCode)) + .permissions(CollectionUtils.convertSet(menuList, SysMenuDO::getPermission)) + .build(); } SysAuthMenuRespVO convertTreeNode(SysMenuDO menu); + LoginUser convert(SysUserProfileUpdateReqVO reqVO); + /** * 将菜单列表,构建成菜单树 * @@ -47,12 +55,12 @@ public interface SysAuthConvert { Map treeNodeMap = new LinkedHashMap<>(); menuList.forEach(menu -> treeNodeMap.put(menu.getId(), SysAuthConvert.INSTANCE.convertTreeNode(menu))); // 处理父子关系 - treeNodeMap.values().stream().filter(node -> !node.getParentId().equals(MenuIdEnum.ROOT.getId())).forEach((childNode) -> { + treeNodeMap.values().stream().filter(node -> !node.getParentId().equals(MenuIdEnum.ROOT.getId())).forEach(childNode -> { // 获得父节点 SysAuthMenuRespVO parentNode = treeNodeMap.get(childNode.getParentId()); if (parentNode == null) { LoggerFactory.getLogger(getClass()).error("[buildRouterTree][resource({}) 找不到父资源({})]", - childNode.getId(), childNode.getParentId()); + childNode.getId(), childNode.getParentId()); return; } // 将自己添加到父节点中 diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/convert/user/SysUserConvert.java b/src/main/java/cn/iocoder/dashboard/modules/system/convert/user/SysUserConvert.java index b8ff73671..af72c9c2b 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/convert/user/SysUserConvert.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/convert/user/SysUserConvert.java @@ -1,7 +1,14 @@ package cn.iocoder.dashboard.modules.system.convert.user; -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.*; +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserCreateReqVO; +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserExcelVO; +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserImportExcelVO; +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserPageItemRespVO; +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserProfileRespVO; +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserProfileUpdateReqVO; +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserUpdateReqVO; import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysRoleDO; import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; @@ -23,4 +30,12 @@ public interface SysUserConvert { SysUserDO convert(SysUserImportExcelVO bean); + SysUserProfileRespVO convert03(SysUserDO bean); + + SysUserProfileRespVO.Role convert(SysRoleDO bean); + + SysUserDO convert(SysUserProfileUpdateReqVO bean); + + + } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java b/src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java index 21d3e8910..3f4214325 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java @@ -40,6 +40,7 @@ public interface SysErrorCodeConstants { ErrorCode USER_EMAIL_EXISTS = new ErrorCode(1002004002, "邮箱已经存在"); ErrorCode USER_NOT_EXISTS = new ErrorCode(1002004003, "用户不存在"); ErrorCode USER_IMPORT_LIST_IS_EMPTY = new ErrorCode(1002004004, "导入用户数据不能为空!"); + ErrorCode USER_PASSWORD_FAILED = new ErrorCode(1002004005, "用户密码校验失败"); // ========== 部门模块 1002005000 ========== ErrorCode DEPT_NAME_DUPLICATE = new ErrorCode(1002004001, "已经存在该名字的部门"); @@ -74,5 +75,6 @@ public interface SysErrorCodeConstants { // ========== 文件 1002009000 ========== ErrorCode FILE_PATH_EXISTS = new ErrorCode(1002009001, "文件路径已经存在"); + ErrorCode FILE_UPLOAD_FAILED = new ErrorCode(1002009002, "文件上传失败"); } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserService.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserService.java index 3de54f34b..e8097590f 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserService.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserService.java @@ -2,9 +2,16 @@ package cn.iocoder.dashboard.modules.system.service.user; import cn.hutool.core.collection.CollUtil; import cn.iocoder.dashboard.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.*; +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserCreateReqVO; +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserExportReqVO; +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserImportExcelVO; +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserImportRespVO; +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserPageReqVO; +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserProfileUpdateReqVO; +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserUpdateReqVO; import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.dashboard.util.collection.CollectionUtils; +import org.springframework.web.multipart.MultipartFile; import java.util.Collection; import java.util.HashMap; @@ -102,6 +109,14 @@ public interface SysUserService { */ void updateUser(SysUserUpdateReqVO reqVO); + /** + * 修改用户个人信息 + * + * @param reqVO 用户个人信息 + * @return 修改结果 + */ + int updateUserProfile(SysUserProfileUpdateReqVO reqVO); + /** * 删除用户 * @@ -112,7 +127,7 @@ public interface SysUserService { /** * 修改密码 * - * @param id 用户编号 + * @param id 用户编号 * @param password 密码 */ void updateUserPassword(Long id, String password); @@ -120,7 +135,7 @@ public interface SysUserService { /** * 修改密码 * - * @param id 用户编号 + * @param id 用户编号 * @param status 状态 */ void updateUserStatus(Long id, Integer status); @@ -128,12 +143,21 @@ public interface SysUserService { /** * 批量导入用户 * - * @param importUsers 导入用户列表 + * @param importUsers 导入用户列表 * @param isUpdateSupport 是否支持更新 * @return 导入结果 */ SysUserImportRespVO importUsers(List importUsers, boolean isUpdateSupport); + /** + * 更新用户头像 + * + * @param id 用户 id + * @param avatarFile 头像文件 + * @return 更新结果 + */ + int updateAvatar(Long id, MultipartFile avatarFile); + // // /** // * 修改用户基本信息 diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserServiceImpl.java index d97d2c00f..c1fc828a0 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserServiceImpl.java @@ -1,17 +1,25 @@ package cn.iocoder.dashboard.modules.system.service.user; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.StrUtil; import cn.iocoder.dashboard.common.enums.CommonStatusEnum; import cn.iocoder.dashboard.common.exception.ServiceException; import cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil; import cn.iocoder.dashboard.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.*; +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserCreateReqVO; +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserExportReqVO; +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserImportExcelVO; +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserImportRespVO; +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserPageReqVO; +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserProfileUpdateReqVO; +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserUpdateReqVO; import cn.iocoder.dashboard.modules.system.convert.user.SysUserConvert; -import cn.iocoder.dashboard.modules.system.dal.mysql.user.SysUserMapper; import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysPostDO; import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.dashboard.modules.system.dal.mysql.user.SysUserMapper; +import cn.iocoder.dashboard.modules.system.service.common.SysFileService; import cn.iocoder.dashboard.modules.system.service.dept.SysDeptService; import cn.iocoder.dashboard.modules.system.service.dept.SysPostService; import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService; @@ -20,9 +28,17 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; -import java.util.*; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; @@ -49,6 +65,9 @@ public class SysUserServiceImpl implements SysUserService { @Resource private PasswordEncoder passwordEncoder; + @Resource + private SysFileService fileService; + // /** // * 根据条件分页查询用户列表 // * @@ -108,7 +127,7 @@ public class SysUserServiceImpl implements SysUserService { return Collections.emptySet(); } Set deptIds = CollectionUtils.convertSet(deptService.listDeptsByParentIdFromCache( - deptId, true), SysDeptDO::getId); + deptId, true), SysDeptDO::getId); deptIds.add(deptId); // 包括自身 return deptIds; } @@ -117,7 +136,7 @@ public class SysUserServiceImpl implements SysUserService { public Long createUser(SysUserCreateReqVO reqVO) { // 校验正确性 this.checkCreateOrUpdate(null, reqVO.getUsername(), reqVO.getMobile(), reqVO.getEmail(), - reqVO.getDeptId(), reqVO.getPostIds()); + reqVO.getDeptId(), reqVO.getPostIds()); // 插入用户 SysUserDO user = SysUserConvert.INSTANCE.convert(reqVO); user.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 默认开启 @@ -130,12 +149,29 @@ public class SysUserServiceImpl implements SysUserService { public void updateUser(SysUserUpdateReqVO reqVO) { // 校验正确性 this.checkCreateOrUpdate(reqVO.getId(), reqVO.getUsername(), reqVO.getMobile(), reqVO.getEmail(), - reqVO.getDeptId(), reqVO.getPostIds()); + reqVO.getDeptId(), reqVO.getPostIds()); // 更新用户 SysUserDO updateObj = SysUserConvert.INSTANCE.convert(reqVO); userMapper.updateById(updateObj); } + @Override + public int updateUserProfile(SysUserProfileUpdateReqVO reqVO) { + // 校验正确性 + this.checkCreateOrUpdate(reqVO.getId(), reqVO.getUsername(), reqVO.getMobile(), reqVO.getEmail(), + reqVO.getDeptId(), reqVO.getPostIds()); + + SysUserDO updateObj = SysUserConvert.INSTANCE.convert(reqVO); + // 校验旧密码 + if (checkOldPassword(reqVO.getId(), reqVO.getOldPassword(), reqVO.getNewPassword())) { + return userMapper.updateById(updateObj); + } + + String encode = passwordEncoder.encode(reqVO.getNewPassword()); + updateObj.setPassword(encode); + return userMapper.updateById(updateObj); + } + @Override public void deleteUser(Long id) { // 校验用户存在 @@ -278,6 +314,21 @@ public class SysUserServiceImpl implements SysUserService { }); } + private boolean checkOldPassword(Long id, String oldPassword, String newPassword) { + if (id == null || StrUtil.isBlank(oldPassword) || StrUtil.isBlank(newPassword)) { + return true; + } + SysUserDO user = userMapper.selectById(id); + if (user == null) { + throw ServiceExceptionUtil.exception(USER_NOT_EXISTS); + } + + if (!passwordEncoder.matches(oldPassword, user.getPassword())) { + throw ServiceExceptionUtil.exception(USER_PASSWORD_FAILED); + } + return false; + } + @Override @Transactional // 添加事务,异常则回滚所有导入 public SysUserImportRespVO importUsers(List importUsers, boolean isUpdateSupport) { @@ -285,12 +336,12 @@ public class SysUserServiceImpl implements SysUserService { throw ServiceExceptionUtil.exception(USER_IMPORT_LIST_IS_EMPTY); } SysUserImportRespVO respVO = SysUserImportRespVO.builder().createUsernames(new ArrayList<>()) - .updateUsernames(new ArrayList<>()).failureUsernames(new LinkedHashMap<>()).build(); + .updateUsernames(new ArrayList<>()).failureUsernames(new LinkedHashMap<>()).build(); importUsers.forEach(importUser -> { // 校验,判断是否有不符合的原因 try { checkCreateOrUpdate(null, null, importUser.getMobile(), importUser.getEmail(), - importUser.getDeptId(), null); + importUser.getDeptId(), null); } catch (ServiceException ex) { respVO.getFailureUsernames().put(importUser.getUsername(), ex.getMessage()); return; @@ -316,4 +367,21 @@ public class SysUserServiceImpl implements SysUserService { return respVO; } + @Override + public int updateAvatar(Long id, MultipartFile avatarFile) { + this.checkUserExists(id); + // 存储文件 + String avatar = null; + try { + avatar = fileService.createFile(avatarFile.getOriginalFilename(), IoUtil.readBytes(avatarFile.getInputStream())); + } catch (IOException e) { + throw ServiceExceptionUtil.exception(FILE_UPLOAD_FAILED); + } + // 更新路径 + SysUserDO sysUserDO = new SysUserDO(); + sysUserDO.setId(id); + sysUserDO.setAvatar(avatar); + return userMapper.updateById(sysUserDO); + } + } diff --git a/src/main/resources/application-dev.yaml b/src/main/resources/application-dev.yaml index dbf2ad53b..c9c40e739 100644 --- a/src/main/resources/application-dev.yaml +++ b/src/main/resources/application-dev.yaml @@ -152,7 +152,7 @@ yudao: width: 160 height: 60 file: - base-path: http://127.0.0.1:${server.port}/${yudao.web.api-prefix}/file/get/ + base-path: http://127.0.0.1:${server.port}${yudao.web.api-prefix}/system/file/get/ codegen: base-package: ${yudao.info.base-package} db-schemas: ${spring.datasource.name} diff --git a/src/main/resources/application-local.yaml b/src/main/resources/application-local.yaml index 537156cf7..500eb7b51 100644 --- a/src/main/resources/application-local.yaml +++ b/src/main/resources/application-local.yaml @@ -152,7 +152,7 @@ yudao: width: 160 height: 60 file: - base-path: http://127.0.0.1:${server.port}/${yudao.web.api-prefix}/file/get/ + base-path: http://127.0.0.1:${server.port}${yudao.web.api-prefix}/system/file/get/ codegen: base-package: ${yudao.info.base-package} db-schemas: ${spring.datasource.name} From 8683401c802e1e98d9de8f5427a8f1cdf4b0c4a5 Mon Sep 17 00:00:00 2001 From: dxyx <5676377+dxyx@user.noreply.gitee.com> Date: Fri, 12 Mar 2021 09:31:15 +0800 Subject: [PATCH 027/126] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E7=94=B1=E4=BA=8Emyb?= =?UTF-8?q?atis-plus=E6=97=A0=E6=B3=95=E8=BF=87=E6=BB=A4=E8=BD=AF=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E5=AF=BC=E8=87=B4=E8=A7=92=E8=89=B2=E5=8E=BB=E6=8E=89?= =?UTF-8?q?=E8=8F=9C=E5=8D=95=E7=BC=93=E5=AD=98=E6=9C=AA=E5=88=B7=E6=96=B0?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98=E3=80=82=20=E8=A7=A3=E5=86=B3?= =?UTF-8?q?=E5=8E=BB=E6=8E=89=E8=8F=9C=E5=8D=95=E7=BC=93=E5=AD=98=E6=9C=AA?= =?UTF-8?q?=E5=88=B7=E6=96=B0=E7=9A=84=E9=97=AE=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/dal/mysql/permission/SysRoleMenuMapper.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/permission/SysRoleMenuMapper.java b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/permission/SysRoleMenuMapper.java index b93bb5917..e6bdc56cd 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/permission/SysRoleMenuMapper.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/permission/SysRoleMenuMapper.java @@ -33,9 +33,7 @@ public interface SysRoleMenuMapper extends BaseMapperX { .in("menu_id", menuIds)); } - default boolean selectExistsByUpdateTimeAfter(Date maxUpdateTime) { - return selectOne(new QueryWrapper().select("id") - .gt("update_time", maxUpdateTime).last("LIMIT 1")) != null; - } + @Select("select id from sys_role_menu where update_time > #{maxUpdateTime} limit 1") + List selectExistsByUpdateTimeAfter(Date maxUpdateTime); } From bbea33e72efc6612597e6beac0260d3b140164d0 Mon Sep 17 00:00:00 2001 From: dxyx <5676377+dxyx@user.noreply.gitee.com> Date: Fri, 12 Mar 2021 09:34:01 +0800 Subject: [PATCH 028/126] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E7=94=B1=E4=BA=8Emyb?= =?UTF-8?q?atis-plus=E6=97=A0=E6=B3=95=E8=BF=87=E6=BB=A4=E8=BD=AF=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E5=AF=BC=E8=87=B4=E8=A7=92=E8=89=B2=E5=8E=BB=E6=8E=89?= =?UTF-8?q?=E8=8F=9C=E5=8D=95=E7=BC=93=E5=AD=98=E6=9C=AA=E5=88=B7=E6=96=B0?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98=E3=80=82=20=E8=A7=A3=E5=86=B3?= =?UTF-8?q?=E7=94=B1=E4=BA=8Emybatis-plus=E6=97=A0=E6=B3=95=E8=BF=87?= =?UTF-8?q?=E6=BB=A4=E8=BD=AF=E5=88=A0=E9=99=A4=E5=AF=BC=E8=87=B4=E8=A7=92?= =?UTF-8?q?=E8=89=B2=E5=8E=BB=E6=8E=89=E8=8F=9C=E5=8D=95=E7=BC=93=E5=AD=98?= =?UTF-8?q?=E6=9C=AA=E5=88=B7=E6=96=B0=E7=9A=84=E9=97=AE=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/permission/impl/SysPermissionServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysPermissionServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysPermissionServiceImpl.java index 9f48af9f5..835fb8961 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysPermissionServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysPermissionServiceImpl.java @@ -123,7 +123,7 @@ public class SysPermissionServiceImpl implements SysPermissionService { if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据 log.info("[loadRoleMenuIfUpdate][首次加载全量角色与菜单的关联]"); } else { // 判断数据库中是否有更新的角色与菜单的关联 - if (!roleMenuMapper.selectExistsByUpdateTimeAfter(maxUpdateTime)) { + if (roleMenuMapper.selectExistsByUpdateTimeAfter(maxUpdateTime).size() == 0) { return null; } log.info("[loadRoleMenuIfUpdate][增量加载全量角色与菜单的关联]"); From 225664550f3cd23b4c26a9aded828cf39c2ec0eb Mon Sep 17 00:00:00 2001 From: zengzefeng <986510453@qq.com> Date: Fri, 12 Mar 2021 11:32:04 +0800 Subject: [PATCH 029/126] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E7=9F=AD=E4=BF=A1?= =?UTF-8?q?=E9=80=9A=E8=BF=87redis=20stream=E5=BC=82=E6=AD=A5=E5=8F=91?= =?UTF-8?q?=E9=80=81=EF=BC=8C=E5=AE=9E=E7=8E=B0=E7=9F=AD=E4=BF=A1callback?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sql/sms.sql | 19 +- .../dashboard/DashboardApplication.java | 30 +-- .../redis/core/util/RedisStreamUtils.java | 29 +++ .../config/SecurityConfiguration.java | 1 + .../sms/client/AbstractSmsClient.java | 18 +- .../framework/sms/client/AliyunSmsClient.java | 113 ---------- .../sms/client/HadCallbackSmsClient.java | 25 --- .../client/NeedQuerySendResultSmsClient.java | 24 -- .../framework/sms/client/SmsClient.java | 13 +- .../sms/client/impl/ali/AliyunSmsClient.java | 212 ++++++++++++++++++ .../{ => impl/yunpian}/YunpianSmsClient.java | 102 ++++++--- .../framework/sms/core/SmsClientFactory.java | 31 ++- .../framework/sms/core/SmsResult.java | 5 - .../framework/sms/core/SmsResultDetail.java | 10 + .../sms/core/enums/SmsChannelEnum.java | 2 +- .../controller/redis/RedisController.java | 136 +++++------ .../sms/SmsDefaultCallbackController.java | 32 ++- .../mysql/dao/sms/SysSmsQueryLogMapper.java | 13 +- .../mysql/dataobject/sms/SysSmsChannelDO.java | 5 - .../dataobject/sms/SysSmsQueryLogDO.java | 26 +-- .../system/dal/redis/RedisKeyConstants.java | 2 +- .../mq/consumer/sms/SmsSendConsumer.java | 41 ---- .../system/mq/message/sms/SmsSendMessage.java | 25 --- .../system/mq/producer/sms/SmsProducer.java | 32 --- .../consumer/dept/SysDeptRefreshConsumer.java | 4 +- .../dict/SysDictDataRefreshConsumer.java | 4 +- .../permission/SysMenuRefreshConsumer.java | 4 +- .../SysRoleMenuRefreshConsumer.java | 4 +- .../permission/SysRoleRefreshConsumer.java | 4 +- .../mq/consumer/sms/SmsSendConsumer.java | 56 +++++ .../message/dept/SysDeptRefreshMessage.java | 2 +- .../dict/SysDictDataRefreshMessage.java | 2 +- .../permission/SysMenuRefreshMessage.java | 2 +- .../permission/SysRoleMenuRefreshMessage.java | 2 +- .../permission/SysRoleRefreshMessage.java | 2 +- .../mq/producer/dept/SysDeptProducer.java | 4 +- .../mq/producer/dict/SysDictDataProducer.java | 4 +- .../producer/permission/SysMenuProducer.java | 4 +- .../permission/SysPermissionProducer.java | 4 +- .../producer/permission/SysRoleProducer.java | 4 +- .../redis/mq/producer/sms/SmsProducer.java | 31 +++ .../redis/stream/StreamConsumerRunner.java | 93 ++++++++ .../redis/stream/sms/SmsSendMessage.java | 16 ++ .../stream/sms/SmsSendStreamConsumer.java | 43 ++++ .../stream/sms/SmsSendStreamProducer.java | 35 +++ .../service/dept/impl/SysDeptServiceImpl.java | 2 +- .../dict/impl/SysDictDataServiceImpl.java | 2 +- .../permission/impl/SysMenuServiceImpl.java | 2 +- .../impl/SysPermissionServiceImpl.java | 2 +- .../permission/impl/SysRoleServiceImpl.java | 2 +- .../service/sms/SysSmsChannelService.java | 2 + .../service/sms/SysSmsQueryLogService.java | 10 +- .../system/service/sms/SysSmsService.java | 21 +- .../sms/impl/SysSmsQueryLogServiceImpl.java | 26 ++- .../sms/impl/SysSmsSendLogServiceImpl.java | 5 +- .../service/sms/impl/SysSmsServiceImpl.java | 25 ++- 56 files changed, 877 insertions(+), 492 deletions(-) create mode 100644 src/main/java/cn/iocoder/dashboard/framework/redis/core/util/RedisStreamUtils.java delete mode 100644 src/main/java/cn/iocoder/dashboard/framework/sms/client/AliyunSmsClient.java delete mode 100644 src/main/java/cn/iocoder/dashboard/framework/sms/client/HadCallbackSmsClient.java delete mode 100644 src/main/java/cn/iocoder/dashboard/framework/sms/client/NeedQuerySendResultSmsClient.java create mode 100644 src/main/java/cn/iocoder/dashboard/framework/sms/client/impl/ali/AliyunSmsClient.java rename src/main/java/cn/iocoder/dashboard/framework/sms/client/{ => impl/yunpian}/YunpianSmsClient.java (53%) delete mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/sms/SmsSendConsumer.java delete mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/mq/message/sms/SmsSendMessage.java delete mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/sms/SmsProducer.java rename src/main/java/cn/iocoder/dashboard/modules/system/{ => redis}/mq/consumer/dept/SysDeptRefreshConsumer.java (82%) rename src/main/java/cn/iocoder/dashboard/modules/system/{ => redis}/mq/consumer/dict/SysDictDataRefreshConsumer.java (82%) rename src/main/java/cn/iocoder/dashboard/modules/system/{ => redis}/mq/consumer/permission/SysMenuRefreshConsumer.java (81%) rename src/main/java/cn/iocoder/dashboard/modules/system/{ => redis}/mq/consumer/permission/SysRoleMenuRefreshConsumer.java (82%) rename src/main/java/cn/iocoder/dashboard/modules/system/{ => redis}/mq/consumer/permission/SysRoleRefreshConsumer.java (81%) create mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/consumer/sms/SmsSendConsumer.java rename src/main/java/cn/iocoder/dashboard/modules/system/{ => redis}/mq/message/dept/SysDeptRefreshMessage.java (81%) rename src/main/java/cn/iocoder/dashboard/modules/system/{ => redis}/mq/message/dict/SysDictDataRefreshMessage.java (82%) rename src/main/java/cn/iocoder/dashboard/modules/system/{ => redis}/mq/message/permission/SysMenuRefreshMessage.java (80%) rename src/main/java/cn/iocoder/dashboard/modules/system/{ => redis}/mq/message/permission/SysRoleMenuRefreshMessage.java (81%) rename src/main/java/cn/iocoder/dashboard/modules/system/{ => redis}/mq/message/permission/SysRoleRefreshMessage.java (80%) rename src/main/java/cn/iocoder/dashboard/modules/system/{ => redis}/mq/producer/dept/SysDeptProducer.java (80%) rename src/main/java/cn/iocoder/dashboard/modules/system/{ => redis}/mq/producer/dict/SysDictDataProducer.java (80%) rename src/main/java/cn/iocoder/dashboard/modules/system/{ => redis}/mq/producer/permission/SysMenuProducer.java (79%) rename src/main/java/cn/iocoder/dashboard/modules/system/{ => redis}/mq/producer/permission/SysPermissionProducer.java (79%) rename src/main/java/cn/iocoder/dashboard/modules/system/{ => redis}/mq/producer/permission/SysRoleProducer.java (79%) create mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/producer/sms/SmsProducer.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/redis/stream/StreamConsumerRunner.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/redis/stream/sms/SmsSendMessage.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/redis/stream/sms/SmsSendStreamConsumer.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/redis/stream/sms/SmsSendStreamProducer.java diff --git a/sql/sms.sql b/sql/sms.sql index 027052779..6d9c3c8e5 100644 --- a/sql/sms.sql +++ b/sql/sms.sql @@ -12,7 +12,6 @@ CREATE TABLE `sms_channel` `code` varchar(50) NOT NULL COMMENT '编码(来自枚举类 阿里、华为、七牛等)', `api_key` varchar(100) NOT NULL COMMENT '账号id', `api_secret` varchar(100) NOT NULL COMMENT '账号秘钥', - `had_callback` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否拥有回调函数', `callback_url` varchar(100) NOT NULL default '' COMMENT '回调请求路径', `api_signature_id` varchar(100) NOT NULL COMMENT '实际渠道签名唯一标识', `name` varchar(50) NOT NULL COMMENT '名称', @@ -61,7 +60,7 @@ CREATE TABLE `sms_template` ) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8mb4 COMMENT ='短信模板'; - +/* -- ---------------------------- -- Table structure for sms_query_log -- ---------------------------- @@ -73,7 +72,7 @@ CREATE TABLE `sms_query_log` `channel_code` varchar(50) NOT NULL COMMENT '短信渠道编码(来自枚举类)', `channel_id` bigint(20) NOT NULL COMMENT '短信渠道id', `template_code` varchar(50) NOT NULL COMMENT '渠道编码', - `phones` varchar(2000) NOT NULL COMMENT '手机号(数组json字符串)', + `phone` char(11) NOT NULL COMMENT '手机号', `content` varchar(1000) NOT NULL DEFAULT '' COMMENT '内容', `send_result_param` varchar(200) NOT NULL DEFAULT '' COMMENT '查询短信发送结果的参数', `send_status` tinyint(1) NOT NULL DEFAULT 2 COMMENT '发送状态(0本地异步中 1发送请求失败 2发送请求成功)', @@ -84,24 +83,26 @@ CREATE TABLE `sms_query_log` PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 1 - DEFAULT CHARSET = utf8mb4 COMMENT ='短信请求日志'; + DEFAULT CHARSET = utf8mb4 COMMENT ='短信请求日志';*/ -- ---------------------------- -- Table structure for sms_log -- ---------------------------- -DROP TABLE IF EXISTS `sms_send_log`; -CREATE TABLE `sms_send_log` +DROP TABLE IF EXISTS `sms_query_log`; +CREATE TABLE `sms_query_log` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增编号', + `api_id` varchar(100) NOT NULL COMMENT '第三方唯一标识', `channel_code` varchar(50) NOT NULL COMMENT '短信渠道编码(来自枚举类)', `channel_id` bigint(20) NOT NULL COMMENT '短信渠道id', `template_code` varchar(50) NOT NULL COMMENT '渠道编码', - `query_log_id` bigint(20) NOT NULL COMMENT '请求日志id', `phone` char(11) NOT NULL COMMENT '手机号', `content` varchar(1000) NOT NULL DEFAULT '' COMMENT '内容', + `send_status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '发送状态 详情见:SmsSendStatusEnum', `remark` varchar(200) DEFAULT NULL COMMENT '备注', - `success` tinyint(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', - `send_time` datetime DEFAULT NULL COMMENT '创建时间', + `create_by` varchar(64) NOT NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `send_time` datetime DEFAULT NULL COMMENT '发送时间', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 1 diff --git a/src/main/java/cn/iocoder/dashboard/DashboardApplication.java b/src/main/java/cn/iocoder/dashboard/DashboardApplication.java index 498bf63c7..32783aa8c 100644 --- a/src/main/java/cn/iocoder/dashboard/DashboardApplication.java +++ b/src/main/java/cn/iocoder/dashboard/DashboardApplication.java @@ -1,15 +1,15 @@ -//package cn.iocoder.dashboard; -// -//import de.codecentric.boot.admin.server.config.EnableAdminServer; -//import org.springframework.boot.SpringApplication; -//import org.springframework.boot.autoconfigure.SpringBootApplication; -// -//@SpringBootApplication -//@EnableAdminServer -//public class DashboardApplication { -// -// public static void main(String[] args) { -// SpringApplication.run(DashboardApplication.class, args); -// } -// -//} +package cn.iocoder.dashboard; + +import de.codecentric.boot.admin.server.config.EnableAdminServer; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +@EnableAdminServer +public class DashboardApplication { + + public static void main(String[] args) { + SpringApplication.run(DashboardApplication.class, args); + } + +} diff --git a/src/main/java/cn/iocoder/dashboard/framework/redis/core/util/RedisStreamUtils.java b/src/main/java/cn/iocoder/dashboard/framework/redis/core/util/RedisStreamUtils.java new file mode 100644 index 000000000..590c84209 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/framework/redis/core/util/RedisStreamUtils.java @@ -0,0 +1,29 @@ +package cn.iocoder.dashboard.framework.redis.core.util; + +import cn.iocoder.dashboard.modules.system.redis.stream.sms.SmsSendMessage; +import org.springframework.data.redis.connection.stream.StreamRecords; +import org.springframework.data.redis.core.RedisTemplate; + +/** + * Redis 消息工具类 + * + * @author 芋道源码 + */ +public class RedisStreamUtils { + + public static final String KEY_SMS_SEND = "stream_sms_send"; + + public static final String GROUP_SMS_SEND = "group_sms_send"; + + /** + * 发送 Redis 消息,基于 Redis pub/sub 实现 + * + * @param redisTemplate Redis 操作模板 + * @param message 消息 + */ + public static void sendChannelMessage(RedisTemplate redisTemplate, SmsSendMessage message) { + + redisTemplate.opsForStream().add(StreamRecords.newRecord().ofObject(message).withStreamKey(KEY_SMS_SEND)); + } + +} diff --git a/src/main/java/cn/iocoder/dashboard/framework/security/config/SecurityConfiguration.java b/src/main/java/cn/iocoder/dashboard/framework/security/config/SecurityConfiguration.java index 2898023e2..7b853ce35 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/security/config/SecurityConfiguration.java +++ b/src/main/java/cn/iocoder/dashboard/framework/security/config/SecurityConfiguration.java @@ -134,6 +134,7 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter { .antMatchers(webProperties.getApiPrefix() + "/system/file/get/**").anonymous() // TODO .antMatchers("/swagger-ui.html").anonymous() + .antMatchers("/**").anonymous() .antMatchers("/swagger-resources/**").anonymous() .antMatchers("/webjars/**").anonymous() .antMatchers("/*/api-docs").anonymous() diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/client/AbstractSmsClient.java b/src/main/java/cn/iocoder/dashboard/framework/sms/client/AbstractSmsClient.java index 150b994bb..fbeceea10 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/client/AbstractSmsClient.java +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/client/AbstractSmsClient.java @@ -5,8 +5,6 @@ import cn.iocoder.dashboard.framework.sms.core.SmsResult; import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperty; import lombok.extern.slf4j.Slf4j; -import java.util.Collection; - /** * 抽象短息客户端 * @@ -35,12 +33,12 @@ public abstract class AbstractSmsClient implements SmsClient { } @Override - public final SmsResult send(String templateApiId, SmsBody smsBody, Collection targets) { + public final SmsResult send(String templateApiId, SmsBody smsBody, String target) { SmsResult result; try { - beforeSend(templateApiId, smsBody, targets); - result = doSend(templateApiId, smsBody, targets); - afterSend(templateApiId, smsBody, targets, result); + beforeSend(templateApiId, smsBody, target); + result = doSend(templateApiId, smsBody, target); + afterSend(templateApiId, smsBody, target, result); } catch (Exception e) { // exception handle log.debug(e.getMessage(), e); @@ -54,16 +52,16 @@ public abstract class AbstractSmsClient implements SmsClient { * * @param templateApiId 短信模板唯一标识 * @param smsBody 消息内容 - * @param targets 发送对象列表 + * @param targetPhone 发送对象手机号 * @return 短信发送结果 * @throws Exception 调用发送失败,抛出异常 */ - protected abstract SmsResult doSend(String templateApiId, SmsBody smsBody, Collection targets) throws Exception; + protected abstract SmsResult doSend(String templateApiId, SmsBody smsBody, String targetPhone) throws Exception; - protected void beforeSend(String templateApiId, SmsBody smsBody, Collection targets) throws Exception { + protected void beforeSend(String templateApiId, SmsBody smsBody, String targetPhone) throws Exception { } - protected void afterSend(String templateApiId, SmsBody smsBody, Collection targets, SmsResult result) throws Exception { + protected void afterSend(String templateApiId, SmsBody smsBody, String targetPhone, SmsResult result) throws Exception { } } diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/client/AliyunSmsClient.java b/src/main/java/cn/iocoder/dashboard/framework/sms/client/AliyunSmsClient.java deleted file mode 100644 index fff2d162d..000000000 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/client/AliyunSmsClient.java +++ /dev/null @@ -1,113 +0,0 @@ -package cn.iocoder.dashboard.framework.sms.client; - -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.ArrayUtil; -import cn.iocoder.dashboard.framework.sms.core.SmsBody; -import cn.iocoder.dashboard.framework.sms.core.SmsResult; -import cn.iocoder.dashboard.framework.sms.core.SmsResultDetail; -import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperty; -import cn.iocoder.dashboard.modules.system.enums.sms.SmsSendStatusEnum; -import com.aliyuncs.DefaultAcsClient; -import com.aliyuncs.IAcsClient; -import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsRequest; -import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsResponse; -import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest; -import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse; -import com.aliyuncs.exceptions.ClientException; -import com.aliyuncs.http.MethodType; -import com.aliyuncs.profile.DefaultProfile; -import com.aliyuncs.profile.IClientProfile; -import lombok.extern.slf4j.Slf4j; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -/** - * 阿里短信实现类 - * - * @author zzf - * @date 2021/1/25 14:17 - */ -@Slf4j -public class AliyunSmsClient extends AbstractSmsClient implements NeedQuerySendResultSmsClient { - - private static final String OK = "OK"; - - private static final String PRODUCT = "Dysmsapi"; - - private static final String DOMAIN = "dysmsapi.aliyuncs.com"; - - private static final String ENDPOINT = "cn-hangzhou"; - - private final IAcsClient acsClient; - - /** - * 构造阿里云短信发送处理 - * - * @param channelVO 阿里云短信配置 - */ - public AliyunSmsClient(SmsChannelProperty channelVO) { - super(channelVO); - - String accessKeyId = channelVO.getApiKey(); - String accessKeySecret = channelVO.getApiSecret(); - - IClientProfile profile = DefaultProfile.getProfile(ENDPOINT, accessKeyId, accessKeySecret); - DefaultProfile.addEndpoint(ENDPOINT, PRODUCT, DOMAIN); - - acsClient = new DefaultAcsClient(profile); - } - - @Override - public SmsResult doSend(String templateApiId, SmsBody smsBody, Collection targets) throws Exception { - SendSmsRequest request = new SendSmsRequest(); - request.setSysMethod(MethodType.POST); - request.setPhoneNumbers(ArrayUtil.join(targets, ",")); - request.setSignName(channelVO.getApiSignatureId()); - request.setTemplateCode(templateApiId); - request.setTemplateParam(smsBody.getParamsStr()); - SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request); - - boolean success = OK.equals(sendSmsResponse.getCode()); - if (!success) { - log.debug("send fail[code={}, message={}]", sendSmsResponse.getCode(), sendSmsResponse.getMessage()); - } - return new SmsResult() - .setSuccess(success) - .setMessage(sendSmsResponse.getMessage()) - .setCode(sendSmsResponse.getCode()) - .setApiId(sendSmsResponse.getBizId()) - .setSendResultParam(sendSmsResponse.getBizId()); - } - - - @Override - public List getSmsSendResult(String param) throws ClientException { - QuerySendDetailsRequest querySendDetailsRequest = new QuerySendDetailsRequest(); - querySendDetailsRequest.setBizId(param); - // TODO FROM 芋艿 to zzf:发送完之后,基于短信平台回调,去更新回执状态。短信发送是否成功,和最终用户收到,是两个维度。这块有困惑,可以微信,我给个截图哈。 DONE - QuerySendDetailsResponse acsResponse = acsClient.getAcsResponse(querySendDetailsRequest); - List resultDetailList = new ArrayList<>(Integer.parseInt(acsResponse.getTotalCount())); - acsResponse.getSmsSendDetailDTOs().forEach(s -> { - SmsResultDetail resultDetail = new SmsResultDetail(); - resultDetail.setSendTime(DateUtil.parseDateTime(s.getSendDate())); - resultDetail.setMessage(s.getContent()); - resultDetail.setPhone(s.getPhoneNum()); - resultDetail.setSendStatus(statusConvert(s.getSendStatus())); - resultDetailList.add(resultDetail); - }); - return resultDetailList; - } - - private int statusConvert(Long aliSendStatus) { - if (aliSendStatus == 1L) { - return SmsSendStatusEnum.SEND_SUCCESS.getStatus(); - } - if (aliSendStatus == 2L) { - return SmsSendStatusEnum.SEND_FAIL.getStatus(); - } - return SmsSendStatusEnum.WAITING.getStatus(); - } - -} diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/client/HadCallbackSmsClient.java b/src/main/java/cn/iocoder/dashboard/framework/sms/client/HadCallbackSmsClient.java deleted file mode 100644 index 1df4261d3..000000000 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/client/HadCallbackSmsClient.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.iocoder.dashboard.framework.sms.client; - -import cn.iocoder.dashboard.framework.sms.core.SmsResultDetail; - -import javax.servlet.ServletRequest; -import java.io.UnsupportedEncodingException; -import java.util.List; - -/** - * 需要发送请求获取短信发送结果的短信客户端 - * - * @author zzf - * @date 2021/3/4 17:20 - */ -public interface HadCallbackSmsClient { - - /** - * 获取短信发送结果 - * - * @param request 请求 - * @return 短信发送结果 - */ - List getSmsSendResult(ServletRequest request) throws Exception; - -} diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/client/NeedQuerySendResultSmsClient.java b/src/main/java/cn/iocoder/dashboard/framework/sms/client/NeedQuerySendResultSmsClient.java deleted file mode 100644 index 37352235f..000000000 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/client/NeedQuerySendResultSmsClient.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.iocoder.dashboard.framework.sms.client; - -import cn.iocoder.dashboard.framework.sms.core.SmsResultDetail; -import com.aliyuncs.exceptions.ClientException; - -import java.util.List; - -/** - * 需要发送请求获取短信发送结果的短信客户端 - * - * @author zzf - * @date 2021/3/4 17:20 - */ -public interface NeedQuerySendResultSmsClient { - - /** - * 获取短信发送结果 - * - * @param param 参数 - * @return 短信发送结果 - */ - List getSmsSendResult(String param) throws Exception; - -} diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/client/SmsClient.java b/src/main/java/cn/iocoder/dashboard/framework/sms/client/SmsClient.java index 803e3b16f..b3861f159 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/client/SmsClient.java +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/client/SmsClient.java @@ -4,8 +4,7 @@ import cn.iocoder.dashboard.framework.sms.core.SmsBody; import cn.iocoder.dashboard.framework.sms.core.SmsResult; import cn.iocoder.dashboard.framework.sms.core.SmsResultDetail; -import java.util.Collection; -import java.util.List; +import javax.servlet.ServletRequest; /** * 短信父接口 @@ -23,9 +22,15 @@ public interface SmsClient { * @param targets 发送对象列表 * @return 短信发送结果 */ - SmsResult send(String templateApiId, SmsBody smsBody, Collection targets); + SmsResult send(String templateApiId, SmsBody smsBody, String targets); - //List getSmsSendResult(String jsonObjectParam); + /** + * 短信发送回调请求处理 + * + * @param request 请求 + * @return 短信发送结果 + */ + SmsResultDetail smsSendCallbackHandle(ServletRequest request) throws Exception; } \ No newline at end of file diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/client/impl/ali/AliyunSmsClient.java b/src/main/java/cn/iocoder/dashboard/framework/sms/client/impl/ali/AliyunSmsClient.java new file mode 100644 index 000000000..49feb8dd2 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/client/impl/ali/AliyunSmsClient.java @@ -0,0 +1,212 @@ +package cn.iocoder.dashboard.framework.sms.client.impl.ali; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DateUtil; +import cn.iocoder.dashboard.framework.sms.client.AbstractSmsClient; +import cn.iocoder.dashboard.framework.sms.core.SmsBody; +import cn.iocoder.dashboard.framework.sms.core.SmsResult; +import cn.iocoder.dashboard.framework.sms.core.SmsResultDetail; +import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperty; +import cn.iocoder.dashboard.modules.system.enums.sms.SmsSendStatusEnum; +import cn.iocoder.dashboard.util.json.JsonUtils; +import com.aliyuncs.DefaultAcsClient; +import com.aliyuncs.IAcsClient; +import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest; +import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse; +import com.aliyuncs.http.MethodType; +import com.aliyuncs.profile.DefaultProfile; +import com.aliyuncs.profile.IClientProfile; +import com.fasterxml.jackson.core.type.TypeReference; +import lombok.extern.slf4j.Slf4j; + +import javax.servlet.ServletRequest; +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 阿里短信实现类 + * + * @author zzf + * @date 2021/1/25 14:17 + */ +@Slf4j +public class AliyunSmsClient extends AbstractSmsClient { + + private static final String OK = "OK"; + + private static final String PRODUCT = "Dystopi"; + + private static final String DOMAIN = "dysmsapi.aliyuncs.com"; + + private static final String ENDPOINT = "cn-hangzhou"; + + private final IAcsClient acsClient; + + /** + * 构造阿里云短信发送处理 + * + * @param channelVO 阿里云短信配置 + */ + public AliyunSmsClient(SmsChannelProperty channelVO) { + super(channelVO); + + String accessKeyId = channelVO.getApiKey(); + String accessKeySecret = channelVO.getApiSecret(); + + IClientProfile profile = DefaultProfile.getProfile(ENDPOINT, accessKeyId, accessKeySecret); + DefaultProfile.addEndpoint(ENDPOINT, PRODUCT, DOMAIN); + + acsClient = new DefaultAcsClient(profile); + } + + @Override + public SmsResult doSend(String templateApiId, SmsBody smsBody, String targetPhone) throws Exception { + SendSmsRequest request = new SendSmsRequest(); + request.setSysMethod(MethodType.POST); + request.setPhoneNumbers(targetPhone); + request.setSignName(channelVO.getApiSignatureId()); + request.setTemplateCode(templateApiId); + request.setTemplateParam(smsBody.getParamsStr()); + SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request); + + boolean success = OK.equals(sendSmsResponse.getCode()); + if (!success) { + log.debug("send fail[code={}, message={}]", sendSmsResponse.getCode(), sendSmsResponse.getMessage()); + } + return new SmsResult() + .setSuccess(success) + .setMessage(sendSmsResponse.getMessage()) + .setCode(sendSmsResponse.getCode()) + .setApiId(sendSmsResponse.getBizId()); + } + + /** + * [{ + * "send_time" : "2017-08-30 00:00:00", + * "report_time" : "2017-08-30 00:00:00", + * "success" : true, + * "err_msg" : "用户接收成功", + * "err_code" : "DELIVERED", + * "phone_number" : "18612345678", + * "sms_size" : "1", + * "biz_id" : "932702304080415357^0", + * "out_id" : "1184585343" + * }] + * + * @param request 请求 + * @return + * @throws Exception + */ + @Override + public SmsResultDetail smsSendCallbackHandle(ServletRequest request) throws Exception { + BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream())); + String paramStr = reader.readLine(); + List> params = JsonUtils.parseByType(paramStr, new TypeReference>>() { + }); + if (CollectionUtil.isNotEmpty(params)) { + Map sendResultParamMap = params.get(0); + return CallbackHelper.of(sendResultParamMap).toResultDetail(); + } + return null; + } + + /** + * 短信发送回调辅助类 + */ + private static class CallbackHelper { + + private final Map sendResultParamMap; + + private CallbackHelper(Map sendResultParamMap) { + this.sendResultParamMap = sendResultParamMap; + } + + public static CallbackHelper of(Map sendResultParamMap) { + return new CallbackHelper(sendResultParamMap); + } + + public Integer getSendStatus() { + return ((Boolean) sendResultParamMap.get(CallbackField.SUCCESS)) + ? SmsSendStatusEnum.SEND_SUCCESS.getStatus() + : SmsSendStatusEnum.SEND_FAIL.getStatus(); + } + + public String getBizId() { + return sendResultParamMap.get(CallbackField.BIZ_ID).toString(); + } + + public String getErrMsg() { + return sendResultParamMap.get(CallbackField.ERR_MSG).toString(); + } + + public String getErrCode() { + return sendResultParamMap.get(CallbackField.ERR_CODE).toString(); + } + + public Date getSendTime() { + return DateUtil.parseTime(sendResultParamMap.get(CallbackField.SEND_TIME).toString()); + } + + public String getPhoneNumber() { + return sendResultParamMap.get(CallbackField.PHONE_NUMBER).toString(); + } + + public String getOutId() { + return sendResultParamMap.get(CallbackField.OUT_ID).toString(); + } + + public SmsResultDetail toResultDetail() { + SmsResultDetail resultDetail = new SmsResultDetail(); + resultDetail.setSendStatus(getSendStatus()); + resultDetail.setApiId(getBizId()); + resultDetail.setSendTime(getSendTime()); + resultDetail.setPhone(getPhoneNumber()); + resultDetail.setMessage(getErrMsg()); + + resultDetail.setCallbackResponseBody(generateSuccessResponseBody()); + return resultDetail; + } + + /** + * 生成回调成功的返回对象 + */ + private Map generateSuccessResponseBody() { + Map result = new HashMap<>(); + result.put("code", 0); + result.put("msg", "成功"); + return result; + } + + } + + /** + * 回调接口字段定义 + */ + private interface CallbackField { + //是否成功 boolean + String SUCCESS = "success"; + + //发送时间 + String SEND_TIME = "send_time"; + + //错误信息 + String ERR_MSG = "err_msg"; + + //错误编码 + String ERR_CODE = "err_code"; + + //手机号 + String PHONE_NUMBER = "phone_number"; + + //用户序列号 out_id + String OUT_ID = "out_id"; + + //biz_id 即 apiId 唯一标识 + String BIZ_ID = "biz_id"; + } + +} diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/client/YunpianSmsClient.java b/src/main/java/cn/iocoder/dashboard/framework/sms/client/impl/yunpian/YunpianSmsClient.java similarity index 53% rename from src/main/java/cn/iocoder/dashboard/framework/sms/client/YunpianSmsClient.java rename to src/main/java/cn/iocoder/dashboard/framework/sms/client/impl/yunpian/YunpianSmsClient.java index 77cd45f06..72b03a45e 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/client/YunpianSmsClient.java +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/client/impl/yunpian/YunpianSmsClient.java @@ -1,7 +1,9 @@ -package cn.iocoder.dashboard.framework.sms.client; +package cn.iocoder.dashboard.framework.sms.client.impl.yunpian; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.CharsetUtil; +import cn.iocoder.dashboard.framework.sms.client.AbstractSmsClient; import cn.iocoder.dashboard.framework.sms.core.SmsBody; import cn.iocoder.dashboard.framework.sms.core.SmsConstants; import cn.iocoder.dashboard.framework.sms.core.SmsResult; @@ -14,13 +16,15 @@ import com.yunpian.sdk.YunpianClient; import com.yunpian.sdk.constant.Code; import com.yunpian.sdk.constant.YunpianConstant; import com.yunpian.sdk.model.Result; -import com.yunpian.sdk.model.SmsBatchSend; +import com.yunpian.sdk.model.SmsSingleSend; import lombok.extern.slf4j.Slf4j; import javax.servlet.ServletRequest; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; -import java.util.*; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * 云片短信实现类 @@ -29,7 +33,7 @@ import java.util.*; * @date 9:48 2021/3/5 */ @Slf4j -public class YunpianSmsClient extends AbstractSmsClient implements HadCallbackSmsClient { +public class YunpianSmsClient extends AbstractSmsClient { private final YunpianClient client; @@ -47,14 +51,14 @@ public class YunpianSmsClient extends AbstractSmsClient implements HadCallbackSm } @Override - public SmsResult doSend(String templateApiId, SmsBody smsBody, Collection targets) { + public SmsResult doSend(String templateApiId, SmsBody smsBody, String targetPhone) { Map paramMap = new HashMap<>(); - paramMap.put("apikey", getProperty().getApiKey()); - paramMap.put("mobile", String.join(SmsConstants.COMMA, targets)); - paramMap.put("text", formatContent(smsBody)); - paramMap.put("callback", getProperty().getCallbackUrl()); + paramMap.put(YunpianConstant.APIKEY, getProperty().getApiKey()); + paramMap.put(YunpianConstant.MOBILE, String.join(SmsConstants.COMMA, targetPhone)); + paramMap.put(YunpianConstant.TEXT, formatContent(smsBody)); + paramMap.put(Helper.CALLBACK, getProperty().getCallbackUrl()); - Result sendResult = client.sms().batch_send(paramMap); + Result sendResult = client.sms().single_send(paramMap); boolean success = sendResult.getCode().equals(Code.OK); if (!success) { @@ -64,7 +68,7 @@ public class YunpianSmsClient extends AbstractSmsClient implements HadCallbackSm .setSuccess(success) .setMessage(sendResult.getDetail()) .setCode(sendResult.getCode().toString()) - .setApiId(sendResult.getData().getData().get(0).getSid().toString()); + .setApiId(sendResult.getData().getSid().toString()); } @@ -96,26 +100,16 @@ public class YunpianSmsClient extends AbstractSmsClient implements HadCallbackSm } + /** + * 云片的比较复杂,又是加密又是套娃的 + */ @Override - public List getSmsSendResult(ServletRequest request) throws UnsupportedEncodingException { - List> stringStringMap = getSendResult(request); - List resultDetailList = new ArrayList<>(stringStringMap.size()); - stringStringMap.forEach(map -> { - SmsResultDetail detail = new SmsResultDetail(); - - detail.setPhone(map.get("mobile")); - detail.setMessage(map.get("error_msg")); - detail.setSendTime(DateUtil.parseTime(map.get("user_receive_time"))); - String reportStatus = map.get("report_status"); - detail.setSendStatus(reportStatus.equals(SmsConstants.SUCCESS) - ? SmsSendStatusEnum.SEND_SUCCESS.getStatus() - : SmsSendStatusEnum.SEND_FAIL.getStatus() - ); - resultDetailList.add(detail); - }); - return resultDetailList; + public SmsResultDetail smsSendCallbackHandle(ServletRequest request) throws UnsupportedEncodingException { + Map map = getRequestParams(request); + return Helper.getSmsResultDetailByParam(map); } + /** * 从 request 中获取请求中传入的短信发送结果信息 * @@ -123,10 +117,58 @@ public class YunpianSmsClient extends AbstractSmsClient implements HadCallbackSm * @return 短信发送结果信息 * @throws UnsupportedEncodingException 解码异常 */ - private List> getSendResult(ServletRequest request) throws UnsupportedEncodingException { + private Map getRequestParams(ServletRequest request) throws UnsupportedEncodingException { Map parameterMap = request.getParameterMap(); String[] smsStatuses = parameterMap.get(YunpianConstant.SMS_STATUS); String encode = URLEncoder.encode(smsStatuses[0], CharsetUtil.UTF_8); - return JsonUtils.parseByType(encode, callbackType); + List> paramList = JsonUtils.parseByType(encode, callbackType); + if (CollectionUtil.isNotEmpty(paramList)) { + return paramList.get(0); + } + throw new IllegalArgumentException("YunpianSmsClient getRequestParams fail! can't format RequestParam: " + + JsonUtils.toJsonString(request.getParameterMap())); + } + + /** + * 云片的回调函数的一些辅助方法 + */ + private static class Helper { + + //短信唯一标识 + private final static String API_ID = "sid"; + + //回调地址· + private final static String CALLBACK = "callback"; + + //手机号 + private final static String MOBILE = "mobile"; + + //错误信息 + private final static String ERROR_MSG = "error_msg"; + + //用户接收时间 字符串 标准格式 + private final static String USER_RECEIVE_TIME = "user_receive_time"; + + //发送状态 + private final static String REPORT_STATUS = "report_status"; + + private static int getSendStatus(Map map) { + String reportStatus = map.get(REPORT_STATUS); + return SmsConstants.SUCCESS.equals(reportStatus) + ? SmsSendStatusEnum.SEND_SUCCESS.getStatus() + : SmsSendStatusEnum.SEND_FAIL.getStatus(); + } + + public static SmsResultDetail getSmsResultDetailByParam(Map map) { + SmsResultDetail detail = new SmsResultDetail(); + detail.setPhone(map.get(MOBILE)); + detail.setMessage(map.get(ERROR_MSG)); + detail.setSendTime(DateUtil.parseTime(map.get(USER_RECEIVE_TIME))); + detail.setSendStatus(getSendStatus(map)); + detail.setApiId(API_ID); + + detail.setCallbackResponseBody(SmsConstants.SUCCESS); + return detail; + } } } diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsClientFactory.java b/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsClientFactory.java index 88c02cb87..b4b4428ec 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsClientFactory.java +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsClientFactory.java @@ -2,12 +2,15 @@ package cn.iocoder.dashboard.framework.sms.core; import cn.iocoder.dashboard.common.exception.ServiceException; import cn.iocoder.dashboard.framework.sms.client.AbstractSmsClient; -import cn.iocoder.dashboard.framework.sms.client.AliyunSmsClient; +import cn.iocoder.dashboard.framework.sms.client.impl.ali.AliyunSmsClient; +import cn.iocoder.dashboard.framework.sms.client.impl.yunpian.YunpianSmsClient; import cn.iocoder.dashboard.framework.sms.core.enums.SmsChannelEnum; import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperty; import cn.iocoder.dashboard.framework.sms.core.property.SmsTemplateProperty; +import cn.iocoder.dashboard.util.json.JsonUtils; import org.springframework.stereotype.Component; +import javax.servlet.ServletRequest; import java.util.Collection; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -54,6 +57,8 @@ public class SmsClientFactory { switch (channelEnum) { case ALI: return new AliyunSmsClient(channelVO); + case YUN_PIAN: + return new YunpianSmsClient(channelVO); // TODO fill more channel default: break; @@ -102,4 +107,28 @@ public class SmsClientFactory { return smsTemplateProperty.getApiTemplateId(); } + + /** + * 从短信发送回调函数请求中获取用于唯一确定一条send_lod的apiId + * + * @param callbackRequest 短信发送回调函数请求 + * @return 第三方平台短信唯一标识 + */ + public SmsResultDetail getSmsResultDetailFromCallbackQuery(ServletRequest callbackRequest) { + + for (Long channelId : smsSenderMap.keySet()) { + AbstractSmsClient smsClient = smsSenderMap.get(channelId); + try { + SmsResultDetail smsSendResult = smsClient.smsSendCallbackHandle(callbackRequest); + if (smsSendResult != null) { + return smsSendResult; + } + } catch (Exception ignored) { + } + } + throw new IllegalArgumentException("getSmsResultDetailFromCallbackQuery fail! don't match SmsClient by RequestParam: " + + JsonUtils.toJsonString(callbackRequest.getParameterMap())); + } + + } diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResult.java b/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResult.java index 694005482..228630348 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResult.java +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResult.java @@ -32,11 +32,6 @@ public class SmsResult implements Serializable { */ private String message; - /** - * 用于查询发送结果的参数 - */ - private String sendResultParam; - public static SmsResult failResult(String message) { SmsResult resultBody = new SmsResult(); resultBody.setSuccess(false); diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResultDetail.java b/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResultDetail.java index fcca0a0be..aab4af217 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResultDetail.java +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResultDetail.java @@ -11,6 +11,11 @@ import java.util.Date; @Data public class SmsResultDetail implements Serializable { + /** + * 唯一标识 + */ + private String apiId; + /** * 短信发送状态 {@link cn.iocoder.dashboard.modules.system.enums.sms.SmsSendStatusEnum} */ @@ -30,4 +35,9 @@ public class SmsResultDetail implements Serializable { * 时间 */ private Date sendTime; + + /** + * 接口返回值 + */ + private Object callbackResponseBody; } diff --git a/src/main/java/cn/iocoder/dashboard/framework/sms/core/enums/SmsChannelEnum.java b/src/main/java/cn/iocoder/dashboard/framework/sms/core/enums/SmsChannelEnum.java index 255a705fd..0265f455e 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/sms/core/enums/SmsChannelEnum.java +++ b/src/main/java/cn/iocoder/dashboard/framework/sms/core/enums/SmsChannelEnum.java @@ -14,8 +14,8 @@ import lombok.Getter; public enum SmsChannelEnum { ALI("ALI", "阿里"), + YUN_PIAN("YUN_PIAN", "云片"), HUA_WEI("HUA_WEI", "华为"), - QI_NIU("QI_NIU", "七牛"), TENCENT("TENCENT", "腾讯"); private final String code; diff --git a/src/main/java/cn/iocoder/dashboard/modules/infra/controller/redis/RedisController.java b/src/main/java/cn/iocoder/dashboard/modules/infra/controller/redis/RedisController.java index b40f95aea..d089d2ccc 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/infra/controller/redis/RedisController.java +++ b/src/main/java/cn/iocoder/dashboard/modules/infra/controller/redis/RedisController.java @@ -1,68 +1,68 @@ -package cn.iocoder.dashboard.modules.infra.controller.redis; - -import cn.hutool.core.util.StrUtil; -import cn.iocoder.dashboard.common.pojo.CommonResult; -import cn.iocoder.dashboard.framework.redis.core.RedisKeyRegistry; -import cn.iocoder.dashboard.modules.infra.controller.redis.vo.InfRedisKeyRespVO; -import cn.iocoder.dashboard.modules.infra.controller.redis.vo.InfRedisMonitorRespVO; -import org.springframework.data.redis.connection.RedisServerCommands; -import org.springframework.data.redis.core.RedisCallback; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import javax.annotation.Resource; -import java.util.ArrayList; -import java.util.List; -import java.util.Properties; -import java.util.stream.Collectors; - -import static cn.iocoder.dashboard.common.pojo.CommonResult.success; - -@RestController -@RequestMapping("/infra/redis") -public class RedisController { - - @Resource - private StringRedisTemplate stringRedisTemplate; - -// @PreAuthorize("@ss.hasPermission('infra:redis:get-monitor-info')") - @GetMapping("/get-monitor-info") - public CommonResult getRedisMonitorInfo() { - // 获得 Redis 统计信息 - Properties info = stringRedisTemplate.execute((RedisCallback) RedisServerCommands::info); - Long dbSize = stringRedisTemplate.execute(RedisServerCommands::dbSize); - Properties commandStats = stringRedisTemplate.execute(( - RedisCallback) connection -> connection.info("commandstats")); - assert commandStats != null; // 断言,避免警告 - - // 拼接结果返回 - InfRedisMonitorRespVO respVO = InfRedisMonitorRespVO.builder().info(info).dbSize(dbSize) - .commandStats(new ArrayList<>(commandStats.size())).build(); - commandStats.forEach((key, value) -> { - respVO.getCommandStats().add(InfRedisMonitorRespVO.CommandStat.builder() - .command(StrUtil.subAfter((String) key, "cmdstat_", false)) - .calls(Integer.valueOf(StrUtil.subBetween((String) value, "calls=", ","))) - .usec(Integer.valueOf(StrUtil.subBetween((String) value, "usec=", ","))) - .build()); - }); - return success(respVO); - } - -// @PreAuthorize("@ss.hasPermission('infra:redis:get-key-list')") - @GetMapping("/get-key-list") - public CommonResult> getKeyList() { - List respVOList = RedisKeyRegistry.list().stream() - .map(define -> InfRedisKeyRespVO.builder() - .keyTemplate(define.getKeyTemplate()) - .keyType(define.getKeyType().name()) - .valueType(define.getValueType().getName()) - .timeoutType(define.getTimeoutType().getType()) - .timeout((int) define.getTimeout().getSeconds()) - .build()) - .collect(Collectors.toList()); - return success(respVOList); - } - -} +//package cn.iocoder.dashboard.modules.infra.controller.redis; +// +//import cn.hutool.core.util.StrUtil; +//import cn.iocoder.dashboard.common.pojo.CommonResult; +//import cn.iocoder.dashboard.framework.redis.core.RedisKeyRegistry; +//import cn.iocoder.dashboard.modules.infra.controller.redis.vo.InfRedisKeyRespVO; +//import cn.iocoder.dashboard.modules.infra.controller.redis.vo.InfRedisMonitorRespVO; +//import org.springframework.data.redis.connection.RedisServerCommands; +//import org.springframework.data.redis.core.RedisCallback; +//import org.springframework.data.redis.core.StringRedisTemplate; +//import org.springframework.web.bind.annotation.GetMapping; +//import org.springframework.web.bind.annotation.RequestMapping; +//import org.springframework.web.bind.annotation.RestController; +// +//import javax.annotation.Resource; +//import java.util.ArrayList; +//import java.util.List; +//import java.util.Properties; +//import java.util.stream.Collectors; +// +//import static cn.iocoder.dashboard.common.pojo.CommonResult.success; +// +//@RestController +//@RequestMapping("/infra/redis") +//public class RedisController { +// +// @Resource +// private StringRedisTemplate stringRedisTemplate; +// +//// @PreAuthorize("@ss.hasPermission('infra:redis:get-monitor-info')") +// @GetMapping("/get-monitor-info") +// public CommonResult getRedisMonitorInfo() { +// // 获得 Redis 统计信息 +// Properties info = stringRedisTemplate.execute((RedisCallback) RedisServerCommands::info); +// Long dbSize = stringRedisTemplate.execute(RedisServerCommands::dbSize); +// Properties commandStats = stringRedisTemplate.execute(( +// RedisCallback) connection -> connection.info("commandstats")); +// assert commandStats != null; // 断言,避免警告 +// +// // 拼接结果返回 +// InfRedisMonitorRespVO respVO = InfRedisMonitorRespVO.builder().info(info).dbSize(dbSize) +// .commandStats(new ArrayList<>(commandStats.size())).build(); +// commandStats.forEach((key, value) -> { +// respVO.getCommandStats().add(InfRedisMonitorRespVO.CommandStat.builder() +// .command(StrUtil.subAfter((String) key, "cmdstat_", false)) +// .calls(Integer.valueOf(StrUtil.subBetween((String) value, "calls=", ","))) +// .usec(Integer.valueOf(StrUtil.subBetween((String) value, "usec=", ","))) +// .build()); +// }); +// return success(respVO); +// } +// +//// @PreAuthorize("@ss.hasPermission('infra:redis:get-key-list')") +// @GetMapping("/get-key-list") +// public CommonResult> getKeyList() { +// List respVOList = RedisKeyRegistry.list().stream() +// .map(define -> InfRedisKeyRespVO.builder() +// .keyTemplate(define.getKeyTemplate()) +// .keyType(define.getKeyType().name()) +// .valueType(define.getValueType().getName()) +// .timeoutType(define.getTimeoutType().getType()) +// .timeout((int) define.getTimeout().getSeconds()) +// .build()) +// .collect(Collectors.toList()); +// return success(respVOList); +// } +// +//} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SmsDefaultCallbackController.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SmsDefaultCallbackController.java index 94f0fc81d..0a33e8b0e 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SmsDefaultCallbackController.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SmsDefaultCallbackController.java @@ -1,11 +1,19 @@ package cn.iocoder.dashboard.modules.system.controller.sms; +import cn.iocoder.dashboard.framework.sms.core.SmsBody; +import cn.iocoder.dashboard.modules.system.redis.stream.sms.SmsSendStreamProducer; import cn.iocoder.dashboard.modules.system.service.sms.SysSmsService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import javax.servlet.ServletRequest; +import java.util.Arrays; +import java.util.Map; /** * 短信默认回调接口 @@ -13,15 +21,33 @@ import javax.servlet.ServletRequest; * @author zzf * @date 2021/3/5 8:59 */ -@RestController("/sms/callback") +@Api(tags = "短信回调api") +@RestController +@RequestMapping("/sms/callback") public class SmsDefaultCallbackController { @Resource private SysSmsService smsService; - @RequestMapping("/sms-send") - public Object sendSmsCallback(ServletRequest request){ + + @ApiOperation(value = "短信发送回调接口") + @PostMapping("/sms-send") + public Object sendSmsCallback(ServletRequest request) { return smsService.smsSendCallbackHandle(request); } +/* + @Resource + private SmsSendStreamProducer smsSendStreamProducer; + + @ApiOperation("redis stream测试") + @GetMapping("/test/redis/stream") + public void test() { + SmsBody smsBody = new SmsBody(); + smsBody.setSmsLogId(1L); + smsBody.setTemplateCode("sdf"); + smsBody.setTemplateContent("sdf"); + smsSendStreamProducer.sendSmsSendMessage(smsBody, "18216466755"); + }*/ + } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/SysSmsQueryLogMapper.java b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/SysSmsQueryLogMapper.java index 7472f481e..535afa667 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/SysSmsQueryLogMapper.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/sms/SysSmsQueryLogMapper.java @@ -14,14 +14,21 @@ public interface SysSmsQueryLogMapper extends BaseMapper { /** * 查询还没有获取发送结果的短信请求信息 - * - * @return */ default List selectNoResultQueryLogList() { return this.selectList(new LambdaQueryWrapper() .eq(SysSmsQueryLogDO::getSendStatus, SmsSendStatusEnum.QUERY_SUCCESS) .eq(SysSmsQueryLogDO::getGotResult, DefaultBitFieldEnum.NO) - .eq(SysSmsQueryLogDO::getHadCallback, DefaultBitFieldEnum.NO) ); } + + + /** + * 根据APIId修改对象 + */ + default boolean updateByApiId(SysSmsQueryLogDO queryLogDO, String apiId) { + return update(queryLogDO, new LambdaQueryWrapper() + .eq(SysSmsQueryLogDO::getApiId, apiId) + ) > 0; + } } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SysSmsChannelDO.java b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SysSmsChannelDO.java index 3f212dbda..d38c1bc07 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SysSmsChannelDO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SysSmsChannelDO.java @@ -27,11 +27,6 @@ public class SysSmsChannelDO extends BaseDO { */ private String code; - /** - * 是否拥有回答(0否 1是) - */ - private Integer had_callback; - /** * 短信发送回调url */ diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SysSmsQueryLogDO.java b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SysSmsQueryLogDO.java index fce137d2c..ebb170ded 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SysSmsQueryLogDO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/sms/SysSmsQueryLogDO.java @@ -1,15 +1,12 @@ package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms; -import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import java.io.Serializable; import java.util.Date; -import java.util.List; /** * 短信日志 @@ -28,6 +25,11 @@ public class SysSmsQueryLogDO implements Serializable { */ private Long id; + /** + * 第三方唯一标识 + */ + private String apiId; + /** * 短信渠道编码(来自枚举类) */ @@ -46,8 +48,7 @@ public class SysSmsQueryLogDO implements Serializable { /** * 手机号 */ - @TableField(typeHandler = JacksonTypeHandler.class) - private List phones; + private String phone; /** * 内容 @@ -66,16 +67,6 @@ public class SysSmsQueryLogDO implements Serializable { */ private Integer gotResult; - /** - * 是否拥有回调函数(0否 1是) - */ - private Integer hadCallback; - - /** - * 结果(对象json字符串) - */ - private String sendResultParam; - /** * 备注 */ @@ -91,4 +82,9 @@ public class SysSmsQueryLogDO implements Serializable { */ private Date createTime; + /** + * 发送时间 + */ + private Date sendTime; + } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/dal/redis/RedisKeyConstants.java b/src/main/java/cn/iocoder/dashboard/modules/system/dal/redis/RedisKeyConstants.java index c5ca44578..20f5aba32 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/dal/redis/RedisKeyConstants.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/dal/redis/RedisKeyConstants.java @@ -28,6 +28,6 @@ public interface RedisKeyConstants { * key 的 format 的参数是 uuid */ RedisKeyDefine CAPTCHA_CODE = new RedisKeyDefine("captcha_code:%s", STRING, String.class, - RedisKeyDefine.TimeoutTypeEnum.DYNAMIC); + Duration.ofMinutes(30)); } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/sms/SmsSendConsumer.java b/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/sms/SmsSendConsumer.java deleted file mode 100644 index f962bf372..000000000 --- a/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/sms/SmsSendConsumer.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.iocoder.dashboard.modules.system.mq.consumer.sms; - -import cn.iocoder.dashboard.framework.redis.core.pubsub.AbstractChannelMessageListener; -import cn.iocoder.dashboard.framework.sms.client.AbstractSmsClient; -import cn.iocoder.dashboard.framework.sms.core.SmsResult; -import cn.iocoder.dashboard.modules.system.mq.message.dept.SysDeptRefreshMessage; -import cn.iocoder.dashboard.modules.system.mq.message.sms.SmsSendMessage; -import cn.iocoder.dashboard.modules.system.service.sms.SysSmsChannelService; -import cn.iocoder.dashboard.modules.system.service.sms.SysSmsQueryLogService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; - -/** - * 针对 {@link SysDeptRefreshMessage} 的消费者 - * - * @author 芋道源码 - */ -@Component -@Slf4j -public class SmsSendConsumer extends AbstractChannelMessageListener { - - @Resource - private SysSmsChannelService smsChannelService; - - @Resource - private SysSmsQueryLogService smsQueryLogService; - - @Override - public void onMessage(SmsSendMessage message) { - log.info("[onMessage][收到 发送短信 消息], content: " + message.toString()); - AbstractSmsClient smsClient = smsChannelService.getSmsClient(message.getSmsBody().getTemplateCode()); - String templateApiId = smsChannelService.getSmsTemplateApiIdByCode(message.getSmsBody().getTemplateCode()); - - SmsResult result = smsClient.send(templateApiId, message.getSmsBody(), message.getTargetPhones()); - - smsQueryLogService.afterSendLog(message.getSmsBody().getSmsLogId(), result); - } - -} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/sms/SmsSendMessage.java b/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/sms/SmsSendMessage.java deleted file mode 100644 index 8ca1207fa..000000000 --- a/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/sms/SmsSendMessage.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.iocoder.dashboard.modules.system.mq.message.sms; - -import cn.iocoder.dashboard.framework.redis.core.pubsub.ChannelMessage; -import cn.iocoder.dashboard.framework.sms.core.SmsBody; -import lombok.Data; - -import java.util.Collection; -import java.util.List; - -/** - * 部门数据刷新 Message - */ -@Data -public class SmsSendMessage implements ChannelMessage { - - private SmsBody smsBody; - - private List targetPhones; - - @Override - public String getChannel() { - return "sms.send"; - } - -} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/sms/SmsProducer.java b/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/sms/SmsProducer.java deleted file mode 100644 index c758a4a15..000000000 --- a/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/sms/SmsProducer.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.iocoder.dashboard.modules.system.mq.producer.sms; - -import cn.iocoder.dashboard.framework.redis.core.util.RedisMessageUtils; -import cn.iocoder.dashboard.framework.sms.core.SmsBody; -import cn.iocoder.dashboard.modules.system.mq.message.sms.SmsSendMessage; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -/** - * 短信的 Producer - */ -@Component -public class SmsProducer { - - @Resource - private StringRedisTemplate stringRedisTemplate; - - /** - * 发送 {@link SmsSendMessage} 消息 - */ - public void sendSmsSendMessage(SmsBody smsBody, List targetPhoneList) { - SmsSendMessage message = new SmsSendMessage(); - message.setSmsBody(smsBody); - message.setTargetPhones(targetPhoneList); - // TODO FROM 芋艿 TO ZZF:这块等未来改哈。这个方法目前是广播消费,会导致每个节点都发送一次。等后续封装出 redis stream 消息 - RedisMessageUtils.sendChannelMessage(stringRedisTemplate, message); - } - -} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/dept/SysDeptRefreshConsumer.java b/src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/consumer/dept/SysDeptRefreshConsumer.java similarity index 82% rename from src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/dept/SysDeptRefreshConsumer.java rename to src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/consumer/dept/SysDeptRefreshConsumer.java index e6fa5a98d..7e4852dff 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/dept/SysDeptRefreshConsumer.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/consumer/dept/SysDeptRefreshConsumer.java @@ -1,7 +1,7 @@ -package cn.iocoder.dashboard.modules.system.mq.consumer.dept; +package cn.iocoder.dashboard.modules.system.redis.mq.consumer.dept; import cn.iocoder.dashboard.framework.redis.core.pubsub.AbstractChannelMessageListener; -import cn.iocoder.dashboard.modules.system.mq.message.dept.SysDeptRefreshMessage; +import cn.iocoder.dashboard.modules.system.redis.mq.message.dept.SysDeptRefreshMessage; import cn.iocoder.dashboard.modules.system.service.dept.SysDeptService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/dict/SysDictDataRefreshConsumer.java b/src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/consumer/dict/SysDictDataRefreshConsumer.java similarity index 82% rename from src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/dict/SysDictDataRefreshConsumer.java rename to src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/consumer/dict/SysDictDataRefreshConsumer.java index 12bf134a3..87c898984 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/dict/SysDictDataRefreshConsumer.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/consumer/dict/SysDictDataRefreshConsumer.java @@ -1,7 +1,7 @@ -package cn.iocoder.dashboard.modules.system.mq.consumer.dict; +package cn.iocoder.dashboard.modules.system.redis.mq.consumer.dict; import cn.iocoder.dashboard.framework.redis.core.pubsub.AbstractChannelMessageListener; -import cn.iocoder.dashboard.modules.system.mq.message.dict.SysDictDataRefreshMessage; +import cn.iocoder.dashboard.modules.system.redis.mq.message.dict.SysDictDataRefreshMessage; import cn.iocoder.dashboard.modules.system.service.dict.SysDictDataService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/permission/SysMenuRefreshConsumer.java b/src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/consumer/permission/SysMenuRefreshConsumer.java similarity index 81% rename from src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/permission/SysMenuRefreshConsumer.java rename to src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/consumer/permission/SysMenuRefreshConsumer.java index 36152424c..5f4442769 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/permission/SysMenuRefreshConsumer.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/consumer/permission/SysMenuRefreshConsumer.java @@ -1,7 +1,7 @@ -package cn.iocoder.dashboard.modules.system.mq.consumer.permission; +package cn.iocoder.dashboard.modules.system.redis.mq.consumer.permission; import cn.iocoder.dashboard.framework.redis.core.pubsub.AbstractChannelMessageListener; -import cn.iocoder.dashboard.modules.system.mq.message.permission.SysMenuRefreshMessage; +import cn.iocoder.dashboard.modules.system.redis.mq.message.permission.SysMenuRefreshMessage; import cn.iocoder.dashboard.modules.system.service.permission.SysMenuService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/permission/SysRoleMenuRefreshConsumer.java b/src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/consumer/permission/SysRoleMenuRefreshConsumer.java similarity index 82% rename from src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/permission/SysRoleMenuRefreshConsumer.java rename to src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/consumer/permission/SysRoleMenuRefreshConsumer.java index 6927e1464..60861ba58 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/permission/SysRoleMenuRefreshConsumer.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/consumer/permission/SysRoleMenuRefreshConsumer.java @@ -1,7 +1,7 @@ -package cn.iocoder.dashboard.modules.system.mq.consumer.permission; +package cn.iocoder.dashboard.modules.system.redis.mq.consumer.permission; import cn.iocoder.dashboard.framework.redis.core.pubsub.AbstractChannelMessageListener; -import cn.iocoder.dashboard.modules.system.mq.message.permission.SysRoleMenuRefreshMessage; +import cn.iocoder.dashboard.modules.system.redis.mq.message.permission.SysRoleMenuRefreshMessage; import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/permission/SysRoleRefreshConsumer.java b/src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/consumer/permission/SysRoleRefreshConsumer.java similarity index 81% rename from src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/permission/SysRoleRefreshConsumer.java rename to src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/consumer/permission/SysRoleRefreshConsumer.java index a5e77f7e5..0a71fca7e 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/permission/SysRoleRefreshConsumer.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/consumer/permission/SysRoleRefreshConsumer.java @@ -1,7 +1,7 @@ -package cn.iocoder.dashboard.modules.system.mq.consumer.permission; +package cn.iocoder.dashboard.modules.system.redis.mq.consumer.permission; import cn.iocoder.dashboard.framework.redis.core.pubsub.AbstractChannelMessageListener; -import cn.iocoder.dashboard.modules.system.mq.message.permission.SysRoleRefreshMessage; +import cn.iocoder.dashboard.modules.system.redis.mq.message.permission.SysRoleRefreshMessage; import cn.iocoder.dashboard.modules.system.service.permission.SysRoleService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/consumer/sms/SmsSendConsumer.java b/src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/consumer/sms/SmsSendConsumer.java new file mode 100644 index 000000000..db8d727ad --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/consumer/sms/SmsSendConsumer.java @@ -0,0 +1,56 @@ +//package cn.iocoder.dashboard.modules.system.redis.mq.consumer.sms; +// +//import cn.iocoder.dashboard.framework.redis.core.pubsub.AbstractChannelMessageListener; +//import cn.iocoder.dashboard.framework.sms.client.AbstractSmsClient; +//import cn.iocoder.dashboard.framework.sms.core.SmsResult; +//import cn.iocoder.dashboard.modules.system.redis.mq.message.dept.SysDeptRefreshMessage; +//import cn.iocoder.dashboard.modules.system.redis.stream.sms.SmsSendMessage; +//import cn.iocoder.dashboard.modules.system.service.sms.SysSmsChannelService; +//import cn.iocoder.dashboard.modules.system.service.sms.SysSmsQueryLogService; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.data.redis.connection.stream.Consumer; +//import org.springframework.data.redis.connection.stream.ObjectRecord; +//import org.springframework.data.redis.connection.stream.ReadOffset; +//import org.springframework.data.redis.connection.stream.StreamOffset; +//import org.springframework.data.redis.core.StringRedisTemplate; +//import org.springframework.stereotype.Component; +// +//import javax.annotation.Resource; +// +///** +// * 针对 {@link SysDeptRefreshMessage} 的消费者 +// * +// * @author 芋道源码 +// */ +//@Component +//@Slf4j +//public class SmsSendConsumer extends AbstractChannelMessageListener { +// +// @Resource +// private SysSmsChannelService smsChannelService; +// +// @Resource +// private SysSmsQueryLogService smsQueryLogService; +// +// @Autowired +// StringRedisTemplate redisTemplate; +// +// @Override +// public void onMessage(SmsSendMessage message) { +// +// redisTemplate.opsForStream().add(ObjectRecord.create("String", message)); +// +// redisTemplate.opsForStream().read(Consumer.from("",""), StreamOffset.create("", ReadOffset.lastConsumed())); +// +// +// +// log.info("[onMessage][收到 发送短信 消息], content: " + message.toString()); +// AbstractSmsClient smsClient = smsChannelService.getSmsClient(message.getSmsBody().getTemplateCode()); +// String templateApiId = smsChannelService.getSmsTemplateApiIdByCode(message.getSmsBody().getTemplateCode()); +// +// SmsResult result = smsClient.send(templateApiId, message.getSmsBody(), message.getTargetPhone()); +// smsQueryLogService.afterSendLog(message.getSmsBody().getSmsLogId(), result); +// } +// +//} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/dept/SysDeptRefreshMessage.java b/src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/message/dept/SysDeptRefreshMessage.java similarity index 81% rename from src/main/java/cn/iocoder/dashboard/modules/system/mq/message/dept/SysDeptRefreshMessage.java rename to src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/message/dept/SysDeptRefreshMessage.java index a78b1250f..0c069e319 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/dept/SysDeptRefreshMessage.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/message/dept/SysDeptRefreshMessage.java @@ -1,4 +1,4 @@ -package cn.iocoder.dashboard.modules.system.mq.message.dept; +package cn.iocoder.dashboard.modules.system.redis.mq.message.dept; import cn.iocoder.dashboard.framework.redis.core.pubsub.ChannelMessage; import lombok.Data; diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/dict/SysDictDataRefreshMessage.java b/src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/message/dict/SysDictDataRefreshMessage.java similarity index 82% rename from src/main/java/cn/iocoder/dashboard/modules/system/mq/message/dict/SysDictDataRefreshMessage.java rename to src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/message/dict/SysDictDataRefreshMessage.java index 7fad277c4..2d4342423 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/dict/SysDictDataRefreshMessage.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/message/dict/SysDictDataRefreshMessage.java @@ -1,4 +1,4 @@ -package cn.iocoder.dashboard.modules.system.mq.message.dict; +package cn.iocoder.dashboard.modules.system.redis.mq.message.dict; import cn.iocoder.dashboard.framework.redis.core.pubsub.ChannelMessage; import lombok.Data; diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/permission/SysMenuRefreshMessage.java b/src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/message/permission/SysMenuRefreshMessage.java similarity index 80% rename from src/main/java/cn/iocoder/dashboard/modules/system/mq/message/permission/SysMenuRefreshMessage.java rename to src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/message/permission/SysMenuRefreshMessage.java index 159682a98..8f72705ee 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/permission/SysMenuRefreshMessage.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/message/permission/SysMenuRefreshMessage.java @@ -1,4 +1,4 @@ -package cn.iocoder.dashboard.modules.system.mq.message.permission; +package cn.iocoder.dashboard.modules.system.redis.mq.message.permission; import cn.iocoder.dashboard.framework.redis.core.pubsub.ChannelMessage; import lombok.Data; diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/permission/SysRoleMenuRefreshMessage.java b/src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/message/permission/SysRoleMenuRefreshMessage.java similarity index 81% rename from src/main/java/cn/iocoder/dashboard/modules/system/mq/message/permission/SysRoleMenuRefreshMessage.java rename to src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/message/permission/SysRoleMenuRefreshMessage.java index 491c9b0d2..b1c303dbe 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/permission/SysRoleMenuRefreshMessage.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/message/permission/SysRoleMenuRefreshMessage.java @@ -1,4 +1,4 @@ -package cn.iocoder.dashboard.modules.system.mq.message.permission; +package cn.iocoder.dashboard.modules.system.redis.mq.message.permission; import cn.iocoder.dashboard.framework.redis.core.pubsub.ChannelMessage; import lombok.Data; diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/permission/SysRoleRefreshMessage.java b/src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/message/permission/SysRoleRefreshMessage.java similarity index 80% rename from src/main/java/cn/iocoder/dashboard/modules/system/mq/message/permission/SysRoleRefreshMessage.java rename to src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/message/permission/SysRoleRefreshMessage.java index b99401021..ac46d181e 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/permission/SysRoleRefreshMessage.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/message/permission/SysRoleRefreshMessage.java @@ -1,4 +1,4 @@ -package cn.iocoder.dashboard.modules.system.mq.message.permission; +package cn.iocoder.dashboard.modules.system.redis.mq.message.permission; import cn.iocoder.dashboard.framework.redis.core.pubsub.ChannelMessage; import lombok.Data; diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/dept/SysDeptProducer.java b/src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/producer/dept/SysDeptProducer.java similarity index 80% rename from src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/dept/SysDeptProducer.java rename to src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/producer/dept/SysDeptProducer.java index 4ad7db4b8..3ce859fa4 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/dept/SysDeptProducer.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/producer/dept/SysDeptProducer.java @@ -1,7 +1,7 @@ -package cn.iocoder.dashboard.modules.system.mq.producer.dept; +package cn.iocoder.dashboard.modules.system.redis.mq.producer.dept; import cn.iocoder.dashboard.framework.redis.core.util.RedisMessageUtils; -import cn.iocoder.dashboard.modules.system.mq.message.dept.SysDeptRefreshMessage; +import cn.iocoder.dashboard.modules.system.redis.mq.message.dept.SysDeptRefreshMessage; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Component; diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/dict/SysDictDataProducer.java b/src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/producer/dict/SysDictDataProducer.java similarity index 80% rename from src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/dict/SysDictDataProducer.java rename to src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/producer/dict/SysDictDataProducer.java index 2ccfc51d2..af9daae84 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/dict/SysDictDataProducer.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/producer/dict/SysDictDataProducer.java @@ -1,7 +1,7 @@ -package cn.iocoder.dashboard.modules.system.mq.producer.dict; +package cn.iocoder.dashboard.modules.system.redis.mq.producer.dict; import cn.iocoder.dashboard.framework.redis.core.util.RedisMessageUtils; -import cn.iocoder.dashboard.modules.system.mq.message.dict.SysDictDataRefreshMessage; +import cn.iocoder.dashboard.modules.system.redis.mq.message.dict.SysDictDataRefreshMessage; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Component; diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/permission/SysMenuProducer.java b/src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/producer/permission/SysMenuProducer.java similarity index 79% rename from src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/permission/SysMenuProducer.java rename to src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/producer/permission/SysMenuProducer.java index 6d664c725..9a760ad2d 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/permission/SysMenuProducer.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/producer/permission/SysMenuProducer.java @@ -1,7 +1,7 @@ -package cn.iocoder.dashboard.modules.system.mq.producer.permission; +package cn.iocoder.dashboard.modules.system.redis.mq.producer.permission; import cn.iocoder.dashboard.framework.redis.core.util.RedisMessageUtils; -import cn.iocoder.dashboard.modules.system.mq.message.permission.SysMenuRefreshMessage; +import cn.iocoder.dashboard.modules.system.redis.mq.message.permission.SysMenuRefreshMessage; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Component; diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/permission/SysPermissionProducer.java b/src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/producer/permission/SysPermissionProducer.java similarity index 79% rename from src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/permission/SysPermissionProducer.java rename to src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/producer/permission/SysPermissionProducer.java index f9eded668..67a4769a1 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/permission/SysPermissionProducer.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/producer/permission/SysPermissionProducer.java @@ -1,7 +1,7 @@ -package cn.iocoder.dashboard.modules.system.mq.producer.permission; +package cn.iocoder.dashboard.modules.system.redis.mq.producer.permission; import cn.iocoder.dashboard.framework.redis.core.util.RedisMessageUtils; -import cn.iocoder.dashboard.modules.system.mq.message.permission.SysRoleMenuRefreshMessage; +import cn.iocoder.dashboard.modules.system.redis.mq.message.permission.SysRoleMenuRefreshMessage; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Component; diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/permission/SysRoleProducer.java b/src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/producer/permission/SysRoleProducer.java similarity index 79% rename from src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/permission/SysRoleProducer.java rename to src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/producer/permission/SysRoleProducer.java index e11945dfe..f1be4b87b 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/permission/SysRoleProducer.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/producer/permission/SysRoleProducer.java @@ -1,7 +1,7 @@ -package cn.iocoder.dashboard.modules.system.mq.producer.permission; +package cn.iocoder.dashboard.modules.system.redis.mq.producer.permission; import cn.iocoder.dashboard.framework.redis.core.util.RedisMessageUtils; -import cn.iocoder.dashboard.modules.system.mq.message.permission.SysRoleRefreshMessage; +import cn.iocoder.dashboard.modules.system.redis.mq.message.permission.SysRoleRefreshMessage; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Component; diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/producer/sms/SmsProducer.java b/src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/producer/sms/SmsProducer.java new file mode 100644 index 000000000..3e4681715 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/system/redis/mq/producer/sms/SmsProducer.java @@ -0,0 +1,31 @@ +//package cn.iocoder.dashboard.modules.system.redis.mq.producer.sms; +// +//import cn.iocoder.dashboard.framework.redis.core.util.RedisMessageUtils; +//import cn.iocoder.dashboard.framework.sms.core.SmsBody; +//import cn.iocoder.dashboard.modules.system.redis.stream.sms.SmsSendMessage; +//import org.springframework.data.redis.core.StringRedisTemplate; +//import org.springframework.stereotype.Component; +// +//import javax.annotation.Resource; +// +///** +// * 短信的 Producer +// */ +//@Component +//public class SmsProducer { +// +// @Resource +// private StringRedisTemplate stringRedisTemplate; +// +// /** +// * 发送 {@link SmsSendMessage} 消息 +// */ +// public void sendSmsSendMessage(SmsBody smsBody, String targetPhone) { +// SmsSendMessage message = new SmsSendMessage(); +// message.setSmsBody(smsBody); +// message.setTargetPhone(targetPhone); +// // TODO FROM 芋艿 TO ZZF:这块等未来改哈。这个方法目前是广播消费,会导致每个节点都发送一次。等后续封装出 redis stream 消息 +// RedisMessageUtils.sendChannelMessage(stringRedisTemplate, message); +// } +// +//} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/redis/stream/StreamConsumerRunner.java b/src/main/java/cn/iocoder/dashboard/modules/system/redis/stream/StreamConsumerRunner.java new file mode 100644 index 000000000..7cd9d2486 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/system/redis/stream/StreamConsumerRunner.java @@ -0,0 +1,93 @@ +package cn.iocoder.dashboard.modules.system.redis.stream; + +import cn.iocoder.dashboard.framework.redis.core.util.RedisStreamUtils; +import cn.iocoder.dashboard.modules.system.redis.stream.sms.SmsSendMessage; +import cn.iocoder.dashboard.modules.system.redis.stream.sms.SmsSendStreamConsumer; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.DisposableBean; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.connection.stream.*; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.data.redis.serializer.StringRedisSerializer; +import org.springframework.data.redis.stream.StreamMessageListenerContainer; +import org.springframework.data.redis.stream.StreamMessageListenerContainer.StreamMessageListenerContainerOptions; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.stereotype.Component; +import org.springframework.util.ErrorHandler; + +import javax.annotation.Resource; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.time.Duration; + + +@Slf4j +@Component +public class StreamConsumerRunner implements ApplicationRunner, DisposableBean { + + @Resource + RedisConnectionFactory redisConnectionFactory; + + @Resource + ThreadPoolTaskExecutor threadPoolTaskExecutor; + + @Resource + SmsSendStreamConsumer streamMessageListener; + + @Resource + StringRedisTemplate stringRedisTemplate; + + private StreamMessageListenerContainer> streamMessageListenerContainer; + + @Override + public void run(ApplicationArguments args) throws UnknownHostException { + + StreamInfo.XInfoGroups groups = stringRedisTemplate.opsForStream().groups(RedisStreamUtils.KEY_SMS_SEND); + if (groups.isEmpty()) { + stringRedisTemplate.opsForStream().createGroup(RedisStreamUtils.KEY_SMS_SEND, RedisStreamUtils.GROUP_SMS_SEND); + } + + + // 创建配置对象 + StreamMessageListenerContainerOptions> streamMessageListenerContainerOptions = StreamMessageListenerContainerOptions + .builder() + // 一次性最多拉取多少条消息 + .batchSize(10) + // 执行消息轮询的执行器 + .executor(this.threadPoolTaskExecutor) + // 消息消费异常的handler + .errorHandler(new ErrorHandler() { + @Override + public void handleError(Throwable t) { + // throw new RuntimeException(t); + t.printStackTrace(); + } + }) + // 超时时间,设置为0,表示不超时(超时后会抛出异常) + .pollTimeout(Duration.ZERO) + // 序列化器 + .serializer(new StringRedisSerializer()) + .targetType(SmsSendMessage.class) + .build(); + + // 根据配置对象创建监听容器对象 + StreamMessageListenerContainer> streamMessageListenerContainer = StreamMessageListenerContainer + .create(this.redisConnectionFactory, streamMessageListenerContainerOptions); + + // 使用监听容器对象开始监听消费(使用的是手动确认方式) + streamMessageListenerContainer.receive(Consumer.from(RedisStreamUtils.GROUP_SMS_SEND, InetAddress.getLocalHost().getHostName()), + StreamOffset.create(RedisStreamUtils.KEY_SMS_SEND, ReadOffset.lastConsumed()), this.streamMessageListener); + + this.streamMessageListenerContainer = streamMessageListenerContainer; + // 启动监听 + this.streamMessageListenerContainer.start(); + + } + + @Override + public void destroy() throws Exception { + this.streamMessageListenerContainer.stop(); + } +} \ No newline at end of file diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/redis/stream/sms/SmsSendMessage.java b/src/main/java/cn/iocoder/dashboard/modules/system/redis/stream/sms/SmsSendMessage.java new file mode 100644 index 000000000..a8aeff23f --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/system/redis/stream/sms/SmsSendMessage.java @@ -0,0 +1,16 @@ +package cn.iocoder.dashboard.modules.system.redis.stream.sms; + +import cn.iocoder.dashboard.framework.sms.core.SmsBody; +import lombok.Data; + +/** + * 部门数据刷新 Message + */ +@Data +public class SmsSendMessage { + + private SmsBody smsBody; + + private String targetPhone; + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/redis/stream/sms/SmsSendStreamConsumer.java b/src/main/java/cn/iocoder/dashboard/modules/system/redis/stream/sms/SmsSendStreamConsumer.java new file mode 100644 index 000000000..0ab531b43 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/system/redis/stream/sms/SmsSendStreamConsumer.java @@ -0,0 +1,43 @@ +package cn.iocoder.dashboard.modules.system.redis.stream.sms; + +import cn.iocoder.dashboard.framework.sms.client.AbstractSmsClient; +import cn.iocoder.dashboard.framework.sms.core.SmsBody; +import cn.iocoder.dashboard.framework.sms.core.SmsResult; +import cn.iocoder.dashboard.modules.system.service.sms.SysSmsChannelService; +import cn.iocoder.dashboard.modules.system.service.sms.SysSmsQueryLogService; +import cn.iocoder.dashboard.util.json.JsonUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.connection.stream.ObjectRecord; +import org.springframework.data.redis.stream.StreamListener; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * 短信发送流消息监听器 + * + * @author zzf + * @date 2021/3/9 16:35 + */ +@Slf4j +@Component +public class SmsSendStreamConsumer implements StreamListener> { + + @Resource + private SysSmsChannelService smsChannelService; + + @Resource + private SysSmsQueryLogService smsQueryLogService; + + @Override + public void onMessage(ObjectRecord record) { + SmsSendMessage message = record.getValue(); + SmsBody body = message.getSmsBody(); + log.info("[onMessage][收到 发送短信 消息], content: " + JsonUtils.toJsonString(body)); + AbstractSmsClient smsClient = smsChannelService.getSmsClient(body.getTemplateCode()); + String templateApiId = smsChannelService.getSmsTemplateApiIdByCode(body.getTemplateCode()); + + SmsResult result = smsClient.send(templateApiId, body, message.getTargetPhone()); + smsQueryLogService.afterSendLog(body.getSmsLogId(), result); + } +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/redis/stream/sms/SmsSendStreamProducer.java b/src/main/java/cn/iocoder/dashboard/modules/system/redis/stream/sms/SmsSendStreamProducer.java new file mode 100644 index 000000000..069534251 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/system/redis/stream/sms/SmsSendStreamProducer.java @@ -0,0 +1,35 @@ +package cn.iocoder.dashboard.modules.system.redis.stream.sms; + +import cn.iocoder.dashboard.framework.redis.core.util.RedisStreamUtils; +import cn.iocoder.dashboard.framework.sms.core.SmsBody; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * 短信发送流消息监听器 + * + * @author zzf + * @date 2021/3/9 16:35 + */ +@Slf4j +@Component +public class SmsSendStreamProducer { + + @Resource + private StringRedisTemplate stringRedisTemplate; + + /** + * 发送 {@link SmsSendMessage} 消息 + */ + public void sendSmsSendMessage(SmsBody smsBody, String targetPhone) { + SmsSendMessage message = new SmsSendMessage(); + message.setSmsBody(smsBody); + message.setTargetPhone(targetPhone); + + RedisStreamUtils.sendChannelMessage(stringRedisTemplate, message); + } + +} \ No newline at end of file diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/dept/impl/SysDeptServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/dept/impl/SysDeptServiceImpl.java index d3ff381ef..caa16e94b 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/dept/impl/SysDeptServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/dept/impl/SysDeptServiceImpl.java @@ -11,7 +11,7 @@ import cn.iocoder.dashboard.modules.system.convert.dept.SysDeptConvert; import cn.iocoder.dashboard.modules.system.dal.mysql.dao.dept.SysDeptMapper; import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dept.SysDeptDO; import cn.iocoder.dashboard.modules.system.enums.dept.DeptIdEnum; -import cn.iocoder.dashboard.modules.system.mq.producer.dept.SysDeptProducer; +import cn.iocoder.dashboard.modules.system.redis.mq.producer.dept.SysDeptProducer; import cn.iocoder.dashboard.modules.system.service.dept.SysDeptService; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMultimap; diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/impl/SysDictDataServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/impl/SysDictDataServiceImpl.java index 6e8f02388..49e5beabf 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/impl/SysDictDataServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/impl/SysDictDataServiceImpl.java @@ -13,7 +13,7 @@ import cn.iocoder.dashboard.modules.system.convert.dict.SysDictDataConvert; import cn.iocoder.dashboard.modules.system.dal.mysql.dao.dict.SysDictDataMapper; import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dict.SysDictDataDO; import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dict.SysDictTypeDO; -import cn.iocoder.dashboard.modules.system.mq.producer.dict.SysDictDataProducer; +import cn.iocoder.dashboard.modules.system.redis.mq.producer.dict.SysDictDataProducer; import cn.iocoder.dashboard.modules.system.service.dict.SysDictDataService; import cn.iocoder.dashboard.modules.system.service.dict.SysDictTypeService; import com.google.common.collect.ImmutableTable; diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysMenuServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysMenuServiceImpl.java index 60a4015b5..31c0991c9 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysMenuServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysMenuServiceImpl.java @@ -11,7 +11,7 @@ import cn.iocoder.dashboard.modules.system.dal.mysql.dao.permission.SysMenuMappe import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysMenuDO; import cn.iocoder.dashboard.modules.system.enums.permission.MenuIdEnum; import cn.iocoder.dashboard.modules.system.enums.permission.MenuTypeEnum; -import cn.iocoder.dashboard.modules.system.mq.producer.permission.SysMenuProducer; +import cn.iocoder.dashboard.modules.system.redis.mq.producer.permission.SysMenuProducer; import cn.iocoder.dashboard.modules.system.service.permission.SysMenuService; import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService; import cn.iocoder.dashboard.util.collection.CollectionUtils; diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysPermissionServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysPermissionServiceImpl.java index 3b3647fc4..5746357a6 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysPermissionServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysPermissionServiceImpl.java @@ -11,7 +11,7 @@ import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysMe import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDO; import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleMenuDO; import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysUserRoleDO; -import cn.iocoder.dashboard.modules.system.mq.producer.permission.SysPermissionProducer; +import cn.iocoder.dashboard.modules.system.redis.mq.producer.permission.SysPermissionProducer; import cn.iocoder.dashboard.modules.system.service.permission.SysMenuService; import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService; import cn.iocoder.dashboard.modules.system.service.permission.SysRoleService; diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysRoleServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysRoleServiceImpl.java index a40896b97..6fbb2bae8 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysRoleServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysRoleServiceImpl.java @@ -15,7 +15,7 @@ import cn.iocoder.dashboard.modules.system.dal.mysql.dao.permission.SysRoleMappe import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDO; import cn.iocoder.dashboard.modules.system.enums.permission.RoleCodeEnum; import cn.iocoder.dashboard.modules.system.enums.permission.SysRoleTypeEnum; -import cn.iocoder.dashboard.modules.system.mq.producer.permission.SysRoleProducer; +import cn.iocoder.dashboard.modules.system.redis.mq.producer.permission.SysRoleProducer; import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService; import cn.iocoder.dashboard.modules.system.service.permission.SysRoleService; import com.google.common.collect.ImmutableMap; diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsChannelService.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsChannelService.java index a2ebf13b2..3ce83fe78 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsChannelService.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsChannelService.java @@ -2,12 +2,14 @@ package cn.iocoder.dashboard.modules.system.service.sms; import cn.iocoder.dashboard.common.pojo.PageResult; import cn.iocoder.dashboard.framework.sms.client.AbstractSmsClient; +import cn.iocoder.dashboard.framework.sms.core.SmsResultDetail; import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsChannelAllVO; import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelCreateReqVO; import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelPageReqVO; import cn.iocoder.dashboard.modules.system.controller.sms.vo.resp.SmsChannelEnumRespVO; import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SysSmsChannelDO; +import javax.servlet.ServletRequest; import java.util.List; /** diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsQueryLogService.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsQueryLogService.java index 7312e2355..e5ec2fa3c 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsQueryLogService.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsQueryLogService.java @@ -3,6 +3,7 @@ package cn.iocoder.dashboard.modules.system.service.sms; import cn.iocoder.dashboard.framework.sms.client.AbstractSmsClient; import cn.iocoder.dashboard.framework.sms.core.SmsBody; import cn.iocoder.dashboard.framework.sms.core.SmsResult; +import cn.iocoder.dashboard.framework.sms.core.SmsResultDetail; import java.util.List; @@ -16,16 +17,16 @@ public interface SysSmsQueryLogService { /** * 发送短信前的日志处理 * - * @param smsBody 短信内容 - * @param targetPhones 发送对象手机号集合 - * @param client 短信客户端 + * @param smsBody 短信内容 + * @param targetPhone 发送对象手机号 + * @param client 短信客户端 * @return 生成的日志id */ // TODO FROM 芋艿 to ZZF: async 是针对发送的方式,对于日志不一定需要关心。这样,短信日志,实际就发送前插入,发送后更新结果. // 这里只用于记录状态,毕竟异步可能推送失败,此时日志可记录该状态。 // TODO FROM 芋艿 to ZZF:短信日志,群发的情况,应该是每个手机一条哈。虽然是群发,但是可能部分成功,部分失败;对应到短信平台,实际也是多条。 - void beforeSendLog(SmsBody smsBody, List targetPhones, AbstractSmsClient client); + void beforeSendLog(SmsBody smsBody, String targetPhone, AbstractSmsClient client); /** * 发送消息后的日志处理 @@ -35,4 +36,5 @@ public interface SysSmsQueryLogService { */ void afterSendLog(Long logId, SmsResult result); + void updateSendLogByResultDetail(SmsResultDetail smsResultDetail); } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsService.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsService.java index 6d851d4f6..93a467d62 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsService.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsService.java @@ -1,10 +1,12 @@ package cn.iocoder.dashboard.modules.system.service.sms; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ArrayUtil; import cn.iocoder.dashboard.framework.sms.core.SmsBody; +import cn.iocoder.dashboard.framework.sms.core.enums.SmsChannelEnum; import javax.servlet.ServletRequest; import java.util.Arrays; -import java.util.Collections; import java.util.List; /** @@ -22,7 +24,12 @@ public interface SysSmsService { * @param smsBody 消息内容 * @param targetPhones 发送对象手机号列表 */ - void send(SmsBody smsBody, List targetPhones); + default void send(SmsBody smsBody, List targetPhones) { + if (CollectionUtil.isEmpty(targetPhones)) { + return; + } + targetPhones.forEach(s -> this.send(smsBody, s)); + } /** * 发送消息 @@ -30,9 +37,7 @@ public interface SysSmsService { * @param smsBody 消息内容 * @param targetPhone 发送对象手机号 */ - default void send(SmsBody smsBody, String targetPhone) { - send(smsBody, Collections.singletonList(targetPhone)); - } + void send(SmsBody smsBody, String targetPhone); /** * 发送消息 @@ -41,14 +46,18 @@ public interface SysSmsService { * @param targetPhones 发送对象手机号数组 */ default void send(SmsBody smsBody, String... targetPhones) { + if (ArrayUtil.isEmpty(targetPhones)) { + return; + } send(smsBody, Arrays.asList(targetPhones)); } /** * 处理短信发送回调函数 * - * @param request 请求 + * @param request 请求 * @return 响应数据 */ Object smsSendCallbackHandle(ServletRequest request); + } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsQueryLogServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsQueryLogServiceImpl.java index 7264f550c..a08a7bb76 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsQueryLogServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsQueryLogServiceImpl.java @@ -3,16 +3,15 @@ package cn.iocoder.dashboard.modules.system.service.sms.impl; import cn.iocoder.dashboard.framework.sms.client.AbstractSmsClient; import cn.iocoder.dashboard.framework.sms.core.SmsBody; import cn.iocoder.dashboard.framework.sms.core.SmsResult; +import cn.iocoder.dashboard.framework.sms.core.SmsResultDetail; import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperty; import cn.iocoder.dashboard.modules.system.dal.mysql.dao.sms.SysSmsQueryLogMapper; import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SysSmsQueryLogDO; import cn.iocoder.dashboard.modules.system.enums.sms.SmsSendStatusEnum; import cn.iocoder.dashboard.modules.system.service.sms.SysSmsQueryLogService; -import cn.iocoder.dashboard.util.json.JsonUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; -import java.util.List; /** * 短信请求日志服务实现类 @@ -27,14 +26,14 @@ public class SysSmsQueryLogServiceImpl implements SysSmsQueryLogService { private SysSmsQueryLogMapper logMapper; @Override - public void beforeSendLog(SmsBody smsBody, List targetPhones, AbstractSmsClient client) { + public void beforeSendLog(SmsBody smsBody, String targetPhone, AbstractSmsClient client) { SysSmsQueryLogDO smsLog = new SysSmsQueryLogDO(); SmsChannelProperty property = client.getProperty(); smsLog.setChannelCode(property.getCode()) .setChannelId(property.getId()) .setTemplateCode(smsBody.getTemplateCode()) - .setPhones(targetPhones) + .setPhone(targetPhone) .setContent(smsBody.getParams().toString()); smsLog.setSendStatus(SmsSendStatusEnum.ASYNC.getStatus()); @@ -46,14 +45,19 @@ public class SysSmsQueryLogServiceImpl implements SysSmsQueryLogService { public void afterSendLog(Long logId, SmsResult result) { SysSmsQueryLogDO smsLog = new SysSmsQueryLogDO(); smsLog.setId(logId); - if (result.getSuccess()) { - smsLog.setSendStatus(SmsSendStatusEnum.QUERY_SUCCESS.getStatus()); - smsLog.setSendResultParam(result.getSendResultParam()); - } else { - smsLog.setSendStatus(SmsSendStatusEnum.QUERY_FAIL.getStatus()); - smsLog.setRemark(result.getMessage()); - } + smsLog.setApiId(result.getApiId()); + smsLog.setSendStatus(SmsSendStatusEnum.QUERY_FAIL.getStatus()); + smsLog.setRemark(result.getCode() + ": " + result.getMessage()); logMapper.updateById(smsLog); } + @Override + public void updateSendLogByResultDetail(SmsResultDetail smsResultDetail) { + SysSmsQueryLogDO queryLogDO = new SysSmsQueryLogDO(); + queryLogDO.setSendStatus(smsResultDetail.getSendStatus()); + queryLogDO.setSendTime(smsResultDetail.getSendTime()); + queryLogDO.setRemark(smsResultDetail.getMessage()); + logMapper.updateByApiId(queryLogDO, smsResultDetail.getApiId()); + } + } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsSendLogServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsSendLogServiceImpl.java index 03ef5575d..c58ce5ca7 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsSendLogServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsSendLogServiceImpl.java @@ -2,7 +2,6 @@ package cn.iocoder.dashboard.modules.system.service.sms.impl; import cn.hutool.core.collection.CollectionUtil; import cn.iocoder.dashboard.framework.sms.client.AbstractSmsClient; -import cn.iocoder.dashboard.framework.sms.client.NeedQuerySendResultSmsClient; import cn.iocoder.dashboard.framework.sms.core.SmsResultDetail; import cn.iocoder.dashboard.modules.system.dal.mysql.dao.sms.SysSmsQueryLogMapper; import cn.iocoder.dashboard.modules.system.dal.mysql.dao.sms.SysSmsSendLogMapper; @@ -62,7 +61,7 @@ public class SysSmsSendLogServiceImpl implements SysSmsSendLogService { updateQueryLog.setId(queryLog.getId()); // 只处理实现了获取发送结果方法的短信客户端,理论上这里都是满足条件的,以防万一加个判断。 - if (smsClient instanceof NeedQuerySendResultSmsClient) { + /*if (smsClient instanceof NeedQuerySendResultSmsClient) { //初始化点字段值 queryLog2SendLong(insertSendLog, queryLog); @@ -89,7 +88,7 @@ public class SysSmsSendLogServiceImpl implements SysSmsSendLogService { //理论上这里都是满足条件的,以防万一加个判断。 updateQueryLog.setSendStatus(SmsSendStatusEnum.QUERY_SEND_FAIL.getStatus()); smsQueryLogMapper.updateById(updateQueryLog); - } + }*/ updateQueryLog.setSendStatus(SmsSendStatusEnum.SEND_SUCCESS.getStatus()); updateQueryLog.setRemark(String.format("日志(id = %s)对应的客户端没有继承NeedQuerySendResultSmsClient, 不能获取短信结果。", queryLog.getId())); smsQueryLogMapper.updateById(updateQueryLog); diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsServiceImpl.java index 81371e575..c679a8c81 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsServiceImpl.java @@ -2,15 +2,16 @@ package cn.iocoder.dashboard.modules.system.service.sms.impl; import cn.iocoder.dashboard.framework.sms.client.AbstractSmsClient; import cn.iocoder.dashboard.framework.sms.core.SmsBody; -import cn.iocoder.dashboard.modules.system.mq.producer.sms.SmsProducer; +import cn.iocoder.dashboard.framework.sms.core.SmsClientFactory; +import cn.iocoder.dashboard.framework.sms.core.SmsResultDetail; +import cn.iocoder.dashboard.modules.system.redis.stream.sms.SmsSendStreamProducer; import cn.iocoder.dashboard.modules.system.service.sms.SysSmsChannelService; import cn.iocoder.dashboard.modules.system.service.sms.SysSmsQueryLogService; import cn.iocoder.dashboard.modules.system.service.sms.SysSmsService; -import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import javax.annotation.Resource; -import java.util.List; +import javax.servlet.ServletRequest; /** * 短信日志Service实现类 @@ -28,15 +29,23 @@ public class SysSmsServiceImpl implements SysSmsService { private SysSmsQueryLogService logService; @Resource - private SmsProducer smsProducer; + private SmsSendStreamProducer smsProducer; + + @Resource + private SmsClientFactory smsClientFactory; @Override - public void send(SmsBody smsBody, List targetPhones) { + public void send(SmsBody smsBody, String targetPhone) { AbstractSmsClient client = channelService.getSmsClient(smsBody.getTemplateCode()); - logService.beforeSendLog(smsBody, targetPhones, client); - smsProducer.sendSmsSendMessage(smsBody, targetPhones); + logService.beforeSendLog(smsBody, targetPhone, client); + smsProducer.sendSmsSendMessage(smsBody, targetPhone); } - // TODO FROM 芋艿 to ZZF:可能要讨论下,对于短信发送来说,貌似只提供异步发送即可。对于业务来说,一定不能依赖短信的发送结果. + @Override + public Object smsSendCallbackHandle(ServletRequest request) { + SmsResultDetail smsResultDetail = smsClientFactory.getSmsResultDetailFromCallbackQuery(request); + logService.updateSendLogByResultDetail(smsResultDetail); + return smsResultDetail.getCallbackResponseBody(); + } } From efde1280e3b8ef0a9ebfa1d367ccc18baeb22bef Mon Sep 17 00:00:00 2001 From: hccake Date: Fri, 12 Mar 2021 14:02:12 +0800 Subject: [PATCH 030/126] =?UTF-8?q?:zap:=20=E6=B7=BB=E5=8A=A0=20lombok-map?= =?UTF-8?q?struct-bind=EF=BC=8C=E9=81=BF=E5=85=8D=E9=AB=98=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E7=9A=84=E4=B8=8D=E5=85=BC=E5=AE=B9=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/pom.xml b/pom.xml index a601b907d..2ab2cfd06 100644 --- a/pom.xml +++ b/pom.xml @@ -40,8 +40,8 @@ 8.3.0 2.3.1 - 1.16.14 - 1.4.1.Final + 1.4.2.Final + 0.2.0 5.5.6 2.2.7 2.2 @@ -227,18 +227,26 @@ org.projectlombok lombok - ${lombok.version} + true org.mapstruct mapstruct ${mapstruct.version} + true org.mapstruct mapstruct-jdk8 ${mapstruct.version} + true + + + org.projectlombok + lombok-mapstruct-binding + ${lombok-mapstruct-binding.version} + true @@ -317,18 +325,6 @@ ${java.version} ${java.version} - - - org.mapstruct - mapstruct-processor - ${mapstruct.version} - - - org.projectlombok - lombok - ${lombok.version} - - From fe31d61de9e80543a493e15d57dfd08e6d69af30 Mon Sep 17 00:00:00 2001 From: hexiaowu Date: Fri, 12 Mar 2021 18:07:53 +0800 Subject: [PATCH 031/126] =?UTF-8?q?=E5=9B=A0JS=E7=B2=BE=E5=87=86=E5=BA=A6?= =?UTF-8?q?=E9=97=AE=E9=A2=98=EF=BC=8C=E6=9C=80=E5=A4=9A=E8=A1=A8=E7=A4=BA?= =?UTF-8?q?2^53-1=E7=9A=84=E6=95=B0=E5=80=BC=E3=80=82=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?Long=E7=B1=BB=E5=9E=8B=E5=BA=8F=E5=88=97=E5=8C=96=E7=9A=84?= =?UTF-8?q?=E6=97=B6=E5=80=99=EF=BC=8C=E8=87=AA=E5=8A=A8=E4=BC=9A=E8=BD=AC?= =?UTF-8?q?=E6=8D=A2=E4=B8=BA=E5=AD=97=E7=AC=A6=E4=B8=B2=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E8=A7=84=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jackson/config/JacksonConfig.java | 11 +++++++- .../framework/jackson/ser/LongSerializer.java | 26 +++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 src/main/java/cn/iocoder/dashboard/framework/jackson/ser/LongSerializer.java diff --git a/src/main/java/cn/iocoder/dashboard/framework/jackson/config/JacksonConfig.java b/src/main/java/cn/iocoder/dashboard/framework/jackson/config/JacksonConfig.java index 27d199a2d..323b447ce 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/jackson/config/JacksonConfig.java +++ b/src/main/java/cn/iocoder/dashboard/framework/jackson/config/JacksonConfig.java @@ -1,7 +1,9 @@ package cn.iocoder.dashboard.framework.jackson.config; +import cn.iocoder.dashboard.framework.jackson.ser.LongSerializer; import cn.iocoder.dashboard.util.json.JsonUtils; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.module.SimpleModule; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -11,8 +13,15 @@ public class JacksonConfig { @Bean @SuppressWarnings("InstantiationOfUtilityClass") public JsonUtils jsonUtils(ObjectMapper objectMapper) { + SimpleModule simpleModule = new SimpleModule(); + /* + * 新增Long类型序列化规则,数值超过2^53-1,在JS会出现精度丢失问题,因此Long自动序列化为字符串类型 + */ + simpleModule.addSerializer(Long.class,LongSerializer.getInstance()) + .addSerializer(Long.TYPE,LongSerializer.getInstance()); + objectMapper.registerModule(simpleModule); + JsonUtils.init(objectMapper); return new JsonUtils(); } - } diff --git a/src/main/java/cn/iocoder/dashboard/framework/jackson/ser/LongSerializer.java b/src/main/java/cn/iocoder/dashboard/framework/jackson/ser/LongSerializer.java new file mode 100644 index 000000000..6c0561d23 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/framework/jackson/ser/LongSerializer.java @@ -0,0 +1,26 @@ +package cn.iocoder.dashboard.framework.jackson.ser; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; + +import java.io.IOException; + +/** + * Long类型序列化规则 + *

+ * 数值超过2^53-1,在JS会出现精度丢失问题,因此Long自动序列化为字符串类型 + */ +public class LongSerializer extends JsonSerializer { + + private static final LongSerializer LONG_SERIALIZER = new LongSerializer(); + + @Override + public void serialize(Long value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + gen.writeString(value.toString()); + } + + public static LongSerializer getInstance() { + return LONG_SERIALIZER; + } +} From 1d7bacb6c0dc72881752a78fe8ac0762efb627c6 Mon Sep 17 00:00:00 2001 From: hccake Date: Fri, 12 Mar 2021 14:02:12 +0800 Subject: [PATCH 032/126] =?UTF-8?q?:zap:=20=E6=B7=BB=E5=8A=A0=20lombok-map?= =?UTF-8?q?struct-bind=EF=BC=8C=E9=81=BF=E5=85=8D=E9=AB=98=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E7=9A=84=E4=B8=8D=E5=85=BC=E5=AE=B9=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/pom.xml b/pom.xml index a601b907d..1e86dbf56 100644 --- a/pom.xml +++ b/pom.xml @@ -40,8 +40,8 @@ 8.3.0 2.3.1 - 1.16.14 - 1.4.1.Final + 1.4.2.Final + 0.2.0 5.5.6 2.2.7 2.2 @@ -227,18 +227,32 @@ org.projectlombok lombok - ${lombok.version} + true org.mapstruct mapstruct ${mapstruct.version} + true + + + org.mapstruct + mapstruct-processor + ${mapstruct.version} + true org.mapstruct mapstruct-jdk8 ${mapstruct.version} + true + + + org.projectlombok + lombok-mapstruct-binding + ${lombok-mapstruct-binding.version} + true @@ -317,18 +331,6 @@ ${java.version} ${java.version} - - - org.mapstruct - mapstruct-processor - ${mapstruct.version} - - - org.projectlombok - lombok - ${lombok.version} - - From 7861c3ec3f0c2086b244105175ddf331c48cdba9 Mon Sep 17 00:00:00 2001 From: Hccake Date: Sat, 13 Mar 2021 12:38:52 +0800 Subject: [PATCH 033/126] =?UTF-8?q?:bug:=20=E4=BF=AE=E5=A4=8D=20Lombok=20?= =?UTF-8?q?=E5=BB=BA=E9=80=A0=E6=A8=A1=E5=BC=8F=EF=BC=8C=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E6=9E=84=E9=80=A0=E5=87=BD=E6=95=B0=E9=9D=9E=20public,=20mapst?= =?UTF-8?q?ruct=20=E6=97=A0=E6=B3=95=E6=9E=84=E9=80=A0=E5=AE=9E=E4=BE=8B?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tool/dal/dataobject/codegen/ToolCodegenColumnDO.java | 3 ++- .../tool/dal/dataobject/codegen/ToolCodegenTableDO.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/dal/dataobject/codegen/ToolCodegenColumnDO.java b/src/main/java/cn/iocoder/dashboard/modules/tool/dal/dataobject/codegen/ToolCodegenColumnDO.java index 2cdce8da4..f4482e3c0 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/tool/dal/dataobject/codegen/ToolCodegenColumnDO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/dal/dataobject/codegen/ToolCodegenColumnDO.java @@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.Builder; import lombok.Data; import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; /** * 代码生成 column 字段定义 @@ -17,7 +18,7 @@ import lombok.EqualsAndHashCode; */ @TableName(value = "tool_codegen_column", autoResultMap = true) @Data -@Builder +@Accessors(chain = true) @EqualsAndHashCode(callSuper = true) public class ToolCodegenColumnDO extends BaseDO { diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/dal/dataobject/codegen/ToolCodegenTableDO.java b/src/main/java/cn/iocoder/dashboard/modules/tool/dal/dataobject/codegen/ToolCodegenTableDO.java index 315168832..2ce0fac22 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/tool/dal/dataobject/codegen/ToolCodegenTableDO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/dal/dataobject/codegen/ToolCodegenTableDO.java @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.Builder; import lombok.Data; import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; /** * 代码生成 table 表定义 @@ -15,7 +16,7 @@ import lombok.EqualsAndHashCode; */ @TableName(value = "tool_codegen_table", autoResultMap = true) @Data -@Builder +@Accessors(chain = true) @EqualsAndHashCode(callSuper = true) public class ToolCodegenTableDO extends BaseDO { From 7089ef7651edb115bedbc504c584a7aedcac98a5 Mon Sep 17 00:00:00 2001 From: timfruit Date: Sat, 13 Mar 2021 13:21:33 +0800 Subject: [PATCH 034/126] =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E8=89=BF=E8=89=BF?= =?UTF-8?q?=E7=9A=84=E8=AF=B4=E6=98=8E=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/doc/InfDbDocController.java | 78 +++++++++++-------- 1 file changed, 45 insertions(+), 33 deletions(-) diff --git a/src/main/java/cn/iocoder/dashboard/modules/infra/controller/doc/InfDbDocController.java b/src/main/java/cn/iocoder/dashboard/modules/infra/controller/doc/InfDbDocController.java index 47f748433..c39392c33 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/infra/controller/doc/InfDbDocController.java +++ b/src/main/java/cn/iocoder/dashboard/modules/infra/controller/doc/InfDbDocController.java @@ -1,6 +1,10 @@ package cn.iocoder.dashboard.modules.infra.controller.doc; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.IoUtil; import cn.hutool.core.lang.UUID; +import cn.hutool.core.util.IdUtil; +import cn.hutool.extra.servlet.ServletUtil; import cn.iocoder.dashboard.util.servlet.ServletUtils; import cn.smallbun.screw.core.Configuration; import cn.smallbun.screw.core.engine.EngineConfig; @@ -11,7 +15,11 @@ import cn.smallbun.screw.core.process.ProcessConfig; import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; +import org.springframework.http.MediaType; import org.springframework.util.StreamUtils; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -39,74 +47,78 @@ public class InfDbDocController { @GetMapping("/export-html") + @ApiOperation("导出html格式的数据文档") + @ApiImplicitParams({ + @ApiImplicitParam(name = "deleteFile", value = "是否删除在服务器本地生成的数据库文档", example = "true", dataTypeClass = Boolean.class), + }) public void exportHtml(@RequestParam(defaultValue = "true") Boolean deleteFile, - HttpServletResponse response) throws IOException { - EngineFileType fileOutputType=EngineFileType.HTML; - doExportFile(fileOutputType,deleteFile,response); + HttpServletResponse response) throws IOException { + doExportFile(EngineFileType.HTML, deleteFile, response); } - - @GetMapping("/export-word") + @ApiOperation("导出word格式的数据文档") + @ApiImplicitParams({ + @ApiImplicitParam(name = "deleteFile", value = "是否删除在服务器本地生成的数据库文档", example = "true", dataTypeClass = Boolean.class), + }) public void exportWord(@RequestParam(defaultValue = "true") Boolean deleteFile, - HttpServletResponse response) throws IOException { - EngineFileType fileOutputType=EngineFileType.WORD; - doExportFile(fileOutputType,deleteFile,response); + HttpServletResponse response) throws IOException { + doExportFile(EngineFileType.WORD, deleteFile, response); } - @GetMapping("/export-markdown") + @ApiOperation("导出markdown格式的数据文档") + @ApiImplicitParams({ + @ApiImplicitParam(name = "deleteFile", value = "是否删除在服务器本地生成的数据库文档", example = "true", dataTypeClass = Boolean.class), + }) public void exportMarkdown(@RequestParam(defaultValue = "true") Boolean deleteFile, - HttpServletResponse response) throws IOException { - EngineFileType fileOutputType=EngineFileType.MD; - doExportFile(fileOutputType,deleteFile,response); + HttpServletResponse response) throws IOException { + doExportFile(EngineFileType.MD, deleteFile, response); } private void doExportFile(EngineFileType fileOutputType, Boolean deleteFile, HttpServletResponse response) throws IOException { - String docFileName=DOC_FILE_NAME+"_"+ UUID.fastUUID().toString(true); - String filePath= doExportFile(fileOutputType,docFileName); - String downloadFileName=DOC_FILE_NAME+fileOutputType.getFileSuffix(); //下载后的文件名 + String docFileName = DOC_FILE_NAME + "_" + IdUtil.fastSimpleUUID(); + String filePath = doExportFile(fileOutputType, docFileName); + String downloadFileName = DOC_FILE_NAME + fileOutputType.getFileSuffix(); //下载后的文件名 // 读取,返回 - try (InputStream is=new FileInputStream(filePath)){//处理后关闭文件流才能删除 - ServletUtils.writeAttachment(response,downloadFileName, StreamUtils.copyToByteArray(is)); - } - handleDeleteFile(deleteFile,filePath); + //IoUtil.readBytes 直接读取FileInputStream 不会关闭流,有bug,所以用BufferedInputStream包装一下, 关闭流后才能删除文件 + byte[] content = IoUtil.readBytes(new BufferedInputStream(new FileInputStream(filePath))); + //这里不用hutool工具类,它的中文文件名编码有问题,导致在浏览器下载时有问题 + ServletUtils.writeAttachment(response, downloadFileName, content); + handleDeleteFile(deleteFile, filePath); } - /** * 输出文件,返回文件路径 - * @param fileOutputType - * @param fileName - * @return + * + * @param fileOutputType 文件类型 + * @param fileName 文件名, 无需 ".docx" 等文件后缀 + * @return 生成的文件所在路径 */ - private String doExportFile(EngineFileType fileOutputType, String fileName){ + private String doExportFile(EngineFileType fileOutputType, String fileName) { try (HikariDataSource dataSource = buildDataSource()) { // 创建 screw 的配置 Configuration config = Configuration.builder() .version(DOC_VERSION) // 版本 .description(DOC_DESCRIPTION) // 描述 .dataSource(dataSource) // 数据源 - .engineConfig(buildEngineConfig(fileOutputType,fileName)) // 引擎配置 + .engineConfig(buildEngineConfig(fileOutputType, fileName)) // 引擎配置 .produceConfig(buildProcessConfig()) // 处理配置 .build(); // 执行 screw,生成数据库文档 new DocumentationExecute(config).execute(); - - String filePath=FILE_OUTPUT_DIR + File.separator + fileName + fileOutputType.getFileSuffix(); - return filePath; + return FILE_OUTPUT_DIR + File.separator + fileName + fileOutputType.getFileSuffix(); } } - private void handleDeleteFile(Boolean deleteFile,String filePath){ - if(!deleteFile){ + private void handleDeleteFile(Boolean deleteFile, String filePath) { + if (!deleteFile) { return; } - File file=new File(filePath); - file.delete(); + FileUtil.del(filePath); } /** @@ -128,7 +140,7 @@ public class InfDbDocController { /** * 创建 screw 的引擎配置 */ - private static EngineConfig buildEngineConfig(EngineFileType fileOutputType,String docFileName) { + private static EngineConfig buildEngineConfig(EngineFileType fileOutputType, String docFileName) { return EngineConfig.builder() .fileOutputDir(FILE_OUTPUT_DIR) // 生成文件路径 .openOutputDir(false) // 打开目录 From cee1aa3e606414e7af7bcc348e283295b45059f3 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 13 Mar 2021 13:37:59 +0800 Subject: [PATCH 035/126] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E7=9A=84=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- pom.xml | 26 +- ruoyi-ui/src/api/infra/file.js | 18 ++ ruoyi-ui/src/views/infra/file/index.vue | 202 ++++++++++++++ sql/ruoyi-vue-pro.sql | 254 ++++-------------- .../framework/file/config/FileProperties.java | 4 +- .../config/SecurityConfiguration.java | 2 +- .../controller/file/InfFileController.java} | 47 +++- .../controller/file/vo/InfFilePageReqVO.java | 35 +++ .../controller/file/vo/InfFileRespVO.java | 22 ++ .../infra/convert/file/InfFileConvert.java | 18 ++ .../infra/dal/dataobject/file/InfFileDO.java | 43 +++ .../infra/dal/mysql/file/InfFileMapper.java | 25 ++ .../infra/enums/InfErrorCodeConstants.java | 3 + .../infra/service/file/InfFileService.java | 46 ++++ .../service/file/impl/InfFileServiceImpl.java | 72 +++++ .../dal/dataobject/common/SysFileDO.java | 30 --- .../dal/mysql/common/SysFileMapper.java | 15 -- .../system/service/common/SysFileService.java | 29 -- .../common/impl/SysFileServiceImpl.java | 47 ---- .../codegen/impl/ToolCodegenBuilder.java | 1 + src/main/resources/application-dev.yaml | 2 +- src/main/resources/application-local.yaml | 2 +- .../codegen/java/controller/controller.vm | 2 +- .../codegen/java/service/serviceImpl.vm | 3 +- .../codegen/java/test/serviceTest.vm | 14 +- src/main/resources/codegen/sql/sql.vm | 8 +- .../resources/codegen/vue/views/index.vue.vm | 2 +- .../service/file/InfFileServiceTest.java | 126 +++++++++ .../auth/SysUserSessionServiceImplTest.java | 21 +- src/test/resources/file/erweima.jpg | Bin 0 -> 18385 bytes src/test/resources/sql/clean.sql | 1 + src/test/resources/sql/create_tables.sql | 12 + 33 files changed, 756 insertions(+), 378 deletions(-) create mode 100644 ruoyi-ui/src/api/infra/file.js create mode 100644 ruoyi-ui/src/views/infra/file/index.vue rename src/main/java/cn/iocoder/dashboard/modules/{system/controller/common/SysFileController.java => infra/controller/file/InfFileController.java} (52%) create mode 100644 src/main/java/cn/iocoder/dashboard/modules/infra/controller/file/vo/InfFilePageReqVO.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/infra/controller/file/vo/InfFileRespVO.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/infra/convert/file/InfFileConvert.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/infra/dal/dataobject/file/InfFileDO.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/file/InfFileMapper.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/infra/service/file/InfFileService.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/infra/service/file/impl/InfFileServiceImpl.java delete mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/common/SysFileDO.java delete mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/common/SysFileMapper.java delete mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/service/common/SysFileService.java delete mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/service/common/impl/SysFileServiceImpl.java create mode 100644 src/test/java/cn/iocoder/dashboard/modules/infra/service/file/InfFileServiceTest.java create mode 100644 src/test/resources/file/erweima.jpg diff --git a/README.md b/README.md index 3bd450bf6..8dd1fb95c 100644 --- a/README.md +++ b/README.md @@ -50,6 +50,7 @@ | --- | --- | --- | | 🚀 | 配置管理 | 对系统动态配置常用参数,支持 SpringBoot 加载 | | | 定时任务 | 在线(添加、修改、删除)任务调度包含执行结果日志 | +| 🚀 | 文件服务 | 支持本地文件存储,同时支持兼容 Amazon S3 协议的云服务、开源组件 | | 🚀 | API 日志 | 包括 RESTful API 访问日志、异常日志两部分,方便排查 API 相关的问题 | | | MySQL 监控 | 监视当前系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈 | | | Redis 监控 |监控 Redis 数据库的使用情况,使用的 Redis Key 管理 | @@ -64,7 +65,6 @@ 计划新增: * 工作流 * 错误码 -* 文件服务 ### 研发工具 diff --git a/pom.xml b/pom.xml index 1e86dbf56..bba8d18cc 100644 --- a/pom.xml +++ b/pom.xml @@ -40,8 +40,8 @@ 8.3.0 2.3.1 - 1.4.2.Final - 0.2.0 + 1.16.14 + 1.4.1.Final 5.5.6 2.2.7 2.2 @@ -227,14 +227,13 @@ org.projectlombok lombok - true + ${lombok.version} org.mapstruct mapstruct ${mapstruct.version} - true org.mapstruct @@ -246,13 +245,6 @@ org.mapstruct mapstruct-jdk8 ${mapstruct.version} - true - - - org.projectlombok - lombok-mapstruct-binding - ${lombok-mapstruct-binding.version} - true @@ -331,6 +323,18 @@ ${java.version} ${java.version} + + + org.mapstruct + mapstruct-processor + ${mapstruct.version} + + + org.projectlombok + lombok + ${lombok.version} + + diff --git a/ruoyi-ui/src/api/infra/file.js b/ruoyi-ui/src/api/infra/file.js new file mode 100644 index 000000000..2aeda2e90 --- /dev/null +++ b/ruoyi-ui/src/api/infra/file.js @@ -0,0 +1,18 @@ +import request from '@/utils/request' + +// 删除文件 +export function deleteFile(id) { + return request({ + url: '/infra/file/delete?id=' + id, + method: 'delete' + }) +} + +// 获得文件分页 +export function getFilePage(query) { + return request({ + url: '/infra/file/page', + method: 'get', + params: query + }) +} diff --git a/ruoyi-ui/src/views/infra/file/index.vue b/ruoyi-ui/src/views/infra/file/index.vue new file mode 100644 index 000000000..5eaf41655 --- /dev/null +++ b/ruoyi-ui/src/views/infra/file/index.vue @@ -0,0 +1,202 @@ + + + diff --git a/sql/ruoyi-vue-pro.sql b/sql/ruoyi-vue-pro.sql index 9074a4aa7..2fdf9ec85 100644 --- a/sql/ruoyi-vue-pro.sql +++ b/sql/ruoyi-vue-pro.sql @@ -11,7 +11,7 @@ Target Server Version : 50718 File Encoding : 65001 - Date: 10/03/2021 01:31:28 + Date: 13/03/2021 13:30:21 */ SET NAMES utf8mb4; @@ -43,87 +43,12 @@ CREATE TABLE `inf_api_access_log` ( `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=76 DEFAULT CHARSET=utf8mb4 COMMENT='API 访问日志表'; +) ENGINE=InnoDB AUTO_INCREMENT=449 DEFAULT CHARSET=utf8mb4 COMMENT='API 访问日志表'; -- ---------------------------- -- Records of inf_api_access_log -- ---------------------------- BEGIN; -INSERT INTO `inf_api_access_log` VALUES (1, 'd8909966-2abb-43b1-998f-850779178463', 0, 2, 'dashboard', 'GET', '/api/get-permission-info', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:11:46', '2021-03-10 01:11:47', 127, 0, '', NULL, '2021-03-10 01:11:47', NULL, '2021-03-10 01:11:47', b'0'); -INSERT INTO `inf_api_access_log` VALUES (2, 'f40ee1af-4b8e-4351-ba77-c0ca41865d01', 0, 2, 'dashboard', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:11:46', '2021-03-10 01:11:47', 127, 0, '', NULL, '2021-03-10 01:11:47', NULL, '2021-03-10 01:11:47', b'0'); -INSERT INTO `inf_api_access_log` VALUES (3, '38657f93-449b-4c92-a412-d76c32c3ba74', 0, 2, 'dashboard', 'POST', '/api/logout', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:11:47', '2021-03-10 01:11:47', 3, 0, '', NULL, '2021-03-10 01:11:47', NULL, '2021-03-10 01:11:47', b'0'); -INSERT INTO `inf_api_access_log` VALUES (4, '24303cdb-dae9-4f09-b316-e9eb38023ddf', 0, 2, 'dashboard', 'POST', '/api/logout', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:11:48', '2021-03-10 01:11:48', 2, 0, '', NULL, '2021-03-10 01:11:48', NULL, '2021-03-10 01:11:48', b'0'); -INSERT INTO `inf_api_access_log` VALUES (5, 'fe324978-a665-4e25-8e16-ee78750de461', 0, 2, 'dashboard', 'GET', '/api/system/captcha/get-image', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:11:47', '2021-03-10 01:11:50', 2698, 0, '', NULL, '2021-03-10 01:11:50', NULL, '2021-03-10 01:11:50', b'0'); -INSERT INTO `inf_api_access_log` VALUES (6, '205b39bd-471c-4e0c-bbeb-f9ad836d47c7', 0, 2, 'dashboard', 'GET', '/api/system/captcha/get-image', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:11:49', '2021-03-10 01:11:50', 1157, 0, '', NULL, '2021-03-10 01:11:50', NULL, '2021-03-10 01:11:50', b'0'); -INSERT INTO `inf_api_access_log` VALUES (7, 'aff42e1b-73d9-431d-95b9-7a7d18595a5b', 0, 2, 'dashboard', 'POST', '/api/login', '{\"query\":{},\"body\":\"{\\\"username\\\":\\\"admin\\\",\\\"password\\\":\\\"admin123\\\",\\\"code\\\":\\\"1nfjj\\\",\\\"uuid\\\":\\\"8466085c41534a948632f82140e8d9e1\\\"}\"}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:11:53', '2021-03-10 01:11:53', 35, 1002000003, '验证码不存在', NULL, '2021-03-10 01:11:53', NULL, '2021-03-10 01:11:53', b'0'); -INSERT INTO `inf_api_access_log` VALUES (8, '25f0e932-cf92-4b95-b3fb-5a4896bd9241', 0, 2, 'dashboard', 'GET', '/api/system/captcha/get-image', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:11:53', '2021-03-10 01:11:53', 13, 0, '', NULL, '2021-03-10 01:11:53', NULL, '2021-03-10 01:11:53', b'0'); -INSERT INTO `inf_api_access_log` VALUES (9, 'ad750e4c-5310-4e42-9e41-0871033ca55d', 0, 2, 'dashboard', 'POST', '/api/login', '{\"query\":{},\"body\":\"{\\\"username\\\":\\\"admin\\\",\\\"password\\\":\\\"admin123\\\",\\\"code\\\":\\\"1nfjj\\\",\\\"uuid\\\":\\\"8466085c41534a948632f82140e8d9e1\\\"}\"}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:11:53', '2021-03-10 01:11:53', 273, 0, '', NULL, '2021-03-10 01:11:53', NULL, '2021-03-10 01:11:53', b'0'); -INSERT INTO `inf_api_access_log` VALUES (10, '0e1a7560-d447-4e95-935a-e3f6cf4a222d', 1, 2, 'dashboard', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:11:53', '2021-03-10 01:11:53', 31, 0, '', NULL, '2021-03-10 01:11:53', NULL, '2021-03-10 01:11:53', b'0'); -INSERT INTO `inf_api_access_log` VALUES (11, '0bf76082-8584-4725-ad8e-d23b44f1a886', 1, 2, 'dashboard', 'GET', '/api/get-permission-info', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:11:53', '2021-03-10 01:11:53', 34, 0, '', NULL, '2021-03-10 01:11:53', NULL, '2021-03-10 01:11:53', b'0'); -INSERT INTO `inf_api_access_log` VALUES (12, 'f9aed1f8-5a1d-4175-946a-e58e2772e4a3', 1, 2, 'dashboard', 'GET', '/api/list-menus', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:11:53', '2021-03-10 01:11:53', 12, 0, '', NULL, '2021-03-10 01:11:53', NULL, '2021-03-10 01:11:53', b'0'); -INSERT INTO `inf_api_access_log` VALUES (13, '2feeb4ff-e8a6-48a9-8370-9a1b8b1dea5e', 0, 2, 'dashboard', 'GET', '/api/system/file/get/add5ec1891a7d97d2cc1d60847e16294.jpg', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:11:54', '2021-03-10 01:11:54', 26, 0, '', NULL, '2021-03-10 01:11:54', NULL, '2021-03-10 01:11:54', b'0'); -INSERT INTO `inf_api_access_log` VALUES (14, '36b77d6f-30d3-483e-ad79-196975d8fe0b', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:12:02', '2021-03-10 01:12:02', 31, 0, '', NULL, '2021-03-10 01:12:02', NULL, '2021-03-10 01:12:02', b'0'); -INSERT INTO `inf_api_access_log` VALUES (15, 'e50a5433-90b7-4e8f-9d1a-59f15c1a4e0a', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:12:07', '2021-03-10 01:12:07', 16, 0, '', NULL, '2021-03-10 01:12:07', NULL, '2021-03-10 01:12:07', b'0'); -INSERT INTO `inf_api_access_log` VALUES (16, 'b1ef7809-57f1-4aad-99cb-f53d1c85ae8a', 1, 2, 'dashboard', 'GET', '/api/system/menu/get', '{\"query\":{\"id\":\"106\"},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:12:07', '2021-03-10 01:12:07', 11, 0, '', NULL, '2021-03-10 01:12:07', NULL, '2021-03-10 01:12:07', b'0'); -INSERT INTO `inf_api_access_log` VALUES (17, '18c41274-8fc2-4012-8d63-14fe72a0cc64', 1, 2, 'dashboard', 'POST', '/api/system/menu/update', '{\"query\":{},\"body\":\"{\\\"id\\\":106,\\\"status\\\":0,\\\"createTime\\\":1609837428000,\\\"name\\\":\\\"配置管理\\\",\\\"permission\\\":\\\"\\\",\\\"type\\\":2,\\\"sort\\\":1,\\\"parentId\\\":2,\\\"path\\\":\\\"config\\\",\\\"icon\\\":\\\"edit\\\",\\\"component\\\":\\\"infra/config/index\\\"}\"}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:12:09', '2021-03-10 01:12:10', 54, 0, '', NULL, '2021-03-10 01:12:10', NULL, '2021-03-10 01:12:10', b'0'); -INSERT INTO `inf_api_access_log` VALUES (18, '3ec30780-7d9e-40fd-b9e1-df0758530bc9', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:12:10', '2021-03-10 01:12:10', 15, 0, '', NULL, '2021-03-10 01:12:10', NULL, '2021-03-10 01:12:10', b'0'); -INSERT INTO `inf_api_access_log` VALUES (19, '3a0dd3e6-60e8-43cc-82aa-d63d332dcd74', 1, 2, 'dashboard', 'GET', '/api/system/menu/get', '{\"query\":{\"id\":\"1032\"},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:12:12', '2021-03-10 01:12:12', 7, 0, '', NULL, '2021-03-10 01:12:12', NULL, '2021-03-10 01:12:12', b'0'); -INSERT INTO `inf_api_access_log` VALUES (20, '3dc6e855-0aff-48f2-a236-a5255385de82', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:12:12', '2021-03-10 01:12:12', 15, 0, '', NULL, '2021-03-10 01:12:12', NULL, '2021-03-10 01:12:12', b'0'); -INSERT INTO `inf_api_access_log` VALUES (21, '0eab1e77-e039-4924-b6f5-cdcd73ad9897', 1, 2, 'dashboard', 'POST', '/api/system/menu/update', '{\"query\":{},\"body\":\"{\\\"id\\\":1032,\\\"status\\\":0,\\\"createTime\\\":1609837428000,\\\"name\\\":\\\"配置新增\\\",\\\"permission\\\":\\\"infra:config:create\\\",\\\"type\\\":3,\\\"sort\\\":2,\\\"parentId\\\":106,\\\"path\\\":\\\"\\\",\\\"icon\\\":\\\"\\\",\\\"component\\\":\\\"\\\"}\"}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:12:18', '2021-03-10 01:12:18', 18, 0, '', NULL, '2021-03-10 01:12:18', NULL, '2021-03-10 01:12:18', b'0'); -INSERT INTO `inf_api_access_log` VALUES (22, '5d309b5e-76be-4776-be3c-e961e3144269', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:12:18', '2021-03-10 01:12:18', 14, 0, '', NULL, '2021-03-10 01:12:18', NULL, '2021-03-10 01:12:18', b'0'); -INSERT INTO `inf_api_access_log` VALUES (23, '359ddde9-67d2-427c-8738-17fb0773f3ca', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:12:25', '2021-03-10 01:12:25', 13, 0, '', NULL, '2021-03-10 01:12:25', NULL, '2021-03-10 01:12:25', b'0'); -INSERT INTO `inf_api_access_log` VALUES (24, 'cab05ea8-98e4-4b81-a629-696e6c47c680', 1, 2, 'dashboard', 'GET', '/api/system/menu/get', '{\"query\":{\"id\":\"1033\"},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:12:25', '2021-03-10 01:12:25', 5, 0, '', NULL, '2021-03-10 01:12:25', NULL, '2021-03-10 01:12:25', b'0'); -INSERT INTO `inf_api_access_log` VALUES (25, '291cb66f-21d9-4798-a3c1-d3b0270d3850', 1, 2, 'dashboard', 'POST', '/api/system/menu/update', '{\"query\":{},\"body\":\"{\\\"id\\\":1033,\\\"status\\\":0,\\\"createTime\\\":1609837428000,\\\"name\\\":\\\"配置修改\\\",\\\"permission\\\":\\\"infra:config:update\\\",\\\"type\\\":3,\\\"sort\\\":3,\\\"parentId\\\":106,\\\"path\\\":\\\"\\\",\\\"icon\\\":\\\"\\\",\\\"component\\\":\\\"\\\"}\"}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:12:30', '2021-03-10 01:12:30', 19, 0, '', NULL, '2021-03-10 01:12:30', NULL, '2021-03-10 01:12:30', b'0'); -INSERT INTO `inf_api_access_log` VALUES (26, '5cf67e7f-8b32-4b17-96a6-325dfcba865f', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:12:30', '2021-03-10 01:12:30', 14, 0, '', NULL, '2021-03-10 01:12:30', NULL, '2021-03-10 01:12:30', b'0'); -INSERT INTO `inf_api_access_log` VALUES (27, '869bcc0c-2d7c-4a80-9fda-11b412162c0d', 1, 2, 'dashboard', 'GET', '/api/system/menu/get', '{\"query\":{\"id\":\"1034\"},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:12:31', '2021-03-10 01:12:31', 7, 0, '', NULL, '2021-03-10 01:12:31', NULL, '2021-03-10 01:12:31', b'0'); -INSERT INTO `inf_api_access_log` VALUES (28, '5c110575-2d45-4353-a653-50796f3ffc36', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:12:31', '2021-03-10 01:12:31', 14, 0, '', NULL, '2021-03-10 01:12:31', NULL, '2021-03-10 01:12:31', b'0'); -INSERT INTO `inf_api_access_log` VALUES (29, '4bd68903-d159-4728-aaa0-cfcc810bf65d', 1, 2, 'dashboard', 'POST', '/api/system/menu/update', '{\"query\":{},\"body\":\"{\\\"id\\\":1034,\\\"status\\\":0,\\\"createTime\\\":1609837428000,\\\"name\\\":\\\"配置删除\\\",\\\"permission\\\":\\\"infra:config:delete\\\",\\\"type\\\":3,\\\"sort\\\":4,\\\"parentId\\\":106,\\\"path\\\":\\\"\\\",\\\"icon\\\":\\\"\\\",\\\"component\\\":\\\"\\\"}\"}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:12:36', '2021-03-10 01:12:36', 18, 0, '', NULL, '2021-03-10 01:12:36', NULL, '2021-03-10 01:12:36', b'0'); -INSERT INTO `inf_api_access_log` VALUES (30, 'f42d28d1-1442-44f6-aaa9-b200307e0755', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:12:36', '2021-03-10 01:12:36', 13, 0, '', NULL, '2021-03-10 01:12:36', NULL, '2021-03-10 01:12:36', b'0'); -INSERT INTO `inf_api_access_log` VALUES (31, 'c2ad9fea-1e4f-4f19-8ad3-8ffac3a2ad6a', 1, 2, 'dashboard', 'GET', '/api/infra/config/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:12:40', '2021-03-10 01:12:40', 119, 0, '', NULL, '2021-03-10 01:12:40', NULL, '2021-03-10 01:12:40', b'0'); -INSERT INTO `inf_api_access_log` VALUES (32, 'a3ce04b6-103e-4567-9f3a-22a516957122', 1, 2, 'dashboard', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:25:41', '2021-03-10 01:25:41', 225, 0, '', NULL, '2021-03-10 01:25:41', NULL, '2021-03-10 01:25:41', b'0'); -INSERT INTO `inf_api_access_log` VALUES (33, '82f37563-862a-4f50-9e5b-1c15b3b672d5', 1, 2, 'dashboard', 'GET', '/api/get-permission-info', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:25:41', '2021-03-10 01:25:41', 225, 0, '', NULL, '2021-03-10 01:25:41', NULL, '2021-03-10 01:25:41', b'0'); -INSERT INTO `inf_api_access_log` VALUES (34, '8469ee76-cdf6-4cf2-ae6b-91573e06d0c9', 1, 2, 'dashboard', 'GET', '/api/list-menus', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:25:41', '2021-03-10 01:25:41', 16, 0, '', NULL, '2021-03-10 01:25:41', NULL, '2021-03-10 01:25:41', b'0'); -INSERT INTO `inf_api_access_log` VALUES (35, '27f7ffa8-7ce3-42d4-8e65-1a6996dde9d4', 0, 2, 'dashboard', 'GET', '/api/system/file/get/add5ec1891a7d97d2cc1d60847e16294.jpg', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:25:42', '2021-03-10 01:25:42', 28, 0, '', NULL, '2021-03-10 01:25:42', NULL, '2021-03-10 01:25:42', b'0'); -INSERT INTO `inf_api_access_log` VALUES (36, '23254cf0-c51f-4a52-8838-fc7ebbce3042', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:25:42', '2021-03-10 01:25:42', 47, 0, '', NULL, '2021-03-10 01:25:42', NULL, '2021-03-10 01:25:42', b'0'); -INSERT INTO `inf_api_access_log` VALUES (37, '215c6c13-12e7-442a-805f-3efc0bf646e4', 1, 2, 'dashboard', 'GET', '/api/system/menu/get', '{\"query\":{\"id\":\"110\"},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:25:49', '2021-03-10 01:25:49', 13, 0, '', NULL, '2021-03-10 01:25:49', NULL, '2021-03-10 01:25:49', b'0'); -INSERT INTO `inf_api_access_log` VALUES (38, '56ee2e75-5775-4a26-a9e7-972876ed891e', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:25:49', '2021-03-10 01:25:49', 20, 0, '', NULL, '2021-03-10 01:25:49', NULL, '2021-03-10 01:25:49', b'0'); -INSERT INTO `inf_api_access_log` VALUES (39, '680c28fa-764e-4de5-8dc0-909ab842eb43', 1, 2, 'dashboard', 'POST', '/api/system/menu/update', '{\"query\":{},\"body\":\"{\\\"id\\\":110,\\\"status\\\":0,\\\"createTime\\\":1609837428000,\\\"name\\\":\\\"定时任务\\\",\\\"permission\\\":\\\"\\\",\\\"type\\\":2,\\\"sort\\\":2,\\\"parentId\\\":2,\\\"path\\\":\\\"job\\\",\\\"icon\\\":\\\"job\\\",\\\"component\\\":\\\"infra/job/index\\\"}\"}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:25:51', '2021-03-10 01:25:51', 56, 0, '', NULL, '2021-03-10 01:25:51', NULL, '2021-03-10 01:25:51', b'0'); -INSERT INTO `inf_api_access_log` VALUES (40, '74a051a8-4150-442c-8986-6b22ae166ae6', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:25:51', '2021-03-10 01:25:51', 22, 0, '', NULL, '2021-03-10 01:25:51', NULL, '2021-03-10 01:25:51', b'0'); -INSERT INTO `inf_api_access_log` VALUES (41, '5228cabc-3ff5-4c3a-a9d0-a7c14a9e92a5', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:26:02', '2021-03-10 01:26:02', 17, 0, '', NULL, '2021-03-10 01:26:02', NULL, '2021-03-10 01:26:02', b'0'); -INSERT INTO `inf_api_access_log` VALUES (42, 'c659072d-1d29-469b-b84b-b6ed4b6c964e', 1, 2, 'dashboard', 'POST', '/api/system/menu/create', '{\"query\":{},\"body\":\"{\\\"parentId\\\":110,\\\"name\\\":\\\"任务查询\\\",\\\"type\\\":3,\\\"sort\\\":1,\\\"status\\\":0,\\\"permission\\\":\\\"infra:job:query\\\"}\"}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:26:19', '2021-03-10 01:26:19', 29, 0, '', NULL, '2021-03-10 01:26:19', NULL, '2021-03-10 01:26:19', b'0'); -INSERT INTO `inf_api_access_log` VALUES (43, '1627b483-95b0-4ddc-b4f8-c27f931fde1a', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:26:19', '2021-03-10 01:26:19', 17, 0, '', NULL, '2021-03-10 01:26:19', NULL, '2021-03-10 01:26:19', b'0'); -INSERT INTO `inf_api_access_log` VALUES (44, '6c497f1e-da23-4ca6-bb04-1a5c0bb768ad', 1, 2, 'dashboard', 'GET', '/api/system/menu/get', '{\"query\":{\"id\":\"1078\"},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:27:42', '2021-03-10 01:27:43', 188, 0, '', NULL, '2021-03-10 01:27:43', NULL, '2021-03-10 01:27:43', b'0'); -INSERT INTO `inf_api_access_log` VALUES (45, 'ba231b78-1b76-4116-b54d-a42abc10ac9b', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:27:42', '2021-03-10 01:27:43', 188, 0, '', NULL, '2021-03-10 01:27:43', NULL, '2021-03-10 01:27:43', b'0'); -INSERT INTO `inf_api_access_log` VALUES (46, '1440ae67-0972-4d04-9efe-9080acc615bb', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:27:45', '2021-03-10 01:27:46', 20, 0, '', NULL, '2021-03-10 01:27:46', NULL, '2021-03-10 01:27:46', b'0'); -INSERT INTO `inf_api_access_log` VALUES (47, '391845d4-1e42-492d-bc44-4ef878be4b41', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:27:50', '2021-03-10 01:27:50', 21, 0, '', NULL, '2021-03-10 01:27:50', NULL, '2021-03-10 01:27:50', b'0'); -INSERT INTO `inf_api_access_log` VALUES (48, 'dd2b9b7e-df39-497c-bd1a-456a5af54799', 1, 2, 'dashboard', 'POST', '/api/system/menu/create', '{\"query\":{},\"body\":\"{\\\"parentId\\\":1078,\\\"name\\\":\\\"日志查询\\\",\\\"type\\\":3,\\\"sort\\\":1,\\\"status\\\":0,\\\"permission\\\":\\\"infra:api-error-log:query\\\"}\"}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:28:04', '2021-03-10 01:28:04', 45, 0, '', NULL, '2021-03-10 01:28:04', NULL, '2021-03-10 01:28:04', b'0'); -INSERT INTO `inf_api_access_log` VALUES (49, '292da48c-21a0-4066-8a3a-40ddd0e9c759', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:28:04', '2021-03-10 01:28:04', 23, 0, '', NULL, '2021-03-10 01:28:04', NULL, '2021-03-10 01:28:04', b'0'); -INSERT INTO `inf_api_access_log` VALUES (50, '13432c7e-35c4-451f-9aa7-438f7f5c646a', 1, 2, 'dashboard', 'GET', '/api/system/menu/get', '{\"query\":{\"id\":\"1078\"},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:28:07', '2021-03-10 01:28:07', 13, 0, '', NULL, '2021-03-10 01:28:07', NULL, '2021-03-10 01:28:07', b'0'); -INSERT INTO `inf_api_access_log` VALUES (51, 'f06ad98f-7136-4157-83d6-9ff18b76c701', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:28:07', '2021-03-10 01:28:07', 20, 0, '', NULL, '2021-03-10 01:28:07', NULL, '2021-03-10 01:28:07', b'0'); -INSERT INTO `inf_api_access_log` VALUES (52, '255cc516-6b95-404c-ae2c-38d713ca3a59', 1, 2, 'dashboard', 'POST', '/api/system/menu/update', '{\"query\":{},\"body\":\"{\\\"id\\\":1078,\\\"status\\\":0,\\\"createTime\\\":1614274379000,\\\"name\\\":\\\"访问日志\\\",\\\"permission\\\":\\\"\\\",\\\"type\\\":2,\\\"sort\\\":1,\\\"parentId\\\":1083,\\\"path\\\":\\\"api-access-log\\\",\\\"icon\\\":\\\"log\\\",\\\"component\\\":\\\"infra/apiAccessLog/index\\\"}\"}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:28:09', '2021-03-10 01:28:09', 33, 0, '', NULL, '2021-03-10 01:28:09', NULL, '2021-03-10 01:28:09', b'0'); -INSERT INTO `inf_api_access_log` VALUES (53, '0b75788a-e1cb-43f7-959e-4f8cbb40b3cc', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:28:09', '2021-03-10 01:28:09', 18, 0, '', NULL, '2021-03-10 01:28:09', NULL, '2021-03-10 01:28:09', b'0'); -INSERT INTO `inf_api_access_log` VALUES (54, 'aebfea9a-ae91-4746-bf71-d315da4f5d49', 1, 2, 'dashboard', 'GET', '/api/system/menu/get', '{\"query\":{\"id\":\"1082\"},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:28:11', '2021-03-10 01:28:11', 8, 0, '', NULL, '2021-03-10 01:28:11', NULL, '2021-03-10 01:28:11', b'0'); -INSERT INTO `inf_api_access_log` VALUES (55, '149f2f74-9d4b-491f-b016-19c5b381fcc7', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:28:11', '2021-03-10 01:28:11', 15, 0, '', NULL, '2021-03-10 01:28:11', NULL, '2021-03-10 01:28:11', b'0'); -INSERT INTO `inf_api_access_log` VALUES (56, 'aeec1ebf-5aeb-4888-a2dd-60c473ae6b78', 1, 2, 'dashboard', 'POST', '/api/system/menu/update', '{\"query\":{},\"body\":\"{\\\"id\\\":1082,\\\"status\\\":0,\\\"createTime\\\":1614274379000,\\\"name\\\":\\\"日志导出\\\",\\\"permission\\\":\\\"infra:api-access-log:export\\\",\\\"type\\\":3,\\\"sort\\\":2,\\\"parentId\\\":1078,\\\"path\\\":\\\"\\\",\\\"icon\\\":\\\"\\\",\\\"component\\\":\\\"\\\"}\"}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:28:13', '2021-03-10 01:28:13', 23, 0, '', NULL, '2021-03-10 01:28:13', NULL, '2021-03-10 01:28:13', b'0'); -INSERT INTO `inf_api_access_log` VALUES (57, 'd2cc4ee9-d289-4886-be34-0f93edb52bc0', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:28:13', '2021-03-10 01:28:13', 16, 0, '', NULL, '2021-03-10 01:28:13', NULL, '2021-03-10 01:28:13', b'0'); -INSERT INTO `inf_api_access_log` VALUES (58, '73efd4a2-fe8b-4819-a657-6aca7425e7c0', 1, 2, 'dashboard', 'GET', '/api/system/menu/get', '{\"query\":{\"id\":\"1085\"},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:28:15', '2021-03-10 01:28:15', 9, 0, '', NULL, '2021-03-10 01:28:15', NULL, '2021-03-10 01:28:15', b'0'); -INSERT INTO `inf_api_access_log` VALUES (59, 'f222df67-e4c0-419f-a022-4bc304319f4d', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:28:15', '2021-03-10 01:28:15', 17, 0, '', NULL, '2021-03-10 01:28:15', NULL, '2021-03-10 01:28:15', b'0'); -INSERT INTO `inf_api_access_log` VALUES (60, 'd304f696-6bd3-4218-b73a-7cff04565b54', 1, 2, 'dashboard', 'POST', '/api/system/menu/update', '{\"query\":{},\"body\":\"{\\\"id\\\":1085,\\\"status\\\":0,\\\"createTime\\\":1614297200000,\\\"name\\\":\\\"日志处理\\\",\\\"permission\\\":\\\"infra:api-error-log:update-status\\\",\\\"type\\\":3,\\\"sort\\\":2,\\\"parentId\\\":1084,\\\"path\\\":\\\"\\\",\\\"icon\\\":\\\"\\\",\\\"component\\\":\\\"\\\"}\"}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:28:18', '2021-03-10 01:28:18', 23, 0, '', NULL, '2021-03-10 01:28:18', NULL, '2021-03-10 01:28:18', b'0'); -INSERT INTO `inf_api_access_log` VALUES (61, '224f263e-0e4f-49a8-8205-2de44ba8e045', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:28:18', '2021-03-10 01:28:18', 16, 0, '', NULL, '2021-03-10 01:28:18', NULL, '2021-03-10 01:28:18', b'0'); -INSERT INTO `inf_api_access_log` VALUES (62, '9fd2373f-a641-4865-ae3f-259b4386d816', 1, 2, 'dashboard', 'GET', '/api/system/menu/get', '{\"query\":{\"id\":\"1086\"},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:28:19', '2021-03-10 01:28:19', 7, 0, '', NULL, '2021-03-10 01:28:19', NULL, '2021-03-10 01:28:19', b'0'); -INSERT INTO `inf_api_access_log` VALUES (63, 'a97c2b96-9486-4bde-a532-bbb8f077a393', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:28:19', '2021-03-10 01:28:19', 15, 0, '', NULL, '2021-03-10 01:28:19', NULL, '2021-03-10 01:28:19', b'0'); -INSERT INTO `inf_api_access_log` VALUES (64, '1cbb3fa8-9a84-4568-8089-c74c2ff38d80', 1, 2, 'dashboard', 'POST', '/api/system/menu/update', '{\"query\":{},\"body\":\"{\\\"id\\\":1086,\\\"status\\\":0,\\\"createTime\\\":1614297200000,\\\"name\\\":\\\"日志导出\\\",\\\"permission\\\":\\\"infra:api-error-log:export\\\",\\\"type\\\":3,\\\"sort\\\":3,\\\"parentId\\\":1084,\\\"path\\\":\\\"\\\",\\\"icon\\\":\\\"\\\",\\\"component\\\":\\\"\\\"}\"}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:28:21', '2021-03-10 01:28:21', 21, 0, '', NULL, '2021-03-10 01:28:21', NULL, '2021-03-10 01:28:21', b'0'); -INSERT INTO `inf_api_access_log` VALUES (65, '7f913e0c-0dfd-45cc-bb7d-eb55e7eb653d', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:28:21', '2021-03-10 01:28:21', 16, 0, '', NULL, '2021-03-10 01:28:21', NULL, '2021-03-10 01:28:21', b'0'); -INSERT INTO `inf_api_access_log` VALUES (66, '6b39ec06-2bf5-4d92-9245-18223625251f', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:28:34', '2021-03-10 01:28:34', 13, 0, '', NULL, '2021-03-10 01:28:34', NULL, '2021-03-10 01:28:34', b'0'); -INSERT INTO `inf_api_access_log` VALUES (67, '74045997-4753-48b6-98ee-1de5106d8633', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:28:47', '2021-03-10 01:28:47', 14, 0, '', NULL, '2021-03-10 01:28:47', NULL, '2021-03-10 01:28:47', b'0'); -INSERT INTO `inf_api_access_log` VALUES (68, '14dcf39c-9b29-4cd0-8c08-9a17cd0234f6', 1, 2, 'dashboard', 'POST', '/api/system/menu/create', '{\"query\":{},\"body\":\"{\\\"parentId\\\":1084,\\\"name\\\":\\\"日志查询\\\",\\\"type\\\":3,\\\"sort\\\":1,\\\"status\\\":0,\\\"permission\\\":\\\"infra:api-error-log:query\\\"}\"}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:29:09', '2021-03-10 01:29:09', 19, 0, '', NULL, '2021-03-10 01:29:09', NULL, '2021-03-10 01:29:09', b'0'); -INSERT INTO `inf_api_access_log` VALUES (69, '6ed66070-c685-4871-9321-372161cb71f7', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:29:09', '2021-03-10 01:29:09', 15, 0, '', NULL, '2021-03-10 01:29:09', NULL, '2021-03-10 01:29:09', b'0'); -INSERT INTO `inf_api_access_log` VALUES (70, 'f47ae56b-6de3-40b2-9da8-b86f38491645', 1, 2, 'dashboard', 'GET', '/api/system/menu/get', '{\"query\":{\"id\":\"1088\"},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:29:24', '2021-03-10 01:29:24', 8, 0, '', NULL, '2021-03-10 01:29:24', NULL, '2021-03-10 01:29:24', b'0'); -INSERT INTO `inf_api_access_log` VALUES (71, 'c498e660-4608-4051-bda3-3d980e6873f0', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:29:24', '2021-03-10 01:29:24', 18, 0, '', NULL, '2021-03-10 01:29:24', NULL, '2021-03-10 01:29:24', b'0'); -INSERT INTO `inf_api_access_log` VALUES (72, '7a9be5f0-16b7-4924-9352-c8c6bdb36f6d', 1, 2, 'dashboard', 'GET', '/api/system/menu/get', '{\"query\":{\"id\":\"1088\"},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:29:32', '2021-03-10 01:29:32', 7, 0, '', NULL, '2021-03-10 01:29:32', NULL, '2021-03-10 01:29:32', b'0'); -INSERT INTO `inf_api_access_log` VALUES (73, '7dcc44ce-63f0-4013-b4ee-332de28e473d', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:29:32', '2021-03-10 01:29:32', 16, 0, '', NULL, '2021-03-10 01:29:32', NULL, '2021-03-10 01:29:32', b'0'); -INSERT INTO `inf_api_access_log` VALUES (74, 'a7541572-c68d-443e-95f6-69d1f6f55fab', 1, 2, 'dashboard', 'POST', '/api/system/menu/update', '{\"query\":{},\"body\":\"{\\\"id\\\":1088,\\\"status\\\":0,\\\"createTime\\\":1615310884000,\\\"name\\\":\\\"日志查询\\\",\\\"permission\\\":\\\"infra:api-access-log:query\\\",\\\"type\\\":3,\\\"sort\\\":1,\\\"parentId\\\":1078,\\\"path\\\":\\\"\\\",\\\"icon\\\":\\\"\\\",\\\"component\\\":\\\"\\\"}\"}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:29:38', '2021-03-10 01:29:38', 22, 0, '', NULL, '2021-03-10 01:29:38', NULL, '2021-03-10 01:29:38', b'0'); -INSERT INTO `inf_api_access_log` VALUES (75, '822a488f-fc4a-4981-924c-40deba7b8a25', 1, 2, 'dashboard', 'GET', '/api/system/menu/list', '{\"query\":{},\"body\":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '2021-03-10 01:29:38', '2021-03-10 01:29:38', 14, 0, '', NULL, '2021-03-10 01:29:38', NULL, '2021-03-10 01:29:38', b'0'); COMMIT; -- ---------------------------- @@ -159,7 +84,7 @@ CREATE TABLE `inf_api_error_log` ( `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统异常日志'; +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COMMENT='系统异常日志'; -- ---------------------------- -- Records of inf_api_error_log @@ -199,6 +124,32 @@ INSERT INTO `inf_config` VALUES (4, '1', 2, 'xxx', 'demo.test', '10', b'0', '5', INSERT INTO `inf_config` VALUES (5, 'xxx', 2, 'xxx', 'xxx', 'xxx', b'1', 'xxx', '', '2021-02-09 20:06:47', '', '2021-02-09 20:06:47', b'0'); COMMIT; +-- ---------------------------- +-- Table structure for inf_file +-- ---------------------------- +DROP TABLE IF EXISTS `inf_file`; +CREATE TABLE `inf_file` ( + `id` varchar(188) NOT NULL COMMENT '文件路径', + `type` varchar(63) DEFAULT NULL COMMENT '文件类型', + `content` blob NOT NULL COMMENT '文件内容', + `creator` varchar(64) DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='文件表'; + +-- ---------------------------- +-- Records of inf_file +-- ---------------------------- +BEGIN; +INSERT INTO `inf_file` VALUES ('427.jpg', 'jpg', 0xFFD8FFE000104A46494600010100000100010000FFDB00430006040506050406060506070706080A100A0A09090A140E0F0C1017141818171416161A1D251F1A1B231C1616202C20232627292A29191F2D302D283025282928FFDB0043010707070A080A130A0A13281A161A2828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828FFC0001108017F038403012200021101031101FFC4001C0001000203010101000000000000000000000607010405020308FFC40051100001030301040507060A08030803000000010203040511060712213113415161811422357191A1B115233242C1D1161752545572749394B2242536537392E1F0264362083334374482A2F163C2E2FFC4001C0101000203010101000000000000000000000102030405060807FFC4003811010002010204030507030402030000000001020304110512213113415114223371B13235617281A1D11552C1233454910642B2E1F1FFDA000C03010002110311003F00E5000D57E96000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001832600905ABD1F0F8FC4DA356D5E8F87C7E26D1EA307C3AFCA1F35F1DFBCB51F9EDF564006572800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000115001E49F5480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060C9802416AF47C3E3F136CD4B57A3E1F1F89B67A8C1F0EBF287CD7C77EF2D47E7B7D400195CA000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000454007927D5200000000000000000000000000000000000000000002407DA9692A6B24E8E8E9E6A893F26262B97DC84928B67BA9EB1A8E6DBD206F6D44AD67BB8A931599ECC3933E2C5F6ED11FAA2A09D26CC6E8C44F2AB9DAA05EC74AABF6184D9B55AFF00DDDF2CEE5EC4949E4960FEA1A6FEFF00AA0C09AD46CCF51C6D5740CA4AA6A7F753267DF823B73B05DED795B85B6AE06A7D758F2DF6A6508989865A6AB0E49DA968997301E517D5ED3D10CE000000000000000000000000000000000000000000001832600905ABD1F0F8FC4DB352D5E8F87C7E26D9EA307C3AFCA1F35F1DFBCB51F9EDF500065728000000000000000000000000000004BF41E9EB75E9B54DAD95ED9E3C2358D5C70EDC7ACE4EA7B14F62AF5865F3A27718DFF948638CB59B7279B6EDA2CB5C11A8DBDD96BE9FA165CEF549472395AD95F8554E7C957EC3ABAE6C94F63B945152B9EB1C91EF6EBBA9727334ED4BE86F14D58CA7927481DBCE6B13B950EAEBAB9BEEF7064E9473D3C71337732B719E3EE2B336F1636EDB3631D717B15B78F7F7E9F24681B16CA29EE3591D352B15F2BF97777AF7131D47A4286CFA7BCA24A87F96B5513B9EAABC5A89D98CF12D7CD5ADA2B3DDAF8347973D2D92B1EED7BCA060032350000000000000000000000000000000000000000000000000000000000000000115001E49F54800000000000000000000000000000000000063217FDFAC9D58F4A525B6DECBD6B391D4D46BC61A245F9C9D7AB29CD3D5ED2621873E7AE18DEDDFCA3CE51FD37A6AEBA8A454B6D32AC2D5F3A793CD8DBEB5EDEE4C9275B7E8FD2EDC5D677DFEE2C5E34F0E12362F7AF2F6AAAF71C8D49AD6B6EF079150B3E4DB4B3CD65343C329FF0052A7C1381172DBC4766BC62CFA8EB967963D23BFEB3FC2695BB47B9A46B4F63A5A3B452FD56C51239D8F5AF0F71DFB1E89D41A9EDD4F71BBEA3A88E2A96F48D8BCE55C2F2CF144F7155390FD41A178E8EB3FECB1FF002A16ACEEE7F1498D0E2ACE0888999EFDE50A8B63B6A545E9AE55B23D79AA6EA7D87D1763B65C79B5B5C8BDBBCDFB8B0EE956DB7DB6AEADCD57A4113A556A2E15D84CE08F684D6516AC6563A2A39297C995A8BBEE45DEDE4CF0C16DA1C5AEB75D6A4E48B748EFD9127EC966A3C3AD3A82AA07A72DE454C7F95508954EADD53A5EED516DA9B836ADD4EFDD7B676A488E4E6985E0B83F43751F9B369E99D7977FF11BFC8D22D1111BBA3C2F516D6649C79E22D1B7A43AC97FD29A85772FD69F936A9FC3CAE8F967BD138E3D68A685E341D5C34C95F60A98EF16D5E28F8573237D6DEBF0E3DC43B0746C97AB8D8EA92A2D754F81FD6DE6C77EB379298F789EEED7B2E4C5D705BF49EB1FCC39EA8A8E5454C2A73EE058A8FB1ED09158F6C369D4CD4E0A9FF7752BF7FBFD641EED6CABB457CB457185D0D446B8545E28A9D4A8BD68A44C32E1D4C649E4B46D78F2FE3D5A40021B00000000000000000000000000000000000001832600905ABD1F0F8FC4DB352D5E8F87C7E26D9EA307C3AFCA1F35F1DFBCB51F9EDF5000657280000000000000000000000003260EB586C35B7C9256D0B1AEE89115EAE76319CE3E0A45AD158DE593162BE5B72638DE5A343593D05547534B22B2662E5153E0BDC4F6D90566BAA886A6E6D6C5434996E234FF00BC770CF1F611ABC693B9DA6916A6AE362C48B85563B7950B0AE73A69ED0ACF2576EC9D135AC7638EF3B9AFC54D3CD7ACED34EB32EF70DD364C7CF5D4EF14AC6F35F5F462B750D8B4DA3A929A26BA46705644DE4BDEBDA6AD1EBAB3DCB14F5F4EB0A3D513E7111CDF12A9739CF7AB9EE5739572AABD664B7B1D7BCCF562B71FCFCDEE5622BE9B2D1BC58D6C73A5F34EB58A8C4557C38CB55ABD68402FF7CADBE552CD56F446A7D18DBF45A84F765D717D5DB6B282A155ED871BAABD4D5EAF72911FC19ACB85EEE14B6E63563A7915155CEC22679214C3314BCC64F2F367D752D9B0D2DA5E95BF7AC7AA38090DDF48DD6D544FAAA98D8B133E92B5E8B823C6E56F178DEB2E0E6C19304F2E5AED2006CD0D1D457D4360A385F34AEFAAD4F8F61699888DE58AB59B4C56B1BCB58FB535354554891D2C124CFF00C96372A593A7F67F0C2C6CB7A547BF19E898B86A7AD799D0AED5561B1B560A18D923DBC1594ED4C7B791AB6D56F3B638DDDBC5C1B92B1935778A47A79A1743A0EF550D47491C74ED5FEF1DC7D8874D9B36AD5CEFD7409EA62A9F1B9ED0EE3322B68A28E99BD4ABE73BDE71E5D5F7C91DBCB5CF4EE6A22215DB5168DFA42D36E138E79622D6FC5DE9366D588DCC75D0B97B158A872EBF42DE695AAE8E2654353FBB771F628B7EACD473CCC8296774F33B9377117259F6375CDB48F7DF1606BF1BC891FD54EBCA98F265CD87ED4C4B7749A3D06BFA62A5ABF8F928CA8A79E9A45654C3244F4E0A8F6E307C4BF116D77E8248D3A1AB8D8AAD72A71445EE5217A8B67B86BA6B2BF971E8645F82FDE64C7ACACCED78D9A9ABE01931D7C4C16E7AFEEADC1F4A8864A699F0CF1BA3958B8735C98543E66E38131313B4C00008000000000000000000000000000000000000454007927D5200000000000000000000000000000000180A4CB67F65A693CA7505ED11B68B779F85E3D2C89C51B8EB44E1C3B704C43167CD18693796FE9FB551695B3C7A9351C6AEAA7F9D6FA17261CE7753D53DFDDCF99C1D58DBE5C60A6BFDEDAE6C558E5640DEA6A226530DFAA8BED534B545F6AB51DD64AEABCB73E6C5167846CEA4FBFBCB6E66FE1BEC9DAE6377EBA18B7B7539F4B1F344F5A27BD0BC46FD1CBCB6BE9AD4CF9BACDA7699FED8F48FF2816CEB453756256495334B052C0A8C6BA2C2ABDCA99C71ECE1ED4265F8A0B5F5DE6A53FC86E56AA685D96A45F42E13B373873E95FCFF00CA9F028E491E9F5DFF00E6513111DD5C56D4EB6F7C98F272D62768E9BAE45D90DA7F4CD4FB23FB8B26C940CB659E8E8A29165653C4D89AF5E6E444C654FCA4B23FF2DFFE653F4FE85E3A3ACFFB2C7FCA85A9313D9CEE3183363C75F1727346FE9B205B50B3EA9AABBD4D65BA6959676D326FB12A3753088AAEF333D857DA3ED7A8EE6CAAFC189A46246AD499193F45955CE3DC7E93AFA58EB68A6A69F3D14CC58DD85C2E1530A7274B695B66996D425AA391893AB55FBEF57724C2732663AEEC5838B785A79C5CB1BF4DBA7D5D6B7325650D3B6A155666C6D47AAAE72B8E3EF3F3A6D3BFB7977FF11BFC8D3F49A1526AFD9A5D2F7A8EB6E1056D23239DC8E46C8D76530D44FB08B44CC6D0AF08D463C19ED7C93B46CA7CCB237CD345144D574923918D6A75AAAE110B1FF14179FD2141FE471E742E8DABA3DA2A535CE2456DB99E51D2373BAFCF0663C73FE531C527CDE92DC4F4FC96B52DBCC46EDCDA3E9AB4D9B4F58E28B14F7557B299B331708EE19739DEA5E39E79535A92AA3D4913B4B6B0CD35EA9FCDA5AC7A61CAEEA455EBCF0EE72779CFDB25DFE52D58EA58DD98685891FF00EF5E2EFB13C0DB9DD6CD59A1E965A8AEA6A4D4540DE8D1F2C88D59913922AAF6A630BD4B9267BB9F4ADE34F8EF977DE67BF9C6FDBF4F5416F16DAAB3DCA6A1AF8963A88970A9D4E4EA722F5A29A858D0B9BB42D32F8E4DD4D4F6B8F79ABD7511FDBCBDBEB2B84CA2AA2A6153A94ACC6CEB69B3CE589ADFA5A3BFF3F2964004364000000000000000000000000000000003064C0120B57A3E1F1F89B66A5ABD1F0F8FC4DB3D460F875F943E6BE3BF796A3F3DBEA000CAE5000000000000000000000000074ECB7CAEB2BA575BE548FA54447A2B51738CE39FAD4E6022622D1B4AF8F25F15A2F49DA5DCBAEAABADD697C9EB2663A1CA2AB5AC46E71CB9162DCA1FC21D0ACF244CC9D1B5CC6AF5AB7A8AA2DB433DC6AE3A6A462BE47AF57244ED52796D9EB3424D0D3DD5EC9E86A9729D1E556254E784F1434F3D2B1B453BC793BFC375192DCF6D56F34B46D33E8AEA46BA391CC91AAD7B570A8BCD0CA16FD65874FEA755ACA791A93393CE7C2EC2AFEB27DE7CE9744596DCADA8AB95D2A3173991E88DF12DED95F38EAC73FF008FE69B6F4B44D7D776AECBEDEFA4B5D4D7D43771B51F45179EE275FB7243DDA9AB28AF171A9B5CC8C65448AAA8AD4545C725C2F592FBDDF16F953F2069D5661ED54926CE1AD6A7344F7103D4164ACB1D524558C4563932D95BF45C570C45AD3393BCF933710BDB0E1A534BBF2D3BDA3D5F7BB6ABBB5D29169AAE76AC2E5CAA3588DCF71C3077748E9E96FD5E8C4CB69A35459644E58EC4EF3667930D77DB6871A3C7D6E58AEF36B4BC69BD395B7E9D1B4EDDCA6477CE4AF4E089DDDE5979B3689B5F9A89D22A72E7248BDFFEF81F2D437DA1D236E6D150318B528DF323EA6A7E5394A9AE15B3DC2ADF535723A495FCD57ABB93B8D488B6A3ADBA55DABE4C1C223931C45B2CF79F2876F51EADAFBC4AE62B960A6FEE5BD7EB5EB23CBC7060F46ED295A46D58707367C99EDCF927790D9B650D45CABA2A4A466FCB22E13B113B57B8F8451BE591B1C4D57C8E5C35A9CD57B0EBC4B73D29748A5960E8A656E51AFE2D722F34E1CC5E676DABDCC18E26D17BC4F246DBCC2C6B65B6D7A2AD4EABAC91AEA854C3A554E2E5FC96A7615FEA7D575B7A7AB379D051E5710B579FAD7ACD0BDDE6B2F556B3D6BD17098631A98462771CEC1AF8B4FB4F3E4EB2E8EB78A73C781A68E5C71FBFCD3AD93D6B9974A9A4CF9B2B37D3D69FFD9B57ED435DA6B55D4B51566A295525E89FD59E7BABD5C5148D6839961D5743BBF59CAD5F61DDDADC28DBAD2CC9CDF12B7D8BFEA63B52BE3ED31D261BB87519238673E39DAD4B24371B75AF5B5A1B5346E6B6A9A9E6BFEB357F25C9D855573A29EDB5B252D5B1592B170A8BD7DE9DC6D69DBD5458EE2CA9A755E8D78491F53D0B23525B29B56E9F657DBF756A9ADDE8D7AD7B5ABFEF9889B69EDB4CFBB2AE4AE3E2D86725236CB5EF1EAA8C1E958A8AA8BC15382A28C1BCF3BD9E40010000000000000000000000000000000008A800F24FAA400000000000000000000000000000004B62D9452DC6E14D474C999A77A46DF5AFFA71F0261B47B8436F8A874ADA9F8A3B73516754FF00992AA75FAB2ABEB5EE3DECBE28A821BC6A6AA6A2C76E85590F1E72393FFA4F138D43A5EF17EB5576A06A31D1A39EF915CEC3E454E2EC263AB897ED0E6E4C94B6A37C93B569FF00CA7F8847510B4F6157748EBEBACF22F99335278D157EB27077B787B0AB10DFD3F7296CD7AA4B8C0ABBF03F2ADFCA6AA61508A4ED2D8D6E9E35182D8FCFC933DB55F56BF51C76E89D9A7A06E17BE45E7EC4C215E9F4AB9E4AAA996A2672BA595EAF7B97AD5572A7CC5A7795B498234F86B8E3C83F49ECDAE34F5DA3ADBD048C57430B6291B9E2D72261514FCD87B8A5923CAC52491AAF5B1EAD5F7135B72B0710D0C6B6914DF6D9FAEB982B9D8EDCE066908A3ADAE8D6A5F50FC3669B2F5555E09C5724EEB2BE9691A8957510C0AECEEA48F46E7D5932EFD37789CD82D8B2CE2EFB361EF6B1AAE739A889D6AA7E7AD65AD6EB26A7B8FC9179AA650B64DC8D237E1BC111171E3922F74A999F70AE62554EE8D677E13A45DD54DE5E499C60D2C7798E6EF55A0E114C13CF79E6DE3D121A6D69A8E1A98A65BC55C9D1BD1DB8F765AE44EA54EC52F4A2D534357A424D4316EF46C815CF6AF36B9138B17C781F9A910DDA5B955D35A6B2DB14CA94954E6BA4677A2E787BB3EA222FEACFACE178B5115E4888989FFB8F36B54CEFA9ABA8A99955D2CEF591EABD6AAB93E58E27A05267774E2368D9BD60BB4F63BBD357D2AFCE44EE29F94D5E6D5F5A122DA65B608AB69AF96C6FF56DD5892B31C9B2638A77679FB4873932A84FB492FE10686BC58645DFABA2FE99479E689CD513BB394FFDC5A3B6CD2D57FA57AE78F94FCA7F894010C9843255BA000000000000000000000000000000001832600905ABD1F0F8FC4DB352D5E8F87C7E26D9EA307C3AFCA1F35F1DFBCB51F9EDF50006572800000000000000000000000000012DD0BA8686C3154F95C323E57AF9AE6222F0EC393A8EF93DF2E0EA89BCD8DBC2367E4A1C808638C558B73F9B6EFADCB7C31A799F761D4D394EFADBC52D2367921499DBAAE62F1443A7AF6D8EB3DC618A3AA9E68E466F7CEBB795173DA722C35CDB65E292B1EC57B617EF2B514E96B7BDC37EB94735344E6471B37115E985771E65662FE2C6DDB667C57C5EC56DE7DFDFA7C9C6A1AC9A82B22AAA57AB268D72D54F82932D47AC28EF1A696966A6779639132AA89BAD776A2906C054C96BE1ADED169EED7C1ADCB8296C749F76DDE188911CF4472EEA2AF15E782F4B23AD36AB5C105354D3B62DDCEF2C89972F69456015CF83C6888DF66D70DE25EC369B4577995BB5DA734DDCAA5F34956C59DEEDE7392A132B939170D9BE51CEB65723BB1923787B50AE5155392AA1D8B56A0B9DADED5A5AB9309CD8F5DE6AF82987C0C94EB4B36E78968B3DBFD7C3B6FE712F85DACB70B4CAACAEA67313A9E9C5AE4ED45439E5B162D61417C44A2BB431C72BF8223B8B245ECE3D671AF7A01EDBA40B6CF3A8A593CF6AF3893ED42F4D4ED3CB9636953370BADE9E2E8ADCF5F4F387D7669624CADDEADA88D66521DEE5DEE23FAF2F6DBCDDFE670B4F4F9631C9F5B9657D44D35EDCE2B269F8ADB46A8934CCE8DA89CDAC4E0ABF615314C11E25A72CFE8C9C4AF1A5C55D0E3F2EB6F9867ACC036DC077345AFF00C556CFF17EC251B5D5FE9741FAAEF891FD9DD3F4FAAE957FBBCBFDDFEA7536B336F5F29E2CF06439C7AD57EE352DFEE23E4EEE19E5E159267CEC84AA130D9C5FD2DB5CFA3AB911B493AF9AAE5E0C77FA90E43286CE5A464AF2CB95A5D45F4B9632D3C922D7B1D1B350CD2504AD91B2A23DFB9C511CBCF0BEFF00123A8B93BD45A5ABAB2C6FB9C4B1A46D457231578AA2673F038284629AEDCB13BECB6B2324E49CB7AF2F37587900191A8000000000000000000000000000000008A800F24FAA4000000000000000000000000000000C2B55EDC378AAAA22027A427B7DCDA365965A16A2B65B9CCEA9953FE945CE17FF00892DD9DAA7E28EE1C3AAA7E0A4476BAE4A7BA5A2DCCFA14544C6227AF87C1097ECEB09B23B8F0EAA9F829963ED6CF39A98DF495BCF7B5B7FFB95231AFCD33F550FA1DAD11A6AAF54D7B29699ED8A38D8D7CD33933B8DEEEF52D766C7ECDBA9BF595CAFC717239A99F7158A4CBABA9E25834B6E4BCF551E0BAABF63D6C5A7779157D5C7509F4164DD7373DE98429EBADBEA2D572A8A1AD66E5440EDD722725EC54EE5422D598EEBE975F8757BC629EB0D606327D994D52E6E5296A1517AD2272FD846CDB9B447796E69A6A2EA6B46533FD2E2FE742C4FFB40222D4D9F2D4779B273F02B7A1656D1D7535545493ABE091B2B5AE85D8556AE533C0ECEAED4577D54FA67D75BD635A747237A389FC5171CF29DC5B7E9B39B9B14DF578F2C6DCB113BA30864FA792D5FE6951FBA77DC3C96AFF34A8FDD3BEE29B3A5CF4F57C81F6F24ABFCD67FDD3BEE1E4957F9ACFF00BA77DC3639ABEAF883E8FA7A88DB9929E66A76B98E4F8A1F14767B3DA0DE27B4BD926D9AD7FC9DACEDEF72FCD4EE5A77A7739387BD108C9EE095D4F5104CC5547472B5E8A9DCB9FB0989DA58F3523263B527CE1D1D5543F25EA6B9D12261B14EE567EAB97793DCA72C9AED7E344D61D3B795452C7267B578A7D884285A369534979C982969EFB3000219C00000000000000000000000000003064C0120B57A3E1F1F89B66A5ABD1F0F8FC4DB3D460F875F943E6BE3BF796A3F3DBEA000CAE500000000000000000000000000000000000080005920000000AA1E8B1F456B58A2A54A3BD4D8731311CEE4CEF2762F7F795C031E5C55CB1B4B7345AECBA3BF3E39FD16F576AAD332488B53D1CEEE48E743BDEF53A13592C35F44CA9968E08E191A8E47AFCDF05F615269AB6FCAB7BA5A6C658AE473FB9A9CC9DED52E694F6FA7B6C0A89D2F9CE44FC94E4685F0456F14A4CEF2F4FA6E2339B4F9353A9A56623B74EF2F9DDB6750CAC74B68AB54EB48E5F39BEA472724F6901BA5AEB2D550B0D740E8DC9C979A2A76A293ED93C756E8EA279679168DA9B8C8D578679AAA7FBEB3BCDB8D9F533EAEDB2235EF89CADC3B9AE3EB34B57364C569ACF58861C9C3B4DADC35CB8E3C3B5BB47AA25B26A5E92E557549F4638D1A8BEBE3F61C3D7D56955AA2AD5AECB23546278271F7E4B3F4FD95BA6ED754C8DCB3B95CE7B7098554C7042A2AEB65C96592A2A68EA5AB2395EB98D79AAE54BE1BD6F966FBF46BF10D364D36871E9F6EBBEF2E6032A8E6B951ED56AA75298375E776D96BECB2A52A34FD452393290BD5BE0BC7EF2B4BA53AD25CEAE05FA92B913DA4CB6472B9B71AD853E8BA34763BD14E3ED0E9FC97534FFF00E54E93DAABF71A98BDDCF68F577B591E370DC593FB7A23200371E7C0000000000000000000000000000000115001E49F54800000000000000000000000000007DA878D7D237A9D33117FCC87C4FA533FA3A9824C7D0918EF63917EC08B7D994BF6C0F576BCAA6AF26431227B1549B6CE7FF292E3EAA9F8290BDB1468DD7123D39494D13BDCA9F6135D9C7FE525C7D553F0532D7EDCBCFEABFD8E2F9D51ED84DDA9686E1574352F464956C63A2739708AAD45F37D6A8B9F02F4CA769F91ADF4F3D64D4F4F4713E5A8911118C67355EE2C28748ED05226EED554B13A9AB5DC93DA296DA36D95E29A0C59337893922B33E52BD6491B1B1CF7B911AD4CAAAAF043F3F5EA2875B6D4960A273BC9267231D2C69CD8C6F9CE4FF7D67DAE5A3B5DCB472255BEA2AA1C79D0A566F6F78678FA8DAD8D5CE86DB7BA8B6D6D2AC771A95DC64F2734DDFF0094A8A9C3EDF61333CD310C5A6D357498B266C578BDB6DBA797E2B4AC1A46CD628D128A8A3E93AE591379EABFACA4811AD44C235113D4641936D9E7F265BE49DEF3BCB184EC4184EC432031B184EC4184EC43200C613B10613B10C803CAB1AEE0AD6AA77A114D4FA0ACB7E85CAFA665354F36CF0351AE45EF4E4BE24B4113113DD97166C98A79A93B4BF2DEAAD3D5BA66E7E495ED4563F8C5337E8C89F62F71C593E8397B1327E93DA5D823BF697A98D199A981AB3C0E4E68E6F578A653C4FCD8EE2D7276A60C36AED2F69C375BED78666DF6A3BA7BB57F3A4D3CFEB75B98AA40C9E6D7711DC6CD4D9E30DBD88BEDFF00420645FBB370EFF6D5FD7EA000AB7400000000000000000000000000003064C0120B57A3E1F1F89B66A5ABD1F0F8FC4DB3D460F875F943E6BE3BF796A3F3DBEA000CAE50000000000000000000000000000000000000002C00000000001F482274F3C7146997BDC8D44F5952B1369DA1636CA6D8E8E19EE52A265C9D1C6AA9D5D6A43B565C9D78BFCF33155EDDEE8E344EB44E09ED2C7D412B34D68A4A68977667B12262A73DE5E6BE0995207A06D6B71D4502B93E669FE75FE1CBDE68E3B44CDB34FE8F4DACC3315C3C3A9DE7ACFEA9DCCE4D27A11ADCA24E91E329D6F77595452D4CB4B591D540F564EC72391C9DA4DB6AF74496B21B6C6ECA429BEF44FCA5E5EECFB481A1934B49E49B5BCDA9C673FF00AF18B1CED18FA47CD65D2ED2A9FC9A34A8A2996A31E76EAA6157B8F69B4AA4FAF6F9BC1C8A56461C9927D9317A2238EEB3688E6FDA16FC17ED357F448AA5226C8BC9B3B3757C17B4E45FF67CC7C6E9AC92F7A42F5CB7C14AD53872243A7356D7D96446A3967A5EB85EBC113BBB0C7E05F1F5C53FA33D78A60D57B9ACA47E68EEEBECE20A8A1D552D354C4F8A5485779AE4C2F343E7B564FF008962E3CE99BFCCE2C5B3D4DB6F71C572A6463E66A6EE7939B9E6D52BADAB393F096344C2E29DBFCCE2986FCF9F798EBB3775DA5AE9B86F2D6DCD133BC4A16003A0F22000000000000000000000000000000008A800F24FAA4000000000000000000000000000030A64013CDA7E6B6834CDD5BC52A6912355FF00AD31F79AD69A9D676CB33ED9436FAB4A37EF6F316937B3BDCF8F89B14C897ED924D0A7FE2ACB51D22679F46BC797A957D86FD06D6AB696869E07DAE199F1C68C5916654572A26338C193A6FBCCB8B1E2462F0A948B72CCC6D3FF0071FB23D60A7D57A7EADD536DB3D5367737737E4A5DF544EEEC242BAAB68B95FE8753FC127DC7DD36C75A8A9FD4F022F674EBF719FC7257AF1F91E0FDF2FDC4ED5F553263D565B735F05667E6D776AADA2F0FE8753CFF00324FB88EDC29354D75E52EB35A2AD2B9AF6BFA48E9B772E6E30B84EBE084A976C75EAA9FD4D073FEF97EE0BB63AFE3FD4F073FEFD7EE1EEFA94C7AAC73BD30563F56AFE156D1BF33AAFE093EE33F853B465FFD1D57F049F71B3F8E2AC44E367833FE3AFDC6536C757FA1E0FDFAFDC3DDF563F66CFF00F1EBFB357F0A368DF9A557F0483F0A368DF9A557F0486D7E392AFF0043C1FBF5FB87E392AFF43C1FBF5FB87BBEA7B367FF008F5FD9ABF851B46FCD2ABF8241F851B46FCD2ABF82436BF1C957FA1E0FDFAFDC3F1C957FA1E0FDFAFDC3DDF53D9B3FFC7AFECD5FC28DA37E6955FC120FC28DA37E6955FC121B5F8E4ABFD0F07EFD7EE1F8E4ABFD0F07EFD7EE1EEFA9ECD9FF00E3D7F66AFE146D1BF34AAFE0907E146D1BF34AAFE090DAFC7255FE8783F7EBF718FC7256FE8883F7CBF70E9EA7B367FF008F5FD9A926A7DA33915AB4753854E3FD09086525A6AD75050D05652CF4F3544ECF32566EAE15DC571D9C3DC4F936C95B9F4441FBE5FB8F8E8FB83B54EBEA8D457089B0D3DBE9FA456A3B28C544546A7BDCBE0368F566C739B4F4BDAD8A2B1B7979CF9381B56AB4AAD735AD6AE590323853C1B95F7A9123EF70AB7DC2E3575B2AAEFD4CAE9573D48ABC0F818E6779DDD6D363F0F0D69E9000086500000000000000000000000000000C19300482D5E8F87C7E26D9A96AF47C3E3F136CF5183E1D7E50F9AF8EFDE5A8FCF6FA80032B94000000000000000000000000000000000000000B00000000012FD9A5B52BAFCB3BD33152B77D7F5BABED2225B9A3E99BA7F46BEB2A3849235677F7A7D5F763DA6AEAAFCB4DA3BCBABC1B4F1975117B7D9AF5945F6A1745AABCB68D8B98E99BE0AABCC92ECF28E3B5E9892E350DC3A66AC8ABD7BA9CBDDC4ADE9229EF97C6B132B2544B973B9E11578AF827C0B1768B5CCB669F8ADB4AA8C599123444E68C435F2D76AD30C7EAEA68F2F364CDC432768ECAC6EB58FAFB8D45548AAAE95EAEF51AC8A39837E3A4443CCDED37B4DA7BCBD000954306401D5D3D7EABB1D4BA5A554735C98746EE4BFEA6B5DEE53DD6B9F5554A8AF77244E4D4EC434C15E4AF3736DD59673649C718B9BDD8F27900191840000000000000000000000000000000115001E41F5480000000000000000000000000000000259B2FBAC741A93C8EB38D15C58B4D2B579657822AFB71E270F525AE5B1DF6B2DF322AF42FF31DF94C5E2D5F61CD5CA2A2A2AA2A7254EA2C5BF3135A68E86F50222DDED8DE8AB1889E7491FE5227BFDBD85BBC6CD1CBBE0CF197FF005B749F9F94FF008482AE9E24D87365E8A3E956919E7EE2678B9133929CC96E4772A6AED87D4454F222CB4B036195BD6D76F27B95389512136F263E17CDFEAF37F74B2002AEA8000000000000000058BB0F8A3935157B64635E9E4C8EC39329F490AE8B1361B2322D457292472358DA3455555E089BDC549A7768714998D2DF64675F2359AD2F0D6B5111B3E11113098C275120AACE97D99474DC1B72BF3B7E444E0E6C489CBD9C3FF729E6DB6EA6D59B40BADC5DE848245A89A57A61AAD444C357D7BAABEA381AD2FCED457D9AB1379B4ADF9BA762F0DD8D392E3A9578A9333B4CCB5EBBE6F0F079562267E7E51FE5C2001475C0004000000000000000000000000000000003BF6AF47C3E3F136CD4B57A3E1F1F89B67A8C1F0EBF287CD5C77EF2D47E7B7D400195C90000000000000000000000000000000000000196B55CB86A2AAF62264CB1AAF7B58D4CB9CB84253B4BC827743B38AE9988B55590C2BD8D6ABFEE3AF1ECEADB1373575D3B913B15AC4F81AD6D5E38F37571704D664EBCBB47E32AB816CB74BE94819F3B246FFD79F39F78F93F44B39F92F8C8EFBCAFB6567B44B63FA0E48FB592B1FAAB9D376E75D2F34D4C9F41CECBF8670DEB5279B53B8A52D053DB61546EFE1CE6B7A9A9C13FDF71D8B63F4ADBA7596DF352C52AA6EEF23B2B83DDCA9F4D5D67E9AB24A79A54444CACB8E1ED35AF9F9F245A6B3B43A98387F81A4BE1A64AF3DBCF7F245B6516BDEABA8B8CA986C69D1C7EBEB5F670381AF6E9F29EA19FA3766183E699D9C39A96B5B1B69A3A1F24A09E28E2E3F464455CAF5E72466A367543222F93574E8E55CAEFE1FF007134CF5F16725FF45753C3737B1534DA7989F39EAAB0137AED9D5CA1CAD2CD0D42272CF98ABF123770B15D2DEDDEAAA299ACEA722653DC6ED72D2D1D25E733683538637C9497300EE54C283234DE800480000F2002C0000000000000000000000000000000022A003C83EA8000000000000000000000000000000000ED692BFCFA76F11D5C397C2E4DC9E1EA919D7E29CCE2810AE4C75C959A5BB4A71AC6D4B6CA49AF1A72557E9DBBB375EC6F28D55728D54EAE3C97AB910545251A33543AC6E9E92B61F2CB355652A299533CF9B93BFB53AFD66C6ACD2294B49F2C69F93CBAC7226F2398997C3DCEEE4EDE69D65A7AB4B0E49D3DBC1CBE7DA7D7E7F8FD51107969E88744000480000000000007574CD35D2E35925AACF9DEAE674736170891A2E55557A93B7D878D3F64AFBF5C19496D855EE55F3E45E0C8D3B5CBD44C6ED78B7E8DA096C9A6A549AE9279B5B7044CAB57ADADEACFB93D64C7AB47559FAF838E37B4FEDF8CB5F5A5C68EC9676E93B0C88E631735F50DE0B2BFADBF7F821040AAAAAAAAAAAABC5557AC1599DD974F8630D36EF3E73EB2000360000000000000000000000000000000000001DFB57A3E1F1F89B66A5ABD1F0F8FC4DB3D460F875F943E6AE3BF796A3F3DBEA000CAE48000000000000000000000000000064C1D0B25AAA6F35CDA5A36E5EBC5CE5E4D6F5AA916B45637964C78AF96D14A46F32D4A6A79AAA66454F1BA491CB846B533927564D9E4D32364BACDD0B57FE5B78BBDA48E286CFA26D8D7CBE754BBEB632F91DDC9D49EE20B7FD6572BB6FC71C8EA5A65E4C8D70ABEB5E669F899337C3E91EAEF7B269387D62757EF5FFB63FCA6EEA9D33A61158CE85274E0A8D4DF7F8F6156DCEA23A8B954555347D147249BEC6A751A88864CF8B07873BCCEF2E76B388CEA62295AC56B1DB67726D5D7B9A1489F5AF4444C65A9BAABE27267AEABA8E3354CAFF5BD4F8221932463A57B4356FA8CD93ED5A65E40305B661DE59000D8DE59472A72554F529B305C6B29F1D0D54ECC7E4BD4D403963CD6ADEF5EB59949A835ADE6937512A3A5627D591339F1E649EDBB4785ED6B6E74CAC775BE3E29EC2B23260BE9B1DFC9D0C1C5F57827A5F7F9F55BCB43A6754C2AEA6585B3AA6731F98F4F5B48A5FF0041D75035F2D0392AE24E3BA9C1FEC21B13DD1C8D9237398F6F16B9AB8545269A6F5DD651B9B0DD57CAA9F96FE3CF6F8F598BC2CB8BE1CEF1E92DEAEB347AEF77534E4B7F747F984338A2AA39151C9C1517A816D5FEC16ED554495D6C7C5E538CA48DE4FEE7779555653CD4750F82A58AC958B87357A94CD8734648F4973F5FC3F268E627BD67B4C3E20C193339EF2002C0000000000000000000000000000000022A003C83EA8000000000000000000000000000000000000614EDE96D4B70D3952AFA2911F0BD7E769E4E31C89DE9D4BDE9EF38A60989D95C98EB92B34BC6F12B0DF66D3FAD58B3E9C9E2B4DE1C9E7D04FC237AF5EEE3B7BBD88436F565B8D96758AE7492C0BD4F54CB1DDE8E4E0A73D1551C8E6AAA3938A2A2E153BD17A949759F5F5DE8A04A4B824375A0C6162AB6EF3B1D9BDF7A293BC4F769C62D460E98A79ABE93DFF49FE51045C99276AED077B4CCACABB04EEE2AADCBA3DEF7A7B907E2F5954DDFB26A2B6D73179239DB8BEEC93C933D978D7E3AF4C9135F9C7F9EC82026B26CC75335331D3D34A9DADA84FB707C9366BAA57FF431277AD4331F1239656F6FD37F7C7FDA1E09D45B34BAB1BBF5F5F6DA38FAD5F36F63DD8F7994B0E8CB53B376BF4B719539C144D4C2AF670CFC49E59F356788619E94DED3F846E83451BE591B1C4C7C923D70D63132AABEA26B6BD06B0D3F97EADAC65A681A9BC8C5722CCFEEC757BD7B8FACBAF696D71BE1D2566A7A16AA63A79911F22FFBEF5521973B8D6DDAA9D5171A996A265EB7AF044EC44E4883DD5667519FA7D88FFB9FE23F74AEFBACA265B56D1A4E97E4DB5E30F97FE6CDDB95E69EDCFA8861E51307A2932D8C382986BB523F99600043280025600000000000000000000000000000000000077ED5E8F87C7E26D9A96AF47C3E3F136CF5183E1D7E50F9AB8EFDE5A8FCF6FA80032B92000000000000000000000000120D1FA7D6FF005CF8DD32450C288E7AE32E5CF5211F3668AB6A68645928E77C322A63798B829939A6BB57BB369ED8E9922D9637AC792D6752E95D36DCCEDA7E99A9C77FE724FB4FA52EB4D3CC7E237244ABD69163E053F23DD2395D2395CF5E6E5EB3C9AFEC713F6A665D98E3D7C73FE8E3AD63E4B8AFBA7EDBAA99E554D53F3FBBBAD918EDE6A772A15EDDB49DDADB22A3E95F347D52429BCDC7D8722DF5F556F9D26A399F149DAD5E7EB26F6DDA44B1B11971A44957ADF1BB0ABE0A56299B0FD8EB0BDF51A0E213BE78E4BFAC7641DB4B52E7A3129E6572AE1137172AA496C3A1EE3707A3AADAB494DF595DF497BB04A1DB43B5747BC94753BFF93BAD4FB4E05E75FD6D5C6B1D04494AD5E1BD9DE77FA133933DFA56BB295D2F0DD3CF3DF273FE1094250696D36C449920595BD722EFBD54F2BAA34B54B7724647BBFF00541C0A9E59649A474933DD23DDCDCE5CA9E10B7B26FD6D699944F1C9A74C38EB15F92D8ABD2DA7AFD0F4B6D7C513978EFC18C78B79107BC690BB5B65545A774F0F54B12653C53A8E35256D4D04C92D1CCE8654FACD526F69DA44F1C691DCA95B32E31BF1AE157C0AC53362EB5EB09F1B41ADF8D5F0EDEB1D9075A4A8E93A3E825DFE5BA8C5CE491D8744DCEE32B5D551BA929FADCFE0E5EE44257F8C4B5247BCB4751BFF0093BADFBCE15DF6895752C732DD036991786FAAEF3B1F613E267BF4AD76234BC3B04F3E4C9CFF008424EDB6697D371A36A920E9719574D87397BF1F71E3F0AF4BCB1A325466EFFD54FC3E054D34D2CF2BA49A4748F771573972AABEB3C389F64DFADED33289E3B349E5C38EB15F92DAAAD37A72FECDFB6BE38A444FA54EA889E2DE441EF3A3EED6D7F9B02D4C5D524499F6A751C2A3AAA8A2A86CD4933A291BD6D5C139B5ED1AA216232E14AD9D7ADEC5C2AF811C997175ACF341ED1A1D6FC68F0EDEB1D908F23A8E9773A1951DD8AC5424363D1772B948D5A889D4B065155F2271C762212C4DA1DA5D1E5D4751BFF92AC6FDE71AEBB45AAA8639B6DA76D3B57948E76F2FB303C4CF7E95AEC9AE9387609E7BE5E6FC2212DA082CBA3E95D1AD5246E7E15EAF7E55EA9D78EAF035AA35669AA97AB6A3122F2557C394F815255544B5333A5A891D24AEE2E73972AAA7C488D1C77B4F55B271FB563C3C38E22BE92B764D3DA6B5042AB6E74314C9C51D02A22A7ADA56FA92D12D92E4B4B339AFCB51ED73792A2AAA7D8685354CD4B2A4B4F23A395BC9CD5C2A18A99E5A999D2CEF74923B9B9CB95532E2C56C73F6B7868EB35B83538E27C3E5BFAC767CC00677300000000000000000000000000000000115001E49F5480000000000000000000000000000000000000C003200212185C271C267A97AD0C804ED3DDF48AB2AE36EEC75752C4EC6CCE44F89F575C2B9CDC2D755AA75A2CCE545F79AB83284EEAF875F41EAB22E65739EBDAE72AFC42222270320895A221E4C80000000001200090000000000000000000000000000000000001DFB57A3E1F1F89B66A5ABD1F0F8FC4DB3D460F875F943E6AE3BF796A3F3DBEA000CAE4800000000000000000000000064DDB6DAAB6E7D279053BE758F1BC8DEACE7EE3E75F41536FA8582B617432A26775DD8579E37E5DFAAF38B2453C49AFBBEBE4D5001650000197183AF1E9DBBCB4EDA88E825753B9BBED9131C5BCF2724AC5EB6ED2C97C3929B73D6637650C9843AD6DD3B77B8D3A4F4B412BA25FA2E5C3729DA99C649B5E2B1BCC98F0E4CB3CB8EB33F27254C60E85DACD70B56EADC69A4811CB86AAAA2A2F8A2A9CF4E02B3168DE117A5B1CF2DE36914C19530595650F4793AD53A76EF4D4CEA89A865642D4DE572E38276F322D78AF795A98AF9379A5667672000140C9800003AD169CBBCB4EDA88E825753B9BBED9131C5BDA56D78AF7964A62C9937E4ACCEDE8E51930096260004A40000000000000000000000000000000115001E49F54800000000000000000000000000000185036AD9433DCEE34D454AD474F3BD23622F6A9743F4DE8FD196D864BE3595133FCD49266AC8E7AF5EEB392271F81586CF2B22A0D676AA8A876EC4D955AAABD5BCD56A7BDC5A5B5CD2B72D40943536A6A4EB4E8E6BA2DF46AAEF2A2E533C3ABB7B0C958DA3770B8966B7B4530DEDCB49EF30F355A4B4AEAEB33EAB4F24704A996B65851588D7A753D9C3B53AB257BA0B4749A86FF53495AAE869E8B854A27D2DECAA6E278A2F1EE2D0D9369BAFD3F67AB6DD11239EA25DEE851E8EDC6A261155538657BB3C3079D13554B0EB3D59429B8C9DD5093353ADC98E3EF5F796DB78DDA11ADC9863363C569B4476969D737679A7EBD2D7574B4A950DC6FF004913A5DDCA7D6771C29C0DA5E85A2A2B5FCB5624DDA76E166898BBCD56AAE11EDF154CA72C2E7860D6D61B3DBF55EA8AC9E8216D4D3554CE95B2ACAD4DD472E551D95CF0CE3867860B1AF141F27ECD2AEDF23925753DB1D1B97A955B1F34F14276E9B4A273469FC2C98B24DA67BC6FBABED9A684A4B8DBD2F17CF3A9D573143BDBA8A89CDCE5ECCA7B892DB23D9FDFEB1D6CA2A3A474D85C6EC4E8D5E9D6AD77055FF7D477FE467D468186D146F48DF251C70EFBB8E115111CABE1922745B30B22E528AF957E5B1F37C5333CD5EBE08994F69131B76567575CF6BDF2E49ACEFD36ED1F8CABEDA069A4D337C5A68A47C94B2B7A485EEC671C9517BD17E2871EC3047537DB6C33377A392A63639BD4A8AE445453775969FACD397875256B925DE4DF8E744E12A2AF3F5E79A1A9A6FF00B4B68FDB22FE7429E6F498ED33A5DF9B9BA775A3B55D2D67B46974A9B7514704EB3359BCD55CE1517B54E26CEB67A97BA76DCAF0E923A157622898BBAE971C15557A933E2BDDD735DB5FF6359FB4C7F071D8D46AFD3FA02A9287E69D4F4BD146A9F55708D47782AE4B4C46EF398F5D9ABA6AD2B6F7AD698DFF000E8E43AD7B3FA49FE4E99B6D64EDF3375F2F9CD5EC572AF05F1227B44D9DC16BB7C973B12BFC9E2F3A5A772EF2B5BF94D5E784EBC9583955CAAAAB955E7DE48A4D6D7E75A62B6A572B69591742A88C4DE73718C2AAA67970226636DA61D5A6835382F5BE3CBBFAEEB0B65FA52CB78D27155DC68239A7591EDDE555CE11787594FD6B1ADAC99AD4C35AF7227AB25F9B18E3A162FF001A4F89425C13FA7D47F88EFE6522D1D224E1D92F7D5668B4EFB4FF002B37641A6ED37BB657CB73A38EA1F1CC8C6ABB3C1319211AE28E0A1D5972A4A48922822930C6A2F044C21676C13D0F74FDA13F950AE3693C35CDDFFC6FB106DEEC234B92F3AFC94999DA23F84700055DC00000000000000000000000000000000000077ED5E8F87C7E26D9A96AF47C3E3F136CF4F83E1D7E50F9AB8EFDE5A8FCF6FA80032B920000037AC75CB6DBCD1D52265237A2B93B5ABC17DCA5A5B47A08EAB4ABEA226377A07B256AB53AB92FB973E060C99BC3BC5663BBA7A4E1FED583265ADBAD7C94F82D1D95D0363B4D555CCD45E9A4DDCBB8E5AD4EFEF55399B58A0486BE8AAA34444918B1AE3A95AB94FE62B1A989C9E1B2DB845EBA38D56FFA2020BAAC71C162D150C93469F334FD33D1C9C55CA9BCA9ED5C113D9F69E8AF12D45DAE8DE998B22A318E4F35EEEB72A75A71E5CB9911AA8DAD331D2192DC12F16C78EB6DED68DFE5081A31EE6AB9AD556B7E92A2706A76A9E50B86E1AD2CF6AAF7D0F412BBA25DC7AC4C4DC62F5A734E5D7833A9B4ED05FED0EADA16312A959D2C534698E93AF75DDB9E5C7914F6B98DB9ABB44B2DB8145A2D1832C5AD5EF0A74F4D6B9D9DD6AAE1155709C910B4F64B1B24B0D52BDAD77F497734CFD461BD2DE2C3A6EB27A573F153348E9665646AE54572E7CE5EECFB09B6AE62D34AD779571F04ACE1A66C9962B13EBFFEB81B1F5F9EBAFEAC7F171C8DA8AFFC56FF00F099F6926D9DD67CA3A82FD54888D64AAC73513879B9763DC7CF50E9B9EFFAD5EEC2C7451C6C49264EDE786F7FC33EDC3178AE79B5FA746F5B4D6CDC3298B0F5F7BFCCAB005C7A8EF16DD2F6E6D252C50BAA91BF350639762BBAF9F8AFBC8169CB14DAB6AABA69AB12196356AB9563DEDEDECF7A631836A9A8E6AF3DA36872753C2FC2C95C18EDCD927CBD3F5464162FE2CA4FD28CFDC7FF00D1CDD43A1DF66B44F5EB5E93245BBE6245BAAB972273CF793ED38A6768952FC1F598EB37B53A475EF0B0ACBFD8AA3FD85BFC88413416A3B5DA2D33C37255E95D3ABD311EF70DD6A7D84EACABFF000551FEC2DFE4423BB298209AC555D2451BB76A5C89BCD45C26EB4E7D6622B6DFD5EA7356F6CD8231CC44F2CF7EBE8835DE782EDAA24922CAD3544CD44CA6155382722DED4B5EB62D3D355D2C2C73A246B58C5E0D4CAA2272EAEE21F4178A3B2EB5BBC53C123FCA266471F46D4546AF7E553B509CDFAE505A6D72D65546F9216632D6222AAE571C9553B49CF69B4D6BB7462E198AB4C79EFCF116999DFA76DB7531A8F50D55FE581F56D8DBD1355A8D622E32ABC578AAF77B0E4265CE46B532ABC93AD549356AC3ABB5840DA06BE2867C22AAA615A8D4E2BC17B13813DB957DA345D143143499924CEEB1A89BCFC632E72A9B7E3785B52B5EBE8E25787DB596BE7CB97DD8FF00DBD7F4538F4731CAD7B55AE4EA54C28452DFB2DFADBABE3968AAE85AD95ADDE58A4C3DAA9CB28BDBCBB17895CEB1B2FC897C969D8AAB03DA9244ABCF757ABC1514C98B51CF6E4B46D2C1ADE19E0628CF8AFCF49F3ECE3977EADFEC857FF81F6147A17FD7B29E5B3CADAE544A5E8F32E796EA2657260D6CED6A4BA3FF008F579F1E7AFAC7F2A011AE56B9C8D556B79AA27043C97258356D9EBAB9B6EA589F4EBF463DE62358EF5617811DDA85860A564572A385B12B9FB93358984555E28EC7B7DA5E9AA99BF25ABB353370788C13A8C3922D11DD5E9F4E8A4E8FA458DE8CFCADD5C7B7916168BABD376AB52544D5113AE1BBBF22BD8AAE6AE3E8B729F0EB3A769D72CB95C9B4B0DAA7742AE46F48C5DE56E579B91138278936D45A26796BD20C3C270DEB59C99A226DDA2237FF00B54C5EB65FEC551FEC2DFE44227B4DB0524148CB95344D8A457A32646261AE45CE171DB9E1E24AECD84D1547CFFF0002DFE4435B519632D2B6875B8568ADA2CF9715A77F75461E991BDF9E8D8E7639EEA6495E824B1433CD517B9A2599AA8D8A2918AAD4EBDE5CA633D9D9825157AFA8E3AEF24B6D03EAD8C76EAB99C33FAA888B936AD9AD13B56BBECE2E9F8762C98E32E5CB11BF977955460B9B54D9A9AF9627D5793AC356D87A68D55BB923571F45DF035B65D1B1DA71CAE6B557A777154CF5214F6C8E49B6DD9B3FD06D1A88C336E931BC4EDFE151E1CBC1A995EA4EB55EC430B945547261C9CD3B0B62A2FDA7B4DDDAA69DB03DF52F955F3CAC622AA2B955DCFB133D474F5A5AE96EFA72A6658DAB2471ACB148DE7844CE33D8B823DAE62637AF4947F43ADA979C79626D5EF0A50F4D6B9D9DD6AAE132B84E484E3675A660B8A495F708FA48A37EEC71AFD1739138AAF6E3284AEEFABACF64ABF2148A47BE3C239208D1519DDCD3DC5EFAADADC948DE58B4FC222D8633E7C91489ECA73031DE5B1A9A8EC17DB3A55A54D2D34F237A48A773918AE5EA4777110D05A763BD5CA5756377A929B0AE445FA6EEA4F5732D5D4C4D66D31B6CC59B84E4A67AE1C768B7376945DB1BDF948DAAF544CE113A8F05BB7BD5D6DD3B55F27D2D1748F89137DAC446B19D78E5CF1DC6C4715A35B595D3A41BAFE2C47AB51248DDEBECE463F6B98DA6D5E8DBFE874BDAD8F1E589BC796DFE54D983ED594EFA4AC9E9A54C490BD58EF5A29F1373BF5702D59ACED20002A000000008A800F24FAA400000000000000000000000000000001B36DA292E15F4F4703A36CB33D236AC8EDD6E5782657D782CBB97E1DE90B440E4AC4ABA654566236F4AB172C6555B9F6E53815631CE639AE6395AF6AA2A39382A2A75A16659F6B55D4B44C82E56F8EB646A63A56CBD12B93BFCD5E25AB31E72E6EBF166BCD671D22F11DE27FF00B4D765EDBABAD75B75D4324AB5154E4DCE993755236A705DDC26EA655DD5DFD656D414373D59ACEE971B055454F347374AD91F22B17755551B8C22AAF04E29DE7AD59B49B95F28DD474B0328291FC246B5EAF73DBF92AEE1C3C08AD86F35B60B9C75D6E911B33515AA8E4CB5ED5EA54ECE05F9A22366AE9B459AB1932CC445ADD223CA13CBE5E75F5BEBBE4674D34B2B9C8D64F153B7E7117B177797BD09AEAC992C1B319E9AAE6E92A56952955D9CABE47261CBED5555F122ADDB34BD1A23EC91BA4FCA4A9544F66EFDA41B576ACB8EA99D8EAE56B208D731C11F06B7BFBD7BFD98226D11DA5829C3F3E7BD2B931C5223ACEDB755D50CD35F3661BD6C72AD5CD43B8D46AF1DF46E1CDCF6E5150ABB66D65BCB359D13D292AA9A381EAB3BA462B111B85CA2E7B7960D2D19ADAE1A5F7E281AD9E8E476F3A07AAA222F5AB57A95496546D8AA16354A5B3C5148BC9CFA857A7B11A9F12DCF129F63D569A3262C548B56DE6DADB4C1F29DD74FDB69918EAF9164C22BB1C155A888BEBC2FB08737485DB4FDE6CB51728A3646FAE8636E1E8B95DECF57A8E5B351D63F53C37BAD72D454C72A49BB9DD4C27D54EC4243A9B6892DF56DAAEB7320F23AA654A625DEDFDDCF9BCB8732B368DF796CE3D3EAB4F4AE0A444D769DE7E69F6DB3868C8FF698FE0A75AD7241AC342358E7E3CAA99617AA7D493185E1DCA992A8D69B419753DA1281F6E653A248D937D25DEE5DD84385A5F54DD34DCCE75BA66F46F545921913798FF0FB899B44CB4E9C2B34E9A2BDAF13BC3E957A2F50D35C92896D55524AAB847C6C5746BDFBFCB1EB542C5BA682B1DAF447945DA356575341BD24D048A8AE7AF1DD4EA5E2B84CA761A71ED8E548D3A4B2C6E913ADB51BA9ECDD5217ABB595CF53AB1957D1C548C76F369E34F373DAB9E6A47BB0D9E4D7EA2D4AE48E488EF313DD676C42BA39B4C4F468E6F4D4F33955B9E3BAEE28BEDDE4F02BCD5BA26F3417CAB482DF53534B2C8E7C32411ABD15157288B8E4BD5C71C8E0586F55D62AF6D5DB65E8E544DD722A65AF6F62A7616353ED8E7489A953668A495138B9950AD45F056AFC47344C6D28B69F55A5D45B2E9E39A2C956C974FD5E9FD3F3FCA2C58AA2A65593A35545DC6A222222F7F055F1294D5F5CDB9EA7B9D646A8B14B3B958A8B9CB51708BE2888A493546D2AEB79A57D2D346CA0A67A61FD1BB79EE4EB4DE5E48BDC840C8B5A3688867E1DA4CB4CB7D467FB56F2640055D900000000000000000000000000000000000077ED5E8F87C7E26D9A96AF47C3E3F136CF4F83E1D7E50F9A78EFDE5A8FCF6FA80032B920000171E8DA88EF9A35B4B33B7B76375349DB8C613FF8AA14E128D0FA9A3D3B254A54C52CB0CDBB848F0AA8E4CF6E3ABE06B6AB1CDE9EEF7875F836AEBA6CFB649F76D1B4A6775CE9DD9C369D331D43A148F08B8547BD7CEC75F5B94D8BC52FE13699B6CC89973A486454C752AA35DEE55F610BD6FAAE2D410D2C54B14B1471B9CE7A4889C57184C617D7ED37B496B6A6B3D962A2AC82A247C6AEC3A344C61573D6A9DAA6AF8178A45F6EBBBB71C4F4D7CF6C336FF4B96223E70EDED52E294D638A89AEC3AA9F877EAB70BF1DD36B6613324D2D1C6C5CAC723DAEF5E73F0542B9D637D4BF5D52A236BD903188C635D8CA76F2FF007C8F3A5F5154E9FAB7490B52585FC2485CB8476392E7A94C9ECD6F07963BF76A7F57C71C4A734CFB9B72FE8F86A7A6969350DC239D8AD72CCF7A653E922B95517D8A5C3A4A1928B4B5147548B1BDB0EF391C98DDEBC2F6703851ED06CD335AFA8A6A86C8DE288B1A3B1EA5C91FD55AE9F74A27D15BA17D3C12262491EA9BCE45E6984E09ED52B6AE4CD1159AEDB33E0C9A3E1F6C99E9979B9BB424DB2D9124B3D7C8D4546BEADEE4CA617E8B4AD75348B36A2B9BDDCFCA246F823951090E8AD594BA7EDD3D35553CF23E49964CC7BB8445444C715EE22972A86D5DCAB2A58D735B34CF9511DCD115CAB8532E1C76AE6B4CB9FAFD5E3CBA2C54A4F58EF09E6C753FA4DCFF00563F8B898DDB51D05AAE1494750F5E96A1C89C3EA22F255EECE3FDA159688D474DA79F58EA98A593A746A37A3C70C6739CAF79A5ABEF10DEEF4EACA7648C62C6D6EEBD133C33D9EB31DF4F39334EFD9B9A6E2F4D270FA56931CF13DBF54D3699A716A62F95A8D999634F9F44E6E6FE57AD3E1EA2B6A5ACA9A4DEF25A89A1DEFA5D1C8ADCE396704FAC1B40829ED51535CA9EA67958DDC57B11151C9D59CAA71209767D24B5F2C96F6C8CA67AEF35922222B73D5C15781974F17AC78778ECD0E2D7C196D5D569EDD67BC79C4BEDF2BDCB8FF58D6FF10FFBCF94D70ADA889D1545655491BB196BE6739171DCAA6A21E9BD66CF2D63C9C9F1B24F49B4AF1B327FC1547FB0B7F910E36C8D3FA8AB3F6A77F2B0E5506BBA1A7B0C16F75354AC91D3242AE4DDC2AA371DA73F43EACA3B0DB27A6AA86A1F23E65951636A2A222B5A9D6A9D873270DF96D1B79BD95788E9BC7C36E78DA2B313FB34B50FF6F65FDB19F61606D23FB1F55FAD1FF3A1575D2E50D5EA675C636C9D03A76CB8544DEC263298CF3E04A3566B5A0BC58E6A1A7A7AA64AF562A2BDADC70722F538CD7C5799A74ECE7E9F5986B8F5516B6DCDBEDF8F77336673321D55123F199237B5BEBE7F61616AEBD45656C12D4DBBCAA27AAA6FF0C317861173DBF614B413494F5114D0B959246EDE6B939A2963DB76894D25224577A47ABF1873A344735DDF85F871275386D378C911BA384710C74D3DB4F7BF2DB7DE276DE1B169D62CADA87A5B2C2F9256B72EE895A9C3D7822DAFEE53DCAB699F536FA8A27C6D73712A7D2E29CB87124EFD7B65A389CDB75148AF54CEEB6346267BD7FD14AFEFD77A9BD5C1F5556E4E3C18C4E4C6F6211831CF3F372ED0713D5D674DE178BCF33E91110E7A17B6A2824A9D3159140D57C8EA75DD6A75F9BC8A250B366DA3D1B6955B4D4D3F4CD44DDDF44C78F12FABC76BCD66B1BECC3C0F53830D32D735B6DE3F942F47D2CF57A9681B4E8ECB256C8F544CE1AD5455CF67678962ED4E546699E8DDF4A499A89EB4CAFD86BC3B40B4246B23E9A78A77226F31AC4CAAFAF3F120FAC752CBA86A63548FA2A58F8C6C55F39557EB2E3BB063E5C9972D6D35DB66CF8BA6D0E8B262C7939E6E9EDB34F5A74F587CBABE9A3A89A38D1F2BDEDDFE3D8D45E073E8F5B54DCEB62A1B2DB1B1ABDC88AE72E775BD6E5444E18F5A9F2B06BFA46DB23A5BB4122CAD62315CD6A39AF4C63976F69F2B9EBCA58617C760A148A477395EC46A7B13ED31C62C9369E6AEF3FB36FDB34D4C549C1922958EF111D6521DA871D2927F8ACF89D0B3FF0062A8FF00616FF22108D55ACE82F763928E3A6A9648F56B91CE46EEF05CF6E78F2E47DEDFAEE820B053DBDF4954B2C74C90AB911B8CA371DA57C1BF8711B79B2CF12D2FB55EFCF1B4D76FD5EB679A628AAEDE973AF8D27DF72A471BF8B511170AAA9D6B9F81F6ACD75494150EA4B2DAD1DBAEE8F7B1BA8AA9D8D44CAFB8E368BD60DB2D3BE8EBA37C94EAE57B1ECC658ABCD30BCD3ACEDD5EBBB3C2F74D436F592ADC8B87BA36B3DABCCC96C7926F3CF5E68FD9AB8353A6A69A9E0E48A4C77E9BCA5B13EAE4D3CE7DC11ADAA7D3ABA46B5308D5545E18EEE470F653C74BAE787CF3FEC39147B42A75B6F4374A7A87543D1C8F744898C2E708995EC5434B486B0A3B0DA568EA29EA647F48E7658D4C71F131F81922968DBCDB7FD534939B1DF9FA444FF8EE8AEA37B9DA86E7BCB9C554889FE654FB0B9D7FB1ABFB17FF00A147DD2A1B5773ACA9635CD6CD33E44477344572AF1F693FFC3CA04B22512D3D4EF793F45BD86E33BB8CF3363518ED7AD368ECE570AD6E1C3933DAF6DB9BB7EEEDECC26649A5D91B172E8E57A3BD6AB9F82A15A6ABA59E975157B6A5AE6B9F339ED554FA4D5555454F053EFA5B51D4E9FAA73E26A4B4EFFA712AE33D985EA5276CDA159A68DAB5305431E8B9DD7468B8F795E5BE1C93688DF764F1B4DC43494C3932725A88851E86BBD5504554C4818D91BBC8C7B951E89DE9824FB257B194972A6739AE959322AAB573BC8A98E1DD96AFB4E76A6D7E957472525AA17C69222B1F2BD51151392E113E2442C178AAB257B6A69153B1EC5E4F6F62FDE5FC3CB931CC5A1869A8D1683554B6199988EF2B2752EA9A7B2DD24A6AAB42CAB8CB64554C3D31D59416DD592D450F4F6ED3B52B4EAABC6356F15F51F06EBFB2D5C2D4B951488FC6775CC491117BBFDA1AF72DA1D2C54AE82D14922BB186BA4446B1BD8B84CE78FA8D78C56988AF27EEEB5B5F8E26D97DA2397CA2223741B51543EAAF95751240FA7748EDEE8A44C39BC3AFE3E2734FB544AFA89E49A672BE591DBCF72F5A9F3C1D4AC6D110F179AFE25ED6F59790012C4000000008A800F24FAA4000000000000000000000000000000000005800054000580005800000005400120002150001200094800090000000000000000000000000000000077ED5E8F87C7E26D9A96AF47C3E3F136CF4F83E1D7E50F9A78EFDE5A8FCF6FA80032B920000F4614C9850960C9801564C80580C29930A40C000AA59064043C8009480000000000000003D00025E40010000B0000000000000000AA193201000003C80091E8005800007900048000000022A003C83EA900000000000000000000000000000000000160000000000016000000000004A0000400000000000090000000000000000000000000000000077ED5E8F87C7E26D9A96AF47C3E3F136CF4F83E1D7E50F9A78EFDE5A8FCF6FA80032B920000F400097900040002C00000002A0000000000000000000000003D000240001E4005800000000000000010000A800000000000B000000000000000008A800F20FAA400000000000000000000000000000000000580000000000058000000000012800000000000000000000000000000000000000000000000077ED5E8F87C7E26D9A96AF47C3E3F136CF4F83E1D7E50F9A78EFDE5A8FCF6FA80032B920000F40009000079001600000001540000000000000000000000003D000240001E40058000000000000000000055000000000000B000000000000000008A800F20FAA400000000000000000000000000000000000580000000000058000000000012800000000000000000000000000000000000000000000000077ED5E8F87C7E26D9A96AF47C3E3F136CF4F83E1D7E50F9A78EFDE5A8FCF6FA80032B920000F40009000079001600000001540000000000000000000000003D000240001E40058000000000000000000055000000000000B000000000000000008A800F20FAA400000000000000000000000000000000000580000000000058000000000012800000000000000000000000000000000000000000000000077ED5E8F87C7E26D9A96AF47C3E3F136CF4F83E1D7E50F9A78EFDE5A8FCF6FA80032B920000F40009000079001600000001540000000000000000000000003D000240001E40058000000000000000000055000000000000B000000000000000008A800F20FAA400000000000000000000000000000000000580000000000058000000000012800000000000000000000000000000000000000000000000077ED5E8F87C7E26D9A96AF47C3E3F136CF4F83E1D7E50F9A78EFDE5A8FCF6FA80032B920000F40009000079001600000001540000000000000000000000003D000240001E40058000000000000000000055000000000000B000000000000000008A800F20FAA400000000000000000000000000000000000580000000000058000000000012800000000000000000000000000000000000000000000000077ED5E8F87C7E26D9A96AF47C3E3F136CF4F83E1D7E50F9A78EFDE5A8FCF6FA80032B920000F40009000079001600000001540000000000000000000000003D000240001E40058000000000000000000055000000000000B000000000000000008A800F20FAA400000000000000000000000000000000000580000000000058000000000012800000000000000000000000000000000000000000000000077ED5E8F87C7E26D9A96AF47C3E3F136CF4F83E1D7E50F9A78EFDE5A8FCF6FA80032B920000F40009000079001600000001540000000000000000000000003D000240001E40058000000000000000000055000000000000B000000000000000008A800F20FAA400000000000000000000000000000000000580000000000058000000000012800000000000000000000000000000000000000000000000077ED5E8F87C7E26D9A96AF47C3E3F136CF4F83E1D7E50F9A78EFDE5A8FCF6FA80032B920000F40009000079001600000001540000000000000000000000003D000240001E40058000000000000000000055000000000000B00000000000000000FFFD9, '1', '2021-03-13 13:10:28', '1', '2021-03-13 13:10:28', b'0'); +INSERT INTO `inf_file` VALUES ('5e8609290e915c4fa8b08e67.jpg', 'jpg', 0xFFD8FFE10DFA4578696600004D4D002A000000080007011200030000000100010000011A00050000000100000062011B0005000000010000006A012800030000000100020000013100020000001F000000720132000200000014000000918769000400000001000000A8000000D4000AFC8000002710000AFC800000271041646F62652050686F746F73686F702032312E30202857696E646F77732900323032303A30343A30322031373A32343A3135000000000003A001000300000001FFFF0000A00200040000000100000320A003000400000001000001C20000000000000006010300030000000100060000011A00050000000100000122011B0005000000010000012A012800030000000100020000020100040000000100000132020200040000000100000CC00000000000000048000000010000004800000001FFD8FFED000C41646F62655F434D0002FFEE000E41646F626500648000000001FFDB0084000C08080809080C09090C110B0A0B11150F0C0C0F1518131315131318110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C010D0B0B0D0E0D100E0E10140E0E0E14140E0E0E0E14110C0C0C0C0C11110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0CFFC0001108005A00A003012200021101031101FFDD0004000AFFC4013F0000010501010101010100000000000000030001020405060708090A0B0100010501010101010100000000000000010002030405060708090A0B1000010401030204020507060805030C33010002110304211231054151611322718132061491A1B14223241552C16233347282D14307259253F0E1F163733516A2B283264493546445C2A3743617D255E265F2B384C3D375E3F3462794A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F637475767778797A7B7C7D7E7F711000202010204040304050607070605350100021103213112044151617122130532819114A1B14223C152D1F0332462E1728292435315637334F1250616A2B283072635C2D2449354A317644555367465E2F2B384C3D375E3F34694A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F62737475767778797A7B7C7FFDA000C03010002110311003F00F544924925293A64E929F18FADE19FF3ABAA48DC4DEDE49FF454ACD369FB3380796ED036EA74F26A9FD78C97B3EB8F55606C8F581FFC0A958D6E43DC037807B28C86505BB87D62EE9F91F68AEC7BEE6B5CC6BDC6480F11A4A1FA7D77AB07DD8F8F93934564FAAF631CEADB03D477AD77F315ED67BFF48F540820C1D7CD751F55053FB1FAB6EA8E4BFD3DA69AF09B90F26CBB0598CCFB45EFF45EFBED67E830BD1B1FFA1B327DFE95753D002D0644079DB3A5755AB26AC4B316DAF26FD68ADE20D83FE05C7F4767F61FF4FF0047FCE223BA3758AADF4DF876B2D01C4B4B44B431AFB2DF536BBF44E6574DCEDB6FBFF4562EC7AD136756E977D8DFB3D565B6DA2CC3763D4E190FC7AB1ECC4C6C8B1EFA6DB30EDC5F4F333A8F52CFB55946162D5F6BA2947EAB4B68CAEA05D6E43AFC6C4B9B6E28A7631BA6536BEA18F5E55F6751CFC1DFD532EAF53D4F4E8C965D93956E374FFB2E3D6FA0B6DE4BA6617D6B654DCBE9D8B9FE9583755763D76ED70F169AFD962EC3A17D64EA76D96616774CCAB32714B5B9365143DEF66EFA1F6BC6637757B9BEF66CFA7FE8D65F45774BA0FD5DC3774F77AEEEA15E583F68792CF55D87898D9AF69C766E6E6BB1ECCAA719DFF69ABAECF53D3CA62E7F17071B3FA8E3518782E155F6D6D6E2073AF7866E69CAFD27A75D9FCDB6EB5FECFD13130C227AAF8CE4351B3E96329ADCE6B032C60225A2EA6DAC3B69F7B7F4F535AF757BBF495AF37EB34578DD5F3E8ADBE9D75E4581958101AD277358D6FEEED77B56C3BA8DF4F5CC91439ADAF1AFC8A716AAC06D2CA197595B71E8A2ADB4D753FD365967A6DF52EB3F4F6BEDB150FACEFF00B47557E735A5ACCA6B09932058C6B6BB5AD77F65088119505D3265004F47296AFD52FF00C55748FF00C34DFF00A97AC995ADF54BFF00155D23FF000D37FEA5EA4627DE13274C8AD524924929FFD0F544924925293A64E929F09FAEEC9FAE1D59DFF0CD1FF8152B01DCF9ADEFAF0E23EB87578ED734C7FD6A9584E1EE07B4C7CD3482B82C0CB869F246A6B0F3B5C246920F1F728B29703C401C9F056B1D90F1A73AFC934AE0750D9C3C5ADD680D6001C35811C15D0E374AC79935336EEDE06D1F4A3E971F4952E958FEF693C49D7E2B7EB969E254323AB6B18EAD46F49C7F730D4DDAFF0073840824FD29597D6FA5D54EE2D1B77341606E9A8F6ED11FC95D334FB493A203B1ABBF21B65A37067D169E1464906ED9B844855393D1FA1399563DD60DAF68690D8D23F74FEEFB5687D60E8746474DB2DA5B16D23D481DE072B535EDC4A85969D0763A1F81D101908365470C786A9F2EDC473F72D5FAA07FECAFA47FE1A67E47ACFCBA855977560406BDC00F20568FD516FF00D95F473FF7699FF52F5781D9CC23523B3EF6993A6450A49249253FFFD1F544924925293A64E929F05FAF263EBA756F036B47FE05542C62241EFBB50B63EBE83FF3C7AAB876B87FE7AA56383EE1E1FEBEE40AE4AE2E207808251702C7D9696BB9747E2546BA9CF7348D7C63556FA7623EBCA24F0D2224729922297C626DE9B0A88EC0761F2F6AD4656EDBA842C0A9A183C5690600DD79EEA06E44506ABC32B682F78682A01F48FA37327CCA3BA9A277D906741BB80AA64D9D348F4CBEA6DA4C0687B43893DB6EE4C902BC16C8C80E86348772496F1082FCEC4F53F4B686469E253E3E2399510C044F8F654EDCBE97D3AD1F6C7B2BBEC05CDDE1C4C03B67DAD7353575E9ABC8F5EA5B5758CAD9AD56BCDB518896BFDDFF00548FF545B1F5ABA47FE1A67FD4BD5BFADF6D195660E650439B657657BDA080763B737E906FD1F5551FAA766EFADDD1C0ED94CFC8E57212B01CDC91A9C878BEF8993A65231A92492494FF00FFD2F544924925293A64E929F07FAF4377D6EEADFF001EDFFCF54ACEE8F875E7754A31ED1348DCFB478B180D85BFDA5A5F5E04FD6DEAE3FE1C7FE7AA5677D5BCAAF1FAC62BEC23D379752F9FF84696367FB4992D8D2F85710BEEF656F4FC73B5B93815D41803BD7C56ECF4C1FA2DBC7E77F2DC8195D2D941DF4925BCEBE20AD5B711F71BADCCB36E331D3B0BA1A770F6EF8F759FB9B10290CB2921ED2DD7DAC773B7F35D0AB027BB7A518F64BD39C7609E56A31C0F3ACAC9A5BE9FB55EA9F1051486593D2B032B5C8C7AEE3DB7B7700818DF57FA7E3DA2DAF1A8AC8320B2B00C8F376E5A55BC10028DD76D6B9BE4A39DD32C00ECCBD4AC360113DD0ACC7ADC009DBBF50476542C3D4FD3230D958B5D1165B25AD13EF3B1BF49C9E9ABABB2E0E7BD9E8B87BE352E70FE49FA09A9156D6FAE5D2DD6FD5E7E4077AAFC1B1B7B4F70C77E86F1FE6B98FF00FADAE33EA79FFB2EE91FF8699F91CBD22EB59753762BC82CBEB7D4E1C887B4B3FEFCBCD7EA583FF3ABA313CFDA980FDCE56701B15D9A5CDC6A57FBCFD04A2A4A2AC351749249253FFFD3F544924925293A64E929F06FAF13FF003BFABFFC70FF00CF74AC0C5A9F6BEC63352C63AC81FF000637BB5FEAAE8BEB9D2FBFEB97576B4682E6973DDA35A3D3AB955FA1E1D15F556398F3634D193EA480266B737D8D4384D13D14271E211BF53B9D07EB6E364D2DC7EA4F155EC01A2D78FD1D9FBAE738FF00376AE86C6B1CCF546C1A4EF90411CFD29DABCE31F01ECC9BF19F040D58EEC44E85AB5717A65C5A186D2299135C983FC90D55E7117A3771E43C3A8D5E9F7B79699F056B1DEC70826216457B9839D111993E9EB29ACA24EDFA80409F821DF6082663B954075105B13D92AAD16BE5CE803523C5327AE8BC11BB62EEA36D5596D741B081A1710D6FDFAB952C6EABD6ACBC0BE8AABA5C61D1634B88EDB55CB286E437520055D9D3E8C571BDD74EC05D06001085689120CF2F26BC5C5BF2DE76BA8ADCE209FCE03D8CFF003F6AE2FEA5B09FAD5D1FCB25B27E4E5B3D55CECF2EA812DA9C7D4DAE05A5DFE8DFEF8DCCFCF46FAA5D2998FD7B02C277385E3F2394D8FD3E64B5739E33A6D10FB028A928AB2D35D2492494FF00FFD4F544924925293A64E929F1DFACEDFF00B24EB193635CDC4A725AD73F69D9EA3AAA6373FF003ACFE42CBC7E8D93D7F2ECCBC1B5B895E3868B6F735CC68304CB760DDF41BFA47ADEFF0018DFF8A0C4FA3FCE5DFCC7F52BFE77FEEF7FEEB7A6B56AFF00C478FE6FFA3B3E87D1FA2CFE95FCBFFB91FC8F553A5C7C236A598FDBE296F77ABCF3306FFB0FA79370BEBACFACCC86506BB1A5C1BFA11BEE6EF764B5F47E83D1DFBEEA7F3DEA66814BFD116B4E4080EC7782CB8388935FB3D6ABD467F5DEB62EFE9479FE7EFF00E6B8E723FE4EFF00CD97FA1FF805CBFE60FA1F487F3BFCDFD21FCEFF0027FD2AAD2E2BE8DE87B75BCFFABC207ED7571DCEC88143D8E71240638ED7123E9358EFE6EC43C86E5D409B68786FEF012DFF0039B2B773BF9ABBFE4BFE6AAFE6BF9CE7FC07F23FEE27F2D407F363E9FD11F4BE97F6FF00EFC992ABD131E2AD5E6DB90D2ED343DC23D7925BA83007753EABF4FF00C17CBE925D17FE50C4FA1FCF33F9CFA3CFFAEC4CD1935AD1D0651955E39C9CEB3EC58AD05CE7B9A5D66D1F9C31D9EFDBBBD9FA445E82FC6EA37BC574DB752DDAD7E45CE643647AAE2719BBBE9D6DD8CFD25B6FFA5F4D56FADDFD1B2BF9FF00E98DFA7C7D13FCFF00FC0FFDC7FF0087F595CFA93FF22BB8FA777D1E7E8D7FCE7FDF7FE0D3870AD971D6BB3A9D4F0CE660D95B768B1CC2F617090D73C86D6E688FE73D3DFE9FFC26C5CEF4CCAA717EBBD5D2DAC706D394C635D21DA966F732CDA7F95F4D7517FF003C3FA5FD3ABF98FE6F86FD2FE4FF00DFD55BBFF141D2BFA1FF0049FF000BFD33E8DBF4BFF44A78DC5B19D8D767B851524CAC3554924924A7FFD9FFED160050686F746F73686F7020332E30003842494D0425000000000010000000000000000000000000000000003842494D043A0000000000D7000000100000000100000000000B7072696E744F7574707574000000050000000050737453626F6F6C0100000000496E7465656E756D00000000496E746500000000496D67200000000F7072696E745369787465656E426974626F6F6C000000000B7072696E7465724E616D65544558540000000100000000000F7072696E7450726F6F6653657475704F626A6300000005682168378BBE7F6E00000000000A70726F6F6653657475700000000100000000426C746E656E756D0000000C6275696C74696E50726F6F660000000970726F6F66434D594B003842494D043B00000000022D00000010000000010000000000127072696E744F75747075744F7074696F6E7300000017000000004370746E626F6F6C0000000000436C6272626F6F6C00000000005267734D626F6F6C000000000043726E43626F6F6C0000000000436E7443626F6F6C00000000004C626C73626F6F6C00000000004E677476626F6F6C0000000000456D6C44626F6F6C0000000000496E7472626F6F6C000000000042636B674F626A630000000100000000000052474243000000030000000052642020646F7562406FE000000000000000000047726E20646F7562406FE0000000000000000000426C2020646F7562406FE000000000000000000042726454556E744623526C74000000000000000000000000426C6420556E744623526C7400000000000000000000000052736C74556E74462350786C40520000000000000000000A766563746F7244617461626F6F6C010000000050675073656E756D00000000506750730000000050675043000000004C656674556E744623526C74000000000000000000000000546F7020556E744623526C7400000000000000000000000053636C20556E74462350726340590000000000000000001063726F705768656E5072696E74696E67626F6F6C000000000E63726F7052656374426F74746F6D6C6F6E67000000000000000C63726F70526563744C6566746C6F6E67000000000000000D63726F705265637452696768746C6F6E67000000000000000B63726F7052656374546F706C6F6E6700000000003842494D03ED000000000010004800000001000200480000000100023842494D042600000000000E000000000000000000003F8000003842494D040D0000000000040000005A3842494D04190000000000040000001E3842494D03F3000000000009000000000000000001003842494D271000000000000A000100000000000000023842494D03F5000000000048002F66660001006C66660006000000000001002F6666000100A1999A0006000000000001003200000001005A00000006000000000001003500000001002D000000060000000000013842494D03F80000000000700000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800003842494D040000000000000200093842494D040200000000001400000000000000000000000000000000000000003842494D043000000000000A010101010101010101013842494D042D00000000000600010000000A3842494D0408000000000010000000010000024000000240000000003842494D041E000000000004000000003842494D041A00000000033F000000060000000000000000000001C20000032000000005672A68079898002D0034000000010000000000000000000000000000000000000001000000000000000000000320000001C200000000000000000000000000000000010000000000000000000000000000000000000010000000010000000000006E756C6C0000000200000006626F756E64734F626A6300000001000000000000526374310000000400000000546F70206C6F6E6700000000000000004C6566746C6F6E67000000000000000042746F6D6C6F6E67000001C200000000526768746C6F6E670000032000000006736C69636573566C4C73000000014F626A6300000001000000000005736C6963650000001200000007736C69636549446C6F6E67000000000000000767726F757049446C6F6E6700000000000000066F726967696E656E756D0000000C45536C6963654F726967696E0000000D6175746F47656E6572617465640000000054797065656E756D0000000A45536C6963655479706500000000496D672000000006626F756E64734F626A6300000001000000000000526374310000000400000000546F70206C6F6E6700000000000000004C6566746C6F6E67000000000000000042746F6D6C6F6E67000001C200000000526768746C6F6E67000003200000000375726C54455854000000010000000000006E756C6C54455854000000010000000000004D7367655445585400000001000000000006616C74546167544558540000000100000000000E63656C6C54657874497348544D4C626F6F6C010000000863656C6C546578745445585400000001000000000009686F727A416C69676E656E756D0000000F45536C696365486F727A416C69676E0000000764656661756C740000000976657274416C69676E656E756D0000000F45536C69636556657274416C69676E0000000764656661756C740000000B6267436F6C6F7254797065656E756D0000001145536C6963654247436F6C6F7254797065000000004E6F6E6500000009746F704F75747365746C6F6E67000000000000000A6C6566744F75747365746C6F6E67000000000000000C626F74746F6D4F75747365746C6F6E67000000000000000B72696768744F75747365746C6F6E6700000000003842494D042800000000000C000000023FF00000000000003842494D041100000000000101003842494D04140000000000040000000A3842494D040C000000000CDC00000001000000A00000005A000001E00000A8C000000CC000180001FFD8FFED000C41646F62655F434D0002FFEE000E41646F626500648000000001FFDB0084000C08080809080C09090C110B0A0B11150F0C0C0F1518131315131318110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C010D0B0B0D0E0D100E0E10140E0E0E14140E0E0E0E14110C0C0C0C0C11110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0CFFC0001108005A00A003012200021101031101FFDD0004000AFFC4013F0000010501010101010100000000000000030001020405060708090A0B0100010501010101010100000000000000010002030405060708090A0B1000010401030204020507060805030C33010002110304211231054151611322718132061491A1B14223241552C16233347282D14307259253F0E1F163733516A2B283264493546445C2A3743617D255E265F2B384C3D375E3F3462794A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F637475767778797A7B7C7D7E7F711000202010204040304050607070605350100021103213112044151617122130532819114A1B14223C152D1F0332462E1728292435315637334F1250616A2B283072635C2D2449354A317644555367465E2F2B384C3D375E3F34694A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F62737475767778797A7B7C7FFDA000C03010002110311003F00F544924925293A64E929F18FADE19FF3ABAA48DC4DEDE49FF454ACD369FB3380796ED036EA74F26A9FD78C97B3EB8F55606C8F581FFC0A958D6E43DC037807B28C86505BB87D62EE9F91F68AEC7BEE6B5CC6BDC6480F11A4A1FA7D77AB07DD8F8F93934564FAAF631CEADB03D477AD77F315ED67BFF48F540820C1D7CD751F55053FB1FAB6EA8E4BFD3DA69AF09B90F26CBB0598CCFB45EFF45EFBED67E830BD1B1FFA1B327DFE95753D002D0644079DB3A5755AB26AC4B316DAF26FD68ADE20D83FE05C7F4767F61FF4FF0047FCE223BA3758AADF4DF876B2D01C4B4B44B431AFB2DF536BBF44E6574DCEDB6FBFF4562EC7AD136756E977D8DFB3D565B6DA2CC3763D4E190FC7AB1ECC4C6C8B1EFA6DB30EDC5F4F333A8F52CFB55946162D5F6BA2947EAB4B68CAEA05D6E43AFC6C4B9B6E28A7631BA6536BEA18F5E55F6751CFC1DFD532EAF53D4F4E8C965D93956E374FFB2E3D6FA0B6DE4BA6617D6B654DCBE9D8B9FE9583755763D76ED70F169AFD962EC3A17D64EA76D96616774CCAB32714B5B9365143DEF66EFA1F6BC6637757B9BEF66CFA7FE8D65F45774BA0FD5DC3774F77AEEEA15E583F68792CF55D87898D9AF69C766E6E6BB1ECCAA719DFF69ABAECF53D3CA62E7F17071B3FA8E3518782E155F6D6D6E2073AF7866E69CAFD27A75D9FCDB6EB5FECFD13130C227AAF8CE4351B3E96329ADCE6B032C60225A2EA6DAC3B69F7B7F4F535AF757BBF495AF37EB34578DD5F3E8ADBE9D75E4581958101AD277358D6FEEED77B56C3BA8DF4F5CC91439ADAF1AFC8A716AAC06D2CA197595B71E8A2ADB4D753FD365967A6DF52EB3F4F6BEDB150FACEFF00B47557E735A5ACCA6B09932058C6B6BB5AD77F65088119505D3265004F47296AFD52FF00C55748FF00C34DFF00A97AC995ADF54BFF00155D23FF000D37FEA5EA4627DE13274C8AD524924929FFD0F544924925293A64E929F09FAEEC9FAE1D59DFF0CD1FF8152B01DCF9ADEFAF0E23EB87578ED734C7FD6A9584E1EE07B4C7CD3482B82C0CB869F246A6B0F3B5C246920F1F728B29703C401C9F056B1D90F1A73AFC934AE0750D9C3C5ADD680D6001C35811C15D0E374AC79935336EEDE06D1F4A3E971F4952E958FEF693C49D7E2B7EB969E254323AB6B18EAD46F49C7F730D4DDAFF0073840824FD29597D6FA5D54EE2D1B77341606E9A8F6ED11FC95D334FB493A203B1ABBF21B65A37067D169E1464906ED9B844855393D1FA1399563DD60DAF68690D8D23F74FEEFB5687D60E8746474DB2DA5B16D23D481DE072B535EDC4A85969D0763A1F81D101908365470C786A9F2EDC473F72D5FAA07FECAFA47FE1A67E47ACFCBA855977560406BDC00F20568FD516FF00D95F473FF7699FF52F5781D9CC23523B3EF6993A6450A49249253FFFD1F544924925293A64E929F05FAF263EBA756F036B47FE05542C62241EFBB50B63EBE83FF3C7AAB876B87FE7AA56383EE1E1FEBEE40AE4AE2E207808251702C7D9696BB9747E2546BA9CF7348D7C63556FA7623EBCA24F0D2224729922297C626DE9B0A88EC0761F2F6AD4656EDBA842C0A9A183C5690600DD79EEA06E44506ABC32B682F78682A01F48FA37327CCA3BA9A277D906741BB80AA64D9D348F4CBEA6DA4C0687B43893DB6EE4C902BC16C8C80E86348772496F1082FCEC4F53F4B686469E253E3E2399510C044F8F654EDCBE97D3AD1F6C7B2BBEC05CDDE1C4C03B67DAD7353575E9ABC8F5EA5B5758CAD9AD56BCDB518896BFDDFF00548FF545B1F5ABA47FE1A67FD4BD5BFADF6D195660E650439B657657BDA080763B737E906FD1F5551FAA766EFADDD1C0ED94CFC8E57212B01CDC91A9C878BEF8993A65231A92492494FF00FFD2F544924925293A64E929F07FAF4377D6EEADFF001EDFFCF54ACEE8F875E7754A31ED1348DCFB478B180D85BFDA5A5F5E04FD6DEAE3FE1C7FE7AA5677D5BCAAF1FAC62BEC23D379752F9FF84696367FB4992D8D2F85710BEEF656F4FC73B5B93815D41803BD7C56ECF4C1FA2DBC7E77F2DC8195D2D941DF4925BCEBE20AD5B711F71BADCCB36E331D3B0BA1A770F6EF8F759FB9B10290CB2921ED2DD7DAC773B7F35D0AB027BB7A518F64BD39C7609E56A31C0F3ACAC9A5BE9FB55EA9F1051486593D2B032B5C8C7AEE3DB7B7700818DF57FA7E3DA2DAF1A8AC8320B2B00C8F376E5A55BC10028DD76D6B9BE4A39DD32C00ECCBD4AC360113DD0ACC7ADC009DBBF50476542C3D4FD3230D958B5D1165B25AD13EF3B1BF49C9E9ABABB2E0E7BD9E8B87BE352E70FE49FA09A9156D6FAE5D2DD6FD5E7E4077AAFC1B1B7B4F70C77E86F1FE6B98FF00FADAE33EA79FFB2EE91FF8699F91CBD22EB59753762BC82CBEB7D4E1C887B4B3FEFCBCD7EA583FF3ABA313CFDA980FDCE56701B15D9A5CDC6A57FBCFD04A2A4A2AC351749249253FFFD3F544924925293A64E929F06FAF13FF003BFABFFC70FF00CF74AC0C5A9F6BEC63352C63AC81FF000637BB5FEAAE8BEB9D2FBFEB97576B4682E6973DDA35A3D3AB955FA1E1D15F556398F3634D193EA480266B737D8D4384D13D14271E211BF53B9D07EB6E364D2DC7EA4F155EC01A2D78FD1D9FBAE738FF00376AE86C6B1CCF546C1A4EF90411CFD29DABCE31F01ECC9BF19F040D58EEC44E85AB5717A65C5A186D2299135C983FC90D55E7117A3771E43C3A8D5E9F7B79699F056B1DEC70826216457B9839D111993E9EB29ACA24EDFA80409F821DF6082663B954075105B13D92AAD16BE5CE803523C5327AE8BC11BB62EEA36D5596D741B081A1710D6FDFAB952C6EABD6ACBC0BE8AABA5C61D1634B88EDB55CB286E437520055D9D3E8C571BDD74EC05D06001085689120CF2F26BC5C5BF2DE76BA8ADCE209FCE03D8CFF003F6AE2FEA5B09FAD5D1FCB25B27E4E5B3D55CECF2EA812DA9C7D4DAE05A5DFE8DFEF8DCCFCF46FAA5D2998FD7B02C277385E3F2394D8FD3E64B5739E33A6D10FB028A928AB2D35D2492494FF00FFD4F544924925293A64E929F1DFACEDFF00B24EB193635CDC4A725AD73F69D9EA3AAA6373FF003ACFE42CBC7E8D93D7F2ECCBC1B5B895E3868B6F735CC68304CB760DDF41BFA47ADEFF0018DFF8A0C4FA3FCE5DFCC7F52BFE77FEEF7FEEB7A6B56AFF00C478FE6FFA3B3E87D1FA2CFE95FCBFFB91FC8F553A5C7C236A598FDBE296F77ABCF3306FFB0FA79370BEBACFACCC86506BB1A5C1BFA11BEE6EF764B5F47E83D1DFBEEA7F3DEA66814BFD116B4E4080EC7782CB8388935FB3D6ABD467F5DEB62EFE9479FE7EFF00E6B8E723FE4EFF00CD97FA1FF805CBFE60FA1F487F3BFCDFD21FCEFF0027FD2AAD2E2BE8DE87B75BCFFABC207ED7571DCEC88143D8E71240638ED7123E9358EFE6EC43C86E5D409B68786FEF012DFF0039B2B773BF9ABBFE4BFE6AAFE6BF9CE7FC07F23FEE27F2D407F363E9FD11F4BE97F6FF00EFC992ABD131E2AD5E6DB90D2ED343DC23D7925BA83007753EABF4FF00C17CBE925D17FE50C4FA1FCF33F9CFA3CFFAEC4CD1935AD1D0651955E39C9CEB3EC58AD05CE7B9A5D66D1F9C31D9EFDBBBD9FA445E82FC6EA37BC574DB752DDAD7E45CE643647AAE2719BBBE9D6DD8CFD25B6FFA5F4D56FADDFD1B2BF9FF00E98DFA7C7D13FCFF00FC0FFDC7FF0087F595CFA93FF22BB8FA777D1E7E8D7FCE7FDF7FE0D3870AD971D6BB3A9D4F0CE660D95B768B1CC2F617090D73C86D6E688FE73D3DFE9FFC26C5CEF4CCAA717EBBD5D2DAC706D394C635D21DA966F732CDA7F95F4D7517FF003C3FA5FD3ABF98FE6F86FD2FE4FF00DFD55BBFF141D2BFA1FF0049FF000BFD33E8DBF4BFF44A78DC5B19D8D767B851524CAC3554924924A7FFD93842494D042100000000005700000001010000000F00410064006F00620065002000500068006F0074006F00730068006F00700000001400410064006F00620065002000500068006F0074006F00730068006F00700020003200300032003000000001003842494D04060000000000070006000000010100FFE10DD2687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F003C3F787061636B657420626567696E3D22EFBBBF222069643D2257354D304D7043656869487A7265537A4E54637A6B633964223F3E203C783A786D706D65746120786D6C6E733A783D2261646F62653A6E733A6D6574612F2220783A786D70746B3D2241646F626520584D5020436F726520352E362D633134382037392E3136343033362C20323031392F30382F31332D30313A30363A35372020202020202020223E203C7264663A52444620786D6C6E733A7264663D22687474703A2F2F7777772E77332E6F72672F313939392F30322F32322D7264662D73796E7461782D6E7323223E203C7264663A4465736372697074696F6E207264663A61626F75743D222220786D6C6E733A786D703D22687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F2220786D6C6E733A786D704D4D3D22687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F6D6D2F2220786D6C6E733A73744576743D22687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F73547970652F5265736F757263654576656E74232220786D6C6E733A64633D22687474703A2F2F7075726C2E6F72672F64632F656C656D656E74732F312E312F2220786D6C6E733A70686F746F73686F703D22687474703A2F2F6E732E61646F62652E636F6D2F70686F746F73686F702F312E302F2220786D703A43726561746F72546F6F6C3D2241646F62652050686F746F73686F702032312E30202857696E646F7773292220786D703A437265617465446174653D22323032302D30342D30325431373A32343A31352B30383A30302220786D703A4D65746164617461446174653D22323032302D30342D30325431373A32343A31352B30383A30302220786D703A4D6F64696679446174653D22323032302D30342D30325431373A32343A31352B30383A30302220786D704D4D3A496E7374616E636549443D22786D702E6969643A34656266653730652D643236652D623834312D613962612D3232623834663439646366312220786D704D4D3A446F63756D656E7449443D2261646F62653A646F6369643A70686F746F73686F703A64633333616566382D343164372D343134372D626566652D3133623366363839326632642220786D704D4D3A4F726967696E616C446F63756D656E7449443D22786D702E6469643A39633734393932312D633861652D393634382D613065372D613762366131393131336266222064633A666F726D61743D22696D6167652F6A706567222070686F746F73686F703A436F6C6F724D6F64653D2233223E203C786D704D4D3A486973746F72793E203C7264663A5365713E203C7264663A6C692073744576743A616374696F6E3D2263726561746564222073744576743A696E7374616E636549443D22786D702E6969643A39633734393932312D633861652D393634382D613065372D613762366131393131336266222073744576743A7768656E3D22323032302D30342D30325431373A32343A31352B30383A3030222073744576743A736F6674776172654167656E743D2241646F62652050686F746F73686F702032312E30202857696E646F777329222F3E203C7264663A6C692073744576743A616374696F6E3D227361766564222073744576743A696E7374616E636549443D22786D702E6969643A34656266653730652D643236652D623834312D613962612D323262383466343964636631222073744576743A7768656E3D22323032302D30342D30325431373A32343A31352B30383A3030222073744576743A736F6674776172654167656E743D2241646F62652050686F746F73686F702032312E30202857696E646F777329222073744576743A6368616E6765643D222F222F3E203C2F7264663A5365713E203C2F786D704D4D3A486973746F72793E203C2F7264663A4465736372697074696F6E3E203C2F7264663A5244463E203C2F783A786D706D6574613E2020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020203C3F787061636B657420656E643D2277223F3EFFEE000E41646F626500644000000001FFDB0084000202020202020202020203020202030403020203040504040404040506050505050505060607070807070609090A0A09090C0C0C0C0C0C0C0C0C0C0C0C0C0C0C01030303050405090606090D0A090A0D0F0E0E0E0E0F0F0C0C0C0C0C0F0F0C0C0C0C0C0C0F0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0CFFC000110801C2032003011100021101031101FFDD00040064FFC401A20000000701010101010000000000000000040503020601000708090A0B0100020203010101010100000000000000010002030405060708090A0B1000020103030204020607030402060273010203110400052112314151061361227181143291A10715B14223C152D1E1331662F0247282F12543345392A2B26373C235442793A3B33617546474C3D2E2082683090A181984944546A4B456D355281AF2E3F3C4D4E4F465758595A5B5C5D5E5F566768696A6B6C6D6E6F637475767778797A7B7C7D7E7F738485868788898A8B8C8D8E8F82939495969798999A9B9C9D9E9F92A3A4A5A6A7A8A9AAABACADAEAFA110002020102030505040506040803036D0100021103042112314105511361220671819132A1B1F014C1D1E1234215526272F1332434438216925325A263B2C20773D235E2448317549308090A18192636451A2764745537F2A3B3C32829D3E3F38494A4B4C4D4E4F465758595A5B5C5D5E5F5465666768696A6B6C6D6E6F6475767778797A7B7C7D7E7F738485868788898A8B8C8D8E8F839495969798999A9B9C9D9E9F92A3A4A5A6A7A8A9AAABACADAEAFAFFDA000C03010002110311003F00FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8E35D5BCC737C2D3C9BFBFF666A389DAABAAEB92D09964A9F7C78D5CFA56B736CD2C94EF538F1AA82F96F534916762EE10D78F8E112B54DEDED35BD3EEA09B45B992D25620CA14D3265239BD8EDBCD5E6BB286DA2B8BE79A375FDFA924D4D3205B0232DB5BD4EF199998E5459C58F6A9ABEA16F71CB9114EF9125B120B8F3A5CDA026573418AA583F34D616346AB5298A09A424FF98F2DD0F80D2BE18691C4925DEBD7DAB05B61522434CAF2C51C6FBA7FE7122F60D17CBBA84175B333D4D7E6329E172714DF5E6AFE7ED22CE1043865814FAAB5F118F0B9A26F8C7F30BF306DEE7549AE2C8889391A95FA71E1499BC4758F3D5037A77ACDEA0AB47CBAE4E30713366E12F35D43F302DA14901531CE7ECCA7C72C11718E7796EAFE6ED57516663AA12A0515431E99608B8F2D430D9A677E524F3FAA4F5A9AE5822D0750978B98B8D140D8E4C63B63F9843BDC13F64532431B1F1AD0C5DB916EE72D8E362656ACB7457BE4BC3606368A13F2553F7E5321BB5F0EEDD0B6F916C0141ADD0558F5385BE2690CC5536E98B682985A4527312ABF1A6F5C9F44527A6F5255114979C48EC4E424136EE70A2D2593E54CA2516432D265A76A6F6B5FAACACBE041E995F0B319DE9DE5BFCCBF37E8C54E9FE619A075E8A1C8FE18699F88FA4FC9FF00F395FE6ED08C0BACAB6A71A302D2BFC5B0F98C890D8323EA6F247FCE5769BE63B8449ECD62F50F5D875AE564360C8FA2EC3CC5A46B32DADF898514F2F4EBD72B21BF14F74FF4D7626F1F53F8A192BF5207B785320439FC4115A4693711DBDF5F5F12CE8C0D913D857B640865CD910BAFAE46A41FEE46F95909115A6CE4BB46B98FAC20D7214C643662170CF7323C858AFA27E2FA314452DD56DE2D4F4C9F94A6B1827AF862DF163FA65C8FD1C2C11EADCA80D716F09EC33DE42A6D1472A2824F861069AB502C331D3BCB3E55F3C412795FCE9A746D05DC6CB0CEEBBD4A9A6FF3399784BA4D445F8C9FF3931F9253FE507E61EA96B145E9F97B57919B426A6C402C4D3AF866C605D3E41BBE5BAFA5230FC32DB583B90724F865D8B930CC5BCB5A16375C55AC5578E98AB78AA8BFDA38AAA2F7C55A3D7156B155EADD315560D8ABFADEFF009C6EFF00D677FC84FF00CD73E56FFBA45AE5A39349E6F68C28762AEC55D8AB4DD315598ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD0FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF917B754FE45FBB34FC2ED532A855A803C71E1551370C0E3C2AADF5A26361ED863155D0DC52840DFC72C2A39A6893B3D0124F8D7205B423E172F227A6C401D86D9516714AB5F0D52FD80A139193607916A21A49641526A722125825DE9F335C1F4C75ED96C434929D699A6C96C434DD0F639708B519B2F86D62F8446DC7EB1F0971B52990CB0D9871BE87FCB0F341D3236D0D5B8C6E3E2981A1FBF28E17231CD35F3479E9A06B8D356666080FC7CAA4D6BDF0F0B9919BE7FD5BCC7246F2B3BB10C4EC4E3C2994DE7979AD87666AFDAE9921171331B2C0F56D4F996EFF003CB045C5931D8EF2A483F765822E3C93012875EBB1C988B4108794A034D865910C68BA38D5CFDACB0048895EF171AE4C36479A0A470A7A6580362A4738A2F877CC49C775A4724E0D32149016B354935AD71A4A1DD6BD77C7853689173C4000D282981B835EBA75A0AF8D30316FEB00F53CBE780C5810510B7617A1A7CB21C2C68DA6FA7EA011872EBE39021BC16463520EBC791A11BF8640867128FB5D46EECDD26B2B9642A6A021A6408660BEA2FCB2FCFDD73CBED676DA8D64D3C301752BEE42FCCE56437639517E927903F33746F37E9D6F35B5CC6CC69C5188FE272B21CE195EF305FA4D63FBD6531AAF4047864086E8E4B486CAF94DD3C40F0427627A64086D8CD96A5DDCDA59B81C5A07EAC065720CA52B09035922C373792515250683B641116276C6D6D61BBE6F53302029E9BE2DF179F4113DAEA124A8F54249515DB16F0CA34926E2FE49AEE5291C6018F7A54F860465161EA22FDB4CB9B1BE11ABC42946201CC9C45D46A60F8AFF00E73E6C935ED07CAFE6151B69FEA733E1CB966C6127479A3BBF21B5802DEF21BB07F772A9A2F6CB896A8B7129F492423FBC15197E12C7338F7CBDA14FB8C555475C55CDD7156B156A98AB78AA8B1353BE2AB6A7C7155E3156EA7C7157F5CBFF0038D9FF00ACEBF907FF009AE3CABFF748B5CB472693CDED5850EC55D8ABB1569BA62AB315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB155CBDF155D8ABFFFD1FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF91688D3E8CD770BB55732D29BED5C3C2AA125C2826831E155317408208D8E02155E1B85AF4C8951CD358A7AEC0640B684DB436F56492BD16B9596615B5884496D2F7DF6CAE41B2245BC82F22E370C08A6F82213221279612262C82A46E7E599100E3CCAE5B8127C2F41C732621C6949524D42354F4A234917A1AE47306A2535D3BCDEBA4425797FA536DCC1FEDCC76FC4509A9F9B4384B899EB24952C6B5FE38D39824C1F50F30477E480698D24CAD8EDC5C8D85474E95C9C766360A4574C1CF635E9EF930D6404B3D13EA5541F0229BD72C01A26023D4B200A41E5D969BFDD9688B498A9C8A643CC30A7422BD32241B4C601C9CD0D0D4622D78559E6DA85BE9CB031A4148391EBD7EFC95A3758ABD0572A31B6611B1823A838384A95415A9D8EDDA98F09415600537EFDB070962DFD589EDEE477CA8B782D7D5877207CCE16629B36E3C4570F267C214BD23C80EE4F4C2427802690DB9461BF5CA484009D470F214276A6FE232B21980A5CBD19290CC580EB4DE83DF2B660332D27535212DEE8FFA3C9B487DB20591D9EA7E53F3E7983CB371CF47BA75B588D42722361ED5CACD22322FADFF002DBFE729E486FECA3F324A5B4F43C6EB7AD6B403F6B2B2DF0917D9AFF997E53F30E976D75A2CF1C72CA0114615DFE9C8172A322F48F2E1BBD5F477844BCCF02EA6BE032B937028CD596783CBD6EAE486690291DF2A6C890F3BF35C434FB6B478C9AC8A0B530D37C4879A9BFB99670B1D41AED5EFF2C0DE0B228A4BA8602D3935603D3A78FD1912CE554CFF004DBBBDD461B5B6949F4D3BB6DFAF32313ABD48BE4F08FF009CBD8E0D47F29B5582DF79B4BF4C311B9F889E99B081D9D0E789B7E39EB9664FE87818D4B86E5F7E5A1C5029425A239806C20F8732B0726190DA1CF7CC86A531D462AAABD7157375C55AC55D8ABB15506FB47156B155E3A0C55BC55FD72FFCE367FEB3AFE417FE6B8F2AFF00DD22D72D1C9A4F37B56143B15762AEC55A6E98AACC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5572F7C55762AFF00FFD2FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF91745DBAE6B5DAA0270038DFBF4C557A007DF1B569937DBBE025217C042073DC654C931B4B9E50CA83AF638153ED2A660AE69F7614A367BA58ED6466DC57BE210497946B3748D33508EB930030322C65AED519B7A6D930C0A4B25EA976A1A6581AD2C9AE872FB4704D38D012DCEFD72B6D40CD37A94DCD07BE2CACA024DF7F0C56CA8140C8FF00BB32CBD8569F0F7CAB27369C922D18005B7B89916CE2B561340E5BAB2F4EB92C64B5D943DB5FDB89F5295B5385DAF559A094950D1CE7B04AEF99B8C2D95595FCC31E95FA5A2F2DEAB79369A4C971E6692CA54B64886DBBF1E1B7BE654698F1747A07953F25FF00357CD5E47B8FCC3F2CF921F5AF26DAC924BAB6B8AEDF686F20A01B713919D1482F2ED2EE9AFF0053F4EEAE9567B5774B4D35A8AB291B1591BF678F6AF5C85320537786D4C727D62D7D2746ACB0024AAB57E1A37BE16C1BA0A592333C1F5AB6956F6452D6B040A646283AFC2B8B2D91111FAC46DF5AD0357B7907FBCF3A594ADC97BBF4ED8D30F103505E5DC61A19341D524914F1B6B916725593FDF9C698D3094C2BC17577C9A69749D5DD17E004584A7930F1DB6C698198519259239ED629ECE48EE637F5EE6CEF94DAB7A0DF64D1E87010C6D165EFA492CFF437FCEC1AD7982636B06996E39B2843F0A8095272AE0B6424C9F59F2D79A3CADA9E9BA7F9E7C8D3686FAFA7FA33DD1786BC056A3985C85331262333C3A54F76F7BC648AB4B360D5AF80195D16C12513E60D2CD80917D45D661916331703F0A31DDBE818981642749BC3AE6906375955CC900F87512A429FE19594FE60222D35781D3EB68CAD1034926660015F9572B3129FCC840C7E65D1D24BEB4B581E196ED089EE402E021EE32070CAAD7F3211EFE61B4168AB6D299934E50F75301F184E8085EF90F02523417F34193E95ABBEB4AB7361A9FA4427EFD88A72403A53C6980E92498EA8047DBF9C7CB567070FAFC915C4CE561708580643F1127B54E0FCA49C886AA2CCF4DFCE48343113DBF98273C2842D0D36FA71FCA172A3AB8BE9FF00CBBFF9CDB4D1FD0B6D435C905A2AD18F0A9FF896425A434CA7AC14FAC348FF009CD2FC9CD42C53F4D798CACC46EA631D7FE0B043465C6FCE29EAFF00F393FF00939ABD91B3B0F33299266A44F22AA8527BD4B659F932D90D6EEC1B4AFF009C92FC948F548E1D6BCDBEB7D5488E20B10E0B20DAA581E9954B4843B0C5AC0FA4F4CF3168FABC116ADA4C424D0EE943D9DEF51231DCD3B653E018736EC9A8E21B326B4D5ED26FDD28E20EDB6D8D535DDBC63FE7231043F97F76F6EA5FD68D8B83BD681BAE646271B34453F1A350B93EBFD65BAC723023C3E239B1C54E8B53B294BF1309FB5C0E4332C38504337F1C2CD662AAABFC3155F8ABB15587AE2AD62AEE15DEB8ABB80F1C55DD36F0C55D8ABFAE5FF9C6CFFD675FC82FFCD71E55FF00BA45AE5A39349E6F6AC28762AEC55D8AB4DD315598ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8AAE5EF8AAEC55FFD3FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF90949CD3DF35AED52FB89CF2AF7C55B86E091D7E78AA21AE147461F7E02A39A924D50F534F0CA99A334E620B96D86F4AE054F2D6EFD2473D3C3154A750D59DAD254AF1F88648734179BDEDD33C8C49D8E4C302C72E27356DE9930C6492F362E77DB26D6A44FC66A69B7538CD38D42523B1FA72B6E435483D7156B155F63A7CDACEBBE57F2EC774BA6C5E65D66CF4A9755A8E708BA9021600F600D6B93C70123BB466354FD9DB4FF9F49FE51E9B35B5DF9C7FE725E596D2C19259EC276B48A07400311EA48EBB7C865808ADA838F7BBEA8D27FE704FFE70B7F2CBC93ADFE62EB5E4ED2FCFDA1F97AD1F53B8D68CE66458A1AB332885B893F4E5D007DEA4EFDC5F217E7E7FCFC07FE716353FC95F327E49FE4E7952E35AD3FCD1A73D92DB5DE9DF548AD1A421898DE956229B1CBE2A0D9B7BB7FCFBAED6DAEFFE7DEDABC11C097125CEA9E608E58A641C5CAD0F02C474D8EF91931E27CE5FF386BF901FF38ADFF3939F947F9A5E46D4AC20D13F3DE4D4AFA3D5B502693D8AA5C31B692CB911EA29FDBA74FA3229E2A7E6C7E75FE48FE62FE43F9FB55FCAFF003FD93DAC31B9934FF32509B7B8B752CD0949A9C492805403D7037465694FE5779EB49FCAEFCC9F267E62EBFA147E6CF2EE9F1490DDE9774291BF26A6F8B2E2EAFDABFC97FF009CC4FCA9FCF4F37697E48F21FF00CE3B5ADDCD7052DF51BD5B3AD9D9DB103D4066084034DC570B1E305EEDFF00393BF9B5F917FF0038B736896771F9223CD9E6AD663E3A258D869FF588BEAA48520BA275A9D862C38DF24AFF00CFC07F285102BFFCE28EA5A6B472F2BE54D1A4243F7A829818193E5CF2EEB1F945FF0039A1FF0039BFA5493F92469FE42D5B4CB5D2E7D04C660314D0D43332281435070B0326BF337F28BCA9F919FF003F16F267E5FF00E5ED82683A169F269B7D6F08FDE822E95988A3D41D80C89E4CE25EFF00FF003F7E5B6B6D7BF216FAED56EE1B8866F5D446B172F848FD803B9CAEB9B3069F945A4FF8720F3D7902F7CCBA4407CA305FC0757B66735684CAA5B90FF572BE8DAFDCAB4F397FCFACEEF5A9560F2669B26AD218AD25536AE12579540001F528C7B5460970F716278AB9BE8CF3FF00E497FCE0E7E5E7E5C69FE7AF387E5468DA6F90EF8441677470419BEC02858124FCF23C239D7E3E4E29B7CC49E6EFF9F50CE925A2F93B4A8B4E1113C84120527C38FAB5AFD3938C224F543E93FC95FC95FF009C13FCF1F2BEA3E60FCB0FCA9D1F52D0EC646D3EEEE9E378D870A93D5DBC32D18815DDE0B79E65FF009F5A683AA6B3A4DE792B4AB0D6B4B9A7D36FE25B7763CE0AAB0E5EA53AFB75C9C71041BA7E10595CE9716ADE686D3E258B449B5DD4A4D123AD185A191BD15A7871A65BC23AB5926F67DC5FF3827AD7FCE27E9FA779F3FE865346B2D425D52E61FF000CC570865F4A341FBDA85652A49A1EB8384364645FA0ADE64FF9F54F0E2FE56D1154776B7907FCCEC7843689C97DBEBFFF003EAD240B6F2B684EC4D14185C024F6AFAD80C026539232EB55FF009F5B229F5BCA9A1AB20ABA7A7202A3DFF7DB618E30D5C459F7E5FF0090FF00E7DF7F9C370BA2790BF2B6D35DE5F66FADEDE6FAB236FD67595941DBBE1300CE32931BFF009CC4FF009C6AFF009C4DFC9FFF009C73FCD3D534FF0021E85E59F375CE85247E5495A765BA92F792F130866DD857B0CA66221CAC5399237D9E1DFF0038E06E1FF24BC8D6FA85CDC48EB67037D52742BC18C62AC09DCD7357A900BB9C123D5F4B695A658ED26C48DC819824539F1281FCC5F2E5A79A3C9FAA5A7107EAF03F15EE7E16E99386CD59793F083CE5A73699AFEB5A5BC6D088677081C52B466E999F8CBA3D4C5283B5B59A9054AA1A5733226C38110866FE39364B315545FE18AAFC55BC554CF5C55D8AB5CE9B53157733E18AB7B9DE9D715750F862AFEB97FE71B3FF0059D7F20FFF0035C7957FEE916B968E4D279BDAB0A1D8ABB15762AD374C55662AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AB97BE2ABB157FFFD4FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8EE4B96A57F0CD6BB54BEE6E4F2FD78AAE86E01502BB62AB1E41CC1F7C05211724A0FA7E1953247B5D0458CD771D302AC9756E0B4AE2AC5EFF0053332B28F1E9921CD058C5DDC9A1C98605209A72C684F7DB2618C96890713936B5093F7854786F8CD38DBF476F6CADB96AC542DF462ABFD318AAA691E55F3379E7CD9A1793FC99650DD799AF254BAD31DD8AC8AF1B7C3C69EF976201C4CE5F60F993FE70D3FE739BCCF6ED6FE636BAD4D0A7A0BA64974C55430141414FC72EA01A2CBF643F2F3F273CFDA2FF00CE0F79D3F27751D3560F3D6A7E56BAD3AD2D236678CCF22154058926A49DF7C9C764136FC52D1FFE701FFE72CB48B23A6C3E43D327E0C6E11A590B4CA587B532C0520D3F6A7FE70B3F25FF00307F2DBFE70CB52FCA9F37592691E78BBBFD6E6B3B02DD56EF8984D76EA01C892C0C9F94DF94FF00F389FF00F3995F93FF0099EDF98DE46F2ADA43ACF97B58B9B9BFF5A5741716D34DCA84568C0AD6981417AE7FCE7FAFFCE51FE6E79534AF35F9F3F2AB43D1FF002EBCAD1B32EA1612BCB7E1CA1F51AE118D5072AD074C590953F38FFE71DF41F23F993F327C9F61F9CBA9DDE9DF96FAE3B23DCB201688E1C22891CF40316CE27EE04FFF003953FF0038D3FF0038DF77A57E43FF00CE2AF97F45D77F31FCC37D67656F7518A6957724DF097B9BD427E3626800C58195B18FF9CAAFF9CCDFCF4FC80D7BCAFA67E687FCE3DF94F59BED56CC3691AFD83497715B5C16A2A4323861EA03B85271636FABFF002FFF0038507E40CFF9F1F9F7E46D13C8B05BDA9B9D3F4E4445935042AC10CEACBB48C69B0C5812FC5DFF009C15D5A2D67FE7381F58D3AD6DADAD7CCBAE5CEAD690D688B677723CB1C6941D830DB16264F56FF9CB6980FF009FA17962F26790A01A3C56CD08AFC512BA95FA2BBE25B81671FF003F8D92E6E35DFC86B458964B3FAB48F6A53790B537046408641F93B24769776F1C5A8D8BDC5E5005AA9AD32A21B8153B8D1ACADF59F24FD5E27B49CEB5640015A8FDE83B570034CB9BF793FE7E412ABFFCE01F962299A79644D5F458DA471425D6A77F6DF2C8C6A9818EE5F822DA1697A868B63A7E97A1869E3B413DF5D92F5F5075EF84367007EF97FCFA0C347FF38C9E7F8608E44B9FF10DDC61C0FDA11353EECB049AB806DF17E12F9AB47B1BAFCC0FCCEB8BA8DA7BDFF156A70A3396A02262C6BBF8938253D9B3806EB5E3B64FAAB416104933FC0DC4D7EC8CC7F14B1F0829A683A75C3FD616C230D727F7CA091B8F91C7C52918C27967E5AF2D4C04779A2A4DE22AFF00D71F14A784226DB4BF2FEA7AAD9F93BCA1F97771E62F34DF4C9FA3B4FB38E4964E75A091954D4283D4E4A323252007E937E427FCFA63CE7E6BD624F38FFCE42EA16DE50D126845CC1A268937AB24A08A94B9E6D5414EA2B970B69343DEFAFBF303FE72AFFE716BFE708FCA571F975F92DA2D9EB9E72107A561A1E8CA67B496FC01F15E4C0B1526A6B4C8CA7B338C093BF27E59F9CF5FFCCAFF009C81D6EDBF31FF003BB537D6EE21B8F5743FCBD8E42FA6D9467EC96E276A53BE60E6CF5C9D8E0C3B6E1F657E5BFE6369D731586871B246D63122D22A1B745A50468C07ECE61711939F5C2FA534DBE8E15925460EAE054D72328B7C24CC22D5AC61D12EA696CBEB7CA290B102BC7E13918AE4E4FC43FCFDBED3F5AF3EEAA2CE0F41D256DA94A6ED997093A7CE1E1FEA48CAB1C8FCFD01C57D8667623B3AF229D96A1D8ABB155CBDF15546ED8AAC1D3156F15770077AE2AEE03C7156B9D36A74DB157733E18ABFAE6FF9C6CDFF00E71D7F208F8FE5C7957FEE916B968E4D279BDAB0A1D8ABB15762AD374C55662AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AB97BE2ABB157FFFD5FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8D34BC51D4D0F8E6BA9DAA5D757887900C2A71A55B6D7229BB0AE34A897909F881D877C041506914D7085128E2A32AA2CB88285DDE7100A372E23B634578825125F3B6DE3DB0526D0734E0296AD08C9008291DD5D541EF920C0A4C65777FB27E7930C485FCC81BFD3930585174720E677DA9824530148B0F5141BE41B2D48B91D8FCF15B6BD4C56D917917CEFE6DFCBCF3E68FE74F25D8DA4FADE8686E21BDBD1FBA4E07970AF89F0CC8C3C9C5CFCDF7349FF3F5EFF9CA09EC6E2F7F40F96EDEE2C9C5CDC4A63A3948C50D169EDE39750B71DFAE1E46FF009C8DF3C7997FE70D7CC7F9F77D6D65079CF43D126F318B287FDE7668D4B05229D0853DB26021F945E58FF9FADFFCE5A79B35516DE55F22681E62D56E938AD859DA9967DABFB0057B78614BF5BFFE7113F3E7F303F3EFFE71A6FF00F34BCD7656107E6269DAB6B5A78B38978242DA7FD8475A7C2DB1A8C04354DF9BBF941FF3F0CFF9CA9FCDFF00CFA87F28345D1BCB916A1ABEA975A7BCB321458A3B4765E4CD4EDC70522934FF009CF1FCF6FF009CA8FCBB54FC9DF3CC3E4CD4B45FCDAB77FABC1A0167BE8560F85BD6561F0D6B51F2C5987E547903C85E7FFCE1F31E95F90DA75CE97A4DCC5234B6925EBFA51B3F2E410B7892705864FD16F257FCFA23F3F26D7B44BFF33F987CB7E4EB2D2CACD0DEF97A57FAFA5C210D14B5634E4AC01AD70A0BF577CE1E75FC81FCA3FCB5D0BCB7F9F7E7DD07F32353F23411CEF26B7325C6AD737D0F499537AB531624BF32FF00E7323CE1F9DBFF00392DF975379D3CA7E4D9FCB9FF0038CFE50893559ED75188C37B3C51FDA96341406234F84E1A60FCCAFC9CF2BF9BFCFDF9CDE47F2C7E5B79864F2479AFCE0F1D9F917558E43088E40A5C7AAC3703883D31E140897EB27E5E7FCFB5BFE727B4DFCF1F24FE6C7E63FE61689E709343BC49F53B89E691E765414DAB4AD6B5C69B86CC2FFE7EF9AD68DFE37FC9DF2EE8BA9A4BE67F2DDBDCBEAF6D237C36EB22928CDE0180DB2259805F3C7FCE28FF00CE04F9B3FE7277C8B379FED3CEF2E942398C3C1E42073EA05011EF913BF26775CDF5A68BFF003E80F35DB6ADA36B1ABFE62B5E3E957F6F77F57E65AA20903D055BA9A5300891D14CC17E927FCE507FCE31CDFF003909F913A5FE4E5B6A8FA49B39ECEFCDFF00EC97B4D954EFDF2C0C0CC9DDF9B23FE7CF5E6CB5D3445A7FE68CD0DDBB5651EA3052BDD766A644829F10BF463FE710FF00E717AF3FE717FF002A75DF235E6BF36A771A95F4DA9497719F84348A568373BEF954C90A245F9F1E67FF009F44F98B5AF37F9975FB0FCC06B6B3D7B50B8D4C42F211F1DCC86460C037515C4094BA289D17C03FF393DFF38B1AC7FCE29F9FBC85A4EA5AE9D56D3CC32395915890415F72727E1D06CF11E5115ADBC0BC0ACCAD3B3189E9B75DE990E109E22AF02A25CA98A4775EE7B60A0C6CBEB5FF009F6E24C3FE73B742F456393FE752D5CC824EC9C7E265F714DB2E8061225F657FCFCFFF003C3F35FC97E6DFCBAFC96F2179A27F2BE93E74D264D47CC3E6289FD3B9611CDE998B9D3BA8E9965048912FC9FF002E796B4CF2F6A1746D8A5FCB75704DF6B7A99ADCBC86A4C8A6BD77CAB200DF025ECD06A30454B7B39648D29FBFB81D251E0C7C335D962E7E29109E69570F65730DF69E56CA20DF15B45B4751D5BE6731E31A72B8ADF587E5979ECDFABDB5F5C28E2005E47AFE18261BE05F56793754B6B9B7BDD2DD11E3BD8D979B741B532B00B39BF217FE726FCA5FE19FCC1D4EE238EAB732332D3A1A96E999100EAF5043E588DA30F351BE22DF1A9EA0E67E2D83AD9157A1F0CB98BB7F0C3452D12075C08B5CA46FBE2AA8C46DBE2AB01DB156EA3C715773A6D4C16134EE67C31B5A6F883BD7AE3687701E3855FD72FF00CE367FEB3AFE417FE6B8F2AFFDD22D72D1C9A4F37B56143B15762AEC55A6E98AACC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5572F7C55762AFFFD6FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF87A96FEF941ACBF8E623B3B0963DF5F16DA5AE34B611515DDF541F571A5D9318B53BD42A1E4AA7ED2E0931927706A3CC0E9BE52D61166E7638B38A5E6EBE33D4E2D8103717049C52833FBC23155616C42F21DF15434B1D3B62A868D7E36F0F0C5894746A3DBE8C582BB461BE43155168462AC93F2FBF2CFCE1F9BDE7FD1FF2EBC9776965A8EAF19905C4E6900A1A7C7976271B31DDFA2BA47FCF9FFF003D7597F43CC9F997E58B4B688049A0B3123CA57AD18AEDF7E640F268B7EC4F907F217CA1F937FF0038F179F955E75D6E26F23C1A335AF9A359B87280447FBCAB9AD12872616DF1CEABFF003963FF00381FFF0038BD6BA743F96BE5BD23CF9A8D847C5755F29411C972838D2B3CEC2B5DC8241C905B5BFF003EB4FCC58FCF1F979F9AFA45BDB470DBEA3E63D675CB68140E5026A2EC544B4EFF00150E4BA2F0DB17FF009F7DFF00CE324FF963E63FCDAFCFEFCCDB44B09FF4B6ACDE5AB8B8F84DBC31CECCF23927F6C74DB010CB81F96DF9DDF9D7FF002BE3FE7253CE9F98D6F74D045A7CCD65A2E9970D50A9033C3CA01414E4054E56436C616CDFFE712FF28FF257F327CF9E6FF31FE72FE7149F963AB796353B69BCBCB6F75F56B8942307356F0AE459786FD51F38F93BFE71CFCE8D7B3AFF00CE71F98B48B4344BB5D3B5DE01005028483E032A32A3CDA4E2277A79DF977FE7DABFF388BF9C724FA9681F9DFE67FCC6BB8EA6F35A1A8ADDB0A750CEC07864F8C745E0A7D95F97BE4CFC8BFC81F25FFD0B3F99FF0036D7CCFA7F9B4496BA47977CC577EBDF4905C8A0B58A951C00FB2B931913C07B9F1A79AFFE7DDDFF003895F947E615F32F9A7F3CF59FCB2D465BD7B8F29DF0D405ACB64ECC4AADAB863C4A5683DB26269AA1C932B9FC9FFF009C6DD4E4B4D31BFE73E3CEE249C520787CC4435C9EA55985795326770C385F15FF00CE607FCE3DFF00CE35793FC93A9FE677927FE722AEFF0035BF320CB15BDBE9DABEA02FAEAE854A30AD6A780ED95C837C075A7C55E4DF31FE71792B429EDFCA5F991ADF923465E12CD616174D00776151B2E634B6673887D0DFF38F9E6FFF009C92F3EFE7CFE58F92FF00E576F99F50875F9E3D66F2CA5BF77A5BD9C80C9148A76A3807614C8F38DD72712517E82FFCFD9BF3BBCF5E43D53F2BFC95E46F376ABE50D47CC9A7CBA8CF75A64ED0168E297830629BF6F1CB9B7146F67E4949F9B1FF0039096D688A9F9E7E6F8AD66FDFCB72DA8CA013ECD5AFE382DCA9C283F6FBFE7D73E78F3479EFFE71CBCEFAC79EBCD5AC79AEFB4CF30DDC2BA85EDC34F27A0B192A159EA695A9EB8251704737E2FF009DFF003E7FE720AFBF30FF003022B5FCE7F34697A7DAEBF7D69A7410DF3A2450C729F4D68294016836C31A05CD8E332890C035DD5BCF3E67D574EF30FE64F9EEFF00CECFA07C7647509CCECBCF614AE4E73586911714D00BE54BA9663752A97D3E2AFEEC022A6A3E5989293951D3D2B5AB7A48ED5FDAFE3862584B1BEBEFF9F69C9EA7FCE75684C3FEA4ED647FC933991170F2C69EDFFF003F6FDFF3EFF26475FF0070139A7FD1C60916A897C11A8C06541DF8C9CA998F22E5C0A7769767EA8B08FD9ED9448B971679A34DCA08E393ECD77C85B75DB34B4D4A5D2EE2196CBA0209A64245CAC6FA93F2F7F32121B8B35B9702BC565AFBD3DB220B64F93C6BFE7316D6CB516B1D6AC183B3AD5A9F4E64C0BAAD445F9DD35A43EA99631F13EF2FCF2FE275A614A6E782D075CBE05690E243D3DF2EE882BC0E79596B937C78ED819479378B2762AEC55ACC79736D1C9BC4312578CB43592EEB920C097F5CDFF38D9FFACE9F905FF9AE3CABFF00748B5CB87260F6AC2AEC55D8ABB1569BA62AB315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB155CBDF155D8ABFFFD7FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF864BB048AACD51DB311CEB4BC2B147612EE01C56D17621DC0AC98ADA65E8307525EA2BB8C124129D5B45D38F4CA501306040229D716C8A58E28E49D862D88571C9F6DC629548E36A8DB154D235AAD08E9DB1541DC42687E1FA7154A1D5D0F43BE282A91C8E0F4C58F0A3519A9BEC3B62BC2B8891BA2938AF0B21F2279EFCFF00F94DE7DD13F323F2F2682DBCC7A3AFA3682ED3D5818B1AFC51F7CBB1CA9C4D40DDEF1F99FF00F39CFF00F3963F99305EDCF983CE163A19D22DDC48BE5D88D8BAB28AD1F89353F4E5DC40971E9FAFDF975AC7983CE1FF003EDFFCC2D67CC3ADCBADEAFAC793AF6692F6F5CCACAEC87A96F0C9476B5A7F387A7BE85A5F97E686F0C4B71A859A08A7863264776DF812A09AEFDF240AD3F707FE7D29F951F9A9E58D67F327CEFAF794AFFCB3F979E6FD06D2D74586F289F5A962209786B4A13D6A72D06C289D3D0FFE7EADF9D7E75FCBCFCB8F2D7E4FF95F4E9747D37F3126922D63CDB6EA5623146D510C6CA2AAC4FDADF7C494F1EEF91AF7FE70E3C83AA7FCE05F92BF3AEF2F5BC95F997E5B8A7B89B5A998AC37BEA48591645EA49A0A13EF9592D8323E2BFF009C7CFC90FCC1FF009C9CF3F6A1E5DF285F695A3F99A0478754D4EFA15781907C3CD50EF5A6F91B6632ECFD44F20FFCFAB7F26BF2AB40D53CD9FF003943F98B1EAF1E9122DD31D16E0D85B451A7C6C6757AB301DE83A60113F0419DBEF0F30F9D3F2CFF00297FE7157CDDF985FF0038E51E8F77A2E99A34D3E87AB584002CA507C25DB882FDF7A647C2A533B3BBF9ABD5FCC1E62BDBFD3BF38B52F3E1D5FF00332009E6CB79656692289588A59C486BC597C06110A62723F717F317CA1E4DFF009F8A7FCE1B683E61F29DEAA79DFC9B6E93C371250BAEACB12ADCC53746E24D763921162676F3AFF9C76FF9C4AFCACFF9C2AF256A3F9DDFF392BAF68DAC6BB25AC8348D2EEE1F56DE1050845489C37C66B4AE4B8D1C4FC98F3C683E4FF3F7E6A7987CE9A0F95AFF00CB7F97BAD5E493E91A34D227AD21690B17B72BF654D4103C32B3367E3523BCC3368DE5ED38437CCF631C29EAC4D72DCC48631544A0AD49A532A3BA7C6B7EAA7FCFAF3F21AF74CB6F31FF00CE577E62D9AE9F1EAD6D2BF93BD61C560D302B7AF32F2A5140527135F00C38ADF0C7FCE507E6BC1F9E5FF3923E60F3559336B1E4BF277ADA2792A590F34B9B5726B3475EC1AB91F136761A7C24EEF13D4A2B98216F556DEFED9374B08928CA3C0D76C7C47272E2D9FB2FFF003E9130C7FF0038CDF98534B0936D279BAFFD6B75D8AA08A9C7E8CB89DBE4EAB83D4FC42B8373FF002B0FF346E6C618E5B6B7F36EA8E7D75E4157D634041F0C864950761A68F34C66823B9FAC35E7A572978ABF0C0BC42537E99852CCEC052AAA97948E11B154E30923E3000EC721E2309CC24B3CE90432F3902146A3D4F427A65F09383972D3EC4FF9F65C7327FCE717971E44204FE4DD65E13D792F03BED9990E41D74F2713DD7FE7ED2449F9FF00F92E10F22FE5F9CA7B833E5732B10F862E5828B84A5655AD5331E45CBC6126D3AF59262937EEF7D81CC79172E2F55D2984B0523352AB5DB204B918E36C8F4C9E559024919604D2A72B949CA80A679663EAD494CBE9348414FA32024DB241F9EDEF35FB18ED9C35C431A101FA819938E4E0E585BE39D634AB9D26FEEA39A268D2662D096EE3DB2EE370E5898E354B6FF7E6463938D38D34D18D88FA73281D9C5915363C7A76C8940709053734381B03B9A78E2AB81077071575478E2ADD3C329237656EA1F0C900C495DD865803592DE4A9812FEB9BFE71B3FF0059D7F20BFF0035C7957FEE916B96057B562AEC55D8ABB1569BA62AB315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB155CBDF155D8ABFFFD0FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF86BB8802C67311CBE240DB460B32F63B1C57899159D94483A7CB15E25595139003AE465C97891F6DF00CA9215659878E2D914A669013D6A7B62D81411BE21E18A519137BE2A8C57A6F8AB52BD57DF154A6615A629014E35DFF008629A469140B8AD2262C5682DBA92EE182EA4897D5B636D227A6366F588F8581F6C944B46585BF40FF00E70A3FE70BFF0024FF00E723FF0029B5BF3279AFCCB2E85E6CD3F54FD1B7D1CF7CB1F2A8279716604E5FC449B718C2BA3F4B7F3B2EFF00283FE71B3FE7103CF7F9456BE72B18EF350F2ECFA4796A059D267BDB87144850231219B975392053E1DEEF8D7FE707F47FF9C0DF27FE58699F9D5E7A920D17CE3645F4EF33E9FE629BEBB0472C5F6A58ED983503B74A0C9DA38084AFFE7217FE7E75E7BF365C5E7907FE719F438FCB7A1D9BB245E63302FA77D68A6A9F554D84551B9A76C78E9A678492FBA3F267F36BF20BFE73B3F246D3F2E3CE2F6ADE69D3EDE14F3568B7AC8B7B693DB95E53432C86A3D4707ECFBE0333C988C469F327FCFCB3F353CABE53FCBAF26FFCE267E5CDFDA3C1E60317E9B4B77594D8C5624344ACC8763215A1191E3A663097E57797752F3AFE5FF9C6C7CCDF943A9C9A0F9CF47B37B69ADC3304BA5917E290814069EF94F8AD834F27D89FF38B3F927AAFFCE6FDA7E64798BF3E7F37350B297C93A92E973E8C3516B68AE39C65D8B46CE015A8A5732465003038E4FD4FB9B5FF009C5EFCACFC8DB6FC88F3D7E61E976FF96F73A61B09B4D8665F5F8B1DCB4D11635DFAD301CF148C322F85A05FF9F51FE534B65AAF9524BCF3E5F69779EB5A587D6E6BA592E54502399556AA41E94A644E701B069645F0D7E4CFE707E71FE4DFE6779E7F353F27ACA7B7F2BDEEB5777FAA7901F91B67D325959D04716C81E8C454657F9A8B68D148F47EAA587FCE5D7FCE207FCE64F97A0F277E7DD8CFE44D68148A2F29EA333219A56D898E455E2373B03F7E40E51F51E5E4C65A390DBABF3FBFE735BFE7193F2E7FE71D6EBCA4BF931E6B9F599BF306493F44F97BEB7F5C7B6892AE2854B05A8A0C81CA48B3C9A8E9A47A24BFF3851F919E41FCF8FCE08BCB7F9D5E708F47BEF273A5EE8BF97374C527BFF4784AEC676A2B2AF75EE36C1C6472EBD57F2E62FB7BFE738BFE730D64B5BBFF009C5CFF009C7DB8B4B9D4AE02D96BFAD6931886D349B68C7096D02A1E279A93BAED8F89E9B972FBDC8C7A49134FCD7F2F791E1F2BD8A68176E65963AD2F474AB6E687E67304EA2CBD060D36C9D5FF00962CDEC2E4C7290D6F197694577A7CB271CD6DB9F4FB3F537FE7D471DBC1FF0038CDF9836D79756F682FFCD9A8A47EB4F1C6DC425391566046FE39B033B1B793CF4F170CC03DE7EF7E383E88DABF9ABF332F6D2329158F9BF538A57471C64549295DBED5731F3CEA2ECB1E2B0B64B2FAB6DC295ED9A83959F8450935A7AA80863180EB571D695CB2191AE78497A47FCE3F7E527E5A7E66FF00CE4DE8BF97BF9B2B736BE4AF3858DC5D45789762D544B6F1928399200E4453E9CDB69C931BBE4EB73E120D53F757F207FE70C7FE718BFE71AFCE927E65F912FE4935C165716D61ACDEEB114F0C16970A04CA23671527C4666125C2188F73F2B3FE7E3BF9A5E4EFCDFF00F9C87FCBEB2FCB3F30C1E6A87C89E5FB8B0F31FD554D22B812972BEA74AD08CA67CADBF1E3DDF31DAC4D05A3A188C69337A8439E4E1BFD6CC69173A18924F4C0BA048EF98E4B950C4F51D01855631D5C01954E4E4C31D3D46DF46944493053B8AE63CA4DA229835ADEBC6A5222C22EBB64449245AB5B5C4A54C33C541EF9938E4C4C2DE59F9A3E5C4BCB14D4ADE3DED50AB53DF2D949A32627CC778E915B014A4B5A1CC8C527559E348462CA23AF565AE6C22EB25CDCA390DFB64CB3839A315C836114B7D35C50EA53618ABB155C1C014F0C8916825AF572403025BF532603025DEAE5822D64BFAEAFF9C6B35FF9C74FC823E3F971E55FFBA45AE0661ED78A5D8ABB15762AD374C55662AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AB97BE2ABB157FFD1FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF881BC880420F5CC3E20E424B0A857A1EA4ED8F12B24B50B4218D31E20AA8F08670CBB9ED809B0A39AA03C41076395F0B604BE5662C6870F0B30504E1C9AD31E165C6D29E277FA7070B21205171354FC382928CF8A83E78D2B8D698D2A12406B8A625A8D0D7A6D8B2B45B23300145698AD85F1EDB1EB8ADAA4A225884FC4CD3AB045B6AD0153D5BE8C429A2868F47BB86133689E66D47465BDBA56BFD32CEE6585789FB529E0402465832531E005338FCBB6FA84CE751D4B53D461B17E766D79772CEAF20E8C15C9030F8BDE98E11D11F0795F499EFEDAF6F2C266B595F85D69026222007FBB997ECB57C30F8C19F83BDB33B782934292BC7E8C4ECB672C2823F4231B2D78815DB6CA67985B64710EA91EA7E5A437115F68D25EF97EEA32FFA4F52D3EE5EDCDE06FB3511914E390F1E9B3C081768DE5FD3ED8FD72E26BBD7F5E0DB6AB793BCAF427B1724ED909E7B671C1001E86B6EF2DC590922A49044CAFABA1E2483FB240DF7CA8E50DBE0C52883F2E6D4EB125EC771AA59E917959750B0B1BE96DBEB128E858C64549F7CAFF3738F271A7A404BD4B4AFCA0F20CF6D75A85CD86A90996129159DE6A12DD0527BD5C9CA726AF24F9B762D180ED0FC95E5FD05E19F4BD0603769271769155C18BC68475F7CC796693B0C7A50F52D3ED674B48A28163B4912E1A66754142ADFB0C0751EC72BF1A4E6474B163FABFE5BF943CCB3DC5D6B1A12EA3716A39D98B522DA49246EB491402299911D4D7544B4B1287F227E4F59E81AD5C7992EAE2F3EB112D346B2D46E1EF7EAA0FDA0A64AD36F0C9CB59C5CCB8FF901D143CF1F94BA579AAE96F74992E3CADE648DAA3CDF6933C721435E6948E8DF1034EB9286B047CC2FF2782ED17F2EB4DF2AD9BD969566F737F74419BCC533F3993F9B9330E4C5B213D582092E54745188D833187CB62EAD134DB88792A75D40F53FC73046716D98F152B4FE598AD6DD2D6CC85957EC5CB0A807C48EF96C753109CB8F886CF269BFE71FC4B7D793E99E62D5B4A17B5B899AC6F26B783EB2E7E26F4A3206F99B1ED1A157B3A89682E5C54CA34AFCA7D23CB5A63D9C76B2DDDC475996F4C86AD3B7DA771FB44FBE5597571946ADCAC7A7203CF75FD0E64998087A1F8B35E32370D384AE0D338C0E49F4DD47C2C45687B6646292CB00609E67F2EBEAF0D8DC5DC93DB6B36CFC6DEFEDA5689E28C9F8802BBEE336DA7CDC2E0E7D2C65CD8A6A3A0EA36B2B45A7F9B35FBC8C7C715BFE91B85141D57ED77CCD3A814EBB369611E5F794CB42B39B42944DA3DD8824D64F3D75661EACAA4ECCBEA1DCE512CE1A2189EBB1D84090ACF0C6C2D8AF0F58B16E4DF2CA279A2E6431A0534EF527AA2D77CA2598391114CF346D3E7867B762945E42B944B286FC71E3E4FA7F44D352F2C21089CCF115DBDB293305B0E0932587CBA3D27458E8CC3714FECC00B0F0A439B17D4FCA324619C2D3AF41FD99930986420C0753D0A76B1BCB59D39C12EE58F63965F1726196161F1E79A3CB8D63A8CFCA32B6FC8956CCBC669D26AB1960ECBCB91614543C53E599F09874D381054A46F4E95D81E872EE265034A4F2F1343D698096C26DAF52B8A1557703155C411D462A8377F888AE203592B79FBE48062EE7EF93B6041772F7C9713120BFAF7FF9C68FFD671FF9C7FF00FCD6FE54FF00BA45AE066393DB714BB15762AEC55A6E98AACC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5572F7C55762AFF00FFD2FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8779E6690D0E6BDC86E0B62C55A9D0D6B8AA7B1454C555F8814C473508693A9CB59A5E480C49E98AB4CE9E18AA1A465236C05945742699536F1047092A078E2B61716DBF8E15B08391B7AD701482A9130DB026D16ADB1FD78ADADE4395715B5CC6A062A9859FD93912D914FACBEC37FAD95C9BA09CC1906F8A6B0A0645AF8E565124EE5B5E56640EE320531482C21F4EE0AFF29DF2B9330CEACE0F56829B9C8368E4CDAC6C8B24629D3205B22F49B3B43FA35969534C81722095DBD8BF3A50F5CA8B97065B6766FC7EC91909392190E9DA51E60F1A6F539510D822C94E9842EE2B4182922294BE9CBBFC3DF1A6D10413E9C95E9808D9918A3AD6C100A53AE505ABC3569B4C47A10BB8C57C3455AE9E00E9D714786EB9D2B9A3F14DE9B62830A0F10F35689708F3388C77C945800C0A1B0924B69D5D00DF7CCCC658CA2C43CC9A64B085600D3332127032879C5F44D1D651B3014CBB8DD6E68EC9569E93493D373BE4096BC707D0DE5ED224BCD3238D81217E2194CE4EC2186C27B0F95E4120223E9ED98F22CCE9CB2BB2D12485E12E869514DB2B3272F498082FA3BC976F1FA31C6CBD80C00B9B2C4F5CB6D22065A85FB5D72C12689E35F75E5C826423D304E4C16838DE5DE70F28FA16FCA18FE12A4B003FB332B0C9A270A0F913CE5E598A54B82F0FC42BDB33232B755A885BE51D7EC24D3EE1A3E344EA332A05D2E68531CB9903428D5E99931710841897950E5A98F25656C595ABAC805315B5479401F3C56D2F91FE33BE4C354B9ACE7EF8B1773F7C55DCFDF157F5FF00FF0038CFFF00ACE1FF0038FDFF009ADBCA9FF747B5C9ABDBB15762AEC55D8AB4DD315598ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8AAE5EF8AAEC55FFD3FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88316FCCD45335EE42630C7C17891F11D862AAE55A3FB5F862AA7CC9751DB08E6A164BD4E58CD00D192493F67C71552654F1E98AA832AF6EB91290B797134C832564620D6BDB1557E551B1EBDB1542C8AC687016512BE3246C4E0656881228DBC715B5E11CEE294C56C2AD0D003D7B629B4CACC1A53B9C896D8B20B34655607B9A8CAE4DD04EA089F20DF14C63AA7153E3BE56512656AC0D9EFE1902CA2C7A01FE94CD4D89DB2B9320F44D1A22C54D36A641B43D174E882B0E4366E9902D917A259DB936C4506FD32B2E44175B598E7F677AEF95972E0CB2D2D502EE3225C90C86CA10A46DB6574E481B270E8A474ED8D360012CFAA73AF15EA71A6C0109258B03BAD3011B3202D523B609F6B314B2E04D22B3590034AD714702362B38D4D08A62BC08D92CE26864A0DC8D8E2C670D9E75E64D0627B39A4352789ED928B8A214F04F4608659A2058B96A71236EB97424C65040F9A34E89EC95C28AF1CC98CDC1CB17806B5108838E3DE800CB3C475D9216A7E5FD3A7B8B80238C31276180CD9E1C4FACFC9BA25D0B4F4DA1019539357C331E591DBE1C2F4FD1740FAEC9C12352E3AD76CC796473469D93DC796E24291B4604886A6991E2B6EC7800667E5DD3440E9F0D0786112672C6F5FB14B68E3024AD587C3B65824D13C69CA476CD41BFB6D9609B41C4A77FA1C17F6B22320208EF97E39B899A0F913F337CA4B6E2E0DBC436AD4D3E59970C8EB33E2B0F827CFDA605F55B851D76FD599B8E56E935189E113865050F8E66C0BAAC91A520A4003B66406B05554D3AFD38A6D706A1AF6C56C36D20A7738ADA14B124EF930D6D54E28754E2AEA9C55FD837FCE337FEB37FFCE3EFFE6B5F2A7FDD1ED726AF6EC55D8ABB15762AD374C55662AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AB97BE2ABB157FFD4FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88EB5527A8EF9AF72138584000F862AB580622B8AAAAC0BC4B6D5188E6A1033851F3CB59A058A952062A876E3FD715506A74EF912BC90EDF6B2B5E254AD00A615E25367618AF129FAA5B6F0C0520ABC75207BE0648911B1236E98A11A88C314DB60126A7E8C59C135B35DC644B745925BAED95C9BE09EC0BF08C837C559C5181CACA24CA6DC7A9694F6C814C52DB7B73EBF4EF95C9987A5E876C788DBB641B4727A3E9B685DA314E832B2CE2F46B2B6263094C8172609D5AE983903E395972E0C8E1B001694C8C9C909A5A5A8AF4E9869B849363682831A6626BA2B44A7D9C69B04D42E2D12A76C8C86CCC4B74B4DA1AF4FA3304B7DA6F69684F1D8605B4CC590AD298ADA30598F4DB6ED8944B7093EA9610CB613A9515E27F5620B488BE60D5F4C486FA62ABD1F7FBF260B19063FE62F4CDA08EA2BC72624E0E58BC2354B0E572DC96A9434F9E4FC470B82CB37FCB4D05AEB534E70FC3CBA91F3C066E5E2C54FB7B4ED02D6DED144680394A1CA2537678A349BE91A6AD9CA5F852BDF2894DC8B013A36A269D98AEDDB0464D9020B26D2ECD232A4AF4CB049259A5BAC2FC435053A659C4D134E3D3B7420F2C989341451B988008879061BE4E33A71F246D83F9B7CB36BA8E997521505CA93FAB32F1C9C2CB8DF97BF9BDA0BD95D5CC623A0DC8FC336584BA6D563A7C937D66DEA91D2873658CBCEEA0520658FD26E077D81CC98F27094F0AB44818ADA8B362B6B7AE4C2BB15762AEC55FD837FCE337FEB377FCE3EFFE6B5F2A7FDD1ED726AF6FC55D8ABB15762AD374C55662AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AB97BE2ABB157FFD5FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8A0B7896BB6D9AEB72116C388EA3DF1B553E05BEC918DAAA51C2F1E43082A94DDF21DF25C4CAD2AA495D8E3C4B68696564D88C78D6D62B926A41380C946EAA2367351B0F7C8DB2F0D50055346618DAF86B1E30C2AA7AE36BE1A82A146F886C7A6048852696F172DE98A784A64B1AAF5EA7A62BC255982D0D06F8AF0950E209D87CF10120F0A696686A36C0436C66192DBA1DBA6552722124FEDE2240E9ED951939312AB340C29B8391E69E1B647A78ADBF1EF4C8908BA46DB5848CE1C5284E57209137A2E836CCC428A5477CACB744BD434BB378594BD083E1954A5BB7443D074EB477A11403DF21C4E5420591431716F8874DB225CA8C29378D4505075C8916DDC48BB65A374DB0ADA6C232C36A615E3A44288D054A934C5B233B509551C6C0D7232E4DC0A10C04B0D866010DE3284DED6DD956B4191B65E222429077180C93C48F8684712363913365CD21D4D084954746072226BC34F9E7CCF02C124EED4249DA9F3C98935C9E37AF34B2B829F647519306DC3C91B49ECB467D52EE2855284EE49C375CDA31E2B2FA6BC83E4C86CA38E568D79F723227239F0C74F6EB4B13EA0DA8A17A1CA897240A4E96C569F0819598B2E1255C5B46801A6E3AE08C59C2242716691BF414A78E4D914D2283E3156D97240B4C85A36508CB452464F8DA4C54EDA89255892064E32B6990A446A33A3DABC22B475A0CC9C73A699C6C3E1FFCF3F2C7A51C978C8ACA63AFC3D7B66D304DD46AB1ECFCEAF30DB98DE4923015549DBBE6DB16EF2FAB86EC2259FD56E46B502999575B3AEE02A7CC7BE4830229631A9F6C242A91563DF224D32112570141BF6C226B54B4B81E3878969776AD7256B4B4B01D8E2B4FEC23FE71977FF9C6EFF9C7C3E3F96BE53FFBA3DAE4D0F6FC55D8ABB15762AD374C55662AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AB97BE2ABB157FFFD6FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8A889788DF6CD7539086B99B8D6871A5538666618D2A20C8C0548E98D2A0E6FDE0A8FBB1A54BC2D1E871A540DC805F7F1C6954F9704AD37E98D3387344464BAEC298D37F120A6B794B7C24E34BC48A855900E5DBC71A5E257DA62140DD37271A5E24C625E031A5E256049231A5E2452AF2071A5E25F1435AEDF4E4834CF74CAD63A1F6C816706456895207BE51272E0CAADE1A2034E994C9CA8F25EE9C8D298C4ECD80A75A5C7521299125AA4CB9221146AB4F880DF2A2562CC7CAEB59D790DAB9025CB845EC16F10E4B45DBC731E5CDC880671A58A28DB22E6E309C2A0E75A77C5CB099451A918B021116F1FC74F1C5253A48A806D8B54954A2D3F8E2D9050E0B5A78E097272A28848158F4E9984425191A0414CAC8641A6A02476CAC86C0BD245515F0C810CC1A63DADCE1629187864405E37CFDE636699A6205687A64C313BB03B7D224BFB9E012A2B97458F876F5CF2D792A38E786478A8DC7C32333B2638A8BDE749D320B481005008194B7009FC50C75D862D8023046A0785316C010F20500E29A57B324134C2A426292B066C0D642A3CAD4A62D6421C5C145624EF5DB2C816B942D0525F173C589A65F02C0E379AFE66E996FAAE8570B40CE10D3F0CD9603BBACD5637E4D7E6158C9A7DFDCC0148018FF000CDE603B3CA6B31EEF25039027DF326F7757214D85F965D171A4E2BF2C99601BE3D3A65127231A9323576E9910C64A0C8D920C56A96AD0E58155D0035AE495FD83FF00CE337FEB37FF00CE3EFF00E6B6F2A7FDD1ED72618BDBB15762AEC55D8AB4DD315598ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8AAE5EF8AAEC55FFD7FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8A8F54702DC7305BD2695FD57E9424E2A898542F520E2A887914A15F11D71542A9AD452A7C7154BA7942494A6F8AA5D31323020D2B8AA22180135770569B8C5944EE8E411D28B8B6A1979198A114DBAE2AAF28F4D775E55F0C556DA71E4E7895A8C551EEEA829D7C062ABA08DA46240A0C55341198D6A472F962ADC13A92CBE99153D7161229DC101A06AFD19596704DECFED57C0F4CA24E5C198DB30740A053DF2993971E4ABE8947A7DAF7195B34F74A819650FD457A64496B3CD99C712CF2569C41A6C72B25B718671A0D9849148A139025CD84767AD58C01D5052847539496E8C7765768521A2952D4F0C0E66308812564340684EC3172404CE1734AF86282138B70052A7AEF4C5849368D948F0F6C5AA4B1C507DADB16D8286E7BF4380B9314744D4ED98A42551989208046F9590C8284C5BEEC810D810AEEDC0F6C8109972633AD4B5B765A9269D7234E3C4BCC24D39EE5DAA6B53D31AA72602D3FF2DE80AB74ACEA0EF5A530F139508BD86DECA389A3E294A0C04B394682747E08C7C3906B015ADA60E7885208DEB8B301184D462CC0404A18EDCA9E18B346D8802B5607160423FD440C7DB162434F32018B59096CD729E1B6374988492EAED549A0CB2326528B1CD465FADA3C4DF65D78D0E6CB049D5EAA2FCECFCE9D1E2B4D6AE233462E49047BD3377824F2BAB86EF96678C452C89D402733E06DD0E6145439004ED991170A4B8508AD29932C03741E19449C8C6DF25029C77C8863258789FD9C218A1D901AD053BE5A154591BB1A6495FD84FF00CE32FF00EB377FCE3E57AFFCAB5F29FF00DD1ED72618BDBF15762AEC55D8AB4DD315598ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD0FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF89F0E3D33BE6370B90957306400773B63C2A893C9057A531A5414B39AF107738D2A6360038353D31E154BB508584E08FB23BE34A81F41BAF8634ADD1B74AFBE3C2A0A32D41F9E0E14F1353B32CAA4277A63C2BC49B7C0D082CBBE3C2BC484A537514C785789A1148F22D477C78578995C16E91C4848DC8EB8F0AF122B8464531E15E2524B74120A0EB919041DD3B55548C6525BA2BAD1AAF41E3BE5127320CD6CD78C60D329939514DA35E681B8D77CA645927FA70008DBE79592C3AB2FB280C8E1E9B1E99025CAC4377A3E8500E6A4FD39592EC71C5EA7A75B5694E990655453A11716DB172F105648A86A7BE2E5008C8F614C58108849CD7AF4C5A64994539D8E2D5269AE0B122BF2C5B20A911248AF42712E5453D8A9435CA2412BCD011E195C83243CCCBE34AE564360404C418A403C36C8D32E618B5E219BE06DFC31A6B1043DBE9C88EAC57E795C9BE019569D6D142438503DF2A2E4C4D0653115722831059C8D84C245063E98B00142301771D7BE2CC05766DB16C010ACA64AD0D08C595226D548A8AE2C486D890C77C5AC8519588077C2C084B26734EB954CA46C92DC826BBED8C249914B48F8C0FA7365824EAB54762F867F3DA0FF738E69DBFA66EF049E5B56777C797AA05CCBB53739B5C6E833F34BD97AE65479B8325C3651932C02ECA24E441AA0C88632688184315608BC47CB2D0AA4C8BE1D724AFEBEFFE719F6FF9C70FF9C7E1E1F96DE54FFBA3DAE4C317B6E2AEC55D8ABB1569BA62AB315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB155CBDF155D8ABFFD1FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88C69196127AED9570B9096DAC8649D09D80618F0AB26963050B571E15484A8697C287070AA610308CD41AF88C3C2ADCF2ACBFB1F11C78556B47C63E5C7B74C78552891B91200E27C7052A6FA64609DCD70213292D95E4A70A537AE0295CF6C586DB64789544DBB12AA13EC9DCF8E08CAD53386D49A129C6992B545CC68AA03538F6F1C6D54EDCB4A695C6D5368AD893CB9F4ED913BA2DB9A42B48C0DBC72A945BA324C34BB33248007EA6A4D328945CB8167013EAEA13EDD7BE5243951927DA622C90056D8D4E52609326436500120402BEF95CA34DB0C76F41D3AD38471ED94C8539B8F15335D2217F500029EF95172E269EA9A7A88E38EA2A69BE066237BA6E6207E2AEDE18B91134E238D3BF862DE26AF1C7CE9BF1C549B5AABF11F638B4C8A3D361F2C585371C7CBE2AD37C52364CED5796DE180B7C7226491D3F6EBF4640B3E25B27C3DEB4CAC864248095B96F5A65526D0508CFB78E479320503E887979D694ED9599B6844B5B86150DC699519338A6F6E802019592D802776D1D5280EFE3823CD289766E3403A65BC2B6A28581A15A0F1C7859892282961B1DCE3C2DA0A998985487EBD4E3C2C81B5D1A322B1E75A63C2B24BE49DCB9DBA63C2D6A4CEEFDE871E16B2859A1928183D699465145318DA477AF242A0D0B1390894CA0878F9B3A9A54115AE6C7049D4EAE3B3E30FCFBB7923D45AE78F2AEDC7EECDCE1C941E53571DDF1B6A16ACB3C8EC69CB7E3F3CDBE09ECE8B34774918D0D3C333625C1986E95EF97736B6CAD3BE5320DD02B9412064445245AF1193DF080BC2B0AB02464C15E1586363DF1B5E17F5F3FF38D029FF38E3FF38FE3C3F2DBCA9FF747B5CB03597B6E143B15762AEC55A6E98AACC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5572F7C55762AFFFD2FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88D98A8B7639072125B39544C3E78AB27797F75F462A948156A62A88A30C554E163F584E5F67154E27E0D0D075A62AC7648CA82701546E95381285F7C8143339230D1864153DF2252A0A08201195211D0C695078D7C718F34A39A48047C76072C548AEC8E69C0D41EB8AA63A7C144E647CF154CE175AB8F7C082B1A1F524141D4E466CE2CA34AB6F488246F98F37331B2066569157282E4C59269F6CC5D4A8F848D865726639B34D32D97EB09C865322E6620F41855508551B28DB289976100C974992928A8DF2825917A04120E2A7C70B743927B6EDEA003B62D88958F93118B64516917100E2CC287A7F113E2716B3156040F9628E144C4B45DF7C578530B55EB812228A1CA83205B5425E546C8499452E7E54CA4B70429EA3C32259072FDA39410CC146A005699021B01B4CD015400E4086C0532B7978AD46301452792351CB76CBD00A2163E54DB61BE2CC145A41B74A571660AC922A0DB6C5B6254516BC875C5050BF54E4EE695C581287961E1DBA62D64A02694468478E63E50CE058FEA24BAA9032B8865296CA5C9A28E33C7AED99D846EEAB57C9F257FCE4246D0C493B2ECDDE9F2CDCE11B3CAEAB9BE25D56759642C050140299B6C01D0E61BB139012C69F4667E37026BD010287AE5E1A951BF865726C8AE465005722DA15D5D7EEC2AA9453BD3AE2AEE2BE18ABFAEAFF009C6BFF00D674FC82FF00CD71E55FFBA45AE5A39349E6F6BC28762AEC55D8AB4DD315598ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD3FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF87EBA9D962318514F1CA2DBD2086568E74237E4DBE36ACCE37F5223DB1B543A8E2F5EB4C6D51AC57D3E58DAA5F50581AD0D76C6D5305E4C8057E9C6D5053A108C08DBC71B5405BAFA73F20DBD712ACF6C6E8AA54A06DA943912944170E6BC403E195A15D2E022BD5474DB0412C76F2F19A4214D07B658AA96FCD8835E7E3ED8AB258A65861DE9B8E98AA5E977C653C68C09A9C5053DB39C33A92A0E426CE2CC6DD8351BA517A663CDCCC689854B5CA6F9417262F56D06C8488A37F63944CB7445A791C0F0DE2A28A8AF5CA497371067F6567249C7634A7DACC79173E316496561E8C80F224E524B221964638A281BED930D914DECE765A7C35C2CD3B81F93569D4E2D91473B6DD3166146353254D29BE285850F2229B62AAE8EE9B7018AA6768F4EA3AE2551ECCA83C72B2C908F286AED909328A11C8A74CA4B7041484006942476C052A51824824532B21368F8EB5DF61E390219829824818053B656436028F80A82141AD71884996C9BC4AAA011BE588053355AA29A52A77C5B01560CAA37C5982879248DC30AF4C59C4A0165547206F5C524A3519284FF375C5AC940DDAA052791C5812C62F1BE02C054A9E994E4512A414BC1EDD5C8A1F0C8C53C4E6712A20540420AE66E1165D76A4ECF9B3FE724B4F79FCBB1DD2C615947D91ED4CDCE10F35AA7E736A49E9BD1CD0F1155CDA61E4E833F349C0A0E43E23E199D8DD7CDD52DF115A13DB2F0D4D9A93D32B93645408F888AD37C8B6856403BB6154482B403962AA8154FED9C55FD75FFCE35FFEB3A7E417FE6B8F2AFF00DD22D72D1C9A4F37B5E143B15762AEC55A6E98AACC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5572F7C55762AFF00FFD4FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF876BBE87315C8485CF160DE06B8AB2DD364F561FA31555941018E2A88452D01F962A955584943E3B0C5538B771C77FBB156AE1D1D4A8EA70C552A02928F9E48A197589AAD3DB22528D63C72A4202EA7288287AE304B1A7959E5A7BE58A9D5BCAD12123BD3156E5D4491C4B6F8AA8C37039160D5A9C50591E9B745A5515EF909B38BD1ED5FECFB8CC79B998D3AB14E57287DF282E4C5ED7E598D43A46DE198D939B918D92DD411A5DA35075DB289173F10675A5BC7E94629BD331E45CF804DE8CCD551B786524B221388549550763DF2D8F2484DA24E00649926D6DDB16C8A3DFA62CC23ADE35E35F6C59D34235E67DF15A44FD5C374C569AF4590EDB602B4BDB91C8162A251B7ED909328A83A353AE525B8210A357A6053C9B58DC6FC71402AA0B1143B7BE408660AF5661DF2B219828BB695BD51BF6C88E6C89D936FAE84E35392620B23B5BB8E48802462D81AB89929B362D80A5227ABB0E58B3057AA826BE38A928D8CA804571604A1AEDD781DF16B258E3CF17C5191CB91A8CAE41ACC964482E3946A9B0ED8C42789A82CE732B2AA1E20666E1145C4D472795FE7CE96F2792E591A3FB009CDC610F39A97E4E6BCE5EF64A6C17E1A7CB3658DD06A39A5F08063DF3371BAF9B7407A65E393535C4572B9364541E262C48E9916D0B789185555436D8AABAAB53157F5DFF00F38D5FFACE7F903FF9AE3CABFF00748B5CB472693CDED7850EC55D8ABB1569BA62AB315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB155CBDF155D8ABFFD5FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF87BBB5531935DF31E9C863A543921B61ED8D2A6FA4DD324A200070AD2A7AE1A54E75173071F4C0656FB44E0A54C34F904B0716006DB61A54B2E222B72A00AA93D7052A342468952C41231A543955506452491B50F4C2020A1A83D415385871325D3E4F8B8F6E38299DA6373444E4BD7DF0708674C7EE1E4956941B1C1C20208A4BE38BF780B57E8C076502D386904501E00134E87236C8458C4B2C92CA6A00DFB640C99885A3AC80F4E466635076C788B194190E94DFBE06BDF2066CE117A759CCC4AF4D865129B9708B35F2E446F2ED44BB007F67283272A317B669F69F5495668EA76037E998F236E4420C87D2378E1CECC3F972B21CA86CCC749B3A471835AF7CA65172A136530C25187C35CAF80368926D1C2397235A9ED92029B446D328E20C37AFB6165C29A4302A01427E9C590D915C1586F5C520A362015401DF167C4E650096A9AE2BC48A85CED418AF1225959874FA3015E25AB6EFD5853293265C2E3180694EBB642526622AA2C95C7C24D72A25B4042B69D3A49CB882A0EF91E25217B5A3FECA60E363C28792D66542C62F8475A6478923642B46C3A46D8136B6349C3AF08CF23DCF4C40DD0648EB9B19446B21A863D874C953113455A7AB1A0E47638D33135D7771E9AFDADFDF1A6CE341C127AA58D7A0C04536C668E499D76FC7032E26A5BBE20107AE2C52A9EFA490F1DA98A0C6DD691722CF4E4D5D864A301269C9B328D32131373F4D4D7AD4648630A192470DBC70BCC8A0DC336E87A53333144071353C982FE6C68306B9E45BF515F552363C53C7369843CDEAA443F147CC3A4CB6DAC5F5B5C03188A4603E55CD96301D2651658DB22C5550DF2CCB8389382C415515CB9A0C5771CA6452154283414C900D814E445180AA9C6C4B71A6C3224A53058C507BE438D5FD727FCE36EDFF0038EBF9063C3F2E7CADFF00748B5CCA8F20D079BDA70A1D8ABB15762AD374C55662AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AB97BE2ABB157FFD6FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8749E4AC447B652DE9347F131A77DB1557B6AC3386E9BE2AC8AE5C5C427F9A9B62AABA7B98D4027154C4C625607BF6C550579CA31C7BE2ABA08CC916E31415268087C5AD34B4E51B03F462D8134B97E51FD18B68415AA076901F0C05126A5B602A5464648097CC484653D32B6C4A963A927C7BE565B62B91FD30E3C4E218493CD1A4E532FCF2126507A969FBBA8F1198E5CB83D5FC9B6D5BAE9DF292E541ED92A18ADD683282E54026BA2C2EC39B0D8644B7443D0F4C8D782E5527222190C71AF31B641BC04C52104834EBD316F8A67142076F9E2C9305B72698AAB0B638AA323B7341B62C9CF6C7154C2DAD136DF154E560840F703014851692255F88019410DA95CF7766A08E601F1C810C9049AA5BC469EA8DBDF2B21B0228EAD1488C88E3938F872045325B15C4951591720C11C2E55455DD597B8C55DF5AB56EC98AAEF5ED88FD95F7184319206EAF2071C3D41926210735CC7140A43D77ED8B20C62FB52E4E141F6C5B137D2C92189E8C36C05B2298CAC1109C8B3B486F2EC28DCECB8ADB1A7D7218A5E25FA75C56D33B7F355A5BD393800E5B02C08B4DD3CFDA7A2D0381F4E49908D2D5F3FDB199B8C808E1B0AF7CBB1C9C6CF0B4A0F9D67BAB6BFB49B7826560A0FBE6CB14DD0EA30597E74FE7368325B6B97B7B04748A51C811E273638A7B3A2D462E12F9DA60F1BA07EE73371C9D76514887015A83C065D6E21E6B7204A40554FE1841D99A9C9D701296E28F7AF8E564AA37A0CAED5FD707FCE36FFEB3AFE41FFE6B9F2B7FDD22D733A1F48683CDED39243B15762AEC55A6E98AACC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5572F7C55762AFFFD7FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8739D15050D6994B7A56838C8A53A72DEB8AAACCDFBCF87C7154E2DE86024FDA036C551B6EBB6E37C551F1CA237523B763EF8AADBF40F1FA83ED1DF156ACE5E30D0D3962828D58E3937A5716B5748B7A1FB23A62D817CA6A287718B68528488CB15EF80A24AE5CB0C8C9012BBB4F877CADB12C8C1DC0CACB6C50EC84B1E58B0927DA3C6038206F5C849941EA7A38F526507AD36CC72E5C1EDFE4F83D39B95329939507AE9ACD1A2D3E119417371F2659A55BFA70F151DB225BE219469B190429D88CAA4E44427D6EAED3053F6720DE032686D01A6C698B604D52D1788A038A5328ED8F15DB6C5518966081B7CF1555312203418B2433E2ABE3623BD3155579F82925BA024E2AC5AFF5A8F81A380720437304BEBDB89598A49F09CAC8641266B8946E646FBF2B21B436BAB4F1FC21CFCF2B904AE3ADDCAF499BEF394B05875FBCA504E7E938AAD5F30DE29DE7A62A887F32DC471971354F4A610C648287CCB712CB4692B9260190C1AB4D31285AB45A818B30EB6E7753FC7B8AF6C5B1E81A7C451197A055DB0499DD35773908DB8DB22BC4F3ED56EE5A482BB0AE2BC4F2DBFBB732B166A11E18AF124536A2EE4297240E94CB20CE25080DECB25217600F8EF8934D9619058E9FA9F2462599BB1DE9928CF76899B67B67A56AB7118528294EC3336191C2C98ADE51F9ABE4D9A5D3EF649E127D0879A353BD333F164D9D06B70D17E7FDFAC4CD70B30FDF40E4474D86C7BE67E2C8F3DA914972492301EA50B77CCC8C9D613BABAEF4AE025B61BAB2004D3240ECCCB6F12D2A7224AAC0FC7E8CAC9558F3B76A7CB236AFEBAFFE71A8D7FE71CFF2049EA7F2E3CAA4FF00DC22D73610FA47B9A0F37B5E490EC55D8ABB1569BA62AB315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB155CBDF155D8ABFFD0FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF87FBA8BD4048194B7B1D95BD16A1EB8AAAC3FBC353F3C553112FA6A476C553AB12255A8EF8AAF9E321AA3B74C5549AE015F4D8EF8AAC4AD76E871414E6D7B138B5A6C801E9E18B6042DC6DF3C5B52DF50A927C701449176CFEA353B646480985DD972841A74195B63152BC1C8EC0E565B62A4D4635F0C430927FA42FEF07EBC849941EA7A0445AE51BB0EB98F272E0F7DF2E22D40194C9CA83D12CB99611F5DF6CA0B9F886CCEB4D0C38AD3E8C89E4E44597E9F0FF00A415237DB2A939116530DA8F5850641BC06490460103C31649B2C6B4C551491B6D41B62A8D446A0F871569EDCD09A6E7164817B73BED8AA1243C176ED8AA4379764065AD6A08C55874D652DCEC95381B9520D0AE08355241C890C9171F961E43464A8F97F66565B0233FC191B293C7E2ED954F932E88197C9A00E998CC12CB8F2B8B78DA5E05F8761DF156297F6621AD206DBBD31563176EC6328B0B29AF5C218C90964D289B743D724C0335D3999E52A548F8716619DE89680B863D716C6573968D2918DFF6A980A4A4924C4F20FB7BE4516C475754653C37AD6B8ADBCDEE74C92791A83A9C56D42CFCB5732CDC1622E09EB4CB22764893D3347F216E924D1F1EFB8FECC848A99BD2EC7CA9630AA82AAC7AE40163C4CA6DF4AB5800E2829F2CCA84940619F99FE5A1A8F937549EDE1065F4986C3C01CCFC52D9D36BA1BBF1A35FD2CD96A5A84338E327ACDC54FF00AC7363864F27AD0C6648CC52943D466C205D213BAF4C9B978BBD156E393D0E36CA489BB4E2A3B57204A1219A52B5C892A8749F91A57A6564A1FD7F7FCE346FFF0038E3FF0038FE7C7F2DBCA9FF00747B5CD9E3FA47B9A4F37B6E4D0EC55D8ABB1569BA62AB315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB155CBDF155D8ABFFD1FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88FE09E89206F986265C86217D18790FE1928CAD5640FE91DF2684C42ACA093B8C2A9DE95F01A1FB3E18AA6578547D8D81EB91B4A41229E7CB2064847C0EA29CB718612B2829FC7E888EAA37F1CBA835A26DDD016277DB225B0284E19CD17A65664DA103242114B30EBD30192D5AAE9FFDE644C9908B241CE489D4EE00E982D980C4F50B52AC59453DF06CD8024EBC91B89EF9125B238C1E6C93493FBD51DB2B914F000F5FD094ACC9C45052A731E45B601EE3E5621A401B7AE504B9B08BD5ECA14AAB22D189EB98B3951765860299FE9502D15996AD90E22DE22199E9F6D1FA9EA71F8CD2A7236DB10C9E1894B82474EF8B626B144ACE7E793114A611464B713D3C325C2153A8E3000DBA0D8E0E10AAAC0A8DBEFC7842AAB0F86BED8F085B40BF5C7842DA577708E2DC0531E15B62F3E9EF2B13C490712026D1765A5246DFDDED9512BC4C892DE355A7015A656496C125C88A29F08CAC96F8C95C01D29D72B2CEDC638DBED2D722634B4A0F676EC0D23049ED9548522987EABA7C6C5FF74BF2A0CA49626DE75A8E99C8B462314AF4A61848DEE903BD278F4708F511EF5CBEC32E109FDA69C435553E223AE3B278598E9903C34EC3BE1B09A4E652163241F88F5C8C9B211058B5DFED6FD6B9149800C6258DA4675AD47718B510A967A6C4CFF147518B512CE74AD3ECADD59961018904138AC4B2B49232B420500F9603BA69689A388D176AEFD71A452256FA9FB59206992716CF16A9A65E69B3012452C6FCA33DFE1399FA736EA759B97E31FE70E94BA6FE656B564578DAA3B3431781A939B9D3879AD6403C655A49EB34E794A5882DD36068336511B3A1C9000AA00074DB2B9158121176E55483DFBE52665CB8C6C29DF5C301B361E22A62C6E6766AF235C9B02104B38434069878583FB10FF9C653CBFE71BBFE71F1BC7F2D7CA67FEE4F6B9B087D23DCD079BDBF248762AEC55D8AB4DD315598ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8AAE5EF8AAEC55FFD2FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88D8DAB09F719801BD8DDC8A4849EC77CB2294B5C736AA9CB1531B69285636FDADB0A19143FBB5AD7A60554F53D45627B602942BA77F0CA8A143D4DC01E38C0D154FE02C621E19719288A362069F3CACC9B045308E2046FF007E5664D822A7731064000E991253C2A7A7DB7EF3A64789908B2BB5B6AF30456B8F1331143EA7A627A65A831E26C1160A6CF94D41DB6C04B6C62CA746D3099936AF8E5722A43DA746D302F134DC65132CE01E9BE5C88ADC5076398F22E7630F63D1A20F22A1F1CC69F376388507A3D9C3C19401F4641B87366D610D29B6F8B6C53A4401C7862CD31B789CB123A65A392A610C3273C2AC8228C71507AD3155EF18A53BE2AD32EDFC715413AEF8AA19A307AFD38AB696D19EC36C0555BD140360065549010B22D180F7C810C8158401F3CAC86624B3991B9391E16C8C9DEB0C4C5B4168DC8405ABD3299452C72F6F1199878E6398A6AD875ECAA5C90054E400A4F0D2053E371B77C3C48643656C6B5A6D4DB1E254E12260BB63C4AB5A195C30F0C902DB89239AD253CBF56499C9237B57491B6A16C5A24995AC0C083DF16892730C8D1EC72405A225182E881D70F0B2B51376A49E477C7856D512ED36DFDB1E15B649A15D1127C3FEEC0CB4FA0E6660D9D6EAB72FCAFF00F9C90B196DBF342F66238A4AC493F7E6E74E5E73561F394A156460BF66B9B2076745946EA7FC72A996B886BD42A72AE6E643925D7331634C980892493DCFDA51DB6C980C4A56CE49D8E4C06A7F645FF38C1FFACD3FF38F1FF9ACFCA5FF00746B4CCD8F20D079BDCF248762AEC55D8AB4DD315598ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8AAE5EF8AAEC55FFD3FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88D880E040E87B66006F492FA2F88803AE5914A1C5B7186BC7E2F1CB108781585C46CDBAA9C2ACB15E3684803738154955A35663F6476C05285594BC9C6B55AF4CA8A157D052E2837C8F567109CDB3AA808D8993688A6B0C44B0A7D93DB2064D8229EFA01635A2D09CACC9B0456081581F86A720649E15D6F6AC1C7A6BC71E26422C9AC6D242D535A63C4CC4532BFD3CBC068B534C789988B036D34C731F82849C789B04597E8765C654257204B121EB9648B18400509198F32CE019C688A82652A286BB9CA497371F27B068CA81D582D0F8E5122E7E3E4CF6CCF29D2BD3C322DA39B36B4AF3F84D17B62DB14D56A5B03364368E811011BD284E5D1E4A9B200402A389F1C2A8F49102AEDBD3738AAE3221EA31543927715DBB62A82949036C550F473FB471556457A801A82BB9F6C555E458A31549BD4F639021925B35DB80CA2DD189E8DE190216D45EFA38AD889621EA53EDF7C810C4C92A4BB8DA29A46958B28F8129D72206EB19A0D2EA607D53C9D3F9299618B68CADB5ECB7069E87A71D3E2343944E0DB1C9691DD7EF83F01C58577198F28B609B1B78A560C492483F6B299C68365DA2ACEDDCC82BBE55C28675676A0AA80BF1531E154D52C588E98F0AAE5B1707A75D8E4A21B71A12EF4F2A84AAD0F8E58CE4C4E6B26939A96E2F5F84E2D1256787D2B16319E52C42AD20F018B449E6F79F9A5E52B099ACF51BD4B6B984F16151BE5916B2692D93F387C822A1B5B2BF223254BC4BED3F363F2FAE24A0D6D9B7DEB4C697899345E73F28DE11F53D5D2A7A02C31A5E2665E5DD574C9264F4F555256A428208DF2FC45C2D46EF833FE7278423F31E36DA482653507A13439B7D39741AB8BE3F6565BCB84635556345EC01CD903B3A2CA374422214625457B65536B8849677605E86832500E4C521B8B97527E3CB00625262EEECC791DCD7260312B94E4C06A7F64DFF0038C1FF00ACD3FF0038F1FF009ACFCA5FF746B4CCA8F2683CDEE7850EC55D8ABB155AE683E9C554F97B62AEE5ED8ABB97B62AEE5ED8ABB97B62AEE5ED8ABB97B62ABB15762AEC55D8ABB15762AB97BE2ABB157FFFD4FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88BB53C866006F5971082E0D3BE5914A16E00488FCB2C42550D19E83AD76C2A98DBC844BC3DFA6054E2E29F56603BD3014A4515564CA8F3423C5C0420F7A65726DC7CD745704B8232B25C9AB6490DEA22A6E2B5CAC96C8C593433ACB1AEF9025B04535B4B70E188A1DB20649E14FAC6C55985464789970B281A7848C328C3C4D9108EB6D3DA78DAA2BB63C4CC063B71A3137205325129AA4EACB4A68DD6829824C4866305B32B2023B663C8B38B35D1A03EAA6D9492E6630F56B106109951E6E6C59D69DF100D81B073673A6FC4AA69D7BE2DB14E917E3C59A7D6B6C48461D0EF96C792A751A711BE155C57DF157703E38AB5F4E2A849BA62A82798462BBD71541B6A616B5AE2AC7F51F31D9C1192CC63A77C910D8C02F7F30F4BB763CB520A57AA93FD99590C0B179FF003C3CB167270BABC593DABFD99590D04A47A97FCE48793ED2A91852C47C27DFEEC111BB59953CAB56FF009CAA82DEE78DAC21A3AD1401FD99710C2390DA5F27FCE4A6BFA821FA8D89E0C09E407F665120DF1C858D45FF00391BAEDAFAED776C556BDC7F6663C839519BE91FC9EF3EBFE61426231805D4B961ED954837C256FA2AC7437AA9E3F4655C0DCC9EDB4C78CD48C3C0A9DC160481515C1C2AACFA79A834EF8914DD8D0379A79E1F7E06526177962A03963C585787BE2D1248D61963B1D453ABCB1B08FE74DB16893F32BF313F293CFDA8F9AB50BE8209A5B79A4668F8F402A7DF32314801C9A64C462FCACF385B6D73A4CF2D3BF13FD725B215D7F2EBCDF34CB1D9E893C751BB713D7EFC7657A0F977F243F30A7991E4967B343BD09A7F1C695F5FFE597E526B1A5DBC6DA96A0F34CAF5662D5D89E9D7251E6D1946CF1DFF009CCDF253680DA3EB11356474EBDFA1CDAE9CBA0D587E7F593C9373965D9DBAD73640ECE8B28DD16A7E07F1ED954DAE218BDCDC0124895E8694CBB1F26F88D9239EAE4E5A031921F8D065803595226876EB9301ADFD94FF00CE2FFF00EB347FCE3BFF00E6B2F297FDD1AD32F1C9A0F37BA6143B15762AEC5563F4FA71552C55D8ABB15762AEC55D8ABB1554C55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD5FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88D8294F845330037B52D4B29AF7CB2294AAF6BB8CB152D8D5830A547CB0B13C930854870DBD7C72122C2253953585ABBE54496C4A1BFBC6F9E441552641238567283AD7F86322299E306D98F967CADABF98AEE2B5B3B62C8C69EA01DB31CC9D8E385BEDAF227FCE2EC17515B5D6B32155900A293FB5BFBE5129B9F8F102F43D57FE716EDA2B988E9CF5403EC76FF89663CA65BBC10F25F35FE476B9E5FB932C687D193E1555ED4FA72066C7C10F3E5D0750B0B8F4E5571C4D0D7009A462A6616D632491014AF11BE59C4CFC20BCD9DC4428B551ED931309F0D012DB49CD59C50F8E094BB94C02636B1134F1C8711699C53368A452A791E9B60B6BA65DA0C94750C706CE442DEA763229E15DF289F3765879334D35C55476F0C8B7B3EB023E103618AA7D18AB0DB02DB27B16F8554F6197479330980DDC006A3C30A551862AAB18046E31545718986C82B4C585A57716ACD5E228322B691CDA75D716F8493BD32B2516F3FD674BD4DCBA4523A73040A1E99124A5E3BAE7E4DF9C35F467835BBB8977AAABD3F8E4F88A402F1CD4BFE71BFCE6F3D06AD732B576ABF5F9EF82D9D16357DFF38C5E757A97919DFF0098FF00B78B218D8A5C7FCE3179D43F22BCCAF4AFFB78F2639310E1427FD0B379CC48ACF6EBB1EE3FB720723891C459FF00973F203CD715C436F39F4A0604391B536F9E4253722185E97A27FCE37581BC59757B812AF2ABC2C6A0EFE15CA8CDCA8627D4BE51F22F97BCA10C49A3D9C5048ABC4B462808EFDF2A9CB67271E3A2F52B68AA828287C72102DE629D5BD9B4AA07877CB835909BC569E9815CAE4C0AAB428C0D08F837CA81B402424B733060D18415E95C2DC0B0ED474F6A973B835A0F0C5B0C424F1C216A196B4C5A6710105736314EDCC205E1B103BE0B21C59C2F9249756B69103CE352464F88B5F865298A6B78A5A450278D699602BE19661653F35154070DAF8659369F7D0DA144745FF4821547BE46CDACA1B6EC37FE7263C99179DFF2D64586D926BCB088C826A55C0E2C7AD7365A693A4D5C03F119A136BA9CF6922F131C8D191EEA48FE19B8C727439318B5194888DD21D890787B6DDB26402B080616EB44AB6EE6BC98F5C9844A21047ED1CB034C821DBBFD3930D12438DC9AE58D25FD957FCE2FFF00EB347FCE3BFF00E6B2F297FDD1AD32F1C9A4F37B9E143B15762AEC5563F4FA71552C55D8ABB15762AEC55D8ABB1554C55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD6FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF889B535CC00DEAF28EF9645528BA1C8E58AA10C60B8AE2A5181789C045B590982FF7669E191314829431FDE36532D9BE22D52D2C9F52BE82D233467351F466365C941CCC18ACBF49BF21FC950E9D6105EDCDB2BD003C88F9E611CAEDB1617D71FE2ED0B4B8E21385E286813C0E512C8EC71E057B7FCCAD0EF6EE386270A76037CA2591BCE165F7369A4EAD6CF2CC527122FC209AD32BF111E03C475DFCB0B2D424966B78946E69B63E22F80F329BF2DEE609654856A17ED532D195071525571E49BB86BCD0ED93191071A437BE567442CEB4206DB6113B6AC90628BA7345395F7E98789C5945329ADB8462BD69D71B6BE156D224E33818F137462F48B49887515EC32B917618850679A4C84B2FBE06D7A3E9CDBAD76C5594DB8E4C3154E6D5C89197C32D1C9984DE13571852886FE38AAAC7D3154C228BBF638A6959A21DC74C82D21999882380CAD692C9ECFD53BA0A9DABE1919288EEE8ADE6B65F4924EA29838DC8F0D092DACA8793C8013D1BC31E36631A5773F003CAF01FA4E3C4D831B1E96F2047DEE86DEE72139ECCBC2B496EF568492A9722A7E798A7228D3282B5C489EAC373561D1413959C8DD1D3A274EB7964B80D2C859ABB2E40E46E1829E8D6914CC1226B6E117FBF48C8F1DB2963A65B6D6E11176AED96C0B5109D4238A82075CBAD810ACFCB8E5732D6425CED22568763D72B896043A38A39012454F8E49B6297DC5AF21257A0FB38B7249FA3958B6DF4E2D3916C1A423ACBCBB1DB22538B1F131ED53CBE8FCA87AE20B6F82C364D0258A60231C93A93938C97C047C505C5BAF43B6596BE026B6B0C976D645BED452127E583AB899B1D3D3AD2DC6ABA76B1A6CC39ACF6C63507DD48FE399D84D3A3D5C2DF87DF9F7E50FF0003F9EB50B20BC6970CF4A7F3B31CDB6296CE872E3A2F1CD4855D641FB4BBE650DDC7E4C4AE362C3C32C6322969FB67241A64876EFF004E581C7921C753963497F655FF0038BFFF00ACD1FF0038EFFF009ACBCA5FF746B4CBC72692F73C28762AEC55D8AAC7E9F4E2AA58ABB15762AEC55D8ABB15762AA98ABB15762AEC55D8ABB155CBDF155D8ABFFFD7FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF889B360BD730037A3E4A1E9DB2C8A529BB42C76CB10A50AF165A8A625211B55C622D8494E52786C77A8C998ECD60EE83BCF8AE9388A506F4CC2CFB39F845BD1FF2CB493A96BD68047CB8CAA6B4ED5CD5E59DBB7D3E3DDFA93A3D8B69DA6DABA0F4D1211555D8663176D8A2F2BD72D751D7353962B3321084B1504D32893B1C71D952DBCBBABE9EA26657046F5EF98F26FE009EE8DE78D5B41BD1CCC9344D45911892001DE99595107B868DE79D1B5B31AC92FA5310014069BE36930658D6A8E1DD40E128F81BC72C69945299F4A421AAA0D7C46581A0B0DD574359012117A1ED9312A6A9C5E51A9E83C2524201BF618789C69C58F5D69DC410476C789AB85274B5E126DF0D0F518F137C22CBB4752028356DFA9C376E5C0507A4E974053B7F98C2C9E83A6CA15803DA98AB288E7008A62A9AC2E480C3BF5CB63C998E49A42E69D4E14A395BA62AACADEFB62A9BDA5D536206D8B35F7373CA945A5720B4840ACDD09CACAD221232BD6BF3C84CA62375D2AF53D0E637139A12B9622FF0D49E5B6F8789B404A2EB492CA69DB071338B1A9BCBCCEE47106BED919CB66D88DD47FC2E3FDF43EECC4B6F115787CB8D1C8A40200ED902590A661A6E841543155A8F6CA8A788271E97A478D6A3C3082899B08E801D854E5F02E3109AA82A0153990C4869A471EF954CB590A2D2B32B0200C840DB54C25A4B89050903C32D6714C963F5A3DCD0A8DB16E4B64B295492010B5C5A72289825D8455A7ED655334DDA734BBEA32CA28687E782DC9E2583494460B201C9B71F2CB014F10448D060906EA3EEC9028E25F1796914F258FE9196C5C4CC2D36B6B45B53B2B03DC8EF97E39EEE9F518DF9A7FF0039C1E5223518FCCD15B8F4EE295217F9797539B2C32743A8C6FCE1BE9B8832EE55968066CF13AB9ECC50124B549CB4B594249D4E48354940F4CB038F2511D4E58D25FD957FCE2FFF00EB347FCE3BFF00E6B2F297FDD1AD32F1C9A4BDCF0A1D8ABB15762AB1FA7D38AA962AEC55D8ABB15762AEC55D8AAA62AEC55D8ABB15762AEC5572F7C55762AFFFD0FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88089A86B9801BD338CD40F1CB22969E30C32C420D8713B6291CD6D4E4A00B1C8B58D46E69979AA681CD40FC7331F019ABD4BB4D353E9EFF009C74D21751D692A952B535A78669C9DDDDE101FA397F6CB6DA3D360563A01DF2120ECB0B7F96FE5B8F503777862ABD08AB0EDBF88CA661D96309BF99F4A3043246918E9D8663C8373C0752D0F50796436F096321A37C35DBEECAE99458DCB65AAF96E48EF4A4B50C0D02B78FCB101127D05E48F375D6BB6612E418CDA850BCB626B4F1CB0071E6CFEE66658C7BE594E34C149A525D1AA3AE46450030AD4EC83B31A6F91DDAA51613A958D0F4A6DD71DDA845864B6A56423EFC6CB7C629EE92854283D6B9747937067DA79A32E4959BE9FBB8FA31564A83718153C85A8A9F2DB2D076660A6B136DBE1B4A354EC3F1C2AAEA4D3154742E148AF862DC119556C8324C6DE256A74DB2B28559630B95CF92421D979661B900A87A7BF4C0CE25B30F2ED8B60696C4160481B74C05B224DAAFD487F2D7E8CACC5B812EFA90F0032042D9575FDD0E23E9CAC861C454DE124FA9D7DB214CA3225673F4CF4CB62C885C353111AB6E3A65CD65506A91C9DB2120C0B6F771D36DABD7238F9B44D0E675AD69972628BB797D571C7609D716F64B58A587871DE98B4CC162B7F21D31F8769872194E45C7612F87519A46A274F6C886EE229B44E646066D9874F96482F116416C22E23A64D788A756F2AAC4151030AF5CC989D98917BAA344D37488610E0E78BE6AFF009C9CFCBF4F347E5EEA73BC5FBCD3E2661B54FD963E199D824E83541F83FAA5A1856F216D9ADA5650A7AECC7B66EB09D9D0E6D8B0FEA58E5E5AC1D9072F7DF2516B9287ECF5ED96071E4A2A773963490FECABFE717FFF0059A3FE71DFFF00359794BFEE8D69978E4D279BDCF0A1D8ABB15762AB1FA7D38AA962AEC55D8ABB15762AEC55D8AAA62AEC55D8ABB15762AEC5572F7C55762AFF00FFD1FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF87EB35F7CC572138A74DB2415A634196054B67900E44E487355B1CE38D2B96EC8282B9AB74F1CA665880A912F22CBDE99ABCE5CCC5B3EEAFF9C4EB113DD988815E25AB4DF6CD69767A626DF647999435D5A5BAB1D880403FC32B93BDD3F37B97962CD6D34832280ACD0EF414CA245DC621B30AD5A77B849A302A6A77CA2459494B4AD209812478C115DC951FD32316A1CD3AD5F49D15B4D91DCC3EAAA134655EB4F964993E64BFF300D235631DB30085C8F82806C7DB1453D5F45D7E4D52D54D6A683F56147084DE0BB3C9C4B4DB619645A728A49EE7799DFB1E992A68A627A944199EBD4EF8D2D30A9AD944BF3C6928AB440B28A61566BA79A30C559A58BFC43E8AE2A9F46FF10C55388EE00551E191BDD04A3A3BAA8EB8414A363B91B6FF003CB1B02312E47CE993661328DEB43E3DB16E099C4E38FF000C82A2606A656528D2A5C0A75C84D5BF4CE6310DA1A2877C890DB169537E99590E405754DC572239B656C98C511A74AE4E419C10D7111A1F7CA64E4001085780DFE9CC793090097CD7263A953F17860873681CD26B8D4E58EB5A6F97AC92A7BD9A405877E9938B4C9AB7BC9D09CB29A095433DDC8E4AD7010D68F82EEE0515D6BEF819C5368272159E9C69DF16F82223F307A4425457A62DD1016DF39D5F871FB4A28299092C804A6386EB4B928C84A9EE722C53D86EA3640CFF0068E2A98DBCF0D462A9EC13D221C3ECD76CCBC5C94A6B67744115CB1C2CE16F9AB4B1E63F2E6A1A4900FD7A090014FF00248CC9C45D06AE0FE76FF3A3CA4FE54FCC6D7347652AA9348C05283AB1F6CD96293CFE68EEF03BA6FDE483A10732E25A2B648E7152773BE5C1C69F35315000AE6445A96E5A036C407F661FF38BBFFACCFF00F38EDFF9AC7CA3FF00746B4CB43833FA8FBDEEB8B1762AEC55D8AAC7E9F4E2AA58ABB15762AEC55D8ABB15762AA98ABB15762AEC55D8ABB155CBDF155D8ABFFFD2FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF884B31D2B98AE426E47C3920A8694EDB6F9605482ED982BD01AF864952E86670D435F961B414D50730396D909A0370370B8907B7539AECCE5637DD7FF388F76A359642E05617A0AF7CD74C53B4D3737DAD359B5DEB30730410C280E63C9DEE9F9BD5EE3513A558B2745F4F8E5327718B9304B6D4629D679188EA69BE63C99496DDF9DEDB46B231B952D355547707C72316A1CDE15E63F38EA77F2C896933047A8A2939364C22DF48D42E6669E7E72173553D7157A56853DCE9A1622080682A715672D70DE9A3AB862FB900D72D838F991729E56E186EC7A81D726D2905FC25CA9FF277C558B5CDA9049A6D8AA95AA71931565567B32EF8AB2BB37A11BEDDCE2A9E46FF0010A9C55358CD40DF21D58946C792641191E58D811B1D6993661368998003C316F4D6273415E990423918D4532B294EED8065DF6F0C849513C465242789A2828720437464B553C7AE4087263255A002B4E9910376CB454520E3D69ED864DD0536219C0EA3C7289736F082BB1C50D3AF8E63C98C986DE4AC3950EE0E087368EAC3758BA99281493F2CBD125897130B346FDA66A11938B4C9111C92B15A6FEC32C0E396596B6D298D0AA924F51896B45C92C36A959402E3AAF7C8B6458E5FF99A0A18E21E9F0AF3AED8B7C5875C7984090BF30057662716F8A79A379A8C328726A95EBDB2052433C9FCC16DA94694515EE46458F0B514913505413E0315E14EED0C408E5F0FCF6C53C29D2CD1A2715229D46F97E33B302AD6F78A1BA81F4E4F89AA70B09B5AEA9CAE91030658C153FECB327149D36AF13F22FF00E7387C9B168FE686F3446800BE6259C0DAA6BDF3618E4F37A8C745F9A7786B7136D4F8B3638DD7C85256E09ED9787167CD408A66445A9665A1BA2FECC3FE7177FF00599FFE71DBFF00358F947FEE8D6996B813FA8FBDEEB8B1762AEC55D8AAC7E9F4E2AA58ABB15762AEC55D8ABB15762AA98ABB15762AEC55D8ABB155CBDF155D8ABFFFD3FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF884B33D37AE62B909B337C24788C2150E57E1396854A665FDE0C4AA4F29A4D5F7C802828E0F545DFC36C24A02E97EDB53C33132072B13EABFF009C5AD5E3B7F345BC6ED40411BF8D735F986CED34BCDFA88F12B6A36578375E20D730A4EF74FCD11E719DCE8F2CD16E6BC49CA64EE317278326AB710C14E5BF2E998F26526317AF79AA5F3210480A29918F36A1CD97683E45BBB86599E33C4D0D48C9B27A641E5FB0D360637340C47C18AB1BBFB6B494B7A43A74C550FA4A869DA222841A0CB60E3E6667058D09A8EBBE4DA503358061257F9B154A27D257D36FE98AA4034E546229DFAE2A9D5B5B22815C5536854290A3A0A62A9E47D302A2524A151E191EAC4A670CC7EFC90649847374CB1B022D26AE4D984E6396A06FB5316F098C6D5A64109A44C2A32B294D216A50D76AE4648298FAAA76C890805BE55CAC86D896F9656439112E26A322DD12A65C0EFF003C8C9C9C6D7D657A65126F086BA9818CF8E63C98C983EA32F10EC3C7A6087368EAC1AF2F19A4A7865E8936B7C562A1DF261A648ED37518849CA4DA996071E48ED7BF31F4AF2D69F25D4AEA0A834AFB62583E6AD6FF00E7226C2732CF030660C40A1FECC8B38A3BCB7E7A8FCCF6F73717527A224A7A5BD2B8B7C53237D1CC5E2AF348F7AE2DF1627A87E63C76529B0869198F6A0EF902D8032DF2B79D6FEEDC0E478B7BE4534F6FD0F5096499096DCE2B4F4225E5E1F175C5691261936A4DC76E95C9034D13E6EF425FF968FC71E26C10B08CB698D9D02B739240791AE64E29381AAC3B3E3CFF009CDAD163D5FF002CA3BF02B25A30634EBB54E6C71CDE57578F77E2BCF2195DE43FB44FE1B66DB0F27479051428EA3E79921C39A1E41B9F9E6445A90A577CB83745FD98FF00CE2EFF00EB337FCE3B7FE6B1F28FFDD1AD32C7027F51F7BDD7162EC55D8ABB1558FD3E9C554B15762AEC55D8ABB15762AEC555315762AEC55D8ABB15762AB97BE2ABB157FFD4FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF87DB371502A2B98B4DF69C13D01C90554E3B7D19312094A275F8FF005609482B1EB8DA6F964225055E3625900049F0C9A014D110167327C238EC4FCB31F240B938E41EA3F935A8FE8AF31DB4AB2846332802BD413D7303340D3B3D2C85BF5FF4FBEFAC6876376AC1C7A43E319AF90A77DA722D34B906FF00CB573DDC3120663C8BB9C4367CFB35ACCF70B0202CDCF751D466392999A7A8E81E5AB7F53D69286408A48F0C62D319025EA16D3456B0085221D280E499DA4B7BA7C9A99268691EF418DA5E5DE60BA83439191E550D5FB24EF82D52DD0754FAE6A30B28E20FE396C0868CA1EC8564540C632011B31193B684ADC1624914DF738ADA94F1A985A8C09A614816C6CDB92C4D3BE282295046CBD01C55150EC77FC7154F22208EB8AAB2005AB9162533840A75C21923E351B64DB0146C69B64EC3208A89CF2A5698DB784EA17D86F90B54D616AD28722529AC6F414272242AA2CC01153898B0E0368F4DC546FF002C818B6C415F46F7CACC4B9116B953A9A7CF20634D91284B89000486195483978C84A4DC7C62AD4F7CA241C805B966AA1DFB65120C64C33569F843235413D86463CDA3917973DEF2BA615AEFD32FB6264159AF9A12ECC85815D864E2D5229249E6048924DC230AD01EB9686821F337E6C6A3ADEBF6F1D8D8A4A07A8DCD97B838086145E59E5AFCABD62E21ADDBBAF26E546FA0F8E459C43E91F2CF96E2D234B68AE18C92C207A2ABB9F7C69BA3B2AEA725EDB594AF65138918100537C5B8178FE9DE5BD66FF547BABE57ABBD547B64241B4483E92F2CE8A6CE18A886A06E70527883D934189F9AB73E86871A5E20F4069278F8904D3C7052F105C6ED89AB392DED80DB44B9B5F5BFF29B23BB91090554BE113C4C5AAA55AB5EDF3CC9C4D3A88D8D9E47F9E9A41F30FE5579801AC92C51B32C23AD02935A66C71BCAEB31905F8377711867B8848A18A46047FB239BAC3F4BCCE7152418076DBBE65C5C19858EBB9DB2F8B4A1580CB04806E8BFB2CFF9C5EFFD667FF9C76FFCD63E51FF00BA35A65A393813FA8FBDEE9858BB15762AEC5563F4FA71552C55D8ABB15762AEC55D8ABB1554C55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD5FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF874B265328CA593246507853C72259C513C07139596D0935D28562721D5279311BC929375CBA1C9A24BE0B90268E872F8F26013B9650F1EE72126FC68DD12FDAC351B5B98DB8B472015F6CC2CE36761A73BBF5CBF267CCA9AFF966D6D24903148C0A66AB287A1D2C9EF3A5AA3C9FA30AF10FBD735D91E8714B6615AEF96C695E6084C43E0998548F7CA29A739B7B3E89E598CC6B3247EA19D0034DE996403878B9B2EFF095959C5F5ABB70AA054A9C910E482F39F3AF9B340D26C192C028B85560E57B900D32B21982F8EB53D425F345F4CD2A91463C09F9E565B014C740B2D46CEEC39AF18D870F964E0C66FA4B4DB8379651ACB27C400D8E5B17166956A21E262886AA456B9634F54B2332383B6581C8835E9301B8DF0144D690475C0C694FF6CE2B48F85C01F2C569188D520D698AD2650B50628A4D633D314D23636DBE58A8B6D1C73A62E60E49A44FD37EF8A53BB6906D8AA64241B6298F36CB0241CB9C9149B5ACC1471AD2BB656BB2600823AE40ADA1A7038B37865534DA493C828731CB740A4B3C94AD3AE51272E054DAE1BD322BDB2892C8B17BEFDE73E7D32B71E658826968D7264A7535C21A2D327D2BD40401D475CC88AA42FE528A69099146F99015747E43B157E7243EA03D0787E38C92194DAF9574C8900FAA8DBDB20C9CFE5AD3CCA812D40F1DB154F57C91A75C45536C3953C3FB714A4375F9736C2559628F804EBFE75C8948445AF97520223A74C0A9FDBE962CF7036AD4E2A9DA32BC746C550727A49B03912CFA2025B845DAA3DB20D40EE827B9574702868466463E4E55EC93F9C6E3D6F27F986253F11B4947FC21CD962745AE2377E0879810C7ADEAA87AACEFFF001239B6C3C9E3B55F594A17F8E67637026B24077FD796171D02EBBE5526E0FECABFE717BFF599FF00E71DBFF358F947FEE8D6999D0FA47B9D7E4FA8FBDEE99260EC55D8ABB1558FD3E9C554B15762AEC55D8ABB15762AEC555315762AEC55D8ABB15762AB97BE2ABB157FFFD6FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF861D3DE432034DBC72964CB565278537DF2259C51C6600152C2BE19516D093DDB13CBDF23D5279308D403ACA3623C32E8726892193D65742548F039911E4C03258F9B415E276CAE4DF8D49039755A94A1AD7E5989945873B0BEE7FF9C71F39AD95CC3652DE0EC3893F3CD7658BBAD34E8BF49F4D9C4C12F512944AAC9E39AEC90779872A6B75045AA442EA420CF17D95EFB653C2CF24AD9FF94B596B3B6953D1FAC49C6853BA8F1C9014D111458679F7CD173E94886630F20691FDF890DC0BE62BB6B9D42E984E8E6366F858F7A9C810CC1645A779360216644E04EF9510CC1640DA298978C49CDA9BD30C42C98F1D46F6C2F56DDB946A4F4CB22E3CDE84B492C83BB0666DF2D69EA81876276DB261C88372321620900D3A602C8A0E414DFB604521F73B8FBF15A5652C3A0C5691F1F2A2FEBC56933849A5295C569348C9D85715A46AB506FF004E290162960DD3E9C5BC724C627A002B4F1C529DDB38DA8698AA6AA4F615C5239ABA1EE72E6DB541280CA396F5DB2056D324B903E127E2CAD6D7CF23189FC29D72A9A82C7AE255E81B7F0CC72DF0293DC39505A9D3289B95028069DE9D0D3C7289A494AAE999D08A6F5DF2B699157B5B55600D37C21A93AB6B3ABD38D76DF3222AAB3D8AEC547CF3202A360B3429B10580F881C64C8223EAE9F6792FCB20C913069A240EC08057ECE2AEE735BBF02E062A8EE64C4C18862DD32254242E8166AB0A6F812A978C161AFE38AA412DD98E062AD52062AC4DB54B862C0D46E72126CE88492FE43B16A6443472288B5B8E714A7957A664636F32F4A035894C9A16BEA4D57EAD257FE04E6CB13A0D74DF86DE6D503CCFAE85DC0B96A7DE736D8793C9EA0DC98F053E199D8DC19B9CAD3AEF96171D06E2A76CAA4DC1FD92FF00CE2FFF00EB347FCE3BFF00E6B2F297FDD1AD333A1F48F73AFC9F51F7BDCF24C1D8ABB15762AB1FA7D38AA962AEC55D8ABB15762AEC55D8AAA62AEC55D8ABB15762AEC5572F7C55762AFF00FFD7FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF85DD35C96DF2964CB6023E1F9E44B20BA47FDE1DFBE5526E081BC7A2935E8323D527930FD45CB4887BE5D0E4D1253673CE1073223C9806516854C237CAE4DF8D12618E343336FDB31E4E66366BE45D767D175482E623455606BF7E61E58BB1C137EB17E5579EA1D734AB485E60D23280457E7EF9ADC917738723DF2D678ECAE638E75062946C7B6F94F0B9B1DD1535D496978CF6BF0C53281B63C283B21750D223D6007B800D7C7224282803E4ED387A4428AAE4086C05192E8F15BC5C621B814C810CC1632F697AB3858A22EA7A90322366576C7353F2BDE5CDCA4E632287241A26C820B0921B658DF7232D691CD4A5B431C6C476C9872209210DC8961BE02D94A72313B605E15200814C5695D6BBE2B48D4278A8F6C578531B76E9B62BC29B420938AD261E9B1FA714D2F119FA462D815D63DE98A53680D0818AA6F149414EB8AAE6980D89CB99F12D5605948EC6B5CACAF12A7D6292EE77C815E245CD755888F11954D416352CE7D43ED98E5BA086B89B92F1F1CA66E5C4A5D24C146E731E4A4A57713165F8776AE56D5229B69DCDA95C218B2AB5421AA4F514CC88AA37EAE5F71D33202A8C917A2373C6BB63264103FBB06A64A78E4192610DD451A37192BE3BE2A96DC319E4E4B21A0C551714AF1B202D514C894847CBE93A87D8918158F6AB72681074A74C55894D73C636538AB16B9999559972326D1F4A4C2EE477A1AD322E393BA716F70638580EAC4664636523B286BB2341E5FD79D8F10D6B21DFFD439B1C4F39AF93F11BCC8E24F30EB0E0D435C3107E939B5C3C9E6729B293667637126A2CB5AE5A5C7502BBE5526E0FEC8BFE7183FF0059A7FE71E3FF00359794BFEE8D6999D0FA47B9D7E4FA8FBDEE79260EC55D8ABB1558FD3E9C554B15762AEC55D8ABB15762AEC555315762AEC55D8ABB15762AB97BE2ABB157FFD0FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF85EB109D5771E394B24EE19497451D3950E44B208D724C840F1CAA4DC1037B50A4378647AA4F263B7B18AC6C72E872689206EC51A2653D32F8F26B08F82E48A440FEF295E39093918D3FB23F595759AA225EA7FCAED94172E299412FD5A2223FB75F8328C9172B1CA9F48FE507E663685756D0DE5D985C90B1A13B577F7CD7648D3B4C3983F4F342F325A6BDA35B5C3DC235D7006300824FE398C767698B202C860D46692358E54A18B704E0B05BA62D35B6BD77DBA0C890C63128A79D8107964086D102AC932B00246DBB9C898ADD2296EE2B643E8C425E5BB31ED95914CE3BA167D4A2991B946108F6C431940B13BCBC049111AD32624D3E19B4ABEB13382AC2993130DD114974E3892186F8DDB6092041DCD46D8AF12E6EA4D36F1C57897091456A715E2565993615C578C2656CEA69EF8AF104EEDA4407738A6C27B132151BE295540189A62CD1023351B7D38AA24232D0914C55148DD29D31559373AEC32DB544DB9A0F8BE9C812869C7C7C874F1CAC94B6F229000395CCDA84AA68DB996A6DDCE63B7C36414CE95A577CA66E540A45792D09DEA331E6C88B41C2FCE4006E7C32B6B9448DD9259C81283A64C45AF8939FAD3715E0475DF2E0BC4135B7BD2A9566CBC49788295C6A1137DA3CA9D4612CE26D8F5F6A9044A5AAAB4DF761FD723C2CE982EA5E7AB3B105566524D796E36FC71E15A63C9F9AB6B1D47A8A5BE63FAE34B4A4DF9AE92238128592BFBB507AFE39190544695F99324B308EE25A027615FEDC8D26DE956DA8C1A8C0662D56E831A5B63BA93FC7C23A927B531A543456723C3FBD4A313F86464D8262A90ADA70462426F91693024ECB5ADCAA0929448D8733E19763906194F0879FFE736BA343F26EA571EA7A69776AE96EDFCCC54803EFCD86298797D76404BF1AE617524D2CB74BC6791D9A415AFED1CDBE290AD9D1CE24EEA7C18F419990C81C498A5AE8C06E2872EE305C7A52E058ECB5CACEEDC1FD8DFF00CE308A7FCE35FF00CE3C8F0FCB3F290FFB935AE67C3E91EE75D93EA3EF7B964983B15762AEC5563F4FA71552C55D8ABB15762AEC55D8ABB1554C55D8ABB15762AEC55D8AAE5EF8AAEC55FFD1FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF85BD3BEC652C938B6FEF53FD6C89641399500ABE5526E090DF3B32B11D40C8F549E4C7AFDE4E31FE397439344905217668C78E644793584C2C406BA27F9475CAE4E4637A6796B49FAFD95DBA0E455AB94D5B951E4C7EF266B5BC6B775A50D304A2CC4D7C26EBD7496194C7E97C48D5EF985931B918B23EA0FCA5FCDFD5B48BEB6B6D4EF19AD9481F131A537F139833C4EDB06601FA51E59F3FF9775DB2B764950C8CA3910457F5E53C1C2EC6192DE8D0C7672422789AA08AED91B72E050F34C84A88C74FB59025BC6ED2C8DF3F0C899354A289496A8CBD2BDB21236CF0C50922D011E390A6E314BA4B22416A634D44255246633BF638D3021033905B7F0E996C5ACA0682B5C92AC734247E18AA8337BFCF1572B74FD78B594CEDA6A0A62D914EADE652462CC325B6605462D89B4282A3BD71668EE031558ED8AB68DD3C3155772A77C9AD2989950100E56534A46707A9C84969A1254D474CA8A40DD648F5539516D8A4B350354E5126F821258048390DC0CA26DF14B638945C71E5C4D3AE463CD728B8A6358E05E4641B75DF2C70F850ADAC5B16E0660BC4D6B5C9C53C0D4FE71D2ACA2224B95A8F7FEDCB578581EB3F9B1A3DAC4FC640C4D42D3C7EFC945B2029F38F9ABF379DE597D19DD63A9E95FEB926C7906A1F99CD71EA52E9AABD4127FAE2AC557F301DE46ADD356BE3FDB8AA656BE75BD915E4B79CB2A1A36FDFEFC8C9059D7947CED24B7F18BB6661C803D7FAE455F61F973CE960B68891EE0EED5F1C559347E6182E6752B106A9C55939B95940658F8823A64486A3CD0CEF5AFC19590E4C64A2FE9B2FA4C2866EDF2C9C22E0EAA5B3E40FF9CA7F308B7D046911BFC71A9F86BF3CCEC71793D61DDF9A864E681D8FC4D527375861E975929521B91AEDE399020E26492E33A13C5B7236CB40A68B4D2CE28A4EAB9600DA0BFB03FF009C6A017FE71CBF2000E83F2DFCAA07FDC22D73363C83AFC9F51F7BDB324C1D8ABB15762AB1FA7D38AA962AEC55D8ABB15762AEC55D8AAA62AEC55D8ABB15762AEC5572F7C55762AFFFD2FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF85CD3C715A1EB94B24E228DC303B75A8C896514F44323C058D3EFCA8B70499EDCB24B5A647AA4F2492F638CAAFF91F6B2E87268925A5E07F8D2B48F63F4E6447935854B3E4B73327ED15247DD95C9C8C6FA0BF26AC66D5D2F6D22512486A287A6541C8E8C6FCFDA1A586A5710950B75093EA0ED936B32A79F192E1220A4D2A39291954A1698CD562D4A485158BB2C8A762329389CFC59DEF9E40FCD2BDD0960334F2B46E42F52694FA7313538A83B3D36A1F767917F3C6C350B782092EC06A00431A78660183B5C595F44693E60D3F558D7D39939103BF8E53214E7C260B295B66E21832303D286B94CB666775DE8488EA781A1F6C31DD944D35246EC6A23603B922992A64648A11A98B8820B569418D06B24062FABC2D683D4996887A531A6B25884B751B92C84D0F8E16050F57FB5514C285BEA57BEF8AA9B9F7F962AEE42837C5ACA2612716C8A3A17756152298B30CB2CE71C455B16C64115C28A55A9418B3470B943D0E2AE3206E877C55B57A0F7C5548CFC07C677C9B6D20649CB37C26801CACAAAC659B71D32125562DC76AEE72A2AB7983515DF2A2CA2955F3D15941F88D29944B937C1A8A4021F8CEF4CA26DF1631A9DD7A3C9D1A86B4C8C39B29724A9EEE49E3203354E58D54C4758B3D4562F5226DCB5363BE4E2B4C2A5D0754BE722494F1EF56396AD05A7C8B6654FD61CBB1EC7A64A2B4935E7E5C79767564907C4C3C324AC0F51FC93D2262CF6E7883526BB62A935B7E45D8FA9B9A927AE2ACCB4AFC83B510CCFEA705E42A323241677A0FE53E83A5C81A62A597C722AF51B0F2BE90CEA96BB1514A2F4C55153583E99708A895DF638AB2386FDFD3459051FC3034CB9A2D6E19876C8F0AF1D34D342CF1CA4F1FAA2B35D7CBAED9918A3BB81AAC9B3F327FE7257CD967AF79AEF2D74D9DA48E0E4AEAFB6E2BD33638F1BCDEA4D97C82C5D763D3B66E30C7D2EA66511000C4572DE4E24CA356D6126BFB44EF86D880C92C2CE20061E26F8C5FD757FCE3780BFF0038EFF90AA3A2FE5D79580FA349B5CCE87D21D764FA8FBDED19260EC55D8ABB1558FD3E9C554B15762AEC55D8ABB15762AEC555315762AEC55D8ABB15762AB97BE2ABB157FFD3FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF85BB6F848AE52C9904352B5F0C896514D3D7E36C77CA8B704AE3943AC9BEF91EA93C921BBFB2FF004E5D0E4D124854D2198FF94BFAF2F8F2601358471B966F18FF0086424DF8DF5BFF00CE24D8A6A7E63B9B6715564634F7198F234E544585BF9F9E5A934FD775396342055B7FBB1136B9C1F3100C614E4370B96036D06C20E54F8078D72756DB09334D247FA1C629B9EF9467C761CCC597853D827BFD3254B8B6BE642A6A141CC09E27698350F58F2A7E73EBFA4DC470CF3B988951CABE14CC49E276F872BECDF23FE7858DD476EB3DD8694815527E5ED9893839A26FA16D3F306DEFE28A55911380A28AF5FC32318A99D2723CCC6F10233A229FDAC970A0E54AEEB5C834C9030BD578C8E4C6BDF1E16A395E4DE74FCD485A64B586753DB63FD98F0B039103A66BAD7D124BCEBCBC30726C89B4F45EB1A2F2DCE2CD1092357AE2A88F888EB8AA834850D3C31605562B923BE2CE2895B86AD6BD716613AB4BB7000AF5C5B03238AF8FC3BEF4C59A651DD934DFAE2A9925C57BE2A89593E1FA314C79A065763BD726DF4A22BD7E9CACAF0AAACC13BE424BC2E6B8AFC43B6545045209AFB8BF5CA8AC50571741DAA4F5CA64DF04BE7D43802AA731E6DF148E59BD77A3FD9AD4E461CD390D04F6CCD998C291BD32C71B8D4EE6D2240640BCD5B6E3FC72617898FB58A732E4045EF962F1A51A8CB688AA88FF001D77C9C59C656C3A7748E4E6D27C35AE49938EB9A728547DC8C55522D734F520C7154FCB154C63F30B49F0C44411FED29DAB91920A5375AAF2B9553217A9ED9157A77945B99568C1E05A8D5F1C559B798AC80B713AA0E406F8ABCDE3D44F221CD181A53080E3CCA6D1EA238F5C20346495060DF999E7087CAFE5C17AB2859EED1C15AEFD08CCCC31757A89D87E54F99EE6EB5CF30EA3A93312B2B311F4939B5C50D9D266365881B52546D999195075F38DABDB5A9EC3194DA2504F60B08D8AF8F7CACE4651C4CBAC3490C071E9E190395CA8627F58BFF38EE9E9FF00CE3F7E45C7FEFBFCBDF2C2FDDA55B0CDCE23708FB83A3CC2B24BDE5EC59635BB15762AEC5563F4FA71552C55D8ABB15762AEC55D8ABB1554C55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD4FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF85884F361C76CAF8536C96DC111904D6A301816424D4A58C5C075A65462CC6441C41E1560CA5C9E80654765394525D76A423B31095ECD96E336D12CA18F05E69242AC0B484107B6C733230348134E0FC0EA6849910814F964278C86F84DF60FF00CE1AFA8BE6C997890CB5427B6F98594539D8657B3DBBFE720B44F56E352AA8320526BF40CC7E2A679214FCFAD422F413895A713C4E591CAE14F6485D8351286B5CCA84C14464F40D0A20D0C709A127BE3964006F88E264377A544A16AC797E19892C81CEC008418B78D5951D6BE04662642EDF164A099E9E2EED2E565B29CA1435A1398920E58D500F50B0FCCBD6A0F4E192770F0ECBC4ED4F7DB2996CCBF3024CDED7F37358E01259E4E245363FD991B41CAA7A97E61EA7771FA705CCD461B963FD98DB0F1187DA6A375A8DFA09E4919F97DAED8DB1337D27E58965B5B3854B971D70F0DB958A7419A457ACD2AB576F0C781B78D90C37CB51F153E79122990926B15CABAECE3E9C090B6491493DCF8E282143D555F1F962C86C8859EB4A57DB1640A696D24840DF167C4C82094556B5C53E204EA09169DF14F1A3A19949FB58A414DE27523ED8F962C816DD4788A0C9B68CA165630A41EB4D8E40848CA12C9E4E3FB5F3C810CB8D086E9551AB5395485053249E694B3F2076F0CA0C911507B8526B5E998F2986E8EC954D3879295CA8FA999CA229B69D6F1CF22ABF422A708853564D4090A6616FA65804AFC5CA985C7F1107776E2353E99A8EC3240AF88C3AFC4EA181A508E8327C6BE2306BCB3672F20635EA41CB319B6DC79186DFC7292CA49A65DC2DBE284858411732558B1E95C7857C5097FE9178643C5453DF1E14F8A11BF5DFAF71E6CD13A0A2F1E87E795CC5309660CAF42B41EAA34BFBDDF6AE52649196DEDBA3AC91C6A21554A374C1E2065C69DEB17D722C9A3908269D7263763E2878E3CB28B89030DEB52C3A53261C7C99022CDF47042D34AFC238FED13964604B87972BE3AFCEAF345C799357B8D2F4F98FD4ECA80723B1AD6B4CD861C6EAB3650F99E6B7BA8AF3882BE99D9877CD9E3141D5E49A0EE2DC076006C3265C594952DA2A76CAE450236CA34DB28E591405353D7316526F8637AF68BA242630596BB6527239718BFA78FC884117E47FE4D443611F91BCBAA07B0D32DC674FA7FEEE3EE1F73CBEA3FBD97BCFDEF56CB9A5D8ABB15762AB1FA7D38AA962AEC55D8ABB15762AEC55D8AAA62AEC55D8ABB15762AEC5572F7C55762AFF00FFD5FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF858B4FB432AE36EF0D94C1F6457A77C789061488210F4C89DD81539220637E0C15E9F0B7865660C244524D756F13A52693D47F019761C6E31905B67E5ABED43F756D68EAAFB89E9B0A66C61065198B425DE8B7BA7DD4114CFD036D95640E66220BEC4FF9C378DD7CE37019830E62A335D99D8E10017D63F9B7A7A6A3AB6A7005E47D36DBE8198526DCA6DF997E77B23A6EAD25AB0E2A0D7200D38138B07922A10C33271C9AC459B79526E573E9B7602992CC6C3958B67A75E5A7308CA3A8CC493B0C692359B89375DF28C8E6C792BD9C6E26238E63C925131C00CEC5C5083B644C6D946549998D5694C1C0CB8D1B1395E31815AEF8F02F1BD5FCABE5F49D16764F8BAE3C0BC4F5AD3A16810474D94ED86A9CAC4764E919B983F7E25B814DE201A8CCD4272A93644A690F1029C8E41B0146FAD40003B0C5928B4FEF8A559273F0D4F862A9A5B5DD286B8109DC57CA08DF0B105358F50403ED7CF16C051297B08228F8B3051E9A8A01B3F4E98B3B6CEAC4FED64896622B7F4913DF205988A067BD249F8B204B608A0FEB47725B6CAA6526282B8BC201A1CC599445269AF5FB5731E4DBD17DAFA93480F63928868996716303222B74DB2E1071AF74EA3770295230F84B6A53B32AF23BD71F097898EDED5C1F871F096D8D4F0121885EBD72CC71A6C81B63B77A6990310BB9AE5CDAC12FF4AB80CDC50D0F4C558EC9A3DE3BEC877F6C551B65A2DE8956B1B52BB653910636F54D134C962319910E6290D9183D46C42C7C05295DE980067253D7A655B76DFB665422E34CBC8AE2ED959C0FB3FCD968838939879279F7CD7E8594D630B9591C1008F7AE5F8E0E1E49BE6986D2E66B998CE4C8EC49673EF99D8F675D96492EA9A6709AA13BE65C4B8336373E9D234AD45EF84968E04759E8D2B015427299C9B61167BA2E84EAF1931F5CC6939110F67D1F4BE318F87B65326F8BFA35FC955E1F937F94A9FCBE4CD047DDA7419D5E9BFBA87B87DCF29A9FEF67EF3F7BD372E69762AEC55D8AAC7E9F4E2AA58ABB15762AEC55D8ABB15762AA98ABB15762AEC55D8ABB155CBDF155D8ABFFD6FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF855B670AC2A330CB984B2785D5A23C4EE46C300938D3C8037146EC0D640A57B1EA73271C6DC59E7013FD17CBB7FAEB98A106353D588EB9991D3B85A8D50112F59D1BF2CACE1557BF01993724E5F8F03A39768B3EB2B0D26C08B45317A454D401F16C3C732BC3D971F68BE7EFCC1D3E117D1DCDBB5631C8041D7BE60E78D3B9D2EB789F437FCE1B5928F37DC48C4A6FCAADEDDB35595DFE973F117D6DE76B8853CCBA848F19742AC38FDD98530EC4EEFCF4FCE7D0AE26D50DF5BC263889E5D3AF4DB292D5283C3230655657431B275AF7CB612A6A31A651E578C9BE1C5A94A65933619E30F7148792460EFB653273F1AF4B1ABB029C89E87C3289B9B16EDB4CFF004A3F0F5F6CC7924A3C6845A6E741D7A530C5814DA3F2DB4D4A2D3DE99246E9B59F955DAE230141A7B62BBBD7748D35ACA255DABE00615B2C9238C83C9969ED95973709D912B1FC4081F31912E48298C7C788D8E552660A2D08A743EF90660AA7A95D80E9D31656EE05BF6A98A6D772A7C35E9B62B6898A4E3D4D7145A244DDF9D315B442DD11D1B1640A3E1B84A8AB6F8B65A6D1DC42109A9E98B3077524BA534DFE5809724144FAE0A9A1A6DB6449660A02595BFDF832A25B0150FAD71DB9572B994CCEC8692E958D28731A4D112BE38BD42083D7B656D97B325D36D5415240F965D8E2D332CC15408C00287C732E107189B2B7E207ED5465BC010A95E638B0AE3C0150B2DB07E8B8F00543A699CF9D453C32328D3762431D138B54D18785320DE8693CBF0CE45502D3C7156E2F295B83560A47CB154CE0F2E598707D351C4F865536704CA6D16085032D001945365A47724C33A90A7805EA3C7271834E4C94C63CC5A8C0B6EDC9E840DF3371E375B9333C3755D61A4574B67F1ABE640C4E064CFBBC875ED367D4A61297F881DC9C988538F3C96A56DA488630CD1737237232D8871A52B492FF00449A798BAC3B78658254D2425FFE1E666DE2A1F9644CD90C6C86C3CBDC40AC5DBC321C4D831B38D3F468D387EEF7A6F9592D822CEAD2C5234038819596603F7D7F27871FCA4FCAD5F0F286883FE9C21CEAB4FF00DD47DC3EE792D4FF007B3F79FBDE8D9734BB15762AEC5563F4FA71552C55D8ABB15762AEC55D8ABB1554C55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD7FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF84F5A9238F5CAA50699EA135805C2D19413C7A0F1CA841D7E5D4BD77C9FE4C9F5955BAB9531A36FB8A7F0CDAE9B15BABCBABA7B25BC363E568B8428AD2D3E13B75CDC474FE975F9B54642929D43CD1733551578D7C3251C4EA660B1C79EEA4E530908600D30CE1B231715A437D65F5A82269F76DFAE6A75317A5D04097D2BFF38A5603FC513C69B50F519A5C8F59A4818BDF3F32C8B6D7EE550D4EF503E8CC4C8EDA06DE35E6CD274ED634C8E1745F5C2F2DC6FDB31645BC45F0F79C3499F4CD4E482088842DD40C6326A9C55BCB703DBDDC25B66722B97036C22FA334EB45963889EE06093998D91DB69F1FA87E1AE5191CD8F245DB5845F5ADD46512E6929EC1A746D253877F0C8DD2631B66365A3C2101283071B2E0641A7E9B6AB2F22A0536C7897813496D944AA517E11D71E35E0463C28C415E94186DB63B2E580602DA0AA88B88F6F0CAA4DA0B74A641902A65A84D3164D09A9D7155F50686BD77C55DCC0DB90C554DA6A54F2C516A26EE9D1B16C06D552F883F6B0330518BA937F37E3859834AE97F4FDACAC96C1345AEA15523976C812CC4D4DAF474E5BE544B671A88B82CD4E5D72124CA7B2AAB0E42A7BE504B18B23B331FC3B8C039B6B27B39A35A6F9978A2D190A73F5D8F8D2BBF6CCBAA71495CB728DB636BC4ACB301B8F9636BC498DB3ABF518DAF126255154103AE4265C8C25AA467ED0CADC97048491B0C5556910EE31550692256A823DF2B9ADD216EEF23E34AE5643194D846AFA82420B33058E952C72EC637703365781F99FCDF662678397A8A4D0919B2C7074D9B3BCEE7D5EC0C9584D10EFF004E6588389E2DAFB7F4AF4811906B80C11C68897479C39A3D01E8BE19514A9FE8B71F69B204A695974DA007803EF4CA8C9CA84764C6DED78EDC0636CF85905B45180BF08069BE368213650028A0FA3157EEEFE50FFE4A6FCAFF00FC04B44FFA80873A8D3FF771F70FB9E4753FDECFFAC7EF7A265CD0EC55D8ABB1558FD3E9C554B15762AEC55D8ABB15762AEC555315762AEC55D8ABB15762AB97BE2ABB157FFFD0FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF85F8ECA6827585979C84FD919084FC474B9674F6CF29F906F35036D773218A18D833A95FB437DB719B1C3A1E274FA8D43DA2E0C763686D6D2216DC06CE3BE6D30E8F81D5CF2F11610F34D76CEB212EC8767CCC3300535006ED2AB986E56455F4CB03FB54CC7F1699CB7539675B32AB335030DEBB532B9E76EC1877633ABEBD05BC4817E3095DEBE39AFCDEA7A8D0E301F49FFCE3379B34BD275C3753CAABF58466DC81C4F875CD5E6C342DE931914F72F3ADEC17BACC9A94171F5A4B9DFD21FB35CD7CE36E44254F2DD5E40F74AC253188D3E28FDB31A78CB951C8F3BD4BCA69E67B826C23334CBD471FEC395F0D322049E6DA8F93752D03518E4BC89E28D5BEC95207DF4C2254C6389EA9A33F3B58E48979851B8C4CDC884699569EEACE6BD5FF000CA652722324EBD158255940E61BB6545927D6AB1D43EDBEE47865728DB644D32A8A7884600F0C1C0CC4ADAFAC952283BE3C0DD18DB27B39964B73CA3DE9F6B1E06C186DD1A90A6A77A9C9C62D528515707AED84848D950380A2A37CAA41902A4CC7B0FA3214CC490EC549353438190921A42AB53CB14F1297390814AD3B62B6A2C66F7EB8ADA8BCAE2B5E98AD201E46AFDBA62C97FAE07FBB2A7BE2CB89DF5C03ABD0F8E02CB8DB5BFE34F8ABF4E506569051B1DF7203E2C896C89561755FDBC8D3305556E7810FCAB4ED8382D24A252ECBB57A7D39138523252716B7C626525B901DB11869978CC9ACEFD64A7C5C72F87A5AE53B4DE394935E5B53AE5BC77B35108B8EE82903957DF229114CEDEE62E5566E43C3DF1663127705DC0A2B8B3181305D460208A74F7C05B618F854A4BF87C46001B2D06DA8C6BBF2FA3088ADA1A4D622029CFF001C9702DA17F4AC4C681BE23D05729CB1A5AB405CDD731BBF0F01918C2DC7C9B3C4BF35FCCF268FA60B6B78DEE2F27158E34AF434DEA332F1E3751A8C8AFF00959F947A8F9D3433AAEA90B5BFAA2A3983B75F119B1C717499A565BD67FE71E6F9B549EC74CD4B9F04E6005EE7B74CCC842C38E254C2A7FCA7F39795E57730C9731C7D5829FE991941B23240C3785A76B4BD06DEE22DA507B6634E0E4455269E35902A2FAA9DE40731CC5B8056F5410027D9FD939518B9319505E8CE36AE222C84938B13CC8A8E9D708091BA7885760570A781FBABF947FF0092A3F2C7FF00013D17FEA061CE9F4FFDDC7DC3EE78DD57F7D3FEB1FBDE8797343B15762AEC5563F4FA71552C55D8ABB15762AEC55D8ABB1554C55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD1FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8D2F23F91A57BA4BFD6D6BC0D68D99B874D4F199B556F6FBFF00315959471D8E9F1AA0A7024019B9C18F85D466CD6C59E49EF25615E4332A52A0D50DCB2DF2D6856B70C52551CE43DF31324DCEC38B88D3D353C81A7CB0F32AB551E03FA663193B0FCA3E7DFCCDF2B2E9FEABC7B2C7E1F4E53293938B4F4F9C6F56297D485DF7198E64EDB4F0E146E83AFDC797196E2DE46AA9A00091D7E9CC6CDB876719D3DDBCB3F9BD24F2C31DE0DA94AB1FEA7308C1B0667B4D94D69ACB0BD12208D97E3151D3289636F8657A07911B4F7D723B3D2E146909A39DB7CC738DBE395EB1F997F96F6BAE687305B355D42DA332D55454D47B0C8F03938A76F86AD6E6EFCB17173A65F42C9F1955E429DF0183920B2BB7BC4616F2C5B16DDC65660CC165F14EB3463B9032071B30532B566E2C3B83B65538D1499526D019BBD6990E16719A6917C5DBA63C2DF19A6D6F7CB1008C7E8C785BE395344BA420107AE061396E881329C892A0DAD663C8D0ED9592CC054571DF2BB6C017F2B7FDA1BF7C2A8599ADE876DBBE2A82372A361D3A0C5541AE7155295D4AD477C52934EC6BB6D8AA0C87F138AA8307DB7380A43AAD502BB7865062DA0A3E1269D7A60A6C0510A5BF98E34D80ABA3316515F98C69369846687AE16B4C2075322A96D8F7C55328A7F498156AD31564767AA23108EDDB08544B5EC55DA4FC724C81444378A5A9EA7BF5C2CC14C92F401F6F6F9E06C1277E9458EB593AEC37C84CB6715A849AC27412F4F7C8829421D6A25AF292BE1BE580AA026D6226DC3FE39602A841AA52B2C64B329A0032AC82DC5CF9B81E8FA0797EFF00CC36DF582AC8AA3AD30C62E064D45B23D2FF002E746D666FABEB1682EAEE27FDDB915A27874CCCC61C0CB2B7BEC5E5C8B43F2FBD969AA96E889B050053F01997034E0CE16C3BC93A446D35E6A37975CAECB32853E03A665C25B38C63BA6F3C3CEDB526BEB5496201B83151EFED82526710F942FF00F2B62F34EABAAEA1631FA2F393450294A57DB31E45C8807897983488FC97713E9FA8CA1A624844277CA0B7C52BB760F0C4E05030A819590C81A45AF5C14CC14D74F6F888F0C7859829D237C58D3305FBB9F945FF0092A3F2C3FF00012D17FEA021CE9F4FFDDC7DC3EE78DD57F7D3FEB1FBDE8796B43B15762AEC5563F4FA71552C55D8ABB15762AEC55D8ABB1554C55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD2FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF911B5D4CA4450905BBAE74F1C603E6D3B48AE67FACCEA900FDE16A6D9682038A626D9EF97B49957795D99CFEC9195CE6E660C6F47B1B58EC87AAF540BB961D4661CE4EE74B87D4191C5AFAAC65616692836E5B65066EFC600F1FF3E4D71AB45708F1045607E21F4E5329B64703E3BD62C6EECB539792FEE8B1F88FCF31CCDB04292D9AE9C158E18C484915AE57C56C8DA31A49596358E416F21EA54E44840059C68FE69D574B44824D51BD24151F16E7D8E63C837C6DEEDF96BF9A30697AC437F733A5B98C8A9E5D7E798F272216FBDBC9DF9E9E4FD7AF7EAF7B7111F56309212474C003978362F14FCFAD33C9F3EA31DFE8572B34929E46314A54D7C301736DE23636377C39471820F5F6C8101B0499559B2DBA8F59E847619590CC14FAC751B37996105CB374DB6CA671B613932D59618940988453D0F7C8F0A04D136CD6F2352390BA9FDA1BEFE18385B064A593E9D74D30689498C9DD8E3C2CC66461E76A80354A81BB65538EE9F15B87528DDB846416F0272B316C8E54DE3BC454025A06EF4CACC5C98E45296FE05DD4B37B5321C0DE24BA2BC570095007BF5C8B0326E59EDE9BB004E28B4B5E48F7A1A8C56D41A44DF7C56D45A4DB167C482797AEC315E24135C76A62BC4A06E0D7A75C4A89287AB43D72921B414545734A53E9C785B01B45ADC8F1C785982AE2E42D0D7A74C14C89D95D2EEA2B5DF035DAAADD92C17953DF15B4CE0BB006EDCBDF15B44BCE78F247A3FB6109050E2EEE01FB44FD392664A69697B329A93DB147123FF4A3014240FA71533A434FA846D148EF394310AA81DF018DB28654A6E3518B9DBAC324B2198D1CD3A60106CF142A299A4BC92D622F2040086237DF2622BE28651A77947CC5A9C4F35BD83945E8C4102996082F881EB3E4EFCA9BD9D44FA8388EA7918FE5898BAAD7E4DDF4559E9967A26872A40024C828A0EC09C9083AFE3280F24DBDEACF7535F5BA2C8EC5A075DFE1DE997C4522ED966AD33DA5A4934D2963312A213D299785E152D23CBF696D62D3ABB191FF007A2BDCB76CB449A670DD4BCD4C2CF402DC4249715529F3DAB80C944698D7953405B5B06BB9A61140D1C923CDFB5D2BD32B25980FCBFF003D4B379FFF003D6EF4486FCC7A769D39ACAA7ED509EB9021982FA1F54FC9D96DF4DB7BFD27525BB9258C39B52C28BB0D85322907778AEA52AE8F70D677C443780D046761F7E2C814CEC599516534A30AEDD30365A6515E425FE26A7B61676FDE9FCA021BF297F2B997756F28E8841F63610E74783FBB8FB87DCF21A9FEF67FD63F7BD172D68762AEC55D8AAC7E9F4E2AA58ABB15762AEC55D8ABB15762AA98ABB15762AEC55D8ABB155CBDF155D8ABFFD3FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8EF578F9B5C06FDDBF4CE9B8DE267A6651E54D1967BAFADC9BA72AAE552C8E29C1BBD62DE25826E4AB45AE56656E6E0C28FB8B9068427241F697C72B9F276F871F0EE94C97B4256184257314C9D96395B10D522BB9CC8D23058687965129399116F07F30E857BACDF35B58446572D4F8728949651A4E34BFC8DF335FC6918B3912693756A76FBF2B126118D966FA67FCE2079E3569D2425E28DBA7F9F2C4C9C918596BFF00CE13F9AA29D1E5BD255853896E9FF0D944A4DD0C4CC2CBFE706B5A9E359DB5858C2EECBCFF00E6ECA2526F8E265563FF0038CDA7E8171691DF7994594A8F4F50494E4476EB91126D11E17A95A7E487956EAE62177E6E597881D6407F8E032660A7179F957E4CD35D2DE1F32C444A28C798DA995993602A69F929E539E932F9A6293BF0120C812D82491F987F2C348D2EDBEB1A7EAA048836F886E7EFC46ED3964C33FE55FF009A2FECCDDDAAFD7517A01BFF001C970B57131F6D13CF3A6481DB4B6B5B68FED02A454F8E3C28F11136DE77BCB598417D6E4229A31A634BE2338B4D6B48D6A25442179EC6BE380C2D81CD45BBAF28385F5EC65A93B8A1C81C6DF0CC92CBA4EB91A13E9B3D3BE40E37331E54BCCDA9DAB7EF6D0923DB2BF0DCA8CD53F48A85E722346C7ED2F8661CC516CBB516D4ED5BED311F3C82AFFAEC741C5B63D3E58AA8B5E27F362AA2FA82F4AEC3BE2D96817BF5AF5DBBE29B59F5A88FED62B6DFAF19EF8A82A2648EBF6BAE45B42BC6CB4FB5BE1640AB2B8DB7C0D815B92D3AD70164AD1B0A75CA9AD7F2DC50EF8551D0135A5715477A8513956BBD310CA3CD6FD61BAD324CCA9BDF49F663EB8B548A3ED2C750BFA705635F0C5ACC99E795BF2D359D7F538AD591845506507C0FD396E38DB0964A7D476DF933A0D959033C4867812AEC7B6DF3CBBC363E2A47A4F937C9BA5DEDDEABA95DC29145BF027AF1FF006B2C18D7C5629E7CFF009C98F23796F4ABBD13CB56714B76A0A0950577029E1ED93F0D7C57937E5BFE746B779ACC375AC4AD0E9CC4B70EDC6BF2C84E14E3E63C6FAAB53FCD9F25F9AEDA0D1F43981BDA8590AF5AF7ED80069E07B5E83A3AD8E9B6019FD4927456E47B03DB260278588F9D0BDE6AB67A65BF660580C902ACD043E8C3A7C1D2A02B8F96264C4861FF00987FE997DA7E996FD178F35191E2470A335A8DA0F265F5869B66D3EA4B6CCA0815DD908C921F9C3F96FE439FCB3E7ED77CC1E77D224852EE6768DCA6F424FB9C3487D831793349D5EC21D5BCBBADB441E3E6D64ED4E1ED4C348B7E587FCE45F9ADF47F3B0D3667A346FC5A64F6A60E1660A1FCA5F98F1DD086D6693F771A84563DC78E34D80D3DA2CEEF4FBD50F1CC391F7C69982FE81FF26E83F287F2A829A81E4FD0E87DBF47C19D061FEEE3EE0F25A9FEF67EF3F7BD232C69762AEC55D8AAC7E9F4E2AA58ABB15762AEC55D8ABB15762AA98ABB15762AEC55D8ABB155CBDF155D8ABFFFD4FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8BED12FA6D457F46FA12ADBC7F626A7C47E6736E72BCD5193DAFCA1772C114D67796EF4894FD51E31D5BB72F6C899A63A6B6609AB5DA32C37B6E2DD587C2E452BF2C78DCDC5A4012093CFBA5D95C5C4123AA9B7157693A7EAC13C9B39630D30CD5FF003318397B28A39E2ECD18AFF0CC4326D863A62B73E79D575085C4517A61F6F886DFAB29949CC807D51FF38D7F96B36BF24BE60D7A33C62F8E30BF64F43BEF98F29378C40BEE7D22C74E69E9269D0C76D07C10CB1AD18BF45AFB655C4CBC1E1DD9E8BFB58ED1ED0C421BF857933462881478E266DF8E16F93FCD9F9B3A89F3543E5DD06E92E5E7904370EC6BC2BD48DB2894DCD86114C9FCEFA4EB5E4DF2D0D6EE7CD33CD77749CA3B3864DAA7B5331A536C38E9E45E5CFCBEF30F9C746D43CE7E64D66E20B0B2532DB425E858FB0C89C94C463B64BF967F973179E359223BABDB6D26DEBEBDD31A6CBE06A32072527C17977E75585B796FCC53E81E54B9BBD4A68BE15773C8F2DC640E56DC7A7B286FCAFF002B79ECCC351D62C6F9A0421B801F0F1EB959CAEC31767F13E9997F303F2DADECC68BE67D3A6B4BB20707028DB6C4E1198863A8ECDA28BB3F307935EDBD0F2EEBB25AA1FB2B2BD313A92D3FC9A82D7B509BF41DC2C9AADB5F475256456ABFCB251CE4B4E4ECFE17805ADC68374F7306A7693F224F0940D8E644276EB3361314A5FCB71DB96BED36F0C31F22521734232F0C2386C59661A17994D9010DE5D212BB75C90882931A7AE681AF68FAB442DD6E22172B5E418ED919419C7210C953CBDA4EA2A566A7ADFB253ECE63CB6726398B18D47F2CE695A4789223131AA377A7DF98192365CC86434C1755FCB7B8B552CB1866F0EDFAF2A316CE379BDEE87A8DB170B6D29E269D36FA3234C81481A3BD462258245A7B645210F34BE98F8C1030B7525C6F2035058838B3115212F03591CFB53148802A6DA8C6845198E2C8E20022A1BB59A95241F6C5AC48A3967229C6B4F138B30510B73D37E98B74510B703ECD7AE03BA65B045070AB50D91E171BC42AA92EC64AEEB9131489A36DAEC3380DB0F118084892266BD759111006889DEBD71886C81DD1F0992E18C50C4657A7C210572CE16D243D3BC97F957AF798E482792310C524A1645E8426FBF5EB8F0B8D393EB1D1FF002374CD2AD24B8FACC8B2409CBF7A76247D38F0B8D29A0B4DF33689E5E3793CF730C571A7D79F134A8197618B10789E11F993FF003955A5E97697F6FA0A9BABC98323B49BA8EA36F87325AE669F188F3B7E6079FAF9ADAD2F561B59FD46B94534201A9006C3C70DB8E7290C5B4AD3E1D275392DB592F717334A03C8FBF53DB27C69194BEACF2AF93E2D6E1161A2A492974A3B36FC411DB2B99B6C8CDED5F941F9172796BCC4FA84AD2CE8CFCA6F537E277E9BE56CF8EDF74C691C2A8109E1025501F6C3652082F3BB1AEA1E6A7BCA739223C78FECED8DA683D06F1115A198578A312DEC72F8C0485A90180C006AFE6C9243F14708DA982500189A66B1C4F1488518AA4B5E5F25CAA52A6069E4DE67B48BCC7E67B6D2DADD25B585C7AEC07C54077CABC621AF64279ABF2B6EF4DD2B5AD5741BE6B484216823534A0A0EBBE4865B6C1005F879F9B02E6E7CD9A80D61E3BA9E1958073B9DB26269E00F3089B568627BAD3D12358E4A1E636E3ED960368D83D2B43F3C4F63259C11C9CE5968272DF641EF4DB274178807F551F9093B5D7E45FE4BDD350B5CF913CB92B11D2AFA65BB7F1CDEE1FA23EE0F2DA8DF2CBDE7EF7ACE58D2EC55D8ABB1558FD3E9C554B15762AEC55D8ABB15762AEC555315762AEC55D8ABB15762AB97BE2ABB157FFFD5FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF90FF00CB7F20CFABEB70F9784FE9BBB0569CD76FA727E3B8A3474FD1DD03F23BF2F3C93A589BCC5E60B79AEDE3E4119F707EFF007C7C76C8E969F1C7FCE4679DBCA97925BE9BE5331C6DA651649E3E8DC698F8EDF1C34F985743D435AB73A95C5AB244568B514F57DBDF01CEC8E34D74AFCB3F36EB344B1B65B6B63FB4C074FBF29395022CB74FFC91D5CEA169646F0CB792B82B02D6868457299657271C5FAB7F90DF96FA8695E588AC2E2331968C027E81941CAE6460F7693CA361A1E8F705C896E5DC145EFCBB1CA8E46E10BD9F397E76FE60587923CA7269D6404DE66D67F72186EC81E9BE0395C8861A60BF911F93BA0E956D75E74F38EA0B3DC5CC06ED8B36E8C6BB75CC79657371E36216F637DF9B9F9A52D868F792CBE5AD35E9287354A2FDDE198F2CACE589ED7E70F2C5C6B0963E42F2E5C1B68B4F939DEBC6688E0F63959CAD4715259E7AF3EE89F933F97B37956C5565F325C2141243F6F930237A57227236E3C5C4F19FC99FC9EF3579E357B2F3B7982E85BDACF299409BAB2F20DEDE390395DBE97476FA57F323F30348FCBD8C68F62F6D3B88F837115DC0A7BF8656723D0E9B40F813CDFACB79A75A6BE9E0145242328E80E0F11CC9F65F131F9AC2248F925F4B6EDE08D4C81CAC4F6481D1434AB8BFB2BB8A73AACD71A746F59A177AD4F7C9C32BAFD4F66D07D412F9D7C87AC79623B2D3ECA38F5644A34B415E599B8F23CE6A7414F0F3A6EAF7777248B3B95AD16253B53E599D8E6E8F2E1E03499E9BE5C56BD53AB192DE2247276DB2F127127165D7FA0E8F0317F2EEA85EF1002C8ADB93E18CA4D6229B7953F33A6D26F5346D6AD65424F1FACB0FA3AD330E72722117D2D63AAD9DEDB42F6B79CD5D4155AE634B9B971E48AF5AD89E372BCD7C72B219A1DACF4FB9E4A6C57813B371EA3C72B21B2293DE792B49BB25BD08D49F6FEDC810CC3CE75CFCAFB296390C4A2B534A7FB78B787916A1F965240EFC54D05698B6061D7DE50D42353FBB240E9F462CC31B974CB8B7E4B25B9AF8D31672E4848D2584EE87171AB74D61B9A8E25295D89C5B150951DF1640B4B28A80A773DB14CCEC9AC658A0DF22E2A3ED62326C7A1AE34B68D58A15824653F18E831E15B645E43F296A9E67D5E1B75899A194D2B966385948C9C2FB83CAFF0092FA779295353D5A2170654E410EF4AFD3991E1A0E77A4E82DA4699F5ED6AE255B3D3ADE3630C55A55C7418F86D32CCF3DD5BF33AE7CE574749D20496F6ECDE9B4E36047CE98F84E34B23CEBCF1A3792FCA7A1EA926BBAA97BEBD80FA4BCF7E743D725185328647E5DEBFA8C32EA57C2CE212DA991B8B91534AE4A98E4928F9735ABDD1EF0DD69B251CAB7A918F9634E29927A350BBF32B5ACB1DBB3DFB5C207A0DFED634CA2FD64FC8CF29C1E5EF2B0D66F63A5CC9081F17662A3010D8F77F23D85DCB6FA9DE5CC815667261AF8646922D3CD6EEC69D62189A168F8D7DF1A6C8DA43E4EB4FAB9B9D4661B4D5E24FBE34CF74E755BCFABE8B3C8C68ECEDC7E9E9878E934520F29DB1B2824D4E71BDC92149F7CAE5918905956A139B4B19A73B7D514927FD615CA253B6B312C23C8F6AD35FDFEB972B54B824424FBE5129313128BFCC0FD23079435716F2B969636A460F4DB2D8DD391189E17E06F9FFCB7AE0F34EA9A85FD94CD01998F220D2996C4B0902C7749D26F7CCD7834686136494AA9229C865824E348909B47E4F86CB506D288E57711A09325C6E399C83FAA2FF9C7E80DB7E437E495B375B7F20F96E33F34D2ED87F0CE9307F771F70FB9D2E5DE67DE5EBB96B0762AEC55D8AAC7DC7D38AA9D0E2AEA1C55D438ABA8715750E2AEA1C55D438AAFC55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD6FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF233CB9FF0038C3E4DF2ADCBEB13B133D0B1911C0CC3B2E7ECFCE5FF9C95D5A6B1F346A1A7E95AB4E6C625612C5CC96E229B03DB1B29A0F89DEDDEF00926B97974FF5394909AFAA47BB63653C2FA87CC9AF797F56F2279774DD25D34B4D3A86707FBD6A0A751BE365061B337FC8DF2C5E79C752B7D26D6F2E0CAEEA11B937122A32B258460FD2CD3FF27FCBDE569F47B4B9B432EAF28065BC6DF8F427299172618DF40456B6BA6D9C16FA4C4102A51E4661D69EE72891A732106272C4F737978F79C94DADBC970B272AA1F4C578D077395D972B1E3DDF9E76B6317E6E7E6FDCDAEA08F69636B318F8CA7ED509FB35F96425272B829F42FE69F927CBDF977E4FBCB5B1FAE896F63315A4924C4A7A8694A0F0DF28916D8079F7E5DDB5EF907C986636E96B7BAC9ACD7DC6878B03D0E512939118A6307E6459E97A6DCD968086FF00CD3316F4EE07C67936DBD2A72B2594B0DBCCBCB9F94BE65F327999FCDDE78B1B8BA4327A932C95E0141AEC08DB2264E4E9F4FBBD4FCFBF9ABE57F2AE8F0E81E52E7677F0A18E242F550D420EC32B26DE8F498007C75AEDF5D6B378B7DADDCB4D7B292CBBEDD7C32B327A0C31012DFADC21FEAF343EABAED118C5283DF07139825174B3C0842B583B13D2B91254CE285BAB580C5EAADAB41714FB1FB253C699289759AA31AD93BF21FE5BF997CF5AA25B7942D9E390B52E6465257DE9B6676393CB6AA9FA0BF97DFF0038C4BE5FB186E7CD3299AF1497996BFC33618E5B3CA6B620CB646F9AFF0025F45F3497D3AC6330A8F843A6C7C3AE64893AE9C5E7FE59FF009C4B6F2E6BEFA88BA9E78B90608EE5878F4C12935883D1FCE5F91FA16B366919822B5BC450A27550A6B4CC49CB7722317CD97FE5DF30FE5DDECA90C72EAB696CD44F4EA683000D8F40F2E79AEC35E884733AD9DD746B7907C55FA7010CD983EA0F1AFA3C1404F85180EB9590D812B7FADCADCBD6F84F4036C810C834F248AB406BDB7CADBD21BA53293CD41C5B42552E936F221AA038B20C2B54F2BC3217A44BB83DB16C3BBCCF54F2A4B17F751803E58B5F0B13B9D1E5B706AB4FA314243346F1FDA53BF4C50A5146DC838041076C0589927F096E03236C0A6F6C582FC3D7FCEB931BB548A3A0D2A6BABC820B40CC2660251D7AE5A22D7C4FD0BFC98F24E95A1E9D6B7A2D985F08F90673515A7865F8A3BB4CF23D4FCD9E6780AC36D247CE78E3ACC3F6683AED99341C7F11F21DDF9E17CF3E61BCF275ADF243A7D94865BB8D0856A0EA2B5F6C691E25BD5935BFCBEF2569062B7A34F0A7266EADCBFD6C683025F9C1F9BBF987A879ABCC37C25AAE903E1B5727627C0602144A9E07E85AB1755670AC4D77C1C2C2791D64B67A6DC898BB2CBB8849355DFAD463C2D5C56FA7FF00203CAB16AFAF433BBC73C664570817DC1C785BE127EA25D4634ED0934E0BC04DC5828DBA0ED9121CDC401E6CF7CB6D0268F089CBAB2814A1A7DF829BC4425FE6C65BF8AD6D636E3561C877E38D331009F689666F74B92DE195614B215766F6C69B0462C1FCF9AFE876D2C3A341AA4308545370ECC0EE7AF7CC79C776C1008D7F39FE5FDA687656D77E64B5630D0944700D7DF7CACC14C22C4BCD5F9C5E4792D27B1D3F5980FD6C2ADC55813F08A0A6FB640E32D6718653E49F37F93EEB4286C1756817D221A3F8C035EBBEF90F08B0F0C273AE79A34C3A7CF099619CCBB2B5410C3DB7CC8863A0E44202980CDF92FE44F3BE963EBBA72FD6AF3ED3A902B5C3C0C258C3E78F3E7FCE23685A523EB9E5EBAFAB6A963FBB823076A2F4040EB83869C69E10F9423FC92F3C4BE66FAC49A6CB33C8D46B8553C4FE18971CE9EDFD0E7E5058CFA67E52FE5769B72A52E74EF28E896D7087A8786C21461F78CE9F4FFDD47DC3EE797D40AC921E67EF7A2E5CD4EC55D8ABB1568FBE2AD547862AEA8F0C55D51E18ABAA3C3157547862AEA8F0C55D51E18AADC55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD7FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF30EE7FE3932FFBDDF60FF7998EE4BF25BF357FE537D53FE39BFB5FEF6F5EDD716D0F1497FDDBFF001C5EA7FB9E98B745253FDFDAFF00BC7FDE0FEFBFB9EBDF23264793F4DFFE7143FE3BBA67FC707A2FFBC7FDE74194B18BF42B56FF0094853EC7D8FF0077F5E9FB194CDCA83C8BCEFF0061BFE521FB5FF1E7F63A9E9ED98F272E09DF927FDE49BEDFFBCB27FBDFFDEFFB2FE3953938DF1A59FF00E4EBB4FB1FEF50FF00783FBAEA7EDE464DF27D01FF00395FFF001CEF2EFDAFEF63FF008C1DBAFBE53258F3625F985FF92AB47EBFDCAFFBCDF6BA663C9CDC6F00FF009C69FF0094FA7FEE7ED0FF008EAFCFB65679B9717EA37997FE51BD43FDE3FF00799BFDE4E9F64F4C94F936E93EB7E3179D7FE531BAEBFEF43FF7DFEB9E998E5E9B4FC921BDFF008EDDB74E9FEEEFB1959E4EC23C936D3BFE3A375FEF1FDB1D3E5DB029F8ABEB3FDF27D8FF009E790973627E2AB17FBD717F75FDC8FF007A7EC7D39383AFD47C5FA1DFF389BD2EBFE385D0FF00BC3FDF77EB99F89E675DC8F37D49AFFF007D71FDF743F6FECE6645D066E6C5344FF7A24FEE3AFECFDBEB99117124CCAD3FBE7FB5FECFA60C9C9AC3CD3CF1F69BEDF5FF0075FD398736F8BCA74FFF00A587FBC7DFFE3A19747E9497CB7AEFFCA552FF00BCDF6FFE95B80A43D7A1FF00792DFF00BCFEEC7F7DD722DB1504FB67EDFD1959641565E9DF2A2DE12997ED606D0843F4E2C825571D5BED7D38B6B12BFF00DAFB3FECB14179F6ADF6BFDD78B51611A8F5FF00757D18B192017FBB3F67A603C9804543FDD8C805926D69DF2E8B44F9BD2FC89FF1D6B7FEEBED8FEF7E797C5A25CDFA15E5BFF8E6DA75EA9FDD7D1F865F071F27262BE69FF8EB6A5F6BFDE47EBFC32E71DF97FE4FFF00C995E66FF7BFFDEC93FBBFB7F4FF00938ABEC7BDFF00943F52FF008E77F70DFEF47F7FF47BE2AFCCCD7FFDEDBBFF007A3FBF7FB7F63FD8E1632E4C6A3FB4DF6FE8C0D3245C3FDD5C74EDFDEF5FF638583EDFFF009C50FF008E9C5FDCFDA5FB5D7A8C0E4C1FA41E6DFEFB48FB3FDCF7FB3909399064D63FF1CF8BFBBE9FB3D320DC3E2C67CC5FF1D0B0FB7F647F77FC71671F8A62DFF28CEB5FEF67F74DFEF07F7BF4E167F37E67FE65FF00C746F7FE526E9FEEDFB5903CDBA3F178737D97FF008EDFFCF6EB8127E2952FF7FF00F4B5EBDFAE2D72F8BD3FCA9F6D7FE526E9FF001EFF006708607E2FA3EDBFDE1D1FFE523E8BFDFF004FF65930DD1E5D5F5BF977FDE0D27FDEFF00B2BFDD7DAFA72054A7FE6EFF007960FF007B3A8EBF47DAC816324FB4DFF8E7D97FC733A0FB5FDEF4EF902C1F62796FFE51ED07ECFF00C73AD7ECFD9FEE57A7B674DA7FEEE3EE1F73C7EABFBD9FF58FDE9D65AD0EC55D8ABB1569BA62AB315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB155CBDF155D8ABFFD9, '1', '2021-03-13 12:45:48', '1', '2021-03-13 12:45:48', b'0'); +INSERT INTO `inf_file` VALUES ('8448cada8c714e4ab61f521c8da21990', 'jpg', 0xFFD8FFE10DFA4578696600004D4D002A000000080007011200030000000100010000011A00050000000100000062011B0005000000010000006A012800030000000100020000013100020000001F000000720132000200000014000000918769000400000001000000A8000000D4000AFC8000002710000AFC800000271041646F62652050686F746F73686F702032312E30202857696E646F77732900323032303A30343A30322031373A32343A3135000000000003A001000300000001FFFF0000A00200040000000100000320A003000400000001000001C20000000000000006010300030000000100060000011A00050000000100000122011B0005000000010000012A012800030000000100020000020100040000000100000132020200040000000100000CC00000000000000048000000010000004800000001FFD8FFED000C41646F62655F434D0002FFEE000E41646F626500648000000001FFDB0084000C08080809080C09090C110B0A0B11150F0C0C0F1518131315131318110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C010D0B0B0D0E0D100E0E10140E0E0E14140E0E0E0E14110C0C0C0C0C11110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0CFFC0001108005A00A003012200021101031101FFDD0004000AFFC4013F0000010501010101010100000000000000030001020405060708090A0B0100010501010101010100000000000000010002030405060708090A0B1000010401030204020507060805030C33010002110304211231054151611322718132061491A1B14223241552C16233347282D14307259253F0E1F163733516A2B283264493546445C2A3743617D255E265F2B384C3D375E3F3462794A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F637475767778797A7B7C7D7E7F711000202010204040304050607070605350100021103213112044151617122130532819114A1B14223C152D1F0332462E1728292435315637334F1250616A2B283072635C2D2449354A317644555367465E2F2B384C3D375E3F34694A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F62737475767778797A7B7C7FFDA000C03010002110311003F00F544924925293A64E929F18FADE19FF3ABAA48DC4DEDE49FF454ACD369FB3380796ED036EA74F26A9FD78C97B3EB8F55606C8F581FFC0A958D6E43DC037807B28C86505BB87D62EE9F91F68AEC7BEE6B5CC6BDC6480F11A4A1FA7D77AB07DD8F8F93934564FAAF631CEADB03D477AD77F315ED67BFF48F540820C1D7CD751F55053FB1FAB6EA8E4BFD3DA69AF09B90F26CBB0598CCFB45EFF45EFBED67E830BD1B1FFA1B327DFE95753D002D0644079DB3A5755AB26AC4B316DAF26FD68ADE20D83FE05C7F4767F61FF4FF0047FCE223BA3758AADF4DF876B2D01C4B4B44B431AFB2DF536BBF44E6574DCEDB6FBFF4562EC7AD136756E977D8DFB3D565B6DA2CC3763D4E190FC7AB1ECC4C6C8B1EFA6DB30EDC5F4F333A8F52CFB55946162D5F6BA2947EAB4B68CAEA05D6E43AFC6C4B9B6E28A7631BA6536BEA18F5E55F6751CFC1DFD532EAF53D4F4E8C965D93956E374FFB2E3D6FA0B6DE4BA6617D6B654DCBE9D8B9FE9583755763D76ED70F169AFD962EC3A17D64EA76D96616774CCAB32714B5B9365143DEF66EFA1F6BC6637757B9BEF66CFA7FE8D65F45774BA0FD5DC3774F77AEEEA15E583F68792CF55D87898D9AF69C766E6E6BB1ECCAA719DFF69ABAECF53D3CA62E7F17071B3FA8E3518782E155F6D6D6E2073AF7866E69CAFD27A75D9FCDB6EB5FECFD13130C227AAF8CE4351B3E96329ADCE6B032C60225A2EA6DAC3B69F7B7F4F535AF757BBF495AF37EB34578DD5F3E8ADBE9D75E4581958101AD277358D6FEEED77B56C3BA8DF4F5CC91439ADAF1AFC8A716AAC06D2CA197595B71E8A2ADB4D753FD365967A6DF52EB3F4F6BEDB150FACEFF00B47557E735A5ACCA6B09932058C6B6BB5AD77F65088119505D3265004F47296AFD52FF00C55748FF00C34DFF00A97AC995ADF54BFF00155D23FF000D37FEA5EA4627DE13274C8AD524924929FFD0F544924925293A64E929F09FAEEC9FAE1D59DFF0CD1FF8152B01DCF9ADEFAF0E23EB87578ED734C7FD6A9584E1EE07B4C7CD3482B82C0CB869F246A6B0F3B5C246920F1F728B29703C401C9F056B1D90F1A73AFC934AE0750D9C3C5ADD680D6001C35811C15D0E374AC79935336EEDE06D1F4A3E971F4952E958FEF693C49D7E2B7EB969E254323AB6B18EAD46F49C7F730D4DDAFF0073840824FD29597D6FA5D54EE2D1B77341606E9A8F6ED11FC95D334FB493A203B1ABBF21B65A37067D169E1464906ED9B844855393D1FA1399563DD60DAF68690D8D23F74FEEFB5687D60E8746474DB2DA5B16D23D481DE072B535EDC4A85969D0763A1F81D101908365470C786A9F2EDC473F72D5FAA07FECAFA47FE1A67E47ACFCBA855977560406BDC00F20568FD516FF00D95F473FF7699FF52F5781D9CC23523B3EF6993A6450A49249253FFFD1F544924925293A64E929F05FAF263EBA756F036B47FE05542C62241EFBB50B63EBE83FF3C7AAB876B87FE7AA56383EE1E1FEBEE40AE4AE2E207808251702C7D9696BB9747E2546BA9CF7348D7C63556FA7623EBCA24F0D2224729922297C626DE9B0A88EC0761F2F6AD4656EDBA842C0A9A183C5690600DD79EEA06E44506ABC32B682F78682A01F48FA37327CCA3BA9A277D906741BB80AA64D9D348F4CBEA6DA4C0687B43893DB6EE4C902BC16C8C80E86348772496F1082FCEC4F53F4B686469E253E3E2399510C044F8F654EDCBE97D3AD1F6C7B2BBEC05CDDE1C4C03B67DAD7353575E9ABC8F5EA5B5758CAD9AD56BCDB518896BFDDFF00548FF545B1F5ABA47FE1A67FD4BD5BFADF6D195660E650439B657657BDA080763B737E906FD1F5551FAA766EFADDD1C0ED94CFC8E57212B01CDC91A9C878BEF8993A65231A92492494FF00FFD2F544924925293A64E929F07FAF4377D6EEADFF001EDFFCF54ACEE8F875E7754A31ED1348DCFB478B180D85BFDA5A5F5E04FD6DEAE3FE1C7FE7AA5677D5BCAAF1FAC62BEC23D379752F9FF84696367FB4992D8D2F85710BEEF656F4FC73B5B93815D41803BD7C56ECF4C1FA2DBC7E77F2DC8195D2D941DF4925BCEBE20AD5B711F71BADCCB36E331D3B0BA1A770F6EF8F759FB9B10290CB2921ED2DD7DAC773B7F35D0AB027BB7A518F64BD39C7609E56A31C0F3ACAC9A5BE9FB55EA9F1051486593D2B032B5C8C7AEE3DB7B7700818DF57FA7E3DA2DAF1A8AC8320B2B00C8F376E5A55BC10028DD76D6B9BE4A39DD32C00ECCBD4AC360113DD0ACC7ADC009DBBF50476542C3D4FD3230D958B5D1165B25AD13EF3B1BF49C9E9ABABB2E0E7BD9E8B87BE352E70FE49FA09A9156D6FAE5D2DD6FD5E7E4077AAFC1B1B7B4F70C77E86F1FE6B98FF00FADAE33EA79FFB2EE91FF8699F91CBD22EB59753762BC82CBEB7D4E1C887B4B3FEFCBCD7EA583FF3ABA313CFDA980FDCE56701B15D9A5CDC6A57FBCFD04A2A4A2AC351749249253FFFD3F544924925293A64E929F06FAF13FF003BFABFFC70FF00CF74AC0C5A9F6BEC63352C63AC81FF000637BB5FEAAE8BEB9D2FBFEB97576B4682E6973DDA35A3D3AB955FA1E1D15F556398F3634D193EA480266B737D8D4384D13D14271E211BF53B9D07EB6E364D2DC7EA4F155EC01A2D78FD1D9FBAE738FF00376AE86C6B1CCF546C1A4EF90411CFD29DABCE31F01ECC9BF19F040D58EEC44E85AB5717A65C5A186D2299135C983FC90D55E7117A3771E43C3A8D5E9F7B79699F056B1DEC70826216457B9839D111993E9EB29ACA24EDFA80409F821DF6082663B954075105B13D92AAD16BE5CE803523C5327AE8BC11BB62EEA36D5596D741B081A1710D6FDFAB952C6EABD6ACBC0BE8AABA5C61D1634B88EDB55CB286E437520055D9D3E8C571BDD74EC05D06001085689120CF2F26BC5C5BF2DE76BA8ADCE209FCE03D8CFF003F6AE2FEA5B09FAD5D1FCB25B27E4E5B3D55CECF2EA812DA9C7D4DAE05A5DFE8DFEF8DCCFCF46FAA5D2998FD7B02C277385E3F2394D8FD3E64B5739E33A6D10FB028A928AB2D35D2492494FF00FFD4F544924925293A64E929F1DFACEDFF00B24EB193635CDC4A725AD73F69D9EA3AAA6373FF003ACFE42CBC7E8D93D7F2ECCBC1B5B895E3868B6F735CC68304CB760DDF41BFA47ADEFF0018DFF8A0C4FA3FCE5DFCC7F52BFE77FEEF7FEEB7A6B56AFF00C478FE6FFA3B3E87D1FA2CFE95FCBFFB91FC8F553A5C7C236A598FDBE296F77ABCF3306FFB0FA79370BEBACFACCC86506BB1A5C1BFA11BEE6EF764B5F47E83D1DFBEEA7F3DEA66814BFD116B4E4080EC7782CB8388935FB3D6ABD467F5DEB62EFE9479FE7EFF00E6B8E723FE4EFF00CD97FA1FF805CBFE60FA1F487F3BFCDFD21FCEFF0027FD2AAD2E2BE8DE87B75BCFFABC207ED7571DCEC88143D8E71240638ED7123E9358EFE6EC43C86E5D409B68786FEF012DFF0039B2B773BF9ABBFE4BFE6AAFE6BF9CE7FC07F23FEE27F2D407F363E9FD11F4BE97F6FF00EFC992ABD131E2AD5E6DB90D2ED343DC23D7925BA83007753EABF4FF00C17CBE925D17FE50C4FA1FCF33F9CFA3CFFAEC4CD1935AD1D0651955E39C9CEB3EC58AD05CE7B9A5D66D1F9C31D9EFDBBBD9FA445E82FC6EA37BC574DB752DDAD7E45CE643647AAE2719BBBE9D6DD8CFD25B6FFA5F4D56FADDFD1B2BF9FF00E98DFA7C7D13FCFF00FC0FFDC7FF0087F595CFA93FF22BB8FA777D1E7E8D7FCE7FDF7FE0D3870AD971D6BB3A9D4F0CE660D95B768B1CC2F617090D73C86D6E688FE73D3DFE9FFC26C5CEF4CCAA717EBBD5D2DAC706D394C635D21DA966F732CDA7F95F4D7517FF003C3FA5FD3ABF98FE6F86FD2FE4FF00DFD55BBFF141D2BFA1FF0049FF000BFD33E8DBF4BFF44A78DC5B19D8D767B851524CAC3554924924A7FFD9FFED160050686F746F73686F7020332E30003842494D0425000000000010000000000000000000000000000000003842494D043A0000000000D7000000100000000100000000000B7072696E744F7574707574000000050000000050737453626F6F6C0100000000496E7465656E756D00000000496E746500000000496D67200000000F7072696E745369787465656E426974626F6F6C000000000B7072696E7465724E616D65544558540000000100000000000F7072696E7450726F6F6653657475704F626A6300000005682168378BBE7F6E00000000000A70726F6F6653657475700000000100000000426C746E656E756D0000000C6275696C74696E50726F6F660000000970726F6F66434D594B003842494D043B00000000022D00000010000000010000000000127072696E744F75747075744F7074696F6E7300000017000000004370746E626F6F6C0000000000436C6272626F6F6C00000000005267734D626F6F6C000000000043726E43626F6F6C0000000000436E7443626F6F6C00000000004C626C73626F6F6C00000000004E677476626F6F6C0000000000456D6C44626F6F6C0000000000496E7472626F6F6C000000000042636B674F626A630000000100000000000052474243000000030000000052642020646F7562406FE000000000000000000047726E20646F7562406FE0000000000000000000426C2020646F7562406FE000000000000000000042726454556E744623526C74000000000000000000000000426C6420556E744623526C7400000000000000000000000052736C74556E74462350786C40520000000000000000000A766563746F7244617461626F6F6C010000000050675073656E756D00000000506750730000000050675043000000004C656674556E744623526C74000000000000000000000000546F7020556E744623526C7400000000000000000000000053636C20556E74462350726340590000000000000000001063726F705768656E5072696E74696E67626F6F6C000000000E63726F7052656374426F74746F6D6C6F6E67000000000000000C63726F70526563744C6566746C6F6E67000000000000000D63726F705265637452696768746C6F6E67000000000000000B63726F7052656374546F706C6F6E6700000000003842494D03ED000000000010004800000001000200480000000100023842494D042600000000000E000000000000000000003F8000003842494D040D0000000000040000005A3842494D04190000000000040000001E3842494D03F3000000000009000000000000000001003842494D271000000000000A000100000000000000023842494D03F5000000000048002F66660001006C66660006000000000001002F6666000100A1999A0006000000000001003200000001005A00000006000000000001003500000001002D000000060000000000013842494D03F80000000000700000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800003842494D040000000000000200093842494D040200000000001400000000000000000000000000000000000000003842494D043000000000000A010101010101010101013842494D042D00000000000600010000000A3842494D0408000000000010000000010000024000000240000000003842494D041E000000000004000000003842494D041A00000000033F000000060000000000000000000001C20000032000000005672A68079898002D0034000000010000000000000000000000000000000000000001000000000000000000000320000001C200000000000000000000000000000000010000000000000000000000000000000000000010000000010000000000006E756C6C0000000200000006626F756E64734F626A6300000001000000000000526374310000000400000000546F70206C6F6E6700000000000000004C6566746C6F6E67000000000000000042746F6D6C6F6E67000001C200000000526768746C6F6E670000032000000006736C69636573566C4C73000000014F626A6300000001000000000005736C6963650000001200000007736C69636549446C6F6E67000000000000000767726F757049446C6F6E6700000000000000066F726967696E656E756D0000000C45536C6963654F726967696E0000000D6175746F47656E6572617465640000000054797065656E756D0000000A45536C6963655479706500000000496D672000000006626F756E64734F626A6300000001000000000000526374310000000400000000546F70206C6F6E6700000000000000004C6566746C6F6E67000000000000000042746F6D6C6F6E67000001C200000000526768746C6F6E67000003200000000375726C54455854000000010000000000006E756C6C54455854000000010000000000004D7367655445585400000001000000000006616C74546167544558540000000100000000000E63656C6C54657874497348544D4C626F6F6C010000000863656C6C546578745445585400000001000000000009686F727A416C69676E656E756D0000000F45536C696365486F727A416C69676E0000000764656661756C740000000976657274416C69676E656E756D0000000F45536C69636556657274416C69676E0000000764656661756C740000000B6267436F6C6F7254797065656E756D0000001145536C6963654247436F6C6F7254797065000000004E6F6E6500000009746F704F75747365746C6F6E67000000000000000A6C6566744F75747365746C6F6E67000000000000000C626F74746F6D4F75747365746C6F6E67000000000000000B72696768744F75747365746C6F6E6700000000003842494D042800000000000C000000023FF00000000000003842494D041100000000000101003842494D04140000000000040000000A3842494D040C000000000CDC00000001000000A00000005A000001E00000A8C000000CC000180001FFD8FFED000C41646F62655F434D0002FFEE000E41646F626500648000000001FFDB0084000C08080809080C09090C110B0A0B11150F0C0C0F1518131315131318110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C010D0B0B0D0E0D100E0E10140E0E0E14140E0E0E0E14110C0C0C0C0C11110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0CFFC0001108005A00A003012200021101031101FFDD0004000AFFC4013F0000010501010101010100000000000000030001020405060708090A0B0100010501010101010100000000000000010002030405060708090A0B1000010401030204020507060805030C33010002110304211231054151611322718132061491A1B14223241552C16233347282D14307259253F0E1F163733516A2B283264493546445C2A3743617D255E265F2B384C3D375E3F3462794A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F637475767778797A7B7C7D7E7F711000202010204040304050607070605350100021103213112044151617122130532819114A1B14223C152D1F0332462E1728292435315637334F1250616A2B283072635C2D2449354A317644555367465E2F2B384C3D375E3F34694A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F62737475767778797A7B7C7FFDA000C03010002110311003F00F544924925293A64E929F18FADE19FF3ABAA48DC4DEDE49FF454ACD369FB3380796ED036EA74F26A9FD78C97B3EB8F55606C8F581FFC0A958D6E43DC037807B28C86505BB87D62EE9F91F68AEC7BEE6B5CC6BDC6480F11A4A1FA7D77AB07DD8F8F93934564FAAF631CEADB03D477AD77F315ED67BFF48F540820C1D7CD751F55053FB1FAB6EA8E4BFD3DA69AF09B90F26CBB0598CCFB45EFF45EFBED67E830BD1B1FFA1B327DFE95753D002D0644079DB3A5755AB26AC4B316DAF26FD68ADE20D83FE05C7F4767F61FF4FF0047FCE223BA3758AADF4DF876B2D01C4B4B44B431AFB2DF536BBF44E6574DCEDB6FBFF4562EC7AD136756E977D8DFB3D565B6DA2CC3763D4E190FC7AB1ECC4C6C8B1EFA6DB30EDC5F4F333A8F52CFB55946162D5F6BA2947EAB4B68CAEA05D6E43AFC6C4B9B6E28A7631BA6536BEA18F5E55F6751CFC1DFD532EAF53D4F4E8C965D93956E374FFB2E3D6FA0B6DE4BA6617D6B654DCBE9D8B9FE9583755763D76ED70F169AFD962EC3A17D64EA76D96616774CCAB32714B5B9365143DEF66EFA1F6BC6637757B9BEF66CFA7FE8D65F45774BA0FD5DC3774F77AEEEA15E583F68792CF55D87898D9AF69C766E6E6BB1ECCAA719DFF69ABAECF53D3CA62E7F17071B3FA8E3518782E155F6D6D6E2073AF7866E69CAFD27A75D9FCDB6EB5FECFD13130C227AAF8CE4351B3E96329ADCE6B032C60225A2EA6DAC3B69F7B7F4F535AF757BBF495AF37EB34578DD5F3E8ADBE9D75E4581958101AD277358D6FEEED77B56C3BA8DF4F5CC91439ADAF1AFC8A716AAC06D2CA197595B71E8A2ADB4D753FD365967A6DF52EB3F4F6BEDB150FACEFF00B47557E735A5ACCA6B09932058C6B6BB5AD77F65088119505D3265004F47296AFD52FF00C55748FF00C34DFF00A97AC995ADF54BFF00155D23FF000D37FEA5EA4627DE13274C8AD524924929FFD0F544924925293A64E929F09FAEEC9FAE1D59DFF0CD1FF8152B01DCF9ADEFAF0E23EB87578ED734C7FD6A9584E1EE07B4C7CD3482B82C0CB869F246A6B0F3B5C246920F1F728B29703C401C9F056B1D90F1A73AFC934AE0750D9C3C5ADD680D6001C35811C15D0E374AC79935336EEDE06D1F4A3E971F4952E958FEF693C49D7E2B7EB969E254323AB6B18EAD46F49C7F730D4DDAFF0073840824FD29597D6FA5D54EE2D1B77341606E9A8F6ED11FC95D334FB493A203B1ABBF21B65A37067D169E1464906ED9B844855393D1FA1399563DD60DAF68690D8D23F74FEEFB5687D60E8746474DB2DA5B16D23D481DE072B535EDC4A85969D0763A1F81D101908365470C786A9F2EDC473F72D5FAA07FECAFA47FE1A67E47ACFCBA855977560406BDC00F20568FD516FF00D95F473FF7699FF52F5781D9CC23523B3EF6993A6450A49249253FFFD1F544924925293A64E929F05FAF263EBA756F036B47FE05542C62241EFBB50B63EBE83FF3C7AAB876B87FE7AA56383EE1E1FEBEE40AE4AE2E207808251702C7D9696BB9747E2546BA9CF7348D7C63556FA7623EBCA24F0D2224729922297C626DE9B0A88EC0761F2F6AD4656EDBA842C0A9A183C5690600DD79EEA06E44506ABC32B682F78682A01F48FA37327CCA3BA9A277D906741BB80AA64D9D348F4CBEA6DA4C0687B43893DB6EE4C902BC16C8C80E86348772496F1082FCEC4F53F4B686469E253E3E2399510C044F8F654EDCBE97D3AD1F6C7B2BBEC05CDDE1C4C03B67DAD7353575E9ABC8F5EA5B5758CAD9AD56BCDB518896BFDDFF00548FF545B1F5ABA47FE1A67FD4BD5BFADF6D195660E650439B657657BDA080763B737E906FD1F5551FAA766EFADDD1C0ED94CFC8E57212B01CDC91A9C878BEF8993A65231A92492494FF00FFD2F544924925293A64E929F07FAF4377D6EEADFF001EDFFCF54ACEE8F875E7754A31ED1348DCFB478B180D85BFDA5A5F5E04FD6DEAE3FE1C7FE7AA5677D5BCAAF1FAC62BEC23D379752F9FF84696367FB4992D8D2F85710BEEF656F4FC73B5B93815D41803BD7C56ECF4C1FA2DBC7E77F2DC8195D2D941DF4925BCEBE20AD5B711F71BADCCB36E331D3B0BA1A770F6EF8F759FB9B10290CB2921ED2DD7DAC773B7F35D0AB027BB7A518F64BD39C7609E56A31C0F3ACAC9A5BE9FB55EA9F1051486593D2B032B5C8C7AEE3DB7B7700818DF57FA7E3DA2DAF1A8AC8320B2B00C8F376E5A55BC10028DD76D6B9BE4A39DD32C00ECCBD4AC360113DD0ACC7ADC009DBBF50476542C3D4FD3230D958B5D1165B25AD13EF3B1BF49C9E9ABABB2E0E7BD9E8B87BE352E70FE49FA09A9156D6FAE5D2DD6FD5E7E4077AAFC1B1B7B4F70C77E86F1FE6B98FF00FADAE33EA79FFB2EE91FF8699F91CBD22EB59753762BC82CBEB7D4E1C887B4B3FEFCBCD7EA583FF3ABA313CFDA980FDCE56701B15D9A5CDC6A57FBCFD04A2A4A2AC351749249253FFFD3F544924925293A64E929F06FAF13FF003BFABFFC70FF00CF74AC0C5A9F6BEC63352C63AC81FF000637BB5FEAAE8BEB9D2FBFEB97576B4682E6973DDA35A3D3AB955FA1E1D15F556398F3634D193EA480266B737D8D4384D13D14271E211BF53B9D07EB6E364D2DC7EA4F155EC01A2D78FD1D9FBAE738FF00376AE86C6B1CCF546C1A4EF90411CFD29DABCE31F01ECC9BF19F040D58EEC44E85AB5717A65C5A186D2299135C983FC90D55E7117A3771E43C3A8D5E9F7B79699F056B1DEC70826216457B9839D111993E9EB29ACA24EDFA80409F821DF6082663B954075105B13D92AAD16BE5CE803523C5327AE8BC11BB62EEA36D5596D741B081A1710D6FDFAB952C6EABD6ACBC0BE8AABA5C61D1634B88EDB55CB286E437520055D9D3E8C571BDD74EC05D06001085689120CF2F26BC5C5BF2DE76BA8ADCE209FCE03D8CFF003F6AE2FEA5B09FAD5D1FCB25B27E4E5B3D55CECF2EA812DA9C7D4DAE05A5DFE8DFEF8DCCFCF46FAA5D2998FD7B02C277385E3F2394D8FD3E64B5739E33A6D10FB028A928AB2D35D2492494FF00FFD4F544924925293A64E929F1DFACEDFF00B24EB193635CDC4A725AD73F69D9EA3AAA6373FF003ACFE42CBC7E8D93D7F2ECCBC1B5B895E3868B6F735CC68304CB760DDF41BFA47ADEFF0018DFF8A0C4FA3FCE5DFCC7F52BFE77FEEF7FEEB7A6B56AFF00C478FE6FFA3B3E87D1FA2CFE95FCBFFB91FC8F553A5C7C236A598FDBE296F77ABCF3306FFB0FA79370BEBACFACCC86506BB1A5C1BFA11BEE6EF764B5F47E83D1DFBEEA7F3DEA66814BFD116B4E4080EC7782CB8388935FB3D6ABD467F5DEB62EFE9479FE7EFF00E6B8E723FE4EFF00CD97FA1FF805CBFE60FA1F487F3BFCDFD21FCEFF0027FD2AAD2E2BE8DE87B75BCFFABC207ED7571DCEC88143D8E71240638ED7123E9358EFE6EC43C86E5D409B68786FEF012DFF0039B2B773BF9ABBFE4BFE6AAFE6BF9CE7FC07F23FEE27F2D407F363E9FD11F4BE97F6FF00EFC992ABD131E2AD5E6DB90D2ED343DC23D7925BA83007753EABF4FF00C17CBE925D17FE50C4FA1FCF33F9CFA3CFFAEC4CD1935AD1D0651955E39C9CEB3EC58AD05CE7B9A5D66D1F9C31D9EFDBBBD9FA445E82FC6EA37BC574DB752DDAD7E45CE643647AAE2719BBBE9D6DD8CFD25B6FFA5F4D56FADDFD1B2BF9FF00E98DFA7C7D13FCFF00FC0FFDC7FF0087F595CFA93FF22BB8FA777D1E7E8D7FCE7FDF7FE0D3870AD971D6BB3A9D4F0CE660D95B768B1CC2F617090D73C86D6E688FE73D3DFE9FFC26C5CEF4CCAA717EBBD5D2DAC706D394C635D21DA966F732CDA7F95F4D7517FF003C3FA5FD3ABF98FE6F86FD2FE4FF00DFD55BBFF141D2BFA1FF0049FF000BFD33E8DBF4BFF44A78DC5B19D8D767B851524CAC3554924924A7FFD93842494D042100000000005700000001010000000F00410064006F00620065002000500068006F0074006F00730068006F00700000001400410064006F00620065002000500068006F0074006F00730068006F00700020003200300032003000000001003842494D04060000000000070006000000010100FFE10DD2687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F003C3F787061636B657420626567696E3D22EFBBBF222069643D2257354D304D7043656869487A7265537A4E54637A6B633964223F3E203C783A786D706D65746120786D6C6E733A783D2261646F62653A6E733A6D6574612F2220783A786D70746B3D2241646F626520584D5020436F726520352E362D633134382037392E3136343033362C20323031392F30382F31332D30313A30363A35372020202020202020223E203C7264663A52444620786D6C6E733A7264663D22687474703A2F2F7777772E77332E6F72672F313939392F30322F32322D7264662D73796E7461782D6E7323223E203C7264663A4465736372697074696F6E207264663A61626F75743D222220786D6C6E733A786D703D22687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F2220786D6C6E733A786D704D4D3D22687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F6D6D2F2220786D6C6E733A73744576743D22687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F73547970652F5265736F757263654576656E74232220786D6C6E733A64633D22687474703A2F2F7075726C2E6F72672F64632F656C656D656E74732F312E312F2220786D6C6E733A70686F746F73686F703D22687474703A2F2F6E732E61646F62652E636F6D2F70686F746F73686F702F312E302F2220786D703A43726561746F72546F6F6C3D2241646F62652050686F746F73686F702032312E30202857696E646F7773292220786D703A437265617465446174653D22323032302D30342D30325431373A32343A31352B30383A30302220786D703A4D65746164617461446174653D22323032302D30342D30325431373A32343A31352B30383A30302220786D703A4D6F64696679446174653D22323032302D30342D30325431373A32343A31352B30383A30302220786D704D4D3A496E7374616E636549443D22786D702E6969643A34656266653730652D643236652D623834312D613962612D3232623834663439646366312220786D704D4D3A446F63756D656E7449443D2261646F62653A646F6369643A70686F746F73686F703A64633333616566382D343164372D343134372D626566652D3133623366363839326632642220786D704D4D3A4F726967696E616C446F63756D656E7449443D22786D702E6469643A39633734393932312D633861652D393634382D613065372D613762366131393131336266222064633A666F726D61743D22696D6167652F6A706567222070686F746F73686F703A436F6C6F724D6F64653D2233223E203C786D704D4D3A486973746F72793E203C7264663A5365713E203C7264663A6C692073744576743A616374696F6E3D2263726561746564222073744576743A696E7374616E636549443D22786D702E6969643A39633734393932312D633861652D393634382D613065372D613762366131393131336266222073744576743A7768656E3D22323032302D30342D30325431373A32343A31352B30383A3030222073744576743A736F6674776172654167656E743D2241646F62652050686F746F73686F702032312E30202857696E646F777329222F3E203C7264663A6C692073744576743A616374696F6E3D227361766564222073744576743A696E7374616E636549443D22786D702E6969643A34656266653730652D643236652D623834312D613962612D323262383466343964636631222073744576743A7768656E3D22323032302D30342D30325431373A32343A31352B30383A3030222073744576743A736F6674776172654167656E743D2241646F62652050686F746F73686F702032312E30202857696E646F777329222073744576743A6368616E6765643D222F222F3E203C2F7264663A5365713E203C2F786D704D4D3A486973746F72793E203C2F7264663A4465736372697074696F6E3E203C2F7264663A5244463E203C2F783A786D706D6574613E2020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020203C3F787061636B657420656E643D2277223F3EFFEE000E41646F626500644000000001FFDB0084000202020202020202020203020202030403020203040504040404040506050505050505060607070807070609090A0A09090C0C0C0C0C0C0C0C0C0C0C0C0C0C0C01030303050405090606090D0A090A0D0F0E0E0E0E0F0F0C0C0C0C0C0F0F0C0C0C0C0C0C0F0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0CFFC000110801C2032003011100021101031101FFDD00040064FFC401A20000000701010101010000000000000000040503020601000708090A0B0100020203010101010100000000000000010002030405060708090A0B1000020103030204020607030402060273010203110400052112314151061361227181143291A10715B14223C152D1E1331662F0247282F12543345392A2B26373C235442793A3B33617546474C3D2E2082683090A181984944546A4B456D355281AF2E3F3C4D4E4F465758595A5B5C5D5E5F566768696A6B6C6D6E6F637475767778797A7B7C7D7E7F738485868788898A8B8C8D8E8F82939495969798999A9B9C9D9E9F92A3A4A5A6A7A8A9AAABACADAEAFA110002020102030505040506040803036D0100021103042112314105511361220671819132A1B1F014C1D1E1234215526272F1332434438216925325A263B2C20773D235E2448317549308090A18192636451A2764745537F2A3B3C32829D3E3F38494A4B4C4D4E4F465758595A5B5C5D5E5F5465666768696A6B6C6D6E6F6475767778797A7B7C7D7E7F738485868788898A8B8C8D8E8F839495969798999A9B9C9D9E9F92A3A4A5A6A7A8A9AAABACADAEAFAFFDA000C03010002110311003F00FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8E35D5BCC737C2D3C9BFBFF666A389DAABAAEB92D09964A9F7C78D5CFA56B736CD2C94EF538F1AA82F96F534916762EE10D78F8E112B54DEDED35BD3EEA09B45B992D25620CA14D3265239BD8EDBCD5E6BB286DA2B8BE79A375FDFA924D4D3205B0232DB5BD4EF199998E5459C58F6A9ABEA16F71CB9114EF9125B120B8F3A5CDA026573418AA583F34D616346AB5298A09A424FF98F2DD0F80D2BE18691C4925DEBD7DAB05B61522434CAF2C51C6FBA7FE7122F60D17CBBA84175B333D4D7E6329E172714DF5E6AFE7ED22CE1043865814FAAB5F118F0B9A26F8C7F30BF306DEE7549AE2C8889391A95FA71E1499BC4758F3D5037A77ACDEA0AB47CBAE4E30713366E12F35D43F302DA14901531CE7ECCA7C72C11718E7796EAFE6ED57516663AA12A0515431E99608B8F2D430D9A677E524F3FAA4F5A9AE5822D0750978B98B8D140D8E4C63B63F9843BDC13F64532431B1F1AD0C5DB916EE72D8E362656ACB7457BE4BC3606368A13F2553F7E5321BB5F0EEDD0B6F916C0141ADD0558F5385BE2690CC5536E98B682985A4527312ABF1A6F5C9F44527A6F5255114979C48EC4E424136EE70A2D2593E54CA2516432D265A76A6F6B5FAACACBE041E995F0B319DE9DE5BFCCBF37E8C54E9FE619A075E8A1C8FE18699F88FA4FC9FF00F395FE6ED08C0BACAB6A71A302D2BFC5B0F98C890D8323EA6F247FCE5769BE63B8449ECD62F50F5D875AE564360C8FA2EC3CC5A46B32DADF898514F2F4EBD72B21BF14F74FF4D7626F1F53F8A192BF5207B785320439FC4115A4693711DBDF5F5F12CE8C0D913D857B640865CD910BAFAE46A41FEE46F95909115A6CE4BB46B98FAC20D7214C643662170CF7323C858AFA27E2FA314452DD56DE2D4F4C9F94A6B1827AF862DF163FA65C8FD1C2C11EADCA80D716F09EC33DE42A6D1472A2824F861069AB502C331D3BCB3E55F3C412795FCE9A746D05DC6CB0CEEBBD4A9A6FF3399784BA4D445F8C9FF3931F9253FE507E61EA96B145E9F97B57919B426A6C402C4D3AF866C605D3E41BBE5BAFA5230FC32DB583B90724F865D8B930CC5BCB5A16375C55AC5578E98AB78AA8BFDA38AAA2F7C55A3D7156B155EADD315560D8ABFADEFF009C6EFF00D677FC84FF00CD73E56FFBA45AE5A39349E6F68C28762AEC55D8AB4DD315598ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD0FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF917B754FE45FBB34FC2ED532A855A803C71E1551370C0E3C2AADF5A26361ED863155D0DC52840DFC72C2A39A6893B3D0124F8D7205B423E172F227A6C401D86D9516714AB5F0D52FD80A139193607916A21A49641526A722125825DE9F335C1F4C75ED96C434929D699A6C96C434DD0F639708B519B2F86D62F8446DC7EB1F0971B52990CB0D9871BE87FCB0F341D3236D0D5B8C6E3E2981A1FBF28E17231CD35F3479E9A06B8D356666080FC7CAA4D6BDF0F0B9919BE7FD5BCC7246F2B3BB10C4EC4E3C2994DE7979AD87666AFDAE9921171331B2C0F56D4F996EFF003CB045C5931D8EF2A483F765822E3C93012875EBB1C988B4108794A034D865910C68BA38D5CFDACB0048895EF171AE4C36479A0A470A7A6580362A4738A2F877CC49C775A4724E0D32149016B354935AD71A4A1DD6BD77C7853689173C4000D282981B835EBA75A0AF8D30316FEB00F53CBE780C5810510B7617A1A7CB21C2C68DA6FA7EA011872EBE39021BC16463520EBC791A11BF8640867128FB5D46EECDD26B2B9642A6A021A6408660BEA2FCB2FCFDD73CBED676DA8D64D3C301752BEE42FCCE56437639517E927903F33746F37E9D6F35B5CC6CC69C5188FE272B21CE195EF305FA4D63FBD6531AAF4047864086E8E4B486CAF94DD3C40F0427627A64086D8CD96A5DDCDA59B81C5A07EAC065720CA52B09035922C373792515250683B641116276C6D6D61BBE6F53302029E9BE2DF179F4113DAEA124A8F54249515DB16F0CA34926E2FE49AEE5291C6018F7A54F860465161EA22FDB4CB9B1BE11ABC42946201CC9C45D46A60F8AFF00E73E6C935ED07CAFE6151B69FEA733E1CB966C6127479A3BBF21B5802DEF21BB07F772A9A2F6CB896A8B7129F492423FBC15197E12C7338F7CBDA14FB8C555475C55CDD7156B156A98AB78AA8B1353BE2AB6A7C7155E3156EA7C7157F5CBFF0038D9FF00ACEBF907FF009AE3CABFF748B5CB472693CDED5850EC55D8ABB1569BA62AB315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB155CBDF155D8ABFFFD1FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF91688D3E8CD770BB55732D29BED5C3C2AA125C2826831E155317408208D8E02155E1B85AF4C8951CD358A7AEC0640B684DB436F56492BD16B9596615B5884496D2F7DF6CAE41B2245BC82F22E370C08A6F82213221279612262C82A46E7E599100E3CCAE5B8127C2F41C732621C6949524D42354F4A234917A1AE47306A2535D3BCDEBA4425797FA536DCC1FEDCC76FC4509A9F9B4384B899EB24952C6B5FE38D39824C1F50F30477E480698D24CAD8EDC5C8D85474E95C9C766360A4574C1CF635E9EF930D6404B3D13EA5541F0229BD72C01A26023D4B200A41E5D969BFDD9688B498A9C8A643CC30A7422BD32241B4C601C9CD0D0D4622D78559E6DA85BE9CB031A4148391EBD7EFC95A3758ABD0572A31B6611B1823A838384A95415A9D8EDDA98F09415600537EFDB070962DFD589EDEE477CA8B782D7D5877207CCE16629B36E3C4570F267C214BD23C80EE4F4C2427802690DB9461BF5CA484009D470F214276A6FE232B21980A5CBD19290CC580EB4DE83DF2B660332D27535212DEE8FFA3C9B487DB20591D9EA7E53F3E7983CB371CF47BA75B588D42722361ED5CACD22322FADFF002DBFE729E486FECA3F324A5B4F43C6EB7AD6B403F6B2B2DF0917D9AFF997E53F30E976D75A2CF1C72CA0114615DFE9C8172A322F48F2E1BBD5F477844BCCF02EA6BE032B937028CD596783CBD6EAE486690291DF2A6C890F3BF35C434FB6B478C9AC8A0B530D37C4879A9BFB99670B1D41AED5EFF2C0DE0B228A4BA8602D3935603D3A78FD1912CE554CFF004DBBBDD461B5B6949F4D3BB6DFAF32313ABD48BE4F08FF009CBD8E0D47F29B5582DF79B4BF4C311B9F889E99B081D9D0E789B7E39EB9664FE87818D4B86E5F7E5A1C5029425A239806C20F8732B0726190DA1CF7CC86A531D462AAABD7157375C55AC55D8ABB15506FB47156B155E3A0C55BC55FD72FFCE367FEB3AFE417FE6B8F2AFF00DD22D72D1C9A4F37B56143B15762AEC55A6E98AACC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5572F7C55762AFF00FFD2FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF91745DBAE6B5DAA0270038DFBF4C557A007DF1B569937DBBE025217C042073DC654C931B4B9E50CA83AF638153ED2A660AE69F7614A367BA58ED6466DC57BE210497946B3748D33508EB930030322C65AED519B7A6D930C0A4B25EA976A1A6581AD2C9AE872FB4704D38D012DCEFD72B6D40CD37A94DCD07BE2CACA024DF7F0C56CA8140C8FF00BB32CBD8569F0F7CAB27369C922D18005B7B89916CE2B561340E5BAB2F4EB92C64B5D943DB5FDB89F5295B5385DAF559A094950D1CE7B04AEF99B8C2D95595FCC31E95FA5A2F2DEAB79369A4C971E6692CA54B64886DBBF1E1B7BE654698F1747A07953F25FF00357CD5E47B8FCC3F2CF921F5AF26DAC924BAB6B8AEDF686F20A01B713919D1482F2ED2EE9AFF0053F4EEAE9567B5774B4D35A8AB291B1591BF678F6AF5C85320537786D4C727D62D7D2746ACB0024AAB57E1A37BE16C1BA0A592333C1F5AB6956F6452D6B040A646283AFC2B8B2D91111FAC46DF5AD0357B7907FBCF3A594ADC97BBF4ED8D30F103505E5DC61A19341D524914F1B6B916725593FDF9C698D3094C2BC17577C9A69749D5DD17E004584A7930F1DB6C698198519259239ED629ECE48EE637F5EE6CEF94DAB7A0DF64D1E87010C6D165EFA492CFF437FCEC1AD7982636B06996E39B2843F0A8095272AE0B6424C9F59F2D79A3CADA9E9BA7F9E7C8D3686FAFA7FA33DD1786BC056A3985C85331262333C3A54F76F7BC648AB4B360D5AF80195D16C12513E60D2CD80917D45D661916331703F0A31DDBE818981642749BC3AE6906375955CC900F87512A429FE19594FE60222D35781D3EB68CAD1034926660015F9572B3129FCC840C7E65D1D24BEB4B581E196ED089EE402E021EE32070CAAD7F3211EFE61B4168AB6D299934E50F75301F184E8085EF90F02523417F34193E95ABBEB4AB7361A9FA4427EFD88A72403A53C6980E92498EA8047DBF9C7CB567070FAFC915C4CE561708580643F1127B54E0FCA49C886AA2CCF4DFCE48343113DBF98273C2842D0D36FA71FCA172A3AB8BE9FF00CBBFF9CDB4D1FD0B6D435C905A2AD18F0A9FF896425A434CA7AC14FAC348FF009CD2FC9CD42C53F4D798CACC46EA631D7FE0B043465C6FCE29EAFF00F393FF00939ABD91B3B0F33299266A44F22AA8527BD4B659F932D90D6EEC1B4AFF009C92FC948F548E1D6BCDBEB7D5488E20B10E0B20DAA581E9954B4843B0C5AC0FA4F4CF3168FABC116ADA4C424D0EE943D9DEF51231DCD3B653E018736EC9A8E21B326B4D5ED26FDD28E20EDB6D8D535DDBC63FE7231043F97F76F6EA5FD68D8B83BD681BAE646271B34453F1A350B93EBFD65BAC723023C3E239B1C54E8B53B294BF1309FB5C0E4332C38504337F1C2CD662AAABFC3155F8ABB15587AE2AD62AEE15DEB8ABB80F1C55DD36F0C55D8ABFAE5FF9C6CFFD675FC82FFCD71E55FF00BA45AE5A39349E6F6AC28762AEC55D8AB4DD315598ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8AAE5EF8AAEC55FFD3FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF90949CD3DF35AED52FB89CF2AF7C55B86E091D7E78AA21AE147461F7E02A39A924D50F534F0CA99A334E620B96D86F4AE054F2D6EFD2473D3C3154A750D59DAD254AF1F88648734179BDEDD33C8C49D8E4C302C72E27356DE9930C6492F362E77DB26D6A44FC66A69B7538CD38D42523B1FA72B6E435483D7156B155F63A7CDACEBBE57F2EC774BA6C5E65D66CF4A9755A8E708BA9021600F600D6B93C70123BB466354FD9DB4FF9F49FE51E9B35B5DF9C7FE725E596D2C19259EC276B48A07400311EA48EBB7C865808ADA838F7BBEA8D27FE704FFE70B7F2CBC93ADFE62EB5E4ED2FCFDA1F97AD1F53B8D68CE66458A1AB332885B893F4E5D007DEA4EFDC5F217E7E7FCFC07FE716353FC95F327E49FE4E7952E35AD3FCD1A73D92DB5DE9DF548AD1A421898DE956229B1CBE2A0D9B7BB7FCFBAED6DAEFFE7DEDABC11C097125CEA9E608E58A641C5CAD0F02C474D8EF91931E27CE5FF386BF901FF38ADFF3939F947F9A5E46D4AC20D13F3DE4D4AFA3D5B502693D8AA5C31B692CB911EA29FDBA74FA3229E2A7E6C7E75FE48FE62FE43F9FB55FCAFF003FD93DAC31B9934FF32509B7B8B752CD0949A9C492805403D7037465694FE5779EB49FCAEFCC9F267E62EBFA147E6CF2EE9F1490DDE9774291BF26A6F8B2E2EAFDABFC97FF009CC4FCA9FCF4F37697E48F21FF00CE3B5ADDCD7052DF51BD5B3AD9D9DB103D4066084034DC570B1E305EEDFF00393BF9B5F917FF0038B736896771F9223CD9E6AD663E3A258D869FF588BEAA48520BA275A9D862C38DF24AFF00CFC07F285102BFFCE28EA5A6B472F2BE54D1A4243F7A829818193E5CF2EEB1F945FF0039A1FF0039BFA5493F92469FE42D5B4CB5D2E7D04C660314D0D43332281435070B0326BF337F28BCA9F919FF003F16F267E5FF00E5ED82683A169F269B7D6F08FDE822E95988A3D41D80C89E4CE25EFF00FF003F7E5B6B6D7BF216FAED56EE1B8866F5D446B172F848FD803B9CAEB9B3069F945A4FF8720F3D7902F7CCBA4407CA305FC0757B66735684CAA5B90FF572BE8DAFDCAB4F397FCFACEEF5A9560F2669B26AD218AD25536AE12579540001F528C7B5460970F716278AB9BE8CF3FF00E497FCE0E7E5E7E5C69FE7AF387E5468DA6F90EF8441677470419BEC02858124FCF23C239D7E3E4E29B7CC49E6EFF9F50CE925A2F93B4A8B4E1113C84120527C38FAB5AFD3938C224F543E93FC95FC95FF009C13FCF1F2BEA3E60FCB0FCA9D1F52D0EC646D3EEEE9E378D870A93D5DBC32D18815DDE0B79E65FF009F5A683AA6B3A4DE792B4AB0D6B4B9A7D36FE25B7763CE0AAB0E5EA53AFB75C9C71041BA7E10595CE9716ADE686D3E258B449B5DD4A4D123AD185A191BD15A7871A65BC23AB5926F67DC5FF3827AD7FCE27E9FA779F3FE865346B2D425D52E61FF000CC570865F4A341FBDA85652A49A1EB8384364645FA0ADE64FF9F54F0E2FE56D1154776B7907FCCEC7843689C97DBEBFFF003EAD240B6F2B684EC4D14185C024F6AFAD80C026539232EB55FF009F5B229F5BCA9A1AB20ABA7A7202A3DFF7DB618E30D5C459F7E5FF0090FF00E7DF7F9C370BA2790BF2B6D35DE5F66FADEDE6FAB236FD67595941DBBE1300CE32931BFF009CC4FF009C6AFF009C4DFC9FFF009C73FCD3D534FF0021E85E59F375CE85247E5495A765BA92F792F130866DD857B0CA66221CAC5399237D9E1DFF0038E06E1FF24BC8D6FA85CDC48EB67037D52742BC18C62AC09DCD7357A900BB9C123D5F4B695A658ED26C48DC819824539F1281FCC5F2E5A79A3C9FAA5A7107EAF03F15EE7E16E99386CD59793F083CE5A73699AFEB5A5BC6D088677081C52B466E999F8CBA3D4C5283B5B59A9054AA1A5733226C38110866FE39364B315545FE18AAFC55BC554CF5C55D8AB5CE9B53157733E18AB7B9DE9D715750F862AFEB97FE71B3FF0059D7F20FFF0035C7957FEE916B968E4D279BDAB0A1D8ABB15762AD374C55662AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AB97BE2ABB157FFFD4FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8EE4B96A57F0CD6BB54BEE6E4F2FD78AAE86E01502BB62AB1E41CC1F7C05211724A0FA7E1953247B5D0458CD771D302AC9756E0B4AE2AC5EFF0053332B28F1E9921CD058C5DDC9A1C98605209A72C684F7DB2618C96890713936B5093F7854786F8CD38DBF476F6CADB96AC542DF462ABFD318AAA691E55F3379E7CD9A1793FC99650DD799AF254BAD31DD8AC8AF1B7C3C69EF976201C4CE5F60F993FE70D3FE739BCCF6ED6FE636BAD4D0A7A0BA64974C55430141414FC72EA01A2CBF643F2F3F273CFDA2FF00CE0F79D3F27751D3560F3D6A7E56BAD3AD2D236678CCF22154058926A49DF7C9C764136FC52D1FFE701FFE72CB48B23A6C3E43D327E0C6E11A590B4CA587B532C0520D3F6A7FE70B3F25FF00307F2DBFE70CB52FCA9F37592691E78BBBFD6E6B3B02DD56EF8984D76EA01C892C0C9F94DF94FF00F389FF00F3995F93FF0099EDF98DE46F2ADA43ACF97B58B9B9BFF5A5741716D34DCA84568C0AD6981417AE7FCE7FAFFCE51FE6E79534AF35F9F3F2AB43D1FF002EBCAD1B32EA1612BCB7E1CA1F51AE118D5072AD074C590953F38FFE71DF41F23F993F327C9F61F9CBA9DDE9DF96FAE3B23DCB201688E1C22891CF40316CE27EE04FFF003953FF0038D3FF0038DF77A57E43FF00CE2AF97F45D77F31FCC37D67656F7518A6957724DF097B9BD427E3626800C58195B18FF9CAAFF9CCDFCF4FC80D7BCAFA67E687FCE3DF94F59BED56CC3691AFD83497715B5C16A2A4323861EA03B85271636FABFF002FFF0038507E40CFF9F1F9F7E46D13C8B05BDA9B9D3F4E4445935042AC10CEACBB48C69B0C5812FC5DFF009C15D5A2D67FE7381F58D3AD6DADAD7CCBAE5CEAD690D688B677723CB1C6941D830DB16264F56FF9CB6980FF009FA17962F26790A01A3C56CD08AFC512BA95FA2BBE25B81671FF003F8D92E6E35DFC86B458964B3FAB48F6A53790B537046408641F93B24769776F1C5A8D8BDC5E5005AA9AD32A21B8153B8D1ACADF59F24FD5E27B49CEB5640015A8FDE83B570034CB9BF793FE7E412ABFFCE01F962299A79644D5F458DA471425D6A77F6DF2C8C6A9818EE5F822DA1697A868B63A7E97A1869E3B413DF5D92F5F5075EF84367007EF97FCFA0C347FF38C9E7F8608E44B9FF10DDC61C0FDA11353EECB049AB806DF17E12F9AB47B1BAFCC0FCCEB8BA8DA7BDFF156A70A3396A02262C6BBF8938253D9B3806EB5E3B64FAAB416104933FC0DC4D7EC8CC7F14B1F0829A683A75C3FD616C230D727F7CA091B8F91C7C52918C27967E5AF2D4C04779A2A4DE22AFF00D71F14A784226DB4BF2FEA7AAD9F93BCA1F97771E62F34DF4C9FA3B4FB38E4964E75A091954D4283D4E4A323252007E937E427FCFA63CE7E6BD624F38FFCE42EA16DE50D126845CC1A268937AB24A08A94B9E6D5414EA2B970B69343DEFAFBF303FE72AFFE716BFE708FCA571F975F92DA2D9EB9E72107A561A1E8CA67B496FC01F15E4C0B1526A6B4C8CA7B338C093BF27E59F9CF5FFCCAFF009C81D6EDBF31FF003BB537D6EE21B8F5743FCBD8E42FA6D9467EC96E276A53BE60E6CF5C9D8E0C3B6E1F657E5BFE6369D731586871B246D63122D22A1B745A50468C07ECE61711939F5C2FA534DBE8E15925460EAE054D72328B7C24CC22D5AC61D12EA696CBEB7CA290B102BC7E13918AE4E4FC43FCFDBED3F5AF3EEAA2CE0F41D256DA94A6ED997093A7CE1E1FEA48CAB1C8FCFD01C57D8667623B3AF229D96A1D8ABB155CBDF15546ED8AAC1D3156F15770077AE2AEE03C7156B9D36A74DB157733E18ABFAE6FF9C6CDFF00E71D7F208F8FE5C7957FEE916B968E4D279BDAB0A1D8ABB15762AD374C55662AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AB97BE2ABB157FFFD5FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8D34BC51D4D0F8E6BA9DAA5D757887900C2A71A55B6D7229BB0AE34A897909F881D877C041506914D7085128E2A32AA2CB88285DDE7100A372E23B634578825125F3B6DE3DB0526D0734E0296AD08C9008291DD5D541EF920C0A4C65777FB27E7930C485FCC81BFD3930585174720E677DA9824530148B0F5141BE41B2D48B91D8FCF15B6BD4C56D917917CEFE6DFCBCF3E68FE74F25D8DA4FADE8686E21BDBD1FBA4E07970AF89F0CC8C3C9C5CFCDF7349FF3F5EFF9CA09EC6E2F7F40F96EDEE2C9C5CDC4A63A3948C50D169EDE39750B71DFAE1E46FF009C8DF3C7997FE70D7CC7F9F77D6D65079CF43D126F318B287FDE7668D4B05229D0853DB26021F945E58FF9FADFFCE5A79B35516DE55F22681E62D56E938AD859DA9967DABFB0057B78614BF5BFFE7113F3E7F303F3EFFE71A6FF00F34BCD7656107E6269DAB6B5A78B38978242DA7FD8475A7C2DB1A8C04354DF9BBF941FF3F0CFF9CA9FCDFF00CFA87F28345D1BCB916A1ABEA975A7BCB321458A3B4765E4CD4EDC70522934FF009CF1FCF6FF009CA8FCBB54FC9DF3CC3E4CD4B45FCDAB77FABC1A0167BE8560F85BD6561F0D6B51F2C5987E547903C85E7FFCE1F31E95F90DA75CE97A4DCC5234B6925EBFA51B3F2E410B7892705864FD16F257FCFA23F3F26D7B44BFF33F987CB7E4EB2D2CACD0DEF97A57FAFA5C210D14B5634E4AC01AD70A0BF577CE1E75FC81FCA3FCB5D0BCB7F9F7E7DD07F32353F23411CEF26B7325C6AD737D0F499537AB531624BF32FF00E7323CE1F9DBFF00392DF975379D3CA7E4D9FCB9FF0038CFE50893559ED75188C37B3C51FDA96341406234F84E1A60FCCAFC9CF2BF9BFCFDF9CDE47F2C7E5B79864F2479AFCE0F1D9F917558E43088E40A5C7AAC3703883D31E140897EB27E5E7FCFB5BFE727B4DFCF1F24FE6C7E63FE61689E709343BC49F53B89E691E765414DAB4AD6B5C69B86CC2FFE7EF9AD68DFE37FC9DF2EE8BA9A4BE67F2DDBDCBEAF6D237C36EB22928CDE0180DB2259805F3C7FCE28FF00CE04F9B3FE7277C8B379FED3CEF2E942398C3C1E42073EA05011EF913BF26775CDF5A68BFF003E80F35DB6ADA36B1ABFE62B5E3E957F6F77F57E65AA20903D055BA9A5300891D14CC17E927FCE507FCE31CDFF003909F913A5FE4E5B6A8FA49B39ECEFCDFF00EC97B4D954EFDF2C0C0CC9DDF9B23FE7CF5E6CB5D3445A7FE68CD0DDBB5651EA3052BDD766A644829F10BF463FE710FF00E717AF3FE717FF002A75DF235E6BF36A771A95F4DA9497719F84348A568373BEF954C90A245F9F1E67FF009F44F98B5AF37F9975FB0FCC06B6B3D7B50B8D4C42F211F1DCC86460C037515C4094BA289D17C03FF393DFF38B1AC7FCE29F9FBC85A4EA5AE9D56D3CC32395915890415F72727E1D06CF11E5115ADBC0BC0ACCAD3B3189E9B75DE990E109E22AF02A25CA98A4775EE7B60A0C6CBEB5FF009F6E24C3FE73B742F456393FE752D5CC824EC9C7E265F714DB2E8061225F657FCFCFFF003C3F35FC97E6DFCBAFC96F2179A27F2BE93E74D264D47CC3E6289FD3B9611CDE998B9D3BA8E9965048912FC9FF002E796B4CF2F6A1746D8A5FCB75704DF6B7A99ADCBC86A4C8A6BD77CAB200DF025ECD06A30454B7B39648D29FBFB81D251E0C7C335D962E7E29109E69570F65730DF69E56CA20DF15B45B4751D5BE6731E31A72B8ADF587E5979ECDFABDB5F5C28E2005E47AFE18261BE05F56793754B6B9B7BDD2DD11E3BD8D979B741B532B00B39BF217FE726FCA5FE19FCC1D4EE238EAB732332D3A1A96E999100EAF5043E588DA30F351BE22DF1A9EA0E67E2D83AD9157A1F0CB98BB7F0C3452D12075C08B5CA46FBE2AA8C46DBE2AB01DB156EA3C715773A6D4C16134EE67C31B5A6F883BD7AE3687701E3855FD72FF00CE367FEB3AFE417FE6B8F2AFFDD22D72D1C9A4F37B56143B15762AEC55A6E98AACC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5572F7C55762AFFFD6FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF87A96FEF941ACBF8E623B3B0963DF5F16DA5AE34B611515DDF541F571A5D9318B53BD42A1E4AA7ED2E0931927706A3CC0E9BE52D61166E7638B38A5E6EBE33D4E2D8103717049C52833FBC23155616C42F21DF15434B1D3B62A868D7E36F0F0C5894746A3DBE8C582BB461BE43155168462AC93F2FBF2CFCE1F9BDE7FD1FF2EBC9776965A8EAF19905C4E6900A1A7C7976271B31DDFA2BA47FCF9FFF003D7597F43CC9F997E58B4B688049A0B3123CA57AD18AEDF7E640F268B7EC4F907F217CA1F937FF0038F179F955E75D6E26F23C1A335AF9A359B87280447FBCAB9AD12872616DF1CEABFF003963FF00381FFF0038BD6BA743F96BE5BD23CF9A8D847C5755F29411C972838D2B3CEC2B5DC8241C905B5BFF003EB4FCC58FCF1F979F9AFA45BDB470DBEA3E63D675CB68140E5026A2EC544B4EFF00150E4BA2F0DB17FF009F7DFF00CE324FF963E63FCDAFCFEFCCDB44B09FF4B6ACDE5AB8B8F84DBC31CECCF23927F6C74DB010CB81F96DF9DDF9D7FF002BE3FE7253CE9F98D6F74D045A7CCD65A2E9970D50A9033C3CA01414E4054E56436C616CDFFE712FF28FF257F327CF9E6FF31FE72FE7149F963AB796353B69BCBCB6F75F56B8942307356F0AE459786FD51F38F93BFE71CFCE8D7B3AFF00CE71F98B48B4344BB5D3B5DE01005028483E032A32A3CDA4E2277A79DF977FE7DABFF388BF9C724FA9681F9DFE67FCC6BB8EA6F35A1A8ADDB0A750CEC07864F8C745E0A7D95F97BE4CFC8BFC81F25FFD0B3F99FF0036D7CCFA7F9B4496BA47977CC577EBDF4905C8A0B58A951C00FB2B931913C07B9F1A79AFFE7DDDFF003895F947E615F32F9A7F3CF59FCB2D465BD7B8F29DF0D405ACB64ECC4AADAB863C4A5683DB26269AA1C932B9FC9FFF009C6DD4E4B4D31BFE73E3CEE249C520787CC4435C9EA55985795326770C385F15FF00CE607FCE3DFF00CE35793FC93A9FE677927FE722AEFF0035BF320CB15BDBE9DABEA02FAEAE854A30AD6A780ED95C837C075A7C55E4DF31FE71792B429EDFCA5F991ADF923465E12CD616174D00776151B2E634B6673887D0DFF38F9E6FFF009C92F3EFE7CFE58F92FF00E576F99F50875F9E3D66F2CA5BF77A5BD9C80C9148A76A3807614C8F38DD72712517E82FFCFD9BF3BBCF5E43D53F2BFC95E46F376ABE50D47CC9A7CBA8CF75A64ED0168E297830629BF6F1CB9B7146F67E4949F9B1FF0039096D688A9F9E7E6F8AD66FDFCB72DA8CA013ECD5AFE382DCA9C283F6FBFE7D73E78F3479EFFE71CBCEFAC79EBCD5AC79AEFB4CF30DDC2BA85EDC34F27A0B192A159EA695A9EB8251704737E2FF009DFF003E7FE720AFBF30FF003022B5FCE7F34697A7DAEBF7D69A7410DF3A2450C729F4D68294016836C31A05CD8E332890C035DD5BCF3E67D574EF30FE64F9EEFF00CECFA07C7647509CCECBCF614AE4E73586911714D00BE54BA9663752A97D3E2AFEEC022A6A3E5989293951D3D2B5AB7A48ED5FDAFE3862584B1BEBEFF9F69C9EA7FCE75684C3FEA4ED647FC933991170F2C69EDFFF003F6FDFF3EFF26475FF0070139A7FD1C60916A897C11A8C06541DF8C9CA998F22E5C0A7769767EA8B08FD9ED9448B971679A34DCA08E393ECD77C85B75DB34B4D4A5D2EE2196CBA0209A64245CAC6FA93F2F7F32121B8B35B9702BC565AFBD3DB220B64F93C6BFE7316D6CB516B1D6AC183B3AD5A9F4E64C0BAAD445F9DD35A43EA99631F13EF2FCF2FE275A614A6E782D075CBE05690E243D3DF2EE882BC0E79596B937C78ED819479378B2762AEC55ACC79736D1C9BC4312578CB43592EEB920C097F5CDFF38D9FFACE9F905FF9AE3CABFF00748B5CB87260F6AC2AEC55D8ABB1569BA62AB315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB155CBDF155D8ABFFFD7FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF864BB048AACD51DB311CEB4BC2B147612EE01C56D17621DC0AC98ADA65E8307525EA2BB8C124129D5B45D38F4CA501306040229D716C8A58E28E49D862D88571C9F6DC629548E36A8DB154D235AAD08E9DB1541DC42687E1FA7154A1D5D0F43BE282A91C8E0F4C58F0A3519A9BEC3B62BC2B8891BA2938AF0B21F2279EFCFF00F94DE7DD13F323F2F2682DBCC7A3AFA3682ED3D5818B1AFC51F7CBB1CA9C4D40DDEF1F99FF00F39CFF00F3963F99305EDCF983CE163A19D22DDC48BE5D88D8BAB28AD1F89353F4E5DC40971E9FAFDF975AC7983CE1FF003EDFFCC2D67CC3ADCBADEAFAC793AF6692F6F5CCACAEC87A96F0C9476B5A7F387A7BE85A5F97E686F0C4B71A859A08A7863264776DF812A09AEFDF240AD3F707FE7D29F951F9A9E58D67F327CEFAF794AFFCB3F979E6FD06D2D74586F289F5A962209786B4A13D6A72D06C289D3D0FFE7EADF9D7E75FCBCFCB8F2D7E4FF95F4E9747D37F3126922D63CDB6EA5623146D510C6CA2AAC4FDADF7C494F1EEF91AF7FE70E3C83AA7FCE05F92BF3AEF2F5BC95F997E5B8A7B89B5A998AC37BEA48591645EA49A0A13EF9592D8323E2BFF009C7CFC90FCC1FF009C9CF3F6A1E5DF285F695A3F99A0478754D4EFA15781907C3CD50EF5A6F91B6632ECFD44F20FFCFAB7F26BF2AB40D53CD9FF003943F98B1EAF1E9122DD31D16E0D85B451A7C6C6757AB301DE83A60113F0419DBEF0F30F9D3F2CFF00297FE7157CDDF985FF0038E51E8F77A2E99A34D3E87AB584002CA507C25DB882FDF7A647C2A533B3BBF9ABD5FCC1E62BDBFD3BF38B52F3E1D5FF00332009E6CB79656692289588A59C486BC597C06110A62723F717F317CA1E4DFF009F8A7FCE1B683E61F29DEAA79DFC9B6E93C371250BAEACB12ADCC53746E24D763921162676F3AFF9C76FF9C4AFCACFF9C2AF256A3F9DDFF392BAF68DAC6BB25AC8348D2EEE1F56DE1050845489C37C66B4AE4B8D1C4FC98F3C683E4FF3F7E6A7987CE9A0F95AFF00CB7F97BAD5E493E91A34D227AD21690B17B72BF654D4103C32B3367E3523BCC3368DE5ED38437CCF631C29EAC4D72DCC48631544A0AD49A532A3BA7C6B7EAA7FCFAF3F21AF74CB6F31FF00CE577E62D9AE9F1EAD6D2BF93BD61C560D302B7AF32F2A5140527135F00C38ADF0C7FCE507E6BC1F9E5FF3923E60F3559336B1E4BF277ADA2792A590F34B9B5726B3475EC1AB91F136761A7C24EEF13D4A2B98216F556DEFED9374B08928CA3C0D76C7C47272E2D9FB2FFF003E9130C7FF0038CDF98534B0936D279BAFFD6B75D8AA08A9C7E8CB89DBE4EAB83D4FC42B8373FF002B0FF346E6C618E5B6B7F36EA8E7D75E4157D634041F0C864950761A68F34C66823B9FAC35E7A572978ABF0C0BC42537E99852CCEC052AAA97948E11B154E30923E3000EC721E2309CC24B3CE90432F3902146A3D4F427A65F09383972D3EC4FF9F65C7327FCE717971E44204FE4DD65E13D792F03BED9990E41D74F2713DD7FE7ED2449F9FF00F92E10F22FE5F9CA7B833E5732B10F862E5828B84A5655AD5331E45CBC6126D3AF59262937EEF7D81CC79172E2F55D2984B0523352AB5DB204B918E36C8F4C9E559024919604D2A72B949CA80A679663EAD494CBE9348414FA32024DB241F9EDEF35FB18ED9C35C431A101FA819938E4E0E585BE39D634AB9D26FEEA39A268D2662D096EE3DB2EE370E5898E354B6FF7E6463938D38D34D18D88FA73281D9C5915363C7A76C8940709053734381B03B9A78E2AB81077071575478E2ADD3C329237656EA1F0C900C495DD865803592DE4A9812FEB9BFE71B3FF0059D7F20BFF0035C7957FEE916B96057B562AEC55D8ABB1569BA62AB315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB155CBDF155D8ABFFFD0FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF86BB8802C67311CBE240DB460B32F63B1C57899159D94483A7CB15E25595139003AE465C97891F6DF00CA9215659878E2D914A669013D6A7B62D81411BE21E18A519137BE2A8C57A6F8AB52BD57DF154A6615A629014E35DFF008629A469140B8AD2262C5682DBA92EE182EA4897D5B636D227A6366F588F8581F6C944B46585BF40FF00E70A3FE70BFF0024FF00E723FF0029B5BF3279AFCCB2E85E6CD3F54FD1B7D1CF7CB1F2A8279716604E5FC449B718C2BA3F4B7F3B2EFF00283FE71B3FE7103CF7F9456BE72B18EF350F2ECFA4796A059D267BDB87144850231219B975392053E1DEEF8D7FE707F47FF9C0DF27FE58699F9D5E7A920D17CE3645F4EF33E9FE629BEBB0472C5F6A58ED983503B74A0C9DA38084AFFE7217FE7E75E7BF365C5E7907FE719F438FCB7A1D9BB245E63302FA77D68A6A9F554D84551B9A76C78E9A678492FBA3F267F36BF20BFE73B3F246D3F2E3CE2F6ADE69D3EDE14F3568B7AC8B7B693DB95E53432C86A3D4707ECFBE0333C988C469F327FCFCB3F353CABE53FCBAF26FFCE267E5CDFDA3C1E60317E9B4B77594D8C5624344ACC8763215A1191E3A663097E57797752F3AFE5FF9C6C7CCDF943A9C9A0F9CF47B37B69ADC3304BA5917E290814069EF94F8AD834F27D89FF38B3F927AAFFCE6FDA7E64798BF3E7F37350B297C93A92E973E8C3516B68AE39C65D8B46CE015A8A5732465003038E4FD4FB9B5FF009C5EFCACFC8DB6FC88F3D7E61E976FF96F73A61B09B4D8665F5F8B1DCB4D11635DFAD301CF148C322F85A05FF9F51FE534B65AAF9524BCF3E5F69779EB5A587D6E6BA592E54502399556AA41E94A644E701B069645F0D7E4CFE707E71FE4DFE6779E7F353F27ACA7B7F2BDEEB5777FAA7901F91B67D325959D04716C81E8C454657F9A8B68D148F47EAA587FCE5D7FCE207FCE64F97A0F277E7DD8CFE44D68148A2F29EA333219A56D898E455E2373B03F7E40E51F51E5E4C65A390DBABF3FBFE735BFE7193F2E7FE71D6EBCA4BF931E6B9F599BF306493F44F97BEB7F5C7B6892AE2854B05A8A0C81CA48B3C9A8E9A47A24BFF3851F919E41FCF8FCE08BCB7F9D5E708F47BEF273A5EE8BF97374C527BFF4784AEC676A2B2AF75EE36C1C6472EBD57F2E62FB7BFE738BFE730D64B5BBFF009C5CFF009C7DB8B4B9D4AE02D96BFAD6931886D349B68C7096D02A1E279A93BAED8F89E9B972FBDC8C7A49134FCD7F2F791E1F2BD8A68176E65963AD2F474AB6E687E67304EA2CBD060D36C9D5FF00962CDEC2E4C7290D6F197694577A7CB271CD6DB9F4FB3F537FE7D471DBC1FF0038CDF9836D79756F682FFCD9A8A47EB4F1C6DC425391566046FE39B033B1B793CF4F170CC03DE7EF7E383E88DABF9ABF332F6D2329158F9BF538A57471C64549295DBED5731F3CEA2ECB1E2B0B64B2FAB6DC295ED9A83959F8450935A7AA80863180EB571D695CB2191AE78497A47FCE3F7E527E5A7E66FF00CE4DE8BF97BF9B2B736BE4AF3858DC5D45789762D544B6F1928399200E4453E9CDB69C931BBE4EB73E120D53F757F207FE70C7FE718BFE71AFCE927E65F912FE4935C165716D61ACDEEB114F0C16970A04CA23671527C4666125C2188F73F2B3FE7E3BF9A5E4EFCDFF00F9C87FCBEB2FCB3F30C1E6A87C89E5FB8B0F31FD554D22B812972BEA74AD08CA67CADBF1E3DDF31DAC4D05A3A188C69337A8439E4E1BFD6CC69173A18924F4C0BA048EF98E4B950C4F51D01855631D5C01954E4E4C31D3D46DF46944493053B8AE63CA4DA229835ADEBC6A5222C22EBB64449245AB5B5C4A54C33C541EF9938E4C4C2DE59F9A3E5C4BCB14D4ADE3DED50AB53DF2D949A32627CC778E915B014A4B5A1CC8C527559E348462CA23AF565AE6C22EB25CDCA390DFB64CB3839A315C836114B7D35C50EA53618ABB155C1C014F0C8916825AF572403025BF532603025DEAE5822D64BFAEAFF9C6B35FF9C74FC823E3F971E55FFBA45AE0661ED78A5D8ABB15762AD374C55662AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AB97BE2ABB157FFD1FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF881BC880420F5CC3E20E424B0A857A1EA4ED8F12B24B50B4218D31E20AA8F08670CBB9ED809B0A39AA03C41076395F0B604BE5662C6870F0B30504E1C9AD31E165C6D29E277FA7070B21205171354FC382928CF8A83E78D2B8D698D2A12406B8A625A8D0D7A6D8B2B45B23300145698AD85F1EDB1EB8ADAA4A225884FC4CD3AB045B6AD0153D5BE8C429A2868F47BB86133689E66D47465BDBA56BFD32CEE6585789FB529E0402465832531E005338FCBB6FA84CE751D4B53D461B17E766D79772CEAF20E8C15C9030F8BDE98E11D11F0795F499EFEDAF6F2C266B595F85D69026222007FBB997ECB57C30F8C19F83BDB33B782934292BC7E8C4ECB672C2823F4231B2D78815DB6CA67985B64710EA91EA7E5A437115F68D25EF97EEA32FFA4F52D3EE5EDCDE06FB3511914E390F1E9B3C081768DE5FD3ED8FD72E26BBD7F5E0DB6AB793BCAF427B1724ED909E7B671C1001E86B6EF2DC590922A49044CAFABA1E2483FB240DF7CA8E50DBE0C52883F2E6D4EB125EC771AA59E917959750B0B1BE96DBEB128E858C64549F7CAFF3738F271A7A404BD4B4AFCA0F20CF6D75A85CD86A90996129159DE6A12DD0527BD5C9CA726AF24F9B762D180ED0FC95E5FD05E19F4BD0603769271769155C18BC68475F7CC796693B0C7A50F52D3ED674B48A28163B4912E1A66754142ADFB0C0751EC72BF1A4E6474B163FABFE5BF943CCB3DC5D6B1A12EA3716A39D98B522DA49246EB491402299911D4D7544B4B1287F227E4F59E81AD5C7992EAE2F3EB112D346B2D46E1EF7EAA0FDA0A64AD36F0C9CB59C5CCB8FF901D143CF1F94BA579AAE96F74992E3CADE648DAA3CDF6933C721435E6948E8DF1034EB9286B047CC2FF2782ED17F2EB4DF2AD9BD969566F737F74419BCC533F3993F9B9330E4C5B213D582092E54745188D833187CB62EAD134DB88792A75D40F53FC73046716D98F152B4FE598AD6DD2D6CC85957EC5CB0A807C48EF96C753109CB8F886CF269BFE71FC4B7D793E99E62D5B4A17B5B899AC6F26B783EB2E7E26F4A3206F99B1ED1A157B3A89682E5C54CA34AFCA7D23CB5A63D9C76B2DDDC475996F4C86AD3B7DA771FB44FBE5597571946ADCAC7A7203CF75FD0E64998087A1F8B35E32370D384AE0D338C0E49F4DD47C2C45687B6646292CB00609E67F2EBEAF0D8DC5DC93DB6B36CFC6DEFEDA5689E28C9F8802BBEE336DA7CDC2E0E7D2C65CD8A6A3A0EA36B2B45A7F9B35FBC8C7C715BFE91B85141D57ED77CCD3A814EBB369611E5F794CB42B39B42944DA3DD8824D64F3D75661EACAA4ECCBEA1DCE512CE1A2189EBB1D84090ACF0C6C2D8AF0F58B16E4DF2CA279A2E6431A0534EF527AA2D77CA2598391114CF346D3E7867B762945E42B944B286FC71E3E4FA7F44D352F2C21089CCF115DBDB293305B0E0932587CBA3D27458E8CC3714FECC00B0F0A439B17D4FCA324619C2D3AF41FD99930986420C0753D0A76B1BCB59D39C12EE58F63965F1726196161F1E79A3CB8D63A8CFCA32B6FC8956CCBC669D26AB1960ECBCB91614543C53E599F09874D381054A46F4E95D81E872EE265034A4F2F1343D698096C26DAF52B8A1557703155C411D462A8377F888AE203592B79FBE48062EE7EF93B6041772F7C9713120BFAF7FF9C68FFD671FF9C7FF00FCD6FE54FF00BA45AE066393DB714BB15762AEC55A6E98AACC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5572F7C55762AFF00FFD2FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8779E6690D0E6BDC86E0B62C55A9D0D6B8AA7B1454C555F8814C473508693A9CB59A5E480C49E98AB4CE9E18AA1A465236C05945742699536F1047092A078E2B61716DBF8E15B08391B7AD701482A9130DB026D16ADB1FD78ADADE4395715B5CC6A062A9859FD93912D914FACBEC37FAD95C9BA09CC1906F8A6B0A0645AF8E565124EE5B5E56640EE320531482C21F4EE0AFF29DF2B9330CEACE0F56829B9C8368E4CDAC6C8B24629D3205B22F49B3B43FA35969534C81722095DBD8BF3A50F5CA8B97065B6766FC7EC91909392190E9DA51E60F1A6F539510D822C94E9842EE2B4182922294BE9CBBFC3DF1A6D10413E9C95E9808D9918A3AD6C100A53AE505ABC3569B4C47A10BB8C57C3455AE9E00E9D714786EB9D2B9A3F14DE9B62830A0F10F35689708F3388C77C945800C0A1B0924B69D5D00DF7CCCC658CA2C43CC9A64B085600D3332127032879C5F44D1D651B3014CBB8DD6E68EC9569E93493D373BE4096BC707D0DE5ED224BCD3238D81217E2194CE4EC2186C27B0F95E4120223E9ED98F22CCE9CB2BB2D12485E12E869514DB2B3272F498082FA3BC976F1FA31C6CBD80C00B9B2C4F5CB6D22065A85FB5D72C12689E35F75E5C826423D304E4C16838DE5DE70F28FA16FCA18FE12A4B003FB332B0C9A270A0F913CE5E598A54B82F0FC42BDB33232B755A885BE51D7EC24D3EE1A3E344EA332A05D2E68531CB9903428D5E99931710841897950E5A98F25656C595ABAC805315B5479401F3C56D2F91FE33BE4C354B9ACE7EF8B1773F7C55DCFDF157F5FF00FF0038CFFF00ACE1FF0038FDFF009ADBCA9FF747B5C9ABDBB15762AEC55D8AB4DD315598ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8AAE5EF8AAEC55FFD3FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88316FCCD45335EE42630C7C17891F11D862AAE55A3FB5F862AA7CC9751DB08E6A164BD4E58CD00D192493F67C71552654F1E98AA832AF6EB91290B797134C832564620D6BDB1557E551B1EBDB1542C8AC687016512BE3246C4E0656881228DBC715B5E11CEE294C56C2AD0D003D7B629B4CACC1A53B9C896D8B20B34655607B9A8CAE4DD04EA089F20DF14C63AA7153E3BE56512656AC0D9EFE1902CA2C7A01FE94CD4D89DB2B9320F44D1A22C54D36A641B43D174E882B0E4366E9902D917A259DB936C4506FD32B2E44175B598E7F677AEF95972E0CB2D2D502EE3225C90C86CA10A46DB6574E481B270E8A474ED8D360012CFAA73AF15EA71A6C0109258B03BAD3011B3202D523B609F6B314B2E04D22B3590034AD714702362B38D4D08A62BC08D92CE26864A0DC8D8E2C670D9E75E64D0627B39A4352789ED928B8A214F04F4608659A2058B96A71236EB97424C65040F9A34E89EC95C28AF1CC98CDC1CB17806B5108838E3DE800CB3C475D9216A7E5FD3A7B8B80238C31276180CD9E1C4FACFC9BA25D0B4F4DA1019539357C331E591DBE1C2F4FD1740FAEC9C12352E3AD76CC796473469D93DC796E24291B4604886A6991E2B6EC7800667E5DD3440E9F0D0786112672C6F5FB14B68E3024AD587C3B65824D13C69CA476CD41BFB6D9609B41C4A77FA1C17F6B22320208EF97E39B899A0F913F337CA4B6E2E0DBC436AD4D3E59970C8EB33E2B0F827CFDA605F55B851D76FD599B8E56E935189E113865050F8E66C0BAAC91A520A4003B66406B05554D3AFD38A6D706A1AF6C56C36D20A7738ADA14B124EF930D6D54E28754E2AEA9C55FD837FCE337FEB37FFCE3EFFE6B5F2A7FDD1ED726AF6EC55D8ABB15762AD374C55662AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AB97BE2ABB157FFD4FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88EB5527A8EF9AF72138584000F862AB580622B8AAAAC0BC4B6D5188E6A1033851F3CB59A058A952062A876E3FD715506A74EF912BC90EDF6B2B5E254AD00A615E25367618AF129FAA5B6F0C0520ABC75207BE0648911B1236E98A11A88C314DB60126A7E8C59C135B35DC644B745925BAED95C9BE09EC0BF08C837C559C5181CACA24CA6DC7A9694F6C814C52DB7B73EBF4EF95C9987A5E876C788DBB641B4727A3E9B685DA314E832B2CE2F46B2B6263094C8172609D5AE983903E395972E0C8E1B001694C8C9C909A5A5A8AF4E9869B849363682831A6626BA2B44A7D9C69B04D42E2D12A76C8C86CCC4B74B4DA1AF4FA3304B7DA6F69684F1D8605B4CC590AD298ADA30598F4DB6ED8944B7093EA9610CB613A9515E27F5620B488BE60D5F4C486FA62ABD1F7FBF260B19063FE62F4CDA08EA2BC72624E0E58BC2354B0E572DC96A9434F9E4FC470B82CB37FCB4D05AEB534E70FC3CBA91F3C066E5E2C54FB7B4ED02D6DED144680394A1CA2537678A349BE91A6AD9CA5F852BDF2894DC8B013A36A269D98AEDDB0464D9020B26D2ECD232A4AF4CB049259A5BAC2FC435053A659C4D134E3D3B7420F2C989341451B988008879061BE4E33A71F246D83F9B7CB36BA8E997521505CA93FAB32F1C9C2CB8DF97BF9BDA0BD95D5CC623A0DC8FC336584BA6D563A7C937D66DEA91D2873658CBCEEA0520658FD26E077D81CC98F27094F0AB44818ADA8B362B6B7AE4C2BB15762AEC55FD837FCE337FEB377FCE3EFFE6B5F2A7FDD1ED726AF6FC55D8ABB15762AD374C55662AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AB97BE2ABB157FFD5FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8A0B7896BB6D9AEB72116C388EA3DF1B553E05BEC918DAAA51C2F1E43082A94DDF21DF25C4CAD2AA495D8E3C4B68696564D88C78D6D62B926A41380C946EAA2367351B0F7C8DB2F0D50055346618DAF86B1E30C2AA7AE36BE1A82A146F886C7A6048852696F172DE98A784A64B1AAF5EA7A62BC255982D0D06F8AF0950E209D87CF10120F0A696686A36C0436C66192DBA1DBA6552722124FEDE2240E9ED951939312AB340C29B8391E69E1B647A78ADBF1EF4C8908BA46DB5848CE1C5284E57209137A2E836CCC428A5477CACB744BD434BB378594BD083E1954A5BB7443D074EB477A11403DF21C4E5420591431716F8874DB225CA8C29378D4505075C8916DDC48BB65A374DB0ADA6C232C36A615E3A44288D054A934C5B233B509551C6C0D7232E4DC0A10C04B0D866010DE3284DED6DD956B4191B65E222429077180C93C48F8684712363913365CD21D4D084954746072226BC34F9E7CCF02C124EED4249DA9F3C98935C9E37AF34B2B829F647519306DC3C91B49ECB467D52EE2855284EE49C375CDA31E2B2FA6BC83E4C86CA38E568D79F723227239F0C74F6EB4B13EA0DA8A17A1CA897240A4E96C569F0819598B2E1255C5B46801A6E3AE08C59C2242716691BF414A78E4D914D2283E3156D97240B4C85A36508CB452464F8DA4C54EDA89255892064E32B6990A446A33A3DABC22B475A0CC9C73A699C6C3E1FFCF3F2C7A51C978C8ACA63AFC3D7B66D304DD46AB1ECFCEAF30DB98DE4923015549DBBE6DB16EF2FAB86EC2259FD56E46B502999575B3AEE02A7CC7BE4830229631A9F6C242A91563DF224D32112570141BF6C226B54B4B81E3878969776AD7256B4B4B01D8E2B4FEC23FE71977FF9C6EFF9C7C3E3F96BE53FFBA3DAE4D0F6FC55D8ABB15762AD374C55662AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AB97BE2ABB157FFFD6FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8A889788DF6CD7539086B99B8D6871A5538666618D2A20C8C0548E98D2A0E6FDE0A8FBB1A54BC2D1E871A540DC805F7F1C6954F9704AD37E98D3387344464BAEC298D37F120A6B794B7C24E34BC48A855900E5DBC71A5E257DA62140DD37271A5E24C625E031A5E256049231A5E2452AF2071A5E25F1435AEDF4E4834CF74CAD63A1F6C816706456895207BE51272E0CAADE1A2034E994C9CA8F25EE9C8D298C4ECD80A75A5C7521299125AA4CB9221146AB4F880DF2A2562CC7CAEB59D790DAB9025CB845EC16F10E4B45DBC731E5CDC880671A58A28DB22E6E309C2A0E75A77C5CB099451A918B021116F1FC74F1C5253A48A806D8B54954A2D3F8E2D9050E0B5A78E097272A28848158F4E9984425191A0414CAC8641A6A02476CAC86C0BD245515F0C810CC1A63DADCE1629187864405E37CFDE636699A6205687A64C313BB03B7D224BFB9E012A2B97458F876F5CF2D792A38E786478A8DC7C32333B2638A8BDE749D320B481005008194B7009FC50C75D862D8023046A0785316C010F20500E29A57B324134C2A426292B066C0D642A3CAD4A62D6421C5C145624EF5DB2C816B942D0525F173C589A65F02C0E379AFE66E996FAAE8570B40CE10D3F0CD9603BBACD5637E4D7E6158C9A7DFDCC0148018FF000CDE603B3CA6B31EEF25039027DF326F7757214D85F965D171A4E2BF2C99601BE3D3A65127231A9323576E9910C64A0C8D920C56A96AD0E58155D0035AE495FD83FF00CE337FEB37FF00CE3EFF00E6B6F2A7FDD1ED72618BDBB15762AEC55D8AB4DD315598ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8AAE5EF8AAEC55FFD7FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8A8F54702DC7305BD2695FD57E9424E2A898542F520E2A887914A15F11D71542A9AD452A7C7154BA7942494A6F8AA5D31323020D2B8AA22180135770569B8C5944EE8E411D28B8B6A1979198A114DBAE2AAF28F4D775E55F0C556DA71E4E7895A8C551EEEA829D7C062ABA08DA46240A0C55341198D6A472F962ADC13A92CBE99153D7161229DC101A06AFD19596704DECFED57C0F4CA24E5C198DB30740A053DF2993971E4ABE8947A7DAF7195B34F74A819650FD457A64496B3CD99C712CF2569C41A6C72B25B718671A0D9849148A139025CD84767AD58C01D5052847539496E8C7765768521A2952D4F0C0E66308812564340684EC3172404CE1734AF86282138B70052A7AEF4C5849368D948F0F6C5AA4B1C507DADB16D8286E7BF4380B9314744D4ED98A42551989208046F9590C8284C5BEEC810D810AEEDC0F6C8109972633AD4B5B765A9269D7234E3C4BCC24D39EE5DAA6B53D31AA72602D3FF2DE80AB74ACEA0EF5A530F139508BD86DECA389A3E294A0C04B394682747E08C7C3906B015ADA60E7885208DEB8B301184D462CC0404A18EDCA9E18B346D8802B5607160423FD440C7DB162434F32018B59096CD729E1B6374988492EAED549A0CB2326528B1CD465FADA3C4DF65D78D0E6CB049D5EAA2FCECFCE9D1E2B4D6AE233462E49047BD3377824F2BAB86EF96678C452C89D402733E06DD0E6145439004ED991170A4B8508AD29932C03741E19449C8C6DF25029C77C8863258789FD9C218A1D901AD053BE5A154591BB1A6495FD84FF00CE32FF00EB377FCE3E57AFFCAB5F29FF00DD1ED72618BDBF15762AEC55D8AB4DD315598ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD0FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF89F0E3D33BE6370B90957306400773B63C2A893C9057A531A5414B39AF107738D2A6360038353D31E154BB508584E08FB23BE34A81F41BAF8634ADD1B74AFBE3C2A0A32D41F9E0E14F1353B32CAA4277A63C2BC49B7C0D082CBBE3C2BC484A537514C785789A1148F22D477C78578995C16E91C4848DC8EB8F0AF122B8464531E15E2524B74120A0EB919041DD3B55548C6525BA2BAD1AAF41E3BE5127320CD6CD78C60D329939514DA35E681B8D77CA645927FA70008DBE79592C3AB2FB280C8E1E9B1E99025CAC4377A3E8500E6A4FD39592EC71C5EA7A75B5694E990655453A11716DB172F105648A86A7BE2E5008C8F614C58108849CD7AF4C5A64994539D8E2D5269AE0B122BF2C5B20A911248AF42712E5453D8A9435CA2412BCD011E195C83243CCCBE34AE564360404C418A403C36C8D32E618B5E219BE06DFC31A6B1043DBE9C88EAC57E795C9BE019569D6D142438503DF2A2E4C4D0653115722831059C8D84C245063E98B00142301771D7BE2CC05766DB16C010ACA64AD0D08C595226D548A8AE2C486D890C77C5AC8519588077C2C084B26734EB954CA46C92DC826BBED8C249914B48F8C0FA7365824EAB54762F867F3DA0FF738E69DBFA66EF049E5B56777C797AA05CCBB53739B5C6E833F34BD97AE65479B8325C3651932C02ECA24E441AA0C88632688184315608BC47CB2D0AA4C8BE1D724AFEBEFFE719F6FF9C70FF9C7E1E1F96DE54FFBA3DAE4C317B6E2AEC55D8ABB1569BA62AB315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB155CBDF155D8ABFFD1FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88C69196127AED9570B9096DAC8649D09D80618F0AB26963050B571E15484A8697C287070AA610308CD41AF88C3C2ADCF2ACBFB1F11C78556B47C63E5C7B74C78552891B91200E27C7052A6FA64609DCD70213292D95E4A70A537AE0295CF6C586DB64789544DBB12AA13EC9DCF8E08CAD53386D49A129C6992B545CC68AA03538F6F1C6D54EDCB4A695C6D5368AD893CB9F4ED913BA2DB9A42B48C0DBC72A945BA324C34BB33248007EA6A4D328945CB8167013EAEA13EDD7BE5243951927DA622C90056D8D4E52609326436500120402BEF95CA34DB0C76F41D3AD38471ED94C8539B8F15335D2217F500029EF95172E269EA9A7A88E38EA2A69BE066237BA6E6207E2AEDE18B91134E238D3BF862DE26AF1C7CE9BF1C549B5AABF11F638B4C8A3D361F2C585371C7CBE2AD37C52364CED5796DE180B7C7226491D3F6EBF4640B3E25B27C3DEB4CAC864248095B96F5A65526D0508CFB78E479320503E887979D694ED9599B6844B5B86150DC699519338A6F6E802019592D802776D1D5280EFE3823CD289766E3403A65BC2B6A28581A15A0F1C7859892282961B1DCE3C2DA0A998985487EBD4E3C2C81B5D1A322B1E75A63C2B24BE49DCB9DBA63C2D6A4CEEFDE871E16B2859A1928183D699465145318DA477AF242A0D0B1390894CA0878F9B3A9A54115AE6C7049D4EAE3B3E30FCFBB7923D45AE78F2AEDC7EECDCE1C941E53571DDF1B6A16ACB3C8EC69CB7E3F3CDBE09ECE8B34774918D0D3C333625C1986E95EF97736B6CAD3BE5320DD02B9412064445245AF1193DF080BC2B0AB02464C15E1586363DF1B5E17F5F3FF38D029FF38E3FF38FE3C3F2DBCA9FF747B5CB03597B6E143B15762AEC55A6E98AACC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5572F7C55762AFFFD2FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88D98A8B7639072125B39544C3E78AB27797F75F462A948156A62A88A30C554E163F584E5F67154E27E0D0D075A62AC7648CA82701546E95381285F7C8143339230D1864153DF2252A0A08201195211D0C695078D7C718F34A39A48047C76072C548AEC8E69C0D41EB8AA63A7C144E647CF154CE175AB8F7C082B1A1F524141D4E466CE2CA34AB6F488246F98F37331B2066569157282E4C59269F6CC5D4A8F848D865726639B34D32D97EB09C865322E6620F41855508551B28DB289976100C974992928A8DF2825917A04120E2A7C70B743927B6EDEA003B62D88958F93118B64516917100E2CC287A7F113E2716B3156040F9628E144C4B45DF7C578530B55EB812228A1CA83205B5425E546C8499452E7E54CA4B70429EA3C32259072FDA39410CC146A005699021B01B4CD015400E4086C0532B7978AD46301452792351CB76CBD00A2163E54DB61BE2CC145A41B74A571660AC922A0DB6C5B6254516BC875C5050BF54E4EE695C581287961E1DBA62D64A02694468478E63E50CE058FEA24BAA9032B8865296CA5C9A28E33C7AED99D846EEAB57C9F257FCE4246D0C493B2ECDDE9F2CDCE11B3CAEAB9BE25D56759642C050140299B6C01D0E61BB139012C69F4667E37026BD010287AE5E1A951BF865726C8AE465005722DA15D5D7EEC2AA9453BD3AE2AEE2BE18ABFAEAFF009C6BFF00D674FC82FF00CD71E55FFBA45AE5A39349E6F6BC28762AEC55D8AB4DD315598ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD3FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF87EBA9D962318514F1CA2DBD2086568E74237E4DBE36ACCE37F5223DB1B543A8E2F5EB4C6D51AC57D3E58DAA5F50581AD0D76C6D5305E4C8057E9C6D5053A108C08DBC71B5405BAFA73F20DBD712ACF6C6E8AA54A06DA943912944170E6BC403E195A15D2E022BD5474DB0412C76F2F19A4214D07B658AA96FCD8835E7E3ED8AB258A65861DE9B8E98AA5E977C653C68C09A9C5053DB39C33A92A0E426CE2CC6DD8351BA517A663CDCCC689854B5CA6F9417262F56D06C8488A37F63944CB7445A791C0F0DE2A28A8AF5CA497371067F6567249C7634A7DACC79173E316496561E8C80F224E524B221964638A281BED930D914DECE765A7C35C2CD3B81F93569D4E2D91473B6DD3166146353254D29BE285850F2229B62AAE8EE9B7018AA6768F4EA3AE2551ECCA83C72B2C908F286AED909328A11C8A74CA4B7041484006942476C052A51824824532B21368F8EB5DF61E390219829824818053B656436028F80A82141AD71884996C9BC4AAA011BE588053355AA29A52A77C5B01560CAA37C5982879248DC30AF4C59C4A0165547206F5C524A3519284FF375C5AC940DDAA052791C5812C62F1BE02C054A9E994E4512A414BC1EDD5C8A1F0C8C53C4E6712A20540420AE66E1165D76A4ECF9B3FE724B4F79FCBB1DD2C615947D91ED4CDCE10F35AA7E736A49E9BD1CD0F1155CDA61E4E833F349C0A0E43E23E199D8DD7CDD52DF115A13DB2F0D4D9A93D32B93645408F888AD37C8B6856403BB6154482B403962AA8154FED9C55FD75FFCE35FFEB3A7E417FE6B8F2AFF00DD22D72D1C9A4F37B5E143B15762AEC55A6E98AACC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5572F7C55762AFF00FFD4FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF876BBE87315C8485CF160DE06B8AB2DD364F561FA31555941018E2A88452D01F962A955584943E3B0C5538B771C77FBB156AE1D1D4A8EA70C552A02928F9E48A197589AAD3DB22528D63C72A4202EA7288287AE304B1A7959E5A7BE58A9D5BCAD12123BD3156E5D4491C4B6F8AA8C37039160D5A9C50591E9B745A5515EF909B38BD1ED5FECFB8CC79B998D3AB14E57287DF282E4C5ED7E598D43A46DE198D939B918D92DD411A5DA35075DB289173F10675A5BC7E94629BD331E45CF804DE8CCD551B786524B221388549550763DF2D8F2484DA24E00649926D6DDB16C8A3DFA62CC23ADE35E35F6C59D34235E67DF15A44FD5C374C569AF4590EDB602B4BDB91C8162A251B7ED909328A83A353AE525B8210A357A6053C9B58DC6FC71402AA0B1143B7BE408660AF5661DF2B219828BB695BD51BF6C88E6C89D936FAE84E35392620B23B5BB8E48802462D81AB89929B362D80A5227ABB0E58B3057AA826BE38A928D8CA804571604A1AEDD781DF16B258E3CF17C5191CB91A8CAE41ACC964482E3946A9B0ED8C42789A82CE732B2AA1E20666E1145C4D472795FE7CE96F2792E591A3FB009CDC610F39A97E4E6BCE5EF64A6C17E1A7CB3658DD06A39A5F08063DF3371BAF9B7407A65E393535C4572B9364541E262C48E9916D0B789185555436D8AABAAB53157F5DFF00F38D5FFACE7F903FF9AE3CABFF00748B5CB472693CDED7850EC55D8ABB1569BA62AB315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB155CBDF155D8ABFFD5FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF87BBB5531935DF31E9C863A543921B61ED8D2A6FA4DD324A200070AD2A7AE1A54E75173071F4C0656FB44E0A54C34F904B0716006DB61A54B2E222B72A00AA93D7052A342468952C41231A543955506452491B50F4C2020A1A83D415385871325D3E4F8B8F6E38299DA6373444E4BD7DF0708674C7EE1E4956941B1C1C20208A4BE38BF780B57E8C076502D386904501E00134E87236C8458C4B2C92CA6A00DFB640C99885A3AC80F4E466635076C788B194190E94DFBE06BDF2066CE117A759CCC4AF4D865129B9708B35F2E446F2ED44BB007F67283272A317B669F69F5495668EA76037E998F236E4420C87D2378E1CECC3F972B21CA86CCC749B3A471835AF7CA65172A136530C25187C35CAF80368926D1C2397235A9ED92029B446D328E20C37AFB6165C29A4302A01427E9C590D915C1586F5C520A362015401DF167C4E650096A9AE2BC48A85CED418AF1225959874FA3015E25AB6EFD5853293265C2E3180694EBB642526622AA2C95C7C24D72A25B4042B69D3A49CB882A0EF91E25217B5A3FECA60E363C28792D66542C62F8475A6478923642B46C3A46D8136B6349C3AF08CF23DCF4C40DD0648EB9B19446B21A863D874C953113455A7AB1A0E47638D33135D7771E9AFDADFDF1A6CE341C127AA58D7A0C04536C668E499D76FC7032E26A5BBE20107AE2C52A9EFA490F1DA98A0C6DD691722CF4E4D5D864A301269C9B328D32131373F4D4D7AD4648630A192470DBC70BCC8A0DC336E87A53333144071353C982FE6C68306B9E45BF515F552363C53C7369843CDEAA443F147CC3A4CB6DAC5F5B5C03188A4603E55CD96301D2651658DB22C5550DF2CCB8389382C415515CB9A0C5771CA6452154283414C900D814E445180AA9C6C4B71A6C3224A53058C507BE438D5FD727FCE36EDFF0038EBF9063C3F2E7CADFF00748B5CCA8F20D079BDA70A1D8ABB15762AD374C55662AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AB97BE2ABB157FFD6FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8749E4AC447B652DE9347F131A77DB1557B6AC3386E9BE2AC8AE5C5C427F9A9B62AABA7B98D4027154C4C625607BF6C550579CA31C7BE2ABA08CC916E31415268087C5AD34B4E51B03F462D8134B97E51FD18B68415AA076901F0C05126A5B602A5464648097CC484653D32B6C4A963A927C7BE565B62B91FD30E3C4E218493CD1A4E532FCF2126507A969FBBA8F1198E5CB83D5FC9B6D5BAE9DF292E541ED92A18ADD683282E54026BA2C2EC39B0D8644B7443D0F4C8D782E5527222190C71AF31B641BC04C52104834EBD316F8A67142076F9E2C9305B72698AAB0B638AA323B7341B62C9CF6C7154C2DAD136DF154E560840F703014851692255F88019410DA95CF7766A08E601F1C810C9049AA5BC469EA8DBDF2B21B0228EAD1488C88E3938F872045325B15C4951591720C11C2E55455DD597B8C55DF5AB56EC98AAEF5ED88FD95F7184319206EAF2071C3D41926210735CC7140A43D77ED8B20C62FB52E4E141F6C5B137D2C92189E8C36C05B2298CAC1109C8B3B486F2EC28DCECB8ADB1A7D7218A5E25FA75C56D33B7F355A5BD393800E5B02C08B4DD3CFDA7A2D0381F4E49908D2D5F3FDB199B8C808E1B0AF7CBB1C9C6CF0B4A0F9D67BAB6BFB49B7826560A0FBE6CB14DD0EA30597E74FE7368325B6B97B7B04748A51C811E273638A7B3A2D462E12F9DA60F1BA07EE73371C9D76514887015A83C065D6E21E6B7204A40554FE1841D99A9C9D701296E28F7AF8E564AA37A0CAED5FD707FCE36FFEB3AFE41FFE6B9F2B7FDD22D733A1F48683CDED39243B15762AEC55A6E98AACC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5572F7C55762AFFFD7FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8739D15050D6994B7A56838C8A53A72DEB8AAACCDFBCF87C7154E2DE86024FDA036C551B6EBB6E37C551F1CA237523B763EF8AADBF40F1FA83ED1DF156ACE5E30D0D3962828D58E3937A5716B5748B7A1FB23A62D817CA6A287718B68528488CB15EF80A24AE5CB0C8C9012BBB4F877CADB12C8C1DC0CACB6C50EC84B1E58B0927DA3C6038206F5C849941EA7A38F526507AD36CC72E5C1EDFE4F83D39B95329939507AE9ACD1A2D3E119417371F2659A55BFA70F151DB225BE219469B190429D88CAA4E44427D6EAED3053F6720DE032686D01A6C698B604D52D1788A038A5328ED8F15DB6C5518966081B7CF1555312203418B2433E2ABE3623BD3155579F82925BA024E2AC5AFF5A8F81A380720437304BEBDB89598A49F09CAC8641266B8946E646FBF2B21B436BAB4F1FC21CFCF2B904AE3ADDCAF499BEF394B05875FBCA504E7E938AAD5F30DE29DE7A62A887F32DC471971354F4A610C648287CCB712CB4692B9260190C1AB4D31285AB45A818B30EB6E7753FC7B8AF6C5B1E81A7C451197A055DB0499DD35773908DB8DB22BC4F3ED56EE5A482BB0AE2BC4F2DBFBB732B166A11E18AF124536A2EE4297240E94CB20CE25080DECB25217600F8EF8934D9619058E9FA9F2462599BB1DE9928CF76899B67B67A56AB7118528294EC3336191C2C98ADE51F9ABE4D9A5D3EF649E127D0879A353BD333F164D9D06B70D17E7FDFAC4CD70B30FDF40E4474D86C7BE67E2C8F3DA914972492301EA50B77CCC8C9D613BABAEF4AE025B61BAB2004D3240ECCCB6F12D2A7224AAC0FC7E8CAC9558F3B76A7CB236AFEBAFFE71A8D7FE71CFF2049EA7F2E3CAA4FF00DC22D73610FA47B9A0F37B5E490EC55D8ABB1569BA62AB315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB155CBDF155D8ABFFD0FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF87FBA8BD4048194B7B1D95BD16A1EB8AAAC3FBC353F3C553112FA6A476C553AB12255A8EF8AAF9E321AA3B74C5549AE015F4D8EF8AAC4AD76E871414E6D7B138B5A6C801E9E18B6042DC6DF3C5B52DF50A927C701449176CFEA353B646480985DD972841A74195B63152BC1C8EC0E565B62A4D4635F0C430927FA42FEF07EBC849941EA7A0445AE51BB0EB98F272E0F7DF2E22D40194C9CA83D12CB99611F5DF6CA0B9F886CCEB4D0C38AD3E8C89E4E44597E9F0FF00A415237DB2A939116530DA8F5850641BC06490460103C31649B2C6B4C551491B6D41B62A8D446A0F871569EDCD09A6E7164817B73BED8AA1243C176ED8AA4379764065AD6A08C55874D652DCEC95381B9520D0AE08355241C890C9171F961E43464A8F97F66565B0233FC191B293C7E2ED954F932E88197C9A00E998CC12CB8F2B8B78DA5E05F8761DF156297F6621AD206DBBD31563176EC6328B0B29AF5C218C90964D289B743D724C0335D3999E52A548F8716619DE89680B863D716C6573968D2918DFF6A980A4A4924C4F20FB7BE4516C475754653C37AD6B8ADBCDEE74C92791A83A9C56D42CFCB5732CDC1622E09EB4CB22764893D3347F216E924D1F1EFB8FECC848A99BD2EC7CA9630AA82AAC7AE40163C4CA6DF4AB5800E2829F2CCA84940619F99FE5A1A8F937549EDE1065F4986C3C01CCFC52D9D36BA1BBF1A35FD2CD96A5A84338E327ACDC54FF00AC7363864F27AD0C6648CC52943D466C205D213BAF4C9B978BBD156E393D0E36CA489BB4E2A3B57204A1219A52B5C892A8749F91A57A6564A1FD7F7FCE346FFF0038E3FF0038FE7C7F2DBCA9FF00747B5CD9E3FA47B9A4F37B6E4D0EC55D8ABB1569BA62AB315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB155CBDF155D8ABFFD1FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88FE09E89206F986265C86217D18790FE1928CAD5640FE91DF2684C42ACA093B8C2A9DE95F01A1FB3E18AA6578547D8D81EB91B4A41229E7CB2064847C0EA29CB718612B2829FC7E888EAA37F1CBA835A26DDD016277DB225B0284E19CD17A65664DA103242114B30EBD30192D5AAE9FFDE644C9908B241CE489D4EE00E982D980C4F50B52AC59453DF06CD8024EBC91B89EF9125B238C1E6C93493FBD51DB2B914F000F5FD094ACC9C45052A731E45B601EE3E5621A401B7AE504B9B08BD5ECA14AAB22D189EB98B3951765860299FE9502D15996AD90E22DE22199E9F6D1FA9EA71F8CD2A7236DB10C9E1894B82474EF8B626B144ACE7E793114A611464B713D3C325C2153A8E3000DBA0D8E0E10AAAC0A8DBEFC7842AAB0F86BED8F085B40BF5C7842DA577708E2DC0531E15B62F3E9EF2B13C490712026D1765A5246DFDDED9512BC4C892DE355A7015A656496C125C88A29F08CAC96F8C95C01D29D72B2CEDC638DBED2D722634B4A0F676EC0D23049ED9548522987EABA7C6C5FF74BF2A0CA49626DE75A8E99C8B462314AF4A61848DEE903BD278F4708F511EF5CBEC32E109FDA69C435553E223AE3B278598E9903C34EC3BE1B09A4E652163241F88F5C8C9B211058B5DFED6FD6B9149800C6258DA4675AD47718B510A967A6C4CFF147518B512CE74AD3ECADD59961018904138AC4B2B49232B420500F9603BA69689A388D176AEFD71A452256FA9FB59206992716CF16A9A65E69B3012452C6FCA33DFE1399FA736EA759B97E31FE70E94BA6FE656B564578DAA3B3431781A939B9D3879AD6403C655A49EB34E794A5882DD36068336511B3A1C9000AA00074DB2B9158121176E55483DFBE52665CB8C6C29DF5C301B361E22A62C6E6766AF235C9B02104B38434069878583FB10FF9C653CBFE71BBFE71F1BC7F2D7CA67FEE4F6B9B087D23DCD079BDBF248762AEC55D8AB4DD315598ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8AAE5EF8AAEC55FFD2FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88D8DAB09F719801BD8DDC8A4849EC77CB2294B5C736AA9CB1531B69285636FDADB0A19143FBB5AD7A60554F53D45627B602942BA77F0CA8A143D4DC01E38C0D154FE02C621E19719288A362069F3CACC9B045308E2046FF007E5664D822A7731064000E991253C2A7A7DB7EF3A64789908B2BB5B6AF30456B8F1331143EA7A627A65A831E26C1160A6CF94D41DB6C04B6C62CA746D3099936AF8E5722A43DA746D302F134DC65132CE01E9BE5C88ADC5076398F22E7630F63D1A20F22A1F1CC69F376388507A3D9C3C19401F4641B87366D610D29B6F8B6C53A4401C7862CD31B789CB123A65A392A610C3273C2AC8228C71507AD3155EF18A53BE2AD32EDFC715413AEF8AA19A307AFD38AB696D19EC36C0555BD140360065549010B22D180F7C810C8158401F3CAC86624B3991B9391E16C8C9DEB0C4C5B4168DC8405ABD3299452C72F6F1199878E6398A6AD875ECAA5C90054E400A4F0D2053E371B77C3C48643656C6B5A6D4DB1E254E12260BB63C4AB5A195C30F0C902DB89239AD253CBF56499C9237B57491B6A16C5A24995AC0C083DF16892730C8D1EC72405A225182E881D70F0B2B51376A49E477C7856D512ED36DFDB1E15B649A15D1127C3FEEC0CB4FA0E6660D9D6EAB72FCAFF00F9C90B196DBF342F66238A4AC493F7E6E74E5E73561F394A156460BF66B9B2076745946EA7FC72A996B886BD42A72AE6E643925D7331634C980892493DCFDA51DB6C980C4A56CE49D8E4C06A7F645FF38C1FFACD3FF38F1FF9ACFCA5FF00746B4CCD8F20D079BDCF248762AEC55D8AB4DD315598ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8AAE5EF8AAEC55FFD3FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88D880E040E87B66006F492FA2F88803AE5914A1C5B7186BC7E2F1CB108781585C46CDBAA9C2ACB15E3684803738154955A35663F6476C05285594BC9C6B55AF4CA8A157D052E2837C8F567109CDB3AA808D8993688A6B0C44B0A7D93DB2064D8229EFA01635A2D09CACC9B0456081581F86A720649E15D6F6AC1C7A6BC71E26422C9AC6D242D535A63C4CC4532BFD3CBC068B534C789988B036D34C731F82849C789B04597E8765C654257204B121EB9648B18400509198F32CE019C688A82652A286BB9CA497371F27B068CA81D582D0F8E5122E7E3E4CF6CCF29D2BD3C322DA39B36B4AF3F84D17B62DB14D56A5B03364368E811011BD284E5D1E4A9B200402A389F1C2A8F49102AEDBD3738AAE3221EA31543927715DBB62A82949036C550F473FB471556457A801A82BB9F6C555E458A31549BD4F639021925B35DB80CA2DD189E8DE190216D45EFA38AD889621EA53EDF7C810C4C92A4BB8DA29A46958B28F8129D72206EB19A0D2EA607D53C9D3F9299618B68CADB5ECB7069E87A71D3E2343944E0DB1C9691DD7EF83F01C58577198F28B609B1B78A560C492483F6B299C68365DA2ACEDDCC82BBE55C28675676A0AA80BF1531E154D52C588E98F0AAE5B1707A75D8E4A21B71A12EF4F2A84AAD0F8E58CE4C4E6B26939A96E2F5F84E2D1256787D2B16319E52C42AD20F018B449E6F79F9A5E52B099ACF51BD4B6B984F16151BE5916B2692D93F387C822A1B5B2BF223254BC4BED3F363F2FAE24A0D6D9B7DEB4C697899345E73F28DE11F53D5D2A7A02C31A5E2665E5DD574C9264F4F555256A428208DF2FC45C2D46EF833FE7278423F31E36DA482653507A13439B7D39741AB8BE3F6565BCB84635556345EC01CD903B3A2CA374422214625457B65536B8849677605E86832500E4C521B8B97527E3CB00625262EEECC791DCD7260312B94E4C06A7F64DFF0038C1FF00ACD3FF0038F1FF009ACFCA5FF746B4CCA8F2683CDEE7850EC55D8ABB155AE683E9C554F97B62AEE5ED8ABB97B62AEE5ED8ABB97B62AEE5ED8ABB97B62ABB15762AEC55D8ABB15762AB97BE2ABB157FFFD4FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88BB53C866006F5971082E0D3BE5914A16E00488FCB2C42550D19E83AD76C2A98DBC844BC3DFA6054E2E29F56603BD3014A4515564CA8F3423C5C0420F7A65726DC7CD745704B8232B25C9AB6490DEA22A6E2B5CAC96C8C593433ACB1AEF9025B04535B4B70E188A1DB20649E14FAC6C55985464789970B281A7848C328C3C4D9108EB6D3DA78DAA2BB63C4CC063B71A3137205325129AA4EACB4A68DD6829824C4866305B32B2023B663C8B38B35D1A03EAA6D9492E6630F56B106109951E6E6C59D69DF100D81B073673A6FC4AA69D7BE2DB14E917E3C59A7D6B6C48461D0EF96C792A751A711BE155C57DF157703E38AB5F4E2A849BA62A82798462BBD71541B6A616B5AE2AC7F51F31D9C1192CC63A77C910D8C02F7F30F4BB763CB520A57AA93FD99590C0B179FF003C3CB167270BABC593DABFD99590D04A47A97FCE48793ED2A91852C47C27DFEEC111BB59953CAB56FF009CAA82DEE78DAC21A3AD1401FD99710C2390DA5F27FCE4A6BFA821FA8D89E0C09E407F665120DF1C858D45FF00391BAEDAFAED776C556BDC7F6663C839519BE91FC9EF3EBFE61426231805D4B961ED954837C256FA2AC7437AA9E3F4655C0DCC9EDB4C78CD48C3C0A9DC160481515C1C2AACFA79A834EF8914DD8D0379A79E1F7E06526177962A03963C585787BE2D1248D61963B1D453ABCB1B08FE74DB16893F32BF313F293CFDA8F9AB50BE8209A5B79A4668F8F402A7DF32314801C9A64C462FCACF385B6D73A4CF2D3BF13FD725B215D7F2EBCDF34CB1D9E893C751BB713D7EFC7657A0F977F243F30A7991E4967B343BD09A7F1C695F5FFE597E526B1A5DBC6DA96A0F34CAF5662D5D89E9D7251E6D1946CF1DFF009CCDF253680DA3EB11356474EBDFA1CDAE9CBA0D587E7F593C9373965D9DBAD73640ECE8B28DD16A7E07F1ED954DAE218BDCDC0124895E8694CBB1F26F88D9239EAE4E5A031921F8D065803595226876EB9301ADFD94FF00CE2FFF00EB347FCE3BFF00E6B2F297FDD1AD32F1C9A0F37BA6143B15762AEC5563F4FA71552C55D8ABB15762AEC55D8ABB1554C55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD5FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88D8294F845330037B52D4B29AF7CB2294AAF6BB8CB152D8D5830A547CB0B13C930854870DBD7C72122C2253953585ABBE54496C4A1BFBC6F9E441552641238567283AD7F86322299E306D98F967CADABF98AEE2B5B3B62C8C69EA01DB31CC9D8E385BEDAF227FCE2EC17515B5D6B32155900A293FB5BFBE5129B9F8F102F43D57FE716EDA2B988E9CF5403EC76FF89663CA65BBC10F25F35FE476B9E5FB932C687D193E1555ED4FA72066C7C10F3E5D0750B0B8F4E5571C4D0D7009A462A6616D632491014AF11BE59C4CFC20BCD9DC4428B551ED931309F0D012DB49CD59C50F8E094BB94C02636B1134F1C8711699C53368A452A791E9B60B6BA65DA0C94750C706CE442DEA763229E15DF289F3765879334D35C55476F0C8B7B3EB023E103618AA7D18AB0DB02DB27B16F8554F6197479330980DDC006A3C30A551862AAB18046E31545718986C82B4C585A57716ACD5E228322B691CDA75D716F8493BD32B2516F3FD674BD4DCBA4523A73040A1E99124A5E3BAE7E4DF9C35F467835BBB8977AAABD3F8E4F88A402F1CD4BFE71BFCE6F3D06AD732B576ABF5F9EF82D9D16357DFF38C5E757A97919DFF0098FF00B78B218D8A5C7FCE3179D43F22BCCAF4AFFB78F2639310E1427FD0B379CC48ACF6EBB1EE3FB720723891C459FF00973F203CD715C436F39F4A0604391B536F9E4253722185E97A27FCE37581BC59757B812AF2ABC2C6A0EFE15CA8CDCA8627D4BE51F22F97BCA10C49A3D9C5048ABC4B462808EFDF2A9CB67271E3A2F52B68AA828287C72102DE629D5BD9B4AA07877CB835909BC569E9815CAE4C0AAB428C0D08F837CA81B402424B733060D18415E95C2DC0B0ED474F6A973B835A0F0C5B0C424F1C216A196B4C5A6710105736314EDCC205E1B103BE0B21C59C2F9249756B69103CE352464F88B5F865298A6B78A5A450278D699602BE19661653F35154070DAF8659369F7D0DA144745FF4821547BE46CDACA1B6EC37FE7263C99179DFF2D64586D926BCB088C826A55C0E2C7AD7365A693A4D5C03F119A136BA9CF6922F131C8D191EEA48FE19B8C727439318B5194888DD21D890787B6DDB26402B080616EB44AB6EE6BC98F5C9844A21047ED1CB034C821DBBFD3930D12438DC9AE58D25FD957FCE2FFF00EB347FCE3BFF00E6B2F297FDD1AD32F1C9A4F37B9E143B15762AEC5563F4FA71552C55D8ABB15762AEC55D8ABB1554C55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD6FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF889B535CC00DEAF28EF9645528BA1C8E58AA10C60B8AE2A5181789C045B590982FF7669E191314829431FDE36532D9BE22D52D2C9F52BE82D233467351F466365C941CCC18ACBF49BF21FC950E9D6105EDCDB2BD003C88F9E611CAEDB1617D71FE2ED0B4B8E21385E286813C0E512C8EC71E057B7FCCAD0EF6EE386270A76037CA2591BCE165F7369A4EAD6CF2CC527122FC209AD32BF111E03C475DFCB0B2D424966B78946E69B63E22F80F329BF2DEE609654856A17ED532D195071525571E49BB86BCD0ED93191071A437BE567442CEB4206DB6113B6AC90628BA7345395F7E98789C5945329ADB8462BD69D71B6BE156D224E33818F137462F48B49887515EC32B917618850679A4C84B2FBE06D7A3E9CDBAD76C5594DB8E4C3154E6D5C89197C32D1C9984DE13571852886FE38AAAC7D3154C228BBF638A6959A21DC74C82D21999882380CAD692C9ECFD53BA0A9DABE1919288EEE8ADE6B65F4924EA29838DC8F0D092DACA8793C8013D1BC31E36631A5773F003CAF01FA4E3C4D831B1E96F2047DEE86DEE72139ECCBC2B496EF568492A9722A7E798A7228D3282B5C489EAC373561D1413959C8DD1D3A274EB7964B80D2C859ABB2E40E46E1829E8D6914CC1226B6E117FBF48C8F1DB2963A65B6D6E11176AED96C0B5109D4238A82075CBAD810ACFCB8E5732D6425CED22568763D72B896043A38A39012454F8E49B6297DC5AF21257A0FB38B7249FA3958B6DF4E2D3916C1A423ACBCBB1DB22538B1F131ED53CBE8FCA87AE20B6F82C364D0258A60231C93A93938C97C047C505C5BAF43B6596BE026B6B0C976D645BED452127E583AB899B1D3D3AD2DC6ABA76B1A6CC39ACF6C63507DD48FE399D84D3A3D5C2DF87DF9F7E50FF0003F9EB50B20BC6970CF4A7F3B31CDB6296CE872E3A2F1CD4855D641FB4BBE650DDC7E4C4AE362C3C32C6322969FB67241A64876EFF004E581C7921C753963497F655FF0038BFFF00ACD1FF0038EFFF009ACBCA5FF746B4CBC72692F73C28762AEC55D8AAC7E9F4E2AA58ABB15762AEC55D8ABB15762AA98ABB15762AEC55D8ABB155CBDF155D8ABFFFD7FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF889B360BD730037A3E4A1E9DB2C8A529BB42C76CB10A50AF165A8A625211B55C622D8494E52786C77A8C998ECD60EE83BCF8AE9388A506F4CC2CFB39F845BD1FF2CB493A96BD68047CB8CAA6B4ED5CD5E59DBB7D3E3DDFA93A3D8B69DA6DABA0F4D1211555D8663176D8A2F2BD72D751D7353962B3321084B1504D32893B1C71D952DBCBBABE9EA26657046F5EF98F26FE009EE8DE78D5B41BD1CCC9344D45911892001DE99595107B868DE79D1B5B31AC92FA5310014069BE36930658D6A8E1DD40E128F81BC72C69945299F4A421AAA0D7C46581A0B0DD574359012117A1ED9312A6A9C5E51A9E83C2524201BF618789C69C58F5D69DC410476C789AB85274B5E126DF0D0F518F137C22CBB4752028356DFA9C376E5C0507A4E974053B7F98C2C9E83A6CA15803DA98AB288E7008A62A9AC2E480C3BF5CB63C998E49A42E69D4E14A395BA62AACADEFB62A9BDA5D536206D8B35F7373CA945A5720B4840ACDD09CACAD221232BD6BF3C84CA62375D2AF53D0E637139A12B9622FF0D49E5B6F8789B404A2EB492CA69DB071338B1A9BCBCCEE47106BED919CB66D88DD47FC2E3FDF43EECC4B6F115787CB8D1C8A40200ED902590A661A6E841543155A8F6CA8A788271E97A478D6A3C3082899B08E801D854E5F02E3109AA82A0153990C4869A471EF954CB590A2D2B32B0200C840DB54C25A4B89050903C32D6714C963F5A3DCD0A8DB16E4B64B295492010B5C5A72289825D8455A7ED655334DDA734BBEA32CA28687E782DC9E2583494460B201C9B71F2CB014F10448D060906EA3EEC9028E25F1796914F258FE9196C5C4CC2D36B6B45B53B2B03DC8EF97E39EEE9F518DF9A7FF0039C1E5223518FCCD15B8F4EE295217F9797539B2C32743A8C6FCE1BE9B8832EE55968066CF13AB9ECC50124B549CB4B594249D4E48354940F4CB038F2511D4E58D25FD957FCE2FFF00EB347FCE3BFF00E6B2F297FDD1AD32F1C9A4BDCF0A1D8ABB15762AB1FA7D38AA962AEC55D8ABB15762AEC55D8AAA62AEC55D8ABB15762AEC5572F7C55762AFFFD0FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF88089A86B9801BD338CD40F1CB22969E30C32C420D8713B6291CD6D4E4A00B1C8B58D46E69979AA681CD40FC7331F019ABD4BB4D353E9EFF009C74D21751D692A952B535A78669C9DDDDE101FA397F6CB6DA3D360563A01DF2120ECB0B7F96FE5B8F503777862ABD08AB0EDBF88CA661D96309BF99F4A3043246918E9D8663C8373C0752D0F50796436F096321A37C35DBEECAE99458DCB65AAF96E48EF4A4B50C0D02B78FCB101127D05E48F375D6BB6612E418CDA850BCB626B4F1CB0071E6CFEE66658C7BE594E34C149A525D1AA3AE46450030AD4EC83B31A6F91DDAA51613A958D0F4A6DD71DDA845864B6A56423EFC6CB7C629EE92854283D6B9747937067DA79A32E4959BE9FBB8FA31564A83718153C85A8A9F2DB2D076660A6B136DBE1B4A354EC3F1C2AAEA4D3154742E148AF862DC119556C8324C6DE256A74DB2B28559630B95CF92421D979661B900A87A7BF4C0CE25B30F2ED8B60696C4160481B74C05B224DAAFD487F2D7E8CACC5B812EFA90F0032042D9575FDD0E23E9CAC861C454DE124FA9D7DB214CA3225673F4CF4CB62C885C353111AB6E3A65CD65506A91C9DB2120C0B6F771D36DABD7238F9B44D0E675AD69972628BB797D571C7609D716F64B58A587871DE98B4CC162B7F21D31F8769872194E45C7612F87519A46A274F6C886EE229B44E646066D9874F96482F116416C22E23A64D788A756F2AAC4151030AF5CC989D98917BAA344D37488610E0E78BE6AFF009C9CFCBF4F347E5EEA73BC5FBCD3E2661B54FD963E199D824E83541F83FAA5A1856F216D9ADA5650A7AECC7B66EB09D9D0E6D8B0FEA58E5E5AC1D9072F7DF2516B9287ECF5ED96071E4A2A773963490FECABFE717FFF0059A3FE71DFFF00359794BFEE8D69978E4D279BDCF0A1D8ABB15762AB1FA7D38AA962AEC55D8ABB15762AEC55D8AAA62AEC55D8ABB15762AEC5572F7C55762AFF00FFD1FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF87EB35F7CC572138A74DB2415A634196054B67900E44E487355B1CE38D2B96EC8282B9AB74F1CA665880A912F22CBDE99ABCE5CCC5B3EEAFF9C4EB113DD988815E25AB4DF6CD69767A626DF647999435D5A5BAB1D880403FC32B93BDD3F37B97962CD6D34832280ACD0EF414CA245DC621B30AD5A77B849A302A6A77CA2459494B4AD209812478C115DC951FD32316A1CD3AD5F49D15B4D91DCC3EAAA134655EB4F964993E64BFF300D235631DB30085C8F82806C7DB1453D5F45D7E4D52D54D6A683F56147084DE0BB3C9C4B4DB619645A728A49EE7799DFB1E992A68A627A944199EBD4EF8D2D30A9AD944BF3C6928AB440B28A61566BA79A30C559A58BFC43E8AE2A9F46FF10C55388EE00551E191BDD04A3A3BAA8EB8414A363B91B6FF003CB1B02312E47CE993661328DEB43E3DB16E099C4E38FF000C82A2606A656528D2A5C0A75C84D5BF4CE6310DA1A2877C890DB169537E99590E405754DC572239B656C98C511A74AE4E419C10D7111A1F7CA64E4001085780DFE9CC793090097CD7263A953F17860873681CD26B8D4E58EB5A6F97AC92A7BD9A405877E9938B4C9AB7BC9D09CB29A095433DDC8E4AD7010D68F82EEE0515D6BEF819C5368272159E9C69DF16F82223F307A4425457A62DD1016DF39D5F871FB4A28299092C804A6386EB4B928C84A9EE722C53D86EA3640CFF0068E2A98DBCF0D462A9EC13D221C3ECD76CCBC5C94A6B67744115CB1C2CE16F9AB4B1E63F2E6A1A4900FD7A090014FF00248CC9C45D06AE0FE76FF3A3CA4FE54FCC6D7347652AA9348C05283AB1F6CD96293CFE68EEF03BA6FDE483A10732E25A2B648E7152773BE5C1C69F35315000AE6445A96E5A036C407F661FF38BBFFACCFF00F38EDFF9AC7CA3FF00746B4CB43833FA8FBDEEB8B1762AEC55D8AAC7E9F4E2AA58ABB15762AEC55D8ABB15762AA98ABB15762AEC55D8ABB155CBDF155D8ABFFFD2FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF884B31D2B98AE426E47C3920A8694EDB6F9605482ED982BD01AF864952E86670D435F961B414D50730396D909A0370370B8907B7539AECCE5637DD7FF388F76A359642E05617A0AF7CD74C53B4D3737DAD359B5DEB30730410C280E63C9DEE9F9BD5EE3513A558B2745F4F8E5327718B9304B6D4629D679188EA69BE63C99496DDF9DEDB46B231B952D355547707C72316A1CDE15E63F38EA77F2C896933047A8A2939364C22DF48D42E6669E7E72173553D7157A56853DCE9A1622080682A715672D70DE9A3AB862FB900D72D838F991729E56E186EC7A81D726D2905FC25CA9FF277C558B5CDA9049A6D8AA95AA71931565567B32EF8AB2BB37A11BEDDCE2A9E46FF0010A9C55358CD40DF21D58946C792641191E58D811B1D6993661368998003C316F4D6273415E990423918D4532B294EED8065DF6F0C849513C465242789A2828720437464B553C7AE4087263255A002B4E9910376CB454520E3D69ED864DD0536219C0EA3C7289736F082BB1C50D3AF8E63C98C986DE4AC3950EE0E087368EAC3758BA99281493F2CBD125897130B346FDA66A11938B4C9111C92B15A6FEC32C0E396596B6D298D0AA924F51896B45C92C36A959402E3AAF7C8B6458E5FF99A0A18E21E9F0AF3AED8B7C5875C7984090BF30057662716F8A79A379A8C328726A95EBDB2052433C9FCC16DA94694515EE46458F0B514913505413E0315E14EED0C408E5F0FCF6C53C29D2CD1A2715229D46F97E33B302AD6F78A1BA81F4E4F89AA70B09B5AEA9CAE91030658C153FECB327149D36AF13F22FF00E7387C9B168FE686F3446800BE6259C0DAA6BDF3618E4F37A8C745F9A7786B7136D4F8B3638DD7C85256E09ED9787167CD408A66445A9665A1BA2FECC3FE7177FF00599FFE71DBFF00358F947FEE8D6996B813FA8FBDEEB8B1762AEC55D8AAC7E9F4E2AA58ABB15762AEC55D8ABB15762AA98ABB15762AEC55D8ABB155CBDF155D8ABFFFD3FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF884B33D37AE62B909B337C24788C2150E57E1396854A665FDE0C4AA4F29A4D5F7C802828E0F545DFC36C24A02E97EDB53C33132072B13EABFF009C5AD5E3B7F345BC6ED40411BF8D735F986CED34BCDFA88F12B6A36578375E20D730A4EF74FCD11E719DCE8F2CD16E6BC49CA64EE317278326AB710C14E5BF2E998F26526317AF79AA5F3210480A29918F36A1CD97683E45BBB86599E33C4D0D48C9B27A641E5FB0D360637340C47C18AB1BBFB6B494B7A43A74C550FA4A869DA222841A0CB60E3E6667058D09A8EBBE4DA503358061257F9B154A27D257D36FE98AA4034E546229DFAE2A9D5B5B22815C5536854290A3A0A62A9E47D302A2524A151E191EAC4A670CC7EFC90649847374CB1B022D26AE4D984E6396A06FB5316F098C6D5A64109A44C2A32B294D216A50D76AE4648298FAAA76C890805BE55CAC86D896F9656439112E26A322DD12A65C0EFF003C8C9C9C6D7D657A65126F086BA9818CF8E63C98C983EA32F10EC3C7A6087368EAC1AF2F19A4A7865E8936B7C562A1DF261A648ED37518849CA4DA996071E48ED7BF31F4AF2D69F25D4AEA0A834AFB62583E6AD6FF00E7226C2732CF030660C40A1FECC8B38A3BCB7E7A8FCCF6F73717527A224A7A5BD2B8B7C53237D1CC5E2AF348F7AE2DF1627A87E63C76529B0869198F6A0EF902D8032DF2B79D6FEEDC0E478B7BE4534F6FD0F5096499096DCE2B4F4225E5E1F175C5691261936A4DC76E95C9034D13E6EF425FF968FC71E26C10B08CB698D9D02B739240791AE64E29381AAC3B3E3CFF009CDAD163D5FF002CA3BF02B25A30634EBB54E6C71CDE57578F77E2BCF2195DE43FB44FE1B66DB0F27479051428EA3E79921C39A1E41B9F9E6445A90A577CB83745FD98FF00CE2EFF00EB337FCE3B7FE6B1F28FFDD1AD32C7027F51F7BDD7162EC55D8ABB1558FD3E9C554B15762AEC55D8ABB15762AEC555315762AEC55D8ABB15762AB97BE2ABB157FFD4FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF87DB371502A2B98B4DF69C13D01C90554E3B7D19312094A275F8FF005609482B1EB8DA6F964225055E3625900049F0C9A014D110167327C238EC4FCB31F240B938E41EA3F935A8FE8AF31DB4AB2846332802BD413D7303340D3B3D2C85BF5FF4FBEFAC6876376AC1C7A43E319AF90A77DA722D34B906FF00CB573DDC3120663C8BB9C4367CFB35ACCF70B0202CDCF751D466392999A7A8E81E5AB7F53D69286408A48F0C62D319025EA16D3456B0085221D280E499DA4B7BA7C9A99268691EF418DA5E5DE60BA83439191E550D5FB24EF82D52DD0754FAE6A30B28E20FE396C0868CA1EC8564540C632011B31193B684ADC1624914DF738ADA94F1A985A8C09A614816C6CDB92C4D3BE282295046CBD01C55150EC77FC7154F22208EB8AAB2005AB9162533840A75C21923E351B64DB0146C69B64EC3208A89CF2A5698DB784EA17D86F90B54D616AD28722529AC6F414272242AA2CC01153898B0E0368F4DC546FF002C818B6C415F46F7CACC4B9116B953A9A7CF20634D91284B89000486195483978C84A4DC7C62AD4F7CA241C805B966AA1DFB65120C64C33569F843235413D86463CDA3917973DEF2BA615AEFD32FB6264159AF9A12ECC85815D864E2D5229249E6048924DC230AD01EB9686821F337E6C6A3ADEBF6F1D8D8A4A07A8DCD97B838086145E59E5AFCABD62E21ADDBBAF26E546FA0F8E459C43E91F2CF96E2D234B68AE18C92C207A2ABB9F7C69BA3B2AEA725EDB594AF65138918100537C5B8178FE9DE5BD66FF547BABE57ABBD547B64241B4483E92F2CE8A6CE18A886A06E70527883D934189F9AB73E86871A5E20F4069278F8904D3C7052F105C6ED89AB392DED80DB44B9B5F5BFF29B23BB91090554BE113C4C5AAA55AB5EDF3CC9C4D3A88D8D9E47F9E9A41F30FE5579801AC92C51B32C23AD02935A66C71BCAEB31905F8377711867B8848A18A46047FB239BAC3F4BCCE7152418076DBBE65C5C19858EBB9DB2F8B4A1580CB04806E8BFB2CFF9C5EFFD667FF9C76FFCD63E51FF00BA35A65A393813FA8FBDEE9858BB15762AEC5563F4FA71552C55D8ABB15762AEC55D8ABB1554C55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD5FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF874B265328CA593246507853C72259C513C07139596D0935D28562721D5279311BC929375CBA1C9A24BE0B90268E872F8F26013B9650F1EE72126FC68DD12FDAC351B5B98DB8B472015F6CC2CE36761A73BBF5CBF267CCA9AFF966D6D24903148C0A66AB287A1D2C9EF3A5AA3C9FA30AF10FBD735D91E8714B6615AEF96C695E6084C43E0998548F7CA29A739B7B3E89E598CC6B3247EA19D0034DE996403878B9B2EFF095959C5F5ABB70AA054A9C910E482F39F3AF9B340D26C192C028B85560E57B900D32B21982F8EB53D425F345F4CD2A91463C09F9E565B014C740B2D46CEEC39AF18D870F964E0C66FA4B4DB8379651ACB27C400D8E5B17166956A21E262886AA456B9634F54B2332383B6581C8835E9301B8DF0144D690475C0C694FF6CE2B48F85C01F2C569188D520D698AD2650B50628A4D633D314D23636DBE58A8B6D1C73A62E60E49A44FD37EF8A53BB6906D8AA64241B6298F36CB0241CB9C9149B5ACC1471AD2BB656BB2600823AE40ADA1A7038B37865534DA493C828731CB740A4B3C94AD3AE51272E054DAE1BD322BDB2892C8B17BEFDE73E7D32B71E658826968D7264A7535C21A2D327D2BD40401D475CC88AA42FE528A69099146F99015747E43B157E7243EA03D0787E38C92194DAF9574C8900FAA8DBDB20C9CFE5AD3CCA812D40F1DB154F57C91A75C45536C3953C3FB714A4375F9736C2559628F804EBFE75C8948445AF97520223A74C0A9FDBE962CF7036AD4E2A9DA32BC746C550727A49B03912CFA2025B845DAA3DB20D40EE827B9574702868466463E4E55EC93F9C6E3D6F27F986253F11B4947FC21CD962745AE2377E0879810C7ADEAA87AACEFFF001239B6C3C9E3B55F594A17F8E67637026B24077FD796171D02EBBE5526E0FECABFE717BFF599FF00E71DBFF358F947FEE8D6999D0FA47B9D7E4FA8FBDEE99260EC55D8ABB1558FD3E9C554B15762AEC55D8ABB15762AEC555315762AEC55D8ABB15762AB97BE2ABB157FFFD6FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF861D3DE432034DBC72964CB565278537DF2259C51C6600152C2BE19516D093DDB13CBDF23D5279308D403ACA3623C32E8726892193D65742548F039911E4C03258F9B415E276CAE4DF8D49039755A94A1AD7E5989945873B0BEE7FF9C71F39AD95CC3652DE0EC3893F3CD7658BBAD34E8BF49F4D9C4C12F512944AAC9E39AEC90779872A6B75045AA442EA420CF17D95EFB653C2CF24AD9FF94B596B3B6953D1FAC49C6853BA8F1C9014D111458679F7CD173E94886630F20691FDF890DC0BE62BB6B9D42E984E8E6366F858F7A9C810CC1645A779360216644E04EF9510CC1640DA298978C49CDA9BD30C42C98F1D46F6C2F56DDB946A4F4CB22E3CDE84B492C83BB0666DF2D69EA81876276DB261C88372321620900D3A602C8A0E414DFB604521F73B8FBF15A5652C3A0C5691F1F2A2FEBC56933849A5295C569348C9D85715A46AB506FF004E290162960DD3E9C5BC724C627A002B4F1C529DDB38DA8698AA6AA4F615C5239ABA1EE72E6DB541280CA396F5DB2056D324B903E127E2CAD6D7CF23189FC29D72A9A82C7AE255E81B7F0CC72DF0293DC39505A9D3289B95028069DE9D0D3C7289A494AAE999D08A6F5DF2B699157B5B55600D37C21A93AB6B3ABD38D76DF3222AAB3D8AEC547CF3202A360B3429B10580F881C64C8223EAE9F6792FCB20C913069A240EC08057ECE2AEE735BBF02E062A8EE64C4C18862DD32254242E8166AB0A6F812A978C161AFE38AA412DD98E062AD52062AC4DB54B862C0D46E72126CE88492FE43B16A6443472288B5B8E714A7957A664636F32F4A035894C9A16BEA4D57EAD257FE04E6CB13A0D74DF86DE6D503CCFAE85DC0B96A7DE736D8793C9EA0DC98F053E199D8DC19B9CAD3AEF96171D06E2A76CAA4DC1FD92FF00CE2FFF00EB347FCE3BFF00E6B2F297FDD1AD333A1F48F73AFC9F51F7BDCF24C1D8ABB15762AB1FA7D38AA962AEC55D8ABB15762AEC55D8AAA62AEC55D8ABB15762AEC5572F7C55762AFF00FFD7FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF85DD35C96DF2964CB6023E1F9E44B20BA47FDE1DFBE5526E081BC7A2935E8323D527930FD45CB4887BE5D0E4D1253673CE1073223C9806516854C237CAE4DF8D12618E343336FDB31E4E66366BE45D767D175482E623455606BF7E61E58BB1C137EB17E5579EA1D734AB485E60D23280457E7EF9ADC917738723DF2D678ECAE638E75062946C7B6F94F0B9B1DD1535D496978CF6BF0C53281B63C283B21750D223D6007B800D7C7224282803E4ED387A4428AAE4086C05192E8F15BC5C621B814C810CC1632F697AB3858A22EA7A90322366576C7353F2BDE5CDCA4E632287241A26C820B0921B658DF7232D691CD4A5B431C6C476C9872209210DC8961BE02D94A72313B605E15200814C5695D6BBE2B48D4278A8F6C578531B76E9B62BC29B420938AD261E9B1FA714D2F119FA462D815D63DE98A53680D0818AA6F149414EB8AAE6980D89CB99F12D5605948EC6B5CACAF12A7D6292EE77C815E245CD755888F11954D416352CE7D43ED98E5BA086B89B92F1F1CA66E5C4A5D24C146E731E4A4A57713165F8776AE56D5229B69DCDA95C218B2AB5421AA4F514CC88AA37EAE5F71D33202A8C917A2373C6BB63264103FBB06A64A78E4192610DD451A37192BE3BE2A96DC319E4E4B21A0C551714AF1B202D514C894847CBE93A87D8918158F6AB72681074A74C55894D73C636538AB16B9999559972326D1F4A4C2EE477A1AD322E393BA716F70638580EAC4664636523B286BB2341E5FD79D8F10D6B21DFFD439B1C4F39AF93F11BCC8E24F30EB0E0D435C3107E939B5C3C9E6729B293667637126A2CB5AE5A5C7502BBE5526E0FEC8BFE7183FF0059A7FE71E3FF00359794BFEE8D6999D0FA47B9D7E4FA8FBDEE79260EC55D8ABB1558FD3E9C554B15762AEC55D8ABB15762AEC555315762AEC55D8ABB15762AB97BE2ABB157FFD0FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF85EB109D5771E394B24EE19497451D3950E44B208D724C840F1CAA4DC1037B50A4378647AA4F263B7B18AC6C72E872689206EC51A2653D32F8F26B08F82E48A440FEF295E39093918D3FB23F595759AA225EA7FCAED94172E299412FD5A2223FB75F8328C9172B1CA9F48FE507E663685756D0DE5D985C90B1A13B577F7CD7648D3B4C3983F4F342F325A6BDA35B5C3DC235D7006300824FE398C767698B202C860D46692358E54A18B704E0B05BA62D35B6BD77DBA0C890C63128A79D8107964086D102AC932B00246DBB9C898ADD2296EE2B643E8C425E5BB31ED95914CE3BA167D4A2991B946108F6C431940B13BCBC049111AD32624D3E19B4ABEB13382AC2993130DD114974E3892186F8DDB6092041DCD46D8AF12E6EA4D36F1C57897091456A715E2565993615C578C2656CEA69EF8AF104EEDA4407738A6C27B132151BE295540189A62CD1023351B7D38AA24232D0914C55148DD29D31559373AEC32DB544DB9A0F8BE9C812869C7C7C874F1CAC94B6F229000395CCDA84AA68DB996A6DDCE63B7C36414CE95A577CA66E540A45792D09DEA331E6C88B41C2FCE4006E7C32B6B9448DD9259C81283A64C45AF8939FAD3715E0475DF2E0BC4135B7BD2A9566CBC49788295C6A1137DA3CA9D4612CE26D8F5F6A9044A5AAAB4DF761FD723C2CE982EA5E7AB3B105566524D796E36FC71E15A63C9F9AB6B1D47A8A5BE63FAE34B4A4DF9AE92238128592BFBB507AFE39190544695F99324B308EE25A027615FEDC8D26DE956DA8C1A8C0662D56E831A5B63BA93FC7C23A927B531A543456723C3FBD4A313F86464D8262A90ADA70462426F91693024ECB5ADCAA0929448D8733E19763906194F0879FFE736BA343F26EA571EA7A69776AE96EDFCCC54803EFCD86298797D76404BF1AE617524D2CB74BC6791D9A415AFED1CDBE290AD9D1CE24EEA7C18F419990C81C498A5AE8C06E2872EE305C7A52E058ECB5CACEEDC1FD8DFF00CE308A7FCE35FF00CE3C8F0FCB3F290FFB935AE67C3E91EE75D93EA3EF7B964983B15762AEC5563F4FA71552C55D8ABB15762AEC55D8ABB1554C55D8ABB15762AEC55D8AAE5EF8AAEC55FFD1FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF85BD3BEC652C938B6FEF53FD6C89641399500ABE5526E090DF3B32B11D40C8F549E4C7AFDE4E31FE397439344905217668C78E644793584C2C406BA27F9475CAE4E4637A6796B49FAFD95DBA0E455AB94D5B951E4C7EF266B5BC6B775A50D304A2CC4D7C26EBD7496194C7E97C48D5EF985931B918B23EA0FCA5FCDFD5B48BEB6B6D4EF19AD9481F131A537F139833C4EDB06601FA51E59F3FF9775DB2B764950C8CA3910457F5E53C1C2EC6192DE8D0C7672422789AA08AED91B72E050F34C84A88C74FB59025BC6ED2C8DF3F0C899354A289496A8CBD2BDB21236CF0C50922D011E390A6E314BA4B22416A634D44255246633BF638D3021033905B7F0E996C5ACA0682B5C92AC734247E18AA8337BFCF1572B74FD78B594CEDA6A0A62D914EADE652462CC325B6605462D89B4282A3BD71668EE031558ED8AB68DD3C3155772A77C9AD2989950100E56534A46707A9C84969A1254D474CA8A40DD648F5539516D8A4B350354E5126F821258048390DC0CA26DF14B638945C71E5C4D3AE463CD728B8A6358E05E4641B75DF2C70F850ADAC5B16E0660BC4D6B5C9C53C0D4FE71D2ACA2224B95A8F7FEDCB578581EB3F9B1A3DAC4FC640C4D42D3C7EFC945B2029F38F9ABF379DE597D19DD63A9E95FEB926C7906A1F99CD71EA52E9AABD4127FAE2AC557F301DE46ADD356BE3FDB8AA656BE75BD915E4B79CB2A1A36FDFEFC8C9059D7947CED24B7F18BB6661C803D7FAE455F61F973CE960B68891EE0EED5F1C559347E6182E6752B106A9C55939B95940658F8823A64486A3CD0CEF5AFC19590E4C64A2FE9B2FA4C2866EDF2C9C22E0EAA5B3E40FF9CA7F308B7D046911BFC71A9F86BF3CCEC71793D61DDF9A864E681D8FC4D527375861E975929521B91AEDE399020E26492E33A13C5B7236CB40A68B4D2CE28A4EAB9600DA0BFB03FF009C6A017FE71CBF2000E83F2DFCAA07FDC22D73363C83AFC9F51F7BDB324C1D8ABB15762AB1FA7D38AA962AEC55D8ABB15762AEC55D8AAA62AEC55D8ABB15762AEC5572F7C55762AFFFD2FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF85CD3C715A1EB94B24E228DC303B75A8C896514F44323C058D3EFCA8B70499EDCB24B5A647AA4F2492F638CAAFF91F6B2E87268925A5E07F8D2B48F63F4E6447935854B3E4B73327ED15247DD95C9C8C6FA0BF26AC66D5D2F6D22512486A287A6541C8E8C6FCFDA1A586A5710950B75093EA0ED936B32A79F192E1220A4D2A39291954A1698CD562D4A485158BB2C8A762329389CFC59DEF9E40FCD2BDD0960334F2B46E42F52694FA7313538A83B3D36A1F767917F3C6C350B782092EC06A00431A78660183B5C595F44693E60D3F558D7D39939103BF8E53214E7C260B295B66E21832303D286B94CB666775DE8488EA781A1F6C31DD944D35246EC6A23603B922992A64648A11A98B8820B569418D06B24062FABC2D683D4996887A531A6B25884B751B92C84D0F8E16050F57FB5514C285BEA57BEF8AA9B9F7F962AEE42837C5ACA2612716C8A3A17756152298B30CB2CE71C455B16C64115C28A55A9418B3470B943D0E2AE3206E877C55B57A0F7C5548CFC07C677C9B6D20649CB37C26801CACAAAC659B71D32125562DC76AEE72A2AB7983515DF2A2CA2955F3D15941F88D29944B937C1A8A4021F8CEF4CA26DF1631A9DD7A3C9D1A86B4C8C39B29724A9EEE49E3203354E58D54C4758B3D4562F5226DCB5363BE4E2B4C2A5D0754BE722494F1EF56396AD05A7C8B6654FD61CBB1EC7A64A2B4935E7E5C79767564907C4C3C324AC0F51FC93D2262CF6E7883526BB62A935B7E45D8FA9B9A927AE2ACCB4AFC83B510CCFEA705E42A323241677A0FE53E83A5C81A62A597C722AF51B0F2BE90CEA96BB1514A2F4C55153583E99708A895DF638AB2386FDFD3459051FC3034CB9A2D6E19876C8F0AF1D34D342CF1CA4F1FAA2B35D7CBAED9918A3BB81AAC9B3F327FE7257CD967AF79AEF2D74D9DA48E0E4AEAFB6E2BD33638F1BCDEA4D97C82C5D763D3B66E30C7D2EA66511000C4572DE4E24CA356D6126BFB44EF86D880C92C2CE20061E26F8C5FD757FCE3780BFF0038EFF90AA3A2FE5D79580FA349B5CCE87D21D764FA8FBDED19260EC55D8ABB1558FD3E9C554B15762AEC55D8ABB15762AEC555315762AEC55D8ABB15762AB97BE2ABB157FFD3FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF85BB6F848AE52C9904352B5F0C896514D3D7E36C77CA8B704AE3943AC9BEF91EA93C921BBFB2FF004E5D0E4D124854D2198FF94BFAF2F8F2601358471B966F18FF0086424DF8DF5BFF00CE24D8A6A7E63B9B6715564634F7198F234E544585BF9F9E5A934FD775396342055B7FBB1136B9C1F3100C614E4370B96036D06C20E54F8078D72756DB09334D247FA1C629B9EF9467C761CCC597853D827BFD3254B8B6BE642A6A141CC09E27698350F58F2A7E73EBFA4DC470CF3B988951CABE14CC49E276F872BECDF23FE7858DD476EB3DD8694815527E5ED9893839A26FA16D3F306DEFE28A55911380A28AF5FC32318A99D2723CCC6F10233A229FDAC970A0E54AEEB5C834C9030BD578C8E4C6BDF1E16A395E4DE74FCD485A64B586753DB63FD98F0B039103A66BAD7D124BCEBCBC30726C89B4F45EB1A2F2DCE2CD1092357AE2A88F888EB8AA834850D3C31605562B923BE2CE2895B86AD6BD716613AB4BB7000AF5C5B03238AF8FC3BEF4C59A651DD934DFAE2A9925C57BE2A89593E1FA314C79A065763BD726DF4A22BD7E9CACAF0AAACC13BE424BC2E6B8AFC43B6545045209AFB8BF5CA8AC50571741DAA4F5CA64DF04BE7D43802AA731E6DF148E59BD77A3FD9AD4E461CD390D04F6CCD998C291BD32C71B8D4EE6D2240640BCD5B6E3FC72617898FB58A732E4045EF962F1A51A8CB688AA88FF001D77C9C59C656C3A7748E4E6D27C35AE49938EB9A728547DC8C55522D734F520C7154FCB154C63F30B49F0C44411FED29DAB91920A5375AAF2B9553217A9ED9157A77945B99568C1E05A8D5F1C559B798AC80B713AA0E406F8ABCDE3D44F221CD181A53080E3CCA6D1EA238F5C20346495060DF999E7087CAFE5C17AB2859EED1C15AEFD08CCCC31757A89D87E54F99EE6EB5CF30EA3A93312B2B311F4939B5C50D9D266365881B52546D999195075F38DABDB5A9EC3194DA2504F60B08D8AF8F7CACE4651C4CBAC3490C071E9E190395CA8627F58BFF38EE9E9FF00CE3F7E45C7FEFBFCBDF2C2FDDA55B0CDCE23708FB83A3CC2B24BDE5EC59635BB15762AEC5563F4FA71552C55D8ABB15762AEC55D8ABB1554C55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD4FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF85884F361C76CAF8536C96DC111904D6A301816424D4A58C5C075A65462CC6441C41E1560CA5C9E80654765394525D76A423B31095ECD96E336D12CA18F05E69242AC0B484107B6C733230348134E0FC0EA6849910814F964278C86F84DF60FF00CE1AFA8BE6C997890CB5427B6F98594539D8657B3DBBFE720B44F56E352AA8320526BF40CC7E2A679214FCFAD422F413895A713C4E591CAE14F6485D8351286B5CCA84C14464F40D0A20D0C709A127BE3964006F88E264377A544A16AC797E19892C81CEC008418B78D5951D6BE04662642EDF164A099E9E2EED2E565B29CA1435A1398920E58D500F50B0FCCBD6A0F4E192770F0ECBC4ED4F7DB2996CCBF3024CDED7F37358E01259E4E245363FD991B41CAA7A97E61EA7771FA705CCD461B963FD98DB0F1187DA6A375A8DFA09E4919F97DAED8DB1337D27E58965B5B3854B971D70F0DB958A7419A457ACD2AB576F0C781B78D90C37CB51F153E79122990926B15CABAECE3E9C090B6491493DCF8E282143D555F1F962C86C8859EB4A57DB1640A696D24840DF167C4C82094556B5C53E204EA09169DF14F1A3A19949FB58A414DE27523ED8F962C816DD4788A0C9B68CA165630A41EB4D8E40848CA12C9E4E3FB5F3C810CB8D086E9551AB5395485053249E694B3F2076F0CA0C911507B8526B5E998F2986E8EC954D3879295CA8FA999CA229B69D6F1CF22ABF422A708853564D4090A6616FA65804AFC5CA985C7F1107776E2353E99A8EC3240AF88C3AFC4EA181A508E8327C6BE2306BCB3672F20635EA41CB319B6DC79186DFC7292CA49A65DC2DBE284858411732558B1E95C7857C5097FE9178643C5453DF1E14F8A11BF5DFAF71E6CD13A0A2F1E87E795CC5309660CAF42B41EAA34BFBDDF6AE52649196DEDBA3AC91C6A21554A374C1E2065C69DEB17D722C9A3908269D7263763E2878E3CB28B89030DEB52C3A53261C7C99022CDF47042D34AFC238FED13964604B87972BE3AFCEAF345C799357B8D2F4F98FD4ECA80723B1AD6B4CD861C6EAB3650F99E6B7BA8AF3882BE99D9877CD9E3141D5E49A0EE2DC076006C3265C594952DA2A76CAE450236CA34DB28E591405353D7316526F8637AF68BA242630596BB6527239718BFA78FC884117E47FE4D443611F91BCBAA07B0D32DC674FA7FEEE3EE1F73CBEA3FBD97BCFDEF56CB9A5D8ABB15762AB1FA7D38AA962AEC55D8ABB15762AEC55D8AAA62AEC55D8ABB15762AEC5572F7C55762AFF00FFD5FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF858B4FB432AE36EF0D94C1F6457A77C789061488210F4C89DD81539220637E0C15E9F0B7865660C244524D756F13A52693D47F019761C6E31905B67E5ABED43F756D68EAAFB89E9B0A66C61065198B425DE8B7BA7DD4114CFD036D95640E66220BEC4FF9C378DD7CE37019830E62A335D99D8E10017D63F9B7A7A6A3AB6A7005E47D36DBE8198526DCA6DF997E77B23A6EAD25AB0E2A0D7200D38138B07922A10C33271C9AC459B79526E573E9B7602992CC6C3958B67A75E5A7308CA3A8CC493B0C692359B89375DF28C8E6C792BD9C6E26238E63C925131C00CEC5C5083B644C6D946549998D5694C1C0CB8D1B1395E31815AEF8F02F1BD5FCABE5F49D16764F8BAE3C0BC4F5AD3A16810474D94ED86A9CAC4764E919B983F7E25B814DE201A8CCD4272A93644A690F1029C8E41B0146FAD40003B0C5928B4FEF8A559273F0D4F862A9A5B5DD286B8109DC57CA08DF0B105358F50403ED7CF16C051297B08228F8B3051E9A8A01B3F4E98B3B6CEAC4FED64896622B7F4913DF205988A067BD249F8B204B608A0FEB47725B6CAA6526282B8BC201A1CC599445269AF5FB5731E4DBD17DAFA93480F63928868996716303222B74DB2E1071AF74EA3770295230F84B6A53B32AF23BD71F097898EDED5C1F871F096D8D4F0121885EBD72CC71A6C81B63B77A6990310BB9AE5CDAC12FF4AB80CDC50D0F4C558EC9A3DE3BEC877F6C551B65A2DE8956B1B52BB653910636F54D134C962319910E6290D9183D46C42C7C05295DE980067253D7A655B76DFB665422E34CBC8AE2ED959C0FB3FCD968838939879279F7CD7E8594D630B9591C1008F7AE5F8E0E1E49BE6986D2E66B998CE4C8EC49673EF99D8F675D96492EA9A6709AA13BE65C4B8336373E9D234AD45EF84968E04759E8D2B015427299C9B61167BA2E84EAF1931F5CC6939110F67D1F4BE318F87B65326F8BFA35FC955E1F937F94A9FCBE4CD047DDA7419D5E9BFBA87B87DCF29A9FEF67EF3F7BD372E69762AEC55D8AAC7E9F4E2AA58ABB15762AEC55D8ABB15762AA98ABB15762AEC55D8ABB155CBDF155D8ABFFD6FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF855B670AC2A330CB984B2785D5A23C4EE46C300938D3C8037146EC0D640A57B1EA73271C6DC59E7013FD17CBB7FAEB98A106353D588EB9991D3B85A8D50112F59D1BF2CACE1557BF01993724E5F8F03A39768B3EB2B0D26C08B45317A454D401F16C3C732BC3D971F68BE7EFCC1D3E117D1DCDBB5631C8041D7BE60E78D3B9D2EB789F437FCE1B5928F37DC48C4A6FCAADEDDB35595DFE973F117D6DE76B8853CCBA848F19742AC38FDD98530EC4EEFCF4FCE7D0AE26D50DF5BC263889E5D3AF4DB292D5283C3230655657431B275AF7CB612A6A31A651E578C9BE1C5A94A65933619E30F7148792460EFB653273F1AF4B1ABB029C89E87C3289B9B16EDB4CFF004A3F0F5F6CC7924A3C6845A6E741D7A530C5814DA3F2DB4D4A2D3DE99246E9B59F955DAE230141A7B62BBBD7748D35ACA255DABE00615B2C9238C83C9969ED95973709D912B1FC4081F31912E48298C7C788D8E552660A2D08A743EF90660AA7A95D80E9D31656EE05BF6A98A6D772A7C35E9B62B6898A4E3D4D7145A244DDF9D315B442DD11D1B1640A3E1B84A8AB6F8B65A6D1DC42109A9E98B3077524BA534DFE5809724144FAE0A9A1A6DB6449660A02595BFDF832A25B0150FAD71DB9572B994CCEC8692E958D28731A4D112BE38BD42083D7B656D97B325D36D5415240F965D8E2D332CC15408C00287C732E107189B2B7E207ED5465BC010A95E638B0AE3C0150B2DB07E8B8F00543A699CF9D453C32328D3762431D138B54D18785320DE8693CBF0CE45502D3C7156E2F295B83560A47CB154CE0F2E598707D351C4F865536704CA6D16085032D001945365A47724C33A90A7805EA3C7271834E4C94C63CC5A8C0B6EDC9E840DF3371E375B9333C3755D61A4574B67F1ABE640C4E064CFBBC875ED367D4A61297F881DC9C988538F3C96A56DA488630CD1737237232D8871A52B492FF00449A798BAC3B78658254D2425FFE1E666DE2A1F9644CD90C6C86C3CBDC40AC5DBC321C4D831B38D3F468D387EEF7A6F9592D822CEAD2C5234038819596603F7D7F27871FCA4FCAD5F0F286883FE9C21CEAB4FF00DD47DC3EE792D4FF007B3F79FBDE8D9734BB15762AEC5563F4FA71552C55D8ABB15762AEC55D8ABB1554C55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD7FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF84F5A9238F5CAA50699EA135805C2D19413C7A0F1CA841D7E5D4BD77C9FE4C9F5955BAB9531A36FB8A7F0CDAE9B15BABCBABA7B25BC363E568B8428AD2D3E13B75CDC474FE975F9B54642929D43CD1733551578D7C3251C4EA660B1C79EEA4E530908600D30CE1B231715A437D65F5A82269F76DFAE6A75317A5D04097D2BFF38A5603FC513C69B50F519A5C8F59A4818BDF3F32C8B6D7EE550D4EF503E8CC4C8EDA06DE35E6CD274ED634C8E1745F5C2F2DC6FDB31645BC45F0F79C3499F4CD4E482088842DD40C6326A9C55BCB703DBDDC25B66722B97036C22FA334EB45963889EE06093998D91DB69F1FA87E1AE5191CD8F245DB5845F5ADD46512E6929EC1A746D253877F0C8DD2631B66365A3C2101283071B2E0641A7E9B6AB2F22A0536C7897813496D944AA517E11D71E35E0463C28C415E94186DB63B2E580602DA0AA88B88F6F0CAA4DA0B74A641902A65A84D3164D09A9D7155F50686BD77C55DCC0DB90C554DA6A54F2C516A26EE9D1B16C06D552F883F6B0330518BA937F37E3859834AE97F4FDACAC96C1345AEA15523976C812CC4D4DAF474E5BE544B671A88B82CD4E5D72124CA7B2AAB0E42A7BE504B18B23B331FC3B8C039B6B27B39A35A6F9978A2D190A73F5D8F8D2BBF6CCBAA71495CB728DB636BC4ACB301B8F9636BC498DB3ABF518DAF126255154103AE4265C8C25AA467ED0CADC97048491B0C5556910EE31550692256A823DF2B9ADD216EEF23E34AE5643194D846AFA82420B33058E952C72EC637703365781F99FCDF662678397A8A4D0919B2C7074D9B3BCEE7D5EC0C9584D10EFF004E6588389E2DAFB7F4AF4811906B80C11C68897479C39A3D01E8BE19514A9FE8B71F69B204A695974DA007803EF4CA8C9CA84764C6DED78EDC0636CF85905B45180BF08069BE368213650028A0FA3157EEEFE50FFE4A6FCAFF00FC04B44FFA80873A8D3FF771F70FB9E4753FDECFFAC7EF7A265CD0EC55D8ABB1558FD3E9C554B15762AEC55D8ABB15762AEC555315762AEC55D8ABB15762AB97BE2ABB157FFFD0FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF85F8ECA6827585979C84FD919084FC474B9674F6CF29F906F35036D773218A18D833A95FB437DB719B1C3A1E274FA8D43DA2E0C763686D6D2216DC06CE3BE6D30E8F81D5CF2F11610F34D76CEB212EC8767CCC3300535006ED2AB986E56455F4CB03FB54CC7F1699CB7539675B32AB335030DEBB532B9E76EC1877633ABEBD05BC4817E3095DEBE39AFCDEA7A8D0E301F49FFCE3379B34BD275C3753CAABF58466DC81C4F875CD5E6C342DE931914F72F3ADEC17BACC9A94171F5A4B9DFD21FB35CD7CE36E44254F2DD5E40F74AC253188D3E28FDB31A78CB951C8F3BD4BCA69E67B826C23334CBD471FEC395F0D322049E6DA8F93752D03518E4BC89E28D5BEC95207DF4C2254C6389EA9A33F3B58E48979851B8C4CDC884699569EEACE6BD5FF000CA652722324EBD158255940E61BB6545927D6AB1D43EDBEE47865728DB644D32A8A7884600F0C1C0CC4ADAFAC952283BE3C0DD18DB27B39964B73CA3DE9F6B1E06C186DD1A90A6A77A9C9C62D528515707AED84848D950380A2A37CAA41902A4CC7B0FA3214CC490EC549353438190921A42AB53CB14F1297390814AD3B62B6A2C66F7EB8ADA8BCAE2B5E98AD201E46AFDBA62C97FAE07FBB2A7BE2CB89DF5C03ABD0F8E02CB8DB5BFE34F8ABF4E506569051B1DF7203E2C896C89561755FDBC8D3305556E7810FCAB4ED8382D24A252ECBB57A7D39138523252716B7C626525B901DB11869978CC9ACEFD64A7C5C72F87A5AE53B4DE394935E5B53AE5BC77B35108B8EE82903957DF229114CEDEE62E5566E43C3DF1663127705DC0A2B8B3181305D460208A74F7C05B618F854A4BF87C46001B2D06DA8C6BBF2FA3088ADA1A4D622029CFF001C9702DA17F4AC4C681BE23D05729CB1A5AB405CDD731BBF0F01918C2DC7C9B3C4BF35FCCF268FA60B6B78DEE2F27158E34AF434DEA332F1E3751A8C8AFF00959F947A8F9D3433AAEA90B5BFAA2A3983B75F119B1C717499A565BD67FE71E6F9B549EC74CD4B9F04E6005EE7B74CCC842C38E254C2A7FCA7F39795E57730C9731C7D5829FE991941B23240C3785A76B4BD06DEE22DA507B6634E0E4455269E35902A2FAA9DE40731CC5B8056F5410027D9FD939518B9319505E8CE36AE222C84938B13CC8A8E9D708091BA7885760570A781FBABF947FF0092A3F2C7FF00013D17FEA061CE9F4FFDDC7DC3EE78DD57F7D3FEB1FBDE8797343B15762AEC5563F4FA71552C55D8ABB15762AEC55D8ABB1554C55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD1FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8D2F23F91A57BA4BFD6D6BC0D68D99B874D4F199B556F6FBFF00315959471D8E9F1AA0A7024019B9C18F85D466CD6C59E49EF25615E4332A52A0D50DCB2DF2D6856B70C52551CE43DF31324DCEC38B88D3D353C81A7CB0F32AB551E03FA663193B0FCA3E7DFCCDF2B2E9FEABC7B2C7E1F4E53293938B4F4F9C6F56297D485DF7198E64EDB4F0E146E83AFDC797196E2DE46AA9A00091D7E9CC6CDB876719D3DDBCB3F9BD24F2C31DE0DA94AB1FEA7308C1B0667B4D94D69ACB0BD12208D97E3151D3289636F8657A07911B4F7D723B3D2E146909A39DB7CC738DBE395EB1F997F96F6BAE687305B355D42DA332D55454D47B0C8F03938A76F86AD6E6EFCB17173A65F42C9F1955E429DF0183920B2BB7BC4616F2C5B16DDC65660CC165F14EB3463B9032071B30532B566E2C3B83B65538D1499526D019BBD6990E16719A6917C5DBA63C2DF19A6D6F7CB1008C7E8C785BE395344BA420107AE061396E881329C892A0DAD663C8D0ED9592CC054571DF2BB6C017F2B7FDA1BF7C2A8599ADE876DBBE2A82372A361D3A0C5541AE7155295D4AD477C52934EC6BB6D8AA0C87F138AA8307DB7380A43AAD502BB7865062DA0A3E1269D7A60A6C0510A5BF98E34D80ABA3316515F98C69369846687AE16B4C2075322A96D8F7C55328A7F498156AD31564767AA23108EDDB08544B5EC55DA4FC724C81444378A5A9EA7BF5C2CC14C92F401F6F6F9E06C1277E9458EB593AEC37C84CB6715A849AC27412F4F7C8829421D6A25AF292BE1BE580AA026D6226DC3FE39602A841AA52B2C64B329A0032AC82DC5CF9B81E8FA0797EFF00CC36DF582AC8AA3AD30C62E064D45B23D2FF002E746D666FABEB1682EAEE27FDDB915A27874CCCC61C0CB2B7BEC5E5C8B43F2FBD969AA96E889B050053F01997034E0CE16C3BC93A446D35E6A37975CAECB32853E03A665C25B38C63BA6F3C3CEDB526BEB5496201B83151EFED82526710F942FF00F2B62F34EABAAEA1631FA2F393450294A57DB31E45C8807897983488FC97713E9FA8CA1A624844277CA0B7C52BB760F0C4E05030A819590C81A45AF5C14CC14D74F6F888F0C7859829D237C58D3305FBB9F945FF0092A3F2C3FF00012D17FEA021CE9F4FFDDC7DC3EE78DD57F7D3FEB1FBDE8796B43B15762AEC5563F4FA71552C55D8ABB15762AEC55D8ABB1554C55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD2FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF911B5D4CA4450905BBAE74F1C603E6D3B48AE67FACCEA900FDE16A6D9682038A626D9EF97B49957795D99CFEC9195CE6E660C6F47B1B58EC87AAF540BB961D4661CE4EE74B87D4191C5AFAAC65616692836E5B65066EFC600F1FF3E4D71AB45708F1045607E21F4E5329B64703E3BD62C6EECB539792FEE8B1F88FCF31CCDB04292D9AE9C158E18C484915AE57C56C8DA31A49596358E416F21EA54E44840059C68FE69D574B44824D51BD24151F16E7D8E63C837C6DEEDF96BF9A30697AC437F733A5B98C8A9E5D7E798F272216FBDBC9DF9E9E4FD7AF7EAF7B7111F56309212474C003978362F14FCFAD33C9F3EA31DFE8572B34929E46314A54D7C301736DE23636377C39471820F5F6C8101B0499559B2DBA8F59E847619590CC14FAC751B37996105CB374DB6CA671B613932D59618940988453D0F7C8F0A04D136CD6F2352390BA9FDA1BEFE18385B064A593E9D74D30689498C9DD8E3C2CC66461E76A80354A81BB65538EE9F15B87528DDB846416F0272B316C8E54DE3BC454025A06EF4CACC5C98E45296FE05DD4B37B5321C0DE24BA2BC570095007BF5C8B0326E59EDE9BB004E28B4B5E48F7A1A8C56D41A44DF7C56D45A4DB167C482797AEC315E24135C76A62BC4A06E0D7A75C4A89287AB43D72921B414545734A53E9C785B01B45ADC8F1C785982AE2E42D0D7A74C14C89D95D2EEA2B5DF035DAAADD92C17953DF15B4CE0BB006EDCBDF15B44BCE78F247A3FB6109050E2EEE01FB44FD392664A69697B329A93DB147123FF4A3014240FA71533A434FA846D148EF394310AA81DF018DB28654A6E3518B9DBAC324B2198D1CD3A60106CF142A299A4BC92D622F2040086237DF2622BE28651A77947CC5A9C4F35BD83945E8C4102996082F881EB3E4EFCA9BD9D44FA8388EA7918FE5898BAAD7E4DDF4559E9967A26872A40024C828A0EC09C9083AFE3280F24DBDEACF7535F5BA2C8EC5A075DFE1DE997C4522ED966AD33DA5A4934D2963312A213D299785E152D23CBF696D62D3ABB191FF007A2BDCB76CB449A670DD4BCD4C2CF402DC4249715529F3DAB80C944698D7953405B5B06BB9A61140D1C923CDFB5D2BD32B25980FCBFF003D4B379FFF003D6EF4486FCC7A769D39ACAA7ED509EB9021982FA1F54FC9D96DF4DB7BFD27525BB9258C39B52C28BB0D85322907778AEA52AE8F70D677C443780D046761F7E2C814CEC599516534A30AEDD30365A6515E425FE26A7B61676FDE9FCA021BF297F2B997756F28E8841F63610E74783FBB8FB87DCF21A9FEF67FD63F7BD172D68762AEC55D8AAC7E9F4E2AA58ABB15762AEC55D8ABB15762AA98ABB15762AEC55D8ABB155CBDF155D8ABFFD3FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8EF578F9B5C06FDDBF4CE9B8DE267A6651E54D1967BAFADC9BA72AAE552C8E29C1BBD62DE25826E4AB45AE56656E6E0C28FB8B9068427241F697C72B9F276F871F0EE94C97B4256184257314C9D96395B10D522BB9CC8D23058687965129399116F07F30E857BACDF35B58446572D4F8728949651A4E34BFC8DF335FC6918B3912693756A76FBF2B126118D966FA67FCE2079E3569D2425E28DBA7F9F2C4C9C918596BFF00CE13F9AA29D1E5BD255853896E9FF0D944A4DD0C4CC2CBFE706B5A9E359DB5858C2EECBCFF00E6ECA2526F8E265563FF0038CDA7E8171691DF7994594A8F4F50494E4476EB91126D11E17A95A7E487956EAE62177E6E597881D6407F8E032660A7179F957E4CD35D2DE1F32C444A28C798DA995993602A69F929E539E932F9A6293BF0120C812D82491F987F2C348D2EDBEB1A7EAA048836F886E7EFC46ED3964C33FE55FF009A2FECCDDDAAFD7517A01BFF001C970B57131F6D13CF3A6481DB4B6B5B68FED02A454F8E3C28F11136DE77BCB598417D6E4229A31A634BE2338B4D6B48D6A25442179EC6BE380C2D81CD45BBAF28385F5EC65A93B8A1C81C6DF0CC92CBA4EB91A13E9B3D3BE40E37331E54BCCDA9DAB7EF6D0923DB2BF0DCA8CD53F48A85E722346C7ED2F8661CC516CBB516D4ED5BED311F3C82AFFAEC741C5B63D3E58AA8B5E27F362AA2FA82F4AEC3BE2D96817BF5AF5DBBE29B59F5A88FED62B6DFAF19EF8A82A2648EBF6BAE45B42BC6CB4FB5BE1640AB2B8DB7C0D815B92D3AD70164AD1B0A75CA9AD7F2DC50EF8551D0135A5715477A8513956BBD310CA3CD6FD61BAD324CCA9BDF49F663EB8B548A3ED2C750BFA705635F0C5ACC99E795BF2D359D7F538AD591845506507C0FD396E38DB0964A7D476DF933A0D959033C4867812AEC7B6DF3CBBC363E2A47A4F937C9BA5DEDDEABA95DC29145BF027AF1FF006B2C18D7C5629E7CFF009C98F23796F4ABBD13CB56714B76A0A0950577029E1ED93F0D7C57937E5BFE746B779ACC375AC4AD0E9CC4B70EDC6BF2C84E14E3E63C6FAAB53FCD9F25F9AEDA0D1F43981BDA8590AF5AF7ED80069E07B5E83A3AD8E9B6019FD4927456E47B03DB260278588F9D0BDE6AB67A65BF660580C902ACD043E8C3A7C1D2A02B8F96264C4861FF00987FE997DA7E996FD178F35191E2470A335A8DA0F265F5869B66D3EA4B6CCA0815DD908C921F9C3F96FE439FCB3E7ED77CC1E77D224852EE6768DCA6F424FB9C3487D831793349D5EC21D5BCBBADB441E3E6D64ED4E1ED4C348B7E587FCE45F9ADF47F3B0D3667A346FC5A64F6A60E1660A1FCA5F98F1DD086D6693F771A84563DC78E34D80D3DA2CEEF4FBD50F1CC391F7C69982FE81FF26E83F287F2A829A81E4FD0E87DBF47C19D061FEEE3EE0F25A9FEF67EF3F7BD232C69762AEC55D8AAC7E9F4E2AA58ABB15762AEC55D8ABB15762AA98ABB15762AEC55D8ABB155CBDF155D8ABFFFD4FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF8BED12FA6D457F46FA12ADBC7F626A7C47E6736E72BCD5193DAFCA1772C114D67796EF4894FD51E31D5BB72F6C899A63A6B6609AB5DA32C37B6E2DD587C2E452BF2C78DCDC5A4012093CFBA5D95C5C4123AA9B7157693A7EAC13C9B39630D30CD5FF003318397B28A39E2ECD18AFF0CC4326D863A62B73E79D575085C4517A61F6F886DFAB29949CC807D51FF38D7F96B36BF24BE60D7A33C62F8E30BF64F43BEF98F29378C40BEE7D22C74E69E9269D0C76D07C10CB1AD18BF45AFB655C4CBC1E1DD9E8BFB58ED1ED0C421BF857933462881478E266DF8E16F93FCD9F9B3A89F3543E5DD06E92E5E7904370EC6BC2BD48DB2894DCD86114C9FCEFA4EB5E4DF2D0D6EE7CD33CD77749CA3B3864DAA7B5331A536C38E9E45E5CFCBEF30F9C746D43CE7E64D66E20B0B2532DB425E858FB0C89C94C463B64BF967F973179E359223BABDB6D26DEBEBDD31A6CBE06A32072527C17977E75585B796FCC53E81E54B9BBD4A68BE15773C8F2DC640E56DC7A7B286FCAFF002B79ECCC351D62C6F9A0421B801F0F1EB959CAEC31767F13E9997F303F2DADECC68BE67D3A6B4BB20707028DB6C4E1198863A8ECDA28BB3F307935EDBD0F2EEBB25AA1FB2B2BD313A92D3FC9A82D7B509BF41DC2C9AADB5F475256456ABFCB251CE4B4E4ECFE17805ADC68374F7306A7693F224F0940D8E644276EB3361314A5FCB71DB96BED36F0C31F22521734232F0C2386C59661A17994D9010DE5D212BB75C90882931A7AE681AF68FAB442DD6E22172B5E418ED919419C7210C953CBDA4EA2A566A7ADFB253ECE63CB6726398B18D47F2CE695A4789223131AA377A7DF98192365CC86434C1755FCB7B8B552CB1866F0EDFAF2A316CE379BDEE87A8DB170B6D29E269D36FA3234C81481A3BD462258245A7B645210F34BE98F8C1030B7525C6F2035058838B3115212F03591CFB53148802A6DA8C6845198E2C8E20022A1BB59A95241F6C5AC48A3967229C6B4F138B30510B73D37E98B74510B703ECD7AE03BA65B045070AB50D91E171BC42AA92EC64AEEB9131489A36DAEC3380DB0F118084892266BD759111006889DEBD71886C81DD1F0992E18C50C4657A7C210572CE16D243D3BC97F957AF798E482792310C524A1645E8426FBF5EB8F0B8D393EB1D1FF002374CD2AD24B8FACC8B2409CBF7A76247D38F0B8D29A0B4DF33689E5E3793CF730C571A7D79F134A8197618B10789E11F993FF003955A5E97697F6FA0A9BABC98323B49BA8EA36F87325AE669F188F3B7E6079FAF9ADAD2F561B59FD46B94534201A9006C3C70DB8E7290C5B4AD3E1D275392DB592F717334A03C8FBF53DB27C69194BEACF2AF93E2D6E1161A2A492974A3B36FC411DB2B99B6C8CDED5F941F9172796BCC4FA84AD2CE8CFCA6F537E277E9BE56CF8EDF74C691C2A8109E1025501F6C3652082F3BB1AEA1E6A7BCA739223C78FECED8DA683D06F1115A198578A312DEC72F8C0485A90180C006AFE6C9243F14708DA982500189A66B1C4F1488518AA4B5E5F25CAA52A6069E4DE67B48BCC7E67B6D2DADD25B585C7AEC07C54077CABC621AF64279ABF2B6EF4DD2B5AD5741BE6B484216823534A0A0EBBE4865B6C1005F879F9B02E6E7CD9A80D61E3BA9E1958073B9DB26269E00F3089B568627BAD3D12358E4A1E636E3ED960368D83D2B43F3C4F63259C11C9CE5968272DF641EF4DB274178807F551F9093B5D7E45FE4BDD350B5CF913CB92B11D2AFA65BB7F1CDEE1FA23EE0F2DA8DF2CBDE7EF7ACE58D2EC55D8ABB1558FD3E9C554B15762AEC55D8ABB15762AEC555315762AEC55D8ABB15762AB97BE2ABB157FFFD5FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF90FF00CB7F20CFABEB70F9784FE9BBB0569CD76FA727E3B8A3474FD1DD03F23BF2F3C93A589BCC5E60B79AEDE3E4119F707EFF007C7C76C8E969F1C7FCE4679DBCA97925BE9BE5331C6DA651649E3E8DC698F8EDF1C34F985743D435AB73A95C5AB244568B514F57DBDF01CEC8E34D74AFCB3F36EB344B1B65B6B63FB4C074FBF29395022CB74FFC91D5CEA169646F0CB792B82B02D6868457299657271C5FAB7F90DF96FA8695E588AC2E2331968C027E81941CAE6460F7693CA361A1E8F705C896E5DC145EFCBB1CA8E46E10BD9F397E76FE60587923CA7269D6404DE66D67F72186EC81E9BE0395C8861A60BF911F93BA0E956D75E74F38EA0B3DC5CC06ED8B36E8C6BB75CC79657371E36216F637DF9B9F9A52D868F792CBE5AD35E9287354A2FDDE198F2CACE589ED7E70F2C5C6B0963E42F2E5C1B68B4F939DEBC6688E0F63959CAD4715259E7AF3EE89F933F97B37956C5565F325C2141243F6F930237A57227236E3C5C4F19FC99FC9EF3579E357B2F3B7982E85BDACF299409BAB2F20DEDE390395DBE97476FA57F323F30348FCBD8C68F62F6D3B88F837115DC0A7BF8656723D0E9B40F813CDFACB79A75A6BE9E0145242328E80E0F11CC9F65F131F9AC2248F925F4B6EDE08D4C81CAC4F6481D1434AB8BFB2BB8A73AACD71A746F59A177AD4F7C9C32BAFD4F66D07D412F9D7C87AC79623B2D3ECA38F5644A34B415E599B8F23CE6A7414F0F3A6EAF7777248B3B95AD16253B53E599D8E6E8F2E1E03499E9BE5C56BD53AB192DE2247276DB2F127127165D7FA0E8F0317F2EEA85EF1002C8ADB93E18CA4D6229B7953F33A6D26F5346D6AD65424F1FACB0FA3AD330E72722117D2D63AAD9DEDB42F6B79CD5D4155AE634B9B971E48AF5AD89E372BCD7C72B219A1DACF4FB9E4A6C57813B371EA3C72B21B2293DE792B49BB25BD08D49F6FEDC810CC3CE75CFCAFB296390C4A2B534A7FB78B787916A1F965240EFC54D05698B6061D7DE50D42353FBB240E9F462CC31B974CB8B7E4B25B9AF8D31672E4848D2584EE87171AB74D61B9A8E25295D89C5B150951DF1640B4B28A80A773DB14CCEC9AC658A0DF22E2A3ED62326C7A1AE34B68D58A15824653F18E831E15B645E43F296A9E67D5E1B75899A194D2B966385948C9C2FB83CAFF0092FA779295353D5A2170654E410EF4AFD3991E1A0E77A4E82DA4699F5ED6AE255B3D3ADE3630C55A55C7418F86D32CCF3DD5BF33AE7CE574749D20496F6ECDE9B4E36047CE98F84E34B23CEBCF1A3792FCA7A1EA926BBAA97BEBD80FA4BCF7E743D725185328647E5DEBFA8C32EA57C2CE212DA991B8B91534AE4A98E4928F9735ABDD1EF0DD69B251CAB7A918F9634E29927A350BBF32B5ACB1DBB3DFB5C207A0DFED634CA2FD64FC8CF29C1E5EF2B0D66F63A5CC9081F17662A3010D8F77F23D85DCB6FA9DE5CC815667261AF8646922D3CD6EEC69D62189A168F8D7DF1A6C8DA43E4EB4FAB9B9D4661B4D5E24FBE34CF74E755BCFABE8B3C8C68ECEDC7E9E9878E934520F29DB1B2824D4E71BDC92149F7CAE5918905956A139B4B19A73B7D514927FD615CA253B6B312C23C8F6AD35FDFEB972B54B824424FBE5129313128BFCC0FD23079435716F2B969636A460F4DB2D8DD391189E17E06F9FFCB7AE0F34EA9A85FD94CD01998F220D2996C4B0902C7749D26F7CCD7834686136494AA9229C865824E348909B47E4F86CB506D288E57711A09325C6E399C83FAA2FF9C7E80DB7E437E495B375B7F20F96E33F34D2ED87F0CE9307F771F70FB9D2E5DE67DE5EBB96B0762AEC55D8AAC7DC7D38AA9D0E2AEA1C55D438ABA8715750E2AEA1C55D438AAFC55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD6FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF233CB9FF0038C3E4DF2ADCBEB13B133D0B1911C0CC3B2E7ECFCE5FF9C95D5A6B1F346A1A7E95AB4E6C625612C5CC96E229B03DB1B29A0F89DEDDEF00926B97974FF5394909AFAA47BB63653C2FA87CC9AF797F56F2279774DD25D34B4D3A86707FBD6A0A751BE365061B337FC8DF2C5E79C752B7D26D6F2E0CAEEA11B937122A32B258460FD2CD3FF27FCBDE569F47B4B9B432EAF28065BC6DF8F427299172618DF40456B6BA6D9C16FA4C4102A51E4661D69EE72891A732106272C4F737978F79C94DADBC970B272AA1F4C578D077395D972B1E3DDF9E76B6317E6E7E6FDCDAEA08F69636B318F8CA7ED509FB35F96425272B829F42FE69F927CBDF977E4FBCB5B1FAE896F63315A4924C4A7A8694A0F0DF28916D8079F7E5DDB5EF907C986636E96B7BAC9ACD7DC6878B03D0E512939118A6307E6459E97A6DCD968086FF00CD3316F4EE07C67936DBD2A72B2594B0DBCCBCB9F94BE65F327999FCDDE78B1B8BA4327A932C95E0141AEC08DB2264E4E9F4FBBD4FCFBF9ABE57F2AE8F0E81E52E7677F0A18E242F550D420EC32B26DE8F498007C75AEDF5D6B378B7DADDCB4D7B292CBBEDD7C32B327A0C31012DFADC21FEAF343EABAED118C5283DF07139825174B3C0842B583B13D2B91254CE285BAB580C5EAADAB41714FB1FB253C699289759AA31AD93BF21FE5BF997CF5AA25B7942D9E390B52E6465257DE9B6676393CB6AA9FA0BF97DFF0038C4BE5FB186E7CD3299AF1497996BFC33618E5B3CA6B620CB646F9AFF0025F45F3497D3AC6330A8F843A6C7C3AE64893AE9C5E7FE59FF009C4B6F2E6BEFA88BA9E78B90608EE5878F4C12935883D1FCE5F91FA16B366919822B5BC450A27550A6B4CC49CB7722317CD97FE5DF30FE5DDECA90C72EAB696CD44F4EA683000D8F40F2E79AEC35E884733AD9DD746B7907C55FA7010CD983EA0F1AFA3C1404F85180EB9590D812B7FADCADCBD6F84F4036C810C834F248AB406BDB7CADBD21BA53293CD41C5B42552E936F221AA038B20C2B54F2BC3217A44BB83DB16C3BBCCF54F2A4B17F751803E58B5F0B13B9D1E5B706AB4FA314243346F1FDA53BF4C50A5146DC838041076C0589927F096E03236C0A6F6C582FC3D7FCEB931BB548A3A0D2A6BABC820B40CC2660251D7AE5A22D7C4FD0BFC98F24E95A1E9D6B7A2D985F08F90673515A7865F8A3BB4CF23D4FCD9E6780AC36D247CE78E3ACC3F6683AED99341C7F11F21DDF9E17CF3E61BCF275ADF243A7D94865BB8D0856A0EA2B5F6C691E25BD5935BFCBEF2569062B7A34F0A7266EADCBFD6C683025F9C1F9BBF987A879ABCC37C25AAE903E1B5727627C0602144A9E07E85AB1755670AC4D77C1C2C2791D64B67A6DC898BB2CBB8849355DFAD463C2D5C56FA7FF00203CAB16AFAF433BBC73C664570817DC1C785BE127EA25D4634ED0934E0BC04DC5828DBA0ED9121CDC401E6CF7CB6D0268F089CBAB2814A1A7DF829BC4425FE6C65BF8AD6D636E3561C877E38D331009F689666F74B92DE195614B215766F6C69B0462C1FCF9AFE876D2C3A341AA4308545370ECC0EE7AF7CC79C776C1008D7F39FE5FDA687656D77E64B5630D0944700D7DF7CACC14C22C4BCD5F9C5E4792D27B1D3F5980FD6C2ADC55813F08A0A6FB640E32D6718653E49F37F93EEB4286C1756817D221A3F8C035EBBEF90F08B0F0C273AE79A34C3A7CF099619CCBB2B5410C3DB7CC8863A0E44202980CDF92FE44F3BE963EBBA72FD6AF3ED3A902B5C3C0C258C3E78F3E7FCE23685A523EB9E5EBAFAB6A963FBB823076A2F4040EB83869C69E10F9423FC92F3C4BE66FAC49A6CB33C8D46B8553C4FE18971CE9EDFD0E7E5058CFA67E52FE5769B72A52E74EF28E896D7087A8786C21461F78CE9F4FFDD47DC3EE797D40AC921E67EF7A2E5CD4EC55D8ABB1568FBE2AD547862AEA8F0C55D51E18ABAA3C3157547862AEA8F0C55D51E18AADC55D8ABB15762AEC55D8AAE5EF8AAEC55FFFD7FBF98AAD6ED8AADC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5578E98AB78ABB15762AEC55D8ABF30EE7FE3932FFBDDF60FF7998EE4BF25BF357FE537D53FE39BFB5FEF6F5EDD716D0F1497FDDBFF001C5EA7FB9E98B745253FDFDAFF00BC7FDE0FEFBFB9EBDF23264793F4DFFE7143FE3BBA67FC707A2FFBC7FDE74194B18BF42B56FF0094853EC7D8FF0077F5E9FB194CDCA83C8BCEFF0061BFE521FB5FF1E7F63A9E9ED98F272E09DF927FDE49BEDFFBCB27FBDFFDEFFB2FE3953938DF1A59FF00E4EBB4FB1FEF50FF00783FBAEA7EDE464DF27D01FF00395FFF001CEF2EFDAFEF63FF008C1DBAFBE53258F3625F985FF92AB47EBFDCAFFBCDF6BA663C9CDC6F00FF009C69FF0094FA7FEE7ED0FF008EAFCFB65679B9717EA37997FE51BD43FDE3FF00799BFDE4E9F64F4C94F936E93EB7E3179D7FE531BAEBFEF43FF7DFEB9E998E5E9B4FC921BDFF008EDDB74E9FEEEFB1959E4EC23C936D3BFE3A375FEF1FDB1D3E5DB029F8ABEB3FDF27D8FF009E790973627E2AB17FBD717F75FDC8FF007A7EC7D39383AFD47C5FA1DFF389BD2EBFE385D0FF00BC3FDF77EB99F89E675DC8F37D49AFFF007D71FDF743F6FECE6645D066E6C5344FF7A24FEE3AFECFDBEB99117124CCAD3FBE7FB5FECFA60C9C9AC3CD3CF1F69BEDF5FF0075FD398736F8BCA74FFF00A587FBC7DFFE3A19747E9497CB7AEFFCA552FF00BCDF6FFE95B80A43D7A1FF00792DFF00BCFEEC7F7DD722DB1504FB67EDFD1959641565E9DF2A2DE12997ED606D0843F4E2C825571D5BED7D38B6B12BFF00DAFB3FECB14179F6ADF6BFDD78B51611A8F5FF00757D18B192017FBB3F67A603C9804543FDD8C805926D69DF2E8B44F9BD2FC89FF1D6B7FEEBED8FEF7E797C5A25CDFA15E5BFF8E6DA75EA9FDD7D1F865F071F27262BE69FF8EB6A5F6BFDE47EBFC32E71DF97FE4FFF00C995E66FF7BFFDEC93FBBFB7F4FF00938ABEC7BDFF00943F52FF008E77F70DFEF47F7FF47BE2AFCCCD7FFDEDBBFF007A3FBF7FB7F63FD8E1632E4C6A3FB4DF6FE8C0D3245C3FDD5C74EDFDEF5FF638583EDFFF009C50FF008E9C5FDCFDA5FB5D7A8C0E4C1FA41E6DFEFB48FB3FDCF7FB3909399064D63FF1CF8BFBBE9FB3D320DC3E2C67CC5FF1D0B0FB7F647F77FC71671F8A62DFF28CEB5FEF67F74DFEF07F7BF4E167F37E67FE65FF00C746F7FE526E9FEEDFB5903CDBA3F178737D97FF008EDFFCF6EB8127E2952FF7FF00F4B5EBDFAE2D72F8BD3FCA9F6D7FE526E9FF001EFF006708607E2FA3EDBFDE1D1FFE523E8BFDFF004FF65930DD1E5D5F5BF977FDE0D27FDEFF00B2BFDD7DAFA72054A7FE6EFF007960FF007B3A8EBF47DAC816324FB4DFF8E7D97FC733A0FB5FDEF4EF902C1F62796FFE51ED07ECFF00C73AD7ECFD9FEE57A7B674DA7FEEE3EE1F73C7EABFBD9FF58FDE9D65AD0EC55D8ABB1569BA62AB315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB155CBDF155D8ABFFD9, '1', '2021-03-13 12:29:10', '1', '2021-03-13 12:29:10', b'0'); +INSERT INTO `inf_file` VALUES ('add5ec1891a7d97d2cc1d60847e16294.jpg', NULL, 0xFFD8FFE000104A46494600010101006400640000FFDB00840006040506050406060506070706080A100A0A09090A140E0F0C1017141818171416161A1D251F1A1B231C1616202C20232627292A29191F2D302D283025282928010707070A080A130A0A13281A161A2828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828FFC200110800EC00EC03012200021101031101FFC4001C0001000105010100000000000000000000000701020405060308FFDA0008010100000000FA14000707A3E3F659B5F2B3CB1B171B57BAFA2C000BE1ED8731AFC752DF3F2F2EF249DF79D0000A465CD59E5ACA5BE7B09BB71441BBB943DC0017447C95DB0D662E4FD0192237F3E17E8600039B8AF556E579647D0B60807A3DA49368003D7E7AC1A5B678CA3255081A4AEBC0007AFCF5834C6E8BA3DDF756902CE39200034908796C661E82C04073E003D755A4B2FC9F48A34CFA172404152C6F415C4E175B9BB879F8EAB41CEF792A807CF1B1903B7BADA5DC0737D47ADCB3CFCBCE3FD2CCBDB807CE35CAF5E8B3F0757D0FBF1BE7DD655B65965BF384B9397B80F9C6A2EDAF577F05A0F3D9499958BACF4E7F41D0654E168118657B59A8E2E43DD71B31FC73ED26EE33FB0E939E8FB135FEFBA9528007159783CAD981B8C5DDC9596A5231D6E17173476200BE26D8351AFCEB33FBED077DABE2FCFB6DB59CE463365A018B156E4A3CB7DDBC65CDE3EDF71259C945B3D7900725CFFB554C0EA3B769E32BEC92F794A4711EEE3BDEBAC0380C657CB7FD6E50F3D4E266EE0C2E2F9DE73CA6FD90237B7CB7FDB5F554B6911C8BB8A948CB039CE5E79E94230B3B6E98A82945453C225BB87D44E3DA158BB77DF56A00A1452DE6A2DB397D6FD5C562696B215002DAE1E4D29CCF8471C9DBF4E9EB03CF952A028A539DE8296E1C7DD3C2DABFA80BA3690760A5C28514A626A37F4A523DC2D7E9A772B1CC9B7733B2DA2828A2DB628EAFABA523DD1D29302BC6767EE88E46DB1414A29486A1A9CF8E99E2BD91303CF98ECE8897A9EC5428A294A70B04E5E279751D613038FECBD5485BA5911428A514530780D5E9B7B62930B93ED2D6A222EA64A28A514514ADB444FE56D7FFC4001B01000105010100000000000000000000000001020304050607FFDA0008010210000000F3600075E70AD558EA46005B9DCE33E1B7367000694AC32CD3CC00034E58A1A69A59A125A512766681ACD81C9A194D4F44E2B280D94750E8BD1383E7AE6F60E4D500BB0F4BB3CCEBAC540E7500BD5CB7D135B33E0E769342FA6DDE51AAADE56CD084D7DE780014F9CBF8EFEA2E800346D4CDC87F57654104628C38ED9DE6B841064EB5978DEAAEB155104115A7FFC4001A010002030101000000000000000000000000040102030506FFDA0008010310000000EB00043FBC939A35CE4003A76164A7AFC9800061CB22B8CAC0006EDA78C4B0B845F5B8C23981D3533A3CA742D7F0DDCD006A346783E07D9FA05BCFF7A92016EAF9EE0FABE6CE8DD4901AE84ADC1E8F5BCDE0CEC483FA72520BD62DE8D54E46B8F500019F429A318AC001259BEAF3215C8009BC1B5F4C55D2B5924B9560D55CB5AD2490B4EB3FFFC400451000010302020604090A050403010000000102030400110512061321314151203261711014222330425281D11524333440537291A1B116436292C16382E1F0357383A2FFDA0008010100013F01F4FC6B4931051908C2222ACB706690B1EAA397BE9E719811335B2B68D800AF9C4D735CB6D6A56E48036229BC3DF575B223BCDE861A84ED71E3F95AB53091D672FF00EEA270F1EA66FCE8C8863AB187F68A335A1D58C8FD2953F932DD2A628FF2DAFEDA3249FE5B5FD94F2D9BF94D3415FD236D4518C6ABE66D627A9E194AADF6047585622C3B866352E54C49533297E43C3684F61E54E105ACC946B788038D09B2E495063220A77802EAFD696EBF721C79DBF2BDABBC93DFD0346AF750424152D5B9291727DD587E8ACA9090B9EE888DFDDA76AFE02B0FC270FC3BEAB1939FEF17E52BF3AD62A9195C405B4B4B883B8A4DFEC0B4A1D694D3C80B6D42C526B12C39583FCE226672028F96DEF2DF68ECAC4594AB24A64EC3B7327876D22521D4E5988CDFEA246DA7A294A758C9D635CC784D1AC330F918A492D46B04A7E91D3B91F13D9585619170A6B2C74E678F59E575954493BFC3F25BB11CD6E1129C8CBF66FE49A8BA55221B89631D8BB0EC0F37C6A2BEC4C643B0DD4BAD9E47D38B1052B014856C20D488BF26622B84ADB11F1999278734D3CD969D520F034CBCB65576D56A25895BECCBDCFD534F34B65595C16FF346A0C473109CDC465594A815297ECA79D448CCC18A88D15395B4FEA799E88A75B43AD943A90B41DE0D3C1FD1F9499905CB344D8A4EEEEA0A0E34DB805B3A42BD3E92C432F075A9B1E7E3F9D47BAA7283A961F4FF00311E14485253915671BF655FE3952D0082B64E64F11C53DF583CD187630C495FD09F34E7603C6962C766E3D1462130904EA7F0E534EBB20A9A8F159D74B705F28DC91CCD46D185BEE25EC6A46B2DB7528DD4A3BAC2C06C03D3B7B4E53B8EC34B4EA98531F72FAD1E1357208209046E229C3981CC37EF238FBAB43315D73670D92BBBAD8BB2A3EB2797BBA3872017F32BAA819AB4559221393DC1E7652AE3B10370FB0B5D7152961C7A42C6E72438A1DD7B785C7128EB1DBC071350B02C5268CC969319BF69EDE7DD4DE8728FD63123DCDA2B0DD178906735284A7DC5B66E01B513737E824EAF0A98E0DE465FFBF9D436F5387C4680B656923F4FB0E3738C083E6B6CA7CEAD94F6F3F752C25166D06E940CA0F3EDF061B02462920B516C9423E91E56E4F6769AC2F0785860BB2DEB1FE2F39B5468A89DFD37ADF213DF8BFC8A1B59688DD907A20835227C18BF5898CA7B335E97A478524D92EBAE7E06C9AFE228C7A90A72FF00F9D0C7D9E302701FFAFF00E6938EE1C4F9C53CCF6BAD102A563586C58FAE3290E83D54B67328FBAA6CE7A64A54A90323A5391B6FEE91F13E04A1C79C6D9605DD7559103B6A2456A0446E2C74D9081B7B4F3F43193AF852637150B8AD1E942760CC281BB8D8D5AC768E9EFA992A3416F3CC7D0D0E00EF34EE9148977460F12C3EF9EDD4A87325FF00E47107560FA8DEC151F0B84C7518413CD5B68009EA803BA8D1A34F448EEAB32DA467F680B1FCEA4E1EA4254A64A9CE394EFF00CE92A0ADDDC472AD098E97A5CA9AB17D479A6FBCEF3E899714D38168DE2A338E33255270D7FC5DF59BADA5F51CA87A48CA9496B1465511FF006BD4FCE9BCAEA02D95A5C41E2937ACA7978522FDD5896901538A8B82A75AE8EB3C7AA9A630B0A735F3DC5497CEF2ADD49B0161B055EAF57A2689A346A7E30F78C29A8694D926C5445EF4EC85BEE053A84B723DB1D55F61F8D684048C04A13F4A1D59713C526FC7DDE910FAC2321F2DBF655B4530A61B5E646BE3AB9B2E5A9B9F3B66A31726DC1D40AF95B1C693B04391EEB1A5693632D9F3986B67B81A7B1BC5719CD0C3488ADFF3549BEEE550E3B71590DB42C07EB4FBEDC76CB8F2825239D3FA43B7E6D1CA87359B531A4842AD263651CD06A3496A4B41C616149357ABD5E8D71AC230886BD1790EBA91AE5A5C257C516BD4194BF18650B480D1010A17BDCF3A8921FC2DC131ABAB56723E8FBC4703DF51A435362B72A32B332E0B8F4C1453D524771A87AE7DD09D6B9946D3B69B425B4E540B0A52821254A3648173498F37185AA42595AA3A4F93C8549929662BEEB2DA17A95645051B1BD61AFB38A5D011AB780BE5E75143D86C82E37D5F593ED0A8B25B94C875955D06AF4FBEDB29CCF3894279A8D7CA71782D44730DAAD45F4C98EE884F20B994E5B1DC6B0275E6D9721C8D6A2DD64AB7281A7F4714257993E689BDEFBAA4C96A2CA4B6F1F36F2721ECEDAD1F9FF22622B8EF9F993EADBFD0AE7DD446E236A4EE3E813A1E7F9B89AFFDA9A4E8743DBAD99257EFB57F0861BF7D27FBA95A1F879EA48909F7D3FA21251730A685F24AC5AA6C79B86AAD3D8213EDA77560907E6F9DCD855B4FC29C8A35B649B0B5EB1D516F0C91CFABFAD600DB4CE09112DDB206C7FCD692869CD209EB67E8CBA77568FB4E7CA91CB69E3B7BAB1646469C58DA40D82B0D8A21450D5EEAEB28F6D3697E63C598405D3F48EABAADFC4F6541C1A24539D49D7C8E2EBBB4FBB97827E0F0A68BADA0DBBC1D6FC950AC423488032CE0A7A2DFC99281B53F8870EFAF9D048CA10F208D8A0ACA4D3985096A0E4C514AF8250760158AC44B91EE91D5163DD5A218C2B38C3272AE7F92BE7D94458FA4D2D7C96A261C9EB495E65F6213B6A23EDA59B28D88A724A8BAA523603B2B1B19B0C7EE6DB2FF00AD6172DF430194B8AD572A95804790F1790ACAA3BC54382C4004A7CA739D7D6E50B6D69A55D479AB9504392A408B1CD96A175AFEED3CFBF95458EDC5610CB09CADA770E8101408201076106BE4A5AF5AF610E06D21C524B0EED4120F03C29D5CA8DF5D82FB607AEDF9C4FE95F29C4E2EE5FC4922B15318A82E3C8403BD3955B8D68962C716C36CF2AF299D8AED1CFD1A05D429D77C771D9926F76DAF30DFBB7F87158AA99096CA1412A36DF50E0C88EC84A9E43847022DFAD66929D81827B42C56A243E7CFA836DF241BA8FBE965319901A6EFEAA109F589DC2B0F8660425EE724AAEB591EB2B977560788B8E4F991E5150505272E6EEF04B9CC450758BF2BD91BE9CD296028846AFF00326938FC89CBD461CC05BCA1D6DB64F693585C4F1282DB19B3A86D52B9A8ED27C0A48575803DE2B178EC2602C865B06E3720560EB30B4B5ACBB1124588A56C51F4531EF168129FE2DB648EFAC211920357DEBF2CFBFA4EB8865B52DD504A06F26B0684B71D4CD94828007996D5BC7F51EDF0694C53E3D16446506DE5052566DB176B581AF18C4BAB9503B75A6D5E28EBC6F31DCC9FBB46C1EFA4B6848B252903BAB01467C656B4F55A672ABBC9D9FB7431F72CDB4D73398D48F271BC29437EB2DFA8A77AE7D1697B9ABD1E75237BAA08A69391B4279003A3E3216EEA6321521EF61BDB6EF3C2B0DC1D7AE4C9C4B22DC4ED6D94ED4B7DBDA7C38AC3F1D8A50956475273215C8FC29D73C5DCD5CB4961CE4BDC7B8F1AD6200B95A2DCEF4D2D7255921365F5F31D51DE6B08802045C8559DD51CCE2FDA3D0C614A54F702BD5D83BAB16D6F8E40547FA54AC94F7D31A4B8CC43F3D8A1F6C6F396C7F31585E9161D889080B2C3E7D473E34A491DDE834CCDD186B1EDBD7E83257254530DB2F91BC8D891DEAA6B020ED8CF794E7FA4DF928F89A8EC351DB0DB0DA1B40F5522DD15A12E272B894A93C942E2BE4A819F3F8947CDCF2548C4998A754CB79B2F04EC02B0F9C8999C25252A45B37BFA12633525367537E4788A9FA3C1E19DA78EB1BBA9A047ADC298703CD058D97DE391E22B11C2DB76EB69365F2158563B3B082942FE710C6F4AB78EEAC33108B8AC7D7435DFDA41DE9E9E949CD8E618DFB282AB781D73265012A5AD46C94245CA8F6544C194F0CF89916E11D0760FC478FED484A5080942425237002C07A03B8D390714724A9866304241B78C38AF27BC0E3585406F0F881A412B513996E1DEB573E963917C46619681F357CD9DFE85FB5DC68D6251B617503F10A61C7F0F9224C0564706F1C0D6038DC7C659B27CDCA48F2DB3FB8ECE96909CDA551C704B17FDE9E73568D892B59395284EF51E558461BE2BE7E45973163CA57040F653FF0076FD89E6D0F34B6DD48536B16524F115219561B24457AFA93B1874FAC3D93DB46A5B3A978A7D5DE2BCE30FA64C45143E837045617A510254342E63896246E5A4F3ECE871AC636E972FFA628FDEB47E3090F2A7AF6A5376D81FBABFC7D931D85F2843530DB812F6F483B95DE3FCD403250B5C793B54DEC39B62D3D879F7D62A9F36857236F03B192B5E6B91D01BEB1F51563D2D2D6C756866324F6AAFF1A8ECA23B0DB2D0B21B4848FB03EFA59C80DCAD672A1237A8F431E694A845F66FAE8FE705B88E229C8AC6330997C9C8FDBC9751BD3F11D958C3722235AB9A80368CAEA7A8BF81ECE937D7AC3E5993A62DBE47997242F2F7E5B0FB0E1C7C664489AADC545A67B1037FE67A12D84C98EB6944A42B883623B6B47642E015E1F33638855BE07B8D62AB4BF065B4B48394849078D4A82B601531771AF638A7BB9D254142E9DA3A093635A4C9660CEC15D650869297944D85870BD4394DCC6CB8C056AAF64AC8B05768ECF4F2DCD54579C1BD0852BF4AC0148560B0CB7BB563F3E3D1D286836F44969EB156A17DA0EEFD69C92A5EB2FEBA520F78F03F874779C2B505051DF9556E86C00A9442509DA49E1410349E787568B6131890DF02F2B9F750000000B01E0C6F11F1169B4A7E95D5048ECEDAC35F5488895B9D6DA0FA4202810ADA0EC35A3B3061932561524D834B3AB27D9E0698D21C35F9DE2AD48BBB7CA0DBC951E40F434CDDB4161A1D653A93D2DE6B1B5AF11949C1A2A8A507CA94E0E09F6477D30CB71D9432CA421B40CA948E1E1D28CCAC563A6FB3589FDAF58565F106B29BECDBDFE974FE225296662363AA56AC914127665D878562DA4AE468AD371D00CB50DAB56D48EDA81A5188C792954B73C618BF969290081D94FE2D15A4660E67BEEB7C6B1A7D53A6C7521C4E6CF982378B749D7931A3BD217D56D2555A2ED2BC4972DEFA696B2E13D9C3A1A48ABCC2AF61D47C2B00776BAD1FC43D2E99435CBC1EED0BAD956B2DD9C6A1B49912DA6F7A6F750ECA95152C4D534D9590948B85F0A71BF20D3816E93AE56729397B36568FA72B4FEC1B17BFDDD2D2E51F929A8E8DF25E4B74CB619690DA3AA80123C24D85CEE158A2F5ADBCBE6ACDFF00EAB0755B104F6823D32224742CAD11D94ACF108158E600FC99CB950D6DDDCB67439B368E37A8BA332B5A15296C8037041BFBEBF86B1242F54DA1A5206E74AF7FBABC45386B288F9B3BBD65ABB4F4B1FDB3B0349DC645FA18B2CA2039978ECAC4C5E0BBB48D97D9583FD7D9FF00BC3EC4EAD4E3AA5ACDD4A37E87FFC40029100100010303030402030101000000000001110021314151611071812091A1B130C1D1E1F0F140FFDA0008010100013F10FCE0B032D36BD74B69C8F6137A56A00C92E87777A82C152709D05827769D2D7B9F63F9A46C9B00FBB58E2CDE53EC547DD0BE1FDB41C2099E4F34E5A46241F4524D856723E655FC52A491A36144F10CD40C4961A5C0BFF8103389AB0DE8E169ED3DA981205B99E90B6F348CE90978FE14B61C15F4914ABF205FBE8D3D0A94B3D0E3F81769770BD97397E02682183E43CB1E2294727B5459448C1F25223088FE782179644A756382AA57C9FE734AE1D0F0A701E6841A16200E50FD7B5470BDCBE9DFD05429E19C96DC9A7BA2ACC52D45BBE8705A90953D65F35AD3FEB99A590583939461F10F15A997264EE64F3F9E17411A4473255DDB9BE3538D3C6F578EB43B9A352612C991EE56128D1979DAA72568E4EC7A0FF3C04C5986AE87347DCF7BCBAC9AAEAFA548290C636AC7B65C8D3BACB3232B35930F151AC466D20FEFF3CC91C50966E4F24FB563C096344FFBF1D1A6C29CB58E56553F01BAFC6DB92D589215DF9F161A0910DE1309E91A4CDA29F33334A674442CB680DA8854C0743C2EDBC7BD0282100D0FCE0719341D4A99198FBCDA64FBA69E8D4598425190EC4041DDA3C5B82951A60E51DDAA3E3B52228E4F427CED4F18FF0071508A74B9647DCD673FF804D4A38B5059803F0D34D47E461BF60AD946AA06E1BD452466E708EEBFAAB2938A163582A6777A1B4417B4508404404130FF00C248277E82EF8177C57B207167C957A5BF1A24CFA0F83DE8309CD60E1D0E0A6EEF1EB825B909A199214F63F0E714B2520DDA2A51BE056E096A589D2F5DAD52A33D0919F769379F44C1EF4895CE0F71A1286E36727605FDE2A69EC7647BB3F36C7484A6721AF6095ED45888919D64EAADFF0009631BDD8FE42B946162DDFC47AC15012D0471C8F60CBE29652EC840344313C2BDAA752C85BC7FE2A0133A73F9A3E01C400FAA4EEFBD2A6A65A33146488BB82F4E5E9BB25DB53DE895948C8215B268D0F0109B429EF441E5A5555CBF85500DEC3C539B9C696FD37699342E895CEC3DCE6A18E24207DA93D5489913A5DE017574A0FEA8371DB47BE3BD33BB64287CE7EB8A02103004051428F502ABA8AEEEBD8331B14A11200C06CEFB7BA928269B796034B0FC8B944B27FF000F15DE8A43C9AD4025299D5E162529513F4BBBD642AC6592CDB6B71A6A54C1026E2FD19AD4FE9D56EF35A945965D8DDA621FED4050052E66C78735ACD18C8EC9A3D0D1A2A1B3BD4F34B5BCA10E9114E98389E470D4FF00E47B1F402D3C157ADC184DC4D11B27E1289EBDE9A95790A51C2F23B1B79A020917BAE5776A73848E819A57822058E3777A12C6DA4081E68776F0320E1A9FA41C6193BECD61BD6E422644D1A69C1E605290A6D53DD14EC582B905A4C9521224524A4A6F522922B4B3B54EE99E4108D4C94B898ECD23C8CFF544090121713F036F227061F745B95C4087DD76EDA1FC5679B4929F45446DA8786A51E4BC5E51984B7EF8A8C0B0846F3A781F3489EBB4DE198A24320B3903483C8D4C2A4A7CCD00A4B060A597DE69CE00BDD97A839230195B07BA5199B32B5613E2D1531C9029E2FD2F31449AC5B8EF06C780A2C416363151862F7BB7933D9A8BE618658C8659D948A121381A28DBD9A3492C7BB254BBC94292C0466187B944DCA59CBFE7DA9A24FC6498A56248B9542F760F7A04762C3ACBA525502026850E3C127540D1A046D2B454B42CA124F6A72E4227A1C5044809A72C1ECDDF053088498961EF606AF050512C64795755CAEAFA0CB140488E89519BAED8014AE5DB0516E50404E66EA9146859863DCA9B889A276AD83EA92922BEBA4BDA1FEFF1C1A9B1F9B6190EEFDF54A42870B38AB1438400D8FE454E3B10FF009A619765E0DAC03C5EA43892D4AA039573DDAB53A1BA0B0E1603F9ACD1C4C659243819B76A8767DAA22904D9477D03BD04082D2C5F21158C6E001E16580F35255E63C4C7DC3429853B50503EC0FDD36AD1A0667B50146DEACA90E39068C0E7F143BF432DF3152AC253754FA8CA2CAA029E88A344D93D1160C837BBD0AE5E121981C4B0E4A5489372FB2682C64C80ABCB2D1328C00A7B21306CD1EC9A8EA60376EC163E569366ABDE4FE684245BF12BC8C9E32CFEAA0500B670450FA1405C987F403BD4CF6F28F7AFBF834EB02C03C9074791669747BC1CD8C5A934A7A8C5065C622F3E1838A8357E2C4BB1B183D02C2003EC99F32D12B97A62200EB6D2B548D8B7163DCADBD6912F183F15756FB8FC196AC3F11FCD4CAF49A52B50B97C96F04B436BFA8F698F913B560E6C31FDFA1A6AD7922786818BB16A38A686076D63E8AC2D08B30CA09EC4F9A9A7A427A30DBB0D1B85CC0C6C5DA684C5487C95939192811733667B73C52E6B2309E593B62AF84360DB27EF1587D473B2270C3367E28A13D80DA61FBC1AD1449DD2ED0DDF047750AEB8181B018EB1D5E854861441DA94CA50A46CAEAB513914657E8D0F531347030F63D80F3DE8503721835E7F9A70B66248EA27EA99413CACFD9F4A4461B3E832536A2B57F4A8242424AF03BFC6684A9180FE006EE5758F5C7E078E92244C952415959E636E392F4444491B2351565ECD31F559963FDE6823CB5310D61A3E830A3321D4BA4FF4AB81AD22063BEA2381DFF2BE99A5A88064DF8934DB21BEF460EA448D0346C1868D8B794F09FD534A825C81AFA04939A2ED9229CC98E0978A80023E023FBE87E6C7179CC09B6C05D5B06685426CEA4D34B57E252E63F717EE14980B7EB539375AF53A83177B1BF23C539F4991382F4C8109B710E07708F7A3F24F468BB065A6BC089D4C23915EC14B4BD09FCC0E497026CC51B17AB362717045F4A0BA5FB81446803032E45CB4719A26D2613D17789DCA38AC640334FB538887699CCB7744DA7D735353D66A7A26084F09FD531AADD9CC899795A9E93D0F68921BA65DBED404EAF3B86FF153577EECA2BBC1AFA08B60AD002EAB57153A1D4B7060B7EDB1320400401B1D00ACA5ED58A4175E8081873E89A9A9A9E934B53445424371CD397D2CD97B1113FF006A2D52499E215FBD3ACD030B14386DFBA72F7A9F4020196808A198B6F7247C73446CF80054F4BB44F801C3EEA232129773254FA96A6A6A6A6A66A5FC86214473E2D5282BA08B43367DEA76ABB504090CAB36C77A304BC800B021331AD16000384BE2EB1506C402D1D5E0BDF55A5BFA6226592C4C18FD79A8F63DE31876CBE881F77D885F74D25600BE1FD749A9A5A9E9353D27AAA8B716502437B53C09D614035DAA5D36095370388A8ACDD20E56C548A3D3591858C050002B042E9063B7AAEFA600C4998F8286E0083608A9A9A1658095E299DC9DDD894C4D1AF69FD7A67A4D4F49F464C0062F98A8FF00F9260110139B5A9AB865D03BAD74D0A5F6D3000272E5344461216360FF006DD1A9EB6AA660E40FE6B4A73D1254306F0B0D43C7824E1B25081958925CB7F57AADFA36E8DBD0E29E8B03DAA75809A7AFFFC40032110002010204030506070100000000000001020300110412213105104113202232510630618191B11433425271A1C1F0FFDA0008010201013F00EFA005803589B860B6D0578F61615918EED5D98EA4D1897D2961075B576D147A5C9FE2BF0F14BF966C7D0D4913466CC3BF0CFA76726DF6AC96391BA55CAEF57BED4C5635CEF52CEF2EFB7A72EC581006F5886CB1647376F711B67456EA34E445B514F1F6C997A8DB996CAAEE3A69EE625C91853B9D68024D853CF147A6E6BF1A4795451249B9E4CA5A3751BEFDC8E1793CA2861E34FCC6B9F8566897CA9F5AED97F60FA50923BDCA0A570FE2AC4C9D9A651B9FB7776371BD3AA3EAEBAFA8A38788ECD6FE452E16306E5AE29E62DE14D052F02E20D1F682136FEFE9BD302A72B6879E178370F970CA81487B0F17C48F4DADFE5710C2BA390775D0FCBBA401BB0AF07EE1F5A319B5C548731D36AF66E34476C532E62B602FEA7AFF005A50C5BE6BB6D5ED7080CC9227988D7E3E9586C0BCE331D05370A005D5B5AC171AEC90418AF091B1E84563F1D1CF8C695366FF0005AB130766732EC7BD86F046D27CAAE6B807168B02AE92FEAB7CAD53F1BC3019CBDCFC2833F13C419A4F28FF00AD4B6B694580DEA444986561714FC2A33E52453E0F247949B8A6194907BAFE18517E7CF0D8379CFA0F5A862585422D30B1AD0520B0D79620D909352E14C84BC66F7A65286CC2DDCC568557D0561F0B24E7C234F5A8387C716ADA9AB5B99B2EC285EDAF2750E0A9A9E37C2CA452BA4EB6715340D11D76E428C071188C9D2911635CAA34F738BC3ACE963B8A40639321A5716B30B8E51AE670B58440333F527DC13D2AF47515361927B31D0D4913466CDCA30C5C64DEB0CAC175A26DDEBD1366157E43734543687970CC383E33D7EDC9F6A1CAF57ABF26B11AD48E249028DA9E219C2AD5AC4D5F9605408C7CB93EC6877C69A8ACCD7CD7D79FFFC4002E110002010302040503040300000000000001020300041121311012204105223251811330610614A1F02391C1FFDA0008010301013F00EB3B559AA88F2A7535A5647B566813524EB1FA8D3DC17D947CD3C3247B8C8A041EB5668CF325238750EBDEB7E13CE53C89BD63B9DF81914024ED52B2BBE536FB168D82C9F3C6EA3E53F507CF1BB3A2A7BFD9B55CB17F8A670832D4F72EDE8D053176F5371BC182ADD04814B148FB0C50B53DDA85A2FB9A365ECD4A81005153BF3BE3B0E9650C30C29AD31E83FEE8C128ED9AFA721D31515BAC63277A6F17B20FF4CCA33FDEFB50C30C8A0280AB8F16BF8AE1A4E60533A2FE33EFEF48EAEA255F4B6A3E7A4DDA7615FBB5F6349728DA6683A8D0D78FB3CAAB6A8DCA18124FE0634FE75A6B28D63F2EFEF5FA4DE6681D24F483A7FDA9EF121381A9A5F12D7CCBA55F7833BC867B3F306DC7706BC3EC1E1B25824DC7F1939AD54F2B6FD5127D4900A118049AFD41E152DF9478775CFCE6A0F04BD7C465703F34B1A786DB8863DCFF00734C083AD04276A46784E41C1A5F1271B8CD49389FCD8C11435E9B25C966E33DD2423DCD4B2B4ADCCD564904CBCB268C28086DD73A0AB997EB4A5C708572401455A3D185039DBA2C47F8F353DC2423CDBD4D7D249A0D07428E6DCD1C674E0AECA722A1916E2306A7B4C6A9BD03D8EFC6398416C1BBD3B973CCDBFD9B59DA17C8DAB21D79854F6E24D46FC09C0CD5C31C2A7B0FB0077E0A706A19DE1381A8A8E5590647038C6B5211A0EF4064E051D3A95720D6382EAA281236E12363845EAA61AF1C56382120E94A9CA849DE94F9799AB3A0C7190F08877A7DFAF359D318E3FFD9, '', '2021-01-13 17:15:36', '', '2021-03-12 20:30:44', b'1'); +COMMIT; + -- ---------------------------- -- Table structure for inf_job -- ---------------------------- @@ -250,63 +201,12 @@ CREATE TABLE `inf_job_log` ( `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=52 DEFAULT CHARSET=utf8mb4 COMMENT='定时任务日志表'; +) ENGINE=InnoDB AUTO_INCREMENT=285 DEFAULT CHARSET=utf8mb4 COMMENT='定时任务日志表'; -- ---------------------------- -- Records of inf_job_log -- ---------------------------- BEGIN; -INSERT INTO `inf_job_log` VALUES (1, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-09 21:17:51', '2021-03-09 21:17:51', 61, 1, '移除在线会话数量为 0 个', NULL, '2021-03-09 21:17:51', NULL, '2021-03-09 21:17:51', b'0'); -INSERT INTO `inf_job_log` VALUES (2, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-09 21:18:00', '2021-03-09 21:18:00', 16, 1, '移除在线会话数量为 0 个', NULL, '2021-03-09 21:18:00', NULL, '2021-03-09 21:18:00', b'0'); -INSERT INTO `inf_job_log` VALUES (3, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-09 21:19:00', '2021-03-09 21:19:00', 10, 1, '移除在线会话数量为 0 个', NULL, '2021-03-09 21:19:00', NULL, '2021-03-09 21:19:00', b'0'); -INSERT INTO `inf_job_log` VALUES (4, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-09 21:20:00', '2021-03-09 21:20:00', 12, 1, '移除在线会话数量为 0 个', NULL, '2021-03-09 21:20:00', NULL, '2021-03-09 21:20:00', b'0'); -INSERT INTO `inf_job_log` VALUES (5, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-09 21:21:00', '2021-03-09 21:21:00', 7, 1, '移除在线会话数量为 0 个', NULL, '2021-03-09 21:21:00', NULL, '2021-03-09 21:21:00', b'0'); -INSERT INTO `inf_job_log` VALUES (6, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-09 21:22:00', '2021-03-09 21:22:00', 9, 1, '移除在线会话数量为 0 个', NULL, '2021-03-09 21:22:00', NULL, '2021-03-09 21:22:00', b'0'); -INSERT INTO `inf_job_log` VALUES (7, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-09 21:23:00', '2021-03-09 21:23:00', 10, 1, '移除在线会话数量为 0 个', NULL, '2021-03-09 21:23:00', NULL, '2021-03-09 21:23:00', b'0'); -INSERT INTO `inf_job_log` VALUES (8, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-09 21:24:00', '2021-03-09 21:24:00', 11, 1, '移除在线会话数量为 0 个', NULL, '2021-03-09 21:24:00', NULL, '2021-03-09 21:24:00', b'0'); -INSERT INTO `inf_job_log` VALUES (9, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-09 21:25:00', '2021-03-09 21:25:00', 7, 1, '移除在线会话数量为 0 个', NULL, '2021-03-09 21:25:00', NULL, '2021-03-09 21:25:00', b'0'); -INSERT INTO `inf_job_log` VALUES (10, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-09 21:26:00', '2021-03-09 21:26:00', 11, 1, '移除在线会话数量为 0 个', NULL, '2021-03-09 21:26:00', NULL, '2021-03-09 21:26:00', b'0'); -INSERT INTO `inf_job_log` VALUES (11, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-09 21:27:00', '2021-03-09 21:27:00', 12, 1, '移除在线会话数量为 0 个', NULL, '2021-03-09 21:27:00', NULL, '2021-03-09 21:27:00', b'0'); -INSERT INTO `inf_job_log` VALUES (12, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-09 21:28:00', '2021-03-09 21:28:00', 6, 1, '移除在线会话数量为 0 个', NULL, '2021-03-09 21:28:00', NULL, '2021-03-09 21:28:00', b'0'); -INSERT INTO `inf_job_log` VALUES (13, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-09 21:29:00', '2021-03-09 21:29:00', 9, 1, '移除在线会话数量为 0 个', NULL, '2021-03-09 21:29:00', NULL, '2021-03-09 21:29:00', b'0'); -INSERT INTO `inf_job_log` VALUES (14, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-09 21:30:00', '2021-03-09 21:30:00', 6, 1, '移除在线会话数量为 0 个', NULL, '2021-03-09 21:30:00', NULL, '2021-03-09 21:30:00', b'0'); -INSERT INTO `inf_job_log` VALUES (15, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-09 21:31:00', '2021-03-09 21:31:00', 7, 1, '移除在线会话数量为 0 个', NULL, '2021-03-09 21:31:00', NULL, '2021-03-09 21:31:00', b'0'); -INSERT INTO `inf_job_log` VALUES (16, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-09 21:32:00', '2021-03-09 21:32:00', 8, 1, '移除在线会话数量为 0 个', NULL, '2021-03-09 21:32:00', NULL, '2021-03-09 21:32:00', b'0'); -INSERT INTO `inf_job_log` VALUES (17, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-09 21:49:02', '2021-03-09 21:49:02', 87, 1, '移除在线会话数量为 0 个', NULL, '2021-03-09 21:49:02', NULL, '2021-03-09 21:49:02', b'0'); -INSERT INTO `inf_job_log` VALUES (18, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 00:55:34', '2021-03-10 00:55:34', 60, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 00:55:34', NULL, '2021-03-10 00:55:34', b'0'); -INSERT INTO `inf_job_log` VALUES (19, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 00:56:00', '2021-03-10 00:56:00', 16, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 00:56:00', NULL, '2021-03-10 00:56:00', b'0'); -INSERT INTO `inf_job_log` VALUES (20, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 00:57:00', '2021-03-10 00:57:00', 9, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 00:57:00', NULL, '2021-03-10 00:57:00', b'0'); -INSERT INTO `inf_job_log` VALUES (21, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 00:58:00', '2021-03-10 00:58:00', 17, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 00:58:00', NULL, '2021-03-10 00:58:00', b'0'); -INSERT INTO `inf_job_log` VALUES (22, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 00:59:00', '2021-03-10 00:59:00', 8, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 00:59:00', NULL, '2021-03-10 00:59:00', b'0'); -INSERT INTO `inf_job_log` VALUES (23, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:00:00', '2021-03-10 01:00:00', 10, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:00:00', NULL, '2021-03-10 01:00:00', b'0'); -INSERT INTO `inf_job_log` VALUES (24, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:01:00', '2021-03-10 01:01:00', 8, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:01:00', NULL, '2021-03-10 01:01:00', b'0'); -INSERT INTO `inf_job_log` VALUES (25, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:02:00', '2021-03-10 01:02:00', 9, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:02:00', NULL, '2021-03-10 01:02:00', b'0'); -INSERT INTO `inf_job_log` VALUES (26, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:03:00', '2021-03-10 01:03:00', 7, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:03:00', NULL, '2021-03-10 01:03:00', b'0'); -INSERT INTO `inf_job_log` VALUES (27, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:04:00', '2021-03-10 01:04:00', 8, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:04:00', NULL, '2021-03-10 01:04:00', b'0'); -INSERT INTO `inf_job_log` VALUES (28, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:05:00', '2021-03-10 01:05:00', 16, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:05:00', NULL, '2021-03-10 01:05:00', b'0'); -INSERT INTO `inf_job_log` VALUES (29, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:06:00', '2021-03-10 01:06:00', 15, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:06:00', NULL, '2021-03-10 01:06:00', b'0'); -INSERT INTO `inf_job_log` VALUES (30, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:07:00', '2021-03-10 01:07:00', 7, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:07:00', NULL, '2021-03-10 01:07:00', b'0'); -INSERT INTO `inf_job_log` VALUES (31, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:08:00', '2021-03-10 01:08:00', 7, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:08:00', NULL, '2021-03-10 01:08:00', b'0'); -INSERT INTO `inf_job_log` VALUES (32, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:09:00', '2021-03-10 01:09:00', 8, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:09:00', NULL, '2021-03-10 01:09:00', b'0'); -INSERT INTO `inf_job_log` VALUES (33, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:10:00', '2021-03-10 01:10:00', 16, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:10:00', NULL, '2021-03-10 01:10:00', b'0'); -INSERT INTO `inf_job_log` VALUES (34, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:11:00', '2021-03-10 01:11:00', 7, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:11:00', NULL, '2021-03-10 01:11:00', b'0'); -INSERT INTO `inf_job_log` VALUES (35, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:12:00', '2021-03-10 01:12:00', 7, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:12:00', NULL, '2021-03-10 01:12:00', b'0'); -INSERT INTO `inf_job_log` VALUES (36, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:13:00', '2021-03-10 01:13:00', 8, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:13:00', NULL, '2021-03-10 01:13:00', b'0'); -INSERT INTO `inf_job_log` VALUES (37, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:14:00', '2021-03-10 01:14:00', 6, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:14:00', NULL, '2021-03-10 01:14:00', b'0'); -INSERT INTO `inf_job_log` VALUES (38, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:15:00', '2021-03-10 01:15:00', 5, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:15:00', NULL, '2021-03-10 01:15:00', b'0'); -INSERT INTO `inf_job_log` VALUES (39, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:16:00', '2021-03-10 01:16:00', 8, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:16:00', NULL, '2021-03-10 01:16:00', b'0'); -INSERT INTO `inf_job_log` VALUES (40, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:17:00', '2021-03-10 01:17:00', 9, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:17:00', NULL, '2021-03-10 01:17:00', b'0'); -INSERT INTO `inf_job_log` VALUES (41, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:18:00', '2021-03-10 01:18:00', 6, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:18:00', NULL, '2021-03-10 01:18:00', b'0'); -INSERT INTO `inf_job_log` VALUES (42, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:19:00', '2021-03-10 01:19:00', 6, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:19:00', NULL, '2021-03-10 01:19:00', b'0'); -INSERT INTO `inf_job_log` VALUES (43, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:20:00', '2021-03-10 01:20:00', 7, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:20:00', NULL, '2021-03-10 01:20:00', b'0'); -INSERT INTO `inf_job_log` VALUES (44, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:21:00', '2021-03-10 01:21:00', 5, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:21:00', NULL, '2021-03-10 01:21:00', b'0'); -INSERT INTO `inf_job_log` VALUES (45, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:23:09', '2021-03-10 01:23:09', 60, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:23:09', NULL, '2021-03-10 01:23:09', b'0'); -INSERT INTO `inf_job_log` VALUES (46, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:25:41', '2021-03-10 01:25:41', 92, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:25:41', NULL, '2021-03-10 01:25:41', b'0'); -INSERT INTO `inf_job_log` VALUES (47, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:26:00', '2021-03-10 01:26:00', 10, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:26:00', NULL, '2021-03-10 01:26:00', b'0'); -INSERT INTO `inf_job_log` VALUES (48, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:27:42', '2021-03-10 01:27:42', 61, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:27:42', NULL, '2021-03-10 01:27:42', b'0'); -INSERT INTO `inf_job_log` VALUES (49, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:28:00', '2021-03-10 01:28:00', 14, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:28:00', NULL, '2021-03-10 01:28:00', b'0'); -INSERT INTO `inf_job_log` VALUES (50, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:29:00', '2021-03-10 01:29:00', 8, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:29:00', NULL, '2021-03-10 01:29:00', b'0'); -INSERT INTO `inf_job_log` VALUES (51, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-10 01:30:00', '2021-03-10 01:30:00', 8, 1, '移除在线会话数量为 0 个', NULL, '2021-03-10 01:30:00', NULL, '2021-03-10 01:30:00', b'0'); COMMIT; -- ---------------------------- @@ -468,28 +368,6 @@ INSERT INTO `sys_dict_type` VALUES (109, '用户类型', 'user_type', 0, NULL, ' INSERT INTO `sys_dict_type` VALUES (110, 'API 异常数据的处理状态', 'inf_api_error_log_process_status', 0, NULL, '', '2021-02-26 07:07:01', '', '2021-02-26 07:07:01', b'0'); COMMIT; --- ---------------------------- --- Table structure for sys_file --- ---------------------------- -DROP TABLE IF EXISTS `sys_file`; -CREATE TABLE `sys_file` ( - `id` varchar(188) NOT NULL COMMENT '文件路径', - `content` blob NOT NULL COMMENT '文件内容', - `creator` varchar(64) DEFAULT '' COMMENT '创建者', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `updater` varchar(64) DEFAULT '' COMMENT '更新者', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', - PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='文件表\n'; - --- ---------------------------- --- Records of sys_file --- ---------------------------- -BEGIN; -INSERT INTO `sys_file` VALUES ('add5ec1891a7d97d2cc1d60847e16294.jpg', 0xFFD8FFE000104A46494600010101006400640000FFDB00840006040506050406060506070706080A100A0A09090A140E0F0C1017141818171416161A1D251F1A1B231C1616202C20232627292A29191F2D302D283025282928010707070A080A130A0A13281A161A2828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828FFC200110800EC00EC03012200021101031101FFC4001C0001000105010100000000000000000000000701020405060308FFDA0008010100000000FA14000707A3E3F659B5F2B3CB1B171B57BAFA2C000BE1ED8731AFC752DF3F2F2EF249DF79D0000A465CD59E5ACA5BE7B09BB71441BBB943DC0017447C95DB0D662E4FD0192237F3E17E8600039B8AF556E579647D0B60807A3DA49368003D7E7AC1A5B678CA3255081A4AEBC0007AFCF5834C6E8BA3DDF756902CE39200034908796C661E82C04073E003D755A4B2FC9F48A34CFA172404152C6F415C4E175B9BB879F8EAB41CEF792A807CF1B1903B7BADA5DC0737D47ADCB3CFCBCE3FD2CCBDB807CE35CAF5E8B3F0757D0FBF1BE7DD655B65965BF384B9397B80F9C6A2EDAF577F05A0F3D9499958BACF4E7F41D0654E168118657B59A8E2E43DD71B31FC73ED26EE33FB0E939E8FB135FEFBA9528007159783CAD981B8C5DDC9596A5231D6E17173476200BE26D8351AFCEB33FBED077DABE2FCFB6DB59CE463365A018B156E4A3CB7DDBC65CDE3EDF71259C945B3D7900725CFFB554C0EA3B769E32BEC92F794A4711EEE3BDEBAC0380C657CB7FD6E50F3D4E266EE0C2E2F9DE73CA6FD90237B7CB7FDB5F554B6911C8BB8A948CB039CE5E79E94230B3B6E98A82945453C225BB87D44E3DA158BB77DF56A00A1452DE6A2DB397D6FD5C562696B215002DAE1E4D29CCF8471C9DBF4E9EB03CF952A028A539DE8296E1C7DD3C2DABFA80BA3690760A5C28514A626A37F4A523DC2D7E9A772B1CC9B7733B2DA2828A2DB628EAFABA523DD1D29302BC6767EE88E46DB1414A29486A1A9CF8E99E2BD91303CF98ECE8897A9EC5428A294A70B04E5E279751D613038FECBD5485BA5911428A514530780D5E9B7B62930B93ED2D6A222EA64A28A514514ADB444FE56D7FFC4001B01000105010100000000000000000000000001020304050607FFDA0008010210000000F3600075E70AD558EA46005B9DCE33E1B7367000694AC32CD3CC00034E58A1A69A59A125A512766681ACD81C9A194D4F44E2B280D94750E8BD1383E7AE6F60E4D500BB0F4BB3CCEBAC540E7500BD5CB7D135B33E0E769342FA6DDE51AAADE56CD084D7DE780014F9CBF8EFEA2E800346D4CDC87F57654104628C38ED9DE6B841064EB5978DEAAEB155104115A7FFC4001A010002030101000000000000000000000000040102030506FFDA0008010310000000EB00043FBC939A35CE4003A76164A7AFC9800061CB22B8CAC0006EDA78C4B0B845F5B8C23981D3533A3CA742D7F0DDCD006A346783E07D9FA05BCFF7A92016EAF9EE0FABE6CE8DD4901AE84ADC1E8F5BCDE0CEC483FA72520BD62DE8D54E46B8F500019F429A318AC001259BEAF3215C8009BC1B5F4C55D2B5924B9560D55CB5AD2490B4EB3FFFC400451000010302020604090A050403010000000102030400110512061321314151203261711014222330425281D11524333440537291A1B116436292C16382E1F0357383A2FFDA0008010100013F01F4FC6B4931051908C2222ACB706690B1EAA397BE9E719811335B2B68D800AF9C4D735CB6D6A56E48036229BC3DF575B223BCDE861A84ED71E3F95AB53091D672FF00EEA270F1EA66FCE8C8863AB187F68A335A1D58C8FD2953F932DD2A628FF2DAFEDA3249FE5B5FD94F2D9BF94D3415FD236D4518C6ABE66D627A9E194AADF6047585622C3B866352E54C49533297E43C3684F61E54E105ACC946B788038D09B2E495063220A77802EAFD696EBF721C79DBF2BDABBC93DFD0346AF750424152D5B9291727DD587E8ACA9090B9EE888DFDDA76AFE02B0FC270FC3BEAB1939FEF17E52BF3AD62A9195C405B4B4B883B8A4DFEC0B4A1D694D3C80B6D42C526B12C39583FCE226672028F96DEF2DF68ECAC4594AB24A64EC3B7327876D22521D4E5988CDFEA246DA7A294A758C9D635CC784D1AC330F918A492D46B04A7E91D3B91F13D9585619170A6B2C74E678F59E575954493BFC3F25BB11CD6E1129C8CBF66FE49A8BA55221B89631D8BB0EC0F37C6A2BEC4C643B0DD4BAD9E47D38B1052B014856C20D488BF26622B84ADB11F1999278734D3CD969D520F034CBCB65576D56A25895BECCBDCFD534F34B65595C16FF346A0C473109CDC465594A815297ECA79D448CCC18A88D15395B4FEA799E88A75B43AD943A90B41DE0D3C1FD1F9499905CB344D8A4EEEEA0A0E34DB805B3A42BD3E92C432F075A9B1E7E3F9D47BAA7283A961F4FF00311E14485253915671BF655FE3952D0082B64E64F11C53DF583CD187630C495FD09F34E7603C6962C766E3D1462130904EA7F0E534EBB20A9A8F159D74B705F28DC91CCD46D185BEE25EC6A46B2DB7528DD4A3BAC2C06C03D3B7B4E53B8EC34B4EA98531F72FAD1E1357208209046E229C3981CC37EF238FBAB43315D73670D92BBBAD8BB2A3EB2797BBA3872017F32BAA819AB4559221393DC1E7652AE3B10370FB0B5D7152961C7A42C6E72438A1DD7B785C7128EB1DBC071350B02C5268CC969319BF69EDE7DD4DE8728FD63123DCDA2B0DD178906735284A7DC5B66E01B513737E824EAF0A98E0DE465FFBF9D436F5387C4680B656923F4FB0E3738C083E6B6CA7CEAD94F6F3F752C25166D06E940CA0F3EDF061B02462920B516C9423E91E56E4F6769AC2F0785860BB2DEB1FE2F39B5468A89DFD37ADF213DF8BFC8A1B59688DD907A20835227C18BF5898CA7B335E97A478524D92EBAE7E06C9AFE228C7A90A72FF00F9D0C7D9E302701FFAFF00E6938EE1C4F9C53CCF6BAD102A563586C58FAE3290E83D54B67328FBAA6CE7A64A54A90323A5391B6FEE91F13E04A1C79C6D9605DD7559103B6A2456A0446E2C74D9081B7B4F3F43193AF852637150B8AD1E942760CC281BB8D8D5AC768E9EFA992A3416F3CC7D0D0E00EF34EE9148977460F12C3EF9EDD4A87325FF00E47107560FA8DEC151F0B84C7518413CD5B68009EA803BA8D1A34F448EEAB32DA467F680B1FCEA4E1EA4254A64A9CE394EFF00CE92A0ADDDC472AD098E97A5CA9AB17D479A6FBCEF3E899714D38168DE2A338E33255270D7FC5DF59BADA5F51CA87A48CA9496B1465511FF006BD4FCE9BCAEA02D95A5C41E2937ACA7978522FDD5896901538A8B82A75AE8EB3C7AA9A630B0A735F3DC5497CEF2ADD49B0161B055EAF57A2689A346A7E30F78C29A8694D926C5445EF4EC85BEE053A84B723DB1D55F61F8D684048C04A13F4A1D59713C526FC7DDE910FAC2321F2DBF655B4530A61B5E646BE3AB9B2E5A9B9F3B66A31726DC1D40AF95B1C693B04391EEB1A5693632D9F3986B67B81A7B1BC5719CD0C3488ADFF3549BEEE550E3B71590DB42C07EB4FBEDC76CB8F2825239D3FA43B7E6D1CA87359B531A4842AD263651CD06A3496A4B41C616149357ABD5E8D71AC230886BD1790EBA91AE5A5C257C516BD4194BF18650B480D1010A17BDCF3A8921FC2DC131ABAB56723E8FBC4703DF51A435362B72A32B332E0B8F4C1453D524771A87AE7DD09D6B9946D3B69B425B4E540B0A52821254A3648173498F37185AA42595AA3A4F93C8549929662BEEB2DA17A95645051B1BD61AFB38A5D011AB780BE5E75143D86C82E37D5F593ED0A8B25B94C875955D06AF4FBEDB29CCF3894279A8D7CA71782D44730DAAD45F4C98EE884F20B994E5B1DC6B0275E6D9721C8D6A2DD64AB7281A7F4714257993E689BDEFBAA4C96A2CA4B6F1F36F2721ECEDAD1F9FF22622B8EF9F993EADBFD0AE7DD446E236A4EE3E813A1E7F9B89AFFDA9A4E8743DBAD99257EFB57F0861BF7D27FBA95A1F879EA48909F7D3FA21251730A685F24AC5AA6C79B86AAD3D8213EDA77560907E6F9DCD855B4FC29C8A35B649B0B5EB1D516F0C91CFABFAD600DB4CE09112DDB206C7FCD692869CD209EB67E8CBA77568FB4E7CA91CB69E3B7BAB1646469C58DA40D82B0D8A21450D5EEAEB28F6D3697E63C598405D3F48EABAADFC4F6541C1A24539D49D7C8E2EBBB4FBB97827E0F0A68BADA0DBBC1D6FC950AC423488032CE0A7A2DFC99281B53F8870EFAF9D048CA10F208D8A0ACA4D3985096A0E4C514AF8250760158AC44B91EE91D5163DD5A218C2B38C3272AE7F92BE7D94458FA4D2D7C96A261C9EB495E65F6213B6A23EDA59B28D88A724A8BAA523603B2B1B19B0C7EE6DB2FF00AD6172DF430194B8AD572A95804790F1790ACAA3BC54382C4004A7CA739D7D6E50B6D69A55D479AB9504392A408B1CD96A175AFEED3CFBF95458EDC5610CB09CADA770E8101408201076106BE4A5AF5AF610E06D21C524B0EED4120F03C29D5CA8DF5D82FB607AEDF9C4FE95F29C4E2EE5FC4922B15318A82E3C8403BD3955B8D68962C716C36CF2AF299D8AED1CFD1A05D429D77C771D9926F76DAF30DFBB7F87158AA99096CA1412A36DF50E0C88EC84A9E43847022DFAD66929D81827B42C56A243E7CFA836DF241BA8FBE965319901A6EFEAA109F589DC2B0F8660425EE724AAEB591EB2B977560788B8E4F991E5150505272E6EEF04B9CC450758BF2BD91BE9CD296028846AFF00326938FC89CBD461CC05BCA1D6DB64F693585C4F1282DB19B3A86D52B9A8ED27C0A48575803DE2B178EC2602C865B06E3720560EB30B4B5ACBB1124588A56C51F4531EF168129FE2DB648EFAC211920357DEBF2CFBFA4EB8865B52DD504A06F26B0684B71D4CD94828007996D5BC7F51EDF0694C53E3D16446506DE5052566DB176B581AF18C4BAB9503B75A6D5E28EBC6F31DCC9FBB46C1EFA4B6848B252903BAB01467C656B4F55A672ABBC9D9FB7431F72CDB4D73398D48F271BC29437EB2DFA8A77AE7D1697B9ABD1E75237BAA08A69391B4279003A3E3216EEA6321521EF61BDB6EF3C2B0DC1D7AE4C9C4B22DC4ED6D94ED4B7DBDA7C38AC3F1D8A50956475273215C8FC29D73C5DCD5CB4961CE4BDC7B8F1AD6200B95A2DCEF4D2D7255921365F5F31D51DE6B08802045C8559DD51CCE2FDA3D0C614A54F702BD5D83BAB16D6F8E40547FA54AC94F7D31A4B8CC43F3D8A1F6C6F396C7F31585E9161D889080B2C3E7D473E34A491DDE834CCDD186B1EDBD7E83257254530DB2F91BC8D891DEAA6B020ED8CF794E7FA4DF928F89A8EC351DB0DB0DA1B40F5522DD15A12E272B894A93C942E2BE4A819F3F8947CDCF2548C4998A754CB79B2F04EC02B0F9C8999C25252A45B37BFA12633525367537E4788A9FA3C1E19DA78EB1BBA9A047ADC298703CD058D97DE391E22B11C2DB76EB69365F2158563B3B082942FE710C6F4AB78EEAC33108B8AC7D7435DFDA41DE9E9E949CD8E618DFB282AB781D73265012A5AD46C94245CA8F6544C194F0CF89916E11D0760FC478FED484A5080942425237002C07A03B8D390714724A9866304241B78C38AF27BC0E3585406F0F881A412B513996E1DEB573E963917C46619681F357CD9DFE85FB5DC68D6251B617503F10A61C7F0F9224C0564706F1C0D6038DC7C659B27CDCA48F2DB3FB8ECE96909CDA551C704B17FDE9E73568D892B59395284EF51E558461BE2BE7E45973163CA57040F653FF0076FD89E6D0F34B6DD48536B16524F115219561B24457AFA93B1874FAC3D93DB46A5B3A978A7D5DE2BCE30FA64C45143E837045617A510254342E63896246E5A4F3ECE871AC636E972FFA628FDEB47E3090F2A7AF6A5376D81FBABFC7D931D85F2843530DB812F6F483B95DE3FCD403250B5C793B54DEC39B62D3D879F7D62A9F36857236F03B192B5E6B91D01BEB1F51563D2D2D6C756866324F6AAFF1A8ECA23B0DB2D0B21B4848FB03EFA59C80DCAD672A1237A8F431E694A845F66FAE8FE705B88E229C8AC6330997C9C8FDBC9751BD3F11D958C3722235AB9A80368CAEA7A8BF81ECE937D7AC3E5993A62DBE47997242F2F7E5B0FB0E1C7C664489AADC545A67B1037FE67A12D84C98EB6944A42B883623B6B47642E015E1F33638855BE07B8D62AB4BF065B4B48394849078D4A82B601531771AF638A7BB9D254142E9DA3A093635A4C9660CEC15D650869297944D85870BD4394DCC6CB8C056AAF64AC8B05768ECF4F2DCD54579C1BD0852BF4AC0148560B0CB7BB563F3E3D1D286836F44969EB156A17DA0EEFD69C92A5EB2FEBA520F78F03F874779C2B505051DF9556E86C00A9442509DA49E1410349E787568B6131890DF02F2B9F750000000B01E0C6F11F1169B4A7E95D5048ECEDAC35F5488895B9D6DA0FA4202810ADA0EC35A3B3061932561524D834B3AB27D9E0698D21C35F9DE2AD48BBB7CA0DBC951E40F434CDDB4161A1D653A93D2DE6B1B5AF11949C1A2A8A507CA94E0E09F6477D30CB71D9432CA421B40CA948E1E1D28CCAC563A6FB3589FDAF58565F106B29BECDBDFE974FE225296662363AA56AC914127665D878562DA4AE468AD371D00CB50DAB56D48EDA81A5188C792954B73C618BF969290081D94FE2D15A4660E67BEEB7C6B1A7D53A6C7521C4E6CF982378B749D7931A3BD217D56D2555A2ED2BC4972DEFA696B2E13D9C3A1A48ABCC2AF61D47C2B00776BAD1FC43D2E99435CBC1EED0BAD956B2DD9C6A1B49912DA6F7A6F750ECA95152C4D534D9590948B85F0A71BF20D3816E93AE56729397B36568FA72B4FEC1B17BFDDD2D2E51F929A8E8DF25E4B74CB619690DA3AA80123C24D85CEE158A2F5ADBCBE6ACDFF00EAB0755B104F6823D32224742CAD11D94ACF108158E600FC99CB950D6DDDCB67439B368E37A8BA332B5A15296C8037041BFBEBF86B1242F54DA1A5206E74AF7FBABC45386B288F9B3BBD65ABB4F4B1FDB3B0349DC645FA18B2CA2039978ECAC4C5E0BBB48D97D9583FD7D9FF00BC3EC4EAD4E3AA5ACDD4A37E87FFC40029100100010303030402030101000000000001110021314151611071812091A1B130C1D1E1F0F140FFDA0008010100013F10FCE0B032D36BD74B69C8F6137A56A00C92E87777A82C152709D05827769D2D7B9F63F9A46C9B00FBB58E2CDE53EC547DD0BE1FDB41C2099E4F34E5A46241F4524D856723E655FC52A491A36144F10CD40C4961A5C0BFF8103389AB0DE8E169ED3DA981205B99E90B6F348CE90978FE14B61C15F4914ABF205FBE8D3D0A94B3D0E3F81769770BD97397E02682183E43CB1E2294727B5459448C1F25223088FE782179644A756382AA57C9FE734AE1D0F0A701E6841A16200E50FD7B5470BDCBE9DFD05429E19C96DC9A7BA2ACC52D45BBE8705A90953D65F35AD3FEB99A590583939461F10F15A997264EE64F3F9E17411A4473255DDB9BE3538D3C6F578EB43B9A352612C991EE56128D1979DAA72568E4EC7A0FF3C04C5986AE87347DCF7BCBAC9AAEAFA548290C636AC7B65C8D3BACB3232B35930F151AC466D20FEFF3CC91C50966E4F24FB563C096344FFBF1D1A6C29CB58E56553F01BAFC6DB92D589215DF9F161A0910DE1309E91A4CDA29F33334A674442CB680DA8854C0743C2EDBC7BD0282100D0FCE0719341D4A99198FBCDA64FBA69E8D4598425190EC4041DDA3C5B82951A60E51DDAA3E3B52228E4F427CED4F18FF0071508A74B9647DCD673FF804D4A38B5059803F0D34D47E461BF60AD946AA06E1BD452466E708EEBFAAB2938A163582A6777A1B4417B4508404404130FF00C248277E82EF8177C57B207167C957A5BF1A24CFA0F83DE8309CD60E1D0E0A6EEF1EB825B909A199214F63F0E714B2520DDA2A51BE056E096A589D2F5DAD52A33D0919F769379F44C1EF4895CE0F71A1286E36727605FDE2A69EC7647BB3F36C7484A6721AF6095ED45888919D64EAADFF0009631BDD8FE42B946162DDFC47AC15012D0471C8F60CBE29652EC840344313C2BDAA752C85BC7FE2A0133A73F9A3E01C400FAA4EEFBD2A6A65A33146488BB82F4E5E9BB25DB53DE895948C8215B268D0F0109B429EF441E5A5555CBF85500DEC3C539B9C696FD37699342E895CEC3DCE6A18E24207DA93D5489913A5DE017574A0FEA8371DB47BE3BD33BB64287CE7EB8A02103004051428F502ABA8AEEEBD8331B14A11200C06CEFB7BA928269B796034B0FC8B944B27FF000F15DE8A43C9AD4025299D5E162529513F4BBBD642AC6592CDB6B71A6A54C1026E2FD19AD4FE9D56EF35A945965D8DDA621FED4050052E66C78735ACD18C8EC9A3D0D1A2A1B3BD4F34B5BCA10E9114E98389E470D4FF00E47B1F402D3C157ADC184DC4D11B27E1289EBDE9A95790A51C2F23B1B79A020917BAE5776A73848E819A57822058E3777A12C6DA4081E68776F0320E1A9FA41C6193BECD61BD6E422644D1A69C1E605290A6D53DD14EC582B905A4C9521224524A4A6F522922B4B3B54EE99E4108D4C94B898ECD23C8CFF544090121713F036F227061F745B95C4087DD76EDA1FC5679B4929F45446DA8786A51E4BC5E51984B7EF8A8C0B0846F3A781F3489EBB4DE198A24320B3903483C8D4C2A4A7CCD00A4B060A597DE69CE00BDD97A839230195B07BA5199B32B5613E2D1531C9029E2FD2F31449AC5B8EF06C780A2C416363151862F7BB7933D9A8BE618658C8659D948A121381A28DBD9A3492C7BB254BBC94292C0466187B944DCA59CBFE7DA9A24FC6498A56248B9542F760F7A04762C3ACBA525502026850E3C127540D1A046D2B454B42CA124F6A72E4227A1C5044809A72C1ECDDF053088498961EF606AF050512C64795755CAEAFA0CB140488E89519BAED8014AE5DB0516E50404E66EA9146859863DCA9B889A276AD83EA92922BEBA4BDA1FEFF1C1A9B1F9B6190EEFDF54A42870B38AB1438400D8FE454E3B10FF009A619765E0DAC03C5EA43892D4AA039573DDAB53A1BA0B0E1603F9ACD1C4C659243819B76A8767DAA22904D9477D03BD04082D2C5F21158C6E001E16580F35255E63C4C7DC3429853B50503EC0FDD36AD1A0667B50146DEACA90E39068C0E7F143BF432DF3152AC253754FA8CA2CAA029E88A344D93D1160C837BBD0AE5E121981C4B0E4A5489372FB2682C64C80ABCB2D1328C00A7B21306CD1EC9A8EA60376EC163E569366ABDE4FE684245BF12BC8C9E32CFEAA0500B670450FA1405C987F403BD4CF6F28F7AFBF834EB02C03C9074791669747BC1CD8C5A934A7A8C5065C622F3E1838A8357E2C4BB1B183D02C2003EC99F32D12B97A62200EB6D2B548D8B7163DCADBD6912F183F15756FB8FC196AC3F11FCD4CAF49A52B50B97C96F04B436BFA8F698F913B560E6C31FDFA1A6AD7922786818BB16A38A686076D63E8AC2D08B30CA09EC4F9A9A7A427A30DBB0D1B85CC0C6C5DA684C5487C95939192811733667B73C52E6B2309E593B62AF84360DB27EF1587D473B2270C3367E28A13D80DA61FBC1AD1449DD2ED0DDF047750AEB8181B018EB1D5E854861441DA94CA50A46CAEAB513914657E8D0F531347030F63D80F3DE8503721835E7F9A70B66248EA27EA99413CACFD9F4A4461B3E832536A2B57F4A8242424AF03BFC6684A9180FE006EE5758F5C7E078E92244C952415959E636E392F4444491B2351565ECD31F559963FDE6823CB5310D61A3E830A3321D4BA4FF4AB81AD22063BEA2381DFF2BE99A5A88064DF8934DB21BEF460EA448D0346C1868D8B794F09FD534A825C81AFA04939A2ED9229CC98E0978A80023E023FBE87E6C7179CC09B6C05D5B06685426CEA4D34B57E252E63F717EE14980B7EB539375AF53A83177B1BF23C539F4991382F4C8109B710E07708F7A3F24F468BB065A6BC089D4C23915EC14B4BD09FCC0E497026CC51B17AB362717045F4A0BA5FB81446803032E45CB4719A26D2613D17789DCA38AC640334FB538887699CCB7744DA7D735353D66A7A26084F09FD531AADD9CC899795A9E93D0F68921BA65DBED404EAF3B86FF153577EECA2BBC1AFA08B60AD002EAB57153A1D4B7060B7EDB1320400401B1D00ACA5ED58A4175E8081873E89A9A9A9E934B53445424371CD397D2CD97B1113FF006A2D52499E215FBD3ACD030B14386DFBA72F7A9F4020196808A198B6F7247C73446CF80054F4BB44F801C3EEA232129773254FA96A6A6A6A6A66A5FC86214473E2D5282BA08B43367DEA76ABB504090CAB36C77A304BC800B021331AD16000384BE2EB1506C402D1D5E0BDF55A5BFA6226592C4C18FD79A8F63DE31876CBE881F77D885F74D25600BE1FD749A9A5A9E9353D27AAA8B716502437B53C09D614035DAA5D36095370388A8ACDD20E56C548A3D3591858C050002B042E9063B7AAEFA600C4998F8286E0083608A9A9A1658095E299DC9DDD894C4D1AF69FD7A67A4D4F49F464C0062F98A8FF00F9260110139B5A9AB865D03BAD74D0A5F6D3000272E5344461216360FF006DD1A9EB6AA660E40FE6B4A73D1254306F0B0D43C7824E1B25081958925CB7F57AADFA36E8DBD0E29E8B03DAA75809A7AFFFC40032110002010204030506070100000000000001020300110412213105104113202232510630618191B11433425271A1C1F0FFDA0008010201013F00EFA005803589B860B6D0578F61615918EED5D98EA4D1897D2961075B576D147A5C9FE2BF0F14BF966C7D0D4913466CC3BF0CFA76726DF6AC96391BA55CAEF57BED4C5635CEF52CEF2EFB7A72EC581006F5886CB1647376F711B67456EA34E445B514F1F6C997A8DB996CAAEE3A69EE625C91853B9D68024D853CF147A6E6BF1A4795451249B9E4CA5A3751BEFDC8E1793CA2861E34FCC6B9F8566897CA9F5AED97F60FA50923BDCA0A570FE2AC4C9D9A651B9FB7776371BD3AA3EAEBAFA8A38788ECD6FE452E16306E5AE29E62DE14D052F02E20D1F682136FEFE9BD302A72B6879E178370F970CA81487B0F17C48F4DADFE5710C2BA390775D0FCBBA401BB0AF07EE1F5A319B5C548731D36AF66E34476C532E62B602FEA7AFF005A50C5BE6BB6D5ED7080CC9227988D7E3E9586C0BCE331D05370A005D5B5AC171AEC90418AF091B1E84563F1D1CF8C695366FF0005AB130766732EC7BD86F046D27CAAE6B807168B02AE92FEAB7CAD53F1BC3019CBDCFC2833F13C419A4F28FF00AD4B6B694580DEA444986561714FC2A33E52453E0F247949B8A6194907BAFE18517E7CF0D8379CFA0F5A862585422D30B1AD0520B0D79620D909352E14C84BC66F7A65286CC2DDCC568557D0561F0B24E7C234F5A8387C716ADA9AB5B99B2EC285EDAF2750E0A9A9E37C2CA452BA4EB6715340D11D76E428C071188C9D2911635CAA34F738BC3ACE963B8A40639321A5716B30B8E51AE670B58440333F527DC13D2AF47515361927B31D0D4913466CDCA30C5C64DEB0CAC175A26DDEBD1366157E43734543687970CC383E33D7EDC9F6A1CAF57ABF26B11AD48E249028DA9E219C2AD5AC4D5F9605408C7CB93EC6877C69A8ACCD7CD7D79FFFC4002E110002010302040503040300000000000001020300041121311012204105223251811330610614A1F02391C1FFDA0008010301013F00EB3B559AA88F2A7535A5647B566813524EB1FA8D3DC17D947CD3C3247B8C8A041EB5668CF325238750EBDEB7E13CE53C89BD63B9DF81914024ED52B2BBE536FB168D82C9F3C6EA3E53F507CF1BB3A2A7BFD9B55CB17F8A670832D4F72EDE8D053176F5371BC182ADD04814B148FB0C50B53DDA85A2FB9A365ECD4A81005153BF3BE3B0E9650C30C29AD31E83FEE8C128ED9AFA721D31515BAC63277A6F17B20FF4CCA33FDEFB50C30C8A0280AB8F16BF8AE1A4E60533A2FE33EFEF48EAEA255F4B6A3E7A4DDA7615FBB5F6349728DA6683A8D0D78FB3CAAB6A8DCA18124FE0634FE75A6B28D63F2EFEF5FA4DE6681D24F483A7FDA9EF121381A9A5F12D7CCBA55F7833BC867B3F306DC7706BC3EC1E1B25824DC7F1939AD54F2B6FD5127D4900A118049AFD41E152DF9478775CFCE6A0F04BD7C465703F34B1A786DB8863DCFF00734C083AD04276A46784E41C1A5F1271B8CD49389FCD8C11435E9B25C966E33DD2423DCD4B2B4ADCCD564904CBCB268C28086DD73A0AB997EB4A5C708572401455A3D185039DBA2C47F8F353DC2423CDBD4D7D249A0D07428E6DCD1C674E0AECA722A1916E2306A7B4C6A9BD03D8EFC6398416C1BBD3B973CCDBFD9B59DA17C8DAB21D79854F6E24D46FC09C0CD5C31C2A7B0FB0077E0A706A19DE1381A8A8E5590647038C6B5211A0EF4064E051D3A95720D6382EAA281236E12363845EAA61AF1C56382120E94A9CA849DE94F9799AB3A0C7190F08877A7DFAF359D318E3FFD9, '', '2021-01-13 17:15:36', '', '2021-01-13 17:15:36', b'0'); -COMMIT; - -- ---------------------------- -- Table structure for sys_login_log -- ---------------------------- @@ -508,14 +386,12 @@ CREATE TABLE `sys_login_log` ( `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COMMENT='系统访问记录'; +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COMMENT='系统访问记录'; -- ---------------------------- -- Records of sys_login_log -- ---------------------------- BEGIN; -INSERT INTO `sys_login_log` VALUES (1, 100, '4143cdab-ff1d-46ec-8333-bc48483c4c4b', 'admin', 30, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', NULL, '2021-03-10 01:11:53', NULL, '2021-03-10 01:11:53', b'0'); -INSERT INTO `sys_login_log` VALUES (2, 100, '783e9c51-4a58-46aa-85f1-66cac5512465', 'admin', 0, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', NULL, '2021-03-10 01:11:53', NULL, '2021-03-10 01:11:53', b'0'); COMMIT; -- ---------------------------- @@ -539,7 +415,7 @@ CREATE TABLE `sys_menu` ( `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=1090 DEFAULT CHARSET=utf8mb4 COMMENT='菜单权限表'; +) ENGINE=InnoDB AUTO_INCREMENT=1093 DEFAULT CHARSET=utf8mb4 COMMENT='菜单权限表'; -- ---------------------------- -- Records of sys_menu @@ -651,6 +527,9 @@ INSERT INTO `sys_menu` VALUES (1086, '日志导出', 'infra:api-error-log:export INSERT INTO `sys_menu` VALUES (1087, '任务查询', 'infra:job:query', 3, 1, 110, '', '', '', 0, '1', '2021-03-10 01:26:19', '1', '2021-03-10 01:26:19', b'0'); INSERT INTO `sys_menu` VALUES (1088, '日志查询', 'infra:api-access-log:query', 3, 1, 1078, '', '', '', 0, '1', '2021-03-10 01:28:04', '1', '2021-03-10 01:29:38', b'0'); INSERT INTO `sys_menu` VALUES (1089, '日志查询', 'infra:api-error-log:query', 3, 1, 1084, '', '', '', 0, '1', '2021-03-10 01:29:09', '1', '2021-03-10 01:29:09', b'0'); +INSERT INTO `sys_menu` VALUES (1090, '文件管理', '', 2, 0, 2, 'file', 'upload', 'infra/file/index', 0, '', '2021-03-12 20:16:20', '1', '2021-03-13 11:07:05', b'0'); +INSERT INTO `sys_menu` VALUES (1091, '文件查询', 'infra:file:query', 3, 1, 1090, '', '', '', 0, '', '2021-03-12 20:16:20', '', '2021-03-12 20:16:20', b'0'); +INSERT INTO `sys_menu` VALUES (1092, '文件删除', 'infra:file:delete', 3, 4, 1090, '', '', '', 0, '', '2021-03-12 20:16:20', '', '2021-03-12 20:16:20', b'0'); COMMIT; -- ---------------------------- @@ -710,25 +589,12 @@ CREATE TABLE `sys_operate_log` ( `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4 COMMENT='操作日志记录'; +) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8mb4 COMMENT='操作日志记录'; -- ---------------------------- -- Records of sys_operate_log -- ---------------------------- BEGIN; -INSERT INTO `sys_operate_log` VALUES (1, 'de0ba312-0b69-4362-b674-7da54cacfb06', 1, '菜单', '修改菜单', 2, '', '', 'POST', '/api/system/menu/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.updateMenu(SysMenuUpdateReqVO)', '{\"reqVO\":{\"name\":\"配置管理\",\"permission\":\"\",\"type\":2,\"sort\":1,\"parentId\":2,\"path\":\"config\",\"icon\":\"edit\",\"component\":\"infra/config/index\",\"status\":0,\"id\":106}}', '2021-03-10 01:12:09', 27, 0, '', 'true', NULL, '2021-03-10 01:12:10', NULL, '2021-03-10 01:12:10', b'0'); -INSERT INTO `sys_operate_log` VALUES (2, '17138b71-73b5-40c0-b735-57a1aab63a8d', 1, '菜单', '修改菜单', 2, '', '', 'POST', '/api/system/menu/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.updateMenu(SysMenuUpdateReqVO)', '{\"reqVO\":{\"name\":\"配置新增\",\"permission\":\"infra:config:create\",\"type\":3,\"sort\":2,\"parentId\":106,\"path\":\"\",\"icon\":\"\",\"component\":\"\",\"status\":0,\"id\":1032}}', '2021-03-10 01:12:18', 16, 0, '', 'true', NULL, '2021-03-10 01:12:18', NULL, '2021-03-10 01:12:18', b'0'); -INSERT INTO `sys_operate_log` VALUES (3, '74aff106-7785-4b36-b48f-0ff46d7af074', 1, '菜单', '修改菜单', 2, '', '', 'POST', '/api/system/menu/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.updateMenu(SysMenuUpdateReqVO)', '{\"reqVO\":{\"name\":\"配置修改\",\"permission\":\"infra:config:update\",\"type\":3,\"sort\":3,\"parentId\":106,\"path\":\"\",\"icon\":\"\",\"component\":\"\",\"status\":0,\"id\":1033}}', '2021-03-10 01:12:30', 16, 0, '', 'true', NULL, '2021-03-10 01:12:30', NULL, '2021-03-10 01:12:30', b'0'); -INSERT INTO `sys_operate_log` VALUES (4, '2cdfcdb3-2059-426b-8d18-4f08ac3d685b', 1, '菜单', '修改菜单', 2, '', '', 'POST', '/api/system/menu/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.updateMenu(SysMenuUpdateReqVO)', '{\"reqVO\":{\"name\":\"配置删除\",\"permission\":\"infra:config:delete\",\"type\":3,\"sort\":4,\"parentId\":106,\"path\":\"\",\"icon\":\"\",\"component\":\"\",\"status\":0,\"id\":1034}}', '2021-03-10 01:12:36', 14, 0, '', 'true', NULL, '2021-03-10 01:12:36', NULL, '2021-03-10 01:12:36', b'0'); -INSERT INTO `sys_operate_log` VALUES (5, '72652932-6219-4298-b057-86afde0ce065', 1, '菜单', '修改菜单', 2, '', '', 'POST', '/api/system/menu/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.updateMenu(SysMenuUpdateReqVO)', '{\"reqVO\":{\"name\":\"定时任务\",\"permission\":\"\",\"type\":2,\"sort\":2,\"parentId\":2,\"path\":\"job\",\"icon\":\"job\",\"component\":\"infra/job/index\",\"status\":0,\"id\":110}}', '2021-03-10 01:25:51', 28, 0, '', 'true', NULL, '2021-03-10 01:25:51', NULL, '2021-03-10 01:25:51', b'0'); -INSERT INTO `sys_operate_log` VALUES (6, '9160878f-9a8d-47d9-bb54-271263dbc63c', 1, '菜单', '创建菜单', 2, '', '', 'POST', '/api/system/menu/create', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.createMenu(SysMenuCreateReqVO)', '{\"reqVO\":{\"name\":\"任务查询\",\"permission\":\"infra:job:query\",\"type\":3,\"sort\":1,\"parentId\":110,\"path\":null,\"icon\":null,\"component\":null,\"status\":0}}', '2021-03-10 01:26:19', 16, 0, '', '1087', NULL, '2021-03-10 01:26:19', NULL, '2021-03-10 01:26:19', b'0'); -INSERT INTO `sys_operate_log` VALUES (7, 'b6e1fbd8-1a2d-4d83-8cab-306dbdecb062', 1, '菜单', '创建菜单', 2, '', '', 'POST', '/api/system/menu/create', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.createMenu(SysMenuCreateReqVO)', '{\"reqVO\":{\"name\":\"日志查询\",\"permission\":\"infra:api-error-log:query\",\"type\":3,\"sort\":1,\"parentId\":1078,\"path\":null,\"icon\":null,\"component\":null,\"status\":0}}', '2021-03-10 01:28:04', 24, 0, '', '1088', NULL, '2021-03-10 01:28:04', NULL, '2021-03-10 01:28:04', b'0'); -INSERT INTO `sys_operate_log` VALUES (8, 'be86e04e-0dc9-4a68-8df0-b03ef0ed25cb', 1, '菜单', '修改菜单', 2, '', '', 'POST', '/api/system/menu/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.updateMenu(SysMenuUpdateReqVO)', '{\"reqVO\":{\"name\":\"访问日志\",\"permission\":\"\",\"type\":2,\"sort\":1,\"parentId\":1083,\"path\":\"api-access-log\",\"icon\":\"log\",\"component\":\"infra/apiAccessLog/index\",\"status\":0,\"id\":1078}}', '2021-03-10 01:28:09', 21, 0, '', 'true', NULL, '2021-03-10 01:28:09', NULL, '2021-03-10 01:28:09', b'0'); -INSERT INTO `sys_operate_log` VALUES (9, 'f744da18-ddc7-43ed-a85c-f88104734dbc', 1, '菜单', '修改菜单', 2, '', '', 'POST', '/api/system/menu/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.updateMenu(SysMenuUpdateReqVO)', '{\"reqVO\":{\"name\":\"日志导出\",\"permission\":\"infra:api-access-log:export\",\"type\":3,\"sort\":2,\"parentId\":1078,\"path\":\"\",\"icon\":\"\",\"component\":\"\",\"status\":0,\"id\":1082}}', '2021-03-10 01:28:13', 18, 0, '', 'true', NULL, '2021-03-10 01:28:13', NULL, '2021-03-10 01:28:13', b'0'); -INSERT INTO `sys_operate_log` VALUES (10, '3ebdb770-e942-4574-85b5-77f641a3ec54', 1, '菜单', '修改菜单', 2, '', '', 'POST', '/api/system/menu/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.updateMenu(SysMenuUpdateReqVO)', '{\"reqVO\":{\"name\":\"日志处理\",\"permission\":\"infra:api-error-log:update-status\",\"type\":3,\"sort\":2,\"parentId\":1084,\"path\":\"\",\"icon\":\"\",\"component\":\"\",\"status\":0,\"id\":1085}}', '2021-03-10 01:28:18', 18, 0, '', 'true', NULL, '2021-03-10 01:28:18', NULL, '2021-03-10 01:28:18', b'0'); -INSERT INTO `sys_operate_log` VALUES (11, '51d05bc9-b8a1-44a8-a141-f139b1843f0c', 1, '菜单', '修改菜单', 2, '', '', 'POST', '/api/system/menu/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.updateMenu(SysMenuUpdateReqVO)', '{\"reqVO\":{\"name\":\"日志导出\",\"permission\":\"infra:api-error-log:export\",\"type\":3,\"sort\":3,\"parentId\":1084,\"path\":\"\",\"icon\":\"\",\"component\":\"\",\"status\":0,\"id\":1086}}', '2021-03-10 01:28:21', 16, 0, '', 'true', NULL, '2021-03-10 01:28:21', NULL, '2021-03-10 01:28:21', b'0'); -INSERT INTO `sys_operate_log` VALUES (12, 'b5829295-81a5-47e1-9755-328f020d7037', 1, '菜单', '创建菜单', 2, '', '', 'POST', '/api/system/menu/create', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.createMenu(SysMenuCreateReqVO)', '{\"reqVO\":{\"name\":\"日志查询\",\"permission\":\"infra:api-error-log:query\",\"type\":3,\"sort\":1,\"parentId\":1084,\"path\":null,\"icon\":null,\"component\":null,\"status\":0}}', '2021-03-10 01:29:09', 14, 0, '', '1089', NULL, '2021-03-10 01:29:09', NULL, '2021-03-10 01:29:09', b'0'); -INSERT INTO `sys_operate_log` VALUES (13, 'f8797735-d948-43f9-9701-dac4533cee31', 1, '菜单', '修改菜单', 2, '', '', 'POST', '/api/system/menu/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.updateMenu(SysMenuUpdateReqVO)', '{\"reqVO\":{\"name\":\"日志查询\",\"permission\":\"infra:api-access-log:query\",\"type\":3,\"sort\":1,\"parentId\":1078,\"path\":\"\",\"icon\":\"\",\"component\":\"\",\"status\":0,\"id\":1088}}', '2021-03-10 01:29:38', 17, 0, '', 'true', NULL, '2021-03-10 01:29:38', NULL, '2021-03-10 01:29:38', b'0'); COMMIT; -- ---------------------------- @@ -761,37 +627,6 @@ INSERT INTO `sys_post` VALUES (4, 'user', '普通员工', 4, 0, '', 'admin', '20 INSERT INTO `sys_post` VALUES (5, 'test', '测试岗位', 0, 1, '132', '', '2021-01-07 15:07:44', '', '2021-01-07 15:10:35', b'1'); COMMIT; --- ---------------------------- --- Table structure for sys_role --- ---------------------------- -DROP TABLE IF EXISTS `sys_role`; -CREATE TABLE `sys_role` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '角色ID', - `name` varchar(30) NOT NULL COMMENT '角色名称', - `code` varchar(100) NOT NULL COMMENT '角色权限字符串', - `sort` int(4) NOT NULL COMMENT '显示顺序', - `data_scope` tinyint(4) NOT NULL DEFAULT '1' COMMENT '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)', - `data_scope_dept_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '数据范围(指定部门数组)', - `status` tinyint(4) NOT NULL COMMENT '角色状态(0正常 1停用)', - `type` tinyint(4) NOT NULL COMMENT '角色类型', - `remark` varchar(500) DEFAULT NULL COMMENT '备注', - `creator` varchar(64) DEFAULT '' COMMENT '创建者', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `updater` varchar(64) DEFAULT '' COMMENT '更新者', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', - PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=102 DEFAULT CHARSET=utf8mb4 COMMENT='角色信息表'; - --- ---------------------------- --- Records of sys_role --- ---------------------------- -BEGIN; -INSERT INTO `sys_role` VALUES (1, '超级管理员', 'admin', 1, 1, '', 0, 1, '超级管理员', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 12:40:20', b'0'); -INSERT INTO `sys_role` VALUES (2, '普通角色', 'common', 2, 2, '', 0, 1, '普通角色', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 11:46:58', b'0'); -INSERT INTO `sys_role` VALUES (101, '测试账号', 'test', 0, 2, '[104]', 0, 2, '132', '', '2021-01-06 13:49:35', '', '2021-01-21 02:15:26', b'0'); -COMMIT; - -- ---------------------------- -- Table structure for sys_role_menu -- ---------------------------- @@ -1058,7 +893,9 @@ CREATE TABLE `sys_user_session` ( -- Records of sys_user_session -- ---------------------------- BEGIN; -INSERT INTO `sys_user_session` VALUES ('f853b50d064340a581e9a49bba9411fc', 1, '2021-03-10 01:55:41', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', NULL, '2021-03-10 01:11:53', NULL, '2021-03-10 01:25:41', b'0'); +INSERT INTO `sys_user_session` VALUES ('5a7248bf87d14e7e9f0578b05969986c', 1, '2021-03-13 10:42:50', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', NULL, '2021-03-13 09:37:36', NULL, '2021-03-12 19:53:07', b'1'); +INSERT INTO `sys_user_session` VALUES ('9ae27346d8b7491aad1385f51e8aa196', 1, '2021-03-13 13:43:58', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', NULL, '2021-03-13 10:43:06', NULL, '2021-03-13 13:13:58', b'0'); +INSERT INTO `sys_user_session` VALUES ('f853b50d064340a581e9a49bba9411fc', 1, '2021-03-10 01:55:41', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', NULL, '2021-03-10 01:11:53', NULL, '2021-03-12 18:37:05', b'1'); COMMIT; -- ---------------------------- @@ -1091,7 +928,7 @@ CREATE TABLE `tool_codegen_column` ( `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=381 DEFAULT CHARSET=utf8mb4 COMMENT='代码生成表字段定义'; +) ENGINE=InnoDB AUTO_INCREMENT=389 DEFAULT CHARSET=utf8mb4 COMMENT='代码生成表字段定义'; -- ---------------------------- -- Records of tool_codegen_column @@ -1245,6 +1082,14 @@ INSERT INTO `tool_codegen_column` VALUES (377, 30, 'create_time', 'datetime', ' INSERT INTO `tool_codegen_column` VALUES (378, 30, 'updater', 'varchar(64)', '更新者', b'1', b'0', '0', 10, 'String', 'updateBy', '', NULL, b'0', b'0', b'0', '=', b'0', 'input', '', '2021-03-06 06:48:28', '', '2021-03-06 06:48:28', b'0'); INSERT INTO `tool_codegen_column` VALUES (379, 30, 'update_time', 'datetime', '更新时间', b'0', b'0', '0', 11, 'Date', 'updateTime', '', NULL, b'0', b'0', b'0', 'BETWEEN', b'0', 'datetime', '', '2021-03-06 06:48:28', '', '2021-03-06 06:48:28', b'0'); INSERT INTO `tool_codegen_column` VALUES (380, 30, 'deleted', 'bit(1)', '是否删除', b'0', b'0', '0', 12, 'Boolean', 'deleted', '', NULL, b'0', b'0', b'0', '=', b'0', 'radio', '', '2021-03-06 06:48:28', '', '2021-03-06 06:48:28', b'0'); +INSERT INTO `tool_codegen_column` VALUES (381, 33, 'id', 'varchar(188)', '文件路径', b'0', b'1', '0', 1, 'String', 'id', '', NULL, b'0', b'0', b'1', 'LIKE', b'1', 'input', '1', '2021-03-13 09:43:20', '1', '2021-03-13 11:27:12', b'0'); +INSERT INTO `tool_codegen_column` VALUES (382, 33, 'type', 'varchar(63)', '文件类型', b'1', b'0', '0', 2, 'String', 'type', '', NULL, b'1', b'0', b'1', 'LIKE', b'1', 'select', '1', '2021-03-13 09:43:20', '1', '2021-03-13 11:27:12', b'0'); +INSERT INTO `tool_codegen_column` VALUES (383, 33, 'content', 'blob', '文件内容', b'0', b'0', '0', 3, 'byte[]', 'content', '', NULL, b'1', b'0', b'0', '=', b'1', 'fileUpload', '1', '2021-03-13 09:43:20', '1', '2021-03-13 11:27:12', b'0'); +INSERT INTO `tool_codegen_column` VALUES (384, 33, 'creator', 'varchar(64)', '创建者', b'1', b'0', '0', 4, 'String', 'creator', '', NULL, b'0', b'0', b'0', '=', b'0', 'input', '1', '2021-03-13 09:43:20', '1', '2021-03-13 11:27:12', b'0'); +INSERT INTO `tool_codegen_column` VALUES (385, 33, 'create_time', 'datetime', '创建时间', b'0', b'0', '0', 5, 'Date', 'createTime', '', NULL, b'0', b'0', b'1', 'BETWEEN', b'1', 'datetime', '1', '2021-03-13 09:43:20', '1', '2021-03-13 11:27:12', b'0'); +INSERT INTO `tool_codegen_column` VALUES (386, 33, 'updater', 'varchar(64)', '更新者', b'1', b'0', '0', 6, 'String', 'updater', '', NULL, b'0', b'0', b'0', '=', b'0', 'input', '1', '2021-03-13 09:43:20', '1', '2021-03-13 11:27:12', b'0'); +INSERT INTO `tool_codegen_column` VALUES (387, 33, 'update_time', 'datetime', '更新时间', b'0', b'0', '0', 7, 'Date', 'updateTime', '', NULL, b'0', b'0', b'0', 'BETWEEN', b'0', 'datetime', '1', '2021-03-13 09:43:20', '1', '2021-03-13 11:27:12', b'0'); +INSERT INTO `tool_codegen_column` VALUES (388, 33, 'deleted', 'bit(1)', '是否删除', b'0', b'0', '0', 8, 'Boolean', 'deleted', '', NULL, b'0', b'0', b'0', '=', b'0', 'radio', '1', '2021-03-13 09:43:20', '1', '2021-03-13 11:27:12', b'0'); COMMIT; -- ---------------------------- @@ -1270,7 +1115,7 @@ CREATE TABLE `tool_codegen_table` ( `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8mb4 COMMENT='代码生成表定义'; +) ENGINE=InnoDB AUTO_INCREMENT=34 DEFAULT CHARSET=utf8mb4 COMMENT='代码生成表定义'; -- ---------------------------- -- Records of tool_codegen_table @@ -1287,6 +1132,7 @@ INSERT INTO `tool_codegen_table` VALUES (27, 1, 'inf_api_error_log', 'API 错误 INSERT INTO `tool_codegen_table` VALUES (28, 1, 'sys_dict_type', '字典类型表', NULL, 'system', 'dictType', 'SysDictType', '字典类型', '芋艿', 1, NULL, '', '2021-03-06 03:45:55', '', '2021-03-06 03:51:02', b'1'); INSERT INTO `tool_codegen_table` VALUES (29, 1, 'sys_dict_type', '字典类型表', NULL, 'system', 'dict', 'SysDictType', '字典类型', '芋艿', 1, NULL, '', '2021-03-06 03:52:57', '', '2021-03-06 04:03:52', b'0'); INSERT INTO `tool_codegen_table` VALUES (30, 1, 'sys_dict_data', '字典数据表', NULL, 'system', 'type', 'SysDictData', '字典数据', '芋道源码', 1, NULL, '', '2021-03-06 06:48:28', '', '2021-03-06 06:50:47', b'0'); +INSERT INTO `tool_codegen_table` VALUES (33, 1, 'inf_file', '文件表', NULL, 'infra', 'file', 'InfFile', '文件', '芋艿', 1, 2, '1', '2021-03-13 09:43:20', '1', '2021-03-13 11:27:12', b'0'); COMMIT; -- ---------------------------- diff --git a/src/main/java/cn/iocoder/dashboard/framework/file/config/FileProperties.java b/src/main/java/cn/iocoder/dashboard/framework/file/config/FileProperties.java index 532616b37..4018f4437 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/file/config/FileProperties.java +++ b/src/main/java/cn/iocoder/dashboard/framework/file/config/FileProperties.java @@ -1,6 +1,6 @@ package cn.iocoder.dashboard.framework.file.config; -import cn.iocoder.dashboard.modules.system.controller.common.SysFileController; +import cn.iocoder.dashboard.modules.infra.controller.file.InfFileController; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.validation.annotation.Validated; @@ -13,7 +13,7 @@ import javax.validation.constraints.NotNull; public class FileProperties { /** - * 对应 {@link SysFileController#} + * 对应 {@link InfFileController#} */ @NotNull(message = "基础文件路径不能为空") private String basePath; diff --git a/src/main/java/cn/iocoder/dashboard/framework/security/config/SecurityConfiguration.java b/src/main/java/cn/iocoder/dashboard/framework/security/config/SecurityConfiguration.java index 2b9e2202b..bb55e1e71 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/security/config/SecurityConfiguration.java +++ b/src/main/java/cn/iocoder/dashboard/framework/security/config/SecurityConfiguration.java @@ -134,7 +134,7 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter { // 静态资源,可匿名访问 .antMatchers(HttpMethod.GET, "/*.html", "/**/*.html", "/**/*.css", "/**/*.js").permitAll() // 文件的获取接口,可匿名访问 - .antMatchers(webProperties.getApiPrefix() + "/system/file/get/**").anonymous() + .antMatchers(webProperties.getApiPrefix() + "/infra/file/get/**").anonymous() // Swagger 接口文档 .antMatchers("/swagger-ui.html").anonymous() .antMatchers("/swagger-resources/**").anonymous() diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/common/SysFileController.java b/src/main/java/cn/iocoder/dashboard/modules/infra/controller/file/InfFileController.java similarity index 52% rename from src/main/java/cn/iocoder/dashboard/modules/system/controller/common/SysFileController.java rename to src/main/java/cn/iocoder/dashboard/modules/infra/controller/file/InfFileController.java index 1be0e5336..a21f0d817 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/controller/common/SysFileController.java +++ b/src/main/java/cn/iocoder/dashboard/modules/infra/controller/file/InfFileController.java @@ -1,9 +1,13 @@ -package cn.iocoder.dashboard.modules.system.controller.common; +package cn.iocoder.dashboard.modules.infra.controller.file; import cn.hutool.core.io.IoUtil; import cn.iocoder.dashboard.common.pojo.CommonResult; -import cn.iocoder.dashboard.modules.system.dal.dataobject.common.SysFileDO; -import cn.iocoder.dashboard.modules.system.service.common.SysFileService; +import cn.iocoder.dashboard.common.pojo.PageResult; +import cn.iocoder.dashboard.modules.infra.controller.file.vo.InfFilePageReqVO; +import cn.iocoder.dashboard.modules.infra.controller.file.vo.InfFileRespVO; +import cn.iocoder.dashboard.modules.infra.convert.file.InfFileConvert; +import cn.iocoder.dashboard.modules.infra.dal.dataobject.file.InfFileDO; +import cn.iocoder.dashboard.modules.infra.service.file.InfFileService; import cn.iocoder.dashboard.util.servlet.ServletUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; @@ -11,40 +15,53 @@ import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; import java.io.IOException; import static cn.iocoder.dashboard.common.pojo.CommonResult.success; @Api(tags = "文件存储") @RestController -@RequestMapping("/system/file") +@RequestMapping("/infra/file") +@Validated @Slf4j -public class SysFileController { +public class InfFileController { @Resource - private SysFileService fileService; + private InfFileService fileService; + @PostMapping("/upload") @ApiOperation("上传文件") @ApiImplicitParams({ - @ApiImplicitParam(name = "path", value = "文件附件", required = true, dataTypeClass = MultipartFile.class), - @ApiImplicitParam(name = "path", value = "文件路径", required = true, example = "yudaoyuanma.png", dataTypeClass = Long.class) + @ApiImplicitParam(name = "file", value = "文件附件", required = true, dataTypeClass = MultipartFile.class), + @ApiImplicitParam(name = "path", value = "文件路径", required = false, example = "yudaoyuanma.png", dataTypeClass = String.class) }) - @PostMapping("/upload") public CommonResult uploadFile(@RequestParam("file") MultipartFile file, @RequestParam("path") String path) throws IOException { return success(fileService.createFile(path, IoUtil.readBytes(file.getInputStream()))); } + @DeleteMapping("/delete") + @ApiOperation("删除文件") + @ApiImplicitParam(name = "id", value = "编号", required = true) + @PreAuthorize("@ss.hasPermission('infra:file:delete')") + public CommonResult deleteFile(@RequestParam("id") String id) { + fileService.deleteFile(id); + return success(true); + } + + @GetMapping("/get/{path}") @ApiOperation("下载文件") @ApiImplicitParam(name = "path", value = "文件附件", required = true, dataTypeClass = MultipartFile.class) - @GetMapping("/get/{path}") public void getFile(HttpServletResponse response, @PathVariable("path") String path) throws IOException { - SysFileDO file = fileService.getFile(path); + InfFileDO file = fileService.getFile(path); if (file == null) { log.warn("[getFile][path({}) 文件不存在]", path); response.setStatus(HttpStatus.NOT_FOUND.value()); @@ -53,4 +70,12 @@ public class SysFileController { ServletUtils.writeAttachment(response, path, file.getContent()); } + @GetMapping("/page") + @ApiOperation("获得文件分页") + @PreAuthorize("@ss.hasPermission('infra:file:query')") + public CommonResult> getFilePage(@Valid InfFilePageReqVO pageVO) { + PageResult pageResult = fileService.getFilePage(pageVO); + return success(InfFileConvert.INSTANCE.convertPage(pageResult)); + } + } diff --git a/src/main/java/cn/iocoder/dashboard/modules/infra/controller/file/vo/InfFilePageReqVO.java b/src/main/java/cn/iocoder/dashboard/modules/infra/controller/file/vo/InfFilePageReqVO.java new file mode 100644 index 000000000..8eae6e6c7 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/infra/controller/file/vo/InfFilePageReqVO.java @@ -0,0 +1,35 @@ +package cn.iocoder.dashboard.modules.infra.controller.file.vo; + +import cn.iocoder.dashboard.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static cn.iocoder.dashboard.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("文件分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class InfFilePageReqVO extends PageParam { + + @ApiModelProperty(value = "文件路径", example = "yudao", notes = "模糊匹配") + private String id; + + @ApiModelProperty(value = "文件类型", example = "jpg", notes = "模糊匹配") + private String type; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "开始创建时间") + private Date beginCreateTime; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "结束创建时间") + private Date endCreateTime; + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/infra/controller/file/vo/InfFileRespVO.java b/src/main/java/cn/iocoder/dashboard/modules/infra/controller/file/vo/InfFileRespVO.java new file mode 100644 index 000000000..e78074da5 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/infra/controller/file/vo/InfFileRespVO.java @@ -0,0 +1,22 @@ +package cn.iocoder.dashboard.modules.infra.controller.file.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +@ApiModel(value = "文件 Response VO", description = "不返回 content 字段,太大") +@Data +public class InfFileRespVO { + + @ApiModelProperty(value = "文件路径", required = true, example = "yudao.jpg") + private String id; + + @ApiModelProperty(value = "文件类型", required = true, example = "jpg") + private String type; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/infra/convert/file/InfFileConvert.java b/src/main/java/cn/iocoder/dashboard/modules/infra/convert/file/InfFileConvert.java new file mode 100644 index 000000000..9b8d49b6a --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/infra/convert/file/InfFileConvert.java @@ -0,0 +1,18 @@ +package cn.iocoder.dashboard.modules.infra.convert.file; + +import cn.iocoder.dashboard.common.pojo.PageResult; +import cn.iocoder.dashboard.modules.infra.controller.file.vo.InfFileRespVO; +import cn.iocoder.dashboard.modules.infra.dal.dataobject.file.InfFileDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +@Mapper +public interface InfFileConvert { + + InfFileConvert INSTANCE = Mappers.getMapper(InfFileConvert.class); + + InfFileRespVO convert(InfFileDO bean); + + PageResult convertPage(PageResult page); + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/infra/dal/dataobject/file/InfFileDO.java b/src/main/java/cn/iocoder/dashboard/modules/infra/dal/dataobject/file/InfFileDO.java new file mode 100644 index 000000000..12600ff7f --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/infra/dal/dataobject/file/InfFileDO.java @@ -0,0 +1,43 @@ +package cn.iocoder.dashboard.modules.infra.dal.dataobject.file; + +import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.io.InputStream; + +/** + * 文件表 + * + * @author 芋道源码 + */ +@Data +@TableName("inf_file") +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class InfFileDO extends BaseDO { + + /** + * 文件路径 + */ + @TableId(type = IdType.INPUT) + private String id; + /** + * 文件类型 + * + * 通过 {@link cn.hutool.core.io.FileTypeUtil#getType(InputStream)} 获取 + */ + @TableField(value = "`type`") + private String type; + /** + * 文件内容 + */ + private byte[] content; + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/file/InfFileMapper.java b/src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/file/InfFileMapper.java new file mode 100644 index 000000000..351d12cad --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/file/InfFileMapper.java @@ -0,0 +1,25 @@ +package cn.iocoder.dashboard.modules.infra.dal.mysql.file; + +import cn.iocoder.dashboard.common.pojo.PageResult; +import cn.iocoder.dashboard.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.dashboard.framework.mybatis.core.query.QueryWrapperX; +import cn.iocoder.dashboard.modules.infra.controller.file.vo.InfFilePageReqVO; +import cn.iocoder.dashboard.modules.infra.dal.dataobject.file.InfFileDO; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface InfFileMapper extends BaseMapperX { + + default Integer selectCountById(String id) { + return selectCount("id", id); + } + + default PageResult selectPage(InfFilePageReqVO reqVO) { + return selectPage(reqVO, new QueryWrapperX() + .likeIfPresent("id", reqVO.getId()) + .likeIfPresent("type", reqVO.getType()) + .betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime()) + .orderByDesc("create_time")); + } + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/infra/enums/InfErrorCodeConstants.java b/src/main/java/cn/iocoder/dashboard/modules/infra/enums/InfErrorCodeConstants.java index f618db87f..e02119b6c 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/infra/enums/InfErrorCodeConstants.java +++ b/src/main/java/cn/iocoder/dashboard/modules/infra/enums/InfErrorCodeConstants.java @@ -27,4 +27,7 @@ public interface InfErrorCodeConstants { ErrorCode API_ERROR_LOG_NOT_FOUND = new ErrorCode(1001002000, "API 错误日志不存在"); ErrorCode API_ERROR_LOG_PROCESSED = new ErrorCode(1001002001, "API 错误日志已处理"); + // ========== 文件 1001003000 ========== + ErrorCode FILE_NOT_EXISTS = new ErrorCode(1001003000, "文件不存在"); + } diff --git a/src/main/java/cn/iocoder/dashboard/modules/infra/service/file/InfFileService.java b/src/main/java/cn/iocoder/dashboard/modules/infra/service/file/InfFileService.java new file mode 100644 index 000000000..771828266 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/infra/service/file/InfFileService.java @@ -0,0 +1,46 @@ +package cn.iocoder.dashboard.modules.infra.service.file; + +import cn.iocoder.dashboard.common.pojo.PageResult; +import cn.iocoder.dashboard.modules.infra.controller.file.vo.InfFilePageReqVO; +import cn.iocoder.dashboard.modules.infra.dal.dataobject.file.InfFileDO; + +/** + * 文件 Service 接口 + * + * @author 芋道源码 + */ +public interface InfFileService { + + /** + * 保存文件,并返回文件的访问路径 + * + * @param path 文件路径 + * @param content 文件内容 + * @return 文件路径 + */ + String createFile(String path, byte[] content); + + /** + * 删除文件 + * + * @param id 编号 + */ + void deleteFile(String id); + + /** + * 获得文件 + * + * @param path 文件路径 + * @return 文件 + */ + InfFileDO getFile(String path); + + /** + * 获得文件分页 + * + * @param pageReqVO 分页查询 + * @return 文件分页 + */ + PageResult getFilePage(InfFilePageReqVO pageReqVO); + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/infra/service/file/impl/InfFileServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/infra/service/file/impl/InfFileServiceImpl.java new file mode 100644 index 000000000..9a697f3d2 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/infra/service/file/impl/InfFileServiceImpl.java @@ -0,0 +1,72 @@ +package cn.iocoder.dashboard.modules.infra.service.file.impl; + +import cn.hutool.core.io.FileTypeUtil; +import cn.iocoder.dashboard.common.pojo.PageResult; +import cn.iocoder.dashboard.framework.file.config.FileProperties; +import cn.iocoder.dashboard.modules.infra.controller.file.vo.InfFilePageReqVO; +import cn.iocoder.dashboard.modules.infra.dal.dataobject.file.InfFileDO; +import cn.iocoder.dashboard.modules.infra.dal.mysql.file.InfFileMapper; +import cn.iocoder.dashboard.modules.infra.service.file.InfFileService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.ByteArrayInputStream; + +import static cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.FILE_NOT_EXISTS; +import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.FILE_PATH_EXISTS; + +/** + * 文件 Service 实现类 + * + * @author 芋道源码 + */ +@Service +public class InfFileServiceImpl implements InfFileService { + + @Resource + private InfFileMapper fileMapper; + + @Resource + private FileProperties fileProperties; + + @Override + public String createFile(String path, byte[] content) { + if (fileMapper.selectCountById(path) > 0) { + throw exception(FILE_PATH_EXISTS); + } + // 保存到数据库 + InfFileDO file = new InfFileDO(); + file.setId(path); + file.setType(FileTypeUtil.getType(new ByteArrayInputStream(content))); + file.setContent(content); + fileMapper.insert(file); + // 拼接路径返回 + return fileProperties.getBasePath() + path; + } + + @Override + public void deleteFile(String id) { + // 校验存在 + this.validateFileExists(id); + // 更新 + fileMapper.deleteById(id); + } + + private void validateFileExists(String id) { + if (fileMapper.selectById(id) == null) { + throw exception(FILE_NOT_EXISTS); + } + } + + @Override + public InfFileDO getFile(String path) { + return fileMapper.selectById(path); + } + + @Override + public PageResult getFilePage(InfFilePageReqVO pageReqVO) { + return fileMapper.selectPage(pageReqVO); + } + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/common/SysFileDO.java b/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/common/SysFileDO.java deleted file mode 100644 index ed99111cf..000000000 --- a/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/common/SysFileDO.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.iocoder.dashboard.modules.system.dal.dataobject.common; - -import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 文件表 - * - * @author 芋道源码 - */ -@Data -@TableName("sys_file") -@EqualsAndHashCode(callSuper = true) -public class SysFileDO extends BaseDO { - - /** - * 文件路径 - */ - @TableId(type = IdType.INPUT) - private String id; - /** - * 文件内容 - */ - private byte[] content; - -} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/common/SysFileMapper.java b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/common/SysFileMapper.java deleted file mode 100644 index e40c04c0b..000000000 --- a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/common/SysFileMapper.java +++ /dev/null @@ -1,15 +0,0 @@ -package cn.iocoder.dashboard.modules.system.dal.mysql.common; - -import cn.iocoder.dashboard.modules.system.dal.dataobject.common.SysFileDO; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface SysFileMapper extends BaseMapper { - - default Integer selectCountById(String id) { - return selectCount(new QueryWrapper().eq("id", id)); - } - -} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/common/SysFileService.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/common/SysFileService.java deleted file mode 100644 index c3e1383e8..000000000 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/common/SysFileService.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.common; - -import cn.iocoder.dashboard.modules.system.dal.dataobject.common.SysFileDO; - -/** - * 文件 Service 接口 - * - * @author 芋道源码 - */ -public interface SysFileService { - - /** - * 保存文件,并返回文件的访问路径 - * - * @param path 文件路径 - * @param content 文件内容 - * @return 文件路径 - */ - String createFile(String path, byte[] content); - - /** - * 获得文件 - * - * @param path 文件路径 - * @return 文件 - */ - SysFileDO getFile(String path); - -} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/common/impl/SysFileServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/common/impl/SysFileServiceImpl.java deleted file mode 100644 index 01b103189..000000000 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/common/impl/SysFileServiceImpl.java +++ /dev/null @@ -1,47 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.common.impl; - -import cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil; -import cn.iocoder.dashboard.framework.file.config.FileProperties; -import cn.iocoder.dashboard.modules.system.dal.dataobject.common.SysFileDO; -import cn.iocoder.dashboard.modules.system.dal.mysql.common.SysFileMapper; -import cn.iocoder.dashboard.modules.system.service.common.SysFileService; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; - -import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.FILE_PATH_EXISTS; - -/** - * 文件 Service 实现类 - * - * @author 芋道源码 - */ -@Service -public class SysFileServiceImpl implements SysFileService { - - @Resource - private SysFileMapper fileMapper; - - @Resource - private FileProperties fileProperties; - - @Override - public String createFile(String path, byte[] content) { - if (fileMapper.selectCountById(path) > 0) { - throw ServiceExceptionUtil.exception(FILE_PATH_EXISTS); - } - // 保存到数据库 - SysFileDO file = new SysFileDO(); - file.setId(path); - file.setContent(content); - fileMapper.insert(file); - // 拼接路径返回 - return fileProperties.getBasePath() + path; - } - - @Override - public SysFileDO getFile(String path) { - return fileMapper.selectById(path); - } - -} diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenBuilder.java b/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenBuilder.java index 9d76d72a4..8858cfb04 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenBuilder.java +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenBuilder.java @@ -99,6 +99,7 @@ public class ToolCodegenBuilder { .put(String.class.getSimpleName(), Sets.newHashSet("tinytext", "text", "mediumtext", "longtext", // 长文本 "char", "varchar", "nvarchar", "varchar2")) // 短文本 .put(Date.class.getSimpleName(), Sets.newHashSet("datetime", "time", "date", "timestamp")) + .put("byte[]", Sets.newHashSet("blob")) .build(); static { diff --git a/src/main/resources/application-dev.yaml b/src/main/resources/application-dev.yaml index dbf2ad53b..7c3974196 100644 --- a/src/main/resources/application-dev.yaml +++ b/src/main/resources/application-dev.yaml @@ -152,7 +152,7 @@ yudao: width: 160 height: 60 file: - base-path: http://127.0.0.1:${server.port}/${yudao.web.api-prefix}/file/get/ + base-path: http://127.0.0.1:${server.port}/${yudao.web.api-prefix}/infra/file/get/ codegen: base-package: ${yudao.info.base-package} db-schemas: ${spring.datasource.name} diff --git a/src/main/resources/application-local.yaml b/src/main/resources/application-local.yaml index 537156cf7..96dff278c 100644 --- a/src/main/resources/application-local.yaml +++ b/src/main/resources/application-local.yaml @@ -152,7 +152,7 @@ yudao: width: 160 height: 60 file: - base-path: http://127.0.0.1:${server.port}/${yudao.web.api-prefix}/file/get/ + base-path: http://127.0.0.1:${server.port}/${yudao.web.api-prefix}/infra/file/get/ codegen: base-package: ${yudao.info.base-package} db-schemas: ${spring.datasource.name} diff --git a/src/main/resources/codegen/java/controller/controller.vm b/src/main/resources/codegen/java/controller/controller.vm index 664d7c55b..a0a033b65 100644 --- a/src/main/resources/codegen/java/controller/controller.vm +++ b/src/main/resources/codegen/java/controller/controller.vm @@ -55,7 +55,7 @@ public class ${table.className}Controller { @DeleteMapping("/delete") @ApiOperation("删除${table.classComment}") @ApiImplicitParam(name = "id", value = "编号", required = true) - @PreAuthorize("@ss.hasPermission('${permissionPrefix}:delete')") + @PreAuthorize("@ss.hasPermission('${permissionPrefix}:delete')") public CommonResult delete${simpleClassName}(@RequestParam("id") ${primaryColumn.javaType} id) { ${classNameVar}Service.delete${simpleClassName}(id); return success(true); diff --git a/src/main/resources/codegen/java/service/serviceImpl.vm b/src/main/resources/codegen/java/service/serviceImpl.vm index 0889f0ce0..17015798e 100644 --- a/src/main/resources/codegen/java/service/serviceImpl.vm +++ b/src/main/resources/codegen/java/service/serviceImpl.vm @@ -16,6 +16,7 @@ import ${basePackage}.modules.${table.moduleName}.service.${table.businessName}. import ${ServiceExceptionUtilClassName}; +import static cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil.exception; import static ${basePackage}.modules.${table.moduleName}.enums.${simpleModuleName_upperFirst}ErrorCodeConstants.*; /** @@ -58,7 +59,7 @@ public class ${table.className}ServiceImpl implements ${table.className}Service private void validate${simpleClassName}Exists(${primaryColumn.javaType} id) { if (${classNameVar}Mapper.selectById(id) == null) { - throw ServiceExceptionUtil.exception(${simpleClassName_underlineCase.toUpperCase()}_NOT_EXISTS); + throw exception(${simpleClassName_underlineCase.toUpperCase()}_NOT_EXISTS); } } diff --git a/src/main/resources/codegen/java/test/serviceTest.vm b/src/main/resources/codegen/java/test/serviceTest.vm index 692b60d6f..f4590b74c 100644 --- a/src/main/resources/codegen/java/test/serviceTest.vm +++ b/src/main/resources/codegen/java/test/serviceTest.vm @@ -1,13 +1,11 @@ package ${basePackage}.modules.${table.moduleName}.service.${table.businessName}; -import ${basePackage}.BaseSpringBootUnitTest; - import org.junit.jupiter.api.Test; import org.springframework.boot.test.mock.mockito.MockBean; import javax.annotation.Resource; -import cn.iocoder.dashboard.BaseSpringBootUnitTest; +import ${basePackage}.BaseDbUnitTest; import ${basePackage}.modules.${table.moduleName}.service.${table.businessName}.impl.${table.className}ServiceImpl; import ${basePackage}.modules.${table.moduleName}.controller.${table.businessName}.vo.*; import ${basePackage}.modules.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; @@ -16,6 +14,7 @@ import ${basePackage}.util.object.ObjectUtils; import ${PageResultClassName}; import javax.annotation.Resource; +import org.springframework.context.annotation.Import; import java.util.*; import static cn.hutool.core.util.RandomUtil.*; @@ -64,7 +63,8 @@ import static org.mockito.Mockito.*; * * @author ${table.author} */ -public class ${table.className}ServiceTest extends BaseSpringBootUnitTest { +@Import(${table.className}ServiceImpl.class) +public class ${table.className}ServiceTest extends BaseDbUnitTest { @Resource private ${table.className}ServiceImpl ${classNameVar}Service; @@ -78,7 +78,7 @@ public class ${table.className}ServiceTest extends BaseSpringBootUnitTest { ${table.className}CreateReqVO reqVO = randomPojo(${table.className}CreateReqVO.class); // 调用 - Long ${classNameVar}Id = ${classNameVar}Service.create${simpleClassName}(reqVO); + ${primaryColumn.javaType} ${classNameVar}Id = ${classNameVar}Service.create${simpleClassName}(reqVO); // 断言 assertNotNull(${classNameVar}Id); // 校验记录的属性是否正确 @@ -118,7 +118,7 @@ public class ${table.className}ServiceTest extends BaseSpringBootUnitTest { ${table.className}DO db${simpleClassName} = randomPojo(${table.className}DO.class); ${classNameVar}Mapper.insert(db${simpleClassName});// @Sql: 先插入出一条存在的数据 // 准备参数 - Long id = db${simpleClassName}.getId(); + ${primaryColumn.javaType} id = db${simpleClassName}.getId(); // 调用 ${classNameVar}Service.delete${simpleClassName}(id); @@ -129,7 +129,7 @@ public class ${table.className}ServiceTest extends BaseSpringBootUnitTest { @Test public void testDelete${simpleClassName}_notExists() { // 准备参数 - Long id = randomLongId(); + ${primaryColumn.javaType} id = random${primaryColumn.javaType}Id(); // 调用, 并断言异常 assertServiceException(() -> ${classNameVar}Service.delete${simpleClassName}(id), ${simpleClassName_underlineCase.toUpperCase()}_NOT_EXISTS); diff --git a/src/main/resources/codegen/sql/sql.vm b/src/main/resources/codegen/sql/sql.vm index 4a65b6025..741016c23 100644 --- a/src/main/resources/codegen/sql/sql.vm +++ b/src/main/resources/codegen/sql/sql.vm @@ -4,7 +4,7 @@ INSERT INTO `sys_menu`( `path`, `icon`, `component`, `status` ) VALUES ( - '${table.classComment}管理', '${permissionPrefix}:query', 2, 0, ${table.parentMenuId}, + '${table.classComment}管理', '', 2, 0, ${table.parentMenuId}, '${simpleClassName_strikeCase}', '', '${table.moduleName}/${classNameVar}/index', 0 ); @@ -12,8 +12,8 @@ VALUES ( SELECT @parentId := LAST_INSERT_ID(); -- 按钮 SQL -#set ($functionNames = ['创建', '更新', '删除', '导出']) -#set ($functionOps = ['create', 'update', 'delete', 'export']) +#set ($functionNames = ['查询', '创建', '更新', '删除', '导出']) +#set ($functionOps = ['query', 'create', 'update', 'delete', 'export']) #foreach ($functionName in $functionNames) #set ($index = $foreach.count - 1) INSERT INTO `sys_menu`( @@ -21,7 +21,7 @@ INSERT INTO `sys_menu`( `path`, `icon`, `component`, `status` ) VALUES ( - '${table.tableComment}${functionName}', '${permissionPrefix}:${functionOps.get($index)}', 3, $foreach.count, @parentId, + '${table.classComment}${functionName}', '${permissionPrefix}:${functionOps.get($index)}', 3, $foreach.count, @parentId, '', '', '', 0 ); #end diff --git a/src/main/resources/codegen/vue/views/index.vue.vm b/src/main/resources/codegen/vue/views/index.vue.vm index 490ed3c4d..73115fd77 100644 --- a/src/main/resources/codegen/vue/views/index.vue.vm +++ b/src/main/resources/codegen/vue/views/index.vue.vm @@ -68,7 +68,7 @@ #if ($column.javaType == "Date")## 时间类型 #elseif("" != $column.dictType)## 数据字典 diff --git a/src/test/java/cn/iocoder/dashboard/modules/infra/service/file/InfFileServiceTest.java b/src/test/java/cn/iocoder/dashboard/modules/infra/service/file/InfFileServiceTest.java new file mode 100644 index 000000000..0445d1cb4 --- /dev/null +++ b/src/test/java/cn/iocoder/dashboard/modules/infra/service/file/InfFileServiceTest.java @@ -0,0 +1,126 @@ +package cn.iocoder.dashboard.modules.infra.service.file; + +import cn.hutool.core.io.resource.ResourceUtil; +import cn.iocoder.dashboard.BaseDbUnitTest; +import cn.iocoder.dashboard.common.pojo.PageResult; +import cn.iocoder.dashboard.framework.file.config.FileProperties; +import cn.iocoder.dashboard.modules.infra.controller.file.vo.InfFilePageReqVO; +import cn.iocoder.dashboard.modules.infra.dal.dataobject.file.InfFileDO; +import cn.iocoder.dashboard.modules.infra.dal.mysql.file.InfFileMapper; +import cn.iocoder.dashboard.modules.infra.service.file.impl.InfFileServiceImpl; +import cn.iocoder.dashboard.util.object.ObjectUtils; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; + +import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.FILE_NOT_EXISTS; +import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.FILE_PATH_EXISTS; +import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.dashboard.util.AssertUtils.assertServiceException; +import static cn.iocoder.dashboard.util.RandomUtils.randomPojo; +import static cn.iocoder.dashboard.util.RandomUtils.randomString; +import static cn.iocoder.dashboard.util.date.DateUtils.buildTime; +import static org.junit.jupiter.api.Assertions.*; + +@Import({InfFileServiceImpl.class, FileProperties.class}) +public class InfFileServiceTest extends BaseDbUnitTest { + + @Resource + private InfFileServiceImpl fileService; + + @Resource + private FileProperties fileProperties; + @Resource + private InfFileMapper fileMapper; + + @Test + public void testCreateFile_success() { + // 准备参数 + String path = randomString(); + byte[] content = ResourceUtil.readBytes("file/erweima.jpg"); + + // 调用 + String url = fileService.createFile(path, content); + // 断言 + assertEquals(fileProperties.getBasePath() + path, url); + // 校验数据 + InfFileDO file = fileMapper.selectById(path); + assertEquals(path, file.getId()); + assertEquals("jpg", file.getType()); + assertArrayEquals(content, file.getContent()); + } + + @Test + public void testCreateFile_exists() { + // mock 数据 + InfFileDO dbFile = randomPojo(InfFileDO.class); + fileMapper.insert(dbFile); + // 准备参数 + String path = dbFile.getId(); // 模拟已存在 + byte[] content = ResourceUtil.readBytes("file/erweima.jpg"); + + // 调用,并断言异常 + assertServiceException(() -> fileService.createFile(path, content), FILE_PATH_EXISTS); + } + + @Test + public void testDeleteFile_success() { + // mock 数据 + InfFileDO dbFile = randomPojo(InfFileDO.class); + fileMapper.insert(dbFile);// @Sql: 先插入出一条存在的数据 + // 准备参数 + String id = dbFile.getId(); + + // 调用 + fileService.deleteFile(id); + // 校验数据不存在了 + assertNull(fileMapper.selectById(id)); + } + + @Test + public void testDeleteFile_notExists() { + // 准备参数 + String id = randomString(); + + // 调用, 并断言异常 + assertServiceException(() -> fileService.deleteFile(id), FILE_NOT_EXISTS); + } + + @Test + public void testGetFilePage() { + // mock 数据 + InfFileDO dbFile = randomPojo(InfFileDO.class, o -> { // 等会查询到 + o.setId("yudao"); + o.setType("jpg"); + o.setCreateTime(buildTime(2021, 1, 15)); + }); + fileMapper.insert(dbFile); + // 测试 id 不匹配 + fileMapper.insert(ObjectUtils.clone(dbFile, o -> o.setId("tudou"))); + // 测试 type 不匹配 + fileMapper.insert(ObjectUtils.clone(dbFile, o -> { + o.setId("yudao02"); + o.setType("png"); + })); + // 测试 createTime 不匹配 + fileMapper.insert(ObjectUtils.clone(dbFile, o -> { + o.setId("yudao03"); + o.setCreateTime(buildTime(2020, 1, 15)); + })); + // 准备参数 + InfFilePageReqVO reqVO = new InfFilePageReqVO(); + reqVO.setId("yudao"); + reqVO.setType("jp"); + reqVO.setBeginCreateTime(buildTime(2021, 1, 10)); + reqVO.setEndCreateTime(buildTime(2021, 1, 20)); + + // 调用 + PageResult pageResult = fileService.getFilePage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbFile, pageResult.getList().get(0), "content"); + } + +} diff --git a/src/test/java/cn/iocoder/dashboard/modules/system/service/auth/SysUserSessionServiceImplTest.java b/src/test/java/cn/iocoder/dashboard/modules/system/service/auth/SysUserSessionServiceImplTest.java index fdce6cc6d..08a8ddf61 100644 --- a/src/test/java/cn/iocoder/dashboard/modules/system/service/auth/SysUserSessionServiceImplTest.java +++ b/src/test/java/cn/iocoder/dashboard/modules/system/service/auth/SysUserSessionServiceImplTest.java @@ -2,7 +2,6 @@ package cn.iocoder.dashboard.modules.system.service.auth; import cn.hutool.core.date.DateUtil; import cn.iocoder.dashboard.BaseDbAndRedisUnitTest; -import cn.iocoder.dashboard.framework.mybatis.core.query.QueryWrapperX; import cn.iocoder.dashboard.framework.security.config.SecurityProperties; import cn.iocoder.dashboard.modules.system.dal.dataobject.auth.SysUserSessionDO; import cn.iocoder.dashboard.modules.system.dal.mysql.auth.SysUserSessionMapper; @@ -32,24 +31,24 @@ import static org.junit.jupiter.api.Assertions.assertEquals; * @version 1.0 * @since

3月 8, 2021
*/ -@Import( - SysUserSessionServiceImpl.class) +@Import(SysUserSessionServiceImpl.class) public class SysUserSessionServiceImplTest extends BaseDbAndRedisUnitTest { @Resource - SysUserSessionServiceImpl sysUserSessionService; + private SysUserSessionServiceImpl sysUserSessionService; @Resource - SysUserSessionMapper sysUserSessionMapper; + private SysUserSessionMapper sysUserSessionMapper; + @MockBean - SecurityProperties securityProperties; + private SecurityProperties securityProperties; @MockBean - SysDeptServiceImpl sysDeptService; + private SysDeptServiceImpl sysDeptService; @MockBean - SysUserServiceImpl sysUserService; + private SysUserServiceImpl sysUserService; @MockBean - SysLoginLogServiceImpl sysLoginLogService; + private SysLoginLogServiceImpl sysLoginLogService; @MockBean - SysLoginUserRedisDAO sysLoginUserRedisDAO; + private SysLoginUserRedisDAO sysLoginUserRedisDAO; @Test public void testClearSessionTimeout_success() throws Exception { @@ -75,4 +74,4 @@ public class SysUserSessionServiceImplTest extends BaseDbAndRedisUnitTest { AssertUtils.assertPojoEquals(sessionDO, userSessionDOS.get(0), "updateTime"); } -} +} diff --git a/src/test/resources/file/erweima.jpg b/src/test/resources/file/erweima.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1447283cdf1b49b51c1204a160e01cb789e957a8 GIT binary patch literal 18385 zcmb7s2Rzm9+yCL%A+xNq$sv0yBYV$7${yL72_=by>^(#Fv7$0Ev!kp?5wb^FWrg_P zpQHMH%lG#@|3|%E9nLwQao^YbdXMYm@crQ@7>SC4vH}bP0|vtYe_)5BFj*KJ6BGIi zzOcYwY&>jiEG%pSTwEMHLIOg<69gwt5D}A+5D}9SpEyBsiiDJ$f|8Pw@Z@Q#QxsHW z6qFRuK``LpJy_WI*x2|KL??(S{?A{B%`j3t3``76I0h*UlN19^igDNqI}3xsF@Ao* zj=u2laWQZRFtM=V;CVW5C*U2>{rvjEz{bSF!G+@;j=%`v;8_wl33v)+_Urjy|Kg$_ zEYOL&EWqgCnJzFG_?HFa?p@d+?8NuGcTew3GT`ns5n#fwFfbc17@A-w_F=eqSjKR; zC??8VnnQ-OJ&kBTmB9>~jf6qSOyt`gO6|87%2A|djZH9@yYjjWB&Ro!>ROqY1@<|Y zc|P4G(mthFSx+S#-!Mn8dyS3^ETUjdRAj&UIql~S&E5+R@66)&C29)F?Sy-m-fmrFjj`}75A z#U0`pyj^w}Jn#_4-||4(p0Hr(zTObg<@h{(A+|jGdrzzt^sksBg=A19CU2m;|q@V?(-Q-TUlUHCcE>k7!N!Q88=Kd@gvmHAV_*V?R zN)s3OQ!d<})?>Y&3!RfW5R+#OM#n&EN(jqjk3PEK0z7ZcUYu)B7S=2Vo-*QoNoCHn zw@GBdFntXheD%!tA`GJ$<5XH#(337KtVKju9-?hsD(4U;Fr8o=__^`&>jU+xHuPUx z)gHq2tu1#E?ICdG819;K7EXX(_bCpU`;0zj6^>9*kVL8@Z05s-n{0 z5%j%t)VuM_a-GwVRAceS^+OoF%pr_@=(cg-7kl#MVz(AuXj4h}TM+zD7v*5YWUw1@ zcugl%%y3{*?J(R2vfk|@2Y%eU_?uy-#btxv!)J9j8cAhuA=GGOPN}P*tT5q=3#n{* zS|l)0X{JLMwak(dp}5=#{o}@TlJ)l74~H__P1{z|61w{qU&{J% z?lfX7g*|Cfh8cW~y9<{3s{WQ)XGGX-5ek{~>uZz2sO?l>3nSq-^WKlL{%$~b=IpI+b3}vH?rA4U|84`l&A1d141Arr=m8v&nim7z^G_L#>Re*LqX;SlZY5E-z6<=Gjq!T(CYC3 z1z?bY*4?>XxivmIddt~qxxT9M5EgL=3knw(+^-$owB0!^5zRp&v3 zOMEV?+A*vsQ4cBh@!e8rzC_BHw%)w^RTLs^#lc*oKy8*iMJ$Z1y5Lz2j>(DE4c2(C z1sY;HZCRHO)CSxIDEFF@Axe##LN6W{_RQ@Y+*`khZ*3xu6YzjS>!Yv&@|8FBl$$ks zgo5-=I+Y?}bewNN$A);cz*AH4G+8(m0(6x}deZ z44=nrlCxEMavdMr+i2e>r%uztdFmgLCf*~yNE~k>P7S}infXyg0lA6GFx{7c{A3>0 zdQzUK#U?L9lTzVw-V(PZe#yx2S($hOV*!2F1vb%FO>aIK;j`Ll=Uys!$eJdPAJXii z?nRBMd`0gxL13K?+w1<CvsnKCQ)ZGB}`NLRl94D ztUvT$l%qFotTR|7%YHf-nc+8dHO2NjC|5E6a z6*#SyNur8-rPIKohUc4@C1U~YkOgYd9^N;PjBw^q<;BP$e2bi~jofm>l&1g)8U0|mE{Q4mqt~RertE&QOi!2o9(B~{F!a02`znU zM%Fhv-El$K6zpC`4-~CE;!Bdm``@Id1dtX&9(qL@UcYI$Ko-wcMMZ&+Z+3_5|!PQ8QI%Oh7#>n;oaizjrJ(G_ET9ua(s8Z2v-oc z{pewsq1IpP?n|vrTK9_7!eZ|E^>?|x>TX#LYFz2l4(+q)I~L(z)ZVOz`)7>z;=O;o zwUMIF+8E>oejL7iPS46{={XApISL{t%+GSzV#Zxh7) ztoBDKKfm5!gGKeZ2)Zf|%X(Fms&@90$8ub7l;#{++ zGl5-augrriUaXKX1!*5%H`?YDUuK;TX*mwwZq(HUb@*GVsNf0(7A@N}(bjj~Q8X#2 zmueeSKIAZ^q*g23Y+S}Vj{E^JZtAW}Rf&wLK@VSMSW1_Ylf$c%M6C(4@g~93TVUnuX#LAFYJR~59Ig~d7oXzcM6{x~h^X#KbW;?Gz#rnRFGqAO3g^ie6_UIzJ zDV!}p^*V9@RHO~eDK2@ z`>Qy08dCeZzgc<+?7tr)Y!nue<#`hpq&3WTx@z@m`)rK0%zZ_Eo6My4H?(fgITx!R z-=a8zMiqcYb4D_ApPJ>h@R}bMQr^b`~M6~TKSj}8@@ zs_BUqyR*rMJWMNv&YJI^KR$ui6+jSS)hojno+3PJfAuXA2eJPu+QMRu9sm&WfRh4^$3@mkm*J=oraIo z=Kt2&;nF39X`ht9ex4}CWisN(XYJ0<8;bAFUmu&lXnY-_j$&KNtk^Vs&>*vJ+?`Rq zFE~4}%(vD5!Z=Uz!#>`S+_k)saib8>eldNc%pb9f#dy(K@rJyUa}`^xde@xHa|)p; z=uRa75eZ>k=-NyEq7H_>+x%g4K}ua>pu25|HAVBfbh;W6%T?=Y$k}HL#NKe`mV3AC z5FmMsZ9ZE(DF~bS5dYnct;zwZy!Br&82TbhAoiNUY-h??36gyj;z{T3M$d3@k3(4Y zv5u;yko#6h>D|{EaFJf*Uu-FxEzE90_Zx>MgxMidzHPqXA*IWOG~iB45j>c_VViUE zvG9T=-o4}*tS{|Sovp2PXX6yuplTWD;KQ@~To(f|I zoR^kL>G8sbgR87N>P?$GO0&XPPde>Zr5eA^=yr2=0yk3)CI;$=1_yDq6T@MIcgZ_cvl=!*%6# z>7qWOEmQ7u4ZC3zRIgmZ=ae>xP74)zJ{MXtRil#PyQYd@?nXmU+i7I5EN=r8`oxCm zep@nEK_s_TB*2w?l>>i6QewHmoEmtqnDKS}JYP-E$N@C)pcfngkCJq@+wK$_UqKb+ zDTBA-vv~Q^h!{# zjb)X~Z@;tg`o(n?)%{R&HEX4%fQrh{;BA|BGD_iLQZwl89Z^lJD=`3av^M3bM=F@mdIJbt*}Jv?UJBIl_rUjQhAM22Gr zyKHppGf)baiCda)%1!EeFPY&J;ldRu%w|L$B4+Bs*2VZ^JD3@6Yk*5v>XMw)C?FjA zEp3T#d=*kZFh5eL)cC@ z`W$8Sps7z#mZgb|jgMOX++-)<$8CstucDcEhcv{aM+aF~P54pI1Z$6VNY0R%?3|zm zorS}NP9k-r*^}E`6h-^$AKqTa^1SaTJOVn2@g^bDw%qk8uE9E?w#X@Jj&|+$W;hhy zJ5EO z)FssO1~au>nB$aq0$!$@R?Mj=GCW*ta~Q2Pg7ac>mdMXw>!tiVz_dd!e;m z*mg7?5d3ZhjZs?C_~=W6@NSl_;IE)vky8y`^#Qse9dr=>8PGvKnASVfCftbGqS${$ zYMzbmAj5eGCXr+&E;XZfB};(z4`KZezMZnFVm4OxD;OQ+Ue#PLi}n0L<6&oc5r@=9 zbcv0R${(1hL;}0b<7hN$9JTM7?cG`0cvQwuD9}33uL%zeA{Fn9V81B5`)^QDn`KQA zi})`tkcG+sl25oeVT|!nGe8=2hO6erI6y*^7`k&f%V@cx_t%S^NJW6^pN-L&K`KS+`uiaTN|OhWd-%y!Gx_jp6_Jc(OG;( z`a#NfSp?~b?)SGujdK+xzWT3huf*F+NRFt39PGl&POFX4MH*lcnXh(73$@9A(yTlZ z=C6){VHmQfm7L)uuX?b8!eq)-n%r31;(eEbllGFjQ#Ex|ITNL3RJna#9HYL=9KHnK zBz`Qu%v20sV6k&#P@s64T|54EWAOuaAT7CGhqs^4U8!($(g*XW=kqNOXy)YQ9&tH6 z$`R0EpbKtvV)Sp$p{4hwl=f`8SjS_1^1XyZZTO_6Xq{*SQ3`P+?Q~Rl!h@t#!nn)l zu+}j>L+cwI>e|!hKUPYYZ{WQlw#Spz96Bd4p11t4Ygr~gYoO=>Gh|(9LzKE2D*s_h z!qI;9Nj~VAj=)i&du9L+79C`gJos@jJ_C~!R`l6itw5FH0~9z^Ip~4FLBY#x4mlki zCCLsXT#hyU9V8^SA;AoZ?emKn`m(Btu_q?B)TiBEi2yW6{X|19Xb((4N&jjOjj4v* zq;-|i=8xx|yJ}ynR|em`I_nREh-7{&Stf3o27^WpamZSZvicH{C3m;3HwBn1*)+QWUg;QnFR(^aWhTodzth2yBp6z6AGVw zwm}Xw6L`atAL5vkMdQa2Ik0Y#%HPN>E4*x9DB0%o?IJ!J6Li`E5GG=dB{lcOvjpN2 zfc66^!oUo*7Y{iISEe&tXSmbcld{}udQzmVYghYRTdj)9BDOurAD2C=DMGwC&FZ zJ!V2(O8pSFk8x6D3?p2zKZj%0ysV^hcyQ47L?~l66trQamw5|94wo_Y;$dicnvtY=Z7!!XT**3G)920ZUw%&)#9;0thF<^ z&SeLG$)mLF$Y$=OVB1>FW6Hg3IcIDpMmDJ~#%+92_)96sek011m%gzMzA)sPIw$Cw zW}e#ANv4jp1j-fi>eOo&kfc_r1vO!;RSrhpILA7HOpupZGV+saR5Lrs4cPN040yJg zD{9;ixz%3D?!thh0)k}^{&i8D>Bi=ex zjx0F|ufBNkVnpcKlKq#>8>tjhzBr~~KyyZ3GBogqG$(}!5zw3y*&D0JbA~eD{CmWM z0{mM-J0n0_bi06Lw1CzM^a!w4M@{mjSG0|a))}}=OK4vND>GuYCdzG{>6KL`4o;XN zg*KhAk6rg{+vy4I)M;uSi?Y|r3pCvPFFuy2`y2%`tY7p2v|8kQ42(Ps%XC!(ok5qe z1^W7VVVUl(SGr$REkav9yR}rc4S5Y!2j}!Bv{yAsU-lZ< z6)*2rr`qI7LESJZ4(f(aITs6WQQooYmF{x)0z--sur?Y3KB<909r#%6Gr`i|rEpo~=7ti-wA#DA9*+b1G@ ztutaR+qh35R30Wxra~41O|gyzI*V3eN?CmE8aR&M7=$=g!p|b2dUOPhpb*XELcp;A zOdZO!ggeD>Nx}ZX34<7X!2Vqn+^r*V1ridYuagcJNXQEQvc@7+hK*ASXO!iL1*q;h zU@C!7ZAxFO9kWfc1skK5{zZ2=-H^`7P?RxOtO>B^_WoB;nw3;hxTj~tuR2wZp4r{q zWE&)ueJ;4#x0-#+;&C2fPIvt732oLY@WP`wxp{iR&}L?o@`fBpamxT}*Mg@ijDecz zVG2;BZl|sz^k*5;7y2U}>>xMt0P!I80`Ehy4sE{R)|0>>RO@OM{T=PCP%H)Z=on@v zO##oP8U^w=O;G<4P#y>BALMc0MOOOrH8M7iVc?eqB5c_5()7=?g#?M31%IeE5F`|D zmuCA1V}PFfeySVjx#M2{eKG5_n6h<{QP6e7c^%(lVmtL8*=V~SBDlh^RVyit9c$P> ziX}c*Mr(L$q`oHXK)i0o_B=YTIGz>ecK>+g2=%#Wu9~H9G}talNoQI?8?>fUBm!-a z1}E4m2~)0}`CKlY82Eu?G%C1UN2ngV6UvxverC+p$Mf{uuC(RU<9?};5FPdl%t65x z%dePjJgI;WnD~d}r>TL7&-GO%;?_`I_4@#{Hq)59AAZ$^bY-c0PIm4x&9A0;gi=XQ zS%JSm$Iu0poAw58MXLIbTywh~mG0N~@*yDpt6r#RND4}1XWef2g#0Noeo5|}`ukGn z^D}J${30F-EGEtR#(r~5d{O|efe2772omb~KuX;S;<~x#&ftpBI>XrsN~vQUfx`jw zig+AOx_{((pKP|PntukkuUr6^ZxErmTxc;J;&NtRpm4g;dcS13QDOOfC{IJSNc-*X zmtKzoE6ULQ@7#4-X2eVY!P?8$MNOaj1Np%qp;x`eqBOCaVicrX)aZ0erc)GhZB$mk z@B-Jim_KwWQI*9)9zTNLMZhK*qwtEJ9g&~g)zPHhnXCK?_r|#2(mQ^@1vI{h{A6a^ z>UxE!H9s${+yG?cj$QlJwIn+`f*>JM~z1rnx$ zQ1_ZJFi)|18l2e=<|)o_24yf$LCX~jA?{Ngl~sutsh-c9GL8~%fyr#m#oYyqdhbVp zO=L90I1%Swb~>LzcB3aN!Qilr(d1WUGlxrEpiZX@G#YBxU;Nx3epo62T!^2M<`kD zIgQt~9m39xy9u%#6Az0X`4ZRO>*h|2315q_#BmxK;+8o+{_>`ra!+QDkjdP!wo)XI zj&ob|%$Kk|W;hi5AA=AlnlHGE0}63;HFNAAbLoXU%b@R>daI3g!Z3B3>R1{=dH>So zLarxhCxp`6-$9RM{+T<2P`!Y+;2$bg1U;v#0;*m_q@a74&#`g6w8k%RwA6W$P4&H= z+j}1zG(Ml2r2bqT^r*;}+KsW){Yy!UgXG8~t7?U>Bl1DO2DHhiY;xB$g14Ja3V%-B zQU14Rq2KDm)?lo~!`0%R^{_uu@|>WkVK$Mf)!)b+=PQ@nItM0VvbGLsd!t?>J(W4B zfHNn44wt}8A>>uuBWR}JVNS;nW(p{#G%$&Q>I@Vl7(5*fHYD+HXj2!7ZV<*kph{We zhJ-FRV$rKyy~Y&GMWEz;=l^$>Wc;7OE&4P^rgvbO-?Kk4+JuS?=`}-hG6)EE03VhY z1z|&JJ~+xPVd`F|p;D&^Q_T(i+q9!o`V#ci6%1C@+#{x-!D6O2O8P;~S{F|~aK$k7?tj~-yGhM`tvrA zMzH@F^@AY?n2a--O-4-tLUYMWL(c^z#RU&CN`pATljt1Bb_z@qK#mhSEe8_C$p8{Z zoujDQ=P^gm9RD#XCwPn}0fD4HI})>hPp4)SS)1EL^ub16e^*WZrS5bHa9Qhpf^?$5 zWmWK({*0i{a(Gne=oz&`Y43#q(5-pZQ0Q(Ark*kU5l1j3xN*sb<3j&ybC3+>cJd#y z-IPF1vf*m=2aBGBh8z`T)kP?BF=6XFM))ONLpr|bl{tj1_<;|QNRq%XFtIUk;J9!s z7#8%wK1?_{3 zxfJ;DNVH%I_Nbdbwr08>-cEA6f5i_$TUwsC3cnve5R=W1O z7DM4Tls`SWs5$GXTRm1}v^GO}Q;(4XFNdAst@Az2GPjE${;B;^FXF4{j|M6gaJAObxyr^<2Gs=yH#l0p;^=?mp zrjsUk)!;_|TwL__dXW~xv zQfpor6aOP2dsDV#LM<&*{1v@BLC}vDld}2AxYR>6eMVfj{V&TG^qsySH z4l_e)%}fum>Q%L)lvyryW)^-+bJ*hq=uT^u%_&;b2~!Hf{4>(o0;nNH1P~Q74%8B`iqt#nsee1vbuJB%;yb z_Oi`QpZv3i29ufA{BICSH{I@S+yCGTiR%_p<{6ndF;+5OFyP`^{(iS>bye!DjR6e~ zXRi+G!Oe5aHqLLS|I6zp(fctQ*Ff)g)>^YLW;z2ETUXNq z!Cf*dXBtlkGWi3h`PO$sVI@0 zwiEYXi$@)kSVa0oR!=_g{n6<*Lt3I6$L8dtydGOw7nChUq~OW5>t@gZ_GR+I<#=wsZEAq zM%hj5<7?I?iyIryitDC*H!p45X{5F+a*u`(Wc5UoXnZo4#FkKm)~-F;r1m-+!2@xn zqo1C&QzkF_eHImuae8IXk4i{lk6?6daEyR^=0%_$*_gE01T{+p}GF9B*-aFaMH1*HMv?N~1w6DXBPY;OD*5$De#H zo<*WY=GOB&N#DdT@BRG~r6Eu)UnTF=?)A2t939ey$Fu5%HO+x8*APpi0|k#~$q>CC z%|Flg$8$85#KMw_ebCvuyR1|6qE=S0SKe)_WxrmuT%DFa`q3=*%FwPQIY)whjOp`+ z)3y3basRmBpV!~`or(gWIC#RB`FXmiISbwOhAf5|B{^0zSRzIc8NgPb(sxQS0P5LR zOU#7$#EOq!SWef#eGZYrH-@5e~QBwe3XW z(&~Zj57y8Z1lw;A?q~0lG`y8xxYm@5@=l~(&GCGi|CW#?Abfa`g)Rgyuoy=6Ns@X~ zued&8-dwAG1kV?F)P8lC(_i=8RuK%vqI1%Mpsk_L3!wc!9p>o1hSB%cCv2J*&gPFx zn`sPM6ow=YslTe;H_`Cz0SUvm(4{)xQUZO199uS>1&`f@Hv@C+kJ|KQ9d%^{r)5Gn zw|q1v{>MtESH`6+lhK{m3uHBeXOID)Eo@B4+e~@$S7sgnT`PF z8Ggmz^JAtl1Q|&-SAV45xATCVmThEFea!`;W0?5#Opih52Q3%fUwzN(zMidpueWS- z>F=)j7xq9|{o4wCQP^9$ztaCV7H^Fks!}DZJyk*dC|Ro?snW~dx+tN!muS>`2vZfJ z_6E@eC^WoKMr!Grl)&ZfAtU zITGx2WNYJ2*BUH_)fqfOfwN4md>C6vZZAoXjq2!Eb-xh|p|?=)Cwhm!0w^Q*E@$0( ze!XDmiR=3NT>{YKY4i&pg#5sL-S9AVr_^)SX-|Re2)MT);DS~Fz=>`JU%O1{xzJ=o z1@)Z)NqITYcf?$&M}&^WyPr_{hcPpokf@my)&UN7b{R|P&jV|(NCi)vPg+Up4W4DlRAiIn@2 ztP%>b(x9DjgTlL;0Y6E^1{DgZP$VWO6u?D@UBHmt?oSF#ma+bRt7806$9sinpcbG5 z7LfML*+{YyveaHT$OPSyg}j=&JGdP!g=*1KNXTb{&WRW5^Oy8t_%8JHM}+&Ypm2vk z@gV5G$(C^l9(B{kpy%7}I#W?1-+!P~8Dd^9)IpNJ;LN%Gfby27f1K3Ek;^>;hcLLP zihtl@MEU_)dHTw}u44x|j$N!Q%CmkXoQ_!$uOK(Y{@kWYQO`8T75$XTdrGq$s{1|t z87cwJ7D6`hC&sb?r~#wp+DGpU79v8%C2qVb1B+Z}yRU zH=mgy4J@sYoO+S%xypJP3#HLt>Fk6SM8|vxz(V19VC>ileXgAKS%MhJgG#~oyr-}{ z;#t8y4H9{IrD746L2=p3+tKp&XKv@IveEh~#*IX$*85uXO2OzhlwQBemHWF^M|xI0 zdW0OmgoQ+P3p!pco{H-5f4NiE;b zZ$OJYS&5YcKVPCZY=zyf_x?O*m;QZrbBwq$u^#sW)^o+meIC4j4w6-*guf#?9p{GZvQ=yMF28O5M%(C z4IzGV=RdA{Y$?8szI<`S@8gTPo4bYu1JBhiXf8-v&lpX#xmOBLRMi&^XHMJQlj)3^ zB6|W;y$kB>?{e>0Nlps0y#4LXignrO^Xv*wNtiD&YJagofWTv*ihaFPw|;)NJFrCJ%UH$ZG6vQUaOJ5m*0cJ^0lEk7~JG5Th`P? zKY%no{qxD$#@Mf1VvV5>+_pZ3-8XP*QwP)%JnycR-wKhDX&yui6R*CXqMK-wt+{nw z;Sz8GdBAVTxz`lvPU%+F=NOcZhTH>E4~x8-O4DDKpma2j67m;7A_i6yLW=quphEzG z#X6ux|3!4$((1ld5HAoN$vaX+c{)@4XkB;&h)3pVKvd31#w=Gyq39M#(e$QUbVJy_jF32h^zgECx7T?77EvL$0 zOo6)CM}<|2P@T9Oed->>9UEINl$8RCQXn zLH8zK29N_{*F7mE4Eq3u0-XTr1?ehwxupdYRXFDcG!L*v|Dzt9EHZ;|KnW2Ir(R3z zLBO1e{F{9P3Cq9e0TNyo7Im9CMO#(9o;{-|SKtr?QDsL?qEI0=ATly~b7*4x&V`D^ zCaKUIf=A`_2LYild{P#>d|_oFtk#wU-EtN8xScMS>bqQevDA5SEy;ou_1iP}gt?5| z4)H7L7HXLSOk+w3BtGU&A6}oSqK;I<@*9IJhow_!MAgj5+yIoh2 zAhZu;B=XL?b0*7IQIgF<`#|r3Z#hN);`ktkhTOY43CX%2ks5CgW`_kD2i_>eqs*uL zWWMn*%^h&2*Id0b4jC;8dKu#%^V1`Z&7r3IvWR%vLl}PiIi>jnky%=Wm@FZkL)cX{ z92ye@sjlnAX%gBIzgHw()K@tAbj$X^a zv+0OwYooG?PF(IEj0!ou0n|?yI5`^^oe8=HqTr@m#5>O)d^z)0R(yXWsdh+oOZS`Q zPX#bO^tsRV*-J=H;$McbHd%HpO-q9CCG{qx?r@PmaaL4bfr!by`e_J(V)ro66KnpD zChfanA{Yw1x-OJB0NEq9&U5m~pDJ~z2rT#p)JYi@1b{*XoVz(dESCT{ml-qV{=N?q z1w_=VyaGcjGHzV*vO<)1nnG>Ync~Hcz{I1=ITF}ZO~CYjLF?;2 zAbkImzDfOU^dbdwA{*B_0ATcfYdq=^DTkJBOWOHlcR$KIW6L%FqB|!uK=*kczC8pe z^KTcnwzmWHLK7C?&^cT$M(KVu(AuIu-U^WJXGD9~zs`|JXxK+n>i=01W}iVG zr6@<>wy{meMso6qPWXalkxYfsBWxs)NIFQ>+x9sza$KPV8Dj1APcNz+*Q)f9@dLL; z{+F1cABq{a%GR=xL%i!!rQfesmDQWcjCv^S@GNyl4tqusw&{caR5|5LkTjh^z zX+R%Ht(Dm`;4>VSUznlvA{TsnEWHS4$EBxd{#?{px9@GucSuuBjIMY2M^rLXeQaKYy$kR|hq3IuZRO7x-jYE?3+5MwjMUAz| z+UsAFkxr-xha_((Mcfo3xUJ&3){Dxuo*Vmu0C~%hS5q#?26B(esp!l*V^B_iCCP$B ziHq5is0Zw4!LS+xuZ2vffCIpak${NF z2qZd@oJEmOA_a>c49K*9?gPDt5%jP5*6eMy*NR{7$Zu`)N3C4hTaN(I6BHf?gXk%) zIxO4t!<{^VMbJG!iVkE0=^r7t>>^0g7ZA6XqCmO?ZnW%6qwdL^+UqQc2jX%v68<2& zTBcem9SsFdCMvpT&YT-AA-8}iH1uxYTf|=J-x$A88pAhaTt$fm90iD>nvHNgL;C)c zK>q-ri_8VaOBgadP#1>k8OWiddS2ZZEa4I0*`-hRzP8Puwj2iq6+h+CAS&xf9(BA| zOdi^?6Z=3-=<87>ayd-xh^)S^d>Fl<0m&~2et>}fa)L%*(vF-UDZtyWoSEqJ^Xr8Q z@d4q#RU}Bd69kK)*A@fUND30my>SEOzy15K(E~b1-7(YYo0%RcLi<|Qd)*)frL!4A zLOpvEY}>wI3KrdU{~I7K!`h)zJeCdoF_!56L&;M+Q=JE)k8p!lp0#AlI2aLRd940xO8)2c;q%_wa_-fq4KiT0YSH z;4?Y@h~dHwAgk0kn+&Xy{$5Pwk7?zX9UYzMNy;Ch2pW+5E(Y|2Xb@+iprjwas~tlU zo8E85?$4g4)vQ`MrSLnT0;4d;UUd*IgE5xMK=zs)5*lN%(D|Q4fm}@QD9Sb?|D^q^ zT>1W1=HzAnOaumOPdjyCLE{kSDVwtf22gBWH=2GQ1Xbc?Cs98o2Qc8kx%|)b9Q#d> z2wwviTJy`-K-u)o-`Vu{3^3C~kisy)e}~7$!i4|)Pxa7mI>Evw#bG2P=abeZpBmvzi;Fz^^9|;={p08WvC3Y?8h*Mmb)Au)n#!f~?Z7 zm^h8Nwu#)$eeMx4t02Rv=Km$2x?*~9XIs%GUoWBOQuaOZk;mUfItJ>m6ii5*owGdg zUWZ1T9tJ1)p#K@!zXnertNBD2*YO}?A*|@jJy^$%qAs$3n53oR(HiID*A<@%g>Lsn zNQ<4-tFkqrW%lFY{3ux-7U-9&cH%OVl<_;4Q~5R<#EvS*7~D|DNuH%==|zgTdiZ2veKD@y07V|$L+%OoSyy2p^|K;kOJ?HXLNf&l|! zXF9be{VTevm)=RB+Fi#^MzooQH-G1%=X~%b(95*qLnG|Pov}k0SWs55pjgnKU+W2e z{|#7BQZONw<|kp2xl3`$9KDv{*U3o1_B`L^i{NL8Rj+(SNq;wC+0n6^h`M1pMLiUxm6zVxu^+(Dx0;X-q zTq>8_S*A7W8(3U)c~eXqzGG$a`R-OiC#P=WSEfxkG&=-_PhOeqmGvKK*CVHjxOBZ@ pEwzL`>i*8R__Kv1*C}gmHZq>QI%40h(qzO Date: Sat, 13 Mar 2021 16:38:07 +0800 Subject: [PATCH 036/126] =?UTF-8?q?job=20=E5=8D=95=E5=85=83=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=20Demo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/job/vo/job/InfJobBaseVO.java | 3 + .../service/job/impl/InfJobServiceImpl.java | 2 + .../infra/service/job/InfJobServiceTest.java | 78 +++++++++++++++++++ src/test/resources/sql/clean.sql | 1 + src/test/resources/sql/create_tables.sql | 18 +++++ 5 files changed, 102 insertions(+) create mode 100644 src/test/java/cn/iocoder/dashboard/modules/infra/service/job/InfJobServiceTest.java diff --git a/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/job/InfJobBaseVO.java b/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/job/InfJobBaseVO.java index 2df3ad823..352c490fc 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/job/InfJobBaseVO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/job/InfJobBaseVO.java @@ -34,4 +34,7 @@ public class InfJobBaseVO { @ApiModelProperty(value = "监控超时时间", example = "1000") private Integer monitorTimeout; + public void setCronExpression(String cronExpression) { + this.cronExpression = cronExpression; + } } diff --git a/src/main/java/cn/iocoder/dashboard/modules/infra/service/job/impl/InfJobServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/infra/service/job/impl/InfJobServiceImpl.java index d82207de1..eab60051c 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/infra/service/job/impl/InfJobServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/infra/service/job/impl/InfJobServiceImpl.java @@ -13,6 +13,7 @@ import cn.iocoder.dashboard.modules.infra.dal.mysql.job.InfJobMapper; import cn.iocoder.dashboard.modules.infra.enums.job.InfJobStatusEnum; import cn.iocoder.dashboard.modules.infra.service.job.InfJobService; import org.quartz.SchedulerException; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; @@ -37,6 +38,7 @@ public class InfJobServiceImpl implements InfJobService { @Resource private InfJobMapper jobMapper; + @MockBean @Resource private SchedulerManager schedulerManager; diff --git a/src/test/java/cn/iocoder/dashboard/modules/infra/service/job/InfJobServiceTest.java b/src/test/java/cn/iocoder/dashboard/modules/infra/service/job/InfJobServiceTest.java new file mode 100644 index 000000000..e8ed0dfc7 --- /dev/null +++ b/src/test/java/cn/iocoder/dashboard/modules/infra/service/job/InfJobServiceTest.java @@ -0,0 +1,78 @@ +package cn.iocoder.dashboard.modules.infra.service.job; + +import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.dashboard.util.RandomUtils.randomPojo; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +import javax.annotation.Resource; + +import org.junit.jupiter.api.Test; +import org.quartz.SchedulerException; +import org.springframework.context.annotation.Import; +import cn.iocoder.dashboard.BaseDbUnitTest; +import cn.iocoder.dashboard.framework.quartz.core.scheduler.SchedulerManager; +import cn.iocoder.dashboard.modules.infra.controller.job.vo.job.InfJobCreateReqVO; +import cn.iocoder.dashboard.modules.infra.convert.job.InfJobConvert; +import cn.iocoder.dashboard.modules.infra.dal.dataobject.job.InfJobDO; +import cn.iocoder.dashboard.modules.infra.dal.mysql.job.InfJobMapper; +import cn.iocoder.dashboard.modules.infra.enums.job.InfJobStatusEnum; +import cn.iocoder.dashboard.modules.infra.service.job.impl.InfJobServiceImpl; + +/** + * {@link InfJobServiceImpl} 的单元测试 + * + * @author neilz + */ +@Import(InfJobServiceImpl.class) +public class InfJobServiceTest extends BaseDbUnitTest { + @Resource + private InfJobServiceImpl jobService; + + @Resource + private InfJobMapper jobMapper; + @Resource + private SchedulerManager schedulerManager; + + @Test + public void testCreateJob_success() throws SchedulerException { + // 准备参数 + InfJobCreateReqVO reqVO = randomPojo(InfJobCreateReqVO.class); + reqVO.setCronExpression("0 0/1 * * * ? *"); + + // 调用 + Long jobId = jobService.createJob(reqVO); + + // 断言 + assertNotNull(jobId); + + // 校验记录的属性是否正确 + InfJobDO job = jobMapper.selectById(jobId); + assertPojoEquals(reqVO, job); + assertEquals(InfJobStatusEnum.NORMAL.getStatus(), job.getStatus()); + + // 校验调用 + verify(jobMapper, times(1)).selectByHandlerName(reqVO.getHandlerName()); + + InfJobDO insertJob = InfJobConvert.INSTANCE.convert(reqVO); + insertJob.setStatus(InfJobStatusEnum.INIT.getStatus()); + fillJobMonitorTimeoutEmpty(insertJob); + verify(jobMapper, times(1)).insert(insertJob); + + verify(schedulerManager, times(1)).addJob(job.getId(), job.getHandlerName(), job.getHandlerParam(), job.getCronExpression(), + job.getRetryCount(), job.getRetryInterval()); + + InfJobDO updateObj = InfJobDO.builder().id(insertJob.getId()).status(InfJobStatusEnum.NORMAL.getStatus()).build(); + verify(jobMapper, times(1)).updateById(updateObj); + + } + + private static void fillJobMonitorTimeoutEmpty(InfJobDO job) { + if (job.getMonitorTimeout() == null) { + job.setMonitorTimeout(0); + } + } + +} diff --git a/src/test/resources/sql/clean.sql b/src/test/resources/sql/clean.sql index 75372fd1a..329a94064 100644 --- a/src/test/resources/sql/clean.sql +++ b/src/test/resources/sql/clean.sql @@ -1,6 +1,7 @@ -- inf 开头的 DB DELETE FROM "inf_config"; DELETE FROM "inf_file"; +DELETE FROM "inf_job"; -- sys 开头的 DB DELETE FROM "sys_dept"; diff --git a/src/test/resources/sql/create_tables.sql b/src/test/resources/sql/create_tables.sql index 36c573dd9..f4908a710 100644 --- a/src/test/resources/sql/create_tables.sql +++ b/src/test/resources/sql/create_tables.sql @@ -29,6 +29,24 @@ CREATE TABLE IF NOT EXISTS "inf_file" ( PRIMARY KEY ("id") ) COMMENT '文件表'; +CREATE TABLE "inf_job" ( + "id" bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY COMMENT '任务编号', + "name" varchar(32) NOT NULL COMMENT '任务名称', + "status" tinyint(4) NOT NULL COMMENT '任务状态', + "handler_name" varchar(64) NOT NULL COMMENT '处理器的名字', + "handler_param" varchar(255) DEFAULT NULL COMMENT '处理器的参数', + "cron_expression" varchar(32) NOT NULL COMMENT 'CRON 表达式', + "retry_count" int(11) NOT NULL DEFAULT '0' COMMENT '重试次数', + "retry_interval" int(11) NOT NULL DEFAULT '0' COMMENT '重试间隔', + "monitor_timeout" int(11) NOT NULL DEFAULT '0' COMMENT '监控超时时间', + "creator" varchar(64) DEFAULT '' COMMENT '创建者', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + "updater" varchar(64) DEFAULT '' COMMENT '更新者', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + "deleted" bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY ("id") +) COMMENT='定时任务表'; + -- sys 开头的 DB CREATE TABLE IF NOT EXISTS "sys_dept" ( From 9c71274994bc74b2f908480414e2ecd040a39431 Mon Sep 17 00:00:00 2001 From: NiuXing Date: Sat, 13 Mar 2021 19:13:01 +0800 Subject: [PATCH 037/126] =?UTF-8?q?I3B7FG=E4=BB=BB=E5=8A=A1=E6=8F=90?= =?UTF-8?q?=E4=BA=A4;=E8=A7=A3=E5=86=B3=E9=A1=B5=E9=9D=A2=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=E6=8C=89=E9=92=AE=E7=B9=81=E5=A4=9A=E6=97=B6=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E4=BD=93=E9=AA=8C=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-ui/src/views/system/user/index.vue | 1466 +++++++++++----------- 1 file changed, 751 insertions(+), 715 deletions(-) diff --git a/ruoyi-ui/src/views/system/user/index.vue b/ruoyi-ui/src/views/system/user/index.vue index af2856b34..021716b78 100644 --- a/ruoyi-ui/src/views/system/user/index.vue +++ b/ruoyi-ui/src/views/system/user/index.vue @@ -1,715 +1,751 @@ - - - + + + + From 8af60fdaa6b6c7dd4d9e73c18aedd6ee17a2f9e0 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 13 Mar 2021 19:34:26 +0800 Subject: [PATCH 038/126] =?UTF-8?q?1.=20=E9=AA=8C=E8=AF=81=E7=A0=81?= =?UTF-8?q?=E7=9A=84=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95=202.=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=20h2=20=E8=84=9A=E6=9C=AC=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/SysCaptchaController.java | 2 +- .../dashboard/BaseDbAndRedisUnitTest.java | 4 +- .../iocoder/dashboard/BaseRedisUnitTest.java | 32 +++++++++ .../dashboard/BaseSpringBootUnitTest.java | 32 --------- .../config/RedisTestConfiguration.java | 6 +- .../core/scheduler/SchedulerManagerTest.java | 4 +- .../service/common/SysCaptchaServiceTest.java | 66 +++++++++++++++++++ ...ToolInformationSchemaColumnMapperTest.java | 4 +- .../ToolInformationSchemaTableMapperTest.java | 4 +- .../codegen/impl/ToolCodegenEngineTest.java | 5 +- .../impl/ToolCodegenSQLParserTest.java | 4 +- .../impl/ToolCodegenServiceImplTest.java | 5 +- src/test/resources/sql/create_tables.sql | 8 +-- 13 files changed, 119 insertions(+), 57 deletions(-) create mode 100644 src/test/java/cn/iocoder/dashboard/BaseRedisUnitTest.java delete mode 100644 src/test/java/cn/iocoder/dashboard/BaseSpringBootUnitTest.java create mode 100644 src/test/java/cn/iocoder/dashboard/modules/system/service/common/SysCaptchaServiceTest.java diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/common/SysCaptchaController.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/common/SysCaptchaController.java index 13e84dc4e..487389331 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/controller/common/SysCaptchaController.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/common/SysCaptchaController.java @@ -21,8 +21,8 @@ public class SysCaptchaController { @Resource private SysCaptchaService captchaService; - @ApiOperation("生成图片验证码") @GetMapping("/get-image") + @ApiOperation("生成图片验证码") public CommonResult getCaptchaImage() { return success(captchaService.getCaptchaImage()); } diff --git a/src/test/java/cn/iocoder/dashboard/BaseDbAndRedisUnitTest.java b/src/test/java/cn/iocoder/dashboard/BaseDbAndRedisUnitTest.java index 59bacb052..43d28da9f 100644 --- a/src/test/java/cn/iocoder/dashboard/BaseDbAndRedisUnitTest.java +++ b/src/test/java/cn/iocoder/dashboard/BaseDbAndRedisUnitTest.java @@ -15,9 +15,9 @@ import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.jdbc.Sql; /** - * 依赖内存 DB 的单元测试 + * 依赖内存 DB + Redis 的单元测试 * - * 注意,Service 层同样适用。对于 Service 层的单元测试,我们针对自己模块的 Mapper 走的是 H2 内存数据库,针对别的模块的 Service 走的是 Mock 方法 + * 相比 {@link BaseDbUnitTest} 来说,额外增加了内存 Redis * * @author 芋道源码 */ diff --git a/src/test/java/cn/iocoder/dashboard/BaseRedisUnitTest.java b/src/test/java/cn/iocoder/dashboard/BaseRedisUnitTest.java new file mode 100644 index 000000000..a806e4670 --- /dev/null +++ b/src/test/java/cn/iocoder/dashboard/BaseRedisUnitTest.java @@ -0,0 +1,32 @@ +package cn.iocoder.dashboard; + +import cn.iocoder.dashboard.config.RedisTestConfiguration; +import cn.iocoder.dashboard.framework.redis.config.RedisConfig; +import org.redisson.spring.starter.RedissonAutoConfiguration; +import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.ActiveProfiles; + +/** + * 依赖内存 Redis 的单元测试 + * + * 相比 {@link BaseDbUnitTest} 来说,从内存 DB 改成了内存 Redis + * + * @author 芋道源码 + */ +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseRedisUnitTest.Application.class) +@ActiveProfiles("unit-test") // 设置使用 application-unit-test 配置文件 +public class BaseRedisUnitTest { + + @Import({ + // Redis 配置类 + RedisTestConfiguration.class, // Redis 测试配置类,用于启动 RedisServer + RedisAutoConfiguration.class, // Spring Redis 自动配置类 + RedisConfig.class, // 自己的 Redis 配置类 + RedissonAutoConfiguration.class, // Redisson 自动高配置类 + }) + public static class Application { + } + +} diff --git a/src/test/java/cn/iocoder/dashboard/BaseSpringBootUnitTest.java b/src/test/java/cn/iocoder/dashboard/BaseSpringBootUnitTest.java deleted file mode 100644 index fe615dcaf..000000000 --- a/src/test/java/cn/iocoder/dashboard/BaseSpringBootUnitTest.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.iocoder.dashboard; - -import org.junit.jupiter.api.AfterEach; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.data.redis.core.RedisCallback; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.jdbc.Sql; - -import javax.annotation.Resource; - -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE) -@ActiveProfiles("unit-test") // 设置使用 application-unit-test 配置文件 -@Sql(scripts = "/sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) // 每个单元测试结束后,清理 DB -@Deprecated -public class BaseSpringBootUnitTest { - - @Resource - private StringRedisTemplate stringRedisTemplate; - - /** - * 每个单元测试结束后,清理 Redis - */ - @AfterEach - public void cleanRedis() { - stringRedisTemplate.execute((RedisCallback) connection -> { - connection.flushDb(); - return null; - }); - } - -} diff --git a/src/test/java/cn/iocoder/dashboard/config/RedisTestConfiguration.java b/src/test/java/cn/iocoder/dashboard/config/RedisTestConfiguration.java index c93d766a4..29539dbad 100644 --- a/src/test/java/cn/iocoder/dashboard/config/RedisTestConfiguration.java +++ b/src/test/java/cn/iocoder/dashboard/config/RedisTestConfiguration.java @@ -1,19 +1,17 @@ package cn.iocoder.dashboard.config; import com.github.fppt.jedismock.RedisServer; -import org.redisson.spring.starter.RedissonAutoConfiguration; -import org.springframework.boot.autoconfigure.AutoConfigureBefore; -import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; import org.springframework.boot.autoconfigure.data.redis.RedisProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; import java.io.IOException; @Configuration(proxyBeanMethods = false) +@Lazy(false) // 禁止延迟加载 @EnableConfigurationProperties(RedisProperties.class) -@AutoConfigureBefore({RedisAutoConfiguration.class, RedissonAutoConfiguration.class}) // 在 Redis 自动配置前,进行初始化 public class RedisTestConfiguration { /** diff --git a/src/test/java/cn/iocoder/dashboard/framework/quartz/core/scheduler/SchedulerManagerTest.java b/src/test/java/cn/iocoder/dashboard/framework/quartz/core/scheduler/SchedulerManagerTest.java index a9b050153..a4dd5cbe0 100644 --- a/src/test/java/cn/iocoder/dashboard/framework/quartz/core/scheduler/SchedulerManagerTest.java +++ b/src/test/java/cn/iocoder/dashboard/framework/quartz/core/scheduler/SchedulerManagerTest.java @@ -1,14 +1,14 @@ package cn.iocoder.dashboard.framework.quartz.core.scheduler; import cn.hutool.core.util.StrUtil; -import cn.iocoder.dashboard.BaseSpringBootUnitTest; +import cn.iocoder.dashboard.BaseDbUnitTest; import cn.iocoder.dashboard.modules.system.job.auth.SysUserSessionTimeoutJob; import org.junit.jupiter.api.Test; import org.quartz.SchedulerException; import javax.annotation.Resource; -class SchedulerManagerTest extends BaseSpringBootUnitTest { +class SchedulerManagerTest extends BaseDbUnitTest { @Resource private SchedulerManager schedulerManager; diff --git a/src/test/java/cn/iocoder/dashboard/modules/system/service/common/SysCaptchaServiceTest.java b/src/test/java/cn/iocoder/dashboard/modules/system/service/common/SysCaptchaServiceTest.java new file mode 100644 index 000000000..ed127442d --- /dev/null +++ b/src/test/java/cn/iocoder/dashboard/modules/system/service/common/SysCaptchaServiceTest.java @@ -0,0 +1,66 @@ +package cn.iocoder.dashboard.modules.system.service.common; + +import cn.iocoder.dashboard.BaseRedisUnitTest; +import cn.iocoder.dashboard.framework.captcha.config.CaptchaProperties; +import cn.iocoder.dashboard.modules.system.controller.common.vo.SysCaptchaImageRespVO; +import cn.iocoder.dashboard.modules.system.dal.redis.common.SysCaptchaRedisDAO; +import cn.iocoder.dashboard.modules.system.service.common.impl.SysCaptchaServiceImpl; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; + +import static cn.iocoder.dashboard.util.RandomUtils.randomString; +import static org.junit.jupiter.api.Assertions.*; + +@Import({SysCaptchaServiceImpl.class, CaptchaProperties.class, SysCaptchaRedisDAO.class}) +public class SysCaptchaServiceTest extends BaseRedisUnitTest { + + @Resource + private SysCaptchaServiceImpl captchaService; + + @Resource + private SysCaptchaRedisDAO captchaRedisDAO; + @Resource + private CaptchaProperties captchaProperties; + + @Test + public void testGetCaptchaImage() { + // 调用 + SysCaptchaImageRespVO respVO = captchaService.getCaptchaImage(); + // 断言 + assertNotNull(respVO.getUuid()); + assertNotNull(respVO.getImg()); + String captchaCode = captchaRedisDAO.get(respVO.getUuid()); + assertNotNull(captchaCode); + } + + @Test + public void testGetCaptchaCode() { + // 准备参数 + String uuid = randomString(); + String code = randomString(); + // mock 数据 + captchaRedisDAO.set(uuid, code, captchaProperties.getTimeout()); + + // 调用 + String resultCode = captchaService.getCaptchaCode(uuid); + // 断言 + assertEquals(code, resultCode); + } + + @Test + public void testDeleteCaptchaCode() { + // 准备参数 + String uuid = randomString(); + String code = randomString(); + // mock 数据 + captchaRedisDAO.set(uuid, code, captchaProperties.getTimeout()); + + // 调用 + captchaService.deleteCaptchaCode(uuid); + // 断言 + assertNull(captchaRedisDAO.get(uuid)); + } + +} diff --git a/src/test/java/cn/iocoder/dashboard/modules/tool/dal/mysql/codegen/ToolInformationSchemaColumnMapperTest.java b/src/test/java/cn/iocoder/dashboard/modules/tool/dal/mysql/codegen/ToolInformationSchemaColumnMapperTest.java index 1b7e1f283..dfb64a8ea 100644 --- a/src/test/java/cn/iocoder/dashboard/modules/tool/dal/mysql/codegen/ToolInformationSchemaColumnMapperTest.java +++ b/src/test/java/cn/iocoder/dashboard/modules/tool/dal/mysql/codegen/ToolInformationSchemaColumnMapperTest.java @@ -1,6 +1,6 @@ package cn.iocoder.dashboard.modules.tool.dal.mysql.codegen; -import cn.iocoder.dashboard.BaseSpringBootUnitTest; +import cn.iocoder.dashboard.BaseDbUnitTest; import cn.iocoder.dashboard.modules.tool.dal.dataobject.codegen.ToolSchemaColumnDO; import org.junit.jupiter.api.Test; @@ -9,7 +9,7 @@ import java.util.List; import static org.junit.jupiter.api.Assertions.assertTrue; -public class ToolInformationSchemaColumnMapperTest extends BaseSpringBootUnitTest { +public class ToolInformationSchemaColumnMapperTest extends BaseDbUnitTest { @Resource private ToolSchemaColumnMapper toolInformationSchemaColumnMapper; diff --git a/src/test/java/cn/iocoder/dashboard/modules/tool/dal/mysql/codegen/ToolInformationSchemaTableMapperTest.java b/src/test/java/cn/iocoder/dashboard/modules/tool/dal/mysql/codegen/ToolInformationSchemaTableMapperTest.java index ff488972c..67e8f7066 100644 --- a/src/test/java/cn/iocoder/dashboard/modules/tool/dal/mysql/codegen/ToolInformationSchemaTableMapperTest.java +++ b/src/test/java/cn/iocoder/dashboard/modules/tool/dal/mysql/codegen/ToolInformationSchemaTableMapperTest.java @@ -1,6 +1,6 @@ package cn.iocoder.dashboard.modules.tool.dal.mysql.codegen; -import cn.iocoder.dashboard.BaseSpringBootUnitTest; +import cn.iocoder.dashboard.BaseDbUnitTest; import cn.iocoder.dashboard.modules.tool.dal.dataobject.codegen.ToolSchemaTableDO; import org.junit.jupiter.api.Test; @@ -9,7 +9,7 @@ import java.util.List; import static org.junit.jupiter.api.Assertions.assertTrue; -class ToolInformationSchemaTableMapperTest extends BaseSpringBootUnitTest { +class ToolInformationSchemaTableMapperTest extends BaseDbUnitTest { @Resource private ToolSchemaTableMapper toolInformationSchemaTableMapper; diff --git a/src/test/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngineTest.java b/src/test/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngineTest.java index e415b4f84..94ade49f4 100644 --- a/src/test/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngineTest.java +++ b/src/test/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngineTest.java @@ -1,18 +1,17 @@ package cn.iocoder.dashboard.modules.tool.service.codegen.impl; -import cn.iocoder.dashboard.BaseSpringBootUnitTest; +import cn.iocoder.dashboard.BaseDbUnitTest; import cn.iocoder.dashboard.modules.tool.dal.dataobject.codegen.ToolCodegenColumnDO; import cn.iocoder.dashboard.modules.tool.dal.dataobject.codegen.ToolCodegenTableDO; import cn.iocoder.dashboard.modules.tool.dal.mysql.codegen.ToolCodegenColumnMapper; import cn.iocoder.dashboard.modules.tool.dal.mysql.codegen.ToolCodegenTableMapper; import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; import javax.annotation.Resource; import java.util.List; import java.util.Map; -public class ToolCodegenEngineTest extends BaseSpringBootUnitTest { +public class ToolCodegenEngineTest extends BaseDbUnitTest { @Resource private ToolCodegenTableMapper codegenTableMapper; diff --git a/src/test/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenSQLParserTest.java b/src/test/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenSQLParserTest.java index 1c331dfdf..f47fce0c3 100644 --- a/src/test/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenSQLParserTest.java +++ b/src/test/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenSQLParserTest.java @@ -1,9 +1,9 @@ package cn.iocoder.dashboard.modules.tool.service.codegen.impl; -import cn.iocoder.dashboard.BaseSpringBootUnitTest; +import cn.iocoder.dashboard.BaseDbUnitTest; import org.junit.jupiter.api.Test; -public class ToolCodegenSQLParserTest extends BaseSpringBootUnitTest { +public class ToolCodegenSQLParserTest extends BaseDbUnitTest { @Test public void testParse() { diff --git a/src/test/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenServiceImplTest.java b/src/test/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenServiceImplTest.java index 603ae9a47..1198a52c7 100644 --- a/src/test/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenServiceImplTest.java +++ b/src/test/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenServiceImplTest.java @@ -1,12 +1,11 @@ package cn.iocoder.dashboard.modules.tool.service.codegen.impl; -import cn.iocoder.dashboard.BaseSpringBootUnitTest; +import cn.iocoder.dashboard.BaseDbUnitTest; import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; import javax.annotation.Resource; -class ToolCodegenServiceImplTest extends BaseSpringBootUnitTest { +class ToolCodegenServiceImplTest extends BaseDbUnitTest { @Resource private ToolCodegenServiceImpl toolCodegenService; diff --git a/src/test/resources/sql/create_tables.sql b/src/test/resources/sql/create_tables.sql index 36c573dd9..4a9d218b9 100644 --- a/src/test/resources/sql/create_tables.sql +++ b/src/test/resources/sql/create_tables.sql @@ -113,7 +113,7 @@ CREATE TABLE IF NOT EXISTS "sys_menu" ( PRIMARY KEY ("id") ) COMMENT '菜单权限表'; -CREATE TABLE "sys_dict_type" ( +CREATE TABLE IF NOT EXISTS "sys_dict_type" ( "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, "name" varchar(100) NOT NULL DEFAULT '', "type" varchar(100) NOT NULL DEFAULT '', @@ -127,7 +127,7 @@ CREATE TABLE "sys_dict_type" ( PRIMARY KEY ("id") ) COMMENT '字典类型表'; -CREATE TABLE `sys_user_session` ( +CREATE TABLE IF NOT EXISTS `sys_user_session` ( `id` varchar(32) NOT NULL, `user_id` bigint DEFAULT NULL, `username` varchar(50) NOT NULL DEFAULT '', @@ -191,7 +191,7 @@ CREATE TABLE IF NOT EXISTS `sys_login_log` ( ) COMMENT ='系统访问记录'; -CREATE TABLE `sys_operate_log` ( +CREATE TABLE IF NOT EXISTS `sys_operate_log` ( `id` bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY, `trace_id` varchar(64) NOT NULL DEFAULT '', `user_id` bigint(20) NOT NULL, @@ -219,7 +219,7 @@ CREATE TABLE `sys_operate_log` ( PRIMARY KEY (`id`) ) COMMENT ='操作日志记录'; -create table "sys_user" ( +create table IF NOT EXISTS "sys_user" ( "id" bigint not null GENERATED BY DEFAULT AS IDENTITY, "username" varchar(30) not null, "password" varchar(100) not null default '', From dd8b6cc94a460e5780c8029e9a920cece8bb0036 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 13 Mar 2021 19:58:11 +0800 Subject: [PATCH 039/126] =?UTF-8?q?1.=20=E5=A2=9E=E5=8A=A0=E4=BA=8B?= =?UTF-8?q?=E5=8A=A1=E7=AE=A1=E7=90=86=E5=99=A8=E7=9A=84=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/cn/iocoder/dashboard/BaseDbAndRedisUnitTest.java | 2 ++ src/test/java/cn/iocoder/dashboard/BaseDbUnitTest.java | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/test/java/cn/iocoder/dashboard/BaseDbAndRedisUnitTest.java b/src/test/java/cn/iocoder/dashboard/BaseDbAndRedisUnitTest.java index 59bacb052..aadf47bda 100644 --- a/src/test/java/cn/iocoder/dashboard/BaseDbAndRedisUnitTest.java +++ b/src/test/java/cn/iocoder/dashboard/BaseDbAndRedisUnitTest.java @@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; import org.redisson.spring.starter.RedissonAutoConfiguration; import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Import; import org.springframework.test.context.ActiveProfiles; @@ -30,6 +31,7 @@ public class BaseDbAndRedisUnitTest { // DB 配置类 DataSourceConfiguration.class, // 自己的 DB 配置类 DataSourceAutoConfiguration.class, // Spring DB 自动配置类 + DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类 DruidDataSourceAutoConfigure.class, // Druid 自动配置类 // MyBatis 配置类 MybatisConfiguration.class, // 自己的 MyBatis 配置类 diff --git a/src/test/java/cn/iocoder/dashboard/BaseDbUnitTest.java b/src/test/java/cn/iocoder/dashboard/BaseDbUnitTest.java index 821118279..19e930f1a 100644 --- a/src/test/java/cn/iocoder/dashboard/BaseDbUnitTest.java +++ b/src/test/java/cn/iocoder/dashboard/BaseDbUnitTest.java @@ -5,6 +5,7 @@ import cn.iocoder.dashboard.framework.mybatis.config.MybatisConfiguration; import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Import; import org.springframework.test.context.ActiveProfiles; @@ -26,6 +27,7 @@ public class BaseDbUnitTest { // DB 配置类 DataSourceConfiguration.class, // 自己的 DB 配置类 DataSourceAutoConfiguration.class, // Spring DB 自动配置类 + DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类 DruidDataSourceAutoConfigure.class, // Druid 自动配置类 // MyBatis 配置类 MybatisConfiguration.class, // 自己的 MyBatis 配置类 From cd854d0ee13323eeaa23951315adabc31cee2edd Mon Sep 17 00:00:00 2001 From: niudehua <657563945@qq.com> Date: Sat, 13 Mar 2021 21:07:04 +0800 Subject: [PATCH 040/126] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20=E4=B8=AA=E4=BA=BA?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E8=AE=BE=E7=BD=AE=20=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/user/SysUserController.java | 4 +- .../user/SysUserProfileController.java | 42 ++++++++------ .../user/vo/user/SysUserProfileRespVO.java | 5 -- .../vo/user/SysUserProfileUpdateReqVO.java | 27 +++++++-- .../system/service/user/SysUserService.java | 6 +- .../service/user/SysUserServiceImpl.java | 56 ++++++++++--------- src/main/resources/application-dev.yaml | 2 +- src/main/resources/application-local.yaml | 2 +- 8 files changed, 86 insertions(+), 58 deletions(-) diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserController.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserController.java index 273be98f0..4374ff4d9 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserController.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserController.java @@ -40,8 +40,8 @@ public class SysUserController { @Resource private SysDeptService deptService; - @ApiOperation("获得用户分页列表") @GetMapping("/page") + @ApiOperation("获得用户分页列表") @PreAuthorize("@ss.hasPermission('system:user:list')") public CommonResult> pageUsers(@Validated SysUserPageReqVO reqVO) { // 获得用户分页列表 @@ -66,9 +66,9 @@ public class SysUserController { /** * 根据用户编号获取详细信息 */ + @GetMapping("/get") @ApiOperation("获得用户详情") @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) - @GetMapping("/get") // @PreAuthorize("@ss.hasPermi('system:user:query')") public CommonResult getInfo(@RequestParam("id") Long id) { return success(SysUserConvert.INSTANCE.convert(userService.getUser(id))); diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserProfileController.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserProfileController.java index 40a99910f..710617e1f 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserProfileController.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserProfileController.java @@ -1,5 +1,6 @@ package cn.iocoder.dashboard.modules.system.controller.user; +import cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil; import cn.iocoder.dashboard.common.pojo.CommonResult; import cn.iocoder.dashboard.framework.security.core.LoginUser; import cn.iocoder.dashboard.framework.security.core.util.SecurityFrameworkUtils; @@ -12,8 +13,10 @@ import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService; import cn.iocoder.dashboard.modules.system.service.permission.SysRoleService; import cn.iocoder.dashboard.modules.system.service.user.SysUserService; +import cn.iocoder.dashboard.util.collection.CollectionUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -24,15 +27,19 @@ import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; +import java.io.IOException; import java.util.List; -import java.util.stream.Collectors; + +import static cn.iocoder.dashboard.common.pojo.CommonResult.success; +import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.FILE_UPLOAD_FAILED; /** * @author niudehua */ -@Api(tags = "用户个人中心") @RestController @RequestMapping("/system/user/profile") +@Api(tags = "用户个人中心") +@Slf4j public class SysUserProfileController { @Resource @@ -47,18 +54,17 @@ public class SysUserProfileController { * * @return 个人信息详情 */ - @ApiOperation("获得登录用户信息") @GetMapping("/get") + @ApiOperation("获得登录用户信息") public CommonResult profile() { LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); // 获取用户信息 - assert loginUser != null; Long userId = loginUser.getId(); SysUserDO user = userService.getUser(userId); SysUserProfileRespVO userProfileRespVO = SysUserConvert.INSTANCE.convert03(user); List userRoles = roleService.listRolesFromCache(permissionService.listUserRoleIs(userId)); - userProfileRespVO.setRoles(userRoles.stream().map(SysUserConvert.INSTANCE::convert).collect(Collectors.toSet())); - return CommonResult.success(userProfileRespVO); + userProfileRespVO.setRoles(CollectionUtils.convertSet(userRoles, SysUserConvert.INSTANCE::convert)); + return success(userProfileRespVO); } /** @@ -68,14 +74,12 @@ public class SysUserProfileController { * @param request HttpServletRequest * @return 修改结果 */ - @ApiOperation("修改用户个人信息") @PostMapping("/update") + @ApiOperation("修改用户个人信息") public CommonResult updateProfile(@RequestBody SysUserProfileUpdateReqVO reqVO, HttpServletRequest request) { - if (userService.updateUserProfile(reqVO) > 0) { - SecurityFrameworkUtils.setLoginUser(SysAuthConvert.INSTANCE.convert(reqVO), request); - return CommonResult.success(true); - } - return CommonResult.success(false); + userService.updateUserProfile(reqVO); + SecurityFrameworkUtils.setLoginUser(SysAuthConvert.INSTANCE.convert(reqVO), request); + return success(true); } /** @@ -84,16 +88,20 @@ public class SysUserProfileController { * @param file 头像文件 * @return 上传结果 */ - @ApiOperation("上传用户个人头像") @PostMapping("/uploadAvatar") + @ApiOperation("上传用户个人头像") public CommonResult uploadAvatar(@RequestParam("avatarFile") MultipartFile file) { if (!file.isEmpty()) { LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); - assert loginUser != null; - if (userService.updateAvatar(loginUser.getId(), file) > 0) { - return CommonResult.success(true); + try { + if (userService.updateAvatar(loginUser.getId(), file.getInputStream()) > 0) { + return success(true); + } + } catch (IOException e) { + log.error("文件上传失败", e); + throw ServiceExceptionUtil.exception(FILE_UPLOAD_FAILED); } } - return CommonResult.success(false); + return success(false); } } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserProfileRespVO.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserProfileRespVO.java index a081dea65..39737f00b 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserProfileRespVO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserProfileRespVO.java @@ -17,11 +17,6 @@ import java.util.Set; @EqualsAndHashCode(callSuper = true) public class SysUserProfileRespVO extends SysUserRespVO { - @ApiModelProperty(value = "旧密码", required = true, example = "123456") - private String oldPassword; - - @ApiModelProperty(value = "新密码", required = true, example = "123456") - private String newPassword; /** * 所属角色 */ diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserProfileUpdateReqVO.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserProfileUpdateReqVO.java index d3185b242..cea2ca77c 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserProfileUpdateReqVO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserProfileUpdateReqVO.java @@ -3,19 +3,38 @@ package cn.iocoder.dashboard.modules.system.controller.user.vo.user; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import lombok.EqualsAndHashCode; +import javax.validation.constraints.Email; import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; -@ApiModel("用户更新 Request VO") +@ApiModel("用户个人信息更新 Request VO") @Data -@EqualsAndHashCode(callSuper = true) -public class SysUserProfileUpdateReqVO extends SysUserBaseVO { +public class SysUserProfileUpdateReqVO { @ApiModelProperty(value = "用户编号", required = true, example = "1024") @NotNull(message = "用户编号不能为空") private Long id; + @ApiModelProperty(value = "用户昵称", required = true, example = "芋艿") + @Size(max = 30, message = "用户昵称长度不能超过30个字符") + private String nickname; + + @ApiModelProperty(value = "用户邮箱", example = "yudao@iocoder.cn") + @Email(message = "邮箱格式不正确") + @Size(max = 50, message = "邮箱长度不能超过50个字符") + private String email; + + @ApiModelProperty(value = "手机号码", example = "15601691300") + @Size(max = 11, message = "手机号码长度不能超过11个字符") + private String mobile; + + @ApiModelProperty(value = "用户性别", example = "1", notes = "参见 SysSexEnum 枚举类") + private Integer sex; + + @ApiModelProperty(value = "用户头像", example = "http://www.iocoder.cn/xxx.png") + private String avatar; + @ApiModelProperty(value = "旧密码", required = true, example = "123456") private String oldPassword; diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserService.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserService.java index e8097590f..def5624e9 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserService.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserService.java @@ -11,8 +11,8 @@ import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserProfil import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserUpdateReqVO; import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.dashboard.util.collection.CollectionUtils; -import org.springframework.web.multipart.MultipartFile; +import java.io.InputStream; import java.util.Collection; import java.util.HashMap; import java.util.List; @@ -115,7 +115,7 @@ public interface SysUserService { * @param reqVO 用户个人信息 * @return 修改结果 */ - int updateUserProfile(SysUserProfileUpdateReqVO reqVO); + void updateUserProfile(SysUserProfileUpdateReqVO reqVO); /** * 删除用户 @@ -156,7 +156,7 @@ public interface SysUserService { * @param avatarFile 头像文件 * @return 更新结果 */ - int updateAvatar(Long id, MultipartFile avatarFile); + int updateAvatar(Long id, InputStream avatarFile); // // /** diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserServiceImpl.java index c1fc828a0..735121216 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserServiceImpl.java @@ -2,11 +2,13 @@ package cn.iocoder.dashboard.modules.system.service.user; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.IoUtil; +import cn.hutool.core.lang.UUID; import cn.hutool.core.util.StrUtil; import cn.iocoder.dashboard.common.enums.CommonStatusEnum; import cn.iocoder.dashboard.common.exception.ServiceException; import cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil; import cn.iocoder.dashboard.common.pojo.PageResult; +import cn.iocoder.dashboard.modules.infra.service.file.InfFileService; import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserCreateReqVO; import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserExportReqVO; import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserImportExcelVO; @@ -19,7 +21,6 @@ import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysPostDO; import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.dashboard.modules.system.dal.mysql.user.SysUserMapper; -import cn.iocoder.dashboard.modules.system.service.common.SysFileService; import cn.iocoder.dashboard.modules.system.service.dept.SysDeptService; import cn.iocoder.dashboard.modules.system.service.dept.SysPostService; import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService; @@ -28,10 +29,9 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; -import java.io.IOException; +import java.io.InputStream; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -66,7 +66,7 @@ public class SysUserServiceImpl implements SysUserService { private PasswordEncoder passwordEncoder; @Resource - private SysFileService fileService; + private InfFileService fileService; // /** // * 根据条件分页查询用户列表 @@ -156,20 +156,22 @@ public class SysUserServiceImpl implements SysUserService { } @Override - public int updateUserProfile(SysUserProfileUpdateReqVO reqVO) { + public void updateUserProfile(SysUserProfileUpdateReqVO reqVO) { // 校验正确性 - this.checkCreateOrUpdate(reqVO.getId(), reqVO.getUsername(), reqVO.getMobile(), reqVO.getEmail(), - reqVO.getDeptId(), reqVO.getPostIds()); - - SysUserDO updateObj = SysUserConvert.INSTANCE.convert(reqVO); - // 校验旧密码 - if (checkOldPassword(reqVO.getId(), reqVO.getOldPassword(), reqVO.getNewPassword())) { - return userMapper.updateById(updateObj); + this.checkUserExists(reqVO.getId()); + this.checkEmailUnique(reqVO.getId(), reqVO.getEmail()); + this.checkMobileUnique(reqVO.getId(), reqVO.getMobile()); + // 校验填写密码 + String encode = null; + if (this.checkOldPassword(reqVO.getId(), reqVO.getOldPassword(), reqVO.getNewPassword())) { + // 更新密码 + encode = passwordEncoder.encode(reqVO.getNewPassword()); } - - String encode = passwordEncoder.encode(reqVO.getNewPassword()); - updateObj.setPassword(encode); - return userMapper.updateById(updateObj); + SysUserDO updateObj = SysUserConvert.INSTANCE.convert(reqVO); + if (StrUtil.isNotBlank(encode)) { + updateObj.setPassword(encode); + } + userMapper.updateById(updateObj); } @Override @@ -314,9 +316,17 @@ public class SysUserServiceImpl implements SysUserService { }); } + /** + * 校验旧密码、新密码 + * + * @param id 用户 id + * @param oldPassword 旧密码 + * @param newPassword 新密码 + * @return + */ private boolean checkOldPassword(Long id, String oldPassword, String newPassword) { if (id == null || StrUtil.isBlank(oldPassword) || StrUtil.isBlank(newPassword)) { - return true; + return false; } SysUserDO user = userMapper.selectById(id); if (user == null) { @@ -326,7 +336,7 @@ public class SysUserServiceImpl implements SysUserService { if (!passwordEncoder.matches(oldPassword, user.getPassword())) { throw ServiceExceptionUtil.exception(USER_PASSWORD_FAILED); } - return false; + return true; } @Override @@ -368,15 +378,11 @@ public class SysUserServiceImpl implements SysUserService { } @Override - public int updateAvatar(Long id, MultipartFile avatarFile) { + public int updateAvatar(Long id, InputStream avatarFile) { this.checkUserExists(id); // 存储文件 - String avatar = null; - try { - avatar = fileService.createFile(avatarFile.getOriginalFilename(), IoUtil.readBytes(avatarFile.getInputStream())); - } catch (IOException e) { - throw ServiceExceptionUtil.exception(FILE_UPLOAD_FAILED); - } + String avatar; + avatar = fileService.createFile(UUID.fastUUID().toString(), IoUtil.readBytes(avatarFile)); // 更新路径 SysUserDO sysUserDO = new SysUserDO(); sysUserDO.setId(id); diff --git a/src/main/resources/application-dev.yaml b/src/main/resources/application-dev.yaml index c9c40e739..b0a96fb04 100644 --- a/src/main/resources/application-dev.yaml +++ b/src/main/resources/application-dev.yaml @@ -145,7 +145,7 @@ yudao: swagger: title: 管理后台 description: 提供管理员管理的所有功能 - version: ${yudao.info.base-package} + version: ${yudao.info.version} base-package: ${yudao.info.base-package}.modules captcha: timeout: 5m diff --git a/src/main/resources/application-local.yaml b/src/main/resources/application-local.yaml index 500eb7b51..fdb260758 100644 --- a/src/main/resources/application-local.yaml +++ b/src/main/resources/application-local.yaml @@ -145,7 +145,7 @@ yudao: swagger: title: 管理后台 description: 提供管理员管理的所有功能 - version: ${yudao.info.base-package} + version: ${yudao.info.version} base-package: ${yudao.info.base-package}.modules captcha: timeout: 5m From 2dd87e0414e05054e0cd350f8fc217e1308e11dc Mon Sep 17 00:00:00 2001 From: niudehua <657563945@qq.com> Date: Sat, 13 Mar 2021 22:16:40 +0800 Subject: [PATCH 041/126] =?UTF-8?q?=E8=AE=BE=E7=BD=AE=20=E4=BA=8B=E5=8A=A1?= =?UTF-8?q?=20rollback=20=E5=B1=9E=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/job/impl/InfJobServiceImpl.java | 8 +++---- .../user/SysUserProfileController.java | 2 +- .../permission/impl/SysMenuServiceImpl.java | 2 +- .../impl/SysPermissionServiceImpl.java | 2 +- .../permission/impl/SysRoleServiceImpl.java | 2 +- .../service/user/SysUserServiceImpl.java | 22 ++++--------------- .../codegen/impl/ToolCodegenServiceImpl.java | 10 ++++----- 7 files changed, 17 insertions(+), 31 deletions(-) diff --git a/src/main/java/cn/iocoder/dashboard/modules/infra/service/job/impl/InfJobServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/infra/service/job/impl/InfJobServiceImpl.java index d82207de1..156c423c6 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/infra/service/job/impl/InfJobServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/infra/service/job/impl/InfJobServiceImpl.java @@ -41,7 +41,7 @@ public class InfJobServiceImpl implements InfJobService { private SchedulerManager schedulerManager; @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public Long createJob(InfJobCreateReqVO createReqVO) throws SchedulerException { validateCronExpression(createReqVO.getCronExpression()); // 校验唯一性 @@ -66,7 +66,7 @@ public class InfJobServiceImpl implements InfJobService { } @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public void updateJob(InfJobUpdateReqVO updateReqVO) throws SchedulerException { validateCronExpression(updateReqVO.getCronExpression()); // 校验存在 @@ -86,7 +86,7 @@ public class InfJobServiceImpl implements InfJobService { } @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public void updateJobStatus(Long id, Integer status) throws SchedulerException { // 校验 status if (!containsAny(status, InfJobStatusEnum.NORMAL.getStatus(), InfJobStatusEnum.STOP.getStatus())) { @@ -120,7 +120,7 @@ public class InfJobServiceImpl implements InfJobService { } @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public void deleteJob(Long id) throws SchedulerException { // 校验存在 InfJobDO job = this.validateJobExists(id); diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserProfileController.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserProfileController.java index 710617e1f..1b2503c77 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserProfileController.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserProfileController.java @@ -88,7 +88,7 @@ public class SysUserProfileController { * @param file 头像文件 * @return 上传结果 */ - @PostMapping("/uploadAvatar") + @PostMapping("/upload-avatar") @ApiOperation("上传用户个人头像") public CommonResult uploadAvatar(@RequestParam("avatarFile") MultipartFile file) { if (!file.isEmpty()) { diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysMenuServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysMenuServiceImpl.java index 070677d8e..b4773c248 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysMenuServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysMenuServiceImpl.java @@ -206,7 +206,7 @@ public class SysMenuServiceImpl implements SysMenuService { * * @param menuId 菜单编号 */ - @Transactional + @Transactional(rollbackFor = Exception.class) public void deleteMenu(Long menuId) { // 校验更新的菜单是否存在 if (menuMapper.selectById(menuId) == null) { diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysPermissionServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysPermissionServiceImpl.java index 9f48af9f5..ceb1d6d83 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysPermissionServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysPermissionServiceImpl.java @@ -176,7 +176,7 @@ public class SysPermissionServiceImpl implements SysPermissionService { } @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public void assignRoleMenu(Long roleId, Set menuIds) { // 获得角色拥有菜单编号 Set dbMenuIds = CollectionUtils.convertSet(roleMenuMapper.selectListByRoleId(roleId), diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysRoleServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysRoleServiceImpl.java index d760b734b..93f67ea71 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysRoleServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysRoleServiceImpl.java @@ -174,7 +174,7 @@ public class SysRoleServiceImpl implements SysRoleService { } @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public void deleteRole(Long id) { // 校验是否可以更新 this.checkUpdateRole(id); diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserServiceImpl.java index 735121216..5411d27e8 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserServiceImpl.java @@ -2,7 +2,7 @@ package cn.iocoder.dashboard.modules.system.service.user; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.IoUtil; -import cn.hutool.core.lang.UUID; +import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; import cn.iocoder.dashboard.common.enums.CommonStatusEnum; import cn.iocoder.dashboard.common.exception.ServiceException; @@ -68,19 +68,6 @@ public class SysUserServiceImpl implements SysUserService { @Resource private InfFileService fileService; -// /** -// * 根据条件分页查询用户列表 -// * -// * @param user 用户信息 -// * @return 用户信息集合信息 -// */ -// @Override -// @DataScope(deptAlias = "d", userAlias = "u") -// public List selectUserList(SysUser user) -// { -// return userMapper.selectUserList(user); -// } - @Override public SysUserDO getUserByUserName(String username) { return userMapper.selectByUsername(username); @@ -322,7 +309,7 @@ public class SysUserServiceImpl implements SysUserService { * @param id 用户 id * @param oldPassword 旧密码 * @param newPassword 新密码 - * @return + * @return 校验结果 */ private boolean checkOldPassword(Long id, String oldPassword, String newPassword) { if (id == null || StrUtil.isBlank(oldPassword) || StrUtil.isBlank(newPassword)) { @@ -340,7 +327,7 @@ public class SysUserServiceImpl implements SysUserService { } @Override - @Transactional // 添加事务,异常则回滚所有导入 + @Transactional(rollbackFor = Exception.class) // 添加事务,异常则回滚所有导入 public SysUserImportRespVO importUsers(List importUsers, boolean isUpdateSupport) { if (CollUtil.isEmpty(importUsers)) { throw ServiceExceptionUtil.exception(USER_IMPORT_LIST_IS_EMPTY); @@ -381,8 +368,7 @@ public class SysUserServiceImpl implements SysUserService { public int updateAvatar(Long id, InputStream avatarFile) { this.checkUserExists(id); // 存储文件 - String avatar; - avatar = fileService.createFile(UUID.fastUUID().toString(), IoUtil.readBytes(avatarFile)); + String avatar = fileService.createFile(IdUtil.fastUUID(), IoUtil.readBytes(avatarFile)); // 更新路径 SysUserDO sysUserDO = new SysUserDO(); sysUserDO.setId(id); diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenServiceImpl.java index 6b2b5f9f7..5b746f6fd 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenServiceImpl.java @@ -109,7 +109,7 @@ public class ToolCodegenServiceImpl implements ToolCodegenService { } @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public List createCodegenListFromDB(List tableNames) { List ids = new ArrayList<>(tableNames.size()); // 遍历添加。虽然效率会低一点,但是没必要做成完全批量,因为不会这么大量 @@ -118,7 +118,7 @@ public class ToolCodegenServiceImpl implements ToolCodegenService { } @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public void updateCodegen(ToolCodegenUpdateReqVO updateReqVO) { // 校验是否已经存在 if (codegenTableMapper.selectById(updateReqVO.getTable().getId()) == null) { @@ -134,7 +134,7 @@ public class ToolCodegenServiceImpl implements ToolCodegenService { } @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public void syncCodegenFromDB(Long tableId) { // 校验是否已经存在 ToolCodegenTableDO table = codegenTableMapper.selectById(tableId); @@ -149,7 +149,7 @@ public class ToolCodegenServiceImpl implements ToolCodegenService { } @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public void syncCodegenFromSQL(Long tableId, String sql) { // 校验是否已经存在 ToolCodegenTableDO table = codegenTableMapper.selectById(tableId); @@ -201,7 +201,7 @@ public class ToolCodegenServiceImpl implements ToolCodegenService { } @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public void deleteCodegen(Long tableId) { // 校验是否已经存在 if (codegenTableMapper.selectById(tableId) == null) { From 8297d94b51dc5dc8efe4567647de14238f0f6371 Mon Sep 17 00:00:00 2001 From: niudehua <657563945@qq.com> Date: Sat, 13 Mar 2021 22:24:02 +0800 Subject: [PATCH 042/126] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20=E4=B8=AA=E4=BA=BA?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E8=AE=BE=E7=BD=AE=20=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/SysUserProfileController.java | 22 +------------------ 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserProfileController.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserProfileController.java index 1b2503c77..27a170560 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserProfileController.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserProfileController.java @@ -1,6 +1,5 @@ package cn.iocoder.dashboard.modules.system.controller.user; -import cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil; import cn.iocoder.dashboard.common.pojo.CommonResult; import cn.iocoder.dashboard.framework.security.core.LoginUser; import cn.iocoder.dashboard.framework.security.core.util.SecurityFrameworkUtils; @@ -31,7 +30,6 @@ import java.io.IOException; import java.util.List; import static cn.iocoder.dashboard.common.pojo.CommonResult.success; -import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.FILE_UPLOAD_FAILED; /** * @author niudehua @@ -49,11 +47,6 @@ public class SysUserProfileController { @Resource private SysRoleService roleService; - /** - * 个人信息 - * - * @return 个人信息详情 - */ @GetMapping("/get") @ApiOperation("获得登录用户信息") public CommonResult profile() { @@ -67,13 +60,6 @@ public class SysUserProfileController { return success(userProfileRespVO); } - /** - * 修改个人信息 - * - * @param reqVO 个人信息更新 reqVO - * @param request HttpServletRequest - * @return 修改结果 - */ @PostMapping("/update") @ApiOperation("修改用户个人信息") public CommonResult updateProfile(@RequestBody SysUserProfileUpdateReqVO reqVO, HttpServletRequest request) { @@ -82,12 +68,6 @@ public class SysUserProfileController { return success(true); } - /** - * 上传用户个人头像 - * - * @param file 头像文件 - * @return 上传结果 - */ @PostMapping("/upload-avatar") @ApiOperation("上传用户个人头像") public CommonResult uploadAvatar(@RequestParam("avatarFile") MultipartFile file) { @@ -99,7 +79,7 @@ public class SysUserProfileController { } } catch (IOException e) { log.error("文件上传失败", e); - throw ServiceExceptionUtil.exception(FILE_UPLOAD_FAILED); + throw new RuntimeException(e); } } return success(false); From 74669817d8e203ce4219e3d98532a61bbd3f5d20 Mon Sep 17 00:00:00 2001 From: niudehua <657563945@qq.com> Date: Sat, 13 Mar 2021 22:25:06 +0800 Subject: [PATCH 043/126] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20=E4=B8=AA=E4=BA=BA?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E8=AE=BE=E7=BD=AE=20=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/system/controller/user/SysUserProfileController.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserProfileController.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserProfileController.java index 27a170560..3b420a463 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserProfileController.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserProfileController.java @@ -78,7 +78,6 @@ public class SysUserProfileController { return success(true); } } catch (IOException e) { - log.error("文件上传失败", e); throw new RuntimeException(e); } } From 562f4cb953bccd1b4be474441e5e36011941b945 Mon Sep 17 00:00:00 2001 From: timfruit Date: Sat, 13 Mar 2021 22:40:16 +0800 Subject: [PATCH 044/126] =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E8=89=BF=E8=89=BF?= =?UTF-8?q?=E7=9A=84=E6=8F=90=E7=A4=BA=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/doc/InfDbDocController.java | 25 ++++++++----------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/src/main/java/cn/iocoder/dashboard/modules/infra/controller/doc/InfDbDocController.java b/src/main/java/cn/iocoder/dashboard/modules/infra/controller/doc/InfDbDocController.java index c39392c33..f5b293538 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/infra/controller/doc/InfDbDocController.java +++ b/src/main/java/cn/iocoder/dashboard/modules/infra/controller/doc/InfDbDocController.java @@ -48,9 +48,7 @@ public class InfDbDocController { @GetMapping("/export-html") @ApiOperation("导出html格式的数据文档") - @ApiImplicitParams({ - @ApiImplicitParam(name = "deleteFile", value = "是否删除在服务器本地生成的数据库文档", example = "true", dataTypeClass = Boolean.class), - }) + @ApiImplicitParam(name = "deleteFile", value = "是否删除在服务器本地生成的数据库文档", example = "true", dataTypeClass = Boolean.class) public void exportHtml(@RequestParam(defaultValue = "true") Boolean deleteFile, HttpServletResponse response) throws IOException { doExportFile(EngineFileType.HTML, deleteFile, response); @@ -58,9 +56,7 @@ public class InfDbDocController { @GetMapping("/export-word") @ApiOperation("导出word格式的数据文档") - @ApiImplicitParams({ - @ApiImplicitParam(name = "deleteFile", value = "是否删除在服务器本地生成的数据库文档", example = "true", dataTypeClass = Boolean.class), - }) + @ApiImplicitParam(name = "deleteFile", value = "是否删除在服务器本地生成的数据库文档", example = "true", dataTypeClass = Boolean.class) public void exportWord(@RequestParam(defaultValue = "true") Boolean deleteFile, HttpServletResponse response) throws IOException { doExportFile(EngineFileType.WORD, deleteFile, response); @@ -68,9 +64,7 @@ public class InfDbDocController { @GetMapping("/export-markdown") @ApiOperation("导出markdown格式的数据文档") - @ApiImplicitParams({ - @ApiImplicitParam(name = "deleteFile", value = "是否删除在服务器本地生成的数据库文档", example = "true", dataTypeClass = Boolean.class), - }) + @ApiImplicitParam(name = "deleteFile", value = "是否删除在服务器本地生成的数据库文档", example = "true", dataTypeClass = Boolean.class) public void exportMarkdown(@RequestParam(defaultValue = "true") Boolean deleteFile, HttpServletResponse response) throws IOException { doExportFile(EngineFileType.MD, deleteFile, response); @@ -81,12 +75,13 @@ public class InfDbDocController { String docFileName = DOC_FILE_NAME + "_" + IdUtil.fastSimpleUUID(); String filePath = doExportFile(fileOutputType, docFileName); String downloadFileName = DOC_FILE_NAME + fileOutputType.getFileSuffix(); //下载后的文件名 - // 读取,返回 - //IoUtil.readBytes 直接读取FileInputStream 不会关闭流,有bug,所以用BufferedInputStream包装一下, 关闭流后才能删除文件 - byte[] content = IoUtil.readBytes(new BufferedInputStream(new FileInputStream(filePath))); - //这里不用hutool工具类,它的中文文件名编码有问题,导致在浏览器下载时有问题 - ServletUtils.writeAttachment(response, downloadFileName, content); - handleDeleteFile(deleteFile, filePath); + try { + // 读取,返回 + //这里不用hutool工具类,它的中文文件名编码有问题,导致在浏览器下载时有问题 + ServletUtils.writeAttachment(response, downloadFileName, FileUtil.readBytes(filePath)); + }finally { + handleDeleteFile(deleteFile, filePath); + } } /** From 61c24c0aa7fd1b4640b8f1feeaa1d81d0214fc3a Mon Sep 17 00:00:00 2001 From: niudehua <657563945@qq.com> Date: Sat, 13 Mar 2021 21:07:04 +0800 Subject: [PATCH 045/126] =?UTF-8?q?=E8=AE=BE=E7=BD=AE=20=E4=BA=8B=E5=8A=A1?= =?UTF-8?q?=20rollback=20=E5=B1=9E=E6=80=A7=20=E5=A2=9E=E5=8A=A0=20?= =?UTF-8?q?=E4=B8=AA=E4=BA=BA=E4=BF=A1=E6=81=AF=E8=AE=BE=E7=BD=AE=20?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加 个人信息设置 功能 --- .../service/job/impl/InfJobServiceImpl.java | 8 +-- .../controller/user/SysUserController.java | 4 +- .../user/SysUserProfileController.java | 65 ++++++----------- .../user/vo/user/SysUserProfileRespVO.java | 5 -- .../vo/user/SysUserProfileUpdateReqVO.java | 27 +++++-- .../system/enums/SysErrorCodeConstants.java | 1 + .../permission/impl/SysMenuServiceImpl.java | 2 +- .../impl/SysPermissionServiceImpl.java | 2 +- .../permission/impl/SysRoleServiceImpl.java | 2 +- .../system/service/user/SysUserService.java | 7 +- .../service/user/SysUserServiceImpl.java | 72 +++++++++---------- .../codegen/impl/ToolCodegenServiceImpl.java | 10 +-- src/main/resources/application-dev.yaml | 2 +- src/main/resources/application-local.yaml | 2 +- 14 files changed, 98 insertions(+), 111 deletions(-) diff --git a/src/main/java/cn/iocoder/dashboard/modules/infra/service/job/impl/InfJobServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/infra/service/job/impl/InfJobServiceImpl.java index d82207de1..156c423c6 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/infra/service/job/impl/InfJobServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/infra/service/job/impl/InfJobServiceImpl.java @@ -41,7 +41,7 @@ public class InfJobServiceImpl implements InfJobService { private SchedulerManager schedulerManager; @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public Long createJob(InfJobCreateReqVO createReqVO) throws SchedulerException { validateCronExpression(createReqVO.getCronExpression()); // 校验唯一性 @@ -66,7 +66,7 @@ public class InfJobServiceImpl implements InfJobService { } @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public void updateJob(InfJobUpdateReqVO updateReqVO) throws SchedulerException { validateCronExpression(updateReqVO.getCronExpression()); // 校验存在 @@ -86,7 +86,7 @@ public class InfJobServiceImpl implements InfJobService { } @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public void updateJobStatus(Long id, Integer status) throws SchedulerException { // 校验 status if (!containsAny(status, InfJobStatusEnum.NORMAL.getStatus(), InfJobStatusEnum.STOP.getStatus())) { @@ -120,7 +120,7 @@ public class InfJobServiceImpl implements InfJobService { } @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public void deleteJob(Long id) throws SchedulerException { // 校验存在 InfJobDO job = this.validateJobExists(id); diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserController.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserController.java index 273be98f0..4374ff4d9 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserController.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserController.java @@ -40,8 +40,8 @@ public class SysUserController { @Resource private SysDeptService deptService; - @ApiOperation("获得用户分页列表") @GetMapping("/page") + @ApiOperation("获得用户分页列表") @PreAuthorize("@ss.hasPermission('system:user:list')") public CommonResult> pageUsers(@Validated SysUserPageReqVO reqVO) { // 获得用户分页列表 @@ -66,9 +66,9 @@ public class SysUserController { /** * 根据用户编号获取详细信息 */ + @GetMapping("/get") @ApiOperation("获得用户详情") @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) - @GetMapping("/get") // @PreAuthorize("@ss.hasPermi('system:user:query')") public CommonResult getInfo(@RequestParam("id") Long id) { return success(SysUserConvert.INSTANCE.convert(userService.getUser(id))); diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserProfileController.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserProfileController.java index 40a99910f..a43b0a4e7 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserProfileController.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserProfileController.java @@ -1,7 +1,7 @@ package cn.iocoder.dashboard.modules.system.controller.user; +import cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil; import cn.iocoder.dashboard.common.pojo.CommonResult; -import cn.iocoder.dashboard.framework.security.core.LoginUser; import cn.iocoder.dashboard.framework.security.core.util.SecurityFrameworkUtils; import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserProfileRespVO; import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserProfileUpdateReqVO; @@ -12,8 +12,10 @@ import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService; import cn.iocoder.dashboard.modules.system.service.permission.SysRoleService; import cn.iocoder.dashboard.modules.system.service.user.SysUserService; +import cn.iocoder.dashboard.util.collection.CollectionUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -24,15 +26,19 @@ import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; +import java.io.IOException; import java.util.List; -import java.util.stream.Collectors; + +import static cn.iocoder.dashboard.common.pojo.CommonResult.success; +import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.FILE_IS_EMPTY; /** * @author niudehua */ -@Api(tags = "用户个人中心") @RestController @RequestMapping("/system/user/profile") +@Api(tags = "用户个人中心") +@Slf4j public class SysUserProfileController { @Resource @@ -42,58 +48,33 @@ public class SysUserProfileController { @Resource private SysRoleService roleService; - /** - * 个人信息 - * - * @return 个人信息详情 - */ - @ApiOperation("获得登录用户信息") @GetMapping("/get") + @ApiOperation("获得登录用户信息") public CommonResult profile() { - LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); // 获取用户信息 - assert loginUser != null; - Long userId = loginUser.getId(); + Long userId = SecurityFrameworkUtils.getLoginUserId(); SysUserDO user = userService.getUser(userId); SysUserProfileRespVO userProfileRespVO = SysUserConvert.INSTANCE.convert03(user); List userRoles = roleService.listRolesFromCache(permissionService.listUserRoleIs(userId)); - userProfileRespVO.setRoles(userRoles.stream().map(SysUserConvert.INSTANCE::convert).collect(Collectors.toSet())); - return CommonResult.success(userProfileRespVO); + userProfileRespVO.setRoles(CollectionUtils.convertSet(userRoles, SysUserConvert.INSTANCE::convert)); + return success(userProfileRespVO); } - /** - * 修改个人信息 - * - * @param reqVO 个人信息更新 reqVO - * @param request HttpServletRequest - * @return 修改结果 - */ - @ApiOperation("修改用户个人信息") @PostMapping("/update") + @ApiOperation("修改用户个人信息") public CommonResult updateProfile(@RequestBody SysUserProfileUpdateReqVO reqVO, HttpServletRequest request) { - if (userService.updateUserProfile(reqVO) > 0) { - SecurityFrameworkUtils.setLoginUser(SysAuthConvert.INSTANCE.convert(reqVO), request); - return CommonResult.success(true); - } - return CommonResult.success(false); + userService.updateUserProfile(reqVO); + SecurityFrameworkUtils.setLoginUser(SysAuthConvert.INSTANCE.convert(reqVO), request); + return success(true); } - /** - * 上传用户个人头像 - * - * @param file 头像文件 - * @return 上传结果 - */ + @PostMapping("/upload-avatar") @ApiOperation("上传用户个人头像") - @PostMapping("/uploadAvatar") - public CommonResult uploadAvatar(@RequestParam("avatarFile") MultipartFile file) { - if (!file.isEmpty()) { - LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); - assert loginUser != null; - if (userService.updateAvatar(loginUser.getId(), file) > 0) { - return CommonResult.success(true); - } + public CommonResult uploadAvatar(@RequestParam("avatarFile") MultipartFile file) throws IOException { + if (file.isEmpty()) { + throw ServiceExceptionUtil.exception(FILE_IS_EMPTY); } - return CommonResult.success(false); + userService.updateAvatar(SecurityFrameworkUtils.getLoginUserId(), file.getInputStream()); + return success(true); } } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserProfileRespVO.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserProfileRespVO.java index a081dea65..39737f00b 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserProfileRespVO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserProfileRespVO.java @@ -17,11 +17,6 @@ import java.util.Set; @EqualsAndHashCode(callSuper = true) public class SysUserProfileRespVO extends SysUserRespVO { - @ApiModelProperty(value = "旧密码", required = true, example = "123456") - private String oldPassword; - - @ApiModelProperty(value = "新密码", required = true, example = "123456") - private String newPassword; /** * 所属角色 */ diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserProfileUpdateReqVO.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserProfileUpdateReqVO.java index d3185b242..cea2ca77c 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserProfileUpdateReqVO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserProfileUpdateReqVO.java @@ -3,19 +3,38 @@ package cn.iocoder.dashboard.modules.system.controller.user.vo.user; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import lombok.EqualsAndHashCode; +import javax.validation.constraints.Email; import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; -@ApiModel("用户更新 Request VO") +@ApiModel("用户个人信息更新 Request VO") @Data -@EqualsAndHashCode(callSuper = true) -public class SysUserProfileUpdateReqVO extends SysUserBaseVO { +public class SysUserProfileUpdateReqVO { @ApiModelProperty(value = "用户编号", required = true, example = "1024") @NotNull(message = "用户编号不能为空") private Long id; + @ApiModelProperty(value = "用户昵称", required = true, example = "芋艿") + @Size(max = 30, message = "用户昵称长度不能超过30个字符") + private String nickname; + + @ApiModelProperty(value = "用户邮箱", example = "yudao@iocoder.cn") + @Email(message = "邮箱格式不正确") + @Size(max = 50, message = "邮箱长度不能超过50个字符") + private String email; + + @ApiModelProperty(value = "手机号码", example = "15601691300") + @Size(max = 11, message = "手机号码长度不能超过11个字符") + private String mobile; + + @ApiModelProperty(value = "用户性别", example = "1", notes = "参见 SysSexEnum 枚举类") + private Integer sex; + + @ApiModelProperty(value = "用户头像", example = "http://www.iocoder.cn/xxx.png") + private String avatar; + @ApiModelProperty(value = "旧密码", required = true, example = "123456") private String oldPassword; diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java b/src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java index 3f4214325..0197b6c05 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java @@ -76,5 +76,6 @@ public interface SysErrorCodeConstants { // ========== 文件 1002009000 ========== ErrorCode FILE_PATH_EXISTS = new ErrorCode(1002009001, "文件路径已经存在"); ErrorCode FILE_UPLOAD_FAILED = new ErrorCode(1002009002, "文件上传失败"); + ErrorCode FILE_IS_EMPTY= new ErrorCode(1002009003, "文件为空"); } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysMenuServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysMenuServiceImpl.java index 070677d8e..b4773c248 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysMenuServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysMenuServiceImpl.java @@ -206,7 +206,7 @@ public class SysMenuServiceImpl implements SysMenuService { * * @param menuId 菜单编号 */ - @Transactional + @Transactional(rollbackFor = Exception.class) public void deleteMenu(Long menuId) { // 校验更新的菜单是否存在 if (menuMapper.selectById(menuId) == null) { diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysPermissionServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysPermissionServiceImpl.java index 9f48af9f5..ceb1d6d83 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysPermissionServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysPermissionServiceImpl.java @@ -176,7 +176,7 @@ public class SysPermissionServiceImpl implements SysPermissionService { } @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public void assignRoleMenu(Long roleId, Set menuIds) { // 获得角色拥有菜单编号 Set dbMenuIds = CollectionUtils.convertSet(roleMenuMapper.selectListByRoleId(roleId), diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysRoleServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysRoleServiceImpl.java index d760b734b..93f67ea71 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysRoleServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysRoleServiceImpl.java @@ -174,7 +174,7 @@ public class SysRoleServiceImpl implements SysRoleService { } @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public void deleteRole(Long id) { // 校验是否可以更新 this.checkUpdateRole(id); diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserService.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserService.java index e8097590f..c0ac9e611 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserService.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserService.java @@ -11,8 +11,8 @@ import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserProfil import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserUpdateReqVO; import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.dashboard.util.collection.CollectionUtils; -import org.springframework.web.multipart.MultipartFile; +import java.io.InputStream; import java.util.Collection; import java.util.HashMap; import java.util.List; @@ -115,7 +115,7 @@ public interface SysUserService { * @param reqVO 用户个人信息 * @return 修改结果 */ - int updateUserProfile(SysUserProfileUpdateReqVO reqVO); + void updateUserProfile(SysUserProfileUpdateReqVO reqVO); /** * 删除用户 @@ -154,9 +154,8 @@ public interface SysUserService { * * @param id 用户 id * @param avatarFile 头像文件 - * @return 更新结果 */ - int updateAvatar(Long id, MultipartFile avatarFile); + void updateAvatar(Long id, InputStream avatarFile); // // /** diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserServiceImpl.java index c1fc828a0..acffcb7d1 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserServiceImpl.java @@ -2,11 +2,13 @@ package cn.iocoder.dashboard.modules.system.service.user; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; import cn.iocoder.dashboard.common.enums.CommonStatusEnum; import cn.iocoder.dashboard.common.exception.ServiceException; import cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil; import cn.iocoder.dashboard.common.pojo.PageResult; +import cn.iocoder.dashboard.modules.infra.service.file.InfFileService; import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserCreateReqVO; import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserExportReqVO; import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserImportExcelVO; @@ -19,7 +21,6 @@ import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysDeptDO; import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysPostDO; import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.dashboard.modules.system.dal.mysql.user.SysUserMapper; -import cn.iocoder.dashboard.modules.system.service.common.SysFileService; import cn.iocoder.dashboard.modules.system.service.dept.SysDeptService; import cn.iocoder.dashboard.modules.system.service.dept.SysPostService; import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService; @@ -28,10 +29,9 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; -import java.io.IOException; +import java.io.InputStream; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -66,20 +66,7 @@ public class SysUserServiceImpl implements SysUserService { private PasswordEncoder passwordEncoder; @Resource - private SysFileService fileService; - -// /** -// * 根据条件分页查询用户列表 -// * -// * @param user 用户信息 -// * @return 用户信息集合信息 -// */ -// @Override -// @DataScope(deptAlias = "d", userAlias = "u") -// public List selectUserList(SysUser user) -// { -// return userMapper.selectUserList(user); -// } + private InfFileService fileService; @Override public SysUserDO getUserByUserName(String username) { @@ -156,20 +143,22 @@ public class SysUserServiceImpl implements SysUserService { } @Override - public int updateUserProfile(SysUserProfileUpdateReqVO reqVO) { + public void updateUserProfile(SysUserProfileUpdateReqVO reqVO) { // 校验正确性 - this.checkCreateOrUpdate(reqVO.getId(), reqVO.getUsername(), reqVO.getMobile(), reqVO.getEmail(), - reqVO.getDeptId(), reqVO.getPostIds()); - - SysUserDO updateObj = SysUserConvert.INSTANCE.convert(reqVO); - // 校验旧密码 - if (checkOldPassword(reqVO.getId(), reqVO.getOldPassword(), reqVO.getNewPassword())) { - return userMapper.updateById(updateObj); + this.checkUserExists(reqVO.getId()); + this.checkEmailUnique(reqVO.getId(), reqVO.getEmail()); + this.checkMobileUnique(reqVO.getId(), reqVO.getMobile()); + // 校验填写密码 + String encode = null; + if (this.checkOldPassword(reqVO.getId(), reqVO.getOldPassword(), reqVO.getNewPassword())) { + // 更新密码 + encode = passwordEncoder.encode(reqVO.getNewPassword()); } - - String encode = passwordEncoder.encode(reqVO.getNewPassword()); - updateObj.setPassword(encode); - return userMapper.updateById(updateObj); + SysUserDO updateObj = SysUserConvert.INSTANCE.convert(reqVO); + if (StrUtil.isNotBlank(encode)) { + updateObj.setPassword(encode); + } + userMapper.updateById(updateObj); } @Override @@ -314,9 +303,17 @@ public class SysUserServiceImpl implements SysUserService { }); } + /** + * 校验旧密码、新密码 + * + * @param id 用户 id + * @param oldPassword 旧密码 + * @param newPassword 新密码 + * @return 校验结果 + */ private boolean checkOldPassword(Long id, String oldPassword, String newPassword) { if (id == null || StrUtil.isBlank(oldPassword) || StrUtil.isBlank(newPassword)) { - return true; + return false; } SysUserDO user = userMapper.selectById(id); if (user == null) { @@ -326,11 +323,11 @@ public class SysUserServiceImpl implements SysUserService { if (!passwordEncoder.matches(oldPassword, user.getPassword())) { throw ServiceExceptionUtil.exception(USER_PASSWORD_FAILED); } - return false; + return true; } @Override - @Transactional // 添加事务,异常则回滚所有导入 + @Transactional(rollbackFor = Exception.class) // 添加事务,异常则回滚所有导入 public SysUserImportRespVO importUsers(List importUsers, boolean isUpdateSupport) { if (CollUtil.isEmpty(importUsers)) { throw ServiceExceptionUtil.exception(USER_IMPORT_LIST_IS_EMPTY); @@ -368,20 +365,15 @@ public class SysUserServiceImpl implements SysUserService { } @Override - public int updateAvatar(Long id, MultipartFile avatarFile) { + public void updateAvatar(Long id, InputStream avatarFile) { this.checkUserExists(id); // 存储文件 - String avatar = null; - try { - avatar = fileService.createFile(avatarFile.getOriginalFilename(), IoUtil.readBytes(avatarFile.getInputStream())); - } catch (IOException e) { - throw ServiceExceptionUtil.exception(FILE_UPLOAD_FAILED); - } + String avatar = fileService.createFile(IdUtil.fastUUID(), IoUtil.readBytes(avatarFile)); // 更新路径 SysUserDO sysUserDO = new SysUserDO(); sysUserDO.setId(id); sysUserDO.setAvatar(avatar); - return userMapper.updateById(sysUserDO); + userMapper.updateById(sysUserDO); } } diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenServiceImpl.java index 6b2b5f9f7..5b746f6fd 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenServiceImpl.java @@ -109,7 +109,7 @@ public class ToolCodegenServiceImpl implements ToolCodegenService { } @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public List createCodegenListFromDB(List tableNames) { List ids = new ArrayList<>(tableNames.size()); // 遍历添加。虽然效率会低一点,但是没必要做成完全批量,因为不会这么大量 @@ -118,7 +118,7 @@ public class ToolCodegenServiceImpl implements ToolCodegenService { } @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public void updateCodegen(ToolCodegenUpdateReqVO updateReqVO) { // 校验是否已经存在 if (codegenTableMapper.selectById(updateReqVO.getTable().getId()) == null) { @@ -134,7 +134,7 @@ public class ToolCodegenServiceImpl implements ToolCodegenService { } @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public void syncCodegenFromDB(Long tableId) { // 校验是否已经存在 ToolCodegenTableDO table = codegenTableMapper.selectById(tableId); @@ -149,7 +149,7 @@ public class ToolCodegenServiceImpl implements ToolCodegenService { } @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public void syncCodegenFromSQL(Long tableId, String sql) { // 校验是否已经存在 ToolCodegenTableDO table = codegenTableMapper.selectById(tableId); @@ -201,7 +201,7 @@ public class ToolCodegenServiceImpl implements ToolCodegenService { } @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public void deleteCodegen(Long tableId) { // 校验是否已经存在 if (codegenTableMapper.selectById(tableId) == null) { diff --git a/src/main/resources/application-dev.yaml b/src/main/resources/application-dev.yaml index c9c40e739..b0a96fb04 100644 --- a/src/main/resources/application-dev.yaml +++ b/src/main/resources/application-dev.yaml @@ -145,7 +145,7 @@ yudao: swagger: title: 管理后台 description: 提供管理员管理的所有功能 - version: ${yudao.info.base-package} + version: ${yudao.info.version} base-package: ${yudao.info.base-package}.modules captcha: timeout: 5m diff --git a/src/main/resources/application-local.yaml b/src/main/resources/application-local.yaml index 500eb7b51..fdb260758 100644 --- a/src/main/resources/application-local.yaml +++ b/src/main/resources/application-local.yaml @@ -145,7 +145,7 @@ yudao: swagger: title: 管理后台 description: 提供管理员管理的所有功能 - version: ${yudao.info.base-package} + version: ${yudao.info.version} base-package: ${yudao.info.base-package}.modules captcha: timeout: 5m From 32620fb3a7d5dd29943227f44bb55c5906225bbe Mon Sep 17 00:00:00 2001 From: wangkai Date: Sat, 13 Mar 2021 23:20:29 +0800 Subject: [PATCH 046/126] =?UTF-8?q?infra=20logger=20=E5=8D=95=E5=85=83?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=20(issues=20I3A9GW)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/ApiAccessLogFrameworkService.java | 4 +- .../service/ApiErrorLogFrameworkService.java | 4 +- .../InfApiErrorLogExportReqVO.java | 2 +- .../apierrorlog/InfApiErrorLogPageReqVO.java | 2 +- .../dataobject/logger/InfApiAccessLogDO.java | 2 +- .../dataobject/logger/InfApiErrorLogDO.java | 4 +- .../impl/InfApiAccessLogServiceImpl.java | 8 +- .../impl/InfApiErrorLogServiceImpl.java | 9 +- .../InfApiAccessLogServiceImplTest.java | 177 +++++++++++++++ .../logger/InfApiErrorLogServiceImplTest.java | 207 ++++++++++++++++++ src/test/resources/sql/create_tables.sql | 57 +++++ 11 files changed, 463 insertions(+), 13 deletions(-) create mode 100644 src/test/java/cn/iocoder/dashboard/modules/infra/service/logger/InfApiAccessLogServiceImplTest.java create mode 100644 src/test/java/cn/iocoder/dashboard/modules/infra/service/logger/InfApiErrorLogServiceImplTest.java diff --git a/src/main/java/cn/iocoder/dashboard/framework/logger/apilog/core/service/ApiAccessLogFrameworkService.java b/src/main/java/cn/iocoder/dashboard/framework/logger/apilog/core/service/ApiAccessLogFrameworkService.java index eda202ac3..ecafe5559 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/logger/apilog/core/service/ApiAccessLogFrameworkService.java +++ b/src/main/java/cn/iocoder/dashboard/framework/logger/apilog/core/service/ApiAccessLogFrameworkService.java @@ -3,6 +3,7 @@ package cn.iocoder.dashboard.framework.logger.apilog.core.service; import cn.iocoder.dashboard.framework.logger.apilog.core.service.dto.ApiAccessLogCreateDTO; import javax.validation.Valid; +import java.util.concurrent.Future; /** * API 访问日志 Framework Service 接口 @@ -15,7 +16,8 @@ public interface ApiAccessLogFrameworkService { * 创建 API 访问日志 * * @param createDTO 创建信息 + * @return 是否创建成功 */ - void createApiAccessLogAsync(@Valid ApiAccessLogCreateDTO createDTO); + Future createApiAccessLogAsync(@Valid ApiAccessLogCreateDTO createDTO); } diff --git a/src/main/java/cn/iocoder/dashboard/framework/logger/apilog/core/service/ApiErrorLogFrameworkService.java b/src/main/java/cn/iocoder/dashboard/framework/logger/apilog/core/service/ApiErrorLogFrameworkService.java index 032ef40e1..763db3a12 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/logger/apilog/core/service/ApiErrorLogFrameworkService.java +++ b/src/main/java/cn/iocoder/dashboard/framework/logger/apilog/core/service/ApiErrorLogFrameworkService.java @@ -3,6 +3,7 @@ package cn.iocoder.dashboard.framework.logger.apilog.core.service; import cn.iocoder.dashboard.framework.logger.apilog.core.service.dto.ApiErrorLogCreateDTO; import javax.validation.Valid; +import java.util.concurrent.Future; /** * API 错误日志 Framework Service 接口 @@ -15,7 +16,8 @@ public interface ApiErrorLogFrameworkService { * 创建 API 错误日志 * * @param createDTO 创建信息 + * @return 是否创建成功 */ - void createApiErrorLogAsync(@Valid ApiErrorLogCreateDTO createDTO); + Future createApiErrorLogAsync(@Valid ApiErrorLogCreateDTO createDTO); } diff --git a/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogExportReqVO.java b/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogExportReqVO.java index a5bc820c2..991987d0e 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogExportReqVO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogExportReqVO.java @@ -14,7 +14,7 @@ import static cn.iocoder.dashboard.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOU public class InfApiErrorLogExportReqVO { @ApiModelProperty(value = "用户编号", example = "666") - private Integer userId; + private Long userId; @ApiModelProperty(value = "用户类型", example = "1") private Integer userType; diff --git a/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogPageReqVO.java b/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogPageReqVO.java index 26f32411b..c966ab068 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogPageReqVO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogPageReqVO.java @@ -19,7 +19,7 @@ import static cn.iocoder.dashboard.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOU public class InfApiErrorLogPageReqVO extends PageParam { @ApiModelProperty(value = "用户编号", example = "666") - private Integer userId; + private Long userId; @ApiModelProperty(value = "用户类型", example = "1") private Integer userType; diff --git a/src/main/java/cn/iocoder/dashboard/modules/infra/dal/dataobject/logger/InfApiAccessLogDO.java b/src/main/java/cn/iocoder/dashboard/modules/infra/dal/dataobject/logger/InfApiAccessLogDO.java index 2a4d2cf19..ff32cea16 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/infra/dal/dataobject/logger/InfApiAccessLogDO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/infra/dal/dataobject/logger/InfApiAccessLogDO.java @@ -37,7 +37,7 @@ public class InfApiAccessLogDO extends BaseDO { /** * 用户编号 */ - private Integer userId; + private Long userId; /** * 用户类型 * diff --git a/src/main/java/cn/iocoder/dashboard/modules/infra/dal/dataobject/logger/InfApiErrorLogDO.java b/src/main/java/cn/iocoder/dashboard/modules/infra/dal/dataobject/logger/InfApiErrorLogDO.java index 855c70315..dbe326cb7 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/infra/dal/dataobject/logger/InfApiErrorLogDO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/infra/dal/dataobject/logger/InfApiErrorLogDO.java @@ -30,7 +30,7 @@ public class InfApiErrorLogDO extends BaseDO { /** * 用户编号 */ - private Integer userId; + private Long userId; /** * 链路追踪编号 * @@ -148,6 +148,6 @@ public class InfApiErrorLogDO extends BaseDO { * * 关联 {@link SysUserDO#getId()} */ - private Integer processUserId; + private Long processUserId; } diff --git a/src/main/java/cn/iocoder/dashboard/modules/infra/service/logger/impl/InfApiAccessLogServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/infra/service/logger/impl/InfApiAccessLogServiceImpl.java index f0d20aec4..7ed83d9e1 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/infra/service/logger/impl/InfApiAccessLogServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/infra/service/logger/impl/InfApiAccessLogServiceImpl.java @@ -9,12 +9,13 @@ import cn.iocoder.dashboard.modules.infra.dal.dataobject.logger.InfApiAccessLogD import cn.iocoder.dashboard.modules.infra.dal.mysql.logger.InfApiAccessLogMapper; import cn.iocoder.dashboard.modules.infra.service.logger.InfApiAccessLogService; import org.springframework.scheduling.annotation.Async; +import org.springframework.scheduling.annotation.AsyncResult; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; -import javax.validation.Valid; import java.util.List; +import java.util.concurrent.Future; /** * API 访问日志 Service 实现类 @@ -30,10 +31,11 @@ public class InfApiAccessLogServiceImpl implements InfApiAccessLogService { @Override @Async - public void createApiAccessLogAsync(ApiAccessLogCreateDTO createDTO) { + public Future createApiAccessLogAsync(ApiAccessLogCreateDTO createDTO) { // 插入 InfApiAccessLogDO apiAccessLog = InfApiAccessLogConvert.INSTANCE.convert(createDTO); - apiAccessLogMapper.insert(apiAccessLog); + int insert = apiAccessLogMapper.insert(apiAccessLog); + return new AsyncResult<>(insert == 1); } @Override diff --git a/src/main/java/cn/iocoder/dashboard/modules/infra/service/logger/impl/InfApiErrorLogServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/infra/service/logger/impl/InfApiErrorLogServiceImpl.java index c6a8418e4..647c0621b 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/infra/service/logger/impl/InfApiErrorLogServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/infra/service/logger/impl/InfApiErrorLogServiceImpl.java @@ -10,12 +10,14 @@ import cn.iocoder.dashboard.modules.infra.dal.mysql.logger.InfApiErrorLogMapper; import cn.iocoder.dashboard.modules.infra.enums.logger.InfApiErrorLogProcessStatusEnum; import cn.iocoder.dashboard.modules.infra.service.logger.InfApiErrorLogService; import org.springframework.scheduling.annotation.Async; +import org.springframework.scheduling.annotation.AsyncResult; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.util.Date; import java.util.List; +import java.util.concurrent.Future; import static cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.API_ERROR_LOG_NOT_FOUND; @@ -35,10 +37,11 @@ public class InfApiErrorLogServiceImpl implements InfApiErrorLogService { @Override @Async - public void createApiErrorLogAsync(ApiErrorLogCreateDTO createDTO) { + public Future createApiErrorLogAsync(ApiErrorLogCreateDTO createDTO) { InfApiErrorLogDO apiErrorLog = InfApiErrorLogConvert.INSTANCE.convert(createDTO); apiErrorLog.setProcessStatus(InfApiErrorLogProcessStatusEnum.INIT.getStatus()); - apiErrorLogMapper.insert(apiErrorLog); + int insert = apiErrorLogMapper.insert(apiErrorLog); + return new AsyncResult<>(insert == 1); } @Override @@ -62,7 +65,7 @@ public class InfApiErrorLogServiceImpl implements InfApiErrorLogService { } // 标记处理 apiErrorLogMapper.updateById(InfApiErrorLogDO.builder().id(id).processStatus(processStatus) - .processUserId(processStatus).processTime(new Date()).build()); + .processUserId(processUserId).processTime(new Date()).build()); } } diff --git a/src/test/java/cn/iocoder/dashboard/modules/infra/service/logger/InfApiAccessLogServiceImplTest.java b/src/test/java/cn/iocoder/dashboard/modules/infra/service/logger/InfApiAccessLogServiceImplTest.java new file mode 100644 index 000000000..51b57fe4e --- /dev/null +++ b/src/test/java/cn/iocoder/dashboard/modules/infra/service/logger/InfApiAccessLogServiceImplTest.java @@ -0,0 +1,177 @@ +package cn.iocoder.dashboard.modules.infra.service.logger; + +import cn.hutool.core.util.RandomUtil; +import cn.iocoder.dashboard.BaseDbUnitTest; +import cn.iocoder.dashboard.common.enums.UserTypeEnum; +import cn.iocoder.dashboard.common.exception.enums.GlobalErrorCodeConstants; +import cn.iocoder.dashboard.common.pojo.PageResult; +import cn.iocoder.dashboard.framework.logger.apilog.core.service.dto.ApiAccessLogCreateDTO; +import cn.iocoder.dashboard.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogExportReqVO; +import cn.iocoder.dashboard.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogPageReqVO; +import cn.iocoder.dashboard.modules.infra.dal.dataobject.logger.InfApiAccessLogDO; +import cn.iocoder.dashboard.modules.infra.dal.mysql.logger.InfApiAccessLogMapper; +import cn.iocoder.dashboard.modules.infra.service.logger.impl.InfApiAccessLogServiceImpl; +import cn.iocoder.dashboard.util.RandomUtils; +import cn.iocoder.dashboard.util.object.ObjectUtils; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; +import java.util.concurrent.Future; + +import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.dashboard.util.date.DateUtils.buildTime; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +/** + * {@link InfApiAccessLogServiceImpl} 单元测试 + */ +@Import(InfApiAccessLogServiceImpl.class) +public class InfApiAccessLogServiceImplTest extends BaseDbUnitTest { + + @Resource + private InfApiAccessLogService infApiAccessLogServiceImpl; + + @Resource + private InfApiAccessLogMapper infApiAccessLogMapper; + + + @Test + public void testCreateApiAccessLogAsync() throws Exception { + ApiAccessLogCreateDTO createDTO = RandomUtils.randomPojo( + ApiAccessLogCreateDTO.class, + dto -> dto.setUserType(RandomUtil.randomEle(UserTypeEnum.values()).getValue()) + ); + + // 执行service方法 + Future future = infApiAccessLogServiceImpl.createApiAccessLogAsync(createDTO); + + // 等异步执行完 + future.get(); + + InfApiAccessLogDO infApiAccessLogDO = infApiAccessLogMapper.selectOne(null); + // 断言 + assertNotNull(infApiAccessLogDO); + // 断言,忽略基本字段 + assertPojoEquals(createDTO, infApiAccessLogDO); + } + + + @Test + public void testGetApiAccessLogPage() { + // 构造测试数据 + long userId = 2233L; + int userType = UserTypeEnum.ADMIN.getValue(); + String applicationName = "ruoyi-test"; + String requestUrl = "foo"; + Date beginTime = buildTime(2021, 3, 13); + int duration = 1000; + int resultCode = GlobalErrorCodeConstants.SUCCESS.getCode(); + + InfApiAccessLogDO infApiAccessLogDO = RandomUtils.randomPojo(InfApiAccessLogDO.class, dto -> { + dto.setUserId(userId); + dto.setUserType(userType); + dto.setApplicationName(applicationName); + dto.setRequestUrl(requestUrl); + dto.setBeginTime(beginTime); + dto.setDuration(duration); + dto.setResultCode(resultCode); + }); + infApiAccessLogMapper.insert(infApiAccessLogDO); + + // 下面几个都是不匹配的数据 + // userId 不同的 + infApiAccessLogMapper.insert(ObjectUtils.clone(infApiAccessLogDO, logDO -> logDO.setUserId(3344L))); + // userType + infApiAccessLogMapper.insert(ObjectUtils.clone(infApiAccessLogDO, logDO -> logDO.setUserType(UserTypeEnum.MEMBER.getValue()))); + // applicationName 不同的 + infApiAccessLogMapper.insert(ObjectUtils.clone(infApiAccessLogDO, logDO -> logDO.setApplicationName("test"))); + // requestUrl 不同的 + infApiAccessLogMapper.insert(ObjectUtils.clone(infApiAccessLogDO, logDO -> logDO.setRequestUrl("bar"))); + // 构造一个早期时间 2021-02-06 00:00:00 + infApiAccessLogMapper.insert(ObjectUtils.clone(infApiAccessLogDO, logDO -> logDO.setBeginTime(buildTime(2021, 2, 6)))); + // duration 不同的 + infApiAccessLogMapper.insert(ObjectUtils.clone(infApiAccessLogDO, logDO -> logDO.setDuration(100))); + // resultCode 不同的 + infApiAccessLogMapper.insert(ObjectUtils.clone(infApiAccessLogDO, logDO -> logDO.setResultCode(2))); + + // 构造调用参数 + InfApiAccessLogPageReqVO reqVO = new InfApiAccessLogPageReqVO(); + reqVO.setUserId(userId); + reqVO.setUserType(userType); + reqVO.setApplicationName(applicationName); + reqVO.setRequestUrl(requestUrl); + reqVO.setBeginBeginTime(buildTime(2021, 3, 12)); + reqVO.setEndBeginTime(buildTime(2021, 3, 14)); + reqVO.setDuration(duration); + reqVO.setResultCode(resultCode); + + // 调用service方法 + PageResult pageResult = infApiAccessLogServiceImpl.getApiAccessLogPage(reqVO); + + // 断言,只查到了一条符合条件的 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(infApiAccessLogDO, pageResult.getList().get(0)); + } + + @Test + public void testGetApiAccessLogList() { + // 构造测试数据 + long userId = 2233L; + int userType = UserTypeEnum.ADMIN.getValue(); + String applicationName = "ruoyi-test"; + String requestUrl = "foo"; + Date beginTime = buildTime(2021, 3, 13); + int duration = 1000; + int resultCode = GlobalErrorCodeConstants.SUCCESS.getCode(); + + InfApiAccessLogDO infApiAccessLogDO = RandomUtils.randomPojo(InfApiAccessLogDO.class, dto -> { + dto.setUserId(userId); + dto.setUserType(userType); + dto.setApplicationName(applicationName); + dto.setRequestUrl(requestUrl); + dto.setBeginTime(beginTime); + dto.setDuration(duration); + dto.setResultCode(resultCode); + }); + infApiAccessLogMapper.insert(infApiAccessLogDO); + + // 下面几个都是不匹配的数据 + // userId 不同的 + infApiAccessLogMapper.insert(ObjectUtils.clone(infApiAccessLogDO, logDO -> logDO.setUserId(3344L))); + // userType + infApiAccessLogMapper.insert(ObjectUtils.clone(infApiAccessLogDO, logDO -> logDO.setUserType(UserTypeEnum.MEMBER.getValue()))); + // applicationName 不同的 + infApiAccessLogMapper.insert(ObjectUtils.clone(infApiAccessLogDO, logDO -> logDO.setApplicationName("test"))); + // requestUrl 不同的 + infApiAccessLogMapper.insert(ObjectUtils.clone(infApiAccessLogDO, logDO -> logDO.setRequestUrl("bar"))); + // 构造一个早期时间 2021-02-06 00:00:00 + infApiAccessLogMapper.insert(ObjectUtils.clone(infApiAccessLogDO, logDO -> logDO.setBeginTime(buildTime(2021, 2, 6)))); + // duration 不同的 + infApiAccessLogMapper.insert(ObjectUtils.clone(infApiAccessLogDO, logDO -> logDO.setDuration(100))); + // resultCode 不同的 + infApiAccessLogMapper.insert(ObjectUtils.clone(infApiAccessLogDO, logDO -> logDO.setResultCode(2))); + + // 构造调用参数 + InfApiAccessLogExportReqVO reqVO = new InfApiAccessLogExportReqVO(); + reqVO.setUserId(userId); + reqVO.setUserType(userType); + reqVO.setApplicationName(applicationName); + reqVO.setRequestUrl(requestUrl); + reqVO.setBeginBeginTime(buildTime(2021, 3, 12)); + reqVO.setEndBeginTime(buildTime(2021, 3, 14)); + reqVO.setDuration(duration); + reqVO.setResultCode(resultCode); + + // 调用service方法 + List list = infApiAccessLogServiceImpl.getApiAccessLogList(reqVO); + + // 断言,只查到了一条符合条件的 + assertEquals(1, list.size()); + assertPojoEquals(infApiAccessLogDO, list.get(0)); + } +} diff --git a/src/test/java/cn/iocoder/dashboard/modules/infra/service/logger/InfApiErrorLogServiceImplTest.java b/src/test/java/cn/iocoder/dashboard/modules/infra/service/logger/InfApiErrorLogServiceImplTest.java new file mode 100644 index 000000000..79a0cfde3 --- /dev/null +++ b/src/test/java/cn/iocoder/dashboard/modules/infra/service/logger/InfApiErrorLogServiceImplTest.java @@ -0,0 +1,207 @@ +package cn.iocoder.dashboard.modules.infra.service.logger; + +import cn.hutool.core.util.RandomUtil; +import cn.iocoder.dashboard.BaseDbUnitTest; +import cn.iocoder.dashboard.common.enums.UserTypeEnum; +import cn.iocoder.dashboard.common.pojo.PageResult; +import cn.iocoder.dashboard.framework.logger.apilog.core.service.dto.ApiErrorLogCreateDTO; +import cn.iocoder.dashboard.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogExportReqVO; +import cn.iocoder.dashboard.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogPageReqVO; +import cn.iocoder.dashboard.modules.infra.dal.dataobject.logger.InfApiErrorLogDO; +import cn.iocoder.dashboard.modules.infra.dal.mysql.logger.InfApiErrorLogMapper; +import cn.iocoder.dashboard.modules.infra.enums.logger.InfApiErrorLogProcessStatusEnum; +import cn.iocoder.dashboard.modules.infra.service.logger.impl.InfApiErrorLogServiceImpl; +import cn.iocoder.dashboard.util.RandomUtils; +import cn.iocoder.dashboard.util.object.ObjectUtils; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; +import java.util.concurrent.Future; + +import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.API_ERROR_LOG_NOT_FOUND; +import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.API_ERROR_LOG_PROCESSED; +import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.dashboard.util.AssertUtils.assertServiceException; +import static cn.iocoder.dashboard.util.date.DateUtils.buildTime; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +/** + * {@link InfApiErrorLogServiceImpl} 单元测试 + */ +@Import(InfApiErrorLogServiceImpl.class) +public class InfApiErrorLogServiceImplTest extends BaseDbUnitTest { + + @Resource + private InfApiErrorLogService infApiErrorLogServiceImpl; + + @Resource + private InfApiErrorLogMapper infApiErrorLogMapper; + + + @Test + public void testCreateApiErrorLogAsync() throws Exception { + ApiErrorLogCreateDTO createDTO = RandomUtils.randomPojo( + ApiErrorLogCreateDTO.class, + dto -> dto.setUserType(RandomUtil.randomEle(UserTypeEnum.values()).getValue()) + ); + + // 执行service方法 + Future future = infApiErrorLogServiceImpl.createApiErrorLogAsync(createDTO); + + // 等异步执行完 + future.get(); + + InfApiErrorLogDO infApiErrorLogDO = infApiErrorLogMapper.selectOne(null); + // 断言 + assertNotNull(infApiErrorLogDO); + // 断言,忽略基本字段 + assertPojoEquals(createDTO, infApiErrorLogDO); + } + + + @Test + public void testGetApiErrorLogPage() { + // 构造测试数据 + long userId = 2233L; + int userType = UserTypeEnum.ADMIN.getValue(); + String applicationName = "ruoyi-test"; + String requestUrl = "foo"; + Date beginTime = buildTime(2021, 3, 13); + int progressStatus = InfApiErrorLogProcessStatusEnum.INIT.getStatus(); + + InfApiErrorLogDO infApiErrorLogDO = RandomUtils.randomPojo(InfApiErrorLogDO.class, logDO -> { + logDO.setUserId(userId); + logDO.setUserType(userType); + logDO.setApplicationName(applicationName); + logDO.setRequestUrl(requestUrl); + logDO.setExceptionTime(beginTime); + logDO.setProcessStatus(progressStatus); + }); + infApiErrorLogMapper.insert(infApiErrorLogDO); + + // 下面几个都是不匹配的数据 + // userId 不同的 + infApiErrorLogMapper.insert(ObjectUtils.clone(infApiErrorLogDO, logDO -> logDO.setUserId(3344L))); + // userType + infApiErrorLogMapper.insert(ObjectUtils.clone(infApiErrorLogDO, logDO -> logDO.setUserType(UserTypeEnum.MEMBER.getValue()))); + // applicationName 不同的 + infApiErrorLogMapper.insert(ObjectUtils.clone(infApiErrorLogDO, logDO -> logDO.setApplicationName("test"))); + // requestUrl 不同的 + infApiErrorLogMapper.insert(ObjectUtils.clone(infApiErrorLogDO, logDO -> logDO.setRequestUrl("bar"))); + // 构造一个早期时间 2021-02-06 00:00:00 + infApiErrorLogMapper.insert(ObjectUtils.clone(infApiErrorLogDO, logDO -> logDO.setExceptionTime(buildTime(2021, 2, 6)))); + // progressStatus 不同的 + infApiErrorLogMapper.insert(ObjectUtils.clone(infApiErrorLogDO, logDO -> logDO.setProcessStatus(InfApiErrorLogProcessStatusEnum.DONE.getStatus()))); + + // 构造调用参数 + InfApiErrorLogPageReqVO reqVO = new InfApiErrorLogPageReqVO(); + reqVO.setUserId(userId); + reqVO.setUserType(userType); + reqVO.setApplicationName(applicationName); + reqVO.setRequestUrl(requestUrl); + reqVO.setBeginExceptionTime(buildTime(2021, 3, 12)); + reqVO.setEndExceptionTime(buildTime(2021, 3, 14)); + reqVO.setProcessStatus(progressStatus); + + // 调用service方法 + PageResult pageResult = infApiErrorLogServiceImpl.getApiErrorLogPage(reqVO); + + // 断言,只查到了一条符合条件的 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(infApiErrorLogDO, pageResult.getList().get(0)); + } + + @Test + public void testGetApiErrorLogList() { + // 构造测试数据 + long userId = 2233L; + int userType = UserTypeEnum.ADMIN.getValue(); + String applicationName = "ruoyi-test"; + String requestUrl = "foo"; + Date beginTime = buildTime(2021, 3, 13); + int progressStatus = InfApiErrorLogProcessStatusEnum.INIT.getStatus(); + + InfApiErrorLogDO infApiErrorLogDO = RandomUtils.randomPojo(InfApiErrorLogDO.class, logDO -> { + logDO.setUserId(userId); + logDO.setUserType(userType); + logDO.setApplicationName(applicationName); + logDO.setRequestUrl(requestUrl); + logDO.setExceptionTime(beginTime); + logDO.setProcessStatus(progressStatus); + }); + infApiErrorLogMapper.insert(infApiErrorLogDO); + + // 下面几个都是不匹配的数据 + // userId 不同的 + infApiErrorLogMapper.insert(ObjectUtils.clone(infApiErrorLogDO, logDO -> logDO.setUserId(3344L))); + // userType + infApiErrorLogMapper.insert(ObjectUtils.clone(infApiErrorLogDO, logDO -> logDO.setUserType(UserTypeEnum.MEMBER.getValue()))); + // applicationName 不同的 + infApiErrorLogMapper.insert(ObjectUtils.clone(infApiErrorLogDO, logDO -> logDO.setApplicationName("test"))); + // requestUrl 不同的 + infApiErrorLogMapper.insert(ObjectUtils.clone(infApiErrorLogDO, logDO -> logDO.setRequestUrl("bar"))); + // 构造一个早期时间 2021-02-06 00:00:00 + infApiErrorLogMapper.insert(ObjectUtils.clone(infApiErrorLogDO, logDO -> logDO.setExceptionTime(buildTime(2021, 2, 6)))); + // progressStatus 不同的 + infApiErrorLogMapper.insert(ObjectUtils.clone(infApiErrorLogDO, logDO -> logDO.setProcessStatus(InfApiErrorLogProcessStatusEnum.DONE.getStatus()))); + + // 构造调用参数 + InfApiErrorLogExportReqVO reqVO = new InfApiErrorLogExportReqVO(); + reqVO.setUserId(userId); + reqVO.setUserType(userType); + reqVO.setApplicationName(applicationName); + reqVO.setRequestUrl(requestUrl); + reqVO.setBeginExceptionTime(buildTime(2021, 3, 12)); + reqVO.setEndExceptionTime(buildTime(2021, 3, 14)); + reqVO.setProcessStatus(progressStatus); + + // 调用service方法 + List list = infApiErrorLogServiceImpl.getApiErrorLogList(reqVO); + + // 断言,只查到了一条符合条件的 + assertEquals(1, list.size()); + assertPojoEquals(infApiErrorLogDO, list.get(0)); + } + + + @Test + public void testUpdateApiErrorLogProcess() { + // 先构造两条数据,第一条用于抛出异常,第二条用于正常的执行update操作 + Long processUserId = 2233L; + + InfApiErrorLogDO first = RandomUtils.randomPojo(InfApiErrorLogDO.class, logDO -> { + logDO.setProcessUserId(processUserId); + logDO.setUserType(UserTypeEnum.ADMIN.getValue()); + logDO.setProcessStatus(InfApiErrorLogProcessStatusEnum.DONE.getStatus()); + }); + infApiErrorLogMapper.insert(first); + + InfApiErrorLogDO second = RandomUtils.randomPojo(InfApiErrorLogDO.class, logDO -> { + logDO.setProcessUserId(1122L); + logDO.setUserType(UserTypeEnum.ADMIN.getValue()); + logDO.setProcessStatus(InfApiErrorLogProcessStatusEnum.INIT.getStatus()); + }); + infApiErrorLogMapper.insert(second); + + Long firstId = first.getId(); + Long secondId = second.getId(); + + // 执行正常的 update 操作 + infApiErrorLogServiceImpl.updateApiErrorLogProcess(secondId, InfApiErrorLogProcessStatusEnum.DONE.getStatus(), processUserId); + InfApiErrorLogDO secondSelect = infApiErrorLogMapper.selectOne("id", secondId); + + // id 为 0 查询不到,应该抛出异常 API_ERROR_LOG_NOT_FOUND + assertServiceException(() -> infApiErrorLogServiceImpl.updateApiErrorLogProcess(0L, InfApiErrorLogProcessStatusEnum.DONE.getStatus(), processUserId), API_ERROR_LOG_NOT_FOUND); + // id 为 first 的 progressStatus 为 DONE ,应该抛出 API_ERROR_LOG_PROCESSED + assertServiceException(() -> infApiErrorLogServiceImpl.updateApiErrorLogProcess(firstId, InfApiErrorLogProcessStatusEnum.DONE.getStatus(), processUserId), API_ERROR_LOG_PROCESSED); + // 验证 progressStatus 是否修改成功 + assertEquals(InfApiErrorLogProcessStatusEnum.DONE.getStatus(), secondSelect.getProcessStatus()); + // 验证 progressUserId 是否修改成功 + assertEquals(processUserId, secondSelect.getProcessUserId()); + } +} diff --git a/src/test/resources/sql/create_tables.sql b/src/test/resources/sql/create_tables.sql index 4a9d218b9..26c588717 100644 --- a/src/test/resources/sql/create_tables.sql +++ b/src/test/resources/sql/create_tables.sql @@ -241,3 +241,60 @@ create table IF NOT EXISTS "sys_user" ( "deleted" bit not null default false, primary key ("id") ) comment '用户信息表'; + + +create table "inf_api_access_log" ( + "id" bigint not null GENERATED BY DEFAULT AS IDENTITY, + "trace_id" varchar(64) not null default '', + "user_id" bigint not null default '0', + "user_type" tinyint not null default '0', + "application_name" varchar(50) not null, + "request_method" varchar(16) not null default '', + "request_url" varchar(255) not null default '', + "request_params" varchar(8000) not null default '', + "user_ip" varchar(50) not null, + "user_agent" varchar(512) not null, + "begin_time" timestamp not null, + "end_time" timestamp not null, + "duration" integer not null, + "result_code" integer not null default '0', + "result_msg" varchar(512) default '', + "creator" varchar(64) default '', + "create_time" timestamp not null default current_timestamp, + "updater" varchar(64) default '', + "update_time" timestamp not null default current_timestamp, + "deleted" bit not null default false, + primary key ("id") +) comment 'API 访问日志表'; + + +create table "inf_api_error_log" ( + "id" integer not null GENERATED BY DEFAULT AS IDENTITY, + "trace_id" varchar(64) not null, + "user_id" bigint not null default '0', + "user_type" tinyint not null default '0', + "application_name" varchar(50) not null, + "request_method" varchar(16) not null, + "request_url" varchar(255) not null, + "request_params" varchar(8000) not null, + "user_ip" varchar(50) not null, + "user_agent" varchar(512) not null, + "exception_time" timestamp not null, + "exception_name" varchar(128) not null default '', + "exception_message" clob not null, + "exception_root_cause_message" clob not null, + "exception_stack_trace" clob not null, + "exception_class_name" varchar(512) not null, + "exception_file_name" varchar(512) not null, + "exception_method_name" varchar(512) not null, + "exception_line_number" integer not null, + "process_status" tinyint not null, + "process_time" timestamp default null, + "process_user_id" bigint default '0', + "creator" varchar(64) default '', + "create_time" timestamp not null default current_timestamp, + "updater" varchar(64) default '', + "update_time" timestamp not null default current_timestamp, + "deleted" bit not null default false, + primary key ("id") +) comment '系统异常日志'; \ No newline at end of file From 6e7f8f570de3700cd3826fdcf9f8a6fb9540913a Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 14 Mar 2021 00:02:23 +0800 Subject: [PATCH 047/126] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=85=A8=E5=B1=80=20?= =?UTF-8?q?lombok=20=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lombok.config | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 lombok.config diff --git a/lombok.config b/lombok.config new file mode 100644 index 000000000..c6488faea --- /dev/null +++ b/lombok.config @@ -0,0 +1,4 @@ +config.stopBubbling = true +lombok.tostring.callsuper=true +lombok.equalsandhashcode.callsuper=true +lombok.accessors.chain=true From 2fcb54b57661a935cbe650610e31929e4af9dbfd Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 14 Mar 2021 00:58:39 +0800 Subject: [PATCH 048/126] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E6=96=87=E6=A1=A3=E7=9A=84=20html=E3=80=81word?= =?UTF-8?q?=E3=80=81markdown=20=E7=9A=84=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-ui/src/api/infra/dbDoc.js | 16 +++++++ ruoyi-ui/src/main.js | 8 +++- ruoyi-ui/src/utils/ruoyi.js | 15 +++++++ ruoyi-ui/src/views/tool/dbDoc/index.vue | 42 ++++++++++++++++--- .../controller/doc/InfDbDocController.java | 20 +++------ 5 files changed, 81 insertions(+), 20 deletions(-) diff --git a/ruoyi-ui/src/api/infra/dbDoc.js b/ruoyi-ui/src/api/infra/dbDoc.js index de54981d1..015c6d71d 100644 --- a/ruoyi-ui/src/api/infra/dbDoc.js +++ b/ruoyi-ui/src/api/infra/dbDoc.js @@ -8,3 +8,19 @@ export function exportHtml() { responseType: 'blob' }) } + +export function exportWord() { + return request({ + url: '/infra/db-doc/export-word', + method: 'get', + responseType: 'blob' + }) +} + +export function exportMarkdown() { + return request({ + url: '/infra/db-doc/export-markdown', + method: 'get', + responseType: 'blob' + }) +} diff --git a/ruoyi-ui/src/main.js b/ruoyi-ui/src/main.js index 91556bf68..e1f067fa1 100644 --- a/ruoyi-ui/src/main.js +++ b/ruoyi-ui/src/main.js @@ -25,7 +25,10 @@ import { download, handleTree, downloadExcel, - downloadZip + downloadWord, + downloadZip, + downloadHtml, + downloadMarkdown, } from "@/utils/ruoyi"; import Pagination from "@/components/Pagination"; // 自定义表格工具扩展 @@ -48,6 +51,9 @@ Vue.prototype.getDictDataLabel = getDictDataLabel Vue.prototype.DICT_TYPE = DICT_TYPE Vue.prototype.download = download Vue.prototype.downloadExcel = downloadExcel +Vue.prototype.downloadWord = downloadWord +Vue.prototype.downloadHtml = downloadHtml +Vue.prototype.downloadMarkdown = downloadMarkdown Vue.prototype.downloadZip = downloadZip Vue.prototype.handleTree = handleTree diff --git a/ruoyi-ui/src/utils/ruoyi.js b/ruoyi-ui/src/utils/ruoyi.js index 17f235f22..82f8aecc5 100644 --- a/ruoyi-ui/src/utils/ruoyi.js +++ b/ruoyi-ui/src/utils/ruoyi.js @@ -120,11 +120,26 @@ export function downloadExcel(data, fileName) { download0(data, fileName, 'application/vnd.ms-excel'); } +// 下载 Word 方法 +export function downloadWord(data, fileName) { + download0(data, fileName, 'application/msword'); +} + // 下载 Zip 方法 export function downloadZip(data, fileName) { download0(data, fileName, 'application/zip'); } +// 下载 Html 方法 +export function downloadHtml(data, fileName) { + download0(data, fileName, 'text/html'); +} + +// 下载 Markdown 方法 +export function downloadMarkdown(data, fileName) { + download0(data, fileName, 'text/markdown'); +} + function download0(data, fileName, mineType) { // 创建 blob let blob = new Blob([data], {type: mineType}); diff --git a/ruoyi-ui/src/views/tool/dbDoc/index.vue b/ruoyi-ui/src/views/tool/dbDoc/index.vue index e0c71564b..274d1372e 100644 --- a/ruoyi-ui/src/views/tool/dbDoc/index.vue +++ b/ruoyi-ui/src/views/tool/dbDoc/index.vue @@ -1,10 +1,21 @@