haungxing
2 years ago
265 changed files with 9634 additions and 744 deletions
@ -1,21 +0,0 @@ |
|||||||
# http://editorconfig.org |
|
||||||
root = true |
|
||||||
|
|
||||||
# 空格替代Tab缩进在各种编辑工具下效果一致 |
|
||||||
[*] |
|
||||||
indent_style = space |
|
||||||
indent_size = 4 |
|
||||||
charset = utf-8 |
|
||||||
end_of_line = lf |
|
||||||
trim_trailing_whitespace = true |
|
||||||
insert_final_newline = true |
|
||||||
|
|
||||||
[*.java] |
|
||||||
indent_style = tab |
|
||||||
|
|
||||||
[*.{json,yml}] |
|
||||||
indent_size = 2 |
|
||||||
|
|
||||||
[*.md] |
|
||||||
insert_final_newline = false |
|
||||||
trim_trailing_whitespace = false |
|
@ -0,0 +1,48 @@ |
|||||||
|
package com.hnac.hzims.common.logs.annotation; |
||||||
|
|
||||||
|
import com.hnac.hzims.common.logs.enums.BusinessType; |
||||||
|
import com.hnac.hzims.common.logs.enums.OperatorType; |
||||||
|
|
||||||
|
import java.lang.annotation.*; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author WL |
||||||
|
* @Version v1.0 |
||||||
|
* @Serial 1.0 |
||||||
|
* @Date 2023/3/29 11:38 |
||||||
|
*/ |
||||||
|
@Documented |
||||||
|
@Retention(RetentionPolicy.RUNTIME) |
||||||
|
@Target({ ElementType.PARAMETER, ElementType.METHOD }) |
||||||
|
public @interface OperationAnnotation { |
||||||
|
|
||||||
|
/** |
||||||
|
* 操作模块 |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
String title() default "操作模块"; |
||||||
|
|
||||||
|
/** |
||||||
|
* 系统类型(网页端,app端) |
||||||
|
*/ |
||||||
|
OperatorType operatorType() default OperatorType.OTHER; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 操作类型 |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
BusinessType businessType() default BusinessType.OTHER; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 是否保存响应的参数 |
||||||
|
*/ |
||||||
|
public boolean isSaveResponseData() default true; |
||||||
|
|
||||||
|
/** |
||||||
|
* 功能说明 |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
String action() default "功能说明"; |
||||||
|
} |
@ -0,0 +1,259 @@ |
|||||||
|
package com.hnac.hzims.common.logs.aop; |
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSON; |
||||||
|
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; |
||||||
|
import com.hnac.hzims.common.logs.annotation.OperationAnnotation; |
||||||
|
import com.hnac.hzims.common.logs.consumer.SysLogQueue; |
||||||
|
import com.hnac.hzims.common.logs.to.SysLogTo; |
||||||
|
import com.hnac.hzims.common.logs.enums.BusinessStatus; |
||||||
|
import com.hnac.hzims.common.logs.utils.StringUtils; |
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
import org.aspectj.lang.JoinPoint; |
||||||
|
import org.aspectj.lang.annotation.*; |
||||||
|
import org.aspectj.lang.reflect.CodeSignature; |
||||||
|
import org.springblade.core.launch.props.BladeProperties; |
||||||
|
import org.springblade.core.launch.server.ServerInfo; |
||||||
|
import org.springblade.core.secure.utils.AuthUtil; |
||||||
|
import org.springblade.core.tool.constant.BladeConstant; |
||||||
|
import org.springblade.core.tool.utils.Func; |
||||||
|
import org.springblade.core.tool.utils.WebUtil; |
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.stereotype.Component; |
||||||
|
import org.springframework.util.StopWatch; |
||||||
|
import org.springframework.web.context.request.RequestAttributes; |
||||||
|
import org.springframework.web.context.request.RequestContextHolder; |
||||||
|
import org.springframework.web.context.request.ServletRequestAttributes; |
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
import java.lang.reflect.Method; |
||||||
|
import java.time.LocalDateTime; |
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author dfy |
||||||
|
* @date 2023/3/29 |
||||||
|
* @description: 操作日志切面处理类 |
||||||
|
*/ |
||||||
|
@Aspect |
||||||
|
@Component |
||||||
|
@Slf4j |
||||||
|
public class SysLogAspect { |
||||||
|
|
||||||
|
|
||||||
|
@Autowired |
||||||
|
private ServerInfo serverInfo; |
||||||
|
|
||||||
|
|
||||||
|
@Autowired |
||||||
|
private BladeProperties bladeProperties; |
||||||
|
|
||||||
|
|
||||||
|
@Autowired |
||||||
|
private SysLogQueue sysLogQueue; |
||||||
|
|
||||||
|
/** |
||||||
|
* 请求地址 |
||||||
|
*/ |
||||||
|
private String requestPath = null; |
||||||
|
|
||||||
|
/** |
||||||
|
* 操作人 |
||||||
|
*/ |
||||||
|
private String userName = null; |
||||||
|
|
||||||
|
/** |
||||||
|
* 请求 |
||||||
|
*/ |
||||||
|
private HttpServletRequest request = null; |
||||||
|
|
||||||
|
|
||||||
|
private Long userId = -1L; |
||||||
|
|
||||||
|
|
||||||
|
private StopWatch stopWatch = new StopWatch(); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 设置操作日志切入点 在注解的位置切入代码 |
||||||
|
*/ |
||||||
|
@Pointcut("@annotation(com.hnac.hzims.common.logs.annotation.OperationAnnotation)") |
||||||
|
public void logPointCut() { |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @param joinPoint |
||||||
|
* @Description 前置通知 方法调用前触发 记录开始时间,从session中获取操作人 |
||||||
|
*/ |
||||||
|
@Before(value = "logPointCut()") |
||||||
|
public void before(JoinPoint joinPoint) { |
||||||
|
stopWatch.start(); |
||||||
|
log.info("前置通知"); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @param joinPoint |
||||||
|
* @Description 后置通知 方法调用后触发 记录结束时间 ,操作人 ,入参等 |
||||||
|
*/ |
||||||
|
@AfterReturning(value = "logPointCut()", returning = "jsonResult") |
||||||
|
public void after(JoinPoint joinPoint, Object jsonResult) { |
||||||
|
log.info("=========返回通知=============="); |
||||||
|
request = getHttpServletRequest(); |
||||||
|
handleLog(joinPoint, jsonResult, null); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @param joinPoint |
||||||
|
* @return |
||||||
|
* @Description 获取入参方法参数 |
||||||
|
*/ |
||||||
|
public Map<String, Object> getNameAndValue(JoinPoint joinPoint) { |
||||||
|
Map<String, Object> param = new HashMap<>(16); |
||||||
|
Object[] paramValues = joinPoint.getArgs(); |
||||||
|
String[] paramNames = ((CodeSignature) joinPoint.getSignature()).getParameterNames(); |
||||||
|
for (int i = 0; i < paramNames.length; i++) { |
||||||
|
if (paramValues[i] instanceof Integer || paramValues[i] instanceof String) { |
||||||
|
param.put(paramNames[i], paramValues[i]); |
||||||
|
} |
||||||
|
} |
||||||
|
return param; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @Description: 获取request |
||||||
|
*/ |
||||||
|
public HttpServletRequest getHttpServletRequest() { |
||||||
|
RequestAttributes ra = RequestContextHolder.getRequestAttributes(); |
||||||
|
ServletRequestAttributes sra = (ServletRequestAttributes) ra; |
||||||
|
HttpServletRequest request = sra.getRequest(); |
||||||
|
return request; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @param joinPoint |
||||||
|
* @Description 异常通知 |
||||||
|
*/ |
||||||
|
@AfterThrowing(pointcut = "logPointCut()", throwing = "e") |
||||||
|
public void throwing(JoinPoint joinPoint, Exception e) { |
||||||
|
log.info("=========异常通知=============="); |
||||||
|
handleLog(joinPoint, null, e); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 转换request 请求参数 |
||||||
|
* |
||||||
|
* @param paramMap request获取的参数数组 |
||||||
|
*/ |
||||||
|
public Map<String, String> converMap(Map<String, String[]> paramMap) { |
||||||
|
Map<String, String> rtnMap = new HashMap<String, String>(); |
||||||
|
for (String key : paramMap.keySet()) { |
||||||
|
rtnMap.put(key, paramMap.get(key)[0]); |
||||||
|
} |
||||||
|
return rtnMap; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 转换异常信息为字符串 |
||||||
|
* |
||||||
|
* @param exceptionName 异常名称 |
||||||
|
* @param exceptionMessage 异常信息 |
||||||
|
* @param elements 堆栈信息 |
||||||
|
*/ |
||||||
|
public String stackTraceToString(String exceptionName, String exceptionMessage, StackTraceElement[] elements) { |
||||||
|
StringBuffer strbuff = new StringBuffer(); |
||||||
|
for (StackTraceElement stet : elements) { |
||||||
|
strbuff.append(stet + "\n"); |
||||||
|
} |
||||||
|
String message = exceptionName + ":" + exceptionMessage + "\n\t" + strbuff.toString(); |
||||||
|
return message; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 处理操作日志结果集 |
||||||
|
* |
||||||
|
* @param joinPoint |
||||||
|
* @param jsonResult |
||||||
|
* @param exception |
||||||
|
*/ |
||||||
|
private void handleLog(JoinPoint joinPoint, Object jsonResult, Exception exception) { |
||||||
|
String targetName = joinPoint.getTarget().getClass().getName(); |
||||||
|
String methodName = joinPoint.getSignature().getName(); |
||||||
|
Object[] arguments = joinPoint.getArgs(); |
||||||
|
Class<?> targetClass = null; |
||||||
|
try { |
||||||
|
targetClass = Class.forName(targetName); |
||||||
|
} catch (ClassNotFoundException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} |
||||||
|
Method[] methods = targetClass.getMethods(); |
||||||
|
String title; |
||||||
|
String action; |
||||||
|
String businessType; |
||||||
|
String operatorType; |
||||||
|
Class<?>[] clazzs; |
||||||
|
for (Method method : methods) { |
||||||
|
if (method.getName().equals(methodName)) { |
||||||
|
clazzs = method.getParameterTypes(); |
||||||
|
if (clazzs != null && clazzs.length == arguments.length && method.getAnnotation(OperationAnnotation.class) != null) { |
||||||
|
// 获取请求的类名
|
||||||
|
String className = joinPoint.getTarget().getClass().getName(); |
||||||
|
methodName = className + "." + methodName; |
||||||
|
request = getHttpServletRequest(); |
||||||
|
requestPath = request.getServletPath(); |
||||||
|
OperationAnnotation annotation = method.getAnnotation(OperationAnnotation.class); |
||||||
|
title = annotation.title(); |
||||||
|
action = annotation.action(); |
||||||
|
businessType = annotation.businessType().getValue(); |
||||||
|
operatorType = annotation.operatorType().getValue(); |
||||||
|
// 获取当前用户信息
|
||||||
|
userName = AuthUtil.getUserAccount(request); |
||||||
|
userId = AuthUtil.getUserId(request); |
||||||
|
SysLogTo sysLog = new SysLogTo(); |
||||||
|
if (StringUtils.isBlank(userName) && userId == -1) { |
||||||
|
userName = "当前用户未登录"; |
||||||
|
} |
||||||
|
sysLog.setOperationUserName(userName); |
||||||
|
sysLog.setOperationUserId(userId); |
||||||
|
sysLog.setTenantId(Func.toStr(AuthUtil.getTenantId(), BladeConstant.ADMIN_TENANT_ID)); |
||||||
|
sysLog.setLocalIp(WebUtil.getIP(request));// 请求IP
|
||||||
|
stopWatch.stop(); |
||||||
|
sysLog.setCostTime(stopWatch.getTotalTimeMillis() + "ms"); |
||||||
|
sysLog.setPath(requestPath); |
||||||
|
sysLog.setTitle(title); |
||||||
|
sysLog.setAction(action); |
||||||
|
sysLog.setOperatorType(operatorType); |
||||||
|
sysLog.setBusinessType(businessType); |
||||||
|
sysLog.setParameter(getNameAndValue(joinPoint).toString()); |
||||||
|
sysLog.setMethodClass(className); |
||||||
|
sysLog.setMethodName(methodName); |
||||||
|
sysLog.setServerName(bladeProperties.getName()); |
||||||
|
sysLog.setServerHost(serverInfo.getHostName()); |
||||||
|
sysLog.setServerIp(serverInfo.getIpWithPort()); |
||||||
|
sysLog.setEnv(bladeProperties.getEnv()); |
||||||
|
sysLog.setMethod(request.getMethod()); |
||||||
|
sysLog.setUserAgent(request.getHeader(WebUtil.USER_AGENT_HEADER)); |
||||||
|
sysLog.setOperationTime(LocalDateTime.now()); |
||||||
|
|
||||||
|
//返回结果集
|
||||||
|
if (ObjectUtils.isNotEmpty(jsonResult)) { |
||||||
|
sysLog.setStatus(BusinessStatus.SUCCESS.getKey()); |
||||||
|
sysLog.setJsonResult(StringUtils.substring(JSON.toJSONString(jsonResult), 0, 2000)); |
||||||
|
} |
||||||
|
|
||||||
|
//异常结果集
|
||||||
|
if (exception != null) { |
||||||
|
sysLog.setStatus(BusinessStatus.FAIL.getKey()); |
||||||
|
sysLog.setErrorMsg(StringUtils.substring(exception.getMessage(), 0, 2000)); |
||||||
|
} |
||||||
|
//保存到阻塞队列里
|
||||||
|
sysLogQueue.add(sysLog); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,118 @@ |
|||||||
|
package com.hnac.hzims.common.logs.consumer; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; |
||||||
|
import com.hnac.hzims.common.logs.to.SysLogTo; |
||||||
|
import com.hnac.hzims.common.logs.fegin.SysLogFeignService; |
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.stereotype.Component; |
||||||
|
|
||||||
|
import javax.annotation.PostConstruct; |
||||||
|
import javax.annotation.PreDestroy; |
||||||
|
import javax.annotation.Resource; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** |
||||||
|
* 执行异步线程操作 |
||||||
|
* @Author dfy |
||||||
|
* @Version v1.0 |
||||||
|
* @Serial 1.0 |
||||||
|
* @Date 2023/4/3 14:00 |
||||||
|
*/ |
||||||
|
@Slf4j |
||||||
|
@Component |
||||||
|
public class SysLogConsumer implements Runnable { |
||||||
|
|
||||||
|
/** |
||||||
|
* 默认16 |
||||||
|
*/ |
||||||
|
private static final int DEFAULT_BATCH_SIZE = 16; |
||||||
|
|
||||||
|
@Resource |
||||||
|
private SysLogQueue auditLogQueue; |
||||||
|
/** |
||||||
|
* 批次数 |
||||||
|
*/ |
||||||
|
private int batchSize = DEFAULT_BATCH_SIZE; |
||||||
|
|
||||||
|
@Autowired |
||||||
|
private SysLogFeignService sysLogFeignService; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 默认为true |
||||||
|
*/ |
||||||
|
private boolean active = true; |
||||||
|
|
||||||
|
private Thread thread; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 启动线程 |
||||||
|
*/ |
||||||
|
@PostConstruct |
||||||
|
public void init() { |
||||||
|
thread = new Thread(this); |
||||||
|
thread.start(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 使用该注解在项目结束的舒缓关闭 |
||||||
|
*/ |
||||||
|
@PreDestroy |
||||||
|
public void close() { |
||||||
|
active = false; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 执行线程操作 |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public void run() { |
||||||
|
while (active) { |
||||||
|
execute(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 执行业务处理操作,新增日志记录 |
||||||
|
*/ |
||||||
|
public void execute() { |
||||||
|
List<SysLogTo> sysLogs = new ArrayList<>(); |
||||||
|
try { |
||||||
|
int size = 0; |
||||||
|
while (size < batchSize) { |
||||||
|
//从队列中取出一个
|
||||||
|
SysLogTo sysLog = auditLogQueue.poll(); |
||||||
|
if (sysLog == null) { |
||||||
|
break; |
||||||
|
} |
||||||
|
sysLogs.add(sysLog); |
||||||
|
size++; |
||||||
|
} |
||||||
|
} catch (InterruptedException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
log.error(e.toString()); |
||||||
|
} |
||||||
|
//如果当前的日志list不为空
|
||||||
|
if (CollectionUtils.isNotEmpty(sysLogs)) { |
||||||
|
log.info("日志操作数据:" + sysLogs); |
||||||
|
// TODO: 2023/4/4 添加到数据库
|
||||||
|
try { |
||||||
|
// TODO: 2023/4/4 后期采取kafka+elk实现,可以提高效率,操作日志数据越来越大,查询效率变大,提高性能
|
||||||
|
sysLogFeignService.saveBatch(sysLogs); |
||||||
|
} catch (Exception e) { |
||||||
|
// TODO: 2023/4/4 出现异常呢,
|
||||||
|
e.printStackTrace(); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,43 @@ |
|||||||
|
package com.hnac.hzims.common.logs.consumer; |
||||||
|
|
||||||
|
import com.hnac.hzims.common.logs.to.SysLogTo; |
||||||
|
import org.springframework.stereotype.Component; |
||||||
|
|
||||||
|
import java.util.concurrent.BlockingQueue; |
||||||
|
import java.util.concurrent.LinkedBlockingQueue; |
||||||
|
import java.util.concurrent.TimeUnit; |
||||||
|
|
||||||
|
/** |
||||||
|
* 定义队列 |
||||||
|
* @Author dfy |
||||||
|
* @Version v1.0 |
||||||
|
* @Serial 1.0 |
||||||
|
* @Date 2023/4/3 14:01 |
||||||
|
*/ |
||||||
|
@Component |
||||||
|
public class SysLogQueue { |
||||||
|
|
||||||
|
/** |
||||||
|
* BlockingDequeue为双端阻塞队列,blockingQueue阻塞队列 |
||||||
|
*/ |
||||||
|
private BlockingQueue<SysLogTo> blockingQueue = new LinkedBlockingQueue<>(); |
||||||
|
|
||||||
|
/** |
||||||
|
* 存入数据 |
||||||
|
* @param auditLog |
||||||
|
*/ |
||||||
|
public void add(SysLogTo auditLog) { |
||||||
|
blockingQueue.add(auditLog); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* poll从队列的头部获取到信息 |
||||||
|
* @return |
||||||
|
* @throws InterruptedException |
||||||
|
*/ |
||||||
|
public SysLogTo poll() throws InterruptedException { |
||||||
|
//每秒钟执行一次
|
||||||
|
return blockingQueue.poll(1, TimeUnit.SECONDS); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,33 @@ |
|||||||
|
package com.hnac.hzims.common.logs.enums; |
||||||
|
|
||||||
|
import lombok.Getter; |
||||||
|
|
||||||
|
/** |
||||||
|
* 操作状态 |
||||||
|
* |
||||||
|
* @author ruoyi |
||||||
|
* |
||||||
|
*/ |
||||||
|
public enum BusinessStatus |
||||||
|
{ |
||||||
|
/** |
||||||
|
* 成功 |
||||||
|
*/ |
||||||
|
SUCCESS(0,"执行成功"), |
||||||
|
|
||||||
|
/** |
||||||
|
* 异常 |
||||||
|
*/ |
||||||
|
FAIL(1,"执行异常"); |
||||||
|
|
||||||
|
@Getter |
||||||
|
private Integer key; |
||||||
|
|
||||||
|
@Getter |
||||||
|
private String value; |
||||||
|
|
||||||
|
BusinessStatus(Integer key,String value){ |
||||||
|
this.key = key; |
||||||
|
this.value = value; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,73 @@ |
|||||||
|
package com.hnac.hzims.common.logs.enums; |
||||||
|
|
||||||
|
|
||||||
|
import lombok.Getter; |
||||||
|
|
||||||
|
/** |
||||||
|
* 业务操作类型 |
||||||
|
* |
||||||
|
* @author ruoyi |
||||||
|
*/ |
||||||
|
public enum BusinessType |
||||||
|
{ |
||||||
|
/** |
||||||
|
* 其它 |
||||||
|
*/ |
||||||
|
OTHER("OTHER","其他"), |
||||||
|
|
||||||
|
/** |
||||||
|
* 新增 |
||||||
|
*/ |
||||||
|
INSERT("INSERT","新增"), |
||||||
|
|
||||||
|
/** |
||||||
|
* 修改 |
||||||
|
*/ |
||||||
|
UPDATE("UPDATE","修改"), |
||||||
|
|
||||||
|
/** |
||||||
|
* 删除 |
||||||
|
*/ |
||||||
|
DELETE("DELETE","删除"), |
||||||
|
|
||||||
|
/** |
||||||
|
* 授权 |
||||||
|
*/ |
||||||
|
GRANT("GRANT","授权"), |
||||||
|
|
||||||
|
/** |
||||||
|
* 导出 |
||||||
|
*/ |
||||||
|
EXPORT("EXPORT","导出"), |
||||||
|
|
||||||
|
/** |
||||||
|
* 导入 |
||||||
|
*/ |
||||||
|
IMPORT("IMPORT","导入"), |
||||||
|
|
||||||
|
/** |
||||||
|
* 强退 |
||||||
|
*/ |
||||||
|
FORCE("FORCE","强退"), |
||||||
|
|
||||||
|
/** |
||||||
|
* 查询 |
||||||
|
*/ |
||||||
|
GENCODE("GENCODE","查询"), |
||||||
|
|
||||||
|
/** |
||||||
|
* 清空数据 |
||||||
|
*/ |
||||||
|
CLEAN("CLEAN","清空数据"); |
||||||
|
|
||||||
|
@Getter |
||||||
|
private String key; |
||||||
|
|
||||||
|
@Getter |
||||||
|
private String value; |
||||||
|
|
||||||
|
BusinessType(String key,String value){ |
||||||
|
this.key = key; |
||||||
|
this.value = value; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,45 @@ |
|||||||
|
package com.hnac.hzims.common.logs.enums; |
||||||
|
|
||||||
|
import lombok.Getter; |
||||||
|
|
||||||
|
/** |
||||||
|
* 操作人类别 |
||||||
|
* |
||||||
|
* @author ruoyi |
||||||
|
*/ |
||||||
|
public enum OperatorType |
||||||
|
{ |
||||||
|
/** |
||||||
|
* 其它 |
||||||
|
*/ |
||||||
|
OTHER("OTHER","其它"), |
||||||
|
|
||||||
|
/** |
||||||
|
* 后台用户 |
||||||
|
*/ |
||||||
|
MANAGE("MANAGE","后台用户"), |
||||||
|
|
||||||
|
/** |
||||||
|
* web 端 |
||||||
|
*/ |
||||||
|
MOBILE("MOBILE","web端"), |
||||||
|
/** |
||||||
|
* app 端 |
||||||
|
*/ |
||||||
|
APPSYSTEMS("APPSYSTEMS","app端"); |
||||||
|
|
||||||
|
|
||||||
|
@Getter |
||||||
|
private String key; |
||||||
|
|
||||||
|
@Getter |
||||||
|
private String value; |
||||||
|
|
||||||
|
|
||||||
|
OperatorType(String key,String value){ |
||||||
|
this.key = key; |
||||||
|
this.value = value; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,29 @@ |
|||||||
|
package com.hnac.hzims.common.logs.fegin; |
||||||
|
|
||||||
|
import com.hnac.hzims.common.logs.to.SysLogTo; |
||||||
|
import com.hnac.hzims.common.logs.fegin.fallback.SysLogFeignServiceFallback; |
||||||
|
import org.springframework.cloud.openfeign.FeignClient; |
||||||
|
import org.springframework.stereotype.Repository; |
||||||
|
import org.springframework.web.bind.annotation.PostMapping; |
||||||
|
import org.springframework.web.bind.annotation.RequestBody; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author WL |
||||||
|
* @Version v1.0 |
||||||
|
* @Serial 1.0 |
||||||
|
* @Date 2023/4/3 13:46 |
||||||
|
*/ |
||||||
|
@Repository |
||||||
|
@FeignClient(value = "hzims-middle",fallback = SysLogFeignServiceFallback.class) |
||||||
|
public interface SysLogFeignService { |
||||||
|
|
||||||
|
/** |
||||||
|
* 报存日志操作 |
||||||
|
* |
||||||
|
* @param sysLogs |
||||||
|
*/ |
||||||
|
@PostMapping("/systemlog/sys-log/batchSave") |
||||||
|
void saveBatch(@RequestBody List<SysLogTo> sysLogs); |
||||||
|
} |
@ -0,0 +1,30 @@ |
|||||||
|
package com.hnac.hzims.common.logs.fegin.fallback; |
||||||
|
|
||||||
|
import com.hnac.hzims.common.logs.to.SysLogTo; |
||||||
|
import com.hnac.hzims.common.logs.fegin.SysLogFeignService; |
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
import org.springframework.stereotype.Service; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author WL |
||||||
|
* @Version v1.0 |
||||||
|
* @Serial 1.0 |
||||||
|
* @Date 2023/4/4 9:45 |
||||||
|
*/ |
||||||
|
@Slf4j |
||||||
|
@Service |
||||||
|
public class SysLogFeignServiceFallback implements SysLogFeignService { |
||||||
|
/** |
||||||
|
* 报存日志操作 |
||||||
|
* |
||||||
|
* @param sysLogs |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public void saveBatch(List<SysLogTo> sysLogs) { |
||||||
|
log.error("报存日志操作异常发生,进入fallback方法"); |
||||||
|
log.error("获取异常的数据 {}", sysLogs); |
||||||
|
throw new IllegalArgumentException("报存日志操作异常发生,进入fallback方法"); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,88 @@ |
|||||||
|
package com.hnac.hzims.common.logs.text; |
||||||
|
|
||||||
|
|
||||||
|
import com.hnac.hzims.common.logs.utils.StringUtils; |
||||||
|
|
||||||
|
import java.nio.charset.Charset; |
||||||
|
import java.nio.charset.StandardCharsets; |
||||||
|
|
||||||
|
/** |
||||||
|
* 字符集工具类 |
||||||
|
* |
||||||
|
* @author dfy |
||||||
|
*/ |
||||||
|
public class CharsetKit |
||||||
|
{ |
||||||
|
/** ISO-8859-1 */ |
||||||
|
public static final String ISO_8859_1 = "ISO-8859-1"; |
||||||
|
/** UTF-8 */ |
||||||
|
public static final String UTF_8 = "UTF-8"; |
||||||
|
/** GBK */ |
||||||
|
public static final String GBK = "GBK"; |
||||||
|
|
||||||
|
/** ISO-8859-1 */ |
||||||
|
public static final Charset CHARSET_ISO_8859_1 = Charset.forName(ISO_8859_1); |
||||||
|
/** UTF-8 */ |
||||||
|
public static final Charset CHARSET_UTF_8 = Charset.forName(UTF_8); |
||||||
|
/** GBK */ |
||||||
|
public static final Charset CHARSET_GBK = Charset.forName(GBK); |
||||||
|
|
||||||
|
/** |
||||||
|
* 转换为Charset对象 |
||||||
|
* |
||||||
|
* @param charset 字符集,为空则返回默认字符集 |
||||||
|
* @return Charset |
||||||
|
*/ |
||||||
|
public static Charset charset(String charset) |
||||||
|
{ |
||||||
|
return StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 转换字符串的字符集编码 |
||||||
|
* |
||||||
|
* @param source 字符串 |
||||||
|
* @param srcCharset 源字符集,默认ISO-8859-1 |
||||||
|
* @param destCharset 目标字符集,默认UTF-8 |
||||||
|
* @return 转换后的字符集 |
||||||
|
*/ |
||||||
|
public static String convert(String source, String srcCharset, String destCharset) |
||||||
|
{ |
||||||
|
return convert(source, Charset.forName(srcCharset), Charset.forName(destCharset)); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 转换字符串的字符集编码 |
||||||
|
* |
||||||
|
* @param source 字符串 |
||||||
|
* @param srcCharset 源字符集,默认ISO-8859-1 |
||||||
|
* @param destCharset 目标字符集,默认UTF-8 |
||||||
|
* @return 转换后的字符集 |
||||||
|
*/ |
||||||
|
public static String convert(String source, Charset srcCharset, Charset destCharset) |
||||||
|
{ |
||||||
|
if (null == srcCharset) |
||||||
|
{ |
||||||
|
srcCharset = StandardCharsets.ISO_8859_1; |
||||||
|
} |
||||||
|
|
||||||
|
if (null == destCharset) |
||||||
|
{ |
||||||
|
destCharset = StandardCharsets.UTF_8; |
||||||
|
} |
||||||
|
|
||||||
|
if (StringUtils.isEmpty(source) || srcCharset.equals(destCharset)) |
||||||
|
{ |
||||||
|
return source; |
||||||
|
} |
||||||
|
return new String(source.getBytes(srcCharset), destCharset); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @return 系统字符集编码 |
||||||
|
*/ |
||||||
|
public static String systemCharset() |
||||||
|
{ |
||||||
|
return Charset.defaultCharset().name(); |
||||||
|
} |
||||||
|
} |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,93 @@ |
|||||||
|
package com.hnac.hzims.common.logs.text; |
||||||
|
|
||||||
|
|
||||||
|
import com.hnac.hzims.common.logs.utils.StringUtils; |
||||||
|
|
||||||
|
/** |
||||||
|
* 字符串格式化 |
||||||
|
* |
||||||
|
* @author ruoyi |
||||||
|
*/ |
||||||
|
public class StrFormatter |
||||||
|
{ |
||||||
|
public static final String EMPTY_JSON = "{}"; |
||||||
|
public static final char C_BACKSLASH = '\\'; |
||||||
|
public static final char C_DELIM_START = '{'; |
||||||
|
public static final char C_DELIM_END = '}'; |
||||||
|
|
||||||
|
/** |
||||||
|
* 格式化字符串<br> |
||||||
|
* 此方法只是简单将占位符 {} 按照顺序替换为参数<br> |
||||||
|
* 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可<br> |
||||||
|
* 例:<br> |
||||||
|
* 通常使用:format("this is {} for {}", "a", "b") -> this is a for b<br> |
||||||
|
* 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a<br> |
||||||
|
* 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b<br> |
||||||
|
* |
||||||
|
* @param strPattern 字符串模板 |
||||||
|
* @param argArray 参数列表 |
||||||
|
* @return 结果 |
||||||
|
*/ |
||||||
|
public static String format(final String strPattern, final Object... argArray) |
||||||
|
{ |
||||||
|
if (StringUtils.isEmpty(strPattern) || StringUtils.isEmpty(argArray)) |
||||||
|
{ |
||||||
|
return strPattern; |
||||||
|
} |
||||||
|
final int strPatternLength = strPattern.length(); |
||||||
|
|
||||||
|
// 初始化定义好的长度以获得更好的性能
|
||||||
|
StringBuilder sbuf = new StringBuilder(strPatternLength + 50); |
||||||
|
|
||||||
|
int handledPosition = 0; |
||||||
|
int delimIndex;// 占位符所在位置
|
||||||
|
for (int argIndex = 0; argIndex < argArray.length; argIndex++) |
||||||
|
{ |
||||||
|
delimIndex = strPattern.indexOf(EMPTY_JSON, handledPosition); |
||||||
|
if (delimIndex == -1) |
||||||
|
{ |
||||||
|
if (handledPosition == 0) |
||||||
|
{ |
||||||
|
return strPattern; |
||||||
|
} |
||||||
|
else |
||||||
|
{ // 字符串模板剩余部分不再包含占位符,加入剩余部分后返回结果
|
||||||
|
sbuf.append(strPattern, handledPosition, strPatternLength); |
||||||
|
return sbuf.toString(); |
||||||
|
} |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
if (delimIndex > 0 && strPattern.charAt(delimIndex - 1) == C_BACKSLASH) |
||||||
|
{ |
||||||
|
if (delimIndex > 1 && strPattern.charAt(delimIndex - 2) == C_BACKSLASH) |
||||||
|
{ |
||||||
|
// 转义符之前还有一个转义符,占位符依旧有效
|
||||||
|
sbuf.append(strPattern, handledPosition, delimIndex - 1); |
||||||
|
sbuf.append(Convert.utf8Str(argArray[argIndex])); |
||||||
|
handledPosition = delimIndex + 2; |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
// 占位符被转义
|
||||||
|
argIndex--; |
||||||
|
sbuf.append(strPattern, handledPosition, delimIndex - 1); |
||||||
|
sbuf.append(C_DELIM_START); |
||||||
|
handledPosition = delimIndex + 1; |
||||||
|
} |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
// 正常占位符
|
||||||
|
sbuf.append(strPattern, handledPosition, delimIndex); |
||||||
|
sbuf.append(Convert.utf8Str(argArray[argIndex])); |
||||||
|
handledPosition = delimIndex + 2; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
// 加入最后一个占位符后所有的字符
|
||||||
|
sbuf.append(strPattern, handledPosition, strPattern.length()); |
||||||
|
|
||||||
|
return sbuf.toString(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,145 @@ |
|||||||
|
package com.hnac.hzims.common.logs.to; |
||||||
|
|
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
import java.time.LocalDateTime; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author WL |
||||||
|
* @Version v1.0 |
||||||
|
* @Serial 1.0 |
||||||
|
* @Date 2023/3/29 13:24 |
||||||
|
*/ |
||||||
|
@Data |
||||||
|
public class SysLogTo { |
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L; |
||||||
|
|
||||||
|
|
||||||
|
private Long id; |
||||||
|
|
||||||
|
/** |
||||||
|
* 租户ID |
||||||
|
*/ |
||||||
|
private String tenantId; |
||||||
|
|
||||||
|
/** |
||||||
|
* 服务器ip |
||||||
|
*/ |
||||||
|
protected String serverIp; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 服务器地址 |
||||||
|
*/ |
||||||
|
protected String serverHost; |
||||||
|
|
||||||
|
/** |
||||||
|
* 服务名称 |
||||||
|
*/ |
||||||
|
protected String serverName; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 环境 |
||||||
|
*/ |
||||||
|
protected String env; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 操作人 id |
||||||
|
*/ |
||||||
|
private Long operationUserId; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 操作人 |
||||||
|
*/ |
||||||
|
private String operationUserName; |
||||||
|
|
||||||
|
/** |
||||||
|
* 请求路径 (操作地址) |
||||||
|
*/ |
||||||
|
private String path; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 用户代理 |
||||||
|
*/ |
||||||
|
protected String userAgent; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 操作方式 |
||||||
|
*/ |
||||||
|
protected String method; |
||||||
|
|
||||||
|
/** |
||||||
|
* 方法类 |
||||||
|
*/ |
||||||
|
protected String methodClass; |
||||||
|
|
||||||
|
/** |
||||||
|
* 方法名 |
||||||
|
*/ |
||||||
|
protected String methodName; |
||||||
|
|
||||||
|
/** |
||||||
|
* 方法执行时间 消耗时间 毫秒 |
||||||
|
*/ |
||||||
|
private String costTime; |
||||||
|
|
||||||
|
/** |
||||||
|
* 方法入参 |
||||||
|
*/ |
||||||
|
private String parameter; |
||||||
|
|
||||||
|
/** |
||||||
|
* 操作方法 |
||||||
|
*/ |
||||||
|
private String title; |
||||||
|
|
||||||
|
/** |
||||||
|
* 方法描述 |
||||||
|
*/ |
||||||
|
private String action; |
||||||
|
|
||||||
|
/** |
||||||
|
* 系统类型 |
||||||
|
*/ |
||||||
|
private String operatorType; |
||||||
|
|
||||||
|
/** |
||||||
|
* 操作人类别 |
||||||
|
*/ |
||||||
|
private String businessType; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 返回结果 |
||||||
|
* |
||||||
|
* @param jsonResult |
||||||
|
*/ |
||||||
|
public String jsonResult; |
||||||
|
|
||||||
|
/** |
||||||
|
* 请求的Ip |
||||||
|
*/ |
||||||
|
private String localIp; |
||||||
|
|
||||||
|
/** |
||||||
|
* 错误消息 |
||||||
|
*/ |
||||||
|
private String errorMsg; |
||||||
|
/** |
||||||
|
* 操作时间 |
||||||
|
*/ |
||||||
|
private LocalDateTime operationTime; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 操作状态(0 正常 1 异常) |
||||||
|
*/ |
||||||
|
private Integer status; |
||||||
|
|
||||||
|
} |
@ -0,0 +1,130 @@ |
|||||||
|
package com.hnac.hzims.common.logs.utils; |
||||||
|
|
||||||
|
/** |
||||||
|
* 通用常量信息 |
||||||
|
* |
||||||
|
* @author ruoyi |
||||||
|
*/ |
||||||
|
public class Constants |
||||||
|
{ |
||||||
|
/** |
||||||
|
* UTF-8 字符集 |
||||||
|
*/ |
||||||
|
public static final String UTF8 = "UTF-8"; |
||||||
|
|
||||||
|
/** |
||||||
|
* GBK 字符集 |
||||||
|
*/ |
||||||
|
public static final String GBK = "GBK"; |
||||||
|
|
||||||
|
/** |
||||||
|
* www主域 |
||||||
|
*/ |
||||||
|
public static final String WWW = "www."; |
||||||
|
|
||||||
|
/** |
||||||
|
* RMI 远程方法调用 |
||||||
|
*/ |
||||||
|
public static final String LOOKUP_RMI = "rmi:"; |
||||||
|
|
||||||
|
/** |
||||||
|
* LDAP 远程方法调用 |
||||||
|
*/ |
||||||
|
public static final String LOOKUP_LDAP = "ldap:"; |
||||||
|
|
||||||
|
/** |
||||||
|
* LDAPS 远程方法调用 |
||||||
|
*/ |
||||||
|
public static final String LOOKUP_LDAPS = "ldaps:"; |
||||||
|
|
||||||
|
/** |
||||||
|
* http请求 |
||||||
|
*/ |
||||||
|
public static final String HTTP = "http://"; |
||||||
|
|
||||||
|
/** |
||||||
|
* https请求 |
||||||
|
*/ |
||||||
|
public static final String HTTPS = "https://"; |
||||||
|
|
||||||
|
/** |
||||||
|
* 成功标记 |
||||||
|
*/ |
||||||
|
public static final Integer SUCCESS = 200; |
||||||
|
|
||||||
|
/** |
||||||
|
* 失败标记 |
||||||
|
*/ |
||||||
|
public static final Integer FAIL = 500; |
||||||
|
|
||||||
|
/** |
||||||
|
* 登录成功状态 |
||||||
|
*/ |
||||||
|
public static final String LOGIN_SUCCESS_STATUS = "0"; |
||||||
|
|
||||||
|
/** |
||||||
|
* 登录失败状态 |
||||||
|
*/ |
||||||
|
public static final String LOGIN_FAIL_STATUS = "1"; |
||||||
|
|
||||||
|
/** |
||||||
|
* 登录成功 |
||||||
|
*/ |
||||||
|
public static final String LOGIN_SUCCESS = "Success"; |
||||||
|
|
||||||
|
/** |
||||||
|
* 注销 |
||||||
|
*/ |
||||||
|
public static final String LOGOUT = "Logout"; |
||||||
|
|
||||||
|
/** |
||||||
|
* 注册 |
||||||
|
*/ |
||||||
|
public static final String REGISTER = "Register"; |
||||||
|
|
||||||
|
/** |
||||||
|
* 登录失败 |
||||||
|
*/ |
||||||
|
public static final String LOGIN_FAIL = "Error"; |
||||||
|
|
||||||
|
/** |
||||||
|
* 当前记录起始索引 |
||||||
|
*/ |
||||||
|
public static final String PAGE_NUM = "pageNum"; |
||||||
|
|
||||||
|
/** |
||||||
|
* 每页显示记录数 |
||||||
|
*/ |
||||||
|
public static final String PAGE_SIZE = "pageSize"; |
||||||
|
|
||||||
|
/** |
||||||
|
* 排序列 |
||||||
|
*/ |
||||||
|
public static final String ORDER_BY_COLUMN = "orderByColumn"; |
||||||
|
|
||||||
|
/** |
||||||
|
* 排序的方向 "desc" 或者 "asc". |
||||||
|
*/ |
||||||
|
public static final String IS_ASC = "isAsc"; |
||||||
|
|
||||||
|
/** |
||||||
|
* 验证码有效期(分钟) |
||||||
|
*/ |
||||||
|
public static final long CAPTCHA_EXPIRATION = 2; |
||||||
|
|
||||||
|
/** |
||||||
|
* 资源映射路径 前缀 |
||||||
|
*/ |
||||||
|
public static final String RESOURCE_PREFIX = "/profile"; |
||||||
|
|
||||||
|
/** |
||||||
|
* 定时任务白名单配置(仅允许访问的包名,如其他需要可以自行添加) |
||||||
|
*/ |
||||||
|
public static final String[] JOB_WHITELIST_STR = { "com.ruoyi" }; |
||||||
|
|
||||||
|
/** |
||||||
|
* 定时任务违规的字符 |
||||||
|
*/ |
||||||
|
public static final String[] JOB_ERROR_STR = { "java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml", |
||||||
|
"org.springframework", "org.apache", "com.ruoyi.common.core.utils.file" }; |
||||||
|
} |
@ -0,0 +1,567 @@ |
|||||||
|
package com.hnac.hzims.common.logs.utils; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author WL |
||||||
|
* @Version v1.0 |
||||||
|
* @Serial 1.0 |
||||||
|
* @Date 2023/3/31 15:43 |
||||||
|
*/ |
||||||
|
|
||||||
|
import java.util.Collection; |
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
import com.hnac.hzims.common.logs.text.StrFormatter; |
||||||
|
import org.springframework.util.AntPathMatcher; |
||||||
|
|
||||||
|
/** |
||||||
|
* 字符串工具类 |
||||||
|
* |
||||||
|
* @author ruoyi |
||||||
|
*/ |
||||||
|
public class StringUtils extends org.apache.commons.lang3.StringUtils |
||||||
|
{ |
||||||
|
/** 空字符串 */ |
||||||
|
private static final String NULLSTR = ""; |
||||||
|
|
||||||
|
/** 下划线 */ |
||||||
|
private static final char SEPARATOR = '_'; |
||||||
|
|
||||||
|
/** |
||||||
|
* 获取参数不为空值 |
||||||
|
* |
||||||
|
* @param value defaultValue 要判断的value |
||||||
|
* @return value 返回值 |
||||||
|
*/ |
||||||
|
public static <T> T nvl(T value, T defaultValue) |
||||||
|
{ |
||||||
|
return value != null ? value : defaultValue; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* * 判断一个Collection是否为空, 包含List,Set,Queue |
||||||
|
* |
||||||
|
* @param coll 要判断的Collection |
||||||
|
* @return true:为空 false:非空 |
||||||
|
*/ |
||||||
|
public static boolean isEmpty(Collection<?> coll) |
||||||
|
{ |
||||||
|
return isNull(coll) || coll.isEmpty(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* * 判断一个Collection是否非空,包含List,Set,Queue |
||||||
|
* |
||||||
|
* @param coll 要判断的Collection |
||||||
|
* @return true:非空 false:空 |
||||||
|
*/ |
||||||
|
public static boolean isNotEmpty(Collection<?> coll) |
||||||
|
{ |
||||||
|
return !isEmpty(coll); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* * 判断一个对象数组是否为空 |
||||||
|
* |
||||||
|
* @param objects 要判断的对象数组 |
||||||
|
** @return true:为空 false:非空 |
||||||
|
*/ |
||||||
|
public static boolean isEmpty(Object[] objects) |
||||||
|
{ |
||||||
|
return isNull(objects) || (objects.length == 0); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* * 判断一个对象数组是否非空 |
||||||
|
* |
||||||
|
* @param objects 要判断的对象数组 |
||||||
|
* @return true:非空 false:空 |
||||||
|
*/ |
||||||
|
public static boolean isNotEmpty(Object[] objects) |
||||||
|
{ |
||||||
|
return !isEmpty(objects); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* * 判断一个Map是否为空 |
||||||
|
* |
||||||
|
* @param map 要判断的Map |
||||||
|
* @return true:为空 false:非空 |
||||||
|
*/ |
||||||
|
public static boolean isEmpty(Map<?, ?> map) |
||||||
|
{ |
||||||
|
return isNull(map) || map.isEmpty(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* * 判断一个Map是否为空 |
||||||
|
* |
||||||
|
* @param map 要判断的Map |
||||||
|
* @return true:非空 false:空 |
||||||
|
*/ |
||||||
|
public static boolean isNotEmpty(Map<?, ?> map) |
||||||
|
{ |
||||||
|
return !isEmpty(map); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* * 判断一个字符串是否为空串 |
||||||
|
* |
||||||
|
* @param str String |
||||||
|
* @return true:为空 false:非空 |
||||||
|
*/ |
||||||
|
public static boolean isEmpty(String str) |
||||||
|
{ |
||||||
|
return isNull(str) || NULLSTR.equals(str.trim()); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* * 判断一个字符串是否为非空串 |
||||||
|
* |
||||||
|
* @param str String |
||||||
|
* @return true:非空串 false:空串 |
||||||
|
*/ |
||||||
|
public static boolean isNotEmpty(String str) |
||||||
|
{ |
||||||
|
return !isEmpty(str); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* * 判断一个对象是否为空 |
||||||
|
* |
||||||
|
* @param object Object |
||||||
|
* @return true:为空 false:非空 |
||||||
|
*/ |
||||||
|
public static boolean isNull(Object object) |
||||||
|
{ |
||||||
|
return object == null; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* * 判断一个对象是否非空 |
||||||
|
* |
||||||
|
* @param object Object |
||||||
|
* @return true:非空 false:空 |
||||||
|
*/ |
||||||
|
public static boolean isNotNull(Object object) |
||||||
|
{ |
||||||
|
return !isNull(object); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* * 判断一个对象是否是数组类型(Java基本型别的数组) |
||||||
|
* |
||||||
|
* @param object 对象 |
||||||
|
* @return true:是数组 false:不是数组 |
||||||
|
*/ |
||||||
|
public static boolean isArray(Object object) |
||||||
|
{ |
||||||
|
return isNotNull(object) && object.getClass().isArray(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 去空格 |
||||||
|
*/ |
||||||
|
public static String trim(String str) |
||||||
|
{ |
||||||
|
return (str == null ? "" : str.trim()); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 截取字符串 |
||||||
|
* |
||||||
|
* @param str 字符串 |
||||||
|
* @param start 开始 |
||||||
|
* @return 结果 |
||||||
|
*/ |
||||||
|
public static String substring(final String str, int start) |
||||||
|
{ |
||||||
|
if (str == null) |
||||||
|
{ |
||||||
|
return NULLSTR; |
||||||
|
} |
||||||
|
|
||||||
|
if (start < 0) |
||||||
|
{ |
||||||
|
start = str.length() + start; |
||||||
|
} |
||||||
|
|
||||||
|
if (start < 0) |
||||||
|
{ |
||||||
|
start = 0; |
||||||
|
} |
||||||
|
if (start > str.length()) |
||||||
|
{ |
||||||
|
return NULLSTR; |
||||||
|
} |
||||||
|
|
||||||
|
return str.substring(start); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 截取字符串 |
||||||
|
* |
||||||
|
* @param str 字符串 |
||||||
|
* @param start 开始 |
||||||
|
* @param end 结束 |
||||||
|
* @return 结果 |
||||||
|
*/ |
||||||
|
public static String substring(final String str, int start, int end) |
||||||
|
{ |
||||||
|
if (str == null) |
||||||
|
{ |
||||||
|
return NULLSTR; |
||||||
|
} |
||||||
|
|
||||||
|
if (end < 0) |
||||||
|
{ |
||||||
|
end = str.length() + end; |
||||||
|
} |
||||||
|
if (start < 0) |
||||||
|
{ |
||||||
|
start = str.length() + start; |
||||||
|
} |
||||||
|
|
||||||
|
if (end > str.length()) |
||||||
|
{ |
||||||
|
end = str.length(); |
||||||
|
} |
||||||
|
|
||||||
|
if (start > end) |
||||||
|
{ |
||||||
|
return NULLSTR; |
||||||
|
} |
||||||
|
|
||||||
|
if (start < 0) |
||||||
|
{ |
||||||
|
start = 0; |
||||||
|
} |
||||||
|
if (end < 0) |
||||||
|
{ |
||||||
|
end = 0; |
||||||
|
} |
||||||
|
|
||||||
|
return str.substring(start, end); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 判断是否为空,并且不是空白字符 |
||||||
|
* |
||||||
|
* @param str 要判断的value |
||||||
|
* @return 结果 |
||||||
|
*/ |
||||||
|
public static boolean hasText(String str) |
||||||
|
{ |
||||||
|
return (str != null && !str.isEmpty() && containsText(str)); |
||||||
|
} |
||||||
|
|
||||||
|
private static boolean containsText(CharSequence str) |
||||||
|
{ |
||||||
|
int strLen = str.length(); |
||||||
|
for (int i = 0; i < strLen; i++) |
||||||
|
{ |
||||||
|
if (!Character.isWhitespace(str.charAt(i))) |
||||||
|
{ |
||||||
|
return true; |
||||||
|
} |
||||||
|
} |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 格式化文本, {} 表示占位符<br> |
||||||
|
* 此方法只是简单将占位符 {} 按照顺序替换为参数<br> |
||||||
|
* 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可<br> |
||||||
|
* 例:<br> |
||||||
|
* 通常使用:format("this is {} for {}", "a", "b") -> this is a for b<br> |
||||||
|
* 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a<br> |
||||||
|
* 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b<br> |
||||||
|
* |
||||||
|
* @param template 文本模板,被替换的部分用 {} 表示 |
||||||
|
* @param params 参数值 |
||||||
|
* @return 格式化后的文本 |
||||||
|
*/ |
||||||
|
public static String format(String template, Object... params) |
||||||
|
{ |
||||||
|
if (isEmpty(params) || isEmpty(template)) |
||||||
|
{ |
||||||
|
return template; |
||||||
|
} |
||||||
|
return StrFormatter.format(template, params); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 是否为http(s)://开头
|
||||||
|
* |
||||||
|
* @param link 链接 |
||||||
|
* @return 结果 |
||||||
|
*/ |
||||||
|
public static boolean ishttp(String link) |
||||||
|
{ |
||||||
|
return startsWithAny(link, Constants.HTTP, Constants.HTTPS); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 判断给定的set列表中是否包含数组array 判断给定的数组array中是否包含给定的元素value |
||||||
|
* |
||||||
|
* @param array 给定的数组 |
||||||
|
* @return boolean 结果 |
||||||
|
*/ |
||||||
|
public static boolean containsAny(Collection<String> collection, String... array) |
||||||
|
{ |
||||||
|
if (isEmpty(collection) || isEmpty(array)) |
||||||
|
{ |
||||||
|
return false; |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
for (String str : array) |
||||||
|
{ |
||||||
|
if (collection.contains(str)) |
||||||
|
{ |
||||||
|
return true; |
||||||
|
} |
||||||
|
} |
||||||
|
return false; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 驼峰转下划线命名 |
||||||
|
*/ |
||||||
|
public static String toUnderScoreCase(String str) |
||||||
|
{ |
||||||
|
if (str == null) |
||||||
|
{ |
||||||
|
return null; |
||||||
|
} |
||||||
|
StringBuilder sb = new StringBuilder(); |
||||||
|
// 前置字符是否大写
|
||||||
|
boolean preCharIsUpperCase = true; |
||||||
|
// 当前字符是否大写
|
||||||
|
boolean curreCharIsUpperCase = true; |
||||||
|
// 下一字符是否大写
|
||||||
|
boolean nexteCharIsUpperCase = true; |
||||||
|
for (int i = 0; i < str.length(); i++) |
||||||
|
{ |
||||||
|
char c = str.charAt(i); |
||||||
|
if (i > 0) |
||||||
|
{ |
||||||
|
preCharIsUpperCase = Character.isUpperCase(str.charAt(i - 1)); |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
preCharIsUpperCase = false; |
||||||
|
} |
||||||
|
|
||||||
|
curreCharIsUpperCase = Character.isUpperCase(c); |
||||||
|
|
||||||
|
if (i < (str.length() - 1)) |
||||||
|
{ |
||||||
|
nexteCharIsUpperCase = Character.isUpperCase(str.charAt(i + 1)); |
||||||
|
} |
||||||
|
|
||||||
|
if (preCharIsUpperCase && curreCharIsUpperCase && !nexteCharIsUpperCase) |
||||||
|
{ |
||||||
|
sb.append(SEPARATOR); |
||||||
|
} |
||||||
|
else if ((i != 0 && !preCharIsUpperCase) && curreCharIsUpperCase) |
||||||
|
{ |
||||||
|
sb.append(SEPARATOR); |
||||||
|
} |
||||||
|
sb.append(Character.toLowerCase(c)); |
||||||
|
} |
||||||
|
|
||||||
|
return sb.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 是否包含字符串 |
||||||
|
* |
||||||
|
* @param str 验证字符串 |
||||||
|
* @param strs 字符串组 |
||||||
|
* @return 包含返回true |
||||||
|
*/ |
||||||
|
public static boolean inStringIgnoreCase(String str, String... strs) |
||||||
|
{ |
||||||
|
if (str != null && strs != null) |
||||||
|
{ |
||||||
|
for (String s : strs) |
||||||
|
{ |
||||||
|
if (str.equalsIgnoreCase(trim(s))) |
||||||
|
{ |
||||||
|
return true; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 例如:HELLO_WORLD->HelloWorld |
||||||
|
* |
||||||
|
* @param name 转换前的下划线大写方式命名的字符串 |
||||||
|
* @return 转换后的驼峰式命名的字符串 |
||||||
|
*/ |
||||||
|
public static String convertToCamelCase(String name) |
||||||
|
{ |
||||||
|
StringBuilder result = new StringBuilder(); |
||||||
|
// 快速检查
|
||||||
|
if (name == null || name.isEmpty()) |
||||||
|
{ |
||||||
|
// 没必要转换
|
||||||
|
return ""; |
||||||
|
} |
||||||
|
else if (!name.contains("_")) |
||||||
|
{ |
||||||
|
// 不含下划线,仅将首字母大写
|
||||||
|
return name.substring(0, 1).toUpperCase() + name.substring(1); |
||||||
|
} |
||||||
|
// 用下划线将原始字符串分割
|
||||||
|
String[] camels = name.split("_"); |
||||||
|
for (String camel : camels) |
||||||
|
{ |
||||||
|
// 跳过原始字符串中开头、结尾的下换线或双重下划线
|
||||||
|
if (camel.isEmpty()) |
||||||
|
{ |
||||||
|
continue; |
||||||
|
} |
||||||
|
// 首字母大写
|
||||||
|
result.append(camel.substring(0, 1).toUpperCase()); |
||||||
|
result.append(camel.substring(1).toLowerCase()); |
||||||
|
} |
||||||
|
return result.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 驼峰式命名法 |
||||||
|
* 例如:user_name->userName |
||||||
|
*/ |
||||||
|
public static String toCamelCase(String s) |
||||||
|
{ |
||||||
|
if (s == null) |
||||||
|
{ |
||||||
|
return null; |
||||||
|
} |
||||||
|
if (s.indexOf(SEPARATOR) == -1) |
||||||
|
{ |
||||||
|
return s; |
||||||
|
} |
||||||
|
s = s.toLowerCase(); |
||||||
|
StringBuilder sb = new StringBuilder(s.length()); |
||||||
|
boolean upperCase = false; |
||||||
|
for (int i = 0; i < s.length(); i++) |
||||||
|
{ |
||||||
|
char c = s.charAt(i); |
||||||
|
|
||||||
|
if (c == SEPARATOR) |
||||||
|
{ |
||||||
|
upperCase = true; |
||||||
|
} |
||||||
|
else if (upperCase) |
||||||
|
{ |
||||||
|
sb.append(Character.toUpperCase(c)); |
||||||
|
upperCase = false; |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
sb.append(c); |
||||||
|
} |
||||||
|
} |
||||||
|
return sb.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 查找指定字符串是否匹配指定字符串列表中的任意一个字符串 |
||||||
|
* |
||||||
|
* @param str 指定字符串 |
||||||
|
* @param strs 需要检查的字符串数组 |
||||||
|
* @return 是否匹配 |
||||||
|
*/ |
||||||
|
public static boolean matches(String str, List<String> strs) |
||||||
|
{ |
||||||
|
if (isEmpty(str) || isEmpty(strs)) |
||||||
|
{ |
||||||
|
return false; |
||||||
|
} |
||||||
|
for (String pattern : strs) |
||||||
|
{ |
||||||
|
if (isMatch(pattern, str)) |
||||||
|
{ |
||||||
|
return true; |
||||||
|
} |
||||||
|
} |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 判断url是否与规则配置: |
||||||
|
* ? 表示单个字符; |
||||||
|
* * 表示一层路径内的任意字符串,不可跨层级; |
||||||
|
* ** 表示任意层路径; |
||||||
|
* |
||||||
|
* @param pattern 匹配规则 |
||||||
|
* @param url 需要匹配的url |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static boolean isMatch(String pattern, String url) |
||||||
|
{ |
||||||
|
AntPathMatcher matcher = new AntPathMatcher(); |
||||||
|
return matcher.match(pattern, url); |
||||||
|
} |
||||||
|
|
||||||
|
@SuppressWarnings("unchecked") |
||||||
|
public static <T> T cast(Object obj) |
||||||
|
{ |
||||||
|
return (T) obj; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 数字左边补齐0,使之达到指定长度。注意,如果数字转换为字符串后,长度大于size,则只保留 最后size个字符。 |
||||||
|
* |
||||||
|
* @param num 数字对象 |
||||||
|
* @param size 字符串指定长度 |
||||||
|
* @return 返回数字的字符串格式,该字符串为指定长度。 |
||||||
|
*/ |
||||||
|
public static final String padl(final Number num, final int size) |
||||||
|
{ |
||||||
|
return padl(num.toString(), size, '0'); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 字符串左补齐。如果原始字符串s长度大于size,则只保留最后size个字符。 |
||||||
|
* |
||||||
|
* @param s 原始字符串 |
||||||
|
* @param size 字符串指定长度 |
||||||
|
* @param c 用于补齐的字符 |
||||||
|
* @return 返回指定长度的字符串,由原字符串左补齐或截取得到。 |
||||||
|
*/ |
||||||
|
public static final String padl(final String s, final int size, final char c) |
||||||
|
{ |
||||||
|
final StringBuilder sb = new StringBuilder(size); |
||||||
|
if (s != null) |
||||||
|
{ |
||||||
|
final int len = s.length(); |
||||||
|
if (s.length() <= size) |
||||||
|
{ |
||||||
|
for (int i = size - len; i > 0; i--) |
||||||
|
{ |
||||||
|
sb.append(c); |
||||||
|
} |
||||||
|
sb.append(s); |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
return s.substring(len - size, len); |
||||||
|
} |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
for (int i = size; i > 0; i--) |
||||||
|
{ |
||||||
|
sb.append(c); |
||||||
|
} |
||||||
|
} |
||||||
|
return sb.toString(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,49 @@ |
|||||||
|
package com.hnac.hzims.common.utils; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.toolkit.StringUtils; |
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author WL |
||||||
|
* @Version v1.0 |
||||||
|
* @Serial 1.0 |
||||||
|
* @Date 2023/3/29 11:45 |
||||||
|
*/ |
||||||
|
public class IPUtils { |
||||||
|
|
||||||
|
/** |
||||||
|
* 获取客户端ip地址 |
||||||
|
* @param request |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static String getIpAddress(HttpServletRequest request) { |
||||||
|
|
||||||
|
String sourceIp = null; |
||||||
|
|
||||||
|
String ipAddresses = request.getHeader("x-forwarded-for"); |
||||||
|
|
||||||
|
if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) { |
||||||
|
ipAddresses = request.getHeader("Proxy-Client-IP"); |
||||||
|
} |
||||||
|
if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) { |
||||||
|
ipAddresses = request.getHeader("WL-Proxy-Client-IP"); |
||||||
|
} |
||||||
|
if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) { |
||||||
|
ipAddresses = request.getHeader("HTTP_CLIENT_IP"); |
||||||
|
} |
||||||
|
if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) { |
||||||
|
ipAddresses = request.getHeader("HTTP_X_FORWARDED_FOR"); |
||||||
|
} |
||||||
|
if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) { |
||||||
|
ipAddresses = request.getRemoteAddr(); |
||||||
|
} |
||||||
|
if (StringUtils.isEmpty(ipAddresses)) { |
||||||
|
sourceIp = ipAddresses.split(",")[0]; |
||||||
|
} |
||||||
|
|
||||||
|
return sourceIp; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,85 @@ |
|||||||
|
package com.hnac.hzims.operational.duty.entity; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.SqlCondition; |
||||||
|
import com.baomidou.mybatisplus.annotation.TableName; |
||||||
|
import com.fasterxml.jackson.annotation.JsonFormat; |
||||||
|
import com.fasterxml.jackson.databind.annotation.JsonSerialize; |
||||||
|
import com.fasterxml.jackson.databind.ser.std.NullSerializer; |
||||||
|
import io.swagger.annotations.ApiModel; |
||||||
|
import io.swagger.annotations.ApiModelProperty; |
||||||
|
import lombok.Data; |
||||||
|
import lombok.EqualsAndHashCode; |
||||||
|
import org.springblade.core.mp.support.QueryField; |
||||||
|
import org.springblade.core.tenant.mp.TenantEntity; |
||||||
|
import org.springblade.core.tool.utils.DateUtil; |
||||||
|
import org.springframework.format.annotation.DateTimeFormat; |
||||||
|
|
||||||
|
import java.util.Date; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 实体类 |
||||||
|
* |
||||||
|
* @author ty |
||||||
|
*/ |
||||||
|
@Data |
||||||
|
@TableName("hz_ims_duty_emergency") |
||||||
|
@EqualsAndHashCode(callSuper = true) |
||||||
|
@ApiModel(value = "ImsDutyEmergency对象", description = "突发事件登记") |
||||||
|
public class ImsDutyEmergencyEntity extends TenantEntity { |
||||||
|
|
||||||
|
private static final long serialVersionUID = 4259568798118459986L; |
||||||
|
/** |
||||||
|
* 值班日期 |
||||||
|
*/ |
||||||
|
@DateTimeFormat(pattern = DateUtil.PATTERN_DATETIME) |
||||||
|
@JsonFormat(pattern = DateUtil.PATTERN_DATETIME) |
||||||
|
@ApiModelProperty(value = "值班日期") |
||||||
|
private Date dutyTime; |
||||||
|
|
||||||
|
/** |
||||||
|
* 班次 |
||||||
|
*/ |
||||||
|
@ApiModelProperty(value = "班次") |
||||||
|
private Long dutyClass; |
||||||
|
/** |
||||||
|
* 登记人 |
||||||
|
*/ |
||||||
|
@ApiModelProperty(value = "登记人") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private Long registrant; |
||||||
|
/** |
||||||
|
* 值班长 |
||||||
|
*/ |
||||||
|
@ApiModelProperty(value = "值班长") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private Long chargePerson; |
||||||
|
/** |
||||||
|
* 登记时间 |
||||||
|
*/ |
||||||
|
@DateTimeFormat(pattern = DateUtil.PATTERN_DATETIME) |
||||||
|
@JsonFormat(pattern = DateUtil.PATTERN_DATETIME) |
||||||
|
@ApiModelProperty(value = "登记时间") |
||||||
|
private Date registerTime; |
||||||
|
/** |
||||||
|
* 事件主题 |
||||||
|
*/ |
||||||
|
@QueryField(condition = SqlCondition.LIKE) |
||||||
|
@ApiModelProperty(value = "事件主题") |
||||||
|
private String eventTitle; |
||||||
|
/** |
||||||
|
* 事件内容 |
||||||
|
*/ |
||||||
|
@QueryField(condition = SqlCondition.LIKE) |
||||||
|
@ApiModelProperty(value = "事件内容") |
||||||
|
private String eventInfo; |
||||||
|
|
||||||
|
/** |
||||||
|
* 事件方式 |
||||||
|
*/ |
||||||
|
@QueryField(condition = SqlCondition.LIKE) |
||||||
|
@ApiModelProperty(value = "事件方式") |
||||||
|
private String eventType; |
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,82 @@ |
|||||||
|
package com.hnac.hzims.operational.duty.entity; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableField; |
||||||
|
import com.baomidou.mybatisplus.annotation.TableName; |
||||||
|
import com.fasterxml.jackson.annotation.JsonFormat; |
||||||
|
import io.swagger.annotations.ApiModel; |
||||||
|
import io.swagger.annotations.ApiModelProperty; |
||||||
|
import lombok.Data; |
||||||
|
import lombok.EqualsAndHashCode; |
||||||
|
import org.springblade.core.tenant.mp.TenantEntity; |
||||||
|
import org.springblade.core.tool.utils.DateUtil; |
||||||
|
import org.springframework.format.annotation.DateTimeFormat; |
||||||
|
|
||||||
|
import java.util.Date; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 实体类 |
||||||
|
* |
||||||
|
* @author TY |
||||||
|
*/ |
||||||
|
@Data |
||||||
|
@TableName("hz_ims_duty_main_person") |
||||||
|
@EqualsAndHashCode(callSuper = true) |
||||||
|
@ApiModel(value = "ImsDutyMainPerson对象", description = "值班-人员信息") |
||||||
|
public class ImsDutyMainPersonEntity extends TenantEntity { |
||||||
|
|
||||||
|
private static final long serialVersionUID = -1913292438493450113L; |
||||||
|
|
||||||
|
/** |
||||||
|
* 值班组id |
||||||
|
*/ |
||||||
|
@ApiModelProperty(value = "值班组id") |
||||||
|
private Long dutyGroupId; |
||||||
|
|
||||||
|
/** |
||||||
|
* 值班人ID |
||||||
|
*/ |
||||||
|
@ApiModelProperty(value = "值班人ID") |
||||||
|
private Long dutyPerson; |
||||||
|
/** |
||||||
|
* 值班负责人ID |
||||||
|
*/ |
||||||
|
@ApiModelProperty(value = "值班负责人ID") |
||||||
|
private Long dutyChargePerson; |
||||||
|
/** |
||||||
|
* 值班日期 |
||||||
|
*/ |
||||||
|
@DateTimeFormat(pattern = DateUtil.PATTERN_DATE) |
||||||
|
@JsonFormat(pattern = DateUtil.PATTERN_DATE) |
||||||
|
@ApiModelProperty(value = "值班日期") |
||||||
|
private Date dutyDate; |
||||||
|
|
||||||
|
/** |
||||||
|
* 班次ID |
||||||
|
*/ |
||||||
|
@ApiModelProperty(value = "班次ID") |
||||||
|
private Long classId; |
||||||
|
// /**
|
||||||
|
// * 班次名称
|
||||||
|
// */
|
||||||
|
// @TableField(exist=false)
|
||||||
|
// @ApiModelProperty(value = "班次名称")
|
||||||
|
// private String className;
|
||||||
|
/** |
||||||
|
* 值班班组名称 |
||||||
|
*/ |
||||||
|
@TableField(exist=false) |
||||||
|
@ApiModelProperty(value = "值班班组名称") |
||||||
|
private String dutyGroupName; |
||||||
|
/** |
||||||
|
* 值班-班组ID |
||||||
|
*/ |
||||||
|
@ApiModelProperty(value = "值班-班组ID") |
||||||
|
private Long dutyMainId; |
||||||
|
/** |
||||||
|
* 备注 |
||||||
|
*/ |
||||||
|
@ApiModelProperty(value = "备注") |
||||||
|
private String remark; |
||||||
|
|
||||||
|
} |
@ -0,0 +1,41 @@ |
|||||||
|
package com.hnac.hzims.operational.duty.vo; |
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonFormat; |
||||||
|
import com.fasterxml.jackson.databind.annotation.JsonSerialize; |
||||||
|
import com.fasterxml.jackson.databind.ser.std.NullSerializer; |
||||||
|
import com.hnac.hzims.operational.duty.entity.ImsDutyMainEntity; |
||||||
|
import io.swagger.annotations.ApiModel; |
||||||
|
import io.swagger.annotations.ApiModelProperty; |
||||||
|
import lombok.Data; |
||||||
|
import org.springblade.core.tool.utils.DateUtil; |
||||||
|
import org.springframework.format.annotation.DateTimeFormat; |
||||||
|
|
||||||
|
import java.util.Date; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
@Data |
||||||
|
@ApiModel(value = "调班对象", description = "调班填写的相关信息") |
||||||
|
public class ChangeDutyMainVo extends ImsDutyMainEntity { |
||||||
|
|
||||||
|
@ApiModelProperty(value = "人员ID") |
||||||
|
private List<String> personId; |
||||||
|
|
||||||
|
@DateTimeFormat(pattern = DateUtil.PATTERN_DATE) |
||||||
|
@JsonFormat(pattern = DateUtil.PATTERN_DATE) |
||||||
|
@ApiModelProperty(value = "调班开始日期") |
||||||
|
private Date changeStartDate; |
||||||
|
|
||||||
|
@DateTimeFormat(pattern = DateUtil.PATTERN_DATE) |
||||||
|
@JsonFormat(pattern = DateUtil.PATTERN_DATE) |
||||||
|
@ApiModelProperty(value = "调班开始日期") |
||||||
|
private Date changeEndtDate; |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
@ApiModelProperty(value = "班次ID") |
||||||
|
private Long classId; |
||||||
|
/** |
||||||
|
* 调班类型 |
||||||
|
* 1为调入,2为调出 |
||||||
|
*/ |
||||||
|
@ApiModelProperty(value = "调班类型") |
||||||
|
private Integer type;//1为调入,2为调出
|
||||||
|
} |
@ -0,0 +1,28 @@ |
|||||||
|
package com.hnac.hzims.operational.duty.vo; |
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.annotation.JsonSerialize; |
||||||
|
import com.fasterxml.jackson.databind.ser.std.NullSerializer; |
||||||
|
import io.swagger.annotations.ApiModelProperty; |
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
@Data |
||||||
|
public class FlexibleSchedulingVo { |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 值班组长ID |
||||||
|
*/ |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
@ApiModelProperty("值班组长ID") |
||||||
|
private String chargeId; |
||||||
|
|
||||||
|
/** |
||||||
|
* 人员IDs |
||||||
|
*/ |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
@ApiModelProperty("人员ID") |
||||||
|
private List<String> personIds; |
||||||
|
|
||||||
|
} |
@ -0,0 +1,86 @@ |
|||||||
|
package com.hnac.hzims.operational.duty.vo; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.SqlCondition; |
||||||
|
import com.fasterxml.jackson.annotation.JsonFormat; |
||||||
|
import com.fasterxml.jackson.databind.annotation.JsonSerialize; |
||||||
|
import com.fasterxml.jackson.databind.ser.std.NullSerializer; |
||||||
|
import io.swagger.annotations.ApiModelProperty; |
||||||
|
import lombok.Data; |
||||||
|
import org.springblade.core.mp.support.QueryField; |
||||||
|
import org.springblade.core.tenant.mp.TenantEntity; |
||||||
|
import org.springblade.core.tool.utils.DateUtil; |
||||||
|
import org.springframework.format.annotation.DateTimeFormat; |
||||||
|
|
||||||
|
import java.util.Date; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 实体类 |
||||||
|
* |
||||||
|
* @author ty |
||||||
|
*/ |
||||||
|
@Data |
||||||
|
public class ImsDutyEmergencyVo extends TenantEntity { |
||||||
|
|
||||||
|
private static final long serialVersionUID = 4259568798118459986L; |
||||||
|
/** |
||||||
|
* 值班开始日期 |
||||||
|
*/ |
||||||
|
@DateTimeFormat(pattern = DateUtil.PATTERN_DATETIME) |
||||||
|
@JsonFormat(pattern = DateUtil.PATTERN_DATETIME) |
||||||
|
@ApiModelProperty(value = "值班开始日期") |
||||||
|
private Date dutyStartTime; |
||||||
|
/** |
||||||
|
* 值班结束日期 |
||||||
|
*/ |
||||||
|
@DateTimeFormat(pattern = DateUtil.PATTERN_DATETIME) |
||||||
|
@JsonFormat(pattern = DateUtil.PATTERN_DATETIME) |
||||||
|
@ApiModelProperty(value = "值班结束日期") |
||||||
|
private Date dutyEndTime; |
||||||
|
/** |
||||||
|
* 班次 |
||||||
|
*/ |
||||||
|
@ApiModelProperty(value = "班次") |
||||||
|
private List<Long> dutyClass; |
||||||
|
/** |
||||||
|
* 登记人 |
||||||
|
*/ |
||||||
|
@ApiModelProperty(value = "登记人") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private List<Long> registrant; |
||||||
|
/** |
||||||
|
* 值班长 |
||||||
|
*/ |
||||||
|
@ApiModelProperty(value = "值班长") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private List<Long> chargePerson; |
||||||
|
/** |
||||||
|
* 登记时间 |
||||||
|
*/ |
||||||
|
@DateTimeFormat(pattern = DateUtil.PATTERN_DATETIME) |
||||||
|
@JsonFormat(pattern = DateUtil.PATTERN_DATETIME) |
||||||
|
@ApiModelProperty(value = "登记时间") |
||||||
|
private Date registerTime; |
||||||
|
/** |
||||||
|
* 事件主题 |
||||||
|
*/ |
||||||
|
@QueryField(condition = SqlCondition.LIKE) |
||||||
|
@ApiModelProperty(value = "事件主题") |
||||||
|
private String eventTitle; |
||||||
|
/** |
||||||
|
* 事件内容 |
||||||
|
*/ |
||||||
|
@QueryField(condition = SqlCondition.LIKE) |
||||||
|
@ApiModelProperty(value = "事件内容") |
||||||
|
private String eventInfo; |
||||||
|
|
||||||
|
/** |
||||||
|
* 事件方式 |
||||||
|
*/ |
||||||
|
@QueryField(condition = SqlCondition.LIKE) |
||||||
|
@ApiModelProperty(value = "事件方式") |
||||||
|
private String eventType; |
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,22 @@ |
|||||||
|
package com.hnac.hzims.operational.main.vo; |
||||||
|
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModel; |
||||||
|
import io.swagger.annotations.ApiModelProperty; |
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author ysj |
||||||
|
* @date 2023/03/24 09:58:57 |
||||||
|
* @version 4.0.0 |
||||||
|
*/ |
||||||
|
@Data |
||||||
|
@ApiModel(value = "发电量数据") |
||||||
|
public class GenerationVo { |
||||||
|
|
||||||
|
@ApiModelProperty(value = "周期") |
||||||
|
private String period; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "月发电量") |
||||||
|
private Float power; |
||||||
|
} |
@ -0,0 +1,29 @@ |
|||||||
|
package com.hnac.hzims.operational.main.vo; |
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.annotation.JsonSerialize; |
||||||
|
import com.fasterxml.jackson.databind.ser.std.NullSerializer; |
||||||
|
import io.swagger.annotations.ApiModel; |
||||||
|
import io.swagger.annotations.ApiModelProperty; |
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
@Data |
||||||
|
@ApiModel(value = "光伏设备排行对象") |
||||||
|
public class PhotovoltaicDeviceChartsVo { |
||||||
|
|
||||||
|
@ApiModelProperty(value = "机构Id") |
||||||
|
private Long deptId; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "设备Code") |
||||||
|
private String deviceCode; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "设备名称") |
||||||
|
private String deviceName; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "实时功率: kW") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private Double load; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "发电量: kWh") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private Double generate; |
||||||
|
} |
@ -0,0 +1,87 @@ |
|||||||
|
package com.hnac.hzims.operational.main.vo; |
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.annotation.JsonSerialize; |
||||||
|
import com.fasterxml.jackson.databind.ser.std.NullSerializer; |
||||||
|
import io.swagger.annotations.ApiModel; |
||||||
|
import io.swagger.annotations.ApiModelProperty; |
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @author ysj |
||||||
|
* @date 2023/03/29 15:14:34 |
||||||
|
* @version 4.0.0 |
||||||
|
*/ |
||||||
|
@Data |
||||||
|
@ApiModel(value = "光伏设备数据对象") |
||||||
|
public class PhotovoltaicDeviceVo { |
||||||
|
|
||||||
|
@ApiModelProperty(value = "机构Id") |
||||||
|
private Long deptId; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "设备Code") |
||||||
|
private String deviceCode; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "设备名称") |
||||||
|
private String deviceName; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "容量: kW") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private Double capacity; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "实时功率: kW") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private Double load; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "环比功率") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private Double loadRatio; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "发电量: kWh") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private Double generate; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "日发电量: kWh") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private Double generateDay; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "环比功率") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private Double generateDayRatio; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "月发电量: kWh") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private Double generateMon; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "年发电量: kWh") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private Double generateYear; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "电压: V") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private Double voltage; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "电流: A") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private Double current; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "co2减排: kg") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private Double co2; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "节约标准煤减排: kt") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private Double tec; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "收益: 元") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private Double income; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "当日机组有功功率") |
||||||
|
private List<PhotovoltaicPowerVo> activePowerVoList; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "近30天用电量") |
||||||
|
private List<GenerationPowerVo> generationPowerVoList; |
||||||
|
} |
@ -0,0 +1,21 @@ |
|||||||
|
package com.hnac.hzims.operational.main.vo; |
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModel; |
||||||
|
import io.swagger.annotations.ApiModelProperty; |
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author ysj |
||||||
|
* @date 2023/03/29 15:26:07 |
||||||
|
* @version 4.0.0 |
||||||
|
*/ |
||||||
|
@Data |
||||||
|
@ApiModel(value = "月发电对象") |
||||||
|
public class PhotovoltaicGenerateYearVo { |
||||||
|
|
||||||
|
@ApiModelProperty(value = "月份") |
||||||
|
private String mon; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "发电量") |
||||||
|
private Float generate; |
||||||
|
} |
@ -0,0 +1,17 @@ |
|||||||
|
package com.hnac.hzims.operational.main.vo; |
||||||
|
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModel; |
||||||
|
import io.swagger.annotations.ApiModelProperty; |
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
@Data |
||||||
|
@ApiModel(value = "当日机组有功功率") |
||||||
|
public class PhotovoltaicPowerVo { |
||||||
|
|
||||||
|
@ApiModelProperty(value = "小时") |
||||||
|
private String hour; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "有功功率") |
||||||
|
private String activePower; |
||||||
|
} |
@ -0,0 +1,54 @@ |
|||||||
|
package com.hnac.hzims.operational.main.vo; |
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.annotation.JsonSerialize; |
||||||
|
import com.fasterxml.jackson.databind.ser.std.NullSerializer; |
||||||
|
import io.swagger.annotations.ApiModel; |
||||||
|
import io.swagger.annotations.ApiModelProperty; |
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author ysj |
||||||
|
* @date 2023/03/24 10:55:02 |
||||||
|
* @version 4.0.0 |
||||||
|
*/ |
||||||
|
@Data |
||||||
|
@ApiModel(value = "光伏实时数据") |
||||||
|
public class PhotovoltaicRealVo { |
||||||
|
|
||||||
|
@ApiModelProperty(value = "机构Id") |
||||||
|
private Long deptId; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "设备Code") |
||||||
|
private String deviceCode; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "设备名称") |
||||||
|
private String deviceName; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "状态: 0-运行") |
||||||
|
private Integer state; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "容量: kW") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private Double capacity; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "总发电量: kWh") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private Double generate; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "电压: V") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private Double voltage; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "电流: A") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private Double current; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "功率: kW") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private Double load; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "上次功率: kW") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private Double lastLoad; |
||||||
|
|
||||||
|
} |
@ -0,0 +1,89 @@ |
|||||||
|
package com.hnac.hzims.operational.main.vo; |
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonFormat; |
||||||
|
import com.fasterxml.jackson.databind.annotation.JsonSerialize; |
||||||
|
import com.fasterxml.jackson.databind.ser.std.NullSerializer; |
||||||
|
import com.hnac.hzims.hzimsweather.response.weather.Daily; |
||||||
|
import io.swagger.annotations.ApiModel; |
||||||
|
import io.swagger.annotations.ApiModelProperty; |
||||||
|
import lombok.Data; |
||||||
|
import org.springblade.core.tool.utils.DateUtil; |
||||||
|
import org.springframework.format.annotation.DateTimeFormat; |
||||||
|
|
||||||
|
import java.time.LocalDateTime; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author ysj |
||||||
|
* @date 2023/03/29 15:14:34 |
||||||
|
* @version 4.0.0 |
||||||
|
*/ |
||||||
|
@Data |
||||||
|
@ApiModel(value = "水利站点首页对象") |
||||||
|
public class PhotovoltaicStationVo { |
||||||
|
|
||||||
|
@ApiModelProperty(value = "机构Id") |
||||||
|
private Long deptId; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "机构名称") |
||||||
|
private String deptName; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "站点编码") |
||||||
|
private String stationCode; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "地址") |
||||||
|
private String address; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "投运时间") |
||||||
|
@DateTimeFormat(pattern = DateUtil.PATTERN_DATETIME) |
||||||
|
@JsonFormat(pattern = DateUtil.PATTERN_DATETIME) |
||||||
|
private LocalDateTime operationTime; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "总装机容量") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private Double capacity; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "安全运行天数") |
||||||
|
private Integer runDay; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "总发电负荷") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private Double load; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "日发电量") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private Double generateDay; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "月发电量") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private Double generateMon; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "年发电量") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private Double generateYear; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "总发电量") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private Double generate; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "站点实时温度") |
||||||
|
private String temp; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "站点收益") |
||||||
|
private Double income; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "逆变器数量") |
||||||
|
private Integer inverterCount; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "七日内天气") |
||||||
|
private List<Daily> weather; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "发电排行") |
||||||
|
private List<PhotovoltaicDeviceVo> devices; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "年发电量完成百分比") |
||||||
|
private List<PowerYearVo> generateSurvey; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "设备信息") |
||||||
|
private List<PhotovoltaicDeviceChartsVo> charts; |
||||||
|
} |
@ -0,0 +1,67 @@ |
|||||||
|
package com.hnac.hzims.operational.main.vo; |
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.annotation.JsonSerialize; |
||||||
|
import com.fasterxml.jackson.databind.ser.std.NullSerializer; |
||||||
|
import io.swagger.annotations.ApiModel; |
||||||
|
import io.swagger.annotations.ApiModelProperty; |
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
@Data |
||||||
|
@ApiModel(value = "光伏指标数据对象") |
||||||
|
public class PhotovoltaicTargetVo { |
||||||
|
|
||||||
|
@ApiModelProperty(value = "机构Id") |
||||||
|
private Long deptId; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "机构名称") |
||||||
|
private String deptName; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "设备Code") |
||||||
|
private String deviceCode; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "设备名称") |
||||||
|
private String deviceName; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "当日运行时长") |
||||||
|
private Double runHours; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "年发电量: kWh") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private Double generationYear; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "月发电量: kWh") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private Double generationMon; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "节约标准煤:1kwh = 0.0001229吨煤") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private Double tec; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "二氧化碳减排:1kwh = 0.000997吨二氧化碳排放") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private Double co2; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "收益:1kwh = 0.3 ~ 0.425人名币") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private Double income; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "减少森林砍伐:1kwh = 0.000553") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private Double deforest; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "日发电量: kWh") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private Double generationDay; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "昨日发电量: kWh") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private Double generationYesterday; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "当日机组有功功率") |
||||||
|
private List<PhotovoltaicPowerVo> activePowerVoList; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "近30天用电量") |
||||||
|
private List<GenerationPowerVo> generationPowerVoList; |
||||||
|
} |
@ -0,0 +1,87 @@ |
|||||||
|
package com.hnac.hzims.operational.main.vo; |
||||||
|
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.annotation.JsonSerialize; |
||||||
|
import com.fasterxml.jackson.databind.ser.std.NullSerializer; |
||||||
|
import com.hnac.hzims.hzimsweather.response.weather.Daily; |
||||||
|
import io.swagger.annotations.ApiModel; |
||||||
|
import io.swagger.annotations.ApiModelProperty; |
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author ysj |
||||||
|
* @date 2023/03/24 09:58:57 |
||||||
|
* @version 4.0.0 |
||||||
|
*/ |
||||||
|
@Data |
||||||
|
@ApiModel(value = "发电量数据") |
||||||
|
public class SubordinateVo { |
||||||
|
|
||||||
|
@ApiModelProperty(value = "机构ID") |
||||||
|
private Long deptId; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "机构名称") |
||||||
|
private String deptName; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "地市编码") |
||||||
|
private String areaCode; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "地市名称") |
||||||
|
private String areaName; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "光伏站点类型:0-个体光伏站 1-厂房光伏站") |
||||||
|
private Long type; |
||||||
|
|
||||||
|
@ApiModelProperty("经度(东经)") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private Float lgtd; |
||||||
|
|
||||||
|
@ApiModelProperty("纬度(北纬)") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private Float lttd; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "容量") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private Double capacity; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "功率") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private Double load; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "发电量") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private Double generation; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "发电占比") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private Double generationRate; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "容量利用率") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private Double capacityUse; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "电站利用率") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private Double stationUse; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "站点实时温度") |
||||||
|
private String temp; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "七日内天气") |
||||||
|
private List<Daily> weather; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "排序") |
||||||
|
private Integer sort; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "站点数量") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private Long stationCount; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "站点使用数量") |
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||||
|
private Long stationUseCount; |
||||||
|
|
||||||
|
|
||||||
|
} |
@ -1,117 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright 2007-present the original author or authors. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
||||||
* you may not use this file except in compliance with the License. |
|
||||||
* You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* https://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software |
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, |
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
||||||
* See the License for the specific language governing permissions and |
|
||||||
* limitations under the License. |
|
||||||
*/ |
|
||||||
import java.net.*; |
|
||||||
import java.io.*; |
|
||||||
import java.nio.channels.*; |
|
||||||
import java.util.Properties; |
|
||||||
|
|
||||||
public class MavenWrapperDownloader { |
|
||||||
|
|
||||||
private static final String WRAPPER_VERSION = "0.5.6"; |
|
||||||
/** |
|
||||||
* Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. |
|
||||||
*/ |
|
||||||
private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" |
|
||||||
+ WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; |
|
||||||
|
|
||||||
/** |
|
||||||
* Path to the maven-wrapper.properties file, which might contain a downloadUrl property to |
|
||||||
* use instead of the default one. |
|
||||||
*/ |
|
||||||
private static final String MAVEN_WRAPPER_PROPERTIES_PATH = |
|
||||||
".mvn/wrapper/maven-wrapper.properties"; |
|
||||||
|
|
||||||
/** |
|
||||||
* Path where the maven-wrapper.jar will be saved to. |
|
||||||
*/ |
|
||||||
private static final String MAVEN_WRAPPER_JAR_PATH = |
|
||||||
".mvn/wrapper/maven-wrapper.jar"; |
|
||||||
|
|
||||||
/** |
|
||||||
* Name of the property which should be used to override the default download url for the wrapper. |
|
||||||
*/ |
|
||||||
private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; |
|
||||||
|
|
||||||
public static void main(String args[]) { |
|
||||||
System.out.println("- Downloader started"); |
|
||||||
File baseDirectory = new File(args[0]); |
|
||||||
System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); |
|
||||||
|
|
||||||
// If the maven-wrapper.properties exists, read it and check if it contains a custom
|
|
||||||
// wrapperUrl parameter.
|
|
||||||
File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); |
|
||||||
String url = DEFAULT_DOWNLOAD_URL; |
|
||||||
if(mavenWrapperPropertyFile.exists()) { |
|
||||||
FileInputStream mavenWrapperPropertyFileInputStream = null; |
|
||||||
try { |
|
||||||
mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); |
|
||||||
Properties mavenWrapperProperties = new Properties(); |
|
||||||
mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); |
|
||||||
url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); |
|
||||||
} catch (IOException e) { |
|
||||||
System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); |
|
||||||
} finally { |
|
||||||
try { |
|
||||||
if(mavenWrapperPropertyFileInputStream != null) { |
|
||||||
mavenWrapperPropertyFileInputStream.close(); |
|
||||||
} |
|
||||||
} catch (IOException e) { |
|
||||||
// Ignore ...
|
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
System.out.println("- Downloading from: " + url); |
|
||||||
|
|
||||||
File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); |
|
||||||
if(!outputFile.getParentFile().exists()) { |
|
||||||
if(!outputFile.getParentFile().mkdirs()) { |
|
||||||
System.out.println( |
|
||||||
"- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); |
|
||||||
} |
|
||||||
} |
|
||||||
System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); |
|
||||||
try { |
|
||||||
downloadFileFromURL(url, outputFile); |
|
||||||
System.out.println("Done"); |
|
||||||
System.exit(0); |
|
||||||
} catch (Throwable e) { |
|
||||||
System.out.println("- Error downloading"); |
|
||||||
e.printStackTrace(); |
|
||||||
System.exit(1); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
private static void downloadFileFromURL(String urlString, File destination) throws Exception { |
|
||||||
if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { |
|
||||||
String username = System.getenv("MVNW_USERNAME"); |
|
||||||
char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); |
|
||||||
Authenticator.setDefault(new Authenticator() { |
|
||||||
@Override |
|
||||||
protected PasswordAuthentication getPasswordAuthentication() { |
|
||||||
return new PasswordAuthentication(username, password); |
|
||||||
} |
|
||||||
}); |
|
||||||
} |
|
||||||
URL website = new URL(urlString); |
|
||||||
ReadableByteChannel rbc; |
|
||||||
rbc = Channels.newChannel(website.openStream()); |
|
||||||
FileOutputStream fos = new FileOutputStream(destination); |
|
||||||
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); |
|
||||||
fos.close(); |
|
||||||
rbc.close(); |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
Binary file not shown.
@ -1,2 +0,0 @@ |
|||||||
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip |
|
||||||
wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar |
|
@ -0,0 +1,21 @@ |
|||||||
|
package com.hnac.hzims.middle; |
||||||
|
|
||||||
|
import org.mybatis.spring.annotation.MapperScan; |
||||||
|
import org.springblade.core.cloud.feign.EnableBladeFeign; |
||||||
|
import org.springblade.core.launch.BladeApplication; |
||||||
|
import org.springframework.boot.SpringApplication; |
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication; |
||||||
|
import org.springframework.cloud.client.SpringCloudApplication; |
||||||
|
import org.springframework.context.annotation.ComponentScan; |
||||||
|
|
||||||
|
@EnableBladeFeign |
||||||
|
@SpringCloudApplication |
||||||
|
@MapperScan("com.hnac.hzims.*.**.mapper.**") |
||||||
|
@ComponentScan(basePackages = {"com.hnac.*"}) |
||||||
|
public class MiddleApplication { |
||||||
|
|
||||||
|
public static void main(String[] args) { |
||||||
|
BladeApplication.run("hzims-middle", MiddleApplication.class, args); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,104 @@ |
|||||||
|
package com.hnac.hzims.middle.mybatisplus; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.generator.AutoGenerator; |
||||||
|
import com.baomidou.mybatisplus.generator.InjectionConfig; |
||||||
|
import com.baomidou.mybatisplus.generator.config.*; |
||||||
|
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; |
||||||
|
|
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author WL |
||||||
|
* @Version v1.0 |
||||||
|
* @Serial 1.0 |
||||||
|
* @Date 2023/4/4 9:07 |
||||||
|
*/ |
||||||
|
public class CodeGenerator { |
||||||
|
|
||||||
|
|
||||||
|
public static void main(String[] args) { |
||||||
|
// 代码生成器
|
||||||
|
AutoGenerator mpg = new AutoGenerator(); |
||||||
|
|
||||||
|
// 全局配置
|
||||||
|
GlobalConfig gc = new GlobalConfig(); |
||||||
|
String projectPath = System.getProperty("user.dir") + "/hzims-service/hzims-middle"; |
||||||
|
gc.setOutputDir(projectPath + "/src/main/java"); |
||||||
|
gc.setAuthor("dfy"); |
||||||
|
gc.setOpen(false); |
||||||
|
// gc.setSwagger2(true); 实体属性 Swagger2 注解
|
||||||
|
mpg.setGlobalConfig(gc); |
||||||
|
|
||||||
|
// 数据源配置
|
||||||
|
DataSourceConfig dsc = new DataSourceConfig(); |
||||||
|
dsc.setUrl("jdbc:mysql://192.168.1.20:3576/dev_hzims_middle?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&tinyInt1isBit=false&allowMultiQueries=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true"); |
||||||
|
// dsc.setSchemaName("public");
|
||||||
|
dsc.setDriverName("com.mysql.cj.jdbc.Driver"); |
||||||
|
dsc.setUsername("root"); |
||||||
|
dsc.setPassword("123"); |
||||||
|
mpg.setDataSource(dsc); |
||||||
|
|
||||||
|
// 包配置
|
||||||
|
PackageConfig pc = new PackageConfig(); |
||||||
|
pc.setModuleName("systemlog"); |
||||||
|
pc.setParent("com.hnac.hzims.middle"); |
||||||
|
mpg.setPackageInfo(pc); |
||||||
|
|
||||||
|
// 自定义配置
|
||||||
|
InjectionConfig cfg = new InjectionConfig() { |
||||||
|
@Override |
||||||
|
public void initMap() { |
||||||
|
// to do nothing
|
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
// 如果模板引擎是 freemarker
|
||||||
|
String templatePath = "/templates/mapper.xml.ftl"; |
||||||
|
// 如果模板引擎是 velocity
|
||||||
|
// String templatePath = "/templates/mapper.xml.vm";
|
||||||
|
|
||||||
|
// 自定义输出配置
|
||||||
|
List<FileOutConfig> focList = new ArrayList<>(); |
||||||
|
cfg.setFileOutConfigList(focList); |
||||||
|
mpg.setCfg(cfg); |
||||||
|
|
||||||
|
// 配置模板
|
||||||
|
TemplateConfig templateConfig = new TemplateConfig(); |
||||||
|
|
||||||
|
// 配置自定义输出模板
|
||||||
|
//指定自定义模板路径,注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别
|
||||||
|
// templateConfig.setEntity("templates/entity2.java");
|
||||||
|
// templateConfig.setService();
|
||||||
|
// templateConfig.setController();
|
||||||
|
|
||||||
|
// templateConfig.setXml(null);
|
||||||
|
mpg.setTemplate(templateConfig); |
||||||
|
|
||||||
|
// 策略配置
|
||||||
|
StrategyConfig strategy = new StrategyConfig(); |
||||||
|
strategy.setNaming(NamingStrategy.underline_to_camel); |
||||||
|
strategy.setColumnNaming(NamingStrategy.underline_to_camel); |
||||||
|
// strategy.setSuperEntityClass("你自己的父类实体,没有就不用设置!");
|
||||||
|
strategy.setEntityLombokModel(true); |
||||||
|
strategy.setRestControllerStyle(true); |
||||||
|
strategy.setEntityBooleanColumnRemoveIsPrefix(true); |
||||||
|
strategy.setEntityLombokModel(true); |
||||||
|
strategy.setEntitySerialVersionUID(true); |
||||||
|
strategy.setChainModel(true); |
||||||
|
strategy.setEntityTableFieldAnnotationEnable(true); |
||||||
|
// strategy.setFieldPrefix("hzims_");
|
||||||
|
// 公共父类
|
||||||
|
// strategy.setSuperControllerClass("你自己的父类控制器,没有就不用设置!");
|
||||||
|
// 写于父类中的公共字段
|
||||||
|
// strategy.setSuperEntityColumns("id");
|
||||||
|
strategy.setInclude("hzims_sys_log"); |
||||||
|
strategy.setControllerMappingHyphenStyle(true); |
||||||
|
strategy.setTablePrefix("hzims_"); |
||||||
|
mpg.setStrategy(strategy); |
||||||
|
// mpg.setTemplateEngine(new FreemarkerTemplateEngine());
|
||||||
|
mpg.execute(); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
@ -0,0 +1,60 @@ |
|||||||
|
package com.hnac.hzims.middle.systemlog.controller; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
import com.hnac.hzims.common.logs.to.SysLogTo; |
||||||
|
import com.hnac.hzims.middle.systemlog.entity.SysLog; |
||||||
|
import com.hnac.hzims.middle.systemlog.service.SysLogService; |
||||||
|
import io.swagger.annotations.Api; |
||||||
|
import lombok.RequiredArgsConstructor; |
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
import org.springframework.beans.BeanUtils; |
||||||
|
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.RestController; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
import java.util.stream.Collectors; |
||||||
|
|
||||||
|
/** |
||||||
|
* <p> |
||||||
|
* 前端控制器 |
||||||
|
* </p> |
||||||
|
* |
||||||
|
* @author dfy |
||||||
|
* @since 2023-04-04 |
||||||
|
*/ |
||||||
|
@Api(tags = "系统日志") |
||||||
|
@Slf4j |
||||||
|
@RequiredArgsConstructor |
||||||
|
@RestController |
||||||
|
@RequestMapping("/systemlog/sys-log") |
||||||
|
public class SysLogController { |
||||||
|
|
||||||
|
private final SysLogService sysLogService; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 保存操作日志 |
||||||
|
* @param sysLogToList |
||||||
|
*/ |
||||||
|
@PostMapping("/batchSave") |
||||||
|
public void saveBatch(@RequestBody List<SysLogTo> sysLogToList) { |
||||||
|
//数据转换
|
||||||
|
List<SysLog> collect = sysLogToList.stream().map(item -> { |
||||||
|
SysLog sysLog = new SysLog(); |
||||||
|
BeanUtils.copyProperties(item, sysLog); |
||||||
|
return sysLog; |
||||||
|
}).collect(Collectors.toList()); |
||||||
|
//添加到数据库
|
||||||
|
boolean save = sysLogService.saveBatch(collect); |
||||||
|
if (save) { |
||||||
|
log.info("操作日志新增成功 ~~~"); |
||||||
|
return; |
||||||
|
} |
||||||
|
log.info("操作日志新增失败 ~~~"); |
||||||
|
throw new IllegalArgumentException("操作日志新增失败"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
@ -0,0 +1,191 @@ |
|||||||
|
package com.hnac.hzims.middle.systemlog.entity; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName; |
||||||
|
import java.time.LocalDateTime; |
||||||
|
import java.sql.Blob; |
||||||
|
import com.baomidou.mybatisplus.annotation.TableField; |
||||||
|
import java.io.Serializable; |
||||||
|
import lombok.Data; |
||||||
|
import lombok.EqualsAndHashCode; |
||||||
|
import lombok.experimental.Accessors; |
||||||
|
|
||||||
|
/** |
||||||
|
* <p> |
||||||
|
* |
||||||
|
* </p> |
||||||
|
* |
||||||
|
* @author dfy |
||||||
|
* @since 2023-04-04 |
||||||
|
*/ |
||||||
|
@Data |
||||||
|
@EqualsAndHashCode(callSuper = false) |
||||||
|
@Accessors(chain = true) |
||||||
|
@TableName("hzims_sys_log") |
||||||
|
public class SysLog implements Serializable { |
||||||
|
|
||||||
|
private static final long serialVersionUID=1L; |
||||||
|
|
||||||
|
/** |
||||||
|
* 操作日志编号 |
||||||
|
*/ |
||||||
|
@TableField("id") |
||||||
|
private Long id; |
||||||
|
|
||||||
|
/** |
||||||
|
* 租户ID |
||||||
|
*/ |
||||||
|
@TableField("tenant_id") |
||||||
|
private String tenantId; |
||||||
|
|
||||||
|
/** |
||||||
|
* 服务器ip |
||||||
|
*/ |
||||||
|
@TableField("server_ip") |
||||||
|
private String serverIp; |
||||||
|
|
||||||
|
/** |
||||||
|
* 服务器地址 |
||||||
|
*/ |
||||||
|
@TableField("server_host") |
||||||
|
private String serverHost; |
||||||
|
|
||||||
|
/** |
||||||
|
* 服务名称 |
||||||
|
*/ |
||||||
|
@TableField("server_name") |
||||||
|
private String serverName; |
||||||
|
|
||||||
|
/** |
||||||
|
* 环境 |
||||||
|
*/ |
||||||
|
@TableField("env") |
||||||
|
private String env; |
||||||
|
|
||||||
|
/** |
||||||
|
* 操作人Id |
||||||
|
*/ |
||||||
|
@TableField("operation_user_id") |
||||||
|
private Long operationUserId; |
||||||
|
|
||||||
|
/** |
||||||
|
* 操作人名称 |
||||||
|
*/ |
||||||
|
@TableField("operation_user_name") |
||||||
|
private String operationUserName; |
||||||
|
|
||||||
|
/** |
||||||
|
* 请求路径 (操作地址) |
||||||
|
*/ |
||||||
|
@TableField("path") |
||||||
|
private String path; |
||||||
|
|
||||||
|
/** |
||||||
|
* 用户代理 |
||||||
|
*/ |
||||||
|
@TableField("user_agent") |
||||||
|
private String userAgent; |
||||||
|
|
||||||
|
/** |
||||||
|
* 操作方式 |
||||||
|
*/ |
||||||
|
@TableField("method") |
||||||
|
private String method; |
||||||
|
|
||||||
|
/** |
||||||
|
* 方法类 |
||||||
|
*/ |
||||||
|
@TableField("method_class") |
||||||
|
private String methodClass; |
||||||
|
|
||||||
|
/** |
||||||
|
* 方法名 |
||||||
|
*/ |
||||||
|
@TableField("method_name") |
||||||
|
private String methodName; |
||||||
|
|
||||||
|
/** |
||||||
|
* 方法执行时间 消耗时间 毫秒 |
||||||
|
*/ |
||||||
|
@TableField("cost_time") |
||||||
|
private String costTime; |
||||||
|
|
||||||
|
/** |
||||||
|
* 方法入参 |
||||||
|
*/ |
||||||
|
@TableField("parameter") |
||||||
|
private String parameter; |
||||||
|
|
||||||
|
/** |
||||||
|
* 操作方法 |
||||||
|
*/ |
||||||
|
@TableField("title") |
||||||
|
private String title; |
||||||
|
|
||||||
|
/** |
||||||
|
* 方法描述 |
||||||
|
*/ |
||||||
|
@TableField("action") |
||||||
|
private String action; |
||||||
|
|
||||||
|
/** |
||||||
|
* 系统类型 |
||||||
|
*/ |
||||||
|
@TableField("operator_type") |
||||||
|
private String operatorType; |
||||||
|
|
||||||
|
/** |
||||||
|
* 操作人类别 |
||||||
|
*/ |
||||||
|
@TableField("business_type") |
||||||
|
private String businessType; |
||||||
|
|
||||||
|
/** |
||||||
|
* 返回结果 |
||||||
|
*/ |
||||||
|
@TableField("json_result") |
||||||
|
private String jsonResult; |
||||||
|
|
||||||
|
/** |
||||||
|
* 请求的Ip |
||||||
|
*/ |
||||||
|
@TableField("local_ip") |
||||||
|
private String localIp; |
||||||
|
|
||||||
|
/** |
||||||
|
* 错误消息 |
||||||
|
*/ |
||||||
|
@TableField("error_msg") |
||||||
|
private String errorMsg; |
||||||
|
|
||||||
|
/** |
||||||
|
* 操作时间 |
||||||
|
*/ |
||||||
|
@TableField("operation_time") |
||||||
|
private LocalDateTime operationTime; |
||||||
|
|
||||||
|
/** |
||||||
|
* 操作状态(0 正常 1 异常) |
||||||
|
*/ |
||||||
|
@TableField("status") |
||||||
|
private Integer status; |
||||||
|
|
||||||
|
/** |
||||||
|
* 创建时间 |
||||||
|
*/ |
||||||
|
@TableField("create_time") |
||||||
|
private LocalDateTime createTime; |
||||||
|
|
||||||
|
/** |
||||||
|
* 更新时间 |
||||||
|
*/ |
||||||
|
@TableField("update_time") |
||||||
|
private LocalDateTime updateTime; |
||||||
|
|
||||||
|
/** |
||||||
|
* 逻辑删除 (0 可用 1 删除) |
||||||
|
*/ |
||||||
|
@TableField("is_deleted") |
||||||
|
private Integer isDeleted; |
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,16 @@ |
|||||||
|
package com.hnac.hzims.middle.systemlog.mapper; |
||||||
|
|
||||||
|
import com.hnac.hzims.middle.systemlog.entity.SysLog; |
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
||||||
|
|
||||||
|
/** |
||||||
|
* <p> |
||||||
|
* Mapper 接口 |
||||||
|
* </p> |
||||||
|
* |
||||||
|
* @author dfy |
||||||
|
* @since 2023-04-04 |
||||||
|
*/ |
||||||
|
public interface SysLogMapper extends BaseMapper<SysLog> { |
||||||
|
|
||||||
|
} |
@ -0,0 +1,16 @@ |
|||||||
|
package com.hnac.hzims.middle.systemlog.service; |
||||||
|
|
||||||
|
import com.hnac.hzims.middle.systemlog.entity.SysLog; |
||||||
|
import com.baomidou.mybatisplus.extension.service.IService; |
||||||
|
|
||||||
|
/** |
||||||
|
* <p> |
||||||
|
* 服务类 |
||||||
|
* </p> |
||||||
|
* |
||||||
|
* @author dfy |
||||||
|
* @since 2023-04-04 |
||||||
|
*/ |
||||||
|
public interface SysLogService extends IService<SysLog> { |
||||||
|
|
||||||
|
} |
@ -0,0 +1,20 @@ |
|||||||
|
package com.hnac.hzims.middle.systemlog.service.impl; |
||||||
|
|
||||||
|
import com.hnac.hzims.middle.systemlog.entity.SysLog; |
||||||
|
import com.hnac.hzims.middle.systemlog.mapper.SysLogMapper; |
||||||
|
import com.hnac.hzims.middle.systemlog.service.SysLogService; |
||||||
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
||||||
|
import org.springframework.stereotype.Service; |
||||||
|
|
||||||
|
/** |
||||||
|
* <p> |
||||||
|
* 服务实现类 |
||||||
|
* </p> |
||||||
|
* |
||||||
|
* @author dfy |
||||||
|
* @since 2023-04-04 |
||||||
|
*/ |
||||||
|
@Service |
||||||
|
public class SysLogServiceImpl extends ServiceImpl<SysLogMapper, SysLog> implements SysLogService { |
||||||
|
|
||||||
|
} |
@ -0,0 +1,38 @@ |
|||||||
|
#服务器端口 |
||||||
|
server: |
||||||
|
port: 8400 |
||||||
|
|
||||||
|
#数据源配置 |
||||||
|
spring: |
||||||
|
#排除DruidDataSourceAutoConfigure |
||||||
|
autoconfigure: |
||||||
|
exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure |
||||||
|
datasource: |
||||||
|
url: jdbc:mysql://192.168.1.20:3576/dev_hzims_middle?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&tinyInt1isBit=false&allowMultiQueries=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true |
||||||
|
username: root |
||||||
|
password: 123 |
||||||
|
|
||||||
|
|
||||||
|
#mybatis-plus配置 |
||||||
|
mybatis-plus: |
||||||
|
mapper-locations: |
||||||
|
- classpath:com/hnac/hzims/**/mapper/*Mapper.xml |
||||||
|
- classpath:/mapper/*Mapper.xml |
||||||
|
#实体扫描,多个package用逗号或者分号分隔 |
||||||
|
typeAliasesPackage: com.hnac.hzims.**.entity |
||||||
|
|
||||||
|
#swagger扫描路径配置 |
||||||
|
swagger: |
||||||
|
base-packages: |
||||||
|
- org.springbalde |
||||||
|
- com.hnac |
||||||
|
|
||||||
|
blade: |
||||||
|
data-scope: |
||||||
|
enabled: false |
||||||
|
lock: |
||||||
|
enabled: true |
||||||
|
address: redis://192.168.1.20:3577 |
||||||
|
password: 1qaz2WSX@redis |
||||||
|
database: 0 |
||||||
|
ssl: false |
@ -0,0 +1,7 @@ |
|||||||
|
spring: |
||||||
|
cloud: |
||||||
|
nacos: |
||||||
|
discovery: |
||||||
|
server-addr: 175.6.40.67:10042 |
||||||
|
|
||||||
|
|
@ -0,0 +1,5 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||||
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
||||||
|
<mapper namespace="com.hnac.hzims.middle.systemlog.mapper.SysLogMapper"> |
||||||
|
|
||||||
|
</mapper> |
@ -0,0 +1,15 @@ |
|||||||
|
package com.hnac.hzims.middle; |
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test; |
||||||
|
import org.springframework.boot.test.context.SpringBootTest; |
||||||
|
|
||||||
|
@SpringBootTest |
||||||
|
class MiddleApplicationTests { |
||||||
|
|
||||||
|
@Test |
||||||
|
void contextLoads() { |
||||||
|
|
||||||
|
System.out.println("1"); |
||||||
|
} |
||||||
|
|
||||||
|
} |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue