提交 7a20c95f authored 作者: ww1xhqc's avatar ww1xhqc

[Initial commit]

上级
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.tykj</groupId>
<artifactId>annual-performance-indicators</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>annual-performance-indicators</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.test</groupId>
<artifactId>oscarJDBC16</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>com.hxh</groupId>
<artifactId>oscarSb</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>com.github.caspar-chen</groupId>
<artifactId>swagger-ui-layer</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.8.0</version>
<exclusions>
<exclusion>
<artifactId>javassist</artifactId>
<groupId>org.javassist</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.12.3</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.54</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.github.wenhao</groupId>
<artifactId>jpa-spec</artifactId>
<version>3.1.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
# 年度绩效评价指标体系
\ No newline at end of file
package com.tykj;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @author HASEE
*/
@SpringBootApplication
public class AnnualPerformanceIndicatorsApplication {
public static void main(String[] args) {
SpringApplication.run(AnnualPerformanceIndicatorsApplication.class, args);
}
}
package com.tykj.datawarehouse.base.aop;
import com.tykj.datawarehouse.base.entity.BaseEntity;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
import java.util.Date;
import static java.util.Objects.isNull;
/**
* @author C
*/
@Aspect
@Component
public class EntityHandle {
@Before("execution(* org.springframework.data.repository.CrudRepository.save(..)) && args(com.tykj.datawarehouse.base.entity.BaseEntity))")
public void checkTimes(JoinPoint point) {
Object[] args = point.getArgs();
for (Object arg : args) {
if (arg instanceof BaseEntity){
BaseEntity entity = (BaseEntity) arg;
if (isNull(entity.getCreatedTime())){
entity.setCreatedTime(new Date());
}
entity.setUpdatedTime(new Date());
}
}
}
}
package com.tykj.datawarehouse.base.config;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.ser.std.DateSerializer;
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.module.paramnames.ParameterNamesModule;
import com.tykj.datawarehouse.base.util.DateFormatUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;
/**
* 描述:使jackson能够正确的接收时间格式
* @author HuangXiahao
* @version V1.0
* @class Java8TimeConfig
* @packageName com.example.personnelmanager.common.config
* @data 2020/5/20
**/
@Configuration
public class Java8TimeConfig {
@Value("${spring.jackson.date-format}")
private String formatValue;
@Bean(name = "format")
DateTimeFormatter format() {
return DateTimeFormatter.ofPattern(formatValue);
}
@Bean
public ObjectMapper serializingObjectMapper(@Qualifier("format") DateTimeFormatter format) {
JavaTimeModule javaTimeModule = new JavaTimeModule();
javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(format));
javaTimeModule.addSerializer(Instant.class, new InstantCustomSerializer(format));
javaTimeModule.addSerializer(Date.class, new DateSerializer(false, new SimpleDateFormat(formatValue)));
javaTimeModule.addDeserializer(Instant.class, new InstantCustomDeserializer());
javaTimeModule.addDeserializer(Date.class, new DateCustomDeserializer());
return new ObjectMapper()
.registerModule(new ParameterNamesModule())
.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
.registerModule(javaTimeModule);
}
static class InstantCustomSerializer extends JsonSerializer<Instant> {
private final DateTimeFormatter format;
private InstantCustomSerializer(DateTimeFormatter formatter) {
this.format = formatter;
}
@Override
public void serialize(Instant instant, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
if (instant == null) {
return;
}
String jsonValue = format.format(instant.atZone(ZoneId.systemDefault()));
jsonGenerator.writeString(jsonValue);
}
}
static class InstantCustomDeserializer extends JsonDeserializer<Instant>{
@Override
public Instant deserialize(JsonParser p, DeserializationContext ctxt)
throws IOException {
String dateString = p.getText().trim();
if(StringUtils.isNotBlank(dateString)){
Date pareDate;
try {
pareDate = DateFormatUtil.pareDate(dateString);
if(null != pareDate){
return pareDate.toInstant();
}
} catch (ParseException e) {
e.printStackTrace();
}
}
return null;
}
}
static class DateCustomDeserializer extends JsonDeserializer<Date>{
@Override
public Date deserialize(JsonParser p, DeserializationContext ctxt)
throws IOException {
String dateString = p.getText().trim();
if(StringUtils.isNotBlank(dateString)){
try {
return DateFormatUtil.pareDate(dateString);
} catch (ParseException e) {
e.printStackTrace();
}
}
return null;
}
}
/**
* Support for Java date and time API.
* @return the corresponding Jackson module.
*/
@Bean
public JavaTimeModule javaTimeModule() {
return new JavaTimeModule();
}
@Bean
public Jdk8Module jdk8TimeModule() {
return new Jdk8Module();
}
}
\ No newline at end of file
package com.tykj.datawarehouse.base.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
/**
* @author zsp
* @version V1.0
* @class WebMvcConfig
* @packageName com.example.personnelmanager.common.config
* @data 2020/6/11
**/
@Configuration
@EnableSwagger2
public class WebMvcConfig implements WebMvcConfigurer {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOriginPatterns("*")
.allowCredentials(true)
.allowedMethods("GET", "POST", "DELETE", "PUT", "PATCH")
.maxAge(3600);
}
};
}
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
// 自行修改为自己的包路径
.apis(RequestHandlerSelectors.basePackage("com.tykj"))
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("数据模型")
.description("数据模型")
.version("1.1")
.build();
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// 这里之所以多了一"/",是为了解决打war时访问不到问题
registry.addResourceHandler("/webs/**").addResourceLocations("classpath:/webs/");
}
}
package com.tykj.datawarehouse.base.consumer;
import java.util.Objects;
/**
* @Description TODO
* @Author WWW
* @Date 2021/7/5 17:28
*/
@FunctionalInterface
public interface FourComsumer<T, Y, U, I> {
/**
* accept
* @param t
* @param y
* @param u
* @param i
*/
void accept(T t, Y y, U u, I i);
/**
* andThen
* @param after
* @return
*/
default FourComsumer<T, Y, U, I> andThen(FourComsumer<? super T, ? super Y, ? super U, ? super I> after) {
Objects.requireNonNull(after);
return (l, y, u, i) -> {
accept(l, y, u, i);
after.accept(l, y, u, i);
};
}
}
package com.tykj.datawarehouse.base.entity;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.persistence.*;
import java.util.Date;
/**
* @author HuangXiahao
* @version V1.0
* @class BaseEntity
* @packageName com.example.demo.entity
**/
@Data
@MappedSuperclass
public abstract class BaseEntity {
@Id
@SequenceGenerator(sequenceName = "SEQUENCE",name = "t1",allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "t1")
@ApiModelProperty("主键")
protected Integer id;
@ApiModelProperty("创建时间")
@Temporal(TemporalType.TIMESTAMP)
@JsonFormat(pattern = "yyyy-MM-dd hh:mm")
protected Date createdTime;
@ApiModelProperty("修改时间")
@Temporal(TemporalType.TIMESTAMP)
@JsonFormat(pattern = "yyyy-MM-dd hh:mm")
protected Date updatedTime;
@ApiModelProperty("逻辑删除 0为 false 1为 true")
protected Integer deleted = 0;
}
package com.tykj.datawarehouse.base.entity;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.id.SequenceGenerator;
import java.io.Serializable;
import java.util.HashMap;
/**
* @author HuangXiahao
* @version V1.0
* @class UUIDHexGenerator
* @packageName com.tykj.base.entity
**/
public class XMQGenerator extends SequenceGenerator {
public XMQGenerator () {
super();
}
@Override
public Serializable generate(SharedSessionContractImplementor s, Object obj) {
if (obj instanceof HashMap){
HashMap hashMap = (HashMap) obj;
if (hashMap.containsKey("id")){
return (Serializable) hashMap.get("id");
};
}
return super.generate(s, obj);
}
}
package com.tykj.datawarehouse.base.page;
import lombok.Data;
import org.springframework.data.domain.Sort;
/**
* 描述:Jpa排序类
*
* @author HuangXiahao
* @version V1.0
* @data 2020/5/13
**/
@Data
public class JpaCustomOrder {
private String coulmn;
private Sort.Direction direction;
}
package com.tykj.datawarehouse.base.page;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.util.Assert;
import java.util.ArrayList;
import java.util.List;
/**
* JPA分页类
* @author HuangXiahao
* @class CustomOrder
* @data 2020/5/13
**/
public class JpaCustomPage {
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private Integer page = 0;
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private Integer size = 15;
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private List<JpaCustomOrder> orders = new ArrayList<>();
public Integer getPage() {
return page;
}
public void setPage(Integer page) {
this.page = page;
}
public Integer getSize() {
return size;
}
public void setSize(Integer size) {
Assert.isTrue(page >= 0, "分页信息错误!");
this.size = size;
}
public List<JpaCustomOrder> getOrders() {
return orders;
}
public void setOrders(List<JpaCustomOrder> orders) {
this.orders = orders;
}
@JsonIgnore
public long getOffset() {
return page * size;
}
@JsonIgnore
public Integer getLimit() {
return size;
}
@JsonIgnore
public PageRequest getPageable() {
if (orders.size() != 0) {
List<Sort.Order> orders = new ArrayList<>();
this.orders.stream().forEach(item ->
orders.add(new Sort.Order(item.getDirection(), item.getCoulmn())));
return PageRequest.of(getPage(), getLimit(), Sort.by(orders));
}
return PageRequest.of(getPage(), getLimit());
}
}
package com.tykj.datawarehouse.base.result;
import org.springframework.http.ResponseEntity;
/**
* 全局错误处理类,用于处理一些不容易定义的错误
*
* @author HuangXiahao
**/
public class ApiException extends RuntimeException {
private ResponseEntity responseEntity;
public ApiException(ResponseEntity responseEntity) {
this.responseEntity = responseEntity;
}
public ApiException(String message) {
this.responseEntity = ResponseEntity.status(500).body(new ResultObj("",message));
}
public ApiException( Object data,String message) {
this.responseEntity = ResponseEntity.status(500).body(new ResultObj(data, message));
}
public ResponseEntity getResponseEntity() {
return responseEntity;
}
public void setResponseEntity(ResponseEntity responseEntity) {
this.responseEntity = responseEntity;
}
}
package com.tykj.datawarehouse.base.result;
import com.fasterxml.jackson.databind.exc.InvalidFormatException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import java.sql.SQLSyntaxErrorException;
/**
* 错误处理类
* 所有的报错信息都会通过本层的方法向外界返回
*
* @author HuangXiahao
**/
@Order(Ordered.HIGHEST_PRECEDENCE)
@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
/**
* 业务错误
*
* @param e 报错信息
*/
@ResponseBody
@ExceptionHandler(ApiException.class)
public ResponseEntity errorMessage(ApiException e) {
log.warn("[自定义异常] {}", e.toString());
e.printStackTrace();
if (e.getResponseEntity() != null) {
return e.getResponseEntity();
}
return ResultUtil.failed(e.getMessage());
}
/**
* 处理字段长度异常
* @param invalidFormatException
* @return
*/
@ExceptionHandler(InvalidFormatException.class)
public ResponseEntity handle(InvalidFormatException invalidFormatException){
log.warn(invalidFormatException.toString());
return ResultUtil.failed("字段长度错误,请修改为合适的长度!");
}
@ExceptionHandler(SQLSyntaxErrorException.class)
public ResponseEntity handleSQl(InvalidFormatException invalidFormatException){
log.warn(invalidFormatException.toString());
return ResultUtil.failed("列名不合法,请修改列名!");
}
}
package com.tykj.datawarehouse.base.result;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author dengdiyi
* @description 接口返回统一标准类
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonPropertyOrder(value = {"message", "data"})
public class ResultObj<T> {
private T data;
private String message;
public ResultObj(T o) {
this.data = o;
this.message = "no message";
}
}
package com.tykj.datawarehouse.base.result;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
/**
* @author HuangXiahao
* @version V1.0
* @class ResultMessage
* @packageName com.example.hello.demo.resultObject
**/
public class ResultUtil<T> {
/**
* 成功返回结果
*
* @param data 获取的数据
*/
public static <T> ResponseEntity<ResultObj<T>> success(T data,String message) {
return ResponseEntity.ok(new ResultObj<>(data,message));
}
/**
* 成功返回结果
*/
public static <T> ResponseEntity<ResultObj<T>> success(String message) {
return ResponseEntity.ok(new ResultObj<>(null,message));
}
/**
* 成功返回结果
*
* @param data 获取的数据
*/
public static <T> ResponseEntity success(T data, HttpHeaders headers) {
return new ResponseEntity(new ResultObj(data), headers, HttpStatus.OK);
}
/**
* 失败返回结果
*/
public static <T> ResponseEntity failed() {
return ResponseEntity.status(500).body(new ResultObj("服务器内部发生错误"));
}
/**
* 失败返回结果
*/
public static <T> ResponseEntity failed(T content) {
return new ResponseEntity(new ResultObj(content), HttpStatus.INTERNAL_SERVER_ERROR);
}
/**
* 失败返回结果
*/
public static <T> ResponseEntity failed(HttpStatus httpStatus) {
return new ResponseEntity(httpStatus);
}
/**
* 失败返回结果
*/
public static <T> ResponseEntity failed(HttpStatus httpStatus, T content) {
return new ResponseEntity(new ResultObj(content), httpStatus);
}
/**
* 参数验证失败返回结果
*/
public static <T> ResponseEntity validateFailed(T content) {
return failed(HttpStatus.INTERNAL_SERVER_ERROR, content);
}
/**
* 未登录返回结果
*/
public static <T> ResponseEntity unauthorized() {
return failed(HttpStatus.UNAUTHORIZED);
}
/**
* 未授权返回结果
*/
public static <T> ResponseEntity forbidden() {
return failed(HttpStatus.FORBIDDEN);
}
}
package com.tykj.datawarehouse.base.util;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
public class ClassUtil {
/**
* 读取项目中所有Class 并以Class对象的集合返回
* @param load ClassLoader
* @return Class对象集合
*/
public static List<Class<?>> loadClassByLoader(ClassLoader load) {
List<Class<?>> classes = new ArrayList<>();
try {
Enumeration<URL> urls = load.getResources("");
//放所有类型
while (urls.hasMoreElements()) {
URL url = urls.nextElement();
//文件类型(其实是文件夹)
if (url.getProtocol().equals("file")) {
loadClassByPath(null, url.getPath(), classes, load);
}
}
} catch (IOException e) {
e.printStackTrace();
}
return classes;
}
/**
* 通过文件路径加载所有类 root 主要用来替换path中前缀(除包路径以外的路径)
*/
private static void loadClassByPath(String root, String path, List<Class<?>> list, ClassLoader load) {
File f = new File(path);
if (root == null) {
root = f.getPath();
}
//判断是否是class文件
if (f.isFile() && f.getName().matches("^.*\\.class$")) {
try {
String classPath = f.getPath();
//截取出className 将路径分割符替换为.(windows是\ linux、mac是/)
String className = classPath.substring(root.length() + 1, classPath.length() - 6).replace('/', '.').replace('\\', '.');
list.add(load.loadClass(className));
} catch (Exception ex) {
ex.printStackTrace();
}
} else {
File[] fs = f.listFiles();
if (fs == null) {
return;
}
for (File file : fs) {
loadClassByPath(root, file.getPath(), list, load);
}
}
}
}
package com.tykj.datawarehouse.base.util;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.FastDateFormat;
import java.text.ParseException;
import java.time.Instant;
import java.util.Date;
/**
* 时间格式化工具工具
*
* @author HuangXiahao
* @version V1.0
* @class DateFormatUtil
* @packageName com.example.personnelmanager.common.utils
* @data 2020/5/20
**/
public class DateFormatUtil {
public static final String SYMBOL_DOT = "\\.";
/**
* 日期正则yyyy-MM
*/
public static final String DATE_REGEX_YYYYMM = "^\\d{4}-\\d{1,2}$";
/**
* 日期正则yyyy-MM-dd
*/
public static final String DATE_REGEX_YYYYMMDD = "^\\d{4}-\\d{1,2}-\\d{1,2}$";
/**
* 日期正则yyyy-MM-dd hh:mm
*/
public static final String DATE_REGEX_YYYYMMDDHHMM = "^\\d{4}-\\d{1,2}-\\d{1,2} \\d{1,2}:\\d{1,2}$";
/**
* 日期正则yyyy-MM-dd hh:mm:ss
*/
public static final String DATE_REGEX_YYYYMMDDHHMMSS = "^\\d{4}-\\d{1,2}-\\d{1,2} \\d{1,2}:\\d{1,2}:\\d{1,2}$";
/**
* Instant日期秒+纳秒
*/
public static final String DATE_REGEX_SECOND_DOT_NANOSECOND = "^[0-9]+\\.[0-9]{1,9}$";
/**
* 日期正则yyyy-MM-dd'T'HH:mm:ssZ
*/
public static final String DATE_REGEX_YYYYMMDD_T_HHMMSS_Z = "^\\d{4}-\\d{1,2}-\\d{1,2}T\\d{1,2}:\\d{1,2}:\\d{1,2}Z$";
/**
* 日期正则yyyy-MM-dd'T'HH:mm:ssZ
*/
public static final String DATE_REGEX_YYYYMMDD_T_HHMMSS_SSS_Z = "^\\d{4}-\\d{1,2}-\\d{1,2}T\\d{1,2}:\\d{1,2}:\\d{1,2}\\.\\d{1,3}Z$";
/**
* 以T分隔日期和时间,并带时区信息,符合ISO8601规范
*/
public static final String PATTERN_ISO = "yyyy-MM-dd'T'HH:mm:ss.SSSZZ";
public static final String PATTERN_ISO_ON_SECOND = "yyyy-MM-dd'T'HH:mm:ssZZ";
public static final String PATTERN_ISO_ON_DATE = "yyyy-MM-dd";
public static final String PATTERN_ISO_ON_MONTH = "yyyy-MM";
/**
* 以空格分隔日期和时间,不带时区信息
*/
public static final String PATTERN_DEFAULT = "yyyy-MM-dd HH:mm:ss.SSS";
public static final String PATTERN_DEFAULT_ON_SECOND = "yyyy-MM-dd HH:mm:ss";
public static final String PATTERN_DEFAULT_ON_MINUTE = "yyyy-MM-dd HH:mm";
//
/**
* 以T分隔日期和时间,并带时区信息,符合ISO8601规范
*/
public static final FastDateFormat ISO_FORMAT = FastDateFormat.getInstance(PATTERN_ISO);
public static final FastDateFormat ISO_ON_SECOND_FORMAT = FastDateFormat.getInstance(PATTERN_ISO_ON_SECOND);
public static final FastDateFormat ISO_ON_DATE_FORMAT = FastDateFormat.getInstance(PATTERN_ISO_ON_DATE);
public static final FastDateFormat ISO_ON_MONTH_FORMAT = FastDateFormat.getInstance(PATTERN_ISO_ON_MONTH);
/**
* 以空格分隔日期和时间,不带时区信息
*/
public static final FastDateFormat DEFAULT_FORMAT = FastDateFormat.getInstance(PATTERN_DEFAULT);
public static final FastDateFormat DEFAULT_ON_SECOND_FORMAT = FastDateFormat.getInstance(PATTERN_DEFAULT_ON_SECOND);
public static final FastDateFormat DEFAULT_ON_MINUTE_FORMAT = FastDateFormat.getInstance(PATTERN_DEFAULT_ON_MINUTE);
/**
* 将日期格式的字符串转换成指定格式的日期
* @param pattern 日期格式
* @param dateString 日期字符串
* @return
* @throws ParseException
*/
public static Date pareDate( String pattern, String dateString) throws ParseException {
return FastDateFormat.getInstance(pattern).parse(dateString);
}
/**
* 将日期格式的字符串根据正则转换成相应格式的日期
* @param dateString 日期字符串
* @return
* @throws ParseException
*/
public static Date pareDate( String dateString) throws ParseException {
String source = dateString.trim();
if (StringUtils.isNotBlank(source)) {
if(source.matches(DATE_REGEX_YYYYMM)){
return ISO_ON_MONTH_FORMAT.parse(source);
}else if(source.matches(DATE_REGEX_YYYYMMDD)){
return ISO_ON_DATE_FORMAT.parse(source);
}else if(source.matches(DATE_REGEX_YYYYMMDDHHMM)){
return DEFAULT_ON_MINUTE_FORMAT.parse(source);
}else if(source.matches(DATE_REGEX_YYYYMMDDHHMMSS)){
return DEFAULT_ON_SECOND_FORMAT.parse(source);
}else if(source.matches(DATE_REGEX_YYYYMMDD_T_HHMMSS_Z)){
return ISO_ON_SECOND_FORMAT.parse(source);
}else if(source.matches(DATE_REGEX_YYYYMMDD_T_HHMMSS_SSS_Z)){
return ISO_FORMAT.parse(source);
}else if(source.matches(DATE_REGEX_SECOND_DOT_NANOSECOND)){
String[] split = source.split(SYMBOL_DOT);
return Date.from(Instant.ofEpochSecond(Long.parseLong(split[0]), Long.parseLong(split[1])));
}else {
throw new IllegalArgumentException("Invalid date value '" + source + "'");
}
}
return null;
}
}
package com.tykj.datawarehouse.base.util;
import java.io.*;
/**
* @author HuangXiahao
* @version V1.0
* @class FileUtil
* @packageName com.tykj.workflowcore.base.util
**/
public class FileUtil {
public static File createFileByString(String filePath,String fileString){
File f = null;
try {
f = new File(filePath);
// 判断文件是否存在
if(!f.exists()){
f.createNewFile();
}
} catch (Exception e) {
e.printStackTrace();
}
BufferedReader bufferedReader = null;
BufferedWriter bufferedWriter = null;
try {
bufferedReader = new BufferedReader(new StringReader(fileString));
bufferedWriter = new BufferedWriter(new FileWriter(f));
//字符缓冲区
char buf[] = new char[1024];
int len;
while ((len = bufferedReader.read(buf)) != -1) {
bufferedWriter.write(buf, 0, len);
}
bufferedWriter.flush();
bufferedReader.close();
bufferedWriter.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return f;
}
}
package com.tykj.datawarehouse.model.controller;
import com.tykj.datawarehouse.base.result.ApiException;
import com.tykj.datawarehouse.base.result.ResultUtil;
import com.tykj.datawarehouse.model.dao.QuoteDao;
import com.tykj.datawarehouse.model.dao.RuleDao;
import com.tykj.datawarehouse.model.entity.ColumnInfo;
import com.tykj.datawarehouse.model.entity.Quote;
import com.tykj.datawarehouse.model.entity.Rule;
import com.tykj.datawarehouse.model.entity.TableInfo;
import com.tykj.datawarehouse.model.entity.vo.*;
import com.tykj.datawarehouse.model.service.ModelService;
import com.tykj.datawarehouse.model.service.impl.ModelHelper;
import com.tykj.datawarehouse.model.utils.SessionUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.hibernate.Session;
import org.hibernate.internal.SessionImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/**
* @ClassName ModelController
* @Description TODO
* @Author WWW
* @Date 2021/2/26 13:35
* @Version 1.0
*/
@Slf4j
@RestController
@RequestMapping("/model")
@Api(tags = "数据模型层接口")
public class ModelController {
@Autowired
private ModelService modelService;
@Autowired
private ModelHelper modelHelper;
@Autowired
private QuoteDao quoteDao;
@Autowired
private RuleDao ruleDao;
@Autowired
SessionUtil sessionUtil;
/**
* @param
* @return java.util.List<com.tykj.workflowcore.model_layer.model.TableInfo>
* @Author WWW
* @Description 得到所有数据库信息
* @Date 16:19 2021/3/4
**/
@ApiOperation("得到所有数据表信息")
@PostMapping("/getAllEntity")
public ResponseEntity getAllEntity(@RequestBody SearchTableInfoVo searchTableInfoVo) {
Page<TableInfo> tableInfos;
tableInfos = modelService.pageAllEntities(searchTableInfoVo);
return ResultUtil.success(tableInfos, "数据查询成功!");
}
/**
* @return org.springframework.http.ResponseEntity
* @Author WWW
* @Description 根据表名查询所有数据
* @Date 9:30 2021/3/11
**/
@ApiOperation("根据表名查询所有数据")
@PostMapping("/getAll")
public ResponseEntity getAll(@RequestBody SearchAllVO searchAllVO) throws SQLException {
if (searchAllVO.getOrderConditions() != null && searchAllVO.getOrderConditions().size() > 0) {
return ResultUtil.success(modelService.findAllByName(searchAllVO.getTableName(), searchAllVO.getOrderConditions()), "查询成功!");
}
return ResultUtil.success(modelService.findAllByName(searchAllVO.getTableName()), "查询成功!");
}
/**
* @param searchColumnInfoVo
* @return java.util.List<com.tykj.workflowcore.model_layer.model.ColumnInfo>
* @Author WWW
* @Description 根据表名得到所有字段名
* @Date 16:20 2021/3/4
**/
@ApiOperation("根据表名或者id查询表中所有字段")
@PostMapping("/getAllField")
public ResponseEntity getFields(@RequestBody SearchColumnInfoVo searchColumnInfoVo) {
List<ColumnInfo> columnInfos = modelService.showModelFields(searchColumnInfoVo);
for (ColumnInfo columnInfo : columnInfos) {
List<Quote> allQuote = quoteDao.findAllByColumnId(columnInfo.getId());
Rule rule;
try {
rule = ruleDao.findAllByColumnId(columnInfo.getId());
} catch (Exception e) {
throw new ApiException("规则不唯一!");
}
columnInfo.setRule(rule);
columnInfo.setQuoteList(allQuote);
}
return ResultUtil.success(columnInfos, "数据查询成功!");
}
/**
* @param
* @return org.springframework.http.ResponseEntity
* @Author WWW
* @Description 新增数据模型
* @Date 16:21 2021/3/4
**/
@ApiOperation("新增数据模型")
@PostMapping(value = "/addModel")
public ResponseEntity addModel(@RequestBody TableVO tableVO) {
long start = System.currentTimeMillis();
modelService.newTable(tableVO);
long end = System.currentTimeMillis();
log.warn("创建总用时为:{}秒", (end - start) / 1000.0);
return ResultUtil.success("", "新建成功!");
}
/**
* @param map
* @return int
* @Author WWW
* @Description 对应表插入数据
* map (表名,字段数据)
* @Date 16:22 2021/3/4
**/
@ApiOperation(value = "根据表名表插入数据")
@PostMapping("/insertValues")
public ResponseEntity insertValues(@RequestBody Map<String, Object> map) {
SessionImpl session =(SessionImpl) sessionUtil.getSession();
int i = modelService.operationValueByEntityName(map,session,session::saveOrUpdate,modelService::validationAllRuleAndQuote);
if (i == 0) {
return ResultUtil.success("", "数据插入成功!");
}
return ResultUtil.failed("模型类型不支持插入数据!");
}
/**
* @param mapList
* @return int
* @Author WWW
* @Description 对应表插入数据
* map (表名,字段数据)
* @Date 16:22 2021/3/4
**/
@ApiOperation(value = "根据表名表插入数据")
@PostMapping("/insertValueList")
public ResponseEntity insertValueList(@RequestBody List<Map<String, Object>> mapList) {
SessionImpl session =(SessionImpl) sessionUtil.getSession();
int i = modelService.operationValueByEntityNameList(mapList,session,session::saveOrUpdate,modelService::validationAllRuleAndQuote);
if (i == 0) {
return ResultUtil.success("", "数据保存成功!");
}
return ResultUtil.failed("模型类型不支持插入数据!");
}
/**
* @param complexQueryVo
* @return 复杂查询
*/
@ApiOperation("复杂查询")
@PostMapping("/complexQuery")
public ResponseEntity complexQuery(@RequestBody complexQueryVo complexQueryVo) {
List list = modelService.complexQuery(complexQueryVo.getTableName(), complexQueryVo.getColumnNames(), complexQueryVo.getQueryConditions(), complexQueryVo.getGroupByColumn()
);
if (list != null) {
return ResultUtil.success(list, "查询成功!");
}
return ResultUtil.failed(null, "没有数据!");
}
/**
* @param complexQueryVo
* @return 复杂查询
*/
@ApiOperation("复杂查询(分类)")
@PostMapping("/complexQuery/group")
public ResponseEntity complexQueryWithGroup(@RequestBody complexQueryVo complexQueryVo) {
CustomPage customPage = modelService.complexQueryWithGroup(complexQueryVo.getTableName(), complexQueryVo.getGroupCondition(), complexQueryVo.getColumnNames(), complexQueryVo.getQueryConditions(), complexQueryVo.getGroupByColumn(), complexQueryVo.getPage(), complexQueryVo.getSize());
if (customPage.getContents() != null) {
return ResultUtil.success(customPage, "查询成功!");
}
return ResultUtil.failed(HttpStatus.INTERNAL_SERVER_ERROR, "没有数据!");
}
@ApiOperation("编辑操作")
@PutMapping("/update")
public ResponseEntity updateTable(@RequestBody UpdateTableInfoVO updateTableInfoVO) {
return modelService.updateTable(updateTableInfoVO);
// if (i == 1) {
// return ResultUtil.success("", "修改成功!");
// }
// return ResultUtil.failed("业务不支持修改!");
}
@ApiOperation("删除操作")
@DeleteMapping("/delete")
public ResponseEntity delTable(DelTableVO delTableVO) {
int i = modelService.delTable(delTableVO);
if (i == 1) {
return ResultUtil.success("", "删除成功!");
}
return ResultUtil.failed("业务类型不支持删除!");
}
@ApiOperation("获得获得非聚合对象example")
@GetMapping("/example")
public ResponseEntity getJSONExample(Integer id) {
return ResultUtil.success(modelHelper.getJsonExample(id),
"获得example成功!");
}
@ApiOperation("自定义SQL查询")
@PostMapping("/sql")
public ResponseEntity executeSql(String sql) {
try {
return ResultUtil.success(modelService.executeQuery(sql), "查询成功!");
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return ResultUtil.failed("SQL错误,查询失败!");
}
@ApiOperation("删除接口")
@PostMapping("/deleteValue")
public ResponseEntity deleteValue(@RequestBody Map<String, Object> map) {
SessionImpl session =(SessionImpl) sessionUtil.getSession();
int i = modelService.operationValueByEntityName(map,session,session::delete,null);
if (i == 0) {
return ResultUtil.success("", "数据删除成功!");
}
return ResultUtil.failed("数据删除失败!");
}
@ApiOperation("字段类型")
@GetMapping("/type")
public ResponseEntity type() {
//这代码狗都不改
List<ColumnTypeVO> columnTypeVOS = Arrays.asList(
new ColumnTypeVO("数字", "java.lang.Integer", "11")
, new ColumnTypeVO("浮点数", "java.lang.Double", "11")
, new ColumnTypeVO("单/多行文本", "java.lang.String", "255")
, new ColumnTypeVO("布尔值", "java.lang.Boolean", "1"));
return ResultUtil.success(columnTypeVOS, "查询成功!");
}
}
package com.tykj.datawarehouse.model.controller;
import com.tykj.datawarehouse.base.result.ResultUtil;
import com.tykj.datawarehouse.model.dao.ColumnInfoDao;
import com.tykj.datawarehouse.model.entity.Quote;
import com.tykj.datawarehouse.model.entity.vo.SearchQuoteVO;
import com.tykj.datawarehouse.model.entity.vo.UpdateQuoteVO;
import com.tykj.datawarehouse.model.service.QuoteService;
import com.tykj.datawarehouse.model.service.impl.ModelImpl;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
/**
* @Description TODO
* @Author WWW
* @Date 2021/5/17 15:57
*/
@Api(tags = "引用接口")
@RestController
@RequestMapping("/quote")
public class QuoteController {
@Autowired
private QuoteService quoteService;
@ApiOperation("引用删除")
@GetMapping("/delete")
public ResponseEntity deleteQuote(Integer id) {
Integer integer = quoteService.delQuote(id);
if (integer==1){
return ResultUtil.success("删除成功!");
}
return ResultUtil.failed("此id不存在,删除失败");
}
@ApiOperation("引用更新")
@PostMapping("/update")
public ResponseEntity UpdateQuote(@RequestBody UpdateQuoteVO updateQuoteVO) {
int i = quoteService.updateQuote(updateQuoteVO);
if (i==0){
return ResultUtil.success( "更新/保存成功!");
}
return ResultUtil.failed( "引用数据重复,导致更新/保存失败!");
}
@ApiOperation("查找所有引用")
@PostMapping("/getAllQuote")
public ResponseEntity getAllQuote(@RequestBody SearchQuoteVO searchQuoteVO) {
return ResultUtil.success(quoteService.getAllQuote(searchQuoteVO), "查询成功!");
}
@ApiOperation("保存引用")
@PostMapping("/saveQuote")
public ResponseEntity saveQuote(@RequestBody Quote quote) {
return ResultUtil.success(quoteService.saveQuote(quote), "保存成功!");
}
}
package com.tykj.datawarehouse.model.controller;
import com.tykj.datawarehouse.base.result.ResultUtil;
import com.tykj.datawarehouse.model.entity.vo.RuleVo;
import com.tykj.datawarehouse.model.service.RuleService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
/**
* @Description TODO
* @Author WWW
* @Date 2021/6/29 16:39
*/
@Api(tags = "规则接口")
@RestController
@RequestMapping("/rule")
public class RuleController {
@Autowired
RuleService ruleService;
@ApiOperation("规则删除")
@GetMapping("/delete")
public ResponseEntity deleteRule(Integer id) {
try {
ruleService.del(id);
return ResultUtil.success("删除成功!");
} catch (Exception e) {
}
return ResultUtil.failed("此id已经被删除!");
}
@ApiOperation("规则新增")
@PostMapping("/save")
public ResponseEntity add(@RequestBody RuleVo ruleVo) {
try {
ruleService.add(ruleVo);
return ResultUtil.success("保存成功!");
} catch (Exception e) {
}
return ResultUtil.failed("保存失败!");
}
@ApiOperation("规则修改")
@PostMapping("/update")
public ResponseEntity update(@RequestBody RuleVo ruleVo) {
try {
ruleService.update(ruleVo);
return ResultUtil.success("操作成功!");
} catch (Exception ignored) {
}
return ResultUtil.failed("操作失败!");
}
@ApiOperation("查询全部")
@PostMapping("/getAll")
public ResponseEntity get() {
return ResultUtil.success(ruleService.getAll(), "查询成功");
}
}
package com.tykj.datawarehouse.model.dao;
import com.tykj.datawarehouse.model.entity.ColumnInfo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* @ClassName ColumnInfoDao
* @Description TODO
* @Author WWW
* @Date 2021/2/24 11:22
* @Version 1.0
*/
public interface ColumnInfoDao extends JpaRepository<ColumnInfo, Integer>, JpaSpecificationExecutor<ColumnInfo> {
/**
* 根据dbId查询所有
* @param id
* @return
*/
List<ColumnInfo> findAllByDbId(int id);
/**
* 根据dbID删除
* @param id
*/
@Transactional(rollbackFor = Exception.class)
@Modifying
void deleteAllByDbId(Integer id);
/**
* @param id
* @param columnName
* @return
*/
ColumnInfo findByDbIdAndFieldName(Integer id,String columnName);
}
package com.tykj.datawarehouse.model.dao;
import com.tykj.datawarehouse.model.entity.Quote;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import java.util.List;
/**
* @Description TODO
* @Author WWW
* @Date 2021/5/17 15:23
*/
public interface QuoteDao extends JpaRepository<Quote, Integer>, JpaSpecificationExecutor<Quote> {
/**
* 根据Columnid查询全部
* @param id
* @return
*/
List<Quote> findAllByColumnId(Integer id);
}
package com.tykj.datawarehouse.model.dao;
import com.tykj.datawarehouse.model.entity.Rule;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import java.util.List;
/**
* @Description TODO
* @Author WWW
* @Date 2021/6/29 11:01
*/
public interface RuleDao extends JpaRepository<Rule, Integer>, JpaSpecificationExecutor<Rule> {
/**
* 根据columnId查询
* @param id
* @return
*/
Rule findAllByColumnId(Integer id);
}
package com.tykj.datawarehouse.model.dao;
import com.tykj.datawarehouse.model.entity.TableInfo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* @ClassName TableInfoDao
* @Description TODO
* @Author WWW
* @Date 2021/2/24 11:20
* @Version 1.0
*/
public interface TableInfoDao extends JpaRepository<TableInfo, Integer>, JpaSpecificationExecutor<TableInfo> {
/**
* 根据表名查询tableInfo
* @param name
* @return
*/
TableInfo findByModelName(String name);
}
package com.tykj.datawarehouse.model.entity;
import com.tykj.datawarehouse.base.entity.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Transient;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName ColumnInfo
* @Description TODO
* @Author WWW
* @Date 2021/2/24 11:14
* @Version 1.0
*/
@Data
@NoArgsConstructor
@Entity
@Table
@ApiModel("列对象")
public class ColumnInfo extends BaseEntity {
/**
* 是否primary key, 0是,1否
*/
@ApiModelProperty("是否主键")
private Integer primaryKey;
@ApiModelProperty("列名")
private String fieldName;
@ApiModelProperty("列名中文描述")
private String fieldTitle;
@ApiModelProperty("列类型")
private String fieldType;
@ApiModelProperty("长度")
private Integer fieldLength;
@ApiModelProperty("所属表名")
private String dbName;
@ApiModelProperty("所属表id")
private Integer dbId;
@ApiModelProperty("详细描述")
private String description;
@ApiModelProperty("规则")
@Transient
private Rule rule =new Rule();
@ApiModelProperty("引用对象")
@Transient
private List<Quote> quoteList =new ArrayList<>();
public ColumnInfo(Integer primaryKey, String fieldName, String fieldTitle, String fieldType, Integer fieldLength, String dbName, Integer dbId, String description) {
this.primaryKey = primaryKey;
this.fieldName = fieldName;
this.fieldTitle = fieldTitle;
this.fieldType = fieldType;
this.fieldLength = fieldLength;
this.dbName = dbName;
this.dbId = dbId;
this.description = description;
}
}
package com.tykj.datawarehouse.model.entity;
import com.tykj.datawarehouse.base.entity.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
/**
* @Description TODO
* @Author WWW
* @Date 2021/5/17 15:17
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table
@ApiModel("引用对象")
public class Quote extends BaseEntity {
@Column
@ApiModelProperty("columnId")
private Integer columnId;
@ApiModelProperty("值")
private String value;
}
package com.tykj.datawarehouse.model.entity;
import com.tykj.datawarehouse.base.entity.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.Entity;
import javax.persistence.Table;
/**
* @author HASEE
*/
@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity
@Table
@ApiModel("规则表")
public class Rule extends BaseEntity {
@ApiModelProperty("表id")
private Integer tableId;
@ApiModelProperty("字段id")
private Integer columnId;
@ApiModelProperty("规则")
private String regular;
}
package com.tykj.datawarehouse.model.entity;
import com.tykj.datawarehouse.base.entity.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Lob;
import javax.persistence.Table;
/**
* @ClassName TableInfo
* @Description TODO
* @Author WWW
* @Date 2021/2/24 11:05
* @Version 1.0
*/
@Entity
@Table
@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel("表对象")
public class TableInfo extends BaseEntity {
@ApiModelProperty("数据对象名,不能为空")
@Column(nullable = false)
private String modelName;
@ApiModelProperty("表中文名,不能为空")
@Column(nullable = false)
private String modelTitle;
@ApiModelProperty("详细描述")
private String description;
@Lob
@ApiModelProperty("表对应hbm.xml")
private String xml;
}
package com.tykj.datawarehouse.model.entity.customEnums;
/**
* @ClassName ModelType
* @Description TODO 模型的3种类型
* @Author Hxh
* @Date 2021/3/26 14:41
* @Version 1.0
*/
public enum ConnectionType {
/**
* or
*/
OR(" or "),
/**
* and
*/
AND(" and ");
private final String type;
ConnectionType(String type) {
this.type = type;
}
public String getType() {
return type;
}
}
package com.tykj.datawarehouse.model.entity.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Description TODO
* @Author WWW
* @Date 2021/6/30 9:51
*/
@ApiModel("列类型VO")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ColumnTypeVO {
@ApiModelProperty("中文名")
private String lab;
@ApiModelProperty("类型")
private String value;
@ApiModelProperty("长度")
private String lengths;
}
package com.tykj.datawarehouse.model.entity.vo;
import com.tykj.datawarehouse.model.entity.Quote;
import com.tykj.datawarehouse.model.entity.Rule;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
/**
* @ClassName ColumnVO
* @Description TODO
* @Author WWW
* @Date 2021/3/1 9:58
* @Version 1.0
*/
@ApiModel("列信息VO")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ColumnVO {
@ApiModelProperty("id")
private Integer id;
@ApiModelProperty("是否主键")
private Integer primaryKey = 1;
@ApiModelProperty("字段类型")
private String fieldType;
@ApiModelProperty("字段名")
private String fieldName;
@ApiModelProperty("中文描述")
private String fieldTitle;
@ApiModelProperty("字段长度,有默认值")
private Integer fieldLength;
@ApiModelProperty("规则")
private Rule rule;
@ApiModelProperty("详细描述")
private String description;
@ApiModelProperty("引用数组")
private List<Quote> quoteList;
}
package com.tykj.datawarehouse.model.entity.vo;
import com.tykj.datawarehouse.model.entity.ColumnInfo;
import com.tykj.datawarehouse.model.entity.Quote;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @Description TODO
* @Author WWW
* @Date 2021/5/18 14:19
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ColumnWithQuoteVO {
private ColumnInfo columnInfo;
private List<Quote> quotes;
}
package com.tykj.datawarehouse.model.entity.vo;
import io.swagger.annotations.ApiModel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @author HuangXiahao
* @version V1.0
* @class CustomPage
* @packageName com.tykj.model_layer.entity.vo
**/
@ApiModel("带分页的返回")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CustomPage {
public long total;
public List contents;
}
package com.tykj.datawarehouse.model.entity.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @ClassName DelTableVO
* @Description TODO
* @Author WWW
* @Date 2021/3/23 18:51
* @Version 1.0
*/
@AllArgsConstructor
@NoArgsConstructor
@Data
@ApiModel("删除VO类")
public class DelTableVO {
@ApiModelProperty("模型id")
private Integer id;
@ApiModelProperty("模型名称")
private String dbName;
}
package com.tykj.datawarehouse.model.entity.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@AllArgsConstructor
@NoArgsConstructor
@Data
public class GroupCondition {
private String name;
private String value;
}
package com.tykj.datawarehouse.model.entity.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Description TODO
* @Author WWW
* @Date 2021/6/9 17:03
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class OrderCondition {
@ApiModelProperty("列")
private String columns;
@ApiModelProperty("排序")
private String sortValue;
}
package com.tykj.datawarehouse.model.entity.vo;
import com.tykj.datawarehouse.model.entity.customEnums.ConnectionType;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author HASEE
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel("复杂查询")
public class QueryCondition {
/**
* 字段名 例如:age
*/
@ApiModelProperty(value = "查询字段名",example = "age")
private String name;
/**
* 条件符号类型 例如:>
*/
@ApiModelProperty(value = "查询条件符号类型",example = ">")
private String type;
/**
* 条件参数值 例如:20
*/
@ApiModelProperty(value = "条件参数值",example = "18")
private String value;
@ApiModelProperty(value = "连接条件",example = "or或者and")
private ConnectionType connectionType;
}
package com.tykj.datawarehouse.model.entity.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author HASEE
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel("查询规则信息VO")
public class RuleVo{
@ApiModelProperty
private Integer id;
@ApiModelProperty("表id")
private Integer tableId;
@ApiModelProperty("字段id")
private Integer columnId;
@ApiModelProperty("规则")
private String regular;
}
package com.tykj.datawarehouse.model.entity.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @Description TODO
* @Author WWW
* @Date 2021/6/9 19:24
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SearchAllVO {
private String tableName;
List<OrderCondition> orderConditions;
}
package com.tykj.datawarehouse.model.entity.vo;
import com.tykj.datawarehouse.base.page.JpaCustomPage;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @ClassName SearchColumnInfoVo
* @Description TODO
* @Author WWW
* @Date 2021/3/15 14:46
* @Version 1.0
*/
@AllArgsConstructor
@NoArgsConstructor
@Data
@ApiModel("查询列信息VO")
public class SearchColumnInfoVo extends JpaCustomPage {
@ApiModelProperty("查询表id")
private Integer dbId;
@ApiModelProperty("列名称")
private String dbName;
}
package com.tykj.datawarehouse.model.entity.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Description TODO
* @Author WWW
* @Date 2021/5/18 13:19
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SearchQuoteVO {
private Integer[] columnIds;
private Integer[] ids;
private String value;
private String[] values;
}
package com.tykj.datawarehouse.model.entity.vo;
import com.tykj.datawarehouse.base.page.JpaCustomPage;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @ClassName SearchTableInfoVo
* @Description TODO
* @Author WWW
* @Date 2021/3/11 16:06
* @Version 1.0
*/
@AllArgsConstructor
@NoArgsConstructor
@Data
@ApiModel("查询表信息VO")
public class SearchTableInfoVo extends JpaCustomPage {
@ApiModelProperty("表id")
private Integer id;
@ApiModelProperty("表名称")
private String modelName;
@ApiModelProperty("表中文名")
private String modelTitle;
@ApiModelProperty("表名称数组")
private Integer[] modelType;
@ApiModelProperty("表id数组")
private Integer[] ids;
}
package com.tykj.datawarehouse.model.entity.vo;
import com.tykj.datawarehouse.model.entity.ColumnInfo;
import com.tykj.datawarehouse.model.entity.TableInfo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @ClassName TableAndColumnInfoVO
* @Description TODO
* @Author WWW
* @Date 2021/3/29 9:59
* @Version 1.0
*/
@AllArgsConstructor
@NoArgsConstructor
@Data
public class TableAndColumnInfoVO {
private List<TableInfo> tableInfos;
private List<ColumnInfo> columnInfos;
}
package com.tykj.datawarehouse.model.entity.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @ClassName tableVO
* @Description TODO
* @Author WWW
* @Date 2021/3/1 9:56
* @Version 1.0
*/
@ApiModel("表信息VO")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TableVO {
@ApiModelProperty("中文描述")
private String modelTitle;
@ApiModelProperty("表名")
private String modelName;
@ApiModelProperty("详细描述")
private String description;
/**
* 0扫描,1自建,2扫描后自选
*/
@ApiModelProperty("模型类型")
private Integer modelType;
@ApiModelProperty("父表名称")
private String parentTable;
@ApiModelProperty("列数组")
private List<ColumnVO> dataList;
}
package com.tykj.datawarehouse.model.entity.vo;
import com.tykj.datawarehouse.model.entity.Quote;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @Description TODO
* @Author WWW
* @Date 2021/5/18 15:00
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UpdateQuoteVO {
@ApiModelProperty("id")
private Integer id;
private List<Quote> quoteList;
}
package com.tykj.datawarehouse.model.entity.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @ClassName UpdateTableInfoVO
* @Description TODO
* @Author WWW
* @Date 2021/3/16 13:43
* @Version 1.0
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel("更新表VO")
public class UpdateTableInfoVO {
@ApiModelProperty("表id")
private Integer dbId;
@ApiModelProperty("表名称")
private String dbName;
@ApiModelProperty("TableVO")
private TableVO tableVO;
}
package com.tykj.datawarehouse.model.entity.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.Lob;
/**
* @Description TODO
* @Author WWW
* @Date 2021/5/19 15:42
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class VersionVO {
@ApiModelProperty("tableInfoID")
private Integer dbId;
@ApiModelProperty("版本号")
private String versionId;
@ApiModelProperty("版本号")
private String versionDesc;
@Lob
@ApiModelProperty("版本对应数据")
private String content;
}
package com.tykj.datawarehouse.model.entity.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @author HuangXiahao
* @version V1.0
* @class complexQueryVo
* @packageName com.tykj.model_layer.entity.vo
**/
@ApiModel("复杂查询VO")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class complexQueryVo {
@ApiModelProperty("表名")
String tableName;
@ApiModelProperty("筛选字段")
List<String> columnNames;
@ApiModelProperty("分类条件信息")
GroupCondition groupCondition;
@ApiModelProperty("查询条件")
List<QueryCondition> queryConditions;
@ApiModelProperty("分类字段")
String groupByColumn;
Integer page = 0 ;
Integer size = 15 ;
}
package com.tykj.datawarehouse.model.myEnum;
/**
* @ClassName ModelType
* @Description TODO 模型的3种类型
* @Author WWW
* @Date 2021/3/26 14:41
* @Version 1.0
*/
public class ModelType {
/**
* 聚合对象
*/
// public static final Integer AGGREGATION = -1;
/**
* 基础扫描对象
*/
public static final Integer BASICS = 0;
/**
* 业务对象
*/
// public static final Integer BUSINESS = 1;
/**
* 基础对象延伸
*/
// public static final Integer BASICS_EXTENSION = 2;
/**
* 数据源对象
*/
public static final Integer DATA_SOURCE = 3;
/**
*虚拟对象,业务对象加聚合对象
*/
public static final Integer VIRTUAL = 4;
}
package com.tykj.datawarehouse.model.service;
import com.tykj.datawarehouse.base.consumer.FourComsumer;
import com.tykj.datawarehouse.model.entity.ColumnInfo;
import com.tykj.datawarehouse.model.entity.TableInfo;
import com.tykj.datawarehouse.model.entity.vo.*;
import org.hibernate.internal.SessionImpl;
import org.hibernate.type.Type;
import org.springframework.data.domain.Page;
import org.springframework.http.ResponseEntity;
import org.springframework.transaction.annotation.Transactional;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import java.util.function.BiConsumer;
/**
* @ClassName ModelService
* @Description TODO
* @Author WWW
* @Date 2021/2/26 13:36
* @Version 1.0
*/
public interface ModelService {
/**
* 分页查询
*
* @param searchTableInfoVo
* @return
*/
Page<TableInfo> pageAllEntities(SearchTableInfoVo searchTableInfoVo);
/**
* 方法重载不分页查询
*
* @return
*/
List<TableInfo> listAllEntities(SearchTableInfoVo searchTableInfoVo);
/**
* 根据表名查询所有字段信息
*
* @param searchColumnInfoVo
* @return
*/
List<ColumnInfo> showModelFields(SearchColumnInfoVo searchColumnInfoVo);
/**
* 新建模型
*
* @param tableVO
* @return
*/
TableInfo newTable(TableVO tableVO);
/**
*
*根据表名插入数据
* @param map
* @return
*/
int operationValueByEntityName(Map<String, Object> map,
SessionImpl session,
BiConsumer<String,Object> biConsumer,
FourComsumer<TableInfo, Object, Type, String > valitor);
int operationValueByEntityNameList(List<Map<String, Object>> mapList,
SessionImpl session,
BiConsumer<String,Object> biConsumer,
FourComsumer<TableInfo, Object, Type , String > valitor);
/**
* 根据表名查询所有
*
* @param name
* @return
* @throws SQLException
*/
List<Map<String, Object>> findAllByName(String name) throws SQLException;
List<Map<String, Object>> findAllByName(String name,List<OrderCondition> orderConditions) ;
/**
* 复杂查询
*
* @param tableName
* @param queryConditions
* @return
*/
List<Map<String, Object>> complexQuery(String tableName,
List<String> columnNames,
List<QueryCondition> queryConditions,
String groupName);
/**
* 复杂查询(带分类)
*
* @param tableName
* @param queryConditions
* @return
*/
CustomPage complexQueryWithGroup(String tableName,
GroupCondition groupCondition,
List<String>columnNames,
List<QueryCondition> queryConditions,
String groupByColumn,
Integer page,
Integer size);
/**
* 修改表
*
* @param updateTableInfoVO
* @return
*/
ResponseEntity updateTable(UpdateTableInfoVO updateTableInfoVO);
/**
* 删除表
*
* @param delTableVO
* @return
*/
@Transactional(rollbackFor = Exception.class)
int delTable(DelTableVO delTableVO);
/**
* 根据id批量查询所有tableInfo和ColumnInfo
*
* @param ids
* @return
*/
TableAndColumnInfoVO getTableInfoAndColumnInfoByBatch(Integer[] ids);
/**
* 执行自定义SQL
* @param sql
* @return
* @throws SQLException
*/
List<Map<String, Object>> executeQuery(String sql) throws SQLException;
void validationAllRuleAndQuote(TableInfo tableInfo, Object value, Type propertyType, String propertyNames);
}
package com.tykj.datawarehouse.model.service;
import com.tykj.datawarehouse.model.entity.Quote;
import com.tykj.datawarehouse.model.entity.vo.SearchQuoteVO;
import com.tykj.datawarehouse.model.entity.vo.UpdateQuoteVO;
import java.util.List;
/**
* @Description TODO
* @Author WWW
* @Date 2021/5/17 15:58
*/
public interface QuoteService {
/**
* 更新quote
* @param updateQuoteVO
*/
int updateQuote(UpdateQuoteVO updateQuoteVO);
/**
* 条件查询引用
* @param searchQuoteVO
* @return
*/
List<Quote> getAllQuote(SearchQuoteVO searchQuoteVO);
Quote saveQuote(Quote quote);
Integer delQuote(Integer id);
}
package com.tykj.datawarehouse.model.service;
import com.tykj.datawarehouse.model.entity.Rule;
import com.tykj.datawarehouse.model.entity.vo.RuleVo;
import java.util.List;
/**
* @Description TODO
* @Author WWW
* @Date 2021/6/29 11:04
*/
public interface RuleService {
/**
* 新增
* @param ruleVo
*/
void add(RuleVo ruleVo);
/**
* 修改
* @param ruleVo
*/
void update(RuleVo ruleVo);
/**
* 删除
* @param id
*/
void del(Integer id);
/**
* 查询
* @return
*/
List<Rule> getAll();
}
package com.tykj.datawarehouse.model.service.impl;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.tykj.datawarehouse.base.result.ApiException;
import com.tykj.datawarehouse.model.dao.ColumnInfoDao;
import com.tykj.datawarehouse.model.dao.TableInfoDao;
import com.tykj.datawarehouse.model.entity.ColumnInfo;
import com.tykj.datawarehouse.model.entity.TableInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static java.lang.String.format;
/**
* @author C
*/
@Service
public class ModelHelper {
@Autowired
private TableInfoDao tableInfoDao;
@Autowired
private ColumnInfoDao columnInfoDao;
/**
* 获取指定数据模型的json格式数据示例
*
* @param tableInfoId 指定id
* @return json格式的数据示例
*/
public String getJsonExample(Integer tableInfoId) {
/* 你要放10个元素,10/0.75+1=14 */
Map<String, Object> result = new HashMap<>();
TableInfo tableInfo = tableInfoDao.findById(tableInfoId)
.orElseThrow(() -> new ApiException(format("未找到该id的数据:%s", tableInfoId)));
String resultKey = tableInfo.getModelName();
Map<String, Object> resultValue = new HashMap<>();
//根据表id查出字段信息 并加入Map结果
List<ColumnInfo> columnInfos = columnInfoDao.findAllByDbId(tableInfoId);
for (ColumnInfo columnInfo : columnInfos) {
resultValue.put(columnInfo.getFieldName(), null);
}
result.put(resultKey, resultValue);
//做json转换并返回
try {
return new ObjectMapper().writeValueAsString(result);
} catch (JsonProcessingException e) {
e.printStackTrace();
throw new ApiException("json转换时出现异常");
}
}
}
package com.tykj.datawarehouse.model.service.impl;
import com.github.wenhao.jpa.PredicateBuilder;
import com.github.wenhao.jpa.Specifications;
import com.tykj.datawarehouse.base.result.ApiException;
import com.tykj.datawarehouse.model.dao.QuoteDao;
import com.tykj.datawarehouse.model.entity.Quote;
import com.tykj.datawarehouse.model.entity.vo.SearchQuoteVO;
import com.tykj.datawarehouse.model.entity.vo.UpdateQuoteVO;
import com.tykj.datawarehouse.model.service.QuoteService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import static java.util.Objects.isNull;
/**
* @Description TODO
* @Author WWW
* @Date 2021/5/17 15:59
*/
@Service
public class QuoteServiceImpl implements QuoteService {
@Autowired
private QuoteDao quoteDao;
@Override
public int updateQuote(UpdateQuoteVO updateQuoteVO) {
List<Quote> quoteList = updateQuoteVO.getQuoteList();
try {
for (Quote quote : quoteList) {
quote.setColumnId(updateQuoteVO.getId());
if (existValue(quote.getColumnId(), quote.getValue())) {
quoteDao.save(quote);
}
}
return 0;
}
catch (Exception e){
return 1;
}
}
@Override
public List<Quote> getAllQuote(SearchQuoteVO sqv) {
PredicateBuilder<Quote> and = Specifications.and();
if (sqv!=null){
and.like(!isNull(sqv.getValue() ) && StringUtils.isNotEmpty(sqv.getValue()),
"value", "%" + sqv.getValue() + "%");
and.in(sqv.getColumnIds()!=null && sqv.getColumnIds().length>0,
"columnId",sqv.getColumnIds());
and.in(sqv.getValues()!=null && sqv.getValues().length>0,
"value", sqv.getValues());
}
return quoteDao.findAll(and.build());
}
@Override
public Quote saveQuote(Quote quote) {
if (existValue(quote.getColumnId(), quote.getValue())) {
return quoteDao.save(quote);
}
throw new ApiException("插入错误!");
}
@Override
public Integer delQuote(Integer id) {
quoteDao.deleteById(id);
return 1;
}
public boolean existValue(Integer cId, String value) {
List<String> collect = quoteDao.findAllByColumnId(cId)
.stream()
.map(Quote::getValue)
.collect(Collectors.toList());
if (collect.contains(value)) {
return false;
}
return true;
}
}
package com.tykj.datawarehouse.model.service.impl;
import com.tykj.datawarehouse.model.dao.RuleDao;
import com.tykj.datawarehouse.model.entity.Rule;
import com.tykj.datawarehouse.model.entity.vo.RuleVo;
import com.tykj.datawarehouse.model.service.RuleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
/**
* @Description TODO
* @Author WWW
* @Date 2021/6/29 11:05
*/
@Service
public class RuleServiceImpl implements RuleService {
@Autowired
RuleDao ruleDao;
/**
* @param ruleVo
*/
@Override
public void add(RuleVo ruleVo) {
Rule rule = new Rule(
ruleVo.getTableId(),
ruleVo.getColumnId(),
ruleVo.getRegular()
);
ruleDao.save(rule);
}
/**
* 修改
*
* @param ruleVo
*/
@Override
public void update(RuleVo ruleVo) {
Rule rule = new Rule();
rule.setId(ruleVo.getId());
rule.setColumnId(ruleVo.getColumnId());
rule.setRegular(ruleVo.getRegular());
rule.setTableId(ruleVo.getTableId());
rule.setUpdatedTime(new Date());
ruleDao.save(rule);
}
/**
* 删除
*
* @param id
*/
@Override
public void del(Integer id) {
ruleDao.deleteById(id);
}
/**
* 查询
*
* @return
*/
@Override
public List<Rule> getAll() {
return ruleDao.findAll();
}
}
package com.tykj.datawarehouse.model.sqlType;
import java.util.HashMap;
import java.util.Map;
/**
* @author HASEE
*/
public class MysqlSqlType {
/**
* java类型对应sql类型Map
*/
public static Map<String, String> TYPE_MAP = new HashMap<>();
static {
TYPE_MAP.put("java.lang.Integer", "int");
TYPE_MAP.put("java.lang.Long", "bigint");
TYPE_MAP.put("java.lang.Short", "smallint");
TYPE_MAP.put("java.lang.Float", "float");
TYPE_MAP.put("java.lang.Double", "double");
TYPE_MAP.put("java.lang.BigDecimal", "numeric");
TYPE_MAP.put("java.lang.Character", "char(1)");
TYPE_MAP.put("java.lang.String", "varchar");
TYPE_MAP.put("java.lang.Byte", "tinyint");
TYPE_MAP.put("java.lang.Boolean", "bit");
TYPE_MAP.put("java.lang.Class", "varchar");
TYPE_MAP.put("java.util.Date", "date");
TYPE_MAP.put("java.util.Calendar", "timestamp");
TYPE_MAP.put("java.util.Locale", "varchar");
TYPE_MAP.put("java.util.TimeZone", "varchar");
TYPE_MAP.put("java.util.Currency", "varchar");
TYPE_MAP.put("java.sql.Date", "date");
TYPE_MAP.put("java.sql.Time", "time");
TYPE_MAP.put("java.sql.Timestamp", "timestamp");
TYPE_MAP.put("java.sql.Clob", "clob");
TYPE_MAP.put("java.sql.Blob", "blob");
}
}
package com.tykj.datawarehouse.model.sqlType;
import java.util.HashMap;
import java.util.Map;
/**
* @author HASEE
*/
public class OscarSqlType {
/**
* java类型对应sql类型Map
*/
public static Map<String, String> TYPE_MAP = new HashMap<>();
static {
TYPE_MAP.put("java.lang.Integer", "int");
TYPE_MAP.put("java.lang.Long", "bigint");
TYPE_MAP.put("java.lang.Short", "smallint");
TYPE_MAP.put("java.lang.Float", "float");
TYPE_MAP.put("java.lang.Double", "DOUBLE PRECISION");
TYPE_MAP.put("java.lang.BigDecimal", "numeric");
TYPE_MAP.put("java.lang.Character", "char(1)");
TYPE_MAP.put("java.lang.String", "varchar");
TYPE_MAP.put("java.lang.Byte", "tinyint");
TYPE_MAP.put("java.lang.Boolean", "BOOL");
TYPE_MAP.put("java.lang.Class", "varchar");
TYPE_MAP.put("java.util.Date", "date");
TYPE_MAP.put("java.util.Calendar", "timestamp");
TYPE_MAP.put("java.util.Locale", "varchar");
TYPE_MAP.put("java.util.TimeZone", "varchar");
TYPE_MAP.put("java.util.Currency", "varchar");
TYPE_MAP.put("java.sql.Date", "date");
TYPE_MAP.put("java.sql.Time", "time");
TYPE_MAP.put("java.sql.Timestamp", "timestamp");
TYPE_MAP.put("java.sql.Clob", "clob");
TYPE_MAP.put("java.sql.Blob", "blob");
}
}
package com.tykj.datawarehouse.model.utils;
import com.tykj.datawarehouse.base.result.ApiException;
import org.apache.commons.lang3.StringUtils;
import java.util.List;
import java.util.regex.Pattern;
import static java.util.Objects.isNull;
/**
* @Description TODO
* @Author WWW
* @Date 2021/6/29 11:19
*/
public class CheckUtils {
/**
* 正则校验
*
* @param regx
* @param val
* @return
*/
public static Boolean validationRule(String regx, String val) {
//假如规则不为空,值为空默认通过校验
if (!StringUtils.isEmpty(regx)) {
if (StringUtils.isEmpty(val) || isNull(val)) {
return true;
} else {
Pattern pattern = Pattern.compile(regx);
return pattern.matcher(val).matches();
}
}
throw new ApiException("校验不通过!");
}
public static Boolean validationQuote(List<String> quotes, Object val) {
//如果没有引用就通过
if (quotes.size() == 0) {
return true;
}
//如果引用存在则通过
if (val instanceof String){
if (quotes.contains(val)) {
return true;
}
}
if (val instanceof Integer){
if (quotes.contains(val)) {
return true;
}
}
if (val instanceof Double){
if (quotes.contains(val)) {
return true;
}
}
throw new ApiException("引用不通过!");
}
}
package com.tykj.datawarehouse.model.utils;
/**
* @ClassName ClassTypeLength
* @Description TODO
* @Author WWW
* @Date 2021/3/15 9:53
* @Version 1.0
*/
public class ClassTypeLength {
public static String STRING = "class java.lang.String";
public static String Integer = "class java.lang.Integer";
public static String Double = "class java.lang.Double";
public static int setLength(String genericType) {
int length ;
if (STRING.equals(genericType)) {
length = 255;
} else if (Integer.equals(genericType)) {
length = 11;
} else if (Double.equals(genericType)) {
length = 10;
} else {
length =1;
}
return length;
}
}
package com.tykj.datawarehouse.model.utils;
import com.tykj.datawarehouse.base.result.ApiException;
import com.tykj.datawarehouse.model.entity.vo.ColumnVO;
import com.tykj.datawarehouse.model.entity.vo.TableVO;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @ClassName CreateTableUtil
* @Description TODO
* @Author WWW
* @Date 2021/3/1 14:35
* @Version 1.0
*/
public class CreateTableUtil {
private static final Map<String, String> TYPE_MAP = new HashMap<>();
static {
TYPE_MAP.put("java.lang.Integer", "java.lang.Integer");
TYPE_MAP.put("java.lang.Long", "java.lang.Long");
TYPE_MAP.put("java.lang.Short", "java.lang.Short");
TYPE_MAP.put("java.lang.Float", "java.lang.Float");
TYPE_MAP.put("java.lang.Double", "java.lang.Double");
TYPE_MAP.put("java.lang.BigDecimal", "java.lang.BigDecimal");
TYPE_MAP.put("java.lang.String", "java.lang.String");
TYPE_MAP.put("java.lang.Byte", "java.lang.Byte");
TYPE_MAP.put("java.lang.Boolean", "java.lang.Boolean");
TYPE_MAP.put("java.lang.Class", "java.lang.String");
TYPE_MAP.put("java.util.Date", "java.util.Date");
TYPE_MAP.put("java.util.Calendar", "java.util.Calendar");
TYPE_MAP.put("java.util.Locale", "java.util.String");
TYPE_MAP.put("java.util.TimeZone", "java.util.String");
TYPE_MAP.put("java.util.Currency", "java.util.String");
TYPE_MAP.put("java.sql.Date", "java.sql.Date");
TYPE_MAP.put("java.sql.Time", "java.sql.Time");
TYPE_MAP.put("java.sql.Timestamp", "java.sql.Timestamp");
TYPE_MAP.put("java.sql.Clob", "java.sql.Clob");
TYPE_MAP.put("java.sql.Blob", "java.sql.Blob");
TYPE_MAP.put("java.lang.Object", "java.lang.String");
TYPE_MAP.put("java.util.Map", "java.lang.String");
}
public static String createTable(TableVO tableVO) {
// 1sql-type="text" string 转为text文本,2长度超过会自动转换
List<ColumnVO> dataList = tableVO.getDataList();
String xmlMapping = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<!DOCTYPE hibernate-mapping PUBLIC\n" +
" \"-//Hibernate/Hibernate Mapping DTD 3.0//EN\"\n" +
" \"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd\">\n" +
"<hibernate-mapping>\n" +
" <class entity-name=\"" + tableVO.getModelName().toLowerCase().toUpperCase() + "\" table=\"" + tableVO.getModelName().toLowerCase().toUpperCase() + "\">\n";
xmlMapping += " <id name=\"ID\" type=\"java.lang.Integer\" length=\"11\" unsaved-value=\"null\" >\n" +
" <generator class=\"com.tykj.datawarehouse.base.entity.XMQGenerator\" >\n" +
"<param name=\"sequence\">SEQUENCE_" + tableVO.getModelName().toLowerCase().toUpperCase() + "</param>" +
"</generator>" +
" </id>\n";
for (ColumnVO columnVO : dataList) {
try {
xmlMapping +=
"\n <property type=\"" + columnVO.getFieldType() + "\" name=\"" + columnVO.getFieldName().toUpperCase() + "\" length=\"" + columnVO.getFieldLength() +
"\" column=\"" + columnVO.getFieldName().toUpperCase() + "\"/>\n";
} catch (Exception e) {
throw new ApiException("名称不合法!");
}
}
// xmlMapping+=" <property name =\"CREATE_TIME\" type =\"calendar\" generated=\"always\" insert=\"false\" update=\"false\" access=\"field\" >" +
// "<column name=\"CREATE_TIME\" not-null=\"true\" default=\"CURRENT_TIMESTAMP\" />\n"+
// "</property> " ;
//
// xmlMapping+=" <property name =\"UPDATE_TIME\" type =\"calendar\" generated=\"always\" insert=\"false\" update=\"false\" access=\"field\" >" +
// "<column name=\"UPDATE_TIME\" not-null=\"true\" default=\"CURRENT_TIMESTAMP\" />\n"+
// "</property> " ;
;
xmlMapping += " <property name = \"CREATE_TIME\" type =\"java.util.Date\" generated=\"always\" > \n" +
" <column name = \"CREATE_TIME\" default = \"CURRENT_TIMESTAMP\" /> \n" +
" </property> \n" +
" <property name = \"UPDATE_TIME\" type =\"java.util.Date\" > \n" +
" <column name = \"UPDATE_TIME\" default = \"CURRENT_TIMESTAMP\" /> \n" +
" </property> ";
xmlMapping += " </class>\n" +
"</hibernate-mapping>";
return xmlMapping;
}
public static String createTable(String entityName, ColumnVO primaryColumn, List<ColumnVO> dataList) {
// 1sql-type="text" string 转为text文本,2长度超过会自动转换
// List<ColumnVO> dataList = tableVO.getDataList();
String xmlMapping = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<!DOCTYPE hibernate-mapping PUBLIC\n" +
" \"-//Hibernate/Hibernate Mapping DTD 3.0//EN\"\n" +
" \"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd\">\n" +
"<hibernate-mapping>\n" +
" <class entity-name=\"" + entityName + "\" table=\"" + entityName + "\">\n";
xmlMapping += " <id name=\"" + primaryColumn.getFieldName() + "\" type=\"" + primaryColumn.getFieldType() + "\" unsaved-value=\"null\" >\n" +
" </id>";
for (ColumnVO columnVO : dataList) {
// xmlMapping +=
// "\n <property type=\"" + columnVO.getFieldType() + "\" name=\"" + columnVO.getFieldName() +
// "\" column=\"" + columnVO.getFieldName() + "\"/>\n";
xmlMapping +=
"\n <property type=\"" + columnVO.getFieldType() + "\" name=\"" + columnVO.getFieldName() + "\" length=\"" + columnVO.getFieldLength() +
"\" column=\"" + columnVO.getFieldName() + "\"/>\n";
}
xmlMapping += " <property name=\"createTime\" column=\"CREATETIME\" type=\"calendar\" insert=\"false\" \n" +
" update=\"false\" access=\"field\" generated=\"always\" default=\"CURRENT_TIMESTAMP\"/> \n" +
" <property name=\"updateTime\" column=\"UPDATETIME\" type=\"calendar\" insert=\"false\" \n" +
" update=\"false\" access=\"field\" generated=\"always\" default=\"CURRENT_TIMESTAMP\" /> ";
xmlMapping += " </class>\n" +
"</hibernate-mapping>";
return xmlMapping;
}
/**
*小写
*/
String lowerCaseReg = "^[a-z]+$";
/**
*大写
*/
String upperCaseReg = "^[A-Z]+$";
}
package com.tykj.datawarehouse.model.utils;
/**
* @Description TODO
* @Author WWW
* @Date 2021/5/19 17:46
*/
public class GetIndexUtil {
public static String getIndex(Integer id){
return "";
}
}
package com.tykj.datawarehouse.model.utils;
import com.tykj.datawarehouse.model.entity.vo.QueryCondition;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import java.util.List;
import java.util.Objects;
/**
* @author C
*/
@Slf4j
public class HqlUtil {
public static String createQuery(String tableName, List<String> columnNames, List<QueryCondition> conditions, String groupByColumn) {
StringBuilder result = new StringBuilder("select ");
if (Objects.isNull(columnNames) || columnNames.isEmpty()) {
result.append("entity ");
} else {
for (String columnName : columnNames) {
result.append("entity.").append(columnName).append(",");
}
result.delete(result.lastIndexOf(","),result.length() );
}
result.append(" from ").append(tableName).append(" entity ");
if (Objects.nonNull(conditions) && !conditions.isEmpty()) {
result.append(" where ");
for (QueryCondition condition : conditions) {
result.append("entity.")
.append(condition.getName())
.append(" " + condition.getType() + " ")
.append("'")
.append(condition.getValue())
.append("'");
if (condition.getConnectionType()!=null){
result.append(condition.getConnectionType().getType());
}
}
if (result.lastIndexOf(" and ") > -1) {
result.delete(result.lastIndexOf(" and "), result.length());
}
if (result.lastIndexOf(" or ") > -1) {
result.delete(result.lastIndexOf(" or "), result.length());
}
}
if (StringUtils.isNotEmpty(groupByColumn)) {
result.append(" group by entity." + groupByColumn);
}
System.out.println(result.toString());
return result.toString();
}
}
package com.tykj.datawarehouse.model.utils;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
/**
* @author HuangXiahao
* @version V1.0
* @class ObjectUtil
* @packageName com.tykj.model_layer.utils
**/
public class ObjectUtil {
//Object转Map
public static Map<String, Object> objectToMap(Object obj) {
Map<String, Object> map = new HashMap<String, Object>();
Class<?> clazz = obj.getClass();
for (Field field : clazz.getDeclaredFields()) {
field.setAccessible(true);
String fieldName = field.getName();
Object value = null;
try {
value = field.get(obj);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
map.put(fieldName, value);
}
return map;
}
}
package com.tykj.datawarehouse.model.utils;
import com.google.common.base.Strings;
import com.tykj.datawarehouse.model.dao.TableInfoDao;
import com.tykj.datawarehouse.model.entity.TableInfo;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.Metadata;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.jaxb.hbm.spi.JaxbHbmHibernateMapping;
import org.hibernate.boot.jaxb.hbm.spi.JaxbHbmRootEntityType;
import org.hibernate.boot.jaxb.spi.Binding;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.tool.hbm2ddl.SchemaUpdate;
import org.hibernate.tool.schema.TargetType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.persistence.EntityManagerFactory;
import java.io.ByteArrayInputStream;
import java.util.EnumSet;
import java.util.List;
/**
* @ClassName SessionUtil
* @Description TODO
* @Author WWW
* @Date 2021/4/1 10:08
* @Version 1.0
*/
@Component
public class SessionUtil {
SessionFactory sessionFactory;
StandardServiceRegistry serviceRegistry;
@Autowired
TableInfoDao tableInfoDao;
MetadataSources metadataSources;
public SessionUtil(EntityManagerFactory entityManagerFactory, TableInfoDao tableInfoDao){
this.tableInfoDao = tableInfoDao;
sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);
serviceRegistry = sessionFactory.getSessionFactoryOptions().getServiceRegistry();
init();
}
public void init(){
metadataSources = new MetadataSources(serviceRegistry);
//去数据库读取所有的XML 加载到 metasource里
List<TableInfo> all = tableInfoDao.findAll();
for (TableInfo tableInfo : all) {
String xml = tableInfo.getXml();
if (!Strings.isNullOrEmpty(xml)){
addXml(xml);
}
}
}
public void addXml(String xmlStr){
metadataSources.addInputStream(new ByteArrayInputStream(xmlStr.getBytes()));
Metadata metadata = metadataSources.buildMetadata();
//更新数据库Schema,如果不存在就创建表,存在就更新字段,不会影响已有数据
SchemaUpdate schemaUpdate = new SchemaUpdate();
schemaUpdate.execute(EnumSet.of(TargetType.DATABASE), metadata, serviceRegistry);
}
public Session getSession(){
Metadata metadata = metadataSources.buildMetadata();
//创建会话工厂
SessionFactory newSessionFactory = metadata.buildSessionFactory();
//保存对象
return newSessionFactory.openSession();
}
public Metadata getMetadata(){
return metadataSources.buildMetadata();
}
public MetadataSources getMetadataSources() {
return metadataSources;
}
public void deleteTableInMeteData(String tableName){
int needDelete = -1;
List<Binding> xmlBindings = metadataSources.getXmlBindings();
for (int i = 0; i < xmlBindings.size(); i++) {
Object root = xmlBindings.get(i).getRoot();
if (root instanceof JaxbHbmHibernateMapping){
List<JaxbHbmRootEntityType> listEntity = ((JaxbHbmHibernateMapping) root).getClazz();
for (JaxbHbmRootEntityType jaxbHbmRootEntityType : listEntity) {
String currentTableName = jaxbHbmRootEntityType.getTable();
if (currentTableName.equals(tableName)){
needDelete = i;
break;
}
}
}
}
if (needDelete>-1){
xmlBindings.remove(needDelete);
}
System.out.println("1");
}
}
package com.tykj.datawarehouse.model.utils;
import com.tykj.datawarehouse.model.sqlType.MysqlSqlType;
import com.tykj.datawarehouse.model.sqlType.OscarSqlType;
import java.util.Map;
/**
* @author HASEE
*/
public class SqlTypeUtil {
public static Map<String, String> getSqlTypeMap(String driveName){
switch (driveName){
case "org.h2.Driver":
case "com.oscar.Driver":
return OscarSqlType.TYPE_MAP;
default:
return MysqlSqlType.TYPE_MAP;
}
}
}
package com.tykj.datawarehouse.model.utils;
import com.google.common.base.Strings;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import java.util.Map;
import static java.util.Objects.isNull;
import static java.util.Objects.nonNull;
/**
* @author C
*/
@Slf4j
public class SqlUtil {
@Autowired
private Environment env;
/**
* 修改表名的SQL语句
*
* @param table 原表名
* @param newTable 新表名
* @return SQL语句
*/
public static String renameTable(String table, String newTable) {
return String.format("rename table %s to %s;", table, newTable);
}
/**
* 增加单个字段的SQL语句
*
* @param table 表名
* @param name 字段名
* @param type 字段类型
* @param length 字段长度
* @return SQL语句
*/
public static String addColumn(String table, String name, String type, Integer length, Map<String, String> sqlTypeMap) {
type = sqlTypeMap.get(type);
boolean hasValue = !Strings.isNullOrEmpty(table)
&& !Strings.isNullOrEmpty(name)
&& nonNull(type);
StringBuilder result = new StringBuilder();
if (hasValue) {
//基本部分
result.append(String.format("ALTER TABLE %s ADD COLUMN %s %s", table, name, type));
//字段长度
if (nonNull(length) && type.equals("java.lang.String")) {
result.append(String.format("(%s)", length));
}
result.append(";");
return result.toString();
} else {
log.error("表名或字段名不能为空");
throw new RuntimeException("表名或字段名不能为空");
}
}
/**
* 修改表的单个字段的SQL语句
*
* @param table 表名
* @param name 旧字段名
* @param newName 新字段名
* @param newType 字段类型
* @param newLength 字段长度
* @return SQL语句
*/
public static String updateColumnType(String table, String name, String newName, String newType, Integer newLength, String driverType, Map<String, String> sqlTypeMap) {
newType = sqlTypeMap.get(newType);
boolean hasValue = !Strings.isNullOrEmpty(table)
&& nonNull(newType);
StringBuilder result = new StringBuilder();
if (hasValue) {
if (needLengthColumn(newType)) {
result.append(String.format("ALTER TABLE %s MODIFY %s %s (%s) ;", table, name, newType, newLength));
} else {
result.append(String.format("ALTER TABLE %s MODIFY %s %s ;", table, name, newType));
}
if (isNull(newName)) {
result.append(String.format("ALTER TABLE %s RENAME COLUMN %s TO %s ;", table, name, newName));
}
} else {
log.error("参数缺失");
}
return result.toString();
}
/**
* 修改表的单个字段的SQL语句
*
* @param table 表名
* @param name 旧字段名
* @param newName 新字段名
* @return SQL语句
*/
public static String updateColumnName(String table, String name, String newName) {
boolean hasValue = !Strings.isNullOrEmpty(table);
StringBuilder result = new StringBuilder();
if (hasValue) {
if (!isNull(newName)) {
result.append(String.format("ALTER TABLE %s RENAME COLUMN %s TO %s ;", table, name, newName));
}
} else {
log.error("参数缺失");
}
return result.toString();
}
/**
* 删除单个字段的SQL语句
*
* @param table 表名
* @param name 字段名
* @return SQL语句
*/
public static String deleteColumn(String table, String name) {
return String.format("ALTER TABLE %s DROP %s;", table, name);
}
private static boolean needLengthColumn(String type) {
switch (type) {
case "varchar":
return true;
default:
return false;
}
}
}
spring:
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
datasource:
username: punish
password: 123456
url: jdbc:oscar://192.168.102.200:2003/OSRDB
driver-class-name: com.oscar.Driver
hikari:
read-only: false
connection-timeout: 60000
idle-timeout: 60000
validation-timeout: 3000
max-lifetime: 60000
login-timeout: 5
maximum-pool-size: 60
minimum-idle: 10
jpa:
show-sql: true
hibernate:
ddl-auto: update
database-platform: org.hibernate.dialect.OscarDialect
server:
port: 8089
\ No newline at end of file
package com.tykj;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class AnnualPerformanceIndicatorsApplicationTests {
@Test
void contextLoads() {
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论