diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..047ea8015e7d2ca149b921d7fc0fa48ff1e33dc3
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,240 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.4.2
+
+
+ com.pms.ocp
+ operation-control-platform
+ 0.0.1-SNAPSHOT
+
+
+ 1.8
+ 2.4.2
+
+ 3.0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2.0.8
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-configuration-processor
+ true
+
+
+ org.springframework.boot
+ spring-boot-starter-jdbc
+
+
+ org.springframework.boot
+ spring-boot-starter-aop
+
+
+ com.baomidou
+ mybatis-plus-boot-starter
+ 3.4.1
+
+
+
+
+ com.github.pagehelper
+ pagehelper-spring-boot-starter
+ 1.2.12
+
+
+ com.alibaba
+ fastjson
+ 1.2.62
+
+
+
+ org.postgresql
+ postgresql
+ 9.4.1212
+
+
+
+ org.projectlombok
+ lombok
+
+
+ org.apache.commons
+ commons-lang3
+ 3.9
+
+
+
+ com.github.xiaoymin
+ knife4j-spring-boot-starter
+ 2.0.9
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.junit.vintage
+ junit-vintage-engine
+
+
+
+
+
+ cn.hutool
+ hutool-all
+ 5.7.16
+
+
+
+ com.google.code.gson
+ gson
+ 2.8.6
+
+
+
+ javax.validation
+ validation-api
+ 2.0.1.Final
+
+
+
+
+ org.apache.poi
+ poi
+ 4.1.1
+
+
+
+ org.apache.poi
+ poi-ooxml
+ 4.1.1
+
+
+
+
+ cn.afterturn
+ easypoi-base
+ 4.3.0
+
+
+ cn.afterturn
+ easypoi-web
+ 4.3.0
+
+
+ cn.afterturn
+ easypoi-annotation
+ 4.3.0
+
+
+
+
+ io.springfox
+ springfox-boot-starter
+ ${swagger.version}
+
+
+ io.swagger
+ swagger-models
+
+
+
+
+
+
+ com.github.xiaoymin
+ knife4j-spring-ui
+ ${knife4j-ui.version}
+
+
+
+
+
+
+ dev
+
+ true
+
+
+ dev
+
+
+
+ uat
+
+ false
+
+
+ uat
+
+
+
+ prod
+
+ false
+
+
+ prod
+
+
+
+
+
+
+
+ ${project.basedir}/src/main/resources
+
+ **/*.*
+
+
+ application-*.properties
+
+ true
+
+
+ ${project.basedir}/src/main/resources
+
+ application-${spring.profiles.active}.properties
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+ ${spring-boot.version}
+
+ com.pms.ocp.StartApp
+
+
+
+
+
diff --git a/src/main/java/com/pms/ocp/OcpApplication.java b/src/main/java/com/pms/ocp/OcpApplication.java
new file mode 100644
index 0000000000000000000000000000000000000000..67db413914f3b53a11f2d33df0a31380c3092cd5
--- /dev/null
+++ b/src/main/java/com/pms/ocp/OcpApplication.java
@@ -0,0 +1,40 @@
+package com.pms.ocp;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
+import org.springframework.context.annotation.Bean;
+import springfox.documentation.oas.annotations.EnableOpenApi;
+
+import java.util.TimeZone;
+
+ /**
+ * @Auther: wangjian
+ * @Date: 2022/2/21 15:48
+ * @Description:启动类
+ */
+
+@SpringBootApplication
+@MapperScan(basePackages = {"com.pms.ocp.mapper"})
+@ConfigurationPropertiesScan
+@EnableOpenApi
+public class OcpApplication {
+ public static void main(String[] args) {
+ TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));
+ SpringApplication.run(OcpApplication.class, args);
+ }
+
+ /**
+ * 注册分页插件
+ */
+ @Bean
+ public MybatisPlusInterceptor mybatisPlusInterceptor() {
+ MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+ interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.POSTGRE_SQL));
+ return interceptor;
+ }
+}
diff --git a/src/main/java/com/pms/ocp/common/aspectj/OperLog.java b/src/main/java/com/pms/ocp/common/aspectj/OperLog.java
new file mode 100644
index 0000000000000000000000000000000000000000..fee4561dbafb30ea8cf4fba4e1e7fdcd38d4bf83
--- /dev/null
+++ b/src/main/java/com/pms/ocp/common/aspectj/OperLog.java
@@ -0,0 +1,30 @@
+package com.pms.ocp.common.aspectj;
+
+import java.lang.annotation.*;
+
+/**
+ * @Auther: wangjian
+ * @Date: 2022/3/8 17:17
+ * @Description:
+ */
+
+@Target(ElementType.METHOD) //target用于标识此注解能标记在方法上还是类上
+@Retention(RetentionPolicy.RUNTIME) //retention用于决定此注解的生命周期
+@Documented
+public @interface OperLog {
+ /**
+ * 日志内容
+ */
+ String value() default "";
+
+ /**
+ * 日志类型(1登录日志,2操作日志)
+ */
+ int auditType() default 2;
+
+ /**
+ * 操作日志类型 1查询2添加3修改4删除
+ */
+ int operStatus() default 0;
+}
+
diff --git a/src/main/java/com/pms/ocp/common/aspectj/OperLogAspect.java b/src/main/java/com/pms/ocp/common/aspectj/OperLogAspect.java
new file mode 100644
index 0000000000000000000000000000000000000000..3e639d2d447ff5f5f9c6b1b501b211f6ea32402e
--- /dev/null
+++ b/src/main/java/com/pms/ocp/common/aspectj/OperLogAspect.java
@@ -0,0 +1,182 @@
+package com.pms.ocp.common.aspectj;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.serializer.PropertyFilter;
+import com.pms.ocp.model.entity.ModelAudit;
+import com.pms.ocp.service.ModelAuditService;
+import org.apache.commons.lang3.StringUtils;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
+import org.springframework.stereotype.Component;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import java.lang.reflect.Method;
+import java.time.LocalDateTime;
+
+/**
+ * @Auther: wangjian
+ * @Date: 2022/3/8 17:21
+ * @Description:
+ */
+
+@Aspect
+@Component
+public class OperLogAspect {
+
+ @Autowired
+ private ModelAuditService modelAuditService;
+
+ private static Logger logger = LoggerFactory.getLogger(OperLogAspect.class);
+
+ @Pointcut("@annotation(com.pms.ocp.common.aspectj.OperLog)")
+ public void logPointCut() {
+ }
+
+ @Around("logPointCut()")
+ public Object around(ProceedingJoinPoint point) throws Throwable {
+ long beginTime = System.currentTimeMillis();
+ System.out.println("日志");
+ //执行方法
+ Object result = point.proceed();
+ //执行时长
+ long time = System.currentTimeMillis() - beginTime;
+
+ //保存日志
+ saveSysLog(point, time, result);
+
+ return result;
+ }
+
+ private void saveSysLog(ProceedingJoinPoint point, long time, Object obj) {
+ MethodSignature signature = (MethodSignature) point.getSignature();
+ Method method = signature.getMethod();
+ ModelAudit modelAudit = new ModelAudit();
+ OperLog operLog = method.getAnnotation(OperLog.class);
+ if (operLog != null) {
+ String content = operLog.value();
+ modelAudit.setAuditType(operLog.auditType());
+ modelAudit.setAuditMessageJson(content);
+ }
+ //请求的方法名
+// String className = point.getTarget().getClass().getName();
+ String methodName = signature.getName();
+// dto.setMethod(className + "." + methodName + "()");
+ //设置操作类型
+ if (modelAudit.getAuditType() == 3) {
+ modelAudit.setOperStatus(getOperateType(methodName, operLog.operStatus()));
+ }
+ //获取request
+ HttpServletRequest request = getHttpServletRequest();
+ //请求的参数
+ modelAudit.setAuditMessageJson(getRequestParams(request, point));
+// //设置ip地址
+// dto.setIp(getIpAddr(request));
+ //获取用户登录信息
+// TODO
+// TUser user = (TUser) SecurityUtils.getSubject().getPrincipal();
+// if (user != null) {
+// modelNote.setUserid(user.getUserName());
+// modelNote.setUsername(user.getPassWord());
+// }
+// modelNote.setCostTime(time);
+ modelAudit.setAuditCtime(LocalDateTime.now());
+
+ modelAuditService.createModelAudit(modelAudit);
+ }
+
+ private int getOperateType(String methodName, int operateType) {
+ if (operateType >= 0) {
+ return operateType;
+ }
+ if (methodName.startsWith("create")) {
+ return 1;
+ }
+ if (methodName.startsWith("update")) {
+ return 2;
+ }
+ return 2;
+ }
+
+ private HttpServletRequest getHttpServletRequest() {
+ return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
+ }
+
+ private String getRequestParams(HttpServletRequest request, JoinPoint joinPoint) {
+ String httpMethod = request.getMethod();
+ String param = "";
+ if ("POST".equals(httpMethod) || "PUT".equals(httpMethod) || "PATCH".equals(httpMethod)) {
+ Object[] paramArray = joinPoint.getArgs();
+ Object[] arguments = new Object[paramArray.length];
+ for (int i = 0; i < paramArray.length; i++) {
+ if (paramArray[i] instanceof BindingResult || paramArray[i] instanceof ServletRequest || paramArray[i] instanceof ServletResponse || paramArray[i] instanceof MultipartFile) {
+ continue;
+ }
+ arguments[i] = paramArray[i];
+ }
+ PropertyFilter propertyFilter = new PropertyFilter() {
+ @Override
+ public boolean apply(Object object, String name, Object value) {
+ if (value != null && value.toString().length() > 500) {
+ return false;
+ }
+ return true;
+ }
+ };
+ param = JSONObject.toJSONString(arguments, propertyFilter);
+ } else {
+ MethodSignature signature = (MethodSignature) joinPoint.getSignature();
+ Method method = signature.getMethod();
+ //请求的方法参数值
+ Object[] args = joinPoint.getArgs();
+ //请求的方法名称
+ LocalVariableTableParameterNameDiscoverer u = new LocalVariableTableParameterNameDiscoverer();
+ String[] parameterNames = u.getParameterNames(method);
+ if (args != null && parameterNames != null) {
+ for (int i = 0; i < args.length; i++) {
+ param += " " + parameterNames[i] + ": " + args[i];
+ }
+ }
+ }
+ return param;
+ }
+
+ public String getIpAddr(HttpServletRequest request) {
+ String ip = null;
+ try {
+ ip = request.getHeader("x-forwarded-for");
+ if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
+ ip = request.getHeader("Proxy-Client-IP");
+ }
+ if (StringUtils.isEmpty(ip) || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+ ip = request.getHeader("WL-Proxy-Client-IP");
+ }
+ if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
+ ip = request.getHeader("HTTP_CLIENT-IP");
+ }
+ if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
+ ip = request.getHeader("HTTP_X-FORWARDED-FOR");
+ }
+ if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
+ ip = request.getRemoteAddr();
+ }
+ } catch (Exception e) {
+ logger.error("IP error", e);
+ }
+ return ip;
+ }
+}
+
diff --git a/src/main/java/com/pms/ocp/common/component/ApplicationContextUtil.java b/src/main/java/com/pms/ocp/common/component/ApplicationContextUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..05305c85b388f4f318f222a336e465bb1399a0eb
--- /dev/null
+++ b/src/main/java/com/pms/ocp/common/component/ApplicationContextUtil.java
@@ -0,0 +1,26 @@
+package com.pms.ocp.common.component;
+
+import org.springframework.beans.BeansException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.stereotype.Component;
+
+/**
+ * Bean 工具类
+ *
+ * @author wuwanli
+ */
+@Component
+public class ApplicationContextUtil implements ApplicationContextAware {
+
+ private static ApplicationContext applicationContext;
+
+ @Override
+ public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+ ApplicationContextUtil.applicationContext = applicationContext;
+ }
+
+ public static T getBean(Class clazz) throws BeansException {
+ return applicationContext.getBean(clazz);
+ }
+}
diff --git a/src/main/java/com/pms/ocp/common/component/LogbackFilter.java b/src/main/java/com/pms/ocp/common/component/LogbackFilter.java
new file mode 100644
index 0000000000000000000000000000000000000000..06d63d07e85b9bd2d06599036964130ebb91f768
--- /dev/null
+++ b/src/main/java/com/pms/ocp/common/component/LogbackFilter.java
@@ -0,0 +1,57 @@
+package com.pms.ocp.common.component;
+
+import java.io.IOException;
+import java.util.UUID;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+
+import org.slf4j.MDC;
+
+/**
+ * 日志统一增加traceId
+ *
+ * @author wuwanli
+ * @version 1.0
+ * @date 2021/8/6
+ */
+public class LogbackFilter implements Filter {
+
+ private static final String TRACE_ID = "traceId";
+ @Override
+ public void init(FilterConfig filterConfig) throws ServletException {
+ Filter.super.init(filterConfig);
+ }
+
+ @Override
+ public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
+ throws IOException, ServletException {
+ boolean result = this.insertMdc();
+ try {
+ filterChain.doFilter(servletRequest, servletResponse);
+ } finally {
+ if (result) {
+ MDC.remove(TRACE_ID);
+ }
+ }
+ }
+
+ private boolean insertMdc() {
+ try {
+ UUID uuid = UUID.randomUUID();
+ String uniqueId = uuid.toString().replace("-", "");
+ MDC.put(TRACE_ID, uniqueId);
+ return true;
+ } catch (Exception exception) {
+ return false;
+ }
+ }
+ @Override
+ public void destroy() {
+ Filter.super.destroy();
+ }
+}
diff --git a/src/main/java/com/pms/ocp/common/config/FilterConfig.java b/src/main/java/com/pms/ocp/common/config/FilterConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..bfee5337c2b304196a4ce7cc4c07edfed2009b9e
--- /dev/null
+++ b/src/main/java/com/pms/ocp/common/config/FilterConfig.java
@@ -0,0 +1,25 @@
+package com.pms.ocp.common.config;
+
+import com.pms.ocp.common.component.LogbackFilter;
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.Ordered;
+
+/**
+ * 过滤器配置类
+ *
+ * @author wuwanli
+ * @version 1.0
+ * @date 2021/8/4
+ */
+@Configuration
+public class FilterConfig {
+ @Bean
+ public FilterRegistrationBean getLogbackFilter() {
+ FilterRegistrationBean logbackFilter = new FilterRegistrationBean<>(new LogbackFilter());
+ logbackFilter.addUrlPatterns("/*");
+ logbackFilter.setOrder(Ordered.HIGHEST_PRECEDENCE);
+ return logbackFilter;
+ }
+}
diff --git a/src/main/java/com/pms/ocp/common/config/PageParam.java b/src/main/java/com/pms/ocp/common/config/PageParam.java
new file mode 100644
index 0000000000000000000000000000000000000000..3681cbf8f9d161a722588db04d1d9565b421473b
--- /dev/null
+++ b/src/main/java/com/pms/ocp/common/config/PageParam.java
@@ -0,0 +1,53 @@
+package com.pms.ocp.common.config;
+
+import lombok.Data;
+
+/**
+ * @Auther: wangjian
+ * @Date: 2022/1/13 18:51
+ * @Description:
+ */
+
+@Data
+public class PageParam {
+
+ private String name;
+
+ private String type;
+
+ private int pageNum;
+
+ private int pageSize;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public int getPageNum() {
+ return pageNum;
+ }
+
+ public void setPageNum(int pageNum) {
+ this.pageNum = pageNum;
+ }
+
+ public int getPageSize() {
+ return pageSize;
+ }
+
+ public void setPageSize(int pageSize) {
+ this.pageSize = pageSize;
+ }
+}
diff --git a/src/main/java/com/pms/ocp/common/config/SwaggerConfig.java b/src/main/java/com/pms/ocp/common/config/SwaggerConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..b47e7a5da44ef3fd67c5a543b3a2c87eb3278b3e
--- /dev/null
+++ b/src/main/java/com/pms/ocp/common/config/SwaggerConfig.java
@@ -0,0 +1,69 @@
+package com.pms.ocp.common.config;
+
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.service.Contact;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+
+/**
+ * @Auther: wangjian
+ * @Date: 2022/2/23 16:24
+ * @Description:
+ */
+
+@Configuration
+public class SwaggerConfig {
+
+ /**
+ * 是否开启swagger
+ */
+ @Value("${swagger.enabled}")
+ private boolean enabled;
+
+ /**
+ * 创建API
+ */
+ @Bean
+ public Docket api() {
+ return new Docket(DocumentationType.OAS_30)
+ //是否開啓Swagger
+ .enable(enabled)
+ // 用来创建该API的基本信息,展示在文档的页面中(自定义展示的信息)
+ .apiInfo(apiInfo())
+ //分组名称
+ .groupName("运营管控平台-模型应用服务库管理1.0版本")
+ // 设置哪些接口暴露给Swagger展示
+ .select()
+ // 扫描所有有注解的api,用这种方式更灵活
+ .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
+ // 扫描指定包中的swagger注解
+ .apis(RequestHandlerSelectors.basePackage("com.pms.ocp"))
+ // 扫描所有 .apis(RequestHandlerSelectors.any())
+ .paths(PathSelectors.any())
+ .build();
+ }
+
+ /**
+ * 添加摘要信息
+ */
+ private ApiInfo apiInfo() {
+ // 用ApiInfoBuilder进行定制
+ return new ApiInfoBuilder()
+ // 设置标题
+ .title("运营管控平台_接口文档")
+ // 描述
+ .description("关于模型库、应用库、服务库各管理接口文档")
+ // 作者信息
+ .contact(new Contact("", "", ""))
+ // 版本
+ .version("版本号: 1.0")
+ .build();
+ }
+}
diff --git a/src/main/java/com/pms/ocp/common/constants/AnalysisConstant.java b/src/main/java/com/pms/ocp/common/constants/AnalysisConstant.java
new file mode 100644
index 0000000000000000000000000000000000000000..241353cafab301b0a79b8268cbe6446216357c5e
--- /dev/null
+++ b/src/main/java/com/pms/ocp/common/constants/AnalysisConstant.java
@@ -0,0 +1,14 @@
+package com.pms.ocp.common.constants;
+
+public interface AnalysisConstant {
+ interface exportOcpApiAuditName{
+ String OCPAPIAUDIT = "服务大事记.xls";
+ String OCPAPIAUDITNAME = "服务大事记导出数据";
+
+ }
+
+ interface exportOcpTenantApiName{
+ String OCPTENANTAPI = "应用大事记.xls";
+ String OCPTENANTAPINAME = "应用大事记导出数据";
+ }
+}
diff --git a/src/main/java/com/pms/ocp/common/constants/ChooseDateType.java b/src/main/java/com/pms/ocp/common/constants/ChooseDateType.java
new file mode 100644
index 0000000000000000000000000000000000000000..a3a567f484e4cf39782b71da81d235f0b3ffe9d2
--- /dev/null
+++ b/src/main/java/com/pms/ocp/common/constants/ChooseDateType.java
@@ -0,0 +1,32 @@
+package com.pms.ocp.common.constants;
+
+public enum ChooseDateType {
+ ONE_WEEK(1, "最近一周"),
+ ONE_MONTH(2, "最近一个月"),
+ THREE_MONTHS(3, "最近三个月");
+ private Integer code;
+ private String desc;
+
+ ChooseDateType(Integer code, String desc) {
+ this.code = code;
+ this.desc = desc;
+ }
+
+ public Integer getCode() {
+ return code;
+ }
+
+ public String getDesc() {
+ return desc;
+ }
+
+ public static ChooseDateType getChooseDateType(Integer code) {
+ ChooseDateType[] values = ChooseDateType.values();
+ for (ChooseDateType c : values) {
+ if (c.getCode().equals(code)) {
+ return c;
+ }
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/com/pms/ocp/common/constants/CodeEnum.java b/src/main/java/com/pms/ocp/common/constants/CodeEnum.java
new file mode 100644
index 0000000000000000000000000000000000000000..0b4e57cbd50ba35c5339ad3e82bbf35a9927853f
--- /dev/null
+++ b/src/main/java/com/pms/ocp/common/constants/CodeEnum.java
@@ -0,0 +1,68 @@
+package com.pms.ocp.common.constants;
+
+import lombok.Getter;
+
+/**
+ * @author wuwanli
+ * @version 1.0
+ * @date 2021/8/4
+ */
+public enum CodeEnum {
+ /**
+ * 处理成功
+ */
+ SUCCESS("200", "处理成功", true),
+ /**
+ * 必填参数为空
+ */
+ REQUIRED_PARAMETER_EMPTY("0", "必填参数为空", false),
+ /**
+ * 参数类型错误
+ */
+ PARAMETER_TYPE_ERROR("0", "Parameter type error", false),
+ /**
+ * 未登录
+ */
+ NOT_LOGIN("401001", "用户未登录", false),
+ /**
+ * 用户名或密码错误
+ */
+ LOGIN_FAIL("401002", "用户名或密码错误", false),
+ /**
+ * 无权限访问
+ */
+ NO_PERMISSION("401003", "无权限访问", false),
+ /**
+ * 系统异常
+ */
+ UNKNOWN("9999", "System abnormal", false),
+ /**
+ * 数据异常
+ */
+ NO_DATA("200", "数据库无数据", false),
+ UP_DATA_FAIL("401005", "更新失败", false),
+ INSERT_FAIL("401006", "插入数据失败", false),
+ DELETE_FAIL("401007", "修改失败", false),
+ DATA_REPETITION("250", "分类编码或分类名称重复", false);
+
+ /**
+ * 构造函数
+ *
+ * @param code 响应码
+ * @param desc 响应描述
+ */
+ CodeEnum(String code, String desc, boolean success) {
+ this.code = code;
+ this.desc = desc;
+ this.success = success;
+ }
+
+ @Getter
+ private final String code;
+
+ @Getter
+ private final String desc;
+ @Getter
+ private final boolean success;
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/pms/ocp/common/constants/Constant.java b/src/main/java/com/pms/ocp/common/constants/Constant.java
new file mode 100644
index 0000000000000000000000000000000000000000..bb7e04629bede871d1d8b321ff6c01818750f737
--- /dev/null
+++ b/src/main/java/com/pms/ocp/common/constants/Constant.java
@@ -0,0 +1,730 @@
+package com.pms.ocp.common.constants;
+
+import java.math.BigDecimal;
+
+public interface Constant {
+
+ /**
+ * 系统参数
+ */
+ interface SYSTEM {
+ /**
+ * 系统名称
+ */
+ String NAME = "全口径房地资源管理系统";
+ }
+
+ /**
+ * 异常类常量值
+ */
+ interface Exception {
+ String ERRORSQL = "Error SQL";
+
+ /**
+ * 巡店接口返回
+ */
+ String ERROR = "error";
+ }
+
+ /**
+ * excel 参数
+ */
+ interface ExcelConfig {
+ /**
+ * excel缓存
+ */
+ String EXCEL_KEY_PREFIX = "excel:cache:%s";
+ }
+
+
+ /**
+ * 常用列名
+ */
+ interface ColumnName {
+ String IS_DEL = "is_del";
+ }
+
+
+ /**
+ * 返回结果 success:成功,fail:业务返回的失败,error:非业务异常失败
+ */
+ interface ReqResult {
+ /**
+ * 成功
+ */
+ String SUCCESS = "success";
+ /**
+ * 失败
+ */
+ String FAIL = "fail";
+ /**
+ * 异常
+ */
+ String ERROR = "error";
+ }
+
+ /**
+ * 常用数值
+ */
+ interface Number {
+ Integer MINUS_ZERO = -1;
+ Integer TWENTY = 20;
+ Integer THIRTY = 30;
+ Integer ZERO = 0;
+ Integer ONE = 1;
+ Integer TWO = 2;
+ Integer THREE = 3;
+ Integer FOUR = 4;
+ Integer FIVE = 5;
+ Integer SIX = 6;
+ Integer SEVEN = 7;
+ Integer EIGHT = 8;
+ Integer NINE = 9;
+ Integer TEN = 10;
+ Integer TWENTYFOUR = 24;
+ Integer TWENTYFIVE = 25;
+ Integer TWENTYSIX = 26;
+ Integer THIRTYTWO = 32;
+ Integer THIRTYTHREE = 33;
+ Integer THIRTYFOUR = 34;
+ Integer THIRTYSIX = 36;
+ Integer FOURTY = 40;
+ Integer FORTYTWO = 42;
+ Integer LENGTH = 3;
+ Integer NINETYNINE = 99;
+ Integer ONEHUNDRED = 100;
+ Integer ONETHOUSAND = 1000;
+ Integer TENTHOUSAND = 10000;
+ Integer TENMILLION = 10000000;
+ Integer ELEVEN = 11;
+ Long ZEROL = 0L;
+ Long ONEL = 1L;
+ Long COMPANY = 2L;
+ Long BUSINESS = 3L;
+ Long ONETHOUSANDL = 1000L;
+ Byte ONEB = 1;
+ Byte TWOB = 2;
+ Byte THREEB = 3;
+ Byte ANTI_INITLIZED = 0;
+ Byte INITLIZED = 1;
+ Double ZBXS = 0.01;
+ BigDecimal ZEROB = new BigDecimal(0);
+ BigDecimal ONEHUNDREDB = new BigDecimal(100);
+ BigDecimal TENTHOUSANDB = new BigDecimal(10000);
+ }
+
+ /**
+ * 当前环境 dev:开发, test:测试, prod:生产
+ */
+ interface ProfileActive {
+ /**
+ * 开发环境
+ */
+ String DEV = "dev";
+ /**
+ * 测试环境
+ */
+ String TEST = "test";
+ /**
+ * 私人测试文件
+ */
+ String TEST_ONE ="test1";
+ /**
+ * 生产环境
+ */
+ String PROD = "prod";
+ /**
+ * 联调环境
+ */
+ String LIANTIAO = "liantiao";
+ /**
+ * 本机
+ */
+ String HOST = "host";
+ /**
+ * 南瑞部门提测
+ */
+ String TESTNARI = "testnari";
+ }
+
+ /**
+ * Service缓存value
+ */
+ interface RedisCache {
+ /**
+ * Redis key 分隔符(@Cacheable自动生成的分隔符)
+ */
+ String redisSeparator = "::";
+ /**
+ * 设置累计访问redis key
+ */
+ String CUMULATIVE_NUMBER = "cumulativeNumber";
+
+ /**
+ * 在线人数
+ */
+ String ONLINE_NUMBER= "onlineNumber";
+ }
+
+ /**
+ * 系统配置
+ */
+ interface SysConfig {
+ /**
+ * 同步锁自动超时时间(单位:秒)
+ */
+ long REDIS_LOCK_TIMEOUT = 20;
+ /**
+ * 凭证操作同步锁自动释放时间(单位:秒)
+ */
+ long VOUCHER_LOCK_TIMEOUT = 60;
+ /**
+ * 结账操作锁自动释放时间(单位:秒)
+ **/
+ long SETTLE_ACCOUNT_LOCK_TIMEOUT = 60 * 20;
+ /**
+ * 结账后是否允许修改现金流量
+ **/
+ byte SETTLE_ALLOW_EDIT_CASH_FLOW = 1;
+ /**
+ * 记录超时接口阈值
+ **/
+ long LONG_TIME_THRESHOLD = 1000;
+ /**
+ * 预警耗时日志打印
+ **/
+ String LONG_OUT_TIME_LOG = "接口预警:接口:{} 耗时:{}毫秒";
+ /**
+ * 预警耗时日志打印
+ **/
+ String LONG_TIME_LOG = "接口耗时:接口:{} 耗时:{}毫秒";
+ }
+
+
+ /**
+ * 常用字符
+ */
+ interface Character {
+ String ENTITY = "'entity";
+ String TXT = ".txt";
+ String BRACKETS = "(";
+ String GROUP_CODE = "0000";
+ String QUESTION = "?";
+ String EQUALS = "=";
+ String AND = "&";
+ String COLON = ":";
+ String ASTERISK = "*";
+ String POINT = ".";
+ String COMMA = ",";
+ String BRACKET_LEFT_B = "{";
+ String BRACKET_RIGHT_B = "}";
+ String ZERO = "00";
+ String ONE = "001";
+ String String_ZERO = "0";
+ String String_ZEROB = "0.00";
+ String NULL_VALUE = "";
+ String UNDER_LINE = "_";
+ String MIDDLE_LINE = "-";
+ String MIDDLE_WAVE = "~";
+ String VIRGULE = "/";
+ Byte FAIL = 0;
+ Byte SUCCESS = 1;
+ Byte IS_REFERENCE = 2;
+ String Percent = "%";
+ String UTF8 = "utf-8";
+ String HASH_SIGN = "#";
+ String COMMA_SINGLE_QUOTE_SEPERATOR = "','";
+ String DOUBLE_COMMA = ",,";
+ String ON = "ON";
+ String OFF = "OFF";
+ String TIP_FLAG = "tipFlag";
+ String ALIAS_R = "r";
+ String ZEROZRRO = "0.00";
+ String AllCOUNT = "AllCount";
+ String FILE = "class";
+ String STRINGONE = "1";
+ String STRINGTWO = "2";
+ String STRINGTHREE = "3";
+ String STRINGFOUR = "4";
+ String STRINGFIVE = "5";
+ String land = "land";
+ String build = "build";
+ String NO = "否";
+ String YES = "是";
+ String NOHAVA = "无";
+ String GB2312 = "gb2312";
+ String text2312 = "text/plain;charset=gb2312";
+ String QUERYAFTERMODIFICATION= "QueryAfterModification";
+ String APPLICATION_PATH_IN_NACOS= "applicationPathInNacos";
+ String IP_VERIFY = "^((25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]?\\d)\\.){3}(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]?\\d)$";
+ String COMPUTER_NAME = "COMPUTERNAME";
+ String DIMENSIONENTITY_PATH = "com.sgcc.nari.common.entity.requestEntity.DimensionEntity";
+ String RETURNVALUE = "returnValue";
+ String PARAMETER_VALUE = "parameterValue";
+
+ }
+
+
+ /**
+ * 是否
+ */
+ interface Is {
+ Byte YES = 1;
+ Byte NO = 0;
+ Integer NO_INT = 0;
+ Integer YES_INT = 1;
+ }
+
+ /**
+ * FTP
+ */
+ interface ftpCode {
+ /**
+ * word后缀
+ */
+ String FORMATSUFFIX = ".docx";
+ /**
+ * 报告前缀名称
+ */
+ String REPORTNAME = "全口径房地资源报告";
+ /**
+ * 报告前缀名称
+ */
+ String REPORTSHORTNAME = "realLandResourceReport";
+ /**
+ * 模板地址
+ */
+ String MOULDPATH = "mouldPath";
+ /**
+ * 模板名称
+ */
+ String MOULDNAME = "mouldName";
+ /**
+ * 简称
+ */
+ String SHORTNAME = "shortName";
+ }
+
+ /**
+ * 正则表达式常量
+ */
+ interface RegExp {
+ /**
+ * 括号,包括大括号和小括号
+ */
+ String BRACKETS = "\\{|\\}|\\(|\\)";
+ /**
+ * 不可见字符
+ */
+ String INVISIBLE = "\\s";
+ /**
+ * 运算符 加减乘除
+ */
+ String OPERATOR = "\\+|\\-|\\*|\\/";
+ /**
+ * 数字,包括整形和浮点型
+ */
+ String NUMBER = "'(\\d|\\.)+'";
+ /**
+ * 逗号开头或结尾
+ */
+ String COMMA_START_OR_END = "^,|,$";
+ /**
+ * 井号左括号
+ */
+ String HASH_SIGN_BRACKET_LEFT = "#\\{";
+ /**
+ * 右括号
+ */
+ String BRACKET_RIGHT = "\\}";
+ /**
+ * #{内容},占位符内容
+ */
+ String PLACE_HOLDER_CONTENT = "#\\{([^}])*\\}";
+ /**
+ * #{参数map.
+ */
+ String PLACE_HOLDER_PARAM_MAP = "#\\{paramMap.";
+ /**
+ * 井号或者大括号
+ */
+ String HASH_SIGN_BRACKETS = "#|\\{|\\}";
+ /**
+ * 空请求体
+ */
+ String EMPTY_REQUEST_BODY = "\\{\\s+\\}";
+ }
+
+ /**
+ * 中文转换
+ */
+ interface STRINGNAME {
+ /**
+ * 全部
+ */
+ String ALL = "全部";
+ }
+
+ /**
+ * 登陆参数
+ */
+ interface LOGUSED {
+ /**
+ * 操作系统名称
+ */
+ String OPERATING_SYSTEM = "os.name";
+ /**
+ * 操作系统架构
+ */
+ String OPERATING_SYSTEM_FRAMEWORK = "os.arch";
+ /**
+ * 登陆token标识
+ */
+ String AUTHORIZATION = "authorization";
+
+ /**
+ * ticket
+ */
+ String TICKET = "ticket";
+
+ /**
+ * token
+ */
+ String TOKEN = "token";
+ }
+
+ /**
+ * 加密用
+ */
+ interface cipher {
+ /**
+ * 前台sm2加密key
+ */
+ String DECRYPT = "encryptData";
+ }
+
+
+ /**
+ * 所属分类
+ */
+ interface Category {
+ /**
+ * 规划用途
+ */
+ String PLANPURPOSE = "规划用途";
+
+ /**
+ * 土地性质
+ */
+
+ String LANDCHARACTER = "土地性质";
+ /**
+ * 土地使用权类型
+ */
+ String LANDUSETYPECODE = "土地使用权类型";
+
+ /**
+ * 行政区域
+ */
+ String ORGANIZATION = "行政区域";
+
+ /**
+ * 来源
+ */
+ String SOURCE = "来源";
+
+ /**
+ * 投资来源
+ */
+ String INVESTRESOURCE = "投资来源";
+
+
+ /**
+ * 房产分类
+ */
+ String BUILDTYPE = "房产分类";
+
+ /**
+ * 无证原因
+ */
+ String NOLICENSEREASON = "无证原因";
+
+ /**
+ * 单位级别
+ */
+ String UNITLEVELCODE = "单位级别";
+
+ /**
+ * 业务类型
+ */
+ String BUSINESSTYPE = "业务类型";
+ }
+
+ /**
+ * 单位级别
+ */
+ interface unitLevelCode {
+ //总部
+ String HEADQUARTERS_LEVEL = "1";
+
+ //分部
+ String SUBSECTION_LEVEL = "2";
+
+ //省
+ String PROVINCE_LEVEL = "3";
+
+ //市
+ String CITY_LEVEL = "4";
+
+ //县
+ String COUNTY_LEVEL = "5";
+
+ }
+
+ /**
+ * 请求方式
+ */
+ interface METHOD {
+ //REQUEST
+ String GET = "GET";
+ //POST
+ String POST = "POST";
+ }
+
+ /**
+ * 字段类型
+ */
+ interface CATEGORYTYPE {
+ /**
+ * 土地规划用途
+ */
+ String PLANPURPOSE = "规划用途";
+
+ /**
+ * 土地性质
+ */
+ String LANDCHARACTER = "土地性质";
+
+ /**
+ * 土地使用权类型
+ */
+ String LANDUSETYPE = "土地使用权类型";
+
+ /**
+ * 无证原因
+ */
+ String NOLICENSEREASON = "无证原因";
+
+ /**
+ * 来源
+ */
+ String SOURCE = "来源";
+
+ /**
+ * 投资来源
+ */
+ String INVESTSOURCE = "投资来源";
+
+ /**
+ * 房产分类
+ */
+ String REALESTATETYPE = "房产分类";
+
+ /**
+ * 行政区域
+ */
+ String AREA = "行政区域";
+ }
+
+ /**
+ * 日志操作类型
+ */
+ interface LOGHANDLETYPE {
+
+ /**
+ * 查看
+ */
+ String SELECT = "查看";
+
+ /**
+ * 添加
+ */
+ String INSERT = "新增";
+
+ /**
+ * 删除
+ */
+ String DELETE = "删除";
+
+ /**
+ * 修改
+ */
+ String UPDATE = "修改";
+ }
+
+ /**
+ * 图片上传下载
+ */
+ interface pictureConstant {
+ /**
+ * 排序
+ */
+ String SORT = "[^0-9]";
+ /**
+ * "redisKey",
+ */
+ String REDISKEY = "redisKey";
+ /**
+ * line.separator
+ */
+ String LINE_SEPARATOR= "line.separator";
+ /**
+ * 校验图片格式正则
+ */
+
+ String PICTURE_FORMAT = "^(.+?)\\.(png|jpg|gif|jpeg|bmp|PNG|JPG|GIF|JPEG|BMP)$";
+ /**
+ * 正则
+ */
+ String PICREGEX = ".*[`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?\\\\]+.*";
+ /**
+ * JPG
+ */
+ String JPG = "JPG";
+ /**
+ * JEPG
+ */
+ String JPEG = "JPEG";
+ /**
+ * PNG
+ */
+ String PNG = "PNG";
+ /**
+ * GIF
+ */
+ String GIF = "GIF";
+ /**
+ * BMP
+ */
+ String BMP = "BMP";
+ /**
+ * 行号
+ */
+ String LINENUMBER = "行号:";
+ String HP = "http://";
+
+ }
+
+ /**
+ * 日志监控参数
+ */
+ interface MONITOR {
+ /**
+ * 审计人员角色
+ */
+ String AUDITROLE = "审计人员";
+
+ /**
+ * 审计日志
+ */
+ String AUDITLOG = "审计日志";
+
+ /**
+ * 系统维护
+ */
+ String SYSTEMMAINTAIN = "系统维护人员";
+
+ /**
+ * 系统服务
+ */
+ String SYSTEMSERVICE = "系统服务";
+
+ /**
+ * 系统告警
+ */
+ String SYSTEMWARNING = "系统告警";
+ }
+
+ /**
+ * 消息类型
+ */
+ interface NOTIFICATION_MESSAGE_TYPE {
+ /**
+ * PC
+ */
+ int PC = Number.ZERO;
+
+ /**
+ * 邮件
+ */
+ int MAIL = Number.ONE;
+
+ /**
+ * 短信
+ */
+ int TEXT_MESSAGE = Number.TWO;
+
+ /**
+ * 微信
+ */
+ int WECHAT = Number.THREE;
+
+ /**
+ * 其它
+ */
+ int OTHER = Number.FOUR;
+ }
+
+ /**
+ * 消息类型
+ */
+ interface NOTIFICATION_BUSINESS_TYPE {
+ /**
+ * 消息
+ */
+ int MESSAGE = 1;
+
+ /**
+ * 告警
+ */
+ int WARNING = 2;
+ }
+
+ /**
+ * 告警标题
+ */
+ interface WARNING_HEAD {
+ /**
+ * 日志容量告警
+ */
+ String AUDIT_SIZE_WARNING_HEAD = "日志容量告警";
+
+ /**
+ * 审计日志
+ */
+ String TABLE_NAME = "审计日志";
+
+ }
+
+ /**
+ * 告警内容
+ */
+ interface WARNING_CONTENT {
+ /**
+ * 日志容量告警
+ */
+ String AUDIT_SIZE_WARNING_CONTENT = "当前日志容量已经超过监控阈值,监控阈值为 %s MB,当前实际产生容量为 %s MB,请尽快处理!";
+ }
+
+ /**
+ * ISC邮件信息配置
+ */
+ interface ISCEMAIL {
+ /**
+ * ISC邮件信息配置
+ */
+ String SENDEMAIL = "qkjfdzyxt@isc.com";
+ }
+
+
+}
diff --git a/src/main/java/com/pms/ocp/common/constants/ExportUtils.java b/src/main/java/com/pms/ocp/common/constants/ExportUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..c3a016d46cf84993ff5efff6a033d4c29daa6bcc
--- /dev/null
+++ b/src/main/java/com/pms/ocp/common/constants/ExportUtils.java
@@ -0,0 +1,149 @@
+package com.pms.ocp.common.constants;
+
+
+import com.pms.ocp.common.exception.ServiceException;
+import org.apache.poi.ss.usermodel.Workbook;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.util.Locale;
+import java.util.regex.Pattern;
+
+public class ExportUtils {
+
+ /**
+ * 校验Header Manipulation
+ * @param header 参数
+ * @return 数据
+ */
+ public static String headerManipulation(String header) {
+ if(StringUtils.isNullOrEmpty(header)){
+ return header;
+ }
+ String regex = "[`~!@#$%^&*()\\+\\=\\{}|:\"?><【】\\/r\\/n]";
+ Pattern pattern = Pattern.compile(regex);
+ pattern.matcher(header).replaceAll("").trim();
+ return header;
+ }
+
+ /**
+ * 流导出文件至浏览器
+ *
+ * @param response
+ * @param in
+ * @param fileName
+ */
+ public static void exportWorld(HttpServletResponse response, InputStream in, String fileName) {
+ OutputStream out = null;
+ try {
+ response.reset();
+ String fileHeaderName = URLEncoder.encode(fileName, Constant.Character.UTF8);
+ response.setHeader("Content-Disposition", "attachment;filename=" + headerManipulation(fileHeaderName));
+ response.setContentType("application/msword;charset=UTF-8");
+ response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
+ response.setHeader("Access-Control-Allow-Origin", "*");
+ out = response.getOutputStream();
+ //定义缓存
+ byte[] buffer = new byte[1024];
+ int i;
+ while ((i = in.read(buffer)) != Constant.Number.MINUS_ZERO) {
+ out.write(buffer, Constant.Number.ZERO, i);
+ }
+ out.flush();
+ } catch (IOException e) {
+ e.printStackTrace();
+ throw new ServiceException(com.pms.ocp.common.constants.ResultCode.INTERNAL_SERVER_ERROR);
+ } finally {
+ if (out != null){
+ try {
+ out.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ ;
+ }
+ if (in != null) {
+ try {
+ in.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+
+ /**
+ * Workbook导出浏览器
+ * 文件导出添加跨域 Access-Control-Allow-Origin
+ * @param response
+ * @param fileName
+ * @param workbook
+ */
+ public static void exportExcel(HttpServletResponse response, String fileName, Workbook workbook) {
+ try {
+ response.reset();
+ String fileHeaderName = URLEncoder.encode(fileName, Constant.Character.UTF8);
+ response.setHeader("Content-Disposition", "attachment;filename=" + headerManipulation(fileHeaderName));
+ response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
+ response.setHeader("Access-Control-Allow-Origin", "*");
+ response.setContentType("application/vnd.ms-excel;charset=UTF-8");
+ ServletOutputStream outputStream = response.getOutputStream();
+ workbook.write(outputStream);
+ } catch (IOException e) {
+ e.printStackTrace();
+ throw new ServiceException(ResultCode.INTERNAL_SERVER_ERROR);
+ }
+ }
+
+ /**
+ * 图片导出
+ *
+ * @param response
+ * @param in
+ * @param fileName
+ */
+ public static void exportPic(HttpServletResponse response, InputStream in, String fileName) {
+ try {
+ if (in != null) {
+ response.reset();
+ String fileHeaderName = URLEncoder.encode(fileName, Constant.Character.UTF8);
+ String fileExtensionName = fileName.substring(fileName.lastIndexOf(".") + 1).toUpperCase(Locale.ENGLISH);
+ switch (fileExtensionName) {
+ case "JEPG":
+ case "JPG":
+ response.setContentType("image/jepg;charset=UTF-8");
+ break;
+ case "PNG":
+ response.setContentType("image/png;charset=UTF-8");
+ break;
+ case "BMP":
+ response.setContentType("application/x-bmp;charset=UTF-8");
+ break;
+ default:
+ response.setContentType("application/octet-stream;charset=UTF-8");
+ break;
+
+ }
+ response.setHeader("Content-Disposition", "attachment;filename=" + headerManipulation(fileHeaderName));
+ response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
+ response.setHeader("Access-Control-Allow-Origin", "*");
+ byte[] buffer = new byte[1024];
+ OutputStream out = response.getOutputStream();
+ int i;
+ while ((i = in.read(buffer)) != -1) {
+ out.write(buffer, 0, i);
+ }
+ out.flush();
+ out.close();
+ in.close();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ throw new ServiceException(ResultCode.INTERNAL_SERVER_ERROR);
+ }
+ }
+}
diff --git a/src/main/java/com/pms/ocp/common/constants/ResultCode.java b/src/main/java/com/pms/ocp/common/constants/ResultCode.java
new file mode 100644
index 0000000000000000000000000000000000000000..a4e292fbd2f813ffee58450d76f22e700b54c688
--- /dev/null
+++ b/src/main/java/com/pms/ocp/common/constants/ResultCode.java
@@ -0,0 +1,174 @@
+package com.pms.ocp.common.constants;
+
+/**
+ * 异常枚举类
+ */
+public enum ResultCode {
+ /* ============================ 通用错误码 ========================== **/
+ /**
+ * 禁止访问 303
+ **/
+ PARAMS_NOT(303, "缺少参数"),
+
+ /**
+ * 存在错误参数 304
+ */
+ PARAMS_NOT_RIGHT(304, "存在错误参数"),
+
+ /**
+ * 存在错误测试数据 305
+ */
+ DATA_ERROR(305, "存在错误测试数据"),
+
+ /**
+ * 存在错误测试数据 305
+ */
+ SERVER_ERROR(306, "服务异常"),
+ /**
+ * 校验失败 307
+ **/
+ VERIFICATION_FAIL(307, "校验失败"),
+
+ /**
+ * 错误请求 400
+ **/
+ BAD_REQUEST(400, "错误请求"),
+
+ /**
+ * 未经授权 401
+ **/
+ UNAUTHORIZED(401, "未经授权"),
+
+ /**
+ * 禁止访问 403
+ **/
+ FORBIDDEN(403, "禁止访问"),
+ /**
+ * 连接超时
+ **/
+ TIME_OUT(408, "连接超时"),
+ /**
+ * Feign连接错误
+ **/
+ FEIGN_CONNECT_ERROR(409, "feignClient 连接错误:%s"),
+ /**
+ * Feign连接错误
+ **/
+ BAD_REQUEST_METHOD(410, "不合法的请求方式"),
+ /**
+ * 操作异常 500
+ **/
+ INTERNAL_SERVER_ERROR(500, "操作异常"),
+ /**
+ * SQL异常
+ **/
+ SQL_ERROR_EXCEPTION(501, "SQL执行异常!"),
+ /**
+ * 操作失败
+ **/
+ OPERATION_FAILURE(507, "操作失败"),
+ /**
+ * 日期格式处理异常
+ **/
+ DATE_FORMAT_EXCEPTION(508, "日期格式处理异常"),
+ /**
+ * 项目启动文件异常
+ */
+ SYSTEM_PROFILE_EXCEPTION(509, "错误的项目启动文件"),
+
+ /* ============================ 业务/错误码 start========================== **/
+ /* ===========================后台系统======================== **/
+ RECORD_NOT_EXIST(10001, "相关记录不存在!"),
+ SYS_USER_INVALID(10002, "用户登录已过期!"),
+ PERMISSION_NOT(10003, "无访问权限!"),
+ ACCOUNT_NOT(10004, "账号异常!"),
+ SHIRO_ERROR(10005, "鉴权/授权过程出错!"),
+ MENU_EXIST(10006, "菜单定义已存在!"),
+ ROLE_EXIST(10007, "角色定义已存在!"),
+ CODE_EXIST(10008, "编码已存在!"),
+ NAME_EXIST(10009, "名称已存在!"),
+ NO_DELETE(10010, "无法删除,有关联数据!"),
+ USER_ORGANIZATION_LEVEL_ERROR(10023, "用户组织机构关联层级有误!"),
+ USER_ORGANIZATION_INFO_ERROR(10024,"用户组织机构信息有误!"),
+ TOKEN_INVALID(9997, "登录失效,请重新登录!"),
+ /* ============================ 文件处理 错误码 ========================== **/
+ FILE_NOT_EXISTS(21001, "文件不存在"),
+ FILE_MUST_IS_EXCEL(21002, "文件类型必须是excel"),
+ UPLOAD_EXCEPTION(21003, "上传过程出现异常"),
+ EXCEL_RULE_NOT_EXISTS(21004, "excel校验规则不存在"),
+ EXCEL_TEMPLATE_NOT_EXISTS(21005, "excel模板不存在"),
+ EXCEL_TEMPLATE_NOT_CORRECT(21009, "excel模板不对,请重新下载"),
+ EXCEL_DATA_NOT_EXISTS(21006, "excle数据不存在"),
+ EXCEL_NOT_CORRECT(21007, "excel不正确"),
+ EXCEL_PARSE_CORRECT(21010,"excel解析错误"),
+ CURRENT_MONTH_NOT_EXISTS(21008, "当前年月数据不存在"),
+ BATCH_NOT_NEED(21009, "无需批量操作!"),
+ CELL_IS_NULL(21010, "值不能为空"),
+ CELL_FORMAT_ERROR(21011, "值格式不正确"),
+ CELL_MIN_LENGTH_ERROR(21012, "值小于最小长度"),
+ CELL_MAX_LENGTH_ERROR(21013, "值大于最大长度"),
+ CELL_REGULAR_ERROR(21014, "值正则验证不通过"),
+ CELL_OPTION_ERROR(21015, "值不在选项集范围内"),
+ ROW_DUPLICATE_ERROR(21016, "行重复性校验未通过"),
+ CELL_DATE_FORMAT_ERROR(21017,"日期范围格式不正确"),
+
+ DATA_MISSING_UNITS(21018, "数据缺少单位级别编码"),
+ PICTURE_NAME_ILLEGAL(21019, "图片名称不合法,请重新上传"),
+ FILE_MUST_IS_PIC(21020, "图片格式不合法,请重新上传!"),
+ NAME_CONFLICT(21021, "该组织机构下名称重复,请修改名称!"),
+ ENCRYPT_ERROR_CODE(21022, "解密失败"),
+
+ /* ===========================JoyhrError======================== **/
+ SIGN_ERROR(80001,"签名验证错误!"),
+ METHOD_ERROR(80002,"方法不存在!"),
+ /* ===========================CrmHookError======================== **/
+ CRM_MEMBER_FOUND_ERROR(81001,"会员信息已存在"),
+ CRM_MEMBER_NOT_FOUND_ERROR(81002,"会员信息不存在"),
+
+ /* =============主系统更改Error ================= **/
+ MASTER_DATA_RELY_ERROR(90001,"切换系统与中台数据存在数据不匹配"),
+
+ RELY_DATA_NOT_MATCH_BASE(90002,"切换系统依赖数据与中台数据存在不匹配数据"),
+
+ BUS_DATA_NOT_MATCH_BASE(90003,"切换系统业务数据与中台数据存在不匹配数据"),
+
+ DATA_MAPPING_NOT_MATCH_BASE(90004,"切换系统数据映射中数据与中台数据存在不匹配数据"),
+
+ /* =============中台大平台系统 ================= **/
+ LOGIN_TIME_OUT(130001,"登录失效或未登录,请重新登录"),
+ VERFICATION_CODE_ERROR(130002,"验证码不正确"),
+ NO_USER(130003,"用户不存在"),
+ PASSWORD_ERROR(130004,"密码不正确"),
+ MOBILE_USED(130005,"该手机号码已被注册"),
+ BANK_ACCOUNT_USED(130006,"该银行账号已被使用"),
+ OPEN_GOODS_FAIL(130009,"开通失败,请重新开通或联系相关人员"),
+ PROBATION_GOODS_FAIL(130010,"试用失败,请重新试用或联系相关人员"),
+ END_GOODS_FAIL(130011,"停用失败,请重新停用或联系相关人员"),
+ FIND_ORDER_LIST_FAIL(130012,"查询订单列表失败,请重新查询或联系相关人员"),
+ FIND_BILL_FAIL(130013,"查询账单列表失败,请重新查询或联系相关人员"),
+ FIND_SIX_MONTH_BILL(130014,"查询近6个月消费失败"),
+ FIND_MONTH_GOODS(130015,"查询该月份消费情况失败"),
+ /* =============数据维护 ================= **/
+ TOTAL_SYNC_RECORD_EXITS(110001,"已执行过全量同步!"),
+ TOTAL_SYNC_RECORD_NOT_EXITS(110002,"还没执行全量同步!");
+
+ public final int statusCode;
+ public String msg;
+
+ ResultCode(int statusCode, String msg) {
+ this.statusCode = statusCode;
+ this.msg = msg;
+ }
+
+ public int getStatusCode() {
+ return statusCode;
+ }
+
+ public String getMessage() {
+ return msg;
+ }
+
+ public void setMessage(String msg) {
+ this.msg = msg;
+ }
+}
diff --git a/src/main/java/com/pms/ocp/common/constants/StringUtils.java b/src/main/java/com/pms/ocp/common/constants/StringUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..e5bacea15e061ea2a28770f574b234fb2585eee8
--- /dev/null
+++ b/src/main/java/com/pms/ocp/common/constants/StringUtils.java
@@ -0,0 +1,1377 @@
+package com.pms.ocp.common.constants;
+
+import java.io.UnsupportedEncodingException;
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+
+public class StringUtils {
+
+ /**
+ * 常量3
+ */
+ private static final int INT3 = 3;
+ /**
+ * 常量4
+ */
+ private static final int INT4 = 4;
+ /**
+ * 常量16
+ */
+ private static final int INT16 = 16;
+ /**
+ * 常量0x4e00
+ */
+ private static final int INT0X4E00 = 0x4e00;
+ /**
+ * 常量0x9fa5
+ */
+ private static final int INT0X9FA5 = 0x9fa5;
+ /**
+ * 常量0xf900
+ */
+ private static final int INT0XF900 = 0xf900;
+ /**
+ * 常量0xfa2d
+ */
+ private static final int INT0XFA2D = 0xfa2d;
+
+ public static final String SLASH = getSlash();
+
+ public static final String BACKSLASH = getBackslash();
+
+ public static final String URL_SLASH = getURLSlash();
+
+ public static final String BASE64_TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
+
+ private static final int[] wi = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1};
+
+ private static final int[] vi = {1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2};
+
+ private static int[] ai = new int[18];
+
+ public StringUtils(){
+ }
+
+ /**
+ * getSlash
+ * @return 返回“/”
+ */
+ public static String getSlash()
+ {
+ return "/";
+ }
+
+ /**
+ * @return 返回“\\”
+ */
+ public static String getBackslash()
+ {
+ return "\\";
+ }
+
+ /**
+ * @return 返回“//”
+ */
+ public static String getURLSlash()
+ {
+ return "//";
+ }
+
+ /**
+ * @return 返回网页的空符号“ ”
+ */
+ public static String getHTMLBlank()
+ {
+ return " ";
+ }
+
+ /**
+ * 判断两个字符串是否值相等
+ *
+ * @param a
+ * 设置第一个字符串
+ * @param b
+ * 设置第二个字符串
+ * @return boolean 返回比较的结果
+ */
+ public static boolean compare(String a, String b) {
+ if (isEmpty(a) && isEmpty(b))
+ return true;
+ if (!isEmpty(a) && !isEmpty(b))
+ return a.equals(b);
+ else
+ return false;
+ }
+
+ /**
+ * 判断两个字符串是否值相等,忽略大小写
+ * @param a
+ * 设置第一个字符串
+ * @param b
+ * 设置第二个字符串
+ * @return boolean 返回比较的结果
+ */
+ public static boolean compareIgnoreCase(String a, String b)
+ {
+ if (isEmpty(a) && isEmpty(b))
+ return true;
+ if (!isEmpty(a) && !isEmpty(b))
+ return a.equalsIgnoreCase(b);
+ else
+ return false;
+ }
+
+ /**
+ * 复制字符串中从开始到指定的位置
+ *
+ * @param src
+ * 设置字符串
+ * @param len
+ * 指定复制到某个位置
+ * @return String 返回结果
+ */
+ public static String copy(String src, int len)
+ {
+ if (src == null)
+ return null;
+ if (src.length() > len)
+ return len <= 0 ? null : src.substring(0, len);
+ else
+ return src;
+ }
+
+ /**
+ * 删除字符串中指定的一段字符串内容
+ *
+ * @param src
+ * 设置原字符串
+ * @param delStr
+ * 设置需要删除的字符串
+ * @return String 返回结果
+ */
+ public static String delete(String src, String delStr)
+ {
+ if (isEmpty(src) || isEmpty(delStr))
+ return src;
+ StringBuffer buffer = new StringBuffer(src);
+ for (int index = src.length(); (index = src.lastIndexOf(delStr, index)) >= 0; index -= delStr.length())
+ buffer.delete(index, index + delStr.length());
+
+ return buffer.toString();
+ }
+
+ /**
+ * 将指定的字符和位置插入到原字符串中
+ *
+ * @param src
+ * 设置原字符串
+ * @param anotherStr
+ * 设置需要插入的字符串
+ * @param offset
+ * 位置
+ * @return String 返回结果
+ */
+ public static String insert(String src, String anotherStr, int offset)
+ {
+ if (isEmpty(src) || isEmpty(anotherStr))
+ return src;
+ StringBuffer buffer = new StringBuffer(src);
+ if (offset >= 0 && offset <= src.length())
+ buffer.insert(offset, anotherStr);
+ return buffer.toString();
+ }
+
+ /**
+ * 追加指定的字符串到原字符串中
+ *
+ * @param src
+ * 设置原字符串
+ * @param appendStr
+ * 设置需要追加的字符串
+ * @return String 返回结果
+ */
+ public static String append(String src, String appendStr)
+ {
+ if (isEmpty(src) || isEmpty(appendStr))
+ {
+ return src;
+ }
+ else
+ {
+ StringBuffer buffer = new StringBuffer(src);
+ buffer.append(appendStr);
+ return buffer.toString();
+ }
+ }
+
+ /**
+ * 根据参数替换字符串内容功能
+ *
+ * @param src
+ * 设置原字符串
+ * @param oldStr
+ * 指定替换字符串
+ * @param newStr
+ * 将要替换的内容
+ * @param isCaseSensitive
+ * 是否区分大小写
+ * @return String 返回结果
+ */
+ public static String replace(String src, String oldStr, String newStr, boolean isCaseSensitive)
+ {
+ if (isEmpty(src) || isEmpty(oldStr) || newStr == null)
+ return src;
+ String s = isCaseSensitive ? src : src.toLowerCase();
+ String o = isCaseSensitive ? oldStr : oldStr.toLowerCase();
+ StringBuffer buffer = new StringBuffer(src);
+ for (int index = s.length(); (index = s.lastIndexOf(o, index)) >= 0; index -= o.length())
+ buffer.replace(index, index + o.length(), newStr);
+
+ return buffer.toString();
+ }
+
+ /**
+ * 根据参数替换字符串内容功能,可指定位置
+ *
+ * @param src
+ * 设置原字符串
+ * @param oldStr
+ * 指定替换字符串
+ * @param newStr
+ * 将要替换的内容
+ * @param isCaseSensitive
+ * 是否区分大小写
+ * @param index
+ * 指定位置
+ * @return String 返回结果
+ */
+ public static String replace(String src, String oldStr, String newStr, boolean isCaseSensitive, int index)
+ {
+ if (src == null || src.length() == 0 || oldStr == null || oldStr.length() == 0 || index <= 0)
+ return src;
+ if (newStr == null)
+ newStr = "";
+ String s = isCaseSensitive ? src : src.toLowerCase();
+ String o = isCaseSensitive ? oldStr : oldStr.toLowerCase();
+ StringBuffer buffer = new StringBuffer(src);
+ int length = o.length();
+ int pos;
+ for (pos = s.indexOf(o, 0); pos >= 0; pos = s.indexOf(o, pos + length))
+ if (--index == 0)
+ break;
+
+ if (pos >= 0 && index == 0)
+ buffer.replace(pos, pos + length, newStr);
+ return buffer.toString();
+ }
+
+ /**
+ * 获取指定符号分割的字符串数组
+ *
+ * @param str
+ * 设置原字符串
+ * @param delimiter
+ * 设置分割符号
+ * @return String[] 返回字符串数组
+ */
+ public static String[] split(String str, String delimiter)
+ {
+ ArrayList array = new ArrayList();
+ int index = 0;
+ int begin = 0;
+ String result[] = new String[0];
+ if (isEmpty(str))
+ return result;
+ do
+ {
+ index = str.indexOf(delimiter, begin);
+ if (index == begin)
+ {
+ if (index >= 0)
+ array.add("");
+ begin += delimiter.length();
+ continue;
+ }
+ if (index <= begin)
+ break;
+ int end = index;
+ array.add(str.substring(begin, end));
+ begin = index + delimiter.length();
+ } while (true);
+ if (begin >= 0 && begin < str.length())
+ array.add(str.substring(begin));
+ if (str.endsWith(delimiter))
+ array.add("");
+ if (array.size() > 0)
+ {
+ result = new String[array.size()];
+ array.toArray(result);
+ }
+ return result;
+ }
+
+ /**
+ * 获取指定符号分割的字符串数组,非空
+ *
+ * @param str
+ * 设置原字符串
+ * @param delimiter
+ * 设置分割符号
+ * @return String[] 返回字符串数组
+ */
+ public static String[] splitWithoutEmpty(String str, String delimiter)
+ {
+ ArrayList array = new ArrayList();
+ int index = 0;
+ int begin = 0;
+ String result[] = new String[0];
+ if (isEmpty(str))
+ return new String[0];
+ do
+ {
+ index = str.indexOf(delimiter, begin);
+ if (index == begin)
+ {
+ if (index > 0)
+ array.add("");
+ begin += delimiter.length();
+ continue;
+ }
+ if (index <= begin)
+ break;
+ int end = index;
+ array.add(str.substring(begin, end));
+ begin = index + delimiter.length();
+ } while (true);
+ if (begin >= 0 && begin < str.length())
+ array.add(str.substring(begin));
+ if (array.size() > 0)
+ {
+ result = new String[array.size()];
+ array.toArray(result);
+ }
+ return result;
+ }
+
+ /**
+ * 将指定字符串内容反转
+ *
+ * @param str
+ * 设置原字符串
+ * @return String 返回字符串
+ */
+ public static String reverse(String str)
+ {
+ if (isEmpty(str))
+ {
+ return str;
+ }
+ else
+ {
+ StringBuffer buffer = new StringBuffer(str);
+ buffer.reverse();
+ return buffer.toString();
+ }
+ }
+
+ /**
+ * 给传入的字符串前后加双引号
+ *
+ * @param str
+ * 设置原字符串
+ * @return String 返回结果
+ */
+ public static String quote(String str)
+ {
+ if (isEmpty(str))
+ return "\"\"";
+ StringBuffer buffer = new StringBuffer(str);
+ if (!str.startsWith("\""))
+ buffer.insert(0, "\"");
+ if (!str.endsWith("\""))
+ buffer.append("\"");
+ return buffer.toString();
+ }
+
+ /**
+ * 去除字符串中的双引号
+ *
+ * @param str
+ * 设置原字符串
+ * @return String 返回结果
+ */
+ public static String extractQuotedStr(String str)
+ {
+ if (isEmpty(str))
+ return str;
+ StringBuffer buffer = new StringBuffer(str);
+ int index = str.length();
+ while (buffer.charAt(buffer.length() - 1) == '"')
+ {
+ buffer.deleteCharAt(buffer.length() - 1);
+ index = buffer.length();
+ if (index <= 0)
+ break;
+ }
+ if (buffer.length() == 0)
+ return "";
+ while (buffer.charAt(0) == '"')
+ {
+ buffer.deleteCharAt(0);
+ index = buffer.length();
+ if (index <= 0)
+ break;
+ }
+ return buffer.toString();
+ }
+
+ /**
+ * 截取字符串中到指定的字符的内容,从左边开始
+ *
+ * @param str
+ * 设置原字符串
+ * @param c
+ * 设置指定字符
+ * @return String 返回结果
+ */
+ public static String strChar(String str, char c)
+ {
+ if (str == null || str.length() == 0)
+ return null;
+ for (int i = 0; i < str.length(); i++)
+ if (str.charAt(i) == c)
+ return str.substring(i);
+
+ return null;
+ }
+
+ /**
+ * 截取字符串中到指定的字符的内容,从右边开始
+ *
+ * @param str
+ * 设置原字符串
+ * @param c
+ * 设置指定字符
+ * @return String 返回结果
+ */
+ public static String strRChar(String str, char c)
+ {
+ if (str == null || str.length() == 0)
+ return null;
+ for (int i = str.length() - 1; i >= 0; i--)
+ if (str.charAt(i) == c)
+ return str.substring(i);
+
+ return null;
+ }
+
+ /**
+ * 将Object对象数组转成字符串数组
+ *
+ * @param array
+ * 设置Object对象数组
+ * @return String[] 返回结果
+ */
+ public static String[] toArray(Object array[])
+ {
+ if (array == null || array.length == 0)
+ return null;
+ String result[] = new String[array.length];
+ for (int i = 0; i < array.length; i++)
+ if (array[i] != null)
+ result[i] = array[i].toString();
+
+ return result;
+ }
+
+ /**
+ * 将Vector对象数组元素转成字符串数组
+ *
+ * @param list
+ * 设置Vector对象数组
+ * @return String[] 返回结果
+ */
+ public static String[] toArray(Vector list)
+ {
+ if (list == null || list.size() == 0)
+ return null;
+ String result[] = new String[list.size()];
+ for (int i = 0; i < list.size(); i++)
+ {
+ Object obj = list.get(i);
+ if (obj != null)
+ result[i] = list.get(i).toString();
+ }
+
+ return result;
+ }
+
+ /**
+ * 将字符串数组复制到LIST中
+ *
+ * @param array
+ * 设置字符串数组
+ * @param list
+ * 设置LIST集合对象
+ * @param index
+ * 设置复制到LIST位置
+ * @return List 返回结果
+ */
+ public static List copyToList(String array[], List list, int index)
+ {
+ if (array == null || array.length == 0)
+ return list;
+ if (list == null || index < 0)
+ return list;
+ for (int i = 0; i < array.length; i++)
+ if (list.size() <= i + index)
+ list.add(index + i, array[i]);
+ else
+ list.set(index + i, array[i]);
+
+ return list;
+ }
+
+ /**
+ * 判断字符串数组是否包含指定字符串
+ *
+ * @param array
+ * 设置字符串数组
+ * @param str
+ * 设置批量字符串
+ * @return boolean 返回结果
+ */
+ public static boolean contains(Object array[], String str)
+ {
+ if (array == null || array.length == 0)
+ return false;
+ if (str == null)
+ return false;
+ for (int i = 0; i < array.length; i++)
+ {
+ Object obj = array[i];
+ if (obj != null && str.equals(obj.toString()))
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * 获取字符串数组包含指定字符串的位置
+ *
+ * @param array
+ * 设置字符串数组
+ * @param str
+ * 设置批量字符串
+ * @return int 返回结果
+ */
+ public static int indexOf(Object array[], String str)
+ {
+ if (array == null || array.length == 0)
+ return -1;
+ if (str == null)
+ return -1;
+ for (int i = 0; i < array.length; i++)
+ {
+ Object obj = array[i];
+ if (obj != null && str.equals(obj.toString()))
+ return i;
+ }
+
+ return -1;
+ }
+
+ /**
+ * 验证是否为电子邮件格式
+ *
+ * @param theEmail
+ * 设置电子邮件地址字符串
+ * @return boolean 返回是否合法
+ */
+ public static boolean isValidEmail(String theEmail)
+ {
+ boolean cbool = false;
+ try
+ {
+ String check = "^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";
+ Pattern regex = Pattern.compile(check);
+ Matcher matcher = regex.matcher(theEmail);
+ boolean isMatched = matcher.matches();
+ if (isMatched)
+ {
+ cbool = true;
+ }
+
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ return cbool;
+ }
+ return cbool;
+ }
+
+ /**
+ * 去除字符串左边空格
+ *
+ * @param str
+ * 设置原字符串
+ * @return String 返回结果
+ */
+ public static String trimLeft(String str)
+ {
+ if (str == null)
+ return null;
+ int length = str.length();
+ if (length == 0)
+ return "";
+ StringBuffer buffer = new StringBuffer(str);
+ int index;
+ for (index = 0; index < length && buffer.charAt(index) == ' '; index++)
+ ;
+ if (index == length)
+ return "";
+ else
+ return buffer.substring(index);
+ }
+
+ /**
+ * 去除字符串右边空格
+ *
+ * @param str
+ * 设置原字符串
+ * @return String 返回结果
+ */
+ public static String trimRight(String str)
+ {
+ if (str == null)
+ return null;
+ int length = str.length();
+ if (length == 0)
+ return "";
+ StringBuffer buffer = new StringBuffer(str);
+ int index;
+ for (index = length - 1; index >= 0 && buffer.charAt(index) == ' '; index--)
+ ;
+ if (index < 0 && buffer.charAt(0) == ' ')
+ return "";
+ else
+ return buffer.substring(0, index + 1);
+ }
+
+ /**
+ * 去除字符串两边空格
+ *
+ * @param str
+ * 设置原字符串
+ * @return String 返回结果
+ */
+ public static String trimAll(String str)
+ {
+ return str.trim();
+ }
+
+ /**
+ * 去除字符串NULL
+ *
+ * @param str
+ * 设置原字符串
+ * @return String 如果为NULL返回空字符串,否则返回原字符串,去除null字符串
+ */
+ public static String removeNull(String str)
+ {
+ if(str == null){
+ return "";
+ }
+ return str.replace("null", "");
+ }
+
+ /**
+ * 去除对象NULL
+ *
+ * @param str
+ * 设置原字符串
+ * @return String 如果为NULL返回空字符串,否则返回原字符串
+ */
+ public static String removeNull(Object str)
+ {
+ return str != null ? str.toString() : "";
+ }
+
+ /**
+ * 实现判断字符串是否在数组中存在
+ *
+ * @param strs
+ * 设置字符串数组
+ * @param str
+ * 设置要查找的字符串
+ * @param caseSensitive
+ * 设置是否区分大小写
+ * @return boolean 返回结果
+ */
+ public static boolean strInArray(String strs[], String str, boolean caseSensitive)
+ {
+ if (strs != null && strs.length > 0)
+ {
+ for (int i = 0; i < strs.length; i++)
+ {
+ if (caseSensitive)
+ {
+ if (strs[i].equals(str))
+ return true;
+ }
+ else
+ {
+ if (strs[i].equalsIgnoreCase(str))
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * 验证身份证的合法性
+ *
+ * @param idcard
+ * 设置身份证字符串
+ * @return boolean 返回结果
+ */
+ public static boolean idCardVerify(String idcard)
+ {
+ if (idcard.length() == 15)
+ {
+ idcard = idCardUptoeighteen(idcard);
+ }
+ if (idcard.length() != 18)
+ {
+ return false;
+ }
+ String verify = idcard.substring(17, 18);
+ if (verify.equals(getIdCardVerify(idcard)))
+ {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * 获得身份证的合法性
+ *
+ * @param eightcardid
+ * 设置身份证字符串
+ * @return String 返回结果
+ */
+ public static String getIdCardVerify(String eightcardid)
+ {
+ int remaining = 0;
+ if (eightcardid.length() == 18)
+ {
+ eightcardid = eightcardid.substring(0, 17);
+ }
+ if (eightcardid.length() == 17)
+ {
+ int sum = 0;
+ for (int i = 0; i < 17; i++)
+ {
+ String k = eightcardid.substring(i, i + 1);
+ ai[i] = Integer.parseInt(k);
+ }
+ for (int i = 0; i < 17; i++)
+ {
+ sum = sum + wi[i] * ai[i];
+ }
+ remaining = sum % 11;
+ }
+ return remaining == 2 ? "X" : String.valueOf(vi[remaining]);
+ }
+
+ /**
+ * 获得身份证15转18位
+ *
+ * @param fifteencardid
+ * 设置身份证字符串
+ * @return String 返回结果
+ */
+ public static String idCardUptoeighteen(String fifteencardid)
+ {
+ if (fifteencardid.length() != 15)
+ return null;
+ String eightcardid = fifteencardid.substring(0, 6);
+ eightcardid = eightcardid + "19";
+ eightcardid = eightcardid + fifteencardid.substring(6, 15);
+ eightcardid = eightcardid + getIdCardVerify(eightcardid);
+ return eightcardid;
+ }
+
+ /**
+ * 验证电话号码合法格式,格式为02584555112
+ *
+ * @param phoneCode
+ * 设置电话号码字符串
+ * @return boolean 返回结果
+ */
+ public static boolean isPhoneNum(String phoneCode)
+ {
+ Pattern p = Pattern.compile("[0][1-9]{2,3}[1-9]{6,8}");
+ Matcher m = p.matcher(phoneCode);
+ boolean b = m.matches();
+ return b;
+ }
+
+ /**
+ * 验证手机号码合法格式,格式为13984555112
+ *
+ * @param phoneCode
+ * 设置手机号码字符串
+ * @return boolean 返回结果
+ */
+ public static boolean isMobilePhoneNum(String phoneCode)
+ {
+ Pattern p = Pattern.compile("^0{0,1}(13[0-9]|15[0-9]|18[0-9])[0-9]{8}");
+ Matcher m = p.matcher(phoneCode);
+ boolean b = m.matches();
+ return b;
+ }
+
+ /**
+ * 字符数组转换为字符串,用逗号隔开
+ *
+ * @param str
+ * @return String
+ */
+ public static String arrayToString(final String[] str)
+ {
+ if (str == null)
+ return "";
+ StringBuffer rStr = new StringBuffer("");
+ for (int i = 0; i < str.length; i++)
+ {
+ rStr.append(str[i]);
+ rStr.append(",");
+ }
+ // 截取逗号
+ if (rStr.toString().length() > 0)
+ {
+ rStr.setLength(rStr.length() - 1);
+ }
+ return rStr.toString();
+ }
+
+ /**
+ * 字符数组转换为字符串,用逗号隔开
+ *
+ * @param str
+ * @param beginIndex
+ * @param length
+ * @return String
+ */
+ public static String arrayToString(final String[] str, int beginIndex, int length)
+ {
+ if (str == null || beginIndex > str.length - 1)
+ return "";
+ StringBuffer rStr = new StringBuffer("");
+
+ int condition = beginIndex + length - 1;
+
+ if(condition > str.length - 1)
+ {
+ condition = str.length - 1;
+ }
+ rStr.append("'");
+ for (int i = beginIndex; i < condition; i++)
+ {
+ rStr.append(str[i]).append("','");
+ }
+ rStr.append(str[condition]).append("'");
+
+ return rStr.toString();
+ }
+
+ /**
+ * 字符数组转换为字符串,用逗号隔开
+ *
+ * @param str
+ * @param beginIndex
+ * @param length
+ * @return String
+ */
+ public static String arrayToIntegerString(final String[] str, int beginIndex, int length)
+ {
+ if (str == null || beginIndex > str.length - 1)
+ {
+ return "";
+ }
+
+ StringBuffer rStr = new StringBuffer("");
+
+ int condition = beginIndex + length - 1;
+
+ if(condition > str.length - 1)
+ {
+ condition = str.length - 1;
+ }
+
+ for (int i = beginIndex; i < condition; i++)
+ {
+ rStr.append(str[i]);
+ rStr.append(",");
+ }
+ rStr.append(str[condition]);
+
+ return rStr.toString();
+ }
+ /**
+ * 判定一个对象是否为null or empty
+ *
+ * @param o
+ * 对象
+ * @return true or false
+ */
+ public static boolean isNullOrEmpty(Object o) {
+ return o == null || String.valueOf(o).trim().length() == 0
+ || "null".equals(String.valueOf(o).trim());
+ }
+
+ /**
+ * 根据分隔符将字符串分开,并加上"'"输出(12,23,234 to '12','23','234')
+ *
+ * @param s
+ * @param spiltter
+ * 分隔符
+ * @return String
+ */
+ public static String formatString(String s, String spiltter)
+ {
+ if (StringUtils.isEmpty(s))
+ return "";
+ StringBuffer result = new StringBuffer();
+ String[] temp = s.split(spiltter);
+ for (String str : temp)
+ {
+ if (str.trim().length() > 0)
+ result.append(spiltter).append("'").append(str).append("'");
+ }
+
+ return result.length() > 0 ? result.substring(1) : result.toString();
+ }
+
+ /**
+ * 格式化字符串(12,23,234 to '12','23','234')
+ *
+ * @param s
+ * @return String
+ */
+ public static String formatString(String s)
+ {
+ return formatString(s, ",");
+ }
+
+ /**
+ * 生成messageID
+ *
+ * @return String
+ */
+ public static String createMessageId()
+ {
+ Calendar calendar = Calendar.getInstance();
+ return calendar.getTimeInMillis() + "";
+ }
+
+ /**
+ * 判断集合Collection是否为空
+ * @param collection
+ * @return boolean
+ */
+ public static boolean isNullOrEmpty(Collection collection) {
+ return collection == null || collection.size() == 0;
+ }
+
+ /**
+ * 格式化Object
+ * @param o
+ * @return String
+ */
+ public static String valueOf(Object o) {
+ return StringUtils.isNullOrEmpty(o) ? "" : o.toString();
+ }
+
+ /**
+ * valueOf
+ * @param o
+ * @param changevalue
+ * @return String
+ */
+ public static String valueOf(Object o,String changevalue)
+ {
+ return StringUtils.isNullOrEmpty(o) ?changevalue:o.toString();
+ }
+
+ /**
+ * 判断一个字符串是否有值,空格也不算有值
+ * @param str
+ * @return boolean
+ */
+ public static boolean availableStr(String str){
+ if(str!=null && !"".equals(str) && !"null".equals(str)){
+ String avaStr = str.trim();
+ return (avaStr!=null && !"".equals(avaStr) && !"null".equals(avaStr));
+ }else{
+ return false;
+ }
+ }
+
+ /**
+ * 截取子字符串
+ * @param str 需要截取的字符串
+ * @param len 截取的位数
+ * @return String 返回的子字符串
+ */
+ public static String getSubString(String str, int len) {
+ if (isEmpty(str)) {
+ return "";
+ }
+ if (0 >= len) {
+ return str;
+ }
+ final int byteLength = getByteLength(str);
+
+ if (byteLength < len) {
+ return str;
+ }
+ StringBuffer sb = new StringBuffer(str);
+ sb.setLength(len);
+
+ while (getByteLength(sb.toString()) > len) {
+ sb.deleteCharAt(sb.length() - 1);
+ }
+ return sb.toString();
+ }
+
+ /**
+ * 得到字节长度
+ * @param str 需要得到长度的字符串
+ * @return 返回字节的长度
+ */
+ public static int getByteLength(String str) {
+ int len = 0;
+ if (isEmpty(str)) {
+ return len;
+ }
+ try {
+ len = str.getBytes("UTF-8").length;
+ } catch (UnsupportedEncodingException e) {
+ throw new RuntimeException(e);
+ }
+ return len;
+ }
+
+ /**
+ * 判断字符串是否为空
+ * @param obj 字符串
+ * @return true:空 false:非空
+ */
+ public static boolean isEmpty(Object obj) {
+ String str = obj + "";
+ if (null == str || 0 == str.length()||"null".equals(str)||"".equals(str)) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * 把字符串中的双引号和反斜杠替换为画面能够识别的字符串
+ * @param inStr
+ * @return outStr
+ */
+ public static String escapeSpecialChar(String inStr){
+ if (null == inStr || "null".equals(inStr) || "".equals(inStr)) {
+ return "";
+ }
+ String outStr = "";
+ //替换双引号
+ String srcStr1 = "\"";
+ String destStr1 = "\\\\\"";
+ //替换反斜杠
+ String srcStr2 = "\\\\";
+ String destStr2 = "\\\\\\\\";
+ outStr = inStr.replaceAll(srcStr2, destStr2);
+ outStr = outStr.replaceAll(srcStr1, destStr1);
+ return outStr;
+
+ }
+
+ /**
+ * 将String中的xml格式的Excel的关键字转义
+ * @param str
+ * @return String
+ */
+ public static String encodeExcelXmlStr(String str){
+ if(isEmpty(str)){
+ return str;
+ }
+ return str.replaceAll("&", "&")
+ .replaceAll("<", "<")
+ .replaceAll(">", ">")
+ .replaceAll("\"",""" )
+ .replaceAll("\r\n","
")
+ .replaceAll("\n","
");
+ }
+
+
+ /**
+ *判断输入字符串是否为整型数据
+ * @param str 字符串
+ * @return boolean
+ */
+ public static boolean isInteger(String str) {
+ if(availableStr(str)) {
+ try {
+ Integer.parseInt(str);
+ return true;
+ }catch(NumberFormatException e) {
+ return false;
+ }
+ }
+ return false;
+ }
+
+ /**
+ *判断输入字符串是否为长整型数据
+ * @param str 字符串
+ * @return boolean
+ */
+ public static boolean isLong(String str) {
+ if(availableStr(str)) {
+ try {
+ Long.parseLong(str);
+ return true;
+ }catch(NumberFormatException e) {
+ return false;
+ }
+ }
+ return false;
+ }
+
+ /**
+ *判断输入字符串是否为单精度浮点型数据
+ * @param str 字符串
+ * @return boolean
+ */
+ public static boolean isFloat(String str) {
+ if(availableStr(str)) {
+ try {
+ Float.parseFloat(str);
+ return true;
+ }catch(NumberFormatException e) {
+ return false;
+ }
+ }
+ return false;
+ }
+
+
+ /**
+ * 判断字符是否为汉字(汉字标点不为汉字字符)
+ * @param oneChar
+ * @return boolean
+ */
+ public static boolean isChineseWithoutPunctuation(char oneChar){
+ if((oneChar >= INT0X4E00 && oneChar <= INT0X9FA5)
+ ||(oneChar >= INT0XF900 && oneChar <=INT0XFA2D)){
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * 判断字符是否为汉字(汉字标点为汉字字符)
+ * @param oneChar
+ * @return boolean
+ */
+ public static boolean isChineseWithPunctuation(char oneChar) {
+ Character.UnicodeBlock ub = Character.UnicodeBlock.of(oneChar);
+ if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
+ || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
+ || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
+ || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B
+ || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
+ || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS
+ || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION) {
+ return true;
+ }
+ return false;
+ }
+
+
+ /**
+ * 把ip地址格式化为:000.000.000.000
+ * @param ip
+ * @return 返回规格ip
+ */
+ public static String strfullip(String ip){
+ StringBuffer buff = new StringBuffer();
+ buff.append("");
+ String strzero = "000";
+ int ilen = 0;
+ if(ip != null){
+ String[] arrip = ip.split("\\.");
+ if(arrip.length == INT4){
+ for(int i = 0; i < INT4; i++){
+ if (i==0){
+ ilen = arrip[i].length();
+ if(ilen < INT3){
+ buff.append(strzero.substring(0,INT3-ilen)).append(arrip[i]);
+ }else{
+ buff.append(arrip[i]);
+ }
+ }else{
+ ilen = arrip[i].length();
+ if(ilen < INT3){
+ buff.append(".").append(strzero.substring(0,INT3-ilen)).append(arrip[i]);
+ }else{
+ buff.append(".").append(arrip[i]);
+ }
+ }
+ }
+ }
+ }
+ return buff.toString();
+ }
+
+ /**
+ * 根据传入的字符串和编码取得对应的编码的字符串,主要用于前后台参数传递场景,防止出现乱码
+ * @param str
+ * @param charSet
+ * @return String
+ */
+ public static String getStringByCharset(String str, String charSet){
+ if (isEmpty(str)||isEmpty(charSet)) {
+ return null;
+ }
+ try {
+ return String.valueOf(str.getBytes(charSet));
+ } catch (UnsupportedEncodingException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * 根据源字符串和编码取得字符串,并获取处理后的字符串长度
+ * @param str
+ * @param charSet
+ * @return int
+ */
+ public static int getStringByLength(String str, String charSet){
+ str = getStringByCharset(str,charSet);
+ if(availableStr(str)){
+ return str.length();
+ }else{
+ return 0;
+ }
+ }
+
+ /**
+ * 将容易引起xss漏洞的半角字符直接替换成全角字符
+ * @param s 原始字符串
+ * @return 替换危险字符之后的字符串
+ */
+ public static String xssEncode(String s) {
+ if (s == null || "".equals(s)) {
+ return s;
+ }
+ StringBuilder sb = new StringBuilder(s.length() + INT16);
+ for (int i = 0; i < s.length(); i++) {
+ char c = s.charAt(i);
+ switch (c) {
+ case '>':
+ sb.append('>');// 全角大于号
+ break;
+ case '<':
+ sb.append('<');// 全角小于号
+ break;
+// case '\'':
+// sb.append('‘');// 全角单引号
+// break;
+// case '\"':
+// sb.append('“');// 全角双引号
+// break;
+// case '&':
+// sb.append('&');// 全角
+// break;
+// case '%':
+// sb.append('%');// 全角
+// break;
+ case '+':
+ sb.append("+");// 全角
+ break;
+ case ';':
+ sb.append(";");// 全角
+ break;
+ case '\\':
+ sb.append('\');// 全角斜线
+ break;
+// case '/':
+// sb.append('/');// 全角斜线
+// break;
+ case '#':
+ sb.append('#');// 全角井号
+ break;
+// case ':':
+// sb.append(':');// 全角冒号
+// break;
+ default:
+ sb.append(c);
+ break;
+ }
+ }
+ return sb.toString();
+ }
+
+ /**
+ * 判断是否有中文字符并转换为英文
+ * @param s 入参
+ * @return String 处理后的参数
+ */
+ public static String conversionCharacter(String s){
+ final String REG_EX = "[ _`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?]|\n|\r|\t";
+ Pattern p = Pattern.compile(REG_EX);
+ Matcher m = p.matcher(s);
+ boolean b = m.find();
+ if (b){
+ s=toSemiangle(s) ;
+ }
+ return s.replaceAll("\\s*","");
+ }
+
+ /**
+ * 全角转半角
+ * @param src
+ * @return String
+ */
+ public static String toSemiangle(String src) {
+ char[] c = src.toCharArray();
+ for (int index = 0; index < c.length; index++) {
+ // 全角空格
+ if (c[index] == 12288) {
+ c[index] = (char) 32;
+ // 其他全角字符
+ } else if (c[index] > 65280 && c[index] < 65375) {
+ c[index] = (char) (c[index] - 65248);
+ }
+ }
+ return String.valueOf(c).intern();
+ }
+ /**
+ * 获取uuid
+ * @return string
+ * */
+ public static String getUUid()
+ {
+ return UUID.randomUUID().toString().replaceAll("-","");
+ }
+}
diff --git a/src/main/java/com/pms/ocp/common/exception/BeagleException.java b/src/main/java/com/pms/ocp/common/exception/BeagleException.java
new file mode 100644
index 0000000000000000000000000000000000000000..84d6f3f30b924bd0906c870003fdf993e057d8e1
--- /dev/null
+++ b/src/main/java/com/pms/ocp/common/exception/BeagleException.java
@@ -0,0 +1,44 @@
+package com.pms.ocp.common.exception;
+
+import lombok.Getter;
+
+/**
+ * @author wuwanli
+ * @date 2021/8/3
+ */
+public class BeagleException extends RuntimeException {
+ /**
+ * 错误码
+ */
+ @Getter
+ protected String errorCode;
+ /**
+ * 错误信息
+ */
+ @Getter
+ protected String errorMsg;
+
+ public BeagleException() {
+ super();
+ }
+
+ public BeagleException(String errorMsg) {
+ super(errorMsg);
+ this.errorMsg = errorMsg;
+ }
+ public BeagleException(String errorCode, String errorMsg) {
+ super(errorMsg);
+ this.errorCode = errorCode;
+ this.errorMsg = errorMsg;
+ }
+
+ public BeagleException(String errorMsg, Throwable cause) {
+ super(errorMsg, cause);
+ }
+
+ public BeagleException(String errorCode, String errorMsg, Throwable cause) {
+ super(errorCode, cause);
+ this.errorCode = errorCode;
+ this.errorMsg = errorMsg;
+ }
+}
diff --git a/src/main/java/com/pms/ocp/common/exception/GlobalExceptionHandler.java b/src/main/java/com/pms/ocp/common/exception/GlobalExceptionHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..5724c55a3ffff48430f8d359ca9845b88edb2929
--- /dev/null
+++ b/src/main/java/com/pms/ocp/common/exception/GlobalExceptionHandler.java
@@ -0,0 +1,39 @@
+package com.pms.ocp.common.exception;
+
+import com.pms.ocp.common.utils.BeagleStringUtils;
+import com.pms.ocp.model.vo.BaseResponse;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+import com.pms.ocp.common.constants.CodeEnum;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * @author wuwanli
+ * @version 1.0
+ * @date 2021/8/5
+ */
+@Slf4j
+@RestControllerAdvice
+public class GlobalExceptionHandler {
+
+ @ExceptionHandler(value = BeagleException.class)
+ public BaseResponse beagleExceptionHandler(BeagleException beagleException) {
+ log.error("GlobalExceptionHandler.beagleExceptionHandler", beagleException);
+ BaseResponse baseResponse = new BaseResponse();
+ if (BeagleStringUtils.isBlank(beagleException.getErrorCode())) {
+ baseResponse.setResponseCode(CodeEnum.UNKNOWN);
+ } else {
+ baseResponse.setCode(beagleException.getErrorCode());
+ baseResponse.setDesc(beagleException.getErrorMsg());
+ }
+ return baseResponse;
+ }
+
+ @ExceptionHandler(value = Exception.class)
+ public BaseResponse exceptionHandler(Exception exception) {
+ log.error("GlobalExceptionHandler.exceptionHandler", exception);
+ return new BaseResponse(CodeEnum.UNKNOWN);
+ }
+}
diff --git a/src/main/java/com/pms/ocp/common/exception/ServiceException.java b/src/main/java/com/pms/ocp/common/exception/ServiceException.java
new file mode 100644
index 0000000000000000000000000000000000000000..375171444021480282fb0da692953b93082fc853
--- /dev/null
+++ b/src/main/java/com/pms/ocp/common/exception/ServiceException.java
@@ -0,0 +1,64 @@
+package com.pms.ocp.common.exception;
+
+import com.pms.ocp.common.constants.ResultCode;
+
+/**
+ * @Auther: wangjian
+ * @Date: 2022/3/11 16:31
+ * @Description:
+ */
+public class ServiceException extends RuntimeException {
+
+ /**
+ * 自定义异常枚举类
+ */
+ private ResultCode resultCode;
+
+ /**
+ * 错误码
+ */
+ private int code;
+
+ /**
+ * 错误信息
+ */
+ private String errorMsg;
+
+
+ public ServiceException() {
+ super();
+ }
+
+ public ServiceException(ResultCode resultCode) {
+ super("{code:" + resultCode.getStatusCode() + ",errorMsg:" + resultCode.getMessage() + "}");
+ this.resultCode = resultCode;
+ this.code = resultCode.getStatusCode();
+ this.errorMsg = resultCode.getMessage();
+ }
+
+ public ServiceException(int code, String errorMsg) {
+ super("{code:" + code + ",errorMsg:" + errorMsg + "}");
+ this.code = code;
+ this.errorMsg = errorMsg;
+ }
+
+ public ResultCode getErrorEnum() {
+ return resultCode;
+ }
+
+ public String getErrorMsg() {
+ return errorMsg;
+ }
+
+ public void setErrorMsg(String errorMsg) {
+ this.errorMsg = errorMsg;
+ }
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+}
diff --git a/src/main/java/com/pms/ocp/common/handler/MYLocalDateTimeTypeHandler.java b/src/main/java/com/pms/ocp/common/handler/MYLocalDateTimeTypeHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..8efbd9f9b6502b81d390793eb80696cfb93f59d0
--- /dev/null
+++ b/src/main/java/com/pms/ocp/common/handler/MYLocalDateTimeTypeHandler.java
@@ -0,0 +1,54 @@
+package com.pms.ocp.common.handler;
+
+import org.apache.ibatis.type.LocalDateTimeTypeHandler;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Timestamp;
+import java.time.LocalDateTime;
+import java.time.ZoneOffset;
+
+/**
+ * @Auther: wangjian
+ * @Date: 2022/3/10 10:10
+ * @Description:时间类型处理器
+ */
+public class MYLocalDateTimeTypeHandler extends LocalDateTimeTypeHandler {
+// @Override
+// public LocalDateTime getNullableResult(ResultSet rs, String columnName) throws SQLException {
+// Timestamp timestamp = rs.getTimestamp(columnName);
+// Long remindTime = timestamp.getTime();
+// return LocalDateTime.ofEpochSecond(remindTime,0, ZoneOffset.ofHours(8));
+// }
+
+
+// @Override
+// public LocalDateTime getResult(ResultSet rs, String columnName) throws SQLException {
+// Object object = rs.getObject(columnName);
+// System.out.println(object);
+// if (object instanceof java.sql.Timestamp) {//在这里强行转换,将sql的时间转换为LocalDateTime
+// //可以根据自己的需要进行转化
+// return LocalDateTime.ofInstant(((Timestamp) object).toInstant(), ZoneOffset.ofHours(0));
+// }
+// return super.getResult(rs, columnName);
+// }
+
+ @Override
+ public LocalDateTime getResult(ResultSet rs, String columnName) throws SQLException {
+ Object object = rs.getObject(columnName);
+ if (object == null) {
+ return null;
+ }
+
+// System.out.println(object);
+ // 如有需要 在这里强行转换,将sql的时间转换为LocalDateTime
+ if (object instanceof java.sql.Timestamp) {
+ //可以根据自己的需要进行转化
+ return LocalDateTime.ofInstant(((Timestamp) object).toInstant(), ZoneOffset.ofHours(8));
+ }
+
+ return super.getResult(rs, columnName);
+ }
+
+
+}
diff --git a/src/main/java/com/pms/ocp/common/handler/TimestampTypeHandler.java b/src/main/java/com/pms/ocp/common/handler/TimestampTypeHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..dab5ce2a0827d17d63cadc6d2391c55fea2c3b3d
--- /dev/null
+++ b/src/main/java/com/pms/ocp/common/handler/TimestampTypeHandler.java
@@ -0,0 +1,66 @@
+package com.pms.ocp.common.handler;
+
+import org.apache.ibatis.type.BaseTypeHandler;
+import org.apache.ibatis.type.JdbcType;
+import org.apache.ibatis.type.MappedJdbcTypes;
+import org.apache.ibatis.type.MappedTypes;
+import org.postgresql.util.PGTimestamp;
+
+import java.sql.*;
+import java.time.LocalDateTime;
+
+/**
+ * @Auther: wangjian
+ * @Date: 2022/3/10 09:43
+ * @Description:
+ */
+@MappedTypes({LocalDateTime.class})
+@MappedJdbcTypes({JdbcType.OTHER})
+public class TimestampTypeHandler extends BaseTypeHandler {
+ @Override
+ public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
+ Timestamp p = null;
+ if (parameter != null) {
+ if (parameter instanceof LocalDateTime) {
+ PGTimestamp.valueOf(LocalDateTime.now());
+ p = PGTimestamp.valueOf((LocalDateTime) parameter);
+ }
+ ps.setObject(i, p);
+ }
+ }
+
+ /**
+ * Gets the nullable result.
+ *
+ * @param rs the rs
+ * @param columnName Colunm name, when configuration useColumnLabel
is false
+ * @return the nullable result
+ * @throws SQLException the SQL exception
+ */
+ @Override
+ public Object getNullableResult(ResultSet rs, String columnName) throws SQLException {
+ return toFill(rs.getObject(columnName));
+ }
+
+ @Override
+ public Object getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
+ return toFill(rs.getObject(columnIndex));
+ }
+
+ @Override
+ public Object getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
+ return toFill(cs.getObject(columnIndex));
+ }
+
+ private Object toFill(Object v) {
+ if (v != null) {
+ if (v instanceof PGTimestamp) {
+ PGTimestamp p = (PGTimestamp) v;
+ return p.toLocalDateTime();
+ } else if (v instanceof Timestamp) {
+ return ((Timestamp) v).toLocalDateTime();
+ }
+ }
+ return v;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/pms/ocp/common/utils/BeagleStringUtils.java b/src/main/java/com/pms/ocp/common/utils/BeagleStringUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..563349ce31a8b5fb5d42af1fc92c08fd1e5bdce1
--- /dev/null
+++ b/src/main/java/com/pms/ocp/common/utils/BeagleStringUtils.java
@@ -0,0 +1,26 @@
+package com.pms.ocp.common.utils;
+
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * 字符串工具类
+ *
+ * @author wuwanli
+ * @version 1.0
+ * @date 2021/8/4
+ */
+public class BeagleStringUtils {
+
+ public static boolean isBlank(CharSequence cs) {
+ return StringUtils.isBlank(cs);
+ }
+ public static boolean isEmpty(CharSequence cs) {
+ return StringUtils.isEmpty(cs);
+ }
+ public static boolean isNotBlank(CharSequence cs) {
+ return StringUtils.isNotBlank(cs);
+ }
+ public static boolean isNotEmpty(CharSequence cs) {
+ return StringUtils.isNotEmpty(cs);
+ }
+}
diff --git a/src/main/java/com/pms/ocp/common/utils/DataStructureHandleUtils.java b/src/main/java/com/pms/ocp/common/utils/DataStructureHandleUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..d23dd3b63140087cdda860643a923e950f070ac9
--- /dev/null
+++ b/src/main/java/com/pms/ocp/common/utils/DataStructureHandleUtils.java
@@ -0,0 +1,79 @@
+package com.pms.ocp.common.utils;
+
+import org.apache.commons.lang3.StringUtils;
+
+import java.lang.reflect.Field;
+import java.math.BigDecimal;
+import java.sql.Date;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Auther: wangjian
+ * @Date: 2022/3/12 13:29
+ * @Description:数据结构处理工具类
+ */
+public class DataStructureHandleUtils {
+ /**
+ * List