新增开发终端管理器,任务偏好设置,配置管理,采集器类型

segment2.0
linrf 2 years ago
parent 931194abcf
commit 7c9d82f24d

@ -52,5 +52,4 @@ public class MsgConstants {
*/ */
public static final String SCH_DISTRIBUTE_TASKS = "9".trim(); public static final String SCH_DISTRIBUTE_TASKS = "9".trim();
} }

@ -1,9 +1,15 @@
package com.docus.server.common.netty; package com.docus.server.common.netty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable; import java.io.Serializable;
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Data @Data
public class CommMsg<MSG_CONTENT extends Serializable> implements Serializable { public class CommMsg<MSG_CONTENT extends Serializable> implements Serializable {

@ -17,6 +17,7 @@ import java.util.concurrent.ConcurrentHashMap;
@Component @Component
@Slf4j @Slf4j
public class ChannelRepository { public class ChannelRepository {
@Resource @Resource
private ISchTerminatorService iSchTerminatorService; private ISchTerminatorService iSchTerminatorService;
@ -33,6 +34,7 @@ public class ChannelRepository {
CHANNEL_CACHE_MAP.put(key, value); CHANNEL_CACHE_MAP.put(key, value);
AttributeKey<String> attributeKey = AttributeKey.valueOf("user"); AttributeKey<String> attributeKey = AttributeKey.valueOf("user");
value.attr(attributeKey).set(key); value.attr(attributeKey).set(key);
iSchTerminatorService.saveOrUpdate(key, onlineState); iSchTerminatorService.saveOrUpdate(key, onlineState);
} }
@ -57,6 +59,7 @@ public class ChannelRepository {
*/ */
public void remove(String key) { public void remove(String key) {
CHANNEL_CACHE_MAP.remove(key); CHANNEL_CACHE_MAP.remove(key);
iSchTerminatorService.saveOrUpdate(key, OnlineStateEnum.OFFLINE); iSchTerminatorService.saveOrUpdate(key, OnlineStateEnum.OFFLINE);
} }

@ -56,22 +56,6 @@ public class NettyBusinessHandler extends SimpleChannelInboundHandler<ByteBuf> {
String messageTime = commMsg.getMessageTime(); String messageTime = commMsg.getMessageTime();
TerminatorContent messageContent = commMsg.getContent(); TerminatorContent messageContent = commMsg.getContent();
// if (messageType.equals(MsgConstants.ONLINE_REGISTER)) {
// log.info("接受到【采集器-终端】的上线注册消息:消息类型={},消息时间={},消息内容={}", messageType, messageTime, messageContent);
// InetSocketAddress ipSocket = (InetSocketAddress) channelHandlerContext.channel().remoteAddress();
// String clientIp = ipSocket.getAddress().getHostAddress();
// log.info("【采集器-终端IP】:{},连接上线,IP地址信息:{}", clientIp, clientIp);
// Channel channel = repository.get(clientIp);
// if (channel != null && channel.isOpen()) {
// channel.close();
// }
//
// /*
// * 将ip和channel进行映射
// */
// repository.put(clientIp, channelHandlerContext.channel(), OnlineStateEnum.OFFLINE);
// }
if (messageType.equals(MsgConstants.TERMINATOR_RESTART)) { if (messageType.equals(MsgConstants.TERMINATOR_RESTART)) {
log.info("接受到终端重启命令,内容{}", messageContent); log.info("接受到终端重启命令,内容{}", messageContent);
} }
@ -112,13 +96,14 @@ public class NettyBusinessHandler extends SimpleChannelInboundHandler<ByteBuf> {
repository.put(clientIp, ctx.channel(), OnlineStateEnum.OFFLINE); repository.put(clientIp, ctx.channel(), OnlineStateEnum.OFFLINE);
DEFAULT_CHANNEL_GROUP.add(ctx.channel()); DEFAULT_CHANNEL_GROUP.add(ctx.channel());
System.out.println(ctx.channel().remoteAddress() + " 上线," + "在线数量:" + DEFAULT_CHANNEL_GROUP.size());
System.out.println(ctx.channel().remoteAddress() + " 上线," + "【采集器-终端】在线数量:" + DEFAULT_CHANNEL_GROUP.size());
} }
@Override @Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception { public void channelInactive(ChannelHandlerContext ctx) throws Exception {
Channel channel = ctx.channel(); Channel channel = ctx.channel();
System.out.println(channel.remoteAddress() + " 下线," + "在线数量:" + DEFAULT_CHANNEL_GROUP.size()); System.out.println(channel.remoteAddress() + " 下线," + "【采集器-终端】在线数量:" + DEFAULT_CHANNEL_GROUP.size());
} }
@Override @Override

@ -60,9 +60,8 @@ public class NettyHeartbeatHandler extends ChannelInboundHandlerAdapter {
if (channel != null && channel.isOpen()) { if (channel != null && channel.isOpen()) {
channel.close(); channel.close();
} }
/*
* ipchannel //将ip和channel进行映射
*/
repository.put(clientIp, channelHandlerContext.channel(), OnlineStateEnum.ONLINE); repository.put(clientIp, channelHandlerContext.channel(), OnlineStateEnum.ONLINE);
} else { } else {
@ -71,7 +70,6 @@ public class NettyHeartbeatHandler extends ChannelInboundHandlerAdapter {
channelHandlerContext.fireChannelRead(msg); channelHandlerContext.fireChannelRead(msg);
} }
} }
// ReferenceCountUtil.release(msg);
} }
private ChannelRepository repository; private ChannelRepository repository;
@ -80,28 +78,12 @@ public class NettyHeartbeatHandler extends ChannelInboundHandlerAdapter {
this.repository = repository; this.repository = repository;
} }
// @Override
// public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
// if (evt instanceof IdleStateEvent) {
// IdleStateEvent event = (IdleStateEvent) evt;
// if (event.state() == IdleState.READER_IDLE) {
// String clientId = repository.getClientKey(ctx.channel());
// //移除工控机缓存,设备离线
// repository.remove(clientId);
// log.info("{},关闭这个不活跃通道=================>", clientId);
// ctx.channel().close();
// }
// } else {
// super.userEventTriggered(ctx, evt);
// }
// }
@Override @Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
cause.printStackTrace(); cause.printStackTrace();
String clientId = repository.getClientKey(ctx.channel()); String clientId = repository.getClientKey(ctx.channel());
log.error("通道发生异常,终端连接:{}", clientId); log.error("通道发生异常,终端连接:{}", clientId);
//移除工控机缓存,设备离线 //移除终端,终端离线
if (clientId != null) { if (clientId != null) {
repository.remove(clientId); repository.remove(clientId);
} }

@ -0,0 +1,40 @@
package com.docus.server.controller;
import com.docus.core.util.DateUtil;
import com.docus.core.util.json.JSON;
import com.docus.server.api.scheduling.management.CommMsgApi;
import com.docus.server.common.netty.CommMsg;
import com.docus.server.common.netty.server.ChannelRepository;
import com.docus.server.convert.CommMsgConvert;
import com.docus.server.dto.scheduling.management.schterminator.CommMsgDTO;
import io.netty.buffer.Unpooled;
import io.netty.channel.Channel;
import io.netty.util.CharsetUtil;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.Date;
/**
* TCP API
*
* @author AutoGenerator
* @since 2023-07-15
*/
@RestController
public class CommMsgController implements CommMsgApi {
@Resource
private ChannelRepository channelRepository;
@Override
public void clientCommand(CommMsgDTO commMsgDTO) {
Channel channel = channelRepository.get(commMsgDTO.getTerminatorIp());
CommMsg commMsg = CommMsgConvert.INSTANCE.convertDO(commMsgDTO);
commMsg.setMessageTime(DateUtil.formatDateTime(new Date()));
if (channel != null) {
channel.writeAndFlush(Unpooled.copiedBuffer(JSON.toJSON(commMsg), CharsetUtil.UTF_8));
}
}
}

@ -1,5 +1,6 @@
package com.docus.server.controller; package com.docus.server.controller;
import com.docus.core.util.json.JSON;
import com.docus.infrastructure.web.request.SearchDTO; import com.docus.infrastructure.web.request.SearchDTO;
import com.docus.infrastructure.web.response.PageResult; import com.docus.infrastructure.web.response.PageResult;
import com.docus.server.api.scheduling.management.SchCollectorConfigApi; import com.docus.server.api.scheduling.management.SchCollectorConfigApi;
@ -8,9 +9,11 @@ import com.docus.server.dto.scheduling.management.schcollectorconfig.DeleteSchCo
import com.docus.server.dto.scheduling.management.schcollectorconfig.EditSchCollectorConfigDTO; import com.docus.server.dto.scheduling.management.schcollectorconfig.EditSchCollectorConfigDTO;
import com.docus.server.service.ISchCollectorConfigService; import com.docus.server.service.ISchCollectorConfigService;
import com.docus.server.vo.scheduling.management.schcollectorconfig.SchCollectorConfigVO; import com.docus.server.vo.scheduling.management.schcollectorconfig.SchCollectorConfigVO;
import com.google.common.collect.Maps;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.HashMap;
/** /**
* *
@ -77,4 +80,15 @@ public class SchCollectorConfigController implements SchCollectorConfigApi {
public int delete(DeleteSchCollectorConfigDTO deleteSchCollectorConfigDTO) { public int delete(DeleteSchCollectorConfigDTO deleteSchCollectorConfigDTO) {
return iSchCollectorConfigService.delete(deleteSchCollectorConfigDTO); return iSchCollectorConfigService.delete(deleteSchCollectorConfigDTO);
} }
public static void main(String[] args) {
HashMap<Object, Object> objectObjectHashMap = Maps.newHashMap();
objectObjectHashMap.put("ocr.url", "http://192.168.2.13/ocr");
objectObjectHashMap.put("ocr.name", "lin");
objectObjectHashMap.put("ocr.pwd", "123");
System.out.println(JSON.toJSON(objectObjectHashMap));
}
} }

@ -3,6 +3,7 @@ package com.docus.server.controller;
import com.docus.infrastructure.web.request.SearchDTO; import com.docus.infrastructure.web.request.SearchDTO;
import com.docus.infrastructure.web.response.PageResult; import com.docus.infrastructure.web.response.PageResult;
import com.docus.server.api.scheduling.management.SchTerminatorApi; import com.docus.server.api.scheduling.management.SchTerminatorApi;
import com.docus.server.common.netty.server.ChannelRepository;
import com.docus.server.dto.scheduling.management.schterminator.AddSchTerminatorDTO; import com.docus.server.dto.scheduling.management.schterminator.AddSchTerminatorDTO;
import com.docus.server.dto.scheduling.management.schterminator.DeleteSchTerminatorDTO; import com.docus.server.dto.scheduling.management.schterminator.DeleteSchTerminatorDTO;
import com.docus.server.dto.scheduling.management.schterminator.EditSchTerminatorDTO; import com.docus.server.dto.scheduling.management.schterminator.EditSchTerminatorDTO;
@ -22,6 +23,8 @@ import javax.annotation.Resource;
public class SchTerminatorController implements SchTerminatorApi { public class SchTerminatorController implements SchTerminatorApi {
@Resource @Resource
private ISchTerminatorService iSchTerminatorService; private ISchTerminatorService iSchTerminatorService;
@Resource
private ChannelRepository channelRepository;
/** /**
* *
@ -77,4 +80,5 @@ public class SchTerminatorController implements SchTerminatorApi {
public int delete(DeleteSchTerminatorDTO deleteSchTerminatorDTO) { public int delete(DeleteSchTerminatorDTO deleteSchTerminatorDTO) {
return iSchTerminatorService.delete(deleteSchTerminatorDTO); return iSchTerminatorService.delete(deleteSchTerminatorDTO);
} }
} }

@ -0,0 +1,24 @@
package com.docus.server.convert;
import com.docus.server.common.netty.CommMsg;
import com.docus.server.dto.scheduling.management.schterminator.CommMsgDTO;
import org.mapstruct.Mapper;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;
/**
*
*
* @author AutoGenerator
* @since 2023-07-15
*/
@Mapper
public interface CommMsgConvert {
CommMsgConvert INSTANCE = Mappers.getMapper(CommMsgConvert.class);
@Mappings({})
CommMsg convertDO(CommMsgDTO commMsgDTO);
}

@ -1,18 +1,14 @@
package com.docus.server.convert; package com.docus.server.convert;
import com.docus.infrastructure.web.response.PageResult; import com.docus.infrastructure.web.response.PageResult;
import com.docus.server.entity.scheduling.management.SchCollectorConfig;
import com.docus.server.dto.scheduling.management.schcollectorconfig.AddSchCollectorConfigDTO; import com.docus.server.dto.scheduling.management.schcollectorconfig.AddSchCollectorConfigDTO;
import com.docus.server.dto.scheduling.management.schcollectorconfig.EditSchCollectorConfigDTO; import com.docus.server.dto.scheduling.management.schcollectorconfig.EditSchCollectorConfigDTO;
import com.docus.server.dto.scheduling.management.schcollectorconfig.DeleteSchCollectorConfigDTO; import com.docus.server.entity.scheduling.management.SchCollectorConfig;
import com.docus.server.vo.scheduling.management.schcollectorconfig.SchCollectorConfigVO; import com.docus.server.vo.scheduling.management.schcollectorconfig.SchCollectorConfigVO;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
import org.mapstruct.Mappings; import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers; import org.mapstruct.factory.Mappers;
import java.util.List;
/** /**
* *
* *
@ -30,19 +26,11 @@ public interface SchCollectorConfigConvert {
@Mappings({}) @Mappings({})
SchCollectorConfig convertDO(EditSchCollectorConfigDTO editSchCollectorConfigDTO); SchCollectorConfig convertDO(EditSchCollectorConfigDTO editSchCollectorConfigDTO);
@Mappings({})
List<SchCollectorConfig> convertAddDOList(List<AddSchCollectorConfigDTO> addSchCollectorConfigDTO);
@Mappings({})
List<SchCollectorConfig> convertEditDOList(List<EditSchCollectorConfigDTO> editSchCollectorConfigDTO);
@Mappings({}) @Mappings({})
SchCollectorConfigVO convertVO(SchCollectorConfig schCollectorConfig); SchCollectorConfigVO convertVO(SchCollectorConfig schCollectorConfig);
@Mappings({})
List<SchCollectorConfigVO> convertVO(List<SchCollectorConfig> schCollectorConfigList);
@Mappings({}) @Mappings({})
PageResult<SchCollectorConfigVO> convertVO(PageResult<SchCollectorConfig> pageResult); PageResult<SchCollectorConfigVO> convertVO(PageResult<SchCollectorConfig> pageResult);
} }

@ -28,12 +28,6 @@ public interface SchTerminatorConvert {
@Mappings({}) @Mappings({})
SchTerminator convertDO(EditSchTerminatorDTO editSchTerminatorDTO); SchTerminator convertDO(EditSchTerminatorDTO editSchTerminatorDTO);
@Mappings({})
List<SchTerminator> convertAddDOList(List<AddSchTerminatorDTO> addSchTerminatorDTO);
@Mappings({})
List<SchTerminator> convertEditDOList(List<EditSchTerminatorDTO> editSchTerminatorDTO);
@Mappings({}) @Mappings({})
SchTerminatorVO convertVO(SchTerminator schTerminator); SchTerminatorVO convertVO(SchTerminator schTerminator);
@ -42,5 +36,6 @@ public interface SchTerminatorConvert {
@Mappings({}) @Mappings({})
PageResult<SchTerminatorVO> convertVO(PageResult<SchTerminator> pageResult); PageResult<SchTerminatorVO> convertVO(PageResult<SchTerminator> pageResult);
} }

@ -86,15 +86,20 @@ public class SchCollectorConfigDaoImpl extends BaseDaoImpl<SchCollectorConfigMap
Date endTime = searchDTO.getEndTime(); Date endTime = searchDTO.getEndTime();
query.le(SchCollectorConfig::getCreateTime, endTime); query.le(SchCollectorConfig::getCreateTime, endTime);
} }
//关键字比较多个列or
//if (!StringUtils.isEmpty(searchDTO.getKeyword())) { if (searchDTO.getParams("collectorCode") != null && searchDTO.getParams("collectorCode") != "") {
//单个列用like query.eq(SchCollectorConfig::getCollectorCode, searchDTO.getParams("collectorCode"));
//query. like(SchCollectorConfig::getxxx, searchDTO.getKeyword()); }
//多个列用like
//query. and(sub -> sub.like(SchCollectorConfig::getxx1, searchDTO.getKeyword()) if (searchDTO.getParams("configType") != null && searchDTO.getParams("configType") != "") {
// оr(). like(SchCollectorConfig::getXX2, searchDTO.getKeyword())) query.eq(SchCollectorConfig::getConfigType, searchDTO.getParams("configType"));
//); }
//}
if (searchDTO.getEndTime() != null) {
Date endTime = searchDTO.getEndTime();
query.le(SchCollectorConfig::getCreateTime, endTime);
}
//默认createTime倒序排序 //默认createTime倒序排序
query.orderByDesc(SchCollectorConfig::getCreateTime); query.orderByDesc(SchCollectorConfig::getCreateTime);
List<SchCollectorConfig> list = super.find(query); List<SchCollectorConfig> list = super.find(query);

@ -2,6 +2,7 @@ package com.docus.server.infrastructure.dao.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.docus.core.util.Func;
import com.docus.infrastructure.core.db.dao.impl.BaseDaoImpl; import com.docus.infrastructure.core.db.dao.impl.BaseDaoImpl;
import com.docus.infrastructure.web.request.SearchDTO; import com.docus.infrastructure.web.request.SearchDTO;
import com.docus.infrastructure.web.response.PageResult; import com.docus.infrastructure.web.response.PageResult;
@ -86,15 +87,13 @@ public class SchSystemParamsDaoImpl extends BaseDaoImpl<SchSystemParamsMapper, S
Date endTime = searchDTO.getEndTime(); Date endTime = searchDTO.getEndTime();
query.le(SchSystemParams::getCreateTime, endTime); query.le(SchSystemParams::getCreateTime, endTime);
} }
//关键字比较多个列or
//if (!StringUtils.isEmpty(searchDTO.getKeyword())) { //分组查询系统参数表
//单个列用like String paramGroup = String.valueOf(searchDTO.getParams("paramGroup"));
//query. like(SchSystemParams::getxxx, searchDTO.getKeyword()); if (Func.isNotBlank(paramGroup)) {
//多个列用like query.eq(SchSystemParams::getParamGroup, paramGroup);
//query. and(sub -> sub.like(SchSystemParams::getxx1, searchDTO.getKeyword()) }
// оr(). like(SchSystemParams::getXX2, searchDTO.getKeyword()))
//);
//}
//默认createTime倒序排序 //默认createTime倒序排序
query.orderByDesc(SchSystemParams::getCreateTime); query.orderByDesc(SchSystemParams::getCreateTime);
List<SchSystemParams> list = super.find(query); List<SchSystemParams> list = super.find(query);

@ -1,5 +1,6 @@
package com.docus.server.service.impl; package com.docus.server.service.impl;
import com.docus.infrastructure.redis.service.IdService;
import com.docus.infrastructure.web.request.SearchDTO; import com.docus.infrastructure.web.request.SearchDTO;
import com.docus.infrastructure.web.response.PageResult; import com.docus.infrastructure.web.response.PageResult;
import com.docus.server.convert.SchCollectorConfigConvert; import com.docus.server.convert.SchCollectorConfigConvert;
@ -24,6 +25,8 @@ import javax.annotation.Resource;
public class SchCollectorConfigServiceImpl implements ISchCollectorConfigService { public class SchCollectorConfigServiceImpl implements ISchCollectorConfigService {
@Resource @Resource
private ISchCollectorConfigDao iSchCollectorConfigDao; private ISchCollectorConfigDao iSchCollectorConfigDao;
@Resource
private IdService idService;
/** /**
* *
@ -55,8 +58,22 @@ public class SchCollectorConfigServiceImpl implements ISchCollectorConfigService
*/ */
@Override @Override
public boolean add(AddSchCollectorConfigDTO addSchCollectorConfigDTO) { public boolean add(AddSchCollectorConfigDTO addSchCollectorConfigDTO) {
SchCollectorConfig schCollectorConfig = SchCollectorConfigConvert.INSTANCE.convertDO(addSchCollectorConfigDTO);
return iSchCollectorConfigDao.add(schCollectorConfig); String collectorCode = addSchCollectorConfigDTO.getCollectorCode();
SchCollectorConfig schCollectorConfigDO = iSchCollectorConfigDao.findOneBy("collectorCode", collectorCode);
if (null == schCollectorConfigDO) {
SchCollectorConfig schCollectorConfig = SchCollectorConfigConvert.INSTANCE.convertDO(addSchCollectorConfigDTO);
schCollectorConfig.setId(idService.getDateSeq());
return iSchCollectorConfigDao.add(schCollectorConfig);
} else {
schCollectorConfigDO.setConfigJson(addSchCollectorConfigDTO.getConfigJson());
return iSchCollectorConfigDao.updateById(schCollectorConfigDO);
}
} }
/** /**

@ -6,7 +6,7 @@
<resultMap id="BaseResultMap" <resultMap id="BaseResultMap"
type="com.docus.server.entity.scheduling.management.SchCollectorConfig"> type="com.docus.server.entity.scheduling.management.SchCollectorConfig">
<id column="id" property="id"/> <id column="id" property="id"/>
<result column="collector_id" property="collectorId"/> <result column="collector_code" property="collectorCode"/>
<result column="config_type" property="configType"/> <result column="config_type" property="configType"/>
<result column="config_json" property="configJson"/> <result column="config_json" property="configJson"/>
<result column="create_time" property="createTime"/> <result column="create_time" property="createTime"/>
@ -15,7 +15,7 @@
<!-- 通用查询结果列 --> <!-- 通用查询结果列 -->
<sql id="Base_Column_List"> <sql id="Base_Column_List">
id, collector_id, config_type, config_json, create_time, update_time id, collector_code, config_type, config_json, create_time, update_time
</sql> </sql>
</mapper> </mapper>

@ -0,0 +1,32 @@
package com.docus.server.api.scheduling.management;
import com.docus.server.dto.scheduling.management.schterminator.CommMsgDTO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* TCP API
*
* @author AutoGenerator
* @since 2023-07-15
*/
@Api(value = "通用消息TCP接口", tags = "通用消息TCP接口")
@FeignClient(value = "collector-scheduling-management", contextId = "collector-scheduling-management.CommMsgApi")
@RequestMapping("/sch/commMsg")
public interface CommMsgApi {
/**
* TCP
*
* @param commMsgDTO
*/
@ApiOperation("向客户端发送TCP命令")
@PostMapping("/clientCommand")
void clientCommand(@RequestBody CommMsgDTO commMsgDTO);
}

@ -78,4 +78,5 @@ public interface SchTerminatorApi {
@ApiOperation("批量删除") @ApiOperation("批量删除")
@DeleteMapping("/delete") @DeleteMapping("/delete")
int delete(@RequestBody DeleteSchTerminatorDTO deleteSchTerminatorDTO); int delete(@RequestBody DeleteSchTerminatorDTO deleteSchTerminatorDTO);
} }

@ -1,44 +1,33 @@
package com.docus.server.dto.scheduling.management.schcollectorconfig; package com.docus.server.dto.scheduling.management.schcollectorconfig;
import com.docus.server.enums.ConfigTypeEnum;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import com.docus.server.enums.*;
import javax.validation.constraints.NotNull;
import java.io.Serializable; import java.io.Serializable;
import java.time.LocalDateTime;
/** /**
* * AddDTO
* AddDTO *
* * @author AutoGenerator
* @author AutoGenerator * @since 2023-07-15
* @since 2023-07-15 */
*/
@Data @Data
@ApiModel(value="AddSchCollectorConfigDTO对象", description="采集器配置") @ApiModel(value = "AddSchCollectorConfigDTO对象", description = "采集器配置")
public class AddSchCollectorConfigDTO implements Serializable { public class AddSchCollectorConfigDTO implements Serializable {
@ApiModelProperty(value = "主键") @ApiModelProperty(value = "采集器类型")
private Long id; private String collectorCode;
@ApiModelProperty(value = "采集器id")
private Long collectorId;
@NotNull
@ApiModelProperty(value = "配置类型0采集器公共配置1采集器私有配置") @ApiModelProperty(value = "配置类型0采集器公共配置1采集器私有配置")
private String configType; private ConfigTypeEnum configType;
@NotNull
@ApiModelProperty(value = "配置参数") @ApiModelProperty(value = "配置参数")
private String configJson; private String configJson;
@ApiModelProperty(value = "产生时间")
private LocalDateTime createTime;
@ApiModelProperty(value = "更新时间")
private LocalDateTime updateTime;
} }

@ -3,42 +3,26 @@ package com.docus.server.dto.scheduling.management.schcollectorconfig;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import com.docus.server.enums.*;
import java.io.Serializable; import java.io.Serializable;
import java.time.LocalDateTime;
/** /**
* * EditDTO
* EditDTO *
* * @author AutoGenerator
* @author AutoGenerator * @since 2023-07-15
* @since 2023-07-15 */
*/
@Data @Data
@ApiModel(value="EditSchCollectorConfigDTO对象", description="采集器配置") @ApiModel(value = "EditSchCollectorConfigDTO对象", description = "采集器配置")
public class EditSchCollectorConfigDTO implements Serializable { public class EditSchCollectorConfigDTO implements Serializable {
@ApiModelProperty(value = "主键") @ApiModelProperty(value = "主键")
private Long id; private Long id;
@ApiModelProperty(value = "采集器id") @ApiModelProperty(value = "采集器类型")
private Long collectorId; private String collectorCode;
@ApiModelProperty(value = "配置类型0采集器公共配置1采集器私有配置")
private String configType;
@ApiModelProperty(value = "配置参数") @ApiModelProperty(value = "配置参数")
private String configJson; private String configJson;
@ApiModelProperty(value = "产生时间")
private LocalDateTime createTime;
@ApiModelProperty(value = "更新时间")
private LocalDateTime updateTime;
} }

@ -1,25 +1,21 @@
package com.docus.server.dto.scheduling.management.schsystemparams; package com.docus.server.dto.scheduling.management.schsystemparams;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import com.docus.server.enums.*;
import java.io.Serializable; import java.io.Serializable;
import java.time.LocalDateTime; import java.util.Date;
/** /**
* * AddDTO
* AddDTO *
* * @author AutoGenerator
* @author AutoGenerator * @since 2023-07-15
* @since 2023-07-15 */
*/
@Data @Data
@ApiModel(value="AddSchSystemParamsDTO对象", description="系统参数表") @ApiModel(value = "AddSchSystemParamsDTO对象", description = "系统参数表")
public class AddSchSystemParamsDTO implements Serializable { public class AddSchSystemParamsDTO implements Serializable {
@ApiModelProperty(value = "主键") @ApiModelProperty(value = "主键")
@ -50,10 +46,12 @@ public class AddSchSystemParamsDTO implements Serializable {
private String needEncrypt; private String needEncrypt;
@ApiModelProperty(value = "入库时间") @ApiModelProperty(value = "入库时间")
private LocalDateTime createTime; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
@ApiModelProperty(value = "入库更新时间") @ApiModelProperty(value = "入库更新时间")
private LocalDateTime updateTime; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
} }

@ -1,25 +1,21 @@
package com.docus.server.dto.scheduling.management.schsystemparams; package com.docus.server.dto.scheduling.management.schsystemparams;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import com.docus.server.enums.*;
import java.io.Serializable; import java.io.Serializable;
import java.time.LocalDateTime; import java.util.Date;
/** /**
* * EditDTO
* EditDTO *
* * @author AutoGenerator
* @author AutoGenerator * @since 2023-07-15
* @since 2023-07-15 */
*/
@Data @Data
@ApiModel(value="EditSchSystemParamsDTO对象", description="系统参数表") @ApiModel(value = "EditSchSystemParamsDTO对象", description = "系统参数表")
public class EditSchSystemParamsDTO implements Serializable { public class EditSchSystemParamsDTO implements Serializable {
@ApiModelProperty(value = "主键") @ApiModelProperty(value = "主键")
@ -50,10 +46,12 @@ public class EditSchSystemParamsDTO implements Serializable {
private String needEncrypt; private String needEncrypt;
@ApiModelProperty(value = "入库时间") @ApiModelProperty(value = "入库时间")
private LocalDateTime createTime; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
@ApiModelProperty(value = "入库更新时间") @ApiModelProperty(value = "入库更新时间")
private LocalDateTime updateTime; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
} }

@ -1,6 +1,5 @@
package com.docus.server.dto.scheduling.management.schterminator; package com.docus.server.dto.scheduling.management.schterminator;
import com.baomidou.mybatisplus.annotation.TableField;
import com.docus.server.enums.BusyStateEnum; import com.docus.server.enums.BusyStateEnum;
import com.docus.server.enums.OnlineStateEnum; import com.docus.server.enums.OnlineStateEnum;
import com.docus.server.enums.RestrictStateEnum; import com.docus.server.enums.RestrictStateEnum;
@ -13,14 +12,13 @@ import java.io.Serializable;
import java.util.Date; import java.util.Date;
/** /**
* * AddDTO
* AddDTO *
* * @author AutoGenerator
* @author AutoGenerator * @since 2023-07-15
* @since 2023-07-15 */
*/
@Data @Data
@ApiModel(value="AddSchTerminatorDTO对象", description="执行管理器") @ApiModel(value = "AddSchTerminatorDTO对象", description = "执行管理器")
public class AddSchTerminatorDTO implements Serializable { public class AddSchTerminatorDTO implements Serializable {
@ -28,53 +26,41 @@ public class AddSchTerminatorDTO implements Serializable {
private Long id; private Long id;
@ApiModelProperty(value = "终端IP") @ApiModelProperty(value = "终端IP")
@TableField("terminator_ip")
private String terminatorIp; private String terminatorIp;
@ApiModelProperty(value = "资源管理器名称") @ApiModelProperty(value = "资源管理器名称")
@TableField("terminator_name")
private String terminatorName; private String terminatorName;
@ApiModelProperty(value = "只干某些任务,任务偏好属性") @ApiModelProperty(value = "只干某些任务,任务偏好属性")
@TableField("only_collector_ids")
private String onlyCollectorIds; private String onlyCollectorIds;
@ApiModelProperty(value = "优先干某些任务,任务偏好属性(优先给哪个采集器,若不空闲再给任意采集器)") @ApiModelProperty(value = "优先干某些任务,任务偏好属性(优先给哪个采集器,若不空闲再给任意采集器)")
@TableField("priority_collector_ids")
private String priorityCollectorIds; private String priorityCollectorIds;
@ApiModelProperty(value = "是否限制采集器类型01是") @ApiModelProperty(value = "是否限制采集器类型01是")
@TableField("restrict_state")
private RestrictStateEnum restrictState; private RestrictStateEnum restrictState;
@ApiModelProperty(value = "忙闲状态0空闲1繁忙") @ApiModelProperty(value = "忙闲状态0空闲1繁忙")
@TableField("busy_state")
private BusyStateEnum busyState; private BusyStateEnum busyState;
@ApiModelProperty(value = "在线状态0离线1在线") @ApiModelProperty(value = "在线状态0离线1在线")
@TableField("online_state")
private OnlineStateEnum onlineState; private OnlineStateEnum onlineState;
@ApiModelProperty(value = "最近任务执行时间") @ApiModelProperty(value = "最近任务执行时间")
@TableField("last_task_exec_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date lastTaskExecTime; private Date lastTaskExecTime;
@ApiModelProperty(value = "正在执行任务的名称") @ApiModelProperty(value = "正在执行任务的名称")
@TableField("executing_task_name")
private String executingTaskName; private String executingTaskName;
@ApiModelProperty(value = "最近一次任务执行失败原因") @ApiModelProperty(value = "最近一次任务执行失败原因")
@TableField("last_task_error_msg")
private String lastTaskErrorMsg; private String lastTaskErrorMsg;
@ApiModelProperty(value = "入库时间") @ApiModelProperty(value = "入库时间")
@TableField("create_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime; private Date createTime;
@ApiModelProperty(value = "入库更新时间") @ApiModelProperty(value = "入库更新时间")
@TableField("update_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime; private Date updateTime;

@ -0,0 +1,28 @@
package com.docus.server.dto.scheduling.management.schterminator;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Data
@ApiModel(value = "CommMsgDTO对象", description = "TCP 重启命令")
public class CommMsgDTO implements Serializable {
@ApiModelProperty(value = "终端IP")
public String terminatorIp;
@ApiModelProperty(value = "消息类型")
public String messageType;
@ApiModelProperty(value = "消息内容")
public String content;
}

@ -1,16 +1,10 @@
package com.docus.server.dto.scheduling.management.schterminator; package com.docus.server.dto.scheduling.management.schterminator;
import com.baomidou.mybatisplus.annotation.TableField;
import com.docus.server.enums.BusyStateEnum;
import com.docus.server.enums.OnlineStateEnum;
import com.docus.server.enums.RestrictStateEnum;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date;
/** /**
* EditDTO * EditDTO
@ -25,56 +19,10 @@ public class EditSchTerminatorDTO implements Serializable {
@ApiModelProperty(value = "主键") @ApiModelProperty(value = "主键")
private Long id; private Long id;
@ApiModelProperty(value = "终端IP")
@TableField("terminator_ip")
private String terminatorIp;
@ApiModelProperty(value = "资源管理器名称")
@TableField("terminator_name")
private String terminatorName;
@ApiModelProperty(value = "只干某些任务,任务偏好属性") @ApiModelProperty(value = "只干某些任务,任务偏好属性")
@TableField("only_collector_ids")
private String onlyCollectorIds; private String onlyCollectorIds;
@ApiModelProperty(value = "优先干某些任务,任务偏好属性(优先给哪个采集器,若不空闲再给任意采集器)") @ApiModelProperty(value = "优先干某些任务,任务偏好属性(优先给哪个采集器,若不空闲再给任意采集器)")
@TableField("priority_collector_ids")
private String priorityCollectorIds; private String priorityCollectorIds;
@ApiModelProperty(value = "是否限制采集器类型01是")
@TableField("restrict_state")
private RestrictStateEnum restrictState;
@ApiModelProperty(value = "忙闲状态0空闲1繁忙")
@TableField("busy_state")
private BusyStateEnum busyState;
@ApiModelProperty(value = "在线状态0离线1在线")
@TableField("online_state")
private OnlineStateEnum onlineState;
@ApiModelProperty(value = "最近任务执行时间")
@TableField("last_task_exec_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date lastTaskExecTime;
@ApiModelProperty(value = "正在执行任务的名称")
@TableField("executing_task_name")
private String executingTaskName;
@ApiModelProperty(value = "最近一次任务执行失败原因")
@TableField("last_task_error_msg")
private String lastTaskErrorMsg;
@ApiModelProperty(value = "入库时间")
@TableField("create_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
@ApiModelProperty(value = "入库更新时间")
@TableField("update_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
} }

@ -1,55 +1,54 @@
package com.docus.server.entity.scheduling.management; package com.docus.server.entity.scheduling.management;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import java.io.Serializable; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.docus.server.enums.ConfigTypeEnum;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import com.docus.server.enums.*; import java.io.Serializable;
import java.util.Date;
/** /**
* *
* *
* * @author AutoGenerator
* @author AutoGenerator * @since 2023-07-15
* @since 2023-07-15 */
*/
@Data @Data
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
@TableName("sch_collector_config") @TableName("sch_collector_config")
@ApiModel(value="SchCollectorConfig对象", description="采集器配置") @ApiModel(value = "SchCollectorConfig对象", description = "采集器配置")
public class SchCollectorConfig implements Serializable { public class SchCollectorConfig implements Serializable {
@ApiModelProperty(value = "主键") @ApiModelProperty(value = "主键")
@TableId(value = "id", type = IdType.ASSIGN_UUID) @TableId(value = "id", type = IdType.ASSIGN_UUID)
private Long id; private Long id;
@ApiModelProperty(value = "采集器id") @ApiModelProperty(value = "采集器类型")
@TableField("collector_id") @TableField("collector_code")
private Long collectorId; private String collectorCode;
@ApiModelProperty(value = "配置类型0采集器公共配置1采集器私有配置") @ApiModelProperty(value = "配置类型0采集器公共配置1采集器私有配置")
@TableField("config_type") @TableField("config_type")
private String configType; private ConfigTypeEnum configType;
@ApiModelProperty(value = "配置参数") @ApiModelProperty(value = "配置参数")
@TableField("config_json") @TableField("config_json")
private String configJson; private String configJson;
@ApiModelProperty(value = "产生时间") @ApiModelProperty(value = "入库时间")
@TableField("create_time") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime; private Date createTime;
@ApiModelProperty(value = "更新时间") @ApiModelProperty(value = "入库更新时间")
@TableField("update_time") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime; private Date updateTime;
} }

@ -1,30 +1,28 @@
package com.docus.server.entity.scheduling.management; package com.docus.server.entity.scheduling.management;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import java.io.Serializable; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import com.docus.server.enums.*; import java.io.Serializable;
import java.util.Date;
/** /**
* *
* *
* * @author AutoGenerator
* @author AutoGenerator * @since 2023-07-15
* @since 2023-07-15 */
*/
@Data @Data
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
@TableName("sch_system_params") @TableName("sch_system_params")
@ApiModel(value="SchSystemParams对象", description="系统参数表") @ApiModel(value = "SchSystemParams对象", description = "系统参数表")
public class SchSystemParams implements Serializable { public class SchSystemParams implements Serializable {
@ApiModelProperty(value = "主键") @ApiModelProperty(value = "主键")
@ -65,11 +63,13 @@ public class SchSystemParams implements Serializable {
@ApiModelProperty(value = "入库时间") @ApiModelProperty(value = "入库时间")
@TableField("create_time") @TableField("create_time")
private LocalDateTime createTime; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
@ApiModelProperty(value = "入库更新时间") @ApiModelProperty(value = "入库更新时间")
@TableField("update_time") @TableField("update_time")
private LocalDateTime updateTime; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
} }

@ -0,0 +1,31 @@
package com.docus.server.enums;
import com.docus.infrastructure.core.db.enums.IIntegerEnum;
/**
*
*/
public enum ConfigTypeEnum implements IIntegerEnum {
PUBLIC_CONFIG(0, "公共配置"),
PRIVATE_CONFIG(1, "私有配置");
private Integer value;
private String display;
ConfigTypeEnum(Integer value, String display) {
this.value = value;
this.display = display;
}
@Override
public Integer getValue() {
return value;
}
@Override
public String getDisplay() {
return display;
}
}

@ -1,44 +1,43 @@
package com.docus.server.vo.scheduling.management.schcollectorconfig; package com.docus.server.vo.scheduling.management.schcollectorconfig;
import com.docus.server.enums.ConfigTypeEnum;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import com.docus.server.enums.*;
import java.io.Serializable; import java.io.Serializable;
import java.time.LocalDateTime; import java.util.Date;
/** /**
* * VO
* VO *
* * @author AutoGenerator
* @author AutoGenerator * @since 2023-07-15
* @since 2023-07-15 */
*/
@Data @Data
@ApiModel(value="SchCollectorConfigVO对象", description="采集器配置") @ApiModel(value = "SchCollectorConfigVO对象", description = "采集器配置")
public class SchCollectorConfigVO implements Serializable { public class SchCollectorConfigVO implements Serializable {
@ApiModelProperty(value = "主键") @ApiModelProperty(value = "主键")
private Long id; private Long id;
@ApiModelProperty(value = "采集器id") @ApiModelProperty(value = "采集器类型")
private Long collectorId; private String collectorCode;
@ApiModelProperty(value = "配置类型0采集器公共配置1采集器私有配置") @ApiModelProperty(value = "配置类型0采集器公共配置1采集器私有配置")
private String configType; private ConfigTypeEnum configType;
@ApiModelProperty(value = "配置参数") @ApiModelProperty(value = "配置参数")
private String configJson; private String configJson;
@ApiModelProperty(value = "产生时间") @ApiModelProperty(value = "入库时间")
private LocalDateTime createTime; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
@ApiModelProperty(value = "更新时间") @ApiModelProperty(value = "入库更新时间")
private LocalDateTime updateTime; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
} }

@ -1,25 +1,21 @@
package com.docus.server.vo.scheduling.management.schsystemparams; package com.docus.server.vo.scheduling.management.schsystemparams;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import com.docus.server.enums.*;
import java.io.Serializable; import java.io.Serializable;
import java.time.LocalDateTime; import java.util.Date;
/** /**
* * VO
* VO *
* * @author AutoGenerator
* @author AutoGenerator * @since 2023-07-15
* @since 2023-07-15 */
*/
@Data @Data
@ApiModel(value="SchSystemParamsVO对象", description="系统参数表") @ApiModel(value = "SchSystemParamsVO对象", description = "系统参数表")
public class SchSystemParamsVO implements Serializable { public class SchSystemParamsVO implements Serializable {
@ApiModelProperty(value = "主键") @ApiModelProperty(value = "主键")
@ -50,10 +46,12 @@ public class SchSystemParamsVO implements Serializable {
private String needEncrypt; private String needEncrypt;
@ApiModelProperty(value = "入库时间") @ApiModelProperty(value = "入库时间")
private LocalDateTime createTime; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
@ApiModelProperty(value = "入库更新时间") @ApiModelProperty(value = "入库更新时间")
private LocalDateTime updateTime; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
} }

Loading…
Cancel
Save